diff --git a/Shared_Includes b/Shared_Includes index 39d0997..ba1bc48 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 39d099768ae06d08777c63c9d5036fa4ab9c9a01 +Subproject commit ba1bc48d1597637a512a5333d2a76f94b5b26231 diff --git a/src/bios/exp/EXP.asm b/src/bios/exp/EXP.asm index ed39583..d825c20 100644 --- a/src/bios/exp/EXP.asm +++ b/src/bios/exp/EXP.asm @@ -894,7 +894,7 @@ PrepareToZX: ; Setup HDD drives for ZX Spectrum mode .start_zx: ; IF FREE_ZX_PAGES ; не должно сюда попасть - LD B,BIOS.REINIT.HARD_RESET + LD B,high BIOS.REINIT.HARD_RESET JP REINIT ; ELSE ; [x] free zx pages! ; XOR A @@ -1239,6 +1239,12 @@ PROG_NO_ROM: OUT (SLOT2),A OUT (SLOT1),A ; + LD HL,MESSAGE_NR + LD DE,#A000 + LD BC,MESSAGE_NR.size + LD A,C + LDIR + ; LD SP,#BF00 ; LD E,0 @@ -1253,12 +1259,6 @@ PROG_NO_ROM: 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 diff --git a/src/bios/exp/FUNC_SERVICE.asm b/src/bios/exp/FUNC_SERVICE.asm index e09ec5f..a0f622c 100644 --- a/src/bios/exp/FUNC_SERVICE.asm +++ b/src/bios/exp/FUNC_SERVICE.asm @@ -11,68 +11,47 @@ ; PG_Sp2000 EQU #FE ; PG_Sp2000_REINIT EQU #FD ; + RST_CONF: ;--[] ZX Spectrum -.AY8910: - ; !FIXIT не нужно это больше в CMOS, переделать под TASK - ;LD D,CMOS_CELL.HardwareConfiguration ; CONFIG_DE (D) - значение CNF_PORT - ;CALL CMOS_RD - ;OR 1 - ;CALL CMOS_WR - ; - - LD BC,Port_All_Mode - IN A,(C) - AND Port_All_Mode.DEFAULT - Port_All_Mode.SPECTRUM_MODE_OFF - OUT (C),A ; ACC_OFF - - ;LD A,PG_AY - LD DE,ACEX.Config_ID.Sp97_AY - JR .INT_PLD +.AY8910: CALL .ACC_OFF + LD DE,ACEX.Config_ID.Sp97_AY + JR .INT_PLD ;--[] ;--[] Sprinter ZX -.SP97_1: - ; !FIXIT не нужно это больше в CMOS, переделать под TASK - ;LD D,CMOS_CELL.HardwareConfiguration ; CONFIG_DE (D) - значение CNF_PORT - ;CALL CMOS_RD - ;AND #FE - ;CALL CMOS_WR - ; - - LD BC,Port_All_Mode - IN A,(C) - AND #FE ;!HARDCODE - OUT (C),A ; ACC_OFF - - ;LD A,PG_SP1 - LD DE,ACEX.Config_ID.Sp97_1 - JR .INT_PLD +.SP97_1: CALL .ACC_OFF + LD DE,ACEX.Config_ID.Sp97_1 + JR .INT_PLD ;--[] ;--[] -.SP97_2: - LD BC,Port_All_Mode - IN A,(C) - OR 1 ; ACC_ON - OUT (C),A - ;LD A,PG_SP2 - LD DE,ACEX.Config_ID.Sp97_2 - JR .INT_PLD +.SP97_2: CALL .ACC_ON + LD DE,ACEX.Config_ID.Sp97_2 + JR .INT_PLD ;--[] ;--[] ;[x] -.SP2000: - LD BC,Port_All_Mode - IN A,(C) - OR 1 ; ACC_ON - OUT (C),A - LD DE,ACEX.Config_ID.Sp2000 - JR .INT_PLD +.SP2000: CALL .ACC_ON + LD DE,ACEX.Config_ID.Sp2000 + JR .INT_PLD ;--[] +;--[] +.ACC_OFF: LD BC,Port_All_Mode + IN A,(C) + AND Port_All_Mode.DEFAULT - Port_All_Mode.SPECTRUM_MODE_OFF + OUT (C),A + RET + ; +.ACC_ON: LD BC,Port_All_Mode + IN A,(C) + OR 1 ; ACC_ON + OUT (C),A + RET +;--[] ;--[] .CUSTOM: @@ -82,7 +61,7 @@ RST_CONF: LD C,SLOT3 IN B,(C) OUT (C),A ; PAGE с прошивкой - LD DE,(#C090) ; PLD-ID + LD DE,(#C090) ; PLD-ID OUT (C),B ; RET page ;--[] ;JR INT_PLD .INT_PLD: ; only for old FLEX10K soft compatible @@ -174,7 +153,7 @@ RST_CONF: LDIR ; если ZF=0, то процедура сделает ресет с перезаливкой из BIOS, иначе из КЭШ CALL Spec_Page.init_acex - LD BC,256*BIOS.REINIT.HARD_RESET + BIOS.REINIT + LD BC,BIOS.REINIT.HARD_RESET ; ; на входе в BC параметры функции BIOS .INIT_ACEX.ifSoftreset: @@ -220,7 +199,7 @@ RST_CONF: ; *. Сохранить куда-нибудь значение стека ; * ; .. ... ... .. - ;LD BC,256*BIOS.REINIT.HARD_RESET + BIOS.REINIT + ;LD BC,BIOS.REINIT.HARD_RESET JP_to_BIOS ; .ReturnSoftReset: @@ -234,7 +213,7 @@ RST_CONF: LD A,Spec_Page OUT (SLOT3),A ; - LD BC,256*BIOS.REINIT.SOFT_RESET + BIOS.REINIT + LD BC,BIOS.REINIT.SOFT_RESET JR .INIT_ACEX.ifSoftreset ; ;;; @@ -321,63 +300,55 @@ RST_CONF: ; ;*************************************** + ;[x] ;--------------------------[;!TODO потестить]--------------------------; ; B - параметр сброса ; B = 1 - RESTART. ; B = 2 - Soft reset ; B = 3 - Hard reset -REINIT: DEC B - JR Z,.Restart ;1 - DEC B - JR Z,.SoftReset ;2 - DEC B - SCF - RET NZ -; JR Z,.HardReset ;3 -; DEC B -; .ReinitZXpages: ;4 -; LD DE,RESERVED_PAGES ; таблица занятых системных страниц -; LD HL,SYS_PAGE.RAM_TABLE ; Адрес FAT ОЗУ. - -; LD C,SLOT3 -; IN B,(C) -; LD A,SYS_PAGE -; OUT (SLOT3),A - -; LD A,(DE) -; .zxloop: -; CP #FF -; JR Z,.endzxloop -; INC DE -; LD L,A - -; LD A,(HL) -; AND A -; JR NZ,.errorzxloop - -; LD A,(DE) -; LD (HL),A -; JR .zxloop - -; .errorzxloop: -; DEC DE -; LD HL,-RESERVED_PAGES-1 -; ADD HL,DE -; JR NC,.errorzxloop_noChanges - -; DEC DE -; LD H,high SYS_PAGE.RAM_TABLE -; LD A,(DE) -; LD L,A -; LD A,#FF -; LD (HL),A -; .errorzxloop_noChanges: -; SCF -; .endzxloop: -; OUT (C),B -; RET -; +; B = 4 - Free memory except ZX pages +REINIT: DEC B + JR Z,.Restart ; 1 + DEC B + JR Z,.SoftReset ; 2 + DEC B + JR Z,.HardReset ; 3 + DEC B + SCF + RET NZ + ; ; 4 +.FreeNoZxMem: DI + LD C,SLOT3 + IN B,(C) + LD A,SYS_PAGE + OUT (C),A + LD (SYS_PAGE.SP_SAVE),SP + LD SP,SYS_PAGE.SYS_SP + PUSH BC + ; чистим буфер + LD HL,SYS_PAGE.SHARED_BUFFER_256b + LD DE,SYS_PAGE.SHARED_BUFFER_256b + 1 + LD BC,255 + LD (HL),0 + LDIR + ; + LD IX,SYS_PAGE.Block_IDs + LD H,high SYS_PAGE.RAM_TABLE + LD D,high SYS_PAGE.SHARED_BUFFER_256b + LD BC,2*256 + #FF ; 2 = vRAM и VROM ID's + CALL SAVE_CHAINS + ; + CALL EMM.InitMem + ; + LD HL,SYS_PAGE.SHARED_BUFFER_256b + LD DE,SYS_PAGE.RAM_TABLE + CALL RESTORE_CHAINS + ; CF=0 + POP BC + LD SP,(SYS_PAGE.SP_SAVE) + OUT (C),B + RET ;[x] .HardReset: @@ -430,5 +401,92 @@ REINIT: DEC B .loop2: LD (#C000),A ; Soft RESET !!! JR .loop2 ; + +;----------------------------------------------------------------------; +; Вход: H - RAM_TABLE +; D - Buffer for RAM_TABLE +; IX - указатель на последовательность из RAM BLOCK ID +; B - кол-во RAM BLOCK ID в последовательности +; C - #FF (чтоб LDI не ломало DJNZ счётчик) +SAVE_CHAINS: LD A,(IX) + INC IX + OR A + LD L,A + CALL NZ,COPY_CHAIN + DJNZ SAVE_CHAINS + RET +; Вход: H - RAM_TABLE +; L - RAM BLOCK ID +; D - Buffer for RAM_TABLE +COPY_CHAIN: LD E,L + LDI + DEC L + LD L,(HL) + INC L + RET Z + DEC L + JR COPY_CHAIN +;--------------; +; Вход: HL - копия RAM_TABLE откуда копировать +; DE - RAM_TABLE +RESTORE_CHAINS: XOR A +.loop: CP (HL) + JR Z,.NoCopy + LD E,L + LDI + DEC L +.NoCopy: INC L + JR NZ,.loop + RET +;----------------------------------------------------------------------; + + +;----------------------------------------------------------------------; +; старый вариант освобождения страниц спектрума через RAM BLK ID 1 +;----------------------------------------------------------------------; +; JR Z,.HardReset ;3 +; DEC B +; .ReinitZXpages: ;4 +; LD DE,RESERVED_PAGES ; таблица занятых системных страниц +; LD HL,SYS_PAGE.RAM_TABLE ; Адрес FAT ОЗУ. + +; LD C,SLOT3 +; IN B,(C) +; LD A,SYS_PAGE +; OUT (SLOT3),A + +; LD A,(DE) +; .zxloop: +; CP #FF +; JR Z,.endzxloop +; INC DE +; LD L,A + +; LD A,(HL) +; AND A +; JR NZ,.errorzxloop + +; LD A,(DE) +; LD (HL),A +; JR .zxloop + +; .errorzxloop: +; DEC DE +; LD HL,-RESERVED_PAGES-1 +; ADD HL,DE +; JR NC,.errorzxloop_noChanges + +; DEC DE +; LD H,high SYS_PAGE.RAM_TABLE +; LD A,(DE) +; LD L,A +; LD A,#FF +; LD (HL),A +; .errorzxloop_noChanges: +; SCF +; .endzxloop: +; OUT (C),B +; RET + ;----------------------------------------------------------------------; ; \ No newline at end of file diff --git a/src/bios/exp/FUNC_SYS.ASM b/src/bios/exp/FUNC_SYS.ASM index c916220..1f560e6 100644 --- a/src/bios/exp/FUNC_SYS.ASM +++ b/src/bios/exp/FUNC_SYS.ASM @@ -306,6 +306,8 @@ INIT_CONFIG_ALL: ; LD (HL),0 ; LDIR + + EX AF,AF' OUT (SLOT2),A @@ -325,6 +327,7 @@ INIT_CONFIG_ALL: RET ;----------------------------------------------------------------------; + ;----------------------------------------------------------------------; FN_TURBO: CP 2 diff --git a/src/bios/rom/SETUP/MAIN.asm b/src/bios/rom/SETUP/MAIN.asm index 6dfef03..032c92e 100644 --- a/src/bios/rom/SETUP/MAIN.asm +++ b/src/bios/rom/SETUP/MAIN.asm @@ -254,11 +254,16 @@ CLEAR_MEM: IN A,(SLOT3) LD (HL),0 LDIR ; копируем ZX vROM - LD IX,SYS_PAGE.Block_ID.vROM + LD HL,(SYS_PAGE.Block_ID.vROM) ; нужно значение в L LD H,high SYS_PAGE.RAM_TABLE LD D,high MEMMAP2 - LD BC,#01FF ;!HARDCODE 1 vROM RAM BLOCK ID - CALL .SAVE_RMD + ;LD BC,#01FF ;!HARDCODE 1 vROM RAM BLOCK ID + CALL COPY_CHAIN + ; LD IX,SYS_PAGE.Block_ID.vROM + ; LD H,high SYS_PAGE.RAM_TABLE + ; LD D,high MEMMAP2 + ; LD BC,#01FF ;!HARDCODE 1 vROM RAM BLOCK ID + ; CALL .SAVE_RMD ; [x] 28/09/2024 Отдельные рамдиски для режима спектрума и DSS. LD B,high BIOS.SWAP_RAM_DRIVES.Sp2000 CALL SWAP_RAM_DRIVES @@ -284,13 +289,15 @@ CLEAR_MEM: IN A,(SLOT3) LD H,high SYS_PAGE.RAM_TABLE LD D,high MEMMAP2 LD BC,SYS_PAGE.RAMD_KEYS.NUM*256+#FF - CALL .SAVE_RMD + CALL SAVE_CHAINS ; [x] 4/11/2023 ; LD IX,SYS_PAGE.Sp_RAMD_KEYS ; LD B,SYS_PAGE.Sp_RAMD_KEYS.NUM ; CALL .SAVE_RMD ; .skip_save_rmd: CALL EMM.InitMem + LD HL,MEMMAP2 + LD DE,SYS_PAGE.RAM_TABLE CALL RESTORE_CHAINS POP AF JR Z,.skip_restore_rmd @@ -312,13 +319,13 @@ CLEAR_MEM: IN A,(SLOT3) ; JP SWAP_RAM_DRIVES RET ; -.SAVE_RMD: LD A,(IX) - INC IX - OR A - LD L,A - CALL NZ,COPY_CHAIN - DJNZ .SAVE_RMD - RET +; SAVE_CHAINS: LD A,(IX) +; INC IX +; OR A +; LD L,A +; CALL NZ,COPY_CHAIN +; DJNZ SAVE_CHAINS +; RET ; ; @@ -366,22 +373,20 @@ CLEAR_MEM: IN A,(SLOT3) ; RETI ; ; -INT_OFF: - DI - LD A,#3F - LD I,A - IM 1 - RET - -INT_ON: - DI - LD A,+high INT_POINTER - LD I,A - LD HL,INT_HANDLER - LD (INT_POINTER),HL - IM 2 - EI - RET +INT_OFF: DI + LD A,#3F + LD I,A + IM 1 + RET + ; +INT_ON: DI + LD A,+high INT_POINTER + LD I,A + LD HL,INT_HANDLER + LD (INT_POINTER),HL + IM 2 + EI + RET ; ; @@ -403,38 +408,40 @@ EXIT_SETUP: CALL INT_OFF LD A,B JR NZ,.Set_Page41 CP 'X' - JR Z,.vROMs_Installed + ;JR Z,.vROMs_Installed ; -.Set_Page41: CALL ZXMODE_SETUP.Set_Page41 +.Set_Page41: CALL NZ,ZXMODE_SETUP.Set_Page41 .vROMs_Installed: - XOR A - LD BC,4*256 + BIOS.ZX_MEMORY_MANAGER ; [ ] free zx pages! HARDCODE MANAGE_ZX_PAGES.GET_SCORP_RAM - RST ToBIOS_18 ;!TODO настраивать в BIOS zx mode - JR NC,.set_ZX_params +; XOR A +; LD BC,4*256 + BIOS.ZX_MEMORY_MANAGER ; [ ] free zx pages! HARDCODE MANAGE_ZX_PAGES.GET_SCORP_RAM +; RST ToBIOS_18 ;!TODO настраивать в BIOS zx mode +; JR NC,.set_ZX_params +; ; +; CALL ScreenPOS.CRLF +; LD A,msgStrings.noMemZX +; LD E,COLORS.CGA.INK.RED +; CALL POSTMSC +; .loop_di: DI +; HALT +; JR .loop_di ; - CALL ScreenPOS.CRLF - LD A,msgStrings.noMemZX - LD E,COLORS.CGA.INK.RED - CALL POSTMSC -.loop_di: DI - HALT - JR .loop_di +.set_ZX_params: ;LD H,A ; Block_ID.vRAM + ;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 ; -.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 - ; - ;POP HL ; НЕ нужен. адрес возврата в EXP из SETUP LD A,ROM.EXTENSION OUT (SYS_PORT.ROM),A - XOR A - JP GOTO_SPECTRUM.FN + ;XOR A + ;JP GOTO_SPECTRUM.FN + ;!TODO настраивать в BIOS zx mode + JP SPRINTER_ZX + + ; ELSE ;LD BC,#020E @@ -1456,26 +1463,26 @@ GET_ID: LD HL,memBUFFER.ID ;R01 RET -COPY_CHAIN: LD E,L - LDI - DEC L - LD L,(HL) - INC L - RET Z - DEC L - JR COPY_CHAIN +; COPY_CHAIN: LD E,L +; LDI +; DEC L +; LD L,(HL) +; INC L +; RET Z +; DEC L +; JR COPY_CHAIN -RESTORE_CHAINS: LD HL,MEMMAP2 - LD DE,SYS_PAGE.RAM_TABLE - XOR A -.loop: CP (HL) - JR Z,.NoCopy - LD E,L - LDI - DEC L -.NoCopy: INC L - JR NZ,.loop - RET +; ; Вход: HL - копия RAM_TABLE откуда копировать +; RESTORE_CHAINS: LD DE,SYS_PAGE.RAM_TABLE +; XOR A +; .loop: CP (HL) +; JR Z,.NoCopy +; LD E,L +; LDI +; DEC L +; .NoCopy: INC L +; JR NZ,.loop +; RET ;---------------------------------------------------------------[] ;REGISTER #1E diff --git a/src/bios/rom/SETUP/messages.z80 b/src/bios/rom/SETUP/messages.z80 index fa7f635..c074bc7 100644 --- a/src/bios/rom/SETUP/messages.z80 +++ b/src/bios/rom/SETUP/messages.z80 @@ -573,7 +573,7 @@ msgStrings: _mSetStr bootFail, tmp_Counter : DZ ' fail' ; !FIXIT strFail _mSetStr bootOk, tmp_Counter : DZ ' OK' _mSetStr afterBootFail, tmp_Counter : DZ 'PRESS TO REBOOT, TO ENTER SETUP OR TO ZX-MODE . . .' - _mSetStr noMemZX, tmp_Counter : DZ 'Error! No free memory to start ZX mode. Press CTRL+ALT+DEL or RESET.' +; _mSetStr noMemZX, tmp_Counter : DZ 'Error! No free memory to start ZX mode. Press CTRL+ALT+DEL or RESET.' ; _mSetStr parLang, tmp_Counter : DZ 'Language (язык) : ' _mSetStr valLangEng, tmp_Counter : DZ 'English ' @@ -733,7 +733,7 @@ msgRusStrings: _mSetStrRus bootFail, tmp_Counter : DZ ' невозможен' _mSetStrRus bootOk, tmp_Counter : DZ ' OK' _mSetStrRus afterBootFail, tmp_Counter : DZ 'НАЖМИТЕ ДЛЯ ПЕРЕЗАГРУЗКИ, ДЛЯ НАСТРОЕК ИЛИ ДЛЯ ZX-MODE . . .' - _mSetStrRus noMemZX, tmp_Counter : DZ 'Ошибка! Недостаточно памяти для старта ZX Mode. Нажмите CTRL+ALT+DEL или RESET.' +; _mSetStrRus noMemZX, tmp_Counter : DZ 'Ошибка! Недостаточно памяти для старта ZX Mode. Нажмите CTRL+ALT+DEL или RESET.' ; _mSetStrRus parLang, tmp_Counter : DZ 'Язык (language) : ' _mSetStrRus valLangEng, tmp_Counter : DZ 'English ' diff --git a/src/bios/rom/ZX/ZX_FUNC.ASM b/src/bios/rom/ZX/ZX_FUNC.ASM index 79cf33e..75e8429 100644 --- a/src/bios/rom/ZX/ZX_FUNC.ASM +++ b/src/bios/rom/ZX/ZX_FUNC.ASM @@ -473,7 +473,7 @@ FN_ENTRANCE: ;!TODO A - TASK NUMBER PUSH DE ;-----------------------------------; ; Sub FN #8x - BIT 7,B +.API: BIT 7,B JR NZ,INIT_vROM ; B = 128 ; Sub FN #4x BIT 6,B @@ -517,8 +517,7 @@ FREE_vRAM: LD A,(SYS_PAGE.Block_ID.vRAM) RET Z LD C,BIOS.FreeMem CALL ToBIOS_FromEXT - RET C - XOR A + LD A,0 LD (SYS_PAGE.Block_ID.vRAM),A RET ;--------------; @@ -529,7 +528,7 @@ FREE_vROM: LD A,(SYS_PAGE.Block_ID.vROM) RET Z LD C,BIOS.FreeMem CALL ToBIOS_FromEXT - RET C + PUSH AF XOR A LD (SYS_PAGE.Block_ID.vROM),A ;--------------; @@ -544,6 +543,7 @@ RES_FLAG_ZXvROM: ; LD (Spec_Page.flag_X),A EX AF,AF' OUT (SLOT3),A + POP AF RET ;-----------------------------------------------------------------------; @@ -636,7 +636,6 @@ GET_SCORP_RAM: CALL FREE_vRAM ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░; ; [ ] free zx pages! -; ПЕРЕДАВАТЬ: номер 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 @@ -689,6 +688,7 @@ GOTO_SPECTRUM: LD A,BIOS.Error.NotSupported EXX ; LD A,C + PUSH BC EXX AND %0000'0100 ;!TODO запомнить/восстановить кастомную палитру? LD BC,BIOS.SET_PAL_INIT.ZX @@ -703,6 +703,9 @@ GOTO_SPECTRUM: LD A,BIOS.Error.NotSupported LD BC,BIOS.LP_OPEN_S.ZX_32x24 CALL ToBIOS_FromEXT ; + LD BC,BIOS.SWAP_RAM_DRIVES.ZX + CALL ToBIOS_FromEXT + ; LD A,(SYS_PAGE.Block_ID.vRAM) LD HL,SYS_PAGE.SHARED_BUFFER_256b LD C,BIOS.GetMemBlkPages @@ -714,13 +717,17 @@ GOTO_SPECTRUM: LD A,BIOS.Error.NotSupported ;CP 16 ; LD D,B + EXX + POP BC + EXX ;.TASK_0: задача 0, режим 256 килобайт .START_TASK: XOR A OUT (RGADR),A ; регистр видео адреса OUT (RGMOD),A ; регистр моды ; LD IY,.BASIC_128 - JP INIT_PAGES ; инициализация номеров страниц режима спектрума + ;!TODO если 48к то не нужно? ; [ ] free zx pages! + JR INIT_PAGES ; инициализация номеров страниц режима спектрума ;start_basic: .BASIC_128: LD SP,#C000 LD HL,RES128_PROG diff --git a/src/bios/rom/ZX/ZX_MENU.ASM b/src/bios/rom/ZX/ZX_MENU.ASM index 344f7e6..234ac55 100644 --- a/src/bios/rom/ZX/ZX_MENU.ASM +++ b/src/bios/rom/ZX/ZX_MENU.ASM @@ -421,7 +421,10 @@ TURBO_ON: CLEAR_RAM: DI - LD C,BIOS.FullInit ; [ ] free zx pages! + ; [ ] free zx pages! + LD BC,BIOS.REINIT.FREE_NO_ZX_MEM + ;LD C,BIOS.FullInit + ; RST_to_BIOS ; при очистке памяти из меню спектрума возврат в DSS по CAD ; будет опасным (RAM Blocks освободились), @@ -477,11 +480,11 @@ Hardware_Menu: Hardware_Menu_TAB: ; DW TR_DOS ; DW SP_DOS - DW SPRINTER_1X - DW AY8910_X - DW PENTAGON - DW SCORPION - DW PENTAGON512 + DW SPRINTER_ZX + DW ZX_SPECTRUM_128 + DW PENTAGON_128 + DW SCORPION_256 + DW PENTAGON_512 DW SPRINTER_reset ;SPRINTER_2X DW RET_FROM_M @@ -517,117 +520,204 @@ Hardware_Menu_STR: ;************************************************** ;Sprinter ZX -SPRINTER_1X: - CALL _SET_CNF - LD C,BIOS.RST_CONF.SP97_1 - RST_to_BIOS - CALL CNF_PN_320 - LD L,2 ;FN_SYNC.INT_PENT - JR AY8910_X.SET_DE +;[ ] free zx pages! + +/* + + 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 + ; + ;POP HL ; НЕ нужен. адрес возврата в EXP из SETUP + LD A,ROM.EXTENSION + OUT (SYS_PORT.ROM),A + XOR A + JP GOTO_SPECTRUM.FN + +; Вход: 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 строк + +; 1 - выделение памяти Pentagon 48k. 3 страницы +; 2 - выделение памяти Pentagon 128k. 2+6 страницы +; 3 - выделение памяти Pentagon 512k. 2+30 страницы +; 4 - выделение памяти Scorpion 256k. 2+6+8 страницы + +*/ + +SPRINTER_ZX: ;DI + ;LD A,CNF_PORT.CNF_0 + CNF_PORT.TURBO.ON + ;OUT (SYS_PORT.ROM),A + ;LD SP,SYS_PAGE.SYS_SP + ;LD A,SYS_PAGE + ;OUT (SLOT3),A + ; + LD A,BIOS.RST_CONF.SP97_1 + LD DE,4*256 + CNF_PORT.TURBO.ON + CNF_PORT.CNF_0 ; !HARDCODE 4 - выделение памяти Scorpion 256k. 2+6+8 страницы + LD BC,#FE*256 + %0000'0010 ; !HARDCODE Port All Mode data. int pent, set default palette, 320 строк + JR PREPARE_TO_START_ZX ; -;ZX Spectrum -AY8910_X: - CALL _SET_CNF - LD C,BIOS.RST_CONF.AY8910 - RST_to_BIOS +ZX_SPECTRUM_128: + ;DI + ;LD SP,SYS_PAGE.SYS_SP + ;LD A,SYS_PAGE + ;OUT (SLOT3),A + ; + LD A,BIOS.RST_CONF.AY8910 + LD DE,2*256 + CNF_PORT.CNF_1 + CNF_PORT.TURBO.ON + CNF_PORT.SCORP_RESET ; !HARDCODE 2 - выделение памяти Pentagon 128 + LD BC,#FA*256 + %1000'0011 + JR PREPARE_TO_START_ZX - LD A,#FA ; no ACC, Original waits - LD (Port_All_Mode),A - - CALL CNF_SC_312 - LD L,3 ;FN_SYNC.INT_ORIG -.SET_DE: - LD DE,CNF_PORT.CNF_0 + CNF_PORT.TURBO.ON - CALL CONFIG_SET - CALL CLS ;!FIXIT нужно ли? - RET -; +SCORPION_256: ;DI + ;LD SP,SYS_PAGE.SYS_SP + ;LD A,SYS_PAGE + ;OUT (SLOT3),A + ; + LD A,BIOS.RST_CONF.AY8910 + LD DE,4*256 + CNF_PORT.TURBO.ON + CNF_PORT.CNF_1 ; !HARDCODE 4 - выделение памяти Scorpion 256k. 2+6+8 страницы + LD BC,#FE*256 + %1000'0001 + ;JR PREPARE_TO_START_ZX +PREPARE_TO_START_ZX: + DI + EX AF,AF' + LD A,CNF_PORT.CNF_0 + CNF_PORT.TURBO.ON + OUT (SYS_PORT.ROM),A + LD A,SYS_PAGE + OUT (SLOT3),A + EX AF,AF' + ; + PUSH BC + PUSH DE + PUSH DE + ; + LD C,A + RST_to_BIOS + ; + POP DE + LD B,D + ;LD C,BIOS.ZX_MEMORY_MANAGER + ;RST_to_BIOS + CALL MANAGE_ZX_PAGES.FN_ENTRANCE.API + JR C,.loop_rst + ; + POP DE + POP BC + ; + LD D,0 ; !HARDCODE точка входа в ПЗУ спектрума + LD H,A + LD A,(SYS_PAGE.Block_ID.vROM) + LD L,A + LD A,C + EX AF,AF' + XOR A + JP GOTO_SPECTRUM.FN + ; +.loop_rst: LD BC,BIOS.REINIT.HARD_RESET + RST_to_BIOS + JR .loop_rst -SCORPION: - CALL _SET_CNF - CALL CNF_SC_312 - LD L,1 ;FN_SYNC.INT_SCORP - LD DE,CNF_PORT.CNF_1 + CNF_PORT.TURBO.ON - JR CONFIG_SET -PENTAGON: - CALL _SET_CNF - CALL CNF_PN_320 - LD L,2 ;FN_SYNC.INT_PENT - LD DE,CNF_PORT.CNF_1 + CNF_PORT.TURBO.ON - JR CONFIG_SET +PENTAGON_128: ;DI + ;LD SP,SYS_PAGE.SYS_SP + ;LD A,SYS_PAGE + ;OUT (SLOT3),A + ; + LD A,BIOS.RST_CONF.AY8910 + LD DE,2*256 + CNF_PORT.CNF_1 + CNF_PORT.TURBO.ON + CNF_PORT.SCORP_RESET ; !HARDCODE 2 - выделение памяти Pentagon 128 + LD BC,#FE*256 + %0000'0010 + JR PREPARE_TO_START_ZX -PENTAGON512: - CALL _SET_CNF - CALL CNF_PN_320 - LD L,2 ;FN_SYNC.INT_PENT - LD DE,CNF_PORT.CNF_1 + CNF_PORT.TURBO.ON + CNF_PORT.CNF_512 -; JR CONFIG_SET -CONFIG_SET: - PUSH DE +PENTAGON_512: ;DI + ;LD SP,SYS_PAGE.SYS_SP + ;LD A,SYS_PAGE + ;OUT (SLOT3),A + ; + LD A,BIOS.RST_CONF.AY8910 + LD DE,3*256 + CNF_PORT.CNF_1 + CNF_PORT.TURBO.ON + CNF_PORT.CNF_512 + CNF_PORT.SCORP_RESET ; !HARDCODE 3 - выделение памяти Pentagon 512 + LD BC,#FE*256 + %0000'0010 + JR PREPARE_TO_START_ZX - EI - HALT - DI +; CONFIG_SET: +; PUSH DE - IN A,(SLOT3) - EX AF,AF' - LD A,SYS_PAGE - OUT (SLOT3),A - LD (SYS_PAGE.CONFIG_DE),DE - ;!FIXIT есть ли смысл делать до FN_SYNC? - LD A,(ZX_VARS.BORDER) - RRCA - RRCA - RRCA - AND 7 - OUT (BorderColor),A - ; - EX AF,AF' - OUT (SLOT3),A +; EI +; HALT +; DI - LD A,L - LD C,BIOS.FN_SYNC - RST_to_BIOS +; IN A,(SLOT3) +; EX AF,AF' +; LD A,SYS_PAGE +; OUT (SLOT3),A +; LD (SYS_PAGE.CONFIG_DE),DE +; ;!FIXIT есть ли смысл делать до FN_SYNC? +; LD A,(ZX_VARS.BORDER) +; RRCA +; RRCA +; RRCA +; AND 7 +; OUT (BorderColor),A +; ; +; EX AF,AF' +; OUT (SLOT3),A - LD HL,#4104 ;!HARDCODE - LD E,0 - LD BC,256*4 + BIOS.LP_OPEN_S ;!HARDCODE - RST_to_BIOS +; LD A,L +; LD C,BIOS.FN_SYNC +; RST_to_BIOS - LD HL,#5104 ;!HARDCODE - LD E,0 - LD BC,256*4 + BIOS.LP_OPEN_S - RST_to_BIOS +; LD HL,#4104 ;!HARDCODE +; LD E,0 +; LD BC,256*4 + BIOS.LP_OPEN_S ;!HARDCODE +; RST_to_BIOS - POP DE - LD A,E - OUT (SYS_PORT.ROM),A +; LD HL,#5104 ;!HARDCODE +; LD E,0 +; LD BC,256*4 + BIOS.LP_OPEN_S +; RST_to_BIOS - IM 1 - EI - RET +; POP DE +; LD A,E +; OUT (SYS_PORT.ROM),A + +; IM 1 +; EI +; JP CLS ;!FIXIT нужно ли? SPRINTER_reset: - CALL _SET_CNF - LD BC,256*BIOS.REINIT.SOFT_RESET + BIOS.REINIT + DI + LD A,CNF_PORT.CNF_0 + CNF_PORT.TURBO.ON + OUT (SYS_PORT.ROM),A + LD BC,BIOS.REINIT.SOFT_RESET JP_to_BIOS -_SET_CNF: - DI - LD A,CNF_PORT.CNF_0 + CNF_PORT.TURBO.ON - OUT (SYS_PORT.ROM),A - RET +; _SET_CNF: +; ;DI +; LD A,CNF_PORT.CNF_0 + CNF_PORT.TURBO.ON +; OUT (SYS_PORT.ROM),A +; RET -CNF_SC_312: - LD A,Port_VSYNC.SET_312L - OUT (Port_VSYNC),A - RET +; CNF_SC_312: +; LD A,Port_VSYNC.SET_312L +; OUT (Port_VSYNC),A +; RET -CNF_PN_320: - LD A,Port_VSYNC.SET_320L - OUT (Port_VSYNC),A - RET +; CNF_PN_320: +; LD A,Port_VSYNC.SET_320L +; OUT (Port_VSYNC),A +; RET ; LD A,CNF_0 ; OUT (SYS_PORT.ROM),A diff --git a/src/bios/shared/CompMacro.asm b/src/bios/shared/CompMacro.asm index 58b5522..d6b4f43 100644 --- a/src/bios/shared/CompMacro.asm +++ b/src/bios/shared/CompMacro.asm @@ -170,9 +170,3 @@ ENDIF ENDM ; - -; -; MACRO - -; ENDM -; \ No newline at end of file