Subversion Repositories pentevo

Rev

Rev 1026 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed | ?url?

  1.  
  2. ; LAST UPDATE: 15.02.2023 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. ; TODO: проверка номера кластера на 0 и 0xFFFFFFFF и возврат ошибки чтения/записи по надобности
  750.                 LD A,(IX+_MOUNT_Cls_Step)               ; шаг кластеров
  751.                 DEC A
  752.                 JR Z,RDWRMOUNT3                         ; шаг кластеров =1
  753.                 LD B,A                                  ; маска смещения в таблице кластеров
  754.                 EX AF,AF'
  755.                 AND B                                   ; A=смещение в таблице кластеров
  756.                 LD B,(HL)                               ; восстановление номера кластера
  757.                 JR Z,RDWRMOUNT3
  758. RDWRMOUNT4      PUSH AF
  759.                 CALL RDFATZP
  760.                 POP AF
  761.                 DEC A
  762.                 JR NZ,RDWRMOUNT4
  763. RDWRMOUNT3      CALL REALSEC                            ; конверсия номера кластера в номер сектора
  764.                 POP HL
  765.                 PUSH HL
  766.                 SRL L
  767.                 LD A,(SecPerClus)
  768.                 DEC A
  769.                 JR Z,RDWRMOUNT5
  770.                 AND L
  771.                 LD L,A
  772.                 LD H,0
  773.                 ADD HL,DE
  774.                 EX DE,HL
  775.                 LD HL,0
  776.                 ADC HL,BC
  777.                 LD B,H
  778.                 LD C,L
  779. RDWRMOUNT5      CALL LOADLST                            ; чтение сектора в буфер
  780.                 POP BC
  781.                 LD A,C
  782.                 AND 1
  783.                 ADD A,H
  784.                 LD H,A
  785.                 LD BC,CPU3
  786.                 ADD HL,BC                               ; адрес буфера в окне 1
  787.                 CALL LDIR_SEC
  788.                 LD A,(RREG_A)                           ; чтение или запись
  789.                 AND 0x80
  790.                 CALL NZ,LSTSAVE
  791.                 LD HL,RREG_H
  792.                 INC (HL)
  793.                 LD L,(IX+_MOUNT_Adr_Sel_Drv)
  794.                 LD H,(IX+_MOUNT_Adr_Sel_Drv+1)
  795.                 LD (GO_DEV),HL
  796.         EVOPORT WIN_P5,RAM_FATVARS
  797.                 LD A,(SETDVOL)
  798.                 ADD A,HIGH (CPU5+BUF_ALLVOL)+4
  799.                 LD H,A
  800.                 LD DE,BUF_TEKVOL
  801.                 LD BC,0x100
  802.                 LD L,C
  803.                 LDIR
  804.                 LD (NumSec2Buf + 2),HL
  805.                 RET
  806.  
  807. LDIR_SEC        EX DE,HL                                ; адрес буфера сохранили в DE
  808.                 LD HL,(RREG_L)                          ; HL=адрес в основной памяти
  809.                 CALL RESETUP_WINS                       ; переконфигурация окон проецирования
  810.                 ADD HL,BC                               ; изменили адрес чтения/записи
  811.                 EX DE,HL                                ; HL=адрес буфера, DE=адрес в основной памяти
  812.                 LD A,(RREG_A-CPU5)                      ; чтение или запись
  813.                 AND 0x80
  814.                 JR Z,LDIRSEC6
  815.                 EX DE,HL                                ; для записи меняем напраление переноса
  816. LDIRSEC6        LD BC,0x100
  817.                 LDIR
  818.                 LD HL,CPU5
  819.                 ADD HL,SP
  820.                 LD SP,HL                                ; вернули адрес стека в окно 2
  821.         ATMPORT WIN_A3,0x7F                             ; убрали возможную зависимость в окне 3 от порта 7FFD
  822.                 LD B,HIGH (WIN_A6)
  823.                 OUT (C),A                               ; убрали возможную зависимость в окне 2 от порта 7FFD
  824.                 XOR A
  825.                 LD B,HIGH (WIN_P6)
  826.                 OUT (C),A                               ; вернули страницу переменных в окно 2
  827.                 RET
  828.  
  829. TXT_MOUNTER     DZ "IMAGE.MNT"                          ; имя для поиска текстового файла с указанием к монтированию TRD
  830. ETXT_MOUNTER
  831.  
  832. FIND_MOUNTED    LD A,(KOLDVOL)
  833.                 AND A
  834.                 JR NZ,FINDMNTD09
  835.                 LD IX,MOUNT_DRIVES
  836.                 LD DE,0x40
  837.                 LD B,4
  838. FINDMNTD10      LD (IX+_MOUNT_Name),D
  839.                 ADD IX,DE
  840.                 DJNZ FINDMNTD10
  841.                 RET
  842.  
  843. FINDMNTD09      LD A,(SETDVOL)
  844.                 LD (SAVE_TEK_VOL),A                     ; сохранили текущее устройство
  845.                 CALL SAVE_FNDVOL                        ; сохранили переменные текущего устройства
  846.                 LD H,CMOS_BYTE_01
  847.         ROMCALL READCMOS,ROM_RST82
  848.                 LD A,L
  849.                 AND M_AUTOMOUNT                         ; определение нужно ли искать файл IMAGE.MNT
  850.                 JP Z,FINDMNTD01
  851. ; ищем файл IMAGE.MNT для автомонтирования
  852.                 LD IYL,INTERNAL
  853.                 LD A,(KOLDVOL)
  854.                 DEC A                                   ; искать будем на последнем найденном разделе
  855.                 CALL SET_VOL_MNT                        ; переключилсь на выбранное устройство
  856.                 LD HL,(RootDIRCluster)
  857.                 LD (CurrentDIRCluster),HL
  858.                 LD HL,(RootDIRCluster + 2)
  859.                 LD (CurrentDIRCluster + 2),HL           ; выбрали корневой каталог выбранного устройства
  860.                 CALL INIRTSC                            ; инициализировали его переменные на ROOTDIR
  861.                 LD HL,TXT_MOUNTER
  862.                 LD DE,BUF_256
  863.                 LD BC,ETXT_MOUNTER-TXT_MOUNTER
  864.                 LDIR                                    ; перенесли имя файла для поиска
  865.                 CALL ICOM_FAT
  866.                 DB _FIND_NAME
  867.                 JP C,FINDMNTD01                         ; файл IMAGE.MNT не найден
  868. ; файл найден
  869.                 CALL OPEN_FILE                          ; открываем файл
  870.                 LD HL,FILE_SRC+0x1F
  871.                 LD A,(HL)
  872.                 DEC HL
  873.                 OR (HL)
  874.                 JP NZ,FINDMNTD01                        ; файл не должен быть более 512 байт
  875.                 DEC HL
  876.                 LD A,(HL)
  877.                 CP 2
  878.                 JP NC,FINDMNTD01                        ; файл не должен быть более 512 байт
  879.                 LD A,1                                  ; читать будем 1 сектор из найденного файла
  880.                 LD B,(HL)
  881.                 DEC HL
  882.                 LD C,(HL)                               ; взяли длину файла в байтах
  883.                 PUSH BC                                 ; сохранили для дальнейшего использования
  884.                 LD IYL,INTERNAL
  885.                 LD HL,OFFSET_BUFSYM+CPU6
  886.                 PUSH HL
  887.                 CALL READ_FILE                          ; прочитали 1 сектор из файла
  888.         EVOPORT WIN_P5,RAM_MOUNTER
  889.                 POP HL
  890.                 POP BC
  891.                 ADD HL,BC
  892.                 LD (HL),0                               ; установили признак конца файла в 0
  893.                 SBC HL,BC
  894. FINDMNTD04      LD A,(HL)
  895.                 AND A
  896.                 JR Z,FINDMNTD01                         ; выходим если файл кончился
  897.                 INC HL
  898.                 CP "!"
  899.                 JR C,FINDMNTD04                         ; если строка кончилась переносим эту строку в буфер поиска
  900.                 DEC HL
  901.                 PUSH HL
  902.                 INC HL
  903.                 CP "a"                                  ; первый символ строки буква устройства
  904.                 JR C,FINDMNTD06                         ; должна быть только символ от "A"
  905.                 CP 'z'+1
  906.                 JR NC,FINDMNTD06                        ; до "Z"
  907.                 AND 0xDF                                ; перевели букву устройства в верхний регистр, если нужно
  908. FINDMNTD06      SUB "E"                                 ; FAT устройства начинаются с буквы "E"
  909.                 JR C,FINDMNTD02
  910.                 EXX
  911.                 LD C,A                                  ; номер устройства где искать файл
  912.                 LD A,(KOLDVOL)                          ; количество найденных разделов
  913.                 CP C
  914.                 EXX
  915.                 JR C,FINDMNTD02
  916.                 LD A,(HL)
  917.                 INC HL
  918.                 CP ":"                                  ; разделитель обязателен
  919.                 JR NZ,FINDMNTD02
  920.                 LD A,(HL)
  921.                 INC HL
  922.                 CP "/"                                  ; разделитель обязателен
  923.                 JR NZ,FINDMNTD02
  924. FINDMNTD07      LD A,(HL)
  925.                 INC HL
  926.                 CP "!"
  927.                 JR NC,FINDMNTD07                        ; ищем конец строки
  928.                 LD A,(HL)                               ; буква дисковода на которую монтировать
  929.                 INC HL
  930.                 CP "a"
  931.                 JR C,FINDMNTD08
  932.                 CP 'z'+1
  933.                 JR NC,FINDMNTD08
  934.                 AND 0xDF                                ; переводи в верхний регистр, если нужно
  935. FINDMNTD08      SUB "A"
  936.                 JR C,FINDMNTD02
  937.                 CP 4
  938.                 JR NC,FINDMNTD02
  939.                 EXX
  940.                 LD B,A                                  ; номер дисковода на который монтировать
  941.                 EXX
  942.                 LD A,(HL)
  943.                 INC HL
  944.                 CP ":"
  945.                 JR NZ,FINDMNTD02
  946.                 LD D,H
  947.                 LD E,L
  948.                 EX (SP),HL
  949.                 EX DE,HL
  950.                 SCF
  951.                 SBC HL,DE
  952.                 LD B,H
  953.                 LD C,L
  954.                 EX DE,HL
  955.                 EXX
  956.                 LD A,B
  957.                 EXX
  958.                 ADD A,HIGH (BUF_PATHMOUNT+CPU5)
  959.                 LD D,A
  960.                 LD E,0                                  ; DE=адрес буфера текстовой строки монтируемого дисковода
  961.                 DEC BC
  962.                 DEC BC
  963.                 LDIR                                    ; перенесли строку
  964.                 XOR A
  965.                 LD (DE),A                               ; принудительное завершение строки монтирования
  966.                 POP HL
  967.                 JR FINDMNTD04
  968.  
  969. FINDMNTD02      LD A,(HL)
  970.                 INC HL
  971.                 AND A
  972.                 JR Z,FINDMNTD01
  973.                 CP " "
  974.                 JR NC,FINDMNTD02
  975.                 POP DE
  976.                 JR FINDMNTD04
  977.  
  978. FINDMNTD01
  979.         EVOPORT WIN_P5,RAM_MOUNTER
  980.                 LD BC,0x400
  981.                 LD IX,MOUNT_DRIVES                      ; буфер описателей монтируемых файлов
  982. FINDMNTD2       PUSH BC
  983.                 CALL FINDMNTD0                          ; ищем указанный файл для монтирования
  984.                 JR NC,FINDMNT5
  985.                 LD (IX+_MOUNT_Name),0                   ; если файл не найден, то принудительно демонтируем образ
  986. FINDMNT5        LD BC,0x40
  987.                 ADD IX,BC                               ; следующий описатель монтируемого файла
  988.                 POP BC
  989.                 DJNZ FINDMNTD2
  990.                 LD A,IYH
  991.                 AND 0xF0                                ; старшие 4 бита примонтированные файлы
  992.                 LD D,A
  993.                 LD A,(CPU2+VIRT_BITS)
  994.                 AND 0x0F                                ; младшие 4 бита реальный и виртуальные приводы
  995.                 OR D                                    ; совместили для записи обратно
  996.                 CALL WR_VIRT_BITS
  997.                 LD A,(SAVE_TEK_VOL)
  998.                 PUSH IY
  999.                 LD IYL,INTERNAL
  1000.                 CALL SET_VOL_MNT                        ; восстановили текущее выбранное устройство
  1001.                 CALL INIRTSC                            ; проинитили его переменные
  1002.                 POP IY
  1003.                 JP LOAD_FNDVOL                          ; вернули на место описатель устройства
  1004.  
  1005. ; поиск монтируемого файла с установкой соотвествующего бита
  1006. FINDMNTD0       CALL FINDMNTD1
  1007.                 EX AF,AF'
  1008.                 LD A,IXL
  1009.                 AND 0xC0
  1010.                 RLCA
  1011.                 RLCA                                    ; номер текущего монтируемого дисковода
  1012.                 INC A
  1013.                 LD B,A
  1014.                 LD A,%11110111
  1015.                 RLCA
  1016.                 DJNZ $-1                                ; установка маски монтируемого дисковода
  1017.                 LD C,A                                  ; маска
  1018.                 CPL
  1019.                 LD B,A                                  ; бит
  1020.                 LD A,IYH
  1021.                 AND C                                   ; сбросили бит смонтированного дисковода
  1022.                 LD IYH,A
  1023.                 EX AF,AF'
  1024.                 RET C                                   ; выход если файл не найден
  1025.                 LD A,IYH
  1026.                 OR B                                    ; установили бит если файл найден
  1027.                 LD IYH,A
  1028.                 RET
  1029.  
  1030. ; сохранение текущего пути
  1031. STORE_PATH      PUSH AF
  1032.         EVOPORT WIN_P5,RAM_MOUNTER
  1033.                 LD A,(SETDVOL)                          ; номер текущего устройства
  1034.                 ADD A,HIGH (TEK_BUFPATH+CPU5)+4         ; +старший байт адреса пути
  1035.                 LD H,A
  1036.                 LD DE,BUF_256
  1037.                 LD BC,0x100
  1038.                 LD L,C
  1039.                 LDIR
  1040. STOREPATH1      POP AF
  1041.                 RET
  1042.  
  1043. ; восстановление текущего пути
  1044. RESTORE_PATH    PUSH AF
  1045.         EVOPORT WIN_P5,RAM_MOUNTER
  1046.                 LD A,(SETDVOL)                          ; номер текущего устройства
  1047.                 ADD A,HIGH (TEK_BUFPATH+CPU5)+4         ; +старший байт адреса пути
  1048.                 LD D,A
  1049.                 LD HL,BUF_256
  1050.                 LD BC,0x100
  1051.                 LD E,C
  1052.                 LDIR
  1053. RESTOREPATH1    POP AF
  1054.                 RET
  1055.  
  1056. ; поиск монтируемого файла
  1057. FINDMNTD1       LD A,IXL
  1058.                 RLCA
  1059.                 RLCA
  1060.                 AND 3
  1061.                 ADD A,HIGH (BUF_PATHMOUNT+CPU5)
  1062.                 LD D,A
  1063.                 LD E,0                                  ; DE=адрес буфера строки описателя монтирумого файла
  1064.                 LD A,(DE)                               ; взяли букву устройства где файл искать
  1065.                 INC DE
  1066.                 INC DE
  1067.                 INC DE
  1068.                 AND A
  1069.                 SCF
  1070.                 RET Z
  1071.                 SUB "E"                                 ; конверсия буквы в номер
  1072.                 PUSH DE
  1073.                 CALL SET_VOL_MNT                        ; переключились на это устройство
  1074.                 CALL STORE_PATH                         ; сохранили текущий путь
  1075.                 LD HL,(RootDIRCluster)
  1076.                 LD (CurrentDIRCluster),HL
  1077.                 LD HL,(RootDIRCluster + 2)
  1078.                 LD (CurrentDIRCluster + 2),HL           ; перешли в корень устройства
  1079.                 CALL INIRTSC                            ; инициализация его переменных
  1080.         EVOPORT WIN_P5,RAM_MOUNTER
  1081.                 POP HL
  1082.                 CALL FNDBUF                             ; распаковка текстовой строки
  1083. FINDMNTD13      PUSH HL
  1084.                 CALL POSTF02                            ; сброс текущего номера файла в 0
  1085.                 CALL FINDMNTD3                          ; поиск в текущей директории
  1086.                 POP DE
  1087.                 JP C,RESTORE_PATH                       ; восстановили текущий путь
  1088.                 LD BC,0x0B
  1089.                 ADD HL,BC
  1090.                 LD A,(HL)
  1091.                 SBC HL,BC
  1092.                 AND 0x10
  1093.                 JR Z,FINDMNTD23                         ; если это файл найден, то он найден
  1094.                 PUSH DE
  1095.                 CALL ENTER_DIR                          ; иначе входим в директорию
  1096.                 CALL POSTF02                            ; сброс текущего ноиера файла в 0
  1097.                 POP HL
  1098.                 LD A,(HL)
  1099.                 AND A
  1100.                 SCF
  1101.                 JP Z,RESTORE_PATH                       ; восстановили текущий путь
  1102.                 CALL FNDBUF                             ; распаковываем следующую часть строки
  1103.                 JR FINDMNTD13                           ; продолжаем поиск
  1104.  
  1105. FINDMNTD23      LD A,IXL
  1106.                 RLCA
  1107.                 RLCA
  1108.                 LD E,IXL
  1109.                 LD D,IXH                                ; DE=куда описатель переносить
  1110.                 LD (IX+_MOUNT_Mount_Num),A              ; номер монтируемого дисковода
  1111.                 PUSH HL
  1112.                 LD BC,0x20
  1113.                 LDIR
  1114.                 POP HL
  1115.                 PUSH IY
  1116.                 CALL IOPEN_MOUNT
  1117.                 POP IY
  1118.                 XOR A
  1119.                 JP RESTORE_PATH                         ; восстановили текущий путь
  1120.  
  1121. FINDMNTD4       CALL NXTLEGZ
  1122. FINDMNTD3       PUSH HL
  1123.                 LD DE,FB_EXT
  1124.                 CALL ICMP_NAME
  1125.                 POP HL
  1126.                 RET Z
  1127.                 LD A,(HL)
  1128.                 AND A
  1129.                 JR NZ,FINDMNTD4
  1130.                 SCF
  1131.                 RET
  1132.  
  1133. ; получение описателя файла загруженного в рамдиск
  1134. REST_NAMELOAD   LD HL,NAME_RAMDISK-CPU6
  1135.                 LD DE,(RREG_L)
  1136.                 LD BC,0x20
  1137.                 JP LDIR_BYTES
  1138.  
  1139. ;STOR_NAMELOAD  LD HL,(RREG_L)
  1140. ;               LD DE,NAME_RAMDISK-CPU6
  1141. ;               LD BC,0x20
  1142. ;               JP LDIR_BYTES
  1143.  
  1144. GET_MOUNTED
  1145.         EVOPORT WIN_P5,RAM_MOUNTER
  1146.                 LD HL,MOUNT_DRIVES-CPU6
  1147.                 LD DE,(RREG_L)
  1148.                 LD BC,0x100
  1149.                 JP LDIR_BYTES
  1150.  
  1151. CMP_DRIVE
  1152.         EVOPORT WIN_P5,RAM_MOUNTER
  1153.                 LD A,(RREG_A)
  1154.                 AND 3
  1155.                 RLCA
  1156.                 RLCA
  1157.                 LD L,A
  1158.                 LD H,HIGH (MOUNT_DRIVES)
  1159.                 LD A,(HL)
  1160.                 AND A                                   ; если не примонтирован,
  1161.                 SCF                                     ; то диска нет
  1162.                 JR Z,CMP_DRIVE1
  1163.                 XOR A
  1164. CMP_DRIVE1      PUSH AF
  1165.                 POP HL
  1166.                 LD (RREG_F),HL
  1167.                 RET
  1168.  
  1169. ; демонтирование образа
  1170. CLOSEMOUNT
  1171.         EVOPORT WIN_P5,RAM_MOUNTER
  1172.                 LD A,(RREG_A)
  1173.                 LD B,A
  1174.                 RRCA
  1175.                 RRCA
  1176.                 LD L,A
  1177.                 LD H,HIGH (MOUNT_DRIVES)
  1178.                 LD (HL),0
  1179.                 LD A,B
  1180.                 ADD A,HIGH (BUF_PATHMOUNT+CPU5)
  1181.                 LD H,A
  1182.                 LD L,0
  1183.                 LD (HL),L
  1184.                 INC B
  1185.                 LD A,%11110111
  1186.                 RLCA
  1187.                 DJNZ $-1
  1188.                 LD B,A
  1189.                 LD A,(CPU2+VIRT_BITS)
  1190.                 AND B
  1191.                 JP WR_VIRT_BITS
  1192.  
  1193. ; распаковщик пути к файлу
  1194. ; HL = адрес текстовой строки
  1195. FNDBUF          LD BC,0x0802
  1196.                 LD DE,FB_EXT
  1197. FNDBUF4         LD A,(HL)
  1198.                 INC HL
  1199.                 CP "."
  1200.                 JR Z,FNDBUF2
  1201.                 CP "/"
  1202.                 JR Z,FNDBUF5
  1203.                 LD (DE),A
  1204.                 INC DE
  1205.                 DJNZ FNDBUF4
  1206.                 LD A,(HL)
  1207.                 AND A
  1208.                 RET Z
  1209.                 INC HL
  1210.                 JR FNDBUF3
  1211.  
  1212. FNDBUF5         LD A,C
  1213.                 AND A
  1214.                 RET Z
  1215. FNDBUF2         LD A,B
  1216.                 AND A
  1217.                 JR Z,FNDBUF3
  1218.                 LD A," "
  1219.                 LD (DE),A
  1220.                 INC DE
  1221.                 DJNZ $-2
  1222. FNDBUF3         LD B,3
  1223.                 DEC C
  1224.                 DEC HL
  1225.                 LD A,(HL)
  1226.                 CP "/"
  1227.                 JR Z,FNDBUF4
  1228.                 INC HL
  1229.                 JR FNDBUF4
  1230.  
  1231. ; получение текущего состояния битов смонтированных дисководов и рамдиска
  1232. GET_VIRT_BITS   LD HL,MOUNT_DRIVES
  1233.                 LD E,0                          ; здесь будут биты смонтированных дисководов
  1234. .L2             LD A,(HL)
  1235.                 AND A
  1236.                 JR Z,.L1
  1237.                 SET 4,E
  1238. .L1             RR E
  1239.                 LD A,0x40
  1240.                 ADD A,L
  1241.                 LD L,A
  1242.                 JR NZ,.L2
  1243. ; VIRT_BITS - в 3-0 битах биты примонтированных образов для дисков D-A
  1244.                 CALL GET_VIRTREAL
  1245.                 AND 3
  1246.                 INC A
  1247.                 LD B,A
  1248.                 LD A,%00001000
  1249. .L3             RLCA
  1250.                 DJNZ .L3
  1251.                 OR E
  1252. ; A xxxx0000 - биты рамдиска
  1253. ; E 0000xxxx - биты примонтированных образов
  1254.  
  1255. ; копирование установок виртуал/реал для EVO-DOS
  1256. WR_VIRT_BITS    PUSH BC
  1257.                 PUSH HL
  1258.                 LD H,A
  1259.                 LD (CPU2 + VIRT_BITS),A         ; внутренняя переменная
  1260.                 LD (RREG_A),A                   ; возвращаемое значение в регистре A
  1261.                 AND %00001111                   ; примонтированные диски
  1262.                 LD L,A
  1263.                 LD A,H
  1264.                 AND %11110000
  1265.                 RRCA
  1266.                 RRCA
  1267.                 RRCA
  1268.                 RRCA
  1269.                 OR L
  1270.                 LD (B_PORT_VIRT),A
  1271.         EVOPORT WIN_P2,RAM_EVODOS
  1272.                 LD A,H
  1273.                 LD (CPU2 + COPY_VIRT_BITS),A    ; копия переменной флагов для эмуля
  1274.                 LD A,VIRT_REAL_DRIVE
  1275.                 LD BC,CMOSD_SET_ADR
  1276.                 OUT (C),A
  1277.                 LD BC,CMOSD_RD_WR
  1278.                 IN L,(C)
  1279.                 LD A,L
  1280.                 AND %00000011
  1281.                 LD (CPU2 + VIRT_DRIVE),A        ; номер виртуального диска из CMOS
  1282.                 LD A,L
  1283.                 AND %00001100
  1284.                 RRCA
  1285.                 RRCA
  1286.                 LD (CPU2 + REAL_DRIVE),A        ; номер реального диска из CMOS
  1287.                 LD BC,WIN_P2
  1288.                 XOR A
  1289.                 OUT (C),A
  1290.                 POP HL
  1291.                 POP BC
  1292.                 RET
  1293.  
  1294.         IF 0
  1295. ; монтирование рамдиска
  1296. ; MOUNT_RAMDISK CALL GET_VIRTREAL
  1297. ;               AND 3
  1298. ;               JR SET_RAMDISK.L1
  1299.  
  1300. ; отключение/установка рамдиска
  1301. ; A = >3 - отключение рамдиска
  1302. ;     0..3 - номер рамдиска
  1303. ; VIRT_BITS - 7-4 бит один установленный бит -> рамдиск
  1304. SET_RAMDISK     LD A,(RREG_A)
  1305.                 CP 4
  1306.                 JR C,.L1
  1307.                 LD A,(CPU2+VIRT_BITS)
  1308.                 AND 0x0F
  1309.                 JR WR_VIRT_BITS
  1310.  
  1311. .L1             INC A
  1312.                 LD B,A
  1313.                 LD A,%00001000
  1314. .L2             RLCA
  1315.                 DJNZ .L2
  1316.                 LD L,A
  1317.                 LD A,(CPU2+VIRT_BITS)
  1318.                 AND 0x0F
  1319.                 OR L
  1320.                 JP WR_VIRT_BITS
  1321.         ENDIF
  1322.  
  1323. ; установка номера в реальный и виртуальный дисковод
  1324. ; A = 0..3 - номер дисковода для установки
  1325. SET_VIRTREAL    LD A,(RREG_A)
  1326.                 LD E,A
  1327.                 CALL GET_VIRTREAL
  1328.                 AND %11110000
  1329.                 LD D,A
  1330.                 LD A,E
  1331.                 AND 3
  1332.                 LD E,A
  1333.                 ADD A,A
  1334.                 ADD A,A
  1335.                 OR E
  1336. .L1             LD L,A
  1337.         ROMCALL IWRITECMOS,ROM_RST82
  1338.                 JP GET_VIRT_BITS
  1339.  
  1340. ; установка номера реального дисковода
  1341. ; A = 0..3 - номер дисковода для установки
  1342. SET_REAL        LD A,(RREG_A)
  1343.                 LD E,A
  1344.                 CALL GET_VIRTREAL
  1345.                 AND %11110011
  1346.                 LD D,A
  1347.                 LD A,E
  1348.                 AND 3
  1349.                 ADD A,A
  1350.                 ADD A,A
  1351.                 OR D
  1352.                 JR SET_VIRTREAL.L1
  1353.  
  1354. ; установка номера виртуального дисковода
  1355. ; A = 0..3 - номер дисковода для установки
  1356. SET_VIRT        LD A,(RREG_A)
  1357.                 LD E,A
  1358.                 CALL GET_VIRTREAL
  1359.                 AND %11111100
  1360.                 LD D,A
  1361.                 LD A,E
  1362.                 AND 3
  1363.                 OR D
  1364.                 JR SET_VIRTREAL.L1
  1365.  
  1366. GET_VIRTREAL    LD H,VIRT_REAL_DRIVE
  1367.         ROMCALL READCMOS,ROM_RST82
  1368.                 AND 0x0F
  1369.                 RET
  1370.