Subversion Repositories pentevo

Rev

Rev 1030 | Rev 1047 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed | ?url?

  1.  
  2. ; LAST UPDATE: 09.11.2022 savelij
  3.  
  4. PAGE
  5.                 TITLE "main.a80"
  6.  
  7.                 include ../../macros.a80
  8.                 include ../../define.a80
  9.                 include ../../global_vars.a80
  10.                 include ../../ports_ide.a80
  11.                 include ../../basic_tokens.a80
  12.                 include ../../bas_trd_vars.a80
  13.                 include ../../tmpkeys.a80
  14.                 include ../../version.a80
  15.                 include ../../nums_devices.a80
  16.                 include ../../ports_ngs.a80
  17.  
  18. TO_DOS          EQU 0x3D2F
  19.  
  20.  INIT_VAR 0xC000
  21.  SETVAR ADR_CAT,        0xC00           ; адрес буфера для дискеты или образа
  22.  SETVAR ADR_CAT_FAT,    0x800           ; адрес буфера найденных файлов на FAT
  23.  SETVAR ADR_CAT_SCRH,   0x1000          ; адрес буфера для поиска файлов
  24.  SETVAR BUFTSC,         0x180           ; 180 таблица адресов строк экрана              F700
  25.  SETVAR MOUSE_BUFF,     0x10            ; 10 буфер сохранения под мышью
  26.  SETVAR COLBUF,         0x20            ; 20 буфер сохранения цвета
  27.  SETVAR BUF_FILEITEM,   0x20            ; 20 буфер описателя файла
  28.  SETVAR BUF_RDSEC,      0x200           ; 200 буфер сектора при проверке файлов         F900
  29.  SETVAR BUF_RDPATH,     0x100           ; 100 буфер текущего пути                       FB00
  30.  SETVAR BUF_LEVDIR,     0x400           ; 400 буфер уровней дир для файлового окна      FC00
  31.  SETVAR BUF_LINESWIN,   0x200           ; 200 буфер для описателей курсора под мышью
  32.  
  33. H_FILE          EQU 16                  ; ширина окна для вывода файлов c TR-DOS
  34. V_FILE          EQU 24                  ; высота окна для вывода файлов c TR-DOS
  35. FV_FILE         EQU 26                  ; ширина окна для вывода файлов c FAT
  36. FV_FILE6        EQU ((FV_FILE-3)*8)/6   ; ширина окна для вывода файлов с FAT в знакоместах 6х8
  37. FH_FILE         EQU 24                  ; высота окна для вывода файлов с FAT
  38. WIDE            EQU 1                   ; два пробела с боков
  39.  
  40. CMOS_ON         EQU 0x80
  41. CMOS_OFF        EQU 0
  42.  
  43.                 ORG 0x6000
  44.                 DI
  45.                 CALL CLEAR_128K
  46.                 LD A,0x10
  47.                 CALL SET_7FFD                   ; включение басика48 и страницы 0
  48.                 CALL ADRTSC                     ; создание таблицы адресов строк экрана
  49.         RST8 _MOUNTER,_GET_VIRT_BITS
  50.         RST8 _COM_DEV,_DEVFIND
  51.                 JR C,START3
  52.         RST8 _MOUNTER,_FIND_MOUNTED
  53. START3
  54.         RST8 _COM_DEV,_CONTROL_SD
  55.                 EI
  56.                 HALT
  57.                 DI
  58.                 LD H,0
  59.                 CALL READCMOS                   ; чтение секунд для определения наличия кмос
  60.                 INC L
  61.                 LD HL,ERS_FLAGS
  62.                 JR NZ,START2                    ; если прочиталось 0xFF, то
  63.                 RES B_CLOCK_ON,(HL)             ; кмос не найден
  64.                 JR START1
  65.  
  66. START2          SET 2,(HL)                      ; кмос найден
  67. START4          CALL SET_MODES
  68. START1          CALL DETECTMOUSE                ; определение наличия мыши
  69.                 CALL GLUDIN                     ; бумкнули в AY
  70.                 CALL MOUSE                      ; опрос мыши
  71.                 LD HL,0x807C
  72.                 LD (ARXY),HL                    ; установка дефолтной позиции мыши при старте
  73.                 CALL DISK_NONE
  74.                 CALL SYSTEM
  75.                 CALL RESET_VG                   ; сброс вгшки и установка перехватчика ошибок dos
  76. RESTART         DI
  77.                 LD A,0x10
  78.                 CALL SET_7FFD                   ; включили басик48 и страничку 0
  79.                 CALL TURBO_7MHZ
  80.                 CALL SYSTEM
  81.                 RES 3,(IY+55)
  82.                 LD SP,0x6000
  83.                 LD HL,0x3E00
  84.                 PUSH HL
  85.                 LD HL,0x1303
  86.                 PUSH HL                         ; сформировали дно стека
  87.                 LD (ERR_SP),SP                  ; занесли текущий адрес в переменые басика
  88.                 LD (TEK_SP),SP
  89.                 CALL S_FACE                     ; вывод на экран основного вида
  90.                 LD IX,MAINMENU
  91.         RST8 _WINW
  92.                 RES 5,(IY+1)                    ; на клавиатуре ничего не нажато
  93.                 LD H,HDD_TIMEOUT
  94.                 CALL READCMOS
  95.                 RRCA
  96.                 RRCA
  97.                 RRCA
  98.                 RRCA
  99.                 AND 0x0F
  100.                 LD (SCRSAV.TIMEOUT),A
  101.                 CALL RESET_SCREENSAVER
  102.  
  103.         IFDEF TESTEMUFDD
  104. ; test
  105.         PEC_ON M_SHADOW_BF
  106.         EVOPORT WIN_P2,RAM_DATARAMD
  107.         EVOPORT WIN_P2,ZXSTD_CPU2
  108.         PEC_OFF M_SHADOW_BF!0xFF
  109.  
  110.                 LD HL,VIRT_REAL_DRIVE << 8
  111.                 CALL WRITECMOS
  112.                 LD HL,ADR_TXT_BOOT
  113.                 JP RUNFILE1
  114.  
  115. ADR_TXT_BOOT    DB "boot    "
  116. ; test
  117.         ENDIF
  118.  
  119. ; вход в главный цикл опроса управления
  120. _RULILKA        EI     
  121.                 LD A,(ERS_FLAGS)
  122.                 AND M_MOUSE_ON                  ; проверка наличия мыши
  123.                 JR Z,_RULNMO
  124. ; FIX колесо мыши
  125. MKEYPR          EI
  126.                 HALT
  127.                 LD A,HIGH (MOUSE_KEYS)
  128.                 IN A,(LOW (MOUSE_KEYS))
  129.                 CPL
  130.                 AND 7
  131.                 JR NZ,MKEYPR
  132.                 CALL SAVE2X2                    ; если меню напечатали поверх стрелки
  133. _RULNMO         CALL SET_ADR_ATR                ; установка нового адреса для цветной полоски
  134.                 JR MAINLOP
  135.  
  136. ; нажата стрелка вверх
  137. UP              CALL CURSOR_UP                  ; сменили текущий пункт на -1
  138.                 JR SET_POS1                    
  139.  
  140. ; нажата стрелка вправо
  141. RIGHT           BIT 1,(IX+_FLAGS)               ; проверка просто меню или файловое
  142.                 PUSH AF                         ; сохранили результат проверки
  143.                 CALL NZ,PAGEDN                  ; если файловое, то листание страничное
  144.                 POP AF                          ; восстановили результат проверки
  145.                 JR NZ,SET_POS1                  ; если файловое продолжаем
  146.                 LD A,(IX+_NUM_KOL_L)
  147.                 AND A
  148.                 JR Z,SET_POS
  149.                 DEC A                           ; иначе переход курсора на последний пункт
  150.                 JR SET_POS                      ; изменяем положение курсора и продолжаем
  151.  
  152. ; нажата стрелка вниз
  153. DOWN            CALL CURSOR_DOWN                ; сменили текущий пункт на +1
  154.                 JR SET_POS1
  155.  
  156. ; нажата стрелка влево
  157. LEFT            BIT 1,(IX+_FLAGS)               ; проверка просто меню или файловое
  158.                 PUSH AF                         ; сохранили результат проверки
  159.                 CALL NZ,PAGEUP                  ; если файловое, то листание страничное
  160.                 POP AF                          ; восстановили результат проверки
  161.                 JR NZ,SET_POS1                  ; если файловое продолжаем
  162.                 XOR A                           ; иначе переход курсора на первый пункт
  163. SET_POS         LD (IX+_NUM_PKT),A              ; изменили позицию курсора
  164.                 LD (IX+_TEK_PKT_L),A
  165.                 LD (IX+_TEK_PKT_H),0            ; изменили номер выбранного пункта
  166. SET_POS1        CALL COLOR_CURSOR               ; перерисовка цветной полоски меню
  167. SET_POS2        CALL GLUDIN                     ; бумкнули в AY
  168. MAINLOP
  169.                 CALL CHECK_SCREENSAVER
  170.         RST8 _COM_DEV,_CONTROL_SD               ; проверка наличия SD карт и обновление индикаторов
  171.                 LD A,(ERS_FLAGS)
  172.                 AND M_MOUSE_ON                  ; проверка наличия мыши
  173.                 JP Z,MAINNMO
  174.                 LD HL,(ARXY)                    ; старая координата мыши
  175.                 PUSH HL
  176.                 CALL MOUSE                      ; опрос портов мыши
  177.                 POP BC
  178.                 AND A
  179.                 SBC HL,BC
  180.                 JR Z,NO_SELECT                  ; не было движения мыши
  181.                 CALL RESTORE_KOSHAK             ; было движение мыши, сброс счетчиков кошака
  182.                 CALL MOUOPT                     ; проверка наведения мыши на заданное окно
  183. NO_SELECT       LD BC,MOUSE_KEYS
  184.                 IN A,(C)                        ; опрос нажатия кнопок мыши
  185.                 AND 7
  186.                 CP 6
  187.                 JR Z,PRESS_MOUSE                ; если нажата левая кнопка мыши
  188.                 CP 5
  189.                 JP Z,RESTART                    ; если нажата правая кнопка мыши
  190.                 CALL PRINTTIME                  ; обновили время если изменилось
  191.                 EI
  192.                 HALT
  193.                 CALL REST2X2                    ; восстановили кусок экранаа под мышью
  194.                 CALL DRAW_MOUSE                 ; нарисовали курсор мыши
  195.                 JR MAINQMO                      ; продолжение опроса
  196.  
  197. PRESS_MOUSE     CALL OPMSPL
  198.                 AND A
  199.                 JR Z,CP_MOUSE4
  200.                 LD (LAST_K),A
  201.                 CALL TIMELP
  202.                 JR SELECT_KEY
  203.  
  204. CP_MOUSE4       CALL MOUOPT                     ; проверка попадания мыши в пределы текущего окна
  205.                 JR C,MAINNMO                    ; не попали и едем далее
  206.                 LD L,(IX+_ADR_HOTKEY_L)
  207.                 LD H,(IX+_ADR_HOTKEY_H)
  208.                 LD A,H
  209.                 OR L
  210.                 JR Z,ENTER                      ; списка хоткеев нет, переходим по номеру пункта
  211.                 LD E,(IX+_NUM_PKT)              ; взяли номер пункта куда попали мышью
  212.                 LD D,0
  213.                 ADD HL,DE                       ; адрес хоткея выбранного пункта
  214.                 LD DE,LAST_K
  215.                 LDI                             ; эмитация нажатия заданной кнопки
  216.                 JR ENTER
  217.                
  218. MAINNMO         CALL PRINTTIME                  ; обновление времени, если в оно обновилось
  219.                 EI
  220.                 HALT
  221. MAINQMO         BIT 5,(IY+1)                    ; проверка нажатия кнопок клавиатуры
  222.                 CALL Z,CP_TIME_KOSHAK           ; если не нажато ничего, проверяем счетчик кошака
  223.                 JP Z,MAINLOP                    ; продолжаем опрос управления
  224.                 CALL 0x1F54                     ; проверка на BREAK
  225.                 JP NC,RESTART                   ; если BREAK нажат перезапускаемся
  226. SELECT_KEY      CALL GLUDIN
  227.                 CALL RESTORE_KOSHAK             ; нажато нечто на клаве, сброс счетчика кошака
  228.                 CALL RESET_SCREENSAVER
  229.                 RES 5,(IY+1)                    ; на клавиатуре ничего не нажато
  230.                 LD HL,LAST_K
  231.                 LD A,(HL)                       ; взяли нажатую клавишу
  232.                 LD B,0
  233.                 LD HL,MAIN_KEYS
  234.                 LD C,(HL)                       ; количество доступных кнопок
  235.                 LD D,C
  236.                 INC HL
  237.                 CPIR
  238.                 JR NZ,NOMAINKEYS                ; ничего не нашли, далее смотрим кнопки текущего окна
  239.                                                 ; нажато что-то из главных кнопок, доступных всегда
  240.                 LD HL,ADREXEKEYS
  241.                 LD A,D                          ; количество кнопок в таблице -1
  242.                 SUB C                           ; получили выбранный номер
  243.                 DEC A
  244.                 JR JUMP2HL
  245.  
  246. ; проверка хоткеев в текущем окне
  247. NOMAINKEYS      LD L,(IX+_ADR_HOTKEY_L)
  248.                 LD H,(IX+_ADR_HOTKEY_H)
  249.                 LD C,A
  250.                 LD A,H
  251.                 OR L
  252.                 JP Z,MAINLOP                    ; если списка нет, продолжаем опрос
  253.                 LD A,C
  254.                 LD C,(IX+_V_SIZE)
  255.                 LD E,(HL)
  256.                 INC HL
  257.                 DEC C                           ; количество кнопок
  258.                 DEC C                           ; высота окна -2
  259.                 LD D,C
  260.                 LD B,0
  261.                 CPIR                            ; сканирование списка заданных клавиш
  262.                 JR NZ,OSTAT_KEYS
  263.                 LD A,D                          ; высота окна
  264.                 SUB C
  265.                 DEC A                           ; получили номер нажатой кнопки и -1
  266.                 LD (IX+_NUM_PKT),A              ; номер пункта в окне
  267.                 LD (IX+_TEK_PKT_L),A            ; номер нажатой клавиши по указанному списку
  268. ENTER           LD A,(ERS_FLAGS)
  269.                 AND M_MOUSE_ON
  270.                 CALL NZ,TIMELP                  ; обновление времени если оно изменилось       
  271.                 CALL REST2X2                    ; стерли курсор мыши
  272.                 CALL GLUDIN                     ; бумкнули в AY
  273.                 LD A,(IX+_NUM_PKT)              ; номер из списка который вызвать
  274. JUMP2HL1        LD L,(IX+_ADR_PRG_L)
  275.                 LD H,(IX+_ADR_PRG_H)            ; взяли список адресов 1 из которых будем вызывать
  276. JUMP2HL         ADD A,A
  277.                 ADD A,L
  278.                 LD L,A
  279.                 ADC A,H
  280.                 SUB L
  281.                 LD H,A
  282.                 LD A,(HL)
  283.                 INC HL
  284.                 LD H,(HL)
  285.                 LD L,A
  286.                 JP (HL)
  287.  
  288. OSTAT_KEYS      EX AF,AF'
  289.                 LD A,E
  290.                 SUB D
  291.                 JP Z,MAINLOP
  292.                 LD C,A
  293.                 EX AF,AF'
  294.                 CPIR
  295.                 JP NZ,MAINLOP
  296.                 LD A,E
  297.                 SUB C
  298.                 DEC A
  299.                 JR JUMP2HL1
  300.  
  301. ; изменение режима памяти
  302. CHNGMODE        LD HL,MEMMODE
  303.                 DEC (HL)                        ; сменили режим памяти
  304.                 JP P,CHNGMODEY
  305.                 LD (HL),2                       ; если перешли через 0, то выставили режим 48
  306. CHNGMODEY       LD A,(ERS_FLAGS)
  307.                 AND M_CLOCK_ON                  ; проверка наличия кмоса
  308.                 RET Z
  309.                 LD A,(ERS_FLAGS)
  310.                 AND M_EMU_TAPE
  311.                 RLCA
  312.                 RLCA
  313.                 LD L,A
  314.                 LD A,(MEMMODE)
  315.                 OR L
  316.                 LD L,A
  317. CHNGMODEY1      LD A,(SYSREG1)
  318.                 AND 0x10
  319.                 RLCA
  320.                 RLCA
  321.                 RLCA
  322.                 OR L
  323.                 LD C,A
  324.                 LD H,CMOS_BYTE_01
  325.                 CALL READCMOS
  326.                 AND %01111100
  327.                 OR C
  328. CHANGE_MODES    LD L,A
  329.                 CALL WRITECMOS                  ; сохранили в кмос измененый режим
  330.                 CALL REST2X2
  331.                 CALL SET_MODES
  332.                 CALL PRT_MODES
  333.                 LD A,(ERS_FLAGS)
  334.                 AND M_MOUSE_ON
  335.                 JP Z,MAINLOP
  336.                 CALL DRAW_MOUSE
  337.                 CALL TIMELP
  338.                 JP MAINLOP
  339.  
  340. ; изменение режима турбо 0=3,5MHZ, 1=7MHZ, 2-14MHZ
  341. CHNGTURBO       LD HL,TURBO_NUM
  342.                 INC (HL)                        ; сменили turbo режим
  343.                 LD A,(HL)
  344.                 CP 3
  345.                 JR C,CHNGTURBO1
  346.                 LD (HL),0                       ; если перешли через 0, то выставили режим 14MHZ
  347. CHNGTURBO1      LD A,(HL)
  348.                 AND A
  349.                 LD DE,0x1000
  350.                 JR Z,CHNGTURBO2
  351.                 DEC A
  352.                 LD DE,0
  353.                 JR Z,CHNGTURBO2
  354.                 LD DE,0X10*0X100+M_TURBO14
  355. CHNGTURBO2      LD A,D
  356.                 LD HL,SYSREG1
  357.                 LD A,(HL)
  358.                 AND %11101111                   ; инверсия бита турборежима
  359.                 OR D
  360.                 LD (HL),A
  361.                 LD H,CMOS_BYTE_00
  362.                 CALL READCMOS
  363.                 AND M_TURBO14!0XFF
  364.                 OR E
  365.                 LD L,A
  366.                 LD H,CMOS_BYTE_00
  367.                 CALL WRITECMOS
  368.                 JP CHNGMODEY
  369.  
  370. CHNGTAPMODE     LD H,CMOS_BYTE_00
  371.                 CALL READCMOS
  372.                 XOR M_EMUL_TAPE
  373.                 JR CHANGE_MODES
  374.  
  375. CHNGGLUKMOD     LD H,CMOS_BYTE_00
  376.                 CALL READCMOS
  377.                 AND MKOL_MODES!0xFF
  378.                 LD C,A
  379.                 LD A,L
  380.                 AND MKOL_MODES
  381.                 INC A
  382.                 CP KOL_MODES
  383.                 JR C,CHNGGLUKMOD1
  384.                 XOR A
  385. CHNGGLUKMOD1    OR C
  386.                 LD L,A
  387.                 JR CHANGE_MODES
  388.  
  389. EN_AUTOMNT      LD H,CMOS_BYTE_01
  390.                 CALL READCMOS
  391.                 XOR M_AUTOMOUNT
  392.                 JP CHANGE_MODES
  393.  
  394. EN_LOADFONT     LD H,CMOS_BYTE_00
  395.                 CALL READCMOS
  396.                 XOR M_RELOAD_FONT
  397.                 JP CHANGE_MODES
  398.  
  399. SET_TYPEFONT    LD H,CMOS_BYTE_00
  400.                 CALL READCMOS
  401.                 XOR M_TYPE_FONT
  402.                 PUSH AF
  403.                 PUSH HL
  404.                 AND M_TYPE_FONT
  405.                 JR Z,SETTYPEFONT
  406.                 LD A,1
  407. SETTYPEFONT
  408.         RST8 _SETUP_FONT
  409.                 POP HL
  410.                 POP AF
  411.                 JP CHANGE_MODES
  412.  
  413. ; включение/выключениe отображения часов
  414. CMOS_ONOFF      LD A,(ERS_FLAGS)
  415.                 AND M_CLOCK_ON                  ; проверка наличия кмоса
  416.                 JP Z,MAINLOP
  417.                 LD H,CMOS_BYTE_01
  418.                 CALL READCMOS
  419.                 XOR M_CLOCK_VIEW
  420.                 LD L,A
  421.                 PUSH AF
  422.                 LD H,CMOS_BYTE_01
  423.                 CALL WRITECMOS
  424.                 POP AF
  425.                 AND M_CLOCK_VIEW
  426.                 JP Z,MAINLOP
  427.                 LD HL,TIME_OFF
  428.         RST8 _PRINT_MESSAGE
  429.                 JP MAINLOP
  430.  
  431. ;включение/выключение курсора мыши
  432. MOUSE_ONOFF     LD HL,ERS_FLAGS
  433.                 LD A,(HL)
  434.                 XOR M_MOUSE_ON                  ; инверсия отображения мыши
  435.                 LD (HL),A
  436.                 AND M_MOUSE_ON
  437.                 CALL NZ,DETECTMOUSE             ; если включили, проверяем наличие
  438.                 CALL NC,REST2X2                 ; если мышь не найдена, то выключаем отображение
  439.                 JP MAINLOP
  440.  
  441. ;ожидание нажатия чего-нибудь после ошибки
  442. EXIT4ERROR      RES 5,(IY+1)                    ; на клавиатуре ничего не нажато
  443.                 LD BC,MOUSE_KEYS
  444.                 IN D,(C)
  445. E4E1            CALL PRINTTIME
  446.                 EI
  447.                 HALT
  448.                 BIT 5,(IY+1)
  449.                 JR NZ,E4E3
  450.                 LD A,(ERS_FLAGS)
  451.                 AND M_MOUSE_ON
  452.                 JR NZ,E4E1
  453.                 LD A,HIGH (MOUSE_KEYS)
  454.                 IN A,(LOW (MOUSE_KEYS))
  455.                 CP D
  456.                 JR Z,E4E1
  457. E4E2            EX AF,AF'
  458.                 CALL TIMELP
  459.                 EX AF,AF'
  460.                 RRA
  461.                 RET
  462.  
  463. E4E3            XOR A
  464.                 IN A,(0XFE)
  465.                 CPL
  466.                 AND 0x1F
  467.                 JR NZ,E4E3
  468.                 LD (LAST_K),A
  469.                 RES 5,(IY+1)                    ; на клавиатуре ничего не нажато
  470.                 RET
  471.  
  472. ; печать текущего выбранного дисковода
  473. PRT_DRV_SYM     LD A,(TRD_5CF8)
  474.                 ADD A,"A"
  475.                 LD (TXT_DRIVE),A
  476.                 LD HL,TRDDRV_MODE
  477.         RST8 _PRINT_MESSAGE
  478.                 RET
  479.  
  480. ; распечатка текущего режима
  481. PRT_MODES       LD HL,SPEED_MODE
  482.         RST8 _PRINT_MESSAGE
  483.                 LD HL,MEM_MODE
  484.         RST8 _PRINT_MESSAGE
  485.                 LD HL,EMUTAPLOAD
  486.         RST8 _PRINT_MESSAGE
  487.                 LD HL,SET_RESET
  488.         RST8 _PRINT_MESSAGE
  489.                 LD HL,ROMLOADFONT
  490.         RST8 _PRINT_MESSAGE
  491.                 LD HL,TYPESFONT
  492.         RST8 _PRINT_MESSAGE
  493.                 LD HL,TXT_AUTOMOUNT
  494.         RST8 _PRINT_MESSAGE
  495.                 RET
  496.  
  497. ; распечатка текущего виртуального дисковода
  498. PRT_VIRTDRV
  499.         RST8 _MOUNTER,_GET_VIRT_BITS
  500.                 LD D,A
  501.                 LD H,VIRT_REAL_DRIVE
  502.                 CALL READCMOS
  503.                 AND 3
  504.                 LD B,A
  505.                 INC B
  506.                 ADD A,'A'
  507.                 LD C,A
  508.                 LD A,%10000000
  509. .L1             RLCA
  510.                 DJNZ .L1
  511.                 AND D
  512.                 LD HL,VIRT_DRIVE
  513.                 JR NZ,PRTVIRTDRV2
  514.                 LD (HL)," "
  515.                 INC HL
  516.                 LD (HL),C
  517.                 INC HL
  518.                 LD (HL)," "
  519.                 JR PRTVIRTDRV1
  520.  
  521. PRTVIRTDRV2     LD (HL),"o"
  522.                 INC HL
  523.                 LD (HL),"f"
  524.                 INC HL
  525.                 LD (HL),"f"
  526. PRTVIRTDRV1     LD HL,VIRTUAL_DRV
  527.         RST8 _PRINT_MESSAGE
  528.                 LD HL,ADR_CAT
  529.         RST8  _MOUNTER,_GET_MOUNTED
  530.                 LD HL,ADR_CAT
  531.                 LD DE,MNT_DRV_A
  532.                 CALL COPY_MNTNAME
  533.                 LD L,0x40
  534.                 LD DE,MNT_DRV_B
  535.                 CALL COPY_MNTNAME
  536.                 LD L,0x80
  537.                 LD DE,MNT_DRV_C
  538.                 CALL COPY_MNTNAME
  539.                 LD L,0xC0
  540.                 LD DE,MNT_DRV_D
  541.                 CALL COPY_MNTNAME
  542.                 CALL GET_RAMD_NAME
  543.                 LD HL,MOUNTED_DRV
  544.         RST8 _PRINT_MESSAGE
  545.                 RET
  546.  
  547. COPY_MNTNAME    PUSH HL
  548.                 LD A,(HL)
  549.                 AND A
  550.                 JR NZ,COPY_MNTNAME1
  551.                 LD HL,TXT_NONE
  552.                 LD BC,0x0C
  553.                 JR COPY_MNTNAME3
  554.  
  555. COPY_MNTNAME1   LD BC,8
  556.                 LDIR
  557.                 LD A,"."
  558.                 LD (DE),A
  559.                 INC DE
  560.                 LD C,3
  561. COPY_MNTNAME3   LDIR
  562.                 POP HL
  563.                 RET
  564.  
  565. ; получение имени файла загруженного в рамдиск
  566. GET_RAMD_NAME
  567.         PEC_ON M_SHADOW_BF
  568.                 LD BC,WIN_P2
  569.                 LD A,RAM_RAMDISK
  570.                 OUT (C),A
  571.                 LD DE,CPU2+0x3DFF
  572.                 LD A,(DE)
  573.                 AND A
  574.                 JR Z,GRN1
  575.                 LD HL,GRN1
  576.                 PUSH HL
  577.                 LD HL,IN_RAMDISK
  578.                 LD B,8
  579.                 CALL GRN2
  580.                 LD B,3
  581.                 LD (HL),"."
  582.                 INC HL
  583. GRN2            LD A,(DE)
  584.                 LD (HL),A
  585.                 DEC D
  586.                 INC HL
  587.                 DJNZ GRN2
  588.                 RET
  589.  
  590. GRN1            LD BC,WIN_P2
  591.                 LD A,ZXSTD_CPU2
  592.                 OUT (C),A
  593.         PEC_OFF M_SHADOW_BF
  594.                 RET
  595.  
  596. ; вывод основного меню и надписей
  597. S_FACE          LD A,7
  598.                 CALL CLS
  599.                 LD HL,TXTFULLSCR
  600.         RST8 _PRINT_MESSAGE
  601.         RST8 _VERSION
  602.                 BIT B_INCORRECTFPGA,A
  603.                 JR Z,.L1
  604.                 RES B_INCORRECTFPGA,A
  605.                 AND A
  606.                 JR Z,.L1
  607.                 LD HL,INCORRECTFPGA
  608.         RST8 _PRINT_MESSAGE
  609. .L1             CALL PRT_DRV_SYM                ; печать текущего дисковода
  610.                 CALL PRT_MODES                  ; печать текущего режима
  611.                 CALL PRT_VIRTDRV                ; печать текущего виртуального дисковода
  612.                 XOR A
  613.                 JP DRAW_KOSHAK                  ; вывод 0 фазы кошака
  614.  
  615. SET_EFF7_A_     LD A,(SYSREG1)
  616. SET_EFF7        LD BC,PENT_CONF
  617.                 OUT (C),A
  618.                 RET
  619.  
  620. SET_7FFD_0      LD A,0x10
  621. SET_7FFD        PUSH BC
  622.                 LD BC,CONF_128
  623.                 OUT (C),A
  624.                 POP BC
  625.                 RET
  626.  
  627. MEMSET          CALL CLEAR_128K
  628.                 LD A,(TURBO_NUM)                ; установка TURBO режима
  629.                 AND A
  630.                 LD DE,0x10A3                    ; 3,5MHZ ports EFF7 BIT4=1 xx77 BIT3=0
  631.                 JR Z,MEMSET01
  632.                 DEC A
  633.                 LD DE,0xA3                      ; 7MHZ ports EFF7 BIT4=0 xx77 BIT3=0
  634.                 JR Z,MEMSET01
  635.                 LD DE,0x10AB                    ; 14MHZ ports EFF7 BIT4=1 xx77 BIT3=1
  636. MEMSET01        LD BC,0xFF77
  637.         PEC_ON M_SHADOW_BF
  638.                 OUT (C),E
  639.         PEC_OFF M_SHADOW_BF
  640.                 LD A,D
  641.                 CALL SET_EFF7
  642.                 LD A,(MEMMODE)
  643.                 AND A
  644.                 RET Z                           ; режим полной памяти
  645. MEMSET1         DEC A
  646.                 JR Z,MEMORY48
  647. ; включение режима BASIC128
  648. ON_BIT128       LD A,(SYSREG1)
  649.                 AND 0x10
  650.                 ADD A,4
  651.                 CALL SET_EFF7
  652.                 JR SET_7FFD_0
  653.  
  654. ; включение режима BASI48
  655. MEMORY48        CALL ON_BIT128
  656.                 LD A,0x30
  657.                 JR SET_7FFD
  658.  
  659. ; чтение CMOS и изменение сообщений для вывода на экран об установленных режимах
  660. SET_MODES       LD H,0x0B                       ; читать режим счета часов
  661.                 CALL READCMOS
  662.                 RES 2,L                         ; принудительно включаем бинарный счет
  663.                 CALL WRITECMOS                  ; сохраняем изменения
  664.                 LD H,CMOS_BYTE_01               ; читаем установки турбо и памяти
  665.                 CALL READCMOS
  666.                 AND M_TURBO357
  667.                 RRCA
  668.                 RRCA
  669.                 RRCA
  670.                 LD (SYSREG1),A                  ; содержимое для записи в порт EFF7
  671.                 LD B,A
  672.                 LD A,L
  673.                 AND _128K | _48K | _1MB
  674.                 LD (MEMMODE),A                  ; выбранный режим памяти
  675.                 LD H,CMOS_BYTE_00
  676.                 CALL READCMOS                   ; читаем основные установки
  677.                 LD C,A
  678.                 AND M_TURBO14
  679.                 LD HL,TURBO_NUM                 ; номер турбо режима
  680.                 LD (HL),2                       ; режим 14МГЦ
  681.                 JR NZ,SETMODES04
  682.                 LD A,B
  683.                 DEC (HL)                        ; режим 7МГЦ
  684.                 AND 0x10
  685.                 JR Z,SETMODES04
  686.                 DEC (HL)                        ; режим 3,5МГЦ
  687. SETMODES04      LD A,(HL)                       ; взяли текущий турбо режим
  688.                 ADD A,A
  689.                 ADD A,A
  690.                 LD E,A
  691.                 LD D,0
  692.                 LD HL,TXTTURBOMODE              ; текст турбо режимов
  693.                 ADD HL,DE                       ; перешли на нужный текст
  694.                 LD DE,TXT_SPEED
  695.                 LD A,C
  696.                 LDI
  697.                 LDI
  698.                 LDI
  699.                 LDI                             ; перенесли для вывода экран
  700.                 LD C,A
  701.                 AND M_EMUL_TAPE
  702.                 LD HL,EMTAPLOAD
  703.                 CALL SET_ONOFF                  ; перенос символов для вывода на экран, ON или OFF
  704.                 LD A,C
  705.                 AND M_RELOAD_FONT
  706.                 XOR M_RELOAD_FONT
  707.                 LD HL,EROMLOADFONT
  708.                 CALL SET_ONOFF                  ; перенос символов для вывода на экран, ON или OFF
  709.                 LD A,C
  710.                 AND M_TYPE_FONT
  711.                 PUSH BC
  712.                 LD HL,TXTMODTYPE
  713.                 LD BC,5
  714.                 JR Z,SET_FONT2
  715.                 ADD HL,BC
  716. SET_FONT2       LD DE,ETYPESFONT
  717.                 LDIR
  718.                 POP BC
  719.                 LD A,C
  720.                 AND MKOL_MODES
  721.                 CP KOL_MODES
  722.                 JR C,SETMODES03
  723.                 XOR A
  724. SETMODES03      LD L,A
  725.                 ADD A,A
  726.                 ADD A,L
  727.                 ADD A,A
  728.                 ADD A,A
  729.                 LD H,0
  730.                 LD L,A
  731.                 LD DE,TXT_RESETTO
  732.                 ADD HL,DE
  733.                 LD DE,TXT_RESET
  734.                 LD A,C
  735.                 LD BC,0x0C
  736.                 LDIR
  737.                 LD C,A
  738.                 AND M_PRINTER_AY
  739.                 LD HL,ETXT_AYPRINTER
  740.                 CALL SET_ONOFF                  ; перенос символов для вывода на экран, ON или OFF
  741. SETMODES02      LD A,(MEMMODE)
  742.                 AND A
  743.                 LD HL,T_ALL
  744.                 JR Z,SETMODES01                 ; all memory
  745.                 LD HL,T_48
  746.                 DEC A
  747.                 JR Z,SETMODES01                 ; 48K
  748.                 LD HL,T_128                     ; 128K
  749. SETMODES01      LD DE,TXT_MEM                   ; режим памяти
  750.                 LD A,C
  751.                 LD BC,3
  752.                 LDIR
  753.                 LD H,CMOS_BYTE_01
  754.                 CALL READCMOS
  755.                 PUSH AF
  756.                 AND M_AUTOMOUNT
  757.                 LD HL,ETXT_AUTOMOUNT
  758.                 CALL SET_ONOFF
  759.                 POP AF
  760. ; для резидента HONEY COMANDER
  761.                 AND M_REZIDENT
  762.                 LD HL,TXT_REZIDENT
  763.                 CALL SET_ONOFF
  764.                 LD H,CMOS_BYTE_03
  765.                 CALL READCMOS
  766.                 AND M_KILL_REZIDENT
  767.                 LD HL,TXT_KILLREZID
  768.                 CALL SET_ONOFF
  769.                 LD A,(ERS_FLAGS)
  770.                 AND M_CLOCK_ON
  771.                 RET Z
  772.                 LD DE,VERS_CONF
  773.                 LD L,0
  774.                 CALL GET_VERS_EVO               ; версия базовой конфигурации
  775.                 LD DE,VERS_BOOT
  776.                 LD L,1
  777.                 JP GET_VERS_EVO                 ; версия AVRBOOT
  778.  
  779. ; перенос символов для вывода на экран, ON или OFF
  780. SET_ONOFF       LD DE,"n "
  781.                 JR NZ,SET_ONOFF1
  782.                 LD DE,"ff"
  783. SET_ONOFF1      LD (HL),D
  784.                 INC HL
  785.                 LD (HL),E
  786.                 RET
  787.  
  788. TURBO_7MHZ      LD E,0xA3
  789.                 LD BC,0xFF77
  790.         PEC_ON M_SHADOW_BF
  791.                 OUT (C),E
  792.         PEC_OFF M_SHADOW_BF
  793.                 XOR A
  794.                 JP SET_EFF7
  795.  
  796.         IF 1
  797. ; BC=BC/DE
  798. DIVIDE16        LD HL,0
  799.                 LD A,0x11
  800. .L1             RL C
  801.                 RL B
  802.                 DEC A
  803.                 RET Z
  804.                 ADC HL,HL
  805.                 JR NC,.L2
  806.                 OR A
  807.                 SBC HL,DE
  808.                 JR .L1
  809.  
  810. .L2             SBC HL,DE
  811.                 JR NC,.L3
  812.                 ADD HL,DE
  813. .L3             CCF
  814.                 JR .L1
  815.                
  816. MULT            PUSH BC
  817.                 LD A,B
  818.                 LD HL,0
  819.                 LD B,0x10
  820. .L1             ADD HL,HL
  821.                 RL C
  822.                 RLA    
  823.                 JR NC,.L2
  824.                 ADD HL,DE
  825.                 JR NC,.L2
  826.                 INC C
  827.                 JR NZ,.L2
  828.                 INC A
  829. .L2             DJNZ .L1
  830.                 EX DE,HL
  831.                 LD L,C
  832.                 LD H,A
  833.                 POP BC
  834.                 RET    
  835.         ENDIF
  836.  
  837.         IF 0
  838. ;=============================
  839. ;       16-bit multiply
  840. ;       Tim Paterson
  841. ;=============================
  842. MULTIPLY16      ld hl,0
  843. MUL_HLBC_DE     ld a,b
  844.                 ld b,0x11
  845.                 jr .l1
  846.  
  847. .l2             jr nc,.l3
  848.                 add hl,de
  849. .l3             rr h
  850.                 rr l
  851. .l1             rra
  852.                 rr c
  853.                 djnz .l2
  854.                 ld b,a
  855.                 ret
  856.  
  857. ;=============================
  858. ;       16-bit divide
  859. ;       Tim Paterson
  860. ;=============================
  861. ;Делит HLBC на DE
  862. ;на выходе HL - остаток, BC - частное
  863. DIVIDE16        ld hl,0
  864. DIV_HLBC_DE     ld a,b
  865.                 ld b,0x10
  866.                 rl c
  867.                 rla
  868. .l1             rl l
  869.                 rl h
  870.                 jr c,.l2
  871.                 sbc hl,de
  872.                 jr nc,.l3
  873.                 add hl,de
  874. .l3             ccf
  875. .l4             rl c
  876.                 rla
  877.                 djnz .l1
  878.                 ld b,a
  879.                 ret
  880.  
  881. .l2             or a
  882.                 sbc hl,de
  883.                 jr .l4
  884.         ENDIF
  885.  
  886.                 include menu_execute.a80
  887.                 include flasher.a80
  888.                 include call_cmos.a80
  889.                 include menu_data.a80
  890.                 include fat_boot.a80
  891.                 include mouse.a80
  892.                 include window.a80
  893.                 include call_trdos.a80
  894.                 include koshak.a80
  895.                 include pc_keys_test.a80
  896.                 include bmp_view.a80
  897.  
  898. KOSHAK          binclude kot_anim.bin,9
  899. ICON            binclude icon.bin,9
  900.                        
  901. BAS_VAR         binclude bas_var.bin
  902. EBAS_VAR
  903.  
  904. CLEAR_128K      DI
  905.                 LD HL,0
  906.                 LD A,0x17
  907.                 CALL CLEAR128K0
  908.                 LD A,0x16
  909.                 CALL CLEAR128K0
  910.                 LD A,0x14
  911.                 CALL CLEAR128K0
  912.                 LD A,0x13
  913.                 CALL CLEAR128K0
  914.                 LD A,0x11
  915.                 CALL CLEAR128K0
  916.                 LD A,0x10
  917. CLEAR128K0      LD (TEMP_SAVE_SP),SP
  918.                 LD BC,CONF_128
  919.                 OUT (C),A
  920.                 LD SP,0
  921.                 LD B,0x80
  922. CLEAR128K1      REPT 64
  923.                 PUSH HL
  924.                 ENDM
  925.                 DJNZ CLEAR128K1
  926.                 LD SP,0
  927. TEMP_SAVE_SP    EQU $-2
  928.                 RET
  929.  
  930. ; установка переменных басика и тырдоса, установка выбранного дисковода
  931. SYSTEM          LD HL,BAS_VAR
  932.                 LD DE,KSTATE0
  933.                 LD BC,EBAS_VAR-BAS_VAR
  934.                 LDIR                            ; установка стандартных переменных BASIC и TR-DOS
  935. GET_DRV_SYM     LD A,(ERS_FLAGS)                ; проверяем наличие кмоса
  936.                 AND M_CLOCK_ON
  937.                 JR Z,SET_DRIVE
  938.                 LD H,VIRT_REAL_DRIVE
  939.                 CALL READCMOS
  940.                 RRCA
  941.                 RRCA
  942.                 AND 3
  943. SETUP_DRIVE     LD (DRV_SYM),A                  ; установка выбранного реального дисковода
  944. SET_DRIVE       LD A,(DRV_SYM)                  ; изменение системных переменных для диска
  945.                 LD (TRD_5D19),A
  946.                 LD (TRD_5CF6),A
  947.                 LD L,A
  948.                 LD H,A
  949.                 LD (TRD_5CF8),HL
  950.                 OR 0x3C
  951.                 LD (TRD_5D16),A
  952.                 RET
  953.  
  954. GLUDIN          LD H,CMOS_BYTE_01
  955.                 CALL READCMOS
  956.                 AND M_SOUNDKEYS
  957.                 RET Z
  958.                 LD HL,DIN+0x0D
  959.                 LD A,0x0D
  960. GLUDIN1         LD BC,0xFFFD
  961.                 OUT (C),A
  962.                 LD B,0xBF
  963.                 OUTD
  964.                 SUB 1
  965.                 JR NC,GLUDIN1
  966.                 RET
  967.  
  968. SHUT2AY         LD H,CMOS_BYTE_01
  969.                 CALL READCMOS
  970.                 AND M_SOUNDKEYS
  971.                 RET Z
  972.                 LD DE,0x0E00
  973. SHUT2AY1        DEC D
  974.                 LD H,D
  975.                 LD L,E
  976.                 CALL SHUT2AY2
  977.                 JR NZ,SHUT2AY1                  ; для первых никронов
  978.                 LD HL,0x073F
  979. SHUT2AY2        LD BC,0xFFFD
  980.                 OUT (C),H
  981.                 LD B,0xBF
  982.                 OUT (C),L
  983.                 RET
  984.  
  985. TIMELP          CALL PRINTTIME
  986.                 LD A,HIGH (MOUSE_KEYS)
  987.                 IN A,(LOW (MOUSE_KEYS))         ; кнопки мыши
  988.                 CPL
  989.                 AND 7
  990.                 JR NZ,TIMELP                    ; пока не отпустят
  991.                 RET
  992.  
  993. ; запуск PERFECT COMMANDER
  994. PERFECT         DI
  995.                 LD SP,0xC000
  996.         PEC_ON M_SHADOW_BF
  997.                 LD BC,WIN_A0
  998.                 LD A,ROM_RST81
  999.                 OUT (C),A
  1000.                 LD HL,(ADR_PERFECT)
  1001.                 LD DE,0x5B00
  1002.                 CALL UNPACK
  1003.                 LD BC,WIN_A0
  1004.                 LD A,0x83
  1005.                 OUT (C),A
  1006.         PEC_OFF M_SHADOW_BF
  1007.                 LD A,0xC9
  1008.                 LD (0x66D2),A
  1009.                 LD SP,0x5FE4
  1010.                 JP 0x8A1D
  1011.  
  1012. ISDOS_BOOT      LD HL,ISDOS_BOOT1
  1013.                 LD DE,0x5E00
  1014.                 LD BC,ISDOS_BOOT2-ISDOS_BOOT1
  1015.                 LDIR
  1016.                 JP 0x5E00
  1017.  
  1018.                 include hdd_detect.a80
  1019.  
  1020. ISDOS_BOOT1     include isdos_boot.a80
  1021. ISDOS_BOOT2
  1022.  
  1023. SEL_FAT_DRV     ; адрес создания текста, адресов вызывов и списка горячих клавиш меню выбора разделов FAT
  1024.