diff --git a/Source/BPBIOS/cboot-ww.z80 b/Source/BPBIOS/cboot-ww.z80 index c89069e6..9f9b5e98 100644 --- a/Source/BPBIOS/cboot-ww.z80 +++ b/Source/BPBIOS/cboot-ww.z80 @@ -368,13 +368,13 @@ BLKMV: POP BC ; And number of bytes to move DEC A ; 0 --> FF LD (Z3WHL),A ; Set the Wheel Byte - ; Get and save the internal HBIOS physical disk - ; buffer address which is assumed to be in the - ; HBIOS bank. - LD B,18H ; Get buffer function call (assumes already allocated!!!) - LD HL,0 ; ... with address 0 to get HBIOS buf adr - CALL HBX_INVOKE ; ... to return internal HBIOS buffer adr - LD (HB_DSKBUF),HL ; Record the buffer address + ; Allocate disk buffer in HBIOS bank and + ; save it for use later in disk access. + LD B,0F4H ; BIOS FUNC: ALLOCATE HEAP MEMORY + LD HL,512 ; 1 SECTOR, 512 BYTES + CALL HBX_INVOKE ; DO IT + CALL NZ,PANIC ; HANDLE ERROR + LD (HB_DSKBUF),HL ; RECORD THE BUFFER ADDRESS IF HAVIOP LD HL,IOPRET diff --git a/Source/BPBIOS/dphhd.lib b/Source/BPBIOS/dphhd.lib index beb73b05..c1fd3830 100644 --- a/Source/BPBIOS/dphhd.lib +++ b/Source/BPBIOS/dphhd.lib @@ -116,7 +116,7 @@ DPH$57: DEFW 0 XDPH58: DEFB TRUE ; --- Ninth Hard Drive/Partition DEFB FIXDSK DEFB 2 - DEFB HB_MDDEV + 0 + DEFB HB_MDDEV + 1 DPH$58: DEFW 0 DEFW 0,0,0 DEFW DIRBUF @@ -128,7 +128,7 @@ DPH$58: DEFW 0 XDPH59: DEFB TRUE ; --- Tenth Hard Drive/Partition DEFB FIXDSK DEFB 2 - DEFB HB_MDDEV + 1 + DEFB HB_MDDEV + 0 DPH$59: DEFW 0 DEFW 0,0,0 DEFW DIRBUF diff --git a/Source/BPBIOS/hardhb.z80 b/Source/BPBIOS/hardhb.z80 index bfac16cd..25a3cb08 100644 --- a/Source/BPBIOS/hardhb.z80 +++ b/Source/BPBIOS/hardhb.z80 @@ -174,7 +174,7 @@ HDSK_READ: ; CALL PRTSTRD ; DEFB '[HDSK READ]$' - LD B,10H ; $10 IS HBIOS DISK READ + LD B,13H ; $13 IS HBIOS DISK READ JR HDSK_RW ; ; @@ -183,7 +183,7 @@ HDSK_WRITE: ; CALL PRTSTRD ; DEFB '[HDSK WRITE]$' - LD B,11H ; $11 IS HBIOS DISK WRITE + LD B,14H ; $14 IS HBIOS DISK WRITE JR HDSK_RW ; ; @@ -193,42 +193,31 @@ HDSK_RW: DEC HL ; ADJUST TO POINT TO UNIT NUMBER LD C,(HL) ; LOAD IT IN C FOR HBIOS CALL LATER PUSH BC ; SAVE FUNCTION AND DEVICE FOR LATER - -; LD DE,(HSTTRK) -; LD HL,0 -; LD B,4 ; PREPARE TO LEFT SHIT BY 4 BITS -;HDSK_RW1: -; SLA E ; SHIFT DE LEFT BY 4 BITS -; RL D -; RL L -; RL H -; DJNZ HDSK_RW1 ; LOOP TILL ALL BITS DONE -; LD A,(HSTSEC) ; GET THE SECTOR INTO A -; AND 0FH ; GET RID OF TOP NIBBLE FOR SAFETY -; OR E ; COMBINE WITH E -; LD E,A ; BACK IN E - - LD HL,(HSTTRK) ; GET TRACK VALUE - LD A,L ; LSB OF TRACK TO A - AND 0FH ; ISOLATE HEAD IN LOW 4 BITS - LD D,A ; STUFF IT IN D - LD A,(HSTSEC) ; GET SECTOR - LD E,A ; STUFF IT IN E - LD B,4 ; PREPARE TO SHIFT OUT 4 BIT HEAD VALUE -HDSK_RW1: - SRL H ; SHIFT ONE BIT OUT - RR L ; ... OF HL - DJNZ HDSK_RW1 ; DO ALL 4 BITS - EX DE,HL ; HL <-> DE FOR HBIOS CALL - + LD HL,(HSTTRK) ; GET TRACK VALUE + LD A,L ; LSB OF TRACK TO A + AND 0FH ; ISOLATE HEAD IN LOW 4 BITS + LD D,A ; STUFF IT IN D + LD A,(HSTSEC) ; GET SECTOR + LD E,A ; STUFF IT IN E + LD B,4 ; PREPARE TO SHIFT OUT 4 BIT HEAD VALUE +HDSK_RW1: + SRL H ; SHIFT ONE BIT OUT + RR L ; ... OF HL + DJNZ HDSK_RW1 ; DO ALL 4 BITS POP BC ; RECOVER FUNCTION AND DEVICE - CALL HBX_INVOKE - OR A + PUSH BC ; SAVE INCOMING FUNCTION, DEVICE/UNIT + LD B,12H ; SETUP FOR NEW SEEK CALL + CALL HBX_INVOKE ; DO IT + POP BC ; RESTORE INCOMING FUNCTION, DEVICE/UNIT + RET NZ ; ABORT IF SEEK RETURNED AN ERROR W/ ERROR IN A + LD HL,(HB_DSKBUF) ; GET BUFFER ADDRESS + LD DE,1 ; TRANSFER ONE SECTOR + CALL HBX_INVOKE ; DO IT + OR A ; SET FLAGS RET Z ; DONE IF NO ERROR - XOR A - DEC A ; A=$FF TO SIGNAL ERROR - RET + OR 0FFH ; A=$FF TO SIGNAL ERROR + RET ; AND DONE W/ ERROR ; ;================================================================================================== ; HDSK DISK DRIVER - DATA diff --git a/Source/BPBIOS/hbios.z80 b/Source/BPBIOS/hbios.z80 index 08ffe243..9aacb521 100644 --- a/Source/BPBIOS/hbios.z80 +++ b/Source/BPBIOS/hbios.z80 @@ -3,33 +3,33 @@ ; ***************************** ; ;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: -; -; CHARACTER DEVICES (ONLY FIRST NIBBLE RELEVANT, SECOND NIBBLE RESERVED FOR UNIT) -; -HBCIO_UART EQU 000H -HBCIO_ASCI EQU 010H -HBCIO_VDU EQU 020H -HBCIO_CVDU EQU 030H -HBCIO_UPD7220 EQU 040H -HBCIO_N8V EQU 050H -HBCIO_PRPCON EQU 060H -HBCIO_PPPCON EQU 070H -HBCIO_CRT EQU 0D0H -HBCIO_BAT EQU 0E0H -HBCIO_NUL EQU 0F0H -; -; DISK DEVICES (ONLY FIRST NIBBLE RELEVANT, SECOND NIBBLE RESERVED FOR UNIT) -; -HBDEV_MD EQU 000H -HBDEV_FD EQU 010H -HBDEV_RF EQU 020H -HBDEV_IDE EQU 030H -HBDEV_ATAPI EQU 040H -HBDEV_PPIDE EQU 050H -HBDEV_SD EQU 060H -HBDEV_PRPSD EQU 070H -HBDEV_PPPSD EQU 080H -HBDEV_HDSK EQU 090H +;; +;; CHARACTER DEVICES (ONLY FIRST NIBBLE RELEVANT, SECOND NIBBLE RESERVED FOR UNIT) +;; +;HBCIO_UART EQU 000H +;HBCIO_ASCI EQU 010H +;HBCIO_VDU EQU 020H +;HBCIO_CVDU EQU 030H +;HBCIO_UPD7220 EQU 040H +;HBCIO_N8V EQU 050H +;HBCIO_PRPCON EQU 060H +;HBCIO_PPPCON EQU 070H +;HBCIO_CRT EQU 0D0H +;HBCIO_BAT EQU 0E0H +;HBCIO_NUL EQU 0F0H +;; +;; DISK DEVICES (ONLY FIRST NIBBLE RELEVANT, SECOND NIBBLE RESERVED FOR UNIT) +;; +;HBDEV_MD EQU 000H +;HBDEV_FD EQU 010H +;HBDEV_RF EQU 020H +;HBDEV_IDE EQU 030H +;HBDEV_ATAPI EQU 040H +;HBDEV_PPIDE EQU 050H +;HBDEV_SD EQU 060H +;HBDEV_PRPSD EQU 070H +;HBDEV_PPPSD EQU 080H +;HBDEV_HDSK EQU 090H ; HB_DEFBNK EQU BID_USR ; Default bank number ; @@ -66,7 +66,8 @@ HB_SRCADR DW 0 HB_SRCBNK DB 0 HB_DSTADR DW 0 HB_DSTBNK DB 0 - DB 0,0,0,0,0,0,0,0 +HB_CPYLEN DW 0 + DB 0,0,0,0,0,0 HB_INVOKE JP HBX_INVOKE HB_BNKSEL JP HBX_BNKSEL HB_BNKCPY JP HBX_BNKCPY @@ -90,6 +91,7 @@ HB_SRCADR EQU 0FFE2H HB_SRCBNK EQU 0FFE4H HB_DSTADR EQU 0FFE5H HB_DSTBNK EQU 0FFE7H +HB_CPYLEN EQU 0FFE8H ENDIF @@ -124,6 +126,11 @@ HBX_INIT: RET +; +;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +; SETBNK - Set memory bank specified in A. +;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +; HBX_SETBNK: JP HBX_BNKSEL @@ -143,9 +150,6 @@ HBX_COPY: IF INTPXY ; -; Enter at HBX_BNKSEL to set bank temporarily and avoid -; updating the "current" bank. -; HBX_BNKSEL: LD (HB_CURBNK),A diff --git a/Source/BPBIOS/romwbw-mk4.lib b/Source/BPBIOS/romwbw-mk4.lib index 84366ce0..3a304dfd 100644 --- a/Source/BPBIOS/romwbw-mk4.lib +++ b/Source/BPBIOS/romwbw-mk4.lib @@ -9,7 +9,7 @@ ; HBIOS configuration. ; HBIOS EQU YES ; Use HBIOS functions -INTPXY EQU YES ; Internal HBIOS Proxy +;INTPXY EQU YES ; Internal HBIOS Proxy HBLOC EQU 0FE00H ; Location of HBIOS proxy (used if not INTPXY) ; ; Set exactly one of the following to YES to specify platform @@ -26,13 +26,15 @@ HBCLK EQU YES ; HBIOS clock driver ; ; Set HB_HDDEV to appropriate hard disk driver ; -;HB_HDDEV EQU HBDEV_HDSK ; SIMH HDSK Driver -;HB_HDDEV EQU HBDEV_IDE ; IDE Driver -HB_HDDEV EQU HBDEV_SD ; SD Card Driver +;;HB_HDDEV EQU HBDEV_HDSK ; SIMH HDSK Driver +;;HB_HDDEV EQU HBDEV_IDE ; IDE Driver +;HB_HDDEV EQU HBDEV_SD ; SD Card Driver +HB_HDDEV EQU 2 ; ; Set HB_MDDEV to appropriate memory disk driver ; -HB_MDDEV EQU HBDEV_MD ; Memory Disk Driver +;HB_MDDEV EQU HBDEV_MD ; Memory Disk Driver +HB_MDDEV EQU 0 ; ; RAM/ROM disk sizes expressed as count of 2K blocks ; @@ -60,10 +62,12 @@ BID_COM EQU 9FH ENDIF ; IF N8 OR MK4 -HB_IODEV EQU HBCIO_ASCI - ELSE -HB_IODEV EQU HBCIO_UART +;HB_IODEV EQU HBCIO_ASCI +; ELSE +;HB_IODEV EQU HBCIO_UART ENDIF +; +HB_IODEV EQU 0 ; IF INTPXY MEMTOP EQU 0FFE0H - 1 ; Start of HBIOS 32 byte control block diff --git a/Source/BPBIOS/romwbw-sim.lib b/Source/BPBIOS/romwbw-sim.lib index 03fc7bb0..f1ae2b36 100644 --- a/Source/BPBIOS/romwbw-sim.lib +++ b/Source/BPBIOS/romwbw-sim.lib @@ -9,7 +9,7 @@ ; HBIOS configuration. ; HBIOS EQU YES ; Use HBIOS functions -INTPXY EQU YES ; Internal HBIOS Proxy +;INTPXY EQU YES ; Internal HBIOS Proxy HBLOC EQU 0FE00H ; Location of HBIOS proxy (used if not INTPXY) ; ; Set exactly one of the following to YES to specify platform @@ -26,13 +26,15 @@ HBCLK EQU YES ; HBIOS clock driver ; ; Set HB_HDDEV to appropriate hard disk driver ; -HB_HDDEV EQU HBDEV_HDSK ; SIMH HDSK Driver -;HB_HDDEV EQU HBDEV_IDE ; IDE Driver -;HB_HDDEV EQU HBDEV_SD ; SD Card Driver +;HB_HDDEV EQU HBDEV_HDSK ; SIMH HDSK Driver +;;HB_HDDEV EQU HBDEV_IDE ; IDE Driver +;;HB_HDDEV EQU HBDEV_SD ; SD Card Driver +HB_HDDEV EQU 2 ; ; Set HB_MDDEV to appropriate memory disk driver ; -HB_MDDEV EQU HBDEV_MD ; Memory Disk Driver +;HB_MDDEV EQU HBDEV_MD ; Memory Disk Driver +HB_MDDEV EQU 0 ; ; RAM/ROM disk sizes expressed as count of 2K blocks ; @@ -60,10 +62,12 @@ BID_COM EQU 9FH ENDIF ; IF N8 OR MK4 -HB_IODEV EQU HBCIO_ASCI - ELSE -HB_IODEV EQU HBCIO_UART +;HB_IODEV EQU HBCIO_ASCI +; ELSE +;HB_IODEV EQU HBCIO_UART ENDIF +; +HB_IODEV EQU 0 ; IF INTPXY MEMTOP EQU 0FFE0H - 1 ; Start of HBIOS 32 byte control block diff --git a/Source/BPBIOS/romwbw.lib b/Source/BPBIOS/romwbw.lib index 25fcaa28..f1ae2b36 100644 --- a/Source/BPBIOS/romwbw.lib +++ b/Source/BPBIOS/romwbw.lib @@ -26,13 +26,15 @@ HBCLK EQU YES ; HBIOS clock driver ; ; Set HB_HDDEV to appropriate hard disk driver ; -HB_HDDEV EQU HBDEV_HDSK ; SIMH HDSK Driver -;HB_HDDEV EQU HBDEV_IDE ; IDE Driver -;HB_HDDEV EQU HBDEV_SD ; SD Card Driver +;HB_HDDEV EQU HBDEV_HDSK ; SIMH HDSK Driver +;;HB_HDDEV EQU HBDEV_IDE ; IDE Driver +;;HB_HDDEV EQU HBDEV_SD ; SD Card Driver +HB_HDDEV EQU 2 ; ; Set HB_MDDEV to appropriate memory disk driver ; -HB_MDDEV EQU HBDEV_MD ; Memory Disk Driver +;HB_MDDEV EQU HBDEV_MD ; Memory Disk Driver +HB_MDDEV EQU 0 ; ; RAM/ROM disk sizes expressed as count of 2K blocks ; @@ -60,10 +62,12 @@ BID_COM EQU 9FH ENDIF ; IF N8 OR MK4 -HB_IODEV EQU HBCIO_ASCI - ELSE -HB_IODEV EQU HBCIO_UART +;HB_IODEV EQU HBCIO_ASCI +; ELSE +;HB_IODEV EQU HBCIO_UART ENDIF +; +HB_IODEV EQU 0 ; IF INTPXY MEMTOP EQU 0FFE0H - 1 ; Start of HBIOS 32 byte control block diff --git a/Source/HBIOS/API.txt b/Source/HBIOS/API.txt index a68cad94..3e4797cf 100644 --- a/Source/HBIOS/API.txt +++ b/Source/HBIOS/API.txt @@ -233,12 +233,13 @@ CAPACITY ($1A): If media is unknown, return error (no media) GEOMETRY ($1B): - BC=Function/Unit HL=Cylinders + BC=Function/Unit A=Result + HL=Cylinders D:0-6=Heads D:7=LBA Capable E=Sectors BC=Block Size - A=Result + Report current media geometry information. If media is unknown, return error (no media)