; ; ALTERED: ; EDWIN H. MARISON 11 MAY 1976 15:39 ; Hunta 12 DEC 1992 20:30 ; Hunta 10 MAR 2019 14:02 ; ; STRUCTURED PROGRAMMING MACROS ; ; ** SUPMAC ** ; ; V80 ; ; ; .SP. ; указатель стека ; ; $O$ ; флаг .OR оператора - сбрасывается в IF, ; ; устанавливается в .OR ; $I$ ; флаг .IFOPR оператора - сбрасывается в начале IF и .GENBR, ; ; устанавливается в .IFOPR (в .GENBR есть обращения к .IFOPR) ; .MACRO ...... .ENDM ...... .MACRO $ORDER TYPE .ENDM .MACRO ..INIT $SUPMC=80. ; SUPMAC macros version $DIDDO=0 .EF.=0 .L.=0 $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 ..L'TT' = 'A2' ; LBLS .ENDR .ENDM ..PUSH .MACRO ..POP A1, A2 .IF LT .SP. .LIST .ERROR ; Стек исчерпан $Y$=.SP. .NLIST .MEXIT .IFF .IRP TT, \.SP. 'A1' = ..T'TT' ; TYPS 'A2' = ..L'TT' ; LBLS .ENDR .ENDC .SP.=.SP.-1 .ENDM ..POP .MACRO ..GET PPP, A1, A2 .IRP TT, \'PPP' 'A1' = ..T'TT' ; TYPS '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 ; Вложенные модули не реализованы .MEXIT .ENDC .IF B .ERROR ; Пропущено имя модуля .MEXIT .ENDC ; ; Модуль <'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 ; Разные имена модулей .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'>, .ERROR ; Вместо IMPORT - 'I' .MEXIT .ENDC .EMIT <;> .EMIT <; Импорт из модуля <'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 только 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, BASE, EXT ; ; Процедура 'NAME' ; .IF NE ..INPR .ERROR ; Вложенные процедуры не реализованы .MEXIT .ENDC .IF B .ERROR ; Пропущено имя процедуры .MEXIT .ENDC .SAVE $CODE .EMITL <'NAME'>, <'BASE'> .MACRO .PCHCK NAM .IIF DIF <'NAM'>, <'NAME'> .ERROR ; Разные имена процедур .ENDM .PCHCK ..INPR=1 .RESTORE .ENDM PROCEDURE .MACRO ENTRY NAME, BASE, EXT .IF EQ ..INPR .ERROR ; Entry возможно только внутри процедуры .MEXIT .ENDC .IF B .ERROR ; Пропущено имя входа .MEXIT .ENDC .SAVE $CODE .EMITL <'NAME'>, <'BASE'> .RESTORE .ENDM ENTRY .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 , .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 ; Замечание: **** WHERE и TYPE не реализованы **** .IIF B .EMIT .IIF B .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 <%'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 .IIF EQ .L.-2 .EMIT .IIF EQ .L.-3 .EMIT .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 , .ERROR ; Синтаксическая ошибка IF : 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 <#1> .EMIT .IIF NE $E$ .MEXIT .IIF IDN .EMIT .IIF NE $E$ .MEXIT .EMIT .ENDM .OPADD .MACRO .OPSUB V1, V2, V3 .IIF IDN <#1> .EMIT .IIF NE $E$ .MEXIT .IIF IDN .EMIT .IIF NE $E$ .MEXIT .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 ; Y4 неверная операция .ENDM .ARITH .MACRO .SIMPLE X1, X2, X3, X4, X5, X6 .IF DIF , <:=> .IF DIF , <:W=> .IF DIF , <:==> .IF DIF , <:B=> .ERROR ; X2 неверный оператор присваивания .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$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 .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 $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 оператора - сбрасывается в IF, ; устанавливается в .OR $I$=0 ; флаг .IFOPR оператора - сбрасывается в начале IF и .GENBR, ; устанавливается в .IFOPR (в .GENBR есть обращения к .IFOPR) .IF IDN .IIF NB .LEAVE 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 .IIF NE .L.-1 .GENBR A, BE, C, BB, \$T .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) ещё не работоспособны ; .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 .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) обнаружен после 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 .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 обнаружен не в 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 .MEXIT .IIF IDN , $SET$K$ .SP. .IIF DIF , $K$=AAAA .IRP QQ, \$K$ .EMIT
.ENDM .ENDM LEAVE .MACRO .LEAVE LA, LB, LC, LD, LE .L.=2 .IIF IDN , $SET$K$ .SP. .IIF DIF , $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
.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 ..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 .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 ; 'А' должен быть регистром .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 $$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 .EMIT .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