;
; 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
;
; STRUCTURED PROGRAMMING MACROS
;
; ** SUPMAC **
;
; V80
;

.MACRO ......
.ENDM ......

.MACRO $ORDER TYPE
.ENDM
 
.MACRO ..INIT
  $SUPMC=80. ; SUPMAC macros version
  $DIDDO=0
  .EF.=0
  .L.=0
  $T=1
  ..L=1
  $R=-1
 
  ..INPR=0
  ..INMD=0
 
  .SP.=-1
.ENDM ..INIT
 
.MACRO ..PUSH A1, A2
  .SP.=.SP.+1
  .IRP TT, \.SP.
    ..T'TT' = 'A1'
    ..L'TT' = 'A2'
  .ENDR
.ENDM ..PUSH
 
.MACRO ..POP A1, A2
  .IF LT .SP.
    .LIST
    .ERROR ;  
    $Y$=.SP.
    .NLIST
    .MEXIT
  .IFF
    .IRP TT, \.SP.
      'A1' = ..T'TT'
      'A2' = ..L'TT'
    .ENDR
  .ENDC
  .SP.=.SP.-1
.ENDM ..POP
 
.MACRO ..GET PPP, A1, A2
  .IRP TT, \'PPP'
    'A1' = ..T'TT'
    'A2' = ..L'TT'
  .ENDR
.ENDM ..GET

................................................................................

.MACRO .EMIT VAL
  $E$=1
  .NLIST
  .LIST ME
  .LIST
                'VAL'
  .NLIST
  .NLIST ME
  .LIST
.ENDM .EMIT
 
.MACRO .EMITL VAL
  .NLIST
  .LIST ME
  .LIST
'VAL':
  .NLIST
  .NLIST ME
  .LIST
.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, TYPE
  .IF NE ..INMD
    .ERROR ;    
    .MEXIT
  .ENDC
  .IF B <NAME>
    .ERROR ;   
    .MEXIT
  .ENDC
 
  ;
  ;  <'NAME'>
  ;
  .IF DF R$$T11
    .MCALL .MODULE
    .IF B <MNAME>
      .MODULE <'NAME'>, MODNAME=<'NAME'>, RELEASE=<'REL'>, VERSION=<'VER'>, LIB=<'LIBR'>, COMMENT=<'COMM'>
    .IFF
      .MODULE <'NAME'>, MODNAME=<'MNAME'>, RELEASE=<'REL'>, VERSION=<'VER'>, LIB=<'LIBR'>, COMMENT=<'COMM'>
    .ENDC
  .IFF
    ;.IF DF R$$11M
      .IF NB <MNAME>
        .TITLE 'MNAME' - 'COMM'
      .IFF
        .TITLE 'NAME' - 'COMM'
      .ENDC
      .IDENT /'REL'.'VER'/
      .MACRO .NLCSI TYPE=Z, PART=ALL
        .IF IDN <PART> <ALL>
          .ASCI'TYPE' "'MODULE' 'REL'.'VERSION' "
        .ENDC
        .IF IDN <PART> <NAME>
          .ASCI'TYPE' "'MODULE'"
        .ENDC
        .IF IDN <PART> <RLSVER>
          .ASCI'TYPE' "'REL'.'VERSION' "
        .ENDC
        .IF IDN <PART> <PREFIX>
          .ASCI'TYPE' "'MODULE'-"
        .ENDC
      .ENDM .NLCSI
    ;.ENDC
  .ENDC
 
  .MACRO .MCHCK NAM
    .IIF DIF <'NAM'>,<'NAME'> .ERROR ;   
  .ENDM .MCHCK
 
  .ENABL LC
  .DSABL GBL
  .NLIST LD
  .NLIST TTM
  ..INIT
  RB = %5       ; %5   
  $ORDER <'TYPE'>
  ..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'>,<IMPORT>
    .ERROR ;  IMPORT - 'I'
    .MEXIT
  .ENDC
  .EMIT <;>
  .EMIT <;    <'M'>>
  .EMIT <;>
  .IF IDN <'M'>,<SYSMAC>
    .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'>,<EXEMC>
      .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'>,<QUALIFIED>
    .ERROR ; EXPORT  QUALIFIED - 'Q'
    .MEXIT
  .ENDC
  .EMIT <;>
  .EMIT <;  >
  .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, EXT
  ;
  ;  'NAME'
  ;
  .IF NE ..INPR
    .ERROR ;    
    .MEXIT
  .ENDC
  .IF B <NAME>
    .ERROR ;   
    .MEXIT
  .ENDC
 
  .SAVE
 
    $CODE
    .EMITL <'NAME'>
 
    .MACRO .PCHCK NAM
      .IIF DIF <'NAM'>, <'NAME'> .ERROR ;   
    .ENDM .PCHCK
 
    ..INPR=1
 
  .RESTORE
