Subversion Repositories pentevo

Rev

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

  1.  
  2. ; LAST UPDATE: 13.02.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.                 RET Z
  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. .L2             PUSH DE
  1214.                 LD DE,_DIR_Ext
  1215.                 ADD HL,DE
  1216.                 POP DE
  1217.                 LD A,(DE)
  1218.                 CP (HL)
  1219.                 RET NZ
  1220.                 INC HL
  1221.                 INC DE
  1222.                 LD A,(DE)
  1223.                 CP (HL)
  1224.                 RET NZ
  1225.                 INC HL
  1226.                 INC DE
  1227.                 LD A,(DE)
  1228.                 CP (HL)
  1229.                 RET
  1230.  
  1231. FIND_FILEITEM   PUSH IY
  1232.                 LD IYL,INTERNAL
  1233.                 CALL INIRTSC
  1234.         EVOPORT WIN_P3,RAM_SORTFILES
  1235.                 LD HL,CPU3
  1236.                 LD DE,CPU3+1
  1237.                 LD BC,0x3FFF
  1238.                 LD (HL),L
  1239.                 LDIR
  1240.                 LD HL,0
  1241.                 LD (FATVAR.KOLFIND),HL          ; найденных файлов
  1242.                 LD HL,CPU3
  1243.                 LD (ADR_SKLAD),HL               ; адрес складирования
  1244.                 LD HL,CPU3+0x1000
  1245.                 LD (ADR_SKLAD_NAME),HL          ; адрес складирования первого символа имени найденного и его флага
  1246.                 LD BC,0xFFFF
  1247.                 EXX
  1248.                 LD BC,0
  1249.                 LD A,(FATVAR.CurrentNumLevDIR)
  1250.                 AND A
  1251.                 EXX
  1252.                 JR NZ,.L1
  1253.                 LD A,(FATVAR.FATType)
  1254.                 CP 2
  1255.                 JR NC,.L1
  1256.                 EXX
  1257.                 LD BC,(FATVAR.ROOTZAP)
  1258.                 EXX
  1259. .L1             INC BC
  1260.                 CALL RDDIRSC
  1261.                 LD A,C
  1262.                 AND 0x0F
  1263.         REPT 4
  1264.                 ADD A,A
  1265.         ENDM
  1266.                 LD E,A
  1267.                 LD D,0
  1268.                 EX DE,HL
  1269.                 ADD HL,HL
  1270.                 ADD HL,DE
  1271.                 EXX
  1272.                 DEC BC
  1273.                 LD A,B
  1274.                 OR C
  1275.                 EXX
  1276.                 JR Z,.L5
  1277.                 LD A,(HL)
  1278.                 AND A
  1279.                 JR Z,.L5
  1280.                 CP '.'
  1281.                 JR NZ,.L2
  1282.                 INC HL
  1283.                 LD A,(HL)
  1284.                 DEC HL
  1285.                 CP ' '
  1286.                 JR Z,.L1
  1287. .L2             CP 0xE5                         ; если удалено
  1288.                 JR Z,.L1                        ; то переходим на следующий описатель
  1289.                 LD DE,_DIR_Attr                 ; нужен флаговый байт описателя
  1290.                 ADD HL,DE                       ; получили адрес флагового байта
  1291.                 LD A,(HL)                       ; взяли флаговый байт
  1292.                 SBC HL,DE
  1293.                 CP M_DIR_AttrLongName           ; длинное имя?
  1294.                 JR Z,.L1
  1295.                 AND M_DIR_Directory             ; проверка это файл или дира?
  1296.                 JR NZ,.L3
  1297.                 LD A,(EXT4FOUND)
  1298.                 AND A
  1299.                 PUSH DE
  1300.                 LD DE,EXT4FOUND
  1301.                 PUSH BC
  1302.                 CALL NZ,CP_EXT
  1303.                 POP BC
  1304.                 POP DE
  1305.                 JR NZ,.L4
  1306. .L3             EX DE,HL
  1307.                 ADD HL,DE
  1308.                 LD A,(HL)
  1309.                 EX AF,AF'
  1310.                 LD HL,(ADR_SKLAD)               ; для диры проверять больше не надо
  1311.                 LD (HL),C
  1312.                 INC HL
  1313.                 LD (HL),B                       ; положили номер диры в табличку
  1314.                 INC HL
  1315.                 LD (ADR_SKLAD),HL
  1316.                 LD HL,(FATVAR.KOLFIND)
  1317.                 INC HL                          ; +1 найденных файлов
  1318.                 LD (FATVAR.KOLFIND),HL
  1319.                 LD HL,(ADR_SKLAD_NAME)
  1320.                 EX AF,AF'
  1321.                 LD (HL),A
  1322.                 INC HL
  1323.                 LD A,(DE)
  1324.                 LD (HL),A
  1325.                 INC HL
  1326.                 LD (ADR_SKLAD_NAME),HL
  1327. .L4             LD A,(ADR_SKLAD + 1)
  1328.                 CP HIGH (CPU3) + 0x10
  1329.                 JR C,.L1                        ; не более 2048 диров/файлов в текущей директории
  1330. .L5             LD HL,(FATVAR.KOLFIND)
  1331.                 POP IY
  1332.                 LD A,IYL
  1333.                 AND A
  1334.                 JR NZ,.L6
  1335.                 LD A,RAM_SORTFILES
  1336.                 LD (RREG_A),A
  1337.                 LD (RREG_C),HL
  1338. .L6             LD (KOL_FOUNDED),HL
  1339.                 LD B,H
  1340.                 LD C,L
  1341.                 XOR A
  1342.                 RET
  1343.  
  1344. SET_MASK_EXT    LD A,(RREG_A)
  1345.                 AND A
  1346.                 JR NZ,.L1
  1347.                 LD (EXT4FOUND),A
  1348.                 RET
  1349.  
  1350. .L1             LD HL,(RREG_L)
  1351.                 LD DE,BUF_MOVE256 & 0x3FFF
  1352.                 LD BC,0x10 * 3 + 1
  1353.                 CALL LDIR_BYTES
  1354.                 LD HL,BUF_MOVE256
  1355.                 LD DE,EXT4FOUND
  1356.                 LD BC,0x10FF
  1357. .L2             LD A,(HL)
  1358.                 AND A
  1359.                 JR Z,.L3
  1360.                 LDI
  1361.                 LDI
  1362.                 LDI
  1363.                 DJNZ .L2
  1364. .L3             XOR A
  1365.                 LD (DE),A
  1366.                 RET
  1367.  
  1368. LD_FILE6        PUSH AF
  1369.                 POP HL
  1370.                 LD (RREG_F),HL
  1371. LD_FILE8        EXX
  1372.                 LD (SAVE_IY),DE                 ; IY
  1373.                 EXX
  1374.                 RET
  1375.  
  1376. ; IXL - L - количество секторов для загрузки
  1377. ; IXH - H - размер кластера
  1378. ; IYL - E -
  1379. ; IYH - D - смещение в кластере
  1380. READ_FILE       EX AF,AF'
  1381.                 LD A,IYL
  1382.                 DEC A
  1383.                 JR Z,LD_FILE00
  1384.                 LD IYL,INT4EXT
  1385.                 LD HL,LD_FILE6
  1386.                 PUSH HL
  1387.                 LD HL,(RREG_L)                  ; адрес загрузки
  1388.                 EXX
  1389.                 LD DE,(SAVE_IY)                 ; смещение в кластере
  1390.                 LD A,(FATVAR.SecPerClus)
  1391.                 LD H,A                          ; количество секторов в кластере
  1392.                 LD A,(RREG_A)
  1393.                 LD L,A                          ; количество секторов для загрузки
  1394.                 EXX
  1395.                 JR LD_FILE0
  1396.  
  1397. LD_FILE00       EXX
  1398.                 LD DE,(SAVE_IY)                 ; смещение в кластере
  1399.                 LD HL,LD_FILE8
  1400.                 PUSH HL
  1401.                 LD A,(FATVAR.SecPerClus)        ; количество секторов в кластере
  1402.                 LD H,A
  1403.                 EX AF,AF'
  1404.                 LD L,A                          ; количество секторов для загрузки
  1405.                 EXX
  1406. ; IXL - L - количество секторов для загрузки
  1407. ; IXH - H - размер кластера
  1408. ; IYL - E -
  1409. ; IYH - D - смещение в кластере
  1410. LD_FILE0        LD DE,(FATVAR.AFILCLS)
  1411.                 LD BC,(FATVAR.AFILCLS+2)        ; текущий номер кластера
  1412.                 PUSH BC
  1413.                 PUSH DE
  1414.                 PUSH HL
  1415.                 CALL REALSEC                    ; перевели номер кластера в номер сектора
  1416.                 EXX
  1417.                 LD A,D                  ; IYH
  1418.                 EXX
  1419.                 LD L,A
  1420.                 LD H,0
  1421.                 ADD HL,DE
  1422.                 EX DE,HL
  1423.                 JR NC,LD_FILE1
  1424.                 INC BC                          ; BCDE=номер сектора откуда грузить
  1425. LD_FILE1        EXX
  1426.                 LD A,L                  ; IXL
  1427.                 CP H                    ; IXH
  1428.                 JP C,LD_FILE2
  1429.                 LD A,H                  ; IXH
  1430. LD_FILE2        ADD A,D                 ; IYH
  1431.                 CP H                    ; IXH
  1432.                 LD A,L                  ; IXL
  1433.                 JP C,LD_FILE5
  1434.                 LD A,H                  ; IXH
  1435.                 SUB D                   ; IYH
  1436. LD_FILE5        LD E,A                  ; IYL,A ; сколько секторов сейчас грузим
  1437.                 EXX
  1438.                 POP HL                          ; восстановили адрес загрузки
  1439. ;               LD IYL,INT4EXT
  1440.                 CALL TO_DRV
  1441.                 DB _DEV_READ
  1442.                 LD A,IYL
  1443.                 DEC A
  1444.                 JR Z,LD_FILE7
  1445.                 LD (RREG_L),HL
  1446. LD_FILE7        POP DE
  1447.                 POP BC                          ; восстановили номер кластера
  1448.                 EXX
  1449.                 LD A,D                  ; IYH
  1450.                 ADD A,E                 ; IYL
  1451.                 CP H                    ; IXH
  1452.                 JP C,LD_FILE3
  1453.                 SUB H                   ; IXH
  1454. LD_FILE3        LD D,A                  ; IYH,A
  1455.                 EXX
  1456.                 JP C,LD_FILE4
  1457.                 PUSH HL                         ; сохранили адрес загрузки
  1458.                 PUSH IY
  1459.                 LD IYL,INTERNAL
  1460.                 CALL RDFATZP                    ; прочитали номер следующего кластера
  1461.                 POP IY
  1462.                 LD (FATVAR.AFILCLS),DE
  1463.                 LD (FATVAR.AFILCLS + 2),BC
  1464.                 CALL LST_CLS                    ; проверили, а может это последний кластер?
  1465.                 POP HL                          ; восстановили адрес загрузки
  1466.                 RET C                           ; если последний, выходим
  1467. LD_FILE4        EXX
  1468.                 LD A,L                  ; IXL
  1469.                 SUB E                   ; IYL
  1470.                 EXX
  1471.                 RET Z
  1472.                 EXX
  1473.                 LD L,A                  ; IXL,A
  1474.                 EXX
  1475.                 JP NZ,LD_FILE0
  1476.                 RET
  1477.  
  1478. OPEN_FILE       LD A,IYL
  1479.                 AND A
  1480.                 JR NZ,OPENFILE1
  1481.                 LD HL,EOPEN_FILE
  1482.                 PUSH HL
  1483. OPENFILE1       PUSH IY
  1484.                 LD IYL,INTERNAL
  1485.                 CALL READ_DIR
  1486.                 LD DE,FATVAR.FILE_SRC
  1487.                 LD BC,_DIR_StructSize
  1488.                 PUSH DE
  1489.                 LDIR
  1490.                 LD HL,0
  1491.                 LD A,(FATVAR.FATType)
  1492.                 CP 2
  1493.                 JR C,OPENFILE2                  ; если это не FAT32 то старшие 16 бит обнуляем
  1494.                 LD HL,(FATVAR.FILE_SRC + _DIR_FstClusHI)
  1495. OPENFILE2       LD (FATVAR.AFILCLS + 2),HL
  1496.                 LD HL,(FATVAR.FILE_SRC + _DIR_FstClusLO)
  1497.                 LD (FATVAR.AFILCLS),HL
  1498.                 LD HL,(FATVAR.TEK_ZAP)
  1499.                 LD (FATVAR.NUM_FILE_SRC),HL
  1500.                 XOR A
  1501.                 LD H,A
  1502.                 LD L,A
  1503.                 LD (SAVE_IY),HL
  1504.                 POP HL
  1505.                 POP IY
  1506.                 RET
  1507.  
  1508. EOPEN_FILE      PUSH AF
  1509.                 POP HL
  1510.                 LD (RREG_F),HL
  1511.                 RET
  1512.  
  1513. EFINDNAME       LD HL,(FATVAR.TEK_ZAP)
  1514.                 LD (RREG_C),HL
  1515.                 PUSH AF
  1516.                 POP HL
  1517.                 LD (RREG_F),HL
  1518.                 RET
  1519.  
  1520. FIND_NAME       LD A,IYL
  1521.                 AND A
  1522.                 JR NZ,FINDNAME01
  1523.                 PUSH HL
  1524.                 LD HL,(RREG_L)
  1525.                 LD DE,BUF_MOVE256 & 0x3FFF
  1526.                 LD BC,0x10
  1527.                 CALL LDIR_BYTES
  1528.                 LD HL,EFINDNAME
  1529.                 EX (SP),HL
  1530. FINDNAME01      PUSH IY
  1531.                 LD IYL,INTERNAL
  1532.                 LD HL,BUF_MOVE256
  1533.                 LD DE,FB_EXT
  1534.                 LD BC,0x8FF
  1535.                 LD A,(HL)
  1536.                 CP '.'
  1537.                 JR NZ,FINDNAME02
  1538.                 LDI
  1539.                 LDI
  1540.                 LD B,6
  1541. FINDNAME02      LD A,(HL)
  1542.                 CP '!'
  1543.                 JR C,FINDNAME03
  1544.                 CP '.'
  1545.                 JR Z,FINDNAME12
  1546.                 LDI
  1547.                 DJNZ FINDNAME02
  1548.                 LD A,(HL)
  1549.                 CP '!'
  1550.                 JR C,FINDNAME06
  1551.                 INC HL
  1552.                 JR FINDNAME06
  1553.  
  1554. FINDNAME12      INC HL
  1555. FINDNAME03      LD A,' '
  1556. FINDNAME05      LD (DE),A
  1557.                 INC DE
  1558.                 DJNZ FINDNAME05
  1559. FINDNAME06      LD B,3
  1560. FINDNAME08      LD A,(HL)
  1561.                 CP '!'
  1562.                 JR C,FINDNAME07
  1563.                 LDI
  1564.                 DJNZ FINDNAME08
  1565.                 CALL POSTF02
  1566.                 JR FINDNAME11
  1567.  
  1568. FINDNAME07      LD A,' '
  1569. FINDNAME09      LD (DE),A
  1570.                 INC DE
  1571.                 DJNZ FINDNAME09
  1572.                 CALL POSTF02
  1573.                 JR FINDNAME11
  1574.  
  1575. FINDNAME10      CALL NXTLEGZ
  1576. FINDNAME11      PUSH HL
  1577.                 CALL CMP_NAME
  1578.                 POP HL
  1579.                 JR Z,FINDNAME13
  1580.                 LD A,(HL)
  1581.                 AND A
  1582.                 JR NZ,FINDNAME10
  1583.                 SCF
  1584. FINDNAME13      POP IY
  1585.                 RET
  1586.  
  1587. CMP_NAME        LD DE,FB_EXT
  1588. ICMP_NAME       LD B,8 + 3
  1589. CMP_NAME_B      LD A,(DE)
  1590.                 CP 'a'
  1591.                 JR C,CMPNAME01
  1592.                 CP 'z' + 1
  1593.                 JR NC,CMPNAME01
  1594.                 AND %11011111
  1595. CMPNAME01       CP (HL)
  1596.                 RET NZ
  1597.                 INC DE
  1598.                 INC HL
  1599.                 DJNZ CMP_NAME_B
  1600.                 XOR A
  1601.                 RET
  1602.  
  1603. ; вхождение в DIR
  1604. ENTER_DIR       LD IYL,INTERNAL
  1605.                 CALL READ_DIR
  1606.                 PUSH AF
  1607.                 PUSH DE
  1608.                 PUSH HL
  1609.                 CALL RENEW_PATH
  1610.                 POP HL
  1611.                 POP DE
  1612.                 POP AF
  1613.                 BIT B_DIR_Directory,A
  1614.                 EX AF,AF'
  1615.                 LD A,E
  1616.                 EX AF,AF'
  1617.                 LD E,A
  1618.                 LD D,(HL)
  1619.                 RET Z
  1620.                 EXX
  1621.                 EX AF,AF'
  1622.                 BIT 7,A
  1623.                 JR Z,.L1
  1624. ; выход из директории
  1625.                 LD HL,FATVAR.CurrentNumLevDIR
  1626.                 LD A,(HL)
  1627.                 AND A
  1628.                 EXX
  1629.                 RET Z
  1630.                 EXX
  1631.                 DEC A
  1632.                 LD (HL),A
  1633.                 ADD A,A
  1634.                 LD H,HIGH (BUF_DIRCEP)
  1635.                 LD L,A
  1636.                 LD A,(HL)
  1637.                 INC L
  1638.                 LD H,(HL)
  1639.                 LD L,A
  1640.                 JR .L2
  1641.  
  1642. ; вход в директорию
  1643. .L1             LD HL,FATVAR.CurrentNumLevDIR
  1644.                 LD A,(HL)
  1645.                 INC A
  1646.                 CP 0x10
  1647.                 EXX
  1648.                 RET Z
  1649.                 EXX
  1650.                 LD (HL),A
  1651.                 DEC A
  1652.                 ADD A,A
  1653.                 LD H,HIGH (BUF_DIRCEP)
  1654.                 LD L,A
  1655.                 LD BC,(FATVAR.TEK_ZAP)
  1656.                 LD (HL),C
  1657.                 INC L
  1658.                 LD (HL),B
  1659. .L2             EXX
  1660.                 PUSH DE
  1661.                 LD DE,_DIR_FstClusHI
  1662.                 ADD HL,DE
  1663.                 LD C,(HL)
  1664.                 INC HL
  1665.                 LD B,(HL)
  1666.                 LD E,5
  1667.                 ADD HL,DE
  1668.                 LD E,(HL)
  1669.                 INC HL
  1670.                 LD D,(HL)
  1671.                 LD A,B
  1672.                 OR C
  1673.                 OR D
  1674.                 OR E
  1675.                 JR NZ,.L3
  1676.                 LD DE,(FATVAR.RootDIRCluster)
  1677.                 LD BC,(FATVAR.RootDIRCluster + 2)
  1678. .L3             LD (FATVAR.CurrentDIRCluster),DE
  1679.                 LD (FATVAR.CurrentDIRCluster + 2),BC
  1680.                 POP DE
  1681. INIT_TEKDIR     PUSH DE
  1682.                 PUSH IY
  1683.                 LD IYL,INTERNAL
  1684.                 CALL INIRTSC
  1685.                 POP IY
  1686.                 POP DE
  1687.                 RET
  1688.  
  1689. STORE_CURRFATVARS
  1690.                 ADD A,HIGH (CPU1+BUF_ALLVOL)+4
  1691.                 LD HL,BUF_CURRFATVAR
  1692.                 LD D,A
  1693.                 LD E,0
  1694.                 LD BC,BUF_CURRFATVAR_Size
  1695.                 LDIR
  1696.                 RET
  1697.  
  1698. RESTORE_CURRFATVARS
  1699.                 ADD A,HIGH (CPU1+BUF_ALLVOL)+4
  1700.                 LD H,A
  1701.                 LD L,0
  1702.                 LD DE,BUF_CURRFATVAR
  1703.                 LD BC,BUF_CURRFATVAR_Size
  1704.                 LDIR
  1705.                 RET
  1706.