diff --git a/Shared_Includes b/Shared_Includes index 5484390..be501b0 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 54843903de0b33e3403f6f6c5b7d144c7bd482aa +Subproject commit be501b0cc276065a9981e471dd26f9b069af7604 diff --git a/src/bios/exp/EXP.asm b/src/bios/exp/EXP.asm index 3bdd707..0ed2209 100644 --- a/src/bios/exp/EXP.asm +++ b/src/bios/exp/EXP.asm @@ -800,10 +800,7 @@ Check_EE_Port: LD A,ACEX.RET_PORT CP #FF JR Z,.JPHL ; olg logic ; new logic -.ver_2: EXX - LD HL,(Spec_Page.Stack_Point) - LD SP,HL - EXX +.ver_2: LD SP,(Spec_Page.Stack_Point) AND A LD A,#FF LD (Spec_Page.Reload_Version),A diff --git a/src/bios/exp/FUNC_SERVICE.asm b/src/bios/exp/FUNC_SERVICE.asm index 0a6cb13..f075028 100644 --- a/src/bios/exp/FUNC_SERVICE.asm +++ b/src/bios/exp/FUNC_SERVICE.asm @@ -106,14 +106,20 @@ RST_CONF: LD A,C JR Z,.crutch ; [x] -.not_vRAM_page: CP ACEX.Config_PG.Sp2000_SoftSetUp +.not_vRAM_page: CP ACEX.Config_PG.Sp2000_SoftRestartNow JP Z,.ReturnSoftReset ; - CP ACEX.Config_PG.Sp2000_AcexSetUp + CP ACEX.Config_PG.Sp2000_AcexSetUpNow JR Z,.INIT_ACEX ; CP ACEX.Config_PG.Sp2000_SetUp JR Z,.SP2000 + ; + CP ACEX.Config_PG.Sp2000_SoftRestartSet + JR Z,.SetUpSoftReset + ; + CP ACEX.Config_PG.Sp2000_AcexSetUpSet + JR Z,.SetUpHardReset ; ; only for old FLEX10K soft compatible CP ACEX.Config_PG.Sp97_1 @@ -130,55 +136,114 @@ RST_CONF: SCF RET ; +; B - ID рамблока с bitstream ;[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 +.INIT_ACEX: LD C,B LD B,high BIOS.REINIT.HARD_RESET + CALL .PrepareResetSetUp + LD B,C + CALL .PrepareHardReset + JR C,.INIT_ACEX.ERROR + LD B,high BIOS.REINIT.HARD_RESET + JR .set_ret_addr + +; DI +; 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 B,high BIOS.REINIT.HARD_RESET +; POP HL +; ; +; ;вход: B - параметр функции BIOS REINIT +; ; H - Spec_Page.page_3 +; .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 (Spec_Page.Stack_Point),SP +; ; +; LD A,high BIOS.REINIT.HARD_RESET +; CP B +; JR NZ,.reinit +; ; Устанавливаем ключи для HARD reset +; 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 +; .reinit: JP REINIT ; - ; на входе в B параметры функции BIOS REINIT -.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 +.SetUpHardReset: + LD C,B + LD B,high BIOS.REINIT.HARD_RESET + CALL .PrepareResetSetUp + LD (Spec_Page.RET_addr),DE + LD A,#FF + LD (Spec_Page.Reload_Version),A + LD B,C + CALL .PrepareHardReset + JR .INIT_ACEX.ERROR ; нормальный выход в данном случае + ; +.ReturnSoftReset: + CALL .PrepareSoftReset + CALL .PrepareResetSetUp ; достаём адрес возврата в вызывающую функцию и сохраняем в Spec_Page - POP DE +.set_ret_addr: POP DE LD HL,RST_18_1.exit XOR A SBC HL,DE @@ -189,47 +254,40 @@ RST_CONF: ; 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 + LD (Spec_Page.Stack_Point),SP JP REINIT ; -.ReturnSoftReset: - DI - ; устанавливаем нулевую карту портов - LD A,CNF_PORT.CNF_0 - OUT (SYS_PORT.ON),A - ; и так понятно что делает - IN A,(SLOT3) ; сохраняем номер воткнутой страницы - PUSH AF - LD A,Spec_Page +.SetUpSoftReset: + PUSH DE + CALL .PrepareSoftReset + CALL .PrepareResetSetUp + POP DE + LD (Spec_Page.RET_addr),DE + LD A,#FF + LD (Spec_Page.Reload_Version),A + LD A,(Spec_Page.page_3) OUT (SLOT3),A - ; - LD B,high BIOS.REINIT.SOFT_RESET - JR .INIT_ACEX.ifSoftreset + RET + + ; DI + ; LD A,ACEX.RET_PORT + ; LD B,Spec_Page + ; CALL SET_PORTS + ; ; + ; ; и так понятно что делает + ; IN A,(SLOT3) ; сохраняем номер воткнутой страницы + ; LD H,A + ; LD A,Spec_Page + ; OUT (SLOT3),A + ; ; + ; LD B,high BIOS.REINIT.SOFT_RESET + ; JR .INIT_ACEX.ifSoftreset ; ;;; .INIT_ACEX.ERROR: - POP AF + LD A,(Spec_Page.page_3) OUT (SLOT3),A - SCF + ;SCF RET ; ;--[] @@ -251,8 +309,8 @@ RST_CONF: ; SAFE_PORTY IN A,(FastRAM.ON) - IN A,(SLOT1) - LD (.slot1_page),A + ; IN A,(SLOT1) + ; LD (.slot1_page),A ; LD A,#FE ; чтоб проверить, что вызывать после CALL NZ,.INIT_ACEX.PROGRAM.LOAD ; тут ZF должен быть из вызывающей процедуры @@ -278,7 +336,8 @@ RST_CONF: XOR A OUT (FastRAM.SLOT0),A IN A,(FastRAM.OFF) -.slot1_page+1: LD A,0 +; .slot1_page+1: LD A,0 + LD A,(Spec_Page.page_1) OUT (SLOT1),A RET ; @@ -290,11 +349,11 @@ RST_CONF: INC A .INIT_ACEX.PROGRAM.load_loop: EX AF,AF' - LD A,(HL) - INC HL - CP #FF - RET Z - OUT (SLOT1),A ; страница с данными файла + LD A,(HL) + INC HL + CP #FF + RET Z + OUT (SLOT1),A ; страница с данными файла EX AF,AF' ; ; перекидывание #3000 байтов в КЭШ(0) = #1000 @@ -320,7 +379,80 @@ RST_CONF: ; ENT .INIT_ACEX.PROGRAM.Size EQU $-.INIT_ACEX.PROGRAM -; +;--[] +.PrepareSoftReset: + LD A,ACEX.RET_PORT + LD B,Spec_Page + CALL SET_PORTS + LD B,high BIOS.REINIT.SOFT_RESET + RET + +.PrepareResetSetUp: + DI + ; сохраняем воткнутые страницы в Spec_Page + IN A,(SLOT3) + LD H,A + LD A,Spec_Page + OUT (SLOT3),A + ; + IN A,(SLOT2) + LD L,A + LD (Spec_Page.page_2),HL + IN A,(SLOT0) + LD (Spec_Page.page_0),A + IN A,(SLOT1) + LD (Spec_Page.page_1),A + ; + LD A,high BIOS.REINIT.HARD_RESET + CP B + LD HL,Spec_Page.flag_R + JR NZ,.kill_flag + ; Устанавливаем ключи для HARD reset + LD (HL),"R" + INC HL +.kill_flag: LD (HL),"S" + INC HL + LD (HL),"T" + ; + ; .. ... ... .. + ; [ ] + ;!TODO сделать функцию по заливке своей конфы, перехвату ресета. + ; *. Вход в подфункцию только через RST 08 или #18 + ; *. Сохранить все страницы пользователя в SYS_PAGE для перехвата ресета + ; *. Достать со стека адрес возврата и сохранить в SYS_PAGE для перехвата ресета + ; *. Сохранить куда-нибудь значение стека + ; * + ; .. ... ... .. + RET + ; + +; B - ramblock bitstream +.PrepareHardReset: + ; проверяем размер блока с конфой и получаем страницы конфы + LD HL,Spec_Page.bitstream_pages + LD A,B + AND A + JR Z,.INIT_ACEX.ReloadConfFromROM + ; + CALL EMM.GetMemBlkPages + RET C ; ERROR + LD A,BitStream_SizeInPages ; количество страниц в кэш для бистрима + CP B + RET C ; ERROR + LD A,(Spec_Page.bitstream_pages) + INC A + SCF + RET Z ; 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, иначе из КЭШ + JP Spec_Page.init_acex +;--[] ;*************************************** diff --git a/src/bios/shared/DEFINES.INC b/src/bios/shared/DEFINES.INC index 98f210a..ca3610c 100644 --- a/src/bios/shared/DEFINES.INC +++ b/src/bios/shared/DEFINES.INC @@ -1,5 +1,5 @@ ;=======================[All shared EQUs]=======================; -BETA_BUILD EQU 8 ; добавляет строку и сообщение о тестовой сборке на стартовом экране +BETA_BUILD EQU 9 ; добавляет строку и сообщение о тестовой сборке на стартовом экране ;======================[All shared defines]=====================; DEFINE PACKED_MAIN 0 ; паковать MAIN или влезает без этого? DEFINE SP2000_Loader_Flag #0107 ;