diff --git a/src/bios/exp/EXP.asm b/src/bios/exp/EXP.asm index 06a6531..1f6a849 100644 --- a/src/bios/exp/EXP.asm +++ b/src/bios/exp/EXP.asm @@ -126,22 +126,22 @@ NOINT: POP AF ; any adress < #C0 with mask %xxxx0000 ; таблица для Sprinter POST-Tester-a TABLE_X: -.v0: DB 00101000b ; "0" -.v1: DB 10111101b ; "1" -.v2: DB 00110010b ; "2" -.v3: DB 00110100b ; "3" -.v4: DB 10100101b ; "4" -.v5: DB 01100100b ; "5" -.v6: DB 01100000b ; "6" -.v7: DB 00111101b ; "7" -.v8: DB 00100000b ; "8" -.v9: DB 00100100b ; "9" -.vA: DB 00100001b ; "A" -.vB: DB 11100000b ; "B" -.vC: DB 01101010b ; "C" -.vD: DB 10110000b ; "D" -.vE: DB 01100010b ; "E" -.vF: DB 01100011b ; "F" +.v0: DB %00101000 ; "0" a +.v1: DB %10111101 ; "1" ___ +.v2: DB %00110010 ; "2" f | g | b +.v3: DB %00110100 ; "3" |___| +.v4: DB %10100101 ; "4" e | | c +.v5: DB %01100100 ; "5" |___|. +.v6: DB %01100000 ; "6" d +.v7: DB %00111101 ; "7" +.v8: DB %00100000 ; "8" a - 7 +.v9: DB %00100100 ; "9" b - 6 +.vA: DB %00100001 ; "A" . - 5 +.vB: DB %11100000 ; "B" f - 4 +.vC: DB %01101010 ; "C" g - 3 +.vD: DB %10110000 ; "D" e - 2 +.vE: DB %01100010 ; "E" c - 1 +.vF: DB %01100011 ; "F" d - 0 ENDIF ;======================================= ; @@ -268,23 +268,23 @@ ROM_DISK.Pages: ; _mInfoALIGN #10,0 ; any adress < #C0 with mask %xxxx0000 ; таблица для Sprinter POST-Tester-a -TABLE_X: ; таблица для Sprinter POST-Tester-a +TABLE_X: .v0: DB %00101000 ; "0" a .v1: DB %10111101 ; "1" ___ .v2: DB %00110010 ; "2" f | g | b .v3: DB %00110100 ; "3" |___| .v4: DB %10100101 ; "4" e | | c -.v5: DB %01100100 ; "5" |___| -.v6: DB %01100000 ; "6" d +.v5: DB %01100100 ; "5" |___|. +.v6: DB %01100000 ; "6" d .v7: DB %00111101 ; "7" .v8: DB %00100000 ; "8" a - 7 .v9: DB %00100100 ; "9" b - 6 -.vA: DB %00100001 ; "A" f - 4 -.vB: DB %11100000 ; "B" g - 3 -.vC: DB %01101010 ; "C" e - 2 -.vD: DB %10110000 ; "D" c - 1 -.vE: DB %01100010 ; "E" d - 0 -.vF: DB %01100011 ; "F" +.vA: DB %00100001 ; "A" . - 5 +.vB: DB %11100000 ; "B" f - 4 +.vC: DB %01101010 ; "C" g - 3 +.vD: DB %10110000 ; "D" e - 2 +.vE: DB %01100010 ; "E" c - 1 +.vF: DB %01100011 ; "F" d - 0 ENDIF ;======================================= ; @@ -424,6 +424,25 @@ EXTINT: OR A ; ==== POST PROCs ================= +; LPT 0 - start +; post 1. TEST RAM BUS +; IF ERROR -> ERROR RAM BUS - CODE 'X'X'X'X... - высветить номер ошибочного бита +; LPT 1 - post 1 OK +; post 2 TEST ADRESS BUS +; IF ERROR -> ошибка адреса CODE 'XXXX - вывести старший байт с запятой, пауза, вывести младший без запятой +; LPT 2 - post 2 OK +; post 3 init DCP +; no errors +; LPT 3 - post 3 OK +; post 4 TEST RAM PAGES запись в порт страницы, чтение записанного +; IF ERROR -> ошибка переключения Port-а CODE 'XX - вывод байта записанного в порт +; LPT 4 - post 4 OK +; post 5 проверка чистоты шины данных Z84C15 +; IF ERROR -> ERROR CODE '_'XX - в биосе на ошибке не зависает, хз почему, может на случай конфы с грязной шиной спектрума +; LPT 5 - post 5 OK +; LPT 4 - post 5 error - старый биос +; LPT F - post 5 error - биос 05/04/2025))) +; MODULE POST_TEST START: ; ********************************* @@ -499,7 +518,7 @@ POST_1_RAM_BUS: ; бесконечный цикл INC L LD A,L - AND #AF + AND +(TABLE_X or #0F) ;%1010'1111 LD L,A JR .ERB_2 @@ -548,12 +567,12 @@ POST_2_ADRESS_BUS: .error: .TSAB_4: LD C,D - LD B,11011111b + LD B,%1101'1111 LD IX,.TSAB_3 JR OUT_C_BYTE ; вывести старший байт с запятой .TSAB_3: LD C,E - LD B,#FF + LD B,%1111'1111 LD IX,.TSAB_4 JR OUT_C_BYTE ; вывести младший без запятой @@ -663,7 +682,7 @@ POST_4_PAGES: .error: LD C,B LD IX,.error_out_ret .error_out_ret: - LD B,11011111b + LD B,%1101'1111 JP OUT_C_BYTE ; *********************************** @@ -679,11 +698,17 @@ POST_5_DATA_BUS: LD B,0 .loop: IN A,(0) CP #FF - ;JR NZ,.error ;!!!!! посмотреть - JR NZ,POST_5_ERROR + IF ERROR_POST_5 + JR NZ,.error ;!!!!! посмотреть + ELSE + JR NZ,POST_5_ERROR + ENDIF DJNZ .loop + LD A,(TABLE_X.v5) ;rdlow-ok JR POST_5_OK - + ; + ; + IF ERROR_POST_5 ; ERROR CODE '_'XX .error: LD C,A @@ -702,15 +727,18 @@ POST_5_DATA_BUS: OR E JR NZ,.LOOP_WTT4 JR .erb1 + ENDIF ; ********************************** ; ===== Point 5 ========= ; ********************************** + IFN ERROR_POST_5 +POST_5_ERROR: + LD A,(TABLE_X.vF) ;rdlow-ok + ENDIF POST_5_OK: - LD A,(TABLE_X.v5) ;rdlow-ok OUT (Z84.PIO.Port_A.Data),A ; вывести "5" -POST_5_ERROR: ; ********************************** ; POST завершен ENDMODULE diff --git a/src/bios/exp/EXTENDED/FDD_DRIVER_2.asm b/src/bios/exp/EXTENDED/FDD_DRIVER_2.asm index 7b86671..a8910dc 100644 --- a/src/bios/exp/EXTENDED/FDD_DRIVER_2.asm +++ b/src/bios/exp/EXTENDED/FDD_DRIVER_2.asm @@ -3,6 +3,10 @@ ;[]===========================================================[] +;!TODO +; объеденить процедуры FDD_5x_LONG_READ и FDD_5x_LONG_WRITE +; объеденить процедуры READ_SECTOR и WR_SEC + ; FDD.CHANGE: ; LD A,#01 @@ -178,10 +182,9 @@ FDD_5x_RESET: CALL SAVE_INTERRUPTS.switch_off ; HL:IX - Sector + Sector counter ; DE - Address + (Sector counter * Size sector) ;[]===========================================================[] -FDD_5x_READ: - EX AF,AF' - IN A,(SLOT3) - EX AF,AF' +FDD_5x_READ: EX AF,AF' + IN A,(SLOT3) + EX AF,AF' ;[]===========================================================[] ;Function: Long Read Sectors ; A - Disk @@ -194,7 +197,11 @@ FDD_5x_READ: ; DE - Address + (Sector counter * Size sector) ;[]===========================================================[] FDD_5x_LONG_READ: - CALL SAVE_INTERRUPTS.switch_off + EXX + LD B,#80 ; COMMAND READ + EXX + ; +.RW_Shared: CALL SAVE_INTERRUPTS.switch_off CALL .Start JP SAVE_INTERRUPTS.restore ; @@ -202,8 +209,9 @@ FDD_5x_LONG_READ: PUSH BC PUSH HL PUSH IX + ; EX AF,AF' - LD C,A + LD C,A ; Memory Page Number EX AF,AF' PUSH BC CALL SET_DOS_ON @@ -212,46 +220,53 @@ FDD_5x_LONG_READ: CALL NTRACK POP BC EX DE,HL -; LD A,B -; OR A -; JP Z,RETDOS IN A,(SLOT3) EX AF,AF' LD A,SYS_PAGE OUT (SLOT3),A LD IY,(FDD_INIT_TABLE.FDD_0.BytesPerSector) - LD XH,C + LD XH,C ; Memory Page Number LD A,(FDD_INIT_TABLE.FDD_0.SECTORS) LD C,A EX AF,AF' OUT (SLOT3),A .DSK_LP: LD A,D - EXX - CALL SEEK + EXX + PUSH BC + CALL SEEK + POP BC EXX PUSH DE PUSH BC PUSH HL - CALL READ_SECTOR + ;CALL READ_SECTOR + CALL FDD_RW_SECTOR JR C,ERRDOS - LD D,YH - LD E,YL + ; размер сектора + LD D,YH + LD E,YL + ; POP HL POP BC ADD HL,DE - JR NC,.THISRD - IN A,(SLOT3) - EX AF,AF' - LD A,SYS_PAGE - OUT (SLOT3),A - LD D,#C2 - LD E,XH - LD A,(DE) - LD XH,A - EX AF,AF' - OUT (SLOT3),A - SET 7,H - SET 6,H + ; + CALL C,CHANGE_MEM_BLK + ; IN A,(SLOT3) + ; EX AF,AF' + ; LD A,SYS_PAGE + ; OUT (SLOT3),A + ; LD D,high SYS_PAGE.RAM_TABLE + ; LD E,XH + ; LD A,(DE) + ; LD XH,A + ; EX AF,AF' + ; OUT (SLOT3),A + ; ; SET 7,H + ; ; SET 6,H + ; LD A,%1100'0000 + ; OR H + ; LD H,A + ; .THISRD: POP DE LD A,C INC E @@ -261,7 +276,7 @@ FDD_5x_LONG_READ: INC D .NINC_T: DJNZ .DSK_LP .RETDOS: CALL SET_DOS_OFF - LD A,XH + LD A,XH ; Memory Page Number EX AF,AF' EX DE,HL POP IX @@ -276,12 +291,19 @@ FDD_5x_LONG_READ: JR NZ,.ADD8BIT INC B .ADD8BIT: ADD IX,BC - LD BC,0 - ADC HL,BC - LD B,A - XOR A - RET - ; + ;!TEST + ;LD BC,0 + ;ADC HL,BC + ;LD B,A + ;XOR A + ;RET + ; + LD B,A + RET NC + INC HL + XOR A + RET + ; ERRDOS: POP HL POP BC POP DE @@ -289,7 +311,7 @@ ERRDOS: POP HL EX DE,HL EX AF,AF' EXX - LD C,XH + LD C,XH ; Memory Page Number EXX LD A,B POP IX @@ -307,7 +329,7 @@ ERRDOS: POP HL ADC HL,BC POP BC EXX - LD A,C + LD A,C EXX EX AF,AF' SCF @@ -323,10 +345,9 @@ ERRDOS: POP HL ; HL:IX - Sector + Sector counter ; DE - Address + (Sector counter * Size sector) ;[]===========================================================[] -FDD_5x_WRITE: - EX AF,AF' - IN A,(SLOT3) - EX AF,AF' +FDD_5x_WRITE: EX AF,AF' + IN A,(SLOT3) + EX AF,AF' ;[]===========================================================[] ;Function: Long Write Sectors ; A - Disk @@ -340,6 +361,12 @@ FDD_5x_WRITE: ;?? B - Sector counter ;[]===========================================================[] FDD_5x_LONG_WRITE: + EXX + LD B,#A0 ;COMMAND WRITE + EXX + JP FDD_5x_LONG_READ.RW_Shared + +/* CALL SAVE_INTERRUPTS.switch_off CALL .Start JP SAVE_INTERRUPTS.restore @@ -348,8 +375,9 @@ FDD_5x_LONG_WRITE: PUSH BC PUSH HL PUSH IX + ; EX AF,AF' - LD C,A + LD C,A EX AF,AF' PUSH BC CALL SET_DOS_ON @@ -358,9 +386,6 @@ FDD_5x_LONG_WRITE: CALL NTRACK POP BC EX DE,HL -; LD A,B -; OR A -; JP Z,RETDOS IN A,(SLOT3) EX AF,AF' LD A,SYS_PAGE @@ -372,32 +397,41 @@ FDD_5x_LONG_WRITE: EX AF,AF' OUT (SLOT3),A .DSK_LP2: LD A,D - EXX - CALL SEEK + EXX + PUSH BC + CALL SEEK + POP BC EXX PUSH DE PUSH BC PUSH HL - CALL WR_SEC + CALL WR_SEC JR C,ERRDOS - LD D,YH - LD E,YL + ; размер сектора + LD D,YH + LD E,YL + ; POP HL POP BC ADD HL,DE - JR NC,.THISWR - IN A,(SLOT3) - EX AF,AF' - LD A,SYS_PAGE - OUT (SLOT3),A - LD D,#C2 - LD E,XH - LD A,(DE) - LD XH,A - EX AF,AF' - OUT (SLOT3),A - SET 7,H - SET 6,H + ; + CALL C,CHANGE_MEM_BLK + ; IN A,(SLOT3) + ; EX AF,AF' + ; LD A,SYS_PAGE + ; OUT (SLOT3),A + ; LD D,high SYS_PAGE.RAM_TABLE + ; LD E,XH + ; LD A,(DE) + ; LD XH,A + ; EX AF,AF' + ; OUT (SLOT3),A + ; ; SET 7,H + ; ; SET 6,H + ; LD A,%1100'0000 + ; OR H + ; LD H,A + ; .THISWR: POP DE LD A,C INC E @@ -435,15 +469,16 @@ FDD_5x_LONG_WRITE: XOR A RET ; +*/ - - +/* ; ;------------------------------- ;READ SECTOR ;------------------------------- READ_SECTOR: LD D,5 ;RETRY COUNT -.RRETRY: ;DI +.HL_RETRY: ;DI + PUSH HL PUSH DE LD A,E INC A @@ -455,167 +490,203 @@ READ_SECTOR: LD D,5 ;RETRY COUNT ; LD B,4 ; счётчик LD C,FDC_93.Data - LD A,#80 ;!HARDCODE COMMAND READ + LD A,#80 ; COMMAND READ OUT (FDC_93.Command),A + ; .FDR001: IN A,(FDC_93.DrvCTRL) ;WAIT INTRQ or DRQ - AND #C0 - JR NZ,.FDR004 + AND %1100'0000 ;b6: DRQ (запрос данных = 1). b7: INTRQ (выполняется команда = 0). + JR NZ,.read_loop INC DE LD A,E OR D JR NZ,.FDR001 + ; DJNZ .FDR001 SCF JR .FDR005 + ;READ BYTE +.read_loop: INI +.wait_data: IN A,(FDC_93.DrvCTRL) + AND %1100'0000 ;b6: DRQ (запрос данных = 1). b7: INTRQ (выполняется команда = 0). + JR Z,.wait_data + JP P,.read_loop ; JUMP if "выполняется команда = 0" ; -.FDR004: INI ;READ BYTE -.FDR002: IN A,(FDC_93.DrvCTRL) - AND #C0 - JR Z,.FDR002 - JP P,.FDR004 .FDR005: EX AF,AF' - OUT (SLOT3),A + OUT (SLOT3),A EX AF,AF' ; POP DE + POP HL ;EI + LD A,BIOS.Error.NotReady + JR C,.ERR_XRD + ; IN A,(FDC_93.Command) LD C,A -;R01 ; JP C,ERRRD ;READ ERROR - ; [x] 29/06/2024 - ;JP C,.ERR_XRD - JR NC,.NO_ERR_XRD - DEC D - JR Z,.RSTOP - JR .RRETRY - ; -.NO_ERR_XRD: ; AND #7F - RET Z + RET Z ; Выход без ошибок + ; BIT 2,C JR NZ,.ERDATA + ; LD A,BIOS.Error.Seek - DEC D +.ERR_XRD: DEC D JR Z,.RSTOP + ; PUSH DE + PUSH HL CALL RESWG ; RESET_WG LD A,XL - CALL SEEK ; !!!!! посмотреть -.ERR_XRD: POP DE - JR .RRETRY + CALL SEEK ; !!!!! посмотреть + POP HL + POP DE + JR .HL_RETRY ; -.ERDATA: DEC D ; POTERIA DANNYH - JR NZ,.RRETRY +.ERDATA: DEC D ; потеря данных + JR NZ,.HL_RETRY + ; Error Read .ERRRD: LD A,BIOS.Error.Read .RSTOP: EX AF,AF' - LD A,#D0 - OUT (FDC_93.Command),A ;STOP OPERATION + LD A,#D0 + OUT (FDC_93.Command),A ;STOP OPERATION EX AF,AF' BIT 0,C SCF RET Z LD A,BIOS.Error.SectorNotFound - RET + RET ; ; ; +*/ ; ;------------------------------- ;WRITE SECTOR ;------------------------------- -WR_SEC: LD D,5 ;RETRY COUNT -.WRETRY: - ;DI - PUSH DE - LD A,E - INC A - OUT (FDC_93.Sector),A -.FDWRITE: - IN A,(SLOT3) - EX AF,AF' - LD A,XH - OUT (SLOT3),A - LD B,4 - LD C,FDC_93.Data - LD A,#A0 ;COMMAND WRITE - OUT (FDC_93.Command),A -.FDW001: - IN A,(FDC_93.DrvCTRL) ;WAIT INTRQ or DRQ - AND #C0 - JR NZ,.FDW004 - INC DE - LD A,E - OR D - JR NZ,.FDW001 - DJNZ .FDW001 - SCF - JR .FDW005 -.FDW004: - OUTI ;WRITE BYTE -.FDW002: - IN A,(FDC_93.DrvCTRL) - AND #C0 - JR Z,.FDW002 - JP P,.FDW004 -.FDW005: - EX AF,AF' - OUT (SLOT3),A - EX AF,AF' -;------------------------------- - POP DE - ;EI - IN A,(FDC_93.Command) - LD C,A -;R01 - JR C,.ERR_XWR - AND #7F - RET Z - BIT 6,C - LD A,BIOS.Error.WriteProtect - JR NZ,.WSTOP - BIT 2,C - JR NZ,.EWDATA - LD A,BIOS.Error.Seek - DEC D - JR Z,.WSTOP -.ERR_XWR: - PUSH DE - CALL RESWG ; RESET_WG - LD A,XL - CALL SEEK ; !!!!! посмотреть - POP DE - JR .WRETRY -.EWDATA: - DEC D ; POTERIA DANNYH - JR NZ,.WRETRY -.ERRWR: LD A,BIOS.Error.Write -.WSTOP: EX AF,AF' - LD A,#D0 - OUT (FDC_93.Command),A ;STOP OPERATION - EX AF,AF' - BIT 0,C - SCF - RET Z - LD A,BIOS.Error.SectorNotFound - RET - +FDD_RW_SECTOR: LD D,5 ;RETRY COUNT +.RETRY: DI + PUSH HL + PUSH DE + LD A,E + INC A + OUT (FDC_93.Sector),A + IN A,(SLOT3) + EX AF,AF' + LD A,XH + OUT (SLOT3),A + ; + LD B,4 + LD C,FDC_93.Data + EXX + LD A,B ; COMMAND read or write + EXX + 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 + ; +.RW_PROC: EXX + BIT 5,B + EXX + JR NZ,.write_loop + ;READ BYTE +.read_loop: 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' + OUT (SLOT3),A + EX AF,AF' + ; + POP DE + POP HL + ; прерывания + LD A,R + AND %1000'0000 + JR Z,.no_EI + EI +.no_EI: ; + LD A,BIOS.Error.NotReady + JR C,.CMD_ERROR + ; + IN A,(FDC_93.Command) + LD C,A + AND #7F + ; NORMAL EXIT + RET Z + ; + BIT 6,C + LD A,BIOS.Error.WriteProtect + JR NZ,.error_exit + ; + BIT 2,C + JR NZ,.data_lost + ; + LD A,BIOS.Error.Seek +.CMD_ERROR: DEC D + JR Z,.error_exit + ; + PUSH DE + PUSH HL + CALL RESWG ; RESET_WG + LD A,XL + CALL SEEK ; !!!!! посмотреть + POP HL + POP DE + JR .RETRY + ; +.data_lost: DEC D ; потеря данных + JR NZ,.RETRY + ; + EXX + BIT 5,B + EXX + LD A,BIOS.Error.Read ; Error Read + JR Z,.error_exit + ; + LD A,BIOS.Error.Write ; Error Write +.error_exit: EX AF,AF' + LD A,#D0 + OUT (FDC_93.Command),A ;STOP OPERATION + EX AF,AF' + BIT 0,C + SCF + RET Z + LD A,BIOS.Error.SectorNotFound + RET + ; + ;WRITE BYTE +.write_loop: OUTI +.wwait_data: IN A,(FDC_93.DrvCTRL) + AND %1100'0000 ;b6: DRQ (запрос данных = 1). b7: INTRQ (выполняется команда = 0). + JR Z,.wwait_data + JP P,.write_loop + JP .rw_return ; ; Врубает третью карту портов -SET_DOS_ON: - EX AF,AF' - LD A,CNF_PORT.CNF_3 + ROM.BIOS - OUT (SYS_PORT.ROM),A ; - OPEN - EX AF,AF' - RET +SET_DOS_ON: EX AF,AF' + LD A,CNF_PORT.CNF_3 + ROM.BIOS + OUT (SYS_PORT.ROM),A ; - OPEN + EX AF,AF' + RET ; Врубает нулевую карту портов -SET_DOS_OFF: - EX AF,AF' - LD A,CNF_PORT.CNF_0 + ROM.BIOS - OUT (SYS_PORT.ROM),A ; - CLOSE - EX AF,AF' - RET +SET_DOS_OFF: EX AF,AF' + LD A,CNF_PORT.CNF_0 + ROM.BIOS + OUT (SYS_PORT.ROM),A ; - CLOSE + EX AF,AF' + RET ; S_FDD: PUSH BC @@ -625,12 +696,12 @@ S_FDD: PUSH BC OUT (FDC_93.DrvCTRL),A IN A,(SLOT3) EX AF,AF' - LD A,SYS_PAGE - OUT (SLOT3),A - LD A,(FDD_INIT_TABLE.FDD_0.DISK) - AND #FE - OR B - LD (FDD_INIT_TABLE.FDD_0.DISK),A + LD A,SYS_PAGE + OUT (SLOT3),A + LD A,(FDD_INIT_TABLE.FDD_0.DISK) + AND #FE + OR B + LD (FDD_INIT_TABLE.FDD_0.DISK),A EX AF,AF' OUT (SLOT3),A POP BC @@ -672,10 +743,10 @@ FDD.SET1440: LD A,FDD_Density.SET_1440 ; SET_SPEED: IN A,(SLOT3) EX AF,AF' - LD A,SYS_PAGE - OUT (SLOT3),A - LD A,(FDD_INIT_TABLE.FDD_0.F144) - AND #80 + LD A,SYS_PAGE + OUT (SLOT3),A + LD A,(FDD_INIT_TABLE.FDD_0.F144) + AND #80 EX AF,AF' OUT (SLOT3),A EX AF,AF' @@ -687,116 +758,118 @@ FDD.SET720: LD A,FDD_Density.SET_720 ; прерывания должны быть отключены DISK_ID: EXX - CALL SET_SPEED - IN A,(FDC_93.Track) - OUT (FDC_93.Data),A - LD A,#18 ;!TODO выписать комманды ВГ ;SEARCH ; !HARDCODE - CALL EXECOM - LD C,4 ; счётчик -.loop_reg_C: LD A,#C0 - OUT (FDC_93.Command),A - LD HL,#F000 ; счётчик -.loop_reg_HL: IN A,(FDC_93.DrvCTRL) - AND #C0 - JR Z,.ID_LP4 - ; -.ID_LP2: IN A,(FDC_93.Data) -.ID_LP3: IN A,(FDC_93.DrvCTRL) - AND #C0 - JR Z,.ID_LP3 - JP P,.ID_LP2 + CALL SET_SPEED + IN A,(FDC_93.Track) + OUT (FDC_93.Data),A + LD A,#18 ;!TODO выписать комманды ВГ ;SEARCH ; !HARDCODE + CALL EXECOM + LD C,4 ; счётчик +.loop_reg_C: LD A,#C0 + OUT (FDC_93.Command),A + LD HL,#F000 ; счётчик +.loop_reg_HL: IN A,(FDC_93.DrvCTRL) + AND #C0 + JR Z,.ID_LP4 + ; +.ID_LP2: IN A,(FDC_93.Data) +.ID_LP3: IN A,(FDC_93.DrvCTRL) + AND #C0 + JR Z,.ID_LP3 + JP P,.ID_LP2 EXX IN A,(SLOT3) EX AF,AF' - LD A,SYS_PAGE - OUT (SLOT3),A - LD A,(FDD_INIT_TABLE.FDD_0.F144) + LD A,SYS_PAGE + OUT (SLOT3),A + LD A,(FDD_INIT_TABLE.FDD_0.F144) EX AF,AF' OUT (SLOT3),A EX AF,AF' AND #80 RET ; -.ID_LP4: DEC HL - LD A,H - OR L - JR NZ,.loop_reg_HL - CALL CHANGE_SPEED - DEC C - JR NZ,.loop_reg_C +.ID_LP4: DEC HL + LD A,H + OR L + JR NZ,.loop_reg_HL + CALL CHANGE_SPEED + DEC C + JR NZ,.loop_reg_C EXX SCF RET ; ; -SEEK: LD XL,A - LD C,A - IN A,(SLOT3) - EX AF,AF' - LD A,SYS_PAGE - OUT (SLOT3),A - LD A,(FDD_INIT_TABLE.FDD_0.DISK) - AND 1 - EX AF,AF' - OUT (SLOT3),A - EX AF,AF' - SRL C - JR C,.GT001 - OR #3C -.GT001: OR #2C - OUT (FDC_93.DrvCTRL),A - IN A,(FDC_93.Track) - CP C - PUSH BC - CALL NZ,P50ms - POP BC - LD A,C - OUT (FDC_93.Data),A - IN A,(FDC_93.Track) - CP C - EX AF,AF' ;R.TRACK==PHISICAL TRACK - LD A,#18 - CALL EXECOM - RET C - EX AF,AF' - LD A,C - OUT (FDC_93.Track),A - RET Z -.STOL: PUSH BC - CALL P50ms - POP BC - RET +SEEK: LD XL,A + LD C,A + IN A,(SLOT3) + EX AF,AF' + LD A,SYS_PAGE + OUT (SLOT3),A + LD A,(FDD_INIT_TABLE.FDD_0.DISK) + AND 1 + EX AF,AF' + OUT (SLOT3),A + EX AF,AF' + SRL C + JR C,.GT001 + ; + OR #3C +.GT001: OR #2C + OUT (FDC_93.DrvCTRL),A + IN A,(FDC_93.Track) + CP C + PUSH BC + CALL NZ,P50ms + ; + POP BC + LD A,C + OUT (FDC_93.Data),A + IN A,(FDC_93.Track) + CP C + EX AF,AF' ;R.TRACK==PHISICAL TRACK + LD A,#18 + CALL EXECOM + RET C + EX AF,AF' + LD A,C + OUT (FDC_93.Track),A + RET Z +.STOL: PUSH BC + CALL P50ms + POP BC + RET ; ;P750ms LD B,3 ;PMS2 LD A,255 ; CALL P1ms ; DJNZ PMS2 ; RET -P50ms: LD A,12 -.P1ms: LD C,255 -.PMS: DEC C - JR NZ,.PMS - DEC A - JR NZ,.P1ms - RET +P50ms: LD A,12 +.P1ms: LD C,255 +.PMS: DEC C + JR NZ,.PMS + DEC A + JR NZ,.P1ms + 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 - ;AND A - 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 ; ; @@ -804,35 +877,34 @@ EXECOM: OUT (FDC_93.Command),A ; HL:IX - SECTOR ; H - TRACK, L - SECTOR ;HL:IX/SECTOR_PER_TRACK -NTRACK: - PUSH HL - EX (SP),IX - POP HL - IN A,(SLOT3) - EX AF,AF' - LD A,SYS_PAGE - OUT (SLOT3),A - LD A,(FDD_INIT_TABLE.FDD_0.SECTORS) - LD C,A - LD B,0 - EX AF,AF' - OUT (SLOT3),A - XOR A -.NTRK: INC A - SBC HL,BC - JR NC,.NTRK - EX AF,AF' - LD A,XL - OR XH - JR Z,.NTRK3 - EX AF,AF' - DEC IX - JR .NTRK -.NTRK3: EX AF,AF' - ADD HL,BC - DEC A - LD H,A - RET +NTRACK: PUSH HL + EX (SP),IX + POP HL + IN A,(SLOT3) + EX AF,AF' + LD A,SYS_PAGE + OUT (SLOT3),A + LD A,(FDD_INIT_TABLE.FDD_0.SECTORS) + LD C,A + LD B,0 + EX AF,AF' + OUT (SLOT3),A + XOR A +.NTRK: INC A + SBC HL,BC + JR NC,.NTRK + EX AF,AF' + LD A,XL + OR XH + JR Z,.NTRK3 + EX AF,AF' + DEC IX + JR .NTRK +.NTRK3: EX AF,AF' + ADD HL,BC + DEC A + LD H,A + RET ; SAVE_INTERRUPTS: .switch_off: PUSH AF diff --git a/src/bios/exp/EXTENDED/IDE/ATAPI_DRV.ASM b/src/bios/exp/EXTENDED/IDE/ATAPI_DRV.ASM index b2455ed..c0115a7 100644 --- a/src/bios/exp/EXTENDED/IDE/ATAPI_DRV.ASM +++ b/src/bios/exp/EXTENDED/IDE/ATAPI_DRV.ASM @@ -151,9 +151,12 @@ ATAPI_5x_SET_PAR: ; HL:IX - Sector + Sector counter ; DE - Address + (Sector counter * Size sector) ;READ SECTOR(S) -ATAPI_5x_READ: EX AF,AF' +ATAPI_5x_READ: PUSH IY + LD C,0 ; признак short + EX AF,AF' IN A,(SLOT3) EX AF,AF' + JP ATAPI_5x_LONG_READ.main ;[]================================================================[#52] ;Function: Long Read Sectors ; A - Disk @@ -166,10 +169,11 @@ ATAPI_5x_READ: EX AF,AF' ; DE - Address + (Sector counter * Size sector) ;LONG READ SECTOR(S) ATAPI_5x_LONG_READ: - AND A + ;AND A ; PUSH IY - SAFE_PORTY_2 + LD C,1 ; признак long +.main: SAFE_PORTY_2 PUSH BC PUSH IX PUSH HL @@ -196,8 +200,10 @@ ATAPI_5x_LONG_READ: ; OUTPUT: ; RW_ATAPI_SECTORs: + PUSH BC LD C,IDE.Device.ATAPI CALL SELECT_DRIVE + POP BC RET C ; EXX @@ -232,16 +238,11 @@ RW_ATAPI_SECTORs: LD A,B LD (RAM_ATAPI_RW_CMD + ATAPI_PACKET.COUNTER+1),A ;R01 ; - ; EX AF,AF' - ; OUT (SLOT3),A - ; - ; POP AF - ; OUT (SLOT3),A + LD YL,C ; признак short/long из C в YL LD HL,RAM_ATAPI_RW_CMD CALL EXEC_PACKET_COMMAND.start ; .exit: POP BC - ;LD C,SLOT3 OUT (C),B RET ; @@ -262,9 +263,12 @@ RW_ATAPI_SECTORs: ; HL:IX - Sector + Sector counter ; DE - Address + (Sector counter * Size sector) ;WRITE SECTOR(S) -ATAPI_5x_WRITE: EX AF,AF' +ATAPI_5x_WRITE: PUSH IY + LD C,0 ; признак short + EX AF,AF' IN A,(SLOT3) EX AF,AF' + JP ATAPI_5x_LONG_WRITE.main ;[]================================================================[#53] ;Function: Long Write Sectors ; A - Disk @@ -277,10 +281,11 @@ ATAPI_5x_WRITE: EX AF,AF' ; DE - Address + (Sector counter * Size sector) ;WRITE SECTOR(S) ATAPI_5x_LONG_WRITE: - AND A + ;AND A ; PUSH IY - SAFE_PORTY_2 + LD C,1 ; признак long +.main: SAFE_PORTY_2 PUSH BC PUSH IX PUSH HL @@ -466,6 +471,7 @@ TRAY_FN: LD HL,ATAPI_CMD_PACKET.CLOSE ; #0B - ABORTED COMMAND ; #80 - TIME OUT EXEC_PACKET_COMMAND: +.error_ex: EX DE,HL .error: CP #FF .error_fail: SCF LD A,BIOS.Error.Failure @@ -475,14 +481,15 @@ EXEC_PACKET_COMMAND: RET ; .error_TimeOut: CP #FF + EX DE,HL JR Z,.error_fail LD A,BIOS.Error.ATAPI.TimeOut SCF RET ; -.start_sys_page: - LD A,SYS_PAGE - EX AF,AF' +; .start_sys_page: +; LD A,SYS_PAGE +; EX AF,AF' ; .start: XOR A ; признак того, что ошибка смены носителя должна обрабатываться в EXEC_PACKET_COMMAND .start_custom: EXX @@ -501,7 +508,7 @@ EXEC_PACKET_COMMAND: EXX CALL ATAPI_WAITPRT EXX - JR C,.error + JR C,.error_ex ; .READY: LD C,SLOT3 IN B,(C) @@ -534,7 +541,7 @@ EXEC_PACKET_COMMAND: LD C,H ; признак того, что ошибка смены носителя должна обрабатываться в EXEC_PACKET_COMMAND CALL ATAPI_WAITPRT EXX - JR C,.error + JR C,.error_ex ; EXX LD DE,256*(IDE.CtrlByte.DataRequest+IDE.CtrlByte.Error)+IDE.CtrlByte.DataRequest @@ -568,16 +575,133 @@ EXEC_PACKET_COMMAND: LD XH,A ; страница для R/W_LONG LD XL,0 EX AF,AF' - ; EX DE,HL -.AP_LOOP: EX DE,HL - ; IN A,(SLOT3) - ; EX AF,AF' ;>-----------> \ ; +.AP_LOOP: CALL ATAPI_CHECK_DRV + JP C,.error + RET Z + ;====== IF DATA REQUEST ===============================================; +.data_request: IN A,(SLOT3) + EX AF,AF' ;>-----------> \ + ; + LD A,XH + OUT (SLOT3),A + ; + ;LD BC,IDE.Read.ByteCountLow + ;IN E,(C) + ;INC C ;LD BC,IDE.Read.ByteCountHigh + ;IN D,(C) ;TRANSFER BLOCK SIZE + ;; + ;LD A,D + ;OR E + ;RET Z ;BLOCK = 0 + ;; уменьшаем счётчик загружаемых байтов в 2 раза. Читаем по 2 байта + ;SRL D + ;RR E + ;; + ;LD BC,IDE.Read.InterruptReason + ;IN A,(C) + ;AND IDE.InterruptReasonByte.IO + ;LD BC,IDE.Read.Data + CALL ATAPI_PREPARE_RW + RET NC + JR Z,.WRITE_DATA + ;READ +.read_loop: INI + INI + DEC DE + LD A,D + OR E + JR NZ,.read_loop + ; +.return_rw: EX AF,AF' ;<-----------< / + INC XL ;INC LOADED SECTORS + OUT (SLOT3),A + ; + LD A,H + OR L + JR NZ,.AP_LOOP + ; short/long + ; A = 0 + SUB YL + JR NC,.END_BUFFER + ; next page in mem block + CALL CHANGE_MEM_BLK + JR .AP_LOOP + ;WRITE +.WRITE_DATA: INC B ; LD BC,IDE.Write.Data +.write_loop: OUTI + OUTI + DEC DE + LD A,D + OR E + JR NZ,.write_loop + JR .return_rw + ; ; +.END_BUFFER: CALL ATAPI_CHECK_DRV + JP C,.error + JR NZ,ATAPI_IdlePasses.Enter + RET +;;;;;;;;;;;;;;;;; +ATAPI_IdlePasses: + CALL ATAPI_CHECK_DRV + JP C,EXEC_PACKET_COMMAND.error + JP Z,EXEC_PACKET_COMMAND.error_fail + ; +.Enter: ;LD BC,IDE.Read.ByteCountLow + ;IN E,(C) + ;INC C ;LD BC,IDE.Read.ByteCountHigh + ;IN D,(C) ;TRANSFER BLOCK SIZE + ;; + ;LD A,D + ;OR E + ;RET Z ;BLOCK = 0 + ;; + ;; уменьшаем счётчик загружаемых байтов в 2 раза. Читаем по 2 байта + ;SRL D + ;RR E + ;; + ;LD BC,IDE.Read.InterruptReason + ;IN A,(C) + ;AND IDE.InterruptReasonByte.IO + ;LD BC,IDE.Read.Data + CALL ATAPI_PREPARE_RW + RET NC + JR Z,.write_data + ; +.read_loop: IN F,(C) ; читаем по 1 разу с чётного адреса, читается WORD + DEC DE + LD A,D + OR E + JR NZ,.read_loop + JR ATAPI_IdlePasses + ; +.write_data: ; A = 0 + OUT (C),A ; кидаем 0 в регистр защёлку IDE + INC B +.write_loop: XOR A + OUT (C),A ; пишем по 1 разу в нечётный адрес, пишется WORD + DEC DE + LD A,D + OR E + JR NZ,.write_loop + JR ATAPI_IdlePasses +; + + +; выход: +; CF,ZF ATAPI_WAITPRT Error или Check Condition со внешней обработкой +; ZF No errors, no data request +; NZ,NC DATA REQUEST +; CF Error +ATAPI_CHECK_DRV: + ;EX DE,HL EXX CALL ATAPI_WAITPRT EXX - JP C,.error + ; ZF=1 + ;JP C,.error + RET C ; ; [ ] media change. а надо ли тут? ;!FIXIT лучше блокировать носитель LD A,high IDE.Read.Status @@ -586,21 +710,17 @@ EXEC_PACKET_COMMAND: AND IDE.CtrlByte.DataRequest + IDE.CtrlByte.Error RET Z ;NO DATA REQUEST. A = 0: BIOS.Error.NoErrors RRA ; Checking IDE.CtrlByte.CheckCondition - JR NC,.data_request + ;JR NC,.data_request + RET NC ; признак того, что ошибка смены носителя должна обрабатываться в EXEC_PACKET_COMMAND EXX DEC C ; признак того, что ошибка смены носителя должна обрабатываться в EXEC_PACKET_COMMAND EXX RET Z ; выход, если ошибка обрабатывается не в EXEC_PACKET_COMMAND + JP ATAPI_CHECK_ERROR ; - JP ATAPI_CHECK_ERROR -;====== IF DATA REQUEST ===============================================; -.data_request: IN A,(SLOT3) - EX AF,AF' ;>-----------> \ - ; - LD A,XH - OUT (SLOT3),A - EX DE,HL + +ATAPI_PREPARE_RW: LD BC,IDE.Read.ByteCountLow IN E,(C) INC C ;LD BC,IDE.Read.ByteCountHigh @@ -618,54 +738,17 @@ EXEC_PACKET_COMMAND: IN A,(C) AND IDE.InterruptReasonByte.IO LD BC,IDE.Read.Data - JR Z,.WRITE_DATA - ;READ - ; проверка на тупость кодера - ; CF=0 - ; ADC HL,DE - ; JR Z,.good_buffer - ; JR C,.error_buffer - ; -; .good_buffer: AND A -; SBC HL,DE + SCF + RET -.read_loop: INI - INI - DEC DE - LD A,D - OR E - JR NZ,.read_loop - ; -.return_rw: INC XL ;INC LOADED SECTORS - EX AF,AF' ;<-----------< / - OUT (SLOT3),A - ; - LD A,H - OR L - JR NZ,.AP_LOOP - ; next page in mem block - LD HL,#C000 - IN A,(SLOT3) - EX AF,AF' ;>-----------> \ - LD A,SYS_PAGE - OUT (SLOT3),A - LD D,high SYS_PAGE.RAM_TABLE - LD E,XH - LD A,(DE) - LD XH,A - EX AF,AF' ;<-----------< / - OUT (SLOT3),A - JR .AP_LOOP - ;WRITE -.WRITE_DATA: INC B ; LD BC,IDE.Write.Data -.write_loop: OUTI - OUTI - DEC DE - LD A,D - OR E - JR NZ,.write_loop - JR .return_rw - ; + +; .AddrOverflow: EX DE,HL +; AND A +; SBC HL,DE +; EX DE,HL +; RET + +; ; !TODO холостое чтение ; .error_buffer: AND A ; SBC HL,DE @@ -702,6 +785,8 @@ ATAPI_GET_ERROR_REG: ;----------------------------------------------------------------------; ; D - MASK, E - PATTERN +; !!! некоторые функции надеются, что на выходе всегда ZF +; не должна трогать рег. C ATAPI_WAITPRT: LD DE,256*IDE.CtrlByte.Busy + 0 .Custom: LD B,100 LD HL,#0000 @@ -762,7 +847,7 @@ ATAPI_READ_CAPACITY_DATA: JR NZ,.pause ; JP .loop - RET + ;RET ;----------------------------------------------------------------------; @@ -775,6 +860,9 @@ ATAPI_READ_CAPACITY_DATA: ;----------------------------------------------------------------------; ATAPI_MEDIA_ERROR: + PUSH IX + PUSH HL + ; IN A,(SLOT3) PUSH AF LD A,SYS_PAGE @@ -826,6 +914,8 @@ ATAPI_MEDIA_ERROR: LD (IY+IDE.HDD_INIT_TABLE.SectorSize + 1),L ; .exit: POP AF + POP HL + POP IX OUT (SLOT3),A LD A,C SCF diff --git a/src/bios/exp/EXTENDED/IDE/ATA_DRV.ASM b/src/bios/exp/EXTENDED/IDE/ATA_DRV.ASM index 9fa6952..826aec7 100644 --- a/src/bios/exp/EXTENDED/IDE/ATA_DRV.ASM +++ b/src/bios/exp/EXTENDED/IDE/ATA_DRV.ASM @@ -161,10 +161,12 @@ ATA_5x_SET_PAR: ; HL:IX - Sector + Sector counter ; DE - Address + (Sector counter * Size sector) ;READ SECTOR(S) -ATA_5x_READ: - EX AF,AF' - IN A,(SLOT3) - EX AF,AF' +ATA_5x_READ: PUSH IY + LD C,0 ; признак short + EX AF,AF' + IN A,(SLOT3) + EX AF,AF' + JP ATA_5x_LONG_READ.main ;[]================================================================[#52] ;Function: Long Read Sectors ; A - Disk @@ -179,7 +181,8 @@ ATA_5x_READ: ;LONG READ SECTOR(S) ATA_5x_LONG_READ: PUSH IY - SAFE_PORTY_2 + LD C,1 ; признак long +.main: SAFE_PORTY_2 PUSH BC PUSH IX PUSH HL @@ -222,8 +225,12 @@ ATA_5x_LONG_READ: PUSH BC LD B,0 ADD IX,BC - LD C,B - ADC HL,BC + ; + ;LD C,B + ;ADC HL,BC + JR NC,.no_inc_hl + INC HL +.no_inc_hl: ; POP BC POP AF SUB C @@ -245,10 +252,12 @@ ATA_5x_LONG_READ: ; HL:IX - Sector + Sector counter ; DE - Address + (Sector counter * Size sector) ;WRITE SECTOR(S) -ATA_5x_WRITE: - EX AF,AF' - IN A,(SLOT3) - EX AF,AF' +ATA_5x_WRITE: PUSH IY + LD C,0 ; признак short + EX AF,AF' + IN A,(SLOT3) + EX AF,AF' + JP ATA_5x_LONG_WRITE.main ;[]================================================================[#53] ;Function: Long Write Sectors ; A - Disk @@ -262,7 +271,8 @@ ATA_5x_WRITE: ;WRITE SECTOR(S) ATA_5x_LONG_WRITE: PUSH IY - SAFE_PORTY_2 + LD C,1 ; признак long +.main: SAFE_PORTY_2 PUSH BC PUSH IX PUSH HL @@ -273,70 +283,19 @@ ATA_5x_LONG_WRITE: CALL RW_ATA_SECTORs ; JP ATA_5x_LONG_READ.shared -/* - EX DE,HL - JP C,.error - LD A,XH - EX AF,AF' - ; - POP HL - POP IX - POP BC - XOR A - CP B - LD C,B - LD B,A - JR NZ,WNOT256 - ; - INC B - ADD IX,BC - LD B,C - ADC HL,BC - ;EX AF,AF' - JR RST8WRR - ; -WNOT256 ADD IX,BC - LD C,B - ADC HL,BC - JR RST8WRR - -.error: LD B,A - LD C,XL - LD A,XH - EX AF,AF' - POP HL - POP IX - PUSH BC - LD B,0 - ADD IX,BC - LD C,B - ADC HL,BC - POP BC - POP AF - SUB C - LD C,A - LD A,B - LD B,C - ;R03 - SCF ;R03 - ;EX AF,AF' ;R03 ;!FIXIT намудрил он чёт в этом R03 - ; -RST8WRR: RESTORE_PORTY - POP IY - ;EX AF,AF' - RET -*/ - ;███████████████████████████████████████████████████████████████████████████████████████████████████████; ; A - Disk ; HL:IX - Sector ; DE - Address ; B - Sector counter +; C - short/long ; A'- Memory Page Number ; CF'=1 - write, CF'=0 - read -RW_ATA_SECTORs: LD C,IDE.Device.HDD +RW_ATA_SECTORs: PUSH BC ; признак short/long в C + LD C,IDE.Device.HDD CALL SELECT_DRIVE + POP BC ; признак short/long в C RET C ; EXX @@ -346,12 +305,16 @@ RW_ATA_SECTORs: LD C,IDE.Device.HDD ; EX AF,AF' PUSH AF ; memory page number + PUSH BC ; признак short/long в C PUSH DE ; Address CALL PRESET + ; IY из SELECT_DRIVE больше не нужен + ; POP HL ; Address + POP IY ; признак short/long в YL POP AF ; memory page number LD XL,0 - LD XH,A + LD XH,A ; memory page number LD BC,IDE.Write.Command LD A,IDE.CMD.ATA.WriteSectorsWithRetry JR C,.set_command ; CF = r/w @@ -386,40 +349,43 @@ RW_ATA_SECTORs: LD C,IDE.Device.HDD ; ; ; ; ; ; CF=0 .return_rw: EX AF,AF' ;<-----------< / + INC XL ;INC LOADED SECTORS OUT (SLOT3),A ; LD A,H OR L - JR NZ,.W44 + JR NZ,.end_pass + ; short/long + ; A = 0 + SUB YL + JR NC,.END_BUFFER ; next page in mem block - ; сделать если не RW_LONG, то холостые чтение/запись и выход с ошибкой - LD HL,#C000 - IN A,(SLOT3) - EX AF,AF' ;>-----------> \ - LD A,SYS_PAGE - OUT (SLOT3),A - LD D,high SYS_PAGE.RAM_TABLE - LD E,XH - LD A,(DE) - LD XH,A - EX AF,AF' ;<-----------< / - OUT (SLOT3),A + CALL CHANGE_MEM_BLK + ; LD HL,#C000 + ; IN A,(SLOT3) + ; EX AF,AF' ;>-----------> \ + ; LD A,SYS_PAGE + ; OUT (SLOT3),A + ; LD D,high SYS_PAGE.RAM_TABLE + ; LD E,XH + ; LD A,(DE) + ; LD XH,A + ; EX AF,AF' ;<-----------< / + ; OUT (SLOT3),A ; -.W44: INC XL ;INC LOADED SECTORS +.end_pass: ;INC XL ;INC LOADED SECTORS EXX CALL WAITPRT EXX RET C + ; + ;INC XL ;INC LOADED SECTORS LD BC,IDE.Read.Status IN A,(C) BIT IDE.CtrlBit.DataRequest,A + RET Z ; - RET Z - JP .big_loop - ;JP NZ,.big_loop - ;XOR A - ;RET - ; + JP .big_loop ; .write_sector: ; WRITE SECTOR 512 bytes ;!HARDCODE sector size INC B ; LD BC,IDE.Write.Data @@ -431,9 +397,49 @@ RW_ATA_SECTORs: LD C,IDE.Device.HDD JR NZ,.loop SCF JP .return_rw - ; ; ; ; ; - - ;ENDIF + ; ; +.END_BUFFER: CALL ATA_IdlePasses.CHECK_DRV + JR NZ,ATA_IdlePasses.Enter + RET +;;;;;;;;;;;;;;;;; +ATA_IdlePasses: CALL .CHECK_DRV + JR NZ,.Enter + ; + RET C + LD A,BIOS.Error.Failure + SCF + RET + ; +.Enter: XOR A ; счётчик для READ_ZEROS, данные для .WrZeros + EX AF,AF' + LD BC,IDE.Read.Data + JR C,.WrZeros + ; READ > /dev/null + EX AF,AF' +.RdLoop: IN F,(C) ; читаем по 1 разу с чётного адреса, читается WORD + DEC A + JR NZ,.RdLoop + JR ATA_IdlePasses + ; WRITE ZEROS +.WrZeros: EX AF,AF' + ; +.WrLoop: OUT (C),A + DJNZ .WrLoop + ; +.WrLoop2: OUT (C),A + DJNZ .WrLoop2 + JR ATA_IdlePasses + ; +.CHECK_DRV: EXX + CALL WAITPRT + EXX + RET C + ; + LD BC,IDE.Read.Status + IN A,(C) + BIT IDE.CtrlBit.DataRequest,A + RET +;!TODO доделать эту же хурму для других устройств ;███████████████████████████████████████████████████████████████████████████████████████████████████████; /* IFN OPTIMIZE_RW_PROCEDURE @@ -523,7 +529,7 @@ WRITE_ATA_SECTORs: ; A - Disk ; HL:IX - Sector ; B - Sector counter -;Return: None +;Return: CF - error ;VERIFY SECTOR(S) ATA_5x_VERIFY: PUSH IY SAFE_PORTY_2 @@ -543,105 +549,119 @@ ATA_5x_VERIFY: PUSH IY CALL WAITPRT EXX RET C - PUSH DE + ;PUSH DE + ; IN A,(SLOT3) + ; PUSH AF CALL PRESET - POP HL + ; POP AF + ; OUT (SLOT3),A + ;POP HL LD BC,IDE.Write.Command LD A,IDE.CMD.ATA.ReadVerifySectorsWithRetry OUT (C),A LD BC,IDE.Read.Status IN A,(C) - ;BIT IDE.CtrlBit.Error,A RRA ;BIT IDE.CtrlBit.Error,A : SCF : RET NZ RET C ; - CALL WAITPRT - RET C - XOR A - RET + JP WAITPRT + ;RET C + ;XOR A + ;RET ;[]================================================================[#54] ; HL:IX - LBA SECTOR ; B - SECTOR COUNTER -PRESET: LD A,B - LD BC,IDE.Write.Counter - OUT (C),A - ; - IN A,(SLOT3) - EX AF,AF' - LD A,SYS_PAGE - OUT (SLOT3),A - LD A,(IY+IDE.HDD_INIT_TABLE.DRV_Flags) - LD BC,IDE.Write.DeviceHead - OUT (C),A - ;бит CHS/LBA ;!FIXIT сделать метками номера бит - AND %0100'0000 - LD E,XL - LD D,XH - CALL Z,LBA_CHS - LD BC,IDE.Write.Sector - OUT (C),E ;LBA 0..7 - ; - INC C ; LD BC,IDE.Write.CylinderLow - OUT (C),D ;LBA 8..15 - INC C ; LD BC,IDE.Write.CylinderHigh - OUT (C),L ;LBA 16..23 - LD BC,IDE.Read.Control - IN A,(C) - AND #F0 ;!HARDCODE DRIVE/HEAD REGISTER PHISICAL DISK bitmask - OR H ;LBA 24..27 - INC B ; LD BC,IDE.Write.DeviceHead - ; - OUT (C),A - EX AF,AF' - OUT (SLOT3),A - AND A - RET +; выход: SLOT3 = SYS_PAGE +PRESET: LD A,B + LD BC,IDE.Write.Counter + OUT (C),A + ; + IN A,(SLOT3) + EX AF,AF' + LD A,SYS_PAGE + OUT (SLOT3),A + LD A,(IY+IDE.HDD_INIT_TABLE.DRV_Flags) + LD BC,IDE.Write.DeviceHead + OUT (C),A + ;бит CHS/LBA ;!FIXIT сделать метками номера бит + AND %0100'0000 + LD E,XL + LD D,XH + CALL Z,LBA_CHS + LD BC,IDE.Write.Sector + OUT (C),E ;LBA 0..7 + ; + INC C ; LD BC,IDE.Write.CylinderLow + OUT (C),D ;LBA 8..15 + INC C ; LD BC,IDE.Write.CylinderHigh + OUT (C),L ;LBA 16..23 + LD BC,IDE.Read.Control + IN A,(C) + AND #F0 ;!HARDCODE DRIVE/HEAD REGISTER PHISICAL DISK bitmask + OR H ;LBA 24..27 + INC B ; LD BC,IDE.Write.DeviceHead + ; + OUT (C),A + EX AF,AF' + OUT (SLOT3),A + ;AND A + RET +;PRESET ; + ; HL:DE - SECTOR OFFSET -LBA_CHS: - LD C,(IY+IDE.HDD_INIT_TABLE.SectorsPerCylinderLow) - LD B,(IY+IDE.HDD_INIT_TABLE.SectorsPerCylinderHigh) -; HL:DE / BC => DE:IX HL-OSTATOK -DIV32X: LD XH,D - LD XL,E - EX DE,HL - LD HL,0 - LD A,#20 -DIV011: ADD IX,IX - EX DE,HL - ADC HL,HL - EX DE,HL - ADC HL,HL - SBC HL,BC - JR NC,DIV012 - ADD HL,BC - DEC A - JR NZ,DIV011 - JR DIV014 -DIV012: INC IX - DEC A - JR NZ,DIV011 -DIV014: LD E,(IY+IDE.HDD_INIT_TABLE.SectorsPerTrack) - LD D,0 - XOR A -CHS005: INC A - SBC HL,DE - JR NC,CHS005 - ADD HL,DE - DEC A - LD H,A - LD E,L - INC E - LD D,XL - LD A,XH - LD L,A - RET +LBA_CHS: LD C,(IY+IDE.HDD_INIT_TABLE.SectorsPerCylinderLow) + LD B,(IY+IDE.HDD_INIT_TABLE.SectorsPerCylinderHigh) + ; +DIV32X: ;HL:DE / BC => DE:IX HL-OSTATOK + LD XH,D + LD XL,E + EX DE,HL + LD HL,0 + LD A,#20 + ; +.loop: ADD IX,IX + EX DE,HL + ADC HL,HL + EX DE,HL + ADC HL,HL + SBC HL,BC + JR NC,.DIV012 + ; + ADD HL,BC + DEC A + JR NZ,.loop + ; + JR .DIV014 + ; +.DIV012: INC IX + DEC A + JR NZ,.loop + ; +.DIV014: LD E,(IY+IDE.HDD_INIT_TABLE.SectorsPerTrack) + LD D,0 + XOR A + ; +.loop2: INC A + SBC HL,DE + JR NC,.loop2 + ; + ADD HL,DE + DEC A + LD H,A + LD E,L + INC E + LD D,XL + LD A,XH + LD L,A + RET ;----------------------------------------------------------------------; ; D - MASK ; E - PATTERN +; !!! некоторые функции надеются, что на выходе всегда ZF WAITPRT: LD DE,256*(IDE.CtrlByte.Busy+IDE.CtrlByte.Ready+IDE.CtrlByte.Error)+IDE.CtrlByte.Ready .custom: LD BC,IDE.Read.Status LD HL,#0000 ; задержка ;!HARDCODE @@ -663,7 +683,8 @@ WAITPRT: LD DE,256*(IDE.CtrlByte.Busy+IDE.CtrlByte.Ready+IDE.CtrlByte.Error)+IDE ; .error: LD A,BIOS.Error.NotReady SCF - RET + RET + ; .ok: POP HL RET ;----------------------------------------------------------------------; diff --git a/src/bios/exp/EXTENDED/IDE/shared.asm b/src/bios/exp/EXTENDED/IDE/shared.asm index f83e1f6..d4dbc7e 100644 --- a/src/bios/exp/EXTENDED/IDE/shared.asm +++ b/src/bios/exp/EXTENDED/IDE/shared.asm @@ -68,6 +68,23 @@ SELECT_DRIVE: AND #0F ;======================================================================= +;======================================================================= +; next page in mem block +CHANGE_MEM_BLK: LD HL,#C000 + IN A,(SLOT3) + EX AF,AF' ;>-----------> \ + LD A,SYS_PAGE + OUT (SLOT3),A + LD D,high SYS_PAGE.RAM_TABLE + LD E,XH + LD A,(DE) + LD XH,A + EX AF,AF' ;<-----------< / + OUT (SLOT3),A + RET +;======================================================================= + + ;======================================================================= ;Function: Detect Disk ; A - Disk diff --git a/src/bios/exp/FUNC_LOW_PRINT.ASM b/src/bios/exp/FUNC_LOW_PRINT.ASM index fbfba05..5b72936 100644 --- a/src/bios/exp/FUNC_LOW_PRINT.ASM +++ b/src/bios/exp/FUNC_LOW_PRINT.ASM @@ -1659,28 +1659,27 @@ LP_PR_LINE_DIR: ; CF - XY-mode ; DE - место символа в окне, если CF=1 ; HL - адрес с выводимой строкой -; B - разделитель +; B - цвет консоли (используется при скролле и очистке окна) ; IY - два спец.символа для выхода с CF=1. Должны быть равны B, если не нужны -; A' - цвет консоли (используется при скролле и очистке окна) ; CF' - выводить символ с атрибутами ;;;;;;;;;;;;;;;;; .START: PUSH IX LD XL,A ; атрибуты выводимого символа ; EX AF,AF' - PUSH AF ; цвет консоли, attr-mode + PUSH AF ; attr-mode EX AF,AF' ; IN A,(SLOT3) LD C,A CALL LP_BEG_P CALL C,LP_SET_CUR ; mode for DE - POP AF ; цвет консоли, attr-mode + POP AF ; attr-mode + LD A,B + ; далее рег B свободен, можно задействовать LD (SYS_PAGE.SYS_WORK2),A ; цвет консоли EXX - LD C,0 - JR NC,.loop - INC C ; C' - attr flag. выводить атрибут + RL C ; C' - attr-mode. выводить атрибут .loop: LD A,D OUT (PORT_Y),A EXX @@ -1690,7 +1689,7 @@ LP_PR_LINE_DIR: LD A,(HL) LD XH,A INC HL - CP B + AND A JR Z,.EXIT CP YH JR Z,.EXIT_SpecSymbol diff --git a/src/bios/shared/DEFINES.INC b/src/bios/shared/DEFINES.INC index d619abc..2d4d0a2 100644 --- a/src/bios/shared/DEFINES.INC +++ b/src/bios/shared/DEFINES.INC @@ -17,6 +17,7 @@ BETA_RC EQU 0 ; DEFINE LOGO_DELAY_NORM 100 ; DEFINE LOGO_DELAY_MAX 130 ; ;----------------------------[ TEST ]---------------------------; + DEFINE ERROR_POST_5 0 ; виснуть на ошибке в POST 5 DEFINE TEST_INT 1 ; Тестовый обработчик пользовательского INT DEFINE NEW_FEATURE 0 ; !TODO пункты в сетап ;DEFINE HDDwriteProtect 0 ; старая фишка для функций 5x diff --git a/src/bios/shared/RECOVERY.IMG b/src/bios/shared/RECOVERY.IMG index b01f68c..aaec286 100755 Binary files a/src/bios/shared/RECOVERY.IMG and b/src/bios/shared/RECOVERY.IMG differ