.ENDM PROCEDURE
 
.MACRO BEGIN
  .IIF EQ ..INPR .ERROR ; BEGIN    
  $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 <WITH>, <STA>
      .IF DIF <ERROR>, <STA>
        .IF DIF <NOERROR>, <STA>
          .IF IDN <WORD>, <A>
            .EMIT <MOV STA, -(%6)>
            .EMIT <ROL (%6)+>
          .IFF
            .EMIT <MOVB STA, -(%6)>
            .EMIT <ROLB (%6)+>
          .ENDC
        .IFF
          .EMIT <CLC>
        .ENDC
      .IFF
        .EMIT <SEC>
      .ENDC
    .ENDC
  .ENDC
  .IIF B <REG>  .EMIT <RTS PC>
  .IIF NB <REG> .EMIT <RTS REG>
.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
  ; : **** WHERE  TYPE   ****
  .IIF B <ARGS> .EMIT <JSR %7, NAME>
  .IIF B <ARGS> .MEXIT
  .IF NB WHERE
    .ERROR ; WHERE ....    <>
    .MEXIT
  .ENDC
  .$T=0
  .MACRO $GENM BBT, BBP
    .IIF GT BBP-5 .ERROR ; 6   (R0-R5)
    .IIF GT BBP-5 .MEXIT
    .IIF DIF <BBT> <%'BBP> .EMIT <MOV BBT, %'BBP>
  .ENDM $GENM
  .IRP T, <ARGS>
    .IIF NB <T> $GENM T, \.$T
    .$T=.$T+1
  .ENDR
  .EMIT <JSR %7, NAME>
.ENDM $CALL

................................................................................

.MACRO RNE LOC
  .EMIT <BEQ LOC>
.ENDM RNE
 
.MACRO REQ LOC
  .EMIT <BNE LOC>
.ENDM REQ
 
.MACRO RLT LOC
  .EMIT <BGE LOC>
.ENDM RLT
 
.MACRO RGE LOC
  .EMIT <BLT LOC>
.ENDM RGE
 
.MACRO RGT LOC
  .EMIT <BLE LOC>
.ENDM RGT
 
.MACRO RLE LOC
  .EMIT <BGT LOC>
.ENDM RLE
 
.MACRO RPL LOC
  .EMIT <BMI LOC>
.ENDM RPL
 
.MACRO RMI LOC
  .EMIT <BPL LOC>
.ENDM RMI
 
.MACRO RHI LOC
  .EMIT <BLOS LOC>
.ENDM RHI
 
.MACRO RLOS LOC
  .EMIT <BHI LOC>
.ENDM RLOS
 
.MACRO RHIS LOC
  .EMIT <BLO LOC>
.ENDM RHIS
 
.MACRO RLO LOC
  .EMIT <BHIS LOC>
.ENDM RLO
 
.MACRO RCS LOC
  .EMIT <BCC LOC>
.ENDM RCS
 
.MACRO RCC LOC
  .EMIT <BCS LOC>
.ENDM RCC

................................................................................

.MACRO .IFOPR OPRA, RELA, TTG
  .EMIT 'OPRA'
  .IF GT $R
    .IIF EQ .L.   .EMIT <B'RELA 'TTG'3$>
    .IIF EQ .L.-1 .EMIT <B'RELA 'TTG'1$>
    .IIF EQ .L.-2 .EMIT <B'RELA 'TTG'2$>
    .IIF EQ .L.-3 .EMIT <B'RELA TTG>
  .IFF
    .IIF EQ .L.          R'RELA 'TTG'3$
    .IIF EQ .L.-1        R'RELA 'TTG'1$
    .IIF EQ .L.-2        R'RELA 'TTG'2$
    .IIF EQ .L.-3        R'RELA TTG
  .ENDC
  ..PUSH 0, $T
  $I$=1
