Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.12.2014, 08:51   #11
Mikl___
Участник клуба
 
Регистрация: 11.01.2010
Сообщений: 1,162
По умолчанию

Код:
;С-реализация -------------------------------
;x = 0
;y = b
;error = aa/4+bb-aa*b   
;deltaX = 0           // deltaX = 2bb * x0 = 2bb * 0 = 0
;deltaY	= aa2*b       // deltaY = 2aa * y0 = 2aa * b
;while(deltaX < deltaY)
;{
;	Set4Pixel()
;	if(error > 0)
;	{	--y
;		deltaY -= aa2
;		error -= deltaY
;	}
;	++x
;	deltaX += bb2
;	error -= bb + deltaX
;}
;error += (3*(aa - bb)/2 - (deltaX +deltaY))/2
;while( y >= 0 )
;{
;	Set4Pixel()
;	if( error < 0 )
;	{	++x
;		deltaX += bb2
;		error += deltaX
;	}
;	--y
;	deltaY -= aa2
;	error += aa - deltaY
;}
;-----------------------------------------------
start:	mov ax,12h
	int 10h
	push 0A000h
	pop es
;устанавливается регистр режима контроллера
	mov dx,3CEh ;порт ввода/вывода графического контроллера
	mov ax,5;AL=номер регистра режима AH=0 режим записи 0(биты 0,1)
	out dx,ax;режим чтения 0 (бит 4)
;устанавливается регистр сдвига данных/выбора функции
	mov ax,3        ;AH=0 биты чтения -модификации записи
			;AL=3 регистр сдвига данных/выбора функции
	out dx,ax
;устанавлваются регистры установки/сброса и разрешения установки/сброса
	mov ax,color*100h;AH=значение пиксела				
	out dx,ax       ;AL=номер регистра установки/сброса
	mov ax,0F01h	;AH=значение для регистра разрешения установки/сброса (все битовые плоскости разрешены)
	out dx,ax	;AL=номер регистра установки/сброса
;формируем пикселы от (0,b) до deltaY/deltaX= -1 
;инициализируем буфер адреса и битовую маску
	mov si,b*BytesPerLine;длина строки видеобуфера*относительное смещение в b
	mov di,b*BytesPerLine
	mov ax,Ycenter;ax=Ycenter
	mov bx,Xcenter;bx=Xcenter
	call PixelAddr10;ah=битовая маска es:bx->буфер 
			;cl=количество битов для сдвига влево
	mov ah,1
	shl ah,cl	;ah =битовая маска для первого пиксела
	mov LMask,ah
	mov RMask,ah
	add si,bx   	;si=смещение(0,b)
	mov ULAddr,si
	mov URAddr,si
	sub bx,di   	;bx=смещение(0,-b)
	mov LLAddr,bx
	mov LRAddr,bx
; цикл, пока deltaY/deltaX >=1
	mov bx,b	;BX:= начальная координата y
	xor cx,cx       ;CH:=0 (начальный инкремент y)
			;CL:=0 (начальный инкремент x)
L10:	mov eax,deltaX
	sub eax,deltaY
        jns L20         ;перейти, если deltaX >= deltaY
	call Set4Pixels
	mov cx,1	;CH:=0 (инкремент y)
			;CL:=1 (инкремент x)
	cmp error,0
	js L11
	mov ch,1        ;инкремент в направлении y
	dec bx		;декремент текущей координаты x
	mov eax,deltaY
	sub eax,aa2	;EAX:=deltaY - aa2
	mov deltaY,eax   ;deltaY -= aa2
	sub error,eax    ;error -= deltaY
L11:	mov eax,deltaX
	add eax,bb2	;EAX := deltaX + bb2
	mov deltaX,eax	;deltaX += bb2
	add eax,bb	;EAX := deltaX + bb
	add error,eax	;error += deltaX + bb
	jmp L10
; формируем пикселы от текущих (x,y), пока y < 0
; инициализируем буфер адреса и битовую маску
L20:	push bx		;сохраняем текущую координату y
	push cx		;сохраняем инкременты x и y
	mov eax,3*(aa-bb)/2
	sub eax,deltaX
	sub eax,deltaY	;EAX := 3*(aa - bb)/2 - (deltaX+deltaY)
	sar eax,1	;EAX := (3*(aa - bb)/2 - (deltaX+deltaY))/2
	add error,eax	;изменяем error
; цикл, пока y < 0
	pop cx          ;CH,CL := инкремент y и x			
	pop bx          ;BX := y 
