;LAST UPDATE: 21.05.2012 savelij
;ПОСЛЕДОВАТЕЛЬНОСТЬ ДЛЯ RST 8
;СТАРЫЙ СТЕК HL AF BC RF ADR_RET DE ->
;-> НОВЫЙ СТЕК HL(НОМЕР ПАГИ И ПОРТ BF) DE(RAMNROM И DOS7FFD) BC' DE' HL' IX IY AF' ->
;-: ЧТЕНИЕ КОНФИГА
CODE_NMIRST
PHASE ADR_SEL_ROM
OUT (C),A ;ПЕРЕКЛЮЧЕНИЕ СТРАНИЦ ДЛЯ ПЕРЕХОДОВ
NOP
FOR_RET NOP
LD (RST8_SAVE_SP-CPU2),SP ;СОХРАНИЛИ СТАРЫЙ СТЕК
LD SP,RREG_E-CPU2
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
JP RAMSEL1
OUT_NMI OUT (0XBE),A
RETN
DUPL 0X0038-$,0
IM_EI_RET EI
RET
DUPL 0X0066-$,0XFF
NOP
ADR_MAGIC JP NMI_SERVICE
ADR_NMI_JUMP EQU $-2
PHASE $+CPU2
;СЧИТАННАЯ КОНФИГУРАЦИЯ ПОРТОВ ДЛЯ RST 8
R_BF DB 0
R_77 DB 0
R_EFF7 DB 0
R_7FFD DB 0
R_DOS7FFD DB 0
R_RAMNROM DB 0
R_1WINA3 DB 0
R_1WINA2 DB 0
R_1WINA1 DB 0
R_1WINA0 DB 0
R_0WINA3 DB 0
R_0WINA2 DB 0
R_0WINA1 DB 0
R_0WINA0 DB 0
;СЧИТАННАЯ КОНФИГУРАЦИЯ ПОРТОВ ДЛЯ NMI
N_BF DB 0
N_77 DB 0
N_EFF7 DB 0
N_7FFD DB 0
N_DOS7FFD DB 0
N_RAMNROM DB 0
N_1WINA3 DB 0
N_1WINA2 DB 0
N_1WINA1 DB 0
N_1WINA0 DB 0
N_0WINA3 DB 0
N_0WINA2 DB 0
N_0WINA1 DB 0
N_0WINA0 DB 0
N_TEK_PALS DUPL 0X10,0
;СОХРАНЕННЫЕ РЕГИСТРЫ ПРИ ВЫЗОВЕ RST 8
RREG_FI DB 0
RREG_I DB 0 ;IF
RREG_FF DB 0
RREG_AA DB 0 ;AF'
RREG_IYL DB 0
RREG_IYH DB 0 ;IY
RREG_IXL DB 0
RREG_IXH DB 0 ;IX
RREG_LL DB 0
RREG_HH DB 0 ;HL'
RREG_EE DB 0
RREG_DD DB 0 ;DE'
RREG_CC DB 0
RREG_BB DB 0 ;BC'
RDOS7FFD DB 0 ;БИТЫ DOS7FFD ПЕРЕД ВЫЗОВОМ
RRAMNROM DB 0 ;БИТЫ RAMNROM ПЕРЕД ВЫЗОВОМ
RPBF_CALL DB 0 ;СОДЕРЖИМОЕ ПОРТА BF ПЕРЕД ВЫЗОВОМ
RPAGE_CALL DB 0 ;НОМЕР СТРАНИЦЫ ОТКУДА ПРИШЛИ
RREG_E DB 0
RREG_D DB 0 ;DE
RADRRET_L DB 0
RADRRET_H DB 0 ;ADR_RET
REI_DI DB 0
R_R DB 0 ;RF
RREG_C DB 0
RREG_B DB 0 ;BC
RREG_F DB 0
RREG_A DB 0 ;AF
RREG_L DB 0
RREG_H DB 0 ;HL
RST8_SAVE_SP DW 0
;СОХРАНЕННЫЕ РЕГИСТРЫ ПРИ ВЫЗОВЕ NMI
;HL AF IF RF DE BC HL' DE' BC' IX IY AF'
NADRRET_L DB 0
NADRRET_H DB 0
NREG_FF DB 0
NREG_AA DB 0
NREG_IYL DB 0
NREG_IYH DB 0
NREG_IXL DB 0
NREG_IXH DB 0
NREG_CC DB 0
NREG_BB DB 0
NREG_EE DB 0
NREG_DD DB 0
NREG_LL DB 0
NREG_HH DB 0
NREG_C DB 0
NREG_B DB 0
NREG_E DB 0
NREG_D DB 0
NREG_EI_DI_2 DB 0
NREG_R DB 0
NREG_EI_DI_1 DB 0
NREG_I DB 0
NREG_F DB 0
NREG_A DB 0
NREG_L DB 0
NREG_H DB 0
NMI_SAVE_SP DW 0 ;АДРЕС СОХРАНЕНИЯ СТЕКА ПРОГРАММЫ ПРЕРВАННОЙ ПО NMI
INTERNAL_SP DW 0 ;АДРЕС ХРАНЕНИЯ СТЕКА ПРИ РАБОТЕ СЕРВИСОВ
B0_CPU0 DB 0 ;БАЙТ ДЛЯ ПОРТА 0 ОКНА 0 МАПЕРА
P0_CPU0 DB 0 ;СТАРШИЙ БАЙТ АДРЕСА ПОРТА ПОРТА ДЛЯ 0 ОКНА 0 МАПЕРА
B0_CPU1 DB 0 ;БАЙТ ДЛЯ ПОРТА 1 ОКНА 0 МАПЕРА
P0_CPU1 DB 0 ;СТАРШИЙ БАЙТ АДРЕСА ПОРТА ПОРТА ДЛЯ 1 ОКНА 0 МАПЕРА
B0_CPU2 DB 0 ;БАЙТ ДЛЯ ПОРТА 2 ОКНА 0 МАПЕРА
P0_CPU2 DB 0 ;СТАРШИЙ БАЙТ АДРЕСА ПОРТА ПОРТА ДЛЯ 2 ОКНА 0 МАПЕРА
B0_CPU3 DB 0 ;БАЙТ ДЛЯ ПОРТА 3 ОКНА 0 МАПЕРА
P0_CPU3 DB 0 ;СТАРШИЙ БАЙТ АДРЕСА ПОРТА ПОРТА ДЛЯ 3 ОКНА 0 МАПЕРА
B1_CPU0 DB 0 ;БАЙТ ДЛЯ ПОРТА 0 ОКНА 0 МАПЕРА
P1_CPU0 DB 0 ;СТАРШИЙ БАЙТ АДРЕСА ПОРТА ПОРТА ДЛЯ 0 ОКНА 0 МАПЕРА
B1_CPU1 DB 0 ;БАЙТ ДЛЯ ПОРТА 1 ОКНА 0 МАПЕРА
P1_CPU1 DB 0 ;СТАРШИЙ БАЙТ АДРЕСА ПОРТА ПОРТА ДЛЯ 1 ОКНА 0 МАПЕРА
B1_CPU2 DB 0 ;БАЙТ ДЛЯ ПОРТА 2 ОКНА 0 МАПЕРА
P1_CPU2 DB 0 ;СТАРШИЙ БАЙТ АДРЕСА ПОРТА ПОРТА ДЛЯ 2 ОКНА 0 МАПЕРА
B1_CPU3 DB 0 ;БАЙТ ДЛЯ ПОРТА 3 ОКНА 0 МАПЕРА
P1_CPU3 DB 0 ;СТАРШИЙ БАЙТ АДРЕСА ПОРТА ПОРТА ДЛЯ 3 ОКНА 0 МАПЕРА
B_PORT77 DB 0 ;БАЙТ ДЛЯ ВЫВОДА В ПОРТ ХХ77
P_PORT77 DB 0 ;СТАРШИЙ БАЙТ АДРЕСА ПОРТА ХХ77
F_INTEXT_DRV DB 0 ;ФЛАГИ ПРИ ВНЕШНИХ/ВНУТРЕННИХ ВЫЗОВАХ ДРАЙВЕРОВ
PHASE $-CPU2
DUPL HIGH ($)*0X100+0XFF-$,0
DW IM_EI_RET
DUPL HIGH ($)*0X100+0X80-$,0
STACK_RST
DUPL (HIGH ($)+1)*0X100-$,0
STACK_NMI
RAMSEL1 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-CPU2)
LD DE,RREG_E-CPU2
LD BC,RREG_H-RPAGE_CALL
LDIR
LD HL,R_77-CPU2
LD BC,RD_77
INIR
INI
LD HL,(RDOS7FFD-CPU2)
LD (R_DOS7FFD-CPU2),HL
LD SP,STACK_RST
LD A,(R_77-CPU2)
AND 7
OR 0XA8
LD BC,0XFF77
OUT (C),A
XOR A
OUT (PEVO_CONF),A
LD BC,PENT_CONF
OUT (C),A
INC A
OUT (PEVO_CONF),A
LD A,(R_7FFD-CPU2)
AND 0X10
LD HL,R_0WINA0-CPU2
JR Z,RAMSEL3
LD HL,R_1WINA0-CPU2
RAMSEL3 LD A,(RPAGE_CALL-CPU2)
LD (HL),A
LD HL,R_0WINA3-CPU2
JR Z,RAMSEL4
LD HL,R_1WINA3-CPU2
RAMSEL4 LD A,(HL)
AND 0X3F
OR 0X40
LD BC,WIN_A3
OUT (C),A
LD BC,WIN_P2
XOR A
OUT (C),A
LD BC,WIN_A0
LD A,5
LD HL,CPU2
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
LD C,LOW (WIN_A1)
LD HL,B1_CPU1-CPU2
LD A,3
RENS12 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,RENS14
SET 3,B
LD A,D
AND 3
RRCA
RRCA
OUT (C),A
RES 3,B
RENS14 OUT (C),E
EX AF,AF'
DEC A
JR NZ,RENS12
LD HL,RST8_SAVE_SP-(RREG_H-RPAGE_CALL)-CPU2
LD DE,(RST8_SAVE_SP-CPU2)
LD BC,RREG_H-RPAGE_CALL
LDIR
XOR A
LD (FOR_RET),A
OUT (PEVO_CONF),A
LD BC,PENT_CONF
LD A,(R_EFF7-CPU2)
OUT (C),A
LD A,1
OUT (PEVO_CONF),A
LD BC,(B_PORT77-CPU2)
LD A,C
LD C,0X77
OUT (C),A
LD SP,RREG_FI-CPU2
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-CPU2) ;ВОССТАНОВИЛИ СТЕК ВЫЗВАШЕЙ ПРОГРАММЫ
LD BC,ADR_RST8END ;АДРЕС ВОЗВРАТА
PUSH BC
LD A,(R_7FFD-CPU2)
AND 0X10
LD DE,(B0_CPU0-CPU2)
JR Z,RENS13
LD DE,(B1_CPU0-CPU2)
RENS13 LD A,D
OR 0X3F
LD B,A
BIT 3,D
JR NZ,RENS15
SET 3,B
LD A,E
AND 3
RRCA
RRCA
OUT (C),A
RES 3,B
RENS15 LD A,E ;СТРАНИЦА ROM КУДА ВОЗВРАЩАТЬСЯ
LD C,LOW (WIN_A0)
JP ADR_SEL_ROM
NMI_SERVICE LD (NMI_SAVE_SP-CPU2),SP ;СОХРАНЕНИЕ СТЕКА
LD SP,NMI_SAVE_SP-CPU2 ;НОВЫЙ СТЕК
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 HL,(NMI_SAVE_SP-CPU2)
LD E,(HL)
INC HL
LD D,(HL)
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-CPU2 ;АДРЕС СОХРАНЕНИЯ ПРОЧИТАННЫХ РЕГИСТРОВ КОНФИГУРАЦИИ
IN A,(PEVO_CONF)
LD (HL),A
INC HL
LD BC,RD_77
NMISERV002 INIR
INI
XOR A
LD I,A ;ОБРАБОТЧИК ПРЕРЫВАНИЯ ПЕРЕСТАВИЛИИ ДЛЯ АДРЕСА 00FF
INC A
OUT (PEVO_CONF),A
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
LD BC,WIN_P2
XOR A
OUT (C),A ;ВКЛЮЧИЛИ ПОСЛЕДНЮЮ СТРАНИЦУ ОЗУ
LD HL,CPU2
ADD HL,SP
LD SP,HL
LD H,A
LD L,A
PUSH HL
LD B,HIGH (WIN_A0)
LD A,5
OUT (C),A
JP OUT_NMI
;ВЫХОД ИЗ МАГИКА
EXITNMISERVICE LD HL,ADR_MAGIC
LD (HL),0XC9 ;ЗАГЛУШКА НА MAGIC
IN A,(PEVO_CONF)
SET 3,A
OUT (PEVO_CONF),A
RES 3,A
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-CPU2)
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-CPU2)
AND 0X10
LD HL,B0_CPU0-CPU2
JR Z,ENS11
LD HL,B1_CPU0-CPU2
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
SET 3,B
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
XOR A
OUT (PEVO_CONF),A
LD BC,PENT_CONF
LD A,(N_EFF7-CPU2)
OUT (C),A
LD A,1
OUT (PEVO_CONF),A
LD BC,(B_PORT77-CPU2)
LD A,C
LD C,0X77
OUT (C),A
LD A,(N_BF-CPU2)
OUT (PEVO_CONF),A
LD BC,0X7FFD
LD A,(N_7FFD-CPU2)
OUT (C),A
LD HL,NMI_SERVICE
LD (ADR_NMI_JUMP),HL
XOR A
LD (FOR_RET),A
LD SP,NADRRET_L-CPU2
POP AF ;СБРОС АДРЕСА ВОЗВРАТА
POP AF
EX AF,AF'
POP IY
POP IX
POP BC
POP DE
POP HL
EXX
POP BC
POP DE
EI
HALT
POP AF
LD R,A
JP PO,ENMISERV1
EI
ENMISERV1 POP AF
LD I,A
POP AF
POP HL
LD SP,(NMI_SAVE_SP-CPU2)
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,CPU2
ADD HL,SP
LD SP,HL
LD A,(R_7FFD-CPU2)
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
SET 3,B
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_P2
XOR A
OUT (C),A
LD HL,CPU2
ADD HL,SP
LD SP,HL
LD BC,WIN_A0
LD A,5
JP JUMP2PAGE
ENMI_SERVICE
PHASE $+CPU2
RST_FLAGS DB 0 ;1
TXT_COLOR DB 0 ;1
COORD_XY DW 0 ;2
COLBUF DUPL 0X20,0 ;20 БУФЕР СОХРАНЕНИЯ ЦВЕТА С ЭКРАНА
MOUSE_BUFF DUPL 0X10,0 ;10 БУФЕР СОХРАНЕНИЯ ЧАСТИ ЭКРАНА ПОД КУРСОРОМ МЫШИ
PRESSEDKEY DW 0 ;2 АДРЕС СПИСКА ГОРЯЧИХ КЛАВИШ ПОСЛЕ ВЫВОДА ОКНА
FLAGS DB 0 ;1 СИСТЕМНЫЕ ФЛАГИ
;BIT 7
;BIT 6
;BIT 5
;BIT 4-=1-ВНЕШНЕЕ ОКНО, =0-ВНУТРЕННЕ ОКНО
;BIT 3-=1-ЗАПУСК С ФАТА, =0-ЗАПУСК С ДИСКЕТЫ
;BIT 2-=1-ЧАСЫ НАЙДЕНЫ, =0-НЕТ
;BIT 1-=1-МЫШЬ ЕСТЬ, =0-НЕТ
;BIT 0-КАКОЙ КУРСОР РИСОВАТЬ, ДЛЯ МИГАНИЯ
NEXTBYTERST8 DB 0 ;1 СЛЕДУЮЩИЙ БАЙТ ПОСЛЕ ВЫЗОВА RST 8, КОД ДЛЯ ВЫЗОВА ДРАЙВЕРА
KSTATE0 DB 0 ;1 |
KSTATE1 DB 0 ;1 |
KSTATE2 DB 0 ;1 |
KSTATE3 DB 0 ;1 |
KSTATE4 DB 0 ;1 | АНАЛОГ
KSTATE5 DB 0 ;1 | BASIC
KSTATE6 DB 0 ;1 | ПЕРЕМЕННЫХ
KSTATE7 DB 0 ;1 | ОПРОСА
LAST_K DB 0 ;1 | КЛАВИАТУРЫ
REPDEL DB 0 ;1 |
REPPER DB 0 ;1 |
FLAGS_KEY DB 0 ;1 |
FLAGS_KEY1 DB 0 ;1 |
XNEW DB 0 ;1
ADRSTR_Y DB 0 ;1
ADRSTR_X DB 0 ;1
NO_INW DB 0 ;1
COLOR4SYM DB 0 ;1
PAGE4READ DB 0 ;1
DAT_MAIN_MENU DB 0 ;3
COL_CURSOR DB 0 ;2
_MORG DB 0 ;1
ARXY DB 0 ;2
ADR_REST DB 0 ;2
MOUPOS DB 0 ;2
BUFF4TXT DB 0 ;2B
EXT4FOUND DB 0 ;10*3+1
ADR_CAT EQU 0XF000 ;1000
DEPHASE
PHASE $-CPU1