Subversion Repositories pentevo

Rev

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

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