mirror of https://github.com/tongzx/nt5src
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
702 lines
13 KiB
702 lines
13 KiB
;;STRUC--Stucture Macro Library
|
|
;;Optimizing Version 2.30 03/31/87
|
|
|
|
if1
|
|
$NoConj equ 0
|
|
$And equ 1
|
|
$Or equ 2
|
|
$Short equ 3
|
|
$Near equ 4
|
|
$NearToShort equ 5
|
|
$ncxz equ 6
|
|
$AndOr = 0
|
|
$Temp = 0
|
|
$Temp2 = 0
|
|
$Dist = 0
|
|
|
|
$NoType equ 10
|
|
$ConjIfType equ 11
|
|
$IfType equ 12
|
|
$ElseType equ 13
|
|
$WhileType equ 14
|
|
$ConjWhileType equ 15
|
|
$RepeatType equ 16
|
|
$ConjUntilType equ 17
|
|
$ForType equ 18
|
|
$ConjLeaveType equ 19
|
|
$SelectType equ 20
|
|
$WhenType equ 21
|
|
$ConjWhenType equ 22
|
|
$OtherwiseType equ $ElseType
|
|
|
|
$StrucError macro text
|
|
Structure error -- text
|
|
endm
|
|
|
|
J macro
|
|
endm
|
|
JN macro
|
|
endm
|
|
|
|
$BuildJump macro j1,j2
|
|
j1 macro t
|
|
.xcref j1
|
|
j2 t
|
|
endm
|
|
endm
|
|
|
|
irp x,<<jeq,je>,<jlt,jl>,<jgt,jg>,<jneq,jne>,<jnlt,jnl>,<jngt,jng>,<jnpe,jpo>,<jnpo,jpe>>
|
|
$BuildJump x
|
|
endm
|
|
irp x,<<jzero,jz>,<jnzero,jnz>,<jnonzero,jnz>,<jnnonzero,jz>,<jand,jnz>,<jnand,jz>,<jnnand,jnz>>
|
|
$BuildJump x
|
|
endm
|
|
irp x,<a,ae,b,be,c,e,g,ge,l,le,o,p,s,z,cxz>
|
|
$BuildJump jnn&x,j&x
|
|
endm
|
|
|
|
jncxz macro t
|
|
if $Dist eq $NearToShort
|
|
jcxz $+5
|
|
jmp t
|
|
else
|
|
jcxz $+4
|
|
jmp short t
|
|
endif
|
|
endm
|
|
|
|
purge $BuildJump
|
|
|
|
$GetConj macro p1,p2
|
|
$AndOr = $NoConj
|
|
irp parm,<p1,p2>
|
|
ifnb <&parm>
|
|
irp x,<and,AND,or,OR>
|
|
ifidn <parm>,<x>
|
|
$AndOr = $&&&x
|
|
exitm
|
|
endif
|
|
endm
|
|
endif
|
|
endm
|
|
endm
|
|
|
|
$GetDist macro p1,p2
|
|
irp parm,<p1,p2>
|
|
ifnb <parm>
|
|
irp x,<short,SHORT,near,NEAR>
|
|
ifidn <parm>,<x>
|
|
$Dist = $&&&x
|
|
exitm
|
|
endif
|
|
endm
|
|
endif
|
|
endm
|
|
endm
|
|
|
|
|
|
$Poke macro n,m
|
|
$st&n = m
|
|
.xcref $st&n
|
|
endm
|
|
|
|
$Peek macro x,n
|
|
x = $st&n
|
|
endm
|
|
|
|
$Push macro n
|
|
$st = $st+1
|
|
$Poke %$st,n
|
|
endm
|
|
|
|
$Pop macro x
|
|
if $st gt 0
|
|
$Peek x,%$st
|
|
$st = $st-1
|
|
else
|
|
$StrucError <open structure>
|
|
endif
|
|
endm
|
|
|
|
$EquateLabel macro last,this
|
|
if $LastLabelOrg eq $
|
|
$ll&last = this
|
|
.xcref $ll&last
|
|
endif
|
|
endm
|
|
|
|
$TraceLabel macro n,a,b
|
|
if $ll&a eq $ll&b
|
|
$ll&n = b
|
|
.xcref $ll&n
|
|
else
|
|
$TraceLabel n,%$ll&a,%$ll&b
|
|
endif
|
|
endm
|
|
|
|
$Label macro n
|
|
if1
|
|
$EquateLabel %$LastLabel,n
|
|
$ll&n = n
|
|
.xcref $ll&n
|
|
$LastLabel = n
|
|
$LastLabelOrg = $
|
|
$l&n:
|
|
else
|
|
if $ll&n eq n
|
|
$l&n:
|
|
else
|
|
.xcref $l&n
|
|
.xcref $ll&n
|
|
endif
|
|
endif
|
|
endm
|
|
|
|
$CondJump macro l,tf,c
|
|
if1
|
|
ifb <c>
|
|
$EquateLabel %$LastLabel,l
|
|
endif
|
|
ifndef <$ll&l>
|
|
$ll&l = l
|
|
.xcref $ll&l
|
|
endif
|
|
else
|
|
$TraceLabel l,l,%$ll&l
|
|
endif
|
|
$CondJump2 %$ll&l,tf,c
|
|
endm
|
|
|
|
$CondJump2 macro l,tf,c
|
|
if $Dist eq $Short
|
|
ifb <c>
|
|
jmp short $l&l
|
|
else
|
|
ifidn <tf>,<f>
|
|
jn&c $l&l
|
|
else
|
|
j&c $l&l
|
|
endif
|
|
endif
|
|
else
|
|
ifnb <c>
|
|
ifdef $l&l
|
|
if (($ - $l&l) le 126) and (($l&l - $) le 129)
|
|
$Dist = $NearToShort
|
|
$nops = 3
|
|
ifidn <tf>,<f>
|
|
jn&c $l&l
|
|
ifdef $n&c
|
|
if $n&c eq $ncxz
|
|
$nops = 0
|
|
endif
|
|
endif
|
|
ifdef $&c
|
|
if $&c eq $ncxz
|
|
$nops = 5
|
|
endif
|
|
endif
|
|
else
|
|
j&c $l&l
|
|
ifdef $n&c
|
|
if $n&c eq $ncxz
|
|
$nops = 5
|
|
endif
|
|
endif
|
|
ifdef $&c
|
|
if $&c eq $ncxz
|
|
$nops = 0
|
|
endif
|
|
endif
|
|
endif
|
|
rept $nops
|
|
nop
|
|
endm
|
|
else
|
|
ifidn <tf>,<f>
|
|
j&c $+5
|
|
else
|
|
jn&c $+5
|
|
endif
|
|
jmp $l&l
|
|
endif
|
|
else
|
|
ifidn <tf>,<f>
|
|
j&c $+5
|
|
else
|
|
jn&c $+5
|
|
endif
|
|
jmp $l&l
|
|
endif
|
|
else
|
|
ifdef $l&l
|
|
ifidn <tf>,<NoFold>
|
|
jmp $l&l
|
|
else
|
|
if (($ - $l&l) le 126) and (($l&l - $) le 129)
|
|
jmp short $l&l
|
|
nop
|
|
else
|
|
jmp $l&l
|
|
endif
|
|
endif
|
|
else
|
|
jmp $l&l
|
|
endif
|
|
endif
|
|
endif
|
|
endm
|
|
|
|
|
|
$CondLoop macro l,c
|
|
loop&c $l&l
|
|
endm
|
|
|
|
$Test macro tgt,a1,a2,a3,a4,x
|
|
ifb <a1>
|
|
$StrucError <invalid condition>
|
|
else
|
|
ifb <a2>
|
|
$CondJump %&tgt,a1
|
|
else
|
|
ifb <a3>
|
|
ifdif <a1>,<zero>
|
|
ifdif <a1>,<nonzero>
|
|
ifdif <a1>,<ZERO>
|
|
ifdif <a1>,<NONZERO>
|
|
$StrucError <invalid condition>
|
|
exitm
|
|
endif
|
|
endif
|
|
endif
|
|
endif
|
|
or a2,a2
|
|
$CondJump %&tgt,a1
|
|
else
|
|
ifb <a4>
|
|
cmp a1,a3
|
|
$CondJump %&tgt,a2
|
|
else
|
|
ifb <x>
|
|
ifdif <a1>,<bit>
|
|
ifdif <a1>,<BIT>
|
|
$StrucError <invalid condition>
|
|
exitm
|
|
endif
|
|
endif
|
|
test a2,a4
|
|
$CondJump %&tgt,a3
|
|
else
|
|
$StrucError <invalid condition>
|
|
endif
|
|
endif
|
|
endif
|
|
endif
|
|
endif
|
|
endm
|
|
|
|
$TopTest macro args,n,c,p4,p5
|
|
$GetConj p4,p5
|
|
$Dist = $DefDist
|
|
$GetDist p4,p5
|
|
if $AndOr eq $NoConj
|
|
$Test <$sn-1,f>,args
|
|
$Pop $Temp
|
|
if $OrFound
|
|
$Label %$Temp
|
|
endif
|
|
$Push n
|
|
else
|
|
if $AndOr eq $And
|
|
$Test <$sn-1,f>,args
|
|
else
|
|
$OrFound = 1
|
|
$Test <$sn,t>,args
|
|
endif
|
|
$Push c
|
|
endif
|
|
endm
|
|
;;*****************************************************************************
|
|
.if macro t,p2,p3
|
|
$Peek $Temp,%$st
|
|
if $Temp eq $ConjIfType
|
|
$Pop $Temp
|
|
else
|
|
$OrFound = 0
|
|
$sn = $sn+1
|
|
$Push $sn
|
|
$sn = $sn+1
|
|
$Push $sn
|
|
$sn = $sn+1
|
|
$Push $sn
|
|
endif
|
|
$TopTest <t>,$IfType,$ConjIfType,p2,p3
|
|
endm
|
|
;;*****************************************************************************
|
|
.then macro
|
|
$Peek $Temp,%$st
|
|
if $Temp ne $IfType
|
|
if $Temp ne $WhenType
|
|
$StrucError <then without if or when>
|
|
endif
|
|
endif
|
|
endm
|
|
;;*****************************************************************************
|
|
.elseif macro t,p2,p3
|
|
$Pop $Temp
|
|
if $Temp ne $IfType
|
|
$StrucError <elseif without if>
|
|
exitm
|
|
endif
|
|
$OrFound = 0
|
|
$Pop $Temp
|
|
$Peek $Temp2,%$st
|
|
$Dist = $Near
|
|
$CondJump %$Temp2
|
|
$Label %$Temp
|
|
$sn = $sn+1
|
|
$Push $sn
|
|
$sn = $sn+1
|
|
$Push $sn
|
|
$TopTest <t>,$IfType,$ConjIfType,p2,p3
|
|
endm
|
|
;;*****************************************************************************
|
|
.else macro dist
|
|
$Pop $Temp
|
|
if $Temp ne $IfType
|
|
if $Temp ne $WhenType
|
|
if $Temp ne $SelectType
|
|
$StrucError <else without if, when or select>
|
|
exitm
|
|
endif
|
|
endif
|
|
endif
|
|
$sn = $sn+1
|
|
if $Temp eq $SelectType
|
|
$Push $sn
|
|
else
|
|
$Dist = $DefDist
|
|
$GetDist dist
|
|
$CondJump %$sn
|
|
$Pop $Temp
|
|
$Label %$Temp
|
|
$Push $sn
|
|
endif
|
|
$push $ElseType
|
|
endm
|
|
;;*****************************************************************************
|
|
.endif macro
|
|
$Pop $Temp
|
|
if $Temp ne $IfType
|
|
if $Temp ne $ElseType
|
|
$StrucError <endif without if>
|
|
exitm
|
|
endif
|
|
endif
|
|
$Pop $Temp
|
|
$Label %$Temp
|
|
$Pop $Temp
|
|
$Label %$Temp
|
|
endm
|
|
;;*****************************************************************************
|
|
.select macro x
|
|
$OrFound = 0
|
|
$sn = $sn+1
|
|
$Push $sn
|
|
$Push $SelectType
|
|
endm
|
|
;;*****************************************************************************
|
|
.when macro tst,p2,p3
|
|
$Pop $Temp
|
|
if $Temp ne $SelectType
|
|
if $Temp ne $WhenType
|
|
if $Temp ne $ConjWhenType
|
|
$StrucError <when without select>
|
|
exitm
|
|
endif
|
|
endif
|
|
endif
|
|
if $Temp ne $ConjWhenType
|
|
$Dist = $Near
|
|
$OrFound = 0
|
|
if $Temp eq $WhenType
|
|
$Pop $Temp2
|
|
$Peek $Temp,%$st
|
|
$CondJump %$Temp
|
|
$Label %$Temp2
|
|
endif
|
|
$sn = $sn+1
|
|
$Push $sn
|
|
$sn = $sn+1
|
|
$Push $sn
|
|
endif
|
|
$TopTest <tst>,$WhenType,$ConjWhenType,p2,p3
|
|
endm
|
|
;;*****************************************************************************
|
|
.otherwise macro dist
|
|
$Pop $Temp
|
|
if $Temp ne $WhenType
|
|
if $Temp ne $SelectType
|
|
if $Temp ne $IfType
|
|
$StrucError <otherwise without if, when or select>
|
|
exitm
|
|
endif
|
|
endif
|
|
endif
|
|
$sn = $sn+1
|
|
if $Temp eq $SelectType
|
|
$Push $sn
|
|
else
|
|
$Dist = $DefDist
|
|
$GetDist dist
|
|
$CondJump %$sn
|
|
$Pop $Temp
|
|
$Label %$Temp
|
|
$Push $sn
|
|
endif
|
|
$push $OtherwiseType
|
|
endm
|
|
;;*****************************************************************************
|
|
.endselect macro
|
|
$Pop $Temp
|
|
if $Temp ne $WhenType
|
|
if $Temp ne $OtherwiseType
|
|
if $Temp ne $SelectType
|
|
$StrucError <endselect without select>
|
|
exitm
|
|
endif
|
|
endif
|
|
endif
|
|
$pop $Temp2
|
|
if $Temp ne $SelectType
|
|
$Label %$Temp2
|
|
$Pop $Temp2
|
|
$Label %$Temp2
|
|
endif
|
|
endm
|
|
;;*****************************************************************************
|
|
.while macro t,p2,p3
|
|
$Peek $Temp,%$st
|
|
if $Temp eq $ConjWhileType
|
|
$Pop $Temp
|
|
else
|
|
$Push $LoopEnd
|
|
$OrFound = 0
|
|
$sn = $sn + 1
|
|
$Push $sn
|
|
$Label %$sn
|
|
$sn = $sn + 2
|
|
$Push $sn
|
|
$LoopEnd = $sn - 1
|
|
endif
|
|
$TopTest <t>,$WhileType,$ConjWhileType,p2,p3
|
|
endm
|
|
;;*****************************************************************************
|
|
.endwhile macro p1
|
|
$Pop $Temp
|
|
if $Temp ne $WhileType
|
|
$StrucError <endwhile without while>
|
|
exitm
|
|
endif
|
|
$Dist = $Near
|
|
$Pop $Temp
|
|
$CondJump %$Temp,NoFold
|
|
$Label %$Temp+1
|
|
$Pop $LoopEnd
|
|
endm
|
|
;;*****************************************************************************
|
|
.repeat macro
|
|
$Push $LoopEnd
|
|
$Push $LeaveFound
|
|
$sn = $sn+1
|
|
$Label %$sn
|
|
$Push $sn
|
|
$Push $RepeatType
|
|
$sn = $sn+1
|
|
$LoopEnd = $sn
|
|
$LeaveFound = 0
|
|
endm
|
|
;;*****************************************************************************
|
|
.until macro t,p2,p3
|
|
$until2 p2,p3,t
|
|
endm
|
|
$until2 macro p2,p3,a1,a2,a3,a4,x
|
|
$Pop $Temp
|
|
if $Temp ne $RepeatType
|
|
if $Temp ne $ConjUntilType
|
|
$StrucError <until without repeat>
|
|
exitm
|
|
endif
|
|
else
|
|
$OrFound = 0
|
|
endif
|
|
$Dist = $DefDist
|
|
$GetDist p2,p3
|
|
$GetConj p2,p3
|
|
|
|
if $AndOr eq $NoConj
|
|
$Pop $Temp
|
|
ifb <a1>
|
|
$Dist = $Near
|
|
$CondJump %$Temp,NoFold
|
|
else
|
|
$Test <$Temp,f>,<a1>,<a2>,<a3>,<a4>,<x>
|
|
endif
|
|
if $OrFound or $LeaveFound
|
|
$Label %$Temp+1
|
|
endif
|
|
$Pop $LeaveFound
|
|
$Pop $LoopEnd
|
|
else
|
|
$Peek $Temp,%$st
|
|
if $AndOr eq $And
|
|
$Test <$Temp,f>,<a1>,<a2>,<a3>,<a4>,<x>
|
|
else
|
|
$OrFound = 1
|
|
$Test <$Temp+1,t>,<a1>,<a2>,<a3>,<a4>,<x>
|
|
endif
|
|
$Push $ConjUntilType
|
|
endif
|
|
endm
|
|
;;*****************************************************************************
|
|
.loop macro cond
|
|
$Pop $Temp
|
|
if $Temp ne $RepeatType
|
|
$StrucError <loop without repeat>
|
|
exitm
|
|
endif
|
|
$Pop $Temp
|
|
$CondLoop %$Temp,cond
|
|
if $LeaveFound
|
|
$Label %$Temp+1
|
|
endif
|
|
$Pop $LeaveFound
|
|
$Pop $LoopEnd
|
|
endm
|
|
;;*****************************************************************************
|
|
.for macro index,equals,start,to,stop,by,step,dist
|
|
mov index,start
|
|
$Push $LoopEnd
|
|
$sn = $sn+1
|
|
$Push $sn
|
|
$Label %$sn
|
|
$sn = $sn+1
|
|
$LoopEnd = $sn
|
|
cmp index,stop
|
|
$Dist = $DefDist
|
|
ifb <step>
|
|
$Push 1
|
|
$GetDist by
|
|
$CondJump %$sn,t,gt
|
|
else
|
|
$GetDist dist
|
|
$Push %(step)
|
|
if step lt 0
|
|
$CondJump %$sn,t,lt
|
|
else
|
|
$CondJump %$sn,t,gt
|
|
endif
|
|
endif
|
|
$Push $ForType
|
|
endm
|
|
;;*****************************************************************************
|
|
.next macro index,dist
|
|
$Pop $Temp
|
|
if $Temp ne $ForType
|
|
$StrucError <next without for>
|
|
exitm
|
|
endif
|
|
$Pop $Temp
|
|
if $Temp eq 1
|
|
inc index
|
|
else
|
|
if $Temp eq -1
|
|
dec index
|
|
else
|
|
add index,$Temp
|
|
endif
|
|
endif
|
|
$Pop $Temp
|
|
$Dist = $Near
|
|
$CondJump %$Temp,NoFold
|
|
$Label %$Temp+1
|
|
$Pop $LoopEnd
|
|
endm
|
|
;;*****************************************************************************
|
|
.leave macro t,p2,p3
|
|
$leave2 p2,p3,t
|
|
endm
|
|
$leave2 macro p2,p3,a1,a2,a3,a4,x
|
|
ife $LoopEnd
|
|
$StrucError <leave outside a loop>
|
|
exitm
|
|
endif
|
|
$LeaveFound = 1
|
|
$Peek $Temp,%$st
|
|
if $Temp eq $ConjLeaveType
|
|
$Pop $Temp
|
|
else
|
|
$OrFound = 0
|
|
$sn = $sn + 1
|
|
endif
|
|
$Dist = 0
|
|
$GetDist <a1>
|
|
if $Dist
|
|
$CondJump %$LoopEnd
|
|
if $OrFound
|
|
$Label %$sn
|
|
endif
|
|
else
|
|
$Dist = $DefDist
|
|
$GetDist p2,p3
|
|
$GetConj p2,p3
|
|
if $AndOr eq $NoConj
|
|
ifb <a1>
|
|
$CondJump %$LoopEnd,t
|
|
else
|
|
$Test <$LoopEnd,t>,<a1>,<a2>,<a3>,<a4>,<x>
|
|
endif
|
|
if $OrFound
|
|
$Label %$sn
|
|
endif
|
|
else
|
|
if $AndOr eq $And
|
|
$OrFound = 1
|
|
$Test <$sn,f>,<a1>,<a2>,<a3>,<a4>,<x>
|
|
else
|
|
$Test <$LoopEnd,t>,<a1>,<a2>,<a3>,<a4>,<x>
|
|
endif
|
|
$Push $ConjLeaveType
|
|
endif
|
|
endif
|
|
endm
|
|
;;*****************************************************************************
|
|
else ;else for if1
|
|
$Pop $Temp
|
|
;;if $Temp ne $NoType
|
|
if $st ne 0
|
|
$StrucError <open structure(s)>
|
|
endif
|
|
.xcref $NoConj,$And,$Or,$Short,$Near,$NearToShort,$AndOr,$Temp,$Temp2,$Dist
|
|
.xcref $NoType,$ConjIfType,$IfType,$ElseType,$WhileType,$ConjWhileType
|
|
.xcref $RepeatType,$ConjUntilType,$ForType,$ConjLeaveType,jncxz
|
|
.xcref $SelectType,$WhenType,$OtherwiseType,$ConjWhenType
|
|
.xcref jeq,jgt,jlt,jneq,jngt,jnlt,jnna,jnnae,jnnb,jnnbe,jnnc,jnncxz
|
|
.xcref jnne,jnng,jnnge,jnnl,jnnle,jnno,jnnp,jnns,jnnz,jnpe,jnpo,$BuildJump
|
|
.xcref $GetConj,$GetDist,$Poke,$Peek,$Push,$Pop,$Label,$CondJump,$CondLoop,$Test
|
|
.xcref $TopTest,$leave2,$until2,$StrucError,j,jn,jand,jnand,jnnand
|
|
.xcref jnnonzero,jnonzero,jnzero,jzero
|
|
.xcref $st,$sn,$OrFound,$LoopEnd,$LeaveFound,$DefDist
|
|
.xcref $LastLabel,$LastLabelOrg,$EquateLabel,$TraceLabel,$CondJump2,$ncxz
|
|
endif
|
|
|
|
|
|
$st = 0
|
|
$sn = 0
|
|
$OrFound = 0
|
|
$LoopEnd = 0
|
|
$LeaveFound = 0
|
|
$LastLabel = -1
|
|
$LastLabelOrg = $
|
|
$DefDist= $Short
|
|
$Push %$NoType
|