; "MENU PROGRAMS." ;********************************* ; FOR INCLUDE !!! ;********************************* ; Обслуживание МЕНЮ ; HL - адрес таблицы программ ; A - номер в таблице ; если A=-1, то возврат, ; иначе выполнение ;***************************** EXEC_PNT: INC A RET Z EXEC_PNT_LOOP: DEC A JR Z,EXEC_HL INC HL INC HL JR EXEC_PNT_LOOP EXEC_HL: LD E,(HL) INC HL LD D,(HL) INC HL EX DE,HL JP (HL) RET_FROM_M: POP HL RET ;**************************************** ; РАБОТА С MENU_128 ;**************************************** ; ВХОД: - DE - адрес меню ; BC - длина меню ; ВЫХОД: A - выбранный пункт ;**************************************** RUN_MENU: PUSH IX PUSH DE ; DE - MENU PUSH BC ; BC - len_menu LD A,(DE) DEC A ; число CMD CP 9 JR C,RUN_M_1 RUN_MN_ERR: POP BC POP DE LD A,0FFh ; вернуться с номером 255 - ошибка POP IX RET RUN_M_1: LD A,(5B00H) CP #F5 ; СРАВНИТЬ А С КОДОМ PUSH AF JR NZ,RUN_MN_ERR LD HL,LEN_P_M ADD HL,BC ; HL - нужная длина памяти LD B,H ; HL -> BC LD C,L LD HL,(5C61h) ; HL - начало раб обл PUSH BC PUSH HL CALL C_1655 ; получить рабочую память POP DE PUSH DE ; начало раб обл LD BC,LEN_P_M ; длина программы меню LD HL,MENU_128 ; сама программа LDIR ; программа перемещена. DE - место для MENU POP BC PUSH BC ; начало программы PUSH DE ; сохранить место для MENU LD DE,MN_128_S ; данные для shifter CALL SHIFTER ; изменить данные в соответствии с положением в MEM POP DE ; вернуть место для MENU POP HL ; начало программы POP IX ; длина данных POP BC ; длина меню EX (SP),HL ; HL - меню LDIR ; переместить данные MENU POP HL ; адрес программы MENU PUSH HL PUSH IX ; длина раб. обл CALL JP_HL ; вызов программы MENU POP BC ; вернуть длину раб обл POP HL ; и начала программы PUSH AF ; сохранить номер выбора CALL C_19E8 ; освободить память !! POP AF ; вернуть номер выбора POP IX RET ; возврат из программы RUN_MENU ;************************************** ; 128k MENU ;************************************** MENU_PROG EQU 25B9h SWAP_ROM EQU 5B00h NEW_SP EQU 1F45h RET_SP EQU 1F20h ;************************************** ; Программа вызова MENU_128 из ОЗУ. ;************************************** MN_128_S: DB SH_1-MENU_128+1 DB SH_2-MENU_128+1 DB SH_3-MENU_128+1 DB SH_4-MENU_128+1 DB SH_5-MENU_128 DB SH_6-MENU_128 DB SH_7-MENU_128 DB SH_8-MENU_128 DB SH_9-MENU_128 DB SH_A-MENU_128 DB SH_B-MENU_128 DB SH_C-MENU_128 DB 0 ;************************************** ; Эта программа перемещается в озу ;************************************** MENU_128: LD A,0 OUT (SYS_PORT_OFF),A CALL SWAP_ROM CALL NEW_SP SH_1: LD DE,MENU_DAT-MENU_128 LD HL,0F6EAh LD BC,4 LDIR SH_2: LD HL,MENU_128_E-MENU_128 LD (0F6EAh),HL SH_3: LD HL,MENU_128_E2-MENU_128 LD (0F6ECh),HL JP MENU_PROG RET_M EQU $-MENU_128 SH_4: LD HL,MENU_DAT-MENU_128 LD DE,0F6EAh LD BC,4 LDIR CALL RET_SP CALL SWAP_ROM EX AF,AF' LD A,0 OUT (CNF_PORT),A EX AF,AF' RET MENU_DAT: DW 0,0 MENU_128_E: DB 8 DB 0 SH_5: DW RET_M DB 1 SH_6: DW RET_M DB 2 SH_7: DW RET_M DB 3 SH_8: DW RET_M DB 4 SH_9: DW RET_M DB 5 SH_A: DW RET_M DB 6 SH_B: DW RET_M DB 7 SH_C: DW RET_M MENU_128_E2: LEN_P_M EQU $-MENU_128 ;************************************** ; RST 30 - получение BC SPACES с адреса HL ; 19E8h - освобождение BC spaces с адреса HL ; HL - раб. ячейка ; BC - адрес программы ; DE - адрес данных для перемещения SHIFTER: LD A,(DE) ; (DE) - SHIFT IN PROG AND A RET Z INC DE LD L,A LD H,0 ADD HL,BC ; HL - ADRESS FOR SHIFT LD A,(HL) ; (HL)=(HL)+BC ADD A,C LD (HL),A INC HL LD A,(HL) ADC A,B LD (HL),A JR SHIFTER ;******************************************* ; МЕНЮ : байт 1 - для результата ; байт 2 - число пунктов +1 ; название меню, код 0FFh ( COPY ) ; пункты меню окончание байтом с ; уст, 7-м битом + пустая строка !! ;******************************************* BASIC_MENU: ; LD A,(HL) ; CP 'S' ; JP Z,SET_SYSTEM LD DE,(CH_ADR) PUSH DE LD (CH_ADR),HL CALL_48X 1C8Ch ; SYMBOL VAR CALL_48X 2BF1h ; input txt !!! ; DE - adr ; BC - len PUSH DE PUSH BC INC DE CALL TST_M JR C,NO_EXE_M CALL RUN_MENU LD (IY+0),255 NO_EXE_M: POP BC POP DE LD (DE),A POP HL LD (CH_ADR),HL JP SW_ROM TST_M: PUSH DE PUSH BC EX DE,HL LD D,(HL) INC D LD A,255 CPIR JR NZ,ERR_TST_M LOOP_TST_M: LD A,B OR C JR Z,ERR_TST_M BIT 7,(HL) INC HL DEC BC JR Z,LOOP_TST_M DEC D JR NZ,LOOP_TST_M POP BC POP DE AND A RET ERR_TST_M: POP BC POP DE LD A,255 SCF RET ;************************************** CALL_DOS_MOVE: LD DE,DOS_PROG.Exec LD HL,DOS_PROG LD BC,DOS_PROG.Size LDIR RET ; ; HL - адрес команды, BC - длина команды CALL_DOS1: LD C,(HL) INC HL LD B,0 LD DE,(5C59H) LD (5C5DH),DE LDIR LD (5C61H),DE LD (5C63H),DE LD (5C65H),DE CALL CALL_DOS_MOVE JP DOS_PROG.Exec CALL_DOS: PUSH HL PUSH DE PUSH BC PUSH AF CALL CALL_DOS_MOVE LD A,#13 ; #13 из AUTO_1303 LD (DOS_PROG.Patch),A POP AF POP BC POP DE POP HL JP DOS_PROG.Exec DOS_PROG: DISP #5C00 - DOS_PROG.Size ;!HARDCODE .Exec: PUSH AF XOR A OUT (SYS_PORT_OFF),A POP AF .Patch+2: CALL #3D03 PUSH AF LD A,0 OUT (CNF_PORT),A POP AF RET .Size EQU $ - .Exec ENT CONT_PROG: LD HL,1AFDH PUSH HL LD HL,5B00H PUSH HL LD DE,5C71H LD BC,1 LD A,0E8H LD (DE),A JP SW_ROM ;