;LAST UPDATE: 20.08.2019 savelij
 
 
 
;последовательность для RST 8
 
;старый стек    HL AF BC RF ADR_RET DE  ->
 
;-> новый стек  HL(номер паги и порт BF) DE(RAMNROM И DOS7FFD) BC' DE' HL' IX IY AF' ->
 
;-> чтение конфига
 
 
 
REG_R_CORRECT   EQU 0X0D
 
 
 
CODE_NMIRST
 
                PHASE 0
 
 
 
                JP CALL2PAGE                    ;вызов кода в другой странице ROM
 
 
 
                JP CALL2RAMPAGE                 ;вызов кода в другой странице RAM
 
 
 
                DUPL ADR_SEL_ROM-$,0
 
                OUT (C),A                       ;переключение страниц для переходов
 
                NOP
 
FOR_RET         NOP
 
                JP RAMSEL1
 
 
 
OUT_NMI         OUT (0XBE),A
 
                RETN
 
 
 
                DUPL 0X0038-$,0XFF
 
IM_EI_RET       EI
 
                RET
 
 
 
VIRT_BITS       DB 0                            ;1 биты 7-4 примонтированные диски,
 
                                                ;  биты 3-2 номер реального диска
 
                                                ;  биты 1-0 номер виртуального диска
 
 
 
                DUPL 0X0066-$,0XFF
 
                NOP
 
                NOP
 
ADR_MAGIC       JP NMI_SERVICE
 
ADR_NMI_JUMP    EQU $-2
 
 
 
                PHASE $+CPU6
 
;считанная конфигурация портов для RST 8
 
R_BF            DB 0XFF
 
R_77            DB 0XFF
 
R_EFF7          DB 0XFF
 
R_7FFD          DB 0XFF
 
R_DOS7FFD       DB 0XFF
 
R_RAMNROM       DB 0XFF
 
R_1WINA3        DB 0XFF
 
R_1WINA2        DB 0XFF
 
R_1WINA1        DB 0XFF
 
R_1WINA0        DB 0XFF
 
R_0WINA3        DB 0XFF
 
R_0WINA2        DB 0XFF
 
R_0WINA1        DB 0XFF
 
R_0WINA0        DB 0XFF
 
 
 
;считанная конфигурация портов для NMI
 
N_BF            DB 0XFF
 
N_77            DB 0XFF
 
N_EFF7          DB 0XFF
 
N_7FFD          DB 0XFF
 
N_DOS7FFD       DB 0XFF
 
N_RAMNROM       DB 0XFF
 
N_1WINA3        DB 0XFF
 
N_1WINA2        DB 0XFF
 
N_1WINA1        DB 0XFF
 
N_1WINA0        DB 0XFF
 
N_0WINA3        DB 0XFF
 
N_0WINA2        DB 0XFF
 
N_0WINA1        DB 0XFF
 
N_0WINA0        DB 0XFF
 
N_TEK_PALS      DUPL 0X10,0XFF
 
 
 
;сохраненные регистры при вызове RST 8
 
RREG_FI         DB 0XFF
 
RREG_I          DB 0XFF                         ;IF
 
RREG_FF         DB 0XFF
 
RREG_AA         DB 0XFF                         ;AF'
 
RREG_IYL        DB 0XFF
 
RREG_IYH        DB 0XFF                         ;IY
 
RREG_IXL        DB 0XFF
 
RREG_IXH        DB 0XFF                         ;IX
 
RREG_LL         DB 0XFF
 
RREG_HH         DB 0XFF                         ;HL'
 
RREG_EE         DB 0XFF
 
RREG_DD         DB 0XFF                         ;DE'
 
RREG_CC         DB 0XFF
 
RREG_BB         DB 0XFF                         ;BC'
 
RDOS7FFD        DB 0XFF                         ;биты DOS7FFD перед вызовом
 
RRAMNROM        DB 0XFF                         ;биты RAMNROM перед вызовом
 
RPBF_CALL       DB 0XFF                         ;содержимое порта BF перед вызовом
 
RPAGE_CALL      DB 0XFF                         ;номер страницы откуда пришли
 
RREG_E          DB 0XFF
 
RREG_D          DB 0XFF                         ;DE
 
RADRRET_L       DB 0XFF
 
RADRRET_H       DB 0XFF                         ;ADR_RET
 
REI_DI          DB 0XFF
 
R_R             DB 0XFF                         ;RF
 
RREG_C          DB 0XFF
 
RREG_B          DB 0XFF                         ;BC
 
RREG_F          DB 0XFF
 
RREG_A          DB 0XFF                         ;AF
 
RREG_L          DB 0XFF
 
RREG_H          DB 0XFF                         ;HL
 
RST8_SAVE_SP    DW 0XFF
 
 
 
;сохраненные регистры при вызове NMI
 
;ADR_RET AF' IY IX BC' DE' HL' BC DE RF IF AF HL
 
NADRRET_L       DB 0XFF                         ;ADR RET
 
NADRRET_H       DB 0XFF
 
NREG_FF         DB 0XFF                         ;AF'
 
NREG_AA         DB 0XFF
 
NREG_IYL        DB 0XFF                         ;IY
 
NREG_IYH        DB 0XFF
 
NREG_IXL        DB 0XFF                         ;IX
 
NREG_IXH        DB 0XFF
 
NREG_CC         DB 0XFF                         ;BC'
 
NREG_BB         DB 0XFF                 
 
