diff --git a/Shared_Includes b/Shared_Includes index a15861c..8c5550f 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit a15861c07cab60eaf09c28226d0c7761b4fd8235 +Subproject commit 8c5550f810d173790e4665d610328b9247b00f02 diff --git a/src/bios/exp/BIOS_FUNC.asm b/src/bios/exp/BIOS_FUNC.asm index d408fd5..c935205 100644 --- a/src/bios/exp/BIOS_FUNC.asm +++ b/src/bios/exp/BIOS_FUNC.asm @@ -709,10 +709,26 @@ FN_5x_Parser: EX (SP),HL RET -EXP_FNS: ; Вход в функцию из TR-DOS - POP AF +; Вход в функции БИОС из TR-DOS +EXP_FNS:; отключаем запись в экран спектрума + EX (SP),HL + IN A,(RGADR) + LD L,A + LD A,#C0 + OUT (PORT_Y),A + LD A,H + EX (SP),HL ; (SP) = port_y + ; CALL EXP_FNS_RST18 CALL DOS_ON + ; возвращаем запись в экран спектрума + EX (SP),HL + PUSH AF + LD A,L + OUT (RGADR),A + POP AF + POP HL + ; возврат JP EXP_FNS_RET ;! ! ! ! ! ! ! ! diff --git a/src/bios/exp/EXP.asm b/src/bios/exp/EXP.asm index 5134b63..a92cd0b 100644 --- a/src/bios/exp/EXP.asm +++ b/src/bios/exp/EXP.asm @@ -49,7 +49,7 @@ RST_10: JP EXP_FNS_RST18 RST_18_1: CALL EXP_FNS_RST18 - JR EXP_FNS_2_RET +.exit: JR EXP_FNS_2_RET ;======================================= @@ -772,6 +772,8 @@ set_config: ; JR NZ,NO_SETUP_2 +;[---------------------------------------------------------------------] + MODULE Reset_Handler start: IN A,(SLOT3) @@ -853,21 +855,22 @@ init_rom_address EQU #8200 ;!HARDCO ;!FIXIT сделать выбор грузить да/нет ПЗУ спектрума при старте, [-------] ; если нет - то воткнуть этот код: ; LD HL,PROG_NO_ROM - ; LD DE,#C000 + #38 + ; LD DE,#C000 + Spec_Page.no_zx_rom ; LD BC,PROG_NO_ROM.size ; LDIR ; LD HL,RAM_BIOS_PROG - ; LD DE,#C000 + #08 + ; LD DE,#C000 + Spec_Page.to_bios ; LD BC,RAM_BIOS_PROG.Length ; LDIR -;[---------------------------------------------------------------------] +;--------------------------------------- Spec_Page_handler_OK: pop af OUT (SLOT3),A ENDMODULE +;[---------------------------------------------------------------------] ; ;************************************** ; @@ -1370,7 +1373,7 @@ Length EQU $-Setup_Starter.Start ;---------------------[ ЗАГЛУШКИ ДЛЯ #41 СТРАНИЦЫ]----------------------; ;-------------[RST 08] ; RAM_BIOS_PROG: ; for CALL BIOS in #41 page -; DISP #08 +; DISP Spec_Page.to_bios ; PUSH AF ; LD A,ROM.BIOS ; OUT (SYS_PORT.ROM),A @@ -1382,7 +1385,7 @@ Length EQU $-Setup_Starter.Start ; ;-------------[RST 38] ; PROG_NO_ROM: -; DISP #38 +; DISP Spec_Page.no_zx_rom ; DI ; LD A,#FF diff --git a/src/bios/exp/FUNC_LOW_PRINT.ASM b/src/bios/exp/FUNC_LOW_PRINT.ASM index a9c3d75..26a953c 100644 --- a/src/bios/exp/FUNC_LOW_PRINT.ASM +++ b/src/bios/exp/FUNC_LOW_PRINT.ASM @@ -585,13 +585,13 @@ WIN_SET_ZG: ; LP_SET_ZG: RET .SET: IN A,(SLOT1) LD (SYS_PAGE.COPY_SLOT1),A - LD A,#FF + LD A,SHARED_PAGE OUT (SLOT1),A EXX LD BC,Port_All_Mode IN A,(C) LD (SYS_PAGE.SYS_WORK1),A - AND #FE ; accelerator and keyboard interrupt off + AND #FE ; Spectrum Screen on, accelerator and keyboard interrupt off OUT (C),A EX AF,AF' LD B,A diff --git a/src/bios/exp/FUNC_RAM_ROM_DRV.ASM b/src/bios/exp/FUNC_RAM_ROM_DRV.ASM index 7b64620..fee71f7 100644 --- a/src/bios/exp/FUNC_RAM_ROM_DRV.ASM +++ b/src/bios/exp/FUNC_RAM_ROM_DRV.ASM @@ -30,7 +30,7 @@ EMM.GetMemSize: ; -;----------------------------------------------------------------------; +;----------------------------------------------------------------------; !FIXIT SAFE_RGADR ; Инициализация распределения памяти. EMM.InitMem: PUSH BC @@ -107,7 +107,7 @@ RESERVED_PAGES: ; -;----------------------------------------------------------------------; +;----------------------------------------------------------------------; !FIXIT SAFE_RGADR ; Получить блок памяти N bytes, ; Вход: B - число необходимых блоков ; Выход: L,A - КЛЮЧ RAM-Disk/код ошибки @@ -228,7 +228,7 @@ EMM.FreeMem: LD A,SYS_PAGE OUT (SLOT1),A - LD H,high (SYS_PAGE.RAMD_FAT - #4000 - #4000) + LD H,high (SYS_PAGE.RAMD_FAT - #4000 - #4000) ; !FIXIT SAFE_RGADR LD A,L EMM_F3M_L1: LD L,A @@ -345,6 +345,38 @@ EMM.GetMemPageNext: ; Вход: A - блок, HL - адрес буфера - 256 байт. ; Выход: HL - адрес блока, B - длина блока в страницах ОЗУ ;EMM_FN5M: +; EMM.GetMemBlkPages: +; PUSH DE +; PUSH HL +; EX DE,HL +; LD B,0 +; LD L,A + +; .loop: LD A,L +; LD (DE),A +; INC DE +; AND A +; JR Z,.error +; CP #FF +; JR Z,.end +; ; +; IN A,(SLOT1) +; LD C,A +; LD A,SYS_PAGE +; OUT (SLOT1),A +; LD H,high (SYS_PAGE.RAMD_FAT - #4000 - #4000) +; LD L,(HL) +; LD A,C +; OUT (SLOT1),A +; ; +; INC B +; JR NZ,.loop + +; .error: SCF +; .end: POP HL +; POP DE +; RET + EMM.GetMemBlkPages: PUSH DE PUSH HL @@ -352,7 +384,10 @@ EMM.GetMemBlkPages: LD B,0 LD L,A - LD A,R + IN A,(SLOT1) + LD C,A + LD A,SYS_PAGE + OUT (SLOT1),A .loop: LD A,L LD (DE),A @@ -362,34 +397,24 @@ EMM.GetMemBlkPages: CP #FF JR Z,.end ; - IN A,(SLOT1) - LD C,A - LD A,SYS_PAGE - OUT (SLOT1),A LD H,high (SYS_PAGE.RAMD_FAT - #4000 - #4000) LD L,(HL) - LD A,C - OUT (SLOT1),A - ; INC B JR NZ,.loop .error: SCF -.end: POP HL +.end: LD A,C + OUT (SLOT1),A + POP HL POP DE RET - -; .end: POP HL -; POP DE -; AND A -; RET ;----------------------------------------------------------------------; ; ; -;----------------------------------------------------------------------; +;----------------------------------------------------------------------; !FIXIT SAFE_RGADR ;RAMD_R_W: ; ╔════════════════════════════════════════════════╗ ; ║ RD/WR SECTOR ║\ @@ -493,7 +518,6 @@ BLK_RD_WR: BIT 7,H JR NZ,.BLK_PAGE1 ; !!!!! JR NZ,BLK_PAGE1 ? -.BLK_PAGE3: ; !TODO переделать на SLOT ????? LD C,SLOT3 IN C,(C) OUT (SLOT3),A @@ -852,7 +876,7 @@ GET_RAMD_ST: ; -;----------------------------------------------------------------------; +;----------------------------------------------------------------------; !FIXIT SAFE_RGADR ; RAM-Disk A, BLK - B BLK_TO_RAMD: CP SYS_PAGE.RAMD_KEYS.NUM @@ -896,7 +920,7 @@ BLK_BUSY: ; -;----------------------------------------------------------------------; +;----------------------------------------------------------------------; !FIXIT SAFE_RGADR ; RAM-Disk A RAMD_CLEAR: CP SYS_PAGE.RAMD_KEYS.NUM @@ -931,7 +955,7 @@ RAMD_CLEAR: ; -;----------------------------------------------------------------------; +;----------------------------------------------------------------------; !FIXIT SAFE_RGADR ; разделить блок памяти на два блока ; A - блок, B - длина первого блока после разделения ; выход: A - блок 1, B - блок 2 @@ -969,7 +993,7 @@ EMM.DivMemBlocks: ; -;----------------------------------------------------------------------; +;----------------------------------------------------------------------; !FIXIT SAFE_RGADR ; слить два блока памяти в один ; А - блок 1, B - блок 2 ; выход: А - блок diff --git a/src/bios/exp/FUNC_SERVICE.asm b/src/bios/exp/FUNC_SERVICE.asm index b710798..123add6 100644 --- a/src/bios/exp/FUNC_SERVICE.asm +++ b/src/bios/exp/FUNC_SERVICE.asm @@ -100,7 +100,7 @@ RST_CONF: .CHOOSE_CNF: ;!TEST CP PG_Sp2000 - LD DE,SP2000_ConfID + ;LD DE,SP2000_ConfID JR Z,.INIT_ACEX ; @@ -117,13 +117,109 @@ RST_CONF: SCF RET -.INIT_ACEX: +.INIT_ACEX: ;!FIXIT ;!TODO НЕДОДЕЛАНО!!!! + DI + ; устанавливаем нулевую карту портов + LD A,CNF_PORT.CNF_0 + OUT (SYS_PORT.ON),A + ; сохраняем воткнутые страницы в Spec_Page + IN A,(SLOT0) + LD E,A + IN A,(SLOT1) + LD D,A + IN A,(SLOT2) + LD L,A + IN A,(SLOT3) + LD H,A + LD A,Spec_Page + OUT (SLOT3),A + LD (Spec_Page.page_0),DE + LD (Spec_Page.page_2),HL + ; достаём адрес возврата в вызывающую функцию и сохраняем в Spec_Page + POP DE + LD HL,RST_18_1.exit + AND A + SBC HL,DE + JR NZ,1F ; NZ - если вызов был по RST #18 + POP DE ; если вызов был в ОЗУ по RST 8 +1: LD (Spec_Page.RET_addr),DE + ; проверяем размер блока с конфой и получаем страницы конфы + PUSH BC + LD HL,Spec_Page.bitstream_pages + LD A,B + CALL EMM.GetMemBlkPages + LD A,B + POP BC + LD B,A + JR C,.INIT_ACEX.ERROR + CP 4+1 ;!HARDCODE количество страниц в кэш для бистрима плюс одна + JR NC,.INIT_ACEX.ERROR + PUSH BC + ; закидываем в Spec_Page прогу для заливки конфы + LD HL,.INIT_ACEX.PROGRAM + LD DE,Spec_Page.init_acex + LD BC,.INIT_ACEX.PROGRAM.Size + LDIR + ; + POP BC + ; B = size of ram block in pages + CALL Spec_Page.init_acex + ; ; .. ... ... .. ;!TODO сделать функцию по заливке своей конфы, перехвату ресета. + ; *. Вход в подфункцию только через RST 08 или #18 + ; *. Сохранить все страницы пользователя в SYS_PAGE для перехвата ресета + ; *. Достать со стека адрес возврата и сохранить в SYS_PAGE для перехвата ресета + ; *. Сохранить куда-нибудь значение стека + ; * ; .. ... ... .. LD BC,256*BIOS.REINIT.HARD_RESET + BIOS.REINIT JP_to_BIOS +.INIT_ACEX.ERROR: + POP BC + LD A,(Spec_Page.page_2) + OUT (SLOT2),A + LD A,(Spec_Page.page_3) + OUT (SLOT3),A + SCF + RET +; +.INIT_ACEX.PROGRAM: + DISP Spec_Page.init_acex + ; B = size of ram block in pages + ; + IN A,(FastRAM.ON) + XOR A + EXX + LD HL,Spec_Page.bitstream_pages + LD BC,SLOT2 + EXX +.load_loop: + EXX + OUTI + EXX + PUSH BC + OUT (FastRAM.SLOT0),A + LD HL,0 + LD DE,#8000 + LD BC,#4000 + LDIR + ; + INC A + POP BC + DJNZ .load_loop + + ; ... .... + ; acex loading and flags + ; ... .... + XOR A + OUT (FastRAM.SLOT0),A + IN A,(FastRAM.OFF) + RET + ENT +.INIT_ACEX.PROGRAM.Size EQU $-.INIT_ACEX.PROGRAM +; ;*************************************** ;!TEST diff --git a/src/bios/shared/RECOVERY.IMG b/src/bios/shared/RECOVERY.IMG index 7e91f24..3b3e561 100755 Binary files a/src/bios/shared/RECOVERY.IMG and b/src/bios/shared/RECOVERY.IMG differ