diff --git a/Source/HBIOS/Config/RC_std.asm b/Source/HBIOS/Config/RC_std.asm index f2fcb818..aef79e07 100644 --- a/Source/HBIOS/Config/RC_std.asm +++ b/Source/HBIOS/Config/RC_std.asm @@ -12,6 +12,9 @@ SIOENABLE .SET TRUE ; TRUE TO AUTO-DETECT ZILOG SIO/2 SIOMODE .SET SIOMODE_RC ; TYPE OF SIO/2 TO DETECT: SIOMODE_RC, SIOMODE_SMB ACIAENABLE .SET TRUE ; TRUE TO AUTO-DETECT MOTOROLA 6850 ACIA ; +FDENABLE .SET FALSE ; TRUE FOR FLOPPY SUPPORT +FDMODE .SET FDMODE_SMBWDC ; FDMODE_SMBSMC, FDMODE_SMBWDC +; IDEENABLE .SET TRUE ; TRUE FOR IDE DEVICE SUPPORT (CF MODULE) +PPIDEMODE .SET IDEMODE_RC ; TYPE OF CF MODULE: IDEMODE_RC, IDEMODE_SMB PPIDEENABLE .SET FALSE ; TRUE FOR PPIDE DEVICE SUPPORT (PPIDE MODULE) -PPIDEMODE .SET PPIDEMODE_RC ; TYPE OF CF MODULE: PPIDEMODE_RC, PPIDEMODE_SMB diff --git a/Source/HBIOS/cfg_rc.asm b/Source/HBIOS/cfg_rc.asm index d5fc04df..55d159a5 100644 --- a/Source/HBIOS/cfg_rc.asm +++ b/Source/HBIOS/cfg_rc.asm @@ -36,7 +36,7 @@ MDENABLE .EQU TRUE ; TRUE FOR ROM/RAM DISK SUPPORT (ALMOST ALWAYS WANT THIS ENA MDTRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF MDENABLE = TRUE) ; FDENABLE .EQU FALSE ; TRUE FOR FLOPPY SUPPORT -FDMODE .EQU FDMODE_ZETA ; FDMODE_DIO, FDMODE_ZETA, FDMODE_DIDE, FDMODE_N8, FDMODE_DIO3 +FDMODE .EQU FDMODE_SMBWDC ; FDMODE_DIO, FDMODE_ZETA, FDMODE_DIDE, FDMODE_N8, FDMODE_DIO3 FDTRACE .EQU 1 ; 0=SILENT, 1=FATAL ERRORS, 2=ALL ERRORS, 3=EVERYTHING (ONLY RELEVANT IF FDENABLE = TRUE) FDMEDIA .EQU FDM144 ; FDM720, FDM144, FDM360, FDM120 (ONLY RELEVANT IF FDENABLE = TRUE) FDMEDIAALT .EQU FDM720 ; ALTERNATE MEDIA TO TRY, SAME CHOICES AS ABOVE (ONLY RELEVANT IF FDMAUTO = TRUE) diff --git a/Source/HBIOS/fd.asm b/Source/HBIOS/fd.asm index 8876f040..4ff21d9c 100644 --- a/Source/HBIOS/fd.asm +++ b/Source/HBIOS/fd.asm @@ -8,7 +8,7 @@ ; ; PORTS ; -#IF ((FDMODE == FDMODE_DIO) | (FDMODE == FDMODE_ZETA) | (FDMODE == FDMODE_DIO3)) +#IF ((FDMODE == FDMODE_DIO) | (FDMODE == FDMODE_ZETA) | (FDMODE == FDMODE_DIO3) | (FDMODE == FDMODE_SMBSMC)) FDC_MSR .EQU $36 ; 8272 MAIN STATUS REGISTER FDC_DATA .EQU $37 ; 8272 DATA PORT FDC_DIR .EQU $38 ; DATA INPUT REGISTER @@ -41,6 +41,14 @@ FDC_DACK .EQU $90 ; DACK FDC_TC .EQU $93 ; TERMINAL COUNT (W/ DACK) FDC_DMA .EQU $3C ; NOT USED BY N8 #ENDIF +#IF (FDMODE = FDMODE_SMBWDC) +FDC_MSR .EQU $50 ; 8272 MAIN STATUS REGISTER +FDC_DATA .EQU $51 ; 8272 DATA PORT +FDC_DOR .EQU $58 ; DIGITAL OUTPUT REGISTER +FDC_DCR .EQU $48 ; CONFIGURATION CONTROL REGISTER +FDC_TC .EQU $58 ; TERMINAL COUNT (W/ DACK) +#ENDIF + ; ; DISK OPERATIONS ; @@ -310,9 +318,17 @@ DOR_BR500 .EQU 10100010B ; 500KBPS W/ MOTOR ON DOR_INIT .EQU 10100000B ; INITIAL DEFAULT LATCH VALUE #ENDIF ; +; MOTOR INVERTED, DENSITY SELECT NORMAL FOR SMB SMC +; +#IF (FDMODE == FDMODE_SMBSMC) +DOR_BR250 .EQU 10100110B ; 250KBPS W/ MOTOR ON +DOR_BR500 .EQU 11100010B ; 500KBPS W/ MOTOR ON +DOR_INIT .EQU 11100000B ; INITIAL DEFAULT LATCH VALUE +#ENDIF +; ; *** DIDE/N8/ZETA V2 *** ; -#IF ((FDMODE == FDMODE_DIDE) | (FDMODE == FDMODE_N8) | (FDMODE == FDMODE_ZETA2)) +#IF ((FDMODE == FDMODE_DIDE) | (FDMODE == FDMODE_N8) | (FDMODE == FDMODE_ZETA2) | (FDMODE == FDMODE_SMBWDC)) DOR_INIT .EQU 00001100B ; SOFT RESET INACTIVE, DMA ENABLED DOR_BR250 .EQU DOR_INIT DOR_BR500 .EQU DOR_INIT @@ -1176,7 +1192,7 @@ FC_SETDOR ; ; SET FST_DCR ; -#IF ((FDMODE == FDMODE_DIDE) | (FDMODE == FDMODE_N8) | (FDMODE == FDMODE_ZETA2)) +#IF ((FDMODE == FDMODE_DIDE) | (FDMODE == FDMODE_N8) | (FDMODE == FDMODE_ZETA2) | (FDMODE == FDMODE_SMBWDC)) ; FC_SETDCR LD (FST_DCR),A @@ -1205,10 +1221,10 @@ FC_RESETFDC: LD A,(FST_DOR) PUSH AF -#IF ((FDMODE == FDMODE_ZETA) | (FDMODE == FDMODE_DIO3)) +#IF ((FDMODE == FDMODE_ZETA) | (FDMODE == FDMODE_DIO3) | (FDMODE == FDMODE_SMBSMC)) RES 7,A #ENDIF -#IF ((FDMODE == FDMODE_DIDE) | (FDMODE == FDMODE_N8) | (FDMODE == FDMODE_ZETA2)) +#IF ((FDMODE == FDMODE_DIDE) | (FDMODE == FDMODE_N8) | (FDMODE == FDMODE_ZETA2) | (FDMODE == FDMODE_SMBWDC)) LD A,0 #ENDIF CALL FC_SETDOR @@ -1223,7 +1239,7 @@ FC_RESETFDC: ; PULSE TERMCT TO TERMINATE ANY ACTIVE EXECUTION PHASE ; FC_PULSETC: -#IF ((FDMODE == FDMODE_DIDE) | (FDMODE == FDMODE_N8) | (FDMODE == FDMODE_ZETA2) +#IF ((FDMODE == FDMODE_DIDE) | (FDMODE == FDMODE_N8) | (FDMODE == FDMODE_ZETA2) | (FDMODE == FDMODE_SMBWDC)) IN A,(FDC_TC) #ELSE LD A,(FST_DOR) @@ -1245,7 +1261,7 @@ FC_MOTORON: LD DE,FDSTR_MOTON CALL WRITESTR #ENDIF -#IF ((FDMODE == FDMODE_DIO) | (FDMODE == FDMODE_ZETA) | (FDMODE == FDMODE_DIO3)) +#IF ((FDMODE == FDMODE_DIO) | (FDMODE == FDMODE_ZETA) | (FDMODE == FDMODE_DIO3) | (FDMODE == FDMODE_SMBSMC)) LD A,(FST_DOR) PUSH AF @@ -1253,13 +1269,13 @@ FC_MOTORON: CALL FC_SETDOR ; AND IMPLEMENT IT POP AF -#IF ((FDMODE == FDMODE_ZETA) | (FDMODE == FDMODE_DIO3)) +#IF ((FDMODE == FDMODE_ZETA) | (FDMODE == FDMODE_DIO3) | (FDMODE == FDMODE_SMBSMC)) XOR 00000010B ; MOTOR BIT INVERTED ON ZETA #ENDIF BIT 1,A ; SET FLAGS SET BASED ON CURRENT MOTOR BIT RET Z ; MOTOR WAS PREVIOUSLY ON, WE ARE DONE #ENDIF -#IF ((FDMODE == FDMODE_DIDE) | (FDMODE == FDMODE_N8) | (FDMODE == FDMODE_ZETA2)) +#IF ((FDMODE == FDMODE_DIDE) | (FDMODE == FDMODE_N8) | (FDMODE == FDMODE_ZETA2) | (FDMODE == FDMODE_SMBWDC)) ; SETUP DCR FOR DIDE HARDWARE LD A,(FCD_DCR) ; GET NEW DCR VALUE CALL FC_SETDCR ; AND IMPLEMENT IT diff --git a/Source/HBIOS/hbios.asm b/Source/HBIOS/hbios.asm index efebd0e4..13a3c165 100644 --- a/Source/HBIOS/hbios.asm +++ b/Source/HBIOS/hbios.asm @@ -1299,7 +1299,6 @@ DIO_DISPATCH: PRTS("DIO<$") CALL REGDMP ; DUMP REGS, NONE DESTROYED RET -DIO_DISPCALL: ; #ENDIF ; *DEBUG* END ; @@ -1307,31 +1306,34 @@ DIO_DISPCALL: ; USE UNIT # IN C TO LOOKUP DIO_TBL ENTRY, THEN ; CONVERT C TO THE DEVICE/DRIVER SPECIFIC UNIT ID ; AND GET THE DEVICE TYPE TO A FOR DRIVER DISPATCHING +; SETUP IY WITH DEVICE SPECIFIC DATA POINTER ; - LD A,C ; INCOMING UNIT INDEX TO A - PUSH HL ; SAVE INCOMING HL - LD HL,DIO_CNT ; HL := ADDRESS OF TABLE ENTRY COUNT - CP (HL) ; COMPARE TO INCOMING ENTRY INDEX - JR C,DIO_DISPATCH1 ; UNIT OK, PROCEED -; - ; NOT GOOD, INCOMING UNIT IS OUT OF RANGE - POP HL ; RESTORE HL/STACK - CALL PANIC ; PANIC - OR $FF ; SIGNAL ERROR - RET ; AND RETURN -; -DIO_DISPATCH1: - INC HL ; BUMP PAST COUNT PREFIX TO START OF TABLE - RLCA ; MULTIPLY BY 4 TO - RLCA ; ... TO CALC ENTRY OFFSET - CALL ADDHLA ; HL := ENTRY OFFSET - LD A,(HL) ; GET DEVICE TYPE BYTE - INC HL ; BUMP TO DEVICE UNIT INDEX BYTE - LD C,(HL) ; DEVICE UNIT INDEX TO C - POP HL ; RECOVER INCOMING HL VALUE -; -; DISPATCH TO DRIVER BASED ON DEVICE TYPE IN A -; +DIO_DISPCALL: + PUSH IY ; SAVE INCOMING IY + + LD IY,DIO_DISPEXIT ; PRIME STACK WITH + PUSH IY ; ... RETURN VECTOR + + LD IY,DIO_TBL ; POINT IY TO START OF DIO TABLE + LD A,C ; A := INCOMING DISK UNIT INDEX + CP (IY-1) ; COMPARE TO COUNT + JR NC,DIO_DISPERR ; HANDLE INVALID UNIT INDEX + + PUSH DE ; SAVE DE + RLCA ; MULTIPLY UNIT INDEX + RLCA ; ... BY 4 (SIZE OF TABLE ENTRY) + LD D,0 ; SET DE TO + LD E,A ; ... TABLE ENTRY OFFSET + ADD IY,DE ; APPLY OFFSET SO IY HAS ENTRY ADR + EX DE,HL ; SAVE HL IN DE + LD A,(IY+0) ; A := DEVICE TYPE + LD C,(IY+1) ; C := DEVICE NUMBER + LD L,(IY+2) ; HL := DATA BLOB ADDRESS + LD H,(IY+3) ; ... + EX (SP),HL ; RESTORE DE INTO HL, BLOB ADR TO TOS + EX DE,HL ; ORIGINAL DE & HL RESTORED + POP IY ; BLOB ADR TO IY + #IF (MDENABLE) CP DIODEV_MD JP Z,MD_DISPATCH @@ -1375,6 +1377,15 @@ DIO_DISPATCH1: CALL PANIC RET ; +DIO_DISPEXIT: + POP IY ; RECOVER ORIGINAL INCOMING IY + RET ; AND RETURN TO CALLER +; +DIO_DISPERR: + CALL PANIC ; PANIC + OR $FF ; SIGNAL ERROR + RET ; AND RETURN +; ; CONVERT AN HBIOS STANDARD HARD DISK CHS ADDRESS TO ; AN LBA ADDRESS. A STANDARD HBIOS HARD DISK IS ASSUMED ; TO HAVE 16 SECTORS PER TRACK AND 16 HEADS PER CYLINDER. diff --git a/Source/HBIOS/hdsk.asm b/Source/HBIOS/hdsk.asm index 536b4e0d..7d1311aa 100644 --- a/Source/HBIOS/hdsk.asm +++ b/Source/HBIOS/hdsk.asm @@ -3,8 +3,6 @@ ; HDSK DISK DRIVER ;================================================================================================== ; -HDSK_UNITCNT .EQU 2 ; TWO VIRTUAL HARD DISKS -; ; IO PORT ADDRESSES ; HDSK_IO .EQU $FD @@ -15,85 +13,131 @@ HDSK_CMDREAD .EQU 2 HDSK_CMDWRITE .EQU 3 HDSK_CMDPARAM .EQU 4 ; +; HDSK DEVICE CONFIGURATION +; +HDSK_DEVCNT .EQU 2 ; NUMBER OF HDSK DEVICES SUPPORTED +HDSK_CFGSIZ .EQU 6 ; SIZE OF CFG TBL ENTRIES +; +HDSK_DEV .EQU 0 ; OFFSET OF DEVICE NUMBER (BYTE) +HDSK_STAT .EQU 1 ; OFFSET OF STATUS (BYTE) +HDSK_LBA .EQU 2 ; OFFSET OF LBA (DWORD) +; +HDSK_CFGTBL: + ; DEVICE 0 + .DB 0 ; DEVICE NUMBER + .DB 0 ; DEVICE STATUS + .DW 0,0 ; CURRENT LBA + ; DEVICE 1 + .DB 1 ; DEVICE NUMBER + .DB 0 ; DEVICE STATUS + .DW 0,0 ; CURRENT LBA +; +#IF ($ - HDSK_CFGTBL) != (HDSK_DEVCNT * HDSK_CFGSIZ) + .ECHO "*** INVALID HDSK CONFIG TABLE ***\n" +#ENDIF +; + .DB $FF ; END MARKER +; ; STATUS ; -HDSKRC_OK .EQU 0 +HDSK_STOK .EQU 0 ; OK +HDSK_STNOTRDY .EQU -1 ; NOT READY ; ; ; HDSK_INIT: CALL NEWLINE ; FORMATTING - PRTS("HDSK: UNITS=$") - LD A,HDSK_UNITCNT + PRTS("HDSK:$") + PRTS(" DEVICES=$") + LD A,HDSK_DEVCNT CALL PRTDECB ; ; SETUP THE DISPATCH TABLE ENTRIES ; - LD B,HDSK_UNITCNT ; LOOP CONTROL - LD C,0 ; PHYSICAL UNIT INDEX + XOR A ; ZERO ACCUM + LD (HDSK_CURDEV),A ; SET CURRENT DEVICE NUM TO ZERO + LD IY,HDSK_CFGTBL ; START OF DEV CFG TABLE HDSK_INIT0: - PUSH BC ; SAVE LOOP CONTROL - LD B,C ; PHYSICAL UNIT - LD C,DIODEV_HDSK ; DEVICE TYPE - LD DE,0 ; UNIT DATA BLOB ADDRESS - CALL DIO_ADDENT ; ADD ENTRY, BC IS NOT DESTROYED - POP BC ; RESTORE LOOP CONTROL - INC C ; NEXT PHYSICAL UNIT - DJNZ HDSK_INIT0 ; LOOP UNTIL DONE + CALL HDSK_PROBE ; HARDWARE PROBE + JR NZ,HDSK_INIT1 ; SKIP DEVICE IF NOT PRESENT + LD A,(HDSK_CURDEV) ; GET CURRENT DEVICE + LD (IY+HDSK_DEV),A ; POPULATE DEVICE FIELD OF CFG ENTRY + LD B,A ; PUT IN B + LD C,DIODEV_HDSK ; DEVICE TYPE TO C + PUSH IY ; CFG ENTRY POINTER + POP DE ; ... TO DE + CALL DIO_ADDENT ; ADD ENTRY TO GLOBAL DISK TABLE + CALL HDSK_INITDEV ; PERFORM DEVICE INITIALIZATION +HDSK_INIT1: + LD BC,HDSK_CFGSIZ ; SIZE OF CFG ENTRY + ADD IY,BC ; BUMP IY TO NEXT ENTRY + LD HL,HDSK_CURDEV ; POINT TO CURRENT DEVICE + INC (HL) ; AND INCREMENT IT + LD A,(IY) ; GET FIRST BYTE OF ENTRY + INC A ; TEST FOR $FF + JR NZ,HDSK_INIT0 ; IF NOT, LOOP +; + XOR A ; INIT SUCCEEDED + RET ; RETURN +; +; PROBE FOR DEVICE EXISTENCE +; +HDSK_PROBE: + XOR A ; SIGNAL SUCCESS + RET ; AND DONE ; - XOR A - DEC A ; INITIAL STATUS IS NOT READY $FF - LD (HDSK_STAT),A ; SAVE IT - XOR A ; INIT SUCCEEDED - RET ; RETURN +; INITIALIZE DEVICE ; +HDSK_INITDEV: + LD (IY+HDSK_STAT),HDSK_STNOTRDY ; STATUS := NOT READY + XOR A ; CLEAR ACCUM + LD (IY+HDSK_LBA+0),A ; ZERO LBA + LD (IY+HDSK_LBA+1),A ; ... + LD (IY+HDSK_LBA+2),A ; ... + LD (IY+HDSK_LBA+3),A ; ... + XOR A ; SIGNAL SUCCESS (REDUNDANT) + RET ; AND DONE ; ; -HDSK_DISPATCH: - ; SAVE THE TARGET DEVICE/UNIT LOCALLY IN DRIVER - LD A,C ; DEVICE/UNIT FROM C - AND $0F ; ISOLATE UNIT NUM - CP 2 ; CHECK FOR MAX UNIT EXCEEDED - LD (HDSK_UNIT),A ; SAVE IT - CALL NC,PANIC ; PANIC IF TOO HIGH ; +HDSK_DISPATCH: ; DISPATCH ACCORDING TO DISK SUB-FUNCTION - LD A,B ; GET REQUESTED FUNCTION - AND $0F ; ISOLATE SUB-FUNCTION - JP Z,HDSK_STATUS ; SUB-FUNC 0: STATUS + LD A,B ; GET REQUESTED FUNCTION + AND $0F ; ISOLATE SUB-FUNCTION + JP Z,HDSK_STATUS ; SUB-FUNC 0: STATUS DEC A - JP Z,HDSK_RESET ; SUB-FUNC 1: RESET + JP Z,HDSK_RESET ; SUB-FUNC 1: RESET DEC A - JP Z,HDSK_SEEK ; SUB-FUNC 2: SEEK + JP Z,HDSK_SEEK ; SUB-FUNC 2: SEEK DEC A - JP Z,HDSK_READ ; SUB-FUNC 3: READ SECTORS + JP Z,HDSK_READ ; SUB-FUNC 3: READ SECTORS DEC A - JP Z,HDSK_WRITE ; SUB-FUNC 4: WRITE SECTORS + JP Z,HDSK_WRITE ; SUB-FUNC 4: WRITE SECTORS DEC A - JP Z,HDSK_VERIFY ; SUB-FUNC 5: VERIFY SECTORS + JP Z,HDSK_VERIFY ; SUB-FUNC 5: VERIFY SECTORS DEC A - JP Z,HDSK_FORMAT ; SUB-FUNC 6: FORMAT TRACK + JP Z,HDSK_FORMAT ; SUB-FUNC 6: FORMAT TRACK DEC A - JP Z,HDSK_DEVICE ; SUB-FUNC 7: DEVICE REPORT + JP Z,HDSK_DEVICE ; SUB-FUNC 7: DEVICE REPORT DEC A - JP Z,HDSK_MEDIA ; SUB-FUNC 8: MEDIA REPORT + JP Z,HDSK_MEDIA ; SUB-FUNC 8: MEDIA REPORT DEC A - JP Z,HDSK_DEFMED ; SUB-FUNC 9: DEFINE MEDIA + JP Z,HDSK_DEFMED ; SUB-FUNC 9: DEFINE MEDIA DEC A - JP Z,HDSK_CAP ; SUB-FUNC 10: REPORT CAPACITY + JP Z,HDSK_CAP ; SUB-FUNC 10: REPORT CAPACITY DEC A - JP Z,HDSK_GEOM ; SUB-FUNC 11: REPORT GEOMETRY + JP Z,HDSK_GEOM ; SUB-FUNC 11: REPORT GEOMETRY ; HDSK_VERIFY: HDSK_FORMAT: HDSK_DEFMED: - CALL PANIC ; INVALID SUB-FUNCTION + CALL PANIC ; INVALID SUB-FUNCTION ; ; ; HDSK_STATUS: - LD A,(HDSK_STAT) ; LOAD STATUS - OR A ; SET FLAGS + LD A,(IY+HDSK_STAT) ; LOAD STATUS + OR A ; SET FLAGS RET ; ; @@ -129,10 +173,10 @@ HDSK_GEOM: ; ; HDSK_DEVICE: - LD D,DIODEV_HDSK ; D := DEVICE TYPE - LD E,C ; E := PHYSICAL UNIT - LD C,%00000000 ; C := ATTRIBUTES, NON-REMOVABLE HARD DISK - XOR A ; SIGNAL SUCCESS + LD D,DIODEV_HDSK ; D := DEVICE TYPE + LD E,(IY+HDSK_DEV) ; E := PHYSICAL DEVICE NUMBER + LD C,%00000000 ; C := ATTRIBUTES, NON-REMOVABLE HARD DISK + XOR A ; SIGNAL SUCCESS RET ; ; @@ -149,8 +193,10 @@ HDSK_SEEK: BIT 7,D ; CHECK FOR LBA FLAG CALL Z,HB_CHS2LBA ; CLEAR MEANS CHS, CONVERT TO LBA RES 7,D ; CLEAR FLAG REGARDLESS (DOES NO HARM IF ALREADY LBA) - LD BC,HSTLBA ; POINT TO LBA STORAGE - CALL ST32 ; SAVE LBA ADDRESS + LD (IY+HDSK_LBA+0),L ; SAVE NEW LBA + LD (IY+HDSK_LBA+1),H ; ... + LD (IY+HDSK_LBA+2),E ; ... + LD (IY+HDSK_LBA+3),D ; ... XOR A ; SIGNAL SUCCESS RET ; AND RETURN ; @@ -176,12 +222,11 @@ HDSK_RW: RET Z ; ZERO SECTOR I/O, RETURN W/ E=0 & A=0 LD B,A ; INIT SECTOR DOWNCOUNTER LD C,0 ; INIT SECTOR READ/WRITE COUNT - LD A,(HDSK_UNIT) ; GET UNIT - ;AND $0F - LD (HDSK_DEV),A ; ... AND SAVE IT + LD A,(IY+HDSK_DEV) ; GET DEVICE NUMBER + LD (HDSK_DRV),A ; ... AND SET FIELD IN HDSK PARM BLOCK ; RESET HDSK INTERFACE IF NEEDED - LD A,(HDSK_STAT) ; GET CURRENT STATUS + LD A,(IY+HDSK_STAT) ; GET CURRENT STATUS OR A ; SET FLAGS PUSH BC ; SAVE COUNTERS CALL NZ,HDSK_DSKRESET ; RESET IF NOT READY @@ -196,85 +241,90 @@ HDSK_RW0: ; CONVERT LBA HHHH:LLLL (4 BYTES) ; TO HDSK TRACK/SECTOR TTTT:SS (3 BYTES) ; SAVING TO HDSK PARM BLOCK - LD A,(HSTLBA) ; LSB OF LBA - LD (HDSK_SEC),A ; ... SAVED TO SECTOR - LD HL,(HSTLBA+1) ; 2 MIDDLE BYTES OF LBA - LD (HDSK_TRK),HL ; ... SAVE TO TRACK - + ; (IY+HDSK_LBA+0) ==> (HDSK_SEC) + LD A,(IY+HDSK_LBA+0) + LD (HDSK_SEC),A + ; (IY+HDSK_LBA+1) ==> (HDSK_TRK+0) + LD A,(IY+HDSK_LBA+1) + LD (HDSK_TRK+0),A + ; (IY+HDSK_LBA+2) ==> (HDSK_TRK+1) + LD A,(IY+HDSK_LBA+2) + LD (HDSK_TRK+1),A + ; EXECUTE COMMAND - LD B,7 ; SIZE OF PARAMETER BLOCK - LD HL,HDSK_PARMBLK ; ADDRESS OF PARAMETER BLOCK - LD C,$FD ; HDSK CMD PORT - OTIR ; SEND IT - + LD B,7 ; SIZE OF PARAMETER BLOCK + LD HL,HDSK_PARMBLK ; ADDRESS OF PARAMETER BLOCK + LD C,$FD ; HDSK CMD PORT + OTIR ; SEND IT + ; GET RESULT - IN A,(C) ; GET RESULT CODE - LD (HDSK_RC),A ; SAVE IT - OR A ; SET FLAGS - + IN A,(C) ; GET RESULT CODE + LD (HDSK_RC),A ; SAVE IT + OR A ; SET FLAGS + #IF (HDSKTRACE > 0) - PUSH AF ; SAVE RETURN CODE + PUSH AF ; SAVE RETURN CODE #IF (HDSKTRACE == 1) - CALL NZ,HDSK_PRT ; DIAGNOSE ERRORS ONLY + CALL NZ,HDSK_PRT ; DIAGNOSE ERRORS ONLY #ENDIF #IF (HDSKTRACE >= 2) - CALL HDSK_PRT ; DISPLAY ALL READ/WRITE RESULTS + CALL HDSK_PRT ; DISPLAY ALL READ/WRITE RESULTS #ENDIF - POP AF ; RESTORE RETURN CODE + POP AF ; RESTORE RETURN CODE #ENDIF - JR NZ,HDSK_RW5 ; BAIL OUT ON ERROR + JR NZ,HDSK_RW5 ; BAIL OUT ON ERROR ; INCREMENT LBA - LD HL,HSTLBA - PUSH HL - CALL LD32 - CALL INC32 - POP BC - CALL ST32 - + LD A,HDSK_LBA ; OFFSET OF LBA IN DEV CFG + PUSH IY ; COPY IT + POP HL ; ... TO HL + CALL ADDHLA ; SET HL := LBA ADDRESS + CALL INC32HL ; INCREMENT THE VALUE + ; INCREMENT DMA - LD HL,HDSK_DMA+1 ; POINT TO MSB OF DMA - INC (HL) ; BUMP DMA BY - INC (HL) ; ... 512 BYTES - - XOR A ; A := 0 SIGNALS SUCCESS + LD HL,HDSK_DMA+1 ; POINT TO MSB OF DMA + INC (HL) ; BUMP DMA BY + INC (HL) ; ... 512 BYTES + + XOR A ; A := 0 SIGNALS SUCCESS HDSK_RW5: - POP BC ; RECOVER COUNTERS - JR NZ,HDSK_RW6 ; IF ERROR, GET OUT - - INC C ; RECORD SECTOR COMPLETED - DJNZ HDSK_RW0 ; LOOP AS NEEDED + POP BC ; RECOVER COUNTERS + JR NZ,HDSK_RW6 ; IF ERROR, GET OUT + + INC C ; RECORD SECTOR COMPLETED + DJNZ HDSK_RW0 ; LOOP AS NEEDED HDSK_RW6: ; RETURN WITH SECTORS READ IN E AND UPDATED DMA ADDRESS IN HL - LD E,C ; SECTOR READ COUNT TO E - LD HL,(HDSK_DMA) ; CURRENT DMA TO HL - OR A ; SET FLAGS BASED ON RETURN CODE - RET ; AND RETURN, A HAS RETURN CODE + LD E,C ; SECTOR READ COUNT TO E + LD HL,(HDSK_DMA) ; CURRENT DMA TO HL + OR A ; SET FLAGS BASED ON RETURN CODE + RET ; AND RETURN, A HAS RETURN CODE ; ; ; HDSK_DSKRESET: - LD B,32 - LD A,HDSK_CMDRESET -HDSK_DSKRESET1: - OUT ($FD),A - DJNZ HDSK_DSKRESET1 - - XOR A ; STATUS = OK - LD (HDSK_STAT),A ; SAVE IT - +; #IF (HDSKTRACE >= 2) CALL NEWLINE - LD DE,HDSKSTR_PREFIX + LD DE,HDSKSTR_PREFIX CALL WRITESTR CALL PC_SPACE LD DE,HDSKSTR_RESET CALL WRITESTR #ENDIF +; + LD B,32 + LD A,HDSK_CMDRESET +HDSK_DSKRESET1: + OUT ($FD),A + DJNZ HDSK_DSKRESET1 + + XOR A ; STATUS = OK + LD (IY+HDSK_STAT),A ; SAVE IT RET ; @@ -283,9 +333,9 @@ HDSK_DSKRESET1: HDSK_PRT: CALL NEWLINE - LD DE,HDSKSTR_PREFIX + LD DE,HDSKSTR_PREFIX CALL WRITESTR - + CALL PC_SPACE LD DE,HDSKSTR_CMD CALL WRITESTR @@ -311,7 +361,7 @@ HDSK_PRT: CP HDSK_CMDPARAM JP Z,HDSK_PRTCMD LD DE,HDSKSTR_UNKCMD -HDSK_PRTCMD: +HDSK_PRTCMD: CALL WRITESTR CALL PC_RBKT @@ -324,7 +374,7 @@ HDSK_PRTCMD: HDSK_PRTRW: CALL PC_SPACE - LD A,(HDSK_DEV) + LD A,(HDSK_DRV) CALL PRTHEXBYTE CALL PC_SPACE LD BC,(HDSK_TRK) @@ -349,12 +399,12 @@ HDSK_PRTRW: CALL PC_SPACE CALL PC_LBKT LD A,(HDSK_RC) - LD DE,HDSKSTR_RCOK - CP HDSKRC_OK + LD DE,HDSKSTR_STOK + CP HDSK_STOK JP Z,HDSK_PRTRC - LD DE,HDSKSTR_RCUNK + LD DE,HDSKSTR_STUNK -HDSK_PRTRC: +HDSK_PRTRC: CALL WRITESTR CALL PC_RBKT @@ -372,21 +422,19 @@ HDSKSTR_READ .TEXT "READ$" HDSKSTR_WRITE .TEXT "WRITE$" HDSKSTR_PARAM .TEXT "PARAM$" HDSKSTR_UNKCMD .TEXT "UNKCMD$" -HDSKSTR_RCOK .TEXT "OK$" -HDSKSTR_RCUNK .TEXT "UNKNOWN ERROR$" +HDSKSTR_STOK .TEXT "OK$" +HDSKSTR_STUNK .TEXT "UNKNOWN ERROR$" ; ;================================================================================================== ; HDSK DISK DRIVER - DATA ;================================================================================================== ; -HDSK_STAT .DB 0 -HDSK_RC .DB 0 -; -HDSK_UNIT .DB 0 +HDSK_RC .DB 0 ; CURRENT RETURN CODE +HDSK_CURDEV .DB 0 ; CURRENT DEVICE NUMBER ; HDSK_PARMBLK: -HDSK_CMD .DB 0 ; COMMAND (HDSK_READ, HDSK_WRITE, ...) -HDSK_DEV .DB 0 ; 0..7, HARD DISK UNIT -HDSK_SEC .DB 0 ; 0..255 SECTOR -HDSK_TRK .DW 0 ; 0..2047 TRACK -HDSK_DMA .DW 0 ; DEFINES WHERE RESULT IS PLACED IN MEMORY +HDSK_CMD .DB 0 ; COMMAND (HDSK_READ, HDSK_WRITE, ...) +HDSK_DRV .DB 0 ; 0..7, HDSK DRIVE NUMBER +HDSK_SEC .DB 0 ; 0..255 SECTOR +HDSK_TRK .DW 0 ; 0..2047 TRACK +HDSK_DMA .DW 0 ; ADDRESS FOR SECTOR DATA EXCHANGE diff --git a/Source/HBIOS/ide.asm b/Source/HBIOS/ide.asm index 93b18fa1..1284d36f 100644 --- a/Source/HBIOS/ide.asm +++ b/Source/HBIOS/ide.asm @@ -107,15 +107,18 @@ ; IDE3: SECONDARY SLAVE ; IDE_UNITCNT .EQU 2 ; ASSUME ONLY PRIMARY INTERFACE +IDE_IO_BASE .EQU $20 ; DEFAULT IO BASE (NOTE OVERRIDES BELOW) ; #IF (IDEMODE == IDEMODE_MK4) -IDE_IO_BASE .EQU MK4_IDE +IDE_IO_BASE .SET MK4_IDE #ENDIF + #IF (IDEMODE == IDEMODE_RC) -IDE_IO_BASE .EQU $10 +IDE_IO_BASE .SET $10 #ENDIF -#IF ((IDEMODE != IDEMODE_MK4) & (IDEMODE != IDEMODE_RC)) -IDE_IO_BASE .EQU $20 + +#IF (IDEMODE == IDEMODE_SMB) +IDE_IO_BASE .SET $E0 #ENDIF #IF ((IDEMODE == IDEMODE_DIO) | (IDEMODE == IDEMODE_MK4)) @@ -138,7 +141,7 @@ IDE_IO_DMA .EQU $IDE_IO_BASE + $09 ; DATA PORT (16 BIT DMA LO/HI BYTES) (R/W) #ENDIF #ENDIF ; -#IF (IDEMODE == IDEMODE_RC) +#IF ((IDEMODE == IDEMODE_RC) | (IDEMODE == IDEMODE_SMB)) IDE_UNITCNT .SET 1 ; RC2014 COMPACT FLASH SUPPORTS ONLY 1 DEVICE IDE_IO_DATA .EQU $IDE_IO_BASE + $00 ; DATA PORT (8 BIT) (R/W) #ENDIF @@ -399,22 +402,21 @@ IDE_DEFMED: ; ; IDE_READ: - LD (IDE_DSKBUF),HL ; SAVE DISK BUFFER ADDRESS - LD HL,IDE_RDSEC ; GET ADR OF SECTOR READ FUNC - LD (IDE_IOFNADR),HL ; SAVE IT AS PENDING IO FUNC + LD BC,IDE_RDSEC ; GET ADR OF SECTOR READ FUNC + LD (IDE_IOFNADR),BC ; SAVE IT AS PENDING IO FUNC JR IDE_IO ; CONTINUE TO GENERIC IO ROUTINE ; ; ; IDE_WRITE: - LD (IDE_DSKBUF),HL ; SAVE DISK BUFFER ADDRESS - LD HL,IDE_WRSEC ; GET ADR OF SECTOR WRITE FUNC - LD (IDE_IOFNADR),HL ; SAVE IT AS PENDING IO FUNC + LD BC,IDE_WRSEC ; GET ADR OF SECTOR WRITE FUNC + LD (IDE_IOFNADR),BC ; SAVE IT AS PENDING IO FUNC JR IDE_IO ; CONTINUE TO GENERIC IO ROUTINE ; ; ; IDE_IO: + LD (IDE_DSKBUF),HL ; SAVE DISK BUFFER ADDRESS LD A,E ; BLOCK COUNT TO A OR A ; SET FLAGS RET Z ; ZERO SECTOR I/O, RETURN W/ E=0 & A=0 @@ -428,7 +430,7 @@ IDE_IO: CALL IDE_SELUNIT ; HARDWARE SELECTION OF TARGET UNIT CALL IDE_CHKDEVICE ; CHECK DEVICE AND CLEAR STATUS POP BC ; RESTORE COUNTERS - RET NZ + JR NZ,IDE_IO3 ; BAIL OUT ON ERROR IDE_IO1: PUSH BC ; SAVE COUNTERS LD HL,(IDE_IOFNADR) ; GET PENDING IO FUNCTION ADDRESS @@ -795,7 +797,7 @@ IDE_RESET: OUT (MK4_XAR),A #ENDIF -#IF (IDEMODE == IDEMODE_RC) +#IF ((IDEMODE == IDEMODE_RC) | (IDEMODE == IDEMODE_SMB)) ; RC2014 CANNOT ADDRESS THE DEVICE CONTROL PORT AND ; HAS NO WAY TO PERFORM A HARD RESET FROM SOFTWARE, ; SO FAKE IT BY SETTING THE REGISTERS TO THE SAME @@ -808,7 +810,7 @@ IDE_RESET: OUT (IDE_IO_SECT),A #ENDIF -#IF ((IDEMODE != IDEMODE_MK4) & (IDEMODE != IDEMODE_RC)) +#IF ((IDEMODE != IDEMODE_MK4) & (IDEMODE != IDEMODE_RC) & (IDEMODE != IDEMODE_SMB)) ; INITIATE SOFT RESET LD A,%00001110 ; NO INTERRUPTS, ASSERT RESET BOTH DRIVES OUT (IDE_IO_CTRL),A @@ -817,7 +819,7 @@ IDE_RESET: LD DE,2 ; DELAY 32US (SPEC IS >= 25US) CALL VDELAY ; -#IF (IDEMODE != IDEMODE_RC) +#IF ((IDEMODE != IDEMODE_RC) & (IDEMODE != IDEMODE_SMB)) ; CONFIGURE OPERATION AND END SOFT RESET LD A,%00001010 ; NO INTERRUPTS, DEASSERT RESET OUT (IDE_IO_CTRL),A ; PUSH TO REGISTER diff --git a/Source/HBIOS/md.asm b/Source/HBIOS/md.asm index 76a56031..522253c6 100644 --- a/Source/HBIOS/md.asm +++ b/Source/HBIOS/md.asm @@ -167,11 +167,66 @@ MD_SEEK: CALL ST32 ; SAVE LBA ADDRESS XOR A ; SIGNAL SUCCESS RET ; AND RETURN + ; ; ; MD_READ: - LD (MD_DSKBUF),HL ; SAVE DISK BUFFER ADDRESS + LD BC,MD_RDSEC ; GET ADR OF SECTOR READ FUNC + LD (MD_RWFNADR),BC ; SAVE IT AS PENDING IO FUNC + JR MD_RW ; CONTINUE TO GENERIC R/W ROUTINE + +; +; +; +MD_WRITE: + LD BC,MD_WRSEC ; GET ADR OF SECTOR WRITE FUNC + LD (MD_RWFNADR),BC ; SAVE IT AS PENDING IO FUNC + LD A,(MD_UNIT) ; GET UNIT NUMBER + OR A ; SET FLAGS TO TEST FOR ROM (UNIT 0) + JR NZ,MD_RW ; NOT ROM, SO OK TO WRITE, CONTINUE + LD E,0 ; UNIT IS READ ONLY, ZERO SECTORS WRITTEN + OR $FF ; SIGNAL ERROR + RET ; AND DONE +; +; +; +MD_RW: + LD (MD_DSKBUF),HL ; SAVE DISK BUFFER ADDRESS + LD A,E ; BLOCK COUNT TO A + OR A ; SET FLAGS + RET Z ; ZERO SECTOR I/O, RETURN W/ E=0 & A=0 + LD B,A ; INIT SECTOR DOWNCOUNTER + LD C,0 ; INIT SECTOR READ/WRITE COUNT +MD_RW1: + PUSH BC ; SAVE COUNTERS + LD HL,(MD_RWFNADR) ; GET PENDING IO FUNCTION ADDRESS + CALL JPHL ; ... AND CALL IT + JR NZ,MD_RW2 ; IF ERROR, SKIP INCREMENT + LD HL,HSTLBA ; POINT TO 32-BIT CURRENT LBA + PUSH HL ; SAVE POINTER + CALL LD32 ; LOAD 32-BIT LBA INTO DE:HL + CALL INC32 ; INCREMENT LBA FOR NEXT I/O + POP BC ; RECOVER LBA POINTER INTO BC + CALL ST32 ; AND SAVE IT + LD HL,MD_DSKBUF+1 ; POINT TO MSB OF BUFFER ADR + INC (HL) ; BUMP DMA BY + INC (HL) ; ... 512 BYTES + XOR A ; SIGNAL SUCCESS +MD_RW2: + POP BC ; RECOVER COUNTERS + JR NZ,MD_RW3 ; IF ERROR, BAIL OUT + INC C ; BUMP COUNT OF SECTORS READ + DJNZ MD_RW1 ; LOOP AS NEEDED +MD_RW3: + LD E,C ; SECTOR READ COUNT TO E + LD HL,(MD_DSKBUF) ; CURRENT DMA TO HL + OR A ; SET FLAGS BASED ON RETURN CODE + RET ; AND RETURN, A HAS RETURN CODE +; +; +; +MD_RDSEC: CALL MD_IOSETUP ; SETUP FOR MEMORY COPY #IF (MDTRACE >= 2) LD (MD_SRC),HL @@ -196,13 +251,7 @@ MD_READ: ; ; ; -MD_WRITE: - LD (MD_DSKBUF),HL ; SAVE DISK BUFFER ADDRESS - LD A,C ; DEVICE/UNIT IS IN C - AND $0F ; ISOLATE UNIT NUM - LD A,1 ; PREPARE TO RETURN FALSE - RET Z ; RETURN ERROR IF ROM UNIT - +MD_WRSEC: CALL MD_IOSETUP ; SETUP FOR MEMORY COPY EX DE,HL ; SWAP SRC/DEST FOR WRITE #IF (MDTRACE >= 2) @@ -335,6 +384,8 @@ MD_PRT: ; ; ; +MD_RWFNADR .DW 0 +; MD_UNIT .DB 0 MD_DSKBUF .DW 0 ; diff --git a/Source/HBIOS/ppide.asm b/Source/HBIOS/ppide.asm index 7b45e1c9..0b19a89e 100644 --- a/Source/HBIOS/ppide.asm +++ b/Source/HBIOS/ppide.asm @@ -17,10 +17,6 @@ PPIDE_IO_BASE .EQU $60 PPIDE_IO_BASE .EQU $20 #ENDIF ; -#IF (PPIDEMODE == PPIDEMODE_SMB) -PPIDE_IO_BASE .EQU $E0 -#ENDIF -; #IF (PPIDEMODE == PPIDEMODE_MFP) PPIDE_IO_BASE .EQU $44 #ENDIF @@ -417,22 +413,21 @@ PPIDE_DEFMED: ; ; PPIDE_READ: - LD (PPIDE_DSKBUF),HL ; SAVE DISK BUFFER ADDRESS - LD HL,PPIDE_RDSEC ; GET ADR OF SECTOR READ FUNC - LD (PPIDE_IOFNADR),HL ; SAVE IT AS PENDING IO FUNC + LD BC,PPIDE_RDSEC ; GET ADR OF SECTOR READ FUNC + LD (PPIDE_IOFNADR),BC ; SAVE IT AS PENDING IO FUNC JR PPIDE_IO ; CONTINUE TO GENERIC IO ROUTINE ; ; ; PPIDE_WRITE: - LD (PPIDE_DSKBUF),HL ; SAVE DISK BUFFER ADDRESS - LD HL,PPIDE_WRSEC ; GET ADR OF SECTOR WRITE FUNC - LD (PPIDE_IOFNADR),HL ; SAVE IT AS PENDING IO FUNC + LD BC,PPIDE_WRSEC ; GET ADR OF SECTOR WRITE FUNC + LD (PPIDE_IOFNADR),BC ; SAVE IT AS PENDING IO FUNC JR PPIDE_IO ; CONTINUE TO GENERIC IO ROUTINE ; ; ; PPIDE_IO: + LD (PPIDE_DSKBUF),HL ; SAVE DISK BUFFER ADDRESS LD A,E ; BLOCK COUNT TO A OR A ; SET FLAGS RET Z ; ZERO SECTOR I/O, RETURN W/ E=0 & A=0 @@ -446,7 +441,7 @@ PPIDE_IO: CALL PPIDE_SELUNIT ; HARDWARE SELECTION OF TARGET UNIT CALL PPIDE_CHKDEVICE ; CHECK DEVICE AND CLEAR STATUS POP BC ; RESTORE COUNTERS - RET NZ + JR NZ,PPIDE_IO3 ; BAIL OUT ON ERROR PPIDE_IO1: PUSH BC ; SAVE COUNTERS LD HL,(PPIDE_IOFNADR) ; GET PENDING IO FUNCTION ADDRESS diff --git a/Source/HBIOS/ppp.asm b/Source/HBIOS/ppp.asm index e5e5d0b0..0f06b90f 100644 --- a/Source/HBIOS/ppp.asm +++ b/Source/HBIOS/ppp.asm @@ -462,31 +462,85 @@ PPPSD_FORMAT: PPPSD_DEFMED: CALL PANIC ; INVALID SUB-FUNCTION ; -; READ AN LBA BLOCK FROM THE SD CARD +; ; PPPSD_READ: + LD BC,PPPSD_RDSEC ; GET ADR OF SECTOR READ FUNC + LD (PPPSD_IOFNADR),BC ; SAVE IT AS PENDING IO FUNC + JR PPPSD_IO ; CONTINUE TO GENERIC IO ROUTINE +; +; +; +PPPSD_WRITE: + LD BC,PPPSD_WRSEC ; GET ADR OF SECTOR READ FUNC + LD (PPPSD_IOFNADR),BC ; SAVE IT AS PENDING IO FUNC + JR PPPSD_IO ; CONTINUE TO GENERIC IO ROUTINE +; +; +; +PPPSD_IO: LD (PPPSD_DSKBUF),HL ; SAVE DISK BUFFER ADDRESS + LD A,E ; BLOCK COUNT TO A + OR A ; SET FLAGS + RET Z ; ZERO SECTOR I/O, RETURN W/ E=0 & A=0 + LD B,A ; INIT SECTOR DOWNCOUNTER + LD C,0 ; INIT SECTOR R/W COUNTER #IF (PPPSDTRACE == 1) LD HL,PPPSD_PRTERR ; SET UP PPPSD_PRTERR PUSH HL ; ... TO FILTER ALL EXITS #ENDIF + PUSH BC ; SAVE COUNTERS CALL PPPSD_CHKCARD ; CHECK / REINIT CARD AS NEEDED - RET NZ ; BAIL OUT ON ERROR + POP BC ; RESTORE COUNTERS + JR NZ,PPPSD_IO3 ; BAIL OUT ON ERROR +PPPSD_IO1: + PUSH BC ; SAVE COUNTERS + #IF (PPPSDTRACE >= 3) CALL PPPSD_PRTPREFIX #ENDIF + LD HL,(PPPSD_IOFNADR) ; GET PENDING IO FUNCTION ADDRESS + CALL JPHL ; ... AND CALL IT + JR NZ,PPPSD_IO2 ; BAIL OUT ON ERROR + + LD HL,HSTLBA ; POINT TO 32-BIT CURRENT LBA + PUSH HL ; SAVE POINTER + CALL LD32 ; LOAD 32-BIT LBA INTO DE:HL + CALL INC32 ; INCREMENT LBA FOR NEXT I/O + POP BC ; RECOVER LBA POINTER INTO BC + CALL ST32 ; AND SAVE IT + LD HL,PPPSD_DSKBUF+1 ; POINT TO MSB OF BUFFER ADR + INC (HL) ; BUMP DMA BY + INC (HL) ; ... 512 BYTES + XOR A ; SIGNAL SUCCESS + +PPPSD_IO2: + POP BC ; RECOVER COUNTERS + JR NZ,PPPSD_IO3 ; IF ERROR PENDING, BAIL OUT + INC C ; BUMP COUNT OF SECTORS READ + DJNZ PPPSD_IO1 ; LOOP AS NEEDED + +PPPSD_IO3: + LD E,C ; SECTOR READ COUNT TO E + LD HL,(PPPSD_DSKBUF) ; CURRENT BUF ADR TO HL + OR A ; SET FLAGS + RET ; RETURN WITH A = STATUS +; +; +; +PPPSD_RDSEC: +; #IF (PPPSDTRACE >= 3) PRTS(" READ$") #ENDIF - ; READ A SECTOR - LD D,PPP_CMDDSKRD ; COMMAND = DSKRD - CALL PPP_SNDCMD ; SEND COMMAND - RET NZ + LD D,PPP_CMDDSKRD ; READ COMMAND + CALL PPP_SNDCMD ; ... AND SEND COMMAND + RET NZ ; BAIL OUT ON ERROR CALL PPPSD_SENDBLK ; SEND THE LBA BLOCK NUMBER CALL PPP_GETBYTE ; GET READ RESULT @@ -496,52 +550,39 @@ PPPSD_READ: CALL PC_SPACE CALL PRTHEXBYTE #ENDIF - + OR A ; SET FLAGS - JR Z,PPPSD_READ1 - + JR Z,PPPSD_RDSEC1 + ; HANDLE ERROR CALL PPPSD_GETDSKSTAT ; GET FULL ERROR CODE - JP PPPSD_ERRCMD ; HANDLE ERRORS - -PPPSD_READ1: + JP PPPSD_ERRCMD ; RETURN VIA ERROR HANDLER + +PPPSD_RDSEC1: ; GET THE SECTOR DATA LD D,PPP_CMDDSKGET ; COMMAND = DSKGET CALL PPP_SNDCMD ; SEND COMMAND - RET NZ + RET NZ ; BAIL OUT ON ERROR ; READ THE SECTOR DATA LD BC,512 LD HL,(PPPSD_DSKBUF) -PPPSD_READ2: +PPPSD_RDSEC2: CALL PPP_GETBYTE LD (HL),A INC HL DEC BC LD A,B OR C - JP NZ,PPPSD_READ2 + JP NZ,PPPSD_RDSEC2 XOR A ; SIGNAL SUCCESS RET ; -; WRITE AN LBA BLOCK TO THE SD CARD ; -PPPSD_WRITE: - LD (PPPSD_DSKBUF),HL ; SAVE DISK BUFFER ADDRESS - -#IF (PPPSDTRACE == 1) - LD HL,PPPSD_PRTERR ; SET UP PPPSD_PRTERR - PUSH HL ; ... TO FILTER ALL EXITS -#ENDIF - - CALL PPPSD_CHKCARD ; CHECK / REINIT CARD AS NEEDED - RET NZ ; BAIL OUT ON ERROR - -#IF (PPPSDTRACE >= 3) - CALL PPPSD_PRTPREFIX -#ENDIF - +; +PPPSD_WRSEC: +; #IF (PPPSDTRACE >= 3) PRTS(" WRITE$") #ENDIF @@ -554,14 +595,14 @@ PPPSD_WRITE: ; SEND OVER THE SECTOR CONTENTS LD BC,512 LD HL,(PPPSD_DSKBUF) -PPPSD_WRITE1: +PPPSD_WRSEC1: LD A,(HL) INC HL CALL PPP_PUTBYTE DEC BC LD A,B OR C - JP NZ,PPPSD_WRITE1 + JP NZ,PPPSD_WRSEC1 ; WRITE THE SECTOR LD D,PPP_CMDDSKWR ; COMMAND = DSKWR @@ -1048,6 +1089,8 @@ PPPSD_STR_TYPESDXC .TEXT "SDXC$" ; DATA STORAGE ;============================================================================= ; +PPPSD_IOFNADR .DW 0 ; PENDING IO FUNCTION ADDRESS +; PPPSD_UNIT .DB 0 PPPSD_DSKBUF .DW 0 ; diff --git a/Source/HBIOS/prp.asm b/Source/HBIOS/prp.asm index acd6a30a..f1065623 100644 --- a/Source/HBIOS/prp.asm +++ b/Source/HBIOS/prp.asm @@ -361,87 +361,124 @@ PRPSD_DEFMED: ; ; PRPSD_READ: + LD BC,PRPSD_RDSEC ; GET ADR OF SECTOR READ FUNC + LD (PRPSD_IOFNADR),BC ; SAVE IT AS PENDING IO FUNC + JR PRPSD_IO ; CONTINUE TO GENERIC IO ROUTINE +; +; +; +PRPSD_WRITE: + LD BC,PRPSD_WRSEC ; GET ADR OF SECTOR READ FUNC + LD (PRPSD_IOFNADR),BC ; SAVE IT AS PENDING IO FUNC + JR PRPSD_IO ; CONTINUE TO GENERIC IO ROUTINE +; +; +; +PRPSD_IO: LD (PRPSD_DSKBUF),HL ; SAVE DISK BUFFER ADDRESS + LD A,E ; BLOCK COUNT TO A + OR A ; SET FLAGS + RET Z ; ZERO SECTOR I/O, RETURN W/ E=0 & A=0 + LD B,A ; INIT SECTOR DOWNCOUNTER + LD C,0 ; INIT SECTOR R/W COUNTER #IF (PRPSDTRACE == 1) LD HL,PRPSD_PRTERR ; SET UP PRPSD_PRTERR PUSH HL ; ... TO FILTER ALL EXITS #ENDIF + PUSH BC ; SAVE COUNTERS CALL PRPSD_CHKCARD ; CHECK / REINIT CARD AS NEEDED - RET NZ ; BAIL OUT ON ERROR + POP BC ; RESTORE COUNTERS + JR NZ,PRPSD_IO3 ; BAIL OUT ON ERROR +PRPSD_IO1: + PUSH BC ; SAVE COUNTERS + #IF (PRPSDTRACE >= 3) CALL PRPSD_PRTPREFIX #ENDIF -#IF (PRPSDTRACE >= 3) - PRTS(" READ$") -#ENDIF - - ;LD DE,$FFFF - ;LD HL,$FFFF - ;LD BC,HSTLBA - ;CALL ST32 - - CALL PRPSD_SETBLK + LD HL,(PRPSD_IOFNADR) ; GET PENDING IO FUNCTION ADDRESS + CALL JPHL ; ... AND CALL IT + JR NZ,PRPSD_IO2 ; BAIL OUT ON ERROR - LD A,PRPSD_CMDREAD - CALL PRPSD_SNDCMD - RET NZ ; RETURN ON FAILURE, A = STATUS + LD HL,HSTLBA ; POINT TO 32-BIT CURRENT LBA + PUSH HL ; SAVE POINTER + CALL LD32 ; LOAD 32-BIT LBA INTO DE:HL + CALL INC32 ; INCREMENT LBA FOR NEXT I/O + POP BC ; RECOVER LBA POINTER INTO BC + CALL ST32 ; AND SAVE IT + LD HL,PRPSD_DSKBUF+1 ; POINT TO MSB OF BUFFER ADR + INC (HL) ; BUMP DMA BY + INC (HL) ; ... 512 BYTES + XOR A ; SIGNAL SUCCESS - LD C,PRPSD_DSKIO - LD B,0 - LD HL,(PRPSD_DSKBUF) - INIR - INIR +PRPSD_IO2: + POP BC ; RECOVER COUNTERS + JR NZ,PRPSD_IO3 ; IF ERROR PENDING, BAIL OUT + INC C ; BUMP COUNT OF SECTORS READ + DJNZ PRPSD_IO1 ; LOOP AS NEEDED +PRPSD_IO3: + LD E,C ; SECTOR READ COUNT TO E + LD HL,(PRPSD_DSKBUF) ; CURRENT BUF ADR TO HL OR A ; SET FLAGS RET ; RETURN WITH A = STATUS ; ; ; -PRPSD_WRITE: - LD (PRPSD_DSKBUF),HL ; SAVE DISK BUFFER ADDRESS - -#IF (PRPSDTRACE == 1) - LD HL,PRPSD_PRTERR ; SET UP PRPSD_PRTERR - PUSH HL ; ... TO FILTER ALL EXITS -#ENDIF - - CALL PRPSD_CHKCARD ; CHECK / REINIT CARD AS NEEDED - RET NZ ; BAIL OUT ON ERROR +PRPSD_RDSEC: +; + CALL PRPSD_SETBLK ; SEND BLOCK ADDRESS #IF (PRPSDTRACE >= 3) - CALL PRPSD_PRTPREFIX + PRTS(" READ$") #ENDIF + LD A,PRPSD_CMDREAD ; READ COMMAND + CALL PRPSD_SNDCMD ; ... AND SEND COMMAND + RET NZ ; BAIL OUT ON ERROR + + LD C,PRPSD_DSKIO ; SET PORT + LD B,0 ; SET LOOP COUNTER FOR 256 ITER + LD HL,(PRPSD_DSKBUF) ; SET BUF ADR + INIR ; READ 256 BYTES + INIR ; ... AND AGAIN FOR 512 TOTAL + + XOR A ; SIGNAL SUCCESS + RET +; +; +; +PRPSD_WRSEC: +; CALL PRPSD_SETBLK #IF (PRPSDTRACE >= 3) PRTS(" PREP$") #ENDIF - LD A,PRPSD_CMDPREP - CALL PRPSD_SNDCMD - RET NZ ; RETURN ON FAILURE, A = STATUS + LD A,PRPSD_CMDPREP ; PREPARE COMMAND + CALL PRPSD_SNDCMD ; SEND IT + RET NZ ; BAIL OUT ON ERROR - LD C,PRPSD_DSKIO - LD B,0 - LD HL,(PRPSD_DSKBUF) - OTIR - OTIR + LD C,PRPSD_DSKIO ; SET PORT + LD B,0 ; SET LOOP COUNTER FOR 256 ITER + LD HL,(PRPSD_DSKBUF) ; SET BUF ADR + OTIR ; WRITE 256 BYTES + OTIR ; ... AND AGAIN FOR 512 TOTAL #IF (PRPSDTRACE >= 3) PRTS(" WRITE$") #ENDIF - LD A,PRPSD_CMDWRITE - CALL PRPSD_SNDCMD - RET NZ ; RETURN ON FAILURE, A = STATUS - - OR A ; SET FLAGS - RET ; RETURN WITH A = STATUS + LD A,PRPSD_CMDWRITE ; WRITE COMMAND + CALL PRPSD_SNDCMD ; SEND IT + RET NZ ; BAIL OUT ON ERROR + + XOR A ; SIGNAL SUCCESS + RET ; RETURN ; ; ; @@ -987,6 +1024,8 @@ PRPSD_STR_TYPESDXC .TEXT "SDXC$" ; PRP_FWVER .DB $00, $00, $00, $00 ; MMNNBBB (M=MAJOR, N=MINOR, B=BUILD) ; +PRPSD_IOFNADR .DW 0 ; PENDING IO FUNCTION ADDRESS +; PRPSD_UNIT .DB 0 PRPSD_DSKBUF .DW 0 ; diff --git a/Source/HBIOS/rf.asm b/Source/HBIOS/rf.asm index 4ce8765c..60a37e8e 100644 --- a/Source/HBIOS/rf.asm +++ b/Source/HBIOS/rf.asm @@ -150,44 +150,87 @@ RF_SEEK: XOR A ; SIGNAL SUCCESS RET ; AND RETURN ; -; -; +; +; RF_READ: - LD (RF_DSKBUF),HL ; SAVE DISK BUFFER ADDRESS - CALL RF_SETIO - CALL RF_SETADR - LD HL,(RF_DSKBUF) - LD B,0 - LD A,(RF_IO) - OR RF_DAT - LD C,A - INIR - INIR - XOR A - RET + LD BC,RF_RDSEC ; GET ADR OF SECTOR READ FUNC + LD (RF_RWFNADR),BC ; SAVE IT AS PENDING IO FUNC + JR RF_RW ; CONTINUE TO GENERIC R/W ROUTINE ; ; ; RF_WRITE: - LD (RF_DSKBUF),HL ; SAVE DISK BUFFER ADDRESS - CALL RF_SETIO - LD A,(RF_IO) - OR RF_ST - LD C,A - IN A,(C) - BIT 0,A ; CHECK WRITE PROTECT - LD A,1 ; PREPARE TO RETURN FALSE (ERROR) - RET NZ ; WRITE PROTECTED! - CALL RF_SETADR - LD HL,(RF_DSKBUF) - LD B,0 - LD A,(RF_IO) - OR RF_DAT - LD C,A - OTIR - OTIR - XOR A - RET + LD BC,RF_WRSEC ; GET ADR OF SECTOR WRITE FUNC + LD (RF_RWFNADR),BC ; SAVE IT AS PENDING IO FUNC + CALL RF_CHKWP ; WRITE PROTECTED? + JR Z,RF_RW ; IF 0, NOT WP, CONTINUE WITH GENERIC R/W ROUTINE + LD E,0 ; ZERO SECTORS WRITTEN + OR $FF ; SIGNAL ERROR + RET ; AND DONE +; +; +; +RF_RW: + LD (RF_DSKBUF),HL ; SAVE DISK BUFFER ADDRESS + LD A,E ; BLOCK COUNT TO A + OR A ; SET FLAGS + RET Z ; ZERO SECTOR I/O, RETURN W/ E=0 & A=0 + LD B,A ; INIT SECTOR DOWNCOUNTER + LD C,0 ; INIT SECTOR READ/WRITE COUNT + CALL RF_SETIO ; SET BASE PORT IO ADR FOR SELECTED UNIT +RF_RW1: + PUSH BC ; SAVE COUNTERS + LD HL,(RF_RWFNADR) ; GET PENDING IO FUNCTION ADDRESS + CALL JPHL ; ... AND CALL IT + JR NZ,RF_RW2 ; IF ERROR, SKIP INCREMENT + LD HL,HSTLBA ; POINT TO 32-BIT CURRENT LBA + PUSH HL ; SAVE POINTER + CALL LD32 ; LOAD 32-BIT LBA INTO DE:HL + CALL INC32 ; INCREMENT LBA FOR NEXT I/O + POP BC ; RECOVER LBA POINTER INTO BC + CALL ST32 ; AND SAVE IT + LD HL,RF_DSKBUF+1 ; POINT TO MSB OF BUFFER ADR + INC (HL) ; BUMP DMA BY + INC (HL) ; ... 512 BYTES + XOR A ; SIGNAL SUCCESS +RF_RW2: + POP BC ; RECOVER COUNTERS + JR NZ,RF_RW3 ; IF ERROR, BAIL OUT + INC C ; BUMP COUNT OF SECTORS READ + DJNZ RF_RW1 ; LOOP AS NEEDED +RF_RW3: + LD E,C ; SECTOR READ COUNT TO E + LD HL,(RF_DSKBUF) ; CURRENT DMA TO HL + OR A ; SET FLAGS BASED ON RETURN CODE + RET ; AND RETURN, A HAS RETURN CODE +; +; READ SECTOR +; +RF_RDSEC: + CALL RF_SETADR ; SEND SECTOR STARTING ADDRESS TO CARD + LD HL,(RF_DSKBUF) ; HL := DISK BUFFER ADDRESS + LD B,0 ; INIT BYTE COUNTER + LD A,(RF_IO) ; GET IO PORT BASE + OR RF_DAT ; OFFSET TO DAT PORT + LD C,A ; PUT IN C FOR PORT IO + INIR ; READ 256 BYTES + INIR ; AND ANOTHER 256 BYTES FOR 512 TOTAL + XOR A ; SIGNAL SUCCESS + RET ; AND DONE +; +; WRITE SECTOR +; +RF_WRSEC: + CALL RF_SETADR ; SEND SECTOR STARTING ADDRESS TO CARD + LD HL,(RF_DSKBUF) ; HL := DISK BUFFER ADDRESS + LD B,0 ; INIT BYTE COUNTER + LD A,(RF_IO) ; GET IO PORT BASE + OR RF_DAT ; OFFSET TO DAT PORT + LD C,A ; PUT IN C FOR PORT IO + OTIR ; WRITE 256 BYTES + OTIR ; AND ANOTHER 256 BYTES FOR 512 TOTAL + XOR A ; SIGNAL SUCCESS + RET ; AND DONE ; ; ; @@ -223,7 +266,19 @@ RF_SETADR: ; ; ; -RF_IO .DB 0 +RF_CHKWP: + CALL RF_SETIO ; SET BASE PORT IO ADR FOR SELECTED UNIT + LD A,(RF_IO) ; GET IO PORT BASE + OR RF_ST ; OFFSET TO ST PORT + LD C,A ; PUT PORT ADR IN C FOR IO + IN A,(C) ; READ ST PORT + BIT 0,A ; CHECK WRITE PROTECT (BIT 0) + RET ; RET WP STATUS IN ZF, NZ=WP +; +; +; +RF_IO .DB 0 +RF_RWFNADR .DW 0 ; RF_UNIT .DB 0 RF_DSKBUF .DW 0 diff --git a/Source/HBIOS/romldr.asm b/Source/HBIOS/romldr.asm index 752b3530..b2f368cf 100644 --- a/Source/HBIOS/romldr.asm +++ b/Source/HBIOS/romldr.asm @@ -271,8 +271,9 @@ CHAIN: PUSH HL ; SAVE ENTRY ADDRESS ; #IF (PLATFORM == PLT_UNA) - LD DE,-1 - LD L,1 + LD BC,$00FB ; GET LOWER PAGE ID + RST 08 ; DE := LOWER PAGE ID == BOOT ROM PAGE + LD L,1 ; BOOT DISK UNIT IS ROM (UNIT ID = 1) LD BC,$01FC ; UNA FUNC: SET BOOTSTRAP HISTORY RST 08 ; CALL UNA ; @@ -281,7 +282,6 @@ CHAIN: PUSH DE ; ... ON STACK DI ; ENTER WITH INTS DISABLED JP $FFF7 ; UNA INTER-PAGE EXEC CHAIN - HALT #ELSE LD B,BF_SYSSET ; HB FUNC: SET HBIOS PARAMETER LD C,BF_SYSSET_BOOTINFO ; HB SUBFUNC: SET BOOT INFO @@ -387,7 +387,7 @@ BOOTDISK: #ENDIF ; ; CHECK SIGNATURE - ;CALL NEWLINE ; FORMATTING + CALL NEWLINE ; FORMATTING LD DE,(BB_SIG) ; GET THE SIGNATURE LD A,$A5 ; FIRST BYTE SHOULD BE $A5 CP D ; COMPARE @@ -451,16 +451,20 @@ BOOTDISK: JP NZ,DB_ERR ; HANDLE ERROR ; ; PASS BOOT DEVICE/UNIT/LU TO CBIOS COLD BOOT - LD DE,-1 - LD A,(BL_BOOTID) - LD L,A + LD DE,-1 ; BOOT ROM PAGE, -1 FOR N/A + LD A,(BL_BOOTID) ; GET BOOT DISK UNIT ID + LD L,A ; PUT IN L LD BC,$01FC ; UNA FUNC: SET BOOTSTRAP HISTORY RST 08 ; CALL UNA + JP NZ,DB_ERR ; HANDLE ERROR ; ; JUMP TO COLD BOOT ENTRY LD HL,(BB_CPMENT) ; GET THE ENTRY POINT + PUSH HL ; PUT ON STACK FOR UNA CHAIN FUNC + LD DE,BID_USR ; TARGET BANK ID IS USER BANK + PUSH DE ; PUT ON STACK FOR UNA CHAIN FUNC DI ; ENTER WITH INTS DISABLED - JP (HL) ; ... AND GO + JP $FFF7 ; UNA INTER-PAGE EXEC CHAIN ; #ELSE ; @@ -479,7 +483,7 @@ BOOTDISK: LD B,BF_SYSSET ; HB FUNC: SET HBIOS PARAMETER LD C,BF_SYSSET_BOOTINFO ; HB SUBFUNC: SET BOOT INFO LD A,(HB_CURBNK) ; GET CURRENT BANK ID FROM PROXY DATA - LD L,A ; ... AND SAVE AND BOOT BANK + LD L,A ; ... AND SAVE AS BOOT BANK LD A,(BL_DEVICE) ; LOAD BOOT DEVICE/UNIT LD D,A ; SAVE IN D LD A,(BL_LU) ; LOAD BOOT LU diff --git a/Source/HBIOS/std.asm b/Source/HBIOS/std.asm index 8e8365b9..48bafc61 100644 --- a/Source/HBIOS/std.asm +++ b/Source/HBIOS/std.asm @@ -86,6 +86,9 @@ FDMODE_ZETA2 .EQU 3 ; ZETA V2 FDMODE_DIDE .EQU 4 ; DUAL IDE FDMODE_N8 .EQU 5 ; N8 FDMODE_DIO3 .EQU 6 ; DISKIO V3 +FDMODE_SMBSMC .EQU 7 ; RC2014 SMB SMC9266 +FDMODE_SMBWDC .EQU 8 ; RC2014 SMB WD37C65 + ; ; IDE MODE SELECTIONS ; @@ -94,6 +97,7 @@ IDEMODE_DIO .EQU 1 ; DISKIO V1 IDEMODE_DIDE .EQU 2 ; DUAL IDE IDEMODE_MK4 .EQU 3 ; MARK IV ONBOARD IDE (8 BIT) IDEMODE_RC .EQU 4 ; RC2014 CF BOARD (8 BIT) +IDEMODE_SMB .EQU 5 ; RC2014 IDE SMB $E0 IO BASE (8 BIT) ; ; PPIDE MODE SELECTIONS ; @@ -103,7 +107,6 @@ PPIDEMODE_DIO3 .EQU 2 ; DISKIO V3 PARALLEL PORT PPIDEMODE_MFP .EQU 3 ; MULTIFUNCTION / PIC PPIDEMODE_N8 .EQU 4 ; MULTIFUNCTION / PIC PPIDEMODE_RC .EQU 5 ; RC2014 PPIDE STANDARD $20 IO BASE -PPIDEMODE_SMB .EQU 6 ; RC2014 PPIDE SMB $E0 IO BASE ; ; SD MODE SELECTIONS ; @@ -317,7 +320,7 @@ MON_SERIAL .EQU MON_LOC + (1 * 3) ; MONITOR ENTRY (SERIAL PORT) ; HELPER MACROS ; #DEFINE PRTC(C) CALL PRTCH \ .DB C ; PRINT CHARACTER C TO CONSOLE - PRTC('X') -#DEFINE PRTS(S) CALL PRTSTRD \ .DB S ; PRINT STRING S TO CONSOLE - PRTD("HELLO") +#DEFINE PRTS(S) CALL PRTSTRD \ .TEXT S ; PRINT STRING S TO CONSOLE - PRTD("HELLO") #DEFINE PRTX(X) CALL PRTSTRI \ .DW X ; PRINT STRING AT ADDRESS X TO CONSOLE - PRTI(STR_HELLO) ; #DEFINE XIO_PRTC(C) CALL XIO_PRTCH \ .DB C ; PRINT CHARACTER C TO CONSOLE - PRTC('X') diff --git a/Source/HBIOS/util.asm b/Source/HBIOS/util.asm index bb7e0682..e4f297b3 100644 --- a/Source/HBIOS/util.asm +++ b/Source/HBIOS/util.asm @@ -920,6 +920,24 @@ SUB32: RET NC DEC DE RET +; +; INC32 (HL) +; INCREMENT 32 BIT BINARY AT ADDRESS +; +INC32HL: + PUSH HL + PUSH BC + LD B,4 +INC32HL1: + INC (HL) + INC HL + JR NZ,INC32HL2 + DJNZ INC32HL1 +INC32HL2: + POP BC + POP HL + RET +