NREG_EE         DB 0XFF                         ;DE'
 
NREG_DD         DB 0XFF
 
NREG_LL         DB 0XFF                         ;HL'
 
NREG_HH         DB 0XFF
 
NREG_C          DB 0XFF                         ;BC
 
NREG_B          DB 0XFF
 
NREG_E          DB 0XFF                         ;DE
 
NREG_D          DB 0XFF
 
NREG_EI_DI_2    DB 0XFF                         ;RF
 
NREG_R          DB 0XFF
 
NREG_EI_DI_1    DB 0XFF                         ;IF
 
NREG_I          DB 0XFF
 
NREG_F          DB 0XFF                         ;AF
 
NREG_A          DB 0XFF
 
NREG_L          DB 0XFF                         ;HL
 
NREG_H          DB 0XFF
 
NMI_SAVE_SP     DW 0XFF                         ;адрес сохранения стека программы прерванной по NMI
 
NUM_IM          DB 0XFF                         ;режим прерываний: 0-IM 1, 1-IM 2
 
INT_MODE        DB 0XFF                         ;прерывания 0-запрешены, 1-разрешены
 
INTERNAL_SP     DW 0XFF                         ;адрес хранения стека при работе сервисов
 
 
 
B0_CPU0         DB 0XFF                         ;байт для порта 0 окна 0 мапера
 
P0_CPU0         DB 0XFF                         ;старший байт адреса порта порта для 0 окна 0 мапера
 
B0_CPU1         DB 0XFF                         ;байт для порта 1 окна 0 мапера
 
P0_CPU1         DB 0XFF                         ;старший байт адреса порта порта для 1 окна 0 мапера
 
B0_CPU2         DB 0XFF                         ;байт для порта 2 окна 0 мапера
 
P0_CPU2         DB 0XFF                         ;старший байт адреса порта порта для 2 окна 0 мапера
 
B0_CPU3         DB 0XFF                         ;байт для порта 3 окна 0 мапера
 
P0_CPU3         DB 0XFF                         ;старший байт адреса порта порта для 3 окна 0 мапера
 
B1_CPU0         DB 0XFF                         ;байт для порта 0 окна 0 мапера
 
P1_CPU0         DB 0XFF                         ;старший байт адреса порта порта для 0 окна 0 мапера
 
B1_CPU1         DB 0XFF                         ;байт для порта 1 окна 0 мапера
 
P1_CPU1         DB 0XFF                         ;старший байт адреса порта порта для 1 окна 0 мапера
 
B1_CPU2         DB 0XFF                         ;байт для порта 2 окна 0 мапера
 
P1_CPU2         DB 0XFF                         ;старший байт адреса порта порта для 2 окна 0 мапера
 
B1_CPU3         DB 0XFF                         ;байт для порта 3 окна 0 мапера
 
P1_CPU3         DB 0XFF                         ;старший байт адреса порта порта для 3 окна 0 мапера
 
B_PORT77        DB 0XFF                         ;байт для вывода в порт ХХ77
 
P_PORT77        DB 0XFF                         ;старший байт адреса порта ХХ77
 
 
 
F_INTEXT_DRV    DB 0XFF                         ;флаги при внешних/внутренних вызовах драйверов
 
NUMHDD          DB 0XFF
 
VARS_TXT_DEC    DB "4294967295\0"
 
 
 
                PHASE $ & 0x3FFF
 
                DUPL HIGH ($)*0X100+0XFF-$,0XFF
 
                DW IM_EI_RET
 
 
 
                DUPL HIGH ($)*0X100+0X80-$,0XFF
 
STACK_RST
 
 
 
                DUPL (HIGH ($)+1)*0X100-$,0XFF
 
STACK_NMI
 
 
 
                JP NMI_EXIT_DBG
 
 
 
RAMSEL1         
 
                LD (RST8_SAVE_SP-CPU6),SP       ;сохранили старый стек
 
                LD SP,RREG_E-CPU6
 
                PUSH HL                         ;номер страницы откуда пришли и содержимое порта BF
 
                PUSH DE                         ;биты RAMNROM+DOS7FFD
 
                EXX
 
                PUSH BC                         ;BC'
 
                PUSH DE                         ;DE'
 
                PUSH HL                         ;HL'
 
                EXX
 
                PUSH IX                         ;IX
 
                PUSH IY                         ;IY
 
                EX AF,AF'
 
                PUSH AF                         ;AF'
 
                LD A,I
 
                PUSH AF                         ;IF
 
                LD HL,OUT_NMI
 
                LD (ADR_NMI_JUMP),HL
 
                LD A,0XC9
 
                LD (FOR_RET),A
 
                XOR A
 
                LD I,A
 
                LD HL,(RST8_SAVE_SP-CPU6)
 
                LD DE,RREG_E-CPU6
 
                LD BC,RREG_H-RPAGE_CALL
 
                LDIR
 
                LD HL,R_77-CPU6
 
                LD BC,RD_77
 
                INIR
 
                INI
 
                LD HL,(RDOS7FFD-CPU6)
 
                LD (R_DOS7FFD-CPU6),HL
 
                LD SP,STACK_RST
 
                LD A,(R_77-CPU6)
 
                AND 7
 
                OR 0XA0;8                       ;выключение турбо 14 мгц
 
                LD BC,0XFF77
 
                OUT (C),A
 
                PEC_OFF M_SHADOW_BF
 
                LD BC,PENT_CONF
 
                LD A,(R_EFF7-CPU6)
 
                AND %11101111
 
                OUT (C),A                       ;включение турбо 7 мгц
 
                PEC_ON M_SHADOW_BF
 
                LD A,(R_7FFD-CPU6)
 
                AND 0X10
 
                LD HL,R_0WINA0-CPU6
 
                JR Z,RAMSEL3
 
                LD HL,R_1WINA0-CPU6
 
