.MCALL .MODULE .MODULE MSBOOT,VERSION=08,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. .SBTTL RT-11 MAGTAPE SECONDARY BOOTSTRAP ; Edit History: ; ; 001 17-Jan-80 16:38 Davis, Scott (75474) [240,92] ; Add TS11 support ; ; (001) ; 28-MAY-85 George Thissell ; Correct version display message appearance ; ; 003 26-Nov-88 R. Hamilton ; Allow 80-character HDR1 records ; ; 004 11-SEP-1997 Tim Shoppa ; When reading in files longer than 64 blocks from MU devices, ; the secondary bootstrap was failing. Traced to the ADD #1000 ; resulting in V being set past the 64th block, which wasn't ; being cleared by the MU handler. Instead of fixing the handler, ; we fix the secondary bootstrap by wedging a CLV in the loop. ; ;001 .SBTTL SYMBOL AND MACRO DEFINITIONS .MCALL .REGDEF .REGDEF .MACRO MSGTXT TEXT .BYTE 0,0,15,12,0,0,0,0,0,0,0,0,0,0 .ASCII "TEXT" .BYTE 15,12,200 .EVEN .ENDM .MACRO MSGTX1 TEXT .BYTE 0,0,0,0,0,0,0,0,0,0 .ASCII "TEXT" .BYTE 15,12,200 .EVEN .ENDM .MACRO TYPE ADDR MOV ADDR,R0 JSR PC,PRINT .ENDM CR =15 LF =12 CTRLU =25 BCKSLS =134 RUBOUT =177 ;MAGTAPE MINI-HANDLER ENTRY POINT DEFINITIONS MTSPF =400 MTREAD =412 ;001 MTBSPC =426 ;001 ;001 TJSPF =31 ;**-3 TU400 =004567 ;Identifies TMSCP ;008 TURWND =7 TMRWND =60017 TSSPF =77777 ;001 CC.RWD =142010 ;TS11 REWIND ;001 ;001 RTCNT =20 ;RETRY COUNT ;**-1 KRS =177560 KRB =KRS+2 TPS =KRB+2 TPB =TPS+2 .SBTTL MSBOOT MAINLINE .ASECT .=42 ;SET INITIAL STACK START .ENABL LC .=1000 START: CMP 400,#TU400 ;Are we TMSCP? ;008 BNE VERSON ;If not, no need to set up rings ;008 ;008 ; We must make sure that the TMSCP rings won't be overwritten ;008 ; by the image we read in. At the moment, MDUP's take memory up ;008 ; to 110000; so we place the rings starting at NEWR = 110400 ;008 ;008 NEWR =110400 ;008 ;008 MOV #174500,R0 ;TMSCP CSR ;008 CLR (R0)+ ;008 ;008 MOV #0,R1 ;A little delay for slower controllers ;008 1$: DEC R1 ;008 BNE 1$ ;008 ;008 MOV #4000,R3 ;State test bit to step 1 ;008 MOV #NEWTBL,R2 ;Words to send to TK to init it ;008 ;008 3$: BIT R3,(R0) ;current step done? ;008 BEQ 3$ ;loop till it is ;008 MOV (R2)+,(R0) ;get next init word ;008 ASL R3 ;shift test bit to next step ;008 BPL 3$ ;and loop till we've done last step ;008 ;008 MOV #NEWR,R3 ;Copy the new command and response bufs ;008 4$: MOV (R2)+,(R3)+ ;into the region starting at NEWR ;008 CMP R2,#NEWEND ;Are we done yet? ;008 BNE 4$ ;if not, do next word... ;008 ;008 MOV -(R0),R3 ;Start TK polling ;008 MOV #NEWR+6.,R3 ;This is the response packet ownership ;008 ;008 5$: TST (R3) ;Wait ;008 BMI 5$ ;for response ;008 ;008 MOV R3,442 ;We have a new ring now! Poke it ;008 ;into the mini-TMSCP handler. ;008 VERSON: TYPE #VMSG ;PRINT VERSION # FNLOOP: MOV #'*,R3 ;PRINT "*" JSR PC,ECHO JSR PC,ACCEPT ;GET LINE OF INPUT. R0 WILL POINT ;TO START OF LINE ON RETURN MOV #FNAME,R1 ;POINT R1 TO FILENAME IN HDR1 TEMPLATE MOV #18.,R2 ;TEMPLATE IS 18 BYTES LONG 1$: MOVB #40,(R1)+ ;INIT FILENAME IN TEMPLATE DEC R2 ;DONE? BGT 1$ ;BRANCH IF NOT CLRB DOTFLG ;CLEAR ". SEEN FLAG" MOVB #'.,FNAMED ;PUT . IN PLACE IN TEMPLATE MOV #FNAME,R1 ;POINT R1 TO BEGINNING OF NAME PART OF TEMPLATE CMPB (R0),#CR ;DID HE TYPE JUST CR? BEQ FNLOOP ;YES-NULL COMMAND;TRY AGAIN PLOOP: CMPB (R0),#CR ;INPUT LINE FINISHED? BEQ GOODNAME ;YES-FILENAME DESIRED IS IN TEMPLATE CMPB (R0),#'. ;IS NEXT CHAR .? BNE 1$ ;NO-MUST BE FILENAME CHAR TSTB DOTFLG ;. SEEN ALREADY? BNE BADNAME ;YES-ILLEGAL FILENAME CONTRUCTION MOV #FNAMED,R1 ;NO-START FILLING TEMPLATE EXTENSION INCB DOTFLG ;SET . SEEN FLAG BR GOODCHR ;PROCESS CHAR 1$: CMPB (R0),#60 BLT BADNAME CMPB (R0),#72 ;THIS SECTION REJECTS ALL NON-ALPHANUMERIC BLT GOODCHR ;CHARACTERS AS COMPONENTS OF AN CMPB (R0),#101 ;ILLEGAL FILENAME BLT BADNAME CMPB (R0),#132 BGT BADNAME GOODCHR:MOVB (R0)+,(R1)+ ;PUT NAME IN TEMPLATE CMP R1,#FNAMED ;FILENAME FULL? BNE 1$ ;NO-SEE IF EXTENSION FULL CMPB (R0),#'. ;YES-THEN NEXT CHAR BETTER BE . BNE BADNAME ;BRANCH IF FILE NAME >6 CHARS 1$: CMP R1,#FNAME+12 ;EXTENSION FULL? BLOS PLOOP ;NO-CONTINUE BADNAME:TYPE #BNMSG ;TYPE ?ILL FILE NAME? BR FNLOOP ;AND TRY AGAIN .SBTTL FILENAME SEARCH LOOP GOODNAME:MOV #BUFFER,R1 ;READ INTO BUFFER CLR @R1 ; Clear out any residue ;003 JSR PC,MTREAD ;READ BLOCK FOLLOWING LAST FILE MARK BVC 1$ ;BRANCH IF NO HARD ERROR CLC ; 80-char HDR1? - avoid TM code ;003 ;;003 JSR PC,RETRY ;ELSE BACKSPACE FOR RETRY ;;003 BR GOODNAME ;AND TRY AGAIN 1$: BCC FCOMP ;BRANCH IF READ SUCCESSFUL TYPE #FNFMSG ;ELSE DOUBLE TAPE MARK SEEN CMP 402,#TJSPF ;IS TAPE TJU16? BNE 3$ ;NO-TM11 MOV #TURWND,R0 ;LOAD REWIND COMMAND INTO R0 2$: JSR PC,MTSPF+4 ;REWIND TAPE BR FNLOOP ;TRY AGAIN 3$: CMP 402,#TSSPF ;TS11? ;001 BEQ 4$ ;IF EQ YES ;001 MOV #TMRWND,R0 ;LOAD TM11 REWIND COMMAND INTO R0 ;001 BR 2$ ;AND EXECUTE IT ;**-1 4$: MOV PC,-(SP) ;RETURN ADDRESS FROM TS11 REWIND ;001 ADD #FNLOOP-.,@SP ;RETURN ADDRESS FROM TS11 REWIND ;001 JSR R5,MTSPF+40 ;REWIND TAPE ;001 .WORD CC.RWD ;REWIND FUNCTION ;001 ;001 FCOMP: MOV #HDR1,R0 ;POINT R0 TO TEMPLATE ;**-1 MOV #21.,R2 ;21 CHARS IN TEMPLATE ALL TOGETHER 1$: CMPB (R1)+,(R0)+ ;IS THIS "HDR1FILNAM.EXT" REQUESTED? BNE 3$ ;NO 2$: DEC R2 ;MAYBE-DONE COMPARING? BGT 1$ ;BRANCH IF NOT BR FOUND ;YES-THIS IS RIGHT FILE 3$: CMPB -1(R0),#40 ; doesn't compare due to blank in template? BNE NOMTCH ; No. Just doesn't compare DEC R1 ; Yes. Back up tape block buffer ptr BR 2$ ; and try again. NOMTCH: JSR PC,MTSPF ;SPACE PAST NEXT TAPE MARK BVS HERR ;HARD ERROR BCS GOODNAME ;TRY NEXT FILE BR HERR ;FAILED TO SEE MARK WHEN SPACING .SBTTL REQUESTED FILE FOUND-READ IT IN FOUND: JSR PC,MTSPF ;SPACE PAST MARK FOLLOWING HDR1 BVS HERR ;HARD ERROR BCC HERR MOV #BUFFER,R1 ;READ INTO BUFFER 1$: JSR PC,MTREAD ;READ FIRST BLOCK OF SAV FILE INTO BUFFER BVC 2$ ;BRANCH IF NO ERROR JSR PC,RETRY ;ELSE BACKSPACE FOR RETRY BR 1$ ;AND TRY AGAIN 2$: CLR R0 ;POINT R0 TO BEGINNING OF CORE 3$: MOV (R1)+,(R0)+ ;MOVE FIRST HALF BLOCK OF SAV IMAGE INTO CORE CMP R0,#400 ;DONE? BLT 3$ ;NO MOV #LAST,R0 ;POINT TO ROUTINE TO READ REST OF FILE MOV #600,R1 ;WANT TO LOAD IT AT 600 4$: MOV (R0)+,(R1)+ ;MOVE READ ROUTINE OUT OF HARMS WAY CMP R0,#LASTEND ;ALL OF ROUTINE MOVED? BLOS 4$ ;NOT DONE MOV #600,SP ;SET TEMPORARY STACK MOV #1000,R1 ;READ REST OF FILE STARTING AT 1000 JMP 600 ;START LITTLE ROUTINE TO READ ;REST OF PROGRAM .SBTTL CODE TO READ BULK OF SAV FILE AND START IT ;RESIDES AT 600-776 WHEN EXECUTING ;MOVED THERE BY ROUTINE FOUND LAST: CLV ;ADD #1000,R1 MAY SET V FLAG ;008 JSR PC,@#MTREAD ;READ NEXT BLOCK BVC 1$ ;BRANCH IF NO HARD ERROR JSR PC,RETRY ;ELSE BACKSPACE FOR RETRY BR LAST ;AND TRY AGAIN 1$: BCS 3$ ;TAPE MARK MEANS EOF ENCOUNTERED ADD #1000,R1 ;ELSE BUMP CORE ADDR BR LAST ;AND READ NEXT BLOCK 3$: JSR PC,@#MTSPF ;SPACE PAST EOF 1 AT END OF FILE BVS HERR ;TEST FOR HARD ERROR BCC HERR ;MUST HAVE SEEN EOF MARK MOV @#42,SP ;INIT PROGRAM STACK MOV @#40,R0 ;START ADDR INTO R0 BIT #1,R0 ;IS START ADDR ODD? BEQ 4$ ;BRANCH IF NOT HALT ;ILLEGAL START ADDRESS 4$: JMP -(R0) ;START PROGRAM AT RE-ENTER ADDR ;ROUTINE TO BACKSPACE PRIOR TO HARD ERROR RETRY. COUNTS TOTAL ;RETRIES,AND ABORTS IF TOO MANY RETRY: DEC (PC)+ ;DEC RETRY COUNT RTCNT BEQ HERR ;COUNT EXCEEDED-GIVE UP JSR PC,@#MTBSPC ;ELSE BACKSPACE BVS HERR ;HARD ERROR BCS HERR ;SHOULDN'T SEE MARK ON BACKSPACE RTS PC HERR: TYPE #IOERR ;TYPE ?MSBOOT-F-I/O ERROR? BR . ;CAN'T GO ON ;ROUTINE TO PRINT TEXT STRING POINTED TO BY R0 ON TERMINAL PRINT: TSTB @#TPS ;PRINTER READY? BPL PRINT ;NO-WAIT 1$: MOVB (R0)+,@#TPB ;YES-TYPE NEXT BPL PRINT ;AND WAIT RTS PC IOERR: MSGTXT LASTEND: .SBTTL DATA BASE AND HEADER TEMPLATE DOTFLG: .BYTE 0 RUBFLG: .BYTE 0 HDR1: .ASCII /HDR1/ ;HDR1 TEMPLATE FNAME: .ASCII /FILNAM/ FNAMED: .ASCII /.EXT/ .=.+10 .EVEN LBUFF: .BLKW 40. ;LINE BUFFER ;ASCII MESSAGES VMSG:: .ASCII "MSBOOT " .NLCSI PART=RLSVER,TYPE=I .BYTE 40,0,15,12,200,0 BNMSG: MSGTX1 FNFMSG: MSGTX1 .SBTTL SUBROUTINE TO ACCEPT ASCII INPUT LINE ;SUBROUTINE ACCEPT ;GETS ASCII LINE FROM TERMINAL INTO LBUFF,TERMINATED BY CRLF ;HANDLES RUBOUTS AND ^U LIKE RT11 ;ON RETURN,R0 POINTS TO START OF BUFFER ACCEPT: MOV #LBUFF,R0 ;POINT R0 TO LINE BUFFER CLRB RUBFLG ;CLEAR RUBOUT FLAG 1$: TSTB @#KRS ;CHAR AVAILABLE? BPL 1$ ;NO-WAIT TILL ONE IS TYPED MOVB @#KRB,R2 ;YES-FETCH INTO R2 BIC #177600,R2 ;STRIP TO 7 BITS CMPB R2,#CTRLU ;WAS IT CTRL U? BNE 4$ ;NO MOV #CUECHO,R0 JSR PC,PRINT ;YES-ECHO ^U BR ACCEPT 4$: CMPB R2,#RUBOUT ;IS CHAR RUBOUT? BEQ 2$ ;YES TSTB RUBFLG ;WAS LAST CHAR TYPED A RUBOUT? BPL 3$ ;NO MOVB #BCKSLS,R3 ;YES-ECHO BACKSLASH JSR PC,ECHO BR 3$ ;PROCESS CHAR 2$: CMPB R0,#LBUFF ;IS BUFFER EMPTY? BLE 1$ ;YES-IGNORE TSTB RUBFLG ;LAST CHAR A RUBOUT? BMI 6$ ;YES MOVB #BCKSLS,R3 ;NO-ECHO BACKSLASH JSR PC,ECHO 6$: MOVB -(R0),R3 ;GET DELETED CHAR INTO R3 JSR PC,ECHO ;AND ECHO IT MOVB #200,RUBFLG ;SET FLAG THAT LAST CHAR IS RUBOUT BR 1$ 3$: CLRB RUBFLG ;CHAR NOT RUBOUT CMPB R2,#100 BLT 7$ ;BRANCH IF CHAR NOT LETTER BIC #40,R2 ;STRIP LOWER CASE TO UPPER CASE 7$: MOVB R2,R3 JSR PC,ECHO ;ECHO CHAR MOVB R2,(R0)+ ;PUT CHAR IN BUFFER CMPB R2,#CR ;WAS IT CR? BEQ 5$ ;YES CMP R0,#LBUFF+80. ;NO-BUFFER FULL? BLE 1$ ;NO-NEXT CHAR TYPE #TOOMSG ;YES-ERROR BR ACCEPT 5$: MOVB #LF,R3 ;ECHO LF JSR PC,ECHO MOV #LBUFF,R0 ;POINT R0 TO START OF LINE RTS PC TOOMSG: MSGTXT CUECHO:.BYTE '^,'U,15,12,200 .EVEN ;SUBROUTINE ECHO-LITTLE ROUTINE TO TYPE ONE CHAR ON TERMINAL ECHO: TSTB @#TPS ;WAIT FOR PRINTER BPL ECHO MOVB R3,@#TPB ;PRINT CHAR IN R3 RTS PC ;Here's the info necessary to build a new TMSCP buffer ;008 NEWTBL: .WORD 100000 ;008 .WORD NEWR+4 ;008 .WORD 0 ;008 .WORD 1 ;008 ;008 NEWBL: .WORD 0,0 ;008 .WORD NEWRSP-NEWBL+NEWR+4 ;008 .WORD 100000 ;TK is owner ;008 .WORD NEWCOM-NEWBL+NEWR+4 ;008 .WORD 100000 ;TK is owner ;008 NEWRSP: .WORD 40 ;008 .WORD 400 ;008 .WORD 0,0,0,0,0,0,0,0 ;008 .WORD 0,0,0,0,1,1,1,1 ;44 bytes for response packet ;008 .WORD 1,1,1,1,1,1,1,1 ;008 .WORD 1,1,1,1,1,1,1,1 ;008 NEWCOM: .WORD 44 ;command packet length ;008 .WORD 400 ;008 .WORD 0,0,0,0 ;008 .WORD 11 ;on-line command opcode ;008 .WORD 20000 ;clear serious exception ;008 .WORD 0,0,0,0,0,0,0,0 ;24 more bytes of zeroes to pad it out. ;008 .WORD 0,0,0,0 ;008 NEWEND: ;008 ;I/O BUFFER FOR FIRST BLOCK BUFFER: .END START