Browse Source

Revised Disk API

pull/3/head
Wayne Warthen 10 years ago
parent
commit
b63dfdf587
  1. 243
      Source/CBIOS/cbios.asm
  2. 178
      Source/CBIOS/util.asm
  3. 54
      Source/HBIOS/fd.asm
  4. 244
      Source/HBIOS/hbios.asm
  5. 24
      Source/HBIOS/hbios.inc
  6. 38
      Source/HBIOS/hdsk.asm
  7. 55
      Source/HBIOS/ide.asm
  8. 44
      Source/HBIOS/md.asm
  9. 37
      Source/HBIOS/ppide.asm
  10. 46
      Source/HBIOS/ppp.asm
  11. 31
      Source/HBIOS/prp.asm
  12. 40
      Source/HBIOS/rf.asm
  13. 24
      Source/HBIOS/romldr.asm
  14. 37
      Source/HBIOS/sd.asm
  15. 156
      Source/HBIOS/util.asm

243
Source/CBIOS/cbios.asm

@ -224,9 +224,9 @@ DEVMAP:
; byte indicating the number of entries. The index of the entry indicates
; the drive letter, so the first entry is A:, the second entry is B:, etc.
;
; BYTE: DEVICE/UNIT (OR JUST UNIT FOR UNA)
; BYTE: UNIT
; BYTE: SLICE
; WORD: ADDRESS OF DPH FOR THE DRIVE
; WORD: DPH ADDRESS
;
;==================================================================================================
; DPB MAPPING TABLE
@ -659,7 +659,7 @@ NUL_OST:
SELDSK:
; SELECT DISK NUMBER FOR SUBSEQUENT DISK OPS
#IF DSKTRACE
CALL PRTSELDSK ; *DEBUG*
CALL PRTSELDSK
#ENDIF
;
JP DSK_SELECT
@ -668,7 +668,7 @@ SELDSK:
HOME:
; SELECT TRACK 0 (BC = 0) AND FALL THRU TO SETTRK
#IF DSKTRACE
CALL PRTHOME ; *DEBUG*
CALL PRTHOME
#ENDIF
;
LD A,(HSTWRT) ; CHECK FOR PENDING WRITE
@ -766,11 +766,12 @@ WRT_UNA .EQU 2 ; WRITE TO UNALLOCATED
;
BLKRW:
#IF DSKTRACE
CALL PRTDSKOP ; *DEBUG*
CALL PRTDSKOP
#ENDIF
; FIX!!! WE ABORT ON FIRST ERROR, DRI SEEMS TO PASS ERROR STATUS TO THE END!!!
;CALL TSTPT ; *DEBUG*
; IF WRITE OPERATION, GO TO SPECIAL WRITE PROCESSING
LD A,(DSKOP) ; GET REQUESTED OPERATION
CP DOP_WRITE ; WRITE
@ -856,6 +857,7 @@ BLKRW4:
RET ; ERROR RETURN
BLKRW6:
;CALL TSTPT ; *DEBUG*
; CHECK TYPE OF OPERATIONS, IF WRITE, THEN GO TO WRITE PROCESSING
LD A,(DSKOP) ; GET PENDING OPERATION
CP DOP_WRITE ; IS IT A WRITE?
@ -863,6 +865,7 @@ BLKRW6:
; THIS IS A READ OPERATION, WE ALREADY DID THE I/O, NOW JUST DEBLOCK AND RETURN
CALL BLK_DEBLOCK ; EXTRACT DATA FROM BLOCK
;CALL TSTPT ; *DEBUG*
XOR A ; NO ERROR
RET ; ALL DONE
@ -971,7 +974,7 @@ UNA_INC:
;
BLKRW:
#IF DSKTRACE
CALL PRTDSKOP ; *DEBUG*
CALL PRTDSKOP
#ENDIF
CALL BLK_XLT ; SECTOR XLAT: SEK... -> XLT...
@ -1131,7 +1134,7 @@ BLK_SETUP:
;==================================================================================================
;
; LOOKUP DISK INFORMATION BASED ON CPM DRIVE IN C
; ON RETURN, D=DEVICE/UNIT, E=SLICE, HL=DPH ADDRESS
; ON RETURN, D=UNIT, E=SLICE, HL=DPH ADDRESS
;
DSK_GETINF:
LD HL,(DRVMAPADR) ; HL := START OF UNA DRIVE MAP
@ -1141,10 +1144,10 @@ DSK_GETINF:
JR NC,DSK_GETINF1 ; IF OUT OF RANGE, GO TO ERROR RETURN
INC HL ; POINT TO START OF DRIVE MAP
;
RLCA ; MULTIPLY A BY 4...
RLCA ; TO USE AS OFFSET INTO ???? MAP
RLCA ; MULTIPLY A BY 4
RLCA ; ... TO USE AS OFFSET INTO DRVMAP
CALL ADDHLA ; ADD OFFSET
LD D,(HL) ; D := DEVICE/UNIT
LD D,(HL) ; D := UNIT
INC HL ; BUMP TO SLICE
LD E,(HL) ; E := SLICE
INC HL ; POINT TO DPH LSB
@ -1171,16 +1174,16 @@ DSK_GETINF1: ; ERROR RETURN
;
DSK_SELECT:
LD B,E ; SAVE E IN B FOR NOW
CALL DSK_GETINF ; GET D=DEVICE/UNIT, E=SLICE, HL=DPH ADDRESS
CALL DSK_GETINF ; GET D=UNIT, E=SLICE, HL=DPH ADDRESS
RET NZ ; RETURN IF INVALID DRIVE (A=1, NZ SET, HL=0)
PUSH BC ; WE NEED B LATER, SAVE ON STACK
;
; SAVE ALL THE NEW STUFF
LD A,C ; A := CPM DRIVE NO
LD (SEKDSK),A ; SAVE IT
LD A,D ; A := DEVICE/UNIT
LD (SEKDU),A ; SAVE DEVICE/UNIT
LD (SEKDPH),HL ; SAVE DPH POINTER
LD A,D ; A := UNIT
LD (SEKUNIT),A ; SAVE UNIT
LD (SEKDPH),HL ; SAVE DPH ADDRESS
;
; UPDATE OFFSET FOR ACTIVE SLICE
; A TRACK IS ASSUMED TO BE 16 SECTORS
@ -1201,7 +1204,7 @@ DSK_SELECT:
JR NZ,DSK_SELECT2 ; BYPASS MEDIA DETECTION
;
; DETERMINE MEDIA IN DRIVE
LD A,(SEKDU) ; GET DEVICE/UNIT
LD A,(SEKUNIT) ; GET UNIT
LD C,A ; STORE IN C
LD B,BF_DIOMED ; DRIVER FUNCTION = DISK MEDIA
RST 08
@ -1229,7 +1232,7 @@ DSK_SELECT:
#ENDIF
;
DSK_SELECT2:
LD HL,(SEKDPH) ; HL = DPH ADDRESS FOR CP/M
LD HL,(SEKDPH) ; HL = DPH ADDRESS FOR CP/M
XOR A ; FLAG SUCCESS
RET ; NORMAL RETURN
;
@ -1240,12 +1243,12 @@ DSK_STATUS:
XOR A ; ASSUME OK FOR NOW
RET ; RETURN
#ELSE
; C HAS CPM DRIVE, LOOKUP DEVICE/UNIT AND CHECK FOR INVALID DRIVE
CALL DSK_GETINF ; B = DEVICE/UNIT
; C HAS CPM DRIVE, LOOKUP UNIT AND CHECK FOR INVALID DRIVE
CALL DSK_GETINF ; B := UNIT
RET NZ ; INVALID DRIVE ERROR
; VALID DRIVE, DISPATCH TO DRIVER
LD C,D ; C := DEVICE/UNIT
LD C,D ; C := UNIT
LD B,BF_DIOST ; B := FUNCTION: STATUS
RST 08
RET
@ -1291,7 +1294,7 @@ DSK_IO2:
LD A,(HSTOFF+1) ; MSB OF SLICE OFFSET TO A
CALL ADCHLA ; ADD OFFSET
POP BC ; RECOVER FUNCTION IN B
LD A,(HSTDU) ; GET THE DEVICE/UNIT VALUE
LD A,(HSTUNIT) ; GET THE UNIT VALUE
LD C,A ; PUT IT IN C
; DISPATCH TO DRIVER
PUSH BC
@ -1319,9 +1322,16 @@ DSK_IO:
; NEEDS TO HANDLE FLOPPY SEPARATE FROM HARD DISK
;
CHS:
LD A,(HSTDU) ; GET DEVICE/UNIT
LD C,A ; PUT IT IN C FOR HBIOS CALL
AND $F0
LD A,(HSTUNIT) ; GET UNIT
LD C,A ; UNIT -> C
PUSH BC ; SAVE FUNC/UNIT
LD B,BF_DIOGETINF ; HBIOS FUNC: UNIT INFO
;CALL TSTPT ; *DEBUG*
RST 08 ; GET UNIT INFO, DEVICE TYPE IN D
;CALL TSTPT ; *DEBUG*
POP BC ; GET FUNC/UNIT BACK TO BC
LD A,D ; DEVICE TYPE -> A
AND $F0 ; ISOLATE HIGH BITS
CP DIODEV_FD ; FLOPPY?
JR NZ,CHSHD ; IF NOT, DO HD CHS XLAT
;
@ -1365,9 +1375,11 @@ CHS2:
;
; MAKE HBIOS CALL
; HBIOS FUNC SHOULD STILL BE IN B
; DEVICE/UNIT SHOULD STILL BE IN C
; UNIT SHOULD STILL BE IN C
;
;CALL TSTPT ; *DEBUG*
RST 08 ; DO IT
;CALL TSTPT ; *DEBUG*
OR A ; SET FLAGS
RET ; DONE
@ -1483,9 +1495,9 @@ SEK:
SEKDSK .DB 0 ; DISK NUMBER 0-15
SEKTRK .DW 0 ; TWO BYTES FOR TRACK # (LOGICAL)
SEKSEC .DW 0 ; TWO BYTES FOR SECTOR # (LOGICAL)
SEKDU .DB 0 ; DEVICE/UNIT
SEKUNIT .DB 0 ; DISK UNIT
SEKDPH .DW 0 ; ADDRESS OF ACTIVE (SELECTED) DPH
SEKOFF .DW 0 ; TRACK OFFSET IN EFFECT FOR LU
SEKOFF .DW 0 ; TRACK OFFSET IN EFFECT FOR SLICE
SEKACT .DB TRUE ; ALWAYS TRUE!
;
; RESULT OF CPM TO PHYSICAL TRANSLATION
@ -1494,7 +1506,7 @@ XLT:
XLTDSK .DB 0
XLTTRK .DW 0
XLTSEC .DW 0
XLTDU .DB 0
XLTUNIT .DB 0
XLTDPH .DW 0
XLTOFF .DW 0
XLTACT .DB TRUE ; ALWAYS TRUE!
@ -1507,9 +1519,9 @@ HST:
HSTDSK .DB 0 ; DISK IN BUFFER
HSTTRK .DW 0 ; TRACK IN BUFFER
HSTSEC .DW 0 ; SECTOR IN BUFFER
HSTDU .DB 0 ; DEVICE/UNIT IN BUFFER
HSTUNIT .DB 0 ; DISK UNIT IN BUFFER
HSTDPH .DW 0 ; CURRENT DPH ADDRESS
HSTOFF .DW 0 ; TRACK OFFSET IN EFFECT FOR LU
HSTOFF .DW 0 ; TRACK OFFSET IN EFFECT FOR SLICE
HSTACT .DB 0 ; TRUE = BUFFER HAS VALID DATA
;
; SEQUENTIAL WRITE TRACKING FOR (UNA)LLOCATED BLOCK
@ -2184,22 +2196,18 @@ DRV_INIT:
; PERFORM UBIOS SPECIFIC INITIALIZATION
; BUILD DRVMAP BASED ON AVAILABLE UBIOS DISK DEVICE LIST
;
; GET BOOT DEVICE/UNIT/LU INFO
; GET BOOT UNIT/SLICE INFO
LD BC,$00FC ; UNA FUNC: GET BOOTSTRAP HISTORY
RST 08 ; CALL UNA
LD D,L ; SAVE L AS DEVICE/UNIT
LD E,0 ; LU IS ZERO
LD (BOOTVOL),DE ; D -> DEVICE/UNIT, E -> LU
LD D,L ; SAVE L AS UNIT
LD E,0 ; SLICE IS ZERO
LD (BOOTVOL),DE ; D -> UNIT, E -> SLICE
;
; SETUP THE DRVMAP STRUCTURE
LD HL,(HEAPTOP) ; GET CURRENT HEAP TOP
INC HL ; SKIP 1 BYTE FOR ENTRY COUNT PREFIX
LD (DRVMAPADR),HL ; SAVE AS DRIVE MAP ADDRESS
LD (HEAPTOP),HL ; ... AND AS NEW HEAP TOP
;
;
; LOOP THRU DEVICES TO COUNT TOTAL HARD DISK VOLUMES
LD B,0 ; START WITH UNIT 0
@ -2279,11 +2287,11 @@ DRV_INIT8: ; SLICE CREATION LOOP
RET NC ; IF >= MAX, JUST BAIL OUT
INC (HL) ; INCREMENT THE ENTRY COUNT
;
; ALLOCATE ENTRY AND FILL IN DEVICE/UNIT, SLICE
; ALLOCATE ENTRY AND FILL IN UNIT, SLICE
LD HL,4 ; 4 BYTES PER ENTRY
CALL ALLOC ; ALLOCATE SPACE
CALL NZ,PANIC ; SHOULD NEVER ERROR HERE
LD (HL),D ; SAVE DEVICE/UNIT IN FIRST BYTE OF DRVMAP ENTRY
LD (HL),D ; SAVE UNIT IN FIRST BYTE OF DRVMAP ENTRY
INC HL ; POINT TO NEXT BYTE OF DRVMAP ENTRY
LD (HL),E ; SAVE SLICE NUM IN SECOND BYTE OF DRVMAP ENTRY
;
@ -2298,9 +2306,9 @@ DRV_INIT:
; PERFORM HBIOS SPECIFIC INITIALIZATION
; BUILD DRVMAP BASED ON AVAILABLE HBIOS DISK DEVICE LIST
;
; GET BOOT DEVICE/UNIT/LU INFO
LD DE,(HCB + HCB_BOOTVOL) ; BOOT VOLUME (DEV/UNIT, SLICE)
LD (BOOTVOL),DE ; D -> DEVICE/UNIT, E -> LU
; GET BOOT UNIT/SLICE INFO
LD DE,(HCB + HCB_BOOTVOL) ; BOOT VOLUME (UNIT, SLICE)
LD (BOOTVOL),DE ; D -> UNIT, E -> SLICE
;
; SETUP THE DRVMAP STRUCTURE
LD HL,(HEAPTOP) ; GET CURRENT HEAP TOP
@ -2324,17 +2332,17 @@ DRV_INIT2:
PUSH BC ; SAVE LOOP CONTROL
CALL DRV_INIT3 ; CHECK DRIVE
POP BC ; RESTORE LOOP CONTROL
INC C ; NEXT DEVICE/UNIT
INC C ; NEXT UNIT
DJNZ DRV_INIT2 ; LOOP
POP BC ; RESTORE DEVICE/UNIT COUNT IN B
POP BC ; RESTORE UNIT COUNT IN B
JR DRV_INIT4 ; CONTINUE
;
DRV_INIT3:
PUSH DE ; SAVE DE (HARD DISK VOLUME COUNTER)
LD B,BF_DIOGETINF ; HBIOS FUNC: DEVICE INFO
RST 08 ; CALL HBIOS, DEVICE/UNIT TO C
LD B,BF_DIOGETINF ; HBIOS FUNC: UNIT INFO
RST 08 ; CALL HBIOS, UNIT TO C
LD A,D ; DEVICE TYPE TO A
POP DE ; RESTORE DE
LD A,C ; DEVICE/UNIT TO A
CP DIODEV_IDE ; HARD DISK DEVICE?
RET C ; NOPE, RETURN
INC E ; INCREMENT HARD DISK COUNT
@ -2362,18 +2370,20 @@ DRV_INIT5:
DRV_INIT6: ; LOOP THRU ALL UNITS AVAILABLE
PUSH BC ; PRESERVE LOOP CONTROL
LD B,BF_DIOGETINF ; HBIOS FUNC: DEVICE INFO
RST 08 ; CALL HBIOS, DEVICE/UNIT TO C
RST 08 ; CALL HBIOS, D := DEVICE TYPE
POP BC ; GET UNIT INDEX BACK IN C
PUSH BC ; RESAVE LOOP CONTROL
CALL DRV_INIT7 ; MAKE DRIVE MAP ENTRY(S)
POP BC ; RESTORE LOOP CONTROL
INC C ; INCREMENT LIST INDEX
DJNZ DRV_INIT6 ; LOOP AS NEEDED
RET ; FINISHED
;
DRV_INIT7: ; PROCESS DEVICE/UNIT
LD D,C ; DEVICE/UNIT TO D
DRV_INIT7: ; PROCESS UNIT
LD E,0 ; INITIALIZE SLICE INDEX
LD B,1 ; DEFAULT LOOP COUNTER
LD A,D ; DEVICE/UNIT TO ACCUM
LD A,D ; DEVICE TYPE TO ACCUM
LD D,C ; UNIT NUMBER TO D
CP DIODEV_IDE ; HARD DISK DEVICE?
JR C,DRV_INIT8 ; NOPE, LEAVE LOOP COUNT AT 1
LD A,(HDSPV) ; GET SLICES PER VOLUME TO ACCUM
@ -2389,11 +2399,11 @@ DRV_INIT8: ; SLICE CREATION LOOP
RET NC ; IF >= MAX, JUST BAIL OUT
INC (HL) ; INCREMENT THE ENTRY COUNT
;
; ALLOCATE ENTRY AND FILL IN DEVICE/UNIT, SLICE
; ALLOCATE ENTRY AND FILL IN UNIT, SLICE
LD HL,4 ; 4 BYTES PER ENTRY
CALL ALLOC ; ALLOCATE SPACE
CALL NZ,PANIC ; SHOULD NEVER ERROR HERE
LD (HL),D ; SAVE DEVICE/UNIT IN FIRST BYTE OF DRVMAP ENTRY
LD (HL),D ; SAVE UNIT IN FIRST BYTE OF DRVMAP ENTRY
INC HL ; POINT TO NEXT BYTE OF DRVMAP ENTRY
LD (HL),E ; SAVE SLICE NUM IN SECOND BYTE OF DRVMAP ENTRY
;
@ -2455,19 +2465,19 @@ DPH_INIT1:
LD A,'=' ; SEPARATOR
CALL COUT ; DISPLAY IT
; SETUP FOR DPH BUILD ROUTINE INCLUDING DPH BLOCK ALLOCATION
LD D,(HL) ; D := DEV/UNIT
LD D,(HL) ; D := UNIT
INC HL ; BUMP
LD E,(HL) ; E := SLICE
INC HL ; BUMP
CALL PRTDUS ; PRINT DEVICE/UNIT/SLICE
LD A,D ; A := DEV/UNIT
CALL PRTDRV ; PRINT DRIVE INFO
LD A,D ; A := UNIT
PUSH HL ; SAVE DRIVE MAP POINTER
PUSH AF ; SAVE DEV/UNIT
; MATCH AND SAVE DEFAULT DRIVE BASED ON BOOT DEVICE/UNIT/SLICE
LD HL,BOOTVOL + 1 ; POINT TO BOOT DEVICE/UNIT
LD A,D ; LOAD CURRENT DEVICE/UNIT
PUSH AF ; SAVE UNIT
; MATCH AND SAVE DEFAULT DRIVE BASED ON BOOT UNIT/SLICE
LD HL,BOOTVOL + 1 ; POINT TO BOOT UNIT
LD A,D ; LOAD CURRENT UNIT
CP (HL) ; MATCH?
JR NZ,DPH_INIT1A ; BYPASS IF NOT BOOT DEVICE/UNIT
JR NZ,DPH_INIT1A ; BYPASS IF NOT BOOT UNIT
DEC HL ; POINT TO BOOT SLICE
LD A,E ; LOAD CURRENT SLICE
CP (HL) ; MATCH?
@ -2475,12 +2485,12 @@ DPH_INIT1:
LD A,C ; LOAD THE CURRENT DRIVE NUM
LD (DEFDRIVE),A ; SAVE AS DEFAULT
DPH_INIT1A:
POP AF ; RESTORE DEV/UNIT
POP AF ; RESTORE UNIT
LD DE,(DPHTOP) ; GET ADDRESS OF NEXT DPH
PUSH DE ; ... AND SAVE IT
; INVOKE THE DPH BUILD ROUTINE
PUSH BC ; SAVE LOOP CONTROL
CALL MAKDPH ; MAKE THE DPH AT DE, DEV/UNIT IN A
CALL MAKDPH ; MAKE THE DPH AT DE, UNIT IN A
;CALL NZ,PANIC ; FOR NOW, PANIC ON ANY ERROR
POP BC ; RESTORE LOOP CONTROL
; STORE THE DPH POINTER IN DRIVE MAP
@ -2506,7 +2516,7 @@ DPH_INIT2:
;
MAKDPH:
;
; MAKE A DPH AT ADDRESS IN DE FOR DEV/UNIT IN A
; MAKE A DPH AT ADDRESS IN DE FOR UNIT IN A
;
PUSH DE ; SAVE INCOMING DPH ADDRESS
;
@ -2537,22 +2547,52 @@ MAKDPH0: ; HANDLE RAM/ROM
;
#ELSE
;
; DETERMINE APPROPRIATE DPB
LD DE,DPB_ROM ; ASSUME ROM
CP DIODEV_MD+0 ; ROM?
JR Z,MAKDPH1 ; YES, JUMP AHEAD
LD DE,DPB_RAM ; ASSUME ROM
CP DIODEV_MD+1 ; ROM?
JR Z,MAKDPH1 ; YES, JUMP AHEAD
AND $F0 ; IGNORE UNIT NIBBLE NOW
LD DE,DPB_FD144 ; ASSUME FLOPPY
;; DETERMINE APPROPRIATE DPB
;LD DE,DPB_ROM ; ASSUME ROM
;CP DIODEV_MD+0 ; ROM?
;JR Z,MAKDPH1 ; YES, JUMP AHEAD
;LD DE,DPB_RAM ; ASSUME ROM
;CP DIODEV_MD+1 ; ROM?
;JR Z,MAKDPH1 ; YES, JUMP AHEAD
;AND $F0 ; IGNORE UNIT NIBBLE NOW
;LD DE,DPB_FD144 ; ASSUME FLOPPY
;CP DIODEV_FD ; FLOPPY?
;JR Z,MAKDPH1 ; YES, JUMP AHEAD
;LD DE,DPB_RF ; ASSUME RAM FLOPPY
;CP DIODEV_RF ; RAM FLOPPY?
;JR Z,MAKDPH1 ; YES, JUMP AHEAD
;LD DE,DPB_HD ; EVERYTHING ELSE IS ASSUMED TO BE HARD DISK
;JR MAKDPH1 ; JUMP AHEAD
; DETERMINE APPROPRIATE DPB (UNIT NUMBER IN A)
; GET DEVICE INFO
LD C,A ; UNIT NUMBER TO C
LD B,BF_DIOGETINF ; HBIOS FUNC: UNIT INFO
RST 08 ; CALL HBIOS, RET W/ DEVICE TYPE IN D, PHYSICAL UNIT IN E
LD A,D ; DEVICE TYPE TO A
CP DIODEV_MD ; RAM/ROM DISK?
JR Z,MAKDPH0 ; HANDLE SPECIAL
LD DE,DPB_FD144 ; PRELOAD FLOPPY DPB
CP DIODEV_FD ; FLOPPY?
JR Z,MAKDPH1 ; YES, JUMP AHEAD
LD DE,DPB_RF ; ASSUME RAM FLOPPY
JR Z,MAKDPH1 ; IF SO, PROCEED TO DPH CREATION
LD DE,DPB_RF ; PRELOAD RAM FLOPPY DPB
CP DIODEV_RF ; RAM FLOPPY?
JR Z,MAKDPH1 ; YES, JUMP AHEAD
LD DE,DPB_HD ; EVERYTHING ELSE IS ASSUMED TO BE HARD DISK
JR MAKDPH1 ; JUMP AHEAD
JR Z,MAKDPH1 ; IF SO, PROCEED TO DPH CREATION
; EVERYTHING ELSE IS A HARD DISK
LD DE,DPB_HD ; PRELOAD HARD DISK DPB
JR MAKDPH1 ; PROCEED TO DPH CREATION
;
MAKDPH0:
; RAM/ROM DISK DPB DERIVATION
; TYPE OF MEMORY DISK (RAM/ROM) DETERMINED BY PHYSICAL UNIT NUMBER
LD A,E ; LOAD PHYSICAL UNIT NUMBER
LD DE,DPB_ROM ; PRELOAD ROM DISK DPB
OR A ; UNIT=0 (ROM)?
JR Z,MAKDPH1 ; IF UNIT=0, IT IS ROM, PROCEED TO DPH CREATION
LD DE,DPB_RAM ; PRELOAD RAM DISK DPB
CP $01 ; UNIT=1 (RAM)?
JR Z,MAKDPH1 ; IF UNIT=0, IT IS ROM, PROCEED TO DPH CREATION
CALL PANIC ; OTHERWISE UNKNOWN, NOT POSSIBLE, JUST PANIC
;
#ENDIF
;
@ -2642,10 +2682,10 @@ ERR:
OR $FF
RET
;
PRTDUS:
PRTDRV:
;
; PRINT THE DEVICE/UNIT/SLICE INFO
; ON INPUT D HAS DEVICE/UNIT, E HAS SLICE
; PRINT THE UNIT/SLICE INFO
; ON INPUT D HAS UNIT, E HAS SLICE
; DESTROY NO REGISTERS OTHER THAN A
;
#IFDEF PLTUNA
@ -2660,40 +2700,40 @@ PRTDUS:
LD A,D ; DISK TYPE TO A
CP $40
JR Z,PRTDUS1 ; IF SO, HANDLE RAM/ROM
JR Z,PRTDRV1 ; IF SO, HANDLE RAM/ROM
LD DE,DEVIDE ; IDE STRING
CP $41 ; IDE?
JR Z,PRTDUSX ; IF YES, PRINT
JR Z,PRTDRVX ; IF YES, PRINT
LD DE,DEVPPIDE ; PPIDE STRING
CP $42 ; PPIDE?
JR Z,PRTDUSX ; IF YES, PRINT
JR Z,PRTDRVX ; IF YES, PRINT
LD DE,DEVSD ; SD STRING
CP $43 ; SD?
JR Z,PRTDUSX ; IF YES, PRINT
JR Z,PRTDRVX ; IF YES, PRINT
LD DE,DEVDSD ; DSD STRING
CP $44 ; DSD?
JR Z,PRTDUSX ; IF YES, PRINT
JR Z,PRTDRVX ; IF YES, PRINT
LD DE,DEVUNK ; OTHERWISE, UNKNOWN
JR PRTDUSX ; PRINT IT
JR PRTDRVX ; PRINT IT
PRTDUS1:
PRTDRV1:
LD C,$45 ; UNA FUNC: GET DISK INFO
LD DE,INIBUF ; 512 BYTE BUFFER
CALL $FFFD ; CALL UNA
BIT 7,B ; TEST RAM DRIVE BIT
LD DE,DEVROM ; ASSUME ROM
JR Z,PRTDUSX ; IF SO, DISPLAY ROM
JR Z,PRTDRVX ; IF SO, DISPLAY ROM
LD DE,DEVRAM ; ELSE RAM
JR Z,PRTDUSX ; DO IT
JR Z,PRTDRVX ; DO IT
PRTDUSX:
PRTDRVX:
CALL WRITESTR ; PRINT DEVICE NAME
POP HL ; RECOVER HL
POP DE ; RECOVER DE
POP BC ; RECOVER BC
LD A,D ; LOAD DEVICE/UNIT
LD A,D ; LOAD UNIT
CALL PRTDECB ; PRINT IT
CALL PC_COLON ; FORMATTING
LD A,E ; LOAD SLICE
@ -2710,15 +2750,20 @@ DEVUNK .DB "UNK$"
;
#ELSE
;
PUSH BC ; PRESERVE BC
PUSH DE ; PRESERVE DE
PUSH HL ; PRESERVE HL
LD A,D ; LOAD DEVICE/UNIT
LD B,BF_DIOGETINF ; GET DISK INFO
LD C,D ; UNIT TO C
RST 08 ; CALL HBIOS
LD A,D ; RESULTANT DEVICE TYPE
PUSH DE ; NEED TO SAVE UNIT NUMBER (IN E)
RRCA ; ROTATE DEVICE
RRCA ; ... BITS
RRCA ; ... INTO
RRCA ; ... LOWEST 4 BITS
AND $0F ; ISOLATE DEVICE BITS
ADD A,A ; MULTIPLE BY TWO FOR WORD TABLE
ADD A,A ; MULTIPLY BY TWO FOR WORD TABLE
LD HL,DEVTBL ; POINT TO START OF DEVICE NAME TABLE
CALL ADDHLA ; ADD A TO HL TO POINT TO TABLE ENTRY
LD A,(HL) ; DEREFERENCE HL TO LOC OF DEVICE NAME STRING
@ -2726,11 +2771,13 @@ DEVUNK .DB "UNK$"
LD D,(HL) ; ...
LD E,A ; ...
CALL WRITESTR ; PRINT THE DEVICE NMEMONIC
POP HL ; RECOVER HL
POP DE ; RECOVER DE
LD A,D ; LOAD DEVICE/UNIT
POP DE ; RECOVER UNIT (IN E)
LD A,E ; LOAD UNIT
AND $0F ; ISOLATE UNIT
CALL PRTDECB ; PRINT IT
POP HL ; RECOVER HL
POP DE ; RECOVER DE
POP BC ; RECOVER BC
CALL PC_COLON ; FORMATTING
LD A,E ; LOAD SLICE
CALL PRTDECB ; PRINT IT
@ -2765,7 +2812,7 @@ DEV15 .EQU DEVUNK
DPHTOP .DW 0 ; CURRENT TOP OF DPH POOL
DIRBUF .DW 0 ; DIR BUF POINTER
HEAPTOP .DW BUFPOOL ; CURRENT TOP OF HEAP
BOOTVOL .DW 0 ; BOOT VOLUME, MSB=BOOT DEVICE/UNIT, LSB=BOOT LU
BOOTVOL .DW 0 ; BOOT VOLUME, MSB=BOOT UNIT, LSB=BOOT SLICE
BNKRAMD .DB 0 ; STARTING BANK ID FOR RAM DRIVE
HDSPV .DB 2 ; SLICES PER VOLUME FOR HARD DISKS (MUST BE >= 1)
;

