; Вход через USR 15600 ASSERT $ = #C0, "Error with RET_FROM_BIOS_TO_BASIC48 address!!!" RET_FROM_BIOS_TO_BASIC48: CALL CH_2 CALL COMAND_LINE ; ВЫПОЛНЕНИЕ КОМАНДЫ, ЕСЛИ ЕСТЬ ; Вход без команды JP SW_ROM_1 ; ВОЗВРАТ В << MAIN MENU >> ;-----------------------------------------------------------------------; ; ; ;----------------------------[ ??????????? ]----------------------------; ; 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 ******* ;-----------------------------------------------------------------------; ;------[ ДЕШИФРАЦИЯ КОМАНДНОЙ СТРОКИ,ПЕРЕДАННОЙ ДЛЯ "EXPANSION" ]-------; COMAND_LINE: LD HL,(#5C5D) ;!HARDCODE CH_ADR COMAND_LOOP: LD A,(HL) INC HL CP ":" JR Z,COMAND_L1 CP #0D JR NZ,COMAND_LOOP RET COMAND_L1: LD A,(HL) CP #EA ;!HARDCODE RET NZ INC HL COMAND_OK: ; ОБНАРУЖЕНА КОМАНДА ДЛЯ 'expansion' LD A,(HL) INC HL CP ':' JP Z,MENU_S1 CP #0D JP Z,MENU_S1 CP 'I' JR Z,COMAND_ISD CP 'i' JR Z,COMAND_ISD CP 'T' JR Z,TASK_SWITCH CP 't' JR Z,TASK_SWITCH DEC HL POP BC JP BASIC_MENU MENU_S1: POP BC CALL SERVICE JP SW_ROM_1 COMAND_ISD: LD A,(HL) INC HL CP 'S' JP Z,COMAND_ISD2 CP 's' JP Z,COMAND_ISD2 RET COMAND_ISD2: POP BC CALL ISDOS JP SW_ROM_1 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) RLCA RLCA RLCA RLCA AND 30H ; новая задача 0..3 LD C,A IN A,(SLOT3) LD B,A ; 3-я страница текущей задачи LD A,SYS_PAGE OUT (SLOT3),A LD IX,SYS_PAGE.TASK_DATA ; данные задач LD E,(IX) ; старая задача LD D,0 ADD IX,DE ; данные текущей задачи LD E,16 ADD IX,DE ; смещение данных в таблице задач LD (IX+1),B ; сохранить страницу 3 LD HL,0 ADD HL,SP LD (IX+2),L ; сохранить стек задачи LD (IX+3),H SET 0,(IX) ; установить флаг сохраненности текущей задачи RES 1,(IX) ; установить флаг, что задача покинута LD IX,SYS_PAGE.TASK_DATA LD E,C LD D,0 ADD IX,DE ; новая задача LD E,16 ADD IX,DE ; смещение данных в таблице задач BIT 1,(IX) ; JR NZ,TASK_IN_WORK ; задача в работе ??? неверное завершение ; сбрасывать или просто возвращаться BIT 0,(IX) ; была сохранена/нет JR NZ,TASK_SET ; задача существует ; задачи не было! LD IX,SYS_PAGE.TASK_DATA LD A,C ; задача LD (IX),A ; установить новую задачу текущей JP SPECTRUM_TASK ; запустить новую задачу! ; и пока пофиг распределение памяти! TASK_SET: LD IX,TASK_RESTORE LD A,C EXX JP INIT_PAGES ; переключить все страницы! TASK_RESTORE: EXX LD A,SYS_PAGE OUT (SLOT3),A LD A,C LD IX,SYS_PAGE.TASK_DATA LD (IX),A ; установить новую задачу текущей LD E,A LD D,0 ADD IX,DE ; новая задача LD E,16 ADD IX,DE LD L,(IX+2) ; вспомнить стек LD H,(IX+3) LD SP,HL LD A,(IX+1) ; вспомнить третью страницу 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 ;-----------------------------------------------------------------------; ;-----------------------------------------------------------------------; ; *** 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 ;