Subversion Repositories pentevo

Rev

Rev 999 | Rev 1035 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1.  
  2. ; LAST UPDATE: 05.10.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 RESTORE_KOSHAK             ; нажато нечто на клаве, сброс счетчика кошака
  227.                 CALL RESET_SCREENSAVER
  228.                 RES 5,(IY+1)                    ; на клавиатуре ничего не нажато
  229.                 LD HL,LAST_K
  230.                 LD A,(HL)                       ; взяли нажатую клавишу
  231.                 LD B,0
  232.                 LD HL,MAIN_KEYS
  233.                 LD C,(HL)                       ; количество доступных кнопок
  234.                 LD D,C
  235.                 INC HL
  236.                 CPIR
  237.                 JR NZ,NOMAINKEYS                ; ничего не нашли, далее смотрим кнопки текущего окна
  238.                                                 ; нажато что-то из главных кнопок, доступных всегда
  239.                 LD HL,ADREXEKEYS
  240.                 LD A,D                          ; количество кнопок в таблице -1
  241.                 SUB C                           ; получили выбранный номер
  242.                 DEC A
  243.                 JR JUMP2HL
  244.  
  245. ; проверка хоткеев в текущем окне
  246. NOMAINKEYS      LD L,(IX+_ADR_HOTKEY_L)
  247.                 LD H,(IX+_ADR_HOTKEY_H)
  248.                 LD C,A
  249.                 LD A,H
  250.                 OR L
  251.                 JP Z,MAINLOP                    ; если списка нет, продолжаем опрос
  252.                 LD A,C
  253.                 LD C,(IX+_V_SIZE)
  254.                 LD E,(HL)
  255.                 INC HL
  256.                 DEC C                           ; количество кнопок
  257.                 DEC C                           ; высота окна -2
  258.                 LD D,C
  259.                 LD B,0
  260.                 CPIR                            ; сканирование списка заданных клавиш
  261.                 JR NZ,OSTAT_KEYS
  262.                 LD A,D                          ; высота окна
  263.                 SUB C
  264.                 DEC A                           ; получили номер нажатой кнопки и -1
  265.                 LD (IX+_NUM_PKT),A              ; номер пункта в окне
  266.                 LD (IX+_TEK_PKT_L),A            ; номер нажатой клавиши по указанному списку
  267. ENTER           LD A,(ERS_FLAGS)
  268.                 AND M_MOUSE_ON
  269.                 CALL NZ,TIMELP                  ; обновление времени если оно изменилось       
  270.                 CALL REST2X2                    ; стерли курсор мыши
  271.                 CALL GLUDIN                     ; бумкнули в AY
  272.                 LD A,(IX+_NUM_PKT)              ; номер из списка который вызвать
  273. JUMP2HL1        LD L,(IX+_ADR_PRG_L)
  274.                 LD H,(IX+_ADR_PRG_H)            ; взяли список адресов 1 из которых будем вызывать
  275. JUMP2HL         ADD A,A
  276.                 ADD A,L
  277.                 LD L,A
  278.                 ADC A,H
  279.                 SUB L
  280.                 LD H,A
  281.                 LD A,(HL)
  282.                 INC HL
  283.                 LD H,(HL)
  284.                 LD L,A
  285.                 JP (HL)
  286.  
  287. OSTAT_KEYS      EX AF,AF'
  288.                 LD A,E
  289.                 SUB D
  290.                 JP Z,MAINLOP
  291.                 LD C,A
  292.                 EX AF,AF'
  293.                 CPIR
  294.                 JP NZ,MAINLOP
  295.                 LD A,E
  296.                 SUB C
  297.                 DEC A
  298.                 JR JUMP2HL1
  299.  
  300. ; изменение режима памяти
  301. CHNGMODE        LD HL,MEMMODE
  302.                 DEC (HL)                        ; сменили режим памяти
  303.                 JP P,CHNGMODEY
  304.                 LD (HL),2                       ; если перешли через 0, то выставили режим 48
  305. CHNGMODEY       LD A,(ERS_FLAGS)
  306.                 AND M_CLOCK_ON                  ; проверка наличия кмоса
  307.                 RET Z
  308.                 LD A,(ERS_FLAGS)
  309.                 AND M_EMU_TAPE
  310.                 RLCA
  311.                 RLCA
  312.                 LD L,A
  313.                 LD A,(MEMMODE)
  314.                 OR L
  315.                 LD L,A
  316. CHNGMODEY1      LD A,(SYSREG1)
  317.                 AND 0x10
  318.                 RLCA
  319.                 RLCA
  320.                 RLCA
  321.                 OR L
  322.                 LD C,A
  323.                 LD H,CMOS_BYTE_01
  324.                 CALL READCMOS
  325.                 AND %01111100
  326.                 OR C
  327. CHANGE_MODES    LD L,A
  328.                 CALL WRITECMOS                  ; сохранили в кмос измененый режим
  329.                 CALL REST2X2
  330.                 CALL SET_MODES
  331.                 CALL PRT_MODES
  332.                 LD A,(ERS_FLAGS)
  333.                 AND M_MOUSE_ON
  334.                 JP Z,MAINLOP
  335.                 CALL DRAW_MOUSE
  336.                 CALL TIMELP
  337.                 JP MAINLOP
  338.  
  339. ; изменение режима турбо 0=3,5MHZ, 1=7MHZ, 2-14MHZ
  340. CHNGTURBO       LD HL,TURBO_NUM
  341.                 INC (HL)                        ; сменили turbo режим
  342.                 LD A,(HL)
  343.                 CP 3
  344.                 JR C,CHNGTURBO1
  345.                 LD (HL),0                       ; если перешли через 0, то выставили режим 14MHZ
  346. CHNGTURBO1      LD A,(HL)
  347.                 AND A
  348.                 LD DE,0x1000
  349.                 JR Z,CHNGTURBO2
  350.                 DEC A
  351.                 LD DE,0
  352.                 JR Z,CHNGTURBO2
  353.                 LD DE,0X10*0X100+M_TURBO14
  354. CHNGTURBO2      LD A,D
  355.                 LD HL,SYSREG1
  356.                 LD A,(HL)
  357.                 AND %11101111                   ; инверсия бита турборежима
  358.                 OR D
  359.                 LD (HL),A
  360.                 LD H,CMOS_BYTE_00
  361.                 CALL READCMOS
  362.                 AND M_TURBO14!0XFF
  363.                 OR E
  364.                 LD L,A
  365.                 LD H,CMOS_BYTE_00
  366.                 CALL WRITECMOS
  367.                 JP CHNGMODEY
  368.  
  369. CHNGTAPMODE     LD H,CMOS_BYTE_00
  370.                 CALL READCMOS
  371.                 XOR M_EMUL_TAPE
  372.                 JR CHANGE_MODES
  373.  
  374. CHNGGLUKMOD     LD H,CMOS_BYTE_00
  375.                 CALL READCMOS
  376.                 AND MKOL_MODES!0xFF
  377.                 LD C,A
  378.                 LD A,L
  379.                 AND MKOL_MODES
  380.                 INC A
  381.                 CP KOL_MODES
  382.                 JR C,CHNGGLUKMOD1
  383.                 XOR A
  384. CHNGGLUKMOD1    OR C
  385.                 LD L,A
  386.                 JR CHANGE_MODES
  387.  
  388. EN_AUTOMNT      LD H,CMOS_BYTE_01
  389.                 CALL READCMOS
  390.                 XOR M_AUTOMOUNT
  391.                 JP CHANGE_MODES
  392.  
  393. EN_LOADFONT     LD H,CMOS_BYTE_00
  394.                 CALL READCMOS
  395.                 XOR M_RELOAD_FONT
  396.                 JP CHANGE_MODES
  397.  
  398. SET_TYPEFONT    LD H,CMOS_BYTE_00
  399.                 CALL READCMOS
  400.                 XOR M_TYPE_FONT
  401.                 PUSH AF
  402.                 PUSH HL
  403.                 AND M_TYPE_FONT
  404.                 JR Z,SETTYPEFONT
  405.                 LD A,1
  406. SETTYPEFONT
  407.         RST8 _SETUP_FONT
  408.                 POP HL
  409.                 POP AF
  410.                 JP CHANGE_MODES
  411.  
  412. ; включение/выключениe отображения часов
  413. CMOS_ONOFF      LD A,(ERS_FLAGS)
  414.                 AND M_CLOCK_ON                  ; проверка наличия кмоса
  415.                 JP Z,MAINLOP
  416.                 LD H,CMOS_BYTE_01
  417.                 CALL READCMOS
  418.                 XOR M_CLOCK_VIEW
  419.                 LD L,A
  420.                 PUSH AF
  421.                 LD H,CMOS_BYTE_01
  422.                 CALL WRITECMOS
  423.                 POP AF
  424.                 AND M_CLOCK_VIEW
  425.                 JP Z,MAINLOP
  426.                 LD HL,TIME_OFF
  427.         RST8 _PRINT_MESSAGE
  428.                 JP MAINLOP
  429.  
  430. ;включение/выключение курсора мыши
  431. MOUSE_ONOFF     LD HL,ERS_FLAGS
  432.                 LD A,(HL)
  433.                 XOR M_MOUSE_ON                  ; инверсия отображения мыши
  434.                 LD (HL),A
  435.                 AND M_MOUSE_ON
  436.                 CALL NZ,DETECTMOUSE             ; если включили, проверяем наличие
  437.                 CALL NC,REST2X2                 ; если мышь не найдена, то выключаем отображение
  438.                 JP MAINLOP
  439.  
  440. ;ожидание нажатия чего-нибудь после ошибки
  441. EXIT4ERROR      RES 5,(IY+1)                    ; на клавиатуре ничего не нажато
  442.                 LD BC,MOUSE_KEYS
  443.                 IN D,(C)
  444. E4E1            CALL PRINTTIME
  445.                 EI
  446.                 HALT
  447.                 BIT 5,(IY+1)
  448.                 JR NZ,E4E3
  449.                 LD A,(ERS_FLAGS)
  450.                 AND M_MOUSE_ON
  451.                 JR NZ,E4E1
  452.                 LD A,HIGH (MOUSE_KEYS)
  453.                 IN A,(LOW (MOUSE_KEYS))
  454.                 CP D
  455.                 JR Z,E4E1
  456. E4E2            EX AF,AF'
  457.                 CALL TIMELP
  458.                 EX AF,AF'
  459.                 RRA
  460.                 RET
  461.  
  462. E4E3            XOR A
  463.                 IN A,(0XFE)
  464.                 CPL
  465.                 AND 0x1F
  466.                 JR NZ,E4E3
  467.                 LD (LAST_K),A
  468.                 RES 5,(IY+1)                    ; на клавиатуре ничего не нажато
  469.                 RET
  470.  
  471. ; печать текущего выбранного дисковода
  472. PRT_DRV_SYM     LD A,(TRD_5CF8)
  473.                 ADD A,"A"
  474.                 LD (TXT_DRIVE),A
  475.                 LD HL,TRDDRV_MODE
  476.         RST8 _PRINT_MESSAGE
  477.                 RET
  478.  
  479. ; распечатка текущего режима
  480. PRT_MODES       LD HL,SPEED_MODE
  481.         RST8 _PRINT_MESSAGE
  482.                 LD HL,MEM_MODE
  483.         RST8 _PRINT_MESSAGE
  484.                 LD HL,EMUTAPLOAD
  485.         RST8 _PRINT_MESSAGE
  486.                 LD HL,SET_RESET
  487.         RST8 _PRINT_MESSAGE
  488.                 LD HL,ROMLOADFONT
  489.         RST8 _PRINT_MESSAGE
  490.                 LD HL,TYPESFONT
  491.         RST8 _PRINT_MESSAGE
  492.                 LD HL,TXT_AUTOMOUNT
  493.         RST8 _PRINT_MESSAGE
  494.                 RET
  495.  
  496. ; распечатка текущего виртуального дисковода
  497. PRT_VIRTDRV
  498.         RST8 _MOUNTER,_GET_VIRT_BITS
  499.                 LD D,A
  500.                 LD H,VIRT_REAL_DRIVE
  501.                 CALL READCMOS
  502.                 AND 3
  503.                 LD B,A
  504.                 INC B
  505.                 ADD A,'A'
  506.                 LD C,A
  507.                 LD A,%10000000
  508. .L1             RLCA
  509.                 DJNZ .L1
  510.                 AND D
  511.                 LD HL,VIRT_DRIVE
  512.                 JR NZ,PRTVIRTDRV2
  513.                 LD (HL)," "
  514.                 INC HL
  515.                 LD (HL),C
  516.                 INC HL
  517.                 LD (HL)," "
  518.                 JR PRTVIRTDRV1
  519.  
  520. PRTVIRTDRV2     LD (HL),"o"
  521.                 INC HL
  522.                 LD (HL),"f"
  523.                 INC HL
  524.                 LD (HL),"f"
  525. PRTVIRTDRV1     LD HL,VIRTUAL_DRV
  526.         RST8 _PRINT_MESSAGE
  527.                 LD HL,ADR_CAT
  528.         RST8  _MOUNTER,_GET_MOUNTED
  529.                 LD HL,ADR_CAT
  530.                 LD DE,MNT_DRV_A
  531.                 CALL COPY_MNTNAME
  532.                 LD L,0x40
  533.                 LD DE,MNT_DRV_B
  534.                 CALL COPY_MNTNAME
  535.                 LD L,0x80
  536.                 LD DE,MNT_DRV_C
  537.                 CALL COPY_MNTNAME
  538.                 LD L,0xC0
  539.                 LD DE,MNT_DRV_D
  540.                 CALL COPY_MNTNAME
  541.                 CALL GET_RAMD_NAME
  542.                 LD HL,MOUNTED_DRV
  543.         RST8 _PRINT_MESSAGE
  544.                 RET
  545.  
  546. COPY_MNTNAME    PUSH HL
  547.                 LD A,(HL)
  548.                 AND A
  549.                 JR NZ,COPY_MNTNAME1
  550.                 LD HL,TXT_NONE
  551.                 LD BC,0x0C
  552.                 JR COPY_MNTNAME3
  553.  
  554. COPY_MNTNAME1   LD BC,8
  555.                 LDIR
  556.                 LD A,"."
  557.                 LD (DE),A
  558.                 INC DE
  559.                 LD C,3
  560. COPY_MNTNAME3   LDIR
  561.                 POP HL
  562.                 RET
  563.  
  564. ; получение имени файла загруженного в рамдиск
  565. GET_RAMD_NAME
  566.         PEC_ON M_SHADOW_BF
  567.                 LD BC,WIN_P2
  568.                 LD A,RAM_RAMDISK
  569.                 OUT (C),A
  570.                 LD DE,CPU2+0x3DFF
  571.                 LD A,(DE)
  572.                 AND A
  573.                 JR Z,GRN1
  574.                 LD HL,GRN1
  575.                 PUSH HL
  576.                 LD HL,IN_RAMDISK
  577.                 LD B,8
  578.                 CALL GRN2
  579.                 LD B,3
  580.                 LD (HL),"."
  581.                 INC HL
  582. GRN2            LD A,(DE)
  583.                 LD (HL),A
  584.                 DEC D
  585.                 INC HL
  586.                 DJNZ GRN2
  587.                 RET
  588.  
  589. GRN1            LD BC,WIN_P2
  590.                 LD A,ZXSTD_CPU2
  591.                 OUT (C),A
  592.         PEC_OFF M_SHADOW_BF
  593.                 RET
  594.  
  595. ; вывод основного меню и надписей
  596. S_FACE          LD A,7
  597.                 CALL CLS
  598.                 LD HL,TXTFULLSCR
  599.         RST8 _PRINT_MESSAGE
  600.         RST8 _VERSION
  601.                 BIT B_INCORRECTFPGA,A
  602.                 JR Z,.L1
  603.                 RES B_INCORRECTFPGA,A
  604.                 AND A
  605.                 JR Z,.L1
  606.                 LD HL,INCORRECTFPGA
  607.         RST8 _PRINT_MESSAGE
  608. .L1             CALL PRT_DRV_SYM                ; печать текущего дисковода
  609.                 CALL PRT_MODES                  ; печать текущего режима
  610.                 CALL PRT_VIRTDRV                ; печать текущего виртуального дисковода
  611.                 XOR A
  612.                 JP DRAW_KOSHAK                  ; вывод 0 фазы кошака
  613.  
  614. SET_EFF7_A_     LD A,(SYSREG1)
  615. SET_EFF7        LD BC,PENT_CONF
  616.                 OUT (C),A
  617.                 RET
  618.  
  619. SET_7FFD_0      LD A,0x10
  620. SET_7FFD        PUSH BC
  621.                 LD BC,CONF_128
  622.                 OUT (C),A
  623.                 POP BC
  624.                 RET
  625.  
  626. MEMSET          CALL CLEAR_128K
  627.                 LD A,(TURBO_NUM)                ; установка TURBO режима
  628.                 AND A
  629.                 LD DE,0x10A3                    ; 3,5MHZ ports EFF7 BIT4=1 xx77 BIT3=0
  630.                 JR Z,MEMSET01
  631.                 DEC A
  632.                 LD DE,0xA3                      ; 7MHZ ports EFF7 BIT4=0 xx77 BIT3=0
  633.                 JR Z,MEMSET01
  634.                 LD DE,0x10AB                    ; 14MHZ ports EFF7 BIT4=1 xx77 BIT3=1
  635. MEMSET01        LD BC,0xFF77
  636.         PEC_ON M_SHADOW_BF
  637.                 OUT (C),E
  638.         PEC_OFF M_SHADOW_BF
  639.                 LD A,D
  640.                 CALL SET_EFF7
  641.                 LD A,(MEMMODE)
  642.                 AND A
  643.                 RET Z                           ; режим полной памяти
  644. MEMSET1         DEC A
  645.                 JR Z,MEMORY48
  646. ; включение режима BASIC128
  647. ON_BIT128       LD A,(SYSREG1)
  648.                 AND 0x10
  649.                 ADD A,4
  650.                 CALL SET_EFF7
  651.                 JR SET_7FFD_0
  652.  
  653. ; включение режима BASI48
  654. MEMORY48        CALL ON_BIT128
  655.                 LD A,0x30
  656.                 JR SET_7FFD
  657.  
  658. ; чтение CMOS и изменение сообщений для вывода на экран об установленных режимах
  659. SET_MODES       LD H,0x0B                       ; читать режим счета часов
  660.                 CALL READCMOS
  661.                 RES 2,L                         ; принудительно включаем бинарный счет
  662.                 CALL WRITECMOS                  ; сохраняем изменения
  663.                 LD H,CMOS_BYTE_01               ; читаем установки турбо и памяти
  664.                 CALL READCMOS
  665.                 AND M_TURBO357
  666.                 RRCA
  667.                 RRCA
  668.                 RRCA
  669.                 LD (SYSREG1),A                  ; содержимое для записи в порт EFF7
  670.                 LD B,A
  671.                 LD A,L
  672.                 AND _128K | _48K | _1MB
  673.                 LD (MEMMODE),A                  ; выбранный режим памяти
  674.                 LD H,CMOS_BYTE_00
  675.                 CALL READCMOS                   ; читаем основные установки
  676.                 LD C,A
  677.                 AND M_TURBO14
  678.                 LD HL,TURBO_NUM                 ; номер турбо режима
  679.                 LD (HL),2                       ; режим 14МГЦ
  680.                 JR NZ,SETMODES04
  681.                 LD A,B
  682.                 DEC (HL)                        ; режим 7МГЦ
  683.                 AND 0x10
  684.                 JR Z,SETMODES04
  685.                 DEC (HL)                        ; режим 3,5МГЦ
  686. SETMODES04      LD A,(HL)                       ; взяли текущий турбо режим
  687.                 ADD A,A
  688.                 ADD A,A
  689.                 LD E,A
  690.                 LD D,0
  691.                 LD HL,TXTTURBOMODE              ; текст турбо режимов
  692.                 ADD HL,DE                       ; перешли на нужный текст
  693.                 LD DE,TXT_SPEED
  694.                 LD A,C
  695.                 LDI
  696.                 LDI
  697.                 LDI
  698.                 LDI                             ; перенесли для вывода экран
  699.                 LD C,A
  700.                 AND M_EMUL_TAPE
  701.                 LD HL,EMTAPLOAD
  702.                 CALL SET_ONOFF                  ; перенос символов для вывода на экран, ON или OFF
  703.                 LD A,C
  704.                 AND M_RELOAD_FONT
  705.                 XOR M_RELOAD_FONT
  706.                 LD HL,EROMLOADFONT
  707.                 CALL SET_ONOFF                  ; перенос символов для вывода на экран, ON или OFF
  708.                 LD A,C
  709.                 AND M_TYPE_FONT
  710.                 PUSH BC
  711.                 LD HL,TXTMODTYPE
  712.                 LD BC,5
  713.                 JR Z,SET_FONT2
  714.                 ADD HL,BC
  715. SET_FONT2       LD DE,ETYPESFONT
  716.                 LDIR
  717.                 POP BC
  718.                 LD A,C
  719.                 AND MKOL_MODES
  720.                 CP KOL_MODES
  721.                 JR C,SETMODES03
  722.                 XOR A
  723. SETMODES03      LD L,A
  724.                 ADD A,A
  725.                 ADD A,L
  726.                 ADD A,A
  727.                 ADD A,A
  728.                 LD H,0
  729.                 LD L,A
  730.                 LD DE,TXT_RESETTO
  731.                 ADD HL,DE
  732.                 LD DE,TXT_RESET
  733.                 LD A,C
  734.                 LD BC,0x0C
  735.                 LDIR
  736.                 LD C,A
  737.                 AND M_PRINTER_AY
  738.                 LD HL,ETXT_AYPRINTER
  739.                 CALL SET_ONOFF                  ; перенос символов для вывода на экран, ON или OFF
  740. SETMODES02      LD A,(MEMMODE)
  741.                 AND A
  742.                 LD HL,T_ALL
  743.                 JR Z,SETMODES01                 ; all memory
  744.                 LD HL,T_48
  745.                 DEC A
  746.                 JR Z,SETMODES01                 ; 48K
  747.                 LD HL,T_128                     ; 128K
  748. SETMODES01      LD DE,TXT_MEM                   ; режим памяти
  749.                 LD A,C
  750.                 LD BC,3
  751.                 LDIR
  752.                 LD H,CMOS_BYTE_01
  753.                 CALL READCMOS
  754.                 PUSH AF
  755.                 AND M_AUTOMOUNT
  756.                 LD HL,ETXT_AUTOMOUNT
  757.                 CALL SET_ONOFF
  758.                 POP AF
  759. ; для резидента HONEY COMANDER
  760.         IFDEF REZIDENT
  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.         ENDIF;REZIDENT
  770.                 LD A,(ERS_FLAGS)
  771.                 AND M_CLOCK_ON
  772.                 RET Z
  773.                 LD DE,VERS_CONF
  774.                 LD L,0
  775.                 CALL GET_VERS_EVO               ; версия базовой конфигурации
  776.                 LD DE,VERS_BOOT
  777.                 LD L,1
  778.                 JP GET_VERS_EVO                 ; версия AVRBOOT
  779.  
  780. ; перенос символов для вывода на экран, ON или OFF
  781. SET_ONOFF       LD DE,"n "
  782.                 JR NZ,SET_ONOFF1
  783.                 LD DE,"ff"
  784. SET_ONOFF1      LD (HL),D
  785.                 INC HL
  786.                 LD (HL),E
  787.                 RET
  788.  
  789. TURBO_7MHZ      LD E,0xA3
  790.                 LD BC,0xFF77
  791.         PEC_ON M_SHADOW_BF
  792.                 OUT (C),E
  793.         PEC_OFF M_SHADOW_BF
  794.                 XOR A
  795.                 JP SET_EFF7
  796.  
  797.         IF 1
  798. ; BC=BC/DE
  799. DIVIDE16        LD HL,0
  800.                 LD A,0x11
  801. .L1             RL C
  802.                 RL B
  803.                 DEC A
  804.                 RET Z
  805.                 ADC HL,HL
  806.                 JR NC,.L2
  807.                 OR A
  808.                 SBC HL,DE
  809.                 JR .L1
  810.  
  811. .L2             SBC HL,DE
  812.                 JR NC,.L3
  813.                 ADD HL,DE
  814. .L3             CCF
  815.                 JR .L1
  816.                
  817. MULT            PUSH BC
  818.                 LD A,B
  819.                 LD HL,0
  820.                 LD B,0x10
  821. .L1             ADD HL,HL
  822.                 RL C
  823.                 RLA    
  824.                 JR NC,.L2
  825.                 ADD HL,DE
  826.                 JR NC,.L2
  827.                 INC C
  828.                 JR NZ,.L2
  829.                 INC A
  830. .L2             DJNZ .L1
  831.                 EX DE,HL
  832.                 LD L,C
  833.                 LD H,A
  834.                 POP BC
  835.                 RET    
  836.         ENDIF
  837.  
  838.         IF 0
  839. ;=============================
  840. ;       16-bit multiply
  841. ;       Tim Paterson
  842. ;=============================
  843. MULTIPLY16      ld hl,0
  844. MUL_HLBC_DE     ld a,b
  845.                 ld b,0x11
  846.                 jr .l1
  847.  
  848. .l2             jr nc,.l3
  849.                 add hl,de
  850. .l3             rr h
  851.                 rr l
  852. .l1             rra
  853.                 rr c
  854.                 djnz .l2
  855.                 ld b,a
  856.                 ret
  857.  
  858. ;=============================
  859. ;       16-bit divide
  860. ;       Tim Paterson
  861. ;=============================
  862. ;Делит HLBC на DE
  863. ;на выходе HL - остаток, BC - частное
  864. DIVIDE16        ld hl,0
  865. DIV_HLBC_DE     ld a,b
  866.                 ld b,0x10
  867.                 rl c
  868.                 rla
  869. .l1             rl l
  870.                 rl h
  871.                 jr c,.l2
  872.                 sbc hl,de
  873.                 jr nc,.l3
  874.                 add hl,de
  875. .l3             ccf
  876. .l4             rl c
  877.                 rla
  878.                 djnz .l1
  879.                 ld b,a
  880.                 ret
  881.  
  882. .l2             or a
  883.                 sbc hl,de
  884.                 jr .l4
  885.         ENDIF
  886.  
  887.                 include menu_execute.a80
  888.                 include flasher.a80
  889.                 include call_cmos.a80
  890.                 include menu_data.a80
  891.                 include fat_boot.a80
  892.                 include mouse.a80
  893.                 include window.a80
  894.                 include call_trdos.a80
  895.                 include koshak.a80
  896.                 include pc_keys_test.a80
  897.                 include bmp_view.a80
  898.  
  899. KOSHAK          binclude kot_anim.bin,9
  900. ICON            binclude icon.bin,9
  901.                        
  902. BAS_VAR         binclude bas_var.bin
  903. EBAS_VAR
  904.  
  905. CLEAR_128K      DI
  906.                 LD HL,0
  907.                 LD A,0x17
  908.                 CALL CLEAR128K0
  909.                 LD A,0x16
  910.                 CALL CLEAR128K0
  911.                 LD A,0x14
  912.                 CALL CLEAR128K0
  913.                 LD A,0x13
  914.                 CALL CLEAR128K0
  915.                 LD A,0x11
  916.                 CALL CLEAR128K0
  917.                 LD A,0x10
  918. CLEAR128K0      LD (TEMP_SAVE_SP),SP
  919.                 LD BC,CONF_128
  920.                 OUT (C),A
  921.                 LD SP,0
  922.                 LD B,0x80
  923. CLEAR128K1      REPT 64
  924.                 PUSH HL
  925.                 ENDM
  926.                 DJNZ CLEAR128K1
  927.                 LD SP,0
  928. TEMP_SAVE_SP    EQU $-2
  929.                 RET
  930.  
  931. ; установка переменных басика и тырдоса, установка выбранного дисковода
  932. SYSTEM          LD HL,BAS_VAR
  933.                 LD DE,KSTATE0
  934.                 LD BC,EBAS_VAR-BAS_VAR
  935.                 LDIR                            ; установка стандартных переменных BASIC и TR-DOS
  936. GET_DRV_SYM     LD A,(ERS_FLAGS)                ; проверяем наличие кмоса
  937.                 AND M_CLOCK_ON
  938.                 JR Z,SET_DRIVE
  939.                 LD H,VIRT_REAL_DRIVE
  940.                 CALL READCMOS
  941.                 RRCA
  942.                 RRCA
  943.                 AND 3
  944. SETUP_DRIVE     LD (DRV_SYM),A                  ; установка выбранного реального дисковода
  945. SET_DRIVE       LD A,(DRV_SYM)                  ; изменение системных переменных для диска
  946.                 LD (TRD_5D19),A
  947.                 LD (TRD_5CF6),A
  948.                 LD L,A
  949.                 LD H,A
  950.                 LD (TRD_5CF8),HL
  951.                 OR 0x3C
  952.                 LD (TRD_5D16),A
  953.                 RET
  954.  
  955. GLUDIN          LD H,CMOS_BYTE_01
  956.                 CALL READCMOS
  957.                 AND M_SOUNDKEYS
  958.                 RET Z
  959.                 LD HL,DIN+0x0D
  960.                 LD A,0x0D
  961. GLUDIN1         LD BC,0xFFFD
  962.                 OUT (C),A
  963.                 LD B,0xBF
  964.                 OUTD
  965.                 SUB 1
  966.                 JR NC,GLUDIN1
  967.                 RET
  968.  
  969. SHUT2AY         LD H,CMOS_BYTE_01
  970.                 CALL READCMOS
  971.                 AND M_SOUNDKEYS
  972.                 RET Z
  973.                 LD DE,0x0E00
  974. SHUT2AY1        DEC D
  975.                 LD H,D
  976.                 LD L,E
  977.                 CALL SHUT2AY2
  978.                 JR NZ,SHUT2AY1                  ; для первых никронов
  979.                 LD HL,0x073F
  980. SHUT2AY2        LD BC,0xFFFD
  981.                 OUT (C),H
  982.                 LD B,0xBF
  983.                 OUT (C),L
  984.                 RET
  985.  
  986. TIMELP          CALL PRINTTIME
  987.                 LD A,HIGH (MOUSE_KEYS)
  988.                 IN A,(LOW (MOUSE_KEYS))         ; кнопки мыши
  989.                 CPL
  990.                 AND 7
  991.                 JR NZ,TIMELP                    ; пока не отпустят
  992.                 RET
  993.  
  994. ; запуск PERFECT COMMANDER
  995. PERFECT         DI
  996.                 LD SP,0xC000
  997.         PEC_ON M_SHADOW_BF
  998.                 LD BC,WIN_A0
  999.                 LD A,ROM_RST81
  1000.                 OUT (C),A
  1001.                 LD HL,(ADR_PERFECT)
  1002.                 LD DE,0x5B00
  1003.                 CALL UNPACK
  1004.                 LD BC,WIN_A0
  1005.                 LD A,0x83
  1006.                 OUT (C),A
  1007.         PEC_OFF M_SHADOW_BF
  1008.                 LD A,0xC9
  1009.                 LD (0x66D2),A
  1010.                 LD SP,0x5FE4
  1011.                 JP 0x8A1D
  1012.  
  1013. ISDOS_BOOT      LD HL,ISDOS_BOOT1
  1014.                 LD DE,0x5E00
  1015.                 LD BC,ISDOS_BOOT2-ISDOS_BOOT1
  1016.                 LDIR
  1017.                 JP 0x5E00
  1018.  
  1019.                 include hdd_detect.a80
  1020.  
  1021. ISDOS_BOOT1     include isdos_boot.a80
  1022. ISDOS_BOOT2
  1023.  
  1024. SEL_FAT_DRV     ; адрес создания текста, адресов вызывов и списка горячих клавиш меню выбора разделов FAT
  1025.