Subversion Repositories pentevo

Rev

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

  1.  
  2. ; LAST UPDATE: 15.01.2022 savelij
  3.  
  4.         TITLE "mounter.a80 ROM_RST83"
  5.  
  6. MOUNTER         CALL P5_READ_BYTE
  7.                 LD A,(NEXTBYTERST8)
  8.                 ADD A,A
  9.                 LD E,A
  10.                 LD D,0
  11.                 LD HL,TAB_MOUNTER
  12.                 ADD HL,DE
  13.                 LD A,(HL)
  14.                 INC HL
  15.                 LD H,(HL)
  16.                 LD L,A
  17.                 JP (HL)
  18.                
  19. TAB_MOUNTER     DW OPEN_MOUNT                           ; монтирование образа
  20.                 DW RDWR_MOUNT                           ; чтение/запись примонтированных образов
  21.                 DW FIND_MOUNTED                         ; поиск монтируемых образов прописанных в IMAGE.FNT
  22.                 DW GET_MOUNTED                          ; получение буфера описателей примонтированных образов
  23.                 DW CLOSEMOUNT                           ; демонтирование образа
  24.                 DW LOADIMAGE                            ; загрузка образа в рамдиск
  25.                 DW REST_NAMELOAD                        ; получение описателя файла загруженного в рамдиск
  26.                 DW CMP_DRIVE                            ; проверка примонтированного образа на указанной букве
  27.                 DW GET_VIRT_BITS                        ; получение битов смонтированных дисков
  28.                 DW SET_VIRTREAL                         ; переключение реального/виртуального дисковода
  29.                 DW SET_REAL
  30.                 DW SET_VIRT
  31. ;               DW MOUNT_RAMDISK                        ; монтирование рамдиска
  32. ;               DW SET_RAMDISK                          ; отключение/установка рамдиска
  33.  
  34. NOFUNC          RET
  35.  
  36. ; загрузка образа в рамдиск
  37. LOADIMAGE       LD IYL,INTERNAL
  38.                 CALL OPEN_FILE
  39.                 PUSH HL
  40.                 LD DE,SUPPORT_EXT
  41.                 CALL CP_EXT
  42.                 LD (EXT_TYPE),A
  43.                 LD HL,FILE_SRC
  44.                 LD DE,NAME_RAMDISK
  45.                 LD BC,0X20
  46.                 LDIR
  47.                 POP HL
  48.                 CP _TAP
  49.                 JR Z,LOAD_TAPE
  50.                 CP _FDI
  51.                 JP Z,LOAD_FDI
  52.                 CP _SCL
  53.                 JP Z,LOAD_SCL
  54.                 LD A,RAM_DATARAMD
  55. ILD_IMG1        PUSH AF
  56.                 LD BC,WIN_P5
  57.                 OUT (C),A
  58.                 LD A,0X20
  59.                 LD HL,CPU5
  60.                 CALL READ_FILE
  61.                 JR C,ILD_IMG2
  62.                 POP AF
  63.                 INC A
  64.                 JR ILD_IMG1
  65.  
  66. LOAD_TAPE       LD A,RAM_TAPE
  67.                 JR ILD_IMG1
  68.  
  69. ILD_IMG2        POP AF
  70.                 LD A,(EXT_TYPE)
  71.                 SUB _TAP
  72.                 RET Z                                   ; если TAP то на выход
  73. ; для TRD образа генерация таблицы секторов/дорожек
  74.                 EVOPORT WIN_P5,RAM_DATARAMD             ; нужна страница откуда начинается загруженный образ
  75. ILD_IMG3        LD HL,(CPU5+0X8E1)                      ; первый свободный трек сектор
  76.                 LD A,L
  77.                 LD L,H
  78.                 LD H,0
  79.                 ADD HL,HL
  80.                 ADD HL,HL
  81.                 ADD HL,HL
  82.                 ADD HL,HL
  83.                 OR L
  84.                 LD L,A                                  ; количество занятых секторов с директорией
  85.                 LD DE,(CPU5+0X8E5)                      ; количество свободных секторов
  86.                 ADD HL,DE
  87.                 ADD HL,HL
  88.                 ADD HL,HL
  89.                 ADD HL,HL
  90.                 ADD HL,HL                               ; H=количество дорожек
  91.                 LD A,H
  92.                 CP 0XA0
  93.                 JR NC,ELT3
  94. ELT4            LD A,0XA0
  95. ELT3            EX AF,AF'
  96.                 EVOPORT WIN_P5,RAM_RAMDISK              ; нужна страница начала рамдиска, где будет таблица описателей
  97.                 LD HL,CPU5
  98.                 PUSH HL
  99.                 LD DE,CPU5+1
  100.                 LD BC,0X3FFF
  101.                 LD (HL),L
  102.                 LDIR                                    ; очистили страницу
  103.                 POP DE                                  ; адрес начала страницы
  104.                 LD HL,0                                 ; смещение в блоках и страницах
  105.                 EX AF,AF'
  106. ELT2            EX AF,AF'
  107.                 LD BC,0X1000                            ; счетчик номеров секторов и их номера
  108.                 LD A,L
  109.                 RRCA
  110.                 RRCA
  111.                 LD (DE),A                               ; смещение в блоках дорожки в странице
  112.                 INC D
  113.                 LD A,H
  114.                 LD (DE),A                               ; смещение в страницах до дорожки
  115.                 INC D
  116. ELT1            INC C
  117.                 LD A,C
  118.                 LD (DE),A                               ; номер сектора
  119.                 INC D
  120.                 LD A,2
  121.                 LD (DE),A                               ; размер сектора
  122.                 INC D
  123.                 DJNZ ELT1                               ; вносим в таблицу все номера секторов с размерами
  124.                 LD D,HIGH (CPU5)                        ; вернули указатель в начало
  125.                 INC E                                   ; для следующей дорожки
  126.                 LD BC,0X40
  127.                 ADD HL,BC                               ; переход к следующей дорожке
  128.                 EX AF,AF'
  129.                 DEC A
  130.                 JR NZ,ELT2                              ; повторяем для всех дорожек
  131. ; общий выход из загрузки с возвратом стандартной страницы в окне проецирования 1
  132. ELOAD_IMAGE     LD HL,CPU5+0X3FFF
  133.                 LD (HL),"R"
  134.                 DEC H
  135.                 LD (HL),"D"
  136.                 DEC H
  137. ; перенос имени файла загруженного в рамдиск
  138.                 LD DE,NAME_RAMDISK
  139.                 LD B,8+3
  140. .L1             LD A,(DE)
  141.                 LD (HL),A
  142.                 INC DE
  143.                 DEC H
  144.                 DJNZ .L1
  145.                 XOR A
  146.                 RET
  147.  
  148. ELT5            POP AF
  149.                 EVOPORT WIN_P5,RAM_RAMDISK
  150.                 JR ELOAD_IMAGE
  151.  
  152. ; инфа для создания 9 сектора нового диска
  153. DSKINFO         DB 0                                    ; +0xE1 номер первого свободного сектора
  154.                 DB 1                                    ; +0xE2 номер первого свободного трека
  155.                 DB 0X16                                 ; +0xE3 тип дискеты
  156.                 DB 0                                    ; +0xE4 количество файлов на дискете
  157. SECFREE         DW 2544                                 ; +0xE5 количество свободных секторов
  158.                 DB 0X10                                 ; +0xE7 идентификационный код TRDOS
  159.                 DW 0                                    ; +0xE8 2 байта 0
  160.                 DUPL 9,0X20                             ; +0xEA 9 байт 0x20
  161.                 DB 0                                    ; +0xF3 1 байт 0
  162.                 DB 0                                    ; +0xF4 количество удаленных файлов
  163.                 DB "RAMDISKO"                           ; +0xF5 имя дискеты
  164. DSK_END
  165.  
  166. ; загрузка SCL образа
  167. LOAD_SCL        EVOPORT WIN_P5,RAM_DATARAMD
  168.                 EVOPORT WIN_P3,RAM_MOUNTER
  169.                 LD A,RAM_DATARAMD
  170. LOAD_IMAGE4     PUSH AF
  171.                 LD BC,WIN_P5
  172.                 OUT (C),A
  173.                 LD HL,CPU5+0X1000
  174.                 LD A,0X18
  175.                 CALL READ_FILE
  176.                 PUSH AF                                 ; сохранили флаг окончания загрузки на случай окончания образа
  177.                 LD HL,CPU5
  178.                 PUSH HL                                 ; сохранили адрес начала каталога
  179.                 LD (HL),L
  180.                 LD D,H
  181.                 LD E,L
  182.                 INC DE
  183.                 LD BC,0XFFF
  184.                 LDIR                                    ; зачистка области первой дорожки для формирования каталога диска
  185.                 LD HL,CPU5+0X1008                       ; адрес количества файлов в SCL образе
  186.                 LD A,(HL)                               ; взяли количество файлов как счетчик
  187.                 INC HL                                  ; перешли на первый описатель файла
  188.                 EXX
  189.                 LD HL,0                                 ; номер абсолютного сектора
  190.                 LD D,L                                  ; приращение секторов не может быть более 255 секторов
  191.                 LD B,A                                  ; сохранение количества файлов
  192.                 EXX
  193.                 POP DE                                  ; вернули адрес начала каталога диска
  194. LOAD_IMAGE3     EX AF,AF'
  195.                 LD BC,0X0D
  196.                 LDIR                                    ; перенесли 13 байт тела описателя
  197.                 LD A,(HL)                               ; забрали размер файла в секторах
  198.                 LDI                                     ; перенесли еще байт
  199.                 EXX
  200.                 LD E,A
  201.                 PUSH HL                                 ; сохранили текщее значение номера сектора
  202.                 ADD HL,DE                               ; увеличили текщее значение на размер файла в секторах
  203.                 EXX
  204.                 EX (SP),HL
  205.                 LD A,L
  206.                 ADD HL,HL
  207.                 ADD HL,HL
  208.                 ADD HL,HL
  209.                 ADD HL,HL
  210.                 INC H
  211.                 AND 0X0F
  212.                 LD L,A
  213.                 EX (SP),HL
  214.                 POP BC                                  ; восстановили текщий номер сектора
  215.                 EX DE,HL
  216.                 LD (HL),C
  217.                 INC HL
  218.                 LD (HL),B                               ; уложили после текущего описателя
  219.                 INC HL
  220.                 EX DE,HL
  221.                 EX AF,AF'
  222.                 DEC A
  223.                 JR NZ,LOAD_IMAGE3                       ; если файлы не кончились продолжаем
  224.                 PUSH HL                                 ; сохранили адрес начала данных
  225.                 LD HL,DSKINFO
  226.                 LD DE,CPU5+0X8E1
  227.                 LD BC,DSK_END-DSKINFO
  228.                 LDIR
  229.                 EXX
  230.                 LD DE,2544                              ; стандартный размер дискеты
  231.                 EX DE,HL
  232.                 AND A
  233.                 SBC HL,DE
  234.                 LD (CPU5+0X8E5),HL                      ; количество свободных секторов
  235.                 EX DE,HL
  236.                 LD A,L
  237.                 ADD HL,HL
  238.                 ADD HL,HL
  239.                 ADD HL,HL
  240.                 ADD HL,HL
  241.                 INC H
  242.                 AND 0X0F
  243.                 LD L,A
  244.                 LD (CPU5+0X8E1),HL                      ; первый свободный трек и сектор
  245.                 LD A,B
  246.                 LD (CPU5+0X8E4),A                       ; количество файлов на диске
  247.                 EXX
  248.                 POP DE                                  ; восстановление адреса начала данных
  249.                 LD HL,CPU6                              ; конец окна проецирования
  250.                 AND A
  251.                 SBC HL,DE                               ; получили количество байт для сдвига
  252.                 LD B,H
  253.                 LD C,L
  254.                 LD HL,CPU5+0X1000                       ; начало данных на рамдиске
  255.                 EX DE,HL
  256.                 LDIR                                    ; сдвинули, после переноса DE=адрес куда далее грузить
  257.                 LD A,D
  258.                 CP HIGH (CPU6)-2
  259.                 JR NC,LOAD_IMAGE7
  260.                 EX DE,HL
  261.                 LD A,HIGH (CPU6)-1
  262.                 SUB H
  263.                 SRL A
  264.                 LD IXL,A
  265.                 CALL READ_FILE
  266.                 LD DE,0X8000
  267.                 EX DE,HL
  268. LOAD_IMAGE7     AND A
  269.                 SBC HL,DE                               ; получили сколько байт осталось до конца окна
  270.                 LD (OST_HWOST),HL
  271.                 LD (KUDA_HWOST),DE
  272.                 LD DE,0
  273.                 EX DE,HL
  274.                 SBC HL,DE
  275.                 LD A,1
  276.                 AND H
  277.                 LD H,A
  278.                 LD (NEXT4PAGE),HL
  279.                 POP AF                                  ; восстановили флаг последней загрузки
  280.                 JP C,ILD_IMG2                           ; если файл уже кончился, то выход
  281.                 JR LOAD_IMAGE5
  282.  
  283. LOAD_IMAGE6     LD DE,CPU5
  284.                 LD BC,(NEXT4PAGE)
  285.                 LDIR
  286.                 EX AF,AF'
  287.                 JP C,ILD_IMG2
  288.                 EX DE,HL
  289.                 LD A,0X1F
  290.                 CALL READ_FILE
  291.                 JP C,ILD_IMG2
  292. LOAD_IMAGE5     LD HL,CPU3+BUF_TEMPSEC
  293.                 PUSH HL
  294.                 LD A,1
  295.                 CALL READ_FILE
  296.                 EX AF,AF'                               ; спрятали флаг загрузки сектора
  297.                 POP HL                                  ; восстановили адрес куда сектор в буфер загрузили
  298.                 LD DE,(KUDA_HWOST)                      ; куда ложит остаток в окне
  299.                 LD BC,(OST_HWOST)                       ; сколько переносить в конец страницы
  300.                 LDIR
  301.                 POP AF
  302.                 INC A
  303.                 PUSH AF
  304.                 LD BC,WIN_P5
  305.                 OUT (C),A
  306.                 JR LOAD_IMAGE6
  307.  
  308. ; загрузка FDI
  309. LOAD_FDI        LD A,RAM_RAMDISK                        ; страница начала рамдиска
  310.                 PUSH AF                                 ; сохранили на стеке
  311.                 EVOPORT WIN_P5,RAM_RAMDISK
  312.                 EVOPORT WIN_P3,RAM_MOUNTER
  313.                 LD HL,FDI_TABLE_CYL
  314.                 LD DE,FDI_TABLE_CYL+1
  315.                 LD BC,0X3FFF
  316.                 LD (HL),0
  317.                 LDIR                                    ; очистка страницы с описателями дорожек
  318.                 LD IXH,0XFF
  319.                 CALL LOAD1SECFDI                        ; принудительная загрузка первого сектора
  320.                 LD A,(CPU3+6)                           ; взяли количество сторон
  321.                 DEC A
  322.                 LD A,(CPU3+4)                           ; взяли количество дорожек
  323.                 JR Z,LOADFDI1
  324.                 ADD A,A                                 ; если сторон 2, то умножили количество дорожек на 2
  325. LOADFDI1        LD C,A                                  ; количество дорожек
  326.                 LD HL,(CPU3+0X0A)
  327.                 LD (START_DATA),HL
  328.                 LD DE,CPU5                              ; адрес буфера начала описателей дорожек
  329.                 LD HL,CPU3+0X0F                         ; адрес начала выборки описателей дорожек в FDI заголовке
  330. LOADFDI3        BIT 1,H
  331.                 CALL NZ,LOAD1SECFDI                     ; если вышли за пределы сектора меняем указатель и грузим следующий сектор в буфер
  332.                 LD A,(HL)                               ; биты 8-15 смещения дорожки от начала
  333.                 AND 0X3F                                ; взяли для 8-13 биты-смещение в блоках в странице
  334.                 LD (DE),A                               ; уложили смещение в блоках в странице
  335.                 LD A,(HL)                               ; взяли биты 14-15
  336.                 INC HL                                  ; следующий байт FDI заголовка
  337.                 INC D                                   ; здесь положим смещение в страницах до нужной дорожки
  338.                 BIT 1,H
  339.                 CALL NZ,LOAD1SECFDI                     ; если вышли за пределы сектора меняем указатель и грузим следующий сектор в буфер
  340.                 LD B,A                                  ; сохранили нужные 14-15 биты
  341.                 LD A,(HL)                               ; взяли 16-23 биты смещения дорожки от начала
  342.                 RL B
  343.                 RLA
  344.                 RL B
  345.                 RLA
  346.                 LD (DE),A                               ; укладка битов смещения номера страницы
  347.                 INC D
  348.                 REPT 4
  349.                 INC HL
  350.                 ENDM
  351.                 BIT 1,H
  352.                 CALL NZ,LOAD1SECFDI                     ; если вышли за пределы сектора меняем указатель и грузим следующий сектор в буфер
  353.                 LD B,(HL)                               ; взяли количество секторов на дорожке
  354.                 LD A,B
  355.                 AND A
  356.                 JP Z,LOADFDI_ERR
  357.                 INC HL
  358.                 INC HL
  359. LOADFDI4        INC HL
  360.                 BIT 1,H
  361.                 CALL NZ,LOAD1SECFDI                     ; если вышли за пределы сектора меняем указатель и грузим следующий сектор в буфер
  362.                 LDI                                     ; перенос номера сектора
  363.                 DEC DE
  364.                 INC C
  365.                 INC D
  366.                 BIT 1,H
  367.                 CALL NZ,LOAD1SECFDI                     ; если вышли за пределы сектора меняем указатель и грузим следующий сектор в буфер
  368.                 LD A,(HL)                               ; взяли размер сектора
  369.                 EX DE,HL
  370.                 LD (HL),1
  371.                 AND A
  372.                 JR Z,LOADFDI2
  373.                 LD (HL),2
  374.                 DEC A
  375.                 JR Z,LOADFDI2
  376.                 LD (HL),4
  377.                 DEC A
  378.                 JR Z,LOADFDI2
  379.                 LD (HL),8
  380. LOADFDI2        EX DE,HL
  381.                 INC D
  382.                 REPT 5
  383.                 INC HL
  384.                 ENDM
  385.                 DJNZ LOADFDI4                           ; возвращаемся для продолжения, пока сектора дорожки не кончатся
  386.                 LD D,0X40
  387.                 INC E
  388.                 DEC C
  389.                 JR NZ,LOADFDI3                          ; возвращаемся для продолжения пока не кончатся дорожки
  390.                 DEC HL
  391.                 BIT 1,H
  392.                 CALL NZ,LOAD1SECFDI                     ; если вышли за пределы сектора меняем указатель и грузим следующий сектор в буфер
  393.                 PUSH HL
  394.                 LD A,H
  395.                 AND 1
  396.                 LD B,A
  397.                 LD C,L
  398.                 LD A,IXH
  399.                 ADD A,A
  400.                 ADD A,B
  401.                 LD B,A
  402.                 LD HL,(START_DATA)
  403.                 AND A
  404.                 SBC HL,BC
  405.                 EX DE,HL
  406.                 POP HL
  407.                 LD A,D
  408.                 AND A
  409.                 JR Z,LOADFDI7
  410. LOADFDI8        INC H
  411.                 BIT 1,H
  412.                 CALL NZ,LOAD1SECFDI                     ; если вышли за пределы сектора меняем указатель и грузим следующий сектор в буфер
  413.                 DEC D
  414.                 JR NZ,LOADFDI8
  415. LOADFDI7        ADD HL,DE
  416.                 BIT 1,H
  417.                 CALL NZ,LOAD1SECFDI                     ; если вышли за пределы сектора меняем указатель и грузим следующий сектор в буфер
  418.                 PUSH HL                                 ; сохранили адрес на начало начала секторов
  419.                 LD DE,CPU3
  420.                 AND A
  421.                 SBC HL,DE
  422.                 LD (OSTAT_SECT),HL                      ; сколько байт перенести из хвоста сектора в буфере в начало страницы
  423.                 LD B,H
  424.                 LD C,L
  425.                 LD HL,0X200
  426.                 SBC HL,BC
  427.                 LD (NACH_SECT),HL                       ; сколько байт перенести из начала сектора в буфере в конец страницы
  428.                 POP HL                                  ; восстановили сдрес начала секторов, далее загрузка всех секторов в память
  429. LOADFDI5        POP AF
  430.                 INC A
  431.                 PUSH BC
  432.                 LD BC,WIN_P5
  433.                 OUT (C),A
  434.                 POP BC
  435.                 PUSH AF
  436.                 BIT 1,H
  437.                 CALL NZ,LOAD1SECFDI
  438.                 EX AF,AF'
  439.                 LD DE,CPU5
  440.                 LD BC,(NACH_SECT)
  441.                 LDIR
  442.                 EX AF,AF'
  443.                 JP C,ELT5
  444.                 EX DE,HL
  445.                 LD A,0X1F
  446.                 CALL READ_FILE
  447.                 JP C,ELT5
  448.                 PUSH HL
  449.                 LD HL,CPU3
  450.                 PUSH HL
  451.                 LD A,1
  452.                 CALL READ_FILE
  453.                 POP HL
  454.                 POP DE
  455.                 LD BC,(OSTAT_SECT)
  456.                 LDIR
  457.                 JR LOADFDI5
  458.  
  459. LOADFDI_ERR     POP AF
  460.                 EVOPORT WIN_P5,RAM_RAMDISK
  461.                 CALL FORMAT_RAMDISK
  462.                 LD IX,LDFDIERROR
  463.                 SCF
  464.                 RET
  465.  
  466. FORMAT_RAMDISK  EVOPORT WIN_P5,RAM_DATARAMD
  467.                 LD HL,CPU5
  468.                 LD DE,CPU5+1
  469.                 LD BC,0XFFF
  470.                 LD (HL),L
  471.                 LDIR
  472.                 LD HL,DSKINFO
  473.                 LD DE,CPU5+0X8E1
  474.                 LD BC,DSK_END-DSKINFO
  475.                 LDIR
  476.                 JP ILD_IMG3
  477.  
  478. ; загрузка следующего сектора заголовка FDI
  479. LOAD1SECFDI     PUSH HL
  480.                 PUSH BC
  481.                 PUSH DE
  482.                 PUSH AF
  483.                 LD HL,CPU3
  484.                 LD A,1
  485.                 CALL READ_FILE
  486.                 INC IXH
  487.                 POP AF
  488.                 POP DE
  489.                 POP BC
  490.                 POP HL
  491.                 RES 1,H
  492.                 RET
  493.  
  494. ; монтирование образа
  495. OPEN_MOUNT      LD A,(RREG_A)
  496. OPEN_MOUNT_INT  LD (MOUNT_SYM),A                        ; номер монтирумого диска
  497.                 LD IYL,INTERNAL
  498.                 EVOPORT WIN_P5,RAM_MOUNTER              ; включили страницу с описателями примонтированных файлов
  499.                 LD A,(MOUNT_SYM)                        ; номер монтирумого диска
  500.                 ADD A,HIGH (BUF_PATHMOUNT+CPU5)
  501.                 LD D,A
  502.                 LD E,0                                  ; DE=адрес буфера путей примонтированных файлов
  503.                 LD A,(SETDVOL)                          ; номер текущего устройства
  504.                 ADD A,HIGH (TEK_BUFPATH+CPU5)+4
  505.                 LD H,A
  506.                 LD L,E                                  ; HL=адрес пути на текущем устройстве
  507.                 LD BC,0X100
  508.                 PUSH DE
  509.                 LDIR                                    ; перенесли путь
  510.                 CALL READ_DIR                           ; прочитали описатель монтируемого файла
  511.                 POP DE
  512.                 PUSH HL
  513. OPENMOUNT05     LD A,(DE)
  514.                 INC DE
  515.                 AND A
  516.                 JR NZ,OPENMOUNT05
  517.                 DEC DE
  518.                 LD BC,0X8FF
  519. OPENMOUNT01     LDI
  520.                 LD A,(HL)
  521.                 CP "!"
  522.                 JR C,OPENMOUNT03
  523.                 DJNZ OPENMOUNT01
  524.                 LD A,"."
  525.                 LD (DE),A
  526.                 INC DE
  527.                 JR OPENMOUNT06
  528.  
  529. OPENMOUNT03     INC HL
  530.                 DJNZ OPENMOUNT03
  531.                 DEC HL
  532.                 LD A,"."
  533.                 LD (DE),A
  534.                 INC DE
  535. OPENMOUNT06     LD B,3
  536. OPENMOUNT02     LDI
  537.                 LD A,(HL)
  538.                 CP "!"
  539.                 JR C,OPENMOUNT04
  540.                 DJNZ OPENMOUNT02
  541. OPENMOUNT04     XOR A
  542.                 LD (DE),A
  543.                 POP HL
  544.                 LD A,(MOUNT_SYM)                        ; номер монтирумого диска
  545.                 PUSH HL
  546.                 LD B,A
  547.                 RRCA
  548.                 RRCA
  549.                 LD E,A
  550.                 LD A,B
  551.                 LD D,HIGH (MOUNT_DRIVES)
  552.                 LD IXH,D
  553.                 LD IXL,E                                ; IX=адрес описателя примонтированного файла
  554.                 LD (IX+_MOUNT_Mount_Num),B              ; номер монтируемого дисковода
  555.                 LD BC,0X20
  556.                 LDIR
  557.                 INC A
  558.                 LD H,%11110111
  559. OPENMOUNT1      RLC H
  560.                 DEC A
  561.                 JR NZ,OPENMOUNT1
  562.                 LD A,(CPU2+VIRT_BITS)
  563.                 AND H
  564.                 LD L,A
  565.                 LD A,H
  566.                 CPL
  567.                 OR L
  568.                 CALL WR_VIRT_BITS
  569.                 EVOPORT WIN_P5,RAM_MOUNTER              ; включили страницу с описателями примонтированных файлов
  570.                 POP HL
  571. ; HL=адрес описателя монтируемого файла
  572. IOPEN_MOUNT     LD DE,FILE_EXT
  573.                 CALL CP_EXT
  574.                 LD (IX+_MOUNT_Ext_Type),C               ; тип образа по расширению
  575.                 CALL ICOM_DEV
  576.                 DB _KOL_VOL
  577.                 LD (IX+_MOUNT_Vol_Type),A               ; тип раздела
  578.                 LD (IX+_MOUNT_Vol_Num),D                ; номер выбранного раздела
  579.                 LD L,D
  580.                 LD H,0
  581.                 ADD HL,HL
  582.                 ADD HL,HL
  583.                 ADD HL,HL
  584.                 LD DE,BUF_TABLVOL                       ; адрес таблицы найденных разделов
  585.                 ADD HL,DE
  586.                 LD A,(HL)
  587.                 CP _SD_SDZ
  588.                 LD HL,COMSDZ
  589.                 JR Z,OPENMOUNT6
  590.                 CP _SD_SDG
  591.                 LD HL,COMSDG
  592.                 JR Z,OPENMOUNT6
  593.                 LD HL,COMHDDN
  594. OPENMOUNT6      LD (IX+_MOUNT_Adr_Mnt_Drv),L
  595.                 LD (IX+_MOUNT_Adr_Mnt_Drv+1),H          ; адрес драйвера монтируемого образа
  596.  
  597.                 LD E,(IX+_MOUNT_FileSize+1)
  598.                 LD D,(IX+_MOUNT_FileSize+2)
  599.                 LD L,(IX+_MOUNT_FileSize+3)             ; LDE=размер файла/256
  600.                 LD A,(SecPerClus)
  601.                 LD H,A
  602. OPENMOUNT3      SRL L
  603.                 RR D
  604.                 RR E
  605.                 RRCA
  606.                 JR NC,OPENMOUNT3                        ; LDE=количество кластеров
  607. ; A00 секторов (256 байт) -> 500 секторов (512 байт)
  608. ; кластер=1 сектор      1280/8 байт     шаг=8
  609. ; кластер=2 сектора     640/4 байт      шаг=4
  610. ; кластер=4 сектора     320/2 байт      шаг=2
  611. ; кластер=8 секторов    160 байт        шаг=1
  612. ; кластер=16 секторов   80 байт         шаг=1
  613. ; кластер=32 сектора    40 байт         шаг=1
  614. ; кластер=64 сектора    20 байт         шаг=1
  615. ; кластер=128 секторов  10 байт         шаг=1
  616.                 LD IY,1<<8+INTERNAL
  617.                 LD A,H
  618.                 CP 8
  619.                 JR NC,OPENMOUNT5
  620.                 LD IYH,8
  621.                 RRCA
  622.                 JR C,OPENMOUNT5
  623.                 LD IYH,4
  624.                 RRCA
  625.                 JR C,OPENMOUNT5
  626.                 LD IYH,2
  627. OPENMOUNT5      LD A,IYH
  628.                 LD (IX+_MOUNT_Cls_Step),A               ; шаг кластеров
  629.                 LD A,(IX+_MOUNT_Mount_Num)              ; номер монтируемого дисковода
  630.                 ADD A,A
  631.                 ADD A,A
  632.                 ADD A,HIGH (MOUNT_CLS+CPU5)
  633.                 LD H,A
  634.                 LD L,0
  635.                 LD C,(IX+_MOUNT_FstClusHI)
  636.                 LD B,(IX+_MOUNT_FstClusHI+1)
  637.                 LD E,(IX+_MOUNT_FstClusLO)
  638.                 LD D,(IX+_MOUNT_FstClusLO+1)
  639.                 JR OPENMOUNT9
  640.  
  641. OPENMOUNT7      DEC IYH
  642.                 JR NZ,OPENMOUNT8
  643. OPENMOUNT9      LD A,(IX+_MOUNT_Cls_Step)               ; шаг кластеров
  644.                 LD IYH,A
  645.                 LD (HL),E
  646.                 INC H
  647.                 LD (HL),D
  648.                 INC H
  649.                 LD (HL),C
  650.                 INC H
  651.                 LD (HL),B
  652.                 DEC H
  653.                 DEC H
  654.                 DEC H
  655.                 INC L
  656. OPENMOUNT8      PUSH HL
  657.                 CALL RDFATZP
  658.                 CALL LST_CLS
  659.                 POP HL
  660.                 JR NC,OPENMOUNT7
  661.                 RET
  662.  
  663. FILE_EXT        DZ "TRD"
  664.  
  665. ; чтение/запись примонтированного образа
  666. ; HL=адрес чтения/записи
  667. ; D=номер трека, E=номер сектора+1
  668. ; A=номер дисковода (BIT 7=0-чтение, =1-запись)
  669. RDWR_MOUNT      LD A,(RREG_A)
  670.                 AND 3
  671.                 RRCA
  672.                 RRCA
  673.                 LD IXL,A
  674.                 LD IXH,HIGH (MOUNT_DRIVES)              ; IX=описатель дисководов A-D
  675.                 LD IYL,INTERNAL
  676.                 EVOPORT WIN_P5,RAM_FATVARS
  677.                 LD A,(SETDVOL)
  678.                 ADD A,HIGH (CPU5+BUF_ALLVOL)+4
  679.                 LD D,A
  680.                 LD E,0
  681.                 LD HL,BUF_TEKVOL
  682.                 LD BC,0X100
  683.                 LDIR
  684.                 LD A,(IX+_MOUNT_Vol_Num)
  685.                 ADD A,HIGH (CPU5+BUF_ALLVOL)+4
  686.                 LD H,A
  687.                 LD L,0
  688.                 LD DE,BUF_TEKVOL
  689.                 LD BC,0X100
  690.                 LDIR
  691.                 EVOPORT WIN_P5,RAM_MOUNTER
  692.                 LD HL,(GO_DEV)
  693.                 LD (IX+_MOUNT_Adr_Sel_Drv),L
  694.                 LD (IX+_MOUNT_Adr_Sel_Drv+1),H
  695.                 LD L,(IX+_MOUNT_Adr_Mnt_Drv)
  696.                 LD H,(IX+_MOUNT_Adr_Mnt_Drv+1)
  697.                 LD (GO_DEV),HL
  698.                 LD HL,(RREG_E)
  699.                 DEC L
  700.                 LD E,L
  701.                 LD L,H
  702.                 LD H,0
  703.                 LD D,H
  704.                 ADD HL,HL
  705.                 ADD HL,HL
  706.                 ADD HL,HL
  707.                 ADD HL,HL
  708.                 ADD HL,DE                               ; HL=номер сектора в файле (256 байт)
  709.                 PUSH HL
  710.                 LD A,(SecPerClus)
  711. RDWRMOUNT1      SRL H
  712.                 RR L
  713.                 RRCA
  714.                 JR NC,RDWRMOUNT1                        ; HL=номер кластера
  715. ; 0XA00 секторов (256 байт) -> 0X500 секторов (512 байт)
  716. ; кластер=1 сектор      1280/8 байт     шаг=8
  717. ; кластер=2 сектора     640/4 байт      шаг=4
  718. ; кластер=4 сектора     320/2 байт      шаг=2
  719. ; кластер=8 секторов    160 байт        шаг=1
  720. ; кластер=16 секторов   80 байт         шаг=1
  721. ; кластер=32 сектора    40 байт         шаг=1
  722. ; кластер=64 сектора    20 байт         шаг=1
  723. ; кластер=128 секторов  10 байт         шаг=1
  724.                 LD A,L
  725.                 EX AF,AF'
  726.                 LD A,(IX+_MOUNT_Cls_Step)
  727.                 DEC A
  728.                 JR Z,RDWRMOUNT6
  729.                 INC A
  730.                 ADD HL,HL
  731. RDWRMOUNT2      SRL H
  732.                 RR L
  733.                 RRCA
  734.                 JR NC,RDWRMOUNT2
  735. RDWRMOUNT6      LD A,(RREG_A)                           ; номер дисковода
  736.                 ADD A,A
  737.                 ADD A,A
  738.                 ADD A,HIGH (MOUNT_CLS+CPU5)
  739.                 LD H,A
  740.                 LD E,(HL)
  741.                 INC H
  742.                 LD D,(HL)
  743.                 INC H
  744.                 LD C,(HL)
  745.                 INC H
  746.                 LD B,(HL)                               ; BCDE=номер кластера
  747.                 LD A,(IX+_MOUNT_Cls_Step)               ; шаг кластеров
  748.                 DEC A
  749.                 JR Z,RDWRMOUNT3                         ; шаг кластеров =1
  750.                 LD B,A                                  ; маска смещения в таблице кластеров
  751.                 EX AF,AF'
  752.                 AND B                                   ; A=смещение в таблице кластеров
  753.                 LD B,(HL)                               ; восстановление номера кластера
  754.                 JR Z,RDWRMOUNT3
  755. RDWRMOUNT4      PUSH AF
  756.                 CALL RDFATZP
  757.                 POP AF
  758.                 DEC A
  759.                 JR NZ,RDWRMOUNT4
  760. RDWRMOUNT3      CALL REALSEC                            ; конверсия номера кластера в номер сектора
  761.                 POP HL
  762.                 PUSH HL
  763.                 SRL L
  764.                 LD A,(SecPerClus)
  765.                 DEC A
  766.                 JR Z,RDWRMOUNT5
  767.                 AND L
  768.                 LD L,A
  769.                 LD H,0
  770.                 ADD HL,DE
  771.                 EX DE,HL
  772.                 LD HL,0
  773.                 ADC HL,BC
  774.                 LD B,H
  775.                 LD C,L
  776. RDWRMOUNT5      CALL LOADLST                            ; чтение сектора в буфер
  777.                 POP BC
  778.                 LD A,C
  779.                 AND 1
  780.                 ADD A,H
  781.                 LD H,A
  782.                 LD BC,CPU3
  783.                 ADD HL,BC                               ; адрес буфера в окне 1
  784.                 CALL LDIR_SEC
  785.                 LD A,(RREG_A)                           ; чтение или запись
  786.                 AND 0X80
  787.                 CALL NZ,LSTSAVE
  788.                 LD HL,RREG_H
  789.                 INC (HL)
  790.                 LD L,(IX+_MOUNT_Adr_Sel_Drv)
  791.                 LD H,(IX+_MOUNT_Adr_Sel_Drv+1)
  792.                 LD (GO_DEV),HL
  793.                 EVOPORT WIN_P5,RAM_FATVARS
  794.                 LD A,(SETDVOL)
  795.                 ADD A,HIGH (CPU5+BUF_ALLVOL)+4
  796.                 LD H,A
  797.                 LD DE,BUF_TEKVOL
  798.                 LD BC,0X100
  799.                 LD L,C
  800.                 LDIR
  801.                 LD (NumSec2Buf + 2),HL
  802.                 RET
  803.  
  804. LDIR_SEC        EX DE,HL                                ; адрес буфера сохранили в DE
  805.                 LD HL,(RREG_L)                          ; HL=адрес в основной памяти
  806.                 CALL RESETUP_WINS                       ; переконфигурация окон проецирования
  807.                 ADD HL,BC                               ; изменили адрес чтения/записи
  808.                 EX DE,HL                                ; HL=адрес буфера, DE=адрес в основной памяти
  809.                 LD A,(RREG_A-CPU5)                      ; чтение или запись
  810.                 AND 0X80
  811.                 JR Z,LDIRSEC6
  812.                 EX DE,HL                                ; для записи меняем напраление переноса
  813. LDIRSEC6        LD BC,0X100
  814.                 LDIR
  815.                 LD HL,CPU5
  816.                 ADD HL,SP
  817.                 LD SP,HL                                ; вернули адрес стека в окно 2
  818.                 ATMPORT WIN_A3,0X7F                     ; убрали возможную зависимость в окне 3 от порта 7FFD
  819.                 LD B,HIGH (WIN_A6)
  820.                 OUT (C),A                               ; убрали возможную зависимость в окне 2 от порта 7FFD
  821.                 XOR A
  822.                 LD B,HIGH (WIN_P6)
  823.                 OUT (C),A                               ; вернули страницу переменных в окно 2
  824.                 RET
  825.  
  826. TXT_MOUNTER     DZ "IMAGE.MNT"                          ; имя для поиска текстового файла с указанием к монтированию TRD
  827. ETXT_MOUNTER
  828.  
  829. FIND_MOUNTED    LD A,(KOLDVOL)
  830.                 AND A
  831.                 JR NZ,FINDMNTD09
  832.                 LD IX,MOUNT_DRIVES
  833.                 LD DE,0X40
  834.                 LD B,4
  835. FINDMNTD10      LD (IX+_MOUNT_Name),D
  836.                 ADD IX,DE
  837.                 DJNZ FINDMNTD10
  838.                 RET
  839.  
  840. FINDMNTD09      LD A,(SETDVOL)
  841.                 LD (SAVE_TEK_VOL),A                     ; сохранили текущее устройство
  842.                 CALL SAVE_FNDVOL                        ; сохранили переменные текущего устройства
  843.                 LD H,CMOS_BYTE_01
  844.                 ROMCALL READCMOS,ROM_RST82
  845.                 LD A,L
  846.                 AND M_AUTOMOUNT                         ; определение нужно ли искать файл IMAGE.MNT
  847.                 JP Z,FINDMNTD01
  848. ; ищем файл IMAGE.MNT для автомонтирования
  849.                 LD IYL,INTERNAL
  850.                 LD A,(KOLDVOL)
  851.                 DEC A                                   ; искать будем на последнем найденном разделе
  852.                 CALL SET_VOL_MNT                        ; переключилсь на выбранное устройство
  853.                 LD HL,(RootDIRCluster)
  854.                 LD (CurrentDIRCluster),HL
  855.                 LD HL,(RootDIRCluster + 2)
  856.                 LD (CurrentDIRCluster + 2),HL           ; выбрали корневой каталог выбранного устройства
  857.                 CALL INIRTSC                            ; инициализировали его переменные на ROOTDIR
  858.                 LD HL,TXT_MOUNTER
  859.                 LD DE,BUF_256
  860.                 LD BC,ETXT_MOUNTER-TXT_MOUNTER
  861.                 LDIR                                    ; перенесли имя файла для поиска
  862.                 CALL ICOM_FAT
  863.                 DB _FIND_NAME
  864.                 JP C,FINDMNTD01                         ; файл IMAGE.MNT не найден
  865. ; файл найден
  866.                 CALL OPEN_FILE                          ; открываем файл
  867.                 LD HL,FILE_SRC+0X1F
  868.                 LD A,(HL)
  869.                 DEC HL
  870.                 OR (HL)
  871.                 JP NZ,FINDMNTD01                        ; файл не должен быть более 512 байт
  872.                 DEC HL
  873.                 LD A,(HL)
  874.                 CP 2
  875.                 JP NC,FINDMNTD01                        ; файл не должен быть более 512 байт
  876.                 LD A,1                                  ; читать будем 1 сектор из найденного файла
  877.                 LD B,(HL)
  878.                 DEC HL
  879.                 LD C,(HL)                               ; взяли длину файла в байтах
  880.                 PUSH BC                                 ; сохранили для дальнейшего использования
  881.                 LD IYL,INTERNAL
  882.                 LD HL,OFFSET_BUFSYM+CPU6
  883.                 PUSH HL
  884.                 CALL READ_FILE                          ; прочитали 1 сектор из файла
  885.                 EVOPORT WIN_P5,RAM_MOUNTER
  886.                 POP HL
  887.                 POP BC
  888.                 ADD HL,BC
  889.                 LD (HL),0                               ; установили признак конца файла в 0
  890.                 SBC HL,BC
  891. FINDMNTD04      LD A,(HL)
  892.                 AND A
  893.                 JR Z,FINDMNTD01                         ; выходим если файл кончился
  894.                 INC HL
  895.                 CP "!"
  896.                 JR C,FINDMNTD04                         ; если строка кончилась переносим эту строку в буфер поиска
  897.                 DEC HL
  898.                 PUSH HL
  899.                 INC HL
  900.                 CP "a"                                  ; первый символ строки буква устройства
  901.                 JR C,FINDMNTD06                         ; должна быть только символ от "A"
  902.                 CP 'z'+1
  903.                 JR NC,FINDMNTD06                        ; до "Z"
  904.                 AND 0XDF                                ; перевели букву устройства в верхний регистр, если нужно
  905. FINDMNTD06      SUB "E"                                 ; FAT устройства начинаются с буквы "E"
  906.                 JR C,FINDMNTD02
  907.                 EXX
  908.                 LD C,A                                  ; номер устройства где искать файл
  909.                 LD A,(KOLDVOL)                          ; количество найденных разделов
  910.                 CP C
  911.                 EXX
  912.                 JR C,FINDMNTD02
  913.                 LD A,(HL)
  914.                 INC HL
  915.                 CP ":"                                  ; разделитель обязателен
  916.                 JR NZ,FINDMNTD02
  917.                 LD A,(HL)
  918.                 INC HL
  919.                 CP "/"                                  ; разделитель обязателен
  920.                 JR NZ,FINDMNTD02
  921. FINDMNTD07      LD A,(HL)
  922.                 INC HL
  923.                 CP "!"
  924.                 JR NC,FINDMNTD07                        ; ищем конец строки
  925.                 LD A,(HL)                               ; буква дисковода на которую монтировать
  926.                 INC HL
  927.                 CP "a"
  928.                 JR C,FINDMNTD08
  929.                 CP 'z'+1
  930.                 JR NC,FINDMNTD08
  931.                 AND 0XDF                                ; переводи в верхний регистр, если нужно
  932. FINDMNTD08      SUB "A"
  933.                 JR C,FINDMNTD02
  934.                 CP 4
  935.                 JR NC,FINDMNTD02
  936.                 EXX
  937.                 LD B,A                                  ; номер дисковода на который монтировать
  938.                 EXX
  939.                 LD A,(HL)
  940.                 INC HL
  941.                 CP ":"
  942.                 JR NZ,FINDMNTD02
  943.                 LD D,H
  944.                 LD E,L
  945.                 EX (SP),HL
  946.                 EX DE,HL
  947.                 SCF
  948.                 SBC HL,DE
  949.                 LD B,H
  950.                 LD C,L
  951.                 EX DE,HL
  952.                 EXX
  953.                 LD A,B
  954.                 EXX
  955.                 ADD A,HIGH (BUF_PATHMOUNT+CPU5)
  956.                 LD D,A
  957.                 LD E,0                                  ; DE=адрес буфера текстовой строки монтируемого дисковода
  958.                 DEC BC
  959.                 DEC BC
  960.                 LDIR                                    ; перенесли строку
  961.                 XOR A
  962.                 LD (DE),A                               ; принудительное завершение строки монтирования
  963.                 POP HL
  964.                 JR FINDMNTD04
  965.  
  966. FINDMNTD02      LD A,(HL)
  967.                 INC HL
  968.                 AND A
  969.                 JR Z,FINDMNTD01
  970.                 CP " "
  971.                 JR NC,FINDMNTD02
  972.                 POP DE
  973.                 JR FINDMNTD04
  974.  
  975. FINDMNTD01      EVOPORT WIN_P5,RAM_MOUNTER
  976.                 LD BC,0X400
  977.                 LD IX,MOUNT_DRIVES                      ; буфер описателей монтируемых файлов
  978. FINDMNTD2       PUSH BC
  979.                 CALL FINDMNTD0                          ; ищем указанный файл для монтирования
  980.                 JR NC,FINDMNT5
  981.                 LD (IX+_MOUNT_Name),0                   ; если файл не найден, то принудительно демонтируем образ
  982. FINDMNT5        LD BC,0X40
  983.                 ADD IX,BC                               ; следующий описатель монтируемого файла
  984.                 POP BC
  985.                 DJNZ FINDMNTD2
  986.                 LD A,IYH
  987.                 AND 0XF0                                ; старшие 4 бита примонтированные файлы
  988.                 LD D,A
  989.                 LD A,(CPU2+VIRT_BITS)
  990.                 AND 0X0F                                ; младшие 4 бита реальный и виртуальные приводы
  991.                 OR D                                    ; совместили для записи обратно
  992.                 CALL WR_VIRT_BITS
  993.                 LD A,(SAVE_TEK_VOL)
  994.                 PUSH IY
  995.                 LD IYL,INTERNAL
  996.                 CALL SET_VOL_MNT                        ; восстановили текущее выбранное устройство
  997.                 CALL INIRTSC                            ; проинитили его переменные
  998.                 POP IY
  999.                 JP LOAD_FNDVOL                          ; вернули на место описатель устройства
  1000.  
  1001. ; поиск монтируемого файла с установкой соотвествующего бита
  1002. FINDMNTD0       CALL FINDMNTD1
  1003.                 EX AF,AF'
  1004.                 LD A,IXL
  1005.                 AND 0XC0
  1006.                 RLCA
  1007.                 RLCA                                    ; номер текущего монтируемого дисковода
  1008.                 INC A
  1009.                 LD B,A
  1010.                 LD A,%11110111
  1011.                 RLCA
  1012.                 DJNZ $-1                                ; установка маски монтируемого дисковода
  1013.                 LD C,A                                  ; маска
  1014.                 CPL
  1015.                 LD B,A                                  ; бит
  1016.                 LD A,IYH
  1017.                 AND C                                   ; сбросили бит смонтированного дисковода
  1018.                 LD IYH,A
  1019.                 EX AF,AF'
  1020.                 RET C                                   ; выход если файл не найден
  1021.                 LD A,IYH
  1022.                 OR B                                    ; установили бит если файл найден
  1023.                 LD IYH,A
  1024.                 RET
  1025.  
  1026. ; сохранение текущего пути
  1027. STORE_PATH      PUSH AF
  1028.                 EVOPORT WIN_P5,RAM_MOUNTER
  1029.                 LD A,(SETDVOL)                          ; номер текущего устройства
  1030.                 ADD A,HIGH (TEK_BUFPATH+CPU5)+4         ; +старший байт адреса пути
  1031.                 LD H,A
  1032.                 LD DE,BUF_256
  1033.                 LD BC,0X100
  1034.                 LD L,C
  1035.                 LDIR
  1036. STOREPATH1      POP AF
  1037.                 RET
  1038.  
  1039. ; восстановление текущего пути
  1040. RESTORE_PATH    PUSH AF
  1041.                 EVOPORT WIN_P5,RAM_MOUNTER
  1042.                 LD A,(SETDVOL)                          ; номер текущего устройства
  1043.                 ADD A,HIGH (TEK_BUFPATH+CPU5)+4         ; +старший байт адреса пути
  1044.                 LD D,A
  1045.                 LD HL,BUF_256
  1046.                 LD BC,0X100
  1047.                 LD E,C
  1048.                 LDIR
  1049. RESTOREPATH1    POP AF
  1050.                 RET
  1051.  
  1052. ; поиск монтируемого файла
  1053. FINDMNTD1       LD A,IXL
  1054.                 RLCA
  1055.                 RLCA
  1056.                 AND 3
  1057.                 ADD A,HIGH (BUF_PATHMOUNT+CPU5)
  1058.                 LD D,A
  1059.                 LD E,0                                  ; DE=адрес буфера строки описателя монтирумого файла
  1060.                 LD A,(DE)                               ; взяли букву устройства где файл искать
  1061.                 INC DE
  1062.                 INC DE
  1063.                 INC DE
  1064.                 AND A
  1065.                 SCF
  1066.                 RET Z
  1067.                 SUB "E"                                 ; конверсия буквы в номер
  1068.                 PUSH DE
  1069.                 CALL SET_VOL_MNT                        ; переключились на это устройство
  1070.                 CALL STORE_PATH                         ; сохранили текущий путь
  1071.                 LD HL,(RootDIRCluster)
  1072.                 LD (CurrentDIRCluster),HL
  1073.                 LD HL,(RootDIRCluster + 2)
  1074.                 LD (CurrentDIRCluster + 2),HL           ; перешли в корень устройства
  1075.                 CALL INIRTSC                            ; инициализация его переменных
  1076.                 EVOPORT WIN_P5,RAM_MOUNTER
  1077.                 POP HL
  1078.                 CALL FNDBUF                             ; распаковка текстовой строки
  1079. FINDMNTD13      PUSH HL
  1080.                 CALL POSTF02                            ; сброс текущего номера файла в 0
  1081.                 CALL FINDMNTD3                          ; поиск в текущей директории
  1082.                 POP DE
  1083.                 JP C,RESTORE_PATH                       ; восстановили текущий путь
  1084.                 LD BC,0X0B
  1085.                 ADD HL,BC
  1086.                 LD A,(HL)
  1087.                 SBC HL,BC
  1088.                 AND 0X10
  1089.                 JR Z,FINDMNTD23                         ; если это файл найден, то он найден
  1090.                 PUSH DE
  1091.                 CALL ENTER_DIR                          ; иначе входим в директорию
  1092.                 CALL POSTF02                            ; сброс текущего ноиера файла в 0
  1093.                 POP HL
  1094.                 LD A,(HL)
  1095.                 AND A
  1096.                 SCF
  1097.                 JP Z,RESTORE_PATH                       ; восстановили текущий путь
  1098.                 CALL FNDBUF                             ; распаковываем следующую часть строки
  1099.                 JR FINDMNTD13                           ; продолжаем поиск
  1100.  
  1101. FINDMNTD23      LD A,IXL
  1102.                 RLCA
  1103.                 RLCA
  1104.                 LD E,IXL
  1105.                 LD D,IXH                                ; DE=куда описатель переносить
  1106.                 LD (IX+_MOUNT_Mount_Num),A              ; номер монтируемого дисковода
  1107.                 PUSH HL
  1108.                 LD BC,0X20
  1109.                 LDIR
  1110.                 POP HL
  1111.                 PUSH IY
  1112.                 CALL IOPEN_MOUNT
  1113.                 POP IY
  1114.                 XOR A
  1115.                 JP RESTORE_PATH                         ; восстановили текущий путь
  1116.  
  1117. FINDMNTD4       CALL NXTLEGZ
  1118. FINDMNTD3       PUSH HL
  1119.                 LD DE,FB_EXT
  1120.                 CALL ICMP_NAME
  1121.                 POP HL
  1122.                 RET Z
  1123.                 LD A,(HL)
  1124.                 AND A
  1125.                 JR NZ,FINDMNTD4
  1126.                 SCF
  1127.                 RET
  1128.  
  1129. ; получение описателя файла загруженного в рамдиск
  1130. REST_NAMELOAD   LD HL,NAME_RAMDISK-CPU6
  1131.                 LD DE,(RREG_L)
  1132.                 LD BC,0X20
  1133.                 JP LDIR_BYTES
  1134.  
  1135. ;STOR_NAMELOAD  LD HL,(RREG_L)
  1136. ;               LD DE,NAME_RAMDISK-CPU6
  1137. ;               LD BC,0X20
  1138. ;               JP LDIR_BYTES
  1139.  
  1140. GET_MOUNTED     EVOPORT WIN_P5,RAM_MOUNTER
  1141.                 LD HL,MOUNT_DRIVES-CPU6
  1142.                 LD DE,(RREG_L)
  1143.                 LD BC,0X100
  1144.                 JP LDIR_BYTES
  1145.  
  1146. CMP_DRIVE       EVOPORT WIN_P5,RAM_MOUNTER
  1147.                 LD A,(RREG_A)
  1148.                 AND 3
  1149.                 RLCA
  1150.                 RLCA
  1151.                 LD L,A
  1152.                 LD H,HIGH (MOUNT_DRIVES)
  1153.                 LD A,(HL)
  1154.                 AND A                                   ; если не примонтирован,
  1155.                 SCF                                     ; то диска нет
  1156.                 JR Z,CMP_DRIVE1
  1157.                 XOR A
  1158. CMP_DRIVE1      PUSH AF
  1159.                 POP HL
  1160.                 LD (RREG_F),HL
  1161.                 RET
  1162.  
  1163. ; демонтирование образа
  1164. CLOSEMOUNT      EVOPORT WIN_P5,RAM_MOUNTER
  1165.                 LD A,(RREG_A)
  1166.                 LD B,A
  1167.                 RRCA
  1168.                 RRCA
  1169.                 LD L,A
  1170.                 LD H,HIGH (MOUNT_DRIVES)
  1171.                 LD (HL),0
  1172.                 LD A,B
  1173.                 ADD A,HIGH (BUF_PATHMOUNT+CPU5)
  1174.                 LD H,A
  1175.                 LD L,0
  1176.                 LD (HL),L
  1177.                 INC B
  1178.                 LD A,%11110111
  1179.                 RLCA
  1180.                 DJNZ $-1
  1181.                 LD B,A
  1182.                 LD A,(CPU2+VIRT_BITS)
  1183.                 AND B
  1184.                 JP WR_VIRT_BITS
  1185.  
  1186. ; распаковщик пути к файлу
  1187. ; HL = адрес текстовой строки
  1188. FNDBUF          LD BC,0X0802
  1189.                 LD DE,FB_EXT
  1190. FNDBUF4         LD A,(HL)
  1191.                 INC HL
  1192.                 CP "."
  1193.                 JR Z,FNDBUF2
  1194.                 CP "/"
  1195.                 JR Z,FNDBUF5
  1196.                 LD (DE),A
  1197.                 INC DE
  1198.                 DJNZ FNDBUF4
  1199.                 LD A,(HL)
  1200.                 AND A
  1201.                 RET Z
  1202.                 INC HL
  1203.                 JR FNDBUF3
  1204.  
  1205. FNDBUF5         LD A,C
  1206.                 AND A
  1207.                 RET Z
  1208. FNDBUF2         LD A,B
  1209.                 AND A
  1210.                 JR Z,FNDBUF3
  1211.                 LD A," "
  1212.                 LD (DE),A
  1213.                 INC DE
  1214.                 DJNZ $-2
  1215. FNDBUF3         LD B,3
  1216.                 DEC C
  1217.                 DEC HL
  1218.                 LD A,(HL)
  1219.                 CP "/"
  1220.                 JR Z,FNDBUF4
  1221.                 INC HL
  1222.                 JR FNDBUF4
  1223.  
  1224. ; получение текущего состояния битов смонтированных дисководов и рамдиска
  1225. GET_VIRT_BITS   LD HL,MOUNT_DRIVES
  1226.                 LD E,0                          ; здесь будут биты смонтированных дисководов
  1227. .L2             LD A,(HL)
  1228.                 AND A
  1229.                 JR Z,.L1
  1230.                 SET 4,E
  1231. .L1             RR E
  1232.                 LD A,0X40
  1233.                 ADD A,L
  1234.                 LD L,A
  1235.                 JR NZ,.L2
  1236. ; VIRT_BITS - в 3-0 битах биты примонтированных образов для дисков D-A
  1237.                 CALL GET_VIRTREAL
  1238.                 AND 3
  1239.                 INC A
  1240.                 LD B,A
  1241.                 LD A,%00001000
  1242. .L3             RLCA
  1243.                 DJNZ .L3
  1244.                 OR E
  1245. ; A xxxx0000 - биты рамдиска
  1246. ; E 0000xxxx - биты примонтированных образов
  1247.  
  1248. ; копирование установок виртуал/реал для EVO-DOS
  1249. WR_VIRT_BITS    PUSH BC
  1250.                 PUSH HL
  1251.         IFDEF DOS_FE
  1252.                 LD L,A
  1253.                 AND 0X0F                        ; примонтированные диски
  1254.                 LD H,A
  1255.                 LD A,L
  1256.                 RRCA
  1257.                 RRCA
  1258.                 RRCA
  1259.                 RRCA
  1260.                 AND 0X0F                        ; рамдиск
  1261.                 OR H
  1262.                 LD (B_PORT_VIRT),A
  1263.                 LD A,L
  1264.         ENDIF
  1265.                 LD (CPU2+VIRT_BITS),A           ; внутренняя переменая
  1266.                 LD (RREG_A),A                   ; возвращаемое значение в регистре A
  1267.                 EX AF,AF'
  1268.         EVOPORT WIN_P2,RAM_EVODOS
  1269.                 PUSH BC
  1270.                 EX AF,AF'
  1271.                 LD (CPU2+COPY_VIRT_BITS),A      ; копия переменной для эмуля
  1272.                 LD A,VIRT_REAL_DRIVE
  1273.                 LD BC,CMOSD_SET_ADR
  1274.                 OUT (C),A
  1275.                 LD BC,CMOSD_RD_WR
  1276.                 IN A,(C)
  1277.                 AND 3
  1278.                 LD (CPU2+VIRT_DRIVE),A
  1279.                 POP BC
  1280.                 XOR A
  1281.                 OUT (C),A
  1282.                 POP HL
  1283.                 POP BC
  1284.                 RET
  1285.  
  1286.         IF 0
  1287. ;[монтирование рамдиска]
  1288. ;MOUNT_RAMDISK  CALL GET_VIRTREAL
  1289. ;               AND 3
  1290. ;               JR SET_RAMDISK.L1
  1291.  
  1292. ; отключение/установка рамдиска
  1293. ; A = >3 - отключение рамдиска
  1294. ;     0..3 - номер рамдиска
  1295. ; VIRT_BITS - 7-4 бит один установленный бит -> рамдиск
  1296. SET_RAMDISK     LD A,(RREG_A)
  1297.                 CP 4
  1298.                 JR C,.L1
  1299.                 LD A,(CPU2+VIRT_BITS)
  1300.                 AND 0X0F
  1301.                 JR WR_VIRT_BITS
  1302.  
  1303. .L1             INC A
  1304.                 LD B,A
  1305.                 LD A,%00001000
  1306. .L2             RLCA
  1307.                 DJNZ .L2
  1308.                 LD L,A
  1309.                 LD A,(CPU2+VIRT_BITS)
  1310.                 AND 0X0F
  1311.                 OR L
  1312.                 JP WR_VIRT_BITS
  1313.         ENDIF
  1314.  
  1315. ; установка номера в реальный и виртуальный дисковод
  1316. ; A = 0..3 - номер дисковода для установки
  1317. SET_VIRTREAL    LD A,(RREG_A)
  1318.                 LD E,A
  1319.                 CALL GET_VIRTREAL
  1320.                 AND %11110000
  1321.                 LD D,A
  1322.                 LD A,E
  1323.                 AND 3
  1324.                 LD E,A
  1325.                 ADD A,A
  1326.                 ADD A,A
  1327.                 OR E
  1328. .L1             LD L,A
  1329.         ROMCALL IWRITECMOS,ROM_RST82
  1330.                 JP GET_VIRT_BITS
  1331.  
  1332. ; установка номера реального дисковода
  1333. ; A = 0..3 - номер дисковода для установки
  1334. SET_REAL        LD A,(RREG_A)
  1335.                 LD E,A
  1336.                 CALL GET_VIRTREAL
  1337.                 AND %11110011
  1338.                 LD D,A
  1339.                 LD A,E
  1340.                 AND 3
  1341.                 ADD A,A
  1342.                 ADD A,A
  1343.                 OR D
  1344.                 JR SET_VIRTREAL.L1
  1345.  
  1346. ; установка номера виртуального дисковода
  1347. ; A = 0..3 - номер дисковода для установки
  1348. SET_VIRT        LD A,(RREG_A)
  1349.                 LD E,A
  1350.                 CALL GET_VIRTREAL
  1351.                 AND %11111100
  1352.                 LD D,A
  1353.                 LD A,E
  1354.                 AND 3
  1355.                 OR D
  1356.                 JR SET_VIRTREAL.L1
  1357.  
  1358. GET_VIRTREAL    LD H,VIRT_REAL_DRIVE
  1359.         ROMCALL READCMOS,ROM_RST82
  1360.                 AND 0X0F
  1361.                 RET
  1362.