apple1-videocard-lib/demos/iec/macros_16.lm

272 lines
4.0 KiB
Plaintext

; ======================================================
; Macros for 16 bit operations
; The suffix "16" is added to common opcodes, eg "add16"
; Only the A register is used (except ld16 (indirect))
; ======================================================
; Summary
; add16, adc16
; sub16, sbc16
; inc16, dec16
; ld16
; cmp16
; shr16, shl16
; push16, pop16
macro add16 mem, const
lda {1}
clc
adc #(({2}) MOD 256)
sta {1}
lda {1}+1
#if {2} < 256
if carry then inc {1}+1
#else
adc #(({2})/256)
sta {1}+1
#endif
end macro
macro add16 mem, mem
lda {1}
clc
adc {2}
sta {1}
lda {1}+1
adc {2}+1
sta {1}+1
end macro
macro add16 mem, const, "1"
lda {1}
sec
adc #(({2}) MOD 256)
sta {1}
lda {1}+1
adc #({2}/256)
sta {1}+1
end macro
macro add16 mem, mem, "1"
lda {1}
sec
adc {2}
sta {1}
lda {1}+1
adc {2}+1
sta {1}+1
end macro
macro adc16 mem, const
lda {1}
adc #(({2}) MOD 256)
sta {1}
lda {1}+1
#if {2} < 256
bcc .local_out
inc {1}+1
#else
adc #(({2})/256)
sta {1}+1
#endif
.local_out:
end macro
macro adc16 mem, mem
lda {1}
adc {2}
sta {1}
lda {1}+1
adc {2}+1
sta {1}+1
end macro
macro sub16 mem, const
lda {1}
sec
sbc #(({2}) MOD 256)
sta {1}
lda {1}+1
sbc #(({2})/256)
sta {1}+1
end macro
macro sub16 mem, mem
lda {1}
sec
sbc {2}
sta {1}
lda {1}+1
sbc {2}+1
sta {1}+1
end macro
macro sub16 mem, const, "1"
lda {1}
clc
sbc #(({2}) MOD 256)
sta {1}
lda {1}+1
sbc #(({2})/256)
sta {1}+1
end macro
macro sub16 mem, mem, "1"
lda {1}
clc
sbc {2}
sta {1}
lda {1}+1
sbc {2}+1
sta {1}+1
end macro
macro sbc16 mem, const
lda {1}
sbc #(({2}) MOD 256)
sta {1}
lda {1}+1
sbc #(({2})/256)
sta {1}+1
end macro
macro sbc16 mem, mem
lda {1}
sbc {2}
sta {1}
lda {1}+1
sbc {2}+1
sta {1}+1
end macro
macro inc16 mem
inc {1}
if zero then inc {1}+1
end macro
macro dec16 mem
dec {1}
if negative then dec {1}+1
end macro
macro ld16 "ay", const
lda #(({2}) MOD 256)
ldy #(({2})/256)
end macro
macro ld16 "ay", mem
lda {2}
ldy {2}+1
end macro
macro ld16 "ax", const
lda #(({2}) MOD 256)
ldx #(({2})/256)
end macro
macro ld16 "ax", mem
lda {2}
ldx {2}+1
end macro
macro ld16 mem, "ay"
sta {1}
sty {1}+1
end macro
macro ld16 mem, "ax"
sta {1}
stx {1}+1
end macro
macro ld16 mem, const
lda #(({2}) MOD 256)
sta {1}
#if (({2}) MOD 256) != (({2})/256)
lda #(({2})/256)
#endif
sta {1}+1
end macro
macro ld16 mem, mem
lda {2}
sta {1}
lda {2}+1
sta {1}+1
end macro
macro ld16 indirect, mem
ldy #0
lda {2}
sta ({1}),y
lda {2}+1
iny
sta ({1}),y
end macro
macro ld16 indirect, const
ldy #0
lda #({2} MOD 256)
sta ({1}),y
lda #({2}/256)
iny
sta ({1}),y
end macro
macro cmp16 mem, const
lda {1}+1
cmp #(({2})/256)
if zero then
lda {1}
cmp #(({2}) MOD 256)
end if
end macro
macro cmp16 mem, mem
lda {1}+1
cmp {2}+1
if zero then
lda {1}
cmp {2}
end if
end macro
macro shl16 mem
asl {1}
rol {1}+1
end macro
macro shr16 mem
lsr {1}
ror {1}+1
end macro
macro push16 mem
lda {1}
pha
lda {1}+1
pha
end macro
macro push16 const
lda #(({1}) MOD 256)
pha
lda #(({1})/256)
pha
end macro
macro pop16 mem
pla
sta {1}+1
pla
sta {1}
end macro
macro mul16 mem, const
ECHO "to be implemented"
end macro
macro mul16 mem, mem
ECHO "to be implemented"
end macro