.MCALL .MODULE .MODULE DUMP,VERSION=25,COMMENT=,AUDIT=YES ; Copyright (c) 1998 by Mentec, Inc., Nashua, NH. ; All rights reserved ; ; This software is furnished under a license for use only on a ; single computer system and may be copied only 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 except for use on such ; system and to one who agrees to these license terms. Title ; to and ownership of the software shall at all times remain ; in Mentec, Inc. ; ; The information in this document is subject to change without ; notice and should not be construed as a commitment by Digital ; Equipment Corporation, or Mentec, Inc. ; ; Digital and Mentec assume no responsibility for the use or ; reliability of its software on equipment which is not supplied ; by Digital or Mentec, and listed in the Software Product ; Description. ; Edit History: ; ;001 ; EDIT LOG BETWEEN V03.04 AND V04.00 ;001 ; TURN OFF NON-FILE-STRUCTURED LOOKUP AFTER VERSION NUMBER OBTAINED ;**-2 ; ADD .CLOSE ERROR MESSAGE FOR PROTECTION VIOLATION ;MAS02 ; DO ERROR CHECKING ON CSIGEN, INPUT FROM MEMORY REQUIRES DUMP TO DO IT ;MAS03 ; CHECK FOR SEQ. DEVICE ON CHANNEL 3 SPECIFICALLY, ADD MS DEVICE ;MAS04 ; ;001 ; 001 07-Jan-80 14:37 Gumbel, Dick (75498) [240,189] ; Add .QSET to allow true overlapped I/O ; (001) ; ; 25-FEB-85 George Thissell Jr. ; Allow for possible date rollover ; ; 18-JUL-86 Tony Brennan ; .GTLIN parsing routine added to provide default device/filename if not ; specified. .LOOKUP removed and .ENTER used instead. ; ; 23-NOV-87 IHZ ; Change VERSION=07 to VERSION=08. In DEVTYP, TEST FOR HARD ERROR; ; CHANGE MSG13 FROM WARNING TO FATAL. ; ; 18-MAR-88 IHZ ; Add .SERR and .HERR to handle error messages for "dev:filena.ext" ; commands with diskette door open. Also, when printer not avail ; and DUMP filena.ext is typed (as opposed to DUMP/TERM filena.ext), ; print error message "?DUMP-F-No LP" and not "?DUMP-F-File or input ; device not found". ; ; 31-MAR-88 IHZ ; Increase size of OUTASC buffer to accommodate longer error messages. ; ; 21-Nov-88 RHH ; Accept magtape records of varying sizes. If shorter than 256 words, ; display only those lines represented words found. If longer than ; 256 words, display "(TRUNCATED)" after BLOCK NUMBER header. ; ; 18-April-89 MSS ; Fix DSKCHK so that it generates the appropriate error message ; (E or O option) instead of always E ; ; 15-June-89 MSS ; Make DEVTYP prevent non-file structured access to the KP: device. ; ; 28-Jun-89 RHH ; When magtape is in EOT zone, can't determine record length, so ; assume it's 256 words. Use SYSTEM.MLB-compatible names for SPFUNs ; and magtape error codes. ; ; 10-Jul-89 RHH ; Display only those words read from magtape. Display blanks ; instead of zeros when record is exhausted. ; ; 01-Nov-1990 JFW ; bracket error messages with ;+/;ERROR/.../;- ; ; 16-Nov-1990 JFW ; add JSX ; ; 16-Jan-1991 WFG ; Change R50UNP conversion to ASCII to avoid changing '*' to '/' ; ; 4-Mar-1991 WFG ; Action #7444, Fix RAD50 display of invalid chars in R50UNP: .ENABL LC ;001 ;001 .MCALL .SRESE, .CSIGE, .READW, .WRITE, .FETCH, .ENTER, .PRINT, .HERR .MCALL .SETTO, .WAIT, .CLOSE, .RCTRL, ..V2.., .GTIM, .GTLIN, .SERR .MCALL .CSISPC, .DSTATU, .RELEAS, .QSET, .GVAL, .EXIT, .SPFUN ;001 ..V2.. ;USE V2 MACRO EXPANSIONS ;**-1 .LIBRARY "SRC:SYSTEM" .MCALL .JSXDF .SYCDF .JSXDF .SYCDF ; MACRO TO OUTPUT THE ERROR MESSAGE TO THE USER CONSOLE AND THE ; CORRECT ERROR CODE IN BYTE 53. THE ERROR MESSAGE AND ERROR ; CODE ARE PASSED AS ARGUMENTS TO THE MACRO. ; R5--> CONTAINS THE ARGUMENTS TO BE PASSED. .MACRO ERROR MESS JSR R5,PRINT .WORD MESS ;ERROR MESSAGE .ENDM .MACRO PUT ARG JSR R3,@R2 .WORD ARG .ENDM .MACRO OCT ARG JSR R3,OCTOUT .WORD ARG .ENDM ;DEFINITIONS FOR THE CHANNELS AND ERROR CODES FOR BYTE 53. NULL = 000 ;DEFINE NULL CR = 015 ;DEFINE CARRIAGE RETURN LF = 012 ;DEFINE LINE FEED EQUAL = 075 ;DEFINE EQUAL SIGN COLON = 072 ;DEFINE COLON INPUT = 3 ;CHANNEL 3 INPUT1 = 4 ;CHANNEL 4 OUTPUT = 0 ;OUTPUT CHANNEL OUT1 = 1 ;OUTPUT CHANNEL 1 OUT2 = 2 ;OUTPUT CHANNEL 2 NFS = 001 ;NON FILE STRUCTURE LOOKUP SET FLAG CHAN = 0 ;DEFINE OUTPUT CHANNEL PROTCT = 3 ;PROTECTION ERROR BYTE CODE ;MAS02 SUCCS$ = 1 ;Success WARN$ = 2 ;Warning ERROR$ = 4 ;Error FATAL$ = 10 ;Fatal UNCON$ = 20 ;Unconditional ERCMD = 0 ;INVALID COMMAND ;IHZ ERDNC = 1 ;DEVICE NOT FOUND ;IHZ ERPRE = 2 ;PROTECTED FILE EXISTS ;IHZ ERFUC = 3 ;DEVICE FULL ;IHZ ERFNC = 4 ;FILE NOT FOUND ;IHZ USRBUF = 266 ;OFFSET FOR USR S.VER = 276 ;Offset to monitor version number CSWEOF = 20000 LEOT = 2 ;LEOT DEFINED AS TWO TAPE MARKS MAGTAP = 4 ;DEFINE MAGTAP CODE ;MAS04 VERSIZ = 400 ;.DSTAT MULTISIZED VOLUME ;+ ;Tape device id's ;- DEV.MT == <^o011> ;TM11/TU10/TS03 magtape DEV.MM == <^o020> ;TJU16 magtape DEV.MS == <^o035> ;TK25/TS04/TS05/TS11/TU80 magtape DEV.MU == <^o060> ;TK50/TK70/TU81 TMSCP handler DEV.CT == <^o013> ;TA11 cassette tape ; Tape error codes EM.EOT =: 2 ; EOT zone entered EM.BIG =: 5 ; Large record encounterred EM.SML =: 6 ; Small record encounterred SF.MRD =: 370 ; SPFUN READ from magtape ;+ ; KP type device ID ;- KPTYPE == <^o110000> ;.Dstat value for a KP type device .ASECT .=$JSX .WORD VBGEX$ .PSECT DATA ;ORDER DATA PSECT FIRST .PSECT CODE .SBTTL ROUTINE INITIALIZATION BR DUMP ;REENTRY ADDRESS ;001 .SBTTL RESTART ;**-1 DUMP:: .HERR ;PERMIT "?MON-F-" ERRORS ;IHZ MOV @#$USRSP,SP ;INIT STACK ;001 .GTIM #IOAREA,#IOAREA ;Check for possible date rollover .GVAL #IOAREA,#S.VER ;Get the system version number BIC #^C377,R0 ;Clear the update number CMP R0,#5 ;Is it the right version? BGE 50$ ;Branch if so CLR R2 ;NO FILENAME IN ERROR MESSAGE ;+ ;ERROR ERROR MSG13 ; ;- CLR R0 ;Hard exit .EXIT ;Get out quick 50$: CLR ORGTOP ;INSERT INITAL NULL BYTE ;**-1 .SRESET .QSET #QELM,#1 ;ALLOCATE AN EXTRA QUEUE ELEMENT ;001 CLRB LOKFLG ;CLEAR LOOKUP TYPE ;MAS01 CLRB NODEV ;CLEAR DEVICE PRESENT FLAG JSR R3,PARSER ;PARSE THE INPUT STRING JSR R3,FILTYP ;CHECK FOR LOOKUP TYPE JSR PC,MOVNAM ;MOVE INPUT FILE TO HEADER ;FOR MAGTAPE AND CASSETTE .RCTRLO ;SPEAK, OH MIGHTY TTY .SERR ;LET PROGRAM LOOK FOR FATAL ERRORS ;IHZ .CSIGEN #ORGTOP,#DEFEXT,#ORGTOP ;GET INPUT FILE BCC 4$ ;C=0 NO ERRORS ;MAS03+ MOVB @#$ERRBY,R4 ;GET ERROR BYTE TO CHECK NUMBER BNE 1$ ;0? 55$: CLR R2 ;NO FILENAME IN ERROR MSG ;+ ;ERROR ERROR MSG5 ;52 = 0 -> INVALID COMMAND ERROR ;- 1$: CMPB #ERPRE,R4 ;2? ;IHZ BNE 2$ ;NO MOV #OUTASC,R2 ;POINT TO FILENAME FOR ERRMSG ;+ ;ERROR ERROR MSG11 ;52 = 2 -> PROTECTION ERROR ON .ENTER ;- 2$: CMPB #ERFUC,R4 ;3? ;IHZ BNE 22$ ;NO MOV #OUTASC,R2 ;POINT TO FILENAME FOR ERRMSG ;+ ;ERROR ERROR MSG12 ;52 = 3 -> DEVICE FULL ;- 22$: CMPB #ERFNC,R4 ;4? ;IHZ BNE 3$ ;NO ;IHZ CLR R2 ;NO FILENAME IN ERROR MSG ;IHZ ;+ ;ERROR ERROR MSG6 ;FILE OR DEVICE NOT FOUND ;IHZ ;- 3$: MOVB @#$ERRBY,SAVERB ;SAVE AND USE AFTER LP TESTING ;IHZ 4$: MOV R0,-(SP) ;PRESERVE R0 ;IHZ .HERR ;NOW PERMIT "?MON-F-" ERRORS ;IHZ MOV (SP)+,R0 ;RESTORE R0 ;IHZ CLRB DETEOF ;CLEAR THE EOF COUNT ;MAS03- MOV R0,R2 ;SAVE THE PROGRAM TOP MOV @#$SYPTR,R0 ;GET THE START OF RMON MOV USRBUF(R0),R0 ;LEAVE USR RESIDENT TST -(R0) ;FIX FOR SETTOP .SETTOP ;ASK FOR FREE CORE TST (R0)+ ;REFIX MOV R0,TOP ;SAVE THE POINTER TO TOP .WAIT #OUT1 ;MORE THAN ONE OUTPUT CHAN ?. BCS 5$ ;NO THERE WAS'NT CLR R2 ;NO FILENAME IN ERROR MSG ;+ ;ERROR ERROR MSG5 ;YES OUTPUT ERROR ;- ;001 5$: .WAIT #OUT2 ;ANOTHER OUTPUT CHAN. ;**-1 BCS 6$ ;NO THERE WAS'NT CLR R2 ;NO FILENAME IN ERROR MSG ;+ ;ERROR ERROR MSG5 ;YES OUTPUT ERROR ;- 6$: .WAIT #INPUT1 ;MORE THAN ONE INPUT CHAN BCS 7$ ;NO THERE WAS'NT CLR R2 ;NO FILENAME IN ERROR MSG ;+ ;ERROR ERROR MSG5 ;YES IT WAS,OUTPUT ERROR ;- 7$: .WAIT #INPUT ;WAS THERE AND INPUT DEVICE BCC 9$ ;YES THERE WAS TST (SP) ;ANY SWITCHES ON STACK BEQ 8$ ;NO THERE WERE'NT 8$: CMPB #'=,ORGTOP ;DOES INPUT COMMAND STRING BEGIN WITH "="?? ;IHZ BEQ 55$ ;YES. INVALID COMMAND ;IHZ CMPB #'<,ORGTOP ;DOES INPUT COMMAND STRING BEGIN WITH "<"? ;IHZ BEQ 55$ ;YES. INVALID COMMAND ;IHZ TST ORGTOP ;ANY CHARACTERS IN THE INPUT COMMAND STRING? ;IHZ BNE 9$ ;YES, SOMETHING OTHER THAN A RETURN WAS TYPED ;IHZ .PRINT #VNUM ;PRINT THE VERSION NUMBER JMP DUMP ;001 ;**-1 9$: .WAIT #OUTPUT ;WAS THERE AN OUTPUT FILE OR DEVICE BCC 11$ ;YES THERE WAS .FETCH R2,#LP ;NO DEFAULT TO LP BCC 10$ ;NO PROBLEM ON FETCHING LP CLR R2 ;NO FILENAME IN ERROR MSG ;+ ;ERROR ERROR MSG0 ;ERROR NO LP HANDLER PRESENT ;- 10$: MOV R0,R2 ;SAVE CORE PTR .ENTER #LAREA,#CHAN,#LP ;CONVERT TO ..V2.. MACRO BCC 11$ ;NO ERROR CLR R2 ;NO FILENAME IN ERROR MSG ;+ ;ERROR ERROR MSG0 ;ERROR IN GETTING LP ;- 11$: MOV #TOP,R3 ;POINT TO DATA STUFF MOV (R3)+,R1 ;GET TOP OF CORE MOV R2,(R3)+ ;SAVE START OF FREE SUB R2,R1 ;COMPUTE SIZE OF BUFFER CMP R1,#1000 ;MAKE SURE WE HAVE AT LEAST 256. WORDS BHI 12$ ;ENOUGH CORE CLR R2 ;NO FILENAME IN ERROR MSG ;+ ;ERROR ERROR MSG4 ;NOT ENOUGH CORE ;- 12$: MOV #1,(R3)+ ;SAVE BUFFER SIZE OF ONE BLOCK MOV #/2,R0 ;COUNT TO CLEAR 13$: CLR (R3)+ DEC R0 BNE 13$ ;CLEAR IT MOV #-2,EBLOCK ;VERY HIGH END BLOCK CALL DEVTYP ;WHICH MAGNETIC DEVICE IS IT TSTB SAVERB ;52 = 1? ;IHZ BEQ SWINT ;NO. ALL'S WELL ;IHZ CLRB SAVERB ;RE-INIT ;IHZ CLR R2 ;NO FILENAME IN ERROR MSG ;+ ;ERROR ERROR MSG6 ;52 = 1 -> FILE OR DEVICE NOT FOUND ;- .SBTTL SWITCH INTERPRETER SWINT: MOV (SP)+,R5 ;GET SWITCH COUNT 1$: DEC R5 ;ANY MORE? BPL 2$ ;NO, DO THE DUMP JMP BEGIN ;GO GET DATA 2$: MOV #SBLOCK,R3 ;POINT TO POINTERS MOV #SWTBL,R2 ;SWITCH TABLE CMPB @SP,#'a ;SWITCH LOWERCASE ? BLO 7$ ;NO, BRANCH CMPB @SP,#'z ;SWITCH LOWERCASE ? BHI 7$ ;NO, BRANCH BICB #40,@SP ;CONVERT TO UPPERCASE 7$: CMPB @SP,#'O ;'ONLY' IS SPECIAL CASE BNE 3$ MOV 2(SP),@R3 ;WHICH SETS BEGIN BLOCK MOV #-1,OFLAG MOVB #'E,@SP ;AND END BLOCK 3$: CMPB -(R2),@SP ;IS THIS THE ONE ? BEQ 5$ ;GOT IT TST (R3)+ ;BUMP DESTINATION TSTB -(R2) ;END OF TABLE ? BNE 3$ ;NO, GO ON 4$: MOV (SP)+,R2 ;GET SWITCH VALUE MOVB R2,ERROPT CLR R2 ;NO FILENAME TO PRINT ;+ ;ERROR ERROR MSG1 ;SWITCH ERROR ;- 5$: TST (SP)+ ;VALUE GIVEN ? BMI 6$ ;YES, HANDLE IT THERE MOVB -(R2),R0 ;GET FIXED VALUE BMI 4$ ;HE SHOULD HAVE GIVEN ONE MOV R0,@R3 ;PUT IN VALUE BR 1$ 6$: TSTB -(R2) ;WAS VALUE LEGAL ? BPL 4$ ;NO MOV (SP)+,@R3 ;YES, PUT IT IN BR 1$ .SBTTL END PROCESSING, ERRORS EOFCHK: TSTB @#$ERRBY ;WHAT KIND? BEQ 2$ ;EOF DETECTED,NO HARDWARE ERROR TST IGNORE ;DO WE IGNORE ERRORS BEQ 1$ ;DON'T IGNORE ERROR JMP READIG ;IGNORE THE ERROR 1$: MOV #INASC,R2 ;POINT TO INPUT FILENAME ;+ ;ERROR ERROR MSG3 ;HARDWARE ERROR ;- 2$: TSTB DEVFLG ;Is it a tape device BEQ LEFTBU ;No it's not INC EBLOCK ;DON'T COUNT TAPE MARKS TSTB CHKFLG ;SUPPRESS TAPE MARKER BMI FILL ;YES SUPPRESS IT PUT OUTTM ;TAPE DEVICE,OUTPUT TAPE MARK MESSAGE PUT CRLF ;OUTPUT AND FILL: CLRB CHKFLG ;CLEAR POSTION FLAG CMPB DEVFLG,#MAGTAP ;Is it a magtape device or cassette? BHI LEFTBU ;Cassette TSTB LOKFLG ;FILE STRUCTURE REQUEST BEQ LEFTBU ;YES IT IS TST NORT11 ;IS IT AN RT11 STRUCTURED TAPE BNE 1$ ;NO IT'S NOT,STOP ON CONSECETIVE TM TSTB HEDCHK ;HAS HEADER BEEN READ BMI READ ;YES IT HAS TSTB EOFLAB ;HAS EOF LABEL BEEN READ BMI 1$ ;ADD TO EOF COUNT BR READ ;NO GO READ SOME MORE ;001 1$: INCB DETEOF ;ADD TO EOF COUNT ;**-1 ;STOP ON CONSECETIVE TAPE MARKS CMPB DETEOF,#LEOT ;ARE WE FINISHED YET BNE READ ;NO WE HAV'NT LEFTBU: CALL FINOUT ;Finish output .CLOSE #INPUT ;CLOSE INPUT FILE ;001 BCC 4$ ;C=0 -> NO ERROR ;001 CMPB #PROTCT,@#$ERRBY ;PROTECTION ERROR? ;**-2 BNE 4$ ;001 MOV #INASC,R2 ;POINT TO INPUT FILENAME ;+ ;ERROR ERROR MSG10 ;PROTECTION ERROR,UNLIKELY TO GET ONE ON;**-1 ;- 4$: CMP SBLOCK,TEMBLO ;IS IT AN ERROR ;001 BNE 5$ ;NO IT'S NOT ;001 MOV #INASC,R2 ;POINT TO INPUT FILENAME ;+ ;ERROR ERROR MSG7 ;EOF DETECTED ,START BLOCK LARGER THAN F;**-2 ;- 5$: .RELEAS #INDEV ;RELEASE THE INPUT HANDLER ;001 .RELEAS #OUTDEV ;RELEASE THE OUTPUT HANDLER ;**-1 .SETTOP #ORGTOP ;BRING USER TOP DOWN JMP DUMP ;001 ;**-1 FINOUT: MOV BUFCTR,R3 ;GET NUMBER OF CHARS LEFT BEQ 3$ ;No output ever done? CMP R3,#-512. ;EMPTY? BEQ 2$ ;YES, CLOSE OUTPUT FILE 1$: CLRB (R4)+ INC R3 BNE 1$ JSR PC,EMIT1 ;WRITE BUFFER LOAD 2$: .WAIT #OUTPUT .CLOSE #OUTPUT ;CLOSE OUTPUT BCC 3$ ;C=0 -> NO ERRORS ;001 CMPB #PROTCT,@#$ERRBY ;PROTECTION ERROR? ;**-1 BNE 3$ ;NE -> NO ;001 MOV #OUTASC,R2 ;POINT TO OUTPUT FILENAME ;+ ;ERROR ERROR MSG10 ;PROTECTION VIOLATION ;**-1 ;- 3$: RETURN .SBTTL FILE INITIALIZATION, READ ;001 BEGIN: JSR PC,CHKPOS ;LOOK FOR TAPE POSITION JSR PC,DSKCHK ;CHECK FOR DISK NFS LOOKUP MOV #LBUFF1,R4 ;START WITH BUFFER 1 MOV #-512.,BUFCTR ;COUNT OF SIZE MOV EBLOCK,LIMIT ;SAVE UPPER LIMIT MOV #SBLOCK,R3 ;POINT TO POINTERS SUB (R3)+,@R3 ;COMPUTE # OF BLOCKS BHIS 1$ ;SWITCHES ARE SAME OR DIFFERENT CLR R2 ;NO FILENAME IN ERROR MSG MOVB #'S,ERROPT ;/S ERROR ;+ ;ERROR ERROR MSG1 ;SWITCH ERROR ;- 1$: MOV SBLOCK,TEMBLO ;SAVE START BLOCK FOR DISC ERROR INC @R3 ;MAKE IT REAL COUNT MOV #FORCE,R2 ;WE CALL THIS A LOT MOV #DEVNAM,HDRPTR ;DO NOT START W/ FORM FEED READ: MOV #BUFFER,R3 ;POINT TO DATA BUFFER PTR MOV (R3)+,R5 ;R5 -> DATA BUFFER MOV (R3)+,R1 ;R1 = # BLOCKS IN BUFFER MOV (R3)+,R0 ;R0 = BLOCK # TO START CMP R1,@R3 ;BUFSIZ <= XFER LEFT? BLOS 1$ ;YES, READ ENTIRE BUFFER LOAD TSTB CHKFLG ;READ SOME MORE BMI 2$ ;YES READ ONE MORE MOV @R3,R1 ;NO, READ ONLY WHAT'S LEFT BEQ LEFTBU ;DONE! 1$: SUB R1,@R3 ;DECREMENT BLOCKS LEFT BR 3$ ;BRANCH AROUND 2$: MOV #1,R1 ;READ ONE MORE BLOCK 3$: SWAB R1 ;MAKE READ A WORD COUNT CALL READBLK ;Read a block BCC 4$ ;NO ERROR ON READ JMP EOFCHK ;ERROR CHECK FOR EOF 4$: JSR PC,TAPCHK ;CHECK FOR LEOT CLRB DETEOF ;CLEAR EOF COUNT ON SUCCESSFUL READS CLRB CHKFLG ;CLEAR SUPPRESS TAPE MARK FLAG MOV @#54,-(SP) ;ADDR OF SYSPTR ON STACK ADD #42,(SP) ;ADDRESS OF CSW FOR CHANNEL 3 ON STACK MOV @(SP),(SP) ;GET CSW FOR CHANNEL 3 ON STACK BIT #CSWEOF,(SP)+ ;EOF BIT ON? BEQ READIG ;NO JMP FILL ;YES-SIMULATE EOF (NEEDED FOR MT AND CT) READIG: BIC #140000,R0 ; ensure positive byte count MOV R0,WDCTR ;PRESERVE WORDS ACTUALLY READ .SBTTL PROCESS 8 WORDS .ENABL LSB LINE: MOV #8.,R0 CMP WDCTR,R0 ; at least this many words left? BHIS 10$ ; branch if so MOV WDCTR,R0 ; else, display this number of words 10$: MOV R0,NUMWRD ; save it ASL R0 ; this many bytes MOV R0,NUMBYT NEG R0 ; let NUMBY2 = 16-NUMBYT ADD #16.,R0 MOV R0,NUMBY2 MOV R5,R0 ;PREPARE TO PRINT LINE ADDRESS SUB BUFFER,R0 ;COMPUTE OFFSET IN BUFFER BIC #177000,R0 ;MAKE IT OFFSET IN BLOCK BEQ HEADER ;IF ZERO, PAGE EJECT AND TITLE LINE0: OCT 3 ;3 DIGIT ADDRESS PUT SLASH ;DELIMITER MOV #16.,R3 ;WORDS / LINE TST BYMODE ;BYTE OUTPUT MODE ? BEQ 20$ ;NO, DO WORD PROCESSING TST WMODE ;YES, HE MUST ASK FOR WORDS BEQ 100$ ;HE DIDN'T. GO PUT BYTES ;001 ;**-1 ; PRINT A LINE OF WORDS 20$: ASR R3 ;EIGHT WORDS, NOT 16 30$: PUT BLANK ;SPACE THE WORD ;001 MOV (R5)+,R0 ;GET WORD TO OUTPUT ;**-1 DEC NUMWRD ; count down no. of words avail BGE 40$ PUT BL6 ; display six blanks instead of data BR 50$ 40$: OCT 6 ; AS 6 DIGITS 50$: TST BYMODE ;EXTRA SPACING NEEDED ? BEQ 60$ ;GO IF NO ;001 PUT BLANK ;YES ;**-1 60$: DEC R3 ;ANY MORE HERE? ;001 BNE 30$ ;YES ;001 MOV #16.,R3 ;COUNT OF 16 BYTES OR CHARS ;**-2 SUB R3,R5 ;BACK UP FOR SOMETHING TST BYMODE ;BYTES GOING OUT ? BNE 90$ ;YES. PRINT BYTES TST NMODE ;DOES HE WANT BYTES ? BNE 140$ ;NO. END THE LINE ;001 PUT BLAST ;BLANK ASTERISK ;**-1 70$: JSR PC,PUTCH ;PUT A CHARACTER ;001 BNE 70$ ;LOOP UNTIL DONE ;001 PUT STARCL ;* CR LF ;**-2 BR 150$ ;NO BYTES. GO CHECK RAD 50 ;001 80$: BR LINE ; (Bucket brigade upwards) 90$: PUT CRLF ;END THE WORD LINE ;**-2 PUT BL4 ;SPACE OUT THE BYTES 100$: PUT BLANK ;SEPARATION ;001 MOVB (R5)+,R0 ;BYTE TO PRINT ;**-1 DEC NUMBYT ; count down no. of bytes avail BGE 110$ PUT BL3 ; display 3 blanks instead of data BR 120$ 110$: BIC #177400,R0 ;PLEASE OCT 3 ;ONLY A BYTE 120$: DEC R3 ;ANY MORE ? BNE 100$ ;YES ;001 PUT CRLF ;NO, END OF LINE ;**-1 TST NMODE ;SUPPRESS ASCII ? BNE 150$ ;YES ;001 MOV #16.,R3 ;NO, 16 CHARS ;**-1 SUB R3,R5 ;BACK UP PUT BL2 ;PRE SPACE 130$: PUT BL3 ;SPACER ;001 JSR PC,PUTCH ;CHARACTER PUTTER ;**-1 BNE 130$ ;NOT DONE ;001 140$: ADD R3,R5 ;ADVANCE OR NOT ;001 PUT CRLF ;DONE. END LINE ;**-2 150$: TST XMODE ;ANY RADIX 50? ;001 BEQ 170$ ;001 MOV #8.,R3 ;WORD COUNT ;**-2 SUB #16.,R5 ;DECREMENT BY 16 TST BYMODE BNE 160$ ;001 PUT BLANK ;INITIAL SPACE ;**-1 160$: MOV #BL4,R1 ;PRINT 4 BLANKS ;001 SUB BYMODE,R1 ; (SOMETIMES 5) ;**-1 JSR R3,FORCE1 ; TO OUTPUT FILE MOV (R5)+,R0 ;GET A WORD JSR PC,R50UNP DEC R3 BNE 160$ ;001 PUT CRLF ;**-1 170$: SUB #8.,(PC)+ ;DONE 8 WORDS. ANY MORE? ;001 WDCTR: .WORD 0 ;**-1 BHI 80$ ;YES JMP READ ;NO, READ SOME MORE .DSABL LSB .SBTTL PRINT HEADER HEADER: TST BYMODE ;INSERT FOR BYTE MODE BNE 1$ ;DO IT FOR BYTE MODE TST XMODE ;DO THE SAME FOR RAD50 STUFF BEQ 2$ ;NOT RAD50 1$: PUT CRLF ;PUT IN FOR PUT CRLF ;FOR SPACING ON LISTING 2$: JSR R3,@R2 ;OUTPUT HEADING HDRPTR: .WORD 0 MOV SBLOCK,R0 ;PRINT BLOCK NUMBER INC SBLOCK ;BUMP FOR LATER OCT 6 ;PRINT 6 DIGIT BLOCK NUMBER FIELD (OCTAL) TSTB TOOBIG ;Long Magtape block? BEQ 10$ ;branch if not JSR R3,@R2 ;Output special TOO BIG qualifier .WORD TOOMSG 10$: PUT CRLF ;EMIT CR LF TST BYMODE ;IS IT BYTE MODE OUTPUT BNE 20$ ;YES,DON'T FORM FEED TST XMODE ;IS IT RAD50 OUTPUT MODE BNE 20$ ;YES DON'T FORM FEED CLR R0 ;ZERO WORD NUMBER MOV #HDRMSG,HDRPTR ;FORM FEEDS FROM NOW ON BR 30$ 20$: MOV #BLKNO,HDRPTR ;DON'T DO FORM FEED 30$: JMP LINE0 ;GET ANOTHER LINE .SBTTL OCTAL NUMBER OUTPUT OCTOUT: MOV (R3)+,R1 ;GET FIELD SIZE CLR -(SP) ;SET MARKER 1$: MOV R0,-(SP) ;GET BYTE BIC #177770,@SP BIS #'0,@SP CLC ROR R0 ASR R0 ASR R0 DEC R1 BNE 1$ 2$: MOV (SP)+,R0 BEQ 3$ JSR PC,EMIT ;PUT DIGIT BR 2$ 3$: RTS R3 .SBTTL RAD 50 UNPACK ROUTINE R50UNP: MOV #COEFF,R1 ; Get table of divisors for conversion MOV R0,-(SP) ; Save word to unpack CMP R0,#174777 ; Does value exceed max RAD50 value ? BLOS 10$ ; No, it's OK MOV #77,R0 ; Substitute '?' for invalid char CALL EMIT ;PUT CHARACTER CALL EMIT ;PUT CHARACTER CALL EMIT ;PUT CHARACTER BR 60$ 10$: CLR R0 ;MAKE A PLACE ; Divide by divisor from table, compute quotient in R0 20$: CMP @SP,@R1 ;Remainder less than divisor ? BLO 30$ ;Yes, R0 = character to convert SUB @R1,@SP ;No, take off another divisor INC R0 ;Update quotient BR 20$ ;Continue ; Convert RAD50 char to ASCII 30$: TSTB R0 ; BLANK char ? BEQ 42$ ; Yes, convert CMPB R0,#33 ; ALPHA or $ char ? BLO 40$ ; ALPHA, convert BEQ 48$ ; '$', convert CMPB R0,#35 ; Unused char ? BEQ 46$ ; Yes, convert CMPB R0,#50 ; '.' or numeric ? BLO 44$ ; Yes, convert MOVB #77,R0 ; Substitute '?' for invalid char BR 50$ 40$: ADD #40,R0 ;Char is A-Z, add 100 to convert 42$: ADD #16,R0 ;Char is BLANK, add 40 to convert 44$: ADD #5,R0 ;Char is 0-9,., add 22 to convert 46$: ADD #4,R0 ;Char is UNUSED,add 15 to convert 48$: ADD #11,R0 ;Char is $, add 11 to convert ; Output the ASCII character 50$: CALL EMIT ;PUT CHARACTER TST -(R1) ;Last char finished ? BNE 10$ ;No, get another ; Finished, return to caller 60$: TST (SP)+ ;Clean the stack RETURN .WORD 0,1,50 COEFF: .WORD 50*50 .SBTTL OUTPUT ROUTINES ;+ ; PUTCH - Print the byte as a character, or print a dot. ; ; R3 = number of characters yet to output on this line ; R5 -> next character to display ;- PUTCH: MOVB (R5)+,R0 ;GET CHARACTER CMP R3,NUMBY2 ; is this character real data? BGT 1$ MOV #40,R0 ; print a blank instead 1$: BIC #177600,R0 ;TRIM CMP #177,R0 ;DON'T PRINT RUBOUT BEQ 2$ CMP R0,#40 ;PRINTABLE? BGE 4$ ;YES 2$: MOV #'.,R0 ;NO, PUT A . 4$: JSR PC,EMIT ;OUTPUT A BYTE DEC R3 RTS PC EMIT: MOVB R0,(R4)+ ;PUT CHAR IN BUFFER INC (PC)+ ;BUMP COUNTER BUFCTR: .WORD 0 BNE EMITR ;NOT FULL YET EMIT1: SUB #512.,R4 ;POINT TO BEGINNING MOV #-512.,BUFCTR .WAIT #CHAN ;WAIT FOR FORMER TO END BCC 1$ ;NO ERROR ON PREVIOUS WRITE MOV #OUTASC,R2 ;POINT TO FILENAME FOR ERRMSG ;+ ;ERROR ERROR MSG2 ;ERROR ON PREVIOUS WRITE ;- 1$: .WRITE #WAREA,#CHAN,R4,#256.,LBLOCK BCC 2$ ;NO ERROR ON WRITE MOV #OUTASC,R2 ;POINT TO FILENAME FOR ERRMSG ;+ ;ERROR ERROR MSG2 ;ERROR ON WRITE ;- 2$: INC LBLOCK ;INCREMENT BLOCK COUNT MOV -(R4),R4 ;POINT TO OTHER BUFFER EMITR: RTS PC FORCE: MOV (R3)+,R1 ;POINT TO STRING FORCE1: MOVB (R1)+,R0 ;PUT CHAR BEQ RTS3 ;OUT ON 0 JSR PC,EMIT BR FORCE1 RTS3: RTS R3 .SBTTL PARSE THE INPUT STRING TO CHECK FOR THE PRESENCE OF AN OUTPUT ;FILENAME IF AN OUTPUT DEVICE IS SPECIFIED. IF NO NAME IS GIVEN USE DEFAULT ;STRING 'DUMP.DMP'. THIS PREVENTS CSI REJECTING ACCESS TO FILE STRUCTURED ;DEVICES WHEN LP HAS BEEN ASSIGNED AS A LOGICAL FOR A DISK. 'ORGTOP' ;IS THE FINAL OUTPUT THAT IS PASSED ON TO FILTYP: FOR A CSI PARSE. PARSER: .RCTRLO ;MAKE SURE THE TERMINAL CAN TALK .GTLIN #PARBUF,#PROMPT ;GET THE INPUT STRING MOV #PARBUF,R1 ;POINT TO START OF INPUT STRING 10$: CMPB (R1),#NULL ;SEE IF ITS A NULL BEQ 60$ ;IF SO THEN NO COLON. LEAVE IT TO CSI TO CHECK CMPB (R1)+,#COLON ;CHECK FOR A COLON IE. A DEVICE IS SPECIFIED BNE 10$ ;GO BACK AND CHECK NEXT CHARACTER CMPB (R1),#EQUAL ;IS THERE A FILENAME OR AN EQUALS FOLLOWING? BNE 60$ ;YES TYPE IS SPECIFIED...SO LEAVE IT AS IT IS. ;ELSE THE STRING IS OF THE FORM DEV:=FOO. ;USE DEFAULT FILE NAME DUMP.DMP MOV #ORGTOP,R2 ;MOV START OF OUTPUT COMMAND TO R2 ;NOW ADD DEV TYPE SPECIFIED MOV #PARBUF,R1 ;GET START OF INPUT STRING 30$: MOVB (R1),(R2)+ ;MOV DEV NAME A BYTE AT A TIME TO ORGTOP CMPB (R1)+,#COLON ;GOT TO THE COLON YET? BNE 30$ MOV #DEFSTR,R1 ;NOW ADD DEF OUTPUT FILE TO COMMAND STRING 40$: MOVB (R1)+,(R2)+ CMPB (R1),#NULL ;AT THE END YET BNE 40$ ;YES FINISHED MOV #PARBUF,R1 ;NOW ADD THE SPECIFIED INPUT FILE 35$: CMPB (R1)+,#COLON BNE 35$ 20$: MOVB (R1),(R2)+ ; CMPB (R1)+,#NULL ;GOT TO END OF YET?? BNE 20$ BR 80$ ;YES FINISHED PASS ORGTOP TO FILTYP: 60$: MOV #PARBUF,R1 ;ENTER HERE INPUT IF STRING IS LEFT UNALTERED MOV #ORGTOP,R2 ;POINT TO START OF INPUT AND OUTPUT 70$: MOVB (R1),(R2)+ ;MOV INPUT TO OUTPUT CMPB (R1)+,#NULL ;FINISHED? BNE 70$ 80$: RTS R3 .SBTTL NON FILE TYPE LOOKUP REQUEST CHECK ; FILTYPE -- DETERMINES IF THE LOOKUP TO THE MAGTAPE DEVICE WAS A FILE ; OR NON FILE STRUCT REQUEST.IF THE REQUEST WAS FILE STRUCTURED ; THE LOKFLG BYTE IS CLEAR OTHERWISE IT IS SET ; R1--> ADDRESS TO THE FILE NAME RETURNED BY ; CSISPC.IF ZERO LOKFLG IS SET TO ONE. FILTYP: .RCTRL .CSISPC #PGMTOP,#DEFEXT,#ORGTOP ;GET THE COMMAND STRING BCC 1$ ;NO ERRORS CLR R2 ;NO FILENAME IN ERROR MSG ;+ ;ERROR ERROR MSG5 ;ERROR IN CSI COMMAND ;- 1$: TST PGMTOP ;IS THERE A DEVICE BNE 2$ ;YES THERE WAS TST PGMTOP+36 ;IS THERE AN INPUT DEVICE BNE 2$ ;YES THERE WAS MOVB #-1,NODEV ;SET THE FLAG 2$: MOV #PGMTOP+40,R1 ;GET FILE NAME .REPT 3 ;CHECK FOR ZERO FILENAME TST (R1)+ ;IS IT ZEROS BNE 3$ ;NO IT'S NOT,IT'S GOT A FILENAME .ENDR ;END FILENAME CHECK MOVB #NFS,LOKFLG ;SET TYPE OF LOOKUP 3$: MOV PGMTOP,OUTDEV ;SAVE DEVICE TO BE RELEASED MOV PGMTOP+36,INDEV ;SAVE INPUT DEVICE TO BE RELEASED RTS R3 .SBTTL DEVICE TYPE ROUTINE ;+ ; DEVTYP -- DETERMINES IF THE INPUT DEVICE IS A SEQUENTIAL ACCESS DEVICE. ; IT CHECKS FOR THE FOLLOWING AND ASSIGN IT THE FOLLOWING CODE. ; ; DEVICE CODE ; ; Non magtape 0 ; MT 1 ; MM 2 ; MS 3 ; MU 4 ; CT 5 ; ; R1--> COUNTER FOR THE CONTROL LOOP. ; R3--> ADDRESS OF DEVICE NUMBER ; INDEV = INPUT FILE DEVICE NAME ;- DEVTYP::CLRB DEVFLG ;Initialize device flag MOV #TAPE,R3 ;R3-> DEVICE INFORMATION .DSTAT #DEVBLK,#INDEV ;GET INPUT DEVICE STATUS 1$: INCB DEVFLG ;ADD TO DEVICE CODE CMPB (R3)+,DEVBLK ;IS THIS IN THE LIST? BEQ 3$ ;Yes, got a match 2$: TSTB @R3 ;End of table? BNE 1$ ;No, try next one CLRB DEVFLG ;CLEAR DEVICE FLAG TSTB LOKFLG ;file structured look up? BEQ 222$ ;branch if yes MOV DEVBLK,-(SP) ;now we look to see if it is a KP: BIC #^c,(SP) ;type device because you cannot do CMP (SP)+,#KPTYPE ;device operations on KP: BNE 222$ TST (SP)+ ;remove return address ;+ ;ERROR ERROR MSG5 ;Invalid Command ;- 222$: MOV DEVBLK+6,HIBLOK ;SAVE DISK HIGHEST BLOCK # BIT #VERSIZ,DEVBLK ;IS IT A MULTISIZED VOLUME? BEQ 3$ ;IF NOT, BRANCH .SPFUN #IOAREA,#INPUT,#373,#FLOPPY,#1,#0 ;GET SIZE BCC 25$ ;IF SUCCESSFUL, BRANCH TSTB @#$ERRBY ;ATTEMPT TO READ PAST EOF? BNE 22$ ;IF NOT, BRANCH MOV #INASC,R2 ;POINT TO INPUT FILENAME ;+ ;ERROR ERROR MSG7 ;EOF DETECTED, START BLOCK > FILE LENGTH ;- 22$: CMPB #1,@#$ERRBY ;HARD ERROR ON INPUT DEVICE? ;IHZ BEQ 23$ ;YES ;IHZ CLR R2 ;NO FILENAME IN ERROR MESSAGE ;+ ;ERROR ERROR MSG5 23$: MOV #INASC,R2 ;POINT TO DEVICE NAME ;IHZ ERROR MSG3 ;DIRECTORY INPUT ERROR ;IHZ ;- 25$: MOV FLOPPY,HIBLOK ;GET MULTISIZED VOLUME SIZE 3$: RETURN .SBTTL TAPCHK,CHECKS FOR EOF AND HEADER LABELS ; TAPCHK -- SETS THE EOFLAB BYTE IF THE EOF ; LABEL HAS BEEN READ,OTHERWISE IT IS CLEAR ; R5--> CONTAINS THE ADDRESS TO THE DATA. TAPCHK: CMP #"HD,@R5 ;DID WE READ HEADER LABEL BNE 1$ ;NO WE DID'NT,CHECK FOR EOF CMPB #'R,2(R5) ;IS THIS THE HEADER LABEL BEQ 3$ ;YES IT IS 1$: CMP #"EO,@R5 ;CHECK FOR EOF LABEL BNE 2$ ;THIS IS'NT THE EOF LABEL CMPB #'F,2(R5) ;CHECK FOR END OF LABEL BEQ 4$ ;GO SET THE FLAG 2$: CLRB DETEOF RTS PC 3$: MOVB #-1,HEDCHK ;SET HEADER FLAG CLRB EOFLAB ;CLEAR EOF LABEL FLAG RTS PC ;RETURN TO DRIVER 4$: MOVB #-1,EOFLAB ;SET THE EOF FLAG CLRB HEDCHK ;CLEAR LABEL FLAG RTS PC ;RETURN TO DRIVER .SBTTL DSKCHK - CHECK FOR NFS DISK LOOKUP ; IF WE ARE DOING A NON-FILE-STRUCTURED LOOKUP ON DISK, AND HAVE ; NOT SPECIFIED AN ENDING BLOCK, DSKCHK WILL FORCE THE END BLOCK ; TO BE THE LAST BLOCK ON THE DEVICE DSKCHK: TSTB DEVFLG ;ARE WE ON MAGTAPE? BNE 100$ ;IF YES, BRANCH TST LOKFLG ;NFS LOOKUP? BEQ 100$ ;IF NOT, GO OUT CMP #-2,EBLOCK ;DID THEY SPECIFY AN END BLOCK? BEQ 10$ ;IF NO, BRANCH CMP EBLOCK,HIBLOK ;VALID END BLOCK? BLO 100$ ;IF YES, BRANCH CLR R2 ;NO FILENAME IN ERROR MESSAGE TST OFLAG BPL 4$ MOVB #'O,MSG15a CLR OFLAG BR 5$ 4$: MOVB #'E,MSG15a ;+ ;ERROR 5$: ERROR MSG15 ;- 10$: MOV HIBLOK,EBLOCK ;GET DISK SIZE IN BLOCKS DEC EBLOCK ;GET HIGHEST BLOCK NUMBER 100$: RTS PC .SBTTL CHKPOS,POSTIONS THE TAPE ACCORDING TO THE 'S' SWITCH ; CHKPOS SUBROUTINE -- POSITIONS THE TAPE ON A NON FILE STRUCTURE LOOKUP ; TO THE MAGTAPE DEV. THE ROUTINE CHECKS FOR LEOT ON FILE STRUCT. ; TAPES OR END OF FILE ON NON FILE STRUCTURED TAPES. CHKPOS: MOV BUFFER,R5 ;GET DATA BUFFER TSTB DEVFLG ;IS IT A MAGTAPE DEVICE BEQ 7$ ;NO IF EQ CMPB DEVFLG,#5 ;IS IT CASSETTE BEQ 7$ ;Branch if so - this magtape stuff is ; a mess! TSTB LOKFLG ;IS IT A NON FILE STRUCTURE LOOKUP BEQ 7$ ;NO IF EQ TST SBLOCK ;DID HE SPECIFY STARTING BLOCK BEQ 7$ ;NO IF EQ CLR R2 ;CLEAR COUNT REGISTER 4$: CALL MTREAD ;Skip a magtape block BCC 5$ ;NO ERROR TSTB @#$ERRBY ;IS IT EOF BEQ 4$ ;IGNORE THE TAPE MARK CMP RAREA,#EM.BIG ; LONG block? BEQ 5$ ; count them while skipping CMP RAREA,#EM.SML ; SHORT block? BEQ 5$ ; count them while skipping TST IGNORE ;IGNORE ERROR BNE 5$ ;YES WE DO MOV #INASC,R2 ;FILENAME FOR ERROR MSG ;+ ;ERROR ERROR MSG3 ;ERROR IN READING ;- 5$: INC R2 ;ADD TO COUNT REGISTER CMP R2,EBLOCK ;ARE WE AT UPPER LIMIT BEQ 6$ ;YES WE ARE CMP R2,SBLOCK ;ARE WE AT START BNE 4$ ;NO,READ SOME MORE 6$: MOVB #-1,CHKFLG ;SUPRESS TAPE MARKER OUTPUT 7$: RTS PC .SBTTL READBLK - Read block ;+ ; Read a block from the input device ; ; R5 = buffer address ; R1 = wordcount ; SBLOCK is the disk block number ; ; On return, ; R0 = number of words read ;- READBLK:TSTB DEVFLG ;IS IT A MAGTAPE DEVICE BEQ 10$ ;NO IF EQ CMPB DEVFLG,#5 ;IS IT CASSETTE BEQ 10$ ;Branch if so - this magtape stuff is ; a mess! TSTB LOKFLG ;non file structured LOOKUP? BNE MTREAD ;Read from magtape using SPFUN 10$: .READW #RAREA,#3,R5,R1,SBLOCK ;Otherwise, use regular .READW RETURN .SBTTL MTREAD - Read magtape block ;+ ; Read Magtape Block ; ; R5 = buffer address ; Short blocks are allowed. ; On exit, R0 contains the number of words read. ;- .ENABL LSB MTREAD: CLRB TOOBIG ; Assume normal record MOV #256.,R0 MOV R5,-(SP) 10$: CLR (R5)+ ; Clear the buffer DEC R0 ; in case short block BGT 10$ MOV (SP)+,R5 ; Restore buffer address .SPFUN #IOAREA,#3,#SF.MRD,R5,#256.,#RAREA,#0 ;Read Magtape Block BCC 60$ CMPB @#$ERRBY,#1 ; "Hard error"? BNE 30$ CMP RAREA,#EM.BIG ; Long block? BNE 20$ ; branch if not. INCB TOOBIG ; Set a flag BR 40$ ; otherwise, let them go as-is. 20$: CMP RAREA,#EM.SML ; Short block? BNE 50$ ; error if not. MOV #256.,R0 ; Yes. Calculate no. of words SUB RAREA+2,R0 ; actually read. BR 40$ ; return success 30$: TSTB @#$ERRBY ; EOF-class error? BNE 50$ CMP RAREA,#EM.EOT ; EOT without EOF? BNE 50$ ; if not, return error or EOF MOV #256.,R0 ; if so, can't determine wordcount, ; so fake it at 256. 40$: TST (PC)+ 50$: SEC 60$: RETURN .DSABL LSB .SBTTL PRINT,EMITS ERROR AND CODE ;+ ; PRINT -- EMITS THE ERROR MESSAGE TO THE USER ; CONSOLE AND THE CORRESPONDING ERROR CODE FOR ; INDIRECT COMMAND FILES IN BYTE 53. ; R5-->ADDRESS OF ARGUMENTS. ;- PRINT: .RCTRLO ;OUTPUT ERROR NO MATTER WHAT CMP #MSG10,@R5 ;PROTECTION MESSAGE? ;MAS02+ BEQ 10$ ;EQ -> YES CMP #MSG13,@R5 ;WRONG VERSION MESSAGE? BNE 30$ ;NE -> NO BISB #,@#$USRRB ;SET FATAL ;IHZ .PRINT #DUMPF ;PRINT STANDARD 1ST PART ;IHZ BR 15$ ;CONTINUE ;IHZ 10$: BISB #,@#$USRRB ;SET WARNING 15$: MOV (R5)+,R0 .PRINT ;PRINT MESSAGE TST R2 ;FILENAME TO PRINT? BEQ 20$ ;IF NOT, BRANCH .PRINT R2 ;PRINT FILENAME 20$: RTS R5 ;RETURN TO FINISH CLOSES 30$: CALL FINOUT ;Dump the remainder of output buffer .RCTRLO ;SPEAK, OH MIGHTY TTY .PRINT #DUMPF ;PRINT STANDARD 1ST PART ;001 MOV (R5)+,R0 ;GET THE ERROR MESSAGE ;**-1 .PRINT TST R2 ;FILENAME TO PRINT? BEQ 40$ ;IF NOT, BRANCH .PRINT R2 ;PRINT FILENAME 40$: BISB #,@#$USRRB .RELEAS #INDEV ;RELEASE INPUT DEVICE .RELEAS #OUTDEV ;RELEASE OUTPUT DEVICE .SETTOP #ORGTOP JMP DUMP ;GO GET ANOTHER COMMAND ;001 ;**-1 .SBTTL MOVNAM,MOVES INPUT STRING TO INITIAL HEADER ;+ ; MOVES THE INPUT FILE OR DEVICE TO THE INITIAL HEADER LABEL. ; R1-->INPUT STRING FROM CSISPC. ; R2-->OUTPUT AREA FOR HEADER. ; ALSO SAVES THE ASCII INPUT FILENAME (AND OUTPUT FILENAME, IF ; ONE EXISTS) FOR ERROR MESSAGES ;- MOVNAM: MOV #ORGTOP,R1 ;GET THE INPUT STRING ;BC1 MOV #OUTASC,R3 ;OUTPUT FILENAME BUFFER 10$: TSTB (R1) ;SEARCH FOR NULL BEQ 20$ ;JUST INPUT FILE WAS FOUND CALL UCHAR ;CONVERT TO UPPER CASE MOVB (R1),(R3)+ ;SAVE ASSUMED OUTPUT FILENAME CMPB (R1)+,#EQUAL ;FIND THE INPUT FILE BNE 10$ ;GO SEARCH SOME MORE CLRB -(R3) ;TERMINATOR FOR OUTPUT FILENAME BR 30$ ;OUTPUT FILE WAS GIVEN 20$: MOV #ORGTOP,R1 ;GET THE INPUT FILE MOV #OUTASC,R3 ;NO OUTPUT FILENAME CLR (R3) ;SO FLAG IT 30$: MOV #DEVNAM,R2 ;GET OUTPUT SPACE MOV #INASC,R3 ;INPUT FILENAME BUFFER CLR R4 ;INIT / FOUND FLAG 40$: TSTB (R1) ;IS IT A ZERO BYTE? BEQ 70$ ;IF YES, BRANCH CALL UCHAR ;UPPER CASE CMPB SLASH,(R1) ;FOUND A SWITCH? BNE 50$ ;IF NOT, BRANCH INC R4 ;YES, FLAG IT 50$: MOVB (R1),(R2)+ ;MOVE DATA FROM INPUT BUF TO OUTPUT TST R4 ;SWITCH FOUND? BNE 60$ ;IF YES, BRANCH MOVB (R1),(R3)+ ;ELSE CONTINUE TO SAVE INPUT FILENAME 60$: TSTB (R1)+ ;POINT TO NEXT BYTE BNE 40$ ;IF NOT ZERO, BRANCH 70$: CLRB (R3) ;TERMINATOR FOR INPUT FILENAME MOVB #CR,(R2)+ ;INSERT MOVB #LF,(R2)+ ;INSERT MOV #BLKNO,R1 ;GET THE BLOCK NO. 80$: MOVB (R1)+,(R2)+ ;INSERT THE STRING BNE 80$ ;STOP ON NULL CLRB (R2) RTS PC ; Convert the character pointed to by R1 to UPPER case UCHAR: CMPB (R1),#'a ; Convert lowercase characters BLO 90$ ; to uppercase CMPB (R1),#'z BHI 90$ BICB #40,(R1) 90$: RETURN .PSECT DATA .SBTTL DATA AREA TOP: .WORD 0 BUFFER: .WORD 0 SIZE: .WORD 0 CLEARS: ;START OF CLEAR AREA SBLOCK: .WORD 0 EBLOCK: .WORD 0 BYMODE: .WORD 0 XMODE: .WORD 0 WMODE: .WORD 0 NMODE: .WORD 0 IGNORE: .WORD 0 NORT11: .WORD 0 ;NON RT11 TAPE SWITCH LBLOCK: .WORD 0 HIBLOK: .WORD 0 ;HIGHEST BLOCK ON DISK FLOPPY: .WORD 0 ;SIZE OF FLOPPY IN RX02 DRIVE CLEARE: ;END OF CLEAR AREA OFLAG: .WORD 0 ;indicate if we are using O option ; Variables for controlling short record displays NUMBYT: .WORD 0 ; number of bytes to display this line NUMBY2: .WORD 0 ; number of bytes to display this line NUMWRD: .WORD 0 ; number of words to display this line .NLIST BEX ;001 ;001 .WORD 0 ;END OF LIST ;**-2 .BYTE 1,'T ;NON RT11 TAPE SWITCH .BYTE 1,'G ;IGNORE INPUT ERRORS .BYTE 1,'N ;NO ASCII IF BYTES .BYTE 1,'W ;WORDS IF BYTES .BYTE 1,'X ;RAD 50 .BYTE 1,'B ;BYTES .BYTE -1,'E ;END BLOCK # .BYTE -1,'S ;START BLOCK # SWTBL: ;+ ;ERROR MSG0: .ASCIZ /No LP/ MSG1: .ASCII 'Invalid option: /' ERROPT: .BYTE 0,0 MSG2: .ASCII /Output error /<200> MSG3: .ASCII /Input error /<200> MSG4: .ASCIZ /Insufficient memory/ MSG5: .ASCIZ /Invalid command/ MSG6: .ASCIZ /File or input device not found/ MSG7: .ASCII /Unexpected EOF /<200> MSG10: .ASCII /?DUMP-W-File created : protected file already exists /<200> ;MAS02 MSG11: .ASCII /Protected file already exists /<200> ;MAS03 MSG12: .ASCII /Device full /<200> ;MAS03 MSG13: .ASCIZ /Wrong version of RT-11/ ;IHZ MSG14: .ASCII /Directory input error/<200> MSG15: .ASCII \Attempted access beyond end of device caused by: /\ MSG15a: .BYTE 0,0 ;- DUMPF: .ASCII /?DUMP-F-/<200> ;001 .EVEN ;**-1 DEFEXT: .WORD 0 .RAD50 "DMP" .WORD 0,0 LP:: .RAD50 /LP / ;MAKE OUTPUT DEVICE GLOBAL FOR PATCH .RAD50 /DUMP/ ;DEFAULT FILENAME .RAD50 /DMP/ DEFSTR: .ASCIZ /DUMP.DMP/ ;DEFAULT FILE FOR PARSER ROUTINE TAPE: .BYTE DEV.MT,DEV.MM,DEV.MS,DEV.MU,DEV.CT ;Valid tape devices ;(must be in order) .BYTE 0 ;Table end .EVEN .WORD LBUFF2 ;**-1 LBUFF1: .BLKW 256. .WORD LBUFF1 LBUFF2: .BLKW 256. LIMIT: .BLKW 1 ;UPPER LIMIT TO DUMP IF LEOT IS NOT WANTED RAREA: .BLKW 6 WAREA: .BLKW 6 LAREA: .BLKW 4 ;EMT AREA FOR LOOKUP IOAREA: .BLKW 6 ;EMT AREA FOR .SPFUN QELM: .BLKW 10. ;QUEUE ELEMENT ;001 TEMBLO: .WORD 0 ;TEM BLOCK FOR SBLOCK DEVFLG: .BYTE 0 ;DEVICE TYPE CODE NODEV: .BYTE 0 HDRMSG: .BYTE 14 BLKNO: .ASCIZ "BLOCK NUMBER " TOOMSG: .ASCIZ " (TRUNCATED)" DEVNAM: .BLKB 60. ;BC1 PROMPT: .ASCII /*/<200> ;PROMPT FOR PARSER ROUTINE STARCL: .BYTE '* CRLF: .BYTE 015,012,0 SLASH: .ASCIZ "/" BLAST: .ASCIZ " *" BL6: .ASCII " " BL5: .ASCII " " BL4: .ASCII " " BL3: .ASCII " " BL2: .ASCII " " BLANK: .ASCIZ " " OUTTM: .BYTE 012,015 .ASCIZ /**** TAPE MARK ****/ VNUM:: .NLCSI PATLEV=:.-2 .EVEN HEDCHK: .BYTE 0 ;FLAG FOR DETECTING HEADER LABEL ;**-1 EOFLAB: .BYTE 0 ;FLAG FOR CHECKING EOF LABEL DETEOF: .BYTE 0 ;NUMBER OF TAPE MARKS DETECTED IN SUCCESSION CHKFLG: .BYTE 1 ;SUPPRESS TAPE MARK FLAG LOKFLG: .BYTE 0 ;TYPE OF LOOKUP FLAG,0-FS,1-NFS SAVERB: .BYTE 0 ;SAVED CONTENTS OF ERRBYT, LOC. 52 ;IHZ TOOBIG: .BYTE 0 ;FLAG INDICATES OVERSIZED MAGTAPE RECORD .EVEN OUTASC: .BLKB 22. ;ASCII OUTPUT FILENAME (14.+8. EXTRA WORDS FOR ; ALLOCATION SWITCH INFO. ;IHZ INASC: .BLKB 14. ;ASCII INPUT FILENAME INDEV: .BLKW 1 ;SAVE INPUT HANDLER OUTDEV: .BLKW 1 ;SAVE OUTPUT HANDLER DEVBLK: .BLKW 4 PARBUF: .BLKW 82. ;PARSER ROUTINE INPUT BUFFER .SBTTL PATCH SPACE .PSECT PATCH ; V4 PATCHING INSTRUCTIONS ; TO PATCH DUMP INSERT THE NEW HIGH ; PROGRAM ADDRESS IN FREEM.THE AREA ; BETWEEN THE NEW HIGH PROGRAM ADDRESS ; AND 'FREE' IS THE PROGRAM PATCH SPACE ; ; V5 PATCHING INSTRUCTIONS ; THERE IS NO PATCH SPACE FOR V5 - WE DO MODULE REPLACEMENT FREEM::FREE ;PATCH SPACE FREE:: ;PATCH SPACE IF THERE ARE SOME ORGTOP = FREEM ;HEADER SPACE PGMTOP = ORGTOP+70. ;HANDLER SPACE .END DUMP ;001