Tải bản đầy đủ (.pdf) (21 trang)

Đồ họa máy tính - Chương 1 Màn hình của máy tính - Bài 2 pptx

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (502.32 KB, 21 trang )

Kỹ thuật Đồ hoạ máy tính
8
12 640*480 1 16 8*16
- Chúng ta có thể tự hạn chế về số trang cho mỗi chế độ của màn hình.
Ví dụ:
- Mode E có tất cả 128000 pixel/page. Vì 8 pixel ứng với một byte trên một bit
plane do đó cần 16000 byte/bit plane/ page - một trang cần 64000 byte xấp xỉ 64 kb.
Do vậy tối đa chỉ có thể hiển thị đợc 4 trang.
- Mode D: có 64000 pixel/ page. Vì pixel ứng với một byte trên một bit plane do
đó cần 8000 byte/ bit plane/ page - một trang cần 32000 byte xấp xỉ 32kb/page do
đó tối đa chỉ có thể có 8 trang.
- Ngời ta cũng có thể biết đợc địa chỉ đầu của mỗi trang trong từng chế độ
làm việc của màn hình.
Mode D: A000 - A1F3F
A200 - A3F3F
A400 - A5F3F
A600 - A7F3F
A800 - A9F3F
AA00 - ABF3F
AC00 - ADF3F
AE00 - AFF3F
Mode E: A000 - A3E7F
A400 - A7E7F
A800 - ABE7E
AC00 - AFE7E


$2. Truy cập vo bộ nhớ mn hình
Về nguyên tắc có 2 cách để truy cập bộ nhớ màn hình và các thanh ghi
+ Cách 1: Sử dụng các dịch vụ ngắt của ROM BIOS, ROM BIOS cung cấp
tơng đối đầy đủ các chơng trình con ứng với các ngắt để phục


vụ cho công việc này
+ Cách 2: Truy cập trực tiếp đa vào các địa chỉ của các cổng (port) thông
qua các ngôn ngữ lập trình
Cách 1 đơn giản tuy nhiên có nhợc điểm tốc độ truy nhập chậm
I. Sử dụng các dịch vụ ngắt Int 10H của ROM BIOS
Dới đây là một vài ngắt của ROM BIOS
1. Đa một pixel vo bộ nhớ mn hình
input AH=0Ch
AL=mu
BH=trang
CX=x (cột)
Kỹ thuật Đồ hoạ máy tính
9
DX=y (dòng)

Procedure writepixel(col,row,color: integer);
Var
v : Registers;
Begin
v.ah:=$0C;
v.al := color;
v.bh:=0;
v.cx:=col;
v.dx:=row;
intr($10,v);
End;
2. Đọc dữ liệu của một pixel
input AH=ODh
BH=trang
CX=x (cột)

DX=y (dòng)
output: AL=Color (giá trị mu của pixel)
Function readpixel(col,row: integer): integer;
Var
v : Registers;
Begin
v.ah:=$0D;
v.bh:=0;
v.cx:=col;
v.dx:=row;
intr($10,v);
readpixel:=v.al;
end;
3. Đọc dữ liệu từ thanh ghi mu (color Register)
Input: AH=10h
AL=15h
BX=n (số hiệu thanh ghi mu)
Output: CH=độ kích hoạt mu Green
CL=độ kích hoạt mu Blue
DH=độ kích hoạt mu Red
Type
RGB_COLOR_TYP = Record
Kü thuËt §å ho¹ m¸y tÝnh
10
red : Word;
green : Word;
blue : Word;
End;
Procedure read_color_reg(index: integer;Var color: RGB_COLOR_TYP);
Var

R : registers;
Begin
R.ax:=$1015;
R.bx:=index;
intr($10,R);
color.red:=R.dh;
color.green:=R.ch;
color.blue:=R.cl;
End;
4. Ghi mμu vμo mét thanh ghi mμu (Color Register)
Input: AH=10h
AL=10h
BX=sè hiÖu thanh ghi mμu
CH=®é kÝch ho¹t mμu green
CL=®é kÝch ho¹t mμu Blue
DH=®é kÝch ho¹t mμu Red
Type
RGB_COLOR_TYP = Record
red : Word;
green : Word;
blue : Word;
End;
Procedure write_color_reg(index: Integer;color: RGB_COLOR_TYP);
Var
R : registers;
Begin
R.ax:=$1010;
R.bx:=index;
R.dh:=color.red;
R.ch:=color.green;

