Mode D: A000 - A1F3F 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
Trang 1Do 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
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 vμo bộ nhớ mμn hình
input AH=0Ch AL=mμu BH=trang CX=x (cột)
Trang 2BX=n (số hiệu thanh ghi mμu) Output: 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
Trang 3BX=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
Trang 5col:=320; row:=240; color:=WHITE;
Trang 6Writeln('3 mau cua thanh ghi mau WHITE la: ');
Writeln('Red: ',color.red,'; Green: ',color.green,'; Blue: ',color.blue);
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
Trang 7Cá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 đó
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 vμo (Write) Địa chỉ đọc ra
Miscellaneous output 3C2 3CC
Feature control 3DA/3BA 3CA
Trang 8Input 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 vμo Địa chỉ đọc ra
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
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:
Trang 9Start horizontal Blank 2 nt nt
end horizontal Blank 3 nt nt
Start horizontal Retrace 4 nt nt
end horizontal Retrace 5 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
Underline location 14 nt nt
Start Vertical Blank 15 nt nt
End Vertical Blank 16 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
Trang 10Set/Reset O 3cf 3cf Enable Set/Reset 1 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:
Color plane enable 12 3CO 3C1
Horizontal pixel paning 13 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)
Trang 11Mỗ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:
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;
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:
Trang 12Vị 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)
Để 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 vμo Địa chỉ đọc ra
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:
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
Trang 13đ−a số liệu ra :
Để 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
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);
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ẽ
Trang 14trong 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
If ma[i]=0 Then b[i]:=b[i] And ($FF-m)
Else b[i]:=b[i] Or ma[i]; End;
Trang 15Procedure write_8_pixel(x,y: integer; Var b: four_byte);
Trang 16Else b[i]:=b[i] Or ma[i];
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
Trang 17tử (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ạ
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à
Trang 19Ví dụ 7: đọc nội dung thanh ghi màu thông qua cổng
Trang 20Writeln('3 mau cua thanh ghi mau WHITE la: ');
Writeln('Red: ',color.red,'; Green: ',color.green,'; Blue: ',color.blue);