TITLE M5b BANKED MONITOR DISK DRIVER ROM LIST NOCOND ;**************************************************************************** ; ; DISK CONTROLLER BOOTSTRAP DRIVER FOR M5B WITH ZMON MONITOR. ; *INCLUDE B:ZBMH122.HDR ;**************************************************************************** ; ; REVISION STATUS: ; ; 1.0 - 26 FEB 81, Release ; 1.1 - Fix bug. ; 1.2 - 18 JUL 82, Move DD to high memory, clean up listing. ; 1.3 - 12 FEB 83 ; Add timout if DD not responding, add true recalibrate ; on boot in case the head is outside track 0. ; 1.4 - 14 FEB 83 ; Make changes for rev C board. ; 1.5 - 23 MAR 83 GRH ; Fix bug in recal routine to account for phase 1 anded with trk00 ; signal from drive. Causes recal to not work ; 1.6 - 3 APR 83 GRH ; Fix bug in boot routine that assumes the controller window is ; enabled after requesting it. Found out that if the Z-80 is ; generating a wait signal, the bus request is never acknowledged! ; Solution is to output the RESET bit along with the request thus ; yanking the processor out of it's sleep. ; 2.0 - 18 MAR 84 GRH ; Added hard disk boot option and boot command source disk option. ; 2.1 - 18 APR 85 GRH ; Fix problem with hard disk boot from drive 1. Needs logon. Also ; Also allow boot from 2nd platter. ; code logical physical ; 42 A DRIVE 0 HEAD 0 ; 52 B DRIVE 0 HEAD 2 ; 62 C DRIVE 1 HEAD 0 ; 72 D DRIVE 1 HEAD 2 ; 3.0 - 28 JAN 87 GRH ; Change Jade DD boot to resident prom version. ; Implement disk I/O driver functions & vectors and COMIOPB. ; Add error message output. ; Add prom # & drive passed in page 0. ; Drives now assigned the following logical to physical relationship: ; 0..3 = 8" Jade floppy ; 4..7 = 8" ISHA hard disk ; 8..B = 5" Jade floppy ; C..F = 8" Micromation Doubler (ISIS) ; 10..13= 3" Jade floppy ; 3.01 4 JUN 88 GRH ; Fix bug in ISHAX that prevented the clear controller command from ; working. ; 3.02 12 JUN 88 GRH ; Change 'RET'urns in 'H8BOOT' to 'JP ....,DKRET'. Returns caused ; system crashes because ROMs not set up. ; 3.03 25 JUN 88 GRH ; Modify floppy boot to include new disk format with disk system tracks ; directory like the hard disk has (removed DCM & BLT loader). ; 3.04 7 JUL 88 GRH ; Add '?' to all include file names. ; Change boot system tracks directory references to new format. ; 3.05 6 AUG 88 GRH ; Make changes to Jade driver to support new IOPB format. ; 3.06 26 SEP 88 GRH ; Add code for ISHA 5" Hard Disk support. ; 0..3 = 8" Jade floppy ; 4..7 = 8" ISHA hard disk ; 8..B = 5" Jade floppy ; C..F = 5" ISHA Hard Disk ; 10..13 = 8" Micromation Doubler (ISIS) ; 14..17= 3" Jade floppy ; Change ?xxx symbols to x_xx symbols. ; First interim version supporting Monitor function calls. All Rom ; functions are supported thru the Rom swap address from the Monitor ; Rom. ; 3.07 11-25-90 GRH ; Modify slightly for ZMON Vers. 1.22. ; ; 3.08 2-20-91 GRH ; Make IOPB Sector for ISHA the same as floppies (0..n -> 1..n-1). ; This also make 5" ISHA same as 8". ; Change references to THIS_BNK to CURBNK. ; VERSN EQU 308 ; ;**************************************************************************** SUBTTL DECLARATIONS ;============================================================================ ; ; CONSTANTS ; ;============================================================================ FALSE EQU 0 TRUE EQU NOT FALSE ; DEBUG EQU FALSE ; HNGTMO EQU 10 ;HANGUP TIMOUT SECSIZ EQU 128 ;DISK SECTOR SIZE ; ; SYSTEM LOCATIONS ; LOGINBYTE EQU 0004H ;CP/M CURRENT DRIVE & USER BYTE DEFBFR EQU 0080H ;USE CPM DEFAULT BUFFER FOR BIOS SECTOR 1 PROMST EQU 0F800H PROMSIZ EQU 2048 ;SIZE OF THIS PROM FOR CODE CHECKING ;============================================================================ ; ;*MACLIB ASMBTOOL.MLB ;*INCLUDE MONBOARD.DEF ;*INCLUDE JDDCONT.DEF ;*INCLUDE ISHA.DEF ;*INCLUDE DISKS.DEF ;*INCLUDE B:ZBMF101.DEF ;*INCLUDE B:ZBMG101.DEF ; ;============================================================================ LIST OFF *MACLIB ASMBTOOL.MLB *INCLUDE MONBOARD.DEF *INCLUDE JDDCONT.DEF *INCLUDE ISHA.DEF *INCLUDE DISKS.DEF *INCLUDE B:ZBMF101.DEF *INCLUDE B:ZBMG101.DEF LIST ON THIS_ROM EQU DK_RNUM ;ROM # OF THIS ROM DSKBNK EQU 0FEH ;BANK # OF FLOPPY DISK CONTROLLERS BTENTS EQU 86H ;BOOT DIRECTORY VALIDITY CONSTANT ;############################################################################ ; ; PAGE 0 RESERVED AREA ; ;############################################################################ ORG 0040H ; ; BOOT VARIABLES ; DK_PROM DS 2 ;PROM # & DRIVE PASSED TO BIOS BIOSLN DS 2 ;BIOS LENGTH SAVE/SECTOR COUNT BIOSNT DS 2 ;BIOS ENTRY SUBTTL EXTERNAL ENTRY POINTS ORG MONROM ; JP CINIT ;COLD START ; ; EXTERNAL FUNCTION ENTRY DURING INTERRUPT ; DS (MONROM + 6) - $ JP I_STUB ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; EXTERNAL FUNCTION STUB FOR USE DURING AN INTERRUPT WITHOUT THE ; RESIDENT ROM ENABLED. USE IN ALL NON-RESIDENT ROMS. ; ENTRY- A= FUNCTION # ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; I_STUB: ADD A,2 ;BIAS UP PUSH HL LD H,MR_RNUM ;USE RESIDENT ROM LD L,A EX (SP),HL CALL XROMF ;GO EXECUTE THE FUNCTION INC SP ;BALANCE STACK INC SP RET ;**************************************************************************** ; ; COLD INIT ONLY SWITCHES TO RESIDENT ROM ; ;**************************************************************************** ; CINIT: ; ; SET STACK ; LD SP,MONSTK ; ; RESET ROM FUNCTION SHOULD NOT RETURN HERE ; LD HL,[MR_RNUM SHL 8] + 1 ;RESET PUSH HL CALL XROMF ; ; IF RETURNED THEN HALT ; HALT SUBTTL MONITOR BOARD SHADOW ROM SELECTION PROCEDURE *INCLUDE XROM.Z80 SUBTTL INITIALIZATION CODE ;---------------------------------------------------------------------------- ; ; THIS IS THE COLD START INIT CODE ; ;---------------------------------------------------------------------------- ; ROM_INIT: ; ; OUTPUT SIGN-ON MESSAGE ; LD HL,LOGMSG ;OUTPUT SIGN-ON CALL PRTS ; RET LOGMSG: DB ' M5b Disk Driver V. ' PVERS VERSN DM CR,LF SUBTTL LOW MEMORY PROCEDURES ;**************************************************************************** ; ; PRTS ROUTINE OUTPUTS AN ASCII STRING ONTO THE CONSOLE. ; THE STRING MUST BE TERMINATED BY BIT 7 SET IN THE LAST CHAR OF THE STRING. ; ENTRY- HL= TEXT PTR ; ;**************************************************************************** ; PUTS: PRTS: ; ; SAVE REGISTER ; PUSH BC ; ; TOP OF PRINTING LOOP ; PRTA: LD C,(HL) ;FETCH CHAR ; RES 7,C ;MAKE SURE BIT 7 = 0 CALL CO ; LD A,(HL) ;IF BIT 7 = 1 THEN STOP INC HL RLCA JR NC,PRTA ; ; RESTORE & RETURN ; POP BC RET ;**************************************************************************** ; ; SETUP BANKS FOR BLOCK MOVE ; ENTRY- C= DESTINATION BANK ; B= SOURCE BANK ; EXIT - AF=BC=DE=HL= ? ; ;**************************************************************************** ; BNKSEL: XRROM MF_SBNK RET ;**************************************************************************** ; ; PERFORM BANKED MEMORY BLOCK MOVE ; ENTRY- HL= SOURCE PTR ; DE= DESTINATION PTR ; BC= BYTE COUNT ; EXIT - AF=BC=DE=HL= ? ; ;**************************************************************************** ; BMOVE: XRROM MF_BMOV RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN BANKED MEMORY BYTE FUNCTION ; ENTRY- E:HL= PTR TO LOCATION OF DATA ; EXIT - A= DATA ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; GETB: XRROM MF_GMEM RET SUBTTL MONITOR FUNCTION CALL DISPATCHER ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; ENTRY- A= FUNCTION # ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; FUNCH: CP A,MAXFUNS JR NC,MFUNERR ; ; FUNCTION SEEMS LEGAL, FETCH EXECUTION ADDRESS FROM TABLE ; PUSH HL ;SAVE POSSIBLE ARGUMENT ; LD HL,FUNTABL ADD A,A ADD A,L LD L,A LD A,0 ADC A,H LD H,A LD A,(HL) INC HL LD H,(HL) LD L,A ; ; RESTORE ARGUMENT & PUT EXECUTION ADDRESS ON STACK EX (SP),HL ; ; RETURN TO EXECUTION ADDRESS ; DKRET: RET ; ; ; FUNCTION ERROR ; MFUNERR: LD A,-1 OR A,A RET ;############################################################################ ; ; MONITOR FUNCTION TABLE ; ;############################################################################ ; FUNTABL: DW RETVERS ;0: RETURN ROM VERSION DW MBOOT ;1: BOOT DISK WITH ARGUMENT IN BC DW TST_PB ;2: TEST IOPB STATUS FOR ERROR ; E:HL= PTR TO IOPB DW DIS_PB ;3: DISPLAY IOPB DATA ; E:HL= PTR TO IOPB DW EX_IOPB ;4: EXECUTE IOPB ; E:HL= PTR TO IOPB ; MAXFUNS EQU ($ - FUNTABL) / 2 SUBTTL MONITOR FUNCTIONS ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN VERSION FUNCTION #0 ; EXIT - HL= VERSION # (123D = 1.23) ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; RETVERS: LD HL,VERSN RET ;---------------------------------------------------------------------------- ; ; BOOT DISK FUNCTION #1 ; ENTRY- B= DRIVE # ; 0..3 = 8" JADE FLOPPY ; 4..7 = 8" HARD DISK (ISHA) ; 8..B = 5" JADE FLOPPY ; C..F = 5" HARD DISK ; 10..13 = 8" MICROMATION (INTEL M2FM) ; 14..17 = 3" JADE FLOPPY ; ;---------------------------------------------------------------------------- ; MBOOT: ; ; SAVE PROM # FOR BIOS ; LD A,C AND A,7 LD (DK_PROM),A ; ; EXTRACT DRIVE # FROM ARGUMENT ; REPT 4 ;D4..D11 -> D0..D7 SRL B RR C ENDM ; ; IF DRIVE # > 0FFH THEN ABORT ; LD A,B OR A,A JP NZ,ABORT ; ; SAVE DRIVE # AS LOGIN DRIVE FOR BIOS ; LD A,C LD (LOGINBYTE),A LD (DK_PROM + 1),A ; ; NOW VECTOR TO DISK BOOT ROUTINE ; CP A,4 ;IF 8" FLOPPY DISK THEN EXIT JP C,F8BOOT ; CP A,8 ;IF HARD DISK THEN EXIT JP C,H8BOOT ; CP A,0CH ;IF 5" FLOPPY THEN EXIT JP C,F5BOOT ; CP A,10H ;IF 5" HARD DISK THEN EXIT JP C,H5BOOT ; CP A,14H ;IF MICROMATION THEN EXIT JP C,M8BOOT ; CP A,18H ;IF 3" FLOPPY THEN EXIT JP C,F3BOOT ; ; FALL INTO ERROR RETURN TO PRINT MESSAGE ; ;---------------------------------------------------------------------------- ; ; ABORT RETURNS CONTROL TO THE MONITOR ROM WITH ERROR FLAG (CF) SET ; ;---------------------------------------------------------------------------- ; ABORT: SCF ;HAVE MONITOR PRINT ERROR MESSAGE JP DKRET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; TEST IOPB STATUS FOR ERROR FUNCTION 2 ; ENTRY- E:HL= IOPB PTR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; TST_PB: ; ; SET IOPB PTR ; LD (IOPBPTR),HL LD A,E LD (IOPBPTR + 2),A ; ; FALL INTO LOCAL FUNCTION ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; TEST IOPB STATUS FOR ERROR FUNCTION 2 ; ENTRY- (IOPBPTR)= IOPB PTR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; DQERR: ; ; RESTORE PTRS ; LD HL,(IOPBPTR) LD DE,(IOPBPTR + 2) ; ; CALCULATE PTR TO STATUS ; LD A,PB_STATO ADD A,L LD L,A LD A,0 ADC A,H LD H,A ; ; FETCH DATA ; CALL GETB ; ; RESTORE PTR ; LD HL,(IOPBPTR) LD DE,(IOPBPTR + 2) ; ; IF NO ERROR THEN RETURN IT ; OR A,A RET Z ; ; ELSE FALL INTO ERROR OUTPUT ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; DISPLAY IOPB DATA FUNCTION 3 ; ENTRY- E:HL= IOPB PTR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; DIS_PB: ; ; SET IOPB PTR ; LD (IOPBPTR),HL LD A,E LD (IOPBPTR + 2),A ; ; FALL INTO DISPLAY ROUTINE ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; DISPLAY IOPB DATA FUNCTION ; ENTRY- (IOPBPTR)= IOPB PTR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; DBERR: ; ; DISPLAY HEADER ; LD HL,DERM CALL PUTS ; ; DISPLAY IOPB DATA ; LD HL,(IOPBPTR) LD DE,(IOPBPTR + 2) LD B,PB_SIZE ; DBTE1: PUSH DE PUSH HL CALL GETB ; CALL HTOA ; CALL SPACE ;DISPLAY SEPARATOR ; POP HL POP DE INC HL ;NEXT VALUE DJNZ DBTE1 ;IF NOT DONE THEN CONTINUE ; ; DISPLAY PORT # ; CALL SPACE CALL SPACE ;OUTPUT PORT # LD A,(DDPORT) CALL HTOA ; ; DISPLAY CONTROLLER ADDRESS ; CALL SPACE LD A,(DDADDR + 1) CALL HTOA LD A,(DDADDR) CALL HTOA ; ; NEW LINE & RETURN ERROR ; CALL CRLF JP DSKERR ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; EXECUTE IOPB FUNCTION 4 ; ENTRY- E:HL= IOPB PTR ; EXIT - IOPB.STATUS= 0: OK, /0: ERROR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; EX_IOPB: ; ; SET IOPB PTR ; LD (IOPBPTR),HL LD A,E LD (IOPBPTR + 2),A ; ; FALL INTO DISK EXECUTER FUNCTION ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; EXECUTE THE DISK IOPB FUNCTION ; ENTRY- (IOPBPTR)= IOPB ADDRESS ; EXIT - AF= 0: NO ERRORS ; ; A,BC,BC',HL,HL',DE= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; DSKX: ; ; FETCH DRIVE # ; LD HL,(IOPBPTR) INC HL LD A,(HL) ; ; IF JADE 8" FLOPPY THEN GO EXECUTE IT ; SUB A,4 JP C,JADE8 ; ; ELSE IF SASI 8" HARD DISK THEN GO EXECUTE IT ; SUB A,4 JP C,ISHAX8 ; ; ELSE IF JADE 5" FLOPPY THEN GO EXECUTE IT ; SUB A,4 JP C,JADE5 ; ; ELSE IF SASI 5" THEN GO EXECUTE IT ; SUB A,4 JP C,ISHAX5 ; ; ELSE FALL INTO SELECT ERROR ; ;**************************************************************************** ; ; ILLEGAL DRIVE REQUESTED ; EXIT - AF= -2 ; (IOPB.PB_STAT)= ILLEGAL COMMAND ERROR ; ;**************************************************************************** ; JSELERR: LD (IX + PB_STATO),PB_ILCMD ; ; FALL INTO DISK ERROR ; ;**************************************************************************** ; ; COMMON ERROR CODE ; EXIT - AF= -2 ; ;**************************************************************************** ; DSKERR: LD A,-2 OR A,A RET ;**************************************************************************** ; ; CONTROLLER NOT SENSED ERROR ; EXIT - AF= -2 ; (IOPB.PB_STAT)= CONTROLLER NOT PRESENT ERROR ; ;**************************************************************************** ; JCNP: LD (IX + PB_STATO),PB_CNP JR DSKERR SUBTTL JADE 5" & 8" FLOPPY CONTROLLER DRIVER ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; 8" JADE FLOPPY BOOT ; THIS ROUTINE NOW ACCESSES THE NEW JADE CONTROLLER WITH ON-BOARD PROM. ; THE CODE WILL COMMAND THE CONTROLLER TO READ THE BIOS FROM THE DISK AND ; EXECUTE THE COLD START ENTRY IN THE BIOS. ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; F8BOOT: ; ; RESET THE CONTROLLER ; LD HL,CLRIOPB CALL IIOPB ; LD HL,IOPB LD (IOPBPTR),HL LD A,(CURBNK) LD (IOPBPTR + 2),A CALL JADEX8 CALL DQERR JP NZ,ABORT ; ; PREPARE IOPB ; LD HL,LOGIOPB CALL IIOPB ; LD A,(LOGINBYTE) ;SET DRIVE LD (IOPB + PB_DRVO),A ; LD A,ID_SECT ;SET SECTOR LD (IOPB + PB_SECO),A ; ; LOG ON DRIVE ; CALL JADEX8R CALL NZ,DBERR JP NZ,DKRET ; ; READ THE DIRECTORY SECTOR ; LD A,BD_SEC LD (IOPB + PB_SECO),A LD A,PB_READC LD (IOPB + PB_CMDO),A CALL JADEX8R CALL NZ,DBERR JP NZ,DKRET ; ; IF NOT DIRECTORY SECTOR THEN ERROR ; LD A,(DEFBFR) CP A,BTENTS JP C,DKRET ; ; ELSE FETCH THE LOCATION FOR THE BIOS ; LD HL,(DEFBFR + BD_SIOSS) LD A,H LD H,0 LD (IOPB + PB_SECO),HL LD L,A LD (IOPB + PB_TRKO),HL ; ; READ 1ST BIOS SECTOR INTO BUFFER ; CALL JADEX8R CALL NZ,DBERR JP NZ,DKRET ; ; FETCH BIOS LOAD ADDRESS & SIZE PARAMETERS FROM BIOS 1ST SECTOR ; CALL STUPBIOS JP C,DKRET ; ; READ BIOS ; JADRDB: CALL JADEX8R CALL NZ,DBERR JP NZ,DKRET ; LD HL,(IOPB + PB_SECO) ;NEXT SECTOR INC HL LD (IOPB + PB_SECO),HL ; LD HL,(IOPB + PB_DMAO) ;BUMP LOAD ADDRESS LD DE,(IOPB + PB_BCNTO) ;SECSIZ ADD HL,DE LD (IOPB + PB_DMAO),HL ; LD HL,BIOSLN ;IF --COUNT != 0 THEN REPEAT DEC (HL) JR NZ,JADRDB IF DEBUG ; ; RETURN TO MONITOR ; OR A,A ;RETURN NO ERROR JP DKRET ELSE ; ; EXECUTE THE BIOS COLD START ENTRY BY USING THE RESIDENT ROM ROUTINE ; LD HL,(BIOSNT) PUSH HL XRROM 8 JP DKRET ENDIF ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; EXECUTE THE DISK IOPB FUNCTION ; ENTRY- (IOPBPTR)= IOPB ADDRESS ; A= DRIVE# -4 ; EXIT - AF= 0: NO ERRORS ; C= CONTROLLER PORT ADDRESS ; A,B,HL,DE= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; JADE 5" ENTRY ; JADE5: LD C,DD_PRT5 JP JADEC ; ; ; JADE 8" ENTRY ; JADE8: LD C,DD_PRT8 ; ; COMMON INITIAL CODE ; JADEC: ADD A,4 ;BIAS DRIVE BACK UP LD B,A ; LD A,(HL) ;SAVE CURRENT DRIVE LD (HL),B ;CHANGE TO LOCAL DRIVE # PUSH AF CALL JADEX ;EXECUTE FUNCTION POP BC ;RESTORE DRIVE # LD HL,(IOPBPTR) INC HL LD (HL),B ; ; DONE ; RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; EXECUTE THE JADE 8" FLOPPY DISK READ IOPB FUNCTION ; ENTRY- (IOPBPTR)= IOPB ADDRESS ; EXIT - AF= 0: NO ERRORS ; A,B,HL,DE= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; JADEX8R: LD HL,0 LD (IOPB + PB_BCNTO),HL ; ; FALL INTO LOCAL READ FUNCTION ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; EXECUTE THE JADE 8" FLOPPY DISK IOPB FUNCTION ; ENTRY- (IOPBPTR)= IOPB ADDRESS ; EXIT - AF= 0: NO ERRORS ; A,B,HL,DE= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; JADEX8: LD C,DD_PRT8 ; ; FALL INTO JADE EXECUTOR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; EXECUTE THE JADE FLOPPY DISK IOPB COMMON FUNCTION ; ENTRY- (IOPBPTR)= IOPB ADDRESS ; C= CONTROLLER PORT ADDRESS ; EXIT - AF= 0: NO ERRORS ; A,B,HL,DE= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; JADEX: ; ; SAVE PORT # ; LD A,C LD (DDPORT),A ; ; CHECK FOR CONTROLLER PRESENT ; IN A,(C) INC A ;0FFH IF NOT THERE JP Z,JCNP ; ; COMPUTE JADE CONTROLLER BASE ADDRESS ; DEC A ;FETCH ADDRESS SELECT SWITCH DATA AND A,DD_SASW RLCA OR A,HIGH DD_BASE LD H,A LD L,0 LD (DDADDR),HL LD A,(CURBNK) LD (DDADDR + 2),A ; ; SETUP IOPB PTR ; LD HL,(IOPBPTR) PUSH IX LD IX,(IOPBPTR) ; ; IF COMMAND == CLEAR THEN EXIT ; LD A,(IX + PB_CMDO) CP A,PB_CLRC JP NZ,JNOCLR8 ; ; IF ALL DRIVES THEN HARD RESET ; LD A,(IX + PB_DRVO) INC A JP NZ,JNOCLR8 ; LD A,DD_BGN JR JDOCMD ; ; ; FETCH SOURCE ADDRESS FROM IOPB ; JNOCLR8: LD L,(IX + PB_DMAO) LD H,(IX + PB_DMAO + 1) ; ; FETCH COUNT ; LD C,(IX + PB_BCNTO) LD B,(IX + PB_BCNTO + 1) ; ; IF COUNT == 0 THEN NO DOWNLOAD ; LD A,C OR A,B JR Z,JEX ; ; ELSE IF COUNT < 1024 THEN DOWNLOAD DATA ; LD A,B CP A,4 JR C,JDOWN ; ; ELSE IF COUNT > 1024 THEN ERROR, SECTOR SIZE TOO BIG ; LD A,C OR A,A JP NZ,JXERR ; ; DOWNLOAD SECTOR DATA TO CONTROLLER ; JDOWN: ; ; OPEN WINDOW TO SECTOR BUFFER ; PUSH BC ;SAVE COUNT LD BC,(DDPORT) LD A,DD_MB1 OUT (C),A PUSH HL ;SAVE SRC PTR ; LD B,(IX + PB_DMAXO) ;SET BANKS LD C,DSKBNK CALL BNKSEL ; POP HL ;SRC PTR POP BC ;COUNT LD DE,(DDADDR) ;DEST PTR CALL BMOVE ; ; EXECUTE THE COMMAND ; JEX: ; ; OPEN WINDOW TO COMMAND BUFFER ; LD BC,(DDPORT) ;FETCH PORT # LD A,DD_MB0 ;OPEN WINDOW TO COMMAND BUFFER (BANK 0) OUT (C),A ; ; XFER THE IOPB TO THE CONTROLLER ; LD A,(IOPBPTR + 2) ;SET SRC BANK LD B,A LD C,DSKBNK CALL BNKSEL ; LD HL,(DDADDR) ;COMPUTE DEST PTR LD DE,DD_CBO ADD HL,DE EX DE,HL ; LD HL,(IOPBPTR) ;SRC PTR = IOPB ADDRESS ; LD BC,PB_STATO ;ONLY XFER PERTINENT BYTES CALL BMOVE ; ; EXECUTE THE COMMAND ; LD A,DD_EXC ;START COMMAND ; JDOCMD: CALL JWAIT ;WAIT FOR COMPLETION JP NZ,JERET ;IF ERROR THEN RETURN ERROR ; ; COMMAND EXECUTED, XFER RESULTS FUNCTION ; SELECT COMMAND BLOCK WINDOW ; LD BC,(DDPORT) LD A,DD_MB0 OUT (C),A ; ; XFER IOPB STATUS TO HOST ; LD BC,(IOPBPTR + 2) ;SET BANKS LD B,DSKBNK CALL BNKSEL ; LD HL,(DDADDR) LD DE,DD_CBO + PB_BCNTO ADD HL,DE ; EX DE,HL LD HL,(IOPBPTR) LD BC,PB_BCNTO ADD HL,BC EX DE,HL ; LD BC,PB_SIZE - PB_BCNTO ; CALL BMOVE ; ; IF UPLOAD INHIBITED THEN SKIP IT ; BIT PB_INHX,(IX + PB_FLGO) JR NZ,JDONE ; ; XFER SECTOR DATA FROM CONTROLLER ; LD BC,(DDPORT) LD A,DD_MB0 ;SOFTLY GRAB RESOURCES WITHOUT INTERRUPT OUT (C),A LD A,DD_MB1 ;OPEN WINDOW TO SECTOR BUFFER (BANK 1) OUT (C),A ; ; FETCH DESTINATION ADDRESS ; LD E,(IX + PB_DMAO) LD D,(IX + PB_DMAO + 1) ; ; FETCH XFER COUNT ; LD C,(IX + PB_BCNTO) LD B,(IX + PB_BCNTO + 1) ; ; IF COUNT == 0 THEN NO UPLOAD ; LD A,C OR A,B JR Z,JDONE ; ; ELSE IF COUNT < 1024 THEN UPLOAD SECTOR DATA ; LD A,B CP A,4 JP C,JXUP ; ; ELSE IF COUNT > 1024 THEN ERROR ; LD A,C OR A,A JR NZ,JXERR ; ; UPLOAD SECTOR DATA ; JXUP: PUSH DE ;DEST PTR PUSH BC ;BYTE CNT ; LD C,(IX + PB_DMAXO) LD B,DSKBNK CALL BNKSEL ; POP BC ;BYTE CNT POP DE ;DEST PTR LD HL,(DDADDR) CALL BMOVE ; ; RELEASE IOPB WINDOW ; JDONE: LD A,DD_FREE LD BC,(DDPORT) OUT (C),A ; ; CHECK FOR ERROR ; LD A,(IX + PB_STATO) OR A,A ; ; DONE ; POP IX RET ; ; ; SECTOR SIZE TOO BIG ERROR ; JXERR: LD (IX + PB_STATO),PB_BADPB ;PASS BACK ERROR JR JDONE ; ; ; RETURN ERROR STATUS EXIT ; ENTRY- A= ERROR CODE ; JERET: LD (IX + PB_STATO),A JR JDONE ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; WAIT ON JADE CONTROLLER BUSY FUNCTION ; ENTRY- A= COMMAND TO OUTPUT ; EXIT - AF= 0: OK, /0: ERROR ; C= PORT # OF CONTROLLER ; DE,HL= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; JWAIT: ; ; ISSUE PASSED COMMAND ; LD BC,(DDPORT) OUT (C),A ; ; PAUSE A WHILE FOR CONTROLLER TO CATCH UP ; EX (SP),HL EX (SP),HL ; ; WAIT FOR TASK COMPLETION FOR A WHILE ; LD L,HNGTMO ;SET UP TIMOUT LD DE,0 ; JWAIT1: DEC DE ;IF NOT TIMOUT THEN CONTINUE TO WAIT LD A,E OR A,D JR NZ,JWAIT2 ; DEC L ;IF TIME OUT THEN RETURN TO MONITOR OR A,L JP Z,DSKERR ; JWAIT2: IN A,(C) ;IF NOT DONE THEN WAIT AND A,DD_SHLT JR NZ,JWAIT1 ; RET ;RETURN ZF IF ($ AND 7FFFH) >= (0FC00H AND 7FFFH) CONMSG *** JADE DEPENDENT CODE OVERLAPS CONTROLLER MAP *** ENDIF SUBTTL JADE 5" FLOPPY DISK DRIVER ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; 5" JADE FLOPPY DISK BOOT ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; F5BOOT: EQU ABORT ;UNSUPPORTED SUBTTL JADE 3" FLOPPY DISK DRIVER ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; 3" JADE FLOPPY DISK BOOT ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; F3BOOT: EQU ABORT ;UNSUPPORTED SUBTTL MICROMATION 8" FLOPPY DISK DRIVER ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; 8" MICROMATION M2FM BOOT ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; M8BOOT: EQU ABORT ;UNSUPPORTED ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; MICROMATION DRIVER ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; M2X: EQU DSKERR SUBTTL ISHA 5" & 8" HARD DISK DRIVER ;**************************************************************************** ; ; Hard disk boot function. ; This module reads the BIOS image to the proper system ; address & jumps to the BIOS cold start entry point. ; ;**************************************************************************** ; H8BOOT: ; ; INSURE FDC WINDOW REMOVED ; LD BC,0341H XOR A,A H8B1: OUT (C),A INC C DJNZ H8B1 ; ; ISSUE CLEAR CONTROLLER IOPB ; LD HL,CLRIOPB CALL IIOPB ; LD HL,IOPB LD (IOPBPTR),HL LD A,(CURBNK) LD (IOPBPTR + 2),A ; CALL ISHAX ; ; CHECK SELF TEST STATUS ; CALL DQERR ; ; SET UP IOPB IN RAM ; LD HL,LOGIOPB CALL IIOPB ; ; FETCH & OFFSET PHYSICAL DRIVE ; LD A,(LOGINBYTE) ;COMPUTE & SET DRIVE SUB A,4 ;8" = 4..7 -> 0..3 ; ; COMPUTE LOGICAL DRIVE FOR IOPB ; SRL A ;DRIVE = LOGICAL_DRIVE / 2 LD (IOPB + PB_DRVO),A ; ; COMPUTE SECTOR FROM LOGICAL DRIVE ; RRA ;IF ODD DRIVE THEN SECTOR += 128 AND A,80H EXX ;SAVE SECTOR OFFSET IN B' FOR LATER USE LD B,A ; EVEN= 0, ODD= 80H (128) ; LD A,1 ;IF ODD, THEN USE PLATTER 1 ADD A,B LD (IOPB + PB_SECO),A EXX ; ; FORCE HOST ADAPTER LOG-ON ; CALL ISHAX CALL DQERR JP NZ,DKRET ; ; NOW READ THE DIRECTORY SECTOR ; LD (IX + PB_CMDO),PB_READC ; EXX LD A,B EXX LD HL,BD_SEC ;SECTOR = SECTOR + (DRV / 2) * 128 LD C,A LD B,0 ADD HL,BC LD (IOPB + PB_SECO),HL ; CALL ISHAX ;READ THE DIRECTORY SECTOR (IOPB SET UP) CALL DQERR JP NZ,DKRET ; ; FETCH DIRECTORY INFO FOR BIOS ; LD HL,(DEFBFR + BD_SIOSS) ;FETCH CBIOS SECTOR FROM DIRECTORY ; ; SAVE TRACK ; LD E,H ; ; PROCESS SECTOR ; LD H,0 EXX ;ADD IN LOGICAL DRIVE OFFSET LD A,B EXX LD C,A LD B,0 ADD HL,BC LD (IOPB + PB_SECO),HL ; ; PROCESS TRACK ; LD L,E LD H,0 LD (IOPB + PB_TRKO),HL ; CALL ISHAX ;LOAD IN CBIOS SECTOR #1 CALL DQERR ;CHECK FOR ERRORS JP NZ,DKRET ; CALL STUPBIOS ;SET UP IOPB FOR BIOS READ JP C,DKRET ; HDRDLP: CALL ISHAX CALL DQERR JP NZ,DKRET ; LD HL,(IOPB + PB_SECO) ;NEXT SECTOR INC HL LD (IOPB + PB_SECO),HL ; LD HL,(IOPB + PB_DMAO) ;BUMP DMA ADDRESS LD DE,(IOPB + PB_BCNTO) ;SECSIZ ADD HL,DE LD (IOPB + PB_DMAO),HL ; LD A,(BIOSLN) ;IF NOT DONE THEN LOOP DEC A LD (BIOSLN),A JR NZ,HDRDLP IF NOT DEBUG ; ; EXECUTE THE BIOS COLD START ENTRY BY USING THE RESIDENT ROM ROUTINE ; LD HL,(BIOSNT) ;BIOS LOADED, GO EXECUTE IT PUSH HL XRROM 8 JP DKRET ELSE ;IF DEBUG THEN RETURN NO ERRORS OR A JP DKRET ENDIF FORM ;---------------------------------------------------------------------------- ; ; 5" HARD DISK BOOT ; H5BOOT: ; ; BIAS DOWN DRIVE ; SUB A,8 ;5" = 8..B -> 4..7 ; ; COMPUTE LOGICAL DRIVE FOR IOPB ; PUSH AF ;BIAS DRIVE UP ADD A,0CH ;ISHA5 - DRVPRT AND A,0FH LD (IOPB + PB_DRVO),A POP AF ; ; COMPUTE SECTOR FROM LOGICAL DRIVE ; ADD A,A ;UPPER NIBBLE = HEAD ADD A,A AND A,0C0H ;MASK OFF UNUSED BITS EXX ;SAVE SECTOR OFFSET IN B' FOR LATER USE LD B,A ; ; SET ID SECTOR FOR LOGIN ; LD A,ID_SECT ADD A,B LD (IOPB + PB_SECO),A EXX ; ; ISSUE CLEAR CONTROLLER IOPB ; LD A,PB_CLRC LD (IOPB + PB_CMDO),A ; LD IX,IOPB CALL ISHAX ; ; CHECK SELF TEST STATUS ; CALL DQERR ; ; FORCE HOST ADAPTER LOG-ON ; LD A,PB_LOGC LD (IOPB + PB_CMDO),A ; CALL ISHAX CALL DQERR JP NZ,DKRET ; ; FETCH THE SECTOR SIZE ; LD A,(DEFBFR + ID_SSZ0O) EXX LD HL,128 ; OR A,A HBTSSZ: JR Z,GOTSSZ ; ADD HL,HL DEC A JR HBTSSZ ; ; ; SECTOR SIZE COMPUTED IN HL ; GOTSSZ: EXX ;SAVE IN ALT REG ; ; NOW READ THE DIRECTORY SECTOR ; LD (IX + PB_CMDO),PB_READC ; EXX ;FETCH LOGICAL DRIVE HEAD # LD A,B EXX ; LD HL,BD_SEC ;SECTOR = SECTOR + (DRV / 2) * 128 LD C,A LD B,0 ADD HL,BC LD (IOPB + PB_SECO),HL ; CALL ISHAX ;READ THE DIRECTORY SECTOR (IOPB SET UP) CALL DQERR JP NZ,DKRET ; ; FETCH DIRECTORY INFO FOR BIOS ; LD HL,(DEFBFR + BD_SIOSS) ;FETCH CBIOS SECTOR FROM DIRECTORY ; ; SAVE TRACK ; LD E,H ; ; PROCESS SECTOR ; LD H,0 EXX ;ADD IN LOGICAL DRIVE OFFSET LD A,B EXX LD C,A LD B,0 ADD HL,BC LD (IOPB + PB_SECO),HL ; ; PROCESS TRACK ; LD L,E LD H,0 LD (IOPB + PB_TRKO),HL ; CALL ISHAX ;LOAD IN CBIOS SECTOR #1 CALL DQERR ;CHECK FOR ERRORS JP NZ,DKRET ; CALL SETBIOPB ;SET UP IOPB FOR BIOS READ JP C,DKRET ; HDRDLP5: CALL ISHAX CALL DQERR JP NZ,DKRET ; LD HL,(IOPB + PB_SECO) ;NEXT SECTOR INC HL LD (IOPB + PB_SECO),HL ; LD HL,(IOPB + PB_DMAO) ;BUMP DMA ADDRESS EXX ;FETCH SECTOR SIZE PUSH HL EXX POP DE ADD HL,DE LD (IOPB + PB_DMAO),HL ; LD A,(BIOSLN) ;IF NOT DONE THEN LOOP DEC A LD (BIOSLN),A JR NZ,HDRDLP5 ; LD HL,(BIOSNT) ;BIOS LOADED, GO EXECUTE IT IF NOT DEBUG ; ; EXECUTE THE BIOS COLD START ENTRY BY USING THE RESIDENT ROM ROUTINE ; LD HL,(BIOSNT) PUSH HL XRROM 8 JP DKRET ELSE ;IF DEBUG THEN RETURN NO ERRORS OR A JP DKRET ENDIF ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; SETUP IOPB FOR BIOS READ SUBR ; ENTRY- CBIOS SECTOR #1 IN DEFBFR ; HL'= SECTOR BYTE COUNT {128, 256, 512, 1024} ; IX= IOPB PTR ; EXIT - CF= ERROR ; A,HL,DE,BC= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; SETBIOPB: ; ; FETCH BIOS LOAD PARAMETER OFFSET ; LD HL,(DEFBFR + 1) ; ; IF NOT IN 1ST SECTOR THEN RETURN ERROR ; EXX ;FETCH SECTOR SIZE PUSH HL EXX POP DE ; LD A,H ;LIMIT TO 1K ([3]FF AND A,3 LD H,A SBC HL,DE CCF RET C ; ; SAVE SECTOR SIZE ; PUSH DE ; ; COMPUTE PTR TO PARAMETERS ; LD HL,DEFBFR LD DE,(DEFBFR + 1) LD D,A ADD HL,DE ; ; FETCH LOAD ADDRESS & SAVE ; DEC HL LD D,(HL) DEC HL LD E,(HL) ; LD (BIOSNT),DE ; ; FETCH BIOS LENGTH & SAVE ; DEC HL LD B,(HL) DEC HL LD C,(HL) ; LD (BIOSLN),BC ; ; MOVE THIS SECTOR TO PROPER LOCATION ; LD HL,DEFBFR POP BC ;SECTOR SIZE LDIR ; ; SET UP FOR NEXT SECTOR READ ; LD (IOPB + PB_DMAO),DE ;SET UP NEW DMA ADDRESS ; INC (IX + PB_SECO) ;NEXT SECTOR ; ; COMPUTE SECTOR COUNT FROM LENGTH ; EXX ;FETCH SECTOR SIZE PUSH HL EXX POP DE ; XOR A,A ;COUNT = 0 ; LD HL,(BIOSLN) ;COMPUTE # SECTORS LEN_LP: SBC HL,DE JR C,LEN_OK ; INC A JP LEN_LP ; ; ; SECTOR COUNT IN A ; LEN_OK: DEC A ;ALREADY HAVE 1ST SECTOR ; ; SAVE COUNT IN LENGTH ; LD (BIOSLN),A ; ; DONE, RETURN NO ERROR ; OR A,A RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; ISHA 8" DRIVE HARD DISK DRIVER ; ENTRY- (IOPBPTR)= IOPB ADDRESS ; HL= IOPB.PB_DRV PTR ; A= BASE DRIVE # -4 ; EXIT - AF= 0: NO ERRORS ; HL=BC= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ISHAX8: ; ADD A,4 ;RESTORE DRIVE TO {0..3} ; ; COMMON ISHAX CODE ; ISHAXC: LD B,A LD A,(HL) ;SAVE DRIVE ARG FROM IOPB LD (HL),B ;CONVERT TO CONTROLLER DRIVES PUSH AF CALL ISHAX POP BC ;RESTORE DRIVE ARG LD HL,(IOPBPTR) INC HL LD (HL),B RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; ISHA 5" DRIVER ; ENTRY- (IOPBPTR)= IOPB ADDRESS ; EXIT - AF= 0: NO ERRORS ; BC= SECTOR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ISHAX5: ; ADD A,8 ;BIAS BACK TO 5..7 JP ISHAXC ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; COMMON ISHA DRIVER ; ENTRY- (IOPBPTR)= IOPB ADDRESS ; EXIT - AF= 0: NO ERRORS ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ISHAX: ; ; CHECK FOR CONTROLLER PRESENT ; IN A,(ISH_STATUS) INC A JP Z,JCNP ; ; IF CLEAR COMMAND THEN DO DIFFERENTLY ; PUSH IX LD IX,(IOPBPTR) ; LD A,(IX + PB_CMDO) CP A,PB_CLRC JR Z,ISHACLR ; ; COMMON CODE ; ISHAC: ; ; PUT IOPB ADDRESS IN BC FOR EASY OUTPUT TO CONTROLLER ; LD BC,(IOPBPTR) ; ; OUTPUT THE IOPB ADDRESS TO HOST ADAPTER ; LD A,C OUT (ISH_DATA),A LD A,ISH_SPBL OUT (ISH_CMD),A CALL HWBUSY ; LD A,B OUT (ISH_DATA),A LD A,ISH_SPBH OUT (ISH_CMD),A CALL HWBUSY ; LD A,(CURBNK) OUT (ISH_DATA),A LD A,ISH_SPBX OUT (ISH_CMD),A CALL HWBUSY ; ; OUTPUT THE EXECUTE IOPB COMMAND ; LD A,ISH_EXEC OUT (ISH_CMD),A CALL HWBUSY ; ; RETURN THE ERROR STATUS ; HDONE: LD A,(IX + PB_STATO) OR A,A POP IX RET ; ; ; CLEAR COMMAND ; ISHACLR: ; ; IF NOT ALL DRIVES THEN EXECUTE NORMALLY ; LD A,(IX + PB_DRVO) INC A JR NZ,ISHAC ; ; ELSE RESET THE CONTROLLER ; ISHACC: LD A,1 SHL ISH_RESB ;ISSUE CONTROLLER RESET OUT (ISH_CMD),A XOR A,A OUT (ISH_CMD),A ; CLRWT: IN A,(ISH_STATUS) ;WAIT FOR CONTROLLER READY BIT ISH_BSYB,A JR NZ,CLRWT ; LD HL,0 ;DELAY A WHILE IN CASE ISHA FOOLING WITH STATUS PORT ; ISHA2: DEC HL LD A,H OR A,L JR NZ,ISHA2 ; IN A,(ISH_STATUS) BIT ISH_BSYB,A JR NZ,CLRWT ;IF BUSY AGAIN THEN CONTINUE TO WAIT ; ; IF NO ERRORS THEN RETURN 0 ; AND A,(1 SHL ISH_ERRB) OR (1 SHL ISH_FERB) LD (IX + PB_STATO),A JR Z,HDONE ; ; ERROR ENCOUNTERED, RETURN FIRMWARE ERROR ; IN A,(ISH_DATA) LD (IX + PB_STATO),A ;RETURN NO ERRORS FOR NOW JR HDONE ;**************************************************************************** ; ; HWBUSY SUBR WAITS UNTIL HOST ADAPTOR GOES NOT BUSY ; EXIT - A= STATUS ; ZF= TRUE ; ;**************************************************************************** ; HWBUSY: ; ; IF CONTROLLER BUSY THEN WAIT ; IN A,(ISH_STATUS) BIT ISH_BSYB,A JR NZ,HWBUSY ; ; ELSE RETURN ZF ; RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; COMMON SETUP IOPB FOR BIOS READ SUBR ; ENTRY- CBIOS SECTOR #1 IN DEFBFR ; EXIT - CF= ERROR ; A,HL,DE,BC= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; STUPBIOS: ; ; FETCH BIOS LOAD PARAMETER OFFSET FROM LO BYTE OF COLD START JUMP ADDRESS ; LD A,(DEFBFR + 1) ; ; IF NOT IN 1ST 128 BYTES THEN RETURN ERROR ; CP A,128 CCF RET C ; ; COMPUTE PTR TO PARAMETERS ; LD HL,DEFBFR LD E,A LD D,0 ADD HL,DE ; ; FETCH LOAD ADDRESS & SAVE ; DEC HL LD D,(HL) DEC HL LD E,(HL) ; LD (BIOSNT),DE ; ; FETCH BIOS LENGTH & SAVE ; DEC HL LD B,(HL) DEC HL LD C,(HL) ; LD (BIOSLN),BC ; ; MOVE THIS SECTOR TO PROPER LOCATION ; LD HL,DEFBFR LD BC,(IOPB + PB_BCNTO) ;USE COUNT ACTUALLY READ LDIR ; ; SET UP FOR NEXT SECTOR READ ; LD (IOPB + PB_DMAO),DE ;SET UP NEW DMA ADDRESS ; LD HL,IOPB + PB_SECO ;NEXT SECTOR INC (HL) ; ; COMPUTE SECTOR COUNT FROM LENGTH ; LD HL,(BIOSLN) ;COMPUTE # SECTORS LD DE,(IOPB + PB_BCNTO) ;USE BYTES READ XOR A,A ; BUMP: INC A SBC HL,DE ;KEEP SUBTRACTING UNTIL UNDERFLOW JR Z,NOBUMP JR NC,BUMP ; NOBUMP: ; ; SAVE COUNT IN LENGTH ; LD (BIOSLN),A ; ; DONE, RETURN NO ERROR ; OR A,A RET ;**************************************************************************** ; ; INITIALIZE THE IOPB STRUCTURE IN RAM ; ENTRY- HL= IOPB PTR TO INITIALIZE FROM ; EXIT - HL, DE, BC= ? ; ;**************************************************************************** ; IIOPB: ; ; MOVE THE IOPB ; LD DE,IOPB LD BC,PB_SIZE LDIR RET SUBTTL ASCII CHAR ROUTINES ;**************************************************************************** ; ; DISPLAY BYTE ON SYSTEM CONSOLE PROCEDURE ; ENTRY- A= BINARY ; ;**************************************************************************** ; HTOA: LD C,A XDROM MF_PHXB ; ; DONE ; RET ;**************************************************************************** ; ; CONSOLE OUTPUT SUBR ; ENTRY- C= CHAR ; EXIT - AF= ? ; ;**************************************************************************** ; CO: XCROM MF_CO ; ; DONE ; RET ;**************************************************************************** ; ; NEW LINE SUBR ; EXIT - AF, C= ? ; ;**************************************************************************** ; CRLF: LD C,0DH CALL CO LD C,0AH JR CO ;**************************************************************************** ; ; OUTPUT SPACE TO CONSOLE SUBR ; ;**************************************************************************** ; SPACE: LD C,' ' JR CO SUBTTL INITIALIZED DATA ;############################################################################ ; ; MESSAGES ; ;############################################################################ ; DERM: DB CR,LF,'Disk Error! IOPB data:' DB CR,LF DB 'CM DR TL TH SL SH FG AL AH AX CL CH ST R1 R2 R3 PT CA' DM CR,LF ;############################################################################ ; ; LOGIN IOPB ; ;############################################################################ ; LOGIOPB: DB PB_LOGC ;COMMAND DB 0 ;DRIVE DW 0 ;TRACK DW ID_SECT ;SECTOR DB 0 ;FLAGS DW DEFBFR ;DMA DB 0 ;EXTENDED DMA DW 0 ;XFER COUNT DB 0,0,0,0 ;STATUS ; CLRIOPB: DB PB_CLRC ;COMMAND DB -1 ;DRIVE (-1= HARD RESET) DW 0 ;TRACK DW 0 ;SECTOR DB 1 SHL PB_INHX ;FLAGS (INHIBIT READ XFER) DW DEFBFR ;DMA DB 0 ;DMA BANK DW 0 ;XFER COUNT DB 0,0,0,0 ;STATUS, RESULTS IF ($ - PROMST) > PROMSIZ CONMSG **** ERROR! Code Too Large for PROM! **** ENDIF END