R.cl:=color.blue;
intr($10,R);
End;
C¸c vÝ dô:
VÝ dô 1: §−a mét pixel vµo bé nhí mµn h×nh
Kü thuËt §å ho¹ m¸y tÝnh
11
Uses Crt,dos,Graph;
Var
v : Registers;
gd,gm,col,row,color: integer;
Procedure writepixel(col,row,color: integer);
Var
v : Registers;
Begin
v.ah:=$0C;
v.al := color;
v.bh:=0;
v.cx:=col;
v.dx:=row;
intr($10,v);
End;
Begin
Write('Nhap toa do diem: ');
Readln(col, row);
Write('Nhap mau ve diem: ');
Readln(color);
gd:=0;
initgraph(gd,gm,' ');
writepixel(col,row,color);

Readln;
closegraph;
End.
VÝ dô 2:
§äc d÷ liÖu cña mét pixel
Uses Crt,dos,Graph;
Var
v : Registers;
gd,gm,col,row,color: integer;
Function readpixel(col,row: integer): integer;
Var
v : Registers;
Begin
v.ah:=$0D;
v.bh:=0;
v.cx:=col;
v.dx:=row;
intr($10,v);
readpixel:=v.al;
end;
Begin
gd:=0;
initgraph(gd,gm,' ');
Kỹ thuật Đồ hoạ máy tính
12
col:=320; row:=240; color:=WHITE;
putpixel(col,row,color);
directvideo:=false;
Writeln('Mau cua diem la: ',readpixel(col,row));
Readln;

closegraph;
End.
Ví dụ 3 :
đọc nội dung thanh ghi màu thông qua ngắt
Program Read_Write_Color_Registers;
Uses crt,graph,dos;
Type
RGB_COLOR_TYP = Record
red : Word;
green : Word;
blue : Word;
End;
Procedure set_mode(mode: integer);
Var
R : registers;
Begin
R.ax:=$4f02;
R.bx:=mode;
intr($10,R);
End;
Procedure writepixel(col,row,color: integer);
Var
R : registers;
Begin
R.ah:=$0C;
R.al := color;
R.bh:=0;
R.cx:=col;
R.dx:=row;
intr($10,R);

End;
Procedure write_color_reg(index: Integer;color: RGB_COLOR_TYP);
Var
R : registers;
Begin
R.ax:=$1010;
R.bx:=index;
R.dh:=color.red;
R.ch:=color.green;
R.cl:=color.blue;
intr($10,R);
Kỹ thuật Đồ hoạ máy tính
13
End;
Procedure read_color_reg(index: integer;Var color: RGB_COLOR_TYP);
Var
R : registers;
Begin
R.ax:=$1015;
R.bx:=index;
intr($10,R);
color.red:=R.dh;
color.green:=R.ch;
color.blue:=R.cl;
End;

Var
gd,gm,x,y,index: integer;
color: RGB_COLOR_TYP;
Begin

clrscr;
gm:=$13;
set_mode(gm);
directvideo:=false;
index:=WHITE;
read_color_reg(index,color);
Writeln('3 mau cua thanh ghi mau WHITE la: ');
Writeln('Red: ',color.red,'; Green: ',color.green,'; Blue: ',color.blue);
Readkey;
index:=Blue;
color.red:=63;
color.green:=0;
color.blue:=63;
write_color_reg(index,color);
(* Ve duong thang ngang *)
y:=100;
for x:=0 To 319 Do
writepixel(x,y,index);
Readkey;
gm:=3; (* Text Mode *)
set_mode(gm);
End.
II. Hệ thống các thanh ghi của màn hình
Bộ nhớ màn hình dùng để chứa thông tin hay dữ liệu của điểm ảnh. Để tạo ra màu
sắc hiển thị điểm ảnh trên màn hình, màn hình còn có một hệ thống các thanh ghi
(Register) tơng đối phức tạp, các thanh ghi này cho phép ngời lập trình gián tiếp
hoặc trực tiếp truy nhập, dới đây chúng ta sẽ tìm hiểu sơ lợc về hệ thống các thanh
ghi của màn hình
Kỹ thuật Đồ hoạ máy tính
14

