|
Buzz
#16
26 сентября 1998 |
|
Ассемблер - Прицнип програм. подсчета колчества тактов в строке.

__ --/
· - = Ё │<A│< Р\/ЛИ│Ь 8 ╫((ЕМБЛЕРЕ /80 Ё = - ·
/ /--
▓▓░ ▓▓▓▓▓▓▓▓▓▓▓▓▓ ░▓▓
▓▓▓▓░ ▓▓░ ░▓▓ ░▓▓
▓▓░ ▓▓░ ▓▓▓▓▓▓▓▓▓ ░▓▓ ░▓▓▓▓
▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ ▓▓░ ▓▓░ ░▓▓ ░▓▓ ░▓▓ ░▓▓ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ ▓▓▓▓▓▓░ ▓▓░ ░▓▓ ░▓▓▓▓▓▓ ░▓▓ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
▀▀▀▀▀▀▀▀▀▀▀▀▀▀ ▓▓░ ░▓▓ ░▓▓ ░▓▓ ░▓▓ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
▓▓░ ▓▓░▓▓ ░▓▓ ░▓▓ ░▓▓
▓▓░ RULEZ! ▓▓▓ ░▓▓ ░▓▓ ░▓▓
(C) J/C.I.C.
В этой статье я кратко изложу принцип программного подсчета
количества тактов в строке (за сколько тактов видео-контроллер
перешлет 1 строку изображения на монитор). Для чего это надо:
для создания крутых эффектов на бордюре, multicolor'а и т.п. Эти
эффекты будут правильно работать на всех компах кроме динозавров
с медленной памятью и машине, где количество строк по вертикали
не 320 или 312. Програмный изврат, о котором я Вам сейчас пове-
даю, будет автоматически настраиваться под любой попавшийся ему
в руки комп, но надо будет только ему указать количесво строк по
вертикали и все !
А теперь ближе к делу. Сначала немного теории. Как, Вы дума-
ете, задается количество тактов между прерываниями ? Может где-
то на плате запаян счетчик который и отсчитывает нужное количес-
тво ? Нет ! Все совсем проще. Как известно, у нормального компа
312 или 320 вертикальных строк изображения (вместе с экраном и
бордюром). Так вот, когда ULA (video-контроллер) эти строки пе-
редаст монитору, приходит прерывание, а затем все опять по цик-
лу. Но у компов разное количество тактов между прерываниями, а
количество строк совпадает. Значит, у них за разное время переб-
расывается 1 строка. Известно также, что ULA за 1 такт при 3.5
мгц перебрасывает 2 точки на монитор (и это константа). Значит,
на разных компьютерах разное количество точек по горизонтали !!!
Теперь можно вывести формулу: количество строк * количество
тактов в строке = количество тактов между прерываниями - и это
со 100%-й точностью !!! Допустим, что количество тактов между
прерываниями приблизительно можно сосчитать. Количество строк
укажет user (или coder) при инсталяции, и количество тактов в
строке неизвестное, которое можно найти опять же по формуле (это
математика): количество тактов между прерываниями / на количест-
во строк = неизвестное (если будет остаток при делении , то ре-
зультат нужно будет от-INC'рементить).
А теперь программа:
DI
LD A,#18
LD (#FFFF),A
LD A,#C3
LD (65524),A
LD HL,INT1
LD (65525),HL ;адрес обработки прерывания
LD HL,#BE00
LD DE,#BE01
LD (HL),255
LD A,H
LD I,A
LD BC,#0100 ;генерируем таблицу векторов
LDIR ;прерывания
IM 2 ;установка 2 режима прерывания
LD DE,0
LD HL,INT2
EI
HALT
......
INT1 LD (65525),HL ;новый адрес обработки прерывания
LD HL,INT3
EI
HALT
......
INT2 LD (65525),HL ;опять кладется новый адрес
EI
INC DE ;цикл подсчета тактов
JP $-1
;
INT3 POP HL
POP HL ;для того чтобы вернуться по RET
EX DE,HL ;к первому HALT'у
ADD HL,HL ;HL * 8
ADD HL,HL
ADD HL,HL
LD A,N ;N=0 если 312 строк, иначе 320
OR A
LD BC,156 ;а вот догадайтесь сами, почему
JP Z,INT4 ;156 вместо 312 и 160 вместо 320
LD BC,160
XOR A
INT4 OR A
SBC HL,DE ;деление как по формуле ...
INC A
JP NC,INT4 ;теперь в A будет количество
;тактов в строке.
Поясню, что 3 раза я записывал разный адрес обработки преры-
вания для того, чтобы на некоторых глючных компах (на моем к
примеру) все работало О.К., а если вместо 3 раз будет 2 раза, то
на выходе в A может запросто оказаться 1.
Пока !
P.S. Если читателю будет интересно, то в следующий раз цикл ста-
тей может быть продолжен. Например, как сделать бегушку на бор-
дюре ...
J/C.I.C.
08.07..98
Другие статьи номера:
Похожие статьи:
В этот день... 20 ноября