Subversion Repositories pentevo

Rev

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

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