Page 1 sur 1

[ARM926EJ-S] ...Routines !

Message non luPosté: 09 Mar 2017, 12:34
de grosged
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

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

Message non luPosté: 09 Mar 2017, 13:35
de Ti64CLi++
Existe-il des syscalls connus?

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

Message non luPosté: 09 Mar 2017, 14:02
de grosged
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#:

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

Message non luPosté: 10 Mar 2017, 08:42
de Adriweb
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!

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

Message non luPosté: 12 Mar 2017, 18:00
de Ti64CLi++
Et comment est-ce que je connais les arguments à passer? p1=r1, p2=r2,... ?

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

Message non luPosté: 12 Mar 2017, 18:23
de Adriweb

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

Message non luPosté: 12 Mar 2017, 18:26
de Ti64CLi++
Merci Adriweb :)

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

Message non luPosté: 17 Sep 2017, 14:30
de Ti64CLi++
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 ;)

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

Message non luPosté: 12 Oct 2017, 15:45
de grosged
Hey, t'as fait du bon boulot 8-)
Toujours utile comme routine ;)

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

Message non luPosté: 12 Oct 2017, 17:55
de Ti64CLi++
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 ^^)