.ENDM .IFOPR
 
.MACRO .IS Q1, Q2, QB, QT
  .IIF DIF <RESULT>, <Q1> .ERROR ;   IF : Q1 IS
  .IIF IDN <RESULT>, <Q1> .IFOPR <<.=.>>, Q2, QT
.ENDM .IS
 
.MACRO .GENBR A1, B1, C1, D1, E1
  $I$=0
  .IIF IDN <SET.IN> <B1> .IFOPR <<BIT'D1 A1, C1>>, NE, E1
  .IIF IDN <OFF.IN> <B1> .IFOPR <<BIT'D1 A1, C1>>, EQ, E1
  .IIF IDN <#0>     <C1> .IFOPR <<TST'D1 A1>>,     B1, E1
  .IIF IDN <#0>     <A1> .IFOPR <<TST'D1 C1>>,     B1, E1
  .IIF IDN <IS>     <B1> .IS    A1,                C1, D1, E1
  .IIF EQ  $I$           .IFOPR <<CMP'D1 A1, C1>>, B1, E1
.ENDM .GENBR

................................................................................

.MACRO .OPADD V1, V2, V3
  .IIF IDN <V2> <#1>    .EMIT <INC'V3 V1>
  .IIF NE $E$ .MEXIT
 
  .IIF IDN <V2> <CARRY> .EMIT <ADC'V3 V1>
  .IIF NE $E$ .MEXIT
 
  .EMIT <ADD'V3 V2, V1>
.ENDM .OPADD
 
.MACRO .OPSUB V1, V2, V3
  .IIF IDN <V2> <#1>    .EMIT <DEC'V3 V1>
  .IIF NE $E$ .MEXIT
 
  .IIF IDN <V2> <CARRY> .EMIT <SBC'V3 V1>
  .IIF NE $E$ .MEXIT
 
 .EMIT <SUB'V3 V2, V1>
.ENDM .OPSUB

................................................................................

.MACRO .ARITH Y1, Y2, Y3, Y4
  .IIF IDN <Y1>, <-(%6)> .ARITH @%6, Y2, Y3, Y4
  .IIF IDN <Y1>, <-(%6)> .MEXIT
 
  .IIF IDN <+>, <Y4> .OPADD Y1, Y2, Y3
  .IIF IDN <->, <Y4> .OPSUB Y1, Y2, Y3
  .IIF NE $E$ .MEXIT
 
  .IIF IDN <NAND>, <Y4>   .EMIT <BIC'Y3 Y2, Y1>
  .IIF IDN <OFF.BY>, <Y4> .EMIT <BIC'Y3 Y2, Y1>
  .IIF NE $E$ .MEXIT
 
  .IIF IDN <SET.BY>, <Y4> .EMIT <BIS'Y3 Y2, Y1>
  .IIF IDN <OR>, <Y4>     .EMIT <BIS'Y3 Y2, Y1>
  .IIF NE $E$ .MEXIT
 
  .IIF IDN <L.SHIFT>, <Y4>  .EMITR <ASL'Y3 Y1>, Y2
  .IIF IDN <R.SHIFT>, <Y4>  .EMITR <ASR'Y3 Y1>, Y2
  .IIF IDN <L.ROTATE>, <Y4> .EMITR <ROL'Y3 Y1>, Y2
  .IIF IDN <R.ROTATE>, <Y4> .EMITR <ROR'Y3 Y1>, Y2
  .IIF NE $E$ .MEXIT
 
  .IIF IDN <*>, <Y4>       .EMIT <MUL Y2, Y1>
  .IIF IDN </>, <Y4>       .EMIT <DIV Y2, Y1>
  .IIF IDN <SHIFT>, <Y4>   .EMIT <ASH Y2, Y1>
  .IIF IDN <C.SHIFT>, <Y4> .EMIT <ASHC Y2, Y1>
  .IIF NE $E$ .MEXIT
 
  .IIF IDN <XOR>, <Y4> .EMIT <XOR Y2, Y1>
 
  .IIF EQ $E$ .ERROR ; Y4  
