Subversion Repositories pentevo

Rev

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

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