From d8e1695ca0f4958c854d665a39cc91cb5aabc1e6 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Sat, 25 Nov 2023 08:28:06 +1000 Subject: [PATCH] ... --- Shared_Includes | 2 +- src/bios/exp/EXTENDED/HDD_DRIVER_6.asm | 63 +++++++++++-------------- src/bios/exp/FUNC_4x.ASM | 53 ++++++++++----------- src/bios/shared/RECOVERY.IMG | Bin 98304 -> 98304 bytes 4 files changed, 53 insertions(+), 65 deletions(-) diff --git a/Shared_Includes b/Shared_Includes index 1826974..349ba28 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 18269745815d90e76686f5693e0cb45f8f31741c +Subproject commit 349ba286106d21a77cf3f8a25b6f7c952eccb046 diff --git a/src/bios/exp/EXTENDED/HDD_DRIVER_6.asm b/src/bios/exp/EXTENDED/HDD_DRIVER_6.asm index 80bf3ae..cda8e56 100644 --- a/src/bios/exp/EXTENDED/HDD_DRIVER_6.asm +++ b/src/bios/exp/EXTENDED/HDD_DRIVER_6.asm @@ -117,7 +117,6 @@ SELHH: EXX LD A,IDE.Chanel.Primary SELCHAN: OUT (IDE.Chanel.Set),A ;R02 - LD A,(IY+IDE.HDD_INIT_TABLE.DriveType) CP IDE.Device.HDD ;!FIXIT возможно, нахрен не нужно, потому-что если CD, то прилетит в драйвер CD LD A,(IY+IDE.HDD_INIT_TABLE.DRV_Flags) @@ -128,7 +127,7 @@ SELCHAN: EXX RET Z NODRIVE: - LD A,2 ;!HARDCODE + LD A,BIOS.Error.BadDrvNumber SCF RET @@ -239,13 +238,13 @@ HDD_5x.LONG_READ: ADD IX,BC LD B,C ADC HL,BC - EX AF,AF' + ;EX AF,AF' ;!TEST 21/11/23 JR RST8RDR RNOT256 ADD IX,BC LD C,B ADC HL,BC - EX AF,AF' + ;EX AF,AF' ;!TEST 21/11/23 JR RST8RDR HERRRD0 LD B,A @@ -265,14 +264,13 @@ HERRRD0 LD B,A LD C,A LD A,B LD B,C - SCF ;R03 - EX AF,AF' ;R03 -RST8RDR: - - RESTORE_PORTY - + ;R03 + SCF + ;EX AF,AF' ;!TEST 21/11/23 + ; +RST8RDR: RESTORE_PORTY POP IY - EX AF,AF' + ;EX AF,AF' ;!TEST 21/11/23 RET ;READ SECTOR(S) RDS000: CALL SELECTH @@ -401,13 +399,13 @@ HDD_5x.LONG_WRITE: ADD IX,BC LD B,C ADC HL,BC - EX AF,AF' + ;EX AF,AF' JR RST8WRR WNOT256 ADD IX,BC LD C,B ADC HL,BC - EX AF,AF' + ;EX AF,AF' JR RST8WRR HERRWR0 LD B,A @@ -427,14 +425,13 @@ HERRWR0 LD B,A LD C,A LD A,B LD B,C - SCF ;R03 - EX AF,AF' ;R03 ;!FIXIT намудрил он чёт в этом R03 -RST8WRR EXX - POP BC - OUT (C),B - EXX + ;R03 + SCF ;R03 + ;EX AF,AF' ;R03 ;!FIXIT намудрил он чёт в этом R03 + ; +RST8WRR: RESTORE_PORTY POP IY - EX AF,AF' + ;EX AF,AF' RET ;WRITE SECTOR(S) @@ -451,6 +448,7 @@ WRS000: PUSH AF PUSH DE + ;[x] CMOS Write Protect Disabled IF HDDwriteProtect PUSH BC LD D,#1D ;!HARDCODE CMOS Write Protect @@ -462,7 +460,7 @@ WRS000: POP AF EX AF,AF' LD XL,0 - LD A,8 ;WRITE PROTECT + LD A,BIOS.Error.WriteProtect SCF RET ENDIF @@ -483,13 +481,12 @@ WRS002: EXX EXX RET C - //DI + ;DI IN A,(SLOT3) EX AF,AF' LD A,XH OUT (SLOT3),A LD BC,IDE.Write.Data - ;LD D,#20 LD D,512/WRITE_OUTI_DUPs WRS003: @@ -542,18 +539,13 @@ WRS003: ;VERIFY SECTOR(S) HDD_5x.VERIFY: PUSH IY - - SAFE_PORTY_2 - + SAFE_PORTY_2 PUSH IX PUSH HL CALL VRS000 POP HL POP IX - EXX - POP BC - OUT (C),B - EXX + RESTORE_PORTY POP IY RET ;[]================================================================[#54] @@ -679,9 +671,7 @@ CHS005: INC A WAITPRT: LD BC,IDE.Read.Status LD HL,#0000 ; задержка ;!HARDCODE - .loop: PUSH HL - .loop2: IN A,(C) AND D CP E @@ -690,12 +680,12 @@ WAITPRT: LD A,L OR H JP NZ,.loop2 - + ; POP HL DEC L JR NZ,.loop - -.error: LD A,4 ;!HARDCODE error number + ; +.error: LD A,BIOS.Error.WaitPort SCF RET .ok: POP HL @@ -711,7 +701,7 @@ WAITPRT: HDD_5x.DETECT: CP #84 ;!HARDCODE max HDD drives (#80,#81,#82,#83) CCF - RET C + JR C,.error LD HL,IDE.INIT_TBL_IDE0.DriveType AND 3 @@ -736,5 +726,6 @@ HDD_5x.DETECT: CP IDE.Device.HDD RET Z SCF +.error: LD A,BIOS.Error.BadDrvNumber RET ;[]================================================================[#57] \ No newline at end of file diff --git a/src/bios/exp/FUNC_4x.ASM b/src/bios/exp/FUNC_4x.ASM index dd440eb..e4b7412 100644 --- a/src/bios/exp/FUNC_4x.ASM +++ b/src/bios/exp/FUNC_4x.ASM @@ -179,7 +179,6 @@ FN_HDD_READ_BPB: RET C CALL HD_BPB_PREP RET C - JR HD_RD_L1 @@ -249,14 +248,14 @@ HD_READ_CONT: .loop_read1: DUP 16 - INI ; всего 16 раз INI - оптимально. + INI ; всего 16 раз INI - оптимально. EDUP - JP NZ,.loop_read1 + JR NZ,.loop_read1 .loop_read2: DUP 16 - INI ; всего 16 раз INI - оптимально. + INI ; всего 16 раз INI - оптимально. EDUP - JP NZ,.loop_read2 + JR NZ,.loop_read2 LD A,H OR L @@ -303,14 +302,14 @@ HD_WR_L2: JP Z,HD_RET LD BC,IDE.Write.Data - LD D,32 + LD D,32 ;!HARDCODE зависит от счётчика DUP в HD_WR_LOOP HD_WR_LOOP: DUP 16 - OUTI ; всего 16 раз OUTI - оптимально. + OUTI ; всего 16 раз OUTI - оптимально. EDUP DEC D - JP NZ,HD_WR_LOOP + JR NZ,HD_WR_LOOP LD A,H OR L @@ -599,53 +598,51 @@ HD_CALC_SECS: BIT 6,A JR NZ,HDD_LBA POP BC ; снимаем значение для корректного ret - + ; LD A,XH AND A SCF RET NZ ; ошибка, слишком большой HDD - -; IX,DE - абсолютный номер сектора + ; IX,DE - абсолютный номер сектора PUSH IX POP HL - + ; IN A,(SLOT3) LD C,A LD A,SYS_PAGE OUT (SLOT3),A LD A,C LD (SYS_PAGE.COPY_SLOT3),A - -; HL,DE - номер сектора -; BC - число секторов на цилиндре + ; HL,DE - номер сектора + ; BC - число секторов на цилиндре LD BC,(SYS_PAGE.HD_IDF_ADR.sec_cyl) ; число секторов на цилиндре LD A,16 ; HL,DE разделить на BC SCF -DIV_LOOP: +.DIV_LOOP: EX DE,HL ADD HL,HL EX DE,HL ADC HL,HL - + ; SBC HL,BC ; сравнить HL и BC - JR NC,NO_ADD ; переноса не было - +1! + JR NC,.NO_ADD ; переноса не было - +1! ADD HL,BC DEC A - JR NZ,DIV_LOOP - JR DIV_END -NO_ADD: + JR NZ,.DIV_LOOP + JR .DIV_END +.NO_ADD: INC DE DEC A - JR NZ,DIV_LOOP -DIV_END: -; DE - результат, HL - остаток -; DE - цилиндр + JR NZ,.DIV_LOOP +.DIV_END: + ; DE - результат, HL - остаток + ; DE - цилиндр LD A,(SYS_PAGE.HD_IDF_ADR+12) ; !HARDCODE .sectors -; A - число секторов на дорожке -; HL - номер сектора в цилиндре + ; A - число секторов на дорожке + ; HL - номер сектора в цилиндре LD B,0 LD C,A -; LD BC,(MS_BPB+S_P_T) ; ЧИСЛО СЕКТОРОВ НА ДОРОЖКЕ + ;LD BC,(MS_BPB+S_P_T) ; ЧИСЛО СЕКТОРОВ НА ДОРОЖКЕ XOR A HD_CALC_LOOP2: SBC HL,BC diff --git a/src/bios/shared/RECOVERY.IMG b/src/bios/shared/RECOVERY.IMG index 88aac46a7c56ae8b1de11174c611bd6b637aa29a..092ed034ed7801a7d3031e85ead13035035ea99f 100755 GIT binary patch delta 10086 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