Subversion Repositories pentevo

Rev

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

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