Các thanh ghi của màn hình rất nhiều song có thể phân chia thành 6 nhóm cơ bản đó
là các nhóm sau:
1. Nhóm general (External Register)
2. Nhóm Sequence Register
3. Nhóm CRTC Register
4. Nhóm Graphics Register
5. Attribute Register
6. Nhóm Color Register (Chỉ có ở VGA)
Chú ý:
Chỉ các thanh ghi của nhóm General và thanh ghi chọn màu (Color Select Register)
của nhóm Attribute Register là có thể truy nhập trực tiếp vào nó thông qua cổng I/O
(I/O port) nghĩa là ngời lập trình có thể dùng các lệnh In, Out để truy cập vào các
thanh ghi này thông qua địa chỉ của cổng
Các thanh ghi còn lại đợc truy nhập gián tiếp thông qua thanh ghi địa chỉ (address
Register) và thanh ghi dữ liệu (data Register) hai thanh ghi này có địa chỉ liên lạc
thông qua địa chỉ cổng
Có thể minh hoạ:
Các thanh ghi trong nhóm thanh ghi thuộc tính không truy nhập theo phơng pháp
trên, dùng cùng một địa chỉ cổng để lấy địa chỉ và dữ liệu ở địa chỉ 3C0
Nhóm 1 (General hay External Register)
Nhóm này có 4 thanh ghi có độ dài 8 bit, nhiệm vụ của các thanh ghi nhóm này là
thiết lập trạng thái cách thức kiểm tra chế độ làm việc của màn hình nhóm 1 cho ở
bảng sau:
Tên thanh ghi Địa chỉ ghi vo (Write) Địa chỉ đọc ra
Miscellaneous output 3C2 3CC
Feature control 3DA/3BA 3CA
Input Status #0 0 3C2

Kỹ thuật Đồ hoạ máy tính
15

Input Status #1 3DA/3BA 3DA/3CA
Nhóm 2 (Sequencer Register)
Nhóm này gồm 6 thanh ghi không có địa chỉ liên lạc với bộ nhớ, nó dùng một thanh
ghi trong nhóm làm thành địa chỉ, thanh ghi này chứa chỉ số của thanh ghi trong
nhóm cần truy nhập và một thanh ghi dữ liệu
Các thanh ghi của nhóm cho trong bảng sau:
Tên thanh ghi Chỉ số thanh ghi Địa chỉ ghi vo Địa chỉ đọc ra
address 3C4 3C4
Reset 0 3C5 3C5
Clock mode 1 3C5 3C5
Map mask 2 3C5 3C5
Character Map
Mask
3 3C5 3C5
Memory mode 4 3C5 3C5
Trong số các thanh ghi của nhóm trên chúng ta quan tâm đến thanh ghi Map Mask
thanh ghi này có nhiệm vụ xác định bit plane đợc truy cập. Các thanh ghi trong
nhóm CRTC coi bộ nhớ màn hình là một dãy 32 bit. Một thanh ghi 32 bit đợc tạo
ra để liên hệ giữa các thanh ghi trong nhóm CRTC và bộ nhớ màn hình. Mỗi lần đa
số liệu vào bộ nhớ màn hình 4 byte đợc đa vào 4 bit plane. Thanh ghi Map Mask
có nhiệm vụ xem bit plane nào đợc sửa đổi. Dạng của thanh ghi này nh sau:
6 5 4 3 2 1
b3 b2 b1 b0
bj =
0 việc truy cập bit plane không cho phép
1 việc truy cập bit plane cho phép





Nhóm 3 (CRTC)
Nhóm này gồm 26 thanh ghi với EGA, 24 thanh ghi với VGA. Chức năng của nhóm
này xác định các thông tin về số hàng, số cột, chiều cao, chiều rộng, của chế độ hiển
thị Nó đợc truy cập thông qua thanh ghi địa chỉ và thanh ghi dữ liệu
Các thanh ghi của nhóm này cho trong bảng sau:
Tên gọi thanh ghi Chỉ số
thanh ghi
Địa chỉ ghi địa chỉ đọc
address 3D4/3B4 3D4/3B4
Horizontal Total 0 3D5/3B5 3D5/3B5
Horizontal Display end 1 nt nt
Kỹ thuật Đồ hoạ máy tính
16
Start horizontal Blank 2 nt nt
end horizontal Blank 3 nt nt
Start horizontal Retrace 4 nt nt
end horizontal Retrace 5 nt nt
vertical total 6 nt nt
overflow 7 nt nt
preset row scan 8 nt nt
max scan line 9 nt nt
cursor start A nt nt
cursor end B nt nt
Start address high C nt nt
Start address low D nt nt
Cursor location hight E nt nt
Cursor location low F nt nt
Vertical Retrace start 10 nt nt
Vertical Retrace low 11 nt nt
Vertical Display end 12 nt nt

