mirror of
https://github.com/hsoft/collapseos.git
synced 2024-11-27 12:18:07 +11:00
avra: add "Rd + bit" instructions
This commit is contained in:
parent
c696fcbce4
commit
a5efc695e9
@ -55,8 +55,13 @@ instrNames:
|
|||||||
.db "SBCI", 0
|
.db "SBCI", 0
|
||||||
.db "SBR", 0
|
.db "SBR", 0
|
||||||
.db "SUBI", 0
|
.db "SUBI", 0
|
||||||
|
.equ I_BLD 38
|
||||||
|
.db "BLD", 0
|
||||||
|
.db "BST", 0
|
||||||
|
.db "SBRC", 0
|
||||||
|
.db "SBRS", 0
|
||||||
; no arg (from here, instrUpMasks2)
|
; no arg (from here, instrUpMasks2)
|
||||||
.equ I_BREAK 38
|
.equ I_BREAK 42
|
||||||
.db "BREAK", 0
|
.db "BREAK", 0
|
||||||
.db "CLC", 0
|
.db "CLC", 0
|
||||||
.db "CLH", 0
|
.db "CLH", 0
|
||||||
@ -84,7 +89,7 @@ instrNames:
|
|||||||
.db "SLEEP", 0
|
.db "SLEEP", 0
|
||||||
.db "WDR", 0
|
.db "WDR", 0
|
||||||
; Rd(5)
|
; Rd(5)
|
||||||
.equ I_ASR 64
|
.equ I_ASR 68
|
||||||
.db "ASR", 0
|
.db "ASR", 0
|
||||||
.db "COM", 0
|
.db "COM", 0
|
||||||
.db "DEC", 0
|
.db "DEC", 0
|
||||||
@ -119,7 +124,7 @@ instrUpMasks1:
|
|||||||
.db 0b00101000 ; OR
|
.db 0b00101000 ; OR
|
||||||
.db 0b00001000 ; SBC
|
.db 0b00001000 ; SBC
|
||||||
.db 0b00011000 ; SUB
|
.db 0b00011000 ; SUB
|
||||||
; Rd(5) + K(8): XXXXKKKK ddddKKKK
|
; Rd(4) + K(8): XXXXKKKK ddddKKKK
|
||||||
.db 0b01110000 ; ANDI
|
.db 0b01110000 ; ANDI
|
||||||
.db 0b00110000 ; CPI
|
.db 0b00110000 ; CPI
|
||||||
.db 0b11100000 ; LDI
|
.db 0b11100000 ; LDI
|
||||||
@ -127,6 +132,12 @@ instrUpMasks1:
|
|||||||
.db 0b01000000 ; SBCI
|
.db 0b01000000 ; SBCI
|
||||||
.db 0b01100000 ; SBR
|
.db 0b01100000 ; SBR
|
||||||
.db 0b01010000 ; SUBI
|
.db 0b01010000 ; SUBI
|
||||||
|
; Rd(5) + bit: XXXXXXXd ddddXbbb: lonely bit in LSB is 0 in all cases, so we
|
||||||
|
; ignore it.
|
||||||
|
.db 0b11111000 ; BLD
|
||||||
|
.db 0b11111010 ; BST
|
||||||
|
.db 0b11111100 ; SBRC
|
||||||
|
.db 0b11111110 ; SBRS
|
||||||
|
|
||||||
; 16-bit constant masks associated with each instruction. In the same order as
|
; 16-bit constant masks associated with each instruction. In the same order as
|
||||||
; in instrNames
|
; in instrNames
|
||||||
@ -231,27 +242,29 @@ getInstID:
|
|||||||
parseInstruction:
|
parseInstruction:
|
||||||
; BC, during .spit, is ORred to the spitted opcode.
|
; BC, during .spit, is ORred to the spitted opcode.
|
||||||
ld bc, 0
|
ld bc, 0
|
||||||
|
; Save Instr ID in D, which is less volatile than A. In almost all
|
||||||
|
; cases, we fetch the opcode constant at the end of the processing.
|
||||||
|
ld d, a
|
||||||
cp I_ADC
|
cp I_ADC
|
||||||
jp c, .BR
|
jp c, .BR
|
||||||
cp I_ANDI
|
cp I_ANDI
|
||||||
jr c, .spitRd5Rr5
|
jr c, .spitRd5Rr5
|
||||||
cp I_BREAK
|
cp I_BLD
|
||||||
jr c, .spitRdK8
|
jr c, .spitRdK8
|
||||||
|
cp I_BREAK
|
||||||
|
jr c, .spitRdBit
|
||||||
cp I_ASR
|
cp I_ASR
|
||||||
jr c, .spitNoArg
|
jr c, .spitNoArg
|
||||||
; spitRd5
|
; spitRd5
|
||||||
ld d, a ; save A for later
|
|
||||||
call .readR5
|
call .readR5
|
||||||
ret nz
|
ret nz
|
||||||
call .placeRd
|
call .placeRd
|
||||||
ld a, d ; restore A
|
|
||||||
; continue to .spitNoArg
|
; continue to .spitNoArg
|
||||||
.spitNoArg:
|
.spitNoArg:
|
||||||
call .getUp2
|
call .getUp2
|
||||||
jr .spit
|
jr .spit
|
||||||
|
|
||||||
.spitRd5Rr5:
|
.spitRd5Rr5:
|
||||||
ld d, a ; save A for later
|
|
||||||
call .readR5
|
call .readR5
|
||||||
ret nz
|
ret nz
|
||||||
call .placeRd
|
call .placeRd
|
||||||
@ -270,13 +283,11 @@ parseInstruction:
|
|||||||
rra \ rra \ rra
|
rra \ rra \ rra
|
||||||
or b
|
or b
|
||||||
ld b, a
|
ld b, a
|
||||||
ld a, d ; restore A
|
|
||||||
call .getUp1
|
call .getUp1
|
||||||
; now that's our MSB
|
; now that's our MSB
|
||||||
jr .spitMSB
|
jr .spitMSB
|
||||||
|
|
||||||
.spitRdK8:
|
.spitRdK8:
|
||||||
ld d, a ; save A for later
|
|
||||||
call .readR4
|
call .readR4
|
||||||
ret nz
|
ret nz
|
||||||
call .placeRd
|
call .placeRd
|
||||||
@ -299,9 +310,20 @@ parseInstruction:
|
|||||||
and 0xf0
|
and 0xf0
|
||||||
rra \ rra \ rra \ rra
|
rra \ rra \ rra \ rra
|
||||||
ld b, a
|
ld b, a
|
||||||
ld a, d ; restore A
|
|
||||||
call .getUp1
|
call .getUp1
|
||||||
; now that's our MSB
|
jr .spitMSB
|
||||||
|
|
||||||
|
.spitRdBit:
|
||||||
|
call .readR5
|
||||||
|
ret nz
|
||||||
|
call .placeRd
|
||||||
|
call readComma
|
||||||
|
ret nz
|
||||||
|
call .readBit
|
||||||
|
ret nz
|
||||||
|
; LSB is in A and is ready to go
|
||||||
|
call ioPutB
|
||||||
|
call .getUp1
|
||||||
jr .spitMSB
|
jr .spitMSB
|
||||||
|
|
||||||
.spit:
|
.spit:
|
||||||
@ -378,13 +400,8 @@ parseInstruction:
|
|||||||
; upcode becomes 0b111101
|
; upcode becomes 0b111101
|
||||||
inc b
|
inc b
|
||||||
.rdBRBS:
|
.rdBRBS:
|
||||||
call readWord
|
call .readBit
|
||||||
ret nz
|
ret nz
|
||||||
call parseExpr
|
|
||||||
ld a, 7
|
|
||||||
call .IX2A
|
|
||||||
ret nz
|
|
||||||
ld c, a
|
|
||||||
call readComma
|
call readComma
|
||||||
ret nz
|
ret nz
|
||||||
jr .spitBR2
|
jr .spitBR2
|
||||||
@ -398,14 +415,16 @@ parseInstruction:
|
|||||||
ld c, a
|
ld c, a
|
||||||
ret
|
ret
|
||||||
|
|
||||||
; Fetch a 8-bit upcode specified by instr index in A and set that upcode in HL
|
; Fetch a 8-bit upcode specified by instr index in D and set that upcode in HL
|
||||||
.getUp1:
|
.getUp1:
|
||||||
|
ld a, d
|
||||||
sub I_ADC
|
sub I_ADC
|
||||||
ld hl, instrUpMasks1
|
ld hl, instrUpMasks1
|
||||||
jp addHL
|
jp addHL
|
||||||
|
|
||||||
; Fetch a 16-bit upcode specified by instr index in A and set that upcode in HL
|
; Fetch a 16-bit upcode specified by instr index in D and set that upcode in HL
|
||||||
.getUp2:
|
.getUp2:
|
||||||
|
ld a, d
|
||||||
sub I_BREAK
|
sub I_BREAK
|
||||||
sla a ; A * 2
|
sla a ; A * 2
|
||||||
ld hl, instrUpMasks2
|
ld hl, instrUpMasks2
|
||||||
@ -434,6 +453,17 @@ parseInstruction:
|
|||||||
ld a, 31
|
ld a, 31
|
||||||
jr .IX2A
|
jr .IX2A
|
||||||
|
|
||||||
|
.readBit:
|
||||||
|
call readWord
|
||||||
|
ret nz
|
||||||
|
call parseExpr
|
||||||
|
ld a, 7
|
||||||
|
call .IX2A
|
||||||
|
ret nz
|
||||||
|
or c
|
||||||
|
ld c, a
|
||||||
|
cp a ; ensure Z
|
||||||
|
ret
|
||||||
|
|
||||||
; Put IX's LSB into A and, additionally, ensure that the new value is <=
|
; Put IX's LSB into A and, additionally, ensure that the new value is <=
|
||||||
; than what was previously in A.
|
; than what was previously in A.
|
||||||
|
@ -8,3 +8,4 @@ asr r20
|
|||||||
bar:
|
bar:
|
||||||
brbs 6, foo
|
brbs 6, foo
|
||||||
ori r22, 0x34+4
|
ori r22, 0x34+4
|
||||||
|
sbrs r1, 3
|
||||||
|
@ -1 +1 @@
|
|||||||
<08><><EFBFBD><EFBFBD><EFBFBD> <09>E<EFBFBD><45><EFBFBD>hc
|
<08><><EFBFBD><EFBFBD><EFBFBD> <09>E<EFBFBD><45><EFBFBD>hc<13>
|
Loading…
Reference in New Issue
Block a user