From 22f4acafbe2491f8e40a8639b23346f01ddefc0f Mon Sep 17 00:00:00 2001 From: Tolik <85737314+Tolik-Trek@users.noreply.github.com> Date: Sat, 14 Sep 2024 02:57:40 +1000 Subject: [PATCH] continue freeing zx pages... --- Shared_Includes | 2 +- src/bios/exp/FUNC_ZX.ASM | 255 ++++++++++++++++++++++++++++-------- src/bios/rom/ZX/ZX_FUNC.ASM | 60 ++++----- 3 files changed, 227 insertions(+), 90 deletions(-) diff --git a/Shared_Includes b/Shared_Includes index a98a635..265b46f 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit a98a635f03359ec21cd8dd77917a384a8a37caef +Subproject commit 265b46fce2afbc3e8acef59e83d78b84b88d4ced diff --git a/src/bios/exp/FUNC_ZX.ASM b/src/bios/exp/FUNC_ZX.ASM index ad2b3e9..b87c86a 100644 --- a/src/bios/exp/FUNC_ZX.ASM +++ b/src/bios/exp/FUNC_ZX.ASM @@ -5,7 +5,11 @@ ;[~] 2 - Грузит ПЗУ спектрума из ROM при каждом перезапуске (может быть опасно) ;[ ] 3 - Не грузить ПЗУ спектрума, инитить страницу #41 так, чтоб код в ней подгружал ПЗУ спектрума при обращении ;-------------------------------------------------------------------------------------------------------------------; - +; 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' ; ; _ZX_ _ZX_ _ZX_ _ZX_ _ZX_ [___FOR ZX-MODE___] _ZX_ _ZX_ _ZX_ _ZX_ _ZX_ ; @@ -19,62 +23,172 @@ ;!FIXIT ;----------------[Выделение/освобождение страниц спектрума]-------------; -;вход: рег B: 0 - инит памяти Spectrum 48k и 2-х страниц vROM -; 1 - инит памяти Pentagon 128k и 3-х страниц vROM -; 2 - инит памяти Pentagon 512k и 3-х страниц vROM -; 3 - инит памяти Scorpion 256k и 3-х страниц vROM -; 4..15 - зарезервированы +;вход: рег B: 0 - зарезервировано +; 1 - выделение памяти Pentagon 48k. 3 страницы +; 2 - выделение памяти Pentagon 128k. 2+6 страницы +; 3 - выделение памяти Pentagon 512k. 2+30 страницы +; 4 - выделение памяти Scorpion 256k. 2+6+8 страницы +; 5..15 - зарезервированы +; ; 16 - получить рамблоки инициализированных vROM и VRAM -; 17..63 - зарезервированы +; 17..31 - зарезервированы +; +; 32 - зарезервировано +; 33 - выделение памяти Spectrum 48k и инит 2-х страниц vROM +; 34 - выделение памяти Pentagon 128k и инит 3-х страниц vROM +; 35 - выделение памяти Pentagon 512k и инит 3-х страниц vROM +; 36 - выделение памяти Scorpion 256k и инит 3-х страниц vROM +; 33..63 - зарезервированы +; ; 64 - освободить рамблоки vROM и vRAM ; 65..127 - зарезервированы +; ; 128 - инициализировать свой набор страниц vROM +; ; рег HL: при рег B[7]=1 адрес страниц (11 шт): ; byte1 - RAM block ID, byte2..11 - страницы для vROM ; рег A: номер ZX TASK пока что всегда ноль!!! ;выход: CF = 0: HL - номера рамблоков для режимов 0..16. H=vRAM, L=vROM ; CF = 1: A - номер ошибки -FN_ENTRANCE: +; +;если стэк находится в третьем слоте, то вызов с выключенными прерываниями +FN_ENTRANCE: ;!TODO A - TASK NUMBER + EXX + GET_ZX_TASK_DATA_OFFSET + ADD A,_#ZX_TASK_DATA + LD C,A + LD B,0 + LD IX,SYS_PAGE.ZX_TASK.CURRENT + ADD IX,BC ; данные новой задачи + ; + LD C,SLOT3 + IN B,(C) + LD A,SYS_PAGE + OUT (C),A + EXX + ; + LD (SYS_PAGE.SP_SAVE),SP + LD SP,SYS_PAGE.SYS_SP + LD DE,.EXIT + PUSH DE + ;-----------------------------------; + ; Sub FN #8x + BIT 7,B + JR NZ,INIT_vROM ; B = 128 + ; Sub FN #4x + BIT 6,B + JR NZ,FREE_vMEMORY ; B = 64 + ; Sub FN #1x + JR NZ,GET_RAMBLOCK_IDs ; B = 16 + ; Sub FN #0x + DEC B + JR Z, ; B = 1 + DEC B + JR Z, ; B = 2 + DEC B + JR Z, ; B = 3 + DEC B + JR Z, ; B = 4 + ;-----------------------------------; + LD A,BIOS.Error.InvalidSubFunction + SCF + RET + ; +.EXIT: LD SP,(SYS_PAGE.SP_SAVE) + EXX + OUT (C),B + EXX + RET ;-----------------------------------------------------------------------; -;!FIXIT + ;-----------------------------------------------------------------------; -;Вход: --- +;Вход: A - TASK NUMBER +FREE_vMEMORY: LD D,(IX + _#ZX_TASK_DATA.vROM_ID) + LD A,(IX + _#ZX_TASK_DATA.vRAM_ID) + CALL EMM.FreeMem + LD A,D + CALL EMM.FreeMem + JP RES_FLAG_ZXvROM +;-----------------------------------------------------------------------; + + + +;-----------------------------------------------------------------------; +;Вход: A - TASK NUMBER ;Выход: H - vRAM block ID ; L - vROM block ID GET_RAMBLOCK_IDs: + LD H,(IX + _#ZX_TASK_DATA.vRAM_ID) + LD L,(IX + _#ZX_TASK_DATA.vROM_ID) + RET ;-----------------------------------------------------------------------; -;!FIXIT ;-----------------------------------------------------------------------; -;Вход: HL - блок страниц на которые маппим (всегда 10 шт.) -FREE_vROM: +;Вход: HL - блок страниц на которые маппим (всегда 11 шт.) +; A - TASK NUMBER +INIT_vROM: LD A,(IX + _#ZX_TASK_DATA.vROM_ID) + CP (HL) + EX DE,HL + CALL NZ,EMM.FreeMem + EX DE,HL + ; + LD A,(HL) + LD (IX + _#ZX_TASK_DATA.vROM_ID),A + INC HL + ; установка портов ROM + LD DE,.PORTS + LD B,.PORTS.Size +.loop: PUSH BC + LD A,(HL) + INC HL + AND A + JR Z,.not_Spec_Page + LD A,Spec_Page ;!FIXIT или оставить? +.not_Spec_Page: LD B,A + LD A,(DE) + INC DE + PUSH DE + PUSH HL + CALL SET_PORTS + POP HL + POP DE + POP BC + DJNZ .loop + ; + RET + ; +.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.BIOS ; ROM-ID - EXPANSION + DB ACEX.vROM.BIOS_3 ; ROM-ID - BIOS-1 + DB ACEX.vROM.BIOS_4 ; 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.BIOS_2 ; BIOS (ZX_EXP) - 2 +.PORTS.Size EQU $-.PORTS ;-----------------------------------------------------------------------; -;!FIXIT +;????? надо? +/* ;-----------------------------------------------------------------------; -;Вход: HL - блок страниц на которые маппим (всегда 10 шт.) -FREE_vRAM: -;-----------------------------------------------------------------------; - -;!FIXIT -;-----------------------------------------------------------------------; -;Вход: B - количество страниц -GET_vROM: -;-----------------------------------------------------------------------; - -;!FIXIT -;-----------------------------------------------------------------------; -;Вход: HL - блок страниц на которые маппим (всегда 10 шт.) -INIT_vROM: +;Вход: A - TASK NUMBER +FREE_vROM: LD A,(IX + _#ZX_TASK_DATA.vROM_ID) + CALL EMM.FreeMem + PUSH AF + CALL RES_FLAG_ZXvROM + POP AF + RET ;-----------------------------------------------------------------------; +*/ - - +/* ;-----------------------------------------------------------------------; ;ВХОД: HL - список страниц ; E - 0 = 128kb, 1 = 512kb @@ -107,7 +221,7 @@ INIT_PENT_vRAM: DI RET ;-----------------------------------------------------------------------; - +;!FIXIT косяк со стеком в SLOT3 ;-----------------------------------------------------------------------; ;ВХОД: HL - список страниц ; D - начальное значение для 7FFD @@ -123,7 +237,7 @@ SET_7FFD: LD A,(HL) ;-----------------------------------------------------------------------; -;!FIXIT +;!FIXIT косяк со стеком в SLOT3 ;ВХОД: HL - список страниц. INIT_SCORP_vRAM:; first 128 kb LD E,0 @@ -136,28 +250,59 @@ INIT_SCORP_vRAM:; first 128 kb OUT (C),A RET ;-----------------------------------------------------------------------; +*/ + ;-----------------------------------------------------------------------; -;Выполняется для инита трёх страниц ОЗУ 48k -GET_48k_MEM: LD B,3 - JP EMM.GetMem +;Выполняется для выделения трёх страниц ОЗУ 48k +GET_48k_MEM: LD D,3 + JR GET_XXX_MEM +;Выполняется для инита 3 страниц ОЗУ 48k и 29 страниц ОЗУ Pent512k +GET_512k_MEM: LD D,3+29 + JR GET_XXX_MEM +;Выполняется для выделения 3 страниц ОЗУ 48k и 5 страниц ОЗУ 128k тачек +GET_128k_MEM: LD D,3+5 + ;JR GET_XXX_MEM +GET_XXX_MEM: CALL FREE_vRAM +.init: LD B,D + CALL EMM.GetMem + RET C + LD (IX + _#ZX_TASK_DATA.vRAM_ID),A + RET ;-----------------------------------------------------------------------; -;-----------------------------------------------------------------------; -;Выполняется для инита 3 страниц ОЗУ 48k и 5 страниц ОЗУ 128k тачек -GET_128k_MEM: LD B,3+5 - JP EMM.GetMem -;-----------------------------------------------------------------------; ;-----------------------------------------------------------------------; +FREE_vRAM: XOR A + LD C,A + OR (IX + _#ZX_TASK_DATA.vRAM_ID) + RET Z + LD (IX + _#ZX_TASK_DATA.vRAM_ID),C + JP EMM.FreeMem +;-----------------------------------------------------------------------; + + +;!FIXIT SET_TASK_POINTER +;-----------------------------------------------------------------------; +;Выполняется для выделения 3 страниц ОЗУ 48k и 14 страниц ОЗУ Scorp256k ;Вход: --- ;Выход: A - RAM block ID -GET_SCORP_RAM: IN A,(SLOT3) - LD E,A - LD A,SYS_PAGE - OUT (SLOT3),A - ; выделить страницы скорпа +GET_SCORP_RAM: CALL FREE_vRAM + CALL .SCORP + RET C + LD D,L + ; Get Pent128 mem + LD B,3+5 + CALL EMM.GetMem + ; A - Pent128 mem block id + LD B,D ; Scorp128 mem block id + CALL EMM.MergeMemBlocks + LD (IX + _#ZX_TASK_DATA.vRAM_ID),A + RET + ; +.SCORP: ; выделить страницы скорпа XOR A + LD DE,#F0D0 ; для фильтра. #F0 - маска, #D0 - страницы ISA #D0..#DF LD BC,8*256 + #FF ; B - количество страниц, C - Метка конца рамблока LD HL,SYS_PAGE.RAM_TABLE .allocate_loop: DEC L @@ -174,10 +319,8 @@ GET_SCORP_RAM: IN A,(SLOT3) DJNZ .allocate_loop ; L = указатель цепочки. AND A -.exit: LD A,E - OUT (SLOT3),A - LD A,L RET + ; ; фильтр для страниц скорпа ;выход: ZF=1 - страница не подходит .check_barred_pages: @@ -187,19 +330,19 @@ GET_SCORP_RAM: IN A,(SLOT3) RET C RET Z ; check isa page - AND #F0 - XOR #D0 ; страницы ISA #D0..#DF + AND D + XOR E ; страницы ISA #D0..#DF RET NZ - LD L,#D0 + LD L,E RET ; -.error_no_mem: PUSH DE +.error_no_mem: ;PUSH DE LD A,C CALL EMM.FreeMem - POP DE - LD L,BIOS.Error.EMM.NoMemory + ;POP DE + LD A,BIOS.Error.EMM.NoMemory SCF - JR .exit + RET ;-----------------------------------------------------------------------; ENDMODULE ENDIF @@ -255,7 +398,7 @@ GOTO_SPEC: IN A,(SLOT3) ;start_basic: .BASIC_128: LD SP,#C000 LD HL,RES128_PROG - LD DE,ZX_VARS.PRINTER_BUFFER ; запуск программы на BASIC-е. + LD DE,ZX_VARS.PRINTER_BUFFER ; запуск программы на BASIC-е. LD BC,RES128_PROG.Size LDIR DI diff --git a/src/bios/rom/ZX/ZX_FUNC.ASM b/src/bios/rom/ZX/ZX_FUNC.ASM index 5a2fcf9..0188c74 100644 --- a/src/bios/rom/ZX/ZX_FUNC.ASM +++ b/src/bios/rom/ZX/ZX_FUNC.ASM @@ -41,6 +41,16 @@ RET_FROM_BIOS_TO_BASIC48: ; ******* SERVICE ******* ;-----------------------------------------------------------------------; +; коэффициент смещения по номеру таски + MACRO GET_ZX_TASK_DATA_OFFSET + RLCA + RLCA + RLCA + RLCA + AND #30 ; новая задача 0..3 + ENDM + + ;------[ ДЕШИФРАЦИЯ КОМАНДНОЙ СТРОКИ,ПЕРЕДАННОЙ ДЛЯ "EXPANSION" ]-------; COMAND_LINE: LD HL,(#5C5D) ;!HARDCODE CH_ADR @@ -119,12 +129,8 @@ TASK_SWITCH: PUSH AF LD A,(HL) - RLCA - RLCA - RLCA - RLCA - AND #30 ; новая задача 0..3 - LD C,A + GET_ZX_TASK_DATA_OFFSET + LD C,A IN A,(SLOT3) LD B,A ; 3-я страница текущей задачи @@ -132,44 +138,32 @@ TASK_SWITCH: OUT (SLOT3),A LD IX,SYS_PAGE.ZX_TASK.CURRENT ; данные задач - ; !TEST - ;LD E,(IX) - ;LD D,0 - ;ADD IX,DE - ;LD E,SYS_PAGE.CURRENT_TASK.Size - ;ADD IX,DE - LD A,_#ZX_TASK_DATA ; смещение данных в таблице задач - ADD A,(IX) ; смещение данных текущей задачи - LD E,A - LD D,0 - ADD IX,DE ; данные текущей задачи - ; + 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),L ; сохранить стек задачи LD (IX + _#ZX_TASK_DATA.SP + 1),H - SET 0,(IX + _#ZX_TASK_DATA.STATE) ; установить флаг сохраненности текущей задачи - RES 1,(IX + _#ZX_TASK_DATA.STATE) ; установить флаг, что задача покинута + SET 0,(IX + _#ZX_TASK_DATA.STATE) ; установить флаг сохраненности текущей задачи + RES 1,(IX + _#ZX_TASK_DATA.STATE) ; установить флаг, что задача покинута LD IX,SYS_PAGE.ZX_TASK.CURRENT - ; !TEST - ;LD E,C - ;LD D,0 - ;ADD IX,DE ; новая задача - ;LD E,16 - LD A,_#ZX_TASK_DATA ; смещение данных в таблице задач - ADD A,C ; смещение данных новой задачи - LD E,A - LD D,0 - ; + 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) ; была сохранена/нет + BIT 0,(IX + _#ZX_TASK_DATA.STATE) ; была сохранена/нет JR NZ,TASK_SET ; задача существует ; задачи не было! @@ -199,7 +193,7 @@ TASK_RESTORE: ;LD D,0 ;ADD IX,DE ; новая задача ;LD E,16 - ADD A,_#ZX_TASK_DATA ; смещение данных в таблице задач + ADD A,_#ZX_TASK_DATA ; смещение данных в таблице задач LD E,A LD D,0 ;