Subversion Repositories pentevo

Rev

Rev 835 | Rev 961 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed | ?url?

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