L21:	call Set4Pixels
	mov cx,100h	;CH:=1 (инкремент y)
			;CL:=0 (инкремент x)
	cmp error,0
	jns L22         ;перейти, если error >= 0
	mov cl,1        ;инкремент в направлении x
	mov eax,deltaX
	add eax,bb2	;EAX := deltaX + bb2
	mov deltaX,eax	;deltaX += bb2
	add error,eax    ;error += deltaX
L22:	mov eax,deltaY
	sub eax,aa2	;EAX := deltaY - aa2
	mov deltaY,eax	;deltaY -= aa2
	sub eax,aa	;EAX := deltaY - aa
	sub error,eax	;error += aa - deltaY
	dec bx          ;декремент y
	jns L21         ;цикл, пока y >= 0
;восстанавливаем содержимое регистров контроллера по умолчанию
Lexit:	mov ax,0FF08h	;битовая маска по умолчанию
	mov dx,3CEh
	out dx,ax
	mov ax,3	;выбор функции по умолчанию
	out dx,ax
	mov ax,1	;разрешение установки/сброса по умолчанию
	out dx,ax
	mov ah,0	;жду нажатия на клавиатуру
	int 16h
	mov ax,3	;восстанавливаю текстовый режим
	int 10h
	retn		;выхожу из программы
Mikl___ вне форума Ответить с цитированием
Старый 13.12.2014, 08:56   #12
Mikl___
Участник клуба
 
Регистрация: 11.01.2010
Сообщений: 1,162
По умолчанию

Код:
;подпрограммы------------------------------------------
Set4Pixels proc	;СН = инкремент у (0, -1) 
		;CL = инкремент х (0, 1)
	push bx
	mov dx,3CEh	;порт контроллеров
	xor bx,bx
	test ch,ch
	jz L30		;перейти если инкремент у=0
	mov bx,BytesPerLine	;положительный инкремент
	neg bx			;отрицательный инкремент
L30:	mov al,8	;номер регистра битовой маски
;пикселы в (Xcenter-x,Ycenter+y) и (Xcenter-x,Ycenter-y)
	xor si,si
	mov ah,LMask
	rol ah,cl	;ah=битовая маска сдвинута горизонтально
	rcl si,1	;si=1, если битовая маска сдвинута полностью
	neg si		;si=0 или -1
	mov di,si	;di,si левый горизонтальный инкремент
	add si,ULAddr;si=новый верхний левый адрес + горизонтальный инкремент
	add si,bx	;si=новый верхний левый адрес
	add di,LLAddr
	sub di,bx	;di=новый нижний левый адрес
	mov LMask,ah	;обновляем эти переменные
	mov ULAddr,si
	mov LLAddr,di
	out dx,ax	;обновляем регистр битовой маски
	mov ch,es:[si]	;обновляем верхний левый пиксел
	mov es:[si],ch
	mov ch,es:[di]	;обновляем нижний левый пиксел
	mov es:[di],ch
;пикселы в (Xcenter+x,Ycenter+y) и (Xcenter+x,Ycenter-y)
	xor si,si
	mov ah,RMask
	ror ah,cl	;ah=битовая маска сдвинута горизонтально
	rcl si,1	;si=1, если битовая маска сдвинута полностью
	mov di,si	;di,si=правый горизонтальный инкремент
	add si,URAddr	;si=верхний правый адрес + горизонтальный инкремент
	add si,bx	;si=новый верхний правый адрес 
	add di,LRAddr
	sub di,bx	;di=новый нижний правый адрес
	mov RMask,ah	;обновляем эти переменные
	mov URAddr,si
	mov LRAddr,di
	out dx,ax	;обновляем регистр битовой маски
	mov ch,es:[si]	;обновляем верхний правый пиксел
	mov es:[si],ch
	mov ch,es:[di]	;обновляем нижний правый пиксел
	mov es:[di],ch
	pop bx
	retn
Set4Pixels endp

PixelAddr10 proc
	mov cl,bl
	imul ax,BytesPerLine
	shr bx,3
	add bx,ax
	and cl,7
	xor cl,7
	mov ah,1
	retn
