.NLIST BIN .LIST TTM .TITLE STRUCT .IDENT /V7M1/ .SBTTL STRUCTURED PROGRAMMING MACROS .SBTTL VER 5 MOD 11 24-DEC-74 .SBTTL VER 5 MOD 12 15-JUN-77 .SBTTL VER 5 MOD 13 21-JUN-77 .SBTTL VER 5 MOD 14 22-JUN-77 .SBTTL VER 5 MOD 15 23-JUN-77 .SBTTL VER 6 MOD 0 27-JUN-77 .SBTTL VER 6 MOD 1 .SBTTL VER 7 18-OCT-77 .SBTTL VER 7 MOD 1 1-NOV-77 ; ; COPYRIGHT 1974 SCOTT HERMAN-GIDDENS, BOB WARREN, ROGER BARR ; ; ; 'STRUCT' V5M4 24-DEC-74 ; V5M12 15-JUN-77 1LT JOEL IRWIN. CHANGES MADE TO ; SOURCE ONLY TO IMPROVE THE ASSEMBLY ; FORMAT ; V5M13 21-JUN-77 1LT JOEL IRWIN. CHANGES TO ; CONVERSION CALLS IN CHECK AND ; SOME OTHER MINOR CHANGES ; V5M14 22-JUN-77 1LT JOEL IRWIN. CHANGES TO IFC ; SO AS NOT TO USE THE PS REG AND TO ; STREAMLINE THINGS ABIT ; V5M15 23-JUN-77 1LT JOEL IRWIN. CHANGES TO CHECK ; SO THAT R0,R1, AND R2 CAN BE ; PRINTED ; V6M0 27-JUN-77 1LT JOEL IRWIN. ADDITION OF SEARCH ; MACROS, CHANGES TO GOBR AND ; GOBAK TO ALLOW CONDITIONAL JUMPS, ; CHANGES TO STRUCT AND CHANGES TO END ; TO ALLOW TWO NEW END STATEMENTS ; V6M1 29-SEP-77 1LT JOEL IRWIN. ELIMINATE CALL ; AND RETURN MACROS AND CHANGE NAMES ; OF WHAT USED TO BE CALL AND RETURN TO ; INVOKE AND QUIT (THUS REPLACING ; THEM). THIS MAKES THE CALLING OF ; SUBROUTINES COMPATIBLE WITH PREVIOUS ; RSX 11D CONVENTIONS. ; V7 18-OCT-77 THE MACROS NOW DO THEIR OWN .MCALLS ; THE FIRST TIME THEY ARE USED SO THAT ; MCALLS ONLY TO TOP LEVEL MACROS ARE ; NOW NEEDED ; V7M1 1-NOV-77 1LT JOEL IRWIN. CHANGE TO MOVC MACRO ; BECAUSE OLD FORM DOESNT ALLOW CHAR COUNT ; TO BE PASSED IN R0 OR R1. REWROTE THE ; MOVC MACRO TO TAKE ADVANTAGE OF OTHER ; MACROS. LIKEWISE, SAME CHANGES TO MOVW. ; .MACRO STRUCT ;+7,0 COMPLETELY REWRITTEN .IF DF,STRUCT ! ALL ;+7,0 DEFINE STRUCTURED MACROS .MCALL IF,IFB,ELSE,END,IFC,EXBND,EXBNDB,INBND,INBNDB ;+7,0 .MCALL CASE,CASEB,WHILE,WHILEB,REPEAT,UNTIL,UNTILB ;+7,0 .MCALL FOR,AND,ANDB,OR,ORB ;+7,0 .ENDC .IF DF,SUBR ! ALL ;+7,0 DEFINE SUBROUTINE MACROS .MCALL PROC,END,GETARG,PUTARG,NUMARG,TEXT,INVOKE,QUIT ;+7,0 .MCALL SAVE,UNSAVE,INDEX ;+7,0 .ENDC ;+7,0 .IF DF,SRCH ! ALL ;+7,0 DEFINE SEARCH MACROS .MCALL FIND,IFFND,IFNFND,GETKY,PUTKY ;+7,0 .ENDC ;+7,0 .IF DF,DEBUG ! ALL ;+7,0 DEFINE DEBUGGING MACROS .MCALL ASSERT,ASSERB,NOTE,CHECK ;+7,0 .ENDC ;+7,0 .IF DF,MISC ! ALL ;+7,0 DEFINE MISCELLANEOUS MACROS .MCALL MOVC,MOVW,SWAP,SWAPB,HEAD ;+7,0 .ENDC ;+7,0 .MCALL ENDCHK ;+7,0 ENDCHK DEFINED NO MATTER WHAT .BKBGN=0 .NEST=0 .CASE=0 .ENDM STRUCT ;********************************************************** ; ; .SBTTL .SBTTL SUBROUTINE MACROS .SBTTL ;********************************************************** .PAGE .SBTTL SAVE SAVES ON STACK ;SAVE MACRO SAVES ALL REGISTERS 0 TO 5, AND EAE. .MACRO SAVE X1,X2,X3,X4,X5,X6,X7,X8,X9 .NARG .ARGN .IF EQ,.ARGN MOV R0,-(SP) MOV R1,-(SP) MOV R2,-(SP) MOV R3,-(SP) MOV R4,-(SP) MOV R5,-(SP) .MEXIT .ENDC MOV X1,-(SP) .IIF NB,X2,MOV X2,-(SP) .IIF NB,X3,MOV X3,-(SP) .IIF NB,X4,MOV X4,-(SP) .IIF NB,X5,MOV X5,-(SP) .IIF NB,X6,MOV X6,-(SP) .IIF NB,X7,MOV X7,-(SP) .IIF NB,X8,MOV X8,-(SP) .IIF NB,X9,MOV X9,-(SP) .ENDM SAVE ;********************************************************** ; ; .SBTTL UNSAVE RESTORES FROM STACK ;UNSAVE PUTS BACK THE MQ, AC, AND REGISTERS 5 TO 0. .MACRO UNSAVE X1,X2,X3,X4,X5,X6,X7,X8,X9 .NARG .ARGN .IF EQ,.ARGN MOV (SP)+,R5 MOV (SP)+,R4 MOV (SP)+,R3 MOV (SP)+,R2 MOV (SP)+,R1 MOV (SP)+,R0 .MEXIT .ENDC .IIF NB,X9,MOV (SP)+,X9 .IIF NB,X8,MOV (SP)+,X8 .IIF NB,X7,MOV (SP)+,X7 .IIF NB,X6,MOV (SP)+,X6 .IIF NB,X5,MOV (SP)+,X5 .IIF NB,X4,MOV (SP)+,X4 .IIF NB,X3,MOV (SP)+,X3 .IIF NB,X2,MOV (SP)+,X2 MOV (SP)+,X1 .ENDM UNSAVE ;********************************************************** .PAGE .SBTTL INVOKE CALLS SUBROUTINES WITH ARGUMENTS ; ; 'INVOKE' VER 5 MOD 0 18-JUL-74 S.H. ; ;INVOKE IS FOR THE PURPOSE OF CALLING A SUBROUTINE. ;IT IS USED AS: ; INVOKE NAME, ;NAME IS THE NAME OF THE SUBROUTINE. ;ALL ARGUMENTS ARE PLACED IN THE < > GROUP. ;THE CALL IS MADE IN FORTRAN COMPATIBLE FORM. ; .MACRO INVOKE,NAME,ARG .IF NDF,INVOKE ;+7,0 .MCALL NUMELM ;+7,0 INVOKE=0 ;+7,0 .ENDC ;+7,0 JSR R5,NAME .NARG .ARGN .IF NE,.ARGN-1 NUMELM ARG BR .+2+<.ARGN*2> .WORD ARG .ENDC .ENDM INVOKE ;********************************************************** ; ; .SBTTL QUIT RETURNS FROM INVOKES ; ; 'QUIT' MOD 1 7-APR-74 B.W. ; ;QUIT IS FOR THE PURPOSE OF RETURNING FROM A ;PROCEDURE. IT HAS THREE FORMS: ; QUIT RETURNS NORMALLY VIA REGISTER 5 ; QUIT N RETURNS TO THE ADDRESS SPECIFIED ; BY ARGUMENT N (MUST BE NUMBER) ; QUIT @N RETURNS TO THE ADDRESS AT THE ; ADDRESS SPECIFIED BY ARGUMENT N ; .MACRO QUIT N .IIF NB,N,MOV N*2(R5),R5 RTS R5 .ENDM QUIT ;********************************************************** .PAGE .PAGE .SBTTL GETARG GETS ARGUMENTS FROM INVOKES ; ; 'GETARG' V5M0 24-JUL-74 B.W. ; ;GETARG IS FOR THE PURPOSE OF GETTING THE ;N'TH ARGUMENT IN A CALL DESCRIBED ABOVE. ;IT IS USED AS: ; ; GETARG N,DEST ; ;WHERE N IS THE NUMBER OF THE ARGUMENT ;DESIRED AND DEST IS WHERE IT IS TO BE PLACED. ; .MACRO GETARG N,DEST MOV N*2(R5),DEST .ENDM GETARG ;********************************************************** ; ; .SBTTL PUTARG SETS ARGUMENTS FROM INVOKES ; ; 'PUTARG' V5M0 24-JUL-74 B.W. ; ;PUTARG IS FOR THE PURPOSE OF CHANGING ;THE N'TH ARGUMENT OF A CALL DESCRIBED ABOVE. ;IT IS USED AS: ; ; PUTARG N,SRC ; ;WHERE N IS THE NUMBER OF THE ARGUMENT AND ;SRC CONTAINS THE NEW VALUE TO BE ;ASSIGNED. ; .MACRO PUTARG N,SRC MOV SRC,N*2(R5) .ENDM PUTARG ;********************************************************** .SBTTL NUMARG DETERMINE NUMBER OF ARGUMENTS PASSED ; ; 'NUMARG' V5M0 24-JUL-74 B.W. ; ;NUMARG IS USED IN SUBROUTINES WHICH CAN TAKE A VARIABLE ;NUMBER OF ARGUMENTS TO FIND OUT HOW MANY ARGUMENTS ;HAVE BEEN PASSED TO IT ON ANY GIVEN CALL. IT IS USED AS: ; ; NUMARG X ; ;WHERE X WILL CONTAIN THE NUMBER OF ARGUMENTS PRESENT. ;NOTE THAT AT LEAST ONE ARGUMENT MUST BE PASSED. ; .MACRO NUMARG X MOVB (R5),X .ENDM NUMARG ;********************************************************** .PAGE .SBTTL .SBTTL STRUCTURED PROGRAMMING MACROS .SBTTL ;*************************************************************** ; ; .SBTTL GOBR GENERATES BRANCH FOR BLOCKS ; ; 'GOBR' V5M1 28-AUG-74 S.H. ; V6M0 27-JUN-77 J.I. ; ; GENERATES A FORWARD BRANCH FOR BLOCKS ; .MACRO GOBR,X1,COND .IF NB,COND B'COND .'X1 .IFF BR .'X1 .ENDC .ENDM GOBR ;*************************************************************** ; ; .SBTTL GOJMP GENERATES JUMP FOR BLOCKS ; ; 'GOJMP' V5M1 28-AUG-74 S.H. ; ; GENERATES A JUMP TO THE ARGUMENT ADDRESS VALUE. ; .MACRO GOJMP,X1 JMP .'X1 .ENDM GOJMP ;*************************************************************** ; ; .SBTTL GOBAK GENERATES BACKWARD TRANSFER FOR BLOCKS ; ; 'GOBAK' V1M0 22-APR-74 S.H. ; V6M0 27-JUN-77 J.I. ; ; GENERATES A BACKWARD JUMP OR BRANCH TO THE ARGUMENT ; ADDRESS VALUE. ; .MACRO GOBAK,X1,COND .IF LE,.-<.'X1>-254. .IF NB,COND B'COND .'X1 .IFF BR .'X1 .ENDC .IFF .IF NB,COND B'COND .+4 BR .+6 .IFTF JMP .'X1 .ENDC .ENDC .ENDM GOBAK ;*************************************************************** .PAGE .SBTTL PUTLBL SAVES LABELS GENERATED FOR A BLOCK ; ; 'PUTLBL' V1M0 15-MAR-74 S.H. ; ; SAVES BLOCK LABEL VALUES IN SYMBOL .NSTXX WHERE XX IS ; THE NESTING LEVEL OF THE BLOCK. ; .MACRO PUTLBL,X1,X2,X3 .NST'X1=X2 .TYP'X1=X3 .ENDM PUTLBL ;*************************************************************** ; ; .SBTTL GETLBL RETRIEVES LABELS FOR A BLOCK ; ; 'GETLBL' V1M0 15-MAR-74 S.H. ; ; RETRIEVES BLOCK LABEL VALUE FROM SYMBOL .NSTXX ; WHERE XX IS THE NESTING LEVEL OF THE BLOCK. ; .MACRO GETLBL,X1,X2,X3 X2=.NST'X1 X3=.TYP'X1 .ENDM GETLBL ;*************************************************************** ; ; .SBTTL GENLBL GENERATES A LABEL ; ; 'GENLBL' V1M0 15-MAR-74 S.H. ; ; GENERATES A NUMBERED LABEL USED TO BEGIN AND END BLOCKS. ; .MACRO GENLBL,X1 .'X1: .ENDM GENLBL ;*************************************************************** .PAGE .SBTTL GENTST GENERATES DECISION TEST CODE ; ; 'GENTST' V1M2 12-APR-74 S.H. ; ; CALLED BY OTHER MACROS TO GENERATE DECISION TEST CODE ; FOR BLOCK EXECUTION. ARGUMENT X0 IS EITHER < > OR ; TO INDICATE WHETHER WORD OR BYTE TESTING IS TO ; BE GENERATED. ARGUMENTS X1,X2,X3 ARE THE SAME AS ; PASSED TO THE CALLING MACRO. XARG IS THE NUMBER OF ; ARGUMENTS PRESENTED TO THE CALLING MACRO. ; THE WORD FOLLOWING THE CODE GENERATED BY 'GENTST' SHOULD ; BE A JMP (NOT A BRANCH,BR) TO THE FALSE FORK OF THE TEST. ; .MACRO GENTST X0,XARG,X1,X2,X3 .NCHR .COND, .IF GT,.COND-3 BIT'X0 X1,X3 .IF EQ,.COND-6 BEQ .+6 .IFF BNE .+6 .ENDC .IFF .IF GT,XARG-1 .IF EQ,XARG-2 TST'X0 X1 .IFF CMP'X0 X1,X3 .ENDC B'X2 .+6 .IFF B'X1 .+6 .ENDC .ENDC .ENDM GENTST ;********************************************************** .PAGE .SBTTL PUTCSE SAVES # CASE ELEMENTS FOR A CASE BLOCK ; ; 'PUTCSE' V1M0 3-APR-74 S.H. ; ; # CASE ELEMENTS FOR THIS CASE BLOCK IS SAVED IN SYMBOL ; .CSLXX WHERE XX IS THE CASE BLOCK NESTING LEVEL. ; .MACRO PUTCSE,X1,X2 .CSL'X1=X2 .ENDM PUTCSE ;********************************************************** ; ; .SBTTL GETCSE GET # CASE ELEMENTS LEFT IN CASE BLOCK ; ; 'GETCSE' V1M0 3-APR-74 S.H. ; ; RETREIVES # CASE ELEMENTS LEFT IN THIS CASE BLOCK. ; .MACRO GETCSE,X1,X2 X2=.CSL'X1 .ENDM GETCSE ;********************************************************** ; ; .SBTTL NUMELM GETS # ARGUMENTS TO MACRO CALL ; ; 'NUMELM' V1M0 3-APR-74 S.H. ; .MACRO NUMELM,X1,X2,X3,X4,X5,X6,X7,X8,X9,X10,X11,X12 .NARG .ARGN .ENDM NUMELM ;********************************************************** .SBTTL WHILE INITIATES 'WHILE' BLOCK ; ; 'WHILE' V5M0 28-AUG-74 S.H. ; ; USES STANDARD PDP-11 BRANCH MNEMONICS PLUS ; 'SETOFF' AND 'SETON' FOR BIT TESTING. 'SETOFF' MEANS ; THAT THERE ARE NO MATCHING BITS IN THE TWO OPERANDS. ; 'SETON' MEANS THAT THERE IS AT LEAST ONE MATCHING ; BIT IN THE TWO OPERANDS. ; ; MNEMONICS ARE EQ-EQUAL, NE-NOT EQUAL, MI-MINUS, PL-PLUS, ; CS-CARRY SET, VS-OVERFLOW SET, CC-CARRY CLEAR, VC- ; OVERFLOW CLEAR, LT-LESS THAN, GE-GREATER THAN OR EQUAL, ; LE-LESS THAN OR EQUAL, GT-GREATER THAN, HI-UNSIGNED ; HIGHER THAN, LOS-UNSIGNED LOWER OR SAME, HIS-UNSIGNED ; HIGHER OR SAME, LO-LOWER THAN. ; .MACRO WHILE,X1,X2,X3 .NEST=.NEST+1 .BKBGN=.BKBGN+1 .IF NDF,WHILE ;+7,0 .MCALL PUTLBL,GENLBL,GENTST,GOJMP ;+7,0 WHILE=0 ;+7,0 .ENDC ;+7,0 PUTLBL \.NEST,.BKBGN,0 GENLBL \.BKBGN .NARG .ARGN GENTST <>,.ARGN,X1,X2,X3 GOJMP \<.BKBGN+4000> .ENDM WHILE ;*************************************************************** ; ; .SBTTL WHILEB INITIATES 'WHILEB' BLOCK ; ; 'WHILEB' V5M0 28-AUG-74 S.H. ; ; EXECUTES BLOCK WHILE BYTES MEET SPECIFIED CONDITION. ; USES STANDARD PDP-11 BRANCH MNEMONICS PLUS ; 'SETOFF' AND 'SETON' FOR BIT TESTING. 'SETOFF' MEANS ; THAT THERE ARE NO MATCHING BITS IN THE TWO OPERANDS. ; 'SETON' MEANS THAT THERE IS AT LEAST ONE MATCHING ; BIT IN THE TWO OPERANDS. ; .MACRO WHILEB,X1,X2,X3 .NEST=.NEST+1 .BKBGN=.BKBGN+1 .IF NDF,WHILEB ;+7,0 .MCALL PUTLBL,GENLBL,GENTST,GOJMP ;+7,0 WHILEB=0 ;+7,0 .ENDC ;+7,0 PUTLBL \.NEST,.BKBGN,0 GENLBL \.BKBGN .NARG .ARGN GENTST ,.ARGN,X1,X2,X3 GOJMP \<.BKBGN+4000> .ENDM WHILEB ;*************************************************************** .PAGE .SBTTL IF INITIATES 'IF' BLOCK ; ; 'IF' V5M0 28-AUG-74 S.H. ; ; COMPARISONS AND BIT TESTING OCCUR EXACTLY AS IN WHILE ; EXCEPT THAT BLOCK IS EXECUTED ONLY ONCE. ; .MACRO IF,X1,X2,X3 .NEST=.NEST+1 .BKBGN=.BKBGN+1 .IF NDF,IF ;+7,0 .MCALL PUTLBL,GENTST,GOJMP ;+7,0 IF=0 ;+7,0 .ENDC ;+7,0 PUTLBL \.NEST,.BKBGN,2 .NARG .ARGN GENTST <>,.ARGN,X1,X2,X3 GOJMP \<.BKBGN+4000> .ENDM IF ;*************************************************************** ; ; .SBTTL IFB INITIATES 'IFB' BLOCK ; ; 'IFB' V5M0 28-AUG-74 S.H. ; ; SIMILAR TO 'IF' EXCEPT THAT BYTES ARE CHECKED. ; COMPARISONS AND BIT TESTING OCCUR EXACTLY AS IN WHILE ; EXCEPT THAT BLOCK IS EXECUTED ONLY ONCE. ; .MACRO IFB,X1,X2,X3 .NEST=.NEST+1 .BKBGN=.BKBGN+1 .IF NDF,IFB ;+7,0 .MCALL PUTLBL,GENTST,GOJMP ;+7,0 IFB=0 ;+7,0 .ENDC ;+7,0 PUTLBL \.NEST,.BKBGN,2 .NARG .ARGN GENTST ,.ARGN,X1,X2,X3 GOJMP \<.BKBGN+4000> .ENDM IFB ;*************************************************************** .PAGE .SBTTL IFC INITIATES 'IFC' BLOCK ; ; 'IFC' V5M0 22-JUL-74 S.H. ; V5M14 22-JUN-77 J.I. ; ; FORM 1: IFC A,COND,B,NUM ; FORM 2: IFC A,COND,B ; ; WHERE A CONTAINS THE ADDRESS OF THE STRING TO BE COMPARED TO ; THE CHARACTER STRING STORED AT THE ADDRESS GIVEN BY THE ; CONTENTS OF B. THE BLOCK IS EXECUTED IF THE CONDITION ; (COND) IS TRUE. 'IFC' USES THE 'IF' MACRO. IF ARGUMENT NUM ; IS PRESENT, NUM GIVES THE ADDRESS OF THE NUMBER OF CHARACTERS ; TO BE COMPARED. IF ARGUMENT NUM IS NOT PRESENT, ALL CHARACTERS ; UP TO BUT NOT INCLUDING THE FIRST NULL CHARACTER IN STRING A ; ARE COMPARED. IF THE CONTENTS OF NUM ARE EQUAL TO ZERO OR IF ; A NULL IS THE FIRST CHARACTER OF THE STRING, THE RESULT ; IS AN EQUAL COMPARISON (I.E., NULL STRING=NULL STRING). ; NUM SHOULD NEVER BE LESS THAN ZERO. ; ; EXAMPLE: ; IFC #A,LT,X,#3 ; ; COMPARES 3 CHARACTERS AT A TO THE 3 CHARACTERS POINTED TO BY ; THE WORD AT X AND EXECUTES THE BLOCK IF STRING AT A IS ; BEFORE STRING POINTED TO BY THE WORD AT X IN THE ASCII ; COLLATING SEQUENCE. ; .MACRO IFC A,COND,B,NUM ;+5,14 WHOLE MACRO HAS BEEN COMPLETELY ;+5,14 REWRITTEN .IF NDF,IFC ;+7,0 .MCALL SAVE,WHILEB,ANDB,UNSAVE,ELSE,IFB,END,IF,OR ;+7,0 IFC=0 ;+7,0 .ENDC ;+7,0 SAVE R0,R1 ;+5,14 .IIF NB,NUM,SAVE R2 ;+5,14 MOV A,R0 ;+5,14 MOV B,R1 ;+5,14 .IIF NB,NUM,MOV NUM,R2 ;+5,14 WHILEB (R0) NE ;+5,14 .IIF NB,NUM,ANDB R2 GT ;+5,14 ANDB (R0) EQ (R1) ;+5,14 INC R0 ;+5,14 INC R1 ;+5,14 DEC R2 ;+5,14 END ;+5,14 IFB (R0) EQ ;+5,14 A=B ANDB (R1) EQ ;+5,14 .IIF NB,NUM,OR R2 EQ ;+5,14 .IIF NB,NUM,UNSAVE R2 ;+5,14 UNSAVE R0,R1 ;+5,14 CCC ;+5,14 SEZ ;+5,14 ELSE ;+5,14 IFB (R0) EQ ;+5,14 A IS SHORTER THAN B ;+5,14 THEREFORE, AB OR A IS LONGER THAN ;+5,14 B .IIF NB,NUM,UNSAVE R2 ;+5,14 UNSAVE R0,R1 ;+5,14 CCC ;+5,14 ELSE ;+5,14 ;+5,14 A,.ARGN,X1,X2,X3 GOJMP \<.BKBGN+4000> .ENDM AND ;*************************************************************** ; ; .SBTTL ANDB EXTENDS AN 'IF' OR 'WHILE' WITH AND ; ; 'ANDB' V5M1 28-AUG-74 S.H. ; ; ONE OR MORE 'ANDB' STATEMENTS CAN BE WRITTEN IMMEDIATELY ; AFTER AN 'IF' OR 'WHILE' TO GENERATE A SEQUENCE OF ; TESTS CONNECTED BY AND (ALL MUST BE TRUE BEFORE THE BLOCK ; IS EXECUTED. 'ANDB' DOES NOT GENERATE AN ADDITIONAL ; BLOCK AND SHOULD NOT HAVE ITS OWN 'END' STATEMENT. ; ; COMPARISONS AND BIT TESTING OCCURS EXACTLY AS IN WHILE ; EXCEPT THAT BLOCK IS EXECUTED ONLY ONCE. ; .MACRO ANDB,X1,X2,X3 .IF NDF,ANDB ;+7,0 .MCALL GENTST,GOJMP ;+7,0 ANDB=0 .ENDC ;+7,0 .NARG .ARGN GENTST ,.ARGN,X1,X2,X3 GOJMP \<.BKBGN+4000> .ENDM ANDB ;*************************************************************** .PAGE .SBTTL OR EXTENDS AN 'IF' OR 'WHILE' WITH OR ; ; 'OR' V5M4 29-AUG-74 S.H. ; ; ONE OR MORE 'OR' STATEMENTS CAN BE WRITTEN IMMEDIATELY ; AFTER AN 'IF' OR 'WHILE' TO GENERATE A SEQUENCE OF ; TESTS CONNECTED BY OR (ANY CAN BE TRUE TO CAUSE ; BLOCK TO BE EXECUTED). 'OR' DOES NOT GENERATE AN ; ADDITIONAL BLOCK AND SHOULD NOT HAVE ITS OWN 'END'. ; COMPARISONS AND BIT TESTING OCCURS EXACTLY AS IN WHILE ; EXCEPT THAT BLOCK IS EXECUTED ONLY ONCE. ; .MACRO OR,X1,X2,X3 .BKBGN=.BKBGN+1 .IF NDF,OR ;+7,0 .MCALL GOBR,GENLBL,GETLBL,PUTLBL,GENTST,GOJMP ;+7,0 OR=0 ;+7,0 .ENDC ;+7,0 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,X3 GOJMP \<.BKBGN+4000> GENLBL \.BKBGN .ENDM OR ;*************************************************************** ; .SBTTL ORB EXTENDS AN 'IF' OR 'WHILE' WITH OR ; ; 'ORB' V5M4 29-AUG-74 S.H. ; ; ONE OR MORE 'ORB' STATEMENTS CAN BE WRITTEN IMMEDIATELY ; AFTER AN 'IF' OR 'WHILE' TO GENERATE A SEQUENCE OF ; TESTS CONNECTED BY OR (ANY CAN BE TRUE TO CAUSE ; BLOCK TO BE EXECUTED). 'OR' DOES NOT GENERATE AN ; ADDITIONAL BLOCK AND SHOULD NOT HAVE ITS OWN 'END'. ; COMPARISONS AND BIT TESTING OCCURS EXACTLY AS IN WHILE ; EXCEPT THAT BLOCK IS EXECUTED ONLY ONCE. ; .MACRO ORB,X1,X2,X3 .BKBGN=.BKBGN+1 .IF NDF,ORB ;+7,0 .MCALL GOBR,GENLBL,GETLBL,PUTLBL,GENTST,GOJMP ;+7,0 ORB=0 ;+7,0 .ENDC ;+7,0 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,X3 GOJMP \<.BKBGN+4000> GENLBL \.BKBGN .ENDM ORB ;*************************************************************** .SBTTL ELSE TERMINATES 'IF', INITIATES 'ELSE' BLOCK ; ; 'ELSE' V5M0 28-AUG-74 S.H. ; ; TERMINATES IF BLOCK AND BEGINS BLOCK FOR ELSE STATEMENTS. ; IF ELSE IS USED DO NOT USE AN 'END' AFTER 'IF'. ; .MACRO ELSE .BKBGN=.BKBGN+1 .IF NDF,ELSE ;+7,0 .MCALL GOJMP,GETLBL,GENLBL,PUTLBL ;+7,0 ELSE=0 ;+7,0 .ENDC ;+7,0 GOJMP \<.BKBGN+4000> GETLBL \.NEST,.BKEND,.BKTYP GENLBL \<.BKEND+4000> PUTLBL \.NEST,.BKBGN,3 .ENDM ELSE ;*************************************************************** .PAGE .SBTTL INBND INCLUSIVE BOUNDS CHECK ; ; 'INBND' V5M0 24-DEC-74 S.H. ; ; INCLUSIVE BOUNDS CHECK. EXECUTES BLOCK IF ; VARIABLE X2 IS WITHIN THE BOUNDS X1<=C2<=X3. ; .MACRO INBND,X1,X2,X3 .IF NDF,INBND ;+7,0 .MCALL IF,AND ;+7,0 INBND=0 ;+7,0 .ENDC ;+7,0 IF X1,LE,X2 AND X2,LE,X3 .ENDM INBND ;**************************************************************** ; ; .SBTTL INBNDB INCLUSIVE BOUNDS CHECK FOR BYTES ; ; 'INBNDB' V5M0 24-DEC-74 S.H. ; ; INCLUSIVE BOUNDS CHECK FOR BYTES. EXECUTES BLOCK IF ; VARIABLE X2 IS WITHIN THE BOUNDS X1<=C2<=X3. ; .MACRO INBNDB,X1,X2,X3 .IF NDF,INBNDB ;+7,0 .MCALL IFB,ANDB ;+7,0 INBNDB=0 ;+7,0 .ENDC ;+7,0 IFB X1,LE,X2 ANDB X2,LE,X3 .ENDM INBNDB ;**************************************************************** ; ; .SBTTL EXBND EXCLUSIVE BOUNDS CHECK ; ; 'EXBND' V5M0 24-DEC-74 S.H. ; ; EXCLUSIVE BOUNDS CHECK. EXECUTES BLOCK IF VARIABLE X2 ; IS OUTSIDE THE BOUNDS X1>X2>X3. ; .MACRO EXBND,X1,X2,X3 .IF NDF,EXBND ;+7,0 .MCALL IF,OR ;+7,0 EXBND=0 ;+7,0 .ENDC ;+7,0 IF X1,GT,X2 OR X2,GT,X3 .ENDM EXBND ;**************************************************************** ; ; .SBTTL EXBNDB EXCLUSIVE BOUNDS CHECK FOR BYTES ; ; 'EXBNDB' V5M0 24-DEC-74 S.H. ; ; EXCLUSIVE BOUNDS CHECK FOR BYTES. EXECUTES BLOCK IF VARIABLE X2 ; IS OUTSIDE THE BOUNDS X1>X2>X3. ; .MACRO EXBNDB,X1,X2,X3 .IF NDF,EXBNDB ;+7,0 .MCALL IFB,ORB ;+7,0 EXBNDB=0 ;+7,0 .ENDC ;+7,0 IFB X1,GT,X2 ORB X2,GT,X3 .ENDM EXBNDB ;**************************************************************** .PAGE .SBTTL FOR INITIATES 'FOR' BLOCK ; ; 'FOR' V5M1 28-AUG-74 S.H. ; ; INCREASING ITERATIVE 'FOR' LOOP. ; FORM IS: ; FOR A,B,C,D ; A IS THE INDEX. A CANNOT BE AN ; IMMEDIATE OPERAND. ; B IS THE INITIAL VALUE OF THE INDEX ; C IS THE LIMIT ; D IS THE OPTIONAL INCREMENT. D IS ; ASSUMED TO BE 1 IF NOT PRESENT. ; ; ANY CHANGES TO THE LIMIT AND INCREMENT DURING LOOP ; EXECUTION WILL BE REFLECTED IN THE NEXT ; PASS THROUGH THE LOOP TEST. ; THE INDEX IS ASSUMED TO BE AN SIGNED PDP-11 INTEGER. ; C>=B SHOULD ALWAYS BE TRUE. ; .MACRO FOR,X1,X2,X3,X4 .BKBGN=.BKBGN+1 .NEST=.NEST+1 .IF NDF,FOR ;+7,0 .MCALL PUTLBL,GENLBL,GOJMP ;+7,0 FOR=0 ;+7,0 .ENDC ;+7,0 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 X1 .IFF ADD X4,X1 .ENDC CMP X1,X3 BLE .+6 GOJMP \<.BKBGN+4000> .ENDM FOR ;*************************************************************** .PAGE .SBTTL CASE INITIATES 'CASE' BLOCK ; ; 'CASE' V5M0 24-DEC-74 S.H. ; ; FORM IS: ; CASE I, ; WHERE I IS THE CASE # AND A,B,C,D ARE ; THE ADDRESSES OF THE RESPECTIVE CASE ; ELEMENTS. ; IF I IS LESS THAN 1 OR GREATER THAN THE NUMBER OF CASES ; LISTED THEN NO CASES ARE EXECUTED. EACH CASE ELEMENT ; SHOULD BE TERMINATED WITH AN 'END' AND ALL CASES ; IN THE CASE BLOCK SHOULD BE TERMINATED WITH AN ADDITIONAL ; 'END' TO END THE CASE BLOCK ITSELF. ; .MACRO CASE,X1,X2 .BKBGN=.BKBGN+1 .NEST=.NEST+1 .CASE=.CASE+1 .IF NDF,CASE ;+7,0 .MCALL NUMELM,PUTCSE,PUTLBL,GOJMP ;+7,0 CASE=0 ;+7,0 .ENDC ;+7,0 NUMELM X2 PUTCSE \.CASE,.ARGN PUTLBL \.NEST,.BKBGN,5 MOV X1,-(SP) BLE .+8. CMP #.ARGN,(SP) BGE .+8. TST (SP)+ GOJMP \<.BKBGN+4000> ASL (SP) ADD PC,(SP) MOV @(SP)+,PC .WORD X2 .ENDM CASE ;*************************************************************** .PAGE .SBTTL CASEB INITIATES 'CASEB' BLOCK ; ; 'CASEB' V5M0 24-DEC-74 S.H. ; ; FORM IS: ; CASEB I, ; WHERE I IS THE CASE # AND A,B,C,D ARE ; THE ADDRESSES OF THE RESPECTIVE CASE ; ELEMENTS. ; IF I IS LESS THAN 1 OR GREATER THAN THE NUMBER OF CASES ; LISTED THEN NO CASES ARE EXECUTED. EACH CASE ELEMENT ; SHOULD BE TERMINATED WITH AN 'END' AND ALL CASES ; IN THE CASE BLOCK SHOULD BE TERMINATED WITH AN ADDITIONAL ; 'END' TO END THE CASE BLOCK ITSELF. ; .MACRO CASEB,X1,X2 .BKBGN=.BKBGN+1 .NEST=.NEST+1 .CASE=.CASE+1 .IF NDF,CASEB ;+7,0 .MCALL NUMELM,PUTCSE,PUTLBL,GOJMP ;+7,0 CASEB=0 ;+7,0 .ENDC ;+7,0 NUMELM X2 PUTCSE \.CASE,.ARGN PUTLBL \.NEST,.BKBGN,5 MOVB X1,-(SP) BLE .+8. CMPB #.ARGN,(SP) BGE .+8. TSTB (SP)+ GOJMP \<.BKBGN+4000> ASLB (SP) CLRB 1(SP) ADD PC,(SP) MOV @(SP)+,PC .WORD X2 .ENDM CASEB ;*************************************************************** .PAGE .SBTTL END TERMINATES BLOCKS ; ; 'END' V5M1 28-AUG-74 S.H. ; V6M0 27-JUN-77 J.I. ; ; TERMINATES 'FIND','WHILE', 'FOR', 'ELSE', 'EXLIM', 'INLIM', ; AND 'CASE' BLOCKS AND CASE ELEMENT BLOCKS. EACH TYPE OF ; BLOCK HAS ITS OWN TYPE AS GIVEN BY THE VALUE OF SYMBOL ; .BKTYP AS FOLLOWS: ; ; .BKTYP TYPE OF BLOCK TO BE ENDED ; ; <0 WHILE EXTENDED WITH 'OR' STATEMENTS ; 0 WHILE ; 1 FOR ; 2 IF ; 3 ELSE ; 4 REPEAT (USES 'UNTIL' INSTEAD OF 'END') ; 5 CASE ; 6 FIND ; 10 TEXT ; 12 PROC ;*************************************************************** ; ; ; SYMBOL .BKEND HAS THE VALUE OF THE LAST BLOCK ; ENTERED AND IS REDUCED BY 1 AFTER EACH END STATEMENT. ; 'END' HAS ONE ARGUMENT TO ALLOW LABEL ON END STATEMENT ; AS IN PL/1. ; ; SYMBOL .BKTYP HAS THE VALUE OF THE TYPE OF THE LAST BLOCK ; ENTERED AND IS USED TO DETERMINE WHAT CODE IS TO BE ; GENERATED. IN THE CASE OF AN 'OR' EXTENDING A 'WHILE', ; .BKTYP IS ALSO THE NEGATIVE OF THE COUNT OF 'OR'S ; EXTENDING THE 'WHILE'. ; ; SYMBOL .NEST HAS THE VALUE OF THE DEPTH OF THE BLOCK ; NESTING OF THE BLOCK LAST ENTERED. ; ; SYMBOL .CASE HAS THE VALUE OF THE DEPTH OF THE 'CASE' ; NESTING OF THE LAST 'CASE' BLOCK ENTERED. ; ; SYMBOLS .CSLXX HAVE THE VALUES OF THE NUMBER OF CASE ; ELEMENTS LEFT IN CASE LEVEL XX. ; ; SYMBOL .CASEL HAS THE VALUE OF THE NUMBER OF CASE ; ELEMENTS AS IT IS REDUCED IN A CASE ELEMENT BLOCK. .PAGE ; SYMBOLS .XXXX ARE THE STATEMENT LABELS AT THE BEGINING ; OF BLOCKS IF SUCH BLOCKS NEED LABELS. ; ; SYMBOLS .4XXXX ARE THE STATEMENT LABELS AT THE END OF ; BLOCKS IF SUCH BLOCKS NEED END LABELS. ; ; SYMBOLS .NSTXX HOLD THE BLOCK STATEMENT LABEL NUMBER FOR ; BLOCK NESTING LEVEL XX. ; ; SYMBOLS .TYPXX HOLD THE BLOCK TYPE NUMBER FOR THE BLOCK ; AT NESTING LEVEL XX. ; ; ; NOTE THAT IF THE 'END' CLOSES A 'WHILE' BLOCK EXTENDED ; BY ONE OR MORE 'OR' STATEMENTS, THEN THE BLOCK TYPE VALUE ; (.BKTYP) IS NEGATIVE AND SHOWS HOW MANY INTERVENING LABELS ; AT THE CURRENT NEST LEVEL WERE GENERATED BY 'OR' EXTENSIONS. ; EACH 'OR' INCREASES THE BLOCK COUNT BY ONE (BUT NOT ; THE NEST LEVEL). THUS IS IS NECESSARY TO REDUCE THE ; CURRENT BLOCK COUNT BY THE NUMBER OF 'OR'S EXTENDING THE 'WHILE' ; IN ORDER TO GENERATE THE PROPER LABEL TO REPEAT THE 'WHILE' ; BLOCK. THE PROPER BLOCK LABEL VALUE TO REPEAT THE WHILE CAN ; BE DETERMINED BY ADDING THE NEGATIVE .BKTYP VALUE TO THE ; CURRENT BLOCK NUMBER IN .BKEND. .PAGE .MACRO END,X1 .IF NDF,END ;+7,0 .MCALL GETLBL,GOBAK,GENLBL,GETCSE,PUTCSE,GOJMP ;+7,0 END=0 ;+7,0 .ENDC ;+7,0 GETLBL \.NEST,.BKEND,.BKTYP .NEST=.NEST-1 .IF LT,.NEST .ERROR ;TOO MANY 'END' STATEMENTS .MEXIT .ENDC .IF LE,.BKTYP GOBAK \<.BKEND+.BKTYP> GENLBL \<.BKEND+4000> .MEXIT .ENDC .IF EQ,.BKTYP-1 GOBAK \.BKEND GENLBL \<.BKEND+4000> .MEXIT .ENDC .IF LE,.BKTYP-3 GENLBL \<.BKEND+4000> .MEXIT .ENDC .IF EQ,.BKTYP-6 GENLBL \<.BKEND+4000> ADD #12,SP .MEXIT .ENDC .IF EQ,.BKTYP-10 RTS R5 .MEXIT .ENDC .IF EQ,.BKTYP-12 RETURN .MEXIT .ENDC .IF EQ,.BKTYP-5 GETCSE \.CASE,.CASEL .IF EQ,.CASEL GENLBL \<.BKEND+4000> .CASE=.CASE-1 .MEXIT .IFF .NEST=.NEST+1 .CASEL=.CASEL-1 PUTCSE \.CASE,.CASEL GOJMP \<.BKEND+4000> .MEXIT .ENDC .ENDC .ENDM END ;*************************************************************** .PAGE .SBTTL REPEAT INITIATES 'REPEAT' BLOCK ; ; 'REPEAT' V1M0 19-MAR-74 S.H. ; ; REPEATS THE FOLLOWING BLOCK UNTIL THE CONDITION ON THE ; ASSOCIATED 'UNTIL' STATEMENT IS SATISFIED. ; .MACRO REPEAT,X1 .BKBGN=.BKBGN+1 .NEST=.NEST+1 .IF NDF,REPEAT ;+7,0 .MCALL PUTLBL,GENLBL ;+7,0 REPEAT=0 ;+7,0 .ENDC ;+7,0 PUTLBL \.NEST,.BKBGN,4 GENLBL \.BKBGN .ENDM REPEAT ;********************************************************** ; ; .SBTTL UNTIL TERMINATES 'REPEAT' BLOCKS ; ; 'UNTIL' V5M0 28-AUG-74 S.H. ; ; TESTS CONDITION AND REPEATS PRECEDING 'REPEAT' BLOCK ; UNTIL CONDITION IS TRUE. GOJMP FORCES A 'JMP'. ; .MACRO UNTIL,X1,X2,X3 .IF NDF,UNTIL ;+7,0 .MCALL GETLBL,GENTST,GOJMP ;+7,0 UNTIL=0 ;+7,0 .ENDC ;+7,0 GETLBL \.NEST,.BKEND,.BKTYP .NEST=.NEST-1 .NARG .ARGN GENTST <>,.ARGN,X1,X2,X3 GOJMP \.BKEND .ENDM UNTIL ;********************************************************** ; ; .SBTTL UNTILB TERMINATES 'REPEAT' BLOCKS ; ; 'UNTILB' V5M0 28-AUG-74 S.H. ; ; TESTS BYTE CONDITION AND REPEATS 'REPEAT' BLOCK ; UNTIL CONDITION IS TRUE. GOJMP FORCES A 'JMP'. ; .MACRO UNTILB,X1,X2,X3 .IF NDF,UNTILB ;+7,0 .MCALL GETLBL,GENTST,GOJMP ;+7,0 UNTILB=0 ;+7,0 .ENDC ;+7,0 GETLBL \.NEST,.BKEND,.BKTYP .NEST=.NEST-1 .NARG .ARGN GENTST ,.ARGN,X1,X2,X3 GOJMP \.BKEND .ENDM UNTILB ;********************************************************** .PAGE .SBTTL TEXT INITIATES A 'TEXT' BLOCK ; ; 'BLOCK' V1M2 22-APR-74 S.H. ; .MACRO TEXT X1,X2 .BKBGN=.BKBGN+1 .NEST=.NEST+1 .IF NDF,TEXT ;+7,0 .MCALL PUTLBL ;+7,0 TEXT=0 ;+7,0 .ENDC ;+7,0 PUTLBL \.NEST,.BKBGN,10 .NARG .ARGN .IIF GT,.ARGN-1,.SBTTL X1 X2 .LIST ; ; ********TEXT********** ; * * ; * X1 * ; * * ; ********************** X1: .NLIST .ENDM TEXT ;********************************************************** .PAGE .SBTTL PROC INITIATES A PROCEDURE BLOCK ; ; 'PROC' V1M2 22-APR-74 S.H. ; .MACRO PROC,X1,X2 .BKBGN=.BKBGN+1 .NEST=.NEST+1 .IF NDF,PROC ;+7,0 .MCALL PUTLBL ;+7,0 PROC=0 ;+7,0 .ENDC ;+7,0 PUTLBL \.NEST,.BKBGN,12 .NARG .ARGN .IIF GT,.ARGN-1,.SBTTL X1 X2 .LIST ; ; ********PROC************* ; * * ; * X1 * ; * * ; ************************* X1: .NLIST .ENDM PROC ;********************************************************** .PAGE .SBTTL HEAD CAUSES A HEADING BOX TO BE PRINTED ; ; 'HEAD' V1M1 22-APR-74 S.H. ; .MACRO HEAD,X1,X2 .NARG .ARGN .IIF GT,.ARGN-1,.SBTTL X1 X2 .LIST ; ; ********************** ; * * ; * X1 * ; * * ; ********************** ; .NLIST .ENDM HEAD ;********************************************************** ; ; .SBTTL ENDCHK PROVIDES 'END' PAIR CHECKING ; ; 'ENDCHK' V1M1 22-APR-74 S.H. ; .MACRO ENDCHK .IIF GT,.NEST,.ERROR ;TOO FEW 'END' STATEMENTS .ENDM ENDCHK ;********************************************************** .PAGE ; '.ASNUM' V5M0 24-DEC-74 ; ; CONVERTS PROOF NUMBER TO CHARACTER STRING AND LISTS AS COMMENT .MACRO .ASNUM,X1 .LIST ;>--X1--> ASSERTION X1 HAS BEEN ASSEMBLED. .NLIST .ENDM .ASNUM ;**************************************************************** ; ; .SBTTL ASSERT ASSERTION FOR PROGRAM VERIFICATION ; ; 'ASSERT' V5M0 24-DEC-74 ; ; ASSERTION STATEMENT TO ASSIST IN VERIFYING PROGRAMS. ; IS OPTIONALLY ASSEMBLED. ASSEMBLED IF SYMBOL 'PROOF' IS ; DEFINED TO BE > 0, NOT ASSEMBLED OTHERWISE. AN ERROR MESSAGE ; IS PRINTED IF THE ASSERTION IS NOT TRUE. ; .MACRO ASSERT,X1,X2,X3 .IF NDF,ASSERT ;+7,0 .MCALL .ASNUM,IF,ELSE,CHECK,END ;+7,0 ASSERT=0 ;+7,0 .ENDC ;+7,0 .IF DF,PROOF .IF GT,PROOF .ASNUM \PROOF .NARG .ARGN .IIF EQ,.ARGN-3 IF X1,X2,X3 .IIF EQ,.ARGN-2 IF X1,X2 .IIF EQ,.ARGN-1 IF X1 ELSE CHECK #PROOF, CHECK PC END PROOF=PROOF+1 .ENDC .ENDC .ENDM ASSERT ;**************************************************************** .PAGE .SBTTL ASSERB ASSERTION FOR BYTES ; ; 'ASSERB' V5M0 24-DEC-74 ; ; ASSERTION STATEMENT FOR BYTE VARIABLES TO ASSIST IN VERIFICATION ; IS OPTIONALLY ASSEMBLED. ASSEMBLED IF SYMBOL 'PROOF' IS ; DEFINED TO BE > 0, NOT ASSEMBLED OTHERWISE. AN ERROR MESSAGE IS ; PRINTED IF THE ASSERTION IS NOT TRUE. ; .MACRO ASSERB,X1,X2,X3 .IF NDF,ASSERB ;+7,0 .MCALL .ASNUM,IFB,ELSE,CHECK,END ;+7,0 ASSERB=0 ;+7,0 .ENDC ;+7,0 .IF DF,PROOF .IF GT,PROOF .ASNUM \PROOF .NARG .ARGN .IIF EQ,.ARGN-3 IFB X1,X2,X3 .IIF EQ,.ARGN-2 IFB X1,X2 .IIF EQ,.ARGN-1 IFB X1 ELSE CHECK #PROOF, CHECK PC END PROOF=PROOF+1 .ENDC .ENDC .ENDM ASSERB ;**************************************************************** .PAGE .SBTTL SPECIAL PURPOSE MACROS .SBTTL ; ; .SBTTL INDEX SETS UP A WORD INDEX POINTER ; ; 'INDEX' V5M0 24-JUL-74 B.W. ; ;INDEX USES A MEMORY LOCATION, STOR, AND A REGISTER, REG. ;THE VALUE IN REG IS THE VALUE IN STOR, CONVERTED TO AN INDEX. ;THAT IS, STOR IS PLACED IN REG, DECREMENTED ;AND SHIFTED LEFT. VALUES IN STOR ARE SEQUENTIAL BEGINNING ;WITH 1. VALUES IN REG ARE ALWAYS EVEN, BEGINNING WITH 0. ; .MACRO INDEX OP1,OP2 .IF NB,OP2 MOV OP1,OP2 DEC OP2 ASL OP2 .MEXIT .IFF DEC OP1 ASL OP1 .ENDC .ENDM INDEX ;********************************************************** .PAGE .SBTTL SWAP SWAP THE VALUE OF TWO WORD VARIABLES ; ; 'SWAP' V5M0 24-JUL-74 B.W. ; ;SWAP IS USED TO EXCHANGE THE VALUES OF TWO GIVEN ;WORD VARIABLES. IT IS USED AS: ; ; SWAP X,Y ; ;WHERE X WILL CONTAIN WHAT Y DID AND VICE VERSA. ;NOTE THAT THE STACK IS USED FOR TEMPORARY STORAGE. ; .MACRO SWAP X,Y MOV Y,-(SP) MOV X,Y MOV (SP)+,X .ENDM SWAP ;********************************************************** ; ; .SBTTL SWAPB SWAP THE VALUE OF TWO BYTE VARIABLES ; ; 'SWAPB' V5M0 24-JUL-74 B.W. ; ;SWAPB IS USED TO EXCHANGE THE VALUES OF TWO GIVEN ;BYTE VARIABLES. IT IS USED AS: ; ; SWAPB X,Y ; ;WHERE X WILL CONTAIN WHAT Y DID AND VICE VERSA. ;NOTE THAT THE STACK IS USED FOR TEMPORARY STORAGE. ; .MACRO SWAPB X,Y MOVB Y,-(SP) MOVB X,Y MOVB (SP)+,X .ENDM SWAPB ;********************************************************** .PAGE .SBTTL MOVC MOVES CHARACTER STRINGS ; ; 'MOVC' V5M0 22-JUL-74 S.H. ; V7M1 1-NOV-77 J.I. ; ; FORM 1: MOVC SRC,DST,NUM ; FORM 2: MOVC SRC,DST ; ; WHERE SRC CONTAINS THE ADDRESS OF THE SOURCE STRING, DST ; CONTAINS THE DESTINATION ADDRESS, AND NUM, IF PRESENT, IS THE ; ADDRESS OF THE NUMBER OF CHARACTERS TO MOVE. ; ; MOVC A,B ; MOVC A,B,C ; MOVC A,B,#7 ; MOVC (SP)+,B,(J) ; ; IF NUM IS NOT PRESENT, THE STRING AT A IS MOVED UP TO AND ; INCLUDING THE FIRST NULL CHARACTER. ; .MACRO MOVC SRC,DST,NUM .IF NDF,MOVC ;+7,0 .MCALL SAVE,UNSAVE,WHILEB,WHILE,END ;+7,0 MOVC=1 ;+7,0 .ENDC ;+7,0 SAVE SRC,DST ;+7,1 PUT SRC AND DST ON STACK .IF B,NUM ;+7,1 IF NO NUM THEN MOVC UNTIL A ;+7,1 0 BYTE WHILEB @2(SP) NE ;+7,1 MOVB @2(SP),@(SP) ;+7,1 INC 2(SP) ;+7,1 MOVE ON INC (SP) ;+7,1 END ;+7,1 .IFF ;+7,1 SAVE NUM ;+7,1 ALSO SAVE NUM ON STACK WHILE (SP) NE ;+7,1 CONTINUE UNTIL (SP) GETS TO 0 MOVB @4(SP),@2(SP) ;+7,1 INC 4(SP) ;+7,1 INC 2(SP) ;+7,1 MOVE ON DEC (SP) ;+7,1 SUB 1 AND GO BACK END ;+7,1 ADD #2,SP ;+7,1 READJUST STACK .IFTF ;+7,1 AND POP OFF SRC AND DST ADD #4,SP ;+7,1 .ENDC ;+7,1 .ENDM MOVC ;************************************************************* .PAGE .SBTTL MOVW MOVES WORDS ; ; 'MOVW' V5M0 22-JUL-74 S.H. ; V7M1 1-NOV-77 J.I ; ; FORM 1: MOVW SRC,DST,NUM ; FORM 2: MOVW SRC,DST ; ; WHERE SRC CONTAINS THE ADDRESS OF THE SOURCE LIST, DST CONTAINS ; THE DESTINATION ADDRESS, AND NUM, IF PRESENT, CONTAINS THE ; COUNT OF THE NUMBER OF WORDS TO MOVE. EXAMPLES: ; ; MOVW A,B ; MOVW A,B,C ; MOVW A,B,#7 ; MOVW (SP)+,B,(J) ; ; IF NUM IS NOT PRESENT, THE LIST AT A IS MOVED UP TO AND ; INCLUDING THE FIRST NULL WORD. ; .MACRO MOVW SRC,DST,NUM .IF NDF,MOVW ;+7,0 .MCALL SAVE,UNSAVE,WHILE,WHILEB,END ;+7,0 MOVW=1 ;+7,0 .ENDC ;+7,0 SAVE SRC,DST ;+7,1 PUT SRC AND DST ON STACK .IF B,NUM ;+7,1 IF NO NUM THEN MOVW UNTIL ;+7,1 A 0 WORD WHILEB @2(SP) NE ;+7,1 MOV @2(SP),@(SP) ;+7,1 ADD #2,2(SP) ;+7,1 ADD #2,(SP) ;+7,1 MOVE ON END ;+7,1 .IFF ;+7,1 SAVE NUM ;+7,1 ALSO SAVE NUM ON STACK WHILE (SP) NE ;+7,1 CONTINUE UNTIL (SP) GETS TO 0 MOV @4(SP),@2(SP) ;+7,1 ADD #2,4(SP) ;+7,1 MOVE ON ADD #2,2(SP) ;+7,1 DEC (SP) ;+7,1 END ;+7,1 ADD #2,SP ;+7,1 READJUST STACK .IFTF ;+7,1 AND POP OFF SRC AND DST ADD #4,SP ;+7,1 .ENDC ;+7,1 .ENDM MOVW ;**************************************************************** .PAGE .SBTTL NOTE DISPLAYS LINE ON TERMINAL ; ; 'NOTE' V5M0 18-JUL-74 S.H. ; ; GENERATES A CALL TO TIMSG TO OUTPUT A LINE. TEXT ; SHOULD BE ENCLOSED IN <...>. FORM IS: ; ; NOTE ; ; THE EXPRESSION <<.NCHRS+2>/2>*2 GIVES THEN NUMBER OF "WORDS" ; REQUIRED FOR THE CHARACTER STRING AND TRAILING NULL. ; .MACRO NOTE,STRING .IF NDF,NOTE ;+7,0 .MCALL INVOKE ;+7,0 NOTE=0 ;+7,0 .ENDC ;+7,0 INVOKE TIMSG,<.+4> .NCHR .NCHRS, .NCHRS=<<.NCHRS+2>/2>*2 BR .+2+.NCHRS .ASCIZ "STRING" .EVEN .ENDM NOTE ;********************************************************** .PAGE .SBTTL CHECK DISPLAYS VALUE ON TERMINAL ; ; 'CHECK' V5M4 14-AUG-74 S.H. ; V5M13 21-JUN-77 J.I. ; V5M14 23-JUN-77 J.I. ; ; CAUSES THE VALUE AND ANY DESCRIPTIVE TEXT TO BE OUTPUT ; TO THE TI. FORM IS: ; ; CHECK X, ; CHECK X ; ; EITHER FORM IS OK. X APPEARS AS OCTAL AND SIGNED DECIMAL ; IN THAT ORDER OOOOO(+DDDDD). ; .MACRO CHECK,X,STRING,?MSG,?OCT,?DEC,?ARO .ENABLE LSB ;-5,13 2 LINES DELETED .IF NDF,CHECK ;+7,0 .MCALL SAVE,FOR,END,UNSAVE,INVOKE ;+7,0 CHECK=0 ;+7,0 .ENDC ;+7,0 SAVE R0,R1,R2 ;+5,13 SAVE REGS FOR R0 #OCT #DEC-2 ;+5,14 BLANK OUT OCTAL AREA MOVB #' ,(R0) ;+5,14 IN CASE OF REUSE END ;+5,14 FOR R0 #DEC #DEC+5 ;+5,14 BLANK OUT DECIMAL AREA MOVB #' ,(R0) ;+5,14 IN CASE OF REUSE END ;+5,14 MOV #OCT,R0 ;+5,13 ADDR TO STORE OCTAL ;+5,13 CONVERSION .IF IDN,X,R2 ;+5,14 MOV (SP),R1 ;+5,14 GET USERS R2 VALUE .IFF ;+5,14 .IF IDN,X,R1 ;+5,14 MOV 2(SP),R1 ;+5,14 GET USERS R1 VALUE .IFF ;+5,14 .IF IDN,X,R0 ;+5,14 MOV 4(SP),R1 ;+5,14 GET USERS R0 VALUE .IFF ;+5,14 MOV X,R1 ;+5,14 GET ANY OTHER VALUE .ENDC ;+5,14 .ENDC ;+5,14 .ENDC ;+5,14 MOV #1,R2 ;+5,13 DO NOT SUPRESS LEADING ZEROS CALL $CBOMG ;+5,13 CONVERT BINARY TO OCTAL MOV #DEC,R0 ;+5,13 ADDR TO STORE DECIMAL .IF IDN,X,R2 ;+5,14 MOV (SP),R1 ;+5,14 GET USERS R2 VALUE .IFF ;+5,14 .IF IDN,X,R1 ;+5,14 MOV 2(SP),R1 ;+5,14 GET USERS R1 VALUE .IFF ;+5,14 .IF IDN,X,R0 ;+5,14 MOV 4(SP),R1 ;+5,14 GET USERS R0 VALUE .IFF ;+5,14 MOV X,R1 ;+5,14 GET ANYTHING ELSE .ENDC ;+5,14 .ENDC ;+5,14 .ENDC ;+5,14 CALL $CBDSG ;+5,13 CONVERT TO DECIMAL WITH SIGN ;-5,13 8 LINES DELETED INVOKE TIMSG, ;+5,13 PRINT IT AT THE TERMINAL ;-5,13 5 LINES DELETED UNSAVE R0,R1,R2 ;+5,13 BR ARO ;+5,13 MSG: .ASCII "X= " OCT: .ASCII " (" DEC: .ASCII " ) " .ASCIZ "STRING" .EVEN ARO: .ENDM CHECK ;********************************************************** .PAGE .SBTTL .SBTTL SEARCH MACROS .SBTTL .SBTTL IFFND MATCH FOUND IN LINEAR SEARCH ; ; 'IFFND' V6M0 27-JUN-77 J.I. ; ; IFFND COND ; ; THIS MACRO IS REQUIRED BETWEEN THE FIND MACRO AND ; ITS ASSOCIATED END. IF NO CODE FOLLOWS IT THEN COND ; MAY BE LEFT OUT. THE CODE WILL BE EXECUTED IF THE ; CONDITION IS MET AND EXECUTION WILL CONTINUE AT THE ; END STATEMENT. OTHERWISE, THE NEXT ELEMENT IN THE ; TABLE IS USED IN THE COMPARISON. ; .MACRO IFFND COND .BKBGN=.BKBGN+1 .IF NDF,IFFND ;+7,0 .MCALL GETLBL,GOBAK,GOJMP,GENLBL,GOBR ;+7,0 IFFND=0 ;+7,0 .ENDC ;+7,0 GETLBL \.NEST,.BKEND,.BKTYP .IIF NB,COND,GOBR \.BKBGN,COND ADD 4(SP),0(SP) CMP 0(SP),2(SP) GOBAK \.BKEND,LT GOJMP \<.BKEND+4000> GENLBL \.BKBGN .ENDM IFFND .PAGE .SBTTL IFNFND MATCH NOT FOUND IN LINEAR/BINARY SEARCH ; ; 'IFNFND' V6M0 27-JUN-77 J.I. ; ; IFNFND ; ; IF THE COMPARISON IS NOT MADE SUCCESSFULLY FOR ANY ELEMENT ; IN THE TABLE THEN GENERALLY NO CODE WILL BE EXECUTED FOR ; THE FIND. IF IFNFND APPEARS AFTER THE IFFND, THEN THE CODE ; WILL BE EXECUTED FIRST (SIMILAR TO THE ELSE). ; .MACRO IFNFND .BKBGN=.BKBGN+1 .IF NDF,IFNFND ;+7,0 .MCALL GOJMP,GETLBL,GENLBL,PUTLBL ;+7,0 IFNFND=0 ;+7,0 .ENDC ;+7,0 GOJMP \<.BKBGN+4000> GETLBL \.NEST,.BKEND,.BKTYP GENLBL \<.BKEND+4000> PUTLBL \.NEST,.BKBGN,.BKTYP .ENDM IFNFND .PAGE .SBTTL GETKY RETRIEVE CURRENT ELEMENT BEING SEARCHED ; ; 'GETKY' V6M0 27-JUN-77 J.I. ; ; GETKY ADDR ; ; TAKES THE ADDRESS OF THE CURRENT ELEMENT BEING LOOKED ; AT IN THE SEARCH AND PUTS IT IN ADDR ; .MACRO GETKY ADDR MOV 0(SP),ADDR .ENDM GETKY .PAGE .SBTTL PUTKY SETS UP ADDRESS OF NEXT ELEMENT TO BE SEARCHED ; ; 'PUTKY' V6M0 27-JUN-77 J.I. ; ; PUTKY ADDR ; ; TAKES THE VALUE AT ADDR AS THE ADDRESS OF THE NEXT ELEMENT ; TO BE SEARCHED ; .MACRO PUTKY ADDR MOV ADDR,0(SP) .ENDM PUTKY .PAGE .SBTTL FIND SEARCH A TABLE IN LINEAR FASHION ; ; 'FIND' V6M0 27-JUN-77 J.I. ; ; FIND X,TBL,TBLSZ,TBLELSZ,XSZ ; WHERE ; X = THE ADDRESS OF THE ELEMENT ; TO COMPARE AGAINST. IT IS ASSUMMED ; THAT XSZ WILL TELL US HOW MANY BYTES ; OF X SHOULD BE COMPARED TO HOW MANY ; BYTES OF THE ELEMENT. THE COMPARISON ; CONTINUES ONLY TILL NONEQUALITY IS FOUND ; OR XSZ BYTES ARE COMPARED. IF ; A MORE COMPLEX COMPARE IS NEEDED, THEN ; X SHOULD BE LEFT OUT AND THE COMPARE ; CODE IS TO BE INSERTED BETWEEN THE FIND ; AND END MACROS ; TBL = THE ADDRESS OF THE BEGINNING OF THE ; TABLE ; TBLSZ = THE SIZE OF THE TABLE IN BYTES ; TBLELSZ = THE SIZE OF EACH ELEMENT OF THE ; TABLE IN BYTES. IF LEFT OUT, IT ; IS ASSUMMED TO BE 2. ; XSZ = THE SIZE OF X IN BYTES. IF LEFT OUT, ; IT IS ASSUMMED TO BE 2. ; ; THE TABLE IS SEARCHED SEQUENTIALLY ELEMENT BY ELEMENT UNTIL ; THE COMPARISON CONDITION AS SPECIFIED BY THE SECOND ARGUMENT ; ON THE END STATEMENT HOLDS TRUE OR THE END OF THE ; TABLE WAS REACHED. ; ; DURING THE SEARCH THE CONTENTS OF THE LOCATION POINTED TO ; BY TBL WILL BE INCREMENTED AND WILL POINT TO THE ELEMENT THAT ; MATCHED AT THE CONCLUSION (OR ONE ELEMENT PAST THE END OF ; THE TABLE IS NO MATCH WAS FOUND). ; .MACRO FIND X,TBL,TBLSZ,TBLELSZ,XSZ .NEST=.NEST+1 .BKBGN=.BKBGN+1 .IF NDF,FIND ;+7,0 .MCALL PUTLBL,GENLBL,IFC ;+7,0 FIND=0 ;+7,0 .ENDC ;+7,0 PUTLBL \.NEST,.BKBGN,6 .IF NB,X MOV X,-(SP) .IFF CLR -(SP) .ENDC .IF NB,XSZ MOV XSZ,-(SP) .IFF MOV #2,-(SP) .ENDC .IF NB,TBLELSZ MOV TBLELSZ,-(SP) .IFF MOV #2,-(SP) .ENDC MOV TBL,-(SP) ADD TBLSZ,(SP) MOV TBL,-(SP) GENLBL \.BKBGN .IF NB,X IFC 16(SP),EQ,6(SP),14(SP) END .ENDC .ENDM FIND .END