Subversion Repositories pentevo

Rev

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

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