Subversion Repositories pentevo

Rev

Rev 1065 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed | ?url?

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