RAMSEL3         LD A,(RPAGE_CALL-CPU6)
 
                LD (HL),A
 
                ATMPORT WIN_A3,0X40
 
                LD BC,WIN_P6
 
                XOR A
 
                OUT (C),A
 
                LD BC,WIN_A0
 
                LD A,ROM_RST83
 
                LD HL,CPU6
 
                ADD HL,SP
 
                LD SP,HL
 
                LD HL,CONT_RST8                 ;адрес продолжения обработки RST 8
 
                PUSH HL
 
                JP ADR_SEL_ROM
 
 
 
P4_EXIT_RST8    LD HL,NMI_SERVICE
 
                LD (ADR_NMI_JUMP),HL
 
                XOR A
 
                LD (FOR_RET),A
 
                PEC_OFF M_SHADOW_BF
 
                LD BC,PENT_CONF
 
                LD A,(R_EFF7-CPU6)
 
                OUT (C),A
 
                PEC_ON M_SHADOW_BF
 
                LD C,LOW (WIN_A5)
 
                LD A,(R_7FFD-CPU6)
 
                AND 0X10
 
                LD HL,B0_CPU1-CPU2
 
                JR Z,RENS11
 
                LD HL,B1_CPU1-CPU2
 
RENS11          LD A,3
 
RENS12          EX AF,AF'
 
                LD E,(HL)                       ;байт для записи в порт
 
                INC HL
 
                LD D,(HL)                       ;старший байт адреса порта
 
                INC HL
 
                LD A,D
 
                OR 7
 
                LD B,A
 
                OUT (C),E
 
                EX AF,AF'
 
                DEC A
 
                JR NZ,RENS12
 
                LD HL,RST8_SAVE_SP-(RREG_H-RPAGE_CALL)-CPU6
 
                LD DE,(RST8_SAVE_SP-CPU6)
 
                LD BC,RREG_H-RPAGE_CALL
 
                LDIR
 
                LD BC,(B_PORT77-CPU6)
 
                LD A,C
 
                LD C,0X77
 
                OUT (C),A
 
                LD SP,RREG_FI-CPU6
 
                POP AF
 
                LD I,A
 
                POP AF
 
                EX AF,AF'
 
                POP IY
 
                POP IX
 
                POP HL
 
                POP DE
 
                POP BC
 
                EXX
 
                POP DE
 
                POP HL
 
                LD SP,(RST8_SAVE_SP-CPU6)       ;восстановили стек вызвашей программы
 
                LD BC,ADR_RST8END               ;адрес возврата
 
                PUSH BC
 
                LD C,LOW (WIN_A0)
 
                LD A,(R_7FFD-CPU6)
 
                AND 0X10
 
                LD DE,(B0_CPU0-CPU6)
 
                JR Z,RENS13
 
                LD DE,(B1_CPU0-CPU6)
 
RENS13          LD A,D
 
                OR 7
 
                LD B,A
 
                LD A,E                          ;страница ROM куда возвращаться
 
                JP ADR_SEL_ROM
 
 
 
NMI_SERVICE     LD (NMI_SAVE_SP-CPU6),SP        ;сохранение стека
 
                LD SP,NMI_SAVE_SP-CPU6          ;новый стек
 
                PUSH HL                         ;сохранили HL
 
                PUSH AF                         ;сохранили AF
 
                LD A,I
 
                PUSH AF                         ;сохранили I, флаги и режим прерываний 
 
                LD A,R
 
                PUSH AF                         ;сохранили R
 
                PUSH DE                         ;сохранили DE
 
                PUSH BC                         ;сохранили BC
 
                EXX
 
                PUSH HL                         ;сохранили АЛЬТ HL
 
                PUSH DE                         ;сохранили АЛЬТ DE
 
                PUSH BC                         ;сохранили АЛЬТ BC
 
                PUSH IX                         ;сохранили IX
 
                PUSH IY                         ;сохранили IY
 
                EX AF,AF'
 
                PUSH AF                         ;сохранили альт AF
 
                LD A,0X80-REG_R_CORRECT
 
                LD HL,NREG_R-CPU6
 
                SLA (HL)
 
                RLA
 
                ADD A,(HL)
 
                RRCA
 
                LD (HL),A                       ;коррекция регистра R
 
                LD HL,(NMI_SAVE_SP-CPU6)
 
                LD E,(HL)
 
                INC HL
 
                LD D,(HL)
 
                LD HL,(NREG_F-CPU6)
 
                AND A
 
                SBC HL,DE
 
                JR NZ,NMISERV005
 
                LD HL,(NMI_SAVE_SP-CPU6)
 
                INC HL
 
                INC HL
 
                LD (NMI_SAVE_SP-CPU6),HL
 
                LD E,(HL)
 
                INC HL
 
                LD D,(HL)
 
