zasm: add support for RES and SET

This commit is contained in:
Virgil Dupras 2019-07-02 14:12:29 -04:00
parent dd84c11905
commit 54b0602710
2 changed files with 81 additions and 34 deletions

View File

@ -1,8 +1,8 @@
; *** Consts ***
; Number of rows in the argspec table
.equ ARGSPEC_TBL_CNT 31
.equ ARGSPEC_TBL_CNT 33
; Number of rows in the primary instructions table
.equ INSTR_TBL_CNT 154
.equ INSTR_TBL_CNT 162
; size in bytes of each row in the primary instructions table
.equ INSTR_TBL_ROWSIZE 6
; Instruction IDs They correspond to the index of the table in instrNames
@ -48,23 +48,25 @@
.equ I_OUT 0x27
.equ I_POP 0x28
.equ I_PUSH 0x29
.equ I_RET 0x2a
.equ I_RETI 0x2b
.equ I_RETN 0x2c
.equ I_RL 0x2d
.equ I_RLA 0x2e
.equ I_RLC 0x2f
.equ I_RLCA 0x30
.equ I_RR 0x31
.equ I_RRA 0x32
.equ I_RRC 0x33
.equ I_RRCA 0x34
.equ I_SBC 0x35
.equ I_SCF 0x36
.equ I_SLA 0x37
.equ I_SRL 0x38
.equ I_SUB 0x39
.equ I_XOR 0x3a
.equ I_RES 0x2a
.equ I_RET 0x2b
.equ I_RETI 0x2c
.equ I_RETN 0x2d
.equ I_RL 0x2e
.equ I_RLA 0x2f
.equ I_RLC 0x30
.equ I_RLCA 0x31
.equ I_RR 0x32
.equ I_RRA 0x33
.equ I_RRC 0x34
.equ I_RRCA 0x35
.equ I_SBC 0x36
.equ I_SCF 0x37
.equ I_SET 0x38
.equ I_SLA 0x39
.equ I_SRL 0x3a
.equ I_SUB 0x3b
.equ I_XOR 0x3c
; Checks whether A is 'N' or 'M'
checkNOrM:
@ -412,28 +414,54 @@ handleBIT:
ret
.error:
ld c, 0
call unsetZ
ret
jp unsetZ
handleBITHL:
ld b, 0b01000110
jr _handleBITHL
handleSETHL:
ld b, 0b11000110
jr _handleBITHL
handleRESHL:
ld b, 0b10000110
_handleBITHL:
call handleBIT
ret nz ; error
ld a, 0xcb ; first upcode
ld (instrUpcode), a
ld a, (curArg1+1) ; 0-7
ld b, 3 ; displacement
call rlaX
or 0b01000110 ; 2nd upcode
rla
rla
rla
or b ; 2nd upcode
ld (instrUpcode+1), a
ld c, 2
ret
handleBITIX:
ld a, 0xdd
jr handleBITIXY
ld b, 0b01000110
jr _handleBITIXY
handleBITIY:
ld a, 0xfd
handleBITIXY:
ld b, 0b01000110
jr _handleBITIXY
handleSETIX:
ld a, 0xdd
ld b, 0b11000110
jr _handleBITIXY
handleSETIY:
ld a, 0xfd
ld b, 0b11000110
jr _handleBITIXY
handleRESIX:
ld a, 0xdd
ld b, 0b10000110
jr _handleBITIXY
handleRESIY:
ld a, 0xfd
ld b, 0b10000110
_handleBITIXY:
ld (instrUpcode), a ; first upcode
call handleBIT
ret nz ; error
@ -442,14 +470,23 @@ handleBITIXY:
ld a, (curArg2+1) ; IXY displacement
ld (instrUpcode+2), a
ld a, (curArg1+1) ; 0-7
ld b, 3 ; displacement
call rlaX
or 0b01000110 ; 4th upcode
rla
rla
rla
or b ; 4th upcode
ld (instrUpcode+3), a
ld c, 4
ret
handleBITR:
ld b, 0b01000000
jr _handleBITR
handleSETR:
ld b, 0b11000000
jr _handleBITR
handleRESR:
ld b, 0b10000000
_handleBITR:
call handleBIT
ret nz ; error
; get group value
@ -460,13 +497,13 @@ handleBITR:
ld (instrUpcode), a
; get bit value
ld a, (curArg1+1) ; 0-7
ld b, 3 ; displacement
call rlaX
rla
rla
rla
; Now we have group value in stack, bit value in A (properly shifted)
; and we want to OR them together
or c ; Now we have our ORed value
or 0b01000000 ; and with the constant value for that byte...
; we're good!
or b ; and with our "base" value and we're good!
ld (instrUpcode+1), a
ld c, 2
ret
@ -962,6 +999,7 @@ instrNames:
.db "OUT", 0
.db "POP", 0
.db "PUSH"
.db "RES", 0
.db "RET", 0
.db "RETI"
.db "RETN"
@ -975,6 +1013,7 @@ instrNames:
.db "RRCA"
.db "SBC", 0
.db "SCF", 0
.db "SET", 0
.db "SLA", 0
.db "SRL", 0
.db "SUB", 0
@ -1134,6 +1173,10 @@ instrTBl:
.db I_PUSH,'X', 0, 0, 0xdd, 0xe5 ; PUSH IX
.db I_PUSH,'Y', 0, 0, 0xfd, 0xe5 ; PUSH IY
.db I_PUSH,0x1, 0, 4, 0b11000101 , 0 ; PUSH qq
.db I_RES, 'n', 'l', 0x20 \ .dw handleRESHL ; RES b, (HL)
.db I_RES, 'n', 'x', 0x20 \ .dw handleRESIX ; RES b, (IX+d)
.db I_RES, 'n', 'y', 0x20 \ .dw handleRESIY ; RES b, (IY+d)
.db I_RES, 'n', 0xb, 0x20 \ .dw handleRESR ; RES b, r
.db I_RET, 0, 0, 0, 0xc9 , 0 ; RET
.db I_RET, 0xa, 0, 3, 0b11000000 , 0 ; RET cc
.db I_RETI,0, 0, 0, 0xed, 0x4d ; RETI
@ -1150,6 +1193,10 @@ instrTBl:
.db I_SBC, 'A', 0xb, 0, 0b10011000 , 0 ; SBC A, r
.db I_SBC,'h',0x3,0x44, 0xed, 0b01000010 ; SBC HL, ss
.db I_SCF, 0, 0, 0, 0x37 , 0 ; SCF
.db I_SET, 'n', 'l', 0x20 \ .dw handleSETHL ; SET b, (HL)
.db I_SET, 'n', 'x', 0x20 \ .dw handleSETIX ; SET b, (IX+d)
.db I_SET, 'n', 'y', 0x20 \ .dw handleSETIY ; SET b, (IY+d)
.db I_SET, 'n', 0xb, 0x20 \ .dw handleSETR ; SET b, r
.db I_SLA, 0xb, 0,0x40, 0xcb, 0b00100000 ; SLA r
.db I_SRL, 0xb, 0,0x40, 0xcb, 0b00111000 ; SRL r
.db I_SUB, 'l', 0, 0, 0x96 , 0 ; SUB (HL)

View File

@ -128,7 +128,7 @@ def main():
# we don't test the displacements for IX/IY because there can't be
# any.
args1 = args1[:1]
if n == 'BIT':
if n in {'BIT', 'SET', 'RES'}:
# we only want to keep 1, 2, 4
args1 = args1[:3]
if n == 'IM':