Subversion Repositories pentevo

Rev

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

  1.  
  2. ; LAST UPDATE: 23.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 A,(RDWR_MODE)
  529.                 AND 0x80
  530.                 LD L,A
  531.                 LD A,(WR_FF)
  532.                 AND 3
  533.                 OR L
  534.                 BIT 7,A
  535.                 PUSH AF
  536.                 LD HL,0x2A77
  537.                 PUSH HL
  538.                 LD HL,MNT_RW
  539.                 PUSH HL
  540.                 JR Z,.L1
  541. ; копируем сектор который будем записывать на смонтированный образ
  542.                 LD HL,(OLD_HL)
  543.                 LD DE,MNT_SECTOR
  544.                 CALL COPY_BLOCK
  545.                 LD (OLD_HL),HL
  546. ; переключаем паги для работы с маунтом
  547. .L1             PUSH AF
  548.                 LD BC,WIN_A1
  549.                 LD A,0x40
  550.                 OUT (C),A
  551.                 LD B,HIGH (WIN_P1)
  552.                 LD A,RAM_EVODOS
  553.                 OUT (C),A
  554.                 POP AF
  555. ; переставляем стек
  556.                 LD HL,0x4000
  557.                 ADD HL,SP
  558.                 LD SP,HL
  559.                 JP 0x2A53
  560.  
  561.         PHASE $ + 0x4000
  562.  
  563. MNT_RW          LD L,A
  564.                 LD A,(PORT_3F + 0x4000)         ; взяли номер трека
  565.                 ADD A,A                         ; сторон 2
  566.                 LD D,A
  567.                 LD A,(WR_FF + 0x4000)
  568.                 AND 0x10                        ; проверка какая сторона диска
  569.                 JR NZ,WRRDSECM1
  570.                 INC D                           ; для стороны 1
  571. WRRDSECM1       LD A,(PORT_5F + 0x4000)         ; взяли номер сектора
  572.                 LD E,A                          ; D-трек, E-сектор
  573.                 LD A,L
  574.                 LD HL,MNT_SECTOR + 0x4000
  575.         RST8 _MOUNTER,_RDWR_MOUNT
  576.                 JP 0x3D2F
  577.  
  578.         DEPHASE
  579.  
  580. RET_MNT_RW
  581.                 LD HL,-0x4000
  582.                 ADD HL,SP
  583.                 LD SP,HL
  584.                 CALL WRITE_CPU12
  585.                 LD HL,(OLD_IF)
  586.                 PUSH HL
  587.                 POP AF
  588.                 JP PO,.DI_MODE                  ; прерывания разрешены?
  589.                 CP 0x3F
  590.                 JR Z,.DI_MODE
  591.                 EI
  592. .DI_MODE        POP AF
  593.                 RET NZ
  594.                 LD HL,MNT_SECTOR
  595.                 LD DE,(OLD_HL)
  596.                 CALL COPY_BLOCK
  597.                 LD (OLD_HL),DE
  598.                 RET
  599.  
  600. ; инфа для создания 9 сектора нового диска
  601. DSKINFO         DB 0                            ; + 0xE1 - номер первого свободного сектора
  602.                 DB 1                            ; + 0xE2 - номер первого свободного трека
  603.                 DB 0x16                         ; + 0xE3 - тип дискеты
  604.                 DB 0                            ; + 0xE4 - количество файлов на дискете
  605. SECFREE         DW 2544                         ; + 0xE5 - количество свободных секторов
  606.                 DB 0x10                         ; + 0xE7 - идентификационный код TRDOS
  607.                 DW 0                            ; + 0xE8 - 2 байта 0
  608.                 DUPL 9," "                      ; + 0xEA - 9 байт 0x20
  609.                 DB 0                            ; + 0xF3 - 1 байт 0
  610.                 DB 0                            ; + 0xF4 - количество удаленных файлов
  611.                 DB "RAMDISKO"                   ; + 0xF5 - имя дискеты
  612. DSK_END
  613.  
  614.                 DUPL LOW (-$),0
  615. MNT_SECTOR
  616.  
  617. ; адреса перехвата
  618.         JP_EMU 0x1E3A                           ; OUT      (0x3F), A
  619.         JP_EMU 0x1FDD                           ; IN    A, (0x1F)
  620.         JP_EMU 0x1FF3                           ; OUT      (0xFF), A
  621.         JP_EMU 0x2000                           ; OUT      (0x1F), A
  622.         JP_EMU 0x2076                           ; IN    A, (0x1F)
  623.         JP_EMU 0x2085                           ; OUT      (0x3F), A
  624.         JP_EMU 0x208D                           ; OUT      (0x5F), A
  625.         JP_EMU 0x2093                           ; OUT      (0x1F), A
  626.         JP_EMU 0x2099                           ; IN    A, (0x1F)
  627.         JP_EMU 0x20B1                           ; IN    A, (0xFF)
  628.         JP_EMU 0x20B8                           ; OUT      (C),    D
  629.         JP_EMU 0x2740                           ; IN    A, (0x1F)
  630.         JP_EMU 0x2748                           ; OUT      (0x7F), A
  631.         JP_EMU 0x2A53                           ; OUT      (C),    A
  632.  
  633. ; первая команда в обработчике MAGIC для возврата в пагу FE
  634. ;       JP_EMU 0x2A71                           ; OUT      (0xFF), A
  635.                 DUPL 0x2A71 - $,0
  636.                 OUT (EXIT_PORT),A
  637.                 JP INT_RET                      ; возвращение из обработчика INT
  638.  
  639. ;       JP_EMU 0x2A77                           ; IN    A, (0x1F)
  640.                 DUPL 0x2A77 - $,0
  641.                 OUT (EXIT_PORT),A
  642.                 JP RET_MNT_RW                   ; возвращение после вызова RST 8
  643.  
  644.         JP_EMU 0x2AD9                           ; OUT      (0xFF), A
  645.         JP_EMU 0x2B25                           ; IN    A, (0x5F)
  646.         JP_EMU 0x2C07                           ; IN    A, (0x5F)
  647.         JP_EMU 0x2CD8                           ; IN    A, (0x5F)
  648.         JP_EMU 0x2D75                           ; OUT      (0x5F), A
  649.         JP_EMU 0x2D80                           ; OUT      (0x1F), A
  650.         JP_EMU 0x2D87                           ; IN    A, (0x1F)
  651.         JP_EMU 0x2F0C                           ; OUT      (0xFF), A
  652.         JP_EMU 0x2F1D                           ; OUT      (0x5F), A
  653.  
  654.                 DUPL 0x2F24 - $,0               ; для адреса 0x2F4D
  655.                 JP ADR_0x2F4D
  656.  
  657.         JP_EMU 0x2F28                           ; OUT      (0x1F), A
  658.         JP_EMU 0x2F2F                           ; IN    A, (0x1F)
  659.         JP_EMU 0x2F3C                           ; OUT      (0xFF), A
  660.  
  661.                 DUPL 0x2F4D - $,0               ; OUT      (0xFF), A
  662.                 OUT (EXIT_PORT),A
  663.                 DB 0x18                         ; JR 0x2F24
  664.  
  665.         JP_EMU 0x2F50                           ; OUT      (0x7F), A
  666.  
  667.                 DUPL 0x2F57 - $,0               ; OUT      (0x1F), A
  668.                 OUT (EXIT_PORT),A
  669.                 JR JUMP_0x2F57
  670.  
  671.                 JR JUMP_0x2F59                  ; IN    A, (0xFF)
  672.  
  673. EXIT_0x2F59     OUT (EXIT_PORT),A
  674. JUMP_0x2F59     JP ADR_0x2F59
  675.  
  676. JUMP_0x2F57     JP ADR_0x2F57
  677.  
  678.         JP_EMU 0x2FB1                           ; OUT      (0xFF), A
  679.         JP_EMU 0x2FC3                           ; OUT      (0x1F), A
  680.  
  681.                 DUPL 0x32A2 - $,0
  682. ; обработчики чтения/записи портов
  683. ; запись "A" в порт 0x1F
  684. OUT_1F          LD A,(OLD_AF + 1)
  685.                 LD (WR_1F),A
  686.  
  687.                 AND %11110000
  688.                 RRCA
  689.                 RRCA
  690.                 RRCA
  691.                 ADD A,LOW (.TABL_CMD)
  692.                 LD L,A
  693.                 ADC A,HIGH (.TABL_CMD)
  694.                 SUB L
  695.                 LD H,A
  696.                 LD A,(HL)
  697.                 INC HL
  698.                 LD H,(HL)
  699.                 LD L,A
  700.                 JP (HL)
  701.  
  702. .TABL_CMD       DW .CMD_00
  703.                 DW .CMD_10
  704.                 DW .CMD_20
  705.                 DW .CMD_30
  706.                 DW .CMD_40
  707.                 DW .CMD_50
  708.                 DW .CMD_60
  709.                 DW .CMD_70
  710.                 DW .CMD_80
  711.                 DW .CMD_90
  712.                 DW .CMD_A0
  713.                 DW .CMD_B0
  714.                 DW .CMD_C0
  715.                 DW .CMD_D0
  716.                 DW .CMD_E0
  717.                 DW .CMD_F0
  718.  
  719. ; 00-0F команда восстановления
  720. .CMD_00         XOR A
  721.                 LD (PORT_3F),A
  722.                 JR .INFF_BIT6
  723.  
  724. ; 10-1F команда поиска
  725. .CMD_10         LD A,(PORT_7F)
  726.                 LD (PORT_3F),A
  727.                 CALL DISK_NONE
  728.                 LD A,0x80
  729.                 JR C,.INFF_BIT6_1
  730. .INFF_BIT6      XOR A
  731. .INFF_BIT6_1    LD (RD_1F),A
  732.                 LD A,0xBF
  733.                 LD (RD_FF),A
  734.                 RET
  735.  
  736. ; 20-3F команда шаг в предыдущем направлении
  737. .CMD_20
  738. .CMD_30         LD A,(PORT_3F)
  739. .NAPRAVL        INC A
  740.                 LD (PORT_3F),A
  741.                 JR .INFF_BIT6
  742.  
  743. ; 40-5F команда шаг вперед
  744. .CMD_40
  745. .CMD_50         LD A,(PORT_3F)
  746.                 INC A
  747.                 LD (PORT_3F),A
  748.                 LD A,0x3C                       ; INC A
  749.                 LD (.NAPRAVL),A
  750.                 JR .INFF_BIT6
  751.  
  752. ; 60-7F команда шаг назад
  753. .CMD_60
  754. .CMD_70         LD A,(PORT_3F)
  755.                 DEC A
  756.                 LD (PORT_3F),A
  757.                 LD A,0x3D                       ; DEC A
  758.                 LD (.NAPRAVL),A
  759.  
  760. ; 80-9F команда чтение сектора
  761. .CMD_80
  762. .CMD_90
  763.  
  764. ; A0-BF команда запись сектора
  765. .CMD_A0
  766. .CMD_B0
  767.  
  768. ; C0-CF чтение адреса
  769. .CMD_C0         JR .INFF_BIT6
  770.  
  771. ; D0-DF принудительное прерывание
  772. .CMD_D0         LD A,0xBF
  773.                 LD (RD_FF),A
  774.                 RET
  775.  
  776. ; E0-EF чтение дорожки
  777. .CMD_E0
  778. .CMD_F0         JR .INFF_BIT6
  779.  
  780. ; запись "A" в порт 0x3F
  781. OUT_3F          LD A,(OLD_AF + 1)
  782.                 LD (PORT_3F),A
  783.                 RET
  784.  
  785. ; запись "A" в порт 0x5F
  786. OUT_5F          LD A,(OLD_AF + 1)
  787.                 LD (PORT_5F),A
  788.                 RET
  789.  
  790. ; запись "A" в порт 0x7F
  791. OUT_7F          LD A,(OLD_AF + 1)
  792.                 LD (PORT_7F),A
  793.                 RET
  794.  
  795. ; запись "A" в порт 0xFF
  796. OUT_FF          LD A,(OLD_AF + 1)
  797.                 LD (WR_FF),A
  798.                 LD D,A
  799.                 LD BC,0x00FF
  800.                 JR WR_C_D
  801.  
  802. ; запись "A" в порт (C)
  803. OUT_C_A         LD A,(OLD_AF + 1)
  804. WRCA1           LD D,A
  805.                 LD BC,(OLD_BC)                  ; если порт не TR-DOS
  806.                 LD A,C
  807. ; определение в какой порт запись      
  808.                 CP 0x1F
  809.                 JP Z,OUT_1F
  810.                 CP 0x3F
  811.                 JR Z,OUT_3F
  812.                 CP 0x5F
  813.                 JR Z,OUT_5F
  814.                 CP 0x7F
  815.                 JR Z,OUT_7F
  816.                 CP 0xFF
  817.                 JR Z,OUT_FF
  818.                 CP LOW (WIN_A0)
  819.                 JR Z,WRCA3
  820. WR_C_D          PUSH BC
  821.                 LD BC,FDD_EMU_PORT
  822.                 IN E,(C)
  823.                 XOR A
  824.                 OUT (C),A
  825.                 POP BC
  826.                 OUT (C),D
  827.                 LD BC,FDD_EMU_PORT
  828.                 OUT (C),E
  829.                 RET
  830.  
  831. ; запись в порты ATM/PENTEVO
  832. WRCA3           LD A,B
  833.                 LD HL,BB_CPU1
  834.                 CP HIGH (WIN_A1)
  835.                 JR Z,WRCA2
  836.                 CP HIGH (WIN_P2)
  837.                 JR Z,WRCA2
  838.                 LD HL,BB_CPU2
  839.                 CP HIGH (WIN_A2)
  840.                 JR Z,WRCA2
  841.                 CP HIGH (WIN_P2)
  842.                 JR NZ,WR_C_D
  843. WRCA2           LD E,B
  844.                 PUSH DE
  845.                 PUSH HL
  846.                 CALL READ_CPU12
  847.                 POP HL
  848.                 POP DE
  849.                 LD (HL),D
  850.                 INC HL
  851.                 LD (HL),E
  852.                 JP WRITE_CPU12
  853.  
  854. ; запись "D" в порт (C)
  855. OUT_C_D         LD A,(OLD_DE + 1)
  856.                 JR WRCA1
  857.  
  858. ; передача байта, команда OUTI
  859. OUT_OUTI        LD HL,(BUFF_SECT)
  860.                 EXX
  861.                 LD A,(HL)
  862.                 INC HL
  863.                 EXX
  864.                 LD (HL),A
  865.                 INC HL
  866.                 LD (BUFF_SECT),HL
  867.                 RET
  868.  
  869. ; чтение порта 0x1F
  870. IN_1F           LD A,(WR_1F)
  871.                 AND %11110000
  872.                 CP 0x10
  873.                 JR C,.L1
  874.                 CP 0x20
  875.                 JR C,.L3
  876.                 CP 0x80
  877.                 JR C,.L5
  878.                 CP 0xD0
  879.                 JR Z,.L7
  880.                 XOR A
  881.                 JR .L2
  882.  
  883. .L7             LD A,0x80
  884.                 JR .L2
  885.  
  886. .L5             LD A,(PORT_3F)
  887.                 AND A
  888.                 JR NZ,.L1
  889.                 LD A,%00100100
  890.                 JR .L6
  891.  
  892. .L3             LD A,(.INDEX)
  893.                 XOR %00000100
  894.                 JR .L4
  895.  
  896. .L1             LD A,%00100100
  897. .INDEX          EQU $-1
  898. .L4             XOR %00000010
  899. .L6             LD (.INDEX),A
  900. .L2             LD (RD_1F),A
  901.                 LD (OLD_AF + 1),A
  902.                 RET
  903.  
  904. ; чтение порта 0x3F
  905. IN_3F           LD A,(PORT_3F)
  906.                 LD (OLD_AF + 1),A
  907.                 RET
  908.  
  909. ; чтение порта 0x5F
  910. IN_5F           LD A,(PORT_5F)
  911.                 LD (OLD_AF + 1),A
  912.                 RET
  913.  
  914. ; чтение порта 0x7F
  915. IN_7F           LD A,(PORT_7F)
  916.                 LD (OLD_AF + 1),A
  917.                 RET
  918.  
  919. ; чтение порта 0xFF
  920. IN_FF           LD A,(RD_FF)
  921.                 LD (OLD_AF + 1),A
  922.                 RET
  923.  
  924. ; чтение в "H" из (С)
  925. IN_H_C          LD A,(OLD_BC)
  926. ; определение из какого порта чтение
  927.                 CP 0x1F
  928.                 JR NZ,.L2
  929.                 LD A,(RD_1F)
  930.                 LD (OLD_HL + 1),A
  931.                 RET
  932.  
  933. .L2             CP 0x3F
  934.                 JR NZ,.L3
  935.                 LD A,(PORT_3F)
  936.                 LD (OLD_HL + 1),A
  937.                 RET
  938.  
  939. .L3             CP 0x5F
  940.                 JR NZ,.L4
  941.                 LD A,(PORT_5F)
  942.                 LD (OLD_HL + 1),A
  943.                 RET
  944.  
  945. .L4             CP 0x7F
  946.                 JR NZ,.L5
  947.                 LD A,(PORT_7F)
  948.                 LD (OLD_HL+1),A
  949.                 RET
  950.  
  951. .L5             CP 0xFF
  952.                 JR NZ,.L6
  953.                 LD A,(RD_FF)
  954.                 LD (OLD_HL + 1),A
  955.                 RET
  956.  
  957. .L6             LD BC,(OLD_BC)
  958.                 IN A,(C)
  959.                 LD (OLD_HL + 1),A
  960.                 RET
  961.  
  962. ; чтение INI
  963. IN_INI          LD HL,(OLD_HL)
  964.                 LD A,H
  965.                 CP 0x40
  966.                 JR C,.L1
  967.                 DEC HL
  968.                 LD A,(RD_1F)
  969.                 LD (HL),A
  970. ; временно, для анрыла
  971. ;               LD A,0xD3
  972. ;               LD (0x3FD7),A
  973. ; временно, для анрыла
  974. .L1             LD HL,0x2A53
  975.                 LD (ADR_EXIT),HL
  976.                 JP OUT_1F.INFF_BIT6
  977.  
  978. WAIT_READ       LD A,(WR_1F)
  979.                 AND 0xF0
  980.                 CP 0x80
  981.                 JP C,OUT_1F.INFF_BIT6
  982.                 CP 0xC0
  983.                 JR NC,READ_SECTOR.L1
  984.                 CALL READ_CPU12                 ; сохранение текущей конфигурации окон проецирования 1,2
  985.                 CALL FIND_SECTOR                ; проверяем наличие сектора
  986.                 PUSH AF
  987.                 CALL WRITE_CPU12                ; восстановление конфигурации окон проецирования 1,2
  988.                 POP AF
  989.                 JR NC,READ_SECTOR_1
  990. ; сектора нет, не дождетесь
  991.                 LD A,0x3C
  992.                 JP OUT_1F.INFF_BIT6_1
  993.  
  994. ; чтение сектора или портов
  995. READ_SECTOR     LD A,(WR_1F)
  996.                 AND 0xF0
  997.                 CP 0x80
  998.                 JP C,OUT_1F.INFF_BIT6
  999.                 CP 0xC0
  1000.                 JR C,READ_SECTOR_1
  1001. .L1             LD A,(PORT_3F)
  1002.                 LD HL,(OLD_HL)
  1003.                 LD (HL),A                       ; номер дорожки
  1004.                 INC HL
  1005.                 LD (HL),0                       ; номер стороны
  1006.                 INC HL
  1007.                 LD A,(PORT_5F)
  1008.                 LD (HL),A                       ; номер сектора
  1009.                 INC HL
  1010.                 LD (HL),0                       ; размер сектора
  1011.                 INC HL
  1012.                 LD (HL),0                       ; байт CRC
  1013.                 INC HL
  1014.                 LD (HL),0                       ; байт CRC
  1015.                 INC HL
  1016.                 LD (OLD_HL),HL
  1017.                 LD HL,OLD_BC + 1
  1018.                 LD A,(HL)
  1019.                 SUB 6                           ; REG B - 6
  1020.                 LD (HL),A
  1021.                 LD HL,0x2A53
  1022.                 LD (ADR_EXIT),HL
  1023.                 JP OUT_1F.INFF_BIT6
  1024.  
  1025. ; чтение сектора
  1026. READ_SECTOR_1   XOR A
  1027.                 JR WRITE_SECTOR_1
  1028.  
  1029. ; запись сектора
  1030. WRITE_SECTOR    LD A,0xFF
  1031. WRITE_SECTOR_1  LD (RDWR_MODE),A
  1032.                 LD A,1
  1033.                 LD (FLAG_RW_BREAK),A
  1034.                 LD HL,(OLD_IF)
  1035.                 PUSH HL
  1036.                 POP AF
  1037.                 JP PO,.DI_MODE                  ; прерывания разрешены?
  1038.                 CP 0x3F
  1039.                 JR Z,.DI_MODE
  1040.                 HALT                            ; разрешены, ждем обработчик прерывания
  1041. .DI_MODE        CALL READ_CPU12                 ; сохранение текущей конфигурации окон проецирования 1,2
  1042.                 CALL W_WR_RD_SECT
  1043.                 XOR A
  1044.                 LD (FLAG_RW_BREAK),A
  1045.                 LD HL,0x8090
  1046.                 LD (OLD_AF),HL                  ; эмуляция флага успешного чтения/записи сектора
  1047.                 LD HL,0x2A53
  1048.                 LD (ADR_EXIT),HL
  1049.                 JP WRITE_CPU12                  ; восстановление конфигурации окон проецирования 1,2
  1050.  
  1051. ; поиск сектора в таблице
  1052. FIND_SECTOR     LD BC,WIN_A1
  1053.                 LD A,0x40
  1054.                 OUT (C),A
  1055.                 LD B,HIGH (WIN_P1)
  1056.                 LD A,RAM_RAMDISK
  1057.                 OUT (C),A                       ; страница заголовков рамдиска
  1058.                 LD A,(PORT_3F)                  ; взяли номер трека
  1059.                 ADD A,A                         ; сторон 2
  1060.                 LD C,A
  1061.                 LD A,(WR_FF)
  1062.                 AND 0x10                        ; проверка какая сторона диска
  1063.                 JR NZ,.L2
  1064.                 INC C                           ; для стороны 1
  1065. .L2             LD B,HIGH (CPU1) + 2            ; адрес начала инфы о секторах на дорожке
  1066.                 LD HL,(PORT_5F)                 ; взяли номер сектора
  1067.                 LD H,0
  1068. .L1             LD A,(BC)
  1069.                 LD D,A                          ; взяли номер сектора
  1070.                 INC B
  1071.                 LD A,(BC)
  1072.                 LD E,A                          ; взяли размер сектора
  1073.                 INC B
  1074.                 LD A,D
  1075.                 AND A
  1076.                 SCF
  1077.                 RET Z                           ; ошибка, сектор не найден
  1078.                 LD A,L
  1079.                 CP D
  1080.                 RET Z                           ; сектор найден
  1081.                 LD A,E
  1082.                 ADD A,H
  1083.                 LD H,A
  1084.                 JR .L1
  1085.  
  1086. ; чтение или запись сектора рамдиска
  1087. W_WR_RD_SECT    LD A,(WR_FF)
  1088.                 AND 3
  1089.                 INC A
  1090.                 LD B,A
  1091.                 LD A,%10000000
  1092. .L1             RLCA
  1093.                 DJNZ .L1
  1094.                 LD B,A
  1095.                 LD A,(COPY_VIRT_BITS)
  1096.                 AND B
  1097.                 JP NZ,MOUNT_RW                  ; работа с примонтированным образом
  1098.                 CALL FIND_SECTOR
  1099.                 JR NC,.L2
  1100. ; сектор не найден, на выход
  1101.                 LD A,0x10
  1102.                 JP IN_1F.L2
  1103.  
  1104. ; сектор найден, читаем/пишем
  1105. .L2             LD A,E
  1106.                 RRCA
  1107.                 LD (SECTOR_SIZE),A              ; размер найденного сектора
  1108.                 LD L,0
  1109.                 LD E,L
  1110.                 SRL H
  1111.                 RR L                            ; HL = смещение в блоках до найденного сектора
  1112.                 LD B,HIGH (CPU1)
  1113.                 LD A,(BC)
  1114.                 LD D,A
  1115.                 ADD HL,DE                       ; HL = смещение от начала страницы в блоках
  1116.                 INC B
  1117.                 LD A,(BC)
  1118.                 LD C,A                          ; смещение в страницах от начала рамдиска
  1119.                 LD A,H
  1120.                 CP HIGH (CPU1)
  1121.                 JR C,.L5
  1122.                 SUB 0x40
  1123.                 LD H,A
  1124.                 INC C
  1125. ; HL = смещение в странице до начала сектора
  1126. .L5             LD A,C                          ; смещение до номера страницы, где указанный сектор начинается
  1127.                 ADD A,RAM_DATARAMD              ; прибавили номер начала рамдиск и +1. в 0 странице рамдиска описатели секторов
  1128.                 LD (RDWR_PAGE),A                ; сохранили номер вычисленной страницы
  1129.                 LD DE,(OLD_HL)
  1130.                 LD BC,(BB_CPU1)
  1131.                 LD A,C
  1132.                 LD C,LOW (WIN_A0)
  1133.                 OUT (C),A                       ; вернули стандартную 5 страницу
  1134. .S9             LD A,D                          ; проверка границы откуда/куда копировать
  1135.                 CP HIGH (CPU2)
  1136.                 PUSH DE
  1137.                 LD DE,CPU1 + HIGH (WIN_P1)
  1138.                 LD BC,WIN_A1                    ; если верхние 32кб озу, то нужно включить в 1 окне проецирования
  1139.                 JR NC,.S1
  1140.                 LD DE,CPU2 + HIGH (WIN_P2)
  1141.                 LD B,HIGH (WIN_A2)              ; если нижние 32кб озу, то нужно включить во 2 окне проецирования
  1142. .S1             LD A,0x40
  1143.                 OUT (C),A
  1144.                 LD B,E
  1145.                 LD A,(RDWR_PAGE)                ; номер вычисленной страницы озу
  1146.                 OUT (C),A                       ; включили вычисленную страницу
  1147.                 LD B,D                          ; старший байт адреса начала включенной страницы
  1148.                 POP DE
  1149.                 LD A,B
  1150.                 ADD A,H
  1151.                 LD H,A
  1152.                 LD A,(RDWR_MODE)
  1153.                 AND A
  1154.                 JR NZ,.I1
  1155.                 LD A,D
  1156.                 INC A
  1157.                 JR NZ,.I1
  1158.                 LD A,E
  1159.                 AND A
  1160.                 JR Z,.I1
  1161.                 NEG
  1162.                 LD C,A
  1163.                 LD B,0
  1164.                 LDIR
  1165.                 NEG
  1166.                 LD C,A
  1167. .I2             EX DE,HL
  1168.                 ADD HL,BC
  1169.                 EX DE,HL
  1170.                 ADD HL,BC
  1171.                 LD A,(SECTOR_SIZE)
  1172.                 JP .S8_
  1173.  
  1174. .I1             LD A,D
  1175.                 CP HIGH (CPU1)
  1176.                 JR NC,.I3
  1177.                 LD A,(SECTOR_SIZE)
  1178.                 AND A
  1179.                 LD BC,0x80
  1180.                 JR Z,.I2
  1181.                 LD BC,0x100
  1182.                 JR .I2
  1183.  
  1184. .I3             CP HIGH (CPU2)                  ; проверка перехода границы страниц
  1185.                 JP NC,.S3                       ; если выше то сразу копируем
  1186.                 CP HIGH (CPU2) - 1
  1187.                 JP C,.S3                        ; если ниже так же сразу копируем
  1188.                 LD A,E
  1189.                 AND A                           ; если сектор полностью укладывется до границы, то сразу копируем
  1190.                 JR Z,.S3                        ; иначе принудительно копируем в два приема
  1191.                 LD A,(RDWR_MODE)                ; чтение или запись?
  1192.                 AND A
  1193.                 LD A,E                          ; младший байт адрес в блоке
  1194.                 JR Z,.S4
  1195.                 EX DE,HL                        ; для записи меняем направление
  1196. .S4             NEG
  1197.                 LD C,A                          ; копируем остаток до конца блока
  1198.                 LD B,0
  1199.                 LDIR
  1200.                 NEG
  1201.                 PUSH AF                         ; спрятали сколько осталось копировать из начала следующего блока
  1202.                 LD BC,(BB_CPU2)
  1203.                 LD A,C
  1204.                 LD C,LOW (WIN_A0)
  1205.                 OUT (C),A
  1206.                 LD B,HIGH (WIN_A1)
  1207.                 LD A,0x40
  1208.                 OUT (C),A
  1209.                 LD B,HIGH (WIN_P1)
  1210.                 LD A,(RDWR_PAGE)
  1211.                 OUT (C),A                       ; вычисленную страницу включаем в 1 окне проецирования
  1212.                 LD A,(RDWR_MODE)                ; чтение или запись
  1213.                 AND A
  1214.                 JR Z,.S5
  1215.                 LD A,D                          ; для записи
  1216.                 SUB 0x40                        ; изменили адрес куда копировать на другое окно проецирования
  1217.                 LD D,A
  1218.                 JR .S6
  1219.  
  1220. .S5             LD A,H                          ; для чтения
  1221.                 SUB 0x40                        ; изменили адрес куда копировать на другое окно проецирования
  1222.                 LD H,A
  1223. .S6             POP AF
  1224.                 LD C,A                          ; сколько осталось скопировать байт
  1225.                 LD B,0
  1226.                 LDIR
  1227.                 LD A,(SECTOR_SIZE)
  1228.                 JR .S8_
  1229.  
  1230. .S3             LD A,(RDWR_MODE)                ; чтение или запись
  1231.                 AND A
  1232.                 JR Z,.S7
  1233.                 EX DE,HL                        ; для записи меняем направление
  1234. .S7             LD A,(SECTOR_SIZE)
  1235.                 AND A
  1236.                 JR NZ,.S8
  1237.                 CALL COPYHBLOCK                 ; для сектора размером 128 байт копируем половину и выходим
  1238. .ECOPY_BLOCK    LD A,(RDWR_MODE)
  1239.                 AND A
  1240.                 JR Z,.ECOPY_BLOCK1
  1241.                 EX DE,HL
  1242. .ECOPY_BLOCK1   LD (OLD_HL),DE
  1243.                 RET
  1244.  
  1245. .S8             CALL COPY_BLOCK                 ; для сектора 256 байт копируем весь и выходим
  1246. .S8_            DEC A
  1247.                 JR Z,.ECOPY_BLOCK
  1248.                 LD (SECTOR_SIZE),A
  1249.                 LD A,(RDWR_MODE)
  1250.                 AND A
  1251.                 JR Z,.S0
  1252.                 EX DE,HL
  1253. .S0             LD A,0x3F
  1254.                 AND H
  1255.                 LD H,A
  1256.                 JP .S9
  1257.  
  1258. COPY_BLOCK
  1259.         REPT 128
  1260.                 LDI
  1261.         ENDM
  1262. COPYHBLOCK
  1263.         REPT 128
  1264.                 LDI
  1265.         ENDM
  1266.                 RET
  1267.  
  1268. ; проверка наличия маркера рамдиска
  1269. CMP_RAM_DISK    CALL READ_CPU12
  1270.                 LD BC,WIN_P1
  1271.                 LD A,RAM_RAMDISK
  1272.                 OUT (C),A
  1273.                 LD HL,CPU1 + 0x3FFF
  1274.                 LD D,(HL)
  1275.                 DEC H
  1276.                 LD E,(HL)                       ; взяли байты для проверки маркера
  1277.                 CALL WRITE_CPU12
  1278.                 LD HL,"RD"
  1279.                 AND A
  1280.                 SBC HL,DE
  1281.                 RET Z                           ; если маркер на месте, то рамдиска не создаем
  1282. ; создание чистого рамдиска
  1283. CREATE_TRDTABL  LD BC,WIN_P1
  1284.                 LD A,RAM_RAMDISK                ; нужна страница начала рамдиска, где будет таблица описателей
  1285.                 OUT (C),A
  1286.                 LD HL,CPU1
  1287.                 PUSH HL
  1288.                 LD DE,CPU1 + 1
  1289.                 LD BC,0x3FFF
  1290.                 LD (HL),L
  1291.                 LDIR                            ; очистили страницу
  1292.                 POP DE                          ; адрес начала страницы
  1293.                 LD HL,0                         ; смещение в блоках и страницах
  1294.                 LD A,0xA0
  1295. ELT2            PUSH AF
  1296.                 LD BC,0x1000                    ; счетчик номеров секторов и их номера
  1297.                 LD A,L
  1298.                 RRCA
  1299.                 RRCA
  1300.                 LD (DE),A                       ; смещение в блоках дорожки в странице
  1301.                 INC D
  1302.                 LD A,H
  1303.                 LD (DE),A                       ; смещение в страницах до дорожки
  1304.                 INC D
  1305. ELT1            INC C
  1306.                 LD A,C
  1307.                 LD (DE),A                       ; номер сектора
  1308.                 INC D
  1309.                 LD A,2
  1310.                 LD (DE),A                       ; размер сектора
  1311.                 INC D
  1312.                 DJNZ ELT1                       ; вносим в таблицу все номера секторов с размерами
  1313.                 LD D,HIGH (CPU1)                ; вернули указатель в начало
  1314.                 INC E                           ; для следующей дорожки
  1315.                 LD BC,0x40
  1316.                 ADD HL,BC                       ; переход к следующей дорожке
  1317.                 POP AF
  1318.                 DEC A
  1319.                 JR NZ,ELT2                      ; повторяем для всех дорожек
  1320.                 LD HL,CPU1 + 0x3FFF
  1321.                 LD (HL),"R"                     ; вносим маркер рамдиска
  1322.                 DEC H
  1323.                 LD (HL),"D"
  1324.                 LD BC,WIN_P1
  1325.                 LD A,RAM_DATARAMD
  1326.                 OUT (C),A
  1327.                 LD HL,CPU1
  1328.                 LD DE,CPU1 + 1
  1329.                 LD BC,0x0FFF
  1330.                 LD (HL),L
  1331.                 LDIR
  1332.                 LD HL,DSKINFO
  1333.                 LD DE,CPU1 + 0x08E1
  1334.                 LD BC,DSK_END - DSKINFO
  1335.                 LDIR
  1336. ; восстановление конфигурации окон проецирования 1,2
  1337. WRITE_CPU12     LD BC,(BB_CPU1)
  1338.                 LD A,C
  1339.                 LD C,LOW (WIN_A0)
  1340.                 OUT (C),A
  1341.                 LD BC,(BB_CPU2)
  1342.                 LD A,C
  1343.                 LD C,LOW (WIN_A0)
  1344.                 OUT (C),A
  1345.                 RET
  1346.  
  1347. ; чтение текущего конфига страниц проецирования 1,2
  1348. READ_TMP_CPU12  LD HL,(BB_CPU1)
  1349.                 PUSH HL
  1350.                 LD HL,(BB_CPU2)
  1351.                 PUSH HL
  1352.                 CALL READ_CPU12
  1353.                 LD HL,(BB_CPU1)
  1354.                 LD (TMP_BB_CPU1),HL
  1355.                 LD HL,(BB_CPU2)
  1356.                 LD (TMP_BB_CPU2),HL
  1357.                 POP HL
  1358.                 LD (BB_CPU2),HL
  1359.                 POP HL
  1360.                 LD (BB_CPU1),HL
  1361.                 JR WRITE_CPU12
  1362.  
  1363. ; восстановление текущей конфигурации страниц проецирования 1,2
  1364. WRITE_TMP_CPU12 LD BC,0
  1365. TMP_BB_CPU1     EQU $-2
  1366.                 LD A,C
  1367.                 LD C,LOW (WIN_A0)
  1368.                 OUT (C),A
  1369.                 LD BC,0
  1370. TMP_BB_CPU2     EQU $-2
  1371.                 LD A,C
  1372.                 LD C,LOW (WIN_A0)
  1373.                 OUT (C),A
  1374.                 RET
  1375.  
  1376. ; чтение конфигурации окон проецирования 1,2
  1377. READ_CPU12      LD BC,RD_RAMNROM
  1378.                 IN L,(C)                        ; биты RAM & ROM
  1379.                 INC B
  1380.                 IN H,(C)                        ; биты DOS & 7FFD
  1381.                 ADD HL,HL
  1382.                 LD B,HIGH (RD_1WINA1)
  1383.                 IN A,(C)
  1384.                 CP 0xC0
  1385.                 JR NC,.L1
  1386.                 LD E,A
  1387.                 LD D,HIGH (WIN_P1)
  1388.                 JR .L2
  1389.  
  1390. .L1             RLCA
  1391.                 RLCA
  1392.                 SLA L
  1393.                 RRA
  1394.                 SLA H
  1395.                 RRA
  1396.                 LD E,A
  1397.                 LD D,HIGH (WIN_A1)
  1398. .L2             LD (BB_CPU1),DE
  1399.                 INC B
  1400.                 IN A,(C)
  1401.                 CP 0xC0
  1402.                 JR NC,.L3
  1403.                 LD E,A
  1404.                 LD D,HIGH (WIN_P2)
  1405.                 JR .L4
  1406.  
  1407. .L3             RLCA
  1408.                 RLCA
  1409.                 SLA L
  1410.                 RRA
  1411.                 SLA H
  1412.                 RRA
  1413.                 LD E,A
  1414.                 LD D,HIGH (WIN_A2)
  1415. .L4             LD (BB_CPU2),DE
  1416.                 RET
  1417.  
  1418. ; проверка наличия виртуального диска
  1419. DISK_NONE       PUSH HL
  1420.                 PUSH BC
  1421.                 CALL READ_CPU12
  1422.                 LD BC,WIN_A1
  1423.                 LD A,0x40
  1424.                 OUT (C),A
  1425.                 LD B,HIGH (WIN_P1)
  1426.                 LD A,RAM_RAMDISK
  1427.                 OUT (C),A
  1428.                 LD HL,CPU1 + 0x3FFF
  1429.                 LD A,(HL)
  1430.                 DEC H
  1431.                 CP "R"
  1432.                 SCF
  1433.                 JR NZ,DISK_NONE1
  1434.                 LD A,(HL)
  1435.                 CP "D"
  1436.                 SCF
  1437.                 JR NZ,DISK_NONE1
  1438.                 XOR A
  1439. DISK_NONE1      PUSH AF
  1440.                 CALL WRITE_CPU12
  1441.                 POP AF
  1442.                 POP BC
  1443.                 POP HL
  1444.                 RET
  1445.  
  1446. ; на входе: H-адрес ячейки
  1447. ;           L-прочитанное значение
  1448. READCMOS        PUSH BC
  1449.                 LD BC,CMOSD_SET_ADR
  1450.                 OUT (C),H
  1451.                 LD B,HIGH (CMOSD_RD_WR)
  1452.                 IN L,(C)
  1453.                 POP BC
  1454.                 LD A,L
  1455.                 AND A
  1456.                 RET
  1457.  
  1458.         JP_EMU 0x3C30                           ; IN    A, (0x1F)
  1459.  
  1460.                 DUPL 0x3D2F - $,0
  1461.                 NOP
  1462.                 RET
  1463.  
  1464.         JP_EMU 0x3D4D                           ; OUT      (0xFF), A
  1465.         JP_EMU 0x3D9A                           ; OUT      (0x1F), A
  1466.         JP_EMU 0x3DA6                           ; IN    A, (0xFF)
  1467.         JP_EMU 0x3DB5                           ; IN    A, (0x1F)
  1468.         JP_EMU 0x3DBA                           ; IN    A, (0x1F)
  1469.         JP_EMU 0x3DD5                           ; OUT      (0xFF), A
  1470.         JP_EMU 0x3E30                           ; IN    A, (0x1F)
  1471.         JP_EMU 0x3E3A                           ; IN    A, (0x1F)
  1472.         JP_EMU 0x3E44                           ; OUT      (0x7F), A
  1473.  
  1474.                 DUPL 0x3E49 - $,0
  1475.                 JP ADR_0x3E4C                   ; для адреса 0x3E4C
  1476.  
  1477. ;               JP_EMU 0x3E4C                   ; OUT      (0x7F), A
  1478.                 DUPL 0x3E4C - $,0
  1479.                 OUT (EXIT_PORT),A
  1480.                 JR 0x3E49
  1481.  
  1482.         JP_EMU 0x3E50                           ; IN    A, (0x3F)
  1483.         JP_EMU 0x3E78                           ; IN    A, (0x3F)
  1484.         JP_EMU 0x3E7E                           ; OUT      (0x3F), A
  1485.         JP_EMU 0x3E87                           ; IN    A, (0x3F)
  1486.         JP_EMU 0x3E95                           ; OUT      (0x3F), A
  1487.         JP_EMU 0x3EB5                           ; IN    A, (0x1F)
  1488.         JP_EMU 0x3EBC                           ; IN    A, (0x3F)
  1489.         JP_EMU 0x3EC9                           ; OUT      (0x1F), A
  1490.         JP_EMU 0x3ECE                           ; IN    A, (0xFF)
  1491.         JP_EMU 0x3EDF                           ; OUT      (0x1F), A
  1492.  
  1493.                 DUPL 0x3EF3 - $,0               ; IN    H, (C)
  1494.                 OUT (EXIT_PORT),A
  1495.                 JR JUMP_0x3EF3
  1496.  
  1497.                 JR JUMP_0x3EF5                  ; IN    A, (0xFF)
  1498.  
  1499. EXIT_0x3EF5     OUT (EXIT_PORT),A
  1500. JUMP_0x3EF5     JP ADR_0x3EF5
  1501.  
  1502. ;       JP_EMU 0x3EF5                           ; IN    A, (0xFF)
  1503.         JP_EMU 0x3EFE                           ; IN    A, (0x7F)
  1504.  
  1505. JUMP_0x3EF3     JP ADR_0x3EF3
  1506.  
  1507.                 JP_EMU 0x3F1B                   ; OUT      (0x5F), A
  1508.                 JP_EMU 0x3F25                   ; OUT      (0x1F), A
  1509.                 JP_EMU 0x3F33                   ; IN    A, (0x1F)
  1510.  
  1511.                 DUPL 0x3F40 - $,0               ; для адреса 0x3EF3
  1512.                 JP ADR_0x3EF3
  1513.  
  1514.         JP_EMU 0x3F4D                           ; OUT      (0x1F), A
  1515.         JP_EMU 0x3F55                           ; IN    A, (0x3F)
  1516.         JP_EMU 0x3F5A                           ; IN    A, (0x5F)
  1517.         JP_EMU 0x3F69                           ; IN    A, (0x3F)
  1518.         JP_EMU 0x3F72                           ; IN    A, (0x5F)
  1519.  
  1520.         JP_EMU 0x3FBC                           ; IN    A, (0xFF)       ;запись сектора
  1521.  
  1522.                 DUPL 0x3FC7 - $,0
  1523. JUMP_0x3FF0     JP ADR_0x3FF0
  1524.  
  1525.         JP_EMU 0x3FCA                           ; IN    A, (0xFF)       ;запись сектора
  1526.         JP_EMU 0x3FD1                           ; OUTI                  ;запись сектора
  1527.  
  1528.         JP_EMU 0x3FD7                           ; IN    A, (0xFF)       ;чтение сектора
  1529.  
  1530. JUMP_0x3FEC     JP ADR_0x3FEC
  1531. JUMP_0x3FF3     JP ADR_0x3FF3
  1532.  
  1533.         JP_EMU 0x3FE5                           ; IN    A, (0xFF)       ;чтение сектора
  1534.  
  1535. ;       JP_EMU 0x3FEC                           ; INI                   ;чтение сектора
  1536.                 DUPL 0x3FEC - $,0
  1537.                 OUT (EXIT_PORT),A
  1538.                 JR JUMP_0x3FEC
  1539.  
  1540. ;               DUPL 0x3FF0 - $,0               ; OUT      (C), A
  1541.                 OUT (EXIT_PORT),A
  1542.                 DB 0x18                         ; JR 0x3FC7
  1543.  
  1544. ;               DUPL 0x3FF5 - $,0               ; IN    A, (C)
  1545.                 OUT (EXIT_PORT),A
  1546.                 JP JUMP_0x3FF3
  1547.  
  1548.                 DUPL 0x3FF8 - $,0
  1549.                 DB "EVOSFE"
  1550.                 DW DATA_VERS
  1551.