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
Другие статьи номера:
Похожие статьи:
В этот день... 21 ноября