Subversion Repositories pentevo

Rev

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

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