description
Ecrit un pixel à l'écran.
prototype de la fonction
PutPixel PROTO, x:DWORD, y:DWORD, color:BYTE
code de la fonction
.data
currVPage BYTE 0
.code
PutPixel PROC, x:WORD, y:WORD, color:BYTE
pushad
push es
; ecx = 640*y+x
; ax = ecx/65536
xor eax,eax
mov ax,screen_width
mul y
shl edx,16
add eax,edx
xor ebx,ebx
mov bx,x
add eax,ebx
mov ecx,eax
shr eax,16
cmp al,currVPage
je L1
mov currVPage,al
mov dl,al
mov ax,4F05h
xor bx,bx
xor dh,dh
int 10h ; Set chunk
L1:
mov eax,0000A000h
mov es,ax
mov di,cx
mov al,color
mov es:[di],al
pop es
popad
ret
PutPixel ENDP
commentaire
Lorsque vous écrivez un programme graphique, vous avez souvent besoin d'accéder directement à la mémoire vidéo.
La mémoire occupée par une image varie généralement de quelques centaines de Ko à plusieurs Mo.
Hors, lorque vous écrivez un programme en mode réel 16 bits, la taille des segments est limitée à 64 Ko. Vous ne pouvez donc pas, à priori, accéder à l'ensemble de la mémoire vidéo.
Pour pallier ce problème, on peur définir une page mémoire vidéo qui sera visible à un instant donné. Lorsque l'on a fini d'écrire ou lire dans cette page mémoire, on passe à une autre page, et ainsi de suite...
Ce mécanisme nous permet d'utiliser de hautes résolutions graphiques, même dans un programme fonctionnant en mode réel.
| INT 10 4F05 - VESA SuperVGA BIOS - CPU VIDEO MEMORY CONTROL |
Inp.:
AX = 4F05h
BH = subfunction
00h select video memory window
DX = window address in video memory (in granularity units)
01h get video memory window
Return: DX = window address in video memory (in gran. units)
BL = window number
00h window A
01h window B
ES = selector for memory-mapped registers (VBE 2.0+, when called from
32-bit protected mode)
Return: AL = 4Fh if function supported
AH = status
00h successful
01h failed
Note: when using an accelerated video mode under VBE/AF v1.0P, the
application must call EnableDirectAccess before switching banks if
bit 9 of the video mode attributes flag is set (see #00080)
BUG: Phoenix S3 Trio64V+ v1.02-02 reportedly returns garbage in DX for
subfunction 01h
SeeAlso: AX=4F01h,AX=4F06h,AX=4F07h,AX=7000h/BX=0004h
INT 10
Copied from Ralf Brown's Interrupt List
|