Subversion Repositories pentevo

Rev

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

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