hmsayedjoody
یک شنبه 08 آذر 1388, 14:50 عصر
سلام دوستان چطور مي شه از تفكيك 800 در 600 با حداقل 16 رنگ در اسمبلي استفاده كرد.
در ضمن نحوه دسترسي مستقيم به حافظه گرافيكي چطور مي باشد.
(حالت متني رو مي دونم )
با تشكر
tdkhakpur
یک شنبه 08 آذر 1388, 15:50 عصر
یک نمونه از کار گرافیکی
Line macro x1,y1,x2,y2,color
LOCAL else1, jmp1, jmp2
LOCAL else2
LOCAL else3
LOCAL while1
LOCAL while2
LOCAL next1
LOCAL next2
LOCAL continue1
LOCAL continue2
LOCAL exit
;dy = y2 - y1;
mov ax,y2
sub ax,y1
mov ddy,ax
;dx = x2 - x1;
mov ax,x2
sub ax,x1
mov ddx,ax
;if (dy < 0) { dy = -dy; stepy = -1; } else { stepy = 1; }
cmp ddy,0
jge else1
neg ddy
mov stepy,-1
jmp far ptr next1
else1: mov stepy,1
next1:
;if (dx < 0) { dx = -dx; stepx = -1; } else { stepx = 1; }
cmp ddx,0
jge else2
neg ddx
mov stepx,-1
jmp far ptr next2
else2: mov stepx,1
next2:
;dy=2*dy , dx=2*dx
mov ax,ddy
add ax,ax
mov ddy,ax
mov ax,ddx
add ax,ax
mov ddx,ax
;X=x1 , Y=y1
mov ax,x1
mov XX,ax
mov ax,y1
mov YY,ax
;putpixel(XX,YY,color)
mov cx, XX ; column
mov dx, YY ; row
mov al, color ; white
mov ah, 0ch ; put pixel
int 10h
mov ax,ddx
cmp ax,ddy
jng else3
;if(dx>dy)
;{
;fraction =2*dy-dx
mov ax,ddy
add ax,ax
sub ax,ddx
mov fraction,ax
while1: mov ax, XX
cmp ax, word ptr x2
;je far ptr exit
jne jmp1
jmp far ptr exit
jmp1:
;while (XX!=x2)
;{
cmp fraction,0
jl continue1
;Y += stepy
mov ax,YY
add ax,stepy
mov YY,ax
;fraction -= dx
mov ax,fraction
sub ax,ddx
mov fraction,ax
continue1: ;X += stepx
mov ax,XX
add ax,stepx
mov XX,ax
;fraction += dy
mov ax,fraction
add ax,ddy
mov fraction,ax
;putpixel(XX,YY,color)
mov cx, XX ; column
mov dx, YY ; row
mov al, color ; white
mov ah, 0ch ; put pixel
int 10h
jmp far ptr while1
;}
;}
else3: ;else
;{
;fraction = 2*dx-dy
mov ax,ddx
add ax,ax
sub ax,ddy
mov fraction,ax
while2: mov ax, YY
cmp ax,word ptr y2
;je far ptr exit
jne jmp2
jmp far ptr exit
jmp2:
;while (YY!=y2)
;{
cmp fraction,0
jl continue2
;XX += stepx
mov ax,XX
add ax,stepx
mov XX,ax
;fraction -= dy
mov ax,fraction
sub ax,ddy
mov fraction,ax
continue2: ;YY += stepy
mov ax,YY
add ax,stepy
mov YY,ax
;fraction += dx
mov ax,fraction
add ax,ddx
mov fraction,ax
;putpixel(XX,YY,color)
mov cx, XX ; column
mov dx, YY ; row
mov al, color ; white
mov ah, 0ch ; put pixel
int 10h
jmp far ptr while2
;}
;}
exit:
endm
Rectangle macro x1,y1,x2,y2,color
Line x1,y1,x2,y1,color
Line x2,y1,x2,y2,color
Line x2,y2,x1,y2,color
Line x1,y2,x1,y1,color
endm
stseg segment
dw 32 dup(?)
stseg ends
dtseg segment
;DIGIT1 DB 3,?,3 DUP(?)
;DIGIT2 DB 3,?,3 DUP(?)
;AMALGAR DB 2,?,2 DUP (0)
;RESULT DB '= $'
msg1 db 'Finish$'
msg2 db 'x1<x2$'
;......Line......
ddx dw ?
ddy dw ?
XX dw ?
YY dw ?
stepx dw ?
stepy dw ?
fraction dw ?
x1 dw 10
y1 dw 10
x2 dw 30
y2 dw 30
color db 3
dtseg ends
cdseg SEGMENT
main PROC FAR
ASSUME CS:CDSEG,SS:STSEG,DS:DTSEG
MOV AX,DTSEG
MOV DS,AX
mov ah, 0 ; set display mode function.
mov al, 13h ; mode 13h = 320x200 pixels, 256 colors.
int 10h ; set it!
Rectangle x1,y1,x2,y2,color
lea dx,msg1
mov ah,09h
int 21h
xor al, al ; al = 0
mov cx, 10 ; column
mov dx, 20 ; row
mov ah, 0dh ; get pixel
int 10h
; pause the screen for dos compatibility:
;wait for keypress
mov ah,00
int 16h
; return to text mode:
mov ah,00 ; set display mode function.
mov al,03 ; normal text mode 3
int 10h ; set it!
main ENDP
;...........Procedure Line.........
;Line PROC
; mov cx, 10 ; column
; mov dx, 20 ; row
; mov al, 15 ; white
; mov ah, 0ch ; put pixel
; int 10h
; RET
;Line ENDP
cdseg ends
end main
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.