NMISERV005      PUSH DE
 
                LD SP,STACK_NMI
 
                LD HL,OUT_NMI
 
                LD (ADR_NMI_JUMP),HL
 
                LD A,0XC9
 
                LD (FOR_RET),A                  ;RET для переключения страниц ROM/RAM
 
                LD HL,N_BF-CPU6                 ;адрес сохранения прочитанных регистров конфигурации
 
                IN A,(PEVO_CONF)
 
                LD (HL),A
 
                INC HL
 
                LD BC,RD_77
 
NMISERV002      INIR
 
                INI
 
                LD B,1                          ;прерывания разрешены
 
                LD A,R
 
                JP PE,NMISERV001
 
                LD A,R
 
                JP PE,NMISERV001
 
                DEC B                           ;прерывания запрещены
 
NMISERV001      XOR A
 
                LD I,A                          ;обработчик прерывания переставилии для адреса 00FF
 
                CALL GET_NUM_IM
 
                PEC_OFF M_SHADOW_BF
 
                LD A,(N_EFF7-CPU2)
 
                AND %11101111
 
                LD BC,PENT_CONF
 
                OUT (C),A
 
                PEC_ON M_SHADOW_BF
 
                LD A,(N_77-CPU2)
 
                AND %11110111
 
                LD BC,0XFF77
 
                OUT (C),A                       ;установка 7.0Mhz для NMI сервиса
 
 
 
;               LD DE,0XA70F                    ;дальше сохраняем текущую палитру
 
;               LD BC,0XBD77
 
;               OUT (C),D                       ;включение текстмода
 
;               LD (ADR_PALITRA),HL
 
;               LD BC,RD_PALITRA
 
;               EI
 
;               HALT
 
;               DI
 
;NMISERV003     LD A,E
 
;               BIT 3,E
 
;               OUT (0XFE),A
 
;               JR Z,NMISERV004
 
;               OUT (0XF6),A
 
;NMISERV004     IN A,(C)
 
;               LD (HL),A
 
;               INC HL
 
;               DEC E
 
;               JP P,NMISERV003                 ;палитру сохранили
 
;               LD HL,MAGIC_PAL
 
;               LD E,0X0F
 
;SETPAL1                LD A,E
 
;               BIT 3,E
 
;               OUT (0XFE),A
 
;               JR Z,$+4
 
;               OUT (0XF6),A
 
;               LD A,(HL)
 
;               INC HL
 
;               OR %00001100
 
;               OUT (0XFF),A
 
;               DEC E
 
;               JP P,SETPAL1
 
;               LD BC,0XFF77
 
;               OUT (C),D
 
 
 
                PUSH DE
 
                LD BC,WIN_P6
 
                XOR A
 
                OUT (C),A                       ;включили последнюю страницу озу
 
                LD B,HIGH (WIN_A3)
 
                LD A,0X40
 
                OUT (C),A                       ;сняли зависимость 3 окна от порта 7FFD
 
                LD DE,CPU6
 
                ADD HL,DE
 
                LD (ADR_PALITRA),HL
 
                LD HL,CPU6
 
                ADD HL,SP
 
                LD SP,HL
 
                LD B,HIGH (WIN_A0)
 
                LD A,ROM_RST83
 
                OUT (C),A
 
                POP HL
 
                LD (NUM_IM),HL
 
;PEREHVAT       DUPL 3,0
 
;               LD A,(DEBUG_ONOFF)
 
;               AND A
 
;               JR NZ,IN_DEBUG
 
                LD HL,CONTINUE_MAGIC
 
                PUSH HL
 
                JP OUT_NMI
 
 
 
;IN_DEBUG       XOR A
 
;               IN A,(0XFE)
 
;               CPL
 
;               AND 0X1F
 
;               JR NZ,IN_DEBUG
 
;               LD B,HIGH (WIN_P0)
 
;               LD A,PAGE_STS
 
;               OUT (C),A
 
;               LD HL,DEBUGGER
 
;               PUSH HL
 
;               JP OUT_NMI
 
 
 
;выход из магика
 
EXITNMISERVICE  LD HL,ADR_MAGIC
 
                LD (HL),0XC9                    ;заглушка на MAGIC
 
                IN A,(PEVO_CONF)
 
                OR M_NMI_BF
 
                OUT (PEVO_CONF),A
 
                AND M_NMI_BF!0XFF
 
                OUT (PEVO_CONF),A
 
                HALT                            ;ждем срабатывания MAGIC 
 
FALSE_NMI       LD HL,ADR_MAGIC
 
                LD (HL),0XC3                    ;разрешение обработчика MAGIC перед выходом
 
 
 
;               LD HL,0
 
;ADR_PALITRA    EQU $-2
 
;               LD A,(N_77-CPU6)
 
;               LD E,0X0F
 
;               AND E
 
;               OR 0XA0
 
;               LD D,A
 
;               LD BC,0XBD77                    ;доступ к палитре
 
;               OUT (C),D                       ;вкл.PAL
 
;SETPAL0                LD A,E
 
;               BIT 3,E
 
;               OUT (0XFE),A
 
;               JR Z,$+4
 
;               OUT (0XF6),A
 
;               LD A,(HL)
 
;               INC HL
 
;               OR %00001100
 
;               OUT (0XFF),A
 
;               DEC E
 
;               JP P,SETPAL0
 
;               LD BC,0XFF77
 
;               OUT (C),D
 
 
 
                LD C,LOW (WIN_A0)
 
                LD A,(N_7FFD-CPU6)
 
                AND 0X10
 
                LD HL,B0_CPU0-CPU6
 
                JR Z,ENS11
 
                LD HL,B1_CPU0-CPU6
 