.ENDM .ARITH
 
.MACRO .SIMPLE X1, X2, X3, X4, X5, X6
  .IF DIF <X2>, <:=>
    .IF DIF <X2>, <:W=>
      .IF DIF <X2>, <:==>
        .IF DIF <X2>, <:B=>
          .ERROR ; X2    
          .MEXIT
        .ENDC
      .ENDC
      .SIMPLE X1, <:=>, X3, X4, X5, B
      .MEXIT
    .ENDC
  .ENDC
 
  .IIF IDN <X1>, <PUSH> .SIMPLE -(%6), X2, X3, X4, X5, X6
  .IIF IDN <X1>, <PUSH> .MEXIT
  .IIF IDN <X1>, <TOP>  .SIMPLE @%6,   X2, X3, X4, X5, X6
  .IIF IDN <X1>, <TOP>  .MEXIT
 
  $Y$=0
  $Z$=0
  .IIF IDN <CARRY>, <X1>   $Z$=-1
  .IIF IDN <C.BIT>, <X1>   $Z$=-1
  .IIF IDN <V.BIT>, <X1>   $Z$=-2
  .IIF IDN <OFF>, <X3>     $Y$=7
  .IIF IDN <FALSE>, <X3>   $Y$=7
  .IIF IDN <CLEARED>, <X3> $Y$=7
  .IIF IDN <0>, <X3>       $Y$=7
  .IIF IDN <#0>, <X3>      $Y$=7
  .IIF IDN <ON>, <X3>      $Y$=4
  .IIF IDN <SET>, <X3>     $Y$=4
  .IIF IDN <TRUE>, <X3>    $Y$=4
 
  .IF LT $Z$
    .IIF EQ $Z$+$Y$-6 .EMIT <CLC>
    .IIF EQ $Z$+$Y$-5 .EMIT <CLV>
    .IIF EQ $Z$+$Y$-3 .EMIT <SEC>
    .IIF EQ $Z$+$Y$-2 .EMIT <SEV>
    .MEXIT
  .ENDC
 
  .IIF IDN <NOT>, <X3>  $Y$=-1
  .IIF IDN <->, <X3>    $Y$=-2
  .IIF IDN <POP>, <X3>  $Y$=5
  .IIF IDN <TOP>, <X3>  $Y$=6
  .IIF IDN <PUSH>, <X3> $Y$=10
 
  .IF DIF <X1>, <X3>
    .IIF EQ $Y$-7      .EMIT <CLR'X6 X1>
    .IF DIF <@%6>, <X1>
      .IIF EQ $Y$-6    .EMIT <MOV'X6 @%6, X1>
    .ENDC
    .IIF EQ $Y$-5      .EMIT <MOV'X6 (%6)+, X1>
    .IIF EQ $Y$-4      .EMIT <MOV'X6 #-1, X1>
    .IIF EQ $Y$        .EMIT <MOV'X6 X3, X1>
  .ENDC
 
  .IF DIF <X1> <X4>
    .IIF LT $Y$        .EMIT <MOV'X6 X4, X1>
  .ENDC
 
  .IIF IDN <+1> <X4> $Y$=-5
  .IIF IDN <-1> <X4> $Y$=-6
 
  .IF LT $Y$
    .IIF EQ $Y$+1      .EMIT <COM'X6 X1>
    .IIF EQ $Y$+2      .EMIT <NEG'X6 X1>
    .IIF EQ $Y$+3      .EMIT <TST'X6 X1>
    .IIF EQ $Y$+4      .EMIT <SWAB X1>
    .IIF EQ $Y$+5      .EMIT <INC'X6 X1>
    .IIF EQ $Y$+6      .EMIT <DEC'X6 X1>
    .MEXIT
  .ENDC
 
  .IIF B <X4>        .MEXIT
  .IIF IDN <X4> <!>  .MEXIT
  .IIF IDN <X4> <IS> .MEXIT
 
  $E$=0
 
  .IIF IDN <X5> <TOP> .ARITH X1, @%6,   X6, X4
  .IIF IDN <X5> <POP> .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 <D>  .MEXIT
  .IIF B <EE> .MEXIT
  .IIF B <F>  .MEXIT
  .IIF IDN <!>, <D>  LET EE, F, G, H, I, J, K, LL, M, N, O, P, Q, R, S, TE, U, V
  .IIF IDN <!>, <D>  .MEXIT
  .IIF IDN <!>, <EE> LET F, G, H, I, J, K, LL, M, N, O, P, Q, R, S, TE, U, V
  .IIF IDN <!>, <EE> .MEXIT
  .IIF IDN <!>, <F>  LET G, H, I, J, K, LL, M, N, O, P, Q, R, S, TE, U, V
  .IIF IDN <!>, <F>  .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$K$ BBB
  $K$L=-1
  $K$=-1
  .IF LT BBB
    .ERROR ;   
    .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$K$ BBB-1
  $K$=$K$L
