Код:
; initial data:
dup cnt,dat ;dup
; Display:
.print str ;print string
prhex str,val ;message, 16-bit val in hex
prhex2 str,val1,val2 ;message, 2*16-bit val in hex
#
clrc MACRO ;;clear CF
scf
ccf
ENDM
pushr MACRO str ;;push registers
IFNB <str>
IRP src,<str>
push src
ENDM
ENDIF
ENDM
popr MACRO str ;;pop registers
IFNB <str>
IRP dst,<str>
pop dst
ENDM
ENDIF
ENDM
; output to port:
; used: A
outa MACRO dat ;;output to (c)
LOCAL rd
rd defl -0
IFB <dat>
out (c),a
ELSE
IRP rr,<a,b,c,d,e,h,l>
IFIDN <dat>,<rr>
rd defl -1
ENDIF
ENDM
IF rd
out (c),dat
ELSE ;;rd
IFIDN <dat>,<0>
xor a
ELSE
ld a,dat
ENDIF ;;IDN
out (c),a
ENDIF ;;rd
ENDIF ;;B
ENDM
; output to (b)
; used: B,A
outb MACRO dst,dat
IFNB <dst>
ld b,high dst
ENDIF
outa <dat>
ENDM
; output to (c)
; used: C,A
outc MACRO dst,dat
IFNB <dst>
ld c,low dst
ENDIF
outa <dat>
ENDM
; output to (bc)
; used: BC,A
outbc MACRO dst,dat
IFNB <dst>
ld bc,dst
ENDIF
outa <dat>
ENDM
; output to (port)
; used: A
outp MACRO port,dat
IFNB <dat>
IFIDN <dat>,<0>
xor a
ELSE
ld a,dat
ENDIF
ENDIF
out (port),a
ENDM
; input to A [moved to rr] from (port)
inp MACRO rr,port
ld a,high port
in a,(low port)
IFNB <rr>
IFDIF <rr>,<a>
ld rr,a
ENDIF
ENDIF
ENDM
; input to A [moved to rr] fm (b)
inpb MACRO rr,port
IFNB <port>
ld b,high port
ENDIF
in a,(c)
IFNB <rr>
IFDIF <rr>,<a>
ld rr,a
ENDIF
ENDIF
ENDM
; input to A [moved to rr] fm (c)
inpc MACRO rr,port
IFNB <port>
ld c,low port
ENDIF
in a,(c)
IFNB <rr>
IFDIF <rr>,<a>
ld rr,a
ENDIF
ENDIF
ENDM
; input to A [moved to rr] fm (bc)
inpbc MACRO rr,port
IFNB <port>
ld bc,port
ENDIF
in a,(c)
IFNB <rr>
IFDIF <rr>,<a>
ld rr,a
ENDIF
ENDIF
ENDM
; Префиксы для операций над
; половинками индексных регистров
; XPref
; mov c,l ;ld c,xl
xpref MACRO
db 0ddh
ENDM
ypref MACRO
db 0fdh
ENDM
; copy byte to dst from src - undoc
ld8 MACRO dst,src
IFIDN <src>,<xl> ;;ld8 r,xl
xpref
ld dst,l
ENDIF
IFIDN <src>,<xh> ;;ld8 r,xh
xpref
ld dst,h
ENDIF
IFIDN <src>,<yl> ;;ld8 r,yl
ypref
ld dst,l
ENDIF
IFIDN <src>,<yh> ;;ld8 r,yh
ypref
ld dst,h
ENDIF
IFIDN <dst>,<xl> ;;ld8 xl,r
xpref
ld l,src
ENDIF
IFIDN <dst>,<xh> ;;ld8 xh,r
xpref
ld h,src
ENDIF
IFIDN <dst>,<yl> ;;ld8 yl,r
ypref
ld l,src
ENDIF
IFIDN <dst>,<yh> ;;ld8 yh,r
ypref
ld h,src
ENDIF
ENDM
; move byte by acc
lda MACRO dst,src
IFIDN <src>,<0>
xor a
ELSE
ld a,src
ENDIF
ld dst,a
ENDM
; compare op1 with op2
cpa MACRO op1,op2
IFDIF <op1>,<a>
ld a,op1
ENDIF
cp op2
ENDM
; test on zero
tst MACRO rr
IFDIF <rr>,<a>
ld a,rr
ENDIF
or a
ENDM
; test, brunch if zero
tstz MACRO rr,adr
tst rr
jr z,adr
ENDM
; test, brunch if not zero
tstnz MACRO rr,adr
tst rr
jr nz,adr
ENDM
; while, increment
; used: AF
wi MACRO rr
local lab
ld a,rr
or a
jr z,lab
inc a
ld rr,a
lab:
ENDM
; while, decrement
; used: AF
wd MACRO rr
local lab
ld a,rr
or a
jr z,lab
dec a
ld rr,a
lab:
ENDM
; increment, brunch if not zero
ibnz MACRO rr,adr
inc rr
jr nz,adr
ENDM
; decrement, brunch if not zero
dbnz MACRO rr,adr
IFIDN <rr>,<b>
djnz adr
ELSE
dec rr
jr nz,adr
ENDIF
ENDM
;increment, brunch if zero
ibz MACRO dst,adr
inc dst
jr z,adr
ENDM
;decrement, brunch if zero
dbz MACRO dst,adr
dec dst
jr z,adr
ENDM
; increment, jump if not zero
ijnz MACRO rr,adr
inc rr
jp nz,adr
ENDM
; decrement, jump if not zero
djnz. MACRO rr,adr
dec rr
jp nz,adr
ENDM
;increment, jump if zero
ijz MACRO dst,adr
inc dst
jp z,adr
ENDM
;decrement, jump if zero
djz MACRO dst,adr
dec dst
jp z,adr
ENDM
; compare, brunch if equal
; used: AF
cbe MACRO arg1,arg2,adr
IFDIF <arg1>,<a>
ld a,arg1
ENDIF
IFIDN <arg2>,<0>
or a
ELSE
cp arg2
ENDIF
jr z,adr
ENDM
; compare, brunch if not equal
; used: AF
cbne MACRO arg1,arg2,adr
IFDIF <arg1>,<a>
ld a,arg1
ENDIF
IFIDN <arg2>,<0>
or a
ELSE
cp arg2
ENDIF
jr nz,adr
ENDM
; compare, brunch if arg1 above arg2
; used: AF
cba MACRO arg1,arg2,adr
IFDIF <arg2>,<a>
ld a,arg2
ENDIF
cp arg1
jr c,adr
ENDM
; compare, brunch if arg1 above or equal arg2
; used: AF
cbae MACRO arg1,arg2,adr
IFDIF <arg1>,<a>
ld a,arg1
ENDIF
cp arg2
jr nc,adr
ENDM
; compare, brunch if arg1 below arg2
; used: AF
cbb MACRO arg1,arg2,adr
IFDIF <arg1>,<a>
ld a,arg1
ENDIF
cp arg2
jr c,adr
ENDM
; compare, brunch if arg1 below or equal arg2
; used: AF
cbbe MACRO arg1,arg2,adr
IFDIF <arg2>,<a>
ld a,arg2
ENDIF
cp arg1
jr nc,adr
ENDM
; compare, jump if equal
; used: AF
cje MACRO arg1,arg2,adr
IFDIF <arg1>,<a>
ld a,arg1
ENDIF
IFIDN <arg2>,<0>
or a
ELSE
cp arg2
ENDIF
jp z,adr
ENDM
; compare, jump if not equal
; used: AF
cjne MACRO arg1,arg2,adr
IFDIF <arg1>,<a>
ld a,arg1
ENDIF
IFIDN <arg2>,<0>
or a
ELSE
cp arg2
ENDIF
jp nz,adr
ENDM
; compare, jump if arg1 above arg2
; used: AF
cja MACRO arg1,arg2,adr
IFDIF <arg2>,<a>
ld a,arg2
ENDIF
cp arg1
jp c,adr
ENDM
; compare, jump if arg1 above or equal arg2
; used: AF
cjae MACRO arg1,arg2,adr
IFDIF <arg1>,<a>
ld a,arg1
ENDIF
cp arg2
jp nc,adr
ENDM
; compare, jump if arg1 below arg2
; used: AF
cjb MACRO arg1,arg2,adr
IFDIF <arg1>,<a>
ld a,arg1
ENDIF
cp arg2
jp c,adr
ENDM
; compare, jump if arg1 below or equal arg2
; used: AF
cjbe MACRO arg1,arg2,adr
IFDIF <arg2>,<a>
ld a,arg2
ENDIF
cp arg1
jp nc,adr
ENDM
; compare, call if equal
; used: AF
cce MACRO arg1,arg2,adr
IFDIF <arg1>,<a>
ld a,arg1
ENDIF
IFIDN <arg2>,<0>
or a
ELSE
cp arg2
ENDIF
call z,adr
ENDM
; compare, call if not equal
; used: AF
ccne MACRO arg1,arg2,adr
IFDIF <arg1>,<a>
ld a,arg1
ENDIF
IFIDN <arg2>,<0>
or a
ELSE
cp arg2
ENDIF
call nz,adr
ENDM
; compare, call if arg1 above arg2
; used: AF
cca MACRO arg1,arg2,adr
IFDIF <arg2>,<a>
ld a,arg2
ENDIF
cp arg1
call c,adr
ENDM
; compare, call if arg1 above or equal arg2
; used: AF
ccae MACRO arg1,arg2,adr
IFDIF <arg1>,<a>
ld a,arg1
ENDIF
cp arg2
call nc,adr
ENDM
; compare, call if arg1 below arg2
; used: AF
ccb MACRO arg1,arg2,adr
IFDIF <arg1>,<a>
ld a,arg1
ENDIF
cp arg2
call c,adr
ENDM
; compare, call if arg1 below or equal arg2
; used: AF
ccbe MACRO arg1,arg2,adr
IFDIF <arg2>,<a>
ld a,arg2
ENDIF
cp arg1
call nc,adr
ENDM
; compare, return if equal
; used: AF
cre MACRO arg1,arg2,cmd
IFDIF <arg1>,<a>
ld a,arg1
ENDIF
IFIDN <arg2>,<0>
or a
ELSE
cp arg2
ENDIF
IFNB <cmd>
cmd
ENDIF
ret z
ENDM
; compare, return if not equal
; used: AF
crne MACRO arg1,arg2,cmd
IFDIF <arg1>,<a>
ld a,arg1
ENDIF
IFIDN <arg2>,<0>
or a
ELSE
cp arg2
ENDIF
IFNB <cmd>
cmd
ENDIF
ret nz
ENDM
; compare, return if arg1 above arg2
; used: AF
cra MACRO arg1,arg2
IFDIF <arg2>,<a>
ld a,arg2
ENDIF
cp arg1
ret c
ENDM
; compare, return if arg1 above or equal arg2
; used: AF
crae MACRO arg1,arg2,cmd
IFDIF <arg1>,<a>
ld a,arg1
ENDIF
cp arg2
IFNB <cmd>
cmd
ENDIF
ret nc
ENDM
; compare, return if arg1 below arg2
; used: AF
crb MACRO arg1,arg2,cmd
IFDIF <arg1>,<a>
ld a,arg1
ENDIF
cp arg2
IFNB <cmd>
cmd
ENDIF
ret c
ENDM
; compare, return if arg1 below or equal arg2
; used: AF
crbe MACRO arg1,arg2
IFDIF <arg2>,<a>
ld a,arg2
ENDIF
cp arg1
ret nc
ENDM
;-----------------------
; index-regs prefixes
XPref MACRO
db 0ddh
ENDM
YPref MACRO
db 0fdh
ENDM
; copy with 8-bit index-reg
LdX MACRO dst,src
XPref
ld dst,src
ENDM
LdY MACRO dst,src
YPref
ld dst,src
ENDM
orx MACRO ir
XPref
or ir
ENDM
ory MACRO ir
YPref
or ir
ENDM
; 16-bit load by hl
ld16 MACRO dst,rp,src
ld rp,src
ld dst,rp
ENDM
; store 16-bit val/rp to memory by ptr
; HL = HL+1
st16 MACRO ptr,rp
IFIDN <rp>,<bc>
ld (ptr),c
inc ptr
ld (ptr),b
EXITM
ENDIF
IFIDN <rp>,<de>
ld (ptr),e
inc ptr
ld (ptr),d
EXITM
ENDIF
IFIDN <rp>,<hl>
ld (ptr),l
inc ptr
ld (ptr),h
EXITM
ENDIF
IFIDN <rp>,<ix>
ldx a,l
ld (ptr),a
inc ptr
ldx a,h
ld (ptr),a
EXITM
ENDIF
IFIDN <rp>,<iy>
ldy a,l
ld (ptr),a
inc ptr
ldy a,h
ld (ptr),a
EXITM
ENDIF
ld (ptr),low rp
inc ptr
ld (ptr),high rp
ENDM
; test bc/de/hl/ix/iy
; used: AF
tst16 MACRO rp
IFIDN <rp>,<bc>
ld a,b
or c
ENDIF
IFIDN <rp>,<de>
ld a,d
or e
ENDIF
IFIDN <rp>,<hl>
ld a,h
or l
ENDIF
IFIDN <rp>,<ix>
ldx a,h
orx l
ENDIF
IFIDN <rp>,<iy>
ldy a,h
ory l
ENDIF
ENDM
; test rp, brunch if zero
tst16z MACRO rp,adr
tst16 rp
jr z,adr
ENDM
; test rp, brunch if not zero
tst16nz MACRO rp,adr
tst16 rp
jr nz,adr
ENDM
; while, increment rp
; used: AF
wi16 MACRO rp
local lab
tst16z rp,lab
inc rp
lab: ENDM
; while, decrement rp
; used: AF
wd16 MACRO rp
local lab
tst16z rp,lab
dec rp
lab: ENDM
; increment, branch if not zero
ibnz16 MACRO rp,adr
inc rp
tst16nz rp,adr
ENDM
; decrement, branch if not zero
dbnz16 MACRO rp,adr
dec rp
tst16nz rp,adr
ENDM
; increment, jump if not zero
ijnz16 MACRO rp,adr
inc rp
tst16 rp
jp nz,adr
ENDM
; decrement, jump if not zero
djnz16 MACRO rp,adr
dec rp
tst16 rp
jp nz,adr
ENDM
; Negative RP
; used: AF
neg16 MACRO rp
IFIDN <rp>,<bc>
ld a,b
cpl
ld b,a
ld a,c
cpl
ld c,a
ENDIF
IFIDN <rp>,<de>
ld a,d
cpl
ld d,a
ld a,e
cpl
ld e,a
ENDIF
IFIDN <rp>,<hl>
ld a,h
cpl
ld h,a
ld a,l
cpl
ld l,a
ENDIF
IFIDN <rp>,<ix>
ldx a,h
cpl
ldx h,a
ldx a,l
cpl
ldx l,a
ENDIF
IFIDN <rp>,<iy>
ldy a,h
cpl
ldy h,a
ldy a,l
cpl
ldy l,a
ENDIF
inc rp
ENDM
; load 16 bit rp to rp
ldbc MACRO rp
IFIDN <rp>,<bc>
ENDIF
IFIDN <rp>,<de>
ld b,d
ld c,e
ENDIF
IFIDN <rp>,<hl>
ld b,h
ld c,l
ENDIF
IFIDN <rp>,<ix>
push ix
pop bc
ENDIF
IFIDN <rp>,<iy>
push iy
pop bc
ENDIF
ENDM
ldde MACRO rp
IFIDN <rp>,<bc>
ld d,b
ld e,c
ENDIF
IFIDN <rp>,<de>
ENDIF
IFIDN <rp>,<hl>
ld d,h
ld e,l
ENDIF
IFIDN <rp>,<ix>
push ix
pop de
ENDIF
IFIDN <rp>,<iy>
push iy
pop de
ENDIF
ENDM
ldhl MACRO rp
IFIDN <rp>,<bc>
ld h,b
ld l,c
ENDIF
IFIDN <rp>,<de>
ld h,d
ld l,e
ENDIF
IFIDN <rp>,<hl>
ENDIF
IFIDN <rp>,<ix>
push ix
pop hl
ENDIF
IFIDN <rp>,<iy>
push iy
pop hl
ENDIF
ENDM
; Copy to index regs by stack
ldix MACRO rp
push rp
pop ix
ENDM
ldiy MACRO rp
push rp
pop iy
ENDM
; Add rp and acc
add16a MACRO rp
IFIDN <rp>,<bc>
add a,c
ld c,a
ld a,b
adc a,0
ld b,a
ENDIF
IFIDN <rp>,<de>
add a,e
ld e,a
ld a,d
adc a,0
ld d,a
ENDIF
IFIDN <rp>,<hl>
add a,l
ld l,a
ld a,h
adc a,0
ld h,a
ENDIF
IFIDN <rp>,<ix>
xpref
add a,l
ld l,a
xpref
ld a,h
adc a,0
xpref
ld h,a
ENDIF
IFIDN <rp>,<iy>
ypref
add a,l
ld l,a
ypref
ld a,h
adc a,0
ypref
ld h,a
ENDIF
ENDM
; add
add16 MACRO dst,rp,src
IFNB <src>
ld rp,src
ENDIF
add dst,rp
ENDM
; sbc
sbc16 MACRO dst,rp,src
IFNB <src>
ld rp,src
ENDIF
sbc dst,rp
ENDM
; move block:
move MACRO src,dst,len
IFNB <src>
ld hl,src
ENDIF
IFNB <dst>
ld de,dst
ENDIF
IFNB <len>
ld bc,len
ENDIF
ldir
ENDM
; fill block:
fill MACRO beg,len,dat
IFNB <src>
ld hl,beg
ld de,beg+1
ENDIF
IFNB <len>
ld bc,len-1
ENDIF
ld (hl),dat
ldir
ENDM
; BCD arithmetic
; dst <- dst + src
AddBCD MACRO dst,src
ld a,dst
add a,src
daa
ld dst,a
ENDM
; addition with CF
AdcBCD MACRO dst,src
ld a,dst
adc a,src
daa
ld dst,a
ENDM
; dst <- dst - src
SubBCD MACRO dst,src
ld a,dst
sub src
daa
ld dst,a
ENDM
; Subtracrion with CF
SbcBCD MACRO dst,src
ld a,dst
sbc a,src
daa
ld dst,a
ENDM
; increment packing BCD val
IncBCD MACRO reg
ld a,reg
add a,1
daa
ld reg,a
ENDM
; decrement packing BCD val
DecBCD MACRO reg
ld a,reg
sub 1
daa
ld reg,a
ENDM
;-----------------------
; Z80 undoc
inf MACRO ;;in f,(c) SF<-d7, ZF<-d6
db 0edh,70h
ENDM
outc0 MACRO ;;out (c),0
db 0edh,71h
ENDM
neg0 MACRO
db 0edh,4ch ;;44
ENDM
neg1 MACRO
db 0edh,54h
ENDM
neg2 MACRO
db 0edh,5ch
ENDM
neg3 MACRO
db 0edh,64h
ENDM
neg4 MACRO
db 0edh,6ch
ENDM
neg5 MACRO
db 0edh,74h
ENDM
neg6 MACRO
db 0edh,7ch
ENDM
im00 MACRO
db 0edh,4eh ;;46
ENDM
im01 MACRO
db 0edh,66h
ENDM
im02 MACRO
db 0edh,6eh
ENDM
im10 MACRO
db 0edh,76h ;;56
ENDM
im20 MACRO
db 0edh,7eh ;;5e
ENDM
retn0 MACRO
db 0edh,55h ;;45
ENDM
retn1 MACRO
db 0edh,5dh
ENDM
retn2 MACRO
db 0edh,65h
ENDM
retn3 MACRO
db 0edh,6dh
ENDM
retn4 MACRO
db 0edh,75h
ENDM
retn5 MACRO
db 0edh,7dh
ENDM
sli_b MACRO ;;shift left and increment
db 0cbh,30h
ENDM
sli_c MACRO
db 0cbh,31h
ENDM
sli_d MACRO
db 0cbh,32h
ENDM
sli_e MACRO
db 0cbh,33h
ENDM
sli_h MACRO
db 0cbh,34h
ENDM
sli_l MACRO
db 0cbh,35h
ENDM
sli_m MACRO
db 0cbh,36h
ENDM
sli_a MACRO
db 0cbh,37h
ENDM
; JP PE emulation
jpe MACRO addr
db 0eah
dw addr
ENDM
;-----------------------
; Пересылка с участием половинки IX
ldx MACRO dst,src
XPref
ld dst,src
ENDM
; Пересылка с участием половинки IY
ldy MACRO dst,src
YPref
ld dst,src
ENDM
; Копирование IX в DE
ix2de MACRO
ldX e,l
ldX d,h
ENDM
; Копирование DE в IX
de2ix MACRO
ldX l,e
ldX h,d
ENDM
; Копирование IY в DE
iy2de MACRO
LdY e,l
LdY d,h
ENDM
; Копирование DE в IY
de2iy MACRO
ldY l,e
ldY h,d
ENDM
;-----------------------
; dup analogue (db/ds)
dup MACRO cnt,dat
REPT cnt
IFB <dat>
db 0
ELSE
db dat
ENDIF
ENDM
ENDM
;-----------------------
; Display current switches setting
.print MACRO str
IF1
.printx str
ENDIF
ENDM
; Display 16-bit value in hex
@pr MACRO str,val
.printx str val
ENDM
prhex MACRO str,val
IF1
.radix 16
@pr <str>,%val
.radix 10
ENDIF
ENDM
; Display 2 16-bit value in hex
@pr2 MACRO str,val,val1
.printx str val val1
ENDM
prhex2 MACRO str,val,val1
IF1
.radix 16
@pr2 <str>,%val,%val1
.radix 10
ENDIF
ENDM