diff --git a/Source/CBIOS/cbios.asm b/Source/CBIOS/cbios.asm index f6ff86c3..6e0509d5 100644 --- a/Source/CBIOS/cbios.asm +++ b/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) ; diff --git a/Source/CBIOS/util.asm b/Source/CBIOS/util.asm index 6e590e7f..6d09502f 100644 --- a/Source/CBIOS/util.asm +++ b/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 $ \ No newline at end of file diff --git a/Source/HBIOS/fd.asm b/Source/HBIOS/fd.asm index 2ad4cf61..d8c02f80 100644 --- a/Source/HBIOS/fd.asm +++ b/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 diff --git a/Source/HBIOS/hbios.asm b/Source/HBIOS/hbios.asm index 0917f893..14bfdb94 100644 --- a/Source/HBIOS/hbios.asm +++ b/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 diff --git a/Source/HBIOS/hbios.inc b/Source/HBIOS/hbios.inc index db63fd16..92587690 100644 --- a/Source/HBIOS/hbios.inc +++ b/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 diff --git a/Source/HBIOS/hdsk.asm b/Source/HBIOS/hdsk.asm index 750d5ed2..74c734b1 100644 --- a/Source/HBIOS/hdsk.asm +++ b/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 diff --git a/Source/HBIOS/ide.asm b/Source/HBIOS/ide.asm index 1ab076f3..56015893 100644 --- a/Source/HBIOS/ide.asm +++ b/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 diff --git a/Source/HBIOS/md.asm b/Source/HBIOS/md.asm index e1848d97..0b1be3cd 100644 --- a/Source/HBIOS/md.asm +++ b/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 diff --git a/Source/HBIOS/ppide.asm b/Source/HBIOS/ppide.asm index 5b054f73..64d9633c 100644 --- a/Source/HBIOS/ppide.asm +++ b/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: diff --git a/Source/HBIOS/ppp.asm b/Source/HBIOS/ppp.asm index 3b389df2..d5b79b52 100644 --- a/Source/HBIOS/ppp.asm +++ b/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 ; diff --git a/Source/HBIOS/prp.asm b/Source/HBIOS/prp.asm index ab6b17a7..0e6aa01c 100644 --- a/Source/HBIOS/prp.asm +++ b/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: diff --git a/Source/HBIOS/rf.asm b/Source/HBIOS/rf.asm index e0f16544..e8793aea 100644 --- a/Source/HBIOS/rf.asm +++ b/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 diff --git a/Source/HBIOS/romldr.asm b/Source/HBIOS/romldr.asm index e0d98e04..15a48e90 100644 --- a/Source/HBIOS/romldr.asm +++ b/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 diff --git a/Source/HBIOS/sd.asm b/Source/HBIOS/sd.asm index b9698a88..efb87769 100644 --- a/Source/HBIOS/sd.asm +++ b/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 diff --git a/Source/HBIOS/util.asm b/Source/HBIOS/util.asm index 522d1c54..f109aeea 100644 --- a/Source/HBIOS/util.asm +++ b/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 ;==================================================================================================