From 63aa9fdb0905d76f32202b84acf72953e09fc944 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Wed, 24 Jan 2024 00:55:19 +1000 Subject: [PATCH] for new bios --- Consts.inc | 4 +- LDCONF.ASM | 222 ++++++++++++++++++++---------------------------- Shared_Includes | 2 +- 3 files changed, 93 insertions(+), 135 deletions(-) diff --git a/Consts.inc b/Consts.inc index 83237ee..c2015e3 100644 --- a/Consts.inc +++ b/Consts.inc @@ -57,7 +57,7 @@ Reload_String: DB ACEX.RELOAD_STRING ; фла VMod: db 0 ; Режим экрана VModPage: db 0 ; Страница экрана ram_blk_id: DB 0 ; Идентификатор блока памяти -SP_Save: DB 0,0 ; Тут храним стек для перезагрузки +;SP_Save: DB 0,0 ; Тут храним стек для перезагрузки dss_line: DB 0,0 ; указатель на DOS строку запуска LDConf NextParameter: dw 0000 ; Следующий параметр для .GetParam ; @@ -65,7 +65,7 @@ NextParameter: dw 0000 ; ; Разные буффера (.)(.) BufferEXE: DB 0,0,0,0 ram_pages: DB 0,0,0,0,0 ; Выделенные BIOS'ом блоки памяти (последний #FF) -page0_save: DB 0 ; Тут храним текущую страницу PAGE0 (должна идти после ram_pages) +;page0_save: DB 0 ; Тут храним текущую страницу PAGE0 (должна идти после ram_pages) page1_save: DB 0 ; Тут храним текущую страницу PAGE1 page2_save: DB 0 ; Тут храним текущую страницу PAGE2 (должна идти после ram_pages) page3_save: DB 0 ; Тут храним текущую страницу PAGE3 diff --git a/LDCONF.ASM b/LDCONF.ASM index b1464d9..11ad7c2 100644 --- a/LDCONF.ASM +++ b/LDCONF.ASM @@ -12,7 +12,7 @@ ; |_| |_| ;----------------------------------------------------------------------; ; Версия проги и инфо для понтов: - DEFINE Ver_ID "0.3 alpha" + DEFINE Ver_ID "0.4 alpha" DEFINE e_mail "Tolik.Trek@gmail.com" ; Подгрузка файла с константами BIOS и DSS: @@ -22,7 +22,7 @@ ; Макросы MACRO _PrintStr - LD C,#5C + LD C,Dss.PChars RST ToDSS ENDM @@ -34,13 +34,12 @@ ;-----------------; ENDM ;----------------------------------------------------------------------; -ST_Point EQU #BFFE ; адрес стека +stack_point EQU #BFFE ; адрес стека SP_Win EQU 64 ; мнимый контроль пересечения стека с кодом -ORG_Addr EQU #8100 ; адрес компиляции. DSS вставляет строку -; с параметрами запущенного EXE перед -; адресом загрузки START, поэтому -; грузимся не с начала страницы. - +org_addr EQU #8000 + CLP_Buffer ; адрес компиляции. +program_start EQU START +code_addr EQU START +Loader_length EQU 0 ; _______ _______ ____ __ _ ; | ____\ \/ / ____| | _ \ _ __ ___ / _(_)_ __ ; | _| \ /| _| | |_) | '__/ _ \ |_| \ \/ / @@ -48,24 +47,9 @@ ORG_Addr EQU #8100 ; ; |_____/_/\_\_____| |_| |_| \___|_| |_/_/\_\ ;-----------------; - ORG ORG_Addr-22 -; Сначала в EXE файле идёт заголовок -; длинной в 1 сектор (512 байт) + INCLUDE 'Shared_Includes/constants/EXE_Header.z80' + ORG org_addr ;-----------------; - DB 'EX' ; EXE Сигнатура - DB 'E' ; Reserved (EXE type) - DB 0 ; Version of EXE file - DW #0200 ; С какого смещения в файле будет грузиться код в - DW #0000 ; память по адресу (START) Low - 0200h, High - 0000. - DW #0000 ; Размер первичного загрузчика или 0 - DW #0000 ; Reserved - DW #0000 ; Reserved - DW #0000 ; Reserved - DW START ; Адрес расположения кода в памяти - DW START ; Адрес в памяти с которого запустится код (Reg. PC) - DW ST_Point ; Адрес стека (Reg. SP) -;******************************************************* - ; __ __ _ ; | \/ | __ _(_)_ __ ; | |\/| |/ _` | | '_ \ @@ -73,9 +57,6 @@ ORG_Addr EQU #8100 ; ; |_| |_|\__,_|_|_| |_| START: -; - -; ;-----------------; Чистим буфер акселем DI LD HL,Buffer @@ -87,8 +68,8 @@ START: LD B,B ; Выключаем аксель EI ;-----------------; Сохраняем текущие страницы - IN A,(SLOT0) - LD (page0_save),A + ; IN A,(SLOT0) + ; LD (page0_save),A IN A,(SLOT1) LD (page1_save),A IN A,(SLOT2) @@ -177,31 +158,38 @@ START: ;-----------------; если норм. завершение Load_conf 1: ; - LD DE,ReloadRET ; Адрес ВОЗВРАТА после перезагрузки - LD (SP_Save),SP ; сохраняем стек - CALL Set_Ret ; установка данных для возврата + ;LD DE,ReloadRET ; Адрес ВОЗВРАТА после перезагрузки + ;LD (SP_Save),SP ; сохраняем стек + ;CALL Set_Ret ; установка данных для возврата ; - CALL Set_Acex_Data ; перегрузка данных ACEX в FAST-RAM + ;CALL Set_Acex_Data ; перегрузка данных ACEX в FAST-RAM ; После этой процедуры хитрой ^^^^^^ начинаются глюки ; с вызовом процедур DSS. Чёт она там мудрит с портами ; или с памятью, не разобрался. Поэтому после неё лучше ; сразу в ресет с головой и не париться... + + LD A,(ram_blk_id) + LD B,A + LD A,#FE + LD C,BIOS.RST_CONF.CUSTOM + RST ToBIOS + JP ReloadRET ;-----------------; ;-----------------; 7 бед - 1 ресет -RESET: DI - LD A,DCP_PAGE - OUT (SLOT1),A ; set DCP page - LD A,ACEX.RESET - LD (#4400),A ; open for WR - LD (#4600),A ; open for RD - ; -.LOOP: LD BC,#100 - OUT (C),C - LD B,0 - OUT (C),C - JR .LOOP ; полностью зациклить! +; RESET: DI +; LD A,DCP_PAGE +; OUT (SLOT1),A ; set DCP page +; LD A,ACEX.RESET +; LD (#4400),A ; open for WR +; LD (#4600),A ; open for RD +; ; +; .LOOP: LD BC,#100 +; OUT (C),C +; LD B,0 +; OUT (C),C +; JR .LOOP ; полностью зациклить! ;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX @@ -216,15 +204,14 @@ RESET: DI ; перезагрузки новой прошивки ;-----------------; -ReloadRET: - DI - LD SP,(SP_Save) +ReloadRET: DI + ;LD SP,(SP_Save) LD A,CNF_PORT.CNF_0 ; конфигурация и отключение ПЗУ OUT (SYS_PORT.OFF),A - LD A,(page0_save) ; SET PAGE DOS - OUT (SLOT0),A - LD A,(page3_save) ; возврат старой страницы PAGE3 - OUT (SLOT3),A + ; LD A,(page0_save) ; SET PAGE DOS + ; OUT (SLOT0),A + ; LD A,(page3_save) ; возврат старой страницы PAGE3 + ; OUT (SLOT3),A ;-----------------; ;-----------------; Работа программы с новой прошивкой @@ -237,42 +224,17 @@ ReloadRET: ;-----------------; ;-----------------; -1: - DI +1: DI LD A,(a_key) ; Выход без восстановления дефолтной конфы? AND A - JP NZ,1F - ; jp nz,NormExit - ; jp nz,NextReloadRET - - LD DE,NextReloadRET ; - LD (SP_Save),SP ; сохраняем стек - CALL Set_Ret ; установка данных для возврата - JP RESET - -1: - ; ld a,(l_key) - ; and a - ; jr nz, NextReloadRET - - DI - IN A,(FastRAM.ON) ; Включение кэша - - LD A,3 - OUT (FastRAM.SLOT0),A ; Страница КЭШ = 3 - - LD A,#FF - LD (#3EF0),A ; затирание ACEX_K30_LOADING - LD (#3EE0),A ; затирание "IM" флага - - XOR A ; Отключение кэша - OUT (FastRAM.SLOT0),A ; пишем в FastRAM.SLOT0 ноль, иначе в - IN A,(FastRAM.OFF) ; нулевое окно биос или ДСС не воткнутся - + JP NZ,NextReloadRET + LD B,0 + LD A,#FE + LD C,BIOS.RST_CONF.CUSTOM + RST ToBIOS JP NextReloadRET - ;******************************************************* ; _ _ _ @@ -292,20 +254,20 @@ NextReloadRET: DI ; ;-----------------; Затираем следы нестоковой конфы - LD A,Spec_Page - OUT (SLOT3),A ; открыть спец-страницу + ; LD A,Spec_Page + ; OUT (SLOT3),A ; открыть спец-страницу - LD H,#FF - LD L,H - LD SP,HL - PUSH HL - PUSH HL - PUSH HL - PUSH HL - PUSH HL - PUSH HL - PUSH HL - PUSH HL + ; LD H,#FF + ; LD L,H + ; LD SP,HL + ; PUSH HL + ; PUSH HL + ; PUSH HL + ; PUSH HL + ; PUSH HL + ; PUSH HL + ; PUSH HL + ; PUSH HL ; LD (0FFF3h),A ; сохраняем страницы ; ld A,(page0_save) @@ -336,8 +298,8 @@ NextReloadRET: ;-----------------; ; - LD SP,(SP_Save) - LD A,CNF_PORT.CNF_0 ; конфигурация и отключение ПЗУ + ;LD SP,(SP_Save) + LD A,CNF_PORT.CNF_0 ; конфигурация и отключение ПЗУ OUT (SYS_PORT.OFF),A LD A,(page0_save) ; SET PAGE DOS @@ -728,21 +690,18 @@ TakeMem: ; предыдущего состояния. ;-----------------; -Load_conf: - LD DE,#3000 - LD HL,ram_pages +Load_conf: LD HL,ram_pages LD B,4 -1: - LD A,(HL) +.loop: LD A,(HL) OUT (SLOT3),A PUSH HL PUSH BC ; CALL .loopRead ; ; Параметры: DE - сколько считать в страницу LD A,(ConfHandler) ; а куда грузить - рассчитывается (#0000 - DE) - LD HL,#0000 - SBC HL,DE ; Тут будет в HL адрес куда, а в DE сколько загружать - LD C,13h + LD HL,#C000 + LD DE,#4000 + LD C,Dss.Read RST ToDSS POP BC @@ -752,8 +711,7 @@ Load_conf: RET NZ ; если A<>0, то да. Выход INC HL - LD DE,#4000 - DJNZ 1B + DJNZ .loop RET ;******************************************************* @@ -829,8 +787,8 @@ Set_Acex_Data: OUT (SLOT1),A XOR A ; Отключение кэша - OUT (FastRAM.SLOT0),A ; пишем в FastRAM.SLOT0 ноль, иначе в - IN A,(FastRAM.OFF) ; нулевое окно биос или ДСС не воткнутся + OUT (FastRAM.SLOT0),A ; пишем в FastRAM.SLOT0 ноль, иначе в + IN A,(FastRAM.OFF) ; нулевое окно биос или ДСС не воткнутся RET ;******************************************************* @@ -847,29 +805,29 @@ Set_Acex_Data: ; Адрес программы для возврата в регистре DE ;-----------------; -Set_Ret: - DI - LD A,Spec_Page - OUT (SLOT3),A ; открыть спец-страницу +; Set_Ret: +; DI +; LD A,Spec_Page +; OUT (SLOT3),A ; открыть спец-страницу - LD (#FFF3),A ; сохраняем в спецстраницу номер Spec_Page - LD (#FFF4),DE ; адрес программы перезапуска +; LD (#FFF3),A ; сохраняем в спецстраницу номер Spec_Page +; LD (#FFF4),DE ; адрес программы перезапуска - LD DE,#FFF0 ; сохраняем страницы 0-2 в спецстранице - LD HL,page0_save - LDI - LDI - LDI +; LD DE,#FFF0 ; сохраняем страницы 0-2 в спецстранице +; LD HL,page0_save +; LDI +; LDI +; LDI - LD A,'Z' ; флаги перезапуска - LD (#FFFE),A - LD A,'X' - LD (#FFFF),A +; LD A,'Z' ; флаги перезапуска +; LD (#FFFE),A +; LD A,'X' +; LD (#FFFF),A - LD A,(page3_save) ; Восстанавливаем начальную страницу 3 - OUT (SLOT3),A - EI - RET +; LD A,(page3_save) ; Восстанавливаем начальную страницу 3 +; OUT (SLOT3),A +; EI +; RET ;******************************************************* @@ -879,9 +837,9 @@ Set_Ret: ; the_end EQU $ ; - IF (the_end>(ST_Point-SP_Win)) + IF (the_end>(stack_point-SP_Win)) DISPLAY "the_end = ",/H,the_end - DISPLAY "ST_Point-SP_Win = ",/H,(ST_Point-SP_Win) + DISPLAY "ST_Point-SP_Win = ",/H,(stack_point-SP_Win) ASSERT 0, "Code + Stack = Love!!! (((((" ENDIF diff --git a/Shared_Includes b/Shared_Includes index a6dee8e..653e504 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit a6dee8e17ae12b251f306290793a56a6b0dd5ae3 +Subproject commit 653e504a06665ec95a8ef2a4257d9cfb18f6d6f0