178
Source/CBIOS/util.asm

@ -105,48 +105,107 @@ WRITESTR2:
POP AF
RET
;
; PANIC: TRY TO DUMP MACHINE STATE AND HALT
;
;
TSTPT:
PUSH DE
LD DE,STR_TSTPT
CALL WRITESTR
POP DE
JR REGDMP ; DUMP REGISTERS AND RETURN
;
; PANIC: TRY TO DUMP MACHINE STATE
;
PANIC:
PUSH HL
PUSH DE
PUSH BC
PUSH AF
LD DE,STR_PANIC
CALL WRITESTR
LD DE,STR_AF
CALL WRITESTR
POP BC ; AF
CALL PRTHEXWORD
LD DE,STR_BC
CALL WRITESTR
POP BC ; BC
CALL PRTHEXWORD
LD DE,STR_DE
CALL WRITESTR
POP BC ; DE
CALL PRTHEXWORD
LD DE,STR_HL
CALL WRITESTR
POP BC ; HL
CALL PRTHEXWORD
LD DE,STR_PC
CALL WRITESTR
POP BC ; PC
POP DE
JR REGDMP ; DUMP REGISTERS AND RETURN
;
;
;
REGDMP:
EX (SP),HL ; RET ADR TO HL, SAVE HL ON TOS
LD (REGDMP_PC),HL ; SAVE RET IS PC REG VALUE, SAVE IT
EX (SP),HL ; BACK THE WAY IT WAS
LD (UTSTKSAV),SP ; SAVE ORIGINAL STACK POINTER
LD SP,UTPRVSTK ; SWITCH TO PRIVATE STACK
PUSH AF
PUSH BC
PUSH DE
PUSH HL
CALL PC_LBKT
PUSH AF
LD A,'@'
CALL COUT
POP AF
PUSH BC
LD BC,(REGDMP_PC)
CALL PRTHEXWORD
LD DE,STR_SP
POP BC
CALL PC_COLON
PUSH BC
PUSH AF
POP BC
CALL PRTHEXWORD ; AF
POP BC
CALL PC_COLON
CALL PRTHEXWORD ; BC
CALL PC_COLON
PUSH DE
POP BC
CALL PRTHEXWORD ; DE
CALL PC_COLON
PUSH HL
POP BC
CALL PRTHEXWORD ; HL
CALL PC_COLON
LD BC,(UTSTKSAV)
CALL PRTHEXWORD ; SP
CALL PC_RBKT
CALL PC_SPACE
POP HL
POP DE
POP BC
POP AF
LD SP,(UTSTKSAV) ; BACK TO ORIGINAL STACK FRAME
RET
;
REGDMP_PC .DW 0
;
;
;
CONTINUE:
PUSH AF
PUSH DE
LD DE,STR_CONTINUE
CALL WRITESTR
LD HL,0
ADD HL,SP ; SP
LD B,H
LD C,L
CALL PRTHEXWORD
RST 38
POP DE
CONTINUE1:
CALL CIN
CP 'Y'
JR Z,CONTINUE3
CP 'y'
JR Z,CONTINUE3
CP 'N'
JR Z,CONTINUE2
CP 'n'
JR Z,CONTINUE2
JR CONTINUE1
CONTINUE2:
HALT
JP 0
CONTINUE3:
POP AF
RET
;
;==================================================================================================
; CONSOLE CHARACTER I/O HELPER ROUTINES (REGISTERS PRESERVED)
@ -166,13 +225,28 @@ COUT:
POP AF
RET
;
STR_PANIC .DB "\r\n\r\n>>> FATAL ERROR:$"
STR_AF .DB " AF=$"
STR_BC .DB " BC=$"
STR_DE .DB " DE=$"
STR_HL .DB " HL=$"
STR_PC .DB " PC=$"
STR_SP .DB " SP=$"
;
;
CIN:
PUSH BC
PUSH DE
PUSH HL
CALL CONIN
LD A,E
POP HL
POP DE
POP BC
RET
;
STR_PANIC .DB "\r\n\r\n>>> PANIC: $"
STR_TSTPT .TEXT "\r\n+++ TSTPT: $"
STR_CONTINUE .TEXT " Continue? (Y/N): $"
;STR_AF .DB " AF=$"
;STR_BC .DB " BC=$"
;STR_DE .DB " DE=$"
;STR_HL .DB " HL=$"
;STR_PC .DB " PC=$"
;STR_SP .DB " SP=$"
;
; INDIRECT JUMP TO ADDRESS IN HL
;
@ -323,3 +397,25 @@ HEXCONV:
ADC A,40H
DAA
RET
;
; PRINT A BYTE BUFFER IN HEX POINTED TO BY DE
; REGISTER A HAS SIZE OF BUFFER
;
PRTHEXBUF:
OR A
RET Z ; EMPTY BUFFER
;
LD B,A
PRTHEXBUF1:
CALL PC_SPACE
LD A,(DE)
CALL PRTHEXBYTE
INC DE
DJNZ PRTHEXBUF1
RET
;
; PRIVATE STACK
;
UTSTKSAV .DW 0
.FILL $FF,64 ; 32 LEVEL PRIVATE STACK SPACE
UTPRVSTK .EQU $

54
Source/HBIOS/fd.asm

@ -390,19 +390,34 @@ FD_DISPATCH:
DEC A
JP Z,FD_FORMAT ; SUB-FUNC 6: FORMAT TRACK
DEC A
JP Z,FD_MEDIA ; SUB-FUNC 7: MEDIA REPORT
JP Z,FD_DEVICE ; SUB-FUNC 7: DEVICE REPORT
DEC A
JP Z,FD_DEFMED ; SUB-FUNC 8: DEFINE MEDIA
JP Z,FD_MEDIA ; SUB-FUNC 8: MEDIA REPORT
DEC A
JP Z,FD_CAP ; SUB-FUNC 9: REPORT CAPACITY
JP Z,FD_DEFMED ; SUB-FUNC 9: DEFINE MEDIA
DEC A
JP Z,FD_GEOM ; SUB-FUNC 10: REPORT GEOMETRY
JP Z,FD_CAP ; SUB-FUNC 10: REPORT CAPACITY
DEC A
JP Z,FD_GEOM ; SUB-FUNC 11: REPORT GEOMETRY
DEC A
DEC A
DEC A
DEC A
JP Z,NDIO_INFO ; SUB-FUNC 15: QUERY DISK SYSTEM INFO
;
FD_VERIFY:
FD_FORMAT:
FD_DEFMED:
CALL PANIC ; INVALID SUB-FUNCTION
;
;
;
FD_DEVICE:
LD D,DIODEV_FD ; D := DEVICE TYPE
LD E,C ; E := PHYSICAL UNIT
XOR A ; SIGNAL SUCCESS
RET
;
; FD_MEDIA
;
FD_MEDIA:
@ -549,6 +564,20 @@ FD_INIT:
LD A,FDC_MSR
CALL PRTHEXBYTE
PRTS(" UNITS=2$")
;
; SETUP THE DISPATCH TABLE ENTRIES
;
LD B,2 ; LOOP CONTROL
LD C,0 ; PHYSICAL UNIT INDEX
FD_INIT0:
PUSH BC ; SAVE LOOP CONTROL
LD B,C ; PHYSICAL UNIT
LD C,DIODEV_FD ; 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 FD_INIT0 ; LOOP UNTIL DONE
;
LD A,FDMEDIA
LD (FCD_U0MEDIA),A
@ -740,6 +769,18 @@ FD_SELECTUNIT:
;
;
FD_SEEK:
;CALL TSTPT ; *DEBUG*
;PUSH BC ; *DEBUG*
;CALL PC_COLON
;PUSH HL
;POP BC
;CALL PRTHEXWORD
;PUSH DE
;POP BC
;CALL PRTHEXWORD
;CALL PC_SPACE
;POP BC ; *DEBUG*
LD (HSTSEC),DE ; RECORD HEAD/SECTOR
LD (HSTTRK),HL ; RECORD TRACK
XOR A ; SIGNAL SUCCESS
@ -748,6 +789,7 @@ FD_SEEK:
;
;
FD_READ:
;CALL TSTPT ; *DEBUG*
LD (FD_DSKBUF),HL ; SAVE DISK BUFFER ADDRESS
LD A,DOP_READ
JR FD_RUN
@ -789,13 +831,15 @@ FD_RETRY:
PUSH BC
CALL FD_START
POP BC
;CALL TSTPT ; *DEBUG*
LD A,(FST_RC) ; CHECK RESULT
OR A
RET Z ; SUCCESS
;CALL TSTPT ; *DEBUG*
DJNZ FD_RETRY ; RETRY TILL COUNTER EXHAUSTED
#IF (FDTRACE == 1)
CALL FC_PRTRESULTS
#ENDIF

244
Source/HBIOS/hbios.asm

@ -697,6 +697,34 @@ IDLE:
;__________________________________________________________________________________________________
;
HB_DISPATCH:
; *DEBUG* START
#IF 1
; ADD RETURN HOOK ON TOP OF STACK
PUSH HL
LD HL,HB_DISPATCH_DBG1
EX (SP),HL
; JUMP OVER DBG1 TO CONTINUE NORMAL EXECUTION
JR HB_DISPATCH_DBG3
;
HB_DISPATCH_DBG1:
; EXECUTION COMES HERE ON RETURN
; CHECK STACK INTEGRITY
PUSH AF
LD A,(HBX_STACK - HBX_STKSIZ)
CP $FF
JR Z,HB_DISPATCH_DBG2
CALL PANIC
CALL CONTINUE
HB_DISPATCH_DBG2:
POP AF
RET
;
HB_DISPATCH_DBG3:
#ENDIF
; *DEBUG* END
;
LD A,B ; REQUESTED FUNCTION IS IN B
CP BF_CIO + $10 ; $00-$0F: CHARACTER I/O
JP C,CIO_DISPATCH
@ -709,7 +737,7 @@ HB_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
JP C,NDIO_NEWDISP
CP BF_SYS ; SKIP TO BF_SYS VALUE AT $F0
CALL C,PANIC ; PANIC IF LESS THAN BF_SYS
@ -872,7 +900,8 @@ 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
;CALL NDIO_DISPATCH ; DO IT
CALL NDIO_NEWDISP ; 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
@ -880,14 +909,15 @@ DIO_RW:
OR L ; FOR VALUE OF ZERO
CALL Z,PANIC ; ERROR IF DIOBUF NOT SET
LD DE,1 ; TRANSFER ONE SECTOR
JR NDIO_DISPATCH ; RETURN VIA DISPATCHER
;JP NDIO_DISPATCH ; RETURN VIA DISPATCHER
JP NDIO_NEWDISP ; RETURN VIA DISPATCHER
;
; DISK: SHIM FOR OLD STYLE STATUS CALL
;
DIO_STAT:
LD B,BF_NDIOSTATUS
JR NDIO_DISPATCH
;JP NDIO_DISPATCH ; RETURN VIA DISPATCHER
JP NDIO_NEWDISP ; RETURN VIA DISPATCHER
;
; DISK: SHIM FOR OLD STYLE MEDIA CALL
;
@ -895,7 +925,8 @@ DIO_MEDIA:
;
LD B,BF_NDIOMEDIA ; FORWARD TO MEDIA REPORT
LD E,%00000011 ; ENABLE MEDIA CHECK AND MEDIA DISCOVERY
CALL NDIO_DISPATCH ; CALL NEW VERSION
;CALL NDIO_DISPATCH ; CALL NEW VERSION
CALL NDIO_NEWDISP ; CALL NEW VERSION
LD A,E ; MOVE RESULTANT MEDIA ID TO A
OR A ; SET FLAGS
RET ; DONE
@ -923,28 +954,14 @@ DIO_SETBUF:
; 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
LD C,0 ; INFO SUB-FN=0, REPORT UNIT COUNT
JP NDIO_INFO ; FORWARD TO NEW DIO INFO FUNCTION
;
; 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
LD B,BF_NDIODEVICE ; FN: REPORT DEVICE INFO
JP NDIO_NEWDISP ; RETURN VIA DISPATCHER
;
;==================================================================================================
; DISK I/O DEVICE DISPATCHER
@ -956,6 +973,34 @@ NDIO_DISPATCH:
;LD (HSTDSK),A ; TEMP HACK TO FILL IN HSTDSK
AND $F0 ; ISOLATE THE DEVICE PORTION
;
NDIO_DISPATCH2:
; *DEBUG* START
#IF 0
; DUMP INCOMING CALL
CALL NEWLINE
PRTS("NDIO>$")
CALL REGDMP
; ADD RETURN HOOK ON TOP OF STACK
PUSH HL
LD HL,NDIO_DISPATCH_DBG1
EX (SP),HL
; JUMP OVER DBG1 TO CONTINUE NORMAL EXECUTION
JR NDIO_DISPATCH_DBG2
;
NDIO_DISPATCH_DBG1:
; EXECTION COMES HERE ON RETURN
; DUMP CALL RESULTS AND RETURN
PRTS("NDIO<$")
CALL REGDMP
RET
;
NDIO_DISPATCH_DBG2:
#ENDIF
; *DEBUG* END
;
#IF (MDENABLE)
CP DIODEV_MD
JP Z,MD_DISPATCH
@ -993,6 +1038,7 @@ NDIO_DISPATCH:
JP Z,HDSK_DISPATCH
#ENDIF
CALL PANIC
;
; CONVERT AN HBIOS STANDARD HARD DISK CHS ADDRESS TO
; AN LBA ADDRESS. A STANDARD HBIOS HARD DISK IS ASSUMED
@ -1050,6 +1096,119 @@ HB_CHS2LBA:
XOR A
RET
;
; DISK DEVICE TABLE
;
; TABLE IS BUILT DYNAMICALLY BY EACH DRIVER DURING INITIALIZATION.
; THE TABLE IS PREFIXED BY TWO BYTES. TABLE - 1 CONTAINS THE CURRENT
; NUMBER OF ENTRIES. TABLE - 2 CONTAINS THE MAXIMUM NUMBER OF ENTRIES.
; EACH ENTRY IS DEFINED AS:
;
; BYTE DEVICE TYPE ID
; BYTE UNIT INDEX
; WORD UNIT DATA ADDRESS
;
DIO_MAX .EQU 16 ; UP TO 16 UNITS
DIO_SIZ .EQU DIO_MAX * 4 ; EACH ENTRY IS 4 BYTES
;
.DB DIO_MAX ; MAX ENTRY COUNT TABLE PREFIX
DIO_CNT .DB 0 ; ENTRY COUNT PREFIX
DIO_TBL .FILL DIO_SIZ,0 ; SPACE FOR ENTRIES
;
; DISK DRIVER DISPATCHING
; C=LOGICAL UNIT NUMBER (INDEX INTO DIO_TBL)
;
;NDIO_NEWDISP:
; ;HALT
; ; START OF THE ACTUAL DRIVER DISPATCHING LOGIC
; PUSH IY ; SAVE ORIGINAL IY
; PUSH HL ; SAVE HL
; LD HL,NDIO_RET ; GET RETURN VECTOR
; EX (SP),HL ; RECOVER HL & PUT RETURN VECTOR ON TOS
; PUSH HL ; SAVE HL
; LD HL,DIO_TBL ; POINT TO DISPATCH TABLE
; LD A,C ; GET REQUESTED UNIT FROM C
; RLCA ; MULTIPLY UNIT BY 4
; RLCA ; ... TO GET BYTE OFFSET OF ENTRY
; CALL ADDHLA ; HL -> ENTRY ADDRESS
; LD A,(HL) ; DRIVER ID TO A
; PUSH AF ; SAVE IT FOR NOW
; INC HL ; POINT TO UNIT
; LD C,(HL) ; PUT IT IN C FOR DRIVER
; INC HL ; POINT TO LSB OF UNIT DATA ADDRESS
; LD A,(HL) ; HL := UNIT DATA ADDRESS
; INC HL ; ...
; LD H,(HL) ; ...
; LD L,A ; ...
; POP AF ; RECOVER DRIVER ID
; EX (SP),HL ; RECOVER ORIG HL & PUT UNIT DATA ADDRESS TO TOS
; POP IY ; IY := UNIT DATA ADDRESS
; JP NDIO_DISPATCH2 ; USE LEGACY DISPATCHER
;;
;NDIO_RET:
; POP IY ; RECOVER IY
; OR A ; MAKE SURE FLAGS ARE SET
; RET ; AND RETURN
NDIO_NEWDISP:
PUSH HL
LD HL,DIO_TBL
LD A,C
RLCA
RLCA
CALL ADDHLA
LD A,(HL)
PUSH AF ; SAVE DEVICE TYPE
INC HL
LD C,(HL) ; DEVICE UNIT INDEX TO C
POP AF ; RECOVER DEVICE TYPE
POP HL
CALL NDIO_DISPATCH2
RET
;
; DISK SYSTEM INFORMATION FUNCTIONS
; ALL DISK DRIVERS SHOULD FORWARD FUNCTION $1F HERE
; SUB-FUNCTION IS IN C
;
NDIO_INFO:
LD A,C ; LOAD SUB-FUNCTION
CP 0 ; FN=0, REPORT UNIT COUNT
JR Z,NDIO_INFO0 ; DO IT
; ADD NEW FUNCS ADDED HERE
OR $FF ; SIGNAL ERROR
RET ; AND DONE
;
NDIO_INFO0: ; REPORT UNIT COUNT
LD A,(DIO_CNT) ; LOAD THE COUNT
LD B,A ; PUT IT IN B
XOR A ; SIGNAL SUCCESS
RET
;
; ADD AN ENTRY TO THE DIO DISPATCH TABLE
; C: DEVICE TYPE ID
; B: UNIT INDEX
; DE: ADDRESS OF UNIT DATA
;
DIO_ADDENT:
LD HL,DIO_TBL ; POINT TO TABLE
DEC HL ; POINT TO ENTRY COUNT
LD A,(HL) ; GET ENTRY COUNT
INC A ; INCREMENT TO ACCOUNT FOR NEW ENTRY
DEC HL ; POINT TO ENTRY MAX
CP (HL) ; COMPARE MAX TO CURRENT COUNT (COUNT - MAX)
CALL NC,PANIC ; OVERFLOW
INC HL ; POINT TO COUNT
LD (HL),A ; SAVE NEW COUNT
INC HL ; POINT TO START OF TABLE
DEC A ; CONVERT A FROM ENTRY COUNT TO ENTRY INDEX
RLCA ; MULTIPLY BY 4
RLCA ; ... TO GET BYTE OFFSET OF ENTRY
CALL ADDHLA ; MAKE HL POINT TO ACTUAL ENTRY ADDRESS
PUSH BC ; GET TABLE ENTRY ADDRESS TO BC
EX (SP),HL ; ... AND DISPATCH ADDRESS TO HL
POP BC ; ... SO THAT DE:HL HAS 32 BIT ENTRY
CALL ST32 ; LD (BC),DE:HL STORES THE ENTRY
RET
;
;==================================================================================================
; REAL TIME CLOCK DEVICE DISPATCHER
;==================================================================================================
@ -1286,6 +1445,43 @@ SYS_GETBNK:
SYS_COPY:
PUSH IX
POP BC
;; *DEBUG* START
;PUSH AF
;PUSH BC
;PUSH DE
;PUSH HL
;
;CALL NEWLINE
;
;LD A,(HB_SRCBNK)
;CALL PRTHEXBYTE
;CALL PC_COLON
;PUSH BC
;PUSH HL
;POP BC
;CALL PRTHEXWORD
;POP BC
;CALL PC_SPACE
;LD A,(HB_DSTBNK)
;CALL PRTHEXBYTE
;CALL PC_COLON
;PUSH BC
;PUSH DE
;POP BC
;CALL PRTHEXWORD
;POP BC
;CALL PC_SPACE
;CALL PRTHEXWORD
;POP HL
;POP DE
;POP BC
;POP AF
; *DEBUG* END
CALL BNKCPY
XOR A
RET

24
Source/HBIOS/hbios.inc

@ -23,17 +23,19 @@ BF_DIOGETCNT .EQU BF_DIO + 10 ; DISK DEVICE COUNT
BF_DIOGETINF .EQU BF_DIO + 11 ; DISK DEVICE INFO
;
BF_NDIO .EQU $50
BF_NDIOSTATUS .EQU BF_DIO + 0 ; DISK STATUS
BF_NDIORESET .EQU BF_DIO + 1 ; DISK RESET
BF_NDIOSEEK .EQU BF_DIO + 2 ; DISK SEEK
BF_NDIOREAD .EQU BF_DIO + 3 ; DISK READ SECTORS
BF_NDIOWRITE .EQU BF_DIO + 4 ; DISK WRITE SECTORS
BF_NDIOVERIFY .EQU BF_DIO + 5 ; DISK VERIFY SECTORS
BF_NDIOFORMAT .EQU BF_DIO + 6 ; DISK FORMAT TRACK
BF_NDIOMEDIA .EQU BF_DIO + 7 ; DISK MEDIA REPORT
BF_NDIODEFMED .EQU BF_DIO + 8 ; DEFINE DISK MEDIA
BF_NDIOCAP .EQU BF_DIO + 9 ; DISK CAPACITY REPORT
BF_NDIOGEOM .EQU BF_DIO + 10 ; DISK GEOMETRY REPORT
BF_NDIOSTATUS .EQU BF_NDIO + 0 ; DISK STATUS
BF_NDIORESET .EQU BF_NDIO + 1 ; DISK RESET
BF_NDIOSEEK .EQU BF_NDIO + 2 ; DISK SEEK
BF_NDIOREAD .EQU BF_NDIO + 3 ; DISK READ SECTORS
BF_NDIOWRITE .EQU BF_NDIO + 4 ; DISK WRITE SECTORS
BF_NDIOVERIFY .EQU BF_NDIO + 5 ; DISK VERIFY SECTORS
BF_NDIOFORMAT .EQU BF_NDIO + 6 ; DISK FORMAT TRACK
BF_NDIODEVICE .EQU BF_NDIO + 7 ; DISK DEVICE REPORT
BF_NDIOMEDIA .EQU BF_NDIO + 8 ; DISK MEDIA REPORT
BF_NDIODEFMED .EQU BF_NDIO + 9 ; DEFINE DISK MEDIA
BF_NDIOCAP .EQU BF_NDIO + 10 ; DISK CAPACITY REPORT
BF_NDIOGEOM .EQU BF_NDIO + 11 ; DISK GEOMETRY REPORT
BF_NDIOINFO .EQU BF_NDIO + 15 ; DISK SYSTEM INFO QUERY
;
BF_RTC .EQU $20
BF_RTCGETTIM .EQU BF_RTC + 0 ; GET TIME

38
Source/HBIOS/hdsk.asm

@ -1,4 +1,3 @@
;
;==================================================================================================
; HDSK DISK DRIVER
@ -24,6 +23,20 @@ HDSK_INIT:
PRTS("HDSK: UNITS=$")
LD A,HDSKCNT
CALL PRTDECB
;
; SETUP THE DISPATCH TABLE ENTRIES
;
LD B,HDSKCNT ; LOOP CONTROL
LD C,0 ; PHYSICAL UNIT INDEX
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
;
XOR A
DEC A ; INITIAL STATUS IS NOT READY $FF
@ -58,13 +71,20 @@ HDSK_DISPATCH:
DEC A
JP Z,HDSK_FORMAT ; SUB-FUNC 6: FORMAT TRACK
DEC A
JP Z,HDSK_MEDIA ; SUB-FUNC 7: MEDIA REPORT
JP Z,HDSK_DEVICE ; SUB-FUNC 7: DEVICE REPORT
DEC A
JP Z,HDSK_MEDIA ; SUB-FUNC 8: MEDIA REPORT
DEC A
JP Z,HDSK_DEFMED ; SUB-FUNC 9: DEFINE MEDIA
DEC A
JP Z,HDSK_CAP ; SUB-FUNC 10: REPORT CAPACITY
DEC A
JP Z,HDSK_GEOM ; SUB-FUNC 11: REPORT GEOMETRY
DEC A
DEC A
DEC A
DEC A
JP Z,NDIO_INFO ; SUB-FUNC 15: QUERY DISK SYSTEM INFO
;
HDSK_VERIFY:
HDSK_FORMAT:
@ -111,6 +131,14 @@ HDSK_GEOM:
;
;
;
HDSK_DEVICE:
LD D,DIODEV_HDSK ; D := DEVICE TYPE
LD E,C ; E := PHYSICAL UNIT
XOR A ; SIGNAL SUCCESS
RET
;
;
;
HDSK_MEDIA:
LD E,MID_HD ; HARD DISK MEDIA
LD D,0 ; D:0=0 MEANS NO MEDIA CHANGE
@ -159,7 +187,7 @@ HDSK_RW:
; SET DEVICE
LD A,(HDSK_UNIT)
;AND $0F
LD (HDSK_DEVICE),A
LD (HDSK_DEV),A
; ; INCOMING TRK:SEC ACTUALLY REPRESENTS 32 BIT LBA
; ; MAP TRK:SEC TO HDSK DRIVER AS TTSS:SS
@ -287,7 +315,7 @@ HDSK_PRTCMD:
HDSK_PRTRW:
CALL PC_SPACE
LD A,(HDSK_DEVICE)
LD A,(HDSK_DEV)
CALL PRTHEXBYTE
CALL PC_SPACE
LD BC,(HDSK_TRK)
@ -350,7 +378,7 @@ 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_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

55
Source/HBIOS/ide.asm

@ -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
;
@ -217,6 +217,20 @@ IDE_TOFAST .EQU 10 ; FAST TIMEOUT IS 0.5 SECS
;
IDE_INIT:
PRTS("IDE:$") ; LABEL FOR IO ADDRESS
;
; SETUP THE DISPATCH TABLE ENTRIES
;
LD B,IDE_UNITCNT ; LOOP CONTROL
LD C,0 ; PHYSICAL UNIT INDEX
IDE_INIT0:
PUSH BC ; SAVE LOOP CONTROL
LD B,C ; PHYSICAL UNIT
LD C,DIODEV_IDE ; 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 IDE_INIT0 ; LOOP UNTIL DONE
;
; COMPUTE CPU SPEED COMPENSATED TIMEOUT SCALER
; AT 1MHZ, THE SCALER IS 961 (50000US / 52TS = 961)
@ -332,13 +346,20 @@ IDE_DISPATCH:
DEC A
JP Z,IDE_FORMAT ; SUB-FUNC 6: FORMAT TRACK
DEC A
JP Z,IDE_MEDIA ; SUB-FUNC 7: MEDIA REPORT
JP Z,IDE_DEVICE ; SUB-FUNC 7: DEVICE REPORT
DEC A
JP Z,IDE_MEDIA ; SUB-FUNC 8: MEDIA REPORT
DEC A
JP Z,IDE_DEFMED ; SUB-FUNC 9: DEFINE MEDIA
DEC A
JP Z,IDE_CAP ; SUB-FUNC 10: REPORT CAPACITY
DEC A
JP Z,IDE_GEOM ; SUB-FUNC 11: REPORT GEOMETRY
DEC A
JP Z,IDE_DEFMED ; SUB-FUNC 8: DEFINE MEDIA
DEC A
JP Z,IDE_CAP ; SUB-FUNC 9: REPORT CAPACITY
DEC A
JP Z,IDE_GEOM ; SUB-FUNC 10: REPORT GEOMETRY
DEC A
JP Z,NDIO_INFO ; SUB-FUNC 15: QUERY DISK SYSTEM INFO
;
IDE_VERIFY:
IDE_FORMAT:
@ -376,6 +397,14 @@ IDE_STATUS:
OR A ; SET FLAGS
RET ; AND RETURN
;
;
;
IDE_DEVICE:
LD D,DIODEV_IDE ; D := DEVICE TYPE
LD E,C ; E := PHYSICAL UNIT
XOR A ; SIGNAL SUCCESS
RET
;
; IDE_GETMED
;
IDE_MEDIA:
@ -461,7 +490,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
;
@ -476,7 +505,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
@ -498,7 +527,7 @@ 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
@ -520,7 +549,7 @@ 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

44
Source/HBIOS/md.asm

@ -16,11 +16,31 @@ MD_INIT:
LD HL,RAMSIZE - 128
CALL PRTDEC
PRTS("KB$")
;
; SETUP THE DISPATCH TABLE ENTRIES
;
LD B,$01 ; PHYSICAL UNIT=1 (RAM)
LD C,DIODEV_MD ; DEVICE TYPE
LD DE,MD_RAMDAT ; UNIT 1 DATA BLOB ADDRESS
CALL DIO_ADDENT ; ADD ENTRY
LD B,$00 ; PHYSICAL UNIT=0 (ROM)
LD C,DIODEV_MD ; DEVICE TYPE
LD DE,MD_ROMDAT ; UNIT 0 DATA BLOB ADDRESS
CALL DIO_ADDENT ; ADD ENTRY
;
XOR A ; INIT SUCCEEDED
RET ; RETURN
;
;
;
MD_ROMDAT: ; ROM UNIT DATA BLOB
.DB 0 ; UNIT NUMBER IS 0
;
MD_RAMDAT: ; RAM UNIT DATA BLOB
.DB 0 ; UNIT NUMBER IS 1
;
;
;
MD_DISPATCH:
; VERIFY AND SAVE THE TARGET DEVICE/UNIT LOCALLY IN DRIVER
LD A,C ; DEVICE/UNIT FROM C
@ -46,13 +66,21 @@ MD_DISPATCH:
DEC A
JP Z,MD_FORMAT ; SUB-FUNC 6: FORMAT TRACK
DEC A
JP Z,MD_MEDIA ; SUB-FUNC 7: MEDIA REPORT
JP Z,MD_DEVICE ; SUB-FUNC 7: DEVICE REPORT
DEC A
JP Z,MD_MEDIA ; SUB-FUNC 8: MEDIA REPORT
DEC A
JP Z,MD_DEFMED ; SUB-FUNC 9: DEFINE MEDIA
DEC A
JP Z,MD_DEFMED ; SUB-FUNC 8: DEFINE MEDIA
JP Z,MD_CAP ; SUB-FUNC 10: REPORT CAPACITY
DEC A
JP Z,MD_CAP ; SUB-FUNC 9: REPORT CAPACITY
JP Z,MD_GEOM ; SUB-FUNC 11: REPORT GEOMETRY
DEC A
JP Z,MD_GEOM ; SUB-FUNC 10: REPORT GEOMETRY
DEC A
DEC A
DEC A
JP Z,NDIO_INFO ; SUB-FUNC 15: QUERY DISK SYSTEM INFO
;
MD_VERIFY:
MD_FORMAT:
@ -112,6 +140,14 @@ MD_GEOM1:
;
;
;
MD_DEVICE:
LD D,DIODEV_MD ; D := DEVICE TYPE
LD E,C ; E := PHYSICAL UNIT
XOR A ; SIGNAL SUCCESS
RET
;
;
;
MD_MEDIA:
LD A,MID_MDROM ; SET MEDIA TYPE TO ROM
ADD A,C ; ADJUST BASED ON DEVICE

37
Source/HBIOS/ppide.asm

@ -220,6 +220,20 @@ PPIDE_TOFAST .EQU 10 ; FAST TIMEOUT IS 0.5 SECS
;
PPIDE_INIT:
PRTS("PPIDE:$") ; LABEL FOR IO ADDRESS
;
; SETUP THE DISPATCH TABLE ENTRIES
;
LD B,PPIDE_UNITCNT ; LOOP CONTROL
LD C,0 ; PHYSICAL UNIT INDEX
PPIDE_INIT0:
PUSH BC ; SAVE LOOP CONTROL
LD B,C ; PHYSICAL UNIT
LD C,DIODEV_PPIDE ; 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 PPIDE_INIT0 ; LOOP UNTIL DONE
;
; COMPUTE CPU SPEED COMPENSATED TIMEOUT SCALER
; AT 1MHZ, THE SCALER IS 218 (50000US / 229TS = 218)
@ -327,13 +341,20 @@ PPIDE_DISPATCH:
DEC A
JP Z,PPIDE_FORMAT ; SUB-FUNC 6: FORMAT TRACK
DEC A
JP Z,PPIDE_MEDIA ; SUB-FUNC 7: MEDIA REPORT
JP Z,PPIDE_DEVICE ; SUB-FUNC 7: DEVICE REPORT
DEC A
JP Z,PPIDE_MEDIA ; SUB-FUNC 8: MEDIA REPORT
DEC A
JP Z,PPIDE_DEFMED ; SUB-FUNC 9: DEFINE MEDIA
DEC A
JP Z,PPIDE_CAP ; SUB-FUNC 10: REPORT CAPACITY
DEC A
JP Z,PPIDE_GEOM ; SUB-FUNC 11: REPORT GEOMETRY
DEC A
DEC A
JP Z,PPIDE_DEFMED ; SUB-FUNC 8: DEFINE MEDIA
DEC A
JP Z,PPIDE_CAP ; SUB-FUNC 9: REPORT CAPACITY
DEC A
JP Z,PPIDE_GEOM ; SUB-FUNC 10: REPORT GEOMETRY
JP Z,NDIO_INFO ; SUB-FUNC 15: QUERY DISK SYSTEM INFO
;
PPIDE_VERIFY:
PPIDE_FORMAT:
@ -391,6 +412,14 @@ PPIDE_SENSE:
LD E,MID_NONE ; SIGNAL NO MEDA
RET ; AND RETURN
;
;
;
PPIDE_DEVICE:
LD D,DIODEV_PPIDE ; D := DEVICE TYPE
LD E,C ; E := PHYSICAL UNIT
XOR A ; SIGNAL SUCCESS
RET
;
; IDE_GETMED
;
PPIDE_MEDIA:

46
Source/HBIOS/ppp.asm

@ -337,6 +337,14 @@ PPPSD_STWRTPROT .EQU -10 ; ATTEMPT TO WRITE TO WRITE PROTECTED MEDIA
; SD CARD INITIALIZATION
;
PPPSD_INIT:
;
; SETUP THE DISPATCH TABLE ENTRIES
;
LD B,0 ; PHYSICAL UNIT
LD C,DIODEV_PPPSD ; DEVICE TYPE
LD DE,0 ; UNIT DATA BLOB ADDRESS
CALL DIO_ADDENT ; ADD ENTRY, BC IS NOT DESTROYED
;
; REINITIALIZE THE CARD HERE
CALL PPPSD_INITCARD
#IF (PPPSDTRACE < 2)
@ -379,27 +387,35 @@ PPPSD_DISPATCH:
; DISPATCH ACCORDING TO DISK SUB-FUNCTION
LD A,B ; GET REQUESTED FUNCTION
AND $0F ; ISOLATE SUB-FUNCTION
JP Z,MD_STATUS ; SUB-FUNC 0: STATUS
JP Z,PPPSD_STATUS ; SUB-FUNC 0: STATUS
DEC A
JP Z,PPPSD_RESET ; SUB-FUNC 1: RESET
DEC A
JP Z,PPPSD_SEEK ; SUB-FUNC 2: SEEK
DEC A
JP Z,PPPSD_READ ; SUB-FUNC 3: READ SECTORS
DEC A
JP Z,PPPSD_WRITE ; SUB-FUNC 4: WRITE SECTORS
DEC A
JP Z,MD_RESET ; SUB-FUNC 1: RESET
JP Z,PPPSD_VERIFY ; SUB-FUNC 5: VERIFY SECTORS
DEC A
JP Z,MD_SEEK ; SUB-FUNC 2: SEEK
JP Z,PPPSD_FORMAT ; SUB-FUNC 6: FORMAT TRACK
DEC A
JP Z,MD_READ ; SUB-FUNC 3: READ SECTORS
JP Z,PPPSD_DEVICE ; SUB-FUNC 7: DEVICE REPORT
DEC A
JP Z,MD_WRITE ; SUB-FUNC 4: WRITE SECTORS
JP Z,PPPSD_MEDIA ; SUB-FUNC 8: MEDIA REPORT
DEC A
JP Z,MD_VERIFY ; SUB-FUNC 5: VERIFY SECTORS
JP Z,PPPSD_DEFMED ; SUB-FUNC 9: DEFINE MEDIA
DEC A
JP Z,MD_FORMAT ; SUB-FUNC 6: FORMAT TRACK
JP Z,PPPSD_CAP ; SUB-FUNC 10: REPORT CAPACITY
DEC A
JP Z,MD_MEDIA ; SUB-FUNC 7: MEDIA REPORT
JP Z,PPPSD_GEOM ; SUB-FUNC 11: REPORT GEOMETRY
DEC A
JP Z,MD_DEFMED ; SUB-FUNC 8: DEFINE MEDIA
DEC A
JP Z,MD_CAP ; SUB-FUNC 9: REPORT CAPACITY
DEC A
JP Z,MD_GEOM ; SUB-FUNC 10: REPORT GEOMETRY
DEC A
JP Z,NDIO_INFO ; SUB-FUNC 15: QUERY DISK SYSTEM INFO
;
PPPSD_VERIFY:
PPPSD_FORMAT:
PPPSD_DEFMED:
@ -539,6 +555,14 @@ PPPSD_RESET:
XOR A ; ALWAYS OK
RET
;
;
;
PPPSD_DEVICE:
LD D,DIODEV_PPPSD ; D := DEVICE TYPE
LD E,C ; E := PHYSICAL UNIT
XOR A ; SIGNAL SUCCESS
RET
;
; SETUP FOR SUBSEQUENT ACCESS
; INIT CARD IF NOT READY OR ON DRIVE LOG IN
;

31
Source/HBIOS/prp.asm

@ -236,6 +236,14 @@ PRPSD_STWRTPROT .EQU -10 ; ATTEMPT TO WRITE TO WRITE PROTECTED MEDIA
; SD CARD INITIALIZATION
;
PRPSD_INIT:
;
; SETUP THE DISPATCH TABLE ENTRIES
;
LD B,0 ; PHYSICAL UNIT
LD C,DIODEV_PRPSD ; DEVICE TYPE
LD DE,0 ; UNIT DATA BLOB ADDRESS
CALL DIO_ADDENT ; ADD ENTRY, BC IS NOT DESTROYED
;
; REINITIALIZE THE CARD HERE
CALL PRPSD_INITCARD
#IF (PRPSDTRACE < 2)
@ -291,13 +299,20 @@ PRPSD_DISPATCH:
DEC A
JP Z,PRPSD_FORMAT ; SUB-FUNC 6: FORMAT TRACK
DEC A
JP Z,PRPSD_MEDIA ; SUB-FUNC 7: MEDIA REPORT
JP Z,PRPSD_DEVICE ; SUB-FUNC 7: DEVICE REPORT
DEC A
JP Z,PRPSD_MEDIA ; SUB-FUNC 8: MEDIA REPORT
DEC A
JP Z,PRPSD_DEFMED ; SUB-FUNC 9: DEFINE MEDIA
DEC A
JP Z,PRPSD_CAP ; SUB-FUNC 10: REPORT CAPACITY
DEC A
JP Z,PRPSD_GEOM ; SUB-FUNC 11: REPORT GEOMETRY
DEC A
JP Z,PRPSD_DEFMED ; SUB-FUNC 8: DEFINE MEDIA
DEC A
JP Z,PRPSD_CAP ; SUB-FUNC 9: REPORT CAPACITY
DEC A
JP Z,PRPSD_GEOM ; SUB-FUNC 10: REPORT GEOMETRY
DEC A
JP Z,NDIO_INFO ; SUB-FUNC 15: QUERY DISK SYSTEM INFO
;
PRPSD_VERIFY:
PRPSD_FORMAT:
@ -402,6 +417,14 @@ PRPSD_RESET:
XOR A ; ALWAYS OK
RET
;
;
;
PRPSD_DEVICE:
LD D,DIODEV_PRPSD ; D := DEVICE TYPE
LD E,C ; E := PHYSICAL UNIT
XOR A ; SIGNAL SUCCESS
RET
;
; PRPSD_SENSE
;
PRPSD_MEDIA:

40
Source/HBIOS/rf.asm

@ -21,6 +21,23 @@ RF_INIT:
PRTS("RF: UNITS=$")
LD A,RFCNT
CALL PRTDECB
;
; SETUP THE DISPATCH TABLE ENTRIES
;
;
; SETUP THE DISPATCH TABLE ENTRIES
;
LD B,RFCNT ; LOOP CONTROL
LD C,0 ; PHYSICAL UNIT INDEX
RF_INIT0:
PUSH BC ; SAVE LOOP CONTROL
LD B,C ; PHYSICAL UNIT
LD C,DIODEV_RF ; 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 RF_INIT0 ; LOOP UNTIL DONE
;
XOR A ; INIT SUCCEEDED
RET ; RETURN
@ -52,13 +69,20 @@ RF_DISPATCH:
DEC A
JP Z,RF_FORMAT ; SUB-FUNC 6: FORMAT TRACK
DEC A
JP Z,RF_MEDIA ; SUB-FUNC 7: MEDIA REPORT
JP Z,RF_DEVICE ; SUB-FUNC 7: DEVICE REPORT
DEC A
JP Z,RF_MEDIA ; SUB-FUNC 8: MEDIA REPORT
DEC A
JP Z,RF_DEFMED ; SUB-FUNC 9: DEFINE MEDIA
DEC A
JP Z,RF_CAP ; SUB-FUNC 10: REPORT CAPACITY
DEC A
JP Z,RF_DEFMED ; SUB-FUNC 8: DEFINE MEDIA
JP Z,RF_GEOM ; SUB-FUNC 11: REPORT GEOMETRY
DEC A
JP Z,RF_CAP ; SUB-FUNC 9: REPORT CAPACITY
DEC A
JP Z,RF_GEOM ; SUB-FUNC 10: REPORT GEOMETRY
DEC A
DEC A
JP Z,NDIO_INFO ; SUB-FUNC 15: QUERY DISK SYSTEM INFO
;
RF_VERIFY:
RF_FORMAT:
@ -105,6 +129,14 @@ RF_GEOM:
;
;
;
RF_DEVICE:
LD D,DIODEV_RF ; D := DEVICE TYPE
LD E,C ; E := PHYSICAL UNIT
XOR A ; SIGNAL SUCCESS
RET
;
;
;
RF_MEDIA:
LD E,MID_RF ; RAM FLOPPY MEDIA
LD D,0 ; D:0=0 MEANS NO MEDIA CHANGE

24
Source/HBIOS/romldr.asm

@ -220,8 +220,8 @@ GOCPM2:
RST 08 ; CALL UNA
#ELSE
LD B,BF_SYSHCBPUTW ; HB FUNC: PUT HCB WORD
LD C,HCB_BOOTVOL ; BOOT VOLUME (DEV/UNIT, SLICE)
LD DE,$0000
LD C,HCB_BOOTVOL ; BOOT VOLUME (UNIT, SLICE)
LD DE,$0100
RST 08
#ENDIF
JP CPM_ENT
@ -442,12 +442,8 @@ UDEVUNK .DB "UNK$"
CP B ; CHECK MAX (INDEX - COUNT)
JP NC,DB_NODISK ; HANDLE INVALID SELECTION
; GET DEVICE/UNIT, LU
LD B,BF_DIOGETINF ; HBIOS FUNC: DEVICE INFO
LD A,(BL_BOOTID) ; GET BOOT DEVICE ID
LD C,A ; PUT IN C
RST 08 ; CALL HBIOS, DEV INFO TO C
LD A,C ; DEVICE/UNIT TO A
; SET THE BOOT UNIT AND SLICE
LD A,(BL_BOOTID) ; GET BOOTID
LD (BL_DEVICE),A ; STORE IT
XOR A ; LU ALWAYS ZERO
LD (BL_LU),A ; STORE IT
@ -716,16 +712,16 @@ PRTALL1:
PUSH BC ; SAVE LOOP CONTROL
LD B,BF_DIOGETINF ; HBIOS FUNC: DEVICE INFO
RST 08 ; CALL HBIOS
LD D,C ; DEVICE/UNIT TO D
LD E,0 ; LU IS ZERO
;LD D,C ; DEVICE/UNIT TO D
;LD E,0 ; LU IS ZERO
CALL PRTDRV ; PRINT IT
POP BC ; RESTORE LOOP CONTROL
INC C ; BUMP INDEX
DJNZ PRTALL1 ; LOOP AS NEEDED
RET ; DONE
;
; PRINT THE DEVICE/UNIT/LU INFO
; ON INPUT D HAS DEVICE/UNIT, E HAS LU
; PRINT THE DRIVER DEVICE/UNIT INFO
; ON INPUT D HAS DRIVER ID, E HAS DRIVER MODE/UNIT
; DESTROY NO REGISTERS OTHER THAN A
;
PRTDRV:
@ -747,10 +743,10 @@ PRTDRV:
CALL WRITESTR ; PRINT THE DEVICE NMEMONIC
POP HL ; RECOVER HL
POP DE ; RECOVER DE
LD A,D ; LOAD DEVICE/UNIT
LD A,E ; LOAD DRIVER MODE/UNIT
AND $0F ; ISOLATE UNIT
CALL PRTDECB ; PRINT IT
CALL PC_COLON ; FORMATTING
; CALL PC_COLON ; FORMATTING
; LD A,E ; LOAD LU
; CALL PRTDECB ; PRINT IT
RET

37
Source/HBIOS/sd.asm

@ -216,6 +216,20 @@ SD_CAPACITY .EQU 2 ; CARD CAPACITY (1 DWORD/4 BYTES)
SD_INIT:
PRTS("SD:$")
;
; SETUP THE DISPATCH TABLE ENTRIES
;
LD B,SD_UNITCNT ; LOOP CONTROL
LD C,0 ; PHYSICAL UNIT INDEX
SD_INIT0:
PUSH BC ; SAVE LOOP CONTROL
LD B,C ; PHYSICAL UNIT
LD C,DIODEV_SD ; 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 SD_INIT0 ; LOOP UNTIL DONE
;
#IF (SDMODE == SDMODE_JUHA)
PRTS(" MODE=JUHA$")
PRTS(" IO=0x$")
@ -430,13 +444,20 @@ SD_DISPATCH:
DEC A
JP Z,SD_FORMAT ; SUB-FUNC 6: FORMAT TRACK
DEC A
JP Z,SD_MEDIA ; SUB-FUNC 7: MEDIA REPORT
JP Z,SD_DEVICE ; SUB-FUNC 7: DEVICE REPORT
DEC A
JP Z,SD_MEDIA ; SUB-FUNC 8: MEDIA REPORT
DEC A
JP Z,SD_DEFMED ; SUB-FUNC 9: DEFINE MEDIA
DEC A
JP Z,SD_CAP ; SUB-FUNC 10: REPORT CAPACITY
DEC A
JP Z,SD_GEOM ; SUB-FUNC 11: REPORT GEOMETRY
DEC A
JP Z,SD_DEFMED ; SUB-FUNC 8: DEFINE MEDIA
DEC A
JP Z,SD_CAP ; SUB-FUNC 9: REPORT CAPACITY
DEC A
JP Z,SD_GEOM ; SUB-FUNC 10: REPORT GEOMETRY
DEC A
JP Z,NDIO_INFO ; SUB-FUNC 15: QUERY DISK SYSTEM INFO
;
SD_VERIFY:
SD_FORMAT:
@ -492,6 +513,14 @@ SD_RESET:
;
;
;
SD_DEVICE:
LD D,DIODEV_SD ; D := DEVICE TYPE
LD E,C ; E := PHYSICAL UNIT
XOR A ; SIGNAL SUCCESS
RET
;
;
;
SD_MEDIA:
LD A,E ; GET FLAGS
OR A ; SET FLAGS

156
Source/HBIOS/util.asm

@ -310,48 +310,107 @@ WRITESTR2:
POP AF
RET
;
; PANIC: TRY TO DUMP MACHINE STATE AND HALT
;
;
TSTPT:
PUSH DE
LD DE,STR_TSTPT
CALL WRITESTR
POP DE
JR REGDMP ; DUMP REGISTERS AND RETURN
;
; PANIC: TRY TO DUMP MACHINE STATE
;
PANIC:
PUSH HL
PUSH DE
PUSH BC
PUSH AF
LD DE,STR_PANIC
CALL WRITESTR
LD DE,STR_AF
CALL WRITESTR
POP BC ; AF
CALL PRTHEXWORD
LD DE,STR_BC
CALL WRITESTR
POP BC ; BC
CALL PRTHEXWORD
LD DE,STR_DE
CALL WRITESTR
POP BC ; DE
CALL PRTHEXWORD
LD DE,STR_HL
CALL WRITESTR
POP BC ; HL
CALL PRTHEXWORD
LD DE,STR_PC
CALL WRITESTR
POP BC ; PC
CALL PRTHEXWORD
LD DE,STR_SP
CALL WRITESTR
LD HL,0
ADD HL,SP ; SP
LD B,H
LD C,L
POP DE
JR REGDMP ; DUMP REGISTERS AND RETURN
;
;
;
REGDMP:
EX (SP),HL ; RET ADR TO HL, SAVE HL ON TOS
LD (REGDMP_PC),HL ; SAVE RET IS PC REG VALUE, SAVE IT
EX (SP),HL ; BACK THE WAY IT WAS
LD (UTSTKSAV),SP ; SAVE ORIGINAL STACK POINTER
LD SP,UTPRVSTK ; SWITCH TO PRIVATE STACK
PUSH AF
PUSH BC
PUSH DE
PUSH HL
CALL PC_LBKT
PUSH AF
LD A,'@'
CALL COUT
POP AF
PUSH BC
LD BC,(REGDMP_PC)
CALL PRTHEXWORD
POP BC
CALL PC_COLON
PUSH BC
PUSH AF
POP BC
CALL PRTHEXWORD ; AF
POP BC
CALL PC_COLON
CALL PRTHEXWORD ; BC
CALL PC_COLON
PUSH DE
POP BC
CALL PRTHEXWORD ; DE
CALL PC_COLON
PUSH HL
POP BC
CALL PRTHEXWORD ; HL
CALL PC_COLON
LD BC,(UTSTKSAV)
CALL PRTHEXWORD ; SP
RST 38
CALL PC_RBKT
CALL PC_SPACE
HALT
POP HL
POP DE
POP BC
POP AF
JP 0
LD SP,(UTSTKSAV) ; BACK TO ORIGINAL STACK FRAME
RET
;
REGDMP_PC .DW 0
;
;
;
CONTINUE:
PUSH AF
PUSH DE
LD DE,STR_CONTINUE
CALL WRITESTR
POP DE
CONTINUE1:
CALL CIN
CP 'Y'
JR Z,CONTINUE3
CP 'y'
JR Z,CONTINUE3
CP 'N'
JR Z,CONTINUE2
CP 'n'
JR Z,CONTINUE2
JR CONTINUE1
CONTINUE2:
HALT
CONTINUE3:
POP AF
RET
;
;==================================================================================================
; CONSOLE CHARACTER I/O HELPER ROUTINES (REGISTERS PRESERVED)
@ -383,7 +442,8 @@ COUT:
LD A,(HCB + HCB_CONDEV)
LD C,A
LD B,BF_CIOOUT
CALL HB_DISPATCH
;CALL HB_DISPATCH
CALL CIO_DISPATCH
#ENDIF
#IFDEF CIOMODE_HBIOS
#DEFINE CIOMODE_NONDOS
@ -434,7 +494,8 @@ CIN:
LD A,(HCB + HCB_CONDEV)
LD C,A
LD B,BF_CIOIN
CALL HB_DISPATCH
;CALL HB_DISPATCH
CALL CIO_DISPATCH
LD A,E
#ENDIF
#IFDEF CIOMODE_HBIOS
@ -483,7 +544,8 @@ CST:
LD B,BF_CIOIST
LD A,(HCB + HCB_CONDEV)
LD C,A
CALL HB_DISPATCH
;CALL HB_DISPATCH
CALL CIO_DISPATCH
#ENDIF
#IFDEF CIOMODE_HBIOS
#DEFINE CIOMODE_NONDOS
@ -505,13 +567,15 @@ CST:
POP BC
RET
;
STR_PANIC .DB "\r\n\r\n>>> FATAL ERROR:$"
STR_AF .DB " AF=$"
STR_BC .DB " BC=$"
STR_DE .DB " DE=$"
STR_HL .DB " HL=$"
STR_PC .DB " PC=$"
STR_SP .DB " SP=$"
STR_PANIC .DB "\r\n\r\n>>> PANIC: $"
STR_TSTPT .TEXT "\r\n+++ TSTPT: $"
STR_CONTINUE .TEXT " Continue? (Y/N): $"
;STR_AF .DB " AF=$"
;STR_BC .DB " BC=$"
;STR_DE .DB " DE=$"
;STR_HL .DB " HL=$"
;STR_PC .DB " PC=$"
;STR_SP .DB " SP=$"
;
; INDIRECT JUMP TO ADDRESS IN HL
;
@ -944,6 +1008,12 @@ ST32:
POP AF
RET
;
; PRIVATE STACK
;
UTSTKSAV .DW 0
.FILL $FF,64 ; 32 LEVEL PRIVATE STACK SPACE
UTPRVSTK .EQU $
;
;==================================================================================================
; DSKY KEYBOARD ROUTINES
;==================================================================================================

Loading…
Cancel
Save