Tài liệu Lập trình hệ thống - Chương 3: Giao tiếp thiết bị chuẩn

Tài liệu Lập trình hệ thống  
Chương 3  
Chương 3  
GIAO TIẾP THIẾT BỊ CHUẨN  
1. Giao tiếp bàn phím  
1.1. Nguyên lý hoạt động  
Keyboard  
Keyboard Interface  
IRQ1  
Y- Decoder  
IRQ Logic  
D0  
Serial  
11 bits SDU  
D1  
D2  
D3  
D4  
D5  
D6  
D7  
Interface  
(PC/XT)  
or  
Keyboard  
Controller  
Scan  
Matrix  
8042/8741/8742  
Keyboard cable  
(AT ect)  
Scan  
Enable  
Hình 3.1 - Sơ đồ nguyên lý và các ghép nối của bàn phím  
Chip xử lý bàn phím liên tục kiểm tra trạng thái của ma trận quét (scan matrix) để  
xác định công tắc tại các tọa độ X, Y đang được đóng hay mở và ghi một mã tương ứng vào  
bộ đệm bên trong bàn phím. Sau đó mã này sẽ được truyền nối tiếp tới mạch ghép nối bàn  
phím trong PC. Cấu trúc của SDU (Serial Data Unit) cho việc truyền số liệu:  
0
10  
STRT DB0 DB1 DB2 DB3 DB4 DB5 DB6 DB7 PAR STOP  
STRT: bit start (luôn bằng 0)  
DB0 - DB7: bit số liệu từ 0 đến 7.  
PAR: bit parity (luôn lẻ)  
STOP: bit stop (luôn bằng 1).  
Phạm Hùng Kim Khánh  
Trang 49  
Tài liệu Lập trình hệ thống  
Chương 3  
Chân 1: clock  
Chân 2: dữ liệu  
Chân 3: Reset  
Chân 4: GND  
Chân 5: Vcc  
Hình 3.2 – Đầu cắm bàn phím AT  
Chân 1: dữ liệu  
Chân 2: không dùng  
Chân 3: GND  
Chân 4: Vcc  
Chân 5: clock  
Chân 6: không dùng  
Hình 3.3 – Đầu cắm bàn phím PS/2  
Mỗi phím nhấn sẽ được gán cho 1 mã quét (scan code) gồm 1 byte. Nếu 1 phím được  
nhấn thì bàn phím phát ra 1 mã make code tương ứng với mã quét truyền tới mạch ghép nối  
bàn phím của PC. Ngắt cứng INT 09h được phát ra qua IRQ1.  
Chương trình xử lý ngắt sẽ xử lý mã này tuỳ theo phím SHIFT có được nhấn hay  
không. Ví dụ: nhấn phím SHIFT trước, không rời tay và sau đó nhấn ‘C’:  
make code được truyền - 42(SHIFT) - 46 (‘C’).  
Nếu rời tay nhấn phím SHIFT thì bàn phím sẽ phát ra break code và mã này được  
truyền như make code. Mã này giống như mã quét nhưng bit 7 được đặt lên 1, do vậy nó  
tương đương với make code cộng với 128. Tuỳ theo break code, chương trình con xử lý  
ngắt sẽ xác định trạng thái nhấn hay rời của các phím. Thí dụ, phím SHIFT và ‘C’ được rời  
theo thứ tự ngược lại với thí dụ trên:  
break code được truyền 174 ( bằng 46 cộng 128 tương ứng với ‘C’) và 170  
(bằng 42 cộng 128 tương ứng với SHIFT).  
Phần cứng và phần mềm xử lý bàn phím còn giải quyết các vấn đề vật lý sau:  
- Nhấn và nhả phím nhưng không được phát hiện.  
Phạm Hùng Kim Khánh  
Trang 50  
Tài liệu Lập trình hệ thống  
Chương 3  
- Khử nhiễu rung cơ khí và phân biệt 1 phím được nhấn nhiều lần hay được  
nhấn chỉ 1 lần nhưng được giữ trong một khoảng thời gian dài.  
1.2. Lập trình giao tiếp qua các cổng  
Bàn phím cũng là một thiết bị ngoại vi nên về nguyên tắc có thể truy xuất nó qua các  
cổng vào ra.  
™ Các thanh ghi và các port:  
Sử dụng 2 địa chỉ port 60h và 64h có thể truy xuất bộ đệm vào, bộ đệm ra và thanh  
ghi điều khiển của bàn phím.  
Port  
60h  
60h  
64h  
64h  
Thanh ghi  
Đệm ngõ ra  
Đệm ngõ vào  
Thanh ghi điều khiển  
Thanh ghi trạng thái  
R/W  
R
W
W
R
Thanh ghi trạng thái xác định trạng thái hiện tại của bộ điều khiển bàn phím. Thanh  
ghi này chỉ đọc (read only) và đọc bằng lệnh IN tại port 64h.  
7
0
PARE  
TIM  
AUXB KEYL C/D  
SYSF  
INPB  
OUTB  
PARE: Lỗi chẵn lẻ của byte cuối cùng được vào từ bàn phím; 1 = có lỗi chẵn lẻ, 0  
= không có.  
TIM: Lỗi quá thời gian (time-out); 1 = có lỗi, 0 = không có.  
AUXB: Đệm ra cho thiết bị phụ (chỉ có ở máy PS/2); 1 = giữ số liệu cho thiết bị,  
0 = giữ số liệu cho bàn phím.  
KEYL: Trạng thái khóa bàn phím; 1 = không khóa, 0 = khóa.  
C/D: Lệnh/dữ liệu; 1 = Ghi qua port 64h, 0 = Ghi qua port 60h.  
SYSF: cờ hệ thống; 1 = tự kiểm tra thành công, 0 = reset khi cấp điện  
INPB: Trạng thái đệm vào; 1 = dữ liệu CPU trong bộ đệm vào, 0 = đệm vào rỗng.  
OUTB: Trạng thái đệm ra; 1 = dữ liệu bộ điều khiển bàn phím trong bộ đệm ra, 0  
= đệm ra rỗng.  
Thanh ghi điều khiển  
Các lệnh cho bộ điều khiển bàn phím:  
Mã  
Mô tả  
A7h Cấm thiết bị phụ  
A8h Cho phép thiết bị phụ  
A9h Kiểm tra giao tiếp thiết bị phụ và lưu mã kiểm tra vào bộ đệm ra  
00h: không lỗi  
01h: CLK ở mức thấp  
02h: CLK ở mức cao  
03h: DATA ở mức thấp  
Phạm Hùng Kim Khánh  
Trang 51  
Tài liệu Lập trình hệ thống  
Chương 3  
04h: DATA ở mức cao  
FFh: lỗi khác  
AAh Tự kiểm tra (ghi 55h vào bộ đệm ra nếu không lỗi  
ABh Kiểm tra giao tiếp bàn phím và lưu mã kiểm tra vào bộ đệm ra  
ADh Cấm bàn phím  
AEh Cho phép bàn phím  
C0h Đọc cổng vào và truyền dữ liệu đến bộ đệm ra  
C1h Đọc các bit 3 – 0 của cổng vào và truyền đến các bit 3- 0 của thanh ghi trạng thái  
cho đến khi INPB = 1  
C2h Đọc các bit 7 – 4 của cổng vào và truyền đến các bit 7- 4 của thanh ghi trạng thái  
cho đến khi INPB = 1  
D0h Đọc cổng ra  
D1h Ghi cổng ra  
D2h Ghi vào bộ đệm ra và xoá AUXB  
D3h Ghi vào bộ đệm ra và set AUXB  
D4h Ghi byte dữ liệu tiếp theo vào thiết bị phụ  
Khóa bàn phím:  
Start:  
IN AL, 64h  
; đọc byte trạng thái  
TEST AL, 02h  
JNZ start  
; kiểm tra bộ đệm có đầy hay không  
OUT 64h, 0ADh  
; khóa bàn phím  
Keyboard Controller  
60h  
60h  
64h  
64h  
Keyboard  
PS/2 only  
Hình 3.4 - Bộ điều khiển bàn phím  
Phạm Hùng Kim Khánh  
Trang 52  
Tài liệu Lập trình hệ thống  
Chương 3  
™ Các lệnh cho bàn phím:  
Mã  
Lệnh  
Mô tả  
Bật/tắt các đèn led của bàn phím  
Trả về byte EEh  
EDh Bật/tắt LED  
EEh Echo  
F0h Đặt/nhận dạng mã quét Đặt 1 trong 3 tập mã quét và nhận diện các mã quét  
tập mã quét hiện tại.  
F2h Nhận diện bàn phím  
F3h Đặt tốc độ lặp lại/trễ  
F4h Enable  
Nhận diện ACK = AT, ACK+abh+41h=MF II.  
Đặt tốc độ lặp lại và thời gian trễ của bàn phím  
Cho phép bàn phím hoạt động  
F5h Chuẩn/không cho phép Đặt giá trị chuẩn và cấm bàn phím.  
F6h Chuẩn/cho phép  
FEh Resend  
Đặt giá trị chuẩn và cho phép bàn phím.  
Bàn phím truyền ký tự cuối cùng một lần nữa tới bộ  
điều khiển bàn phím  
FFh Reset  
Chạy reset bên trong bàn phím  
Thí dụ: lệnh bật đèn led cho phím NUMCLOCK, tắt tất cả các đèn khác.  
MOV AL,0EDh  
OUT 60H, AL  
WAIT:  
IN AL, 64H  
JNZ WAIT  
MOV AL,02h  
OUT 60H, AL  
; đọc thanh ghi trạng thái  
; bật đèn cho numclock  
Cấu trúc của byte chỉ thị như sau:  
7
2
1
0
0 0  
0
0
0
CPL NUM SCR  
CPL:  
NUM:  
SCR:  
1 = bật đèn Caps Lock;  
1 = bật đèn Num Lock;  
1 = bật đèn Scroll Lock; 0 = tắt  
0 = tắt  
0 = tắt  
1.3. Lập trình giao tiếp qua các hàm của DOS, BIOS  
BIOS ghi các ký tự do việc nhấn các phím vào bộ đệm tạm thời được gọi là bộ đệm  
bàn phím (keyboard buffer), có địa chỉ 40h:1Eh, gồm 32 byte và kết thúc ở địa chỉ 40h:3Dh.  
Mỗi ký tự được lưu trữ bằng 2 byte, byte cao là mã quét, và byte thấp là mã ASCII. Chương  
trình xử lý ngắt sẽ xác định mã ASCII từ mã quét bằng bảng biến đổi và ghi cả 2 mã vào bộ  
đệm bàn phím. Bộ đệm bàn phím được tổ chức như bộ đệm vòng (ring buffer) và được quản  
lý bởi 2 con trỏ. Các giá trị con trỏ được lưu trữ trong vùng dữ liệu của BIOS ở địa chỉ  
40h:1Ah và 40h:1Ch. Con trỏ ghi (40h:1Ch) cho biết vị trí còn trống kế tiếp để ghi ký tự  
nhập, con trỏ đọc (40h:1Ah) cho biết vị trí ký tự đầu tiên sẽ đọc. Từ đó, bộ đệm bàn phím  
rỗng khi con trỏ ghi và con trỏ đọc trùng nhau Æ bộ đệm chỉ chứa được 15 ký tự.  
Phạm Hùng Kim Khánh  
Trang 53  
Tài liệu Lập trình hệ thống  
Chương 3  
Các hàm của ngắt 16h:  
Hàm 0h - đọc ký tự từ bàn phím, nếu không nhấn thì sẽ chờ  
Ra: AH = scancode, AL = mã ASCII. Nếu phím nhấn là các phím đặc biệt thì AL = 0  
Hàm 1h - ZF = 1 nếu không có ký tự trong bộ đệm. Giá trị trả về giống như hàm  
00h nhưng không xoá ký tự ra khỏi bộ đệm  
Hàm 2h - Trả về trạng thái của các phím, kết quả chứa trong AL  
7
6
5
4
3
2
1
0
INS  
CAPS  
LOCK  
NUM  
LOCK  
SCROLL  
LOCK  
ALT CTRL  
LEFT  
SHIFT  
RIGHT  
SHIFT  
Hàm 10h - Giống hàm 00h nhưng trả về mã mở rộng  
Hàm 11h - Giống hàm 01h nhưng trả về mã mở rộng  
Hàm 12h - Giống hàm 02h nhưng AH chứa thêm các thông tin  
7
6
5
4
3
2
1
0
SYS  
REQ  
CAPS  
LOCK  
NUM  
LOCK  
SCROLL  
LOCK  
RIGHT  
ALT  
RIGHT  
CTRL  
LEFT  
ALT  
LEFT  
CTRL  
Các thí dụ:  
- Giả sử phím ‘c’ đã được nhấn.  
MOV AH,00h  
INT 16h  
Kết quả: AH = 2Eh (mã quét cho phím ‘a’); AL = 63h (ASCII cho ‘c’)  
- Giả sử phím ‘HOME’ đã được nhấn.  
MOV AH,00h  
INT 16h  
Kết quả: AH = 47h ( mã quét cho phím ‘HOME’)  
AL = 0 (các phím chức năng và điều khiển không có mã ASCII)  
- Giả sử phím ‘HOME’ đã được nhấn.  
MOV AH,10h  
INT 16h  
Kết quả: AH = 47h (mã quét cho phím ‘HOME’)  
AL = E0h  
Phạm Hùng Kim Khánh  
Trang 54  
Tài liệu Lập trình hệ thống  
Chương 3  
2. Giao tiếp chuột  
2.1. Cấu tạo  
Cấu tạo của chuột rất đơn giản, phần trung tâm là 1 viên bi thép được phủ keo hoặc  
nhựa được quay khi dịch chuyển chuột. Chuyển động này được truyền tới 2 thanh nhỏ được  
đặt vuông góc với nhau. Các thanh này sẽ biến chuyển động của chuột theo 2 hướng X,Y  
thành sự quay tưong ứng của 2 đĩa gắn với chúng. Trên 2 đĩa có những lỗ nhỏ liên tục đóng  
và ngắt 2 chùm sáng tới các sensor nhạy sáng để tạo ra các xung điện. Số các xung điện tỷ lệ  
với lượng chuyển động của chuột theo các hướng X,Y và số xung trên 1 sec biểu hiện tốc  
độ của chuyển động chuột. Kèm theo đó có 2 hay 3 phím bấm.  
Te bao nhay sang  
Nguon sang  
Truc lan  
Y
Vien bi  
Di cong COM  
Bo khuech dai  
X
Hình 3.5 - Sơ đồ cấu tạo của chuột  
2.2. Mạch ghép nối và chương trình điều khiển chuột  
Hầu hết chuột được nối với PC qua cổng nối tiếp, qua đó chuột cũng được cấp nguồn  
nuôi từ PC. Khi dịch chuyển hoặc nhấn, nhả các phím chuột, nó sẽ phát ra một gói dữ liệu  
tới mạch giao tiếp và mạch sẽ phát ra 1 ngắt. Phần mềm điều khiển chuột làm các nhiệm vụ:  
chuyển ngắt tới mạch giao tiếp nối tiếp xác định, đọc dữ liệu và cập nhật các giá trị bên  
trong liên quan tới trạng thái của bàn phím cũng như vị trí của chuột. Hơn nữa, nó còn cung  
cấp 1 giao tiếp mềm qua ngắt 33h để định các giá trị bên trong này cũng như làm dịch  
chuyển con trỏ chuột trên màn hình tương ứng với vị trí của chuột.  
Có thể chọn kiểu con trỏ chuột cứng hoặc mềm trong chế độ văn bản hay con trỏ  
chuột đồ hoạ trong chế độ đồ họa. Các hàm 09h và 0Ah trong ngắt 33h cho phép định nghĩa  
loại và dạng con trỏ chuột.  
Phạm Hùng Kim Khánh  
Trang 55  
Tài liệu Lập trình hệ thống  
Chương 3  
2.3. Chương trình với con trỏ  
Ngắt 33h cho phép xác định vị trí, số lần click chuột và hình dạng con trỏ (số thứ tự  
hàm chứa trong AX).  
Hàm  
Ý nghĩa  
Tham số  
Ra: AX = 0: nếu có, = 1: không  
BX = số nút nhấn  
0
Reset chuột  
1
2
Hiển thị con trỏ  
Ẩn con trỏ  
Ra: BX: trạng thái nút  
(D0: nút trái, D1: nút phải, D2: nút giữa)  
(= 0: nhả, = 1: nhấn)  
CX: vị trí ngang  
DX: vị trí dọc  
3
4
Nhận vị trí con trỏ và trạng thái nút  
Đặt vị trí con trỏ  
Vào: CX: vị trí ngang  
DX: vị trí dọc  
Vào: BX = nút kiểm tra  
(=0: trái, =1: phải)  
Ra: AX = trạng thái nút  
BX = số lần nhấn  
5
Trạng thái nút và số lần nhấn từ khi gọi  
CX: vị trí ngang  
DX: vị trí dọc lần nhấn cuối  
6
7
Giống hàm 05h nhưng kiểm tra số lấn nhả  
Giới hạn dịch chuyển ngang của con trỏ  
Vào: CX = cột trái  
DX = cột phải  
Vào: CX = dòng dưới  
DX = dòng trên  
8
9
Giới hạn dịch chuyển dọc của con trỏ  
Xác định hình dạng con trỏ đồ hoạ  
Vào: BX = vị trí ngang  
CX = vị trí dọc  
ES:DX: địa chỉ mặt nạ màn hình và con trỏ  
Vào: BX = 0: con trỏ phần mềm  
CX = mặt nạ màn hình  
DX = mặt nạ con trỏ  
BX = 1: con trỏ phần cứng  
CX = dòng bắt đầu  
A
Xác định hình dạng con trỏ văn bản  
DX = dòng kết thúc  
Chú ý rằng toạ độ con trỏ xác định theo pixel với độ phân giải 640x200 trong khi chế  
độ văn bản sử dụng toạ độ ký tự 80x25 nên để chuyển sang toạ độ ký tự thì phải chia cho 8.  
Con trỏ chuột hiển thị trên màn hình đồ hoạ bằng cách thực hiện:  
Từ mới = (từ cũ AND mặt nạ màn hình) XOR mặt nạ con trỏ  
Nếu ta đặt mặt nạ màn hình là 0 thì ký tự màn hình tại đó sẽ bị xoá.  
Phạm Hùng Kim Khánh  
Trang 56  
Tài liệu Lập trình hệ thống  
Chương 3  
VD: Con trỏ chuột mềm nhấp nháy và chứa ký tự ‘A’  
MOV AH,0Ah  
MOV BX,0  
MOV CX,0 ; m•t n• màn hình = 0  
MOV DH,8Bh; = 10001011b Æ màu n•n Gray, màu ký t• Cyan  
MOV DL,’A’  
INT 33h  
VD: Con trỏ chuột cứng có các đường quét 3 và 8  
MOV AH,0Ah  
MOV BX,1  
MOV CX,03h  
MOV DX,08h  
INT 33h  
3. Giao tiếp màn hình  
3.1. Card màn hình  
Để hiện các hình ảnh, ký tự, hay hình vẽ trên màn hình, PC phải thông qua mạch  
ghép nối màn hình (graphics adapter). Board mạch này thường được cắm trên khe cắm mở  
rộng của PC.  
Trong chế độ văn bản (text mode), các ký tự được xác định bởi mã ASCII, trong đó  
có cả các thông tin về thuộc tính của ký tự, thí dụ ký tự được hiện theo cách nhấp nháy hay  
đảo màu đen trắng ….ROM ký tự (character rom) lưu trữ các hình mẫu điểm ảnh của các  
ký tự tương ứng để máy phát ký tự biến đổi các mã ký tự đó thành 1 chuỗi các bit điểm ảnh  
(pixel bit) và chuyển chúng tới thanh ghi dịch (shift register). Máy phát tín hiệu sẽ sử dụng  
các bit điểm ảnh này cùng với các thông tin thuộc tính từ RAM video và các tín hiệu đồng  
bộ từ CRTC để phát ra các tín hiệu cần thiết cho monitor.  
Trong chế độ đồ họa (graphics mode), thông tin trong RAM video được sử dụng trực  
tiếp cho việc phát ra các ký tự. Lúc này các thông tin về thuộc tính cũng không cần nữa. Chỉ  
từ các giá trị bit trong thanh ghi dịch, máy phát tín hiệu sẽ phát các tín hiệu về độ sáng và  
màu cho monitor.  
Mỗi ký tự được biểu diễn bởi 1 từ 2 byte trong RAM video. Byte thấp chứa mã ký tự,  
byte cao chứa thuộc tính. Cấu trúc của một từ nhớ video như sau:  
15  
14  
13  
12  
11  
10  
9
8
BLNK BAK2 BAK1 BAK0 INT FOR2 FOR1 FOR0  
7
6
5
4
3
2
1
0
CHR7 CHR6 CHR5 CHR4 CHR3 CHR2 CHR1 CHR0  
BLNK:  
INT:  
CHR7…CHR0:  
Nhấp nháy; 1 = bật, 0 = tắt  
Cường độ sáng ; 1 = cao, 0 = bình thường  
Mã ký tự.  
Phạm Hùng Kim Khánh  
Trang 57  
Tài liệu Lập trình hệ thống  
Chương 3  
Bảng màu quy định như sau:  
Mã hex Màu Mã hex  
Màu  
Red  
Mã hex  
Màu  
Mã hex  
Màu  
0
1
2
3
Black  
Blue  
4
5
6
7
8
9
Dark Gray  
Light Blue  
Light Green  
Light Cyan  
C
D
E
F
Light Red  
Light Magenta  
Yellow  
Magenta  
Brown  
Green  
Cyan  
A
B
Light Gray  
White  
Trong chế độ văn bản, 6845 liên tục xuất các địa chỉ cho RAM video qua MA0-  
MA13. Ký tự ở góc tận cùng phía trên bên trái màn hình có địa chỉ thấp nhất mà 6845 sẽ  
cung cấp ngay sau khi quét dọc ngược. Logic ghép nối định địa chỉ cho RAM video bằng  
việc lấy ra mã ký tự cùng với thuộc tính. Mã ký tự dùng cho máy phát ký tự như là chỉ số  
thứ nhất trong ROM ký tự. Lúc này, 6845 định địa chỉ hàng quét đầu tiên của ma trận ký tự,  
địa chỉ hàng bằng 0. Các bit của ma trận điểm ảnh bây giờ sẽ được truyền đồng bộ với tần  
số video từ thanh ghi dịch tới máy phát tín hiệu. Nếu máy phát tín hiệu nhận được giá trị 1  
từ thanh ghi dịch, nó sẽ phát tín hiệu video tương ứng với màu của ký tự. Nếu nhận được 0  
nó sẽ cấp tín hiệu tương ứng với màu nền. Vậy dòng quét thứ nhất được hiện phù hợp với  
các ma trận điểm ảnh của các ký tự trong hàng ký tự thứ nhất. Khi tia điện tử đạt tới cuối  
dòng quét, 6845 kích hoạt lối ra HS (Horizontal Synchronization) để tạo ra quá trình quét  
ngược và đồng bộ ngang. Tia điện tử quay trở về bắt đầu quét dòng tiếp. Sau mỗi dòng  
quét, 6845 tăng giá trị RA0-RA4 lên 1. Địa chỉ dòng này hình thành một giá trị offset bên  
trong ma trận điểm ảnh cho ký tự được hiện. Dựa trên mỗi dòng quét như vậy, một dòng các  
điểm ảnh của ký tự trong hàng ký tự được hiện ra. Điều này có nghĩa là với ma trận 9x14  
điểm ảnh cho 1 ký tự, hàng ký tự thứ nhất đã được hiện sau 14 dòng quét. Khi địa chỉ RA0-  
RA4 trở về giá trị 0, 6845 sẽ cấp 1 địa chỉ MA0-MA13 mới và hàng ký tự thứ hai sẽ được  
hiện ra cũng như vậy. Ở cuối dòng quét cuối cùng, 6845 sẽ reset địa chỉ MA0-MA13 và  
RA0-RA4 và cho phép lối ra VS (Vertical Synchronization) phát ra tín hiệu quét ngược  
cùng tín hiệu đồng bộ dọc.  
Mỗi ký tự có chiều cao cực đại ứng với 32 dòng vì có 5 đường địa chỉ RA0-RA4, còn  
bộ nhớ video trong trường hợp này được tới 16K từ vì có địa chỉ MA0-MA13 là 14 bit.  
Trong chế độ đồ họa, chúng kết hợp với nhau để tạo thành địa chỉ 19 bit, lúc đó 6845 có thể  
định địa chỉ cho bộ nhớ video lên tới 512K từ. Trong trường hợp này, các byte trong RAM  
video không được dịch thành mã ký tự và thuộc tính nữa mà trực tiếp xác định cường độ  
sáng và màu của điểm ảnh. Đa số các RAM video được chia thành vài băng được định địa  
chỉ bởi RA0-RA4. Các đường MA0-MA13 sẽ định địa chỉ offset bên trong mỗi băng. Dữ  
liệu trong RAM video lúc này được trực tiếp truyền tới thanh ghi dịch và máy phát tín hiệu.  
ROM ký tự và máy phát ký tự không làm việc.  
RAM video được tổ chức khác nhau tuỳ theo chế độ hoạt động và bản mạch ghép  
nối. Thí dụ, với RAM video 128 KB, có thể địa chỉ hóa toàn bộ bộ nhớ màn hình qua CPU  
như bộ nhớ chính. Nhưng nếu kích thước RAM video lớn hơn thì làm như vậy sẽ đè lên  
vùng ROM mở rộng ở điạ chỉ C0000h. Do đó, card EGA và VGA với trên 128 KB nhớ  
được tăng cường thêm 1 chuyển mạch mềm (soft-switch) cho phép thâm nhập các cửa sổ  
Phạm Hùng Kim Khánh  
Trang 58  
Tài liệu Lập trình hệ thống  
Chương 3  
128 KB khác nhau vào RAM video lớn hơn nhiều. Các chuyển mạch này được quy định bởi  
riêng các nhà sản xuất board mạch.  
3.2. Chế độ văn bản  
RAM video được coi như một dãy từ tuyến tính, từ đầu tiên được gán cho ký tự góc  
trên tận cùng bên trái màn hình gọi là hàng 1 cột 1. Từ thứ 2 là hàng 1, cột 2, …. Số từ tuỳ  
thuộc vào độ phân giải của kiểu hiện ký tự.  
Thí dụ: độ phân giải chuẩn 25 hàng, 80 ký tự đòi hỏi 2000 từ nhớ 2 byte. Như vậy,  
tổng cộng cần 4 KB bộ nhớ RAM video. Trong khi đó với card có độ phân giải cao SVGA  
60 hàng, 132 ký tự cần đến 15840 byte. Do đó RAM video thường được chia thành vài  
trang. Kích thước của mỗi trang tuỳ thuộc vào chế độ hiện của màn hình và số trang cực đại,  
phụ thuộc cả vào kích thước của RAM video. 6845 có thể được lập trình sao cho địa chỉ  
khởi phát của MA0-MA13 sau quét ngược dọc là khác 00h. Nếu địa chỉ khởi phát là bắt đầu  
của 1 trang thì có thể quản lý RAM video theo vài trang tách biệt nhau, nếu CPU thay đổi  
nội dung của 1 trang mà trang đó hiện đang không hiện thì màn hình cũng không thay đổi.  
Do đó, cần phân biệt trang nhớ đang được kích hoạt (đang hiện) và trang đang được xử lý.  
Đoạn chương trình ghi ký tự 'A' có cường độ sáng cao vào góc trên bên trái với màu  
số 7 và màu nền số 0. Trang thứ nhất và là duy nhất bắt đầu ở địa chỉ B0000h.  
MOV AX, 0B000h  
MOV ES, AX  
MOV AH, 0F8h  
MOV AL, 41h  
MOV ES:[00H],AX  
3.3. Chế độ đồ hoạ  
Tổ chức trong chế độ này phức tạp hơn. Ví dụ: với card Hercules, RAM video được  
chia thành 4 băng trên 1 trang . Băng thứ nhất: đảm bảo các điểm ảnh cho các dòng 0, 4, 8,  
…, 344; băng thứ hai cho các dòng 1, 5, 9, …, 345; băng thứ 3 cho các dòng 2, 6, 10, ….,  
346; và băng thứ 4 cho các dòng 3, 7, 11, …, 347. 64 KB được chia thành 2 trang 32 KB.  
Độ phân giải trong chế độ đồ họa là 720 x 348 điểm ảnh, mỗi điểm ảnh được biểu diễn bởi 1  
bit. Do vậy, một dòng cần 90 byte (720 điểm ảnh / 8 điểm ảnh trên 1 byte). Địa chỉ của byte  
chứa điểm ảnh thuộc đường i và cột j trong trang k là:  
B0000h+8000h*k+2000h*(i mod 4)+ 90*int(i/4)+int(j/8)  
B0000h là đoạn video, 8000h là kích thước của trang, 2000h*(i mod 4) là offset của  
băng chứa byte đó, 90*int(i/4) là offset của dòng i trong băng và int(j/8) là offset của cột j  
trong băng.  
3.4. Truy xuất màn hình qua DOS và BIOS  
3.4.1. Truy xuất qua DOS  
Các hàm của int 21h có thể hiện các ký tự trên màn hình nhưng không can thiệp được  
vào màu:  
- Hàm 02h: ra màn hình.  
- Hàm 09h: ra một chuỗi.  
- Hàm 40h: ghi file/ thiết bị  
Phạm Hùng Kim Khánh  
Trang 59  
Tài liệu Lập trình hệ thống  
Chương 3  
Các lệnh copy, type và print trong command.com cho phép hiện text trên màn hình.  
DOS gộp chung bàn phím và monitor thành 1 thiết bị mang tên CON (console). Ghi CON là  
truyền số liệu tới monitor, còn đọc CON là nhận ký tự từ bàn phím. Ví dụ: để hiện nội dung  
của file output.txt lên màn hình của monitor sẽ có các cách sau:  
- copy output.txt con  
- type output.txt > con  
- print output.txt /D:con  
3.4.2. Truy xuất qua BIOS  
BIOS thâm nhập monitor bằng int 10h với nhiều chức năng hơn DOS, như đặt chế độ  
hiện hình, quản lý tự động các trang, phân biệt các điểm trên màn hình nhờ các tọa độ,…  
- Hàm 00h: định chế độ đồ hoạ:  
Vào:  
AL = chế độ  
Mode  
Type  
Max Colors Size  
Resolution Max Pages Base Addr  
---- -------- ---------- ----- ---------- --------- ---------  
00  
01  
02  
03  
04  
05  
06  
07  
08  
09  
0A  
0B  
0C  
0D  
0E  
0F  
10  
11  
12  
13  
Text  
Text  
Text  
Text  
16  
16  
16  
16  
4
40x25  
40x25  
80x25  
80x25  
40x25  
40x25  
80x25  
80x25  
20x25  
40x25  
80x25  
- -  
- -  
- -  
- -  
8
8
4,8  
4,8  
1
1
1
1,8  
1
1
1
-
-
8
4
2
2
B8000h  
B8000h  
B8000h  
B8000h  
B8000h  
B8000h  
B8000h  
B0000h  
B0000h  
B0000h  
B0000h  
- -  
- -  
Graphics  
Graphics  
Graphics  
Text  
Graphics  
Graphics  
Graphics  
- -  
320x200  
320x200  
640x200  
- -  
4
2
Mono  
16  
16  
4
? ?  
? ?  
? ?  
- -  
-
-
- -  
- -  
- -  
- -  
Graphics  
Graphics  
Graphics  
Graphics  
Graphics  
Graphics  
Graphics  
16  
16  
Mono  
16  
2
40x25  
80x25  
80x25  
80x25  
80x25  
80x25  
40x25  
320x200  
640x200  
640x350  
640x350  
640x480  
640x480  
320x200  
A0000h  
A0000h  
A0000h  
A0000h  
A0000h  
A0000h  
A0000h  
1
1
1
16  
256  
- Hàm 01h: xác định hình dạng con trỏ  
Vào:  
0
1
2
7
Đầu = 0  
Cuối = 7  
Đầu = 0  
Cuối = 1  
Đầu = 6  
Cuối = 7  
Đầu = 7  
Cuối = 0  
Phạm Hùng Kim Khánh  
Trang 60  
Tài liệu Lập trình hệ thống  
Chương 3  
CH = dòng đầu con trỏ  
CL = dòng cuối con trỏ  
- Hàm 02h: xác định vị trí con trỏ  
Vào:  
DH = hàng, DL = cột (bắt đầu từ toạ độ 0,0)  
BH = trang (= 0 trong chế độ đồ hoạ)  
- Hàm 03h: lấy vị trí và hình dạng con trỏ  
Vào: BH = trang  
Ra:  
DH = hàng, DL = cột  
CH, CL = tham số xác định hình dạng con trỏ  
- Hàm 05h: chọn trang màn hình  
AL = số trang (0..7)  
- Hàm 06h: cuộn cửa sổ lên  
Vào:  
AL = số hàng cuộn (= 0: cuộn toàn màn hình)  
BH = thuộc tính các hàng trống xuất hiện khi cuộn  
CH, CL = hàng, cột của góc phía trên bên trái  
DH, DL = hàng, cột của góc phía dưới bên phải  
- Hàm 07h: cuộn cửa sổ xuống  
Giống hàm 06h  
- Hàm 08h: đọc ký tự và thuộc tính ký tự tại vị trí con trỏ  
Vào: BH = trang  
Ra:  
AH = thuộc tính  
AL = mã ASCII  
- Hàm 09h: ghi ký tự và thuộc tính ký tự tại vị trí con trỏ  
Vào:  
BH = trang  
BL = thuộc tính (theo bảng trang 61)  
AL = mã ASCII  
CX = số ký tự cần xuất  
Phạm Hùng Kim Khánh  
Trang 61  
Tài liệu Lập trình hệ thống  
Chương 3  
- Hàm 0Ah: ghi ký tự tại vị trí con trỏ  
Vào:  
BH = trang  
AL = mã ASCII  
CX = số ký tự cần xuất  
- Hàm 0Bh: chọn bảng màu (dùng cho chế độ đồ hoạ)  
Vào: BH = 0, BL = chọn màu nền (theo bảng trang 61)  
BH = 1, BL = số bảng màu  
Palette Pixel Color  
------- ----- -------  
Palette Pixel Color  
------- ----- -------  
0
0
0
0
0
1
2
3
Black  
Green  
Red  
1
1
1
1
0
1
2
3
Black  
Cyan  
Magenta  
Brown  
White  
- Hàm 0Ch: hiện một điểm trên màn hình (dùng cho chế độ đồ hoạ)  
AL = giá trị pixel (0 – 3), nếu AL.7 = 1 thì giá trị màu là phép toán XOR vứi giá trị  
màu hiện hành  
CX = cột, DX = hàng  
- Hàm 0Dh: đọc một điểm trên màn hình (dùng cho chế độ đồ hoạ)  
Vào: CX = cột, DX = hàng  
Ra: AL = giá trị pixel  
- Hàm 0Fh: xác định chế độ màn hình hiện hành  
Ra:  
AL = chế độ  
AH = số cột  
BH = số trang  
- Hàm 13h: xuất chuỗi  
Vào:  
AL = chế độ xuất (bit0 = 1: cập nhật vị trí con trỏ sau khi xuất, bit1 = 1: chuỗi có  
chứa thuộc tính ký tự)  
BH = trang  
BL = thuộc tính (theo bảng trang 61)  
CX = số ký tự cần xuất  
CX = số ký tự cần xuất  
DH, DL = hàng, cột xuất chuỗi  
Phạm Hùng Kim Khánh  
Trang 62  
Tài liệu Lập trình hệ thống  
Chương 3  
ES:BP = chuỗi in (nếu AL.1 = 1 thì chuỗi có dạng ‘Kýtự’,thuộc tính,‘Kýtự’,thuộc  
tính,‘Kýtự’,thuộc tính…)  
™ Những thường trình đồ họa:  
BIOS trên main board có sẵn những hàm dùng cho thâm nhập MDA và CGA. BIOS  
của riêng EGA và VGA có những hàm mở rộng tương ứng trong khi vẫn giữ nguyên định  
dạng gọi.  
Một trong những hàm quan trọng nhất của int 10h là hàm 00h dùng để đặt chế độ  
hiện hình. Để thay đổi chế độ hiện hình cần phải làm rất nhiều bước chương trình phức tạp  
để nạp các thanh ghi của chip 6845. Trong khi đó, hàm 00h làm cho ta tất cả các công việc  
này.  
Thí dụ: tạo kiểu 6 với độ phân giải 640*200 trên CGA.  
Mov ah, 00h  
Mov al, 06h  
Int 10h  
; hàm 00h  
; chế độ 6  
; gọi ngắt  
Các card EGA/VGA có riêng BIOS của chúng. Trong quá trình khởi động PC, nó sẽ  
chặn int 10h lại và chạy chương trình BIOS riêng. Thường trình cũ (của BIOS trên board  
mach chính) được thay địa chỉ tới int 42h. Tất cả các lệnh gọi int 10h sẽ được BIOS của  
EGA/VGA thay địa chỉ tới int 42h nếu board mạch EGA/VGA đang chạy các kiểu hiện  
tương thích với MDA hay CGA. Có các kiểu hoạt động từ 0 đến 7.  
BIOS của EGA/VGA dùng vùng 40:84h tới 40:88h để lưu số liệu BIOS và các thông  
số của EGA/VGA. Nó có các hàm mới với các hàm phụ sau:  
- Hàm 10h: truy xuất các thanh ghi màu và bảng màu  
- Hàm 11h: cài đặt các bảng định nghĩa ký tự mới  
- Hàm 12h: đặt cấu hình hệ con video  
- Hàm 1Bh: thông tin về trạng thái và chức năng của BIOS video (chỉ có  
ở VGA)  
- Hàm 1Ch: trạng thái save/restore của video (chỉ có ở VGA)  
Sau đây là chức năng của các hàm và thí dụ sử dụng chúng:  
- Hàm 10h, hàm phụ 03h – xoá/đặt thuộc tính  
Ví dụ: Xoá thuộc tính nhấp nháy:  
Mov ah, 10h  
Mov al, 03h  
Mov bl, 00h  
Int 10h  
; dùng hàm 10h  
; dùng hàm phụ 03h  
; xoá thuộc tính nhấp nháy  
; gọi ngắt  
- Hàm 11h – ghép nối với máy phát ký tự  
Ví dụ: Nạp bảng định nghĩa ký tự 8*14 không cần chương trình CRTC:  
Mov ah, 11h  
Mov al, 01h  
Mov bl, 03h  
; dùng hàm 11h  
; nạp bảng ký tự từ Rom Bios vào Ram máy phát ký tự.  
; gán số 3 cho bảng  
Phạm Hùng Kim Khánh  
Trang 63  
Tài liệu Lập trình hệ thống  
Chương 3  
Int 10h  
; gọi ngắt  
- Hàm 12h, hàm phụ 20h – chọn thường trình in màn hình. Dùng hàm  
phụ này có thể thay thế thường trình chuẩn cho INT 05h bằng thường  
trình có thể dùng cho các độ phân giải mới của EGA/VGA.  
Ví dụ: Cho phép thường trình mới in màn hình:  
Mov ah, 12h  
Mov bl, 20h  
; dùng hàm 12h  
; dùng hàm phụ 20h  
Ấn PRINT hoặc SHIFT+PRINT để gọi thường trình in đã được lắp đặt.  
™ Truy xuất trực tiếp bộ nhớ video:  
Để vẽ 1 điểm trên màn hình, BIOS phải làm nhiều thủ tục nhưng nếu muốn vẽ toàn  
bộ 1 cửa sổ hình hay lưu trữ thì phải truy xuất trực tiếp RAM video.  
- Với board đơn sắc MDA trong kiểu hiện văn bản số 7, 4 KB RAM  
đuợc tổ chức như 1 dãy (array) gốm 2000 từ nhớ kề nhau ( mỗi từ là  
mã thuộc tính: ký tự) tạo nên 25 dòng, 80 cột. RAM video bắt đẩu ở  
đọan B0000h, trong đó ký tự góc trên cùng bên trái là từ thứ nhất trong  
RAM video. Như vậy mỗi dòng có 160 byte (A0h). Địa chỉ của từ nhớ  
ứng với ký tự ở dòng i, cột j (i = 0-24, j = 0-79) được tính theo công  
thức sau:  
Address (i,j) = B0000h +A0h*i +02h*j.  
- Với board EGA, ở kiểu hiện văn bản từ 0 đến 3 mã ký tự được lưu trữ  
trong lớp nhớ 0 cùng với thuộc tính trong lớp 1 của RAM video. Mạch  
logic chuyển địa chỉ trên board thực hiện sự kết hợp nhất định nào đó  
sao cho tổ chức và cấu trúc của RAM video cũng như cách tính địa chỉ  
vẫn tương đồng với cách của CPU. Trong chế độ đồ họa từ 13 đến 16,  
RAM video bắt đầu từ địa chỉ đoạn A000h. Các điểm ảnh được xếp kề  
cận nhau trong bộ nhớ và mỗi điểm ảnh đòi hỏi 4 bit, các bit này được  
phân ra ở 4 lớp nhớ. Như vậy địa chỉ của 1 trong 4 bit này trên 1 điểm  
ảnh không chỉ gồm đoạn video và offset mà còn thêm vào số lớp nhớ  
nữa.  
Để hiện 1 điểm ảnh với 1 trong 16 màu, không phải chỉ tính địa chỉ bit mà còn phải  
thâm nhập 4 lớp nhớ. Muốn vậy, phải dùng thanh ghi mặt nạ bản đồ (map mask register).  
Thanh ghi này được định địa chỉ qua cổng chỉ số 3C4h với địa chỉ 02h và có thể được ghi  
qua cổng số liệu 3C5h. Cấu trúc của thanh ghi mặt nạ bản đố như sau:  
7
6
5
4
3
2
1
0
Res Res Res Res LY3 LY2 LY1 LY0  
LY3-LY0:  
Thâm nhập ghi tới các lớp từ 0Æ3;  
1 = cho phép; 0 = không cho phép  
Dự trữ  
Res :  
Phạm Hùng Kim Khánh  
Trang 64  
Tài liệu Lập trình hệ thống  
Chương 3  
Ví dụ: Đặt bit 0 của byte ở địa chỉ A000:0000h cho lớ 0, 1, 3.  
Mov AX, 0A000h  
Mov ES, AX  
; nạp đọan video vào AX  
; truyền đọan video vào ES  
Mov BX, 0000h  
Out 3C4h, 02h  
Out 3C5h, 0Bh  
; nạp offset 0000h vào BX  
; chỉ số 2 Æ thanh ghi mặt nạ bản đồ  
; ghi 0000 1011b vào thanh ghi mặt nạ bản đồ  
(cho phép lớp 0, 1, 3)  
Mov 3C5h, 0Bh  
; đặt bit 0 trong các lớp 0, 1 và 3  
Để lưu trữ nội dung màn hình cần phải đọc các giá trị bit của 4 lớp khi dùng thanh  
ghi chọn bản đồ đọc (read map select register). Nó được định địa chỉ với chỉ số 04h qua  
cổng chỉ số 3CEh, và có thể được ghi qua cổng số liệu 3CFh. Cấu trúc của thanh ghi này:  
7
6
5
4
3
2
1
0
res res res res res res LY1 LY0  
LY1-LY0: cho phép thâm nhập đọc với:  
00 = lớp 0  
01 = lớp 1  
10 = lớp 2  
11 = lớp 3  
res  
: dự trữ  
Ví dụ: đọc byte ở địa chỉ A000:0000h cho lớp 2:  
Mov AX, A000h  
Mov ES, AX  
Mov BX, 0000h  
Out 3Ceh, 04h  
Out 3CFh, 02h  
; nạp đọan video vào AX  
; truyền đọan video vào ES  
; nạp offset vào BX  
; chỉ số 4 Æ thanh ghi chọn bản đồ đọc  
; ghi 0000 0010b vào thanh ghi chọn bản đồ đọc  
(cho phép lớp 2)  
Mov AL, [ES:BX] ; nạp byte trong lớp 2 vào AL.  
Chú ý rằng 4 bit tại 4 lớp đại diện cho 1 điểm ảnh nên trong kiểu hiện 16 EGA có độ  
phân giải cao nhất mỗi dòng cần 80byte (640 điểm ảnh / 8 điểm ảnh trên 1 byte); mỗi trang  
màn hình gồm 32 KB. Địa chỉ byte của điểm ảnh ở dòng i, cột j trang k (i=0-349, j=0-639,  
k=0-1) là:  
Address (i,j,k) = A0000h + 8000h*k + 50h*j + int (i/8).  
Với board VGA, các chế độ hiện văn bản từ 0 đến 3 và 7 cũng như các chế độ đồ họa  
từ 4 đến 6 và 13 đến 16 của CGA. EGA và MDA đều chạy được trên nó.  
Trong chế độ văn bản, mã ký tự được lưu trữ trong lớp nhớ 0 cùng với thuộc tính  
trong lớp 1 của RAM video VGA. Quá trình chuyển hóa địa chỉ cũng giống như EGA  
nhưng khác ở chổ nó vẫn đảm bảo chế độ văn bản 7 với độ phân giải 720x400, ma trận điểm  
ảnh 9x16. Trong chế độ đồ họa 4 ÷6 và 13÷19 , mọi tổ chức, cấu trúc cũng như cách tính  
Phạm Hùng Kim Khánh  
Trang 65  
Tài liệu Lập trình hệ thống  
Chương 3  
địa chỉ tương tự như CGA và EGA. VGA được tăng cường 3 kiểu hiện hình mới từ 17 đến  
19.  
Kiểu 17 tương thích với board đồ họa của máy PS/2 kiểu 30 là MCGA (multi colour  
graphics array). Các điểm ảnh chỉ gổm 1 bit (2 màu) được định vị chỉ trên lớp 0. Thí dụ,  
trong VGA kiểu 17 với 80 byte trên 1 dòng (640 điểm ảnh / 8 điểm ảnh trên 1 byte). Mỗi  
trang màn hình gồm 40 KB. Địa chỉ của byte ở dòng i, cột j ( i= 0-479), j=0-639) như sau:  
Address (i,j) = A0000h+50h*j+int (i/8)  
Kiểu 18, 4 bit của điểm ảnh được phân trong 4 lớp nhớ như ở EGA. Trong kiểu VGA  
phân giải cao với 16 màu khác nhau, 80 byte trên 1 dòng (640 điểm ảnh / 8 điểm ảnh trên 1  
byte), mỗi trang màn hình gồm 40 KB (A0000h byte); địa chỉ của mỗi byte ở dòng i, cột j  
(i=0-479; j = 0-639) bằng:  
Address (i,j) = A0000h + 50h*j + int (i/8).  
Kiểu 19 với 256 màu cho 1 điểm ảnh thì RAM video lại được tổ chức rất đơn giản  
như 1 dãy tuyến tính, trong đó 1 byte tương ứng với 1 điểm ảnh. Giá trị của byte phân định  
màu của điểm ảnh. Kiểu này đòi hỏi 320 byte (140h) trên 1 dòng (320 điểm ảnh / 1 điểm  
ảnh trên 1 byte). Một trang màn hình gồm 64 KB (10000h) nhưng chỉ có 64000 byte được  
sử dụng. Địa chỉ của điểm ảnh trong dòng i, cột j (i = 0-199, j=0-319) là:  
Address (i,j) = A0000h + 140h*j + i  
Phạm Hùng Kim Khánh  
Trang 66  
Tài liệu Lập trình hệ thống  
Chương 3  
PHỤ LỤC CHƯƠNG 3  
TITLE  
CURSOR  
DISPLAYING MOUSE POSITION  
MACRO ROW,COLUMN  
MOV AH,02H  
MOV BH,00  
MOV DH,ROW  
MOV DL,COLUMN  
INT  
ENDM  
10H  
DISPLAY MACRO STRING  
MOV AH,09H  
MOV DX,OFFSET STRING  
INT 21H  
ENDM  
.MODEL SMALL  
.STACK  
.DATA  
MESSAGE_1  
MESSAGE_2  
POS_HO  
DB 'PRESS ANY KEY$'  
DB 'THE MOUSE CURSOR IS LOCATED AT $'  
DB ?,?, ' AND $'  
POS_VE  
DB ?,?,'$'  
OLDVIDEO  
NEWVIDEO  
.CODE  
DB ?  
;current video mode  
;new video mode  
DB 0EH  
MAIN PROC  
MOV AX,@DATA  
MOV DS,AX  
MOV AH,0FH  
INT 10H  
;get current video mode  
MOV OLDVIDEO,AL  
MOV AX,0600H  
MOV BH,07  
;save it  
;clear screen  
MOV CX,0  
MOV DX,184FH  
INT 10H  
MOV AH,00H  
MOV AL,NEWVIDEO  
INT 10H  
MOV AX,0  
INT 33H  
MOV AX,01  
INT 33H  
;set new video mode  
;initialize mouse  
;show mouse cursor  
CURSOR 20,20  
DISPLAY MESSAGE_1  
AGAIN:  
MOV AX,03H  
INT 33H  
MOV AX,CX  
CALL CONVERT  
MOV POS_HO,AL ;save the LSD  
MOV POS_HO+1,AH ;save the MSD  
;get mouse location  
;get the hor. pixel position  
Phạm Hùng Kim Khánh  
Trang 67  
Tài liệu Lập trình hệ thống  
Chương 3  
MOV AX,DX  
CALL CONVERT  
;get the vert. pixel position  
MOV POS_VE,AL ;save  
MOV POS_VE+1,AH  
CURSOR 5,20  
DISPLAY MESSAGE_2  
DISPLAY POS_HO  
DISPLAY POS_VE  
MOV AH,01  
;check for key press  
;hide mouse  
INT 16H  
JZ  
AGAIN ;if no key press  
MOV AH,02  
INT 33H  
MOV AH,0  
;restore original video mode  
;load original video mode  
MOV AL,OLDVIDEO  
MOV AH,0 ;restore original video mode  
INT  
MOV  
INT  
10H  
AH,4CH  
21H  
;go back to DOS  
MAIN  
;--------------------  
;divide pixels position by 8 and convert to ASCII to make  
it displayable  
ENDP  
;ax=pixels position (it is in hex)  
;on return ax= two ASCII digits  
CONVERT PROC  
SHR AX,1  
SHR AX,1  
SHR AX,1  
MOV BL,10  
MOV AH,0  
DIV BL  
;divide  
;by 8  
;to get screen position by character  
ADD AX,3030H  
RET  
;make it ASCII  
;return with AX=two ASCII digits  
CONVERT ENDP  
END  
MAIN  
--------------------------------------------------------------------  
;THIS PROGRAM WAITS FOR THE MOUSE PRESS COUNT AND  
;DISPLAYS IT WHEN ANY KEY IS PRESSED.  
.MODEL  
.STACK  
.DATA  
SMALL  
MESSAGE_1 DB 'PRESS LEFT BUTTON A NUMBER OF TIMES:LESS  
THAN 99.$'  
MESSAGE_2  
KEY$'  
MESSAGE_3 DB 'YOU PRESSED IT $'  
P_COUNT DB ?,?, ' TIMES $'  
DB 'TO FIND OUT HOW MANY TIMES, PRESS ANY  
MESSAGE_4 DB 'NOW PRESS ANY KEY TO GO BACK TO DOS$'  
OLDVIDEO  
NEWVIDEO  
DB ?  
DB 12H  
Phạm Hùng Kim Khánh  
Trang 68  
Tải về để xem bản đầy đủ
pdf 26 trang myanh 15580 Free
Bạn đang xem 20 trang mẫu của tài liệu "Tài liệu Lập trình hệ thống - Chương 3: Giao tiếp thiết bị chuẩn", để tải tài liệu gốc về máy hãy click vào nút Download ở trên

File đính kèm:

  • pdftai_lieu_lap_trinh_he_thong_chuong_3_giao_tiep_thiet_bi_chua.pdf