Subversion Repositories pentevo

Rev

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

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