diff --git a/Source/CBIOS/cbios.asm b/Source/CBIOS/cbios.asm index 7c694d25..dacf7537 100644 --- a/Source/CBIOS/cbios.asm +++ b/Source/CBIOS/cbios.asm @@ -1602,13 +1602,12 @@ DPB_RAM: ; ; 4MB RAM FLOPPY DRIVE, 32 TRKS, 1024 SECS/TRK, 128 BYTES/SEC ; BLOCKSIZE (BLS) = 2K, DIRECTORY ENTRIES = 256 -; SEC/TRK ENGINEERED SO THAT AFTER DEBLOCKING, SECTOR NUMBER OCCUPIES 1 BYTE (0-255) ; .DW CKS_HD .DW ALS_HD .DB (2048 / 128) ; RECORDS PER BLOCK (BLS / 128) DPB_RF: - .DW 1024 ; SPT: SECTORS PER TRACK + .DW 64 ; SPT: SECTORS PER TRACK .DB 4 ; BSH: BLOCK SHIFT FACTOR .DB 15 ; BLM: BLOCK MASK .DB 0 ; EXM: EXTENT MASK diff --git a/Source/HBIOS/fd.asm b/Source/HBIOS/fd.asm index 803663ff..a17b324d 100644 --- a/Source/HBIOS/fd.asm +++ b/Source/HBIOS/fd.asm @@ -125,22 +125,22 @@ FSST_COUNT .EQU (($ - FSST) / FSST_ENTSIZ) ; # ENTRIES IN TABLE ; ; FDC COMMANDS ; -CMD_READ .EQU 00000110B ; CMD,HDS/DS,C,H,R,N,EOT,GPL,DTL --> ST0,ST1,ST2,C,H,R,N -CMD_READDEL .EQU 00001100B ; CMD,HDS/DS,C,H,R,N,EOT,GPL,DTL --> ST0,ST1,ST2,C,H,R,N -CMD_WRITE .EQU 00000101B ; CMD,HDS/DS,C,H,R,N,EOT,GPL,DTL --> ST0,ST1,ST2,C,H,R,N -CMD_WRITEDEL .EQU 00001001B ; CMD,HDS/DS,C,H,R,N,EOT,GPL,DTL --> ST0,ST1,ST2,C,H,R,N -CMD_READTRK .EQU 00000010B ; CMD,HDS/DS,C,H,R,N,EOT,GPL,DTL --> ST0,ST1,ST2,C,H,R,N -CMD_READID .EQU 00001010B ; CMD,HDS/DS --> ST0,ST1,ST2,C,H,R,N -CMD_FMTTRK .EQU 00001101B ; CMD,HDS/DS,N,SC,GPL,D --> ST0,ST1,ST2,C,H,R,N -CMD_SCANEQ .EQU 00010001B ; CMD,HDS/DS,C,H,R,N,EOT,GPL,STP --> ST0,ST1,ST2,C,H,R,N -CMD_SCANLOEQ .EQU 00011001B ; CMD,HDS/DS,C,H,R,N,EOT,GPL,STP --> ST0,ST1,ST2,C,H,R,N -CMD_SCANHIEQ .EQU 00011101B ; CMD,HDS/DS,C,H,R,N,EOT,GPL,STP --> ST0,ST1,ST2,C,H,R,N -CMD_RECAL .EQU 00000111B ; CMD,DS --> -CMD_SENSEINT .EQU 00001000B ; CMD --> ST0,PCN -CMD_SPECIFY .EQU 00000011B ; CMD,SRT/HUT,HLT/ND --> -CMD_DRVSTAT .EQU 00000100B ; CMD,HDS/DS --> ST3 -CMD_SEEK .EQU 00001111B ; CMD,HDS/DS --> -CMD_VERSION .EQU 00010000B ; CMD --> ST0 +CFD_READ .EQU 00000110B ; CMD,HDS/DS,C,H,R,N,EOT,GPL,DTL --> ST0,ST1,ST2,C,H,R,N +CFD_READDEL .EQU 00001100B ; CMD,HDS/DS,C,H,R,N,EOT,GPL,DTL --> ST0,ST1,ST2,C,H,R,N +CFD_WRITE .EQU 00000101B ; CMD,HDS/DS,C,H,R,N,EOT,GPL,DTL --> ST0,ST1,ST2,C,H,R,N +CFD_WRITEDEL .EQU 00001001B ; CMD,HDS/DS,C,H,R,N,EOT,GPL,DTL --> ST0,ST1,ST2,C,H,R,N +CFD_READTRK .EQU 00000010B ; CMD,HDS/DS,C,H,R,N,EOT,GPL,DTL --> ST0,ST1,ST2,C,H,R,N +CFD_READID .EQU 00001010B ; CMD,HDS/DS --> ST0,ST1,ST2,C,H,R,N +CFD_FMTTRK .EQU 00001101B ; CMD,HDS/DS,N,SC,GPL,D --> ST0,ST1,ST2,C,H,R,N +CFD_SCANEQ .EQU 00010001B ; CMD,HDS/DS,C,H,R,N,EOT,GPL,STP --> ST0,ST1,ST2,C,H,R,N +CFD_SCANLOEQ .EQU 00011001B ; CMD,HDS/DS,C,H,R,N,EOT,GPL,STP --> ST0,ST1,ST2,C,H,R,N +CFD_SCANHIEQ .EQU 00011101B ; CMD,HDS/DS,C,H,R,N,EOT,GPL,STP --> ST0,ST1,ST2,C,H,R,N +CFD_RECAL .EQU 00000111B ; CMD,DS --> +CFD_SENSEINT .EQU 00001000B ; CMD --> ST0,PCN +CFD_SPECIFY .EQU 00000011B ; CMD,SRT/HUT,HLT/ND --> +CFD_DRVSTAT .EQU 00000100B ; CMD,HDS/DS --> ST3 +CFD_SEEK .EQU 00001111B ; CMD,HDS/DS --> +CFD_VERSION .EQU 00010000B ; CMD --> ST0 ; ; ; Specify Command: @@ -347,48 +347,73 @@ FCS_VERSION .DB "VER$" ; ; FDC COMMAND TABLE ; -FCT .DB CMD_READ \ .DW FCS_READ +FCT .DB CFD_READ \ .DW FCS_READ FCT_ENTSIZ .EQU $ - FCT - .DB CMD_READDEL \ .DW FCS_READDEL - .DB CMD_WRITE \ .DW FCS_WRITE - .DB CMD_WRITEDEL \ .DW FCS_WRITEDEL - .DB CMD_READTRK \ .DW FCS_READTRK - .DB CMD_READID \ .DW FCS_READID - .DB CMD_FMTTRK \ .DW FCS_FMTTRK - .DB CMD_SCANEQ \ .DW FCS_SCANEQ - .DB CMD_SCANLOEQ \ .DW FCS_SCANLOEQ - .DB CMD_SCANHIEQ \ .DW FCS_SCANHIEQ - .DB CMD_RECAL \ .DW FCS_RECAL - .DB CMD_SENSEINT \ .DW FCS_SENSEINT - .DB CMD_SPECIFY \ .DW FCS_SPECIFY - .DB CMD_DRVSTAT \ .DW FCS_DRVSTAT - .DB CMD_SEEK \ .DW FCS_SEEK - .DB CMD_VERSION \ .DW FCS_VERSION + .DB CFD_READDEL \ .DW FCS_READDEL + .DB CFD_WRITE \ .DW FCS_WRITE + .DB CFD_WRITEDEL \ .DW FCS_WRITEDEL + .DB CFD_READTRK \ .DW FCS_READTRK + .DB CFD_READID \ .DW FCS_READID + .DB CFD_FMTTRK \ .DW FCS_FMTTRK + .DB CFD_SCANEQ \ .DW FCS_SCANEQ + .DB CFD_SCANLOEQ \ .DW FCS_SCANLOEQ + .DB CFD_SCANHIEQ \ .DW FCS_SCANHIEQ + .DB CFD_RECAL \ .DW FCS_RECAL + .DB CFD_SENSEINT \ .DW FCS_SENSEINT + .DB CFD_SPECIFY \ .DW FCS_SPECIFY + .DB CFD_DRVSTAT \ .DW FCS_DRVSTAT + .DB CFD_SEEK \ .DW FCS_SEEK + .DB CFD_VERSION \ .DW FCS_VERSION FCT_COUNT .EQU (($ - FCT) / FCT_ENTSIZ) ; # ENTRIES IN TABLE #ENDIF ; ; ; FD_DISPATCH: + CALL FD_SELECTUNIT + RET NZ +; + ; DISPATCH ACCORDING TO DISK SUB-FUNCTION LD A,B ; GET REQUESTED FUNCTION - AND $0F - JP Z,FD_READ + AND $0F ; ISOLATE SUB-FUNCTION + JP Z,FD_SEEK ; SUB-FUNC 0: SEEK DEC A - JP Z,FD_WRITE + JP Z,FD_READ ; SUB-FUNC 1: READ DEC A - JP Z,FD_STATUS + JP Z,FD_WRITE ; SUB-FUNC 2: WRITE DEC A - JP Z,FD_MEDIA + JP Z,FD_STATUS ; SUB-FUNC 3: STATUS DEC A - JP Z,FD_CAP + JP Z,FD_RESET ; SUB-FUNC 4: RESET DEC A - JP Z,FD_GEOM - CALL PANIC -; -; FD_MEDIA -; -FD_MEDIA: - CALL FD_SELECTUNIT + JP Z,FD_CAP ; SUB-FUNC 5: GET CAPACITY + DEC A + JP Z,FD_GEOM ; SUB-FUNC 6: GET GEOMETRY + DEC A + JP Z,FD_GETPAR ; SUB-FUNC 7: GET PARAMETERS + DEC A + JP Z,FD_SETPAR ; SUB-FUNC 8: SET PARAMETERS + CALL PANIC ; INVALID SUB-FUNCTION +;; +; LD A,B ; GET REQUESTED FUNCTION +; AND $0F +; JP Z,FD_READ +; DEC A +; JP Z,FD_WRITE +; DEC A +; JP Z,FD_STATUS +; DEC A +; JP Z,FD_MEDIA +; DEC A +; JP Z,FD_CAP +; DEC A +; JP Z,FD_GEOM +; CALL PANIC +; +; FD_GETPAR +; +FD_GETPAR: + ;CALL FD_SELECTUNIT #IF (FDMAUTO) ; SETUP TO READ TRK 0, HD 0, SEC 0 @@ -425,7 +450,8 @@ FD_MEDIARETRY: DJNZ FD_MEDIARETRY ; NO JOY, RETURN WITH A=0 (NO MEDIA) - XOR A + LD E,0 + OR $FF ; SIGNAL ERROR RET FD_TESTMEDIA: @@ -461,6 +487,15 @@ FD_MEDIA3: CALL PC_SPACE CALL PRTHEXBYTE #ENDIF + LD E,A ; MOVE MEDIA VALUE TO E + XOR A ; SIGNAL SUCCESS + RET +; +; +; +FD_SETPAR: + ; NOT IMPLEMENTED + XOR A RET ; ; @@ -482,8 +517,10 @@ FD_CAP: ; ; FD_GEOM: - LD A,C ; GET DEVICE/UNIT - OR $0F ; ISOLATE UNIT + ;LD A,C ; GET DEVICE/UNIT + ;OR $0F ; ISOLATE UNIT + LD A,(FD_UNIT) ; GET DEVICE/UNIT + OR A ; SET FLAGS JR Z,FD_GEOM0 ; UNIT 0 DEC A ; NOPE, TRY UNIT 1 JR Z,FD_GEOM1 ; UNIT 1 @@ -567,7 +604,7 @@ FD_IDLE: ; FD_STATUS ; FD_STATUS: - CALL FD_SELECTUNIT + ;CALL FD_SELECTUNIT LD HL,(FDDS_TRKADR) LD A,(HL) ; A = CURRENT TRACK @@ -581,6 +618,12 @@ FD_STATUS1: OR A ; A ALREADY = $FF, JUST SET FLAGS RET ; +; +; +FD_RESET: + XOR A ; ALWAYS OK + RET +; ; FD_CLRDSKCHG ; FD_CLRDSKCHG: @@ -674,8 +717,12 @@ FD_DRIVERESET: ; ; FD_SELECTUNIT: + PUSH HL + PUSH DE + LD A,C AND 0FH ; ISOLATE THE UNIT NIBBLE + LD (FD_UNIT),A ; SAVE IT ; GOOD PLACE FOR AN INTEGRITY CHECK CP 2 @@ -691,14 +738,30 @@ FD_SELECTUNIT: LD (FDDS_TRKADR),HL ; LOAD TRKADR INC HL ; SKIP TRK LD (FDDS_MEDIAADR),HL ; LOAD MEDIAADR + + POP DE + POP HL + XOR A RET - +; +; +; +FD_SEEK: + LD (HSTSEC),DE ; RECORD HEAD/SECTOR + LD (HSTTRK),HL ; RECORD TRACK + XOR A ; SIGNAL SUCCESS + RET +; +; +; FD_READ: + LD (FD_DSKBUF),HL ; SAVE DISK BUFFER ADDRESS LD A,DOP_READ JR FD_RUN ; FD_WRITE: + LD (FD_DSKBUF),HL ; SAVE DISK BUFFER ADDRESS LD A,DOP_WRITE JR FD_RUN ; @@ -706,11 +769,12 @@ FD_RUN: LD (FCD_DOP),A ; UPDATE DRIVE SELECTION - LD A,(HSTDSK) ; GET THE NEW DRIVE SELECTION - AND 0FH + ;LD A,(HSTDSK) ; GET THE NEW DRIVE SELECTION + ;AND 0FH + LD A,(FD_UNIT) ; GET UNIT LD (FCD_DS),A ; UPDATE FCD_DS TO NEW VALUE - LD C,A - CALL FD_SELECTUNIT + ;LD C,A + ;CALL FD_SELECTUNIT ; MAP HSTTRK TO FCD_H, FCD_C LD BC,(HSTTRK) @@ -798,7 +862,7 @@ FD_RUN0: ; INITIATE SEEK TO NEW TRACK CALL FC_SEEK JR NZ,FD_RUNERR - + ; WAIT FOR SEEK TO COMPLETE CALL FD_WTSEEK JR NZ,FD_RUNERR @@ -872,44 +936,44 @@ FD_DSKY: ; ENTRY POINTS FOR FDC COMMANDS ; FC_READ: - LD A,CMD_READ | 11100000B + LD A,CFD_READ | 11100000B CALL FC_SETUPIO JP FOP FC_WRITE: - LD A,CMD_WRITE | 11000000B + LD A,CFD_WRITE | 11000000B CALL FC_SETUPIO JP FOP FC_READID: - LD A,CMD_READID | 01000000B + LD A,CFD_READID | 01000000B CALL FC_SETUPCMD JP FOP FC_RECAL: - LD A,CMD_RECAL | 00000000B + LD A,CFD_RECAL | 00000000B CALL FC_SETUPCMD JP FOP ; FIX: DO WE NEED TO REMOVE HDS BITS FROM SECOND BYTE? FC_SENSEINT: - LD A,CMD_SENSEINT | 00000000B + LD A,CFD_SENSEINT | 00000000B CALL FC_SETUPCMD LD A,1 ; GENERIC COMMAND, BUT JUST FIRST COMMAND CODE LD (FCP_LEN),A JP FOP FC_SPECIFY: - LD A,CMD_SPECIFY | 00000000B + LD A,CFD_SPECIFY | 00000000B CALL FC_SETUPSPECIFY JP FOP FC_DRVSTAT: - LD A,CMD_DRVSTAT | 00000000B + LD A,CFD_DRVSTAT | 00000000B CALL FC_SETUPCMD JP FOP FC_SEEK: - LD A,CMD_SEEK | 00000000B + LD A,CFD_SEEK | 00000000B CALL FC_SETUPSEEK JP FOP ; @@ -1229,11 +1293,11 @@ FOP_X1: LD HL,FOP_RES PUSH HL - CP CMD_READ + CP CFD_READ JP Z,FXR_READ - CP CMD_WRITE + CP CFD_WRITE JP Z,FXR_WRITE - CP CMD_READID + CP CFD_READID JP Z,FXR_NULL RET ; RET ACTUALLY JUST JUMPS RIGHT TO FOP_RES ; @@ -1318,7 +1382,7 @@ FOP_ERR: FOP_EVAL: LD A,(FCP_CMD) ; DRVSTAT IS WEIRD, HAS ONLY ST3, NOTHING TO EVAL - CP CMD_DRVSTAT + CP CFD_DRVSTAT JR Z,FOP_EXIT ; DO WE HAVE ST0? LD A,(FRB_LEN) @@ -1339,7 +1403,7 @@ FOP_EVALST0: FOP_ABTERM: ; SENSEINT DOES NOT USE ST1 LD A,(FCP_CMD) - CP CMD_SENSEINT + CP CFD_SENSEINT JR Z,FOP_ABTERM1 ; DO WE HAVE ST1? LD A,(FRB_LEN) @@ -1425,7 +1489,7 @@ FXR_NULL1: ; READ DATA ; FXR_READ: - LD HL,(DIOBUF) ; POINT TO SECTOR BUFFER START + LD HL,(FD_DSKBUF) ; POINT TO SECTOR BUFFER START LD DE,(FCD_SECSZ) ; TIMEOUT COUNTER IS CPU MHZ / 4 (MAKING SURE IT IS AT LEAST 1) ; LD A,(CPUMHZ + 3) / 4 @@ -1465,7 +1529,7 @@ FXRR5: ; OUTER LOOP, REALLY ONLY HAPPENS WHEN WAITING FOR FIRST BYTE OR ABOR ; WRITE DATA ; FXR_WRITE: - LD HL,(DIOBUF) ; POINT TO SECTOR BUFFER START + LD HL,(FD_DSKBUF) ; POINT TO SECTOR BUFFER START LD DE,(FCD_SECSZ) ; TIMEOUT COUNTER IS CPU MHZ / 4 (MAKING SURE IT IS AT LEAST 1) ; LD A,(CPUMHZ + 3) / 4 @@ -1628,7 +1692,7 @@ FC_PRTRESULTS: ; SPECIAL CASE, DON'T PRINT IF SENSEINT & INVCMD/DSK CHG/ABTERM LD A,(FCP_CMD) - CP CMD_SENSEINT + CP CFD_SENSEINT JR NZ,FCPR2 LD A,(FST_RC) @@ -1769,3 +1833,8 @@ FCD_U1MEDIA .DB FDMEDIA ; MEDIA BYTE ; FDDS_TRKADR .DW 0 ; POINTER TO FDCUXTRK ABOVE FDDS_MEDIAADR .DW 0 ; POINTER TO FDCUXMEDIA ABOVE +; +; GENERAL WORKING STORAGE +; +FD_UNIT .DB 0 +FD_DSKBUF .DW 0 \ No newline at end of file diff --git a/Source/HBIOS/hbios.asm b/Source/HBIOS/hbios.asm index e11ca7a0..4b7d7fc3 100644 --- a/Source/HBIOS/hbios.asm +++ b/Source/HBIOS/hbios.asm @@ -674,7 +674,7 @@ HB_DISPATCH: LD A,B ; REQUESTED FUNCTION IS IN B CP BF_CIO + $10 ; $00-$0F: CHARACTER I/O JP C,CIO_DISPATCH - CP BF_DIO + $10 ; $10-$1F: DISK I/O + CP BF_DIO + $10 ; $10-$1F: OLD DISK I/O JP C,DIO_DISPATCH CP BF_RTC + $10 ; $20-$2F: REAL TIME CLOCK (RTC) JP C,RTC_DISPATCH @@ -682,6 +682,8 @@ HB_DISPATCH: JP C,EMU_DISPATCH CP BF_VDA + $10 ; $40-$4F: VIDEO DISPLAY ADAPTER JP C,VDA_DISPATCH + CP BF_NDIO + $10 ; $50-$5F: NEW DISK I/O + JP C,VDA_DISPATCH CP BF_SYS ; SKIP TO BF_SYS VALUE AT $F0 CALL C,PANIC ; PANIC IF LESS THAN BF_SYS @@ -791,86 +793,135 @@ CIO_GETINF1: RET ; RETURN ; ;================================================================================================== -; DISK I/O DEVICE DISPATCHER +; OLD STYLE DISK I/O DEVICE DISPATCHER ;================================================================================================== ; ; ROUTE CALL TO SPECIFIED DISK I/O DRIVER ; B: FUNCTION ; C: DEVICE/UNIT -; H:7: INDICATES LBA MODE -; CHS MODE: DE:HL==TT:HS -; LBA MODE: HL:DE==NN:NN (32 BIT ADDRESS) ; DIO_DISPATCH: ; GET THE REQUESTED FUNCTION TO SEE IF SPECIAL HANDLING ; IS NEEDED LD A,B + CP BF_DIORD ; READ + JR Z,DIO_READ ; GO TO READ SHIM + CP BF_DIOWR ; WRITE + JR Z,DIO_WRITE ; GO TO WRITE SHIM + CP BF_DIOST ; STATUS + JR Z,DIO_STAT ; GO TO STATUS SHIM + CP BF_DIOMED ; MEDIA + JR Z,DIO_MEDIA ; GO TO MEDIA SHIM + ;CP BF_DIOID ; IDENTIFY + ;CALL Z,DIOID ; WAS NEVER REALLY SUPPORTED + CP BF_DIOGETBUF ; GET BUF + JR Z,DIO_GETBUF ; GO TO GET BUF SHIM + CP BF_DIOSETBUF ; SET BUF + JR Z,DIO_SETBUF ; GO TO SET BUF SHIM + CP BF_DIOGETCNT ; FUNCTION = DIOGETCNT? + JR Z,DIO_GETCNT ; YES, HANDLE IT + CP BF_DIOGETINF ; FUNCTION = DIOGETINF? + JR Z,DIO_GETINF ; YES, HANDLE IT + CALL PANIC ; UNSUPPORTED FUNCTION REQUEST +; +; DISK: SHIM FOR OLD STYLE READ CALL +; +DIO_READ: + LD B,BF_NDIOREAD ; OVERLAY OLD FUNCTION ID WITH NEW ONE + JR DIO_RW ; ... AND GO TO COMMON R/W ROUTINE +; +; DISK: SHIM FOR OLD STYLE WRITE CALL +; +DIO_WRITE: + LD B,BF_NDIOWRITE ; OVERLAY OLD FUNCTION ID WITH NEW ONE + JR DIO_RW ; ... AND GO TO COMMON R/W ROUTINE +; +; DISK: COMMON ROUTINE USED BY READ/WRITE SHIMS ABOVE +; NEW FUNCTION ID IS EXPECTED TO BE IN B (NDIO_READ OR NDIO_WRITE) +; THIS ROUTINE WILL TAKE THE OLD STYLE CALL AND PERFORM TWO CALLS TO +; THE NEW INTERFACE (SEEK, THEN READ OR WRITE) WHICH EFFECTIVELY +; REPLICATES THE FUNCTIONALITY OF THE OLD CALL. +; +DIO_RW: + PUSH BC ; SAVE INCOMING FUNCTION, DEVICE/UNIT + EX DE,HL ; SWAP DE/HL TO XLAT FROM OLD TO NEW CALL + LD B,BF_NDIOSEEK ; SETUP FOR NEW SEEK CALL + CALL NDIO_DISPATCH ; DO IT + POP BC ; RESTORE INCOMING FUNCTION, DEVICE/UNIT + RET NZ ; ABORT IF SEEK RETURNED AN ERROR W/ ERROR IN A + LD HL,(DIOBUF) ; GET BUFFER ADDRESS + LD DE,1 ; TRANSFER ONE SECTOR + JR NDIO_DISPATCH ; RETURN VIA DISPATCHER + ; - ; DIO FUNCTIONS STARTING AT DIOGETBUF ARE COMMON FUNCTIONS - ; AND DO NOT DISPATCH TO DRIVERS (HANDLED GLOBALLY) - CP BF_DIOGETBUF ; TEST FOR FIRST OF THE COMMON FUNCTIONS - JR NC,DIO_COMMON ; IF >= DIOGETBUF HANDLE AS COMMON DIO FUNCTION -; - ; HACK TO FILL IN HSTTRK AND HSTSEC - ; BUT ONLY FOR READ/WRITE FUNCTION CALLS - ; ULTIMATELY, HSTTRK AND HSTSEC ARE TO BE REMOVED - CP BF_DIOST ; BEYOND READ/WRITE FUNCTIONS ? - JR NC,DIO_DISPATCH1 ; YES, BYPASS - LD (HSTSEC),HL ; RECORD HEAD/SECTOR (OR LBA HIGH) - LD (HSTTRK),DE ; RECORD TRACK (OR LBA LOW) -; -; PUSH BC -; CALL NEWLINE -; PUSH DE -; POP BC -; CALL PRTHEXWORD -; CALL PC_COLON -; PUSH HL -; POP BC -; CALL PRTHEXWORD -; POP BC -; - ; HACK TO CONVERT INCOMING CHS TO LBA IFF HD ACCESS (NOT FLOPPY) - ; FIRST CHECK FOR FLOPPY DEVICE AND BYPASS IF SO - LD A,C ; GET REQUEST DEVICE/UNIT FROM C - AND $F0 ; ISOLATE THE DEVICE PORTION - CP DIODEV_FD ; FLOPPY? - JR Z,DIO_DISPATCH1 ; YES, BYPASS -; - ; NOW CHECK IF INCOMING IS ALREADY LBA AND BYPASS IF SO - BIT 7,H ; TEST HIGH BIT OF HEAD/LBA - RES 7,H ; CLEAR LBA INDICATOR BIT - JR NZ,DIO_DISPATCH1 ; IF NZ, ALREADY LBA, BYPASS +; DISK: SHIM FOR OLD STYLE STATUS CALL ; - ; WE HAVE INCOMING HARDDISK CHS, CONVERT TO LBA - ; DE=TRACK (0..N), H=HEAD (0..15), L=SECTOR (0..15) - ; XLAT DE:HL (TT:HS) --> 32 BIT LBA (LBAHI:LBALO) - LD A,H ; HEAD TO A - RLCA ; LEFT SHIFT TO HIGH NIBBLE - RLCA ; ... DEPENDS ON HIGH - RLCA ; ... NIBBLE BEING 0 SINCE - RLCA ; ... IT ROTATES INTO LOW NIBBLE - OR L ; COMBINE WITH SECTOR (HIGH NIBBLE MUST BE ZERO) - LD L,A ; THIS IS LBA LOW LSB - LD H,E ; LBA LOW MSB, E -> H - LD (HSTLBALO),HL ; SAVE FINAL LBA LOW - LD L,D ; LBA HIGH LSB, D -> L - LD H,0 ; LBA HIGH MSB, ZERO FILL - LD (HSTLBAHI),HL ; SAVE FINAL LBA HIGH -; -; PUSH BC -; CALL PC_SPACE -; LD BC,(HSTLBAHI) -; CALL PRTHEXWORD -; CALL PC_COLON -; LD BC,(HSTLBALO) -; CALL PRTHEXWORD -; POP BC -; -DIO_DISPATCH1: +DIO_STAT: + LD B,BF_NDIOSTAT + JR NDIO_DISPATCH +; +; DISK: SHIM FOR OLD STYLE MEDIA CALL +; +DIO_MEDIA: + LD B,BF_NDIOGETPAR + CALL NDIO_DISPATCH + LD A,E + OR A + RET +; +; DISK: GET BUFFER ADDRESS +; +DIO_GETBUF: + LD HL,(DIOBUF) ; HL = DISK BUFFER ADDRESS + XOR A ; SIGNALS SUCCESS + RET +; +; DISK: SET BUFFER ADDRESS +; +DIO_SETBUF: + LD A,H ; TEST HL + OR L ; ... FOR ZERO + JR NZ,DIO_SETBUF1 ; IF NOT, PROCEED TO SET BUF ADR + LD HL,HB_BUF ; IF ZERO, SET TO DEFAULT ADR +DIO_SETBUF1: + LD (DIOBUF),HL ; RECORD NEW DISK BUFFER ADDRESS + XOR A ; SIGNALS SUCCESS + RET +; +; DISK: GET DEVICE COUNT +; +DIO_GETCNT: + LD A,(HCB + HCB_DDL - 1) ; GET DEVICE COUNT (FIRST BYTE OF LIST) + LD B,A ; PUT IT IN B + XOR A ; SIGNALS SUCCESS + RET +; +; DISK: GET DEVICE INFO +; +DIO_GETINF: + LD HL,HCB + HCB_DDL - 1 ; POINT TO DEVICE MAP ENTRY COUNT (FIRST BYTE OF LIST) + LD B,(HL) ; ENTRY COUNT TO B + LD A,C ; INDEX TO A + CP B ; CHECK INDEX AGAINST MAX VALUE (INDEX - COUNT) + JR NC,DIO_GETINF1 ; IF INDEX TOO HIGH, ERR + INC HL ; BUMP TO START OF DEV MAP ENTRIES + CALL ADDHLA ; AND POINT TO REQUESTED INDEX + LD C,(HL) ; DEVICE/UNIT TO C + XOR A ; SIGNAL SUCCESS + RET ; DONE + +DIO_GETINF1: + OR $FF ; SIGNAL ERROR + RET ; RETURN +; +;================================================================================================== +; DISK I/O DEVICE DISPATCHER +;================================================================================================== +; +NDIO_DISPATCH: ; START OF THE ACTUAL DRIVER DISPATCHING LOGIC LD A,C ; GET REQUESTED DEVICE/UNIT FROM C - LD (HSTDSK),A ; TEMP HACK TO FILL IN HSTDSK + ;LD (HSTDSK),A ; TEMP HACK TO FILL IN HSTDSK AND $F0 ; ISOLATE THE DEVICE PORTION ; #IF (MDENABLE) @@ -911,64 +962,62 @@ DIO_DISPATCH1: #ENDIF CALL PANIC ; -; HANDLE COMMON DISK FUNCTIONS (NOT DEVICE DRIVER SPECIFIC) +; 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. ; -DIO_COMMON: - SUB BF_DIOGETBUF ; FUNCTION = DIOGETBUF? - JR Z,DIO_GETBUF ; YES, HANDLE IT - DEC A ; FUNCTION = DIOSETBUF? - JR Z,DIO_SETBUF ; YES, HANDLE IT - DEC A ; FUNCTION = DIOGETCNT? - JR Z,DIO_GETCNT ; YES, HANDLE IT - DEC A ; FUNCTION = DIOGETINF? - JR Z,DIO_GETINF ; YES, HANDLE IT - CALL PANIC ; INVALID FUNCTION SPECFIED +; INPUT: HL=TRACK, D=HEAD, E=SECTOR +; OUTPUT: DE:HL=32 BIT LBA ADDRESS (D:7 IS NOT SET IN THE RESULT) ; -; DISK: GET BUFFER ADDRESS -; -DIO_GETBUF: - LD HL,(DIOBUF) ; HL = DISK BUFFER ADDRESS - XOR A ; SIGNALS SUCCESS - RET +HB_CHS2LBA: ; -; DISK: SET BUFFER ADDRESS + ;; DEBUG: DUMP INCOMING TRACK:HEAD/SEC + ;CALL NEWLINE + ;PUSH BC + ;PUSH HL + ;POP BC + ;CALL PRTHEXWORD + ;CALL PC_COLON + ;PUSH DE + ;POP BC + ;CALL PRTHEXWORD + ;POP BC ; -DIO_SETBUF: - LD A,H ; TEST HL - OR L ; ... FOR ZERO - JR NZ,DIO_SETBUF1 ; IF NOT, PROCEED TO SET BUF ADR - LD HL,HB_BUF ; IF ZERO, SET TO DEFAULT ADR -DIO_SETBUF1: - LD (DIOBUF),HL ; RECORD NEW DISK BUFFER ADDRESS - XOR A ; SIGNALS SUCCESS - RET + ; WE HAVE INCOMING HARDDISK CHS, CONVERT TO LBA + ; HL=TRACK (0..N), D=HEAD (0..15), E=SECTOR (0..15) + ; XLAT HL:DE (TT:HS) --> 32 BIT LBA (LBAHI:LBALO) + ; + ; D/E -> A (COMBINE HEAD/SEC AND SAVE IN A) + ; 0 -> D + ; H -> E + ; L -> H + ; A -> L + ; + LD A,D ; HEAD TO A + RLCA ; LEFT SHIFT TO HIGH NIBBLE + RLCA ; ... DEPENDS ON HIGH + RLCA ; ... NIBBLE BEING 0 SINCE + RLCA ; ... IT ROTATES INTO LOW NIBBLE + OR E ; COMBINE WITH SECTOR (HIGH NIBBLE MUST BE ZERO) + LD D,0 + LD E,H + LD H,L + LD L,A ; -; DISK: GET DEVICE COUNT + ;; DEBUG: DUMP RESULTING LBA (32 BIT) + ;PRTS("-->$") + ;PUSH BC + ;PUSH DE + ;POP BC + ;CALL PRTHEXWORD + ;PUSH HL + ;POP BC + ;CALL PRTHEXWORD + ;POP BC ; -DIO_GETCNT: - LD A,(HCB + HCB_DDL - 1) ; GET DEVICE COUNT (FIRST BYTE OF LIST) - LD B,A ; PUT IT IN B - XOR A ; SIGNALS SUCCESS + XOR A RET ; -; DISK: GET DEVICE INFO -; -DIO_GETINF: - LD HL,HCB + HCB_DDL - 1 ; POINT TO DEVICE MAP ENTRY COUNT (FIRST BYTE OF LIST) - LD B,(HL) ; ENTRY COUNT TO B - LD A,C ; INDEX TO A - CP B ; CHECK INDEX AGAINST MAX VALUE (INDEX - COUNT) - JR NC,DIO_GETINF1 ; IF INDEX TOO HIGH, ERR - INC HL ; BUMP TO START OF DEV MAP ENTRIES - CALL ADDHLA ; AND POINT TO REQUESTED INDEX - LD C,(HL) ; DEVICE/UNIT TO C - XOR A ; SIGNAL SUCCESS - RET ; DONE - -DIO_GETINF1: - OR $FF ; SIGNAL ERROR - RET ; RETURN -; ;================================================================================================== ; REAL TIME CLOCK DEVICE DISPATCHER ;================================================================================================== @@ -1747,7 +1796,7 @@ IDLECOUNT .DB 0 ; .DW 0 ; LBA HIGH WORD ; ; DISK DEVICE/UNIT ID -HSTDSK .DB 0 ; DISK DEVICE/UNIT ID +;HSTDSK .DB 0 ; DISK DEVICE/UNIT ID ; FULL 32 BIT LBA HSTLBA .EQU $ ; REFERS TO START OF 32-BIT LBA ; LBA LOW WORD -OR- TRACK diff --git a/Source/HBIOS/hbios.inc b/Source/HBIOS/hbios.inc index cbce248b..294127d6 100644 --- a/Source/HBIOS/hbios.inc +++ b/Source/HBIOS/hbios.inc @@ -22,6 +22,17 @@ BF_DIOSETBUF .EQU BF_DIO + 9 ; DISK SET BUFFER ADR BF_DIOGETCNT .EQU BF_DIO + 10 ; DISK DEVICE COUNT BF_DIOGETINF .EQU BF_DIO + 11 ; DISK DEVICE INFO ; +BF_NDIO .EQU $50 +BF_NDIOSEEK .EQU BF_DIO + 0 ; DISK SEEK +BF_NDIOREAD .EQU BF_DIO + 1 ; DISK READ +BF_NDIOWRITE .EQU BF_DIO + 2 ; DISK WRITE +BF_NDIOSTAT .EQU BF_DIO + 3 ; DISK STATUS +BF_NDIORESET .EQU BF_DIO + 4 ; DISK RESET +BF_NDIOCAP .EQU BF_DIO + 5 ; GET DISK CAPACITY +BF_NDIOGEOM .EQU BF_DIO + 6 ; GET DISK GEOMETRY +BF_NDIOGETPAR .EQU BF_DIO + 7 ; GET DISK PARAMS +BF_NDIOSETPAR .EQU BF_DIO + 8 ; SET DISK PARAMS +; BF_RTC .EQU $20 BF_RTCGETTIM .EQU BF_RTC + 0 ; GET TIME BF_RTCSETTIM .EQU BF_RTC + 1 ; SET TIME diff --git a/Source/HBIOS/hdsk.asm b/Source/HBIOS/hdsk.asm index d0ed37b8..ba2ecacc 100644 --- a/Source/HBIOS/hdsk.asm +++ b/Source/HBIOS/hdsk.asm @@ -20,35 +20,6 @@ HDSKRC_OK .EQU 0 ; ; ; -HDSK_DISPATCH: - LD A,B ; GET REQUESTED FUNCTION - AND $0F - JR Z,HDSK_READ - DEC A - JR Z,HDSK_WRITE - DEC A - JR Z,HDSK_STATUS - DEC A - JR Z,HDSK_MEDIA - DEC A - JR Z,HDSK_CAP - DEC A - JR Z,HDSK_GEOM - CALL PANIC -; -; HDSK_MEDIA -; -HDSK_MEDIA: - LD A,C ; GET THE DEVICE/UNIT - AND $0F ; ISOLATE UNIT - CP HDSKCNT ; NUM UNITS - LD A,MID_HD ; ASSUME WE ARE OK - RET C ; RETURN - XOR A ; NO MEDIA - RET ; AND RETURN -; -; -; HDSK_INIT: PRTS("HDSK: UNITS=$") LD A,HDSKCNT @@ -62,11 +33,49 @@ HDSK_INIT: ; ; ; +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 +; + ; DISPATCH ACCORDING TO DISK SUB-FUNCTION + LD A,B ; GET REQUESTED FUNCTION + AND $0F ; ISOLATE SUB-FUNCTION + JP Z,HDSK_SEEK ; SUB-FUNC 0: SEEK, USE HBIOS FOR NOW + DEC A + JP Z,HDSK_READ ; SUB-FUNC 1: READ + DEC A + JP Z,HDSK_WRITE ; SUB-FUNC 2: WRITE + DEC A + JP Z,HDSK_STATUS ; SUB-FUNC 3: STATUS + DEC A + JP Z,HDSK_RESET ; SUB-FUNC 4: RESET + DEC A + JP Z,HDSK_CAP ; SUB-FUNC 5: GET CAPACITY + DEC A + JP Z,HDSK_GEOM ; SUB-FUNC 6: GET GEOMETRY + DEC A + JP Z,HDSK_GETPAR ; SUB-FUNC 7: GET PARAMETERS + DEC A + JP Z,HDSK_SETPAR ; SUB-FUNC 8: SET PARAMETERS + CALL PANIC ; INVALID SUB-FUNCTION +; +; +; HDSK_STATUS: LD A,(HDSK_STAT) ; LOAD STATUS OR A ; SET FLAGS RET ; +; +; +HDSK_RESET: + XOR A ; ALWAYS OK + RET +; ; GET DISK CAPACITY ; RETURN DE:HL=BLOCK COUNT, BC=BLOCK SIZE ; SLICE C/H/S = 65/16/16 OR 16,640 TOTAL SECTORS @@ -79,26 +88,56 @@ HDSK_CAP: XOR A ; SIGNAL SUCCESS RET ; +; +; HDSK_GEOM: ; FOR LBA, WE SIMULATE CHS ACCESS USING 16 HEADS AND 16 SECTORS ; RETURN HS:CC -> DE:HL, SET HIGH BIT OF D TO INDICATE LBA CAPABLE - CALL HDSK_CAP ; GET TOTAL BLOCKS IN DE:HL, BLOCK SIZE TO BC - LD L,H ; DIVIDE BY 256 FOR # TRACKS - LD H,E ; ... HIGH BYTE DISCARDED, RESULT IN HL - LD D,$80 | 16 ; HEADS / CYL = 16, SET LBA BIT - LD E,16 ; SECTORS / TRACK = 16 - XOR A ; SIGNAL SUCCESS + CALL HDSK_CAP ; GET TOTAL BLOCKS IN DE:HL, BLOCK SIZE TO BC + LD L,H ; DIVIDE BY 256 FOR # TRACKS + LD H,E ; ... HIGH BYTE DISCARDED, RESULT IN HL + LD D,$80 | 16 ; HEADS / CYL = 16, SET LBA BIT + LD E,16 ; SECTORS / TRACK = 16 + XOR A ; SIGNAL SUCCESS + RET +; +; +; +HDSK_GETPAR: + LD A,MID_HD ; HARD DISK MEDIA + LD E,A ; VALUE TO E + XOR A ; SIGNAL SUCCESS + RET +; +; +; +HDSK_SETPAR: + ; NOT IMPLEMENTED + XOR A RET ; ; ; +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 + XOR A ; SIGNAL SUCCESS + RET ; AND RETURN +; +; +; HDSK_READ: + LD (HDSK_DSKBUF),HL ; SAVE DISK BUFFER ADDRESS LD A,HDSK_CMDREAD JR HDSK_RW ; ; ; HDSK_WRITE: + LD (HDSK_DSKBUF),HL ; SAVE DISK BUFFER ADDRESS LD A,HDSK_CMDWRITE JR HDSK_RW ; @@ -114,11 +153,11 @@ HDSK_RW: ; INIT IF NEEDED LD A,(HDSK_STAT) ; GET CURRENT STATUS OR A ; SET FLAGS - CALL NZ,HDSK_RESET ; RESET IF NOT READY + CALL NZ,HDSK_DSKRESET ; RESET IF NOT READY ; SET DEVICE - LD A,(HSTDSK) - AND $0F + LD A,(HDSK_UNIT) + ;AND $0F LD (HDSK_DEVICE),A ; ; INCOMING TRK:SEC ACTUALLY REPRESENTS 32 BIT LBA @@ -142,7 +181,7 @@ HDSK_RW: LD (HDSK_SEC),A ; MAPS TO LSB OF HDSK SEC ; SET TRANSFER ADDRESS - LD BC,(DIOBUF) + LD BC,(HDSK_DSKBUF) LD (HDSK_DMA),BC ; EXECUTE COMMAND @@ -180,12 +219,12 @@ HDSK_OK: ; ; ; -HDSK_RESET: +HDSK_DSKRESET: LD B,32 LD A,HDSK_CMDRESET -HDSK_RESET1: +HDSK_DSKRESET1: OUT ($FD),A - DJNZ HDSK_RESET1 + DJNZ HDSK_DSKRESET1 XOR A ; STATUS = OK LD (HDSK_STAT),A ; SAVE IT @@ -256,7 +295,7 @@ HDSK_PRTRW: LD A,(HDSK_SEC) CALL PRTHEXBYTE CALL PC_SPACE - LD BC,(HDSK_DMA) + LD BC,(HDSK_DSKBUF) CALL PRTHEXWORD CALL PC_SPACE @@ -305,9 +344,12 @@ HDSKSTR_RCUNK .TEXT "UNKNOWN ERROR$" HDSK_STAT .DB 0 HDSK_RC .DB 0 ; +HDSK_UNIT .DB 0 +HDSK_DSKBUF .DW 0 +; HDSK_PARMBLK: HDSK_CMD .DB 0 ; COMMAND (HDSK_READ, HDSK_WRITE, ...) HDSK_DEVICE .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 \ No newline at end of file +HDSK_DMA .DW 0 ; DEFINES WHERE RESULT IS PLACED IN MEMORY diff --git a/Source/HBIOS/ide.asm b/Source/HBIOS/ide.asm index 2619eee3..545fe795 100644 --- a/Source/HBIOS/ide.asm +++ b/Source/HBIOS/ide.asm @@ -106,7 +106,7 @@ ; IDE2: SECONDARY MASTER ; IDE3: SECONDARY SLAVE ; -IDE_UNITCNT .EQU 2 ; ASSUME ONLY PRIMARY INTERFACE +IDE_UNITCNT .EQU 2 ; ASSUME ONLY PRIMARY INTERFACE ; #IF (IDEMODE == IDEMODE_MK4) IDE_IO_BASE .EQU MK4_IDE @@ -154,11 +154,11 @@ IDE_IO_DRVADR .EQU $IDE_IO_BASE + $0F ; DRIVE ADDRESS REGISTER (R) ; ; COMMAND BYTES ; -IDE_CMD_RECAL .EQU $10 -IDE_CMD_READ .EQU $20 -IDE_CMD_WRITE .EQU $30 -IDE_CMD_IDDEV .EQU $EC -IDE_CMD_SETFEAT .EQU $EF +IDE_CIDE_RECAL .EQU $10 +IDE_CIDE_READ .EQU $20 +IDE_CIDE_WRITE .EQU $30 +IDE_CIDE_IDDEV .EQU $EC +IDE_CIDE_SETFEAT .EQU $EF ; ; FEATURE BYTES ; @@ -242,9 +242,11 @@ IDE_INIT1: RET ; DONE ; IDE_INIT2: - ; DISPLAY DEVICE INFO - CALL IDE_SELUNIT ; SELECT UNIT - RET NZ ; ABORT ON ERROR +; ; DISPLAY DEVICE INFO +; CALL IDE_SELUNIT ; SELECT UNIT +; RET NZ ; ABORT ON ERROR +; + LD (IDE_UNIT),A ; SET CURRENT UNIT ; ; CHECK FOR BAD STATUS IDE_DPTR(IDE_STAT) ; GET STATUS ADR IN HL, AF TRASHED @@ -290,41 +292,56 @@ IDE_INIT2: ;============================================================================= ; IDE_DISPATCH: - LD A,C ; DEVICE/UNIT TO A - AND $0F ; REMOVE DEVICE BITS LEAVING JUST UNIT ID - CALL IDE_SELUNIT ; SELECT DESIRED UNIT - RET NZ ; ABORT ON ERROR + ; VERIFY AND SAVE THE TARGET DEVICE/UNIT LOCALLY IN DRIVER + LD A,C ; DEVICE/UNIT FROM C + AND $0F ; ISOLATE UNIT NUM + CP IDE_UNITCNT + CALL NC,PANIC ; PANIC IF TOO HIGH + LD (IDE_UNIT),A ; SAVE IT + ;CALL IDE_SELUNIT ; SELECT DESIRED UNIT +; + ; DISPATCH ACCORDING TO DISK SUB-FUNCTION LD A,B ; GET REQUESTED FUNCTION - AND $0F - JR Z,IDE_READ - DEC A - JR Z,IDE_WRITE - DEC A - JR Z,IDE_STATUS - DEC A - JR Z,IDE_MEDIA - DEC A - JR Z,IDE_CAP - DEC A - JR Z,IDE_GEOM - CALL PANIC + AND $0F ; ISOLATE SUB-FUNCTION + JP Z,IDE_SEEK ; SUB-FUNC 0: SEEK, USE HBIOS FOR NOW + DEC A + JP Z,IDE_READ ; SUB-FUNC 1: READ + DEC A + JP Z,IDE_WRITE ; SUB-FUNC 2: WRITE + DEC A + JP Z,IDE_STATUS ; SUB-FUNC 3: STATUS + DEC A + JP Z,IDE_RESET ; SUB-FUNC 4: RESET + DEC A + JP Z,IDE_CAP ; SUB-FUNC 5: GET CAPACITY + DEC A + JP Z,IDE_GEOM ; SUB-FUNC 6: GET GEOMETRY + DEC A + JP Z,IDE_GETPAR ; SUB-FUNC 7: GET PARAMETERS + DEC A + JP Z,IDE_SETPAR ; SUB-FUNC 8: SET PARAMETERS + CALL PANIC ; INVALID SUB-FUNCTION ; ; ; IDE_READ: + LD (IDE_DSKBUF),HL ; SAVE DISK BUFFER ADDRESS #IF (IDETRACE == 1) LD HL,IDE_PRTERR ; SET UP IDE_PRTERR PUSH HL ; ... TO FILTER ALL EXITS #ENDIF + CALL IDE_SELUNIT ; HARDWARE SELECTION OF TARGET UNIT JP IDE_RDSEC ; ; ; IDE_WRITE: + LD (IDE_DSKBUF),HL ; SAVE DISK BUFFER ADDRESS #IF (IDETRACE == 1) LD HL,IDE_PRTERR ; SET UP IDE_PRTERR PUSH HL ; ... TO FILTER ALL EXITS #ENDIF + CALL IDE_SELUNIT ; HARDWARE SELECTION OF TARGET UNIT JP IDE_WRSEC ; ; @@ -338,12 +355,17 @@ IDE_STATUS: ; ; IDE_MEDIA ; -IDE_MEDIA: +IDE_GETPAR: + ; THE ONLY WAY TO RESET AN IDE DEVICE IS TO RESET + ; THE ENTIRE INTERFACE. SO, TO HANDLE POSSIBLE HOT + ; SWAP WE DO THAT, THEN RESELECT THE DESIRED UNIT AND + ; CONTINUE. LD A,(IDE_UNIT) ; GET UNIT SELECTION PUSH AF ; SAVE UNIT SELECTION CALL IDE_RESET ; RESET ALL DEVICES ON BUS POP AF ; RECOVER UNIT SELECTION - CALL IDE_SELUNIT ; RESELECT DESIRED UNIT + LD (IDE_UNIT),A ; RESTORE UNIT SELECTION + ;CALL IDE_SELUNIT ; RESELECT DESIRED UNIT ; IDE_DPTR(IDE_STAT) ; POINT TO UNIT STATUS LD A,(HL) ; GET STATUS @@ -351,14 +373,31 @@ IDE_MEDIA: #IF (IDETRACE == 1) CALL IDE_PRTERR ; PRINT ANY ERRORS #ENDIF - LD A,MID_HD ; ASSUME WE ARE OK + LD E,MID_HD ; ASSUME WE ARE OK RET Z ; RETURN IF GOOD INIT - LD A,MID_NONE ; SIGNAL NO MEDA - OR A ; SET FLAGS + LD E,MID_NONE ; SIGNAL NO MEDA RET ; AND RETURN ; ; ; +IDE_SETPAR: + ; NOT IMPLEMENTED + XOR A + RET +; +; +; +IDE_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 + XOR A ; SIGNAL SUCCESS + RET ; AND RETURN +; +; +; IDE_CAP: IDE_DPTR(IDE_CAPACITY) ; POINT HL TO CAPACITY OF CUR UNIT CALL LD32 ; GET THE CURRENT CAPACITY DO DE:HL @@ -397,7 +436,7 @@ IDE_SETFEAT: OUT (IDE_IO_FEAT),A ; SET THE FEATURE VALUE DCALL PC_SPACE DCALL PRTHEXBYTE - LD A,IDE_CMD_SETFEAT ; CMD = SETFEAT + LD A,IDE_CIDE_SETFEAT ; CMD = SETFEAT LD (IDE_CMD),A ; SAVE IT JP IDE_RUNCMD ; RUN COMMAND AND EXIT ; @@ -412,7 +451,7 @@ IDE_IDENTIFY: OUT (IDE_IO_DRVHD),A DCALL PC_SPACE DCALL PRTHEXBYTE - LD A,IDE_CMD_IDDEV + LD A,IDE_CIDE_IDDEV LD (IDE_CMD),A CALL IDE_RUNCMD RET NZ @@ -434,11 +473,11 @@ IDE_RDSEC: DCALL PC_SPACE DCALL PRTHEXBYTE CALL IDE_SETADDR ; SETUP CYL, TRK, HEAD - LD A,IDE_CMD_READ + LD A,IDE_CIDE_READ LD (IDE_CMD),A CALL IDE_RUNCMD RET NZ - LD HL,(DIOBUF) + LD HL,(IDE_DSKBUF) JP IDE_GETBUF ; ; @@ -456,11 +495,11 @@ IDE_WRSEC: DCALL PC_SPACE DCALL PRTHEXBYTE CALL IDE_SETADDR ; SETUP CYL, TRK, HEAD - LD A,IDE_CMD_WRITE + LD A,IDE_CIDE_WRITE LD (IDE_CMD),A CALL IDE_RUNCMD RET NZ - LD HL,(DIOBUF) + LD HL,(IDE_DSKBUF) JP IDE_PUTBUF ; ; @@ -535,7 +574,7 @@ IDE_GETBUF: CALL IDE_WAITDRQ ; WAIT FOR BUFFER READY RET NZ ; BAIL OUT IF TIMEOUT - ;LD HL,(DIOBUF) + ;LD HL,(IDE_DSKBUF) LD B,0 #IF (IDE8BIT | (IDEMODE == IDEMODE_DIDE)) @@ -574,7 +613,7 @@ IDE_PUTBUF: CALL IDE_WAITDRQ ; WAIT FOR BUFFER READY RET NZ ; BAIL OUT IF TIMEOUT ; - ;LD HL,(DIOBUF) + ;LD HL,(IDE_DSKBUF) LD B,0 #IF (IDE8BIT | (IDEMODE == IDEMODE_DIDE)) @@ -646,6 +685,9 @@ IDE_RESET: XOR A CALL FILL ; + LD A,(IDE_UNIT) ; GET THE CURRENT UNIT SELECTION + PUSH AF ; AND SAVE IT + ; PROBE / INITIALIZE ALL UNITS LD B,IDE_UNITCNT ; NUMBER OF UNITS TO TRY LD C,0 ; UNIT INDEX FOR LOOP @@ -656,6 +698,9 @@ IDE_RESET1: POP BC INC C ; NEXT UNIT DJNZ IDE_RESET1 ; LOOP AS NEEDED +; + POP AF ; RECOVER ORIGINAL UNIT NUMBER + CALL IDE_SELUNIT ; ... AND SELECT IT ; XOR A ; SIGNAL SUCCESS RET ; AND DONE @@ -663,12 +708,20 @@ IDE_RESET1: ; ; IDE_INITUNIT: + LD (IDE_UNIT),A ; SET ACTIVE UNIT + CALL IDE_SELUNIT ; SELECT UNIT RET NZ ; ABORT IF ERROR - + CALL IDE_PROBE ; DO PROBE RET NZ ; ABORT IF ERROR - + + OR $FF + OUT (IDE_IO_COUNT),A ; ZERO KEY REGISTERS IN TESTED DEVICE + OUT (IDE_IO_SECT),A ; ZERO KEY REGISTERS IN TESTED DEVICE + + ;RET + JP IDE_INITDEV ; INIT DEVICE AND RETURN ; ; TAKE ANY ACTIONS REQUIRED TO SELECT DESIRED PHYSICAL UNIT @@ -682,17 +735,20 @@ IDE_SELUNIT: CP IDE_UNITCNT ; CHECK VALIDITY (EXCEED UNIT COUNT?) JP NC,IDE_INVUNIT ; HANDLE INVALID UNIT ; - ; NEW UNIT SELECTED, IMPLEMENT IT - LD (IDE_UNIT),A ; RECORD NEW UNIT NUMBER +; ; NEW UNIT SELECTED, IMPLEMENT IT +; LD (IDE_UNIT),A ; RECORD NEW UNIT NUMBER +; ; #IF (IDEMODE == IDEMODE_DIDE) ; SELECT PRIMARY/SECONDARY INTERFACE FOR DIDE HARDWARE #ENDIF ; + PUSH HL ; SAVE HL AND $01 ; LS BIT DETERMINES MASTER/SLAVE LD HL,IDE_DRVSEL CALL ADDHLA LD A,(HL) ; LOAD DRIVE/HEAD VALUE + POP HL ; RECOVER HL ; OUT (IDE_IO_DRVHD),A ; SELECT DRIVE LD (IDE_DRVHD),A ; UPDATE SHADOW REGISTER @@ -1060,6 +1116,7 @@ IDE_CMD .DB 0 ; PENDING COMMAND TO PROCESS IDE_DRVHD .DB 0 ; CURRENT DRIVE/HEAD MASK ; IDE_UNIT .DB 0 ; ACTIVE UNIT, DEFAULT TO ZERO +IDE_DSKBUF .DW 0 ; ACTIVE DISK BUFFER ; ; UNIT SPECIFIC DATA STORAGE ; diff --git a/Source/HBIOS/md.asm b/Source/HBIOS/md.asm index ffa43899..8f99d34a 100644 --- a/Source/HBIOS/md.asm +++ b/Source/HBIOS/md.asm @@ -3,6 +3,8 @@ ; MD DISK DRIVER (MEMORY DISK) ;================================================================================================== ; +MD_UNITCNT .EQU 2 +; ; ; MD_INIT: @@ -20,34 +22,44 @@ MD_INIT: ; ; MD_DISPATCH: + ; VERIFY AND SAVE THE TARGET DEVICE/UNIT LOCALLY IN DRIVER + LD A,C ; DEVICE/UNIT FROM C + AND $0F ; ISOLATE UNIT NUM + CP MD_UNITCNT + CALL NC,PANIC ; PANIC IF TOO HIGH + LD (MD_UNIT),A ; SAVE IT +; + ; DISPATCH ACCORDING TO DISK SUB-FUNCTION LD A,B ; GET REQUESTED FUNCTION - AND $0F - JP Z,MD_READ + AND $0F ; ISOLATE SUB-FUNCTION + JP Z,MD_SEEK ; SUB-FUNC 0: SEEK, USE HBIOS FOR NOW + DEC A + JP Z,MD_READ ; SUB-FUNC 1: READ + DEC A + JP Z,MD_WRITE ; SUB-FUNC 2: WRITE + DEC A + JP Z,MD_STATUS ; SUB-FUNC 3: STATUS DEC A - JP Z,MD_WRITE + JP Z,MD_RESET ; SUB-FUNC 4: RESET DEC A - JP Z,MD_STATUS + JP Z,MD_CAP ; SUB-FUNC 5: GET CAPACITY DEC A - JP Z,MD_MEDIA + JP Z,MD_GEOM ; SUB-FUNC 6: GET GEOMETRY DEC A - JP Z,MD_CAP + JP Z,MD_GETPAR ; SUB-FUNC 7: GET PARAMETERS DEC A - JP Z,MD_GEOM - CALL PANIC + JP Z,MD_SETPAR ; SUB-FUNC 8: SET PARAMETERS + CALL PANIC ; INVALID SUB-FUNCTION ; ; ; -MD_MEDIA: - LD A,C ; DEVICE/UNIT IS IN C - AND $0F ; ISOLATE UNIT NUM - CP 2 ; CHECK FOR MAX UNIT EXCEEDED - CALL NC,PANIC ; PANIC IF TOO HIGH - ADD A,MID_MDROM ; SET CORRECT MEDIA VALUE +MD_STATUS: + XOR A ; ALWAYS OK RET ; ; ; -MD_STATUS: +MD_RESET: XOR A ; ALWAYS OK RET ; @@ -92,7 +104,35 @@ MD_GEOM1: ; ; ; +MD_GETPAR: + LD A,C ; DEVICE/UNIT IS IN C + ADD A,MID_MDROM ; SET CORRECT MEDIA VALUE + LD E,A ; VALUE TO E + XOR A ; SIGNAL SUCCESS + RET +; +; +; +MD_SETPAR: + ; NOT IMPLEMENTED + XOR A + RET +; +; +; +MD_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 + XOR A ; SIGNAL SUCCESS + RET ; AND RETURN +; +; +; MD_READ: + LD (MD_DSKBUF),HL ; SAVE DISK BUFFER ADDRESS CALL MD_IOSETUP ; SETUP FOR MEMORY COPY #IF (MDTRACE >= 2) LD (MD_SRC),HL @@ -118,6 +158,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 @@ -186,7 +227,7 @@ MD_IOSETUP: RL H ; FULL WORD LD C,H ; BANK NUMBER FROM H TO C ; GET BANK NUM TO A AND SET FLAG Z=ROM, NZ=RAM - LD A,(HSTDSK) ; DEVICE/UNIT TO A + LD A,(MD_UNIT) ; DEVICE/UNIT TO A AND $01 ; ISOLATE LOW BIT, SET ZF LD A,C ; BANK VALUE INTO A PUSH AF ; SAVE IT FOR NOW @@ -195,7 +236,7 @@ MD_IOSETUP: LD H,L ; MOVE MSB TO H WHERE IT BELONGS LD L,0 ; AND ZERO L SO HL IS NOW BYTE OFFSET ; LOAD DESTINATION AND COUNT - LD DE,(DIOBUF) ; DMA ADDRESS IS DESTINATION + LD DE,(MD_DSKBUF) ; DMA ADDRESS IS DESTINATION LD BC,512 ; ALWAYS COPY ONE SECTOR ; FINISH UP POP AF ; GET BANK AND FLAGS BACK @@ -255,6 +296,9 @@ MD_PRT: ; ; ; +MD_UNIT .DB 0 +MD_DSKBUF .DW 0 +; MD_SRCBNK .DB 0 MD_DSTBNK .DB 0 MD_SRC .DW 0 diff --git a/Source/HBIOS/ppide.asm b/Source/HBIOS/ppide.asm index 83c1f0f9..07d9bb45 100644 --- a/Source/HBIOS/ppide.asm +++ b/Source/HBIOS/ppide.asm @@ -152,7 +152,7 @@ PPIDE_REG_DRVADR .EQU PPIDE_CTL_CS3FX | $07 ; DRIVE ADDRESS REGISTER (R) ; PPIDE2: SECONDARY MASTER ; PPIDE3: SECONDARY SLAVE ; -PPIDE_UNITCNT .EQU 2 ; ASSUME ONLY PRIMARY INTERFACE +PPIDE_UNITCNT .EQU 2 ; ASSUME ONLY PRIMARY INTERFACE ; ; COMMAND BYTES ; @@ -233,9 +233,11 @@ PPIDE_INIT1: RET ; DONE ; PPIDE_INIT2: - ; DISPLAY DEVICE INFO - CALL PPIDE_SELUNIT ; SELECT UNIT - RET NZ ; ABORT ON ERROR +; ; DISPLAY DEVICE INFO +; CALL PPIDE_SELUNIT ; SELECT UNIT +; RET NZ ; ABORT ON ERROR +; + LD (PPIDE_UNIT),A ; SET CURRENT UNIT ; ; CHECK FOR BAD STATUS PPIDE_DPTR(PPIDE_STAT) ; GET STATUS ADR IN HL, AF TRASHED @@ -281,28 +283,40 @@ PPIDE_INIT2: ;============================================================================= ; PPIDE_DISPATCH: - LD A,C ; DEVICE/UNIT TO A - AND $0F ; REMOVE DEVICE BITS LEAVING JUST UNIT ID - CALL PPIDE_SELUNIT ; SELECT DESIRED UNIT - RET NZ ; ABORT ON ERROR + ; VERIFY AND SAVE THE TARGET DEVICE/UNIT LOCALLY IN DRIVER + LD A,C ; DEVICE/UNIT FROM C + AND $0F ; ISOLATE UNIT NUM + CP PPIDE_UNITCNT + CALL NC,PANIC ; PANIC IF TOO HIGH + LD (PPIDE_UNIT),A ; SAVE IT + ;CALL PPIDE_SELUNIT ; SELECT DESIRED UNIT +; + ; DISPATCH ACCORDING TO DISK SUB-FUNCTION LD A,B ; GET REQUESTED FUNCTION - AND $0F - JR Z,PPIDE_READ - DEC A - JR Z,PPIDE_WRITE - DEC A - JR Z,PPIDE_STATUS - DEC A - JR Z,PPIDE_MEDIA - DEC A - JR Z,PPIDE_CAP - DEC A - JR Z,PPIDE_GEOM - CALL PANIC + AND $0F ; ISOLATE SUB-FUNCTION + JP Z,PPIDE_SEEK ; SUB-FUNC 0: SEEK, USE HBIOS FOR NOW + DEC A + JP Z,PPIDE_READ ; SUB-FUNC 1: READ + DEC A + JP Z,PPIDE_WRITE ; SUB-FUNC 2: WRITE + DEC A + JP Z,PPIDE_STATUS ; SUB-FUNC 3: STATUS + DEC A + JP Z,PPIDE_RESET ; SUB-FUNC 4: RESET + DEC A + JP Z,PPIDE_CAP ; SUB-FUNC 5: GET CAPACITY + DEC A + JP Z,PPIDE_GEOM ; SUB-FUNC 6: GET GEOMETRY + DEC A + JP Z,PPIDE_GETPAR ; SUB-FUNC 7: GET PARAMETERS + DEC A + JP Z,PPIDE_SETPAR ; SUB-FUNC 8: SET PARAMETERS + CALL PANIC ; INVALID SUB-FUNCTION ; ; ; PPIDE_READ: + LD (PPIDE_DSKBUF),HL ; SAVE DISK BUFFER ADDRESS #IF (PPIDETRACE == 1) LD HL,PPIDE_PRTERR ; SET UP PPIDE_PRTERR PUSH HL ; ... TO FILTER ALL EXITS @@ -312,6 +326,7 @@ PPIDE_READ: ; ; PPIDE_WRITE: + LD (PPIDE_DSKBUF),HL ; SAVE DISK BUFFER ADDRESS #IF (PPIDETRACE == 1) LD HL,PPIDE_PRTERR ; SET UP PPIDE_PRTERR PUSH HL ; ... TO FILTER ALL EXITS @@ -329,7 +344,7 @@ PPIDE_STATUS: ; ; PPIDE_MEDIA ; -PPIDE_MEDIA: +PPIDE_GETPAR: ; THE ONLY WAY TO RESET AN IDE DEVICE IS TO RESET ; THE ENTIRE INTERFACE. SO, TO HANDLE POSSIBLE HOT ; SWAP WE DO THAT, THEN RESELECT THE DESIRED UNIT AND @@ -338,7 +353,8 @@ PPIDE_MEDIA: PUSH AF ; SAVE UNIT SELECTION CALL PPIDE_RESET ; RESET ALL DEVICES ON BUS POP AF ; RECOVER UNIT SELECTION - CALL PPIDE_SELUNIT ; RESELECT DESIRED UNIT + LD (PPIDE_UNIT),A ; RESTORE UNIT SELECTION + ;CALL PPIDE_SELUNIT ; RESELECT DESIRED UNIT ; PPIDE_DPTR(PPIDE_STAT) ; POINT TO UNIT STATUS LD A,(HL) ; GET STATUS @@ -346,14 +362,31 @@ PPIDE_MEDIA: #IF (PPIDETRACE == 1) CALL PPIDE_PRTERR ; PRINT ANY ERRORS #ENDIF - LD A,MID_HD ; ASSUME WE ARE OK + LD E,MID_HD ; ASSUME WE ARE OK RET Z ; RETURN IF GOOD INIT - LD A,MID_NONE ; SIGNAL NO MEDA - OR A ; SET FLAGS + LD E,MID_NONE ; SIGNAL NO MEDA RET ; AND RETURN ; ; ; +PPIDE_SETPAR: + ; NOT IMPLEMENTED + XOR A + RET +; +; +; +PPIDE_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 + XOR A ; SIGNAL SUCCESS + RET ; AND RETURN +; +; +; PPIDE_CAP: PPIDE_DPTR(PPIDE_CAPACITY) ; POINT HL TO CAPACITY OF CUR UNIT CALL LD32 ; GET THE CURRENT CAPACITY DO DE:HL @@ -443,7 +476,7 @@ PPIDE_RDSEC: LD (PPIDE_CMD),A CALL PPIDE_RUNCMD RET NZ - LD HL,(DIOBUF) + LD HL,(PPIDE_DSKBUF) JP PPIDE_GETBUF ; ; @@ -465,7 +498,7 @@ PPIDE_WRSEC: LD (PPIDE_CMD),A CALL PPIDE_RUNCMD RET NZ - LD HL,(DIOBUF) + LD HL,(PPIDE_DSKBUF) JP PPIDE_PUTBUF ; ; @@ -549,7 +582,7 @@ PPIDE_GETBUF: LD D,A ; D := READ ASSERTED ; ; LOOP SETUP - ;LD HL,(DIOBUF) ; LOCATION OF BUFFER + ;LD HL,(PPIDE_DSKBUF) ; LOCATION OF BUFFER LD B,0 ; 256 ITERATIONS LD C,PPIDE_IO_DATALO ; SETUP C WITH IO PORT (LSB) ; @@ -608,7 +641,7 @@ PPIDE_PUTBUF: LD D,A ; D := WRITE ASSERTED ; ; LOOP SETUP - ;LD HL,(DIOBUF) ; LOCATION OF BUFFER + ;LD HL,(PPIDE_DSKBUF) ; LOCATION OF BUFFER LD B,0 ; 256 ITERATIONS LD C,PPIDE_IO_DATALO ; SETUP C WITH IO PORT (LSB) ; @@ -700,6 +733,9 @@ PPIDE_RESET: LD BC,PPIDE_UDLEN XOR A CALL FILL +; + LD A,(PPIDE_UNIT) ; GET THE CURRENT UNIT SELECTION + PUSH AF ; AND SAVE IT ; ; PROBE / INITIALIZE ALL UNITS LD B,PPIDE_UNITCNT ; NUMBER OF UNITS TO TRY @@ -711,6 +747,9 @@ PPIDE_RESET1: POP BC INC C ; NEXT UNIT DJNZ PPIDE_RESET1 ; LOOP AS NEEDED +; + POP AF ; RECOVER ORIGINAL UNIT NUMBER + CALL PPIDE_SELUNIT ; ... AND RESELECT IT ; XOR A ; SIGNAL SUCCESS RET ; AND DONE @@ -718,12 +757,22 @@ PPIDE_RESET1: ; ; PPIDE_INITUNIT: + LD (PPIDE_UNIT),A ; SET ACTIVE UNIT + CALL PPIDE_SELUNIT ; SELECT UNIT RET NZ ; ABORT IF ERROR - + CALL PPIDE_PROBE ; DO PROBE RET NZ ; ABORT IF ERROR - + + OR $FF + CALL PPIDE_OUT + .DB PPIDE_REG_COUNT + CALL PPIDE_OUT + .DB PPIDE_REG_SECT + + ;RET + JP PPIDE_INITDEV ; INIT DEVICE AND RETURN ; ; TAKE ANY ACTIONS REQUIRED TO SELECT DESIRED PHYSICAL UNIT @@ -738,7 +787,9 @@ PPIDE_SELUNIT: JP NC,PPIDE_INVUNIT ; HANDLE INVALID UNIT ; ; NEW UNIT SELECTED, IMPLEMENT IT - LD (PPIDE_UNIT),A ; RECORD NEW UNIT NUMBER + ;LD (PPIDE_UNIT),A ; RECORD NEW UNIT NUMBER +; + PUSH HL ; SAVE HL, IT IS DESTROYED BELOW ; AND $01 ; LS BIT DETERMINES MASTER/SLAVE LD HL,PPIDE_DRVSEL @@ -752,6 +803,7 @@ PPIDE_SELUNIT: ; ; SPEC REQUIRES 400NS DELAY BEFORE CHECKING STATUS REGISTER ; + POP HL ; RECOVER HL XOR A RET ; @@ -1180,6 +1232,7 @@ PPIDE_CMD .DB 0 ; PENDING COMMAND TO PROCESS PPIDE_DRVHD .DB 0 ; CURRENT DRIVE/HEAD MASK ; PPIDE_UNIT .DB 0 ; ACTIVE UNIT, DEFAULT TO ZERO +PPIDE_DSKBUF .DW 0 ; ACTIVE DISK BUFFER ; ; UNIT SPECIFIC DATA STORAGE ; diff --git a/Source/HBIOS/ppp.asm b/Source/HBIOS/ppp.asm index d0ede301..7d8fa521 100644 --- a/Source/HBIOS/ppp.asm +++ b/Source/HBIOS/ppp.asm @@ -121,11 +121,18 @@ PPP_INITPPP: ; ; PPP_DETECT: - LD BC,4000 ; TRY FOR ABOUT 4 SECONDS + LD BC,6000 ; TRY FOR ABOUT 6 SECONDS PPP_DETECT1: LD DE,64 ; 1 MS CALL VDELAY + + IN A,(PPP_CTL) + BIT 5,A + JR Z,PPP_DETECT1 + IN A,(PPP_IO) + ;CALL PC_SPACE + ;CALL PRTHEXBYTE CP $AA RET Z ; RETURN IF MATCH DEC BC @@ -198,9 +205,10 @@ PPP_SNDCMD1: ; PPP_PUTBYTE: PUSH AF +PPP_PUTBYTE1: IN A,(PPP_CTL) BIT 7,A - JR Z,PPP_PUTBYTE + JR Z,PPP_PUTBYTE1 POP AF OUT (PPP_IO),A RET @@ -262,6 +270,7 @@ PPPCON_IN: LD D,PPP_CMDKBDRD ; CMD = KEYBOARD READ CALL PPP_SNDCMD ; SEND COMMAND CALL PPP_GETBYTE ; GET CHARACTER READ + LD E,A ; PUT IN E XOR A ; CLEAR A (SUCCESS) RET ; AND RETURN ; @@ -284,7 +293,7 @@ PPPCON_OUT: JR Z,PPPCON_OUT ; WAIT IF NECESSARY LD D,PPP_CMDVIDOUT ; CMD = VIDEO OUTPUT CALL PPP_SNDCMD ; SEND COMMAND - LD A,E + LD A,E ; MOVE TO A CALL PPP_PUTBYTE ; SEND IT RET ; RETURN ; @@ -330,7 +339,9 @@ PPPSD_STWRTPROT .EQU -10 ; ATTEMPT TO WRITE TO WRITE PROTECTED MEDIA PPPSD_INIT: ; REINITIALIZE THE CARD HERE CALL PPPSD_INITCARD - RET NZ +#IF (PPPSDTRACE < 2) + JP NZ,PPPSD_PRTSTAT ; IF ERROR, SHOW IT +#ENDIF ; CALL NEWLINE PRTS("PPPSD:$") @@ -358,28 +369,40 @@ PPPSD_INIT: ; ; PPPSD_DISPATCH: - LD A,C ; DEVICE/UNIT TO A - AND $0F ; REMOVE DEVICE BITS LEAVING JUST UNIT ID - CALL PPPSD_SELUNIT ; SELECT DESIRED UNIT - RET NZ ; ABORT ON ERROR - LD A,B ; GET REQUESTED FUNCTION - AND $0F - JP Z,PPPSD_READ ; READ - DEC A - JP Z,PPPSD_WRITE ; WRITE - DEC A - JP Z,PPPSD_STATUS ; STATUS - DEC A - JP Z,PPPSD_MEDIA ; MEDIA ID + ; VERIFY AND SAVE THE TARGET DEVICE/UNIT LOCALLY IN DRIVER + LD A,C ; DEVICE/UNIT FROM C + AND $0F ; ISOLATE UNIT NUM + CP PPPSD_UNITCNT + CALL NC,PANIC ; PANIC IF TOO HIGH + LD (PPPSD_UNIT),A ; SAVE IT +; + ; DISPATCH ACCORDING TO DISK SUB-FUNCTION + LD A,B ; GET REQUESTED FUNCTION + AND $0F ; ISOLATE SUB-FUNCTION + JP Z,PPPSD_SEEK ; SUB-FUNC 0: SEEK, USE HBIOS FOR NOW + DEC A + JP Z,PPPSD_READ ; SUB-FUNC 1: READ + DEC A + JP Z,PPPSD_WRITE ; SUB-FUNC 2: WRITE + DEC A + JP Z,PPPSD_STATUS ; SUB-FUNC 3: STATUS + DEC A + JP Z,PPPSD_RESET ; SUB-FUNC 4: RESET + DEC A + JP Z,PPPSD_CAP ; SUB-FUNC 5: GET CAPACITY DEC A - JP Z,PPPSD_CAP + JP Z,PPPSD_GEOM ; SUB-FUNC 6: GET GEOMETRY DEC A - JP Z,PPPSD_GEOM - CALL PANIC + JP Z,PPPSD_GETPAR ; SUB-FUNC 7: GET PARAMETERS + DEC A + JP Z,PPPSD_SETPAR ; SUB-FUNC 8: SET PARAMETERS + CALL PANIC ; INVALID SUB-FUNCTION ; ; READ AN LBA BLOCK FROM THE SD CARD ; PPPSD_READ: + 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 @@ -401,17 +424,15 @@ PPPSD_READ: CALL PPP_SNDCMD ; SEND COMMAND RET NZ - LD DE,$FFFF - LD HL,$FFFF - LD BC,HSTLBA - CALL ST32 - CALL PPPSD_SENDBLK ; SEND THE LBA BLOCK NUMBER CALL PPP_GETBYTE ; GET READ RESULT + LD (PPPSD_DSKSTAT),A ; SAVE IT + #IF (PPPSDTRACE >= 3) CALL PC_SPACE CALL PRTHEXBYTE #ENDIF + OR A ; SET FLAGS JR Z,PPPSD_READ1 @@ -427,7 +448,7 @@ PPPSD_READ1: ; READ THE SECTOR DATA LD BC,512 - LD HL,(DIOBUF) + LD HL,(PPPSD_DSKBUF) PPPSD_READ2: CALL PPP_GETBYTE LD (HL),A @@ -443,6 +464,8 @@ PPPSD_READ2: ; 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 @@ -466,7 +489,7 @@ PPPSD_WRITE: ; SEND OVER THE SECTOR CONTENTS LD BC,512 - LD HL,(DIOBUF) + LD HL,(PPPSD_DSKBUF) PPPSD_WRITE1: LD A,(HL) INC HL @@ -482,10 +505,13 @@ PPPSD_WRITE1: RET NZ CALL PPPSD_SENDBLK ; SEND THE LBA BLOCK NUMBER CALL PPP_GETBYTE + LD (PPPSD_DSKSTAT),A ; SAVE IT + #IF (PPPSDTRACE >= 3) CALL PC_SPACE CALL PRTHEXBYTE #ENDIF + OR A ; SET FLAGS RET Z ; DONE IF NO ERRORS @@ -500,23 +526,46 @@ PPPSD_STATUS: OR A RET ; +; +; +PPPSD_RESET: + XOR A ; ALWAYS OK + RET +; ; SETUP FOR SUBSEQUENT ACCESS ; INIT CARD IF NOT READY OR ON DRIVE LOG IN ; -PPPSD_MEDIA: +PPPSD_GETPAR: ; REINITIALIZE THE CARD HERE TO DETERMINE PRESENCE CALL PPPSD_INITCARD #IF (PPPSDTRACE == 1) CALL PPPSD_PRTERR ; PRINT ANY ERRORS #ENDIF - LD A,MID_HD ; ASSUME SUCCESS, SETUP MEDIA ID + LD E,MID_HD ; ASSUME WE ARE OK RET Z ; RETURN IF GOOD INIT - LD A,MID_NONE ; SIGNAL NO MEDA - OR A ; SET FLAGS + LD E,MID_NONE ; SIGNAL NO MEDA RET ; AND RETURN ; ; ; +PPPSD_SETPAR: + ; NOT IMPLEMENTED + XOR A + RET +; +; +; +PPPSD_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 + XOR A ; SIGNAL SUCCESS + RET ; AND RETURN +; +; +; PPPSD_CAP: LD HL,PPPSD_BLKCNT ; GET BLOCK COUNT CALL LD32 ; GET THE CURRENT CAPACITY DO DE:HL @@ -541,8 +590,6 @@ PPPSD_GEOM: ; UNIT IS SPECIFIED IN A ; PPPSD_SELUNIT: - CP PPPSD_UNITCNT ; CHECK VALIDITY (EXCEED UNIT COUNT?) - JP NC,PPPSD_INVUNIT ; HANDLE INVALID UNIT XOR A ; SIGNAL SUCCESS RET ; DONE ; @@ -554,15 +601,32 @@ PPPSD_INITCARD: LD BC,PPPSD_UNITDATALEN XOR A CALL FILL -; + +#IF (PPPSDTRACE >= 3) + CALL PPPSD_PRTPREFIX + PRTS(" RESET$") +#ENDIF + ; RESET & STATUS DISK LD D,PPP_CMDDSKRES ; COMMAND = DSKRESET CALL PPP_SNDCMD RET NZ - CALL PPP_GETBYTE - LD (PPPSD_STAT),A ; SAVE UPDATED STATUS + CALL PPP_GETBYTE ; GET STATUS + LD (PPPSD_DSKSTAT),A ; SAVE STATUS + +#IF (PPPSDTRACE >= 3) + CALL PC_SPACE + CALL PRTHEXBYTE +#ENDIF + OR A - RET NZ ; BAIL OUT ON ERROR + JR Z,PPPSD_INITCARD1 + + ; HANDLE ERROR + CALL PPPSD_GETDSKSTAT ; GET FULL ERROR CODE + JP PPPSD_ERRCMD ; HANDLE ERRORS + +PPPSD_INITCARD1: #IF (PPPSDTRACE >= 3) ; GET CSD IF DEBUGGING @@ -720,6 +784,10 @@ PPPSD_SENDBLK: LD B,4 PPPSD_SENDBLK1: LD A,(HL) + + ;CALL PC_SPACE + ;CALL PRTHEXBYTE + INC HL CALL PPP_PUTBYTE DJNZ PPPSD_SENDBLK1 @@ -913,6 +981,9 @@ PPPSD_STR_TYPESDXC .TEXT "SDXC$" ; DATA STORAGE ;============================================================================= ; +PPPSD_UNIT .DB 0 +PPPSD_DSKBUF .DW 0 +; PPPSD_UNITDATA: PPPSD_STAT .DB 0 PPPSD_DSKSTAT .DB 0 diff --git a/Source/HBIOS/prp.asm b/Source/HBIOS/prp.asm index c4fc208f..812dd6d1 100644 --- a/Source/HBIOS/prp.asm +++ b/Source/HBIOS/prp.asm @@ -226,8 +226,8 @@ PRPSD_STINVUNIT .EQU -1 ; INVALID UNIT PRPSD_STRDYTO .EQU -2 ; TIMEOUT WAITING FOR CARD TO BE READY PRPSD_STINITTO .EQU -3 ; INITIALIZATOIN TIMEOUT PRPSD_STCMDTO .EQU -4 ; TIMEOUT WAITING FOR COMMAND RESPONSE -PRPSD_STCMDERR .EQU -5 ; COMMAND ERROR OCCURRED (REF SD_RC) -PRPSD_STDATAERR .EQU -6 ; DATA ERROR OCCURRED (REF SD_TOK) +PRPSD_STCMDERR .EQU -5 ; COMMAND ERROR OCCURRED (REF PRPSD_RC) +PRPSD_STDATAERR .EQU -6 ; DATA ERROR OCCURRED (REF PRPSD_TOK) PRPSD_STDATATO .EQU -7 ; DATA TRANSFER TIMEOUT PRPSD_STCRCERR .EQU -8 ; CRC ERROR ON RECEIVED DATA PACKET PRPSD_STNOMEDIA .EQU -9 ; NO MEDIA IN CONNECTOR @@ -238,7 +238,9 @@ PRPSD_STWRTPROT .EQU -10 ; ATTEMPT TO WRITE TO WRITE PROTECTED MEDIA PRPSD_INIT: ; REINITIALIZE THE CARD HERE CALL PRPSD_INITCARD - RET NZ +#IF (PRPSDTRACE < 2) + JP NZ,PRPSD_PRTSTAT ; IF ERROR, SHOW IT +#ENDIF ; CALL PRPSD_PRTPREFIX ; @@ -265,28 +267,40 @@ PRPSD_INIT: ; ; PRPSD_DISPATCH: - LD A,C ; DEVICE/UNIT TO A - AND $0F ; REMOVE DEVICE BITS LEAVING JUST UNIT ID - CALL PRPSD_SELUNIT ; SELECT DESIRED UNIT - RET NZ ; ABORT ON ERROR - LD A,B ; GET REQUESTED FUNCTION - AND $0F ; ISOLATE SUB-FUNCTION BITS - JP Z,PRPSD_READ + ; VERIFY AND SAVE THE TARGET DEVICE/UNIT LOCALLY IN DRIVER + LD A,C ; DEVICE/UNIT FROM C + AND $0F ; ISOLATE UNIT NUM + CP PRPSD_UNITCNT + CALL NC,PANIC ; PANIC IF TOO HIGH + LD (PRPSD_UNIT),A ; SAVE IT +; + ; DISPATCH ACCORDING TO DISK SUB-FUNCTION + LD A,B ; GET REQUESTED FUNCTION + AND $0F ; ISOLATE SUB-FUNCTION + JP Z,PRPSD_SEEK ; SUB-FUNC 0: SEEK, USE HBIOS FOR NOW DEC A - JP Z,PRPSD_WRITE + JP Z,PRPSD_READ ; SUB-FUNC 1: READ DEC A - JP Z,PRPSD_STATUS + JP Z,PRPSD_WRITE ; SUB-FUNC 2: WRITE DEC A - JP Z,PRPSD_MEDIA + JP Z,PRPSD_STATUS ; SUB-FUNC 3: STATUS DEC A - JP Z,PRPSD_CAP + JP Z,PRPSD_RESET ; SUB-FUNC 4: RESET DEC A - JP Z,PRPSD_GEOM - CALL PANIC + JP Z,PRPSD_CAP ; SUB-FUNC 5: GET CAPACITY + DEC A + JP Z,PRPSD_GEOM ; SUB-FUNC 6: GET GEOMETRY + DEC A + JP Z,PRPSD_GETPAR ; SUB-FUNC 7: GET PARAMETERS + DEC A + JP Z,PRPSD_SETPAR ; SUB-FUNC 8: SET PARAMETERS + CALL PANIC ; INVALID SUB-FUNCTION ; ; ; PRPSD_READ: + 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 @@ -316,7 +330,7 @@ PRPSD_READ: LD C,PRPSD_DSKIO LD B,0 - LD HL,(DIOBUF) + LD HL,(PRPSD_DSKBUF) INIR INIR @@ -326,8 +340,10 @@ PRPSD_READ: ; ; PRPSD_WRITE: + LD (PRPSD_DSKBUF),HL ; SAVE DISK BUFFER ADDRESS + #IF (PRPSDTRACE == 1) - LD HL,PRPSD_PRTERR ; SET UP SD_PRTERR + LD HL,PRPSD_PRTERR ; SET UP PRPSD_PRTERR PUSH HL ; ... TO FILTER ALL EXITS #ENDIF @@ -350,7 +366,7 @@ PRPSD_WRITE: LD C,PRPSD_DSKIO LD B,0 - LD HL,(DIOBUF) + LD HL,(PRPSD_DSKBUF) OTIR OTIR @@ -372,22 +388,45 @@ PRPSD_STATUS: OR A RET ; -; PRPSD_MEDIA ; -PRPSD_MEDIA: +; +PRPSD_RESET: + XOR A ; ALWAYS OK + RET +; +; PRPSD_GETPAR +; +PRPSD_GETPAR: ; REINITIALIZE THE CARD HERE CALL PRPSD_INITCARD #IF (PRPSDTRACE == 1) CALL PRPSD_PRTERR ; PRINT ANY ERRORS #ENDIF - LD A,MID_HD ; ASSUME SUCCESS, SETUP MEDIA ID + LD E,MID_HD ; ASSUME WE ARE OK RET Z ; RETURN IF GOOD INIT - LD A,MID_NONE ; SIGNAL NO MEDA - OR A ; SET FLAGS + LD E,MID_NONE ; SIGNAL NO MEDA RET ; AND RETURN ; ; ; +PRPSD_SETPAR: + ; NOT IMPLEMENTED + XOR A + RET +; +; +; +PRPSD_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 + XOR A ; SIGNAL SUCCESS + RET ; AND RETURN +; +; +; PRPSD_CAP: LD HL,PRPSD_BLKCNT ; POINT TO BLOCK COUNT CALL LD32 ; GET THE CURRENT CAPACITY TO DE:HL @@ -412,8 +451,6 @@ PRPSD_GEOM: ; UNIT IS SPECIFIED IN A ; PRPSD_SELUNIT: - CP PRPSD_UNITCNT ; CHECK VALIDITY (EXCEED UNIT COUNT?) - JP NC,PRPSD_INVUNIT ; HANDLE INVALID UNIT XOR A ; SIGNAL SUCCESS RET ; DONE ; @@ -884,6 +921,9 @@ PRPSD_STR_TYPESDXC .TEXT "SDXC$" ; PRP_FWVER .DB $00, $00, $00, $00 ; MMNNBBB (M=MAJOR, N=MINOR, B=BUILD) ; +PRPSD_UNIT .DB 0 +PRPSD_DSKBUF .DW 0 +; PRPSD_UNITDATA: PRPSD_STAT .DB 0 PRPSD_DSKSTAT .DB 0 diff --git a/Source/HBIOS/rf.asm b/Source/HBIOS/rf.asm index 62cfa367..500d2cf4 100644 --- a/Source/HBIOS/rf.asm +++ b/Source/HBIOS/rf.asm @@ -28,31 +28,50 @@ RF_INIT: ; ; RF_DISPATCH: + ; VERIFY AND 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 (RF_UNIT),A ; SAVE IT + CALL NC,PANIC ; PANIC IF TOO HIGH +; + ; DISPATCH ACCORDING TO DISK SUB-FUNCTION LD A,B ; GET REQUESTED FUNCTION - AND $0F - JR Z,RF_READ + AND $0F ; ISOLATE SUB-FUNCTION + JP Z,RF_SEEK ; SUB-FUNC 0: SEEK, USE HBIOS FOR NOW DEC A - JR Z,RF_WRITE + JP Z,RF_READ ; SUB-FUNC 1: READ DEC A - JR Z,RF_STATUS + JP Z,RF_WRITE ; SUB-FUNC 2: WRITE DEC A - JR Z,RF_MEDIA + JP Z,RF_STATUS ; SUB-FUNC 3: STATUS DEC A - JP Z,RF_CAP + JP Z,RF_RESET ; SUB-FUNC 4: RESET DEC A - JP Z,RF_GEOM - CALL PANIC -; -; RF_MEDIA -; -RF_MEDIA: - LD A,C ; GET THE DEVICE/UNIT - AND $0F ; ISOLATE UNIT - CP RFCNT ; NUM UNITS - LD A,MID_RF ; ASSUME WE ARE OK - RET C ; RETURN - XOR A ; NO MEDIA - RET ; AND RETURN + JP Z,RF_CAP ; SUB-FUNC 5: GET CAPACITY + DEC A + JP Z,RF_GEOM ; SUB-FUNC 6: GET GEOMETRY + DEC A + JP Z,RF_GETPAR ; SUB-FUNC 7: GET PARAMETERS + DEC A + JP Z,RF_SETPAR ; SUB-FUNC 8: SET PARAMETERS + CALL PANIC ; INVALID SUB-FUNCTION +; +; +; +RF_GETPAR: + LD A,C ; DEVICE/UNIT IS IN C + ADD A,MID_RF ; SET CORRECT MEDIA VALUE + LD E,A ; VALUE TO E + XOR A ; SIGNAL SUCCESS + RET +; +; +; +RF_SETPAR: + ; NOT IMPLEMENTED + XOR A + RET ; ; ; @@ -62,6 +81,12 @@ RF_STATUS: ; ; ; +RF_RESET: + XOR A ; ALWAYS OK + RET +; +; +; RF_CAP: LD A,C ; DEVICE/UNIT IS IN C AND $0F ; ISOLATE UNIT NUM @@ -88,10 +113,22 @@ RF_GEOM: ; ; ; +RF_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 + 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,(DIOBUF) + LD HL,(RF_DSKBUF) LD B,0 LD A,(RF_IO) OR RF_DAT @@ -104,6 +141,7 @@ RF_READ: ; ; RF_WRITE: + LD (RF_DSKBUF),HL ; SAVE DISK BUFFER ADDRESS CALL RF_SETIO LD A,(RF_IO) OR RF_ST @@ -113,7 +151,7 @@ RF_WRITE: LD A,1 ; PREPARE TO RETURN FALSE (ERROR) RET NZ ; WRITE PROTECTED! CALL RF_SETADR - LD HL,(DIOBUF) + LD HL,(RF_DSKBUF) LD B,0 LD A,(RF_IO) OR RF_DAT @@ -126,7 +164,7 @@ RF_WRITE: ; ; RF_SETIO: - LD A,(HSTDSK) ; GET DEVICE/UNIT + LD A,(RF_UNIT) ; GET DEVICE/UNIT AND $0F ; ISOLATE UNIT NUM JR NZ,RF_SETIO1 LD A,RF_U0IO @@ -157,4 +195,7 @@ RF_SETADR: ; ; ; -RF_IO .DB 0 \ No newline at end of file +RF_IO .DB 0 +; +RF_UNIT .DB 0 +RF_DSKBUF .DW 0 diff --git a/Source/HBIOS/sd.asm b/Source/HBIOS/sd.asm index f10f6e2d..7ba184c4 100644 --- a/Source/HBIOS/sd.asm +++ b/Source/HBIOS/sd.asm @@ -321,7 +321,9 @@ SD_INIT1: ; ; INITIALIZE UNIT DESIGNATED IN ACCUM ; -SD_INITUNIT: +SD_INITUNIT + LD (SD_UNIT),A ; SET CURRENT UNIT +; CALL SD_SELUNIT ; SELECT UNIT RET NZ ; ABORT ON ERROR ; @@ -404,42 +406,61 @@ SD_INITUNIT2: ;============================================================================= ; SD_DISPATCH: - LD A,C ; DEVICE/UNIT TO A - AND $0F ; REMOVE DEVICE BITS LEAVING JUST UNIT ID - CALL SD_SELUNIT ; SELECT DESIRED UNIT - RET NZ ; ABORT ON ERROR + ; VERIFY AND SAVE THE TARGET DEVICE/UNIT LOCALLY IN DRIVER + LD A,C ; DEVICE/UNIT FROM C + AND $0F ; ISOLATE UNIT NUM + CP SD_UNITCNT + CALL NC,PANIC ; PANIC IF TOO HIGH + LD (SD_UNIT),A ; SAVE IT + ;CALL SD_SELUNIT ; SELECT DESIRED UNIT +; + ; DISPATCH ACCORDING TO DISK SUB-FUNCTION LD A,B ; GET REQUESTED FUNCTION - AND $0F ; ISOLATE SUB-FUNCTION BITS - JP Z,SD_READ - DEC A - JP Z,SD_WRITE - DEC A - JP Z,SD_STATUS - DEC A - JP Z,SD_MEDIA - DEC A - JR Z,SD_CAP - DEC A - JR Z,SD_GEOM - CALL PANIC + AND $0F ; ISOLATE SUB-FUNCTION + JP Z,SD_SEEK ; SUB-FUNC 0: SEEK, USE HBIOS FOR NOW + DEC A + JP Z,SD_READ ; SUB-FUNC 1: READ + DEC A + JP Z,SD_WRITE ; SUB-FUNC 2: WRITE + DEC A + JP Z,SD_STATUS ; SUB-FUNC 3: STATUS + DEC A + JP Z,SD_RESET ; SUB-FUNC 4: RESET + DEC A + JP Z,SD_CAP ; SUB-FUNC 5: GET CAPACITY + DEC A + JP Z,SD_GEOM ; SUB-FUNC 6: GET GEOMETRY + DEC A + JP Z,SD_GETPAR ; SUB-FUNC 7: GET PARAMETERS + DEC A + JP Z,SD_SETPAR ; SUB-FUNC 8: SET PARAMETERS + CALL PANIC ; INVALID SUB-FUNCTION +; +; ; SD_READ: + LD (SD_DSKBUF),HL ; SAVE DISK BUFFER ADDRESS #IF (SDTRACE == 1) LD HL,SD_PRTERR ; SET UP SD_PRTERR PUSH HL ; ... TO FILTER ALL EXITS #ENDIF + CALL SD_SELUNIT ; READ A SECTOR LD C,SD_CMD_READ_SNGL_BLK ; SET READ_SINGLE_BLOCK COMMAND JP SD_SECTIO ; DO SECTOR I/O ; +; +; SD_WRITE: + LD (SD_DSKBUF),HL ; SAVE DISK BUFFER ADDRESS #IF (SDTRACE == 1) LD HL,SD_PRTERR ; SET UP SD_PRTERR PUSH HL ; ... TO FILTER ALL EXITS #ENDIF - ; WRITE A SECTOR + CALL SD_SELUNIT CALL SD_CHKWP ; CHECK FOR WRITE PROTECT JP NZ,SD_WRTPROT ; HANDLE IT IF SO + ; WRITE A SECTOR LD C,SD_CMD_WRITE_BLOCK ; SET WRITE_BLOCK COMMAND JP SD_SECTIO ; DO SECTOR I/O ; @@ -450,18 +471,46 @@ SD_STATUS: OR A ; SET FLAGS RET ; AND RETURN ; -SD_MEDIA: +; +; +SD_RESET: + XOR A ; ALWAYS OK + RET +; +; +; +SD_GETPAR: + CALL SD_SELUNIT ; SET CUR UNIT ; RE-INITIALIZE THE SD CARD TO ACCOMMODATE HOT SWAPPING CALL SD_INITCARD ; RE-INIT SELECTED UNIT #IF (SDTRACE == 1) CALL SD_PRTERR ; PRINT ANY ERRORS #ENDIF - LD A,MID_HD ; ASSUME SUCCESS, SETUP MEDIA ID + LD E,MID_HD ; ASSUME WE ARE OK RET Z ; RETURN IF GOOD INIT - LD A,MID_NONE ; SIGNAL NO MEDA - OR A ; SET FLAGS + LD E,MID_NONE ; SIGNAL NO MEDA RET ; AND RETURN ; +; +; +SD_SETPAR: + ; NOT IMPLEMENTED + XOR A + RET +; +; +; +SD_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 + XOR A ; SIGNAL SUCCESS + RET ; AND RETURN +; +; +; SD_CAP: SD_DPTR(SD_CAPACITY) ; POINT HL TO CAPACITY OF CUR UNIT CALL LD32 ; GET THE CURRENT CAPACITY DO DE:HL @@ -469,6 +518,8 @@ SD_CAP: XOR A ; SIGNAL SUCCESS RET ; AND DONE ; +; +; SD_GEOM: ; FOR LBA, WE SIMULATE CHS ACCESS USING 16 HEADS AND 16 SECTORS ; RETURN HS:CC -> DE:HL, SET HIGH BIT OF D TO INDICATE LBA CAPABLE @@ -794,7 +845,7 @@ SD_SECTIO: CALL SD_EXECCMD ; EXECUTE COMMAND RET NZ ; ABORT ON ERROR - LD HL,(DIOBUF) + LD HL,(SD_DSKBUF) LD BC,512 ; LENGTH TO READ LD A,(SD_CMD) ; GET THE COMMAND CP SD_CMD_READ_SNGL_BLK ; READ_SINGLE_BLOCK? @@ -1156,7 +1207,7 @@ SD_SELUNIT: JP NC,SD_INVUNIT ; HANDLE INVALID UNIT ; ; NEW UNIT SELECTED, IMPLEMENT IT - LD (SD_UNIT),A ; SAVE CURRENT UNIT NUMBER + ;LD (SD_UNIT),A ; SAVE CURRENT UNIT NUMBER #IF (SDMODE == SDMODE_DSD) ; SELECT REQUESTED UNIT OUT (SD_SELREG),A ; ACTUALLY SELECT THE CARD @@ -1559,6 +1610,7 @@ SD_RC .DB 0 ; RETURN CODE FROM CMD SD_TOK .DB 0 ; TOKEN FROM DATA XFR ; SD_UNIT .DB 0 ; ACTIVE UNIT, DEFAULT TO ZERO +SD_DSKBUF .DW 0 ; ACTIVE DISK BUFFER ; ; UNIT SPECIFIC DATA STORAGE ;