Bài thực hành số 7
Lập trìnhmàn hình
Mục đích
Hiểu được cách tổ chức bộ nhớ mànhình cho chế độ text 80x25 16 màu và chế độ graphic
SVGA 800x600 256 màu
Biết truy xuất bộ nhớ bằng ngắt 10h và bằng cách đọc/ghi vào vùng nhớ màn hình
Tóm tắt lý thuyết
T ổ chức bộ nhớ
Thông tin thể hiện trên mànhình được quy định bởi dữ liệu ghi trong vùng nhớ màn hình. Dữ
liệu này được tổ chức khác nhau tùy vào chế độ thể hiện (display mode).
Trong chế độ 03h (text 16 màu, 80x25) vùng nhớ mànhình bắt đầu từ địa chỉ B800h:0000. Mỗi
màn hình có 80x25 = 2000 kí tự. Mỗi kí tự được lưu trữ bởi 2 byte, byte thứ nhất lưu mã ASCII,
byte thứ hai lưu thuộc tính thể hiện (bit 7 : nhấp nháy, bit 6-4 : màu nền, bit 3-0 : màu chữ). Như vậy
mỗi mànhình ứng với 4000 byte. Trong chế độ này (03h) ta có thể sử dụng 4 trang mànhình khác
nhau, đánh số từ 0 đến 3. Tại mỗi thời điểm chỉ có một trang được hiển thị, các trang khác ẩn nhưng
vẫn có thể ghi dữ liệu lên đó. Địa chỉ của trang thứ k là B8000h + k x 1000h, nghĩa là mỗi trang
chiếm 4096 byte, mặc dù chỉ 4000 byte là được sử dụng.
Trong chế độ 103h (SVGA, graphic 256 màu, 800x600) vùng nhớ mànhình bắt đầu từ địa chỉ
A000h:0000. Mỗi điểm ảnh ứng với 1 byte lưu chỉ số màu. Như vậy, vùng nhớ mànhình trải dài
480000 byte, chia làm nhiều trang. Mỗi trang có kích thước bằng một segment 64KB. Chỉ số màu
của điểm ảnh chính là số thứ tự của màu trong bảng màu. Mỗi màu trong bảng màu được xác định
bởi 18 bit đại diện cho tỉ lệ 3 thành phần màu (R,G,B), mỗi thành phần 6 bit nhận giá trị từ 0 đến 63.
Ở chế độ này, mànhình có thể biểu diễn được 2
18
màu khác nhau, nhưng tại một thời điểm thì chỉ
thể hiện 256 màu khác nhau.
Một số hàm của ngắt 10h (BIOS)
AH = 00h. Thay đổi chế độ hiển thị
AL : chế độ hiển thị. Nếu bit 7 bật thì mànhình không bị xóa khi thay đổi chế độ hiển thị.
AL = 03h. Chọn chế độ đồ họa 80x25, 16 màu.
AH = 0Fh. Lấy chế độ hiển thị hiện thời. Kết quả:
AH : số cột
AL : chế độ hiển thị
BH : trang hiện thời
AH = 01h. Thay đổi kích thước con trỏ.
CH : dòng quét đầu
CL : dòng quét cuối
AH = 02h. Thay đổi vị trí con trỏ.
DH : dòng
DL : cột
BH : trang
AH = 05h. Thay đổi trang thể hiện.
AL : trang
AH = 0Ah. In ra kí tự tại vị trí con trỏ.
BH : trang
AL : mã ASCII
CX : lặp bao nhiêu lần
AH = 09h. In ra kí tự tại vị trí con trỏ, nhưng cho phép đặt thuộc tính cho kí tự.
BH : trang
BL : thuộc tính
AL : mã ASCII
CX : lặp bao nhiêu lần
AH = 0Eh. In ra kí tự tại vị trí con trỏ, dịch con trỏ sang vị trí tiếp theo.
BH : trang
AL : mã ASCII
AX = 4F02h. In ra kí tự tại vị trí con trỏ, dịch con trỏ sang vị trí tiếp theo.
BX : chế độ đồ họa ( = 103h : chể độ SVGA 256 màu 800x600)
Nếu kết quả trả về trong AX khác với 004Fh thì hệ thống không thể chuyển sang SVGA.
Tài liệu tham khảo
1. Nguyễn Minh Tuấn, Giáo trình hợp ngữ - Chương 10, ĐHKHTN, 2002
2. Randal Hyde, The art of assembly language programming – Chapter 23.
3. Dương Anh Đức, Giáo trình đồ họa máy tính, ĐHKHTN, 1998
4. Dan Rollins, TechHelp v.6.0
Bài tập
Bài 1. ChangePage. Chọn chế độ 03. Trên trang 0, ở tọa độ (8,10) viết dòng chữ “VIET NAM” màu
đỏ trên nền trắng. Trên trang 1, ở tọa độ (12,7) viết dòng chữ “QUE HUONG TOI” màu vàng trên
nền xanh. Làm biến mất con trỏ. Tạo vòng lặp chuyển qua lại giữa trang 0 và 1 cho đến khi một
phím được nhấn.
Bài 2. Vạch màu. Khởi động chế độ 103h (SVGA). Bằng cách truy xuất trực tiếp vùng nhớ màn
hình, hãy thể hiện 256 màu trong bảng màu mặc định bằng các vạch màu nằm cạnh nhau, mỗi vạch
độ rộng 3 điểm ảnh. Sau khi nhấn phím bất kì, trở về chế độ 03 và kết thúc chương trình.
Mở rộng
1. Trong bài tập 1, có nhận xét gì về tốc độ chuyển giữa hai trang ? Có cách nào để đạt được
kết quả tương tự (hai dòng chữ thay nhau xuất hiện) mà tốc độ chuyển đổi nhanh hơn ?
2. Thay vì hai dòng chữ chớp tắt như bài tập 1, làm sao để thể hiện hai dòng chữ luân phiên tiến
lại gần nhau, rồi lại lùi xa nhau, rồi lại gần nhau….
3. Tìm cách pha lại (định nghĩa lại) bảng màu, để sau khi nhấn Enter các vạch thể hiện trong
bài tập 2 đột nhiên biến thành một dải màu thay đổi từ sáng trắng đến xám, đến đen. Nhấn
Enter lần nữa sẽ phục hồi lại dải màu như trước.
4. Nghiên cứu một thuật toán vẽ đường thẳng và viết chương trình vẽ những đoạn thẳng tùy ý
trên màn hình.
Hướng dẫn
Bài 1.
Dùng hàm 05 của ngắt 10h để thay đổi trang.
Ví dụ:
mov ah,05h ; set page to view
mov al,0
int 10h
Dùng hàm 02 để nhảy đến vị trí cần thiết.
Ví dụ:
mov ah,02h ; goto (8,10) on page 0
mov dh,8
mov dl,10
mov bh,0
int 10h
Để viết chữ có màu và dịch chuyển con trỏ, có thể gọi ngắt 2 lần như sau
Ví dụ:
printStA proc
mov al,[si]
cmp al,'$'
jz Done
mov ah,09h
mov cx,1
int 10h
mov ah,0eh
int 10h
inc si
jmp printStA
Done:
ret
endp printStA
Để làm biến mất con trỏ, có thể dùng cách sau
Ví dụ:
mov ch,20h ; Hide cursor
mov cl,20h
mov ah,1
int 10h
Để chuyển đổi giữa hai màn hình, có thể viết:
Ví dụ:
mov dl,0
mov dh,5
next:
xor dl,1 ; switch page number 0/1
mov ax,dx
int 10h ; change page
mov ah,1 ; check key pressed
int 16h
jz next
Bài 2.
Để chuyển giữa chế độ text và graphic, có thể dùng đoạn chương trình sau
Ví dụ:
SVGA_ON proc
push ax
push bx
mov ax,4f02h
mov bx,103h
int 10h
pop bx
pop ax
ret
endp SVGA_ON
SVGA_OFF proc
push ax
mov ax,0003h
int 10h
pop ax
ret
endp SVGA_OFF
Để in một điểm ảnh, có thể dùng cách sau:
Ví dụ:
push bx
mov bx,800
xor dx,dx
mul bx ; dx:ax = y * 800
pop bx
add ax,bx ; ax = ax + x
adc dx,0 ; dx = 0 + carry
cmp dx,pn
jz Write
call SetPage
mov pn,dx
Write:
mov di,ax
mov al,cl
stosb
. vùng nhớ màn hình
Tóm tắt lý thuyết
T ổ chức bộ nhớ
Thông tin thể hiện trên màn hình được quy định bởi dữ liệu ghi trong vùng nhớ màn hình. Dữ
liệu này. Bài thực hành số 7
Lập trình màn hình
Mục đích
Hiểu được cách tổ chức bộ nhớ màn hình cho chế độ text 80x25 16 màu và chế độ