Trailing-Edge
-
PDP-10 Archives
-
bb-k345a-sb
-
dmpfil.mac
There are 6 other files named dmpfil.mac in the archive. Click here to see a list.
TITLE DMPFIL - A PROGRAM FOR DUMPING FILES - V 006A(7)
SUBTTL DON BLACK/PFC/DBK 5-OCT-70
;COPYRIGHT (C) 1970,1978,1979 BY
;DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.
;
;
;THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED AND COPIED
;ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE AND WITH THE
;INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE OR ANY OTHER
;COPIES THEREOF MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE TO ANY
;OTHER PERSON. NO TITLE TO AND OWNERSHIP OF THE SOFTWARE IS HEREBY
;TRANSFERRED.
;
;THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT NOTICE
;AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT
;CORPORATION.
;
;DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ITS
;SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DIGITAL.
VDMPFL==6 ;MAJOR VERSION NUMBER
VEDIT==7 ;EDIT NUMBER
VMINOR==1 ;MINOR VERSION NUMBER
VWHO==0 ;WHO LAST EDITED
; . . . EDIT HISTORY . . .
; VERSION 6:
;
; EDITS 2 THROUGH 6 ARE IN VERSION 6B(7). VERSION 6A(7) CONTAINS
; ONLY EDIT # 7, A DATE75 BUG FIX.
;
; EDIT # 7 - DATE75 FIX. INSURES DEFAULT CREATION DATE IS USED
; FOR OUTPUT FILE. AREA AFFECTED: DUMP
LOC 137
BYTE (3)VWHO(9)VDMPFL(6)VMINOR(18)VEDIT
RELOC
;ACCUMULATOR ASSIGNMENTS
F=0 ;FLAGS
CH=1 ;CHARACTER FOR I/O TRANSFERS
A=2 ;CH+1
T=3 ;TEMPORARY ACCUMULATORS
T1=4
T2=5
T3=6
T4=7
CNT=10 ;COUNTER
P=11 ;PUSHDOWN LIST POINTER
;FLAG BITS IN LEFT HALF OF F
CDET==1 ;COLON DETECTED IN COMMAND SWITCH
PDET==2 ;PERIOD DETECTED IN COMMAND SWITCH
DSW==4 ;D SWITCH SPECIFIED - DEC TAPE DUMP
KSW==10 ;K SWITCH SPECIFIED - CORE DUMP
HSW==20 ;H SWITCH SPECIFIED - HIGH SEG CORE DUMP
SSW==40 ;S SWITCH SPECIFIED - SUPER USETI DISK DUMP
DEVERR==40000 ;DEVICE ERROR MESSAGE OUTPUT
SAMELN==100000 ;SET IF NEW LINE IN CORE DUMP DIFFERENT FROM PREVIOUS
ASTOUT==200000 ;SET IF ASTERISKS ALREADY PRINTED FOR CURRENT OUTPUT SUPPRESSED
DSKFRM==400000 ;SET IF SAVE FILE IS IN OLD DISK FORM (3 SERIES MON)
;ASCII CODES
LEFARR==137 ;ASCII FOR LEFT ARROW
CR==15 ; CARRIAGE RETURN
LF==12 ; LINE FEED
SP==40 ; SPACE
SLASH==57 ; SLASH
PERIOD==56 ; PERIOD
COLON==72 ; COLON
FORM==14 ; FORM FEED
RGTBRK==135 ; RIGHT BRACKET
ALT==33 ; ALT-MODE
ALT175==175 ; ALT-MODE
ALT176==176 ; ALT-MODE
VTAB==13 ; VERT. TAB
EQUAL=="=" ; EQUAL SIGN
;CONSTANTS
EOFBIT==20000 ;EOF BIT IN STATUS
DTA==100 ;DECTAPE BIT IN DEVICE CHARACTERISTICS
DTAL==200 ;LENGTH OF A DECTAPE BLOCK
DIBLOK==^D100 ;BLOCK NUMBER OF DECTAPE DIRECTORY
PAGELN==^D60 ;NUMBER OF LINES PER PRINTED PAGE
ERRBIT==740000 ;ERROR BITS IN STATUS WORD
DUMP: RESET
EXTERN .JBREN
MOVE T,[JRST P5B]
MOVEM T,.JBREN ;SET UP FOR REENTER COMMAND
MOVE P,PDLPT ;SET UP PUSH-DOWN LIST POINTER
OPEN 0,TTYQ ;OPEN TTY
HALT . ;SHOULD NEVER HAPPEN
PUSHJ P,CRLF ;OUTPUT CR,LF TO TTY
MOVEI CH,"*"
PUSHJ P,TTYOUT ;OUTPUT *
OUTPUT 0, ;MAKE SURE IT GETS DONE
HRLI F,0 ;CLEAR ALL FLAGS TO START
MOVEI T,10
MOVEM T,ST1 ;SET INPUT MODE TO 10 TO START
PUSHJ P,SCAN ;GET INPUT AND OUTPUT UNITS FROM TTY
OPEN 2,ST2 ;OPEN OUTPUT UNIT
JRST P6 ;CANT OPEN IT
; [EDIT #7] ADD TWO INSTRUCTIONS - INSURE DEFAULT DATE IS USED
HLLZS E2 ;CLEAR HIGH-ORDER CREATION DATE
SETZM E2+1 ;CLEAR LOW-ORDER BITS OF CREATION DATE
ENTER 2,F2 ;SET UP PROPER FILE
JRST P6A
OPEN 1,ST1 ;OPEN INPUT UNIT
JRST P5 ;CANT OPEN IT
TLNE F,DSW+SSW ;TEST IF DEC TAPE DUMP OR SUPER USETI DUMP
JRST DUMP2 ;DONT BOTHER WITH LOOKUP IF SO
LOOKUP 1,F1 ;LOCATE PROPER FILE
JRST P5A
DUMP2: DATE T, ;DATE TO T
IDIVI T,^D31 ;SETS UP DATE AND TIME IN HEADER MESSAGE
ADDI T1,1
IDIVI T1,^D10
ADDI T1,60
ROT T1,7
ADDI T2,60
ADD T1,T2
DPB T1,[POINT 14,DATE,34] ;DAY
IDIVI T,^D12
ADDI T1,1
IDIVI T1,^D10
ADDI T1,60
ROT T1,7
ADDI T2,60
ADD T1,T2
DPB T1,[POINT 14,DATE,13] ;MONTH
ADDI T,^D64
IDIVI T,^D10
ADDI T,60
ROT T,7
ADDI T1,60
ADD T,T1
DPB T,[POINT 14,DATE+1,20] ;YEAR
TIMER T, ;TIME OF DAY TO T
IDIVI T,^D216000
IDIVI T1,^D3600
IDIVI T1,^D10
ADDI T1,60
ROT T1,7
ADDI T2,60
ADD T1,T2
DPB T1,[POINT 14,TIME,34] ;MINUTES
IDIVI T,^D10
ADDI T,60
ROT T,7
ADDI T1,60
ADD T,T1
DPB T,[POINT 14,TIME,13] ;HOURS
MOVEI CNT,PAGELN-3 ;SET LINE COUNT
MOVEI T,^D76
MOVE T1,[POINT 7,CW8]
ILDB CH,T1
PUSHJ P,OUTPUT ;OUTPUT HEADER MESSAGE
SOJG T,.-2
SETZM MAX
TLNE F,DSW
JRST DECDMP ;JUMP IF DECTAPE DUMP
TLNE F,SSW
JRST SUPDMP ;SUPER USETI DISK DUMP
TLNE F,KSW+HSW
JRST CORDMP ;JUMP IF CORE DUMP
MOVE T,D1 ;GET INPUT DEVICE
DEVCHR T, ;GET ITS CHARACTERISTICS
MOVE T1,BLKNUM ;GET STARTING BLOCK NUMBER
TLNE T,(2B2) ;SEE IF DISK
USETI 1,(T1) ;YES--POSITION TO START (/NF)
PUSHJ P,PR0 ;OUTPUT ONE BLOCK TO OUTPUT UNIT
JRST .-1 ;GOES TO ENDF AT END OF FILE
PR0: MOVE CH,MAX ;TOTAL NUMBER OF BYTES IN THIS BLOCK
MOVEM CH,MAX ;SAVE MAXIMUM NUMBER OF BYTES IN BUFFER
ADDI CH,7 ;EJECT PAGE FIRST
LSH CH,-3 ;8 WORDS PER LINE
ADDI CH,2 ;PLUS 2 BLANK LINES
SUB CH,CNT ;SEE IF WE MAKE IT
JUMPL CH,PR1 ;JUMP IF YES
JUMPE CH,PR5 ;JUMP IF JUST FITS (NO PAGE EJECT)
MOVEI CH,FORM ;FORM FEED
PUSHJ P,OUTPUT ;OUTPUT IT
PR5: MOVEI CNT,PAGELN ;EJECT PAGE AND RESET LINE COUNT
PR1: MOVEI T1,8 ;8 WORDS PER LINE
PR2: PUSHJ P,SPACES ;3 SPACES
MOVEI T,^D12 ;12 CHARACTERS PER WORD
PUSHJ P,INPUT ;GET NEXT INPUT WORD IN CH
MOVE A,CH ;MOVE IT TO A
PR3: MOVEI CH,0
ROTC CH,3 ;ROTATE TOP 3 BITS OF A TO CH
ADDI CH,60 ;CONVERT TO ASCII
PUSHJ P,OUTPUT ;OUTPUT THIS CHAR
SOJG T,PR3 ;LOOP FOR THE WORD
MOVE T,IBUF+2
CAIN T,1 ;SKIP UNLESS THAT WAS LAST WORD OF BUFFER
JRST PR4
SOJG T1,PR2 ;LOOP FOR THE LINE
PUSHJ P,OCRLF ;WE MUST INSERT CR,LF
SOJA CNT,PR1 ;ALWAYS KEEP TRACK OF THE LINE COUNT
PR4: AOS T,BLKNUM ;INCREMENT THE BLOCK NUMBER
CAMLE T,TERMBK ;COMPARE WITH END
JRST ENDF ;YES--EXIT
PUSHJ P,OCRLF ;FINISH LINE IF SO, THEN OUTPUT BLANK LINE
PUSHJ P,OCRLF
SUBI CNT,3 ;ACCOUNT FOR 3 LINES
OCRLF: MOVEI CH,CR
PUSHJ P,OUTPUT ;OUTPUT CR
MOVEI CH,LF
JRST OUTPUT ;OUTPUT LF AND RETURN WITH POPJ
OOCT: IDIVI T,10 ;PRINT OCTAL NUMBER IN T
HRLM T1,(P)
SKIPE T
PUSHJ P,OOCT
HLRZ CH,(P)
ADDI CH,"0"
JRST OUTPUT ;IT POPJ'S
P5: MOVEI T,ER1 ;COMPLAIN ABOUT INPUT DEVICE
JRST ERROR
P5A: MOVEI T,ER1A ;COMPLAIN ABOUT INPUT FILE
JRST ERROR
P6: MOVEI T,ER2 ;COMPLAIN ABOUT OUTPUT DEVICE
JRST ERROR
P6A: MOVEI T,ER2A ;COMPLAIN ABOUT OUTPUT FILE
ERROR: PUSHJ P,TMES ;ISSUE ERROR MESSAGE
JRST DUMP ;GO BACK AND START ALL OVER
ENDF: TLNE F,KSW
JRST ENDF1 ;JUMP IF DOING CORE DUMP
ENDF2: MOVEI CH,14
PUSHJ P,OUTPUT ;OUTPUT FORM FEED FOR PAGE EJECT
P5B: RELEASE 1,
RELEASE 2,
JRST DUMP
ENDF1: SUBI T3,8 ;MUST OUTPUT PARTIAL LINE IN LINBUF
JUMPE T3,ENDF2 ;JUMP IF EMPTY LINE
IMULI T3,^D14 ;ELSE MULTIPLY BY 14 CHARS PER WORD
SUBI T3,8 ;TAKE INTO ACCOUNT ADDRESS (RESULT IS NEGATIVE WD CNT)
MOVE T,[POINT 7,LINBUF]
ILDB CH,T
PUSHJ P,OUTPUT ;OUTPUT THE CHARS
AOJL T3,.-2
PUSHJ P,OCRLF
PUSHJ P,OCRLF
MOVSI A,(JRST)
HRR A,T1
CAME A,T1
JRST ENDF2
HRLZ A,T1 ;T1 CONTAINS JRST SA
MOVEI T,CW1
PUSHJ P,MES ;OUTPUT MESSAGE NOTING SA
MOVEI T,6
EN1: MOVEI CH,0 ;OUTPUT LINE OF (T) CHARS FROM A
ROTC CH,3
ADDI CH,60
PUSHJ P,OUTPUT
SOJG T,EN1
PUSHJ P,OCRLF ;FOLLOWED BY CARRIAGE RETURN,LINE FEED
JRST ENDF2
SUPDMP: SETSTS 1,17 ;SET DUMP MODE FOR INPUT
SKIPN TERMBK
HLLOS TERMBK
MOVE T3,BLKNUM
USETI 1,T3
STATZ 1,ERRBIT ;SEE IF WE ARE SUCCESSFUL
JRST SUPERR ;NO--TELL USER
SUPD1: PUSHJ P,BLKOUT
CAMGE T3,TERMBK
STATZ 1,EOFBIT
JRST ENDF
AOJA T3,SUPD1
SUPERR: MOVEI T,SUPERM ;COMPLAIN ABOUT USETI FAILURE
JRST ERROR
DECDMP: USETI 1,DIBLOK ;NEXT BLOCK READ WILL BE DIRECTORY
SUBI CNT,3 ;KEEP UP WITH LINES PRINTED ON THIS PAGE
MOVEI T,CW5
PUSHJ P,MES ;OUTPUT DIRECTORY HEADER
MOVEI T,^D17
PUSHJ P,SPACES
SOJG T,.-1
MOVEI T,CW5A
PUSHJ P,MES
MOVEI T,6
PUSHJ P,SPACES
SOJG T,.-1
MOVEI T,CW5B
PUSHJ P,MES
MOVSI CNT,-27
LINE1: PUSHJ P,SPACE
PUSHJ P,SPACE
MOVEI CH,1(CNT)
PUSHJ P,TWOCHR ;OUTPUT LINE OF BLOCK NUMBERS
AOBJN CNT,LINE1
MOVEI CH,RGTBRK
PUSHJ P,OUTPUT
PUSHJ P,OCRLF
PUSHJ P,OCRLF
INPUT 1,COMLST ;READ THE DIRECTORY
PUSHJ P,CHKIN ;CHECK FOR INPUT ERRORS
MOVE T3,[POINT 5,DATAB]
MOVEI CNT,1 ;CNT IS CURRENT FILE NUMBER (1-26)
LINE: PUSHJ P,SPACE ;OUTPUT ONE SPACE
MOVE CH,CNT
PUSHJ P,TWOCHR ;OUTPUT FILE NUMBER
PUSHJ P,SPACE2 ;AND 2 SPACES
MOVE A,DATAB+^D82(CNT) ;THIS FILE NAME
MOVEI T2,6
PUSHJ P,SIXOUT ;OUTPUT FILE NAME
PUSHJ P,SPACE ;OUTPUT A SPACE
MOVE A,DATAB+^D82+^D22(CNT) ;THIS EXT
MOVEI T2,3
PUSHJ P,SIXOUT
PUSHJ P,SPACE ;OUTPUT A SPACE
MOVEI T2,30
PUSHJ P,BLKBYT ;OUTPUT FILE INDEX FOR NEXT 30 BLOCKS OT THE TAPE
CAIG CNT,25
AOJA CNT,LINE ;LOOP FOR 26 LINES (26 FILES)
MOVEI T2,30
AOJ CNT,
PUSHJ P,LINE2 ;NOW FINISH THE INDECES FOR BLOCKS NOT YET PRINTED
MOVEI T2,30
AOJ CNT,
PUSHJ P,LINE2 ;SECOND LINE
MOVEI T2,2
AOJ CNT,
PUSHJ P,LINE2 ;PLUS ONE LEFT OVER
PUSHJ P,OCRLF
PUSHJ P,OCRLF
PUSHJ P,P7A+1 ;OUTPUT DIRECTORY
SKIPE T3,TERMBK
CAILE T3,^D577
MOVEI T3,^D577
MOVEM T3,TERMBK
SKIPN T3,BLKNUM ;MOVE FIRST BLOCK NUMBER TO T3
SETSTS 1,110 ;FOR BLOCK 0
USETI 1,(T3) ;GET NEXT BLOCK
DECD1: PUSHJ P,BLKOUT ;OUTPUT THIS BLOCK
CAMGE T3,TERMBK ;TEST IF LAST BLOCK
AOJA T3,DECD1 ;NO, GO BACK FOR MORE
JRST ENDF
BLKOUT: CAIL CNT,^D20 ;SKIP UNLESS FITS ON THIS PAGE
JRST DECD2 ;EVERYTHING OK
JUMPE CNT,DECD1A ;IF CNT IS 0, A PAGE EJECT IS COMING ANYWAY
MOVEI CH,FORM ;FORM FEED
PUSHJ P,OUTPUT ;PAGE EJECT
DECD1A: MOVEI CNT,PAGELN ;RESET LINE COUNT
DECD2: MOVE T2,BLANKS
SUBI CNT,3
MOVEI T,CW6
PUSHJ P,MES ;OUTPUT BLOCK HEADER
MOVE T,T3
PUSHJ P,OOCT ;OUTPUT BLOCK NUMBER
PUSHJ P,OCRLF
TLNN F,DSW ;SEE IF DECTAPE DUMP
JRST P7A ;N0--ALL BLOCKS THE SAME
JUMPN T3,P7A ;JUMP IF NOT BLOCK 0 THAT WE JUST DID
INPUT 1, ;INPUT THE BLOCK
PUSHJ P,CHKIN ;CHECK FOR INPUT ERRORS
MOVEI T,DTAL ;THIS BLOCK IS 1 WORD SHORT
MOVEM T,IBUF+2 ;SET CORRECT BLOCK SIZE
PUSHJ P,PR1 ;OUTPUT IT
SETSTS 1,116 ;IF SO SET NON-STANDARD, DUMP MODE
POPJ P,
P7A: INPUT 1,COMLST
PUSHJ P,CHKIN ;CHECK FOR INPUT ERRORS
MOVE T,[POINT 36,DATAB]
MOVEM T,IBUF+1
MOVEI T,DTAL+1
MOVEM T,IBUF+2 ;SET UP BUFFER HEADER TO LOOK LIKE ORDINARY BLOCK
JRST PR1 ;ROUTINE OUTPUTS THE BLOCK AND EXITS WITH POPJ
LINE2: MOVEI T,5
PUSHJ P,SPACES
SOJG T,.-1
PUSHJ P,SPACE ;SPACES IN FIRST PART OF LINE,
JRST BLKBYT ;THEN INTO BLKBYT FOR FILE INDECES
TWOCHR: IDIVI CH,10
SKIPE CH ;SKIP IF UPPER CHAR IS 0
ADDI CH,20 ;IF SO LEAVE BLANK
ADDI CH,40 ;CONVERT TO ASCII
PUSHJ P,OUTPUT
MOVEI CH,60(A) ;SECOND CHAR
JRST OUTPUT ;OUTPUT IT AND RETURN
BLKBYT: MOVEI T,CW2
PUSHJ P,MES ;OUTPUT LEFT BRACKET
MOVEI CH,-1(CNT) ;OUTPUT FOUR CHARACTER OCTAL VALUE
IMULI CH,30 ;CH=TOTAL NUMBER OF BLOCKS PRINTED SO FAR
JUMPE CH,BLK5 ;IF 0, SPECIAL CASE
MOVEI T,4
IDIVI CH,10
PUSH P,A ;PUSH DIGITS ONTO STACK
SOJG T,.-2
MOVEI T,4
BLK3: POP P,CH ;POP THEM BACK
JUMPN CH,BLK2
PUSHJ P,SPACE ;SPACES FOR LEADING ZEROS
SOJG T,BLK3 ;SINCE NON-ZERO WILL ALWAYS EXIT
BLK4: POP P,CH
BLK2: ADDI CH,60 ;MAKE ASCII NUMBER
PUSHJ P,OUTPUT
SOJG T,BLK4
MOVEI CH,RGTBRK ;RIGHT BRACKET
PUSHJ P,OUTPUT
BLK1: PUSHJ P,SPACE ;NOW OUTPUT FILE INDECES FOR NEXT (T2) BLOCKS
PUSHJ P,SPACE
ILDB CH,T3 ;T3 CONTAINS BYTE POINTER FOR CURRENT INDEX
BLK6: PUSHJ P,TWOCHR ;OUTPUT IT
SOJG T2,BLK1
JRST OCRLF
BLK5: PUSHJ P,SPACES ;OUTPUT 3 LEADING SPACES
MOVEI T,CW3 ;AND ONE ZERO
PUSHJ P,MES
MOVEI CH,37
JRST BLK6
SIXOUT: MOVEI CH,0 ;OUTPUT (T2) SIXBIT CHARACTERS FROM TOP OF A
ROTC CH,6
ADDI CH,40
PUSHJ P,OUTPUT
SOJG T2,SIXOUT
POPJ P,
CORDMP: SKIPN TERMBK
HLLOS TERMBK
SETZM LSTOUT
MOVE T,[XWD LSTOUT,LSTOUT+1]
BLT T,LSTOUT+7 ;ZERO OUT REPEATED LINE TEST BUFFER
PUSHJ P,INPUT
MOVE T1,CH ;T1=FIRST CONTROL WORD
TLZ F,SAMELN+ASTOUT+DSKFRM ;CLEAR SAME LINE AND ASTERISKS PRINTED
;AND DSK FORM SAVE FILE FLAGS
TLNE F,HSW ;IF FIRST CONTROL WORD IS POSITIVE,
JRST HGHDMP ;OR HIGH SEG DUMP, WE HAVE SPECIAL DISK FORM
JUMPGE CH,COR1
HRRZ T,CH ;START WITH T=CURRENT ADDRESS-1
SKIPE T2,BLKNUM
PUSHJ P,CSETUP
W1: PUSHJ P,WST ;SET UP NEXT ADDRESS IN OUTPUT BUFFER
W2: PUSHJ P,NXTWD ;GET NEXT WORD OF CORE
CAMLE T,TERMBK
JRST ENDF1
CAME CH,LSTOUT-1(T3)
TLO F,SAMELN ;SET FLAG IF THIS LINE NOT SAME AS LAST LINE OUTPUT
MOVEM CH,LSTOUT-1(T3) ;IN ANY CASE SAVE THIS LINE
MOVEI CNT,^D12
PUSHJ P,OCTOUT ;MOVE THIS WORD TO LINE BUFFER
SOJG T3,W2
TLZN F,SAMELN
JRST AST ;IF SAME AS LAST LINE PRINTED, DONT REPEAT
TLZ F,ASTOUT ;NEW LINE, PRINT IT, CLEAR ASTERISKS PRINTED FLAG
W3: MOVE T3,[POINT 7,LINBUF]
MOVEI CNT,^D120
ILDB CH,T3
PUSHJ P,OUTPUT ;OUTPUT LINE BUFFER
SOJG CNT,.-2 ;LOOP FOR 120 COLUMNS
PUSHJ P,OCRLF ;FOLLOWED BY CR,LF
JRST W1 ;NEXT LINE
AST: TLOE F,ASTOUT ;IF ALREADY HAVE PRINTED ASTERISKS,
JRST W1 ;FORGET THE WHOLE THING
MOVE CH,[ASCII / */] ;ELSE MOVE ASTERISKS TO LINE BUFFER
MOVEI CNT,^D24
MOVEM CH,LINBUF-1(CNT)
SOJG CNT,.-1
JRST W3 ;THEN BOUNCE OFF TO PRINT THEM
COR1: MOVEI T,73 ;FIRST LOCATION OF DUMP IS 74
TLZ F,KSW ;DENY OUR HERITAGE TO SUPRESS SA= MESS AT END
COR2: TLO F,DSKFRM ;SET DISK FORM BIT
SKIPE T2,BLKNUM
PUSHJ P,CSETUP
PUSHJ P,WST ;MOVE FIRST ADDRESS TO OUTPUT BUFFER
MOVE CH,T1 ;RESTORE FIRST WORD
AOJA T,W2+1 ;OFFSET FOR MISSING CALL TO NEXTWD, TO MAINSTREAM
CSETUP: CAIG T2,1(T)
POPJ P,
PUSHJ P,NXTWD
JRST CSETUP
WST: MOVE T2,[POINT 7,LINBUF]
HRLZI CH,1(T) ;CH=CURRENT ADDRESS
MOVEI CNT,6
PUSHJ P,OCTOUT ;MOVE IT TO LINE BUFFER AS ASCII OCTAL DIGITS
MOVEI T3,8
POPJ P,
HGHDMP: MOVEI T,377777 ;FIRST WORD OF HIGH SEG DUMP IS 400000
JRST COR2
NXTWD: AOJ T, ;T=ADDRESS OF WORD RETURNED
TLNE F,DSKFRM ;SKIP UNLESS SPECIAL DISK FORM, IN WHICH
JRST INPUT ;CASE WE ONLY NEED RETURN NEXT INPUT WORD
N2: MOVEI CH,0
CAIG T,(T1)
JRST N3 ;RETURN 0 IF BETWEEN SEGMENTS
JUMPL T1,N1 ;KEEP GOING IF STILL IN THIS SEGMENT
PUSHJ P,INPUT ;GET NEXT CONTROL WORD IF END OF SEGMENT
MOVE T1,CH ;SAVE IT IN T1 AND PLUNGE ON
XOR CH,[JRST 0] ;IF CONTROL WORD IS JRST, END OF FILE
TLNE CH,777777
JRST N2 ;NO, KEEP GOING
JRST ENDF1 ;IT IS JRST SA
N1: AOBJN T1,INPUT ;BUMP CONTROL WORD, GET NEXT WORD,
JRST INPUT ;AND RETURN VIA POPJ IN INPUT
OCTOUT: PUSHJ P,XSPACE ;MOVE 2 SPACES TO LINBUF
MOVE A,CH ;SAVE WORD IN A WHICH MUST BE CH+1
O1: MOVEI CH,0
ROTC CH,3
ADDI CH,60 ;NEXT OCTAL DIGIT IN CH
IDPB CH,T2
SOJG CNT,O1 ;LOOP FOR (CNT) CHARS
POPJ P,
XSPACE: PUSHJ P,.+1 ;PUSHJ TO PUT IN 1 SPACE, THEN POPJ
MOVEI A,SP ;TO DO IT AGAIN, THEN RETURN VIA THE POPJ
IDPB A,T2
N3: POPJ P,
SCAN: SETZM F3
MOVE T2,[XWD F3,E3]
S0: BLT T2,TERMBK ;CLEAR ANY PREVIOUS GARBAGE
MOVEI T2,1 ;PRESET START TO 1
MOVEM T2,BLKNUM ; IN CASE NO /F
HRLOI T2,377777 ;PRESET END TO LARGEST NUMBER
MOVEM T2,TERMBK ; IN CASE NO /T
SETZM D3 ;CLEAR DEVICE NAME
TLZ F,CDET+PDET
MOVE A,[POINT 7,AS1]
S1: MOVEI CNT,6
S1A: MOVE T2,[POINT 6,T3]
SETZ T3,
S2: PUSHJ P,INCHR ;GET NEXT CHARACTER FROM USER
JUMPE CH,S2 ;IGNORE NULL CHARS
CAIE CH,EQUAL ;DO NOT STORE IF EQUAL SIGN
CAIN CH,LEFARR ;DO NOT STORE IF LEFT ARROW
JRST .+3
CAIL CH,40 ;DO NOT STORE IF CONTROL CHARACTER
PUSHJ P,CHRSTR ;OTHERWISE STORE IN HEADER MESSAGE
MOVE T4,[XWD -DISPLN,DISPTB]
SLIST: HLRZ T,(T4) ;SEARCH TABLE FOR CHAR IN CH AND DISPATCH
CAME T,CH
AOBJN T4,SLIST ;ENTER T4= XWD -LENGTH OF TABLE, FWA OF TABLE
MOVE T4,(T4)
JRST (T4) ;DO IT
DISPTB: XWD COLON,COL
XWD PERIOD,PER
XWD SLASH,SLSH
XWD LEFARR,FIN2
XWD EQUAL,FIN2
XWD CR,FIN1
XWD ALT,FIN1
XWD ALT175,FIN1
XWD ALT176,FIN1
XWD FORM,FIN1
XWD LF,FIN1
XWD VTAB,FIN1
DISPLN=.-DISPTB
JRST CHAR ;ANYTHING ELSE
SWCHTB: XWD "D",DSWCH
XWD "F",SWCHX ;/NF SETS START OF FILE DUMP (DISK ONLY)
XWD "K",KSWCH
XWD "H",HSWCH
XWD "S",SSWCH
XWD "T",TSWCH
SWCHLN=.-SWCHTB
JRST SYNTAX
CHAR: CAIL CH,"0" ;CHECK FOR ALPHANUMERIC
CAILE CH,"Z"
JRST SYNTAX ;NO
CAIGE CH,"A"
CAIG CH,"9"
JRST .+2
JRST SYNTAX ;NO
SOJL CNT,SYNTAX
SUBI CH,40
IDPB CH,T2
JRST S2
COL: TLNN F,PDET
TLOE F,CDET
JRST SYNTAX
MOVEM T3,D3
JRST S1
PER: TLOE F,PDET
JRST SYNTAX
MOVEI CNT,3
JUMPE T3,S1A ;IF FILE NAME = 0, DO NOT CHANGE IT
MOVEM T3,F3
JRST S1A
SLSH: SETZ T1,
SLSH2: PUSHJ P,INCHR ;GET SWITCH
PUSHJ P,CHRSTR
CAIGE CH,"0"
JRST SLSH3
CAILE CH,"7"
JRST SLSH3
ROT T1,3
ADDI T1,-60(CH)
JRST SLSH2
SLSH3: MOVE T4,[XWD -SWCHLN,SWCHTB]
JRST SLIST
SSWCH: TLO F,SSW
JRST SWCHX
TSWCH: MOVEM T1,TERMBK
JRST S2
DSWCH: TLO F,DSW ;NOTE PRESENCE OF D SWITCH
MOVEI CH,116 ;SELECT NON-STANDARD MODE FOR LINK WORDS
MOVEM CH,ST1 ;SELECT NON-BUFFERED MODE
JRST SWCHX ;NUMERIC ARG IS 1ST BLOCK OF DUMP
KSWCH: TLOA F,KSW ;K SWITCH REQUESTS CORE DUMP
HSWCH: TLO F,HSW ;H SWITCH REQUESTS HIGH SEG CORE DUMP
SWCHX: MOVEM T1,BLKNUM ;SAVE NUMERIC ARG
JRST S2
FIN2: TLNN F,PDET
JRST NULEXT
MOVEM T3,E3
FIN2A: SKIPN T3,D3 ;D3 IS OUTPUT DEVICE
MOVSI T3,(SIXBIT /LPT/)
MOVEM T3,D2 ;STORE IN OUTPUT OPEN ARRAY
MOVE T3,[XWD F3,F2]
BLT T3,E2 ;MOVE FILE AND EXT INTO OUTPUT OPEN ARRAY
MOVE T3,[XWD AS1,ASNAMF]
BLT T3,ASNAMF+2
SETZM E3
MOVE T2,[XWD E3,AS1] ;WILL ZERO OUT EXT AND AS1
JRST S0
NULEXT: MOVSI T1,(SIXBIT /LST/) ;DEFAULT EXT IS LST
MOVEM T1,E3
JUMPE T3,FIN2A ;DON'T CLOBBER FILE NAME IF NULL
MOVEM T3,F3
JRST FIN2A
FIN1: TLNN F,PDET
JRST NULEX1
MOVEM T3,E3
FIN1A: SKIPN T3,D3 ;D3 IS INPUT DEVICE
MOVSI T3,(SIXBIT /DSK/)
MOVEM T3,D1 ;MOVE INPUT DEVICE TO OPEN ARRAY
MOVE T3,[XWD F3,F1]
BLT T3,E1 ;MOVE FILE AND EXT INTO INPUT OPEN ARRAY
MOVE T3,[XWD AS1,ASNAME]
BLT T3,ASNAME+2
CAIN CH,CR ;IF CARRIAGE RETURN,
PUSHJ P,INCHR ;GET LF OUT OF BUFFER
MOVSI T3,(SIXBIT /LPT/) ;CHECK OUTPUT DEFAULTS
SKIPN D2
MOVEM T3,D2
MOVSI T3,(SIXBIT /LST/)
SKIPN E2
MOVEM T3,E2
MOVE T3,F1
SKIPN F2
MOVEM T3,F2
POPJ P,
NULEX1: SETZM E3 ;CLEAR EXTENSION
JUMPE T3,FIN1A
MOVEM T3,F3
JRST FIN1A
SYNTAX: POP P,T ;POP AWAY RETURN WE DONT WANT
MOVEI T,ER3 ;COMPLAIN ABOUT COMMAND SYNTAX ERROR
JRST ERROR
CHRSTR: IBP A
HRRZ T4,A
CAIG T4,AS1+2
DPB CH,A ;STORE THE SWITCH
POPJ P,
INPUT: SOSLE IBUF+2 ;CH=NEXT BYTE FROM INPUT UNIT
JRST INPUT1
INPUT 1,
PUSHJ P,CHKIN ;CHECK FOR INPUT ERRORS
GETSTS 1,CH
TRNE CH,EOFBIT
JRST ENDF
MOVE CH,IBUF+2
MOVEM CH,MAX
INPUT1: ILDB CH,IBUF+1
POPJ P,
CHKIN: STATO 1,ERRBIT ;CHECK FOR ERRORS ON INPUT
POPJ P, ;RETURN IF NO ERRORS
MOVEI T,ERRINM
TLON F,DEVERR ;OUTPUT TO TTY ONLY ONCE
PUSHJ P,TMES
SUBI CNT,2 ;COUNT LINES ON PAGE
MOVEI T,ERRINP
PUSHJ P,MES ;OUTPUT TO LISTING
GETSTS 1,T ;RE-FETCH STATUS
MOVE T1,T
ANDI T1,-1-ERRBIT ;CLEAR ERROR CODE
SETSTS 1,(T1) ;CLEAR STATUS IN MONITOR
PUSHJ P,OOCT ;PRINT STATUS IN OCTAL
JRST OCRLF ;END WITH A CRLF AND A POPJ
SPACES: PUSHJ P,SPACE ;3 SPACES TO OUTPUT UNIT
SPACE2: PUSHJ P,SPACE
SPACE: MOVEI CH,SP ;1 SPACE TO OUTPUT UNIT
OUTPUT: SOSG OBUF+2 ;ASCII CHAR IN CH TO OUTPUT UNIT
OUTPUT 2,
IDPB CH,OBUF+1
POPJ P,
CRLF: MOVEI CH,CR ;CARRIAGE RETURN, LINE FEED TO TTY
PUSHJ P,TTYOUT
MOVEI CH,LF
TTYOUT: SOSG TOBUF+2 ;ASCII CHAR IN CH TO TTY
OUTPUT 0,
IDPB CH,TOBUF+1
POPJ P,
INCHR: SOSG TIBUF+2 ;CH=NEXT CHAR READ FROM TTY
INPUT 0,
ILDB CH,TIBUF+1
CAIL CH,"A"+40 ;CHECK FOR LOWER CASE
CAILE CH,"Z"+40
POPJ P, ;NO
SUBI CH,40 ;YES--CONVERT TO UPPER
POPJ P,
TMES: PUSHJ P,CRLF ;TYPE CARRIAGE RETURN, LINE FEED
TLOA T,440700 ;TURN MESSAGE INTO BYTE POINTER
TMES1: PUSHJ P,TTYOUT
ILDB CH,T
JUMPN CH,TMES1
PUSHJ P,CRLF ;OUTPUT ANOTHER CR/LF
OUTPUT 0, ;MAKE SURE IT ALL GETS THERE
CPOPJ: POPJ P,
MES: TLOA T,440700 ;MAKE BYTE POINTER OF T
MES1: PUSHJ P,OUTPUT
ILDB CH,T
JUMPN CH,MES1
POPJ P,
TTYQ: 1 ;SELECT AL MODE FOR TTY
SIXBIT /TTY/
XWD TOBUF,TIBUF
ER1: ASCIZ /?CANT OPEN INPUT/
ER1A: ASCIZ /?CANT LOOKUP INPUT/
ER2: ASCIZ /?CANT OPEN OUTPUT/
ER2A: ASCIZ /?CANT ENTER OUTPUT/
ER3: ASCIZ /?SYNTAX ERROR/
SUPERM: ASCIZ /?SUPER-USETI FAILURE/
ERRINM: ASCIZ /?INPUT ERROR/
ERRINP: ASCIZ /
INPUT DEVICE ERROR STATUS = /
CW1: ASCIZ / SA = /
CW8: ASCII /DUMP OF FILE /
ASNAME: BLOCK 3
ASCII / TO /
ASNAMF: BLOCK 3
BLANKS: ASCII / /
DATE: ASCII /00-00-00 /
TIME: ASCII /00:00/
ASCIZ /
/
CW6: ASCIZ / BLOCK /
CW5: ASCIZ . DIRECTORY
.
CW5A: ASCIZ .FILE INDEX OF EACH BLOCK ON TAPE
.
CW5B: ASCIZ .[BLOCK NUM]
FILE EXT [0.
CW2: ASCIZ . [.
CW3: ASCIZ .0] .
COMLST: IOWD DTAL,DATAB
0
ST1: 10
D1: 0
XWD 0,IBUF
F1: 0
E1: 0
0
0
ST2: 1
D2: 0
XWD OBUF,
F2: 0
E2: 0
0
0
D3: 0
F3: 0
E3: 0
AS1: BLOCK 3 ;AS1 MUST FOLLOW E3
TERMBK: BLOCK 1 ;TERMBK MUST FOLLOW AS1
PDLPT: XWD -31,PDLST-1
BLKNUM: BLOCK 1
MAX: BLOCK 1
LSTOUT: BLOCK 8
LINBUF: BLOCK ^D24
PDLST: BLOCK 32
IBUF: BLOCK 3
OBUF: BLOCK 3
TIBUF: BLOCK 3
TOBUF: BLOCK 3
DATAB: BLOCK 200
DMPEND: END DUMP