diff --git a/Shared_Includes b/Shared_Includes index 2fec620..5a2e8b0 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 2fec6202f716cfa3ed48fb9bfd79d1081cc2721b +Subproject commit 5a2e8b02b384c515510798a2b94537211dfaa310 diff --git a/src/bios/exp/EXTENDED/FDD_DRIVER.asm b/src/bios/exp/EXTENDED/FDD_DRIVER.asm index 8cec773..80c90b8 100644 --- a/src/bios/exp/EXTENDED/FDD_DRIVER.asm +++ b/src/bios/exp/EXTENDED/FDD_DRIVER.asm @@ -30,16 +30,22 @@ ;[]===========================================================[] ;!FIXIT всегда идет работа с данными для диска А ;!FIXIT читать данные с нулевой дорожки? Придумать что делать с геометрией флопарей -FDD_5x_GET_PAR: IN A,(SLOT3) +FDD_5x_GET_PAR: CALL SELECT_FDD + RET C + ; + IN A,(SLOT3) EX AF,AF' LD A,SYS_PAGE OUT (SLOT3),A - ; - 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) - LD B,A + LD L,(IY + FDD_TABLE_s.SECTORS) + LD H,(IY + FDD_TABLE_s.HEADS) + LD E,(IY + FDD_TABLE_s.BytesPerSector) + LD D,(IY + FDD_TABLE_s.BytesPerSector + 1) + PUSH DE + POP IX + LD E,(IY + FDD_TABLE_s.CYLINDL) + LD D,(IY + FDD_TABLE_s.CYLINDH) + LD B,(IY + FDD_TABLE_s.DISK) EX AF,AF' OUT (SLOT3),A XOR A @@ -57,21 +63,24 @@ FDD_5x_GET_PAR: IN A,(SLOT3) ; D7 - "1" - High Density, "0" - Double Density ;Return: None ;[]===========================================================[] -FDD_5x_SET_PAR: ;!TEST FDD 720/1440 +FDD_5x_SET_PAR: CALL SELECT_FDD + RET C + ; IN A,(SLOT3) EX AF,AF' - LD A,SYS_PAGE - OUT (SLOT3),A - ; - LD A,B - LD (SYS_PAGE.FDD_TABLE.SECTORS),HL - LD (SYS_PAGE.FDD_TABLE.CYLINDL),DE - LD (SYS_PAGE.FDD_TABLE.BytesPerSector),IX - LD (SYS_PAGE.FDD_TABLE.DISK),A - ; - EX AF,AF' + LD A,SYS_PAGE OUT (SLOT3),A + LD (IY + FDD_TABLE_s.SECTORS),L + LD (IY + FDD_TABLE_s.HEADS),H + LD (IY + FDD_TABLE_s.CYLINDL),E + LD (IY + FDD_TABLE_s.CYLINDH),D + PUSH IX + POP DE + LD (IY + FDD_TABLE_s.BytesPerSector),E + LD (IY + FDD_TABLE_s.BytesPerSector + 1),D + LD (IY + FDD_TABLE_s.DISK),B EX AF,AF' + OUT (SLOT3),A AND A RET @@ -84,7 +93,8 @@ FDD_5x_SET_PAR: ;!TEST FDD 720/1440 ;[]===========================================================[] FDD_5x_DETECT: CALL SAVE_INTERRUPTS.switch_off CALL SET_DOS_ON - CALL DISK_ID + CALL SELECT_FDD + CALL NC,DISK_ID PUSH AF CALL SET_DOS_OFF POP AF @@ -99,17 +109,21 @@ FDD_5x_DETECT: CALL SAVE_INTERRUPTS.switch_off ;[]===========================================================[] FDD_5x_RESET: CALL SAVE_INTERRUPTS.switch_off CALL SET_DOS_ON - CALL SET_FDD - CALL DISK_ID + CALL SELECT_FDD + CALL NC,DISK_ID JR C,.int ; [ ] размера сектора IN A,(SLOT3) EX AF,AF' LD A,SYS_PAGE OUT (SLOT3),A - LD H,B - LD L,0 - LD (SYS_PAGE.FDD_TABLE.BytesPerSector),HL + XOR A + CP B + JR NZ,.SetSectorSize + ; + LD A,#80 +.SetSectorSize: LD (IY + FDD_TABLE_s.BytesPerSector),A + LD (IY + FDD_TABLE_s.BytesPerSector + 1),B EX AF,AF' OUT (SLOT3),A ; @@ -133,12 +147,12 @@ FDD_5x_RESET: CALL SAVE_INTERRUPTS.switch_off OUT (FDC_93.DrvCTRL),A LD A,#3C OUT (FDC_93.DrvCTRL),A - CALL SET_DOS_OFF + JP SET_DOS_OFF ; CF=1 - LD A,BIOS.Error.NotReady + ;LD A,BIOS.Error.NotReady ;POP AF ;JP SAVE_INTERRUPTS.restore - RET + ;RET ;[]===========================================================[] ;Function: Read Sectors ; A - Disk @@ -172,18 +186,20 @@ FDD_5x_LONG_READ: CALL .Start JP SAVE_INTERRUPTS.restore ; -.Start: PUSH IY - PUSH BC - PUSH HL - PUSH IX - ; +.Start: ;PUSH IY EX AF,AF' LD C,A ; Memory Page Number EX AF,AF' - PUSH BC CALL SET_DOS_ON - CALL SET_FDD + CALL SELECT_FDD + CALL C,SET_DOS_OFF + RET C + ; + PUSH BC + PUSH HL + PUSH IX CALL SET_SPEED + PUSH BC CALL NTRACK POP BC EX DE,HL @@ -192,8 +208,7 @@ FDD_5x_LONG_READ: LD A,SYS_PAGE OUT (SLOT3),A LD XH,C ; Memory Page Number - LD A,(SYS_PAGE.FDD_TABLE.SECTORS) - LD C,A + LD C,(IY + FDD_TABLE_s.SECTORS) EX AF,AF' OUT (SLOT3),A ; @@ -241,7 +256,7 @@ FDD_5x_LONG_READ: POP IX POP HL POP BC - POP IY + ;POP IY LD A,B LD C,B INC B @@ -277,7 +292,7 @@ FDD_5x_LONG_READ: POP IX POP HL POP BC - POP IY + ;POP IY PUSH AF LD C,A LD A,B @@ -510,24 +525,29 @@ SET_DOS_OFF: EX AF,AF' ; RET //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// -SET_FDD: PUSH BC - AND 1 - LD B,A +SELECT_FDD: PUSH BC + OR A + LD IY,SYS_PAGE.FDD_TABLE.A + JR Z,.IY_Selected + ; + LD IY,SYS_PAGE.FDD_TABLE.B +.IY_Selected: ;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 + LD B,(IY + FDD_TABLE_s.ID) EX AF,AF' OUT (SLOT3),A + INC B POP BC - RET + RET NZ + ; no drive + LD A,BIOS.Error.BadNumber + SCF + RET //////////////////////////////////////////////////////////////////////// @@ -563,20 +583,22 @@ SET_FDD: PUSH BC ; FDD.SET720: LD A,FDD_Density.SET_720 ; OUT (FDD_Density),A ; RET +; +; Вход: IY - Указатель на таблицу выбранного FDD CHANGE_SPEED: IN A,(SLOT3) EX AF,AF' LD A,SYS_PAGE OUT (SLOT3),A - LD A,(SYS_PAGE.FDD_TABLE.DISK) + LD A,(IY + FDD_TABLE_s.DISK) XOR #80 - LD (SYS_PAGE.FDD_TABLE.DISK),A + LD (IY + FDD_TABLE_s.DISK),A 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) + LD A,(IY + FDD_TABLE_s.DISK) .set: AND #80 RRA RRA @@ -591,6 +613,7 @@ SET_SPEED: IN A,(SLOT3) //////////////////////////////////////////////////////////////////////// ; Вход: BC - внутренний и внешний счётчики +; IY - Указатель на таблицу выбранного FDD WAIT_FDD_FOR_SEARCH_TRACK: LD A,#C0 ;!HARDCODE CMD КР1818ВГ93 OUT (FDC_93.Command),A @@ -624,7 +647,8 @@ WAIT_FDD_FOR_SEARCH_TRACK: //////////////////////////////////////////////////////////////////////// ; прерывания должны быть отключены -; выход: A - FDD_INIT_TABLE.DISK, B - sector size high byte +; Вход: IY - Указатель на таблицу выбранного FDD +; Выход: A - bit7 - 720/1440, B - sector size high byte DISK_ID: EXX CALL SET_SPEED IN A,(FDC_93.Track) @@ -640,7 +664,8 @@ DISK_ID: EXX CALL WAIT_FDD_FOR_SEARCH_TRACK JR NC,.Read_Index EXX - ;SCF + ;SCF + LD A,BIOS.Error.NotReady RET ; .Read_Index: ; @@ -666,7 +691,7 @@ DISK_ID: EXX EX AF,AF' LD A,SYS_PAGE OUT (SLOT3),A - LD A,(SYS_PAGE.FDD_TABLE.DISK) + LD A,(IY + FDD_TABLE_s.DISK) EX AF,AF' OUT (SLOT3),A EX AF,AF' @@ -681,7 +706,7 @@ SEEK: LD XL,A EX AF,AF' LD A,SYS_PAGE OUT (SLOT3),A - LD A,(SYS_PAGE.FDD_TABLE.DISK) + LD A,(IY + FDD_TABLE_s.DISK) AND 1 EX AF,AF' OUT (SLOT3),A @@ -709,27 +734,22 @@ SEEK: LD XL,A RET Z .STOL: CALL P50ms RET + ; +P50ms: PUSH BC + LD B,12 +.P1ms: LD C,255 +.PMS: DEC C + JR NZ,.PMS + DJNZ .P1ms + POP BC + RET +; ; ;P750ms LD B,3 ;PMS2 LD A,255 ; CALL P1ms ; DJNZ PMS2 ; RET -P50ms: PUSH BC - ;LD A,12 - LD B,12 -.P1ms: LD C,255 -.PMS: DEC C - JR NZ,.PMS - ; - ;DEC A - ;JR NZ,.P1ms - DJNZ .P1ms - ; - POP BC - RET -; - //////////////////////////////////////////////////////////////////////// ;RESWG: LD A,8 @@ -753,12 +773,10 @@ EXECOM: OUT (FDC_93.Command),A LD HL,#0000 ; счётчик PUSH BC LD B,3 ; счётчик - ; .WREST: DEC HL LD A,H OR L JR NZ,.get_state - ; DJNZ .WREST ; POP BC @@ -784,8 +802,7 @@ NTRACK: PUSH HL EX AF,AF' LD A,SYS_PAGE OUT (SLOT3),A - LD A,(SYS_PAGE.FDD_TABLE.SECTORS) - LD C,A + LD C,(IY + FDD_TABLE_s.SECTORS) LD B,0 EX AF,AF' OUT (SLOT3),A @@ -793,13 +810,16 @@ NTRACK: PUSH HL .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 diff --git a/src/bios/rom/SETUP/MAIN.asm b/src/bios/rom/SETUP/MAIN.asm index 13e39a1..e968e88 100644 --- a/src/bios/rom/SETUP/MAIN.asm +++ b/src/bios/rom/SETUP/MAIN.asm @@ -1210,25 +1210,25 @@ FDD_INIT_TABLE_35: FDD_TABLE_s { #50, ;.CYLINDL #00, ;.CYLINDH #0200, ;.BytesPerSector - #03 ;.ID + #01 ;.ID 3.5" } ; FDD_INIT_TABLE_525: FDD_TABLE_s { - #00 ;.DISK + #01 ;.DISK #09 ;.SECTORS #02 ;.HEADS #50 ;.CYLINDL #00 ;.CYLINDH #0200 ;.BytesPerSector - #03 ;.ID + #02 ;.ID 5.25" } FDD_INSTAL: IN A,(SLOT3) EX AF,AF' LD A,SYS_PAGE OUT (SLOT3),A - LD HL,SYS_PAGE.FDD_TABLE - LD BC,2*(SYS_PAGE.FDD_TABLE.Size*256) + #FF ; table_size*256 + fill_byte + LD HL,SYS_PAGE.FDD_TABLE.A + LD BC,+(2*FDD_TABLE_s)*256 + #FF ; table_size*256 + fill_byte .FILLFDD: LD (HL),C INC HL DJNZ .FILLFDD @@ -1238,15 +1238,15 @@ FDD_INSTAL: IN A,(SLOT3) CALL .Choose_FDD_Type JR NZ,.next_FDD ; - LD DE,SYS_PAGE.FDD_TABLE - LD BC,SYS_PAGE.FDD_TABLE.Size + LD DE,SYS_PAGE.FDD_TABLE.A + LD BC,SYS_PAGE.FDD_TABLE.A.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 + LD DE,SYS_PAGE.FDD_TABLE.B + LD BC,SYS_PAGE.FDD_TABLE.B.Size LDIR .NOFDD1: EX AF,AF' OUT (SLOT3),A diff --git a/src/bios/shared/RECOVERY.IMG b/src/bios/shared/RECOVERY.IMG index d78660a..4fc4470 100644 Binary files a/src/bios/shared/RECOVERY.IMG and b/src/bios/shared/RECOVERY.IMG differ