offset 13 nt nt
Underline location 14 nt nt
Start Vertical Blank 15 nt nt
End Vertical Blank 16 nt nt
Mode control 17 nt nt
Line compare 18 nt nt

Nhóm 4 (Graphics Controller Registers)
Nhóm này gồm 9 thanh ghi các thanh ghi trong nhóm đợc truy cập thông qua
thanh ghi địa chỉ và thanh ghi dữ liệu
Tên gọi thanh ghi Chỉ số Địa chỉ ghi Địa chỉ đọc
Graphics address 3CE 3CE
Kỹ thuật Đồ hoạ máy tính
17
Set/Reset O 3cf 3cf
Enable Set/Reset 1 3cf 3cf
Color Compare 2 3cf 3cf
data Rotate 3 3cf 3cf
Read Map 4 3cf 3cf
Mode 5 3cf 3cf
Miscelaneous 6 3cf 3cf
Color don't care 7 3cf 3cf
Bit Map 8 3cf 3cf
Các thanh ghi Set/Reset, Enable Set/Reset và các bitplan có sự tơng ứng 1-1. Thanh
ghi Set/Reset chứa khuôn mẫu cần ghi vào bit plane, enable Set/Reset chỉ ba bit
plane nào cần đợc sửa
Nhóm 5: (attribute controler Register)
Nhóm này gồm 21 thanh (EGA có 20 thanh) các thanh ghi của nhóm cho ở bảng
dới đây:
Tên thanh ghi Chỉ số Địa chỉ ghi vo Địa chỉ đọc ra

address 3CO 3C1
Palette
O ữF
3CO 3C1
Mode control 10 3CO 3C1
Overscan color 11 3CO 3C1
Color plane enable 12 3CO 3C1
Horizontal pixel paning 13 3CO 3C1
Color Select 14 3CO 3C1
Nhóm này có 16 thanh ghi palette mỗi thanh ghi palette đợc sử dụng để chuyển dữ
liệu từ bộ nhớ màn hình thành màu. Mỗi thanh ghi palett có độ dài 16 bit (nó tạo từ
RAM) nó xác định giá trị tơng ứng với pixel trong bộ nhớ màn hình. Đối với VGA
các giá trị này lại là giá trị trỏ đến thanh ghi màu trong nhóm 256 thanh ghi màu.
Khi hoạt động ở chế độ của VGA, thanh ghi palette chứa 6 bit, 6 bit này tạo ra địa
chỉ để trỏ vào một trong 64 thanh ghi màu
Mã màu trong thanh ghi pallette tạo theo nguyên tắc sau:
6 bit mã màu đợc chia thành hai nhóm
Nhóm màu cơ bản RGB (3 bit)
Nhóm màu thay đổi cờng độ của màu tơng ứng R1G1B1 (3 bit)
Kỹ thuật Đồ hoạ máy tính
18
Mỗi màu có 4 khả năng tạo từ các cặp R1R, G1G, B1B và do đó tất cả 64 màu. Các
màu tạo ra theo tỉ lệ sau:
(R1G1B1) (RGB) Cờng độ kích hoạt
0 0 0%
0 1 33%
1 0 66%
1 1 100%

III. Truy cập trực tiếp qua cổng và bộ nhớ màn hình

