diff --git a/Shared_Includes b/Shared_Includes index 18eb677..7bb1538 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 18eb6779037e4e6291119d52cd7b8aba3b51de6c +Subproject commit 7bb1538646ae7e8ba917d04b55e7396d74154df7 diff --git a/src/bios/exp/EXP.asm b/src/bios/exp/EXP.asm index 3cf46e4..01d6807 100644 --- a/src/bios/exp/EXP.asm +++ b/src/bios/exp/EXP.asm @@ -857,7 +857,6 @@ Setup_to_RAM: LD HL,Setup_Starter.Start ;JP PrepareToZX ENDMODULE - PrepareToZX: ;CALL init_zx_roms ; Setup HDD drives for ZX Spectrum mode DI @@ -896,10 +895,12 @@ PrepareToZX: ;CALL init_zx_roms CP #10 JR C,.loop ; выход в режим zx spectrum -.start_zx: XOR A +.start_zx: IF FREE_ZX_PAGES - JP GOTO_SPEC + ; +=========== ELSE ; [x] free zx pages! + XOR A OUT (SLOT2),A ; ZERO_PAGE DEC A OUT (SLOT1),A ; SHARED_PAGE diff --git a/src/bios/exp/FUNC_SCREEN.ASM b/src/bios/exp/FUNC_SCREEN.ASM index 8eae9fc..2fad725 100644 --- a/src/bios/exp/FUNC_SCREEN.ASM +++ b/src/bios/exp/FUNC_SCREEN.ASM @@ -801,290 +801,259 @@ GEN_PAL2_L1: ; ;************************************ -FN_SYNC: - BIT 7,a - JR Z,.old_mode - - ld h,a - and #60 ; check reserved bits - jr nz,.error - - bit 2,h ; Set V-Sinc? - jr nz,.set_v_sinc - - bit 4,h ; Set Waits? - jr z,.error ; Error - no parameters - -.set_waits: - ld a,h - and 8 ; check waits. Z - no waits, NZ - waits - ld h,Port_All_Mode.DEFAULT - jr z,1F - ld h,Port_All_Mode.DEFAULT - Port_All_Mode.MEM_WAITS_OFF -1: ld bc,(Port_All_Mode) - in a,(C) - and h - out (C),a - RET - -.set_v_sinc: - ld a,h - and 3 - jr z,.SetDefLines - dec a - jr z,.SetCmosLines - dec a - jr z,.Set320Lines -; jr Set312Lines - -.set312lines: - ld a,Port_VSYNC.SET_312L - out (Port_VSYNC),a - - LD C,SLOT3 - IN B,(C) - LD A,SYS_PAGE - OUT (C),A - ld a,(SYS_PAGE.VSyncAndWaits) - and 2 - ld (SYS_PAGE.VSyncAndWaits),a - OUT (C),B - -.end_set_v_sinc: - bit 4,h - ret z - jr .set_waits - - -.Set320Lines: - ld a,Port_VSYNC.SET_320L - out (Port_VSYNC),a - - LD C,SLOT3 - IN B,(C) - LD A,SYS_PAGE - OUT (C),A - ld a,(SYS_PAGE.VSyncAndWaits) - or 1 - ld (SYS_PAGE.VSyncAndWaits),a - OUT (C),B - - jr .end_set_v_sinc - -.SetCmosLines: - LD D,CMOS_CELL.ScreenSET - CALL CMOS_RD - - AND high CMOS_CELL.ScreenSET.Mask.Sinc ; в регистре A значение ScreenSET - jr z,.SetDefLines - - bit 6,a - jr z,.set312lines - - jr .Set320Lines - -.old_mode: - AND A - JR Z,.INT_DEF - DEC A - JR Z,.INT_SCORP - DEC A - JR Z,.INT_PENT - DEC A - JR Z,.INT_ORIG - DEC A - JR Z,.INT_CMOS_SINC - ; [x] кастомный экран по таблице пользователя - DEC A - JR Z,.PROG_SCR - ; -.error: SCF - RET - -.SetDefLines: - LD C,SLOT3 - IN B,(C) - LD A,SYS_PAGE - OUT (C),A - ld a,(SYS_PAGE.VSyncAndWaits) - OUT (C),B - and 1 - jr z,.set312lines - jr .Set320Lines - -.INT_DEF: - LD C,SLOT3 - IN B,(C) - LD A,SYS_PAGE - OUT (C),A - LD DE,(SYS_PAGE.SCREEN_TABLE) - OUT (C),B - - CALL Test_CONFIG_ALL - jr nz,.INT_CMOS_SINC - jp (IX) - -.INT_CMOS_SINC: - LD C,SLOT3 - IN B,(C) - LD A,SYS_PAGE - OUT (C),A - LD DE,(SYS_PAGE.SCREEN_TABLE) - OUT (C),B - - LD D,CMOS_CELL.ScreenSET - CALL CMOS_RD - - AND high CMOS_CELL.ScreenSET.Mask.Int ; в регистре A значение ScreenSET - JR NZ,.skiptest - - CALL Test_CONFIG_ALL - JP (IX) ; default int (non CMOS) - -.skiptest: - cp #10 - jr z,.INT_SCORP ; scorpion int - - cp #20 - jr z,.INT_PENT ; pentagon int - -; jr ORIG_SINC ; original int - -.INT_ORIG: - LD IX,SCREEN_TABLES.ORIGINAL - JR .PROG_SCR -.INT_SCORP: - LD IX,SCREEN_TABLES.SCORPION - JR .PROG_SCR -.INT_PENT: - LD IX,SCREEN_TABLES.PENTAGON -; JR PROG_SCR -.PROG_SCR: - IN A,(SLOT3) - EX AF,AF' - LD A,SYS_PAGE - OUT (SLOT3),A - EX AF,AF' - LD (SYS_PAGE.COPY_SLOT3),A - IN A,(PORT_Y) - LD (SYS_PAGE.COPY_RGADR),A - - LD (SYS_PAGE.SCREEN_TABLE),IX - XOR A - +FN_SYNC: BIT 7,A + JR Z,.old_mode + ; + LD H,A + AND #60 ; check reserved bits + JR NZ,.error + ; + BIT 2,H ; Set V-Sinc? + JR NZ,.set_v_sinc + ; + BIT 4,H ; Set Waits? + JR Z,.error ; Error - no parameters + ; +.set_waits: LD A,H + AND 8 ; check waits. Z - no waits, NZ - waits + LD H,Port_All_Mode.DEFAULT + JR Z,.no_change + LD H,Port_All_Mode.DEFAULT-Port_All_Mode.MEM_WAITS_OFF +.no_change: LD BC,(Port_All_Mode) + IN A,(C) + AND H + OUT (C),A + RET + ; +.set_v_sinc: LD A,H + AND 3 + JR Z,.SetDefLines + DEC A + JR Z,.SetCmosLines + DEC A + JR Z,.Set320Lines + ;JR .Set312Lines +.set312lines: LD A,Port_VSYNC.SET_312L + OUT (Port_VSYNC),A + ; + LD C,SLOT3 + IN B,(C) + LD A,SYS_PAGE + OUT (C),A + LD A,(SYS_PAGE.VSyncAndWaits) + AND 2 + LD (SYS_PAGE.VSyncAndWaits),A + OUT (C),B + ; +.end_set_v_sinc: + BIT 4,H + RET Z + JR .set_waits + ; +.Set320Lines: LD A,Port_VSYNC.SET_320L + OUT (Port_VSYNC),A + ; + LD C,SLOT3 + IN B,(C) + LD A,SYS_PAGE + OUT (C),A + LD A,(SYS_PAGE.VSyncAndWaits) + OR 1 + LD (SYS_PAGE.VSyncAndWaits),A + OUT (C),B + JR .end_set_v_sinc + ; +.SetCmosLines: LD D,CMOS_CELL.ScreenSET + CALL CMOS_RD + ; + AND high CMOS_CELL.ScreenSET.Mask.Sinc ; в регистре A значение ScreenSET + JR Z,.SetDefLines + ; + BIT 6,A + JR Z,.set312lines + JR .Set320Lines + ; +.old_mode: AND A + JR Z,.INT_DEF + DEC A + JR Z,.INT_SCORP + DEC A + JR Z,.INT_PENT + DEC A + JR Z,.INT_ORIG + DEC A + JR Z,.INT_CMOS_SINC + ; [x] кастомный экран по таблице пользователя + DEC A + JR Z,.PROG_SCR + ; +.error: SCF + RET + ; +.SetDefLines: LD C,SLOT3 + IN B,(C) + LD A,SYS_PAGE + OUT (C),A + LD A,(SYS_PAGE.VSyncAndWaits) + OUT (C),B + AND 1 + JR Z,.set312lines + JR .Set320Lines + ; +.INT_DEF: LD C,SLOT3 + IN B,(C) + LD A,SYS_PAGE + OUT (C),A + LD DE,(SYS_PAGE.SCREEN_TABLE) + OUT (C),B + ; + CALL Test_SCREEN_TABLE + JR NZ,.INT_CMOS_SINC + JP (IX) + ; +.INT_CMOS_SINC: LD C,SLOT3 + IN B,(C) + LD A,SYS_PAGE + OUT (C),A + LD DE,(SYS_PAGE.SCREEN_TABLE) + OUT (C),B + ; + LD D,CMOS_CELL.ScreenSET + CALL CMOS_RD + ; + AND high CMOS_CELL.ScreenSET.Mask.Int ; в регистре A значение ScreenSET + JR NZ,.skiptest + ; + CALL Test_SCREEN_TABLE + JP (IX) ; default int (non CMOS) + ; +.skiptest: CP #10 + JR Z,.INT_SCORP ; scorpion int + ; + CP #20 + JR Z,.INT_PENT ; pentagon int + ; + ;JR .INT_ORIG ; original int +.INT_ORIG: LD IX,SCREEN_TABLES.ORIGINAL + JR .PROG_SCR + ; +.INT_SCORP: LD IX,SCREEN_TABLES.SCORPION + JR .PROG_SCR + ; +.INT_PENT: LD IX,SCREEN_TABLES.PENTAGON + ;JR .PROG_SCR +.PROG_SCR: IN A,(SLOT3) + EX AF,AF' + LD A,SYS_PAGE + OUT (SLOT3),A + EX AF,AF' + LD (SYS_PAGE.COPY_SLOT3),A + IN A,(PORT_Y) + LD (SYS_PAGE.COPY_RGADR),A + ; + LD (SYS_PAGE.SCREEN_TABLE),IX + XOR A ;----[START]-----------------------[? 1] -.loop_1: - OUT (PORT_Y),A - EX AF,AF' - - LD A,#50 - OUT (SLOT3),A - - LD HL,#C300 - +.loop_1: OUT (PORT_Y),A + EX AF,AF' + LD A,#50 + OUT (SLOT3),A + LD HL,#C300 ;----[START]------------------[v 2]----- -.loop_2: - LD C,(IX) +.loop_2: LD C,(IX) ;----[START]-------------[v 3]---------- -.loop_3: -; взять адрес данных для записи в служебную область экрана - LD E,(IX+1) ; take adress of line X - LD D,(IX+2) +.loop_3: ; взять адрес данных для записи в служебную область экрана + LD E,(IX+1) ; take adress of line X + LD D,(IX+2) ;----[START]--------[v 4]--------------- -.loop_4: - LD A,(DE) ; take counter in table 1, line X, column Y - INC DE - AND A - JR Z,.loop_4_exit ; exit if zero-counter - LD B,A - LD A,(DE) - INC DE +.loop_4: LD A,(DE) ; take counter in table 1, line X, column Y + INC DE + AND A + JR Z,.loop_4_exit ; exit if zero-counter + LD B,A + LD A,(DE) + INC DE ;----[START]---[v 5]-------------------- -.loop_5: - LD (HL),A - INC L - LD (HL),0 - INC L - LD (HL),0 - - EX AF,AF' - INC A - OUT (PORT_Y),A - EX AF,AF' - - LD (HL),0 - DEC L - LD (HL),0 - DEC L - LD (HL),A - - EX AF,AF' - INC A - OUT (PORT_Y),A - EX AF,AF' - - DJNZ .loop_5 +.loop_5: LD (HL),A + INC L + LD (HL),0 + INC L + LD (HL),0 + ; + EX AF,AF' + INC A + OUT (PORT_Y),A + EX AF,AF' + ; + LD (HL),0 + DEC L + LD (HL),0 + DEC L + LD (HL),A + ; + EX AF,AF' + INC A + OUT (PORT_Y),A + EX AF,AF' + ; + DJNZ .loop_5 ;--------------[^ 5]-------------------- - JR .loop_4 + JR .loop_4 ;-------------------[^ 4]--------------- -.loop_4_exit: - INC HL ; next line - INC HL - INC HL - INC HL - IN A,(PORT_Y) - AND #80 - OUT (PORT_Y),A - DEC C - JR NZ,.loop_3 +.loop_4_exit: INC HL ; next line + INC HL + INC HL + INC HL + IN A,(PORT_Y) + AND #80 + OUT (PORT_Y),A + DEC C + JR NZ,.loop_3 ;------------------------[^ 3]---------- - INC IX ; next counter - INC IX - INC IX - LD A,(IX) - AND A - JR NZ,.loop_2 + INC IX ; next counter + INC IX + INC IX + LD A,(IX) + AND A + JR NZ,.loop_2 ;-----------------------------[^ 2]----- - LD A,SYS_PAGE - OUT (SLOT3),A - LD IX,(SYS_PAGE.SCREEN_TABLE) - - EX AF,AF' - ADD A,#80 - JR NC,.loop_1 + LD A,SYS_PAGE + OUT (SLOT3),A + LD IX,(SYS_PAGE.SCREEN_TABLE) + ; + EX AF,AF' + ADD A,#80 + JR NC,.loop_1 ;----------------------------------[^ 1] - - ; Exit - LD A,(SYS_PAGE.COPY_RGADR) - OUT (PORT_Y),A - LD A,(SYS_PAGE.COPY_SLOT3) - OUT (SLOT3),A -.exit: OR A - RET - -;DE - содержимое CONFIG_ALL -Test_CONFIG_ALL: - LD HL,SCREEN_TABLES.SCORPION - AND A - SBC HL,DE - ld IX,FN_SYNC.INT_SCORP - RET Z - - LD HL,SCREEN_TABLES.ORIGINAL - AND A - SBC HL,DE - ld IX,FN_SYNC.INT_ORIG - RET Z - - LD HL,SCREEN_TABLES.PENTAGON - AND A - SBC HL,DE - ld IX,FN_SYNC.INT_PENT - RET Z - and a - RET - - + ; Exit + LD A,(SYS_PAGE.COPY_RGADR) + OUT (PORT_Y),A + LD A,(SYS_PAGE.COPY_SLOT3) + OUT (SLOT3),A +.exit: OR A + RET + ; + ;DE - содержимое SYS_PAGE.SCREEN_TABLE +Test_SCREEN_TABLE: + LD HL,SCREEN_TABLES.SCORPION + AND A + SBC HL,DE + LD IX,FN_SYNC.INT_SCORP + RET Z + ; + LD HL,SCREEN_TABLES.ORIGINAL + AND A + SBC HL,DE + LD IX,FN_SYNC.INT_ORIG + RET Z + ; + LD HL,SCREEN_TABLES.PENTAGON + AND A + SBC HL,DE + LD IX,FN_SYNC.INT_PENT + RET Z + AND A + RET ;--- Screen data table 1: counter1, data1 .. counterX, dataX SCREEN_TABLES: ; | число | значения | diff --git a/src/bios/exp/FUNC_ZX.ASM b/src/bios/exp/FUNC_ZX.ASM index 72332c6..456f67e 100644 --- a/src/bios/exp/FUNC_ZX.ASM +++ b/src/bios/exp/FUNC_ZX.ASM @@ -10,7 +10,16 @@ ; 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_ ; ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░; @@ -53,9 +62,12 @@ ; ;если стэк находится в третьем слоте, то вызов с выключенными прерываниями FN_ENTRANCE: ;!TODO A - TASK NUMBER + AND A + LD A,BIOS.Error.NotSupported + SCF + RET Z + ; EXX - CALL GET_ZX_TASK_DATA - ; LD C,SLOT3 IN B,(C) LD A,SYS_PAGE @@ -100,24 +112,26 @@ FN_ENTRANCE: ;!TODO A - TASK NUMBER ;-----------------------------------------------------------------------; ; Не портить 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 +; 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 ;-----------------------------------------------------------------------; ;-----------------------------------------------------------------------; -;Вход: A - TASK NUMBER -FREE_vMEMORY: LD D,(IX + _ZX_TASK_DATA.vROM_ID) - LD A,(IX + _ZX_TASK_DATA.vRAM_ID) +FREE_vMEMORY: LD A,(SYS_PAGE.Block_ID.vROM) CALL EMM.FreeMem - LD A,D + LD A,(SYS_PAGE.Block_ID.vRAM) CALL EMM.FreeMem + ; + LD HL,#FFFF + LD (SYS_PAGE.Block_ID.vROM),HL + ; JP RES_FLAG_ZXvROM ;-----------------------------------------------------------------------; @@ -128,33 +142,33 @@ FREE_vMEMORY: LD D,(IX + _ZX_TASK_DATA.vROM_ID) ;Выход: H - vRAM block ID ; L - vROM block ID GET_RAMBLOCK_IDs: - LD H,(IX + _ZX_TASK_DATA.vRAM_ID) - LD L,(IX + _ZX_TASK_DATA.vROM_ID) + LD HL,(SYS_PAGE.Block_IDs) RET ;-----------------------------------------------------------------------; ;-----------------------------------------------------------------------; -;Вход: HL - блок страниц на которые маппим (всегда 11 шт.) -; A - TASK NUMBER -INIT_vROM: LD A,(IX + _ZX_TASK_DATA.vROM_ID) +;Вход: 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 (IX + _ZX_TASK_DATA.vROM_ID),A - INC HL + LD (SYS_PAGE.Block_ID.vROM),A ; установка портов ROM LD DE,.PORTS LD B,.PORTS.Size .loop: PUSH BC LD A,(HL) INC HL - AND A - JR Z,.not_Spec_Page - LD A,Spec_Page ;!FIXIT или оставить? + CP #FF + JR NZ,.not_Spec_Page + LD A,Spec_Page .not_Spec_Page: LD B,A LD A,(DE) INC DE @@ -165,35 +179,48 @@ INIT_vROM: LD A,(IX + _ZX_TASK_DATA.vROM_ID) 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.BIOS ; ROM-ID - EXPANSION - DB ACEX.vROM.BIOS_3 ; ROM-ID - BIOS-1 - DB ACEX.vROM.BIOS_4 ; ROM-ID - BIOS-2 + 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.BIOS_2 ; BIOS (ZX_EXP) - 2 + DB ACEX.vROM.EXPANSION_2 ; BIOS (ZX_EXP) - 2 .PORTS.Size EQU $-.PORTS ;-----------------------------------------------------------------------; -/* + ;-----------------------------------------------------------------------; ;ВХОД: HL - список страниц ; E - 0 = 128kb, 1 = 512kb -INIT_PENT_vRAM: DI - XOR A +INIT_vRAM: XOR A .set_1ffd: LD BC,#1FFD OUT (C),A ; set 128 LD B,#7F - LD D,A + LD D,%0000'0000 CALL SET_7FFD ; XOR A @@ -201,8 +228,8 @@ INIT_PENT_vRAM: DI BIT 3,E ; 128/512 RET Z ; set 128 + 384 - LD A,SYS_PORT.CNF_512 - OUT (SYS_PORT.ROM),A + ;LD A,SYS_PORT.CNF_512 + ;OUT (SYS_PORT.ROM),A ; LD D,%0100'0000 CALL SET_7FFD @@ -216,7 +243,6 @@ INIT_PENT_vRAM: DI RET ;-----------------------------------------------------------------------; -;!FIXIT косяк со стеком в SLOT3 ;-----------------------------------------------------------------------; ;ВХОД: HL - список страниц ; D - начальное значение для 7FFD @@ -229,24 +255,30 @@ SET_7FFD: LD A,(HL) 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,3+1 +GET_48k_MEM: LD D,ZX_MEMORY.MODE_48k JR GET_XXX_MEM ;Выполняется для инита 3 страниц ОЗУ 48k и 29 страниц ОЗУ Pent512k -GET_512k_MEM: LD D,3+29 +GET_512k_MEM: LD D,ZX_MEMORY.MODE_512k JR GET_XXX_MEM ;Выполняется для выделения 3 страниц ОЗУ 48k и 5 страниц ОЗУ 128k тачек -GET_128k_MEM: LD D,3+5 +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 (IX + _ZX_TASK_DATA.vRAM_ID),A + LD (SYS_PAGE.Block_ID.vRAM),A RET ;-----------------------------------------------------------------------; @@ -254,9 +286,9 @@ GET_XXX_MEM: CALL FREE_vRAM ;-----------------------------------------------------------------------; FREE_vRAM: XOR A LD C,A - OR (IX + _ZX_TASK_DATA.vRAM_ID) + OR (SYS_PAGE.Block_ID.vRAM) RET Z - LD (IX + _ZX_TASK_DATA.vRAM_ID),C + LD (SYS_PAGE.Block_ID.vRAM),C JP EMM.FreeMem ;-----------------------------------------------------------------------; @@ -269,7 +301,7 @@ GET_SCORP_RAM: CALL FREE_vRAM ; выделить страницы скорпа XOR A LD DE,#F0D0 ; для фильтра. #F0 - маска, #D0 - страницы ISA #D0..#DF - LD BC,8*256 + #FF ; B - количество страниц, C - Метка конца рамблока + 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 @@ -287,12 +319,12 @@ GET_SCORP_RAM: CALL FREE_vRAM AND A LD D,L ; Get Pent128 mem - LD B,3+5 + 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 (IX + _ZX_TASK_DATA.vRAM_ID),A + LD (SYS_PAGE.Block_ID.vRAM),A RET ; ; фильтр для страниц скорпа @@ -334,17 +366,27 @@ GET_SCORP_RAM: CALL FREE_vRAM ; CF: 1 - не переустанавливать палитру /* -; Вход: D[3..0]: 0 - BASIC 128, 1 - BASIC 48, 2 - TR-DOS 128, -; 3 - EXPANSION. C закрытыми 128-ми портами: -; 4 - TR-DOS, 5 - BASIC 48 -; D[7..4]: ;!TODO Port All Mode: b4 - Acc off/on -; E: значение для SYS_PORT/CNF_PORT -; 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: DI - PUSH AF +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 @@ -354,42 +396,37 @@ GOTO_SPEC: DI LD A,SYS_PAGE OUT (SLOT3),A ; - LD A,B - LD (SYS_PAGE.CONFIG_DE.ZX_START),A + LD (SYS_PAGE.CONFIG_DE),DE + LD (SYS_PAGE.Block_IDs),HL ; - POP DE + EXX LD SP,#C000 - LD A,D - CALL GET_ZX_TASK_DATA - LD A,(IX + _ZX_TASK_DATA.STATE) - RR E - JR NC,.save_state - OR %0000'0100 -.save_state: LD (IX + _ZX_TASK_DATA.STATE),A ; ; [ ] free zx pages! ;!TODO если задача пустая, то первый инит ; - ;!TODO сделать активацию винта для параметра из Setup - ;!TODO установить где-нибудь ниже стэк из TASK - LD A,(SYS_PAGE.CONFIG_DE.ZX_START) - LD (IX + _ZX_TASK_DATA.CONFIG_DE + 1),A - ; - LD A,(IX + _ZX_TASK_DATA.PORT_ALL_MODE) - LD BC,Port_All_Mode - OUT (C),A + ;!TODO сделать активацию винта для параметра из Setup + ;!TODO установить где-нибудь ниже стэк из TASK + ; LD A,(IX + _ZX_TASK_DATA.PORT_ALL_MODE) + ; LD BC,Port_All_Mode + ; OUT (C),A ; установка инта - LD A,(IX + _ZX_TASK_DATA.FN_SYNC) - AND %0000'0111 + EXX + LD A,C + EXX + AND %0000'0011 CALL FN_SYNC ; установка развёртки - LD A,(IX + _ZX_TASK_DATA.FN_SYNC) - AND %1100'0000 - OR %0010'0000 - RLCA + EXX + LD A,C + EXX RLCA + AND %0000'0001 + OR %1000'0110 CALL FN_SYNC + EXX + LD A,C + EXX ; - LD A,(IX + _ZX_TASK_DATA.STATE) AND %0000'0100 ;!TODO запомнить/восстановить кастомную палитру? CALL Z,SET_TXT_PALETTE.ZX ; @@ -400,7 +437,7 @@ GOTO_SPEC: DI LD HL,#5104 CALL LP_SET_32.X ; .SHARED_BUFFER_256b - LD A,(IX + _ZX_TASK_DATA.vRAM_ID) + LD A,(SYS_PAGE.Block_ID.vRAM) LD HL,SYS_PAGE.SHARED_BUFFER_256b CALL EMM.GetMemBlkPages ;!FIXIT @@ -409,7 +446,7 @@ GOTO_SPEC: DI ;LD A,B ;CP 16 ; - + LD D,B ;.TASK_0: XOR A ; задача 0, режим 256 килобайт .START_TASK: LD IY,.BASIC_128 JP INIT_PAGES ; инициализация номеров страниц режима спектрума @@ -440,126 +477,66 @@ GOTO_SPEC: DI ;***************************************** ;!TODO стек установлен во второй странице, не использовать или устанавливать в другую! ; инициализация страниц zx spectrum -; HL - адрес блока страниц в SLOT3 -; B - количество этих страниц -INIT_PAGES: - LD A,SYS_PAGE - OUT (SLOT1),A - ; - RES 7,H - - - ; AND A - ; LD E,A - ; EX AF,AF' - ; LD A,E - - ; BIT 7,A - ; JR Z,SCORPION_256_MODE - ; BIT 6,A - ; JR Z,PENTAGON_128_MODE - ; -;PENTAGON_48_MODE: - ; AND #3C - ; OUT (SLOT0),A - ; INC A - ; OUT (SLOT1),A - ; INC A - ; OUT (SLOT2),A - ; INC A - ; LD D,A - ; LD BC,#1FFD - ; XOR A - ; OUT (C),A - ; LD B,#7F - ; OUT (C),A - ; LD A,D - ; OUT (SLOT3),A - ; JR INIT_VIDEO_REG - -================================================================ -; PENTAGON_128_MODE: -; LD D,8 -; AND #38 -; JR ALL_MODE - -; SCORPION_256_MODE: -; LD D,16 -; AND #30 ; до 4-х спектрумов - -;ALL_MODE: - LD A,(HL) ; страница для SLOT1 - EX AF,AF' - ; - INC HL - DEC B - LD A,(HL) - OUT (SLOT2),A - INC HL - OUT (SLOT3),A - OUT (SLOT0),A - - -.loop: DEC D - - LD A,D - RLCA - AND #10 - LD BC,#1FFD - OUT (C),A - - LD A,D - AND 7 - OR #40 - LD B,#7F - OUT (C),A - - LD A,E - OUT (SLOT3),A - DEC E - - DEC D - INC D - JR NZ,.loop - -.INIT_VIDEO_REG: - XOR A - OUT (RGADR),A ; регистр видео адреса - OUT (RGMOD),A ; регистр моды -; OUT (RGSCR),A ; регистр экрана - - ;!TEST - ; Restore old Spectrum Screen - ;; LD HL,#4000 - ;; LD DE,#4000 - ;; LD BC,#1B00 - ;; LDIR - - ; EX AF,AF' - ; BIT 6,A - ; JR NZ,NO_SCREEN_ALT - - ; EX AF,AF' - - ; LD A,7 ; седьмая экранная страница - ; LD BC,#7FFD - ; OUT (C),A - - ; Restore old Spectrum Screen 2 - ;; LD HL,#C000 - ;; LD DE,#C000 - ;; LD BC,#1B00 - ;; LDIR - - ; XOR A - ; LD BC,#7FFD - ; OUT (C),A - ; - - EX AF,AF' -.NO_SCREEN_ALT: - AND A - JP (IY) +; 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 ;--------------------------------------------------------------------[|] ;-----------------------------------------------------------------------; @@ -750,64 +727,69 @@ NO_SCREEN_ALT: ;--------[ Программа, размещаемая с #5B00 для запуска Spectrum ]--------; RES128_PROG: - DISP ZX_VARS.PRINTER_BUFFER ;#5B00 - LD A,ROM.BIOS - 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) - ;XOR A - ;LD (SYS_PAGE.CONFIG_DE.ZX_START),A - OUT (C),B - - 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 + 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 ;-----------------------------------------------------------------------; diff --git a/src/bios/rom/SETUP/AUTOIDE.asm b/src/bios/rom/SETUP/AUTOIDE.asm index fe4131a..68477a6 100644 --- a/src/bios/rom/SETUP/AUTOIDE.asm +++ b/src/bios/rom/SETUP/AUTOIDE.asm @@ -238,7 +238,7 @@ STEP1_GETCMOS: .choose: EI ; - CALL G_VALUE + CALL GET_CMOS_VALUE OR A JR Z,AUTODETECT ;AUTO DETECT ; diff --git a/src/bios/rom/SETUP/MAIN.asm b/src/bios/rom/SETUP/MAIN.asm index 0273ccd..6a2c28a 100644 --- a/src/bios/rom/SETUP/MAIN.asm +++ b/src/bios/rom/SETUP/MAIN.asm @@ -243,7 +243,7 @@ CMSERR: ; RST_to_BIOS RET -CLEARM: IN A,(SLOT3) +CLEAR_MEM: IN A,(SLOT3) PUSH AF LD A,SYS_PAGE OUT (SLOT3),A @@ -276,7 +276,7 @@ CLEARM: IN A,(SLOT3) ; CALL EMM.InitMem LD BC,CMOS_CELL.BootUpParams.Mask.SaveRAMdisks ;#400E - CALL G_VALUE + CALL GET_CMOS_VALUE OR A CALL NZ,CCHAIN POP AF @@ -361,29 +361,65 @@ INT_ON: ; ;------------------------[go to spectrum from bios]---------------------; -EXIT_SETUP: - CALL INT_OFF -; -; LD BC,#020E -; CALL G_VALUE -; OR A -; LD A,#EC ;SPRINTER -; JR Z,XFLEX -; LD A,#EA ;SPECTRUM +EXIT_SETUP: CALL INT_OFF + CALL TRD_MOUNT ; !TEST 24/09/2024 перенос в EXIT_SETUP (перед запуском ZX) + + IF FREE_ZX_PAGES + LD A,Spec_Page + OUT (SLOT3),A + ; + LD A,(Spec_Page.flag_Z) + CP 'Z' + LD A,(Spec_Page.flag_X) + LD B,A + LD A,SYS_PAGE + OUT (SLOT3),A + LD A,B + JR NZ,.Set_Page41 + CP 'X' + JR Z,.vROMs_Installed + ; +.Set_Page41: CALL ZXMODE_SETUP.Set_Page41 +.vROMs_Installed: + CALL MANAGE_ZX_PAGES.GET_SCORP_RAM ;!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 + ; +.set_ZX_params: LD L,A ; Block_ID.vRAM + +====== + ;!TODO настраивать в BIOS zx mode + LD DE,256*0 + CNF_PORT.TURBO.ON + CNF_PORT.CNF_0 + ; + JP GOTO_SPEC.FN + ELSE + ;LD BC,#020E + ;CALL GET_CMOS_VALUE + ;OR A + ;LD A,#EC ;SPRINTER + ;JR Z,XFLEX + ;LD A,#EA ;SPECTRUM ;XFLEX: - LD A,ROM.BIOS - OUT (SYS_PORT.ROM),A - POP HL ; пихается в EXP.ASM в процедуре - JP (HL) -; LD (JMPHL),HL + LD A,ROM.BIOS + OUT (SYS_PORT.ROM),A + POP HL ; пихается в EXP.ASM в процедуре + JP (HL) + ;LD (JMPHL),HL - ; LD C,#F3 - ; RST_to_BIOS -; JMPHL EQU $+1 -; JP #0000 + ;LD C,#F3 + ;RST_to_BIOS +;JMPHL EQU $+1 + ;JP #0000 + ENDIF ;-----------------------------------------------------------------------; - INSTALL: CALL INT_ON CALL SET_CGA @@ -449,8 +485,9 @@ INSTALL: ;BUILD: ; db ', BIOS v', Disk_subsystem_ver_txt,0 ; !FIXIT может воткнуть вместе с msgStrings ? -RSTID: DB "RESTART",0 -.size EQU $-RSTID +RESTART_ID: +.str: DZ "RESTART" +.size EQU $ - RESTART_ID.str Start_again: ld sp,STACK-2 @@ -519,19 +556,20 @@ START: POP BC OUT (C),B - CALL TRQUICK - CALL FINSTAL + + ;CALL TRD_MOUNT ; !TEST 24/09/2024 перенос в EXIT_SETUP (перед запуском ZX) + CALL FDD_INSTAL CALL ZXMODE_SETUP - CALL CLEARM - CALL RESCREEN + CALL CLEAR_MEM + CALL XY_SCREEN ;R06 LD BC,CMOS_CELL.BootUpParams.Mask.QuickStartROM ;#010E - CALL G_VALUE + CALL GET_CMOS_VALUE POP BC INC B DEC B - JR NZ,QIGNORE ; результат проверки Space из exp.asm [space_check] + JR NZ,IGNORE_QuickStartROM ; результат проверки Space из exp.asm [space_check] PUSH AF LD C,SLOT3 IN B,(C) @@ -539,19 +577,19 @@ START: LD A,SYS_PAGE OUT (C),A LD HL,SYS_PAGE.RESTART_ID - LD DE,RSTID - LD B,RSTID.size - CALL COMPARE - CALL NZ,SETRSTS + LD DE,RESTART_ID.str + LD B,RESTART_ID.size + CALL COMPARE_RESTART_ID + CALL NZ,SET_RESTART_ID POP BC OUT (C),B - JR Z,HOTST + JR Z,YES_QuickStartROM POP AF - JR QIGNORE + JR IGNORE_QuickStartROM -SETRSTS: +SET_RESTART_ID: PUSH AF - LD HL,RSTID + LD HL,RESTART_ID.str LD DE,SYS_PAGE.RESTART_ID LD BC,RSTID.size LDIR @@ -560,11 +598,11 @@ SETRSTS: POP AF RET -HOTST: +YES_QuickStartROM: POP AF OR A JP NZ,EXIT_SETUP -QIGNORE: +IGNORE_QuickStartROM: CALL INSTALL LD DE,#0528 ;CALL ScreenPOS.LOCAT @@ -577,11 +615,11 @@ QIGNORE: ;CALL ScreenPOS.LOCAT CALL LP_SET_PLACE ERRSUM+1: - LD A,#00 ;MEM Patch! + LD A,#00 OR A JR Z,.ErrDateTime XOR A - ld (.ErrDateTime+1),a ; если контрольная сумма слетела, то сообщение о кривых дате/времени в кмос не выводим + LD (.ErrDateTime+1),A ; если контрольная сумма слетела, то сообщение о кривых дате/времени в кмос не выводим LD A,msgStrings.cmosChecksumErr LD E,COLORS.CGA.INK.RED CALL POSTMSC @@ -710,7 +748,7 @@ ALT_BOOT: ;NO START DISK - RESTART / SETUP / ZX SPECTRUM mode LD BC,CMOS_CELL.Options.Mask.RebootMSG ;#021D - CALL G_VALUE + CALL GET_CMOS_VALUE OR A JP Z,EXIT_SETUP @@ -754,13 +792,13 @@ ENTER_SETUP: XOR A JP Start_again -COMPARE: +COMPARE_RESTART_ID: LD A,(DE) CP (HL) RET NZ INC HL INC DE - DJNZ COMPARE + DJNZ COMPARE_RESTART_ID RET ; ????? перенести это в функции БИОС? @@ -801,7 +839,7 @@ writeDateTimeToCmos: ;!FIXIT CALL CMOS_WR RET -RESCREEN: ;R06 +XY_SCREEN: ;R06 LD A,CMOS_CELL.ScreenPosition CALL READCMS LD B,A @@ -922,7 +960,7 @@ PrepareToBOOT: ;CALL INT_ON JP Z,RECOVERYstart DEC BC ; - CALL G_VALUE + CALL GET_CMOS_VALUE LD B,DRIVE_CODES.SPRINTER.FDD ; FDD OR A @@ -1084,7 +1122,7 @@ SYSID: DZ "Starting..." FD144A: DB #80,#12,#02,#50,#00,#00,#02,FDD_INI_TABLE.FDD FD720A: DB #00,#09,#02,#50,#00,#00,#02,FDD_INI_TABLE.FDD -FINSTAL: IN A,(SLOT3) +FDD_INSTAL: IN A,(SLOT3) EX AF,AF' LD A,SYS_PAGE OUT (SLOT3),A @@ -1097,7 +1135,7 @@ FINSTAL: IN A,(SLOT3) EX AF,AF' OUT (SLOT3),A LD BC,CMOS_CELL.DrivesSetup_1.Mask.FirstFDD ;#0311 - CALL G_VALUE + CALL GET_CMOS_VALUE LD HL,FD720A OR A JR Z,.SETFD0 @@ -1114,7 +1152,7 @@ FINSTAL: IN A,(SLOT3) EX AF,AF' OUT (SLOT3),A .NOFDD0: LD BC,CMOS_CELL.DrivesSetup_1.Mask.SecondFDD ;#0C11 - CALL G_VALUE + CALL GET_CMOS_VALUE LD HL,FD720A OR A JR Z,.SETFD1 @@ -1375,47 +1413,47 @@ NOCOPYC: RET ;---------------------------------------------------------------[] -TRQUICK: ;REGISTER #1E ; %0000'0011 - TR DOS A: Default / FDD / HDD / RMD ; %0000'1100 - TR DOS B: Default / FDD / HDD / RMD ; %0011'0000 - TR DOS C: Default / FDD / HDD / RMD ; %1100'0000 - TR DOS D: Default / FDD / HDD / RMD - LD BC,CMOS_CELL.TRDOSmount.Mask.A ;#031E - LD A,0 - CALL TRDOSX - LD BC,CMOS_CELL.TRDOSmount.Mask.B ;#0C1E - LD A,1 - CALL TRDOSX - LD BC,CMOS_CELL.TRDOSmount.Mask.C ;#301E - LD A,2 - CALL TRDOSX - LD BC,CMOS_CELL.TRDOSmount.Mask.D ;#C01E - LD A,3 -TRDOSX: ; PUSH AF - ; CALL G_VALUE - ; POP BC - ; OR A - ; RET Z - ; LD C,BIOS.FDD_TO_DRV - ; DEC A - ; JP Z,ToBIOS_18 - ; LD C,BIOS.HDD_TO_DRV - ; DEC A - ; JP Z,ToBIOS_18 - ; SCF - ; RET - PUSH AF - CALL G_VALUE - POP BC - OR A - RET Z - DEC A - JP Z,FDD_TO_DRV - DEC A - JP Z,HDD_TO_DRV - SCF - RET + +TRD_MOUNT: LD BC,CMOS_CELL.TRDOSmount.Mask.A ;#031E + LD A,0 + CALL .TRDOSX + LD BC,CMOS_CELL.TRDOSmount.Mask.B ;#0C1E + LD A,1 + CALL .TRDOSX + LD BC,CMOS_CELL.TRDOSmount.Mask.C ;#301E + LD A,2 + CALL .TRDOSX + LD BC,CMOS_CELL.TRDOSmount.Mask.D ;#C01E + LD A,3 +.TRDOSX: ; PUSH AF + ; CALL GET_CMOS_VALUE + ; POP BC + ; OR A + ; RET Z + ; LD C,BIOS.FDD_TO_DRV + ; DEC A + ; JP Z,ToBIOS_18 + ; LD C,BIOS.HDD_TO_DRV + ; DEC A + ; JP Z,ToBIOS_18 + ; SCF + ; RET + PUSH AF + CALL GET_CMOS_VALUE + POP BC + OR A + RET Z + DEC A + JP Z,FDD_TO_DRV + DEC A + JP Z,HDD_TO_DRV + SCF + RET ;---------------------------------------------------------------[] @@ -1528,20 +1566,15 @@ POSTLEN: JP LP_SET_PLACE SETLAND: - LD A,#0E ; !HARDCODE CMOS ячейка options - CALL READCMS - AND #04 ; !HARDCODE CMOS значение языка - JR NZ,.RUS - ; + LD A,#0E ; !HARDCODE CMOS ячейка options + CALL READCMS ;!TODO переделать на GET_CMOS_VALUE + AND #04 ; !HARDCODE CMOS значение языка + LD HL,MSG_RUS + JR NZ,.set LD HL,MSG_ENG - LD DE,memBUFFER.Messages - LD BC,MSG_ENG.size - LDIR - RET ; -.RUS: LD HL,MSG_RUS - LD DE,memBUFFER.Messages - LD BC,MSG_RUS.size +.set: LD DE,memBUFFER.Messages + LD BC,MSG_TABLE.Size LDIR RET @@ -1600,7 +1633,7 @@ ZXMODE_SETUP: IN A,(SLOT3) OUT (SLOT3),A ; LD BC,CMOS_CELL.Options.Mask.LoadZXroms - CALL G_VALUE + CALL GET_CMOS_VALUE ; OR A JR Z,.init_41h @@ -1627,58 +1660,122 @@ ZXMODE_SETUP: IN A,(SLOT3) LD R,A ; ; Load ZX ROM's - CALL init_zx_roms - ; ставим метку если прогрузили ПЗУ спектрума - LD HL,Spec_Page.flag_X - LD (HL),'X' - DEC HL ; Spec_Page.flag_Z - LD (HL),'Z' - ; + CALL MANAGE_ZX_PAGES.FREE_vMEMORY ;!FIXIT не та страница в SLOT3 ; [ ] free zx pages! + LD B,3 ; !HARDCODE zx-rom number of pages + CALL EMM.GetMem + JR C,.init_41h ;!FIXIT печатать ошибку ; [ ] free zx pages! + CALL init_zx_roms + IFN FREE_ZX_PAGES + ; ставим метку если прогрузили ПЗУ спектрума + LD HL,'XZ' + LD (Spec_Page.flag_Z),HL + ENDIF ; .No_Need_To_Load_ZXROMS: POP AF OUT (SLOT3),A RET ; .init_41h: CALL init_zx_roms.init_41h + LD A,SYS_PAGE + OUT (SLOT3),A + CALL .Set_Page41 + ;!FIXIT установить во все vROM страницу #41 ; [ ] free zx pages! JR .No_Need_To_Load_ZXROMS + ; +.Set_Page41: LD HL,SYS_PAGE.SHARED_BUFFER_256b + 11 + LD DE,SYS_PAGE.SHARED_BUFFER_256b + 11-1 + LD BC,11-1 ; !HARDCODE кол-во страниц vROM + RAM BLOCK ID + LD (HL),#FF + LDDR ; зачищаем + EX DE,HL + JP MANAGE_ZX_PAGES.INIT_vROM ; ;--------------------[copy zx-roms to zx-pages]-----------------; ; SLOT0 - ROM 8, sys_port - on. ; RAM SLOT0 - page 0 +; RAM SLOT3 - Spec_Page ; для режима zx spectrum ; !HARDCODE номера страниц для эмулятора ПЗУ -init_zx_roms: IN A,(SLOT3) +init_zx_roms: DI + ;;;;;;;; + IF FREE_ZX_PAGES + ;;;;;;;; + ; НА ВХООДЕ A = SYS_PAGE.Block_ID.vROM + ; добиваем буфер до 11 байтов пустыми страницами + ; в буфер упадут 1 RAM BLOCK ID, 3 страницы для vROM и #FF + LD HL,#FFFF + LD (memBUFFER.Shared + 5),HL ; !HARDCODE zx-rom number of pages + LD (memBUFFER.Shared + 7),HL ; !HARDCODE zx-rom number of pages + LD (memBUFFER.Shared + 9),HL ; !HARDCODE zx-rom number of pages + ; получаем список страниц для vROM + LD HL,memBUFFER.Shared + LD (HL),A + INC HL + LD B,A + CALL EMM.GetMemBlkPages + ; + LD A,SYS_PAGE + OUT (SLOT3),A + ; устанавливаем номера страниц vROM в порты ALTERA + DEC HL + 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 +.loop: OUTI + OUT (ROM.SLOT0),A + EXX + LD HL,0 + LD DE,#C000 + LD BC,#4000 + LDIR + EXX + INC A + DJNZ .loop + ; возвращаем страницы на место + XOR A + OUT (ROM.SLOT0),A + OUT (SYS_PORT.ROM),A + LD A,Spec_Page + OUT (SLOT3),A + ;;;;;;;; + ELSE + ;;;;;;;; + IN A,(SLOT3) EX AF,AF' ; - DI - LD A,SYS_PORT.EXTENSION - OUT (SYS_PORT.ROM),A - INC A ;!HARDCODE LD A,2 - LD B,3 ; zx-rom number of pages + LD A,SYS_PORT.EXTENSION + OUT (SYS_PORT.ROM),A + INC A ; !HARDCODE LD A,2 + LD B,3 ; !HARDCODE zx-rom number of pages ; .loop: EXX ; - out (ROM.SLOT0),a - or %0100'0000 ; !HARDCODE номера страниц для эмулятора ПЗУ - out (SLOT3),a - and %1011'1111 ; !HARDCODE номера страниц для эмулятора ПЗУ + OUT (ROM.SLOT0),A + OR %0100'0000 ; !HARDCODE номера страниц для эмулятора ПЗУ + OUT (SLOT3),A + AND %1011'1111 ; !HARDCODE номера страниц для эмулятора ПЗУ ; LD HL,0 LD DE,#C000 LD BC,#4000 LDIR ; - INC A + INC A EXX - DJNZ .loop + DJNZ .loop ; - xor a - out (ROM.SLOT0),a - OUT (SYS_PORT.ROM),A + XOR A + OUT (ROM.SLOT0),A + OUT (SYS_PORT.ROM),A EX AF,AF' - out (SLOT3),a + OUT (SLOT3),A ; ;[x] SET_PORTS: no need to call from #3D13 and DI. 31/12/23 + ;!FIXIT ; [ ] free zx pages! переделать на вызов FREE_ZX_PAGES.INIT_vROM LD A,ACEX.vROM.BASIC_128 ; ROM-ID - BASIC 128 LD B,#42 ;!HARDCODE page CALL SET_PORTS @@ -1692,22 +1789,25 @@ init_zx_roms: IN A,(SLOT3) CALL SET_PORTS ; ; эти страницы пока не используются - LD A,ACEX.vROM.BIOS ; ROM-ID - BIOS + LD A,ACEX.vROM.EXPANSION ; ROM-ID - BIOS ;LD B,#45 ;!HARDCODE page LD B,#41 CALL SET_PORTS ; - LD A,ACEX.vROM.BIOS_3 ; ROM-ID - BIOS-1 + LD A,ACEX.vROM.BIOS_1 ; 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 A,ACEX.vROM.BIOS_2 ; ROM-ID - BIOS-2 ;LD B,#47 ;!HARDCODE page LD B,#41 CALL SET_PORTS ; можно задействовать ещё 4 страницы на порты #E4..#E7 - ; + ;;;;;;;; + ENDIF + ;;;;;;;; + .init_41h: ; забить FF-ами LD HL,#C000 LD DE,#C001 diff --git a/src/bios/rom/SETUP/SETTINGS.asm b/src/bios/rom/SETUP/SETTINGS.asm index 58c29fa..bfc7187 100644 --- a/src/bios/rom/SETUP/SETTINGS.asm +++ b/src/bios/rom/SETUP/SETTINGS.asm @@ -188,7 +188,7 @@ DEF_VAL: ;--------------------------------------- RestartSetup: ;setXYpos - CALL RESCREEN + CALL XY_SCREEN ;setLang CALL SETLAND ;setVsinc @@ -604,7 +604,7 @@ PITEM: LD E,(HL) ; x-coordinate ;/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\-[^] ; Не портит HL -G_VALUE: +GET_CMOS_VALUE: PUSH BC LD A,C CALL READCMS @@ -732,8 +732,8 @@ SETDEF: ;!TODO LD B,0 CALL WRITCMS - LD A,CMOS_CELL.ZX_CONFIG - LD B,CMOS_CELL.ZX_CONFIG.ZX_Sprinter + LD A,CMOS_CELL.ZX_RUN_ROM + LD B,CMOS_CELL.ZX_RUN_ROM.BASIC_128 CALL WRITCMS CALL CHEKSUM @@ -823,7 +823,7 @@ SetTime: ENDIF setXYpos: - JP RESCREEN + JP XY_SCREEN setVsinc: ld a,CMOS_CELL.ScreenSET diff --git a/src/bios/rom/SETUP/VIDEO_IO.asm b/src/bios/rom/SETUP/VIDEO_IO.asm index 66ec664..4ac4817 100644 --- a/src/bios/rom/SETUP/VIDEO_IO.asm +++ b/src/bios/rom/SETUP/VIDEO_IO.asm @@ -205,7 +205,7 @@ PRSYM: LD B,1 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; LOGOTYPE: CALL SHOW_LOGO LD BC,CMOS_CELL.BootUpParams.Mask.StartDelay - CALL G_VALUE + CALL GET_CMOS_VALUE OR A JR Z,.EASYDLY ; Delay average DEC A diff --git a/src/bios/rom/SETUP/messages.z80 b/src/bios/rom/SETUP/messages.z80 index 34bda04..fa7f635 100644 --- a/src/bios/rom/SETUP/messages.z80 +++ b/src/bios/rom/SETUP/messages.z80 @@ -573,6 +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 parLang, tmp_Counter : DZ 'Language (язык) : ' _mSetStr valLangEng, tmp_Counter : DZ 'English ' @@ -732,6 +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 parLang, tmp_Counter : DZ 'Язык (language) : ' _mSetStrRus valLangEng, tmp_Counter : DZ 'English ' @@ -837,4 +839,5 @@ MSG_RUS: MSG_RUS.size EQU $-MSG_RUS ;================================================================================================================================== ASSERT MSG_ENG.size = MSG_RUS.size, "ERROR IN MESSAGE STRINGS: RUS and ENG do not match" +MSG_TABLE.Size EQU MSG_RUS.size ; \ No newline at end of file diff --git a/src/bios/rom/ZX/ZX_FUNC.ASM b/src/bios/rom/ZX/ZX_FUNC.ASM index 71fbf6f..d6e153b 100644 --- a/src/bios/rom/ZX/ZX_FUNC.ASM +++ b/src/bios/rom/ZX/ZX_FUNC.ASM @@ -42,13 +42,13 @@ RET_FROM_BIOS_TO_BASIC48: ;-----------------------------------------------------------------------; ; коэффициент смещения по номеру таски - MACRO GET_ZX_TASK_DATA_OFFSET - RLCA - RLCA - RLCA - RLCA - AND #30 ; новая задача 0..3 - ENDM +; MACRO GET_ZX_TASK_DATA_OFFSET +; RLCA +; RLCA +; RLCA +; RLCA +; AND #30 ; новая задача 0..3 +; ENDM ;------[ ДЕШИФРАЦИЯ КОМАНДНОЙ СТРОКИ,ПЕРЕДАННОЙ ДЛЯ "EXPANSION" ]-------; @@ -75,14 +75,12 @@ COMAND_OK: ; JP Z,MENU_S1 CP ZX_Char.carriage_return JP Z,MENU_S1 + ; + AND %1101'1111 CP 'I' - JR Z,COMAND_ISD - CP 'i' - JR Z,COMAND_ISD - CP 'T' - JR Z,TASK_SWITCH - CP 't' - JR Z,TASK_SWITCH + JR Z,COMMAND_HARDWARE_MENU + ;CP 'T' + ;JR Z,TASK_SWITCH DEC HL POP BC JP BASIC_MENU @@ -91,21 +89,20 @@ MENU_S1: CALL SERVICE JP SW_ROM_1 -COMAND_ISD: +COMMAND_HARDWARE_MENU: LD A,(HL) INC HL + AND %1101'1111 CP 'S' - JP Z,COMAND_ISD2 - CP 's' - JP Z,COMAND_ISD2 - RET - -COMAND_ISD2: + RET NZ + ; POP BC - CALL ISDOS + CALL Hardware_Menu JP SW_ROM_1 +/* ;!TODO переделать под переключение на разные спектрумы с запущенными задачами + TASK_SWITCH: ; *** Сохранить задачу *** PUSH IY @@ -231,7 +228,7 @@ TASK_RESTORE: NO_TASK: POP BC JP SW_ROM_1 - +*/ ; 259F - ADRESS BASIC128 - MAIN_MENU ;-----------------------------------------------------------------------; diff --git a/src/bios/rom/ZX/ZX_MENU.ASM b/src/bios/rom/ZX/ZX_MENU.ASM index fb82056..9385c04 100644 --- a/src/bios/rom/ZX/ZX_MENU.ASM +++ b/src/bios/rom/ZX/ZX_MENU.ASM @@ -461,20 +461,20 @@ CLEAR_RAM: ; JR SR_CL_R2 ;***************************** -; *** MENU IS-DOS *** +; *** MENU Hardware *** ;***************************** -ISDOS: - LD HL,IS_TAB - LD DE,IS_MENU - LD BC,IS_MENU.Size +Hardware_Menu: + LD HL,Hardware_Menu_TAB + LD DE,Hardware_Menu_STR + LD BC,Hardware_Menu_STR.Size PUSH HL CALL RUN_MENU POP HL CALL EXEC_PNT - JR ISDOS + JR Hardware_Menu -IS_TAB: +Hardware_Menu_TAB: ; DW TR_DOS ; DW SP_DOS DW SPRINTER_1X @@ -486,7 +486,7 @@ IS_TAB: DW RET_FROM_M ; DC - every last character of a string will have bit 7 set -IS_MENU: +Hardware_Menu_STR: BYTE 8 ; количество пунктов BYTE 'Hardware',#FF ; заголовок меню DC 'Sprinter ZX ' @@ -497,7 +497,7 @@ IS_MENU: DC 'Restart ' DC 'RETURN' DC " " ; маркер конца -.Size EQU $-IS_MENU +.Size EQU $ - Hardware_Menu_STR ;****************************** ;SP_DOS: @@ -554,14 +554,14 @@ PENTAGON: CALL _SET_CNF CALL CNF_PN_320 LD L,2 ;FN_SYNC.INT_PENT - LD DE,CNF_PORT.CNF_2 + CNF_PORT.TURBO.ON + LD DE,CNF_PORT.CNF_1 + CNF_PORT.TURBO.ON JR CONFIG_SET PENTAGON512: CALL _SET_CNF CALL CNF_PN_320 LD L,2 ;FN_SYNC.INT_PENT - LD DE,CNF_PORT.CNF_2 + CNF_PORT.TURBO.ON + CNF_PORT.CNF_512 + LD DE,CNF_PORT.CNF_1 + CNF_PORT.TURBO.ON + CNF_PORT.CNF_512 ; JR CONFIG_SET CONFIG_SET: PUSH DE