Subversion Repositories pentevo

Rev

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

  1.  
  2. ;LAST UPDATE: 02.12.2012 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. 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,IYL
  1001.                 AND A
  1002.                 JR NZ,GETPATH1
  1003.                 LD A,(SETDVOL)
  1004.                 LD D,A
  1005.                 ADD A,HIGH (TEK_BUFPATH+CPU1)+4
  1006.                 LD H,A
  1007.                 LD L,0XFF
  1008.                 LD A,(HL)
  1009.                 LD DE,BUF_256
  1010.                 LD BC,0X100
  1011.                 LD L,C
  1012.                 LDIR
  1013.                 LD C,A                          ;BC=СКОЛЬКО БАЙТ ПЕРЕНОСИТЬ В АДРЕС ПО ЗАПРОСУ
  1014.                 LD A,HIGH (CPU2)-1
  1015.                 ADD A,D
  1016.                 LD H,A
  1017.                 LD DE,(RREG_L)                  ;КУДА ПЕРЕНОСИТЬ ПУТЬ
  1018.                 JP LDIR_BYTES
  1019.  
  1020. GETPATH1        PUSH HL
  1021.                 PUSH HL
  1022.                 LD A,(SETDVOL)
  1023.                 LD D,A
  1024.                 ADD A,HIGH (TEK_BUFPATH+CPU1)+4
  1025.                 LD H,A
  1026.                 LD L,0XFF
  1027.                 LD A,(HL)
  1028.                 POP DE
  1029.                 LD BC,0X100
  1030.                 LD L,C
  1031.                 LDIR
  1032.                 POP HL
  1033.                 RET
  1034.  
  1035. ;ВХОЖДЕНИЕ В DIR
  1036. ENTER_DIR       LD IYL,INTERNAL
  1037.                 CALL READ_DIR
  1038.                 PUSH AF
  1039.                 PUSH DE
  1040.                 PUSH HL
  1041.                 CALL RENEW_PATH
  1042.                 POP HL
  1043.                 POP DE
  1044.                 POP AF
  1045.                 BIT 4,A
  1046.                 EX AF,AF'
  1047.                 LD A,E
  1048.                 EX AF,AF'
  1049.                 LD E,A
  1050.                 LD D,(HL)
  1051.                 RET Z
  1052.                 EXX
  1053.                 EX AF,AF'
  1054.                 BIT 7,A
  1055.                 JR Z,ENT_DI2
  1056.                 LD HL,TEK_LEV
  1057.                 LD A,(HL)
  1058.                 AND A
  1059.                 EXX
  1060.                 RET Z
  1061.                 EXX
  1062.                 DEC A
  1063.                 LD (HL),A
  1064.                 ADD A,A
  1065.                 LD H,HIGH (BUF_DIRCEP+CPU2)
  1066.                 LD L,A
  1067.                 LD A,(HL)
  1068.                 INC L
  1069.                 LD H,(HL)
  1070.                 LD L,A
  1071.                 JR ENT_DI1
  1072.  
  1073. ENT_DI2         LD HL,TEK_LEV
  1074.                 LD A,(HL)
  1075.                 INC A
  1076.                 CP 0X10
  1077.                 EXX
  1078.                 RET Z
  1079.                 EXX
  1080.                 LD (HL),A
  1081.                 DEC A
  1082.                 ADD A,A
  1083.                 LD H,HIGH (BUF_DIRCEP+CPU2)
  1084.                 LD L,A
  1085.                 LD BC,(TEK_ZAP)
  1086.                 LD (HL),C
  1087.                 INC L
  1088.                 LD (HL),B
  1089. ENT_DI1         EXX
  1090.                 PUSH DE
  1091.                 LD DE,0X14
  1092.                 ADD HL,DE
  1093.                 LD C,(HL)
  1094.                 INC HL
  1095.                 LD B,(HL)
  1096.                 LD E,5
  1097.                 ADD HL,DE
  1098.                 LD E,(HL)
  1099.                 INC HL
  1100.                 LD D,(HL)
  1101.                 LD A,B
  1102.                 OR C
  1103.                 OR D
  1104.                 OR E
  1105.                 JR NZ,ENT_DI0
  1106.                 LD DE,(ROOTCLS)
  1107.                 LD BC,(ROOTCLS+2)
  1108. ENT_DI0         LD (TEK_DIR),DE
  1109.                 LD (TEK_DIR+2),BC
  1110.                 POP DE
  1111. INIT_TEKDIR     PUSH DE
  1112.                 PUSH IY
  1113.                 LD IYL,INTERNAL
  1114.                 CALL INIRTSC
  1115.                 POP IY
  1116.                 POP DE
  1117.                 RET
  1118.  
  1119. ;ОТДАЧА КОРОТКОГО ИМЕНИ ФАЙЛА, ЕСЛИ ДЛИННОЕ ОТСУСТВУЕТ
  1120. NO_LNG          POP DE
  1121.                 LD BC,8
  1122.                 LDIR
  1123.                 EX DE,HL
  1124. NO_LNG2         DEC HL
  1125.                 LD A,(HL)
  1126.                 CP " "
  1127.                 JR Z,NO_LNG2
  1128.                 INC HL
  1129.                 LD A,(DE)
  1130.                 EX DE,HL
  1131.                 CP " "
  1132.                 JR Z,NO_LNG1
  1133.                 EX DE,HL
  1134.                 LD (HL),"."
  1135.                 INC HL
  1136.                 EX DE,HL
  1137.                 LDI
  1138.                 LDI
  1139.                 LDI
  1140. NO_LNG1         EX DE,HL
  1141.                 LD (HL),0
  1142.                 LD A,L
  1143.                 LD (RREG_A),A
  1144.                 POP HL
  1145.                 RET
  1146.  
  1147. GETLNG8         POP IY
  1148.                 LD DE,CPU2
  1149.                 ADD HL,DE
  1150.                 LD DE,(RREG_L)
  1151.                 LD BC,0X100
  1152.                 JP LDIR_BYTES
  1153.  
  1154. ;ОТДАЧА ДЛИННОГО ИМЕНИ ФАЙЛА
  1155. GET_LONGNAME    LD A,IYL
  1156.                 AND A
  1157.                 JR NZ,GETLNG9
  1158.                 PUSH IY
  1159.                 LD IYL,INTERNAL
  1160.                 LD HL,GETLNG8
  1161.                 PUSH HL
  1162.                 LD HL,BUF_256
  1163. GETLNG9         PUSH HL
  1164.                 PUSH HL
  1165.                 CALL READ_DIR
  1166.                 BIT 0,E
  1167.                 JR Z,NO_LNG
  1168.                 EXX
  1169.                 LD C,0
  1170.                 EXX
  1171. GETLNG2         DEC BC
  1172.                 CALL GETRZAP
  1173.                 LD A,(HL)
  1174.                 INC HL
  1175.                 EXX
  1176.                 BIT 6,C
  1177.                 POP HL
  1178.                 JR NZ,GETLNGE+1
  1179.                 LD C,A
  1180.                 EXX
  1181.                 LD A,5
  1182.                 CALL GETLNG1
  1183.                 AND A
  1184.                 JR Z,GETLNGE
  1185.                 INC HL
  1186.                 INC HL
  1187.                 INC HL
  1188.                 LD A,6
  1189.                 CALL GETLNG1
  1190.                 AND A
  1191.                 JR Z,GETLNGE
  1192.                 INC HL
  1193.                 INC HL
  1194.                 LD A,2
  1195.                 CALL GETLNG1
  1196.                 AND A
  1197.                 JR Z,GETLNGE
  1198.                 EXX
  1199.                 PUSH HL
  1200.                 EXX
  1201.                 JR GETLNG2
  1202.  
  1203. GETLNGE         EXX
  1204.                 LD (HL),0
  1205.                 LD A,L
  1206.                 LD (RREG_A),A
  1207.                 EXX
  1208.                 POP HL
  1209.                 RET
  1210.  
  1211. GETLNG1         EXX
  1212.                 LD B,A
  1213.                 EXX
  1214.                 LD D,(HL)
  1215.                 INC HL
  1216.                 LD E,(HL)
  1217.                 INC HL
  1218.                 LD A,D
  1219.                 OR E
  1220.                 RET Z
  1221.                 LD A,E
  1222.                 AND A
  1223.                 JR NZ,GETLNG3
  1224.                 LD A,D
  1225.                 CP 0X80
  1226.                 JR C,GETLNG5
  1227.                 LD D,0X5F
  1228.                 JR GETLNG5
  1229.  
  1230. GETLNG3         CP 4
  1231.                 LD A,0X5F
  1232.                 JR NZ,GETLNG5
  1233.                 LD A,D
  1234.                 LD E,0XEF
  1235.                 LD D,0X5F
  1236.                 CP 1
  1237.                 JR Z,GETLNG4
  1238.                 LD E,0XA0
  1239.                 CP 0X51
  1240.                 JR Z,GETLNG4
  1241.                 SUB 0X10
  1242.                 LD E,0X80
  1243.                 JR NC,GETLNG6
  1244.                 LD A,D
  1245.                 JR GETLNG5
  1246.  
  1247. GETLNG6         CP 0X30
  1248.                 JR C,GETLNG4
  1249.                 LD E,0XB0
  1250.                 CP 0X40
  1251.                 JR C,GETLNG4
  1252.                 LD A,D
  1253.                 JR GETLNG5
  1254.  
  1255. GETLNG4         ADD A,E
  1256. GETLNG5         EXX
  1257.                 LD (HL),A
  1258.                 INC HL
  1259.                 DEC B
  1260.                 EXX
  1261.                 RET Z
  1262.                 JR GETLNG1+3
  1263. ;401,410-44F,451
  1264.  
  1265. ;НА ВХОДЕ:   DE=СПИСОК РАСШИРЕНИЙ
  1266. ;            HL=АДРЕС ОПИСАТЕЛЯ ФАЙЛА
  1267. ;НА ВЫХОДЕ:  A=НОМЕР РАСШИРЕНИЯ
  1268. CP_EXT          LD C,0
  1269. CPETR2          LD A,(DE)
  1270.                 AND A
  1271.                 JR Z,CPETR1
  1272.                 INC C
  1273.                 PUSH DE
  1274.                 PUSH HL
  1275.                 CALL COMPARF
  1276.                 POP HL
  1277.                 POP DE
  1278.                 LD A,C
  1279.                 RET Z
  1280.                 INC DE
  1281.                 INC DE
  1282.                 INC DE
  1283.                 JR CPETR2
  1284.  
  1285. CPETR1          DEC A
  1286.                 RET
  1287.  
  1288. COMPARF         PUSH DE
  1289.                 LD DE,8
  1290.                 ADD HL,DE
  1291.                 POP DE
  1292. COMPARF1        LD A,(DE)
  1293.                 CP (HL)
  1294.                 RET NZ
  1295.                 INC HL
  1296.                 INC DE
  1297.                 LD A,(DE)
  1298.                 CP (HL)
  1299.                 RET NZ
  1300.                 INC HL
  1301.                 INC DE
  1302.                 LD A,(DE)
  1303.                 CP (HL)
  1304.                 RET
  1305.  
  1306. FIND_FILEITEM   PUSH IY
  1307.                 LD IYL,INTERNAL
  1308.                 CALL INIRTSC
  1309.                 LD BC,WIN_P3
  1310.                 LD A,PAGE_TEMP
  1311.                 OUT (C),A
  1312.                 LD HL,0
  1313.                 LD (KOLFIND),HL                 ;НАЙДЕННЫХ ФАЙЛОВ
  1314.                 LD HL,CPU3
  1315.                 LD (ADR_SKLAD),HL               ;АДРЕС СКЛАДИРОВАНИЯ
  1316.                 LD HL,CPU3+0X1000
  1317.                 LD (ADR_SKLAD_NAME),HL          ;АДРЕС СКЛАДИРОВАНИЯ ПЕРВЫХ 2-Х СИМВОЛОВ ИМЕНИ НАЙДЕННОГО
  1318.                 CALL READ_DIR                   ;ПОЛУЧЕНИЕ ОПИСАТЕЛЯ
  1319. FINDF2          LD A,(HL)
  1320.                 AND A
  1321.                 JR Z,FINDF3
  1322.                 CP 0XE5                         ;ЕСЛИ УДАЛЕНО
  1323.                 JR Z,FINDF2                     ;ТО ПЕРЕХОДИМ НА СЛЕДУЮЩИЙ ОПИСАТЕЛЬ
  1324.                 LD DE,0X0B                      ;НУЖЕН ФЛАГОВЫЙ БАЙТ ОПИСАТЕЛЯ
  1325.                 ADD HL,DE                       ;ПОЛУЧИЛИ АДРЕС ФЛАГОВОГО БАЙТА
  1326.                 LD A,(HL)                       ;ВЗЯЛИ ФЛАГОВЫЙ БАЙТ
  1327.                 SBC HL,DE
  1328.                 AND 0X10                        ;ПРОВЕРКА ЭТО ФАЙЛ ИЛИ ДИРА
  1329.                 JR NZ,FINDF1
  1330.                 LD A,(EXT4FOUND)
  1331.                 AND A
  1332.                 PUSH DE
  1333.                 LD DE,EXT4FOUND
  1334.                 PUSH BC
  1335.                 CALL NZ,CP_EXT
  1336.                 POP BC
  1337.                 POP DE
  1338.                 JR NZ,FINDF4
  1339. FINDF1          EX DE,HL
  1340.                 ADD HL,DE
  1341.                 LD A,(HL)
  1342.                 EX AF,AF'
  1343.                 LD HL,(ADR_SKLAD)               ;ДЛЯ ДИРЫ ПРОВЕРЯТЬ БОЛЬШЕ НЕ НАДО
  1344.                 LD (HL),C
  1345.                 INC HL
  1346.                 LD (HL),B                       ;ПОЛОЖИЛИ НОМЕР ДИРЫ В ТАБЛИЧКУ
  1347.                 INC HL
  1348.                 LD (ADR_SKLAD),HL
  1349.                 LD HL,(KOLFIND)
  1350.                 INC HL                          ;+1 НАЙДЕННЫХ ФАЙЛОВ
  1351.                 LD (KOLFIND),HL
  1352.                 LD HL,(ADR_SKLAD_NAME)
  1353.                 EX AF,AF'
  1354.                 LD (HL),A
  1355.                 INC HL
  1356.                 LD A,(DE)
  1357.                 LD (HL),A
  1358.                 INC HL
  1359.                 LD (ADR_SKLAD_NAME),HL
  1360. FINDF4          CALL NXTLEGZ
  1361.                 LD A,(ADR_SKLAD+1)
  1362.                 CP HIGH (CPU3)+0X10
  1363.                 JR C,FINDF2                     ;НЕ БОЛЕЕ 2048 ДИРОВ/ФАЙЛОВ В ТЕКУЩЕЙ ДИРЕКТОРИИ
  1364. FINDF3          LD HL,(KOLFIND)
  1365.                 POP IY
  1366.                 LD A,IYL
  1367.                 AND A
  1368.                 JR NZ,FINDF5
  1369.                 LD A,PAGE_TEMP
  1370.                 LD (RREG_A),A
  1371.                 LD (RREG_C),HL
  1372. FINDF5          LD (KOL_FOUNDED),HL
  1373.                 LD B,H
  1374.                 LD C,L
  1375.                 XOR A
  1376.                 RET
  1377.  
  1378. SET_MASK_EXT    LD A,(RREG_A)
  1379.                 AND A
  1380.                 JR NZ,SET_MASK_EXT1
  1381.                 LD (EXT4FOUND),A
  1382.                 RET
  1383.  
  1384. SET_MASK_EXT1   LD HL,(RREG_L)
  1385.                 LD DE,BUF_256-CPU2
  1386.                 LD BC,0X10*3+1
  1387.                 CALL LDIR_BYTES
  1388.                 LD HL,BUF_256
  1389.                 LD DE,EXT4FOUND
  1390.                 LD BC,0X10FF
  1391. SET_MASK_EXT2   LD A,(HL)
  1392.                 AND A
  1393.                 JR Z,SET_MASK_EXT3
  1394.                 LDI
  1395.                 LDI
  1396.                 LDI
  1397.                 DJNZ SET_MASK_EXT2
  1398. SET_MASK_EXT3   XOR A
  1399.                 LD (DE),A
  1400.                 RET
  1401.  
  1402. LD_FILE6        PUSH AF
  1403.                 POP HL
  1404.                 LD (RREG_F),HL
  1405. LD_FILE8        EXX
  1406.                 LD (SAVE_IY),DE         ;IY
  1407.                 EXX
  1408.                 RET
  1409.  
  1410. ;IXL-L-КОЛИЧЕСТВО СЕКТОРОВ ДЛЯ ЗАГРУЗКИ
  1411. ;IXH-H-РАЗМЕР КЛАСТЕРА
  1412. ;IYL-E-
  1413. ;IYH-D-СМЕЩЕНИЕ В КЛАСТЕРЕ
  1414. READ_FILE       EX AF,AF'
  1415.                 LD A,IYL
  1416.                 DEC A
  1417.                 JR Z,LD_FILE00
  1418.                 LD IYL,INT4EXT
  1419.                 LD HL,LD_FILE6
  1420.                 PUSH HL
  1421.                 LD HL,(RREG_L)                  ;АДРЕС ЗАГРУЗКИ
  1422.                 EXX
  1423.                 LD DE,(SAVE_IY)                 ;СМЕЩЕНИЕ В КЛАСТЕРЕ
  1424.                 LD A,(BYTSSEC)
  1425.                 LD H,A                          ;КОЛИЧЕСТВО СЕКТОРОВ В КЛАСТЕРЕ
  1426.                 LD A,(RREG_A)
  1427.                 LD L,A                          ;КОЛИЧЕСТВО СЕКТОРОВ ДЛЯ ЗАГРУЗКИ
  1428.                 EXX
  1429.                 JR LD_FILE0
  1430.  
  1431. LD_FILE00       EXX
  1432.                 LD DE,(SAVE_IY)                 ;СМЕЩЕНИЕ В КЛАСТЕРЕ
  1433.                 LD HL,LD_FILE8
  1434.                 PUSH HL
  1435.                 LD A,(BYTSSEC)                  ;КОЛИЧЕСТВО СЕКТОРВ В КЛАСТЕРЕ
  1436.                 LD H,A                          ;КОЛИЧЕСТВО СЕКТОРОВ В КЛАСТЕРЕ
  1437.                 EX AF,AF'
  1438.                 LD L,A                          ;КОЛИЧЕСТВО СЕКТОРОВ ДЛЯ ЗАГРУЗКИ
  1439.                 EXX
  1440. ;IXL-L-КОЛИЧЕСТВО СЕКТОРОВ ДЛЯ ЗАГРУЗКИ
  1441. ;IXH-H-РАЗМЕР КЛАСТЕРА
  1442. ;IYL-E-
  1443. ;IYH-D-СМЕЩЕНИЕ В КЛАСТЕРЕ
  1444. LD_FILE0        LD DE,(AFILCLS)
  1445.                 LD BC,(AFILCLS+2)               ;ТЕКУЩИЙ НОМЕР КЛАСТЕРА
  1446.                 PUSH BC
  1447.                 PUSH DE
  1448.                 PUSH HL
  1449.                 CALL REALSEC                    ;ПЕРЕВЕЛИ НОМЕР КЛАСТЕРА В НОМЕР СЕКТОРА
  1450.                 EXX
  1451.                 LD A,D                  ;IYH
  1452.                 EXX
  1453.                 LD L,A
  1454.                 LD H,0
  1455.                 ADD HL,DE
  1456.                 EX DE,HL
  1457.                 JR NC,LD_FILE1
  1458.                 INC BC                          ;BCDE=НОМЕР СЕКТОРА ОТКУДА ГРУЗИТЬ
  1459. LD_FILE1        EXX
  1460.                 LD A,L                  ;IXL
  1461.                 CP H                    ;IXH
  1462.                 JP C,LD_FILE2
  1463.                 LD A,H                  ;IXH
  1464. LD_FILE2        ADD A,D                 ;IYH
  1465.                 CP H                    ;IXH
  1466.                 LD A,L                  ;IXL
  1467.                 JP C,LD_FILE5
  1468.                 LD A,H                  ;IXH
  1469.                 SUB D                   ;IYH
  1470. LD_FILE5        LD E,A                  ;IYL,A  ;СКОЛЬКО СЕКТОРОВ СЕЙЧАС ГРУЗИМ
  1471.                 EXX
  1472.                 POP HL                          ;ВОССТАНОВИЛИ АДРЕС ЗАГРУЗКИ
  1473. ;               LD IYL,INT4EXT
  1474.                 CALL TO_DRV
  1475.                 DB _DEV_READ
  1476.                 LD A,IYL
  1477.                 DEC A
  1478.                 JR Z,LD_FILE7
  1479.                 LD (RREG_L),HL
  1480. LD_FILE7        POP DE
  1481.                 POP BC                          ;ВОССТАНОВИЛИ НОМЕР КЛАСТЕРА
  1482.                 EXX
  1483.                 LD A,D                  ;IYH
  1484.                 ADD A,E                 ;IYL
  1485.                 CP H                    ;IXH
  1486.                 JP C,LD_FILE3
  1487.                 SUB H                   ;IXH
  1488. LD_FILE3        LD D,A                  ;IYH,A
  1489.                 EXX
  1490.                 JP C,LD_FILE4
  1491.                 PUSH HL                         ;СОХРАНИЛИ АДРЕС ЗАГРУЗКИ
  1492.                 PUSH IY
  1493.                 LD IYL,INTERNAL
  1494.                 CALL RDFATZP                    ;ПРОЧИТАЛИ НОМЕР СЛЕДУЮЩЕГО КЛАСТЕРА
  1495.                 POP IY
  1496.                 LD (AFILCLS),DE
  1497.                 LD (AFILCLS+2),BC
  1498.                 CALL LST_CLS                    ;ПРОВЕРИЛИ, А МОЖЕТ ЭТО ПОСЛЕДНИЙ КЛАСТЕР?
  1499.                 POP HL                          ;ВОССТАНОВИЛИ АДРЕС ЗАГРУЗКИ
  1500.                 RET C                           ;ЕСЛИ ПОСЛЕДНИЙ, ВЫХОДИМ
  1501. LD_FILE4        EXX
  1502.                 LD A,L                  ;IXL
  1503.                 SUB E                   ;IYL
  1504.                 EXX
  1505.                 RET Z
  1506.                 EXX
  1507.                 LD L,A                  ;IXL,A
  1508.                 EXX
  1509.                 JP NZ,LD_FILE0
  1510.                 RET
  1511.  
  1512. OPEN_FILE       LD A,IYL
  1513.                 AND A
  1514.                 JR NZ,OPENFILE1
  1515.                 LD HL,EOPEN_FILE
  1516.                 PUSH HL
  1517. OPENFILE1       PUSH IY
  1518.                 LD IYL,INTERNAL
  1519.                 CALL READ_DIR
  1520.                 LD DE,FILE_SRC
  1521.                 LD BC,0X20
  1522.                 PUSH DE
  1523.                 LDIR
  1524.                 LD HL,(FILE_SRC+0X14)
  1525.                 LD (AFILCLS+2),HL
  1526.                 LD HL,(FILE_SRC+0X1A)
  1527.                 LD (AFILCLS),HL
  1528.                 LD HL,(TEK_ZAP)
  1529.                 LD (NUM_FILE_SRC),HL
  1530.                 XOR A
  1531.                 LD H,A
  1532.                 LD L,A
  1533.                 LD (SAVE_IY),HL
  1534.                 POP HL
  1535.                 POP IY
  1536.                 RET
  1537.  
  1538. EOPEN_FILE      PUSH AF
  1539.                 POP HL
  1540.                 LD (RREG_F),HL
  1541.                 RET
  1542.  
  1543. EFINDNAME       LD HL,(TEK_ZAP)
  1544.                 LD (RREG_C),HL
  1545.                 PUSH AF
  1546.                 POP HL
  1547.                 LD (RREG_F),HL
  1548.                 RET
  1549.  
  1550. FIND_NAME       LD A,IYL
  1551.                 AND A
  1552.                 JR NZ,FINDNAME01
  1553.                 PUSH HL
  1554.                 LD HL,(RREG_L)
  1555.                 LD DE,BUF_256-CPU2
  1556.                 LD BC,0X10
  1557.                 CALL LDIR_BYTES
  1558.                 LD HL,EFINDNAME
  1559.                 EX (SP),HL
  1560. FINDNAME01      PUSH IY
  1561.                 LD IYL,INTERNAL
  1562.                 LD HL,BUF_256
  1563.                 LD DE,FB_EXT
  1564.                 LD BC,0X8FF
  1565.                 LD A,(HL)
  1566.                 CP "."
  1567.                 JR NZ,FINDNAME02
  1568.                 LDI
  1569.                 LDI
  1570.                 LD B,6
  1571. FINDNAME02      LD A,(HL)
  1572.                 CP "!"
  1573.                 JR C,FINDNAME03
  1574.                 CP "."
  1575.                 JR Z,FINDNAME12
  1576.                 LDI
  1577.                 DJNZ FINDNAME02
  1578.                 LD A,(HL)
  1579.                 CP "!"
  1580.                 JR C,FINDNAME06
  1581.                 INC HL
  1582.                 JR FINDNAME06
  1583.  
  1584. FINDNAME12      INC HL
  1585. FINDNAME03      LD A," "
  1586. FINDNAME05      LD (DE),A
  1587.                 INC DE
  1588.                 DJNZ FINDNAME05
  1589. FINDNAME06      LD B,3
  1590. FINDNAME08      LD A,(HL)
  1591.                 CP "!"
  1592.                 JR C,FINDNAME07
  1593.                 LDI
  1594.                 DJNZ FINDNAME08
  1595.                 CALL POSTF02
  1596.                 JR FINDNAME11
  1597.  
  1598. FINDNAME07      LD A," "
  1599. FINDNAME09      LD (DE),A
  1600.                 INC DE
  1601.                 DJNZ FINDNAME09
  1602.                 CALL POSTF02
  1603.                 JR FINDNAME11
  1604.  
  1605. FINDNAME10      CALL NXTLEGZ
  1606. FINDNAME11      PUSH HL
  1607.                 CALL CMP_NAME
  1608.                 POP HL
  1609.                 JR Z,FINDNAME13
  1610.                 LD A,(HL)
  1611.                 AND A
  1612.                 JR NZ,FINDNAME10
  1613.                 SCF
  1614. FINDNAME13      POP IY
  1615.                 RET
  1616.  
  1617. CMP_NAME        LD DE,FB_EXT
  1618. ICMP_NAME       LD B,0X0B
  1619. CMP_NAME_B      LD A,(DE)
  1620.                 CP "a"
  1621.                 JR C,CMPNAME01
  1622.                 CP "{"
  1623.                 JR NC,CMPNAME01
  1624.                 AND 0XDF
  1625. CMPNAME01       CP (HL)
  1626.                 RET NZ
  1627.                 INC DE
  1628.                 INC HL
  1629.                 DJNZ CMP_NAME_B
  1630.                 XOR A
  1631.                 RET
  1632.