.ENDM $SET$K$
 
.MACRO JUMPTO AAAA, A, B, C, D, E, F, H, G, I, J, K, L, M, N, O, P, Q, R, S, T, U
  .EMIT <JMP AAAA>
.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 <BBBB> .MEXIT
  .EMIT <BR BBBB>
.ENDM GOTO
 
.MACRO .GOTO GA, GB, GC, GD, GEE
  .L.=3
  $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 <A> .MEXIT

  $O$=0

  $I$=0

  .IF IDN <LEAVE> <D>
    .IIF NB <EE> .LEAVE A, BE, C, BB, EE
  .ENDC
  .IIF NE $I$ .MEXIT
  .IF IDN <GOTO> <D>
    .IIF NB <EE> .GOTO A, BE, C, BB, EE
  .ENDC
  .IIF NE $I$ .MEXIT
  .IIF IDN <D>, <OR>  .OR A, BE, C, BB
  .IIF IDN <D>, <ORB> .OR A, BE, C, BB
  .IF EQ $O$
    .IIF EQ .L.-1 .GENBR A, BE, C, BB, \$T2
    .IIF NE .L.-1 .GENBR A, BE, C, BB, \$T
  .ENDC
  $T=$T+1
  .IIF B <D>, .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)   
; 
.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    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    IF 
  ..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 <EE> .MEXIT
  $$S=0
  .IIF IDN <ORB>, <H>, $$S=1
  .IIF IDN <OR>, <H>, $$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 <H>, <LEAVE>, $$S=1
    .IIF IDN <H>, <GOTO>, $$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 <EE> .MEXIT
  .IIF IDN <H> <OR>  ..POP $T1, $T
  .IIF IDN <H> <ORB> ..POP $T1, $T
 
  IF'BB EE, F, G, H
 
  .IF DIF <H> <OR>
    .IF DIF <H> <ORB>
      ..POP $$TT, $$TT
      ..POP $$T,  $$T
      $$S=0
      .IIF IDN <H>, <AND>   $$S=1
      .IIF IDN <H>, <ANDB>  $$S=1
      .IIF IDN <H>, <GOTO>  $$S=2
      .IIF IDN <H>, <LEAVE> $$S=2
      .IF NE $$S
        .IF EQ, $$S-1
          ..PUSH 0, $$TT
          ..TAG  \$$T, 3
          .ERROR ; AND (ANDB)   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 <H> ..PUSH 0, $$TT
        .IIF B <H> .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
  .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 <EE> .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    IF 
    ..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   <AAAA>        .MEXIT
  .IIF IDN <AAAA>, <LOOP> $SET$K$ .SP.
  .IIF DIF <AAAA>, <LOOP> $K$=AAAA
  .IRP QQ, \$K$
    .EMIT <BR 'QQ'2$>
  .ENDM
.ENDM LEAVE
 
.MACRO .LEAVE LA, LB, LC, LD, LE
  .L.=2
  .IIF IDN <LE>, <LOOP> $SET$K$ .SP.
  .IIF DIF <LE>, <LOOP> $K$=LE
  $R=-$R
  .GENBR LA, LB, LC, LD, \$K$
  ..POP $$TT, $$TT
  $R=-$R
  .L.=0
