diff --git a/src/bios/exp/DCP.ASM b/src/bios/exp/DCP.ASM index 4552b6f..7a23d49 100644 --- a/src/bios/exp/DCP.ASM +++ b/src/bios/exp/DCP.ASM @@ -21,7 +21,7 @@ ;-----------------------------------------------------------------------; ; -; +.RECORD.Size EQU 5 ;-----------------------------------------------------------------------; DW %00'000'0'0000'0111 DW %00'010'0'0110'1111 @@ -447,44 +447,47 @@ ; ;----------------------------------------------------------------------; -DCP_INIT: - LD C,XL - LD B,XH - LD E,YL - LD D,YH - EXX - - LD HL,#C000 - LD DE,#C001 - LD BC,#3FFF - LD (HL),L - LDIR - - LD IY,DCP_DATA - LD IX,.ret - -.loop: LD L,(IY) - LD H,(IY+1) - LD E,(IY+2) - LD D,(IY+3) - LD B,(IY+4) - JP DCP_CONFIG.PARSE_TABLE - -.ret: LD BC,5 - ADD IY,BC - LD A,(IY+2) - OR (IY+3) - JR NZ,.loop - - EXX - LD XL,C - LD XH,B - LD YL,E - LD YH,D +; вызывается из POST_TEST.POST_3_INIT_DCP +DCP_INIT: LD E,YL + LD D,YH + EX DE,HL + LD E,XL + LD D,XH + ; + LD BC,DCP_DATA.RECORD.Size + EXX + LD HL,#C000 + LD DE,#C001 + LD BC,#3FFF + LD (HL),L + LDIR + ; + LD IY,DCP_DATA + LD IX,.ret + ; +.loop: LD L,(IY) + LD H,(IY+1) + LD E,(IY+2) + LD D,(IY+3) + LD B,(IY+4) + JP DCP_CONFIG.PARSE_TABLE + ; +.ret: EXX + ADD IY,BC + EXX + LD A,(IY+2) + OR (IY+3) + JR NZ,.loop + EXX + LD XL,E + LD XH,D + EX DE,HL + LD YL,E + LD YH,D ; First IN command - OPEN DCP - IN A,(SLOT3) - JP (HL) + IN A,(SLOT3) + JP POST_TEST.POST_3_OK ;-----------------------------------------------------------------------; ; diff --git a/src/bios/exp/EXP.asm b/src/bios/exp/EXP.asm index 48e1a19..1b1e728 100644 --- a/src/bios/exp/EXP.asm +++ b/src/bios/exp/EXP.asm @@ -611,8 +611,8 @@ POST_2_OK: ; ===== INIT DCP ======== POST_3_INIT_DCP: - LD HL,POST_3_OK ; INIT PORTS - JP DCP_INIT ; процедура инициализации с возвратом в (HL) + ;LD HL,POST_3_OK ; INIT PORTS + JP DCP_INIT ; процедура инициализации с возвратом на POST_3_OK ; ошибок нет ; *********************************** @@ -697,19 +697,32 @@ POST_5_OK: ; ********************************** ; POST завершен -; ********************************** ENDMODULE +; ********************************** +;-----------------------------------------------------------------------; +; первая инициализация страниц: + XOR A + OUT (RGADR),A + OUT (RGMOD),A + OUT (SLOT0),A ;!HARDCODE zx page number + ; !TEST 20/08/2024 + ;LD A,5 ;!HARDCODE zx page number + ;OUT (SLOT1),A + ;LD A,2 ;!HARDCODE zx page number + ;OUT (SLOT2),A + LD A,#FF ;!HARDCODE zx page number + OUT (SLOT1),A + LD A,0 ;!HARDCODE zx page number + OUT (SLOT2),A + ; + LD A,SYS_PAGE + OUT (SLOT3),A +;-----------------------------------------------------------------------; + + +;-----------------------------------------------------------------------; MODULE SET_CONFIG_ID - - IN A,(SLOT3) - EX AF,AF' ; SAVE PAGE3 - -;NO_SUMX_EQ: - - LD A,SYS_PAGE - OUT (SLOT3),A - ;-------------[Save IX:IY]-------------- ; Don't use IY before this point if it`s normal booting!!! LD IX,0 @@ -718,65 +731,39 @@ POST_5_OK: ; В этом месте у нас IX:IY из Loader.asm ; Дотащили до сюда метку от лоадера ;[x] 31/12/2023 подстраховка от недоутечки памяти + ; IY - number from loader LD D,YH LD E,YL EX DE,HL LD DE,SP2000_Loader_Flag SBC HL,DE JR NZ,.no_conf_reload - ; + ; IX - number from loader LD D,XH LD E,XL EX DE,HL LD DE,ACEX.Config_ID.Sp2000 SBC HL,DE + ; A = 0 JR NZ,.no_conf_reload - ; LD A,#80 .no_conf_reload: - LD R,A + LD R,A ; reg R bit7 - признак работы лоадера + ; + ; на всякий случай + LD HL,ACEX.Config_ID.Sp2000 + LD (SYS_PAGE.CONFIG_BYTE),HL ; сохранить номер прошивки + ; + LD A,CNF_PORT.CNF_0 + CNF_PORT.TURBO.ON + LD (SYS_PAGE.CONFIG_DE),A + ; + XOR A ;!HARDCODE zx page number + OUT (SLOT3),A ; - -; !TODO number from loader - ; LD A,YL - ; LD L,A - ; LD A,YH - ; LD H,A - ; LD BC,#0107 ; !!!!! сравнить с 0107h вынести референсом тут и в loader.asm - ; AND A ; если равно - прошла перезагрузка - ; SBC HL,BC - ;JR Z,set_config ;!TODO активация метки IX:IY из лоадера - ;LD IX,ACEX.Config_ID.Sp97_2 - LD HL,ACEX.Config_ID.Sp2000 -set_config: - LD (SYS_PAGE.CONFIG_BYTE),HL ; сохранить номер прошивки - ;LD (SYS_PAGE.CONFIG_BYTE),IX ; сохранить номер прошивки - ;LD HL,(SYS_PAGE.CONFIG_BYTE) ; взять номер прошивки в HL - ; - LD A,CNF_PORT.CNF_0 + CNF_PORT.TURBO.ON - LD (SYS_PAGE.CONFIG_DE),A - - EX AF,AF' - OUT (SLOT3),A ; Restore SLOT3 - ENDMODULE -;********************************* -; первая инициализация страниц: -; SLOT3=0, SLOT2=2, SLOT1=5, SLOT0=0 - - XOR A - OUT (RGADR),A - OUT (RGMOD),A - OUT (SLOT3),A - OUT (SLOT0),A ;!HARDCODE zx page number - LD A,5 ;!HARDCODE zx page number - OUT (SLOT1),A - LD A,2 ;!HARDCODE zx page number - OUT (SLOT2),A - -;********************************* +;-----------------------------------------------------------------------; ; Don't use stack (SP) before this point if it`s normal booting!!! - LD SP,#C000 ; Начало использования стека!!! + LD SP,ROM_MAP.EXP.STACK ; Начало использования стека!!! PUSH HL ; сохранить номер прошивки CALL PORTS_INIT ; инициализировать порты @@ -785,7 +772,7 @@ set_config: CALL EMM.CheckColdInit ; инициализация памяти POP HL ; конфигурация ; JR Reset_Handler.start - +;-----------------------------------------------------------------------; MODULE Reset_Handler start: DI IN A,(SLOT3) @@ -849,68 +836,12 @@ Check_Spec_Page: JR Check_EE_Port.After_Hard_Rst ; ;--------------------------------------- -No_Reset_handlers:/* - ; Check ZX ROMS Loaded - LD A,(Spec_Page.flag_Z) - CP 'Z' - JR NZ,.Load_ZXROMS - LD A,(Spec_Page.flag_X) - CP 'X' - JR NZ,.Load_ZXROMS - ; [x] 31/12/23 подстраховка от недоутечки памяти - LD A,R - AND #80 - JR Z,No_Need_To_Load_ZXROMS -.Load_ZXROMS: XOR A - LD R,A - ; - ; Load ZX ROM's -init_rom_address EQU #8200 ;!HARDCODE - ; - LD HL,init_zx_roms - LD DE,init_rom_address - LD BC,init_zx_roms.length - LDIR - ; - CALL init_rom_address - ; - LD HL,#C000 - LD DE,#C001 - LD BC,#3FFF - LD (HL),C - LDIR ; забить FF-ами - ; ставим метку если прогрузили ПЗУ спектрума - DEC DE ; Spec_Page.flag_X - LD A,'X' - LD (DE),A - DEC DE ; Spec_Page.flag_Z - LD A,'Z' - LD (DE),A - ; Заглушка для страницы #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: +No_Reset_handlers: POP AF OUT (SLOT3),A -;-------------------------------------------------------------------------------------------------------------------; -;!TODO сделать выбор в Setup, что грузить в vПЗУ при старте. Варианты: -;[ ] 0 - Не грузить ПЗУ спектрума, инитить страницу #41 как в 3.04 -;[ ] 1 - Грузит ПЗУ спектрума из ROM при старте если нет флага ZX -;[ ] 2 - Грузит ПЗУ спектрума из ROM при каждом перезапуске (может быть опасно) -;[ ] 3 - Не грузить ПЗУ спектрума, инитить страницу #41 так, чтоб код в ней подгружал ПЗУ спектрума при обращении -;-------------------------------------------------------------------------------------------------------------------; ENDMODULE -; -;************************************** -; +;-----------------------------------------------------------------------; + MODULE Prepare_For_Setup Set_ALL_Mode: LD A,#FF LD BC,Port_All_Mode @@ -919,18 +850,17 @@ Set_ALL_Mode: LD A,#FF Set_Default_Screen: CALL FN_SYNC.INT_DEF ; set default int ld a,128+4 ; !HARDCODE - ;ld c,BIOS.FN_SYNC - ;RST_to_BIOS_18 ; set default vsync CALL FN_SYNC ; set default vsync Setup_to_RAM: LD HL,Setup_Starter.Start LD DE,COMPILE_ADDR.SETUP_STARTER - LD BC,Setup_Starter.Length + LD BC,Setup_Starter.Size LDIR ; на стек кладётся адрес возврата и дальше тащится всякими костылями, чтоб вернуться назад CALL Setup_Starter.Exec ; #C000 ;JP PrepareToZX ENDMODULE - ; + + PrepareToZX: ;CALL init_zx_roms ; Setup HDD drives for ZX Spectrum mode DI @@ -961,7 +891,13 @@ PrepareToZX: ;CALL init_zx_roms INC A CP #10 JR C,.loop - ; выход в режим zx spectrum + ; выход в режим zx spectrum + ;!TODO заменить на установку из рамблока ; [ ] free zx pages! + LD A,5 + OUT (SLOT1),A + LD A,2 + OUT (SLOT2),A + ; .start_zx: JP GOTO_SPEC.ZX_MODE ;*********************************** ; Инициализация портов @@ -1014,8 +950,8 @@ PORTS_INIT: ; reg 4 LD A,4 OUT (Z84.SIO.Ch_B.Ctrl),A - ;LD A,#45 - LD A,#40 + ;LD A,#45 + LD A,#40 OUT (Z84.SIO.Ch_B.Ctrl),A ; reg 3 LD A,3 @@ -1069,29 +1005,29 @@ PORTS_INIT: OUT (C),A ; Сброс контроллера дисковода ; Включить доступ к контроллеру диска (третья конфа) - LD A,CNF_PORT.CNF_3 + ROM.BIOS - OUT (SYS_PORT.ROM),A - OUT (FDC_93.DrvCTRL),A - push hl - pop hl - LD A,#3C ;!HARDCODE команда для ВГ93 - OUT (FDC_93.DrvCTRL),A - push hl - pop hl - XOR A - OUT (FDC_93.Command),A + LD A,CNF_PORT.CNF_3+ROM.BIOS + OUT (SYS_PORT.ROM),A + OUT (FDC_93.DrvCTRL),A + PUSH HL + POP HL + LD A,#3C ;!HARDCODE команда для ВГ93 + OUT (FDC_93.DrvCTRL),A + PUSH HL + POP HL + XOR A + OUT (FDC_93.Command),A ; Выключить доступ к контроллеру диска - 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 ; set HDD1/not-HDD2 - LD A,IDE.Chanel.Primary - OUT (IDE.Chanel.Set),A - LD BC,#7FFD - LD A,#10 - OUT (C),A ; BASIC_48 mode - LD B,#1F - LD A,01 - OUT (C),A ; RAM-0 mode !!! + LD A,IDE.Chanel.Primary + OUT (IDE.Chanel.Set),A + LD BC,#7FFD + LD A,#10 + OUT (C),A ; BASIC_48 mode + LD B,#1F + LD A,01 + OUT (C),A ; RAM-0 mode !!! ; очистка буферов клавиатуры и мыши в SIO CALL .clean_kbd_buf JR .clean_mouse_buf @@ -1211,12 +1147,12 @@ Exec: ;----------------------[] DI POP HL ; адрес возврата в EXP из SETUP - LD SP,#8000 ;!HARDCODE - PUSH HL - PUSH AF + ; LD SP,#8000 ;!HARDCODE + ; PUSH HL + ; PUSH AF JP SETUP_MAIN ENT -Length EQU $-Setup_Starter.Start +Size EQU $-Setup_Starter.Start ENDMODULE ;-----------------------------------------------------------------------; ;-----------------------------------------------------------------------; diff --git a/src/bios/exp/FUNC_ZX.ASM b/src/bios/exp/FUNC_ZX.ASM index 6e2651e..0cdc55b 100644 --- a/src/bios/exp/FUNC_ZX.ASM +++ b/src/bios/exp/FUNC_ZX.ASM @@ -1,3 +1,11 @@ +;-------------------------------------------------------------------------------------------------------------------; +;!TODO сделать выбор в Setup, что грузить в vПЗУ при старте. Варианты: +;[~] 0 - Не грузить ПЗУ спектрума, инитить страницу #41 как в 3.04 +;[~] 1 - Грузит ПЗУ спектрума из ROM при старте если нет флага ZX +;[~] 2 - Грузит ПЗУ спектрума из ROM при каждом перезапуске (может быть опасно) +;[ ] 3 - Не грузить ПЗУ спектрума, инитить страницу #41 так, чтоб код в ней подгружал ПЗУ спектрума при обращении +;-------------------------------------------------------------------------------------------------------------------; + ; ; _ZX_ _ZX_ _ZX_ _ZX_ _ZX_ [___FOR ZX-MODE___] _ZX_ _ZX_ _ZX_ _ZX_ _ZX_ ; diff --git a/src/bios/rom/MEM_MAP.inc b/src/bios/rom/MEM_MAP.inc index 1852c02..2f86374 100644 --- a/src/bios/rom/MEM_MAP.inc +++ b/src/bios/rom/MEM_MAP.inc @@ -8,6 +8,7 @@ ; ROM_MAP: .EXP EQU 0 +.EXP.STACK EQU #C000 .ROM EQU 0 .LOADER EQU 0 .LOGO EQU 0 @@ -44,7 +45,7 @@ COMPILE_ADDR: .MAIN EQU #8000 .SETUP EQU #8000 .DEPACK EQU #D000 -.SETUP_STARTER EQU #C000 +.SETUP_STARTER EQU .SETUP + SETUP_MAIN.Size ;#C000 ; ; ██████╗ ███████╗██████╗ █████╗ ██████╗██╗ ██╗███████╗██████╗ ; ██╔══██╗██╔════╝██╔══██╗██╔══██╗██╔════╝██║ ██╔╝██╔════╝██╔══██╗ diff --git a/src/bios/rom/ROM.asm b/src/bios/rom/ROM.asm index e1dc925..873da16 100644 --- a/src/bios/rom/ROM.asm +++ b/src/bios/rom/ROM.asm @@ -199,13 +199,16 @@ DEPACK_DATA.length EQU $-DEPACK_DATA DISP COMPILE_ADDR.SETUP ShowInfo 'Setup block DISP start', 1 ; !!!!! test SETUP_MAIN: INCLUDE 'src/bios/ROM/SETUP/Main.asm' +SETUP_MAIN.Size EQU $-SETUP_MAIN ShowInfo 'Setup block DISP end', 1 ; !!!!! test ENT ENDIF - + ASSERT ($ + Setup_Starter.Size) < (STACK - STACK.Size), "WARNING: Stack area overlaps code..." ShowInfo 'Setup block of ROM end', 0 ; !!!!! test BLOCK_Setup.Length EQU $-BLOCK_Setup + + ;--------------------------------------- ; diff --git a/src/bios/rom/SETUP/MAIN.asm b/src/bios/rom/SETUP/MAIN.asm index 4b4ea0a..effe103 100644 --- a/src/bios/rom/SETUP/MAIN.asm +++ b/src/bios/rom/SETUP/MAIN.asm @@ -79,14 +79,14 @@ MEMMAP2 EQU TEMP ; TPOINTD EQU TEMP - SYS_PAGE.RAMD_KEYS.NUM - SYS_PAGE.Sp_RAMD_KEYS.NUM ; [x] 4/11/2023 -;======================================= +;██████████████████████████████████████████████████████████████████████████████████████████████████████████████; ;SETUP_MAIN: MAIN_START: - POP AF - POP HL + ; POP AF + ; POP HL LD SP,STACK PUSH HL - LD (RET_TO_EXP_ADDR),hl + LD (RET_TO_EXP_ADDR),HL JP START ; DB "(C) 2002 PETERS PLUS LTD " RET_TO_EXP_ADDR: WORD 0000 ; place for save ret address to exp @@ -243,58 +243,57 @@ CMSERR: ; RST_to_BIOS RET -CLEARM: IN A,(SLOT3) - PUSH AF - LD A,SYS_PAGE - OUT (SLOT3),A +CLEARM: IN A,(SLOT3) + PUSH AF + LD A,SYS_PAGE + OUT (SLOT3),A ; save RAM disks on reboot when memory is cleared - LD HL,SYS_PAGE.RAMD_KEYS - LD DE,TPOINTD - LD BC,SYS_PAGE.RAMD_KEYS.NUM - LDIR - ; [x] 4/11/2023 - LD HL,SYS_PAGE.Sp_RAMD_KEYS - LD DE,TPOINTD + SYS_PAGE.RAMD_KEYS.NUM - LD BC,SYS_PAGE.Sp_RAMD_KEYS.NUM - LDIR - ; + LD HL,SYS_PAGE.RAMD_KEYS + LD DE,TPOINTD + LD BC,SYS_PAGE.RAMD_KEYS.NUM + LDIR + ; [x] 4/11/2023 + LD HL,SYS_PAGE.Sp_RAMD_KEYS + LD BC,SYS_PAGE.Sp_RAMD_KEYS.NUM + LDIR + ; ; очищаем RAM Table - LD HL,MEMMAP2 - LD DE,MEMMAP2+1 - LD BC,255 - LD (HL),0 - LDIR + LD HL,MEMMAP2 + LD DE,MEMMAP2+1 + LD BC,255 + LD (HL),0 + LDIR ; восстанавливаем RAM диски - LD IX,SYS_PAGE.RAMD_KEYS ;RAM DISKS - LD H,high SYS_PAGE.RAMD_FAT - LD D,high MEMMAP2 - LD BC,SYS_PAGE.RAMD_KEYS.NUM*256 + #FF - CALL .MEMLOOP + LD IX,SYS_PAGE.RAMD_KEYS ;RAM DISKS + LD H,high SYS_PAGE.RAMD_FAT + LD D,high MEMMAP2 + LD BC,SYS_PAGE.RAMD_KEYS.NUM*256+#FF + CALL .MEMLOOP ; [x] 4/11/2023 - LD IX,SYS_PAGE.Sp_RAMD_KEYS - LD B,SYS_PAGE.Sp_RAMD_KEYS.NUM - CALL .MEMLOOP + LD IX,SYS_PAGE.Sp_RAMD_KEYS + LD B,SYS_PAGE.Sp_RAMD_KEYS.NUM + CALL .MEMLOOP ; - CALL EMM.InitMem - LD BC,CMOS_CELL.BootUpParams.Mask.SaveRAMdisks ;#400E - CALL G_VALUE - OR A - CALL NZ,CCHAIN - POP AF - OUT (SLOT3),A + CALL EMM.InitMem + LD BC,CMOS_CELL.BootUpParams.Mask.SaveRAMdisks ;#400E + CALL G_VALUE + OR A + CALL NZ,CCHAIN + POP AF + OUT (SLOT3),A ; [x] 04/11/2023 Отдельные рамдиски для режима спектрума и DSS. - LD B,high BIOS.SWAP_RAM_DRIVES.Sp2000 - JP SWAP_RAM_DRIVES + LD B,high BIOS.SWAP_RAM_DRIVES.Sp2000 + JP SWAP_RAM_DRIVES ; ; .MEMLOOP: - LD A,(IX) - INC IX - OR A - LD L,A - CALL NZ,RCHAIN - DJNZ .MEMLOOP - RET + LD A,(IX) + INC IX + OR A + LD L,A + CALL NZ,RCHAIN + DJNZ .MEMLOOP + RET ; ; @@ -483,7 +482,9 @@ START: ;R08 CALL OPENDOS - CALL ZXCLS + ;!TEST 20/08/2024 + ;CALL ZXCLS + ; CALL READING CALL TCHEKSM CALL NZ,SETDEFX @@ -1308,12 +1309,14 @@ PMEMORY: LD A,"K" JP PRINT_CHAR + IFUSED ZXCLS ZXCLS: LD HL,#4000 LD DE,#4001 LD BC,#1AFF LD (HL),L LDIR RET + ENDIF GET_ID: LD HL,memBUFFER.ID ;LD C,BIOS.FN_VERSION @@ -1740,10 +1743,10 @@ End BYTE memBUFFER MAIN_BUFFERS = $ STACK EQU #C000 -.size EQU 128 +.Size EQU 128 - IF memBUFFER.End-1 > #C000-STACK.size + IF memBUFFER.End-1 > #C000-STACK.Size DISPLAY 'memBUFFER.Shared overlaps STACK by: ',/A,(memBUFFER.End-1)-(#C000-STACK.size) ASSERT memBUFFER.End-1 < #C000-STACK.size ENDIF @@ -1761,7 +1764,7 @@ STACK EQU #C000 DISPLAY 'End code address: ',/A,$-1 DISPLAY 'Code size: ',/A,$-COMPILE_ADDR.MAIN DISPLAY 'End buffers address: ',/A,memBUFFER.End-1 - DISPLAY 'Free memory: ',/A,#C000-(memBUFFER.End-1)-STACK.size + DISPLAY 'Free memory: ',/A,#C000-(memBUFFER.End-1)-STACK.Size DISPLAY 'Unused bytes before INT_POINTER: ',/A,INT_POINTER-before_intPointer ENDIF ; \ No newline at end of file