inicio:
;buscar un modo de video soportado con 64k colores
xor cx,cx
mov cx,2
l1:
mov ax,cx
inc cx
cmp ax,5
jnc >l3
call setvideomode
test ax,ax
jz l1
mov dx,63
call mandeldibu ;hacer un dibujo
l2:
ret
l3: ;return message error
mov bx,1 ;std output
mov ah,40h ;dos write function
mov dx,mesage
mov cx,endmesage-mesage
int 21h
ret
mandeldibu:
mov ax,[w xmax]
mov cx,[w ymax]
pusha
finit
mov si,mandeldata2
mov bp,sp
fild [w xmax] ;xmax
fdivr [d si+8] ;lado_x
fstp [d bp] ;x_escala
fild [w ymax] ;ymax
fdivr [d si+12] ;lado_y
fstp [d bp+4] ;y_escala
l1:
finit
fild [w si+16]
fild [w bp+14] ;x
fmul [d bp] ;x_escala
fadd [d si] ;izq
fild [w bp+12] ;y
fmul [d bp+4]
fadd [d si+4]
fldz
fldz
mov cx,[bp+10] ;63
l3:
fld 1
fmul 2
fld 1
fmul 2
fld 1
fsub 1
fcomp 7
fstsw ax
sahf
jnb >l4
fsub
fadd 4
fchs
fxch 2
fmulp
fadd 0
fadd 2
loop l3
l4:
mov bx,[bp+14]
shl bx,6
mov bl,64
sub bl,cl
mov dl,cl
shl dl,3
add dl,64
shl bl,3
add bh,bl
add bl,bl
call setcolor
mov cx,[bp+14]
mov ax,[bp+12]
call setpixel
dec [w bp+14]
jns l1
mov ax,[w xmax]
mov [w bp+14],ax
dec [w bp+12]
jns l1
popa
ret
setvideomode: ;videomode en ax
pusha
mov bp,sp
sub sp,256 ;bufer para la bios vesa
shl ax,3
mov bx,videomodes64k
add bx,ax
mov es,ss
mov di,sp
mov cx,[bx]
db 102
push [bx+2]
mov ax,4f01 ;obtener informacion del modo de video
int 10h
cmp ax,4fh
je >l2
l1:
;funcion no soportada u otro error
mov sp,bp
popa
xor ax,ax
ret
l2:
mov bx,cx
mov ax,4f02
int 10h ;fijar el modo de video
cmp ax,4fh
jne l1
mov ax,[di+2] ;windows "a,b"
and ax,505h
cmp al,5 ;window "a" es de escritura
jne l1
cmp [w di+6],64 ;window size si 64k
jne l1
cmp [w di+8],0a000h ;video segment
jne l1
pop [w xmax]
pop [w ymax]
db 102 ;prefijo de 32 bits
push [di+12]
db 102
pop [fcvesa+1]
push [w di+16]
pop [w bytesporlinea]
push [w di+8]
pop es
mov cx,[di+4] ;granularidad ,debe ser una potencia de 2
xor ax,ax
shl cx,9
l1:
shl cx,1
jz >l2
inc al
jmp l1
l2:
mov [cs:fcvesa-1],al
l3:
mov [b ACPAG],0
mov sp,bp
popa
ret
setcolor:
;dl azul
;bl verde
;bh rojo
;retorna bx
and bx,0f8fch
shr dl,3
xchg dl,bl
xor dh,dh
shl dx,3
or bx,dx
ret
setpixel: ;x en cx,y en ax,color en bx
mul [w bytesporlinea]
add cx,cx
add ax,cx
adc dl,0
mov di,ax
cmp [b ACPAG],dl
jne >l1
mov [es:di],bx
ret
l1:
;vesabank cambia el banco de memoria de video
push bx
mov [b ACPAG],dl
xor bx,bx ;selecciona ventana 'A' ,que debe ser de escritura
sal dx,0fh ;cvar
fcvesa:
call 0ffffffffh ;cvar
pop bx
mov [w es:di],bx
ret
mandeldata2:
dd -2.0 ; izq
dd 2.0 ; arb
dd 4.0 ; lado_x
dd -4.0 ; lado_y
dw 8 ; limite
videomodes64k:
dw 11ah,1279,1023,0
dw 117h,1023,767,0
dw 114h,799,599,0
dw 111h,639,479,0
dw 10eh,319,199,0
xmax: dw 0
ymax: dw ?
bytesporlinea: dw ?
acpag: db ? ;numero del banco de memoria
mesage: db "no se encontro ningun modo de video valido"
db 10,13
endmesage:
Comentarios sobre la versión: Versión 1 (1)
pues tengo que realisar un pequeño proyecto y no me permiten usar un assembler completo
y grasis por el codigo
¡¡help¡¡