.TITLE DUAL-DENSITY BOOTSTRAP FOR RX02 ; THIS BOOTSTRAP IS DERIVED FROM THE RX211/RXV21 ; BOOTSTRAP THAT APPEARS IN THE RX01/RX02 POCKET SERVICE ; GUIDE (DEC ORDER NUMBER EK-RX012-PS-002). ; ; IT HAS BEEN MODIFIED SO THAT: ; * IT CAN BE USED FOR UNIT 0 OR UNIT 1 ; * IT WILL FIRST ATTEMPT TO BOOT A DOUBLE-DENSITY DISK. ; IF THAT FAILS, IT WILL THEN ATTEMPT TO BOOT A ; SINGLE-DENSITY DISK. ; ; THE CODE SHOWN BELOW IS FOR UNIT 0. TO BOOT FROM UNIT 1: ; * CHANGE THE WORD AT 002036 FROM 000407 TO 000427 ; * CHANGE THE WORD AT 002132 FROM 000000 TO 000001 ; ; MALCOLM MACLEOD - 11 JUNE 2017 .ASECT .=002000 RX2CS = 177170 ; RXV21 CONTROL/STATUS REGISTER RX2DB = 177172 ; RXV21 DATA BUFFER REGISTER WRDCNT = ^D128 ; 128 FOR DBL-DEN, 64 FOR SGL-DEN MASK = 100240 ; BIT 15=ERR, 7=XFER-RQST, 5=DONE START: MOV #RX2CS,R1 ; PUT ADDR OF RX2CS INTO R1 MOV #MASK,R0 ; PUT BIT MASK INTO R0 CLR R2 ; CLEAR BUS ADDR (DMA DEST'N ADDR) MOV #WRDCNT,R5 ; PUT WORD COUNT (128) INTO R5 MOV #401,R4 ; TRACK 1, SECTOR 1 $1: MOV #RX2DB,R3 ; PUT ADDR OF RX2DB IN R3 ; CHECK THAT THE RXV21 IS READY $2: BIT R0,(R1) ; APPLY MASK TO RX2CS BEQ $2 ; LOOP UNTIL ERR, XFER-RQST OR DONE BMI QUIT ; HALT IF ERR IS SET ; INITIATE A READ-SECTOR COMMAND MOV #407,(R1) ; DEN=DDEN, UNIT=0, FN=RD-SECTOR, GO $3: BIT R0,(R1) ; APPLY MASK TO RX2CS BEQ $3 ; LOOP UNTIL ERR, XFER-RQST OR DONE BMI QUIT ; HALT IF ERR IS SET ; CODE ASSUMES THAT XFER-RQST IS NOW SET (IGNORES DONE) MOVB R4,(R3) ; WRITE SECTOR NUMBER TO RX2DB SWAB R4 ; SWAP TRACK NUMBER TO BITS 0-7 $4: BIT R0,(R1) ; APPLY MASK TO RX2CS BEQ $4 ; LOOP UNTIL ERR, XFER-RQST OR DONE ; CODE ASSUMES THAT XFER-RQST (NOT ERR OR DONE) IS NOW SET MOVB R4,(R3) ; WRITE TRACK NUMBER TO RX2DB ; RXV21 IS NOW READING SECTOR DATA INTO ITS OWN BUFFER SWAB R4 ; SWAP TRACK NUMBER TO BITS 15-8 $5: BIT R0,(R1) ; APPLY MASK TO RX2CS BEQ $5 ; LOOP UNTIL ERR, XFER-RQST OR DONE BMI QUIT ; HALT IF ERR IS SET ; CODE ASSUMES THAT XFER-RQST IS NOW SET (IGNORES DONE) ; THE SECTOR DATA IS NOW IN RXV21'S DATA BUFFER. ; PREPARE TO TRANSFER SECTOR DATA FROM RXV21 TO RAM BY DMA MOV #403,(R1) ; DEN=DDEN, UNIT=ANY, FN=EMPTY-BUF, GO $6: BIT R0,(R1) ; APPLY MASK TO RX2CS BEQ $6 ; LOOP UNTIL ERR, XFER-RQST OR DONE BMI QUIT ; HALT IF ERR IS SET ; CODE ASSUMES THAT XFER-RQST IS NOW SET (IGNORES DONE) MOV R5,(R3) ; LD WORD COUNT INTO RX2WC VIA RX2DB $7: BIT R0,(R1) ; APPLY MASK TO RX2CS BEQ $7 ; LOOP UNTIL ERR, XFER-RQST OR DONE BMI QUIT ; HALT IF ERR IS SET ; CODE ASSUMES THAT XFER-RQST IS NOW SET (IGNORES DONE) MOV R2,(R3) ; LD BUS ADDRS INTO RX2BA VIA RX2DB ; DATA (256 BYTES) IS NOW BEING COPIED TO RAM VIA DMA ADD R5,R2 ; ADD 128 DEC TO BUS ADDRESS ADD R5,R2 ; ADD 128 DEC TO BUS ADDRESS CMPB (R4)+,(R4)+ ; INCREMENT SECTOR NUMBER BY 2 CMPB R4,#7 ; SECTORS 1, 3, 5 & 7 WILL BE READ BLE $2 ; LOOP BACK AND DO NEXT SECTOR MOV #0,R0 ; BOOT DEVICE IS UNIT 0 CLR PC ; GO TO ADDR ZERO ; ERRORS ALWAYS BRANCH TO HERE. ON FIRST ERROR (DURING ; DDEN ATTEMPT) WE CHANGE TO SDEN MODE AND TRY AGAIN. ON ; SECOND ERROR, WE HALT. QUIT: RESET ; RESET ALL I/O DEVICES MOV #START,R0 ; LOAD R0 WITH START ADDRESS MOV #400,R1 ; SETUP MASK BYTE ASR 14(R0) ; CHANGE WRDCNT TO 64 DECIMAL BIC R1,36(R0) ; CHANGE READ-SECTOR CMD TO SDEN BIC R1,72(R0) ; CHANGE EMPTY-BUFFER CMD TO SDEN MOV #17,124(R0) ; CHANGE LAST SECTOR TO D'15 CLR 136(R0) ; PUT HALT AT QUIT LOCATION BR START ; GO BACK AND TRY SDEN MODE .END