Trailing-Edge
-
PDP-10 Archives
-
tops20_v6_1_tcpip_distribution_tp_ft6
-
6-1-sources/ddtfil.mac
There are 16 other files named ddtfil.mac in the archive. Click here to see a list.
; COPYRIGHT (C) 1984 BY
; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.
TITLE DDTFIL DDT11 FILE ROUTINES AND OTHER SUPPORT FOR THEM
SEARCH DDTSYM,JOBDAT,MACTEN,UUOSYM,MONSYM
SALL ;GET NICE LISTINGS FOR A CHANGE
.HWFRMT ;AND SKIP THE FANCY BITS
.DIRECTIVE FLBLST
ENTFIL (ENTRY)
ENT11 (EXTERN)
ENTGP (EXTERN)
ENTSIM (EXTERN)
EXTERN DEFOUT
SETMRG: SWTCHK MERGE
DBGTYPE DB.INI,<%Merging in file with previous program
>
SETOM MRGFLG# ;WANT TO MERGE OTHER FILES
MOVEI T1,EX.MEM
MOVEM T1,ETYPE
RET SKIP,SETMRG
;HERE BECAUSE USER TYPED /FESYM WITH /SYMBOL
SETFES: SWTCHK FESYMB
MOVE T1,[SIXBIT /MAPSYM/] ;DEFAULT EXTENSIONS
MOVEM T1,DEFEXT
MOVE T1,[400000,,RDSYMA] ;FLAG TO READ IN FE FORMAT
MOVEM T1,LASTSW
SETZM USETIT ;ALWAYS START AT 0
CAIE T5,":" ;GIVEN A BLOCK TO START ON ?
RET SAFE,SETFES
CALL DECINP ;GET BLOCK TO START READING AT
JRST [ TYPE <?
?Illegal value for the /FESYMBOL switch
>
RET ,SET.FE]
IFN DEBUG,<
SKIPN F.DEBU
JRST SETFE1
PUSH P,T1
TYPE <%Setting start address to RDSYMA for the /FESYMBOL switch
%Reading will start at block >
MOVE T1,(P)
CALL DECTYP
CALL CRLTYP
POP P,T1
SETFE1:
>
HRRZM T1,USETIT ;REMEMBER WHERE TO START READING
RET SKIP,SET.FE
;HERE ON A /RELOCATION:VAL SWITCH
SETREL: SWTCHK RELOCA
CAIN T5,":"
CALL SIXIN ;READ VALUE
JRST [ TYPE <?
?Illegal argument for /RELOCATE switch
>
RET ,SETREL]
PUSH P,T1 ;SAVE IF WE NEED IT LATER
CALL SIXOCT ;CONVERT IT TO AN OCTAL NUMBER
JRST [ POP P,T1 ;GET TYPIN BACK
CALL SYMFND ;FIND IF WE HAVE A SYMBOL TO MATCH IT
JRST [ TYPE <?
?Unknown symbol as argument to /RELOCATE switch
>
RET ,SETREL]
HRRZ T1,1(SYM) ;GET THE VALUE FIELD
PUSH P,T1 ; AND BACK ONTO THE STACK...
JRST .+1] ;RETURN TO MAIN LINE CODE
IFN DEBUG,<
SKIPN F.DEBU
JRST SETRE1
PUSH P,T1
TYPE <%Setting relocation for symbols to >
MOVE T1,(P) ; GET A COPY OF T1...
CALL OCTYPE ; AND TYPE IT...
CALL CRLTYP ; AND A CRLF FOR THE LOSERS
POP P,T1
SETRE1:
>
MOVEM T1,RELOFF ;SAVE THE NEW OFFSET
POP P,T1
RET SKIP,SETREL
;HERE FOR A /SYMBOL
SETSYM: SWTCHK SYMBOL
MOVE T1,[400000,,RDSYMB]
MOVEM T1,LASTSW
MOVE T1,[SIXBIT \LSTCRF\] ;RESET DEFAULT EXTENSION
MOVEM T1,DEFEXT
SETZM USETIT ;ALWAYS START AT 0
CAIE T5,":" ;GIVEN A BLOCK TO START ON ?
RET SAFE,SETSYM
CALL DECINP ;GET BLOCK TO START READING AT
JRST [ TYPE <?
?Illegal value for the /SYMBOL switch
>
RET ,SETSYM]
IFN DEBUG,<
SKIPN F.DEBU
JRST SETSY1
PUSH P,T1
TYPE <%Setting start address to RDSYMB for the /SYMBOL switch
%Reading will start at block >
MOVE T1,(P)
CALL DECTYP
CALL CRLTYP
POP P,T1
SETSY1:
>
HRRZM T1,USETIT ;REMEMBER WHERE TO START READING
RET SKIP,SETSYM
;HERE FOR A /STB IN THE COMMAND LINE
SETRST: SWTCHK STB
DBGTYPE DB.INI,<%Setting start address to RDSTB for the /STB switch
>
MOVE T1,[SIXBIT /STBSYM/] ;DEFAULT EXTENSIONS
MOVEM T1,DEFEXT
MOVE T1,[400000,,RDSTB] ; DEFINE THE ROUTINE TO DO THE REAL WORK
MOVEM T1,LASTSW
RET SKIP,SETRST
;HERE TO READ A SYMBOL TABLE FROM A LISTING
RDSYMB: DBGTYPE DB.INI,<[Starting to process symbol table file]
>
SKIPN FILDEV
JRST [TYPE <?
?Symbol file sepcification required with the /STB switch
>
RET ,RDSYMB]
SKIPE T1,USETIT ;WANT TO SKIP PART OF FILE ?
USETI 1,(T1) ;POSITION FILE
MOVE T1,[FILDEV,,SYMDEV]
BLT T1,SYMDEV+$FBLEN-1 ;COPY FILDEV, FILNAM, FILEXT, FILTIM
SETZ T5, ;COUNT OF SYMBOLS
GETSC1: CALL GETSCH
CAIE T1,12 ;IS THIS A LINE FEED ?
JRST GETSC1 ;LOOK FOR ONE
SETZB T3,SYMBOL ;BUILD SYMBOL HERE
MOVE T2,[POINT 6,SYMBOL]
CALL GETSCH ;GET FIRST CHAR FOR SYMBOL
CAIL T1,"0" ;CHECK TO SEE IF NUMERIC
CAILE T1,"9"
CAIA ;NOT NUMERIC
JRST GETSC1 ;NUMERIC SO FLUSH LINE
CAIA
GETSC3: CALL GETSCH
CAIG T1,40
JRST GETSC4 ;IF SO HAVE FINISHED SYMBOL
CAIN T1,"=" ;DID SYMBOL END WITH "=" ?
JRST GETSC5
SUBI T1,40 ;CONVERT TO SIXBIT
CAME T2,[POINT 6,SYMBOL,35] ;FILLED WORD YET ?
IDPB T1,T2 ;NO SO KEEP FILLING
JRST GETSC3
GETSC4: CAIE T1,40 ;SYMBOLS END WITH A SPACE
JRST GETSC1 ;NOT SYMBOL - FLUSH LINE
GETSC5: SKIPN SYMBOL ;IS THERE A SYMBOL ?
JRST GETSC1 ;NO SYMBOL FLUSH LINE
TDZA T4,T4 ;CLEAR FLAGS
GETSC6: CALL GETSCH
CAIN T1,40
JRST GETSC6
CAIN T1,"="
JRST [ TRO T4,SMF.SU ;SUPPRESSED SYMBOL
JRST GETSC6 ]
CAIN T1,"%"
JRST [ TRO T4,SMF.RG ;REGISTER NAME
TRZ T4,SMF.SU ;DON'T SUPPRESS REG NAMES
JRST GETSC6 ]
CAIL T1,60
CAILE T1,67
JRST GETSC1 ;FLUSH REST OF LINE
GETSC7: IMULI T3,^D8
ADDI T3,-60(T1)
CALL GETSCH
CAIL T1,60
CAILE T1,67
CAIA
JRST GETSC7
CAIE T1,"8"
CAIN T1,"9"
JRST GETSC1 ;FLUSH REST OD LINE
CAIN T1,"-"
JRST GETSC1 ;FLUSH REST OF LINE
MOVE T1,SYMBOL ;COPY SYMBOL
HRRZ T2,T3 ;VALUE
HRLZ T3,T4 ;FLAGS
MOVE T4,SYMNAM ;FILE NAME
PUSH P,SYMEND
CALL ADDSYM
POP P,AC0 ;GET OLD SYMEND
CAMN AC0,SYMEND
JRST GETSC1 ;FLUSH REST OF LINE
AOS T5 ;COUNT SYMBOL
JRST GETSC1 ;FLUSH REST OF LINE
GETSCH: CALL FILCHR ;GET NEXT CHAR FROM FILE
CAIA
RET ,GETSCH
TYPE <%Loaded >
MOVE T1,T5
CALL DECTYP
TYPE < symbols.
>
POP P,T1
RET SKIP,RDSYMB
;HERE TO READ A FE SYMBOL FILE
RDSYMA: DBGTYP <DB.SYM!DB.INI>,<[Starting to process symbol table file]
>
SKIPN FILDEV ;WAS A FILE SPECIFIED?
JRST [TYPE <?
?Symbol file specification required with this switch
>
RET ,RDSYMA]
MOVE T1,[FILDEV,,SYMDEV] ; COPY OF FILE, DEVICE, EXT, TIME
BLT T1,SYMDEV+$FBLEN-1 ;MOVE IT
SETZ T5, ;COUNT OF SYMBOLS WE HAVE READ
RDSYM1: CALL GETSCH ;GET NEXT BYTE
CAIE T1,12 ;LINE FEED?
JRST RDSYM1 ;NO, KEEP LOOKING FOR IT.
RDSYM2: SETZB T3,SYMBOL ;BUILD SYMBOL HERE
MOVE T2,[POINT 6,SYMBOL] ;POINTER FOR SYMBOL NAME
RDSYM3: CALL GETSCH ;GET NEXT SYMBOL NAME BYTE
CAIE T1,40 ;SPACE?
CAIN T1,11 ;TAB?
JRST RDSYM3 ;YES, IGNORE IT AT START OF LINE
CAIA
RDSYM4: CALL GETSCH ;GET NEXT BYTE, PLEASE
CAIG T1,40 ;IF SO, WE HAVE FINISHED SYMBOL
JRST RDSYM5 ;YES, WE ARE DONE WITH THAT PART
CAIE T1,11 ;IS IT A TAB?
CAIN T1,75 ;IS IT AN "="?
JRST RDSYM5 ;YES, TOO, SO GET NEXT PART
SUBI T1,40 ;CONVERT TO SIXBIT
CAME T2,[POINT 6,SYMBOL,35] ;AT THE END YET?
IDPB T1,T2 ;NO, POU BYTE INTO SYMBOL
JRST RDSYM4 ;LOOP FOR MORE OF SYMBOL
RDSYM5: CAIN T1,75 ;END OF SYMBOL, WAS IT A "="?
JRST [ SKIPN SYMBOL
JRST RDSYM1 ;NO SYMBOL, FLUSH THE LINE, TRY AGAIN
SETZ T4, ;CLEAR THE FLAGS
JRST RDSYM6] ;AND GET THE VALUE
CAIE T1,11 ;TAB
CAIN T1,40 ;SPACE?
CAIA
JRST RDSYM1 ;NOT A SYMBOL AGAIN, FLUSH LINE
SKIPN SYMBOL
JRST RDSYM1 ;NOT A SYMBOL, YET
SETZ T4,
RDSYM7: CALL GETSCH
CAIN T1,40
JRST RDSYM7 ;EAT UP EXTRA SPACES
RDSYM6: CAIN T1,75 ;OK?
JRST [ TRO T4,SMF.SU ;SUPPRESSED
JRST RDSYM7] ;BACK FOR MORE
CAIN T1,45 ;"%"
JRST [ TRO T4,SMF.RG ;REGISTER NAME
TRZ T4,SMF.SU ;DONT KEEP THEM DOWN
JRST RDSYM7] ;BACK AGAIN
CAIL T1,60 ;IS IT IN THE RANGE OF 0-7
CAILE T1,67
JRST RDSYM1 ;NO, FLUSH LINE
RDSYM8: IMULI T3,10 ;MAKE ROOM FOR NEW VALUE
ADDI T3,-60(T1) ;CONVERT AND ADD IT IN
RDSYM9: CALL GETSCH ;NEXT BYTE
CAIL T1,60
CAILE T1,67
CAIA
JRST RDSYM8 ;ADD IN NEXT VALUE
CAIN T1,55 ;WAS IT A "-"
JRST RDSYM9 ;YES, IGNORE IT
CAIN T1,122 ;IS IT A "R"
ADD T3,RELOFF ;YES, ADD RELOCATION , AND KEEP GOING
MOVE T1,SYMBOL ;GET SYMBOL NAME
HRRZ T2,T3 ;GET VALUE
HRLZ T3,T4 ;GET FLAGS
MOVE T4,SYMNAM ;GET FILE MANE
PUSH P,SYMEND ;SAVE END OF SYMBOL TABLE
CALL ADDSYM ;ADD NEW SYMBOL
POP P,AC0 ;GET OLD SYMEND
CAMN AC0,SYMEND
JRST RDSYM1 ;FLUSH REST OF LINE
AOS T5 ;COUNT SYMBOL
JRST RDSYM2 ;YES, GET NEXT SYMBOL FROM LINE
; STB FORMAT IS ODD. THE FILE IS SAVED AS
; 0(2),BYTE2(8),BYTE1(8),0(2),BYTE4(8),BYTE3(8)
; JUST LIKE DTELDR DUMPS, AND SUCH, BUT IT IS A PAIN TO READ IN
; A SYMBOL TABLE THAT WAY, SO, WE HAVE TO FAKE THE WORK, AND MUNG
; THE POINTERS TO THE FILE BY HAND.
RDSTB: SKIPN FILDEV
JRST [ TYPE <?
?Symbol file specification required with this switch
>
RET ,RDSTB]
MOVE T1,[FILDEV,,SYMDEV] ; COPY THE FILE, DEVICE, EXT, AND PATH
BLT T1,SYMDEV+$FBLEN-1 ; MOVE THE DATA
MOVE T1,FILDEV ; GET THE NAME OF THIS FILE, AND SAVE IT AS
MOVEM T1,STBNAM ; THE NAME OF THIS SYMBOL TABLE
SETZ T5, ; WE HAVE SEEN NO SYMBOLS YET...
MOVEI T1,^D36 ; 36 BIT BYTES, PLEASE
CALL SETIHD ; SET UP THE HEADER
RDSTB1: CALL RDSGYW ; GET THE COUNT WORD FROM THE INPUT FILE
JRST RDSTB2 ; ERROR, END OF FILE NOT EXPECTED HERE
MOVEM T1,STBSIZ ; SAVE THE SIZE OF THE RECORD, PLEASE
JUMPE T1,RDSTB1 ; NO MORE, GET NEXT RECORD
CALL RDSGYW ; GET THE RECORD TYPE
JRST RDSTB2 ; END OF FILE WE DID NOT WANT...
SOS STBSIZ
SOS STBSIZ
CAILE T1,STB.MX ; THE MAX RECORD TYPE WE WILL ACCEPT
JRST RDSTB3 ; ERROR, A BOGUS TYPE OF RECORD
XCT STBREC(T1) ; EXECUTE THE DISPATCH FOR THIS RECORD
JRST RDSTB1 ; AND LOOP FOR MORE RECORDS...
STBREC: JRST RDSTB3
JRST GSDREC ; THE GSD RECORD
CALL EGSDREC ; END OF THE GSD'S
CALL TXTREC ; TEXT RECORD
CALL RLDREC ; RELOCATABLE INFORMATION
CALL ISDREC ; INTERNAL SYMBOL INFORMATION
RET SAFE,STBREC
; HERE TO PARSE A GSD RECORD FROM THE STB FILE
GSDREC: DBGTYPE <DB.SYM!DB.INI>,<%Reading a GSD record
>
GSDRE3: SKIPG STBSIZ ; WE HAVE ANY BYTES?
JRST RDSTB1 ; NO, END OF THE RECORD
CALL R50SIX ; CONVERT THE NEXT RADIX 50 SYMBOL TO SIXBIT
JRST GSDRE1 ; REPORT END OF RECORD, BUT NOT ERROR HERE
MOVEM T1,STBSYM ; SAVE THE SYMBOL FOR LATER
SOSG STBSIZ ; DID WE RUN OUT OF BYTES?
JRST GSDRE1 ; REPORT ERROR
CALL RDSGYB ; GET THE FLAG BYTE
JRST RDSTB2 ; EOF, NOT EOR
MOVEM T1,STBFLG ; AND SAVE IT, TOO
SOSG STBSIZ ; COUNT THIS DOWN
JRST GSDRE1 ; ERROR HERE, TOO
CALL RDSGYB ; GET THE ENTRY TYPE
JRST RDSTB2 ; EOF, NOT EOR
MOVEM T1,STBTYP ; SAVE THE ENTRY TYPE
SOSLE STBSIZ
SOSGE STBSIZ ; DID WE FINALLY RUN OUT OF BYTES?
JRST GSDRE1 ; YES, REPORT THE PROBLEM
CALL RDSGYW ; GET THE WORD OF VALUE WE EXPECT
JRST RDSTB2 ; COUNT THIS AGAINST THE WORLD
MOVEM T1,STBVAL ; SAVE THE VALUE, IT MIGHT BE USEFULL
MOVE T1,STBTYP ; GET THE TYPE BACK
CAILE T1,GSD.MX ; IS IT A GOOD ENTRY TYPE?
JRST GSDRE2 ; NO, ERROR TIME
XCT GSDDSP(T1) ; GO FOR THE ENTRY TYPE...
GSDDSP: JRST MODNAM ; MODULE NAME ENTRY
JRST GSDCST ; CSECT ENTRY, IGNORED
JRST GSDIGS ; INTERNAL GLOBAL SYMBOL
JRST GSDRE3 ; START ADDRESS, IGNORED
JRST GSDNAM ; GLOBAL SYMBOL NAME
JRST GSDPST ; PROGRAM SECTION NAME
JRST GSDVER ; GSD VERSION INFORMATION
JRST GSDRE3 ; MAPPED ARRAY
JRST GSDCRN ; COMPLETION ROUTINE ENTRY
; HERE WHEN WE FIND A MODULE NAME WITHIN A GSD RECORD
MODNAM:
IFN DEBUG,<
SKIPN F.DEBU
JRST MODNA1
TYPE <% Module name >
MOVE T1,STBSYM
CALL SIXTYP ; TYPE THE NAME
TYPE < encountered
>>
MODNA1: MOVE T1,STBSYM ; GET THE SYMBOL
MOVEM T1,STBNAM ; SAVE THE NAME FOR LATER
; AT SOME POINT IN THE FUTURE, THIS WILL BE USED TO DECIDED WHAT SYMBOL
; TABLE THE REST OF THE SYMBOLS WILL BE ADDED TO....
JRST GSDRE3 ; LOOP FOR MORE DATA
; HERE WHEN WE SEE A CSECT NAME ENTRY
GSDCST:
IFN DEBUG,<
SKIPN F.DEBU
JRST GSDCS1
TYPE <% Csect name >
MOVE T1,STBSYM ; GET THE SYMBOL NAME
CALL SIXTYP ; AND TYPE IT OUT
TYPE < encountered
>>
GSDCS1: JRST GSDRE3 ; IGNORE THE RECORD FOR ANY ACTION
; HERE WHEN WE SEE A PSECT NAME ENTRY
GSDPST:
IFN DEBUG,<
SKIPN F.DEBU
JRST GSDCS1
TYPE <% Psect name >
MOVE T1,STBSYM ; GET THE SYMBOL NAME
CALL SIXTYP ; AND TYPE IT OUT
TYPE < encountered
>>
GSDPS1: JRST GSDRE3 ; IGNORE THE RECORD FOR ANY ACTION
GSDIGS:
IFN DEBUG,<
SKIPN F.DEBU
JRST GSDIG1
TYPE <% Internal symbol >
MOVE T1,STBSYM ; GET THE SYMBOL NAME
CALL SIXTYP ; AND TYPE IT OUT
TYPE < encountered
>>
GSDIG1: MOVE T1,STBSYM ; GET THE SYMBOL NAME
MOVE T2,STBVAL
MOVE T3,[0] ; SYMBOL HAS NO VALUES UNTIL I KNOW BETTER
MOVE T4,STBNAM ; GET MODULE NAME, PLEASE
CALL ADDSYM ; ADD THIS TO THE SYMBOL TABLE
AOS T5 ; COUNT THE NEW SYMBOL...
JRST GSDRE3 ; IGNORE THE RECORD FOR ANY ACTION
GSDNAM:
IFN DEBUG,<
SKIPN F.DEBU
JRST GSDNA1
TYPE <% Global symbol >
MOVE T1,STBSYM ; GET THE SYMBOL NAME
CALL SIXTYP ; AND TYPE IT OUT
TYPE < encountered
>>
GSDNA1: HRRZ T3,STBFLG ; GET THE SYMBOL FLAGS FOR NOW
IFN DEBUG,<
SKIPN F.DEBU
JRST GSDNA9
TYPE <% Symbol is >
MOVEI T1,[ASCIZ /weak, /]
TRNN T3,1 ; WEAK BIT SET?
MOVEI T1,[ASCIZ /strong, /]
CALL TYPSTR
MOVEI T1,[ASCIZ /library, /]
TRNN T3,4 ; NORMAL, OR LIBRARY?
CALL TYPSTR
MOVEI T1,[ASCIZ /definition, /]
TRNN T3,10 ; REFERENCE OF DEFINITION?
MOVEI T1,[ASCIZ /reference, /]
CALL TYPSTR
MOVEI T1,[ASCIZ /relative
/]
TRNN T3,40 ; WELL?
MOVEI T1,[ASCIZ /absolute
/]
CALL TYPSTR
>
GSDNA9: TRNN T3,10 ; JUST A REFERENCE?
JRST GSDRE3 ; YES, FORGET THIS CRAP
TRNE T3,1 ; WEAK OR STRONG
TLO T3,SMF.SU ; WEAK ==> SUPRESSED
MOVE T2,STBVAL
TRNE T3,4
JRST [ TRZ T3,40 ; CLEAR RELATIVE
ADD T2,RELOFF ; SET THE OFFSET IF WE NEED TO
JRST .+1 ] ; AND BACK TO THE MAIN LINE
TRNE T3,40 ; ABSOLUTE?
ADD T2,RELOFF ; NO, OFFSET IT, PLEASE
TRZ T3,-1 ; CLEAR THE EXTRA FLAGS WE MAY HAVE
MOVE T1,STBSYM ; GET THE SYMBOL NAME
MOVE T4,STBNAM ; GET MODULE NAME, PLEASE
CALL ADDSYM ; ADD THIS TO THE SYMBOL TABLE
AOS T5 ; COUNT THE NEW SYMBOL...
JRST GSDRE3 ; IGNORE THE RECORD FOR ANY ACTION
GSDVER: DBGTYPE <DB.INI!DB.SYM>,<% Version block encountered
>
JRST GSDRE3
GSDCRN: DBGTYPE <DB.INI!DB.SYM>,<% Completion routine block encountered
>
JRST GSDRE3
; HERE WHEN WE GET A RECORD INDICATING THERE ARE NO MORE GSD RECORDS
EGSDRE: CALL EATREC ; EAT UP THE REST OF THE RECORD
DBGTYPE <DB.INI!DB.SYM>,<%End of GSD record encountered
>
RET ,EGSDRE
; HERE WITH A TEXT RECORD
TXTREC: CALL EATREC ; EAT UP THE REST OF THE RECORD
DBGTYPE <DB.INI!DB.SYM>,<%Text record encountered
>
RET ,TXTREC
; HERE WITH A LOCAL SYMBOLS RECORD
ISDREC: CALL EATREC
DBGTYPE <DB.INI!DB.SYM>,<%Internal symbol directory encountered, too bad...
>
RET ,ISDREC
; HERE WITH A RELOCATION RECORD
RLDREC: CALL EATREC
DBGTYPE <DB.INI!DB.SYM>,<%Relocation information record encountered
>
RET ,RLDREC
GSDRE2: CALL EATREC ; FLUSH THE REST OF THE RECORD
TYPE <?
?Illegal entry type in a GSD record while reading symbol table
>
JRST RDSTB1 ; READ MORE, NOT ALL IS LOST...
GSDRE1: CALL RDSTB4 ; TYPE THE ERROR MESSAGE
JRST RDSTB1 ; LOOK FOR ANOTHER RECORD
RDSTB2: TYPE <?
?Unexpected End of File while reading the symbol table
>
RET ,RDSTB2
RDSTB3: TYPE <?
?Unexpected record type while reading the symbol table
>
RET ,RDSTB3
RDSTB4: TYPE <?
?Unexpected end of record while reading the symbol table
>
RET ,RDSTB4
; Here to eat up the rest of the record we are in the middle of (maybe)
EATREC: SKIPN T2,STBSIZ ; ARE THERE ANY BYTES LEFT IN THE FILE?
RET ,EATREC
CALL RDSGYB ; GET THE NEXT BYTE
RET ,EATREC
SOJG T2,.-2 ; LOOP FOR MORE DATA
SETZM STBSIZ ; CLEAR THE SIZE FIELD
RET ,EATREC
COMMENT \
Here to read the next 8 bit byte from the STB file. The format of the file is
0,byte2,byte1,,0,byte4,byte3, and we must keep tract of where we are, and spit
the bytes out in the right order. This routine will return all bytes, (even
nulls), and with a skip return, and take the error return when the end of file
has been reached.
\
RDSGYB: MOVE T1,RSTATE ; GET THE STATE POINTER
ANDI T1,3 ; SAVE ONLY THE TWO LOW ORDER BITS
JRST @[ ; AND CALL THE CORRECT ROUTINE
RDSGY0 ; GET NEXT WORD OF FILE, AND BYTE
RDSGY1 ; JUST GET NEXT BYTE...
RDSGY1
RDSGY1](T1) ; DETERMINED BY THE STATE FIELD
RDSGY0: SOSGE IHD+2 ; IS THERE ANOTHER WORD TO GET?
JRST RDSGY2 ; NO, GET ANOTHER BUFFER
AOS IHD+1 ; POINT TO THE NEXT WORD TO READ IN
RDSGY1: MOVE T1,[ POINT 8,@IHD+1,17
POINT 8,@IHD+1,9
POINT 8,@IHD+1,35
POINT 8,@IHD+1,27 ](T1)
AOS RSTATE ; AND COUNT THIS TO THE NEXT STATE
LDB T1,T1
RET SKIP,RDSGYB
; HERE TO GET THE NEXT BUFFER, AND SET UP THE POINTERS WE WILL NEED
RDSGY2: DBGTYPE <DB.INI!DB.SYM>,<%Reading next disk block of symbol table.
>
IN 1, ; GET THE BUFFER WE NEED
JRST RDSGYB ; IN NO ERROR, ADJUST THE COUNTS AND POINTERS
GETSTS 1,T1 ; GET THE FILE STATUS, DUE TO ERROR
TXNE T1,IO.IMP!IO.DER!IO.DTE!IO.BKT ; ANY ERRORS WE WORRY ABOUT?
CALL IFILER ; YES, REPORT THEM
RELEASE 1, ; DUMP THE FILE
SETZM FILDEV
RET ,RDSGY2
; HERE TO READ WORD FROM THE FILE.
RDSGYW: CALL RDSGYB ; GET THE NEXT DATA BYTE, AND
RET ,RDSGYW ; IF THERE IS AN ERROR, PASS IT UP, OR
PUSH P,T1 ; SAVE IT FOR LATER
CALL RDSGYB ; GET YET ANOTHER BYTE
JRST [ POP P,T1 ; AND PASS BACK THAT ERROR, TOO
RET SKIP,RDSGYW]
LSH T1,8 ; MOVE THIS OVER 8 BITS
ADD T1,(P) ; ADD IN THE TOP OF THE STACK
POP P,(P) ; AND CLEAR THE STACK OFF
RET SKIP,RDSGYW
; Here to convert the next two word in the input from RADIX 50 to SIXBIT
; CALL :
; CALL R50SIX
; Return:
; +1 END OF RECORD OR FILE
; +2 T1/ SIXBIT SYMBOL NAME...
R50SIX: SOSLE STBSIZ ; COUNT THE FIRST BYTE
SOSGE STBSIZ ; AND THE SECOND BYTE...
RET ,R50SIX ; IF THERE IS NOT ENOUGH DATA, WE LOSE
SOSLE STBSIZ ; COUNT THE FIRST BYTE
SOSGE STBSIZ ; AND THE SECOND BYTE...
RET ,R50SIX ; IF THERE IS NOT ENOUGH DATA, WE LOSE
CALL R50SI1 ; CONVERT THE FIRST HALFWORD
RET ,R50SIX ; ERROR IN DOING IT
LSH T1,^D18 ; SAVE THE LEFT HALF AS THE LEFT HALF
PUSH P,T1 ; STACK IT
CALL R50SI1
JRST [ POP P,T1 ; ERROR, CLEAR THE STACK, AND RETURN IT
RET ,R50SIX]
ADD T1,(P) ; ADD IN THE STACK TOP
POP P,(P) ; AND CLEAR IT
RET SKIP,R50SIX
R50SI1: CALL RDSGYW ; READ THE FIRST TWO OF THE FOUR BYTES...
RET ,R50SI1
IDIVI T1,50 ; DEVIDE BY 50,
PUSH P,T2 ; AND SAVE THE LAST BYTE
IDIVI T1,50 ; GET THE OTHER TWO BYTES APART
HRRZ T1,R50TAB(T1) ; CONVERT TO ASCII
SUBI T1,40 ; CONVERT TO SIXBIT
HRRZ T2,R50TAB(T2) ; CONVERT TO ASCII
SUBI T2,40 ; CONVERT TO SIXBIT
LSH T1,6 ; MAKE SOME ROOM
ADD T1,T2 ; AND ADD IN THE BYTE
POP P,T2 ; GET THE LAST BYTE
HRRZ T2,R50TAB(T2) ; CONVERT TO ASCII
SUBI T2,40 ; CONVERT TO SIXBIT
LSH T1,6 ; MAKE SOME ROOM
ADD T1,T2 ; AND ADD IN THE BYTE
RET SKIP,R50SI1
;HERE TO OPEN A FILE TO READ(F.WRIT=0) OR WRITE(F.WRIT=1)
; CALL MOVE T1,[SIXBIT \FILE\] ;DEFAULT FILE NAME
; MOVE T2,[SIXBIT \EXTEXT\] ;DEFAULT EXTENSIONS
; MOVE T3,[SWDSP,,SWLST] ;SWITCH POINTER
; MOVE T4,[400000,,ADR] ;DEFAULT LAST SWITCH
; CALL OPNFIL
; LOSE RETURN
; WIN RETURN
OPNFIL: TROA FLG,F.FLIP ;FLAG WE SHOULD PROMPT
OPNFL0: TXZ FLG,F.FLIP ;NO PROMPT PLEASE
MOVEM T2,DEFEXT ;SAVE DEFAULT EXTENSIONS
SETZM FILDEV ;INITIALIZE START OF FILE BLOCK
MOVE T2,[FILDEV,,FILDEV+1] ;BLT POINTER TO
BLT T2,FILDEV+$FBLEN-1 ; INITIALIZE REST OF FILE BLOCK
MOVEM T1,FILNAM ;SAVE DEFAULT FILE NAME
MOVEM T3,FIL.SW ;SAVE POINTER TO SWITCHES
MOVEM T4,LASTSW ;LAST SWITCH WE GET
OPFIL1: MOVEI T1,[ASCIZ \
FILE: \]
TXOE FLG,F.FLIP ;WANT PROMPT ?
CALL TYPSTR
CALL SIXIN ;GET FILE NAME
JRST OPFIL1
JUMPE T1,OPFIL4 ;JUST SWITCHES
MOVSI T2,'DSK' ;DEFAULT DEVICE NAME
MOVEM T2,FILDEV
CAIE T5,":" ;WAS THIS A DEVICE SPECIFICATION ?
JRST OPFIL2
MOVEM T1,FILDEV ;YES SO WAS A DEVICE
CALL SIXIN ;GET FILE NAME
JRST OPFIL1
OPFIL2: SKIPE T1 ;WAS THERE A FILE NAME ?
MOVEM T1,FILNAM ;SAVE FILE NAME
CAIE T5,"." ;GIVING AN EXTENSION ?
JRST OPFIL3 ;NO
CALL SIXIN ;GET EXTENSION
JRST OPFIL1
HLLZM T1,FILEXT
OPFIL3: CAIE T5,"[" ;GIVING A PPN ?
JRST OPFIL4
;HERE TO READ IN A PATH SPEC
CALL SIXIN
JRST OPFIL4
CAIE T5,","
JRST OPFIL4
CALL SIXOCT
JRST OPFIL4
CAIN T1,0 ;USER TYPE IN EXPLICIT PROJECT?
HLRZ T1,MYPPN ;NO, USE HIS THEN
HRLM T1,FILPPN ; SET IN FILE PATH BLOCK
CALL SIXIN
JRST OPFIL1
CALL SIXOCT
JRST OPFIL1
CAIN T1,0 ;USER TYPE IN EXPLICIT PROGRAMMER?
HRRZ T1,MYPPN ;NO, USE HIS THEN
HRRM T1,FILPPN ; SET IN FILE PATH BLOCK
MOVEI T4,FILSFD-1 ; START OF SFD'S
OPFL30: MOVE T1,T5
CAIE T1,"," ;WERE SFD'S SPECIFIED ?
JRST OPFL39
CALL SIXIN ;GET SFD NAME
JRST OPFL39
CAIN T4,FILSFD+4 ; ALREADY FILLED ALL ?
JRST [ TYPE <?
?SFD depth greater than 5>
RET ,OPNFIL]
PUSH T4,T1
JRST OPFL30
OPFL39: CAIN T1,"]"
CALL RDCHAR
OPFL40: MOVEM T1,T5
OPFIL4: CAIN T5,40 ;WAS BREAK CHAR A SPACE ?
JRST [ CALL RDCHAR ;GET NEXT CHAR
JRST OPFL40 ]
CAIE T5,"/" ;TIME FOR SWITCHES ?
JRST OPFIL7
CALL SIXIN ;GET SWITCH NAME
JRST OPFIL7
MOVSI T2,770000 ;MAKE A MASK
OPFL41: MOVE T3,T1 ;COPY ARGUMENT
AND T3,T2 ;MASK IT
CAMN T1,T3 ;WAS THAT RIGHT MASK ?
JRST OPFL42
ASH T2,-6 ;MAKE MASK BIGGER
JRST OPFL41
OPFL42: HRRZ T4,FIL.SW
OPFL43: SKIPN T3,(T4) ;GET NEXT ENTRY IN LIST
JRST OPFIL5 ;NO MATCH FOR SWITCH
CAMN T1,T3 ;EXACT ENTRY?
JRST OPFIL6 ;YES, IGNORE PARTIAL MATCHES
AND T3,T2 ;MASK OFF ENTRY
CAME T1,T3 ;DID WE FIND MATCH ?
AOJA T4,OPFL43 ;TRY NEXT ENTRY
MOVE T3,1(T4) ;GET NEXT ENTRY FROM LIST
AND T3,T2 ;MASK IT
CAME T1,T3
JRST OPFIL6
OPFIL5: PUSH P,T1 ;SAVE SWITCH
TYPE <?
?Undefined or ambiguous switch />
POP P,T1
CALL SIXTYP
OPFL52: TYPE <
Legal switches are:>
HRRZ T4,FIL.SW ;POINT TO LIST OF SWITCHES
OPFL55: SKIPN (T4)
JRST CRLTYP ;END WITH A FLURISH
TYPE < />
MOVE T1,(T4) ;GET SWITCH NAME
CALL SIXTYP
AOJA T4,OPFL55
OPFIL6: SUB T4,FIL.SW
HLRZ T1,FIL.SW
ADDI T1,(T4)
SKIPGE T1,(T1)
JRST [ MOVEM T1,LASTSW
JRST OPFIL4 ]
PUSHJ P,(T1)
RET ,OPNFIL
JRST OPFIL4
OPFIL7: CAIE T5,15 ;IS THE BREAK CHARACTER A CR?
JRST [TYPE <?
?Syntax error in file name or switches
>
RET ,OPNFIL]
SETZ T1,
SKIPN T2,FILDEV ;DID USER TYPE A FILE NAME ?
JRST OPNFLZ
MOVEI T3,IHD
TXNE FLG,F.WRIT
SKIPA T3,[OHD,,0]
SKIPA T4,[OPEN 1,T1] ;READ ON CHNL 1
MOVE T4,[OPEN 0,T1]
XCT T4
JRST FILER0
PUSH P,.JBFF##
MOVEI T2,OBUFER
MOVE T1,[INBUF 1,NUMBUF]
TXNE FLG,F.WRIT
SKIPA T1,[OUTBUF 1]
MOVEI T2,IBUFER
MOVEM T2,.JBFF##
XCT T1
NOP
POP P,.JBFF##
SKIPE FILEXT ; USER TYPE ANY EXTENSION?
SETZM DEFEXT ; YES, CLEAR DEFAULTS THEN
OPNFL2: MOVE T1,[LOOKUP 1,FILBLK]
MOVEI T2,LKELEN ; LENGTH OF EXTENDED LOOKUP/ENTER BLOCK
MOVEM T2,FILBLK ; SET IN LOOKUP/ENTER BLOCK
SKIPN FILPPN ; USER TYPE IN EXPLICIT PATH?
TDZA T2,T2 ; NO, USE DEFAULT PATH
MOVEI T2,FILPTH ; YES, USE IT AS TYPED
MOVEM T2,FILDIR ; SET PATH BLOCK IN LOOKUP/ENTER BLOCK
TXZE FLG,F.APND ;IF APPENDING DO LOOKUP FIRST
JRST [TLZ T1,000740 ;CLEAR CHNL SPEC
XCT T1 ;DO LOOKUP
JRST OPNFL2 ;LOST BUT DON'T CARE
TXO FLG,F.APND ;NEED TO DO USETI
LDB T2,[POINTR 17,T1] ;CHANNEL NUMBER
MOVEM T2,FILPTH ;SET IN PATH BLOCK
MOVE T2,[PTHLEN,,FILPTH] ;ARG POINTER TO
PATH. T2, ;READ FILE TRUE PATH
SETZ T2, ;FAILED??
JRST .+1 ]
TXNE FLG,F.WRIT
HRLI T1,(ENTER)
XCT T1
CAIA ;LOOKUP OR ENTER LOST
JRST OPNFL5 ;WE HAVE A FILE READY FOR I/O
TXNE FLG,F.WRIT ;WRITING ?
JRST FILER0 ;HE LOSES
SKIPN T2,DEFEXT ; ANY DEFAULTS LEFT?
JRST FILER0 ;NO, ERROR
HLLZM T2,FILEXT ;YES, TRY NEXT DEFAULT
LSH T2,^D18 ;TOSS IT OUT
MOVEM T2,DEFEXT ;AND SAVE ANYTHING LEFT FOR NEXT TIME
JRST OPNFL2
OPNFL5: LDB T2,[POINTR 17,T1] ;CHANNEL NUMBER
MOVEM T2,FILPTH ;SET IN PATH. BLOCK
MOVE T2,[PTHLEN,,FILPTH] ;ARG POINTER TO
PATH. T2, ;READ TRUE FILE PATH
JFCL ;???
SKIPN FILDEV
JRST OPNFL6
TXNE FLG,F.APND
USETI -1 ;IN CASE SUPERCEEDING
OPNFL6: MOVE T1,[FILDEV,,OFLDEV] ;BLT POINTER
TXNN FLG,F.WRIT ;ARE WE READING OR WRITING ?
HRRI T1,IFLDEV ;READING
MOVEI T2,$FBLEN-1(T1) ; LAST WORD TO TRANSFER
BLT T1,(T2) ;COPY FILE SPEC
OPNFLZ: SKIPE T1,LASTSW
JRST (T1)
RET SKIP,OPNFIL
FILER0: TXNE FLG,F.WRIT
SETZM OHD
TYPE <?
?Can't LOOKUP/ENTER file >
FILERR: TXNE FLG,F.WRIT
SETZM OHD
MOVEI T1,FILDEV
CALL FILTYP
CALL CRLTYP
TXNN FLG,F.WRIT
SETZM IHD
RET ,FILERR
FILTYP: HRL T2,T1 ;BUILD BLT POINTER
HRRI T2,FILDEV
BLT T2,FILDEV+$FBLEN-1 ; COPY FILE SPEC
MOVE T1,FILDEV ;GET DEVICE NAME
CALL SIXTYP
CALL COLTYP ;TYPE A COLON
MOVE T1,FILNAM ;GET FILE NAME
CALL SIXTYP
CALL PERTYP ;TYPE A "."
HLLZ T1,FILEXT ;GET EXTENSION
CALL SIXTYP
SKIPN FILPPN ; WAS THERE A PPN ?
JRST FILTY6
MOVEI T1,"["
CALL TYPCHR
HLRZ T1,FILPPN
CALL OCTYPE
CALL COMTYP ;TYPE A COMMA
HRRZ T1,FILPPN ; GET RH OF PPN
ANDI T1,-1
CALL OCTYPE
MOVEI T3,FILSFD ; START OF SFD'S
FILTY4: CAIE T3,FILSFD+5 ; TYPED ALL SFD LEVELS ?
SKIPN T1,(T3) ;GET NEXT SFD NAME
JRST FILTY5
CALL COMTYP ;TYPE A COMMA
CALL SIXTYP
AOJA T3,FILTY4
FILTY5: MOVEI T1,"]"
CALL TYPCHR
FILTY6: CALL BLANKT
LDB T1,[POINT 11,FILTIM,23]
JUMPE T1,FILTYZ
CALL TIMTY3
CALL BLANKT
FILTY3: LDB T1,[POINT 3,FILEXT,20] ;HIGH ORDER CREATION DATE
LDB T2,[POINT 12,FILTIM,35] ;LOWER ORDER CREATION DATE
LSH T2,^D24 ;APPEND THE TWO TIMES INTO
LSHC T1,^D12 ;ONE 15-BIT CREATION DATE
CALL DATET0 ;TYPE DATE
FILTYZ: RET ,FILTYP
;HERE TO CLOSE OUTPUT FILE
DONE.W: SKIPN OHD
RET ,DONE.W
OUT
CLOSE
RELEASE
SETZM OHD
MOVE T1,OFLDEV
CAMN T1,[SIXBIT /TTY/]
JRST DONE.Z
DONE.1: TYPE <File >
MOVEI T1,OFLDEV
CALL FILTYP
TYPE < written
>
DONE.Z: SETZM FILDEV
RET ,DONE.W
;HERE TO GET NEXT CHAR FROM A FILE
; CALL CALL FILCHR
; ERROR RETURN
; NORMAL RETURN WITH CHAR IN T1
FILCHR: CALL FILBYT ;GET NEXT BYTE FROM FILE
RET ,FILCHR
JUMPE T1,FILCHR ;FLUSH NULLS
RET SKIP,FILCHR
;HERE TO GET THE NEXT BYTE FROM INPUT FILE
FILBYT: SOSGE T1,IHD+2 ;IS THERE MORE STUFF IN BUFFER ?
JRST FLCHR5 ;NO
ILDB T1,IHD+1 ;GET NEXT CHAR
RET SKIP,FILBYT
FLCHR5: IN 1, ;GET NEXT BUFFER
JRST FILBYT ;TRY AGAIN
GETSTS 1,T1 ;GET FILE STATUS
TXNE T1,IO.IMP!IO.DER!IO.DTE!IO.BKT ;ANY ERRORS
CALL IFILER ;REPORT ERROR
RELEASE 1, ;GONE WITH CHANNEL
SETZM FILDEV
RET ,FILBYT
IFILER: TYPE <?
?Error reading file >
MOVEI T1,IFLDEV ;ADR OF NAME OF FILE
CALL FILTYP
TYPE < status = >
GETSTS 1,T1 ;GET BACK STATUS
CALL OCTYPE
JRST CRLTYP
;HERE TO POSITION FILE FOR INPUT
; CALL MOVE T1,BYTE # IN FILE
; CALL FILPOS
; RETURN
FILPOS: IDIVI T1,200*5 ;FIND BLOCK TO READ
USETI 1,1(T1)
IN 1, ;GET NEXT BUFFER
CAIA
RET ,FILPOS
FILPS4: SOJL T2,[RET SKIP,FILPOS]
CALL FILBYT
RET ,FILPOS
JRST FILPS4
;HERE TO INPUT AN OCTAL NUMBER
; CALL : CALL INPOCT
; ERROR RETURN
; RETURN WITH OCTAL NUMBER IN T1, BREAK CHAR IN T2
INPOCT: CALL SAVE34
SETZB T3,T4
INPRD2: CALL FILCHR ;GET NEXT INPUT CHAR
RET ,INPOCT
JUMPE T1,INPRD2
CAIE T1," " ;LEADING SPACE ?
CAIN T1," " ;OR TAB ?
JRST INPRD2 ;YES
INPRD5: CAIL T1,"0"
CAILE T1,"7"
JRST INPRD7
IMULI T3,^D8
ADDI T3,-60(T1)
CALL FILCHR
CAIA ;EOF
JRST INPRD5
INPRD7: MOVE T2,T1
MOVE T1,T3
RET SKIP,INPOCT
;HERE TO GET A SIXBIT WORD FROM TTY
; CALL : CALL SIXIN
; LOSE RETURN
; WIN RETURN WITH SIXBIT WORD IN T1 & BREAK CHAR IN T5
SIXIN: PUSH P,T4 ;SAVE REG
SIXIN0: CALL RDCHAR ;GET THE FIRST CHAR
CAIE T1," " ;IS IT A BLANK
CAIN T1," " ;OR A TAB ?
JRST SIXIN0 ;YES SO SKIP IT
MOVE T4,[POINT 6,T5]
SETZ T5, ;CLEAR ACCUMULATED SYMBOL
CAIN T1,"%"
JRST SIXIN7
JRST SIXIN3
SIXIN2: CALL RDCHAR ;GET A CHAR FROM TTY
SIXIN3: CAIN T1,177
JRST [ TYPE <xxx>
POP P,T4
RET ,SIXIN]
CAIL T1,"0"
CAILE T1,"Z"+40
JRST SIXIN9 ;RETURN
CAILE T1,"9"
CAIL T1,"A"+40
JRST SIXIN7
CAIL T1,"A"
CAILE T1,"Z"
JRST SIXIN9 ;RETURN
SIXIN7: CAIGE T1,40+"A" ;CHECK FOR LOWER CASE
SUBI T1,40
CAME T4,[POINT 6,T5,35] ;HAVE WE ALREADY FILLED WORD ?
IDPB T1,T4 ;NOT YET
JRST SIXIN2
SIXIN9: EXCH T1,T5
POP P,T4
RET SKIP,SIXIN
;HERE TO CONVERT SIXBIT TO OCTAL
SIXOCT: MOVE T4,[POINT 6,T1]
SETZ T2,
SIXOC1: ILDB T3,T4
JUMPE T3,SIXOC9
CAIL T3,20
CAILE T3,27
RET ,SIXOCT
IMULI T2,^D8
ADDI T2,-20(T3)
CAME T4,[POINT 6,T1,35] ;DONE ALL OF WORD ?
JRST SIXOC1
SIXOC9: EXCH T1,T2
RET SKIP,SIXOCT
;HERE TO GET A DECIMAL ARGUMENT FROM THE TTY
; CALL CALL DECINP
; LOSE RETURN
; WIN RETURN WITH # IN T1, BREAK CHAR IN T5
DECINP: MOVEI T1,^D10 ;RADIX
RADINP: CALL SAVE2 ;SAVE SOME REGISTERS
SETZ T5, ;BUILD NUMBER HERE
MOVE T2,T1 ;COPY RADIX
RADIN0: CALL RDCHAR ;GET NEXT CHAR FROM THE TTY
CAIE T1," " ;IS THIS A LEADING SPACE ?
CAIN T1," " ;OR TAB ?
JRST RADIN0 ;YES SO FLUSH IT
CAIL T1,"0" ;IS FIRST CHARACTER NUMERIC ?
CAIL T1,"0"(T2)
JRST RADIN9 ;ERROR RETURN
AOS (P) ;WIN
RADIN2: CAIL T1,"0" ;IS CHARACTER NUMERIC
CAIL T1,"0"(T2) ;IS IT IN RANGE ?
JRST RADIN9 ;ALL DONE
IMULI T5,(T2) ;SHIFT CURRENT ACCUMULATION
ADDI T5,-60(T1) ;ADD NEXT DIGIT
CALL RDCHAR ;GET NEXT CHAR FROM THE TTY
JRST RADIN2
RADIN9: EXCH T1,T5
RET ,RADINP
;HERE TO DISPLAY CONTENTS OF T1 AS AN ADDRESS
ADRTYP: TLNN T1,400000
TLO T1,777777
TLNN T1,200000
JRST DATIN9 ;TYPE REGISTER NAME
ANDI T1,777777 ;EIGHTEEN BITS ONLY PLEASE
HRROM T1,LSTADR ;SAVE LAST ADDRESS DISPLAYED
CALL VALFND ;SEE IF WE CAN FIND A SYMBOL
JRST RADTYP ;TYPE ADDR IN CURRENT RADIX
SKIPN 1(SYM) ;DON'T USE IF SYMBOL=0
JRST RADTYP
PUSH P,T1 ;SAVE VALUE
MOVE T1,(SYM) ;GET SYMBOL NAME
CALL SIXTYP ;TYPE SYMBOL
POP P,T1 ;GET VALUE AGAIN
SUB T1,1(SYM) ;GET DISPLACEMENT
ANDI T1,177777 ;STRIP EXTRA BITS
JUMPE T1,R ;IF EXACT WE ARE DONE
PUSH P,T1 ;SAVE REMAINDER
CALL PLUTYP ;TYPE A "+"
POP P,T1
JRST RADTYP ;TYPE REST IN CURRENT RADIX
;HERE TO TYPE CONTENTS OF CURRENT LOCATION
; CALL WITH DOT SETUP TO POINT TO STARTING POINT OF DISPLAY
; WITH BYTCNT AND O.MODE SETUP TO INDICATE TYPE OF DISPLAY
; CALL DATYPE
DATYPE: HRRZ T2,BYTCNT ;BYTE COUNT
HRRZ T3,O.MODE ;OUTPUT MODE
MOVE T1,DOT
MOVEM T1,DOTFOO
SKIPE PDP8F
JRST DATYP1
TXNN DOT,DOT.AC
JRST REGTYP ;WANT REGISTER DISPLAYED
CAIG T3,2 ;IS THIS A WORD MODE
ASH T2,1 ;YES SO BYTE=WORDS*2
DATYP1: CALL GETWRD
JRST [ MOVEI T2,GENERR ; GENERAL CASE OF THE ERROR
JRST CALERR ] ; DESCRIBE PROBLEM
MOVEM T1,ESC.Q. ; IN CASE OF <ESCAPE>Q LATER
MOVEM T1,DATA
HRRZ T5,BYTCNT ; REPETITION COUNT
MOVE T1,DATA ; GET DATA TO TYPE
HRRZ T2,O.MODE ; GET OUTPUT MODE
JRST @[
EXP DATINS
EXP DATADR
EXP DATNUM
EXP DATBYT
EXP DATASC
EXP DATEBC
EXP DATR50
](T2)
;HERE TO TYPE THE CONTENTS OF A REGISTER
REGTYP: ANDI T1,177777 ;STRIP EXTRA BITS
CAILE T1,7 ;SMALL ENOUGH ?
JRST QESTYP
MOVE T1,SIMREG(T1) ;GET REGISTER TO DISPLAY
MOVEM T1,ESC.Q. ;IN CASE OF $Q LATER
CALL @[EXP ADRTYP,ADRTYP,RADTYP,RGTBYT,RGTASC,RGTEBC](T3)
JRST B3.TYP ;END WITH A FEW SPACES
;HERE TO TYPE CONTENTS OF REGISTER AS BYTES
RGTBYT: MOVEI T2,RADTYP ;ROUTINE TO DISPLAY BYTES (NUMERIC)
JRST RGTYPX
;HERE TO TYPE CONTENTS OF REGISTER AS ASCII
RGTASC: MOVEI T2,DATAS3 ;ROUTINE TO DISPLAY ASCII BYTES
JRST RGTYPX
;HERE TO TYPE CONTENTS OF REGISTER AS EBCDIC
RGTEBC: MOVEI T2,DATEB3 ;ROUTINE TO DISPLAY EBCDIC BYTES
RGTYPX: PUSH P,T1 ;SAVE DATA
ANDI T1,377 ;FIRST BYTE IS RH
PUSH P,T2 ;SAVE ADR OF DISPLAY ROUTINE
CALL <(T2)> ;DISPLAY THE FIRST BYTE
POP P,T2 ;GET ADR OF DISPLAY ROUTINE BACK
CAIN T2,RADTYP ;WAS THIS BYTES ?
CALL COMTYP ;YES SO WANT A COMMA IN BETWEEN
POP P,T1 ;GET DATA BACK
LDB T1,[POINT 8,T1,27] ;WANT LH BYTE NOW
JRST (T2) ;DISPLAY LAST BYTE
;HERE TO TYPE CONTENTS OF CURRENT LOCATION AS A NUMERIC
DATNUM: HRROM T1,LSTADR ;IN CASE TYPES A TAB LATER
CALL DATEVN ; CHECK FOR AN ODD ADDRESS
JRST B3.TYP ; ERROR, YOU LOSE
CALL RADTYP ;TYPE AS NUMERIC
SOJLE T5,B3.TYP
CALL BLANKT
CALL NXTDWD ;GET NEXT DATA WORD
JRST DATNUM
NXTDWD: CALL NXTWRD ;GET NEXT WORD
JRST B3.TYP ;CAN'T READ NEXT WORD !
MOVEM T1,DATA
RET ,NXTDWD
;HERE TO GET THE NEXT WORD FOR TYPEOUT
NXTWRD: HRRZ T2,O.MODE
CAIE T2,3
CALL NDTFOO ;GET NEXT DOT FOO
MOVE T1,DOTFOO
MOVEI T2,2 ;WANT 2 BYTES
SKIPE PDP8F
MOVEI T2,1
CALL GETWRD ;FIND WHAT NEXT WORD IS
RET ,NXTWRD
MOVEM T1,ESC.Q. ;IN CASE OF <ESCAPE>Q LATER
RET SKIP,NXTWRD
; HERE TO SEE IF THE CURRENT ADDRESS IS EVEN OR NOT...ERROR IS WE LOSE
DATEVN: PUSH P,T1 ; SAVE AN AC FOR OUR USE
MOVE T1,DOT ; GET THE CURRENT ADDRESS
TRNN T1,1 ; IS IT ODD?
JRST [ POP P,T1 ; NO, ALL IS OK
RET SKIP,DATEVN]
SKIPE PDP8F ; WHAT IS AN 8?
JRST .-2 ; YES, HACK UP A LIE
MOVEI T1,ER.ODD ; SET ERROR TYPE
MOVEI T2,GENERR ; INDICATE ERROR LIST
CALL CALERR ; TYPE THE ERROR INFORMATION
JRST [POP P,T1 ; AND RETURN THE ERROR FLAG
RET ,DATEVN]
;HERE TO TYPE DATA AS AN ADDRESS
DATADR: CALL DATEVN ; EVEN ADDRESS?
JRST B3.TYP ; NO, GIVE UP QUICK
CALL ADRTYP
SOJLE T5,B3.TYP ;HAVE WE DONE ENOUGH ?
CALL BLANKT ;TYPE A SPACE TO SEPERATE FIELDS
CALL NXTDWD ;GET NEXT DATA WORD
JRST DATADR ;AND TYPE NEXT WORD
;HERE TO TYPE DATA AS INSTRUCTIONS
DATINS: SKIPE PDP8F
JRST TYP8IN ;TYPE PDP8 INSTRUCTION
CALL DATEVN ; ODD ADDRESS???
JRST B3.TYP ; YES, WE LOSE....
CALL INVLFN ;SEE IF WE CAN FIND AN INSTRUCTION TO MATCH
JRST DATNUM
MOVE T1,(SYM) ;GET INSTRUCTION NAME
CALL SIXTYP
MOVE T5,2(SYM) ;GET FLAGS AGAIN
CALL BLANKT ;TYPE A BLANK
TLNE T5,SMF.EI ;EIS TYPE INSTRUCTION ?
JRST [ LDB T4,[POINT 6,DATA,35] ;GET SOURCE CODE
CALL DATIN8 ;DISPLAY IT
CALL COMTYP
LDB T1,[POINT 3,DATA,29] ;GET REGISTER
CALL DATIN9 ;TYPE REG NAME
JRST B3.TYP]
TLNE T5,SMF.PL ;SPL TYPE INSTRUCTION ?
JRST [ LDB T1,[POINT 3,DATA,35] ;GET ARGUMENT
CALL OCTYPE
JRST B3.TYP]
TLNE T5,SMF.MK ;MARK TYPE ARGUMENTS ?
JRST [ LDB T1,[POINT 6,DATA,35] ;GET ARGUMENT
CALL RADTYP ;TYPE ARGUMENT AS NUMBER
JRST B3.TYP]
TLNE T5,SMF.EM ;EMT TYPE ARGUMENTS ?
JRST [ LDB T1,[POINT 8,DATA,35] ;GET ARGUMENT
HRROM T1,LSTADR ;IN CASE OF TAB
CALL RADTYP ;TYPE ARGUMENT AS NUMBER
JRST B3.TYP]
TLNE T5,SMF.RT ;RTS TYPE ?
JRST [ LDB T1,[POINT 3,DATA,35] ;GET REG ADR
CALL DATIN9 ;TYPE REG NAME
JRST B3.TYP]
TLNE T5,SMF.JS ;JSR TYPE ?
JRST [ LDB T1,[POINT 3,DATA,29]
CALL DATIN9 ;TYPE REG NAME
CALL COMTYP
JRST .+1]
TLNE T5,SMF.SB ;SOB TYPE ?
JRST [ LDB T1,[POINT 3,DATA,29] ;GET REGISTER
CALL DATIN9 ;TYPE REG NAME
CALL COMTYP
LDB T1,[POINT 6,DATA,35] ;GET OFFSET
PUSH P,T2 ; SAVE REG
IMULI T1,-2
MOVEI T2,2(DOT) ; GET PHYS ADDR
ANDI T2,600000 ; SAVE UPPER BITS
ADDI T1,2(DOT)
ANDI T1,177777 ;CLEAR ANY EXTRA BITS WE MAY HAVE PICKED UP
SKIPE F.MCB ; MCB'S 18-BITS
ADD T1,T2 ; ADD BACK UPPER BITS
POP P,T2 ; RESTORE THE REG
CALL ADRTYP
JRST B3.TYP]
TLNN T5,SMF.SS ;12BIT SSDD FORMAT ?
JRST DATIN2 ;NO
LDB T4,[POINT 6,DATA,29] ;GET SS CODE
CALL DATIN8
CALL COMTYP
DATIN2: TLNN T5,SMF.SS!SMF.DD ;IS THERE A 6 BIT DESTINATION CODE ?
JRST DATIN4 ;NO
LDB T4,[POINT 6,DATA,35] ;GET DD CODE
CALL DATIN8
DATIN4: TLNN T5,SMF.BR ;IS THIS BR TYPE ADDRESSING ?
JRST B3.TYP ;NO
LDB T1,[POINT 8,DATA,35] ;GET OFFSET
TRNE T1,200 ;CHECK FOR NEGATIVE OFFSET
IORI T1,177400
AOS T1
LSH T1,1 ;MAKE WORD ADDRESS
ADD T1,DOT
ANDI T1,777777 ;18 BITS HERE
SKIPN F.MCB ;FOR MCB
ANDI T1,177777 ;16 BITS ONLY
CALL ADRTYP ;TYPE ADDRESS
JRST B3.TYP
DATIN8: CAIN T4,27 ;CHECK FOR IMMEDIATE MODE
JRST [ CALL HSHTYP ;TYPE A #
CALL NXTWRD ;GET NEXT WORD
RET ,DATINS
JRST ADRTYP]
CAIN T4,37 ;CHECK FOR ABSOLUTE MODE
JRST [ MOVEI T1,"@"
CALL TYPCHR
CALL HSHTYP ;TYPE A #
CALL NXTWRD ;GET NEXT WORD
RET ,DATINS
JRST ADRTYP]
TRNE T4,10 ;CHECK FOR DEFERRED MODE
PUSHJ P,[MOVEI T1,"@"
PJRST TYPCHR]
CAIE T4,77 ;CHECK FOR RELATIVE DEFERRED MODE
CAIN T4,67 ;CHECK FOR RELATIVE MODE
JRST [ CALL NXTWRD ;GET NEXT WORD
RET ,DATINS
PUSH P,T2 ; SAVE REG
MOVE T2,DOTFOO ; GET PHYS ADDR
ANDI T2,600000 ; SAVE UPPER BITS
ADD T1,DOTFOO ;MAKE RELATIVE
ANDI T1,177777 ;CLEAR ANY EXTRA BITS WE MAY HAVE PICKED UP
ADDI T1,2 ; INCREMENT ADDR
SKIPE F.MCB ; MCB'S 18-BITS
ADD T1,T2 ; ADD BACK UPPER BITS
POP P,T2 ; RESTORE THE REG
JRST ADRTYP]
LDB T1,[POINT 3,T4,32] ;GET MODE
CAIE T1,4
CAIN T1,5
CALL MINTYP
CAIL T1,6 ;CHECK FOR INDEX OR INDEX DEFERRED
JRST [ CALL NXTWRD ;GET NEXT WORD
RET ,DATINS
CALL ADRTYP
JRST DATIN1]
TRNE T1,6
DATIN1: PUSHJ P,[MOVEI T1,"("
PJRST TYPCHR]
LDB T1,[POINT 3,T4,35] ;GET REGISTER VALUE
CALL DATIN9 ;TYPE REGISTER NAME
TRNN T4,60
RET ,DATINS
MOVEI T1,")"
CALL TYPCHR
LDB T1,[POINT 3,T4,32]
CAIE T1,2
CAIN T1,3
CALL PLUTYP
RET ,DATINS
DATIN9: ANDI T1,7 ;STRIP EXTRA BITS
HRLI T1,400000 ;FLAG IS A REGISTER
MOVEM T1,LSTADR ;IN CASE DOES A TAB
HRRZS T1
CALL RGFNDN ;FIND REGISTERS NAME
JRST [ CALL PCNTYP ;TYPE A %
CALL OCTYPE
RET ,DATINS]
MOVE T1,(SYM) ;GET REGISTERS NAME
JRST SIXTYP
;HERE TO TYPE A PDP8 INSTRUCTION
TYP8IN: LDB T1,[POINT 3,DATA,26] ;PICK UP OP CODE
CAIN T1,7 ;IS THIS AN OPERATE INSTRUCTION ?
JRST OPRTYP ;YES SO SPECIAL HANDLING
MOVE T1,[SIXBIT \AND\
SIXBIT \TAD\
SIXBIT \ISZ\
SIXBIT \DCA\
SIXBIT \JMS\
SIXBIT \JMP\
SIXBIT \IOT\](T1)
CALL SIXTYP
CALL BLANKT
LDB T1,[POINT 3,DATA,26] ;GET OP CODE AGAIN
CAIL T1,6
JRST [ LDB T1,[POINT 9,DATA,35]
CALL RADTYP
JRST B3.TYP]
MOVE T2,DATA ;GET INSTRUCTION
MOVEI T1,[BYTE (7)"@",0]
TRNE T2,400 ;IS INDIRECT BIT ON ?
CALL TYPSTR
MOVE T2,DOT
ANDI T2,7600
LDB T1,[POINT 8,DATA,35]
TRZE T1,200
ADDI T1,(T2)
PUSH P,T1 ;SAVE ADR
CALL ADRTYP ;TYPE ADR
POP P,T1 ;GET ADR BACK
MOVE T2,DATA ;GET DATA AGAIN
TRNN T2,400 ;WAS THIS AN INDIRECT CASE ?
JRST B3.TYP ;NOT INDIRECT SO DONE
LDB T2,[POINT 3,T2,26] ;GET OP CODE
CAIN T2,6 ;IOTS DON'T USE ADDRESSES
JRST B3.TYP
PUSH P,T1 ;SAVE ADR AGAIN
MOVEI T1,"\"
CALL TYPCHR
POP P,T1 ;GET ADR AGAIN
MOVEI T2,1 ;ONLY NEED ONE WORD
CALL GETWRD ;GET THAT WORD
JRST [ CALL CALER0
JRST LEVEL0 ]
CALL ADRTYP
JRST B3.TYP
;HERE TO TYPE AN OPERATE INSTRUCTION
OPRTYP: SETZ T5, ;ACCUMULATE BITS MATCHED HERE
SKIPN SYM,SYMBEG ;GET STARTING ADDR FOR SYMBOL TABLE
JRST [ TYPE <?
?Fatal error - symbol table is missing
>
EXIT]
OPRTY1: MOVE T1,2(SYM) ;GET FLAGS FOR SYMBOL & MASK
TLNE T1,SMF.P8 ;IS THIS A PDP8 SYMBOL ?
TLNN T1,SMF.IN ;AND IS THIS AN INSTRUCTION ?
JRST OPRTY5 ;REJECT THIS SYMBOL
AND T1,DATA ;GET VALUE UNDER MASK
CAME T1,1(SYM) ;HIT RIGHT ONE ?
JRST OPRTY5 ;NO
SKIPE T5 ;FOUND ANY OTHERS YET ?
CALL BLANKT ;YES SO TYPE A SPACE
MOVE T1,(SYM) ;GET SYMBOL NAME
CALL SIXTYP ;TYPE SYMBOL
IOR T5,1(SYM) ;REMBER BITS WE EXPLAINED
OPRTY5: MOVEI SYM,4(SYM) ;POINT TO NEXT SYMBOL BLOCK
CAME SYM,SYMEND ;HIT END OF TABLE ?
JRST OPRTY1 ;LOOP BACK FOR REST
ANDI T5,7777 ;STRIP EXTRA BITS
CAME T5,DATA ;DID WE MATCH ALL BITS ?
CALL QESTYP ;NO SO ADD QUESTION MARK
JRST B3.TYP ;CLEAN UP
;HERE TO TYPE DATA AS ASCII TEXT
DATASC: SKIPE PDP8F
JRST DATAS2
PUSH P,T1 ; SAVE AN AC FOR A WHILE
MOVE T1,DOT
TRNE T1,1 ; IS THERE ANY PROBLEM?
JRST [ POP P,T1
JRST DATAS2]
POP P,T1 ; PUT THE AC BACK....
DATAS1: SKIPE PDP8F ;WAS THIS A PDP8 WORD ?
JRST DATAS2 ;YES SO ONLY ONE CHAR/WORD
ANDI T1,377 ;ONLY 8 BITS PLEASE
CALL DATAS3
SOJLE T5,B3.TYP
LDB T1,[POINT 8,DATA,27]
DATAS2: CALL DATAS3
SOJLE T5,B3.TYP
CALL NXTDWD ;GET NEXT DATA WORD
JRST DATAS1
;HERE TO TYPE CONTENTS OF T1 AS AN ASCII CHAR IF PRINTABLE, ELSE TYPE <#>
DATAS3: MOVEM T1,T3 ;SAVE IN CASE NOT ASCII
ANDI T1,177 ;STRIP PARITY BIT
CAIL T1,40
CAILE T1,176
CAIA ;SPECIAL HANDLING
JRST TYPCHR ;JUST TYPE CHARACTER
PUSH P,T3 ;SAVE WEIRD CHARACTER
MOVEI T1,"<"
CALL TYPCHR
POP P,T1 ;GET CHAR
CALL RADTYP
MOVEI T1,">"
PJRST TYPCHR
;HERE TO TYPE DATA AS EBCDIC TEXT
DATEBC: SKIPE PDP8F
JRST DATEB2
PUSH P,T1 ; SAVE AN AC FOR A WHILE
MOVE T1,DOT
TRNE T1,1 ; IS THERE ANY PROBLEM?
JRST [ POP P,T1
JRST DATEB2]
POP P,T1 ; PUT THE AC BACK....
DATEB1: SKIPE PDP8F ;IS THIS PDP8 STUFF ?
JRST DATEB2 ;YES SO ONLY ONE CHAR/WORD
CALL DATEB3
SOJLE T5,B3.TYP
LDB T1,[POINT 8,DATA,27]
DATEB2: CALL DATEB3
SOJLE T5,B3.TYP
CALL NXTDWD ;GET NEXT DATA WORD
JRST DATEB1
DATEB3: ANDI T1,377
SETZ T2,
LSHC T1,-2
ROT T2,2
LDB T1,[POINT 8,EB.TRN(T1),7
POINT 8,EB.TRN(T1),15
POINT 8,EB.TRN(T1),23
POINT 8,EB.TRN(T1),31 ](T2)
PJRST DATAS3
;HERE TO TYPE DATA AS BYTES
DATBYT: ANDI T1,377
SKIPE PDP8F
ANDI T1,77 ;SIX BIT BYTES FOR PDP8
PUSH P,T1 ; SAVE AN AC FOR LATER...
MOVE T1,DOT ; GET THE STARTING PC
TRNE T1,1 ; IS THERE ANY NOPE?
JRST [ POP P,T1 ; PUT THE AC BACK
JRST DATBY2 ] ; AND TYPE THE BYTE
POP P,T1 ; WE ARE EVEN, ALL IS OK...
DATBY1: ANDI T1,377
SKIPE PDP8F
ANDI T1,77 ;SIX BIT BYTES FOR PDP8
CALL RADTYP
SOJLE T5,B3.TYP
CALL COMTYP ;TYPE A COMMA
LDB T1,[POINT 8,DATA,27]
SKIPE PDP8F
LDB T1,[POINT 6,DATA,29]
DATBY2: CALL RADTYP ;TYPE IN CURRENT RADIX
SOJLE T5,B3.TYP
CALL COMTYP ;TYPE A COMMA
CALL NXTDWD ;GET NEXT DATA WORD
JRST DATBY1
; HERE TO TYPE THE NEXT TWO WORDS AS RADIX 50
DATR50: TRNE DOT,1 ; IS THE ADDRESS ODD?
JRST [ MOVEI T2,GENERR ; GENERAL TYPE ERROR CODE
MOVEI T1,ER.ODD ; ODD ADDRESS ERROR
CALL CALERR ; TYPE THE ERROR
JRST B3.TYP] ; END WITH A FLOURISH
CALL DATR51 ; TYPE FRIST THREE BYTES
CALL NXTDWD ; GET THE NEXT DATA WORD, AND DO IT AGAIN
CALL DATR51 ; TYPE LAST THREE BYTES
SOJLE T5,B3.TYP ; ARE WE DONE?
CALL COMTYP ; COMMA, FOR A NICE LISTING
CALL NXTDWD ; GET ANOTHER DATA WORD
JRST DATR50 ; TYPE THE WORD OUT, PLEASE
DATR51: IDIVI T1,50 ; GET THE LAST BYTE OUT
HRRZ T2,R50TAB(T2) ; CONVERT TO ASCII
PUSH P,T2 ; SAVE THE THIRD BYTE
IDIVI T1,50 ; GET THE MIDDLE BYTE OUT
HRRZ T2,R50TAB(T2) ; CONVERT THIS TO ASCII
PUSH P,T2 ; AND SAVE THAT, TOO
HRRZ T1,R50TAB(T1) ; CONVERT THE FIRST BYTE TO ASCII
CALL TYPCHR ; PRINT THIS BYTE
POP P,T1 ; GET CENTER BYTE
CALL TYPCHR ; TYPE THAT, TOO
POP P,T1 ; GET LAST BYTE
CALL TYPCHR ; HALF WAY THERE....
RET ,DATR50
; TO TYPE A NUMBER IN THE CURRENT RADIX
; CALL MOVE T1,<NUM TO TYPE>
; CALL RADTYP ;CLOBBERS T1
; RETURN ;OTHER REGS PRESERVED
RADTYP: CALL SAVE24
HRRZ T3,ORADIX
CALL RADTY2
CAIN T3,^D10
CALL PERTYP ;TYPE A "."
RET ,RADTYP
;HERE TO TYPE DECIMAL NUMBER
; CALL MOVE T1,<NUM TO TYPE>
; CALL DECTYP ;CLOBBERS T1
; RETURN ;OTHER REGS PRESERVED
DECTYP: CALL SAVE24
MOVEI T3,^D10
JRST RADTY2
;HERE TO TYPE AN OCTAL NUMBER AS SIX DIGITS
; CALL MOVE T1,<NUM TO TYPE>
; CALL OCTYPE ;CLOBBERS T1
; RETURN ;OTHER REGS PRESERVED
OCTYP6: CALL SAVE24
MOVEI T3,^D8
MOVEI T4,6
JRST RADTY3
;HERE TO TYPE AN OCTAL NUMBER
; CALL MOVE T1,<NUM TO TYPE>
; CALL OCTYPE ;CLOBBERS T1
; RETURN ;OTHER REGS PRESERVED
OCTYPE: PUSHJ P,SAVE24
MOVEI T3,^D8
RADTY2: SETZ T4,
RADTY3: JUMPGE T1,RADTY5
MOVMS T1
PUSHJ P,MINTYP
RADTY5: IDIVI T1,(T3)
HRLM T2,(P)
SOSG T4
SKIPE T1
PUSHJ P,RADTY5
RADTY7: HLRE T1,(P)
ADDI T1,"0"
CAILE T1,"9"
ADDI T1,7 ;DOING HEX
PJRST TYPCHR
;HERE TO TYPE A DECIMAL NUMBER WITH COMMAS
PDECTY: PUSHJ P,SAVE24
MOVEI T3,^D10
JUMPGE T1,PRADT5
MOVMS T1
CALL MINTYP
PRADT5: IDIVI T1,(T3)
HRLM T2,(P)
JUMPE T1,RADTY7
PUSH P,[EXP RADTY7]
IDIVI T1,(T3)
HRLM T2,(P)
JUMPE T1,RADTY7
PUSH P,[EXP RADTY7]
IDIVI T1,(T3)
HRLM T2,(P)
JUMPE T1,RADTY7
PUSH P,[54-60,,RADTY7]
PUSH P,[EXP RADTY7]
JRST PRADT5
SIXTYP: MOVEM T1,T2
SXTYP1: SETZ T1,
LSHC T1,6
ADDI T1,40
PUSHJ P,TYPCHR
JUMPN T2,SXTYP1
POPJ P,
COLTYP: PUSH P,T1
MOVEI T1,":"
PJRST TYPEIT
QESTYP: PUSH P,T1
MOVEI T1,"?"
JRST TYPEIT
TABTYP: PUSH P,T1
MOVEI T1," "
TYPEIT: PUSHJ P,TYPCHR
POP P,T1
POPJ P,
CRLTYP: PUSH P,T1
MOVEI T1,15 ;CARRIAGE RETURN
PUSHJ P,TYPCHR
MOVEI T1,12 ;LINEFEED
JRST TYPEIT
B3.TYP: CALL BLANKT
CALL BLANKT
BLANKT: PUSH P,T1
MOVEI T1," "
JRST TYPEIT
LATYPE: PUSH P,T1
MOVEI T1,"<"
JRST TYPEIT
RATYPE: PUSH P,T1
MOVEI T1,">"
JRST TYPEIT
COMTYP: PUSH P,T1
MOVEI T1,","
PJRST TYPEIT
PERTYP: PUSH P,T1
MOVEI T1,"."
PJRST TYPEIT
PCNTYP: PUSH P,T1
MOVEI T1,"%"
PJRST TYPEIT
HSHTYP: PUSH P,T1
MOVEI T1,"#"
PJRST TYPEIT
MINTYP: PUSH P,T1
MOVEI T1,"-"
PJRST TYPEIT
PLUTYP: PUSH P,T1
MOVEI T1,"+"
PJRST TYPEIT
;HERE TO TYPE OR PRINT A STRING OF CHARACTERS
; CALL MOVEI T1,<ADR OF ASCIZ STRING>
; CALL TYPSTR
TYPSTR: PUSH P,T2
MOVE T2,[POINT 7,0]
ADDI T2,(T1) ;COPY STRING POINTER
TYPST3: ILDB T1,T2 ;GET NEXT CHAR
JUMPE T1,TYPST5
PUSHJ P,TYPCHR ;TYPE THE CHARACTER
JRST TYPST3
TYPST5: POP P,T2 ;RESTORE REGISTER
POPJ P,
;HERE TO TYPE OR PRINT A SINGLE CHARACTER
TYPCHR: TXNE FLG,F.NOUT ;SUPRESSING OUTPUT?
POPJ P, ;YES
SKIPE OHD ;DOING A DUMP ?
JRST TYPCH3 ;YES
OUTCHR T1
POPJ P,
TYPCH3: SOSGE OHD+2 ;ROOM IN BUFFER
JRST TYPCH4 ;NO
IDPB T1,OHD+1
POPJ P,
TYPCH4: OUT
JRST TYPCH3
HALT
;HERE TO TYPE PROGRAM NAME
IDTYPE: TYPE <DDT11 >
LDB T1,[POINT 9,.JBVER,11]
CALL OCTYPE
LDB T1,[POINT 6,.JBVER,17]
MOVEI T1,100(T1)
CAIE T1,100
CALL TYPCHR
MOVEI T1,"("
CALL TYPCHR
HRRZ T1,.JBVER
CALL OCTYPE
MOVEI T1,")"
CALL TYPCHR
LDB T1,[POINT 3,.JBVER,2]
MOVNS T1
SKIPE T1
CALL OCTYPE
HRROI T1,3 ;CODE FOR PROGRAM NAME
GETTAB T1,
JRST IDTYP2
CAMN T1,[SIXBIT \DDT11\]
JRST IDTYP2
PUSH P,T1
TYPE < = >
POP P,T1
CALL SIXTYP
IDTYP2: SKIPN SYMDEV
JRST IDTYP3
TYPE < /SYMBOLS=>
MOVEI T1,SYMDEV
CALL FILTYP
IDTYP3: CALL BLANKT ;TYPE A BLANK
RET ,IDTYPE
;HERE TO TYPE THE DATE
DATETY: DATE T1,
DATET0: IDIVI T1,^D31*^D12 ;LEAVE YEAR-64 IN T1
ADDI T1,^D64
PUSH P,T1 ;SAVE YEAR
IDIVI T2,^D31
ADDI T2,MONTAB ;GET NAME OF MONTH
PUSH P,T2 ;SAVE ADR OF MONTH NAME
AOS T1,T3 ;GET DAY
CALL DECTYP
CALL MINTYP ;TYPE A "-"
POP P,T1 ;GET MONTH
CALL TYPSTR ;TYPE MONTH NAME
CALL MINTYP ;TYPE A "-"
POP P,T1 ;GET YEAR
CALL DECTYP
RET ,DATETY
MONTAB: ASCIZ \Jan\
ASCIZ \Feb\
ASCIZ \Mar\
ASCIZ \Aprl\
ASCIZ \May\
ASCIZ \June\
ASCIZ \July\
ASCIZ \Aug\
ASCIZ \Sept\
ASCIZ \Oct\
ASCIZ \Nov\
ASCIZ \Dec\
;HERE TO TYPE THE TIME OF DAY
TIMTYP: CALL SAVE4
MSTIME T1, ;GET TIME OF DAY IN MS
TIMTY1: PUSH P,T1 ;SAVE TIME
IDIVI T1,^D1000 ;GET RID OF MS
IDIVI T1,^D60 ;LEAVES SECONDS IN T2
PUSH P,T2
CALL TIMTY3 ;TYPE HH:MM
CALL COLTYP ;TYPE A COLON
POP P,T1
CALL DC2TYP ;TYPE 2 DIGIT DECIMAL NUMBER
POP P,T1 ;TIME ORIGINAL TIME AGAIN
CAIL T1,^D60*^D1000 ;LESS THAN A MINUTE ?
RET ,TIMTYP
CALL PERTYP ;TYPE A "."
IDIVI T1,^D1000 ;GET MS FROM ORIGINAL TIME
EXCH T1,T2
CAIL T2,^D10
JRST [IDIVI T1,^D100 ;LEAVE TENTHS
JRST DECTYP ] ;TYPE TENTH'S
IDIVI T1,^D10
JRST DC2TYP ;TYPE HUNDRETHS
TIMTY3: IDIVI T1,^D60 ;LEAVES MIN IN T2
PUSH P,T2
CALL DECTYP
CALL COLTYP ;TYPE A COLON
POP P,T1
JRST DC2TYP ;TYPE 2 DIGIT DECIMAL NUMBER
DC2TYP: CAIL T1,^D10
JRST DECTYP
PUSH P,T1
MOVEI T1,"0"
CALL TYPCHR
POP P,T1
JRST DECTYP
ESC..D: TXO FLG,F.FLIP ;ASSUME DOING COMMAND LOGGING
TXZ FLG,F..FOO ;ASSUME NOT DOING A DISASSEMBLY
CALL ESC.D0 ;SET UP TO CALL OPNFIL
SKIPE CMDFIL ;PROCESSING A COMMAND FILE ?
JRST DUMP0 ;DON'T OPEN A NEW DUMP
CALL OPNFIL
JRST DUMP9
SKIPN FILDEV
JRST [TYPE <
?$D requires a dump file specification
>
JRST LEVEL0]
TXZ FLG,F.FLIP ;NOT DOING COMMAND LOGGING
CALL ESC.D3 ;PUT TITLE LINE ON DUMP
DUMP0: SETZM CACHEL ;SWEEP CACHE
TXO FLG,F.CACH ;PUT USE IT AFTER IT IS SET UP
HRRO DOT,SBEGIN ;WHERE TO BEGIN DUMP
TXNN FLG,F..FOO ;DOING A DIASSSEMBLY ?
JRST DUMP2 ;GO DO USUAL DUMP
PUSH P,O.MODE ;SAVE OUTPUT MODE
PUSH P,BYTCNT ;AND REPETITION COUNT
DISA10: CALL CRLTYP ;TYPE A <CR><LF>
CALL TABTYP ;TYPE A <HT>
CALL DUMP6 ;FIND IF LOCATION IS REAL
JRST DUMP8 ;NOT REAL SO DONE
HRRZ T1,DOT ;GET CURRENT LOCATION
CALL OCTYP6 ;TYPE SIX DIGIT OCTAL NUMBER
CALL TABTYP
HRRZ T1,DOT ;CURRENT LOCATION
SETZM O.MODE ;ASSUME DUMPING AS AN INSTRUCTION
CALL CNINWD ;FIND HOW MANY WORDS IN INSTRUCTION
JRST [ MOVEI T1,1 ;CODE FOR ADR TYPEOUT
MOVEM T1,O.MODE
JRST .+1 ]
MOVEI T5,(T1) ;NUMBER OF WORDS
MOVEI T1,(DOT) ;CURRENT ADR
CALL DISA40
MOVEI T1,2(DOT)
CALL DISA40
MOVEI T1,4(DOT)
CALL DISA40
HRRZ T1,DOT ;GET ADR TO TYPE TAG
CALL VALFND ;TRY TO FIND TAG FOR THIS LOCATION
JRST DISA20 ;NO TAG HERE
HRRZ T1,DOT
CAME T1,1(SYM) ;EXACT MATCH ?
JRST DISA20 ;NO IS SAME AS NOT CLOSE
MOVE T1,(SYM) ;GET SYMBOL NAME
CALL SIXTYP
CALL COLTYP ;PUT COLON AFTER SYMBOL
DISA20: CALL TABTYP
CALL DATYPE
MOVE T1,DOTFOO
SETZM DOTFOO
CALL DOTINC
MOVEM T1,DOT
HRRZS T1
CAMG T1,S..END
JRST DISA10
DISA90: POP P,BYTCNT ;RESTORE REPETITION COUNT
POP P,O.MODE ;AND OUTPUT MODE
JRST DUMP8
DISA40: SOJL T5,TABTYP
MOVEI T2,2
CALL GETWRD
JRST DISA90 ;CAN'T GET = DONE
CALL OCTYP6
JRST TABTYP
DUMP1: HRRZ T1,DUMPA ;LAST ADDRESS WE TYPED
ADDI T1,20
CAILE T1,(DOT) ;TIME TO TYPE ADR AGAIN ?
JRST DUMP4
DUMP2: CALL CRLTYP
CALL CRLTYP
HRRZ T1,DOT
CALL ADRTYP
JUMPE SYM,DUMP3 ;IF THERE WAS NO SYMBOL DON'T REPEAT
CALL BLANKT
MOVEI T1,"="
CALL TYPCHR
CALL BLANKT
HRRZ T1,DOT
CALL OCTYPE
DUMP3: CALL COLTYP ;TYPE A COLON
HRRZ T1,DOT
ANDI T1,177760 ;IN CASE WAS HIGH
MOVEM T1,DUMPA ;REMEMBER LAST ADR WE TYPED
CAIA ;SO WE DO AN EXTRA TAB
DUMP4: TRNN DOT,7
CALL TABTYP
CALL DUMP6 ;GET NEXT WORD TO DUMP
JRST DUMP8 ;ALL DONE
CALL DATYPE ;DUMP LOCATION
MOVE T1,DOTFOO
SETZM DOTFOO
CALL DOTINC
MOVEM T1,DOT
HRRZS T1
CAMG T1,S..END
JRST DUMP1
DUMP8: CALL CRLTYP
CALL CRLTYP
DUMP85: TXNN FLG,F.FLIP ;DON'T FLUSH IF LOGGING COMMANDS
CALL DONE.W
CALL CRLTYP
CALL CRLTYP
JRST LEVEL0
DUMP9: SETZM OHD
TYPE <error writing >
CALL FILERR
JRST LEVELB
;HERE TO USE DOT TO GET THE NEXT WORD FROM PDP11 (AND LOAD CACHE)
; CALL CALL DUMP6
; LOSE RETURN
; WIN RETURN DATA IN T1
DUMP6: HRRZ T1,DOT ;GET ADDRESS TO EXAMINE
MOVE T2,S..END
SUB T2,T1
CAIL T2,EXMAX
SKIPA T2,[EXP EXMAX]
ADDI T2,^D2
CALL GETWRD
RET ,ESC..D
MOVEM T1,DATA
RET SKIP,ESC..D
;HERE BECAUSE USER TYPED $Y - INVOKES A COMMAND FILE
ESC..Y: TYPE <
Log responses where: >
CALL ESC.D0 ;SET UP TO CALL OPNFIL
SETZ T1, ;NO DEFAULT FILE NAME
CALL OPNFL0
JRST LEVELB
SKIPN FILDEV
JRST [TYPE <?
?$Y requires log file specification
>
JRST LEVEL0]
TXZ FLG,F.WRIT!F.APND ;REMEMBER WE ARE READING
MOVE T1,[SIXBIT \DDT11\]
MOVE T2,[SIXBIT \DDTCMD\] ;DEFAULT EXTENSIONS
MOVE T3,[CMDDSP,,CMDSWL]
MOVEI T4,[RET SKIP,ESC..Y]
PUSH P,OHD ;IN CASE LOGGING
SETZM OHD
CALL OPNFIL
JRST [POP P,OHD
CALL DONE.W
JRST LEVELB]
POP P,OHD
SKIPN FILDEV
JRST [CALL DONE.W
TYPE <?
?$Y requires a command file specification
>
JRST LEVEL0]
CALL ESC.D3 ;PUT TITLE LINE ON DUMP
TXZ FLG,F.CERR ;NO COMMAND ERRORS YET
SETZM CSECHO ;NOT SUPPRESSING ECHO YET
SETOM CMDFIL
SETZM CMDCNT ;AT FIRST CHAR
SETZM CMDFAK
JRST LEVEL0
;HERE TO EAT UP THE REST OF A BAD FILE NAME
LEVELB: CAIN T5,15 ;LINE ENDED WITH CR?
JRST LEVEL0 ;YES
CALL GETCHR ;GET A CHARACTER
MOVE T5,T1
JRST LEVELB
;HERE TO GET A CHAR FROM A COMMAND FILE
CMDCH1: SETZM CMDFAK
CMDCHR: SKIPE T1,CMDFAK ;PREVIOUS "^ATEXT^A" TO HANDLE ?
JRST [CAMN T1,[POINT 6,CMDFAK+1,35]
JRST CMDCH1
ILDB T1,CMDFAK ;GET NEXT CHAR
JUMPE T1,CMDCH1 ;IF BLANK HIT END
MOVEI T1,40(T1) ;CONVERT TO ASCII
JRST CMDCH8 ]
CALL FILCHR
JRST CMDONE ;DONE WITH COMMAND FILE
AOS CMDCNT ;COUNT CHARACTERS INTO FILE
CAIN T1,177 ;IS THIS A RUBOUT ?
JRST CMDCHR ;IGNORE IT
CAIN T1,1 ;IS THIS A "^A"
JRST CMDSUB ;SPECIAL SUBSTITUTION
SKIPGE CSECHO ;SEARCHING FOR A TAG ?
JRST CMDCH8 ;YES SO XON, XOF STUFF
CAIN T1,37&"S" ;IS THIS AN XOF ?
JRST [HLLOS CSECHO ;YES SHUT OFF ECHOING
JRST CMDCHR ] ;ON TO NEXT CHAR
CAIN T1,37&"Q" ;IS THIS AN XON ?
JRST [HLLZS CSECHO ;YES SO TURN ECHOING BACK ON
JRST CMDCHR ] ;ON TO NEXT CHARACTER
CMDCH8: SKIPE CSECHO ;DOING AN ECHO ?
RET SAFE,CMDCHR
PUSH P,T1 ;SAVE CHARACTER
CAIN T1,33 ;IS THIS AN ALTMODE ?
MOVEI T1,"$" ;YES SO ECHO RIGHT
CALL TYPCHR
POP P,T1
RET SKIP,CMDCHR
CMDSUB: CALL SAVE24
MOVE T4,[POINT 6,CMDFAK+1]
SETZM CMDFAK+1
CMDCH2: CALL FILCHR ;GET NEXT CHAR
JRST CMDCH7
AOS CMDCNT ;COUNT THIS CHAR
CAIN T1,1 ;IS THIS THE TRAILING "^A" ?
JRST CMDCH4 ;GO EVALUATE WHAT WE HAVE
CAIL T1,"A"+40 ;CHECK FOR LC
CAILE T1,"Z"+40
TRC T1,40 ;CONVERT TO SIXBIT
CAME T4,[POINT 6,CMDFAK+1,35]
IDPB T1,T4
JRST CMDCH2
CMDCH4: MOVE T1,CMDFAK+1 ;GET SYMBOL WE BUILT
CALL SYMFND ;SEE IF THERE IS A SYMBOL FOR THIS
CMDCH7: JRST [MOVEI T1,1 ;THIS IS HIS "^A"
JRST CMDCH8 ]
PUSH P,[EXP CMDCHR]
MOVE T1,1(SYM) ;GET VALUE
MOVE T3,[POINT 6,CMDFAK+1]
MOVEM T3,CMDFAK
SETZM CMDFAK+1
MOVE T4,ORADIX
CMDCH6: IDIVI T1,(T4)
HRLM T2,(P)
SKIPE T1
CALL CMDCH6
HLRZ T1,(P)
IORI T1,20 ;CONVERT TO SIXBIT
IDPB T1,T3
RET ,CMDSUB
;HERE WHEN DONE WITH A COMMAND FILE
CMDONE: SKIPE SYM,SYMBEG ;POINTER TO BEGINING OF SYMBOL TABLE
CMDDN1: CAMN SYM,SYMEND ;HIT END YET ?
JRST CMDDN7 ;DONE
LDB T1,[POINT 6,(SYM),5]
CAIN T1,' %'
JRST [MOVE T1,(SYM) ;GET SYMBOL
CALL DELSYM ;FLUSH SYMBOL
JRST CMDONE ] ;GO GET REST
MOVEI SYM,4(SYM) ;POINT TO NEXT SYMBOL
JRST CMDDN1 ;CHECK IT
CMDDN7: SETZM CMDFIL ;DONE WITH FILE NOW
CALL DONE.W ;IN CASE LOGGING COMMANDS
TYPE <
Finished command file
>
RET ,CMDONE
;HERE TO SETUP FOR CALL TO OPNFIL
ESC.D0: TXO FLG,F.WRIT!F.APND ;REMEMBER WE ARE WRITING
HRROI T1,3
GETTAB T1, ;GET NAME OF JOB
MOVE T1,[SIXBIT \DDT11\]
MOVSI T2,'LSD'
MOVE T3,[DMPDSP,,DMPSWL]
MOVEI T4,[RET SKIP,ESC..D]
RET ,ESC.D0
;HERE TO PUT A TITLE LINE ON A DUMP
ESC.D3: MOVEI T1,[BYTE (7)15,12,14,0]
CALL TYPSTR
TYPE <dump made >
CALL TIMTYP ;TYPE TIME
CALL BLANKT
CALL DATETY ;TYPE DATE
TYPE < of />
MOVE T1,[SIXBIT \PORT:\]
SKIPE MEMORY
MOVE T1,[SIXBIT \FILE:\]
SKIPE NODE.N
MOVE T1,[SIXBIT \NODE:\]
CALL SIXTYP
SKIPE MEMORY
JRST [ MOVEI T1,DMPDEV
CALL FILTYP ;TYPE FILE ID
JRST ESC.D4 ]
SKIPN T1,NODE.N
HRRZ T1,PORT
MOVEI T2,OCTYPE
TLNE T1,-1
MOVEI T2,SIXTYP
CALL <(T2)>
ESC.D4: TYPE <
by >
CALL IDTYPE
CALL CRLTYP
CALL CRLTYP
RET ,ESC.D3
ESC..P: TXO FLG,F.WRIT!F.PACK ;REMEMBER WE ARE WRITING
TXZ FLG,F.APND
SETZM F.MCBD
SETZM F.DMCB
MOVE T1,[SIXBIT /KRUFT/] ;DEFAULT FILE NAME
MOVSI T2,'BIN' ;DEFAULT EXTENSION
MOVE T3,[PUNDSP,,PUNSWL]
SETZ T4,
SETZM PROM.F#
CALL OPNFIL ;OPEN FILE
JRST LEVELB
SKIPN FILDEV
JRST [TYPE <?
?$P requires a dump file specification
>
JRST LEVEL0]
SKIPE T1,PROM.F#
JRST PROM
SKIPN F.MCBD ;DUMPING MCB DUMP
SKIPE F.DMCB ;ARE WE DOING A BIG MCB SYSTEM?
JRST MCB
SKIPN DEFOUT ;
JRST ESCPX
MOVE T1,DEFOUT
CAIN T1,1
JRST MCB
CAIN T1,2
JFCL
ESCPX: MOVEI T1,^D18 ;ASSUME HALFWORD WRITES
TXNN FLG,F.PACK ;UNLESS DOING PAPER TAPE
MOVEI T1,^D36 ;IN WHICH CASE DO FULL WORDS
DPB T1,[POINT 6,OHD+1,11]
MOVE DOT,SBEGIN
SETZM CACHEL ;SWEEP THE CACHE
TXO FLG,F.CACH ;CAN USE THE CACHE FROM NOW ON
ESCP00: SETZ T4, ;NUMBER OF BYTES FOR CURRENT SEGMENT
HRRZ T3,DOT ;NEXT ADR TO GET
ESCP02: MOVE T1,T3 ;NEXT ADR TO EXAMINE
IDIVI T1,^D36
PUSH P,T1 ;SAVE RELATIVE PDP10 WORD ADR
MOVN T1,T2
MOVSI T2,400000 ;MAKE BIT FOR WORD
LSH T2,(T1) ; MAKE IT RIGHT BIT
POP P,T1 ;GET RELATIVE WORD ADR AGAIN
TDNN T2,@MEMUSE
JRST ESCP10 ;WORD NOT IN USE
MOVE T1,T3 ;NEXT ADR TO EXAMINE
MOVEI T2,1 ;ONLY WANT ONE BYTE
CALL GETWRD ;TRY TO GET THE WORD
JRST ESCP10
AOS T4 ;ANOTHER WORD TO DUMP
CAML T3,S..END
JRST ESCP10 ;DONE
CAIGE T4,^D256
AOJA T3,ESCP02
ESCP10: JUMPN T4,ESCP11 ;ANY BYTES
AOJA DOT,ESCP20 ;NO SO ADVANCE WHERE TO DUMP FROM
ESCP11: SETZ T5, ;INITIALIZE THE CHECKSUM
MOVEI T1,1
CALL WRTWRD ;WRITE BINARY WORD
MOVE T1,T4 ;COUNT FOR SEGMENT
ADDI T1,6
CALL WRTWRD
HRRZ T1,DOT
CALL WRTWRD
ESCP12: HRRZ T1,DOT
AOS DOT
MOVEI T2,1
CALL GETWRD
EXIT
SOJLE T4,ESCP16
PUSH P,T1 ;SAVE DATA
HRRZ T1,DOT
AOS DOT
MOVEI T2,1
CALL GETWRD
EXIT
DPB T1,[POINT 8,(P),27]
POP P,T1
CALL WRTWRD
SOJG T4,ESCP12
MOVE T1,T5 ;GET CHECKSUM
ANDI T1,377 ;STRIP EXTRA BITS
CALL WRTWRD
JRST ESCP19
ESCP16: SUB T5,T1 ;INCLUDE LAST CHAR IN CHECKSUM
DPB T5,[POINT 8,T1,27]
CALL WRTWRD
ESCP19: SETZ T1, ;ADD PAD BETWEEN SEQMENTS
CALL WRTWRD
CALL WRTWRD
CALL WRTWRD
ESCP20: HRRZ T1,DOT
CAMGE T1,S..END
JRST ESCP00
SETZ T5, ;INITIALIZE THE CHECKSUM
MOVEI T1,1
CALL WRTWRD
MOVEI T1,6
CALL WRTWRD
SKIPN T1,GOTO ;STARTING ADDRESS
MOVEI T1,1
CALL WRTWRD
MOVE T1,T5
ANDI T1,377
CALL WRTWRD
CALL DONE.W ;CLOSE OUTPUT FILE
JRST LEVEL2
WRTWRD: SUB T5,T1
ROT T1,-^D8
SUB T5,T1
ROT T1,^D8
TXNN FLG,F.PACK ;PUNCHING TAPE ?
JRST WRTBN4
SOSGE OHD+2 ;IS THERE ROOM IN BUFFER ?
CALL WRTBN9 ;NO ROOM
ANDI T1,177777 ;STRIP EXTRA BITS
IDPB T1,OHD+1 ;PUT WORD INTO BUFFER
RET ,WRTWRD
WRTBN4: SOSGE OHD+2 ;ROOM FOR LOW ORDER BITS ?
CALL WRTBN9
PUSH P,T1
ANDI T1,377 ;ONLY 8 BITS
IDPB T1,OHD+1
POP P,T1
LDB T1,[POINT 8,T1,27]
SOSGE OHD+2
CALL WRTBN9
IDPB T1,OHD+1
RET ,WRTBN4
WRTBN9: SOS (P)
SOS (P)
OUT
RET ,WRTBN9
JRST FILERR ;COMPLAIN
PUNIMG: TXZA FLG,F.PACK
PUNPAK: TXO FLG,F.PACK
RET SKIP,PUNPAK
PUNBM8: SETO T1,
CAIA
PUNM93: MOVEI T1,1
MOVEM T1,PROM.F#
RET SKIP,PUNBM8
PUNMCB: SETOM F.DMCB ; FLAG DUMPING AN MCB
RET SKIP,PUNMCB
PNMCBD: SETOM F.MCBD ; FLAG DUMPING AN MCB OR DTE DUMP
RET SKIP,PNMCBD
PROM: CALL PROM.2
NOP
CALL PROM.2
LSH T1,-^D4
SKIPG PROM.F ;SKIP IF M9301
JRST DUMP85
CALL PROM.2
LSH T1,-^D8
CALL PROM.2
LSH T1,-^D12
JRST DUMP85
PROM.2: MOVEI T1,377
CALL TYPCHR
MOVE DOT,SBEGIN
MOVEI T4,^D128 ;FOR BM873
SKIPL PROM.F
MOVEI T4,^D256 ;FOR M9301
PROM.4: HRRZ T1,DOT
MOVEI T2,2 ;REQUEST 2 BYTES
CALL GETWRD
SETZ T1,
TRC T1,777001
XCT @(P)
SKIPGE PROM.F#
PUSH P,T1
ANDI T1,17
CALL TYPCHR
SKIPL PROM.F
JRST PROM.6
POP P,T1
LSH T1,-^D8
ANDI T1,17
CALL TYPCHR
PROM.6: ADDI DOT,2
SOJG T4,PROM.4
SKIPGE PROM.F
JRST PROM.9 ;DON'T NEED FOR BM873
HRRO DOT,S..END
MOVEI T4,^D256
PROM.8: HRRZ T1,DOT
MOVEI T2,2
CALL GETWRD
SETZ T1,
TRC T1,777001
XCT @(P)
ANDI T1,17
CALL TYPCHR
ADDI DOT,2
SOJG T4,PROM.8
PROM.9: MOVEI T4,^D256
SETZ T1,
CALL TYPCHR
SOJGE T4,.-1
RET ,PROM
MCB: SETZ T2,
SETSTS .IODMP ; CHANGE MODE TO DUMP MODE
USETO 1 ; START AT BLOCK 1
SKIPE F.MCBD ; DO WE NEED THE HEADERS HERE?
JRST MCB1 ; NO, SO SKIP IT
MOVE T1,[IOWD 400,MCBLAB] ; POINT TO THE MCB LABEL BLOCK FOR NOW
OUT T1 ; PUNCH OUT THE LEADER FOR NOW
CAIA
JRST FILERR ; FILE ERROR, COMPLAIN
MCB1: MOVN T1,MCBLEN ; GET -LENGTH TO WRITE
HRLZ T1,T1 ; AND PUT IT IN THE LEFT HALF OF THE WORD
HRR T1,MEMORY ; GET THE ADDRESS TO START AT
SOS T1 ; BACK UP A SINGLE WORD
SETZ T2, ; THE END OF THE IOWD LIST...
OUT T1 ; WRITE THE BLOCK OUT
CAIA
JRST FILERR ; FILE ERROR, COMPLAIN
CLOSE
RELEASE ; AND CLOSE THE FILE, AS WE ARE DONE...
SETZM OHD ; AND FLAG NO SPECIAL OUTPUT
CALL DONE.1 ; TYPE OUT WHAT WE KNOW...
JRST LEVEL2 ; DONE HERE, TRY AGAIN...
;HERE TO GET A CHARACTER IN LINE MODE
RDCHAR: SKIPE CMDFIL ;ARE WE DOING COMMAND FILE STUFF ?
CALL CMDCHR ;GET A COMMAND FILE CHAR
INCHWL T1 ;GET THE NEXT CHAR
CAIN T1,32 ;IS THIS A CONTROL Z ?
EXIT
CALL GETCH8
JRST RDCHAR
RET ,RDCHAR
;HERE TO GET A CHARACTER FROM THE TTY
GETCHR: TXZ FLG,F.NOUT ;STOP SUPRESSING OUTPUT
SKIPE T1,CMDTKR ;ARE WE RETYPING COMMAND LINE ?
JRST GETCH3 ;YES SO DO IT THAT WAY
SKIPE CMDFIL ;ARE WE DOING COMMAND FILE STUFF ?
CALL CMDCHR ;GET A COMMAND FILE CHAR
INCHRW T1 ;GET THE NEXT CHAR
GETCH1: CALL GETCH8
JRST GETCHR
RET ,GETCHR
GETCH3: CAME T1,CMDLIM ;RETYPED ENOUGH YET ?
JRST GETCH4 ;NOT YET
SETZM CMDTKR ;DONE WITH TAKER
JRST GETCHR
GETCH4: ILDB T1,CMDTKR
JRST GETCH1
GETCH8: JUMPE T1,R ;FLUSH NULLS
TXNN FLG,F.TEXT ;DOING TEXT MODE STUFF ?
CAIE T1,15 ;IS THIS A CARRIAGE RETURN ?
JRST GETCH9
CALL GETCHR ;GET LF
CAIN T1,15 ;WAS THIS A 2ND CR ?
JRST GETCH8 ;YES SO FLUSH IT ALSO
MOVEI T1,15 ;CONVERT LF TO CR
GETCH9: RET SKIP,GETCHR
;HERE BECAUSE FOUND /FILE IN RESPONSE INITIAL DIAGLOGUE
; READ EITHER A BOOT11 OR NETLDR DUMP OR A BINARY FILE
RDDUMP: SKIPN FILDEV ;FILE SPECIFIED?
JRST [TYPE <?
?Dump file specification is required with this switch
>
RET ,RDDUMP]
SETZB T1,T2 ;IN CASE CORE NOT SETUP YET
SKIPG MEMLIM ;ANYTHING PUT IN MEMORY YET ?
CALL PUTFOO ;NO SO MAKE SOME CORE
SETZ AC1, ;HIGHEST LOCATION SO FAR
MOVE T1,[FILDEV,,DMPDEV]
BLT T1,DMPDEV+$FBLEN-1 ;COPY FILDEV, FILNAM, FILEXT, FILPPN, FILTIM
MOVE T1,[SIXBIT /DTED00/] ;IF FILE STARTS WITH DTED, ASSUME BIN
XOR T1,FILNAM
TDNN T1,[XWD -1,770000] ;MASK DOR "DTED"
JRST [ TXNN FLG,F.FLOP ;IF NOT "/BINARY"
TXO FLG,F..FOO ;SAY /DTE FOR HIM
JRST .+1]
TXNE FLG,F..FOO ;IS IT /DTE?
JRST RDTDMP ;YES, READ THE DUMP
HLRZ T1,FILEXT ;GET FILE EXTENSION
CAIE T1,'BIC' ;OTHER WAY TO SPELL BIN
CAIN T1,'BIN' ;DID WE READ A BINARY FILE ?
TXO FLG,F.FLOP ;YES SO READING BINARY FILE
SETZB T5,T4 ;ACCUMULATE CHECKSUM HERE
TXNE FLG,F..FOO ;DID WE GET A /DTELDR
JRST RDTDMP ;YES SO GO READ IT
TXZN FLG,F.FLOP ;READING A BINARY FILE ?
JRST RDUMP0 ;NO READING A DUMP
MOVEI T1,^D36 ;WANT 36BIT HEADERS
CALL SETIHD ;SO SET EM
;HERE TO LOOK FOR INITIAL 1
RDBN10: CALL RDBN70 ;GET NEXT CHAR
JRST RDUMP9 ;ALL DONE
JUMPE T1,RDBN10 ;LOOP ON HEADER
CAIE T1,1 ;IS THIS LEADING 1 ?
JRST RDBNER ;ERROR IN FORMAT
CALL RDBN70 ;GET NEXT WORD = 0
JRST RDBNER ;ERROR IN FORMAT
JUMPN T1,RDBNER
CALL RDBN60 ;GET 16BIT WORD = COUNT
MOVEI T3,-6(T1) ;MAKE BYTE COUNT
CALL RDBN60 ;GET 16BIT WORD = ADR
MOVE T2,T1 ;COPY ADDRESS
TXZ FLG,F.FLIP ;NO DATA MAYBE
JUMPE T3,RDBN30
RDBN20: TXO FLG,F.FLIP ;THIS SEGMENT HAD DATA
CALL RDBN70 ;GET NEXT BYTE TO STUFF
JRST RDBNER
CAMLE T2,AC1
HRRZ AC1,T2 ;NEW HIGHEST LOCATION LOADED
CALL PUTFOO ;PUT BYTE INTO MEMORY
AOS T2 ;ADVANCE LOCATION COUNTER
SOJG T3,RDBN20
RDBN30: CALL RDBN70 ;INCLUDE CHECKSUM IN CALC
JRST RDBNER ; NO DATA, ITS AN ERROR!
TRNE T5,377 ;TEST CHECKSUM
JRST [ TYPE <?
?Checksum error
>
EXIT ]
TXNE FLG,F.FLIP
JRST RDBN10 ;PROBABLY MORE DATA
ANDI T2,177776 ;ONLY 16 BITS & EVEN
MOVEM T2,GOTO ;SAVE STARTING ADDRESS
MOVEM T2,SIMREG+PC ;SET INITIAL PC
RELEASE 1,
SETZM FILDEV
JRST RDUMP9
;HERE TO READ A DTELDR OR MDM DUMP
;THE LENGTH OF THE FILE IS CONTAINED IN THE "FILLEN" WORD.
;DTELDR AND MCBDUMP DUMPS ARE (BY BLIND LUCK) IN THE SAME FORMAT AS DDT11'S
; INTERNAL MEMORY REPRESENTATION.
RDTDMP: MOVE T1,FILLEN
SUBI T1,^D256
SKIPE F.MSYS
MOVEM T1,FILLEN
MOVEM T1,MCBLEN ; IN CASE WE NEED IT LATER
CALL POSYMT ; MAKE SURE THE SYMTAB IS WHER EIT OUGHT
PUSH P,SYMBEG ; SAVE WHAT WILL BE THE START OF MEMUSE
SKIPN FILLEN
JRST [TYPE <?
?Attempted to read zero length file
>
JRST RFILE]
MOVEI T2,1 ;CALCULATE THE
RDTDM1: CAML T2,FILLEN ; POWER OF TWO
JRST RDTDM2 ; GREATER THAN
ASH T2,1 ; OR EQUAL TO
JRST RDTDM1 ; THE FILE LENGTH
RDTDM2: MOVE T1,T2 ;SAVE AS THE MEMORY SIZE
ASH T2,2 ;CALCULATE NUMBER OF BYTES
MOVEM T2,MEMLIM ; AND SAVE THE NUMBER
ADDI T2,43 ;CONVERT TO BITS
IDIVI T2,44 ; (ROUNDED UP)
ADD T1,T2 ;ADD MEMUSE, MEMORY SIZES TOGETHER
PUSH P,T2
CALL MOVSMT ;GET THE ROOM.
POP P,T2 ;GET BACK MEMUSE LENGTH
POP P,T1 ;FIRST FREE LOC BACK
HRLI T1,T1 ;GET THE INCESTUOUS POINTER
MOVEM T1,MEMUSE ; AND SAVE POINTER TO MEMUSE TABLE
ADD T1,T2 ;RELOCATE BY THE SIZE OF MEMUSE
HRRZM T1,MEMORY ; AND SAVE POINTER TO START OF MEMORY
HRRZ T1,MEMUSE ;GET BACK ADDRESS OF USE TABLE
HRL T2,T1 ;MAKE A BLT POINTER TO
HRRI T2,1(T1) ; TO THE USE TABLE
SETOM (T1) ;BLT ALL
MOVE T3,FILLEN ; BUT THE LAST
IDIVI T3,44 ; WORD USED IN
ADD T3,T1 ; THE MEMUSE TABLE
BLT T2,0(T3) ; TO "IN USE"
MOVE T5,T3
MOVE T1,FILLEN
ASH T1,2
MOVE T3,T1
IDIVI T3,44 ;CALCULATE THE
IMULI T3,44 ; THE NUMBER
ADDI T3,44 ; OF BITS IN MEMUSE OVER
SUB T3,T1 ; A MULTIPLE
SETO T2, ; OF 36
ASH T2,0(T3)
MOVEM T2,1(T5) ; AND STORE MASK FOR LAST WORD
MOVN T2,FILLEN ;CALCULATE IN "IOWD" FORM
HRLZ T1,T2 ; THE NUMBER OF WORDS TO GET
HRR T1,MEMORY ; MEMORY
SOS T1 ; FOR A QUICK "IN"
SETZ T2, ;TERMINATE THE COMMAND LIST
SETSTS 1,.IODMP ;SET DUMP MODE IO
USETI 1,1 ; GET BLOCK 1 FIRST...
SKIPE F.MSYS
JRST [ PUSH P,T1 ; SAVE THE POINTER WE WERE TO USE
MOVE T1,[IOWD 400,MCBLAB] ; GET THE MAGIC BUFFER LOADED
IN 1,T1 ; READ THE MCB SYSTEM LABEL BLOCKS
CAIA ; GOOD, WE WON
CALL IFILER ; COMPLAINE ABOUT THE ERROR
POP P,T1 ; RESTORE THE POINTER FOR THE REST OF THE DATA
JRST .+1] ; JOIN THE MAIL LINE CODE...
IN 1,T1 ;READ THE FILE
CAIA ; OK
CALL IFILER ;REPORT THE ERROR
RFILE: RELEAS 1, ;DONE WITH THE FILE
SETZM FILDEV
MOVE AC1,MEMLIM ;PICK UP UP TOP OF MEMORY
MOVEM AC1,DOT ;REMEMBER WHERE WE ARE AS WELL
MOVE AC1,FILLEN ;SET HIGHEST
ASH AC1,2 ; ADDRESS
SUBI AC1,1 ; LOADED
JRST RDUMP9 ;DONE
;HERE TO SET BYTE SIZE FOR INPUT HEADER
; CALL MOVEI T1,<BYTE SIZE>
; CALL SETIHD
SETIHD: LDB T3,[POINT 6,IHD+1,11] ;GET S FIELD FROM INPUT POINTER
DPB T1,[POINT 6,IHD+1,11] ;SET NEW S FIELD
MOVEI T2,^D36
IDIVI T2,(T3) ;FIND NUMBER OF BITS/BYTE CURRENT
MOVEM T1,T3 ;SAVE NEW SIZE
MOVE T1,IHD+2 ;NUMBER OF BYTES IN CURRENT BUFFER
IDIVI T1,(T2) ;MAKE NUMBER OF WORDS IN CURRENT BUFFER
MOVEI T2,^D36
IDIVI T2,(T3) ;GET NUMBER OF BYTES/WORD IN NEW SIZE
IMULI T1,(T2) ;NUMBER OF BYTES OF NEW SIZE
MOVEM T1,IHD+2 ;SAVE IT
RET ,SETIHD
;HERE TO GET SIXTEEN BITS
RDBN60: CALL RDBN70 ;GET LOW ORDER BITS
JRST RDBNER
PUSH P,T2
LSHC T1,-^D8 ;SHOVE EM INTO T2
CALL RDBN70 ;GET HIGH ORDER BITS
JRST RDBNER
ROTC T1,^D8 ;ADD LOW ORDER BITS
POP P,T2
RET ,RDBN60
;HERE TO GET NEXT BYTE FROM BINARY FILE
RDBN70: JUMPE T4,RDBN74 ;HALF OF PREVIOUS WORD LEFT ?
LDB T1,[POINT 8,T4,27] ;LOW ORDER BITS FROM PREV HLF WRD
SETZ T4, ;DONE WITH HALF WORD
JRST RDBN79
RDBN74: SOSGE IHD+2 ;MORE DATA IN BUFFER ?
JRST RDBN80 ;NO SO READ MORE
ILDB T1,IHD+1
TXNN FLG,F.FLOP ;IS THIS PACKED FILE ?
JRST RDBN79 ;NO
HRRO T4,T1 ;COPY HALF WORD
LDB T1,[POINT 8,T4,35] ;GET HIGH ORDER BITS
RDBN79: ANDI T1,377 ;STRIP EXTRA BITS
ADDI T5,(T1) ;INCLUDE IN CHECKSUM
RET SKIP,RDBN70
RDBN80: IN 1, ;GET NEXT BUFFER
JRST RDBN85 ;GOT NEXT BUFFER
GETSTS 1,T1
TXNE T1,IO.IMP!IO.DER!IO.DTE!IO.BKT
CALL IFILER
RELEASE 1,
SETZM FILDEV
RET ,RDBN80
RDBN85: HRRZ T1,IHD ;GET ADDRES OF CURRENT BUFFER
HLRE T1,2(T1) ;GET FIRST WORD IN BUFFER
JUMPE T1,RDBN70 ;PROCEED
TXO FLG,F.FLOP ;IS PACKED FILE
LDB T1,[POINT 6,IHD+1,11] ;GET S FIELD FROM INPUT POINTER
CAIN T1,^D18 ;HALF WORD POINTER
JRST RDBN70 ;YES
MOVEI T1,^D18
DPB T1,[POINT 6,IHD+1,11] ;CHANGE POINTER
MOVE T1,IHD+2 ;GET WORD COUNT
LSH T1,1 ;MULTIPLY BY 2
MOVEM T1,IHD+2
JRST RDBN70
RDBNER: TYPE <?
?Improper format in input tape
>
EXIT
;ROUTINES TO READ BOOT11 OR NETLDR DUMPS
;HERE TO FLUSH REST OF INPUT LINE
RDUMP0: CALL FILCHR ;GET NEXT CHAR FROM DUMP
JRST RDUMP9 ;END OF DUMP
MOVE T2,T1 ;COPY CHAR
RDUMP1: CAIE T2,12 ;WE ARE LOOKING FOR A LINE FEED
CAIN T2,15 ;OR A CARRIAGE RETURN
JRST RDUMP2
CAIE T2,14 ;BUT A FORM FEED WILL DO
JRST RDUMP0 ;AND DIDN'T FIND ONE
RDUMP2: CALL INPOCT ;GET ADR
JRST RDUMP9
CAIE T2,":" ;FINISHED READING ADDRESS ?
JRST RDUMP1 ;FLUSH LINE
HRROM T1,DOT ;SAVE ADDRESS
RDUMP5: CALL INPOCT ;GET DATA FOR LINE
JRST RDUMP9 ;END OF DUMP
CAIN T2,40 ;CHECK FOR SPACE
JRST RDUMP6 ;THAT WAS DATA
CAIE T2,15 ;CHECK FOR CR
CAIN T2,11 ;CHECK FOR HT
JRST RDUMP6 ;THAT WAS DATA
JRST RDUMP1 ;FLUSH LINE
RDUMP6: HRRZ T2,DOT ;GET ADDRESS
CAMLE T2,AC1
HRRZ AC1,T2 ;NEW HIGHEST LOCATION LOADED
CALL PUTFOO
SKIPE PDP8F
AOJA DOT,RDUMP5 ;YES SO BACK FOR MORE DATA
LSH T1,-^D8
AOS T2,DOT
CAMLE T2,AC1
HRRZ AC1,T2 ;NEW HIGHEST LOCATION LOADED
CALL PUTFOO
AOJA DOT,RDUMP5 ;BACK FOR MORE DATA
RDUMP9: MOVE T1,MEMLIM ;HIGHEST ADDRESS READ
MOVEM T1,S..END ;END OF SEARCH
TYPE < highest location is >
MOVE T1,AC1 ;HIGHEST LOCATION LOADED
CALL ADRTYP ;DISPLAY ADDRESS
CALL CRLTYP ;TYPE A CR/LF
MOVEI T1,RSTART
MOVEM T1,.JBREN##
TXO FLG,F.WENB ;SET WRITE ENABLE CAUSE SHOULDN'T HURT
SKIPN MRGFLG ;WANTED TO MERGE ?
JRST LEVL.0 ;NO SO START
RET SKIP,RDUMP0
STBSIZ: BLOCK 1 ; THE SIZE OF THE CURRENT RECORD WE ARE DOING
STBNAM: BLOCK 1 ; THE NAME OF THE ROUTINE WE ARE DOING
STBSYM: BLOCK 1 ; THE SYMBOL WE ARE WORKING ON
STBVAL: BLOCK 1 ; THE VALUE OF THE SYMBOL WE ARE ON
STBTYP: BLOCK 1 ; THE TYPE OF STB RECORD ENTRY WE ARE ON
STBFLG: BLOCK 1 ; THE FLAGS FOR THE STB ENTRY WE ARE ON
RSTATE: BLOCK 1 ; THE STATE OF THE INPUT ROUTINE FOR STBS
SYMDEV: BLOCK 1 ; DEVICE NAME FOR SYMBOL FILE
SYMBLK: BLOCK 1 ; START OF LOOKUP/ENTER BLOCK
SYMDIR: BLOCK 1 ; ADDRESS OF PATH BLOCK
SYMNAM: BLOCK 1 ; FILE NAME
SYMEXT: BLOCK 1 ; FILE EXTENSION
SYMTIM: BLOCK 1 ; TIME/DATE AND PROTECTION
SYMPTH: BLOCK 2 ; FILE PATH
SYMPPN: BLOCK 1 ; FILE PPN
SYMSFD: BLOCK 6 ; AND SUBSEQUENT SFD'S
BLOCK 1 ; SWITCHES
DEFEXT: BLOCK 1 ; DEFAULT EXTENSIONS
FILDEV: SIXBIT \DSK\
FILBLK: BLOCK 1 ; START OF LOOKUP/ENTER BLOCK
FILDIR: BLOCK 1 ; POINTER TO FILE DIRECTORY
FILNAM: BLOCK 1
FILEXT: BLOCK 1
FILTIM: BLOCK 1 ; FILE PROTECTION AND DATES
FILLEN: BLOCK 1 ;LENGTH OF FILE IN -10 WORDS
LKELEN==.-FILBLK-1 ; SIZE OF LOOKUP/ENTER BLOCK
FILPTH: BLOCK 2 ; PATH BLOCK HEADER
FILPPN: BLOCK 1 ; FILE PPN
FILSFD: BLOCK 5 ; AND SUBSEQUENT SFD'S
BLOCK 1 ; TERMINATING 0 WORD
PTHLEN==.-FILPTH ; LENGTH OF PATH BLOCK
FIL.SW: BLOCK 1
$FBLEN==.-FILDEV ; LENGTH OF "FILE BLOCK"
IHD: BLOCK 3 ;HEADER FOR INPUT FILE
IBUFER: BLOCK <203*NUMBUF>
IFLDEV: BLOCK $FBLEN ; INPUT FILE SPEC
OHD: BLOCK 3 ;HEADER FOR OUTPUT FILE
OBUFER: BLOCK 203
OFLDEV: BLOCK $FBLEN ; OUTPUT FILE SPEC
MCBLAB: BLOCK 400 ; SPACE FOR THE 2 LABEL BLOCKS ON AN MCB SYSTEM
MCBLEN: BLOCK 1 ; KEEP THE LENGTH OF A MCB IMAGE HERE,
; EXCLUSIVE OF THE LABEL BLOCKS
DMPDEV: EXP 0 ;DEVICE FOR DUMP FILE
EXP 0 ; LENGTH OF LOOKUP/ENTER BLOCK
DMPDIR: EXP 0 ; ADDRESS OF PATH BLOCK
EXP 0 ; FILE NAME
EXP 0 ; FILE EXTENSION
DMPTIM: BLOCK 1 ; TIME/DATE AND PROTECTION
DMPPTH: BLOCK 2+5+1 ; FILE DIRECTORY
BLOCK 1 ; SWITCHES WORD
BLOCK $FBLEN-<.-DMPDEV>
DUMPA: BLOCK 1 ;LAST ADDRESS TYPED OUT
USETIT: Z ;BLOCK NUMBER TO START READING FOR SYMBOLS
RELOFF: Z ;RELOCATION OFFSET IF READING AN FE- DUMP
MYPPN: BLOCK 1 ; PPN OF USER
CSECHO: Z ;IF NONZERO SUPPRESS ECHOING COMMAND CHARACTERS
; LH SET -1 IF SEARCHING FOR A TAG
; RH SET -1 IF ENCOUNTER XOF, CLEARED WITH XON
CMDFIL: Z
CMDCNT: Z ;COUNT OF CURRENT COMMAND CHARACTER
CMDDSP:
CMDSWL: Z
Z
CMDFAK: Z ;POINTER TO FOLLOWING WORD
Z
DEFINE NAMES <
X BM873,PUNBM8
X DTE,PNMCBD
X IMAGE,PUNIMG
X M9301,PUNM93
X MCBSYS,PUNMCB
X MCBDMP,PNMCBD
X PACKED,PUNPAK
>
DEFINE X (Q,QQ) < EXP QQ >
PUNDSP: NAMES
DEFINE X (Q,QQ) < SIXBIT \Q\ >
PUNSWL: NAMES
EXP 0
DEFINE NAMES <
X DISASS,SETFOO ;/DISASSEMBLY
>
DEFINE X (A,B) < 0,,B >
DMPDSP: NAMES
DEFINE X (A,B) < SIXBIT \A\ >
DMPSWL: NAMES
EXP 0
;TRANSLATION TABLE FROM EBCDIC TO ASCII
EB.TRN:
BYTE (8) 0, 1, 2, 3, 0, 11, 0,177, 0, 0, 0, 13, 14, 15, 0, 0 ;017
BYTE (8) 0, 21, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ;037
BYTE (8) 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ;057
BYTE (8) 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ;077
BYTE (8) 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 74, 50, 53,136 ;117
BYTE (8) 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 41, 44, 52, 51, 73,155 ;137
BYTE (8) 55, 57, 0, 0, 0, 0, 0, 0, 0, 0,174, 54, 45,137, 76, 77 ;157
BYTE (8) 0, 0, 0, 0, 0, 0, 0, 0, 0,140, 72, 43,100, 47, 75, 42 ;177
BYTE (8) 75,141,142,143,144,145,146,147,150,151, 0, 0, 0, 0, 0, 0 ;217
BYTE (8) 0,152,153,154,155,156,157,160,161,162, 0, 0, 0, 0, 0, 0 ;237
BYTE (8)100,176,163,164,165,166,167,170,171,172,134,116,153,133,113,141 ;257
BYTE (8) 60, 61, 62, 63, 64, 65, 66, 67, 70, 71,172,136,114,135,156,157 ;277
BYTE (8)173,101,102,103,104,105,106,107,110,111, 0, 0, 0, 0, 0, 0 ;317
BYTE (8)175,112,113,114,115,116,117,120,121,122, 0, 0, 0, 0, 0, 0 ;337
BYTE (8)134, 0,123,124,125,126,127,130,131,132, 0, 0, 0, 0, 0, 0 ;357
BYTE (8) 60, 61, 62, 63, 64, 65, 66, 67, 70, 71,174, 0, 0, 0, 0, 0 ;377
; TRANSLATION TABLE OF RADIX 50 AND ASCII
R50TAB:
BYTE (18)" "," ","0","A","1","B","2","C","3","D","4","E","5","F","6","G"
BYTE (18)"7","H","8","I","9","J","A","K","B","L","C","M","D","N","E","O"
BYTE (18)"F","P","G","Q","H","R","I","S","J","T","K","U","L","V","M","W"
BYTE (18)"N","X","O","Y","P","Z","Q","$","R",".","S","_","T","0","U","1"
BYTE (18)"V","2","W","3","X","4","Y","5","Z","6",".","7","$","8","%","9"
END