Subversion Repositories pentevo

Rev

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

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