А ты уверен, что вызываемый в обработчике чужой код (плеер музыки, например) её не трогает?
Вид для печати
Т.е. музыку на прерываниях не играл?
Andrew771, самый простой вариант
при таком вызове гарантированно не будет проблем с проигрыванием музыки
Цитата:
push hl,de,bc,af
exx
ex af,af'
push hl,de,bc,af
push ix,iy
call play_music
pop iy,ix
pop af,bc,de,hl
exx
ex af,af'
pop af,bc,de,hl
Опять про прерывания.
Объясните, почему это не работает? Вроде всё правильно нафигачил :(
Код:org 24000
call im_on
ret
; процедура в прерывании
im_procedure push af
push bc
push de
push hl
exx
ex af,af'
push af
push bc
push de
push hl
push ix
push iy
ld a,3
call 8859
pop iy
pop ix
pop hl
pop de
pop bc
pop af
exx
ex af,af'
pop hl
pop de
pop bc
pop af
jp 56
; включение 2-го режима прерываний
im_on di
ld hl,64512
ld de,64513
ld bc,256
ld (hl),253
ldir
ld hl,im_procedure
ld (65021),hl
ld a,252
ld i,a
im 2
ei
ret
Тут беда. В 65021 надо засовывать не адрес обработчика, а сам обработчик. Если хочется, чтобы он был в другом месте, надо сделать JP туда, напримеор, так:
PS А главная беда этого примера - десятичные числа.Код:ld a,#c3 ; jp
ld (65021),a
ld hl,im_procedure
ld (65022),hl
Прерыванию делаются примерно так (у меня в примере на прерываниях висит музыка). Можно без ldir'а, если сразу туда ассемблировать.
Код:imtab equ #be00 //таблица вектора прерываний (257 байт)
int_jump equ #bdbd //обработчик
start
di:ld sp,#6000
xor a:out (#fe),a
// прерывания
ld hl,imtab:ld a,h,i,a
ld a,low int_jump
ld (hl),a:inc l:jr nz,$-2
inc h:ld (hl),a
ld hl,obrab,e,a,d,a,bc,obrab_len:ldir
im 2
call music // init music
ei
loop
halt
jr loop
obrab //обработчик прерываний (работает с адреса #bdbd)
push af,hl,bc,de,ix,iy
exx
push hl,de,bc
ex af,af'
push af
call music+5
pop af
ex af,af'
pop bc,de,hl
exx
pop iy,ix,de,bc,hl,af
ei
ret
obrab_len equ $-obrab
music incbin "music.cod" //пт3-модуль с плеером