From c7fd876f9194139b3712eca025e06f4a63d68211 Mon Sep 17 00:00:00 2001 From: Tolik <85737314+Tolik-Trek@users.noreply.github.com> Date: Sat, 28 Sep 2024 02:06:04 +1000 Subject: [PATCH] =?UTF-8?q?=D0=BF=D0=BE=D0=BA=D0=B0=20=D0=BD=D0=B5=20?= =?UTF-8?q?=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=B0=D0=B5=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Shared_Includes | 2 +- src/bios/exp/BIOS_FUNC.asm | 4 +- src/bios/exp/DCP.ASM | 6 +- src/bios/exp/EXP.asm | 334 +++++++++----- src/bios/exp/EXTENDED/IDE/CD_DRV.ASM | 2 +- src/bios/exp/FUNC_RAM_ROM_DRV.ASM | 4 +- src/bios/exp/FUNC_SERVICE.asm | 18 - src/bios/exp/FUNC_ZX.ASM | 543 +--------------------- src/bios/rom/ROM.asm | 26 +- src/bios/rom/SETUP/MAIN.asm | 84 +++- src/bios/rom/SETUP/SETTINGS.asm | 2 +- src/bios/rom/ZX/ZX_FUNC.ASM | 667 ++++++++++++++++++++++++++- src/bios/shared/DEFINES.INC | 2 +- 13 files changed, 969 insertions(+), 725 deletions(-) diff --git a/Shared_Includes b/Shared_Includes index 7bb1538..753caad 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 7bb1538646ae7e8ba917d04b55e7396d74154df7 +Subproject commit 753caadb020b3d55971aced21723c84a72bf65df diff --git a/src/bios/exp/BIOS_FUNC.asm b/src/bios/exp/BIOS_FUNC.asm index e323649..8909bba 100644 --- a/src/bios/exp/BIOS_FUNC.asm +++ b/src/bios/exp/BIOS_FUNC.asm @@ -237,8 +237,8 @@ TAB_FNS: DB low SET_PORTS ; #F8 DB low READ_PORTS ; #F9 [x] 26/01/2024 DB low FN_RESERVED ; #FA [x] 26/01/2024 не работала и не нужна, дублирует SET_PORTS - DB low GOTO_SPEC ; #FB Goto Spectrum! - DB low FN_RESERVED ; #FC + DB low GOTO_SPEC ; #FB Goto Spectrum! + DB low ZX_MEMORY_MANAGER ; #FC ; [ ] free zx pages! DB low REINIT ; #FD DB low FN_RESERVED ; #FE SAVE_AUTOSTART. Есть в ZX_EXP.ASM DB low FN_VERSION ; #FF diff --git a/src/bios/exp/DCP.ASM b/src/bios/exp/DCP.ASM index 7a23d49..9e906b2 100644 --- a/src/bios/exp/DCP.ASM +++ b/src/bios/exp/DCP.ASM @@ -647,10 +647,12 @@ SET_PORTS: PUSH AF POP DE DI + LD A,CNF_PORT.CNF_0 + ROM.BIOS + OUT (SYS_PORT.ROM),A CALL DOS_ON ; - LD A,CNF_PORT.CNF_0 + ROM.BIOS - OUT (SYS_PORT.ROM),A + ; LD A,CNF_PORT.CNF_0 + ROM.BIOS + ; OUT (SYS_PORT.ROM),A ; LD C,SLOT2 ; получить страницу IN D,(C) diff --git a/src/bios/exp/EXP.asm b/src/bios/exp/EXP.asm index 01d6807..8ab8ee1 100644 --- a/src/bios/exp/EXP.asm +++ b/src/bios/exp/EXP.asm @@ -857,48 +857,50 @@ Setup_to_RAM: LD HL,Setup_Starter.Start ;JP PrepareToZX ENDMODULE -PrepareToZX: ;CALL init_zx_roms - ; Setup HDD drives for ZX Spectrum mode - DI - LD D,CMOS_CELL.TRDOSmount - CALL CMOS_RD - AND %1010'1010 ; маска для 4-х HDD - JR Z,.start_zx - ; find first good partition - ; +PrepareToZX: ; Setup HDD drives for ZX Spectrum mode +; DI +; LD D,CMOS_CELL.TRDOSmount +; CALL CMOS_RD +; AND %1010'1010 ; маска для 4-х HDD +; JR Z,.start_zx +; ; find first good partition +; ; - ; чистка переменных ZX HDD - IN A,(SLOT3) - EX AF,AF - LD A,SYS_PAGE - OUT (SLOT3),A - ; - XOR A - LD H,A - LD L,A - LD (SYS_PAGE.CURRENT_DIR_SEC_L),HL - LD (SYS_PAGE.CURRENT_DIR_SEC_H),HL - DEC A - LD (SYS_PAGE.CURRENT_HDD),A - LD (SYS_PAGE.CURRENT_DIR_DRIVE),A - LD (SYS_PAGE.CURRENT_DIR_DRIVE_COPY),A - ; - EX AF,AF - OUT (SLOT3),A - EX AF,AF - ; - -.loop: CALL FN_HDD_PART - JR NC,.start_zx - POP AF - INC A - CP #10 - JR C,.loop +; ; чистка переменных ZX HDD +; IN A,(SLOT3) +; EX AF,AF +; LD A,SYS_PAGE +; OUT (SLOT3),A +; ; +; XOR A +; LD H,A +; LD L,A +; LD (SYS_PAGE.CURRENT_DIR_SEC_L),HL +; LD (SYS_PAGE.CURRENT_DIR_SEC_H),HL +; DEC A +; LD (SYS_PAGE.CURRENT_HDD),A +; LD (SYS_PAGE.CURRENT_DIR_DRIVE),A +; LD (SYS_PAGE.CURRENT_DIR_DRIVE_COPY),A +; ; +; EX AF,AF +; OUT (SLOT3),A +; EX AF,AF +; ; +; XOR A +; .loop: PUSH AF +; CALL FN_HDD_PART +; POP BC +; JR NC,.start_zx +; LD A,B +; INC A +; CP #10 +; JR C,.loop ; выход в режим zx spectrum .start_zx: IF FREE_ZX_PAGES - ; -=========== + ; не должно сюда попасть + LD B,BIOS.REINIT.HARD_RESET + JP REINIT ELSE ; [x] free zx pages! XOR A OUT (SLOT2),A ; ZERO_PAGE @@ -1035,10 +1037,10 @@ PORTS_INIT: LD A,IDE.Chanel.Primary OUT (IDE.Chanel.Set),A LD BC,#7FFD - LD A,#10 - OUT (C),A ; BASIC_48 mode + XOR A + OUT (C),A ; BASIC_128 mode LD B,#1F - LD A,01 + INC A OUT (C),A ; RAM-0 mode !!! ; очистка буферов клавиатуры и мыши в SIO CALL .clean_kbd_buf @@ -1063,9 +1065,9 @@ PORTS_INIT: ;-----------------------------------------------------------------------; ; paths from project DIR + INCLUDE 'BIOS_FUNC.ASM' INCLUDE 'FUNC_4x.ASM' INCLUDE 'FUNC_CMOS.ASM' - INCLUDE 'BIOS_FUNC.ASM' INCLUDE 'FUNC_SERVICE.asm' ; INCLUDE 'EXP_SCR.ASZ' LP_SCR_MNU INCLUDE 'FUNC_SCREEN.ASM' @@ -1074,7 +1076,9 @@ PORTS_INIT: INCLUDE 'FUNC_FOR_TRDOS.ASM' INCLUDE 'FUNC_5x.asm' INCLUDE 'FUNC_LOW_PRINT.ASM' + IFN FREE_ZX_PAGES INCLUDE 'FUNC_ZX.ASM' + ENDIF ;-----------------------------------------------------------------------; @@ -1100,79 +1104,6 @@ ZG_ADDRESS: INCLUDE 'FONT.ASM' ;-----------------------------------------------------------------------; -; -;>$< >$< >$< >$< >$< >$< [ ПЕРЕМЕЩАЕМЫЕ В ОЗУ ] >$< >$< >$< >$< >$< >$< ; - -;-------------------------------[ #FFE0 ]-------------------------------; -; программа, которая будучи размещенной в #40 странице, -; с адреса RESTARTS, перехватывает RESET -RESTARTS_PROG: ; !TODO LDConf перехват ресета на любой конфе после hardreset - LD HL,RESTARTS - LD B,16 -.loop: - LD (HL),0 - INC HL - DJNZ .loop - NOP - NOP -.Size EQU $-RESTARTS_PROG - ; LD A,1 - ; OUT (SLOT3),A -;-----------------------------------------------------------------------; - -;----------------------------[Setup Starter]----------------------------; - MODULE Setup_Starter -; программа, размещаемая по адресу 0C000h -; для запуска Setup -Start: - DISP COMPILE_ADDR.SETUP_STARTER -Exec: - LD A,CNF_PORT.CNF_0 + ROM.EXTENSION - OUT (SYS_PORT.ROM),A - - LD HL,ROM_MAP.SETUP - LD DE,MEM_MAP.SETUP - LD BC,BLOCK_Setup.Length - LDIR - - LD A,CNF_PORT.CNF_0 + ROM.BIOS - OUT (SYS_PORT.ROM),A - -;-----------[Check SPACE] - LD A,Port_All_Mode.DEFAULT - Port_All_Mode.SPECTRUM_MODE_OFF ; !HARDCODE - LD BC,Port_All_Mode ; keyboard int & acc off - OUT (C),A - LD A,high ZXKeys.Line_7 - IN A,(ZXKeys) - CPL - AND 1 -; в регистре A передаётся нажата ли клавиша SPACE. -; потом проверяется в main.asm [space_check] -; и если нажата, то происходит игнор параметра -; "Быстрый старт ПЗУ" во время перезагрузки - EX AF,AF' - - LD A,#FF ; !HARDCODE - OUT (C),A ; keyboard int & acc on, zx_screen & original waits off (for conf >= 3.05) - - EX AF,AF' -;----------------------[] - DI - POP HL ; адрес возврата в EXP из SETUP - ; LD SP,#8000 ;!HARDCODE - ; PUSH HL - ; PUSH AF - JP SETUP_MAIN - ENT -Size EQU $-Setup_Starter.Start - ENDMODULE -;-----------------------------------------------------------------------; -;-----------------------------------------------------------------------; -;>$< >$< >$< >$< >$< >$< >$< >$< >$< >$< >$< >$< >$< >$< >$< >$< >$< >$<; -; - - - ; ; !FIXIT сделать эти фиксированные адреса отдельным файлом и с IF/ELSE и подключать их потом куда надо. ; @@ -1264,9 +1195,168 @@ DOS_ON: NOP ;*************************************** ; BLOCK #3D17-$,FF -; !TODO можно оприходовать тут 233 байта -; ;*************************************** +; + + + + + IF FREE_ZX_PAGES +; [ ] free zx pages! ---------------------------------------------------; +GOTO_SPEC: PUSH HL + LD HL,RET_TO_BIOS + EX (SP),HL + PUSH HL + LD HL,GOTO_SPECTRUM + EX (SP),HL + JP EXTENSION_FNs + +ZX_MEMORY_MANAGER: + PUSH HL + LD HL,RET_TO_BIOS + EX (SP),HL + PUSH HL + LD HL,MANAGE_ZX_PAGES.FN_ENTRANCE + EX (SP),HL + JP EXTENSION_FNs +;-----------------------------------------------------------------------; + + +;>$< >$< >$< >$< >$< >$< [ ПЕРЕМЕЩАЕМЫЕ В ОЗУ ] >$< >$< >$< >$< >$< >$< ; +; +;---------------------[ ЗАГЛУШКИ ДЛЯ #41 СТРАНИЦЫ]----------------------; +;-------------[RST 08] +RAM_BIOS_PROG: ; for CALL BIOS in #41 page + DISP Spec_Page.to_bios + PUSH AF + LD A,ROM.BIOS + OUT (SYS_PORT.ROM),A + POP AF + RET + ENT +.Length EQU $-RAM_BIOS_PROG +;-------------------[] +; +;-------------[RST 38] +PROG_NO_ROM: + DISP Spec_Page.no_zx_rom + DI + ; + LD A,SHARED_PAGE + OUT (SLOT3),A + OUT (SLOT2),A + OUT (SLOT1),A + ; + LD SP,#BF00 + ; + LD E,0 + LD BC,BIOS.LP_OPEN_S.TXT_80x32_Default + RST ToBIOS + ; + LD DE,0 + LD HL,#2050 + LD C,BIOS.LP_CLS_WIN + RST ToBIOS + ; set scr-2 + LD A,1 + OUT (SCREEN_SWITCH),A + ; + LD HL,MESSAGE_NR + LD DE,#A000 + LD BC,MESSAGE_NR.size + LD A,C + LDIR + ; + LD HL,#A000 + LD D,0 ; delimiter + LD E,COLORS.CGA.FLASH + COLORS.CGA.INK.RED + LD B,A + LD C,BIOS.LP_PRINT_LINE3 + RST ToBIOS + ; +.loop: DI + HALT + JR .loop + ; +MESSAGE_NR: DZ " Spectrum ROM not installed. Use spectrum.exe Press Ctrl+Alt+Del or RESET" +.size EQU $-MESSAGE_NR + ENT +PROG_NO_ROM.size EQU $-PROG_NO_ROM +;-------------------[] +;-----------------------------------------------------------------------; +;>$< >$< >$< >$< >$< >$< >$< >$< >$< >$< >$< >$< >$< >$< >$< >$< >$< >$<; + ENDIF +;-------------------------------[ #FFE0 ]-------------------------------; +; программа, которая будучи размещенной в #40 странице, +; с адреса RESTARTS, перехватывает RESET +RESTARTS_PROG: ; !TODO LDConf перехват ресета на любой конфе после hardreset + LD HL,RESTARTS + LD B,16 +.loop: + LD (HL),0 + INC HL + DJNZ .loop + NOP + NOP +.Size EQU $-RESTARTS_PROG + ; LD A,1 + ; OUT (SLOT3),A +;-----------------------------------------------------------------------; + +;----------------------------[Setup Starter]----------------------------; + MODULE Setup_Starter +; программа, размещаемая по адресу 0C000h +; для запуска Setup +Start: + DISP COMPILE_ADDR.SETUP_STARTER +Exec: + LD A,CNF_PORT.CNF_0 + ROM.EXTENSION + OUT (SYS_PORT.ROM),A + + LD HL,ROM_MAP.SETUP + LD DE,MEM_MAP.SETUP + LD BC,BLOCK_Setup.Length + LDIR + + LD A,CNF_PORT.CNF_0 + ROM.BIOS + OUT (SYS_PORT.ROM),A + +;-----------[Check SPACE] + LD A,Port_All_Mode.DEFAULT - Port_All_Mode.SPECTRUM_MODE_OFF ; !HARDCODE + LD BC,Port_All_Mode ; keyboard int & acc off + OUT (C),A + LD A,high ZXKeys.Line_7 + IN A,(ZXKeys) + CPL + AND 1 +; в регистре A передаётся нажата ли клавиша SPACE. +; потом проверяется в main.asm [space_check] +; и если нажата, то происходит игнор параметра +; "Быстрый старт ПЗУ" во время перезагрузки + EX AF,AF' + + LD A,#FF ; !HARDCODE + OUT (C),A ; keyboard int & acc on, zx_screen & original waits off (for conf >= 3.05) + + EX AF,AF' +;----------------------[] + DI + POP HL ; адрес возврата в EXP из SETUP + ; LD SP,#8000 ;!HARDCODE + ; PUSH HL + ; PUSH AF + JP SETUP_MAIN + ENT +Size EQU $-Setup_Starter.Start + ENDMODULE +;-----------------------------------------------------------------------; +;-----------------------------------------------------------------------; +;>$< >$< >$< >$< >$< >$< >$< >$< >$< >$< >$< >$< >$< >$< >$< >$< >$< >$<; +; + + + + ;*************************************** _mInfoBLOCK #3E00-$,#FF @@ -1430,13 +1520,13 @@ ROM_DISK.Pages: ; _mInfoBLOCK #3FD0-$,#FF ; ToBIOS_FromEXT ; #3FD0 ; Для вызова функций биоса из страницы 0 ПЗУ (Extension) -RET_to_EXTENSION: +RET_TO_EXTENSION: PUSH AF LD A,ROM.EXTENSION OUT (SYS_PORT.ROM),A POP AF RST ToBIOS_18 - JP RET_to_EXTENSION + JP RET_TO_EXTENSION ; !TODO Free 6 bytes ;--------------------------------------- @@ -1455,10 +1545,10 @@ RET_to_EXTENSION: ; ; [x] new portal -;------------[HDD_5x portal]------------ -; точка входа/выхода для функций 5х из EXP +;------------[Portal to EXT]------------ +; точка входа/выхода для функций в ROM.EXTENSION _mInfoBLOCK #3FE8-$,#FF -EXP_HDD: +EXTENSION_FNs: ;EXP_HDD: PUSH AF LD A,ROM.EXTENSION OUT (SYS_PORT.ROM),A diff --git a/src/bios/exp/EXTENDED/IDE/CD_DRV.ASM b/src/bios/exp/EXTENDED/IDE/CD_DRV.ASM index 6966092..c2ed409 100644 --- a/src/bios/exp/EXTENDED/IDE/CD_DRV.ASM +++ b/src/bios/exp/EXTENDED/IDE/CD_DRV.ASM @@ -266,7 +266,7 @@ AP_COM: EXX .NO_ERR: ;BIT IDE.ControlBit.DataRequest,A AND IDE.ControlByte.DataRequest - ;LD A,BIOS.Error.NoErrors + LD A,BIOS.Error.NoErrors RET Z ;NO DATA REQUEST A = 0: BIOS.Error.NoErrors EX DE,HL LD BC,IDE.Read.CylinderLow diff --git a/src/bios/exp/FUNC_RAM_ROM_DRV.ASM b/src/bios/exp/FUNC_RAM_ROM_DRV.ASM index 4c19cc9..85c39ee 100644 --- a/src/bios/exp/FUNC_RAM_ROM_DRV.ASM +++ b/src/bios/exp/FUNC_RAM_ROM_DRV.ASM @@ -290,8 +290,8 @@ EMM.FreeMem: ; [x] free zx pages! теп RET Z ; LD C,A - CP ZX_RAM_ID ;!FIXIT ; [ ] free zx pages! - CALL Z,RES_FLAG_ZXvROM + ;CP ZX_RAM_ID ;!FIXIT ; [ ] free zx pages! + ;CALL Z,RES_FLAG_ZXvROM ; IN A,(SLOT3) EX AF,AF' diff --git a/src/bios/exp/FUNC_SERVICE.asm b/src/bios/exp/FUNC_SERVICE.asm index c641b0b..081e7c8 100644 --- a/src/bios/exp/FUNC_SERVICE.asm +++ b/src/bios/exp/FUNC_SERVICE.asm @@ -432,22 +432,4 @@ REINIT: DEC B JR .loop2 ; ;----------------------------------------------------------------------; -; - -; -;----------------------------------------------------------------------; -; не должно портить DE -RES_FLAG_ZXvROM: - EX AF,AF' - IN A,(SLOT3) - EX AF,AF' - LD A,Spec_Page - OUT (SLOT3),A - XOR A - LD (Spec_Page.flag_Z),A - LD (Spec_Page.flag_X),A - EX AF,AF' - OUT (SLOT3),A - RET -;----------------------------------------------------------------------; ; \ No newline at end of file diff --git a/src/bios/exp/FUNC_ZX.ASM b/src/bios/exp/FUNC_ZX.ASM index 456f67e..04642fa 100644 --- a/src/bios/exp/FUNC_ZX.ASM +++ b/src/bios/exp/FUNC_ZX.ASM @@ -1,544 +1,7 @@ -;-------------------------------------------------------------------------------------------------------------------; -;!TODO сделать выбор в Setup, что грузить в vПЗУ при старте. Варианты: -;[~] 0 - Не грузить ПЗУ спектрума, инитить страницу #41 как в 3.04 -;[~] 1 - Грузит ПЗУ спектрума из ROM при старте если нет флага ZX -;[~] 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' - -; для входа в режим спектрума: -; 0. Проверка метки ZX -; 1. CONFIG_DE.CNF_PORT Тип тачки, как инитить память, размер ОЗУ, турба -; 2. CONFIG_DE.ZX_START страница vROM для запуска -; 3. Настройки экрана (INT, Sync) -; 4. Торможение памяти (port all mode) -; 5. Block_ID.vROM -; 6. Block_ID.vRAM - -; _ZX_ _ZX_ _ZX_ _ZX_ _ZX_ [___FOR ZX-MODE___] _ZX_ _ZX_ _ZX_ _ZX_ _ZX_ ; - -;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░; -; [ ] free zx pages! -; ????? SYS_PAGE.SHARED_BUFFER_256b -; -; [ ] Страница ОЗУ для скорпа в SLOT0 должна совпадать с нулевой страницей порта #7FFD - IF FREE_ZX_PAGES - MODULE MANAGE_ZX_PAGES - -;!FIXIT -;----------------[Выделение/освобождение страниц спектрума]-------------; -;вход: рег 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..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 - 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 Z - ; - EXX - 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 -;-----------------------------------------------------------------------; - - -;-----------------------------------------------------------------------; -; Не портить DE -;Вход: A - TASK NUMBER -; GET_ZX_TASK_DATA: -; 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 ; данные новой задачи -; RET -;-----------------------------------------------------------------------; - - -;-----------------------------------------------------------------------; -FREE_vMEMORY: LD A,(SYS_PAGE.Block_ID.vROM) - CALL EMM.FreeMem - LD A,(SYS_PAGE.Block_ID.vRAM) - CALL EMM.FreeMem - ; - LD HL,#FFFF - LD (SYS_PAGE.Block_ID.vROM),HL - ; - JP RES_FLAG_ZXvROM -;-----------------------------------------------------------------------; -;-----------------------------------------------------------------------; -;Вход: A - TASK NUMBER -;Выход: H - vRAM block ID -; L - vROM block ID -GET_RAMBLOCK_IDs: - LD HL,(SYS_PAGE.Block_IDs) - RET -;-----------------------------------------------------------------------; - - -;-----------------------------------------------------------------------; -;Вход: HL - буфер страниц (SLOT1..SLOT2) на которые маппим (всегда 11 шт.) -; Первый байт списка - RAM BLOCK ID. Далее как угодно номера -; страниц для каждого типа страницы vROM. Если какая-то страница -; vROM не используется, то ставится #FF -INIT_vROM: LD A,(SYS_PAGE.Block_ID.vROM) - CP (HL) - EX DE,HL - CALL NZ,EMM.FreeMem - EX DE,HL - ; - LD A,(HL) - LD (SYS_PAGE.Block_ID.vROM),A - ; установка портов ROM - LD DE,.PORTS - LD B,.PORTS.Size -.loop: PUSH BC - LD A,(HL) - INC HL - CP #FF - JR NZ,.not_Spec_Page - LD A,Spec_Page -.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 - ; установка метки ZX если рамблок не #FF - LD A,(SYS_PAGE.Block_ID.vROM) - INC A - RET Z - ; -.set_ZX_flag: IN A,(SLOT3) - LD D,A - LD A,Spec_Page - OUT (SLOT3),A - ; - LD HL,'XZ' - LD (Spec_Page.flag_Z),HL - ; - LD A,D - OUT (SLOT3),A - 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.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.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 -.PORTS.Size EQU $-.PORTS -;-----------------------------------------------------------------------; - - - - -;-----------------------------------------------------------------------; -;ВХОД: HL - список страниц -; E - 0 = 128kb, 1 = 512kb -INIT_vRAM: XOR A -.set_1ffd: LD BC,#1FFD - OUT (C),A - ; set 128 - LD B,#7F - LD D,%0000'0000 - CALL SET_7FFD - ; - XOR A - OUT (C),A - BIT 3,E ; 128/512 - RET Z - ; set 128 + 384 - ;LD A,SYS_PORT.CNF_512 - ;OUT (SYS_PORT.ROM),A - ; - LD D,%0100'0000 - CALL SET_7FFD - LD D,%1000'0000 - CALL SET_7FFD - LD D,%1100'0000 - CALL SET_7FFD - ; - XOR A - OUT (C),A - RET -;-----------------------------------------------------------------------; - -;-----------------------------------------------------------------------; -;ВХОД: HL - список страниц -; D - начальное значение для 7FFD -SET_7FFD: LD A,(HL) - OUT (C),D - OUT (SLOT3),A - INC HL - INC D - BIT 3,D ; количество страниц - JR Z,SET_7FFD - RET -;-----------------------------------------------------------------------; - - - -;-----------------------------------------------------------------------; -ZX_MEMORY: -.MODE_48k EQU 3 -.MODE_128k EQU 3+5 -.MODE_256k EQU 3+13 -.MODE_512k EQU 3+29 - -;Выполняется для выделения трёх страниц ОЗУ 48k -GET_48k_MEM: LD D,ZX_MEMORY.MODE_48k - JR GET_XXX_MEM -;Выполняется для инита 3 страниц ОЗУ 48k и 29 страниц ОЗУ Pent512k -GET_512k_MEM: LD D,ZX_MEMORY.MODE_512k - JR GET_XXX_MEM -;Выполняется для выделения 3 страниц ОЗУ 48k и 5 страниц ОЗУ 128k тачек -GET_128k_MEM: LD D,ZX_MEMORY.MODE_128k - ;JR GET_XXX_MEM -GET_XXX_MEM: CALL FREE_vRAM -.init: LD B,D - CALL EMM.GetMem - RET C - LD (SYS_PAGE.Block_ID.vRAM),A - RET -;-----------------------------------------------------------------------; - - -;-----------------------------------------------------------------------; -FREE_vRAM: XOR A - LD C,A - OR (SYS_PAGE.Block_ID.vRAM) - RET Z - LD (SYS_PAGE.Block_ID.vRAM),C - JP EMM.FreeMem -;-----------------------------------------------------------------------; - - -;-----------------------------------------------------------------------; -;Выполняется для выделения 3 страниц ОЗУ 48k и 14 страниц ОЗУ Scorp256k -;Вход: --- -;Выход: A - RAM block ID -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 HL,SYS_PAGE.RAM_TABLE -.allocate_loop: DEC L - JR Z,.error_no_mem - CP (HL) - JR NZ,.allocate_loop - ; - CALL .check_barred_pages - LD A,0 - JR Z,.allocate_loop - ; - LD (HL),C - LD C,L - DJNZ .allocate_loop - ; L = указатель цепочки. - AND A - LD D,L - ; Get Pent128 mem - LD B,ZX_MEMORY.MODE_128k - CALL EMM.GetMem - ; A - Pent128 mem block id - LD B,D ; Scorp128 mem block id - CALL EMM.MergeMemBlocks - LD (SYS_PAGE.Block_ID.vRAM),A - RET - ; - ; фильтр для страниц скорпа - ;выход: ZF=1 - страница не подходит -.check_barred_pages: - ; check reset page - LD A,L - CP RESET_PAGE - RET C - RET Z - ; check isa page - AND D - XOR E ; страницы ISA #D0..#DF - RET NZ - LD L,E - RET - ; -.error_no_mem: LD A,C - CALL EMM.FreeMem - LD A,BIOS.Error.EMM.NoMemory - SCF - RET -;-----------------------------------------------------------------------; - ENDMODULE - ENDIF -;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░; - - - - IF FREE_ZX_PAGES ;----------------------------------------------------[v] -;!TODO задействовать -; ПЕРЕДАВАТЬ: номер vROM, vRAM, CONFIG_DE, FN_SYNC, PORT_ALL_MODE, MEM_TYPE -; Вход: B[3..0]: 0 - BASIC 128, 1 - BASIC 48, 2 - TR-DOS 128, ;!FIXIT переделать, это CONFIG_DE -; 3 - EXPANSION. C закрытыми 128-ми портами: -; 4 - TR-DOS, 5 - BASIC 48 -; B[7..4]: ;!TODO Port All Mode: b4 - Acc off/on -; DE: -; A: TASK Number -; CF: 1 - не переустанавливать палитру - -/* -; Вход: D: 0 - BASIC 128, 1 - BASIC 48, 2 - TR-DOS 128, -; 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 -; B: Port All Mode -;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_SPEC: LD A,BIOS.Error.NotSupported - AND A - SCF - RET NZ - ; -.FN: DI - EX AF,AF' - LD C,A - ; set shared pages - XOR A - OUT (SLOT2),A ; ZERO_PAGE - DEC A - OUT (SLOT1),A ; SHARED_PAGE - ; - LD A,SYS_PAGE - OUT (SLOT3),A - ; - LD (SYS_PAGE.CONFIG_DE),DE - LD (SYS_PAGE.Block_IDs),HL - ; - EXX - LD SP,#C000 - ; - ; [ ] free zx pages! ;!TODO если задача пустая, то первый инит - ; - ;!TODO сделать активацию винта для параметра из Setup - ;!TODO установить где-нибудь ниже стэк из TASK - ; LD A,(IX + _ZX_TASK_DATA.PORT_ALL_MODE) - ; LD BC,Port_All_Mode - ; OUT (C),A - ; установка инта - EXX - LD A,C - EXX - AND %0000'0011 - CALL FN_SYNC - ; установка развёртки - EXX - LD A,C - EXX - RLCA - AND %0000'0001 - OR %1000'0110 - CALL FN_SYNC - EXX - LD A,C - EXX - ; - AND %0000'0100 ;!TODO запомнить/восстановить кастомную палитру? - CALL Z,SET_TXT_PALETTE.ZX - ; - LD E,0 - CALL LP_SET_32 - ; - LD E,0 - LD HL,#5104 - CALL LP_SET_32.X - ; .SHARED_BUFFER_256b - LD A,(SYS_PAGE.Block_ID.vRAM) - LD HL,SYS_PAGE.SHARED_BUFFER_256b - CALL EMM.GetMemBlkPages - ;!FIXIT - ;RET C - ; !FIXIT проверка размера блока, сделать, чтоб выбирался объём памяти - ;LD A,B - ;CP 16 - ; - LD D,B -;.TASK_0: XOR A ; задача 0, режим 256 килобайт -.START_TASK: LD IY,.BASIC_128 - JP INIT_PAGES ; инициализация номеров страниц режима спектрума - ; -;start_basic: -.BASIC_128: LD SP,#C000 - LD HL,RES128_PROG - LD DE,ZX_VARS.PRINTER_BUFFER ; запуск программы на BASIC-е. - LD BC,RES128_PROG.Size - LDIR - DI - JP ZX_VARS.PRINTER_BUFFER -;-----------------------------------------------------------------------; - - -;-----------------------------------------------------------------------; -;***************************************** -; -; Инициализация страниц для -; спектрумовского режима и -; восстановление спектрумовского -; экрана -; -; Возврат по IX -; -; !!! NO USE STACK !!! -; -;***************************************** -;!TODO стек установлен во второй странице, не использовать или устанавливать в другую! -; инициализация страниц zx spectrum -; HL - адрес блока страниц в SYS_PAGE SLOT3 -; D - количество этих страниц -INIT_PAGES: LD A,SYS_PAGE - OUT (SLOT1),A - LD A,SYS_PORT.TURBO.ON + SYS_PORT.CNF_0 + SYS_PORT.CNF_512 - OUT (SYS_PORT.ROM),A - ; - RES 7,H - ; - LD A,D - CP ZX_MEMORY.MODE_48k - JR Z,.set_48k - ; - LD E,0 ; pent128 - CP ZX_MEMORY.MODE_256k - JR Z,.set_scorp - ; - CP ZX_MEMORY.MODE_128k - JR Z,.set_pent - INC E - CP ZX_MEMORY.MODE_512k - JR Z,.set_pent - ;!FIXIT обработка ошибки - DI - HALT - ; -.set_scorp: CALL MANAGE_ZX_PAGES.INIT_vRAM - LD A,#10 - CALL MANAGE_ZX_PAGES.INIT_vRAM.set_1ffd - ; A = 0, BC = #7FFD - LD B,#1F - OUT (C),A - JR .set_table - ; -.set_pent: CALL MANAGE_ZX_PAGES.INIT_vRAM - ; меняем порядок для процедуры set_48k -.set_table: LD A,(SYS_PAGE.SHARED_BUFFER_256b+2 - #8000) ; SLOT2 page - LD D,A - LD A,(SYS_PAGE.SHARED_BUFFER_256b+5 - #8000) ; SLOT1 page - LD E,A - LD A,(SYS_PAGE.SHARED_BUFFER_256b+0 - #8000) ; SLOT0, SLOT3 page - JR .set_slots - ; -.set_48k: LD A,(HL) ; SLOT0, SLOT3 page - INC HL - LD E,(HL) ; SLOT1 page - INC HL - LD D,(HL) ; SLOT2 page - ; -.set_slots: OUT (SLOT0),A - OUT (SLOT3),A - LD A,E - OUT (SLOT1),A - LD A,D - OUT (SLOT2),A - ; - XOR A - OUT (RGADR),A ; регистр видео адреса - OUT (RGMOD),A ; регистр моды - JP (IY) -;-----------------------------------------------------------------------; - ELSE ;--------------------------------------------------------------------[|] + IFN FREE_ZX_PAGES ;-----------------------------------------------------------------------; ;!TODO задействовать GOTO_SPEC: IN A,(SLOT3) @@ -720,7 +183,6 @@ NO_SCREEN_ALT: AND A JP (IX) ;-----------------------------------------------------------------------; - ENDIF ;--------------------------------------------------------------------[^] ; ;>$< >$< >$< >$< >$< >$< [ ПЕРЕМЕЩАЕМАЯ В ОЗУ ] >$< >$< >$< >$< >$< >$< ; @@ -858,4 +320,5 @@ PROG_NO_ROM.size EQU $-PROG_NO_ROM ;>$< >$< >$< >$< >$< >$< >$< >$< >$< >$< >$< >$< >$< >$< >$< >$< >$< >$<; ; ; _ZX_ _ZX_ _ZX_ _ZX_ _ZX_ _ZX_ _ZX_ _ZX_ _ZX_ _ZX_ _ZX_ _ZX_ _ZX_ _ZX_ ; -; \ No newline at end of file +; + ENDIF ;--------------------------------------------------------------------[^] \ No newline at end of file diff --git a/src/bios/rom/ROM.asm b/src/bios/rom/ROM.asm index 873da16..8885861 100644 --- a/src/bios/rom/ROM.asm +++ b/src/bios/rom/ROM.asm @@ -145,7 +145,13 @@ NMI: RETN ;----------------------------[ FOR ZX-MODE ]----------------------------; ;!HARDCODE на этот адрес #С0 прыгает в vROM Basic-48 по адресу #3CF0 ; можно попробовать переделать этот адрес там - _mInfoBLOCK #C0-$,#FF ;!TEST 0 + _mInfoBLOCK #C0-$,#FF +; Вход через USR 15600 +RET_FROM_BIOS_TO_BASIC48: + CALL CH_2 + CALL COMAND_LINE ; ВЫПОЛНЕНИЕ КОМАНДЫ, ЕСЛИ ЕСТЬ + ; Вход без команды + JP SW_ROM_1 ; ВОЗВРАТ В << MAIN MENU >> INCLUDE 'ZX/ZX_FUNC.ASM' INCLUDE 'ZX/ZX_MENU.ASM' ;-----------------------------------------------------------------------; @@ -360,8 +366,8 @@ BLOCK_Setup.Length EQU $-BLOCK_Setup ;--------------------------------------- ; ;--------------[GOTO BIOS]-------------- -; call BIOS from EXTENSION - _mInfoBLOCK #3FD0-$,#FF ; ToBIOS_FromEXT + _mInfoBLOCK #3FD0-$,#FF +;ToBIOS_FromEXT: call BIOS from EXTENSION PUSH AF LD A,ROM.BIOS ; set BIOS to slot0 OUT (SYS_PORT.ROM),A @@ -392,13 +398,15 @@ TRDOS_HD_CMD: ;--------------------------------------- -;------------[HDD_5x portal]------------ -; точка входа/выхода для функций 5х из BIOS +;------------[Portal to EXT]------------ +; точка входа/выхода для функций из BIOS _mInfoBLOCK #3FE8-$,#FF -;RET_TO_EXP: - ; PUSH AF - ; LD A,ROM.BIOS - ; OUT (SYS_PORT.ROM),A +RET_TO_BIOS: ;RET_TO_EXP: + PUSH AF + LD A,ROM.BIOS + OUT (SYS_PORT.ROM),A ; from BIOS EXTENSION_FNs + POP AF + RET ; JP HDD_FN_5x ;--------------------------------------- diff --git a/src/bios/rom/SETUP/MAIN.asm b/src/bios/rom/SETUP/MAIN.asm index 6a2c28a..71eae0c 100644 --- a/src/bios/rom/SETUP/MAIN.asm +++ b/src/bios/rom/SETUP/MAIN.asm @@ -363,6 +363,7 @@ INT_ON: ;------------------------[go to spectrum from bios]---------------------; EXIT_SETUP: CALL INT_OFF CALL TRD_MOUNT ; !TEST 24/09/2024 перенос в EXIT_SETUP (перед запуском ZX) + CALL SetUp_ZX_HDD IF FREE_ZX_PAGES LD A,Spec_Page @@ -392,13 +393,22 @@ EXIT_SETUP: CALL INT_OFF HALT JR .loop_di ; -.set_ZX_params: LD L,A ; Block_ID.vRAM - -====== +.set_ZX_params: LD H,A ; Block_ID.vRAM ;!TODO настраивать в BIOS zx mode LD DE,256*0 + CNF_PORT.TURBO.ON + CNF_PORT.CNF_0 + LD A,(SYS_PAGE.Block_ID.vROM) + LD L,A + LD B,#FE ; !HARDCODE Port All Mode data + LD A,%0000'0010 + EX AF,AF' + XOR A ; - JP GOTO_SPEC.FN + ;POP HL ; НЕ нужен. адрес возврата в EXP из SETUP + LD A,ROM.EXTENSION + OUT (SYS_PORT.ROM),A + XOR A + JP GOTO_SPECTRUM.FN + ELSE ;LD BC,#020E ;CALL GET_CMOS_VALUE @@ -407,7 +417,7 @@ EXIT_SETUP: CALL INT_OFF ;JR Z,XFLEX ;LD A,#EA ;SPECTRUM ;XFLEX: - LD A,ROM.BIOS + XOR A ;LD A,ROM.BIOS OUT (SYS_PORT.ROM),A POP HL ; пихается в EXP.ASM в процедуре JP (HL) @@ -418,6 +428,43 @@ EXIT_SETUP: CALL INT_OFF ;JMPHL EQU $+1 ;JP #0000 ENDIF + +SetUp_ZX_HDD: LD D,CMOS_CELL.TRDOSmount + CALL CMOS_RD + AND %1010'1010 ; маска для 4-х HDD + RET Z + ; find first good partition + ; + ; чистка переменных ZX HDD + IN A,(SLOT3) + EX AF,AF + LD A,SYS_PAGE + OUT (SLOT3),A + ; + XOR A + LD H,A + LD L,A + LD (SYS_PAGE.CURRENT_DIR_SEC_L),HL + LD (SYS_PAGE.CURRENT_DIR_SEC_H),HL + DEC A + LD (SYS_PAGE.CURRENT_HDD),A + LD (SYS_PAGE.CURRENT_DIR_DRIVE),A + LD (SYS_PAGE.CURRENT_DIR_DRIVE_COPY),A + ; + EX AF,AF + OUT (SLOT3),A + EX AF,AF + ; + XOR A +.loop: PUSH AF + CALL FN_HDD_PART + POP BC + RET NC + LD A,B + INC A + CP #10 + JR C,.loop + RET ;-----------------------------------------------------------------------; INSTALL: @@ -523,7 +570,7 @@ START: ;CALL ZXCLS ; CALL READING - CALL TCHEKSM + CALL TEST_CHECKSUM CALL NZ,SETDEFX ;!TODO CMOS Disabled use of CONFIG_DE (#C13A) word @@ -591,7 +638,7 @@ SET_RESTART_ID: PUSH AF LD HL,RESTART_ID.str LD DE,SYS_PAGE.RESTART_ID - LD BC,RSTID.size + LD BC,RESTART_ID.size LDIR LD HL,PowerOnDate ; !TODO изменить под структуру, когда структура переменных будет готова CALL GETTIME @@ -1660,10 +1707,15 @@ ZXMODE_SETUP: IN A,(SLOT3) LD R,A ; ; Load ZX ROM's - CALL MANAGE_ZX_PAGES.FREE_vMEMORY ;!FIXIT не та страница в SLOT3 ; [ ] free zx pages! - LD B,3 ; !HARDCODE zx-rom number of pages + LD A,ROM.EXTENSION + OUT (SYS_PORT.ROM),A + CALL MANAGE_ZX_PAGES.FREE_vMEMORY ;!FIXIT не та страница в SLOT3 ; [ ] free zx pages! + XOR A ;LD A,ROM.BIOS + OUT (SYS_PORT.ROM),A + ; + LD B,3 ; !HARDCODE zx-rom number of pages CALL EMM.GetMem - JR C,.init_41h ;!FIXIT печатать ошибку ; [ ] free zx pages! + JR C,.init_41h ;!FIXIT печатать ошибку ; [ ] free zx pages! CALL init_zx_roms IFN FREE_ZX_PAGES ; ставим метку если прогрузили ПЗУ спектрума @@ -1688,7 +1740,13 @@ ZXMODE_SETUP: IN A,(SLOT3) LD (HL),#FF LDDR ; зачищаем EX DE,HL - JP MANAGE_ZX_PAGES.INIT_vROM + ; + LD A,SYS_PORT.EXTENSION + OUT (SYS_PORT.ROM),A + JP MANAGE_ZX_PAGES.INIT_vROM + XOR A ;LD A,SYS_PORT.BIOS + OUT (SYS_PORT.ROM),A + RET ; ;--------------------[copy zx-roms to zx-pages]-----------------; ; SLOT0 - ROM 8, sys_port - on. @@ -1718,10 +1776,10 @@ init_zx_roms: DI OUT (SLOT3),A ; устанавливаем номера страниц vROM в порты ALTERA DEC HL + LD A,ROM.EXTENSION + OUT (SYS_PORT.ROM),A CALL MANAGE_ZX_PAGES.INIT_vROM ; Копируем образы ZX-ROM из ПЗУ в страницы vROM - LD A,SYS_PORT.EXTENSION - OUT (SYS_PORT.ROM),A INC A ; !HARDCODE LD A,2 LD BC,+(3*2)*256 + SLOT3 ; !HARDCODE B = (zx-rom number of pages)*2 LD HL,memBUFFER.Shared + 1 diff --git a/src/bios/rom/SETUP/SETTINGS.asm b/src/bios/rom/SETUP/SETTINGS.asm index bfc7187..d0ef200 100644 --- a/src/bios/rom/SETUP/SETTINGS.asm +++ b/src/bios/rom/SETUP/SETTINGS.asm @@ -654,7 +654,7 @@ CHEKSUM: DJNZ .loop RET -TCHEKSM: +TEST_CHECKSUM: CALL CHEKSUM LD A,CMOS_CELL.CheckSum CALL READCMS diff --git a/src/bios/rom/ZX/ZX_FUNC.ASM b/src/bios/rom/ZX/ZX_FUNC.ASM index d6e153b..10f34c7 100644 --- a/src/bios/rom/ZX/ZX_FUNC.ASM +++ b/src/bios/rom/ZX/ZX_FUNC.ASM @@ -1,15 +1,3 @@ -; Вход через USR 15600 - ASSERT $ = #C0, "Error with RET_FROM_BIOS_TO_BASIC48 address!!!" -RET_FROM_BIOS_TO_BASIC48: - CALL CH_2 - CALL COMAND_LINE ; ВЫПОЛНЕНИЕ КОМАНДЫ, ЕСЛИ ЕСТЬ - ; Вход без команды - JP SW_ROM_1 ; ВОЗВРАТ В << MAIN MENU >> - -;-----------------------------------------------------------------------; -; - - ; ;----------------------------[ ??????????? ]----------------------------; ; TURBO_OFF: @@ -254,4 +242,657 @@ CH_2: LD A,2 C_1601: ; OPEN CHANEL CALL_48 #1601 ;!HARDCODE RET -; \ No newline at end of file +;-----------------------------------------------------------------------; + + + + +;-----------------------------------------------------------------------; +; MANAGE_ZX_PAGES +;-----------------------------------------------------------------------; +;-------------------------------------------------------------------------------------------------------------------; +;!TODO сделать выбор в Setup, что грузить в vПЗУ при старте. Варианты: +;[~] 0 - Не грузить ПЗУ спектрума, инитить страницу #41 как в 3.04 +;[~] 1 - Грузит ПЗУ спектрума из ROM при старте если нет флага ZX +;[~] 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' + +; для входа в режим спектрума: +; 0. Проверка метки ZX +; 1. CONFIG_DE.CNF_PORT Тип тачки, как инитить память, размер ОЗУ, турба +; 2. CONFIG_DE.ZX_START страница vROM для запуска +; 3. Настройки экрана (INT, Sync) +; 4. Торможение памяти (port all mode) +; 5. Block_ID.vROM +; 6. Block_ID.vRAM + +; _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! +; ????? SYS_PAGE.SHARED_BUFFER_256b +; +; [ ] Страница ОЗУ для скорпа в SLOT0 должна совпадать с нулевой страницей порта #7FFD + IF FREE_ZX_PAGES + MODULE MANAGE_ZX_PAGES + +;!FIXIT +;----------------[Выделение/освобождение страниц спектрума]-------------; +;вход: рег 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..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 - 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 Z + ; + EXX + 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 +;-----------------------------------------------------------------------; + + +;-----------------------------------------------------------------------; +; Не портить DE +;Вход: A - TASK NUMBER +; GET_ZX_TASK_DATA: +; 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 ; данные новой задачи +; RET +;-----------------------------------------------------------------------; + +;-----------------------------------------------------------------------; +FREE_vRAM: LD A,(SYS_PAGE.Block_ID.vRAM) + OR A + RET Z + XOR A + LD (SYS_PAGE.Block_ID.vRAM),A + LD C,BIOS.FreeMem + JP ToBIOS_FromEXT +;--------------; +FREE_vMEMORY: CALL FREE_vRAM + ;JR FREE_vROM +;--------------; +FREE_vROM: LD A,(SYS_PAGE.Block_ID.vROM) + OR A + RET Z + XOR A + LD (SYS_PAGE.Block_ID.vROM),A + LD C,BIOS.FreeMem + RST_to_BIOS +;--------------; +RES_FLAG_ZXvROM: ; не должно портить DE + EX AF,AF' + IN A,(SLOT3) + EX AF,AF' + LD A,Spec_Page + OUT (SLOT3),A + XOR A + LD (Spec_Page.flag_Z),A + LD (Spec_Page.flag_X),A + EX AF,AF' + OUT (SLOT3),A + RET +;-----------------------------------------------------------------------; + + +;-----------------------------------------------------------------------; +;Вход: A - TASK NUMBER +;Выход: H - vRAM block ID +; L - vROM block ID +GET_RAMBLOCK_IDs: + LD HL,(SYS_PAGE.Block_IDs) + RET +;-----------------------------------------------------------------------; + + +;-----------------------------------------------------------------------; +;Вход: HL - буфер страниц (SLOT1..SLOT2) на которые маппим (всегда 11 шт.) +; Первый байт списка - RAM BLOCK ID. Далее как угодно номера +; страниц для каждого типа страницы vROM. Если какая-то страница +; vROM не используется, то ставится #FF +INIT_vROM: LD A,(HL) + OR A + SCF + RET Z + INC A + JR NZ,.free_pages + LD (HL),A + JR .set_vROM + ; +.free_pages: LD A,(SYS_PAGE.Block_ID.vROM) + CP (HL) + EX DE,HL + LD C,BIOS.FreeMem + CALL NZ,ToBIOS_FromEXT + EX DE,HL + ; + LD A,(HL) +.set_vROM: LD (SYS_PAGE.Block_ID.vROM),A + ; установка портов ROM + LD DE,.PORTS + LD B,.PORTS.Size +.loop: PUSH BC + INC HL + LD A,(HL) + CP #FF + JR NZ,.not_Spec_Page + LD A,Spec_Page +.not_Spec_Page: LD B,A + LD A,(DE) + INC DE + PUSH DE + PUSH HL + LD C,BIOS.SET_PORTS + RST_to_BIOS + ;CALL SET_PORTS + POP HL + POP DE + POP BC + DJNZ .loop + ; установка метки ZX если рамблок не #FF + LD A,(SYS_PAGE.Block_ID.vROM) + OR A + RET Z + ; +.set_ZX_flag: IN A,(SLOT3) + LD D,A + LD A,Spec_Page + OUT (SLOT3),A + ; + LD HL,'XZ' + LD (Spec_Page.flag_Z),HL + ; + LD A,D + OUT (SLOT3),A + 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.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.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 +.PORTS.Size EQU $-.PORTS +;-----------------------------------------------------------------------; + + + + +;-----------------------------------------------------------------------; +;ВХОД: HL - список страниц +; E - 0 = 128kb, 1 = 512kb +INIT_vRAM: XOR A +.set_1ffd: LD BC,#1FFD + OUT (C),A + ; set 128 + LD B,#7F + LD D,%0000'0000 + CALL SET_7FFD + ; + XOR A + OUT (C),A + BIT 3,E ; 128/512 + RET Z + ; set 128 + 384 + ;LD A,SYS_PORT.CNF_512 + ;OUT (SYS_PORT.ROM),A + ; + LD D,%0100'0000 + CALL SET_7FFD + LD D,%1000'0000 + CALL SET_7FFD + LD D,%1100'0000 + CALL SET_7FFD + ; + XOR A + OUT (C),A + RET +;-----------------------------------------------------------------------; + +;-----------------------------------------------------------------------; +;ВХОД: HL - список страниц +; D - начальное значение для 7FFD +SET_7FFD: LD A,(HL) + OUT (C),D + OUT (SLOT3),A + INC HL + INC D + BIT 3,D ; количество страниц + JR Z,SET_7FFD + RET +;-----------------------------------------------------------------------; + + + +;-----------------------------------------------------------------------; +;Выполняется для выделения трёх страниц ОЗУ 48k +GET_48k_MEM: LD D,ZX_MEMORY.MODE_48k + JR GET_XXX_MEM +;Выполняется для инита 3 страниц ОЗУ 48k и 29 страниц ОЗУ Pent512k +GET_512k_MEM: LD D,ZX_MEMORY.MODE_512k + JR GET_XXX_MEM +;Выполняется для выделения 3 страниц ОЗУ 48k и 5 страниц ОЗУ 128k тачек +GET_128k_MEM: LD D,ZX_MEMORY.MODE_128k + ;JR GET_XXX_MEM +GET_XXX_MEM: CALL FREE_vRAM +.init: LD B,D + LD C,BIOS.GetMem + RST_to_BIOS + ;CALL EMM.GetMem + RET C + LD (SYS_PAGE.Block_ID.vRAM),A + RET +;-----------------------------------------------------------------------; + + + +;-----------------------------------------------------------------------; +;Выполняется для выделения 3 страниц ОЗУ 48k и 14 страниц ОЗУ Scorp256k +;Вход: --- +;Выход: A - RAM block ID +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 HL,SYS_PAGE.RAM_TABLE +.allocate_loop: DEC L + JR Z,.error_no_mem + CP (HL) + JR NZ,.allocate_loop + ; + CALL .check_barred_pages + LD A,0 + JR Z,.allocate_loop + ; + LD (HL),C + LD C,L + DJNZ .allocate_loop + ; L = указатель цепочки. + AND A + LD D,L + ; Get Pent128 mem + LD B,ZX_MEMORY.MODE_128k + LD C,BIOS.GetMem + RST_to_BIOS + ;CALL EMM.GetMem + ; A - Pent128 mem block id + LD B,D ; Scorp128 mem block id + LD C,BIOS.MergeMemBlocks + RST_to_BIOS + ;CALL EMM.MergeMemBlocks + LD (SYS_PAGE.Block_ID.vRAM),A + RET + ; + ; фильтр для страниц скорпа + ;выход: ZF=1 - страница не подходит +.check_barred_pages: + ; check reset page + LD A,L + CP RESET_PAGE + RET C + RET Z + ; check isa page + AND D + XOR E ; страницы ISA #D0..#DF + RET NZ + LD L,E + RET + ; +.error_no_mem: LD A,C + LD C,BIOS.FreeMem + RST_to_BIOS + ;CALL EMM.FreeMem + LD A,BIOS.Error.EMM.NoMemory + SCF + RET +;-----------------------------------------------------------------------; + ENDMODULE +;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░; + + +;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░; +;!TODO задействовать +; ПЕРЕДАВАТЬ: номер vROM, vRAM, CONFIG_DE, FN_SYNC, PORT_ALL_MODE, MEM_TYPE +; Вход: D: 0 - BASIC 128, 1 - BASIC 48, 2 - TR-DOS 128, +; 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 +; B: Port All Mode +;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' + LD C,A + ; set shared pages + XOR A + OUT (SLOT2),A ; ZERO_PAGE + DEC A + OUT (SLOT1),A ; SHARED_PAGE + ; + LD A,SYS_PAGE + OUT (SLOT3),A + ; + LD (SYS_PAGE.CONFIG_DE),DE + LD (SYS_PAGE.Block_IDs),HL ;!FIXIT освободить старые значения? ; [ ] free zx pages! + ; + EXX + LD SP,#C000 + ; + ; [ ] free zx pages! ;!TODO если задача пустая, то первый инит + ; + ;!TODO сделать активацию винта для параметра из Setup + ;!TODO установить где-нибудь ниже стэк из TASK + ; LD A,(IX + _ZX_TASK_DATA.PORT_ALL_MODE) + ; LD BC,Port_All_Mode + ; OUT (C),A + ; установка инта + EXX + LD A,C + EXX + AND %0000'0011 + LD C,BIOS.FN_SYNC + RST_to_BIOS + ;CALL FN_SYNC + ; установка развёртки + EXX + LD A,C + EXX + RLCA + AND %0000'0001 + OR %1000'0110 + LD C,BIOS.FN_SYNC + RST_to_BIOS + ;CALL FN_SYNC + EXX + LD A,C + EXX + ; + AND %0000'0100 ;!TODO запомнить/восстановить кастомную палитру? + LD BC,BIOS.SET_PAL_INIT.ZX + CALL Z,ToBIOS_FromEXT + ; + LD E,0 + LD BC,BIOS.LP_OPEN_S.ZX_32x24_Default + RST_to_BIOS + ;CALL LP_SET_32 + ; + LD E,0 + LD HL,#5104 + LD BC,BIOS.LP_OPEN_S.ZX_32x24 + RST_to_BIOS + ;CALL LP_SET_32.X + ; .SHARED_BUFFER_256b + LD A,(SYS_PAGE.Block_ID.vRAM) + LD HL,SYS_PAGE.SHARED_BUFFER_256b + LD C,BIOS.GetMemBlkPages + RST_to_BIOS + ;CALL EMM.GetMemBlkPages + ;!FIXIT + ;RET C + ; !FIXIT проверка размера блока, сделать, чтоб выбирался объём памяти + ;LD A,B + ;CP 16 + ; + LD D,B +;.TASK_0: XOR A ; задача 0, режим 256 килобайт +.START_TASK: LD IY,.BASIC_128 + JP INIT_PAGES ; инициализация номеров страниц режима спектрума + ; +;start_basic: +.BASIC_128: LD SP,#C000 + LD HL,RES128_PROG + LD DE,ZX_VARS.PRINTER_BUFFER ; запуск программы на BASIC-е. + LD BC,RES128_PROG.Size + LDIR + DI + JP ZX_VARS.PRINTER_BUFFER +;-----------------------------------------------------------------------; + + +;-----------------------------------------------------------------------; +;***************************************** +; +; Инициализация страниц для +; спектрумовского режима и +; восстановление спектрумовского +; экрана +; +; Возврат по IY +; +; !!! NO USE STACK !!! +; +;***************************************** +;!TODO стек установлен во второй странице, не использовать или устанавливать в другую! +; инициализация страниц zx spectrum +; HL - адрес блока страниц в SYS_PAGE SLOT3 +; D - количество этих страниц +INIT_PAGES: LD A,SYS_PAGE + OUT (SLOT1),A + LD A,SYS_PORT.TURBO.ON + SYS_PORT.CNF_0 + SYS_PORT.CNF_512 + OUT (SYS_PORT.ROM),A + ; + RES 7,H + ; + LD A,D + CP ZX_MEMORY.MODE_48k + JR Z,.set_48k + ; + LD E,0 ; pent128 + CP ZX_MEMORY.MODE_256k + JR Z,.set_scorp + ; + CP ZX_MEMORY.MODE_128k + JR Z,.set_pent + INC E + CP ZX_MEMORY.MODE_512k + JR Z,.set_pent + ;!FIXIT обработка ошибки + DI + HALT + ; +.set_scorp: CALL MANAGE_ZX_PAGES.INIT_vRAM + LD A,#10 + CALL MANAGE_ZX_PAGES.INIT_vRAM.set_1ffd + ; A = 0, BC = #7FFD + LD B,#1F + OUT (C),A + JR .set_table + ; +.set_pent: CALL MANAGE_ZX_PAGES.INIT_vRAM + ; меняем порядок для процедуры set_48k +.set_table: LD A,(SYS_PAGE.SHARED_BUFFER_256b+2 - #8000) ; SLOT2 page + LD D,A + LD A,(SYS_PAGE.SHARED_BUFFER_256b+5 - #8000) ; SLOT1 page + LD E,A + LD A,(SYS_PAGE.SHARED_BUFFER_256b+0 - #8000) ; SLOT0, SLOT3 page + JR .set_slots + ; +.set_48k: LD A,(HL) ; SLOT0, SLOT3 page + INC HL + LD E,(HL) ; SLOT1 page + INC HL + LD D,(HL) ; SLOT2 page + ; +.set_slots: OUT (SLOT0),A + OUT (SLOT3),A + LD A,E + OUT (SLOT1),A + LD A,D + OUT (SLOT2),A + ; + XOR A + OUT (RGADR),A ; регистр видео адреса + OUT (RGMOD),A ; регистр моды + JP (IY) +;-----------------------------------------------------------------------; + +; +;>$< >$< >$< >$< >$< >$< [ ПЕРЕМЕЩАЕМАЯ В ОЗУ ] >$< >$< >$< >$< >$< >$< ; +;--------[ Программа, размещаемая с #5B00 для запуска Spectrum ]--------; +RES128_PROG: + DISP ZX_VARS.PRINTER_BUFFER ;#5B00 + XOR A + OUT (SYS_PORT.RAM),A ; Возврат в 128k ROM + LD C,SLOT3 + IN B,(C) + LD A,SYS_PAGE + OUT (SLOT3),A + LD DE,(SYS_PAGE.CONFIG_DE) + OUT (C),B + ; + EXX + LD A,B + EXX + LD BC,Port_All_Mode + OUT (C),A + ; + XOR A + LD BC,#1FFD + OUT (C),A ; Scorp порт + LD B,#7F + OUT (C),A ; 128 порт + ; + LD A,E ; установка конфигурации и режима TURBO + OUT (SYS_PORT.RAM),A ; CONFIG_SET + ; + INC D + DEC D + ; 0 ВХОД В BASIC-128 + JP Z,0 + ; 1 ВХОД В BASIC-48 + LD A,#10 + OUT (C),A + DEC D + JP Z,0 + ; 2 ВХОД В TR-DOS + LD HL,0 + PUSH HL + DEC D + JP Z,#3D29 + ; 3 ВХОД В EXPANSION + ;!TODO пока не работает. Page #45, BIOS (ZX_EXP) #E0 + XOR A + OUT (C),A + LD A,#02 + LD B,#1F + OUT (C),A + DEC D + JP Z,0 + ; + XOR A + OUT (C),A + LD A,#30 + LD B,#7F + OUT (C),A + ;!TEST + LD A,CNF_PORT.PENT_RESET + CNF_PORT.SCORP_RESET + OUT (CNF_PORT.OFF),A + ; + DEC D + ; 4 ВХОД В TR-DOS с закрытыми 128-ми портами + JP Z,#3D29 + ; 5 ВХОД В BASIC-48 с закрытыми 128-ми портами + JP 0 + ENT +.Size EQU $-RES128_PROG +;-----------------------------------------------------------------------; +;>$< >$< >$< >$< >$< >$< >$< >$< >$< >$< >$< >$< >$< >$< >$< >$< >$< >$<; +; +; _ZX_ _ZX_ _ZX_ _ZX_ _ZX_ _ZX_ _ZX_ _ZX_ _ZX_ _ZX_ _ZX_ _ZX_ _ZX_ _ZX_ ; + ENDIF diff --git a/src/bios/shared/DEFINES.INC b/src/bios/shared/DEFINES.INC index f6c8f66..db4e431 100644 --- a/src/bios/shared/DEFINES.INC +++ b/src/bios/shared/DEFINES.INC @@ -11,7 +11,7 @@ BETA_BUILD EQU 7 ; DEFINE USE_E1_SCANCODE 0 ; DEFINE RECOVERYmountTYPE 1 ; 1 - быстрый немного захардкоженый вариант. 2 - более "правильный" DEFINE RECOVERYrdChooseTYPE 1 ; 1 - RECOVERY грузится в диск 15, 2 - ищется свободный рамдиск, если нет, то в 15-ый - DEFINE FREE_ZX_PAGES 0 ; 1 - освободить страницы спектрума ;!TODO + DEFINE FREE_ZX_PAGES 1 ; 1 - освободить страницы спектрума ;!TODO ;----[ Задержка в кадрах после отрисовки логотипа (0 = 256) ]---; DEFINE LOGO_DELAY_MIN 25 ; DEFINE LOGO_DELAY_NORM 100 ;