Subversion Repositories ngs

Rev

Rev 112 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed | ?url?

  1.  
  2. ;LAST UPDATE: 24.04.2014 savelij
  3.  
  4.                 include ../macros.a80
  5.                 include ../ports_ngs.a80
  6.                 include ../sdcomand.a80
  7.  
  8. ;АДРЕС ЗАГРУЗКИ НАЙДЕННОЙ ПРОШИВКИ
  9. ADRLOAD         EQU 0X8000
  10.  
  11. RAMCOD          EQU 0X4080                      ;АДРЕС РАБОТЫ ОСНОВНОГО КОДА
  12. RAM8KB          EQU 0X6000                      ;АДРЕС БУФЕРА ДЛЯ ПЕРЕБРОСКИ КОДА
  13. STRPAG          EQU 0X8000                      ;АДРЕС КУДА ЗАГРУЗКИ
  14.  
  15. FREQUENCY       EQU C_20MHZ                     ;ТЕКУЩАЯ ЧАСТОТА ДЛЯ ОСНОВНОЙ ПРОШИВКИ
  16.  
  17.                 ORG 0
  18.                 DI
  19.                 LD SP,RAMCOD
  20.                 XOR A
  21.                 OUT (VOL1),A
  22.                 OUT (VOL2),A
  23.                 OUT (VOL3),A
  24.                 OUT (VOL4),A
  25.                 OUT (VOL5),A
  26.                 OUT (VOL6),A
  27.                 OUT (VOL7),A
  28.                 OUT (VOL8),A                    ;ЗАГЛУШИЛИ МОД ПОРТЫ ДЛЯ ИСПОЛЬЗОВАНИЯ БУФЕРА
  29.  
  30. ;               JP RDBYT_DBG                    ;ОТЛАДОЧНАЯ ФИГНЯ
  31.  
  32. ;ОЖИДАНИЕ ЗАГРУЗКИ ПРОШИВКИ СО СПЕКА
  33.                 LD B,0                          ;ЧИТАЕМ 256 ПОРТ СТАТУСА
  34.                 IN A,(ZXSTAT)                   ;НА ПРЕДМЕТ ИЗМЕНЕНИЯ СОСТОЯНИЯ
  35.                 RRA
  36.                 JR C,RDBYT01
  37.                 DJNZ $-5
  38.                 DEC B                           ;СЧЕТЧИК ОБНУЛИЛСЯ, СОСТОЯНИЕ ПОРТА НЕ ИЗМЕНИЛОСЬ
  39.                 JR RDBYT03                      ;ГРУЗИМ СТАНДАРТНУЮ ПРОШИВКУ
  40.  
  41. RDBYT01         IN A,(ZXCMD)                    ;ЧИТЕМ ПРИШЕДШИЙ БАЙТ ИЗ ПОРТА КОМАНД
  42.                 LD C,A                          ;СОХРАНИЛИ ДЛЯ ПРОВЕРКИ
  43.                 IN A,(ZXDATRD)                  ;ЧИТЕМ БАЙТ ИЗ ПОРТА ДАННЫХ
  44.                 OUT (CLRCBIT),A                 ;СБРОСИЛИ КОМАНД БИТ
  45.                 CP C                            ;СРАВНИВАЕМ ПРИШЕДШИЕ БАЙТЫ
  46.                 JR NZ,RDBYT03                   ;НЕ СОВПАЛИ, ГРУЗИМ СТАНДАРТНУЮ ПРОШИВКУ
  47.                 CP 0X55                         ;ПРИШЕЛ БАЙТ 0X55?
  48.                 JR NZ,RDBYT03                   ;ЕСЛИ НЕТ, ГРУЗИМ СТАНДАРТНУЮ ПРОШИВКУ
  49.                 LD B,0                          ;ЧИТАЕМ 256 РАЗ ИЗМЕНЕНИЕ ПОРТА КОМАНД
  50.                 IN A,(ZXSTAT)
  51.                 RRA
  52.                 JR C,RDBYT02
  53.                 DJNZ $-5
  54.                 DEC B
  55.                 JR RDBYT03                      ;НЕ ДОЖДАЛИСЬ, ГРУЗИМ СТАНДАРТНУЮ ПРОШИВКУ
  56.  
  57. RDBYT02         IN A,(ZXCMD)                    ;ЗАБРАЛИ БАЙТ ИЗ ПОРТА КОМАНД
  58.                 LD C,A                          ;СОХРАНИЛИ ДЛЯ ПРОВЕРКИ
  59.                 IN A,(ZXDATRD)                  ;ЗАБРАЛИ БАЙТ ИЗ ПОРТА ДАННЫХ
  60.                 CP C                            ;СРАВНИЛИ
  61.                 JR NZ,RDBYT03                   ;ЕСЛИ НЕ СОВПАДАЮТ, ГРУЗИМ СТАНДАРТНУЮ ПРОШИВКУ
  62. RDBYT_DBG       CP 0XAA                         ;ЭТО 0XAA?
  63. RDBYT03         EX AF,AF'                       ;ВРЕМЕННО СПРЯТАЛИ ФЛАГИ ПРОЦЕССОРА
  64.                 LD HL,GRUZILA
  65.                 LD DE,RAMCOD
  66.                 LD BC,RAMCEND-VERLOAD
  67.                 LDIR                            ;ПЕРЕНЕСЛИ ОСНОВНОЙ КОД В АДРЕС РАБОТЫ
  68.                 OUT (CLRCBIT),A                 ;СБРОСИЛИ КОМАНД БИТ
  69.                 EX AF,AF'                       ;ВЕРНУЛИ СПРЯТАННЫЕ ФЛАГИ
  70.                 JP Z,GRUZIM2                    ;ЕСЛИ ВСЕ УСЛОВИЯ СОВПАЛИ, ЗАПУСКАЕМ ЗАГРУЗЧИК
  71.                 JP GRUZIM0                      ;ИНАЧЕ ГРУЗИМ СТАНДАРТНУЮ ПРОШИВКУ ИЗ ПЗУ
  72.  
  73. GRUZILA
  74.                 PHASE RAMCOD
  75.  
  76. VERLOAD         DB "Loader"
  77.                 DW DATA_VERS
  78.  
  79. ;ПУТЬ ДО ФАЙЛА ПРОШИВКИ GS
  80. F_PATH          DB "NEOGS.ROM",0
  81.  
  82. UPDATENAME      DB "NGS_ROM.UPD",0
  83.  
  84. TXT1            DB "not found",0
  85. TXT1E
  86. TXT2            DB "beta",0
  87. TXT2E
  88. TXT3            DB 0;"stable",0
  89. TXT3E
  90.  
  91. GRUZIM0         CALL RROMSD                     ;ЗАГРУЖАЕМ И ЗАПУСКАЕМ ПРОШИВКУ С SD КАРТЫ, ЕСЛИ ОНА ТАМ ЕСТЬ
  92.                 JP GS105                        ;ИНАЧЕ ЗАГРУЖАЕМ ПРОШИВКУ ИЗ ПЗУ И ЗАПУСКАЕМ
  93.  
  94. GRUZIM2         LD A,0X11                       ;КОНФИГУРИМ НГС
  95.                 LD (NGS_MODES),A
  96.                 OUT (GSCFG0),A                  ;ОТРУБАЕМ ПЗУ И ВРУБАЕМ ЧАСТОТУ 12МГЦ
  97.                 XOR A
  98.                 OUT (MPAG),A                    ;ВКЛЮЧАЕМ СТРАНИЦУ 0
  99. GRUZIM          IN A,(ZXSTAT)                   ;ПОСТОЯННО ЖДЕМ КОМАНД ОТ СПЕКА
  100.                 RRA
  101.                 JR NC,GRUZIM
  102.                 IN A,(ZXCMD)                    ;ПОЙМАЛИ КОМАНДУ
  103.                 CP 0X1D                         ;ЭТО КОМАНДА ПРОВЕРКИ?
  104.                 JR NZ,GRUZIM1
  105.                 LD A,0X76
  106.                 OUT (ZXDATWR),A                 ;ОТДАЕМ БАЙТ ИДЕНТИФИКАЦИИ ЗАГРУЗЧИКА
  107.                 OUT (CLRCBIT),A
  108.                 JR GRUZIM                       ;И ПРОДОЛЖАЕМ ЖДАТЬ КОМАНД
  109.  
  110. GRUZIM1         CP 0XF3
  111.                 JP Z,GS105                      ;ПРИ ПОСТУПЛЕНИИ КОМАНД 0XF3 И
  112.                 CP 0XF4
  113.                 JP Z,GS105                      ;0XF4 ЗАГРУЖАЕМ И ЗАПУСКАЕМ ПРОШИВКУ ИЗ ПЗУ
  114.                 CP LOW (FLOADE-FLOADER)/2+1
  115.                 JP NC,GS105                     ;АНАЛОГИЧНО НЕ КОМАНДА ЗАГРУЗЧИКА ПЕРЕХОДИМ НА ОСНОВНОЕ ПЗУ
  116.                 ADD A,A
  117.                 LD L,A
  118.                 LD H,0
  119.                 LD DE,GRUZIM2
  120.                 PUSH DE                         ;НА СТЕКЕ АДРЕС ВОЗВРАТА ПОСЛЕ ИСПОЛНЕНИЯ КОМАНДЫ
  121.                 LD DE,FLOADER
  122.                 ADD HL,DE
  123.                 LD E,(HL)
  124.                 INC HL
  125.                 LD D,(HL)                       ;ЗАБРАЛИ АДРЕС ИСПОЛНЕНИЯ КОМАНДЫ
  126.                 EX DE,HL
  127.                 JP (HL)                         ;ПОЕХАЛИ НА ИСПОЛНЕНИЕ
  128.  
  129. FLOADER         DW LOADROM                      ;00 ЗАГРУЗКА ROM СО СПЕКА ВМЕСТО СКОПИРОВАННОЙ ИЗ ROM
  130.                 DW JPLDROM                      ;01 ЗАПУСК ЗАГРУЖЕННОЙ ПРОШИВКИ
  131.                 DW GS105                        ;02 КОПИРОВАНИЕ ИЗ ROM И ЗАПУСК
  132.                 DW RROMSD                       ;03 ЗАГРУЗКА И ЗАПУСК ROM С SD КАРТЫ
  133.                 DW LOADCOD                      ;04 ЗАГРУЗКА КОДА СО СПЕКА
  134.                 DW LDINSD                       ;05 ЗАГРУЗКА ФАЙЛА С SD КАРТЫ
  135.                 DW RUNCOD                       ;06 ЗАПУСК КОДА С ЛЮБОГО АДРЕСА И В ЛЮБОЙ СТРАНИЦЕ
  136.                 DW STATSD                       ;07 СТАТУС ЗАГРУЖЕННОГО ФАЙЛА
  137.                 DW VERPAGE                      ;08 ВЕРСИЯ В ТЕКСТОВОМ ВИДЕ ДЛЯ УКАЗАННОЙ СТРАНИЦЕ
  138.                 DW GET_CRC                      ;09 ПОЛУЧИТЬ CRC16
  139.                 DW LOADUPDATE                   ;0A ЗАГРУЗКА ФАЙЛА С ОБНОВЛЕНИЕМ
  140.                 DW SET_FREQ                     ;0B УСТАНОВКА ЧАСТОТЫ ПРОЦЕССОРА
  141. FLOADE
  142.  
  143. SET_FREQ        IN A,(ZXDATRD)                  ;ПРИНЯЛИ НОМЕР ЧАСТОТЫ
  144.                 BIT 7,A
  145.                 JR NZ,SET_FREQ2
  146.                 OUT (CLRCBIT),A                 ;СБРОСИЛИ КОМАНД БИТ
  147.                 AND 3
  148.                 LD L,C_10MHZ                    ;УСТАНОВКА ЧАСТОТЫ 10 МГЦ
  149.                 JR Z,SET_FREQ1
  150.                 DEC A
  151.                 LD L,C_12MHZ                    ;УСТАНОВКА ЧАСТОТЫ 12 МГЦ
  152.                 JR Z,SET_FREQ1
  153.                 DEC A
  154.                 LD L,C_20MHZ                    ;УСТАНОВКА ЧАСТОТЫ 20 МГЦ
  155.                 JR Z,SET_FREQ1
  156.                 LD L,C_24MHZ                    ;УСТАНОВКА ЧАСТОТЫ 24 МГЦ
  157. SET_FREQ1       LD A,(NGS_MODES)
  158.                 AND %11001111
  159.                 OR L
  160.                 LD (NGS_MODES),A
  161.                 OUT (GSCFG0),A
  162.                 RET
  163.  
  164. SET_FREQ2       LD A,(NGS_MODES)
  165.                 AND 0X30
  166.                 RRCA
  167.                 RRCA
  168.                 RRCA
  169.                 RRCA
  170.                 OUT (CLRCBIT),A
  171.                 OUT (ZXDATWR),A
  172.                 JP WDN
  173.  
  174. ;ПЕРЕДАЧА НА СПЕК ВЕРСИИ В TXT ВИДЕ
  175. VERPAGE         IN A,(ZXDATRD)                  ;ЗАБРАЛИ БАЙТ НОМЕРА ЗАПРОШЕННОЙ СТРАНИЦЫ ПЗУ
  176.                 AND 7                           ;СТАРШИЕ 5 БИТ В ИГНОРЕ
  177.                 EX AF,AF'                       ;ВРЕМЕННО СПРЯТАЛИ ФЛАГИ ПРОЦА
  178.                 LD A,0X30
  179.                 OUT (GSCFG0),A                  ;ВКЛЮЧИЛИ 10 МГЦ И ВЕРНУЛИ ПЗУ
  180.                 EX AF,AF'                       ;ВЕРНУЛИ ФЛАГИ
  181.                 ADD A,A                         ;НАМ НУЖНА ВТОРЫЕ 32К СТРАНИЦЫ ПЗУ
  182. ;               AND A                           ;ВЫБРАНА СТРАНИЦА 0?
  183. ;               JR NZ,VERPAG1                   ;ЕСЛИ НЕТ, ТО ИДЕМ НА ИЗВЛЕЧЕНИЕ ПОСЛЕДНИХ 8 БАЙТ
  184. ;               LD HL,VERLOAD                   ;ДЛЯ ЗАГРУЗЧИКА БЕРЕМ ИЗ ДРУГОГО АДРЕСА
  185. ;               LD DE,RAMCEND
  186. ;               LD BC,8
  187. ;               PUSH DE
  188. ;               LDIR
  189. ;               POP DE
  190. ;               JR VERPAG2                      ;ПОШЛИ НА ПЕРЕВОДЧИК В ТЕКСТОВЫЙ ВИД
  191.  
  192. VERPAG1         INC A
  193.                 OUT (MPAG),A                    ;ВКЛЮЧИЛИ ПОСЛЕДНИЕ 16К ВЫБРАННОЙ СТРАНИЦЫ ПЗУ
  194.                 LD HL,0XFFF8
  195.                 LD BC,8
  196.                 LD DE,RAMCEND
  197.                 PUSH DE
  198.                 LDIR                            ;ПЕРЕНЕСЛИ 8 БАЙТ ИЗ ХВОСТА ПЗУ
  199.                 POP DE
  200. VERPAG2         LD A,0X11
  201.                 OUT (GSCFG0),A                  ;ОТРУБИЛИ ПЗУ И ВЕРНУЛИ 12МГЦ
  202.                 XOR A
  203.                 OUT (MPAG),A                    ;ВЕРНУЛИ СТРАНИЦУ 0 ОЗУ
  204.                 LD B,8                          ;ПРОВЕРЯМ ПЕРЕНЕСЕННЫЕ 8 БАЙТ, А НЕ 0XFF ЛИ ТАМ?
  205.                 LD A,(DE)
  206.                 INC DE
  207.                 INC A
  208.                 JR NZ,VFPGA1                    ;НЕ 0XFF, ПРОДОЛЖАЕМ
  209.                 DJNZ $-5
  210.                 DEC SP                          ;ТАКИ ВСЕ 8 БАЙТ 0XFF, ВЕРСИИ У ПЗУ СТРАНИЦЫ НЕТУ
  211.                 DEC SP
  212.                 POP DE
  213.                 LD HL,TXT1
  214.                 LD BC,TXT1E-TXT1
  215.                 LDIR                            ;ОТДАТЬ ТЕКСТ ОБ ЭТОМ
  216.                 JR VFPGA0
  217.  
  218. VFPGA1          DEC SP
  219.                 DEC SP
  220.                 POP DE
  221.                 CALL UNVERS                     ;РАСПАКОВКА ПОЛУЧЕННЫХ 8 БАЙТ В ТЕКСТ
  222. VFPGA0          OUT (CLRCBIT),A                 ;СБРОСИЛИ КОМАНД БИТ
  223.                 LD HL,RAMCEND
  224.                 LD BC,ZXDATWR
  225. VFPGA2          LD A,(HL)
  226.                 OUTI
  227.                 EX AF,AF'
  228.                 CALL WDN
  229.                 EX AF,AF'
  230.                 AND A
  231.                 JR NZ,VFPGA2                    ;ОТДАЕМ ТЕКСТ ВЕРСИИ ПОКА НЕ ВСТРЕТИТСЯ БАЙТ 0, КОТОРЫЙ ТОЖЕ ОТДАЕМ
  232.                 RET
  233.  
  234. ;РАСПАКОВЩИК ДАТЫ
  235. UNVERS          LD HL,6
  236.                 ADD HL,DE                       ;ПРОПУСТИЛИ 6 БАЙТ ТЕКСТА ВЕРСИИ
  237.                 LD C,(HL)                       ;ЗАБРАЛИ МЛАДШИЙ БАЙТ ВЕРСИИ
  238.                 LD (HL)," "                     ;НА ЕГО МЕСТО ПРОБЕЛ
  239.                 INC HL
  240.                 LD B,(HL)                       ;ЗАБРАЛИ СТАРШИЙ БАЙТ
  241.                 LD A,C                          ;ВЗЯЛИ МЛАДШИЙ БАЙТ ВЕРСИИ
  242.                 AND 0X1F                        ;НАС ИНТЕРЕСУЮТ МЛАДШИЕ 5 БИТ (ДЕНЬ МЕСЯЦА)
  243.                 JR NZ,$+4
  244.                 RES 7,B                         ;ЕСЛИ ПОЛУЧИЛСЯ 0, ВОЗМОЖНО ЭТО БЕТА ВЕРСИЯ
  245.                 CP 32
  246.                 JR C,$+4                        ;В МЕСЯЦЕ НЕ МОЖЕТ БЫТЬ БОЛЕЕ 31 ДНЯ
  247.                 RES 7,B                         ;ИНАЧЕ ЭТО БЕТА ВЕРСИЯ
  248.                 CALL A2TXT                      ;ПЕРЕВОДИМ ПОЛУЧЕННОЕ ЧИСЛО В ТЕКСТ
  249.                 SRL B                           ;СДИНУЛИ ВЕРСИЮ НА 1 БИТ ВЛЕВО ЧТОБЫ НОМЕР МЕСЯЦА
  250.                 RR C                            ;ОКАЗАЛСЯ В ОДНОМ БАЙТЕ
  251.                 LD A,C                          ;ЗАБРАЛИ ЭТОТ БАЙТ
  252.                 RRCA
  253.                 RRCA
  254.                 RRCA
  255.                 RRCA                            ;СДВИНУЛИ НУЖНЫЕ БИТЫ В МЛАДШИЕ РАЗРАДЫ БАЙТА
  256.                 AND 0X0F                        ;ОСТАВИЛИ НУЖНЫЕ 4 БИТА (НОМЕР МЕСЯЦА)
  257.                 JR NZ,$+4                       ;НОМЕР МЕСЯЦА НЕМОЖЕТ БЫТЬ 0
  258.                 RES 6,B                         ;ИНАЧЕ ЭТО БЕТА ВЕРСИЯ
  259.                 CP 13                           ;И НОМЕР МЕСЯЦА НЕ МОЖЕТ БЫТЬ БОЛЬШЕ 12
  260.                 JR C,$+4
  261.                 RES 6,B                         ;ИНАЧЕ БЕТА ВЕРСИЯ
  262.                 LD (HL),"."                     ;ОТДЕЛИЛИ НОМЕР ДНЯ МЕСЯЦА ТОЧКОЙ
  263.                 INC HL
  264.                 CALL A2TXT                      ;КОНВЕРТИРОВАЛИ НОМЕР МЕСЯЦА
  265.                 LD (HL),"."                     ;ТАК ЖЕ ОТДЕЛИЛИ ТОЧКОЙ
  266.                 INC HL
  267.                 LD A,B                          ;ВЗЯЛИ ОСТАВШИЕСЯ БИТЫ
  268.                 AND 0X3F                        ;НАМ НУЖНЫ 6 БИТ НОМЕРА ГОДА
  269.                 CALL A2TXT                      ;КОНВЕРТНУЛИ В ТЕКСТ
  270.                 BIT 6,B                         ;БЕТА ИЛИ ЫТАБЛ ВЕРСИЯ?
  271.                 JR NZ,UNVERS1
  272.                 LD DE,TXT2                      ;ВСЕ-ТАКИ БЕТА, О ЧЕМ И ДОБАВЛЯЕМ ТЕКСТ К ВЕРСИИ
  273.                 LD BC,TXT2E-TXT2
  274.                 JR UNVERS2
  275.  
  276. UNVERS1         LD DE,TXT3                      ;ВЕРСИЯ СТАБЛ
  277.                 LD BC,TXT3E-TXT3
  278. UNVERS2         LD (HL)," "                     ;ПЕРЕД ТЕКСТОМ (БЕТА ИЛИ СТАБЛ) ВСТАВЛЯЕМ ПРОБЕЛ
  279.                 INC HL
  280.                 EX DE,HL
  281.                 LDIR                            ;ПЕРЕТАЩИЛИ ТЕКСТ
  282.                 EX DE,HL
  283.                 LD (HL),0                       ;ЗАВЕРШИЛИ СТРОКУ НУЛЕМ
  284.                 RET
  285.  
  286. ;ПЕРЕВОД "A" В ДЕСЯТИЧНЫЙ ВИД И В ТЕКСТ. ДЛЯ ЧИСЕЛ ОТ 0 ДО 99
  287. A2TXT           PUSH HL                         ;СОХРАНИЛИ АДРЕС КУДА ЛОЖИТЬ СКОНВЕРЧЕННОЕ
  288.                 LD L,A
  289.                 LD H,0
  290.                 LD DE,10
  291.                 XOR A
  292.                 DEC A
  293.                 INC A
  294.                 SBC HL,DE
  295.                 JR NC,$-3                       ;СЧИТАЕМ КОЛИЧЕСТВО ДЕСЯТКОВ В ЧИСЛЕ
  296.                 ADD HL,DE                       ;ВЕРНУЛИ ПЕРЕБОР ВЫЧИТАНИЯ
  297.                 ADD A,"0"                       ;ПЕРЕВЕЛИ В ТЕСКТОВЫЙ ВИД ПОЛУЧЕННОЕ ЧИСЛО
  298.                 LD D,A                          ;ПОКА СОХРАНИЛИ
  299.                 LD A,L                          ;ВЗЯЛИ ОСТАВШИЕСЯ ЕДИНИЦЫ ЧИСЛА
  300.                 ADD A,"0"                       ;КОНВЕРТУЛИ В ТЕКСТ
  301.                 POP HL                          ;ВЕРНУЛИ АДРЕС КУДА ЛОЖИТЬ
  302.                 LD (HL),D                       ;ПОЛОЖИЛИ ДЕСЯТКИ ЗАДАННОГО ЧИСЛА
  303.                 INC HL
  304.                 LD (HL),A                       ;ПОЛОЖИЛИ ЕДИНИЦЫ ТОГО ЖЕ ЧИСЛА
  305.                 INC HL
  306.                 RET
  307.  
  308. ;ЗАГРУЗКА С SD КАРТЫ ПО УКАЗАННОМУ ПУТИ
  309. ;ПЕРВЫЙ БАЙТ-НОМЕР СТРАНИЦЫ ОЗУ КУДА НАЧИНАТЬ ГРУЗИТЬ
  310. ;ДАЛЕЕ БАЙТЫ ТЕКСТОВОЙ СТРОКА ПУТИ И ИМЕНИ ФАЙЛА
  311. ;КОНЕЦ СТРОКИ БАЙТ 0, ОН ЖЕ СТОП БАЙТ
  312. LDINSD          LD BC,ZXDATRD                   ;АДРЕС ПОРТА ДАННЫХ
  313.                 LD HL,RAMCEND                   ;АДРЕС КУДА СТРОКУ ПУТИ СКЛАДИРОВАТЬ
  314.                 PUSH HL
  315.                 IN A,(C)                        ;ПРИНЯЛИ НОМЕР СТРАНИЦЫ ОТКУДА НАЧИНАТЬ ЗАГРУЗКУ
  316.                 OUT (CLRCBIT),A                 ;СБРОСИЛИ КОМАНД БИТ
  317.                 EX AF,AF'
  318. LDINSD1         CALL WDY
  319.                 IN A,(C)
  320.                 LD (HL),A
  321.                 INC HL
  322.                 AND A
  323.                 JR NZ,LDINSD1                   ;ПРИНИМАЕМ СТРОКУ ПОКА НЕ ВСТРЕТИТСЯ БАЙТ 0
  324.                 EX AF,AF'
  325.                 POP HL
  326.                 JP LOAD_SD                      ;ДАЛЕЕ ЗАПУСКАЕМ ЗАГРУЗКУ С SD КАРТЫ
  327.  
  328. ;ЗАГРУЗКА ФАЙЛА С ОБНОВЛЕНИЯМИ
  329. LOADUPDATE      LD HL,UPDATENAME                ;ИМЯ ФАЙЛА ОБНОВЛЕНИЯ
  330.                 LD A,2                          ;ГРУЗИТЬ НАЧИНАЯ СО 2 СТРАНИЦЫ
  331.                 OUT (CLRCBIT),A
  332.                 JP LOAD_SD
  333.  
  334. ;СТАТУС ЗАГРУЗКИ ФАЙЛА С SD КАРТЫ
  335. STATSD          LD A,(STATUS)
  336.                 OUT (ZXDATWR),A
  337.                 OUT (CLRCBIT),A
  338.                 RET
  339.  
  340. ;ЗАГРУЗКА И ЗАПУСК ПРОШИВКИ С SD КАРТЫ
  341. ;ИМЯ, ПУТЬ И АДРЕС ФИКСИРОВАН
  342. RROMSD          LD HL,F_PATH                    ;АДРЕС СТРОКИ ФИКСИРОВАННОГО ПУТИ ДЛЯ ЗАГРУЗКИ
  343.                 XOR A
  344.                 CALL LOAD_SD                    ;ЗАГРУЖАЕМ
  345.                 AND A
  346.                 RET NZ                          ;ЕСЛИ ОШИБКА, ТО ГРУЗИМ ИЗ ПЗУ
  347.                 JP JPLDROM
  348.  
  349. ;ЗАПУСК КОДА В ЛЮБОЙ СТРАНИЦЕ
  350. ;0-НОМЕР СТРАНИЦЫ ОЗУ
  351. ;1-МЛАДШИЙ БАЙТ АДРЕСА ЗАПУСКА
  352. ;2-СТАРШИЙ БАЙТ АДРЕСА ЗАПУСКА
  353. RUNCOD          LD BC,ZXDATRD                   ;АДРЕС ПОРТА ДАННЫХ
  354.                 IN A,(C)                        ;ПРИНЯЛИ НОМЕР СТРАНИЦЫ ОЗУ
  355.                 OUT (CLRCBIT),A                 ;СБРОСИЛИ КОМАНД БИТ
  356.                 OUT (MPAG),A
  357.                 CALL WDY
  358.                 IN L,(C)                        ;ПРИНЯЛИ МЛАДШИЙ БАЙТ АДРЕСА ЗАПУСКА
  359.                 CALL WDY
  360.                 IN H,(C)                        ;ПРИНЯЛИ СТАРШИЙ БАЙТ АДРЕСА ЗАПУСКА
  361.                 JP (HL)                         ;ЗАПУСКАЕМ
  362.  
  363. ;0-НОМЕР СТРАНИЦЫ ОЗУ
  364. ;1-МЛАДШИЙ БАЙТ ДЛИНЫ ЗАГРУЗКИ
  365. ;2-СТАРШИЙ БАЙТ ДЛИНЫ ЗАГРУЗКИ
  366. ;ЗАГРУЗКА НЕ БОЛЕЕ 32КБ
  367. LOADCOD         LD BC,ZXDATRD                   ;АДРЕС ПОРТА ДАННЫХ
  368.                 LD HL,0X8000                    ;АДРЕС НАЧАЛА ЗГРУЗКИ
  369.                 IN A,(C)                        ;ПРИНЯЛИ НОМЕР СТРАНИЦЫ ОЗУ
  370.                 OUT (CLRCBIT),A                 ;СБРОСИЛИ КОМАНД БИТ
  371.                 OUT (MPAG),A                    ;ВКЛЮЧИЛИ ЗАДАННУЮ СТРАНИЦУ ОЗУ
  372.                 CALL WDY
  373.                 IN E,(C)                        ;ПРИНЯЛИ МЛАДШИЙ БАЙТ ДЛИНЫ ЗАГРУЗКИ
  374.                 CALL WDY
  375.                 IN D,(C)                        ;ПРИНЯЛИ СТАРШИЙ БАЙТ ДЛИНЫ ЗГАРУЗКИ
  376. LOADCO1         CALL WDY
  377.                 INI
  378.                 LD A,H
  379.                 AND A
  380.                 RET Z                           ;ЕСЛИ ОЗУ КОНЧИЛОСЬ, ВЫХОДИМ
  381.                 DEC DE
  382.                 LD A,D
  383.                 OR E
  384.                 JR NZ,LOADCO1                   ;ГРУЗИМ СКОКА УКАЗАНО
  385.                 RET
  386.  
  387. ;ЗАГРУЗКА ПРОШИВКИ 32КБ СО СПЕКА
  388. LOADROM         XOR A
  389.                 OUT (MPAG),A                    ;ВКЛЮЧАЕМ СТРАНИЦУ
  390.                 LD HL,0X8000                    ;АДРЕС ЗАГРУЗКИ
  391.                 OUT (CLRCBIT),A                 ;СБРОС КОМАНД БИТА
  392.                 LD BC,ZXDATRD                   ;АДРЕС ПОРТА ДАННЫХ
  393. LOADROM1        CALL WDY
  394.                 INI
  395.                 LD A,H
  396.                 AND A
  397.                 JR NZ,LOADROM1                  ;ГРУЗИМ ПОКА ПАМЯТЬ НЕ КОНЧИТСЯ
  398.                 RET
  399.  
  400. ;ГРУЗИЛКА СТАНДАРТНОЙ ПРОШИВКИ ИЗ ROM
  401. GS105           LD HL,STRPAG                    ;АДРЕС КУДА ПЕРЕНОСИТЬ
  402.                 LD A,4                          ;ПЕРЕНОСИТЬ 4 КУСКА ПО 8 КИЛОБАЙТ
  403. MOV1            EX AF,AF'                       ;ПРЯЧЕМ СЧЕТЧИК
  404.                 LD A,0X30
  405.                 OUT (GSCFG0),A                  ;ВКЛЮЧИЛИ ПЗУ
  406.                 LD A,2
  407.                 OUT (MPAG),A                    ;СТРАНИЦУ 2 СО СТАНДАРТНОЙ ПРОШИВКОЙ
  408.                 PUSH HL
  409.                 LD DE,RAM8KB
  410.                 LD BC,0X2000
  411.                 LDIR                            ;ПЕРЕНЕСЛИ В БУФЕР 8 КИЛОБАЙТ
  412.                 LD A,0X31
  413.                 OUT (GSCFG0),A                  ;ПЕРЕКЛЮЧИЛИ ПЗУ
  414.                 XOR A
  415.                 OUT (MPAG),A                    ;ВКЛЮЧИЛИ СТРАНИЦУ 0 ОЗУ
  416.                 POP DE
  417.                 LD HL,RAM8KB
  418.                 LD BC,0X2000
  419.                 LDIR                            ;ПЕРЕНЕСЛИ ИЗ БУФЕРА 8 КИЛОБАЙТ
  420.                 EX DE,HL
  421.                 EX AF,AF'
  422.                 DEC A
  423.                 JR NZ,MOV1                      ;И ТАК 4 РАЗА
  424.  
  425. ;ЗАПУСК ЗАГРУЖЕННОЙ ПРОШИВКИ
  426. JPLDROM         XOR A
  427.                 OUT (MPAG),A                    ;ВКЛЮЧИЛИ СТРАНИЦУ 0 ОЗУ
  428. ;               LD A,0X13                       ;ВКЛЮЧИЛИ ЧАСТОТУ 12МГЦ, ОТКЛЮЧИЛИ ПЗУ И ЗАЩИТИЛИ ОЗУ ОТ ЗАПИСИ
  429. ;               LD A,0X23                       ;ВКЛЮЧИЛИ ЧАСТОТУ 20МГЦ, ОТКЛЮЧИЛИ ПЗУ И ЗАЩИТИЛИ ОЗУ ОТ ЗАПИСИ
  430.                 LD A,3+FREQUENCY                ;ВКЛЮЧИЛИ УКАЗАННУЮ ЧАСТОТУ, ОТКЛЮЧИЛИ ПЗУ И ЗАЩИТИЛИ ОЗУ ОТ ЗАПИСИ
  431.                 OUT (GSCFG0),A
  432.                 JP 0                            ;СТАРТУЕМ СТАНДАРТНУЮ ПРОШИВКУ
  433.  
  434. ;ЖДЕМ ПОКА СПЕК ДАСТ БАЙТ
  435. WDY             IN A,(ZXSTAT)
  436.                 RLA
  437.                 JR NC,WDY
  438.                 RET
  439.  
  440. ;ЖДЕМ ПОКА СПЕК ЗАБЕРЕТ БАЙТ ИЗ ПОРТА
  441. WDN             IN A,(ZXSTAT)
  442.                 RLA
  443.                 JR C,WDN
  444.                 RET
  445.  
  446. ;ПОДСЧЕТ CRC16
  447. GET_CRC         LD A,2
  448.                 OUT (MPAG),A
  449.                 DEC A
  450.                 OUT (GSCFG0),A
  451.                 LD HL,(0X8000)
  452.                 SRL H
  453.                 RR L
  454.                 SRL H
  455.                 RR L
  456.                 SRL H
  457.                 RR L
  458.                 SRL H
  459.                 RR L
  460.                 LD A,L
  461.                 LD IYH,A
  462. ;               LD IX,0X8000
  463. ;               LD C,(IX+0)
  464. ;               LD B,(IX+1)
  465. ;               CALL CRC16
  466. ;               LD C,(IX+0)
  467. ;               LD B,(IX+1)
  468. ;               LD A,0X81
  469. ;               AND A
  470. ;               SBC HL,BC
  471. ;               JR NZ,OUT_ERR                   ;CRC16 ЗАГОЛОВКА ERROR
  472.                 LD IX,0X8000+8-0X10
  473. SCHET           LD DE,0X10
  474.                 ADD IX,DE                       ;В IX АДРЕС ВЫБРАННОГО БЛОКА
  475.                 LD C,(IX+4)
  476.                 LD B,(IX+5)                     ;В BC ДЛИНА БЛОКА
  477.                 LD E,(IX+1)
  478.                 LD L,(IX+2)
  479.                 LD H,(IX+3)
  480.                 LD A,L
  481.                 AND 0X7F
  482.                 LD D,A                          ;В DE СМЕЩЕНИЕ В СТРАНИЦЕ
  483.                 ADD HL,HL
  484.                 LD A,2
  485.                 ADD A,H
  486.                 LD IYL,A
  487.                 OUT (MPAG),A                    ;НОМЕР СТРАНИЦЫ
  488.                 PUSH IX
  489.                 LD IX,0X8000
  490.                 ADD IX,DE                       ;В IX АДРЕС НАЧАЛА БЛОКА
  491.                 CALL CRC16
  492.                 POP IX
  493.                 LD C,(IX+6)
  494.                 LD B,(IX+7)
  495.                 LD A,0X82
  496.                 AND A
  497.                 SBC HL,BC
  498.                 JR NZ,OUT_ERR
  499.                 DEC IYH
  500.                 JR NZ,SCHET
  501. ERR_OK          LD A,0X80
  502.  
  503. ;CRC16 ERROR
  504. ;0X80-CRC16 БЛОКА OK
  505. ;0X81-CRC16 ЗАГОЛОВКА ERROR
  506. ;0X82-CRC16 БЛОКА ERROR
  507. OUT_ERR         OUT (CLRCBIT),A
  508.                 OUT (ZXDATWR),A
  509.                 CALL WDN
  510.                 LD A,L
  511.                 OUT (ZXDATWR),A
  512.                 CALL WDN
  513.                 LD A,H
  514.                 OUT (ZXDATWR),A
  515.                 RET
  516.  
  517. CRC16           LD HL,0XFFFF
  518.                 LD DE,0X1021
  519. CRC_0           LD A,(IX)
  520.                 INC IX
  521.                 EX AF,AF'
  522.                 LD A,IXL
  523.                 OR IXH
  524.                 JR NZ,CRC_3
  525.                 INC IYL
  526.                 LD A,IYL
  527.                 OUT (MPAG),A
  528.                 LD IX,0X8000
  529. CRC_3           EX AF,AF'
  530.                 XOR H
  531.                 LD H,A
  532.                 LD A,8
  533. CRC_1           ADD HL,HL
  534.                 JR NC,CRC_2
  535.                 EX AF,AF'
  536.                 LD A,L
  537.                 XOR E
  538.                 LD L,A
  539.                 LD A,H
  540.                 XOR D
  541.                 LD H,A
  542.                 EX AF,AF'
  543. CRC_2           DEC A
  544.                 JR NZ,CRC_1
  545.                 DEC BC
  546.                 LD A,B
  547.                 OR C
  548.                 JR NZ,CRC_0
  549.                 LD A,2
  550.                 OUT (MPAG),A
  551.                 RET
  552.  
  553. ;---------------------------------
  554. ;ГРУЗИЛКА ФАЙЛА ПО УКАЗАННОМУ ПУТИ
  555.  
  556. BUF_512         EQU 0X5000                      ;0X200 БУФЕР СЕКТОРА
  557. TDIRCLS         EQU BUF_512+0X0200              ;0X400 БУФЕР КЛАСТЕРОВ ROOT ДИРЕКТОРИИ
  558. CAL_FAT         EQU TDIRCLS+0X0400              ;1 КАЛИБР FAT
  559. BYTSSEC         EQU CAL_FAT+1                   ;1 КОЛИЧЕСТВО СЕКТОРОВ В КЛАСТЕРЕ
  560. ROOTCLS         EQU BYTSSEC+1                   ;4 КЛАСТЕР НАЧАЛА ROOT ДИРЕКТОРИИ
  561. ROOTSEC         EQU ROOTCLS+4                   ;2 РАЗМЕР В СЕКТОРАХ ROOT ДИРЕКТОРИИ
  562. SEC_FAT         EQU ROOTSEC+2                   ;4 КОЛИЧЕСТВО СЕКТОРОВ ОДНОЙ FAT
  563. RSVDSEC         EQU SEC_FAT+4                   ;2 РАЗМЕР РЕЗЕРВНОЙ ОБЛАСТИ
  564. STARTRZ         EQU RSVDSEC+2                   ;4 НАЧАЛО ДИСКА/РАЗДЕЛА
  565. FRSTDAT         EQU STARTRZ+4                   ;4 АДРЕС ПЕРВОГО СЕКТОРА ДАННЫХ ОТ BPB
  566. SEC_DSC         EQU FRSTDAT+4                   ;4 КОЛИЧЕСТВО СЕКТОРОВ НА ДИСКЕ/РАЗДЕЛЕ
  567. CLS_DSC         EQU SEC_DSC+4                   ;4 КОЛИЧЕСТВО КЛАСТЕРОВ НА ДИСКЕ/РАЗДЕЛЕ
  568. FATSTR          EQU CLS_DSC+4                   ;4 НАЧАЛО ПЕРВОЙ FAT ТАБЛИЦЫ
  569. ADRPATH         EQU FATSTR+4                    ;2 АДРЕС ТЕКСТА ПУТИ ФАЙЛА
  570. STATUS          EQU ADRPATH+2                   ;1 СТАТУС ПОСЛЕ ВЫЗОВА LOAD_SD
  571. OLD_SP          EQU STATUS+1                    ;2 СТЕК ДЛЯ ВЫХОДА
  572. FB_EXT          EQU OLD_SP+2                    ;B БУФЕР 8.3 ДЛЯ ПОИСКА ИМЕНИ
  573. LVL_DIR         EQU FB_EXT+0X0B                 ;1 НОМЕР УРОВНЯ ДИРЕКТОРИИ
  574. LSTLOAD         EQU LVL_DIR+1                   ;4 НОМЕР СЕКТОРА ЗАГРУЖЕННОГО В БУФЕР
  575. NGS_MODES       EQU LSTLOAD+4                   ;1 ТЕКУЩИЙ УСТАНОВЛЕННЫЙ РЕЖИМ
  576.  
  577. ;SD КАРТА НЕ НАЙДЕНА
  578. ZAW003          LD A,0XEE
  579. WR_STAT         LD SP,(OLD_SP)
  580.                 LD (STATUS),A
  581.                 RET
  582.  
  583. ;ЗАГРУЗКА ФАЙЛА
  584. ;НА ВХОДЕ:A-СТРАНИЦА НАЧАЛА ЗАГРУЗКИ
  585. ;HL-АДРЕС ТЕКСТОВОЙ СТРОКИ
  586. ;ПУТИ К ФАЙЛУ ВМЕСТЕ С ИМЕНЕМ И РАСШИРЕНИЕМ ФАЙЛА. ПУТЬ ПОЛНОСТЬЮ ОТ ROOT
  587. ;ЗАГРУЖАЕТСЯ ФАЙЛ ПО РАЗМЕРУ ДОПОЛНЕНОМУ ДО ПОЛНЫХ СЕКТОРОВ (СЕКТОР 512 БАЙТ)
  588. ;ПРИМЕР: РАЗМЕР ФАЙЛА =0X80-ПОСЛЕ ДОПОЛНЕНИЯ БУДЕТ ЗАГРУЖЕН 1 СЕКТОР
  589. ;=0X401-БУДЕТ ЗАГРУЖЕНО 3 СЕКТОРА
  590. ;НА ВЫХОДЕ: A=
  591.                 ;0X00-ФАЙЛ ЗАГРУЖЕН
  592.                 ;0XAA-ФАЙЛ НЕ НАЙДЕН
  593.                 ;0XDD-FAT НЕ ОБНАРУЖЕН
  594.                 ;0XEE-SD КАРТА НЕ ОБНАРУЖЕНА
  595. LOAD_SD         LD IYL,A;LY,A                   ;СОХРАНИЛИ НОМЕР СТРАНИЦЫ КУДА ГРУЗИТЬ
  596.                 LD (ADRPATH),HL                 ;СОХРАНИЛИ АДРЕС СТРОКИ ПУТИ
  597.                 LD (OLD_SP),SP                  ;СОХРАНИЛИ СТЕК
  598.                 LD A,0XFF
  599.                 LD (LSTLOAD+3),A                ;ПРИНУДИТЕЛЬНАЯ ЗАГРУЗКА СЕКТОРА БЕЗ ПРОВЕРКИ
  600.                 LD A,1
  601.                 OUT (GSCFG0),A                  ;ОТКЛЮЧИЛИ ПЗУ, ВСЕ СТРАНИЦА ОЗУ
  602.                 LD A,%10011011
  603.                 OUT (SCTRL),A                   ;СКОНФИГУРИЛИ НГС С CS=1 ДЛЯ SD КАРТЫ          
  604.                 LD B,0X10
  605. LOADSD1         LD A,0XFF
  606.                 OUT (SD_SEND),A                 ;ПИШЕМ 0X80 БАЙТ 0XFF В ПОРТ КАРТОЧКИ
  607.                 DJNZ LOADSD1
  608.                 XOR A                           ;256 ПОПЫТОК НАЙТИ SD КАРТУ
  609.                 EX AF,AF'
  610.                 LD A,1
  611.                 OUT (SCTRL),A                   ;ВЫБРАЛИ SD КАРТУ CS=0
  612.  
  613. ZAW001          LD HL,CMD00
  614.                 CALL OUTCOM                     ;ПЕРЕВОДИМ КАРТОЧКУ В РЕЖИМ SPI КОМАНДОЙ 0
  615.                 CALL IN_OOUT                    ;ЖДЕМ ОТВЕТА
  616.                 EX AF,AF'
  617.                 DEC A
  618.                 JR Z,ZAW003                     ;ЖДЕМ ПО СЧЕПТЧИКУ 256 РАЗ
  619.                 EX AF,AF'
  620.                 DEC A
  621.                 JR NZ,ZAW001                    ;ЖДЕМ ПОКА КАРТА ОТВЕТИТ БАЙТОМ 1
  622.                 LD BC,SD_RSTR
  623.                 LD HL,CMD08
  624.                 CALL OUTCOM                     ;ОПРЕДЕЛЯЕМ СПЕЦИФИКАЦИЮ КАРТЫ
  625.                 CALL IN_OOUT                    ;В "A" ОТВЕТ КАРТЫ R1
  626.                 IN H,(C)
  627.                 NOP
  628.                 IN H,(C)       
  629.                 NOP
  630.                 IN H,(C)
  631.                 NOP
  632.                 IN H,(C)                        ;ПРОЧИТАЛИ ОСТАЛЬНЫЕ БАЙТЫ В НИКУДА
  633.                 BIT 2,A                         ;ЕСЛИ ОШИБКА, ТО
  634.                 LD HL,0                         ;КАРТА СПЕЦИФИКАЦИИ 1.0
  635.                 JR NZ,ZAW006                    ;ИНАЧЕ
  636.                 LD H,0X40                       ;КАРТА СПЕЦИФИКАЦИИ 2.0
  637. ZAW006          LD A,CMD_55
  638.                 CALL OUT_COM                    ;ЗАПУСКАЕМ ВНУТРЕННЮЮ ИНИЦИАЛИЗАЦИЮ КАРТЫ
  639.                 CALL IN_OOUT
  640.                 LD BC,SD_SEND
  641.                 LD A,ACMD_41
  642.                 OUT (C),A
  643.                 LD A,H
  644.                 OUT (C),A
  645.                 XOR A
  646.                 OUT (C),A
  647.                 NOP
  648.                 OUT (C),A
  649.                 NOP
  650.                 OUT (C),A
  651.                 DEC A
  652.                 OUT (C),A
  653.                 CALL IN_OOUT
  654.                 AND A
  655.                 JR NZ,ZAW006                    ;ЖДЕМ ПОКА КАРТЫ ПЕРЕЙДЕТ В РЕЖИМ ГОТОВНОСТИ
  656. ZAW004          LD A,CMD_59
  657.                 CALL OUT_COM                    ;ПРИНУДИТЕЛЬНО ОТКЛЮЧАЕМ CRC16
  658.                 CALL IN_OOUT
  659.                 AND A
  660.                 JR NZ,ZAW004
  661. ZAW005          LD HL,CMD16
  662.                 CALL OUTCOM                     ;ПРИНУДИТЕЛЬНЫЙ РАЗМЕР СЕКТОРА 512 БАЙТ
  663.                 CALL IN_OOUT
  664.                 AND A
  665.                 JR NZ,ZAW005
  666.  
  667. ;ИНИЦИАЛИЗАЦИЯ ПЕРЕМЕННЫХ FAT
  668. WC_FAT          LD DE,0
  669.                 LD B,D
  670.                 LD C,E
  671.                 CALL LOADLST                    ;ЧИТАЕМ СЕКТОР 0 КАРТОЧКИ
  672.                 PUSH HL
  673.                 POP IX
  674.                 LD DE,0X01BE
  675.                 ADD HL,DE                       ;ПЕРЕХОДИМ НА СМЕЩЕНИЕ ДЛЯЧ ПРОВЕРОК
  676.                 LD A,(HL)                       ;ПРОВЕРЯМ ЧТОБЫ БЫЛ 0, КАРТОЧКИ НЕ МОГУТ БЫТЬ ЗАГРУЗОЧНЫМИ
  677.                 AND A
  678.                 JR NZ,RDFAT05                   ;ЕСЛИ НЕ 0, ПРОВЕРИТЬ ДРУГОЕ
  679.                 LD DE,4
  680.                 ADD HL,DE                       ;ПЕРЕХОДИМ К ПРОВЕРКЕ ТИПА РАЗДЕЛА
  681.                 LD A,(HL)
  682.                 LD B,0
  683.                 CP 1                            ;FAT12?
  684.                 JR Z,RDFAT06
  685.                 LD B,2
  686.                 CP 0X0B                         ;FAT32?
  687.                 JR Z,RDFAT06
  688.                 CP 0X0C                         ;FAT32?
  689.                 JR Z,RDFAT06
  690.                 LD B,1
  691.                 CP 6                            ;FAT16?
  692.                 JR Z,RDFAT06
  693.                 CP 4                            ;FAT16?
  694.                 JR Z,RDFAT06
  695.                 CP 0X0E                         ;FAT16?
  696.                 JR NZ,RDFAT05          
  697. RDFAT06         LD A,B                          ;БЕРЕМ ИЗ "B" ТИП РАЗДЕЛА
  698.                 LD (CAL_FAT),A                  ;СОХРАНИЛИ
  699.                 ADD HL,DE
  700.                 CALL LOADZP                     ;БЕРЕМ НОМЕР СЕКТОРА НАЧАЛА ОСНОВНОГО РАЗДЕЛА
  701.                 JR RDFAT00                      ;ПЕРЕХОДИМ К ИНИЦИАЛИЗАЦИИ ПЕРЕМЕННЫХ ДЛЯ РАБОТЫ С ФАТОМ
  702.  
  703. ;MBR НЕ ОБНАРУЖЕН, ПРОВЕРЯЕМ СЕКТОР 0 КАРТЫ КАК ОПИСАТЕЛЬ
  704. RDFAT05         LD C,(IX+0X0D)                  ;C=КОЛИЧЕСТВО СЕКТОРОВ В КЛАСТЕРЕ
  705.                 XOR A
  706.                 LD E,A
  707.                 LD B,8
  708.                 RR C
  709.                 ADC A,0
  710.                 DJNZ $-4                        ;КОЛИЧЕСТВО СЕКТОРОВ В КЛАСТЕРЕ ДОЛЖНО БЫТЬ СТЕПЕНЬЮ 2
  711.                 DEC A
  712.                 JR NZ,$+3                       ;ПРОВЕРИЛИ КОЛИЧЕСТВО БИТ
  713.                 INC E                           ;+1, ЕСТЬ ТАКОЕ
  714.                 LD A,(IX+0X0E)
  715.                 OR (IX+0X0F)
  716.                 JR Z,$+3                        ;КОЛИЧЕСТВО ЗАРЕЗЕРВИРОВАННЫХ СЕКТОРОВ ДОЛЖНО БЫТЬ >0
  717.                 INC E                           ;+1, ЕСТЬ ТАКОЕ
  718.                 LD A,(IX+0X13)
  719.                 OR (IX+0X14)
  720.                 JR NZ,$+3                       ;КОЛИЧЕСТВО СЕКТОРОВ НА РАЗДЕЛЕ ДЛЯ ФАТ16?
  721.                 INC E
  722.                 LD A,(IX+0X20)
  723.                 OR (IX+0X21)
  724.                 OR (IX+0X22)
  725.                 OR (IX+0X23)
  726.                 JR NZ,$+3                       ;КОЛИЧЕСТВО СЕКТОРОВ НА РАЗДЕЛЕ ДЛЯ ФАТ32?
  727.                 INC E                           ;ОДНО ИЗ НИХ ДОЛЖНО БЫТЬ =0, ДРУГОЕ >0
  728.                 LD A,(IX+0X15)
  729.                 AND 0XF0
  730.                 CP 0XF0
  731.                 JR NZ,$+3                       ;СТАРШИЕ БИТЫ ДОЛЖНЫ БЫТЬ В 1
  732.                 INC E
  733.                 LD A,E
  734.                 CP 4                            ;УСЛОВИЯ СОВПАЛИ?
  735.                 LD A,0XDD                       ;FAT НЕ НАЙДЕН
  736.                 JP NZ,WR_STAT
  737.                 LD A,0XFF
  738.                 LD (CAL_FAT),A                  ;ТИП ФАТ ПОКА НЕ ОПРЕДЕЛЕН
  739.                 LD DE,0
  740.                 LD B,D
  741.                 LD C,E
  742.  
  743. RDFAT00         LD (STARTRZ),DE
  744.                 LD (STARTRZ+2),BC               ;ПОЛОЖИЛИ НОМЕР СТАРТОВОГО СЕКТОРА РАЗДЕЛА
  745.                 CALL LOADLST                    ;ЗАГРУЗИЛИ ЕГО
  746.                 LD HL,0
  747.                 LD DE,(BUF_512+0X16)            ;BPB_FATSZ16
  748.                 LD A,D
  749.                 OR E
  750.                 JR NZ,RDFAT01                   ;ЕСЛИ НЕ FAT12/16 (BPB_FATSZ16=0)
  751.                 LD DE,(BUF_512+0X24)
  752.                 LD HL,(BUF_512+0X26)            ;BPB_FATSZ32
  753.                                                 ;ТО БЕРЕМ ИЗ СМЕЩЕНИЯ +36
  754. RDFAT01         LD (SEC_FAT+2),HL
  755.                 LD (SEC_FAT),DE                 ;ЧИСЛО СЕКТОРОВ НА FAT-ТАБЛИЦУ
  756.                 LD HL,0
  757.                 LD DE,(BUF_512+0X13)            ;BPB_TOTSEC16
  758.                 LD A,D
  759.                 OR E
  760.                 JR NZ,RDFAT02                   ;ЕСЛИ НЕ FAT12/16 (BPB_TOTSEC16=0)
  761.                 LD DE,(BUF_512+0X20)
  762.                 LD HL,(BUF_512+0X22)            ;BPB_TOTSEC32
  763.                                                 ;ТО БЕРЕМ ИЗ СМЕЩЕНИЯ +32
  764. RDFAT02         LD (SEC_DSC+2),HL
  765.                 LD (SEC_DSC),DE                 ;К-ВО СЕКТОРОВ НА ДИСКЕ/РАЗДЕЛЕ
  766.  
  767. ;ВЫЧИСЛЯЕМ ROOTDIRSECTORS
  768.                 LD BC,(BUF_512+0X0B)            ;BPB_BYTSPERSEC
  769.                 LD DE,(BUF_512+0X11)            ;BPB_ROOTENTCNT
  770.                 LD HL,0
  771.                 LD A,D
  772.                 OR E
  773.                 JR Z,RDFAT03
  774.                 LD B,H
  775.                 LD C,L
  776.                 LD A,0X10
  777.                 CALL BCDE_A
  778.                 EX DE,HL
  779.  
  780. ;ЭТО РЕАЛИЗОВАНА ФОРМУЛА
  781. ;ROOTDIRSECTORS=((BPB_ROOTENTCNT*32)+(BPB_BYTSPERSEC-1))/BPB_BYTSPERSEC
  782. ;В HL=ROOTDIRSECTORS. ЕСЛИ FAT32, ТО HL=0 ВСЕГДА
  783.  
  784. RDFAT03         PUSH HL                         ;ROOTDIRSECTORS
  785.                 LD (ROOTSEC),HL
  786.                 LD A,(BUF_512+0X10)
  787.                 LD DE,(SEC_FAT)
  788.                 LD HL,(SEC_FAT+2)
  789.                 DEC A
  790.                 EX DE,HL
  791.                 ADD HL,HL
  792.                 EX DE,HL
  793.                 ADC HL,HL
  794.                 DEC A
  795.                 JR NZ,$-6
  796.                 POP BC                          ;ПОЛНЫЙ РАЗМЕР FAT-ОБЛАСТИ В СЕКТОРАХ
  797.                 CALL HLDEPBC                    ;ПРИБАВИЛИ ROOTDIRSECTORS
  798.                 LD BC,(BUF_512+0X0E)            ;BPB_RSVDSECCNT
  799.                 LD (RSVDSEC),BC
  800.                 CALL HLDEPBC                    ;ПРИБАВИЛИ BPB_RESVDSECCNT
  801.                 LD (FRSTDAT),DE
  802.                 LD (FRSTDAT+2),HL               ;ПОЛОЖИЛИ НОМЕР ПЕРВОГО СЕКТОРА ДАННЫХ
  803.                 LD B,H
  804.                 LD C,L
  805.                 LD HL,SEC_DSC                   ;BCDE+32-ое ЧИСЛО ПО АДРЕСУ HL
  806.                 CALL BCDEHLM                    ;ВЫЧЛИ ИЗ ПОЛНОГО К-ВА СЕКТОРОВ РАЗДЕЛА
  807.                 LD A,(BUF_512+0X0D)
  808.                 LD (BYTSSEC),A
  809.                 CALL BCDE_A                     ;РАЗДЕЛИЛИ НА К-ВО СЕКТОРОВ В КЛАСТЕРЕ
  810.                 LD (CLS_DSC),DE
  811.                 LD (CLS_DSC+2),BC               ;ПОЛОЖИЛИ КОЛ-ВО КЛАСТЕРОВ НА РАЗДЕЛЕ
  812.  
  813.                 LD A,(CAL_FAT)
  814.                 CP 0XFF
  815.                 JR NZ,RDFAT04
  816. ;ОПРЕДЕЛЕНИЕ ТИПА FAT ПРИ ОТСУСТВИИ MBR
  817.                 LD DE,(SEC_FAT-1)
  818.                 LD BC,(SEC_FAT+1)
  819.                 LD E,0                          ;BCDE=КОЛИЧЕСТВО СЕКТОРОВ *0X100
  820.                 PUSH BC
  821.                 PUSH DE                         ;СОХРАНИЛИ
  822.                 SRL B
  823.                 RR C
  824.                 RR D
  825.                 RR E                            ;BCDE=КОЛИЧЕСТВО СЕКТОРОВ *0X80
  826.                 LD HL,CLS_DSC                   ;КОЛИЧЕСТВО КЛАСТЕРОВ НА FAT
  827.                 PUSH HL                         ;СОХРАНИЛИ
  828.                 CALL HLBCDEM                    ;КОЛИЧЕСТВО КЛАСТЕРОВ-(КОЛИЧЕСТВО СЕКТОРОВ*0X80)
  829.                 LD A,E
  830.                 AND 0X80                        ;КОЛИЧЕСТВО МЕНЕЕ 128 КЛАСТЕРОВ В СЕКТОРЕ ДЛЯ FAT32
  831.                 OR D
  832.                 OR C
  833.                 OR B
  834.                 LD A,2
  835.                 POP HL
  836.                 POP DE
  837.                 POP BC
  838.                 JR Z,RDFAT04                    ;FAT32 ЕСЛИ ФЛАГ Z=0
  839.                 CALL HLBCDEM                    ;КОЛИЧЕСТВО КЛАСТЕРОВ-(КОЛИЧЕСТВО СЕКТОРОВ*0X100)
  840.                 LD A,D
  841.                 OR C
  842.                 OR B
  843.                 LD A,1
  844.                 JR Z,RDFAT04                    ;FAT16 ЕСЛИ ФЛАГ Z=0
  845.                 XOR A                           ;ИНАЧЕ FAT12
  846.  
  847. ;ДЛЯ FAT12/16 ВЫЧИСЛЯЕМ АДРЕС ПЕРВОГО СЕКТОРА ДИРЕКТОРИИ
  848. ;ДЛЯ FAT32 БЕРЕМ ПО СМЕЩЕМИЮ +44, НА ВЫХОДЕ BCDE-СЕКТОР ROOTDIR
  849. RDFAT04         LD (CAL_FAT),A                  ;УТОЧНИЛИ ТИП ФАТА
  850.                 EX AF,AF'
  851.                 LD DE,(RSVDSEC)
  852.                 LD BC,0
  853.                 LD HL,STARTRZ
  854.                 CALL BCDEHLP
  855.                 LD (FATSTR),DE
  856.                 LD (FATSTR+2),BC                ;ВЫЧИСЛИЛИ И ПОЛОЖИЛИ НОМЕР СЕКТОРА НАЧАЛА FAT-ЕАБЛИЦ
  857.                 EX AF,AF'
  858.                 AND A
  859.                 LD DE,0
  860.                 LD B,D
  861.                 LD C,E
  862.                 JR Z,FSRROO2                    ;FAT12-NONE
  863.                 DEC A
  864.                 JR Z,FSRROO2                    ;FAT16
  865.                 LD DE,(BUF_512+0X2C)
  866.                 LD BC,(BUF_512+0X2E)            ;FAT32
  867. FSRROO2         LD (ROOTCLS),DE
  868.                 LD (ROOTCLS+2),BC               ;ПОЛОЖИЛИ НОМЕР КЛАСТЕР ROOT ДИРЕКТОРИИ
  869.  
  870.                 XOR A
  871.                 LD (LVL_DIR),A                  ;НАЧИНАЕМ С ROOT ДИРЕКТОРИИ
  872.                 LD HL,(ADRPATH)                 ;ВЕРНУЛИ АДРЕС СТРОКИ ПУТИ ДО ФАЙЛА
  873. FINDFL1         PUSH BC
  874.                 PUSH DE                         ;СОХРАНИЛИ НОМЕР КЛАСТЕРА
  875.                 CALL FNDBUF                     ;РАСПАКОВКА ЧАСТИ ТЕКСТОВОЙ СТРОКИ ДЛЯ СОЗДАНИЯ МАСКИ ПОИСКА
  876.                 POP DE
  877.                 POP BC                          ;ВОССТАНОВИЛИ НОМЕР КЛАСТЕРА
  878.                 PUSH HL                         ;СОХРАНИЛИ ТЕКУЩИЙ АДРЕС ТЕКСТОВОЙ СТРОКИ
  879.  
  880.                 LD HL,TDIRCLS                   ;АДРЕС ТАБЛИЦЫ КЛАСТЕРОВ ТЕКУЩЕЙ ДИРЕКТОРИИ
  881.                 LD A,D
  882.                 OR E
  883.                 OR B
  884.                 OR C
  885.                 CALL SAVEZP                     ;СОХРАНИЛИ В ТАБЛИЦУ НОМЕР ТЕКУЩЕГО КЛАСТЕРА
  886.                 JR Z,LASTCLS                    ;ЕСЛИ НОМЕР КЛАСТЕРА 0, ТО ЭТО ROOT ДИРА (ДЛЯ ФАТ12/16)
  887. NEXTCLS         PUSH HL
  888.                 CALL RDFATZP                    ;ЧИТАЕМ СЛЕДУЩИЙ НОМЕР КЛАСТЕРА ИЗ ЦЕПОЧКИ ДИРЕКТОРИИ
  889.                 CALL LST_CLS                    ;ПРОВЕРЯЕМ НА КОНЕЦ ЦЕПОЧКИ
  890.                 POP HL
  891.                 JR C,LASTCLS
  892.                 CALL SAVEZP                     ;ЕСЛИ НЕПОСЛЕДНИЙ СОХРАНЯЕМ В ТАБЛИЦУ
  893.                 JR NEXTCLS                      ;СЛЕДУЮЩИЙ НОМЕР КЛАСТЕРА
  894.  
  895. LASTCLS         LD BC,0XFFFF
  896.                 CALL SAVEZP                     ;КЛАДЕМ МАРКЕР КОНЦА ЦЕПОЧКИ
  897.                 EXX
  898.                 LD HL,LVL_DIR
  899.                 LD A,(HL)                       ;ТЕКУЩИЙ УРОВЕНЬ ДИРЕКТОРИИ
  900.                 INC (HL)                        ;СЛЕДУЮЩИЙ УРОВЕНЬ ДИРЕКТОРИИ
  901.                 AND A
  902.                 LD BC,0                         ;КОЛИЧЕСТВО ЗАПИСЕЙ ROOT ДИРЕКТОРИИ
  903.                 JR NZ,LASTCLS1
  904.                 LD A,(CAL_FAT)
  905.                 CP 2
  906.                 JR NC,LASTCLS1
  907.                 LD HL,(ROOTSEC)                 ;УЖЕ НЕ ROOT ДИРЕКТОРИЯ
  908.                 ADD HL,HL
  909.                 ADD HL,HL
  910.                 ADD HL,HL
  911.                 ADD HL,HL
  912.                 ADD HL,HL
  913.                 LD B,H
  914.                 LD C,L
  915. LASTCLS1        EXX
  916.  
  917. FINDFL          INC BC                          ;ИЩЕМ ПО ЗАДАННОЙ МАСКЕ НАЧИНАЯ С 0
  918.                 CALL RDDIRSC                    ;ГРУЗИМ ПО НОМЕРУ ОПИСАТЕЛЯ СЕКТОР ДИРЕКТОРИИ
  919.                 LD A,C
  920.                 AND 0X0F                        ;В СЕКТОРЕ МАКСИМУМ 16 ОПИСАТЕЛЕЙ
  921.                 LD E,A
  922.                 LD D,0
  923.                 EX DE,HL
  924.                 ADD HL,HL
  925.                 ADD HL,HL
  926.                 ADD HL,HL
  927.                 ADD HL,HL
  928.                 ADD HL,HL
  929.                 ADD HL,DE                       ;ПОЛУЧИЛИ АДРЕС НУЖНОГО ОПИСАТЕЛЯ
  930.                 EXX
  931.                 DEC BC
  932.                 LD A,B
  933.                 OR C
  934.                 EXX
  935.                 LD A,0XAA
  936.                 JP Z,WR_STAT
  937.                 LD A,(HL)                       ;ПРОВЕРЯЕМ ПЕРВЫЙ БАЙТ ИМЕНИ ОПИСАТЕЛЯ
  938.                 AND A
  939.                 LD A,0XAA                       ;ЕСЛИ БАЙТ =0, ТО
  940.                 JP Z,WR_STAT                    ;ПЕРЕХОД ПО ОШИБКЕ = ФАЙЛ НЕ НАЙДЕН
  941.                 PUSH HL
  942.                 PUSH BC
  943.                 CALL COMPARE                    ;СРАВНИВАЕМ С ЗАДАННОЙ МАСКОЙ
  944.                 POP BC
  945.                 POP DE
  946.                 PUSH DE
  947.                 POP IX                          ;СОДЕРЖИМОЕ IX=АДРЕС ОПИСАТЕЛЯ
  948.                 JR NZ,FINDFL                    ;НЕ СОВПАДАЕТ, ПЕРЕХОДИМ К СЛЕДУЮЩЕМУ ОПИСАТЕЛЮ
  949.                 CALL RD_CLAS                    ;ЗАБИРАЕМ НОМЕР КЛАСТЕРА ИЗ НАЙДЕННОГО ОПИСАТЕЛЯ
  950.                 EX (SP),HL                      ;ВОССТАНОВИЛИ ТЕКУЩИЙ АДРЕС В СТРОКЕ ПУТИ ДО ФАЙЛА
  951.                 INC SP
  952.                 INC SP                          ;МАСКИРОВКА НА СТЕКЕ АДРЕСА РАЗМЕРА В БАЙТАХ ТЕКУЩЕГО ФАЙЛА
  953.                 LD A,(HL)
  954.                 AND A                           ;ТЕКСТОВАЯ СТРОКА КОНЧИЛАСЬ?
  955.                 JR NZ,FINDFL1                   ;ЕСЛИ НЕТ, ТО ИЩЕМ ДАЛЬШЕ
  956.                 LD A,(IX+0X0B)                  ;ПРОВЕРЯЕМ ЭТО ДИРА ИЛИ ФАЙЛ?
  957.                 AND 0X10
  958.                 LD A,0XAA                       ;ЕСЛИ ДИРА, ТО ОШИБКА
  959.                 JP NZ,WR_STAT                   ;ТЕКСТОВАЯ СТРОКА ДОЛЖНА УКАЗЫВАТЬ НА ФАЙЛ
  960.                 DEC SP
  961.                 DEC SP
  962.                 POP HL                          ;ВОССТАНОВИЛИ В HL АДРЕС ОТКУДА ВЗЯТЬ РАЗМЕР ФАЙЛА В БАЙТАХ
  963.                 PUSH BC
  964.                 PUSH DE
  965.                 CALL LOADZP                     ;ЗАБИРАЕМ РАЗМЕР ФАЙЛА (В БАЙТАХ)
  966.                 LD A,E
  967.                 AND A
  968.                 JR Z,$+3                        ;МЛАДШИЙ БАЙТ РАЗМЕРА ФАЙЛА =0?
  969.                 INC D                           ;УВЕЛИЧИВАЕМ РАЗМЕР НА 256 БАЙТ БЕЗ УЧЕТА МЛАДШЕГО БАЙТА
  970.                 BIT 0,D                         ;ПРОВЕРЯЕМ ЧЕТ/НЕЧЕТ
  971.                 JR Z,$+3                        ;ЕСЛИ НЕЧЕТ, ТО
  972.                 INC D                           ;УВЕЛИЧИВАЕМ РАЗМЕР ЕЩЕ НА 256 БАЙТ
  973.                 CALL BCDE200                    ;ДЕЛИМ НА 512 (НА РАЗМЕР СЕКТОР)
  974.                 PUSH DE
  975.                 EXX
  976.                 POP HL
  977.                 EXX
  978.                 LD A,(BYTSSEC)                  ;ВЗЯЛИ РАЗМЕР КЛАСТЕРА В СЕКТОРАХ
  979.                 LD IXH,A                        ;СОХРАНИЛИ
  980.                 POP DE
  981.                 POP BC
  982.                 LD HL,0X8000                    ;АДРЕС ЗАГРУЗКИ
  983.  
  984. ;HX-РАЗМЕР КЛАСТЕРА
  985. ;HL'-КОЛ-ВО СЕКТОРОВ ФАЙЛА
  986. ;BCDE-НОМЕР СТАРТОВОГО КЛАСТЕРА
  987. ;LY-СТАРТОВАЯ СТРАНИЦА ЗАГРУЗКИ
  988.  
  989.                 LD A,IYL                        ;ВОССТАНОВИЛИ СТРАНИЦУ ЗАГРУЗКИ
  990.                 AND A
  991.                 JR NZ,CP_PAGE                   ;ПРОВЕРКА ДЛЯ ЗАГРУЗКИ В СТРАНИЦУ 0
  992.                 OUT (MPAG),A                    ;ВКЛЮЧАЕМ СТРАНИЦУ 0
  993.                 EXX
  994.                 LD A,L
  995.                 LD DE,0X41
  996.                 SBC HL,DE
  997.                 JR C,$+4                        ;ЕСЛИ ФАЙЛ 0X41 И БОЛЕЕ СЕКТОРОВ
  998.                 LD A,0X40                       ;ТО ГРУЗИМ ТОЛЬКО 0X40 ПЕРВЫХ СЕКТОРОВ
  999.                 EXX
  1000.                 JP LDMINI                       ;ПЕРЕХОДИМ НА ЗАГРУЗКУ
  1001.  
  1002. ;ЗАГРУЗКА В СТРАНИЦУ 1 ЗАПРЕЩЕНА
  1003. CP_PAGE         DEC A
  1004.                 LD A,0XAA
  1005.                 JP Z,WR_STAT
  1006.                 LD A,IYL
  1007.  
  1008. ;ВКЛЮЧАЕМ СТРАНИЦУ ЗАГРУЗКИ
  1009. LDFILE0         OUT (MPAG),A                    ;ВКЛЮЧАЕМ ЗАДАННУЮ СТРАНИЦУ ДЛЯ ЗАГРУЗКИ
  1010.  
  1011. ;ЗАГРУЗКА В СТРАНИЦЫ 02...7F
  1012. LD_FILE         EXX
  1013.                 LD E,IXH
  1014.                 LD D,0                          ;DE=РАЗМЕР КЛАСТЕРА В СЕКТОРАХ
  1015.                 AND A
  1016.                 SBC HL,DE                       ;СВЕРЯЕМ С КОЛИЧЕСТВОМ СЕКТОРОВ ДЛЯ ЗАГРУЗКИ
  1017.                 LD IXL,IXH                      ;LX=КОЛИЧЕСТВО СЕКТОРОВ ДЛЯ ЗАГРУЗКИ
  1018.                 EXX
  1019.                 JR NC,LDFILE1
  1020.                 EXX                             ;СЕКТОРОВ ДЛЯ ЗАГРУЗКИ МЕНЬШЕ РАЗМЕРА КЛАСТЕРА
  1021.                 ADD HL,DE      
  1022.                 LD A,L
  1023.                 LD IXL,A                        ;LX=КОЛИЧЕСТВО СЕКТОРОВ ДЛЯ ЗАГРУЗКИ
  1024.                 EXX
  1025.  
  1026. LDFILE1         PUSH BC
  1027.                 PUSH DE
  1028.                 PUSH HL
  1029.                 CALL REALSEC                    ;ПЕРЕВЕЛИ НОМЕР КЛАСТЕРА В НОМЕР РЕАЛЬНОГО СЕКТОРА
  1030.                 LD A,IXL
  1031.                 CP 0X41                         ;КОЛИЧЕСТВО СЕКТОРОВ ДЛЯ ЗАГРУЗКИ БОЛЬШЕ 0X40?
  1032.                 JR C,$+4
  1033.                 LD A,0X40                       ;БУДЕМ ГРУЗИТЬ 0X40 СЕКТОРОВ
  1034.                 POP HL
  1035.                 LD IYH,A
  1036.                 CALL RDMULTI                    ;ЗАГРУЖАЕМ СЕКТОРА
  1037.                 LD A,IXH
  1038.                 AND 0X80
  1039.                 JR Z,LDFILE2
  1040.                 LD A,IXL
  1041.                 SUB IYH
  1042.                 JR Z,LDFILE4
  1043.                 JR C,LDFILE4
  1044.                 LD HL,0X40
  1045.                 ADD HL,DE
  1046.                 EX DE,HL
  1047.                 LD HL,0
  1048.                 ADC HL,BC
  1049.                 LD B,H
  1050.                 LD C,L
  1051.                 LD L,A
  1052.                 INC IYL
  1053.                 LD A,IYL
  1054.                 CP 0X40
  1055.                 JR C,LDFILE3
  1056. LDFILE4         INC SP
  1057.                 INC SP
  1058.                 INC SP
  1059.                 INC SP
  1060.                 JR LDEFILE
  1061.  
  1062. LDFILE3         OUT (MPAG),A                    ;СЛЕДУЮЩАЯ СТРАНИЦА
  1063.                 LD A,L
  1064.                 LD HL,0X8000
  1065.                 CALL RDMULTI
  1066. LDFILE2         POP DE
  1067.                 POP BC
  1068.                 PUSH HL
  1069.                 CALL RDFATZP
  1070.                 CALL LST_CLS
  1071.                 POP HL
  1072.                 JR C,LDEFILE
  1073.                 LD A,IXL
  1074.                 CP IXH
  1075.                 JR C,LDEFILE
  1076.                 LD A,H
  1077.                 AND A
  1078.                 JR NZ,LD_FILE
  1079.                 LD HL,0X8000
  1080.                 INC IYL
  1081.                 LD A,IYL
  1082.                 CP 0X40
  1083.                 JR C,LDFILE0
  1084. LDEFILE         XOR A
  1085.                 JP WR_STAT
  1086.  
  1087. LDMINI          EXX
  1088.                 LD L,A
  1089.                 LD A,IXH
  1090.                 LD H,A
  1091.                 CP L
  1092.                 JR C,$+3
  1093.                 LD A,L
  1094.                 EXX
  1095.                 PUSH BC
  1096.                 PUSH DE
  1097.                 PUSH AF
  1098.                 PUSH HL
  1099.                 CALL REALSEC
  1100.                 POP HL
  1101.                 POP AF
  1102.                 CALL RDMULTI
  1103.                 POP DE
  1104.                 POP BC
  1105.                 LD A,H
  1106.                 AND A
  1107.                 RET Z
  1108.                 PUSH HL
  1109.                 CALL RDFATZP
  1110.                 CALL LST_CLS
  1111.                 POP HL
  1112.                 JR C,LDEFILE
  1113.                 EXX
  1114.                 LD A,L
  1115.                 SUB H
  1116.                 EXX
  1117.                 JR NC,LDMINI
  1118.                 JR LDEFILE
  1119.  
  1120. SAVEZP          LD (HL),E
  1121.                 INC HL
  1122.                 LD (HL),D
  1123.                 INC HL
  1124.                 LD (HL),C
  1125.                 INC HL
  1126.                 LD (HL),B
  1127.                 INC HL
  1128.                 RET
  1129.  
  1130. LOADZP          LD E,(HL)
  1131.                 INC HL
  1132.                 LD D,(HL)
  1133.                 INC HL
  1134.                 LD C,(HL)
  1135.                 INC HL
  1136.                 LD B,(HL)
  1137.                 INC HL
  1138.                 RET
  1139.  
  1140. ;ЧТЕНИЕ СЕКТОРА DIR ПО НОМЕРУ BC
  1141. RDDIRSC         PUSH BC
  1142.                 LD D,B
  1143.                 LD E,C
  1144.                 LD BC,0
  1145.                 LD A,0X10
  1146.                 CALL BCDE_A
  1147.                 LD A,E
  1148.                 PUSH AF
  1149.                 LD A,(BYTSSEC)
  1150.                 PUSH AF
  1151.                 CALL BCDE_A
  1152.                 LD HL,TDIRCLS
  1153.                 EX DE,HL
  1154.                 ADD HL,HL
  1155.                 ADD HL,HL
  1156.                 ADD HL,DE
  1157.                 CALL LOADZP
  1158.                 CALL REALSEC
  1159.                 POP AF
  1160.                 DEC A
  1161.                 LD L,A
  1162.                 POP AF
  1163.                 AND L
  1164.                 LD L,A
  1165.                 LD H,0
  1166.                 ADD HL,DE
  1167.                 EX DE,HL
  1168.                 LD HL,0
  1169.                 ADC HL,BC
  1170.                 LD B,H
  1171.                 LD C,L
  1172.                 CALL LOADLST
  1173.                 POP BC
  1174.                 RET
  1175.  
  1176. ;ПРОВЕРКА НА ПОСЛЕДНИЙ КЛАСТЕР В ЦЕПОЧКЕ
  1177. LST_CLS         LD A,(CAL_FAT)                  ;ЗАВИСИТ ОТ РАЗРЯДНОСТИ ФАТА
  1178.                 AND A
  1179.                 JR NZ,LST_CL1
  1180.                 LD HL,0X0FF7                    ;ПРОВЕРКА ДЛЯ ФАТ12
  1181.                 SBC HL,DE
  1182.                 RET
  1183.  
  1184. LST_CL1         DEC A
  1185.                 JR NZ,LST_CL2
  1186. LST_CL3         LD HL,0XFFF7                    ;ПРОВЕРКАМ ДЛЯ ФАТ16 И МЛАДШИХ БИТ ФАТ32
  1187.                 SBC HL,DE
  1188.                 RET
  1189.  
  1190. LST_CL2         LD HL,0X0FFF                    ;ПРОВЕРКА ДЛЯ СТАРШИХ БИТ ФАТ32
  1191.                 SBC HL,BC
  1192.                 RET NZ
  1193.                 JR LST_CL3
  1194.  
  1195. ;ЧТЕНИЕ СЛЕДУЮЩЕГО НОМЕРА КЛАСТЕРА В ЦЕПОЧКЕ
  1196. RDFATZP         LD A,(CAL_FAT)                  ;ЧТЕНИЕ ЗАВИСИТ ОТ РАЗРАДНОСТИ ФАТА
  1197.                 AND A
  1198.                 JR Z,RDFATS0                    ;ПЕРЕХОД ВПЕРЕД ДЛЯ ФАТ12
  1199.                 DEC A
  1200.                 JR Z,RDFATS1                    ;ПЕРЕХОД ВПЕРЕД ДЛЯ ФАТ16
  1201.                 EX DE,HL                        ;ЗДЕСЬ ЧТЕНИЕ ДЛЯ ФАТ32
  1202.                 ADD HL,HL
  1203.                 EX DE,HL
  1204.                 LD HL,0
  1205.                 ADC HL,BC
  1206.                 ADC HL,BC                       ;УМНОЖИЛИ НОМЕР КЛАСТЕРА НА 2
  1207.                 LD A,E
  1208.                 LD E,D
  1209.                 LD D,L
  1210.                 LD C,H
  1211.                 LD B,0                          ;РАЗДЕЛИЛИ НОМЕР КЛАСТЕРА НА 256
  1212.                 CALL RDFATS2                    ;ЧИТАЕМ МЛАДШИЕ 16 БИТ ИСПОЛЬЗУЯ ЧТЕНИЕ ДЛЯ ФАТ16
  1213.                 INC HL
  1214.                 LD C,(HL)
  1215.                 INC HL
  1216.                 LD B,(HL)                       ;ПРОЧИТАЛИ ПОСЛЕДУЮЩИЕ СТАРШИЕ 16 БИТ
  1217.                 RET
  1218.  
  1219. ;ЧТЕНИЕ 16 БИТНОГО НОМЕРА КЛАСТЕРА ИЗ ЦЕПОЧКИ ДЛЯ ФАТ16
  1220. RDFATS1         LD BC,0
  1221.                 LD A,E
  1222.                 LD E,D
  1223.                 LD D,C                          ;РАЗДЕЛИЛИ НОМЕР КЛАСТЕРА НА 256, СТАРШИЕ 16 БИТ =0
  1224. RDFATS2         PUSH AF                         ;ОБЩЕЕ ЧТЕНИЕ 16 БИТНОГО НОМЕРА КЛАСТЕРА ДЛЯ ФАТ16/32
  1225.                 PUSH BC
  1226.                 LD HL,FATSTR
  1227.                 CALL BCDEHLP                    ;ПРИБАВИЛИ СМЕЩЕНИЕ ОТ НАЧАЛА ФАТ ТАБЛИЦЫ
  1228.                 CALL LOADLST                    ;ЗАГРУЗИЛИ ВЫЧИСЛЕННЫЙ НОМЕР СЕКТОРА
  1229.                 POP BC
  1230.                 POP AF
  1231.                 LD E,A
  1232.                 LD D,0
  1233.                 ADD HL,DE
  1234.                 ADD HL,DE                       ;ВЫЧИСЛИЛИ СМЕЩЕНИЕ ДО НУЖНОГО НОМЕРА В ЗАГРУЖЕННОМ СЕКТОРЕ
  1235.                 LD E,(HL)
  1236.                 INC HL
  1237.                 LD D,(HL)                       ;ПОЛУЧИЛИ 16 БИТ НОМЕРА КЛАСТЕРА
  1238.                 RET
  1239.  
  1240. ;ЧТЕНИЕ 12 БИТНОГО НОМЕРА КЛАСТЕРА ИЗ ЦЕПОЧКИ ДЛЯ ФАТ12
  1241. RDFATS0         LD H,D
  1242.                 LD L,E
  1243.                 ADD HL,HL
  1244.                 ADD HL,DE                       ;HL=HL*3
  1245.                 SRL H
  1246.                 RR L                            ;HL=HL/2 - В ИТОГЕ УМНОЖИЛИ НОМЕР КЛАСТЕРА НА 1,5
  1247.                 LD A,E                          ;A-НАМ ИНТЕРЕСЕН ТОЛЬКО БИТ НОМЕР СТАРОГО НОМЕРА КЛАСТЕРА
  1248.                 LD E,H
  1249.                 LD D,0
  1250.                 LD B,D
  1251.                 LD C,D                          ;РАЗДЕЛИЛИ НОМЕР КЛАСТЕРА НА 256
  1252.                 SRL E
  1253.                 PUSH AF
  1254.                 PUSH HL
  1255.                 LD HL,FATSTR
  1256.                 CALL BCDEHLP                    ;ПРИБАВИЛИ СМЕЩЕНИЕ ОТ НАЧАЛА ФАТ ТАБЛИЦЫ
  1257.                 CALL LOADLST                    ;ЗАГРУЗИЛИ ВЫВЧИСЛЕННЫЙ СЕКТОР
  1258.                 POP BC
  1259.                 LD A,B
  1260.                 AND 1
  1261.                 LD B,A                          ;BC=СМЕЩЕНИЕ В ЗАГРУЖЕННОМ СЕКТОРЕ
  1262.                 ADD HL,BC                       ;HL=АДРЕС ОТКУДА ЧИТАТЬ БАЙТЫ НОМЕРА КЛАСТЕРА
  1263.                 LD B,(HL)                       ;ПРОЧИТАЛИ МЛАДШУЮ ЧАСТЬ НОМЕРА КЛАСТЕРА
  1264.                 INC HL                          ;АДРЕС СЛЕДУЮЩЕГО БАЙТА
  1265.                 LD A,H
  1266.                 CP HIGH (BUF_512)+2             ;ПРОВЕРКА НА ПЕРЕХОД ГРАНИЦЫ ЗАГРУЖЕННОГО СЕКТОРА
  1267.                 JR NZ,RDFATS4
  1268.                 PUSH BC                         ;ВЫХОД ЗА ПРЕДЕЛЫ ТЕКУЩЕГО ЗАГРУЖЕННОГО СЕКТОРА
  1269.                 LD BC,0
  1270.                 INC DE
  1271.                 CALL LOADLST                    ;ЗАГРУЖАЕМ СЛЕДУЮЩИЙ СЕКТОР ФАТ ТАБЛИЦЫ
  1272.                 POP BC
  1273. RDFATS4         POP AF
  1274.                 LD D,(HL)                       ;ЧИТАЕМ СТАРШИЕ БИТЫ НОМЕРА КЛАСТЕРА
  1275.                 LD E,B                          ;ТЕПЕРЬ DE=НОМЕР СЛЕДУЮЩЕГО КЛАСТЕРА В ЦЕПОЧКЕ
  1276.                 LD BC,0
  1277.                 RRA                             ;ПРОВЕРЯЕМ БИТ 0 СТАРОГО НОМЕРА КЛАСТЕРА
  1278.                 JR NC,RDFATS3
  1279.                 SRL D                           ;СДВИГАЕМ НОМЕР ПРОЧИТАННОГО НОМЕРА КЛАСТЕРА В МЛАДШИЕ 12 БИТ
  1280.                 RR E
  1281.                 SRL D
  1282.                 RR E
  1283.                 SRL D
  1284.                 RR E
  1285.                 SRL D
  1286.                 RR E
  1287. RDFATS3         LD A,D
  1288.                 AND 0X0F
  1289.                 LD D,A                          ;СБРОСИЛИ НЕЗНАЧАЩИЕ СТАРШИЕ 4 БИТА У ПОЛУЧЕННОГО НОМЕРА КЛАСТЕРА
  1290.                 RET
  1291.  
  1292. ;ВЫЧИСЛЕНИЕ РЕАЛЬНОГО СЕКТОРА
  1293. ;НА ВХОДЕ BCDE=НОМЕР КЛАСТЕРА FAT
  1294. ;НА ВЫХОДЕ BCDE=НОМЕР РЕАЛЬНОГО СЕКТОРА
  1295. REALSEC         LD A,B
  1296.                 OR C
  1297.                 OR D
  1298.                 OR E
  1299.                 JR NZ,REALSE1                   ;BCDE=0?
  1300.                 LD HL,SEC_FAT                   ;ЭТО ROOT ДИРЕКТОРИЯ У ФАТ12/16
  1301.                 LD DE,(FATSTR)                  ;МЕСТОПОЛОЖЕНИЕ ROOT ДИРЫ СРАЗУ ПОСЛЕ ФАТ ТАБЛИЦЫ
  1302.                 LD BC,(FATSTR+2)
  1303.                 PUSH HL
  1304.                 CALL BCDEHLP                    ;ПРИБАВИЛИ К НАЧАЛУ ФАТ ТАБЛИЦЫ ЕЕ РАЗМЕР
  1305.                 POP HL
  1306.                 JP BCDEHLP                      ;ПРИБАВИЛИ ЕЩЕ РАЗ И ПОЛУЧИЛИ НОМЕР СЕКТОРА НАЧАЛА ROOT ДИРЫ
  1307.  
  1308. REALSE1         LD HL,0XFFFE
  1309.                 EX DE,HL
  1310.                 ADD HL,DE
  1311.                 EX DE,HL
  1312.                 INC HL
  1313.                 ADC HL,BC                       ;HLDE=НОМЕР КЛАСТЕРА-2
  1314.                 LD A,(BYTSSEC)                  ;НУЖНО УМНОЖИТЬ НА РАЗМЕР КЛАСТЕРА
  1315.                 JR REALSE2
  1316.  
  1317. REALSE3         SLA E
  1318.                 RL D
  1319.                 RL L
  1320.                 RL H
  1321. REALSE2         RRCA
  1322.                 JR NC,REALSE3                   ;УМНОЖИЛИ НА РАЗМЕР КЛАСТЕРА
  1323.                 LD B,H
  1324.                 LD C,L
  1325.                 LD HL,STARTRZ
  1326.                 CALL BCDEHLP                    ;ПРИБАВИЛИ СМЕЩЕНИЕ ОТ НАЧАЛА ДИСКА
  1327.                 LD HL,FRSTDAT
  1328.                 JP BCDEHLP                      ;ПРИБАВИЛИ СМЕЩЕНИЕ ОТ НАЧАЛА РАЗДЕЛА
  1329.  
  1330. ;BCDE=BCDE/512
  1331. BCDE200         LD E,D
  1332.                 LD D,C
  1333.                 LD C,B
  1334.                 LD B,0
  1335.                 LD A,2
  1336.                 JR BCDE_A
  1337.  
  1338. ;BCDE>>A=BCDE
  1339. BCDE_A1         SRL B
  1340.                 RR C
  1341.                 RR D
  1342.                 RR E
  1343. BCDE_A          RRCA
  1344.                 JR NC,BCDE_A1
  1345.                 RET
  1346.  
  1347. ;(ADR)-BCDE=BCDE
  1348. BCDEHLM         LD A,(HL)
  1349.                 INC HL
  1350.                 SUB E
  1351.                 LD E,A
  1352.                 LD A,(HL)
  1353.                 INC HL
  1354.                 SBC A,D
  1355.                 LD D,A
  1356.                 LD A,(HL)
  1357.                 INC HL
  1358.                 SBC A,C
  1359.                 LD C,A
  1360.                 LD A,(HL)
  1361.                 SBC A,B
  1362.                 LD B,A
  1363.                 RET
  1364.  
  1365. ;(ADR)+BCDE=BCDE
  1366. BCDEHLP         LD A,(HL)
  1367.                 INC HL
  1368.                 ADD A,E
  1369.                 LD E,A
  1370.                 LD A,(HL)
  1371.                 INC HL
  1372.                 ADC A,D
  1373.                 LD D,A
  1374.                 LD A,(HL)
  1375.                 INC HL
  1376.                 ADC A,C
  1377.                 LD C,A
  1378.                 LD A,(HL)
  1379.                 ADC A,B
  1380.                 LD B,A
  1381.                 RET
  1382.  
  1383. ;HLDE+BC=HLDE
  1384. HLDEPBC         EX DE,HL
  1385.                 ADD HL,BC
  1386.                 EX DE,HL
  1387.                 LD BC,0
  1388.                 ADC HL,BC
  1389.                 RET
  1390.  
  1391. ;BCDE-(ADR)=BCDE
  1392. HLBCDEM         LD A,E
  1393.                 SUB (HL)
  1394.                 INC HL
  1395.                 LD E,A
  1396.                 LD A,D
  1397.                 SBC A,(HL)
  1398.                 INC HL
  1399.                 LD D,A
  1400.                 LD A,C
  1401.                 SBC A,(HL)
  1402.                 INC HL
  1403.                 LD C,A
  1404.                 LD A,B
  1405.                 SBC A,(HL)
  1406.                 LD B,A
  1407.                 RET
  1408.  
  1409. ;ГРУЗИЛКА ОДНОГО СЕКТОРА
  1410. LOADLST         CALL CPNUMSC
  1411.                 JR NZ,LOADLST1
  1412.                 LD HL,BUF_512
  1413.                 RET
  1414.  
  1415. LOADLST1        LD HL,BUF_512                   ;АДРЕС БУФЕРА СЕКТОРА
  1416.                 LD A,1                          ;ГРУЗИТЬ 1 СЕКТОР
  1417.                 PUSH HL
  1418.                 CALL RDMULTI                    ;ЗАГРУЗИЛИ СЕКТОР
  1419.                 POP HL                          ;НА ВЫХОДЕ HL=АДРЕС НАЧАЛА БУФЕРА ЗАГРУЖЕННОГО СЕКТОРА
  1420.                 RET
  1421.  
  1422. ;ПРОВЕРКА НА УЖЕ ЗАГРУЖЕННЫЙ СЕКТОР
  1423. CPNUMSC         LD HL,LSTLOAD
  1424.                 LD A,(HL)
  1425.                 INC HL
  1426.                 CP E
  1427.                 RET NZ
  1428.                 LD A,(HL)
  1429.                 INC HL
  1430.                 CP D
  1431.                 RET NZ
  1432.                 LD A,(HL)
  1433.                 INC HL
  1434.                 CP C
  1435.                 RET NZ
  1436.                 LD A,(HL)
  1437.                 CP B
  1438.                 RET
  1439.  
  1440. ;ПОДАЧА КОМАНДЫ В SD КАРТУ БЕЗ ПАРАМЕТРОВ
  1441. OUTCOM          PUSH BC
  1442.                 LD BC,0X0600+SD_SEND            ;ВЫДАТЬ В ПОРТ 6 БАЙТ
  1443.                 OTIR
  1444.                 POP BC
  1445.                 RET
  1446.  
  1447. ;ВЫДАЧА В ПОРТ SD КАРТЫ КОМАНДЫ С ПАРАМЕТРОМ 0
  1448. OUT_COM         PUSH BC
  1449.                 LD BC,SD_SEND
  1450.                 OUT (C),A                       ;ОТПРАВИЛИ КОД КОМАНДЫ
  1451.                 XOR A
  1452.                 OUT (C),A                       ;БИТЫ 31-24 ПАРАМЕТРА
  1453.                 NOP
  1454.                 OUT (C),A                       ;БИТЫ 23-16 ПАРАМЕТРА
  1455.                 NOP
  1456.                 OUT (C),A                       ;БИТЫ 15-8 ПАРАМЕТРА
  1457.                 NOP
  1458.                 OUT (C),A                       ;БИТЫ 7-0 ПАРАМЕТРА
  1459.                 DEC A
  1460.                 OUT (C),A                       ;БЕЗ CRC16
  1461.                 POP BC
  1462.                 RET
  1463.  
  1464. SECM200         PUSH HL
  1465.                 PUSH BC
  1466.                 LD A,CMD_58
  1467.                 CALL OUT_COM
  1468.                 CALL IN_OOUT
  1469.                 LD BC,SD_RSTR
  1470.                 IN H,(C)
  1471.                 NOP
  1472.                 IN A,(C)
  1473.                 NOP
  1474.                 IN A,(C)
  1475.                 NOP
  1476.                 IN A,(C)
  1477.                 BIT 6,H
  1478.                 POP HL
  1479.                 JR NZ,SECN200
  1480.                 EX DE,HL
  1481.                 ADD HL,HL
  1482.                 EX DE,HL
  1483.                 ADC HL,HL
  1484.                 LD H,L
  1485.                 LD L,D
  1486.                 LD D,E
  1487.                 LD E,0
  1488. SECN200         LD A,CMD_18
  1489.                 LD C,SD_SEND
  1490.                 OUT (C),A
  1491.                 NOP
  1492.                 OUT (C),H
  1493.                 NOP
  1494.                 OUT (C),L
  1495.                 NOP
  1496.                 OUT (C),D
  1497.                 NOP
  1498.                 OUT (C),E
  1499.                 LD A,0XFF
  1500.                 OUT (C),A
  1501.                 POP HL
  1502.                 RET
  1503.  
  1504. IN_OOUT         EXX
  1505.                 LD DE,0X20FF
  1506. IN_WAIT         IN A,(SD_RSTR)
  1507.                 CP E
  1508.                 JR NZ,IN_EXIT
  1509. IN_NEXT         DEC D
  1510.                 JR NZ,IN_WAIT
  1511. IN_EXIT         EXX
  1512.                 RET
  1513.  
  1514. CMD00           DB 0X40,0X00,0X00,0X00,0X00,0X95;GO_IDLE_STATE
  1515. CMD08           DB 0X48,0X00,0X00,0X01,0XAA,0X87;SEND_IF_COND
  1516. CMD16           DB 0X50,0X00,0X00,0X02,0X00,0XFF;SET_BLOCKEN
  1517.  
  1518. ;МНОГО СЕКТОРНОЕ ЧТЕНИЕ С SD КАРТЫ
  1519. RDMULTI         EX AF,AF'
  1520.                 CALL SECM200
  1521.                 EX AF,AF'
  1522.                 LD BC,SD_RSTR
  1523. RDMULT1         EX AF,AF'
  1524.                 CALL IN_OOUT
  1525.                 CP 0XFE
  1526.                 JR NZ,$-5
  1527.                 INIR
  1528.                 NOP
  1529.                 INIR
  1530.                 NOP
  1531.                 IN A,(C)
  1532.                 NOP
  1533.                 IN A,(C)
  1534.                 EX AF,AF'
  1535.                 DEC A
  1536.                 JR NZ,RDMULT1
  1537.                 LD A,CMD_12
  1538.                 CALL OUT_COM
  1539.                 CALL IN_OOUT
  1540.                 INC A
  1541.                 JR NZ,$-4
  1542.                 RET
  1543.  
  1544. ;ВЫБОРКА НОМЕРА КЛАСТЕРА ИЗ ФАЙЛОВОГО ОПИСАТЕЛЯ
  1545. RD_CLAS         EX DE,HL
  1546.                 LD DE,0X14                      ;СТАРШИЕ 16 БИТ ЧИТАЕМ ИЗ СМЕЩЕНИЯ +20
  1547.                 ADD HL,DE
  1548.                 LD C,(HL)
  1549.                 INC HL
  1550.                 LD B,(HL)
  1551.                 LD E,5                          ;МЛАДШИЕ 16 БИТ ЧИТАЕМ ИЗ СМЕЩЕНИЯ +26
  1552.                 ADD HL,DE
  1553.                 LD E,(HL)
  1554.                 INC HL
  1555.                 LD D,(HL)
  1556.                 INC HL
  1557.                 RET
  1558.  
  1559. ;ПРОВЕРКА ПО МАСКЕ
  1560. COMPARE         LD DE,FB_EXT
  1561.                 LD B,0X0B
  1562.                 LD A,(DE)
  1563.                 CP (HL)
  1564.                 RET NZ
  1565.                 INC HL
  1566.                 INC DE
  1567.                 DJNZ $-5
  1568.                 RET
  1569.  
  1570. ;РАСПАКОВЩИК ПУТИ К ФАЙЛУ
  1571. FNDBUF          LD BC,0X0802
  1572.                 LD DE,FB_EXT
  1573. FNDBUF4         LD A,(HL)
  1574.                 INC HL
  1575.                 CP "."
  1576.                 JR Z,FNDBUF2
  1577.                 CP "/"
  1578.                 JR Z,FNDBUF5
  1579.                 LD (DE),A
  1580.                 INC DE
  1581.                 DJNZ FNDBUF4
  1582.                 LD A,(HL)
  1583.                 AND A
  1584.                 RET Z
  1585.                 INC HL
  1586.                 JR FNDBUF3
  1587.  
  1588. FNDBUF5         LD A,C
  1589.                 AND A
  1590.                 RET Z
  1591. FNDBUF2         LD A,B
  1592.                 AND A
  1593.                 JR Z,FNDBUF3
  1594.                 LD A," "
  1595.                 LD (DE),A
  1596.                 INC DE
  1597.                 DJNZ $-2
  1598. FNDBUF3         LD B,3
  1599.                 DEC C
  1600.                 DEC HL
  1601.                 LD A,(HL)
  1602.                 CP "/"
  1603.                 JR Z,FNDBUF4
  1604.                 INC HL
  1605.                 JR FNDBUF4
  1606. RAMCEND
  1607.                 DEPHASE
  1608.