forked from Lephenixnoir/fxdoc
127 lines
4.3 KiB
Plaintext
127 lines
4.3 KiB
Plaintext
<80053a98 Keyboard_DisableInterrupt>
|
|
Disable and mask the keyboard interrupt.
|
|
|
|
# Block IMR5 & 0x80
|
|
# Set IPRF & 0xf000 to 0
|
|
80053a98: a008 bra <80053aac>
|
|
80053a9a: 0009 nop
|
|
...
|
|
80053aac: d478 mov.l 0xa4080094 INTC.IMR5, r4
|
|
80053aae: e180 mov #-128, r1
|
|
80053ab0: 955b mov.w 0x00000fff, r5
|
|
80053ab2: 2410 mov.b r1, @r4
|
|
80053ab4: 7480 add #-128, r4
|
|
80053ab6: 6241 mov.w @r4, r2
|
|
80053ab8: 2259 and r5, r2
|
|
80053aba: 000b rts
|
|
80053abc: 2421 mov.w r2, @r4
|
|
|
|
<80053aa0 Keyboard_EnableInterrupt>
|
|
Enable and unmask the keyboard interrupt.
|
|
|
|
# Set IPRF & 0xf000 to 13
|
|
# Clear IMR5 & 0x80
|
|
80053aa0: a00d bra <80053abe>
|
|
80053aa2: 0009 nop
|
|
...
|
|
80053abe: d475 mov.l 0xa4080014 INTC.IPRF, r4
|
|
80053ac0: 9753 mov.w 0x00000fff, r7
|
|
80053ac2: 9253 mov.w 0xffffd000, r2
|
|
80053ac4: e580 mov #-128, r5
|
|
80053ac6: 6141 mov.w @r4, r1
|
|
80053ac8: 2179 and r7, r1
|
|
80053aca: 212b or r2, r1
|
|
80053acc: 2411 mov.w r1, @r4
|
|
80053ace: d472 mov.l 0xa40800d4 INTC.IMCR5, r4
|
|
80053ad0: 000b rts
|
|
80053ad2: 2450 mov.b r5, @r4
|
|
|
|
---
|
|
|
|
<80055d36 Keyboard_ConfigurePorts>
|
|
Configures keyboard for low-level (and probably KEYSC) access. This has not
|
|
been fully documented to the best of my knowledge.
|
|
|
|
TODO: Investigate the low-level abstraction of the KEYSC
|
|
See also: http://www.casiopeia.net/forum/viewtopic.php?p=14193#p14193
|
|
|
|
# PFC.PMCR = 0x0000
|
|
# PFC.PNCR = 0x0100
|
|
# PFC.PPCR = 0x0000 (also called PZCR sometimes)
|
|
80055d36: d244 mov.l 0xa4050116 PFC.PMCR, r2
|
|
80055d38: e600 mov #0, r6
|
|
80055d3a: e001 mov #1, r0
|
|
80055d3c: 4018 shll8 r0
|
|
80055d3e: 2261 mov.w r6, @r2
|
|
80055d40: 8121 mov.w r0, @(2,r2)
|
|
80055d42: 7236 add #54, r2
|
|
80055d44: 000b rts
|
|
80055d46: 2261 mov.w r6, @r2
|
|
|
|
<80055d48 Keyboard_Initialize>
|
|
Fully initializes the keyboard hardware: ports, KEYSC, interrupt. This
|
|
function has a long sleep built-in (45 ms), making it pretty slow.
|
|
|
|
# Stop the keyboard interrupt configuring and set the port parameters
|
|
80055d48: 4f22 sts.l pr, @-r15
|
|
80055d4a: d138 mov.l 0x80053a98 Keyboard_DisableInterrupt, r1
|
|
80055d4c: 410b jsr @r1
|
|
80055d4e: 0009 nop
|
|
80055d50: bff1 bsr <80055d36 Keyboard_ConfigurePorts>
|
|
80055d52: e401 mov #1, r4
|
|
|
|
# Initialize the KEYSC configuration then sleep for about 45 ms.
|
|
# UCNTREG = 0x8000
|
|
# UINTREG = 0x00ff
|
|
# UINTREG = 0x4800
|
|
# AUTOFIXREG = 0x8042
|
|
# UINTERVALREG = 0x0098
|
|
# UWSETREG = 0x0000
|
|
# PFC.PULCRP = 0xff
|
|
# OUTPINSET = 0x0fff
|
|
# INPINSET = 0x00ff
|
|
# UMODEREG = 0x0200
|
|
80055d54: d53d mov.l 0xa44b000c KEYSC.UCNTREG, r5
|
|
80055d56: e2ff mov #-1, r2
|
|
80055d58: 622c extu.b r2, r2
|
|
80055d5a: 9433 mov.w 0xffff8000, r4
|
|
80055d5c: d738 mov.l 0xa40501c6 PFC.PULCRP, r7
|
|
80055d5e: e1ff mov #-1, r1
|
|
80055d60: 6023 mov r2, r0
|
|
80055d62: 2541 mov.w r4, @r5
|
|
80055d64: e401 mov #1, r4
|
|
80055d66: 8154 mov.w r0, @(8,r5)
|
|
80055d68: e048 mov #72, r0
|
|
80055d6a: 4018 shll8 r0
|
|
80055d6c: 8154 mov.w r0, @(8,r5)
|
|
80055d6e: 902a mov.w 0xffff8042, r0
|
|
80055d70: 8151 mov.w r0, @(2,r5)
|
|
80055d72: e098 mov #-104, r0
|
|
80055d74: 600c extu.b r0, r0
|
|
80055d76: 8156 mov.w r0, @(12,r5)
|
|
80055d78: e000 mov #0, r0
|
|
80055d7a: 8155 mov.w r0, @(10,r5)
|
|
80055d7c: 2710 mov.b r1, @r7
|
|
80055d7e: 901f mov.w 0x00000fff, r0
|
|
80055d80: 8157 mov.w r0, @(14,r5)
|
|
80055d82: 6023 mov r2, r0
|
|
80055d84: d132 mov.l 0x800541b0 CMT_InterruptiveSleep, r1
|
|
80055d86: 8158 mov.w r0, @(16,r5)
|
|
80055d88: e002 mov #2, r0
|
|
80055d8a: 4018 shll8 r0
|
|
80055d8c: 410b jsr @r1
|
|
80055d8e: 8152 mov.w r0, @(4,r5)
|
|
|
|
# Restore the keyboard interrupt (setting IPRF & 0xf000 to 13 is useless here
|
|
# because it's overwritten immediately) and return
|
|
80055d90: d628 mov.l 0xa4080014 INTC.IPRF, r6
|
|
80055d92: 9115 mov.w 0x00000fff, r1
|
|
80055d94: 9515 mov.w 0xffffd000, r5
|
|
80055d96: d228 mov.l 0x80053aa0 Keyboard_EnableInterrupt, r2
|
|
80055d98: 6761 mov.w @r6, r7
|
|
80055d9a: 2719 and r1, r7
|
|
80055d9c: 275b or r5, r7
|
|
80055d9e: 2671 mov.w r7, @r6
|
|
80055da0: 422b jmp @r2
|
|
80055da2: 4f26 lds.l @r15+, pr
|