PixelAddr10 endp
;данные----------------------------------------------------
ULAddr	dw ?
URAddr	dw ?
LLAddr	dw ?
LRAddr	dw ?
LMask	db ?
RMask	db ?
error	dd aa/4+bb-aa*b
deltaX	dd 0
deltaY	dd aa2*b
end start
Переделано из Абраш М. "Таинства программирования графики" К.: ЕвроСИБ, 1996
Код:
; masm dos com #
.model tiny
.code
.386
org 100h
SCREEN_WIDTH_IN_BYTES	equ 80;число байтов в строке в режиме 12h
GC_INDEX		equ 3CEh
SET_RESET_INDEX		equ 0  ;индекс регистра установки/сброса в GC
SET_RESET_ENABLE_INDEX	equ 1; индекс регистра разрешения установки/сброса в GC
BIT_MASK_INDEX		equ 8; регистр битовой маски
;рисуем эллипс заданных радиусов по осям X и Y и заданным цветом, используя
;метод с целыми числами и без извлечения корней, генерируя дугу для одного
;октанта в буфер, рисуем четыре симметричных дуги из этого буфера. Затем делаем
;то же самое для другой основной оси.
start:	mov ax,12h
	int 10h   	;640x480x16
	push 0A000h
	pop es    	;es=0A000h
@@:	cmp YRadius,240
	ja exit
	push Color1
	push YRadius
	push XRadius
	push 480/2
	push 640/2
	call DrawEllips
	dec Color1
	dec XRadius
	add YRadius,2
	jmp @b
exit:	mov ah,0
	int 16h		;ждем пока не надавят на клаву
	mov ax,3        ;восстанавливаем текстовый режим
	int 10h
	retn		;выходим из программы
Mikl___ вне форума Ответить с цитированием
Старый 13.12.2014, 09:02   #13
Mikl___
Участник клуба
 
Регистрация: 11.01.2010
Сообщений: 1,162
По умолчанию

Код:
;рисуем эллипс радиусом А по оси Х, радиусом В по оси Y и цветом Color, центр
;в точке (x, y). Радиусы должны быть положительными
DrawEllips proc
PixListPtr	equ word ptr  [bp-22h]
BB2	equ dword ptr [bp-20h]
AA2	equ dword ptr [bp-1Ch]
BB	equ dword ptr [bp-18h]
AA	equ dword ptr [bp-14h]
YAdjust		equ dword ptr [bp-10h]
XAdjust		equ dword ptr [bp-0Ch]
Threshold	equ dword ptr [bp-8]
WorkingY	equ word ptr [bp-4]
WorkingX	equ word ptr [bp-2]
X		equ word ptr [bp+4]
Y		equ word ptr [bp+6]
A		equ word ptr [bp+8]
B		equ word ptr [bp+0Ah]
Color		equ word ptr [bp+0Ch]
        push bp
	mov bp,sp
	sub sp,22h
	push si
	push di
	mov si,X
	mov di,Y
	movzx eax,B
	mul eax
	mov BB,eax	; BB = B*B
	shl eax,1
	mov BB2,eax	; BB2 =  B*B*2
;установим цвет с помощью установки/сброса 
	mov dx,GC_INDEX
	mov ax,0F00h or SET_RESET_ENABLE_INDEX
	out dx,ax		;outpw(GC_INDEX, (0x0F00) | SET_RESET_ENABLE_INDEX)
;разрешим установку/сброс для всех плоскостей
	mov ah,Color
	mov al,0
	out dx, ax		;outpw(GC_INDEX, (Color << 8) | SET_RESET_INDEX)
;установим цвет установки/сброса. Оставим индексный регистр GC указывающим на
;регистр битовой маски
	mov al,BIT_MASK_INDEX
	out dx,al		;outp(GC_INDEX, BIT_MASK_INDEX)
;рисуем четыре симметричные дуги, для которых продвижение по оси Х идет быстрее,
;то есть для которых Х - основная ось. Установим параметры рисования для первой
;точки (0, В). Вычислим все точки вдоль дуги размером 1/8 эллипса и разместим
;эту информацию в PixList
	mov PixListPtr,offset PixList;PixListPtr = PixList
	mov WorkingX,0		;WorkingX = 0
	mov XAdjust,0		;XAdjust = 0
	movzx eax,A
	mul eax
	mov AA,eax	; AA = A*A
	shl eax,1
	mov AA2,eax	; AA = A*A*2
	movzx edx,B
	imul eax,edx
	mov YAdjust,eax		;YAdjust = AA * 2 * B
	sar eax,1		;eax = AA * B
	mov ebx,AA
	shr ebx,2		;ebx = AA/4
	sub ebx,eax		
	mov Threshold,ebx	;Threshold = AA/4 - AA * B
