Assembler - язык неограниченных возможностей


Трансцендентные функции - часть 3


; процедура display_picture ; изображает точку со следом

display_picture proc near call move_point ; переместить точку mov bp,73h ; темно-серый цвет в нашей палитре mov bx,3 ; точка, выведенная три шага назад, call draw_point ; изобразить ее dec bp ; 72h - серый цвет в нашей палитре dec bx ; точка, выведенная два шага назад, call draw_point ; изобразить ее dec bp ; 71h - светло-серый цвет в нашей палитре dec bx ; точка, выведенная один шаг назад, call draw_point ; изобразить ее dec bp ; 70h - белый цвет в нашей палитре dec bx ; текущая точка call draw_point ; изобразить ее ret display_picture endp

; процедура draw_point ; Ввод: BP - цвет ; BX - сколько шагов назад выводилась точка ; draw_point proc near movzx сx,byte ptr point_x[bx] ; Х-координата movzx dx,byte ptr point_y[bx] ; Y-координата call putpixel_13h ; вывод точки на экран ret draw_point endp

; процедура move_point ; вычисляет координаты для следующей точки, ; изменяет координаты точек, выведенных раньше

move_point proc near inc word ptr time and word ptr time,2047 ; эти две команды организуют ; счетчик в переменной time, который ; изменяется от 0 до 2047 (7FFh) mov еах,dword ptr point_x ; считать координаты точек mov ebx,dword ptr point_y ; (по байту на точку) mov dword ptr point_x[1],eax ; и записать их со сдвигом mov dword ptr point_y[1],ebx ; 1 байт mov di,word ptr time ; угол (или время) в DI imul di,di,SCALE_H ; умножить его на SCALE_H and di,2047 ; остаток от деления на 2048, shl di,2 ; так как в таблице 4 байта на косинус mov ax,50 ; масштаб по горизонтали mul word ptr cos_table[di+2] ; Умножение на косинус. ; Берется старшее слово (смещение + 2) от ; косинуса, записанного в формате 8:24, ; фактически происходит умножение на косинус ; в формате 8:8 mov dx,0A000h ; 320/2 (X центра экрана) в формате 8:8 sub dx,ax ; расположить центр фигуры в центре экрана mov byte ptr point_x,dh ; и записать новую текущую точку mov di,word ptr time ; угол (или время) в DI imul di,di,SCALE_V ; умножить его на SCALE_V add di,512 ; добавить 90 градусов, чтобы заменить ; косинус на синус. Так как у нас 2048 ; шагов на 360 градусов, ; 90 градусов - это 512 шагов and di,2047 ; остаток от деления на 2048, shl di,2 ; так как в таблице 4 байта на косинус mov ax,50 ; масштаб по вертикали mul word ptr cos_table[di+2] ; умножение на косинус mov dx,06400h ; 200/2 (Y центра экрана) в формате 8:8 sub dx,ax ; расположить центр фигуры в центре экрана mov byte ptr point_y,dh ; и записать новую текущую точку ret move_point endp




Начало  Назад  Вперед