• Авторизация


Заголовок: (не обязателен) 14-11-2006 14:06 к комментариям - к полной версии - понравилось!


Вариант скриншота на асме))

вверх^ к полной версии понравилось! в evernote
Комментарии (1):
yaorange 14-11-2006-14:06 удалить
uses crt; const MyRandVal: word = 1; MyScreenCenter: word = 0; MaxBarSize = 20; MyScreenBarSize: word = 1; MyScreenColor: byte = 14; var SaveOldHandler: pointer; CurrCoordinate: word; CurrColor: byte; IndX,IndY: word; begin asm { Графический режим монитора, 320x200, 256 цветов } mov ax,0013h int 10h { Устанавили обработчик прерывания 1Ch - таймер } { Сначала сохраняем старый обработчик } { Обратились к DOS за адресом старого обработчика } mov ax,351Ch int 21h { Адрес старого обработчика вернулся в es:bx } { Запоминаем } mov word ptr SaveOldHandler,bx mov word ptr SaveOldHandler+2,es { Зададём обработчик прерывания 1Ch } push ds { Сохранить регистр ds } mov dx,offset @@OurHandlerOf1ChVector mov ax,cs mov ds,ax { Обратились к DOS, чтобы он установил новый обработчик } mov ax,251Ch int 21h pop ds { Восстановить регистр ds } { Обойдем обработчик прерывания и попадем в цикл ожидания клавиш } jmp @@WaitForAnyKey { Наш обработчик прерывания 1Ch } @@OurHandlerOf1ChVector: { В эту точку программы попадаем примерно 18 раз в секунду } push es { Сохранить регистр es } push ax { Сохранить регистр ax } push dx { Сохранить регистр dx } mov ax,seg @Data { получение сегментного адрес на Паскале!!!11 } mov es,ax { области данных (var + const) } { Умножаем MyRandVal на число 16807 } mov ax,16807 mul word ptr es:MyRandVal { dx:ax = MyRandVal * 16807 } { Запоминаем значение (MyRandVal * 16807) mod 2^16 в MyRandVal } mov word ptr es:MyRandVal,ax { Инициализируем новое значение центра на экране } mov word ptr es:MyScreenCenter,ax { Инициализируем начальное значение размера квадрата на экране } mov word ptr es:MyScreenBarSize,1 { Инициализируем новое значение цвета на экране } mov byte ptr es:MyScreenColor,al pop dx { Восстановить регистр dx } pop ax { Восстановить регистр ax } pop es { Восстановить регистр es } iret @@WaitForAnyKey: end; { Цикл опроса клавиатуры ~ repeat until keypressed } repeat { Рисуем квадрат размером MyScreenBarSize с центром в MyScreenCenter } CurrColor:=MyScreenColor; for IndY:=1 to MyScreenBarSize do begin for IndX:=1 to MyScreenBarSize do begin CurrCoordinate:=MyScreenCenter+IndY*320+IndX; asm { Заносим в регистр es адрес видеопамяти - 0A000h } mov ax,0A000h mov es,ax { Рисуем точку с координатой CurrCoordinate и цветом CurrColor } mov bx,ds:CurrCoordinate mov al,CurrColor mov byte ptr es:[bx],al end; end; end; { Увеличиваем текущий размер квадрата } inc(MyScreenBarSize); { Если размер стал более чем MaxBarSize } if MyScreenBarSize>=MaxBarSize then MyScreenBarSize:=1; { Проверяем кейбоард } until keypressed; { Считываем клавишу ~ readkey } readkey; asm { Восстановили старый обработчик прерывания 1Ch } { Адрес старого обработчика хранили в ячейке SaveOldHandler } { Получим его в ds:dx, ds сохраняем } push ds { Сохранить регистр ds } lds dx,ds:SaveOldHandler { Обратились к DOS, чтобы он восстановил старый обработчик } mov ax,251Ch int 21h pop ds { Восстановить регистр ds } { Устанавливаем текстовый режим монитора, всё!))) } mov ax,0003h int 10h end; end.


Комментарии (1): вверх^

Вы сейчас не можете прокомментировать это сообщение.

Дневник Заголовок: (не обязателен) | yaorange - Некоторые проявления неких внутренних форм. | Лента друзей yaorange / Полная версия Добавить в друзья Страницы: раньше»