;инкрементируем ошибку накопления до значения для следующей точки по оси Х
b1:	mov eax,XAdjust
	add eax,BB
	add Threshold,eax	;Threshold += XAdjust + BB
;если ошибка накопления прошла 0, значит, координата Y прошла более чем полпути
;к следующему пикселю и самое время перейти по оси Y и остановить новую ошибку
;накопления
	cmp Threshold,0       ;if (Threshold >= 0)
	mov bx,PixListPtr
	jl b2
	mov eax,AA2
	sub YAdjust,eax		;YAdjust -= AA * 2
	mov eax,YAdjust
	sub Threshold,eax       ;Threshold -= YAdjust
;перейдем по обеим осям
	mov byte ptr [bx],1     ;*PixListPtr++ = 1
	jmp short b3
;перейдем только вдоль оси Х
b2:	mov byte ptr [bx],0     ;else *PixListPtr++ = 0
b3:	inc PixListPtr
;инкрементируем координату Х
	mov eax,BB2
	add XAdjust,eax         ;XAdjust += BB * 2
	inc WorkingX            ;WorkingX++
;остановимся, если Х больше не основная ось (дуга прошла точку наклона 
;касательной в 45)
	mov eax,XAdjust
	cmp eax,YAdjust         ;if(XAdjust >= YAdjust ) break
	jl b1
;рисуем каждый из четырех симметричных октантов, для которых Х основная ось. 
;Дуги через одну выравниваем, чтобы не произошло наложения
        push offset PixList
	push 0
	push SCREEN_WIDTH_IN_BYTES
	push WorkingX
	mov ax,di;Y
	sub ax,B
	push ax;Y-B
	push si;X
	call DrawHOctant;(X, Y-B, WorkingX, SCREEN_WIDTH_IN_BYTES,0,PixList)
	push offset PixList+1
	push 1
	push SCREEN_WIDTH_IN_BYTES
	mov ax,WorkingX
	dec ax
	push ax;WorkingX-1
	movzx ax,PixList
	add ax,di;Y
	sub ax,B
	push ax;Y-B+(*PixList)
	mov dx,si
	inc dx
	push dx;X+1
	call DrawHOctant;(X+1, Y-B+(*PixList), WorkingX-1, SCREEN_WIDTH_IN_BYTES, 1, PixList+1)
	push offset PixList
	push 0
	push -SCREEN_WIDTH_IN_BYTES
	push WorkingX
	mov ax,di
	add ax,B
	push ax
	push si
	call DrawHOctant;(X, Y+B, WorkingX, -SCREEN_WIDTH_IN_BYTES,0,PixList)
	push offset PixList+1
	push 1
	push -SCREEN_WIDTH_IN_BYTES
	mov ax,WorkingX
	dec ax
	push ax
	movzx ax,PixList
	mov dx,di
	add dx,B
	sub dx,ax
	push dx
	mov ax,si
	inc ax
	push ax
	call DrawHOctant;(X+1, Y+B-(*PixList), WorkingX-1, -SCREEN_WIDTH_IN_BYTES, 1, PixList+1)
Mikl___ вне форума Ответить с цитированием
Старый 13.12.2014, 09:05   #14
Mikl___
Участник клуба
 
Регистрация: 11.01.2010
Сообщений: 1,162
По умолчанию

Код:
;рисуем четыре симметричные дуги, для которых продвижение по основной оси Х идет
;быстрее, то есть для которых Y - основная ось. Установим параметры рисования
;для начальной точки (А, 0). Вычислим все точки вдоль дуги 1/8 эллипса и
;разместим эту информацию в PixList
	mov PixListPtr,offset PixList;  PixListPtr = PixList
	mov WorkingY,0;  WorkingY = 0
	mov YAdjust,0;  YAdjust = 0
        mov ebx,BB
	mov eax,ebx
        movsx edx,A
        imul ebx,edx		;ebx = BB * A
        shr eax,2		;eax = BB / 4
	sub eax,ebx		;eax = BB / 4 - BB * A
        mov Threshold,eax	;Threshold = BB / 4 - BB * A
	shl ebx,1		;ebx = BB * 2 * A
	mov XAdjust,ebx		;XAdjust = BB * 2 * A
b4:     mov eax,YAdjust
	add eax,AA
	add Threshold,eax	;Threshold += YAdjust + AA
	cmp Threshold,0
        mov bx,PixListPtr
	jl b5
	mov eax,BB2
	sub XAdjust,eax		;XAdjust -= BB * 2
        mov eax,XAdjust
	sub Threshold,eax	;Threshold -= XAdjust
	mov byte ptr [bx],1	;*PixListPtr++ = 1
	jmp b6
