Subversion Repositories pentevo

Rev

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

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