Subversion Repositories pentevo

Rev

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

  1.  
  2. ;LAST UPDATE: 12.11.2010 savelij
  3.  
  4. ;НОМЕРА ВЫЗЫВАЕМЫХ ФУНКЦИЙ
  5. Wc_fat          EQU 0X00                ;ИНИЦИАЛИЗАЦИЯ ПЕРЕМЕННЫХ
  6. Getfzap         EQU 0X01                ;ПОЛУЧЕНИЕ ОПИСАТЕЛЯ ФАЙЛА/ДИРЕКТОРИИ
  7. Ent_dir         EQU 0X02                ;ВХОД В ДИРУ/ВЫХОД ИЗ ДИРЫ
  8. Openfil         EQU 0X03                ;ОТКРЫТИЕ ФАЙЛА
  9. Readfil         EQU 0X04                ;ЧТЕНИЕ ОТКРЫТОГО ФАЙЛА
  10. Getlong         EQU 0X05                ;ПОЛУЧЕНИЕ РАСПАКОВАННОГО ДЛИННОГО ИМЕНИ
  11. Positf          EQU 0X06                ;РАБОТА С ПОЗИЦИЕЙ ТЕКУЩЕГО ФАЙЛА
  12. Prvlegz         EQU 0X07                ;ПОИСК ПРЕДЫДУЩЕЙ "ЛЕГАЛЬНОЙ ЗАПИСИ"
  13. Nxtlegz         EQU 0X08                ;ПОИСК СЛЕДУЮЩЕЙ "ЛЕГАЛЬНОЙ ЗАПИСИ"
  14. Find_file       EQU 0X09                ;УСТАНОВКА АДРЕС СКЛАДИРОВАНИЯ И СПИСКА РАСШИРЕНИЙ, НАЧАЛО ПОИСКА
  15. Next_find       EQU 0X0A                ;ПОИСК ФАЙЛОВ ПО РАСШИРЕНИЯМ
  16. Load_file       EQU 0X0B                ;ПОСЛЕДОВАТЕЛЬНОЕ ЧТЕНИЕ СЕКТОРОВ
  17. Read0sector     EQU 0X0C                ;ЧТЕНИЕ ПЕРВОГО СЕКТОРА ФАЙЛА
  18.  
  19. ;ПЕРЕМЕННЫЕ FAT
  20. BUF_512         EQU DRV_VAR             ;0X200 БУФЕР СЕКТОРА
  21. TDIRCLS         EQU BUF_512+0X0200      ;0X400 ТАБЛИЦА КЛАСТЕРОВ DIR
  22. DIR_CEP         EQU TDIRCLS+0X0400      ;0X100 ЦЕПОЧКА КЛАСТЕРОВ ПОДДИРЕКТОРИЙ
  23. ERORDRV         EQU DIR_CEP+0X0100      ;2 ВОЗВРАТ С ОШИБКОЙ В A
  24. CAL_FAT         EQU ERORDRV+2           ;1 КАЛИБР FAT
  25. MANYFAT         EQU CAL_FAT+1           ;1 КОЛИЧЕСТВО FAT-ТАБЛИЦ
  26. BYTSSEC         EQU MANYFAT+1           ;1 КОЛИЧЕСТВО СЕКТОРОВ В КЛАСТЕРЕ
  27. ROOTCLS         EQU BYTSSEC+1           ;4 СЕКТОР НАЧАЛА ROOT ДИРЕКТОРИИ
  28. ROOTZAP         EQU ROOTCLS+4           ;2 КОЛ-ВО ЗАПИСЕЙ В ROOT ДИРЕКТОРИИ
  29. SEC_FAT         EQU ROOTZAP+2           ;4 КОЛИЧЕСТВО СЕКТОРОВ ОДНОЙ ФАТ
  30. RSVDSEC         EQU SEC_FAT+4           ;2 РАЗМЕР РЕЗЕРВНОЙ ОБЛАСТИ
  31. STARTRZ         EQU RSVDSEC+2           ;4 НАЧАЛО ДИСКА/РАЗДЕЛА
  32. FRSTDAT         EQU STARTRZ+4           ;4 АДРЕС ПЕРВОГО СЕКТОРА ДАННЫХ ОТ BPB
  33. SEC_DSC         EQU FRSTDAT+4           ;4 КОЛИЧЕСТВО СЕКТОРОВ НА ДИСКЕ/РАЗДЕЛЕ
  34. CLS_DSC         EQU SEC_DSC+4           ;4 КОЛИЧЕСТВО КЛАСТЕРОВ НА ДИСКЕ/РАЗДЕЛЕ
  35. FATSTR          EQU CLS_DSC+4           ;4 НАЧАЛО ПЕРВОЙ FAT ТАБЛИЦЫ
  36. FILE_SZ         EQU FATSTR+4            ;4 РАЗМЕР ФАЙЛА В БАЙТАХ
  37. KOLWCLS         EQU FILE_SZ+4           ;4 КОЛИЧЕСТВО СВОБОДНЫХ КЛАСТЕРОВ
  38. LST0ZAP         EQU KOLWCLS+4           ;4 ПЕРВЫЙ СВОБОДНЫЙ КЛАСТЕР
  39. LSTLOAD         EQU LST0ZAP+4           ;4 НОМЕР СЕКТОРА ЗАГРУЖЕННОГО В БУФЕР
  40. TEK_DIR         EQU LSTLOAD+4           ;4 КЛАСТЕР ТЕКУЩЕЙ DIR
  41. TEK_ZAP         EQU TEK_DIR+4           ;2 ТЕКУЩАЯ ЗАПИСЬ В DIR
  42. SAVEZAP         EQU TEK_ZAP+2           ;2 СОХРАНЕННАЯ ТЕКУЩАЯ ПОЗИЦИЯ
  43. TEK_LVL         EQU SAVEZAP+2           ;1 ТЕКУЩИЙ УРОВЕНЬ КАТАЛОГА
  44. TEK_LEV         EQU TEK_LVL+1           ;1 ГЛУБИНА НАХОЖДЕНИЯ В ДИРЕКТОРИЯХ
  45. FREECLS         EQU TEK_LEV+1           ;8 СОХРАНЕНЫЕ ПЕРЕМЕННЫЕ ДЛЯ ОТКАТА
  46. KOLFIND         EQU FREECLS+8           ;2 КОЛИЧЕСТВО НАЙДЕННЫХ ПО МАСКЕ ФАЙЛОВ
  47. AFILCLS         EQU KOLFIND+2           ;4 НОМЕР ПЕРВОГО КЛАСТЕРА ДЛЯ ЗАГРУЗКИ
  48. FB_EXT          EQU AFILCLS+4           ;B БУФЕР 8.3 ДЛЯ ПОИСКА ИМЕНИ
  49. SAVE_IY         EQU FB_EXT+0X0B         ;2 ВНУТРЕНЕЕ СОХРАНЕНИЕ РЕГИСТРОВ ДЛЯ ДАЛЬНЕЙШЕГО ИСПОЛЬЗОВАНИЯ
  50. ADR_MASK_EXT    EQU SAVE_IY+2           ;2 АДРЕС РАСШИРЕНИЙ ФАЙЛОВ ДЛЯ ПОИСКА
  51. ADR_SKLAD       EQU ADR_MASK_EXT+2      ;2 АДРЕС СКЛАДИРОВАНИЯ НАЙДЕННОГО
  52. MAKS_ADR        EQU ADR_SKLAD+2         ;1 СТАРШИЙ БАЙТ МАКСИМАЛЬНОГО АДРЕСА БУФЕРА СКЛАДИРОВАНИЯ
  53. TFILCLS         EQU ERORDRV+0X0100      ;? ТАБЛИЦА КЛАСТЕРОВ ФАЙЛА, РАЗМЕР ЗАВИСИТ ОТ РАЗМЕРА КЛАСТЕРА
  54.  
  55. ;ОБЩАЯ ТОЧКА ВХОДА ДЛЯ РАБОТЫ С FAT
  56.                 EX AF,AF'
  57.                 EX (SP),HL
  58.                 LD A,(HL)
  59.                 INC HL
  60.                 EX (SP),HL
  61.                 ADD A,A
  62.                 PUSH IX
  63.                 PUSH IY
  64.                 LD (ERORDRV),SP
  65.                 PUSH HL
  66.                 LD HL,EXITDRV
  67.                 EX (SP),HL
  68.                 PUSH HL
  69.                 LD HL,TABLFAT
  70.                 ADD A,L
  71.                 LD L,A
  72.                 LD A,H
  73.                 ADC A,0
  74.                 LD H,A
  75.                 LD A,(HL)
  76.                 INC HL
  77.                 LD H,(HL)
  78.                 LD L,A
  79.                 EX AF,AF'
  80.                 EX (SP),HL
  81.                 RET
  82.  
  83. ERR_DRV         LD SP,(ERORDRV)
  84. EXITDRV         POP IY
  85.                 POP IX
  86.                 RET
  87.  
  88. TABLFAT         DW WC_FAT               ;00 ИНИЦИАЛИЗАЦИЯ FAT
  89.                 DW GETFZAP              ;01 ПОЛУЧЕНИЕ ОПИСАТЕЛЯ ФАЙЛА
  90.                 DW ENT_DIR              ;02 ВХОД/ВЫХОД В ДИР
  91.                 DW OPENFIL              ;03 ОРТКРЫТИЕ ФАЙЛА
  92.                 DW READFIL              ;04 ПРОИЗВОЛЬНОЕ ПОСЕКТОРНОЕ ЧТЕНИЕ ОТКРЫТОГО ФАЙЛА
  93.                 DW GETLONG              ;05 ПОЛУЧЕНИЕ ДЛИННОГО ИМЕНИ
  94.                 DW POSITF               ;06 WORK FOR TEK POSIT
  95.                 DW PRVLEGZ              ;07 PREV LEGAL OPISAT
  96.                 DW NXTLEGZ              ;08 NEXT LEGAL OPISAT
  97.                 DW FIND_FILE            ;09 УСТАНОВКА АДРЕСА СКЛАДИРОВАНИЯ И СПИСКА РАСШИРЕНИЙ ДЛЯ ПОИСКА, НАЧАЛО ПОИСКА
  98.                 DW NEXT_FIND            ;0A ПРОДОЛЖЕНИЕ ПОИСКА ФАЙЛОВ ПО РАСШИРЕНИЮ
  99.                 DW LD_FILE              ;0B ПОСЛЕДОВАТЕЛЬНОЕ ЧТЕНИЕ СЕКТОРОВ ФАЙЛЫ
  100.                 DW READ0SECTOR          ;0C ЧТЕНИЕ ПЕРВОГО СЕКТОРА ФАЙЛА
  101.  
  102. ;ЧТЕНИЕ/ЗАПИСЬ С ФАЙЛ С ТОЧНОСТЬЮ
  103. ;ДО СЕКТОРА (512 БАЙТ)
  104. READFIL         EXX
  105.                 LD E,0
  106.                 EXX
  107. RD_ADD          PUSH AF
  108.                 PUSH HL
  109.                 EX AF,AF'
  110.                 LD A,(BYTSSEC)
  111.                 LD H,A
  112.                 PUSH DE
  113.                 CALL BCDE_A
  114.                 LD C,H
  115.                 LD HL,TFILCLS
  116.                 EX DE,HL
  117.                 ADD HL,HL
  118.                 ADD HL,HL
  119.                 ADD HL,DE
  120.                 EX DE,HL
  121.                 POP HL
  122.                 LD A,C
  123.                 LD B,0
  124.                 DEC A
  125.                 AND L
  126.                 JR Z,ADD2FI3-5
  127.                 EXX
  128.                 LD C,A
  129.                 LD B,0
  130.                 EXX
  131.                 LD L,A
  132.                 LD A,C
  133.                 SUB L
  134.                 LD H,A
  135.                 EX AF,AF'
  136.                 CP H
  137.                 JR C,$+3
  138.                 LD A,H
  139.                 POP HL
  140.                 PUSH HL
  141.                 CALL ADD2FI2+1
  142.                 LD B,C
  143.                 LD A,(BYTSSEC)
  144.                 LD C,A
  145.                 EX (SP),HL
  146.                 EXX
  147.                 LD BC,0
  148.                 EXX
  149. ADD2FI3         POP HL
  150.                 POP AF
  151.                 SUB B
  152.                 RET Z
  153.                 LD B,0
  154.                 CP C
  155.                 JR Z,ADD2FI2+1
  156.                 INC B
  157.                 SUB C
  158.                 JR NC,$-2
  159.                 DEC B
  160.                 ADD A,C
  161.                 PUSH AF
  162.                 LD A,B
  163.                 AND A
  164.                 JR Z,ADD2FI2
  165.                 POP AF
  166. ADD2FI1         PUSH AF
  167.                 PUSH BC
  168.                 PUSH HL
  169.                 LD A,C
  170.                 EX DE,HL
  171.                 CALL LOADZP
  172.                 BIT 7,B
  173.                 JP NZ,ERR_DRV
  174.                 EX (SP),HL
  175.                 PUSH HL
  176.                 PUSH AF
  177.                 CALL REALSEC
  178.                 EXX
  179.                 PUSH BC
  180.                 EXX
  181.                 POP HL
  182.                 ADD HL,DE
  183.                 EX DE,HL
  184.                 LD HL,0
  185.                 ADC HL,BC
  186.                 LD B,H
  187.                 LD C,L
  188.                 POP AF
  189.                 POP HL
  190.                 EX AF,AF'
  191.                 EXX
  192.                 LD A,E
  193.                 EXX
  194.                 AND A
  195.                 JR Z,ADD2FI5
  196.                 EX AF,AF'
  197.                 CALL TO_DRV
  198.                 DB 5
  199.                 JR ADD2FI4
  200.  
  201. ADD2FI5         EX AF,AF'
  202.                 CALL TO_DRV
  203.                 DB 3
  204. ADD2FI4         AND A
  205.                 JP NZ,ERR_DRV
  206.                 POP DE
  207.                 POP BC
  208.                 DJNZ ADD2FI1+1
  209. ADD2FI2         POP AF
  210.                 INC B
  211.                 AND A
  212.                 RET Z
  213.                 LD C,A
  214.                 XOR A
  215.                 JR ADD2FI1
  216.  
  217. ;ОТКРЫТИЕ ФАЙЛА
  218. OPENFIL         CALL GETFZAP
  219.                 LD DE,20
  220.                 ADD HL,DE
  221.                 LD C,(HL)
  222.                 INC HL
  223.                 LD B,(HL)
  224.                 LD E,5
  225.                 ADD HL,DE
  226.                 LD E,(HL)
  227.                 INC HL
  228.                 LD D,(HL)
  229.                 INC HL
  230.                 PUSH BC
  231.                 PUSH DE
  232.                 CALL LOADZP
  233.                 LD (FILE_SZ),DE
  234.                 LD (FILE_SZ+2),BC
  235.                 POP DE
  236.                 POP BC
  237.                 LD HL,TFILCLS
  238. OPENFI1         CALL SAVEZP
  239.                 PUSH HL
  240.                 CALL RDFATZP
  241.                 CALL LST_CLS
  242.                 POP HL
  243.                 JR NC,OPENFI1
  244.                 LD B,0XFF
  245.                 CALL SAVEZP
  246. FILESEC         LD DE,(FILE_SZ)
  247.                 LD BC,(FILE_SZ+2)
  248.                 CALL HWOSTSC
  249.                 JP BCDE200
  250.  
  251. HWOSTSC         LD A,D
  252.                 AND 1
  253.                 LD H,A
  254.                 LD A,E
  255.                 AND A
  256.                 JR Z,$+3
  257.                 INC H
  258.                 LD E,0
  259.                 LD L,E
  260.                 BIT 0,H
  261.                 JR Z,$+3
  262.                 INC H
  263.                 RES 0,D
  264.                 ADD HL,DE
  265.                 EX DE,HL
  266.                 LD HL,0
  267.                 ADC HL,BC
  268.                 LD B,H
  269.                 LD C,L
  270.                 RET
  271.  
  272. ;ЗАГРУЖАЕМ СЕКТОР В БУФЕР
  273. LOADLST         CALL CPNUMSC
  274.                 JR NZ,LOADLS1
  275.                 LD HL,BUF_512
  276.                 RET
  277.  
  278. LOADLS1         LD (LSTLOAD+2),BC
  279.                 LD (LSTLOAD),DE
  280.                 LD HL,BUF_512
  281.                 PUSH HL
  282.                 CALL TO_DRV
  283.                 DB 2
  284.                 AND A
  285.                 JP NZ,ERR_DRV
  286.                 POP HL
  287.                 RET
  288.  
  289. ;ПРОВЕРКА НА УЖЕ ЗАГРУЖЕННЫЙ СЕКТОР
  290. CPNUMSC         LD HL,LSTLOAD
  291.                 LD A,(HL)
  292.                 INC HL
  293.                 CP E
  294.                 RET NZ
  295.                 LD A,(HL)
  296.                 INC HL
  297.                 CP D
  298.                 RET NZ
  299.                 LD A,(HL)
  300.                 INC HL
  301.                 CP C
  302.                 RET NZ
  303.                 LD A,(HL)
  304.                 CP B
  305.                 RET
  306.  
  307. ;ВХОЖДЕНИЕ В DIR
  308. ENT_DIR         CALL GETFZAP
  309.                 BIT 4,A
  310.                 EX AF,AF'
  311.                 LD A,E
  312.                 EX AF,AF'
  313.                 LD E,A
  314.                 LD D,(HL)
  315.                 RET Z
  316.                 EXX
  317.                 EX AF,AF'
  318.                 BIT 7,A
  319.                 JR Z,ENT_DI2
  320.                 LD HL,TEK_LEV
  321.                 LD A,(HL)
  322.                 AND A
  323.                 EXX
  324.                 RET Z
  325.                 EXX
  326.                 DEC A
  327.                 LD (HL),A
  328.                 ADD A,A
  329.                 LD H,HIGH (DIR_CEP)
  330.                 LD L,A
  331.                 LD A,(HL)
  332.                 INC L
  333.                 LD H,(HL)
  334.                 LD L,A
  335.                 JR ENT_DI1
  336.  
  337. ENT_DI2         LD HL,TEK_LEV
  338.                 LD A,(HL)
  339.                 INC A
  340.                 CP 0X80
  341.                 EXX
  342.                 RET Z
  343.                 EXX
  344.                 LD (HL),A
  345.                 DEC A
  346.                 ADD A,A
  347.                 LD H,HIGH (DIR_CEP)
  348.                 LD L,A
  349.                 LD BC,(TEK_ZAP)
  350.                 LD (HL),C
  351.                 INC L
  352.                 LD (HL),B
  353. ENT_DI1         EXX
  354.                 PUSH DE
  355.                 LD DE,20
  356.                 ADD HL,DE
  357.                 LD C,(HL)
  358.                 INC HL
  359.                 LD B,(HL)
  360.                 LD E,5
  361.                 ADD HL,DE
  362.                 LD E,(HL)
  363.                 INC HL
  364.                 LD D,(HL)
  365.                 LD A,B
  366.                 OR C
  367.                 OR D
  368.                 OR E
  369.                 JR NZ,ENT_DI0
  370.                 LD DE,(ROOTCLS)
  371.                 LD BC,(ROOTCLS+2)
  372. ENT_DI0         LD (TEK_DIR),DE
  373.                 LD (TEK_DIR+2),BC
  374.                 CALL INIRTSC
  375.                 POP DE
  376.                 RET
  377.  
  378. ;ПОЛУЧИТЬ ОПИСАТЕЛЬ ТЕКУЩЕГО ФАЙЛА
  379. GETFZAP         LD BC,(TEK_ZAP)                 ;ТЕКУЩИЙ НОМЕР ОПИСАТЕЛЯ
  380.                 LD A,B
  381.                 OR C
  382.                 JR Z,GETRZAP                    ;ЕСЛИ НОМЕР =0, ТО ПРЕДЫДУЩИЙ НОМЕР НЕ ПРОВЕРЯЕМ
  383.                 PUSH BC                         ;СОХРАНИЛИ ТЕКУЩИЙ НОМЕР
  384.                 DEC BC                          ;НУЖНО ПРОВЕРИТЬ ПРЕДЫДУЩИЙ НОМЕР
  385.                 CALL GETRZAP                    ;ПРОВЕРЯЕМ
  386.                 POP BC                          ;ВЕРНУЛИ ТЕКУЩИЙ НОМЕР
  387.                 LD E,A                          ;ИЗ ПРЕДЫДУЩЕГО ОПИСАТЕЛЯ НУЖЕН ТОЛЬКО ФЛАГОВЫЙ БАЙТ
  388. GETRZAP         PUSH DE
  389.                 CALL RDDIRSC                    ;ЧИТАЕМ СЕКТОР С ТЕКУЩИМ НОМЕРОМ
  390.                 POP DE                          ;ВЕРНУЛИ РЕГИСТР E
  391.                 INC A
  392.                 LD A,E                          ;ВЕРНУЛИ НАЛИЧИЕ/ОТСУСТВИЕ ДЛИННОГО ИМЕНИ
  393.                 RET Z                           ;ВЫХОДИМ ЕСЛИ ВЫЛЕТЕЛИ ЗА ПРЕДЕЛЫ СУЩЕСТВУЮЩЕЙ ДИРЫ
  394.                 EX AF,AF'                      
  395. GETFZA1         LD A,C
  396.                 AND 0X0F                        ;ПОЛУЧИЛИ НОМЕР ОПИСАТЕЛЯ В ЗАГРУЖЕННОМ СЕКТОРЕ ДИРЫ
  397.                 LD E,A
  398.                 LD D,0
  399.                 EX DE,HL
  400.                 ADD HL,HL
  401.                 ADD HL,HL
  402.                 ADD HL,HL
  403.                 ADD HL,HL
  404.                 ADD HL,HL
  405.                 ADD HL,DE                       ;ВЫЧИСЛИЛИ АДРЕС ВЫБРАННОГО ОПИСАТЕЛЯ
  406.                 LD DE,0X0B
  407.                 LD A,(HL)                       ;ВЗЯЛИ ФЛАГОВЫЙ БАЙТ ТЕКУЩЕГО ОПИСАТЕЛЯ
  408.                 EX DE,HL
  409.                 ADD HL,DE
  410.                 LD L,(HL)                       ;ВЗЯЛИ ПЕРВЫЙ БАЙТ ИМЕНИ
  411.                 LD H,A                          ;ПОЛОЖИЛИ ФЛАГОВЫЙ БАЙТ ЭТОГО ОПИСАТЕЛЯ
  412.                 EX DE,HL
  413.                 CALL CP_TWOT                    ;ПРОВЕРКА НА НАЛИЧИЕ В ИМЕНИ ".."
  414.                 LD D,0                          ;БУДЕМ ВХОДИТЬ В ДИРЕКТОРИЮ
  415.                 JR NZ,GETFZA2
  416.                 LD D,0X80                       ;БУДЕМ ВЫХОДИТЬ В ПРЕДЫДУЩУЮ ДИРЕКТОРИЮ
  417. GETFZA2         EX AF,AF'
  418.                 CP 0X0F                         ;ПРОВЕРЯЕМ ФЛАГОВЫЙ БАЙТ ПРЕДЫДУЩЕГО ОПИСАТЕЛЯ
  419.                 LD A,E                          ;ВЗЯЛИ ФЛАГОВЫЙ БАЙТ ТЕКУЩЕГО ОПИСАТЕЛЯ
  420.                 LD E,D                          ;ВЫСТАВИЛИ НАПРАВЛЕНИЕ ДВИЖЕНИЯ В ДИРАХ
  421.                 RET NZ
  422.                 INC E                           ;УСТАНОВКА НАЛИЧИЯ ДЛИННОГО ИМЕНИ
  423.                 RET
  424.  
  425. ;ЧТЕНИЕ СЕКТОРА DIR ПО НОМЕРУ BC
  426. ;НА ВЫХОДЕ: A=0XFF-ВЫХОД ЗА ПРЕДЕЛЫ DIR
  427. RDDIRSC         PUSH BC
  428.                 LD D,B
  429.                 LD E,C
  430.                 LD BC,0
  431.                 LD A,0X10
  432.                 CALL BCDE_A
  433.                 LD A,E
  434.                 PUSH AF
  435.                 LD A,(BYTSSEC)
  436.                 PUSH AF
  437.                 CALL BCDE_A
  438.                 LD HL,TDIRCLS
  439.                 EX DE,HL
  440.                 ADD HL,HL
  441.                 ADD HL,HL
  442.                 ADD HL,DE
  443.                 CALL LOADZP
  444.                 BIT 7,B
  445.                 JR Z,RDDIRS3
  446.                 POP BC
  447.                 POP BC
  448.                 POP BC
  449.                 XOR A
  450.                 DEC A
  451.                 RET
  452.  
  453. RDDIRS3         CALL REALSEC
  454.                 POP AF
  455.                 DEC A
  456.                 LD L,A
  457.                 POP AF
  458.                 AND L
  459.                 LD L,A
  460.                 LD H,0
  461.                 ADD HL,DE
  462.                 EX DE,HL
  463.                 LD HL,0
  464.                 ADC HL,BC
  465.                 LD B,H
  466.                 LD C,L
  467.                 CALL LOADLST
  468.                 POP BC
  469.                 XOR A
  470.                 RET
  471.  
  472. ;ФОРМИРОВАНИЕ ТАБЛИЦЫ КЛАСТЕРОВ DIR
  473. ;И ПОИСК ПЕРВОЙ "ЛЕГАЛЬНОЙ" ЗАПИСИ В DIR
  474. INIRTSC         PUSH AF
  475.                 LD HL,TDIRCLS
  476.                 CALL SAVEZP
  477.                 LD A,D
  478.                 OR E
  479.                 OR B
  480.                 OR C
  481.                 JR Z,LASTCLS
  482. NEXTCLS         PUSH HL
  483.                 CALL RDFATZP
  484.                 CALL LST_CLS
  485.                 POP HL
  486.                 JR C,LASTCLS
  487.                 CALL SAVEZP
  488.                 JR NEXTCLS
  489.  
  490. LASTCLS         LD BC,0XFFFF
  491.                 CALL SAVEZP
  492.                 CALL POSTF02
  493.                 POP AF
  494.                 RET
  495.  
  496. ;ПРОВЕРКА НА 1 ТОЧКУ
  497. CP_ONET         LD A,(HL)
  498.                 CP 0X2E
  499.                 RET NZ
  500.                 INC HL
  501.                 LD A,(HL)
  502.                 DEC HL
  503.                 CP 0X20
  504.                 RET NZ
  505.                 XOR A
  506.                 RET
  507.  
  508. ;ПРОВЕРКА НА 2 ТОЧКИ
  509. CP_TWOT         LD A,(HL)
  510.                 CP 0X2E
  511.                 RET NZ
  512.                 INC HL
  513.                 LD A,(HL)
  514.                 DEC HL
  515.                 CP 0X2E
  516.                 RET NZ
  517.                 XOR A
  518.                 RET
  519.  
  520. POSITF          CP LOW ((ENDTPOS-TPOSITF)/2)
  521.                 RET NC
  522.                 ADD A,A
  523.                 LD DE,TPOSITF
  524.                 LD L,A
  525.                 LD H,0
  526.                 ADD HL,DE
  527.                 LD E,(HL)
  528.                 INC HL
  529.                 LD D,(HL)
  530.                 EX DE,HL
  531.                 JP (HL)
  532.  
  533. TPOSITF         DW POSTF00
  534.                 DW POSTF01
  535.                 DW POSTF02
  536.                 DW POSTF03
  537.                 DW POSTF04
  538.                 DW POSTF05
  539.                 DW POSTF06
  540.                 DW POSTF07
  541. ENDTPOS
  542.  
  543. ;СОХРАНЕНИЕ ТЕКУЩЕЙ ПОЗИЦИИ ФАЙЛА
  544. POSTF00         LD HL,(TEK_ZAP)
  545.                 LD (SAVEZAP),HL
  546.                 RET
  547.  
  548. ;ВОССТАНОВЛЕНИЕ ТЕКУЩЕЙ ПОЗИЦИИ ФАЙЛА
  549. POSTF01         LD HL,(SAVEZAP)
  550.                 LD (TEK_ZAP),HL
  551.                 RET
  552.  
  553. ;ПЕРЕМОТАТЬ НА "B" ФАЙЛОВ НАЗАД
  554. POSTF03         LD A,B
  555.                 AND A
  556.                 RET Z
  557.                 PUSH BC
  558.                 CALL PRVLEGZ
  559.                 POP BC
  560.                 DJNZ $-5
  561.                 RET
  562.  
  563. ;ПЕРЕМОТАТЬ НА "B" ФАЙЛОВ ВПЕРЕД
  564. POSTF04         LD A,B
  565.                 AND A
  566.                 RET Z
  567.                 PUSH BC
  568.                 CALL NXTLEGZ
  569.                 POP BC
  570.                 DJNZ $-5
  571.                 RET
  572.  
  573. ;ПОДСЧЕТ КОЛИЧЕСТВА "ЛЕГАЛЬНЫХ" ЗАПИСЕЙ
  574. POSTF05         LD BC,0
  575.                 PUSH BC
  576.                 EXX
  577.                 POP BC
  578.                 EXX
  579.                 CALL RDDIRSC
  580.                 LD DE,0X20
  581. KOL_ZA4         LD A,(HL)
  582.                 CP 0X2E
  583.                 JR NZ,KOL_ZA1+2
  584.                 INC HL
  585.                 LD A,(HL)
  586.                 DEC HL
  587.                 CP 0X2E
  588.                 JR Z,KOL_ZA1+2
  589.                 INC BC
  590.                 ADD HL,DE
  591.                 JR KOL_ZA4
  592.  
  593. KOL_ZA1         INC BC
  594.                 ADD HL,DE
  595.                 LD A,H
  596.                 CP HIGH (BUF_512)+2
  597.                 JR NZ,KOL_ZA2
  598.                 CALL RDDIRSC
  599.                 LD D,0
  600.                 AND A
  601.                 JR Z,KOL_ZA2
  602.                 CALL KOL_ZA3
  603.                 DEC A
  604.                 RET
  605.  
  606. KOL_ZA2         LD E,0X0B
  607.                 ADD HL,DE
  608.                 LD A,(HL)
  609.                 AND A
  610.                 SBC HL,DE
  611.                 LD E,0X20
  612.                 CP 0X0F
  613.                 JR Z,KOL_ZA1
  614.                 CP 8
  615.                 JR Z,KOL_ZA1
  616.                 LD A,(HL)
  617.                 CP 0XE5
  618.                 JR Z,KOL_ZA1
  619.                 AND A
  620.                 JR Z,KOL_ZA3
  621.                 EXX
  622.                 INC BC
  623.                 EXX
  624.                 JR KOL_ZA1
  625.  
  626. KOL_ZA3         LD D,B
  627.                 LD E,C
  628.                 EXX
  629.                 PUSH BC
  630.                 EXX
  631.                 POP BC
  632.                 XOR A
  633.                 RET
  634.  
  635. ;УСТАНОВИТЬ НОМЕР "ЛЕГАЛЬНОЙ" ЗАПИСИ ИЗ "BC"
  636. POSTF06         LD (TEK_ZAP),BC
  637.                 RET
  638.  
  639. ;ВЕРНУТЬ В "BC" ТЕКУЩИЙ НОМЕР "ЛЕГАЛЬНОЙ" ЗАПИСИ
  640. POSTF07         LD BC,(TEK_ZAP)
  641.                 RET
  642.  
  643. CPTEKZP         CALL RDDIRSC
  644.                 RET M
  645.                 LD A,C
  646.                 AND 0X0F
  647.                 LD L,A
  648.                 LD H,0
  649.                 LD DE,BUF_512
  650.                 ADD HL,HL
  651.                 ADD HL,HL
  652.                 ADD HL,HL
  653.                 ADD HL,HL
  654.                 ADD HL,HL
  655.                 ADD HL,DE
  656.                 LD DE,0X0B
  657.                 ADD HL,DE
  658.                 LD A,(HL)
  659.                 SBC HL,DE
  660.                 LD E,(HL)
  661.                 AND A
  662.                 RET
  663.  
  664. ;СБРОС ТЕКУЩЕЙ ПОЗИЦИИ В 0 И ПОИСК ПЕРВОЙ "ЛЕГАЛЬНОЙ" ЗАПИСИ
  665. POSTF02         LD BC,0
  666.                 LD (TEK_ZAP),BC
  667.                 CALL RDDIRSC
  668.                 CALL CP_ONET
  669.                 JR Z,NXTLEG1
  670.                 LD A,(HL)
  671.                 AND A
  672.                 RET Z
  673.                 JR NXTLEG1+1
  674.  
  675. NXTLEGZ         LD BC,(TEK_ZAP)
  676. NXTLEG1         INC BC
  677.                 CALL CPTEKZP
  678.                 CP 0XFF
  679.                 RET Z
  680.                 CP 0X0F
  681.                 JR Z,NXTLEG1
  682.                 CP 8
  683.                 JR Z,NXTLEG1
  684.                 LD A,E
  685.                 AND A
  686.                 RET Z
  687.                 CP 0XE5
  688.                 JR Z,NXTLEG1
  689.                 LD (TEK_ZAP),BC
  690.                 RET
  691.  
  692. PRVLEGZ         LD BC,(TEK_ZAP)
  693.                 CALL CPTEKZP
  694.                 CALL CP_TWOT
  695.                 RET Z
  696. PRVLEG1         DEC BC
  697.                 CALL CPTEKZP
  698.                 CP 0X0F
  699.                 JR Z,PRVLEG1
  700.                 CP 8
  701.                 JR Z,PRVLEG1
  702.                 LD A,E
  703.                 CP 0XE5
  704.                 JR Z,PRVLEG1
  705.                 LD (TEK_ZAP),BC
  706.                 RET
  707.  
  708. SAVEZP          LD (HL),E
  709.                 INC HL
  710.                 LD (HL),D
  711.                 INC HL
  712.                 LD (HL),C
  713.                 INC HL
  714.                 LD (HL),B
  715.                 INC HL
  716.                 RET
  717.  
  718. LOADZP          LD E,(HL)
  719.                 INC HL
  720.                 LD D,(HL)
  721.                 INC HL
  722.                 LD C,(HL)
  723.                 INC HL
  724.                 LD B,(HL)
  725.                 INC HL
  726.                 RET
  727.  
  728. ;ИНИЦИАЛИЗАЦИЯ ПЕРЕМЕННЫХ FAT
  729. WC_FAT          LD HL,0XFFFF
  730.                 LD (LSTLOAD),HL
  731.                 LD (LSTLOAD+2),HL
  732.                 CALL COM_DEV
  733.                 DB 2
  734.                 LD (CAL_FAT),A
  735.                 LD E,D
  736.                 LD D,0
  737.                 EX DE,HL
  738.                 ADD HL,HL
  739.                 ADD HL,HL
  740.                 ADD HL,HL
  741.                 ADD HL,DE
  742.                 INC HL
  743.                 INC HL
  744.                 INC HL
  745.                 LD E,(HL)
  746.                 INC HL
  747.                 LD D,(HL)
  748.                 INC HL
  749.                 LD C,(HL)
  750.                 INC HL
  751.                 LD B,(HL)
  752.                 LD (STARTRZ),DE
  753.                 LD (STARTRZ+2),BC
  754.                 CALL LOADLST
  755.                 PUSH HL
  756.                 POP IX
  757.                 LD HL,0
  758.                 LD E,(IX+0X16)
  759.                 LD D,(IX+0X17)          ;BPB_FATSZ16
  760.                 LD A,D
  761.                 OR E
  762.                 JR NZ,RDFAT01           ;ЕСЛИ НЕ FAT12/16 (BPB_FATSZ16=0)
  763.                 LD E,(IX+0X24)
  764.                 LD D,(IX+0X25)
  765.                 LD L,(IX+0X26)
  766.                 LD H,(IX+0X27)          ;BPB_FATSZ32
  767.                                         ;ТО БЕРЕМ ИЗ СМЕЩЕНИЯ +36
  768. RDFAT01         LD (SEC_FAT+2),HL
  769.                 LD (SEC_FAT),DE         ;ЧИСЛО СЕКТОРОВ НА FAT-ТАБЛИЦУ
  770.                 LD HL,0
  771.                 LD E,(IX+0X13)
  772.                 LD D,(IX+0X14)          ;BPB_TOTSEC16
  773.                 LD A,D
  774.                 OR E
  775.                 JR NZ,RDFAT02           ;ЕСЛИ НЕ FAT12/16 (BPB_TOTSEC16=0)
  776.                 LD E,(IX+0X20)
  777.                 LD D,(IX+0X21)
  778.                 LD L,(IX+0X22)
  779.                 LD H,(IX+0X23)          ;BPB_TOTSEC32
  780.                                         ;ТО БЕРЕМ ИЗ СМЕЩЕНИЯ +32
  781. RDFAT02         LD (SEC_DSC+2),HL
  782.                 LD (SEC_DSC),DE         ;К-ВО СЕКТОРОВ НА ДИСКЕ/РАЗДЕЛЕ
  783.  
  784. ;ВЫЧИСЛЯЕМ ROOTDIRSECTORS
  785.                 LD E,(IX+0X11)
  786.                 LD D,(IX+0X12)          ;BPB_ROOTENTCNT
  787.                 LD (ROOTZAP),DE
  788.                 LD BC,0
  789.                 LD H,B
  790.                 LD L,C
  791.                 LD A,D
  792.                 OR E
  793.                 JR Z,RDFAT03
  794.                 LD A,0X10
  795.                 CALL BCDE_A
  796.                 EX DE,HL
  797.  
  798. ;ЭТО РЕАЛИЗОВАНА ФОРМУЛА
  799. ;ROOTDIRSECTORS=((BPB_ROOTENTCNT*32)++(BPB_BYTSPERSEC-1))/BPB_BYTSPERSEC
  800. ;В HL ROOTDIRSECTORS. ЕСЛИ FAT32, ТО HL=0 ВСЕГДА
  801.  
  802. RDFAT03         PUSH HL                 ;ROOTDIRSECTORS
  803.                 LD A,(IX+0X10)          ;BPB_NUMFATS
  804.                 LD (MANYFAT),A
  805.                 LD DE,(SEC_FAT)
  806.                 LD HL,(SEC_FAT+2)
  807.                 DEC A
  808.                 JR Z,RDFAT06            ;ЕСЛИ FAT ТАБЛИЦА 1,ТО НЕ УМНОЖАЕМ
  809. RDFAT05         EX DE,HL
  810.                 ADD HL,HL
  811.                 EX DE,HL
  812.                 ADC HL,HL
  813.                 DEC A
  814.                 JR NZ,RDFAT05
  815. RDFAT06         POP BC                  ;ПОЛНЫЙ РАЗМЕР FAT-ОБЛАСТИ В СЕКТОРАХ
  816.                 CALL HLDEPBC            ;ПРИБАВИЛИ ROOTDIRSECTORS
  817.                 LD C,(IX+0X0E)
  818.                 LD B,(IX+0X0F)          ;BPB_RSVDSECCNT
  819.                 LD (RSVDSEC),BC
  820.                 CALL HLDEPBC            ;ПРИБАВИЛИ BPB_RESVDSECCNT
  821.                 LD (FRSTDAT),DE
  822.                 LD (FRSTDAT+2),HL       ;ПОЛОЖИЛИ НОМЕР ПЕРВОГО СЕКТОРА ДАННЫХ
  823.                 LD B,H
  824.                 LD C,L
  825.                 LD HL,SEC_DSC
  826.                 CALL BCDEHLM            ;ВЫЧЛИ ИЗ ПОЛНОГО К-ВА СЕКТОРОВ РАЗДЕЛА
  827.                 LD A,(IX+0X0D)
  828.                 LD (BYTSSEC),A          ;КОЛИЧЕСТВО СЕКТОРОВ НА КЛАСТЕР
  829.                 CALL BCDE_A             ;РАЗДЕЛИЛИ НА К-ВО СЕКТОРОВ В КЛАСТЕРЕ
  830.                 LD (CLS_DSC),DE
  831.                 LD (CLS_DSC+2),BC       ;ПОЛОЖИЛИ КОЛ-ВО КЛАСТЕРОВ НА РАЗДЕЛЕ
  832.  
  833. ;               LD A,(CAL_FAT)
  834. ;               CP 0XFF                 ;ТИП FAT НЕ ОПРЕДЕЛЕН?
  835. ;               JR NZ,RDFAT04
  836. ;ОПРЕДЕЛЕНИЕ ТИПА FAT ПРИ ОТСУСТВИИ MBR
  837.                 LD HL,(CLS_DSC)
  838.                 LD DE,(CLS_DSC+2)       ;HLDE=КОЛИЧЕСТВО КЛАСТЕРОВ НА РАЗДЕЛЕ
  839.                 ADD HL,HL
  840.                 PUSH HL
  841.                 EX DE,HL
  842.                 ADC HL,HL               ;HLDE=КОЛИЧЕСТВО СЕКТОРОВ *2
  843.                 PUSH HL
  844.                 LD B,H
  845.                 LD C,L                  ;BCDE=КОЛИЧЕСТВО КЛАСТЕРОВ *2
  846.                 CALL RASCHET
  847.                 LD A,1
  848.                 POP DE
  849.                 POP HL                  ;HLDE=КОЛИЧЕСТВО КЛАСТЕРОВ *2
  850.                 JR Z,RDFAT04
  851.                 ADD HL,HL
  852.                 EX DE,HL
  853.                 ADC HL,HL               ;HLDE=КОЛИЧЕСТВО КЛАСТЕРОВ *4
  854.                 LD B,H
  855.                 LD C,L                  ;BCDE=КОЛИЧЕСТВО КЛАСТЕРОВ *4
  856.                 CALL RASCHET
  857.                 LD A,2
  858.                 JR Z,RDFAT04
  859.                 XOR A
  860.  
  861. RDFAT04         LD (CAL_FAT),A
  862.  
  863. ;ДЛЯ FAT12/16 ROOT КЛАСТЕР=0
  864. ;ДЛЯ FAT32 БЕРЕМ ПО СМЕЩЕМИЮ +44
  865. ;НА ВЫХОДЕ BCDE-СЕКТОР ROOTDIR КЛАСТЕР
  866.                 PUSH AF
  867.                 AND A
  868.                 LD DE,0
  869.                 LD B,D
  870.                 LD C,E
  871.                 JR Z,FSRROO2            ;FAT12
  872.                 DEC A
  873.                 JR Z,FSRROO2            ;FAT16
  874.                 LD E,(IX+0X2C)
  875.                 LD D,(IX+0X2D)
  876.                 LD C,(IX+0X2E)
  877.                 LD B,(IX+0X2F)          ;FAT32
  878. FSRROO2         LD (ROOTCLS),DE
  879.                 LD (ROOTCLS+2),BC       ;СЕКТОР ROOT ДИРЕКТОРИИ
  880.                 LD (TEK_DIR),DE
  881.                 LD (TEK_DIR+2),BC
  882. FSRR121         PUSH DE
  883.                 PUSH BC
  884.                 LD DE,(RSVDSEC)
  885.                 LD BC,0
  886.                 LD HL,STARTRZ
  887.                 CALL BCDEHLP
  888.                 LD (FATSTR),DE
  889.                 LD (FATSTR+2),BC
  890.                 XOR A
  891.                 LD (TEK_LEV),A
  892.                 POP BC
  893.                 POP DE
  894.                 POP AF
  895.                 JP INIRTSC
  896.  
  897. ;СРАВНЕНИЕ РЕАЛЬНО ЗАНИМАЕМОЕ КЛАСТЕРАМИ МЕСТО И КОИЧЕСТВОМ СЕКТОРОВ ПОД 1 FAT ТАБЛИЦУ
  898. RASCHET         CALL BCDE200            ;РАЗДЕЛИЛИ НА 512
  899.                 LD HL,SEC_FAT
  900.                 CALL BCDEHLM            ;ВЫЧЛИ ИЗ КОЛИЧЕСТВА СЕКТОРОВ НА 1 FAT ТАБЛИЦУ
  901.                 LD A,E
  902.                 AND 0XF0                ;МЛАДШИЕ 4 БИТА НЕ ИНТЕРЕСНЫ
  903.                 OR D
  904.                 OR C
  905.                 OR B
  906.                 RET
  907.  
  908. ;ОТДАЧА КОРОТКОГО ИМЕНИ ФАЙЛА, ЕСЛИ ДЛИННОЕ ОТСУСТВУЕТ
  909. NO_LNG          POP DE
  910.                 LD BC,8
  911.                 LDIR
  912.                 LD A,(HL)
  913.                 CP 0X20
  914.                 JR Z,NO_LNG1
  915.                 EX DE,HL
  916.                 LD (HL),0X2E
  917.                 INC HL
  918.                 EX DE,HL
  919.                 LDI
  920.                 LDI
  921.                 LDI
  922. NO_LNG1         EX DE,HL
  923.                 LD (HL),0
  924.                 POP HL
  925.                 RET
  926.  
  927. ;ОТДАЧА ДЛИННОГО ИМЕНИ ФАЙЛА
  928. GETLONG         PUSH HL
  929.                 PUSH HL
  930.                 CALL GETFZAP
  931.                 BIT 0,E
  932.                 JR Z,NO_LNG
  933.                 EXX
  934.                 LD C,0
  935.                 EXX
  936. GETLNG2         DEC BC
  937.                 CALL GETRZAP
  938.                 LD A,(HL)
  939.                 INC HL
  940.                 EXX
  941.                 BIT 6,C
  942.                 POP HL
  943.                 JR NZ,GETLNGE+1
  944.                 LD C,A
  945.                 EXX
  946.                 LD A,5
  947.                 CALL GETLNG1
  948.                 AND A
  949.                 JR Z,GETLNGE
  950.                 INC HL
  951.                 INC HL
  952.                 INC HL
  953.                 LD A,6
  954.                 CALL GETLNG1
  955.                 AND A
  956.                 JR Z,GETLNGE
  957.                 INC HL
  958.                 INC HL
  959.                 LD A,2
  960.                 CALL GETLNG1
  961.                 AND A
  962.                 JR Z,GETLNGE
  963.                 EXX
  964.                 PUSH HL
  965.                 EXX
  966.                 JR GETLNG2
  967.  
  968. GETLNGE         EXX
  969.                 LD (HL),0
  970.                 EXX
  971.                 POP HL
  972.                 RET
  973.  
  974. GETLNG1         EXX
  975.                 LD B,A
  976.                 EXX
  977.                 LD D,(HL)
  978.                 INC HL
  979.                 LD E,(HL)
  980.                 INC HL
  981.                 LD A,D
  982.                 OR E
  983.                 RET Z
  984.                 LD A,E
  985.                 AND A
  986.                 JR NZ,GETLNG3
  987.                 LD A,D
  988.                 CP 0X80
  989.                 JR C,GETLNG5
  990.                 LD D,0X5F
  991.                 JR GETLNG5
  992.  
  993. GETLNG3         CP 4
  994.                 LD A,0X5F
  995.                 JR NZ,GETLNG5
  996.                 LD A,D
  997.                 LD E,0XEF
  998.                 LD D,0X5F
  999.                 CP 1
  1000.                 JR Z,GETLNG4
  1001.                 LD E,0XA0
  1002.                 CP 0X51
  1003.                 JR Z,GETLNG4
  1004.                 SUB 0X10
  1005.                 LD E,0X80
  1006.                 JR NC,GETLNG6
  1007.                 LD A,D
  1008.                 JR GETLNG5
  1009.  
  1010. GETLNG6         CP 0X30
  1011.                 JR C,GETLNG4
  1012.                 LD E,0XB0
  1013.                 CP 0X40
  1014.                 JR C,GETLNG4
  1015.                 LD A,D
  1016.                 JR GETLNG5
  1017.  
  1018. GETLNG4         ADD A,E
  1019. GETLNG5         EXX
  1020.                 LD (HL),A
  1021.                 INC HL
  1022.                 DEC B
  1023.                 EXX
  1024.                 RET Z
  1025.                 JR GETLNG1+3
  1026. ;401,410-44F,451
  1027.  
  1028. ;ПРОВЕРКА НА ПОСЛЕДНИЙ КЛАСТЕР
  1029. LST_CLS         LD A,(CAL_FAT)                  ;ВЗЯЛИ ТИП FAT
  1030.                 AND A
  1031.                 JR NZ,LST_CL1
  1032.                 LD HL,0X0FF7                    ;ДЛЯ FAT12
  1033.                 SBC HL,DE
  1034.                 RET
  1035.  
  1036. LST_CL1         DEC A
  1037.                 JR NZ,LST_CL2
  1038.                 LD HL,0XFFF7                    ;ДЛЯ FAT16
  1039.                 SBC HL,DE
  1040.                 RET
  1041.  
  1042. LST_CL2         LD HL,0X0FFF
  1043.                 SBC HL,BC
  1044.                 RET NZ
  1045.                 LD HL,0XFFF7
  1046.                 SBC HL,DE
  1047.                 RET
  1048.  
  1049. ;ЧТЕНИЕ СЛЕДУЮЩЕГО НОМЕРА КЛАСТЕРА
  1050. RDFATZP         LD A,(CAL_FAT)
  1051.                 AND A
  1052.                 JR Z,RDFATS0
  1053.                 DEC A
  1054.                 JR Z,RDFATS1
  1055.                 EX DE,HL
  1056.                 ADD HL,HL
  1057.                 EX DE,HL
  1058.                 LD HL,0
  1059.                 ADC HL,BC
  1060.                 ADC HL,BC
  1061.                 LD A,E
  1062.                 LD E,D
  1063.                 LD D,L
  1064.                 LD C,H
  1065.                 LD B,0
  1066.                 CALL RDFATS2
  1067.                 INC HL
  1068.                 LD C,(HL)
  1069.                 INC HL
  1070.                 LD B,(HL)
  1071.                 RET
  1072.  
  1073. RDFATS1         LD BC,0
  1074.                 LD A,E
  1075.                 LD E,D
  1076.                 LD D,C
  1077. RDFATS2         PUSH AF
  1078.                 PUSH BC
  1079.                 LD HL,FATSTR
  1080.                 CALL BCDEHLP
  1081.                 CALL LOADLST
  1082.                 POP BC
  1083.                 POP AF
  1084.                 LD E,A
  1085.                 LD D,0
  1086.                 ADD HL,DE
  1087.                 ADD HL,DE
  1088.                 LD E,(HL)
  1089.                 INC HL
  1090.                 LD D,(HL)
  1091.                 RET
  1092.  
  1093. RDFATS0         LD H,D
  1094.                 LD L,E
  1095.                 ADD HL,HL
  1096.                 ADD HL,DE
  1097.                 SRL H
  1098.                 RR L
  1099.                 LD A,E
  1100.                 LD E,H
  1101.                 LD D,0
  1102.                 LD B,D
  1103.                 LD C,D
  1104.                 SRL E
  1105.                 PUSH AF
  1106.                 PUSH HL
  1107.                 LD HL,FATSTR
  1108.                 CALL BCDEHLP
  1109.                 CALL LOADLST
  1110.                 POP BC
  1111.                 LD A,B
  1112.                 AND 1
  1113.                 LD B,A
  1114.                 ADD HL,BC
  1115.                 LD B,(HL)
  1116.                 INC HL
  1117.                 LD A,H
  1118.                 CP HIGH (BUF_512)+2
  1119.                 JR NZ,RDFATS4
  1120.                 PUSH BC
  1121.                 LD BC,0
  1122.                 INC DE
  1123.                 CALL LOADLST
  1124.                 POP BC
  1125. RDFATS4         POP AF
  1126.                 LD D,(HL)
  1127.                 LD E,B
  1128.                 LD BC,0
  1129.                 RRA
  1130.                 JR NC,RDFATS3
  1131.                 SRL D
  1132.                 RR E
  1133.                 SRL D
  1134.                 RR E
  1135.                 SRL D
  1136.                 RR E
  1137.                 SRL D
  1138.                 RR E
  1139. RDFATS3         LD A,D
  1140.                 AND 0X0F
  1141.                 LD D,A
  1142.                 RET
  1143.  
  1144. ;ВЫЧИСЛЕНИЕ РЕАЛЬНОГО СЕКТОРА
  1145. ;НА ВХОДЕ: BCDE=НОМЕР КЛАСТЕРА FAT
  1146. ;НА ВЫХОДЕ: BCDE=АДРЕС СЕКТОРА
  1147. REALSEC         LD A,B
  1148.                 OR C
  1149.                 OR D
  1150.                 OR E
  1151.                 JR NZ,REALSE1
  1152.                 LD DE,(FATSTR)
  1153.                 LD BC,(FATSTR+2)
  1154.                 LD HL,SEC_FAT
  1155.                 PUSH HL
  1156.                 CALL BCDEHLP
  1157.                 POP HL
  1158.                 JP BCDEHLP
  1159.  
  1160. REALSE1         LD HL,0XFFFE
  1161.                 EX DE,HL
  1162.                 ADD HL,DE
  1163.                 EX DE,HL
  1164.                 INC HL
  1165.                 ADC HL,BC               ;НОМЕР КЛАСТЕРА-2
  1166.                 LD A,(BYTSSEC)
  1167.                 JR REALSE2
  1168.  
  1169. REALSE3         SLA E
  1170.                 RL D
  1171.                 RL L
  1172.                 RL H
  1173. REALSE2         RRCA
  1174.                 JR NC,REALSE3           ;УМНОЖИЛИ НА РАЗМЕР КЛАСТЕРА
  1175.                 LD B,H
  1176.                 LD C,L
  1177.                 LD HL,STARTRZ
  1178.                 CALL BCDEHLP            ;ПРИБАВИЛИ СМЕЩЕНИЕ ОТ НАЧАЛА ДИСКА
  1179.                 LD HL,FRSTDAT
  1180.                 JP BCDEHLP              ;ПРИБАВИЛИ СМЕЩЕНИЕ ОТ НАЧАЛА РАЗДЕЛА
  1181.  
  1182. BCDE200         LD E,D
  1183.                 LD D,C
  1184.                 LD C,B
  1185.                 LD B,0
  1186.                 LD A,2
  1187.                 JR BCDE_A
  1188.  
  1189. ;BCDE>>A=BCDE
  1190. BCDE_A1         SRL B
  1191.                 RR C
  1192.                 RR D
  1193.                 RR E
  1194. BCDE_A          RRCA
  1195.                 JR NC,BCDE_A1
  1196.                 RET
  1197.  
  1198. ;(ADR)-BCDE=BCDE
  1199. BCDEHLM         LD A,(HL)
  1200.                 INC HL
  1201.                 SUB E
  1202.                 LD E,A
  1203.                 LD A,(HL)
  1204.                 INC HL
  1205.                 SBC A,D
  1206.                 LD D,A
  1207.                 LD A,(HL)
  1208.                 INC HL
  1209.                 SBC A,C
  1210.                 LD C,A
  1211.                 LD A,(HL)
  1212.                 SBC A,B
  1213.                 LD B,A
  1214.                 RET
  1215.  
  1216. ;(ADR)+BCDE=BCDE
  1217. BCDEHLP         LD A,(HL)
  1218.                 INC HL
  1219.                 ADD A,E
  1220.                 LD E,A
  1221.                 LD A,(HL)
  1222.                 INC HL
  1223.                 ADC A,D
  1224.                 LD D,A
  1225.                 LD A,(HL)
  1226.                 INC HL
  1227.                 ADC A,C
  1228.                 LD C,A
  1229.                 LD A,(HL)
  1230.                 ADC A,B
  1231.                 LD B,A
  1232.                 RET
  1233.  
  1234. ;HLDE+BC=HLDE
  1235. HLDEPBC         EX DE,HL
  1236.                 ADD HL,BC
  1237.                 EX DE,HL
  1238.                 LD BC,0
  1239.                 ADC HL,BC
  1240.                 RET
  1241.  
  1242. CP_EXT          PUSH BC
  1243.                 PUSH DE
  1244.                 PUSH HL
  1245.                 LD C,0
  1246.                 LD DE,(ADR_MASK_EXT)
  1247. CPETR2          LD A,(DE)
  1248.                 AND A
  1249.                 JR Z,CPETR1+1
  1250.                 INC C
  1251.                 PUSH DE
  1252.                 PUSH HL
  1253.                 CALL COMPARF
  1254.                 POP HL
  1255.                 POP DE
  1256.                 JR Z,CPETR1
  1257.                 INC DE
  1258.                 INC DE
  1259.                 INC DE
  1260.                 JR CPETR2
  1261.  
  1262. CPETR1          LD A,C
  1263.                 POP HL
  1264.                 POP DE
  1265.                 POP BC
  1266.                 RET
  1267.  
  1268. COMPARF         PUSH DE
  1269.                 LD DE,8
  1270.                 ADD HL,DE
  1271.                 POP DE
  1272.                 LD B,3
  1273. COMPARF1        LD A,(DE)
  1274.                 CP (HL)
  1275.                 RET NZ
  1276.                 INC HL
  1277.                 INC DE
  1278.                 DJNZ COMPARF1
  1279.                 RET
  1280.  
  1281. FIND_FILE       LD (ADR_MASK_EXT),HL
  1282.                 LD (ADR_SKLAD),DE
  1283.                 LD A,D
  1284.                 ADD A,0X10
  1285.                 LD (MAKS_ADR),A
  1286.                 LD HL,0
  1287.                 LD (KOLFIND),HL
  1288.                 XOR A
  1289. NEXT_FIND       LD IX,(MAKS_ADR)
  1290.                 AND A
  1291.                 JR Z,FINDF2
  1292.                 LD HL,(ADR_SKLAD)
  1293.                 DEC HL
  1294.                 DEC HL
  1295.                 LD (ADR_SKLAD),HL       ;-2 АДРЕС СКЛАДИРОВАНИЯ
  1296.                 LD HL,(KOLFIND)
  1297.                 DEC HL                  ;-1 НАЙДЕННЫХ ФАЙЛОВ
  1298.                 LD (KOLFIND),HL
  1299. FINDF2          CALL GETFZAP            ;ПОЛУЧЕНИЕ ОПИСАТЕЛЯ
  1300.                 LD A,(HL)
  1301.                 CP 0XE5                 ;ЕСЛИ УДАЛЕНО
  1302.                 JR Z,FINDF1             ;ТО ПЕРЕХОДИМ НА СЛЕДУЮЩИЙ ОПИСАТЕЛЬ
  1303.                 LD DE,0X0B              ;НУЖЕН ФЛАГОВЫЙ БАЙТ ОПИСАТЕЛЯ
  1304.                 EX DE,HL                ;АДРЕС ОПИСАТЕЛЯ ПОРТИТЬ НЕ БУДЕМ
  1305.                 ADD HL,DE               ;ПОЛУЧИЛИ АДРЕС ФЛАГОВОГО БАЙТА
  1306.                 LD L,(HL)               ;ВЗЯЛИ ФЛАГОВЫЙ БАЙТ
  1307.                 EX DE,HL                ;ВЕРНУЛИ АДРЕС ПОЛУЧЕННОГО ОПИСАТЕЛЯ
  1308.                 BIT 4,E                 ;ПРОВЕРКА ЭТО ФАЙЛ ИЛИ ДИРА
  1309.                 JR Z,FINDF3             ;ЕСЛИ ФАЙЛ, ТО ПРОДОЛЖЕНИЕ ПРОВЕРКИ
  1310.                 LD HL,(ADR_SKLAD)       ;ДЛЯ ДИРЫ ПРОВЕРЯТЬ БОЛЬШЕ НЕ НАДО
  1311.                 LD (HL),C
  1312.                 INC HL
  1313.                 LD (HL),B               ;ПОЛОЖИЛИ НОМЕР ДИРЫ В ТАБЛИЧКУ
  1314.                 INC HL
  1315.                 LD (ADR_SKLAD),HL
  1316.                 EX DE,HL
  1317.                 LD HL,(KOLFIND)
  1318.                 INC HL                  ;+1 НАЙДЕННЫХ ФАЙЛОВ
  1319.                 LD (KOLFIND),HL
  1320.                 LD A,IXL
  1321.                 CP D                    ;ПРОВЕРКА ЗА ВЫХОД ВЫДЕЛЕННОГО БУФЕРА
  1322.                 JR C,END_FINDF          ;НЕ БОЛЕЕ 2048 ДИРОВ/ФАЙЛОВ В ТЕКУЩЕЙ ДИРЕКТОРИИ
  1323. FINDF1          LD HL,(TEK_ZAP)
  1324.                 PUSH HL                 ;СОХРАНИЛИ НА СТЕКЕ ТЕКУЩИЙ НОМЕР ФАЙЛА
  1325.                 CALL NXTLEGZ            ;ИЩЕМ СЛЕДУЮЩИЙ ОПИСАТЕЛЬ
  1326.                 LD BC,(TEK_ZAP)         ;ВЗЯЛИ НОВЫЙ НОМЕР ФАЙЛА
  1327.                 POP HL                  ;ВЕРНУЛИ СО СТЕКА СТАРЫЙ НОМЕР ФАЙЛА
  1328.                 AND A
  1329.                 SBC HL,BC               ;ПРОВЕРКА НА ИЗМЕНЕНИЕ НОМЕРА ОПИСАТЕЛЯ
  1330.                 JR NZ,FINDF2            ;НОМЕР НЕ ИЗМЕНИЛСЯ, ВЫХОДИМ
  1331. END_FINDF       LD BC,(KOLFIND)         ;КОЛИЧЕСТВО НАЙДЕНЫХ ФАЙЛОВ
  1332.                 XOR A
  1333.                 RET
  1334.  
  1335. FINDF3          CALL CP_EXT             ;ПРОВЕРКА ПО РАСШИРЕНИЮ
  1336.                 AND A
  1337.                 JR Z,FINDF1             ;НЕ СООТВЕСТВУЕТ ЗАДАННОЙ МАСКЕ ПО РАСШИРЕНИЮ
  1338.                 PUSH AF
  1339.                 LD DE,0X1C
  1340.                 ADD HL,DE
  1341.                 LD E,(HL)
  1342.                 INC HL
  1343.                 LD D,(HL)
  1344.                 INC HL
  1345.                 PUSH DE
  1346.                 LD E,(HL)
  1347.                 INC HL
  1348.                 LD D,(HL)
  1349.                 PUSH DE
  1350.                 CALL READ0SECTOR
  1351.                 EXX
  1352.                 LD HL,(ADR_SKLAD)
  1353.                 LD DE,(TEK_ZAP)
  1354.                 LD (HL),E
  1355.                 INC HL
  1356.                 LD (HL),D               ;ПОЛОЖИЛИ НОМЕР ДИРЫ В ТАБЛИЧКУ
  1357.                 INC HL
  1358.                 LD (ADR_SKLAD),HL
  1359.                 LD HL,(TEK_ZAP)
  1360.                 INC HL
  1361.                 LD (TEK_ZAP),HL
  1362.                 LD HL,(KOLFIND)
  1363.                 INC HL                  ;+1 НАЙДЕННЫХ ФАЙЛОВ
  1364.                 LD (KOLFIND),HL
  1365.                 POP BC
  1366.                 POP DE
  1367.                 EXX
  1368.                 POP AF
  1369.                 RET
  1370.  
  1371. ;IXL-КОЛИЧЕСТВО СЕКТОРОВ ДЛЯ ЗАГРУЗКИ
  1372. ;IXH-РАЗМЕР КЛАСТЕРА
  1373. ;IYL-
  1374. ;IYH-СМЕЩЕНИЕ В КЛАСТЕРЕ
  1375. LD_FILE         PUSH HL
  1376.                 LD HL,LD_FILE6
  1377.                 EX (SP),HL
  1378.                 LD IY,(SAVE_IY)
  1379.                 LD A,(BYTSSEC)
  1380.                 LD IXH,A
  1381.                 LD A,IXL
  1382.                 AND A
  1383.                 JR NZ,LD_FILE0
  1384.                 LD (AFILCLS),DE
  1385.                 LD (AFILCLS+2),BC
  1386.                 LD IYH,0                        ;ИЗНАЧАЛЬНОЕ СМЕЩЕНИЕ В КЛАСТЕРЕ
  1387.                 RET
  1388.  
  1389. LD_FILE6        LD (SAVE_IY),IY
  1390.                 RET
  1391.  
  1392. LD_FILE0        LD DE,(AFILCLS)
  1393.                 LD BC,(AFILCLS+2)       ;ТЕКУЩИЙ НОМЕР КЛАСТЕРА
  1394.                 PUSH BC
  1395.                 PUSH DE
  1396.                 PUSH HL
  1397.                 CALL REALSEC            ;ПЕРЕВЕЛИ НОМЕР КЛАСТЕРА В НОМЕР СЕКТОРА
  1398.                 LD A,IYH
  1399.                 LD L,A
  1400.                 LD H,0
  1401.                 ADD HL,DE
  1402.                 EX DE,HL
  1403.                 JR NC,LD_FILE1
  1404.                 INC BC                  ;BCDE=НОМЕР СЕКТОРА ОТКУДА ГРУЗИТЬ
  1405. LD_FILE1        LD A,IXL
  1406.                 CP IXH
  1407.                 JP C,LD_FILE2
  1408.                 LD A,IXH
  1409. LD_FILE2        ADD A,IYH
  1410.                 CP IXH
  1411.                 LD A,IXL
  1412.                 JP C,LD_FILE5
  1413.                 LD A,IXH
  1414.                 SUB IYH
  1415. LD_FILE5        LD IYL,A                ;СКОЛЬКО СЕКТОРОВ СЕЙЧАС ГРУЗИМ
  1416.                 POP HL                  ;ВОССТАНОВИЛИ АДРЕС ЗАГРУЗКИ
  1417.                 CALL TO_DRV
  1418.                 DB 3                    ;ЗАГРУЗИЛИ СЕКТОРА
  1419.                 POP DE
  1420.                 POP BC                  ;ВОССТАНОВИЛИ НОМЕР КЛАСТЕРА
  1421.                 LD A,IYH
  1422.                 ADD A,IYL
  1423.                 CP IXH
  1424.                 JP C,LD_FILE3
  1425.                 SUB IXH
  1426. LD_FILE3        LD IYH,A
  1427.                 JP C,LD_FILE4
  1428.                 PUSH HL                 ;СОХРАНИЛИ АДРЕС ЗАГРУЗКИ
  1429.                 CALL RDFATZP            ;ПРОЧИТАЛИ НОМЕР СЛЕДУЮЩЕГО КЛАСТЕРА
  1430.                 LD (AFILCLS),DE
  1431.                 LD (AFILCLS+2),BC
  1432.                 CALL LST_CLS            ;ПРОВЕРИЛИ, А МОЖЕТ ЭТО ПОСЛЕДНИЙ КЛАСТЕР?
  1433.                 POP HL                  ;ВОССТАНОВИЛИ АДРЕС ЗАГРУЗКИ
  1434.                 RET C                   ;ЕСЛИ ПОСЛЕДНИЙ, ВЫХОДИМ
  1435. LD_FILE4        LD A,IXL
  1436.                 SUB IYL
  1437.                 RET Z
  1438.                 LD IXL,A
  1439.                 JP NZ,LD_FILE0
  1440.                 RET
  1441.  
  1442. ;ЧТЕНИЕ 0 СЕКТОРА ТЕКУЩЕГО ФАЙЛА
  1443. READ0SECTOR     CALL GETFZAP
  1444.                 LD DE,0X14
  1445.                 ADD HL,DE
  1446.                 LD C,(HL)
  1447.                 INC HL
  1448.                 LD B,(HL)
  1449.                 LD E,5
  1450.                 ADD HL,DE
  1451.                 LD E,(HL)
  1452.                 INC HL
  1453.                 LD D,(HL)
  1454.                 CALL REALSEC
  1455.                 JP LOADLST
  1456.