.TITLE DYL - LOAD FLOPPY DISK .PSECT .NLIST BEX,TOC .IDENT /V02/ ; ; VERSION 02 ; ; JOHN ISAKSON 12-MAR-80 ; ; PREVIOUSLY WRITTEN AND MODIFIED BY: ; BARRY DALLAVALLE 7-JUN-79 ; KERRY WALSH 24-JAN-80 ; ; MODIFIED BY: ; ; PROGRAM DOWNLOADS A NO HEADER TASK IMAGE TO THE FLOPPY DISK IN ; DRIVE 0 OR 1 ON THE PDP 11-35. PROGRAM PROMPTS FOR A FILENAME: ; ; DYL>DY1:/SGL=TASK.TSK ; ; SWITCHES: ; ; /WB DEFAULT - WRITE BOOT PROGRAM ON TRACK 1 , SECTOR 1 ; ; /-WB USER WILL SUPPLY BOOT PROGRAM IN THE FIRST BLOCK ; OF THE TASK IMAGE ; ; /DBL WRITE IN DOUBLE DENSITY ; /SGL WRITE IN SINGLE DENSITY ; ; EITHER SGL OR DBL, BUT NOT BOTH, IS REQUIRED SYNTAX. ; SWITCHES MAY OCCUR ON EITHER SIDE OF THE EQUAL SIGN ; ; PROGRAM REQUIRES THAT TARGET DY: DEVICE IS DISMOUNTED ; ; TASK IMAGE IS WRITTEN ON EVERY THIRD SECTOR OF THE DISK TO ; FACILITATE FASTER TRANSFER TO MEMORY ; ; ; EQUATED SYMBOLS ; DOUBLE = 2 ;FOR DOUBLE DENSITY ; ; MACRO CALLS ; .MCALL QIOW$S,ALUN$,EXIT$S,LBLDF$,FSRSZ$ .MCALL CSI$,CSI$1,CSI$2,WAIT$,NMBLK$ .MCALL FDBDF$,FDRC$A,FDBK$A,FDOP$A,FINIT$ .MCALL OPEN$R,DIR$,QIOW$,CLOSE$,READ$ .MCALL GCMLB$,GCML$ .MCALL CSI$SW,CSI$ND LBLDF$ ;DEFINE LABEL BLOCK OFFSETS CSI$ ;DEFINE CSI OFFSETS .PAGE .SBTTL DATA AREA ; ; SET UP FDB BLOCK FOR TASK IMAGE FILE ; FDBLD: FDBDF$ FDRC$A FD.RWM FDBK$A BLK,512.,,,IOSB FDOP$A 2,CSIBLK+C.DSDS,NAMEDF NAMEDF: NMBLK$ ,TSK,,SY,0 ;DEFAULT DEVICE AND UNIT (SY0) ; ; FCS BUFFER ; REQUIRE A SIZE OF 1 FOR THIS GCML BUSINESS ; BECAUSE OF BLOCK I/O, TASK IMAGE FILE REQUIRES NO FCS ROOM ; FSRSZ$ 1 ; ; SET UP CSI BLOCK AND SWITCH TABLE ; CSIBLK: .BLKB C.SIZE WBMSK = 1 ;WITH BOOT SWITCH DBLMSK= 2 ;DOUBLE DENSITY SWITCH SGLMSK= 4 ;SINGLE DENSITY SWITCH MASKWD: .WORD WBMSK ;/WB BY DEFAULT SWTAB: CSI$SW WB,WBMSK,MASKWD,SET,NEG CSI$SW SGL,SGLMSK,MASKWD,SET CSI$SW DBL,DBLMSK,MASKWD,SET CSI$ND .EVEN ; ; SET UP GET COMMAND LINE BUFFER AREA ; GCMLB: GCMLB$ 0,DYL,,5 ;MAX DEPTH IS 0, PROMPT IS DYL>, LUN 5 ; ; LOCAL DATA ; OUTBLK: .BLKB 160. ;OUTPUT BUFFER FOR $EDMSG ROUTINE ARGBLK: .BLKW 7 ;ARGUMENT BUFFER FOR $EDMSG ROUTINE IOSB: .BLKW 2 ;I/O STATUS BLOCK BLKSIZ: .BLKW 1 ;NUMBER OF BYTES PER FLOPPY SECTOR BLKCNT: .WORD 0 ;TOTAL # OF 200 OR 400(8) BLOCKS IN TASK VBNADR: .BLKW 2 ;TASK VIRTUAL BLOCK NUMBER PBN: .WORD 0 ;FLOPPY PHYSICAL BLOCK NUMBER LBSA: .WORD 0 ;TASK LOAD ADDRESS LBXFR: .WORD 0 ;TASK TRANSFER ADDRESS BLK: .BLKB 512. ;TASK VIRTUAL BLOCK BUFFER ; ; ERROR MESSAGES ; MSG1: .ASCIZ '%N%NDYL - MOUNTED VOLUME ON DEVICE' MSG1A: .ASCIZ '%N%NDYL - ASSIGN FAILURE ON DEVICE' ;KAW MSG2: .ASCIZ '%N%NDYL - COMMAND LINE SYNTAX ERROR' MSG2A: .ASCIZ '%N%NDYL - INVALID, MISSING, OR CONFLICTING SWITCH(ES)' MSG3: .ASCIZ '%N%NDYL - FILENAME PARSE ERROR' ;KAW MSG4: .ASCIZ '%N%NDYL - UNABLE TO OPEN TASK FILE' ;KAW MSG5: .ASCIZ '%N%NDYL - LABEL BLOCK READ ERROR' ;KAW MSG6: .ASCIZ '%N%NDYL - TASK IMAGE TOO LARGE' ;KAW MSG7: .ASCIZ '%N%NDYL - I/O ERROR ON OUTPUT DEVICE' MSG8: .ASCIZ '%N%NDYL - READ ERROR ON TASK FILE' ;KAW MSG9: .ASCIZ '%N%NDYL - WRITE ERROR ON DELETED DATA MARK' ;KAW MSG10: .ASCIZ '%N%NDYL - TASK MUST BE BUILT WITH NO HEADER' ;KAW MSG10A: .ASCIZ '%N%NDYL - WARNING: TASK IS NOT SELF-STARTING' MSG11: .ASCIZ '%N%NDYL - LOAD ADDRESS FALLS WITHIN BOOT BLOCK' MSG12: .ASCIZ '%NDYL - FORMATTING OUTPUT DEVICE' ; ; ERROR MESSAGES - GCMERR ROUTINE ; IOR: .ASCIZ '%N%NDYL - I/O ERROR ON INPUT' ;KAW OPR: .ASCIZ '%N%NDYL - UNABLE TO OPEN COMMAND FILE' ;KAW BIF: .ASCIZ '%N%NDYL - FILENAME SYNTAX ERROR' ;KAW MDE: .ASCIZ '%N%NDYL - INDIRECT NESTING VIOLATION' ;KAW RBG: .ASCIZ '%N%NDYL - LINE TOO BIG' ;KAW .EVEN ; ; TASK DESCRIPTOR MESSAGE ; INBLK: .ASCII '%N%15STASK NAME= %2R%5SPARTITION= %2R%N' .ASCIZ '%6SLOAD ADDRESS= %O%5SSIZE= %O%5SENTRY POINT= %O' .PAGE .SBTTL MAIN ROUTINE DYL: FINIT$ ;INIT FCS BUFFERS ;KAW 1$: MOV #WBMSK,MASKWD ;DEFAULT TO /WB GCML$ #GCMLB ;GET COMMAND LINE BCC 2$ ;OK, CONTINUE CMPB #GE.EOF,G.ERR(0) ;WAS IT AN EOF? BEQ EXIT ;YES, EXIT CALL GCMERR ;NO, REPORT THE ERROR BR 1$ ;AND TRY AGAIN 2$: TST G.CMLD(0) ;ANY INPUT CHARACTERS? BEQ 1$ ;NO, PROMPT AGAIN CSI$1 #CSIBLK,GCMLB+G.CMLD+2,GCMLB+G.CMLD ;CHECK COMMAND LINE BCC 4$ ;OK, CONTINUE 3$: MOV #MSG2,R1 ;ERROR, REPORT AND PROMPT CALL EDOUT BR 1$ 4$: BITB #CS.EQU,C.STAT(0) ;IS THERE AN EQUAL SIGN? BEQ 3$ ;NO, ERROR CSI$2 #CSIBLK,OUTPUT,#SWTAB ;PARSE DEVICE NAME AND SWITCH(ES) BCS 3$ ;ERROR, REPORT TST C.DEVD(0) ;DEVICE NAME GIVEN? BEQ 3$ ;NO, ERROR. CALL GETDEV ;YES, CHECK IF LEGAL BCC 5$ ;CC => LEGAL OUTPUT DEVICE MOV #MSG1A,R1 ;PRINT ERROR MESSAGE CALL EDOUT BR 1$ 5$: CSI$2 #CSIBLK,INPUT,#SWTAB ;PARSE INPUT FILE TST C.FILD(0) ;IS THERE A FILENAME GIVEN BEQ 1$ ;NO, GO GET ONE CALL CHKSWT ;CHECK THE SWITCHES BCC 6$ ;CC => OK MOV #MSG2A,R1 ;REPORT INVALID SWITCH(ES) CALL EDOUT BR 1$ ;TRY AGAIN 6$: CALL OPENF ;GO OPEN TASK FILE BCS 9$ ;IF ERROR, PROMPT AGAIN CALL SETDY ;SET PHYSICAL CHARACTERISTIC ON DEVICE BCS 9$ ;ERROR CALL TSKMSG ;SEND MESSAGE BCS 9$ ;IF ERROR, PROMPT AGAIN MOV #26.,PBN ;TRACK 1 SECTOR 1 BIT #WBMSK,MASKWD ;WRITE BOOT? BEQ 8$ ;NO, LOAD TASK CMP BLKSIZ,LBSA ;IS LOAD ADDRESS > BLKSIZ BMI 7$ ;YES, CONTINUE MOV #MSG11,R1 ;NO, REPORT ERROR AND RETURN CALL EDOUT 9$: CLOSE$ #FDBLD ;CLOSE TASK IMAGE FILE BR 1$ 7$: CALL BTLOAD ;WRITE BOOTSTRAP ;KAW BCS 9$ ;IF ERROR, PROMPT AGAIN ;KAW 8$: CALL DYLOAD ;LOAD TASK TO DISK ;KAW BR 9$ EXIT: EXIT$S .PAGE .SBTTL TSKMSG - GET TASK ATTRIBUTES ; READ LABEL BLOCK OF TASK IMAGE ; AND SET UP ARGUMENT LIST FOR ; TASK DESCRIPTOR MESSAGE TSKMSG: CLR VBNADR ;CLEAR HIGH BITS OF DISK ADDRESS MOV #1.,VBNADR+2 ;INSERT LABEL BLOCK # IN LOW BITS READ$ #FDBLD,#BLK,#512.,#VBNADR,,#IOSB ;READ 512 BYTES OF TASK BCS 10$ ;ERROR ON READ WAIT$ #FDBLD,,#IOSB BCC 1$ ;READ OPERATION SUCCESSFUL 10$: MOV #MSG5,R1 ;ERROR, REPORT AND RETURN CALL EDOUT BR 3$ 1$: MOV #BLK,R3 ;GET ADDRESS OF LABEL BLOCK DATA MOV L$BFLG(R3),R1 ;GET TASK FLAG WORD BIT #TS$NHD,R1 ;TEST FOR NO HEADER BNE 2$ ;NO HEADER, CONTINUE MOV #MSG10,R1 ;HEADER, REPORT ERROR AND RETURN CALL EDOUT BR 3$ 2$: MOV #ARGBLK,R4 ;GET ADDRESS OF ARG BLOCK FOR EDOUT MOV L$BTSK(R3),(R4)+ ;GET TASK NAME MOV L$BTSK+2(R3),(R4)+ MOV L$BPAR(R3),(R4)+ ;GET PARTITION NAME MOV L$BPAR+2(R3),(R4)+ MOV L$BSA(R3),LBSA ;GET LOAD ADDRESS MOV LBSA,(R4)+ 21$: MOV L$BMXZ(R3),R1 ;GET TASK SIZE IN 100(8) BYTES MOV R1,BLKCNT ;DETERMINE # OF BLOCKS ASR BLKCNT ;DIVIDE BY 2 ;KAW BCC 25$ ;NO REMAINDER ;KAW INC BLKCNT ;ELSE ROUND UP ;KAW 25$: CMP BLKSIZ,#200 ;SINGLE DENSITY? BEQ 22$ ;YES, BLKCNT IS CORRECT ASR BLKCNT ;DIVIDE BY 2 ;KAW BCC 22$ ;NO REMAINDER INC BLKCNT ;ROUND UP 22$: .REPT 6 ;MULTIPLY BY 100(8) ASL R1 .ENDR MOV R1,(R4)+ ;GOT TASK SIZE IN BYTES MOV L$BXFR(R3),LBXFR ;GET TRANSFER ADDRESS MOV LBXFR,(R4) MOV L$BHRB(R3),VBNADR+2 ;GET OFFSET-1 TO TASK HEADER MOV #INBLK,R1 ;SET UP ARGS FOR EDOUT MOV #ARGBLK,R2 CALL EDOUT BIT #1,LBXFR ;IS XFR ADDRESS ODD? BEQ 23$ ;NO, RETURN MOV #MSG10A,R1 ;YES, SEND WARNING CALL EDOUT 23$: CLC ;SUCCESS, RETURN WITH CARRY CLEAR RETURN 3$: SEC ;FAILURE, RETURN WITH CARRY SET RETURN .PAGE .SBTTL SUPPORT ROUTINES ; ; OPEN TASK IMAGE FILE ; OPENF: OPEN$R #FDBLD ;OPEN FILE BCC 1$ ;SUCCESS MOV #MSG4,R1 ;FAILED, REPORT ERROR CALL EDOUT SEC ;FAILURE, RETURN WITH CARRY SET 1$: RETURN ; ; LOAD BOOTSTRAP LOADER ONTO TRACK 1, SECTOR 1 (PBN=26.) ; BTLOAD: JSR R2,$SAVVR ;SAVE R0-R2 MOV LBSA,LDPT ;INSERT START ADDRESS IN BOOT IMAGE MOV LBXFR,XFRADR ;INSERT TRANSFER ADDRESS IN BOOT IMAGE MOV LBSA,LDPTS ;SAME FOR SINGLE BOOT MOV LBXFR,XFRS ;AND XFER ADDRESS MOV #BOOTS,R0 ;ASSUME SINGLE DENSITY MOV #BOOTSL,R1 BIT #SGLMSK,MASKWD ;IS IT SINGLE? BNE 1$ ;BR, YES MOV #BOOTD,R0 ;IT'S DOUBLE MOV #BOOTDL,R1 ;LENGTH OF BOOT ROUTINE 1$: QIOW$S #IO.WPB,#1,#1,,#IOSB,, ;WRITE BOOT ON DISK BCS 2$ ;ERROR, REPORT AND RETURN TSTB IOSB ;IO ERROR? BMI 2$ ;BR, YES ADD #3.,PBN ;ADJUST TO TRACK 1 SECTOR 4 BR 3$ 2$: MOV #MSG7,R1 ;REPORT ERROR AND RETURN CALL EDOUT SEC 3$: RETURN ;+ ; CHKSWT - CHECK INPUT SWITCHES FOR /SGL OR /DBL ; ; INPUTS: ; USES MASKWD TO CHECK SWITCHES ; ; OUTPUTS: ; CARRY BIT STATUS ; SETS "BLKSIZ" TO EITHER 200 (FOR SINGLE) OR 400 (DOUBLE) ;- CHKSWT: CLC ;ASSUME NO ERROR BIT #SGLMSK!DBLMSK,MASKWD ;SEE IF EITHER ONE IS ONE BEQ 1$ ;NONE ON => ERROR MOV #400,BLKSIZ ;ASSUME DOUBLE BIT #SGLMSK,MASKWD ;IS IT? BEQ 2$ ;EQ => NOT SINGLE, MUST BE DOUBLE MOV #200,BLKSIZ ;ASSUME SINGLE BIT #DBLMSK,MASKWD ;IS IT? BEQ 2$ ;NOT DOUBLE, MUST BE SINGLE 1$: SEC ;EITHER NONE OR BOTH SWITCHES PRESENT 2$: RETURN .PAGE .SBTTL TASK IMAGE LOAD ; ; LOAD TASK IMAGE ; LOADING BEGINS ON TRACK 1 SECTOR 4 IF /WB SWITCH IN EFFECT ; LOADING BEGINS ON TRACK 1 SECTOR 1 IF /-WB SWITCH IN EFFECT ; DYWPB: QIOW$ IO.WPB,1,1,,IOSB,,<0,256.,,,0> DYWDD: QIOW$ IO.WDD,1,1,,IOSB,, DYLOAD: INC VBNADR+2 ;POINT TO NEXT TASK BLOCK (512. BYTE) READ$ #FDBLD,#BLK,#512.,#VBNADR,,#IOSB ;READ BLOCK OF TASK IMAGE BCS 4$ ;ERROR, REPORT IT WAIT$ #FDBLD,,#IOSB BCS 4$ ;ERROR, REPORT IT MOV #BLK,R5 ;START ADDRESS FOR TASK BLOCK MOV #2,R4 ;ASSUME DOUBLE DENSITY MOV #256.,DYWPB+Q.IOPL+2 MOV #256.,DYWDD+Q.IOPL+2 ;BYTE COUNT IN THE BLOCK CMP #400,BLKSIZ ;IS IT DOUBLE DENSITY? BEQ 1$ ;BR, YES ASL R4 ;SINGLE => 4 SECTORS PER BLOCK ASR DYWPB+Q.IOPL+2 ;HALF THE BYTES CAN FIT ASR DYWDD+Q.IOPL+2 1$: MOV R5,DYWPB+Q.IOPL ;SET UP START ADDRESS IN DPB ;KAW MOV PBN,DYWPB+Q.IOPL+10 ;SET UP PBN IN DPB DIR$ #DYWPB ;WRITE SECTOR BCS 3$ ;IF ERROR, GO REPORT IT ;KAW ADD BLKSIZ,R5 ;ADJUST START OF NEXT SECTOR ADD #3.,PBN ;ADJUST DY SECTOR +3 ;KAW ;WRITE ON EVERY THIRD SECTOR ;KAW CMP #2001.,PBN ;OVER LIMIT OF DISK? ;KAW BPL 11$ ;IF PL - NO ;KAW SUB #2001.+26.,PBN ;ELSE GO BACK TO TRACK 1 ;KAW CMP PBN,#26. ;BACK TO SECTOR 1 TRACK 1? ;KAW BEQ 10$ ;YES,RETURN WITH ERROR ;KAW 11$: DEC BLKCNT ;WAS THAT THE LAST SECTOR? ;KAW BEQ 2$ ;YES, WRITE A FINAL DUMMY SECTOR;KAW SOB R4,1$ ;LAST SECTOR THIS BLOCK? BR DYLOAD ;YES, GET ANOTHER TASK BLOCK ;KAW 10$: MOV #MSG6,R1 ;REPORT OVER LIMIT ERROR ;KAW BR 6$ 2$: MOV PBN,DYWDD+Q.IOPL+10 ;SET UP PBN IN DPB DIR$ #DYWDD ;WRITE DUMMY SECTOR WITH DELETED DATA BCS 5$ ;ERROR, GO REPORT IT RETURN 3$: MOV #MSG7,R1 ;REPORT DISK WRITE ERROR BR 6$ 4$: MOV #MSG8,R1 ;REPORT TASK READ ERROR BR 6$ 5$: MOV #MSG9,R1 ;REPORT DELETED DATA WRITE ERROR 6$: CALL EDOUT ;DISPLAY ERROR SEC ;SET CARRY - ERROR CODE RETURN .PAGE .SBTTL MORE SUPPORT ROUTINES ;+ ; GETDEV - ATTACH DEVICE ON LUN1 ; ; INPUTS: ; R0 = CSIBLK FROM PARSER ; ; OUTPUTS: ; CARRY BIT STATUS ;- ALUN: ALUN$ 1,DY ATTDET: QIOW$ ,1,1,,IOSB GETDEV: CALL $SAVAL ;SAVE REGISTERS MOV C.DEVD+2(0),R1 ;GET ADDRESS OF DEVICE STRING MOV C.DEVD(0),R0 ;GET LENGTH OF DEVICE STRING MOV #ATTDET,R2 ;POINT TO QIO DPB MOV #ALUN,R3 ;POINT TO ALUN DPB MOV #IO.DET,Q.IOFN(2) ;DETACH DEVICE ON LUN 1 DIR$ R2 ;DETACH CLR A.LUNU(3) ;ASSUME DY0: CMPB #'D,(1)+ ; MUST BE "DY" BNE 4$ ;NE => ERROR CMPB #'Y,(1)+ ;LOOK FOR DY BNE 4$ ;NE => ERROR SUB #2,R0 ;TWO LESS CHARACTERS TO LOOK FOR BEQ 3$ ;EQ => NO UNIT GIVEN 1$: DEC R0 ;ONLY LAST CHAR IS SIGNIFICANT BEQ 2$ INC R1 ;NEXT CHAR BR 1$ ;TRY AGAIN 2$: MOVB @R1,R1 ;GET ASCII UNIT NO BIC #^C77,R1 ;CLEAR GARBAGE SUB #60,R1 ;MAKE BINARY MOV R1,A.LUNU(3) ;MOVE TO DPB 3$: DIR$ R3 ;ASSIGN THE LUN BCS 5$ ;CS => ASSIGN ERROR MOV #IO.ATT,Q.IOFN(2) ;TRY TO ATTACH DIR$ R2 TSTB IOSB ;SUCCEED? BPL 5$ ;BR, YES MOV #MSG1,R1 ;NO, REPORT ERROR CALL EDOUT 4$: SEC ;SIGNAL ERROR 5$: RETURN ;THAT'S ALL ;+ ; ; SEND MESSAGES TO TI: ; ;- QDPB: QIOW$ IO.WAL,5,5,,,, ;TI OUTPUT MESSAGES EDOUT: JSR R2,$SAVVR ;SAVE R0-R2 MOV #OUTBLK,R0 ;GET OUTPUT ADDRESS CALL $EDMSG ;EDIT MESSAGE MOV R1,QDPB+Q.IOPL+2 ;INSERT BYTE COUNT IN DPB DIR$ #QDPB ;OUTPUT THE MESSAGE RETURN ;EXIT ;+ ; SETDY - SET THE RIGHT DENSITY ON DY: ; ; INPUTS: ; USES MASKWD FROM CSI PARSER ; ; OUTPUTS: ; C-BIT STATUS ; ; EFFECTS: ; IF I/O ERROR ON FLOPPY, IT IS REPORTED ; CLOBBERS R0, R1 ;- SECDY: QIOW$ ,1,1,,IOSB SETDY: MOV #SECDY,R0 ;POINT TO DPB MOV #IO.SEC,Q.IOFN(0) ;SENSE MEDIA CHARACTERISTICS DIR$ R0 ;ISSUE REQUEST BCS 3$ ;DIRECTIVE REJECTED TSTB IOSB ;SUCCEED? BMI 3$ ;I/O ERROR BIT #DBLMSK,MASKWD ;DID WE WANT DOUBLE? BEQ 1$ ;BR, NO TST IOSB+2 ;DID WE GET DOUBLE? BNE 4$ ;YES, EVERYTHING IS OK MOV #DOUBLE,Q.IOPL(0) ;SET DOUBLE DENSITY BR 2$ 1$: TST IOSB+2 ;LOOKING FOR SINGLE DENSITY BEQ 4$ ;EVERYTHING IS JOTO CLR Q.IOPL(0) ;FORMAT IT SINGLE 2$: MOV #IO.SMD,Q.IOFN(0) ;SET MEDIA DENSITY COMMAND MOV #MSG12,R1 ;PRINT FORMAT MESSAGE CALL EDOUT DIR$ R0 ;ISSUE COMMAND BCS 3$ ;I/O ERROR TSTB IOSB ;SUCCESS? BPL 4$ ;YUP, EXIT 3$: MOV #MSG7,R1 ;REPORT ERROR CALL EDOUT SEC 4$: RETURN ;ALL DONE ;+ ; ; ERROR PROCESSING FOR GCML ERRORS ; ;- GCMERR: JSR R2,$SAVVR ;SAVE R0-R2 MOVB G.ERR(0),R0 ;GET GCMLB ERROR MOV #IOR,R1 ;ASSUME IOR CMPB #GE.IOR,R0 ;WAS IT? BEQ 1$ ;BR YES MOV #OPR,R1 ;TRY OPR CMPB #GE.OPR,R0 ;WAS IT? BEQ 1$ ;BR YES MOV #BIF,R1 ;ASSUME BIF CMPB #GE.BIF,R0 BEQ 1$ MOV #MDE,R1 CMPB #GE.MDE,R0 BEQ 1$ MOV #RBG,R1 ;NONE OF THE ABOVE 1$: CALL EDOUT ;PRINT MESSAGE RETURN ;BACK TO MAINLINE .PAGE .SBTTL BOOTSTRAP LOADER - RX02 .PSECT BOOTD ; ; THIS BOOTSTRAP IS WRITTEN TO TRACK 1 SECTOR 1 OF THE FLOPPY DISK ; WHEN THE /-WB SWITCH IS NOT ISSUED. ITS FUNCTION IS TO READ IN ; THE TASK IMAGE FROM EVERY THIRD SECTOR BEGINNING WITH TRACK 1 ; SECTOR 4. READING SECTORS CONTINUES UNTIL A SECTOR WITH A ; DELETED DATA MARK IS READ. CONTROL IS THEN TRANSFERRED TO THE ; TRANSFER ADDRESS IF IT IS EVEN. IF NOT IT CAUSES THE COMPUTER ; TO HALT. ; ; EQUATED SYMBOLS ; SECTOR=4 ; STARTING SECTOR TRACK=1 ; STARTING TRACK RCSR=177170 ; FLOPPY CSR ADDR. RBUF=177172 ; FLOPPY BUFFER ADDR. READ=407 ; READ SECTOR FUNCTION CODE ;KAW EMPTY=403 ; EMPTY BUFFER FUNCTION CODE ;KAW ;**-2 ; ; START OF BOOT PROGRAM ; BOOTD: NOP ; FIRST INSTRUCTION MUST BE NOP MOV #SECTOR,R4 ; STARTING SECTOR -> REG 4 MOV #TRACK,R5 ; STARTING TRACK -> REG 5 MOV (PC)+,R0 ; PROGRAM LOAD POINT -> REG 0 LDPT: .WORD 0 ; START ADDRESS INSERTED HERE BY BTLOAD MOV #RCSR,R1 ; FLOPPY CSR ADDR. -> REG 1 MOV #RBUF,R2 ; FLOPPY BUFFER ADDR. -> REG 2 5$: MOV #READ,(R1) ; START READ 10$: BITB #200,(R1) ; TEST TR IF READ DONE BEQ 10$ ; IF NOT DONE WAIT MOV R4,(R2) ; TRANSFER SECTOR 20$: BITB #200,(R1) ; TEST TR IF TRANSFER DONE BEQ 20$ ; IF NOT DONE WAIT MOV R5,(R2) ; TRANSFER TRACK 30$: BITB #40,(R1) ; TEST DONE IF TRANSFER READ SECTOR COMPLETE BEQ 30$ ; IF NOT DONE WAIT BIT #100,(R2) ; TEST FOR DELETED DATA MARK BNE 100$ ; WHEN DELETED DATA MARK START PROGRAM ADD #3,R4 ; UPDATE SECTOR COUNT CMP #26.,R4 ; SECTOR COUNT >= MAX SECTOR # (26.) BGE 40$ ; BRANCH NOT NEW TRACK SUB #26.,R4 ; RESET SECTOR INC R5 ; INCREMENT TRACK CMP R5,#76. ; TRACK > 76? ;KAW BLE 40$ ; IF LE - NO ;KAW MOV #1,R5 ; ELSE START OVER AT TRACK 1 ;KAW 40$: MOV #EMPTY,(R1) ; START EMPTYING BUFFER ;KAW 70$: TSTB (R1) ; TEST FOR DONE OR TR BIT ;KAW BEQ 70$ ; IF NO BIT WAIT ;KAW MOV #128.,(R2) ; WORD COUNT ;KAW 72$: TSTB (R1) ; WAIT FOR TR ;KAW BEQ 72$ ;KAW MOV R0,(R2) ; BUFFER ADDRESS ;KAW 80$: BIT #40,(R1) ; WAIT (DONE BIT) FOR BUFFER EMPTY ;KAW BEQ 80$ ;KAW ADD #256.,R0 ; FOR NEXT SECTOR ;KAW BR 5$ ;KAW 100$: ASR XFRADR ; IS TRANSFER ADDRESS ODD? ;**-7 BCC 110$ ; NO, THEN JUMP TO IT HALT ; YES, THEN HALT 110$: ASL XFRADR ; RESTORE TRANSFER ADDRESS JMP @(PC)+ ; JUMP TO IT XFRADR: .WORD 0 ; TRANSFER ADDRESS INSERTED HERE BY BTLOAD NOP BOOTDL=.-BOOTD ; BOOTDL MUST EQUAL 200(8) (128. BYTES) .PAGE .SBTTL BOOTSTRAP LOADER - RX01 .PSECT BOOTS ; ; THIS BOOTSTRAP IS WRITTEN TO TRACK 1 SECTOR 1 OF THE FLOPPY DISK ; WHEN THE /-WB SWITCH IS NOT ISSUED. ITS FUNCTION IS TO READ IN ; THE TASK IMAGE FROM EVERY THIRD SECTOR BEGINNING WITH TRACK 1 ; SECTOR 4. READING SECTORS CONTINUES UNTIL A SECTOR WITH A ; DELETED DATA MARK IS READ. CONTROL IS THEN TRANSFERRED TO THE ; TRANSFER ADDRESS IF IT IS EVEN. IF NOT IT CAUSES THE COMPUTER ; TO HALT. ; ; EQUATED SYMBOLS ; SECTOR=4 ; STARTING SECTOR TRACK=1 ; STARTING TRACK RCSR=177170 ; FLOPPY CSR ADDR. RBUF=177172 ; FLOPPY BUFFER ADDR. READ=7 ; READ SECTOR FUNCTION CODE EMPTY=3 ; EMPTY BUFFER FUNCTION CODE ; ; START OF BOOT PROGRAM ; BOOTS: NOP ; FIRST INSTRUCTION MUST BE NOP MOV #SECTOR,R4 ; STARTING SECTOR -> REG 4 MOV #TRACK,R5 ; STARTING TRACK -> REG 5 MOV (PC)+,R0 ; PROGRAM LOAD POINT -> REG 0 LDPTS: .WORD 0 ; START ADDRESS INSERTED HERE BY BTLOAD MOV #RCSR,R1 ; FLOPPY CSR ADDR. -> REG 1 MOV #RBUF,R2 ; FLOPPY BUFFER ADDR. -> REG 2 5$: MOV #READ,(R1) ; START READ 10$: BITB #200,(R1) ; TEST TR IF READ DONE BEQ 10$ ; IF NOT DONE WAIT MOV R4,(R2) ; TRANSFER SECTOR 20$: BITB #200,(R1) ; TEST TR IF TRANSFER DONE BEQ 20$ ; IF NOT DONE WAIT MOV R5,(R2) ; TRANSFER TRACK 30$: BITB #40,(R1) ; TEST DONE IF TRANSFER READ SECTOR COMPLETE BEQ 30$ ; IF NOT DONE WAIT BIT #100,(R2) ; TEST FOR DELETED DATA MARK BNE 100$ ; WHEN DELETED DATA MARK START PROGRAM ADD #3,R4 ; UPDATE SECTOR COUNT CMP #26.,R4 ; SECTOR COUNT >= MAX SECTOR # (26.) BGE 40$ ; BRANCH NOT NEW TRACK SUB #26.,R4 ; RESET SECTOR INC R5 ; INCREMENT TRACK 40$: MOV #EMPTY,(R1) ; START EMPTYING BUFFER 70$: TSTB (R1) ; TEST FOR DONE OR TR BIT BEQ 70$ ; IF NO BIT WAIT BIT #40,(R1) ; TEST (DONE BIT) IF BUFFER EMPTY BNE 5$ ; IF EMPTY BRANCH NEXT SECTOR MOVB (R2),(R0)+ ; TRANSFER A BYTE BR 70$ 100$: ASR XFRS ; IS TRANSFER ADDRESS ODD? BCC 110$ ; NO, THEN JUMP TO IT HALT ; YES, THEN HALT 110$: ASL XFRS ; RESTORE TRANSFER ADDRESS JMP @(PC)+ ; JUMP TO IT XFRS: .WORD 0 ; TRANSFER ADDRESS INSERTED HERE BY BTLOAD .REPT 14 ; FILL REST OF BLOCK WITH NOP NOP .ENDR BOOTSL=.-BOOTS ; BOOTSL MUST EQUAL 200(8) (128. BYTES) .END DYL ;KAW