ENS11           LD A,4
 
ENS12           EX AF,AF'
 
                LD E,(HL)                       ;байт для записи в порт
 
                INC HL
 
                LD D,(HL)                       ;старший байт адреса порта
 
                INC HL
 
                LD A,D
 
                OR 0X3F
 
                LD B,A
 
                BIT 3,D
 
                JR NZ,ENS15
 
                LD A,D
 
                AND 3
 
                RRCA
 
                RRCA
 
                OUT (C),A
 
                RES 3,B
 
ENS15           OUT (C),E
 
                EX AF,AF'
 
                DEC A
 
                JR NZ,ENS12
 
                PEC_OFF M_SHADOW_BF
 
                LD BC,PENT_CONF
 
                LD A,(N_EFF7-CPU6)
 
                OUT (C),A
 
                PEC_ON M_SHADOW_BF
 
                LD BC,(B_PORT77-CPU6)
 
                LD A,C
 
                LD C,0X77
 
                OUT (C),A
 
                LD A,(N_BF-CPU6)
 
                OUT (PEVO_CONF),A
 
                LD BC,CONF_128
 
                LD A,(N_7FFD-CPU6)
 
                OUT (C),A
 
                LD HL,NMI_SERVICE
 
                LD (ADR_NMI_JUMP),HL
 
                XOR A
 
                LD (FOR_RET),A
 
                LD SP,NADRRET_L-CPU6
 
                
 
                LD HL,(NMI_SAVE_SP-CPU6)
 
                POP DE
 
                LD (HL),E
 
                INC HL
 
                LD (HL),D                       ;восстановление адреса возврата
 
 
 
                POP AF
 
                EX AF,AF'
 
                POP IY
 
                POP IX
 
                POP BC
 
                POP DE
 
                POP HL
 
                EXX
 
                POP BC
 
                POP DE
 
                POP AF
 
                JP PO,ENMISERV1
 
                EI
 
ENMISERV1       LD A,0X80+3-REG_R_CORRECT
 
                LD HL,NREG_R-CPU6
 
                SLA (HL)
 
                RLA
 
                ADD A,(HL)
 
                RRCA
 
                LD R,A
 
                POP AF
 
                LD I,A
 
                POP AF
 
                POP HL
 
                LD SP,(NMI_SAVE_SP-CPU6)
 
                OUT (0XBE),A
 
                RETN
 
 
 
;MAGIC_PAL      DB 0X0C,0X2D,0X4E,0X6F,0X9C,0XBD,0XDE,0XFF
 
;               DB 0XEC,0XED,0XEE,0XEF,0XFC,0XFD,0XFE,0XFF
 
 
 
LDIR__BYTES     LD HL,CPU6
 
                ADD HL,SP
 
                LD SP,HL
 
                LD A,(R_7FFD-CPU6)
 
                AND 0X10
 
                LD HL,B0_CPU1-CPU2
 
                JR Z,LDIR_BYTES5
 
                LD HL,B1_CPU1-CPU2
 
LDIR_BYTES5     LD C,LOW (WIN_A0)
 
                LD A,3
 
LDIR_BYTES3     EX AF,AF'
 
                LD E,(HL)                       ;байт для записи в порт
 
                INC HL
 
                LD D,(HL)                       ;старший байт адреса порта
 
                INC HL
 
                LD A,D
 
                OR 0X3F
 
                LD B,A
 
                BIT 3,D
 
                JR NZ,LDIR_BYTES4
 
                LD A,D
 
                AND 3
 
                RRCA
 
                RRCA
 
                OUT (C),A
 
                RES 3,B
 
LDIR_BYTES4     OUT (C),E
 
                EX AF,AF'
 
                DEC A
 
                JR NZ,LDIR_BYTES3
 
                EXX
 
                LDIR
 
                LD BC,WIN_P6
 
                XOR A
 
                OUT (C),A
 
                LD HL,CPU6
 
                ADD HL,SP
 
                LD SP,HL
 
                LD BC,WIN_A0
 
                LD A,ROM_RST83
 
                JP ADR_SEL_ROM
 
 
 
NUM_IM2         LD A,1
 
                RET
 
 
 
GET_NUM_IM      PUSH HL
 
                LD D,B                          ;INT ON/OFF
 
                LD HL,0X0038
 
                LD (HL),0XAF
 
                LD L,0XFF
 
                LD (HL),LOW (NUM_IM2)
 
                INC HL
 
                LD (HL),HIGH (NUM_IM2)
 
                EI
 
                HALT
 
                DI
 
                LD E,A                          ;0-IM 1, 1-IM 2
 
                LD HL,0X0038
 
                LD (HL),0XFB
 
                LD L,0XFF
 
                LD (HL),LOW (IM_EI_RET)
 
                INC HL
 
                LD (HL),HIGH (IM_EI_RET)
 
                POP HL
 
                RET
 
 
 
                PHASE $+CPU6
 
;вызов подпрограмм из других страниц ROM
 
CALL2PAGE       EX (SP),HL
 
                PUSH BC
 
                PUSH AF
 
                LD BC,WIN_A0
 
.L1             LD (PORTCALL),BC
 
                LD C,(HL)
 
                INC HL
 
                LD B,(HL)
 
                INC HL
 
                LD (ADRCALL),BC
 
                LD BC,RD_7FFD
 
                IN A,(C)
 
                AND 0X10
 
                LD BC,RD_0WINA0
 
                JR Z,CALL2PAGE1
 
                LD BC,RD_1WINA0
 
