From ee0a29a034211b67495eda17ec082eff4f3aba77 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Tue, 9 Jan 2024 01:00:57 +1000 Subject: [PATCH] =?UTF-8?q?=D1=87=D1=91=D1=82=20=D0=BF=D0=BE=D0=BD=D0=B0?= =?UTF-8?q?=D0=BA=D0=BE=D0=B2=D1=8B=D1=80=D1=8F=D0=BB?= 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/DCP.ASM | 2 + src/bios/exp/EXP.asm | 6 +- src/bios/exp/EXTENDED/IDE/HDD_DRV.ASM | 7 +- src/bios/exp/FUNC_4x.ASM | 161 ++++++----- src/bios/exp/FUNC_RAM_ROM_DRV.ASM | 10 +- src/bios/exp/FUNC_SYS.ASM | 5 +- src/bios/exp/FUNK_FOR_TRDOS.ASM | 2 +- src/bios/rom/ROM.asm | 23 +- src/bios/rom/ZX_MODE.ASM | 396 -------------------------- src/bios/shared/RECOVERY.IMG | Bin 98304 -> 98304 bytes 12 files changed, 132 insertions(+), 482 deletions(-) delete mode 100644 src/bios/rom/ZX_MODE.ASM diff --git a/Shared_Includes b/Shared_Includes index 51026c3..a6dee8e 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 51026c3fd8d5614706b5ed1214c4be8ffcdd73e6 +Subproject commit a6dee8e17ae12b251f306290793a56a6b0dd5ae3 diff --git a/src/ZX_ROMS/new/SP_TRDOS.bin b/src/ZX_ROMS/new/SP_TRDOS.bin index 6bfe769534f52fb772261357c9bfed6258f5687d..738fc75b59e138990ff40d4d84ee79588c182680 100644 GIT binary patch delta 1429 zcmZ`(eQXnD81LI&yIa>C`((AOTMHx}U#4u`-R*3<7COe1t!8U5#3N|@AmaE)Of-v( zZD@>!1PJdE%>F`6MCA{_{-Xi0-Iat}d4bUsE2FyG?4~SLE~OJ0UVYmsf9d7&zR&OX zJn!>$&%HxKU}y-Ot0Hvb85gW2`anhKFwqTkG>~9iKchqET%m6aAA%O~K^r=0MITu0 znz8KUbikv=r~A9((~IeTG|kKFZFkYTR#DciSYcVPsjpGTJX%@{hsZ|o0z5_5`Cl#N zo|-?sD$`>tQzEiiMwqb9r_za(JfY-JhQ#dd{*izK=m$pj+b){F#zZ2Oo=C}9DPcq8 zg^Of8n1bfgo94!T^&V$={l%0VnNV0M|L+6;EbZ0+Y zo3ai~!|#kfm^aoChE^1Sb!9=Vn}>VL_L-;oL+fxY#l>U${xN{rvXeVrVsLRDjd;pr zPnU~7>rfwad&Ja~6c8xG0-7`NNg;<;GYWDrc1;+)PvQgrX@%yU_{8{#sbF?6G-Fx| z2A46q&A#B9WjcRn4_>$W{m(MGEq?zdM%UBj-^pMmc*Lmf@wbyiuWx&M*hFj#`23?L zBDg8gy@%A}ZOfKDB+=R38T685?{ht!-NE*r!<5#y<1Nb2+aAO|k1`t1T`G$^fxqQx z$x^M_=!fb?>K=TLs?Zm?(8p943H}QGzI>pB2sa5&aJ}3wES(m!PV-cn zx`xBc5~06>Eta>)NPD8i3J$=Amc7j#+vFQ!%-OUcEO|7jHOYS*E(qc^H>&jH@Tteq zYDE_ew=A#04RtY53nNDq1C7-Su6B0j*1l)wVVwX*`!+0mP{uuQxNA6nUE#w z1Qu@C|0oyNSnbI*c;y#_4(ckNc4}#Mj0NH>g$ncE$0TzFs8BHsVL!9-l?2Arb?jt< z^Uiu{*HTMyM0#VjMRhvXsSfVRTaLQA08XRHQIDY+!}Ck99K+IEj`LJUF^xNgG;)RV zyqr;qDFsrzXoP2&t+kK1C}>4r@|oWI0`9Ja+hAoO$*$JlVU=hSZe)E8vuYDP%r_42 z?~jiy4%qJt&P!tfmeJUAf>R8@Z$QCC;kY>*_B`v zX4t@>%+`*x92(^k=p#3u6VS_^32}zaPL37+`Z1m!j&;ygziDx>S#2TI)nal|L6i){ zWPUbmtEztID_gE2oBFi?>4y)mbD2-g+5gjKxXdT!tOvxul|1kQM-4XfDCS13tv5t0 z;Vos?Xe!$@9@Vai0zE)e4BA{&78#1b1iqEX!mY&DM%8<_H}G~QTG`4Q2#ad7>8i~S zF4-zqRaYp7RK}hkrb)GF4BOz#{~I#Pk(~el delta 1242 zcmZvcZ){Ul6u{r@`?I&UyseC3g|+m7CfzUuN%#8tY~NNWgC=t|ZG$0s1`~`zGA7Xv zSQQvC28@3exiiy+4@?qGBu25}14QPw*BMK>%SJPpBMUsRqReTZF~ z?(d#+&pG#=dwY99Z!h?EB}LwJo`sE6H*8vIPk%^l1LWAxB+S!y$gv!qzQDW(Wc0AD zoJ9jJbi&0GW2GCnW3rjQo$AWpE*Da0NYbA2+(YlURE=D_c8%HLwV5w_Yq&m{QXjT) zeee*wPE@R$dglsLG7-Gsp=in*yi^!Bybjb;D{h+qa>GL0W79`9r&a;3`MJXMoHnH! zXc11ZO;0YeSxiv0){t%}v1_!K40$%|$AiZ7Tw%P0ctN_Zpfj+p_G;bglvxxV`(K>X zMyGUt7XDM)#V{6*#><`7c7{O3w%H%yN$ZAMfYqxSiH6{?HGI<6K>Z-174R`z(ozn< z1GXOLkaT1tuB|F$&-F(WSh5Z5?iO&dGNGQf^Mw`aFC3{~RLi1sK9dq_%vGX8y(^>hqBNn57m(mq54x{W zxH|DSzqg$VCobh6Nj9THZtt}u0 z9m3jZd2~w4awjXvO!5y_sLd{ZrWs3VQQ5&=skS?}+$+`!k_iq~A-=#Fqe65pR|T+J zSYNN>R+>~VS&d3!?VF46Z((QSc`+)NN{G|w(~x8+Xs{L2cu{mSC&Yy_&Jr9EokzbA z7e05EWRSmAmmoD}%;M~PfEO~32LXm!V|qMfgY)6A$FZTIUO!?A{L(RaFhE=81MpB_iD5wX zZN4SND&&gP1ipg5OCHOl1Z~eO!n0f$g5XDRh)EA$0VGK;JOBUy diff --git a/src/bios/exp/DCP.ASM b/src/bios/exp/DCP.ASM index ad62c8c..29d609a 100644 --- a/src/bios/exp/DCP.ASM +++ b/src/bios/exp/DCP.ASM @@ -638,6 +638,8 @@ SET_PORTS: 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 diff --git a/src/bios/exp/EXP.asm b/src/bios/exp/EXP.asm index b1c74c4..7780629 100644 --- a/src/bios/exp/EXP.asm +++ b/src/bios/exp/EXP.asm @@ -772,7 +772,6 @@ set_config: XOR A OUT (BorderColor),A CALL EMM.CheckColdInit ; инициализация памяти - POP HL ; конфигурация JR Reset_Handler.start ; ************************************* @@ -1598,6 +1597,8 @@ DOS_ON: NOP ;*************************************** _mInfoBLOCK #3E00-$,#FF DOS_OFF: + PUSH AF + LD A,R DI PUSH AF PUSH BC @@ -1608,6 +1609,9 @@ DOS_OFF: LD (#5BFF),BC ; !HARDCODE POP BC POP AF + JP PO,.no_EI + EI +.no_EI: POP AF RET ;*************************************** diff --git a/src/bios/exp/EXTENDED/IDE/HDD_DRV.ASM b/src/bios/exp/EXTENDED/IDE/HDD_DRV.ASM index f175b01..eb10943 100644 --- a/src/bios/exp/EXTENDED/IDE/HDD_DRV.ASM +++ b/src/bios/exp/EXTENDED/IDE/HDD_DRV.ASM @@ -233,14 +233,13 @@ RST8RDR: RESTORE_PORTY POP IY ;EX AF,AF' ;!TEST 21/11/23 RET -;READ SECTOR(S) -RDS000: - LD C,IDE.Device.HDD + + ;READ SECTOR(S) +RDS000: LD C,IDE.Device.HDD CALL SELECT_DRIVE RET C EXX LD DE,#C140 ;WAIT BUSY=0 & READY=1 & ERR=0 - ;LD BC,IDE.Read.Status CALL WAITPRT EXX RET C diff --git a/src/bios/exp/FUNC_4x.ASM b/src/bios/exp/FUNC_4x.ASM index 7e3d8ea..5292651 100644 --- a/src/bios/exp/FUNC_4x.ASM +++ b/src/bios/exp/FUNC_4x.ASM @@ -350,7 +350,7 @@ FN_HDD_RECAL: FN_HDD_TEST_IDE: LD E,#00 LD BC,IDE.Write.DeviceHead - LD A,#A0 ; !!!!! глянуть + LD A,IDE.Drive.Master OUT (C),A CALL TEST_HDD_DRV @@ -359,7 +359,7 @@ FN_HDD_TEST_IDE: SET 0,E NO_HDD1: LD BC,IDE.Write.DeviceHead - LD A,#B0 ; !!!!! глянуть + LD A,IDE.Drive.Slave OUT (C),A CALL TEST_HDD_DRV @@ -442,31 +442,27 @@ FN_HDD_INIT: LD A,IDE.Drive.Master OUT (C),A CALL TEST_HDD_DRV - JR NZ,HD_ABSENT -HD_C0_L3: - WAIT_HDD - + JR NZ,.ABSENT + ; +.L3: WAIT_HDD LD BC,IDE.Write.Command LD A,IDE.ATA.IdentifyDevice ;!FIXIT переделать OUT (C),A - WAIT_HDD - BIT IDE.ControlBit.DataRequest,A - JR NZ,HD_C0_L2 + JR NZ,.L2 SCF RET -HD_ABSENT: +.ABSENT: LD BC,IDE.Write.DeviceHead - LD A,#B0 ; !HARDCODE + LD A,IDE.Drive.Slave OUT (C),A CALL TEST_HDD_DRV - JR Z,HD_C0_L3 + JR Z,.L3 SCF RET - -HD_C0_L2: - LD BC,IDE.Read.Data + ; +.L2: LD BC,IDE.Read.Data LD HL,SYS_PAGE.HD_IDF_ADR IN A,(SLOT3) LD D,A @@ -474,51 +470,46 @@ HD_C0_L2: OUT (SLOT3),A INIR INIR + ; B = 0 + LD H,B + LD L,B LD A,(SYS_PAGE.HD_IDF_ADR.sectors) ; число секторов LD C,A - LD HL,0 - LD B,H + ;LD HL,0 + ;LD B,H LD A,(SYS_PAGE.HD_IDF_ADR.heads) ; число головок -.loop: - ADD HL,BC +.loop: ADD HL,BC DEC A JR NZ,.loop LD (SYS_PAGE.HD_IDF_ADR.sec_cyl),HL - WAIT_HDD - LD BC,IDE.Read.Control IN A,(C) AND #10 LD B,A LD A,(SYS_PAGE.HD_IDF_ADR.heads) ; число головок - DEC A AND #0F - OR #A0 + OR IDE.Drive.Master OR B LD H,A - LD A,(SYS_PAGE.HD_IDF_ADR+99) ; !HARDCODE через структуру! - BIT 1,A - JR Z,HD_C0_NO_LBA + LD A,(SYS_PAGE.HD_IDF_ADR.LBA_CHS) + ;BIT 1,A + AND %0000'0010 + JR Z,.NO_LBA SET 6,H - -HD_C0_NO_LBA: +.NO_LBA: LD BC,IDE.Write.DeviceHead OUT (C),H - LD A,(SYS_PAGE.HD_IDF_ADR.sectors) ; число секторов - 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 @@ -550,40 +541,38 @@ HD_W_EXIT: AND A RET -/* -;EXTENDED.ASM Version -HDD_LBA: ;???!!!! - POP BC - LD L,E - LD E,D - LD D,XL - XOR A - LD H,A - RET +; ;EXTENDED.ASM Version +; HDD_LBA: ;???!!!! +; POP BC +; LD L,E +; LD E,D +; LD D,XL +; XOR A +; LD H,A +; RET +; HD_CALC_SECS: +; LD A,XH +; AND A +; SCF +; RET NZ ; ошибка, слишком большой HDD -HD_CALC_SECS: - LD A,XH - AND A - SCF - RET NZ ; ошибка, слишком большой HDD +; PUSH BC +; LD BC,IDE.Write.DeviceHead +; DEC B +; IN A,(C) +; BIT 6,A +; JR NZ,HDD_LBA +; ; POP BC - PUSH BC - LD BC,IDE.Write.DeviceHead - DEC B - IN A,(C) - BIT 6,A - JR NZ,HDD_LBA -; POP BC -*/ ;EXP_HDD.ASM Version HD_CALC_SECS: - ;PUSH BC + PUSH BC LD BC,IDE.Read.Control IN A,(C) AND %0100'0000 - ;POP BC + POP BC JR Z,.CHS ; LBA LD L,E @@ -632,13 +621,13 @@ HD_CALC_SECS: .DIV_END: ; DE - результат, HL - остаток ; DE - цилиндр - LD A,(SYS_PAGE.HD_IDF_ADR+12) ; !HARDCODE .sectors + LD A,(SYS_PAGE.HD_IDF_ADR.sectors) ; A - число секторов на дорожке ; HL - номер сектора в цилиндре - LD B,0 LD C,A ;LD BC,(MS_BPB+S_P_T) ; ЧИСЛО СЕКТОРОВ НА ДОРОЖКЕ XOR A + LD B,A .LOOP: SBC HL,BC INC A JR NC,.LOOP @@ -653,16 +642,60 @@ 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: - BIT 0,A + 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 + LD A,SYS_PAGE + OUT (SLOT3),A + ; + LD A,B + LD (SYS_PAGE.CURRENT_HDD),A + ; + EX AF,AF' + OUT (SLOT3),A + ; + AND A +.exit: POP HL + POP BC + EI RET - + ; +.Error: POP AF + SCF + JR .exit ; ENDMODULE ;************************************************ diff --git a/src/bios/exp/FUNC_RAM_ROM_DRV.ASM b/src/bios/exp/FUNC_RAM_ROM_DRV.ASM index 091873f..1ada46a 100644 --- a/src/bios/exp/FUNC_RAM_ROM_DRV.ASM +++ b/src/bios/exp/FUNC_RAM_ROM_DRV.ASM @@ -27,7 +27,8 @@ EMM.GetMemSize: ;----------------------------------------------------------------------; ; - +;!!!!! Если используется SLOT3 со своими страницами, то не пользоваться +; стеком, там может быть SP в режиме спектрума ; ;----------------------------------------------------------------------; !FIXIT SAFE_RGADR + @@ -875,7 +876,8 @@ GET_RAMD_NUM: ; A - current RAM Drives set SWAP_RAM_DRIVES: IN A,(SLOT3) - PUSH AF + EX AF,AF' + PUSH AF ;на всякий случай LD A,SYS_PAGE OUT (SLOT3),A ; @@ -906,8 +908,10 @@ SWAP_RAM_DRIVES: LD (SYS_PAGE.CURRENT_RAM_DRV),A LD C,A ; -.exit: POP AF +.exit: EX AF,AF' OUT (SLOT3),A + POP AF + EX AF,AF' LD A,C RET ;----------------------------------------------------------------------; diff --git a/src/bios/exp/FUNC_SYS.ASM b/src/bios/exp/FUNC_SYS.ASM index 2435101..c40bdad 100644 --- a/src/bios/exp/FUNC_SYS.ASM +++ b/src/bios/exp/FUNC_SYS.ASM @@ -126,7 +126,6 @@ EMM.FullInit: EX AF,AF' LD A,SYS_PAGE OUT (SLOT2),A - INIT_SYS_ALL: DI LD HL,ID_SPRINTER_length @@ -143,7 +142,7 @@ INIT_SYS_ALL: ;!TODO что за переменные? LD HL,SYS_PAGE.DISK_TYPE-#4000 - LD (HL),0 ;!HARDCODE + LD (HL),0 ;!HARDCODE INC HL LD (HL),1 ;!HARDCODE INC HL @@ -161,7 +160,7 @@ INIT_SYS_ALL: LD A,9 LD (SYS_PAGE.MSD_SECS-#4000),A - LD A,0 + XOR A LD (SYS_PAGE.DS_1440-#4000),A LD HL,SYS_PAGE.RAMD_KEYS-#4000 diff --git a/src/bios/exp/FUNK_FOR_TRDOS.ASM b/src/bios/exp/FUNK_FOR_TRDOS.ASM index bb305be..63fb05a 100644 --- a/src/bios/exp/FUNK_FOR_TRDOS.ASM +++ b/src/bios/exp/FUNK_FOR_TRDOS.ASM @@ -19,7 +19,7 @@ DISK_REDIR: RET ; -;!TODO исправить SLOT2 на SLOT3 и затестить +;!TODO исправить SLOT2 на SLOT3 и затестить, но не пользоваться стеком тогда ;!TODO добавить описание SET_DISK_TYPE: PUSH HL diff --git a/src/bios/rom/ROM.asm b/src/bios/rom/ROM.asm index 021f1e7..f0ea0db 100644 --- a/src/bios/rom/ROM.asm +++ b/src/bios/rom/ROM.asm @@ -315,16 +315,21 @@ SW_ROM: ;*************************************** _mInfoBLOCK #3E00-$,#FF ;DOS_OFF: + PUSH AF + LD A,R DI - PUSH AF - PUSH BC - LD BC,(#5BFF) ; !HARDCODE - LD A,#C9 - LD (#5BFF),A ; !HARDCODE - CALL #5BFF ; !HARDCODE - LD (#5BFF),BC ; !HARDCODE - POP BC - POP AF + PUSH AF + PUSH BC + LD BC,(#5BFF) ; !HARDCODE + LD A,#C9 ; Opcode RET + LD (#5BFF),A ; !HARDCODE + CALL #5BFF ; !HARDCODE + LD (#5BFF),BC ; !HARDCODE + POP BC + POP AF + JP PO,.no_EI + EI +.no_EI: POP AF RET ;*************************************** diff --git a/src/bios/rom/ZX_MODE.ASM b/src/bios/rom/ZX_MODE.ASM deleted file mode 100644 index b610b83..0000000 --- a/src/bios/rom/ZX_MODE.ASM +++ /dev/null @@ -1,396 +0,0 @@ -;.PRINTX "Service." - -SERVICE: - LD DE,SR_MENU - LD BC,SR_MENU.Size - CALL RUN_MENU ;09f3 - LD HL,SR_TAB - CALL EXEC_PNT - JR SERVICE - -SR_TAB: DW UTILIT - DW GOTO_TRDOS.m128 - DW GOTO_TRDOS.m48 - DW TURBO_OFF - DW TURBO_ON - DW CLEAR_RAM - DW RET_FROM_M - -; DC - every last character of a string will have bit 7 set -SR_MENU: - BYTE 8 ; количество пунктов - BYTE 'Options ',#FF ; заголовок меню - DC 'RUN disk.trd' - DC '128 TR-DOS' - DC '48 TR-DOS' - DC 'TURBO OFF ' - DC 'TURBO ON ' - DC 'Clear RAM' - DC 'RETURN' - DC " " ; маркер конца -.Size EQU $-SR_MENU - -;***************************** - -;SR_48R: -GOTO_TRDOS: -.m128: LD A,#10 - JR .RUN -;SR_48: -.m48: LD A,#30 ; Стопор на PORT_128 !!! -;SR_48A: -.RUN: LD BC,#7FFD - OUT (C),A - LD BC,0 ; НА 0 !! - PUSH BC - LD BC,#3D2F ; В DOS ! - PUSH BC - JP SW_ROM - -;******************************* -TURBO_OFF: - LD A,BIOS.FN_TURBO.OFF - LD C,BIOS.FN_TURBO - JP_to_BIOS -TURBO_ON: - LD A,BIOS.FN_TURBO.ON - LD C,BIOS.FN_TURBO - JP_to_BIOS - -;******************************* - -CLEAR_RAM: - DI - LD C,BIOS.FullInit - RST_to_BIOS - ;CALL ToBIOS_3D13 - ; при очистке памяти из меню спектрума возврат в DSS по CAD - ; будет опасным (RAM Blocks освободились), - ; поэтому отключаем перехват ресета. - ;!TODO придумать как отключать перехват только на возврат в DSS - LD A,ACEX.RET_PORT - LD BC,BIOS.SET_PORTS - ;[x] SET_PORTS: no need to call from #3D13 and DI. 31/12/23 - ;CALL ToBIOS_3D13 - RST_to_BIOS - ; - EI - RET - -;SR_CL_MEM: -; DI -; LD A,10H -;SR_CL_R2: -; LD BC,1FFDH -; OUT (C),A -; EX AF,AF' -; XOR A -;SR_CL_R1: -; LD BC,7FFDH -; OUT (C),A -; LD HL,0C000H -; LD DE,0C001H -; LD BC,03FFFH -; LD (HL),L -; LDIR -; INC A -; CP 48H -; JR NZ,SR_CL_R1 -; EX AF,AF' -; CP 0 -; JP Z,BASIC_128 ; выход на сброс BASIC 128 -; LD A,0 -; JR SR_CL_R2 - -;***************************** -; *** MENU IS-DOS *** -;***************************** - -ISDOS: - LD HL,IS_TAB - LD DE,IS_MENU - LD BC,IS_MENU.Size - PUSH HL - CALL RUN_MENU - POP HL - CALL EXEC_PNT - JR ISDOS - -IS_TAB: -; DW TR_DOS -; DW SP_DOS - DW SPRINTER_1X - DW AY8910_X - DW PENTAGON - DW SCORPION - DW PENTAGON512 - DW SPRINTER_reset ;SPRINTER_2X - DW RET_FROM_M - -; DC - every last character of a string will have bit 7 set -IS_MENU: - BYTE 8 ; количество пунктов - BYTE 'Hardware',#FF ; заголовок меню - DC 'Sprinter ZX ' - DC 'ZX Spectrum' - DC 'Pentagon 128' - DC 'Scorpion 256' - DC 'Pentagon 512' - DC 'Restart ' - DC 'RETURN' - DC " " ; маркер конца -.Size EQU $-IS_MENU - -;****************************** -;SP_DOS: -; LD B,0E2H -; LD A,0E1H -; JR TR_DOS1 -;TR_DOS: -; LD B,0EAH -; LD A,0E1H -;TR_DOS1: -; CALL DOS_ON -; CALL SET_ROM_PAGES -; CALL DOS_OFF -; RET -;****************************** - - -;************************************************** -;Sprinter ZX -SPRINTER_1X: - CALL _SET_CNF - LD C,BIOS.RST_CONF.SP97_1 - RST_to_BIOS - CALL CNF_PN_320 - LD L,2 ;FN_SYNC.INT_PENT - JR 1F ;!FIXIT метку придумать -; -;ZX Spectrum -AY8910_X: - CALL _SET_CNF - LD C,BIOS.RST_CONF.AY8910 - RST_to_BIOS - - LD A,#FA ; no ACC, Original waits - LD (Port_All_Mode),A - - CALL CNF_SC_312 - LD L,3 ;FN_SYNC.INT_ORIG -1: LD DE,CNF_PORT.CNF_0 + CNF_PORT.TURBO.ON - CALL CONFIG_SET - CALL CLS ;!FIXIT нужно ли? - RET -; - -SCORPION: - CALL _SET_CNF - CALL CNF_SC_312 - LD L,1 ;FN_SYNC.INT_SCORP - LD DE,CNF_PORT.CNF_1 + CNF_PORT.TURBO.ON - JR CONFIG_SET - -PENTAGON: - CALL _SET_CNF - CALL CNF_PN_320 - LD L,2 ;FN_SYNC.INT_PENT - LD DE,CNF_PORT.CNF_2 + CNF_PORT.TURBO.ON - JR CONFIG_SET - -PENTAGON512: - CALL _SET_CNF - CALL CNF_PN_320 - LD L,2 ;FN_SYNC.INT_PENT - LD DE,CNF_PORT.CNF_2 + CNF_PORT.TURBO.ON + CNF_PORT.CNF_512 -; JR CONFIG_SET -CONFIG_SET: - PUSH DE - - EI - HALT - DI - - IN A,(SLOT3) - EX AF,AF' - LD A,SYS_PAGE - OUT (SLOT3),A - LD (SYS_PAGE.CONFIG_DE),DE - ;!FIXIT есть ли смысл делать до FN_SYNC? - LD A,(ZX_VARS.BORDER) - RRCA - RRCA - RRCA - AND 7 - OUT (BorderColor),A - ; - EX AF,AF' - OUT (SLOT3),A - - LD A,L - LD C,BIOS.FN_SYNC - RST_to_BIOS - - LD HL,#4104 ;!HARDCODE - LD E,0 - LD BC,256*4 + BIOS.LP_OPEN_S ;!HARDCODE - RST_to_BIOS - - LD HL,#5104 ;!HARDCODE - LD E,0 - LD BC,256*4 + BIOS.LP_OPEN_S - RST_to_BIOS - - POP DE - LD A,E - OUT (SYS_PORT.ROM),A - - IM 1 - EI - RET - -SPRINTER_reset: - CALL _SET_CNF - LD BC,256*BIOS.REINIT.SOFT_RESET + BIOS.REINIT - JP_to_BIOS - -_SET_CNF: - DI - LD A,CNF_PORT.CNF_0 + CNF_PORT.TURBO.ON - OUT (SYS_PORT.ROM),A - RET - -CNF_SC_312: - LD A,Port_VSYNC.SET_312L - OUT (Port_VSYNC),A - RET - -CNF_PN_320: - LD A,Port_VSYNC.SET_320L - OUT (Port_VSYNC),A - RET - -; LD A,CNF_0 -; OUT (SYS_PORT.ROM),A -; CALL DOS_OFF -; JP 0 - -;***************************** -; *** MENU UTILITES *** -;***************************** -;!FIXIT это запуск c:\disk.trd - не думаю, что это нужно, можно заменить -UTILIT: - LD HL,C_DISK_C - CALL CALL_DOS1 - - ;!TEST - ;CALL DOS_ON - ;LD A,0 ; DETECT_HDD - ;CALL EXP_HDD - LD C,BIOS.HDD_INIT - RST_to_BIOS - ;CALL DOS_OFF - ; - - JR C,DISK_UTILIT - - LD HL,C_DISK_C3 - CALL CALL_DOS1 - -UTIL_DISK: - XOR A - ;!TEST - LD C,BIOS.FreeMemRMD - RST_to_BIOS - ;CALL EMM_FN3 ;!!!!! через RST_to_BIOS EMM.FreeMemRMD - ; - - LD HL,C_DEMO6 - CALL CALL_DOS1 - - XOR A - ;!TEST - LD C,BIOS.GET_RAMD_ST - RST_to_BIOS - ;CALL GET_RAMD_ST - ; - - JR C,UTIL_DISK_L1 - JR Z,UTIL_DISK_L1 - - LD HL,C_DISK_C1 - CALL CALL_DOS1 - LD HL,C_DISK_C2 - CALL CALL_DOS1 - RET - -UTIL_DISK_L1: - LD A,(ZX_VARS.OPER_DISK) - INC A - CP 2 - JR Z,DISK_UTIL_RET - LD HL,C_DISK_C5 - CALL CALL_DOS1 - JR UTIL_DISK - -DISK_UTIL_RET: - LD HL,C_DISK_C6 - CALL CALL_DOS1 - RET - -DISK_UTILIT: - LD HL,C_DISK_C4 - CALL CALL_DOS1 - JR UTIL_DISK - -C_DEMO6: DB .Size, ZX_Token.rem, ':/disk.trd', 13,80 -.Size EQU $-C_DEMO6-1 - -;*************************************** - -;VERSION: DEFB 22,21,0 -; DEFB 16,2,"Expansion 3.02  1997 ELSY Co.",16,1,0FFh - -;********************************************** - -DOS_RUN: - LD HL,C_DISK_C1 - CALL CALL_DOS1 - - LD HL,C_DISK_C2 - CALL CALL_DOS1 - RET - -START_TRD: - LD HL,C_DISK_C - CALL CALL_DOS1 - LD HL,C_DISK_C0 - CALL CALL_DOS1 - LD HL,C_DISK_C3 - CALL CALL_DOS1 - RET - -C_DISK_C: DB .Size, ZX_Token.rem, ':', 13,80 -.Size EQU $-C_DISK_C-1 - -C_DISK_C0: DB .Size, ZX_Token.rem, ':/CLEAR E', 13,80 -.Size EQU $-C_DISK_C0-1 - -C_DISK_C1: DB .Size, ZX_Token.rem, ':/RMD E', 13,80 -.Size EQU $-C_DISK_C1-1 - -C_DISK_C2: DB .Size, ZX_Token.rem, ':RUN', 13,80 -.Size EQU $-C_DISK_C2-1 - -C_DISK_C3: DB .Size, ZX_Token.rem, ':/HDD', 13,80 -.Size EQU $-C_DISK_C3-1 - -C_DISK_C4: DB .Size, ZX_Token.rem, ':/FDD', 13,80 -.Size EQU $-C_DISK_C4-1 - -C_DISK_C5: DB .Size, ZX_Token.rem, ':/B:', 13,80 -.Size EQU $-C_DISK_C5-1 - -C_DISK_C6: DB .Size, ZX_Token.rem, ':/A:', 13,80 -.Size EQU $-C_DISK_C6-1 -; \ No newline at end of file diff --git a/src/bios/shared/RECOVERY.IMG b/src/bios/shared/RECOVERY.IMG index d8a8bed06a0a4c4c895554e1c39ab4ce01f8c0be..38a5535997610048996524dfbc2221d6611ef8a5 100755 GIT binary patch delta 6757 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