Subversion Repositories pentevo

Rev

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

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