.NLIST ;IN ORDER TO USE THESE MACROS, INCLUDE THIS FILE AS THE FIRST ;FILE OF YOUR ASSEMBLY. ;THIS MACRO IS USED BY THE OTHERS .MACRO EVAL A,B,C,D,E,F,G,H A'B'C'D'E'F'G'H .ENDM ;THESE MACROS IMPLEMENT THE IF THEN ELSE CONSTRUCT, ;LOOPING CONSTRUCTS, AND A CASE CONSTRUCT ;FIRST WE HAVE: ; CONDITION CODES SET ; IF COND ; STATEMENTS TO EXECUTE ; ELSE ; STATEMENTS TO EXECUTE ; ENDF ;IN THE ABOVE, 'COND' IS THE MNEMONIC FOR A BRANCH INSTRUCTION ;MINUS THE B FOR EXAMPLE EQ, PL, OR LOS. ;THE ELSE MAY BE OMMITTED. .MACRO IF COND EVAL BN,COND,< >,ZI,\ZUNF EVAL ZIB,\ZUNF,<:> ZISP=ZISP+1 EVAL ZIS,\ZISP,=,ZUNF ZUNF=ZUNF+1 .ENDM .MACRO ELSE EVAL ZT,=,ZIS,\ZISP EVAL BR,< >,ZI,\ZUNF EVAL ZI,\ZT,<:> EVAL ZIS,\ZISP,=,ZUNF ZUNF=ZUNF+1 .ENDM .MACRO ENDF EVAL ZT=ZIS,\ZISP EVAL ZI,\ZT,<:> ZISP=ZISP-1 .ENDM ;TO EXTEND THE POWER OF THE IF MACRO, TWO OTHER MACROS ARE ;INTRODUCED TO ALLOW COMPLEX LOGICAL EXPRESSIONS TO BE ;EVALUATED. ; CONDITION CODES SET ; OR COND ;OR PRODUCES A BCOND INTO THE NEXT IF TO BE OPEND ; CONDITION CODES SET ; AND COND ;AND PRODUCES A BNCOND TO THE END (OR ELSE) OF THE ENCLOSING IF ;AS AN EXAMPLE TO EVALUATE (A OR B) AND C YOU USE ; OR A ; IF B ; AND C .MACRO OR COND EVAL B,COND,< >,ZIB,\ZUNF .ENDM .MACRO AND COND EVAL ZT,=,ZIS,\ZISP EVAL BN,COND,< >,ZI,\ZT .ENDM ;HERE WE HAVE A LOOPING CONSTRUCT: ; LOOP ; STATEMENTS TO EXECUTE ; CONDITION CODES SET ; WHILE COND ;CONTROLE BRANCHS BACK TO THE LOOP, IF COND IS TRUE. ;IN ADDITION COND MAY HAVE THE FORM 'SOB,REG' IN WHICH CASE ;A SOB LOOP IS SET UP. .MACRO LOOP ZUNL=ZUNL+1 ZLSP=ZLSP+1 EVAL ZLS,\ZLSP,=ZUNL EVAL ZLB,\ZUNL,<:> .ENDM .MACRO WHILE COND,REG EVAL ZT=ZLS,\ZLSP .IF IDN,, EVAL SOB,< >,REG,<,>,ZLB,\ZT .IFF EVAL B,COND,< >,ZLB,\ZT .ENDC EVAL ZL,\ZT,<:> ZLSP=ZLSP-1 .ENDM ;HERE WE HAVE A MORE FLEXABLE LOOPING CONSTRUCT: ; LOOP ; STATEMENTS TO EXECUTE ; CONDITION CODES SET ; UNTIL COND ; STATEMENTS TO EXECUTE ; ENDL ;NOW CONTROLE ESCAPES THE LOOP AT UNTIL WHEN COND IS TRUE. ;THERE MAY BE MORE THAN ONE UNTIL IN THE LOOP ALLOWING ;ALTERNATE ESCAPE CRITEREA. .MACRO UNTIL COND EVAL ZT=ZLS,\ZLSP EVAL B,COND,< >,ZL,\ZT .ENDM .MACRO ENDL LONG .IF IDN,, EVAL ZT=ZLS,\ZLSP EVAL JMP,< >,ZLB,\ZT EVAL ZL,\ZT,<:> ZLSP=ZLSP-1 .IFF WHILE R .ENDC .ENDM ;NOW TO ADD MORE FLEXIBLE CONTROL OF EXECUTION WE ADD TWO ;MORE CONSTRUCTS THAT MAY APPEAR WITHIN A LOOP ; ENDOF NUM ; OUTOF NUM ;NUM IS THE NUMBER OF LEVELS, 0 MEANS THE CURRENT LOOP ;ENDOF BRANCHS BACK TO THE BIGINNING, AND OUTOF EXITS FROM ;THE SPECIFIED LOOP. .MACRO ENDOF NUM ZT=0 .IIF NB,,ZT=NUM ZT=ZLSP-ZT EVAL ZT=ZLS,\ZT EVAL BR,< >,ZLB,\ZT .ENDM .MACRO OUTOF NUM ZT=0 .IIF NB,,ZT=NUM ZT=ZLSP-ZT EVAL ZT=ZLS,\ZT EVAL BR,< >,ZL,\ZT .ENDM ;FINALLY WE HAVE A CASE CONSTRUCT ; REG FILLED WITH EVEN CHOICE INTEGER 0 2 4 6 ... ; CASET REG,NUM ; CASE 1 ; STATEMENTS ; CASE 2 ; STATEMENTS ; . ; . ; . ; CASE NUM ; STATEMENTS ; ENDC ;NUM IS THE NUMBER OF CASES, THE CASES CAN ACCURE IN ANY ORDER ;THE STATEMENTS THAT ARE EXECUTED FOR CASE N, ARE THOSE ;FROM THE CASE N STATEMENT TO THE NEXT CASE, OR ENDC STATEMENT .MACRO CASET REG,NUM ADD REG,PC ZUNC=ZUNC+1 ZCSP=ZCSP+1 EVAL ZCS,\ZCSP,=,ZUNC ZT=0 .REPT NUM ZT=ZT+1 EVAL BR,< >,ZC,\ZUNC,\ZT .ENDM .ENDM .MACRO CASE NUM,LONG EVAL ZT,=,ZCS,\ZCSP .IF IDN,, EVAL JMP,< >,ZC,\ZT,0 .IFF EVAL BR,< >,ZC,\ZT,0 .ENDC EVAL ZC,\ZT,NUM,<:> .ENDM .MACRO ENDC EVAL ZT=ZCS,\ZCSP EVAL ZC,\ZT,0,<:> ZCSP=ZCSP-1 .ENDM ;THESE CLUMBSY MACROS ALLOW THE NEGATION OF THE CONDITION ;NEEDED FOR IF. .MACRO BNR LAB ZT=ZT ;NOP IT DOESN'T SEEM TO WORK WITH NO STATEMENTS. .ENDM .MACRO BNEQ LAB BNE LAB .ENDM .MACRO BNNE LAB BEQ LAB .ENDM .MACRO BNPL LAB BMI LAB .ENDM .MACRO BNMI LAB BPL LAB .ENDM .MACRO BNVC LAB BVS LAB .ENDM .MACRO BNVS LAB BVC LAB .ENDM .MACRO BNCC LAB BCS LAB .ENDM .MACRO BNCS LAB BCC LAB .ENDM .MACRO BNGE LAB BLT LAB .ENDM .MACRO BNLT LAB BGE LAB .ENDM .MACRO BNGT LAB BLE LAB .ENDM .MACRO BNLE LAB BGT LAB .ENDM .MACRO BNHI LAB BLOS LAB .ENDM .MACRO BNLOS LAB BHI LAB .ENDM .MACRO BNHIS LAB BLO LAB .ENDM .MACRO BNLO LAB BHIS LAB .ENDM ;THIS POSITION INDEPENDENTLY LOADS THE ADDRESS LAB INTO REG. .MACRO LA LAB,REG MOV PC,REG ADD #LAB-.,REG .ENDM ;THESE INITIALIZE THE REGESTER NAMES, AND CERTAIN SYMBOLS USED ;BY THE ABOVE MACROS. ;UNIQUE NAME GENERATORS ZUNF=0 ZUNL=0 ZUNC=0 ;STACK PTRS ZISP=0 ZLSP=0 ZCSP=0 ;STACKS ;ZISXXX ;ZLSXXX ;ZCSXXX ;GENERATED LABELS ;ZIBXXX ;ZIXXX ;ZLBXXX ;ZLXXX ;ZCXXXN R0=%0 R1=%1 R2=%2 R3=%3 R4=%4 R5=%5 R6=%6 R7=%7 SP=%6 PC=%7 PSW=177776 SWR=177570 .LIST