Как правильно включить, куда указывать вектор для правильной работы на всех машинах, ну и еще какие фишки, С ПРИМЕРАМИ!!!!
Вид для печати
Как правильно включить, куда указывать вектор для правильной работы на всех машинах, ну и еще какие фишки, С ПРИМЕРАМИ!!!!
вектор в верхней памяти, лучше от #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
Sinus, я всё никак не могу понять, почему 257, а не 256 байт надо заливать?
потому что на шину данных во время прихода прерывания может прийти 255 (собственно, так и будет, если на спеке стабильная подтянутая резюками на +5V ШД).
т.е. если I=#80, а пришло #FF, то проц будет смотреть адрес процедуры по #80FF/#8100
так разве байт на 8100 не будет 256-ым?
по счету - нет. 256й байт - это FF.
moroz1999, будет 257-м... с #8000 по #80FF(включительно) будет 256 байт данных.
Хм, я наоборот обработчик в медленную память помещал, главное что бы вектор прерывания был в быструю память, таблица 257 байт в быстрой памяти, но сам обработчик в медленной. Потому что прерывание обрабатывается за время пока идет отрисовка верхнего бордюра, а в это время проц и так не тормозится. И до того как луч доходит до экрана уже все изменение произведены, курсор впечатан в новой позиции и обработка прерывания окончена. Таким образом я экономил быструю память под какие-нибудь быстрые процедуры.
я предпочитаю перестраховаться.
да и как-то у меня ни разу такого не было, чтоб под код памяти на хватило :) вот под данные - это да.
Если такой вот вопрос поднялся-
Как корректно кинуть какой-нибудь процесс в IM2,например воспроизведение музыки+опрос клавы?
Я раньше делал это в gens (лет 10 назад) -получалось,а счас чет не получается...
Помню процедуру обработки брал из книги Как написать игру на ассемблере..
Я делал так:Цитата:
Как корректно кинуть какой-нибудь процесс в 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
[свернуть]
Вот все разъяснения
http://zx.pk.ru/showpost.php?p=212708&postcount=87