CHƯƠNG 4: LẬP TRÌNH PHỐI GHÉP
4.2 MỘT SỐ LẬP TRÌNH PHỐI GHÉP CƠ BẢN
4.2.2 Lập trình phối ghép với màn hình
Bộ nhớ Video
Màn hình của máy tính hiện đại ngày nay đều sử dụng bộ nhớ video (bộ nhớ màn hình) để chứa nội dung hình ảnh được hiển thị và các thông tin liên quan. Bộ nhớ video còn được gọi là bộ đệm khung (frame buffer). Từ thế hệ Pentium, bộ vi xử lý còn có cổng ga tốc đồ họa AGP (Accelerated Graphics Port) Cổng này cho phépbộ vi xử lý dồ họa truy cập trực tiếp vào bộ nhớ hệ thống cho các phép tính đồ họa nhưng vẫn có bộ nhớ video riêng để lưu trữ nội dung các điểm ảnh màn hình. Phương pháp này cho phép sử dụng bộ nhớ hệ thống mềm dẻo hơn mà không làm ảnh hưởng tới tốc độ máy tính. Cổng AGP ngày nay trở thành chuẩn trong các máy tính hiện đại.
Dưới đây là bảng dung lượng bộ nhớ video và khả năng hiển thị màn hình.
Dung lượng bộ nhớ
Kích thước màn hình Chiều sâu mầu Số màu 1MB 1024x768
800x600
8-bit 16-bit
256 65,536 2MB 1024x768
800x600 1280x1024
8-bit 16-bit 24-bit
256 65,536 16.7 million
4MB 1024x768 24-bit 16.7 million
6MB 1280x1024 24-bit 16.7 million
8MB 1600x1200 32-bit 16.7 million
Bộ chuyển đổi số/tương tự
Tín hiệu ra màn hình không phải dạng số mà là dạng tín hiệu tương tự. Tín hiệu ra phải đi qua một bộ biến đổi bộ nhớ tương tự/ số (RAMDAC- RAM Digital Analog Converter) đọc nội dung bộ nhơ video rồi chuyển sang tín hiệu tương tự. Qua trình này lặp lại theo tần số làm tươi màn hình.
Bộ xử lý Video
Bộ xử lý video biên dịch và thực hiện lệnh đồ họa thành từng điểm ảnh cụ thể để đưa ra RAMDAC. Bộ vi xử lý video có cấu trúc hoàn chỉnh và phức tạp như một bộ vi xử lý thực sự.
Nhờ có bộ xử lý video nên đã giảm tính toán cho từng điểm ảnh để hiển thị đối với bộ xử lý.
Thay vào đó CPU chỉ cần truyền tham số căn bản của đối tượng cần hiển thị sang bộ xử lý video.
Bộ xử lý video sẽ tính từng điểm ảnh cần hiển thị từ các tham số nhận được, giải phòng CPU khỏi nhiệm vụ này.
Đồ họa ba chiều
Để phần mêm bắt kịp được với phần cứng trong quá trình phát triển của hiển thị đồ họa ba chiều, các hệ điều hành cung cấp một thư viện giao diện lập trình ứng dụng (Application Programming Interface). Giống như BIOS, API cung cấp các lệnh đồ họa chuẩn ra các chương trình xử lý video thay vì lập trình trực tiếp nó. Phần mềm điều khiển sẽ phải biên dịch tiếp nhưng lệnh này sang lệnh máy.
b. Ví dụ về Lập trình phối ghép màn hình
Dưới đây là một số ví dụ về lập trình màn hình có sử dụng các chức năng và dịch vụ do BIOS cung cấp đã trình bày ở phần 3.4.1.
Ví dụ 1: In ra màn hình 256 kí tự của bảng mã ASCII, mỗi kí tự có một thuộc tính khác nhau trong chế độ text.
.MODEL Tiny .CODE
Org 100h Jmp Start Start:
Mov AL,0
Mov BL,0 ; thuoc tính 0 vơi ki tu co ma ASCII =0 Mov DL,0 ; DL= so cot, bat dau tu cot 0
Mov DH,4 ; Bat dau tu hang thu 4 Mov CX, 255 ; in 256 kí tự
InTiep:
Push AX Mov AH,2
Int 10h ; dat vi tri con tro Pop AX
Mov AH,9 ; in ki tu trong AL voi thuoc ; thuoc tinh trong BL
Push AX Push CX
Mov CX,1 ; in 1 ki tu Int 10h
Pop CX Pop AX
Inc AL ; ki tu ke tiep Inc BL ; thuoc tinh ke tiep Inc DL ; sang cot ben canh
Cmp DL,79 ; Cot cuoi cung?
Jb TiepTuc
Mov Dl,0 ; xuong dong ke tiep Inc DH
TiepTuc:
Loop InTiep Int 20h
End Start
Ví dụ 2: Vẽ một hình chữ nhật trong chế độ đồ họa VGA
.MODEL Tiny .CODE
Org 100h Jmp Start TopRow dw 100 TopCol dw 100 BotRow dw 400 BotCol dw 600
Color db 4 ; mau do Start:
Mov AH,0h ; thiet lap che do do hoa Mov AL,12h ; VGA mode
Int 10h
Mov CX, BotCol Sub CX,TopCol Mov SI,TopRow Mov DI,TopCol
; Ve cach tren TopSide:
Call DrawPixel ; goi chuong trinh con ve diem anh Inc DI ;
Loop TopSide Mov CX, BotRow Sub CX, TopRow Mov SI, TopRow
; Ve cach 2 canh ben Side:
Mov DI, TopCol
Call DrawPixel ; goi chuong trinh con ve diem anh Mov DI, BotCol
Call DrawPixel ; goi chuong trinh con ve diem anh Inc SI
Loop Side Mov CX, BotCol
Sub CX,TopCol Mov SI, BotRow Mov DI, TopCol
; Ve cach duoi BotSide:
Call DrawPixel ; goi chuong trinh con ve diem anh Inc DI ;
Loop BotSide
Mov AH, 1 ; Cho 1 phim go vao Int 21h
Mov AH,0 Mov AL,2 Int 10h Int 20h
; chuong trinh con ve 1 diem anh DrawPixel Proc
Push AX Push CX Push DX Mov DX, SI Mov CX,DI Mov AL, Color Mov AH,0CH Int 10h Pop DX Pop CX Pop AX Ret
DrawPixel Endp End Start
Ví dụ 3: Viết một điểm ảnh trực tiếp vào bộ nhớ hiển thị (không thông qua RAM).
Đây là cách nhanh nhất, tuy nhiên thủ tục viết vào bộ nhớ hiển thị phụ thuộc vào loai card điều khiển màn hình cụ thể.
Chương trình sau được thực hiện trong chế độ đồ họa (640x200x2).
VeDiemAnh Proc Near
; DX=hàng, CX= cột
; ES=B800H
; Giả sử chế độ đồ họa đã được khởi tạo như sau:
; AH=0, AL=6, Int 10h
Xor BX,BX ; BX=0
SHR DX,1 ; kiem ta xem diem anh o dong chan hay le Add BX, 8*1024 ; o dong chan
TinhTiep:
Mov AX,DX ; DX =so hang Mov CL,2
SHL DX,CX ; DX=DX*4 Add DX,AX ; DX=5*DX Mov AX,CX
Mov CL,4
SHL DX,CL ; DX=DX*16
Add BX,DX ; BX=offset cua dong chua diem anh Mov DX,AX
AND DX,7 ; DX=DX Mod 8 = vi tri byte tren dong Mov CL,3 ; no chua diem anh
SHR AX,CL; AX=AX div 8= vi tri byte tren dong Add, BX,AX ; [BX] la byte chua diem anh
NEG DL Add DL,7 Mov CL,DL Mov AL,1 SHL AL,CL OR ES:[BX], AL Ret
VeDiemAnh Endp