; ; ;****************************************************************************** ; ; MRS BOOTSTRAP ; ; The MRS Bootstrap program is used to load the MRS system in from the ; disk. It assumes that it has been called from a PROM bootstrap routine ; that has homed the head on drive 'A' and has initialized all I/O. ; Specifically this program reads logical sectors 2 through 26 from track ; 0, steps the head in one track and reads logical sectors 1 through 16 ; from track 1. When finished it clears register 'C' and jumps to MRS. ; ; One of the major constraining factors on this bootstrap is that it has ; to fit in 128 bytes (1 sector). ; ; This bootstrap was written for a system using a WETERN DIGITAL 2793 ; disk controller which is also software compatible with their 1793 ; controller. ; ;****************************************************************************** ; ; ; MRSTRT: EQU 0E800H ;STARTING ADDRESS OF MRS STRTOS: EQU 0E800H ;FIRST ADDRESS OCCUPIED BY MRS T0STRT: EQU 01H ;TRACK 0 STARTING SECTOR MINUS 1 T1STRT: EQU 00H ;TRACK 1 STARTING SECTOR MINUS 1 TRACK0: EQU 19H ;SECTORS TO BE READ FROM TRACK 0 TRACK1: EQU 16H ;SECTORS TO BE READ FROM TRACK 1 RSETUP: EQU 8053H ;# OF BYTES PER SECTOR AND DATA REGISTER ADDR TMDLAY: EQU 0AH ;TIME DELAY TO WAIT FOR STATUS REGISTER VALID TRACKS: EQU 02H ;NUMBER OF TRACKS TO BE READ ; ; DISK CONTROLLER CONSTANTS ; STATUS: EQU 50H ;ADDRESS OF DISK CONTROLLER STATUS REGISTER CMDREG: EQU 50H ;ADDRESS OF DISK CONTROLLER COMMAND REGISTER SCTREG: EQU 52H ;ADDRESS OF DISK CONTROLLER SECTOR REGISTER BSYMSK: EQU 01H ;CONTROLLER BUSY STATUS MASK DRQMSK: EQU 02H ;CONTROLLER DATA REQUEST STATUS MASK RDCMD: EQU 80H ;READ SECTOR COMMAND STPCMD: EQU 5CH ;STEP-IN HEAD COMMAND ; ORG 100H ; ; BOOT: LD HL,STRTOS ;GET THE STARTING ADDRESS FOR MRS LD E,TRACKS ;INITIALIZE THE TRACK COUNTER LD A,T0STRT ;GET THE TRACK LOGICAL SECTOR STARTING NUMBER LD D,TRACK0 ;GET NBR OF SECTORS TO BE READ FROM THIS TRACK TRAKRD: LD IX,(SECTOR) ;SET A POINTER TO THE SECTOR NBR TABLE AND A,A ;TEST FOR ZERO FSTSCT: JR Z,DSNBSY ;SKIP THE ALIGNMENT IF IT IS ZERO INC IX ;INCREMENT THE SECTOR TABLE POINTER DEC A ;DECREMENT THE STARTING SECTOR COUNTER JR FSTSCT ;RETURN TO THE FIRST SECTOR ALIGNMENT LOOP DSNBSY: IN A,(STATUS) ;READ THE DISK CONTROLLER STATUS REGISTER AND A,BSYMSK ;MASK OFF ALL BUT THE BUSY BIT JR NZ,DSNBSY ;GO BACK AND TRY AGAIN IF THE DISK IS BUSY NEWSCT: INC IX ;INCREMENT TO THE NEXT SECTOR LD A,(IX+0) ;LOAD ACCUM WITH PHYSICAL SECTOR NUMBER OUT (SCTREG),A ;PUT THE SECTOR NBR IN DISK CONTROLLER LD BC,RSETUP ;GET THE SECTOR BYTE COUNT AND DATA REG ADDR LD A,RDCMD ;PUT THE SECTOR READ COMMAND IN THE ACCUMULATOR OUT (CMDREG),A ;GIVE THE READ COMMAND TO THE DISK CONTROLLER LD A,TMDLAY WTSTAT: DEC A ;DECREMENT THE TIME DELAY COUNTER JR NZ,WTSTAT ;LOOP IF TIME DELAY NOT EXPIRED WTDRQ: IN A,(STATUS) AND A,DRQMSK ;MASK OFF ALL BUT THE DATA REQUEST BIT JR Z,WTDRQ ;IF NO DRQ PRESENT GO BACK AND TRY AGAIN INI ;MOVE THE CHARACTER FROM DATA REGISTER TO MEM JR NZ,WTDRQ ;LOOP IF ALL CHARACTERS NOT TRANSFERRED DEC D ;DECREMENT THE SECTOR COUNTER JR NZ,DSNBSY ;LOOP IF ALL SECTORS ON THIS TRACK NOT READ DEC E JR Z,ENDBT ;IF ALL TRACKS READ, WE'RE DONE WITH THE BOOT LD D,TRACK1 ;GET NUMBER OF SECTORS ON NEXT TRACK DSNBSI: IN A,(STATUS) ;GET THE DISK CONTROLLER STATUS AND A,BSYMSK ;MASK OFF ALL BUT THE BUSY BIT JR NZ,DSNBSI ;LOOP IF THE DISK CONTROLLER IS BUSY LD A,STPCMD ;GET THE STEP HEAD COMMAND OUT (CMDREG),A ;OUTPUT THE STEP COMMAND TO THE DISK CMD REG LD A,T1STRT ;GET STARTING SECTOR NUMBER FOR NEXT TRACK JR TRAKRD ;GO READ THE NEXT TRACK ENDBT: LD C,0 ;MRS RETURN CODE JP MRSTRT ;JUMP TO THE START OF MRS ; ; SECTOR: DW SCTABL ;POINTER TO THE TOP OF THE LOGICAL SECTOR TABLE SCTABL: DB 00H DB 01H DB 07H DB 0DH DB 13H DB 19H DB 05H DB 0BH DB 11H DB 17H DB 03H DB 09H DB 0FH DB 15H DB 02H DB 08H DB 0EH DB 14H DB 1AH DB 06H DB 0CH DB 12H DB 18H DB 04H DB 0AH DB 10H DB 16H ; END BOOT