Subversion Repositories pentevo

Rev

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

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