b5:	mov byte ptr [bx],0	;*PixListPtr++ = 0
b6:     inc PixListPtr
	mov eax,AA2
	add YAdjust,eax		;YAdjust += AA * 2;
	inc WorkingY		;WorkingY++
	mov eax,YAdjust
	cmp eax,XAdjust  	;if(YAdjust >= XAdjust ) break;
  	jl b4
        push offset PixList
	push 1
	push -SCREEN_WIDTH_IN_BYTES
	push WorkingY
	push di
	mov ax,si
	sub ax,A
	push ax
	call DrawVOctant;  DrawVOctant(X-A, Y, WorkingY, -SCREEN_WIDTH_IN_BYTES,1,PixList);
	push offset PixList+1
	push 1
	push SCREEN_WIDTH_IN_BYTES
	mov ax,WorkingY
	dec ax
	push ax
	mov ax,di
	inc ax
	push ax
	movzx ax, PixList
	add ax,si
	sub ax,A
	push ax
	call DrawVOctant;  DrawVOctant(X-A+(*PixList), Y+1, WorkingY-1, SCREEN_WIDTH_IN_BYTES,1,PixList+1);
	push offset PixList
	push 0
	push -SCREEN_WIDTH_IN_BYTES
	push WorkingY
	push di
	mov ax,si
	add ax,A
	push ax
	call DrawVOctant;  DrawVOctant(X+A, Y, WorkingY, -SCREEN_WIDTH_IN_BYTES,0,PixList);
	push offset PixList+1
	push 0
	push SCREEN_WIDTH_IN_BYTES
	dec WorkingY
	push WorkingY
	inc di
	push di
	movzx ax,PixList
	add si,A
	sub si,ax
	push si
	call DrawVOctant;  DrawVOctant(X+A-(*PixList), Y+1, WorkingY-1, SCREEN_WIDTH_IN_BYTES,0,PixList+1);
	mov dx,GC_INDEX+1
	mov al,0FFh
	out dx,al		;  outp(GC_INDEX+1,0xFF)
	dec dx
	mov ax,SET_RESET_ENABLE_INDEX
	out dx,ax		;  outpw(GC_INDEX, SET_RESET_ENABLE_INDEX)
	pop di
	pop si
	leave
	retn 10
DrawEllips endp
; Рисуем дугу в октанте, в котором Х - основная ось. (x,y) - это первый пиксел
;дуги. HorizontalMoveDirection выбирает направление движения вдоль дуги по
;горизонтали - влево или вправо (0=влево, 1=вправо). RowOffset содержит смещение
;в байтах от данной линии сканирования до следующей и проверяет, отрисовывается
;дуга вверх или вниз, DrawLength - это горизонтальная длина в пикселах дуги, а 
;DrawList - это список, содержащий 0 для каждой точки, если следующая точка
;вертикально выровнена, и 1, если следующая точка на 1 пиксел по диагонали
;смещена влево или вправо
DrawHOctant proc
X			equ word ptr [esp+6]
Y			equ word ptr [esp+8]
DrawLength		equ word ptr [esp+10]
RowOffset		equ word ptr [esp+12]
HorizontalMoveDirection	equ word ptr [esp+14]
DrawList		equ word ptr [esp+16]

	push si
	push di
	imul dx,Y,SCREEN_WIDTH_IN_BYTES
	mov di,X
	mov cx,di
	sar di,3
	add di,dx		;di = ScreenPtr = (Y * SCREEN_WIDTH_IN_BYTES)+(X/8))
	and cx,7
	mov ax,80h
	sar ax,cl
	mov cl,al		;cl = BitMask = 0x80 >> (X & 7)
	mov si,DrawLength	;while (DrawLenght--)
b1:	mov dx,GC_INDEX+1
	mov al,cl		;al = BitMask
	out dx,al		;outp(GC_INDEX + 1, BitMask)
	or byte ptr es:[di],0FEh;*ScreenPtr |= 0xFE
	mov bx,DrawList
	inc DrawList
	cmp byte ptr [bx],0	;if(*DrawList++)
	jz b2
	add di,RowOffset	;ScreenPtr += RowOffset
