Subversion Repositories pentevo

Rev

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

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