📄 macro.h
字号:
ifndef _macro_
_macro_ equ 1
//====================================================
//Note: 利用X、Y、Z进行查表的指针确定,基数存于Acc中
//====================================================
inc_xyz_a expand
add z,a
b0bts1 fc
jmp @f
incms y
jmp @f
incms x
nop
@@:
endm
//====================================================
//Note: 利用Y、Z进行查表的指针确定,基数存于Acc中
//====================================================
inc_yz_a expand
add z,a
b0bts1 fc
jmp @f
incms y
nop
@@:
endm
//====================================================
//Note:利用X、Y、Z顺序查表的指针确定
//===================================================
inc_xyz expand
incms z
jmp @f
incms y
jmp @f
incms x
nop
@@:
endm
//====================================================
//Note:利用H、L顺序读取RAM的指针确定
//====================================================
inc_hl expand
incms l
jmp @f
incms h
nop
@@:
endm
//====================================================
//Note:利用Y、Z进行查表的指针确定
//====================================================
inc_yz expand
incms z
jmp @f
incms y
nop
@@:
endm
//====================================================
//Note:进行地址步阶的直接跳跃
//====================================================
jmp_adr expand
b0add pcl,a // pcl = pcl + a
b0bts1 fc
jmp @f
incms pch
nop
@@:
endm
//====================================================
//Note:利用Acc中数据作为地址的跳跃
//====================================================
jmp_aa expand
b0mov pcl,a // pcl = a
endm
//====================================================
//Note: 确定中断的地址
//====================================================
@here_interrupt expand int
temp = $
org irq_m&int
jmp temp
org temp
endm
//=====================================================
//Note:进入中断的压栈保护,需用户自行定义Accbuf等Ram单元
//=====================================================
@push2 expand
b0xch accbuf,a
b0mov a,pflag
b0mov pflagbuf,a
b0mov a,rbank
b0mov rbankbuf,a
b0mov a,l
b0mov lbuf,a
b0mov a,h
b0mov hbuf,a
b0mov a,r
b0mov rbuf,a
b0mov a,x
b0mov xbuf,a
b0mov a,y
b0mov ybuf,a
b0mov a,z
b0mov zbuf,a
endm
//=======================================================
//Note:进入中断的压栈保护,需用户自行定义Accbuf等Ram单元
//=======================================================
@push1 expand
b0xch accbuf,a
b0mov a,pflag
b0mov pflagbuf,a
b0mov a,rbank
b0mov rbankbuf,a
b0mov a,r
b0mov rbuf,a
b0mov a,y
b0mov ybuf,a
b0mov a,z
b0mov zbuf,a
endm
//=======================================================
//Note:进入中断的压栈保护,需用户自行定义Accbuf等Ram单元
//=======================================================
@push0 expand
b0xch accbuf,a
b0mov a,pflag
b0mov pflagbuf,a
b0mov a,rbank
b0mov rbankbuf,a
endm
//=======================================================
//Note:退出中断的出栈恢复,需用户自行定义Accbuf等Ram单元
//=======================================================
@pop2 expand
b0mov a,lbuf
b0mov l,a
b0mov a,hbuf
b0mov h,a
b0mov a,rbuf
b0mov r,a
b0mov a,xbuf
b0mov x,a
b0mov a,ybuf
b0mov y,a
b0mov a,zbuf
b0mov z,a
b0mov a,rbankbuf
b0mov rbank,a
b0mov a,pflagbuf
b0mov pflag,a
b0xch a,accbuf
endm
//====================================================
//Note:退出中断的出栈恢复,需用户自行定义Accbuf等Ram单元
//====================================================
@pop1 expand
b0mov a,rbuf
b0mov r,a
b0mov a,ybuf
b0mov y,a
b0mov a,zbuf
b0mov z,a
b0mov a,rbankbuf
b0mov rbank,a
b0mov a,pflagbuf
b0mov pflag,a
b0xch a,accbuf
endm
//====================================================
//Note:退出中断的出栈恢复,需用户自行定义Accbuf等Ram单元
//====================================================
@pop0 expand
b0mov a,rbankbuf
b0mov rbank,a
b0mov a,pflagbuf
b0mov pflag,a
b0xch a,accbuf
endm
//====================================================
//Note:进入RAM的bank0
//====================================================
bank0 expand
clr rbank
endm
//====================================================
//Note:进入RAM的bank1
//====================================================
bank1 expand
b0mov rbank,#01h
endm
//====================================================
//Note:进入RAM的bank2
//====================================================
bank2 expand
b0mov rbank,#02h
endm
//====================================================
//Note:进入RAM的bank15
//====================================================
bank15 expand
b0mov rbank,#0fh
endm
//====================================================
//Note:进入RAM的bank0,并退出子程序
//====================================================
ret_ban0 expand
bank0
ret
endm
//====================================================
//Note:RAM资料的指针指向确定
//====================================================
point_hl expand val
b0mov h,#val$m
b0mov l,#val$l
endm
//====================================================
//Note:ROM资料的指针指向确定
//====================================================
point_yz expand val
b0mov y,#val$m
b0mov z,#val$l
endm
//====================================================
//Note:ROM资料的指针指向确定
//====================================================
point_xyz expand val
b0mov x,#val$h
b0mov y,#val$m
b0mov z,#val$l
endm
//====================================================
// to check acc in some range, example : #30h - #39h,
// use boundi ram_to_acc, #30h, #39h, over_jmp_addr
// if acc is under the range
// acc = acc - sm
// else
// jmp over_jmp=addr
// Note : 1. acc will be changed, c, dc, z flag will be changed
// 2. the macro is used for "jmp_ar" macro
//Val中的数据介于sm和la之间程序跳到adr处
//====================================================
boundi expand val, sm, la, adr
mov a,val
add a, #(0xff - (la))
b0bts0 fc
jmp_ret <adr>
ifnb <sm>
if (sm) > 0
add a, #((la) - (sm) + 1)
b0bts1 fc
jmp_ret <adr>
endif
endif
mov a,val
sub a,#sm
endm
//====================================================
// to add ram=ram+1 from 00 to ff
// if ram > <la>
// ram = <sm>
//====================================================
lim_inc expand val, sm, la
incms val
jmp $+2
jmp $+4
b0mov a,val
sub a,#((la) + 1 )
jnc $+3
mov a,#sm
b0mov val,a
endm
//====================================================
// to sub ram=ram-1 from <sm> to <la>
// if ram < <sm>
// ram = <la>
//====================================================
lim_dec expand val, sm, la
if sm == 0
b0mov a,val
jnz $+4
mov a,#la
b0mov val,a
jmp $+3
decms val
nop
else
decms val
nop
b0mov a,val
sub a,#( sm - 1 )
jnc $+3
mov a,#la
b0mov val,a
endif
endm
//====================================================
// to add ram=ram+1 from 00 to ff
// if ram > <la>
// ram = <la>
//====================================================
limh_inc expand val, sm, la
incms val
jmp $+2
jmp $+4
b0mov a,val
sub a,#((la) + 1 )
jnc $+3
mov a,#la
b0mov val,a
endm
//====================================================
// to sub ram=ram-1 from <sm> to <la>
// if ram < <sm>
// ram = <sm>
//====================================================
liml_dec expand val, sm, la
if sm == 0
b0mov a,val
jnz $+4
mov a,#sm
b0mov val,a
jmp $+3
decms val
nop
else
decms val
nop
b0mov a,val
sub a,#( sm - 1 )
jnc $+3
mov a,#sm
b0mov val,a
endif
endm
//====================================================
// clr_ramX ;clear ram from #00 to max address(bank0,bank1)
//note: y,z,c may be changed.
//====================================================
clr_ram0 expand adr
clr y // set ram bank0
b0mov z,#(adr) // use indirect addressing index pointer (@yz)
// set pointer = 0x00xx
clr @yz
decms z // z = z -1
jmp $-2 // skip if z = 0
clr @yz
endm
//====================================================
clr_ram1 expand adr
b0mov y,#1 // set ram bank1
b0mov z,#(adr) // use indirect addressing index pointer (@yz)
// set pointer = 0x00xx
clr @yz
decms z // z = z -1
jmp $-2 // skip if z = 0
clr @yz
endm
//====================================================
sleep expand
b0bset fcpum0
endm
//====================================================
// circularly shift val
//note: 1. c will be changed.
// 2. must includestd macro1.h
//====================================================
rrcmn expand mem,val
repeat val
rrcm mem
endm
endm
//====================================================
rlcmn expand mem,val
repeat val
rlcm mem
endm
endm
//====================================================
shln expand mem,val
repeat val
shl mem
endm
endm
//====================================================
shrn expand mem,val
repeat val
shr mem
endm
endm
//====================================================
roln expand mem,val
repeat val
rol mem
endm
endm
//====================================================
rorn expand mem,val
repeat val
ror mem
endm
endm
//====================================================
notb expand f
b0bts1 f
jmp $+3
b0bclr f
jmp $+2
b0bset f
endm
//====================================================
// add_de, adc_de, adcm_de, addm_de ;algorism addition
//====================================================
add_de expand acc,v1
add acc,v1
daa
endm
//====================================================
adc_de expand acc,v1
adc acc,v1
daa
endm
//====================================================
adcm_de expand v1,v2
b0mov a,v2
adc a,v1
daa
b0mov v1,a
endm
//====================================================
addm_de expand v1,v2
b0mov a,v2
add a,v1
daa
b0mov v1,a
endm
//====================================================
// subm_de, sbcm_de ;algorism subtration
//====================================================
Subm_de expand v1,v2
mov a,#99h
sub a,v2
adc a,v1
daa
b0mov v1,a
endm
//====================================================
Sbcm_de expand v1,v2
mov a,#99h
sbc a,v2
adc a,v1
daa
b0mov v1,a
endm
//====================================================
Xchgupcycle_ expand adr, list:vararg
@s_temp1=adr
for ls, <list>
xch a, ls
xch a, @s_temp1
@s_temp1 = @s_temp1 + 1
endm
xch a,@s_temp1
endm
//====================================================
//must use serial ram byte,can economize ram byte
Downbyte_cycle expand adr,list:vararg
@s_temp1 = adr
for ls, <list>
xch a,@s_temp1
@s_temp1 = @s_temp1 + 1
endm
xch a,@s_temp1
xch a,adr
endm
//ex: downbyte_cycle wk0,wk1,wk2,...,wkn
// (wkn are serial ram byte)
//result:wkn,wk0,wk1,...wk(n-1)
//====================================================
//must use serial ram byte,can economize ram byte
Upbyte_cycle expand adr,list:vararg
@s_temp1 = adr
for ls, <list>
xch a,ls
xch a,@s_temp1
@s_temp1 = @s_temp1 + 1
endm
xch a,@s_temp1
endm
//ex: upbyte_cycle wk0,wk1,wk2,...,wkn
// (wkn are serial ram byte)
//result:wk1,wk2,wk3,...wk0
//====================================================
//Note:将v1与v2中的数据交换
//====================================================
XCHM expand v1,v2
xch a,v2
xch a,v1
xch a,v2
endm
//====================================================
//Note:将v2中的数据bit倒置存于v1中
//====================================================
ConvertM expand v1,v2
clr v1
bts0 v2.0
bset v1.7
bts0 v2.1
bset v1.6
bts0 v2.2
bset v1.5
bts0 v2.3
bset v1.4
bts0 v2.4
bset v1.3
bts0 v2.5
bset v1.2
bts0 v2.6
bset v1.1
bts0 v2.7
bset v1.0
endm
//====================================================
//Note:将v2中的数据bit倒置取反并存于v1中
//====================================================
Convert_M expand v1,v2
clr v1
bts1 v2.0
bset v1.7
bts1 v2.1
bset v1.6
bts1 v2.2
bset v1.5
bts1 v2.3
bset v1.4
bts1 v2.4
bset v1.3
bts1 v2.5
bset v1.2
bts1 v2.6
bset v1.1
bts1 v2.7
bset v1.0
endm
//====================================================
//Note: 将位f1与位f2相与赋予f2
//====================================================
AND_f macro f1,f2
bts0 f1
jmp $+2
bclr f2
endm
endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -