144 lines
2.2 KiB
ArmAsm
144 lines
2.2 KiB
ArmAsm
.include "global.s"
|
|
|
|
.PAL_01 = 0x00
|
|
.PAL_23 = 0x01
|
|
.PAL_03 = 0x02
|
|
.PAL_12 = 0x03
|
|
.ATTR_BLK = 0x04
|
|
.ATTR_LIN = 0x05
|
|
.ATTR_DIV = 0x06
|
|
.ATTR_CHR = 0x07
|
|
.SOUND = 0x08
|
|
.SOU_TRN = 0x09
|
|
.PAL_SET = 0x0A
|
|
.PAL_TRN = 0x0B
|
|
.ATRC_EN = 0x0C
|
|
.TEST_EN = 0x0D
|
|
.ICON_EN = 0x0E
|
|
.DATA_SND = 0x0F
|
|
.DATA_TRN = 0x10
|
|
.MLT_REQ = 0x11
|
|
.JUMP = 0x12
|
|
.CHR_TRN = 0x13
|
|
.PCT_TRN = 0x14
|
|
.ATTR_TRN = 0x15
|
|
.ATTR_SET = 0x16
|
|
.MASK_EN = 0x17
|
|
.OBJ_TRN = 0x18
|
|
|
|
.area _CODE
|
|
|
|
;; Check if running on SGB
|
|
;; Set A to 0xFF when running on SGB
|
|
;; Clear A when running on DMG
|
|
.sgb_check::
|
|
_sgb_check:: ; Banked
|
|
LD HL,#.MLT_REQ_2
|
|
CALL .sgb_transfer
|
|
CALL .wait4
|
|
LDH A,(.P1)
|
|
AND #0x03
|
|
CP #0x03
|
|
JR NZ,.sgb_mode
|
|
|
|
LD A,#0x20 ; Controller read (dummy)
|
|
LDH (.P1),A
|
|
LDH A,(.P1)
|
|
LDH A,(.P1)
|
|
CPL
|
|
AND #0x0F
|
|
SWAP A
|
|
LD B,A
|
|
LD A,#0x30
|
|
LDH (.P1),A
|
|
LD A,#0x10
|
|
LDH (.P1),A
|
|
LDH A,(.P1)
|
|
LDH A,(.P1)
|
|
LDH A,(.P1)
|
|
LDH A,(.P1)
|
|
LDH A,(.P1)
|
|
LDH A,(.P1)
|
|
LD A,#0x30
|
|
LDH (.P1),A
|
|
LDH A,(.P1)
|
|
AND #0x03
|
|
CP #0x03
|
|
JR NZ,.sgb_mode
|
|
|
|
.dmg_mode:
|
|
; LD HL,#.MLT_REQ_1
|
|
; CALL .sgb_transfer
|
|
; CALL .wait4
|
|
XOR A
|
|
RET
|
|
|
|
.sgb_mode:
|
|
LD HL,#.MLT_REQ_1
|
|
CALL .sgb_transfer
|
|
CALL .wait4
|
|
LD A,#0xFF
|
|
RET
|
|
|
|
.sgb_transfer::
|
|
LD A,(HL) ; Top of command data
|
|
AND #0x03
|
|
RET Z
|
|
LD B,A ; Number of translated packet
|
|
LD C,#0x00 ; Lower part of #FF00
|
|
1$:
|
|
PUSH BC
|
|
XOR A ; Start to write
|
|
LDH (C),A
|
|
LD A,#0x30
|
|
LDH (C),A
|
|
LD B,#0x10 ; Set counter to transfer 16 byte
|
|
2$: LD E,#0x08 ; Set counter to transfer 8 bit
|
|
LD A,(HL+)
|
|
LD D,A
|
|
|
|
3$:
|
|
BIT 0,D
|
|
LD A,#0x10 ; P14 = high, P15 = low (output "1")
|
|
JR NZ,4$
|
|
LD A,#0x20 ; P14 = low, P15 = high (output "0")
|
|
4$:
|
|
LDH (C),A
|
|
LD A,#0x30 ; P14 = high, P15 = high
|
|
LDH (C),A
|
|
RR D ; Shift 1 bit to right
|
|
DEC E
|
|
JR NZ,3$
|
|
|
|
DEC B
|
|
JR NZ,2$
|
|
LD A,#0x20 ; 129th bit "0" output
|
|
LDH (C),A
|
|
LD A,#0x30
|
|
LDH (C),A
|
|
|
|
POP BC
|
|
DEC B
|
|
RET Z
|
|
CALL .wait4 ; Software wait for about 4 frames
|
|
JR 1$
|
|
|
|
.wait4:
|
|
LD DE,#7000
|
|
1$:
|
|
NOP ; 1 +
|
|
NOP ; 1 +
|
|
NOP ; 1 +
|
|
DEC DE ; 2 +
|
|
LD A,D ; 1 +
|
|
OR E ; 1 +
|
|
JR NZ,1$ ; 3 = 10 cycles
|
|
RET
|
|
|
|
.MLT_REQ_1:
|
|
.byte .MLT_REQ*8|1,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
|
.byte 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
|
.MLT_REQ_2:
|
|
.byte .MLT_REQ*8|1,0x01,0x00,0x00,0x00,0x00,0x00,0x00
|
|
.byte 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|