Subversion Repositories pentevo

Rev

Rev 1120 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1.  
  2. ; LAST UPDATE: 16.02.2025 savelij
  3.  
  4. ; последовательность для RST 8
  5. ; старый стек   HL AF BC RF ADR_RET DE  ->
  6. ; -> новый стек HL(номер паги и порт BF) DE(RAMNROM И DOS7FFD) BC' DE' HL' IX IY AF' ->
  7. ; -> чтение конфига
  8.  
  9. REG_R_CORRECT   EQU 0x0D
  10.  
  11. CODE_NMIRST
  12.        
  13.         PHASE 0
  14.  
  15.                 JP CALL2PAGE                    ; вызов кода в другой странице ROM
  16.  
  17.                 JP CALL2RAMPAGE                 ; вызов кода в другой странице RAM
  18.  
  19.                 DB ADR_SEL_ROM-$ DUP 0
  20.                 OUT (C),A                       ; переключение страниц для переходов
  21.                 NOP
  22. FOR_RET         NOP
  23.                 JP RAMSEL1
  24.  
  25. OUT_NMI         OUT (0xBE),A
  26.                 RETN
  27.  
  28.                 DB 0x0038-$ DUP 0xFF
  29. IM_EI_RET       EI
  30.                 RET
  31.  
  32. VIRT_BITS       DB 0                            ; биты 7-4 примонтированные диски,
  33.                                                 ; биты 3-2 номер реального диска
  34.                                                 ; биты 1-0 номер виртуального диска
  35.  
  36.                 DB 0x0066-$ DUP 0xFF
  37.                 NOP
  38.                 NOP
  39. ADR_MAGIC       JP NMI_SERVICE
  40. ADR_NMI_JUMP    EQU $-2
  41.  
  42.         PHASE $+CPU2
  43. ; считанная конфигурация портов для RST 8
  44. R_BF            DB 0xFF
  45. R_77            DB 0xFF
  46. R_EFF7          DB 0xFF
  47. R_7FFD          DB 0xFF
  48. R_DOS7FFD       DB 0xFF
  49. R_RAMNROM       DB 0xFF
  50. R_1WINA3        DB 0xFF
  51. R_1WINA2        DB 0xFF
  52. R_1WINA1        DB 0xFF
  53. R_1WINA0        DB 0xFF
  54. R_0WINA3        DB 0xFF
  55. R_0WINA2        DB 0xFF
  56. R_0WINA1        DB 0xFF
  57. R_0WINA0        DB 0xFF
  58.  
  59. ; считанная конфигурация портов для NMI
  60. N_BF            DB 0xFF
  61. N_77            DB 0xFF
  62. N_EFF7          DB 0xFF
  63. N_7FFD          DB 0xFF
  64. N_DOS7FFD       DB 0xFF
  65. N_RAMNROM       DB 0xFF
  66. N_1WINA3        DB 0xFF
  67. N_1WINA2        DB 0xFF
  68. N_1WINA1        DB 0xFF
  69. N_1WINA0        DB 0xFF
  70. N_0WINA3        DB 0xFF
  71. N_0WINA2        DB 0xFF
  72. N_0WINA1        DB 0xFF
  73. N_0WINA0        DB 0xFF
  74. N_TEK_PALS      DB 0x10 DUP 0xFF
  75.  
  76. ; сохраненные регистры при вызове RST 8
  77. RREG_FI         DB 0xFF
  78. RREG_I          DB 0xFF                         ; IF
  79. RREG_FF         DB 0xFF
  80. RREG_AA         DB 0xFF                         ; AF'
  81. RREG_IYL        DB 0xFF
  82. RREG_IYH        DB 0xFF                         ; IY
  83. RREG_IXL        DB 0xFF
  84. RREG_IXH        DB 0xFF                         ; IX
  85. RREG_LL         DB 0xFF
  86. RREG_HH         DB 0xFF                         ; HL'
  87. RREG_EE         DB 0xFF
  88. RREG_DD         DB 0xFF                         ; DE'
  89. RREG_CC         DB 0xFF
  90. RREG_BB         DB 0xFF                         ; BC'
  91. RDOS7FFD        DB 0xFF                         ; биты DOS7FFD перед вызовом
  92. RRAMNROM        DB 0xFF                         ; биты RAMNROM перед вызовом
  93. RPBF_CALL       DB 0xFF                         ; содержимое порта BF перед вызовом
  94. RPAGE_CALL      DB 0xFF                         ; номер страницы откуда пришли
  95. RREG_E          DB 0xFF
  96. RREG_D          DB 0xFF                         ; DE
  97. RADRRET_L       DB 0xFF
  98. RADRRET_H       DB 0xFF                         ; ADR_RET
  99. REI_DI          DB 0xFF
  100. R_R             DB 0xFF                         ; RF
  101. RREG_C          DB 0xFF
  102. RREG_B          DB 0xFF                         ; BC
  103. RREG_F          DB 0xFF
  104. RREG_A          DB 0xFF                         ; AF
  105. RREG_L          DB 0xFF
  106. RREG_H          DB 0xFF                         ; HL
  107. RST8_SAVE_SP    DW 0xFF
  108.  
  109. ; сохраненные регистры при вызове NMI
  110. ; ADR_RET AF' IY IX BC' DE' HL' BC DE RF IF AF HL
  111. NADRRET_L       DB 0xFF                         ; ADR RET
  112. NADRRET_H       DB 0xFF
  113. NREG_FF         DB 0xFF                         ; AF'
  114. NREG_AA         DB 0xFF
  115. NREG_IYL        DB 0xFF                         ; IY
  116. NREG_IYH        DB 0xFF
  117. NREG_IXL        DB 0xFF                         ; IX
  118. NREG_IXH        DB 0xFF
  119. NREG_CC         DB 0xFF                         ; BC'
  120. NREG_BB         DB 0xFF                
  121. NREG_EE         DB 0xFF                         ; DE'
  122. NREG_DD         DB 0xFF
  123. NREG_LL         DB 0xFF                         ; HL'
  124. NREG_HH         DB 0xFF
  125. NREG_C          DB 0xFF                         ; BC
  126. NREG_B          DB 0xFF
  127. NREG_E          DB 0xFF                         ; DE
  128. NREG_D          DB 0xFF
  129. NREG_EI_DI_2    DB 0xFF                         ; RF
  130. NREG_R          DB 0xFF
  131. NREG_EI_DI_1    DB 0xFF                         ; IF
  132. NREG_I          DB 0xFF
  133. NREG_F          DB 0xFF                         ; AF
  134. NREG_A          DB 0xFF
  135. NREG_L          DB 0xFF                         ; HL
  136. NREG_H          DB 0xFF
  137. NMI_SAVE_SP     DW 0xFF                         ; адрес сохранения стека программы прерванной по NMI
  138. NUM_IM          DB 0xFF                         ; режим прерываний: 0-IM 1, 1-IM 2
  139. INT_MODE        DB 0xFF                         ; прерывания 0-запрешены, 1-разрешены
  140. INTERNAL_SP     DW 0xFF                         ; адрес хранения стека при работе сервисов
  141.  
  142. B0_CPU0         DB 0xFF                         ; байт для порта 0 окна 0 мапера
  143. P0_CPU0         DB 0xFF                         ; старший байт адреса порта порта для 0 окна 0 мапера
  144. B0_CPU1         DB 0xFF                         ; байт для порта 1 окна 0 мапера
  145. P0_CPU1         DB 0xFF                         ; старший байт адреса порта порта для 1 окна 0 мапера
  146. B0_CPU2         DB 0xFF                         ; байт для порта 2 окна 0 мапера
  147. P0_CPU2         DB 0xFF                         ; старший байт адреса порта порта для 2 окна 0 мапера
  148. B0_CPU3         DB 0xFF                         ; байт для порта 3 окна 0 мапера
  149. P0_CPU3         DB 0xFF                         ; старший байт адреса порта порта для 3 окна 0 мапера
  150. B1_CPU0         DB 0xFF                         ; байт для порта 0 окна 0 мапера
  151. P1_CPU0         DB 0xFF                         ; старший байт адреса порта порта для 0 окна 0 мапера
  152. B1_CPU1         DB 0xFF                         ; байт для порта 1 окна 0 мапера
  153. P1_CPU1         DB 0xFF                         ; старший байт адреса порта порта для 1 окна 0 мапера
  154. B1_CPU2         DB 0xFF                         ; байт для порта 2 окна 0 мапера
  155. P1_CPU2         DB 0xFF                         ; старший байт адреса порта порта для 2 окна 0 мапера
  156. B1_CPU3         DB 0xFF                         ; байт для порта 3 окна 0 мапера
  157. P1_CPU3         DB 0xFF                         ; старший байт адреса порта порта для 3 окна 0 мапера
  158. B_PORT77        DB 0xFF                         ; байт для вывода в порт ХХ77
  159. P_PORT77        DB 0xFF                         ; старший байт адреса порта ХХ77
  160. B_PORT_VIRT     DB 0xFF                         ; текущее состояние порта виртульных дисководов
  161.  
  162.         PHASE $ & 0x3FFF
  163.                 DB HIGH ($) * 0x100 + 0xFF - $ DUP 0xFF
  164.                 DW IM_EI_RET
  165.  
  166.                 DB HIGH ($) * 0x100 + 0x80 - $ DUP 0xFF
  167. STACK_RST
  168.  
  169.                 DB (HIGH ($) + 1) * 0x100 - $ DUP 0xFF
  170. STACK_NMI
  171.  
  172.                 JP NMI_EXIT_DBG
  173.  
  174. ; вход по RST 8
  175. RAMSEL1         LD (RST8_SAVE_SP-CPU2),SP       ; сохранили старый стек
  176.                 LD SP,RREG_E-CPU2
  177.                 PUSH HL                         ; номер страницы откуда пришли и содержимое порта BF
  178.                 PUSH DE                         ; биты RAMNROM+DOS7FFD
  179.                 EXX
  180.                 PUSH BC                         ; BC'
  181.                 PUSH DE                         ; DE'
  182.                 PUSH HL                         ; HL'
  183.                 EXX
  184.                 PUSH IX                         ; IX
  185.                 PUSH IY                         ; IY
  186.                 EX AF,AF'
  187.                 PUSH AF                         ; AF'
  188.                 LD A,I
  189.                 PUSH AF                         ; IF
  190. ; восстанавливаем память под переходом на обработчик NMI
  191.                 LD HL,ADR_MAGIC
  192.                 LD DE,TMP_ADR_0068 - CPU2
  193.                 LDI
  194.                 LDI
  195.                 LDI
  196.                 LD A,0xC9
  197.                 LD (FOR_RET),A
  198.                 XOR A
  199.                 LD I,A
  200.                 LD HL,(RST8_SAVE_SP-CPU2)
  201.                 LD DE,RREG_E-CPU2
  202.                 LD BC,RREG_H-RPAGE_CALL
  203.                 LDIR
  204.                 LD HL,R_77-CPU2
  205.                 LD BC,RD_77
  206.                 INIR
  207.                 INI
  208.                 LD BC,FDD_EMU_PORT
  209.                 IN A,(C)
  210.                 LD (B_PORT_VIRT & 0x3FFF),A
  211.                 XOR A
  212.                 OUT (C),A
  213.                 LD HL,(RDOS7FFD-CPU2)
  214.                 LD (R_DOS7FFD-CPU2),HL
  215.                 LD SP,STACK_RST
  216.                 LD A,(R_77-CPU2)
  217.                 AND 7
  218.                 OR 0xA0                         ; выключение турбо 14 мгц
  219.                 LD BC,0xFF77
  220.                 OUT (C),A
  221.         PEC_OFF M_SHADOW_BF
  222.                 LD BC,PENT_CONF
  223.                 LD A,(R_EFF7-CPU2)
  224.                 AND %11101111
  225.                 OUT (C),A                       ; включение турбо 7 мгц
  226.         PEC_ON M_SHADOW_BF
  227.                 LD A,(R_7FFD-CPU2)
  228.                 AND 0x10
  229.                 LD HL,R_0WINA0-CPU2
  230.                 JR Z,RAMSEL3
  231.                 LD HL,R_1WINA0-CPU2
  232. RAMSEL3         LD A,(RPAGE_CALL-CPU2)
  233.                 LD (HL),A
  234.         ATMPORT WIN_A3,0x40
  235.                 LD BC,WIN_P2
  236.                 XOR A
  237.                 OUT (C),A
  238.                 LD BC,WIN_A0
  239.                 LD A,ROM_RST83
  240.                 LD HL,CPU2
  241.                 ADD HL,SP
  242.                 LD SP,HL
  243.                 LD HL,CONT_RST8                 ; адрес продолжения обработки RST 8
  244.                 PUSH HL
  245.                 JP ADR_SEL_ROM
  246.  
  247. ; выход из обработчика RST 8
  248. P4_EXIT_RST8
  249. ; сохраняем память под переходом на обработчик NMI
  250.                 LD HL,TMP_ADR_0068 - CPU2
  251.                 LD DE,ADR_MAGIC
  252.                 LDI
  253.                 LDI
  254.                 LDI
  255.                 XOR A
  256.                 LD (FOR_RET),A
  257.         PEC_OFF M_SHADOW_BF
  258.                 LD BC,PENT_CONF
  259.                 LD A,(R_EFF7-CPU2)
  260.                 OUT (C),A
  261.         PEC_ON M_SHADOW_BF
  262.                 LD C,LOW (WIN_A1)
  263.                 LD A,(R_7FFD-CPU2)
  264.                 AND 0x10
  265.                 LD HL,B0_CPU1-CPU2
  266.                 JR Z,.L11
  267.                 LD HL,B1_CPU1-CPU2
  268. .L11            LD A,3
  269. .L12            EX AF,AF'
  270.                 LD E,(HL)                       ; байт для записи в порт
  271.                 INC HL
  272.                 LD D,(HL)                       ; старший байт адреса порта
  273.                 INC HL
  274.                 LD A,D
  275.                 OR 7
  276.                 LD B,A
  277.                 OUT (C),E
  278.                 EX AF,AF'
  279.                 DEC A
  280.                 JR NZ,.L12
  281.         IFDEF DOS_FE
  282.                 LD BC,FDD_EMU_PORT
  283.                 LD A,(B_PORT_VIRT & 0x3FFF)
  284.                 OUT (C),A
  285.         ENDIF
  286.                 LD HL,RST8_SAVE_SP-(RREG_H-RPAGE_CALL)-CPU2
  287.                 LD DE,(RST8_SAVE_SP-CPU2)
  288.                 LD BC,RREG_H-RPAGE_CALL
  289.                 LDIR
  290.                 LD BC,(B_PORT77-CPU2)
  291.                 LD A,C
  292.                 LD C,0x77
  293.                 OUT (C),A
  294.                 LD SP,RREG_FI-CPU2
  295.                 POP AF
  296.                 LD I,A
  297.                 POP AF
  298.                 EX AF,AF'
  299.                 POP IY
  300.                 POP IX
  301.                 POP HL
  302.                 POP DE
  303.                 POP BC
  304.                 EXX
  305.                 POP DE
  306.                 POP HL
  307.                 LD SP,(RST8_SAVE_SP-CPU2)       ; восстановили стек вызвашей программы
  308.                 LD BC,ADR_RST8END               ; адрес возврата
  309.                 PUSH BC
  310.                 LD C,LOW (WIN_A0)
  311.                 LD A,(R_7FFD-CPU2)
  312.                 AND 0x10
  313.                 LD DE,(B0_CPU0-CPU2)
  314.                 JR Z,.L13
  315.                 LD DE,(B1_CPU0-CPU2)
  316. .L13            LD A,D
  317.                 OR 7
  318.                 LD B,A
  319.                 LD A,E                          ; страница ROM куда возвращаться
  320.                 JP ADR_SEL_ROM
  321.  
  322. ; вход по NMI
  323. NMI_SERVICE     LD (NMI_SAVE_SP-CPU2),SP        ; сохранение стека
  324.                 LD SP,NMI_SAVE_SP-CPU2          ; новый стек
  325.                 PUSH HL                         ; сохранили HL
  326.                 PUSH AF                         ; сохранили AF
  327.                 LD A,I
  328.                 PUSH AF                         ; сохранили I, флаги и режим прерываний
  329.                 LD A,R
  330.                 PUSH AF                         ; сохранили R
  331.                 PUSH DE                         ; сохранили DE
  332.                 PUSH BC                         ; сохранили BC
  333.                 EXX
  334.                 PUSH HL                         ; сохранили АЛЬТ HL
  335.                 PUSH DE                         ; сохранили АЛЬТ DE
  336.                 PUSH BC                         ; сохранили АЛЬТ BC
  337.                 PUSH IX                         ; сохранили IX
  338.                 PUSH IY                         ; сохранили IY
  339.                 EX AF,AF'
  340.                 PUSH AF                         ; сохранили альт AF
  341.                 LD A,0x80-REG_R_CORRECT
  342.                 LD HL,NREG_R-CPU2
  343.                 SLA (HL)
  344.                 RLA
  345.                 ADD A,(HL)
  346.                 RRCA
  347.                 LD (HL),A                       ; коррекция регистра R
  348. ; сохраняем помять под переходом на обработчик NMI
  349.                 LD HL,ADR_MAGIC
  350.                 LD DE,TMP_ADR_0068 - CPU2
  351.                 LDI
  352.                 LDI
  353.                 LDI
  354.                 LD HL,(NMI_SAVE_SP-CPU2)
  355.                 LD E,(HL)
  356.                 INC HL
  357.                 LD D,(HL)
  358.                 LD HL,(NREG_F-CPU2)
  359.                 AND A
  360.                 SBC HL,DE
  361.                 JR NZ,.L005
  362.                 LD HL,(NMI_SAVE_SP-CPU2)
  363.                 INC HL
  364.                 INC HL
  365.                 LD (NMI_SAVE_SP-CPU2),HL
  366.                 LD E,(HL)
  367.                 INC HL
  368.                 LD D,(HL)
  369. .L005           PUSH DE
  370.                 LD SP,STACK_NMI
  371.                 LD HL,OUT_NMI
  372.                 LD (ADR_NMI_JUMP),HL
  373.                 LD A,0xC9
  374.                 LD (FOR_RET),A                  ; RET для переключения страниц ROM/RAM
  375.                 LD HL,N_BF-CPU2                 ; адрес сохранения прочитанных регистров конфигурации
  376.                 IN A,(PEVO_CONF)
  377.                 LD (HL),A
  378.                 INC HL
  379.                 LD BC,RD_77
  380.                 INIR
  381.                 INI
  382.                 LD BC,FDD_EMU_PORT
  383.                 IN A,(C)
  384.                 LD (B_PORT_VIRT & 0x3FFF),A
  385.                 XOR A
  386.                 OUT (C),A                       ; обнуляем биты эмуляции ВГ
  387.                 LD B,1                          ; прерывания разрешены
  388.                 LD A,R
  389.                 JP PE,.L001
  390.                 LD A,R
  391.                 JP PE,.L001
  392.                 DEC B                           ; прерывания запрещены
  393. .L001           XOR A
  394.                 LD I,A                          ; обработчик прерывания переставилии для адреса 00FF
  395.                 CALL GET_NUM_IM
  396.         PEC_OFF M_SHADOW_BF
  397.                 LD A,(N_EFF7-CPU2)
  398.                 AND %11101111
  399.                 LD BC,PENT_CONF
  400.                 OUT (C),A
  401.         PEC_ON M_SHADOW_BF
  402.                 LD A,(N_77-CPU2)
  403.                 AND %11110111
  404.                 LD BC,0xFF77
  405.                 OUT (C),A                       ; установка 7.0Mhz для NMI сервиса
  406.                 PUSH DE
  407.                 LD BC,WIN_P2
  408.                 XOR A
  409.                 OUT (C),A                       ; включили последнюю страницу озу
  410.                 LD B,HIGH (WIN_A3)
  411.                 LD A,0x40
  412.                 OUT (C),A                       ; сняли зависимость 3 окна от порта 7FFD
  413.                 LD DE,CPU2
  414.                 ADD HL,DE
  415.                 LD (ADR_PALITRA),HL
  416.                 LD HL,CPU2
  417.                 ADD HL,SP
  418.                 LD SP,HL
  419.                 LD B,HIGH (WIN_A0)
  420.                 LD A,ROM_RST83
  421.                 OUT (C),A
  422.                 POP HL
  423.                 LD (NUM_IM),HL
  424. PEREHVAT        DB 3 DUP 0
  425.                 LD A,(DEBUG_ONOFF)
  426.                 AND A
  427.                 JR NZ,IN_DEBUG
  428.                 LD HL,CONTINUE_MAGIC
  429.                 PUSH HL
  430.                 JP OUT_NMI
  431.  
  432. IN_DEBUG        XOR A
  433.                 IN A,(0xFE)
  434.                 CPL
  435.                 AND 0x1F
  436.                 JR NZ,IN_DEBUG
  437.                 LD HL,NMI_DEBUG
  438.                 PUSH HL
  439.                 JP OUT_NMI
  440.  
  441. ; выход из NMI
  442. EXITNMISERVICE  LD HL,ADR_MAGIC
  443.                 LD (HL),0xC9                    ; заглушка на MAGIC
  444.                 IN A,(PEVO_CONF)
  445.                 OR M_NMI_BF
  446.                 OUT (PEVO_CONF),A
  447.                 AND M_NMI_BF!0xFF
  448.                 OUT (PEVO_CONF),A
  449.                 HALT                            ; ждем срабатывания MAGIC
  450. ; восстанавливаем память под переходом на обработчик NMI
  451.                 LD HL,TMP_ADR_0068 - CPU2
  452.                 LD DE,ADR_MAGIC
  453.                 LDI
  454.                 LDI
  455.                 LDI
  456.                 LD C,LOW (WIN_A0)
  457.                 LD A,(N_7FFD-CPU2)
  458.                 AND 0x10
  459.                 LD HL,B0_CPU0-CPU2
  460.                 JR Z,.L11
  461.                 LD HL,B1_CPU0-CPU2
  462. .L11            LD A,4
  463. .L12            EX AF,AF'
  464.                 LD E,(HL)                       ; байт для записи в порт
  465.                 INC HL
  466.                 LD D,(HL)                       ; старший байт адреса порта
  467.                 INC HL
  468.                 LD A,D
  469.                 OR 0x3F
  470.                 LD B,A
  471.                 BIT 3,D
  472.                 JR NZ,.L15
  473.                 LD A,D
  474.                 AND 3
  475.                 RRCA
  476.                 RRCA
  477.                 OUT (C),A
  478.                 RES 3,B
  479. .L15            OUT (C),E
  480.                 EX AF,AF'
  481.                 DEC A
  482.                 JR NZ,.L12
  483.         IFDEF DOS_FE
  484.                 LD BC,FDD_EMU_PORT
  485.                 LD A,(B_PORT_VIRT & 0x3FFF)
  486.                 OUT (C),A
  487.         ENDIF
  488.         PEC_OFF M_SHADOW_BF
  489.                 LD BC,PENT_CONF
  490.                 LD A,(N_EFF7-CPU2)
  491.                 OUT (C),A
  492.         PEC_ON M_SHADOW_BF
  493.                 LD BC,(B_PORT77-CPU2)
  494.                 LD A,C
  495.                 LD C,0x77
  496.                 OUT (C),A
  497.                 LD A,(N_BF-CPU2)
  498.                 OUT (PEVO_CONF),A
  499.                 LD BC,CONF_128
  500.                 LD A,(N_7FFD-CPU2)
  501.                 OUT (C),A
  502.                 LD HL,NMI_SERVICE
  503.                 LD (ADR_NMI_JUMP),HL
  504.                 XOR A
  505.                 LD (FOR_RET),A
  506.                 LD SP,NADRRET_L-CPU2
  507.                 LD HL,(NMI_SAVE_SP-CPU2)
  508.                 POP DE
  509.                 LD (HL),E
  510.                 INC HL
  511.                 LD (HL),D                       ; восстановление адреса возврата
  512.                 POP AF
  513.                 EX AF,AF'
  514.                 POP IY
  515.                 POP IX
  516.                 POP BC
  517.                 POP DE
  518.                 POP HL
  519.                 EXX
  520.                 POP BC
  521.                 POP DE
  522.                 POP AF
  523.                 JP PO,.L1
  524.                 EI
  525. .L1             LD A,0x80+3-REG_R_CORRECT
  526.                 LD HL,NREG_R-CPU2
  527.                 SLA (HL)
  528.                 RLA
  529.                 ADD A,(HL)
  530.                 RRCA
  531.                 LD R,A
  532.                 POP AF
  533.                 LD I,A
  534.                 POP AF
  535.                 POP HL
  536.                 LD SP,(NMI_SAVE_SP-CPU2)
  537.                 OUT (0xBE),A
  538.                 RETN
  539.  
  540. LDIR__BYTES     LD HL,CPU2
  541.                 ADD HL,SP
  542.                 LD SP,HL
  543.                 LD A,(R_7FFD-CPU2)
  544.                 AND 0x10
  545.                 LD HL,B0_CPU1-CPU2
  546.                 JR Z,.L5
  547.                 LD HL,B1_CPU1-CPU2
  548. .L5             LD C,LOW (WIN_A0)
  549.                 LD A,3
  550. .L3             EX AF,AF'
  551.                 LD E,(HL)                       ; байт для записи в порт
  552.                 INC HL
  553.                 LD D,(HL)                       ; старший байт адреса порта
  554.                 INC HL
  555.                 LD A,D
  556.                 OR 0x3F
  557.                 LD B,A
  558.                 BIT 3,D
  559.                 JR NZ,.L4
  560.                 LD A,D
  561.                 AND 3
  562.                 RRCA
  563.                 RRCA
  564.                 OUT (C),A
  565.                 RES 3,B
  566. .L4             OUT (C),E
  567.                 EX AF,AF'
  568.                 DEC A
  569.                 JR NZ,.L3
  570.                 EXX
  571.                 LDIR
  572.                 LD BC,WIN_P2
  573.                 XOR A
  574.                 OUT (C),A
  575.                 LD HL,CPU2
  576.                 ADD HL,SP
  577.                 LD SP,HL
  578.                 LD BC,WIN_A0
  579.                 LD A,ROM_RST83
  580.                 JP ADR_SEL_ROM
  581.  
  582. NUM_IM2         LD A,1
  583.                 RET
  584.  
  585. GET_NUM_IM      PUSH HL
  586.                 LD D,B                          ; INT ON/OFF
  587.                 LD HL,0x0038
  588.                 LD (HL),0xAF
  589.                 LD L,0xFF
  590.                 LD (HL),LOW (NUM_IM2)
  591.                 INC HL
  592.                 LD (HL),HIGH (NUM_IM2)
  593.                 EI
  594.                 HALT
  595.                 DI
  596.                 LD E,A                          ; 0-IM 1, 1-IM 2
  597.                 LD HL,0x0038
  598.                 LD (HL),0xFB
  599.                 LD L,0xFF
  600.                 LD (HL),LOW (IM_EI_RET)
  601.                 INC HL
  602.                 LD (HL),HIGH (IM_EI_RET)
  603.                 POP HL
  604.                 RET
  605.  
  606.         PHASE $ + CPU2
  607. ; вызов подпрограмм из других страниц ROM
  608. CALL2PAGE       EX (SP),HL
  609.                 PUSH BC
  610.                 PUSH AF
  611.                 LD BC,WIN_A0
  612. .L1             LD (PORTCALL),BC
  613.                 LD C,(HL)
  614.                 INC HL
  615.                 LD B,(HL)
  616.                 INC HL
  617.                 LD (ADRCALL),BC
  618.                 LD BC,RD_7FFD
  619.                 IN A,(C)
  620.                 AND 0x10
  621.                 LD BC,RD_0WINA0
  622.                 JR Z,.L2
  623.                 LD BC,RD_1WINA0
  624. .L2             IN A,(C)
  625.                 AND 0x3F
  626.                 LD BC,STEK_PAGES
  627. TEKPAGE         EQU $-2
  628.                 LD (BC),A
  629.                 INC BC
  630.                 LD (TEKPAGE),BC
  631.                 LD A,(HL)
  632.                 INC HL
  633.                 LD BC,WIN_A0
  634. PORTCALL        EQU $-2
  635.                 OUT (C),A
  636.                 POP AF
  637.                 POP BC
  638.                 EX (SP),HL
  639.                 CALL 0
  640. ADRCALL         EQU $-2
  641.                 PUSH BC
  642.                 PUSH AF
  643.                 LD BC,(TEKPAGE)
  644.                 DEC BC
  645.                 LD A,(BC)
  646.                 LD (TEKPAGE),BC
  647.                 LD BC,WIN_A0
  648.                 OUT (C),A
  649.                 POP AF
  650.                 POP BC
  651.                 RET
  652.  
  653. CALL2RAMPAGE    EX (SP),HL
  654.                 PUSH BC
  655.                 PUSH AF
  656.                 LD BC,WIN_P0
  657.                 JR CALL2PAGE.L1
  658.  
  659. ; вход в отладчик
  660. NMI_DEBUG       DI
  661.                 LD HL,CPU2 + DEBUG_ONOFF
  662.                 BIT DEBUGGER.B_ACTIV,(HL)
  663.                 JR Z,.L1
  664. ; принудительный вход в отладчик с возвратом в основное меню NMI
  665.                 LD HL,DBG2MAINMENU
  666.                 PUSH HL
  667.                 JR .L2
  668.  
  669. ; вход в отладчик из основного меню NMI
  670. .L1             LD HL,RESTART_MAIN
  671.                 PUSH HL
  672.                 LD HL,EXIT_DEBUG
  673.                 PUSH HL
  674.                 LD HL,CPU2+DEBUG_ONOFF
  675.                 SET DEBUGGER.B_ACTIV,(HL)
  676. .L2             LD HL,CONTINUE_PROG
  677.                 LD DE,NADRRET_L
  678.         EVOPORT WIN_P3,RAM_STS                  ; включили страницу с установленным STS
  679.                 LD BC,N_BF
  680.                 LD A,(N_77)
  681.                 EX AF,AF'
  682.                 LD A,NO_EXIT_DEBUG-EXIT_DEBUG
  683.                 JP START_STS
  684.  
  685. ; нормальный выход из отладчика
  686. EXIT_DEBUG      LD HL,CPU2+DEBUG_ONOFF
  687.                 RES DEBUGGER.B_ACTIV,(HL)
  688. ; выход из отладчика минуя основное меню NMI
  689. NO_EXIT_DEBUG
  690.         EVOPORT WIN_A0,ROM_RST82
  691.                 LD HL,CPU2+DEBUG_ONOFF
  692.                 LD A,DEBUGGER.M_TRACE
  693.                 AND (HL)
  694.                 RET Z
  695.                 LD HL,TRACER_DBG
  696.                 EX (SP),HL
  697.                 RET
  698.  
  699. ; вход в отладчик минуя основное меню NMI
  700. DBG2MAINMENU    LD HL,CPU2+DEBUG_ONOFF
  701.                 RES DEBUGGER.B_ACTIV,(HL)
  702.         EVOPORT WIN_A0,ROM_RST83
  703.                 LD A,DEBUGGER.M_TRACE
  704.                 AND (HL)
  705.                 JP NZ,CONTMAGIC3
  706.                 JP RESTART_NMI
  707.  
  708. ; возврат из NMI для отладчика. не восстанавливается:
  709. ; палитра, фонт, видеорежим
  710. NMI_EXIT_DBG
  711.         EVOPORT WIN_A0,ROM_RST82
  712. ;       ROMCALL RESTORE_AY,ROM_RST83            ; восстановление регистров AY
  713.                 LD HL,ADR_MAGIC
  714.                 LD (HL),0xC9                    ; заглушка на MAGIC
  715.                 IN A,(PEVO_CONF)
  716.                 OR M_NMI_BF
  717.                 OUT (PEVO_CONF),A
  718.                 AND M_NMI_BF!0xFF
  719.                 OUT (PEVO_CONF),A
  720.                 HALT                            ; ждем срабатывания MAGIC
  721.                 LD HL,ADR_MAGIC
  722.                 LD (HL),0xC3                    ; разрешение обработчика MAGIC перед выходом
  723.                 LD C,LOW (WIN_A0)
  724.                 LD A,(N_7FFD-CPU2)
  725.                 AND 0x10
  726.                 LD HL,B0_CPU0-CPU2
  727.                 JR Z,.L11
  728.                 LD HL,B1_CPU0-CPU2
  729. .L11            LD A,4
  730. .L12            EX AF,AF'
  731.                 LD E,(HL)                       ; байт для записи в порт
  732.                 INC HL
  733.                 LD D,(HL)                       ; старший байт адреса порта
  734.                 INC HL
  735.                 LD A,D
  736.                 OR 0x3F
  737.                 LD B,A
  738.                 BIT 3,D
  739.                 JR NZ,.L15
  740.                 LD A,D
  741.                 AND 3
  742.                 RRCA
  743.                 RRCA
  744.                 OUT (C),A
  745.                 RES 3,B
  746. .L15            OUT (C),E
  747.                 EX AF,AF'
  748.                 DEC A
  749.                 JR NZ,.L12
  750.         PEC_OFF M_SHADOW_BF
  751.                 LD BC,PENT_CONF
  752.                 LD A,(N_EFF7-CPU2)
  753.                 OUT (C),A
  754.         PEC_ON M_SHADOW_BF
  755. ;               LD BC,(B_PORT77-CPU2)
  756. ;               LD A,C
  757. ;               LD C,0x77
  758. ;               OUT (C),A
  759.                 LD A,(N_BF-CPU2)
  760.                 OUT (PEVO_CONF),A
  761.                 LD BC,CONF_128
  762.                 LD A,(N_7FFD-CPU2)
  763.                 OUT (C),A
  764.                 LD HL,NMI_SERVICE
  765.                 LD (ADR_NMI_JUMP),HL
  766.                 XOR A
  767.                 LD (FOR_RET),A
  768.                 LD SP,NADRRET_L-CPU2
  769.                 POP AF                          ; сброс адреса возврата
  770.                 POP AF
  771.                 EX AF,AF'
  772.                 POP IY
  773.                 POP IX
  774.                 POP BC
  775.                 POP DE
  776.                 POP HL
  777.                 EXX
  778.                 POP BC
  779.                 POP DE
  780.                 POP AF
  781.                 JP PO,ENMIDBGSERV1
  782.                 EI
  783. ENMIDBGSERV1    LD A,0x80+3-REG_R_CORRECT
  784.                 LD HL,NREG_R-CPU2
  785.                 SLA (HL)
  786.                 RLA
  787.                 ADD A,(HL)
  788.                 RRCA
  789.                 LD R,A
  790.                 POP AF
  791.                 LD I,A
  792.                 POP AF
  793.                 POP HL
  794.                 LD SP,(NMI_SAVE_SP-CPU2)
  795.                 OUT (0xBE),A
  796.                 RETN
  797.  
  798.         IF 0
  799. TO_USBDRV       EX AF,AF'
  800.                 LD (.L3),A
  801.                 LD A,IYL
  802.                 AND A
  803.                 LD A,(NEXTBYTERST8)
  804.                 JR Z,.L1
  805.                 EX (SP),HL
  806.                 LD A,(HL)
  807.                 INC HL
  808.                 EX (SP),HL
  809. .L1             PUSH BC
  810.                 PUSH AF
  811.                 LD BC,WIN_P0
  812.                 LD A,RAM_SCR_FONT
  813.                 OUT (C),A
  814.                 POP AF
  815.                 POP BC
  816.                 LD (.OLD_SP_USB),SP
  817.                 LD SP,CPU1
  818.                 ADD A,A
  819.                 PUSH HL
  820.                 LD HL,COMUSBF.RET4USBF
  821.                 EX (SP),HL
  822.                 PUSH HL
  823.                 LD HL,COMUSBF.TBLUSBF
  824.                 ADD A,L
  825.                 LD L,A
  826.                 ADC A,H
  827.                 SUB L
  828.                 LD H,A
  829.                 LD A,(HL)
  830.                 INC HL
  831.                 LD H,(HL)
  832.                 LD L,A
  833.                 LD A,0
  834. .L3             EQU $-1
  835.                 EX AF,AF'
  836.                 EX (SP),HL
  837.                 JP COMUSBF.IN_USBF
  838.  
  839. .RET_USBF       LD SP,0
  840. .OLD_SP_USB     EQU $-2
  841.                 RET
  842.         ENDIF
  843.  
  844. ; переменные для USB драйвера
  845. vars
  846. .bFlags         DW 0xFF
  847. .xferLen        DB 0xFF
  848. .data0          DB 0xFF
  849. .data1          DB 0xFF
  850. .cmd            DB 0xFF
  851. .intr           DB 0xFF
  852. .result         DB 0xFF
  853. .remainder      DB 0xFF
  854. .dataX          DB 0xFF
  855. .bufLen         DB 0xFF
  856. .addr           DB 0xFF
  857. .timeout        DB 0xFF
  858.  
  859. .SL_OUT         DB 8 dup (0xFF)
  860. .DBUF           DB 64 dup (0xFF)
  861. .T_OUT          DB 32 dup (0xFF)
  862.  
  863. uDev            pUSBDEV
  864. usbstack        PKG
  865.  
  866. F_INTEXT_DRV    DB 0xFF                         ; флаги при внешних/внутренних вызовах драйверов
  867. TMP_NUMHDD      DB 0xFF
  868. TMP_ADR_0068    DD 0xFFFFFFFF                   ; сохранение под перехватчиком NMI
  869. NUMSEC_LBA48    DQ 0xFFFFFFFFFFFFFFFF           ; номер сектора для чтения/записи
  870. VARS_TXT_DEC    DB "281474976710655\0"          ; число до 48 бит
  871. ADR_SP_COMFAT   DW 0xFF
  872. STEK_PAGES      DB 0x10 DUP 0xFF                ; 10 стек страниц вызывов в ROM
  873. RST_FLAGS       DB 0xFF                         ; 1
  874. TXT_COLOR       DB 0xFF                         ; 1
  875. COORD_XY        DW 0xFF                         ; 2
  876. COLBUF          DB 0x50 DUP 0xFF                ; 50 буфер сохранения строки цвета с экрана
  877. MOUSE_BUFF      DB 0x10 DUP 0xFF                ; 10 буфер сохранения части экрана под курсором мыши
  878. PRESSEDKEY      DW 0xFFFF                       ; 2 адрес списка горячих клавиш после вывода окна
  879. SYSFLAGS        DB 0xFF                         ; 1 системные флаги
  880.  _BITMASK VIDEO_MODE,           7               ; =1-TXT, =0-ZX SCREEN MODE
  881.  _BITMASK FB_INT_EXT,           6               ; =1-внешний вызов FILE BROWSER, =0-внутренний
  882.  _BITMASK NMI_FB_BLOCK,         5               ; =1-запрет запуска File Browser на NMI
  883.  _BITMASK WIN_INT_EXT,          4               ; =1-внешнее окно, =0-внутреннее окно
  884.  _BITMASK RUN_FAT_DSK,          3               ; =1-запуск с FAT, =0-запуск с дискеты
  885.  _BITMASK CLOCK_PRESENT,        2               ; =1-часы найдены, =0-нет
  886.  _BITMASK MOUSE_PRESENT,        1               ; =1-мышь есть, =0-нет
  887.  _BITMASK CURSOR_NUM,           0               ; какой курсор рисовать, для мигания
  888. FATVARSFLAGS    DB 0xFF                         ; флаги для переменных FAT
  889.  _BITMASK TYPE,                 2               ; =1-в работе для внутреннего софта,0-внешнего
  890.  _BITMASK INT,                  1               ; =1-буфера FAT внешнего софта сохранены
  891.  _BITMASK EXT,                  0               ; =1-буфера FAT внутреннего софта сохранены
  892. NEXTBYTERST8    DB 0xFF                         ; 1 следующий байт после вызова RST 8, код для вызова драйвера
  893. OLD_STACK       DW 0xFFFF                       ; 2
  894. FOUND_FAT_FILES DW 0xFFFF                       ; количество найденных файлов
  895. ADR_INT         DW 0xFFFF                       ; 2
  896. ADR_PALITRA     DW 0xFFFF                       ; 2
  897. XNEW            DB 0xFF                         ; 1
  898. ADRSTR_Y        DB 0xFF                         ; 1
  899. ADRSTR_X        DB 0xFF                         ; 1
  900. TXNEW           DB 0xFF                         ; 1
  901. TADRSTR_Y       DB 0xFF                         ; 1
  902. TADRSTR_X       DB 0xFF                         ; 1
  903. NO_INW          DB 0xFF                         ; 1
  904. COLOR4SYM       DB 0xFF                         ; 1
  905. PAGE4READ       DB 0xFF                         ; 1 страница памяти для чтения из внешнего софта
  906. PAGE4SCR        DB 0xFF                         ; 1
  907. DAT_MAIN_MENU   DB 3 DUP 0                      ; 3
  908. DAT_SETUP_MENU  DB 3 DUP 0                      ; 3
  909. DAT_FILEBROWS   DB 5 DUP 0                      ; 5
  910. DAT_MOUNT       DB 3 DUP 0                      ; 3
  911. DAT_LOAD        DB 3 DUP 0                      ; 3
  912. WIN_DEV         DB 0x30 DUP 0                   ; 30
  913. COL_CURSOR      DW 0xFFFF                       ; 2
  914. _MORG           DB 0xFF                         ; 1
  915. ARXY            DW 0xFFFF                       ; 2
  916. ADR_REST        DW 0xFFFF                       ; 2
  917. MOUPOS          DW 0xFFFF                       ; 2
  918. TEK_MODES       DB 0xFF                         ; 1
  919. CMP_FONT_FLAG   DB 0xFF                         ; 1
  920. BUFF4TXT        DB 0x2B DUP 0xFF                ; 2B
  921. EXT4FOUND       DB 0x10*3+1 DUP 0xFF            ; 10*3+1
  922. CMOS4CRC16      DB ECMOS_DEFAULT-CMOS_DEFAULT DUP 0xFF
  923. KSTATE0         DB 0xFF                         ; 1 |
  924. KSTATE1         DB 0                            ; 1 |
  925. KSTATE2         DB 0                            ; 1 |
  926. KSTATE3         DB 0                            ; 1 |
  927. KSTATE4         DB 0xFF                         ; 1 |    аналог
  928. KSTATE5         DB 0                            ; 1 |    BASIC
  929. KSTATE6         DB 0                            ; 1 |    переменных
  930. KSTATE7         DB 0                            ; 1 |    опроса
  931. LAST_K          DB 0                            ; 1 |    клавиатуры
  932. REPDEL          DB 0x10                         ; 1 |
  933. REPPER          DB 1                            ; 1 |
  934. FLAGS_KEY       DB 0                            ; 1 |
  935. FLAGS_KEY1      DB 0x10                         ; 1 |
  936. MOUNT_SYM       DB 0xFF                         ; 1 номер монтирумого диска
  937. EXT_TYPE        DB 0xFF                         ; 1
  938. OST_HWOST       DW 0xFFFF                       ; 2
  939. KUDA_HWOST      DW 0xFFFF                       ; 2
  940. SCROLL_MODE     DB 0xFF                         ; 1
  941. NEXT4PAGE       DW 0xFFFF                       ; 2
  942. OSTAT_SECT      DW 0xFFFF                       ; 2
  943. NACH_SECT       DW 0xFFFF                       ; 2
  944. START_DATA      DW 0xFFFF                       ; 2
  945. ;AY_REGS1       DB 0x0E DUP 0xFF                ; D
  946. ;AY_REGS2       DB 0x0E DUP 0xFF                ; D
  947. TEKBUFTSC       DW 0xFFFF                       ; 2
  948. TEK_TEXT        DW 0xFFFF                       ; 2
  949. TXT_TURBO_MODE  DB 5 DUP 0xFF                   ; 5
  950. TXT_MEMORY_MODE DB 4 DUP 0xFF                   ; 3
  951. ; для резидента HONEY COMANDER
  952. TXT_REZIDENT_MODE       DB 4 DUP 0xFF                   ; 4
  953. TXT_KILLREZID   DB 4 DUP 0xFF                   ; 4
  954. BUFF_TIME       DB 0x16,0x00,0x48,0x17,CYAN<<3+BLUE+0xC0
  955. TXT_TIME        DB "00:00:00",0x16,0x01,0x48
  956. TXT_DATA        DB "00.00.00",0x17,0xFF,0
  957. EBUFF_TIME
  958. TXT_FREQ        DZ "14.0"
  959.                 DZ "7.0 "
  960.                 DZ "3.5 "
  961. NAME_RAMDISK    DB 0x20 DUP 0
  962. FILE_DEST       DB 0x20 DUP 0xFF                ; 20 описатель открытого файла
  963. FB_EXT          DB 0x0B DUP 0xFF                ; B буфер 8.3 для поиска имени
  964. SAVE_IY         DW 0xFFFF                       ; 2 внутренее сохранение регистров для дальнейшего использования
  965. ADR_MASK_EXT    DW 0xFFFF                       ; 2 адрес расширений файлов для поиска
  966. ADR_SKLAD       DW 0xFFFF                       ; 2 адрес складирования найденного
  967. ADR_SKLAD_NAME  DW 0xFFFF                       ; 2
  968. MAKS_ADR        DB 0xFF                         ; 1 старший байт максимального адреса буфера складирования
  969. KOL_FOUNDED     DW 0xFFFF                       ; 2 количество найденных описателей
  970. OUT_NAME_FILE   DB 0x17,0xFF,0x16
  971. OUT_NAME_FILET  DB 0,0,0
  972. BUF_FILEITEM    DB 0x20 DUP 0xFF                ; 20
  973. EXTERN_PAL      DB 0x10 DUP 0xFF                ; 10
  974. ENMI_SERVICE
  975. HDDTIMEOUT      EQU $;EXTERN_PAL+0x10           ; 1
  976.  
  977.         DEPHASE
  978.