Subversion Repositories pentevo

Rev

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

  1.  
  2. ;LAST UPDATE: 21.03.2020 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. ; ???
  435. ;               OUT (C),A
  436. ;               RET
  437.                 LD D,A
  438.                 JP WR_C_D
  439.  
  440. ;IN A,(C)
  441.                 EMU_JUMP 0X3FF3
  442.                 LD BC,(OLD_BC)
  443. ; ???
  444.                 IN A,(C)
  445.                 PUSH AF
  446.                 POP HL
  447.                 LD (OLD_AF),HL
  448.                 RET
  449.  
  450. ;[стек и обработчики]
  451.                 DUPL STACK-$,0;XFF
  452.                 DW INT_BREAK
  453.  
  454.                 DUPL STACK+0X41-$,0;XFF
  455. INT_BREAK       PUSH AF
  456.                 PUSH HL
  457.                 PUSH DE
  458.                 LD A,(FLAG_RW_BREAK)
  459.                 AND A
  460.                 JR NZ,IB1
  461.                 LD HL,(OLD_IF)
  462.                 LD L,0XFF
  463.                 LD E,(HL)
  464.                 INC HL
  465.                 LD D,(HL)
  466.                 LD HL,(OLD_SP)
  467.                 DEC HL
  468.                 LD (HL),D
  469.                 DEC HL
  470.                 LD (HL),E
  471.                 LD (OLD_SP),HL
  472.                 POP DE
  473.                 POP HL
  474.                 POP AF
  475.                 EI
  476.                 RET
  477.  
  478. IB1             PUSH BC
  479.                 LD (INT_SP),SP
  480.                 CALL READ_TMP_CPU12
  481.                 CALL WRITE_CPU12
  482.                 LD A,(OLD_PORT_BF)
  483.                 OUT (PEVO_CONF),A
  484.                 LD A,(OLD_IF+1)
  485.                 LD I,A
  486.                 LD HL,(OLD_AF)
  487.                 PUSH HL
  488.                 POP AF
  489.                 LD HL,(OLD_SP)
  490.                 LD DE,0X2A71            ; адрес возврата из обработчика прерывания внешней проги через OUT (0xFF),A
  491.                 DEC HL
  492.                 LD (HL),D
  493.                 DEC HL
  494.                 LD (HL),E
  495.                 DEC HL
  496.                 EX DE,HL
  497.                 LD HL,OLD_IF+1
  498.                 LD H,(HL)
  499.                 LD L,0XFF
  500.                 LD C,(HL)
  501.                 INC HL
  502.                 LD B,(HL)
  503.                 EX DE,HL
  504.                 LD (HL),B
  505.                 DEC HL
  506.                 LD (HL),C
  507.                 LD SP,HL
  508.                 LD HL,(OLD_HL)
  509.                 LD DE,(OLD_DE)
  510.                 LD BC,(OLD_BC)
  511.                 LD A,(WR_FF)            ; байтик для возврата через команду OUT (0xFF),A
  512.                 EI
  513.                 JP 0X2A53
  514.  
  515. INT_RET         LD SP,0
  516. INT_SP          EQU $-2
  517.                 IN A,(PEVO_CONF)
  518.                 LD (OLD_PORT_BF),A
  519.                 OR 1
  520.                 OUT (PEVO_CONF),A
  521.                 LD A,HIGH (STACK)
  522.                 LD I,A
  523.                 CALL WRITE_TMP_CPU12
  524.                 POP BC
  525.                 POP DE
  526.                 POP HL
  527.                 POP AF
  528.                 RET
  529.  
  530. ;выход из обработчика
  531. EXIT_PAGE_FE    LD A,(OLD_PORT_BF)
  532.                 OUT (PEVO_CONF),A               ;восстановление порта 0xBF
  533.                 LD A,(OLD_IF+1)
  534.                 LD I,A
  535.                 LD HL,(OLD_AF)
  536.                 PUSH HL
  537.                 POP AF
  538.                 LD HL,0                         ;восстановление HL
  539. OLD_HL          EQU $-2
  540.                 LD DE,0                         ;восстановление DE
  541. OLD_DE          EQU $-2
  542.                 LD BC,0                         ;восстановление BC
  543. OLD_BC          EQU $-2
  544.                 LD SP,0                         ;восстановление SP
  545. OLD_SP          EQU $-2
  546.                 JP 0
  547. ADR_EXIT        EQU $-2        
  548.  
  549.                 DUPL STACK+0X101-$,0;XFF
  550. ;вход в обработчик
  551. WORKER          LD (NUM_ADR),A
  552.                 LD (OLD_SP),SP
  553.                 LD SP,STACK-WORD
  554.                 LD A,I
  555.                 JP PE,WORKER1
  556.                 LD A,I
  557. WORKER1         PUSH AF                         ;IF
  558.                 IN A,(PEVO_CONF)
  559.                 LD (OLD_PORT_BF),A              ;порт BF
  560.                 OR 1
  561.                 OUT (PEVO_CONF),A
  562.                 LD A,HIGH (STACK)
  563.                 LD I,A
  564.                 LD (OLD_HL),HL
  565.                 LD (OLD_DE),DE
  566.                 LD (OLD_BC),BC
  567.                 LD HL,0
  568. NUM_ADR         EQU $-2
  569.                 ADD HL,HL
  570.                 ADD HL,HL
  571.                 LD DE,TABLE_VIRT
  572.                 ADD HL,DE
  573.                 LD E,(HL)
  574.                 INC HL
  575.                 LD D,(HL)                       ;DE-адрес возврата из обработчика
  576.                 INC HL
  577.                 LD (ADR_EXIT),DE
  578.                 LD E,(HL)
  579.                 INC HL
  580.                 LD D,(HL)                       ;DE-адрес обработчика
  581.                 PUSH DE
  582.                 LD HL,EXIT_PAGE_FE              ;код выхода из обработчика
  583.                 EX (SP),HL
  584.                 JP (HL)
  585.  
  586. ;[чтение/запись примонтированного диска]
  587. MOUNT_RW        LD HL,0X4000
  588.                 ADD HL,SP
  589.                 LD SP,HL
  590.                 LD BC,WIN_A1
  591.                 LD A,0X40
  592.                 OUT (C),A
  593.                 LD B,HIGH (WIN_P1)
  594.                 LD A,RAM_EVODOS
  595.                 OUT (C),A
  596.                 LD A,(RDWR_MODE)
  597.                 AND 0X80
  598.                 LD L,A
  599.                 LD A,(WR_FF)
  600.                 AND 3
  601.                 OR L
  602.                 BIT 7,A
  603.                 PUSH AF
  604.                 LD HL,0X2A77
  605.                 PUSH HL
  606.                 LD HL,MNT_RW
  607.                 PUSH HL
  608.                 JP Z,0X2A53
  609.                 LD HL,(OLD_HL)
  610.                 LD DE,0X100
  611.                 CALL COPY_BLOCK
  612.                 LD (OLD_HL),HL
  613.                 JP 0X2A53
  614.  
  615.                 PHASE $+0X4000
  616. MNT_RW          LD L,A
  617.                 LD A,(PORT_3F+0X4000)           ;взяли номер трека
  618.                 ADD A,A                         ;сторон 2
  619.                 LD D,A
  620.                 LD A,(WR_FF+0X4000)
  621.                 AND 0X10                        ;проверка какая сторона диска
  622.                 JR NZ,WRRDSECM1
  623.                 INC D                           ;для стороны 1
  624. WRRDSECM1       LD A,(PORT_5F+0X4000)           ;взяли номер сектора
  625.                 LD E,A                          ;D-трек, E-сектор
  626.                 LD A,L
  627.                 LD HL,0X4100
  628.                 RST8 _MOUNTER,_RDWR_MOUNT
  629.                 JP 0X3D2F
  630.  
  631.                 PHASE $-0X4000
  632. RET_MNT_RW      LD HL,-0X4000
  633.                 ADD HL,SP
  634.                 LD SP,HL
  635.                 CALL WRITE_CPU12
  636.                 POP AF
  637.                 RET NZ
  638.                 LD HL,0X100
  639.                 LD DE,(OLD_HL)
  640.                 CALL COPY_BLOCK
  641.                 LD (OLD_HL),DE
  642.                 RET
  643.  
  644. ;[инфа для создания 9 сектора нового диска]
  645. DSKINFO         DB 0                            ;+0XE1-номер первого свободного сектора
  646.                 DB 1                            ;+0XE2-номер первого свободного трека
  647.                 DB 0X16                         ;+0XE3-тип дискеты
  648.                 DB 0                            ;+0XE4-количество файлов на дискете
  649. SECFREE         DW 2544                         ;+0XE5-количество свободных секторов
  650.                 DB 0X10                         ;+0XE7-идентификационный код TRDOS
  651.                 DW 0                            ;+0XE8-2 байта 0
  652.                 DUPL 9," "                      ;+0XEA-9 байт 0X20
  653.                 DB 0                            ;+0XF3-1 байт 0
  654.                 DB 0                            ;+0XF4-количество удаленных файлов
  655.                 DB "RAMDISKO"                   ;+0XF5-имя дискеты
  656. DSK_END
  657.  
  658.                 DUPL 0X1000-$,0;XFF
  659. VARS1
  660.  
  661. ;[адреса перехвата]
  662.                 JP_EMU 0X1E3A                   ; OUT      (0X3F), A
  663.                 JP_EMU 0X1FDD                   ; IN    A, (0X1F)
  664.                 JP_EMU 0X1FF3                   ; OUT      (0XFF), A
  665.                 JP_EMU 0X2000                   ; OUT      (0X1F), A
  666.                 JP_EMU 0X2076                   ; IN    A, (0X1F)
  667.                 JP_EMU 0X2085                   ; OUT      (0X3F), A
  668.                 JP_EMU 0X208D                   ; OUT      (0X5F), A
  669.                 JP_EMU 0X2093                   ; OUT      (0X1F), A
  670.                 JP_EMU 0X2099                   ; IN    A, (0X1F)
  671.                 JP_EMU 0X20B1                   ; IN    A, (0XFF)
  672.                 JP_EMU 0X20B8                   ; OUT      (C),    D
  673.                 JP_EMU 0X2740                   ; IN    A, (0X1F)
  674.                 JP_EMU 0X2748                   ; OUT      (0X7F), A
  675.                 JP_EMU 0X2A53                   ; OUT      (C),    A
  676.  
  677. ;первая команда в обработчике MAGIC для возврата в пагу FE
  678. ;               JP_EMU 0X2A71                   ; OUT      (0XFF), A
  679.                 DUPL 0X2A73-$,0;XFF
  680.                 JP INT_RET                      ;возвращение из обработчика INT
  681.  
  682. ;               JP_EMU 0X2A77                   ; IN    A, (0X1F)
  683.                 DUPL 0X2A79-$,0;XFF
  684.                 JP RET_MNT_RW                   ;возвращение после вызова RST 8
  685.  
  686.                 JP_EMU 0X2AD9                   ; OUT      (0XFF), A
  687.                 JP_EMU 0X2B25                   ; IN    A, (0X5F)
  688.                 JP_EMU 0X2C07                   ; IN    A, (0X5F)
  689.                 JP_EMU 0X2CD8                   ; IN    A, (0X5F)
  690.                 JP_EMU 0X2D75                   ; OUT      (0X5F), A
  691.                 JP_EMU 0X2D80                   ; OUT      (0X1F), A
  692.                 JP_EMU 0X2D87                   ; IN    A, (0X1F)
  693.                 JP_EMU 0X2F0C                   ; OUT      (0XFF), A
  694.                 JP_EMU 0X2F1D                   ; OUT      (0X5F), A
  695.  
  696.                 DUPL 0X2F24-$,0;XFF             ; для адреса 0X2F4D
  697.                 JP ADR_0X2F4D
  698.  
  699.                 JP_EMU 0X2F28                   ; OUT      (0X1F), A
  700.                 JP_EMU 0X2F2F                   ; IN    A, (0X1F)
  701.                 JP_EMU 0X2F3C                   ; OUT      (0XFF), A
  702.  
  703.                 DUPL 0X2F4D-$,0;XFF             ; OUT      (0XFF), A
  704.                 OUT (EXIT_PORT),A
  705.                 DB 0X18                         ; JR 0X2F24
  706.  
  707.                 JP_EMU 0X2F50                   ; OUT      (0X7F), A
  708.  
  709.                 DUPL 0X2F57-$,0;XFF             ; OUT      (0X1F), A
  710.                 OUT (EXIT_PORT),A
  711.                 JR JUMP_0X2F57
  712.  
  713.                 JR JUMP_0X2F59                  ; IN    A, (0XFF)
  714.  
  715. EXIT_0X2F59     OUT (EXIT_PORT),A
  716. JUMP_0X2F59     JP ADR_0X2F59
  717.  
  718. JUMP_0X2F57     JP ADR_0X2F57
  719.  
  720.                 JP_EMU 0X2FB1                   ; OUT      (0XFF), A
  721.                 JP_EMU 0X2FC3                   ; OUT      (0X1F), A
  722.  
  723.                 DUPL 0X32A2-$,0;XFF
  724. ;[обработчики чтения/записи портов]
  725. ;[запись "A" в порт 0X1F]
  726. OUT_1F          LD A,(OLD_AF+1)
  727.                 LD (WR_1F),A
  728.                 CP 0X10
  729.                 JR NC,OUT_1F_10
  730. ;00-0F команда восстановления
  731.                 XOR A
  732.                 LD (PORT_3F),A
  733.                 JR INFF_BIT6
  734.  
  735. OUT_1F_10       CP 0X20
  736.                 JR NC,OUT_1F_20
  737. ;10-1F команда поиска
  738.                 LD A,(PORT_7F)
  739.                 LD (PORT_3F),A
  740.                 CALL DISK_NONE
  741.                 LD A,0X80
  742.                 JR C,INFF_BIT6_1
  743. INFF_BIT6       XOR A
  744. INFF_BIT6_1     LD (RD_1F),A
  745.                 LD A,0XBF
  746.                 LD (RD_FF),A
  747.                 RET
  748.  
  749. OUT_1F_20       CP 0X40
  750.                 JR NC,OUT_1F_40
  751. ;20-3F команда шаг в предыдущем направлении
  752.                 LD A,(PORT_3F)
  753. NAPRAVL         NOP
  754.                 LD (PORT_3F),A
  755.                 JR INFF_BIT6
  756.  
  757. OUT_1F_40       CP 0X60
  758.                 JR NC,OUT_1F_60
  759. ;40-5F команда шаг вперед
  760.                 LD A,(PORT_3F)
  761.                 INC A
  762.                 LD (PORT_3F),A
  763.                 LD A,0X3C                       ;INC A
  764.                 LD (NAPRAVL),A
  765.                 JR INFF_BIT6
  766.  
  767. OUT_1F_60       CP 0X80
  768.                 JR NC,OUT_1F_80
  769. ;60-7F команда шаг назад
  770.                 LD A,(PORT_3F)
  771.                 DEC A
  772.                 LD (PORT_3F),A
  773.                 LD A,0X3D                       ;DEC A
  774.                 LD (NAPRAVL),A
  775.                 JR INFF_BIT6
  776.  
  777. OUT_1F_80       CP 0XA0
  778.                 JR NC,OUT_1F_A0
  779. ;80-9F команда чтение сектора
  780.                 JR INFF_BIT6;7
  781.  
  782. OUT_1F_A0       CP 0XC0
  783.                 JR NC,OUT_1F_D0
  784. ;A0-BF команда запись сектора
  785.                 JR INFF_BIT6
  786.  
  787. INFF_BIT7       XOR A
  788.                 LD (RD_1F),A
  789.                 LD A,0X7F
  790.                 LD (RD_FF),A
  791.                 RET
  792.  
  793. OUT_1F_D0       CP 0XD0
  794.                 JR NC,OUT_1F_E0
  795. ;C0-CF чтение адреса
  796.                 JR INFF_BIT6;7
  797.  
  798. OUT_1F_E0       CP 0XE0
  799.                 JR NC,OUT_1F_F0
  800. ;D0-DF принудительное прерывание
  801.                 LD A,0XBF
  802.                 LD (RD_FF),A
  803.                 RET
  804.  
  805. OUT_1F_F0       CP 0XF0
  806.                 JR C,INFF_BIT6
  807. ;E0-EF чтение дорожки
  808.                 JR INFF_BIT6
  809.  
  810. ;[запись "A" в порт 0X3F]
  811. OUT_3F          LD A,(OLD_AF+1)
  812.                 LD (PORT_3F),A
  813.                 RET
  814.  
  815. ;[запись "A" в порт 0X5F]
  816. OUT_5F          LD A,(OLD_AF+1)
  817.                 LD (PORT_5F),A
  818.                 RET
  819.  
  820. ;[запись "A" в порт 0X7F]
  821. OUT_7F          LD A,(OLD_AF+1)
  822.                 LD (PORT_7F),A
  823.                 RET
  824.  
  825. ;[запись "A" в порт 0XFF]
  826. OUT_FF          LD A,(OLD_AF+1)
  827.                 LD (WR_FF),A
  828.                 LD D,A
  829.                 LD BC,0X00FF
  830.                 JR WR_C_D
  831. ; ???           OUT (0XFF),A
  832. ;               RET
  833.  
  834. ;[запись "A" в порт (C)]
  835. OUT_C_A         LD A,(OLD_AF+1)
  836. WRCA1           LD D,A
  837.                 LD BC,(OLD_BC)                  ;если порт не TR-DOS
  838.                 LD A,C
  839. ;определение в какой порт запись       
  840.                 CP 0X1F
  841.                 JP Z,OUT_1F
  842.                 CP 0X3F
  843.                 JR Z,OUT_3F
  844.                 CP 0X5F
  845.                 JR Z,OUT_5F
  846.                 CP 0X7F
  847.                 JR Z,OUT_7F
  848.                 CP 0XFF
  849.                 JR Z,OUT_FF
  850.                 CP LOW (WIN_A0)
  851.                 JR Z,WRCA3
  852. WR_C_D          PUSH BC
  853.                 LD BC,FDD_EMU_PORT
  854.                 IN E,(C)
  855.                 XOR A
  856.                 OUT (C),A
  857.                 POP BC
  858.                 OUT (C),D
  859.                 LD BC,FDD_EMU_PORT
  860.                 OUT (C),E
  861.                 RET
  862.  
  863. ;[запись в порты ATM/PENTEVO]
  864. WRCA3           LD A,B
  865.                 LD HL,BB_CPU1
  866.                 CP HIGH (WIN_A1)
  867.                 JR Z,WRCA2
  868.                 CP HIGH (WIN_P2)
  869.                 JR Z,WRCA2
  870.                 LD HL,BB_CPU2
  871.                 CP HIGH (WIN_A2)
  872.                 JR Z,WRCA2
  873.                 CP HIGH (WIN_P2)
  874.                 JR NZ,WR_C_D
  875. WRCA2           LD E,B
  876.                 PUSH DE
  877.                 PUSH HL
  878.                 CALL READ_CPU12
  879.                 POP HL
  880.                 POP DE
  881.                 LD (HL),D
  882.                 INC HL
  883.                 LD (HL),E
  884.                 JP WRITE_CPU12
  885.  
  886. ;[запись "D" в порт (C)]
  887. OUT_C_D         LD A,(OLD_DE+1)
  888.                 JR WRCA1
  889.  
  890. ;[передача байта, команда OUTI]
  891. OUT_OUTI        LD HL,(BUFF_SECT)
  892.                 EXX
  893.                 LD A,(HL)
  894.                 INC HL
  895.                 EXX
  896.                 LD (HL),A
  897.                 INC HL
  898.                 LD (BUFF_SECT),HL
  899.                 RET
  900.  
  901. ;[чтение порта 0X1F]
  902. IN_1F           LD A,(WR_1F)
  903.                 AND 0XF0
  904.                 CP 0X10
  905.                 JR C,RD1F1
  906.                 CP 0X20
  907.                 JR C,RD1F3
  908.                 CP 0XD0
  909.                 JR Z,RD1F1
  910.                 XOR A
  911.                 JR RD1F2
  912.  
  913. RD1F3           LD A,(INDEX)
  914.                 XOR %00000100
  915.                 JR RD1F4
  916.  
  917. RD1F1           LD A,0X24
  918. INDEX           EQU $-1
  919. RD1F4           XOR %00000010
  920.                 LD (INDEX),A
  921. RD1F2           LD (RD_1F),A
  922.                 LD (OLD_AF+1),A
  923.                 RET
  924.  
  925. ;[чтение порта 0X3F]
  926. IN_3F           LD A,(PORT_3F)
  927.                 LD (OLD_AF+1),A
  928.                 RET
  929.  
  930. ;[чтение порта 0X5F]
  931. IN_5F           LD A,(PORT_5F)
  932.                 LD (OLD_AF+1),A
  933.                 RET
  934.  
  935. ;[чтение порта 0X7F]
  936. IN_7F           LD A,(PORT_7F)
  937.                 LD (OLD_AF+1),A
  938.                 RET
  939.  
  940. ;[чтение порта 0XFF]
  941. IN_FF           LD A,(RD_FF)
  942.                 LD (OLD_AF+1),A
  943.                 RET
  944.  
  945. ;[чтение в "H" из (С)]
  946. IN_H_C          LD A,(OLD_BC)
  947. ;[определение из какого порта чтение]
  948.                 CP 0X1F
  949.                 JR NZ,RDHC2
  950.                 LD A,(RD_1F)
  951.                 LD (OLD_HL+1),A
  952.                 RET
  953.  
  954. RDHC2           CP 0X3F
  955.                 JR NZ,RDHC3
  956.                 LD A,(PORT_3F)
  957.                 LD (OLD_HL+1),A
  958.                 RET
  959.        
  960. RDHC3           CP 0X5F
  961.                 JR NZ,RDHC4
  962.                 LD A,(PORT_5F)
  963.                 LD (OLD_HL+1),A
  964.                 RET
  965.        
  966. RDHC4           CP 0X7F
  967.                 JR NZ,RDHC5
  968.                 LD A,(PORT_7F)
  969.                 LD (OLD_HL+1),A
  970.                 RET
  971.        
  972. RDHC5           CP 0XFF
  973.                 JR NZ,RDHC6
  974.                 LD A,(RD_FF)
  975.                 LD (OLD_HL+1),A
  976.                 RET
  977.  
  978. RDHC6           LD BC,(OLD_BC)
  979.                 IN A,(C)
  980.                 LD (OLD_HL+1),A
  981.                 RET
  982.  
  983. ;[чтение INI]
  984. IN_INI          LD A,(RD_1F)
  985.                 LD HL,(OLD_HL)
  986.                 DEC HL
  987.                 LD (HL),A
  988.                 INC HL
  989.                 LD (OLD_HL),HL
  990.                 LD HL,0X2A53
  991.                 LD (ADR_EXIT),HL
  992.                 JP INFF_BIT6
  993.  
  994. ;[чтение сектора или портов]
  995. READ_SECTOR     LD A,(WR_1F)
  996.                 AND 0X0F0
  997.                 CP 0X80
  998.                 JP C,INFF_BIT6
  999.                 CP 0XC0
  1000.                 JR NZ,READ_SECTOR_1
  1001.                 LD A,(PORT_3F)
  1002.                 LD HL,(OLD_HL)
  1003.                 LD (HL),A                       ;номер дорожки
  1004.                 INC HL
  1005.                 LD (HL),0                       ;номер стороны
  1006.                 INC HL
  1007.                 LD A,(PORT_5F)
  1008.                 LD (HL),A                       ;номер сектора
  1009.                 INC HL
  1010.                 LD (HL),0                       ;размер сектора
  1011.                 INC HL
  1012.                 LD (HL),0                       ;байт CRC
  1013.                 INC HL
  1014.                 LD (HL),0                       ;байт CRC
  1015.                 INC HL
  1016.                 LD (OLD_HL),HL
  1017.                 LD HL,OLD_BC+1
  1018.                 LD A,(HL)
  1019.                 SUB 6                           ;REG B - 6
  1020.                 LD (HL),A
  1021.                 LD HL,0X2A53
  1022.                 LD (ADR_EXIT),HL
  1023.                 JP INFF_BIT6
  1024.  
  1025. ;[чтение сектора]
  1026. READ_SECTOR_1   XOR A
  1027.                 JR WRITE_SECTOR_1
  1028.  
  1029. ;[запись сектора]
  1030. WRITE_SECTOR    LD A,0XFF
  1031. WRITE_SECTOR_1  LD (RDWR_MODE),A
  1032.                 LD A,1
  1033.                 LD (FLAG_RW_BREAK),A
  1034.                 LD HL,(OLD_IF)
  1035.                 PUSH HL
  1036.                 POP AF
  1037.                 JP PO,DI_MODE                   ;прерывания разрешены?
  1038.                 CP 0X3F
  1039.                 JR Z,DI_MODE
  1040.                 HALT                            ;разрешены, ждем обработчик прерывания
  1041. DI_MODE         CALL READ_CPU12                 ;сохранение текущей конфигурации окон проецирования 1,2
  1042.                 CALL W_WR_RD_SECT
  1043.                 XOR A
  1044.                 LD (FLAG_RW_BREAK),A
  1045.                 LD HL,0X8090
  1046.                 LD (OLD_AF),HL                  ;эмуляция флага успешного чтения/записи сектора
  1047.                 LD HL,0X2A53
  1048.                 LD (ADR_EXIT),HL
  1049.                 JP WRITE_CPU12                  ;восстановление конфигурации окон проецирования 1,2
  1050.  
  1051. ;[чтение или запись сектора рамдиска]
  1052. W_WR_RD_SECT    LD A,(WR_FF)
  1053.                 AND 3
  1054.                 INC A
  1055.                 LD B,A
  1056.                 LD A,%10000000
  1057. .L1             RLCA
  1058.                 DJNZ .L1
  1059.                 LD B,A
  1060.                 LD A,(COPY_VIRT_BITS)
  1061.                 AND B
  1062.                 JP NZ,MOUNT_RW                  ;работа с примонтированным образом
  1063.                 LD BC,WIN_A1
  1064.                 LD A,0X40
  1065.                 OUT (C),A
  1066.                 LD B,HIGH (WIN_P1)
  1067.                 LD A,RAM_RAMDISK
  1068.                 OUT (C),A                       ;страница заголовков рамдиска
  1069.                 LD A,(PORT_3F)                  ;взяли номер трека
  1070.                 ADD A,A                         ;сторон 2
  1071.                 LD C,A
  1072.                 LD A,(WR_FF)
  1073.                 AND 0X10                        ;проверка какая сторона диска
  1074.                 JR NZ,WWRRD1
  1075.                 INC C                           ;для стороны 1
  1076. WWRRD1          LD B,HIGH (CPU1)+2              ;адрес начала инфы о секторах на дорожке
  1077.                 LD A,(PORT_5F)                  ;взяли номер сектора
  1078.                 LD L,A
  1079.                 LD H,0
  1080. WWRRD3          LD A,(BC)
  1081.                 LD D,A                          ;взяли номер сектора
  1082.                 INC B
  1083.                 LD A,(BC)
  1084.                 LD E,A                          ;взяли размер сектора
  1085.                 INC B
  1086. ;               LD A,D
  1087. ;               AND A
  1088. ;               JR Z,WWRRD_ERR
  1089.                 LD A,L
  1090.                 CP D
  1091.                 JR Z,WWRRD2
  1092.                 LD A,E
  1093.                 ADD A,H
  1094.                 LD H,A
  1095.                 JR WWRRD3
  1096.  
  1097. WWRRD2          LD A,E
  1098.                 RRCA
  1099.                 LD (SECTOR_SIZE),A              ;размер найденного сектора
  1100.                 LD L,0
  1101.                 LD E,L
  1102.                 SRL H
  1103.                 RR L                            ;HL=смещение в блоках до найденного сектора
  1104.                 LD B,HIGH (CPU1)
  1105.                 LD A,(BC)
  1106.                 LD D,A
  1107.                 ADD HL,DE                       ;HL=смещение от начала страницы в блоках
  1108.                 INC B
  1109.                 LD A,(BC)
  1110.                 LD C,A                          ;смещение в страницах от начала рамдиска
  1111.                 LD A,H
  1112.                 CP HIGH (CPU1)
  1113.                 JR C,WWRRD5
  1114.                 SUB 0X40
  1115.                 LD H,A
  1116.                 INC C
  1117. ;HL=смещение в странице до начала сектора
  1118. WWRRD5          LD A,C                          ;смещение до номера страницы, где указанный сектор начинается
  1119.                 ADD A,RAM_DATARAMD              ;прибавили номер начала рамдиск и +1. в 0 странице рамдиска описатели секторов
  1120.                 LD (RDWR_PAGE),A                ;сохранили номер вычисленной страницы
  1121.                 LD DE,(OLD_HL)
  1122.                 LD BC,(BB_CPU1)
  1123.                 LD A,C
  1124.                 LD C,LOW (WIN_A0)
  1125.                 OUT (C),A                       ;вернули стандартную 5 страницу
  1126. SP_RAMD9        LD A,D                          ;проверка границы откуда/куда копировать
  1127.                 CP HIGH (CPU2)
  1128.                 PUSH DE
  1129.                 LD DE,CPU1+HIGH (WIN_P1)
  1130.                 LD BC,WIN_A1                    ;если верхние 32кб озу, то нужно включить в 1 окне проецирования
  1131.                 JR NC,SP_RAMD1
  1132.                 LD DE,CPU2+HIGH (WIN_P2)
  1133.                 LD B,HIGH (WIN_A2)              ;если нижние 32кб озу, то нужно включить во 2 окне проецирования
  1134. SP_RAMD1        LD A,0X40
  1135.                 OUT (C),A
  1136.                 LD B,E
  1137.                 LD A,(RDWR_PAGE)                ;номер вычисленной страницы озу
  1138.                 OUT (C),A                       ;включили вычисленную страницу
  1139.                 LD B,D                          ;старший байт адреса начала включенной страницы
  1140.                 POP DE
  1141.                 LD A,B
  1142.                 ADD A,H
  1143.                 LD H,A
  1144.                 LD A,(RDWR_MODE)
  1145.                 AND A
  1146.                 JR NZ,IN_ROM1
  1147.                 LD A,D
  1148.                 INC A
  1149.                 JR NZ,IN_ROM1
  1150.                 LD A,E
  1151.                 AND A
  1152.                 JR Z,IN_ROM1
  1153. IN_ROM4         NEG
  1154.                 LD C,A
  1155.                 LD B,0
  1156.                 LDIR
  1157.                 NEG
  1158.                 LD C,A
  1159. IN_ROM2         EX DE,HL
  1160.                 ADD HL,BC
  1161.                 EX DE,HL
  1162.                 ADD HL,BC
  1163.                 LD A,(SECTOR_SIZE)
  1164.                 JP SP_RAMD8_
  1165.  
  1166. IN_ROM1         LD A,D
  1167.                 CP HIGH (CPU1)
  1168.                 JR NC,IN_ROM3
  1169.                 LD A,(SECTOR_SIZE)
  1170.                 AND A
  1171.                 LD BC,0X80
  1172.                 JR Z,IN_ROM2
  1173.                 LD BC,0X100
  1174.                 JR IN_ROM2
  1175.  
  1176. IN_ROM3         CP HIGH (CPU2)                  ;проверка перехода границы страниц
  1177.                 JP NC,SP_RAMD3                  ;если выше то сразу копируем
  1178.                 CP HIGH (CPU2)-1
  1179.                 JP C,SP_RAMD3                   ;если ниже так же сразу копируем
  1180.                 LD A,E
  1181.                 AND A                           ;если сектор полностью укладывется до границы, то сразу копируем
  1182.                 JR Z,SP_RAMD3                   ;иначе принудительно копируем в два приема
  1183.                 LD A,(RDWR_MODE)                ;чтение или запись?
  1184.                 AND A
  1185.                 LD A,E                          ;младший байт адрес в блоке
  1186.                 JR Z,SP_RAMD4
  1187.                 EX DE,HL                        ;для записи меняем направление
  1188. SP_RAMD4        NEG
  1189.                 LD C,A                          ;копируем остаток до конца блока
  1190.                 LD B,0
  1191.                 LDIR
  1192.                 NEG
  1193.                 PUSH AF                         ;спрятали сколько осталось копировать из начала следующего блока
  1194.                 LD BC,(BB_CPU2)
  1195.                 LD A,C
  1196.                 LD C,LOW (WIN_A0)
  1197.                 OUT (C),A
  1198.                 LD B,HIGH (WIN_A1)
  1199.                 LD A,0X40
  1200.                 OUT (C),A
  1201.                 LD B,HIGH (WIN_P1)
  1202.                 LD A,(RDWR_PAGE)
  1203.                 OUT (C),A                       ;вычисленную страницу включаем в 1 окне проецирования
  1204.                 LD A,(RDWR_MODE)                ;чтение или запись
  1205.                 AND A
  1206.                 JR Z,SP_RAMD5
  1207.                 LD A,D                          ;для записи
  1208.                 SUB 0X40                        ;изменили адрес куда копировать на другое окно проецирования
  1209.                 LD D,A
  1210.                 JR SP_RAMD6
  1211.  
  1212. SP_RAMD5        LD A,H                          ;для чтения
  1213.                 SUB 0X40                        ;изменили адрес куда копировать на другое окно проецирования
  1214.                 LD H,A
  1215. SP_RAMD6        POP AF
  1216.                 LD C,A                          ;сколько осталось скопировать байт
  1217.                 LD B,0
  1218.                 LDIR
  1219.                 LD A,(SECTOR_SIZE)
  1220.                 JR SP_RAMD8_
  1221.  
  1222. SP_RAMD3        LD A,(RDWR_MODE)                ;чтение или запись
  1223.                 AND A
  1224.                 JR Z,SP_RAMD7
  1225.                 EX DE,HL                        ;для записи меняем направление
  1226. SP_RAMD7        LD A,(SECTOR_SIZE)
  1227.                 AND A
  1228.                 JR NZ,SP_RAMD8
  1229.                 CALL COPYHBLOCK                 ;для сектора размером 128 байт копируем половину и выходим
  1230. ECOPY_BLOCK     LD A,(RDWR_MODE)
  1231.                 AND A
  1232.                 JR Z,ECOPY_BLOCK1
  1233.                 EX DE,HL
  1234. ECOPY_BLOCK1    LD (OLD_HL),DE
  1235.                 RET
  1236.  
  1237. SP_RAMD8        CALL COPY_BLOCK                 ;для сектора 256 байт копируем весь и выходим
  1238. SP_RAMD8_       DEC A
  1239.                 JR Z,ECOPY_BLOCK
  1240.                 LD (SECTOR_SIZE),A
  1241.                 LD A,(RDWR_MODE)
  1242.                 AND A
  1243.                 JR Z,SP_RAMD0
  1244.                 EX DE,HL
  1245. SP_RAMD0        LD A,0X3F
  1246.                 AND H
  1247.                 LD H,A
  1248.                 JP SP_RAMD9
  1249.  
  1250. COPY_BLOCK      REPT 128
  1251.                 LDI
  1252.                 ENDM
  1253. COPYHBLOCK      REPT 128
  1254.                 LDI
  1255.                 ENDM
  1256.                 RET
  1257.  
  1258. ;[проверка наличия маркера рамдиска]
  1259. CMP_RAM_DISK    CALL READ_CPU12
  1260.                 LD BC,WIN_P1
  1261.                 LD A,RAM_RAMDISK
  1262.                 OUT (C),A
  1263.                 LD HL,CPU1+0X3FFF
  1264.                 LD D,(HL)
  1265.                 DEC H
  1266.                 LD E,(HL)                       ;взяли байты для проверки маркера
  1267.                 CALL WRITE_CPU12
  1268.                 LD HL,"RD"
  1269.                 AND A
  1270.                 SBC HL,DE
  1271.                 RET Z                           ;если маркер на месте, то рамдиска не создаем
  1272. ;[создание чистого рамдиска]
  1273. CREATE_TRDTABL  LD BC,WIN_P1
  1274.                 LD A,RAM_RAMDISK                ;нужна страница начала рамдиска, где будет таблица описателей
  1275.                 OUT (C),A
  1276.                 LD HL,CPU1
  1277.                 PUSH HL
  1278.                 LD DE,CPU1+1
  1279.                 LD BC,0X3FFF
  1280.                 LD (HL),L
  1281.                 LDIR                            ;очистили страницу
  1282.                 POP DE                          ;адрес начала страницы
  1283.                 LD HL,0                         ;смещение в блоках и страницах
  1284.                 LD A,0XA0
  1285. ELT2            PUSH AF
  1286.                 LD BC,0X1000                    ;счетчик номеров секторов и их номера
  1287.                 LD A,L
  1288.                 RRCA
  1289.                 RRCA
  1290.                 LD (DE),A                       ;смещение в блоках дорожки в странице
  1291.                 INC D
  1292.                 LD A,H
  1293.                 LD (DE),A                       ;смещение в страницах до дорожки
  1294.                 INC D
  1295. ELT1            INC C
  1296.                 LD A,C
  1297.                 LD (DE),A                       ;номер сектора
  1298.                 INC D
  1299.                 LD A,2
  1300.                 LD (DE),A                       ;размер сектора
  1301.                 INC D
  1302.                 DJNZ ELT1                       ;вносим в таблицу все номера секторов с размерами
  1303.                 LD D,HIGH (CPU1)                ;вернули указатель в начало
  1304.                 INC E                           ;для следующей дорожки
  1305.                 LD BC,0X40
  1306.                 ADD HL,BC                       ;переход к следующей дорожке
  1307.                 POP AF
  1308.                 DEC A
  1309.                 JR NZ,ELT2                      ;повторяем для всех дорожек
  1310.                 LD HL,CPU1+0X3FFF
  1311.                 LD (HL),"R"                     ;вносим маркер рамдиска
  1312.                 DEC H
  1313.                 LD (HL),"D"
  1314.                 LD BC,WIN_P1
  1315.                 LD A,RAM_DATARAMD
  1316.                 OUT (C),A
  1317.                 LD HL,CPU1
  1318.                 LD DE,CPU1+1
  1319.                 LD BC,0X0FFF
  1320.                 LD (HL),L
  1321.                 LDIR
  1322.                 LD HL,DSKINFO
  1323.                 LD DE,CPU1+0X8E1
  1324.                 LD BC,DSK_END-DSKINFO
  1325.                 LDIR
  1326. ;[восстановление конфигурации окон проецирования 1,2]
  1327. WRITE_CPU12     LD BC,(BB_CPU1)
  1328.                 LD A,C
  1329.                 LD C,LOW (WIN_A0)
  1330.                 OUT (C),A
  1331.                 LD BC,(BB_CPU2)
  1332.                 LD A,C
  1333.                 LD C,LOW (WIN_A0)
  1334.                 OUT (C),A
  1335.                 RET
  1336.  
  1337. ;[чтение текущего конфига страниц проецирования 1,2]
  1338. READ_TMP_CPU12  LD HL,(BB_CPU1)
  1339.                 PUSH HL
  1340.                 LD HL,(BB_CPU2)
  1341.                 PUSH HL
  1342.                 CALL READ_CPU12
  1343.                 LD HL,(BB_CPU1)
  1344.                 LD (TMP_BB_CPU1),HL
  1345.                 LD HL,(BB_CPU2)
  1346.                 LD (TMP_BB_CPU2),HL
  1347.                 POP HL
  1348.                 LD (BB_CPU2),HL
  1349.                 POP HL
  1350.                 LD (BB_CPU1),HL
  1351.                 JR WRITE_CPU12
  1352.  
  1353. ;[восстановление текущей конфигурации страниц проецирования 1,2]
  1354. WRITE_TMP_CPU12 LD BC,0
  1355. TMP_BB_CPU1     EQU $-2
  1356.                 LD A,C
  1357.                 LD C,LOW (WIN_A0)
  1358.                 OUT (C),A
  1359.                 LD BC,0
  1360. TMP_BB_CPU2     EQU $-2
  1361.                 LD A,C
  1362.                 LD C,LOW (WIN_A0)
  1363.                 OUT (C),A
  1364.                 RET
  1365.  
  1366. ;[чтение конфигурации окон проецирования 1,2]
  1367. READ_CPU12      LD BC,RD_RAMNROM
  1368.                 IN L,(C)                        ;биты RAM & ROM
  1369.                 INC B
  1370.                 IN H,(C)                        ;биты DOS & 7FFD
  1371.                 ADD HL,HL
  1372.                 LD B,HIGH (RD_1WINA1)
  1373.                 IN A,(C)
  1374.                 CP 0XC0
  1375.                 JR NC,RWCPU1
  1376.                 LD E,A
  1377.                 LD D,HIGH (WIN_P1)
  1378.                 JR RWCPU2
  1379.  
  1380. RWCPU1          RLCA
  1381.                 RLCA
  1382.                 SLA L
  1383.                 RRA
  1384.                 SLA H
  1385.                 RRA
  1386.                 LD E,A
  1387.                 LD D,HIGH (WIN_A1)
  1388. RWCPU2          LD (BB_CPU1),DE
  1389.                 INC B
  1390.                 IN A,(C)
  1391.                 CP 0XC0
  1392.                 JR NC,RWCPU3
  1393.                 LD E,A
  1394.                 LD D,HIGH (WIN_P2)
  1395.                 JR RWCPU4
  1396.  
  1397. RWCPU3          RLCA
  1398.                 RLCA
  1399.                 SLA L
  1400.                 RRA
  1401.                 SLA H
  1402.                 RRA
  1403.                 LD E,A
  1404.                 LD D,HIGH (WIN_A2)
  1405. RWCPU4          LD (BB_CPU2),DE
  1406.                 RET
  1407.  
  1408. ;[проверка наличия виртуального диска]
  1409. DISK_NONE       PUSH HL
  1410.                 PUSH BC
  1411.                 CALL READ_CPU12
  1412.                 LD BC,WIN_A1
  1413.                 LD A,0X40
  1414.                 OUT (C),A
  1415.                 LD B,HIGH (WIN_P1)
  1416.                 LD A,RAM_RAMDISK
  1417.                 OUT (C),A
  1418.                 LD HL,CPU1+0X3FFF
  1419.                 LD A,(HL)
  1420.                 DEC H
  1421.                 CP "R"
  1422.                 SCF
  1423.                 JR NZ,DISK_NONE1
  1424.                 LD A,(HL)
  1425.                 CP "D"
  1426.                 SCF
  1427.                 JR NZ,DISK_NONE1
  1428.                 XOR A
  1429. DISK_NONE1      PUSH AF
  1430.                 CALL WRITE_CPU12
  1431.                 POP AF
  1432.                 POP BC
  1433.                 POP HL
  1434.                 RET
  1435.  
  1436. ;на входе: H-адрес ячейки
  1437. ;          L-прочитанное значение
  1438. READCMOS        PUSH BC
  1439.                 LD BC,CMOSD_SET_ADR
  1440.                 OUT (C),H
  1441.                 LD B,HIGH (CMOSD_RD_WR)
  1442.                 IN L,(C)
  1443.                 POP BC
  1444.                 LD A,L
  1445.                 AND A
  1446.                 RET
  1447.  
  1448.                 JP_EMU 0X3C30                   ; IN    A, (0X1F)
  1449.  
  1450.                 DUPL 0X3D2F-$,0;XFF
  1451.                 NOP
  1452.                 RET
  1453.  
  1454.                 JP_EMU 0X3D4D                   ; OUT      (0XFF), A
  1455.                 JP_EMU 0X3D9A                   ; OUT      (0X1F), A
  1456.                 JP_EMU 0X3DA6                   ; IN    A, (0XFF)
  1457.                 JP_EMU 0X3DB5                   ; IN    A, (0X1F)
  1458.                 JP_EMU 0X3DBA                   ; IN    A, (0X1F)
  1459.                 JP_EMU 0X3DD5                   ; OUT      (0XFF), A
  1460.                 JP_EMU 0X3E30                   ; IN    A, (0X1F)
  1461.                 JP_EMU 0X3E3A                   ; IN    A, (0X1F)
  1462.                 JP_EMU 0X3E44                   ; OUT      (0X7F), A
  1463.  
  1464.                 DUPL 0X3E49-$,0;XFF
  1465.                 JP ADR_0X3E4C                   ; для адреса 0X3E4C
  1466.  
  1467. ;               JP_EMU 0X3E4C                   ; OUT      (0X7F), A
  1468.                 DUPL 0X3E4C-$,0;XFF
  1469.                 OUT (EXIT_PORT),A
  1470.                 JR 0X3E49
  1471.  
  1472.                 JP_EMU 0X3E50                   ; IN    A, (0X3F)
  1473.                 JP_EMU 0X3E78                   ; IN    A, (0X3F)
  1474.                 JP_EMU 0X3E7E                   ; OUT      (0X3F), A
  1475.                 JP_EMU 0X3E87                   ; IN    A, (0X3F)
  1476.                 JP_EMU 0X3E95                   ; OUT      (0X3F), A
  1477.                 JP_EMU 0X3EB5                   ; IN    A, (0X1F)
  1478.                 JP_EMU 0X3EBC                   ; IN    A, (0X3F)
  1479.                 JP_EMU 0X3EC9                   ; OUT      (0X1F), A
  1480.                 JP_EMU 0X3ECE                   ; IN    A, (0XFF)
  1481.                 JP_EMU 0X3EDF                   ; OUT      (0X1F), A
  1482.  
  1483.                 DUPL 0X3EF3-$,0;XFF             ; IN    H, (C)
  1484.                 OUT (EXIT_PORT),A
  1485.                 JR JUMP_0X3EF3
  1486.                 JR JUMP_0X3EF5                  ; IN    A, (0XFF)
  1487. EXIT_0X3EF5     OUT (EXIT_PORT),A
  1488. JUMP_0X3EF5     JP ADR_0X3EF5
  1489.  
  1490. ;               JP_EMU 0X3EF5                   ; IN    A, (0XFF)
  1491.                 JP_EMU 0X3EFE                   ; IN    A, (0X7F)
  1492. JUMP_0X3EF3     JP ADR_0X3EF3
  1493.  
  1494.                 JP_EMU 0X3F1B                   ; OUT      (0X5F), A
  1495.                 JP_EMU 0X3F25                   ; OUT      (0X1F), A
  1496.                 JP_EMU 0X3F33                   ; IN    A, (0X1F)
  1497.  
  1498.                 DUPL 0X3F40-$,0;XFF             ; для адреса 0x3EF3
  1499.                 JP ADR_0X3EF3
  1500.  
  1501.                 JP_EMU 0X3F4D                   ; OUT      (0X1F), A
  1502.                 JP_EMU 0X3F55                   ; IN    A, (0X3F)
  1503.                 JP_EMU 0X3F5A                   ; IN    A, (0X5F)
  1504.                 JP_EMU 0X3F69                   ; IN    A, (0X3F)
  1505.                 JP_EMU 0X3F72                   ; IN    A, (0X5F)
  1506.  
  1507.                 JP_EMU 0X3FBC                   ; IN    A, (0XFF)       ;запись сектора
  1508.  
  1509.                 DUPL 0X3FC7-$,0;XFF
  1510. JUMP_0X3FF0     JP ADR_0X3FF0
  1511.  
  1512.                 JP_EMU 0X3FCA                   ; IN    A, (0XFF)       ;запись сектора
  1513.                 JP_EMU 0X3FD1                   ; OUTI                  ;запись сектора
  1514.  
  1515.                 JP_EMU 0X3FD7                   ; IN    A, (0XFF)       ;чтение сектора
  1516.  
  1517. JUMP_0X3FEC     JP ADR_0X3FEC
  1518. JUMP_0X3FF3     JP ADR_0X3FF3
  1519.  
  1520.                 JP_EMU 0X3FE5                   ; IN    A, (0XFF)       ;чтение сектора
  1521.  
  1522. ;               JP_EMU 0X3FEC                   ; INI                   ;чтение сектора
  1523.                 DUPL 0X3FEC-$,0;XFF
  1524.                 OUT (EXIT_PORT),A
  1525.                 JR JUMP_0X3FEC
  1526.  
  1527. ;               DUPL 0X3FF0-$,0                 ; OUT      (C), A
  1528.                 OUT (EXIT_PORT),A
  1529.                 DB 0X18                         ; JR 0X3FC7
  1530.  
  1531. ;               DUPL 0X3FF5-$,0                 ; IN    A, (C)
  1532.                 OUT (EXIT_PORT),A
  1533.                 JP JUMP_0X3FF3
  1534.  
  1535.                 DUPL 0X3FF8-$,0
  1536.                 DB "EVOSFE"
  1537.                 DW DATA_VERS
  1538.