b2:     cmp HorizontalMoveDirection,1
	jnz b3
	shr cl,1		;BitMask = BitMask >> 1
	jnz b4                  ;BitMask = 0?
	mov cl,80h		;BitMask = 80h
	inc di			;ScreenPtr++
	jmp b4
b3:	shl cl,1		;BitMask = BitMask << 1
	jnz b4                  ;BitMask = 0?
	mov cl,1		;BitMask = 1
	dec di			;ScreenPtr--
b4:	dec si
	jnz b1
	pop di
	pop si
	retn 12
DrawHOctant endp
; Рисуем дугу в октанте, в котором Y - основная ось. (x,y) - это первый пиксел
;дуги. HorizontalMoveDirection выбирает направление движения вдоль дуги по
;горизонтали - влево или вправо (0=влево, 1=вправо). RowOffset содержит смещение
;в байтах от данной линии сканирования до следующей и проверяет, отрисовывается
;дуга вверх или вниз, DrawLength - это вертикальная длина в пикселах дуги, а 
;DrawList - это список, содержащий 0 для каждой точки, если следующая точка
;вертикально выровнена, и 1, если следующая точка на 1 пиксел по диагонали
;смещена влево или вправо
Mikl___ вне форума Ответить с цитированием
Старый 13.12.2014, 09:06   #15
Mikl___
Участник клуба
 
Регистрация: 11.01.2010
Сообщений: 1,162
По умолчанию

Код:
DrawVOctant proc
X			equ word ptr [esp+6]
Y			equ word ptr [esp+8]
DrawLength		equ word ptr [esp+10]
RowOffset		equ word ptr [esp+12]
HorizontalMoveDirection	equ word ptr [esp+14]
DrawList		equ word ptr [esp+16]

	push si
	push di
;позиционируемся на байт, в котором находится первый пиксель
	imul dx,Y,SCREEN_WIDTH_IN_BYTES
	mov di,X
	mov cx,di		;cx = X
	sar di,3
	add di,dx		;di = Y * SCREEN_WIDTH_IN_BYTES + (X/8))
;установим начальную битовую маску
	and cx,7
	mov ax,80h
	shr ax,cl
	mov cl,al		;cl = BitMask = 0x80 >> (X & 7)
;рисуем все точки в DrawList 
	mov si,DrawLength	;while (DrawLenght--)
	test si,si
	jz b4
b1:	mov dx,GC_INDEX+1	;установим битовую маску пиксела
	mov al,cl		;al = BitMask
	out dx,al		;outp(GC_INDEX + 1, BitMask)
;рисуем пиксел. OR выполним, чтобы принудительно считать/записать для загрузки
;карманов. Записываемые данные значения не имеют, потому что установка/сброс
;разрешена для всех плоскостей
	or byte ptr es:[di],0FEh;*ScreenPtr |= 0xFE
;перейдем на следующий пиксель в соответствии с DrawList
	mov bx,DrawList
	inc DrawList
	cmp byte ptr [bx],0	;if(*DrawList++)
	jz b3
;шагнем по горизонтали, чтобы создать диагональное перемещение. Сдвинем битовую
;маску, перемещаясь на один байт по горизонтали, если битовая маска вырождается
	cmp HorizontalMoveDirection,1
	jnz b2
	shr cl,1		;BitMask = BitMask >> 1
	jnz b3                  ;BitMask = 0?
	mov cl,80h		;BitMask = 80h
	inc di			;ScreenPtr++
	jmp b3
b2:	shl cl,1		;BitMask = BitMask << 1
	jnz b3                  ;BitMask = 0?
	mov cl,1		;BitMask = 1
	dec di			;ScreenPtr--
b3:	add di,RowOffset        ;ScreenPtr += RowOffset
	dec si
	jnz b1
b4:	pop di
	pop si
	retn 12
DrawVOctant endp
Color1 dw 7
XRadius dw 319
YRadius dw 1
;максимальная длина вдоль основной оси равна 1/2 ширины экрана
PixList db SCREEN_WIDTH_IN_BYTES*8/2 dup(0)
end start
Mikl___ вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Fasm и Masm Arsenx777 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 2 27.06.2011 12:26
Из masm в fasm ( К среде ) Sobaka_ru Помощь студентам 0 12.12.2010 15:43
tasm>>fasm better Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 11 09.02.2009 19:34
Обьясните различия между - FASM, WASM, VASM, MASM, TASM Amancha Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 9 17.01.2009 15:38
Чем отличается Tasm от Masm veter_s_morya Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 17 21.07.2008 16:55