From e0c70519c3d480bd63b5d4d5611677f6b8ef28ab Mon Sep 17 00:00:00 2001 From: Tolik <85737314+Tolik-Trek@users.noreply.github.com> Date: Mon, 19 Jan 2026 03:12:29 +1000 Subject: [PATCH 1/3] =?UTF-8?q?=D0=9D=D0=B0=D0=BA=D0=BE=D0=BB=D0=B4=D0=BE?= =?UTF-8?q?=D0=B2=D0=B0=D0=BD=D0=B0=20=D0=B7=D0=B0=D0=B4=D0=B5=D1=80=D0=B6?= =?UTF-8?q?=D0=BA=D0=B0=20=D0=B4=D0=BB=D1=8F=20=D1=81=D0=BC=D0=B5=D0=BD?= =?UTF-8?q?=D1=8B=20=D0=BF=D0=BB=D0=BE=D1=82=D0=BD=D0=BE=D1=81=D1=82=D0=B8?= =?UTF-8?q?=20=D1=83=20=D1=82=D0=BE=D1=80=D0=BC=D0=BE=D0=B7=D0=BD=D1=8B?= =?UTF-8?q?=D1=85=205.25=20=D1=84=D0=BB=D0=BE=D0=BF=D0=B0=D1=80=D0=B5?= =?UTF-8?q?=D0=B9.=20=D0=92=20=D1=80=D0=B5=D0=BA=D0=B0=D0=B2=D0=B5=D1=80?= =?UTF-8?q?=D0=B8=20=D0=B4=D0=BE=D1=81=20=D0=B8=D0=B7=20=D1=85=D0=BE=D1=82?= =?UTF-8?q?=D1=84=D0=B8=D0=BA=D1=81=203,=20=D1=84=D1=84=D0=BE=D1=80=D0=BC?= =?UTF-8?q?=D0=B0=D1=82=201.17?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Shared_Includes | 2 +- src/bios/exp/EXTENDED/FDD_DRIVER_2.asm | 174 ++++++++++++++++--------- src/bios/exp/FUNC_SYS.ASM | 9 +- src/bios/shared/DEFINES.INC | 4 +- src/bios/shared/RECOVERY.IMG | Bin 98304 -> 98304 bytes src/bios/shared/VERSION.inc | 4 +- 6 files changed, 120 insertions(+), 73 deletions(-) diff --git a/Shared_Includes b/Shared_Includes index f5f85b3..2fec620 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit f5f85b3d14c65bfc2f8619b596815e350f1a9d5b +Subproject commit 2fec6202f716cfa3ed48fb9bfd79d1081cc2721b diff --git a/src/bios/exp/EXTENDED/FDD_DRIVER_2.asm b/src/bios/exp/EXTENDED/FDD_DRIVER_2.asm index e1599c2..c1b1e06 100644 --- a/src/bios/exp/EXTENDED/FDD_DRIVER_2.asm +++ b/src/bios/exp/EXTENDED/FDD_DRIVER_2.asm @@ -188,12 +188,12 @@ FDD_5x_LONG_READ: EX DE,HL IN A,(SLOT3) EX AF,AF' - LD A,SYS_PAGE - OUT (SLOT3),A - LD IY,(SYS_PAGE.FDD_TABLE.BytesPerSector) - LD XH,C ; Memory Page Number - LD A,(SYS_PAGE.FDD_TABLE.SECTORS) - LD C,A + LD A,SYS_PAGE + OUT (SLOT3),A + LD IY,(SYS_PAGE.FDD_TABLE.BytesPerSector) + LD XH,C ; Memory Page Number + LD A,(SYS_PAGE.FDD_TABLE.SECTORS) + LD C,A EX AF,AF' OUT (SLOT3),A .DSK_LP: LD A,D @@ -206,7 +206,7 @@ FDD_5x_LONG_READ: PUSH BC PUSH HL CALL FDD_RW_SECTOR - JR C,ERRDOS + JR C,.ERRDOS ; размер сектора LD D,YH LD E,YL @@ -254,7 +254,7 @@ FDD_5x_LONG_READ: XOR A RET ; -ERRDOS: POP HL +.ERRDOS: POP HL POP BC POP DE CALL SET_DOS_OFF @@ -488,7 +488,39 @@ S_FDD: PUSH BC RET ; -; +;----------------------------------------------------------------------; +; CHANGE_SPEED: IN A,(SLOT3) +; EX AF,AF' +; LD A,SYS_PAGE +; OUT (SLOT3),A +; LD A,(SYS_PAGE.FDD_TABLE.DISK) +; XOR #80 +; LD (SYS_PAGE.FDD_TABLE.DISK),A +; RLA +; EX AF,AF' +; OUT (SLOT3),A +; EX AF,AF' +; JR NC,FDD.SET720 +; FDD.SET1440: LD A,FDD_Density.SET_1440 +; OUT (FDD_Density),A +; RET +; ; +; ; +; SET_SPEED: IN A,(SLOT3) +; EX AF,AF' +; LD A,SYS_PAGE +; OUT (SLOT3),A +; LD A,(SYS_PAGE.FDD_TABLE.DISK) +; ;AND #80 +; RLA +; EX AF,AF' +; OUT (SLOT3),A +; EX AF,AF' +; JR C,FDD.SET1440 +; FDD.SET720: LD A,FDD_Density.SET_720 +; OUT (FDD_Density),A +; RET + CHANGE_SPEED: IN A,(SLOT3) EX AF,AF' LD A,SYS_PAGE @@ -496,37 +528,58 @@ CHANGE_SPEED: IN A,(SLOT3) LD A,(SYS_PAGE.FDD_TABLE.DISK) XOR #80 LD (SYS_PAGE.FDD_TABLE.DISK),A - ;AND #80 - RLA - EX AF,AF' - OUT (SLOT3),A - EX AF,AF' - ;JR Z,FDD.SET720 - JR NC,FDD.SET720 - ;JP FDD.SET1440 ;CF=1 -FDD.SET1440: LD A,FDD_Density.SET_1440 - OUT (FDD_Density),A - RET -; + JR SET_SPEED.set + + ; ; SET_SPEED: IN A,(SLOT3) EX AF,AF' LD A,SYS_PAGE OUT (SLOT3),A LD A,(SYS_PAGE.FDD_TABLE.DISK) - ;AND #80 - RLA +.set: AND #80 + RRA + RRA + OR 1 + OUT (FDD_Density),A EX AF,AF' - OUT (SLOT3),A - EX AF,AF' - ;JR NZ,FDD.SET1440 - JR C,FDD.SET1440 - ;JR FDD.SET720 ;CF=0 -FDD.SET720: LD A,FDD_Density.SET_720 - OUT (FDD_Density),A - RET + OUT (SLOT3),A + RET +;----------------------------------------------------------------------; + +//////////////////////////////////////////////////////////////////////// +; Вход: BC - внутренний и внешний счётчики +WAIT_FDD_FOR_SEARCH_TRACK: + LD A,#C0 ;!HARDCODE CMD КР1818ВГ93 + OUT (FDC_93.Command),A + PUSH BC + CALL .LOOP + POP BC + RET NC + CALL CHANGE_SPEED + DEC C + JR NZ,WAIT_FDD_FOR_SEARCH_TRACK + SCF + RET + ; +.LOOP: LD HL,#F000 +.loop_reg_HL: IN A,(FDC_93.DrvCTRL) + AND #C0 + RET NZ + ; +.ID_LP4: DEC HL + LD A,H + OR L + JR NZ,.loop_reg_HL + ; + DJNZ .LOOP + SCF + RET + + +//////////////////////////////////////////////////////////////////////// ; прерывания должны быть отключены ; выход: A - FDD_INIT_TABLE.DISK, B - sector size high byte DISK_ID: EXX @@ -535,32 +588,25 @@ DISK_ID: EXX OUT (FDC_93.Data),A LD A,#18 ;!TODO выписать комманды ВГ ;SEARCH ;!HARDCODE CMD КР1818ВГ93 CALL EXECOM - LD C,4 ; счётчик -.loop_reg_C: LD A,#C0 ;!HARDCODE CMD КР1818ВГ93 - OUT (FDC_93.Command),A - LD HL,#F000 ; счётчик -.loop_reg_HL: IN A,(FDC_93.DrvCTRL) - AND #C0 - JR NZ,.Read_Index - ; -.ID_LP4: DEC HL - LD A,H - OR L - JR NZ,.loop_reg_HL - CALL CHANGE_SPEED - DEC C - JR NZ,.loop_reg_C + ; кусок для быстрых флоппарей + LD BC,#0104 ; 1 - счётчик + CALL WAIT_FDD_FOR_SEARCH_TRACK + JR NC,.Read_Index + ; кусок для тормозных флоппарей + LD BC,#0504 ; 1 - счётчик + CALL WAIT_FDD_FOR_SEARCH_TRACK + JR NC,.Read_Index EXX - SCF + ;SCF RET ; .Read_Index: ; ; Данные FDC_93.Data: - ; номер цилиндра BYTE + ; номер цилиндра BYTE ; номер головки BYTE ; номер сектора BYTE ; длина сектора BYTE - ; контрольная сумма WORD + ; контрольная сумма WORD LD H,4 ; !HARDCODE счётчик до байта размера сектора .ID_LP2: IN A,(FDC_93.Data) DEC H @@ -583,6 +629,7 @@ DISK_ID: EXX EX AF,AF' AND #80 RET +//////////////////////////////////////////////////////////////////////// ; SEEK: LD XL,A @@ -688,25 +735,22 @@ NTRACK: PUSH HL RET ; SAVE_INTERRUPTS: -.switch_off: PUSH AF - LD A,R - LD A,#80 - JP PE,.set_R - XOR A -.set_R: LD R,A +.switch_off: PUSH AF + LD A,R DI - POP AF + LD A,#80 + JP PE,.set_R + XOR A +.set_R: LD R,A + POP AF RET ; ; -.restore: PUSH AF - LD A,R - BIT 7,A - JR Z,.set_di +.restore: PUSH AF + LD A,R + DI + RLA + JR NC,.set_di EI - POP AF ; PE - RET - ; -.set_di: DI - POP AF ; PO +.set_di: POP AF ; PE RET ;[]===========================================================[] \ No newline at end of file diff --git a/src/bios/exp/FUNC_SYS.ASM b/src/bios/exp/FUNC_SYS.ASM index 1a66800..ad32456 100644 --- a/src/bios/exp/FUNC_SYS.ASM +++ b/src/bios/exp/FUNC_SYS.ASM @@ -345,13 +345,14 @@ FN_TURBO: ;!FIXIT меняем плотность - меняем в системной странице инфу об этом .SET_FDD_720: LD A,FDD_Density.SET_720 - OUT (FDD_Density),A - AND A - RET + JR .set + ; OUT (FDD_Density),A + ; AND A + ; RET ;!FIXIT меняем плотность - меняем в системной странице инфу об этом .SET_FDD_1440: LD A,FDD_Density.SET_1440 - OUT (FDD_Density),A +.set: OUT (FDD_Density),A AND A RET diff --git a/src/bios/shared/DEFINES.INC b/src/bios/shared/DEFINES.INC index 137b613..df4a2d9 100644 --- a/src/bios/shared/DEFINES.INC +++ b/src/bios/shared/DEFINES.INC @@ -1,8 +1,10 @@ ;=======================[All shared EQUs]=======================; + DEFINE SET_EXPID_VER 3 + DEFINE SET_EXPID_MOD 07 BETA_BUILD EQU 1 ; 40 ; добавляет строку и сообщение о тестовой сборке на стартовом экране BETA_RC EQU 0 ; 2 ; RELEASEhotFIX EQU 0 ; - DEFINE RELEASE_BUILD_DATE "25.06.2025" + DEFINE RELEASE_BUILD_DATE "19.01.2026" ;======================[All shared defines]=====================; DEFINE PACKED_MAIN 0 ; паковать MAIN или влезает без этого? DEFINE SP2000_Loader_Flag #0107 ; diff --git a/src/bios/shared/RECOVERY.IMG b/src/bios/shared/RECOVERY.IMG index 247d818b20b5e7c0f2bfadb9059fc4f9f2b9f5e9..d78660a4a6fbafe29f583b75d9490a0b77191302 100644 GIT binary patch delta 17938 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 diff --git a/src/bios/shared/VERSION.inc b/src/bios/shared/VERSION.inc index 13f096e..87f4338 100644 --- a/src/bios/shared/VERSION.inc +++ b/src/bios/shared/VERSION.inc @@ -2,8 +2,8 @@ ; ============[For EXP part]============= ; ------[Version of BIOS "VER.MOD"]------ EXP_ID: -.VER EQU 3 ; Номер версии менять тут! -.MOD EQU 07 ; Номер версии менять тут! +.VER EQU SET_EXPID_VER ; Номер версии менять тут! +.MOD EQU SET_EXPID_MOD ; Номер версии менять тут! BIOS_ver_hex EQU EXP_ID.VER*256+EXP_ID.MOD DEFINE BIOS_ver_string '0'+EXP_ID.VER, '.', '0'+EXP_ID.MOD/10, '0'+EXP_ID.MOD-(EXP_ID.MOD/10)*10 From fd285cae0f89edf290aa1bbc99f80a48787faefe Mon Sep 17 00:00:00 2001 From: Tolik <85737314+Tolik-Trek@users.noreply.github.com> Date: Tue, 20 Jan 2026 23:33:14 +1000 Subject: [PATCH 2/3] =?UTF-8?q?-bug:=20EXECOM=20-=20=D1=83=D0=B2=D0=B5?= =?UTF-8?q?=D0=BB=D0=B8=D1=87=D0=B5=D0=BD=D0=B0=20=D0=B7=D0=B0=D0=B4=D0=B5?= =?UTF-8?q?=D1=80=D0=B6=D0=BA=D0=B0=20=D0=BE=D0=B6=D0=B8=D0=B4=D0=B0=D0=BD?= =?UTF-8?q?=D0=B8=D1=8F=20=D0=92=D0=9393?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../{FDD_DRIVER_2.asm => FDD_DRIVER.asm} | 42 +++++++++++++++---- ..._DISK_DRIVER_1.asm => RAM_DISK_DRIVER.asm} | 0 src/bios/exp/FUNC_5x.asm | 4 +- 3 files changed, 37 insertions(+), 9 deletions(-) rename src/bios/exp/EXTENDED/{FDD_DRIVER_2.asm => FDD_DRIVER.asm} (90%) rename src/bios/exp/EXTENDED/{RAM_DISK_DRIVER_1.asm => RAM_DISK_DRIVER.asm} (100%) diff --git a/src/bios/exp/EXTENDED/FDD_DRIVER_2.asm b/src/bios/exp/EXTENDED/FDD_DRIVER.asm similarity index 90% rename from src/bios/exp/EXTENDED/FDD_DRIVER_2.asm rename to src/bios/exp/EXTENDED/FDD_DRIVER.asm index c1b1e06..cd6cdf0 100644 --- a/src/bios/exp/EXTENDED/FDD_DRIVER_2.asm +++ b/src/bios/exp/EXTENDED/FDD_DRIVER.asm @@ -200,6 +200,7 @@ FDD_5x_LONG_READ: EXX PUSH BC CALL SEEK + ;!FIXIT контроль ошибки POP BC EXX PUSH DE @@ -400,8 +401,10 @@ FDD_RW_SECTOR: LD D,5 ;RETRY COUNT PUSH DE PUSH HL CALL RESWG ; RESET_WG + ;!FIXIT контроль ошибки LD A,XL CALL SEEK ; !!!!! посмотреть + ;!FIXIT контроль ошибки POP HL POP DE JR .RETRY @@ -434,9 +437,9 @@ FDD_RW_SECTOR: LD D,5 ;RETRY COUNT JR Z,.SectorSizeError ; OUTI -.wwait_data: IN A,(FDC_93.DrvCTRL) +.wait_data_w: IN A,(FDC_93.DrvCTRL) AND %1100'0000 ;b6: DRQ (запрос данных = 1). b7: INTRQ (выполняется команда = 0). - JR Z,.wwait_data + JR Z,.wait_data_w JP P,.write_loop JP .rw_return ; @@ -683,22 +686,47 @@ P50ms: PUSH BC RET ; + +//////////////////////////////////////////////////////////////////////// +;RESWG: LD A,8 +; ; +;EXECOM: OUT (FDC_93.Command),A +; LD HL,#0000 ; счётчик +;.WREST: DEC HL +; LD A,H +; OR L +; SCF +; RET Z +; ; +; IN A,(FDC_93.DrvCTRL) +; AND #80 +; JR Z,.WREST +; RET ; RESWG: LD A,8 ;!HARDCODE CMD КР1818ВГ93 ; EXECOM: OUT (FDC_93.Command),A LD HL,#0000 ; счётчик + PUSH BC + LD B,3 ; счётчик + ; .WREST: DEC HL LD A,H OR L - SCF - RET Z + JR NZ,.get_state ; - IN A,(FDC_93.DrvCTRL) + DJNZ .WREST + ; + POP BC + SCF + RET + ; +.get_state: IN A,(FDC_93.DrvCTRL) AND #80 JR Z,.WREST - RET -; + POP BC + RET +//////////////////////////////////////////////////////////////////////// ; ;------------------------------- diff --git a/src/bios/exp/EXTENDED/RAM_DISK_DRIVER_1.asm b/src/bios/exp/EXTENDED/RAM_DISK_DRIVER.asm similarity index 100% rename from src/bios/exp/EXTENDED/RAM_DISK_DRIVER_1.asm rename to src/bios/exp/EXTENDED/RAM_DISK_DRIVER.asm diff --git a/src/bios/exp/FUNC_5x.asm b/src/bios/exp/FUNC_5x.asm index 7ce5449..295748c 100644 --- a/src/bios/exp/FUNC_5x.asm +++ b/src/bios/exp/FUNC_5x.asm @@ -85,8 +85,8 @@ DRV_LIST: ; RET ; ; - INCLUDE 'EXTENDED/FDD_DRIVER_2.asm' - INCLUDE 'EXTENDED/RAM_DISK_DRIVER_1.asm' + INCLUDE 'EXTENDED/FDD_DRIVER.asm' + INCLUDE 'EXTENDED/RAM_DISK_DRIVER.asm' INCLUDE 'EXTENDED/IDE/ATA_DRV.asm' INCLUDE 'EXTENDED/IDE/ATAPI_DRV.asm' INCLUDE 'EXTENDED/IDE/SHARED.asm' From faabf5c8b72af8a58352ca3d18df6d4f563d11b8 Mon Sep 17 00:00:00 2001 From: Tolik <85737314+Tolik-Trek@users.noreply.github.com> Date: Wed, 21 Jan 2026 23:38:52 +1000 Subject: [PATCH 3/3] =?UTF-8?q?=D0=9F=D0=BE=D0=B4=D1=83=D0=BC=D0=B0=D1=82?= =?UTF-8?q?=D1=8C=20=D1=87=D1=91=20=D0=B4=D0=B5=D0=BB=D0=B0=D1=82=D1=8C=20?= =?UTF-8?q?=D1=81=20FDD=5F5x=5FGET=5FPAR,=20FDD=5F5x=5FLONG=5FREAD.RW=5FSh?= =?UTF-8?q?ared=20=D0=98=D0=B7=D0=BC=D0=B5=D0=BD=D0=B5=D0=BD=D0=B8=D1=8F?= =?UTF-8?q?=20=D0=B2=20SETUP:=203.5=20=D0=B8=205.25?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/bios/exp/EXTENDED/FDD_DRIVER.asm | 55 ++++++++--- src/bios/exp/EXTENDED/IDE/ATA_DRV.ASM | 5 +- src/bios/exp/EXTENDED/RAM_DISK_DRIVER.asm | 63 ++++-------- src/bios/rom/SETUP/MAIN.asm | 111 ++++++++++++++++------ src/bios/rom/SETUP/messages.z80 | 22 +++-- 5 files changed, 161 insertions(+), 95 deletions(-) diff --git a/src/bios/exp/EXTENDED/FDD_DRIVER.asm b/src/bios/exp/EXTENDED/FDD_DRIVER.asm index cd6cdf0..f135f21 100644 --- a/src/bios/exp/EXTENDED/FDD_DRIVER.asm +++ b/src/bios/exp/EXTENDED/FDD_DRIVER.asm @@ -29,12 +29,13 @@ ; A - D0 - "1" - Removable media ;[]===========================================================[] ;!FIXIT всегда идет работа с данными для диска А +;!FIXIT читать данные с нулевой дорожки? Придумать что делать с геометрией флопарей FDD_5x_GET_PAR: IN A,(SLOT3) EX AF,AF' LD A,SYS_PAGE OUT (SLOT3),A ; - LD HL,(SYS_PAGE.FDD_TABLE.SECTORS) + LD HL,(SYS_PAGE.FDD_TABLE.SECTORS) ; L - Sectors, H - Heads LD DE,(SYS_PAGE.FDD_TABLE.CYLINDL) LD IX,(SYS_PAGE.FDD_TABLE.BytesPerSector) LD A,(SYS_PAGE.FDD_TABLE.DISK) @@ -98,7 +99,7 @@ FDD_5x_DETECT: CALL SAVE_INTERRUPTS.switch_off ;[]===========================================================[] FDD_5x_RESET: CALL SAVE_INTERRUPTS.switch_off CALL SET_DOS_ON - CALL S_FDD + CALL SET_FDD CALL DISK_ID JR C,.int ; [ ] размера сектора @@ -181,7 +182,7 @@ FDD_5x_LONG_READ: EX AF,AF' PUSH BC CALL SET_DOS_ON - CALL S_FDD + CALL SET_FDD CALL SET_SPEED CALL NTRACK POP BC @@ -190,12 +191,13 @@ FDD_5x_LONG_READ: EX AF,AF' LD A,SYS_PAGE OUT (SLOT3),A - LD IY,(SYS_PAGE.FDD_TABLE.BytesPerSector) + LD IY,(SYS_PAGE.FDD_TABLE.BytesPerSector) ; устанавливать отдельно переменную current BytesPerSector? LD XH,C ; Memory Page Number LD A,(SYS_PAGE.FDD_TABLE.SECTORS) LD C,A EX AF,AF' OUT (SLOT3),A + ; .DSK_LP: LD A,D EXX PUSH BC @@ -215,17 +217,18 @@ FDD_5x_LONG_READ: POP HL POP BC ADD HL,DE - ; CALL C,CHANGE_MEM_BLK - ; -.THISRD: POP DE + ;.THISRD + POP DE LD A,C INC E CP E JR NZ,.NINC_T + ; LD E,0 INC D .NINC_T: DJNZ .DSK_LP + ; .RETDOS: CALL SET_DOS_OFF LD A,XH ; Memory Page Number EX AF,AF' @@ -240,6 +243,7 @@ FDD_5x_LONG_READ: DEC B LD B,0 JR NZ,.ADD8BIT + ; INC B .ADD8BIT: ADD IX,BC ;!TEST @@ -471,12 +475,33 @@ SET_DOS_OFF: EX AF,AF' EX AF,AF' RET -; -S_FDD: PUSH BC +//////////////////////////////////////////////////////////////////////// +; НЕ ГРОХАТЬ. Версия для FDD AUTO одним буфером FDD_TABLE +; SET_FDD: PUSH BC +; AND 1 +; LD B,A +; OR #3C +; OUT (FDC_93.DrvCTRL),A +; IN A,(SLOT3) +; EX AF,AF' +; LD A,SYS_PAGE +; OUT (SLOT3),A +; LD A,(SYS_PAGE.FDD_TABLE.DISK) +; AND #FE +; OR B +; LD (SYS_PAGE.FDD_TABLE.DISK),A +; EX AF,AF' +; OUT (SLOT3),A +; POP BC +; RET +//////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// +SET_FDD: PUSH BC AND 1 LD B,A OR #3C OUT (FDC_93.DrvCTRL),A + IN A,(SLOT3) EX AF,AF' LD A,SYS_PAGE @@ -489,7 +514,8 @@ S_FDD: PUSH BC OUT (SLOT3),A POP BC RET -; +//////////////////////////////////////////////////////////////////////// + ;----------------------------------------------------------------------; ; CHANGE_SPEED: IN A,(SLOT3) @@ -532,9 +558,7 @@ CHANGE_SPEED: IN A,(SLOT3) XOR #80 LD (SYS_PAGE.FDD_TABLE.DISK),A JR SET_SPEED.set - ; -; SET_SPEED: IN A,(SLOT3) EX AF,AF' LD A,SYS_PAGE @@ -561,9 +585,11 @@ WAIT_FDD_FOR_SEARCH_TRACK: CALL .LOOP POP BC RET NC + ; CALL CHANGE_SPEED DEC C JR NZ,WAIT_FDD_FOR_SEARCH_TRACK + ; SCF RET ; @@ -580,6 +606,7 @@ WAIT_FDD_FOR_SEARCH_TRACK: DJNZ .LOOP SCF RET +//////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// @@ -592,11 +619,11 @@ DISK_ID: EXX LD A,#18 ;!TODO выписать комманды ВГ ;SEARCH ;!HARDCODE CMD КР1818ВГ93 CALL EXECOM ; кусок для быстрых флоппарей - LD BC,#0104 ; 1 - счётчик + LD BC,#0104 ; счётчики CALL WAIT_FDD_FOR_SEARCH_TRACK JR NC,.Read_Index ; кусок для тормозных флоппарей - LD BC,#0504 ; 1 - счётчик + LD BC,#0804 ; счётчики CALL WAIT_FDD_FOR_SEARCH_TRACK JR NC,.Read_Index EXX diff --git a/src/bios/exp/EXTENDED/IDE/ATA_DRV.ASM b/src/bios/exp/EXTENDED/IDE/ATA_DRV.ASM index b1e6dd5..6b71295 100644 --- a/src/bios/exp/EXTENDED/IDE/ATA_DRV.ASM +++ b/src/bios/exp/EXTENDED/IDE/ATA_DRV.ASM @@ -676,6 +676,7 @@ WAITPRT: LD DE,256*(IDE.CtrlByte.Busy+IDE.CtrlByte.Ready+IDE.CtrlByte.Error) + I AND D CP E JR Z,.ok + ; DEC HL LD A,L OR H @@ -684,8 +685,8 @@ WAITPRT: LD DE,256*(IDE.CtrlByte.Busy+IDE.CtrlByte.Ready+IDE.CtrlByte.Error) + I POP HL DEC L JR NZ,.loop - ; -.error: LD A,BIOS.Error.NotReady + ; error + LD A,BIOS.Error.NotReady SCF RET ; diff --git a/src/bios/exp/EXTENDED/RAM_DISK_DRIVER.asm b/src/bios/exp/EXTENDED/RAM_DISK_DRIVER.asm index 9b91bbf..c234945 100644 --- a/src/bios/exp/EXTENDED/RAM_DISK_DRIVER.asm +++ b/src/bios/exp/EXTENDED/RAM_DISK_DRIVER.asm @@ -89,89 +89,63 @@ RAM_DRV_READ_WRITE: LD L,B IN A,(SLOT3) LD H,A - -; LD A,H -; OR L -; JR NZ,.error_stack2 ; if sector_high > 0 -; POP AF - POP AF EX (SP),HL PUSH AF - - LD A,H - OR L - JR NZ,.error_stack2 ; if sector_high > 0 - POP AF - + LD A,H + OR L + JR NZ,.error_stack2 ; if sector_high > 0 + ; + POP AF EX AF,AF' OUT (SLOT3),A LD A,C ; в рег C команда чтения или записи EX AF,AF' -; A' = command - + ; A' = command PUSH BC ; Sector_counter PUSH DE ; Address PUSH IX ; Sector_low - AND #0F ;номер рамдиска - ;LD C,BIOS.GET_RAMD_ST - ;RST_to_BIOS CALL GET_RAMD_ST -; A = Memory Block ID - + ; A = Memory Block ID POP DE ; Sector_low POP HL ; Address POP BC ; Sector_counter JR C,.error_stack1 - + ; SLA E RL D ; Sector_low * 2 JR C,.error_stack1 - - + ; PUSH BC SLA B ; Sector_counter * 2 - типа у дискеты сектор 512 байтов JR C,.error_stack2 - + ; PUSH DE - //PUSH BC - ;LD C,BIOS.BLK_RD_WR - ;RST_to_BIOS CALL BLK_RD_WR JR C,.error_stack3 -; hl = address + Sector_low * 256 * Sector_counter - - //POP BC - //SRL B - + ; + ; hl = address + Sector_low * 256 * Sector_counter POP DE -; de = Sector_low * 2 - + ; de = Sector_low * 2 SRL D RR E -; de = Sector_low - + ; de = Sector_low POP BC -; b = Sector_counter - + ; b = Sector_counter LD A,E ADD A,B LD E,A LD A,D ADC A,0 LD D,A -; de = Sector_counter + Sector_low - + ; de = Sector_counter + Sector_low PUSH DE POP IX -; ix = Sector_counter + Sector_low - + ; ix = Sector_counter + Sector_low EX DE,HL -; de = address + Sector_low * 256 * Sector_counter - + ; de = address + Sector_low * 256 * Sector_counter LD HL,0 - POP AF OUT (SLOT3),A AND A @@ -179,6 +153,7 @@ RAM_DRV_READ_WRITE: ; HL:IX - Sector + Sector counter ; DE - Address + (Sector counter * Size sector) RET + ; .error_stack3: POP BC .error_stack2: diff --git a/src/bios/rom/SETUP/MAIN.asm b/src/bios/rom/SETUP/MAIN.asm index 5fde7e7..13e39a1 100644 --- a/src/bios/rom/SETUP/MAIN.asm +++ b/src/bios/rom/SETUP/MAIN.asm @@ -1201,56 +1201,109 @@ SYSID: DZ "Starting..." ; .Size EQU $ - FD144A ; FD720A: DB #00,#09,#02,#50,#00,#00,#02,FDD_INIT_TABLE.FDD ; .Size EQU $ - FD720A -FDD_INIT_TABLE: FDD_1440_TABLE + + +FDD_INIT_TABLE_35: FDD_TABLE_s { + #80, ;.DISK + #12, ;.SECTORS + #02, ;.HEADS + #50, ;.CYLINDL + #00, ;.CYLINDH + #0200, ;.BytesPerSector + #03 ;.ID + } +; +FDD_INIT_TABLE_525: FDD_TABLE_s { + #00 ;.DISK + #09 ;.SECTORS + #02 ;.HEADS + #50 ;.CYLINDL + #00 ;.CYLINDH + #0200 ;.BytesPerSector + #03 ;.ID + } FDD_INSTAL: IN A,(SLOT3) EX AF,AF' LD A,SYS_PAGE OUT (SLOT3),A LD HL,SYS_PAGE.FDD_TABLE - LD BC,SYS_PAGE.FDD_TABLE.Size*256 + #FF ; table_size*256 + fill_byte + LD BC,2*(SYS_PAGE.FDD_TABLE.Size*256) + #FF ; table_size*256 + fill_byte .FILLFDD: LD (HL),C INC HL DJNZ .FILLFDD ; - ;EX AF,AF' - ;OUT (SLOT3),A - ;LD BC,CMOS_CELL.DrivesSetup_1.Mask.FirstFDD ;#0311 - ;CALL GET_CMOS_VALUE - ;LD HL,FD720A - ;OR A - ;JR Z,.SETFD0 - LD HL,FDD_INIT_TABLE - ;DEC A - ;JR NZ,.NOFDD0 -;.SETFD0: ;IN A,(SLOT3) + ; + LD BC,CMOS_CELL.DrivesSetup_1.Mask.FirstFDD ;#0311 + CALL .Choose_FDD_Type + JR NZ,.next_FDD + ; + LD DE,SYS_PAGE.FDD_TABLE + LD BC,SYS_PAGE.FDD_TABLE.Size + LDIR +.next_FDD: LD BC,CMOS_CELL.DrivesSetup_1.Mask.SecondFDD ;#0C11 + CALL .Choose_FDD_Type + JR NZ,.NOFDD1 + ; + LD DE,SYS_PAGE.FDD_1_TABLE + LD BC,SYS_PAGE.FDD_1_TABLE.Size + LDIR +.NOFDD1: EX AF,AF' + OUT (SLOT3),A + RET + ; +.Choose_FDD_Type: + CALL GET_CMOS_VALUE + LD HL,FDD_INIT_TABLE_35 + OR A + RET Z + ; + LD HL,FDD_INIT_TABLE_525 + DEC A + RET +/* + LD BC,CMOS_CELL.DrivesSetup_1.Mask.FirstFDD ;#0311 + CALL GET_CMOS_VALUE + LD HL,FDD_INIT_TABLE_525 + OR A + JR Z,.SETFD0 + ; + LD HL,FDD_INIT_TABLE_35 + DEC A + JR NZ,.NOFDD0 + ; +.SETFD0: ; + ;IN A,(SLOT3) ;EX AF,AF' ;LD A,SYS_PAGE ;OUT (SLOT3),A LD DE,SYS_PAGE.FDD_TABLE - ; B=0 - LD C,SYS_PAGE.FDD_TABLE.Size + LD BC,SYS_PAGE.FDD_TABLE.Size LDIR ;EX AF,AF' ;OUT (SLOT3),A -;.NOFDD0: LD BC,CMOS_CELL.DrivesSetup_1.Mask.SecondFDD ;#0C11 - ;CALL GET_CMOS_VALUE - ;LD HL,FD720A - ;OR A - ;JR Z,.SETFD1 - ;LD HL,FD144A - ;DEC A - ;JR NZ,.NOFDD1 -;.SETFD1: IN A,(SLOT3) +.NOFDD0: LD BC,CMOS_CELL.DrivesSetup_1.Mask.SecondFDD ;#0C11 + CALL GET_CMOS_VALUE + LD HL,FDD_INIT_TABLE_525 + OR A + JR Z,.SETFD1 + ; + LD HL,FDD_INIT_TABLE_35 + DEC A + JR NZ,.NOFDD1 + ; +.SETFD1: ; + ;IN A,(SLOT3) ;EX AF,AF' ;LD A,SYS_PAGE ;OUT (SLOT3),A - ;LD DE,SYS_PAGE.FDD_1_TABLE - ;LD BC,FD144A.Size - ;LDIR - EX AF,AF' + LD DE,SYS_PAGE.FDD_1_TABLE + LD BC,FD144A.Size + LDIR +.NOFDD1: EX AF,AF' OUT (SLOT3),A -.NOFDD1: RET + RET +*/ PIDNUM: LD HL,memBUFFER.ID diff --git a/src/bios/rom/SETUP/messages.z80 b/src/bios/rom/SETUP/messages.z80 index 62bd927..57a80ef 100644 --- a/src/bios/rom/SETUP/messages.z80 +++ b/src/bios/rom/SETUP/messages.z80 @@ -279,22 +279,28 @@ SettingsItemsTabs: IF NEW_FEATURE : DB paramLine : ENDIF DB columnNum,lineNum DB paramName - DW CMOS_CELL.DrivesSetup_1.Mask.FirstFDD : DB %0000'0000 - DB msgStrings.valAuto + DW CMOS_CELL.DrivesSetup_1.Mask.FirstFDD : DB %0000'0010 + DB msgStrings.val35 + DB msgStrings.val525 + DB msgStrings.valDash6 + ; DB msgStrings.valAuto ; DB msgStrings.val720 ; DB msgStrings.val1440 - ; DB msgStrings.valDash6 + ; DB msgStrings.val1200 _mSETitemParams FddSecond DW OnChangeAction.nothing IF NEW_FEATURE : DB paramLine : ENDIF DB columnNum,lineNum DB paramName - DW CMOS_CELL.DrivesSetup_1.Mask.SecondFDD : DB %0000'0000 - DB msgStrings.valAuto + DW CMOS_CELL.DrivesSetup_1.Mask.SecondFDD : DB %0000'1000 + DB msgStrings.val35 + DB msgStrings.val525 + DB msgStrings.valDash6 + ; DB msgStrings.valAuto ; DB msgStrings.val720 ; DB msgStrings.val1440 - ; DB msgStrings.valDash6 + ; DB msgStrings.val1200 _mSETitemParams PriIdeMA DW OnChangeAction.nothing @@ -653,6 +659,8 @@ msgStrings: _mSetStr valAuto, tmp_Counter : DZ 'Auto ' ; _mSetStr val720, tmp_Counter : DZ '720K ' ; _mSetStr val1440, tmp_Counter : DZ '1.44M ' + _mSetStr val35, tmp_Counter : DZ '3.5" ' + _mSetStr val525, tmp_Counter : DZ '5.25" ' _mSetStr valDash6, tmp_Counter : DZ '------' _mSetStr parFddSecond, tmp_Counter : DZ 'FDD second : ' _mSetStr parPriIdeMA, tmp_Counter : DZ 'Primary IDE Master',#FF,' : ' @@ -832,6 +840,8 @@ msgRusStrings: _mSetStrRus valAuto, tmp_Counter : DZ 'Авто ' ; _mSetStrRus val720, tmp_Counter : DZ '720K ' ; _mSetStrRus val1440, tmp_Counter : DZ '1.44M ' + _mSetStrRus val35, tmp_Counter : DZ '3.5" ' + _mSetStrRus val525, tmp_Counter : DZ '5.25" ' _mSetStrRus valDash6, tmp_Counter : DZ '------' _mSetStrRus parFddSecond, tmp_Counter : DZ 'FDD второй : ' _mSetStrRus parPriIdeMA, tmp_Counter : DZ 'Primary IDE Master',#FF,' : '