mirror of
https://github.com/PDP-10/stacken.git
synced 2026-05-03 06:49:14 +00:00
2875 lines
72 KiB
Plaintext
2875 lines
72 KiB
Plaintext
;THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USED
|
|
; OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.
|
|
;
|
|
; COPYRIGHT (c) DIGITAL EQUIPMENT CORPORATION 1984,1987.
|
|
;ALL RIGHTS RESERVED.
|
|
|
|
|
|
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
|