π
<-
Chat plein-écran
[^]

[ARM926EJ-S] ...Routines !

C, C++, ASM...

[ARM926EJ-S] ...Routines !

Message non lude grosged » 09 Mar 2017, 12: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, 15:02, édité 4 fois.
Avatar de l’utilisateur
grosgedVIP++
Niveau 14: CI (Calculateur de l'Infini)
Niveau 14: CI (Calculateur de l'Infini)
Prochain niv.: 30.2%
 
Messages: 770
Images: 75
Inscription: 14 Sep 2011, 12:29
Genre: Non spécifié
Calculatrice(s):
MyCalcs profile

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

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

Existe-il des syscalls connus?
Image
Avatar de l’utilisateur
Ti64CLi++Modo
Niveau 16: CC2 (Commandeur des Calculatrices)
Niveau 16: CC2 (Commandeur des Calculatrices)
Prochain niv.: 32.3%
 
Messages: 3441
Images: 75
Inscription: 04 Juil 2014, 14:40
Localisation: Clermont-Ferrand 63
Genre: Homme
Calculatrice(s):
MyCalcs profile
Classe: ENS Rennes
GitHub: Ti64CLi

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

Message non lude grosged » 09 Mar 2017, 14: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
grosgedVIP++
Niveau 14: CI (Calculateur de l'Infini)
Niveau 14: CI (Calculateur de l'Infini)
Prochain niv.: 30.2%
 
Messages: 770
Images: 75
Inscription: 14 Sep 2011, 12:29
Genre: Non spécifié
Calculatrice(s):
MyCalcs profile

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

Message non lude Adriweb » 10 Mar 2017, 08: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!
Image

MyCalcs: Help the community's calculator documentations by filling out your calculators info!
MyCalcs: Aidez la communauté à documenter les calculatrices en donnant des infos sur vos calculatrices !
Inspired-Lua.org: All about TI-Nspire Lua programming (tutorials, wiki/docs...)
Avatar de l’utilisateur
AdriwebAdmin
Niveau 16: CC2 (Commandeur des Calculatrices)
Niveau 16: CC2 (Commandeur des Calculatrices)
Prochain niv.: 80.1%
 
Messages: 14606
Images: 1216
Inscription: 01 Juin 2007, 00:00
Localisation: France
Genre: Homme
Calculatrice(s):
MyCalcs profile
Twitter/X: adriweb
GitHub: adriweb

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

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

Et comment est-ce que je connais les arguments à passer? p1=r1, p2=r2,... ?
Image
Avatar de l’utilisateur
Ti64CLi++Modo
Niveau 16: CC2 (Commandeur des Calculatrices)
Niveau 16: CC2 (Commandeur des Calculatrices)
Prochain niv.: 32.3%
 
Messages: 3441
Images: 75
Inscription: 04 Juil 2014, 14:40
Localisation: Clermont-Ferrand 63
Genre: Homme
Calculatrice(s):
MyCalcs profile
Classe: ENS Rennes
GitHub: Ti64CLi

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

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

Image

MyCalcs: Help the community's calculator documentations by filling out your calculators info!
MyCalcs: Aidez la communauté à documenter les calculatrices en donnant des infos sur vos calculatrices !
Inspired-Lua.org: All about TI-Nspire Lua programming (tutorials, wiki/docs...)
Avatar de l’utilisateur
AdriwebAdmin
Niveau 16: CC2 (Commandeur des Calculatrices)
Niveau 16: CC2 (Commandeur des Calculatrices)
Prochain niv.: 80.1%
 
Messages: 14606
Images: 1216
Inscription: 01 Juin 2007, 00:00
Localisation: France
Genre: Homme
Calculatrice(s):
MyCalcs profile
Twitter/X: adriweb
GitHub: adriweb

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

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

Merci Adriweb :)
Image
Avatar de l’utilisateur
Ti64CLi++Modo
Niveau 16: CC2 (Commandeur des Calculatrices)
Niveau 16: CC2 (Commandeur des Calculatrices)
Prochain niv.: 32.3%
 
Messages: 3441
Images: 75
Inscription: 04 Juil 2014, 14:40
Localisation: Clermont-Ferrand 63
Genre: Homme
Calculatrice(s):
MyCalcs profile
Classe: ENS Rennes
GitHub: Ti64CLi

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

Message non lude Ti64CLi++ » 17 Sep 2017, 14: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 ;)
Image
Avatar de l’utilisateur
Ti64CLi++Modo
Niveau 16: CC2 (Commandeur des Calculatrices)
Niveau 16: CC2 (Commandeur des Calculatrices)
Prochain niv.: 32.3%
 
Messages: 3441
Images: 75
Inscription: 04 Juil 2014, 14:40
Localisation: Clermont-Ferrand 63
Genre: Homme
Calculatrice(s):
MyCalcs profile
Classe: ENS Rennes
GitHub: Ti64CLi

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

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

Hey, t'as fait du bon boulot 8-)
Toujours utile comme routine ;)
Avatar de l’utilisateur
grosgedVIP++
Niveau 14: CI (Calculateur de l'Infini)
Niveau 14: CI (Calculateur de l'Infini)
Prochain niv.: 30.2%
 
Messages: 770
Images: 75
Inscription: 14 Sep 2011, 12:29
Genre: Non spécifié
Calculatrice(s):
MyCalcs profile

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

Message non lude Ti64CLi++ » 12 Oct 2017, 17: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 ^^)
Image
Avatar de l’utilisateur
Ti64CLi++Modo
Niveau 16: CC2 (Commandeur des Calculatrices)
Niveau 16: CC2 (Commandeur des Calculatrices)
Prochain niv.: 32.3%
 
Messages: 3441
Images: 75
Inscription: 04 Juil 2014, 14:40
Localisation: Clermont-Ferrand 63
Genre: Homme
Calculatrice(s):
MyCalcs profile
Classe: ENS Rennes
GitHub: Ti64CLi


Retourner vers Native: Ndless, Linux, ...

Qui est en ligne

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

-
Rechercher
-
Social TI-Planet
-
Sujets à la une
Comparaisons des meilleurs prix pour acheter sa calculatrice !
Aidez la communauté à documenter les révisions matérielles en listant vos calculatrices graphiques !
Phi NumWorks jailbreak
123
-
Faire un don / Premium
Pour plus de concours, de lots, de tests, nous aider à payer le serveur et les domaines...
Faire un don
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 Calculatrices à acheter chez Calcuso
-
Stats.
938 utilisateurs:
>923 invités
>11 membres
>4 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)