CALL2PAGE1      IN A,(C)
 
                AND 0X3F
 
                LD BC,STEK_PAGES
 
TEKPAGE         EQU $-2
 
                LD (BC),A
 
                INC BC
 
                LD (TEKPAGE),BC
 
                LD A,(HL)
 
                INC HL
 
                LD BC,WIN_A0
 
PORTCALL        EQU $-2
 
                OUT (C),A
 
                POP AF
 
                POP BC
 
                EX (SP),HL
 
                CALL 0
 
ADRCALL         EQU $-2
 
                PUSH BC
 
                PUSH AF
 
                LD BC,(TEKPAGE)
 
                DEC BC
 
                LD A,(BC)
 
                LD (TEKPAGE),BC
 
                LD BC,WIN_A0
 
                OUT (C),A
 
                POP AF
 
                POP BC
 
                RET
 
 
 
CALL2RAMPAGE    EX (SP),HL
 
                PUSH BC
 
                PUSH AF
 
                LD BC,WIN_P0
 
                JR CALL2PAGE.L1
 
 
 
;вход в отладчик
 
DEBUGGER        DI
 
                LD HL,CPU6+DEBUG_ONOFF
 
                BIT B_DBG_ACTIV,(HL)
 
                JR Z,DEBUGGER1
 
;принудительный вход в отладчик с возвратом в основное меню NMI
 
                LD HL,DBG2MAINMENU
 
                PUSH HL
 
                JR DEBUGGER2
 
 
 
;вход в отладчик из основного меню NMI
 
DEBUGGER1       LD HL,RESTART_MAIN
 
                PUSH HL
 
                LD HL,EXIT_DEBUG
 
                PUSH HL
 
                LD HL,CPU6+DEBUG_ONOFF
 
                SET B_DBG_ACTIV,(HL)
 
DEBUGGER2       LD HL,CONTINUE_PROG
 
                LD DE,NADRRET_L
 
                EVOPORT WIN_P3,RAM_STS          ;включили страницу с установленным STS
 
                LD BC,N_BF
 
                LD A,(N_77)
 
                EX AF,AF'
 
                LD A,NO_EXIT_DEBUG-EXIT_DEBUG
 
                JP START_STS
 
 
 
;нормальный выход из отладчика
 
EXIT_DEBUG      LD HL,CPU6+DEBUG_ONOFF
 
                RES B_DBG_ACTIV,(HL)
 
;выход из отладчика минуя основное меню NMI
 
NO_EXIT_DEBUG   EVOPORT WIN_A0,ROM_RST82
 
                LD HL,CPU6+DEBUG_ONOFF
 
                LD A,M_TRACE_DBG
 
                AND (HL)
 
                RET Z
 
                LD HL,TRACER_DBG
 
                EX (SP),HL
 
                RET
 
 
 
;вход в отладчик минуя основное меню NMI
 
DBG2MAINMENU    LD HL,CPU6+DEBUG_ONOFF
 
                RES B_DBG_ACTIV,(HL)
 
                EVOPORT WIN_A0,ROM_RST83
 
                LD A,M_TRACE_DBG
 
                AND (HL)
 
                JP NZ,CONTMAGIC3
 
                JP RESTART_NMI
 
 
 
;возврат из NMI для отладчика. не восстанавливается:
 
;палитра, фонт, видеорежим
 
NMI_EXIT_DBG    EVOPORT WIN_A0,ROM_RST82
 
                ROMCALL RESTORE_AY,ROM_RST83    ;восстановление рагистров AY
 
                LD HL,ADR_MAGIC
 
                LD (HL),0XC9                    ;заглушка на MAGIC
 
                IN A,(PEVO_CONF)
 
                OR M_NMI_BF
 
                OUT (PEVO_CONF),A
 
                AND M_NMI_BF!0XFF
 
                OUT (PEVO_CONF),A
 
                HALT                            ;ждем срабатывания MAGIC 
 
                LD HL,ADR_MAGIC
 
                LD (HL),0XC3                    ;разрешение обработчика MAGIC перед выходом
 
                LD C,LOW (WIN_A0)
 
                LD A,(N_7FFD-CPU6)
 
                AND 0X10
 
                LD HL,B0_CPU0-CPU6
 
                JR Z,ENSDBG11
 
                LD HL,B1_CPU0-CPU6
 
ENSDBG11        LD A,4
 
ENSDBG12        EX AF,AF'
 
                LD E,(HL)                       ;байт для записи в порт
 
                INC HL
 
                LD D,(HL)                       ;старший байт адреса порта
 
                INC HL
 
                LD A,D
 
                OR 0X3F
 
                LD B,A
 
                BIT 3,D
 
                JR NZ,ENSDBG15
 
                LD A,D
 
                AND 3
 
                RRCA
 
                RRCA
 
                OUT (C),A
 
                RES 3,B
 
ENSDBG15        OUT (C),E
 
                EX AF,AF'
 
                DEC A
 
                JR NZ,ENSDBG12
 
                PEC_OFF M_SHADOW_BF
 
                LD BC,PENT_CONF
 
                LD A,(N_EFF7-CPU6)
 
                OUT (C),A
 
                PEC_ON M_SHADOW_BF
 
;               LD BC,(B_PORT77-CPU6)
 
;               LD A,C
 
;               LD C,0X77
 
