From 36d209867ecc94d3b955e010361a5165bb644163 Mon Sep 17 00:00:00 2001 From: Tolik <85737314+Tolik-Trek@users.noreply.github.com> Date: Mon, 16 Sep 2024 01:48:46 +1000 Subject: [PATCH] ... --- Shared_Includes | 2 +- src/bios/exp/EXP.asm | 38 +-- src/bios/exp/FUNC_RAM_ROM_DRV.ASM | 88 +++---- src/bios/exp/FUNC_SERVICE.asm | 15 +- src/bios/exp/FUNC_SYS.ASM | 13 +- src/bios/exp/FUNC_ZX.ASM | 385 +++++++++++++++++++++++------- src/bios/rom/ZX/ZX_FUNC.ASM | 6 +- 7 files changed, 393 insertions(+), 154 deletions(-) diff --git a/Shared_Includes b/Shared_Includes index b1851fc..c3a5d38 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit b1851fc9f30652ff464f323a7f2873806bd51bfd +Subproject commit c3a5d38deff864c3b08dd129572a20428f9219f1 diff --git a/src/bios/exp/EXP.asm b/src/bios/exp/EXP.asm index 3382012..7df3407 100644 --- a/src/bios/exp/EXP.asm +++ b/src/bios/exp/EXP.asm @@ -632,7 +632,7 @@ POST_4_PAGES: LD I,A LD A,B OUT (SLOT3),A - LD A,0 + XOR A LD I,A IN A,(SLOT3) CP B @@ -664,7 +664,8 @@ POST_5_DATA_BUS: LD B,0 .loop: IN A,(0) CP #FF -; JR NZ,.error ;!!!!! посмотреть + ;JR NZ,.error ;!!!!! посмотреть + JR NZ,POST_5_ERROR DJNZ .loop JR POST_5_OK @@ -694,7 +695,7 @@ POST_5_DATA_BUS: POST_5_OK: LD A,(TABLE_X.v5) ;rdlow-ok OUT (Z84.PIO.Port_A.Data),A ; вывести "5" - +POST_5_ERROR: ; ********************************** ; POST завершен ENDMODULE @@ -705,14 +706,14 @@ POST_5_OK: 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 (SLOT0),A + ; [ ] 20/08/2024 ; [x] free zx pages! + ; LD A,5 ; OUT (SLOT1),A - ; LD A,2 ;!HARDCODE zx page number + ; LD A,2 ; OUT (SLOT2),A - OUT (SLOT2),A ;!HARDCODE zx page number - DEC A ; LD A,#FF ;!HARDCODE zx page number + OUT (SLOT2),A ; ZERO_PAGE + DEC A ; SHARED_PAGE OUT (SLOT1),A ; LD A,SYS_PAGE @@ -895,13 +896,20 @@ PrepareToZX: ;CALL init_zx_roms CP #10 JR C,.loop ; выход в режим zx spectrum - ;!TODO заменить на установку из рамблока ; [ ] free zx pages! - LD A,5 - OUT (SLOT1),A - LD A,2 - OUT (SLOT2),A +.start_zx: XOR A + IF FREE_ZX_PAGES + JP GOTO_SPEC + ELSE ; [x] free zx pages! + OUT (SLOT2),A ; ZERO_PAGE + DEC A + OUT (SLOT1),A ; SHARED_PAGE + ;LD A,5 + ;OUT (SLOT1),A + ;LD A,2 + ;OUT (SLOT2),A ; -.start_zx: JP GOTO_SPEC.ZX_MODE + JP GOTO_SPEC.ZX_MODE + ENDIF ;*********************************** ; Инициализация портов PORTS_INIT: diff --git a/src/bios/exp/FUNC_RAM_ROM_DRV.ASM b/src/bios/exp/FUNC_RAM_ROM_DRV.ASM index a14f567..4c19cc9 100644 --- a/src/bios/exp/FUNC_RAM_ROM_DRV.ASM +++ b/src/bios/exp/FUNC_RAM_ROM_DRV.ASM @@ -105,16 +105,16 @@ EMM.InitMem: PUSH BC ;---------------------------------------------------------------------[] RESERVED_PAGES: ; [x] Block #1 - можно освободить по ID 1 - DB 1,3,4,6,7,8,9,10,11,12,13,14,15 ; for Spectrum + DB 1,3,4,6,7,8,9,10,11,12,13,14,15 ; [ ] free zx pages! for Spectrum ;!FIXIT страницы 16..31 не зарезервированы, но используются в Pentagon 512 ; ; эмулятор ПЗУ ;!FIXIT ROM-Emulator сделать динамические страницы - DB #42,#43,#44,#45,#46,#47;,#48,#49,#4A,#4B ; For (BASIC128, BASIC48, TRDOS, SCORP_ROM)*2, vBIOS, vEXTENSION + DB #42,#43,#44,#45,#46,#47;,#48,#49,#4A,#4B ; [ ] free zx pages! For (BASIC128, BASIC48, TRDOS, SCORP_ROM)*2, vBIOS, vEXTENSION DB #FF ; End of the block ; ; ;; Block #2 - нельзя освобождать - DB 0,2,5 ; for Spectrum and BIOS starting + DB 0,2,5 ; [ ] free zx pages! ; for Spectrum and BIOS starting DB DCP_PAGE ; Ports map DB Spec_Page ; Page for Spectrum mode ; Screen pages @@ -279,11 +279,11 @@ EMM.FreeMemRMD: CALL GET_RAMD_ST ; Вход: A - НАЧАЛО ЦЕПОЧКИ ; НЕ ПОРТИТЬ DE!!! ;EMM_FN3M: -EMM.FreeMem: ; [ ] free zx pages! теперь нельзя освободить страницу #FF - SCF - INC A - RET Z - DEC A +EMM.FreeMem: ; [x] free zx pages! теперь нельзя освободить страницу #FF + SCF + INC A + RET Z + DEC A ;AND A ;SCF ; @@ -1085,76 +1085,76 @@ ROM_DISK: ; RET -.loop: PUSH DE ; номер сектора +.loop: PUSH DE ; номер сектора PUSH BC LD A,E - AND #3F ; ADRESS in ROM-Page - PUSH AF ; сохранить адрес + AND #3F ; ADRESS in ROM-Page + PUSH AF ; сохранить адрес - EX DE,HL ; DE - адрес буфера + EX DE,HL ; DE - адрес буфера ADD HL,HL - ADD HL,HL ; H - номер банки + ADD HL,HL ; H - номер банки LD A,(ROM_DISK.Pages.Number) INC H CP H LD L,H - LD H,high ROM_DISK.Pages.Number ; ROM-Disk pages! - LD A,(HL) ; PAGE-ROM + LD H,high ROM_DISK.Pages.Number ; ROM-Disk pages! + LD A,(HL) ; PAGE-ROM - POP HL ; восстановить адрес в ROM-Page - LD L,0 ; если далеко захотели - выход с ошибкой - JR C,.errorExit ; ROM-Disk-end + POP HL ; восстановить адрес в ROM-Page + LD L,0 ; если далеко захотели - выход с ошибкой + JR C,.errorExit ; ROM-Disk-end ; DE - буфер ; HL - адрес в ROM ; B - число секторов ; A - ROM-Page .loopRead: - PUSH HL ; откуда - PUSH DE ; куда + PUSH HL ; откуда + PUSH DE ; куда - LD HL,-.stackDepth-.readProcedure.size ; memory stack use! - ADD HL,SP ; stack + LD HL,-.stackDepth-.readProcedure.size ; memory stack use! + ADD HL,SP ; stack - PUSH HL ; адрес программы .readProcedure + PUSH HL ; адрес программы .readProcedure - LD DE,.readProcedure ; перенести программу на стек + LD DE,.readProcedure ; перенести программу на стек EX DE,HL LD BC,.readProcedure.size - LDIR ; программа на стеке - LD BC,#100 ; длина сектора - RET ; исполнить программу .readProcedure, на стеке адреса буфера и ROM + LDIR ; программа на стеке + LD BC,#100 ; длина сектора + RET ; исполнить программу .readProcedure, на стеке адреса буфера и ROM ; DE - next address ; HL - ROM address .readNext: - POP BC ; число секторов + POP BC ; число секторов - INC C ; счетчик считанных секторов - DEC B ; сектора кончились? + INC C ; счетчик считанных секторов + DEC B ; сектора кончились? JR Z,.normExit - BIT 6,H ; чтение не закончено + BIT 6,H ; чтение не закончено - PUSH BC ; сохранить счетчики - JR Z,.loopRead ; читать дальше + PUSH BC ; сохранить счетчики + JR Z,.loopRead ; читать дальше POP BC - POP HL ; номер сектора + POP HL ; номер сектора LD A,B LD B,0 ADD HL,BC - LD B,A ; вычислить след.сектор + LD B,A ; вычислить след.сектор - EX DE,HL ; теперь HL - адрес, DE сектор, B - сколько еще читать + EX DE,HL ; теперь HL - адрес, DE сектор, B - сколько еще читать - JP .loop ; начать все снова! + JP .loop ; начать все снова! ; чтение закончено .normExit: - POP HL ; сектор, откуда велось чтение - ADD HL,BC ; по возврату: HL - след.адрес - EX DE,HL ; DE - след.сектор + POP HL ; сектор, откуда велось чтение + ADD HL,BC ; по возврату: HL - след.адрес + EX DE,HL ; DE - след.сектор AND A RET ; ошибка @@ -1166,10 +1166,10 @@ ROM_DISK: ; процедура, переносимая на стек для чтения из ROM-Disk ; осторожнее с PUSH, если надо много, то увеличивай .stackDepth .readProcedure: - POP DE ; куда - POP HL ; откуда - OUT (ROM.SLOT0),A ; ROM_PAGE - LDIR ; здесь читается из ROM-Disk + POP DE ; куда + POP HL ; откуда + OUT (ROM.SLOT0),A ; ROM_PAGE + LDIR ; здесь читается из ROM-Disk LD B,A XOR A OUT (ROM.SLOT0),A diff --git a/src/bios/exp/FUNC_SERVICE.asm b/src/bios/exp/FUNC_SERVICE.asm index c2f83a2..b67bd69 100644 --- a/src/bios/exp/FUNC_SERVICE.asm +++ b/src/bios/exp/FUNC_SERVICE.asm @@ -399,11 +399,16 @@ REINIT: DEC B OUT (C),A OUT (RGADR),A OUT (RGMOD),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 + OUT (SLOT0),A + ; [ ] 16/09/24 free zx pages! + ;LD A,5 + ;OUT (SLOT1),A + ;LD A,2 + ;OUT (SLOT2),A + OUT (SLOT2),A + DEC A + OUT (SLOT1),A + ; LD A,DCP_PAGE OUT (SLOT3),A JP 0 ;Restart diff --git a/src/bios/exp/FUNC_SYS.ASM b/src/bios/exp/FUNC_SYS.ASM index bfb76b9..d098fdb 100644 --- a/src/bios/exp/FUNC_SYS.ASM +++ b/src/bios/exp/FUNC_SYS.ASM @@ -212,8 +212,6 @@ INIT_SYS_ALL: XOR A LD (SYS_PAGE.INT_ID - #4000),A ; - -;!TODO что за переменные? LD HL,SYS_PAGE.DISK_TYPE - #4000 LD (HL),DRIVE_CODES.TRDOS.FDD ; FDD A INC HL @@ -223,13 +221,13 @@ INIT_SYS_ALL: INC HL LD (HL),DRIVE_CODES.TRDOS.HDD INC HL - LD (HL),0 ; SYS_PAGE.COPY_SLOT0 + LD (HL),ZERO_PAGE ; [x] free zx pages! ; SYS_PAGE.COPY_SLOT0, было 0 INC HL - LD (HL),5 ; SYS_PAGE.COPY_SLOT1 + LD (HL),SHARED_PAGE; [x] free zx pages! ; SYS_PAGE.COPY_SLOT1, было 5 INC HL - LD (HL),2 ; SYS_PAGE.COPY_SLOT2 + LD (HL),ZERO_PAGE ; [x] free zx pages! ; SYS_PAGE.COPY_SLOT2, было 2 INC HL - LD (HL),0 ; SYS_PAGE.COPY_SLOT3 + LD (HL),ZERO_PAGE ; [x] free zx pages! ; SYS_PAGE.COPY_SLOT3, было 0 LD A,9 LD (SYS_PAGE.MSD_SECS - #4000),A @@ -252,6 +250,9 @@ INIT_SYS_ALL: XOR A LD (SYS_PAGE.CURRENT_RAM_DRV - #4000),A ; + ; [ ] free zx pages! + ;;; init task's + ; LD DE,ZG_ADDRESS ; адрес знакогенератора LD (SYS_PAGE.WIN_ZG - #4000),DE ; diff --git a/src/bios/exp/FUNC_ZX.ASM b/src/bios/exp/FUNC_ZX.ASM index 3a273c2..34c6481 100644 --- a/src/bios/exp/FUNC_ZX.ASM +++ b/src/bios/exp/FUNC_ZX.ASM @@ -54,12 +54,7 @@ ;если стэк находится в третьем слоте, то вызов с выключенными прерываниями FN_ENTRANCE: ;!TODO A - TASK NUMBER EXX - 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 ; данные новой задачи + CALL GET_ZX_TASK_DATA ; LD C,SLOT3 IN B,(C) @@ -102,6 +97,18 @@ FN_ENTRANCE: ;!TODO A - TASK NUMBER ;-----------------------------------------------------------------------; +;-----------------------------------------------------------------------; +;Вход: 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 +;-----------------------------------------------------------------------; + ;-----------------------------------------------------------------------; ;Вход: A - TASK NUMBER @@ -226,7 +233,7 @@ SET_7FFD: LD A,(HL) ;-----------------------------------------------------------------------; ;Выполняется для выделения трёх страниц ОЗУ 48k -GET_48k_MEM: LD D,3 +GET_48k_MEM: LD D,3+1 JR GET_XXX_MEM ;Выполняется для инита 3 страниц ОЗУ 48k и 29 страниц ОЗУ Pent512k GET_512k_MEM: LD D,3+29 @@ -313,6 +320,219 @@ GET_SCORP_RAM: CALL FREE_vRAM ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░; + + IF FREE_ZX_PAGES ;----------------------------------------------------[v] +;!TODO задействовать +; Вход: B = 0 - BASIC 128, 1 - BASIC 48, 2 - TR-DOS 128, +; 3 - EXPANSION. C закрытыми 128-ми портами: +; 4 - TR-DOS, 5 - BASIC 48 +; A = TASK +GOTO_SPEC: DI + PUSH AF + ; set shared pages + XOR A + OUT (SLOT2),A ; ZERO_PAGE + DEC A + OUT (SLOT1),A ; SHARED_PAGE + ; + LD A,SYS_PAGE + OUT (SLOT3),A + ; + LD A,B + LD (SYS_PAGE.CONFIG_DE.ZX_START),A + ; + POP AF + LD SP,#C000 + CALL GET_ZX_TASK_DATA + ; + ;!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 + ; установка инта + LD A,(IX + _#ZX_TASK_DATA.FN_SYNC) + AND %0000'0111 + CALL FN_SYNC + ; установка развёртки + LD A,(IX + _#ZX_TASK_DATA.FN_SYNC) + AND %1100'0000 + OR %0010'0000 + RLCA + RLCA + CALL FN_SYNC + ; + CALL SET_TXT_PALETTE.ZX ; [ ] free zx pages! пропускать это, чтоб задавать пользовательскую палитру + ; + LD E,0 + CALL LP_SET_32 + ; + 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 + + + + + + + + + +.TASK_0: XOR A ; задача 0, режим 256 килобайт +.START_TASK: LD IY,.BASIC_128 + JP INIT_PAGES ; инициализация номеров страниц режима спектрума + ; +;start_basic: +.BASIC_128: LD SP,#C000 + LD HL,RES128_PROG + LD DE,ZX_VARS.PRINTER_BUFFER ; запуск программы на BASIC-е. + LD BC,RES128_PROG.Size + LDIR + DI + JP ZX_VARS.PRINTER_BUFFER +;-----------------------------------------------------------------------; + + +;-----------------------------------------------------------------------; +;***************************************** +; +; Инициализация страниц для +; спектрумовского режима и +; восстановление спектрумовского +; экрана +; +; Возврат по IX +; +; !!! NO USE STACK !!! +; +;***************************************** +;!TODO стек установлен во второй странице, не использовать или устанавливать в другую! +; инициализация страниц zx spectrum +INIT_PAGES: + 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: + OUT (SLOT0),A + XOR 5 ; [ ] free zx pages! + OUT (SLOT1),A + XOR 7 ; [ ] free zx pages! + OUT (SLOT2),A + OR #0F ; [ ] free zx pages! + LD E,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) +;-----------------------------------------------------------------------; + ELSE ;--------------------------------------------------------------------[|] ;-----------------------------------------------------------------------; ;!TODO задействовать GOTO_SPEC: IN A,(SLOT3) @@ -320,7 +540,7 @@ GOTO_SPEC: IN A,(SLOT3) LD A,SYS_PAGE OUT (SLOT3),A LD A,B - LD (SYS_PAGE.CONFIG_DE+1),A + LD (SYS_PAGE.CONFIG_DE.ZX_START),A EX AF,AF' OUT (SLOT3),A @@ -329,7 +549,7 @@ GOTO_SPEC: IN A,(SLOT3) ;NO_SETUP_1: ;!TODO сделать активацию винта для параметра из Setup -.ZX_MODE: LD A,#FE ; !HARDCODE сделать через метку ACC-off Spectrum-MODE +.ZX_MODE: LD A,#FE ; !HARDCODE сделать через метку ACC-off Spectrum-MODE LD BC,Port_All_Mode OUT (C),A LD SP,#C000 @@ -369,73 +589,6 @@ GOTO_SPEC: IN A,(SLOT3) JP ZX_VARS.PRINTER_BUFFER ;-----------------------------------------------------------------------; -; -;>$< >$< >$< >$< >$< >$< [ ПЕРЕМЕЩАЕМАЯ В ОЗУ ] >$< >$< >$< >$< >$< >$< ; - -;--------[ Программа, размещаемая с #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+1),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 - ENT -.Size EQU $-RES128_PROG -;-----------------------------------------------------------------------; - ;-----------------------------------------------------------------------; ;***************************************** @@ -489,7 +642,7 @@ INIT_PAGES: SCORPION_256_MODE: LD D,16 - AND #30 ; до 4-х спектрумов + AND #30 ; до 4-х спектрумов ALL_MODE: OUT (SLOT0),A @@ -524,9 +677,9 @@ ALL_MODE: INIT_VIDEO_REG: XOR A - OUT (RGADR),A ; регистр видео адреса - OUT (RGMOD),A ; регистр моды -; OUT (RGSCR),A ; регистр экрана + OUT (RGADR),A ; регистр видео адреса + OUT (RGMOD),A ; регистр моды +; OUT (RGSCR),A ; регистр экрана ;!TEST ; Restore old Spectrum Screen @@ -541,7 +694,7 @@ INIT_VIDEO_REG: ; EX AF,AF' - ; LD A,7 ; седьмая экранная страница + ; LD A,7 ; седьмая экранная страница ; LD BC,#7FFD ; OUT (C),A @@ -561,6 +714,74 @@ NO_SCREEN_ALT: AND A JP (IX) ;-----------------------------------------------------------------------; + ENDIF ;--------------------------------------------------------------------[^] + +; +;>$< >$< >$< >$< >$< >$< [ ПЕРЕМЕЩАЕМАЯ В ОЗУ ] >$< >$< >$< >$< >$< >$< ; + +;--------[ Программа, размещаемая с #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 + ENT +.Size EQU $-RES128_PROG +;-----------------------------------------------------------------------; ;---------------------[ ЗАГЛУШКИ ДЛЯ #41 СТРАНИЦЫ]----------------------; @@ -581,7 +802,7 @@ PROG_NO_ROM: DISP Spec_Page.no_zx_rom DI ; - LD A,#FF + LD A,SHARED_PAGE OUT (SLOT3),A OUT (SLOT2),A OUT (SLOT1),A diff --git a/src/bios/rom/ZX/ZX_FUNC.ASM b/src/bios/rom/ZX/ZX_FUNC.ASM index 0188c74..47578c3 100644 --- a/src/bios/rom/ZX/ZX_FUNC.ASM +++ b/src/bios/rom/ZX/ZX_FUNC.ASM @@ -175,7 +175,11 @@ TASK_SWITCH: ; ; и пока пофиг распределение памяти! TASK_SET: - LD IX,TASK_RESTORE + IF FREE_ZX_PAGES + LD IY,TASK_RESTORE + ELSE + LD IX,TASK_RESTORE + ENDIF LD A,C EXX JP INIT_PAGES ; переключить все страницы!