Trailing-Edge
-
PDP-10 Archives
-
decuslib20-05
-
decus/20-0143/struct.mac
There are 2 other files named struct.mac in the archive. Click here to see a list.
UNIVERSAL STRUCT -- STRUCTURED PROGRAMMING MACROS
SUBTTL DEFINITIONS
;; VERSION 1(0)-2
;; WRITTEN BY ROBERT P. NIX -- 11/21/78
;; STRUCT -- A SET OF STRUCTURED PROGRAMMING MACROS FOR
;; THE DECSYSTEM-10 ASSEMBLER.
;; THE CALLS:
; %IF <CONDITIONS> ; THEN
; -- CODE --
; %ELSE
; -- CODE --
; %ENDIF
; - OR -
; %IF <CONDITIONS> ; THEN
; -- CODE --
; %ENDIF
; %WHILE <CONDITIONS> ; DO
; -- CODE --
; %ENDWHILE
; %REPEAT
; -- CODE --
; %UNTIL <CONDITIONS>
; %CASE
; %WHEN <CONDITIONS> ; DO
; -- CODE --
; %WHEN <CONDITIONS> ; DO
; -- CODE --
; %ENDCASE
; %LOOP
; -- CODE --
; %EXITIF <CONDITIONS>
; -- CODE --
; %ENDLOOP
;; <CONDITIONS> IS DEFINED AS:
; <[CAI, SKIP OR OTHER SKIPPING COND],AFIELD,BFIELD,COND>
; <<CONDITIONS>,AND,<CONDITIONS>>
; <<CONDITIONS>,OR,<CONDITIONS>>
; <NOT,<CONDITIONS>>
SUBTTL DEFINITIONS FOR MACROS NEEDED INTERNALLY TO SUBSYSTEM
LALL
DEFINE COND (UCOND,T,F,%T1,%F1) <
..CCNT== 0
IRP UCOND,< ..CCNT== ..CCNT+1 >
IFE ..CCNT-4,<
ACOND (UCOND,T,F) >
IFE ..CCNT-2,<
..CC== 0
IRP UCOND,<
..CC== ..CC+1
IFE ..CC-2,<
COND (UCOND,F,T) > > >
IFE ..CCNT-3,<
..CC== 0
IRP UCOND,<
..CC== ..CC+1
IFE ..CC-1,<
COND (UCOND,%T1,%F1) >
IFE ..CC-2,<
IFIDN <UCOND><AND>,<
%F1: JRST F
%T1: >
IFIDN <UCOND><OR>,<
%T1: JRST T
%F1: >
>
IFE ..CC-3,<
COND (UCOND,T,F) > > > >
DEFINE ACOND (I,A,B,C,T,F) <
I'C A,B
JRST F
JRST T >
DEFINE BLDSYM (CONST,ARG) <
CONST'ARG== .
>
DEFINE ORGSYM (CONST,ARG) <
.ORG CONST'ARG
>
SUBTTL SUBTTL DEFINITIONS FOR %IF, %ELSE, %ENDIF
DEFINE %IF (UCOND,%T,%F) <
IFNDEF .ILVL,<.ILVL== 0>
COND (<UCOND>,%T,%F)
%F: JRST @.+1
BLDSYM (.IF,\.ILVL)
BLOCK 1
%T:
.ILVL== .ILVL+1
>
DEFINE %ELSE (%ELS,%END) <
IFNDEF .ILVL,<PRINTX "ATTEMPTED %ELSE W/O %IF">
.ILVL== .ILVL-1
IFL .ILVL,<PRINTX "ATTEMPTED %ELSE W/O %IF">
IFGE .ILVL,<
JRST @'%END
ORGSYM (.IF,\.ILVL)
EXP %ELS
.ORG
BLDSYM (.IF,\.ILVL)
%END: BLOCK 1
%ELS:
.ILVL== .ILVL+1
> >
DEFINE %ENDIF (%END) <
IFNDEF .ILVL,<PRINTX "ATTEMPTED %ENDIF W/O %IF">
.ILVL== .ILVL-1
IFL .ILVL,<PRINTX "ATTEMPTED %ENDIF W/O %IF">
IFGE .ILVL,<
%END:
ORGSYM (.IF,\.ILVL)
EXP %END
.ORG
> >
SUBTTL DEFINITIONS FOR %WHILE, %ENDWHILE
DEFINE %WHILE (UCOND,%T,%F) <
IFNDEF .WLVL,<.WLVL== 0>
BLDSYM (.WTO,\.WLVL)
COND (<UCOND>,%T,%F)
%F: JRST @.+1
BLDSYM (.WLV,\.WLVL)
BLOCK 1
%T:
.WLVL== .WLVL+1 >
DEFINE %ENDWH (%BACK,%EN) <
IFNDEF .WLVL,<PRINTX "ATTEMPTED %ENDWHILE W/O %WHILE">
.WLVL== .WLVL-1
IFL .WLVL,<PRINTX "ATTEMPTED %ENDWHILE W/O %WHILE">
IFGE .WLVL,<
ORGSYM (.WTO,\.WLVL)
%BACK== .
.ORG
JRST %BACK
%EN== .
ORGSYM (.WLV,\.WLVL)
EXP %EN
.ORG > >
SUBTTL DEFINITIONS FOR %REPEAT, %UNTIL
DEFINE %REPEA <
IFNDEF .RLVL,<.RLVL== 0>
BLDSYM (.RTO,\.RLVL)
.RLVL== .RLVL+1 >
DEFINE %UNTIL (UCOND,%T,%F,%TO) <
IFNDEF .RLVL,<PRINTX "ATTEMPTED %UNTIL W/O %REPEAT">
.RLVL== .RLVL-1
IFL .RLVL,<PRINTX "ATTEMPTED %UNTIL W/O %REPEAT">
IFGE .RLVL,<
COND (<UCOND>,%T,%F)
ORGSYM (.RTO,\.RLVL)
%TO== .
.ORG
%F: JRST %TO
%T: > >
SUBTTL DEFINITIONS FOR %CASE, %WHEN, %ENDCASE
DEFINE %CASE (%CONT,%NXT) <
IFNDEF .CLVL,<.CLVL== 0>
JRST %CONT
BLDSYM (.CBO,\.CLVL)
BLOCK 1
BLDSYM (.CNX,\.CLVL)
%NXT: BLOCK 1
%CONT: JRST @'%NXT
.CLVL== .CLVL+1
>
DEFINE %WHEN (UCOND,%T,%F,%BO,%NXT,%TOP) <
IFNDEF .CLVL,<PRINTX "ATTEMPTED %WHEN W/O %CASE">
.CLVL== .CLVL-1
IFL .CLVL,<PRINTX "ATTEMPTED %WHEN W/O %CASE">
IFGE .CLVL,<
ORGSYM (.CBO,\.CLVL)
%BO== .
.ORG
JRST @'%BO
%TOP== .
ORGSYM (.CNX,\.CLVL)
EXP %TOP
.ORG
COND (<UCOND>,%T,%F)
%F: JRST @'%NXT
BLDSYM (.CNX,\.CLVL)
%NXT: BLOCK 1
%T:
.CLVL== .CLVL+1
> >
DEFINE %ENDCA (%BO) <
IFNDEF .CLVL,<PRINTX "ATTEMPTED %ENDCASE W/O %CASE">
.CLVL== .CLVL-1
IFL .CLVL,<PRINTX "ATTEMPTED %ENDCASE W/O %CASE">
IFGE .CLVL,<
%BO== .
ORGSYM (.CBO,\.CLVL)
EXP %BO
.ORG
ORGSYM (.CNX,\.CLVL)
EXP %BO
.ORG
> >
SUBTTL DEFINITIONS FOR %LOOP, %EXITIF, %ENDLOOP
DEFINE %LOOP <
IFNDEF .LLVL,<.LLVL== 0>
BLDSYM (.LT,\.LLVL)
.LLVL== .LLVL+1
>
DEFINE %EXITI (UCOND,%T,%F,%OUT) <
IFNDEF .LLVL,<PRINTX "%EXITIF W/O %LOOP">
.LLVL== .LLVL-1
IFL .LLVL,<PRINTX "%EXITIF W/O %LOOP">
IFGE .LLVL,<
COND (<UCOND>,%T,%F)
%T: JRST @'%OUT
BLDSYM (.LB,\.LLVL)
%OUT: BLOCK 1
%F:
.LLVL== .LLVL+1
> >
DEFINE %ENDLO (%TOP,%BO) <
IFNDEF .LLVL,<PRINTX "%ENDLOOP W/O %LOOP">
.LLVL== .LLVL-1
IFL .LLVL,<PRINTX "%ENDLOOP W/O %LOOP">
IFGE .LLVL,<
ORGSYM (.LT,\.LLVL)
%TOP== .
.ORG
JRST %TOP
%BO:
ORGSYM (.LB,\.LLVL)
EXP %BO
.ORG
> >
SUBTTL END OF MODULE
end