Subversion Repositories pentevo

Rev

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

  1.  
  2. ;LAST UPDATE: 04.08.2019 savelij
  3.  
  4.                 TITLE "virtual.a80"
  5.  
  6.                 DB 0XFF                         ;DCU
  7.  
  8. ;[КОПИРОВАНИЕ 256 БАЙТ]
  9. COPY_BLOCK      REPT 128                        ;КОПИРОВАНИЕ БЛОКА 256 БАЙТ
  10.                 LDI
  11.                 ENDM
  12. COPYHBLOCK      REPT 126
  13.                 LDI
  14.                 ENDM
  15.                 JR COPY_BLOCK1
  16.                
  17.                 DW 0XFFFF                       ;ДЛЯ ВЕКТОРА ПРЕРЫВАНИЙ IM2 I=9
  18.  
  19. COPY_BLOCK1     LDI
  20.                 LDI
  21.                 RET
  22.  
  23. ;номера внутренних функций
  24.  INIT_VAR
  25.  SETVAR _OUT_1F
  26.  SETVAR _OUT_3F
  27.  SETVAR _OUT_5F
  28.  SETVAR _OUT_7F
  29.  SETVAR _OUT_FF
  30.  SETVAR _OUTI
  31.  SETVAR _IN_1F
  32.  SETVAR _IN_3F
  33.  SETVAR _IN_5F
  34.  SETVAR _IN_7F
  35.  SETVAR _IN_FF
  36.  SETVAR _INI
  37.  SETVAR _OUT_C_D
  38.  SETVAR _IN_H_C
  39.  SETVAR _WR_RD_SECT
  40.  SETVAR _CMP_RAMDISK
  41. ; SETVAR _SET_VIRT_BITS
  42.  
  43.  SETVAR WOUTCA
  44.  SETVAR WWRITE_SEC_
  45.  SETVAR WREAD_SEC_
  46.  SETVAR WINI_RET
  47.  
  48. ;адреса внутренних функций
  49. ;[С ВОЗВРАТОМ В МЕСТО ВЫЗОВА]
  50. W_DATA          DW W_OUT1F                      ;00 ЗАПИСЬ ПОРТА 1F
  51.                 DW W_OUT3F                      ;01 ЗАПИСЬ ПОРТА 3F
  52.                 DW W_OUT5F                      ;02 ЗАПИСЬ ПОРТА 5F
  53.                 DW W_OUT7F                      ;03 ЗАПИСЬ ПОРТА 7F
  54.                 DW W_OUTFF                      ;04 ЗАПИСЬ ПОРТА FF
  55.                 DW W_OUTI                       ;05 OUTI
  56.                 DW W_IN1F                       ;06 ЧТЕНИЕ ПОРТА 1F
  57.                 DW W_IN3F                       ;07 ЧТЕНИЕ ПОРТА 3F
  58.                 DW W_IN5F                       ;08 ЧТЕНИЕ ПОРТА 5F
  59.                 DW W_IN7F                       ;09 ЧТЕНИЕ ПОРТА 7F
  60.                 DW W_INFF                       ;0A ЧТЕНИЕ ПОРТА FF
  61.                 DW W_INI                        ;0B INI
  62.                 DW W_OUTCD                      ;0C ЗАПИСЬ РЕГИСТРА 'D' В ПОРТ 'BC'
  63.                 DW W_INHC                       ;0D ЧТЕНИЕ В РЕГИСТР 'H' ИЗ ПОРТА 'BC'
  64.                 DW READ_WRITE_SEC               ;0E ЧТЕНИЕ/ЗАПИСЬ СЕКТОРА
  65.                 DW CMP_RAM_DISK                 ;12 ПРОВЕРКА RAM ДИСКА
  66. ;               DW SET_VIRT_BITS                ;13 УСТАНОВКА ПЕРЕМЕННОЙ СЧИТАННОЙ ИЗ RST 8
  67. EW_DATA
  68. ;[БЕЗ ВОЗВРАТА В МЕСТО ВЫЗОВА]
  69.                 DW W_OUTCA                      ;13 ЗАПИСЬ РЕГИСТРА 'A' В ПОРТ 'BC'
  70.                 DW WRITE_SEC_                   ;14 ЗАПИСЬ СЕКТОРА БЕЗ ВОЗВРАТА В АДРЕС ВЫЗОВА
  71.                 DW READ_SEC_                    ;15 ЧТЕНИЕ СЕКТОРА БЕЗ ВОЗВРАТА В АДРЕС ВЫЗОВА
  72.                 DW W_INI                        ;16 INI БЕЗ ВОЗВРАТА В АДРЕС ВЫЗОВА
  73.  
  74. TEXT4VIRTDRV    DB 0X16,ZASTV_Y+2,1
  75. TXT4VIRTDRV     DC "Virtual Drive: "
  76. ETXT4VIRTDRV
  77.  
  78. DOS_NOEMUL      DB ROM_BAS48 | 0X80             ;СТРАНИЦА DOS С ЭМУЛЯЦИЕЙ ТОЛЬКО ДЛЯ 3D13
  79. DOS_EMUL        DB ROM_ADD_BAS48 | 0X80         ;СТРАНИЦА DOS С ПОЛНЫМ ПЕРЕХВАТОМ ПОРТОВ
  80.  
  81. NUM_ALT_PAGE    IF EMU3D2F=1
  82.                 DB ROM_ADD_BAS48 | 0X80
  83.                 ELSE
  84.                 DB ROM_BAS48 | 0X80
  85.                 ENDIF
  86.  
  87. ;[ОБРАБОТЧИК RST 30]
  88. RST30_WORK      EX (SP),HL
  89.                 PUSH AF
  90.                 PUSH BC
  91.                 LD A,I
  92.                 JP PE,RST30_WORK1
  93.                 LD A,I
  94. RST30_WORK1     DI
  95.                 PUSH AF
  96.                 LD A,(NUM_ALT_PAGE)             ;НОМЕР ТЕКУЩЕЙ СТРАНИЦЫ ПЗУ
  97.                 PUSH AF
  98.                 AND 0X3E                        ;НОМЕР РЕАЛЬНОЙ СТРАНИЦЫ БЕЗ ЗАВИСИМОСТИ
  99.                 LD BC,WIN_A0
  100.                 OUT (C),A
  101.                 LD B,HIGH (WIN_P0)
  102.                 LD A,RAM_EVODOS
  103.                 OUT (C),A
  104.                 IN A,(PEVO_CONF)
  105.                 LD (WR_BF),A
  106.                 OR 1
  107.                 OUT (PEVO_CONF),A
  108.                 POP AF
  109.                 LD (TEK_ROMPAGE),A
  110.                 LD A,(HL)
  111.                 LD (DOS_STEK),SP
  112.                 LD SP,DOS_STEK
  113.                 PUSH HL                         ;ПОЛОЖИЛИ HL=АДРЕС ВОЗВРАТА
  114.                 PUSH DE
  115.                 LD HL,(DOS_STEK)
  116.                 LD DE,REG_IF
  117.                 REPT 8
  118.                 LDI
  119.                 ENDM
  120.                 LD HL,EXIT_RST30
  121.                 PUSH HL                         ;ПОЛОЖИЛИ АДРЕС ЗАВЕРШЕНИЯ
  122.                 LD HL,W_DATA
  123.                 ADD A,A
  124.                 ADD A,L        
  125.                 LD L,A
  126.                 LD A,(HL)
  127.                 INC L
  128.                 LD H,(HL)
  129.                 LD L,A
  130.                 JP (HL)
  131.  
  132. EXIT_RST30      LD HL,REG_IF
  133.                 LD DE,(DOS_STEK)
  134.                 REPT 8
  135.                 LDI
  136.                 ENDM
  137.                 POP DE
  138.                 POP HL
  139.                 LD SP,(DOS_STEK)
  140.                 LD A,(HL)
  141.                 INC HL
  142.                 CP LOW ((EW_DATA-W_DATA)/2)
  143.                 JR C,EXIT_RST302
  144.                 LD HL,FOR_RET                   ;АДРЕС ВЫХОДА БЕЗ ВОЗВРАТА В МЕСТО ВЫЗОВА
  145. EXIT_RST302     PUSH HL
  146.                 LD HL,(COPY_VIRT_BITS)
  147.                 LD A,(MASK_MNT_DRV)
  148.                 AND L
  149.                 LD A,ROM_ADD_BAS48 | 0X80       ;СТРАНИЦА ДЛЯ 3D2F
  150.                 JR NZ,EXIT_RST305               ;ВЫБОР ROM 3D2F ЕСЛИ ЕСТЬ ПРИМОНТИРОВАННЫЙ
  151.                 LD HL,(VIRT_DRIVE)              ;ИЛИ ПРОВЕРКА ДЛЯ РАМДИСКА
  152.                 LD A,(MASK_WRK_DRV)
  153.                 CP L
  154.                 LD A,ROM_ADD_BAS48 | 0X80       ;СТРАНИЦА ДЛЯ 3D2F
  155.                 JR Z,EXIT_RST305
  156.                 LD A,ROM_BAS48 | 0X80           ;СТРАНИЦЫ ДЛЯ 3D13
  157. EXIT_RST305     LD HL,(WR_BF)
  158.                 LD BC,WIN_A0
  159. EXIT_RST303     CALL WR_BYTE_RET
  160.                 LD A,L
  161.                 POP HL
  162.                 OUT (PEVO_CONF),A
  163.                 POP AF
  164.                 JP PO,EXIT_RST304
  165.                 EI
  166. EXIT_RST304     POP BC
  167.                 POP AF
  168.                 EX (SP),HL
  169.                 RET
  170.  
  171. ;[ЗАПИСЬ "A" В ПОРТ 0X1F]
  172. W_OUT1F         LD A,(REG_A)
  173.                 LD (WR_1F),A
  174.                 CP 0X10
  175.                 JR NC,W_OUT1F10
  176. ;00-0F КОМАНДА ВОССТАНОВЛЕНИЯ
  177.                 XOR A
  178.                 LD (PORT_3F),A
  179.                 LD (PORT_5F),A
  180.                 OUT (0X3F),A
  181.                 OUT (0X5F),A
  182.                 JR INFF_BIT6
  183.  
  184. W_OUT1F10       CP 0X20
  185.                 JR NC,W_OUT1F20
  186. ;10-1F КОМАНДА ПОИСКА
  187.                 LD A,(PORT_7F)
  188.                 LD (PORT_3F),A 
  189.                 OUT (0X3F),A
  190.                 CALL DISK_NONE
  191.                 LD A,0X80
  192.                 JR C,INFF_BIT61
  193. INFF_BIT6       XOR A
  194. INFF_BIT61      LD (RD_1F),A
  195.                 LD A,0XBF
  196.                 LD (RD_FF),A
  197.                 RET
  198.  
  199. W_OUT1F20       CP 0X40
  200.                 JR NC,W_OUT1F40
  201. ;20-3F КОМАНДА ШАГ В ПРЕДЫДУЩЕМ НАПРАВЛЕНИИ
  202.                 LD A,(PORT_3F)
  203. NAPRAVL         NOP
  204.                 LD (PORT_3F),A
  205.                 OUT (0X3F),A
  206.                 JR INFF_BIT6
  207.  
  208. W_OUT1F40       CP 0X60
  209.                 JR NC,W_OUT1F60
  210. ;40-5F КОМАНДА ШАГ ВПЕРЕД
  211.                 LD A,(PORT_3F)
  212.                 INC A
  213.                 LD (PORT_3F),A 
  214.                 OUT (0X3F),A
  215.                 LD A,0X3C
  216.                 LD (NAPRAVL),A
  217.                 JR INFF_BIT6
  218.  
  219. W_OUT1F60       CP 0X80
  220.                 JR NC,W_OUT1F80
  221. ;60-7F КОМАНДА ШАГ НАЗАД
  222.                 LD A,(PORT_3F)
  223.                 DEC A
  224.                 LD (PORT_3F),A 
  225.                 OUT (0X3F),A
  226.                 LD A,0X3D
  227.                 LD (NAPRAVL),A
  228.                 JR INFF_BIT6
  229.  
  230. W_OUT1F80       CP 0XA0
  231.                 JR NC,W_OUT1FA0
  232. ;80-9F КОМАНДА ЧТЕНИЕ СЕКТОРА
  233.                 JR INFF_BIT6
  234.  
  235. W_OUT1FA0       CP 0XC0
  236.                 JR NC,W_OUT1FD0
  237. ;A0-BF КОМАНДА ЗАПИСЬ СЕКТОРА
  238.                 JR INFF_BIT6
  239.  
  240. INFF_BIT7       XOR A
  241.                 LD (RD_1F),A
  242.                 LD A,0X7F
  243.                 LD (RD_FF),A
  244.                 RET
  245.  
  246. W_OUT1FD0       CP 0XD0
  247.                 JR NC,W_OUT1FE0
  248. ;C0-CF ЧТЕНИЕ АДРЕСА
  249.                 JR INFF_BIT6
  250.  
  251. W_OUT1FE0       CP 0XE0
  252.                 JR NC,W_OUT1FF0
  253. ;D0-DF ПРИНУДИТЕЛЬНОЕ ПРЕРЫВАНИЕ
  254.                 LD A,0XBF
  255.                 LD (RD_FF),A
  256.                 RET
  257.  
  258. W_OUT1FF0       CP 0XF0
  259.                 JR C,INFF_BIT6
  260. ;E0-EF ЧТЕНИЕ ДОРОЖКИ
  261.                 JR INFF_BIT6
  262.  
  263. ;[ЗАПИСЬ "A" В ПОРТ 0X3F]
  264. W_OUT3F         LD A,(REG_A)
  265.                 LD (PORT_3F),A
  266.                 OUT (0X3F),A
  267.                 RET
  268.  
  269. ;[ЗАПИСЬ "A" В ПОРТ 0X5F]
  270. W_OUT5F         LD A,(REG_A)
  271.                 LD (PORT_5F),A
  272.                 OUT (0X5F),A
  273.                 RET
  274.  
  275. ;[ЗАПИСЬ "A" В ПОРТ 0X7F]
  276. W_OUT7F         LD A,(REG_A)
  277.                 LD (PORT_7F),A
  278.                 OUT (0X7F),A
  279.                 RET
  280.  
  281. ;[ЗАПИСЬ "A" В ПОРТ 0XFF]
  282. W_OUTFF         LD A,(REG_A)
  283.                 LD (WR_FF),A
  284.                 OUT (0XFF),A
  285.                 AND 3
  286.                 LD (MASK_WRK_DRV),A             ;номер дисковода
  287.                 INC A
  288.                 LD B,A
  289. ;               LD A,%00001000
  290.                 LD A,%10001000
  291. .L1             RLCA
  292.                 DJNZ .L1
  293.                 LD (MASK_MNT_DRV),A             ;маска смонтированного дисковода
  294.                 RET
  295.  
  296. ;[ЗАПИСЬ "A" В ПОРТ (C)]
  297. W_OUTCA         LD A,(REG_A)
  298. W_OUTCA1        LD D,A
  299.                 LD BC,(REG_C)                   ;ЕСЛИ ПОРТ НЕ TR-DOS
  300.                 LD A,C
  301. ;ОПРЕДЕЛЕНИЕ В КАКОЙ ПОРТ ЗАПИСЬ       
  302.                 CP 0X1F
  303.                 JP Z,W_OUT1F
  304.                 CP 0X3F
  305.                 JR Z,W_OUT3F
  306.                 CP 0X5F
  307.                 JR Z,W_OUT5F
  308.                 CP 0X7F
  309.                 JR Z,W_OUT7F
  310.                 CP 0XFF
  311.                 JR Z,W_OUTFF
  312.                 CP LOW (WIN_A0)
  313.                 JR Z,W_OUTCA3
  314. W_OUTCA4        OUT (C),D
  315.                 RET
  316.  
  317. ;[ЗАПИСЬ В ПОРТЫ ATM/PENTEVO]
  318. W_OUTCA3        LD A,B
  319.                 LD HL,BB_CPU1
  320.                 CP HIGH (WIN_A1)
  321.                 JR Z,W_OUTCA2
  322.                 CP HIGH (WIN_P2)
  323.                 JR Z,W_OUTCA2
  324.                 LD HL,BB_CPU2
  325.                 CP HIGH (WIN_A2)
  326.                 JR Z,W_OUTCA2
  327.                 CP HIGH (WIN_P2)
  328.                 JR NZ,W_OUTCA4
  329. W_OUTCA2        LD E,B
  330.                 PUSH DE
  331.                 PUSH HL
  332.                 CALL READ_WCPU12
  333.                 POP HL
  334.                 POP DE
  335.                 LD (HL),D
  336.                 INC HL
  337.                 LD (HL),E
  338.                 JP WRITE_WCPU12
  339.  
  340. ;[ЗАПИСЬ "D" В ПОРТ (C)]
  341. W_OUTCD         LD A,(IREG_D)
  342.                 JR W_OUTCA1
  343.  
  344. ;[ПЕРЕДАЧА БАЙТА, КОМАНДА OUTI]
  345. W_OUTI          LD HL,(BUFF_SECT)
  346.                 EXX
  347.                 LD A,(HL)
  348.                 INC HL
  349.                 EXX
  350.                 LD (HL),A
  351.                 INC HL
  352.                 LD (BUFF_SECT),HL
  353.                 RET
  354.  
  355. ;[ЧТЕНИЕ ПОРТА 0X1F]
  356. W_IN1F          LD A,(WR_1F)
  357.                 AND 0XF0
  358.                 CP 0X10
  359.                 JR C,W_IN1F1
  360.                 CP 0X20
  361.                 JR C,W_IN1F3
  362.                 CP 0XD0
  363.                 JR Z,W_IN1F1
  364.                 XOR A
  365.                 JR W_IN1F2
  366.  
  367. W_IN1F3         LD A,(INDEX)
  368.                 XOR %00000100
  369.                 JR W_IN1F4
  370.  
  371. W_IN1F1         LD A,0X24
  372. INDEX           EQU $-1
  373. W_IN1F4         XOR %00000010
  374.                 LD (INDEX),A
  375. W_IN1F2         LD (RD_1F),A
  376.                 LD (REG_A),A
  377.                 RET
  378.  
  379. ;[ЧТЕНИЕ ПОРТА 0X3F]
  380. W_IN3F          LD A,(PORT_3F)
  381.                 LD (REG_A),A
  382.                 RET
  383.  
  384. ;[ЧТЕНИЕ ПОРТА 0X5F]
  385. W_IN5F          LD A,(PORT_5F)
  386.                 LD (REG_A),A
  387.                 RET
  388.  
  389. ;[ЧТЕНИЕ ПОРТА 0X7F]
  390. W_IN7F          LD A,(PORT_7F)
  391.                 LD (REG_A),A
  392.                 RET
  393.  
  394. ;[ЧТЕНИЕ ПОРТА 0XFF]
  395. W_INFF          LD A,(RD_FF)
  396.                 LD (REG_A),A
  397.                 RET
  398.  
  399. ;[ЧТЕНИЕ В "H" ИЗ (С)]
  400. W_INHC          LD A,(REG_C)
  401. ;[ОПРЕДЕЛЕНИЕ ИЗ КАКОГО ПОРТА ЧТЕНИЕ]
  402. W_INHC1         CP 0X1F
  403.                 JR NZ,W_INHC2
  404.                 LD A,(RD_1F)
  405.                 LD (REG_H),A
  406.                 RET
  407.  
  408. W_INHC2         CP 0X3F
  409.                 JR NZ,W_INHC3
  410.                 LD A,(PORT_3F)
  411.                 LD (REG_H),A
  412.                 RET
  413.        
  414. W_INHC3         CP 0X5F
  415.                 JR NZ,W_INHC4
  416.                 LD A,(PORT_5F)
  417.                 LD (REG_H),A
  418.                 RET
  419.        
  420. W_INHC4         CP 0X7F
  421.                 JR NZ,W_INHC5
  422.                 LD A,(PORT_7F)
  423.                 LD (REG_H),A
  424.                 RET
  425.        
  426. W_INHC5         CP 0XFF
  427.                 JR NZ,W_INHC6
  428.                 LD A,(WR_FF)
  429.                 LD (REG_H),A
  430.                 RET
  431.  
  432. W_INHC6         LD BC,(REG_C)
  433.                 IN A,(C)
  434.                 LD (REG_H),A
  435.                 RET
  436.  
  437. ;[ЧТЕНИЕ INI]
  438. W_INI           LD A,(RD_1F)
  439.                 LD HL,(REG_L)
  440.                 LD (HL),A
  441.                 INC HL
  442.                 DEC B
  443.                 LD (REG_L),HL
  444.                 RET
  445.  
  446. ;[ЧТЕНИЕ СЕКТОРА ИЛИ ПОРТОВ]
  447. READ_SEC_       LD A,(WR_1F)
  448.                 AND 0X0F0
  449.                 CP 0X80
  450.                 JP C,INFF_BIT6
  451.                 CP 0XC0
  452.                 JR NZ,READ_SEC_1
  453.                 LD A,(PORT_3F)
  454.                 LD HL,(REG_L)
  455.                 LD (HL),A
  456.                 INC HL
  457.                 DEC B
  458.                 LD A,(PORT_5F)
  459.                 LD (HL),A
  460.                 INC HL
  461.                 DEC B
  462.                 LD (REG_L),HL
  463.                 RET
  464.  
  465. ;[ЧТЕНИЕ/ЗАПИСЬ СЕКТОРА]
  466. ;IXL=0-ЧТЕНИЕ, =FF-ЗАПИСЬ
  467. READ_WRITE_SEC  PUSH IX
  468.                 JR WRITE_SEC_1
  469.  
  470. ;[ЧТЕНИЕ СЕКТОРА]
  471. READ_SEC_1      PUSH IX
  472.                 LD IXL,0
  473.                 JR WRITE_SEC_1
  474.  
  475. ;[ЗАПИСЬ СЕКТОРА]
  476. WRITE_SEC_      PUSH IX
  477.                 LD IXL,0XFF
  478. WRITE_SEC_1     CALL READ_WCPU12
  479.                 CALL W_WR_RD_SECT
  480.                 LD IX,0X8090
  481.                 LD (REG_F),IX                   ;ЭМУЛЯЦИЯ ФЛАГА УСПЕШНОГО ЧТЕНИЯ/ЗАПИСИ СЕКТОРА
  482.                 CALL WRITE_WCPU12
  483.                 POP IX
  484.                 RET
  485.  
  486. ;[ЧТЕНИЕ ИЛИ ЗАПИСЬ СЕКТОРА РАМДИСКА]
  487. W_WR_RD_SECT    LD A,(WR_FF)
  488.                 AND 3
  489.                 INC A
  490.                 LD B,A
  491.                 LD A,%10000000
  492. .L1             RLCA
  493.                 DJNZ .L1
  494.                 LD B,A
  495.                 LD A,(COPY_VIRT_BITS)
  496. ;               REPT 5
  497. ;               RRCA
  498. ;               ENDM
  499. ;               DJNZ $-1
  500.                 AND B
  501.                 JP NZ,WR_RD_SEC_M               ;РАБОТА С ПРИМОНТИРОВАННЫМ ОБРАЗОМ
  502.                 LD BC,WIN_A1
  503.                 LD A,0X40
  504.                 OUT (C),A
  505.                 LD B,HIGH (WIN_P1)
  506.                 LD A,RAM_RAMDISK
  507.                 OUT (C),A                       ;СТРАНИЦА ЗАГОЛОВКОВ РАМДИСКА
  508.                 LD A,(PORT_3F)                  ;ВЗЯЛИ НОМЕР ТРЕКА
  509.                 ADD A,A                         ;СТОРОН 2
  510.                 LD C,A
  511.                 LD A,(WR_FF)
  512.                 AND 0X10                        ;ПРОВЕРКА КАКАЯ СТОРОНА ДИСКА
  513.                 JR NZ,WWRRD1
  514.                 INC C                           ;ДЛЯ СТОРОНЫ 1
  515. WWRRD1          LD B,HIGH (CPU1)+2              ;АДРЕС НАЧАЛА ИНФЫ О СЕКТОРАХ НА ДОРОЖКЕ
  516.                 LD A,(PORT_5F)                  ;ВЗЯЛИ НОМЕР СЕКТОРА
  517.                 LD L,A
  518.                 LD H,0
  519. WWRRD3          LD A,(BC)
  520.                 LD D,A                          ;ВЗЯЛИ НОМЕР СЕКТОРА
  521.                 INC B
  522.                 LD A,(BC)
  523.                 LD E,A                          ;ВЗЯЛИ РАЗМЕР СЕКТОРА
  524.                 INC B
  525. ;               LD A,D
  526. ;               AND A
  527. ;               JR Z,WWRRD_ERR
  528.                 LD A,L
  529.                 CP D
  530.                 JR Z,WWRRD2
  531.                 LD A,E
  532.                 ADD A,H
  533.                 LD H,A
  534.                 JR WWRRD3
  535.  
  536. WWRRD2          LD A,E
  537.                 RRCA
  538.                 LD (PORT_7F),A 
  539.                 OUT (0X7F),A                    ;РАЗМЕР НАЙДЕННОГО СЕКТОРА
  540.                 LD L,0
  541.                 LD E,L
  542.                 SRL H
  543.                 RR L                            ;HL=СМЕЩЕНИЕ В БЛОКАХ ДО НАЙДЕННОГО СЕКТОРА
  544.                 LD B,HIGH (CPU1)
  545.                 LD A,(BC)
  546.                 LD D,A
  547.                 ADD HL,DE                       ;HL=СМЕЩЕНИЕ ОТ НАЧАЛА СТРАНИЦЫ В БЛОКАХ
  548.                 INC B
  549.                 LD A,(BC)
  550.                 LD C,A                          ;СМЕЩЕНИЕ В СТРАНИЦАХ ОТ НАЧАЛА РАМДИСКА
  551.                 LD A,H
  552.                 CP HIGH (CPU1)
  553.                 JR C,WWRRD5
  554.                 SUB 0X40
  555.                 LD H,A
  556.                 INC C
  557. ;HL=СМЕЩЕНИЕ В СТРАНИЦЕ ДО НАЧАЛА СЕКТОРА
  558. WWRRD5          LD A,C                          ;СМЕЩЕНИЕ ДО НОМЕРА СТРАНИЦЫ, ГДЕ УКАЗАННЫЙ СЕКТОР НАЧИНАЕТСЯ
  559.                 ADD A,RAM_DATARAMD              ;ПРИБАВИЛИ НОМЕР НАЧАЛА РАМДИСК И +1. В 0 СТРАНИЦЕ РАМДИСКА ОПИСАТЕЛИ СЕКТОРОВ
  560.                 LD IXH,A                        ;СОХРАНИЛИ НОМЕР ВЫЧИСЛЕННОЙ СТРАНИЦЫ
  561.                 LD DE,(REG_L)
  562.                 LD BC,(BB_CPU1)
  563.                 LD A,C
  564.                 LD C,LOW (WIN_A0)
  565.                 OUT (C),A                       ;ВЕРНУЛИ СТАНДАРТНУЮ 5 СТРАНИЦУ
  566. SP_RAMD9        LD A,D                          ;ПРОВЕРКА ГРАНИЦЫ ОТКУДА/КУДА КОПИРОВАТЬ
  567.                 CP HIGH (CPU2)
  568.                 PUSH DE
  569.                 LD DE,CPU1+HIGH (WIN_P1)
  570.                 LD BC,WIN_A1                    ;ЕСЛИ ВЕРХНИЕ 32КБ ОЗУ, ТО НУЖНО ВКЛЮЧИТЬ В 1 ОКНЕ ПРОЕЦИРОВАНИЯ
  571.                 JR NC,SP_RAMD1
  572.                 LD DE,CPU2+HIGH (WIN_P2)
  573.                 LD B,HIGH (WIN_A2)              ;ЕСЛИ НИЖНИЕ 32КБ ОЗУ, ТО НУЖНО ВКЛЮЧИТЬ ВО 2 ОКНЕ ПРОЕЦИРОВАНИЯ
  574. SP_RAMD1        LD A,0X40
  575.                 OUT (C),A
  576.                 LD B,E
  577.                 LD A,IXH                        ;НОМЕР ВЫЧИСЛЕННОЙ СТРАНИЦЫ ОЗУ
  578.                 OUT (C),A                       ;ВКЛЮЧИЛИ ВЫЧИСЛЕННУЮ СТРАНИЦУ
  579.                 LD B,D                          ;СТАРШИЙ БАЙТ АДРЕСА НАЧАЛА ВКЛЮЧЕННОЙ СТРАНИЦЫ
  580.                 POP DE
  581.                 LD A,B
  582.                 ADD A,H
  583.                 LD H,A
  584.                 LD A,IXL
  585.                 AND A
  586.                 JR NZ,IN_ROM1
  587.                 LD A,D
  588.                 INC A
  589.                 JR NZ,IN_ROM1
  590.                 LD A,E
  591.                 AND A
  592.                 JR Z,IN_ROM1
  593. IN_ROM4         NEG
  594.                 LD C,A
  595.                 LD B,0
  596.                 LDIR
  597.                 NEG
  598.                 LD C,A
  599. IN_ROM2         EX DE,HL
  600.                 ADD HL,BC
  601.                 EX DE,HL
  602.                 ADD HL,BC
  603.                 LD A,(PORT_7F)
  604.                 JP SP_RAMD8_
  605.  
  606. IN_ROM1         LD A,D
  607.                 CP HIGH (CPU1)
  608.                 JR NC,IN_ROM3
  609.                 LD A,(PORT_7F)
  610.                 AND A
  611.                 LD BC,0X80
  612.                 JR Z,IN_ROM2
  613.                 LD BC,0X100
  614.                 JR IN_ROM2
  615.  
  616. IN_ROM3         CP HIGH (CPU2)                  ;ПРОВЕРКА ПЕРЕХОДА ГРАНИЦЫ СТРАНИЦ
  617.                 JP NC,SP_RAMD3                  ;ЕСЛИ ВЫШЕ ТО СРАЗУ КОПИРУЕМ
  618.                 CP HIGH (CPU2)-1
  619.                 JP C,SP_RAMD3                   ;ЕСЛИ НИЖЕ ТАК ЖЕ СРАЗУ КОПИРУЕМ
  620.                 LD A,E
  621.                 AND A                           ;ЕСЛИ СЕКТОР ПОЛНОСТЬЮ УКЛАДЫВЕТСЯ ДО ГРАНИЦЫ, ТО СРАЗУ КОПИРУЕМ
  622.                 JR Z,SP_RAMD3                   ;ИНАЧЕ ПРИНУДИТЕЛЬНО КОПИРУЕМ В ДВА ПРИЕМА
  623.                 LD A,IXL                        ;ЧТЕНИЕ ИЛИ ЗАПИСЬ?
  624.                 AND A
  625.                 LD A,E                          ;МЛАДШИЙ БАЙТ АДРЕС В БЛОКЕ
  626.                 JR Z,SP_RAMD4
  627.                 EX DE,HL                        ;ДЛЯ ЗАПИСИ МЕНЯЕМ НАПРАВЛЕНИЕ
  628. SP_RAMD4        NEG
  629.                 LD C,A                          ;КОПИРУЕМ ОСТАТОК ДО КОНЦА БЛОКА
  630.                 LD B,0
  631.                 LDIR
  632.                 NEG
  633.                 PUSH AF                 ;СПРЯТАЛИ СКОЛЬКО ОСТАЛОСЬ КОПИРОВАТЬ ИЗ НАЧАЛА СЛЕДУЮЩЕГО БЛОКА
  634.                 LD BC,(BB_CPU2)
  635.                 LD A,C
  636.                 LD C,LOW (WIN_A0)
  637.                 OUT (C),A
  638.                 LD B,HIGH (WIN_A1)
  639.                 LD A,0X40
  640.                 OUT (C),A
  641.                 LD B,HIGH (WIN_P1)
  642.                 LD A,IXH
  643.                 OUT (C),A                       ;ВЫЧИСЛЕННУЮ СТРАНИЦУ ВКЛЮЧАЕМ В 1 ОКНЕ ПРОЕЦИРОВАНИЯ
  644.                 LD A,IXL                        ;ЧТЕНИЕ ИЛИ ЗАПИСЬ
  645.                 AND A
  646.                 JR Z,SP_RAMD5
  647.                 LD A,D                          ;ДЛЯ ЗАПИСИ
  648.                 SUB 0X40                        ;ИЗМЕНИЛИ АДРЕС КУДА КОПИРОВАТЬ НА ДРУГОЕ ОКНО ПРОЕЦИРОВАНИЯ
  649.                 LD D,A
  650.                 JR SP_RAMD6
  651.  
  652. SP_RAMD5        LD A,H                          ;ДЛЯ ЧТЕНИЯ  
  653.                 SUB 0X40                        ;ИЗМЕНИЛИ АДРЕС КУДА КОПИРОВАТЬ НА ДРУГОЕ ОКНО ПРОЕЦИРОВАНИЯ
  654.                 LD H,A
  655. SP_RAMD6        POP AF
  656.                 LD C,A                          ;СКОЛЬКО ОСТАЛОСЬ СКОПИРОВАТЬ БАЙТ
  657.                 LD B,0
  658.                 LDIR
  659.                 LD A,(PORT_7F)
  660.                 JR SP_RAMD8_
  661.  
  662. SP_RAMD3        LD A,IXL                        ;ЧТЕНИЕ ИЛИ ЗАПИСЬ
  663.                 AND A
  664.                 JR Z,SP_RAMD7
  665.                 EX DE,HL                        ;ДЛЯ ЗАПИСИ МЕНЯЕМ НАПРАВЛЕНИЕ
  666. SP_RAMD7        LD A,(PORT_7F)
  667.                 AND A
  668.                 JR NZ,SP_RAMD8
  669.                 CALL COPYHBLOCK                 ;ДЛЯ СЕКТОРА РАЗМЕРОМ 128 БАЙТ КОПИРУЕМ ПОЛОВИНУ И ВЫХОДИМ
  670. ECOPY_BLOCK     LD A,IXL
  671.                 AND A
  672.                 JR Z,ECOPY_BLOCK1
  673.                 EX DE,HL
  674. ECOPY_BLOCK1    LD (REG_L),DE
  675.                 RET
  676.  
  677. SP_RAMD8        CALL COPY_BLOCK                 ;ДЛЯ СЕКТОРА 256 БАЙТ КОПИРУЕМ ВЕСЬ И ВЫХОДИМ
  678. SP_RAMD8_       DEC A
  679.                 JR Z,ECOPY_BLOCK
  680.                 LD (PORT_7F),A
  681.                 OUT (0X7F),A
  682.                 LD A,IXL
  683.                 AND A
  684.                 JR Z,SP_RAMD0
  685.                 EX DE,HL
  686. SP_RAMD0        LD A,0X3F
  687.                 AND H
  688.                 LD H,A
  689.                 JP SP_RAMD9
  690.  
  691. CP_TYPEDRIVE    PUSH BC
  692.                 PUSH HL
  693.                 LD H,VIRT_REAL_DRIVE
  694.                 CALL READCMOS
  695.                 POP HL
  696.                 AND 3
  697.                 LD B,A
  698.                 LD A,(TRD_5CF6)
  699.                 CP B
  700.                 POP BC
  701.                 RET
  702.  
  703. ;[УСТАНОВКА ПЕРЕМЕННЫХ ТЕКУЩЕГО ПРИВОДА]
  704. SET_DRIVENAME   LD H,VIRT_REAL_DRIVE
  705.                 CALL READCMOS
  706.                 RRCA
  707.                 RRCA
  708.                 AND 3
  709.                 LD (TRD_5D19),A
  710.                 LD (TRD_5CF6),A
  711.                 OR 0X3C
  712.                 LD (TRD_5D16),A
  713.                 RET
  714.  
  715. ;[ФОРМАТИРОВАНИЕ RAM ДИСКА]
  716. FORMAT_RAM      LD A,(TRD_5CF6)
  717.                 LD B,A
  718.                 INC B
  719.                 LD A,%00001000
  720.                 RLCA
  721.                 DJNZ $-1
  722.                 LD B,A
  723. ;               LD A,(COPY_VIRT_BITS)
  724.                 RST8D _MOUNTER,_GET_VIRT_BITS
  725.                 LD (COPY_VIRT_BITS),A
  726.                 AND B
  727.                 JR NZ,FORMAT_RAM3               ;ЕСЛИ БИТ=1 ФОРМАТ ПРИМОНТИРОВАННОГО ОБРАЗА
  728.                 CALL CP_TYPEDRIVE
  729.                 RET NZ                          ;ВЫХОД ДЛЯ ФОРМАТА РЕЛЬНОГО ДИСКА
  730.                 CALL CREATE_TRDTABL             ;ФОРМАТ РАМДИСКА
  731.                 XOR A
  732.                 RET
  733.  
  734. FORMAT_RAM3     LD HL,TRD_5D25
  735.                 LD DE,TRD_5D26
  736.                 LD BC,0XFF
  737.                 LD (HL),B
  738.                 LDIR
  739.                 LD D,B
  740.                 LD E,B
  741.                 LD B,0X10
  742. FORMAT_RAM1     PUSH BC
  743.                 PUSH DE
  744.                 LD B,1
  745.                 LD HL,TRD_5D25
  746.                 CALL COM_06
  747.                 POP DE
  748.                 POP BC
  749.                 INC E
  750.                 DJNZ FORMAT_RAM1
  751.                 XOR A
  752.                 RET
  753.  
  754. ;[ПРОВЕРКА НАЛИЧИЯ МАРКЕРА РАМДИСКА]
  755. CMP_RAM_DISK    CALL READ_WCPU12
  756.                 LD BC,WIN_P1
  757.                 LD A,RAM_RAMDISK
  758.                 OUT (C),A
  759.                 LD HL,CPU1+0X3FFF
  760.                 LD D,(HL)
  761.                 DEC H
  762.                 LD E,(HL)                       ;ВЗЯЛИ БАЙТЫ ДЛЯ ПРОВЕРКИ МАРКЕРА
  763.                 CALL WRITE_WCPU12
  764.                 LD HL,"RD"
  765.                 AND A
  766.                 SBC HL,DE
  767.                 RET Z                           ;ЕСЛИ МАРКЕР НА МЕСТЕ, ТО РАМДИСК НЕ СОЗДАЕМ
  768. ;[СОЗДАНИЕ ЧИСТОГО РАМДИСКА]
  769. CREATE_TRDTABL  LD BC,WIN_P1
  770.                 LD A,RAM_RAMDISK                ;НУЖНА СТРАНИЦА НАЧАЛА РАМДИСКА, ГДЕ БУДЕТ ТАБЛИЦА ОПИСАТЕЛЕЙ
  771.                 OUT (C),A
  772.                 LD HL,CPU1
  773.                 PUSH HL
  774.                 LD DE,CPU1+1
  775.                 LD BC,0X3FFF
  776.                 LD (HL),L
  777.                 LDIR                            ;ОЧИСТИЛИ СТРАНИЦУ
  778.                 POP DE                          ;АДРЕС НАЧАЛА
  779.                 LD HL,0                         ;СМЕЩЕНИЕ В БЛОКАХ И СТРАНИЦАХ
  780.                 LD A,0XA0
  781. ELT2            PUSH AF
  782.                 LD BC,0X1000                    ;СЧЕТЧИК НОМЕРОВ СЕКТОРОВ И ИХ НОМЕРА
  783.                 LD A,L
  784.                 RRCA
  785.                 RRCA
  786.                 LD (DE),A                       ;СМЕЩЕНИЕ В БЛОКАХ ДОРОЖКИ В СТРАНИЦЕ
  787.                 INC D
  788.                 LD A,H
  789.                 LD (DE),A                       ;СМЕЩЕНИЕ В СТРАНИЦАХ ДО ДОРОЖКИ
  790.                 INC D
  791. ELT1            INC C
  792.                 LD A,C
  793.                 LD (DE),A                       ;НОМЕР СЕКТОРА
  794.                 INC D
  795.                 LD A,2
  796.                 LD (DE),A                       ;РАЗМЕР СЕКТОРА
  797.                 INC D
  798.                 DJNZ ELT1                       ;ВНОСИМ В ТАБЛИЦУ ВСЕ НОМЕРА СЕКТОРОВ С РАЗМЕРАМИ
  799.                 LD D,HIGH (CPU1)                ;ВЕРНУЛИ УКАЗАТЕЛЬ В НАЧАЛО
  800.                 INC E                           ;ДЛЯ СЛЕДУЮЩЕЙ ДОРОЖКИ
  801.                 LD BC,0X40
  802.                 ADD HL,BC                       ;ПЕРЕХОД К СЛЕДУЮЩЕЙ ДОРОЖКЕ
  803.                 POP AF
  804.                 DEC A
  805.                 JR NZ,ELT2                      ;ПОВТОРЯЕМ ДЛЯ ВСЕХ ДОРОЖЕК
  806.                 LD HL,CPU1+0X3FFF
  807.                 LD (HL),"R"                     ;ВНОСИМ МАРКЕР РАМДИСКА
  808.                 DEC H
  809.                 LD (HL),"D"
  810.                 LD BC,WIN_P1
  811.                 LD A,RAM_DATARAMD
  812.                 OUT (C),A
  813.                 LD HL,CPU1
  814.                 LD DE,CPU1+1
  815.                 LD BC,0X0FFF
  816.                 LD (HL),L
  817.                 LDIR
  818.                 LD HL,DSKINFO
  819.                 LD DE,CPU1+0X8E1
  820.                 LD BC,DSK_END-DSKINFO
  821.                 LDIR
  822.                 LD BC,WIN_A1
  823.                 LD A,0X7A
  824.                 OUT (C),A
  825.                 RET
  826.  
  827. ;[ВОССТАНОВЛЕНИЕ КОНФИГУРАЦИИ ОКОН ПРОЕЦИРОВАНИЯ 1,2]
  828. WRITE_WCPU12    LD BC,(BB_CPU1)
  829.                 LD A,C
  830.                 LD C,LOW (WIN_A0)
  831.                 OUT (C),A
  832.                 LD BC,(BB_CPU2)
  833.                 LD A,C
  834.                 LD C,LOW (WIN_A0)
  835.                 OUT (C),A
  836.                 RET
  837.  
  838. ;[ЧТЕНИЕ КОНФИГУРАЦИИ ОКОН ПРОЕЦИРОВАНИЯ 1,2]
  839. READ_WCPU12     LD BC,RD_RAMNROM
  840.                 IN L,(C)                        ;БИТЫ RAM & ROM
  841.                 INC B
  842.                 IN H,(C)                        ;БИТЫ DOS & 7FFD
  843.                 ADD HL,HL
  844.                 LD B,HIGH (RD_1WINA1)
  845.                 IN A,(C)
  846.                 CP 0XC0
  847.                 JR NC,RST30_01
  848.                 LD E,A
  849.                 LD D,HIGH (WIN_P1)
  850.                 JR RST30_02
  851.  
  852. RST30_01        RLCA
  853.                 RLCA
  854.                 SLA L
  855.                 RRA
  856.                 SLA H
  857.                 RRA
  858.                 LD E,A
  859.                 LD D,HIGH (WIN_A1)
  860. RST30_02        LD (BB_CPU1),DE
  861.                 INC B
  862.                 IN A,(C)
  863.                 CP 0XC0
  864.                 JR NC,RST30_03
  865.                 LD E,A
  866.                 LD D,HIGH (WIN_P2)
  867.                 JR RST30_04
  868.  
  869. RST30_03        RLCA
  870.                 RLCA
  871.                 SLA L
  872.                 RRA
  873.                 SLA H
  874.                 RRA
  875.                 LD E,A
  876.                 LD D,HIGH (WIN_A2)
  877. RST30_04        LD (BB_CPU2),DE
  878.                 RET
  879.  
  880. DISK_NONE       PUSH HL
  881.                 PUSH BC
  882.                 CALL READ_WCPU12
  883.                 LD BC,WIN_A1
  884.                 LD A,0X40
  885.                 OUT (C),A
  886.                 LD B,HIGH (WIN_P1)
  887.                 LD A,RAM_RAMDISK
  888.                 OUT (C),A
  889.                 LD HL,CPU1+0X3FFF
  890.                 LD A,(HL)
  891.                 DEC H
  892.                 CP "R"
  893.                 SCF
  894.                 JR NZ,DISK_NONE1
  895.                 LD A,(HL)
  896.                 CP "D"
  897.                 SCF
  898.                 JR NZ,DISK_NONE1
  899.                 XOR A
  900. DISK_NONE1      PUSH AF
  901.                 CALL WRITE_WCPU12
  902.                 POP AF
  903.                 POP BC
  904.                 POP HL
  905.                 RET
  906.  
  907. ;SET_RWPORT0    RST8D _MOUNTER,_MOUNT_RAMDISK
  908. ;               RST30 _SET_VIRT_BITS
  909. ;               RET
  910.  
  911. ;SET_VIRT_BITS  LD A,(REG_A)
  912. ;       REPT 4
  913. ;               RRCA
  914. ;       ENDM
  915. ;               LD (COPY_VIRT_BITS),A
  916. ;               LD C,A
  917. ;               AND 3
  918. ;               LD (VIRT_DRIVE),A
  919. ;               LD A,C
  920. ;               RRCA
  921. ;               RRCA
  922. ;               AND 3
  923. ;               LD (REAL_DRIVE),A
  924. ;               RET
  925.