Subversion Repositories pentevo

Rev

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

  1.  
  2. ; LAST UPDATE: 24.10.2022 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.                 DUPL ADR_SEL_ROM-$,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.                 DUPL 0x0038-$,0xFF
  29. IM_EI_RET       EI
  30.                 RET
  31.  
  32. VIRT_BITS       DB 0                            ; биты 7-4 примонтированные диски,
  33.                                                 ; биты 3-2 номер реального диска
  34.                                                 ; биты 1-0 номер виртуального диска
  35.  
  36.                 DUPL 0x0066-$,0xFF
  37.                 NOP
  38.                 NOP
  39. ADR_MAGIC       JP NMI_SERVICE
  40. ADR_NMI_JUMP    EQU $-2
  41.  
  42.                 PHASE $+CPU6
  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      DUPL 0x10,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. F_INTEXT_DRV    DB 0xFF                         ; флаги при внешних/внутренних вызовах драйверов
  163. TMP_NUMHDD      DB 0xFF
  164. TMP_ADR_0068    DD 0xFFFFFFFF                   ; сохранение под перехватчиком NMI
  165. NUMSEC_LBA48    DQ 0xFFFFFFFFFFFFFFFF           ; номер сектора для чтения/записи
  166. VARS_TXT_DEC    DB "281474976710655\0"          ; число до 48 бит
  167.  
  168.                 PHASE $ & 0x3FFF
  169.                 DUPL HIGH ($) * 0x100 + 0xFF - $,0xFF
  170.                 DW IM_EI_RET
  171.  
  172.                 DUPL HIGH ($)*0x100+0x80-$,0xFF
  173. STACK_RST
  174.  
  175.                 DUPL (HIGH ($)+1)*0x100-$,0xFF
  176. STACK_NMI
  177.  
  178.                 JP NMI_EXIT_DBG
  179.  
  180. ; вход по RST 8
  181. RAMSEL1        
  182.                 LD (RST8_SAVE_SP-CPU6),SP       ; сохранили старый стек
  183.                 LD SP,RREG_E-CPU6
  184.                 PUSH HL                         ; номер страницы откуда пришли и содержимое порта BF
  185.                 PUSH DE                         ; биты RAMNROM+DOS7FFD
  186.                 EXX
  187.                 PUSH BC                         ; BC'
  188.                 PUSH DE                         ; DE'
  189.                 PUSH HL                         ; HL'
  190.                 EXX
  191.                 PUSH IX                         ; IX
  192.                 PUSH IY                         ; IY
  193.                 EX AF,AF'
  194.                 PUSH AF                         ; AF'
  195.                 LD A,I
  196.                 PUSH AF                         ; IF
  197.  
  198. ; восстанавливаем память под переходом на обработчик NMI
  199.                 LD HL,ADR_MAGIC
  200.                 LD DE,TMP_ADR_0068 - CPU2
  201.                 LDI
  202.                 LDI
  203.                 LDI
  204.  
  205.                 LD HL,OUT_NMI
  206.                 LD (ADR_NMI_JUMP),HL
  207.                 LD A,0xC9
  208.                 LD (FOR_RET),A
  209.                 XOR A
  210.                 LD I,A
  211.                 LD HL,(RST8_SAVE_SP-CPU6)
  212.                 LD DE,RREG_E-CPU6
  213.                 LD BC,RREG_H-RPAGE_CALL
  214.                 LDIR
  215.                 LD HL,R_77-CPU6
  216.                 LD BC,RD_77
  217.                 INIR
  218.                 INI
  219.                 LD BC,FDD_EMU_PORT
  220.                 IN A,(C)
  221.                 LD (B_PORT_VIRT & 0x3FFF),A
  222.                 XOR A
  223.                 OUT (C),A
  224.                 LD HL,(RDOS7FFD-CPU6)
  225.                 LD (R_DOS7FFD-CPU6),HL
  226.                 LD SP,STACK_RST
  227.                 LD A,(R_77-CPU6)
  228.                 AND 7
  229.                 OR 0xA0;8                       ; выключение турбо 14 мгц
  230.                 LD BC,0xFF77
  231.                 OUT (C),A
  232.         PEC_OFF M_SHADOW_BF
  233.                 LD BC,PENT_CONF
  234.                 LD A,(R_EFF7-CPU6)
  235.                 AND %11101111
  236.                 OUT (C),A                       ; включение турбо 7 мгц
  237.         PEC_ON M_SHADOW_BF
  238.                 LD A,(R_7FFD-CPU6)
  239.                 AND 0x10
  240.                 LD HL,R_0WINA0-CPU6
  241.                 JR Z,RAMSEL3
  242.                 LD HL,R_1WINA0-CPU6
  243. RAMSEL3         LD A,(RPAGE_CALL-CPU6)
  244.                 LD (HL),A
  245.         ATMPORT WIN_A3,0x40
  246.                 LD BC,WIN_P6
  247.                 XOR A
  248.                 OUT (C),A
  249.                 LD BC,WIN_A0
  250.                 LD A,ROM_RST83
  251.                 LD HL,CPU6
  252.                 ADD HL,SP
  253.                 LD SP,HL
  254.                 LD HL,CONT_RST8                 ; адрес продолжения обработки RST 8
  255.                 PUSH HL
  256.                 JP ADR_SEL_ROM
  257.  
  258. ; выход из обработчика RST 8
  259. P4_EXIT_RST8
  260. ; сохраняем память под переходом на обработчик NMI
  261.                 LD HL,TMP_ADR_0068 - CPU2
  262.                 LD DE,ADR_MAGIC
  263.                 LDI
  264.                 LDI
  265.                 LDI
  266.  
  267.                 XOR A
  268.                 LD (FOR_RET),A
  269.         PEC_OFF M_SHADOW_BF
  270.                 LD BC,PENT_CONF
  271.                 LD A,(R_EFF7-CPU6)
  272.                 OUT (C),A
  273.         PEC_ON M_SHADOW_BF
  274.                 LD C,LOW (WIN_A5)
  275.                 LD A,(R_7FFD-CPU6)
  276.                 AND 0x10
  277.                 LD HL,B0_CPU1-CPU2
  278.                 JR Z,RENS11
  279.                 LD HL,B1_CPU1-CPU2
  280. RENS11          LD A,3
  281. RENS12          EX AF,AF'
  282.                 LD E,(HL)                       ; байт для записи в порт
  283.                 INC HL
  284.                 LD D,(HL)                       ; старший байт адреса порта
  285.                 INC HL
  286.                 LD A,D
  287.                 OR 7
  288.                 LD B,A
  289.                 OUT (C),E
  290.                 EX AF,AF'
  291.                 DEC A
  292.                 JR NZ,RENS12
  293.         IFDEF DOS_FE
  294.                 LD BC,FDD_EMU_PORT
  295.                 LD A,(B_PORT_VIRT & 0x3FFF)
  296.                 OUT (C),A
  297.         ENDIF
  298.                 LD HL,RST8_SAVE_SP-(RREG_H-RPAGE_CALL)-CPU6
  299.                 LD DE,(RST8_SAVE_SP-CPU6)
  300.                 LD BC,RREG_H-RPAGE_CALL
  301.                 LDIR
  302.                 LD BC,(B_PORT77-CPU6)
  303.                 LD A,C
  304.                 LD C,0x77
  305.                 OUT (C),A
  306.                 LD SP,RREG_FI-CPU6
  307.                 POP AF
  308.                 LD I,A
  309.                 POP AF
  310.                 EX AF,AF'
  311.                 POP IY
  312.                 POP IX
  313.                 POP HL
  314.                 POP DE
  315.                 POP BC
  316.                 EXX
  317.                 POP DE
  318.                 POP HL
  319.                 LD SP,(RST8_SAVE_SP-CPU6)       ; восстановили стек вызвашей программы
  320.                 LD BC,ADR_RST8END               ; адрес возврата
  321.                 PUSH BC
  322.                 LD C,LOW (WIN_A0)
  323.                 LD A,(R_7FFD-CPU6)
  324.                 AND 0x10
  325.                 LD DE,(B0_CPU0-CPU6)
  326.                 JR Z,RENS13
  327.                 LD DE,(B1_CPU0-CPU6)
  328. RENS13          LD A,D
  329.                 OR 7
  330.                 LD B,A
  331.                 LD A,E                          ; страница ROM куда возвращаться
  332.                 JP ADR_SEL_ROM
  333.  
  334. ; вход по NMI
  335. NMI_SERVICE     LD (NMI_SAVE_SP-CPU6),SP        ; сохранение стека
  336.                 LD SP,NMI_SAVE_SP-CPU6          ; новый стек
  337.                 PUSH HL                         ; сохранили HL
  338.                 PUSH AF                         ; сохранили AF
  339.                 LD A,I
  340.                 PUSH AF                         ; сохранили I, флаги и режим прерываний
  341.                 LD A,R
  342.                 PUSH AF                         ; сохранили R
  343.                 PUSH DE                         ; сохранили DE
  344.                 PUSH BC                         ; сохранили BC
  345.                 EXX
  346.                 PUSH HL                         ; сохранили АЛЬТ HL
  347.                 PUSH DE                         ; сохранили АЛЬТ DE
  348.                 PUSH BC                         ; сохранили АЛЬТ BC
  349.                 PUSH IX                         ; сохранили IX
  350.                 PUSH IY                         ; сохранили IY
  351.                 EX AF,AF'
  352.                 PUSH AF                         ; сохранили альт AF
  353.                 LD A,0x80-REG_R_CORRECT
  354.                 LD HL,NREG_R-CPU6
  355.                 SLA (HL)
  356.                 RLA
  357.                 ADD A,(HL)
  358.                 RRCA
  359.                 LD (HL),A                       ; коррекция регистра R
  360. ; сохраняем помять под переходом на обработчик NMI
  361.                 LD HL,ADR_MAGIC
  362.                 LD DE,TMP_ADR_0068 - CPU2
  363.                 LDI
  364.                 LDI
  365.                 LDI
  366.  
  367.                 LD HL,(NMI_SAVE_SP-CPU6)
  368.                 LD E,(HL)
  369.                 INC HL
  370.                 LD D,(HL)
  371.                 LD HL,(NREG_F-CPU6)
  372.                 AND A
  373.                 SBC HL,DE
  374.                 JR NZ,NMISERV005
  375.                 LD HL,(NMI_SAVE_SP-CPU6)
  376.                 INC HL
  377.                 INC HL
  378.                 LD (NMI_SAVE_SP-CPU6),HL
  379.                 LD E,(HL)
  380.                 INC HL
  381.                 LD D,(HL)
  382. NMISERV005      PUSH DE
  383.                 LD SP,STACK_NMI
  384.                 LD HL,OUT_NMI
  385.                 LD (ADR_NMI_JUMP),HL
  386.                 LD A,0xC9
  387.                 LD (FOR_RET),A                  ; RET для переключения страниц ROM/RAM
  388.                 LD HL,N_BF-CPU6                 ; адрес сохранения прочитанных регистров конфигурации
  389.                 IN A,(PEVO_CONF)
  390.                 LD (HL),A
  391.                 INC HL
  392.                 LD BC,RD_77
  393. NMISERV002
  394.                 INIR
  395.                 INI
  396.                 LD BC,FDD_EMU_PORT
  397.                 IN A,(C)
  398.                 LD (B_PORT_VIRT & 0x3FFF),A
  399.                 XOR A
  400.                 OUT (C),A
  401.                 LD B,1                          ; прерывания разрешены
  402.                 LD A,R
  403.                 JP PE,NMISERV001
  404.                 LD A,R
  405.                 JP PE,NMISERV001
  406.                 DEC B                           ; прерывания запрещены
  407. NMISERV001      XOR A
  408.                 LD I,A                          ; обработчик прерывания переставилии для адреса 00FF
  409.                 CALL GET_NUM_IM
  410.         PEC_OFF M_SHADOW_BF
  411.                 LD A,(N_EFF7-CPU2)
  412.                 AND %11101111
  413.                 LD BC,PENT_CONF
  414.                 OUT (C),A
  415.         PEC_ON M_SHADOW_BF
  416.                 LD A,(N_77-CPU2)
  417.                 AND %11110111
  418.                 LD BC,0xFF77
  419.                 OUT (C),A                       ; установка 7.0Mhz для NMI сервиса
  420.  
  421.                 PUSH DE
  422.                 LD BC,WIN_P6
  423.                 XOR A
  424.                 OUT (C),A                       ; включили последнюю страницу озу
  425.                 LD B,HIGH (WIN_A3)
  426.                 LD A,0x40
  427.                 OUT (C),A                       ; сняли зависимость 3 окна от порта 7FFD
  428.                 LD DE,CPU6
  429.                 ADD HL,DE
  430.                 LD (ADR_PALITRA),HL
  431.                 LD HL,CPU6
  432.                 ADD HL,SP
  433.                 LD SP,HL
  434.                 LD B,HIGH (WIN_A0)
  435.                 LD A,ROM_RST83
  436.                 OUT (C),A
  437.                 POP HL
  438.                 LD (NUM_IM),HL
  439. PEREHVAT        DUPL 3,0
  440.                 LD A,(DEBUG_ONOFF)
  441.                 AND A
  442.                 JR NZ,IN_DEBUG
  443.                 LD HL,CONTINUE_MAGIC
  444.                 PUSH HL
  445.                 JP OUT_NMI
  446.  
  447. IN_DEBUG        XOR A
  448.                 IN A,(0xFE)
  449.                 CPL
  450.                 AND 0x1F
  451.                 JR NZ,IN_DEBUG
  452.                 LD B,HIGH (WIN_P0)
  453.                 LD A,RAM_STS
  454.                 OUT (C),A
  455.                 LD HL,DEBUGGER
  456.                 PUSH HL
  457.                 JP OUT_NMI
  458.  
  459. ; выход из NMI
  460. EXITNMISERVICE  LD HL,ADR_MAGIC
  461.                 LD (HL),0xC9                    ; заглушка на MAGIC
  462.                 IN A,(PEVO_CONF)
  463.                 OR M_NMI_BF
  464.                 OUT (PEVO_CONF),A
  465.                 AND M_NMI_BF!0xFF
  466.                 OUT (PEVO_CONF),A
  467.                 HALT                            ; ждем срабатывания MAGIC
  468. FALSE_NMI
  469. ; восстанавливаем память под переходом на обработчик NMI
  470.                 LD HL,TMP_ADR_0068 - CPU2
  471.                 LD DE,ADR_MAGIC
  472.                 LDI
  473.                 LDI
  474.                 LDI
  475.  
  476.                 LD C,LOW (WIN_A0)
  477.                 LD A,(N_7FFD-CPU6)
  478.                 AND 0x10
  479.                 LD HL,B0_CPU0-CPU6
  480.                 JR Z,ENS11
  481.                 LD HL,B1_CPU0-CPU6
  482. ENS11           LD A,4
  483. ENS12           EX AF,AF'
  484.                 LD E,(HL)                       ; байт для записи в порт
  485.                 INC HL
  486.                 LD D,(HL)                       ; старший байт адреса порта
  487.                 INC HL
  488.                 LD A,D
  489.                 OR 0x3F
  490.                 LD B,A
  491.                 BIT 3,D
  492.                 JR NZ,ENS15
  493.                 LD A,D
  494.                 AND 3
  495.                 RRCA
  496.                 RRCA
  497.                 OUT (C),A
  498.                 RES 3,B
  499. ENS15           OUT (C),E
  500.                 EX AF,AF'
  501.                 DEC A
  502.                 JR NZ,ENS12
  503.         IFDEF DOS_FE
  504.                 LD BC,FDD_EMU_PORT
  505.                 LD A,(B_PORT_VIRT & 0x3FFF)
  506.                 OUT (C),A
  507.         ENDIF
  508.         PEC_OFF M_SHADOW_BF
  509.                 LD BC,PENT_CONF
  510.                 LD A,(N_EFF7-CPU6)
  511.                 OUT (C),A
  512.         PEC_ON M_SHADOW_BF
  513.                 LD BC,(B_PORT77-CPU6)
  514.                 LD A,C
  515.                 LD C,0x77
  516.                 OUT (C),A
  517.                 LD A,(N_BF-CPU6)
  518.                 OUT (PEVO_CONF),A
  519.                 LD BC,CONF_128
  520.                 LD A,(N_7FFD-CPU6)
  521.                 OUT (C),A
  522.                 LD HL,NMI_SERVICE
  523.                 LD (ADR_NMI_JUMP),HL
  524.                 XOR A
  525.                 LD (FOR_RET),A
  526.                 LD SP,NADRRET_L-CPU6
  527.                
  528.                 LD HL,(NMI_SAVE_SP-CPU6)
  529.                 POP DE
  530.                 LD (HL),E
  531.                 INC HL
  532.                 LD (HL),D                       ; восстановление адреса возврата
  533.  
  534.                 POP AF
  535.                 EX AF,AF'
  536.                 POP IY
  537.                 POP IX
  538.                 POP BC
  539.                 POP DE
  540.                 POP HL
  541.                 EXX
  542.                 POP BC
  543.                 POP DE
  544.                 POP AF
  545.                 JP PO,ENMISERV1
  546.                 EI
  547. ENMISERV1       LD A,0x80+3-REG_R_CORRECT
  548.                 LD HL,NREG_R-CPU6
  549.                 SLA (HL)
  550.                 RLA
  551.                 ADD A,(HL)
  552.                 RRCA
  553.                 LD R,A
  554.                 POP AF
  555.                 LD I,A
  556.                 POP AF
  557.                 POP HL
  558.                 LD SP,(NMI_SAVE_SP-CPU6)
  559.                 OUT (0xBE),A
  560.                 RETN
  561.  
  562. LDIR__BYTES     LD HL,CPU6
  563.                 ADD HL,SP
  564.                 LD SP,HL
  565.                 LD A,(R_7FFD-CPU6)
  566.                 AND 0x10
  567.                 LD HL,B0_CPU1-CPU2
  568.                 JR Z,LDIR_BYTES5
  569.                 LD HL,B1_CPU1-CPU2
  570. LDIR_BYTES5     LD C,LOW (WIN_A0)
  571.                 LD A,3
  572. LDIR_BYTES3     EX AF,AF'
  573.                 LD E,(HL)                       ; байт для записи в порт
  574.                 INC HL
  575.                 LD D,(HL)                       ; старший байт адреса порта
  576.                 INC HL
  577.                 LD A,D
  578.                 OR 0x3F
  579.                 LD B,A
  580.                 BIT 3,D
  581.                 JR NZ,LDIR_BYTES4
  582.                 LD A,D
  583.                 AND 3
  584.                 RRCA
  585.                 RRCA
  586.                 OUT (C),A
  587.                 RES 3,B
  588. LDIR_BYTES4     OUT (C),E
  589.                 EX AF,AF'
  590.                 DEC A
  591.                 JR NZ,LDIR_BYTES3
  592.                 EXX
  593.                 LDIR
  594.                 LD BC,WIN_P6
  595.                 XOR A
  596.                 OUT (C),A
  597.                 LD HL,CPU6
  598.                 ADD HL,SP
  599.                 LD SP,HL
  600.                 LD BC,WIN_A0
  601.                 LD A,ROM_RST83
  602.                 JP ADR_SEL_ROM
  603.  
  604. NUM_IM2         LD A,1
  605.                 RET
  606.  
  607. GET_NUM_IM      PUSH HL
  608.                 LD D,B                          ; INT ON/OFF
  609.                 LD HL,0x0038
  610.                 LD (HL),0xAF
  611.                 LD L,0xFF
  612.                 LD (HL),LOW (NUM_IM2)
  613.                 INC HL
  614.                 LD (HL),HIGH (NUM_IM2)
  615.                 EI
  616.                 HALT
  617.                 DI
  618.                 LD E,A                          ; 0-IM 1, 1-IM 2
  619.                 LD HL,0x0038
  620.                 LD (HL),0xFB
  621.                 LD L,0xFF
  622.                 LD (HL),LOW (IM_EI_RET)
  623.                 INC HL
  624.                 LD (HL),HIGH (IM_EI_RET)
  625.                 POP HL
  626.                 RET
  627.  
  628.                 PHASE $+CPU6
  629. ; вызов подпрограмм из других страниц ROM
  630. CALL2PAGE       EX (SP),HL
  631.                 PUSH BC
  632.                 PUSH AF
  633.                 LD BC,WIN_A0
  634. .L1             LD (PORTCALL),BC
  635.                 LD C,(HL)
  636.                 INC HL
  637.                 LD B,(HL)
  638.                 INC HL
  639.                 LD (ADRCALL),BC
  640.                 LD BC,RD_7FFD
  641.                 IN A,(C)
  642.                 AND 0x10
  643.                 LD BC,RD_0WINA0
  644.                 JR Z,CALL2PAGE1
  645.                 LD BC,RD_1WINA0
  646. CALL2PAGE1      IN A,(C)
  647.                 AND 0x3F
  648.                 LD BC,STEK_PAGES
  649. TEKPAGE         EQU $-2
  650.                 LD (BC),A
  651.                 INC BC
  652.                 LD (TEKPAGE),BC
  653.                 LD A,(HL)
  654.                 INC HL
  655.                 LD BC,WIN_A0
  656. PORTCALL        EQU $-2
  657.                 OUT (C),A
  658.                 POP AF
  659.                 POP BC
  660.                 EX (SP),HL
  661.                 CALL 0
  662. ADRCALL         EQU $-2
  663.                 PUSH BC
  664.                 PUSH AF
  665.                 LD BC,(TEKPAGE)
  666.                 DEC BC
  667.                 LD A,(BC)
  668.                 LD (TEKPAGE),BC
  669.                 LD BC,WIN_A0
  670.                 OUT (C),A
  671.                 POP AF
  672.                 POP BC
  673.                 RET
  674.  
  675. CALL2RAMPAGE    EX (SP),HL
  676.                 PUSH BC
  677.                 PUSH AF
  678.                 LD BC,WIN_P0
  679.                 JR CALL2PAGE.L1
  680.  
  681. ; вход в отладчик
  682. DEBUGGER        DI
  683.                 LD HL,CPU6+DEBUG_ONOFF
  684.                 BIT B_DBG_ACTIV,(HL)
  685.                 JR Z,DEBUGGER1
  686. ; принудительный вход в отладчик с возвратом в основное меню NMI
  687.                 LD HL,DBG2MAINMENU
  688.                 PUSH HL
  689.                 JR DEBUGGER2
  690.  
  691. ; вход в отладчик из основного меню NMI
  692. DEBUGGER1       LD HL,RESTART_MAIN
  693.                 PUSH HL
  694.                 LD HL,EXIT_DEBUG
  695.                 PUSH HL
  696.                 LD HL,CPU6+DEBUG_ONOFF
  697.                 SET B_DBG_ACTIV,(HL)
  698. DEBUGGER2       LD HL,CONTINUE_PROG
  699.                 LD DE,NADRRET_L
  700.         EVOPORT WIN_P3,RAM_STS                  ; включили страницу с установленным STS
  701.                 LD BC,N_BF
  702.                 LD A,(N_77)
  703.                 EX AF,AF'
  704.                 LD A,NO_EXIT_DEBUG-EXIT_DEBUG
  705.                 JP START_STS
  706.  
  707. ; нормальный выход из отладчика
  708. EXIT_DEBUG      LD HL,CPU6+DEBUG_ONOFF
  709.                 RES B_DBG_ACTIV,(HL)
  710. ; выход из отладчика минуя основное меню NMI
  711. NO_EXIT_DEBUG
  712.         EVOPORT WIN_A0,ROM_RST82
  713.                 LD HL,CPU6+DEBUG_ONOFF
  714.                 LD A,M_TRACE_DBG
  715.                 AND (HL)
  716.                 RET Z
  717.                 LD HL,TRACER_DBG
  718.                 EX (SP),HL
  719.                 RET
  720.  
  721. ; вход в отладчик минуя основное меню NMI
  722. DBG2MAINMENU    LD HL,CPU6+DEBUG_ONOFF
  723.                 RES B_DBG_ACTIV,(HL)
  724.         EVOPORT WIN_A0,ROM_RST83
  725.                 LD A,M_TRACE_DBG
  726.                 AND (HL)
  727.                 JP NZ,CONTMAGIC3
  728.                 JP RESTART_NMI
  729.  
  730. ; возврат из NMI для отладчика. не восстанавливается:
  731. ; палитра, фонт, видеорежим
  732. NMI_EXIT_DBG
  733.         EVOPORT WIN_A0,ROM_RST82
  734.         ROMCALL RESTORE_AY,ROM_RST83            ; восстановление рагистров AY
  735.                 LD HL,ADR_MAGIC
  736.                 LD (HL),0xC9                    ; заглушка на MAGIC
  737.                 IN A,(PEVO_CONF)
  738.                 OR M_NMI_BF
  739.                 OUT (PEVO_CONF),A
  740.                 AND M_NMI_BF!0xFF
  741.                 OUT (PEVO_CONF),A
  742.                 HALT                            ; ждем срабатывания MAGIC
  743.                 LD HL,ADR_MAGIC
  744.                 LD (HL),0xC3                    ; разрешение обработчика MAGIC перед выходом
  745.                 LD C,LOW (WIN_A0)
  746.                 LD A,(N_7FFD-CPU6)
  747.                 AND 0x10
  748.                 LD HL,B0_CPU0-CPU6
  749.                 JR Z,ENSDBG11
  750.                 LD HL,B1_CPU0-CPU6
  751. ENSDBG11        LD A,4
  752. ENSDBG12        EX AF,AF'
  753.                 LD E,(HL)                       ; байт для записи в порт
  754.                 INC HL
  755.                 LD D,(HL)                       ; старший байт адреса порта
  756.                 INC HL
  757.                 LD A,D
  758.                 OR 0x3F
  759.                 LD B,A
  760.                 BIT 3,D
  761.                 JR NZ,ENSDBG15
  762.                 LD A,D
  763.                 AND 3
  764.                 RRCA
  765.                 RRCA
  766.                 OUT (C),A
  767.                 RES 3,B
  768. ENSDBG15        OUT (C),E
  769.                 EX AF,AF'
  770.                 DEC A
  771.                 JR NZ,ENSDBG12
  772.         PEC_OFF M_SHADOW_BF
  773.                 LD BC,PENT_CONF
  774.                 LD A,(N_EFF7-CPU6)
  775.                 OUT (C),A
  776.         PEC_ON M_SHADOW_BF
  777. ;               LD BC,(B_PORT77-CPU6)
  778. ;               LD A,C
  779. ;               LD C,0x77
  780. ;               OUT (C),A
  781.                 LD A,(N_BF-CPU6)
  782.                 OUT (PEVO_CONF),A
  783.                 LD BC,CONF_128
  784.                 LD A,(N_7FFD-CPU6)
  785.                 OUT (C),A
  786.                 LD HL,NMI_SERVICE
  787.                 LD (ADR_NMI_JUMP),HL
  788.                 XOR A
  789.                 LD (FOR_RET),A
  790.                 LD SP,NADRRET_L-CPU6
  791.                 POP AF                          ; сброс адреса возврата
  792.                 POP AF
  793.                 EX AF,AF'
  794.                 POP IY
  795.                 POP IX
  796.                 POP BC
  797.                 POP DE
  798.                 POP HL
  799.                 EXX
  800.                 POP BC
  801.                 POP DE
  802.                 POP AF
  803.                 JP PO,ENMIDBGSERV1
  804.                 EI
  805. ENMIDBGSERV1    LD A,0x80+3-REG_R_CORRECT
  806.                 LD HL,NREG_R-CPU6
  807.                 SLA (HL)
  808.                 RLA
  809.                 ADD A,(HL)
  810.                 RRCA
  811.                 LD R,A
  812.                 POP AF
  813.                 LD I,A
  814.                 POP AF
  815.                 POP HL
  816.                 LD SP,(NMI_SAVE_SP-CPU6)
  817.                 OUT (0xBE),A
  818.                 RETN
  819.  
  820. SET_CPU3        PUSH BC
  821.                 LD BC,WIN_A3
  822.                 EX AF,AF'
  823.                 LD A,0x40
  824.                 OUT (C),A
  825.                 EX AF,AF'
  826.                 LD B,HIGH (WIN_P3)
  827.                 OUT (C),A
  828.                 POP BC
  829.                 RET
  830.  
  831.         IF 0
  832. TO_USBDRV       EX AF,AF'
  833.                 LD (.L3),A
  834.                 LD A,IYL
  835.                 AND A
  836.                 LD A,(NEXTBYTERST8)
  837.                 JR Z,.L1
  838.                 EX (SP),HL
  839.                 LD A,(HL)
  840.                 INC HL
  841.                 EX (SP),HL
  842. .L1             PUSH BC
  843.                 PUSH AF
  844.                 LD BC,WIN_P0
  845.                 LD A,RAM_SCR_FONT
  846.                 OUT (C),A
  847.                 POP AF
  848.                 POP BC
  849.                 LD (.OLD_SP_USB),SP
  850.                 LD SP,CPU1
  851.                 ADD A,A
  852.                 PUSH HL
  853.                 LD HL,COMUSBF.RET4USBF
  854.                 EX (SP),HL
  855.                 PUSH HL
  856.                 LD HL,COMUSBF.TBLUSBF
  857.                 ADD A,L
  858.                 LD L,A
  859.                 ADC A,H
  860.                 SUB L
  861.                 LD H,A
  862.                 LD A,(HL)
  863.                 INC HL
  864.                 LD H,(HL)
  865.                 LD L,A
  866.                 LD A,0
  867. .L3             EQU $-1
  868.                 EX AF,AF'
  869.                 EX (SP),HL
  870.                 JP COMUSBF.IN_USBF
  871.  
  872. .RET_USBF       LD SP,0
  873. .OLD_SP_USB     EQU $-2
  874.                 RET
  875.         ENDIF
  876.  
  877. ; переменные для USB драйвера
  878. vars
  879. .bFlags         DW 0xFF
  880. .xferLen        DB 0xFF
  881. .data0          DB 0xFF
  882. .data1          DB 0xFF
  883. .cmd            DB 0xFF
  884. .intr           DB 0xFF
  885. .result         DB 0xFF
  886. .remainder      DB 0xFF
  887. .dataX          DB 0xFF
  888. .bufLen         DB 0xFF
  889. .addr           DB 0xFF
  890. .timeout        DB 0xFF
  891.  
  892. .SL_OUT         DB 0xFF dup (8)
  893. .DBUF           DB 0xFF dup (64)
  894. .T_OUT          DB 0xFF dup (32)
  895.  
  896. uDev            pUSBDEV
  897. usbstack        PKG
  898.  
  899. STEK_PAGES      DUPL 0x10,0xFF                  ; 10 стек страниц вызывов в ROM
  900. RST_FLAGS       DB 0xFF                         ; 1
  901. TXT_COLOR       DB 0xFF                         ; 1
  902. COORD_XY        DW 0xFF                         ; 2
  903. COLBUF          DUPL 0x50,0xFF                  ; 50 буфер сохранения строки цвета с экрана
  904. MOUSE_BUFF      DUPL 0x10,0xFF                  ; 10 буфер сохранения части экрана под курсором мыши
  905. PRESSEDKEY      DW 0xFFFF                       ; 2 адрес списка горячих клавиш после вывода окна
  906. FLAGS           DB 0xFF                         ; 1 системные флаги
  907.  BITMASK VIDEO_MODE,    7                       ; BIT 7-=1-TXT, =0-ZX SCREEN MODE
  908.                                                 ; BIT 6
  909.                                                 ; BIT 5
  910.  BITMASK WIN_INT_EXT,   4                       ; BIT 4-=1-внешнее окно, =0-внутреннее окно
  911.  BITMASK RUN_FAT_DSK,   3                       ; BIT 3-=1-запуск с FAT, =0-запуск с дискеты
  912.  BITMASK CLOCK_PRESENT, 2                       ; BIT 2-=1-часы найдены, =0-нет
  913.  BITMASK MOUSE_PRESENT, 1                       ; BIT 1-=1-мышь есть, =0-нет
  914.  BITMASK CURSOR_NUM,    0                       ; BIT 0-какой курсор рисовать, для мигания
  915. NEXTBYTERST8    DB 0xFF                         ; 1 следующий байт после вызова RST 8, код для вызова драйвера
  916. OLD_STACK       DW 0xFFFF                       ; 2
  917. ADR_INT         DW 0xFFFF                       ; 2
  918. ADR_PALITRA     DW 0xFFFF                       ; 2
  919. XNEW            DB 0xFF                         ; 1
  920. ADRSTR_Y        DB 0xFF                         ; 1
  921. ADRSTR_X        DB 0xFF                         ; 1
  922. TXNEW           DB 0xFF                         ; 1
  923. TADRSTR_Y       DB 0xFF                         ; 1
  924. TADRSTR_X       DB 0xFF                         ; 1
  925. NO_INW          DB 0xFF                         ; 1
  926. COLOR4SYM       DB 0xFF                         ; 1
  927. PAGE4READ       DB 0xFF                         ; 1
  928. PAGE4SCR        DB 0xFF                         ; 1
  929. DAT_MAIN_MENU   DUPL 3,0                        ; 3
  930. DAT_SETUP_MENU  DUPL 3,0                        ; 3
  931. DAT_FILEBROWS   DUPL 5,0                        ; 5
  932. DAT_MOUNT       DUPL 3,0                        ; 3
  933. WIN_DEV         DUPL 0x30,0                     ; 30
  934. COL_CURSOR      DW 0xFFFF                       ; 2
  935. _MORG           DB 0xFF                         ; 1
  936. ARXY            DW 0xFFFF                       ; 2
  937. ADR_REST        DW 0xFFFF                       ; 2
  938. MOUPOS          DW 0xFFFF                       ; 2
  939. TEK_MODES       DB 0xFF                         ; 1
  940. CMP_FONT_FLAG   DB 0xFF                         ; 1
  941. BUFF4TXT        DUPL 0x2B,0xFF                  ; 2B
  942. EXT4FOUND       DUPL 0x10*3+1,0xFF              ; 10*3+1
  943. CMOS4CRC16      DUPL ECMOS_DEFAULT-CMOS_DEFAULT,0xFF
  944. KSTATE0         DB 0xFF                         ; 1 |
  945. KSTATE1         DB 0                            ; 1 |
  946. KSTATE2         DB 0                            ; 1 |
  947. KSTATE3         DB 0                            ; 1 |
  948. KSTATE4         DB 0xFF                         ; 1 |    аналог
  949. KSTATE5         DB 0                            ; 1 |    BASIC
  950. KSTATE6         DB 0                            ; 1 |    переменных
  951. KSTATE7         DB 0                            ; 1 |    опроса
  952. LAST_K          DB 0                            ; 1 |    клавиатуры
  953. REPDEL          DB 0x10                         ; 1 |
  954. REPPER          DB 1                            ; 1 |
  955. FLAGS_KEY       DB 0                            ; 1 |
  956. FLAGS_KEY1      DB 0x10                         ; 1 |
  957. MOUNT_SYM       DB 0xFF                         ; 1 номер монтирумого диска
  958. EXT_TYPE        DB 0xFF                         ; 1
  959. OST_HWOST       DW 0xFFFF                       ; 2
  960. KUDA_HWOST      DW 0xFFFF                       ; 2
  961. SCROLL_MODE     DB 0xFF                         ; 1
  962. NEXT4PAGE       DW 0xFFFF                       ; 2
  963. OSTAT_SECT      DW 0xFFFF                       ; 2
  964. NACH_SECT       DW 0xFFFF                       ; 2
  965. START_DATA      DW 0xFFFF                       ; 2
  966. AY_REGS         DUPL 0x0E,0xFF                  ; D
  967. TEKBUFTSC       DW 0xFFFF                       ; 2
  968. TEK_TEXT        DW 0xFFFF                       ; 2
  969. TURBO_MODE      DUPL 5,0xFF                     ; 5
  970. MEMORY_MODE     DUPL 4,0xFF                     ; 3
  971. ; для резидента HONEY COMANDER
  972.         IFDEF REZIDENT
  973. REZIDENT_MODE   DUPL 4,0xFF                     ; 4
  974. TXT_KILLREZID   DUPL 4,0xFF                     ; 4
  975.         ENDIF;REZIDENT
  976. BUFF_TIME       DB 0x16,0x00,0x48,0x17,CYAN<<3+BLUE+0xC0
  977. TXT_TIME        DB "00:00:00",0x16,0x01,0x48
  978. TXT_DATA        DB "00.00.00",0x17,0xFF,0
  979. EBUFF_TIME
  980. NAME_RAMDISK    DUPL 0x20,0
  981. FILE_DEST       DUPL 0x20,0xFF                  ; 20 описатель открытого файла (куда)
  982. FB_EXT          DUPL 0x0B,0xFF                  ; B буфер 8.3 для поиска имени
  983. SAVE_IY         DW 0xFFFF                       ; 2 внутренее сохранение регистров для дальнейшего использования
  984. ADR_MASK_EXT    DW 0xFFFF                       ; 2 адрес расширений файлов для поиска
  985. ADR_SKLAD       DW 0xFFFF                       ; 2 адрес складирования найденного
  986. ADR_SKLAD_NAME  DW 0xFFFF                       ; 2
  987. MAKS_ADR        DB 0xFF                         ; 1 старший байт максимального адреса буфера складирования
  988. KOL_FOUNDED     DW 0xFFFF                       ; 2 количество найденных описателей
  989. OUT_NAME_FILE   DB 0x17,0xFF,0x16,0,0,0
  990. OUT_NAME_FILET  EQU $-3
  991. BUF_FILEITEM    DUPL 0x20,0xFF                  ; 20
  992. EXTERN_PAL      DUPL 0x10,0xFF                  ; 10
  993. ENMI_SERVICE
  994. HDDTIMEOUT      EQU EXTERN_PAL+0x10             ; 1
  995.  
  996.                 DEPHASE
  997.