From a1be61427985524e931b086bcac171b189f08561 Mon Sep 17 00:00:00 2001 From: Wayne Warthen Date: Mon, 4 May 2020 13:34:36 -0700 Subject: [PATCH] Cleanup --- Source/CBIOS/cbios.asm | 105 ++++++++++++++++++++++++++-------------- Source/CPM3/diskio.z80 | 2 +- Source/HBIOS/romldr.asm | 1 - 3 files changed, 71 insertions(+), 37 deletions(-) diff --git a/Source/CBIOS/cbios.asm b/Source/CBIOS/cbios.asm index 805a43bc..7e24d981 100644 --- a/Source/CBIOS/cbios.asm +++ b/Source/CBIOS/cbios.asm @@ -1247,6 +1247,10 @@ DSK_SELECT: LD HL,0 ; ZERO LD (SEKLBA),HL ; CLEAR FIRST WORD LD (SEKLBA+2),HL ; CLEAR SECOND WORD +; + ; SET LEGACY SECTORS PER SLICE + LD HL,16640 ; LEGACY SECTORS PER SLICE + LD (SPS),HL ; SAVE IT ; ; CHECK MBR OF PHYSICAL DISK BEING SELECTED ; WILL UPDATE MEDID AND LBAOFF IF VALID CP/M PARTITION EXISTS @@ -1273,7 +1277,7 @@ DSK_SELECT: INC HL ; BUMP TO MSB LD (HL),D ; SET MSB OF DPB IN DPH ; -; ; PLUG LBA OFFSET INTO ACTIVE 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 @@ -1364,6 +1368,9 @@ DSK_MBR3: LD DE,SEKLBA ; LOC TO STORE LBA OFFSET LD BC,4 ; 4 BYTES (32 BITS) LDIR ; COPY IT + ; IF BOOT FROM PARTITION, USE NEW SECTORS PER SLICE VALUE + LD HL,16384 ; NEW SECTORS PER SLICE + LD (SPS),HL ; SAVE IT ; DSK_MBR4: ; RESTORE BANK @@ -1371,46 +1378,73 @@ DSK_MBR4: 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,DSK_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 DSK_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 + ; ADJUST LBA OFFSET BASED ON TARGET SLICE + LD A,(SLICE) ; GET SLICE, A IS LOOP CNT + LD HL,(SEKLBA) ; SET DE:HL + LD DE,(SEKLBA+2) ; ... TO STARTING LBA + LD BC,(SPS) ; SECTORS PER SLICE +BOOT6: + OR A ; SET FLAGS TO CHECK LOOP CNTR + JR Z,BOOT8 ; DONE IF COUNTER EXHAUSTED + ADD HL,BC ; ADD ONE SLICE TO LOW WORD + JR NC,BOOT7 ; CHECK FOR CARRY + INC DE ; IF SO, BUMP HIGH WORD +BOOT7: + DEC A ; DEC LOOP DOWNCOUNTER + JR BOOT6 ; AND LOOP +BOOT8: + LD (LBA),HL ; SAVE NEW LBA, LOW WORD + LD (LBA+2),DE ; SAVE NEW LBA, HIGH WORD ; RESAVE IT LD (SEKLBA),HL ; LOWORD LD (SEKLBA+2),DE ; HIWORD ; SUCCESSFUL FINISH XOR A ; SUCCESS RET ; DONE + + + + + +; ; DIFFERENT ALGORITHM FOR NEW HD FORMAT +; LD A,(MEDID) ; GET MEDIA ID +; CP MID_HDNEW ; NEW FORMAT? +; JR Z,DSK_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 DSK_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 ; @@ -1654,6 +1688,7 @@ DEFDRIVE .DB 0 ; DEFAULT DRIVE CCPBUF .DW 0 ; ADDRESS OF CCP BUF IN BIOS BANK MEDID .DB 0 ; TEMP STORAGE FOR MEDIA ID SLICE .DB 0 ; CURRENT SLICE +SPS .DW 0 ; SECTORS PER SLICE ; #IFDEF PLTWBW BNKBIOS .DB 0 ; BIOS BANK ID diff --git a/Source/CPM3/diskio.z80 b/Source/CPM3/diskio.z80 index 61f63900..7157619d 100644 --- a/Source/CPM3/diskio.z80 +++ b/Source/CPM3/diskio.z80 @@ -499,7 +499,7 @@ media4: media5: ; Adjust LBA offset based on target slice - ld a,(slice) ; get boot slice, A is loop cnt + ld a,(slice) ; get slice, A is loop cnt ld hl,(lba) ; set DE:HL ld de,(lba+2) ; ... to starting LBA ld bc,(sps) ; sectors per slice diff --git a/Source/HBIOS/romldr.asm b/Source/HBIOS/romldr.asm index 0abb1668..2bf562ad 100644 --- a/Source/HBIOS/romldr.asm +++ b/Source/HBIOS/romldr.asm @@ -632,7 +632,6 @@ diskboot: #if (BIOS == BIOS_WBW) ; ; Check that drive actually exists - ;ld c,a ; put in C for func call ld b,BF_SYSGET ; HBIOS func: sys get ld c,BF_SYSGET_DIOCNT ; HBIOS sub-func: disk count rst 08 ; do it, E=disk count