@ -10,8 +10,8 @@
; 1) STACK LOCATION DURING BOOT OR WBOOT???
; 1) STACK LOCATION DURING BOOT OR WBOOT???
; 2) REVIEW USE OF DI/EI IN INIT
; 2) REVIEW USE OF DI/EI IN INIT
;
;
FALSE .EQU 0
TRUE .EQU ~ FALSE
FALSE .EQU 0
TRUE .EQU ~ FALSE
;
;
BDOS .EQU 5 ; BDOS FUNC INVOCATION VECTOR
BDOS .EQU 5 ; BDOS FUNC INVOCATION VECTOR
;
;
@ -56,8 +56,8 @@ DEV_NUL .EQU $FF ; NUL:
;
;
; MEMORY LAYOUT
; MEMORY LAYOUT
;
;
IOBYTE .EQU 3 ; LOC IN PAGE 0 OF I/O DEFINITION BYTE
CDISK .EQU 4 ; LOC IN PAGE 0 OF CURRENT DISK NUMBER 0=A,...,15=P
IOBYTE .EQU 3 ; LOC IN PAGE 0 OF I/O DEFINITION BYTE
CDISK .EQU 4 ; LOC IN PAGE 0 OF CURRENT DISK NUMBER 0=A,...,15=P
;
;
CCP_LOC .EQU CPM_LOC
CCP_LOC .EQU CPM_LOC
CCP_SIZ .EQU $ 800
CCP_SIZ .EQU $ 800
@ -78,7 +78,7 @@ MEMTOP .EQU $10000
# INCLUDE "../UBIOS/ubios.inc"
# INCLUDE "../UBIOS/ubios.inc"
# ENDIF
# ENDIF
;
;
.ORG CBIOS_LOC ; DEFINED IN STD.ASM
.ORG CBIOS_LOC ; DEFINED IN STD.ASM
;
;
STACK .EQU CBIOS_END ; USE SLACK SPACE FOR STACK AS NEEDED
STACK .EQU CBIOS_END ; USE SLACK SPACE FOR STACK AS NEEDED
;
;
@ -112,7 +112,7 @@ WBOOTE JP WBOOT ; #1 - WARM START
;
;
; RomWBW CBIOS places the following stamp data into page zero
; RomWBW CBIOS places the following stamp data into page zero
; at address $40. The address range $40-$4F is reserved by CP/M
; at address $40. The address range $40-$4F is reserved by CP/M
; as a scratch area for CBIOS. This data below is copied there at
; as a scratch area for CBIOS. This data below is copied there at
; every warm start. It allows applications to identify RomWBW CBIOS.
; every warm start. It allows applications to identify RomWBW CBIOS.
; Additionally, it contains a pointer to additional CBIOS extension
; Additionally, it contains a pointer to additional CBIOS extension
; data (CBX) specific to RomWBW CBIOS.
; data (CBX) specific to RomWBW CBIOS.
@ -130,7 +130,7 @@ STPIMG: .DB 'W',~'W' ; MARKER
STPSIZ .EQU $ - STPIMG
STPSIZ .EQU $ - STPIMG
;
;
; The following section contains key information and addresses for the
; The following section contains key information and addresses for the
; RomWBW CBIOS. A pointer to the start of this section is stored with
; RomWBW CBIOS. A pointer to the start of this section is stored with
; with the CBX data in page zero at $44 (see above).
; with the CBX data in page zero at $44 (see above).
;
;
CBX:
CBX:
@ -152,15 +152,15 @@ CBXSIZ .EQU $ - CBX
; IOBYTE (0003H)
; IOBYTE (0003H)
; ==============
; ==============
;
;
; Device LST: PUN: RDR: CON:
; Bit positions 7 6 5 4 3 2 1 0
; Device LST: PUN: RDR: CON:
; Bit positions 7 6 5 4 3 2 1 0
;
;
; Dec Binary
; Dec Binary
;
;
; 0 00 TTY: TTY: TTY: TTY:
; 1 01 CRT: PTP: PTR: CRT:
; 2 10 LPT: UP1: UR1: BAT:
; 3 11 UL1: UP2: UR2: UC1:
; 0 00 TTY: TTY: TTY: TTY:
; 1 01 CRT: PTP: PTR: CRT:
; 2 10 LPT: UP1: UR1: BAT:
; 3 11 UL1: UP2: UR2: UC1:
;
;
; TTY: Teletype device (slow speed console)
; TTY: Teletype device (slow speed console)
; CRT: Cathode ray tube device (high speed console)
; CRT: Cathode ray tube device (high speed console)
@ -235,7 +235,7 @@ DEVMAP:
;==================================================================================================
;==================================================================================================
;
;
; Disk mapping is done using a drive map table (DRVMAP) which is built
; Disk mapping is done using a drive map table (DRVMAP) which is built
; dynamically at cold boot. See the DRV_INIT routine. This table is
; dynamically at cold boot. See the DRV_INIT routine. This table is
; made up of entries as documented below. The table is prefixed with one
; made up of entries as documented below. The table is prefixed with one
; byte indicating the number of entries. The position of the entry indicates
; byte indicating the number of entries. The position of the entry indicates
; the drive letter, so the first entry is A:, the second entry is B:, etc.
; the drive letter, so the first entry is A:, the second entry is B:, etc.
@ -245,24 +245,24 @@ DEVMAP:
; DPH: DPH ADDRESS OF DRIVE (WORD)
; DPH: DPH ADDRESS OF DRIVE (WORD)
;
;
; DRVMAP --+
; DRVMAP --+
; | DRIVE A | DRIVE B | | DRIVE N |
; +-----V------+-------+-----+--------------------+ +--------------------+
; | N | UNIT | SLICE | DPH | UNIT | SLICE | DPH | ... | UNIT | SLICE | DPH |
; +----8+-----8+------8+-+-16+-----8+------8+-+-16+ +-----8+------8+-+-16+
; | | |
; +--------------------+ +-> [DPH] +-> [DPH]
; | DRIVE A | DRIVE B | | DRIVE N |
; +-----V------+-------+-----+--------------------+ +--------------------+
; | N | UNIT | SLICE | DPH | UNIT | SLICE | DPH | ... | UNIT | SLICE | DPH |
; +----8+-----8+------8+-+-16+-----8+------8+-+-16+ +-----8+------8+-+-16+
; | | |
; +--------------------+ +-> [DPH] +-> [DPH]
; |
; |
; V-----+-------+-------+-------+--------+-----+-----+-----+
; DPH: | XLT | 0000H | 0000H | 0000H | DIRBUF | DPB | CSV | ALV |
; +---16+-----16+-----16+-----16+------16+-+-16+-+-16+-+-16+
; (ONE DPH PER DRIVE) | | |
; | | +----------+
; | | |
; +----------------------+ V-------------+ V-------------+
; | | CSV BUF | | ALV BUF |
; | +-------------+ +-------------+
; | (CSZ BYTES) (ASZ BYTES)
; |
; V-----+-------+-------+-------+--------+-----+-----+-----+--------+
; DPH: | XLT | 0000H | 0000H | 0000H | DIRBUF | DPB | CSV | ALV | LBAOFF |
; +---16+-----16+-----16+-----16+------16+-+-16+-+-16+-+-16+------32+
; (ONE DPH PER DRIVE) | | |
; | | +----------+
; | | |
; +----------------------+ V-------------+ V-------------+
; | | CSV BUF | | ALV BUF |
; | +-------------+ +-------------+
; | (CSZ BYTES) (ASZ BYTES)
; |
; +-----+-----+-----V-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+
; +-----+-----+-----V-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+
; DPB: | CSZ | ASZ | BLS | SPT | BSH | BLM | EXM | DSM | DRM | AL0 | AL1 | CKS | OFF |
; DPB: | CSZ | ASZ | BLS | SPT | BSH | BLM | EXM | DSM | DRM | AL0 | AL1 | CKS | OFF |
; +---16+---16+----8+---16+----8+----8+----8+---16+---16+----8+----8+---16+---16+
; +---16+---16+----8+---16+----8+----8+----8+---16+---16+----8+----8+---16+---16+
@ -289,6 +289,7 @@ DPBMAP:
.DW DPB_FD360 ; MID_FD360
.DW DPB_FD360 ; MID_FD360
.DW DPB_FD120 ; MID_FD120
.DW DPB_FD120 ; MID_FD120
.DW DPB_FD111 ; MID_FD111
.DW DPB_FD111 ; MID_FD111
.DW DPB_HDNEW ; MID_HDNEW (1024 DIR ENTRIES)
;
;
DPBCNT .EQU ( $ - DPBMAP ) / 2
DPBCNT .EQU ( $ - DPBMAP ) / 2
;
;
@ -1199,6 +1200,7 @@ DSK_GETINF1: ; ERROR RETURN
DSK_SELECT:
DSK_SELECT:
LD B , E ; SAVE E IN B FOR NOW
LD B , E ; SAVE E IN B FOR NOW
CALL DS K_GETINF ; GET D=UNIT, E=SLICE, HL=DPH ADDRESS
CALL DS K_GETINF ; GET D=UNIT, E=SLICE, HL=DPH ADDRESS
CALL NZ , PANIC ; *DEBUG*
RET NZ ; RETURN IF INVALID DRIVE (A=1, NZ SET, HL=0)
RET NZ ; RETURN IF INVALID DRIVE (A=1, NZ SET, HL=0)
PUSH BC ; WE NEED B LATER, SAVE ON STACK
PUSH BC ; WE NEED B LATER, SAVE ON STACK
;
;
@ -1209,13 +1211,15 @@ DSK_SELECT:
LD ( SEKUNIT ), A ; SAVE UNIT
LD ( SEKUNIT ), A ; SAVE UNIT
LD ( SEKDPH ), HL ; SAVE DPH ADDRESS
LD ( SEKDPH ), HL ; SAVE DPH ADDRESS
;
;
; UPDATE OFFSET FOR ACTIVE SLICE
; A TRACK IS ASSUMED TO BE 16 SECTORS
; THE OFFSET REPRESENTS THE NUMBER OF BLOCKS * 256
; TO USE AS THE OFFSET
LD H , 65 ; H = TRACKS PER SLICE, E = SLICE NO
CALL MULT8 ; HL := H * E (TOTAL TRACK OFFSET)
LD ( SEKOFF ), HL ; SAVE NEW TRACK OFFSET
LD A , E ; A := SLICE
LD ( SLICE ), A ; SAVE IT
; UPDATE LBAOFF FROM DPH
LD HL ,( SEKDPH )
LD A , 16
CALL ADDHLA
LD DE , SEKLBA
LD BC , 4
LDIR
;
;
; RESTORE DE TO BC (FOR ACCESS TO DRIVE LOGIN BIT)
; RESTORE DE TO BC (FOR ACCESS TO DRIVE LOGIN BIT)
POP BC ; GET ORIGINAL E INTO B
POP BC ; GET ORIGINAL E INTO B
@ -1234,11 +1238,24 @@ DSK_SELECT:
LD E , 1 ; ENABLE MEDIA CHECK/DISCOVERY
LD E , 1 ; ENABLE MEDIA CHECK/DISCOVERY
RST 08 ; DO IT
RST 08 ; DO IT
LD A , E ; RESULTANT MEDIA ID TO ACCUM
LD A , E ; RESULTANT MEDIA ID TO ACCUM
LD ( MEDID ), A ; SAVE IT
OR A ; SET FLAGS
OR A ; SET FLAGS
LD HL , 0 ; ASSUME FAILURE
LD HL , 0 ; ASSUME FAILURE
RET Z ; BAIL OUT IF NO MEDIA
RET Z ; BAIL OUT IF NO MEDIA
;
;
; A HAS MEDIA ID, SET HL TO CORRESPONDING DPBMAP ENTRY
; CLEAR LBA OFFSET (DWORD)
LD HL , 0 ; ZERO
LD ( SEKLBA ), HL ; CLEAR FIRST WORD
LD ( SEKLBA + 2 ), HL ; CLEAR SECOND WORD
;
; CHECK MBR OF PHYSICAL DISK BEING SELECTED
; WILL UPDATE MEDID AND LBAOFF IF VALID CP/M PARTITION EXISTS
CALL DS K_MBR ; UPDATE MEDIA FROM MBR
LD HL , 0 ; ASSUME FAILURE
RET NZ ; ABORT ON I/O ERROR
;
; SET HL TO DPBMAP ENTRY CORRESPONDING TO MEDIA ID
LD A ,( MEDID ) ; GET MEDIA ID
LD HL , DPBMAP ; HL = DPBMAP
LD HL , DPBMAP ; HL = DPBMAP
RLCA ; DPBMAP ENTRIES ARE 2 BYTES EACH
RLCA ; DPBMAP ENTRIES ARE 2 BYTES EACH
CALL ADDHLA ; ADD OFFSET TO HL
CALL ADDHLA ; ADD OFFSET TO HL
@ -1249,12 +1266,22 @@ DSK_SELECT:
LD D ,( HL ) ; DE = ADDRESS OF DESIRED DPB
LD D ,( HL ) ; DE = ADDRESS OF DESIRED DPB
;
;
; PLUG DPB INTO THE ACTIVE DPH
; PLUG DPB INTO THE ACTIVE DPH
LD HL ,( SEKDPH )
LD HL ,( SEKDPH ) ; POINT TO START OF DPH
LD BC , 10 ; OFFSET OF DPB IN DPH
LD BC , 10 ; OFFSET OF DPB IN DPH
ADD HL , BC ; HL := DPH.DPB
ADD HL , BC ; HL := DPH.DPB
LD ( HL ), E ; SET LSB OF DPB IN DPH
LD ( HL ), E ; SET LSB OF DPB IN DPH
INC HL ; BUMP TO MSB
INC HL ; BUMP TO MSB
LD ( HL ), D ; SET MSB OF DPB IN DPH
LD ( HL ), D ; SET MSB OF DPB IN DPH
;
; ; PLUG LBA OFFSET INTO ACTIVE DPH
LD HL ,( SEKDPH ) ; POINT TO START OF DPH
LD BC , 16 ; OFFSET OF LBA OFFSET IN DPH
ADD HL , BC ; HL := DPH.LBAOFF PTR
EX DE , HL ; DEST IS DPH.LBAOFF PTR
LD HL , SEKLBA ; SOURCE IS LBAOFF
LD BC , 4 ; 4 BYTES
LDIR ; DO IT
;
# ENDIF
# ENDIF
;
;
DSK_SELECT2:
DSK_SELECT2:
@ -1262,6 +1289,131 @@ DSK_SELECT2:
XOR A ; FLAG SUCCESS
XOR A ; FLAG SUCCESS
RET ; NORMAL RETURN
RET ; NORMAL RETURN
;
;
; CHECK MBR OF DISK TO SEE IF IT HAS A PARTITION TABLE.
; IF SO, LOOK FOR A CP/M PARTITION. IF FOUND, GET
; UPDATE THE PARTITION OFFSET (LBAOFF) AND UPDATE
; THE MEDIA ID (MEDID).
;
# IFDEF PLTWBW
;
DSK_MBR:
; CHECK MEDIA TYPE, ONLY HARD DISK IS APPLICABLE
LD A ,( MEDID ) ; GET MEDIA ID
CP MID_HD ; HARD DISK?
JR Z , DS K_MBR1 ; IF SO, CONTINUE
XOR A ; ELSE, N/A, SIGNAL SUCCESS
RET ; AND RETURN
;
DSK_MBR1:
; FLUSH DSKBUF TO MAKE SURE IT IS SAFE TO USE IT.
CALL BL KFLSH ; MAKE SURE DISK BUFFER IS NOT DIRTY
XOR A ; CLEAR ACCUM
LD ( HSTACT ), A ; CLEAR HOST BUFFER ACTIVE FLAG
;
; READ SECTOR ZERO (MBR)
LD B , BF_DIOREAD ; READ FUNCTION
LD A ,( SEKUNIT ) ; GET UNIT
LD C , A ; PUT IN C
LD DE , 0 ; LBA SECTOR ZERO
LD HL , 0 ; ...
CALL DS K_IO2 ; DO IT
RET NZ ; ABORT ON ERROR
;
; SWITCH TO BIOS BANK TO ACCESS DISK BUFFER
LD A ,( HB_CURBNK ) ; GET CUR BANK
PUSH AF ; SAVE CUR BANK
LD A ,( BNKBIOS ) ; BIOS BANK
CALL HB_BNKSEL ; DO IT
;
; CHECK SIGNATURE
LD HL ,( DS KBUF ) ; DSKBUF ADR
LD DE , $ 1 FE ; OFFSET TO SIGNATURE
ADD HL , DE ; POINT TO SIGNATURE
LD A ,( HL ) ; GET FIRST BYTE
CP $ 55 ; CHECK FIRST BYTE
JR NZ , DS K_MBR4 ; NO MATCH, NO PART TABLE
INC HL ; NEXT BYTE
LD A ,( HL ) ; GET SECOND BYTE
CP $ AA ; CHECK SECOND BYTE
JR NZ , DS K_MBR4 ; NO MATCH, NO PART TABLE, ABORT
;
; TRY TO FIND OUR ENTRY IN PART TABLE AND CAPTURE LBA OFFSET
LD B , 4 ; FOUR ENTRIES IN PART TABLE
LD HL ,( DS KBUF ) ; DSKBUF ADR
LD DE , $ 1B E + 4 ; OFFSET OF FIRST ENTRY PART TYPE
ADD HL , DE ; POINT TO IT
DSK_MBR2:
LD A ,( HL ) ; GET PART TYPE
CP $ 52 ; CP/M PARTITION?
JR Z , DS K_MBR3 ; COOL, GRAB THE LBA OFFSET
LD DE , 16 ; PART TABLE ENTRY SIZE
ADD HL , DE ; BUMP TO NEXT ENTRY PART TYPE
DJNZ DS K_MBR2 ; LOOP THRU TABLE
JR DS K_MBR4 ; TOO BAD, NO CP/M PARTITION
;
DSK_MBR3:
; WE HAVE LOCATED A VALID CP/M PARTITION
; HL POINTS TO PART TYPE FIELD OF PART ENTRY
; UPDATE MEDIA ID
LD A , MID_HDNEW ; NEW MEDIA ID
LD ( MEDID ), A ; SAVE IT
;
; CAPTURE THE LBA OFFSET
LD DE , 4 ; LBA IS 4 BYTES AFTER PART TYPE
ADD HL , DE ; POINT TO IT
LD DE , SEKLBA ; LOC TO STORE LBA OFFSET
LD BC , 4 ; 4 BYTES (32 BITS)
LDIR ; COPY IT
;
DSK_MBR4:
; RESTORE BANK
POP AF ; GET PREV BANK
CALL HB_BNKSEL ; SELECT IT
;
DSK_MBR5:
;
; DIFFERENT ALGORITHM FOR NEW HD FORMAT
LD A ,( MEDID ) ; GET MEDIA ID
CP MID_HDNEW ; NEW FORMAT?
JR Z , DS K_MBR6 ; IF SO, GO THERE
;
; OLD HD FORMAT, 65 TRACKS PER SLICE
LD A ,( SLICE ) ; GET SLICE
LD E , A ; E = SLICE NO
LD H , 65 ; H = TRACKS PER SLICE
CALL MULT8 ; HL := H * E (TOTAL TRACK OFFSET)
LD DE , 0 ; CLEAR HI WORD
LD B , 8 ; 16 SPT, SHIFT 4 BITS
CALL RL32 ; DO IT
JR DS K_MBR7 ; DONE
;
DSK_MBR6:
; NEW HD FORMAT, MULTIPLY SLICE BY 8MB
LD DE , 0 ; CLEAR HIWORD
LD H , 0 ; CLEAR HI BYTE OR LOWORD
LD A ,( SLICE ) ; GET SLICE
LD L , A ; PUT SLICE IN LOW BYTE
LD B , 14
CALL RL32 ; MULTIPLY BY 16384 SECTORS (8MB)
;
DSK_MBR7:
; ADD IN LBA OFFSET
LD BC ,( SEKLBA ) ; LBA OFFSET LOWORD
ADD HL , BC
EX DE , HL
LD BC ,( SEKLBA + 2 ) ; LBA OFFSET HIWORD
ADC HL , BC
EX DE , HL
SET 7 , D ; SET LBA ACCESS BIT
; RESAVE IT
LD ( SEKLBA ), HL ; LOWORD
LD ( SEKLBA + 2 ), DE ; HIWORD
; SUCCESSFUL FINISH
XOR A ; SUCCESS
RET ; DONE
;
# ENDIF
;
;
;
;
;
DSK_STATUS:
DSK_STATUS:
@ -1297,7 +1449,7 @@ DSK_WRITE:
;
;
;
;
# IFDEF PLTUNA
# IFDEF PLTUNA
;
DSK_IO:
DSK_IO:
PUSH BC
PUSH BC
LD DE ,( HSTTRK ) ; GET TRACK INTO HL
LD DE ,( HSTTRK ) ; GET TRACK INTO HL
@ -1338,15 +1490,10 @@ DSK_IO1:
RST 08
RST 08
OR A ; SET FLAGS BASED ON RESULT
OR A ; SET FLAGS BASED ON RESULT
RET
RET
# ELSE
DSK_IO:
;
;
; TRANSLATE CP/M TRACK/SECTOR -> HBIOS TRACK/HEAD/SECTOR
; NEEDS TO HANDLE FLOPPY SEPARATE FROM HARD DISK
# ELSE
;
;
CHS :
DSK_IO:
LD A ,( HSTUNIT ) ; GET UNIT
LD A ,( HSTUNIT ) ; GET UNIT
LD C , A ; UNIT -> C
LD C , A ; UNIT -> C
PUSH BC ; SAVE FUNC/UNIT
PUSH BC ; SAVE FUNC/UNIT
@ -1356,7 +1503,7 @@ CHS:
LD A , D ; DEVICE TYPE -> A
LD A , D ; DEVICE TYPE -> A
AND $ F0 ; ISOLATE HIGH BITS
AND $ F0 ; ISOLATE HIGH BITS
CP DI ODEV_FD ; FLOPPY?
CP DI ODEV_FD ; FLOPPY?
JR NZ , CH SHD ; IF NOT, DO HD CHS XLAT
JR NZ , LBA_IO ; IF NOT, DO LBA IO
;
;
; FLOPPY SPECIFIC TRANSLATION ASSUMES FLOPPY IS DOUBLE-SIDED AND
; FLOPPY SPECIFIC TRANSLATION ASSUMES FLOPPY IS DOUBLE-SIDED AND
; USES LOW ORDER BIT OF TRACK AS HEAD VALUE
; USES LOW ORDER BIT OF TRACK AS HEAD VALUE
@ -1368,53 +1515,51 @@ CHS:
SRL H ; SHIFT HEAD BIT OUT OF HL
SRL H ; SHIFT HEAD BIT OUT OF HL
RR L ; ... AND INTO CARRY
RR L ; ... AND INTO CARRY
RL D ; CARRY BIT (HEAD) INTO D
RL D ; CARRY BIT (HEAD) INTO D
JR CH S2
;
; HARD DISK SPECIFIC TRANSLATION
; ASSUMES 16 HEADS PER CYLINDER AND 16 SECTORS PER TRACK
JR DS K_IO2 ; DO THE DISK I/O
;
;
CHSHD:
LD HL ,( HSTTRK ) ; GET TRACK VALUE
LD A , L ; LSB OF TRACK TO A
AND $ 0 F ; ISOLATE HEAD IN LOW 4 BITS
LD D , A ; STUFF IT IN D
LBA_IO:
LD A ,( HSTUNIT ) ; GET THE UNIT VALUE
LD C , A ; PUT IT IN C
PUSH BC ; SAVE FUNC/UNIT
; GET TRACK AND SHIFT TO MAKE ROOM FOR 4 BIT SECTOR VALUE
LD HL ,( HSTTRK ) ; GET TRACK
LD DE , 0 ; CLEAR HIWORD
LD B , 4 ; X16 (16 SPT ASSUMED)
CALL RL32 ; DO IT
; COMBINE WITH SECTOR
LD A ,( HSTSEC ) ; GET SECTOR
LD A ,( HSTSEC ) ; GET SECTOR
LD E , A ; STUFF IT IN E
LD A , B ; SAVE B (HBIOS FUNC)
LD B , 4 ; PREPARE TO SHIFT OUT 4 BIT HEAD VALUE
CHSHD1:
SRL H ; SHIFT ONE BIT OUT
RR L ; ... OF HL
DJNZ CH SHD1 ; DO ALL 4 BITS
LD B , A ; RESTORE B (HBIOS FUNC)
; FALL THRU TO CHS2
;
; ALL TYPES OF TRANSLATION WIND UP HERE TO
; MAKE THE ACTUAL HBIOS CALL
;
CHS2:
PUSH DE ; SAVE HEAD/SECTOR + COULD MOVE
LD DE ,( HSTOFF ) ; NOW GET SLICE OFFSET | TO CHSHD,
ADD HL , DE ; ADD IT TO TRACK VALUE | NO SLICES
POP DE ; RECOVER HEAD/SECTOR + FOR FLOPPY
OR L
LD L , A
; ADD IN LBA OFFSET FOR PARTITION AND/OR SLICE
LD BC ,( HSTLBA ) ; LBA OFFSET LOWORD
ADD HL , BC
EX DE , HL
LD BC ,( HSTLBA + 2 ) ; LBA OFFSET HIWORD
ADC HL , BC
EX DE , HL
SET 7 , D ; MAKE SURE LBA ACCESS BIT SET
POP BC ; RESTORE FUNC/UNIT
;JR DSK_IO2 ; DO THE DISK I/O (FALL THRU)
;
;
; MAKE HBIOS CALL
; MAKE HBIOS CALL
; HBIOS FUNC SHOULD STILL BE IN B
; HBIOS FUNC SHOULD STILL BE IN B
; UNIT SHOULD STILL BE IN C
; UNIT SHOULD STILL BE IN C
;
;
DSK_IO2:
PUSH BC ; SAVE INCOMING FUNCTION, DEVICE/UNIT
PUSH BC ; SAVE INCOMING FUNCTION, DEVICE/UNIT
LD B , BF_DIOSEEK ; SETUP FOR NEW SEEK CALL
LD B , BF_DIOSEEK ; SETUP FOR NEW SEEK CALL
RST 08 ; DO IT
RST 08 ; DO IT
POP BC ; RESTORE INCOMING FUNCTION, DEVICE/UNIT
RET NZ ; ABORT IF SEEK RETURNED AN ERROR W/ ERROR IN A
LD HL ,( DS KBUF ) ; GET BUFFER ADDRESS
POP BC ; RESTORE INCOMING FUNCTION, DEVICE/UNIT
RET NZ ; ABORT IF SEEK RETURNED AN ERROR W/ ERROR IN A
LD HL ,( DS KBUF ) ; GET BUFFER ADDRESS
LD A ,( BNKBIOS ) ; GET BIOS BANK
LD A ,( BNKBIOS ) ; GET BIOS BANK
LD D , A ; TRANSFER TO/FROM BIOS BANK
LD D , A ; TRANSFER TO/FROM BIOS BANK
LD E , 1 ; TRANSFER ONE SECTOR
LD E , 1 ; TRANSFER ONE SECTOR
;CALL PC_ASTERISK ; *DEBUG*
RST 08 ; DO IT
RST 08 ; DO IT
OR A ; SET FLAGS
OR A ; SET FLAGS
RET ; DONE
RET ; DONE
;
# ENDIF
# ENDIF
;
;
;==================================================================================================
;==================================================================================================
@ -1501,12 +1646,14 @@ STR_SEC .DB " SEC=$"
; DATA
; DATA
;==================================================================================================
;==================================================================================================
;
;
;STR_READONLY .DB "\r\nCBIOS Err: Read Only Drive$"
;STR_STALE .DB "\r\nCBIOS Err: Stale Drive$"
;STR_READONLY .DB "\r\nCBIOS Err: Read Only Drive$"
;STR_STALE .DB "\r\nCBIOS Err: Stale Drive$"
;
;
SECADR .DW 0 ; ADDRESS OF SECTOR IN ROM/RAM PAGE
;SECADR .DW 0 ; ADDRESS OF SECTOR IN ROM/RAM PAGE
DEFDRIVE .DB 0 ; DEFAULT DRIVE
DEFDRIVE .DB 0 ; DEFAULT DRIVE
CCPBUF .DW 0 ; ADDRESS OF CCP BUF IN BIOS BANK
CCPBUF .DW 0 ; ADDRESS OF CCP BUF IN BIOS BANK
MEDID .DB 0 ; TEMP STORAGE FOR MEDIA ID
SLICE .DB 0 ; CURRENT SLICE
;
;
# IFDEF PLTWBW
# IFDEF PLTWBW
BNKBIOS .DB 0 ; BIOS BANK ID
BNKBIOS .DB 0 ; BIOS BANK ID
@ -1521,21 +1668,22 @@ BNKUSER .DW 0 ; USER BANK ID
; DOS DISK VARIABLES
; DOS DISK VARIABLES
;
;
DSKOP .DB 0 ; DISK OPERATION (DOP_READ/DOP_WRITE)
DSKOP .DB 0 ; DISK OPERATION (DOP_READ/DOP_WRITE)
WRTYPE .DB 0 ; WRITE TYPE (0=NORMAL, 1=DIR (FORCE), 2=FIRST RECORD OF BLOCK)
DMAADR .DW 0 ; DIRECT MEMORY ADDRESS
WRTYPE .DB 0 ; WRITE TYPE (0=NORMAL, 1=DIR (FORCE), 2=FIRST RECORD OF BLOCK)
DMAADR .DW 0 ; DIRECT MEMORY ADDRESS
HSTWRT .DB 0 ; TRUE = BUFFER IS DIRTY
HSTWRT .DB 0 ; TRUE = BUFFER IS DIRTY
DSKBUF .DW 0 ; ADDRESS OF PHYSICAL SECTOR BUFFER
DSKBUF .DW 0 ; ADDRESS OF PHYSICAL SECTOR BUFFER
;
;
; LOGICAL DISK I/O REQUEST PENDING
; LOGICAL DISK I/O REQUEST PENDING
;
;
SEK:
SEK:
SEKDSK .DB 0 ; DISK NUMBER 0-15
SEKTRK .DW 0 ; TWO BYTES FOR TRACK # (LOGICAL)
SEKSEC .DW 0 ; TWO BYTES FOR SECTOR # (LOGICAL)
SEKUNIT .DB 0 ; DISK UNIT
SEKDSK .DB 0 ; DISK NUMBER 0-15
SEKTRK .DW 0 ; TWO BYTES FOR TRACK # (LOGICAL)
SEKSEC .DW 0 ; TWO BYTES FOR SECTOR # (LOGICAL)
SEKUNIT .DB 0 ; DISK UNIT
SEKDPH .DW 0 ; ADDRESS OF ACTIVE (SELECTED) DPH
SEKDPH .DW 0 ; ADDRESS OF ACTIVE (SELECTED) DPH
SEKOFF .DW 0 ; TRACK OFFSET IN EFFECT FOR SLICE
SEKOFF .DW 0 ; TRACK OFFSET IN EFFECT FOR SLICE
SEKACT .DB TRUE ; ALWAYS TRUE!
SEKACT .DB TRUE ; ALWAYS TRUE!
SEKLBA .FILL 4 , 0 ; LBA OFFSET
;
;
; RESULT OF CPM TO PHYSICAL TRANSLATION
; RESULT OF CPM TO PHYSICAL TRANSLATION
;
;
@ -1547,6 +1695,7 @@ XLTUNIT .DB 0
XLTDPH .DW 0
XLTDPH .DW 0
XLTOFF .DW 0
XLTOFF .DW 0
XLTACT .DB TRUE ; ALWAYS TRUE!
XLTACT .DB TRUE ; ALWAYS TRUE!
XLTLBA .FILL 4 , 0 ; LBA OFFSET
;
;
XLTSIZ .EQU $ - XLT
XLTSIZ .EQU $ - XLT
;
;
@ -1560,13 +1709,14 @@ HSTUNIT .DB 0 ; DISK UNIT IN BUFFER
HSTDPH .DW 0 ; CURRENT DPH ADDRESS
HSTDPH .DW 0 ; CURRENT DPH ADDRESS
HSTOFF .DW 0 ; TRACK OFFSET IN EFFECT FOR SLICE
HSTOFF .DW 0 ; TRACK OFFSET IN EFFECT FOR SLICE
HSTACT .DB 0 ; TRUE = BUFFER HAS VALID DATA
HSTACT .DB 0 ; TRUE = BUFFER HAS VALID DATA
HSTLBA .FILL 4 , 0 ; LBA OFFSET
;
;
; SEQUENTIAL WRITE TRACKING FOR (UNA)LLOCATED BLOCK
; SEQUENTIAL WRITE TRACKING FOR (UNA)LLOCATED BLOCK
;
;
UNA:
UNA:
UNADSK .DB 0 ; DISK NUMBER 0-15
UNATRK .DW 0 ; TWO BYTES FOR TRACK # (LOGICAL)
UNASEC .DW 0 ; TWO BYTES FOR SECTOR # (LOGICAL)
UNADSK .DB 0 ; DISK NUMBER 0-15
UNATRK .DW 0 ; TWO BYTES FOR TRACK # (LOGICAL)
UNASEC .DW 0 ; TWO BYTES FOR SECTOR # (LOGICAL)
;
;
UNASIZ .EQU $ - UNA
UNASIZ .EQU $ - UNA
;
;
@ -1595,13 +1745,13 @@ ALS_HD .EQU 256 ; ALS: BLKS / 8 = 2048 / 8 = 256 (ROUNDED UP)
; BLS BSH BLM EXM (DSM<256) EXM (DSM>255)
; BLS BSH BLM EXM (DSM<256) EXM (DSM>255)
; ---------- --- --- ------------- -------------
; ---------- --- --- ------------- -------------
; 1,024 3 7 0 N/A
; 1,024 3 7 0 N/A
; 2,048 4 15 1 0
; 4,096 5 31 3 1
; 8,192 6 63 7 3
; 16,384 7 127 15 7
; 2,048 4 15 1 0
; 4,096 5 31 3 1
; 8,192 6 63 7 3
; 16,384 7 127 15 7
;
;
; AL0/1: EACH BIT SET ALLOCATES A BLOCK OF DIR ENTRIES. EACH DIR ENTRY
; IS 32 BYTES. BIT COUNT = (((DRM + 1) * 32) / BLS)
; AL0/1: EACH BIT SET ALLOCATES A BLOCK OF DIR ENTRIES. EACH DIR ENTRY
; IS 32 BYTES. BIT COUNT = (((DRM + 1) * 32) / BLS)
;
;
; CKS = (DIR ENT / 4), ZERO FOR NON-REMOVABLE MEDIA
; CKS = (DIR ENT / 4), ZERO FOR NON-REMOVABLE MEDIA
;
;
@ -1623,16 +1773,16 @@ ALS_HD .EQU 256 ; ALS: BLKS / 8 = 2048 / 8 = 256 (ROUNDED UP)
.DW AL S_ROM ; ALS: BLKS / 8
.DW AL S_ROM ; ALS: BLKS / 8
.DB ( 2048 / 128 ) ; RECORDS PER BLOCK (BLS / 128)
.DB ( 2048 / 128 ) ; RECORDS PER BLOCK (BLS / 128)
DPB_ROM:
DPB_ROM:
.DW 64 ; SPT: SECTORS PER TRACK
.DB 4 ; BSH: BLOCK SHIFT FACTOR
.DB 15 ; BLM: BLOCK MASK
.DW 64 ; SPT: SECTORS PER TRACK
.DB 4 ; BSH: BLOCK SHIFT FACTOR
.DB 15 ; BLM: BLOCK MASK
.DB 1 ; EXM: (BLKS <= 256) ? 1 : 0
.DB 1 ; EXM: (BLKS <= 256) ? 1 : 0
.DW 192 - 1 ; DSM: TOTAL STORAGE IN BLOCKS - 1
.DW 192 - 1 ; DSM: TOTAL STORAGE IN BLOCKS - 1
.DW 255 ; DRM: DIR ENTRIES - 1 = 255
.DB 11110000B ; AL0: DIR BLK BIT MAP, FIRST BYTE
.DB 00000000B ; AL1: DIR BLK BIT MAP, SECOND BYTE
.DW 0 ; CKS: ZERO FOR NON-REMOVABLE MEDIA
.DW 0 ; OFF: ROM DISK HAS NO SYSTEM AREA
.DW 255 ; DRM: DIR ENTRIES - 1 = 255
.DB 11110000B ; AL0: DIR BLK BIT MAP, FIRST BYTE
.DB 00000000B ; AL1: DIR BLK BIT MAP, SECOND BYTE
.DW 0 ; CKS: ZERO FOR NON-REMOVABLE MEDIA
.DW 0 ; OFF: ROM DISK HAS NO SYSTEM AREA
;__________________________________________________________________________________________________
;__________________________________________________________________________________________________
;
;
; RAM DISK: 64 SECS/TRK, 128 BYTES/SEC
; RAM DISK: 64 SECS/TRK, 128 BYTES/SEC
@ -1650,16 +1800,16 @@ DPB_ROM:
.DW AL S_RAM ; ALS: BLKS / 8
.DW AL S_RAM ; ALS: BLKS / 8
.DB ( 2048 / 128 ) ; RECORDS PER BLOCK (BLS / 128)
.DB ( 2048 / 128 ) ; RECORDS PER BLOCK (BLS / 128)
DPB_RAM:
DPB_RAM:
.DW 64 ; SPT: SECTORS PER TRACK
.DB 4 ; BSH: BLOCK SHIFT FACTOR
.DB 15 ; BLM: BLOCK MASK
.DW 64 ; SPT: SECTORS PER TRACK
.DB 4 ; BSH: BLOCK SHIFT FACTOR
.DB 15 ; BLM: BLOCK MASK
.DB 1 ; EXM: (BLKS <= 256) ? 1 : 0
.DB 1 ; EXM: (BLKS <= 256) ? 1 : 0
.DW 192 - 1 ; DSM: TOTAL STORAGE IN BLOCKS - 1
.DW 192 - 1 ; DSM: TOTAL STORAGE IN BLOCKS - 1
.DW 255 ; DRM: DIR ENTRIES - 1 = 255
.DB 11110000B ; AL0: DIR BLK BIT MAP, FIRST BYTE
.DB 00000000B ; AL1: DIR BLK BIT MAP, SECOND BYTE
.DW 0 ; CKS: ZERO FOR NON-REMOVABLE MEDIA
.DW 0 ; OFF: RESERVED TRACKS = 0 TRK
.DW 255 ; DRM: DIR ENTRIES - 1 = 255
.DB 11110000B ; AL0: DIR BLK BIT MAP, FIRST BYTE
.DB 00000000B ; AL1: DIR BLK BIT MAP, SECOND BYTE
.DW 0 ; CKS: ZERO FOR NON-REMOVABLE MEDIA
.DW 0 ; OFF: RESERVED TRACKS = 0 TRK
;__________________________________________________________________________________________________
;__________________________________________________________________________________________________
;
;
; 4MB RAM FLOPPY DRIVE, 32 TRKS, 1024 SECS/TRK, 128 BYTES/SEC
; 4MB RAM FLOPPY DRIVE, 32 TRKS, 1024 SECS/TRK, 128 BYTES/SEC
@ -1669,16 +1819,16 @@ DPB_RAM:
.DW AL S_HD
.DW AL S_HD
.DB ( 2048 / 128 ) ; RECORDS PER BLOCK (BLS / 128)
.DB ( 2048 / 128 ) ; RECORDS PER BLOCK (BLS / 128)
DPB_RF:
DPB_RF:
.DW 64 ; SPT: SECTORS PER TRACK
.DB 4 ; BSH: BLOCK SHIFT FACTOR
.DB 15 ; BLM: BLOCK MASK
.DB 0 ; EXM: EXTENT MASK
.DW 2047 ; DSM: TOTAL STORAGE IN BLOCKS - 1 BLK = (4MB / 2K BLS) - 1 = 2047
.DW 511 ; DRM: DIR ENTRIES - 1 = 256 - 1 = 255
.DB 11111111B ; AL0: DIR BLK BIT MAP, FIRST BYTE
.DB 00000000B ; AL1: DIR BLK BIT MAP, SECOND BYTE
.DW 0 ; CKS: ZERO FOR NON-REMOVABLE MEDIA
.DW 0 ; OFF: RESERVED TRACKS = 0 TRK
.DW 64 ; SPT: SECTORS PER TRACK
.DB 4 ; BSH: BLOCK SHIFT FACTOR
.DB 15 ; BLM: BLOCK MASK
.DB 0 ; EXM: EXTENT MASK
.DW 2047 ; DSM: TOTAL STORAGE IN BLOCKS - 1 BLK = (4MB / 2K BLS) - 1 = 2047
.DW 511 ; DRM: DIR ENTRIES - 1 = 256 - 1 = 255
.DB 11111111B ; AL0: DIR BLK BIT MAP, FIRST BYTE
.DB 00000000B ; AL1: DIR BLK BIT MAP, SECOND BYTE
.DW 0 ; CKS: ZERO FOR NON-REMOVABLE MEDIA
.DW 0 ; OFF: RESERVED TRACKS = 0 TRK
;__________________________________________________________________________________________________
;__________________________________________________________________________________________________
;
;
; GENERIC HARD DISK DRIVE (8MB DATA SPACE + 128K RESERVED SPACE)
; GENERIC HARD DISK DRIVE (8MB DATA SPACE + 128K RESERVED SPACE)
@ -1690,16 +1840,33 @@ DPB_RF:
.DW AL S_HD
.DW AL S_HD
.DB ( 4096 / 128 ) ; RECORDS PER BLOCK (BLS / 128)
.DB ( 4096 / 128 ) ; RECORDS PER BLOCK (BLS / 128)
DPB_HD:
DPB_HD:
.DW 64 ; SPT: SECTORS PER TRACK
.DB 5 ; BSH: BLOCK SHIFT FACTOR
.DB 31 ; BLM: BLOCK MASK
.DB 1 ; EXM: EXTENT MASK
.DW 2047 ; DSM: TOTAL STORAGE IN BLOCKS - 1 = (8MB / 4K BLS) - 1 = 2047
.DW 511 ; DRM: DIR ENTRIES - 1 = 512 - 1 = 511
.DB 11110000B ; AL0: DIR BLK BIT MAP, FIRST BYTE
.DB 00000000B ; AL1: DIR BLK BIT MAP, SECOND BYTE
.DW 0 ; CKS: DIRECTORY CHECK VECTOR SIZE = 256 / 4
.DW 16 ; OFF: RESERVED TRACKS = 16 TRKS * (16 TRKS * 16 HEADS * 16 SECS * 512 BYTES) = 128K
.DW 64 ; SPT: SECTORS PER TRACK
.DB 5 ; BSH: BLOCK SHIFT FACTOR
.DB 31 ; BLM: BLOCK MASK
.DB 1 ; EXM: EXTENT MASK
.DW 2047 ; DSM: TOTAL STORAGE IN BLOCKS - 1 = (8MB / 4K BLS) - 1 = 2047
.DW 512 - 1 ; DRM: DIR ENTRIES - 1
.DB 11110000B ; AL0: DIR BLK BIT MAP, FIRST BYTE
.DB 00000000B ; AL1: DIR BLK BIT MAP, SECOND BYTE
.DW 0 ; CKS: DIRECTORY CHECK VECTOR SIZE = 256 / 4
.DW 16 ; OFF: RESERVED TRACKS
;
; BLOCKSIZE (BLS) = 4K, DIRECTORY ENTRIES = 1024
;
.DW CKS_HD
.DW AL S_HD
.DB ( 4096 / 128 ) ; RECORDS PER BLOCK (BLS / 128)
DPB_HDNEW:
.DW 64 ; SPT: SECTORS PER TRACK
.DB 5 ; BSH: BLOCK SHIFT FACTOR
.DB 31 ; BLM: BLOCK MASK
.DB 1 ; EXM: EXTENT MASK
.DW 2048 - 1 - 4 ; DSM: STORAGE BLOCKS - 1 - RES TRKS
.DW 1024 - 1 ; DRM: DIR ENTRIES - 1
.DB 11111111B ; AL0: DIR BLK BIT MAP, FIRST BYTE
.DB 00000000B ; AL1: DIR BLK BIT MAP, SECOND BYTE
.DW 0 ; CKS: DIRECTORY CHECK VECTOR SIZE = 256 / 4
.DW 2 ; OFF: RESERVED TRACKS
;__________________________________________________________________________________________________
;__________________________________________________________________________________________________
;
;
; IBM 720KB 3.5" FLOPPY DRIVE, 80 TRKS, 36 SECS/TRK, 512 BYTES/SEC
; IBM 720KB 3.5" FLOPPY DRIVE, 80 TRKS, 36 SECS/TRK, 512 BYTES/SEC
@ -1709,16 +1876,16 @@ DPB_HD:
.DW AL S_FD
.DW AL S_FD
.DB ( 2048 / 128 ) ; RECORDS PER BLOCK (BLS / 128)
.DB ( 2048 / 128 ) ; RECORDS PER BLOCK (BLS / 128)
DPB_FD720:
DPB_FD720:
.DW 36 ; SPT: SECTORS PER TRACK
.DB 4 ; BSH: BLOCK SHIFT FACTOR
.DB 15 ; BLM: BLOCK MASK
.DB 0 ; EXM: EXTENT MASK
.DW 350 ; DSM: TOTAL STORAGE IN BLOCKS - 1 BLK = ((720K - 18K OFF) / 2K BLS) - 1 = 350
.DW 127 ; DRM: DIR ENTRIES - 1 = 128 - 1 = 127
.DB 11000000B ; AL0: DIR BLK BIT MAP, FIRST BYTE
.DB 00000000B ; AL1: DIR BLK BIT MAP, SECOND BYTE
.DW 32 ; CKS: DIRECTORY CHECK VECTOR SIZE = 128 / 4
.DW 4 ; OFF: RESERVED TRACKS = 4 TRKS * (512 B/SEC * 36 SEC/TRK) = 18K
.DW 36 ; SPT: SECTORS PER TRACK
.DB 4 ; BSH: BLOCK SHIFT FACTOR
.DB 15 ; BLM: BLOCK MASK
.DB 0 ; EXM: EXTENT MASK
.DW 350 ; DSM: TOTAL STORAGE IN BLOCKS - 1 BLK = ((720K - 18K OFF) / 2K BLS) - 1 = 350
.DW 127 ; DRM: DIR ENTRIES - 1 = 128 - 1 = 127
.DB 11000000B ; AL0: DIR BLK BIT MAP, FIRST BYTE
.DB 00000000B ; AL1: DIR BLK BIT MAP, SECOND BYTE
.DW 32 ; CKS: DIRECTORY CHECK VECTOR SIZE = 128 / 4
.DW 4 ; OFF: RESERVED TRACKS = 4 TRKS * (512 B/SEC * 36 SEC/TRK) = 18K
;__________________________________________________________________________________________________
;__________________________________________________________________________________________________
;
;
; IBM 1.44MB 3.5" FLOPPY DRIVE, 80 TRKS, 72 SECS/TRK, 512 BYTES/SEC
; IBM 1.44MB 3.5" FLOPPY DRIVE, 80 TRKS, 72 SECS/TRK, 512 BYTES/SEC
@ -1728,16 +1895,16 @@ DPB_FD720:
.DW AL S_FD
.DW AL S_FD
.DB ( 2048 / 128 ) ; RECORDS PER BLOCK (BLS / 128)
.DB ( 2048 / 128 ) ; RECORDS PER BLOCK (BLS / 128)
DPB_FD144:
DPB_FD144:
.DW 72 ; SPT: SECTORS PER TRACK
.DB 4 ; BSH: BLOCK SHIFT FACTOR
.DB 15 ; BLM: BLOCK MASK
.DB 0 ; EXM: EXTENT MASK
.DW 710 ; DSM: TOTAL STORAGE IN BLOCKS - 1 BLK = ((1,440K - 18K OFF) / 2K BLS) - 1 = 710
.DW 255 ; DRM: DIR ENTRIES - 1 = 256 - 1 = 255
.DB 11110000B ; AL0: DIR BLK BIT MAP, FIRST BYTE
.DB 00000000B ; AL1: DIR BLK BIT MAP, SECOND BYTE
.DW 64 ; CKS: DIRECTORY CHECK VECTOR SIZE = 256 / 4
.DW 2 ; OFF: RESERVED TRACKS = 2 TRKS * (512 B/SEC * 72 SEC/TRK) = 18K
.DW 72 ; SPT: SECTORS PER TRACK
.DB 4 ; BSH: BLOCK SHIFT FACTOR
.DB 15 ; BLM: BLOCK MASK
.DB 0 ; EXM: EXTENT MASK
.DW 710 ; DSM: TOTAL STORAGE IN BLOCKS - 1 BLK = ((1,440K - 18K OFF) / 2K BLS) - 1 = 710
.DW 255 ; DRM: DIR ENTRIES - 1 = 256 - 1 = 255
.DB 11110000B ; AL0: DIR BLK BIT MAP, FIRST BYTE
.DB 00000000B ; AL1: DIR BLK BIT MAP, SECOND BYTE
.DW 64 ; CKS: DIRECTORY CHECK VECTOR SIZE = 256 / 4
.DW 2 ; OFF: RESERVED TRACKS = 2 TRKS * (512 B/SEC * 72 SEC/TRK) = 18K
;__________________________________________________________________________________________________
;__________________________________________________________________________________________________
;
;
; IBM 360KB 5.25" FLOPPY DRIVE, 40 TRKS, 9 SECS/TRK, 512 BYTES/SEC
; IBM 360KB 5.25" FLOPPY DRIVE, 40 TRKS, 9 SECS/TRK, 512 BYTES/SEC
@ -1747,16 +1914,16 @@ DPB_FD144:
.DW AL S_FD
.DW AL S_FD
.DB ( 2048 / 128 ) ; RECORDS PER BLOCK (BLS / 128)
.DB ( 2048 / 128 ) ; RECORDS PER BLOCK (BLS / 128)
DPB_FD360:
DPB_FD360:
.DW 36 ; SPT: SECTORS PER TRACK
.DB 4 ; BSH: BLOCK SHIFT FACTOR
.DB 15 ; BLM: BLOCK MASK
.DB 1 ; EXM: EXTENT MASK
.DW 170 ; DSM: TOTAL STORAGE IN BLOCKS - 1 BLK = ((360K - 18K OFF) / 2K BLS) - 1 = 170
.DW 127 ; DRM: DIR ENTRIES - 1 = 128 - 1 = 127
.DB 11110000B ; AL0: DIR BLK BIT MAP, FIRST BYTE
.DB 00000000B ; AL1: DIR BLK BIT MAP, SECOND BYTE
.DW 32 ; CKS: DIRECTORY CHECK VECTOR SIZE = 128 / 4
.DW 4 ; OFF: RESERVED TRACKS = 4 TRKS * (512 B/SEC * 36 SEC/TRK) = 18K
.DW 36 ; SPT: SECTORS PER TRACK
.DB 4 ; BSH: BLOCK SHIFT FACTOR
.DB 15 ; BLM: BLOCK MASK
.DB 1 ; EXM: EXTENT MASK
.DW 170 ; DSM: TOTAL STORAGE IN BLOCKS - 1 BLK = ((360K - 18K OFF) / 2K BLS) - 1 = 170
.DW 127 ; DRM: DIR ENTRIES - 1 = 128 - 1 = 127
.DB 11110000B ; AL0: DIR BLK BIT MAP, FIRST BYTE
.DB 00000000B ; AL1: DIR BLK BIT MAP, SECOND BYTE
.DW 32 ; CKS: DIRECTORY CHECK VECTOR SIZE = 128 / 4
.DW 4 ; OFF: RESERVED TRACKS = 4 TRKS * (512 B/SEC * 36 SEC/TRK) = 18K
;__________________________________________________________________________________________________
;__________________________________________________________________________________________________
;
;
; IBM 1.20MB 5.25" FLOPPY DRIVE, 80 TRKS, 15 SECS/TRK, 512 BYTES/SEC
; IBM 1.20MB 5.25" FLOPPY DRIVE, 80 TRKS, 15 SECS/TRK, 512 BYTES/SEC
@ -1766,16 +1933,16 @@ DPB_FD360:
.DW AL S_FD
.DW AL S_FD
.DB ( 2048 / 128 ) ; RECORDS PER BLOCK (BLS / 128)
.DB ( 2048 / 128 ) ; RECORDS PER BLOCK (BLS / 128)
DPB_FD120:
DPB_FD120:
.DW 60 ; SPT: SECTORS PER TRACK
.DB 4 ; BSH: BLOCK SHIFT FACTOR
.DB 15 ; BLM: BLOCK MASK
.DB 0 ; EXM: EXTENT MASK
.DW 591 ; DSM: TOTAL STORAGE IN BLOCKS - 1 BLK = ((1,200K - 15K OFF) / 2K BLS) - 1 = 591
.DW 255 ; DRM: DIR ENTRIES - 1 = 256 - 1 = 255
.DB 11110000B ; AL0: DIR BLK BIT MAP, FIRST BYTE
.DB 00000000B ; AL1: DIR BLK BIT MAP, SECOND BYTE
.DW 64 ; CKS: DIRECTORY CHECK VECTOR SIZE = 256 / 4
.DW 2 ; OFF: RESERVED TRACKS = 2 TRKS * (512 B/SEC * 60 SEC/TRK) = 15K
.DW 60 ; SPT: SECTORS PER TRACK
.DB 4 ; BSH: BLOCK SHIFT FACTOR
.DB 15 ; BLM: BLOCK MASK
.DB 0 ; EXM: EXTENT MASK
.DW 591 ; DSM: TOTAL STORAGE IN BLOCKS - 1 BLK = ((1,200K - 15K OFF) / 2K BLS) - 1 = 591
.DW 255 ; DRM: DIR ENTRIES - 1 = 256 - 1 = 255
.DB 11110000B ; AL0: DIR BLK BIT MAP, FIRST BYTE
.DB 00000000B ; AL1: DIR BLK BIT MAP, SECOND BYTE
.DW 64 ; CKS: DIRECTORY CHECK VECTOR SIZE = 256 / 4
.DW 2 ; OFF: RESERVED TRACKS = 2 TRKS * (512 B/SEC * 60 SEC/TRK) = 15K
;__________________________________________________________________________________________________
;__________________________________________________________________________________________________
;
;
; IBM 1.11MB 8" FLOPPY DRIVE, 77 TRKS, 15 SECS/TRK, 512 BYTES/SEC
; IBM 1.11MB 8" FLOPPY DRIVE, 77 TRKS, 15 SECS/TRK, 512 BYTES/SEC
@ -1785,16 +1952,16 @@ DPB_FD120:
.DW AL S_FD
.DW AL S_FD
.DB ( 2048 / 128 ) ; RECORDS PER BLOCK (BLS / 128)
.DB ( 2048 / 128 ) ; RECORDS PER BLOCK (BLS / 128)
DPB_FD111:
DPB_FD111:
.DW 60 ; SPT: SECTORS PER TRACK
.DB 4 ; BSH: BLOCK SHIFT FACTOR
.DB 15 ; BLM: BLOCK MASK
.DB 0 ; EXM: EXTENT MASK
.DW 569 ; DSM: TOTAL STORAGE IN BLOCKS - 1 BLK = ((1,155K - 15K OFF) / 2K BLS) - 1 = 569
.DW 255 ; DRM: DIR ENTRIES - 1 = 256 - 1 = 255
.DB 11110000B ; AL0: DIR BLK BIT MAP, FIRST BYTE
.DB 00000000B ; AL1: DIR BLK BIT MAP, SECOND BYTE
.DW 64 ; CKS: DIRECTORY CHECK VECTOR SIZE = 256 / 4
.DW 2 ; OFF: RESERVED TRACKS = 2 TRKS * (512 B/SEC * 60 SEC/TRK) = 15K
.DW 60 ; SPT: SECTORS PER TRACK
.DB 4 ; BSH: BLOCK SHIFT FACTOR
.DB 15 ; BLM: BLOCK MASK
.DB 0 ; EXM: EXTENT MASK
.DW 569 ; DSM: TOTAL STORAGE IN BLOCKS - 1 BLK = ((1,155K - 15K OFF) / 2K BLS) - 1 = 569
.DW 255 ; DRM: DIR ENTRIES - 1 = 256 - 1 = 255
.DB 11110000B ; AL0: DIR BLK BIT MAP, FIRST BYTE
.DB 00000000B ; AL1: DIR BLK BIT MAP, SECOND BYTE
.DW 64 ; CKS: DIRECTORY CHECK VECTOR SIZE = 256 / 4
.DW 2 ; OFF: RESERVED TRACKS = 2 TRKS * (512 B/SEC * 60 SEC/TRK) = 15K
;
;
# IFDEF PLTUNA
# IFDEF PLTUNA
SECBUF .FILL 512 , 0 ; PHYSICAL DISK SECTOR BUFFER
SECBUF .FILL 512 , 0 ; PHYSICAL DISK SECTOR BUFFER
@ -2650,7 +2817,8 @@ DPH_INIT:
LD H , 0 ; ... INTO HL
LD H , 0 ; ... INTO HL
ADD HL , HL ; MULTIPLY
ADD HL , HL ; MULTIPLY
ADD HL , HL ; ... BY SIZE
ADD HL , HL ; ... BY SIZE
ADD HL , HL ; ... OF DPH (16)
CALL ADDHLA ; ...
ADD HL , HL ; ... OF DPH (20)
ADD HL , HL ; ... FOR TOTAL SIZE
ADD HL , HL ; ... FOR TOTAL SIZE
CALL AL LOC ; ALLOCATE THE SPACE
CALL AL LOC ; ALLOCATE THE SPACE
CALL C , PANIC ; SHOULD NEVER ERROR
CALL C , PANIC ; SHOULD NEVER ERROR
@ -2707,7 +2875,8 @@ DPH_INIT2:
LD ( HL ), D ; ... DRIVE MAP
LD ( HL ), D ; ... DRIVE MAP
INC HL ; AND BUMP TO START OF NEXT ENTRY
INC HL ; AND BUMP TO START OF NEXT ENTRY
; UPDATE DPH ALLOCATION TOP
; UPDATE DPH ALLOCATION TOP
LD A , 16 ; SIZE OF A DPH ENTRY
;LD A,16 ; SIZE OF A DPH ENTRY
LD A , 20 ; SIZE OF A DPH ENTRY
EX DE , HL ; HL := DPH POINTER
EX DE , HL ; HL := DPH POINTER
CALL ADDHLA ; CALC NEW DPHTOP
CALL ADDHLA ; CALC NEW DPHTOP
LD ( DPHTOP ), HL ; SAVE IT
LD ( DPHTOP ), HL ; SAVE IT
@ -3011,7 +3180,7 @@ CMD .DB CMDLEN - 2
CMDLEN .EQU $ - CMD
CMDLEN .EQU $ - CMD
;
;
FCB_SUB .DB '?' ; DRIVE CODE, 0 = CURRENT DRIVE
FCB_SUB .DB '?' ; DRIVE CODE, 0 = CURRENT DRIVE
.DB "SUBMIT " ; FILE NAME, 8 CHARS
.DB "SUBMIT " ; FILE NAME, 8 CHARS
.DB "COM" ; FILE TYPE, 3 CHARS
.DB "COM" ; FILE TYPE, 3 CHARS
.FILL 36 - ( $ - FCB_SUB ), 0 ; ZERO FILL REMAINDER OF FCB
.FILL 36 - ( $ - FCB_SUB ), 0 ; ZERO FILL REMAINDER OF FCB
;
;
@ -3023,7 +3192,7 @@ FCB_PRO .DB '?' ; DRIVE CODE, 0 = CURRENT DRIVE
STR_BANNER .DB "CBIOS v" , BIOSVER , " [" , PLTSTR , "]$"
STR_BANNER .DB "CBIOS v" , BIOSVER , " [" , PLTSTR , "]$"
STR_INITRAMDISK .DB "Formatting RAMDISK...$"
STR_INITRAMDISK .DB "Formatting RAMDISK...$"
STR_LDR2 .DB "\r\n"
STR_LDR2 .DB "\r\n"
STR_LDR .DB "\r\n $"
STR_LDR .DB "\r\n $"
STR_DPHINIT .DB "Configuring Drives...$"
STR_DPHINIT .DB "Configuring Drives...$"
STR_HEAPOVF .DB " *** Insufficient Memory ***$"
STR_HEAPOVF .DB " *** Insufficient Memory ***$"
STR_INVMED .DB " *** Invalid Device ID ***$"
STR_INVMED .DB " *** Invalid Device ID ***$"