Subversion Repositories pentevo

Rev

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

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