Truy xuất vùng nhớ - Pdf 20

Kỹ thuật truy xuất vùng nhớ máy tính
Lê Hoàng Tuấn
Ngay từ khi bắt đầu làm quen với ngôn ngữ lậptrình Pascal, ta đã biết dùng thủ tục Write
để xuất một chuỗi kí tự hay một giátrị ra màn hình. Đồng thời dùng thủ tục Textcolor và
Textbackground để định màuchữ và màu nền. Trong quá trình học Pascal có khi nào bạn
thử xuất dữ liệu tạitọa độ (80, 25) chưa Chẳng hạn:
Uses crt;
Begin
Gotoxy(80,25); { giả sử Modemàn hình là 80x25 }
Write("A");
Readln;
End;
Khi thử ví dụ trên, chữ A sẽkhông hiển thị tại tọa độ (80, 25) mà là (80, 24). Nguyên nhân
là do thủ tụcWrite xuất dữ liệu tại tọa độ con trỏ, sau đó con trỏ đứng liền kề kí tự
cuốicùng vừa xuất. Do không tồn tại tọa độ (81, 25) nên con trỏ nhảy xuống dòng kếtiếp
đẩy màn hình lên một dòng và tọa độ (80, 25) trở thành (80, 24).
Nhiềubạn sẽ cho rằng không cần thiết phải giải quyết vấn đề trên vì khi viết chươngtrình
chúng ta thường không có nhu cầu xuất dữ liệu tại tọa độ góc dưới bênphải màn hình (tọa
độ này thay đổi tùy theo mode màn hình 80x25, 40x25... ).Tuy nhiên vẫn có một số trường
hợp cần xuất dữ liệu tại tọa độ này. Chẳng hạn 2dòng: đầu và cuối màn hình có màu khác
với màu nền để ghi tên chương trình, tácgiả, kích thước file, ngày cập nhật... (giống như
giao diện của chương trìnhdiệt virus Bkav, D2... ).
Sau đây sẽ trình bày kĩ thuật truy xuấttrực tiếp vào vùng nhớ màn hình để khắc phục vấn
đề trên. Kĩ thuật này cũnggiúp ích nhiều cho việc trình bày màn hình ở chế độ văn bản khi
viết chươngtrình bằng Turbo Pascal.
Để thực hiện được kĩ thuật này trước tiênhãy tìm hiểu về cơ chế hoạt động của màn hình
máy vi tính.
Khi hoạt động, máy tính liên tục đọc bộ nhớRam để lấy các thông tin như hiển thị kí tự gì
với màu sắc gì và ở tọa độ nàotrên màn hình. Vùng nhớ chứa các thông tin này trong Ram
gọi là vùng nhớ mànhình (VNMH). Mỗi kí tự hiển thị tại một tọa độ nào đó trên màn hình
được lưutrữ trong VNMH bằng 2 byte: byte thứ nhất là byte thấp chứa mã ASCII của kí

offset:=2*(Cot-1) + 80*(dong-1) { đối với mode 40x25 }
Else offset:=2*(Cot-1) + 160*(dong-1); {đối với mode 80x25 }
End;
End;
Khi đã truy nhập vào VNMH, bạncó thể trình bày dữ liệu trên màn hình theo ý muốn hoặc
thay đổi các thông tintrong vùng nhớ này để tạo ra các hiệu ứng hình ảnh thú vị trong chế
độ văn bản.
Cú pháp truy xuất như sau:
Nếu chỉ muốn truy xuất vào 1 trong 2 byte (byte thấpchứa mã kí tự, byte cao chứa thuộc
tính màu) thì dùng biến Mem:
Mem[Segment:Offset(x,y)+1]:=Mau;
Mem[Segment:Offset(x,y)]:=Ord(KiTu);
Nếu muốn truy xuất vào cả hai byte thì dùng biến Memw:
Memw[Segment:Offset(x,y)]:=(MauShl 8) + Ord(KiTu);
Ví dụ 1: Viết ra màn hình chứ A màu xanh trên nền trắngtại tọa độ (80, 25). Giả sử
mode màn hình là 80x25.
Đầu tiên xác định địa chỉSegment của VNMH và lấy địa chỉ Offset của tọa độ (80,25), sau
đó thực hiện cúpháp như nói trên.
Var Seg,Off : word;
Begin
Seg:=Segment;
Off:=Offset(80,25);
Memw[Seg:Off]:=($71 Shl 8) +Ord("A");
Readln;
End.
Ví dụ 2: Truy xuất vào byte cao nơi chứa thuộc tính màusẽ cho phép định lại màu của 1
toạ độ bất kì. Bằng cách này có thể tạo nhiều hiệu ứnghình ảnh thú vị, tương tự cách dùng
thủ tục Putpixel của Turbo Pascal mà bạnNguyễn Xuân Tài đã đề cập trong bài viết Điểm,
màu & Toán học (TH&NT số 6 - 2000). Sự khác nhau giữa hai cách này là một bên hoạt
độngtrong chế độ văn bản còn bên kia hoạt động trong chế độ đồ họa. Tất nhiên hìnhảnh

p1,p2:^word;
x,y:byte;
sobyte:word;
Begin
for y:=y1 to y2 - 1 do
Begin
p1:=ptr(segment,offset(x1,y+1));
p2:=ptr(segment,offset(x1, y));
sobyte:=2*(x2 - x1+1);
move(p1^,p2^,sobyte);
End;
for x:=x1 to x2 do {Tạo dòng trống cùng màu nền}
memw[segment:offset(x,y2)]:=(maunenshl 8) + ord(' ');
End;
Thủ tục cuộn một vùng màn hình xuống 1 dòng:
Procedure Cuonxuong(x1,y1,x2,y2,maunen:byte);
Var


Nhờ tải bản gốc

Tài liệu, ebook tham khảo khác

Music ♫

Copyright: Tài liệu đại học © DMCA.com Protection Status