π
<-
Chat plein-écran
[^]

[ARM926EJ-S] ...Routines !

Langage C, C++, et Assembleur.

[ARM926EJ-S] ...Routines !

Message non lude grosged » 09 Mar 2017, 13:34

Je lance le sujet afin que chacun(e) puisse partager/optimiser ici ses routines écrites en assembleur ARM926EJ-S :D
Sauf précision, les routines proposées respecteront la syntaxe nAssembler/armasm.
Pour commencer, je vous propose ma routine
WAITKEY
qui attend l'appui d'une touche (
clavier Touchpad
)
Here's the place where everyone would bring/optimise routines written in ARM926EJ-S assembly
Unless noticed, the suggested sources will respect nAssembler/armasm syntax
:D
Let's start with my routine WAITKEY which waits for any key to be pressed (
Touchpad keypad
)


Touchpad keypad map

Image( https://hackspire.org/index.php/Keypads )

Code: Tout sélectionner
WAITKEY ;OUTPUT:  r12 =  custom key-code (from [ret]=1 to [,]=88)

        stmfd    sp!,{r0-r4,lr}        ; saves r0,...r4 & Link Register   
        adr         r0,V900e0010     ; r0=memory area containing value 0x900e0010
        ldr          r0,[r0]            ; r0=#0x900e0010   
                   
kpress  bl          kstate
        bne         kpress           ; Loop until no key being pressed
                   
wait4k  bl          kstate
        beq         wait4k              ;Loop until one key being pressed

        mov        r2,#0            ; r2=0 ; (1st line of table)
        mov        r1,r2             ; r1's highest bytes must be cleared for later operations

which_k ldrh        r1,[r0],#2        ; 16bit transfering :  r1=[r0] ; then r0=r0+2
        clz          r3,r1        ; r3=nb of cleared bits in r1 until set bit (from bit31 to bit0)
        rsbs        r3,r3,#32       ; r3=32-r3 ; thus r3=0 when every bits are cleared
        addeq     r2,r2,#11        ;If so, r2=r2+11  ; (next line of table , 11 bits per line)
        beq         which_k         ; and continue to check.

        add         r12,r3,r2          ; Otherwise , r12=r3+r2 ;  (we found the key!)
        ldmfd     sp!,{r0-r4,pc}     ; restores r0-r4 ; pc=lr  to come back from this routine
;-----------------------------------------------------------------
kstate   ldmia      r0,{r1-r4}         ; r1=[900e0010] ...r4=[900e001c]
          orr        r1,r1,r2            ; r1=r1 or r2
          orr        r2,r3,r4            ; r2=r3 or r4
          orrs       r1,r1,r2            ; r1=r1 or r2
          mov        pc,lr                ; pc=lr to come back from this subroutine
;------------------------------------------------------------------
V900e0010 dcd        0x900e0010



Passons maintenant à la version pour modèles
clickpad/ clavier Ti84+
que nous appellerons
WAITKEY_classic
.
Contrairement aux modèles Touchpad, le contrôleur clavier est par défaut en mode "single scan" (il va donc falloir momentanément basculer en mode "continuous scan") . De plus, lorsque l'on scrute l'état des touches, un bit à 1 siginifie que la touche s'y référant n'est PAS pressée.
Now let's talk about the version for
clickpad/Ti84+ keyboard
models we'll name
WAITKEY_classic
.
Contrary to touchpad models, the keypad controller is in "single scan" mode (so we'll have to set in "continous scan" mode for a while).
Moreover, when we read states of keys, a bit set to "1" means "key not pressed".


Clickpad keypad map

Image( https://hackspire.org/index.php/Keypads )

TI-84+ keypad map

Image( https://hackspire.org/index.php/Keypads )

Code: Tout sélectionner
WAITKEY_classic  ;OUTPUT:  r12 =  custom key-code (from [ret]=1 to [=]=88)

        stmfd    sp!,{r0-r6,lr}        ; saves r0,...r6 & Link Register   
        adr         r0,V900e0010     ; r0=memory area containing value 0x900e0010
        ldr          r0,[r0]            ; r0=#0x900e0010   
        sub          r6,r0,#0x10   ; r6=#0x900e0000
        ldr         r5,[r6]      ; r5=default keypad controller parameters
        orr         r1,r5,#1      ; as "single scan" is default mode on clickpad models,
        str         r1,[r6]      ; setting bit0 to 1 will turn into "continuous scan" mode

kpress  bl          kstate
        bne         kpress           ; Loop until no key being pressed
                   
wait4k  bl          kstate
        beq         wait4k              ;Loop until one key being pressed

        mov        r2,#0            ; r2=0 ; (1st line of table)
        adr        r4,V0b11111111111
        ldr        r4,[r4]           ; r4 is a mask to keep bit0 to bit10 only

which_k ldrh     r1,[r0],#2        ; 16bit transfering :  r1=[r0] ; then r0=r0+2
        mvn      r1,r1    ;reverse the result ('cause on clickpad, bit cleared mean key pressed)
        and      r1,r1,r4          ; only bit0 to bit10 concerned
        clz        r3,r1        ; r3=nb of cleared bits in r1 until set bit (from bit31 to bit0)
        rsbs        r3,r3,#32       ; r3=32-r3 ; thus r3=0 when every bits are cleared
        addeq       r2,r2,#11        ;If so, r2=r2+11  ; (next line of table , 11 bits per line)
        beq         which_k         ; and continue to check.

        add         r12,r3,r2          ; Otherwise , r12=r3+r2 ;  (we found the key!)
        str        r5,[r6]      ; restore "single scan" mode
        ldmfd     sp!,{r0-r6,pc}     ; restores r0-r6; pc=lr  to come back from this routine
;-----------------------------------------------------------------
kstate  ldmia      r0,{r1-r4}         ; r1=[900e0010] ...r4=[900e001c]
        eor        r1,r1,r2            ; r1=r1 xor r2
        eor        r2,r3,r4            ; r2=r3 xor r4
        orrs       r1,r1,r2            ; r1=r1 or r2
        mov        pc,lr                ; pc=lr to come back from this subroutine
;------------------------------------------------------------------
V900e0010       dcd        0x900e0010
V0b11111111111   dcd 0b11111111111
Dernière édition par grosged le 15 Mar 2017, 16:02, édité 4 fois.
Avatar de l’utilisateur
grosgedProg.
Niveau 13: CU (Calculateur Universel)
Niveau 13: CU (Calculateur Universel)
Prochain niv.: 30.5%
 
Messages: 515
Images: 26
Inscription: 14 Sep 2011, 13:29
Genre: Homme
Calculatrice(s):
Classe: jadis

Re: [ARM926EJ-S] ...Routines !

Message non lude Ti64CLi++ » 09 Mar 2017, 14:35

Existe-il des syscalls connus?
Je suis actuellement en Irlande, et utilise donc un clavier anglais. Merci de ne pas prendre en compte le manque d'accent


Everyone who has never made a mistake has never tried anything new.
Une personne qui n'a jamais commis d'erreur n'a jamais rien essayé de nouveau.

Albert Einstein


Image
Avatar de l’utilisateur
Ti64CLi++Modo
Niveau 14: CI (Calculateur de l'Infini)
Niveau 14: CI (Calculateur de l'Infini)
Prochain niv.: 92.5%
 
Messages: 2613
Images: 49
Inscription: 04 Juil 2014, 15:40
Localisation: Valence 26
Genre: Homme
Calculatrice(s):
Classe: 1°S-SVT

Re: [ARM926EJ-S] ...Routines !

Message non lude grosged » 09 Mar 2017, 15:02

Je ne sais rien sur les syscalls.S'ils existent, j'aimerais bien les connaître, et savoir comment les utiliser :p

EDIT: Je viens d'ajouter la version de WAITKEY pour TI-nspire 'classique' :
WAITKEY_classic
;)

re-EDIT : Je viens de discuter "syscalls" avec Adriweb & Vogtinator....ça s'apparente à des fonctions en C, ça m'a l'air bien compliqué, tout ça :#roll#:
Avatar de l’utilisateur
grosgedProg.
Niveau 13: CU (Calculateur Universel)
Niveau 13: CU (Calculateur Universel)
Prochain niv.: 30.5%
 
Messages: 515
Images: 26
Inscription: 14 Sep 2011, 13:29
Genre: Homme
Calculatrice(s):
Classe: jadis

Re: [ARM926EJ-S] ...Routines !

Message non lude Adriweb » 10 Mar 2017, 09:42

Mais non, swi #num (ou svc #num) avec le num depuis https://github.com/ndless-nspire/Ndless ... all-list.h :P
Après, faut respecter la convention d'appel des fonctions avec les arguments, mais ça c'est comme partout!
Avatar de l’utilisateur
AdriwebAdmin.
Niveau 16: CC2 (Commandeur des Calculatrices)
Niveau 16: CC2 (Commandeur des Calculatrices)
Prochain niv.: 36.8%
 
Messages: 11153
Images: 830
Inscription: 01 Juin 2007, 01:00
Localisation: France
Genre: Homme
Calculatrice(s):
Classe: (ingénieur)
Twitter: adriweb
GitHub: adriweb

Re: [ARM926EJ-S] ...Routines !

Message non lude Ti64CLi++ » 12 Mar 2017, 19:00

Et comment est-ce que je connais les arguments à passer? p1=r1, p2=r2,... ?
Je suis actuellement en Irlande, et utilise donc un clavier anglais. Merci de ne pas prendre en compte le manque d'accent


Everyone who has never made a mistake has never tried anything new.
Une personne qui n'a jamais commis d'erreur n'a jamais rien essayé de nouveau.

Albert Einstein


Image
Avatar de l’utilisateur
Ti64CLi++Modo
Niveau 14: CI (Calculateur de l'Infini)
Niveau 14: CI (Calculateur de l'Infini)
Prochain niv.: 92.5%
 
Messages: 2613
Images: 49
Inscription: 04 Juil 2014, 15:40
Localisation: Valence 26
Genre: Homme
Calculatrice(s):
Classe: 1°S-SVT

Re: [ARM926EJ-S] ...Routines !

Message non lude Adriweb » 12 Mar 2017, 19:23

Avatar de l’utilisateur
AdriwebAdmin.
Niveau 16: CC2 (Commandeur des Calculatrices)
Niveau 16: CC2 (Commandeur des Calculatrices)
Prochain niv.: 36.8%
 
Messages: 11153
Images: 830
Inscription: 01 Juin 2007, 01:00
Localisation: France
Genre: Homme
Calculatrice(s):
Classe: (ingénieur)
Twitter: adriweb
GitHub: adriweb

Re: [ARM926EJ-S] ...Routines !

Message non lude Ti64CLi++ » 12 Mar 2017, 19:26

Merci Adriweb :)
Je suis actuellement en Irlande, et utilise donc un clavier anglais. Merci de ne pas prendre en compte le manque d'accent


Everyone who has never made a mistake has never tried anything new.
Une personne qui n'a jamais commis d'erreur n'a jamais rien essayé de nouveau.

Albert Einstein


Image
Avatar de l’utilisateur
Ti64CLi++Modo
Niveau 14: CI (Calculateur de l'Infini)
Niveau 14: CI (Calculateur de l'Infini)
Prochain niv.: 92.5%
 
Messages: 2613
Images: 49
Inscription: 04 Juil 2014, 15:40
Localisation: Valence 26
Genre: Homme
Calculatrice(s):
Classe: 1°S-SVT

Re: [ARM926EJ-S] ...Routines !

Message non lude Ti64CLi++ » 17 Sep 2017, 15:30

Voila une petite routine pour tracer une ligne:
Code: Tout sélectionner
;r0 base
;r1 x1
;r2 y1
;r3 x2
;r4 y2
;r11 couleur

line
    stmfd sp!, {r0-r12, lr}
    mov r7, #1
    subs r5, r3, r1
    rsbmi r5, r5, #0
    rsbmi r7, r7, #0
    mov r8, #1
    subs r6, r4, r2
    rsbpl r6, r6, #0
    rsbmi r8, r8, #0
    add r9, r6, r5
    mov r10, #0
lineloop
    bl setPixel
    cmp r1, r3
    cmpeq r2, r4
    beq endlineloop
    add r10, r9, r9
    cmp r10, r6
    addge r9, r9, r6
    addge r1, r1, r7
    cmp r10, r5
    addle r9, r9, r5
    addle r2, r2, r8
    bl lineloop
endlineloop
    ldmfd sp!, {r0-r12, pc}


Et un exemple d'utilisation de cette routine: archives_voir.php?id=1145393

Et du coup j'ai readapte la routine pour afficher un pixel :
Code: Tout sélectionner
setPixel
    stmfd sp!, {r0}
    add r0, r0, r1, lsl #1
    add r0, r0, r2, lsl #9
    add r0, r0, r2, lsl #7
    strh r11, [r0]
    ldmfd sp!, {r0}
    bx lr


Je precise que dans l'exemple donne, j'ai integre totalement la routine au code, elle n'est pas appele en tant que routine avec bl line mais elle suit le main ;)
Je suis actuellement en Irlande, et utilise donc un clavier anglais. Merci de ne pas prendre en compte le manque d'accent


Everyone who has never made a mistake has never tried anything new.
Une personne qui n'a jamais commis d'erreur n'a jamais rien essayé de nouveau.

Albert Einstein


Image
Avatar de l’utilisateur
Ti64CLi++Modo
Niveau 14: CI (Calculateur de l'Infini)
Niveau 14: CI (Calculateur de l'Infini)
Prochain niv.: 92.5%
 
Messages: 2613
Images: 49
Inscription: 04 Juil 2014, 15:40
Localisation: Valence 26
Genre: Homme
Calculatrice(s):
Classe: 1°S-SVT

Re: [ARM926EJ-S] ...Routines !

Message non lude grosged » 12 Oct 2017, 16:45

Hey, t'as fait du bon boulot 8-)
Toujours utile comme routine ;)
Avatar de l’utilisateur
grosgedProg.
Niveau 13: CU (Calculateur Universel)
Niveau 13: CU (Calculateur Universel)
Prochain niv.: 30.5%
 
Messages: 515
Images: 26
Inscription: 14 Sep 2011, 13:29
Genre: Homme
Calculatrice(s):
Classe: jadis

Re: [ARM926EJ-S] ...Routines !

Message non lude Ti64CLi++ » 12 Oct 2017, 18:55

Et je suis en train d'en faire une pour in cercle (depuis deja 1/2 mois a peu pres) mais elle bug a partir de certaine coordonne :(
Donc ce n'est pas pour tout de suite :)
(Je vais voir si lkj peut m'aider ^^)
Je suis actuellement en Irlande, et utilise donc un clavier anglais. Merci de ne pas prendre en compte le manque d'accent


Everyone who has never made a mistake has never tried anything new.
Une personne qui n'a jamais commis d'erreur n'a jamais rien essayé de nouveau.

Albert Einstein


Image
Avatar de l’utilisateur
Ti64CLi++Modo
Niveau 14: CI (Calculateur de l'Infini)
Niveau 14: CI (Calculateur de l'Infini)
Prochain niv.: 92.5%
 
Messages: 2613
Images: 49
Inscription: 04 Juil 2014, 15:40
Localisation: Valence 26
Genre: Homme
Calculatrice(s):
Classe: 1°S-SVT


Retourner vers Programmation native: Ndless & Linux

Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 0 invités

Concours
Galactik, concours universel de rentrée 2017 : 1 défi, 4 constructeurs, 1400€ de lots !
-
Rechercher
-
Sujets à la une
Galactik, concours universel de rentrée 2017 : 1 défi, 4 constructeurs, 1400€ de lots !
"NumWorks++": Challenge de modification matérielle pour rajouter une puce de mémoire Flash !
Offre TI-Planet/Jarrety pour avoir la TI-83 Premium CE avec son chargeur pour 79,79€ port inclus !
Offre TI-Planet/Jarrety pour avoir la TI-Nspire CX CAS à seulement 130€ TTC port inclus!
Jailbreake ta TI-Nspire avec Ndless et profite des meilleurs jeux et applications !
Transforme ta TI-Nspire CX en console Game Boy Advance!
123456
-
Donations/Premium
Pour plus de concours, de lots, de tests, nous aider à payer le serveur et les domaines...
PayPal : paiement en ligne sécurisé - secure online payments
Découvrez les avantages d'un compte donateur !
JoinRejoignez the donors and/or premium!les donateurs et/ou premium !


Partenaires et pub
Notre partenaire Jarrety 
-
Stats.
242 utilisateurs:
>184 invités
>52 membres
>6 robots
Record simultané (sur 6 mois):
6892 utilisateurs (le 07/06/2017)
-
Autres sites intéressants
Texas Instruments Education
Global | France
 (English / Français)
Banque de programmes TI
ticalc.org
 (English)
La communauté TI-82
tout82.free.fr
 (Français)