TITLE BIOS LOADER TRANSIENT (BLT) LIST NOCOND ;*************************************************************************** ; ; Bios loader firmware ; ;*************************************************************************** ; ; The BIOS loader is read into the DCM sector buffer after the DCM program ; has initialized. This program then reads the BIOS module (1k) into DD bank ; 1. The command block in DCM is set to indicate the BIOS module size & it's ; load address. The BIOS loader program is generated by MOVCPM.COM as the ; cold start loader (900-97F Hex). ; ;*************************************************************************** ; ; REVISIONS: ; 1.0 - ; Release ; 1.1 - ; Frees this routine from re-assembly due to changing BIOS params. ; LOAD ADDR & SIZE are now words in BIOS at 'INIT' - 2 & 'INIT' - 4 ; respectivly. 'INIT' pointer happens to be at Cold Start (BIOS) + 1. ; DD Command Block is left initialized to next BIOS sector to read if ; BIOS exceeds 1K. The System Boot Driver can then continue to read ; remaining sectors of BIOS until done. ; ; 1.2 - 20 FEB 83 GRH ; Include DDDEFINE.INC into header, any changes for 62k system. ; ; 1.3 - 1 SEP 83 GRH ; Modify for sector deblocking DCM. ; ; 1.4 - 30 OCT 85 GRH ; Modify for updated include file. Remove communication block setup ; for boot continuation - allows boot from other than drive 0. ; VERSN EQU '12' ; ;*************************************************************************** FALSE EQU 0 TRUE EQU NOT FALSE ; ;*INCLUDE JDDLOC.DEF ; LIST OFF *INCLUDE JDDLOC.DEF LIST ON ; ; BIOS PROGRAM LINKAGE ; SECBG EQU 13 ;1ST SECTOR OF BIOS SECNM EQU 8 ;# SECTORS SECEX EQU SECBG+SECNM-1 ;LAST BIOS SECTOR CMDBLK EQU BANK0 + 0370H ;START OF COMMUNICATION BLOCK SUBTTL MAIN PROGRAM ORG BUFBG ;PROGRAM START POINT ; ; INIT BIOS READ OPERATION ; BEGIN: LD HL,BANK1 ;SET LOAD ADDR LD SP,RDSEC ;INIT STACK TO HARMLESS PLACE FOR NOW ; ; SET UP FOR EACH READ SECTOR COMMAND ; RDSEC: LD IY,RDTST ;SET NMI VECTOR LD A,(SECTOR) ;SET 1ST SECTOR XOR C OUT WDSEC,A LD A,DCRDS ;READ SECTOR CMD XOR C OUT WDCMD,A EX (SP),HL EX (SP),HL EX (SP),HL EX (SP),HL ; ; READ SECTOR OPERATION ; RDBYT: IN A,XPDSH ;WAIT FOR DATA IN A,WDDTA ;PUT DATA INTO MEMORY XOR C LD (HL),A INC HL JR RDBYT ; ; CHECK READ SECTOR STATUS, REPEAT UNTIL BIOS LOADED ; RDTST: AND DMRER AND 0FEH ;IF ERROR THEN EXIT JR NZ,ERRORS LD A,(SECTOR) ;IF LAST SECTOR THEN FINISHED CP SECEX JR Z,FINISH INC A ;ELSE BUMP SECTOR & REPEAT LD (SECTOR),A JR RDSEC ; ; READ ERROR HAS BEEN DETECTED ; ERRORS: LD (CMDBLK + CBSTS),A ;DISPLAY ERROR STATUS XOR A ;DESELECT DRIVE OUT BLCTL,A IN A,XPMTO ;MOTOR OFF HALT ;WAIT FOREVER ; ; BIOS SECTORS HAVE BEEN LOADED ; FINISH: LD HL,BANK1 LD A,(BANK1 + 1) ;GET PTR TO BIOS PARAMS (INIT -1) LD E,A LD D,0 ADD HL,DE DEC HL ;LOAD_ADDR = BIOS_START LD D,(HL) DEC HL LD E,(HL) LD (CMDBLK + CBLAD),DE DEC HL ;LENGTH = BIOS_SIZE LD D,(HL) DEC HL LD E,(HL) LD (CMDBLK + CBLNG),DE LD A,(SECTOR) ;SET UP COMMAND BLOCK INC A ;NEXT SECTOR TO READ LD (CMDBLK + CBSEC),A EI ;SET ALARM & GO TO SLEEP HALT ; ; SECTOR # STORAGE ; SECTOR: DB SECBG ;SECTOR COUNTER IF $ >= (BUFBG + 128) CONMSG MODULE TOO BIG FOR SECTOR ENDIF END