From 2a4e06db9638f286306f38279da7480c9ac0dbe6 Mon Sep 17 00:00:00 2001 From: Tolik <85737314+Tolik-Trek@users.noreply.github.com> Date: Mon, 26 Jan 2026 21:15:40 +1000 Subject: [PATCH] =?UTF-8?q?FDD=20driver=205x=20=D1=80=D0=B0=D0=B1=D0=BE?= =?UTF-8?q?=D1=82=D0=B0=D0=B5=D1=82=20=D1=81=20=D1=80=D0=B0=D0=B7=D0=BD?= =?UTF-8?q?=D1=8B=D0=BC=D0=B8=20=D0=B1=D1=83=D1=84=D0=B5=D1=80=D0=B0=D0=BC?= =?UTF-8?q?=D0=B8=20=D0=B4=D0=BB=D1=8F=20=D0=BA=D0=B0=D0=B6=D0=B4=D0=BE?= =?UTF-8?q?=D0=B3=D0=BE=20=D0=B8=D0=B7=20FDD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Shared_Includes | 2 +- src/bios/exp/EXTENDED/FDD_DRIVER.asm | 166 +++++++++++++++------------ src/bios/rom/SETUP/MAIN.asm | 18 +-- src/bios/shared/RECOVERY.IMG | Bin 98304 -> 98304 bytes 4 files changed, 103 insertions(+), 83 deletions(-) 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 d78660a4a6fbafe29f583b75d9490a0b77191302..4fc44706b675e6c55347de65218ac32b4ddd30e3 100644 GIT binary patch delta 1585 zcmY*Ze@qj16u(!Xz2kb{_P`+M+}dmA&MFCMRIr0{0W;KQ5Jim+40G8=Ow3pom$9G} z7MF!=i<1I3W}G!f8*r|47;*nB?Fh-P%?U`DV@=(PmMoH6W*EsLE8RO#mbLwS-{<|z zd*AO%+uM!p?Z&|odV`OmK6;J*xSj6w)1QRt&wiuNQp`CU)BR^AV;SloHt5Q|N&il} z8!QxE>H9vnFh^I;48?N?Z-X@S>Gaz0}$j-|@LJySIicOxsdMq#ZSmw~j~dE0LsR zC{;q17FS3w!iRaVUOPOJeP;=;XQm!$=i+j>3a&QdYC=cl})?#C_bD~YOUN3eF>EJS*gMovy z7Ohgume^8d0mBbtcv*33>eMTCirU4%Ru-n`-aP(j*0PYA!oZ1S*~}wy zWK0Q`D>%?Lh7&h(qJt9!PPB943!GTSiEFs%F@}r&gVU@buCi`hX3(+Q{M~dLo%f;&iFh6umGn z0UFh6cGd1&iFfysz;cX$dR-U6Q1$eG*`rgbMC!DwpPX_H5RZ}4sxFbey0}cH-TkE2 zNVx|HULI2+Z)Ct)XyQX;UK|Wi0Vmv$e_>#!_bhSkW@FwT z)|iDJR;&Ahjdv!R;xmb6>418J)jU^-zyJL$ZJH;5q_B7CLtA#NJhmZW50RBgw5sbw zt2)W<)~c=%Y|z!r;(S_Fkmyaeo@*>wtL4Bq z^pl=u;ktf1!mHTOQ8pEyX^M9?-ftvC(vx}6Ow0e9J z^qeO`4!WEdWyTEUa8`cV3}T(Y;*5NTQa7_fMWhG*a^0R!S$ntJjH(SJkl7I+wXSO8aDQ1dSZ C0(mz8 delta 1757 zcmbVLeM}Q)7{9kbd)MRM_P`*BgnrDWHj-fH_!5pyj2b)b05LjnXfj7k*cy>(m5)~E zKpd-KmE9i;#$+>O&a5mX)@6yYGLl`J6IesAYi=93l0|k#f-H*+y60fB%s?d z9T9)kcUzm8q6qH~#i&ZC7GiOA>V*nL*U>ln(dN_*@4v~bvRDf#J_&g2DbaNCFib7#e z03@ZH;D@hdBnbGa(XiM-1#t~Tt+1+9wttmX14H)+wv8QjjgO24EOdHWcF>iUo<6jR z3MO;Jb;ZBr1nytDw z?f9T<_uxuI5dHt+H}N*d02~e@>x1^d|oUg{-KD zU!+jEyAj(q&|&x8S=!V@%hm7Eu`a10HYGW^ePRzS+t1;vU!2<1F5Axo$^2yLoFO?} z8qSf7UcAz$TyYW06_xZZx#9wb3T>~^(7jyIjg=}}dg}An%G>K#XX2Bn9K(WR#omr< zVJ`U@+xNhzfSDje2kv#6E-JG#6+%HJbUZfI5bJV2;OZh%Eo4lvmDAIRCGJ>~*jIvC z(mv_XjBM}5(h*X&U%-@XzlbAUq+ETK&!AB;8suN6(E;}fEDkVo^>JJ%EZ^{PoI!+J z3>jH)zcbd87~XQe8FmndPBJY}GH5_3BIQ~baaF$B+N>C@PIyjDE5YemCMN`+QG!Qd z14(!m>BL1ExfbpOEG}$H0h6_r-;|0E&*u2Aby)VDi$*WhXQxt?f&y*#bDsqRJ0!X9+RXmZr>cp(4&Vr zJXL^t`QCg~!!rz;Q;gY1PaB$@hNhz@h$BtSjFwpW+z8*Vxy~nEMxU+8yk>lG1?@l+ uKYsclFkClb%;awtpj>}+ynNhU#Qnd>z}?M=+xs^wYpSpS