home *** CD-ROM | disk | FTP | other *** search
/ Dream 55 / Amiga_Dream_55.iso / RISCOS / MAGAZINE / NEWS / PCE021.ZIP / Pce021 / Src / s / joypad < prev    next >
Text File  |  1998-07-24  |  4KB  |  166 lines

  1. ;    joypad.s
  2. ;    --------
  3. ;    PC Engine joypad emulation
  4. ;    by Paul Clifford
  5. ;
  6. ;    Started 16 August 1997
  7.  
  8.  
  9.     GET    hdr.SWINames
  10.  
  11.  
  12. EventV            *    &10
  13. disable_event        *    13
  14. enable_event        *    14
  15. key_updown        *    11
  16.  
  17.  
  18. ;    ------------------------------------------------------------------------
  19.  
  20.     AREA    |joypad$$code|, CODE, READONLY
  21.  
  22.  
  23.     IMPORT    machine
  24.  
  25.  
  26. ;    void Joypad_Initialise(void)
  27. Joypad_Initialise
  28.     EXPORT    Joypad_Initialise
  29.     stmfd    r13!, {r0-r2, r14}
  30.     mov    r0, #EventV
  31.     adr    r1, Watch_Keys
  32.     ldr    r2, =keyboard
  33.     swi    OS_Claim
  34.     mov    r0, #enable_event
  35.     mov    r1, #key_updown
  36.     swi    OS_Byte
  37.     ldmfd    r13!, {r0-r2, pc}^
  38.  
  39. Joypad_Finalise
  40.     EXPORT    Joypad_Finalise
  41.     stmfd    r13!, {r0-r2, r14}
  42.     mov    r0, #disable_event
  43.     mov    r1, #key_updown
  44.     swi    OS_Byte
  45.     mov    r0, #EventV
  46.     adr    r1, Watch_Keys
  47.     ldr    r2, =keyboard
  48.     swi    OS_Release
  49.     ldmfd    r13!, {r0-r2, pc}^
  50.  
  51. Watch_Keys
  52.     cmp    r0, #key_updown
  53.     movne    pc, r14
  54.     stmfd    r13!, {r0-r1, r14}
  55.     and    r0, r2, #2_1111111
  56.     cmp    r0, r2
  57.     ldmnefd    r13!, {r0-r1, pc}^
  58.     cmp    r1, #0
  59.     movne    r1, #1
  60.     strb    r1, [r12, r2]
  61.     ldmfd    r13!, {r0-r1, pc}^
  62.  
  63.  
  64. ;    void Joypad_Write(uhalf address, ubyte value)
  65. ;    Joypad write port
  66. Joypad_Write
  67.     EXPORT    Joypad_Write
  68.     cmp    r0, #0
  69.     movnes    pc, r14
  70.     tst    r1, #2                ; reset joypad number?
  71.     ldr    r2, adrof_joypad_number
  72.     movne    r0, #0                ; yes
  73.     ldreq    r0, [r2, #0]            ; no, so load current one
  74.     ldr    r3, adrof_joypad_keys
  75.     cmp    r0, #5                ; is joypad number valid? (anything > 4 == 0)
  76.     addlt    r3, r3, r0, lsl #3        ; address of joypad emulation keys
  77.     tst    r1, #1                ; directions or buttons?
  78.     addeq    r3, r3, #4            ; buttons
  79.     addeq    r0, r0, #1            ; increase joypad number
  80.     ldr    r1, =keyboard
  81.     str    r0, [r2, #0]            ; store joypad number
  82. ;    ldr    r1, [r1, #0]            ; r1 = keyboard
  83.     ldrb    r0, [r3, #0]            ; first emulated key
  84.     mov    r2, #0xf            ; joypad value
  85.     ldrb    r0, [r1, r0]            ; get status of key
  86.     bic    r2, r2, r0, lsl #3        ; and reflect it in joypad value
  87.     ldrb    r0, [r3, #1]            ; second emulated key
  88.     ldrb    r0, [r1, r0]            ; get status of it
  89.     bic    r2, r2, r0, lsl #2        ; reflect in joypad value
  90.     ldrb    r0, [r3, #2]            ; third emulated key
  91.     ldrb    r0, [r1, r0]            ; get status of it
  92.     bic    r2, r2, r0, lsl #1        ; reflect in joypad value
  93.     ldrb    r0, [r3, #3]            ; fourth emulated key
  94.     ldr    r3, adrof_machine
  95.     ldrb    r0, [r1, r0]            ; get status of key
  96.     ldr    r3, [r3, #0]            ; r3 = machine
  97.     ldr    r1, adrof_joypad_value        ; r1 = address of joypad value
  98.     bic    r2, r2, r0            ; reflect status of key in joypad value
  99.     orr    r2, r2, r3
  100.     str    r2, [r1, #0]
  101.     movs    pc, r14
  102.  
  103. ;    ubyte Joypad_Read(uhalf address)
  104. ;    Joypad read port
  105. Joypad_Read
  106.     EXPORT    Joypad_Read
  107.     cmp    r0, #0
  108.     ldreq    r1, adrof_joypad_value
  109.     movne    r0, #0
  110.     ldreq    r0, [r1, #0]
  111.     movs    pc, r14
  112.  
  113.  
  114. adrof_joypad_value
  115.     DCD    joypad_value
  116. adrof_machine
  117.     DCD    machine
  118. adrof_joypad_number
  119.     DCD    joypad_number
  120. adrof_joypad_keys
  121.     DCD    joypad_keys
  122.  
  123.  
  124. ;    ------------------------------------------------------------------------
  125.  
  126.     AREA    |joypad$$data|, DATA
  127.  
  128.  
  129. joypad_value
  130.     EXPORT    joypad_value
  131.     DCD    0xf
  132. joypad_number
  133.     EXPORT    joypad_number
  134.     DCD    0
  135.     =    "Joyp"
  136.     =    "ad k"
  137.     =    "eys "
  138. joypad_keys
  139. ; joypad 1
  140.     =    0x62, 0x63, 0x64, 0x59 ; left, down, right, up
  141.     =    0x47, 0x5f, 0x3d, 0x3c ; return (run), space (select), s (II), a (I)
  142. ; joypad 2
  143.     =    0x5a, 0x5b, 0x5c, 0x49 ; K1 (left), K2 (down), K3 (right), K5 (up)
  144.     =    0x4b, 0x67, 0x39, 0x38 ; K+ (run), enter (select), K9 (II), K8 (I)
  145. ; joypad 3
  146.     =    0x62, 0x63, 0x64, 0x59 ; left, down, right, up
  147.     =    0x47, 0x5f, 0x3d, 0x3c ; return (run), space (select), s (II), a (I)
  148. ; joypad 4
  149.     =    0x62, 0x63, 0x64, 0x59 ; left, down, right, up
  150.     =    0x47, 0x5f, 0x3d, 0x3c ; return (run), space (select), s (II), a (I)
  151. ; joypad 5
  152.     =    0x62, 0x63, 0x64, 0x59 ; left, down, right, up
  153.     =    0x47, 0x5f, 0x3d, 0x3c ; return (run), space (select), s (II), a (I)
  154.  
  155.  
  156. ;    ------------------------------------------------------------------------
  157.  
  158.     AREA    |joypad$$zidata|, NOINIT
  159.  
  160. keyboard
  161.     EXPORT    keyboard
  162.     %    256
  163.  
  164.  
  165.     END
  166.