;               OUT (C),A
 
                LD A,(N_BF-CPU6)
 
                OUT (PEVO_CONF),A
 
                LD BC,CONF_128
 
                LD A,(N_7FFD-CPU6)
 
                OUT (C),A
 
                LD HL,NMI_SERVICE
 
                LD (ADR_NMI_JUMP),HL
 
                XOR A
 
                LD (FOR_RET),A
 
                LD SP,NADRRET_L-CPU6
 
                POP AF                          ;сброс адреса возврата
 
                POP AF
 
                EX AF,AF'
 
                POP IY
 
                POP IX
 
                POP BC
 
                POP DE
 
                POP HL
 
                EXX
 
                POP BC
 
                POP DE
 
;               EI
 
;               HALT
 
;               DI
 
                POP AF
 
                JP PO,ENMIDBGSERV1
 
                EI
 
ENMIDBGSERV1    LD A,0X80+3-REG_R_CORRECT
 
                LD HL,NREG_R-CPU6
 
                SLA (HL)
 
                RLA
 
                ADD A,(HL)
 
                RRCA
 
                LD R,A
 
                POP AF
 
                LD I,A
 
                POP AF
 
                POP HL
 
                LD SP,(NMI_SAVE_SP-CPU6)
 
                OUT (0XBE),A
 
                RETN
 
 
 
SET_CPU3        PUSH BC
 
                LD BC,WIN_A3
 
                EX AF,AF'
 
                LD A,0X40
 
                OUT (C),A
 
                EX AF,AF'
 
                LD B,HIGH (WIN_P3)
 
                OUT (C),A
 
                POP BC
 
                RET
 
 
 
        IF 0
 
TO_USBDRV       EX AF,AF'
 
                LD (.L3),A
 
                LD A,IYL
 
                AND A
 
                LD A,(NEXTBYTERST8)
 
                JR Z,.L1
 
                EX (SP),HL
 
                LD A,(HL)
 
                INC HL
 
                EX (SP),HL
 
.L1             PUSH BC
 
                PUSH AF
 
                LD BC,WIN_P0
 
                LD A,RAM_SCR_FONT
 
                OUT (C),A
 
                POP AF
 
                POP BC
 
                LD (.OLD_SP_USB),SP
 
                LD SP,CPU1
 
                ADD A,A
 
                PUSH HL
 
                LD HL,COMUSBF.RET4USBF
 
                EX (SP),HL
 
                PUSH HL
 
                LD HL,COMUSBF.TBLUSBF
 
                ADD A,L
 
                LD L,A
 
                ADC A,H
 
                SUB L
 
                LD H,A
 
                LD A,(HL)
 
                INC HL
 
                LD H,(HL)
 
                LD L,A
 
                LD A,0
 
.L3             EQU $-1
 
                EX AF,AF'
 
                EX (SP),HL
 
                JP COMUSBF.IN_USBF
 
 
 
.RET_USBF       LD SP,0
 
.OLD_SP_USB     EQU $-2
 
                RET
 
        ENDIF
 
 
 
;переменные для USB драйвера
 
vars
 
.bFlags         DW 0XFF
 
.xferLen        DB 0XFF
 
.data0          DB 0XFF
 
.data1          DB 0XFF
 
.cmd            DB 0XFF
 
.intr           DB 0XFF
 
.result         DB 0XFF
 
.remainder      DB 0XFF
 
.dataX          DB 0XFF
 
.bufLen         DB 0XFF
 
.addr           DB 0XFF
 
.timeout        DB 0XFF
 
 
 
.SL_OUT         DB 0XFF dup (8)
 
.DBUF           DB 0XFF dup (64)
 
.T_OUT          DB 0XFF dup (32)
 
 
 
uDev            pUSBDEV
 
usbstack        PKG
 
 
 
STEK_PAGES      DUPL 0X10,0XFF                  ;10 стек страниц вызывов в ROM
 
RST_FLAGS       DB 0XFF                         ;1
 
TXT_COLOR       DB 0XFF                         ;1
 
COORD_XY        DW 0XFF                         ;2
 
COLBUF          DUPL 0X50,0XFF                  ;50 буфер сохранения строки цвета с экрана
 
MOUSE_BUFF      DUPL 0X10,0XFF                  ;10 буфер сохранения части экрана под курсором мыши
 
PRESSEDKEY      DW 0XFFFF                       ;2 адрес списка горячих клавиш после вывода окна
 
FLAGS           DB 0XFF                         ;1 системные флаги
 
 BITMASK VIDEO_MODE,    7                       ;BIT 7-=1-TXT, =0-ZX SCREEN MODE
 
                                                ;BIT 6
 
                                                ;BIT 5
 
 BITMASK WIN_INT_EXT,   4                       ;BIT 4-=1-внешнее окно, =0-внутреннее окно
 
 BITMASK RUN_FAT_DSK,   3                       ;BIT 3-=1-запуск с FAT, =0-запуск с дискеты
 
 BITMASK CLOCK_PRESENT, 2                       ;BIT 2-=1-часы найдены, =0-нет
 
 BITMASK MOUSE_PRESENT, 1                       ;BIT 1-=1-мышь есть, =0-нет
 
 BITMASK CURSOR_NUM,    0                       ;BIT 0-какой курсор рисовать, для мигания
 
NEXTBYTERST8    DB 0XFF                         ;1 следующий байт после вызова RST 8, код для вызова драйвера
 
OLD_STACK       DW 0XFFFF                       ;2
 