Việc truy nhập vào màn hình thông qua các dịch vụ ngắt của ROM BIOS rất chậm
không đáp ứng đợc các yêu cầu của các ứng dụng về đồ hoạ để tăng tốc độ truy
nhập ngời ta phải truy cập trực tiếp vào bộ nhớ màn hình thông qua các cổng (port)
1. Chế độ 320x200 256 màu
Đây là chế độ mode $13 và bộ nhớ màn hình đợc tổ chức thành mảng một chiều
(dạng gói) gồm có 320x200=64000 phần (tơng đơng 64K) tử mỗi phần tử là một
byte. Bộ nhớ của máy chủ dành cho bộ nhớ màn hình là 64K từ A000:0000 đến
A000:FFFF (65536 byte hay 64KB), để vẽ một điểm có toạ độ (x,y) lên màn hình ta
chỉ cần gán Mem[$A000:320*y+x]:=Color; Còn để đọc màu của một điểm có toạ
độ (x,y) trên màn hình ta chỉ cần gán Color:=Mem[$A000:320*y+x];
Sau đây là các thủ tục đọc ghi :
Const Buffer: Word = $A000;
Procedure writepixel(col,row,color: integer);
Var address : Word;
Begin
address:=320*row+col;
Mem[Buffer: address]:=color;
End;
Function readpixel(col,row: integer): Byte;
Var address : Word;
Begin
address:=320*row+col;
readpixel :=Mem[Buffer: address];
End;
2. Chế độ 640x480 16 màu
Giả sử ở các mode 16 màu (D,E,10,12 là các chế độ 4 bit plane) màn hình có độ
phân giải n x m (n số cột, m số hàng) để xác định vị trí của byte chứa pixel có toạ độ
(x,y) ta có thể xác định theo công thức:
k = y * n div 8 + x div 8
Vị trí của bit liên quan đến pixel có toạ độ (x,y) đợc xác lập theo công thức:

Kỹ thuật Đồ hoạ máy tính
19
Vị trí bit = 7 - (x mod 8)
Ví dụ: ở chế độ phân giải 640 x 480 pixel có toạ độ (100,100)
byte chứa thông tin của pixel là byte thứ k
k=100x640 div 8 + 100 div 8= 8000+12=8012
Vị trí của bit trong byte thứ k
l=7-(x mod 8) (phần d x chia cho 8)
Để tăng tốc độ tính toán ta dùng phép đẩy phải (Shr) thay
cho thay cho phép lấy phần d (Mod)

Điểm 0 1 2 3 4 5 6 7
Byte Bit Plane 7 6 5 4 3 2 1 0
1 B 1 0 1 1 0 0 0 1
2 G 0 1 0 0 1 1 0 1
3 R 1 1 1 1 0 0 1 0
4 I 0 0 0 0 1 1 0 1
IRGB 0101 0110 0101 0101 1010 1010 0100 1011
Để ghi ra màn hình trong chế độ 4 bit plane chúng ta phải ghi đồng thời 8 điểm, mỗi
điểm gồm có 4 bit màu và 4 bit màu đó lại nằm trong 4 byte ở cùng vị trí giống nh
ở bảng trên. Ta hãy xem lại nhóm 2 (Sequencer Register), trong nhóm này thanh ghi
số 2 (Map Mask) sẽ xác định bit plane nào đợc truy cập:
Tên thanh ghi Chỉ số thanh ghi Địa chỉ ghi vo Địa chỉ đọc ra
address 3C4 3C4
Map mask 2 3C5 3C5
Mỗi lần đa số liệu vào bộ nhớ màn hình, 4 byte đợc đa vào 4 bit plane. Thanh
ghi Map Mask có nhiệm vụ xem bit plane nào đợc sửa đổi. Dạng của thanh ghi này
nh sau:
b3 b2 b1 b0


0001, 0010, 0100, 1000
để truy nhập vào một bit plane ta cần hai lệnh
Lệnh 1 : xác định thanh ghi cần truy nhập là thanh ghi mapmask
Lệnh 2 : đa số liệu bit plane cần truy cập vào thanh ghi mapmask
Hai lệnh có dạng:
port[$3C4]:=2; (Vào thanh ghi cần truy cập)
port[$3C5]:= n; (đa số liệu bitplan cần truy cập vào thanh ghi Mapmask)
(n=1,2,4,8)
Và ta cần 4 lần nh vậy để truy cập vào 4 bit plane
Thủ tục ghi 8 điểm ra màn hình bằng 4 byte :
Procedure write_8_pixel(x,y: integer; Var b: four_byte);
Var
Kỹ thuật Đồ hoạ máy tính
20
j,address: Integer;
Begin
port[$3c4]:=2;
address:=y*80+(x shr 3);
j:=1;
For i:=0 To 3 Do
Begin
port[$3c5]:=j;
Mem[buffer:address]:=b[i];
j:=j*2;
End;
End;
Để đọc trên màn hình trong chế độ 4 bit plane chúng ta phải đọc đồng thời 8 điểm,
mỗi điểm gồm có 4 bit màu và 4 bit màu đó lại nằm trong 4 byte ở cùng vị trí. Ta
chú ý đến nhóm thanh ghi thứ 4 (Graphics Control Register). Trong nhóm có thanh
ghi mang chỉ số 4 (Read Map), thanh ghi này xác định bit plane nào sẽ đợc phép