.ENDM .LEAVE
 
.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 <A> .MEXIT
 
  .IF IDN <A> <UNTILB>
    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 <A> <UNTIL>
    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
  ..POP $T1, $T2
  .IF NE $T1-5
    .ERROR ; UNTIL    REPEAT 
    .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 <A> .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 <F>, <BY> 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 <F>, <BY> .MEXIT
 
  .SIMPLE A, BBB, C
  ..TAG \..L, 1
  .IF B <H>
    ..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 <CMP A1, A2>
  .IF IDN <MG> <ABS>
    .EMIT <BLO 'A4'1$>
  .IFF
    .EMIT <BLT 'A4'1$>
  .ENDC
  .EMITL <'A4'2$>
.ENDM TO
 
.MACRO DOWNTO A1, A2, A3, A4, MG
  $E$=0
  .OPSUB A1, A3
  .EMIT <CMP A1, A2>
  .IF IDN <MG> <ABS>
    .EMIT <BHI 'A4'1$>
  .IFF
    .EMIT <BGT 'A4'1$>
  .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 ; ''   
    .MEXIT
  .ENDC
 
  .IIF NB <BB> 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 <SOB A, 'TT'1$>
    .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 <EE> .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 <A> <TOP> .EMIT <MOV A, -(%6)>
  .EMIT <ASL @%6>
  .IRP TT, \$T
    .EMIT <ADD #'TT'3$, @%6>
  .ENDM
  .SAVE
  $PDATA
  ..PUSH 4, $T
  ..TAG \$T, 3
  $T=$T+1
.ENDM CASE

................................................................................

.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 ;  END - IF
    ..TAG \$T2, 3 ;-0- IF
    .MEXIT
  .ENDC
 
  .IF EQ $T1-3
    .IIF EQ .EF.-1 .PRINT ;  END - BEGIN
    .DSABL LSB
    $T=$T2
    ..POP $T1, $T2
    .IIF NE $T1-3 .ERROR ;   SUPMAC
    ..L=$T2
    .IF NE ..INPR
      ;
      ;   <'NAME'>
      ;
      .PCHCK <'NAME'>
      ..INPR=0
    .ENDC
    .MEXIT
  .ENDC
 
  .IF EQ $T1-8.
    .IIF EQ .EF.-1 .PRINT ;  END - MODULE
    $T=$T2
    ..POP $T1, $T2
    .IIF NE $T1-8. .ERROR ;   SUPMAC
    ..L=$T2
    ;
    ;   <'NAME'>
    ;
    .IIF NE .EF.-1 .MCHCK <'NAME'>
    $$END
    ADJUST
    ..INMD=0
    .MEXIT
  .ENDC
 
  .IF EQ $T1-5
    .IIF EQ .EF.-1 .PRINT ;  END - REPEAT
    ..BRAN BR, \$T2, 1 ;-5- REPEAT
    ..TAG \$T2, 2
    .MEXIT
  .ENDC
 
  .IF EQ $T1-7
    .IIF EQ .EF.-1 .PRINT ;  END - LOOP
    ..BRAN BR, \$T2, 1 ;-7- LOOP
    ..TAG \$T2, 2
    .MEXIT
  .ENDC
 
  .IF EQ $T1-1 ;-1- WHILE
    .IIF EQ .EF.-1 .PRINT ;  END - WHILE
    ..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 ;  END - FOR
    .IRP TT, <\$T2>
      $.$'TT
    .ENDR
    .MEXIT
  .ENDC
 
  .IF EQ $T1-4 ;-4- CASE
    .IIF EQ .EF.-1 .PRINT ;  END - CASE
    .RESTORE
    .EMIT <MOV @(%6)+, -(%6)>
    .EMIT <JSR PC, @(%6)+>
    .MEXIT
  .ENDC
 
  .IF EQ $T1-6 ; -6- THRU
    .IIF EQ .EF.-1 .PRINT ;  END - THRU
    .IRP TT, \$T2
      $.$'TT
      ..TAG \$T2, 2
    .ENDR
    .MEXIT
  .ENDC
 
  .ERROR ; $T    SUPER-MAC 
 
.ENDM END
