怎么在NES 模拟器的基础上加入按键功能?

2019-07-20 17:32发布

joy0_W                ;4016  手柄1+选通
;----------------------------------------------------------------------------
        tst r0,#1
        orr lr,#0x01                ;lr最低位置1防止进入arm状态
        bxne lr

        ldr r0,=0x40011408 ; 端口输入数据寄存器(GPIOD_IDR)0x40011408        按键端口
        ldr r0,[r0]                  ;         PD9    11     12    13    14    15设置成的输入           按下为0
                                   ;   key 6     1      2          3            4          5

                        ;        ((右  <<7)|(左  <<6)|(下  <<5)|(上  <<4)|Start<<3)|Select<<2)|(B  <<1)| A   )
                        ;                          5                  3                4                        2                        1                                            6        按键编号
       
        lsr r0,r0,#8          ;>>8  只要高8位
        rsb r0,r0,#0xff   ; R0 = #0xff-R0      反向减法?   取反                  nes需要按下为1
;        mvn r0,r0                  ;        加载一个数的NOT 值(取到逻辑反的值)
                                        ;                         76543210                8位数据的位
                                        ;                         54321*6*                 按键编号
                                        ;                         53421**6                 nes按键编号

        and r2,r0,#0x80   ;按键5 在对应位

        and r1,r0,#0x20   ;按键3
        orr r2,r1,lsl#1          ;                        <<1

        and r1,r0,#0x8 ;按键1
        orr r2,r1                 ;按键1 在对应位

        and r1,r0,#0x40 ;按键4
        orr r2,r1,lsr#1                          ;>>1

        and r1,r0,#0x10 ;按键2
        orr r2,r1                ;按键2 在对应位

        and r1,r0,#0x02 ;按键6
        orr r2,r1,lsr#1  ;    >>1                  r2是键值
;        orr r2,r2,#0x08                   ;20位表示控制器在位        ??

        str r2,joy0serial
        bx lr
;--------------------------------------------------------------------------------       

    IMPORT Apu_Read4015  ;apu.c
apu_4015R        ;4015
;----------------------------------------------------------------------------------       
        stmfd sp!,{r3,lr}        ;LR 寄存器放栈      
        bl Apu_Read4015
        ldmfd sp!,{r3,lr}
        orr lr,#0x01                ;lr最低位置1防止进入arm状态
        bx lr
;----------------------------------------------------------------------------
joy0_R                ;4016
;----------------------------------------------------------------------------       

        ldr r0,joy0serial           ;串行数据  当前读取位
        mov r1,r0,lsr#1
        str r1,joy0serial
        and r0,r0,#1       
        orr r0,r0,#0x40

    orr lr,#0x01                ;lr最低位置1防止进入arm状态
        bx lr

我在论坛上找到了网友给的代码,不过不太懂汇编,请问这段代码是怎么实现按键功能的?
或者说一下实现的思路?谢谢大家了

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。