đa số liệu ra :
Tên gọi thanh ghi Chỉ số Địa chỉ ghi Địa chỉ đọc
Graphics address 3CE 3CE
Read Map 4 3cf 3cf
Để thực hiện phép đọc một bit plane nào đó chúng ta cần có hai lệnh:
Lệnh 1. Xác định số hiệu của thanh ghi trong nhóm cần truy nhập
Lệnh 2: Xác định số hiệu bitplane
Lệnh 1: Port($3ce):=4;
Lệnh 2: Port($3cf):=bitplane;
Và ta cần 4 lần nh vậy để truy cập vào 4 bit plane
Type
four_byte = array[0 3] of Byte;
Thủ tục đọc 8 điểm trên màn hình vào 4 byte :
Procedure read_8_pixel(x,y: integer; Var b: four_byte);
Var
address,color: integer;
Begin
address:=y*80+(x shr 3);
port[$3ce]:=4;
for i:=0 To 3 Do
Begin
port[$3cf]:=i;
b[i]:=Mem[buffer:address];
End;
End;
Thủ tục vẽ một điểm : để vẽ một điểm trên màn hình ta đọc 4 byte liên quan đến
điểm đó (4 byte ứng với 8 điểm có chứa điểm cần vẽ), mà vị trí của điểm cần vẽ
Kỹ thuật Đồ hoạ máy tính
21
trong 8 điểm đánh số từ 0 đến 7 là p=7-(x mod 8), sau đó ta thay bit thứ p của mỗi

byte trong 4 byte đó bằng bit màu cần vẽ (bằng cách đổi màu cần vẽ điểm ra cơ số 2
ví dụ n=5 thì n=0101)
Procedure putdot(x,y,n: integer);
Var
p,m: byte;
ma: four_byte;
Begin
p:=7-(x mod 8);
m:=1;
For i:=1 To p Do m:=m*2;
For i:=0 To 3 Do
Begin
ma[i]:=(n shr i) mod 2;
ma[i]:=ma[i]*m;
End;
read_8_pixel(x,y,b);
For i:=0 To 3 Do
Begin
If ma[i]=0 Then b[i]:=b[i] And ($FF-m)
Else b[i]:=b[i] Or ma[i]; End;
write_8_pixel(x,y,b);
End;
Ví dụ 4:
Ghi một điểm ảnh vào bộ nhớ màn hình ở chế độ 4 bit plane thông qua
cổng.
Program Four_Bit_Planes;
Uses Crt,dos;
Const
buffer: Word=$A000;
gd: integer=0;

Type
four_byte = array[0 3] of Byte;
Var
gm,x,y,i: integer;
b: four_byte;
(**********************)
Procedure set_mode(mode: integer);
Var
R : registers;
Begin
R.ax:=$4f02;
R.bx:=mode;
intr($10,R);
End;
(**********************)
Kü thuËt §å ho¹ m¸y tÝnh
22
Procedure write_8_pixel(x,y: integer; Var b: four_byte);
Var
j,address: Integer;
Begin
port[$3c4]:=2;
address:=y*80+(x shr 3);
j:=1;
For i:=0 To 3 Do
Begin
port[$3c5]:=j;
Mem[buffer:address]:=b[i];
j:=j*2;
End;

End;
(**********************)
Procedure read_8_pixel(x,y: integer; Var b: four_byte);
Var
address,color: integer;
Begin
address:=y*80+(x shr 3);
port[$3ce]:=4;
for i:=0 To 3 Do
Begin
port[$3cf]:=i;
b[i]:=Mem[buffer:address];
End;
End;
(**********************)
Procedure putdot(x,y,n: integer);
Var
p,m: byte;
ma: four_byte;
Begin
p:=7-(x mod 8);
m:=1;
For i:=1 To p Do m:=m*2;
For i:=0 To 3 Do
Begin
ma[i]:=(n shr i) mod 2;
ma[i]:=ma[i]*m;
End;
read_8_pixel(x,y,b);
For i:=0 To 3 Do

