; cmp ti:=dsmac.mac,[macros2] ; ; ALTERED: ; EDWIN H. MARISON 11 MAY 1976 15:39 ; SERGE I. GUZEW 12 DEC 1992 20:30 ; SERGE I. GUZEW 10 MAR 2019 14:02 ; SERGE I. GUZEW 26 FEB 2022 20:06 ; ; STRUCTURED PROGRAMMING MACROS ; ; ** SUPMAC ** ; ; V80 ; ; ; .SP. ; Stack pointer ; ; $O$ ; .OR operator flag - Cleared in IF ; ; Setted in .OR ; $I$ ; .IFOPR operator flag - Cleared at beginning IF and .GENBR, ; ; Setted in .IFOPR (.GENBR called .IFOPR) ; .MACRO ...... .ENDM ...... .MACRO ..INIT $SUPMC=80. ; SUPMAC macros version $DIDDO=0 .EF.=0 .L.=0 ; 0-? 1-UNTIL 2-LEAVE 3-GOTO 4-CONTINUE $T=1 ; Starting label for loop operators ..L=1 ; Starting label number for IF operator $R=-1 ..INPR=0 ; In procedure now flag ..INMD=0 ; In module now flag .SP.=-1 .ENDM ..INIT .MACRO ..PUSH A1, A2 .SP.=.SP.+1 .IRP TT, \.SP. ..T'TT' = 'A1' ; TYPS 0-IF,OR 1-WHILE 2-FOR 3-BEGIN 4-CASE 5-REPEAT 6-THRU 7-LOOP 8-MODULE 9-ELSIF ..L'TT' = 'A2' ; LBLS .ENDR .ENDM ..PUSH .MACRO ..POP A1, A2 .IF LT .SP. .LIST .ERROR ; Stack exchausted $Y$=.SP. .NLIST .MEXIT .IFF .IRP TT, \.SP. 'A1' = ..T'TT' ; TYPS 0-IF,OR 1-WHILE 2-FOR 3-BEGIN 4-CASE 5-REPEAT 6-THRU 7-LOOP 8-MODULE 9-ELSIF 'A2' = ..L'TT' ; LBLS .ENDR .ENDC .SP.=.SP.-1 .ENDM ..POP .MACRO ..GET PPP, A1, A2 .IRP TT, \'PPP' 'A1' = ..T'TT' ; TYPS 0-IF,OR 1-WHILE 2-FOR 3-BEGIN 4-CASE 5-REPEAT 6-THRU 7-LOOP 8-MODULE 9-ELSIF 'A2' = ..L'TT' ; LBLS .ENDR .ENDM ..GET ................................................................................ .MACRO .EMIT VAL $E$=1 .NLIST .LIST ME .LIST 'VAL' .NLIST .NLIST ME .LIST .ENDM .EMIT .MACRO .EMITL VAL, BASE .IF NB .NLIST .LIST ME .LIST 'VAL' =: .- .NLIST .NLIST ME .LIST .IFF .NLIST .LIST ME .LIST 'VAL': .NLIST .NLIST ME .LIST .ENDC .ENDM .EMITL .MACRO .EMITR S1, S2 .EMIT <'S1'> .IIF GT 'S2'-1 .EMITR <'S1'>, \'S2'-1 .ENDM .EMITR .MACRO ..TAG TG, WH .EMITL <'TG''WH'$> .ENDM ..TAG .MACRO ..BRAN BRA, TG, WH .EMIT <'BRA' 'TG''WH'$> .ENDM ..BRAN ................................................................................ .MACRO MODULE NAME, MNAME, REL, VER, LIBR, COMM, WAUDIT, TYPE= .IF NE ..INMD .ERROR ; Nested MODULEs not implemented .MEXIT .ENDC .IF B .ERROR ; Blank MODULE name .MEXIT .ENDC ; ; Module <'NAME'> ; .IF DF R$$T11 .MCALL .MODULE .IF B .IF B .IF B .IF B .MODULE <'NAME'>, MODNAME=<'NAME'>, AUDIT=<'WAUDIT'>, COMMENT=<'COMM'> .IFF .MODULE <'NAME'>, MODNAME=<'NAME'>, LIB=<'LIBR'>, AUDIT=<'WAUDIT'>, COMMENT=<'COMM'> .ENDC .IFF .IF B .MODULE <'NAME'>, MODNAME=<'NAME'>, VERSION=<'VER'>, AUDIT=<'WAUDIT'>, COMMENT=<'COMM'> .IFF .MODULE <'NAME'>, MODNAME=<'NAME'>, VERSION=<'VER'>, LIB=<'LIBR'>, AUDIT=<'WAUDIT'>, COMMENT=<'COMM'> .ENDC .ENDC .IFF .IF B .IF B .MODULE <'NAME'>, MODNAME=<'NAME'>, RELEASE=<'REL'>, AUDIT=<'WAUDIT'>, COMMENT=<'COMM'> .IFF .MODULE <'NAME'>, MODNAME=<'NAME'>, RELEASE=<'REL'>, LIB=<'LIBR'>, AUDIT=<'WAUDIT'>, COMMENT=<'COMM'> .ENDC .IFF .IF B .MODULE <'NAME'>, MODNAME=<'NAME'>, RELEASE=<'REL'>, VERSION=<'VER'>, AUDIT=<'WAUDIT'>, COMMENT=<'COMM'> .IFF .MODULE <'NAME'>, MODNAME=<'NAME'>, RELEASE=<'REL'>, VERSION=<'VER'>, LIB=<'LIBR'>, AUDIT=<'WAUDIT'>, COMMENT=<'COMM'> .ENDC .ENDC .ENDC .IFF .IF B .IF B .IF B .MODULE <'NAME'>, MODNAME=<'MNAME'>, AUDIT=<'WAUDIT'>, COMMENT=<'COMM'> .IFF .MODULE <'NAME'>, MODNAME=<'MNAME'>, LIB=<'LIBR'>, AUDIT=<'WAUDIT'>, COMMENT=<'COMM'> .ENDC .IFF .IF B .MODULE <'NAME'>, MODNAME=<'MNAME'>, VERSION=<'VER'>, AUDIT=<'WAUDIT'>, COMMENT=<'COMM'> .IFF .MODULE <'NAME'>, MODNAME=<'MNAME'>, VERSION=<'VER'>, LIB=<'LIBR'>, AUDIT=<'WAUDIT'>, COMMENT=<'COMM'> .ENDC .ENDC .IFF .IF B .IF B .MODULE <'NAME'>, MODNAME=<'MNAME'>, RELEASE=<'REL'>, AUDIT=<'WAUDIT'>, COMMENT=<'COMM'> .IFF .MODULE <'NAME'>, MODNAME=<'MNAME'>, RELEASE=<'REL'>, LIB=<'LIBR'>, AUDIT=<'WAUDIT'>, COMMENT=<'COMM'> .ENDC .IFF .IF B .MODULE <'NAME'>, MODNAME=<'MNAME'>, RELEASE=<'REL'>, VERSION=<'VER'>, AUDIT=<'WAUDIT'>, COMMENT=<'COMM'> .IFF .MODULE <'NAME'>, MODNAME=<'MNAME'>, RELEASE=<'REL'>, VERSION=<'VER'>, LIB=<'LIBR'>, AUDIT=<'WAUDIT'>, COMMENT=<'COMM'> .ENDC .ENDC .ENDC .ENDC .IFF ;.IF DF R$$11M .IF NB .TITLE 'MNAME' - 'COMM' .IFF .TITLE 'NAME' - 'COMM' .ENDC .IDENT /'REL'.'VER'/ .MACRO .NLCSI TYP=Z, PART=ALL .IF IDN .ASCI'TYP' "'MODULE' 'REL'.'VERSION' " .ENDC .IF IDN .ASCI'TYP' "'MODULE'" .ENDC .IF IDN .ASCI'TYP' "'REL'.'VERSION' " .ENDC .IF IDN .ASCI'TYP' "'MODULE'-" .ENDC .ENDM .NLCSI ;.ENDC .ENDC .MACRO .MCHCK NAM .IIF DIF <'NAM'>,<'NAME'> .ERROR ; Different MODULE name .ENDM .MCHCK .ENABL LC .DSABL GBL .NLIST LD .NLIST TTM ..INIT ; Stack initialization RB = %5 ; %5 used as BASE pointer .IF NB TYPE 'TYPE' $ORDER .ENDC ..PUSH 8., ..L ..PUSH 8., $T ..L=^O<100> $T= ^O<100> ..INMD=1 .ENDM MODULE .MACRO FROM M, I, A, B, C, D, E, F, G, H, J, K, L, N, O, P, Q, R, S, T, U, V, W, X, Y, Z .IF DIF <'I'>, .ERROR ; 'I' - must be IMPORT .MEXIT .ENDC .EMIT <;> .EMIT <; IMPORT from MODULE <'M'>> .EMIT <;> .IF IDN <'M'>, .EMIT <.MCALL A B C D E F G H J K L N O P Q R S T U V W X Y Z> .IFF .IF IDN <'M'>, .EMIT <.MCALL A B C D E F G H J K L N O P Q R S T U V W X Y Z> .IFF .EMIT <.GLOBL A B C D E F G H J K L N O P Q R S T U V W X Y Z> .ENDC .ENDC .ENDM FROM .MACRO EXPORT Q, A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, R, S, T, U, V, W, X, Y, Z .IF DIF <'Q'>, .ERROR ; EXPORT only QUALIFIED - 'Q' .MEXIT .ENDC .EMIT <;> .EMIT <; MODULE EXPORT> .EMIT <;> .EMIT <.GLOBL A B C D E F G H I J K L M N O P R S T U V W X Y Z> .ENDM EXPORT ................................................................................ .MACRO PROCEDURE NAME, BASE, EXT ; ; PROCEDURE 'NAME' ; .IF NE ..INPR .ERROR ; Nested PROCEDURE not implemented .MEXIT .ENDC .IF B .ERROR ; Blank PROCEDURE name .MEXIT .ENDC .SAVE $CODE .EMITL <'NAME'>, <'BASE'> .MACRO .PCHCK NAM .IIF DIF <'NAM'>, <'NAME'> .ERROR ; Different PROCEDURE name .ENDM .PCHCK ..INPR=1 .RESTORE .ENDM PROCEDURE .MACRO ENTRY NAME, BASE, EXT .IF EQ ..INPR .ERROR ; ENTRY only in PROCEDURE .MEXIT .ENDC .IF B .ERROR ; Blank ENTRY name .MEXIT .ENDC .SAVE $CODE .EMITL <'NAME'>, <'BASE'> .RESTORE .ENDM ENTRY .MACRO BEGIN .IIF EQ ..INPR .ERROR ; BEGIN only for PROCEDURE at least now $CODE ..PUSH 3, ..L ..PUSH 3, $T ..L=^O<100> $T= ^O<100> .ENABL LSB .ENDM BEGIN .MACRO RETURN STA, REG, A, BE, C, D, E, F, G, H, I, J, K, LL, M, N, O, P, Q, R, S, TE .IF NB STA .IF DIF , .IF DIF , .IF DIF , .IF IDN , .EMIT .EMIT .IFF .EMIT .EMIT .ENDC .IFF .EMIT .ENDC .IFF .EMIT .ENDC .ENDC .ENDC .IIF B .EMIT .IIF NB .EMIT .ENDM RETURN .MACRO $CALL NAME, ARGS, WHERE, TYPE, A, BB, C, D, E, F, G, H, I, J, K, LL, M, N, O, P, Q, RR, S ; Note: **** WHERE and TYPE not implemented **** .IIF B .EMIT .IIF B .MEXIT .IF NB WHERE .ERROR ; WHERE .... ARGUMENTs must be blank .MEXIT .ENDC .$T=0 .MACRO $GENM BBT, BBP .IIF GT BBP-5 .ERROR ; 6 arguments max (R0-R5) .IIF GT BBP-5 .MEXIT .IIF DIF <%'BBP> .EMIT .ENDM $GENM .IRP T, .IIF NB $GENM T, \.$T .$T=.$T+1 .ENDR .EMIT .ENDM $CALL ................................................................................ .MACRO RNE LOC .EMIT .ENDM RNE .MACRO REQ LOC .EMIT .ENDM REQ .MACRO RLT LOC .EMIT .ENDM RLT .MACRO RGE LOC .EMIT .ENDM RGE .MACRO RGT LOC .EMIT .ENDM RGT .MACRO RLE LOC .EMIT .ENDM RLE .MACRO RPL LOC .EMIT .ENDM RPL .MACRO RMI LOC .EMIT .ENDM RMI .MACRO RHI LOC .EMIT .ENDM RHI .MACRO RLOS LOC .EMIT .ENDM RLOS .MACRO RHIS LOC .EMIT .ENDM RHIS .MACRO RLO LOC .EMIT .ENDM RLO .MACRO RCS LOC .EMIT .ENDM RCS .MACRO RCC LOC .EMIT .ENDM RCC ................................................................................ .MACRO .IFOPR OPRA, RELA, TTG .EMIT 'OPRA' .IF GT $R .IIF EQ .L. .EMIT ; ? .IIF EQ .L.-1 .EMIT ; UNTIL .IIF EQ .L.-2 .EMIT ; LEAVE .IIF EQ .L.-3 .EMIT ; GOTO .IIF EQ .L.-4 .EMIT ; LEAVE .IFF .IIF EQ .L. R'RELA 'TTG'3$ ; ? .IIF EQ .L.-1 R'RELA 'TTG'1$ ; UNTIL .IIF EQ .L.-2 R'RELA 'TTG'2$ ; LEAVE .IIF EQ .L.-3 R'RELA TTG ; GOTO .IIF EQ .L.-4 R'RELA 'TTG'1$ ; LEAVE .ENDC ..PUSH 0, $T $I$=1 .ENDM .IFOPR .MACRO .IS Q1, Q2, QB, QT .IIF DIF , .ERROR ; IF syntax error : Q1 is .IIF IDN , .IFOPR <<.=.>>, Q2, QT .ENDM .IS .MACRO .GENBR A1, B1, C1, D1, E1 $I$=0 .IIF IDN .IFOPR <>, NE, E1 .IIF IDN .IFOPR <>, EQ, E1 .IIF IDN <#0> .IFOPR <>, B1, E1 .IIF IDN <#0> .IFOPR <>, B1, E1 .IIF IDN .IS A1, C1, D1, E1 .IIF EQ $I$ .IFOPR <>, B1, E1 .ENDM .GENBR ................................................................................ .MACRO .OPADD V1, V2, V3 .IIF IDN <#0> .EMIT <> .IIF NE $E$ .MEXIT .IIF IDN <#1> .EMIT .IIF NE $E$ .MEXIT .IIF IDN .EMIT .IIF NE $E$ .MEXIT ; .EMIT .EMIT .ENDM .OPADD .MACRO .OPSUB V1, V2, V3 .IIF IDN <#0> .EMIT <> .IIF NE $E$ .MEXIT .IIF IDN <#1> .EMIT .IIF NE $E$ .MEXIT .IIF IDN .EMIT .IIF NE $E$ .MEXIT ; .EMIT .EMIT .ENDM .OPSUB ................................................................................ .MACRO .ARITH Y1, Y2, Y3, Y4 .IIF IDN , <-(%6)> .ARITH @%6, Y2, Y3, Y4 .IIF IDN , <-(%6)> .MEXIT .IIF IDN <+>, .OPADD Y1, Y2, Y3 .IIF IDN <->, .OPSUB Y1, Y2, Y3 .IIF NE $E$ .MEXIT .IIF IDN , .EMIT .IIF IDN , .EMIT .IIF NE $E$ .MEXIT .IIF IDN , .EMIT .IIF IDN , .EMIT .IIF NE $E$ .MEXIT .IIF IDN , .EMITR , Y2 .IIF IDN , .EMITR , Y2 .IIF IDN , .EMITR , Y2 .IIF IDN , .EMITR , Y2 .IIF NE $E$ .MEXIT .IIF IDN <*>, .EMIT .IIF IDN , .EMIT
.IIF IDN , .EMIT .IIF IDN , .EMIT .IIF NE $E$ .MEXIT .IIF IDN , .EMIT .IIF EQ $E$ .ERROR ; Invalid operation Y4 .ENDM .ARITH .MACRO .SIMPLE X1, X2, X3, X4, X5, X6 .IF DIF , <:=> .IF DIF , <:W=> .IF DIF , <:==> .IF DIF , <:B=> .ERROR ; X2 Invalid assign operator .MEXIT .ENDC .ENDC .SIMPLE X1, <:=>, X3, X4, X5, B .MEXIT .ENDC .ENDC .IIF IDN , .SIMPLE -(%6), X2, X3, X4, X5, X6 .IIF IDN , .MEXIT .IIF IDN , .SIMPLE @%6, X2, X3, X4, X5, X6 .IIF IDN , .MEXIT $Y$=0 $Z$=0 .IIF IDN , $Z$=-1 .IIF IDN , $Z$=-1 .IIF IDN , $Z$=-2 .IIF IDN , $Y$=7 .IIF IDN , $Y$=7 .IIF IDN , $Y$=7 .IIF IDN <0>, $Y$=7 .IIF IDN <#0>, $Y$=7 .IIF IDN , $Y$=4 .IIF IDN , $Y$=4 .IIF IDN , $Y$=4 .IF LT $Z$ .IIF EQ $Z$+$Y$-6 .EMIT .IIF EQ $Z$+$Y$-5 .EMIT .IIF EQ $Z$+$Y$-3 .EMIT .IIF EQ $Z$+$Y$-2 .EMIT .MEXIT .ENDC .IIF IDN , $Y$=-1 .IIF IDN <->, $Y$=-2 .IIF IDN , $Y$=5 .IIF IDN , $Y$=6 .IIF IDN , $Y$=10 .IF DIF , .IIF EQ $Y$-7 .EMIT .IF DIF <@%6>, .IIF EQ $Y$-6 .EMIT .ENDC .IIF EQ $Y$-5 .EMIT .IIF EQ $Y$-4 .EMIT .IIF EQ $Y$ .EMIT .ENDC .IF DIF .IIF LT $Y$ .EMIT .ENDC .IIF IDN <+1> $Y$=-5 .IIF IDN <-1> $Y$=-6 .IF LT $Y$ .IIF EQ $Y$+1 .EMIT .IIF EQ $Y$+2 .EMIT .IIF EQ $Y$+3 .EMIT .IIF EQ $Y$+4 .EMIT .IIF EQ $Y$+5 .EMIT .IIF EQ $Y$+6 .EMIT .MEXIT .ENDC .IIF B .MEXIT .IIF IDN .MEXIT .IIF IDN .MEXIT $E$=0 .IIF IDN .ARITH X1, @%6, X6, X4 .IIF IDN .ARITH X1, (%6)+, X6, X4 .IIF EQ $E$ .ARITH X1, X5, X6, X4 .ENDM .SIMPLE .MACRO LET A, BE, C, D, EE, F, G, H, I, J, K, LL, M, N, O, P, Q, R, S, TE, U, V .SIMPLE A, BE, C, D, EE .IIF B .MEXIT .IIF B .MEXIT .IIF B .MEXIT .IIF IDN , LET EE, F, G, H, I, J, K, LL, M, N, O, P, Q, R, S, TE, U, V .IIF IDN , .MEXIT .IIF IDN , LET F, G, H, I, J, K, LL, M, N, O, P, Q, R, S, TE, U, V .IIF IDN , .MEXIT .IIF IDN , LET G, H, I, J, K, LL, M, N, O, P, Q, R, S, TE, U, V .IIF IDN , .MEXIT .IF LT $Y$ LET A, BE, A, EE, F, G, H, I, J, K, LL, M, N, O, P, Q, R, S, TE, U, V .MEXIT .ENDC LET A, BE, A, F, G, H, I, J, K, LL, M, N, O, P, Q, R, S, TE, U, V .ENDM LET ................................................................................ .MACRO $SET$L$ BBB $K$L=-1 $K$=-1 .IF LT BBB .ERROR ; Not at cycle block .MEXIT .ENDC ..GET BBB, $K$T, $K$L $XXX$ = 0 .IIF EQ $K$T-1 $XXX$ = 1 ;WHILE .IIF EQ $K$T-2 $XXX$ = 1 ;FOR .IIF EQ $K$T-5 $XXX$ = 1 ;REPEAT .IIF EQ $K$T-6 $XXX$ = 1 ;THRU .IIF EQ $K$T-7 $XXX$ = 1 ;LOOP .IIF EQ $XXX$ $SET$L$ BBB-1 $K$=$K$L .ENDM $SET$L$ .MACRO JUMPTO AAAA, A, BB, C, D, E, F, H, G, I, J, K, L, M, N, O, P, Q, R, S, T, U .IIF B .MEXIT .EMIT .ENDM JUMPTO .MACRO GOTO BBBB, A, BB, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U .IIF B .MEXIT .EMIT
.ENDM GOTO .MACRO .GOTO GA, GB, GC, GD, GEE .L.=3 ; 0-? 1-UNTIL 2-LEAVE 3-GOTO 4-CONTINUE $R=-$R .GENBR GA, GB, GC, GD, GEE ..POP $$TT, $$TT $R=-$R .L.=0 .ENDM .GOTO .MACRO ON.NOERROR A, BE, C, D, EE, F, G, H, I, J, K, LL, M, N, O, P, Q, R, S IF RESULT, IS, CC, A, BE, C, D, EE, F, G, H, I, J, K, LL, M, N, O, P, Q, R, S .ENDM ON.NOERROR .MACRO ON.ERROR A, BE, C, D, EE, F, G, H, I, J, K, LL, M, N, O, P, Q, R, S IF RESULT, IS, CS, A, BE, C, D, EE, F, G, H, I, J, K, LL, M, N, O, P, Q, R, S .ENDM ON.ERROR .MACRO IFB A, BE, C, D, EE, F, G, H, I, J, K, LL, M, N, O, P, Q, R, S, TE, U, V, W, X, Y, Z IF A, BE, C, D, EE, F, G, H, I, J, K, LL, M, N, O, P, Q, R, S, TE, U, V, W, X, Y, Z, B .ENDM IFB .MACRO IF A, BE, C, D, EE, F, G, H, I, J, K, LL, M, N, O, P, Q, R, S, TE, U, V, W, X, Y, Z, BB .IIF B
.MEXIT $O$=0 ; .OR operator flag - Cleared in IF ; Setted in .OR $I$=0 ; .IFOPR operator flag - Cleared at beginning IF and .GENBR, ; Setted in .IFOPR (.GENBR called .IFOPR) .IF IDN .IIF NB .LEAVE A, BE, C, BB, EE .ENDC .IIF NE $I$ .MEXIT .IF IDN .IIF NB .CONTINUE A, BE, C, BB, EE .ENDC .IIF NE $I$ .MEXIT .IF IDN .IIF NB .GOTO A, BE, C, BB, EE .ENDC .IIF NE $I$ .MEXIT .IIF IDN , .OR A, BE, C, BB .IIF IDN , .OR A, BE, C, BB .IF EQ $O$ .IIF EQ .L.-1 .GENBR A, BE, C, BB, \$T2 ; 1-UNTIL .IIF NE .L.-1 .GENBR A, BE, C, BB, \$T ; not UNTIL .ENDC $T=$T+1 .IIF B , .MEXIT D EE, F, G, H, I, J, K, LL, M, N, O, P, Q, R, S, TE, U, V, W, X, Y, Z .IIF LE $DIDDO .MEXIT ..POP $$T, $$T ..TAG \$$T, 3 $DIDDO=$DIDDO-1 .ENDM IF ; ; ELSIF(B) not implemented for now ; .MACRO ELSIFB A, BE, C, D, EE, F, G, H, I, J, K, LL, M, N, O, P, Q, R, S, TE, U, V, W, X, Y, Z ELSIF A, BE, C, D, EE, F, G, H, I, J, K, LL, M, N, O, P, Q, R, S, TE, U, V, W, X, Y, Z, B .ENDM ELSIFB .MACRO ELSIF A, BE, C, D, EE, F, G, H, I, J, K, LL, M, N, O, P, Q, R, S, TE, U, V, W, X, Y, Z, BB ..POP $T1, $T2 .IF EQ $T1 ..BRAN BR, \$T, 3 ..TAG \$T2, 3 ..PUSH 0, $T $T=$T+1 ..PUSH 9., $T $T=$T+1 IF A, BE, C, D, EE, F, G, H, I, J, K, LL, M, N, O, P, Q, R, S, TE, U, V, W, X, Y, Z, BB .MEXIT .ENDC .IF EQ $T1-9. ..POP $T3, $T4 .IF NE $T3 .ERROR ; $T3 ELSIF discovered after ELSE .ENDC ..BRAN BR, \$T4, 3 ..TAG \$T2, 3 IF A, BE, C, D, EE, F, G, H, I, J, K, LL, M, N, O, P, Q, R, S, TE, U, V, W, X, Y, Z, BB .MEXIT .ENDC .ERROR ; $T1 ELSIF discovered not in IF operator ..PUSH $T1, $T2 .ENDM ELSIF .MACRO ANDB EE, F, G, H, I, J, K, LL, M, N, O, P, Q, R, S, TE, U, V, W, X, Y, Z AND EE, F, G, H, I, J, K, LL, M, N, O, P, Q, R, S, TE, U, V, W, X, Y, Z, B .ENDM ANDB .MACRO AND EE, F, G, H, I, J, K, LL, M, N, O, P, Q, R, S, TE, U, V, W, X, Y, Z, BB .IIF B .MEXIT $$S=0 .IIF IDN , , $$S=1 .IIF IDN , , $$S=1 .IF GT $$S ..POP $$T, $$T IF'BB EE, F, G, H ..TAG \$$T, 3 H I, J, K, LL, M, N, O, P, Q, R, S, TE, U, V, W, X, Y, Z .IFF ..POP $T, $T IF'BB EE, F, G, H, I, J, K, LL, M, N, O, P, Q, R, S, TE, U, V, W, X, Y, Z $$S=0 .IIF IDN , , $$S=1 .IIF IDN , , $$S=1 .IF NE $$S ..TAG \$T, 3 $T=$T+1 .ENDC .ENDC .ENDM AND .MACRO ORB EE, F, G, H, I, J, K, LL, M, N, O, P, Q, R, S, TE, U, V, W, X, Y, Z OR EE, F, G, H, I, J, K, LL, M, N, O, P, Q, R, S, TE, U, V, W, X, Y, Z, B .ENDM ORB .MACRO OR EE, F, G, H, I, J, K, LL, M, N, O, P, Q, R, S, TE, U, V, W, X, Y, Z, BB .IIF B .MEXIT .IIF IDN ..POP $T1, $T .IIF IDN ..POP $T1, $T IF'BB EE, F, G, H .IF DIF .IF DIF ..POP $$TT, $$TT ..POP $$T, $$T $$S=0 .IIF IDN , $$S=1 .IIF IDN , $$S=1 .IIF IDN , $$S=2 .IIF IDN , $$S=2 .IF NE $$S .IF EQ, $$S-1 ..PUSH 0, $$TT ..TAG \$$T, 3 .ERROR ; AND (ANDB) discovered after OR (ORB) .MEXIT .ENDC ..TAG \$$T, 3 THEN H, I, J, K, LL, M, N, O, P, Q, R, S, TE, U, V, W, X, Y, Z .IFF ..TAG \$$T, 3 .IIF B ..PUSH 0, $$TT .IIF B .MEXIT H I, J, K, LL, M, N, O, P, Q, R, S, TE, U, V, W, X, Y, Z .ENDC .IF LE $DIDDO ..PUSH 0, $$TT .IFF ..TAG \$$TT, 3 $DIDDO=0 .ENDC .MEXIT .ENDC .ENDC H I, J, K, LL, M, N, O, P, Q, R, S, TE, U, V, W, X, Y, Z .ENDM OR .MACRO .OR OA, OB, OC, OD $R=-$R $O$=1 $SV$=.L. .L.=0 ; 0-? 1-UNTIL 2-LEAVE 3-GOTO 4-CONTINUE .IIF NE .L.-1 .GENBR OA, OB, OC, OD, \$T ; .IIF EQ .L.-1 .GENBR OA, OB, OC, OD, \$T2 ; ?? .L.=$SV$ $R=-$R .ENDM .OR .MACRO THEN EE, F, G, H, I, J, K, LL, M, N, O, P, Q, R, S, TE, U, V, W, X, Y, Z .IIF B .MEXIT EE F, G, H, I, J, K, LL, M, N, O, P, Q, R, S, TE, U, V, W, X, Y, Z $DIDDO=$DIDDO+1 .ENDM THEN .MACRO ELSE ..POP $T1, $T2 .IF NE $T1 .ERROR ; $T1 ELSE discovered not in IF operator ..PUSH $T1, $T2 .MEXIT .ENDC ..BRAN BR, \$T, 3 ..TAG \$T2, 3 ..PUSH $T1, $T $T=$T+1 .ENDM ELSE ................................................................................ .MACRO LEAVE AAAA, A, BB, C, D, EE, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U .IIF B .MEXIT .IIF IDN , $SET$L$ .SP. .IIF DIF , $K$=AAAA .IRP QQ, \$K$ .EMIT
.ENDM .ENDM LEAVE .MACRO CONTINUE AAAA, A, BB, C, D, EE, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U .IIF B .MEXIT .IIF IDN , $SET$L$ .SP. .IIF DIF , $K$=AAAA .IRP QQ, \$K$ .EMIT
.ENDM .ENDM CONTINUE .MACRO .LEAVE LA, LB, LC, LD, LE .L.=2 ; 0-? 1-UNTIL 2-LEAVE 3-GOTO 4-CONTINUE .IIF IDN , $SET$L$ .SP. .IIF DIF , $K$=LE $R=-$R .GENBR LA, LB, LC, LD, \$K$ ..POP $$TT, $$TT $R=-$R .L.=0 .ENDM .LEAVE .MACRO .CONTINUE LA, LB, LC, LD, LE .L.=4 ; 0-? 1-UNTIL 2-LEAVE 3-GOTO 4-CONTINUE .IIF IDN , $SET$L$ .SP. .IIF DIF , $K$=LE ; ?????? $R=-$R .GENBR LA, LB, LC, LD, \$K$ ..POP $$TT, $$TT $R=-$R .L.=0 .ENDM .CONTINUE .MACRO WHILEB A, BE, C, D, EE, F, G, H, I, J, K, LL, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z WHILE A, BE, C, D, EE, F, G, H, I, J, K, LL, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z, B .ENDM WHILEB .MACRO WHILE A, BE, C, D, EE, F, G, H, I, J, K, LL, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z, BB $DIDDO=-1 ..TAG \..L, 1 IF A, BE, C, D, EE, F, G, H, I, J, K, LL, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z, BB .IF EQ $DIDDO ..BRAN BR, \..L, 1 ..POP $$T, $$T ..TAG \$$T, 3 .IFF ..PUSH 1, ..L .ENDC $DIDDO=0 ..L=..L+1 .ENDM WHILE .MACRO REPEAT A, BB, C, D, EE, F, G, H, I, J, K, LL, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z ..TAG \..L, 1 ..PUSH 5, ..L ..L=..L+1 .IIF B
.MEXIT .IF IDN UNTILB BB, C, D, EE, F, G, H, I, J, K, LL, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z .MEXIT .ENDC .IF IDN UNTIL BB, C, D, EE, F, G, H, I, J, K, LL, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z .MEXIT .ENDC LET A, BB, C, D, EE, F, G, H, I, J, K, LL, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z .ENDM REPEAT .MACRO UNTILB A, BE, C, D, EE, F, G, H, I, J, K, LL, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z UNTIL A, BE, C, D, EE, F, G, H, I, J, K, LL, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z, B .ENDM UNTILB .MACRO UNTIL A, BE, C, D, EE, F, G, H, I, J, K, LL, M, N, O, P, Q, R, S, TE, U, V, W, X, Y, Z, BB .L.=1 ; 0-? 1-UNTIL 2-LEAVE 3-GOTO 4-CONTINUE ..POP $T1, $T2 .IF NE $T1-5 .ERROR ; UNTIL discovered not in REPEAT block .MEXIT .ENDC IF A, BE, C, D, EE, F, G, H, I, J, K, LL, M, N, O, P, Q, R, S, TE, U, V, W, X, Y, Z, BB ..POP $$T, $$T ..TAG \$T2, 2 .L.=0 .ENDM UNTIL .MACRO LOOP A, BB, C, D, EE, F, G, H, I, J, K, LL, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z ..TAG \..L, 1 ..PUSH 7, ..L ..L=..L+1 .IIF B .MEXIT LET A, BB, C, D, EE, F, G, H, I, J, K, LL, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z .ENDM LOOP .MACRO FOR A, BBB, C, D, EE, F, G, H, I, J, K, LL, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z, MG .IIF DIF , FOR A, BBB, C, D, EE, BY, #1, F, G, H, I, J, K, LL, M, N, O, P, Q, R, S, T, U, V, W, X, MG .IIF DIF , .MEXIT .SIMPLE A, BBB, C ..TAG \..L, 1 .IF B ..PUSH 2, ..L .IRP TT, \<..L> .MACRO $.$'TT D A, EE, G, TT, MG .ENDM .ENDR .IFF $SDO=$DIDDO H I, J, K, LL, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z D A, EE, G, \..L .IIF GT $DIDDO-$SDO $DIDDO=$DIDDO-1 .ENDC .L=.L+1 .ENDM FOR .MACRO FOR.ABS A, BBB, C, D, EE, F, G, H, I, J, K, LL, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z FOR A, BBB, C, D, EE, F, G, H, I, J, K, LL, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z, ABS .ENDM FOR.ABS .MACRO TO A1, A2, A3, A4, MG $E$=0 .OPADD A1, A3 .EMIT .IF IDN .EMIT .IFF .EMIT .ENDC .EMITL <'A4'2$> .ENDM TO .MACRO DOWNTO A1, A2, A3, A4, MG $E$=0 .OPSUB A1, A3 .EMIT .IF IDN .EMIT .IFF .EMIT .ENDC .EMITL <'A4'2$> .ENDM DOWNTO .MACRO THRU A, BB, C, D, EE, F, G, H, I, J, K, LL, M, N, O, P, Q, R, S, T, U, V .NTYPE ..THRU, A .IF NE ..THRU&70 .ERROR ; 'a' must be register .MEXIT .ENDC .IIF NB LET A, BB, C, D, EE, F, G, H, I, J, K, LL, M, N, O, P, Q, R, S, T, U, V ..TAG \..L, 1 ..PUSH 6, ..L .IRP TT, \..L .MACRO $.$'TT .EMIT .ENDM .ENDR ..L=..L+1 .ENDM THRU .MACRO DO EE, F, G, H, I, J, K, LL, M, N, O, P, Q, R, S, TE, U, V, W, X, Y, Z .IIF B .MEXIT LET EE, F, G, H, I, J, K, LL, M, N, O, P, Q, R, S, TE, U, V, W, X, Y, Z $DIDDO=$DIDDO+1 .ENDM DO .MACRO CASE A, BBB, C .IIF DIF .EMIT .EMIT .IRP TT, \$T .EMIT .ENDM .SAVE $PDATA ..PUSH 4, $T ..TAG \$T, 3 $T=$T+1 .ENDM CASE ;.MACRO CASE A,BBB,C ; .IIF DIF .EMIT ; .EMIT ; .IRP TT,\$T ; .EMIT ; .ENDM ; ..PUSH 4,$T ; $T=$T+1 ;.ENDM ................................................................................ .MACRO $$END .IF GE .SP. .EF.=1 END .EF.=0 $$END .ENDC .ENDM $$END .MACRO END NAME ..POP $T1, $T2 .IF EQ $T1 .IIF EQ .EF.-1 .PRINT ; IF - missed END ..TAG \$T2, 3 ;-0- IF .MEXIT .ENDC .IF EQ $T1-3 .IIF EQ .EF.-1 .PRINT ; BEGIN - missed END .DSABL LSB $T=$T2 ..POP $T1, $T2 .IIF NE $T1-3 .ERROR ; SUPMAC implementation error ..L=$T2 .IF NE ..INPR ; ; PROCEDURE <'NAME'> end ; .PCHCK <'NAME'> ..INPR=0 .ENDC .MEXIT .ENDC .IF EQ $T1-8. .IIF EQ .EF.-1 .PRINT ; MODULE - missed END $T=$T2 ..POP $T1, $T2 .IIF NE $T1-8. .ERROR ; SUPMAC implementation error ..L=$T2 ; ; MODULE <'NAME'> end ; .IIF NE .EF.-1 .MCHCK <'NAME'> $$END ADJUST ..INMD=0 .MEXIT .ENDC .IF EQ $T1-5 .IIF EQ .EF.-1 .PRINT ; REPEAT - missed END ..BRAN BR, \$T2, 1 ;-5- REPEAT ..TAG \$T2, 2 .MEXIT .ENDC .IF EQ $T1-7 .IIF EQ .EF.-1 .PRINT ; LOOP - missed END ..BRAN BR, \$T2, 1 ;-7- LOOP ..TAG \$T2, 2 .MEXIT .ENDC .IF EQ $T1-1 ;-1- WHILE .IIF EQ .EF.-1 .PRINT ; WHILE - missed END ..BRAN BR, \$T2, 1 ..POP $$T, $$T ..TAG \$$T, 3 ..TAG \$T2, 2 .MEXIT .ENDC .IF EQ $T1-2 ;-2- FOR .IIF EQ .EF.-1 .PRINT ; FOR - missed END .IRP TT, <\$T2> $.$'TT .ENDR .MEXIT .ENDC .IF EQ $T1-4 ;-4- CASE .IIF EQ .EF.-1 .PRINT ; CASE - missed END .RESTORE .EMIT .EMIT .MEXIT .ENDC .IF EQ $T1-6 ; -6- THRU .IIF EQ .EF.-1 .PRINT ; THRU - missed END .IRP TT, \$T2 $.$'TT ..TAG \$T2, 2 .ENDR .MEXIT .ENDC .ERROR ; $T - strange value at SUPERMAC stack .ENDM END