Subversion Repositories pentevo

Rev

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

  1.  
  2. ; LAST UPDATE: 15.06.2022 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.                 ADC HL,BC
  121.                 LD (NumSecFAT1 + 2),HL
  122.                 LD HL,0
  123.                 LD DE,(BUF_512 + _BPB_FATSz16)
  124.                 LD A,D
  125.                 OR E
  126.                 JR NZ,RDFAT01                   ; если не FAT12/16 (_BPB_FATSz16 == 0)
  127.                 LD DE,(BUF_512 + _BPB_FATSz32)
  128.                 LD HL,(BUF_512 + _BPB_FATSz32 + 2)      ; ТО БЕРЕМ ИЗ СМЕЩЕНИЯ +36
  129. RDFAT01         LD (FATSize),DE
  130.                 LD (FATSize + 2),HL             ;ЧИСЛО СЕКТОРОВ НА FAT-ТАБЛИЦУ
  131.  
  132.                 LD HL,0
  133.                 LD DE,(BUF_512 + _BPB_TotSec16)
  134.                 LD A,D
  135.                 OR E
  136.                 JR NZ,.L1                       ;ЕСЛИ НЕ FAT12/16 (BPB_TOTSEC16=0)
  137.                 LD DE,(BUF_512 + _BPB_TotSec32)
  138.                 LD HL,(BUF_512 + _BPB_TotSec32+2)
  139.                                                 ;ТО БЕРЕМ ИЗ СМЕЩЕНИЯ +32
  140. .L1             LD (NumsSectorsVol + 2),HL
  141.                 LD (NumsSectorsVol),DE          ;К-ВО СЕКТОРОВ НА ДИСКЕ/РАЗДЕЛЕ
  142.  
  143. ; вычисляем ROOTDIRSECTORS
  144.                 LD DE,(BUF_512 + _BPB_RootEntCnt)
  145.                 LD BC,0
  146.                 LD A,D
  147.                 OR E
  148.                 JR Z,RDFAT03
  149.                 LD A,0X10
  150.                 CALL BCDE_A
  151.  
  152. ;ЭТО РЕАЛИЗОВАНА ФОРМУЛА
  153. ;ROOTDIRSECTORS=((BPB_ROOTENTCNT*32)++(BPB_BYTSPERSEC-1))/BPB_BYTSPERSEC
  154. ;В HL ROOTDIRSECTORS. ЕСЛИ FAT32, ТО HL=0 ВСЕГДА
  155.  
  156. RDFAT03         PUSH DE                         ;ROOTDIRSECTORS
  157.                 LD HL,NumSecFAT1
  158.                 CALL LOADZP
  159.                 LD A,(BUF_512 + _BPB_NumFATs)
  160.                 LD (NumFATs),A
  161.                 DEC A
  162.                 JR Z,.L1
  163.                 LD HL,FATSize
  164.                 CALL BCDEHLP
  165.                 LD (NumSecFAT2),DE
  166.                 LD (NumSecFAT2 + 2),BC
  167. .L1             LD HL,FATSize
  168.                 CALL BCDEHLP
  169.                 LD (NumSecRootDir),DE
  170.                 LD (NumSecRootDir + 2),BC
  171.                 POP HL
  172. ; добавляем размер ROOTDIR
  173.                 ADD HL,DE
  174.                 EX DE,HL
  175.                 LD HL,0
  176.                 ADC HL,BC
  177.                 LD B,H
  178.                 LD C,L
  179.                 LD (FirstSecData),DE
  180.                 LD (FirstSecData + 2),BC
  181.                 LD HL,NumsSectorsVol
  182.                 CALL BCDEHLM
  183.                 LD A,(SecPerClus)
  184.                 CALL BCDE_A
  185.                 LD (NumsClustersVol),DE
  186.                 LD (NumsClustersVol + 2),BC
  187.  
  188.                 LD A,(FATType)
  189.                 CP 0XFF
  190.                 JR NZ,RDFAT04
  191. ; определение типа FAT при отсуствии MBR
  192.                 LD DE,(FATSize - 1)
  193.                 LD BC,(FATSize + 1)
  194.                 LD E,0                          ; BCDE = количество секторов * 0x100
  195.                 PUSH BC
  196.                 PUSH DE                         ; сохранили
  197.                 SRL B
  198.                 RR C
  199.                 RR D
  200.                 RR E                            ; BCDE = количество секторов * 0x80
  201.                 LD HL,NumsClustersVol           ; количество кластеров на FAT
  202.                 PUSH HL                         ; сохранили
  203.                 CALL HLBCDEM                    ; количество кластеров - (количество секторов * 0x80)
  204.                 LD A,E
  205.                 AND 0X7F                        ; количество менее 128 кластеров в секторе для FAT32
  206.                 OR D
  207.                 OR C
  208.                 OR B
  209.                 LD A,2                          ; FAT32
  210.                 POP HL
  211.                 POP DE
  212.                 POP BC
  213.                 JR Z,RDFAT04                    ; FAT32 если флаг Z=0
  214.                 CALL HLBCDEM                    ; количество кластеров - (количество секторов * 0x100)
  215.                 LD A,D
  216.                 OR C
  217.                 OR B
  218.                 LD A,1                          ; FAT16
  219.                 JR Z,RDFAT04                    ; FAT16 если флаг Z=0
  220.                 XOR A                           ; иначе FAT12
  221.                 LD (FATType),A
  222.  
  223. ; для FAT12/16 ROOT кластер = 0
  224. ; для FAT32 берем по смещению +44
  225. ; На выходе: BCDE - СЕКТОР ROOTDIR КЛАСТЕР
  226. RDFAT04         XOR A
  227.                 LD (TEK_LEV),A
  228.                 LD (BUF_PATH),A
  229.                 CALL INIT_PATH
  230.                 LD A,(FATType)
  231.                 AND A
  232.                 LD DE,0
  233.                 LD B,D
  234.                 LD C,E
  235.                 JR Z,.L1                        ;FAT12-NONE
  236.                 DEC A
  237.                 JR Z,.L1                        ;FAT16
  238.                 LD DE,(BUF_512 + _BPB_RootClus)
  239.                 LD BC,(BUF_512 + _BPB_RootClus + 2)     ;FAT32
  240. .L1             LD (CurrentDIRCluster),DE
  241.                 LD (CurrentDIRCluster + 2),BC   ; номер текущего кластера
  242.                 LD (RootDIRCluster),DE
  243.                 LD (RootDIRCluster + 2),BC      ; номер корневого кластера
  244.                 RET
  245.  
  246. ; проверка 0 сектора раздела
  247. VALID_BOOTSEC   LD HL,(BUF_512 + _BPB_BytsPerSec)
  248.                 LD A,H
  249.                 SUB 2
  250.                 OR L
  251.                 JR NZ,VALID_BOOTSEC1
  252.                 LD HL,(BUF_512 + _BPB_SecPerClus)
  253.                 OR L
  254.                 JR Z,VALID_BOOTSEC1
  255.                 NEG
  256.                 AND L
  257.                 CP L
  258.                 JR NZ,VALID_BOOTSEC1
  259.                 LD A,(BUF_512 + _BPB_NumFATs)
  260.                 DEC A
  261.                 CP 7
  262.                 JR NC,VALID_BOOTSEC1
  263.                 XOR A
  264.                 RET
  265.  
  266. ;2A72200-2A54200=1E000  120945-120611
  267. ;2A90200
  268.  
  269. VALID_BOOTSEC1  OR IXH
  270.                 RET
  271.  
  272. ; формирование таблицы кластеров DIR
  273. ; и поиск первой "легальной" записи в DIR
  274. INIRTSC         PUSH AF
  275.                 LD HL,0xFFFF
  276.                 LD (NumSec2Buf + 2),HL
  277.                 LD HL,BUF_TDIRCLS
  278.                 LD DE,(CurrentDIRCluster)
  279.                 LD BC,(CurrentDIRCluster + 2)
  280.                 CALL SAVEZP
  281.                 LD A,D
  282.                 OR E
  283.                 OR B
  284.                 OR C
  285.                 JR Z,LASTCLS
  286. NEXTCLS         PUSH HL
  287.                 CALL RDFATZP
  288.                 CALL LST_CLS
  289.                 POP HL
  290.                 JR C,LASTCLS
  291.                 CALL SAVEZP
  292.                 JR NEXTCLS
  293.  
  294. LASTCLS         LD BC,0xFFFF
  295.                 CALL SAVEZP
  296.                 CALL POSTF02
  297.                 POP AF
  298.                 RET
  299.  
  300. ;ЧТЕНИЕ СЛЕДУЮЩЕГО НОМЕРА КЛАСТЕРА
  301. RDFATZP         LD A,(FATType)
  302.                 AND A
  303.                 JR Z,RDFATS0
  304.                 DEC A
  305.                 JR Z,RDFATS1
  306.                 EX DE,HL
  307.                 ADD HL,HL
  308.                 EX DE,HL
  309.                 LD HL,0
  310.                 ADC HL,BC
  311.                 ADD HL,BC               ; HLDE = BCDE * 2
  312.                 LD A,E
  313.                 LD E,D
  314.                 LD D,L
  315.                 LD C,H
  316.                 LD B,0
  317.                 CALL RDFATS2
  318.                 INC HL
  319.                 LD C,(HL)
  320.                 INC HL
  321.                 LD B,(HL)
  322.                 RET
  323.  
  324. RDFATS1         LD BC,0
  325.                 LD A,E
  326.                 LD E,D
  327.                 LD D,C
  328. RDFATS2         PUSH AF
  329.                 PUSH BC
  330.                 LD HL,NumSecFAT1
  331.                 CALL BCDEHLP
  332.                 CALL LOADLST
  333.                 POP BC
  334.                 POP AF
  335.                 LD E,A
  336.                 LD D,0
  337.                 ADD HL,DE
  338.                 ADD HL,DE
  339.                 LD E,(HL)
  340.                 INC HL
  341.                 LD D,(HL)
  342.                 RET
  343.  
  344. RDFATS0         LD H,D
  345.                 LD L,E
  346.                 ADD HL,HL
  347.                 ADD HL,DE
  348.                 SRL H
  349.                 RR L
  350.                 LD A,E
  351.                 LD E,H
  352.                 LD D,0
  353.                 LD B,D
  354.                 LD C,D
  355.                 SRL E
  356.                 PUSH AF
  357.                 PUSH HL
  358.                 LD DE,(NumSecFAT1)
  359.                 LD BC,(NumSecFAT1 + 2)
  360.                 CALL LOADLST
  361.                 POP BC
  362.                 LD A,B
  363.                 AND 1
  364.                 LD B,A
  365.                 ADD HL,BC
  366.                 LD B,(HL)
  367.                 INC HL
  368.                 LD A,H
  369.                 CP HIGH (BUF_512)+2
  370.                 JR NZ,RDFATS4
  371.                 PUSH BC
  372.                 LD BC,0
  373.                 INC DE
  374.                 CALL LOADLST
  375.                 POP BC
  376. RDFATS4         POP AF
  377.                 LD D,(HL)
  378.                 LD E,B
  379.                 LD BC,0
  380.                 RRA
  381.                 JR NC,RDFATS3
  382.         REPT 4
  383.                 SRL D
  384.                 RR E
  385.         ENDM
  386. RDFATS3         LD A,D
  387.                 AND 0X0F
  388.                 LD D,A
  389.                 RET
  390.  
  391. ; вычисление номера реального сектора
  392. ; На входе: BCDE = номер кластера FAT
  393. ; На выходе: BCDE = номер сектора
  394. REALSEC         LD A,B
  395.                 OR C
  396.                 OR D
  397.                 OR E
  398.                 JR NZ,REALSE1
  399.                 LD DE,(NumSecRootDir)
  400.                 LD BC,(NumSecRootDir + 2)
  401.                 RET
  402.  
  403. REALSE1         LD HL,0XFFFE
  404.                 EX DE,HL
  405.                 ADD HL,DE
  406.                 EX DE,HL
  407.                 INC HL
  408.                 ADC HL,BC                       ;НОМЕР КЛАСТЕРА-2
  409.                 LD A,(SecPerClus)
  410.                 JR REALSE2
  411.  
  412. REALSE3         SLA E
  413.                 RL D
  414.                 RL L
  415.                 RL H
  416. REALSE2         RRCA
  417.                 JR NC,REALSE3                   ;УМНОЖИЛИ НА РАЗМЕР КЛАСТЕРА
  418.                 LD B,H
  419.                 LD C,L
  420.                 LD HL,FirstSecData
  421.                 JP BCDEHLP                      ;ПРИБАВИЛИ СМЕЩЕНИЕ ОТ НАЧАЛА РАЗДЕЛА
  422.  
  423. ;СОХРАНЯЕМ СЕКТОР ЗАГРУЖЕННЫЙ В БУФЕР
  424. LSTSAVE         LD DE,(NumSec2Buf)
  425.                 LD BC,(NumSec2Buf + 2)
  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 (NumSec2Buf),DE
  441.                 LD (NumSec2Buf + 2),BC
  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,NumSec2Buf
  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,(FATType)                  ;ВЗЯЛИ ТИП 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,(SecPerClus)
  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. .L1             PUSH BC
  685.                 CALL PRVLEGZ
  686.                 POP BC
  687.                 DJNZ .L1
  688.                 RET
  689.  
  690. ;ПЕРЕМОТАТЬ НА "B" ФАЙЛОВ ВПЕРЕД
  691. POSTF04         LD A,B
  692.                 AND A
  693.                 RET Z
  694. .L1             PUSH BC
  695.                 CALL NXTLEGZ
  696.                 POP BC
  697.                 DJNZ .L1
  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,_DIR_StructSize
  708. .L4             LD A,(HL)
  709.                 CP "."
  710.                 JR NZ,.L5
  711.                 INC HL
  712.                 LD A,(HL)
  713.                 DEC HL
  714.                 CP "."
  715.                 JR Z,.L5
  716.                 INC BC
  717.                 ADD HL,DE
  718.                 JR .L4
  719.  
  720. .L1             INC BC
  721.                 ADD HL,DE
  722. .L5             LD A,H
  723.                 CP HIGH (BUF_512) + 2
  724.                 JR NZ,.L2
  725.                 CALL RDDIRSC
  726.                 LD D,0
  727.                 AND A
  728.                 JR Z,.L2
  729.                 CALL .L3
  730.                 DEC A
  731.                 RET
  732.  
  733. .L2             LD E,_DIR_Attr
  734.                 ADD HL,DE
  735.                 LD A,(HL)
  736.                 AND A
  737.                 SBC HL,DE
  738.                 LD E,_DIR_StructSize
  739.                 CP 0X0F                 ; длинное имя?
  740.                 JR Z,.L1
  741.                 CP 8                    ; имя раздела?
  742.                 JR Z,.L1
  743.                 LD A,(HL)
  744.                 CP 0XE5                 ; удаленный файл?
  745.                 JR Z,.L1
  746.                 AND A
  747.                 JR Z,.L3
  748.                 EXX
  749.                 INC BC
  750.                 EXX
  751.                 JR .L1
  752.  
  753. .L3             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. ;ОТДАЧА КОРОТКОГО ИМЕНИ ФАЙЛА, ЕСЛИ ДЛИННОЕ ОТСУСТВУЕТ
  1060. NO_LNG          POP DE
  1061.                 LD BC,8
  1062.                 LDIR
  1063.                 EX DE,HL
  1064. NO_LNG2         DEC HL
  1065.                 LD A,(HL)
  1066.                 CP " "
  1067.                 JR Z,NO_LNG2
  1068.                 INC HL
  1069.                 LD A,(DE)
  1070.                 EX DE,HL
  1071.                 CP " "
  1072.                 JR Z,NO_LNG1
  1073.                 EX DE,HL
  1074.                 LD (HL),"."
  1075.                 INC HL
  1076.                 EX DE,HL
  1077.                 LDI
  1078.                 LDI
  1079.                 LDI
  1080. NO_LNG1         EX DE,HL
  1081.                 LD (HL),0
  1082.                 LD A,L
  1083.                 LD (RREG_A),A
  1084.                 POP HL
  1085.                 RET
  1086.  
  1087. GETLNG8         POP IY
  1088.                 LD DE,CPU6
  1089.                 ADD HL,DE
  1090.                 LD DE,(RREG_L)
  1091.                 LD BC,0X100
  1092.                 JP LDIR_BYTES
  1093.  
  1094. ;ОТДАЧА ДЛИННОГО ИМЕНИ ФАЙЛА
  1095. GET_LONGNAME    LD A,IYL
  1096.                 AND A
  1097.                 JR NZ,GETLNG9
  1098.                 PUSH IY
  1099.                 LD IYL,INTERNAL
  1100.                 LD HL,GETLNG8
  1101.                 PUSH HL
  1102.                 LD HL,BUF_256
  1103. GETLNG9         PUSH HL
  1104.                 PUSH HL
  1105.                 CALL READ_DIR
  1106.                 BIT 0,E
  1107.                 JR Z,NO_LNG
  1108.                 EXX
  1109.                 LD C,0
  1110.                 EXX
  1111. GETLNG2         DEC BC
  1112.                 CALL GETRZAP
  1113.                 LD A,(HL)
  1114.                 INC HL
  1115.                 EXX
  1116.                 BIT 6,C
  1117.                 POP HL
  1118.                 JR NZ,GETLNGE + 1
  1119.                 LD C,A
  1120.                 EXX
  1121.                 LD A,5
  1122.                 CALL GETLNG1
  1123.                 AND A
  1124.                 JR Z,GETLNGE
  1125.                 INC HL
  1126.                 INC HL
  1127.                 INC HL
  1128.                 LD A,6
  1129.                 CALL GETLNG1
  1130.                 AND A
  1131.                 JR Z,GETLNGE
  1132.                 INC HL
  1133.                 INC HL
  1134.                 LD A,2
  1135.                 CALL GETLNG1
  1136.                 AND A
  1137.                 JR Z,GETLNGE
  1138.                 EXX
  1139.                 PUSH HL
  1140.                 EXX
  1141.                 JR GETLNG2
  1142.  
  1143. GETLNGE         EXX
  1144.                 LD (HL),0
  1145.                 LD A,L
  1146.                 LD (RREG_A),A
  1147.                 EXX
  1148.                 POP HL
  1149.                 RET
  1150.  
  1151. GETLNG1         EXX
  1152.                 LD B,A
  1153.                 EXX
  1154.                 LD D,(HL)
  1155.                 INC HL
  1156.                 LD E,(HL)
  1157.                 INC HL
  1158.                 LD A,D
  1159.                 OR E
  1160.                 RET Z
  1161.                 LD A,E
  1162.                 AND A
  1163.                 JR NZ,GETLNG3
  1164.                 LD A,D
  1165.                 CP 0X80
  1166.                 JR C,GETLNG5
  1167.                 LD D,0X5F
  1168.                 JR GETLNG5
  1169.  
  1170. GETLNG3         CP 4
  1171.                 LD A,0X5F
  1172.                 JR NZ,GETLNG5
  1173.                 LD A,D
  1174.                 LD E,0XEF
  1175.                 LD D,0X5F
  1176.                 CP 1
  1177.                 JR Z,GETLNG4
  1178.                 LD E,0XA0
  1179.                 CP 0X51
  1180.                 JR Z,GETLNG4
  1181.                 SUB 0X10
  1182.                 LD E,0X80
  1183.                 JR NC,GETLNG6
  1184.                 LD A,D
  1185.                 JR GETLNG5
  1186.  
  1187. GETLNG6         CP 0X30
  1188.                 JR C,GETLNG4
  1189.                 LD E,0XB0
  1190.                 CP 0X40
  1191.                 JR C,GETLNG4
  1192.                 LD A,D
  1193.                 JR GETLNG5
  1194.  
  1195. GETLNG4         ADD A,E
  1196. GETLNG5         EXX
  1197.                 LD (HL),A
  1198.                 INC HL
  1199.                 DEC B
  1200.                 EXX
  1201.                 RET Z
  1202.                 JR GETLNG1 + 3
  1203. ;401,410-44F,451
  1204.  
  1205. ;НА ВХОДЕ:   DE=СПИСОК РАСШИРЕНИЙ
  1206. ;            HL=АДРЕС ОПИСАТЕЛЯ ФАЙЛА
  1207. ;НА ВЫХОДЕ:  A=НОМЕР РАСШИРЕНИЯ
  1208. CP_EXT          LD C,0
  1209. CPETR2          LD A,(DE)
  1210.                 AND A
  1211.                 JR Z,CPETR1
  1212.                 INC C
  1213.                 PUSH DE
  1214.                 PUSH HL
  1215.                 CALL COMPARF
  1216.                 POP HL
  1217.                 POP DE
  1218.                 LD A,C
  1219.                 RET Z
  1220.                 INC DE
  1221.                 INC DE
  1222.                 INC DE
  1223.                 JR CPETR2
  1224.  
  1225. CPETR1          DEC A
  1226.                 RET
  1227.  
  1228. COMPARF         PUSH DE
  1229.                 LD DE,8
  1230.                 ADD HL,DE
  1231.                 POP DE
  1232. COMPARF1        LD A,(DE)
  1233.                 CP (HL)
  1234.                 RET NZ
  1235.                 INC HL
  1236.                 INC DE
  1237.                 LD A,(DE)
  1238.                 CP (HL)
  1239.                 RET NZ
  1240.                 INC HL
  1241.                 INC DE
  1242.                 LD A,(DE)
  1243.                 CP (HL)
  1244.                 RET
  1245.  
  1246. FIND_FILEITEM   PUSH IY
  1247.                 LD IYL,INTERNAL
  1248.                 CALL INIRTSC
  1249.                 EVOPORT WIN_P3,RAM_TEMP2
  1250.                 LD HL,CPU3
  1251.                 LD DE,CPU3+1
  1252.                 LD BC,0X3FFF
  1253.                 LD (HL),L
  1254.                 LDIR
  1255.                 LD HL,0
  1256.                 LD (KOLFIND),HL                 ;НАЙДЕННЫХ ФАЙЛОВ
  1257.                 LD HL,CPU3
  1258.                 LD (ADR_SKLAD),HL               ;АДРЕС СКЛАДИРОВАНИЯ
  1259.                 LD HL,CPU3+0X1000
  1260.                 LD (ADR_SKLAD_NAME),HL          ;АДРЕС СКЛАДИРОВАНИЯ ПЕРВОГО СИМВОЛА ИМЕНИ НАЙДЕННОГО И ЕГО ФЛАГА
  1261.                 LD BC,0XFFFF
  1262.                 EXX
  1263.                 LD BC,0
  1264.                 LD A,(TEK_LVL)
  1265.                 AND A
  1266.                 EXX
  1267.                 JR NZ,FINDF2
  1268.                 LD A,(FATType)
  1269.                 CP 2
  1270.                 JR NC,FINDF2
  1271.                 EXX
  1272.                 LD BC,(ROOTZAP)
  1273.                 EXX
  1274. FINDF2          INC BC
  1275.                 CALL RDDIRSC
  1276.                 LD A,C
  1277.                 AND 0X0F
  1278.         REPT 4
  1279.                 ADD A,A
  1280.         ENDM
  1281.                 LD E,A
  1282.                 LD D,0
  1283.                 EX DE,HL
  1284.                 ADD HL,HL
  1285.                 ADD HL,DE
  1286.                 EXX
  1287.                 DEC BC
  1288.                 LD A,B
  1289.                 OR C
  1290.                 EXX
  1291.                 JR Z,FINDF3
  1292.                 LD A,(HL)
  1293.                 AND A
  1294.                 JR Z,FINDF3
  1295.                 CP "."
  1296.                 JR NZ,FINDF21
  1297.                 INC HL
  1298.                 LD A,(HL)
  1299.                 DEC HL
  1300.                 CP " "
  1301.                 JR Z,FINDF2
  1302. FINDF21         CP 0XE5                         ;ЕСЛИ УДАЛЕНО
  1303.                 JR Z,FINDF2                     ;ТО ПЕРЕХОДИМ НА СЛЕДУЮЩИЙ ОПИСАТЕЛЬ
  1304.                 LD DE,0X0B                      ;НУЖЕН ФЛАГОВЫЙ БАЙТ ОПИСАТЕЛЯ
  1305.                 ADD HL,DE                       ;ПОЛУЧИЛИ АДРЕС ФЛАГОВОГО БАЙТА
  1306.                 LD A,(HL)                       ;ВЗЯЛИ ФЛАГОВЫЙ БАЙТ
  1307.                 SBC HL,DE
  1308.                 CP 0X0F
  1309.                 JR Z,FINDF2
  1310.                 AND 0X10                        ;ПРОВЕРКА ЭТО ФАЙЛ ИЛИ ДИРА
  1311.                 JR NZ,FINDF1
  1312.                 LD A,(EXT4FOUND)
  1313.                 AND A
  1314.                 PUSH DE
  1315.                 LD DE,EXT4FOUND
  1316.                 PUSH BC
  1317.                 CALL NZ,CP_EXT
  1318.                 POP BC
  1319.                 POP DE
  1320.                 JR NZ,FINDF4
  1321. FINDF1          EX DE,HL
  1322.                 ADD HL,DE
  1323.                 LD A,(HL)
  1324.                 EX AF,AF'
  1325.                 LD HL,(ADR_SKLAD)               ;ДЛЯ ДИРЫ ПРОВЕРЯТЬ БОЛЬШЕ НЕ НАДО
  1326.                 LD (HL),C
  1327.                 INC HL
  1328.                 LD (HL),B                       ;ПОЛОЖИЛИ НОМЕР ДИРЫ В ТАБЛИЧКУ
  1329.                 INC HL
  1330.                 LD (ADR_SKLAD),HL
  1331.                 LD HL,(KOLFIND)
  1332.                 INC HL                          ;+1 НАЙДЕННЫХ ФАЙЛОВ
  1333.                 LD (KOLFIND),HL
  1334.                 LD HL,(ADR_SKLAD_NAME)
  1335.                 EX AF,AF'
  1336.                 LD (HL),A
  1337.                 INC HL
  1338.                 LD A,(DE)
  1339.                 LD (HL),A
  1340.                 INC HL
  1341.                 LD (ADR_SKLAD_NAME),HL
  1342. FINDF4          LD A,(ADR_SKLAD + 1)
  1343.                 CP HIGH (CPU3) + 0X10
  1344.                 JR C,FINDF2                     ;НЕ БОЛЕЕ 2048 ДИРОВ/ФАЙЛОВ В ТЕКУЩЕЙ ДИРЕКТОРИИ
  1345. FINDF3          LD HL,(KOLFIND)
  1346.                 POP IY
  1347.                 LD A,IYL
  1348.                 AND A
  1349.                 JR NZ,FINDF5
  1350.                 LD A,RAM_TEMP2
  1351.                 LD (RREG_A),A
  1352.                 LD (RREG_C),HL
  1353. FINDF5          LD (KOL_FOUNDED),HL
  1354.                 LD B,H
  1355.                 LD C,L
  1356.                 XOR A
  1357.                 RET
  1358.  
  1359. SET_MASK_EXT    LD A,(RREG_A)
  1360.                 AND A
  1361.                 JR NZ,SET_MASK_EXT1
  1362.                 LD (EXT4FOUND),A
  1363.                 RET
  1364.  
  1365. SET_MASK_EXT1   LD HL,(RREG_L)
  1366.                 LD DE,BUF_256 - CPU6
  1367.                 LD BC,0X10 * 3 + 1
  1368.                 CALL LDIR_BYTES
  1369.                 LD HL,BUF_256
  1370.                 LD DE,EXT4FOUND
  1371.                 LD BC,0X10FF
  1372. SET_MASK_EXT2   LD A,(HL)
  1373.                 AND A
  1374.                 JR Z,SET_MASK_EXT3
  1375.                 LDI
  1376.                 LDI
  1377.                 LDI
  1378.                 DJNZ SET_MASK_EXT2
  1379. SET_MASK_EXT3   XOR A
  1380.                 LD (DE),A
  1381.                 RET
  1382.  
  1383. LD_FILE6        PUSH AF
  1384.                 POP HL
  1385.                 LD (RREG_F),HL
  1386. LD_FILE8        EXX
  1387.                 LD (SAVE_IY),DE         ;IY
  1388.                 EXX
  1389.                 RET
  1390.  
  1391. ;IXL-L-КОЛИЧЕСТВО СЕКТОРОВ ДЛЯ ЗАГРУЗКИ
  1392. ;IXH-H-РАЗМЕР КЛАСТЕРА
  1393. ;IYL-E-
  1394. ;IYH-D-СМЕЩЕНИЕ В КЛАСТЕРЕ
  1395. READ_FILE       EX AF,AF'
  1396.                 LD A,IYL
  1397.                 DEC A
  1398.                 JR Z,LD_FILE00
  1399.                 LD IYL,INT4EXT
  1400.                 LD HL,LD_FILE6
  1401.                 PUSH HL
  1402.                 LD HL,(RREG_L)                  ;АДРЕС ЗАГРУЗКИ
  1403.                 EXX
  1404.                 LD DE,(SAVE_IY)                 ;СМЕЩЕНИЕ В КЛАСТЕРЕ
  1405.                 LD A,(SecPerClus)
  1406.                 LD H,A                          ;КОЛИЧЕСТВО СЕКТОРОВ В КЛАСТЕРЕ
  1407.                 LD A,(RREG_A)
  1408.                 LD L,A                          ;КОЛИЧЕСТВО СЕКТОРОВ ДЛЯ ЗАГРУЗКИ
  1409.                 EXX
  1410.                 JR LD_FILE0
  1411.  
  1412. LD_FILE00       EXX
  1413.                 LD DE,(SAVE_IY)                 ;СМЕЩЕНИЕ В КЛАСТЕРЕ
  1414.                 LD HL,LD_FILE8
  1415.                 PUSH HL
  1416.                 LD A,(SecPerClus)               ;КОЛИЧЕСТВО СЕКТОРОВ В КЛАСТЕРЕ
  1417.                 LD H,A                          ;КОЛИЧЕСТВО СЕКТОРОВ В КЛАСТЕРЕ
  1418.                 EX AF,AF'
  1419.                 LD L,A                          ;КОЛИЧЕСТВО СЕКТОРОВ ДЛЯ ЗАГРУЗКИ
  1420.                 EXX
  1421. ;IXL-L-КОЛИЧЕСТВО СЕКТОРОВ ДЛЯ ЗАГРУЗКИ
  1422. ;IXH-H-РАЗМЕР КЛАСТЕРА
  1423. ;IYL-E-
  1424. ;IYH-D-СМЕЩЕНИЕ В КЛАСТЕРЕ
  1425. LD_FILE0        LD DE,(AFILCLS)
  1426.                 LD BC,(AFILCLS+2)               ;ТЕКУЩИЙ НОМЕР КЛАСТЕРА
  1427.                 PUSH BC
  1428.                 PUSH DE
  1429.                 PUSH HL
  1430.                 CALL REALSEC                    ;ПЕРЕВЕЛИ НОМЕР КЛАСТЕРА В НОМЕР СЕКТОРА
  1431.                 EXX
  1432.                 LD A,D                  ;IYH
  1433.                 EXX
  1434.                 LD L,A
  1435.                 LD H,0
  1436.                 ADD HL,DE
  1437.                 EX DE,HL
  1438.                 JR NC,LD_FILE1
  1439.                 INC BC                          ;BCDE=НОМЕР СЕКТОРА ОТКУДА ГРУЗИТЬ
  1440. LD_FILE1        EXX
  1441.                 LD A,L                  ;IXL
  1442.                 CP H                    ;IXH
  1443.                 JP C,LD_FILE2
  1444.                 LD A,H                  ;IXH
  1445. LD_FILE2        ADD A,D                 ;IYH
  1446.                 CP H                    ;IXH
  1447.                 LD A,L                  ;IXL
  1448.                 JP C,LD_FILE5
  1449.                 LD A,H                  ;IXH
  1450.                 SUB D                   ;IYH
  1451. LD_FILE5        LD E,A                  ;IYL,A  ;СКОЛЬКО СЕКТОРОВ СЕЙЧАС ГРУЗИМ
  1452.                 EXX
  1453.                 POP HL                          ;ВОССТАНОВИЛИ АДРЕС ЗАГРУЗКИ
  1454. ;               LD IYL,INT4EXT
  1455.                 CALL TO_DRV
  1456.                 DB _DEV_READ
  1457.                 LD A,IYL
  1458.                 DEC A
  1459.                 JR Z,LD_FILE7
  1460.                 LD (RREG_L),HL
  1461. LD_FILE7        POP DE
  1462.                 POP BC                          ;ВОССТАНОВИЛИ НОМЕР КЛАСТЕРА
  1463.                 EXX
  1464.                 LD A,D                  ;IYH
  1465.                 ADD A,E                 ;IYL
  1466.                 CP H                    ;IXH
  1467.                 JP C,LD_FILE3
  1468.                 SUB H                   ;IXH
  1469. LD_FILE3        LD D,A                  ;IYH,A
  1470.                 EXX
  1471.                 JP C,LD_FILE4
  1472.                 PUSH HL                         ;СОХРАНИЛИ АДРЕС ЗАГРУЗКИ
  1473.                 PUSH IY
  1474.                 LD IYL,INTERNAL
  1475.                 CALL RDFATZP                    ;ПРОЧИТАЛИ НОМЕР СЛЕДУЮЩЕГО КЛАСТЕРА
  1476.                 POP IY
  1477.                 LD (AFILCLS),DE
  1478.                 LD (AFILCLS + 2),BC
  1479.                 CALL LST_CLS                    ;ПРОВЕРИЛИ, А МОЖЕТ ЭТО ПОСЛЕДНИЙ КЛАСТЕР?
  1480.                 POP HL                          ;ВОССТАНОВИЛИ АДРЕС ЗАГРУЗКИ
  1481.                 RET C                           ;ЕСЛИ ПОСЛЕДНИЙ, ВЫХОДИМ
  1482. LD_FILE4        EXX
  1483.                 LD A,L                  ;IXL
  1484.                 SUB E                   ;IYL
  1485.                 EXX
  1486.                 RET Z
  1487.                 EXX
  1488.                 LD L,A                  ;IXL,A
  1489.                 EXX
  1490.                 JP NZ,LD_FILE0
  1491.                 RET
  1492.  
  1493. OPEN_FILE       LD A,IYL
  1494.                 AND A
  1495.                 JR NZ,OPENFILE1
  1496.                 LD HL,EOPEN_FILE
  1497.                 PUSH HL
  1498. OPENFILE1       PUSH IY
  1499.                 LD IYL,INTERNAL
  1500.                 CALL READ_DIR
  1501.                 LD DE,FILE_SRC
  1502.                 LD BC,_DIR_StructSize
  1503.                 PUSH DE
  1504.                 LDIR
  1505.                 LD HL,0
  1506.                 LD A,(FATType)
  1507.                 CP 2
  1508.                 JR C,OPENFILE2                  ;ЕСЛИ ЭТО НЕ FAT32 ТО СТАРШИЕ 16 БИТ ОБНУЛЯЕМ
  1509.                 LD HL,(FILE_SRC + _DIR_FstClusHI)
  1510. OPENFILE2       LD (AFILCLS + 2),HL
  1511.                 LD HL,(FILE_SRC + _DIR_FstClusLO)
  1512.                 LD (AFILCLS),HL
  1513.                 LD HL,(TEK_ZAP)
  1514.                 LD (NUM_FILE_SRC),HL
  1515.                 XOR A
  1516.                 LD H,A
  1517.                 LD L,A
  1518.                 LD (SAVE_IY),HL
  1519.                 POP HL
  1520.                 POP IY
  1521.                 RET
  1522.  
  1523. EOPEN_FILE      PUSH AF
  1524.                 POP HL
  1525.                 LD (RREG_F),HL
  1526.                 RET
  1527.  
  1528. EFINDNAME       LD HL,(TEK_ZAP)
  1529.                 LD (RREG_C),HL
  1530.                 PUSH AF
  1531.                 POP HL
  1532.                 LD (RREG_F),HL
  1533.                 RET
  1534.  
  1535. FIND_NAME       LD A,IYL
  1536.                 AND A
  1537.                 JR NZ,FINDNAME01
  1538.                 PUSH HL
  1539.                 LD HL,(RREG_L)
  1540.                 LD DE,BUF_256 - CPU6
  1541.                 LD BC,0X10
  1542.                 CALL LDIR_BYTES
  1543.                 LD HL,EFINDNAME
  1544.                 EX (SP),HL
  1545. FINDNAME01      PUSH IY
  1546.                 LD IYL,INTERNAL
  1547.                 LD HL,BUF_256
  1548.                 LD DE,FB_EXT
  1549.                 LD BC,0X8FF
  1550.                 LD A,(HL)
  1551.                 CP "."
  1552.                 JR NZ,FINDNAME02
  1553.                 LDI
  1554.                 LDI
  1555.                 LD B,6
  1556. FINDNAME02      LD A,(HL)
  1557.                 CP "!"
  1558.                 JR C,FINDNAME03
  1559.                 CP "."
  1560.                 JR Z,FINDNAME12
  1561.                 LDI
  1562.                 DJNZ FINDNAME02
  1563.                 LD A,(HL)
  1564.                 CP "!"
  1565.                 JR C,FINDNAME06
  1566.                 INC HL
  1567.                 JR FINDNAME06
  1568.  
  1569. FINDNAME12      INC HL
  1570. FINDNAME03      LD A," "
  1571. FINDNAME05      LD (DE),A
  1572.                 INC DE
  1573.                 DJNZ FINDNAME05
  1574. FINDNAME06      LD B,3
  1575. FINDNAME08      LD A,(HL)
  1576.                 CP "!"
  1577.                 JR C,FINDNAME07
  1578.                 LDI
  1579.                 DJNZ FINDNAME08
  1580.                 CALL POSTF02
  1581.                 JR FINDNAME11
  1582.  
  1583. FINDNAME07      LD A," "
  1584. FINDNAME09      LD (DE),A
  1585.                 INC DE
  1586.                 DJNZ FINDNAME09
  1587.                 CALL POSTF02
  1588.                 JR FINDNAME11
  1589.  
  1590. FINDNAME10      CALL NXTLEGZ
  1591. FINDNAME11      PUSH HL
  1592.                 CALL CMP_NAME
  1593.                 POP HL
  1594.                 JR Z,FINDNAME13
  1595.                 LD A,(HL)
  1596.                 AND A
  1597.                 JR NZ,FINDNAME10
  1598.                 SCF
  1599. FINDNAME13      POP IY
  1600.                 RET
  1601.  
  1602. CMP_NAME        LD DE,FB_EXT
  1603. ICMP_NAME       LD B,0X0B
  1604. CMP_NAME_B      LD A,(DE)
  1605.                 CP "a"
  1606.                 JR C,CMPNAME01
  1607.                 CP "{"
  1608.                 JR NC,CMPNAME01
  1609.                 AND %11011111
  1610. CMPNAME01       CP (HL)
  1611.                 RET NZ
  1612.                 INC DE
  1613.                 INC HL
  1614.                 DJNZ CMP_NAME_B
  1615.                 XOR A
  1616.                 RET
  1617.  
  1618. ;ВХОЖДЕНИЕ В DIR
  1619. ENTER_DIR       LD IYL,INTERNAL
  1620.                 CALL READ_DIR
  1621.                 PUSH AF
  1622.                 PUSH DE
  1623.                 PUSH HL
  1624.                 CALL RENEW_PATH
  1625.                 POP HL
  1626.                 POP DE
  1627.                 POP AF
  1628.                 BIT 4,A
  1629.                 EX AF,AF'
  1630.                 LD A,E
  1631.                 EX AF,AF'
  1632.                 LD E,A
  1633.                 LD D,(HL)
  1634.                 RET Z
  1635.                 EXX
  1636.                 EX AF,AF'
  1637.                 BIT 7,A
  1638.                 JR Z,ENT_DI2
  1639.                 LD HL,TEK_LEV
  1640.                 LD A,(HL)
  1641.                 AND A
  1642.                 EXX
  1643.                 RET Z
  1644.                 EXX
  1645.                 DEC A
  1646.                 LD (HL),A
  1647.                 ADD A,A
  1648.                 LD H,HIGH (BUF_DIRCEP + CPU6)
  1649.                 LD L,A
  1650.                 LD A,(HL)
  1651.                 INC L
  1652.                 LD H,(HL)
  1653.                 LD L,A
  1654.                 JR ENT_DI1
  1655.  
  1656. ENT_DI2         LD HL,TEK_LEV
  1657.                 LD A,(HL)
  1658.                 INC A
  1659.                 CP 0X10
  1660.                 EXX
  1661.                 RET Z
  1662.                 EXX
  1663.                 LD (HL),A
  1664.                 DEC A
  1665.                 ADD A,A
  1666.                 LD H,HIGH (BUF_DIRCEP + CPU6)
  1667.                 LD L,A
  1668.                 LD BC,(TEK_ZAP)
  1669.                 LD (HL),C
  1670.                 INC L
  1671.                 LD (HL),B
  1672. ENT_DI1         EXX
  1673.                 PUSH DE
  1674.                 LD DE,_DIR_FstClusHI
  1675.                 ADD HL,DE
  1676.                 LD C,(HL)
  1677.                 INC HL
  1678.                 LD B,(HL)
  1679.                 LD E,5
  1680.                 ADD HL,DE
  1681.                 LD E,(HL)
  1682.                 INC HL
  1683.                 LD D,(HL)
  1684.                 LD A,B
  1685.                 OR C
  1686.                 OR D
  1687.                 OR E
  1688.                 JR NZ,ENT_DI0
  1689.                 LD DE,(RootDIRCluster)
  1690.                 LD BC,(RootDIRCluster + 2)
  1691. ENT_DI0         LD (CurrentDIRCluster),DE
  1692.                 LD (CurrentDIRCluster + 2),BC
  1693.                 POP DE
  1694. INIT_TEKDIR     PUSH DE
  1695.                 PUSH IY
  1696.                 LD IYL,INTERNAL
  1697.                 CALL INIRTSC
  1698.                 POP IY
  1699.                 POP DE
  1700.                 RET
  1701.