From 0379d0c9b1c962691ca8710b14025abd16cb5e1c Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Sun, 31 Dec 2023 05:20:39 +1000 Subject: [PATCH] + SET_PORTS: no need to call from #3D13 and DI --- Shared_Includes | 2 +- src/bios/exp/DCP.ASM | 40 ++++++---- src/bios/exp/EXP.asm | 145 ++++++++++++++++++++--------------- src/bios/rom/ZX/ZX_MENU.ASM | 5 +- src/bios/rom/ZX_MODE.ASM | 5 +- src/bios/shared/RECOVERY.IMG | Bin 98304 -> 98304 bytes 6 files changed, 121 insertions(+), 76 deletions(-) diff --git a/Shared_Includes b/Shared_Includes index 54298bf..c135d9b 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 54298bfb52826572bda5ccd0609320a9418d08c9 +Subproject commit c135d9b6038fcabca6cef3234d876f93d5865dee diff --git a/src/bios/exp/DCP.ASM b/src/bios/exp/DCP.ASM index b8d0ba2..ad62c8c 100644 --- a/src/bios/exp/DCP.ASM +++ b/src/bios/exp/DCP.ASM @@ -584,40 +584,47 @@ DCP_CONFIG: ; ;-----------------------------------------------------------------------; -; CALL from 3D13h! Осторожнее с прерываниями, лучше гасить, чтоб не сбить сигнал DOS_ON +;[x] Теперь это не нужно: CALL from 3D13h! Осторожнее с прерываниями, лучше гасить, чтоб не сбить сигнал DOS_ON ; in: A - внутренний порт, B - значение для записи во внутренний порт -; out: B - старое значение внутреннего порта; Перед выходом восстанавливается конфа прописанная в CONFIG_DE +; 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' ; страница - + ; LD (#8000),A ; установить внутренний порт LD (#8200),A - + ; EX AF,AF' LD A,B LD BC,0 EX AF,AF' - + ; IN A,(C) - + ; EX AF,AF' OUT (C),A ; установить новое значение порта EX AF,AF' - + ; LD B,A LD A,L LD (#8000),A ; вернуть порт @@ -630,8 +637,15 @@ SET_PORTS: LD A,(SYS_PAGE.CONFIG_DE-#4000) OUT (C),D ; вернуть страницу OUT (SYS_PORT.ROM),A - - AND A - RET + ; + ;[x] SET_PORTS: no need to call from #3D13 and DI. 31/12/23 + POP AF + RET PO + EI + RET + ; + ;AND A + ;RET + ; ;-----------------------------------------------------------------------; ; \ No newline at end of file diff --git a/src/bios/exp/EXP.asm b/src/bios/exp/EXP.asm index a1c444e..abb2400 100644 --- a/src/bios/exp/EXP.asm +++ b/src/bios/exp/EXP.asm @@ -780,28 +780,31 @@ start: push af ;----[перехват soft reset #EE port]----- Check_EE_Port: - LD A,ACEX.RET_PORT - LD B,0 - LD C,BIOS.SET_PORTS - CALL @ToBIOS_3D13 ; переустановить внутр. порт #EE - LD A,B - AND A - JR Z,Check_Spec_Page + LD A,ACEX.RET_PORT + LD B,0 + ;[x] SET_PORTS: no need to call from #3D13 and DI. 31/12/23 + ;LD C,BIOS.SET_PORTS + ;CALL @ToBIOS_3D13 ; переустановить внутр. порт #EE + CALL SET_PORTS + ; + LD A,B + AND A + JR Z,Check_Spec_Page DI - OUT (SLOT3),A ; Set restart page + OUT (SLOT3),A ; Set restart page .After_Hard_Rst: - LD HL,(Spec_Page.RET_addr) ; prog address - ld A,(Spec_Page.page_0) ; PAGE0 - OUT (SLOT0),A - LD A,(Spec_Page.page_1) ; PAGE1 - OUT (SLOT1),A - LD A,(Spec_Page.page_2) ; PAGE2 - OUT (SLOT2),A - LD A,(Spec_Page.page_3) ; PAGE3 - OUT (SLOT3),A - JP (HL) + LD HL,(Spec_Page.RET_addr) ; prog address + LD A,(Spec_Page.page_0) ; PAGE0 + OUT (SLOT0),A + LD A,(Spec_Page.page_1) ; PAGE1 + OUT (SLOT1),A + LD A,(Spec_Page.page_2) ; PAGE2 + OUT (SLOT2),A + LD A,(Spec_Page.page_3) ; PAGE3 + OUT (SLOT3),A + JP (HL) ; ;--[перехват soft/hard reset #41 page]-- Check_Spec_Page: @@ -1098,26 +1101,28 @@ ZG_ADDRESS: INCLUDE 'FONT.ASM' ; RAM SLOT0 - page 0 ; для режима zx spectrum ; ВЫПОЛНЯЕТСЯ ИЗ ОЗУ +; !HARDCODE номера страниц для эмулятора ПЗУ init_zx_roms: DISP Reset_Handler.init_rom_address IN A,(SLOT3) - PUSH AF + ;PUSH AF + EX AF,AF' DI - LD A,1 ;!HARDCODE + LD A,SYS_PORT.EXTENSION OUT (SYS_PORT.ROM),A - ;LD A,2 - INC A ;!HARDCODE - LD B,3 ; zx-rom number of pages + INC A ;!HARDCODE LD A,2 + LD B,3 ; zx-rom number of pages ;!FIXIT переделать на функцию биоса для чтения ROM-DISK и перенести в него ПЗУ спектрума -.loop: push bc - +.loop: ;push bc + EXX + ; out (ROM.SLOT0),a - or %0100'0000 + or %0100'0000 ; !HARDCODE номера страниц для эмулятора ПЗУ out (SLOT3),a - and %1011'1111 + and %1011'1111 ; !HARDCODE номера страниц для эмулятора ПЗУ LD HL,0 LD DE,#C000 @@ -1125,47 +1130,67 @@ init_zx_roms: LDIR inc a - pop bc + ;pop bc + EXX DJNZ .loop xor a out (ROM.SLOT0),a OUT (SYS_PORT.ROM),A - POP AF + ;POP AF + EX AF,AF' out (SLOT3),a - LD A,#E2 ;!HARDCODE ROM-ID - BASIC 128 - LD B,#42 ; page - CALL .SET_ROM + LD A,ACEX.vROM.BASIC_128 ; ROM-ID - BASIC 128 + LD B,#42 ;!HARDCODE page + ;[x] SET_PORTS: no need to call from #3D13 and DI. 31/12/23 + ;CALL .SET_ROM + CALL SET_PORTS + ; - LD A,#E3 ;!HARDCODE ROM-ID - BASIC 48 - LD B,#43 ; page - CALL .SET_ROM + LD A,ACEX.vROM.BASIC_48 ; ROM-ID - BASIC 48 + LD B,#43 ;!HARDCODE page + ;[x] SET_PORTS: no need to call from #3D13 and DI. 31/12/23 + ;CALL .SET_ROM + CALL SET_PORTS + ; - LD A,#E1 ;!HARDCODE ROM-ID - TR-DOS - LD B,#44 ; page - CALL .SET_ROM + LD A,ACEX.vROM.TR_DOS ; ROM-ID - TR-DOS + LD B,#44 ;!HARDCODE page + ;[x] SET_PORTS: no need to call from #3D13 and DI. 31/12/23 + ;CALL .SET_ROM + CALL SET_PORTS + ; - ; LD A,#E0 ;!HARDCODE ROM-ID - BIOS - ; LD B,#45 ; page - ; CALL .SET_ROM + ; LD A,ACEX.vROM.BIOS ; ROM-ID - BIOS + ; LD B,#45 ;!HARDCODE page + ;[x] SET_PORTS: no need to call from #3D13 and DI. 31/12/23 + ;CALL .SET_ROM + CALL SET_PORTS + ; - ; LD A,#EB ;!HARDCODE ROM-ID - BIOS-1 - ; LD B,#45 ; page - ; CALL .SET_ROM - - ; LD A,#EF ;!HARDCODE ROM-ID - BIOS-2 - ; LD B,#47 ; page - ; CALL .SET_ROM + ; LD A,ACEX.vROM.BIOS_3 ; ROM-ID - BIOS-1 + ; LD B,#45 ;!HARDCODE page + ;[x] SET_PORTS: no need to call from #3D13 and DI. 31/12/23 + ;CALL .SET_ROM + CALL SET_PORTS + ; + ; LD A,ACEX.vROM.BIOS_4 ; ROM-ID - BIOS-2 + ; LD B,#47 ;!HARDCODE page + ;[x] SET_PORTS: no need to call from #3D13 and DI. 31/12/23 + ;CALL .SET_ROM + CALL SET_PORTS + ; RET + ;[x] SET_PORTS: no need to call from #3D13 and DI. 31/12/23 .SET_ROM: - LD C,BIOS.SET_PORTS - JP ToBIOS_3D13 - + ;LD C,BIOS.SET_PORTS + ;JP ToBIOS_3D13 + ; ENT .length EQU $-init_zx_roms ;-----------------------------------------------------------------------; @@ -1536,15 +1561,15 @@ DOS_ON: NOP _mInfoBLOCK #3E00-$,#FF DOS_OFF: 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 RET ;*************************************** diff --git a/src/bios/rom/ZX/ZX_MENU.ASM b/src/bios/rom/ZX/ZX_MENU.ASM index a7e543d..54cb079 100644 --- a/src/bios/rom/ZX/ZX_MENU.ASM +++ b/src/bios/rom/ZX/ZX_MENU.ASM @@ -428,7 +428,10 @@ CLEAR_RAM: ; поэтому отключаем перехват ресета. LD A,ACEX.RET_PORT LD BC,BIOS.SET_PORTS - CALL ToBIOS_3D13 + ;[x] SET_PORTS: no need to call from #3D13 and DI. 31/12/23 + ;CALL ToBIOS_3D13 + RST_to_BIOS + ; EI RET diff --git a/src/bios/rom/ZX_MODE.ASM b/src/bios/rom/ZX_MODE.ASM index 5857205..b610b83 100644 --- a/src/bios/rom/ZX_MODE.ASM +++ b/src/bios/rom/ZX_MODE.ASM @@ -70,7 +70,10 @@ CLEAR_RAM: ;!TODO придумать как отключать перехват только на возврат в DSS LD A,ACEX.RET_PORT LD BC,BIOS.SET_PORTS - CALL ToBIOS_3D13 + ;[x] SET_PORTS: no need to call from #3D13 and DI. 31/12/23 + ;CALL ToBIOS_3D13 + RST_to_BIOS + ; EI RET diff --git a/src/bios/shared/RECOVERY.IMG b/src/bios/shared/RECOVERY.IMG index 1ecf1190c72757b15eaafe661448624c99dd0c18..d8a8bed06a0a4c4c895554e1c39ab4ce01f8c0be 100755 GIT binary patch delta 10164 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 delta 10008 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