Subversion Repositories pentevo

Rev

Rev 1035 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1.  
  2. ; LAST UPDATE: 16.02.2025 savelij
  3.  
  4. ITSELECTOR      LD HL,SYSFLAGS
  5.                 RES SYSFLAGS.B_MOUSE_PRESENT,(HL); принудительное отключение мыши для текстмода
  6.                 SET SYSFLAGS.B_VIDEO_MODE,(HL)  ; меню текстового видеорежима
  7.                 LD HL,KEYBOARDS
  8.                 LD (ADR_INT),HL                 ; по прерываниям будет опрос клавиатуры
  9.                 LD (OLD_STACK),SP
  10.                 JR SELECTOR
  11.  
  12. ISELECTOR       LD HL,SYSFLAGS
  13.                 RES SYSFLAGS.B_VIDEO_MODE,(HL)
  14.                 CALL DETECTMOUSE
  15.                 LD (OLD_STACK),SP
  16. SELECTOR        EI     
  17.                 LD A,(SYSFLAGS)
  18.                 AND SYSFLAGS.M_MOUSE_PRESENT    ; проверка наличия мыши
  19.                 JR Z,_RULNMO
  20. ; FIX колесо мыши
  21. MKEYPR          EI
  22.                 LD A,HIGH (MOUSE_KEYS)
  23.                 IN A,(LOW (MOUSE_KEYS))
  24.                 CPL
  25.                 AND %00000111
  26.                 JR NZ,MKEYPR
  27. _RULNMO         CALL SAVE2X2                    ; если меню напечатали поверх стрелки
  28.                 CALL SET_ADR_ATR                ; установка нового адреса для цветной полоски
  29.                 LD HL,FLAGS_KEY
  30.                 RES 5,(HL)                      ; на клавиатуре ничего не нажато
  31.                 JR MAINLOP
  32.  
  33. ; нажата стрелка вверх
  34. UP              CALL CURSOR_UP                  ; сменили текущий пункт на -1
  35.                 JR SET_POS1                    
  36.  
  37. ; нажата стрелка вправо
  38. RIGHT           BIT 1,(IX+_FLAGS)               ; проверка просто меню или файловое
  39.                 PUSH AF                         ; сохранили результат проверки
  40.                 CALL NZ,PAGEDN                  ; если файловое, то листание страничное
  41.                 POP AF                          ; восстановили результат проверки
  42.                 JR NZ,SET_POS1                  ; если файловое продолжаем
  43.                 LD A,(IX+_NUM_KOL_L)
  44.                 AND A
  45.                 JR Z,SET_POS
  46.                 DEC A                           ; иначе переход курсора на последний пункт
  47.                 JR SET_POS                      ; изменяем положение курсора и продолжаем
  48.  
  49. ; нажата стрелка вниз
  50. DOWN            CALL CURSOR_DOWN                ; сменили текущий пункт на +1
  51.                 JR SET_POS1
  52.  
  53. ; нажата стрелка влево
  54. LEFT            BIT 1,(IX+_FLAGS)               ; проверка просто меню или файловое
  55.                 PUSH AF                         ; сохранили результат проверки
  56.                 CALL NZ,PAGEUP                  ; если файловое, то листание страничное
  57.                 POP AF                          ; восстановили результат проверки
  58.                 JR NZ,SET_POS1                  ; если файловое продолжаем
  59.                 XOR A                           ; иначе переход курсора на первый пункт
  60. SET_POS         BIT B_ADR_PUNKT,(IX+_NUM_PKT)
  61.                 JR Z,SET_POS3
  62.                 LD L,(IX+_TEK_PKT_L)
  63.                 LD H,(IX+_TEK_PKT_H)
  64.                 LD (HL),A
  65.                 INC HL
  66.                 LD (HL),A
  67.                 INC HL
  68.                 LD (HL),0
  69.                 JR SET_POS1
  70.  
  71. SET_POS3        LD (IX+_NUM_PKT),A              ; изменили позицию курсора
  72.                 LD (IX+_TEK_PKT_L),A
  73.                 LD (IX+_TEK_PKT_H),0            ; изменили номер выбранного пункта
  74. SET_POS1        CALL COLOR_CURSOR               ; перерисовка цветной полоски меню
  75. MAINLOP         LD HL,FLAGS_KEY
  76.                 RES 5,(HL)                      ; сброс нажатых кнопок
  77.                 LD A,(SYSFLAGS)
  78.                 AND SYSFLAGS.M_MOUSE_PRESENT    ; проверка наличия мыши
  79.                 JP Z,MAINNMO
  80.                 LD HL,(ARXY)                    ; старая координата мыши
  81.                 PUSH HL
  82.                 CALL MOUSE                      ; опрос портов мыши
  83.                 POP BC
  84.                 AND A
  85.                 SBC HL,BC
  86.                 JR Z,NO_SELECT                  ; не было движения мыши
  87.                 CALL MOUOPT                     ; проверка наведения мыши на заданное окно
  88. NO_SELECT       LD BC,MOUSE_KEYS
  89.                 IN A,(C)                        ; опрос нажатия кнопок мыши
  90.                 AND 7
  91.                 CP 6
  92.                 JR Z,PRESS_MOUSE                ; если нажата левая кнопка мыши
  93.                 CP 5
  94.                 JP Z,RESTART                    ; если нажата правая кнопка мыши
  95.                 CALL PRINTTIME                  ; обновили время если изменилось
  96.                 EI
  97.                 CALL REST2X2                    ; восстановили кусок экрана под мышью
  98.                 CALL DRAW_MOUSE                 ; нарисовали курсор мыши
  99.                 JR MAINQMO                      ; продолжение опроса
  100.  
  101. PRESS_MOUSE     CALL OPMSPL
  102.                 AND A
  103.                 JR Z,CP_MOUSE4
  104.                 LD (LAST_K),A
  105.                 CALL TIMELP
  106.                 JR SELECT_KEY
  107.  
  108. CP_MOUSE4       CALL MOUOPT                     ; проверка попадания мыши в пределы текущего окна
  109.                 JR C,MAINNMO                    ; не попали и едем далее
  110.                 LD E,(IX+_NUM_PKT)              ; взяли номер пункта куда попали мышью
  111.                 BIT B_ADR_PUNKT,E
  112.                 JR Z,CP_MOUSE5
  113.                 LD L,(IX+_TEK_PKT_L)
  114.                 LD H,(IX+_TEK_PKT_H)
  115.                 LD E,(HL)
  116. CP_MOUSE5       LD D,0
  117.                 LD HL,(PRESSEDKEY)              ; адрес списка хоткеев текущего окна
  118.                 ADD HL,DE                       ; адрес хоткея выбранного пункта
  119.                 LD DE,LAST_K
  120.                 LDI                             ; имитация нажатия заданной кнопки
  121.                 JR ENTER
  122.                
  123. MAINNMO         CALL PRINTTIME                  ; обновление времени, если в оно обновилось
  124.                 EI
  125.                 HALT
  126. MAINQMO         LD A,(FLAGS_KEY)
  127.                 BIT 5,A                         ; проверка нажатия кнопок клавиатуры
  128.                 JP Z,MAINLOP                    ; продолжаем опрос управления
  129.         ROMCALL BREAK_KEY,ROM_RST82             ; проверка на BREAK
  130.                 JR C,SELECT_KEY                 ; если BREAK не нажат продолжаем
  131. RESTART         DI
  132.                 CALL RESTORE_FATVARS            ; восстановление FAT переменных
  133.                 CALL TRESTORE_CLINE             ; восстановление цвета в меню
  134.                 LD A,1
  135.                 RET
  136.  
  137. SELECT_KEY      DI
  138.                 LD HL,SET_POS1
  139.                 PUSH HL
  140.                 LD HL,LAST_K
  141.                 LD A,(HL)                       ; взяли нажатую клавишу
  142.                 LD B,0
  143.                 LD HL,MAIN_KEYS
  144.                 LD C,(HL)                       ; количество доступных кнопок
  145.                 LD D,C
  146.                 INC HL
  147.                 CPIR
  148.                 JR NZ,NOMAINKEYS                ; ничего не нашли, далее смотрим кнопки текущего окна
  149.                                                 ; нажато что-то из главных кнопок, доступных всегда
  150.                 LD HL,ADREXEKEYS
  151.                 LD A,D                          ; количество кнопок в таблице -1
  152.                 SUB C                           ; получили выбранный номер
  153.                 DEC A
  154.                 ADD A,A
  155.                 ADD A,L
  156.                 LD L,A
  157.                 ADC A,H
  158.                 SUB L
  159.                 LD H,A
  160.                 LD A,(HL)
  161.                 INC HL
  162.                 LD H,(HL)
  163.                 LD L,A
  164.                 JP (HL)
  165.  
  166. ; проверка хоткеев в текущем окне
  167. NOMAINKEYS      LD L,(IX+_ADR_HOTKEY_L)
  168.                 LD H,(IX+_ADR_HOTKEY_H)         ; адрес списка нажатых кнопок текущего окна
  169.                 LD C,A
  170.                 LD A,H
  171.                 OR L
  172.                 JP Z,MAINLOP                    ; если списка нет, продолжаем опрос
  173.                 LD A,C
  174.                 LD C,(IX+_V_SIZE)
  175.                 LD E,(HL)
  176.                 INC HL
  177.                 DEC C                           ; количество кнопок
  178.                 DEC C                           ; высота окна -2
  179.                 LD D,C
  180.                 LD B,0
  181.                 CPIR                            ; сканирование списка заданных клавиш
  182.                 JR NZ,OSTAT_KEYS
  183.                 LD A,D                          ; высота окна
  184.                 SUB C
  185.                 DEC A                           ; получили номер нажатой кнопки и -1
  186.                 BIT B_ADR_PUNKT,(IX+_NUM_PKT)
  187.                 JR Z,ENTER1
  188.                 LD L,(IX+_TEK_PKT_L)
  189.                 LD H,(IX+_TEK_PKT_H)
  190.                 LD (HL),A
  191.                 INC HL
  192.                 LD (HL),A
  193.                 JR ENTER
  194.  
  195. ENTER1          LD (IX+_NUM_PKT),A              ; номер пункта в окне
  196.                 LD (IX+_TEK_PKT_L),A            ; номер нажатой клавиши по указанному списку
  197. ENTER           LD A,(SYSFLAGS)
  198.                 AND SYSFLAGS.M_MOUSE_PRESENT
  199.                 CALL NZ,TIMELP                  ; обновление времени если оно изменилось       
  200.                 CALL REST2X2                    ; стерли курсор мыши
  201.                 LD A,(IX+_NUM_PKT)              ; номер из списка который вызвать
  202.                 BIT B_ADR_PUNKT,A
  203.                 JR Z,JUMP2HL1
  204.                 LD L,(IX+_TEK_PKT_L)
  205.                 LD H,(IX+_TEK_PKT_H)
  206.                 LD A,(HL)
  207. JUMP2HL1        LD L,(IX+_ADR_PRG_L)
  208.                 LD H,(IX+_ADR_PRG_H)            ; взяли список адресов 1 из которых будем вызывать
  209. JUMP2HL         ADD A,A
  210.                 ADD A,L
  211.                 LD L,A
  212.                 ADC A,H
  213.                 SUB L
  214.                 LD H,A
  215.                 LD A,(HL)
  216.                 INC HL
  217.                 LD H,(HL)
  218.                 LD L,A
  219.                 JP (HL)
  220.  
  221. OSTAT_KEYS      EX AF,AF'
  222.                 LD A,E
  223.                 SUB D
  224.                 JP Z,MAINLOP
  225.                 LD C,A
  226.                 EX AF,AF'
  227.                 CPIR
  228.                 JP NZ,MAINLOP
  229.                 LD A,E
  230.                 SUB C
  231.                 DEC A
  232.                 JR JUMP2HL1
  233.  
  234. TIMELP          CALL PRINTTIME
  235.                 LD A,HIGH (MOUSE_KEYS)
  236.                 IN A,(LOW (MOUSE_KEYS))         ; кнопки мыши
  237.                 CPL
  238.                 AND 7
  239.                 JR NZ,TIMELP                    ; пока не отпустят
  240.                 RET
  241.  
  242. CURSOR_UP       LD C,(IX+_TEK_PKT_L)
  243.                 LD B,(IX+_TEK_PKT_H)
  244.                 BIT B_ADR_PUNKT,(IX+_NUM_PKT)
  245.                 JR Z,CURSOR_UP3
  246.                 LD L,(IX+_TEK_PKT_L)
  247.                 LD H,(IX+_TEK_PKT_H)
  248.                 INC HL
  249.                 LD C,(HL)
  250.                 INC HL
  251.                 LD B,(HL)
  252. CURSOR_UP3      LD A,B
  253.                 OR C
  254.                 RET Z
  255.                 DEC BC
  256.                 BIT B_ADR_PUNKT,(IX+_NUM_PKT)
  257.                 JR Z,CURSOR_UP2
  258.                 LD (HL),B
  259.                 DEC HL
  260.                 LD (HL),C
  261.                 DEC HL
  262.                 LD A,(HL)
  263.                 AND A
  264.                 JR Z,CURSOR_UP1
  265.                 DEC (HL)
  266.                 RET
  267.  
  268. CURSOR_UP2      LD (IX+_TEK_PKT_L),C
  269.                 LD (IX+_TEK_PKT_H),B
  270.                 LD A,(IX+_NUM_PKT)
  271.                 AND A
  272.                 JR Z,CURSOR_UP1
  273.                 DEC (IX+_NUM_PKT)
  274.                 RET
  275.  
  276. CURSOR_UP1      CALL REST2X2
  277.                 CALL RESTORE_CLINE
  278.                 CALL SCRDN
  279.                 LD E,(IX+_Y_COORD)
  280.                 INC E
  281. DOWN1           LD D,(IX+_X_COORD)
  282.                 INC D
  283.                 INC D
  284.         EVOPORT WIN_P3,RAM_SORTFILES
  285.                 LD L,(IX+_TEK_PKT_L)
  286.                 LD H,(IX+_TEK_PKT_H)
  287.                 BIT B_ADR_PUNKT,(IX+_NUM_PKT)
  288.                 JR Z,DOWN3
  289.                 DEC D
  290.                 INC HL
  291.                 LD A,(HL)
  292.                 INC HL
  293.                 LD H,(HL)
  294.                 LD L,A
  295. DOWN3           LD BC,CPU3
  296.                 ADD HL,HL
  297.                 ADD HL,BC
  298.                 LD C,(HL)
  299.                 INC HL
  300.                 LD B,(HL)
  301.                 PUSH DE
  302.         ROMCALL POSTF06,ROM_RST83
  303.         ROMCALL READ_DIR,ROM_RST83
  304.                 LD DE,FILES_EXT
  305.         ROMCALL CP_EXT,ROM_RST83
  306.                 EX AF,AF'
  307.                 LD BC,_DIR_Attr
  308.                 ADD HL,BC
  309.                 LD A,(HL)
  310.                 SBC HL,BC
  311.                 AND M_DIR_Directory
  312.                 LD A,BLUE << 3 + WHITE + BR_INK ; если директория то цвет белый
  313.                 JR NZ,DOWN7
  314. ; раскраска по заданной таблице
  315.                 EX AF,AF'
  316.                 LD HL,COLOR_EXT
  317.                 ADD A,L
  318.                 LD L,A
  319.                 ADC A,H
  320.                 SUB L
  321.                 LD H,A
  322.                 LD A,(HL)
  323.                 ADD A,BLUE << 3 + BR_INK
  324. DOWN7           LD (OUT_NAME_FILE+1),A          ; установка цвета раскраски
  325.                 LD HL,BUF_MOVE256
  326.         ROMCALL GET_LONGNAME,ROM_RST83
  327.                 POP DE
  328.                 CALL FILENAME8_3
  329.                 JP SET_ADR_ATR
  330.  
  331. CURSOR_DOWN     LD L,(IX+_NUM_KOL_L)
  332.                 LD H,(IX+_NUM_KOL_H)            ; количество пунктов
  333.                 BIT B_ADR_NUMS_PUNKT,(IX+_NUM_PKT)
  334.                 JR Z,CURSOR_DOWN6
  335.                 LD L,(IX+_TEK_PKT_L)            ; получение количества пунктов         
  336.                 LD H,(IX+_TEK_PKT_H)            ; из указанного адреса
  337.                 INC HL
  338.                 INC HL
  339.                 INC HL
  340.                 LD A,(HL)
  341.                 INC HL
  342.                 LD H,(HL)
  343.                 LD L,A                          ; количество пунктов в этом меню
  344. CURSOR_DOWN6    LD A,H
  345.                 OR L
  346.                 RET Z
  347.                 BIT B_ADR_PUNKT,(IX+_NUM_PKT)
  348.                 JR Z,CURSOR_DOWN2
  349.                 LD E,(IX+_TEK_PKT_L)
  350.                 LD D,(IX+_TEK_PKT_H)            ; текущий номер
  351.                 EX DE,HL
  352.                 INC HL
  353.                 LD C,(HL)
  354.                 INC HL
  355.                 LD B,(HL)
  356.                 EX DE,HL
  357.                 JR CURSOR_DOWN3
  358.  
  359. CURSOR_DOWN2    LD C,(IX+_TEK_PKT_L)
  360.                 LD B,(IX+_TEK_PKT_H)
  361. CURSOR_DOWN3    SCF
  362.                 SBC HL,BC
  363.                 RET Z
  364.                 INC BC
  365.                 BIT B_ADR_PUNKT,(IX+_NUM_PKT)
  366.                 JR Z,CURSOR_DOWN4
  367.                 EX DE,HL
  368.                 LD (HL),B
  369.                 DEC HL
  370.                 LD (HL),C
  371.                 DEC HL
  372.                 LD A,(IX+_V_SIZE)
  373.                 SUB 3
  374.                 CP (HL)
  375.                 JR Z,CURSOR_DOWN1
  376.                 INC (HL)
  377.                 RET
  378.  
  379. CURSOR_DOWN4    LD (IX+_TEK_PKT_L),C
  380.                 LD (IX+_TEK_PKT_H),B
  381.                 LD A,(IX+_V_SIZE)
  382.                 SUB 3
  383.                 CP (IX+_NUM_PKT)
  384.                 JR Z,CURSOR_DOWN1
  385.                 INC (IX+_NUM_PKT)
  386.                 RET
  387.  
  388. CURSOR_DOWN1    CALL REST2X2
  389.                 CALL RESTORE_CLINE
  390.                 CALL SCRUP
  391.                 LD A,(IX+_Y_COORD)
  392.                 ADD A,(IX+_V_SIZE)
  393.                 SUB 2
  394.                 LD E,A
  395.                 JP DOWN1
  396.  
  397. GET_XY          LD L,(IX+_TEK_PKT_L)
  398.                 LD H,(IX+_TEK_PKT_H)            ; текущий номер
  399.                 BIT B_ADR_PUNKT,(IX+_NUM_PKT)
  400.                 JR Z,GETXY1
  401. ; получение номера текущего пункта из указателя
  402.                 INC HL
  403.                 LD E,(HL)
  404.                 INC HL
  405.                 LD D,(HL)               ; текущий номер из указанного адреса
  406.                 EX DE,HL
  407.                 BIT B_ADR_NUMS_PUNKT,(IX+_NUM_PKT)
  408.                 JR Z,GETXY1
  409. ; получение количества пунктов из укказателя
  410.                 EX DE,HL
  411.                 INC HL
  412.                 LD A,(HL)
  413.                 INC HL
  414.                 LD H,(HL)
  415.                 LD L,A                  ; количество пунктов из указанного адреса
  416.                 EX DE,HL
  417.                 JR GETXY2
  418.  
  419. GETXY1          LD E,(IX+_NUM_KOL_L)
  420.                 LD D,(IX+_NUM_KOL_H)            ; кол-во пунктов
  421. GETXY2          LD A,(IX+_V_SIZE)
  422.                 SUB 3
  423.                 LD C,A                  ; количество пунктов в высоте окна
  424.                 LD B,0
  425.                 LD A,D
  426.                 OR E
  427.                 LD A,C
  428.                 RET
  429.  
  430. ; перемещение на страницу вверх
  431. PAGEUP          CALL GET_XY
  432.                 RET Z
  433.                 XOR A
  434.                 SBC HL,BC
  435.                 EX DE,HL
  436.                 JR NC,PDUN0
  437. PDU0            LD D,A
  438.                 LD E,A
  439.                 JR PDUN0
  440.  
  441. ; перемещение на страницу вниз
  442. PAGEDN          CALL GET_XY
  443.                 RET Z
  444.                 EX DE,HL
  445.                 AND A
  446.                 SBC HL,BC
  447.                 ADD HL,BC
  448.                 EX DE,HL
  449.                 JR NC,PDN00
  450.                 DEC DE
  451.                 LD A,E
  452.                 JR PDUN0
  453.  
  454. PDN00           ADD HL,BC
  455.                 EX DE,HL
  456.                 SBC HL,DE
  457.                 ADD HL,DE
  458.                 JR Z,PDUN1
  459.                 JR NC,PDUN0
  460. PDUN1           EX DE,HL
  461.                 DEC DE
  462. PDUN0           BIT B_ADR_PUNKT,(IX+_NUM_PKT)
  463.                 JR Z,PDUN2
  464.                 LD L,(IX+_TEK_PKT_L)
  465.                 LD H,(IX+_TEK_PKT_H)
  466.                 LD (HL),A
  467.                 INC HL
  468.                 LD (HL),E
  469.                 INC HL
  470.                 LD (HL),D
  471.                 JR PDUN3
  472.  
  473. PDUN2           LD (IX+_NUM_PKT),A
  474.                 LD (IX+_TEK_PKT_L),E
  475.                 LD (IX+_TEK_PKT_H),D
  476. PDUN3           CALL RESTORE_CLINE
  477.                 JP OUT_CURR_DIR
  478.  
  479. PRINTTIME       DI
  480.                 LD H,CMOS.REG_C
  481.                 CALL READCMOS
  482.                 AND CMOSREG.M_C_RO_UF
  483.                 RET Z                           ; если время еще не обновилось, выходим ничего не выводя
  484.                 LD BC,TXT_TIME                  ; чтение и преобразование времени
  485.                 LD H,CMOS.HOUR
  486.                 CALL READCMOS                   ; прочитали часы
  487.                 CALL BYTE2TXT                   ; сконвертили часы с укладкой в буфер
  488.                 LD A,(BC)
  489.                 XOR ':'-' '                     ; конверсия мигающего двоеточия
  490.                 LD (BC),A
  491.                 INC BC
  492.                 LD H,CMOS.MINUTE
  493.                 CALL READCMOS                   ; прочитали минуты
  494.                 CALL BYTE2TXT                   ; сконвертили часы с укладкой в буфер
  495.                 LD A,(BC)
  496.                 XOR ':'-' '                     ; конверсия мигающего двоеточия
  497.                 LD (BC),A
  498.                 INC BC
  499.                 LD H,CMOS.SECOND
  500.                 CALL READCMOS                   ; прочитали секунды
  501.                 CALL BYTE2TXT
  502.                 LD BC,TXT_DATA                  ; далее чтение и преобразование даты
  503.                 LD H,CMOS.DAY_MONTH
  504.                 CALL READCMOS
  505.                 CALL BYTE2TXT
  506.                 INC BC
  507.                 LD H,CMOS.MONTH
  508.                 CALL READCMOS
  509.                 CALL BYTE2TXT
  510.                 INC BC
  511.                 LD H,CMOS.YEAR
  512.                 CALL READCMOS
  513.                 CALL BYTE2TXT
  514.                 LD HL,BUFF_TIME                 ; печатаем время из буфера
  515.                 JP ITPRINT_MESSAGE
  516.  
  517. ; перевод "A" в десятичку и в текст
  518. A2TXT           PUSH HL
  519.                 LD L,A
  520.                 LD H,0
  521.                 LD DE,10
  522.                 XOR A
  523.                 DEC A
  524. .L1             INC A
  525.                 SBC HL,DE
  526.                 JR NC,.L1
  527.                 ADD HL,DE
  528.                 ADD A,'0'
  529.                 LD D,A
  530.                 LD A,L
  531.                 ADD A,'0'
  532.                 POP HL
  533.                 LD (HL),D
  534.                 INC HL
  535.                 LD (HL),A
  536.                 INC HL
  537.                 RET
  538.  
  539. BYTE2TXT        LD L,A
  540.                 LD H,'0'
  541.                 RRCA
  542.                 RRCA
  543.                 RRCA
  544.                 RRCA
  545.                 AND 0x0F
  546.                 ADD A,H
  547.                 LD (BC),A
  548.                 INC BC
  549.                 LD A,L
  550.                 AND 0x0F
  551.                 ADD A,H
  552.                 LD (BC),A
  553.                 INC BC
  554.                 RET
  555.  
  556. ; выход из MAGIC
  557. CONTINUE_PROG   DI
  558.                 LD SP,(OLD_STACK)
  559.                 XOR A
  560.                 RET
  561.  
  562. ; перезапуск MAGIC меню с полной перерисовкой экрана
  563. RESTART_MAIN    DI
  564.                 LD SP,(OLD_STACK)
  565.                 LD A,1
  566.                 RET
  567.  
  568. ; выход из отладчика
  569. TRACER_DBG      DI
  570.                 LD SP,(OLD_STACK)
  571.                 LD A,2
  572.                 RET
  573.  
  574. SETUP           LD IX,SETUP_MENU
  575.                 CALL INT_TXT_WINDOW
  576.                 JP SET_ADR_ATR
  577.  
  578. ; перебор TURBO режимов с записью в CMOS и изменением после выхода из NMI
  579. ; 0-7MHZ 1-3,5MHZ 2-14,0MHZ
  580. SET_TURBO       DI
  581.                 LD H,CMOS.BYTE_01
  582.                 CALL READCMOS
  583.                 LD E,L                          ; турбо режим и режим памяти
  584.                 LD H,CMOS.BYTE_00
  585.                 CALL READCMOS
  586.                 LD D,L                          ; TURBO 14.0
  587.                 RLCA
  588.                 LD C,A
  589.                 LD A,E
  590.                 RLCA
  591.                 LD A,C
  592.                 RLA
  593.                 AND 3
  594.                 INC A                           ; сменили TURBO режим
  595.                 CP 3
  596.                 JR C,SETTURBO1
  597.                 XOR A                           ; если перешли через 0, то выставили режим 14.0
  598. SETTURBO1       LD C,A
  599.                 PUSH BC
  600.                 AND A
  601.                 RES 7,E                         ; TURBO 7       0
  602.                 RES 7,D                         ; TURBO 14=7MHZ 0
  603.                 JR Z,SETTURBO3
  604.                 DEC A
  605.                 SET 7,E                         ; TURBO 7       1
  606.                 RES 7,D                         ; TURBO 14=3,5  0
  607.                 JR Z,SETTURBO3
  608.                 RES 7,E                         ; TURBO 7       0
  609.                 SET 7,D                         ; TURBO 14=14   1
  610. SETTURBO3       LD H,CMOS.BYTE_00
  611.                 LD L,D
  612.                 PUSH DE
  613.                 CALL IWRITECMOS
  614.                 POP DE
  615.                 LD H,CMOS.BYTE_01
  616.                 LD L,E
  617.                 CALL IWRITECMOS
  618.                 POP BC
  619.                 LD A,C
  620.                 AND A
  621.                 LD DE,%0000000000000000         ; 7MHZ
  622.                 JR Z,SETTURBO4
  623.                 DEC A
  624.                 LD DE,%0001000000000000         ; 3,5MHZ
  625.                 JR Z,SETTURBO4
  626.                 LD DE,%0000000000001000         ; 14MHZ
  627. SETTURBO4       LD A,(B_PORT77)
  628.                 AND %11110111
  629.                 OR E
  630.                 LD (B_PORT77),A
  631.                 LD A,(N_EFF7)
  632.                 AND %11101111
  633.                 OR D
  634.                 LD (N_EFF7),A
  635. SETANDPRINT     CALL SETUP4SEL
  636.                 LD HL,SETUP_MENU.TXT_SETUPMENU
  637.                 JP ITPRINT_MESSAGE
  638.  
  639. ; перебор режимов памяти с записью в CMOS и изменением после выхода из NMI
  640. SET_MEMORY      DI
  641.                 LD H,CMOS.BYTE_01
  642.                 CALL READCMOS
  643.                 AND 3
  644.                 INC A
  645.                 CP 3
  646.                 JR C,SETMEMORY1
  647.                 XOR A
  648. SETMEMORY1      LD C,A
  649.                 LD A,L
  650.                 AND %11111100
  651.                 OR C
  652.                 LD L,A
  653.                 CALL IWRITECMOS
  654.                 JR SETANDPRINT
  655.  
  656. ; включение/выключение резидента HONEY COMANDER
  657. SET_REZIDENT    DI
  658.                 LD H,CMOS.BYTE_01
  659.                 CALL READCMOS
  660.                 XOR CMOS_EC.M_REZIDENT
  661.                 LD L,A
  662.                 CALL IWRITECMOS
  663.                 JR SETANDPRINT
  664.  
  665. KILL_REZID      DI
  666.                 LD H,CMOS.BYTE_03
  667.                 CALL READCMOS
  668.                 XOR CMOS_E9.M_KILL_REZIDENT
  669.                 LD L,A
  670.                 CALL IWRITECMOS
  671.                 JR SETANDPRINT
  672.  
  673. ; изменение текста в меню
  674. SETUP4SEL       DI
  675.                 LD H,CMOS.BYTE_01
  676.                 CALL READCMOS
  677.                 LD E,L                          ; турбо режим и режим памяти
  678.                 LD H,CMOS.BYTE_00
  679.                 CALL READCMOS
  680.                 LD D,L                          ; TURBO 14.0
  681.                 RLCA
  682.                 LD C,A
  683.                 LD A,E
  684.                 RLCA
  685.                 LD A,C
  686.                 RLA
  687.                 AND 3
  688.                 CP 3
  689.                 JR C,SETUP4SEL1
  690.                 DEC A
  691. SETUP4SEL1      ADD A,A
  692.                 ADD A,A
  693.                 LD HL,TXT_TURBO
  694.                 LD C,A
  695.                 LD B,0
  696.                 ADD HL,BC
  697.                 PUSH DE
  698.                 LD DE,TXT_TURBO_MODE
  699.                 LDI
  700.                 LDI
  701.                 LDI
  702.                 LDI
  703.                 EX DE,HL
  704.                 LD (HL),2
  705.                 POP DE
  706.                 PUSH DE
  707.                 LD A,E
  708.                 AND 3
  709.                 LD C,A
  710.                 LD B,0
  711.                 LD HL,TXT_MEMORY
  712.                 ADD HL,BC
  713.                 ADD HL,BC
  714.                 ADD HL,BC
  715.                 LD DE,TXT_MEMORY_MODE
  716.                 LDI
  717.                 LDI
  718.                 LDI
  719.                 EX DE,HL
  720.                 LD (HL),2
  721.                 POP DE
  722. ; для резидента HONEY COMANDER
  723.                 LD A,E
  724.                 AND CMOS_EC.M_REZIDENT
  725.                 LD HL,TXT_ONOFF
  726.                 JR NZ,.ON
  727.                 LD HL,TXT_ONOFF+3
  728. .ON             LD DE,TXT_REZIDENT_MODE
  729.                 LDI
  730.                 LDI
  731.                 LDI
  732.                 EX DE,HL
  733.                 LD (HL),2
  734.                 LD H,CMOS.BYTE_03
  735.                 CALL READCMOS
  736.                 AND CMOS_E9.M_KILL_REZIDENT
  737.                 LD HL,TXT_ONOFF
  738.                 JR NZ,.ON1
  739.                 LD HL,TXT_ONOFF+3
  740. .ON1            LD DE,TXT_KILLREZID
  741.                 LDI
  742.                 LDI
  743.                 LDI
  744.                 EX DE,HL
  745.                 LD (HL),2
  746.                 RET
  747.  
  748. ; ожидание нажатия и отпускания любой клавиши
  749. ANY_KEYS        XOR A
  750.                 IN A,(0xFE)
  751.                 CPL
  752.                 AND 0x1F
  753.                 JR Z,ANY_KEYS
  754. ANYKEYS1        XOR A
  755.                 IN A,(0xFE)
  756.                 CPL
  757.                 AND 0x1F
  758.                 JR NZ,ANYKEYS1
  759.                 RET
  760.