diff --git a/Shared_Includes b/Shared_Includes index a9f5915..bd4546a 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit a9f5915a3275f5ffbafa0994bb97c5846aab826c +Subproject commit bd4546a854905998edab6144547b79aa673404f6 diff --git a/src/bios/exp/EXTENDED/FDD_DRIVER_2.asm b/src/bios/exp/EXTENDED/FDD_DRIVER_2.asm index 1ba2e7c..3a2f58f 100644 --- a/src/bios/exp/EXTENDED/FDD_DRIVER_2.asm +++ b/src/bios/exp/EXTENDED/FDD_DRIVER_2.asm @@ -109,7 +109,7 @@ FDD_5x_SET_PAR: ;!TEST FDD 720/1440 ENDIF ; EX AF,AF' - OUT (SLOT3),A + OUT (SLOT3),A EX AF,AF' ; ;!TEST FDD 720/1440 @@ -127,6 +127,7 @@ FDD_5x_SET_PAR: ;!TEST FDD 720/1440 ; A - Disk ;Return: ; A - Flag D7 - "1" - High Density, "0" - Double Density +; B - bit0=1 removable ;[]===========================================================[] FDD_5x_DETECT: CALL SAVE_INTERRUPTS.switch_off CALL SET_DOS_ON @@ -147,7 +148,19 @@ FDD_5x_RESET: CALL SAVE_INTERRUPTS.switch_off CALL SET_DOS_ON CALL S_FDD CALL DISK_ID - CALL SAVE_INTERRUPTS.restore + JR C,.int + ; [ ] размера сектора + IN A,(SLOT3) + EX AF,AF' + LD A,SYS_PAGE + OUT (SLOT3),A + LD H,B + LD L,0 + LD (FDD_INIT_TABLE.FDD_0.BytesPerSector),HL + EX AF,AF' + OUT (SLOT3),A + ; +.int: CALL SAVE_INTERRUPTS.restore JR C,.MOTOR_OFF ; CALL RESWG @@ -240,8 +253,7 @@ FDD_5x_LONG_READ: PUSH DE PUSH BC PUSH HL - ;CALL READ_SECTOR - CALL FDD_RW_SECTOR + CALL FDD_RW_SECTOR JR C,ERRDOS ; размер сектора LD D,YH @@ -252,22 +264,7 @@ FDD_5x_LONG_READ: ADD HL,DE ; 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 @@ -366,205 +363,12 @@ FDD_5x_LONG_WRITE: LD B,#A0 ;COMMAND WRITE EXX JP FDD_5x_LONG_READ.RW_Shared - -/* - CALL SAVE_INTERRUPTS.switch_off - CALL .Start - JP SAVE_INTERRUPTS.restore - ; -.Start: PUSH IY - PUSH BC - PUSH HL - PUSH IX - ; - EX AF,AF' - LD C,A - EX AF,AF' - PUSH BC - CALL SET_DOS_ON - CALL S_FDD - CALL SET_SPEED - CALL NTRACK - POP BC - EX DE,HL - 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 A,(FDD_INIT_TABLE.FDD_0.SECTORS) - LD C,A - EX AF,AF' - OUT (SLOT3),A -.DSK_LP2: LD A,D - EXX - PUSH BC - CALL SEEK - POP BC - EXX - PUSH DE - PUSH BC - PUSH HL - CALL WR_SEC - JR C,ERRDOS - ; размер сектора - LD D,YH - LD E,YL - ; - POP HL - POP BC - ADD HL,DE - ; - 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 - CP E - JR NZ,.NINC_T2 - LD E,0 - INC D -.NINC_T2: DJNZ .DSK_LP2 - CALL SET_DOS_OFF - LD A,XH - EX AF,AF' - EX DE,HL - POP IX - POP HL - POP BC - POP IY - LD A,B - LD C,B - INC B - DEC B - LD B,0 - JR NZ,.ADW8BIT - INC B -.ADW8BIT: ADD IX,BC - ;!TEST - ;LD BC,0 - ;ADC HL,BC - ;LD B,A - ;XOR A - ;RET - ; - LD B,A - RET NC - INC HL - XOR A - RET - ; -*/ - -/* -; -;------------------------------- -;READ SECTOR -;------------------------------- -READ_SECTOR: LD D,5 ;RETRY COUNT -.HL_RETRY: ;DI - PUSH HL - PUSH DE - LD A,E - INC A - OUT (FDC_93.Sector),A -.FDREAD: IN A,(SLOT3) - EX AF,AF' - LD A,XH - OUT (SLOT3),A - ; - LD B,4 ; счётчик - LD C,FDC_93.Data - LD A,#80 ; COMMAND READ - OUT (FDC_93.Command),A - ; -.FDR001: IN A,(FDC_93.DrvCTRL) ;WAIT INTRQ or DRQ - 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" - ; -.FDR005: EX AF,AF' - 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 - AND #7F - RET Z ; Выход без ошибок - ; - BIT 2,C - JR NZ,.ERDATA - ; - LD A,BIOS.Error.Seek -.ERR_XRD: DEC D - JR Z,.RSTOP - ; - PUSH DE - PUSH HL - CALL RESWG ; RESET_WG - LD A,XL - CALL SEEK ; !!!!! посмотреть - POP HL - POP DE - JR .HL_RETRY - ; -.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 - EX AF,AF' - BIT 0,C - SCF - RET Z - LD A,BIOS.Error.SectorNotFound - RET -; ; ; -*/ - ; ;------------------------------- ;WRITE SECTOR ;------------------------------- FDD_RW_SECTOR: LD D,5 ;RETRY COUNT -.RETRY: DI +.RETRY: ;DI PUSH HL PUSH DE LD A,E @@ -596,9 +400,19 @@ FDD_RW_SECTOR: LD D,5 ;RETRY COUNT .RW_PROC: EXX BIT 5,B EXX + ; [ ] 15/04/25 размер сектора больше, чем установлено в FDD_INIT_TABLE.FDD_0.BytesPerSector вызовет ошибку + LD D,YH + LD E,YL + INC DE + ; JR NZ,.write_loop ;READ BYTE -.read_loop: INI +.read_loop: DEC DE + LD A,D + OR E + JR Z,.SectorSizeError + ; + INI .wait_data_r: IN A,(FDC_93.DrvCTRL) AND %1100'0000 ;b6: DRQ (запрос данных = 1). b7: INTRQ (выполняется команда = 0). JR Z,.wait_data_r @@ -610,12 +424,7 @@ FDD_RW_SECTOR: LD D,5 ;RETRY COUNT ; POP DE POP HL - ; прерывания - LD A,R - AND %1000'0000 - JR Z,.no_EI - EI -.no_EI: ; + ;EI LD A,BIOS.Error.NotReady JR C,.CMD_ERROR ; @@ -655,6 +464,7 @@ FDD_RW_SECTOR: LD D,5 ;RETRY COUNT 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 @@ -666,12 +476,29 @@ FDD_RW_SECTOR: LD D,5 ;RETRY COUNT RET ; ;WRITE BYTE -.write_loop: OUTI +.write_loop: DEC DE + LD A,D + OR E + JR Z,.SectorSizeError + ; + OUTI ; !FIXIT размер сектора может быть плавающим и прибить буфер .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 + ; +.SectorSizeError: + EX AF,AF' + OUT (SLOT3),A + EX AF,AF' + POP DE + POP HL + ;EI + ; A = 0 + LD C,A + LD A,BIOS.Error.UnknownDevice + JR .error_exit @@ -757,7 +584,9 @@ FDD.SET720: LD A,FDD_Density.SET_720 OUT (FDD_Density),A RET + ; прерывания должны быть отключены +; выход: A - FDD_INIT_TABLE.F144, B - sector size high byte DISK_ID: EXX CALL SET_SPEED IN A,(FDC_93.Track) @@ -770,24 +599,7 @@ DISK_ID: EXX 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) - EX AF,AF' - OUT (SLOT3),A - EX AF,AF' - AND #80 - RET + JR NZ,.Read_Index ; .ID_LP4: DEC HL LD A,H @@ -799,7 +611,43 @@ DISK_ID: EXX EXX SCF RET -; + ; +.Read_Index: ; + ; Данные FDC_93.Data: + ; номер цилиндра BYTE + ; номер головки BYTE + ; номер сектора BYTE + ; длина сектора BYTE + ; контрольная сумма WORD + LD H,4 ; !HARDCODE счётчик до байта размера сектора +.ID_LP2: IN A,(FDC_93.Data) + DEC H + JR NZ,.ID_LP3 + LD L,A ; [ ] размера сектора (старший байт) +.ID_LP3: IN A,(FDC_93.DrvCTRL) + AND %1100'0000 + JR Z,.ID_LP3 + JP P,.ID_LP2 + LD A,L + EXX + LD B,A ; [ ] размера сектора (старший байт) + IN A,(SLOT3) + EX AF,AF' + LD A,SYS_PAGE + OUT (SLOT3),A + ;LD A,L + ;LD (FDD_INIT_TABLE.FDD_0.BytesPerSector + 1),A + LD A,(FDD_INIT_TABLE.FDD_0.F144) + EX AF,AF' + OUT (SLOT3),A + EX AF,AF' + AND #80 + RET + + + + + ; SEEK: LD XL,A diff --git a/src/bios/exp/FUNC_RAM_ROM_DRV.ASM b/src/bios/exp/FUNC_RAM_ROM_DRV.ASM index e719d51..52e7326 100644 --- a/src/bios/exp/FUNC_RAM_ROM_DRV.ASM +++ b/src/bios/exp/FUNC_RAM_ROM_DRV.ASM @@ -803,66 +803,59 @@ RAMD_CLEAR: ; ║ ** NOT USED TR-DOS VARS ** ║\ ; ╚════════════════════════════════════════════════╝\ ; \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ -BLK_RD_WR: - AND A +BLK_RD_WR: AND A SCF RET Z - ; + ; AND A INC B DEC B RET Z - ; - ; сохраняем состояние прерываний + ; сохраняем состояние прерываний LD C,A LD A,R PUSH AF - ; сохраняем PORT_Y + ; сохраняем PORT_Y IN A,(PORT_Y) PUSH AF LD A,#C0 OUT (PORT_Y),A - ; + ; LD A,C DI CALL .start EX AF,AF' - ; восстанавливаем PORT_Y + ; восстанавливаем PORT_Y POP AF OUT (PORT_Y),A - ; восстанавливаем состояние прерываний + ; восстанавливаем состояние прерываний POP AF JP PO,.noInterrupts EI -.noInterrupts: - EX AF,AF' +.noInterrupts: EX AF,AF' RET - ; - +; ; .start: EX AF,AF' - AND A ; 0 - read + AND A ; 0 - read JR Z,.reset_Z - CP #FF ; write + CP #FF ; write JR Z,.keep_Z - - CP 5 ; old read + ; + CP 5 ; old read JR Z,.reset_Z - CP 6 ; old write + CP 6 ; old write JR Z,.keep_Z - + ; CP #46 JP Z,ROM_DISK - + ; EX AF,AF' SCF RET - -.reset_Z: - INC A ; set Z for WRITE -.keep_Z: - EX AF,AF' - ; - + ; +.reset_Z: INC A ; set Z for WRITE +.keep_Z: EX AF,AF' + ; PUSH HL PUSH BC LD C,SLOT1 @@ -871,89 +864,73 @@ BLK_RD_WR: LD A,SYS_PAGE OUT (SLOT1),A LD A,H - + ; LD H,high +(SYS_PAGE.RAM_TABLE-#4000-#4000) LD L,A - INC D -.RAMD_LOOP_D: - DEC D +.RAMD_LOOP_D: DEC D JR Z,.NOT_FOUR_BLK LD L,(HL) LD L,(HL) LD L,(HL) LD L,(HL) JP .RAMD_LOOP_D - -.NOT_FOUR_BLK: - LD A,E + ; +.NOT_FOUR_BLK: LD A,E .loop: SUB #40 JR C,.NOT_ONE_BLK LD L,(HL) JP .loop - -.NOT_ONE_BLK: - AND #3F + ; +.NOT_ONE_BLK: AND #3F LD D,A ; DE - ADRESS in RAM-Disk LD E,0 - LD A,L ; L - текущий банк RAM-Disk - - OUT (C),B ; восстановить страницу - + OUT (C),B ; восстановить страницу POP BC ; длина данных POP HL ; адрес буфера - BIT 7,H JR NZ,.BLK_PAGE1 - + ; LD C,SLOT3 IN C,(C) OUT (SLOT3),A SET 7,D SET 6,D JP .BLK_CONT1 - -.BLK_PAGE1: - LD C,SLOT1 + ; +.BLK_PAGE1: LD C,SLOT1 IN C,(C) OUT (SLOT1),A RES 7,D SET 6,D - -.BLK_CONT1: ; DE - RamDisk, HL - data - EX AF,AF' + ; DE - RamDisk, HL - data +.BLK_CONT1: EX AF,AF' JR Z,.NO_EX_RW1 ; WRITE - EX DE,HL ; for READ -.NO_EX_RW1: - EX AF,AF' - + EX DE,HL ; for READ +.NO_EX_RW1: EX AF,AF' LD A,16 -.BLK_LL1: - DUP 16 - LDI - EDUP - + ; +.BLK_LL1: DUP 16 + LDI + EDUP DEC A JR NZ,.BLK_LL1 - + ; EX AF,AF' JR Z,.NO_EX_RW2 ; WRITE - EX DE,HL ; for READ -.NO_EX_RW2: - EX AF,AF' ; DEC C прокрутился 256 раз и вернулся - ; A = 0 - ;INC B ; B уже уменьшился на 1, - ;DEC B + EX DE,HL ; for READ +.NO_EX_RW2: EX AF,AF' ; DEC C прокрутился 256 раз и вернулся + ; A = 0 CP B JP Z,.BLK_EXIT_1 - + ; BIT 6,D JP NZ,.BLK_CONT1 - + ; BIT 7,D JR Z,.BLK_PAGE3_X - + ; IN A,(SLOT1) LD E,A LD D,high +(SYS_PAGE.RAM_TABLE-#4000-#4000) @@ -963,9 +940,8 @@ BLK_RD_WR: OUT (SLOT1),A LD DE,#4000 JP .BLK_CONT1 - -.BLK_PAGE3_X: - IN A,(SLOT3) + ; +.BLK_PAGE3_X: IN A,(SLOT3) LD E,A LD D,high SYS_PAGE.RAM_TABLE LD A,SYS_PAGE @@ -973,10 +949,10 @@ BLK_RD_WR: LD A,(DE) OUT (SLOT3),A LD DE,#C000 - + ; BIT 7,H JP Z,.BLK_CONT1 - + ; LD E,A LD A,C OUT (SLOT3),A @@ -986,17 +962,16 @@ BLK_RD_WR: OUT (SLOT1),A LD DE,#4000 JP .BLK_CONT1 - -.BLK_EXIT_1: - LD A,D + ; +.BLK_EXIT_1: LD A,D DEC A RLCA LD A,C JR C,.BLK_EXIT_2 OUT (SLOT1),A RET -.BLK_EXIT_2: - OUT (SLOT3),A + ; +.BLK_EXIT_2: OUT (SLOT3),A AND A RET ;----------------------------------------------------------------------;