Subversion Repositories pentevo

Rev

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

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