Просмотр полной версии : Прерывания IM 2
Как правильно включить, куда указывать вектор для правильной работы на всех машинах, ну и еще какие фишки, С ПРИМЕРАМИ!!!!
вектор в верхней памяти, лучше от #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
moroz1999
20.01.2011, 23:48
так разве байт на 8100 не будет 256-ым?
по счету - нет. 256й байт - это FF.
moroz1999, будет 257-м... с #8000 по #80FF(включительно) будет 256 байт данных.
а с чего вдруг такой вопрос?
В последней только есть IM 2 (да и то откуда-то взято), в остальных нет. Вот и решил спросить как правильно делать
желательно чтоб адрес обработчика тоже лежал в быстрой памяти, т.е. #8000, #8181, #8282, и т.д.
Хм, я наоборот обработчик в медленную память помещал, главное что бы вектор прерывания был в быструю память, таблица 257 байт в быстрой памяти, но сам обработчик в медленной. Потому что прерывание обрабатывается за время пока идет отрисовка верхнего бордюра, а в это время проц и так не тормозится. И до того как луч доходит до экрана уже все изменение произведены, курсор впечатан в новой позиции и обработка прерывания окончена. Таким образом я экономил быструю память под какие-нибудь быстрые процедуры.
я предпочитаю перестраховаться.
да и как-то у меня ни разу такого не было, чтоб под код памяти на хватило :) вот под данные - это да.
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
Вот все разъяснения
http://zx.pk.ru/showpost.php?p=212708&postcount=87
Powered by vBulletin® Version 4.2.5 Copyright © 2026 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot