home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Dream 55
/
Amiga_Dream_55.iso
/
RISCOS
/
MAGAZINE
/
NEWS
/
PCE021.ZIP
/
Pce021
/
Src
/
s
/
joypad
< prev
next >
Wrap
Text File
|
1998-07-24
|
4KB
|
166 lines
; joypad.s
; --------
; PC Engine joypad emulation
; by Paul Clifford
;
; Started 16 August 1997
GET hdr.SWINames
EventV * &10
disable_event * 13
enable_event * 14
key_updown * 11
; ------------------------------------------------------------------------
AREA |joypad$$code|, CODE, READONLY
IMPORT machine
; void Joypad_Initialise(void)
Joypad_Initialise
EXPORT Joypad_Initialise
stmfd r13!, {r0-r2, r14}
mov r0, #EventV
adr r1, Watch_Keys
ldr r2, =keyboard
swi OS_Claim
mov r0, #enable_event
mov r1, #key_updown
swi OS_Byte
ldmfd r13!, {r0-r2, pc}^
Joypad_Finalise
EXPORT Joypad_Finalise
stmfd r13!, {r0-r2, r14}
mov r0, #disable_event
mov r1, #key_updown
swi OS_Byte
mov r0, #EventV
adr r1, Watch_Keys
ldr r2, =keyboard
swi OS_Release
ldmfd r13!, {r0-r2, pc}^
Watch_Keys
cmp r0, #key_updown
movne pc, r14
stmfd r13!, {r0-r1, r14}
and r0, r2, #2_1111111
cmp r0, r2
ldmnefd r13!, {r0-r1, pc}^
cmp r1, #0
movne r1, #1
strb r1, [r12, r2]
ldmfd r13!, {r0-r1, pc}^
; void Joypad_Write(uhalf address, ubyte value)
; Joypad write port
Joypad_Write
EXPORT Joypad_Write
cmp r0, #0
movnes pc, r14
tst r1, #2 ; reset joypad number?
ldr r2, adrof_joypad_number
movne r0, #0 ; yes
ldreq r0, [r2, #0] ; no, so load current one
ldr r3, adrof_joypad_keys
cmp r0, #5 ; is joypad number valid? (anything > 4 == 0)
addlt r3, r3, r0, lsl #3 ; address of joypad emulation keys
tst r1, #1 ; directions or buttons?
addeq r3, r3, #4 ; buttons
addeq r0, r0, #1 ; increase joypad number
ldr r1, =keyboard
str r0, [r2, #0] ; store joypad number
; ldr r1, [r1, #0] ; r1 = keyboard
ldrb r0, [r3, #0] ; first emulated key
mov r2, #0xf ; joypad value
ldrb r0, [r1, r0] ; get status of key
bic r2, r2, r0, lsl #3 ; and reflect it in joypad value
ldrb r0, [r3, #1] ; second emulated key
ldrb r0, [r1, r0] ; get status of it
bic r2, r2, r0, lsl #2 ; reflect in joypad value
ldrb r0, [r3, #2] ; third emulated key
ldrb r0, [r1, r0] ; get status of it
bic r2, r2, r0, lsl #1 ; reflect in joypad value
ldrb r0, [r3, #3] ; fourth emulated key
ldr r3, adrof_machine
ldrb r0, [r1, r0] ; get status of key
ldr r3, [r3, #0] ; r3 = machine
ldr r1, adrof_joypad_value ; r1 = address of joypad value
bic r2, r2, r0 ; reflect status of key in joypad value
orr r2, r2, r3
str r2, [r1, #0]
movs pc, r14
; ubyte Joypad_Read(uhalf address)
; Joypad read port
Joypad_Read
EXPORT Joypad_Read
cmp r0, #0
ldreq r1, adrof_joypad_value
movne r0, #0
ldreq r0, [r1, #0]
movs pc, r14
adrof_joypad_value
DCD joypad_value
adrof_machine
DCD machine
adrof_joypad_number
DCD joypad_number
adrof_joypad_keys
DCD joypad_keys
; ------------------------------------------------------------------------
AREA |joypad$$data|, DATA
joypad_value
EXPORT joypad_value
DCD 0xf
joypad_number
EXPORT joypad_number
DCD 0
= "Joyp"
= "ad k"
= "eys "
joypad_keys
; joypad 1
= 0x62, 0x63, 0x64, 0x59 ; left, down, right, up
= 0x47, 0x5f, 0x3d, 0x3c ; return (run), space (select), s (II), a (I)
; joypad 2
= 0x5a, 0x5b, 0x5c, 0x49 ; K1 (left), K2 (down), K3 (right), K5 (up)
= 0x4b, 0x67, 0x39, 0x38 ; K+ (run), enter (select), K9 (II), K8 (I)
; joypad 3
= 0x62, 0x63, 0x64, 0x59 ; left, down, right, up
= 0x47, 0x5f, 0x3d, 0x3c ; return (run), space (select), s (II), a (I)
; joypad 4
= 0x62, 0x63, 0x64, 0x59 ; left, down, right, up
= 0x47, 0x5f, 0x3d, 0x3c ; return (run), space (select), s (II), a (I)
; joypad 5
= 0x62, 0x63, 0x64, 0x59 ; left, down, right, up
= 0x47, 0x5f, 0x3d, 0x3c ; return (run), space (select), s (II), a (I)
; ------------------------------------------------------------------------
AREA |joypad$$zidata|, NOINIT
keyboard
EXPORT keyboard
% 256
END