📄 rxdosmac.asm
字号:
endif
ifnb <reg6>
push ss
pop reg6
endif
ifnb <reg7>
push ss
pop reg7
endif
ifnb <reg8>
push ss
pop reg8
endif
ifnb <reg9>
push ss
pop reg9
endif
ifnb <reg0>
push ss
pop reg0
endif
endm
;''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''';
; Standard Save ;
;...............................................................;
saveStandard macro reg1, reg2, reg3, reg4, reg5, reg6, reg7, reg8, reg9, reg0
push ds
push es
push si
push di
ifnb <reg1>
tpush reg1
endif
ifnb <reg2>
tpush reg2
endif
ifnb <reg3>
tpush reg3
endif
ifnb <reg4>
tpush reg4
endif
ifnb <reg5>
tpush reg5
endif
ifnb <reg6>
tpush reg6
endif
ifnb <reg7>
tpush reg7
endif
ifnb <reg8>
tpush reg8
endif
ifnb <reg9>
tpush reg9
endif
ifnb <reg0>
tpush reg0
endif
endm
;''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''';
; Standard Restore ;
;...............................................................;
restoreStandard macro reg1, reg2, reg3, reg4, reg5, reg6, reg7, reg8, reg9, reg0
ifnb <reg1>
tpop reg1
endif
ifnb <reg2>
tpop reg2
endif
ifnb <reg3>
tpop reg3
endif
ifnb <reg4>
tpop reg4
endif
ifnb <reg5>
tpop reg5
endif
ifnb <reg6>
tpop reg6
endif
ifnb <reg7>
tpop reg7
endif
ifnb <reg8>
tpop reg8
endif
ifnb <reg9>
tpop reg9
endif
ifnb <reg0>
tpop reg0
endif
pop di
pop si
pop es
pop ds
endm
;''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''';
; Set Seg Register ;
;...............................................................;
setSeg macro seg, reg
segcopied = no
irp treg, <es, ds, cs, ss>
ifidn <reg>, <treg>
segcopied = yes
push reg
pop seg
endif
endm
ife (segcopied NE no)
mov seg, reg
endif
endm
;''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''';
; Set DS ;
;...............................................................;
setDS macro reg1, reg2, reg3, reg4, reg5, reg6, reg7, reg8, reg9, reg0
ifnb <reg1>
setSeg ds, reg1
endif
ifnb <reg2>
setSeg ds, reg2
endif
ifnb <reg3>
setSeg ds, reg3
endif
ifnb <reg4>
setSeg ds, reg4
endif
ifnb <reg5>
setSeg ds, reg5
endif
ifnb <reg6>
setSeg ds, reg6
endif
ifnb <reg7>
setSeg ds, reg7
endif
ifnb <reg8>
setSeg ds, reg8
endif
ifnb <reg9>
setSeg ds, reg9
endif
ifnb <reg0>
setSeg ds, reg0
endif
endm
;''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''';
; Set ES ;
;...............................................................;
setES macro reg1, reg2, reg3, reg4, reg5, reg6, reg7, reg8, reg9, reg0
ifnb <reg1>
setSeg es, reg1
endif
ifnb <reg2>
setSeg es, reg2
endif
ifnb <reg3>
setSeg es, reg3
endif
ifnb <reg4>
setSeg es, reg4
endif
ifnb <reg5>
setSeg es, reg5
endif
ifnb <reg6>
setSeg es, reg6
endif
ifnb <reg7>
setSeg es, reg7
endif
ifnb <reg8>
setSeg es, reg8
endif
ifnb <reg9>
setSeg es, reg9
endif
ifnb <reg0>
setSeg es, reg0
endif
endm
;''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''';
; Set SS ;
;...............................................................;
setSS macro reg1, reg2, reg3, reg4, reg5, reg6, reg7, reg8, reg9, reg0
ifnb <reg1>
setSeg ss, reg1
endif
ifnb <reg2>
setSeg ss, reg2
endif
ifnb <reg3>
setSeg ss, reg3
endif
ifnb <reg4>
setSeg ss, reg4
endif
ifnb <reg5>
setSeg ss, reg5
endif
ifnb <reg6>
setSeg ss, reg6
endif
ifnb <reg7>
setSeg ss, reg7
endif
ifnb <reg8>
setSeg ss, reg8
endif
ifnb <reg9>
setSeg ss, reg9
endif
ifnb <reg0>
setSeg ss, reg0
endif
endm
;''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''';
; Adds an offset to a seg register pair ;
;...............................................................;
offsetAddr macro seg, reg, offs
local no_ovf
segspecial = no
add reg, offs
jnc no_ovf
irp treg, <es, ds, cs, ss>
ifidn <seg>, <treg>
segspecial = yes
mov ax, seg
add ax, 1000h ; account for carry
mov seg, ax
endif
endm
ife segspecial-no ; if seg register not special
add seg, 1000h ; account for carry
endif
no_ovf:
endm
;''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''';
; Defines a standard subr entry point ;
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -;
; ;
; saves bp and sets bp to value of sp at entry. ;
; Must use Return macro to exit. ;
; ;
;...............................................................;
Entry macro __args ; # word entries
push bp ; save bp
mov bp,sp ; set bp to point to stack
_defEntry = 0
_maxArgs = 0
ifnb <__args>
_retEntry = __args
_maxArgs = 2 * __args
_argEntry = 2 * __args + 4 ; assumes NEAR
else
_retEntry = 0
_argEntry = 4 ; assumes NEAR
endif
endm
;''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''';
; Defines a standard subr far entry point ;
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -;
; ;
; saves bp and sets bp to value of sp at entry. ;
; Must use Return macro to exit. ;
; ;
;...............................................................;
FarEntry macro __args ; word entries
push bp ; save bp
mov bp,sp ; set bp to point to stack
_defEntry = 0
_maxArgs = 0
ifnb <__args>
_retEntry = __args
_maxArgs = 2 * __args
_argEntry = 2 * __args + 6 ; assumes FAR
else
_retEntry = 0
_argEntry = 6 ; assumes FAR
endif
endm
;''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''';
; Special Entry does not alter registers ;
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -;
; ;
; ...but sets argument parameters. ;
; Must use Return macro to exit. ;
; ;
;...............................................................;
SpecialEntry macro __args ; word entries
_defEntry = 0
_maxArgs = 0
ifnb <__args>
_retEntry = __args
_maxArgs = 2 * __args
_argEntry = 2 * __args + 4 ; (no bp pushed )
else
_retEntry = 0
_argEntry = 4 ; assumes FAR (no bp pushed)
endif
endm
;''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''';
; Defines a word call parameter argument ;
;...............................................................;
Arg macro arg_name
if ( _maxArgs LT 2 )
error 'Arg definition does not match Entry'
endif
ifb <arg_name>
error 'Arg must have an arg_name parameter.'
endif
_argEntry = _argEntry - 2
arg_name = _argEntry
chklabel arg_name
endm
;''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''';
; Defines a double word call parameter argument ;
;...............................................................;
DArg macro arg_name
if ( _maxArgs LT 4 )
error 'Arg definition does not match Entry'
endif
ifb <arg_name>
error 'Arg must have an arg_name parameter.'
endif
_argEntry = _argEntry - 4
arg_name = _argEntry
chklabel arg_name
endm
;''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''';
; Arg References (Args pushed after call, but before entry) ;
;...............................................................;
rArg macro arg_name, arg_ref
ifb <arg_name>
error 'Arg must have an arg_name parameter.'
endif
ifb <arg_ref>
error 'rArg: 2nd argument must exist.'
endif
arg_name = arg_ref
chklabel arg_name
endm
;''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''';
; Arg References (Args pushed after call, but before entry) ;
;...............................................................;
rDArg macro arg_name, arg_ref
ifb <arg_name>
error 'Arg must have an arg_name parameter.'
endif
ifb <arg_ref>
error 'rArg: 2nd argument must exist.'
endif
arg_name = arg_ref
chklabel arg_name
endm
;''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''';
; Defines a word argument on stack ;
;...............................................................;
Def macro arg_name, reg
ifb <arg_name>
error 'Def must have an arg_name parameter.'
endif
_defEntry = _defEntry - 2
arg_name = _defEntry
pushedreg = no
ifb <reg>
push ax
pushedreg = yes
endif
ifnb <reg>
irp treg,<ax,bx,cx,dx,bp,si,di,es,ds,ss,cs,f>
ifidn <reg>,<treg>
tpush reg
pushedreg = yes
endif
endm
endif
ife pushedreg-no ; if not pushed
push ax
mov word ptr arg_name [bp],reg ; really a value.
endif
chklabel arg_name
endm
;''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''';
; Defines a double word argument on stack ;
;...............................................................;
DDef macro arg_name, seg, reg
ifb <arg_name>
error 'Def must have an arg_name parameter.'
endif
_defEntry = _defEntry - 4
arg_name = _defEntry
pushedreg = no
pushedseg = no
ifb <seg>
push ax
push ax
pushedseg = yes
pushedreg = yes
endif
ifnb <seg>
irp tseg,<ax,bx,cx,dx,bp,si,di,es,ds,ss,cs,f>
ifidn <seg>,<tseg>
tpush seg
pushedseg = yes
endif
endm
endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -