|
|
|
@ -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) |
|
|
|
; |
|
|
|
|