Subversion Repositories pentevo

Rev

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

  1.  
  2. ; LAST UPDATE: 15.01.2022 savelij
  3.  
  4. ; загрузка выбранного шрифта
  5. LOAD_FONT       LD HL,FONTS
  6.                 LD DE,CMP4FONTS
  7.                 JR FATBOOT4
  8.  
  9. ; загрузка tap файла
  10. EMULTAPLOAD     LD HL,TAPES
  11.                 LD DE,CMP4TAPES
  12.                 JR FATBOOT4
  13.  
  14. ; загрузка полного rom файла для обновления 512KB
  15. LOAD4FLASH_FULL LD HL,ROMS
  16.                 LD DE,CMP4ROMS
  17.                 LD A,8
  18.                 LD (CMP_ROMSIZE),A
  19.                 JR FATBOOT4
  20.  
  21. ; загрузка USER ROM файла для обновления 64KB
  22. LOAD4FLASH_CUST LD HL,ROMS
  23.                 LD DE,CMP4ROMS
  24.                 LD A,1
  25.                 LD (CMP_ROMSIZE),A
  26.                 JR FATBOOT4
  27.  
  28. ; загрузка образа на рамдиск
  29. COPYIMAGE       LD HL,IMAGES
  30.                 LD DE,CMP4IMAGE
  31.                 JR FATBOOT4
  32.  
  33. ; загрузка HOBETA файла для запуска
  34. FATBOOT         LD HL,HOBETA
  35.                 LD DE,CMP4HOBETA
  36. FATBOOT4        LD (GDE_EXT_FILES),HL
  37.                 LD (CMP_FOUNDED),DE
  38. SELECT_DEVICE   DI
  39.                 LD HL,ERS_FLAGS
  40.                 SET B_RUN_FAT,(HL)              ; работать будем с FAT
  41.         RST8 _COM_DEV,_KOL_VOL
  42.                 LD A,E
  43.                 AND A
  44.                 JP Z,_STUPID
  45.                 LD HL,ADR_CAT-0X100             ; адрес куда положить таблицу найденных разделов
  46.         RST8 _COM_DEV,_GET_FNDVOLUME            ; получение таблицы найденных разделов
  47.                 LD B,E                          ; счетчик количества найденных разделов
  48.                 LD IX,SEL_FAT_DEV               ; адрес описателя окна выбора разделов
  49.                 LD (IX+_NUM_PKT),D              ; номер пункта в окне
  50.                 LD (IX+_TEK_PKT_L),D            ; номер текущего пункта
  51.                 LD (IX+_NUM_KOL_L),E            ; количество пунктов в окне
  52.                 INC E
  53.                 INC E
  54.                 LD (IX+_V_SIZE),E               ; установили высоту выводимого окна
  55.                 LD DE,6                         ; шаг по таблице найденных разделов -2
  56.                 EXX
  57.                 LD HL,TXT_FAT_SEL
  58.                 LD DE,SEL_FAT_DRV               ; адрес где будет формироваться текст окна выбора разделов
  59.                 LD BC,ETXT_FAT_SEL-TXT_FAT_SEL
  60.                 LDIR
  61.                 EX DE,HL
  62.                 EXX
  63. FATBOOT1        EXX
  64.                 LD (HL),0X0D
  65.                 INC HL
  66.                 LD (HL),3
  67.                 INC HL
  68.                 EXX
  69.                 LD A,(HL)                       ; взяли номер раздела
  70.                 INC HL
  71.                 LD C,(HL)                       ; MASTER или SLAVE
  72.                 INC HL
  73.                 ADD A,C
  74.                 ADD A,C
  75.                 SUB 4                           ; -4, ибо дисководы не учитываются
  76.                 EXX
  77.                 EX DE,HL
  78.                 LD HL,TXT4MENU_DEVICE           ; адрес таблицы текста о разделах
  79.                 LD C,A
  80.                 ADD A,A
  81.                 ADD A,A
  82.                 ADD A,C
  83.                 ADD A,A
  84.                 ADD A,A                         ; умножено на 20
  85.                 LD C,A
  86.                 LD B,0
  87.                 ADD HL,BC                       ; получили адрес откуда текст взять
  88.                 LD BC,20                        ; длина переноса 20 байт
  89.                 EXX
  90.                 LD A,L
  91.                 EXX
  92.                 RRCA
  93.                 RRCA
  94.                 RRCA
  95.                 AND 0X1F
  96.                 ADD A,"E"                       ; буква найденного устройства
  97.                 LD (DE),A
  98.                 INC DE
  99.                 LDIR                            ; перенос текста из выбранной таблицы
  100.                 EXX
  101.                 LD A,(HL)                       ; тип раздела
  102.                 EXX
  103.                 LD C,A
  104.                 ADD A,A
  105.                 ADD A,A
  106.                 ADD A,C                         ; умноженно на 5
  107.                 LD HL,TXT4MENU_TYPE             ; адрес таблицы текста типов разделов
  108.                 LD C,A
  109.                 ADD HL,BC
  110.                 LD C,5
  111.                 LDIR                            ; перенос текста из выбранной таблицы
  112.                 EX DE,HL
  113.                 EXX
  114.                 ADD HL,DE
  115.                 DJNZ FATBOOT1
  116.                 EXX
  117.                 LD (HL),0
  118.                 INC HL
  119.                 LD B,(IX+_V_SIZE)
  120.                 DEC B
  121.                 DEC B
  122.                 LD C,B
  123.                 LD A,"E"
  124.                 LD (IX+_ADR_HOTKEY_L),L
  125.                 LD (IX+_ADR_HOTKEY_H),H         ; адрес таблицы горячих клавиш выбора FAT устройства
  126.                 LD (HL),B
  127.                 INC HL
  128. FATBOOT3        LD (HL),A                       ; формирование таблицы горячих клавиш
  129.                 INC HL
  130.                 INC A
  131.                 DJNZ FATBOOT3
  132.                 LD (SELFATDEVEXE),HL            ; положили адрес таблицы адресов вызова выбранного
  133.                 LD B,C
  134. FATBOOT2        LD (HL),LOW (SEL_FAT)           ; формирование таблицы адресов вызывов
  135.                 INC HL
  136.                 LD (HL),HIGH (SEL_FAT)
  137.                 INC HL
  138.                 DJNZ FATBOOT2
  139.                 LD A,C
  140.                 EXX
  141.                 DEC A
  142.                 JR Z,SEL_FAT
  143.         RST8 _WINW
  144.                 JP _RULILKA                     ; возвращаемся к общему управлению
  145.  
  146. FILES_BROWSE    LD HL,SUPPORT_EXT
  147.                 LD DE,CMP4TAPES
  148.                 DI
  149.                 LD (GDE_EXT_FILES),HL
  150.                 LD (CMP_FOUNDED),DE
  151.                 LD HL,ERS_FLAGS
  152.                 SET B_RUN_FAT,(HL)
  153.                 JR SEL_FILES
  154.  
  155. ; переключение на устройства и вывод найденного на нем
  156. SEL_FAT         DI
  157.                 LD A,(IX+_TEK_PKT_L)            ; взяли номер выбранного устройства
  158.         RST8 _COM_DEV,_SET_VOL                  ; выбрали устройство по номеру
  159. SEL_FILES
  160.         RST8 _COM_DEV,_KOL_VOL
  161.                 LD A,E
  162.                 AND A
  163.                 JP Z,_STUPID
  164.                 CALL SEARCH_FILE
  165.                 LD HL,1
  166.                 AND A
  167.                 SBC HL,BC                       ; найденно что-то одно?
  168.                 JR NZ,SEL_FAT1                  ; если найдено >1, то продолжаем
  169.                 PUSH BC                         ; сохранили количество найденного
  170.                 LD BC,(ADR_CAT_FAT)             ; взяли номер единственного найденного
  171.                 LD A,6
  172.         RST8 _COM_FAT,_POS_FILES
  173.                 LD HL,BUF_FILEITEM
  174.         RST8 _COM_FAT,_READ_DIR                 ; получили описатель
  175.                 POP BC                          ; вернули количество найденного
  176.                 LD DE,0X0B
  177.                 ADD HL,DE
  178.                 LD A,(HL)                       ; взяли флаговый байт того что нашли
  179.                 AND 0X10
  180.                 LD HL,0                         ; если запускаем, то номер 0 из найденного
  181.                 JR Z,RUN_HOB1                   ; если это файл сразу запускаем
  182. SEL_FAT1        LD IX,FAT_FILES                 ; если дира, то выводим в окно
  183.                 JP OUT_HOB
  184.  
  185. ; запуск выбранного кодового файла из HOBETA файла или вход/выход в диры
  186. RUN_HOB         DI
  187.                 CALL SHUT2AY                    ; бумкалка в AY
  188.                 LD L,(IX+_TEK_PKT_L)
  189.                 LD H,(IX+_TEK_PKT_H)            ; HL = номер выбранного файла
  190. RUN_HOB1        LD DE,ADR_CAT_FAT
  191.                 ADD HL,HL
  192.                 ADD HL,DE                       ; откуда номер файла взять
  193.                 LD C,(HL)
  194.                 INC HL
  195.                 LD B,(HL)                       ; получили текущий выбранный номер
  196.                 LD A,6
  197.         RST8 _COM_FAT,_POS_FILES                ; установка внутреннего указателя FAT драйвера
  198.                 LD HL,BUF_FILEITEM
  199.         RST8 _COM_FAT,_READ_DIR                 ; получили описатель по установленному номеру
  200.                 LD DE,0X0B                      ; нужен байт по смещению
  201.                 ADD HL,DE                       ; для определения файл или директория
  202.                 LD A,(HL)                       ; из этого байта нужен один бит
  203.                 SBC HL,DE
  204.                 AND 0X10                        ; проверили
  205.                 JP Z,GO_RUN_HOB                 ; если это файл, то запускаем кодовый блок
  206.         RST8 _COM_FAT,_ENTER_DIR                ; входим в выбранную директорию
  207.                 PUSH HL                         ; сохранили адрес где описатель выбранного файла лежит
  208.                 LD HL,BUF_RDPATH
  209.         RST8 _COM_FAT,_GET_PATH                 ; получить путь к файлу после входа в директорию
  210.                 LD A,(HL)                       ; взяли букву устройства текущего пути
  211.                 SUB "E"                         ; преобразовали в номер устройства
  212.                 LD D,A
  213.                 LD E,0
  214.                 LD HL,BUF_LEVDIR
  215.                 SRL D
  216.                 RR E
  217.                 SRL D
  218.                 RR E
  219.                 ADD HL,DE
  220.                 EX (SP),HL                      ; сохранили адрес описателя FAT устройства, восстановили адрес описателя файла
  221.                 LD A,(HL)                       ; будем проверять первый символ имени предыдущего описателя
  222.                 POP HL                          ; восстановили адрес описателя FAT устройства
  223.                 CP "."                          ; если первый символ имени не ".", то сохраняем текущие значения окошка и  
  224.                 JR NZ,SNYT0                     ; входим в диру
  225.                 LD C,(HL)                       ; при выходе из директории восстанавливаем позиции в окне
  226.                 INC HL
  227.                 LD B,(HL)
  228.                 INC HL
  229.                 PUSH HL
  230.                 ADD HL,BC
  231.                 DEC HL
  232.                 LD A,(HL)
  233.                 DEC HL
  234.                 LD C,(HL)
  235.                 DEC HL
  236.                 LD B,(HL)
  237.                 POP DE
  238.                 AND A
  239.                 SBC HL,DE
  240.                 EX DE,HL
  241.                 DEC HL
  242.                 LD (HL),D
  243.                 DEC HL
  244.                 LD (HL),E
  245.                 LD (IX+_TEK_PKT_L),C
  246.                 LD (IX+_TEK_PKT_H),B
  247.                 LD (IX+_NUM_PKT),A
  248.                 CALL SEARCH_FILE                ; поиск по маске в директории в которую вошли
  249.                 LD (IX+_NUM_KOL_L),C
  250.                 LD (IX+_NUM_KOL_H),B            ; установили количество найденных по маске файлов в этой директории
  251.                 JP REOUT_HOB                    ; вывели новое содержимое окна
  252.  
  253. ; при входе в диру сохранение текущих данных окна
  254. SNYT0           LD C,(HL)
  255.                 INC HL
  256.                 LD B,(HL)                       ; BC = смещение до первой свободной ячейки
  257.                 INC HL
  258.                 PUSH HL                         ; HL = адрес начала самих ячеек
  259.                 ADD HL,BC                       ; HL = адрес первой свободной ячейки
  260.                 LD D,(IX+_TEK_PKT_H)
  261.                 LD E,(IX+_TEK_PKT_L)
  262.                 LD A,(IX+_NUM_PKT)
  263.                 LD (HL),D
  264.                 INC HL
  265.                 LD (HL),E
  266.                 INC HL
  267.                 LD (HL),A
  268.                 INC HL
  269.                 POP DE                          ; DE = адрес начала самих ячеек
  270.                 AND A
  271.                 SBC HL,DE
  272.                 EX DE,HL
  273.                 DEC HL
  274.                 LD (HL),D
  275.                 DEC HL
  276.                 LD (HL),E
  277.                 LD C,(IX+_NUM_KOL_L)
  278.                 LD B,(IX+_NUM_KOL_H)
  279.                 CALL SEARCH_FILE
  280.                 JP OUT_HOB
  281.  
  282. ; BCDE = (ADR) - BCDE
  283. BCDEHLM         LD A,(HL)
  284.                 INC HL
  285.                 SUB E
  286.                 LD E,A
  287.                 LD A,(HL)
  288.                 INC HL
  289.                 SBC A,D
  290.                 LD D,A
  291.                 LD A,(HL)
  292.                 INC HL
  293.                 SBC A,C
  294.                 LD C,A
  295.                 LD A,(HL)
  296.                 SBC A,B
  297.                 LD B,A
  298.                 RET
  299.  
  300. SELMOUNT        LD HL,BUF_FILEITEM+0X1C
  301.                 LD BC,0X0A
  302.                 LD DE,0
  303.                 CALL BCDEHLM
  304.                 JP M,LOADIMAGE                  ; образ меньше стандартного, загрузка в рамдиск
  305. ; размер TRD образа стандартного размера или больше
  306.                 LD HL,ERS_FLAGS
  307.                 BIT B_VIEW_IMG,(HL)
  308. ;               LD IX,SEL_MOUNT
  309. ;               JR Z,.L1
  310.                 LD IX,RUN_IMAGE                 ; окно выбора загрузки/монтирования
  311. .L1
  312.         RST8 _WINW
  313.                 JP _RULILKA
  314.  
  315. RUNIMG_A        XOR A
  316.                 JR RUNIMG_ALL
  317.  
  318. RUNIMG_B        LD A,1
  319.                 JR RUNIMG_ALL
  320.  
  321. RUNIMG_C        LD A,2
  322.                 JR RUNIMG_ALL
  323.  
  324. RUNIMG_D        LD A,3
  325. ; запуск Basic файла с принудительным переключением виртуального и реального дисковода на указанный номер
  326. RUNIMG_ALL      PUSH AF
  327.         RST8 _MOUNTER,_LOADIMAGE
  328.         RST8 _MOUNTER,_SET_VIRTREAL
  329.                 POP AF
  330.                 LD HL,ERS_FLAGS
  331.                 BIT B_VIEW_IMG,(HL)
  332.                 JP Z,RESTART
  333.                 RES B_VIEW_IMG,(HL)
  334.                 JP RUNMOUNT
  335.  
  336. ; только загрузка образа
  337. LOADIMAGE
  338.         RST8 _MOUNTER,_LOADIMAGE
  339.                 LD HL,ERS_FLAGS
  340.                 BIT B_VIEW_IMG,(HL)
  341.                 JP Z,RESTART
  342.                 RES B_VIEW_IMG,(HL)
  343.                 JP START_IMG
  344.  
  345. MOUNT_A         XOR A
  346. ; запуск Basic файла с принудительным переключением виртуального и реального дисковода на указанный номер
  347. MOUNT_ALL       PUSH AF
  348.         RST8 _MOUNTER,_OPEN_MOUNT               ; !!!
  349.         RST8 _MOUNTER,_SET_VIRTREAL
  350.                 POP AF
  351.                 LD HL,ERS_FLAGS
  352.                 BIT B_VIEW_IMG,(HL)
  353.                 JP Z,RESTART
  354.                 RES B_VIEW_IMG,(HL)
  355.                 JP RUNMOUNT
  356.  
  357. MOUNT_B         LD A,1
  358.                 JR MOUNT_ALL
  359.  
  360. MOUNT_C         LD A,2
  361.                 JR MOUNT_ALL
  362.  
  363. MOUNT_D         LD A,3
  364.                 JR MOUNT_ALL
  365.  
  366. ;ЗАПУСК, ЗАГРУЗКА ИЛИ МОНТИРОВАНИЕ ФАЙЛОВ
  367. GO_RUN_HOB
  368.         RST8 _COM_FAT,_OPEN_FILE
  369.                 LD DE,8
  370.                 ADD HL,DE
  371.                 PUSH HL
  372.                 LD HL,(BUF_FILEITEM+8)
  373.                 LD DE,"RT"
  374.                 AND A
  375.                 SBC HL,DE
  376.                 POP HL
  377.                 JP Z,SELMOUNT                   ; перехода на загрузку TRD образа
  378.                 LD A,(HL)
  379.                 CP "$"
  380.                 JR Z,GORUNHOB1                  ; переход на загрузку HOBETA
  381.                 CP "S"
  382.                 JP NZ,LOAD_IMAGE                ; переход на загрузку SCL образа
  383.                 INC HL
  384.                 LD A,(HL)
  385.                 DEC HL
  386.                 CP "P"
  387.                 JR Z,GORUNHOB1                  ; переход на загрузку SPG
  388.                 CP "N"
  389.                 LD A,(HL)
  390.                 JP NZ,LOAD_IMAGE                ; переход на загрузку образа
  391. GORUNHOB1
  392.         RST8 _COM_DEV,_KOL_VOL                  ; запрос у менеджера устройств о текущем устройстве
  393.                 LD A,D                          ; взяли номер текущего устройства
  394.                 LD HL,ADR_CAT_FAT
  395.         RST8 _COM_DEV,_GET_FNDVOLUME
  396.                 ADD A,A
  397.                 ADD A,A
  398.                 ADD A,A
  399.                 LD C,A
  400.                 LD B,0
  401.                 ADD HL,BC
  402.                 LD A,(HL)                       ; взяли тип раздела
  403. ;               SUB 4                           ; пропускаем дисководы
  404.                 LD D,A                          ; номер текущего устройства
  405.                 INC HL
  406.                 LD E,(HL)                       ; взяли местоположение носителя (MASTER/SLAVE)
  407.                 PUSH DE
  408.                 LD HL,0X5800
  409.                 LD DE,0X5801
  410.                 LD BC,0X02FF
  411.                 LD (HL),L
  412.                 LDIR                            ; зачернили экран для маскировки запускалки
  413.                 LD HL,RUN_CODE
  414.                 LD DE,0X5D3B
  415.                 LD BC,ERUN_CODE-RUN_CODE
  416.                 LDIR
  417.                 CALL MEMSET                     ; выставили режим компа
  418.                 CALL FOR_RUN
  419.                 LD HL,0X4200                    ; куда скопировать переменные FAT текущего выбранного раздела
  420.         RST8 _INST_FATBOOT
  421.                 POP DE
  422.                 LD (0X42FE),DE
  423.                 JP 0X4300
  424.  
  425. ; загрузка шрифта для текстмода
  426. LOAD_FNT        LD HL,ADR_CAT
  427. LOAD_FNT1       LD A,4
  428.         RST8 _COM_FAT,_READ_FILE
  429.         PEC_ON M_FONT_BF
  430.                 LD HL,ADR_CAT
  431.                 LD DE,0
  432.                 LD BC,0X800
  433.                 LDIR
  434.         PEC_OFF M_FONT_BF
  435.                 JP RESTART
  436.  
  437. ; загрузка FDI образа
  438. LOAD_FDI        LD A,E
  439.                 CP "N"
  440.                 JR Z,LOAD_FNT                   ; переход на загрузку фонта
  441.                 LD HL,ERS_FLAGS
  442.                 SET B_LOAD_IMG,(HL)
  443.                 LD A,RAM_RAMDISK                ; страница начала рамдиска
  444.                 PUSH AF                         ; сохранили на стеке
  445.                 CALL SET4MBPAGE                 ; включили ее
  446.                 LD HL,FDI_TABLE_CYL
  447.                 LD DE,FDI_TABLE_CYL+1
  448.                 LD BC,0X3FFF
  449.                 LD (HL),0
  450.                 LDIR                            ; очистка страницы с описателями дорожек
  451.                 LD IXH,0XFF
  452.                 CALL LOAD1SECFDI                ; принудительная загрузка первого сектора
  453.                 LD A,(0XC006)                   ; взяли количество сторон
  454.                 DEC A
  455.                 LD A,(0XC004)                   ; взяли количество дорожек
  456.                 JR Z,LOADFDI1
  457.                 ADD A,A                         ; если сторон 2, то умножили количество дорожек на 2
  458. LOADFDI1        LD C,A                          ; количество дорожек
  459.                 LD HL,(0XC00A)
  460.                 LD (START_DATA),HL
  461.                 LD DE,0X4000                    ; адрес буфера начала описателей дорожек
  462.                 LD HL,0XC00F                    ; адрес начала выборки описателей дорожек в FDI заголовке
  463. LOADFDI3        BIT 1,H
  464.                 CALL NZ,LOAD1SECFDI             ; если вышли за пределы сектора меняем указатель и грузим следующий сектор в буфер
  465.                 LD A,(HL)                       ; биты 8-15 смещения дорожки от начала
  466.                 AND 0X3F                        ; взяли для 8-13 биты - смещение в блоках в странице
  467.                 LD (DE),A                       ; уложили смещение в блоках в странице
  468.                 LD A,(HL)                       ; взяли биты 14-15
  469.                 INC HL                          ; следующий байт FDI заголовка
  470.                 INC D                           ; здесь положим смещение в страницах до нужной дорожки
  471.                 BIT 1,H
  472.                 CALL NZ,LOAD1SECFDI             ; если вышли за пределы сектора меняем указатель и грузим следующий сектор в буфер
  473.                 LD B,A                          ; сохранили нужные 14-15 биты
  474.                 LD A,(HL)                       ; взяли 16-23 биты смещения дорожки от начала
  475.                 RL B
  476.                 RLA
  477.                 RL B
  478.                 RLA
  479.                 LD (DE),A                       ; укладка битов смещения номера страницы
  480.                 INC D
  481.         REPT 4
  482.                 INC HL
  483.         ENDM
  484.                 BIT 1,H
  485.                 CALL NZ,LOAD1SECFDI             ; если вышли за пределы сектора меняем указатель и грузим следующий сектор в буфер
  486.                 LD B,(HL)                       ; взяли количество секторов на дорожке
  487.                 LD A,B
  488.                 AND A
  489.                 JP Z,LOADFDI_ERR
  490.                 INC HL
  491.                 INC HL
  492. LOADFDI4        INC HL
  493.                 BIT 1,H
  494.                 CALL NZ,LOAD1SECFDI             ; если вышли за пределы сектора меняем указатель и грузим следующий сектор в буфер
  495.                 LDI                             ; перенос номера сектора
  496.                 DEC DE
  497.                 INC C
  498.                 INC D
  499.                 BIT 1,H
  500.                 CALL NZ,LOAD1SECFDI             ; если вышли за пределы сектора меняем указатель и грузим следующий сектор в буфер
  501.                 LD A,(HL)                       ; взяли размер сектора
  502.                 EX DE,HL
  503.                 LD (HL),1
  504.                 AND A
  505.                 JR Z,LOADFDI2
  506.                 LD (HL),2
  507.                 DEC A
  508.                 JR Z,LOADFDI2
  509.                 LD (HL),4
  510.                 DEC A
  511.                 JR Z,LOADFDI2
  512.                 LD (HL),8
  513. LOADFDI2        EX DE,HL
  514.                 INC D
  515.         REPT 5
  516.                 INC HL
  517.         ENDM
  518.                 DJNZ LOADFDI4                   ; возвращаемся для продолжения, пока сектора дорожки не кончатся
  519.                 LD D,0X40
  520.                 INC E
  521.                 DEC C
  522.                 JR NZ,LOADFDI3                  ; возвращаемся для продолжения пока не кончатся дорожки
  523.                 DEC HL
  524.                 BIT 1,H
  525.                 CALL NZ,LOAD1SECFDI             ; если вышли за пределы сектора меняем указатель и грузим следующий сектор в буфер
  526.                 PUSH HL
  527.                 LD A,H
  528.                 AND 1
  529.                 LD B,A
  530.                 LD C,L
  531.                 LD A,IXH
  532.                 ADD A,A
  533.                 ADD A,B
  534.                 LD B,A
  535.                 LD HL,0
  536. START_DATA      EQU $-2
  537.                 AND A
  538.                 SBC HL,BC
  539.                 EX DE,HL
  540.                 POP HL
  541.                 LD A,D
  542.                 AND A
  543.                 JR Z,LOADFDI7
  544. LOADFDI8        INC H
  545.                 BIT 1,H
  546.                 CALL NZ,LOAD1SECFDI             ; если вышли за пределы сектора меняем указатель и грузим следующий сектор в буфер
  547.                 DEC D
  548.                 JR NZ,LOADFDI8
  549. LOADFDI7        ADD HL,DE
  550.                 BIT 1,H
  551.                 CALL NZ,LOAD1SECFDI             ; если вышли за пределы сектора меняем указатель и грузим следующий сектор в буфер
  552.                 PUSH HL                         ; сохранили адрес на начало начала секторов
  553.                 LD DE,0XC000
  554.                 AND A
  555.                 SBC HL,DE
  556.                 LD (OSTAT_SECT),HL              ; сколько байт перенести из хвоста сектора в буфере в начало страницы
  557.                 LD B,H
  558.                 LD C,L
  559.                 LD HL,0X200
  560.                 SBC HL,BC
  561.                 LD (NACH_SECT),HL               ; сколько байт перенести из начала сектора в буфере в конец страницы
  562.                 POP HL                          ; восстановили сдрес начала секторов, далее загрузка всех секторов в память
  563. LOADFDI5        POP AF
  564.                 INC A
  565.                 CALL SET4MBPAGE
  566.                 PUSH AF
  567.                 BIT 1,H
  568.                 CALL NZ,LOAD1SECFDI
  569.                 EX AF,AF'
  570.                 LD DE,0X4000
  571.                 LD BC,0
  572. NACH_SECT       EQU $-2
  573.                 LDIR
  574.                 EX AF,AF'
  575.                 JP C,ELOAD_IMAGE
  576.                 EX DE,HL
  577.                 LD A,0X1F
  578.         RST8 _COM_FAT,_READ_FILE
  579.                 JP C,ELOAD_IMAGE
  580.                 PUSH HL
  581.                 LD HL,0XC000
  582.                 PUSH HL
  583.                 LD A,1
  584.         RST8 _COM_FAT,_READ_FILE
  585.                 POP HL
  586.                 POP DE
  587.                 LD BC,0
  588. OSTAT_SECT      EQU $-2
  589.                 LDIR
  590.                 JR LOADFDI5
  591.  
  592. LOADFDI_ERR     LD A,RAM_RAMDISK
  593.                 CALL SET4MBPAGE
  594.                 LD HL,0X7FFF
  595.                 LD (HL),0
  596.                 DEC H
  597.                 LD (HL),0
  598.                 LD A,ZXSTD_CPU1;0XFA
  599.                 CALL SET4MBPAGE
  600.                 LD SP,(LD_FILE_SP)
  601.                 POP IY
  602.                 POP IX
  603.                 JP LDFDI_ERROR
  604.  
  605. ; создание таблицы описателей для пустого рамдиска
  606. CREATE_TRD640   PUSH IX
  607.                 PUSH IY
  608.                 LD (LD_FILE_SP),SP
  609.                 LD SP,ADR_CAT
  610.                 JR ELT4
  611.  
  612. CREATE_RAMTABL  PUSH IX
  613.                 PUSH IY
  614.                 LD (LD_FILE_SP),SP
  615.                 LD SP,ADR_CAT
  616. ; создание таблицы описателя для загруженных TRD и SCL образов
  617. END_LOAD_TRD    LD A,RAM_DATARAMD               ; нужна страница откуда начинается загруженный образ
  618.                 CALL SET4MBPAGE
  619.                 LD HL,(0X48E1)                  ; первый свободный трек сектор
  620.                 LD A,L
  621.                 LD L,H
  622.                 LD H,0
  623.                 ADD HL,HL
  624.                 ADD HL,HL
  625.                 ADD HL,HL
  626.                 ADD HL,HL
  627.                 OR L
  628.                 LD L,A                          ; количество занятых секторов с директорией
  629.                 LD DE,(0X48E5)                  ; количество свободных секторов
  630.                 ADD HL,DE
  631.                 ADD HL,HL
  632.                 ADD HL,HL
  633.                 ADD HL,HL
  634.                 ADD HL,HL                       ; H = количество дорожек
  635.                 LD A,H
  636.                 CP 0XA0
  637.                 JR NC,ELT3
  638. ELT4            LD A,0XA0
  639. ELT3            EX AF,AF'
  640.                 LD A,RAM_RAMDISK                ; нужна страница начала рамдиска, где будет таблица описателей
  641.                 CALL SET4MBPAGE
  642.                 LD HL,0X4000
  643.                 PUSH HL
  644.                 LD DE,0X4001
  645.                 LD BC,0X3FFF
  646.                 LD (HL),L
  647.                 LDIR                            ; очистили страницу
  648.                 POP DE                          ; адрес начала
  649.                 LD HL,0                         ; смещение в блоках и страницах
  650.                 EX AF,AF'
  651. ELT2            EX AF,AF'
  652.                 LD BC,0X1000                    ; счетчик номеров секторов и их номера
  653.                 LD A,L
  654.                 RRCA
  655.                 RRCA
  656.                 LD (DE),A                       ; смещение в блоках дорожки в странице
  657.                 INC D
  658.                 LD A,H
  659.                 LD (DE),A                       ; смещение в страницах до дорожки
  660.                 INC D
  661. ELT1            INC C
  662.                 LD A,C
  663.                 LD (DE),A                       ; номер сектора
  664.                 INC D
  665.                 LD A,2
  666.                 LD (DE),A                       ; размер сектора
  667.                 INC D
  668.                 DJNZ ELT1                       ; вносим в таблицу все номера секторов с размерами
  669.                 LD D,0X40                       ; вернули указатель в начало
  670.                 INC E                           ; для следующей дорожки
  671.                 LD BC,0X40
  672.                 ADD HL,BC                       ; переход к следующей дорожке
  673.                 EX AF,AF'
  674.                 DEC A
  675.                 JR NZ,ELT2                      ; повторяем для всех дорожек
  676. ; общий выход из загрузки с возвратом стандартной страницы в окне проецирования 1
  677. ELOAD_IMAGE     LD A,RAM_RAMDISK
  678.                 CALL SET4MBPAGE
  679.                 LD HL,0X7FFF
  680.                 LD (HL),"R"
  681.                 DEC H
  682.                 LD (HL),"D"
  683.                 CALL SET_RAMD_NAME
  684.                 LD A,ZXSTD_CPU1;0XFA
  685.                 CALL SET4MBPAGE
  686.                 LD SP,0
  687. LD_FILE_SP      EQU $-2
  688.                 POP IY
  689.                 POP IX
  690.                 LD HL,ERS_FLAGS
  691.                 BIT B_VIEW_IMG,(HL)
  692.                 RET Z
  693.                 RES B_VIEW_IMG,(HL)
  694. ; загрузка каталога TR-DOS и поиск выбранного и запуск выбранного BASIC файла
  695. START_IMG       LD H,VIRT_REAL_DRIVE
  696.                 CALL READCMOS
  697.                 AND 3
  698.                 LD C,A
  699.                 PUSH AF
  700.         RST8 _MOUNTER,_CLOSEMOUNT               ; !!!
  701.                 POP AF
  702. RUNMOUNT        PUSH AF
  703.                 CALL SETUP_DRIVE                ; переключение TR-DOS на указанный номер
  704.         RST8 _MOUNTER,_GET_VIRT_BITS
  705.                 POP AF
  706.                 LD C,1
  707.                 CALL TO_DOS4BAS
  708.                 LD HL,ADR_CAT
  709.                 LD DE,0
  710.                 LD BC,0X0905
  711.                 CALL TO_DOS4BAS                 ; загрузка TR-DOS диры
  712.                 DI
  713.                 LD IX,WIN_FILES
  714.                 LD B,(IX+8)
  715.                 INC B
  716.                 LD IX,ADR_CAT
  717.                 LD DE,0X10
  718. NEXT_BAS        LD A,(IX+8)
  719.                 ADD IX,DE
  720.                 CP "B"
  721.                 JR NZ,NEXT_BAS
  722.                 DJNZ NEXT_BAS
  723.                 PUSH IX
  724.                 POP HL
  725.                 SBC HL,DE
  726.                 LD IX,WIN_FILES
  727.                 JP RUNFILE1
  728.  
  729. SET_RAMD_NAME   DEC H
  730.                 XOR A
  731.                 LD (HL),A
  732.                 LD BC,CONF_128
  733.                 OUT (C),A
  734.                 PUSH HL
  735.                 LD HL,TXT_NONE
  736.                 LD DE,IN_RAMDISK
  737.                 LD BC,ETXT_NONE-TXT_NONE
  738.                 LDIR
  739.                 LD HL,ERS_FLAGS
  740.                 BIT B_LOAD_IMG,(HL)
  741.                 LD BC,CONF_128
  742.                 LD A,0X10
  743.                 OUT (C),A
  744.                 POP HL
  745.                 RET Z
  746.                 LD DE,BUF_FILEITEM
  747.                 LD B,8
  748.                 CALL SRN1
  749.                 LD B,3
  750. SRN1            LD A,(DE)
  751.                 LD (HL),A
  752.                 DEC H
  753.                 INC DE
  754.                 DJNZ SRN1
  755.                 RET
  756.  
  757. ; загрузка следующего сектора заголовка FDI
  758. LOAD1SECFDI     PUSH HL
  759.                 PUSH BC
  760.                 PUSH DE
  761.                 PUSH AF
  762.                 LD HL,0XC000
  763.                 LD A,1
  764.         RST8 _COM_FAT,_READ_FILE
  765.                 INC IXH
  766.                 POP AF
  767.                 POP DE
  768.                 POP BC
  769.                 POP HL
  770.                 RES 1,H
  771.                 RET
  772.  
  773. ; включение в 1 окно проецирования заданной страницы
  774. SET4MBPAGE      PUSH BC
  775.                 LD B,A
  776.         PEC_ON M_SHADOW_BF
  777.                 LD A,B
  778.                 LD BC,WIN_P1
  779.                 OUT (C),A
  780.                 LD B,A
  781.         PEC_OFF M_SHADOW_BF
  782.                 LD A,B
  783.                 POP BC
  784.                 RET
  785.  
  786. LOADIMAGE4      PUSH IX
  787.                 PUSH IY
  788.                 LD (LD_FILE_SP),SP
  789.                 LD SP,ADR_CAT
  790.                 LD A,RAM_TAPE
  791. ; загрузка TRD или TAP образа
  792. LOADIMAGE3      PUSH AF
  793.                 CALL SET4MBPAGE
  794.                 LD HL,0X4000
  795.                 LD A,0X20
  796.         RST8 _COM_FAT,_READ_FILE
  797.                 JR C,END_LOAD_TAP
  798.                 POP AF
  799.                 INC A
  800.                 JR LOADIMAGE3
  801.  
  802. END_LOAD_TAP    XOR A
  803.                 CALL SET4MBPAGE
  804.                 LD H,A
  805.                 LD L,A
  806.                 LD (0X4000),HL
  807.                 LD (0X4002),A
  808.                 LD A,ZXSTD_CPU1;0XFA
  809.                 CALL SET4MBPAGE
  810.                 LD SP,(LD_FILE_SP)
  811.                 POP IY
  812.                 POP IX
  813.                 LD H,CMOS_BYTE_00
  814.                 CALL READCMOS
  815.                 OR M_EMUL_TAPE
  816.                 LD L,A
  817.                 CALL WRITECMOS
  818.                 AND M_AUTO_TAPE
  819.                 JP Z,RESTART
  820.                 JP TAPELOAD1
  821.  
  822. LOAD_IMAGE      DI
  823.                 LD D,A                          ; первый символ расширения
  824.                 INC HL
  825.                 LD E,(HL)                       ; второй символ расширения
  826.                 CP "B"
  827.                 JR NZ,LOADIMAGE1_
  828.                 LD A,E
  829.                 CP "M"
  830.                 JR Z,LOADIMAGE2                 ; BMP
  831. LOADIMAGE1_     CP "T"                          ; TAP или TRD ?
  832.                 JR NZ,LOADIMAGE1
  833.                 LD A,E
  834.                 CP "A"
  835.                 JP Z,LOADIMAGE4                 ; TAP
  836. LOADIMAGE1      LD A,D
  837.                 CP "R"
  838.                 LD HL,FLASHER
  839.                 JR Z,LOAD_IMAGE8                ; TRD
  840. LOADIMAGE2      LD HL,RESTART
  841. LOAD_IMAGE8     PUSH HL
  842.                 PUSH IX
  843.                 PUSH IY
  844.                 LD (LD_FILE_SP),SP
  845.                 LD SP,ADR_CAT
  846.                 LD A,D
  847.                 CP "S"                          ; это SCL файл?
  848.                 JR Z,LOAD_IMAGE2
  849.                 CP "F"                          ; это FDI файл?
  850.                 JP Z,LOAD_FDI
  851.                 CP "B"                          ; это BMP файл?
  852.                 JP Z,BMPVIEW
  853.                 CP "T"                          ; это TRD файл?
  854.                 JR NZ,LOAD_ROM
  855.                 LD HL,ERS_FLAGS
  856.                 SET B_LOAD_IMG,(HL)
  857.                 LD A,RAM_DATARAMD
  858. ; загрузка TRD или TAP образа
  859. LOAD_IMAGE1     PUSH AF
  860.                 CALL SET4MBPAGE
  861.                 LD HL,CPU1
  862.                 LD A,0X20
  863.         RST8 _COM_FAT,_READ_FILE
  864.                 JP C,END_LOAD_TRD
  865.                 POP AF
  866.                 INC A
  867.                 JR LOAD_IMAGE1
  868.  
  869. LOAD_ROM        CP "R"                          ; это ROM файл?
  870.                 JP NZ,ELOAD_IMAGE
  871.                 LD A,RAM_FLASHER
  872.                 CALL LOAD_IN_PAGE
  873.                 LD SP,(LD_FILE_SP)
  874.                 POP IY
  875.                 POP IX
  876.                 RET
  877.  
  878. LOAD_IN_PAGE    PUSH AF
  879.                 CALL SET4MBPAGE
  880.                 LD HL,CPU1
  881.                 LD A,0X20
  882.         RST8 _COM_FAT,_READ_FILE
  883.                 JR C,LOADINPAGE1
  884.                 POP AF
  885.                 INC A
  886.                 JR LOAD_IN_PAGE
  887.  
  888. LOADINPAGE1     POP AF
  889.                 LD A,ZXSTD_CPU1
  890.                 JP SET4MBPAGE
  891.  
  892. ; меню выбора на какую букву диска SCL образ переключить
  893. LOAD_IMAGE2     LD IX,LOAD_SCL
  894.         RST8 _WINW
  895.                 JP _RULILKA
  896.  
  897. SCL_A           XOR A
  898.                 JR SCL_ALL
  899.  
  900. SCL_B           LD A,1
  901.                 JR SCL_ALL
  902.  
  903. SCL_C           LD A,2
  904.                 JR SCL_ALL
  905.  
  906. SCL_D           LD A,3
  907. SCL_ALL         PUSH AF
  908.         RST8 _MOUNTER,_SET_VIRTREAL
  909.                 POP AF
  910. ; загрузка SCL образа
  911. LOAD_SCL_IMAGE  LD HL,DSKINFO
  912.                 LD DE,ADR_CAT+0XF00
  913.                 LD BC,DSK_END-DSKINFO
  914.                 LDIR                            ; сохранение инфы для создания заголовка дискеты
  915.                 LD HL,ERS_FLAGS
  916.                 SET B_LOAD_IMG,(HL)
  917.                 LD A,RAM_DATARAMD
  918. LOAD_IMAGE4     PUSH AF
  919.                 CALL SET4MBPAGE                 ; включили первую страницу откуда рамдиск начинается
  920.                 LD HL,0X5000
  921.                 LD A,0X18
  922.         RST8 _COM_FAT,_READ_FILE
  923.                 PUSH AF                         ; сохранили флаг окончания загрузки на случай окончания образа
  924.                 LD HL,0X4000
  925.                 PUSH HL                         ; сохранили адрес начала каталога
  926.                 LD (HL),L
  927.                 LD D,H
  928.                 LD E,L
  929.                 INC DE
  930.                 LD BC,0XFFF
  931.                 LDIR                            ; зачистка области первой дорожки для формирования каталога диска
  932.                 LD HL,0X5008                    ; адрес количества файлов в SCL образе
  933.                 LD A,(HL)                       ; взяли количество файлов как счетчик
  934.                 INC HL                          ; перешли на первый описатель файла
  935.                 EXX
  936.                 LD HL,0                         ; номер абсолютного сектора
  937.                 LD D,L                          ; приращение секторов не может быть более 255 секторов
  938.                 LD B,A                          ; сохранение количества файлов
  939.                 EXX
  940.                 POP DE                          ; вернули адрес начала каталога диска
  941. LOAD_IMAGE3     EX AF,AF'
  942.                 LD BC,0X0D
  943.                 LDIR                            ; перенесли 13 байт тела описателя
  944.                 LD A,(HL)                       ; забрали размер файла в секторах
  945.                 LDI                             ; перенесли еще байт
  946.                 EXX
  947.                 LD E,A
  948.                 PUSH HL                         ; сохранили текщее значение номера сектора
  949.                 ADD HL,DE                       ; увеличили текщее значение на размер файла в секторах
  950.                 EXX
  951.                 EX (SP),HL
  952.                 LD A,L
  953.                 ADD HL,HL
  954.                 ADD HL,HL
  955.                 ADD HL,HL
  956.                 ADD HL,HL
  957.                 INC H
  958.                 AND 0X0F
  959.                 LD L,A
  960.                 EX (SP),HL
  961.                 POP BC                          ; восстановили текщий номер сектора
  962.                 EX DE,HL
  963.                 LD (HL),C
  964.                 INC HL
  965.                 LD (HL),B                       ; уложили после текущего описателя
  966.                 INC HL
  967.                 EX DE,HL
  968.                 EX AF,AF'
  969.                 DEC A
  970.                 JR NZ,LOAD_IMAGE3               ; если файлы не кончились продолжаем
  971.                 PUSH HL                         ; сохранили адрес начала данных
  972.                 LD HL,ADR_CAT+0XF00
  973.                 LD DE,0X48E1
  974.                 LD BC,DSK_END-DSKINFO
  975.                 LDIR
  976.                 EXX
  977.                 LD DE,2544                      ; стандартный размер дискеты
  978.                 EX DE,HL
  979.                 AND A
  980.                 SBC HL,DE
  981.                 LD (0X48E5),HL                  ; количество свободных секторов
  982.                 EX DE,HL
  983.                 LD A,L
  984.                 ADD HL,HL
  985.                 ADD HL,HL
  986.                 ADD HL,HL
  987.                 ADD HL,HL
  988.                 INC H
  989.                 AND 0X0F
  990.                 LD L,A
  991.                 LD (0X48E1),HL                  ; первый свободный трек и сектор
  992.                 LD A,B
  993.                 LD (0X48E4),A                   ; количество файлов на диске
  994.                 EXX
  995.                 POP DE                          ; восстановление адреса начала данных
  996.                 LD HL,0X8000                    ; конец окна проецирования
  997.                 AND A
  998.                 SBC HL,DE                       ; получили количество байт для сдвига
  999.                 LD B,H
  1000.                 LD C,L
  1001.                 LD HL,0X5000                    ; начало данных на рамдиске
  1002.                 EX DE,HL
  1003.                 LDIR                            ; сдвинули, после переноса DE = адрес куда далее грузить
  1004.                 LD A,D
  1005.                 CP 0X7E
  1006.                 JR NC,LOAD_IMAGE7
  1007.                 EX DE,HL
  1008.                 LD A,0X7F
  1009.                 SUB H
  1010.                 SRL A
  1011.                 LD IXL,A
  1012.         RST8 _COM_FAT,_READ_FILE
  1013.                 LD DE,0X8000
  1014.                 EX DE,HL
  1015. LOAD_IMAGE7     AND A
  1016.                 SBC HL,DE                       ; получили сколько байт осталось до конца окна
  1017.                 LD (OST_HWOST),HL
  1018.                 LD (KUDA_HWOST),DE
  1019.                 LD DE,0
  1020.                 EX DE,HL
  1021.                 SBC HL,DE
  1022.                 LD A,1
  1023.                 AND H
  1024.                 LD H,A
  1025.                 LD (NEXT4PAGE),HL
  1026.                 POP AF                          ; восстановили флаг последней загрузки
  1027.                 JP C,END_LOAD_TRD               ; если файл уже кончился, то выход
  1028.                 JR LOAD_IMAGE5
  1029.  
  1030. LOAD_IMAGE6     LD DE,0X4000
  1031.                 LD BC,0
  1032. NEXT4PAGE       EQU $-2
  1033.                 LDIR
  1034.                 EX AF,AF'
  1035.                 JP C,END_LOAD_TRD
  1036.                 EX DE,HL
  1037.                 LD A,0X1F
  1038.         RST8 _COM_FAT,_READ_FILE
  1039.                 JP C,END_LOAD_TRD
  1040. LOAD_IMAGE5     LD HL,ADR_CAT
  1041.                 PUSH HL
  1042.                 LD A,1
  1043.         RST8 _COM_FAT,_READ_FILE
  1044.                 EX AF,AF'                       ; спрятали флаг загрузки сектора
  1045.                 POP HL                          ; восстановили адрес куда сектор в буфер загрузили
  1046.                 LD DE,0
  1047. KUDA_HWOST      EQU $-2                         ; куда ложить остаток в окне
  1048.                 LD BC,0
  1049. OST_HWOST       EQU $-2                         ; сколько переносить в конец страницы
  1050.                 LDIR
  1051.                 POP AF
  1052.                 INC A
  1053.                 PUSH AF
  1054.                 CALL SET4MBPAGE
  1055.                 JR LOAD_IMAGE6
  1056.  
  1057. ; проверка заголовка HOBETA файла
  1058. ;на выходе: флаг С=1-не соотвествует
  1059. CMP4HOBETA      SUB 1
  1060.                 RET NZ
  1061.                 LD A,(BUF_RDSEC+8)
  1062.                 CP "C"                          ; проверка что это кодовый блок, а не что-то другое
  1063.                 SCF
  1064.                 RET NZ
  1065.                 PUSH DE                         ; сохранили адрес складирования для дальнейшей проверки
  1066.                 LD BC,BUF_RDSEC                 ; возвращаемся в начало сектора
  1067.                 CALL HOB_CRC                    ; считаем CRC HOBETA заголовка
  1068.                 LD A,(BC)
  1069.                 INC BC
  1070.                 LD E,A
  1071.                 LD A,(BC)
  1072.                 LD D,A                          ; в "DE" рассчитанное CRC HOBETA заголовка
  1073.                 AND A                           ; в "HL" взятое из смещения +0x0F от начала файла
  1074.                 SBC HL,DE                       ; сравниваем
  1075.                 POP DE                          ; если не совпало то возможно это не HOBETA
  1076.                 SCF
  1077.                 RET NZ                          ; пропускаем файл
  1078.                 EXX
  1079.                 LD HL,(BUF_RDSEC+9)
  1080.                 DEC HL                          ; для загрузки масимум 40960 байт (160 секторов)
  1081.                 LD DE,(BUF_RDSEC+0X0B)
  1082.                 ADD HL,DE                       ; проверяем выход за пределы озу
  1083.                 EXX                             ; если вылет за предел озу
  1084.                 RET C                           ; пропускаем файл
  1085.                 EXX
  1086.                 LD HL,(BUF_RDSEC+9)
  1087.                 LD DE,0X6000                    ; проверяем адрес загрузки
  1088.                 AND A                           ; адрес загрузки не должен быть ниже 0x6000
  1089.                 SBC HL,DE
  1090.                 EXX                             ; если адрес загрузки ниже 0x6000
  1091.                 RET
  1092.  
  1093. ; на входе:  BC - адрес заголовка
  1094. ; на выходе: HL - HOBETA CRC
  1095. HOB_CRC         LD A,0X0F
  1096.                 LD HL,0
  1097.                 EXX
  1098.                 LD E,0
  1099.                 EXX
  1100. HOBCRC1         EX AF,AF'
  1101.                 LD A,(BC)
  1102.                 LD E,A
  1103.                 LD D,A
  1104.                 ADD HL,DE
  1105.                 EXX
  1106.                 LD A,E
  1107.                 INC E
  1108.                 EXX
  1109.                 LD E,A
  1110.                 LD D,0
  1111.                 ADD HL,DE
  1112.                 EX AF,AF'
  1113.                 INC BC
  1114.                 DEC A
  1115.                 JR NZ,HOBCRC1
  1116.                 RET
  1117.  
  1118. CMP4FONTS       LD DE,(BUF_FILEITEM+0X1C)
  1119.                 LD HL,(BUF_FILEITEM+0X1E)
  1120.                 LD A,H
  1121.                 OR L
  1122.                 OR E
  1123.                 SCF
  1124.                 RET NZ
  1125.                 LD A,D
  1126.                 CP 8
  1127.                 SCF
  1128.                 RET NZ
  1129.                 AND A
  1130.                 RET
  1131.  
  1132. CMP4ROMS        LD DE,(BUF_FILEITEM+0X1C)
  1133.                 LD HL,(BUF_FILEITEM+0X1E)
  1134.                 LD A,H
  1135.                 OR D
  1136.                 OR E
  1137.                 SCF
  1138.                 RET NZ
  1139.                 LD A,L
  1140.                 CP 8
  1141. CMP_ROMSIZE     EQU $-1
  1142.                 SCF
  1143.                 RET NZ
  1144. CMP4ROMS1       AND A
  1145.                 RET
  1146.  
  1147. CMP4FDI         EXX
  1148.                 LD HL,BUF_RDSEC
  1149.                 LD A,(HL)
  1150.                 CP "F"
  1151.                 SCF
  1152.                 RET NZ
  1153.                 INC HL
  1154.                 LD A,(HL)
  1155.                 CP "D"
  1156.                 SCF
  1157.                 RET NZ
  1158.                 INC HL
  1159.                 LD A,(HL)
  1160.                 CP "I"
  1161.                 SCF
  1162.                 RET NZ
  1163.                 INC HL
  1164.                 INC HL
  1165.                 LD A,(HL)                       ; количество цилиндров
  1166.                 CP 0X57
  1167.                 CCF
  1168.                 RET C
  1169.                 INC HL
  1170.                 LD A,(HL)                       ; должен быть 0
  1171.                 AND A
  1172.                 SCF
  1173.                 RET NZ
  1174.                 INC HL
  1175.                 LD A,(HL)                       ; количество сторон
  1176.                 AND A
  1177.                 SCF
  1178.                 RET Z
  1179.                 CP 3
  1180.                 CCF
  1181.                 RET C
  1182.                 INC HL
  1183.                 LD A,(HL)                       ; должно быть 0
  1184.                 AND A
  1185.                 SCF
  1186.                 RET NZ
  1187.                 EXX
  1188.                 AND A
  1189.                 RET
  1190.  
  1191. CMP4IMAGE       CP 3
  1192.                 JR Z,CMP4FDI
  1193.                 CP 4
  1194.                 JR Z,CMP4BMP
  1195.                 SUB 1
  1196.                 RET Z                           ; для TRD проверка не нужка
  1197. ; для SCL проверка наличия слова "SINCLAIR" в первых 8 байтах
  1198.                 EXX
  1199.                 LD HL,BUF_RDSEC
  1200.                 LD DE,SIGN_SCL
  1201.                 LD B,8
  1202. CMP4IMAGE1      LD A,(DE)
  1203.                 CP (HL)
  1204.                 SCF
  1205.                 RET NZ
  1206.                 INC DE
  1207.                 INC HL
  1208.                 DJNZ CMP4IMAGE1
  1209.                 EXX
  1210.                 AND A
  1211. CMP4TAPES       RET
  1212.  
  1213. CMP4BMP         EXX
  1214.                 LD HL,BUF_RDSEC
  1215.                 LD A,"B"
  1216.                 SUB (HL)
  1217.                 SCF
  1218.                 RET NZ
  1219.                 INC HL
  1220.                 LD A,"M"
  1221.                 SUB (HL)
  1222.                 SCF
  1223.                 RET NZ
  1224.                 LD HL,(BUF_RDSEC+0X12)
  1225.                 LD DE,320
  1226.                 AND A
  1227.                 SBC HL,DE
  1228.                 SCF
  1229.                 RET NZ
  1230.                 LD HL,(BUF_RDSEC+0X16)
  1231.                 LD DE,200
  1232.                 AND A
  1233.                 SBC HL,DE
  1234.                 SCF
  1235.                 RET NZ
  1236.                 LD A,(BUF_RDSEC+0X1C)
  1237.                 CP 4
  1238.                 SCF
  1239.                 RET NZ
  1240.                 EXX
  1241.                 AND A
  1242.                 RET
  1243.  
  1244. SEARCH_FILE     LD A,1
  1245.                 LD HL,(GDE_EXT_FILES)
  1246.         RST8 _COM_FAT,_SET_MASK_EXT
  1247.                 LD DE,ADR_CAT_FAT               ; адрес буфера куда складировать найденное
  1248.         RST8 _COM_FAT,_FIND_FILEITEM
  1249.                 LD H,A                          ; номер страницы где найденное брать
  1250.                 LD A,B
  1251.                 OR C
  1252.                 JR NZ,SEARCHF1
  1253.                 PUSH IX
  1254.                 LD IX,NOBASIC
  1255.         RST8 _WINW
  1256.                 POP IX
  1257.         RST8 _COM_DEV,_KOL_VOL
  1258.                 DEC E
  1259.                 JP Z,NO_BAS
  1260.                 JP SELECT_DEVICE
  1261.  
  1262. SEARCHF1        PUSH BC
  1263.                 PUSH HL
  1264.         RST8 _SORT_FINDFILES
  1265.         PEC_ON M_SHADOW_BF
  1266.                 POP AF
  1267.                 LD BC,WIN_P1
  1268.                 OUT (C),A
  1269.                 LD HL,CPU1
  1270.                 LD DE,ADR_CAT_SCRH              ; адрес буфера складирования по маске
  1271.                 LD BC,0X1000
  1272.                 LDIR
  1273.                 LD BC,WIN_A1
  1274.                 LD A,0X7A
  1275.                 OUT (C),A
  1276.         PEC_OFF M_SHADOW_BF
  1277.                 POP BC
  1278.                 LD DE,ADR_CAT_FAT
  1279.                 LD HL,ADR_CAT_SCRH              ; адрес буфера складирования по маске
  1280. SEARCHF3        PUSH BC
  1281.                 LD C,(HL)
  1282.                 INC HL
  1283.                 LD B,(HL)
  1284.                 DEC HL
  1285.                 LD A,6
  1286.         RST8 _COM_FAT,_POS_FILES
  1287.                 PUSH HL
  1288.                 LD HL,BUF_FILEITEM
  1289.         RST8 _COM_FAT,_READ_DIR
  1290.                 PUSH DE
  1291.                 LD DE,0X0B
  1292.                 ADD HL,DE
  1293.                 LD A,(HL)
  1294.                 AND 0X10
  1295.                 JR NZ,SEARCHF4
  1296.         RST8 _COM_FAT,_OPEN_FILE
  1297.                 LD HL,BUF_RDSEC
  1298.                 LD A,1
  1299.         RST8 _COM_FAT,_READ_FILE
  1300.                 LD HL,BUF_FILEITEM
  1301.                 CALL CP_EXT
  1302.                 CALL 0
  1303. CMP_FOUNDED     EQU $-2
  1304. SEARCHF4        POP DE
  1305.                 POP HL
  1306.                 JR NC,SEARCHF5
  1307.                 INC HL
  1308.                 INC HL
  1309.                 JR SEARCH6
  1310.  
  1311. SEARCHF5        LDI
  1312.                 LDI
  1313. SEARCH6         POP BC
  1314.                 DEC BC
  1315.                 LD A,B
  1316.                 OR C
  1317.                 JR NZ,SEARCHF3
  1318.                 LD HL,ADR_CAT_FAT
  1319.                 EX DE,HL
  1320.                 SBC HL,DE
  1321.                 SRL H
  1322.                 RR L
  1323.                 LD B,H
  1324.                 LD C,L
  1325.                 RET
  1326.  
  1327. CPETR3          PUSH BC
  1328.                 PUSH DE
  1329.                 PUSH HL
  1330.                 LD C,0
  1331.                 LD DE,VIEW_IMAGES
  1332.                 JR CPETR2
  1333.  
  1334. CP_EXT          PUSH BC
  1335.                 PUSH DE
  1336.                 PUSH HL
  1337.                 LD C,0
  1338.                 LD DE,0
  1339. GDE_EXT_FILES   EQU $-2
  1340. CPETR2          LD A,(DE)
  1341.                 AND A
  1342.                 JR Z,CPETR1+1
  1343.                 INC C
  1344.                 PUSH DE
  1345.                 PUSH HL
  1346.                 CALL COMPARF
  1347.                 POP HL
  1348.                 POP DE
  1349.                 JR Z,CPETR1
  1350.                 INC DE
  1351.                 INC DE
  1352.                 INC DE
  1353.                 JR CPETR2
  1354.  
  1355. CPETR1          LD A,C
  1356.                 AND A
  1357.                 POP HL
  1358.                 POP DE
  1359.                 POP BC
  1360.                 RET
  1361.  
  1362. COMPARF         PUSH DE
  1363.                 LD DE,8
  1364.                 ADD HL,DE
  1365.                 POP DE
  1366.                 LD B,3
  1367. COMPARF1        LD A,(DE)
  1368.                 CP "A"
  1369.                 JR C,COMPARF2
  1370.                 AND %11011111
  1371. COMPARF2        CP (HL)
  1372.                 RET NZ
  1373.                 INC HL
  1374.                 INC DE
  1375.                 DJNZ COMPARF1
  1376.                 RET
  1377.  
  1378. ; прошиватель пзу с индикацией процесса
  1379. FLASHER         LD BC,PENT_CONF
  1380.                 XOR A
  1381.                 OUT (C),A
  1382.         PEC_ON M_SHADOW_BF
  1383.                 LD BC,0XFF77
  1384.                 LD A,0XA3
  1385.                 OUT (C),A                       ; принудительное включение турбо режима 7МГЦ
  1386.                 LD A,(CMP_ROMSIZE)
  1387.                 DEC A
  1388.                 JR NZ,FLASHER6
  1389.                 LD IX,UPDATE_CUSTOM
  1390.         RST8 _WINW
  1391.                 LD SP,ADR_CAT
  1392.         PEC_ON M_SHADOW_BF+M_FLASH_BF
  1393.                 LD BC,WIN_A0
  1394.                 LD A,0X7F
  1395.                 OUT (C),A                       ; отключение пзу в окне 0
  1396.                 LD E,0
  1397.                 LD HL,0
  1398.                 CALL ERASE_BLK                  ; стирание CUSTOM ROM страницы
  1399.                 LD A,RAM_FLASHER
  1400.                 LD E,0
  1401.                 CALL FLASH_64KB                 ; программирование CUSTOM ROM страницы
  1402.                 JP EFLASHER
  1403.  
  1404. FLASHER6        LD IX,ERASE_ROM                 ; вывод окна о стирании FLASH
  1405.         RST8 _WINW
  1406.                 LD IX,UPDATE_WIN                ; вывод окна об обновлении FLASH
  1407.         RST8 _WINW
  1408.                 LD IX,ERASE_ROM
  1409.                 LD SP,ADR_CAT
  1410.         PEC_ON M_SHADOW_BF+M_FLASH_BF           ; разрешение программирования FLASH
  1411.                 LD BC,WIN_A0
  1412.                 LD A,0X7F
  1413.                 OUT (C),A                       ; отключение rom в окне 0
  1414.                 LD A,3
  1415.                 CALL SETWIN_INDICAT             ; установка индикатора процесса
  1416.                 LD E,0
  1417.                 LD HL,0
  1418. FLASHER4        CALL ERASE_BLK                  ; стирание блока 64КБ
  1419.                 CALL INC_INDICAT                ; обновление индикатора процесса
  1420.                 INC E                           ; следующий блок       
  1421.                 BIT 3,E
  1422.                 JR Z,FLASHER4
  1423.                 LD IX,UPDATE_WIN
  1424.                 LD A,RAM_FLASHER                ; страница начала загруженного ROM файла
  1425.                 LD E,0
  1426. FLASHER3        CALL FLASH_64KB                 ; прошивание одной 64КБ страницы
  1427.                 INC E                           ; следующая 64кб страница
  1428.                 BIT 3,E
  1429.                 JR Z,FLASHER3
  1430. EFLASHER        LD BC,WIN_P3
  1431.                 XOR A
  1432.                 OUT (C),A                       ; включение RAM в окне 3
  1433.                 LD A,(CPU3+0X20)
  1434.                 XOR B
  1435.                 LD (CPU3+0X20),A                ; меняем байт для нарушения CRC контроля и полного реинита
  1436.                 LD A,(CPU1+BUF_TABLVOL+0XFE)
  1437.                 XOR B
  1438.                 LD (CPU1+BUF_TABLVOL+0XFE),A    ; аналогично для DEVICE MANAGER
  1439.         PEC_OFF M_FLASH_BF
  1440.                 LD HL,0X79ED                    ; OUT (C),A
  1441.                 LD (0XFFFE),HL                  ; укладка команды OUT (C),A
  1442.                 LD BC,0XBC77
  1443.                 LD A,2
  1444.                 JP 0XFFFE
  1445.  
  1446. ; прошивание одной 64КБ страницы
  1447. ; вход: A = номер 16КБ страницы откуда брать байты для прошивания
  1448. ;       E = номер прошиваемой 64КБ страницы
  1449. FLASH_64KB      LD HL,0
  1450.                 PUSH AF
  1451.                 LD A,E
  1452.                 ADD A,2
  1453.                 CALL SETWIN_INDICAT             ; обновление индикатора процесса
  1454.                 POP AF
  1455. FLASHER2        PUSH AF
  1456.                 LD BC,WIN_P0
  1457.                 OUT (C),A                       ; включение страницы RAM откуда брать байты для прошивания
  1458.                 PUSH IX
  1459.                 LD IX,0
  1460. FLASHER1        LD A,(IX)                       ; взяли байт для прошивания
  1461.                 INC A
  1462.                 JR Z,FLASHER5                   ; если байт = 0xFF, то не прошиваем
  1463.                 DEC A
  1464.                 CALL PGM_BYTE                   ; прошили байт
  1465. FLASHER5        INC IX
  1466.                 INC HL
  1467.                 LD A,H
  1468.                 AND 0X0F
  1469.                 OR L
  1470.                 CALL Z,INC_INDICAT              ; обновили индикатор если прошили 4КБ
  1471.                 LD A,IXH
  1472.                 AND 0X40
  1473.                 JR Z,FLASHER1                   ; продолжаем пока не кончится страница выборки байт
  1474.                 POP IX
  1475.                 POP AF
  1476.                 INC A                           ; следующая страница откуда байты брать для прошивания
  1477.                 LD D,A                          ; временно сохранили
  1478.                 LD A,H                          ; проверка на окончание 64КБ страницы
  1479.                 AND A
  1480.                 LD A,D                          ; восстановили
  1481.                 JR NZ,FLASHER2
  1482.                 RET
  1483.