Subversion Repositories pentevo

Rev

Rev 1010 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed | ?url?

  1.  
  2. ; LAST UPDATE: 13.10.2022 savelij
  3.  
  4. COM_FAT         EX AF,AF'
  5.                 CALL P5_READ_BYTE
  6.                 LD A,(NEXTBYTERST8)
  7.                 PUSH IX
  8.                 PUSH IY
  9.                 LD IYL,EXTERNAL
  10.                 JR ICOM_FAT1
  11.  
  12. ;ОБЩАЯ ТОЧКА ВХОДА ДЛЯ РАБОТЫ С FAT
  13. ICOM_FAT        EX AF,AF'
  14.                 EX (SP),HL
  15.                 LD A,(HL)
  16.                 INC HL
  17.                 EX (SP),HL
  18.                 PUSH IX
  19.                 PUSH IY
  20.                 LD IYL,INTERNAL
  21. ICOM_FAT1       LD (ERORDRV),SP
  22.                 PUSH HL
  23.                 LD HL,EXITDRV
  24.                 EX (SP),HL
  25.                 PUSH HL
  26.                 LD HL,TABLFAT
  27.                 ADD A,A
  28.                 ADD A,L
  29.                 LD L,A
  30.                 LD A,H
  31.                 ADC A,0
  32.                 LD H,A
  33.                 LD A,(HL)
  34.                 INC HL
  35.                 LD H,(HL)
  36.                 LD L,A
  37.                 EX AF,AF'
  38.                 EX (SP),HL
  39.                 RET
  40.  
  41. ERR_DRV         LD SP,(ERORDRV)
  42. EXITDRV         POP IY
  43.                 POP IX
  44.                 RET
  45.  
  46. TABLFAT         DW INIT_FATVARS                 ; инициализация переменных 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,(SETDVOL)
  63.                 LD D,A
  64.                 LD L,A
  65.                 LD H,0
  66.                 ADD HL,HL
  67.                 ADD HL,HL
  68.                 ADD HL,HL
  69.                 LD BC,BUF_TABLVOL + 2
  70.                 ADD HL,BC
  71.                 LD A,(HL)
  72.                 LD HL,BUF_TABLVOL
  73.                 CALL INIT_FATVARS
  74.                 LD DE,(CurrentDIRCluster)
  75.                 LD BC,(CurrentDIRCluster + 2)
  76.                 CALL INIT_TEKDIR
  77.                 POP IY
  78.                 RET
  79.  
  80. ; инициализация переменных FAT
  81. ; На входе:
  82. ; HL = адрес таблицы найденых разделов
  83. ; DE = D - номер выбранного раздела, E - количество найденных разделов
  84. ; A = тип раздела если найден MBR
  85. ; На выходе:
  86. ; BCDE = номер кластера корневой директории
  87. ; A = тип раздела если MBR не найден
  88. INIT_FATVARS    PUSH HL
  89.                 LD HL,0xFFFF
  90.                 LD (NumSec2Buf + 2),HL
  91.                 LD (FATType),A
  92.                 LD E,D
  93.                 LD D,0
  94.                 EX DE,HL
  95.                 POP DE
  96.                 ADD HL,HL
  97.                 ADD HL,HL
  98.                 ADD HL,HL
  99.                 ADD HL,DE
  100.                 INC HL
  101.                 INC HL
  102.                 INC HL
  103.                 CALL LOADZP
  104.                 LD (StartSecVol),DE
  105.                 LD (StartSecVol + 2),BC         ; номер первого сектора раздела
  106.                 CALL LOADLST
  107.                 CALL VALID_BOOTSEC
  108.                 AND A
  109.                 JR Z,RDFAT07
  110.                 SCF
  111.                 RET
  112.  
  113. RDFAT07         LD A,(BUF_512 + _BPB_SecPerClus)
  114.                 LD (SecPerClus),A
  115.                 LD HL,(BUF_512 + _BPB_RsvdSecCnt)
  116.                 ADD HL,DE
  117.                 LD (NumSecFAT1),HL
  118.                 LD HL,0
  119.                 ADC HL,BC
  120.                 LD (NumSecFAT1 + 2),HL
  121.                 LD HL,0
  122.                 LD DE,(BUF_512 + _BPB_FATSz16)
  123.                 LD A,D
  124.                 OR E
  125.                 JR NZ,RDFAT01                   ; если не FAT12/16 (_BPB_FATSz16 == 0)
  126.                 LD DE,(BUF_512 + _BPB_FATSz32)
  127.                 LD HL,(BUF_512 + _BPB_FATSz32 + 2)      ; то берем из смещения +36
  128. RDFAT01         LD (FATSize),DE
  129.                 LD (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,.L1                       ; если не FAT12/16 (BPB_TOTSEC16=0)
  136.                 LD DE,(BUF_512 + _BPB_TotSec32)
  137.                 LD HL,(BUF_512 + _BPB_TotSec32+2)
  138.                                                 ; то берем из смещения +32
  139. .L1             LD (NumsSectorsVol + 2),HL
  140.                 LD (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,RDFAT03
  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. RDFAT03         PUSH DE                         ; ROOTDIRSECTORS
  156.                 LD HL,NumSecFAT1
  157.                 CALL LOADZP
  158.                 LD A,(BUF_512 + _BPB_NumFATs)
  159.                 LD (NumFATs),A
  160.                 DEC A
  161.                 JR Z,.L1
  162.                 LD HL,FATSize
  163.                 CALL BCDEHLP
  164.                 LD (NumSecFAT2),DE
  165.                 LD (NumSecFAT2 + 2),BC
  166. .L1             LD HL,FATSize
  167.                 CALL BCDEHLP
  168.                 LD (NumSecRootDir),DE
  169.                 LD (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 (FirstSecData),DE
  179.                 LD (FirstSecData + 2),BC
  180.                 LD HL,NumsSectorsVol
  181.                 CALL BCDEHLM
  182.                 LD A,(SecPerClus)
  183.                 CALL BCDE_A
  184.                 LD (NumsClustersVol),DE
  185.                 LD (NumsClustersVol + 2),BC
  186.  
  187.                 LD A,(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,(FATSize - 1)
  197.                 LD BC,(FATSize + 1)
  198.                 LD E,0                          ; BCDE = количество секторов * 0x100
  199.                 LD HL,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 (FATType),A
  208.  
  209. ; для FAT12/16 ROOT кластер = 0
  210. ; для FAT32 берем по смещению +44
  211. ; На выходе: BCDE - СЕКТОР ROOTDIR КЛАСТЕР
  212. .L4             XOR A
  213.                 LD (TEK_LEV),A
  214.                 LD (BUF_PATH),A
  215.                 CALL INIT_PATH
  216.                 LD A,(FATType)
  217.                 PUSH AF
  218.                 AND A
  219.                 LD DE,0
  220.                 LD B,D
  221.                 LD C,E
  222.                 JR Z,.L3                        ; FAT12-NONE
  223.                 DEC A
  224.                 JR Z,.L3                        ; FAT16
  225.                 LD DE,(BUF_512 + _BPB_RootClus)
  226.                 LD BC,(BUF_512 + _BPB_RootClus + 2)     ; FAT32
  227. .L3             LD (CurrentDIRCluster),DE
  228.                 LD (CurrentDIRCluster + 2),BC   ; номер текущего кластера
  229.                 LD (RootDIRCluster),DE
  230.                 LD (RootDIRCluster + 2),BC      ; номер корневого кластера
  231.                 POP AF
  232.                 RET
  233.  
  234. ; проверка 0 сектора раздела
  235. VALID_BOOTSEC   LD HL,(BUF_512 + _BPB_BytsPerSec)
  236.                 LD A,H
  237.                 SUB 2
  238.                 OR L
  239.                 JR NZ,VALID_BOOTSEC1
  240.                 LD HL,(BUF_512 + _BPB_SecPerClus)
  241.                 OR L
  242.                 JR Z,VALID_BOOTSEC1
  243.                 NEG
  244.                 AND L
  245.                 CP L
  246.                 JR NZ,VALID_BOOTSEC1
  247.                 LD A,(BUF_512 + _BPB_NumFATs)
  248.                 DEC A
  249.                 CP 7
  250.                 JR NC,VALID_BOOTSEC1
  251.                 XOR A
  252.                 RET
  253.  
  254. VALID_BOOTSEC1  OR IXH
  255.                 RET
  256.  
  257. ; формирование таблицы кластеров DIR
  258. ; и поиск первой "легальной" записи в DIR
  259. INIRTSC         PUSH AF
  260.                 LD HL,0xFFFF
  261.                 LD (NumSec2Buf + 2),HL
  262.                 LD HL,BUF_TDIRCLS
  263.                 LD DE,(CurrentDIRCluster)
  264.                 LD BC,(CurrentDIRCluster + 2)
  265.                 CALL SAVEZP
  266.                 LD A,D
  267.                 OR E
  268.                 OR B
  269.                 OR C
  270.                 JR Z,LASTCLS
  271. NEXTCLS         PUSH HL
  272.                 CALL RDFATZP
  273.                 CALL LST_CLS
  274.                 POP HL
  275.                 JR C,LASTCLS
  276.                 CALL SAVEZP
  277.                 JR NEXTCLS
  278.  
  279. LASTCLS         LD BC,0xFFFF
  280.                 CALL SAVEZP
  281.                 CALL POSTF02
  282.                 POP AF
  283.                 RET
  284.  
  285. ; чтение следующего номера кластера
  286. RDFATZP         LD A,(FATType)
  287.                 AND A
  288.                 JR Z,RDFATS0
  289.                 DEC A
  290.                 JR Z,RDFATS1
  291.                 EX DE,HL
  292.                 ADD HL,HL
  293.                 EX DE,HL
  294.                 LD HL,0
  295.                 ADC HL,BC
  296.                 ADD HL,BC                       ; HLDE = BCDE * 2
  297.                 LD A,E
  298.                 LD E,D
  299.                 LD D,L
  300.                 LD C,H
  301.                 LD B,0
  302.                 CALL RDFATS2
  303.                 INC HL
  304.                 LD C,(HL)
  305.                 INC HL
  306.                 LD B,(HL)
  307.                 RET
  308.  
  309. RDFATS1         LD BC,0
  310.                 LD A,E
  311.                 LD E,D
  312.                 LD D,C
  313. RDFATS2         PUSH AF
  314.                 PUSH BC
  315.                 LD HL,NumSecFAT1
  316.                 CALL BCDEHLP
  317.                 CALL LOADLST
  318.                 POP BC
  319.                 POP AF
  320.                 LD E,A
  321.                 LD D,0
  322.                 ADD HL,DE
  323.                 ADD HL,DE
  324.                 LD E,(HL)
  325.                 INC HL
  326.                 LD D,(HL)
  327.                 RET
  328.  
  329. RDFATS0         LD H,D
  330.                 LD L,E
  331.                 ADD HL,HL
  332.                 ADD HL,DE
  333.                 SRL H
  334.                 RR L
  335.                 LD A,E
  336.                 LD E,H
  337.                 LD D,0
  338.                 LD B,D
  339.                 LD C,D
  340.                 SRL E
  341.                 PUSH AF
  342.                 PUSH HL
  343.                 LD DE,(NumSecFAT1)
  344.                 LD BC,(NumSecFAT1 + 2)
  345.                 CALL LOADLST
  346.                 POP BC
  347.                 LD A,B
  348.                 AND 1
  349.                 LD B,A
  350.                 ADD HL,BC
  351.                 LD B,(HL)
  352.                 INC HL
  353.                 LD A,H
  354.                 CP HIGH (BUF_512)+2
  355.                 JR NZ,RDFATS4
  356.                 PUSH BC
  357.                 LD BC,0
  358.                 INC DE
  359.                 CALL LOADLST
  360.                 POP BC
  361. RDFATS4         POP AF
  362.                 LD D,(HL)
  363.                 LD E,B
  364.                 LD BC,0
  365.                 RRA
  366.                 JR NC,RDFATS3
  367.         REPT 4
  368.                 SRL D
  369.                 RR E
  370.         ENDM
  371. RDFATS3         LD A,D
  372.                 AND 0x0F
  373.                 LD D,A
  374.                 RET
  375.  
  376. ; вычисление номера реального сектора
  377. ; На входе: BCDE = номер кластера FAT
  378. ; На выходе: BCDE = номер сектора
  379. REALSEC         LD A,B
  380.                 OR C
  381.                 OR D
  382.                 OR E
  383.                 JR NZ,REALSE1
  384.                 LD DE,(NumSecRootDir)
  385.                 LD BC,(NumSecRootDir + 2)
  386.                 RET
  387.  
  388. REALSE1         LD HL,0xFFFE
  389.                 EX DE,HL
  390.                 ADD HL,DE
  391.                 EX DE,HL
  392.                 INC HL
  393.                 ADC HL,BC                       ; номер кластера-2
  394.                 LD A,(SecPerClus)
  395.                 JR REALSE2
  396.  
  397. REALSE3         SLA E
  398.                 RL D
  399.                 RL L
  400.                 RL H
  401. REALSE2         RRCA
  402.                 JR NC,REALSE3                   ; умножили на размер кластера
  403.                 LD B,H
  404.                 LD C,L
  405.                 LD HL,FirstSecData
  406.                 JP BCDEHLP                      ; прибавили смещение от начала раздела
  407.  
  408. ; сохраняем сектор загруженный в буфер
  409. LSTSAVE         LD DE,(NumSec2Buf)
  410.                 LD BC,(NumSec2Buf + 2)
  411.                 LD HL,BUF_512
  412.                 LD A,1
  413.                 CALL TO_DRV
  414.                 DB _DEV_WRITE
  415.                 AND A
  416.                 JP NZ,ERR_DRV
  417.                 RET
  418.  
  419. ; загружаем сектор в буфер
  420. LOADLST         CALL CPNUMSC
  421.                 JR NZ,LOADLS1
  422.                 LD HL,BUF_512
  423.                 RET
  424.  
  425. LOADLS1         LD (NumSec2Buf),DE
  426.                 LD (NumSec2Buf + 2),BC
  427.                 LD HL,BUF_512
  428.                 PUSH HL
  429.                 LD A,1
  430.                 CALL TO_DRV
  431.                 DB _DEV_READ
  432.                 AND A
  433.                 JP NZ,ERR_DRV
  434.                 POP HL
  435.                 RET
  436.  
  437. ; проверка на номер уже загруженный сектор
  438. CPNUMSC         LD HL,NumSec2Buf
  439.                 LD A,(HL)
  440.                 INC HL
  441.                 CP E
  442.                 RET NZ
  443.                 LD A,(HL)
  444.                 INC HL
  445.                 CP D
  446.                 RET NZ
  447.                 LD A,(HL)
  448.                 INC HL
  449.                 CP C
  450.                 RET NZ
  451.                 LD A,(HL)
  452.                 CP B
  453.                 RET
  454.  
  455. ; проверка на последний кластер
  456. LST_CLS         LD A,(FATType)                  ; взяли тип FAT
  457.                 AND A
  458.                 JR NZ,LST_CL1
  459.                 LD HL,0x0FF7                    ; для FAT12
  460.                 SBC HL,DE
  461.                 RET
  462.  
  463. LST_CL1         DEC A
  464.                 JR NZ,LST_CL2
  465.                 LD HL,0xFFF7                    ; для FAT16
  466.                 SBC HL,DE
  467.                 RET
  468.  
  469. LST_CL2         LD HL,0x0FFF
  470.                 SBC HL,BC
  471.                 RET NZ
  472.                 LD HL,0xFFF7
  473.                 SBC HL,DE
  474.                 RET
  475.  
  476. ; получить описатель текущего файла
  477. READ_DIR        LD A,IYL
  478.                 AND A
  479.                 JR NZ,GETFZA3
  480.                 PUSH IY
  481.                 LD IYL,INTERNAL
  482.                 PUSH HL
  483.                 LD HL,(RREG_C)
  484.                 LD (TEK_ZAP),HL
  485.                 LD HL,GETFZA4
  486.                 EX (SP),HL
  487. GETFZA3         LD BC,(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. GETFZA1         LD A,C
  504.                 AND 0x0F                        ; получили номер описателя в загруженном секторе диры
  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,0x0B
  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,GETFZA2
  524.                 LD D,0x80                       ; будем выходить в предыдущую директорию
  525. GETFZA2         EX AF,AF'
  526.                 CP 0x0F                         ; проверяем флаговый байт предыдущего описателя
  527.                 LD A,E                          ; взяли флаговый байт текущего описателя
  528.                 LD E,D                          ; выставили направление движения в дирах
  529.                 RET NZ
  530.                 INC E                           ; установка наличия длинного имени
  531.                 RET
  532.  
  533. GETFZA4         PUSH AF
  534.                 PUSH HL
  535.                 PUSH DE
  536.                 LD DE,CPU6
  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,(SecPerClus)
  558.                 PUSH AF
  559.                 CALL BCDE_A
  560.                 LD HL,BUF_TDIRCLS
  561.                 EX DE,HL
  562.                 ADD HL,HL
  563.                 ADD HL,HL
  564.                 ADD HL,DE
  565.                 CALL LOADZP
  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,(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,(TEK_ZAP)
  657.                 LD (SAVEZAP),HL
  658.                 RET
  659.  
  660. ; восстановление текущей позиции файла
  661. POSTF01         LD HL,(SAVEZAP)
  662.                 LD (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 0x0F                         ; длинное имя?
  725.                 JR Z,.L1
  726.                 CP 8                            ; имя раздела?
  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 (TEK_ZAP),BC
  749.                 RET
  750.  
  751. ; вернуть в "BC" текущий номер "легальной" записи
  752. POSTF07         LD BC,(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,0x0B
  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 (TEK_ZAP),BC
  779.                 CALL RDDIRSC
  780.                 CALL CP_ONET
  781.                 JR Z,NXTLEG1
  782.                 LD A,(HL)
  783.                 AND A
  784.                 RET Z
  785.                 JR NXTLEG1+1
  786.  
  787. NXTLEGZ         LD BC,(TEK_ZAP)
  788. NXTLEG1         INC BC
  789.                 CALL CPTEKZP
  790.                 CP 0xFF
  791.                 RET Z
  792.                 CP 0x0F
  793.                 JR Z,NXTLEG1
  794.                 CP 8
  795.                 JR Z,NXTLEG1
  796.                 LD A,E
  797.                 AND A
  798.                 RET Z
  799.                 CP 0xE5
  800.                 JR Z,NXTLEG1
  801.                 LD (TEK_ZAP),BC
  802.                 RET
  803.  
  804. PRVLEGZ         LD BC,(TEK_ZAP)
  805.                 CALL CPTEKZP
  806.                 CALL CP_TWOT
  807.                 RET Z
  808. PRVLEG1         DEC BC
  809.                 CALL CPTEKZP
  810.                 CP 0x0F
  811.                 JR Z,PRVLEG1
  812.                 CP 8
  813.                 JR Z,PRVLEG1
  814.                 LD A,E
  815.                 CP 0xE5
  816.                 JR Z,PRVLEG1
  817.                 LD (TEK_ZAP),BC
  818.                 RET
  819.  
  820. SAVEZP          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. LOADZP          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_P5,RAM_MOUNTER
  920.                 LD A,(SETDVOL)
  921.                 LD D,A
  922.                 ADD A,HIGH (TEK_BUFPATH + CPU5) + 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_P5,RAM_MOUNTER
  942.                 BIT 7,E
  943.                 JR NZ,MINUS_PATH
  944. ; добавление директории к текущему пути (вход в директорию)
  945.                 EX DE,HL
  946.                 LD A,(SETDVOL)
  947.                 ADD A,HIGH (TEK_BUFPATH + CPU5) + 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. RENEWPATH3      DEC DE
  957.                 LD A,(DE)
  958.                 INC DE
  959.                 CP " "
  960.                 JR NZ,RENEWPATH2
  961.                 DEC DE
  962.                 DJNZ RENEWPATH3
  963. RENEWPATH2      LD A,(HL)
  964.                 CP " "
  965.                 JR Z,RENEWPATH4
  966.                 LD A,"."
  967.                 LD (DE),A
  968.                 INC DE
  969.                 LD BC,3
  970.                 LDIR
  971.                 LD B,3
  972. RENEWPATH5      DEC DE
  973.                 LD A,(DE)
  974.                 INC DE
  975.                 CP " "
  976.                 JR NZ,RENEWPATH4
  977.                 DEC DE
  978.                 DJNZ RENEWPATH5
  979. RENEWPATH4      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,(SETDVOL)
  991.                 ADD A,HIGH (TEK_BUFPATH + CPU5) + 4
  992.                 LD H,A
  993.                 LD L,0xFF
  994.                 LD L,(HL)
  995.                 DEC L
  996.                 DEC L
  997. MINUS_PATH1     DEC L
  998.                 LD A,(HL)
  999.                 CP "/"
  1000.                 JR NZ,MINUS_PATH1
  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_P5,RAM_MOUNTER
  1012.                 LD A,IYL
  1013.                 AND A
  1014.                 JR NZ,GETPATH1
  1015.                 LD A,(SETDVOL)
  1016.                 LD D,A
  1017.                 ADD A,HIGH (TEK_BUFPATH+CPU5)+4
  1018.                 LD H,A
  1019.                 LD L,0xFF
  1020.                 LD A,(HL)
  1021.                 LD DE,BUF_256
  1022.                 LD BC,0x100
  1023.                 LD L,C
  1024.                 LDIR
  1025.                 LD C,A                          ; BC=сколько байт переносить в адрес по запросу
  1026.                 LD A,HIGH (CPU6) - 1
  1027.                 ADD A,D
  1028.                 LD H,A
  1029.                 LD DE,(RREG_L)                  ; куда переносить путь
  1030.                 JP LDIR_BYTES
  1031.  
  1032. GETPATH1        PUSH HL
  1033.                 PUSH HL
  1034.                 LD A,(SETDVOL)
  1035.                 LD D,A
  1036.                 ADD A,HIGH (TEK_BUFPATH + CPU5) + 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. NO_LNG2         DEC HL
  1053.                 LD A,(HL)
  1054.                 CP " "
  1055.                 JR Z,NO_LNG2
  1056.                 INC HL
  1057.                 LD A,(DE)
  1058.                 EX DE,HL
  1059.                 CP " "
  1060.                 JR Z,NO_LNG1
  1061.                 EX DE,HL
  1062.                 LD (HL),"."
  1063.                 INC HL
  1064.                 EX DE,HL
  1065.                 LDI
  1066.                 LDI
  1067.                 LDI
  1068. NO_LNG1         EX DE,HL
  1069.                 LD (HL),0
  1070.                 LD A,L
  1071.                 LD (RREG_A),A
  1072.                 POP HL
  1073.                 RET
  1074.  
  1075. GETLNG8         POP IY
  1076.                 LD DE,CPU6
  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,GETLNG9
  1086.                 PUSH IY
  1087.                 LD IYL,INTERNAL
  1088.                 LD HL,GETLNG8
  1089.                 PUSH HL
  1090.                 LD HL,BUF_256
  1091. GETLNG9         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. GETLNG2         DEC BC
  1100.                 CALL GETRZAP
  1101.                 LD A,(HL)
  1102.                 INC HL
  1103.                 EXX
  1104.                 BIT 6,C
  1105.                 POP HL
  1106.                 JR NZ,GETLNGE + 1
  1107.                 LD C,A
  1108.                 EXX
  1109.                 LD A,5
  1110.                 CALL GETLNG1
  1111.                 AND A
  1112.                 JR Z,GETLNGE
  1113.                 INC HL
  1114.                 INC HL
  1115.                 INC HL
  1116.                 LD A,6
  1117.                 CALL GETLNG1
  1118.                 AND A
  1119.                 JR Z,GETLNGE
  1120.                 INC HL
  1121.                 INC HL
  1122.                 LD A,2
  1123.                 CALL GETLNG1
  1124.                 AND A
  1125.                 JR Z,GETLNGE
  1126.                 EXX
  1127.                 PUSH HL
  1128.                 EXX
  1129.                 JR GETLNG2
  1130.  
  1131. GETLNGE         EXX
  1132.                 LD (HL),0
  1133.                 LD A,L
  1134.                 LD (RREG_A),A
  1135.                 EXX
  1136.                 POP HL
  1137.                 RET
  1138.  
  1139. GETLNG1         EXX
  1140.                 LD B,A
  1141.                 EXX
  1142.                 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,GETLNG3
  1152.                 LD A,D
  1153.                 CP 0x80
  1154.                 JR C,GETLNG5
  1155.                 LD D,0x5F
  1156.                 JR GETLNG5
  1157.  
  1158. GETLNG3         CP 4
  1159.                 LD A,0x5F
  1160.                 JR NZ,GETLNG5
  1161.                 LD A,D
  1162.                 LD E,0xEF
  1163.                 LD D,0x5F
  1164.                 CP 1
  1165.                 JR Z,GETLNG4
  1166.                 LD E,0xA0
  1167.                 CP 0x51
  1168.                 JR Z,GETLNG4
  1169.                 SUB 0x10
  1170.                 LD E,0x80
  1171.                 JR NC,GETLNG6
  1172.                 LD A,D
  1173.                 JR GETLNG5
  1174.  
  1175. GETLNG6         CP 0x30
  1176.                 JR C,GETLNG4
  1177.                 LD E,0xB0
  1178.                 CP 0x40
  1179.                 JR C,GETLNG4
  1180.                 LD A,D
  1181.                 JR GETLNG5
  1182.  
  1183. GETLNG4         ADD A,E
  1184. GETLNG5         EXX
  1185.                 LD (HL),A
  1186.                 INC HL
  1187.                 DEC B
  1188.                 EXX
  1189.                 RET Z
  1190.                 JR GETLNG1 + 3
  1191. ;401,410-44F,451
  1192.  
  1193. ; на входе:  DE = список расширений
  1194. ;            HL = адрес описателя файла
  1195. ; на выходе:  A = номер расширения
  1196. CP_EXT          LD C,0
  1197. CPETR2          LD A,(DE)
  1198.                 AND A
  1199.                 JR Z,CPETR1
  1200.                 INC C
  1201.                 PUSH DE
  1202.                 PUSH HL
  1203.                 CALL COMPARF
  1204.                 POP HL
  1205.                 POP DE
  1206.                 LD A,C
  1207.                 RET Z
  1208.                 INC DE
  1209.                 INC DE
  1210.                 INC DE
  1211.                 JR CPETR2
  1212.  
  1213. CPETR1          DEC A
  1214.                 RET
  1215.  
  1216. COMPARF         PUSH DE
  1217.                 LD DE,8
  1218.                 ADD HL,DE
  1219.                 POP DE
  1220. COMPARF1        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_TEMP2
  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 (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,(TEK_LVL)
  1253.                 AND A
  1254.                 EXX
  1255.                 JR NZ,FINDF2
  1256.                 LD A,(FATType)
  1257.                 CP 2
  1258.                 JR NC,FINDF2
  1259.                 EXX
  1260.                 LD BC,(ROOTZAP)
  1261.                 EXX
  1262. FINDF2          INC BC
  1263.                 CALL RDDIRSC
  1264.                 LD A,C
  1265.                 AND 0x0F
  1266.         REPT 4
  1267.                 ADD A,A
  1268.         ENDM
  1269.                 LD E,A
  1270.                 LD D,0
  1271.                 EX DE,HL
  1272.                 ADD HL,HL
  1273.                 ADD HL,DE
  1274.                 EXX
  1275.                 DEC BC
  1276.                 LD A,B
  1277.                 OR C
  1278.                 EXX
  1279.                 JR Z,FINDF3
  1280.                 LD A,(HL)
  1281.                 AND A
  1282.                 JR Z,FINDF3
  1283.                 CP "."
  1284.                 JR NZ,FINDF21
  1285.                 INC HL
  1286.                 LD A,(HL)
  1287.                 DEC HL
  1288.                 CP " "
  1289.                 JR Z,FINDF2
  1290. FINDF21         CP 0xE5                         ; если удалено
  1291.                 JR Z,FINDF2                     ; то переходим на следующий описатель
  1292.                 LD DE,0x0B                      ; нужен флаговый байт описателя
  1293.                 ADD HL,DE                       ; получили адрес флагового байта
  1294.                 LD A,(HL)                       ; взяли флаговый байт
  1295.                 SBC HL,DE
  1296.                 CP 0x0F
  1297.                 JR Z,FINDF2
  1298.                 AND 0x10                        ; проверка это файл или дира
  1299.                 JR NZ,FINDF1
  1300.                 LD A,(EXT4FOUND)
  1301.                 AND A
  1302.                 PUSH DE
  1303.                 LD DE,EXT4FOUND
  1304.                 PUSH BC
  1305.                 CALL NZ,CP_EXT
  1306.                 POP BC
  1307.                 POP DE
  1308.                 JR NZ,FINDF4
  1309. FINDF1          EX DE,HL
  1310.                 ADD HL,DE
  1311.                 LD A,(HL)
  1312.                 EX AF,AF'
  1313.                 LD HL,(ADR_SKLAD)               ; для диры проверять больше не надо
  1314.                 LD (HL),C
  1315.                 INC HL
  1316.                 LD (HL),B                       ; положили номер диры в табличку
  1317.                 INC HL
  1318.                 LD (ADR_SKLAD),HL
  1319.                 LD HL,(KOLFIND)
  1320.                 INC HL                          ; +1 найденных файлов
  1321.                 LD (KOLFIND),HL
  1322.                 LD HL,(ADR_SKLAD_NAME)
  1323.                 EX AF,AF'
  1324.                 LD (HL),A
  1325.                 INC HL
  1326.                 LD A,(DE)
  1327.                 LD (HL),A
  1328.                 INC HL
  1329.                 LD (ADR_SKLAD_NAME),HL
  1330. FINDF4          LD A,(ADR_SKLAD + 1)
  1331.                 CP HIGH (CPU3) + 0x10
  1332.                 JR C,FINDF2                     ; не более 2048 диров/файлов в текущей директории
  1333. FINDF3          LD HL,(KOLFIND)
  1334.                 POP IY
  1335.                 LD A,IYL
  1336.                 AND A
  1337.                 JR NZ,FINDF5
  1338.                 LD A,RAM_TEMP2
  1339.                 LD (RREG_A),A
  1340.                 LD (RREG_C),HL
  1341. FINDF5          LD (KOL_FOUNDED),HL
  1342.                 LD B,H
  1343.                 LD C,L
  1344.                 XOR A
  1345.                 RET
  1346.  
  1347. SET_MASK_EXT    LD A,(RREG_A)
  1348.                 AND A
  1349.                 JR NZ,SET_MASK_EXT1
  1350.                 LD (EXT4FOUND),A
  1351.                 RET
  1352.  
  1353. SET_MASK_EXT1   LD HL,(RREG_L)
  1354.                 LD DE,BUF_256 - CPU6
  1355.                 LD BC,0x10 * 3 + 1
  1356.                 CALL LDIR_BYTES
  1357.                 LD HL,BUF_256
  1358.                 LD DE,EXT4FOUND
  1359.                 LD BC,0x10FF
  1360. SET_MASK_EXT2   LD A,(HL)
  1361.                 AND A
  1362.                 JR Z,SET_MASK_EXT3
  1363.                 LDI
  1364.                 LDI
  1365.                 LDI
  1366.                 DJNZ SET_MASK_EXT2
  1367. SET_MASK_EXT3   XOR A
  1368.                 LD (DE),A
  1369.                 RET
  1370.  
  1371. LD_FILE6        PUSH AF
  1372.                 POP HL
  1373.                 LD (RREG_F),HL
  1374. LD_FILE8        EXX
  1375.                 LD (SAVE_IY),DE                 ; IY
  1376.                 EXX
  1377.                 RET
  1378.  
  1379. ; IXL - L - количество секторов для загрузки
  1380. ; IXH - H - размер кластера
  1381. ; IYL - E -
  1382. ; IYH - D - смещение в кластере
  1383. READ_FILE       EX AF,AF'
  1384.                 LD A,IYL
  1385.                 DEC A
  1386.                 JR Z,LD_FILE00
  1387.                 LD IYL,INT4EXT
  1388.                 LD HL,LD_FILE6
  1389.                 PUSH HL
  1390.                 LD HL,(RREG_L)                  ; адрес загрузки
  1391.                 EXX
  1392.                 LD DE,(SAVE_IY)                 ; смещение в кластере
  1393.                 LD A,(SecPerClus)
  1394.                 LD H,A                          ; количество секторов в кластере
  1395.                 LD A,(RREG_A)
  1396.                 LD L,A                          ; количество секторов для загрузки
  1397.                 EXX
  1398.                 JR LD_FILE0
  1399.  
  1400. LD_FILE00       EXX
  1401.                 LD DE,(SAVE_IY)                 ; смещение в кластере
  1402.                 LD HL,LD_FILE8
  1403.                 PUSH HL
  1404.                 LD A,(SecPerClus)               ; КОЛИЧЕСТВО СЕКТОРОВ В КЛАСТЕРЕ
  1405.                 LD H,A
  1406.                 EX AF,AF'
  1407.                 LD L,A                          ; количество секторов для загрузки
  1408.                 EXX
  1409. ; IXL - L - количество секторов для загрузки
  1410. ; IXH - H - размер кластера
  1411. ; IYL - E -
  1412. ; IYH - D - смещение в кластере
  1413. LD_FILE0        LD DE,(AFILCLS)
  1414.                 LD BC,(AFILCLS+2)               ; текущий номер кластера
  1415.                 PUSH BC
  1416.                 PUSH DE
  1417.                 PUSH HL
  1418.                 CALL REALSEC                    ; перевели номер кластера в номер сектора
  1419.                 EXX
  1420.                 LD A,D                  ; IYH
  1421.                 EXX
  1422.                 LD L,A
  1423.                 LD H,0
  1424.                 ADD HL,DE
  1425.                 EX DE,HL
  1426.                 JR NC,LD_FILE1
  1427.                 INC BC                          ; BCDE=номер сектора откуда грузить
  1428. LD_FILE1        EXX
  1429.                 LD A,L                  ; IXL
  1430.                 CP H                    ; IXH
  1431.                 JP C,LD_FILE2
  1432.                 LD A,H                  ; IXH
  1433. LD_FILE2        ADD A,D                 ; IYH
  1434.                 CP H                    ; IXH
  1435.                 LD A,L                  ; IXL
  1436.                 JP C,LD_FILE5
  1437.                 LD A,H                  ; IXH
  1438.                 SUB D                   ; IYH
  1439. LD_FILE5        LD E,A                  ; IYL,A ; сколько секторов сейчас грузим
  1440.                 EXX
  1441.                 POP HL                          ; восстановили адрес загрузки
  1442. ;               LD IYL,INT4EXT
  1443.                 CALL TO_DRV
  1444.                 DB _DEV_READ
  1445.                 LD A,IYL
  1446.                 DEC A
  1447.                 JR Z,LD_FILE7
  1448.                 LD (RREG_L),HL
  1449. LD_FILE7        POP DE
  1450.                 POP BC                          ; восстановили номер кластера
  1451.                 EXX
  1452.                 LD A,D                  ; IYH
  1453.                 ADD A,E                 ; IYL
  1454.                 CP H                    ; IXH
  1455.                 JP C,LD_FILE3
  1456.                 SUB H                   ; IXH
  1457. LD_FILE3        LD D,A                  ; IYH,A
  1458.                 EXX
  1459.                 JP C,LD_FILE4
  1460.                 PUSH HL                         ; сохранили адрес загрузки
  1461.                 PUSH IY
  1462.                 LD IYL,INTERNAL
  1463.                 CALL RDFATZP                    ; прочитали номер следующего кластера
  1464.                 POP IY
  1465.                 LD (AFILCLS),DE
  1466.                 LD (AFILCLS + 2),BC
  1467.                 CALL LST_CLS                    ; проверили, а может это последний кластер?
  1468.                 POP HL                          ; восстановили адрес загрузки
  1469.                 RET C                           ; если последний, выходим
  1470. LD_FILE4        EXX
  1471.                 LD A,L                  ; IXL
  1472.                 SUB E                   ; IYL
  1473.                 EXX
  1474.                 RET Z
  1475.                 EXX
  1476.                 LD L,A                  ; IXL,A
  1477.                 EXX
  1478.                 JP NZ,LD_FILE0
  1479.                 RET
  1480.  
  1481. OPEN_FILE       LD A,IYL
  1482.                 AND A
  1483.                 JR NZ,OPENFILE1
  1484.                 LD HL,EOPEN_FILE
  1485.                 PUSH HL
  1486. OPENFILE1       PUSH IY
  1487.                 LD IYL,INTERNAL
  1488.                 CALL READ_DIR
  1489.                 LD DE,FILE_SRC
  1490.                 LD BC,_DIR_StructSize
  1491.                 PUSH DE
  1492.                 LDIR
  1493.                 LD HL,0
  1494.                 LD A,(FATType)
  1495.                 CP 2
  1496.                 JR C,OPENFILE2                  ; если это не FAT32 то старшие 16 бит обнуляем
  1497.                 LD HL,(FILE_SRC + _DIR_FstClusHI)
  1498. OPENFILE2       LD (AFILCLS + 2),HL
  1499.                 LD HL,(FILE_SRC + _DIR_FstClusLO)
  1500.                 LD (AFILCLS),HL
  1501.                 LD HL,(TEK_ZAP)
  1502.                 LD (NUM_FILE_SRC),HL
  1503.                 XOR A
  1504.                 LD H,A
  1505.                 LD L,A
  1506.                 LD (SAVE_IY),HL
  1507.                 POP HL
  1508.                 POP IY
  1509.                 RET
  1510.  
  1511. EOPEN_FILE      PUSH AF
  1512.                 POP HL
  1513.                 LD (RREG_F),HL
  1514.                 RET
  1515.  
  1516. EFINDNAME       LD HL,(TEK_ZAP)
  1517.                 LD (RREG_C),HL
  1518.                 PUSH AF
  1519.                 POP HL
  1520.                 LD (RREG_F),HL
  1521.                 RET
  1522.  
  1523. FIND_NAME       LD A,IYL
  1524.                 AND A
  1525.                 JR NZ,FINDNAME01
  1526.                 PUSH HL
  1527.                 LD HL,(RREG_L)
  1528.                 LD DE,BUF_256 - CPU6
  1529.                 LD BC,0x10
  1530.                 CALL LDIR_BYTES
  1531.                 LD HL,EFINDNAME
  1532.                 EX (SP),HL
  1533. FINDNAME01      PUSH IY
  1534.                 LD IYL,INTERNAL
  1535.                 LD HL,BUF_256
  1536.                 LD DE,FB_EXT
  1537.                 LD BC,0x8FF
  1538.                 LD A,(HL)
  1539.                 CP "."
  1540.                 JR NZ,FINDNAME02
  1541.                 LDI
  1542.                 LDI
  1543.                 LD B,6
  1544. FINDNAME02      LD A,(HL)
  1545.                 CP "!"
  1546.                 JR C,FINDNAME03
  1547.                 CP "."
  1548.                 JR Z,FINDNAME12
  1549.                 LDI
  1550.                 DJNZ FINDNAME02
  1551.                 LD A,(HL)
  1552.                 CP "!"
  1553.                 JR C,FINDNAME06
  1554.                 INC HL
  1555.                 JR FINDNAME06
  1556.  
  1557. FINDNAME12      INC HL
  1558. FINDNAME03      LD A," "
  1559. FINDNAME05      LD (DE),A
  1560.                 INC DE
  1561.                 DJNZ FINDNAME05
  1562. FINDNAME06      LD B,3
  1563. FINDNAME08      LD A,(HL)
  1564.                 CP "!"
  1565.                 JR C,FINDNAME07
  1566.                 LDI
  1567.                 DJNZ FINDNAME08
  1568.                 CALL POSTF02
  1569.                 JR FINDNAME11
  1570.  
  1571. FINDNAME07      LD A," "
  1572. FINDNAME09      LD (DE),A
  1573.                 INC DE
  1574.                 DJNZ FINDNAME09
  1575.                 CALL POSTF02
  1576.                 JR FINDNAME11
  1577.  
  1578. FINDNAME10      CALL NXTLEGZ
  1579. FINDNAME11      PUSH HL
  1580.                 CALL CMP_NAME
  1581.                 POP HL
  1582.                 JR Z,FINDNAME13
  1583.                 LD A,(HL)
  1584.                 AND A
  1585.                 JR NZ,FINDNAME10
  1586.                 SCF
  1587. FINDNAME13      POP IY
  1588.                 RET
  1589.  
  1590. CMP_NAME        LD DE,FB_EXT
  1591. ICMP_NAME       LD B,0x0B
  1592. CMP_NAME_B      LD A,(DE)
  1593.                 CP "a"
  1594.                 JR C,CMPNAME01
  1595.                 CP "{"
  1596.                 JR NC,CMPNAME01
  1597.                 AND %11011111
  1598. CMPNAME01       CP (HL)
  1599.                 RET NZ
  1600.                 INC DE
  1601.                 INC HL
  1602.                 DJNZ CMP_NAME_B
  1603.                 XOR A
  1604.                 RET
  1605.  
  1606. ; вхождение в dir
  1607. ENTER_DIR       LD IYL,INTERNAL
  1608.                 CALL READ_DIR
  1609.                 PUSH AF
  1610.                 PUSH DE
  1611.                 PUSH HL
  1612.                 CALL RENEW_PATH
  1613.                 POP HL
  1614.                 POP DE
  1615.                 POP AF
  1616.                 BIT 4,A
  1617.                 EX AF,AF'
  1618.                 LD A,E
  1619.                 EX AF,AF'
  1620.                 LD E,A
  1621.                 LD D,(HL)
  1622.                 RET Z
  1623.                 EXX
  1624.                 EX AF,AF'
  1625.                 BIT 7,A
  1626.                 JR Z,ENT_DI2
  1627.                 LD HL,TEK_LEV
  1628.                 LD A,(HL)
  1629.                 AND A
  1630.                 EXX
  1631.                 RET Z
  1632.                 EXX
  1633.                 DEC A
  1634.                 LD (HL),A
  1635.                 ADD A,A
  1636.                 LD H,HIGH (BUF_DIRCEP + CPU6)
  1637.                 LD L,A
  1638.                 LD A,(HL)
  1639.                 INC L
  1640.                 LD H,(HL)
  1641.                 LD L,A
  1642.                 JR ENT_DI1
  1643.  
  1644. ENT_DI2         LD HL,TEK_LEV
  1645.                 LD A,(HL)
  1646.                 INC A
  1647.                 CP 0x10
  1648.                 EXX
  1649.                 RET Z
  1650.                 EXX
  1651.                 LD (HL),A
  1652.                 DEC A
  1653.                 ADD A,A
  1654.                 LD H,HIGH (BUF_DIRCEP + CPU6)
  1655.                 LD L,A
  1656.                 LD BC,(TEK_ZAP)
  1657.                 LD (HL),C
  1658.                 INC L
  1659.                 LD (HL),B
  1660. ENT_DI1         EXX
  1661.                 PUSH DE
  1662.                 LD DE,_DIR_FstClusHI
  1663.                 ADD HL,DE
  1664.                 LD C,(HL)
  1665.                 INC HL
  1666.                 LD B,(HL)
  1667.                 LD E,5
  1668.                 ADD HL,DE
  1669.                 LD E,(HL)
  1670.                 INC HL
  1671.                 LD D,(HL)
  1672.                 LD A,B
  1673.                 OR C
  1674.                 OR D
  1675.                 OR E
  1676.                 JR NZ,ENT_DI0
  1677.                 LD DE,(RootDIRCluster)
  1678.                 LD BC,(RootDIRCluster + 2)
  1679. ENT_DI0         LD (CurrentDIRCluster),DE
  1680.                 LD (CurrentDIRCluster + 2),BC
  1681.                 POP DE
  1682. INIT_TEKDIR     PUSH DE
  1683.                 PUSH IY
  1684.                 LD IYL,INTERNAL
  1685.                 CALL INIRTSC
  1686.                 POP IY
  1687.                 POP DE
  1688.                 RET
  1689.