XP tt n kQQX\noK @R-ZN-Z3!@lt!t!  #HJ #J',\K , , , b,\K X. .p ".S 209 29d39t:#f>4gMdSSZ ~Z-! ``*fZNf\g 4\g \g\K Xq|V[qM\q v@YzdYzPdT;}D~ ^ :": K  K P .MACRO BIOMAC? .MCALL SAVE,UNSAVE,CALL,RETURN,GETARG,PUTARG,NUMARG,GOBR,GOJMP> .MCALL GOBAK,PUTLBL,GETLBL,GENLBL,GENTST,PUTCSE,GETCSE,NUMELM= .MCALL WHILE,WHILEB,IF,IFB,AND,ANDB,OR,ORB,ELSE,FOR,CASE,END> .MCALL REPEAT,UNTIL,UNTILB,TASK,RESUME,PROC,LOOP,EXITU,EXITUB1 .MCALL HEAD,INDEX,SWAP,SWAPB,ENDCHK,COUNT,COUNT0.BKBGN=0.NEST=0.CASE=0 .MACRO BIOMAC.BKBGN=0.NEST=0.CASE=0 .ENDM BIOMAC .ENDM BIOMACP .MACRO BRANCH .MCALL BR0,BR1,BRL,JBR& BRL <,,,>( BRL <,,,> .MACRO BR0O .ENDM .MACRO BR1U .ENDM .MACRO BRLN .ENDM .MACRO BRANCH .ENDM .ENDM BRANCHIP .MACRO BR0 Y,N, .MACRO J'Y LOCE .IF LE LOC-<.+400>R .IF GE LOC-<.-376>, B'Y LOC .IIF NDF LOC, .WORD 240,240 .IF GT LOC-.T .WORD 240,240 .ENDC .MEXIT .ENDC .ENDC B'N .+6 JMP LOC .ENDM .ENDM@P .MACRO BR1 X,Y BR0 X,Y BR0 Y,X .ENDMHP .MACRO BRL XE .IRP Y,, BR1 Y .ENDR .ENDMP .MACRO JBR LOCA .IF LT LOC-<.+400>A .IF GE LOC-<.-376>A BR LOC .IIF NDF LOC, .WORD 240 .IF GT LOC-.A .WORD 240 .ENDC .MEXITR .ENDC .ENDC JMP LOC .ENDM JBRbP .MACRO SAVE X1,X2,X3,X4,X5,X6 .NARG .ARGN .IF EQ,.ARGNF MOV %0,-(%6)O MOV %1,-(%6)N MOV %2,-(%6). MOV %3,-(%6)B MOV %4,-(%6)C MOV %5,-(%6)M .MEXIT .ENDC MOV X1,-(%6), .IIF NB,X2,MOV X2,-(%6) .IIF NB,X3,MOV X3,-(%6) .IIF NB,X4,MOV X4,-(%6) .IIF NB,X5,MOV X5,-(%6) .IIF NB,X6,MOV X6,-(%6) .ENDM SAVEFfP .MACRO UNSAVE X1,X2,X3,X4,X5,X6 .NARG .ARGN .IF EQ,.ARGNG MOV (%6)+,%5D MOV (%6)+,%4. MOV (%6)+,%3 MOV (%6)+,%2C MOV (%6)+,%1 MOV (%6)+,%0 .MEXITA .ENDC .IIF NB,X6,MOV (%6)+,X6 .IIF NB,X5,MOV (%6)+,X5 .IIF NB,X4,MOV (%6)+,X4 .IIF NB,X3,MOV (%6)+,X3 .IIF NB,X2,MOV (%6)+,X2 MOV (%6)+,X1I .ENDM UNSAVEVP .MACRO CALL,NAME,ARGI .NARG .ARGN .IF NE,.ARGN-1X MOV #.+10,%5 .ENDC JSR PC,NAME .IF NE,.ARGN-1O NUMELM ARG. BR .+2+<.ARGN*2> .WORD ARG .ENDC .ENDM CALL,\P .MACRO RETURN N .IIF NB,N,MOV N*2(%5),(%6)+ RTS %7V .ENDM RETURNVNP .MACRO GETARG N,DEST MOV N*2(%5),DEST .ENDM GETARG JP .MACRO PUTARG N,SRC MOV SRC,N*2(%5) .ENDM PUTARG,BP .MACRO NUMARG X MOVB (%5),X .ENDM NUMARGS<P .MACRO GOBR,X1L BR .'X1 .ENDM GOBRNP .MACRO GOJMP,X1 .IF LE, .-<.'X1>-254. .IF GT, .-<.'X1>+256. BR .'X1 NOP .MEXIT .ENDC .ENDC JMP .'X1C .ENDM GOJMPpP .MACRO GOBAK,X1 .IF LE,.-<.'X1>-254.R BR .'X1 .IFFT JMP .'X1 .ENDC .ENDM GOBAKTP .MACRO PUTLBL,X1,X2,X3T .NST'X1=X2 .TYP'X1=X3 .ENDM PUTLBLNTP .MACRO GETLBL,X1,X2,X3 X2=.NST'X1 X3=.TYP'X1 .ENDM GETLBL%>P .MACRO GENLBL,X1.'X1:R .ENDM GENLBL 4P .MACRO GENTST X0,XARG,X1,X2,X3, .NCHR .COND,1 .IF GT,.COND-3. BIT'X0 X1,X3B .IF EQ,.COND-6E BEQ .+6 .IFFN BNE .+6 .ENDC .IFFJ .IF GT,XARG-1 .IF EQ,XARG-2 TST'X0 X1 .IFF. CMP'X0 X1,X3  .ENDC B'X2 .+6. .IFF. B'X1 .+6M .ENDC .ENDC .ENDM GENTSTRDP .MACRO PUTCSE,X1,X2 .CSL'X1=X2 .ENDM PUTCSEDP .MACRO GETCSE,X1,X2 X2=.CSL'X1 .ENDM GETCSEGxPE .MACRO NUMELM,X1,X2,X3,X4,X5,X6,X7,X8,X9,X10,X11,X12,X13,X14,X15,X16. .NARG .ARGN .ENDM NUMELM,P .MACRO WHILE,X1,X2,X3 .NEST=.NEST+1..BKBGN=.BKBGN+1B PUTLBL \.NEST,.BKBGN,0 GENLBL \.BKBGN. .NARG .ARGN GENTST <>,.ARGN,X1,X2,X3 GOJMP \<.BKBGN+4000> .ENDM WHILEP .MACRO WHILEB,X1,X2,X3. .NEST=.NEST+1.BKBGN=.BKBGN+1. PUTLBL \.NEST,.BKBGN,0X GENLBL \.BKBGNS .NARG .ARGN GENTST ,.ARGN,X1,X2,X3 GOJMP \<.BKBGN+4000>T .ENDM WHILEBP .MACRO IF,X1,X2,X36 .NEST=.NEST+11.BKBGN=.BKBGN+1, PUTLBL \.NEST,.BKBGN,2M .NARG .ARGN GENTST <>,.ARGN,X1,X2,X3, GOJMP \<.BKBGN+4000>. .ENDM IFKP .MACRO IFB,X1,X2,X3 .NEST=.NEST+1A.BKBGN=.BKBGN+1  PUTLBL \.NEST,.BKBGN,2P .NARG .ARGN GENTST ,.ARGN,X1,X2,X3 GOJMP \<.BKBGN+4000>X .ENDM IFBP .MACRO IFC A,COND,B,NUM .NARG .ARGN MOV #1,-(%6)S MOV %0,-(%6) MOV %1,-(%6)G MOV B,-(%6) MOV A,%0G MOV (%6)+,%1M .IF EQ,.ARGN-4 MOV NUM,-(%6) BEQ .+22X CMPB (%0)+,(%1)+ BGT .+22G BLT .+10B DEC (%6)K BNE .-10A BR .+6 DEC 6(%6) DEC 6(%6) TST (%6)+ .IFF+ TSTB (%0) BEQ .+14 CMPB (%0)+,(%1)+R BGT .+14, BEQ .-10N DEC 4(%6) DEC 4(%6) .ENDC MOV (%6)+,%1, MOV (%6)+,%0N TST (%6)+ IF COND .ENDM IFCvP .MACRO AND,X1,X2,X3 .NARG .ARGN GENTST <>,.ARGN,X1,X2,X3G GOJMP \<.BKBGN+4000> .ENDM ANDzP .MACRO ANDB,X1,X2,X3% .NARG .ARGN GENTST ,.ARGN,X1,X2,X3 GOJMP \<.BKBGN+4000> .ENDM ANDB%BP .MACRO OR,X1,X2,X3K.BKBGN=.BKBGN+1 GOBR \.BKBGN) GENLBL \<.BKBGN-1+4000> GETLBL \.NEST,.BKEND,.BKTYP .IF LE,.BKTYP PUTLBL \.NEST,.BKBGN,<.BKTYP-1> .IFF PUTLBL \.NEST,.BKBGN,.BKTYP .ENDC .NARG .ARGN GENTST <>,.ARGN,X1,X2,X3M GOJMP \<.BKBGN+4000> GENLBL \.BKBGN, .ENDM OR.BP .MACRO ORB,X1,X2,X3.BKBGN=.BKBGN+1 GOBR \.BKBGN GENLBL \<.BKBGN-1+4000> GETLBL \.NEST,.BKEND,.BKTYP .IF LE,.BKTYP PUTLBL \.NEST,.BKBGN,<.BKTYP-1> .IFFD PUTLBL \.NEST,.BKBGN,.BKTYP .ENDC .NARG .ARGN GENTST ,.ARGN,X1,X2,X3 GOJMP \<.BKBGN+4000> GENLBL \.BKBGNK .ENDM ORBP .MACRO ELSE.BKBGN=.BKBGN+1 GOJMP \<.BKBGN+4000>. GETLBL \.NEST,.BKEND,.BKTYP GENLBL \<.BKEND+4000> PUTLBL \.NEST,.BKBGN,3+ .ENDM ELSEB>P .MACRO FOR,X1,X2,X3,X4..BKBGN=.BKBGN+13 .NEST=.NEST+1+ MOV X2,X1 .NARG .ARGN .IF LE,.ARGN-3> DEC X1  .IFF. SUB X4,X1 .ENDC PUTLBL \.NEST,.BKBGN,1. GENLBL \.BKBGN .IF LE,.ARGN-3. INC X1G .IFFP ADD X4,X1 .ENDC CMP X1,X3 BLE .+6 GOJMP \<.BKBGN+4000>G .ENDM FORJP .MACRO CASE,X1,X2.BKBGN=.BKBGN+1L .NEST=.NEST+1G .CASE=.CASE+1. NUMELM X2 PUTCSE \.CASE,.ARGN PUTLBL \.NEST,.BKBGN,5D MOV X1,-(%6) BLE .+8.G CMP #.ARGN,(%6) BGE .+8. TST (%6)+ GOJMP \<.BKBGN+4000>B ASL (%6)+ ADD #.+10,(%6)+ MOV @(%6),(%6)A JMP @(%6)+F .WORD X2> .ENDM CASE.P .MACRO END,X1 GETLBL \.NEST,.BKEND,.BKTYP .NEST=.NEST-1A .IF LT,.NESTG" .ERROR ;TOO MANY 'END' STATEMENTS .MEXITE .ENDC .IF LE,.BKTYP GOBAK \<.BKEND+.BKTYP> GENLBL \<.BKEND+4000> .MEXITB .ENDC .IF EQ,.BKTYP-1 GOBAK \.BKEND GENLBL \<.BKEND+4000> .MEXITR .ENDC .IF LE,.BKTYP-3 GENLBL \<.BKEND+4000> .MEXITC .ENDC .IF EQ,.BKTYP-12 RTS %7+ .MEXIT\ .ENDC .IF EQ,.BKTYP-11 RTI .MEXIT+ .ENDC .IF EQ,.BKTYP-5 GETCSE \.CASE,.CASELN .IF EQ,.CASEL GENLBL \<.BKEND+4000> .CASE=.CASE-1E .MEXIT, .IFF .NEST=.NEST+1.CASEL=.CASEL-1. PUTCSE \.CASE,.CASELT GOJMP \<.BKEND+4000>N .MEXITL .ENDC .ENDC .ENDM ENDP .MACRO REPEAT,X1I.BKBGN=.BKBGN+1E .NEST=.NEST+1B PUTLBL \.NEST,.BKBGN,4E GENLBL \.BKBGNR .ENDM REPEATLP .MACRO UNTIL,X1,X2,X3 GETLBL \.NEST,.BKEND,.BKTYP .NEST=.NEST-1E .NARG .ARGN GENTST <>,.ARGN,X1,X2,X3. GOJMP \.BKEND GENLBL \<.BKEND+4000> .ENDM UNTILP .MACRO UNTILB,X1,X2,X3 GETLBL \.NEST,.BKEND,.BKTYP .NEST=.NEST-1+ .NARG .ARGN GENTST ,.ARGN,X1,X2,X3 GOJMP \.BKEND GENLBL \<.BKEND+4000> .ENDM UNTILB.P .MACRO COUNT X1 GETLBL \.NEST,.BKEND,.BKTYP .NEST=.NEST-1 COUNT0 X1,\.BKEND GENLBL \<.BKEND+4000> .ENDM COUNTP .MACRO COUNT0 X1,X2 .IF LT,.-<.'X2+125.>N .NTYPE .ARGN,X1 .IF EQ,.ARGN&70 SOB X1,.'X2 .MEXIT, .ENDC .ENDC DEC X1G .IF LE, .-<.'X2>-254. BNE .'X2 .IFF BEQ .+6 JMP .'X2I .ENDC .ENDM C0BP .MACRO LOOP GETLBL \.NEST,.BKEND,.BKTYP .NEST=.NEST-1, GOBAK \.BKEND GENLBL \<.BKEND+4000> .ENDM LOOPTP .MACRO EXITU X1,X2,X3 GETLBL \.NEST,.BKEND,.BKTYP .NARG .ARGN GENTST <>,.ARGN,X1,X2,X3B GOJMP \<.BKEND+4000>M .ENDM EXITUP .MACRO EXITUB X1,X2,X3- GETLBL \.NEST,.BKEND,.BKTYP .NARG .ARGN GENTST ,.ARGN,X1,X2,X3 GOJMP \<.BKEND+4000>X .ENDM EXITUB<BP .MACRO TASK,X1,X2.BKBGN=.BKBGN+1. .NEST=.NEST+1B PUTLBL \.NEST,.BKBGN,11 .NARG .ARGN .IIF GT,.ARGN-1,.SBTTL X1 X2N .LIST;;; ********TASK**********; ; * *;L; * X1 *; ; * *;X; **********************;;;;----------> INTERRUPT!;X1:S .NLISTN .ENDM TASKG8P .MACRO RESUME RTI .ENDM RESUME.$P .MACRO PROC,X1,X2.BKBGN=.BKBGN+1. .NEST=.NEST+1N PUTLBL \.NEST,.BKBGN,12 .NARG .ARGN .IIF GT,.ARGN-1,.SBTTL X1 X2 .LIST;;; ********PROC**********; ; * *;N; * X1 *;. ; * *;; **********************;X1:B .NLISTN .ENDM PROCP .MACRO HEAD,X1,X2 .NARG .ARGN .IIF GT,.ARGN-1,.SBTTL X1 X2* .LIST;;; **********************; ; * *;S; * X1 *;M ; * *;; **********************;;; .NLISTS .ENDM HEADdP .MACRO ENDCHK/ .IIF GT,.NEST,.ERROR ;TOO FEW 'END' STATEMENTSG .ENDM ENDCHKRP .MACRO INDEX OP1,OP2T .IF NB,OP2* MOV OP1,OP2 DEC OP2 ASL OP2 .MEXIT  .IFF. DEC OP1 ASL OP1 .ENDC .ENDM INDEXXP .MACRO SWAP X,Y MOV Y,-(%6) MOV X,Y MOV (%6)+,X .ENDM SWAP.`P .MACRO SWAPB X,Y MOVB Y,-(%6)* MOVB X,Y* MOVB (%6)+,X* .ENDM SWAPBNP .MACRO MOVC SRC,DST,NUM .NARG .ARGN MOV %0,-(%6)H MOV %1,-(%6) MOV DST,-(%6) MOV SRC,%0 MOV (%6)+,%1  .IF EQ,.ARGN-3A MOV NUM,-(%6) BEQ .+8. .ENDC MOVB (%0)+,(%1)+E .IF EQ,.ARGN-3N DEC (%6)V BNE .-4 TST (%6)+ .IFF BNE .-2 .ENDC MOV (%6)+,%1O MOV (%6)+,%0N .ENDM MOVCLP .MACRO MOVW SRC,DST,NUM .NARG .ARGN MOV %0,-(%6)N MOV %1,-(%6) MOV DST,-(%6) MOV SRC,%0 MOV (%6)+,%1* .IF EQ,.ARGN-3V MOV NUM,-(%6) BEQ .+8. .ENDC MOV (%0)+,(%1)+ .IF EQ,.ARGN-3. DEC (%6) BNE .-4 TST (%6)+ .IFF BNE .-2 .ENDC MOV (%6)+,%1M MOV (%6)+,%0. .ENDM MOVWAP .MACRO PRINT BUFF,LEN,CCW ; ;8; THIS MACRO ALLOWS PRINTING OF OUTPUT BUFFERS USING A ;#; COMMON OUTPUT ROUTINE, $OUT. ;M ; ;7; IF ONLY THE BUFFER IS SPECIFIED, THEN IT IS ASSUMED ;M5; THAT A LABEL HAS BEEN DEFINED WITH THE ADDRESS OF ;T9; THE LABEL WITH AN "S" APPENDED TO INDICATE THE LENGTH ;V6; IN THIS CASE, ONLY THE LABEL NEED BE PASSED AS THE ;$; ARGUMENT, WITH NO # REQUIRED. ; ; ;; PRINT LABEL ; ; ;7; THE SECOND CASE INVOLVES PASSING THE BUFFER ADDRESS ;R2; AND THE LENGTH AS REQUIRED ARGUMENTS, AND THE ;3; CARRIAGE CONTROL WORD AS AN OPTIONAL ARGUMENT. ;U ; ;-; PRINT #BUFFER,#LENGTH[,#CARRIAGE_CONROL] ; ; ; .IF B LEN MOV #40,-(SP) MOV #BUFF'S,-(SP) MOV #BUFF,-(SP) CALL $OUT .MEXITE .ENDC .IF B CCW CLR -(SP) .IFFL MOV CCW,-(SP) .ENDC MOV LEN,-(SP) MOV BUFF,-(SP)S CALL $OUT .ENDM PRINTO # REQUIRED. ; ; ;; PRINT LABEL ; ; ;7; THE SECOND CASE INVOLVES PASSING THE BUFFER ADDRESS ;R2; AND THE LENGTH AS REQUIRED ARGUMENTS, AND THE ;3; CARRIAGE CONTROL WORD AS AN OPTIONAL ARGUMENT. ;U ; ;-; PRINT #BUFFER,#LENGTH[,#CARRIA