Difference between revisions of "ASM Joypad"

From GbdevWiki
Jump to: navigation, search
(Created page with 'Reads the status of the joypad, saving it in a (byte) variable "_PAD", uses the definitions of gbhw.inc: <pre> read_pad: ; init ld a, 0 ld [_PAD], a ;…')
 
(It's more propagation delay than bouncing)
 
Line 11: Line 11:
 
     ld      [rP1], a
 
     ld      [rP1], a
 
     ; read the status of the d-pad
 
     ; read the status of the d-pad
     ; we do several reads because of bouncing
+
     ; the first first few reads waste a few cycles to let
     ld      a, [rP1]
+
     ; the signals settle after bits 5 and 4 have changed
 
     ld      a, [rP1]
 
     ld      a, [rP1]
 
     ld      a, [rP1]
 
     ld      a, [rP1]
 
     ld      a, [rP1]
 
     ld      a, [rP1]
 +
    ld      a, [rP1]        ; keep this read
  
 
     and    $0F            ; just keep low nibble (d-pad status)
 
     and    $0F            ; just keep low nibble (d-pad status)
Line 25: Line 26:
 
     ld      [rP1], a
 
     ld      [rP1], a
  
     ; bouncing...
+
     ; signal propagation...
 
     ld      a, [rP1]
 
     ld      a, [rP1]
 
     ld      a, [rP1]
 
     ld      a, [rP1]

Latest revision as of 10:09, 6 July 2019

Reads the status of the joypad, saving it in a (byte) variable "_PAD", uses the definitions of gbhw.inc:

read_pad:
    ; init
    ld      a, 0
    ld      [_PAD], a

    ; read the d-pad:
    ld      a, %00100000    ; bit 4 = 0, bit 5 = 1 (d-pad on, buttons off)
    ld      [rP1], a
    ; read the status of the d-pad
    ; the first first few reads waste a few cycles to let
    ; the signals settle after bits 5 and 4 have changed
    ld      a, [rP1]
    ld      a, [rP1]
    ld      a, [rP1]
    ld      a, [rP1]        ; keep this read

    and     $0F             ; just keep low nibble (d-pad status)
    swap    a               ; swap low and high nibbles
    ld      b, a            ; save d-pad status in b register

    ; let's read the buttons
    ld      a, %00010000    ; bit 4 = 1, bit 5 = 0 (buttons on, d-pad off)
    ld      [rP1], a

    ; signal propagation...
    ld      a, [rP1]
    ld      a, [rP1]
    ld      a, [rP1]
    ld      a, [rP1]
    ld      a, [rP1]
    ld      a, [rP1]

    ; we have in "a" the status of the buttons
    and     $0F             ; just keep low nibble.
    or      b               ; OR with "b" to put in the high byte of "a"
                            ; the d-pad status.

    ; now we have in "a" the status of all the controls
    ; make the complement of it (so activated buttons read as 1)
    ; and save it 
    cpl
    ld      [_PAD], a

    ; reset the joypad
    ld      a,$30
    ld      [rP1], a

    ; return
    ret