Subversion Repositories pentevo

Rev

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

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