diff --git a/src/bios/exp/EXP.asm b/src/bios/exp/EXP.asm index e93436c..212f4f8 100644 --- a/src/bios/exp/EXP.asm +++ b/src/bios/exp/EXP.asm @@ -16,8 +16,8 @@ EXP_START: ;--------------------------------------- ROM_NUMBER: -.part1: DW MotherBoardID ; MotherBoardID -.part2: DB 0 +.part1: DW MotherBoardID +.part2: DB 0 ;--------------------------------------- ;--------------------------------------- @@ -145,7 +145,7 @@ TABLE_X: ; ;======================================= IFN TEST_INT -RESTARTS EQU #FFE0 ; !FIXIT вынести в SP2000.inc +RESTARTS EQU #FFE0 GLOBAL_RESET: DI IM 1 @@ -210,18 +210,17 @@ NMI_Point: ;======================================= ; BLOCK MEM_MAP.ID_Version-$,0 ;#C0-$,0 -ID_Version: - dw BIOS_ver_hex +ID_Version: DW BIOS_ver_hex ID_SPRINTER_length: DB ID_SPRINTER.LENGTH -ID_SPRINTER: ; запись 1 - DB 'Firmware v' + ; запись 1 +ID_SPRINTER: DB 'Firmware v' .BIOS_ver: DB BIOS_ver_string,', ' - IF DEBUG - DB 'BETA release' - ELSE - DB 'release ',BUILD_DATE - ENDIF + IF DEBUG + DB 'BETA release' + ELSE + DB 'release ',BUILD_DATE + ENDIF DB 0 ; запись 2 DB 'Sprinter',0 @@ -233,7 +232,7 @@ ID_SPRINTER: ; .LENGTH EQU $-ID_SPRINTER ; Check for max length of string - ASSERT ID_SPRINTER.LENGTH < #40, 'ERROR! ID String is to long!' + ASSERT ID_SPRINTER.LENGTH < #FF, 'ERROR! ID String is to long!' ;======================================= @@ -275,7 +274,9 @@ TABLE_X: ; таб ; ;======================================= IF TEST_INT -RESTARTS EQU #FFE0 ; !FIXIT вынести в SP2000.inc +RESTARTS EQU #FFE0 +; полный перехват ресета сразу после проливки конфы и CAD. +; закидывается в карту портов, поэтому использовать надо хитро. GLOBAL_RESET: DI IM 1 @@ -714,7 +715,7 @@ POST_5_OK: ADD IX,SP ; восстановить значение переданное загрузчиком конфы (если старт после ресета) ; В этом месте у нас IX:IY из Loader.asm ; Дотащили до сюда метку от лоадера, пока не используется - ;!TEST 31/12/23 подстраховка от утечки памяти + ;[x] 31/12/23 подстраховка от утечки памяти LD D,YH LD E,YL EX DE,HL @@ -899,25 +900,28 @@ init_rom_address EQU #8200 ;!HARDCO LD A,'Z' LD (DE),A -;!FIXIT сделать выбор грузить да/нет ПЗУ спектрума при старте, [-------] -; если нет - то воткнуть этот код: - ; LD HL,PROG_NO_ROM - ; LD DE,#C000 + Spec_Page.no_zx_rom - ; LD BC,PROG_NO_ROM.size - ; LDIR - - ; LD HL,RAM_BIOS_PROG - ; LD DE,#C000 + Spec_Page.to_bios - ; LD BC,RAM_BIOS_PROG.Length - ; LDIR -;--------------------------------------- -;--------------------------------------- + ; Заглушка для страницы #41 на всякий пожарный + LD HL,PROG_NO_ROM + LD DE,#C000 + Spec_Page.no_zx_rom + LD BC,PROG_NO_ROM.size + LDIR + ; + LD HL,RAM_BIOS_PROG + LD DE,#C000 + Spec_Page.to_bios + LD BC,RAM_BIOS_PROG.Length + LDIR No_Need_To_Load_ZXROMS: POP AF OUT (SLOT3),A ; +;-------------------------------------------------------------------------------------------------------------------; +;!TODO сделать выбор в Setup, что грузить в vПЗУ при старте. Варианты: +; 1 - Грузит ПЗУ спектрума из ROM при старте если нет флага ZX +; 2 - Грузит ПЗУ спектрума из ROM при каждом перезапуске (может быть опасно) +; 3 - Не грузить ПЗУ спектрума, инитить страницу #41 как в 3.04 +; 4 - Не грузить ПЗУ спектрума, инитить страницу #41 так, чтоб код в ней подгружал ПЗУ спектрума при обращении +;-------------------------------------------------------------------------------------------------------------------; ENDMODULE -;[---------------------------------------------------------------------] ; ;************************************** ; @@ -1144,7 +1148,6 @@ init_zx_roms: DISP Reset_Handler.init_rom_address IN A,(SLOT3) - ;PUSH AF EX AF,AF' DI @@ -1152,10 +1155,8 @@ init_zx_roms: OUT (SYS_PORT.ROM),A INC A ;!HARDCODE LD A,2 LD B,3 ; zx-rom number of pages - - ;!FIXIT переделать на функцию биоса для чтения ROM-DISK и перенести в него ПЗУ спектрума -.loop: ;push bc - EXX + ; +.loop: EXX ; out (ROM.SLOT0),a or %0100'0000 ; !HARDCODE номера страниц для эмулятора ПЗУ @@ -1167,68 +1168,49 @@ init_zx_roms: LD BC,#4000 LDIR - inc a - ;pop bc + INC A EXX DJNZ .loop xor a out (ROM.SLOT0),a OUT (SYS_PORT.ROM),A - ;POP AF EX AF,AF' out (SLOT3),a +;[x] SET_PORTS: no need to call from #3D13 and DI. 31/12/23 + LD A,ACEX.vROM.BASIC_128 ; ROM-ID - BASIC 128 + LD B,#42 ;!HARDCODE page + CALL SET_PORTS + ; - LD A,ACEX.vROM.BASIC_128 ; ROM-ID - BASIC 128 - LD B,#42 ;!HARDCODE page - ;[x] SET_PORTS: no need to call from #3D13 and DI. 31/12/23 - ;CALL .SET_ROM + LD A,ACEX.vROM.BASIC_48 ; ROM-ID - BASIC 48 + LD B,#43 ;!HARDCODE page + CALL SET_PORTS + ; + + LD A,ACEX.vROM.TR_DOS ; ROM-ID - TR-DOS + LD B,#44 ;!HARDCODE page + CALL SET_PORTS + ; + + ; эти страницы пока не используются + LD A,ACEX.vROM.BIOS ; ROM-ID - BIOS + ;LD B,#45 ;!HARDCODE page + LD B,#41 CALL SET_PORTS - ; - - LD A,ACEX.vROM.BASIC_48 ; ROM-ID - BASIC 48 - LD B,#43 ;!HARDCODE page - ;[x] SET_PORTS: no need to call from #3D13 and DI. 31/12/23 - ;CALL .SET_ROM + ; + LD A,ACEX.vROM.BIOS_3 ; ROM-ID - BIOS-1 + ;LD B,#46 ;!HARDCODE page + LD B,#41 CALL SET_PORTS - ; + ; + LD A,ACEX.vROM.BIOS_4 ; ROM-ID - BIOS-2 + ;LD B,#47 ;!HARDCODE page + LD B,#41 + JP SET_PORTS + ; можно задействовать ещё 4 страницы на порты #E4..#E7 - LD A,ACEX.vROM.TR_DOS ; ROM-ID - TR-DOS - LD B,#44 ;!HARDCODE page - ;[x] SET_PORTS: no need to call from #3D13 and DI. 31/12/23 - ;CALL .SET_ROM - CALL SET_PORTS - ; - - ; LD A,ACEX.vROM.BIOS ; ROM-ID - BIOS - ; LD B,#45 ;!HARDCODE page - ;[x] SET_PORTS: no need to call from #3D13 and DI. 31/12/23 - ;CALL .SET_ROM - CALL SET_PORTS - ; - - - ; LD A,ACEX.vROM.BIOS_3 ; ROM-ID - BIOS-1 - ; LD B,#45 ;!HARDCODE page - ;[x] SET_PORTS: no need to call from #3D13 and DI. 31/12/23 - ;CALL .SET_ROM - CALL SET_PORTS - ; - - ; LD A,ACEX.vROM.BIOS_4 ; ROM-ID - BIOS-2 - ; LD B,#47 ;!HARDCODE page - ;[x] SET_PORTS: no need to call from #3D13 and DI. 31/12/23 - ;CALL .SET_ROM - CALL SET_PORTS - ; - RET - - ;[x] SET_PORTS: no need to call from #3D13 and DI. 31/12/23 -;.SET_ROM: - ;LD C,BIOS.SET_PORTS - ;JP ToBIOS_3D13 - ; ENT .length EQU $-init_zx_roms ;-----------------------------------------------------------------------; @@ -1236,7 +1218,8 @@ init_zx_roms: ;-----------------------------------------------------------------------; -GOTO_SPEC: ; ????? процедура биоса для захода в режим спектрума +;!TODO задействовать +GOTO_SPEC: IN A,(SLOT3) EX AF,AF' LD A,SYS_PAGE @@ -1262,30 +1245,23 @@ ZX_SPECTRUM_MODE: CALL FN_SYNC.INT_PENT CALL SET_PAL_ZX - LD E,0 - ;!TEST - ; LD HL,#4104 - ; LD B,4 - ; CALL LP_OPEN_S - CALL LP_SET_32 + LD E,0 + CALL LP_SET_32 ; - LD E,0 - LD HL,#5104 - ;!TEST - ; LD B,4 - ;CALL LP_OPEN_S + LD E,0 + LD HL,#5104 CALL LP_SET_32.X + ; ????? можно использовать когда-нибудь как-нибудь ; LD D,#35 ; CALL CMOS_RD - ; BIT 0,A ; !!!!! - -; PUSH AF -; CALL Z,SPRINTER_1 -; POP AF -; PUSH AF -; CALL NZ,AY8910 -; POP AF + ; BIT 0,A + ; PUSH AF + ; CALL Z,SPRINTER_1 + ; POP AF + ; PUSH AF + ; CALL NZ,AY8910 + ; POP AF SPECTRUM_0: XOR A ; задача 0, режим 256 килобайт @@ -1443,63 +1419,62 @@ Length EQU $-Setup_Starter.Start ;---------------------[ ЗАГЛУШКИ ДЛЯ #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,#FF -; OUT (SLOT3),A -; OUT (SLOT2),A -; OUT (SLOT1),A - -; LD SP,#BF00 - -; LD C,BIOS.LP_OPEN_S -; LD B,3 -; LD E,0 -; RST ToBIOS - -; LD C,BIOS.LP_CLS_WIN -; LD DE,0 -; LD HL,#2050 -; RST ToBIOS - -; LD A,1 -; OUT (RGMOD),A ; set scr-2 - -; 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.INC.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 +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,#FF + 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.INC.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 ;-------------------[] ;-----------------------------------------------------------------------; ;>$< >$< >$< >$< >$< >$< >$< >$< >$< >$< >$< >$< >$< >$< >$< >$< >$< >$<; diff --git a/src/bios/exp/FUNC_SERVICE.asm b/src/bios/exp/FUNC_SERVICE.asm index ce7bc3d..6268ca2 100644 --- a/src/bios/exp/FUNC_SERVICE.asm +++ b/src/bios/exp/FUNC_SERVICE.asm @@ -109,7 +109,8 @@ RST_CONF: XOR A RET - + ; + ;[x] .CHOOSE_CNF: ;!TEST CP ACEX.Config_PG.Sp2000_SoftSetUp @@ -134,8 +135,9 @@ RST_CONF: JR Z,.INT_PLD SCF RET - -.INIT_ACEX: ;!FIXIT ;!TODO НЕДОДЕЛАНО!!!! + ; + ;[x] +.INIT_ACEX: DI ; устанавливаем нулевую карту портов LD A,CNF_PORT.CNF_0 @@ -187,10 +189,11 @@ RST_CONF: LD HL,RST_18_1.exit XOR A SBC HL,DE - JR NZ,1F ; NZ - если вызов был по RST #18 + JR NZ,.set_ret ; NZ - если вызов был по RST #18 POP DE ; если вызов был в ОЗУ по RST 8 INC A -1: LD (Spec_Page.RET_addr),DE +.set_ret: + LD (Spec_Page.RET_addr),DE ; A=0 - SYS_PORT.ON ; A=1 - SYS_PORT.OFF LD (Spec_Page.Reload_Version),A @@ -238,7 +241,6 @@ RST_CONF: RET ; .INIT_ACEX.PROGRAM: - DISPLAY " !!! !!! .INIT_ACEX.PROGRAM !!! !!!" DISP Spec_Page.init_acex ; SAFE_PORTY @@ -256,9 +258,9 @@ RST_CONF: OUT (FastRAM.SLOT0),A ; Страница КЭШ = 3 ; LD HL,.INIT_ACEX.Reload_String ; флаг перезагрузки из КЭШ-а - JR Z,1F ; устанавливаем флаг перезагрузки из КЭШ-а + JR Z,.skip ; устанавливаем флаг перезагрузки из КЭШ-а INC L ; затираем флаг перезагрузки из КЭШ-а -1: LD DE,ACEX.LOADER.String_Address-#C000 +.skip: LD DE,ACEX.LOADER.String_Address-#C000 LD BC,#10 LDIR diff --git a/src/bios/shared/DEFINES.INC b/src/bios/shared/DEFINES.INC index 3e79b28..03acfca 100644 --- a/src/bios/shared/DEFINES.INC +++ b/src/bios/shared/DEFINES.INC @@ -1,6 +1,6 @@ ; ;---------[All shared defines]---------- - DEFINE DEBUG 1 ; добавляет строку и сообщение о тестовой сборке на стартовом экране + DEFINE DEBUG 0 ; добавляет строку и сообщение о тестовой сборке на стартовом экране DEFINE PACKED_MAIN 0 ; паковать MAIN или влезает без этого? DEFINE SP2000_Loader_Flag #0107 DEFINE IDE_Optimization 1 ; слегка оптимизирует некоторые процедуры работы с HDD diff --git a/src/doc/changes.txt b/src/doc/changes.txt index f9c325b..6f62241 100644 --- a/src/doc/changes.txt +++ b/src/doc/changes.txt @@ -1,13 +1,12 @@ TODO: - пункт в сетапе "сохранять страницы спектрума при перезагрузке" - перед инициализацией страниц спектрума и страницы 41 проверять, не заняты ли они рамдиском -- Сжать хрустом ПЗУ спектрума и Логотип, ещё 1 страница может освободиться -- в сетап для сохранения ручных настроек HDD не те ячейки CMOS - чистить буфер клавы не втупую, а какими-нибудь командами для этих всяких SIO/PIO, если есть -+ ! в Setup добавить пункт настройки времени и даты --+ немного доработана система перехвата ресета для устранения некоторых глюков и на будущее Done: ++ немного доработана система перехвата ресета для устранения некоторых глюков и на будущее ++ в сетап работает сохранение настроек HDD "Setup" после первого удачного автодетекта + Сделан универсальный загрузчик битстрима для 1k30 и 1k50 + Активирован второй канал IDE + Нумерация устройств IDE переделана с последовательной на физическую