From 832cbf9460a30fbe86a978b9ffc24114a18ff65f Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Sat, 27 Jan 2024 04:11:34 +1000 Subject: [PATCH] =?UTF-8?q?+=20READ=5FPORTS,=20*=20FN=5FHDD=5FPART=20?= =?UTF-8?q?=D0=B8=20FN=5FHDD=5FINIT=20=D0=BF=D0=B5=D1=80=D0=B5=D0=B4=D0=B5?= =?UTF-8?q?=D0=BB=D0=B0=D0=BD=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Shared_Includes | 2 +- src/ZX_ROMS/new/SP_TRDOS.bin | Bin 16384 -> 16384 bytes src/bios/exp/BIOS_FUNC.asm | 6 +- src/bios/exp/DCP.ASM | 116 ++++---- src/bios/exp/EXTENDED/FDD_DRIVER_2.asm | 8 +- src/bios/exp/FUNC_4x.ASM | 352 +++++++++++++++++-------- src/bios/exp/FUNC_SYS.ASM | 16 +- 7 files changed, 320 insertions(+), 180 deletions(-) diff --git a/Shared_Includes b/Shared_Includes index e7e58e7..5cb5d02 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit e7e58e7b816a25137a0a253321164e863bbe782e +Subproject commit 5cb5d02cf145ff2d6d14fca5a5f9a5fb2ec6a673 diff --git a/src/ZX_ROMS/new/SP_TRDOS.bin b/src/ZX_ROMS/new/SP_TRDOS.bin index 738fc75b59e138990ff40d4d84ee79588c182680..d27c2b3831399ca98ff77a80e3f3c5841150d3e3 100644 GIT binary patch delta 441 zcmZo@U~Fh$+z`jXcxiGx$9l#KoB26y7#S~2_Tef73hm>+GnAJox*iEXY*(7-&~AuH@_E4=VHv;9Ip6}kMZc{FoQ}K#y68Mm|O&si%h>O z89Z~)(2)}Ur=amm>L0I$qSQYV1DSsY782JC#Krxkf!xWb&GJRwSRDCiadwu~+u$!T zR_9_)9({V2ce0aG68T;~6`;M4|-!{;UoS|~AgO*XOc7rSUKdP?2mY?sB=vomb1zQ&wQw!3)v^5mHo zGOS<=C-1V5W7}`>cCp0g$ppxkXJA~18at?RC z#3QRZ?XytAPT@M7v-vakZ!X5ao8OD2b1~L!4p;og$9Q#fm_a2AP+01piGlV%0}J(Q2IAuW(o+A73}k>@2_SbPm^*p5S-!|0 zizAGdXIELh4gL~ibuQ-Q(Whr+C)=5;vfeTOc;v?94D(Pfe{(Yi#ji0Yhy5oXH&>Jt zvatFeV{W&VE)P93l~d~Y(Ng%abe$to89Vh_zlPnlbson>+L>h z&%uEIAIl|UtFxzV&sthuI1FR~sk@2{41)FycK;L^jxe$^o_%0;))_1b7U5$73Vgo( zh{NvRQ3HmCCm7F@=YrRM#0Iy ZtiEq%v@vC5ygJ$3Hkk4D=5E_kCIGA^zRUms diff --git a/src/bios/exp/BIOS_FUNC.asm b/src/bios/exp/BIOS_FUNC.asm index cb4241c..654d9a1 100644 --- a/src/bios/exp/BIOS_FUNC.asm +++ b/src/bios/exp/BIOS_FUNC.asm @@ -235,8 +235,8 @@ TAB_FNS: DB low CMOS_RD ; #F6 DB low CMOS_WR ; #F7 DB low SET_PORTS ; #F8 - DB low READ_PORTS ; #F9 !TODO - DB low WRITE_PORTS ; #FA !TODO + DB low READ_PORTS ; #F9 [x] 26/01/2024 + DB low FN_RESERVED ; #FA [x] 26/01/2024 не работала и не нужна, дублирует SET_PORTS DB low GOTO_SPEC ; #FB Goto Spectrum! DB low FN_RESERVED ; #FC DB low REINIT ; #FD @@ -428,7 +428,7 @@ TAB_FNS: DB high CMOS_WR DB high SET_PORTS DB high READ_PORTS - DB high WRITE_PORTS + DB high FN_RESERVED DB high GOTO_SPEC DB high FN_RESERVED DB high REINIT diff --git a/src/bios/exp/DCP.ASM b/src/bios/exp/DCP.ASM index 29d609a..162b162 100644 --- a/src/bios/exp/DCP.ASM +++ b/src/bios/exp/DCP.ASM @@ -582,72 +582,94 @@ DCP_CONFIG: ;-----------------------------------------------------------------------; ; +;----------------------------------------------------------------------; +;[x] 26/01/2024 +READ_PORTS: + CALL SET_PORTS.Prepare + LD BC,0 + IN B,(C) + JR SET_PORTS.End + +;[x] 26/01/2024 +; WRITE_PORTS: +; SCF +; RET +;----------------------------------------------------------------------; + ; ;-----------------------------------------------------------------------; ;[x] Теперь это не нужно: CALL from 3D13h! Осторожнее с прерываниями, лучше гасить, чтоб не сбить сигнал DOS_ON ; in: A - внутренний порт, B - значение для записи во внутренний порт ; out: B - старое значение внутреннего порта; Перед выходом восстанавливается конфа прописанная в CONFIG_DE. SET_PORTS: - EX AF,AF' - ;[x] SET_PORTS: no need to call from #3D13 and DI. 31/12/23 - AND A - LD A,R - PUSH AF - DI - CALL DOS_ON - ; - LD A,CNF_PORT.CNF_0 + ROM.BIOS - OUT (SYS_PORT.ROM),A - ; - LD C,SLOT2 ; получить страницу - IN D,(C) - ; - LD A,DCP_PAGE ; установить новую - OUT (C),A - ; - LD A,(#8000) ; сохранить то что было - LD L,A - LD A,(#8200) - LD H,A - EX AF,AF' ; страница + CALL .Prepare ; - LD (#8000),A ; установить внутренний порт - LD (#8200),A + EX AF,AF' + LD A,B + LD BC,0 + EX AF,AF' ; - EX AF,AF' - LD A,B - LD BC,0 - EX AF,AF' + ; Чтение порта + IN A,(C) + ; Запись порта + EX AF,AF' + OUT (C),A ; установить новое значение порта + EX AF,AF' ; - IN A,(C) + LD B,A ; прошлое состояние порта ; - EX AF,AF' - OUT (C),A ; установить новое значение порта - EX AF,AF' +.End: LD A,DCP_PAGE ; установить DCP + LD C,SLOT2 + OUT (C),A + LD A,L + LD (#8000),A ; вернуть порт + LD A,H + LD (#8200),A ; вернуть порт ; - LD B,A - LD A,L - LD (#8000),A ; вернуть порт - LD A,H - LD (#8200),A ; вернуть порт - - LD C,SLOT2 - LD A,SYS_PAGE - OUT (C),A - LD A,(SYS_PAGE.CONFIG_DE-#4000) - OUT (C),D ; вернуть страницу - OUT (SYS_PORT.ROM),A + LD A,SYS_PAGE + OUT (C),A + LD A,(SYS_PAGE.CONFIG_DE-#4000) + OUT (C),D ; вернуть страницу + OUT (SYS_PORT.ROM),A ; CALL DOS_OFF ; ;[x] SET_PORTS: no need to call from #3D13 and DI. 31/12/23 - POP AF - RET PO + BIT 2,E + RET Z EI RET - ; ;AND A ;RET ; +.Prepare: + EX AF,AF' + ;[x] SET_PORTS: no need to call from #3D13 and DI. 31/12/23 + AND A + LD A,R + PUSH AF + POP DE + DI + CALL DOS_ON + ; + LD A,CNF_PORT.CNF_0 + ROM.BIOS + OUT (SYS_PORT.ROM),A + ; + LD C,SLOT2 ; получить страницу + IN D,(C) + ; + LD A,DCP_PAGE ; установить новую + OUT (C),A + ; + LD A,(#8000) ; сохранить то что было + LD L,A + LD A,(#8200) + LD H,A + EX AF,AF' ; страница + ; + LD (#8000),A ; установить внутренний порт + LD (#8200),A + OUT (C),D ; вернуть страницу + RET ;-----------------------------------------------------------------------; ; \ No newline at end of file diff --git a/src/bios/exp/EXTENDED/FDD_DRIVER_2.asm b/src/bios/exp/EXTENDED/FDD_DRIVER_2.asm index d4dd0f4..0142280 100644 --- a/src/bios/exp/EXTENDED/FDD_DRIVER_2.asm +++ b/src/bios/exp/EXTENDED/FDD_DRIVER_2.asm @@ -596,15 +596,15 @@ SET_DOS_OFF: ; FDD.SET720: - LD A,#01 ;!HARDCODE - OUT (#BD),A ;!HARDCODE + LD A,FDD_Density.SET_720 + OUT (FDD_Density),A RET ; ; FDD.SET1440: - LD A,#21 ;!HARDCODE - OUT (#BD),A ;!HARDCODE + LD A,FDD_Density.SET_1440 + OUT (FDD_Density),A RET ; diff --git a/src/bios/exp/FUNC_4x.ASM b/src/bios/exp/FUNC_4x.ASM index 5ff86af..6163ae0 100644 --- a/src/bios/exp/FUNC_4x.ASM +++ b/src/bios/exp/FUNC_4x.ASM @@ -7,32 +7,89 @@ ENDM ;______________________________________________________________________: ; -;-- + +; GET_BPB_OFFSET: +; ;LD A,SYS_PAGE +; ;LD HL,MS_BPB +; PUSH AF +; PUSH HL +; LD B,1 +; LD IX,#0000 +; LD DE,#0000 +; CALL FN_HDD_READ +; POP IX +; POP AF +; PUSH AF +; PUSH IX +; LD DE,#01BE ;!HARDCODE смещение от начала сектора для таблицы разделов +; ADD IX,DE +; ; +; EX AF,AF' +; IN A,(SLOT3) +; EX AF,AF' +; OUT (SLOT3),A +; ; +; LD E,(IX+8) ; первый сектор (LBA) начала раздела (DWORD) +; LD D,(IX+9) +; LD L,(IX+10) +; LD H,(IX+11) +; ; +; EX AF,AF' +; OUT (SLOT3),A +; EX AF,AF' +; ; +; PUSH HL +; POP IX +; POP HL +; POP AF +; RET HD_BPB_PREP: - LD D,A - IN A,(SLOT3) - EX AF,AF' - LD A,SYS_PAGE - OUT (SLOT3),A - LD A,(SYS_PAGE.HD_IDF_ADR.sectors) - LD E,A - EX AF,AF' - OUT (SLOT3),A - LD A,D - LD D,#00 - LD IX,#0000 - LD B,#01 + ; [ ] 27/01/2023 + ;LD D,A + ;IN A,(SLOT3) + ;EX AF,AF' + ; LD A,SYS_PAGE + ; OUT (SLOT3),A + ; LD A,(SYS_PAGE.HD_IDF_ADR.sectors) + ; LD E,A + ;EX AF,AF' + ;OUT (SLOT3),A + ;LD A,D + ;LD D,#00 + ;LD IX,#0000 + ;LD B,#01 + + + LD B,A + IN A,(SLOT3) + EX AF,AF' + LD A,SYS_PAGE + OUT (SLOT3),A + LD A,(SYS_PAGE.CURRENT_HDD) + INC A + JR NZ,.configured + ; + LD A,(SYS_PAGE.HD_IDF_ADR.sectors) + LD E,A + LD D,#00 + LD IX,#0000 + JR .done + ; +.configured: + LD IX,(SYS_PAGE.HDD_PARTITION_OFFSET+2) + LD DE,(SYS_PAGE.HDD_PARTITION_OFFSET) +.done: EX AF,AF' + OUT (SLOT3),A + LD A,B + LD B,#01 + ; HD_PREPARE: PUSH AF PUSH HL CALL HD_CALC_SECS - JR NC,.L1 - POP HL - POP AF - SCF - RET - -.L1: LD A,B + JR C,.error + ; + LD A,B LD BC,IDE.Write.Counter ; Установить число секторов для записи OUT (C),A @@ -57,13 +114,16 @@ HD_PREPARE: AND #F0 ; !!!!! посмотреть OR H INC B ; IDE.Write.DeviceHead - OUT (C),A - POP HL ; BUFER & PAGE POP AF AND A RET + ; +.error: POP HL + POP AF + SCF + RET NEXT_ADD_SEC: @@ -222,7 +282,8 @@ HD_RD_L1: HD_RD_L2: WAIT_HDD - BIT IDE.ControlBit.DataRequest,A + ;BIT IDE.ControlBit.DataRequest,A + AND IDE.ControlByte.DataRequest JR NZ,HD_READ_CONT ZERO_PORTY @@ -404,45 +465,114 @@ TEST_HDD_DRV: IN A,(C) ; ????? IDE.Write.Sector+#100 CP H RET -/* -TEST_HDD_DRV: -; EXTENDED.ASM variant - LD HL,#00FF ;????? - LD BC,IDE.Write.CylinderLow - OUT (C),L - IF IDE_Optimization - INC C - OUT (C),H ; IDE.Write.CylinderHigh + +; TEST_HDD_DRV: +; ; EXTENDED.ASM variant +; LD HL,#00FF ;????? +; LD BC,IDE.Write.CylinderLow +; OUT (C),L +; IF IDE_Optimization +; INC C +; OUT (C),H ; IDE.Write.CylinderHigh - INC B - DEC C - IN A,(C) ; ????? Тут регистр BC = #0254 - что за порт такой и что оттуда прочитается? - CP L - RET NZ - INC C +; INC B +; DEC C +; IN A,(C) ; ????? Тут регистр BC = #0254 - что за порт такой и что оттуда прочитается? +; CP L +; RET NZ +; INC C - ELSE - LD BC,IDE.Write.CylinderHigh - OUT (C),H - LD BC,#0254 ;???!!!! - IN A,(C) - CP L - RET NZ - LD BC,#0255 ;???!!!! - ENDIF +; ELSE +; LD BC,IDE.Write.CylinderHigh +; OUT (C),H +; LD BC,#0254 ;???!!!! +; IN A,(C) +; CP L +; RET NZ +; LD BC,#0255 ;???!!!! +; ENDIF - IN A,(C) ; ????? Тут регистр BC = #0255 - что за порт такой и что оттуда прочитается? - CP H - RET -*/ +; IN A,(C) ; ????? Тут регистр BC = #0255 - что за порт такой и что оттуда прочитается? +; CP H +; RET -FN_HDD_INIT: - LD BC,IDE.Write.DeviceHead +; [ ] 07/01/2024 bit1: Primary/Secondary, bit0 - master/slave, bit2..3: использующийся раздел в MBR +; !TODO сделать работу с переменными биоса SYS_PAGE.IDE_0..3 +FN_HDD_PART: + DI + PUSH BC + PUSH HL + ; + EX AF,AF' + IN A,(SLOT3) + EX AF,AF' + ; + LD C,A + AND 2 + LD A,IDE.Chanel.Primary + JR Z,.SET_CH + LD A,IDE.Chanel.Secondary +.SET_CH: + OUT (IDE.Chanel.Set),A + ; + LD A,C + PUSH AF + AND 1 + ; + LD A,IDE.Drive.Slave + JR NZ,.SET_Master_Slave + ; LD A,IDE.Drive.Master +.SET_Master_Slave: + LD BC,IDE.Write.DeviceHead OUT (C),A CALL TEST_HDD_DRV - JR NZ,.ABSENT + JR NZ,.Error + ; + CALL FN_HDD_INIT.L3 + JR C,.Error + ; + POP BC + LD A,SYS_PAGE + OUT (SLOT3),A + ;e tu + LD A,B + LD (SYS_PAGE.CURRENT_HDD),A + ; + EX AF,AF' + OUT (SLOT3),A + ; + CALL SET_BPB_OFFSET + ;AND A +.exit: POP HL + POP BC + EI + RET + ; +.Error: POP AF + SCF + JR .exit + +; [ ] 27/01/2024 адаптирована для корректной работы с FN_HDD_PART +FN_HDD_INIT: + LD C,SLOT3 + IN B,(C) + LD A,SYS_PAGE + OUT (SLOT3),A + ; + LD A,(SYS_PAGE.CURRENT_HDD) + OUT (C),B + INC A + JR Z,FN_HDD_PART + CALL TEST_HDD_DRV + SCF + RET NZ + ; LD BC,IDE.Write.DeviceHead + ; LD A,IDE.Drive.Master + ; OUT (C),A + ; CALL TEST_HDD_DRV + ; JR NZ,.ABSENT ; .L3: WAIT_HDD LD BC,IDE.Write.Command @@ -450,17 +580,20 @@ FN_HDD_INIT: OUT (C),A WAIT_HDD BIT IDE.ControlBit.DataRequest,A - JR NZ,.L2 + ;JR NZ,.L2 SCF - RET -.ABSENT: - LD BC,IDE.Write.DeviceHead - LD A,IDE.Drive.Slave - OUT (C),A - CALL TEST_HDD_DRV - JR Z,.L3 - SCF - RET + RET Z + ;JR NZ,.L2 + ;SCF + ;RET +; .ABSENT: +; LD BC,IDE.Write.DeviceHead +; LD A,IDE.Drive.Slave +; OUT (C),A +; CALL TEST_HDD_DRV +; JR Z,.L3 +; SCF +; RET ; .L2: LD BC,IDE.Read.Data LD HL,SYS_PAGE.HD_IDF_ADR @@ -503,13 +636,18 @@ FN_HDD_INIT: LD BC,IDE.Write.DeviceHead OUT (C),H LD A,(SYS_PAGE.HD_IDF_ADR.sectors) ; число секторов +.HDD_CONFIGURED: LD BC,IDE.Write.Counter OUT (C),A LD A,D OUT (SLOT3),A LD A,IDE.ATA.InitializeDeviceParameters ; SET HDD PARAMETERS - ;CALL HD_CMD_EXE - ;RET + CALL HD_CMD_EXE + ; + ; + ; + ; + RET HD_CMD_EXE: CALL HD_WAIT RET C @@ -642,60 +780,44 @@ HD_CALC_SECS: AND A RET -; [ ] 07/01/2024 bit0: Primary/Secondary, bit1 - master/slave, bit2..3: использующийся раздел в MBR -; !TODO сделать работу с переменными биоса SYS_PAGE.IDE_0..3 -FN_HDD_PART: - DI - PUSH BC - PUSH HL - ; - EX AF,AF' - IN A,(SLOT3) - EX AF,AF' - ; - LD C,A - AND 1 - LD A,IDE.Chanel.Primary - JR Z,.SET_CH - LD A,IDE.Chanel.Secondary -.SET_CH: - OUT (IDE.Chanel.Set),A - ; - LD A,C - PUSH AF - AND 2 - ; - LD A,IDE.Drive.Slave - JR NZ,.SET_Master_Slave - ; - LD A,IDE.Drive.Master -.SET_Master_Slave: - LD BC,IDE.Write.DeviceHead - OUT (C),A - CALL TEST_HDD_DRV - JR NZ,.Error - CALL FN_HDD_INIT.L3 - JR C,.Error - ; - POP BC +; [ ] 27/01/2024 теперь режим спектрума работает с любым разделом HDD +SET_BPB_OFFSET: LD A,SYS_PAGE - OUT (SLOT3),A - ; - LD A,B - LD (SYS_PAGE.CURRENT_HDD),A + LD HL,SYS_PAGE.MS_BPB + LD IX,#0000 + LD DE,#0000 + LD B,1 + CALL FN_HDD_READ ; + EX AF,AF' + IN A,(SLOT3) EX AF,AF' OUT (SLOT3),A ; - AND A -.exit: POP HL - POP BC - EI - RET + LD A,(SYS_PAGE.CURRENT_HDD) + RRCA + RRCA + AND 3 + INC A + LD B,A ; -.Error: POP AF - SCF - JR .exit + LD HL,SYS_PAGE.MS_BPB-16 + #01BE ;!HARDCODE смещение от начала сектора для таблицы разделов c первым сектором LBA для первого раздела + LD DE,16 ;!HARDCODE размер поля описателя раздела +.loop: ADD HL,DE + DJNZ .loop + ; + LD A,8 + ADD L + LD L,A + LD DE,SYS_PAGE.HDD_PARTITION_OFFSET + LD C,4 + LDIR + ; + EX AF,AF' + OUT (SLOT3),A + EX AF,AF' + RET + ; ENDMODULE ;************************************************ diff --git a/src/bios/exp/FUNC_SYS.ASM b/src/bios/exp/FUNC_SYS.ASM index 9542004..dc29477 100644 --- a/src/bios/exp/FUNC_SYS.ASM +++ b/src/bios/exp/FUNC_SYS.ASM @@ -271,14 +271,14 @@ FN_TURBO: ;!FIXIT меняем плотность - меняем в системной странице инфу об этом .SET_FDD_720: - LD A,1 - OUT (#BD),A ; !HARDCODE + LD A,FDD_Density.SET_720 + OUT (FDD_Density),A AND A RET ;!FIXIT меняем плотность - меняем в системной странице инфу об этом .SET_FDD_1440: - LD A,#21 - OUT (#BD),A ; !HARDCODE + LD A,FDD_Density.SET_1440 + OUT (FDD_Density),A AND A RET @@ -308,18 +308,14 @@ FN_TURBO: RET ;----------------------------------------------------------------------; -;----------------------------------------------------------------------; -READ_PORTS: ; !TODO сделать -WRITE_PORTS: ; !TODO сделать - SCF - RET -;----------------------------------------------------------------------; +;----------------------------------------------------------------------; ;!TODO ;FN_GET_SYS_VAR: ; Вход: HL - номер системной переменной ; Выход: HL - значение системной переменной ; RET +;----------------------------------------------------------------------; ;!TODO скомпоновать