avra: a little code deduplication
This commit is contained in:
parent
e9c692ed50
commit
52359a4e42
@ -134,23 +134,23 @@ instrNames:
|
|||||||
; In the same order as in instrNames
|
; In the same order as in instrNames
|
||||||
instrTbl:
|
instrTbl:
|
||||||
; Rd(5) + Rd(5) (0x02) and Rd(5) + bit (0x05) (same processing)
|
; Rd(5) + Rd(5) (0x02) and Rd(5) + bit (0x05) (same processing)
|
||||||
.db 0x02, 0b00011100, 0x00 ; ADC
|
.db 0x02, 0b00011100, 0x00 ; ADC Rd, Rr
|
||||||
.db 0x02, 0b00001100, 0x00 ; ADD
|
.db 0x02, 0b00001100, 0x00 ; ADD Rd, Rr
|
||||||
.db 0x02, 0b00100000, 0x00 ; AND
|
.db 0x02, 0b00100000, 0x00 ; AND Rd, Rr
|
||||||
.db 0x05, 0b11111000, 0x00 ; BLD
|
.db 0x05, 0b11111000, 0x00 ; BLD Rd, b
|
||||||
.db 0x05, 0b11111010, 0x00 ; BST
|
.db 0x05, 0b11111010, 0x00 ; BST Rd, b
|
||||||
.db 0x41, 0b00100100, 0x00 ; CLR (Rr copies Rd)
|
.db 0x41, 0b00100100, 0x00 ; CLR Rd (Bit 6)
|
||||||
.db 0x02, 0b00010100, 0x00 ; CP
|
.db 0x02, 0b00010100, 0x00 ; CP Rd, Rr
|
||||||
.db 0x02, 0b00000100, 0x00 ; CPC
|
.db 0x02, 0b00000100, 0x00 ; CPC Rd, Rr
|
||||||
.db 0x02, 0b00010000, 0x00 ; CPSE
|
.db 0x02, 0b00010000, 0x00 ; CPSE Rd, Rr
|
||||||
.db 0x02, 0b00100100, 0x00 ; EOR
|
.db 0x02, 0b00100100, 0x00 ; EOR Rd, Rr
|
||||||
.db 0x02, 0b00101100, 0x00 ; MOV
|
.db 0x02, 0b00101100, 0x00 ; MOV Rd, Rr
|
||||||
.db 0x02, 0b10011100, 0x00 ; MUL
|
.db 0x02, 0b10011100, 0x00 ; MUL Rd, Rr
|
||||||
.db 0x02, 0b00101000, 0x00 ; OR
|
.db 0x02, 0b00101000, 0x00 ; OR Rd, Rr
|
||||||
.db 0x02, 0b00001000, 0x00 ; SBC
|
.db 0x02, 0b00001000, 0x00 ; SBC Rd, Rr
|
||||||
.db 0x05, 0b11111100, 0x00 ; SBRC
|
.db 0x05, 0b11111100, 0x00 ; SBRC Rd, b
|
||||||
.db 0x05, 0b11111110, 0x00 ; SBRS
|
.db 0x05, 0b11111110, 0x00 ; SBRS Rd, b
|
||||||
.db 0x02, 0b00011000, 0x00 ; SUB
|
.db 0x02, 0b00011000, 0x00 ; SUB Rd, Rr
|
||||||
; Rd(4) + K(8): XXXXKKKK ddddKKKK
|
; Rd(4) + K(8): XXXXKKKK ddddKKKK
|
||||||
.db 0x04, 0b01110000, 0x00 ; ANDI
|
.db 0x04, 0b01110000, 0x00 ; ANDI
|
||||||
.db 0x04, 0b00110000, 0x00 ; CPI
|
.db 0x04, 0b00110000, 0x00 ; CPI
|
||||||
@ -164,7 +164,7 @@ instrTbl:
|
|||||||
.db 0x00, 0b11000000, 0x00 ; RJMP
|
.db 0x00, 0b11000000, 0x00 ; RJMP
|
||||||
; IN and OUT
|
; IN and OUT
|
||||||
.db 0x07, 0b10110000, 0x00 ; IN
|
.db 0x07, 0b10110000, 0x00 ; IN
|
||||||
.db 0x87, 0b10111000, 0x00 ; OUT (args reversed)
|
.db 0x87, 0b10111000, 0x00 ; OUT (Bit 7)
|
||||||
; no arg
|
; no arg
|
||||||
.db 0x00, 0b10010101, 0b10011000 ; BREAK
|
.db 0x00, 0b10010101, 0b10011000 ; BREAK
|
||||||
.db 0x00, 0b10010100, 0b10001000 ; CLC
|
.db 0x00, 0b10010100, 0b10001000 ; CLC
|
||||||
@ -304,43 +304,20 @@ parseInstruction:
|
|||||||
cp I_ASR
|
cp I_ASR
|
||||||
jp c, .spit ; no arg
|
jp c, .spit ; no arg
|
||||||
; spitRd5
|
; spitRd5
|
||||||
ld a, h
|
|
||||||
call .placeRd
|
call .placeRd
|
||||||
jp .spit
|
jp .spit
|
||||||
.spitRd5Rr5:
|
.spitRd5Rr5:
|
||||||
; This is used for both Rd(5) + Rr(5) and Rd(5) + bit because the same
|
; This is used for both Rd(5) + Rr(5) and Rd(5) + bit because the same
|
||||||
; logic works for both cases.
|
; logic works for both cases.
|
||||||
ld a, h
|
|
||||||
call .placeRd
|
call .placeRd
|
||||||
ld a, l
|
call .placeRr
|
||||||
; let's start with the 4 lower bits
|
jr .spit
|
||||||
and 0xf
|
|
||||||
or c
|
|
||||||
; We now have our LSB in A. Let's spit it now.
|
|
||||||
call ioPutB
|
|
||||||
ld a, l
|
|
||||||
; and now that last high bit, currently bit 4, which must become bit 1
|
|
||||||
and 0b00010000
|
|
||||||
rra \ rra \ rra
|
|
||||||
or b
|
|
||||||
ld b, a
|
|
||||||
jp .spitMSB
|
|
||||||
|
|
||||||
.spitRdK8:
|
.spitRdK8:
|
||||||
ld a, h ; Rd
|
|
||||||
call .placeRd
|
call .placeRd
|
||||||
ld a, l ; K
|
call .placeRr
|
||||||
; let's start with the 4 lower bits
|
rr b ; K(8) start at B's 1st bit, not 2nd
|
||||||
and 0xf
|
jr .spit
|
||||||
or c
|
|
||||||
; We now have our LSB in A. Let's spit it now.
|
|
||||||
call ioPutB
|
|
||||||
ld a, l
|
|
||||||
; and now those high 4 bits
|
|
||||||
and 0xf0
|
|
||||||
rra \ rra \ rra \ rra
|
|
||||||
ld b, a
|
|
||||||
jp .spitMSB
|
|
||||||
|
|
||||||
.spitK12:
|
.spitK12:
|
||||||
; Let's deal with the upcode constant before we destroy IX below
|
; Let's deal with the upcode constant before we destroy IX below
|
||||||
@ -373,7 +350,6 @@ parseInstruction:
|
|||||||
|
|
||||||
.spitINOUT:
|
.spitINOUT:
|
||||||
; Rd in H, A in L
|
; Rd in H, A in L
|
||||||
ld a, h
|
|
||||||
call .placeRd
|
call .placeRd
|
||||||
ld a, l
|
ld a, l
|
||||||
and 0xf
|
and 0xf
|
||||||
@ -453,12 +429,29 @@ parseInstruction:
|
|||||||
jr .spitBR2
|
jr .spitBR2
|
||||||
|
|
||||||
; local routines
|
; local routines
|
||||||
; place number in A in BC at position .......d dddd....
|
; place number in H in BC at position .......d dddd....
|
||||||
; BC is assumed to be 0
|
; BC is assumed to be 0
|
||||||
.placeRd:
|
.placeRd:
|
||||||
sla a \ rla \ rla \ rla ; last RLA might set carry
|
sla h \ rl h \ rl h \ rl h ; last RL H might set carry
|
||||||
rl b
|
rl b
|
||||||
|
ld c, h
|
||||||
|
ret
|
||||||
|
|
||||||
|
; place number in L in BC at position ...rrrr. ....rrrr
|
||||||
|
; BC is assumed to be either 0 or to be set by .placeRd, that is, that the
|
||||||
|
; high 4 bits of C and lowest bit of B will be preserved.
|
||||||
|
.placeRr:
|
||||||
|
; let's start with the 4 lower bits
|
||||||
|
ld a, l
|
||||||
|
and 0x0f
|
||||||
|
or c
|
||||||
ld c, a
|
ld c, a
|
||||||
|
ld a, l
|
||||||
|
; and now those high 4 bits which go in B.
|
||||||
|
and 0xf0
|
||||||
|
rra \ rra \ rra
|
||||||
|
or b
|
||||||
|
ld b, a
|
||||||
ret
|
ret
|
||||||
|
|
||||||
.swapHL:
|
.swapHL:
|
||||||
|
Loading…
Reference in New Issue
Block a user