Subversion Repositories pentevo

Rev

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

  1.  
  2. ;LAST UPDATE: 21.12.2017 savelij
  3.  
  4.                 include ../../macros.a80
  5.                 include ../../global_vars.a80
  6.                 include ../../define.a80
  7.                 include ../../evodos_vars.a80
  8.  
  9. STACK           EQU 0X0DFF
  10.  
  11. OLD_IF          EQU STACK-WORD*2
  12. OLD_AF          EQU STACK-WORD
  13.  
  14. ;команда выхода и переход на обработчик
  15. JP_EMU          MACRO ADDRESS
  16.                 DUPL ADDRESS-$,0;XFF
  17.                 OUT (EXIT_PORT),A
  18.                 JP ADR_ADDRESS
  19.                 ENDM
  20.  
  21. ;генерация адресов для таблицы
  22. LABEL_GEN       MACRO ADDRESS
  23. _ADDRESS        EQU ($-TABLE_VIRT)/4
  24.                 DW ADDRESS,ADR_ADDRESS.WORK
  25.                 ENDM
  26.  
  27. ;переход на обработчик с кодом адреса
  28. EMU_JUMP        MACRO ADDRESS
  29. ADR_ADDRESS     EQU $
  30.                 LD (OLD_AF+1),A
  31.                 LD A,_ADDRESS
  32.                 JP WORKER
  33.  
  34. .WORK           EQU $
  35.                 ENDM
  36.  
  37.                 ORG 0
  38.                 DUPL 0X0038-$,0;XFF
  39.                 EI
  40.                 RET
  41.  
  42.                 DUPL 0X006F-$,0;XFF
  43.                 JP (HL)
  44.  
  45.                 JP_EMU 0X02BE                   ; OUT      (0XFF), A
  46.  
  47.                 DUPL 0X801-$,0;XFF
  48. ;[таблица адресов перехвата и вызыватора обработчиков]
  49. TABLE_VIRT      LABEL_GEN 0X02BE                ; OUT      (0XFF), A
  50.                 LABEL_GEN 0X1E3A                ; OUT      (0X3F), A
  51.                 LABEL_GEN 0X1FDD                ; IN    A, (0X1F)
  52.                 LABEL_GEN 0X1FF3                ; OUT      (0XFF), A
  53.                 LABEL_GEN 0X2000                ; OUT      (0X1F), A
  54.                 LABEL_GEN 0X2076                ; IN    A, (0X1F)
  55.                 LABEL_GEN 0X2085                ; OUT      (0X3F), A
  56.                 LABEL_GEN 0X208D                ; OUT      (0X5F), A
  57.                 LABEL_GEN 0X2093                ; OUT      (0X1F), A
  58.                 LABEL_GEN 0X2099                ; IN    A, (0X1F)
  59.                 LABEL_GEN 0X20B1                ; IN    A, (0XFF)
  60.                 LABEL_GEN 0X20B8                ; OUT      (C),    D
  61.                 LABEL_GEN 0X2740                ; IN    A, (0X1F)
  62.                 LABEL_GEN 0X2748                ; OUT      (0X7F), A
  63.                 LABEL_GEN 0X2A53                ; OUT      (C),    A
  64.                 LABEL_GEN 0X2A71                ; OUT      (0XFF), A MAGIC
  65.                 LABEL_GEN 0X2A77                ; IN    A, (0X1F)    MAGIC
  66.                 LABEL_GEN 0X2AD9                ; OUT      (OXFF), A MAGIC
  67.                 LABEL_GEN 0X2B25                ; IN    A, (0X5F)    MAGIC
  68.                 LABEL_GEN 0X2C07                ; IN    A, (0X5F)    MAGIC
  69.                 LABEL_GEN 0X2CD8                ; IN    A, (0X5F)    MAGIC
  70.                 LABEL_GEN 0X2D75                ; OUT      (0X5F), A MAGIC
  71.                 LABEL_GEN 0X2D80                ; OUT      (0X1F), A MAGIC
  72.                 LABEL_GEN 0X2D87                ; IN    A, (0X1F)    MAGIC
  73.                 LABEL_GEN 0X2F0C                ; OUT      (0XFF), A MAGIC
  74.                 LABEL_GEN 0X2F1D                ; OUT      (0X5F), A MAGIC
  75.                 LABEL_GEN 0X2F28                ; OUT      (0X1F), A MAGIC
  76.                 LABEL_GEN 0X2F2F                ; IN    A, (0X1F)    MAGIC
  77.                 LABEL_GEN 0X2F3C                ; OUT      (0XFF), A MAGIC
  78.                 LABEL_GEN 0X2F4D                ; OUT      (0XFF), A MAGIC
  79.                 LABEL_GEN 0X2F50                ; OUT      (0X7F), A MAGIC
  80.                 LABEL_GEN 0X2F57                ; OUT      (0X1F), A MAGIC
  81.                 LABEL_GEN 0X2F59                ; IN    A, (0XFF)
  82.                 LABEL_GEN 0X2FB1                ; OUT      (0XFF), A
  83.                 LABEL_GEN 0X2FC3                ; OUT      (0X1F), A
  84.                 LABEL_GEN 0X3C30                ; IN    A, (0X1F)
  85.                 LABEL_GEN 0X3D4D                ; OUT      (0XFF), A
  86.                 LABEL_GEN 0X3D9A                ; OUT      (0X1F), A
  87.                 LABEL_GEN 0X3DA6                ; IN    A, (0XFF)
  88.                 LABEL_GEN 0X3DB5                ; IN    A, (0X1F)
  89.                 LABEL_GEN 0X3DBA                ; IN    A, (0X1F)
  90.                 LABEL_GEN 0X3DD5                ; OUT      (0XFF), A
  91.                 LABEL_GEN 0X3E30                ; IN    A, (0X1F)
  92.                 LABEL_GEN 0X3E3A                ; IN    A, (0X1F)
  93.                 LABEL_GEN 0X3E44                ; OUT      (0X7F), A
  94.                 LABEL_GEN 0X3E4C                ; OUT      (0X7F), A
  95.                 LABEL_GEN 0X3E50                ; IN    A, (0X3F)
  96.                 LABEL_GEN 0X3E78                ; IN    A, (0X3F)
  97.                 LABEL_GEN 0X3E7E                ; OUT      (0X3F), A
  98.                 LABEL_GEN 0X3E87                ; IN    A, (0X3F)
  99.                 LABEL_GEN 0X3E95                ; OUT      (0X3F), A
  100.                 LABEL_GEN 0X3EB5                ; IN    A, (0X1F)
  101.                 LABEL_GEN 0X3EBC                ; IN    A, (0X3F)
  102.                 LABEL_GEN 0X3EC9                ; OUT      (0X1F), A
  103.                 LABEL_GEN 0X3ECE                ; IN    A, (0XFF)
  104.                 LABEL_GEN 0X3EDF                ; OUT      (0X1F), A
  105.                 LABEL_GEN 0X3EF3                ; IN    H, (C)
  106.                 LABEL_GEN 0X3EF5                ; IN    A, (0XFF)
  107.                 LABEL_GEN 0X3EFE                ; IN    A, (0X7F)
  108.                 LABEL_GEN 0X3F1B                ; OUT      (0X5F), A
  109.                 LABEL_GEN 0X3F25                ; OUT      (0X1F), A
  110.                 LABEL_GEN 0X3F33                ; IN    A, (0X1F)
  111.                 LABEL_GEN 0X3F4D                ; OUT      (0X1F), A
  112.                 LABEL_GEN 0X3F55                ; IN    A, (0X3F)
  113.                 LABEL_GEN 0X3F5A                ; IX    A, (0X5F)
  114.                 LABEL_GEN 0X3F69                ; IN    A, (0X3F)
  115.                 LABEL_GEN 0X3F72                ; IN    A, (0X5F)
  116.                 LABEL_GEN 0X3FBC                ; IN    A, (0XFF)
  117.                 LABEL_GEN 0X3FCA                ; IN    A, (0XFF)
  118.                 LABEL_GEN 0X3FD1                ; OUTI
  119.                 LABEL_GEN 0X3FD7                ; IN    A, (0XFF)
  120.                 LABEL_GEN 0X3FE5                ; IN    A, (0XFF)
  121.                 LABEL_GEN 0X3FEC                ; INI
  122.                 LABEL_GEN 0X3FF0                ; OUT      (C),    A
  123.                 LABEL_GEN 0X3FF3                ; IN    A, (C)
  124.  
  125. ;[вызываторы перехвата]
  126. ;OUT (0XFF),A
  127.                 EMU_JUMP 0X02BE
  128.                 JP OUT_FF
  129.  
  130. ;OUT (0X3F),A
  131.                 EMU_JUMP 0X1E3A
  132.                 JP OUT_3F
  133.  
  134. ;IN A,(0X1F)
  135.                 EMU_JUMP 0X1FDD
  136.                 JP IN_1F
  137.  
  138. ;OUT (0XFF),A
  139.                 EMU_JUMP 0X1FF3
  140.                 JP OUT_FF
  141.  
  142. ;OUT (0X1F),A
  143.                 EMU_JUMP 0X2000
  144.                 JP OUT_1F
  145.  
  146. ;IN A,(0X1F)
  147.                 EMU_JUMP 0X2076
  148.                 JP IN_1F
  149.  
  150. ;OUT (0X3F),A
  151.                 EMU_JUMP 0X2085
  152.                 JP OUT_3F
  153.  
  154. ;OUT (0X5F),A
  155.                 EMU_JUMP 0X208D
  156.                 JP OUT_5F
  157.  
  158. ;OUT (0X1F),A
  159.                 EMU_JUMP 0X2093
  160.                 JP OUT_1F
  161.  
  162. ;IN A,(0X1F)
  163.                 EMU_JUMP 0X2099
  164.                 JP IN_1F
  165.  
  166. ;IN A,(0XFF)
  167.                 EMU_JUMP 0X20B1
  168.                 JP IN_FF
  169.  
  170. ;OUT (C),D
  171.                 EMU_JUMP 0X20B8
  172.                 JP OUT_C_D
  173.  
  174. ;IN A,(0X1F)
  175.                 EMU_JUMP 0X2740
  176.                 JP IN_1F
  177.  
  178. ;OUT (0X7F),A
  179.                 EMU_JUMP 0X2748
  180.                 JP OUT_7F
  181.  
  182. ;OUT (C),A
  183.                 EMU_JUMP 0X2A53
  184.                 JP OUT_C_A
  185.  
  186. ;OUT (0XFF),A
  187.                 EMU_JUMP 0X2A71
  188.                 JP OUT_FF
  189.  
  190. ;IN A,(0X1F)
  191.                 EMU_JUMP 0X2A77
  192.                 JP IN_1F
  193.  
  194. ;OUT (0XFF),A
  195.                 EMU_JUMP 0X2AD9
  196.                 JP OUT_FF
  197.  
  198. ;IN A,(0X5F)
  199.                 EMU_JUMP 0X2B25
  200.                 JP IN_5F
  201.  
  202. ;IN A,(0X5F)
  203.                 EMU_JUMP 0X2C07
  204.                 JP IN_5F
  205.  
  206. ;IN A,(0X5F)
  207.                 EMU_JUMP 0X2CD8
  208.                 JP IN_5F
  209.  
  210. ;OUT (0X5F),A
  211.                 EMU_JUMP 0X2D75
  212.                 JP OUT_5F
  213.  
  214. ;OUT (0X1F),A
  215.                 EMU_JUMP 0X2D80
  216.                 JP OUT_1F
  217.  
  218. ;IN A,(0X1F)
  219.                 EMU_JUMP 0X2D87
  220.                 JP IN_1F
  221.  
  222. ;OUT (0XFF),A
  223.                 EMU_JUMP 0X2F0C
  224.                 JP OUT_FF
  225.  
  226. ;OUT (0X5F),A
  227.                 EMU_JUMP 0X2F1D
  228.                 JP OUT_5F
  229.  
  230. ;OUT (0X1F),A
  231.                 EMU_JUMP 0X2F28
  232.                 JP OUT_1F
  233.  
  234. ;IN A,(0X1F)
  235.                 EMU_JUMP 0X2F2F
  236.                 JP IN_1F
  237.  
  238. ;OUT (0XFF),A
  239.                 EMU_JUMP 0X2F3C
  240.                 JP OUT_FF
  241.  
  242. ;OUT (0XFF),A
  243.                 EMU_JUMP 0X2F4D
  244.                 JP OUT_FF
  245.  
  246. ;OUT (0X7F),A
  247.                 EMU_JUMP 0X2F50
  248.                 JP OUT_7F
  249.  
  250. ;OUT (0X1F),A
  251.                 EMU_JUMP 0X2F57
  252.                 JP OUT_1F
  253.  
  254. ;IN A,(0XFF)
  255.                 EMU_JUMP 0X2F59
  256.                 CALL IN_FF
  257.                 LD HL,EXIT_0X2F59
  258.                 LD (ADR_EXIT),HL
  259.                 JP UPDATE_AF
  260.  
  261. ;OUT (0XFF),A
  262.                 EMU_JUMP 0X2FB1
  263.                 JP OUT_FF
  264.  
  265. ;OUT (0X1F),A
  266.                 EMU_JUMP 0X2FC3
  267.                 JP OUT_1F
  268.  
  269. ;IN A,(0X1F)
  270.                 EMU_JUMP 0X3C30
  271.                 JP IN_1F
  272.  
  273. ;OUT (0XFF),A
  274.                 EMU_JUMP 0X3D4D
  275.                 JP OUT_FF
  276.  
  277. ;OUT (0X1F),A
  278.                 EMU_JUMP 0X3D9A
  279.                 JP OUT_1F
  280.  
  281. ;IN A,(0XFF)
  282.                 EMU_JUMP 0X3DA6
  283.                 JP IN_FF
  284.  
  285. ;IN A,(0X1F)
  286.                 EMU_JUMP 0X3DB5
  287.                 JP IN_1F
  288.  
  289. ;IN A,(0X1F)
  290.                 EMU_JUMP 0X3DBA
  291.                 JP IN_1F
  292.  
  293. ;OUT (0XFF),A
  294.                 EMU_JUMP 0X3DD5
  295.                 JP OUT_FF
  296.  
  297. ;IN A,(0X1F)
  298.                 EMU_JUMP 0X3E30
  299.                 JP IN_1F
  300.  
  301. ;IN A,(0X1F)
  302.                 EMU_JUMP 0X3E3A
  303.                 JP IN_1F
  304.  
  305. ;OUT (0X7F),A
  306.                 EMU_JUMP 0X3E44
  307.                 JP OUT_7F
  308.  
  309. ;OUT (0X7F),A
  310.                 EMU_JUMP 0X3E4C
  311.                 JP OUT_7F
  312.  
  313. ;IN A,(0X3F)
  314.                 EMU_JUMP 0X3E50
  315.                 JP IN_3F
  316.  
  317. ;IN A,(0X3F)
  318.                 EMU_JUMP 0X3E78
  319.                 JP IN_3F
  320.  
  321. ;OUT (0X3F),A
  322.                 EMU_JUMP 0X3E7E
  323.                 JP OUT_3F
  324.  
  325. ;IN A,(0X3F)
  326.                 EMU_JUMP 0X3E87
  327.                 JP IN_3F
  328.  
  329. ;OUT (0X3F),A
  330.                 EMU_JUMP 0X3E95
  331.                 JP OUT_3F
  332.  
  333. ;IN A,(0X1F)
  334.                 EMU_JUMP 0X3EB5
  335.                 JP IN_1F
  336.  
  337. ;IN A,(0X3F)
  338.                 EMU_JUMP 0X3EBC
  339.                 JP IN_3F
  340.  
  341. ;OUT (0X1F),A
  342.                 EMU_JUMP 0X3EC9
  343.                 JP OUT_1F
  344.  
  345. ;IN A,(0XFF)
  346.                 EMU_JUMP 0X3ECE
  347.                 JP IN_FF
  348.  
  349. ;OUT (0X1F),A
  350.                 EMU_JUMP 0X3EDF
  351.                 JP OUT_1F
  352.  
  353. ;IN H,(C)
  354.                 EMU_JUMP 0X3EF3
  355.                 JP IN_H_C
  356.  
  357. ;IN A,(0XFF)
  358.                 EMU_JUMP 0X3EF5
  359.                 CALL IN_FF
  360.                 LD HL,EXIT_0X3EF5
  361.                 LD (ADR_EXIT),HL
  362. UPDATE_AF       LD A,(OLD_AF+1)
  363.                 AND 0XC0
  364.                 PUSH AF
  365.                 POP HL
  366.                 LD (OLD_AF),HL
  367.                 RET
  368.  
  369. ;IN A,(0X7F)
  370.                 EMU_JUMP 0X3EFE
  371.                 CALL INFF_BIT6
  372.                 JP IN_7F
  373.  
  374. ;OUT (0X5F),A
  375.                 EMU_JUMP 0X3F1B
  376.                 JP OUT_5F
  377.  
  378. ;OUT (0X1F),A
  379.                 EMU_JUMP 0X3F25
  380.                 JP OUT_1F
  381.  
  382. ;IN A,(0X1F)
  383.                 EMU_JUMP 0X3F33
  384.                 JP IN_1F
  385.  
  386. ;OUT (0X1F),A
  387.                 EMU_JUMP 0X3F4D
  388.                 JP OUT_1F
  389.  
  390. ;IN A,(0X3F)
  391.                 EMU_JUMP 0X3F55
  392.                 JP IN_3F
  393.  
  394. ;IN A,(0X5F)
  395.                 EMU_JUMP 0X3F5A
  396.                 JP IN_5F
  397.  
  398. ;IN A,(0X3F)
  399.                 EMU_JUMP 0X3F69
  400.                 JP IN_3F
  401.  
  402. ;IN A,(0X5F)
  403.                 EMU_JUMP 0X3F72
  404.                 JP IN_5F
  405.  
  406. ;IN A,(0XFF)    ;запись сектора
  407.                 EMU_JUMP 0X3FBC
  408.                 JP WRITE_SECTOR
  409.  
  410. ;IN A,(0XFF)    ;запись сектора
  411.                 EMU_JUMP 0X3FCA
  412.                 JP WRITE_SECTOR
  413.  
  414. ;OUTI           ;запись сектора
  415.                 EMU_JUMP 0X3FD1
  416.                 JP WRITE_SECTOR
  417.  
  418. ;IN A,(0XFF)    ;чтение сектора
  419.                 EMU_JUMP 0X3FD7
  420.                 JP READ_SECTOR
  421.  
  422. ;IN A,(0XFF)    ;чтение сектора
  423.                 EMU_JUMP 0X3FE5
  424.                 JP READ_SECTOR
  425.  
  426. ;INI            ;чтение сектора
  427.                 EMU_JUMP 0X3FEC
  428.                 JP IN_INI
  429.  
  430. ;OUT (C),A
  431.                 EMU_JUMP 0X3FF0
  432.                 LD BC,(OLD_BC)
  433.                 LD A,(OLD_AF+1)
  434.                 OUT (C),A
  435.                 RET
  436.  
  437. ;IN A,(C)
  438.                 EMU_JUMP 0X3FF3
  439.                 LD BC,(OLD_BC)
  440.                 IN A,(C)
  441.                 PUSH AF
  442.                 POP HL
  443.                 LD (OLD_AF),HL
  444.                 RET
  445.  
  446. ;[стек и обработчики]
  447.                 DUPL STACK-$,0;XFF
  448.                 DW INT_BREAK
  449.  
  450.                 DUPL STACK+0X41-$,0;XFF
  451. INT_BREAK       PUSH AF
  452.                 PUSH HL
  453.                 PUSH DE
  454.                 LD A,(FLAG_RW_BREAK)
  455.                 AND A
  456.                 JR NZ,IB1
  457.                 LD HL,(OLD_IF)
  458.                 LD L,0XFF
  459.                 LD E,(HL)
  460.                 INC HL
  461.                 LD D,(HL)
  462.                 LD HL,(OLD_SP)
  463.                 DEC HL
  464.                 LD (HL),D
  465.                 DEC HL
  466.                 LD (HL),E
  467.                 LD (OLD_SP),HL
  468.                 POP DE
  469.                 POP HL
  470.                 POP AF
  471.                 EI
  472.                 RET
  473.  
  474. IB1             PUSH BC
  475.                 LD (INT_SP),SP
  476.                 CALL READ_TMP_CPU12
  477.                 CALL WRITE_CPU12
  478.                 LD A,(OLD_PORT_BF)
  479.                 OUT (PEVO_CONF),A
  480.                 LD A,(OLD_IF+1)
  481.                 LD I,A
  482.                 LD HL,(OLD_AF)
  483.                 PUSH HL
  484.                 POP AF
  485.                 LD HL,(OLD_SP)
  486.                 LD DE,0X2A71
  487.                 DEC HL
  488.                 LD (HL),D
  489.                 DEC HL
  490.                 LD (HL),E
  491.                 DEC HL
  492.                 EX DE,HL
  493.                 LD HL,OLD_IF+1
  494.                 LD H,(HL)
  495.                 LD L,0XFF
  496.                 LD C,(HL)
  497.                 INC HL
  498.                 LD B,(HL)
  499.                 EX DE,HL
  500.                 LD (HL),B
  501.                 DEC HL
  502.                 LD (HL),C
  503.                 LD SP,HL
  504.                 LD HL,(OLD_HL)
  505.                 LD DE,(OLD_DE)
  506.                 LD BC,(OLD_BC)
  507.                 EI
  508.                 JP 0X2A53
  509.  
  510. INT_RET         LD SP,0
  511. INT_SP          EQU $-2
  512.                 IN A,(PEVO_CONF)
  513.                 OR 1
  514.                 OUT (PEVO_CONF),A
  515.                 LD A,HIGH (STACK)
  516.                 LD I,A
  517.                 CALL WRITE_TMP_CPU12
  518.                 POP BC
  519.                 POP DE
  520.                 POP HL
  521.                 POP AF
  522.                 RET
  523.  
  524. ;выход из обработчика
  525. EXIT_PAGE_FE    LD A,(OLD_PORT_BF)
  526.                 OUT (PEVO_CONF),A               ;восстановление порта 0xBF
  527.                 LD A,(OLD_IF+1)
  528.                 LD I,A
  529.                 LD HL,(OLD_AF)
  530.                 PUSH HL
  531.                 POP AF
  532.                 LD HL,0                         ;восстановление HL
  533. OLD_HL          EQU $-2
  534.                 LD DE,0                         ;восстановление DE
  535. OLD_DE          EQU $-2
  536.                 LD BC,0                         ;восстановление BC
  537. OLD_BC          EQU $-2
  538.                 LD SP,0                         ;восстановление SP
  539. OLD_SP          EQU $-2
  540.                 JP 0
  541. ADR_EXIT        EQU $-2        
  542.  
  543.                 DUPL STACK+0X101-$,0;XFF
  544. ;вход в обработчик
  545. WORKER          LD (NUM_ADR),A
  546.                 LD (OLD_SP),SP
  547.                 LD SP,STACK-WORD
  548.                 LD A,I
  549.                 JP PE,WORKER1
  550.                 LD A,I
  551. WORKER1         PUSH AF                         ;IF
  552.                 IN A,(PEVO_CONF)
  553.                 LD (OLD_PORT_BF),A              ;порт BF
  554.                 OR 1
  555.                 OUT (PEVO_CONF),A
  556.                 LD A,HIGH (STACK)
  557.                 LD I,A
  558.                 LD (OLD_HL),HL
  559.                 LD (OLD_DE),DE
  560.                 LD (OLD_BC),BC
  561.                 LD HL,0
  562. NUM_ADR         EQU $-2
  563.                 ADD HL,HL
  564.                 ADD HL,HL
  565.                 LD DE,TABLE_VIRT
  566.                 ADD HL,DE
  567.                 LD E,(HL)
  568.                 INC HL
  569.                 LD D,(HL)                       ;DE-адрес возврата из обработчика
  570.                 INC HL
  571.                 LD (ADR_EXIT),DE
  572.                 LD E,(HL)
  573.                 INC HL
  574.                 LD D,(HL)                       ;DE-адрес обработчика
  575.                 PUSH DE
  576.                 LD HL,EXIT_PAGE_FE              ;код выхода из обработчика
  577.                 EX (SP),HL
  578.                 JP (HL)
  579.  
  580. ;[чтение/запись примонтированного диска]
  581. MOUNT_RW        LD HL,0X4000
  582.                 ADD HL,SP
  583.                 LD SP,HL
  584.                 LD BC,WIN_A1
  585.                 LD A,0X40
  586.                 OUT (C),A
  587.                 LD B,HIGH (WIN_P1)
  588.                 LD A,RAM_EVODOS
  589.                 OUT (C),A
  590.                 LD A,(RDWR_MODE)
  591.                 AND 0X80
  592.                 LD L,A
  593.                 LD A,(WR_FF)
  594.                 AND 3
  595.                 OR L
  596.                 BIT 7,A
  597.                 PUSH AF
  598.                 LD HL,0X2A77
  599.                 PUSH HL
  600.                 LD HL,MNT_RW
  601.                 PUSH HL
  602.                 JP Z,0X2A53
  603.                 LD HL,(OLD_HL)
  604.                 LD DE,0X100
  605.                 CALL COPY_BLOCK
  606.                 LD (OLD_HL),HL
  607.                 JP 0X2A53
  608.  
  609.                 PHASE $+0X4000
  610. MNT_RW          LD L,A
  611.                 LD A,(PORT_3F+0X4000)           ;взяли номер трека
  612.                 ADD A,A                         ;сторон 2
  613.                 LD D,A
  614.                 LD A,(WR_FF+0X4000)
  615.                 AND 0X10                        ;проверка какая сторона диска
  616.                 JR NZ,WRRDSECM1
  617.                 INC D                           ;для стороны 1
  618. WRRDSECM1       LD A,(PORT_5F+0X4000)           ;взяли номер сектора
  619.                 LD E,A                          ;D-трек, E-сектор
  620.                 LD A,L
  621.                 LD HL,0X4100
  622.                 RST 8
  623.                 DB _MOUNTER
  624.                 DB _RDWR_MOUNT
  625.                 JP 0X3D2F
  626.  
  627.                 PHASE $-0X4000
  628. RET_MNT_RW      LD HL,-0X4000
  629.                 ADD HL,SP
  630.                 LD SP,HL
  631.                 CALL WRITE_CPU12
  632.                 POP AF
  633.                 RET NZ
  634.                 LD HL,0X100
  635.                 LD DE,(OLD_HL)
  636.                 CALL COPY_BLOCK
  637.                 LD (OLD_HL),DE
  638.                 RET
  639.  
  640. ;[инфа для создания 9 сектора нового диска]
  641. DSKINFO         DB 0                            ;+0XE1-номер первого свободного сектора
  642.                 DB 1                            ;+0XE2-номер первого свободного трека
  643.                 DB 0X16                         ;+0XE3-тип дискеты
  644.                 DB 0                            ;+0XE4-количество файлов на дискете
  645. SECFREE         DW 2544                         ;+0XE5-количество свободных секторов
  646.                 DB 0X10                         ;+0XE7-идентификационный код TRDOS
  647.                 DW 0                            ;+0XE8-2 байта 0
  648.                 DUPL 9," "                      ;+0XEA-9 байт 0X20
  649.                 DB 0                            ;+0XF3-1 байт 0
  650.                 DB 0                            ;+0XF4-количество удаленных файлов
  651.                 DB "RAMDISKO"                   ;+0XF5-имя дискеты
  652. DSK_END
  653.  
  654.                 DUPL 0X1000-$,0;XFF
  655. VARS1
  656.  
  657. ;[адреса перехвата]
  658.                 JP_EMU 0X1E3A                   ; OUT      (0X3F), A
  659.                 JP_EMU 0X1FDD                   ; IN    A, (0X1F)
  660.                 JP_EMU 0X1FF3                   ; OUT      (0XFF), A
  661.                 JP_EMU 0X2000                   ; OUT      (0X1F), A
  662.                 JP_EMU 0X2076                   ; IN    A, (0X1F)
  663.                 JP_EMU 0X2085                   ; OUT      (0X3F), A
  664.                 JP_EMU 0X208D                   ; OUT      (0X5F), A
  665.                 JP_EMU 0X2093                   ; OUT      (0X1F), A
  666.                 JP_EMU 0X2099                   ; IN    A, (0X1F)
  667.                 JP_EMU 0X20B1                   ; IN    A, (0XFF)
  668.                 JP_EMU 0X20B8                   ; OUT      (C),    D
  669.                 JP_EMU 0X2740                   ; IN    A, (0X1F)
  670.                 JP_EMU 0X2748                   ; OUT      (0X7F), A
  671.                 JP_EMU 0X2A53                   ; OUT      (C),    A
  672.  
  673. ;первая команда в обработчике MAGIC для возврата в пагу FE
  674. ;               JP_EMU 0X2A71                   ; OUT      (0XFF), A
  675.                 DUPL 0X2A73-$,0;XFF
  676.                 JP INT_RET                      ;возвращение из обработчика INT
  677.  
  678. ;               JP_EMU 0X2A77                   ; IN    A, (0X1F)
  679.                 DUPL 0X2A79-$,0;XFF
  680.                 JP RET_MNT_RW                   ;возвращение после вызова RST 8
  681.  
  682.                 JP_EMU 0X2AD9                   ; OUT      (0XFF), A
  683.                 JP_EMU 0X2B25                   ; IN    A, (0X5F)
  684.                 JP_EMU 0X2C07                   ; IN    A, (0X5F)
  685.                 JP_EMU 0X2CD8                   ; IN    A, (0X5F)
  686.                 JP_EMU 0X2D75                   ; OUT      (0X5F), A
  687.                 JP_EMU 0X2D80                   ; OUT      (0X1F), A
  688.                 JP_EMU 0X2D87                   ; IN    A, (0X1F)
  689.                 JP_EMU 0X2F0C                   ; OUT      (0XFF), A
  690.                 JP_EMU 0X2F1D                   ; OUT      (0X5F), A
  691.  
  692.                 DUPL 0X2F24-$,0;XFF             ; для адреса 0X2F4D
  693.                 JP ADR_0X2F4D
  694.  
  695.                 JP_EMU 0X2F28                   ; OUT      (0X1F), A
  696.                 JP_EMU 0X2F2F                   ; IN    A, (0X1F)
  697.                 JP_EMU 0X2F3C                   ; OUT      (0XFF), A
  698.  
  699.                 DUPL 0X2F4D-$,0;XFF             ; OUT      (0XFF), A
  700.                 OUT (EXIT_PORT),A
  701.                 DB 0X18                         ; JR 0X2F24
  702.  
  703.                 JP_EMU 0X2F50                   ; OUT      (0X7F), A
  704.  
  705.                 DUPL 0X2F57-$,0;XFF             ; OUT      (0X1F), A
  706.                 OUT (EXIT_PORT),A
  707.                 JR JUMP_0X2F57
  708.                 JR JUMP_0X2F59                  ; IN    A, (0XFF)
  709. EXIT_0X2F59     OUT (EXIT_PORT),A
  710. JUMP_0X2F59     JP ADR_0X2F59
  711. JUMP_0X2F57     JP ADR_0X2F57
  712.  
  713.                 JP_EMU 0X2FB1                   ; OUT      (0XFF), A
  714.                 JP_EMU 0X2FC3                   ; OUT      (0X1F), A
  715.  
  716.                 DUPL 0X32A2-$,0;XFF
  717. ;[обработчики чтения/записи портов]
  718. ;[запись "A" в порт 0X1F]
  719. OUT_1F          LD A,(OLD_AF+1)
  720.                 LD (WR_1F),A
  721.                 CP 0X10
  722.                 JR NC,OUT_1F_10
  723. ;00-0F команда восстановления
  724.                 XOR A
  725.                 LD (PORT_3F),A
  726.                 JR INFF_BIT6
  727.  
  728. OUT_1F_10       CP 0X20
  729.                 JR NC,OUT_1F_20
  730. ;10-1F команда поиска
  731.                 LD A,(PORT_7F)
  732.                 LD (PORT_3F),A
  733.                 CALL DISK_NONE
  734.                 LD A,0X80
  735.                 JR C,INFF_BIT6_1
  736. INFF_BIT6       XOR A
  737. INFF_BIT6_1     LD (RD_1F),A
  738.                 LD A,0XBF
  739.                 LD (RD_FF),A
  740.                 RET
  741.  
  742. OUT_1F_20       CP 0X40
  743.                 JR NC,OUT_1F_40
  744. ;20-3F команда шаг в предыдущем направлении
  745.                 LD A,(PORT_3F)
  746. NAPRAVL         NOP
  747.                 LD (PORT_3F),A
  748.                 JR INFF_BIT6
  749.  
  750. OUT_1F_40       CP 0X60
  751.                 JR NC,OUT_1F_60
  752. ;40-5F команда шаг вперед
  753.                 LD A,(PORT_3F)
  754.                 INC A
  755.                 LD (PORT_3F),A
  756.                 LD A,0X3C                       ;INC A
  757.                 LD (NAPRAVL),A
  758.                 JR INFF_BIT6
  759.  
  760. OUT_1F_60       CP 0X80
  761.                 JR NC,OUT_1F_80
  762. ;60-7F команда шаг назад
  763.                 LD A,(PORT_3F)
  764.                 DEC A
  765.                 LD (PORT_3F),A
  766.                 LD A,0X3D                       ;DEC A
  767.                 LD (NAPRAVL),A
  768.                 JR INFF_BIT6
  769.  
  770. OUT_1F_80       CP 0XA0
  771.                 JR NC,OUT_1F_A0
  772. ;80-9F команда чтение сектора
  773.                 JR INFF_BIT6;7
  774.  
  775. OUT_1F_A0       CP 0XC0
  776.                 JR NC,OUT_1F_D0
  777. ;A0-BF команда запись сектора
  778.                 JR INFF_BIT6
  779.  
  780. INFF_BIT7       XOR A
  781.                 LD (RD_1F),A
  782.                 LD A,0X7F
  783.                 LD (RD_FF),A
  784.                 RET
  785.  
  786. OUT_1F_D0       CP 0XD0
  787.                 JR NC,OUT_1F_E0
  788. ;C0-CF чтение адреса
  789.                 JR INFF_BIT6;7
  790.  
  791. OUT_1F_E0       CP 0XE0
  792.                 JR NC,OUT_1F_F0
  793. ;D0-DF принудительное прерывание
  794.                 LD A,0XBF
  795.                 LD (RD_FF),A
  796.                 RET
  797.  
  798. OUT_1F_F0       CP 0XF0
  799.                 JR C,INFF_BIT6
  800. ;E0-EF чтение дорожки
  801.                 JR INFF_BIT6
  802.  
  803. ;[запись "A" в порт 0X3F]
  804. OUT_3F          LD A,(OLD_AF+1)
  805.                 LD (PORT_3F),A
  806.                 RET
  807.  
  808. ;[запись "A" в порт 0X5F]
  809. OUT_5F          LD A,(OLD_AF+1)
  810.                 LD (PORT_5F),A
  811.                 RET
  812.  
  813. ;[запись "A" в порт 0X7F]
  814. OUT_7F          LD A,(OLD_AF+1)
  815.                 LD (PORT_7F),A
  816.                 RET
  817.  
  818. ;[запись "A" в порт 0XFF]
  819. OUT_FF          LD A,(OLD_AF+1)
  820.                 LD (WR_FF),A
  821.                 OUT (0XFF),A
  822.                 RET
  823.  
  824. ;[запись "A" в порт (C)]
  825. OUT_C_A         LD A,(OLD_AF+1)
  826. WRCA1           LD D,A
  827.                 LD BC,(OLD_BC)                  ;если порт не TR-DOS
  828.                 LD A,C
  829. ;определение в какой порт запись       
  830.                 CP 0X1F
  831.                 JP Z,OUT_1F
  832.                 CP 0X3F
  833.                 JR Z,OUT_3F
  834.                 CP 0X5F
  835.                 JR Z,OUT_5F
  836.                 CP 0X7F
  837.                 JR Z,OUT_7F
  838.                 CP 0XFF
  839.                 JR Z,OUT_FF
  840.                 CP LOW (WIN_A0)
  841.                 JR Z,WRCA3
  842. WRCA4           OUT (C),D
  843.                 RET
  844.  
  845. ;[запись в порты ATM/PENTEVO]
  846. WRCA3           LD A,B
  847.                 LD HL,BB_CPU1
  848.                 CP HIGH (WIN_A1)
  849.                 JR Z,WRCA2
  850.                 CP HIGH (WIN_P2)
  851.                 JR Z,WRCA2
  852.                 LD HL,BB_CPU2
  853.                 CP HIGH (WIN_A2)
  854.                 JR Z,WRCA2
  855.                 CP HIGH (WIN_P2)
  856.                 JR NZ,WRCA4
  857. WRCA2           LD E,B
  858.                 PUSH DE
  859.                 PUSH HL
  860.                 CALL READ_CPU12
  861.                 POP HL
  862.                 POP DE
  863.                 LD (HL),D
  864.                 INC HL
  865.                 LD (HL),E
  866.                 JP WRITE_CPU12
  867.  
  868. ;[запись "D" в порт (C)]
  869. OUT_C_D         LD A,(OLD_DE+1)
  870.                 JR WRCA1
  871.  
  872. ;[передача байта, команда OUTI]
  873. OUT_OUTI        LD HL,(BUFF_SECT)
  874.                 EXX
  875.                 LD A,(HL)
  876.                 INC HL
  877.                 EXX
  878.                 LD (HL),A
  879.                 INC HL
  880.                 LD (BUFF_SECT),HL
  881.                 RET
  882.  
  883. ;[чтение порта 0X1F]
  884. IN_1F           LD A,(WR_1F)
  885.                 AND 0XF0
  886.                 CP 0X10
  887.                 JR C,RD1F1
  888.                 CP 0X20
  889.                 JR C,RD1F3
  890.                 CP 0XD0
  891.                 JR Z,RD1F1
  892.                 XOR A
  893.                 JR RD1F2
  894.  
  895. RD1F3           LD A,(INDEX)
  896.                 XOR %00000100
  897.                 JR RD1F4
  898.  
  899. RD1F1           LD A,0X24
  900. INDEX           EQU $-1
  901. RD1F4           XOR %00000010
  902.                 LD (INDEX),A
  903. RD1F2           LD (RD_1F),A
  904.                 LD (OLD_AF+1),A
  905.                 RET
  906.  
  907. ;[чтение порта 0X3F]
  908. IN_3F           LD A,(PORT_3F)
  909.                 LD (OLD_AF+1),A
  910.                 RET
  911.  
  912. ;[чтение порта 0X5F]
  913. IN_5F           LD A,(PORT_5F)
  914.                 LD (OLD_AF+1),A
  915.                 RET
  916.  
  917. ;[чтение порта 0X7F]
  918. IN_7F           LD A,(PORT_7F)
  919.                 LD (OLD_AF+1),A
  920.                 RET
  921.  
  922. ;[чтение порта 0XFF]
  923. IN_FF           LD A,(RD_FF)
  924.                 LD (OLD_AF+1),A
  925.                 RET
  926.  
  927. ;[чтение в "H" из (С)]
  928. IN_H_C          LD A,(OLD_BC)
  929. ;[определение из какого порта чтение]
  930.                 CP 0X1F
  931.                 JR NZ,RDHC2
  932.                 LD A,(RD_1F)
  933.                 LD (OLD_HL+1),A
  934.                 RET
  935.  
  936. RDHC2           CP 0X3F
  937.                 JR NZ,RDHC3
  938.                 LD A,(PORT_3F)
  939.                 LD (OLD_HL+1),A
  940.                 RET
  941.        
  942. RDHC3           CP 0X5F
  943.                 JR NZ,RDHC4
  944.                 LD A,(PORT_5F)
  945.                 LD (OLD_HL+1),A
  946.                 RET
  947.        
  948. RDHC4           CP 0X7F
  949.                 JR NZ,RDHC5
  950.                 LD A,(PORT_7F)
  951.                 LD (OLD_HL+1),A
  952.                 RET
  953.        
  954. RDHC5           CP 0XFF
  955.                 JR NZ,RDHC6
  956.                 LD A,(RD_FF)
  957.                 LD (OLD_HL+1),A
  958.                 RET
  959.  
  960. RDHC6           LD BC,(OLD_BC)
  961.                 IN A,(C)
  962.                 LD (OLD_HL+1),A
  963.                 RET
  964.  
  965. ;[чтение INI]
  966. IN_INI          LD A,(RD_1F)
  967.                 LD HL,(OLD_HL)
  968.                 DEC HL
  969.                 LD (HL),A
  970.                 INC HL
  971.                 LD (OLD_HL),HL
  972.                 LD HL,0X2A53
  973.                 LD (ADR_EXIT),HL
  974.                 JP INFF_BIT6
  975.  
  976. ;[чтение сектора или портов]
  977. READ_SECTOR     LD A,(WR_1F)
  978.                 AND 0X0F0
  979.                 CP 0X80
  980.                 JP C,INFF_BIT6
  981.                 CP 0XC0
  982.                 JR NZ,READ_SECTOR_1
  983.                 LD A,(PORT_3F)
  984.                 LD HL,(OLD_HL)
  985.                 LD (HL),A                       ;номер дорожки
  986.                 INC HL
  987.                 LD (HL),0                       ;номер стороны
  988.                 INC HL
  989.                 LD A,(PORT_5F)
  990.                 LD (HL),A                       ;номер сектора
  991.                 INC HL
  992.                 LD (HL),0                       ;размер сектора
  993.                 INC HL
  994.                 LD (HL),0                       ;байт CRC
  995.                 INC HL
  996.                 LD (HL),0                       ;байт CRC
  997.                 INC HL
  998.                 LD (OLD_HL),HL
  999.                 LD HL,OLD_BC+1
  1000.                 LD A,(HL)
  1001.                 SUB 6                           ;REG B - 6
  1002.                 LD (HL),A
  1003.                 LD HL,0X2A53
  1004.                 LD (ADR_EXIT),HL
  1005.                 JP INFF_BIT6
  1006.  
  1007. ;[чтение сектора]
  1008. READ_SECTOR_1   XOR A
  1009.                 JR WRITE_SECTOR_1
  1010.  
  1011. ;[запись сектора]
  1012. WRITE_SECTOR    LD A,0XFF
  1013. WRITE_SECTOR_1  LD (RDWR_MODE),A
  1014.                 LD A,1
  1015.                 LD (FLAG_RW_BREAK),A
  1016.                 LD HL,(OLD_IF)
  1017.                 PUSH HL
  1018.                 POP AF
  1019.                 JP PO,DI_MODE                   ;прерывания разрешены?
  1020.                 CP 0X3F
  1021.                 JR Z,DI_MODE
  1022.                 HALT                            ;разрешены, ждем обработчик прерывания
  1023. DI_MODE         CALL READ_CPU12                 ;сохранение текущей конфигурации окон проецирования 1,2
  1024.                 CALL W_WR_RD_SECT
  1025.                 XOR A
  1026.                 LD (FLAG_RW_BREAK),A
  1027.                 LD HL,0X8090
  1028.                 LD (OLD_AF),HL                  ;эмуляция флага успешного чтения/записи сектора
  1029.                 LD HL,0X2A53
  1030.                 LD (ADR_EXIT),HL
  1031.                 JP WRITE_CPU12                  ;восстановление конфигурации окон проецирования 1,2
  1032.  
  1033. ;[чтение или запись сектора рамдиска]
  1034. W_WR_RD_SECT    LD A,(WR_FF)
  1035.                 AND 3
  1036.                 INC A
  1037.                 LD B,A
  1038.                 LD A,(COPY_VIRT_BITS)
  1039.                 REPT 5
  1040.                 RRCA
  1041.                 ENDM
  1042.                 DJNZ $-1
  1043.                 JP C,MOUNT_RW                   ;работа с примонтированным образом
  1044.                 LD BC,WIN_A1
  1045.                 LD A,0X40
  1046.                 OUT (C),A
  1047.                 LD B,HIGH (WIN_P1)
  1048.                 LD A,RAM_RAMDISK
  1049.                 OUT (C),A                       ;страница заголовков рамдиска
  1050.                 LD A,(PORT_3F)                  ;взяли номер трека
  1051.                 ADD A,A                         ;сторон 2
  1052.                 LD C,A
  1053.                 LD A,(WR_FF)
  1054.                 AND 0X10                        ;проверка какая сторона диска
  1055.                 JR NZ,WWRRD1
  1056.                 INC C                           ;для стороны 1
  1057. WWRRD1          LD B,HIGH (CPU1)+2              ;адрес начала инфы о секторах на дорожке
  1058.                 LD A,(PORT_5F)                  ;взяли номер сектора
  1059.                 LD L,A
  1060.                 LD H,0
  1061. WWRRD3          LD A,(BC)
  1062.                 LD D,A                          ;взяли номер сектора
  1063.                 INC B
  1064.                 LD A,(BC)
  1065.                 LD E,A                          ;взяли размер сектора
  1066.                 INC B
  1067. ;               LD A,D
  1068. ;               AND A
  1069. ;               JR Z,WWRRD_ERR
  1070.                 LD A,L
  1071.                 CP D
  1072.                 JR Z,WWRRD2
  1073.                 LD A,E
  1074.                 ADD A,H
  1075.                 LD H,A
  1076.                 JR WWRRD3
  1077.  
  1078. WWRRD2          LD A,E
  1079.                 RRCA
  1080.                 LD (SECTOR_SIZE),A              ;размер найденного сектора
  1081.                 LD L,0
  1082.                 LD E,L
  1083.                 SRL H
  1084.                 RR L                            ;HL=смещение в блоках до найденного сектора
  1085.                 LD B,HIGH (CPU1)
  1086.                 LD A,(BC)
  1087.                 LD D,A
  1088.                 ADD HL,DE                       ;HL=смещение от начала страницы в блоках
  1089.                 INC B
  1090.                 LD A,(BC)
  1091.                 LD C,A                          ;смещение в страницах от начала рамдиска
  1092.                 LD A,H
  1093.                 CP HIGH (CPU1)
  1094.                 JR C,WWRRD5
  1095.                 SUB 0X40
  1096.                 LD H,A
  1097.                 INC C
  1098. ;HL=смещение в странице до начала сектора
  1099. WWRRD5          LD A,C                          ;смещение до номера страницы, где указанный сектор начинается
  1100.                 ADD A,RAM_DATARAMD              ;прибавили номер начала рамдиск и +1. в 0 странице рамдиска описатели секторов
  1101.                 LD (RDWR_PAGE),A                ;сохранили номер вычисленной страницы
  1102.                 LD DE,(OLD_HL)
  1103.                 LD BC,(BB_CPU1)
  1104.                 LD A,C
  1105.                 LD C,LOW (WIN_A0)
  1106.                 OUT (C),A                       ;вернули стандартную 5 страницу
  1107. SP_RAMD9        LD A,D                          ;проверка границы откуда/куда копировать
  1108.                 CP HIGH (CPU2)
  1109.                 PUSH DE
  1110.                 LD DE,CPU1+HIGH (WIN_P1)
  1111.                 LD BC,WIN_A1                    ;если верхние 32кб озу, то нужно включить в 1 окне проецирования
  1112.                 JR NC,SP_RAMD1
  1113.                 LD DE,CPU2+HIGH (WIN_P2)
  1114.                 LD B,HIGH (WIN_A2)              ;если нижние 32кб озу, то нужно включить во 2 окне проецирования
  1115. SP_RAMD1        LD A,0X40
  1116.                 OUT (C),A
  1117.                 LD B,E
  1118.                 LD A,(RDWR_PAGE)                ;номер вычисленной страницы озу
  1119.                 OUT (C),A                       ;включили вычисленную страницу
  1120.                 LD B,D                          ;старший байт адреса начала включенной страницы
  1121.                 POP DE
  1122.                 LD A,B
  1123.                 ADD A,H
  1124.                 LD H,A
  1125.                 LD A,(RDWR_MODE)
  1126.                 AND A
  1127.                 JR NZ,IN_ROM1
  1128.                 LD A,D
  1129.                 INC A
  1130.                 JR NZ,IN_ROM1
  1131.                 LD A,E
  1132.                 AND A
  1133.                 JR Z,IN_ROM1
  1134. IN_ROM4         NEG
  1135.                 LD C,A
  1136.                 LD B,0
  1137.                 LDIR
  1138.                 NEG
  1139.                 LD C,A
  1140. IN_ROM2         EX DE,HL
  1141.                 ADD HL,BC
  1142.                 EX DE,HL
  1143.                 ADD HL,BC
  1144.                 LD A,(SECTOR_SIZE)
  1145.                 JP SP_RAMD8_
  1146.  
  1147. IN_ROM1         LD A,D
  1148.                 CP HIGH (CPU1)
  1149.                 JR NC,IN_ROM3
  1150.                 LD A,(SECTOR_SIZE)
  1151.                 AND A
  1152.                 LD BC,0X80
  1153.                 JR Z,IN_ROM2
  1154.                 LD BC,0X100
  1155.                 JR IN_ROM2
  1156.  
  1157. IN_ROM3         CP HIGH (CPU2)                  ;проверка перехода границы страниц
  1158.                 JP NC,SP_RAMD3                  ;если выше то сразу копируем
  1159.                 CP HIGH (CPU2)-1
  1160.                 JP C,SP_RAMD3                   ;если ниже так же сразу копируем
  1161.                 LD A,E
  1162.                 AND A                           ;если сектор полностью укладывется до границы, то сразу копируем
  1163.                 JR Z,SP_RAMD3                   ;иначе принудительно копируем в два приема
  1164.                 LD A,(RDWR_MODE)                ;чтение или запись?
  1165.                 AND A
  1166.                 LD A,E                          ;младший байт адрес в блоке
  1167.                 JR Z,SP_RAMD4
  1168.                 EX DE,HL                        ;для записи меняем направление
  1169. SP_RAMD4        NEG
  1170.                 LD C,A                          ;копируем остаток до конца блока
  1171.                 LD B,0
  1172.                 LDIR
  1173.                 NEG
  1174.                 PUSH AF                         ;спрятали сколько осталось копировать из начала следующего блока
  1175.                 LD BC,(BB_CPU2)
  1176.                 LD A,C
  1177.                 LD C,LOW (WIN_A0)
  1178.                 OUT (C),A
  1179.                 LD B,HIGH (WIN_A1)
  1180.                 LD A,0X40
  1181.                 OUT (C),A
  1182.                 LD B,HIGH (WIN_P1)
  1183.                 LD A,(RDWR_PAGE)
  1184.                 OUT (C),A                       ;вычисленную страницу включаем в 1 окне проецирования
  1185.                 LD A,(RDWR_MODE)                ;чтение или запись
  1186.                 AND A
  1187.                 JR Z,SP_RAMD5
  1188.                 LD A,D                          ;для записи
  1189.                 SUB 0X40                        ;изменили адрес куда копировать на другое окно проецирования
  1190.                 LD D,A
  1191.                 JR SP_RAMD6
  1192.  
  1193. SP_RAMD5        LD A,H                          ;для чтения
  1194.                 SUB 0X40                        ;изменили адрес куда копировать на другое окно проецирования
  1195.                 LD H,A
  1196. SP_RAMD6        POP AF
  1197.                 LD C,A                          ;сколько осталось скопировать байт
  1198.                 LD B,0
  1199.                 LDIR
  1200.                 LD A,(SECTOR_SIZE)
  1201.                 JR SP_RAMD8_
  1202.  
  1203. SP_RAMD3        LD A,(RDWR_MODE)                ;чтение или запись
  1204.                 AND A
  1205.                 JR Z,SP_RAMD7
  1206.                 EX DE,HL                        ;для записи меняем направление
  1207. SP_RAMD7        LD A,(SECTOR_SIZE)
  1208.                 AND A
  1209.                 JR NZ,SP_RAMD8
  1210.                 CALL COPYHBLOCK                 ;для сектора размером 128 байт копируем половину и выходим
  1211. ECOPY_BLOCK     LD A,(RDWR_MODE)
  1212.                 AND A
  1213.                 JR Z,ECOPY_BLOCK1
  1214.                 EX DE,HL
  1215. ECOPY_BLOCK1    LD (OLD_HL),DE
  1216.                 RET
  1217.  
  1218. SP_RAMD8        CALL COPY_BLOCK                 ;для сектора 256 байт копируем весь и выходим
  1219. SP_RAMD8_       DEC A
  1220.                 JR Z,ECOPY_BLOCK
  1221.                 LD (SECTOR_SIZE),A
  1222.                 LD A,(RDWR_MODE)
  1223.                 AND A
  1224.                 JR Z,SP_RAMD0
  1225.                 EX DE,HL
  1226. SP_RAMD0        LD A,0X3F
  1227.                 AND H
  1228.                 LD H,A
  1229.                 JP SP_RAMD9
  1230.  
  1231. COPY_BLOCK      REPT 128
  1232.                 LDI
  1233.                 ENDM
  1234. COPYHBLOCK      REPT 128
  1235.                 LDI
  1236.                 ENDM
  1237.                 RET
  1238.  
  1239. ;[проверка наличия маркера рамдиска]
  1240. CMP_RAM_DISK    CALL READ_CPU12
  1241.                 LD BC,WIN_P1
  1242.                 LD A,RAM_RAMDISK
  1243.                 OUT (C),A
  1244.                 LD HL,CPU1+0X3FFF
  1245.                 LD D,(HL)
  1246.                 DEC H
  1247.                 LD E,(HL)                       ;взяли байты для проверки маркера
  1248.                 CALL WRITE_CPU12
  1249.                 LD HL,"RD"
  1250.                 AND A
  1251.                 SBC HL,DE
  1252.                 RET Z                           ;если маркер на месте, то рамдиска не создаем
  1253. ;[создание чистого рамдиска]
  1254. CREATE_TRDTABL  LD BC,WIN_P1
  1255.                 LD A,RAM_RAMDISK                ;нужна страница начала рамдиска, где будет таблица описателей
  1256.                 OUT (C),A
  1257.                 LD HL,CPU1
  1258.                 PUSH HL
  1259.                 LD DE,CPU1+1
  1260.                 LD BC,0X3FFF
  1261.                 LD (HL),L
  1262.                 LDIR                            ;очистили страницу
  1263.                 POP DE                          ;адрес начала страницы
  1264.                 LD HL,0                         ;смещение в блоках и страницах
  1265.                 LD A,0XA0
  1266. ELT2            PUSH AF
  1267.                 LD BC,0X1000                    ;счетчик номеров секторов и их номера
  1268.                 LD A,L
  1269.                 RRCA
  1270.                 RRCA
  1271.                 LD (DE),A                       ;смещение в блоках дорожки в странице
  1272.                 INC D
  1273.                 LD A,H
  1274.                 LD (DE),A                       ;смещение в страницах до дорожки
  1275.                 INC D
  1276. ELT1            INC C
  1277.                 LD A,C
  1278.                 LD (DE),A                       ;номер сектора
  1279.                 INC D
  1280.                 LD A,2
  1281.                 LD (DE),A                       ;размер сектора
  1282.                 INC D
  1283.                 DJNZ ELT1                       ;вносим в таблицу все номера секторов с размерами
  1284.                 LD D,HIGH (CPU1)                ;вернули указатель в начало
  1285.                 INC E                           ;для следующей дорожки
  1286.                 LD BC,0X40
  1287.                 ADD HL,BC                       ;переход к следующей дорожке
  1288.                 POP AF
  1289.                 DEC A
  1290.                 JR NZ,ELT2                      ;повторяем для всех дорожек
  1291.                 LD HL,CPU1+0X3FFF
  1292.                 LD (HL),"R"                     ;вносим маркер рамдиска
  1293.                 DEC H
  1294.                 LD (HL),"D"
  1295.                 LD BC,WIN_P1
  1296.                 LD A,RAM_DATARAMD
  1297.                 OUT (C),A
  1298.                 LD HL,CPU1
  1299.                 LD DE,CPU1+1
  1300.                 LD BC,0X0FFF
  1301.                 LD (HL),L
  1302.                 LDIR
  1303.                 LD HL,DSKINFO
  1304.                 LD DE,CPU1+0X8E1
  1305.                 LD BC,DSK_END-DSKINFO
  1306.                 LDIR
  1307. ;[восстановление конфигурации окон проецирования 1,2]
  1308. WRITE_CPU12     LD BC,(BB_CPU1)
  1309.                 LD A,C
  1310.                 LD C,LOW (WIN_A0)
  1311.                 OUT (C),A
  1312.                 LD BC,(BB_CPU2)
  1313.                 LD A,C
  1314.                 LD C,LOW (WIN_A0)
  1315.                 OUT (C),A
  1316.                 RET
  1317.  
  1318. ;[чтение текущего конфига страниц проецирования 1,2]
  1319. READ_TMP_CPU12  LD HL,(BB_CPU1)
  1320.                 PUSH HL
  1321.                 LD HL,(BB_CPU2)
  1322.                 PUSH HL
  1323.                 CALL READ_CPU12
  1324.                 LD HL,(BB_CPU1)
  1325.                 LD (TMP_BB_CPU1),HL
  1326.                 LD HL,(BB_CPU2)
  1327.                 LD (TMP_BB_CPU2),HL
  1328.                 POP HL
  1329.                 LD (BB_CPU2),HL
  1330.                 POP HL
  1331.                 LD (BB_CPU1),HL
  1332.                 JR WRITE_CPU12
  1333.  
  1334. ;[восстановление текущей конфигурации страниц проецирования 1,2]
  1335. WRITE_TMP_CPU12 LD BC,0
  1336. TMP_BB_CPU1     EQU $-2
  1337.                 LD A,C
  1338.                 LD C,LOW (WIN_A0)
  1339.                 OUT (C),A
  1340.                 LD BC,0
  1341. TMP_BB_CPU2     EQU $-2
  1342.                 LD A,C
  1343.                 LD C,LOW (WIN_A0)
  1344.                 OUT (C),A
  1345.                 RET
  1346.  
  1347. ;[чтение конфигурации окон проецирования 1,2]
  1348. READ_CPU12      LD BC,RD_RAMNROM
  1349.                 IN L,(C)                        ;биты RAM & ROM
  1350.                 INC B
  1351.                 IN H,(C)                        ;биты DOS & 7FFD
  1352.                 ADD HL,HL
  1353.                 LD B,HIGH (RD_1WINA1)
  1354.                 IN A,(C)
  1355.                 CP 0XC0
  1356.                 JR NC,RWCPU1
  1357.                 LD E,A
  1358.                 LD D,HIGH (WIN_P1)
  1359.                 JR RWCPU2
  1360.  
  1361. RWCPU1          RLCA
  1362.                 RLCA
  1363.                 SLA L
  1364.                 RRA
  1365.                 SLA H
  1366.                 RRA
  1367.                 LD E,A
  1368.                 LD D,HIGH (WIN_A1)
  1369. RWCPU2          LD (BB_CPU1),DE
  1370.                 INC B
  1371.                 IN A,(C)
  1372.                 CP 0XC0
  1373.                 JR NC,RWCPU3
  1374.                 LD E,A
  1375.                 LD D,HIGH (WIN_P2)
  1376.                 JR RWCPU4
  1377.  
  1378. RWCPU3          RLCA
  1379.                 RLCA
  1380.                 SLA L
  1381.                 RRA
  1382.                 SLA H
  1383.                 RRA
  1384.                 LD E,A
  1385.                 LD D,HIGH (WIN_A2)
  1386. RWCPU4          LD (BB_CPU2),DE
  1387.                 RET
  1388.  
  1389. ;[проверка наличия виртуального диска]
  1390. DISK_NONE       PUSH HL
  1391.                 PUSH BC
  1392.                 CALL READ_CPU12
  1393.                 LD BC,WIN_A1
  1394.                 LD A,0X40
  1395.                 OUT (C),A
  1396.                 LD B,HIGH (WIN_P1)
  1397.                 LD A,RAM_RAMDISK
  1398.                 OUT (C),A
  1399.                 LD HL,CPU1+0X3FFF
  1400.                 LD A,(HL)
  1401.                 DEC H
  1402.                 CP "R"
  1403.                 SCF
  1404.                 JR NZ,DISK_NONE1
  1405.                 LD A,(HL)
  1406.                 CP "D"
  1407.                 SCF
  1408.                 JR NZ,DISK_NONE1
  1409.                 XOR A
  1410. DISK_NONE1      PUSH AF
  1411.                 CALL WRITE_CPU12
  1412.                 POP AF
  1413.                 POP BC
  1414.                 POP HL
  1415.                 RET
  1416.  
  1417. ;на входе: H-адрес ячейки
  1418. ;          L-прочитанное значение
  1419. READCMOS        PUSH BC
  1420.                 LD BC,CMOSD_SET_ADR
  1421.                 OUT (C),H
  1422.                 LD B,HIGH (CMOSD_RD_WR)
  1423.                 IN L,(C)
  1424.                 POP BC
  1425.                 LD A,L
  1426.                 AND A
  1427.                 RET
  1428.  
  1429. ;на входе: H-адрес ячейки
  1430. ;          L-что туда записать
  1431. WRITECMOS       PUSH BC
  1432.                 LD BC,CMOSD_SET_ADR
  1433.                 OUT (C),H
  1434.                 LD B,HIGH (CMOSD_RD_WR)
  1435.                 OUT (C),L
  1436.                 POP BC
  1437.                 RET
  1438.  
  1439.                 JP_EMU 0X3C30                   ; IN    A, (0X1F)
  1440.  
  1441.                 DUPL 0X3D2F-$,0;XFF
  1442.                 NOP
  1443.                 RET
  1444.  
  1445.                 JP_EMU 0X3D4D                   ; OUT      (0XFF), A
  1446.                 JP_EMU 0X3D9A                   ; OUT      (0X1F), A
  1447.                 JP_EMU 0X3DA6                   ; IN    A, (0XFF)
  1448.                 JP_EMU 0X3DB5                   ; IN    A, (0X1F)
  1449.                 JP_EMU 0X3DBA                   ; IN    A, (0X1F)
  1450.                 JP_EMU 0X3DD5                   ; OUT      (0XFF), A
  1451.                 JP_EMU 0X3E30                   ; IN    A, (0X1F)
  1452.                 JP_EMU 0X3E3A                   ; IN    A, (0X1F)
  1453.                 JP_EMU 0X3E44                   ; OUT      (0X7F), A
  1454.  
  1455.                 DUPL 0X3E49-$,0;XFF
  1456.                 JP ADR_0X3E4C                   ; для адреса 0X3E4C
  1457.  
  1458. ;               JP_EMU 0X3E4C                   ; OUT      (0X7F), A
  1459.                 DUPL 0X3E4C-$,0;XFF
  1460.                 OUT (EXIT_PORT),A
  1461.                 JR 0X3E49
  1462.  
  1463.                 JP_EMU 0X3E50                   ; IN    A, (0X3F)
  1464.                 JP_EMU 0X3E78                   ; IN    A, (0X3F)
  1465.                 JP_EMU 0X3E7E                   ; OUT      (0X3F), A
  1466.                 JP_EMU 0X3E87                   ; IN    A, (0X3F)
  1467.                 JP_EMU 0X3E95                   ; OUT      (0X3F), A
  1468.                 JP_EMU 0X3EB5                   ; IN    A, (0X1F)
  1469.                 JP_EMU 0X3EBC                   ; IN    A, (0X3F)
  1470.                 JP_EMU 0X3EC9                   ; OUT      (0X1F), A
  1471.                 JP_EMU 0X3ECE                   ; IN    A, (0XFF)
  1472.                 JP_EMU 0X3EDF                   ; OUT      (0X1F), A
  1473.  
  1474.                 DUPL 0X3EF3-$,0;XFF             ; IN    H, (C)
  1475.                 OUT (EXIT_PORT),A
  1476.                 JR JUMP_0X3EF3
  1477.                 JR JUMP_0X3EF5                  ; IN    A, (0XFF)
  1478. EXIT_0X3EF5     OUT (EXIT_PORT),A
  1479. JUMP_0X3EF5     JP ADR_0X3EF5
  1480.  
  1481. ;               JP_EMU 0X3EF5                   ; IN    A, (0XFF)
  1482.                 JP_EMU 0X3EFE                   ; IN    A, (0X7F)
  1483. JUMP_0X3EF3     JP ADR_0X3EF3
  1484.  
  1485.                 JP_EMU 0X3F1B                   ; OUT      (0X5F), A
  1486.                 JP_EMU 0X3F25                   ; OUT      (0X1F), A
  1487.                 JP_EMU 0X3F33                   ; IN    A, (0X1F)
  1488.  
  1489.                 DUPL 0X3F40-$,0;XFF             ; для адреса 0x3EF3
  1490.                 JP ADR_0X3EF3
  1491.  
  1492.                 JP_EMU 0X3F4D                   ; OUT      (0X1F), A
  1493.                 JP_EMU 0X3F55                   ; IN    A, (0X3F)
  1494.                 JP_EMU 0X3F5A                   ; IN    A, (0X5F)
  1495.                 JP_EMU 0X3F69                   ; IN    A, (0X3F)
  1496.                 JP_EMU 0X3F72                   ; IN    A, (0X5F)
  1497.  
  1498.                 JP_EMU 0X3FBC                   ; IN    A, (0XFF)       ;запись сектора
  1499.  
  1500.                 DUPL 0X3FC7-$,0;XFF
  1501. JUMP_0X3FF0     JP ADR_0X3FF0
  1502.  
  1503.                 JP_EMU 0X3FCA                   ; IN    A, (0XFF)       ;запись сектора
  1504.                 JP_EMU 0X3FD1                   ; OUTI                  ;запись сектора
  1505.  
  1506.                 JP_EMU 0X3FD7                   ; IN    A, (0XFF)       ;чтение сектора
  1507.  
  1508. JUMP_0X3FEC     JP ADR_0X3FEC
  1509. JUMP_0X3FF3     JP ADR_0X3FF3
  1510.  
  1511.                 JP_EMU 0X3FE5                   ; IN    A, (0XFF)       ;чтение сектора
  1512.  
  1513. ;               JP_EMU 0X3FEC                   ; INI                   ;чтение сектора
  1514.                 DUPL 0X3FEC-$,0;XFF
  1515.                 OUT (EXIT_PORT),A
  1516.                 JR JUMP_0X3FEC
  1517.  
  1518. ;               DUPL 0X3FF0-$,0                 ; OUT      (C), A
  1519.                 OUT (EXIT_PORT),A
  1520.                 DB 0X18                         ; JR 0X3FC7
  1521.  
  1522. ;               DUPL 0X3FF5-$,0                 ; IN    A, (C)
  1523.                 OUT (EXIT_PORT),A
  1524.                 JP JUMP_0X3FF3
  1525.  
  1526.                 DUPL 0X3FF8-$,0
  1527.                 DB "EVOSFE"
  1528.                 DW DATA_VERS
  1529.