From 0beb007b9d893dfecf1052052193cb93419c87f0 Mon Sep 17 00:00:00 2001 From: Tolik <85737314+Tolik-Trek@users.noreply.github.com> Date: Mon, 4 May 2026 22:35:43 +1000 Subject: [PATCH] =?UTF-8?q?=D0=9E=D0=BF=D1=82=D0=B8=D0=BC=D0=B8=D0=B7?= =?UTF-8?q?=D0=B0=D1=86=D0=B8=D1=8F=20FDD=5FDRIVER?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/bios/exp/EXTENDED/FDD_DRIVER.asm | 110 +++++++++++++-------------- 1 file changed, 53 insertions(+), 57 deletions(-) diff --git a/src/bios/exp/EXTENDED/FDD_DRIVER.asm b/src/bios/exp/EXTENDED/FDD_DRIVER.asm index 462a147..8bad2c2 100644 --- a/src/bios/exp/EXTENDED/FDD_DRIVER.asm +++ b/src/bios/exp/EXTENDED/FDD_DRIVER.asm @@ -6,8 +6,8 @@ ; AND A ; RET FDD_COUNTERS: -.RW_Retries EQU 30;5 - +.RW_Retries EQU 5 +.INTRQorDRQ EQU 4 ;[]===========================================================[] ;Function: Get Current Media Parameters @@ -348,89 +348,75 @@ FDD_5x_LONG_WRITE: ;WRITE SECTOR ;------------------------------- FDD_RW_SECTOR: LD D,FDD_COUNTERS.RW_Retries -.RETRY: ;DI - PUSH HL +.RETRY: PUSH HL PUSH DE + IN A,(SLOT3) + PUSH AF ; сохраняем текущую страницу LD A,E INC A OUT (FDC_93.Sector),A - ; - LD B,4 - LD C,FDC_93.Data - EXX - LD A,B ; COMMAND read or write - EXX - OUT (FDC_93.Command),A - ; - ; [ ] 15/04/25 размер сектора больше, чем установлено в SYS_PAGE.FDD_TABLE.BytesPerSector вызовет ошибку LD A,SYS_PAGE OUT (SLOT3),A EXX + ; [ ] 15/04/25 размер сектора больше, чем установлено в SYS_PAGE.FDD_TABLE.BytesPerSector вызовет ошибку LD E,(IY + FDD_TABLE_s.BytesPerSector) LD D,(IY + FDD_TABLE_s.BytesPerSector + 1) INC DE + ; + BIT 5,B ; Set Z flag for read or NZ for write + EX AF,AF + LD A,B ; COMMAND read or write EXX + LD C,A LD A,XH OUT (SLOT3),A + LD A,C ; COMMAND read or write + LD BC,FDD_COUNTERS.INTRQorDRQ*256 + FDC_93.Data + ;██████████ КРИТИЧНЫЙ К СКОРОСТИ КУСОК ПОСЛЕ УСТАНОВКИ КОМАНДЫ ДО СНЯТИЯ РЕЗУЛЬТАТА ██████████ + OUT (FDC_93.Command),A ; -.wait_loop: IN A,(FDC_93.DrvCTRL) ;WAIT INTRQ or DRQ - AND %1100'0000 ;b6: DRQ (запрос данных = 1). b7: INTRQ (выполняется команда = 0). - JR NZ,.RW_PROC - ; - INC DE - LD A,E - OR D - JR NZ,.wait_loop - ; - DJNZ .wait_loop - SCF - ;JR .after_rw ; error - JR .after_rw_end ; error - ; -.RW_PROC: IN A,(SLOT3) +.wait_loop: IN A,(FDC_93.DrvCTRL) ; 11 ;WAIT INTRQ or DRQ + AND %1100'0000 ; 7 ;b7: INTRQ (выполняется команда = 0), b6: DRQ (запрос данных = 1). + JR Z,.wait_loop_next ; 12 + 34 (.wait_loop_next) + ; тут максимум 64 такта EX AF,AF' - ; [ ] 15/04/25 размер сектора больше, чем установлено в SYS_PAGE.FDD_TABLE.BytesPerSector вызовет ошибку - ; LD A,SYS_PAGE - ; OUT (SLOT3),A - ; LD E,(IY + FDD_TABLE_s.BytesPerSector) - ; LD D,(IY + FDD_TABLE_s.BytesPerSector + 1) - ; LD A,XH - ; OUT (SLOT3),A - ; INC DE - EXX - BIT 5,B - EXX - JR NZ,.write_loop ; результат BIT 5,B - ;READ BYTE + JR NZ,.write_loop ; результат BIT 5,B' + ; + ;EX AF,AF' + ;READ BYTE. между .wait_loop и .read_loop (INI) 64+11=75 тактов .read_loop: EXX DEC DE LD A,D OR E EXX JR Z,.SectorSizeError - ; + ; от .wait_loop досюда 75+29=104 тактов + ; примерно 10,4 мкс при условных средних 10 Мгц + ; примерно 30 мкс при 3,5 Мгц + ; Должно быть не больше 16 мкс для 1.44 или 32 мкс для 720 INI + ;█████████████████████████████████████████████████████████████████████████████████████████████ .wait_data_r: IN A,(FDC_93.DrvCTRL) AND %1100'0000 ;b6: DRQ (запрос данных = 1). b7: INTRQ (выполняется команда = 0). JR Z,.wait_data_r JP P,.read_loop ; JUMP if "выполняется команда = 0" -.rw_return: ; + ; + ; .after_rw: EX AF,AF' + POP AF ; возвращаем текущую страницу OUT (SLOT3),A EX AF,AF' ; -.after_rw_end: POP DE + POP DE POP HL - ;EI LD A,BIOS.Error.NotReady JR C,.CMD_ERROR ; IN A,(FDC_93.Command) LD C,A AND #7F - ; NORMAL EXIT - RET Z - ; + RET Z ; NORMAL EXIT + ; BIT 6,C LD A,BIOS.Error.WriteProtect JR NZ,.error_exit @@ -453,6 +439,16 @@ FDD_RW_SECTOR: LD D,FDD_COUNTERS.RW_Retries POP DE JR .RETRY ; +.wait_loop_next: + INC DE + LD A,E + OR D + JR NZ,.wait_loop + ; + DJNZ .wait_loop + SCF + JR .after_rw ; error + ; .data_lost: DEC D ; потеря данных JR NZ,.RETRY ; @@ -463,7 +459,6 @@ FDD_RW_SECTOR: LD D,FDD_COUNTERS.RW_Retries JR Z,.error_exit ; LD A,BIOS.Error.Write ; Error Write - ; .error_exit: EX AF,AF' LD A,#D0 ;!HARDCODE CMD КР1818ВГ93 OUT (FDC_93.Command),A ;STOP OPERATION @@ -474,7 +469,9 @@ FDD_RW_SECTOR: LD D,FDD_COUNTERS.RW_Retries LD A,BIOS.Error.SectorNotFound RET ; - ;WRITE BYTE + ;██████████ КРИТИЧНЫЙ К СКОРОСТИ КУСОК ПОСЛЕ УСТАНОВКИ КОМАНДЫ ДО СНЯТИЯ РЕЗУЛЬТАТА ██████████ + ;WRITE BYTE +;.go_write: EX AF,AF' .write_loop: EXX DEC DE LD A,D @@ -483,21 +480,20 @@ FDD_RW_SECTOR: LD D,FDD_COUNTERS.RW_Retries JR Z,.SectorSizeError ; OUTI + ;█████████████████████████████████████████████████████████████████████████████████████████████ .wait_data_w: IN A,(FDC_93.DrvCTRL) AND %1100'0000 ;b6: DRQ (запрос данных = 1). b7: INTRQ (выполняется команда = 0). JR Z,.wait_data_w JP P,.write_loop - JP .rw_return + JP .after_rw ; .SectorSizeError: - EX AF,AF' - OUT (SLOT3),A - EX AF,AF' - POP DE - POP HL - ;EI ; A = 0 LD C,A + POP AF ; возвращаем текущую страницу + OUT (SLOT3),A + POP DE + POP HL LD A,BIOS.Error.UnknownDevice JR .error_exit