Begin
If ma[i]=0 Then b[i]:=b[i] And ($FF-m)
Kỹ thuật Đồ hoạ máy tính
23
Else b[i]:=b[i] Or ma[i];
End;
write_8_pixel(x,y,b);
End;
(**********************)
Begin
Set_mode($12);
y:=150;
for x:=0 To 639 Do
putdot(x,y,Magenta);
Readkey;
y:=300;
for x:=0 To 639 Do
putdot(x,y,Yellow);
Readkey;
Set_mode(3);
End.
Ví dụ 5:
Đọc dữ liệu từ chế độ 4 bit plane thông qua các cổng của các thanh ghi
Đoạn chơng trình sau mô tả cách đọc một điểm ảnh từ bộ nhớ màn hình
Program Read_Pixel_Color;
Uses Crt,dos,graph;
Const
buffer: Word=$A000;
gd: integer=0;
Var

gm,x,y: integer;
Function getdot(x,y: integer): integer;
Var
i,address,b,color: integer;
c: array[0 3] of integer;
Begin
address:=y*80+(x shr 3);
port[$3ce]:=4;
b:=x mod 8;
for i:=0 To 3 Do
Begin
port[$3cf]:=i;
c[i]:=Mem[buffer:address];
c[i]:=c[i] shl b;
c[i]:=c[i] shr 7;
End;
color:=c[0]+2*c[1]+4*c[2]+8*c[3];
getdot:=color;
End;
Begin
Kỹ thuật Đồ hoạ máy tính
24
initgraph(gd,gm,'c:\tp\bgi');
directvideo:=false;
x:=320;y:=240;
putpixel(x,y,WHITE);
Writeln('Mau cua diem la : ',getdot(x,y));
readkey;
closegraph;
End.

3. Chế độ 640x480 256 màu (mode $101)
Ta xét trờng hợp đọc/ghi vào bộ nhớ màn hình ở chế độ 256 màu theo chuẩn VESA
(chú ý trong TP ứng với mode $101 độ phân giải 640x480, 256 màu) ở chế độ này
bộ nhớ màn hình đợc tổ chức thành 5 mảng một chiều, mỗi mảng gồm 65536 phần
tử (mỗi phần tử là 1 byte, mỗi byte ứng với 1 pixel) và do đó ta cần có 5 mảng đánh
số từ 0 đến 4 để có thể chứa đợc 640x480 byte. Mỗi một mảng nh vậy gọi là một
Bank (dải), nh vậy một bank 64K đúng bằng 64K mà bộ nhớ của máy chủ dành
cho màn hình, mà có 5 bank nh vậy (do đó bộ nhớ màn hình phải có ít nhất là 64K
x 5 = 320K thì mới có thể đặt đợc chế độ này) và bộ nhớ của máy chủ chỉ có thể
ánh xạ vào một bank của bộ nhớ màn hình và để cho bank (từ 0-4) nào đợc ánh xạ
ta dùng thủ tục sau :
Procedure setbank(banknum: Integer);
Var R : Registers;
Begin
R.ax:=$4f05;
R.bx:=0;
R.dx:=banknum;
Intr($10,R);
End;
Một điểm có toạ độ (x,y) trên màn hình sẽ là điểm thứ linear_address:=y*640+x;
Mà mỗi một bank có 65536 điểm nên điểm đó sẽ nầm ở bank thứ
bank_num:=linear_address Div 65536; và địa chỉ của điểm đó ở bank này là
pixel_offset:=linear_address Mod 65536;
Ví dụ 6:

Đoạn chơng trình sau mô tả thủ tục đọc/ghi điểm ảnh ở chế độ 256 màu
Program VGA_256_Color;
Uses Crt,Dos;
Const
buffer: Word=$A000;

Var
v : Registers;
x,y,mode: Integer;
Procedure set_mode(mode: Integer);
Begin
v.ax:=$4f02;
v.bx:=mode;
Intr($10,v);
Kü thuËt §å ho¹ m¸y tÝnh
25
End;
Procedure setbank(banknum: Integer);
Begin
v.ax:=$4f05;
v.bx:=0;
v.dx:=banknum;
Intr($10,v);
End;
Procedure putdot(x,y: LongInt; color: Integer);
Var
linearaddress: LongInt;
banknum: Integer;
pixeloffset: Word;
Begin
linearaddress:=y*640+x;
banknum:=linearaddress Div 65536;
pixeloffset:=linearaddress Mod 65536;
setbank(banknum);
Mem[buffer:pixeloffset]:=color;
End;

