Subversion Repositories pentevo

Rev

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

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