Subversion Repositories pentevo

Rev

Rev 1190 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

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