PDA

Просмотр полной версии : Прерывания IM 2



GM BIT
20.01.2011, 19:26
Как правильно включить, куда указывать вектор для правильной работы на всех машинах, ну и еще какие фишки, С ПРИМЕРАМИ!!!!

Sinus
20.01.2011, 20:09
вектор в верхней памяти, лучше от #8000 до #BE00, ибо на каком-то из буржуйских спектрумов (+3 чтоле) медленные и быстрые банки перепутаны.
заполнять 257 байт какии-либо одним байтом.
желательно чтоб адрес обработчика тоже лежал в быстрой памяти, т.е. #8000, #8181, #8282, и т.д.

собственно и всё.
типо:



di
ld hl,#BE00
ld de,#BE01
ld bc,#0100
ld (hl),#BB
ldir

ld a,#C3
ld (#BBBB),A
ld hl,int_handler
ld (#BBBC),hl

ld a,#BE
ld i,a
im 2
ei

....

int_handler
push af,bc,de,hl,...
...
pop ...,hl,de,bc,af
ei
ret


зы. а с чего вдруг такой вопрос? вроде в твоих интрухах музон нормально грает

BYTEMAN
20.01.2011, 20:35
Sinus, я всё никак не могу понять, почему 257, а не 256 байт надо заливать?

Sinus
20.01.2011, 20:49
потому что на шину данных во время прихода прерывания может прийти 255 (собственно, так и будет, если на спеке стабильная подтянутая резюками на +5V ШД).

т.е. если I=#80, а пришло #FF, то проц будет смотреть адрес процедуры по #80FF/#8100

moroz1999
20.01.2011, 23:48
так разве байт на 8100 не будет 256-ым?

psb
20.01.2011, 23:53
по счету - нет. 256й байт - это FF.

Дмитрий
20.01.2011, 23:53
moroz1999, будет 257-м... с #8000 по #80FF(включительно) будет 256 байт данных.

GM BIT
21.01.2011, 05:47
а с чего вдруг такой вопрос?
В последней только есть IM 2 (да и то откуда-то взято), в остальных нет. Вот и решил спросить как правильно делать

valeron
21.01.2011, 09:59
желательно чтоб адрес обработчика тоже лежал в быстрой памяти, т.е. #8000, #8181, #8282, и т.д.
Хм, я наоборот обработчик в медленную память помещал, главное что бы вектор прерывания был в быструю память, таблица 257 байт в быстрой памяти, но сам обработчик в медленной. Потому что прерывание обрабатывается за время пока идет отрисовка верхнего бордюра, а в это время проц и так не тормозится. И до того как луч доходит до экрана уже все изменение произведены, курсор впечатан в новой позиции и обработка прерывания окончена. Таким образом я экономил быструю память под какие-нибудь быстрые процедуры.

Sinus
21.01.2011, 12:54
я предпочитаю перестраховаться.
да и как-то у меня ни разу такого не было, чтоб под код памяти на хватило :) вот под данные - это да.

Enigmatic
21.01.2011, 13:14
Если такой вот вопрос поднялся-
Как корректно кинуть какой-нибудь процесс в IM2,например воспроизведение музыки+опрос клавы?
Я раньше делал это в gens (лет 10 назад) -получалось,а счас чет не получается...
Помню процедуру обработки брал из книги Как написать игру на ассемблере..

null_device
21.01.2011, 13:30
Как корректно кинуть какой-нибудь процесс в IM2,например воспроизведение музыки+опрос клавы?

Я делал так:
Блок на который указывает вектор прерываний.


push ix ;cохраняются на стеке значения всех регистры процессора
push iy ;либо тех, которые изменются при выполнении ПП по адресу nn
push bc
push de
push hl
push af
exx
push bc
push de
push hl
ex af,af'
push af
call nn ;адрес вызываемый каждое прерывание (собственно, переход на ПП "повешаную" на прерывания)
pop af ;восстанавливаются значения регистров процессора
pop hl ;до момента прихода прерывания
pop de
pop bc
ex af,af'
pop af
exx
pop hl
pop de
pop bc
pop iy
pop ix
jp 38 ;переход по стандартному адресу обработки прерывания im1 (команда rst 56)

Для "запуска" и "остановки" писал нечто подобное:


di ; запретить прерывания
call nn ;адрес "инициализации" мелодии
ld a,m ;число m, вектор прерываний
ld i,a
im 2 ;включение режима
ei ;разрешить прерывания
ret
----

di
call nn ; адрес "заглушающий" каналы ПГЗ
ld a,3F ;установка "стандартного" вектора прерываний для нормальной работы в tr-dos
ld i,a
im 1 ;выключение режима im2
ei
ret

ace210
21.01.2011, 23:52
Вот все разъяснения
http://zx.pk.ru/showpost.php?p=212708&postcount=87