TITLE DISK BOOTSTRAP DRIVER II LIST NOCOND ;**************************************************************************** ; ; DISK CONTROLLER BOOTSTRAP DRIVER ; ; FOR M5B WITH ZMON MONITOR. ; (ALSO WILL WORK STAND-ALONE) ; ;**************************************************************************** ; ; 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 - 10 FEB 86 GRH ; Change Jade DD boot to resident prom version. ; Implement disk I/O driver functions & vectors. ; code drive ; 0x Jade #0 (40H) F0 ; 1x Jade #0 (40H) F1 ; 2x Jade #1 (41H) F0 ; 3x Jade #1 (41H) F1 ; 4x ISHA DRIVE 0 HEAD 0 ; 5x ISHA DRIVE 0 HEAD 2 ; 6x ISHA DRIVE 1 HEAD 0 ; 7x ISHA DRIVE 1 HEAD 2 ; Add error message output. ; VERSN EQU '30' ; ;**************************************************************************** SUBTTL DECLARATIONS ;============================================================================ ; ; CONSTANTS ; ;============================================================================ FALSE EQU 0 TRUE EQU NOT FALSE ; DEBUG EQU FALSE ; REV EQU 'C' ;JADE BOARD REVISION LEVEL ; BIOSSEC EQU 13 ;START SECTOR OF BIOS HNGTMO EQU 10 ;HANGUP TIMOUT SECSIZ EQU 128 ;DISK SECTOR SIZE ; ; SYSTEM LOCATIONS ; LOGINBY EQU 0004H ;CP/M CURRENT DRIVE & USER BYTE IOPB EQU 005CH ;USE DEFAULT FCB AS IOPB AREA DEFBFR EQU 0080H ;USE CPM DEFAULT BUFFER FOR BIOS SECTOR 1 PROMST EQU 0F800H XOVER EQU PROMST + 30H ;ROM CROSS-OVER POINT PROMSIZ EQU 2048 ;SIZE OF THIS PROM FOR CODE CHECKING ;============================================================================ ; ;*INCLUDE MONBOARD.DEF ;*INCLUDE COMIOPB.DEF ;*INCLUDE JDDCONT.DEF ;*INCLUDE ISHA.DEF ;*INCLUDE NAKEDT.DEF ;*INCLUDE HDISK.DEF ; ;============================================================================ LIST OFF *INCLUDE MONBOARD.DEF *INCLUDE COMIOPB.DEF *INCLUDE JDDCONT.DEF *INCLUDE ISHA.DEF *INCLUDE NAKEDT.DEF *INCLUDE HDISK.DEF LIST ON ;============================================================================ ; ; PAGE 0 RESERVED AREA ; ;============================================================================ ORG 0040H ; ; JADE CONTROLLER WINDOW PAGE ADDRESSES (0: NON-EXISTENT) ; FDC0 DS 1 ;FLOPPY CONTROLLER PAGE FOR PORT 40H FDC1 DS 1 ;FLOPPY CONTROLLER PAGE FOR PORT 41H FDC2 DS 1 ;FLOPPY CONTROLLER PAGE FOR PORT 42H FDC3 DS 1 ;FLOPPY CONTROLLER PAGE FOR PORT 43H ; FDCPRT DS 1 ;CURRENT JADE CONTROLLER PORT # ; ; BOOT VARIABLES ; ARGSAV DS 1 ;ARGUMENT SAVE BYTE BIOSLN DS 2 ;BIOS LENGTH SAVE/SECTOR COUNT BIOSNT DS 2 ;BIOS ENTRY SUBTTL MAIN PGM ORG PROMST ;---------------------------------------------------------------------------- ; ; STAND-ALONE ENTRY VECTOR ; ;---------------------------------------------------------------------------- JP COLD ;BOOT VECTOR ;---------------------------------------------------------------------------- ; ; CONSOLE INPUT ; EXIT - A= CHAR ; ;---------------------------------------------------------------------------- RET NOP NOP DS 3 ;RESERVE SPACE ;---------------------------------------------------------------------------- ; ; CONSOLE OUTPUT SUBR ; ENTRY- C= CHAR ; ;---------------------------------------------------------------------------- JP CO ;---------------------------------------------------------------------------- ; ; JADE FLOPPY DISK DRIVER VECTOR ; ENTRY- BC= IOPB PTR ; E= 0: NO DATA XFER ; EXIT - AF= 0: NO ERRORS ; BC,DE,HL,IX= ? ; ;---------------------------------------------------------------------------- JP JADEX ;---------------------------------------------------------------------------- ; ; ISHA DRIVER VECTOR ; ENTRY- BC= IOPB PTR ; EXIT - AF= 0: NO ERRORS ; BC,DE,HL,IX= ? ; ;---------------------------------------------------------------------------- JP ISHAX ;############################################################################ ; ; PUT VERSION # AT START OF 1ST VECTOR FOR USER ACCESS ; ;############################################################################ DB HIGH VERSN,'.',LOW VERSN ;---------------------------------------------------------------------------- ; ; COLD START FROM RESET IN CASE THIS IS ONLY PROM IN SYSTEM ; ;---------------------------------------------------------------------------- COLD: DI ;DISABLE ROM IMAGE OUT (COLDRES),A ; LD SP,DEFBFR ;SET UP COLD STACK LD C,0 ;SELECT OPTIONS JR BEGIN ;---------------------------------------------------------------------------- ; ; SWAP ROMS TO RETURN TO CALLER ; ;---------------------------------------------------------------------------- DS XOVER - $ ;POSITION CODE DKRET: LD A,XMONROM ;SELECT MONITOR FOR RETURN NOP ;ALIGN NEXT INSTRUCTION OUT (ROMSEL),A ; ; MONITOR ROM CONTINUES EXECUTION NOW ; ;---------------------------------------------------------------------------- ; ; BOOT CALLER HAS SWAPPED ROMS & STARTS EXECUTING HERE. ; ENTRY- C= ARGUMENTS: ; 7 0 ; |x| | | |x|x|x|x| ; ^ ^ ^__________ JADE CONTROLLER #1 DRIVE {0,1} ; | |____________ JADE CONTROLLER #2 DRIVE {0,1} ; |______________ ISHA HARD DISK (BIT 4 & 5= LOGICAL DRIVE) ; BHARDB EQU 2 ;ISHA HARD DISK BIT # ;---------------------------------------------------------------------------- BEGIN: ; ; SAVE ARGUMENT ; LD A,C ;CHECK OPTIONS LD (ARGSAV),A ; SAVE ARGS ; ; SET UP CONTROLLER TABLE AT 40H ; TABLE IS ARRANGED AS FOLLOWS: ; 40H= PORT 40H PAGE ADDRESS ; 41H= PORT 41H PAGE ADDRESS ; 42H= PORT 42H PAGE ADDRESS ; 43H= PORT 43H PAGE ADDRESS ; (0: NOT IN SYSTEM) ; LD HL,FDC0 ;INIT PORTS & ADDRESS LD B,ARGSAV - FDC0 IFD: LD (HL),0 INC HL DJNZ IFD ; LD BC,0440H ;START WITH PORT 40H FOR 4 PORTS LD HL,FDC0 IFD2: IN A,(C) ;GET BOARD STATUS INC A ;IF ALL 1S THEN NOT EXISTING JR Z,NOTHERE ; DEC A AND DDSASW ;COMPUTE BOARD ADDR RLCA OR DDBASE SHR 8 LD (HL),A ;STORE ADDRESS OF PORT NOTHERE: INC HL ;NEXT PORT INC C DJNZ IFD2 ; ; NOW VECTOR TO DISK BOOT ROUTINE ; LD A,(ARGSAV) AND 0F0H RRCA RRCA RRCA RRCA BIT BHARDB,A ;TEST FOR HARD DISK RES BHARDB,A ;CLEAR HARD DISK BIT LD (ARGSAV),A JP NZ,HBOOT ; ; FALL THROUGH TO JADE CONTROLLER BOOT ; SUBTTL JADE 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. ; ;---------------------------------------------------------------------------- ; ; COMPUTE THE PORT # ; LD A,(ARGSAV) ;PORT ADDRESS = 40H + (DRIVE# MOD 2) SRL A ADD A,40H CP A,44H ;IF PORT NOT {40H..43H} THEN ABORT JR NC,ABORT ; LD C,A ; ; RESET & START THE DISK PROCESSOR ; LD A,DDBGN CALL JWAIT JR NZ,ABORT ; ; TEST THE STATUS ; LD IX,IOPB CALL JGETRES CALL NZ,DBERR ;DIAGNOSTIC ERROR ; ; PREPARE IOPB ; CALL IIOPB ; LD A,(ARGSAV) ;SET DRIVE LD B,A AND A,1 ;SEPARATE DRIVE LD C,A LD A,B AND A,0FEH ;SEPARATE CONTROLLER SLA A OR A,C ;MERGE THE TWO LD (IOPB + PBDRVO),A ; ; LOG ON DRIVE ; LD BC,IOPB CALL JADEX CALL NZ,DBERR JP NZ,DKRET ; ; READ 1ST BIOS SECTOR ; LD (IX + PBSECO),BIOSSEC LD (IX + PBCMDO),DDRDS LD BC,IOPB CALL JADEX CALL NZ,DBERR JP NZ,DKRET ; ; FETCH PARAMETERS ; CALL STUPBIOS JP C,DKRET ; ; READ BIOS ; JADRDB: LD BC,IOPB ;EXECUTE THE IOPB CALL JADEX CALL NZ,DBERR JP NZ,DKRET ; INC (IX + PBSECO) ;NEXT SECTOR ; LD HL,(IOPB + PBDMAO) ;BUMP LOAD ADDRESS LD DE,SECSIZ ADD HL,DE LD (IOPB + PBDMAO),HL ; LD A,(BIOSLN) ;IF --COUNT != 0 THEN REPEAT DEC A LD (BIOSLN),A JR NZ,JADRDB ; ; EXECUTE THE BIOS COLD START ENTRY ; LD HL,(BIOSNT) JP (HL) ; ; ; ABORT RETURNS CONTROL TO THE MONITOR ROM ; ABORT: SCF ;HAVE MONITOR PRINT ERROR MESSAGE JP DKRET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; EXECUTE THE JADE IOPB FUNCTION ; ENTRY- BC= IOPB ADDRESS ; DRIVE= {0..3}: PORT 40H, {4..7}: PORT 41H ; EXIT - AF= 0: NO ERRORS ; IX= IOPB ADDRESS ; A,BC,HL,DE= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ JADEX: ; ; SAVE ARGUMENTS ; PUSH BC ;USE IX AS IOPB PTR POP IX ; ; SELECT OPERATION ; LD A,(IX + PBCMDO) CP A,NJCMDS JP C,JADE1 ; ; ERROR ; DSKERR: LD A,-1 OR A,A RET ; ; ; COMMAND OK, COMPUTE CONTROLLER PORT ; JADE1: LD A,(IX + PBDRVO) ;PORT = DRIVE MOD 4 SRL A SRL A ADD A,40H CP A,44H ;IF CONTROLLER > #4 THEN ERROR JR NC,DSKERR ; ; SAVE PORT # ; LD (FDCPRT),A LD C,A ; ; USE COMMAND TO INDEX INTO DRIVER TABLE ; LD A,(IX + PBCMDO) LD E,A LD D,0 LD HL,JADETBL ADD HL,DE ADD HL,DE LD A,(HL) INC HL LD H,(HL) LD L,A JP (HL) ; ; COMMAND TYPE TABLE ; JADETBL: DW JTYPE1 ;LOGON DISK DW JTYPE1 ;READ SECTOR DW JTYPE2 ;WRITE SECTOR DW JTYPE3 ;FORMAT TRACK DW JTYPE1 ;READ ADDRESS DW JTYPE4 ;EIA OUTPUT DW JTYPE4 ;EIA STATUS DW JTYPE4 ;IDLE DW JTYPE4 ;RETURN VERSION DW JTYPE4 ;SET DISK FLAGS DW JTYPE4 ;LOAD HEAD & IDLE DW JTYPE4 ;SEEK TRACK DW JTYPE4 ;SET DRIVE PARAMETERS DW JTYPE4 ;RETURN DRIVE STATUS DW JTYPE4 ;SET EIA BAUD RATE DW JTYPE4 ;CLEAR NJCMDS EQU ($ - JADETBL) / 2 ; ;---------------------------------------------------------------------------- ; ; TYPE 1 JADE COMMAND XFERS SECTOR DATA FROM CONTROLLER ; ;---------------------------------------------------------------------------- JTYPE1: ; ; EXECUTE COMMAND ; CALL JEX RET NZ ;IF ERROR THEN QUIT ; ; XFER DATA FROM CONTROLLER ; LD A,DDMB0 ;SOFTLY GRAB RESOURCES WITHOUT INTERRUPT OUT (C),A LD A,DDMB1 ;OPEN WINDOW TO SECTOR BUFFER (BANK 1) OUT (C),A ; LD E,(IX + PBDMAO) ;FETCH DESTINATION ADDRESS LD D,(IX + [PBDMAO + 1]) ; LD L,C ;FETCH FDC ADDRESS LD H,0 LD H,(HL) LD L,0 ; PUSH BC LD C,(IX + PBST4O) ;FETCH COUNT LD B,(IX + PBST5O) ; BIT PBFNXB,(IX + PBFLGO) ;IF FLAG == TRUE THEN NO XFER JR NZ,JT1 ; LD A,C ;IF COUNT == 0 THEN NO XFER OR A,B JR Z,JT1 ; LDIR ;XFER DATA JT1: POP BC ; ; REMOVE JADE WINDOW ; XOR A,A OUT (C),A RET ;---------------------------------------------------------------------------- ; ; TYPE 2 JADE COMMAND XFERS SECTOR DATA TO CONTROLLER ; ;---------------------------------------------------------------------------- JTYPE2: ; ; XFER DATA TO CONTROLLER ; LD A,DDMB1 ;OPEN WINDOW TO SECTOR BUFFER (BANK 1) OUT (C),A ; LD E,(IX + PBDMAO) ;FETCH DESTINATION ADDRESS LD D,(IX + [PBDMAO + 1]) ; LD L,C ;FETCH CONTROLLER ADDRESS LD H,0 LD H,(HL) LD L,0 EX DE,HL ; PUSH BC ;SAVE PORT # LD C,(IX + PBST4O) ;FETCH COUNT LD B,(IX + PBST5O) ; BIT PBFNXB,(IX + PBFLGO) ;IF FLAG == TRUE THEN NO XFER JR NZ,JT2 ; LD A,C ;IF COUNT == 0 THEN NO XFER OR A,B JR Z,JT2 ; LDIR ;XFER DATA JT2: POP BC ; ; FALL INTO THE JADE EXECUTION FUNCTION ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; EXECUTE THE JADE IOPB FUNCTION ; ENTRY- C= CONTROLLER PORT # {40..43H} ; IX= IOPB ADDRESS ; EXIT - AF= 0: NO ERRORS ; B, DE, HL= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ JEX: LD A,DDMB0 ;OPEN WINDOW TO COMMAND BUFFER (BANK 0) OUT (C),A ; LD L,C ;COMPUTE CDB OFFSET ADDRESS LD H,0 LD H,(HL) LD L,0 LD DE,DDCBO ADD HL,DE EX DE,HL ; PUSH IX ;SET IOPB ADDRESS POP HL ; PUSH BC ;SAVE PORT # LD BC,IOPBSZ LDIR POP BC ; ; EXECUTE THE COMMAND ; LD A,DDEXC ;START COMMAND CALL JWAIT ;WAIT FOR COMPLETION RET NZ ; ; FALL INTO GET RESULTS FUNCTION ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; COMMAND EXECUTED, XFER RESULTS FUNCTION ; ENTRY- IX= IOPB ADDRESS ; C= PORT ADDRESS OF BOARD {40..43H} ; (00[C])= HI BYTE BASE ADDRESS OF BOARD ; EXIT - AF= 0: NO ERRORS ; DE, HL= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ JGETRES: LD A,DDMB0 ;RESELECT COMMAND BLOCK WINDOW OUT (C),A ; PUSH IX ;XFER IOPB RESULTS POP DE ; LD L,C ;COMPUTE IOPB LOCATION IN CONTROLLER LD H,0 LD H,(HL) LD L,0 PUSH BC ;SAVE PORT # LD BC,DDCBO ADD HL,BC LD BC,IOPBSZ ;COUNT = REMAINDER LDIR POP BC ; ; RELEASE IOPB WINDOW ; XOR A,A OUT (C),A ; ; CHECK FOR ERROR ; LD A,(IX + PBSTATO) OR A,A RET ;---------------------------------------------------------------------------- ; ; TYPE 3 JADE COMMAND XFERS FORMAT PGM TO CONTROLLER ; ;---------------------------------------------------------------------------- JTYPE3: ; ; XFER FORMAT PROGRAM TO CONTROLLER ; LD A,DDMB0 ;SELECT COMMAND BANK OUT (C),A ; LD L,(IX + PBDMAO) LD H,(IX + [PBDMAO + 1]) LD E,C LD D,0 LD A,(DE) LD D,A LD E,0 ; PUSH BC LD C,(IX + PBST4O) LD B,(IX + PBST5O) ; BIT PBFNXB,(IX + PBFLGO) ;IF FLAG == TRUE THEN NO XFER JR NZ,JT3 ; LD A,C ;IF COUNT == 0 THEN NO XFER OR A,B JR Z,JT3 ; LDIR ;XFER DATA JT3: POP BC ; ; EXECUTE THE FORMAT DRIVER ; JP JEX ;---------------------------------------------------------------------------- ; ; TYPE 4 JADE COMMAND XFERS IOPB ONLY TO/FROM CONTROLLER ; ;---------------------------------------------------------------------------- JTYPE4: EQU JEX ;**************************************************************************** ; ; WAIT ON JADE CONTROLLER BUSY FUNCTION ; ENTRY- A= COMMAND TO OUTPUT ; C= PORT OF CONTROLLER ; EXIT - AF= 0: OK, /0: ERROR ; DE,HL= ? ; ;**************************************************************************** JWAIT: OUT (C),A ;ISSUE CMD EX (SP),HL ;WASTE SOME TIME FOR DD TO CATCH UP 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 D JR NZ,JWAIT2 ; DEC L ;IF TIME OUT THEN RETURN TO MONITOR OR L JP Z,DSKERR ; JWAIT2: IN A,(C) ;IF NOT DONE THEN WAIT AND A,DDSHLT JR NZ,JWAIT1 ; RET ;RETURN ZF IF $ >= 0FC00H CONMSG *** JADE DEPENDENT CODE OVERLAPS CONTROLLER MAP *** ENDIF SUBTTL HARD DISK BOOT ;**************************************************************************** ; ; Hard disk boot function. ; This module reads the BIOS image to the proper system ; address & jumps to the BIOS cold start entry point. ; ;**************************************************************************** HBOOT: ; ; ISSUE CONTROLLER RESET & CONTINUE ; LD A,1 SHL HRESET OUT (HCMD),A XOR A OUT (HCMD),A ; ; INSURE FDC WINDOW REMOVED ; LD BC,0440H XOR A,A H1: OUT (C),A INC C DJNZ H1 ; ; SET UP IOPB IN RAM ; CALL IIOPB ; ; SAVE LOGIN DRIVE FOR BIOS ; LD A,(ARGSAV) ;COMPUTE & SET DRIVE LD (LOGINBY),A ;STORE DRIVE IN CP/M LOGIN BYTE FOR CBIOS ; ; COMPUTE LOGICAL DRIVE FOR IOPB ; SRL A ;DRIVE = LOGICAL_DRIVE / 2 LD (IOPB + PBDRVO),A ; ; COMPUTE SECTOR FROM LOGICAL DRIVE ; RRA ;IF ODD DRIVE THEN SECTOR += 128 AND A,80H EXX ;SAVE SECTOR OFFSET IN C' FOR LATER USE LD C,A ; EVEN= 0, ODD= 80H (128) ; LD A,(IOPB + PBSECO) ;IF ODD, THEN USE PLATTER 1 OR C LD (IOPB + PBSECO),A EXX ; CLRWT: IN A,(HSTATUS) ;WAIT FOR CONTROLLER READY CP 0FFH ;IF NOT INSTALLED THEN QUIT JP Z,DKRET ; BIT HBUSYB,A ;ELSE WAIT JR NZ,CLRWT ; ; WAIT A WHILE IN CASE HOST ADAPTER FIDDLING WITH STATUS PORT ; LD HL,0 HB1: DEC HL LD A,H OR L JR NZ,HB1 ; ; AND CHECK AGAIN ; IN A,(HSTATUS) BIT HBUSYB,A JR NZ,CLRWT ;IF BUSY AGAIN THEN CONTINUE TO WAIT ; ; CHECK SELF TEST STATUS ; LD IX,IOPB CALL DQERR ; ; FORCE HOST ADAPTER LOG-ON ; LD BC,IOPB CALL ISHAX ;LOGON DRIVE CALL DQERR RET NZ ; ; NOW READ THE DIRECTORY SECTOR ; LD (IX + PBCMDO),DDRDS LD (IX + PBSECO),HDIRSEC LD BC,IOPB CALL ISHAX ;READ THE DIRECTORY SECTOR (IOPB SET UP) CALL DQERR RET NZ ; ; LOAD THE CBIOS ; LD A,(DEFBFR + HDBIOSS) ;FETCH CBIOS SECTOR FROM DIRECTORY EXX ;ADD IN LOGICAL DRIVE OFFSET OR C EXX LD (IOPB + PBSECO),A ; LD BC,IOPB CALL ISHAX ;LOAD IN CBIOS SECTOR #1 CALL DQERR ;CHECK FOR ERRORS RET NZ ; CALL STUPBIOS ;SET UP IOPB FOR BIOS READ JP C,DKRET ; HDRDLP: LD BC,IOPB CALL ISHAX CALL DQERR RET NZ ; INC (IX + PBSECO) ;NEXT SECTOR (IX SET TO IOPB BY ISHAX) ; LD HL,(IOPB + PBDMAO) ;BUMP DMA ADDRESS LD DE,SECSIZ ADD HL,DE LD (IOPB + PBDMAO),HL ; LD A,(BIOSLN) ;IF NOT DONE THEN LOOP DEC A LD (BIOSLN),A JR NZ,HDRDLP ; LD HL,(BIOSNT) ;BIOS LOADED, GO EXECUTE IT IF NOT DEBUG JP (HL) ELSE ;IF DEBUG THEN RETURN NO ERRORS OR A JP DKRET ENDIF ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; ISHA DRIVER ; ENTRY- BC= IOPB ADDRESS ; EXIT - AF= 0: NO ERRORS ; IX= IOPB ADDRESS ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ISHAX: PUSH BC POP IX ; ; OUTPUT THE IOPB ADDRESS TO HOST ADAPTER ; LD A,C OUT (HDATA),A LD A,HIOPBL OUT (HCMD),A CALL HWBUSY ; LD A,B OUT (HDATA),A LD A,HIOPBH OUT (HCMD),A CALL HWBUSY ; XOR A,A OUT (HDATA),A LD A,HIOPBX OUT (HCMD),A CALL HWBUSY ; ; OUTPUT THE EXECUTE IOPB COMMAND ; LD A,HEXEC OUT (HCMD),A CALL HWBUSY ; ; RETURN THE ERROR STATUS ; LD A,(IX + PBSTATO) OR A,A RET ;**************************************************************************** ; ; HWBUSY SUBR WAITS UNTIL HOST ADAPTOR GOES NOT BUSY ; EXIT - A= STATUS ; ZF= TRUE ; ;**************************************************************************** HWBUSY: IN A,(HSTATUS) ;WAIT FOR DONE BIT HBUSYB,A JR NZ,HWBUSY RET ;**************************************************************************** ; ; COMMON SETUP IOPB FOR BIOS READ SUBR ; ENTRY- CBIOS SECTOR #1 IN DEFBFR ; EXIT - CF= ERROR ; IX= IOPB ADDRESS ; A,HL,DE,BC= ? ; ;**************************************************************************** STUPBIOS: LD A,(DEFBFR + 1) ;FETCH BIOS LOAD PARAMETERS CP A,SECSIZ ;CHECK LIMITS OF OFFSET CCF RET C ; LD HL,DEFBFR ;COMPUTE OFFSET TO CBIOS VECTORS LD E,A LD D,0 ADD HL,DE ; DEC HL ;FETCH BIOS LOAD ADDRESS LD D,(HL) DEC HL LD E,(HL) ; IF DEBUG LD DE,(ARG2) ;DEBUG, LOAD IN AT ARG 2 ENDIF LD (BIOSNT),DE ;SAVE START ADDRESS ; DEC HL ;FETCH BIOS LENGTH LD B,(HL) DEC HL LD C,(HL) LD (BIOSLN),BC ;SAVE IT ; LD HL,DEFBFR ;MOVE THIS SECTOR TO PROPER PLACE LD BC,SECSIZ LDIR ; LD (IOPB + PBDMAO),DE ;SET UP NEW DMA ADDRESS ; LD IX,IOPB ;POINT TO IOPB INC (IX + PBSECO) ;NEXT SECTOR ; LD HL,(BIOSLN) ;COMPUTE # SECTORS LD A,L ;IF NOT EVEN SECTOR THEN BUMP 1 AND A,7FH JR Z,NOBUMP ; LD DE,SECSIZ ADD HL,DE ; NOBUMP: LD A,L RLA ;PUT BIT 7 INTO BIT 0 OF H RL H LD A,H DEC A ;ALREADY HAVE 1ST SECTOR LD (BIOSLN),A ;PUT INTO VAR ; ; RETURN NO ERROR ; OR A,A RET ;**************************************************************************** ; ; INITIALIZE THE IOPB STRUCTURE IN RAM ; EXIT - HL= DEFBFR ; B= 0 ; ;**************************************************************************** IIOPB: ; ; ZERO OUT THE IOPB ; LD HL,IOPB LD B,IOPBSZ ZIOPB: LD (HL),0 INC HL DJNZ ZIOPB ; ; SET THE XFER COUNT ; LD HL,SECSIZ LD (IOPB + PBST4O),HL ; ; SET THE XFER ADDRESS ; LD HL,DEFBFR LD (IOPB + PBDMAO),HL RET ;**************************************************************************** ; ; CONVERT BINARY NIBBLE TO ASCII-HEX & OUTPUT SUBR ; ENTRY- A= BINARY ; ;**************************************************************************** HTOA: ; ; CONVERT UPPER NIBBLE 1ST ; PUSH AF RRCA RRCA RRCA RRCA CALL CONV ; ; NOW CONVERT LOWER NIBBLE ; POP AF CONV: AND A,0FH ;INSURE ONLY NIBBLE ADD A,90H ;CONVERT DAA ADC A,40H DAA LD C,A ;OUTPUT ; ; FALL INTO CONSOLE OUTPUT ; ;**************************************************************************** ; ; CONSOLE OUTPUT SUBR ; ENTRY- C= CHAR ; EXIT - AF= ? ; ;**************************************************************************** CO: IN A,(NTS) ;IF BUSY THEN WAIT AND A,1 SHL NTBSY JR NZ,CO ; LD A,C OUT (NTD),A RET ;**************************************************************************** ; ; DISK ERROR OUTPUT SUBR ; ENTRY- IX= IOPB BASE ; EXIT - AF= 0: NO ERROR ; HL,DE= ? ; ;**************************************************************************** DQERR: LD A,(IX + PBSTATO) ;CHECK FOR ERROR OR A,A RET Z ; DBERR: PUSH BC ;SAVE PORT # ; ; NEW LINE ; CALL CRLF ; ; OUTPUT TEXT ; LD HL,DERM CALL PUTS ; ; OUTPUT STATUS BYTES ; PUSH IX POP HL LD DE,PBSTATO ADD HL,DE LD B,PBST5O - PBSTATO + 1 ; DBTE1: LD A,(HL) CALL HTOA CALL SPACE INC HL DJNZ DBTE1 ; CALL CRLF POP BC ;RESTORE PORT # JP DSKERR ; DERM: DM 'Disk Error, Status = ' ;**************************************************************************** ; ; NEW LINE SUBR ; EXIT - AF, C= ? ; ;**************************************************************************** CRLF: LD C,0DH CALL CO LD C,0AH JR CO ;**************************************************************************** ; ; PRINT TEXT SUBR ; ENTRY- HL= TEXT PTR (LAST CHAR HAS BIT 7 SET) ; EXIT - HL, C, A= ? ; ;**************************************************************************** PUTS: LD C,(HL) RES 7,C CALL CO ; BIT 7,(HL) RET NZ ; INC HL JR PUTS ;**************************************************************************** ; ; OUTPUT SPACE TO CONSOLE SUBR ; ;**************************************************************************** SPACE: LD C,' ' JR CO IF ($ < PROMST) OR ($ > (PROMST + PROMSIZ)) CONMSG ERROR! Code Too Large for PROM! ENDIF END