; ;----------------------------[ ??????????? ]----------------------------; ; TURBO_OFF: ; LD A,D_TBOFF ; OUT (SYS_PORT.ON),A ; RET ; ; TURBO_ON: ; LD A,D_TBON ; OUT (SYS_PORT.ON),A ; RET ; ; JP_HL: JP (HL) ; ;PRINT_LINE: ; LD A,(HL) ; INC HL ; CP 0FFh ; RET Z ; RST 10H ; JR PRINT_LINE ; ; JP RESET_128 ;-----------------------------------------------------------------------; ; ;-----------------------------------------------------------------------; ; ******* SERVICE ******* ;-----------------------------------------------------------------------; ; коэффициент смещения по номеру таски ; MACRO GET_ZX_TASK_DATA_OFFSET ; RLCA ; RLCA ; RLCA ; RLCA ; AND #30 ; новая задача 0..3 ; ENDM ;------[ ДЕШИФРАЦИЯ КОМАНДНОЙ СТРОКИ,ПЕРЕДАННОЙ ДЛЯ "EXPANSION" ]-------; COMAND_LINE: LD HL,(#5C5D) ;!HARDCODE CH_ADR COMAND_LOOP: LD A,(HL) INC HL CP ":" JR Z,COMAND_L1 CP ZX_Char.carriage_return JR NZ,COMAND_LOOP RET COMAND_L1: LD A,(HL) CP ZX_Token.rem RET NZ INC HL COMAND_OK: ; ОБНАРУЖЕНА КОМАНДА ДЛЯ 'expansion' LD A,(HL) INC HL CP ':' JP Z,MENU_S1 CP ZX_Char.carriage_return JP Z,MENU_S1 ; AND %1101'1111 CP 'I' JR Z,COMMAND_HARDWARE_MENU ;CP 'T' ;JR Z,TASK_SWITCH DEC HL POP BC JP BASIC_MENU MENU_S1: POP BC CALL SERVICE JP SW_ROM_1 COMMAND_HARDWARE_MENU: LD A,(HL) INC HL AND %1101'1111 CP 'S' RET NZ ; POP BC CALL Hardware_Menu JP SW_ROM_1 ;-----------------------------------------------------------------------; ;-----------------------------------------------------------------------; ; *** UTILITES *** ;-----------------------------------------------------------------------; ; C_0030: ; получить раб обл ; CALL_48X 0030h ; RET C_19E8: ; очистить раб обл CALL_48X #19E8 ;!HARDCODE RET C_1655: ; получить пространство CALL_48X #1655 ;!HARDCODE RET CLS: C_0D6B: CALL_48 #0D6B ;!HARDCODE RET CH_2: LD A,2 C_1601: ; OPEN CHANEL CALL_48 #1601 ;!HARDCODE RET ;-----------------------------------------------------------------------; ;-----------------------------------------------------------------------; ; MANAGE_ZX_PAGES ;-----------------------------------------------------------------------; ;-------------------------------------------------------------------------------------------------------------------; ;Выбор в Setup, что грузить в vПЗУ при старте. Варианты: ;[x] 0 - Не грузить ПЗУ спектрума, инитить страницу #41 как в 3.04 ;[x] 1 - Грузит ПЗУ спектрума из ROM при старте если нет флага ZX ;[x] 2 - Грузит ПЗУ спектрума из ROM при каждом перезапуске (может быть опасно) ;-------------------------------------------------------------------------------------------------------------------; ; для входа в режим спектрума: ; 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_ ; ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░; ; [ ] free zx pages! ; ????? SYS_PAGE.SHARED_BUFFER_256b ; ; [ ] Страница ОЗУ для скорпа в SLOT0 должна совпадать с нулевой страницей порта #7FFD MODULE MANAGE_ZX_PAGES ;-----------------------------------------------------------------------; ; Не портить 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 ;-----------------------------------------------------------------------; ;-----------------------------------------------------------------------; ;ВХОД: HL - список страниц ; E - 0 = 128kb, 1 = 512kb INIT_vRAM: XOR A .set_1ffd: LD BC,#1FFD OUT (C),A ; set 128 LD B,#7F LD D,%0000'0000 CALL SET_7FFD ; XOR A OUT (C),A BIT 0,E ; 128/512 RET Z ; set 128 + 384 LD A,SYS_PORT.CNF_512 + SYS_PORT.CNF_0 + SYS_PORT.TURBO.ON OUT (SYS_PORT.ROM),A ; LD D,%0100'0000 CALL SET_7FFD LD D,%1000'0000 CALL SET_7FFD LD D,%1100'0000 CALL SET_7FFD ; XOR A OUT (C),A RET ;-----------------------------------------------------------------------; ;-----------------------------------------------------------------------; ;ВХОД: HL - список страниц ; D - начальное значение для 7FFD SET_7FFD: LD A,(HL) OUT (C),D OUT (SLOT3),A INC HL INC D BIT 3,D ; количество страниц JR Z,SET_7FFD RET ;-----------------------------------------------------------------------; ;-----------------------------------------------------------------------; ;Вход: HL - буфер страниц (SLOT1..SLOT2) на которые маппим (всегда 11 шт.) ; Первый байт списка - RAM BLOCK ID. Далее как угодно номера ; страниц для каждого типа страницы vROM. Если какая-то страница ; vROM не используется, то ставится #FF INIT_vROM: LD A,(HL) OR A SCF RET Z INC A JR NZ,.free_pages LD (HL),A JR .set_vROM ; .free_pages: LD A,(SYS_PAGE.Block_ID.vROM) CP (HL) EX DE,HL LD C,BIOS.FreeMem CALL NZ,ToBIOS_FromEXT EX DE,HL ; LD A,(HL) .set_vROM: LD (SYS_PAGE.Block_ID.vROM),A ; установка портов ROM LD DE,.PORTS LD B,.PORTS.Size .loop: PUSH BC INC HL LD A,(HL) CP #FF JR NZ,.not_Spec_Page LD A,Spec_Page .not_Spec_Page: LD B,A LD A,(DE) INC DE PUSH DE PUSH HL LD C,BIOS.SET_PORTS CALL ToBIOS_FromEXT ;CALL SET_PORTS POP HL POP DE POP BC DJNZ .loop ; установка метки ZX если рамблок не 0 LD A,(SYS_PAGE.Block_ID.vROM) OR 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.ZX_EXPANSION ; ROM-ID - EXPANSION DB ACEX.vROM.ZX_BIOS_1 ; ROM-ID - BIOS-1 DB ACEX.vROM.ZX_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.ZX_EXPANSION_2; BIOS (ZX_EXP) - 2 .PORTS.Size EQU $-.PORTS ;-----------------------------------------------------------------------; ;!FIXIT ;----------------[Выделение/освобождение страниц спектрума]-------------; ;вход: рег B: ; FN 0x ; 0 - зарезервировано ; 1 - выделение памяти Pentagon 48k. 3 страницы ; 2 - выделение памяти Pentagon 128k. 2+6 страницы ; 3 - выделение памяти Pentagon 512k. 2+30 страницы ; 4 - выделение памяти Scorpion 256k. 2+6+8 страницы ; 5..15 - зарезервированы ; FN 1x ; 16 - получить рамблоки инициализированных vROM и VRAM ; 17..31 - зарезервированы ; FN 2x ;!TODO ; 32 - зарезервировано ; 33 - выделение памяти Spectrum 48k и инит 1-й страниц vROM ; 34 - выделение памяти Pentagon 128k и инит 3-х страниц vROM ; 35 - выделение памяти Pentagon 512k и инит 3-х страниц vROM ; 36 - выделение памяти Scorpion 256k и инит 3-х страниц vROM ; 33..63 - зарезервированы ; FN 4x ; 64 - освободить рамблоки vROM и vRAM ; 65 - освободить рамблок vRAM ; 66 - освободить рамблок vROM ; 65..127 - зарезервированы ; FN 8x ; 128 - инициализировать свой набор страниц vROM ; ; рег HL: при рег B[7]=1 адрес страниц (11 шт): ; byte1 - RAM block ID, byte2..11 - страницы для vROM - ZXSlot: 1,2,3(=0),расширенная ;выход: CF = 0: HL - номера рамблоков для режимов 0..16. H=vRAM, L=vROM ; CF = 1: A - номер ошибки ; ;если стэк находится в третьем слоте, то вызов с выключенными прерываниями FN_ENTRANCE: ;!TODO A - TASK NUMBER AND A ; LD A,BIOS.Error.NotSupported ; SCF ; RET NZ ; CCF ; EXX LD C,SLOT3 IN B,(C) LD A,SYS_PAGE OUT (C),A EXX ; LD (SYS_PAGE.SP_SAVE),SP LD SP,SYS_PAGE.SYS_SP LD DE,.EXIT PUSH DE ;-----------------------------------; ; Sub FN #8x .API: BIT 7,B JR NZ,INIT_vROM ; B = 128 ; Sub FN #4x BIT 6,B JR NZ,FREE_vMEMORY ; B = 64..127 ; Sub FN #2x ;!TODO ; [ ] free zx pages! ;BIT 5,B ;JR NZ, ; B = 32..63 ; Sub FN #1x BIT 4,B JR Z,.x0x_FN ; B = 16 ; .GET_RAMBLOCK_IDs: ;Вход: A - TASK NUMBER. Выход: H - vRAM block ID, L - vROM block ID LD HL,(SYS_PAGE.Block_IDs) RET ; ; Sub FN #0x .x0x_FN: DEC B JR Z,GET_48k_MEM ; B = 1 DEC B JR Z,GET_128k_MEM ; B = 2 DEC B JR Z,GET_512k_MEM ; B = 3 DEC B JR Z,GET_SCORP_RAM ; B = 4 ;-----------------------------------; LD A,BIOS.Error.InvalidSubFunction SCF RET ; .EXIT: LD SP,(SYS_PAGE.SP_SAVE) EXX OUT (C),B EXX RET ;-----------------------------------------------------------------------; ;-----------------------------------------------------------------------; FREE_vMEMORY: LD A,B AND 3 JR Z,FREE_ALL_vMEMORY ; 0 DEC A JR Z,FREE_vRAM ; 1 DEC A JR Z,FREE_vROM ; 2 LD A,BIOS.Error.InvalidSubFunction SCF RET ;--------------; FREE_vRAM: LD A,(SYS_PAGE.Block_ID.vRAM) OR A RET Z LD C,BIOS.FreeMem CALL ToBIOS_FromEXT LD A,0 LD (SYS_PAGE.Block_ID.vRAM),A RET ;--------------; FREE_ALL_vMEMORY: CALL FREE_vRAM ;--------------; FREE_vROM: LD A,(SYS_PAGE.Block_ID.vROM) OR A RET Z LD C,BIOS.FreeMem CALL ToBIOS_FromEXT PUSH AF XOR A LD (SYS_PAGE.Block_ID.vROM),A ;--------------; RES_FLAG_ZXvROM: ; не должно портить DE EX AF,AF' IN A,(SLOT3) EX AF,AF' LD A,Spec_Page OUT (SLOT3),A XOR A LD (Spec_Page.flag_Z),A LD (Spec_Page.flag_X),A EX AF,AF' OUT (SLOT3),A POP AF RET ;-----------------------------------------------------------------------; ;-----------------------------------------------------------------------; ;Выполняется для выделения трёх страниц ОЗУ 48k GET_48k_MEM: LD D,BIOS.ZX_MEMORY_MANAGER.MODE_48k JR GET_XXX_MEM ;Выполняется для инита 3 страниц ОЗУ 48k и 29 страниц ОЗУ Pent512k GET_512k_MEM: LD D,BIOS.ZX_MEMORY_MANAGER.MODE_512k JR GET_XXX_MEM ;Выполняется для выделения 3 страниц ОЗУ 48k и 5 страниц ОЗУ 128k тачек GET_128k_MEM: LD D,BIOS.ZX_MEMORY_MANAGER.MODE_128k ;JR GET_XXX_MEM GET_XXX_MEM: CALL FREE_vRAM .init: LD B,D LD C,BIOS.GetMem CALL ToBIOS_FromEXT RET C LD (SYS_PAGE.Block_ID.vRAM),A RET ;-----------------------------------------------------------------------; ;-----------------------------------------------------------------------; ;Выполняется для выделения 3 страниц ОЗУ 48k и 14 страниц ОЗУ Scorp256k ;Вход: --- ;Выход: A - RAM block ID GET_SCORP_RAM: CALL FREE_vRAM ; выделить страницы скорпа XOR A LD DE,#F0D0 ; для фильтра. #F0 - маска, #D0 - страницы ISA #D0..#DF LD BC,256*BIOS.ZX_MEMORY_MANAGER.MODE_256k/2 + #FF ; B - количество страниц, C - Метка конца рамблока LD HL,SYS_PAGE.RAM_TABLE .allocate_loop: DEC L JR Z,.error_no_mem CP (HL) JR NZ,.allocate_loop ; CALL .check_barred_pages LD A,0 JR Z,.allocate_loop ; LD (HL),C LD C,L DJNZ .allocate_loop ; L = указатель цепочки. AND A LD D,L ; Get Pent128 mem LD BC,256*BIOS.ZX_MEMORY_MANAGER.MODE_128k + BIOS.GetMem CALL ToBIOS_FromEXT ;CALL EMM.GetMem ; A - Pent128 mem block id LD B,D ; Scorp128 mem block id LD C,BIOS.MergeMemBlocks CALL ToBIOS_FromEXT ;CALL EMM.MergeMemBlocks LD (SYS_PAGE.Block_ID.vRAM),A RET ; ; фильтр для страниц скорпа ;выход: ZF=1 - страница не подходит .check_barred_pages: ; check reset page LD A,L CP RESET_PAGE RET C RET Z ; check isa page AND D XOR E ; страницы ISA #D0..#DF RET NZ LD L,E RET ; .error_no_mem: LD A,C LD C,BIOS.FreeMem CALL ToBIOS_FromEXT ;CALL EMM.FreeMem LD A,BIOS.Error.EMM.NoMemory SCF RET ;-----------------------------------------------------------------------; ENDMODULE ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░; ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░; ; [ ] free zx pages! ; Вход: 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 ; L: Block_ID.vROM ; H: Block_ID.vRAM ; 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_SPECTRUM: DI LD C,A ; ; 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 (SYS_PAGE.CONFIG_DE),DE LD (SYS_PAGE.Block_IDs),HL ;!FIXIT освободить старые значения? ; [ ] free zx pages! ; LD A,C AND %0000'0011 LD SP,#C000 ;!TODO сделать активацию винта для параметра из Setup ; установка инта EXX LD C,BIOS.FN_SYNC CALL ToBIOS_FromEXT EXX ; установка развёртки LD A,C EXX RLCA AND %0000'0001 OR %1000'0110 LD C,BIOS.FN_SYNC CALL ToBIOS_FromEXT EXX ; LD A,C PUSH BC EXX AND %0000'0100 ;!TODO запомнить/восстановить кастомную палитру? LD BC,BIOS.SET_PAL_INIT.ZX CALL Z,ToBIOS_FromEXT ; ; [x] фикс неполной дешифрации порта #FFFD (пишут в #C0FD) для ZX mode LD A,#FF LD HL,%00'010'1'1110'1101 LD DE,%10'111'1'1111'1111 ; CNF_0, CNF_1 LD BC,ACEX.AY_FFFD_WRITE*256 + BIOS.DCP_CONFIG CALL ToBIOS_FromEXT ; LD E,0 LD BC,BIOS.LP_OPEN_S.ZX_32x24_Default CALL ToBIOS_FromEXT ; LD E,0 LD HL,#5104 LD BC,BIOS.LP_OPEN_S.ZX_32x24 CALL ToBIOS_FromEXT ; LD BC,BIOS.SWAP_RAM_DRIVES.ZX CALL ToBIOS_FromEXT ; LD A,(SYS_PAGE.Block_ID.vRAM) LD HL,SYS_PAGE.SHARED_BUFFER_256b LD C,BIOS.GetMemBlkPages CALL ToBIOS_FromEXT ;!FIXIT ;RET C ; !FIXIT проверка размера блока, сделать, чтоб выбирался объём памяти ;LD A,B ;CP 16 ; LD D,B EXX POP BC EXX ;.TASK_0: задача 0, режим 256 килобайт .START_TASK: XOR A OUT (RGADR),A ; регистр видео адреса OUT (RGMOD),A ; регистр моды ; LD IY,.BASIC_128 JR 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 JP ZX_VARS.PRINTER_BUFFER ;-----------------------------------------------------------------------; ;-----------------------------------------------------------------------; ;***************************************** ; ; Инициализация страниц для ; спектрумовского режима и ; восстановление спектрумовского ; экрана ; ; Возврат по IY ; ; !!! NO USE STACK !!! ; ;***************************************** ;!TODO стек установлен во второй странице, не использовать или устанавливать в другую! ; инициализация страниц zx spectrum ; HL - адрес блока страниц в SYS_PAGE SLOT3 ; D - количество этих страниц INIT_PAGES: LD A,SYS_PAGE OUT (SLOT1),A ; [ ] free zx pages! переделать инит. если 512, то нет 1ffd и наоборот 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 BIOS.ZX_MEMORY_MANAGER.MODE_48k JR Z,.set_48k ; LD E,0 ; pent128 CP BIOS.ZX_MEMORY_MANAGER.MODE_256k JR Z,.set_scorp ; CP BIOS.ZX_MEMORY_MANAGER.MODE_128k JR Z,.set_pent INC E CP BIOS.ZX_MEMORY_MANAGER.MODE_512k JR Z,.set_pent ;!FIXIT обработка ошибки DI .error_loop: LD A,R AND 7 OUT (BorderColor),A JR .error_loop ; .set_48k: LD A,5 ; !HARDCODE CONFIG_DE.ZX_START ВХОД В BASIC 48 с закрытыми 128-ми портами LD (SYS_PAGE.CONFIG_DE.ZX_START - #8000),A LD A,(HL) ; SLOT0, SLOT3 page INC HL LD E,(HL) ; SLOT1 page INC HL LD D,(HL) ; SLOT2 page JR .set_slots ; .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 INC A ; reset ZF ; .set_pent: CALL Z,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 ; .set_slots: OUT (SLOT0),A OUT (SLOT3),A LD A,E OUT (SLOT1),A LD A,D OUT (SLOT2),A ; JP (IY) ;-----------------------------------------------------------------------; ; ;>$< >$< >$< >$< >$< >$< [ ПЕРЕМЕЩАЕМАЯ В ОЗУ ] >$< >$< >$< >$< >$< >$< ; ;--------[ Программа, размещаемая с #5B00 для запуска Spectrum ]--------; RES128_PROG: 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 ; 7FFD 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 ;-----------------------------------------------------------------------; ;>$< >$< >$< >$< >$< >$< >$< >$< >$< >$< >$< >$< >$< >$< >$< >$< >$< >$<; ; ; _ZX_ _ZX_ _ZX_ _ZX_ _ZX_ _ZX_ _ZX_ _ZX_ _ZX_ _ZX_ _ZX_ _ZX_ _ZX_ _ZX_ ; /* ;!TODO переделать под переключение на разные спектрумы с запущенными задачами TASK_SWITCH: ; *** Сохранить задачу *** PUSH IY PUSH IX PUSH AF PUSH BC PUSH DE PUSH HL EXX EX AF,AF' PUSH AF PUSH BC PUSH DE PUSH HL LD A,R PUSH AF LD A,I PUSH AF LD A,(HL) GET_ZX_TASK_DATA_OFFSET LD C,A IN A,(SLOT3) LD B,A ; 3-я страница текущей задачи LD A,SYS_PAGE OUT (SLOT3),A LD IX,SYS_PAGE.ZX_TASK.CURRENT ; данные задач LD A,_ZX_TASK_DATA ; смещение данных в таблице задач ADD A,(IX) ; смещение данных текущей задачи LD E,A LD D,0 ADD IX,DE ; данные текущей задачи LD (IX + _ZX_TASK_DATA.SLOT3_PAGE),B ; сохранить страницу 3 LD HL,0 ADD HL,SP LD (IX + _ZX_TASK_DATA.SP),L ; сохранить стек задачи LD (IX + _ZX_TASK_DATA.SP + 1),H SET 0,(IX + _ZX_TASK_DATA.STATE) ; установить флаг сохраненности текущей задачи RES 1,(IX + _ZX_TASK_DATA.STATE) ; установить флаг, что задача покинута LD IX,SYS_PAGE.ZX_TASK.CURRENT LD A,_ZX_TASK_DATA ; смещение данных в таблице задач ADD A,C ; смещение данных новой задачи LD E,A LD D,0 ADD IX,DE ; данные новой задачи ; BIT 1,(IX + _ZX_TASK_DATA.STATE) ; JR NZ,TASK_IN_WORK ; задача в работе ??? неверное завершение ; ; сбрасывать или просто возвращаться BIT 0,(IX + _ZX_TASK_DATA.STATE) ; была сохранена/нет JR NZ,TASK_SET ; задача существует ; задачи не было! LD IX,SYS_PAGE.ZX_TASK.CURRENT LD A,C ; задача LD (IX),A ; установить новую задачу текущей JP GOTO_SPEC.START_TASK ; запустить новую задачу! ; ; и пока пофиг распределение памяти! TASK_SET: IF FREE_ZX_PAGES LD IY,TASK_RESTORE ELSE LD IX,TASK_RESTORE ENDIF LD A,C EXX JP INIT_PAGES ; переключить все страницы! TASK_RESTORE: EXX LD A,SYS_PAGE OUT (SLOT3),A LD A,C LD IX,SYS_PAGE.ZX_TASK.CURRENT LD (IX),A ; установить новую задачу текущей ; !TEST ;LD E,A ;LD D,0 ;ADD IX,DE ; новая задача ;LD E,16 ADD A,_ZX_TASK_DATA ; смещение данных в таблице задач LD E,A LD D,0 ; ADD IX,DE LD L,(IX + _ZX_TASK_DATA.SP) ; вспомнить стек LD H,(IX + _ZX_TASK_DATA.SP + 1) LD SP,HL LD A,(IX + _ZX_TASK_DATA.SLOT3_PAGE); вспомнить третью страницу OUT (SLOT3),A POP AF ; восстановить LD I,A POP AF LD R,A POP HL POP DE POP BC POP AF EX AF,AF' EXX POP HL POP DE POP BC POP AF POP IX POP IY ; вернуться в задачу NO_TASK: POP BC JP SW_ROM_1 */ ; 259F - ADRESS BASIC128 - MAIN_MENU