Subversion Repositories pentevo

Rev

Rev 665 | Rev 689 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

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