Subversion Repositories pentevo

Rev

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

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