.xlist ; ; COPYRIGHT @ 1982 ; Jim Holtman ; ; Structured Control MACROS for the Assembler ; .$on=1 .cnt=1 .lvl=0 .$top=1 xopsyn macro op1,op2 @&op1 equ op2 @&op2 equ op1 endm xopsyn jbe,ja xopsyn jae,jb xopsyn jc,jnc xopsyn je,jne xopsyn jz,jnz xopsyn jg,jle xopsyn jge,jl xopsyn jno,jo xopsyn jpo,jpe xopsyn jns,js purge xopsyn ; create label .$lbl macro id,num id&num: endm .popdo macro if .$top lt 1 %out stack overflow else .$top = .$top-1 .$get %.$top,.dold endif endm .$get macro entry,value value = .&entry endm .$put macro entry,value .&entry = value endm .pushdo macro x ifnb x = .cnt .cnt = .cnt+1 endif .$put %.$top,.dold .$top = .$top+1 endm .$br macro type,id,label,long local lab ifnb j&type lab jmp id&label lab: else @j&type id&label endif endm .doo macro cond,long .pushdo .dold .lvl = .lvl+1 .$br cond,d@,%.dold,long endm .endif macro .popdo .$lbl d@,%.dold .lvl = .lvl-1 endm .if macro arg1,cond,arg2,long ifb .doo arg1,cond else cmp arg1,arg2 .doo cond,long endif endm .ifs macro p1,p2,long test p1,p2 .if nz,long endm .ifc macro p1,p2,long test p1,p2 .if z,long endm .else macro long .doif = .cnt .cnt = .cnt+1 ifnb .$jmp d@,%.doif else .$jmp ,%.doif endif .endif .lvl = .lvl+1 .dold = .doif .pushdo endm .$jmp macro id,num jmp id&num endm .dowhl macro p1,cond,p2,long ifnb .$do long .if ,cond,,long else .$do cond .if p1,cond endif endm .enddo macro .popdo .doif = .dold .popdo .xxtemp = .dold and 8000h if .xxtemp eq 0 .$jmp ,%.dold else .dold = .dold and 7fffh .$jmp d@,%.dold endif .lvl = .lvl-1 .$lbl d@,%.doif endm check$ macro if .$top ne 1 %out stack not empty endif if .lvl ne 0 %out nesting level mismatch endif endm .$do macro long .pushdo .dold ifnb .xxtemp = .$top-1 .$get %.xxtemp,.dold .$put %.xxtemp,<.dold or 8000h> endif .xxtemp = .dold and 7fffh .$lbl d@,%.xxtemp endm .repeat macro .$do .lvl = .lvl+1 endm .until macro p1,cond,p2,long ifidn , .popdo .$loop loop&cond,d@,%.dold else ifnb cmp p1,p2 .popdo .$br cond,d@,%.dold,long else .popdo .$br p1,d@,%.dold,cond endif endif .lvl = .lvl-1 endm .$loop macro type,id,num type id&num endm @pop macro parm irp @@pop, ifnb <@@pop> pop @@pop endif endm endm @save macro p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12 irp @@save, ifnb <@@save> push @@save endif endm @restore macro @pop endm endm .list .