Subversion Repositories pentevo

Rev

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