TITLE DISK BOOTSTRAP DRIVER II LIST NOCOND ;**************************************************************************** ; ; DISK CONTROLLER BOOTSTRAP DRIVER ; ; FOR M5B WITH ZMON MONITOR. ; ;**************************************************************************** ; ; 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. ; VERSN EQU 306 ; ;**************************************************************************** SUBTTL DECLARATIONS ;============================================================================ ; ; CONSTANTS ; ;============================================================================ FALSE EQU 0 TRUE EQU NOT FALSE ; DEBUG EQU FALSE ; LF EQU 0AH CR EQU 0DH ; HNGTMO EQU 10 ;HANGUP TIMOUT SECSIZ EQU 128 ;DISK SECTOR SIZE ; ; SYSTEM LOCATIONS ; LOGINBYTE 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 PROMSIZ EQU 2048 ;SIZE OF THIS PROM FOR CODE CHECKING ;============================================================================ ; ;*MACLIB ASMBTOOL.MLB ;*INCLUDE ZMONROM.DEF ;*INCLUDE MONBOARD.DEF ;*INCLUDE DKBTROM.DEF ;*INCLUDE COMIOPB.DEF ;*INCLUDE JDDCONT.DEF ;*INCLUDE ISHA.DEF ;*INCLUDE NAKEDT.DEF ;*INCLUDE DISKS.DEF ; ;============================================================================ LIST OFF *MACLIB ASMBTOOL.MLB *INCLUDE ZMONROM.DEF *INCLUDE MONBOARD.DEF *INCLUDE DKBTROM.DEF *INCLUDE COMIOPB.DEF *INCLUDE JDDCONT.DEF *INCLUDE ISHA.DEF *INCLUDE NAKEDT.DEF *INCLUDE DISKS.DEF LIST ON SUBTTL UNINITIALIZED DATA ;############################################################################ ; ; PAGE 0 RESERVED AREA ; ;############################################################################ ORG 0040H ; ; BOOT VARIABLES ; PHASECK DK_PROM DKPROM DS 2 ;PROM # & DRIVE PASSED TO BIOS BIOSLN DS 2 ;BIOS LENGTH SAVE/SECTOR COUNT BIOSNT DS 2 ;BIOS ENTRY SUBTTL MAIN PGM ORG PROMST ;---------------------------------------------------------------------------- ; ; STAND-ALONE ENTRY VECTOR ; ;---------------------------------------------------------------------------- PHASECK DK_COLD JP COLD ;BOOT VECTOR ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; CONSOLE INPUT ; EXIT - A= CHAR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ PHASECK MR_CONIN RET NOP NOP ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; DISK ROM FUNCTION ; ENTRY- C= FUNCTION # ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ PHASECK DK_FUNC JP DKFUNC ;**************************************************************************** ; ; CONSOLE OUTPUT SUBR ; ENTRY- C= CHAR ; ;**************************************************************************** PHASECK MR_CONOUT JP CO ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; JADE FLOPPY DISK DRIVER VECTOR ; ENTRY- IX= IOPB PTR ; EXIT - AF= 0: NO ERRORS ; BC,DE,HL,IX= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ PHASECK DK_DSKX JP DSKX SUBTTL MAIN FUNCTIONS ;---------------------------------------------------------------------------- ; ; COLD START FROM RESET IN CASE THIS IS ONLY PROM IN SYSTEM ; ;---------------------------------------------------------------------------- COLD: DI ;DISABLE ROM IMAGE OUT (M2_CLDRES),A ; LD SP,DEFBFR ;SET UP COLD STACK LD B,0 ;SELECT OPTIONS JR BEGIN ;---------------------------------------------------------------------------- ; ; SWAP ROMS BACK TO MONITOR ROM TO RETURN TO CALLER PROCEDURE ; ;---------------------------------------------------------------------------- DS MR_XOVER -$ - 5 ;POSITION CODE ; ; THESE STACK OPERATIONS ALLOW US TO PASS AN 'AF' VALUE BACK AND STILL BE ; ABLE TO USE THE 'A' REGISTER FOR THE 'OUT' INSTRUCTION. ; THE MONITOR HAS ALREADY PUT A DUMMY VALUE ON THE STACK BEFORE IT'S 'OUT' ; INSTRUCTION IN ORDER TO MAINTAIN STACK BALANCE IN CASE THE SWAP DID NOT ; TAKE PLACE. THIS CODE REPLACES THAT VALUE WITH OURS. ; DKRET: INC SP ;SCRAP MONITOR STACK BALANCER INC SP ; PUSH AF ;NEED A, PASS OUR ARG ON STACK ; LD A,MR_RNUM ;SELECT MONITOR FOR RETURN ; ; THE FOLLOWING OUT INSTRUCTION MUST RESIDE AT 0F833H ; IF $ <> MR_XOVER CONMSG **** WARNING! Xover Address Mismatch! **** ENDIF OUT (M2_RSEL),A ; ; MONITOR ROM CONTINUES EXECUTION NOW ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; ROM FUNCTION DISPATCHER GETS CONTROL FROM MONITOR ROM WHICH EXECUTED ; CODE SIMILAR TO THE PREVIOUS FUNCTION ; ENTRY- D= FUNCTION #: ; 0: RETURN VERSION # IN HL ; 1: BOOT DISK WITH ARGUMENT IN BC ; 2: TEST IOPB STATUS FOR ERROR ; E:HL= PTR TO IOPB ; 3: DISPLAY IOPB DATA ; E:HL= PTR TO IOPB ; 4: EXECUTE IOPB ; E:HL= PTR TO IOPB ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; TEST FOR IOPB EXECUTION ; LD A,D CP A,4 JP Z,EX_IOPB ; ; IF VERSION THEN EXIT ; CP A,1 JR C,RET_VER ; ; IF BOOT THEN EXIT ; JR Z,MBOOT ; ; IF TEST IOPB THEN EXIT ; CP A,3 JR C,TST_PB ; ; IF DISPLAY DATA THEN EXIT ; JR Z,DIS_PB ; ; ELSE FUNCTION ERROR ; LD A,-1 OR A,A SCF JR DKRET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN VERSION # FUNCTION 0 ; EXIT - HL= VERSION # ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ RET_VER: LD HL,VERSN XOR A,A JR DKRET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; TEST IOPB STATUS FOR ERROR FUNCTION 2 ; ENTRY- E:HL= IOPB PTR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ TST_PB: ; ; PUT IN INTERNAL REGS ; PUSH HL POP IX ; CALL DQERR ; JR DKRET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; DISPLAY IOPB DATA FUNCTION 3 ; ENTRY- E:HL= IOPB PTR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ DIS_PB: ; ; PUT IN INTERNAL REGS ; PUSH HL POP IX ; CALL DBERR ; JR DKRET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; EXECUTE IOPB FUNCTION 4 ; ENTRY- E:HL= IOPB PTR ; EXIT - IOPB.STATUS= 0: OK, /0: ERROR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ EX_IOPB: ; ; PUT IN INTERNAL REGS ; PUSH HL POP IX ; ; EXECUTE NORMALLY ; CALL DSKX ; JP DKRET ;---------------------------------------------------------------------------- ; ; BOOT CALLER HAS SWAPPED ROMS & STARTS EXECUTING HERE. ; ENTRY- B= DRIVE # ; 0..3 = 8" JADE FLOPPY ; 4..7 = 8" HARD DISK (ISHA) ; 8..B = 5" JADE FLOPPY ; C..F = 8" MICROMATION (INTEL M2FM) ; 10..13 = 3" JADE FLOPPY ; ;---------------------------------------------------------------------------- MBOOT: BEGIN: ; ; 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 JR 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 JR 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 MICROMATION THEN EXIT JP C,M8BOOT ; CP A,14H ;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 JR DKRET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; 3" JADE FLOPPY DISK BOOT ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ F3BOOT: EQU ABORT ;UNSUPPORTED ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; 5" JADE FLOPPY DISK BOOT ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ F5BOOT: EQU ABORT ;UNSUPPORTED ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; 8" MICROMATION M2FM BOOT ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ M8BOOT: EQU ABORT ;UNSUPPORTED SUBTTL JADE BOOT ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; 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: ; ; SET THE PORT # ; EXX LD C,DD_PRT8 IN A,(C) AND A,DD_SASW RLCA OR A,HIGH DD_BASE LD H,A LD L,0 EXX ; ; RESET & START THE DISK PROCESSOR ; LD A,DD_BGN CALL JWAIT JR NZ,ABORT ; ; TEST THE SELF TEST STATUS ; LD IX,IOPB CALL JGETRES CALL NZ,DBERR ;DIAGNOSTIC ERROR ; ; PREPARE IOPB ; LD HL,LOGIOPB CALL IIOPB ; LD A,(LOGINBYTE) ;SET DRIVE LD (IOPB + PB_DRVO),A ; LD A,2 ;SET SECTOR LD (IOPB + PB_SECO),A ; ; LOG ON DRIVE ; CALL DSKX CALL NZ,DBERR JP NZ,DKRET ; ; READ THE DIRECTORY SECTOR ; LD (IX + PB_SECO),BD_SEC LD (IX + PB_CMDO),PB_READC CALL DSKX CALL NZ,DBERR JP NZ,DKRET ; ; IF NOT DIRECTORY SECTOR THEN ERROR ; LD A,(DEFBFR) CP A,86H 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 DSKX 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 DSKX CALL NZ,DBERR JP NZ,DKRET ; INC (IX + PB_SECO) ;NEXT SECTOR ; LD HL,(IOPB + PB_DMAO) ;BUMP LOAD ADDRESS LD DE,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 ; LD HL,(BIOSNT) JP (HL) ENDIF SUBTTL DISK IOPB EXECUTOR ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; EXECUTE THE DISK IOPB FUNCTION ; ENTRY- IX= IOPB ADDRESS ; EXIT - AF= 0: NO ERRORS ; ; A,BC,BC',HL,HL',DE= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ DSKX: ; ; COMMAND OK, COMPUTE CONTROLLER PORT ; LD A,(IX + PB_DRVO) CP A,NDRVS ;IF DRIVE # OUT OF RANGE THEN RETURN ERROR JP NC,JSELERR ; LD HL,DRVPRT ;CALULATE DRIVE PORT TABLE ELEMENT ADD A,L LD L,A LD A,0 ADC A,H LD H,A LD A,(HL) ;FETCH CONTROLLER PORT EXX LD C,A EXX ; CP A,ISH_STATUS ;IF HARD DISK THEN EXIT JP Z,ISHAX ; DEC A ;IF MICROMATION THEN EXIT JP Z,M2X ; JP JADEX ;ELSE MUST BE JADE CONTROLLER ; ; ; DRIVE PORT TABLE ; DRVPRT: JADE8: REPT 4 ;8" FLOPPY DRIVES DB DD_PRT8 ENDM ISHA8: REPT 4 ;8" HARD DISK DRIVES DB ISH_STATUS ENDM JADE5: REPT 4 ;5" FLOPPY DRIVES DB DD_PRT5 ENDM ISHA5: REPT 4 ;5" HARD DISK DB ISH_STATUS ENDM MM8: REPT 4 ;8" MICROMATION DOUBLER DRIVES DB 1 ENDM JADE3: REPT 4 ;3" FLOPPY DRIVES DB DD_PRT3 ENDM NDRVS EQU $ - DRVPRT SUBTTL JADE FLOPPY CONTROLLER PRIMITIVES ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; EXECUTE THE DISK IOPB FUNCTION ; ENTRY- IX= IOPB ADDRESS ; C'= CONTROLLER PORT ADDRESS ; EXIT - AF= 0: NO ERRORS ; ; A,BC,BC',HL,HL',DE= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ JADEX: ; ; CHECK FOR CONTROLLER PRESENT ; EXX IN A,(C) EXX INC A ;0FFH IF NOT THERE JR Z,JCNP ; ; COMPUTE JADE CONTROLLER BASE ADDRESS ; DEC A ;FETCH ADDRESS SELECT SWITCH DATA AND A,DD_SASW RLCA OR A,HIGH DD_BASE EXX LD H,A LD L,0 EXX ; ; USE COMMAND TO INDEX INTO DRIVER TABLE ; LD A,(IX + PB_CMDO) ;IF UNSUPPORTED COMMAND THEN ERROR CP A,NJCMDS JR NC,DCMDERR ; 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 ; ; IF NEEDED, BIAS DRIVE DOWN ; LD A,(IX + PB_DRVO) PUSH AF ;SAVE FOR LATER RESTORATION ; CP A,4 ;IF 8" THEN NO NEED JR C,JADEOK ; SUB A,8 ;SKIP OVER 8" HARD DISK CP A,4 ;IF 5" THEN OK JR C,JADEOK ; SUB A,8 ;SKIP OVER MICROMATION TO 3", ASSUME OK ; JADEOK: LD (IX + PB_DRVO),A PUSH HL LD HL,JADERET EX (SP),HL JP (HL) ;EXECUTE THE DRIVER TYPE ; ; JADE ROUTINES RETURN HERE ; JADERET: POP HL ;RESTORE DRIVE BUT SAVE FLAGS (ERROR) LD (IX + PB_DRVO),H RET ;############################################################################ ; ; COMMAND TYPE TABLE ; ;############################################################################ JADETBL: DW JTYPE1 ;LOGON DISK RETURN SECTOR DATA DW JTYPE1 ;READ SECTOR " " " DW JTYPE2 ;WRITE SECTOR SEND SECTOR DATA DW JTYPE2 ;FORMAT TRACK " " " DW JTYPE1 ;READ ADDRESS RETURN SECTOR DATA DW JTYPE4 ;EIA OUTPUT IOPB ONLY DW JTYPE4 ;EIA STATUS " " DW JTYPE4 ;IDLE " " DW JTYPE4 ;RETURN VERSION " " DW JTYPE5 ;SET DISK FLAGS SECTOR DATA BOTH WAYS DW JTYPE4 ;LOAD HEAD & IDLE IOPB ONLY DW JTYPE4 ;SEEK TRACK " " DW JTYPE5 ;SET DRIVE PARAMETERS SECTOR DATA BOTH WAYS DW JTYPE4 ;RETURN DRIVE STATUS IOPB ONLY DW JTYPE4 ;SET EIA BAUD RATE " " DW JTYPE4 ;CLEAR " " NJCMDS EQU ($ - JADETBL) / 2 ;**************************************************************************** ; ; ILLEGAL COMMAND ERROR ; ;**************************************************************************** DCMDERR: LD (IX + PB_STATO),PB_ILCMD ; ; COMMON ERROR CODE ; DSKERR: LD A,-1 OR A,A RET ;**************************************************************************** ; ; ILLEGAL DRIVE REQUESTED ; ;**************************************************************************** JSELERR: LD (IX + PB_STATO),PB_ILCMD JP DSKERR ;**************************************************************************** ; ; CONTROLLER NOT SENSED ERROR ; ;**************************************************************************** JCNP: LD (IX + PB_STATO),PB_CNP JP DSKERR ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; TYPE 1 JADE COMMAND XFERS SECTOR DATA FROM CONTROLLER ; ENTRY- IX= IOPB PTR ; HL'= CONTROLLER WINDOW PTR ; C'= CONTROLLER PORT ; EXIT - AF= 0: NO ERRORS ; B, DE, HL= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ JTYPE1: ; ; EXECUTE COMMAND ; CALL JEX RET NZ ;IF ERROR THEN QUIT ; ; XFER DATA FROM CONTROLLER ; JT1A: EXX 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 FDC ADDRESS ; PUSH HL EXX POP HL ; ; 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 > 1024 THEN ERROR ; LD A,B CP A,4 JR NC,JT1B ; ; ELSE IF COUNT > 0 THEN XFER DATA ; OR A,C JR Z,JT1 ; LDIR ; ; REMOVE JADE WINDOW BEFORE RETURNING ; JT1: EXX XOR A,A OUT (C),A EXX ; RET ; ; ; ILLEGAL IOPB FORMAT ERROR ; JT1B: CALL JT1 ;REMOVE CONTROLLER WINDOW BADIOPB: LD (IX + PB_STATO),PB_BADPB ;PASS BACK ERROR JP DSKERR ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN NO ERRORS FUNCTION ; EXIT - A= 0 ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ DSKOK: XOR A,A RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; TYPE 2 JADE COMMAND XFERS SECTOR DATA TO CONTROLLER ; ENTRY- IX= IOPB PTR ; HL'= CONTROLLER WINDOW PTR ; C'= CONTROLLER PORT ; EXIT - AF= 0: NO ERRORS ; B, DE, HL= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ JTYPE2: ; ; OPEN WINDOW TO SECTOR BUFFER ; EXX LD A,DD_MB1 JT2A: OUT (C),A ; ; FETCH CONTROLLER ADDRESS FOR DESTINATION ; PUSH HL EXX POP DE ; ; FETCH SOURCE ADDRESS FROM IOPB ; 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 > 1024 THEN ERROR ; LD A,B CP A,4 JR NC,JT1B ; ; ELSE IF COUNT > 0 THEN XFER DATA ; OR A,C JR Z,JT2 ; LDIR ; JT2: ; ; FALL INTO THE JADE EXECUTION FUNCTION ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; EXECUTE THE JADE IOPB FUNCTION ; ENTRY- IX= IOPB PTR ; HL'= CONTROLLER WINDOW PTR ; C'= CONTROLLER PORT ; EXIT - AF= 0: NO ERRORS ; B, DE, HL= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ JEX: ; ; OPEN WINDOW TO COMMAND BUFFER ; EXX LD A,DD_MB0 ;OPEN WINDOW TO COMMAND BUFFER (BANK 0) OUT (C),A ; ; COMPUTE OFFSET TO CDB ; PUSH HL EXX POP HL LD DE,DD_CBO ADD HL,DE EX DE,HL ; ; IOPB ADDRESS IS SOURCE ; PUSH IX ;SET IOPB ADDRESS POP HL ; ; DOWNLOAD THE IOPB ; LD BC,PB_STATO ;ONLY XFER PERTINENT BYTES LDIR ; ; EXECUTE THE COMMAND ; LD A,DD_EXC ;START COMMAND CALL JWAIT ;WAIT FOR COMPLETION RET NZ ;IF ERROR THEN RETURN ERROR ; ; FALL INTO GET RESULTS FUNCTION ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; COMMAND EXECUTED, XFER RESULTS FUNCTION ; ENTRY- IX= IOPB PTR ; HL'= CONTROLLER WINDOW PTR ; C'= CONTROLLER PORT ; EXIT - AF= 0: NO ERRORS ; B, DE, HL= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ JGETRES: ; ; SELECT COMMAND BLOCK WINDOW ; EXX LD A,DD_MB0 OUT (C),A ; ; COMPUTE IOPB LOCATION IN WINDOW ; PUSH HL EXX POP HL LD DE,DD_CBO + PB_BCNTO ADD HL,DE ; ; FETCH IOPB ADDRESS OF STATUS BYTES ; PUSH IX POP DE EX DE,HL LD BC,PB_BCNTO ADD HL,BC EX DE,HL ; ; COUNT = REMAINDER ; LD BC,PB_SIZE - PB_BCNTO ; ; UPLOAD STATUS BYTES ; LDIR ; ; RELEASE IOPB WINDOW ; EXX XOR A,A OUT (C),A EXX ; ; CHECK FOR ERROR ; LD A,(IX + PB_STATO) OR A,A RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; TYPE 4 JADE COMMAND XFERS IOPB ONLY TO/FROM CONTROLLER ; ENTRY- IX= IOPB PTR ; HL'= CONTROLLER WINDOW PTR ; C'= CONTROLLER PORT ; EXIT - AF= 0: NO ERRORS ; B, DE, HL= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ JTYPE4: EQU JEX ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; TYPE 5 JADE COMMAND XFERS SECTOR BUFFER BOTH DIRECTIONS ; ENTRY- IX= IOPB PTR ; HL'= CONTROLLER WINDOW PTR ; C'= CONTROLLER PORT ; EXIT - AF= 0: NO ERRORS ; B, DE, HL= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ JTYPE5: CALL JTYPE2 ;XFER DATA DOWN AND EXECUTE RET NZ ;IF ERROR THEN RETURN JP JT1A ;XFER DATA BACK ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; WAIT ON JADE CONTROLLER BUSY FUNCTION ; ENTRY- A= COMMAND TO OUTPUT ; C'= PORT OF CONTROLLER ; EXIT - AF= 0: OK, /0: ERROR ; DE,HL= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ JWAIT: ; ; ISSUE PASSED COMMAND ; EXX OUT (C),A EXX ; ; 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 D JR NZ,JWAIT2 ; DEC L ;IF TIME OUT THEN RETURN TO MONITOR OR L JP Z,DSKERR ; JWAIT2: EXX IN A,(C) ;IF NOT DONE THEN WAIT EXX 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 MICROMATION PRIMITIVES ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; MICROMATION DRIVER ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ M2X: EQU DSKERR 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. ; ;**************************************************************************** H8BOOT: ; ; INSURE FDC WINDOW REMOVED ; LD BC,0341H XOR A,A H8B1: OUT (C),A INC C DJNZ H8B1 ; ; SET UP IOPB IN RAM ; LD HL,LOGIOPB CALL IIOPB ; ; FETCH & OFFSET PHYSICAL DRIVE ; LD A,(LOGINBYTE) ;COMPUTE & SET DRIVE SUB A,ISHA8 - DRVPRT ; ; IF 5" DRIVE THEN DO DIFFERENT ; CP A,ISHA8 - DRVPRT JP NC,HBOOT5 ; ; COMPUTE LOGICAL DRIVE FOR IOPB ; SRL A ;DRIVE = LOGICAL_DRIVE / 2 PUSH AF ;BIAS DRIVE UP ADD A,4 LD (IOPB + PB_DRVO),A POP AF ; ; 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 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 ; ; 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 ; ; 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,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 ; 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 ; ;---------------------------------------------------------------------------- ; ; 5" HARD DISK BOOT ; HBOOT5: ; ; BIAS DOWN DRIVE ; SUB A,ISHA5 - ISHA8 ; ; COMPUTE LOGICAL DRIVE FOR IOPB ; PUSH AF ;BIAS DRIVE UP ADD A,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 JP (HL) 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 SUBTTL INTELLIGENT SASI HOST ADAPTER (ISHA) PRIMITIVES ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; ISHA DRIVER ; ENTRY- IX= IOPB ADDRESS ; EXIT - AF= 0: NO ERRORS ; BC= SECTOR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ISHAX: ; ; CHECK FOR CONTROLLER PRESENT ; IN A,(ISH_STATUS) INC A JP Z,JCNP ; ; IF CLEAR COMMAND THEN DO DIFFERENTLY ; LD A,(IX + PB_CMDO) CP A,PB_CLRC JR Z,ISHACLR ; ; BIAS DOWN DRIVE NUMBER ; LD A,(IX + PB_DRVO) PUSH AF ;SAVE DRIVE TO RESTORE IOPB LATER SUB A,ISHA8 - DRVPRT ; ; IF NOT 8" THEN EXIT TO 5" ; CP A,4 JP NC,ISHAX5 ; ; ELSE STUFF PHYSICAL DRIVE INTO DRIVE ARG ; LD (IX + PB_DRVO),A ; ; TEMPORARILY CONVERT LOGICAL SECTOR TO PHYSICAL SECTOR UNTIL ISHA IS CHANGED ; LD C,(IX + PB_SECO) LD B,(IX + PB_SECO + 1) PUSH BC ;SAVE FOR RESTORE DEC BC ;CONVERT TO LOGICAL SECTOR LD (IX + PB_SECO),C LD (IX + PB_SECO + 1),B ; ; PUT IOPB ADDRESS IN BC FOR EASY OUTPUT TO CONTROLLER ; PUSH IX POP BC ; ; 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 ; XOR A,A 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 ; ; RESTORE THE IOPB ; POP BC LD (IX + PB_SECO),C LD (IX + PB_SECO + 1),B ; POP AF LD (IX + PB_DRVO),A ; ; RETURN THE ERROR STATUS ; LD A,(IX + PB_STATO) OR A,A RET ; ; ; CLEAR COMMAND ISSUED. RESET THE CONTROLLER ; ISHACLR: 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 RET Z ; ; ERROR ENCOUNTERED, RETURN FIRMWARE ERROR ; IN A,(ISH_DATA) LD (IX + PB_STATO),A ;RETURN NO ERRORS FOR NOW OR A,A RET ; ;---------------------------------------------------------------------------- ; ; 5" DRIVER ; ISHAX5: ; ; BIAS DOWN TO PHYSICAL DRIVE ; SUB A,ISHA5 - ISHA8 ADD A,4 ; ; STUFF PHYSICAL DRIVE INTO DRIVE ARG ; LD (IX + PB_DRVO),A ; ; PUT IOPB ADDRESS IN BC FOR EASY OUTPUT TO CONTROLLER ; PUSH IX POP BC ; ; 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 ; XOR A,A 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 ; ; RESTORE THE IOPB ; POP AF LD (IX + PB_DRVO),A ; ; RETURN THE ERROR STATUS ; LD A,(IX + PB_STATO) OR A,A RET ;**************************************************************************** ; ; 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 ; IX= IOPB PTR ; EXIT - CF= ERROR ; A,HL,DE,BC= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ STUPBIOS: ; ; FETCH BIOS LOAD PARAMETER OFFSET ; LD A,(DEFBFR + 1) ; ; IF NOT IN 1ST SECTOR THEN RETURN ERROR ; CP A,SECSIZ 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,SECSIZ 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 ; 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 ; ; 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 ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; DISK ERROR OUTPUT SUBR ; ENTRY- IX= IOPB BASE ; EXIT - AF= 0: NO ERROR ; HL,DE= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ DQERR: ; ; IF STATUS == 0 THEN RETURN NO ERROR ; LD A,(IX + PB_STATO) OR A,A RET Z ; ; ELSE FALL INTO ERROR OUTPUT ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; DISPLAY ERROR AND RETURN ERROR FUNCTION ; ENTRY- IX= IOPB PTR ; EXIT - AF= /0 ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ DBERR: ; ; DISPLAY HEADER ; LD HL,DERM CALL PUTS ; ; DISPLAY IOPB DATA ; PUSH IX POP HL LD B,PB_SIZE ; DBTE1: LD A,(HL) ;OUTPUT BYTE CALL HTOA ; CALL SPACE ;DISPLAY SEPARATOR ; INC HL ;NEXT VALUE DJNZ DBTE1 ;IF NOT DONE THEN CONTINUE ; ; DISPLAY PORT # ; CALL SPACE CALL SPACE ;OUTPUT PORT # EXX LD A,C EXX CALL HTOA ; ; DISPLAY CONTROLLER ADDRESS ; CALL SPACE EXX ;OUTPUT FDC ADDRESS LD A,H EXX CALL HTOA EXX LD A,L EXX CALL HTOA ; ; NEW LINE & RETURN ERROR ; CALL CRLF JP DSKERR SUBTTL ASCII CHAR ROUTINES ;**************************************************************************** ; ; 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,(NT_STAT) ;IF BUSY THEN WAIT AND A,1 SHL NT_BUSY JR NZ,CO ; LD A,C OUT (NT_DATA),A RET ;**************************************************************************** ; ; 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 SUBTTL ROM FUNCTIONS ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; FUNCTION DISPATCHER ; ENTRY- C= FUNCTION # ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ DKFUNC: ; ; IF ILLEGAL FUCTION THEN RETURN ERROR ; LD A,C CP A,MAXFUNC LD A,-1 RET NC ; ; ELSE SELECT FUNCTION ; PUSH HL LD HL,FUNCTBL LD A,C 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 EX (SP),HL RET ;############################################################################ ; ; FUNCTION TABLE ; ;############################################################################ FUNCTBL: DW RETVER ;(0) RETURN VERSION # DW DQERR ;(1) TEST FOR IOPB ERROR & QUERY IF ERROR DW DBERR ;(2) DISPLAY IOPB ERROR DATA MAXFUNC EQU ($ - FUNCTBL) / 2 ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN VERSION # ; EXIT - HL= VERSION # IN BINARY ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ RETVER: LD HL,VERSN XOR A,A RET SUBTTL INITIALIZED DATA ;############################################################################ ; ; MESSAGES ; ;############################################################################ DERM: DB CR,LF,'Disk Error! IOPB data:' DB CR,LF,'CM DR TL TH SL SH FG AL AH AX ST S1 S2 S3 S4 S5 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 128 ;XFER COUNT DB 0,0,0,0 ;STATUS IF ($ < PROMST) OR ($ > (PROMST + PROMSIZ)) CONMSG ERROR! Code Too Large for PROM! ENDIF END