Function getdot(x, y: LongInt): Integer;
Var
linearaddress: LongInt;
banknum,color: Integer;
pixeloffset: Word;
Begin
linearaddress:=y*640+x;
banknum:=linearaddress Div 65536;
pixeloffset:=linearaddress Mod 65536;
setbank(banknum);
getdot:=Mem[buffer:pixeloffset];
End;

Begin
clrscr;
mode:=$101; (* 640x480, 256 mau *)
set_mode(mode);
directvideo:=False;
x:=320; y:=240;
putdot(x,y,WHITE);
Writeln('Mau cua diem la : ',getdot(x,y));
Readkey;
mode:=3; (*80x25x16*)
set_mode(mode);
End.
Kỹ thuật Đồ hoạ máy tính
26
Ví dụ 7: đọc nội dung thanh ghi màu thông qua cổng
Program Read_Write_Color_Registers;
Uses crt,graph,dos;

Const
COLOR_MASK=$3C6;
COLOR_REG_RD=$3C7;
COLOR_REG_WR=$3C8;
COLOR_DATA= $3C9;
Type
RGB_COLOR_TYP = Record
red : Word;
green : Word;
blue : Word;
End;

Procedure set_ mode(mode: integer);
Var
R : registers;
Begin
R.ax:=$4f02;
R.bx:=mode;
intr($10,R);
End;

Procedure write_color_reg(index: Integer;color: RGB_COLOR_TYP);
Begin
port[COLOR_REG_WR]:=index;
port[COLOR_DATA]:=color.red;
port[COLOR_DATA]:=color.green;
port[COLOR_DATA]:=color.blue;
End;

Procedure read_color_reg(index: integer;Var color: RGB_COLOR_TYP);

Begin
port[COLOR_REG_RD]:=index;
color.red:=port[COLOR_DATA];
color.green:=port[COLOR_DATA];
color.blue:=port[COLOR_DATA];
End;

Var
VIDEO_BUFFER : Word;
gd,gm,x,y,index: integer;
color: RGB_COLOR_TYP;

Kü thuËt §å ho¹ m¸y tÝnh
27
Begin
clrscr;
VIDEO_BUFFER:=$A000;
gm:=$13;
set_ mode(gm);
directvideo:=false;
index:=WHITE;
read_color_reg(index,color);
Writeln('3 mau cua thanh ghi mau WHITE la: ');
Writeln('Red: ',color.red,'; Green: ',color.green,'; Blue: ',color.blue);
Readkey;
index:=BLUE;
color.red:=63;
color.green:=0;
color.blue:=63;
write_color_reg(index,color);

(* Ve duong thang ngang *)
y:=100;
for x:=0 To 319 Do
Mem[VIDEO_BUFFER:y*320+x]:=index;
Readkey;
gm:=3; (* Text Mode *)
set_graph_mode(gm);
End.
VÝ dô 8:
lµm mµn h×nh s¸ng tèi dÇn dÇn
Program Display;
Uses crt,dos;
Const
COLOR_MASK=$3C6;
COLOR_REG_RD=$3C7;
COLOR_REG_WR=$3C8;
COLOR_DATA= $3C9;
b: Integer = 1;
type
RGB_COLOR_TYP = Record
red : Word;
green : Word;
blue : Word;
End;
Procedure set_mode(mode: integer);
Var
R : registers;
Begin
R.ax:=$4f02;
R.bx:=mode;

Kü thuËt §å ho¹ m¸y tÝnh
28
intr($10,R);
End;
Procedure write_color_reg(index: Integer;color: RGB_COLOR_TYP);
Begin
port[COLOR_REG_WR]:=index;
port[COLOR_DATA]:=color.red;
port[COLOR_DATA]:=color.green;
port[COLOR_DATA]:=color.blue;
End;
Var
VIDEO_BUFFER : Word;
gm,index,n: integer;
color: RGB_COLOR_TYP;
Begin
clrscr;
VIDEO_BUFFER:=$A000;
gm:=$13;
set_mode(gm);
index:=0;
n:=2;
Repeat
n:=n+b;
color.red:=n;
color.green:=0;
color.blue:=n;
write_color_reg(index,color);
Delay(150);
If n>60 Then b:=-1;

If n<4 Then b:=1;
Until KeyPressed;
gm:=3; (* Text Mode *)
set_mode(gm);
End.

$3. C¸c thuËt to¸n vÏ ®o¹n th¼ng,
®−êng trßn
I. VÏ ®o¹n th¼ng :

×