Subversion Repositories pentevo

Rev

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

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