From 421eee63a94e778e3c567a2a546f260c5ed53f37 Mon Sep 17 00:00:00 2001 From: Tolik <85737314+Tolik-Trek@users.noreply.github.com> Date: Sun, 6 Oct 2024 20:07:18 +1000 Subject: [PATCH] ... --- Shared_Includes | 2 +- src/bios/exp/BIOS_FUNC.asm | 2 +- src/bios/exp/EXP.asm | 4 +- src/bios/exp/FUNC_SERVICE.asm | 10 +- src/bios/rom/ROM.asm | 14 +- src/bios/rom/SETUP/MAIN.asm | 5 +- src/bios/rom/ZX/ZX_FUNC.ASM | 363 +++++++++++++++++----------------- src/bios/rom/ZX/ZX_MENU.ASM | 297 ++++++++++++---------------- src/bios/shared/RECOVERY.IMG | Bin 98304 -> 98304 bytes 9 files changed, 327 insertions(+), 370 deletions(-) diff --git a/Shared_Includes b/Shared_Includes index 817bba0..7e00c2a 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 817bba0c1abebdb890f77ee129578ebe06fb5131 +Subproject commit 7e00c2aa909241367878004ad104b56abb907f80 diff --git a/src/bios/exp/BIOS_FUNC.asm b/src/bios/exp/BIOS_FUNC.asm index 189062e..0e3ecd5 100644 --- a/src/bios/exp/BIOS_FUNC.asm +++ b/src/bios/exp/BIOS_FUNC.asm @@ -229,7 +229,7 @@ TAB_FNS: DB low RST_CONF.SP97_1 ; #F0 для совместимости с софтом Sp97 DB low RST_CONF.SP97_2 ; #F1 для совместимости с софтом Sp97 DB low FN_SYNC ; #F2 установка синхронизации - DB low RST_CONF.CUSTOM ; #F3 для совместимости с софтом Sp97 + DB low RST_CONF.CUSTOM ; #F3 для совместимости с софтом Sp97 DB low DCP_CONFIG ; #F4 функция распределения портов ; [x] DB low CMOS_TEST ; #F5 DB low CMOS_RD ; #F6 diff --git a/src/bios/exp/EXP.asm b/src/bios/exp/EXP.asm index 2a0f2eb..edd5faf 100644 --- a/src/bios/exp/EXP.asm +++ b/src/bios/exp/EXP.asm @@ -1122,9 +1122,9 @@ ZG_ADDRESS: INCLUDE 'FONT.ASM' ;************************* _mInfoBLOCK #3CE0-$,0 SW_ROM_1: - LD HL,#259F ;!HARDCODE Show Main Menu in BASIC-128 + LD HL,#259F ;!HARDCODE BASIC_FN.x128.show_main_menu PUSH HL - LD HL,#5B00 ;!HARDCODE + LD HL,#5B00 ;!HARDCODE BASIC_FN.x128.ROM_SWAP LD A,(HL) CP #F5 ; #F5 - опкод 'PUSH AF'. Проверяется то ли в #5B00 JR Z,JP_HL_48 ; ВОЗВРАТ К МЕНЮ BASIC128 diff --git a/src/bios/exp/FUNC_SERVICE.asm b/src/bios/exp/FUNC_SERVICE.asm index a0f622c..7cdfb7b 100644 --- a/src/bios/exp/FUNC_SERVICE.asm +++ b/src/bios/exp/FUNC_SERVICE.asm @@ -54,8 +54,8 @@ RST_CONF: ;--[] ;--[] -.CUSTOM: - CP #80 +.CUSTOM: + CP #80 ;!FIXIT тут теперь может любое число быть у старых прог ; [ ] free zx pages JR NC,.CHOOSE_CNF ; only for old FLEX10K soft compatible LD C,SLOT3 @@ -95,6 +95,12 @@ RST_CONF: ; ;[x] .CHOOSE_CNF: + ; [ ] bug with "free zx pages" + LD C,A + IN A,(SLOT3) + CP C + LD A,C + JR Z,.INT_PLD ; [x] CP ACEX.Config_PG.Sp2000_SoftSetUp JP Z,.ReturnSoftReset diff --git a/src/bios/rom/ROM.asm b/src/bios/rom/ROM.asm index 8885861..688c692 100644 --- a/src/bios/rom/ROM.asm +++ b/src/bios/rom/ROM.asm @@ -151,7 +151,7 @@ RET_FROM_BIOS_TO_BASIC48: CALL CH_2 CALL COMAND_LINE ; ВЫПОЛНЕНИЕ КОМАНДЫ, ЕСЛИ ЕСТЬ ; Вход без команды - JP SW_ROM_1 ; ВОЗВРАТ В << MAIN MENU >> + JP _SW_ROM_1 ; ВОЗВРАТ В << MAIN MENU >> INCLUDE 'ZX/ZX_FUNC.ASM' INCLUDE 'ZX/ZX_MENU.ASM' ;-----------------------------------------------------------------------; @@ -245,21 +245,21 @@ BLOCK_Setup.Length EQU $-BLOCK_Setup ;************************* _mInfoBLOCK #3CE0-$,#FF ;!TEST 0 -;SW_ROM_1: +_SW_ROM_1 EQU SW_ROM_1 LD HL,#259F ;!HARDCODE Show Main Menu in BASIC-128 PUSH HL LD HL,#5B00 ;!HARDCODE LD A,(HL) CP #F5 ; #F5 - опкод 'PUSH AF'. Проверяется в #5B00 - JR Z,JP_HL_48 ; ВОЗВРАТ К МЕНЮ BASIC128 + JR Z,_JP_HL_48 ; ВОЗВРАТ К МЕНЮ BASIC128 POP HL - JR SW_ROM ; ПРОСТОЙ ВОЗВРАТ + JR _SW_ROM_1 ; ПРОСТОЙ ВОЗВРАТ ;************************* _mInfoBLOCK #3CF0-$,#FF ;!TEST 0 ;JMP_48: ; LD HL,00h -; JR JP_HL_48 +; JR _JP_HL_48 ; ; NOP ; NOP @@ -268,9 +268,9 @@ BLOCK_Setup.Length EQU $-BLOCK_Setup ;*************************************** _mInfoBLOCK #3CF8-$,#FF ;!TEST 0 ; no basic-48! -;P_HL_48: +_JP_HL_48 EQU JP_HL_48 PUSH HL -;SW_ROM: +_SW_ROM EQU SW_ROM PUSH AF LD A,ROM.BIOS OUT (SYS_PORT.RAM),A diff --git a/src/bios/rom/SETUP/MAIN.asm b/src/bios/rom/SETUP/MAIN.asm index 67b67aa..83b9513 100644 --- a/src/bios/rom/SETUP/MAIN.asm +++ b/src/bios/rom/SETUP/MAIN.asm @@ -827,7 +827,7 @@ ALT_BOOT: ;EI CALL INT_ON -AGAKEY: CALL WAITKEY +StartUpKey: CALL WAITKEY LD HL,#4F00 ; DEL - go to settings ;AND A SBC HL,DE @@ -836,7 +836,7 @@ AGAKEY: CALL WAITKEY CP #1B ; ESC - go to zx spectrum mode JP Z,EXIT_SETUP CP #0D ; ENTER - restart - JP NZ,AGAKEY + JP NZ,StartUpKey XOR A JP Start_again @@ -1755,7 +1755,6 @@ ZXMODE_SETUP: IN A,(SLOT3) ; JP MANAGE_ZX_PAGES.INIT_vROM ; XOR A ;LD A,SYS_PORT.BIOS ; OUT (SYS_PORT.ROM),A - XOR A LD BC,128*256 + BIOS.ZX_MEMORY_MANAGER ; [ ] free zx pages! HARDCODE JP ToBIOS_18 ;RET diff --git a/src/bios/rom/ZX/ZX_FUNC.ASM b/src/bios/rom/ZX/ZX_FUNC.ASM index 2ed7360..b492e00 100644 --- a/src/bios/rom/ZX/ZX_FUNC.ASM +++ b/src/bios/rom/ZX/ZX_FUNC.ASM @@ -87,137 +87,6 @@ COMMAND_HARDWARE_MENU: POP BC CALL Hardware_Menu JP SW_ROM_1 - -/* -;!TODO переделать под переключение на разные спектрумы с запущенными задачами - -TASK_SWITCH: -; *** Сохранить задачу *** - PUSH IY - PUSH IX - PUSH AF - PUSH BC - PUSH DE - PUSH HL - - EXX - EX AF,AF' - - PUSH AF - PUSH BC - PUSH DE - PUSH HL - - LD A,R - PUSH AF - LD A,I - PUSH AF - - LD A,(HL) - GET_ZX_TASK_DATA_OFFSET - LD C,A - - IN A,(SLOT3) - LD B,A ; 3-я страница текущей задачи - LD A,SYS_PAGE - OUT (SLOT3),A - - LD IX,SYS_PAGE.ZX_TASK.CURRENT ; данные задач - LD A,_ZX_TASK_DATA ; смещение данных в таблице задач - ADD A,(IX) ; смещение данных текущей задачи - LD E,A - LD D,0 - ADD IX,DE ; данные текущей задачи - - LD (IX + _ZX_TASK_DATA.SLOT3_PAGE),B ; сохранить страницу 3 - LD HL,0 - ADD HL,SP - LD (IX + _ZX_TASK_DATA.SP),L ; сохранить стек задачи - LD (IX + _ZX_TASK_DATA.SP + 1),H - SET 0,(IX + _ZX_TASK_DATA.STATE) ; установить флаг сохраненности текущей задачи - RES 1,(IX + _ZX_TASK_DATA.STATE) ; установить флаг, что задача покинута - - LD IX,SYS_PAGE.ZX_TASK.CURRENT - LD A,_ZX_TASK_DATA ; смещение данных в таблице задач - ADD A,C ; смещение данных новой задачи - LD E,A - LD D,0 - ADD IX,DE ; данные новой задачи - -; BIT 1,(IX + _ZX_TASK_DATA.STATE) -; JR NZ,TASK_IN_WORK ; задача в работе ??? неверное завершение -; ; сбрасывать или просто возвращаться - - BIT 0,(IX + _ZX_TASK_DATA.STATE) ; была сохранена/нет - JR NZ,TASK_SET ; задача существует - -; задачи не было! - LD IX,SYS_PAGE.ZX_TASK.CURRENT - LD A,C ; задача - LD (IX),A ; установить новую задачу текущей - - JP GOTO_SPEC.START_TASK ; запустить новую задачу! -; ; и пока пофиг распределение памяти! - -TASK_SET: - IF FREE_ZX_PAGES - LD IY,TASK_RESTORE - ELSE - LD IX,TASK_RESTORE - ENDIF - LD A,C - EXX - JP INIT_PAGES ; переключить все страницы! - -TASK_RESTORE: - EXX - LD A,SYS_PAGE - OUT (SLOT3),A - LD A,C - LD IX,SYS_PAGE.ZX_TASK.CURRENT - LD (IX),A ; установить новую задачу текущей - - ; !TEST - ;LD E,A - ;LD D,0 - ;ADD IX,DE ; новая задача - ;LD E,16 - ADD A,_ZX_TASK_DATA ; смещение данных в таблице задач - LD E,A - LD D,0 - ; - ADD IX,DE - - LD L,(IX + _ZX_TASK_DATA.SP) ; вспомнить стек - LD H,(IX + _ZX_TASK_DATA.SP + 1) - LD SP,HL - LD A,(IX + _ZX_TASK_DATA.SLOT3_PAGE); вспомнить третью страницу - OUT (SLOT3),A - - - POP AF ; восстановить - LD I,A - POP AF - LD R,A - POP HL - POP DE - POP BC - POP AF - EX AF,AF' - EXX - POP HL - POP DE - POP BC - POP AF - POP IX - POP IY - ; вернуться в задачу - -NO_TASK: - POP BC - JP SW_ROM_1 -*/ -; 259F - ADRESS BASIC128 - MAIN_MENU ;-----------------------------------------------------------------------; @@ -251,18 +120,11 @@ C_1601: ; OPEN CHANEL ; MANAGE_ZX_PAGES ;-----------------------------------------------------------------------; ;-------------------------------------------------------------------------------------------------------------------; -;!TODO сделать выбор в Setup, что грузить в vПЗУ при старте. Варианты: -;[~] 0 - Не грузить ПЗУ спектрума, инитить страницу #41 как в 3.04 -;[~] 1 - Грузит ПЗУ спектрума из ROM при старте если нет флага ZX -;[~] 2 - Грузит ПЗУ спектрума из ROM при каждом перезапуске (может быть опасно) -;[ ] 3 - Не грузить ПЗУ спектрума, инитить страницу #41 так, чтоб код в ней подгружал ПЗУ спектрума при обращении +;Выбор в Setup, что грузить в vПЗУ при старте. Варианты: +;[x] 0 - Не грузить ПЗУ спектрума, инитить страницу #41 как в 3.04 +;[x] 1 - Грузит ПЗУ спектрума из ROM при старте если нет флага ZX +;[x] 2 - Грузит ПЗУ спектрума из ROM при каждом перезапуске (может быть опасно) ;-------------------------------------------------------------------------------------------------------------------; -; Spectrum RAM map -; SLOT0 = 0 -; SLOT1 = 5 -; SLOT2 = 2 -; SLOT3 = 0 '48kb',1,2,3,4,5,6,7 '128kb',8,9,10,11,12,13,14,15 '256kb' - ; для входа в режим спектрума: ; 0. Проверка метки ZX ; 1. CONFIG_DE.CNF_PORT Тип тачки, как инитить память, размер ОЗУ, турба @@ -274,12 +136,6 @@ C_1601: ; OPEN CHANEL ; _ZX_ _ZX_ _ZX_ _ZX_ _ZX_ [___FOR ZX-MODE___] _ZX_ _ZX_ _ZX_ _ZX_ _ZX_ ; -ZX_MEMORY: -.MODE_48k EQU 3 -.MODE_128k EQU 3+5 -.MODE_256k EQU 3+13 -.MODE_512k EQU 3+29 - ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░; ; [ ] free zx pages! @@ -410,13 +266,13 @@ INIT_vROM: LD A,(HL) .PORTS: DB ACEX.vROM.BASIC_128 ; ROM-ID - BASIC 128 DB ACEX.vROM.BASIC_48 ; ROM-ID - BASIC 48 DB ACEX.vROM.TR_DOS ; ROM-ID - TR-DOS - DB ACEX.vROM.EXPANSION ; ROM-ID - EXPANSION - DB ACEX.vROM.BIOS_1 ; ROM-ID - BIOS-1 - DB ACEX.vROM.BIOS_2 ; ROM-ID - BIOS-2 + DB ACEX.vROM.ZX_EXPANSION ; ROM-ID - EXPANSION + DB ACEX.vROM.ZX_BIOS_1 ; ROM-ID - BIOS-1 + DB ACEX.vROM.ZX_BIOS_2 ; ROM-ID - BIOS-2 DB ACEX.vROM.BASIC_128_2 ; BASIC 128 - 2 DB ACEX.vROM.BASIC_48_2 ; BASIC 48 - 2 DB ACEX.vROM.TR_DOS_2 ; TR-DOS - 2 - DB ACEX.vROM.EXPANSION_2 ; BIOS (ZX_EXP) - 2 + DB ACEX.vROM.ZX_EXPANSION_2; BIOS (ZX_EXP) - 2 .PORTS.Size EQU $-.PORTS ;-----------------------------------------------------------------------; @@ -435,30 +291,31 @@ INIT_vROM: LD A,(HL) ; 17..31 - зарезервированы ; FN 2x ;!TODO ; 32 - зарезервировано -; 33 - выделение памяти Spectrum 48k и инит 2-х страниц vROM +; 33 - выделение памяти Spectrum 48k и инит 1-й страниц vROM ; 34 - выделение памяти Pentagon 128k и инит 3-х страниц vROM ; 35 - выделение памяти Pentagon 512k и инит 3-х страниц vROM ; 36 - выделение памяти Scorpion 256k и инит 3-х страниц vROM ; 33..63 - зарезервированы ; FN 4x ; 64 - освободить рамблоки vROM и vRAM +; 65 - освободить рамблок vRAM +; 66 - освободить рамблок vROM ; 65..127 - зарезервированы ; FN 8x ; 128 - инициализировать свой набор страниц vROM ; ; рег HL: при рег B[7]=1 адрес страниц (11 шт): ; byte1 - RAM block ID, byte2..11 - страницы для vROM - ZXSlot: 1,2,3(=0),расширенная -; рег A: номер ZX TASK пока что всегда ноль!!! ;выход: CF = 0: HL - номера рамблоков для режимов 0..16. H=vRAM, L=vROM ; CF = 1: A - номер ошибки ; ;если стэк находится в третьем слоте, то вызов с выключенными прерываниями FN_ENTRANCE: ;!TODO A - TASK NUMBER AND A - LD A,BIOS.Error.NotSupported - SCF - RET NZ - CCF + ; LD A,BIOS.Error.NotSupported + ; SCF + ; RET NZ + ; CCF ; EXX LD C,SLOT3 @@ -512,6 +369,17 @@ FN_ENTRANCE: ;!TODO A - TASK NUMBER ;-----------------------------------------------------------------------; +FREE_vMEMORY: LD A,B + AND 3 + JR Z,FREE_ALL_vMEMORY ; 0 + DEC A + JR Z,FREE_vRAM ; 1 + DEC A + JR Z,FREE_vROM ; 2 + LD A,BIOS.Error.InvalidSubFunction + SCF + RET +;--------------; FREE_vRAM: LD A,(SYS_PAGE.Block_ID.vRAM) OR A RET Z @@ -521,7 +389,8 @@ FREE_vRAM: LD A,(SYS_PAGE.Block_ID.vRAM) LD (SYS_PAGE.Block_ID.vRAM),A RET ;--------------; -FREE_vMEMORY: CALL FREE_vRAM +FREE_ALL_vMEMORY: + CALL FREE_vRAM ;--------------; FREE_vROM: LD A,(SYS_PAGE.Block_ID.vROM) OR A @@ -549,13 +418,13 @@ RES_FLAG_ZXvROM: ; ;-----------------------------------------------------------------------; ;Выполняется для выделения трёх страниц ОЗУ 48k -GET_48k_MEM: LD D,ZX_MEMORY.MODE_48k +GET_48k_MEM: LD D,BIOS.ZX_MEMORY_MANAGER.MODE_48k JR GET_XXX_MEM ;Выполняется для инита 3 страниц ОЗУ 48k и 29 страниц ОЗУ Pent512k -GET_512k_MEM: LD D,ZX_MEMORY.MODE_512k +GET_512k_MEM: LD D,BIOS.ZX_MEMORY_MANAGER.MODE_512k JR GET_XXX_MEM ;Выполняется для выделения 3 страниц ОЗУ 48k и 5 страниц ОЗУ 128k тачек -GET_128k_MEM: LD D,ZX_MEMORY.MODE_128k +GET_128k_MEM: LD D,BIOS.ZX_MEMORY_MANAGER.MODE_128k ;JR GET_XXX_MEM GET_XXX_MEM: CALL FREE_vRAM .init: LD B,D @@ -577,7 +446,7 @@ GET_SCORP_RAM: CALL FREE_vRAM ; выделить страницы скорпа XOR A LD DE,#F0D0 ; для фильтра. #F0 - маска, #D0 - страницы ISA #D0..#DF - LD BC,256*ZX_MEMORY.MODE_256k/2 + #FF ; B - количество страниц, C - Метка конца рамблока + LD BC,256*BIOS.ZX_MEMORY_MANAGER.MODE_256k/2 + #FF ; B - количество страниц, C - Метка конца рамблока LD HL,SYS_PAGE.RAM_TABLE .allocate_loop: DEC L JR Z,.error_no_mem @@ -595,8 +464,7 @@ GET_SCORP_RAM: CALL FREE_vRAM AND A LD D,L ; Get Pent128 mem - LD B,ZX_MEMORY.MODE_128k - LD C,BIOS.GetMem + LD BC,256*BIOS.ZX_MEMORY_MANAGER.MODE_128k + BIOS.GetMem CALL ToBIOS_FromEXT ;CALL EMM.GetMem ; A - Pent128 mem block id @@ -640,22 +508,16 @@ GET_SCORP_RAM: CALL FREE_vRAM ; 3 - EXPANSION. C закрытыми 128-ми портами: ; 4 - TR-DOS, 5 - BASIC 48 ; E: значение для SYS_PORT/CNF_PORT -; H: ;!TODO Block_ID.vROM -; L: Block_ID.vRAM -; A: TASK Number = 0 +; L: Block_ID.vROM +; H: Block_ID.vRAM ; B: Port All Mode -;A'[1..0]: 1 - int scorp, 2 - int pent, 3 - int ZX +;A [1..0]: 1 - int scorp, 2 - int pent, 3 - int ZX ; A'[2]: 0 - set default palette, 1 - don't change palette ; A'[7]: 0 - 320, 1 - 312 строк -GOTO_SPECTRUM: LD A,BIOS.Error.NotSupported - AND A - SCF - RET NZ - ; -.FN: DI - EX AF,AF' +GOTO_SPECTRUM: DI LD C,A + ; ; set shared pages XOR A OUT (SLOT2),A ; ZERO_PAGE @@ -694,6 +556,13 @@ GOTO_SPECTRUM: LD A,BIOS.Error.NotSupported LD BC,BIOS.SET_PAL_INIT.ZX CALL Z,ToBIOS_FromEXT ; + ; [x] фикс неполной дешифрации порта #FFFD (пишут в #C0FD) для ZX mode + LD A,#FF + LD HL,%00'010'1'1110'1101 + LD DE,%10'111'1'1111'1111 ; CNF_0, CNF_1 + LD BC,ACEX.AY_FFFD_WRITE*256 + BIOS.DCP_CONFIG + CALL ToBIOS_FromEXT + ; LD E,0 LD BC,BIOS.LP_OPEN_S.ZX_32x24_Default CALL ToBIOS_FromEXT @@ -763,17 +632,17 @@ INIT_PAGES: LD A,SYS_PAGE RES 7,H ; LD A,D - CP ZX_MEMORY.MODE_48k + CP BIOS.ZX_MEMORY_MANAGER.MODE_48k JR Z,.set_48k ; LD E,0 ; pent128 - CP ZX_MEMORY.MODE_256k + CP BIOS.ZX_MEMORY_MANAGER.MODE_256k JR Z,.set_scorp ; - CP ZX_MEMORY.MODE_128k + CP BIOS.ZX_MEMORY_MANAGER.MODE_128k JR Z,.set_pent INC E - CP ZX_MEMORY.MODE_512k + CP BIOS.ZX_MEMORY_MANAGER.MODE_512k JR Z,.set_pent ;!FIXIT обработка ошибки DI @@ -890,3 +759,137 @@ RES128_PROG: ;>$< >$< >$< >$< >$< >$< >$< >$< >$< >$< >$< >$< >$< >$< >$< >$< >$< >$<; ; ; _ZX_ _ZX_ _ZX_ _ZX_ _ZX_ _ZX_ _ZX_ _ZX_ _ZX_ _ZX_ _ZX_ _ZX_ _ZX_ _ZX_ ; + + + + +/* +;!TODO переделать под переключение на разные спектрумы с запущенными задачами + +TASK_SWITCH: +; *** Сохранить задачу *** + PUSH IY + PUSH IX + PUSH AF + PUSH BC + PUSH DE + PUSH HL + + EXX + EX AF,AF' + + PUSH AF + PUSH BC + PUSH DE + PUSH HL + + LD A,R + PUSH AF + LD A,I + PUSH AF + + LD A,(HL) + GET_ZX_TASK_DATA_OFFSET + LD C,A + + IN A,(SLOT3) + LD B,A ; 3-я страница текущей задачи + LD A,SYS_PAGE + OUT (SLOT3),A + + LD IX,SYS_PAGE.ZX_TASK.CURRENT ; данные задач + LD A,_ZX_TASK_DATA ; смещение данных в таблице задач + ADD A,(IX) ; смещение данных текущей задачи + LD E,A + LD D,0 + ADD IX,DE ; данные текущей задачи + + LD (IX + _ZX_TASK_DATA.SLOT3_PAGE),B ; сохранить страницу 3 + LD HL,0 + ADD HL,SP + LD (IX + _ZX_TASK_DATA.SP),L ; сохранить стек задачи + LD (IX + _ZX_TASK_DATA.SP + 1),H + SET 0,(IX + _ZX_TASK_DATA.STATE) ; установить флаг сохраненности текущей задачи + RES 1,(IX + _ZX_TASK_DATA.STATE) ; установить флаг, что задача покинута + + LD IX,SYS_PAGE.ZX_TASK.CURRENT + LD A,_ZX_TASK_DATA ; смещение данных в таблице задач + ADD A,C ; смещение данных новой задачи + LD E,A + LD D,0 + ADD IX,DE ; данные новой задачи + +; BIT 1,(IX + _ZX_TASK_DATA.STATE) +; JR NZ,TASK_IN_WORK ; задача в работе ??? неверное завершение +; ; сбрасывать или просто возвращаться + + BIT 0,(IX + _ZX_TASK_DATA.STATE) ; была сохранена/нет + JR NZ,TASK_SET ; задача существует + +; задачи не было! + LD IX,SYS_PAGE.ZX_TASK.CURRENT + LD A,C ; задача + LD (IX),A ; установить новую задачу текущей + + JP GOTO_SPEC.START_TASK ; запустить новую задачу! +; ; и пока пофиг распределение памяти! + +TASK_SET: + IF FREE_ZX_PAGES + LD IY,TASK_RESTORE + ELSE + LD IX,TASK_RESTORE + ENDIF + LD A,C + EXX + JP INIT_PAGES ; переключить все страницы! + +TASK_RESTORE: + EXX + LD A,SYS_PAGE + OUT (SLOT3),A + LD A,C + LD IX,SYS_PAGE.ZX_TASK.CURRENT + LD (IX),A ; установить новую задачу текущей + + ; !TEST + ;LD E,A + ;LD D,0 + ;ADD IX,DE ; новая задача + ;LD E,16 + ADD A,_ZX_TASK_DATA ; смещение данных в таблице задач + LD E,A + LD D,0 + ; + ADD IX,DE + + LD L,(IX + _ZX_TASK_DATA.SP) ; вспомнить стек + LD H,(IX + _ZX_TASK_DATA.SP + 1) + LD SP,HL + LD A,(IX + _ZX_TASK_DATA.SLOT3_PAGE); вспомнить третью страницу + OUT (SLOT3),A + + + POP AF ; восстановить + LD I,A + POP AF + LD R,A + POP HL + POP DE + POP BC + POP AF + EX AF,AF' + EXX + POP HL + POP DE + POP BC + POP AF + POP IX + POP IY + ; вернуться в задачу + +NO_TASK: + POP BC + JP SW_ROM_1 +*/ +; 259F - ADRESS BASIC128 - MAIN_MENU \ No newline at end of file diff --git a/src/bios/rom/ZX/ZX_MENU.ASM b/src/bios/rom/ZX/ZX_MENU.ASM index 26c25af..d6ef0f0 100644 --- a/src/bios/rom/ZX/ZX_MENU.ASM +++ b/src/bios/rom/ZX/ZX_MENU.ASM @@ -164,10 +164,8 @@ SH_4: LD HL,MENU_DAT - MENU_128 CALL RET_SP CALL ZX_VARS.PROG.SWAP_ROM EX AF,AF' - ;LD A,0 - ;OUT (CNF_PORT),A LD A,SYS_PORT.EXTENSION - OUT (SYS_PORT.ROM),A ;!!!!! версия для ПЗУ + OUT (SYS_PORT.ROM),A EX AF,AF' RET MENU_DAT: @@ -438,30 +436,6 @@ CLEAR_RAM: 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 Hardware *** @@ -504,21 +478,6 @@ Hardware_Menu_STR: DC " " ; маркер конца .Size EQU $ - Hardware_Menu_STR -;****************************** -;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 -;****************************** - ;[ ] free zx pages! ;************************************************** @@ -567,9 +526,7 @@ PREPARE_TO_START_ZX: LD A,(SYS_PAGE.Block_ID.vROM) LD L,A LD A,C - EX AF,AF' - XOR A - JP GOTO_SPECTRUM.FN + JP GOTO_SPECTRUM ; .loop_rst: LD BC,BIOS.REINIT.HARD_RESET CALL ToBIOS_FromEXT @@ -598,51 +555,6 @@ ZX_Spectrum_48: LD L,0 ; LD BC,#FA*256 + %1000'0011 JR Pentagon_48.zx -; 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 -; CALL ToBIOS_FromEXT - -; LD HL,#4104 ;!HARDCODE -; LD E,0 -; LD BC,256*4 + BIOS.LP_OPEN_S ;!HARDCODE -; CALL ToBIOS_FromEXT - -; LD HL,#5104 ;!HARDCODE -; LD E,0 -; LD BC,256*4 + BIOS.LP_OPEN_S -; CALL ToBIOS_FromEXT - -; POP DE -; LD A,E -; OUT (SYS_PORT.ROM),A - -; IM 1 -; EI -; JP CLS ;!FIXIT нужно ли? - SPRINTER_reset: DI LD A,CNF_PORT.CNF_0 + CNF_PORT.TURBO.ON @@ -650,81 +562,57 @@ SPRINTER_reset: LD BC,BIOS.REINIT.SOFT_RESET 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 - не думаю, что это нужно, можно заменить RUN_DISK_TRD: - LD HL,C_DISK_C - CALL CALL_DOS1 + LD HL,C_DISK_C + CALL CALL_DOS1 - LD A,SYS_PORT.CNF_0 + SYS_PORT.EXTENSION - OUT (SYS_PORT.ROM),A + ; [ ] исправлен баг с запуском disk.trd с CNF != 0 + LD A,SYS_PORT.CNF_0 + SYS_PORT.EXTENSION + OUT (SYS_PORT.ROM),A + ; - ;CALL DOS_ON - ;LD A,0 ; DETECT_HDD - ;CALL EXP_HDD - LD C,BIOS.HDD_INIT + LD C,BIOS.HDD_INIT CALL ToBIOS_FromEXT - ;CALL DOS_OFF + JR C,.DISK_UTILIT - - JR C,.DISK_UTILIT - - LD HL,C_DISK_C3 - CALL CALL_DOS1 + LD HL,C_DISK_C3 + CALL CALL_DOS1 .UTIL_DISK: XOR A LD C,BIOS.FreeMemRMD CALL ToBIOS_FromEXT - LD HL,C_DEMO6 - CALL CALL_DOS1 + LD HL,C_DEMO6 + CALL CALL_DOS1 XOR A LD C,BIOS.GET_RAMD_ST CALL ToBIOS_FromEXT - JR C,.UTIL_DISK_L1 - JR Z,.UTIL_DISK_L1 + JR C,.UTIL_DISK_L1 + JR Z,.UTIL_DISK_L1 - LD HL,C_DISK_C1 - CALL CALL_DOS1 + LD HL,C_DISK_C1 + CALL CALL_DOS1 ; [ ] исправлен баг с запуском disk.trd с CNF != 0 - IN A,(SLOT3) - EX AF,AF' - LD A,SYS_PAGE - OUT (SLOT3),A - LD A,(SYS_PAGE.CONFIG_DE.CNF_PORT) - EX AF,AF' - OUT (SLOT3),A - EX AF,AF' - OUT (SYS_PORT.ROM),A + IN A,(SLOT3) + EX AF,AF' + LD A,SYS_PAGE + OUT (SLOT3),A + LD A,(SYS_PAGE.CONFIG_DE.CNF_PORT) + EX AF,AF' + OUT (SLOT3),A + EX AF,AF' + OUT (SYS_PORT.ROM),A ; - LD HL,C_DISK_C2 - CALL CALL_DOS1 + LD HL,C_DISK_C2 + CALL CALL_DOS1 RET .UTIL_DISK_L1: @@ -749,6 +637,31 @@ RUN_DISK_TRD: C_DEMO6: DB .Size, ZX_Token.rem, ':/disk.trd', 13,80 .Size EQU $-C_DEMO6-1 +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 +; + ;*************************************** ;VERSION: DEFB 22,21,0 @@ -756,44 +669,80 @@ C_DEMO6: DB .Size, ZX_Token.rem, ':/disk.trd', 13,80 ;********************************************** -DOS_RUN: - LD HL,C_DISK_C1 - CALL CALL_DOS1 +;****************************** +;SP_DOS: +; LD B,#E2 +; LD A,#E1 +; JR TR_DOS1 +;TR_DOS: +; LD B,#EA +; LD A,#E1 +;TR_DOS1: +; CALL DOS_ON +; CALL SET_ROM_PAGES +; CALL DOS_OFF +; RET +;****************************** - 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 +; _SET_CNF: +; ;DI +; LD A,CNF_PORT.CNF_0 + CNF_PORT.TURBO.ON +; OUT (SYS_PORT.ROM),A +; RET -C_DISK_C: DB .Size, ZX_Token.rem, ':', 13,80 -.Size EQU $-C_DISK_C-1 +; CNF_SC_312: +; LD A,Port_VSYNC.SET_312L +; OUT (Port_VSYNC),A +; RET -C_DISK_C0: DB .Size, ZX_Token.rem, ':/CLEAR E', 13,80 -.Size EQU $-C_DISK_C0-1 +; 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 -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 +; DOS_RUN: LD HL,C_DISK_C1 +; CALL CALL_DOS1 +; ; +; LD HL,C_DISK_C2 +; CALL CALL_DOS1 +; RET -C_DISK_C3: DB .Size, ZX_Token.rem, ':/HDD', 13,80 -.Size EQU $-C_DISK_C3-1 +; 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_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 +;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 diff --git a/src/bios/shared/RECOVERY.IMG b/src/bios/shared/RECOVERY.IMG index 06a94c77fe6a1e013be05fd1df7de65c0ae64ac5..0b5faa5c6281c16fc2555121540d04506b87f9c3 100755 GIT binary patch delta 603 zcmYjNU1(Ba82*mu=ybWQ6Duti+c(BKcrnD$5MxFKmITt+XqiC-WppEr{g}o!D+fZO z(K)l5U1Tf2Gqus+uv(YHgi1a_kU`Q1laLW%(@bg?la55u&GWwR^SnIo%M%Ew0s+;^ z%SJi^Y{Kit!)m!YL!jIy-D&QmcX+yty@ELtbAOiF&j)G7*lRQk zqVs~%*xO??OU%W$x>i*pm08c@_C%_%ZfOc#J^*l=v^f%{se~{wessEu*sW*Qo9PoU zyYyy_XDu_}D~UrzYz?W8`J$_W@T132A?D_y!~uwnA|3^C(^!mjenmc$ zvWRY(z6lnuskMZNSF@Wpl+msO?Ajo`ls_8BVDJMX-r0o7B3pM^!(lP_*<9ZsVq_Nvi OsC&A}SGq~+i{dwq$P~W- delta 580 zcmYjNT}V@582--A+1%#Tj<}qXv`XHixG^>e$-t=7tK3q)HYpN%M^xD z;5n@uFVf+@<7P&1$PBuXHHZ%1g}VqFeBdsIgq_(EsR&1BM9|IizR&Z%yzj#ki|Jx9 z-K!NN?W=DV-WogfY8{M&$|31NV<*L%J~1y%8v|0oWIspsO7ta*hVi5WMd|RBNt)q$ zx}AbJIH2Wvy1JbbGxVXgg;~n2uN85}Qm(Y-YKUJu2ynZ!8BEYrS_p@Z-QPv*)`I({ zd>ZB#->>qlYs!5?_QLW%a!c-m#`NC_>z#B5;nowp%EMihUFYHGB5vnl?okZ^!0UY0 zJBfeH!jPycE^}P88sL$%+GjVA;(yI6{k9ammsAD3oPgJpSa5{vhYHiFJr)4Bl^^c9 zaOONV@RcIo6UMkQ5H%(lr-2Ity*J zx6m0cxoKSGi-l=nCVZ4p5WFnB3%3pLAeog9$gTe)_Z=x`zaf``2;5v|_28tPA#Ijl zq@?(F5E)@eKudf&;;GAhE-L;C!q1*VAQm2{hz}4CMMg9vKx1*P^9vf|w$Ui}RX7ph zTFQt-4EsgL4%+vDeGg?QIV!?L9sl1Sk_USLC zN9NN2mWAKZtG2rt98ADqMqR3?K{QmG?1pN;U1QN_T~m