ADR_INT         DW 0XFFFF                       ;2
 
ADR_PALITRA     DW 0XFFFF                       ;2
 
XNEW            DB 0XFF                         ;1
 
ADRSTR_Y        DB 0XFF                         ;1
 
ADRSTR_X        DB 0XFF                         ;1
 
TXNEW           DB 0XFF                         ;1
 
TADRSTR_Y       DB 0XFF                         ;1
 
TADRSTR_X       DB 0XFF                         ;1
 
NO_INW          DB 0XFF                         ;1
 
COLOR4SYM       DB 0XFF                         ;1
 
PAGE4READ       DB 0XFF                         ;1
 
PAGE4SCR        DB 0XFF                         ;1
 
DAT_MAIN_MENU   DUPL 3,0                        ;3
 
DAT_SETUP_MENU  DUPL 3,0                        ;3
 
DAT_FILEBROWS   DUPL 5,0                        ;5
 
DAT_MOUNT       DUPL 3,0                        ;3
 
WIN_DEV         DUPL 0X30,0                     ;30
 
COL_CURSOR      DW 0XFFFF                       ;2
 
_MORG           DB 0XFF                         ;1
 
ARXY            DW 0XFFFF                       ;2
 
ADR_REST        DW 0XFFFF                       ;2
 
MOUPOS          DW 0XFFFF                       ;2
 
TEK_MODES       DB 0XFF                         ;1
 
CMP_FONT_FLAG   DB 0XFF                         ;1
 
BUFF4TXT        DUPL 0X2B,0XFF                  ;2B
 
EXT4FOUND       DUPL 0X10*3+1,0XFF              ;10*3+1
 
CMOS4CRC16      DUPL ECMOS_DEFAULT-CMOS_DEFAULT,0XFF
 
KSTATE0         DB 0XFF                         ;1 |
 
KSTATE1         DB 0                            ;1 |
 
KSTATE2         DB 0                            ;1 |
 
KSTATE3         DB 0                            ;1 |
 
KSTATE4         DB 0XFF                         ;1 |    аналог
 
KSTATE5         DB 0                            ;1 |    BASIC
 
KSTATE6         DB 0                            ;1 |    переменных
 
KSTATE7         DB 0                            ;1 |    опроса
 
LAST_K          DB 0                            ;1 |    клавиатуры
 
REPDEL          DB 0X10                         ;1 |
 
REPPER          DB 1                            ;1 |
 
FLAGS_KEY       DB 0                            ;1 |
 
FLAGS_KEY1      DB 0X10                         ;1 |
 
MOUNT_SYM       DB 0XFF                         ;1 номер монтирумого диска
 
EXT_TYPE        DB 0XFF                         ;1
 
OST_HWOST       DW 0XFFFF                       ;2
 
KUDA_HWOST      DW 0XFFFF                       ;2
 
SCROLL_MODE     DB 0XFF                         ;1
 
NEXT4PAGE       DW 0XFFFF                       ;2
 
OSTAT_SECT      DW 0XFFFF                       ;2
 
NACH_SECT       DW 0XFFFF                       ;2
 
START_DATA      DW 0XFFFF                       ;2
 
AY_REGS         DUPL 0X0E,0XFF                  ;D
 
TEKBUFTSC       DW 0XFFFF                       ;2
 
TEK_TEXT        DW 0XFFFF                       ;2
 
TURBO_MODE      DUPL 5,0XFF                     ;5
 
MEMORY_MODE     DUPL 4,0XFF                     ;3
 
;ДЛЯ РЕЗИДЕНТА HONEY COMANDER
 
        IFDEF REZIDENT
 
REZIDENT_MODE   DUPL 4,0XFF                     ;4
 
TXT_KILLREZID   DUPL 4,0XFF                     ;4
 
        ENDIF;REZIDENT
 
BUFF_TIME       DB 0X16,0X00,0X48,0X17,CYAN<<3+BLUE+0XC0
 
TXT_TIME        DB "00:00:00",0X16,0X01,0X48
 
TXT_DATA        DB "00.00.00",0X17,0XFF,0
 
EBUFF_TIME
 
NAME_RAMDISK    DUPL 0X20,0
 
FILE_DEST       DUPL 0X20,0XFF                  ;20 описатель открытого файла (куда)
 
FB_EXT          DUPL 0X0B,0XFF                  ;B буфер 8.3 для поиска имени
 
SAVE_IY         DW 0XFFFF                       ;2 внутренее сохранение регистров для дальнейшего использования
 
ADR_MASK_EXT    DW 0XFFFF                       ;2 адрес расширений файлов для поиска
 
ADR_SKLAD       DW 0XFFFF                       ;2 адрес складирования найденного
 
ADR_SKLAD_NAME  DW 0XFFFF                       ;2
 
MAKS_ADR        DB 0XFF                         ;1 старший байт максимального адреса буфера складирования
 
KOL_FOUNDED     DW 0XFFFF                       ;2 количество найденных описателей
 
OUT_NAME_FILE   DB 0X17,0XFF,0X16,0,0,0
 
OUT_NAME_FILET  EQU $-3
 
BUF_FILEITEM    DUPL 0X20,0XFF                  ;20
 
EXTERN_PAL      DUPL 0X10,0XFF                  ;10
 
ENMI_SERVICE
 
HDDTIMEOUT      EQU EXTERN_PAL+0X10             ;1
 
 
 
                DEPHASE