From 1a13295ae34a0ac6b737f3d852a7cdb57d86c14a Mon Sep 17 00:00:00 2001 From: Tolik <85737314+Tolik-Trek@users.noreply.github.com> Date: Sun, 6 Oct 2024 23:57:34 +1000 Subject: [PATCH] beta "free zx pages" --- Shared_Includes | 2 +- src/bios/exp/FUNC_SERVICE.asm | 366 ++++++++++++++++++---------------- 2 files changed, 191 insertions(+), 177 deletions(-) diff --git a/Shared_Includes b/Shared_Includes index 7e00c2a..14a3896 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 7e00c2aa909241367878004ad104b56abb907f80 +Subproject commit 14a3896e7283495e2bf55cc81a995f5f1e88e539 diff --git a/src/bios/exp/FUNC_SERVICE.asm b/src/bios/exp/FUNC_SERVICE.asm index 7cdfb7b..ae3dfd9 100644 --- a/src/bios/exp/FUNC_SERVICE.asm +++ b/src/bios/exp/FUNC_SERVICE.asm @@ -39,6 +39,196 @@ RST_CONF: JR .INT_PLD ;--[] + +;--[] +.CUSTOM: LD C,A + ; устанавливаем нулевую карту портов + LD A,CNF_PORT.CNF_0 + OUT (SYS_PORT.ON),A + LD A,C + ; + CP #80 ;!FIXIT тут теперь может любое число быть у старых прог ; [ ] free zx pages + JR NC,.CHOOSE_CNF + ; only for old FLEX10K soft compatible +.crutch: LD C,SLOT3 + IN B,(C) + OUT (C),A ; PAGE с прошивкой + LD DE,(#C090) ; PLD-ID + OUT (C),B ; RET page +;--[] ;JR INT_PLD +.INT_PLD: ; only for old FLEX10K soft compatible + LD C,SLOT3 + IN B,(C) + LD A,SYS_PAGE + OUT (C),A + LD (SYS_PAGE.CONFIG_BYTE),DE + OUT (C),B + ; + LD A,E ; config-byte + CP #FF + LD A,#80 + JR Z,.YES_CBL + XOR A +.YES_CBL: LD BC,CBL.SYS_PORT + OUT (C),A + ; + LD A,E ; config-byte + OR #FE ;!HARDCODE + LD BC,Port_All_Mode ; SYSTEM Spectrum/Sprinter + OUT (C),A + ; + LD A,#3C + OUT (FDC_93.DrvCTRL),A + ; восстанавливаем карту портов + LD C,SLOT3 + IN B,(C) + LD A,SYS_PAGE + OUT (C),A + LD A,(SYS_PAGE.CONFIG_DE.CNF_PORT) + OUT (C),B + OUT (SYS_PORT.ON),A + XOR A + RET + ; + ;[x] +.CHOOSE_CNF: ; [ ] bug with "free zx pages" + LD A,high ZX_MEM_PORT.Scorpion + IN A,(ZX_MEM_PORT) ;!HARDCODE + RRCA + LD A,C + JR C,.not_vRAM_page + ; + IN A,(SLOT3) + CP C + LD A,C + JR Z,.crutch + ; [x] +.not_vRAM_page: CP ACEX.Config_PG.Sp2000_SoftSetUp + JP Z,.ReturnSoftReset + ; + CP ACEX.Config_PG.Sp2000 + JR Z,.INIT_ACEX + ; + CP ACEX.Config_PG.Sp2000_SetUp + JR Z,.SP2000 + ; + ; only for old FLEX10K soft compatible + CP ACEX.Config_PG.Sp97_1 + LD DE,ACEX.Config_ID.Sp97_1 + JR Z,.INT_PLD + ; + CP ACEX.Config_PG.Sp97_2 + LD DE,ACEX.Config_ID.Sp97_2 + JR Z,.INT_PLD + ; + CP ACEX.Config_PG.Sp97_AY + LD DE,ACEX.Config_ID.Sp97_AY + JR Z,.INT_PLD + SCF + RET + ; + ;[x] +.INIT_ACEX: DI + ; устанавливаем нулевую карту портов + ; LD A,CNF_PORT.CNF_0 + ; OUT (SYS_PORT.ON),A + ; и так понятно что делает + IN A,(SLOT3) ; сохраняем номер воткнутой страницы + PUSH AF + LD A,Spec_Page + OUT (SLOT3),A + ; проверяем размер блока с конфой и получаем страницы конфы + LD HL,Spec_Page.bitstream_pages + LD A,B + AND A + JR Z,.INIT_ACEX.ReloadConfFromROM + ; + CALL EMM.GetMemBlkPages + LD A,B + JR C,.INIT_ACEX.ERROR + CP BitStream_SizeInPages+1 ; количество страниц в кэш для бистрима плюс одна + JR NC,.INIT_ACEX.ERROR + LD A,(Spec_Page.bitstream_pages) + INC A + JR Z,.INIT_ACEX.ERROR + ; +.INIT_ACEX.ReloadConfFromROM: + ; закидываем в Spec_Page прогу для заливки конфы + LD HL,.INIT_ACEX.PROGRAM + LD DE,Spec_Page.init_acex + LD BC,.INIT_ACEX.PROGRAM.Size + LDIR + ; если ZF=0, то процедура сделает ресет с перезаливкой из BIOS, иначе из КЭШ + CALL Spec_Page.init_acex + LD BC,BIOS.REINIT.HARD_RESET + ; + ; на входе в BC параметры функции BIOS +.INIT_ACEX.ifSoftreset: + ; сохраняем воткнутые страницы в Spec_Page + IN A,(SLOT0) + LD E,A + IN A,(SLOT1) + LD D,A + IN A,(SLOT2) + POP HL ; восстанавливаем номер воткнутой страницы + LD L,A + LD (Spec_Page.page_0),DE + LD (Spec_Page.page_2),HL + ; достаём адрес возврата в вызывающую функцию и сохраняем в Spec_Page + POP DE + LD HL,RST_18_1.exit + XOR A + SBC HL,DE + JR NZ,.set_ret ; NZ - если вызов был по RST #18 + POP DE ; если вызов был в ОЗУ по RST 8 + INC A +.set_ret: LD (Spec_Page.RET_addr),DE + ; A=0 - SYS_PORT.ON + ; A=1 - SYS_PORT.OFF + LD (Spec_Page.Reload_Version),A + LD HL,0 + ADD HL,SP + LD (Spec_Page.Stack_Point),HL + ; Устанавливаем ключи + LD HL,Spec_Page.flag_R + LD (HL),"R" + INC HL + LD (HL),"S" + INC HL + LD (HL),"T" + ; + ; .. ... ... .. + ;!TODO сделать функцию по заливке своей конфы, перехвату ресета. + ; *. Вход в подфункцию только через RST 08 или #18 + ; *. Сохранить все страницы пользователя в SYS_PAGE для перехвата ресета + ; *. Достать со стека адрес возврата и сохранить в SYS_PAGE для перехвата ресета + ; *. Сохранить куда-нибудь значение стека + ; * + ; .. ... ... .. + ;LD BC,BIOS.REINIT.HARD_RESET + JP_to_BIOS + ; +.ReturnSoftReset: + DI + ; устанавливаем нулевую карту портов + LD A,CNF_PORT.CNF_0 + OUT (SYS_PORT.ON),A + ; и так понятно что делает + IN A,(SLOT3) ; сохраняем номер воткнутой страницы + PUSH AF + LD A,Spec_Page + OUT (SLOT3),A + ; + LD BC,BIOS.REINIT.SOFT_RESET + JR .INIT_ACEX.ifSoftreset + ; + ;;; +.INIT_ACEX.ERROR: + POP AF + OUT (SLOT3),A + SCF + RET +; ;--[] .ACC_OFF: LD BC,Port_All_Mode IN A,(C) @@ -52,182 +242,6 @@ RST_CONF: OUT (C),A RET ;--[] - -;--[] -.CUSTOM: - CP #80 ;!FIXIT тут теперь может любое число быть у старых прог ; [ ] free zx pages - JR NC,.CHOOSE_CNF - ; only for old FLEX10K soft compatible - LD C,SLOT3 - IN B,(C) - OUT (C),A ; PAGE с прошивкой - LD DE,(#C090) ; PLD-ID - OUT (C),B ; RET page -;--[] ;JR INT_PLD -.INT_PLD: ; only for old FLEX10K soft compatible - LD C,SLOT3 - IN B,(C) - LD A,SYS_PAGE - OUT (C),A - LD (SYS_PAGE.CONFIG_BYTE),DE - OUT (C),B - - LD A,E ; config-byte - CP #FF - LD A,#80 - JR Z,.YES_CBL - XOR A -.YES_CBL: - LD BC,CBL.SYS_PORT - OUT (C),A - - LD A,E ; config-byte - - OR #FE ;!HARDCODE - LD BC,Port_All_Mode ; SYSTEM Spectrum/Sprinter - OUT (C),A - - LD A,#3C - OUT (FDC_93.DrvCTRL),A - - XOR A - RET - ; - ;[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 - ; - CP ACEX.Config_PG.Sp2000 - JR Z,.INIT_ACEX - ; - CP ACEX.Config_PG.Sp2000_SetUp - JR Z,.SP2000 - ; - - ; only for old FLEX10K soft compatible - CP ACEX.Config_PG.Sp97_1 - LD DE,ACEX.Config_ID.Sp97_1 - JR Z,.INT_PLD - CP ACEX.Config_PG.Sp97_2 - LD DE,ACEX.Config_ID.Sp97_2 - JR Z,.INT_PLD - CP ACEX.Config_PG.Sp97_AY - LD DE,ACEX.Config_ID.Sp97_AY - JR Z,.INT_PLD - SCF - RET - ; - ;[x] -.INIT_ACEX: - DI - ; устанавливаем нулевую карту портов - LD A,CNF_PORT.CNF_0 - OUT (SYS_PORT.ON),A - ; и так понятно что делает - IN A,(SLOT3) ; сохраняем номер воткнутой страницы - PUSH AF - LD A,Spec_Page - OUT (SLOT3),A - ; проверяем размер блока с конфой и получаем страницы конфы - LD HL,Spec_Page.bitstream_pages - LD A,B - AND A - JR Z,.INIT_ACEX.ReloadConfFromROM - ; - CALL EMM.GetMemBlkPages - LD A,B - JR C,.INIT_ACEX.ERROR - CP BitStream_SizeInPages+1 ; количество страниц в кэш для бистрима плюс одна - JR NC,.INIT_ACEX.ERROR - LD A,(Spec_Page.bitstream_pages) - INC A - JR Z,.INIT_ACEX.ERROR - ; -.INIT_ACEX.ReloadConfFromROM: - ; закидываем в Spec_Page прогу для заливки конфы - LD HL,.INIT_ACEX.PROGRAM - LD DE,Spec_Page.init_acex - LD BC,.INIT_ACEX.PROGRAM.Size - LDIR - ; если ZF=0, то процедура сделает ресет с перезаливкой из BIOS, иначе из КЭШ - CALL Spec_Page.init_acex - LD BC,BIOS.REINIT.HARD_RESET - ; - ; на входе в BC параметры функции BIOS -.INIT_ACEX.ifSoftreset: - ; сохраняем воткнутые страницы в Spec_Page - IN A,(SLOT0) - LD E,A - IN A,(SLOT1) - LD D,A - IN A,(SLOT2) - POP HL ; восстанавливаем номер воткнутой страницы - LD L,A - LD (Spec_Page.page_0),DE - LD (Spec_Page.page_2),HL - ; достаём адрес возврата в вызывающую функцию и сохраняем в Spec_Page - POP DE - LD HL,RST_18_1.exit - XOR A - SBC HL,DE - JR NZ,.set_ret ; NZ - если вызов был по RST #18 - POP DE ; если вызов был в ОЗУ по RST 8 - INC A -.set_ret: - LD (Spec_Page.RET_addr),DE - ; A=0 - SYS_PORT.ON - ; A=1 - SYS_PORT.OFF - LD (Spec_Page.Reload_Version),A - LD HL,0 - ADD HL,SP - LD (Spec_Page.Stack_Point),HL - ; Устанавливаем ключи - LD HL,Spec_Page.flag_R - LD (HL),"R" - INC HL - LD (HL),"S" - INC HL - LD (HL),"T" - ; - ; .. ... ... .. - ;!TODO сделать функцию по заливке своей конфы, перехвату ресета. - ; *. Вход в подфункцию только через RST 08 или #18 - ; *. Сохранить все страницы пользователя в SYS_PAGE для перехвата ресета - ; *. Достать со стека адрес возврата и сохранить в SYS_PAGE для перехвата ресета - ; *. Сохранить куда-нибудь значение стека - ; * - ; .. ... ... .. - ;LD BC,BIOS.REINIT.HARD_RESET - JP_to_BIOS - ; -.ReturnSoftReset: - DI - ; устанавливаем нулевую карту портов - LD A,CNF_PORT.CNF_0 - OUT (SYS_PORT.ON),A - ; и так понятно что делает - IN A,(SLOT3) ; сохраняем номер воткнутой страницы - PUSH AF - LD A,Spec_Page - OUT (SLOT3),A - ; - LD BC,BIOS.REINIT.SOFT_RESET - JR .INIT_ACEX.ifSoftreset - ; - ;;; -.INIT_ACEX.ERROR: - POP AF - OUT (SLOT3),A - SCF - RET ; .INIT_ACEX.PROGRAM: DISP Spec_Page.init_acex