1
0
mirror of https://github.com/PDP-10/stacken.git synced 2026-03-07 11:17:06 +00:00
Files
Lars Brinkhoff 6e18f5ebef Extract files from tape images.
Some tapes could not be extracted.
2021-01-29 10:47:33 +01:00

778 lines
25 KiB
Plaintext
Raw Permalink Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
TITLE PROJCT - PROGRAM TO CONVERT PROJCT.ACT TO PROJCT.SYS FOR VALIDATION - V1(11)
;COPYRIGHT (c) DIGITAL EQUIPMENT CORPORATION 1979,1980,1984,1986.
;ALL RIGHTS RESERVED.
;
;
;THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED AND COPIED
;ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE AND WITH THE
;INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE OR ANY OTHER
;COPIES THEREOF MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE TO ANY
;OTHER PERSON. NO TITLE TO AND OWNERSHIP OF THE SOFTWARE IS HEREBY
;TRANSFERRED.
;
;THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT NOTICE
;AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT
;CORPORATION.
;
;DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ITS
;SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DIGITAL.
SUBTTL AECARLSON/AEC/BAH/JMF 29-Jan-81
SALL
SEARCH UUOSYM,MACTEN,ACTSYM
PRJVER==1 ;MAJOR VERSION
PRJEDT==11 ;EDIT LEVEL
PRJMIN==0 ;MINOR VERSION
PRJWHO==0 ;LAST MODIFIER
LOC 137
VRSN. (PRJ)
RELOC
COPYRIGHT (c) DIGITAL EQUIPMENT CORPORATION 1979,1986.ALL RIGHTS RESERVED.
\;END COPYRIGHT MACRO
X==4
MASK==5
T1==6
T2==7
FIELD==10
A==11
D==12
ERRTYP==13
TBLPTR==14
B==15
C==16
P==17 ;PUSHDOWN LIST POINTER
SUBTTL EDIT HISTORY
;2 CORRECT MASK FOR WILD-CARD PPN'S, ALLOW WILD CARDS IN ACCOUNT STRING.
;3 CONVERT LOWER CASE TO UPPER CASE IF FTCASECONVERT IS ON FROM ACTSYM.
;4 REPORT FILOP. ERROR CODES WHEN LOOKUP/ENTER FAILS.
;5 ACCEPT SOS LINE NUMBERED PROJCT.ACT
;6 USE ASSEMBLY PARAMETER "PRJWPB" INSTEAD OF ABSOLUTE 200'S
;7 LONG LINES COULD OVERFLOW OUTREC, COUNT CHARACTERS
;10 RANGE CHECK ACCOUNT STRING LENGTH. CHANGE THE WAY SWITCHES ARE (NOT)
; HANDLED. IMPLEMENT /DEFAULT TO SET DEFAULT ACCOUNT STRING
;11 SAVE SPACE IN PROJCT.SYS IF PRJWPB .GT. 200. ALLOW PPN ENTRIES TO
; CROSS BLOCK BOUNDRIES. THESE CHANGES CONSTITUTE FORMAT VERSION 2.
;
SUBTTL MACROS AND DEFINITIONS
DEFINE CRLF(X),<
IFE <X>, <OUTSTR [BYTE(7) 12,15,0,0,0]>
IFE <X-1>,<OUTSTR [BYTE(7) 12,15,0,0,0]>
IFE <X-2>,<OUTSTR [BYTE(7) 12,15,15,0,0]>
IFE <X-3>,<OUTSTR [BYTE(7) 12,15,15,15,0]>
> ; END CRLF MACRO
ACVERS==2 ;VERSION OF THE PROJCT.SYS FILE
SUBTTL MAIN PROGRAM
PROJCT: RESET
CRLF 2
MOVE P,[IOWD 100,STACK] ;INITIALIZE STACK POINTER
MOVEI T1,[OUTSTR [ASCIZ/PROGRAM NOT RESTARTABLE./]
CRLF 2
EXIT]
HRRM T1,.JBSA## ;DON'T ALLOW "START" AFTER FIRST RUNNING
MOVE T1,[6,,INPFIL] ;SET UP FILOP. PARMS
FILOP. T1, ;LOCATE AND OPEN THE INPUT FILE.
JRST FIL1ER ;IF AN ERROR, GO PROCESS IT.
MOVE T1,[6,,OUTFIL] ;SET UP OUTPUT FILOP PARMS
FILOP. T1, ;LOCATE AND OPEN THE OUTPUT FILE.
JRST FIL2ER ;IF AN ERROR, GO PROCESS IT.
MOVE T1,[6,,MAPFIL] ;SET UP FILOP. PARMS
FILOP. T1, ;LOCATE AND OPEN TEMP MAP FILE.
JRST FIL3ER ;IF AN ERROR, GO PROCESS IT.
SETZ FIELD, ;SET FIELD INDICATOR TO [P,PN]
MOVEI TBLPTR,TABLE ;INIT TBLPTR WITH TABLE ADDRESS.
SETO ERRTYP, ;INDICATE NO ERRORS.
GETBYT: PUSHJ P,INBYTE ;GO GET A BYTE OF DATA
JRST @PROCES(T2) ;GO PROCESS THE BYTE.
FIL1ER: OUTSTR [ASCIZ/PROJCT.ACT/]
JRST FILECM ;END ERROR MESSAGE
FIL2ER: OUTSTR [ASCIZ/PROJCT.SYS/]
JRST FILECM ;END ERROR MESSAGE
FIL3ER: OUTSTR [ASCIZ/PROJCT.MAP/]
FILECM: OUTSTR [ASCIZ/ FILOP. ERROR, ERROR CODE = /]
MOVE T2,T1
LSH T2,-3
ADDI T2,"0"
CAIE T2,"0"
OUTCHR T2
ANDI T1,7
ADDI T1,"0"
OUTCHR T1
CRLF
JRST FINISH
SUBTTL ROUTINES - [ BRACKET, ] BRACKET, & ALPHA CHARS ROUTINES.
LBRKT: JRST @LBFLD(FIELD) ;GO PROCESS [ BRACKET BY FIELD
LBPPN: AOSG LBCNT ;MAKE SURE ONLY 1 [ FOR PPN
JRST GETBYT ;IF SO, IGNORE IT.
MOVEI ERRTYP,8 ;ELSE TOO MANY ['S, SO
JRST ERROR ;GO PROCESS THE ERROR.
LBFLD: 0,,LBPPN
0,,STOREC
0,,[MOVEI ERRTYP,21
JRST ERROR]
RBRKT: JRST @RBFLD(FIELD) ;GO PROCESS ] BRACKET BY FIELD
RBPPN: AOSG RBCNT ;MAKE SURE ONLY 1 ] FOR PPN
JRST GETBYT ;IF SO, IGNORE IT.
MOVEI ERRTYP,9 ;ELSE TOO MANY ]'S, SO
JRST ERROR ;GO PROCESS THE ERROR.
RBFLD: 0,,RBPPN
0,,STOREC
0,,[MOVEI ERRTYP,21
JRST ERROR]
ALPHA: JRST @ALFLD(FIELD) ;GO PROCESS ALPHA BY FIELD
ALPPN: MOVEI ERRTYP,0 ;IF ALPHA IN PPN, THEN ERROR
JRST ERROR ;SO GO PROCESS IT.
ALFLD: 0,,ALPPN
0,,STOREC
0,,STOREC
SUBTTL CR.LF - ROUTINE TO PROCESS CARRIAGE RETURNS AND LINE FEEDS.
CR: JRST @CRFLD(FIELD) ;PROCESS CARRIAGE RETURN BY FIELD.
CRPPN: MOVEI ERRTYP,1 ;IF CR IN PPN FIELD, THEN ERROR
JRST ERROR ;SO GO PROCESS IT.
CRA.S.: SKIPE AS.LEN ;CHECK THE A.S. LENGTH
JRST CRASOK ;IF A.S. NOT NULL,THEN CONTINUE.
MOVEI ERRTYP,12 ;ELSE GENERATE AN ERROR CODE.
JRST ERROR ; AND GO PROCESS THE ERROR.
CRASOK: PUSHJ P,BUILD ;GO GENERATE A TABLE ENTRY
NXTBYT: PUSHJ P,INBYTE ;SKIP ALL BYTES
CAIGE T2,40 ; THAT ARE BREAK CHARACTERS.
JRST NXTBYT ;SKIP THIS BYTE
PUSHJ P,RESETA ;GO RESET THE POINTERS AND COUNTERS.
SOSLE ORCSIZ ;MAKE SURE THERE IS ROOM FOR CHARACTER
DPB T2,OUTPTR ;SAVE LAST BYTE AT START OF STRING.
JRST @PROCES(T2) ;GO PROCESS THE DATA
CRFLD: 0,,CRPPN
0,,CRA.S.
0,,[SKIPE CS.LEN ;CAN'T HAVE NULL SWITCHES
JRST CRA.S. ;SEE IF ACCOUNT STRING IS OK
MOVEI ERRTYP,15 ;GENERATE AN ERROR
JRST ERROR]
SUBTTL NUMBER - ROUTINE TO PROCESS NUMERICS BY FIELD.
NUMBER: JRST @NBFLD(FIELD) ;GO PROCESS NUMERICS BY FIELD
NBPPN: CAIG T2,67 ;MAKE SURE DIGIT IS OCTAL.
JRST DIGOK ;IF SO, THEN CONTINUE
MOVEI ERRTYP,2 ;ELSE GENERATE THE ERROR CODE,
JRST ERROR ;AND GO PROCESS THE ERROR.
DIGOK: IDPB T2,PPNPTR ;SAVE POSSIBLE P,PN VALUE
AOS PPNCNT ;ADD 1 TO NUMBER BYTE COUNT
MOVE C,PPNCNT ;LOAD AC C WITH BYTE COUNT
CAIG C,6 ;IS # OF BYTES > 6 ?
JRST GETBYT ;IF NOT, RETURN TO GET MORE DATA.
MOVEI ERRTYP,7 ;ELSE LOAD ERROR CODE
JRST ERROR ;AND GO PROCESS THE ERROR.
NBFLD: 0,,NBPPN ;IF NUMBER IS IN A.S. FIELD OR /SWTCH.
0,,STOREC ; FIELD, THEN JUST SAVE IT IN
0,,STOREC ; THE FIELD SAVE AREAS.
SUBTTL COMMA - ROUTINE TO PROCESS COMMA'S.
COMMA: JRST @CMFLD(FIELD) ;GO PROCESS COMMAS BY FIELD
CMPPN: AOSG CMCNT ;IF COMMA IN PPN FIELD, ADD 1 TO COMMA
JRST CHKLEN ;COUNT, IF 0 THEN WE SHOULD HAVE 'P'
; VALUE, SO MAKE SURE BYTE COUNT > 0.
MOVEI ERRTYP,3 ;ELSE, MORE THEN 1 COMMA IN PPN, SO
JRST ERROR ;GO PROCESS THE ERROR
CHKLEN: SKIPE PPNCNT ;IF NUMBER BYTE COUNT STILL 0
JRST CVRTP ;THEN THATS AN ERROR, SO
MOVEI ERRTYP,4 ;SET UP ERROR CODE
JRST ERROR ;AND GO PROCESS THE ERROR
CVRTP: PUSHJ P,CV2OCT ;GO CONVERT THE STRING TO OCTAL BINARY
HRLM C,P.PN ;SAVE THE 'P' FIELD IN OUTPUT TABLE
HRLM MASK,PPNMSK ;SAVE THE 'P' MASK FOR WILD-CARDING.
JRST GETBYT ;GO GET SOME MORE DATA
CMA.S.: SKIPE AS.LEN ;MAKE SURE A.S. FIELD NOT NULL.
JRST ALENOK ;IF NOT, THEN CONTINUE PROCESSING.
MOVEI ERRTYP,12 ;ELSE GENERATE ERROR CODE,
JRST ERROR ; AND GO PROCESS THE ERROR.
ALENOK: PUSHJ P,BUILD ;GO BUILD AN ENTRY IN TABLE
MOVEI FIELD,1 ;RESET THE FIELD POINTER TO A.S.
JRST GETBYT ;GO GET THE NEXT BYTE.
CM.SWT: SKIPE CS.LEN ;MAKE SURE /SWTCH. FIELD NOT NULL.
JRST CMA.S. ;IF NOT, GO CHECK ACCOUNT STRING
MOVEI ERRTYP,15 ;ELSE GENERATE AN ERROR CODE,
JRST ERROR ; AND GO PROCESS THE ERROR
CMFLD: 0,,CMPPN
0,,CMA.S.
0,,CM.SWT
SUBTTL EQUALS - ROUTINE TO PROCESS = SIGN DELIMITER.
EQUALS: AOSG EQCNT ;MAKE SURE THERE IS ONLY 1
JRST @EQFLD(FIELD) ;PROCESS THE = BY FIELD.
MOVEI ERRTYP,5 ;ELSE TOO MANY ='S, SO ERROR.
JRST ERROR ; GO PROCESS IT.
EQPPN: SKIPE PPNCNT ;MAKE SURE PN LENGTH NOT 0
JRST CVRTPN ;IF NOT, THEN GO CONVERT TO BINARY.
MOVEI ERRTYP,6 ;ELSE 0 LENGTH IS AN ERROR,
JRST ERROR ;SO GO PROCESS IT.
CVRTPN: PUSHJ P,CV2OCT ;CONVERT PN TO OCTAL BINARY.
HRRM C,P.PN ;AND SAVE IT IN TABLE
HRRM MASK,PPNMSK ;SAVE THE 'PN' MASK FOR WILD-CARDING.
SKIPL C,P.PN ;PICK UP LAST PPN.
CAML C,PPNSAV ;COMAPRE AGAINST LAST PPN.
JRST CHKHI ;IF NOT LESS, THEN CHECK HIGH
MOVEI ERRTYP,13 ; GENERATE AN ERROR CODE,
JRST ERROR ; AND GO PROCESS THE ERROR.
CHKHI: CAME C,PPNSAV ;IF NEW PPN = OLD PPN, THEN CONTINUE.
PUSHJ P,BLDREC ; ELSE GO BUILD OUTPUT BUFFER
MOVEI FIELD,1 ;SET FIELD TO ACCOUNT STRING FIELD.
JRST GETBYT ;GO PROCESS THE NEXT BYTE.
EQFLD: 0,,EQPPN
0,,STOREC
0,,[MOVEI ERRTYP,21
JRST ERROR]
SUBTTL SLASH - ROUTINE TO PROCESS /SWITCH FIELDS.
SLASH: AOSG SLCNT ;CHECK FOR CONSECUTIVE
JRST SLOK ; SLASHES. IF NONE, CONTINUE.
SLERRP: MOVEI ERRTYP,23 ;ELSE GENERATE ERROR CODE,
JRST ERROR ;AND GO PROCESS THE ERROR.
SLOK: JRST @SLFLD(FIELD) ;GO PROCESS THE / BY FIELD.
SLA.S.: SKIPE AS.LEN ;MAKE SURE IT'S AFTER THE ACCOUNT STRING
JRST SLOK1 ;SO FAR SO GOOD
MOVEI ERRTYP,12 ;NULL ACCOUNT STRING
JRST ERROR ;GO PROCESS THE ERROR
SLOK1: MOVEI FIELD,2 ;SET UP /SWTCH. FIELD.
JRST GETBYT ;GO GET THE NEXT BYTE.
SLFLD: 0,,SLERRP
0,,SLA.S.
0,,SLERRP
SUBTTL STOREC - ROUTINE TO STORE CHARS IN A.S. & /SWITCH SAVE AREAS.
STOREC: JRST @STFLD(FIELD) ;STORE BYTES ACCORDING TO THE FIELD.
STA.S.: SKIPL WLASFL ;"*" SEEN IN A.S. FIELD
JRST [MOVEI ERRTYP,22 ;* NOT LAST
JRST ERROR] ;REPORT ERROR
CAIN T2,"*" ;IS THIS THE WILD CARD
SETZM WLASFL ;YES, MARK WE'VE SEEN IT
IDPB T2,AS.PTR ;SAVE THE BYTE IN AS.FLD
AOS AS.LEN ;BUMP AS. LENGTH BY 1
MOVEI A,^D40 ;CHECK THE LENGTH
CAMLE A,AS.LEN ;OF ACCOUNT FIELD, IF LESS THEN 40
JRST GETBYT ;THEN CONTINUE PROCESSING.
MOVEI ERRTYP,16 ;ELSE GENERATE AN ERROR CODE,
JRST ERROR ;AND GO PROCESS THE ERROR.
ST.SWT: AOS A,CS.LEN ;GET LENGTH
CAIG A,5 ;ONLY SAVE FIRST 5 CHARACTERS
IDPB T2,CS.PTR ;TUCK IT AWAY FOR BUILD
JRST GETBYT ;GO GET THE NEXT BYTE
STFLD: 0,,0
0,,STA.S.
0,,ST.SWT
SUBTTL WLDCRD - [P,PN] WILD-CARD INITIALIZATION ROUTINE.
WLDCRD: JRST @WLFLD(FIELD) ;PROCESS ?,* BY FIELD.
WLPPN: CAIN T2,"*" ;WILD CARD THE ENTIRE FIELD?
JRST WLPPN2 ;YES
IDPB T2,PPNPTR ;STORE THE WILD CARD CHARACTER
AOS C,PPNCNT ;COUNT CHARACTERS, GET COUNT SO FAR
CAIG C,6 ;MORE THAN ALLOWED?
JRST GETBYT ;NO, GET NEXT CHARACTER
WLPPN1: SETZM .WILD ;HERE ON ERROR, NO WILD CARDS SEEN
MOVEI ERRTYP,7 ;TOO MANY DIGITS/WILDCARDS IN P,PN
JRST ERROR ;GO PROCESS THE ERROR
WLPPN2: SKIPE PPNCNT ;BEEN HERE BEFORE?
JRST WLPPN1 ;YES, ONLY ONE * ALLOWED, NOT ALLOWED
; WITH DIGITS
MOVEI T2,"?" ;FILL FIELD WITH WILD CARD CHARACTERS
MOVEI C,6 ;P,PN WIDTH
MOVEM C,PPNCNT ;NOTE THAT WE HAVE BEEN HERE
WLPPN3: IDPB T2,PPNPTR ;STORE WILD CARD
SOJG C,WLPPN3 ;FILL THE ENTIRE FIELD
JRST GETBYT ;GET NEXT CHARACTER
WLFLD: 0,,WLPPN
0,,[SETOM WLDASF ;MARK EITHER ? OR *
JRST STA.S.] ;AND INCLUDE IT
0,,[MOVEI ERRTYP,21
JRST ERROR]
SUBTTL BUILD - ROUTINE TO BUILD ACCOUNT STRING TABLE ENTRY'S.
;BUILD PPN AND ACCOUNT STRING TABLE ENTRY'S
BUILD: MOVE T1,AS.LEN ;PICK UP AS. LENGTH IN BYTES
ADDI T1,4 ;ROUND OFF BYT CNT TO NEXT WORD.
PUSH P,T2 ;SAVE CHARACTER AROUND DIVIDE
IDIVI T1,5 ;CALC LENGTH IN WORDS
POP P,T2 ;RESTORE CHARACTER CLOBBERED BY IDIVI
ADDI T1,4 ;ADD LENGTHS OF PPN, MASK, AND LENGTH.
MOVE A,T1 ;LOAD THE LENGTH INTO A
ADD A,TBLSIZ ;ADD CURRENT TABLE LENGTH
CAIGE A,PRJWPB ;MAKE SURE WE ARE STILL IN BUFFER.
JRST AS.FIT ;IF SO, THEN CONTINUE.
MOVE C,P.PN ;GET CURRENT PPN
PUSHJ P,BLDREC ;FORCE OUT THIS BUFFER LOAD
JRST BUILD ;AND START AGAIN
AS.FIT: HRRZM T1,0(TBLPTR) ;AND SAVE IT IN TABLE
ADDM T1,TBLSIZ ;ADD A.S. LENGTH TO BUFFER LENGTH.
SUBI T1,1 ;CALC BLT END ADDRESS-1
ADD T1,TBLPTR ; PARAMETER.
MOVE B,AS.LEN ;GET CHARACTER COUNT AGAIN
HRLZM B,3(TBLPTR) ;SAVE ACCOUNT LENGTH IN TABLE.
HRRI B,4(TBLPTR) ;SET UP BLT DESTINATION ADDRESS
HRLI B,AS.FLD ;SET UP BLT SOURCE ADDRESS.
BLT B,(T1) ;MOVE ACCOUNT STRING TO TABLE.
MOVE B,P.PN ;PICK UP THE PPN
TLZ B,400000 ;-1 IS ILLEGAL FOR A PROJECT NUMBER, WILDCARDING
; COULD HAVE TURNED ON THE SIGN BIT
MOVEM B,1(TBLPTR) ; AND SAVE IT IN THE TABLE.
MOVE B,PPNMSK ;PICK UP THE WILD-CARD PPN MASK.
MOVEM B,2(TBLPTR) ; SAVE IT IN THE TABLE.
MOVE X,CS.LEN ;GET SWITCH LENGTH IF ANY
JUMPE X,NOSWT ;NONE TO WORRY ABOUT
CAILE X,5 ;ONLY CHECK FIRST 5 CHARACTERS
MOVEI X,5 ;LOWER LIMIT
MOVE A,[ASCII/DEFAU/] ;ONLY DEFINED SWITCH FOR NOW
AND A,[BYTE (7) 177,0,0,0,0
BYTE (7) 177,177,0,0,0
BYTE (7) 177,177,177,0,0
BYTE (7) 177,177,177,177,0
BYTE (7) 177,177,177,177,177]-1(X)
CAME A,SWTCH. ;CHECK FOR /DEFAULT
JRST [MOVEI ERRTYP,24 ;UNKNOWN SWITCH
JRST ERROR]
SKIPE WLDASF ;NO WILDCARDS ALLOWED IN DEFAULT
JRST [MOVEI ERRTYP,25
JRST ERROR]
MOVEI A,1B35 ;FLAG DEFAULT ACCOUNT STRING FOR PPN
IORM A,3(TBLPTR) ;LIGHT FLAG BIT FOR ACTDAE
NOSWT: HRRI TBLPTR,1(T1) ;POINT TO NEXT TABLE ENTRY
PUSHJ P,RESETB ;GO RESET SOME POINTERS AND COUNTERS.
POPJ P, ;RETURN TO CALLER
SUBTTL INBYTE - ROUTINE TO READ TEMP STORAGE FILE.
INBYTE: SOSGE IBFCNT ;MAKE SURE THERE IS DATA IN BUFFER.
JRST READ ;IF NOT, GO GET A BLOCK.
ILDB T2,IBFPTR ;ELSE PICK UP A BYTE
PUSH P,T2 ;CANNOT CLOBBER REGISTERS HERE
MOVEI T2,1B35 ;LINE NUMBER FLAG
TDNE T2,@IBFPTR ;DID WE JUST STEP INTO A LINE NUMBER
JRST [ANDCAM T2,@IBFPTR ;YES, CLEAR IT SO WE DON'T GET BACK HERE
POP P,T2 ;CLEAN STACK
PUSHJ P,INBYTE ;EAT UP THE REST OF THE LINE NUMBER
PUSHJ P,INBYTE ;...
PUSHJ P,INBYTE ;...
PUSHJ P,INBYTE ;...
PUSHJ P,INBYTE ;EAT THE <TAB> BETWEEN LINE NUMBER AND DATA
JRST INBYTE] ;AND GET FIRST REAL DATA BYTE FROM THIS LINE
POP P,T2 ;RESTORE CHARACTER AFTER LINE NUMBER CHECK
IFN FTCASECONVERT,<
CAIG T2,"Z"+" " ;LOWER CASE Z
CAIGE T2,"A"+" " ;RANGE CHECK INPUT
CAIA ;NOT LOWER CASE
SUBI T2," " ;CONVERT TO UPPER CASE
>
CAIGE T2," " ;DO NOT SAVE BREAK CHARACTERS.
POPJ P, ;CONTROL CHAR, RETURN
SOSLE ORCSIZ ;MAKE SURE THERE IS ROOM FOR CHARACTER
IDPB T2,OUTPTR ;AND SAVE IT (FOR POSSIBLE ERROR MSG)
POPJ P, ;RETURN TO CALLER
READ: IN X, ;GET A BLOCK OF DATA
JRST INBYTE ;IF NO ERROR, THEN CONTINUE
STATZ X,IO.EOF ;WAS ERROR END OF FILE ?
JRST ENDJOB ;IF SO, THEN FINISH THE JOB
OUTSTR [ASCIZ\I/O ERROR OCCURED WHILE READING INPUT FILE.\]
CRLF
OUTSTR [ASCIZ/PROCESSING TERMINATED./]
CRLF
JRST FINISH ;GO RETRN TO MONITOR.
SUBTTL ERROR - ROUTINE TO PROCESS ERRORS MESSAGES.
ERROR: CAIE T2,15 ;SPIN UNTIL END OF LINE
CAIN T2,12 ;...
JRST BRKCHR ;IF SO, THEN WRITE OUT THE ERROR MSG.
PUSHJ P,INBYTE ;ELSE GO GET ANOTHER BYTE.
JRST ERROR ;AND CHECK FOR BREAK AGAIN.
BRKCHR: SETZ C, ;GENERATE A NULL BYTE,
IDPB C,OUTPTR ;AND SAVE IT IN OUTPUT MSG.
OUTSTR OUTREC ;PRINT THE BAD DATA,
CRLF ;SEPARATE LINES
OUTSTR @ERMSG(ERRTYP) ; AND THE ERROR MESSAGE.
IOR ERRTYP,.WILD ;MERGE ERROR TYPE AND WILD FLAG.
CAIN ERRTYP,13 ;DID WE PRINT '[P,PN] OUT OF SEQ' MSG ?
OUTSTR WLDMSG ;IF SO,,PRINT EXPLANATION.
CRLF 2 ;SKIP 2 LINES.
FNDCHR: PUSHJ P,INBYTE ;GO GET A BYTE OF DATA.
CAIGE T2,40 ;IS IT VALID ?
JRST FNDCHR ;IF NOT, THEN SKIP IT.
PUSHJ P,RESETA ;GO RESET SOME POINTERS AND COUNTERS.
PUSHJ P,RESETB ;AND GO DO IT SOME MORE...
SOSLE ORCSIZ ;MAKE SURE THERE IS ROOM FOR CHARACTER
DPB T2,OUTPTR ;SAVE CURRENT BYTE.
JRST @PROCES(T2) ;THEN GO PROCESS THE DATA.
SUBTTL BLDREC - ROUTINE TO MANAGE THE OUTPUT BUFFER AND TABLE MAP.
BLDREC: AOSE FSTREC ;IS THIS THE FIRST TIME THROUGH ?
JRST NOTFST ;IF NOT, DO NOT DO INITIALIZATION.
PUSHJ P,WRTHDR ;ELSE WRITE OUT A DUMMY HEADER.
MOVEM C,PPNSAV ;SAVE THE NEW PPN
POPJ P, ;RETURN TO CALLER
NOTFST: SKIPG TBLSIZ ;MAKE SURE THERE IS DATA IN BUFFER.
JRST DONTBD ;IF NOT, THEN DONT BUILD OUTPUT BUFFER.
MOVEI B,PRJWPB ;SET AC B TO DISK BLOCK SIZE
SUB B,BLKSIZ ;SUBTRACT CURRECT BLOCK SIZE
CAMGE B,TBLSIZ ;IS THERE ROOM IN BUFR FOR TABLE?
PUSHJ P,WRTBFR ;IF NOT, THEN WRITE BUFR & GET ANOTHER.
MOVE B,TBLSIZ ;PICK UP [P,PN] BLOCK SIZE
HRLM B,TABLE ;SAVE AS OFFSET TO NEXT [P,PN].
HRRZ B,BLKSIZ ;PICK UP CURRENT BLOCK SIZE.
ADDI B,OTBFR ;CALC BUFFER ADDRESS FOR TABLE (DEST)
MOVE D,B ;LOAD D WITH DEST START ADDRESS
HRLI B,TABLE ;PICK UP BLT SOURCE ADDRESS.
ADD D,TBLSIZ ;CALC DEST END ADDRESS
SUBI D,1 ;CALC DEST END ADDRESS - 1
BLT B,0(D) ;MOVE TABLE TO OUTPUT BUFFER.
MOVE D,BLKSIZ ;CHECK AND SEE IF WE ARE AT THE
CAILE D,1 ; BEGINNING OF THE OUTPUT BUFFER.
JRST NOMAP ; IF NOT, THEN DO NOT MAKE A MAP ENTRY
HRLZ B,BLKCNT ;PICK UP RELATIVE BLOCK ADDRESS.
MOVE D,MAPPTR ;PICK UP CURRENT MAP PONTER
MOVEM B,MAP.+1(D) ;SAVE OFFSET,,BLOCK# IN MAP.
MOVE B,PPNSAV ;PICK UP PPN OF ENTRY
TLZ B,400000 ;SIGN BIT IS NEVER LEGAL FOR A PPN BUT
; WILDCARDING MIGHT TURN IT ON
MOVEM B,MAP.(D) ;SAVE PPN ENTRY # IN MAP
ADDI D,2 ;POINT TO NEXT MAP ENTRY
MOVEM D,MAPPTR ;AND SAVE IT FOR NEXT INSERT.
CAIL D,PRJWPB ;ARE WE STILL IN CURRENT BUFFER?
PUSHJ P,WRTMAP ;IF NOT, THEN WRITE MAP BUFFER.
NOMAP: HRRZ B,TBLSIZ ;PICK UP TABLE SIZE.
ADDM B,BLKSIZ ;ADD IT TO CURRENT BLOCK SIZE.
SETZM TBLSIZ ;ZERO CURRENT TABLE SIZE
MOVEI TBLPTR,TABLE ;RESET CURRENT TABLE POINTER.
DONTBD: MOVEM C,PPNSAV ;SAVE THE NEW PPN
POPJ P, ;RETURN TO CALLER
WRTHDR:
IFN <PRJWPB-200>,< ;IF LOGICAL BLOCKS ARE BIGGER THAN PHYSICAL ONES
MOVNI A,200 ;HEADERS ARE ONLY 1 REAL DISK BLOCK
HRLM A,OTCCW ;CLOBBER IO WORD COUNT
PUSHJ P,WRTBFR ;WRITE ONLY 1 DISK BLOCK
MOVNI A,PRJWPB ;RESTORE LOGICAL DISK BLOCK SIZE
HRLM A,OTCCW ;STORE
POPJ P, ;AND RETURN
> ; OTHERWISE, WRTHDR = WRTBFR
WRTBFR: OUT 5,OTCCW ;WRITE OUT THE BUFFER
JRST .+3 ;IF OUTPUT OK, CONTINUE
OUTSTR [ASCIZ\I/O ERROR WRITING PROJCT.SYS FILE.\]
JRST FINISH
SETZM OTBFR ;ZERO THE CURRENT BLOCK SIZE
MOVE A,[OTBFR,,OTBFR+1] ;SET UP SOURCE,,DEST BLT PARMS
BLT A,OTBFR+PRJWPB-1 ;ZERO THE OUTPUT BUFFER.
AOS BLKSIZ ;ADD 1 TO BLOCK SIZE
AOS BLKCNT ;ADD 1 TO BLOCK COUNT
POPJ P, ;RETURN TO CALLER
WRTMAP: OUT 6,MPCCW ;WRITE OUT THE MAP BUFFER.
JRST .+3 ;IF OUTPUT OK, CONTINUE.
OUTSTR [ASCIZ\I/O ERROR WRITING TEMP MAP FILE.\]
JRST FINISH ;GO EXIT FROM PROGRAM
AOS MAPCNT ;ADD 1 TO MAP BLOCK COUNTER.
SETZM MAPPTR ;ZERO THE CURRENT MAP POINTER
SETZM MAP. ;ZERO THE FIRST WORD OF MAP BUFFER.
MOVE A,[MAP.,,MAP.+1] ; SET UP SOURCE,,DEST BLT PARMS
BLT A,MAP.+PRJWPB-1 ; AND ZERO THE REST OF MAP BUFFER.
POPJ P, ;RETURN TO CALLER.
SUBTTL ENDJOB - ROUTINE TO PERFORM END-OF-JOB FUNCTIONS.
ENDJOB: SKIPL FSTREC ;HAS THE OUTPUT FILE BEEN INITLZED?
JRST FILEOK ;IF SO, THEN CONTINUE OEF PROCESSING.
MOVE C,P.PN ;PICK UP THE CURRENT [P,PN].
PUSHJ P,BLDREC ;GO INITIALIZE THE OUTPUT FILE.
FILEOK: SKIPG TBLSIZ ;IS THERE ANYTHING IN TEMP OUTPUT BUFR ?
JRST CHKBLK ;IF NOT, GO CHECK REAL OUTPUT BUFFER.
MOVE C,[377777,,-1] ;ELSE SET [P,PN] TO 377777,,777777
PUSHJ P,BLDREC ;AND GO BUILD THE OUTPUT BUFFER.
CHKBLK: MOVE C,BLKSIZ ;CHECK AND SEE IF WE ARE AT THE START
CAILE C,1 ;OF THE NEXT OUTPUT BUFFER.
PUSHJ P,WRTBFR ;IF NOT, THEN WRITE CURRENT BUFFER.
SKIPE B,MAPPTR ;PICK UP THE DATA MAP POINTER.
PUSHJ P,WRTMAP ;WRITE OUT THE LAST PARTIAL MAP BUFFER.
USETO 5,1 ;POINT TO FIRST OUTPUT BLOCK.
MOVEI 10,ACVERS ;PICK UP VERSION NUMBER.
MOVEM 10,OTBFR ;SAVE IT IN HEADER BLOCK.
MOVE 10,MAPCNT ;PICK UP # OF MAP BLOCKS WRITTEN.
JUMPE 10,[OUTSTR [ASCIZ/NO MAP BLOCKS WRITTEN/]
JRST FINISH]
SUBI 10,1 ;SUBTRACT 1 TO MAKE RIGHT
IMULI 10,PRJWPB ;MULTIPLY BY BLOCK SIZE.
ADDB 10,B ;ADD LAST BLOCK SIZE
MOVEM 10,OTBFR+1 ;SAVE IT IT HEADER BLOCK
MOVEI 10,PRJWPB ;GET NUMBER OF WORDS THIS WAS ASSEMBLED FOR
MOVEM 10,OTBFR+3 ;STORE FOR ACTDAE CHECKS
MOVE 10,BLKCNT ;PICK UP POINTER TO NEXT BLOCK
MOVEM 10,OTBFR+2 ;SAVE IT IN HEADER BLOCK
PUSHJ P,WRTHDR ;WRITE OUT THE HEADER BLOCK
SUBI 10,2 ;BLOCK NUMBER - 2
IMULI 10,<PRJWPB/200> ;* NUMBER OF BLOCKS PER BUFFER
USETO 5,2(10) ; + 2 = REAL DISK BLOCK ADDRESS
USETI 6,1 ;POINT TO FIRST MAP BLOCK.
GETMAP: IN 6,OTCCW ;READ A MAP BLOCK
JRST .+3 ;IF OK, THEN CONTINUE
OUTSTR [ASCIZ\I/O ERROR READING TEMP MAP FILE.\]
JRST FINISH ;GO END THE PROGRAM
IFN <PRJWPB-200>,< ;IF MORE THAT 1 REAL DISK BLOCK PER LOGICAL ONE
CAIGE B,PRJWPB ;SEE IF DOING LAST (PARTIAL) MAP BLOCK
JRST [MOVN A,B ;YES, ONLY WRITE OUT WHAT IS NEEDED
HRLM A,OTCCW ;TO SAVE DISK SPACE IF PRJWPB IS VERY LARGE
JRST .+1] ;RESUME INLINE
SUBI B,PRJWPB ;ADJUST COUNT
>
PUSHJ P,WRTBFR ;GO WRITE OUT THE MAP BLOCK.
SOSLE MAPCNT ;CHECK MAP COUNTER.
JRST GETMAP ;IF MORE MAP BLOCKS, GO GET THEM.
FINISH: CLOSE 4, ;CLOSE THE MASTER INPUT FILE.
CLOSE 5, ;CLOSE THE PROJCT.SYS FILE.
CLOSE 6, ;CLOSE THE TEMP MAP FILE.
CRLF
OUTSTR [ASCIZ/END OF JOB./]
CRLF
EXIT
SUBTTL CV2OCT - ROUTINE TO CONVERT [P,PN] TO BINARY OCTAL.
CV2OCT: MOVEM TBLPTR,SAVE ;SAVE CONTENTS OF AC TBLPTR
MOVEM B,SAVE+1 ;SAVE CONTENTS OF AC B
MOVE B,[POINT 7,PPN] ;PICK UP PPN POINTER
MOVEM B,PPNPTR ;AND SAVE IT.
MOVE 13,PPNCNT ;SAVE PPNCNT FOR POSSIBLE WLDCRD CHECK
SETZ C, ;SET RESULT AC TO 0
SETO MASK, ;CLEAR OUT WILD-CARD MASK.
OCTLOP: LSH C,3 ;SHIFT RESULT AC LEFT 3 BITS
LSH MASK,3 ;SHIFT MASK AC LEFT 3 BITS.
ILDB TBLPTR,B ;PICK UP AN ASCII DIGIT
CAIN TBLPTR,"?" ;IS THIS A ? WILD-CARD ?
JRST [TRO C,7
JRST OCTL.1] ;NOTE IN RESULT
SUBI TBLPTR,60 ;CONVERT IT TO BINARY
ADD C,TBLPTR ;ADD BINARY DIGIT TO RESULT
TRO MASK,7 ;SET MASK BITS TO 111.
OCTL.1: SOSE PPNCNT ;SUBTRACT 1 FROM BYTE COUNT
JRST OCTLOP ;IF NOT 0, CONVERT SOME MORE.
OCTL.2: MOVE TBLPTR,SAVE ;RESTORE AC TBLPTR
MOVE B,SAVE+1 ;RESTORE AC B
POPJ P, ;RETURN TO MAIN ROUTINE
SUBTTL RESET (A & B) - ROUTINES TO RE-INITIALIZE DATA AREAS & PTRS.
RESETA: MOVE C,[POINT 7,OUTREC,6] ;RESET THE ERROR MSG
MOVEM C,OUTPTR ;OUTPUT BUFFER POINTER
MOVEI C,40*5 ;NUMBER OF CHARACTERS IN OUTREC
MOVEM C,ORCSIZ ;SAVE
SETOM CMCNT ;RESET THE COMMA COUNTER
SETOM LBCNT ;RESET THE LEFT BRACKET COUNTER
SETOM RBCNT ;RESET THE RIGHT BRACKET COUNTER
SETOM EQCNT ;RESET THE EQUAL SIGN COUNTER
SETOM .WILD ;RESET THE WILD-CARD FLAG.
SETO ERRTYP, ;INDICATE NO ERRORS
SETZ FIELD, ;INDICATE [P,PN] FIELD
POPJ P, ;RETURN TO CALLER
RESETB: MOVE C,[POINT 7,SWTCH.] ;RESET THE SWITCH POINTER
MOVEM C,CS.PTR ;...
MOVE C,[POINT 7,AS.FLD] ; ACCOUNT STRING
MOVEM C,AS.PTR ; BYTE POINTERS.
SETZM AS.FLD ;ZERO OUT
MOVE C,[AS.FLD,,AS.FLD+1] ; ACCOUNT STRING
BLT C,AS.FLD+7 ; SAVE AREA.
SETZM AS.LEN ;SET ACCOUNT STRING LENGTH TO 0
SETOM WLASFL ;NO "*" SEEN NOW
SETZM WLDASF ;NO WILD CARDED ASSOUNT STRING
SETOM SLCNT ;RESET THE SLASH COUNTER
SETZM CS.LEN ;ZERO /SWTCH. LENGTH
SETZM SWTCH. ;ZERO OUT
POPJ P, ;RETURN TO CALLER.
SUBTTL DATA - RPOGRAM DATA AREAS, POINTERS, AND I/O BUFFERS.
.WILD: EXP -1
SLCNT: EXP -1
CMCNT: EXP -1
LBCNT: EXP -1
RBCNT: EXP -1
EQCNT: EXP -1
FSTREC: EXP -1
WLASFL: EXP -1
WLDASF: 0,,0
PPNMSK: 0,,0
MAPPTR: 0,,0
BLKCNT: 0,,1
MAPCNT: 0,,0
TBLSIZ: 0,,0
TABLE: BLOCK PRJWPB
SWTCH.: BLOCK 1
AS.LEN: 0,,0
AS.FLD: BLOCK 10
P.PN: 0,,0
PPNSAV: 0,,0
STACK: BLOCK 100
PPNCNT: 0,,0
PPN: BLOCK 2
SAVE: BLOCK 2
CS.LEN: 0,,0
ORCSIZ: EXP 40*5
OUTREC: BLOCK 40
OUTPTR: POINT 7,OUTREC
AS.PTR: POINT 7,AS.FLD
PPNPTR: POINT 7,PPN
CS.PTR: POINT 7,SWTCH.
ERMSG: [ASCIZ/NON-NUMERIC BYTE ENCOUNTERED IN [P,PN] FIELD./]
[ASCIZ/[P,PN] FIELD TERMINATED BY CR!LF./]
[ASCIZ/NON-OCTAL DIGIT ENCOUNTERED IN [P,PN] FIELD./]
[ASCIZ/MULTIPLE COMMA'S ENCOUNTERED IN [P,PN] FIELD./]
[ASCIZ/NULL PROJECT NUMBER ENCOUNTERED IN [P,PN] FIELD./]
[ASCIZ/MULTIPLE EQUAL SIGNS ILLEGAL./]
[ASCIZ/NULL PROGRAMMER NUMBER ENCOUNTERED IN [P,PN] FIELD./]
[ASCIZ/LENGTH OF PPN EXCEEDS 6 DIGITS./]
[ASCIZ/MULTIPLE ['S ENCOUNTERED IN [P,PN] FIELD./]
[ASCIZ/MULTIPLE ]'S ENCOUNTERED IN [P,PN] FIELD./]
[ASCIZ/NULL ACCOUNT STRING ENCOUNTERED IN A.S. FIELD./]
[ASCIZ/SPECIFIED [P,PN] IS NOT IN ASCENDING [P,PN] SEQUENCE./]
[ASCIZ/HISTORICAL ERROR, YOU SHOULDN'T GET THIS./]
[ASCIZ\NULL /SWTCH. FIELD ILLEGAL.\]
[ASCIZ/ACCOUNT FIELD LENGTH EXCEEDS 39 CHARACTERS./]
[ASCIZ/EQUAL (=) SIGN MISSING FROM ACCOUNT STRING FIELD./]
[ASCIZ/ILLEGAL WILD-CARD SYNTAX IN [P,PN] FIELD./]
[ASCIZ/ILLEGAL CHARACTER IN SWITCH FIELD./]
[ASCIZ/WILD-CARD * NOT LAST IN A.S. FIELD./]
[ASCIZ/SWITCH IMPROPERLY PLACED./]
[ASCIZ/UNKNOWN SWITCH SPECIFIED./]
[ASCIZ/DEFAULT ACCOUNT STRING MAY NOT CONTAIN WILD-CARDS./]
WLDMSG: BYTE(7) 12,15,127,111,114 ;LF,CR,W,I,L
ASCIZ/D-CARD CHARACTERS * AND ? EQUAL ZERO./
INPFIL: 4,,.FORED
.IOASL
SIXBIT/DSK/
0,,IBCB
0,,-1
0,,INFILE
INFILE: SIXBIT/PROJCT/
SIXBIT/ACT/
0,,0
0,,0
IBCB: 0,,0
IBFPTR: 0,,0
IBFCNT: 0,,0
OUTFIL: 5,,.FOWRT
.IODMP
SIXBIT/DSK/
0,,0
0,,0
0,,OTFILE
OTFILE: SIXBIT/PROJCT/
SIXBIT/SYS/
0,,0
0,,0
MAPFIL: 6,,.FOSAU
.IODMP
SIXBIT/DSK/
0,,0
0,,0
0,,MPFILE
MPFILE: SIXBIT/PROJCT/
SIXBIT/MAP/
0,,0
0,,0
OTCCW: IOWD PRJWPB,OTBFR
0,,0
OTBFR:
BLKSIZ: 0,,1
BLOCK PRJWPB-1
MPCCW: IOWD PRJWPB,MAP.
0,,0
MAP.: BLOCK PRJWPB
LALL
PROCES: REPEAT 12,< 0,,GETBYT>
0,,CR
0,,GETBYT
0,,GETBYT
0,,CR
REPEAT 23,< 0,,GETBYT>
REPEAT 11,< 0,,STOREC>
0,,WLDCRD
0,,STOREC
0,,COMMA
0,,STOREC
0,,STOREC
0,,SLASH
REPEAT 12,< 0,,NUMBER>
0,,STOREC
0,,STOREC
0,,LBRKT
0,,EQUALS
0,,RBRKT
0,,WLDCRD
0,,STOREC
REPEAT 32,< 0,,ALPHA>
0,,LBRKT
0,,STOREC
0,,RBRKT
REPEAT 40,< 0,,STOREC>
0,,GETBYT
0,,GETBYT
END PROJCT