;================================== обработка прерываний
INIT:
xthl ; обмен HL SP
shld im_ret+1 ; сохраним адрес возврата из прерываний
pop h
shld im_hl+1 ; сохраним значение HL при выходе из прерываний
push psw
lxi h,2 ;\ вычисляем указатель стека
dad sp ;/
shld im_sp+1 ; сохраним указатель стека
pop psw
push b ; восстановим данные испорченные стеком
lxi sp,im_stek ; временный указатель стека для прерываний
push PSW
push b
push d
;============================== мои задачи
;PUSH H
;PUSH B
;PUSH D
;PUSH PSW
LDA WRPAL ; ПРОВЕРКА РАЗРЕШЕНИЯ ЗАПИСИ ПАЛИТРЫ В
ORA A ; ОЗУ ЦВЕТОГЕНЕРАТОРА.
JZ NWRPAL
MVI A,88H
OUT 00H
feutral: LXI H,COLR15 ; ЗАПИСЬ ПАЛИТРЫ.
LXI D,100FH
INIT1: MOV A,E
OUT 02
MOV A,M
OUT 0CH
OUT 0CH
OUT 0CH
OUT 0CH
OUT 0CH
DCX H
OUT 0CH
DCR E
OUT 0CH
DCR D
OUT 0CH
JNZ INIT1
NWRPAL: MVI A,8AH ; ПРОВЕРКА НАЖАТИЯ НА ЛЮБУЮ КЛАВИШУ
OUT 00 ; МАТРИЦЫ КЛАВИАТУРЫ 8*8 (КРОМЕ УС,СС,РУС/ЛАТ).
XRA A
OUT 03
IN 2
STA STATUS
MVI A,0FEH ; ПРОВЕРКА НАЖАТИЯ НА КЛАВИШИ ИГРОВОГО РЯДА.
OUT 03
IN 02
STA KEYKOD
MVI A,88H
OUT 00
LDA BORDER ; УСТАНОВКА ЦВЕТА БОРДЮРА.
ANI 0FH
OUT 02
LDA SCROLL ; УСТАНОВКА ВЕРТИКАЛЬНОГО ПОЛОЖЕНИЯ ЭКРАНА.
OUT 03
;============================================
;jmp EXINIT
; ОБРАБОТКА ВЫСОТЫ И ДЛИТЕЛЬНОСТИ ЗВУКА ПО НОМЕРУ ПАРАМЕТРА ЗВУКА.
;
LDA TON ; ВЗЯТЬ КОД ИЗ БУФЕРА НОМЕРОВ ПАРАМЕТРОВ ЗВУКА.
ORA A ; НОМЕР ПАРАМЕТРА УСТАНОВЛЕН?
JZ TSSOUN ; ЕСЛИ НЕТ - ПЕРЕЙТИ НА ПРОВЕРКУ ОТРАБОТКИ ДЛИТ.ЗВУКА.
DCR A ; УМЕНШИТЬ НОМЕР НА 1, Т.К. МАССИВ НАЧИН. С НУЛЕВОГО.
ADD A ; УМНОЖИТЬ НОМЕР ПАРАМЕТРОВ ЗВУКА НА 4, ТАК КАК
ADD A ; ПАРАМЕТРЫ ОДНОГО ЗВУКА ЗАНИМАЮТ 4 БАЙТА.
MOV E,A ; ПОДГОТОВИТЬ В "DE" СМЕЩЕНИЕ ОТ НАЧАЛА ПАРАМЕТРОВ.
MVI D,0
LXI H,BAZTON ; УСТАНОВИТЬ В "HL" АДРЕС НАЧАЛА ПАРАМЕТРОВ ЗВУКА.
DAD D ; СЛОЖЕНИЕМ С "DE" ПОЛУЧИТЬ В "HL" АДРЕС НУЖНЫХ ПАРАМ.
MVI A,0B6H ; УСТАНОВИТЬ РЕЖИМ 3 ТАЙМЕРА ДЛЯ КАНАЛА 2, ЗАПИСЬ КОЭФ-
OUT 08 ; ФИЦИЕНТА ДЕЛЕНИЯ В ДВА БАЙТА - СНАЧАЛА МЛ. ПОТОМ СТ.
MOV A,M ; ВЗЯТЬ МЛАДШИЙ БАЙТ КОЭФФ. ДЕЛЕНИЯ И
OUT 09 ; ЗАПИСАТЬ В КАНАЛ 2 ТАЙМЕРА.
INX H ; ПЕРЕДВИНУТЬ УКАЗАТЕЛЬ НА СЛЕДУЮЩИЙ БАЙТ ПАРАМЕТРОВ.
MOV A,M ; ВЗЯТЬ СТАРШИЙ БАЙТ КОЭФФ. ДЕЛЕНИЯ И
OUT 09 ; ЗАПИСАТЬ В КАНАЛ 2 ТАЙМЕРА.
INX H
MOV E,M ; ВЗЯТЬ В ПАРУ "DE" ДЛИТЕЛЬНОСТЬ ЗВУЧАНИЯ.
INX H
MOV D,M
XCHG ; И ЗАПИСАТЬ ЕЕ В
SHLD STSOUN ; СЧЕТЧИК ВРЕМЕНИ ЗВУЧАНИЯ.
XRA A ; ОБНУЛИТЬ БУФЕР НОМЕРОВ ПАРАМЕТРОВ ЗВУКА (Т.Е. ПАРА-
STA TON ; МЕТРЫ ВЗЯТЫ И ИХ НЕ НУЖНО СНОВА ОПРЕДЕЛЯТЬ).
JMP EXINIT ; ВЫЙТИ ИЗ П/П ОБРАБОТКИ СИСТЕМНОГО ПРЕРЫВАНИЯ.
;
TSSOUN: LHLD STSOUN ; ВЗЯТЬ СЧЕТЧИК ВРЕМЕНИ ЗВУЧАНИЯ И ПРОВЕРИТЬ,
MOV A,H ; РАВЕН ЛИ ОН НУЛЮ (ВРЕМЯ ЗВУЧАНИЯ КОНЧИЛОСЬ)?
ORA L
JZ OFSOUN ; ЕСЛИ КОНЧИЛОСЬ - ВЫКЛЮЧИТЬ ЗВУК!
DCX H ; УМЕНЬШИТЬ СЧЕТЧИК.
SHLD STSOUN
JMP EXINIT ; И ВЫЙТИ ИЗ П/П ПРЕРЫВАНИЯ.
OFSOUN: MVI A,0B6H ; ВЫКЛЮЧИТЬ КАНАЛ 2 ТАЙМЕРА ПУТЕМ ЗАПИСИ В РЕГ.
OUT 08 ; РЕЖИМА УПР. СЛОВА ДЛЯ ЭТОГО КАНАЛА БЕЗ ПАРАМ.
EXINIT: XRA A
STA WRPAL
;==================================================
lda kub_napr
cpi 3 ; движение вверх скрол вниз
jnz ruft12
;=======затриаем_сверху=4 строки + снизу рисуем 8 строк
; стираем ширму сверху
lxi b,0
lxi h,0
dad sp ; HL=HL+SP
shld s_sp ; сохраняем значение стека
lda scroll
sui 7
mov l,a
mvi h,0e0h
mvi a,32
shirmczz: sphl ; перенос из HL в SP 8
push b ; запись в экран 16
push b ; запись в экран 16
inr h
dcr a ; 8
jnz shirmczz ; 12
; рисуем снизу
lxi b,0FFFFh
lda scroll
adi 9
mov l,a
mvi h,0e1h
mvi a,31
shirmc2r: sphl ; перенос из HL в SP 8
push b ; запись в экран 16
push b ; запись в экран 16
push b ; запись в экран 16
push b ; запись в экран 16
inr h
dcr a ; 8
jnz shirmc2r ; 12
lhld s_sp ; возвращаем значение стека
sphl
jmp ruft14
ruft12:
cpi 4 ; движение вниз скрол вверх затриаем снизу строку 08 + сверху рисуем 8 строк
jnz ruft14 ;иначе ничего не делаем
;=======затриаем_сверху=4 строки + снизу рисуем 8 строк
; стираем ширму снизу
lxi b,0
lxi h,0
dad sp ; HL=HL+SP
shld s_sp ; сохраняем значение стека
lda scroll
adi 13
mov l,a
mvi h,0e0h
mvi a,32
shirmc44: sphl ; перенос из HL в SP 8
push b ; запись в экран 16
push b ; запись в экран 16
inr h
dcr a ; 8
jnz shirmc44 ; 12
; рисуем сверху
lxi b,0FFFFh
lda scroll
adi 1
mov l,a
mvi h,0e1h
mvi a,31
shirmc2r44: sphl ; перенос из HL в SP 8
push b ; запись в экран 16
push b ; запись в экран 16
push b ; запись в экран 16
push b ; запись в экран 16
inr h
dcr a ; 8
jnz shirmc2r44 ; 12
lhld s_sp ; возвращаем значение стека
sphl
;===================================
ruft14:
; выход из прерываний
pop d
pop b
pop psw
im_hl: lxi h,$2121
im_sp: lxi sp,$3131
ei
im_ret: jmp $c3c3
[свернуть]