
ch ng 9ươ
Truy nh p tr c ti p vào b nhậ ự ế ộ ớ
Trong ch ng này tr nh b y c c v n đ :ươ ỡ ầ ỏ ấ ề
+ Hai ki u đ a ch : Đ a ch phõn đo n và đ a ch th cể ị ỉ ị ỉ ạ ị ỉ ự
+ Truy nh p t i đ a ch phõn đo nậ ớ ị ỉ ạ
+ Đ i t đ a ch phõn đo n sang đ a ch th cổ ừ ị ỉ ạ ị ỉ ự
+ B nh màn h nh, truy nh p tr c ti p vào b nh mànộ ớ ỡ ậ ự ế ộ ớ
h nhỡ
+ D ng con tr đ l y d li u t b nh phõn đo nự ỏ ể ấ ữ ệ ừ ộ ớ ạ
+ D ng con tr hàm đ th c hi n c c th t c c a DOSự ỏ ể ự ệ ỏ ủ ụ ủ
§ 1. C c hàm truy nh p theo đ a ch phõn đo nỏ ậ ị ỉ ạ
1. Hàm pokeb: G i m t ký t vào b nh .ử ộ ự ộ ớ
+ Nguy n m u trong dos.h nh sau:ờ ẫ ư
void pokeb(unsigned seg, unsigned off, char value);
+ C ng d ng: G i gi tr ký t value vào b nh t i đ a chụ ụ ử ỏ ị ự ộ ớ ạ ị ỉ
phõn đo n seg:offạ
2. Hàm peekb: Nh n m t ký t t b nh .ậ ộ ự ừ ộ ớ
+ Nguy n m u trong dos.h nh sau:ờ ẫ ư
char peekb(unsigned seg, unsigned off);
+ C ng d ng: Nh n m t byte t i đ a ch phõn đo n seg:offụ ụ ậ ộ ạ ị ỉ ạ
3. Hàm poke: G i m t s nguy n vào b nh .ử ộ ố ờ ộ ớ
+ Nguy n m u trong dos.h nh sau:ờ ẫ ư
void poke(unsigned seg, unsigned off, int value);
+ C ng d ng: G i gi tr nguy n value vào b nh t i đ a chụ ụ ử ỏ ị ờ ộ ớ ạ ị ỉ
phõn đo n seg:offạ
4. Hàm peek: Nh n m t s nguy n t b nh .ậ ộ ố ờ ừ ộ ớ
+ Nguy n m u trong dos.h nh sau:ờ ẫ ư
int peek(unsigned seg, unsigned off);
+ C ng d ng: Nh n m t word t i đ a ch phõn đo n seg:offụ ụ ậ ộ ạ ị ỉ ạ
5. Hàm movedata: Sao c c byte.ỏ
+ Nguy n m u trong mem.h nh sau:ờ ẫ ư
void movedata(unsigned seg_gui, unsigned off_gui,
unsigned seg_nhan, unsigned off_nhan, int n);
+ C ng d ng: Sao n byte t seg_gui:off_gui đ n ụ ụ ừ ế
seg_nhan:off_nhan
§ 2. B nh màn h nh văn b nộ ớ ỡ ả
2.1. C ch bi u di n ký t trong b nh màn h nhỏ ể ễ ự ộ ớ ỡ
B nh màn h nh văn b n b t đ u t đ a ch :ộ ớ ỡ ả ắ ầ ừ ị ỉ
(0xb800:0x0000)
Khi đ a m t ký t vào v ng nh màn h nh, th nú s hi n l nư ộ ự ự ớ ỡ ỡ ẽ ệ ờ
màn h nh. M i ký t tr n màn h nh chi m 2 byte trong b nhỡ ỗ ự ờ ỡ ế ộ ớ
màn h nh: byte đ u ch a mó ASCII, byte th hai bi u di n m uỡ ầ ứ ứ ể ễ ầ
hi n th g i là byte thu c t nh. C c bit c a byte thu c t nh:ể ị ọ ộ ớ ỏ ủ ộ ớ
B7B6B5B4B3B2B1B0
đ c chia làm 3 nhúm:ượ
+ Nhúm 1 g m bit B7 bi u th s nh p nh y. N u B7=0 th kýồ ể ị ự ấ ỏ ế ỡ
t kh ng nh p nh y, n u B7=1 th ký t s nh p nh y.ự ụ ấ ỏ ế ỡ ự ẽ ấ ỏ
+ Nhúm 2 g m c c bit B6, B5 và B4. C c bit này ch a đ cồ ỏ ỏ ứ ượ
m t s nguy n t 0 đ n 7 và bi u th 8 m u n n c a ký t .ộ ố ờ ừ ế ể ị ầ ề ủ ự
+ Nhúm 3 g m c c bit B3, B2, B1 và B0. C c bit này ch a đ cồ ỏ ỏ ứ ượ
m t s nguy n t 0 đ n 15 và bi u th 16 m u c a ký t .ộ ố ờ ừ ế ể ị ầ ủ ự
2.2. Trang màn h nhỡ
491 492

M i trang màn h nh g m 80x25 ký t , do đú c n 80x25x2=4000ỗ ỡ ồ ự ầ
byte b nh . Th c t m i trang màn h nh đ c phõn b 4096 ộ ớ ự ế ỗ ỡ ượ ố =
0x1000 byte. Nh v y 4 trang màn h nh đ c phõn b nh sau:ư ậ ỡ ượ ố ư
+ Trang màn h nh th 0 b t đ u t đ a ch 0xB800:0x0000ỡ ứ ắ ầ ừ ị ỉ
+ Trang màn h nh th 1 b t đ u t đ a ch 0xB800:0x1000ỡ ứ ắ ầ ừ ị ỉ
+ Trang màn h nh th 2 b t đ u t đ a ch 0xB800:0x2000ỡ ứ ắ ầ ừ ị ỉ
+ Trang màn h nh th 3 b t đ u t đ a ch 0xB800:0x3000ỡ ứ ắ ầ ừ ị ỉ
2.3. Ch n trang hi n thọ ể ị
T i m i th i đi m ch cú th hi n th đ c m t trong 4 trangạ ỗ ờ ể ỉ ể ể ị ượ ộ
màn h nh. Đ hi n th trang màn h nh th t (t=0,1,2,3) chỳng ta sỡ ể ể ị ỡ ứ ử
d ng ch c năng 5 c a ng t 0x10 theo m u sau:ụ ứ ủ ắ ẫ
union REGS v,r;
v.h.ah = 5 ; // Ch c năng 5ứ
v.h.al = t ; // S hi u trang màn h nh c n hi n thố ệ ỡ ầ ể ị
int86(0x10, &v, &r); // Th c hi n ng t 0x10ự ệ ắ
2.4. V d minh hoớ ụ ạ
V d sau d ng hàm pokeb đ đ a c c ký t vào c c trang c aớ ụ ự ể ư ỏ ự ỏ ủ
b nh màn h nh, sau đú d ng ch c năng 5 c a ng t 0x10 độ ớ ỡ ự ứ ủ ắ ể
ch nọ trang hi n th .ể ị
//CT9_03.CPP
#include <dos.h>
#include <conio.h>
char d1[]={'C',1*16+14,'H',1*16+14,'U',1*16+14,'C',1*16+14};
char d2[]={'M',2*16+15,'U',2*16+15,'N',2*16+15,'G',2*16+15};
void main()
{
union REGS v,r;
clrscr();
//M c đ nh hi n th trang 0ặ ị ể ị
for (int i=0;i<8;++i)
pokeb(0xb800,i,d1[i]);
getch();
//Hien thi trang 1
v.h.ah = 5 ; v.h.al = 1 ;
int86(0x10,&v,&r);
for (i=0;i<8;++i)
pokeb(0xb800,0x1000+i,d2[i]);
getch();
//Hien thi trang 0
v.h.ah = 5 ; v.h.al = 0 ;
int86(0x10,&v,&r);
getch();
//Hien thi trang 1
v.h.ah = 5 ; v.h.al = 1 ;
int86(0x10,&v,&r);
getch();
}
§ 3. chuy n Đ i đ a ch ể ổ ị ỉ
3.1. Đ chuy n t đ a ch th c sang đ a ch phõn đo n ta d ngể ể ừ ị ỉ ự ị ỉ ạ ự
c c macro: ỏ
unsigned FP_SEG(đ a_ch _th c) ị ỉ ự
unsigned FP_OFF(đ a_ch _th c)ị ỉ ự
3.2. Đ chuy n t đ a ch phõn đo n sang đ a ch th c ta d ngể ể ừ ị ỉ ạ ị ỉ ự ự
macro:
void far *MK_FP(seg,off)
493 494

V d 1ớ ụ . Sau khi th c hi n c c cõu l nh:ự ệ ỏ ệ
char buf[100];
unsigned ds,dx;
ds = FP_SEG(buf); dx = FP_OFF(buf);
th ds:dx ch a đ a ch c a m ng buf.ỡ ứ ị ỉ ủ ả
V d 2.ớ ụ Sau khi th c hi n c c cõu l nh:ự ệ ỏ ệ
char far *pchar;
pchar = (char far*)MK_FP(0xb800:0);
th pchar tr t i đ a ch đ u c a b nh màn h nh. Khi đú ta cúỡ ỏ ớ ị ỉ ầ ủ ộ ớ ỡ
th s d ng c c l nh g n đ truy nh p tr c ti p t i b nh mànể ử ụ ỏ ệ ỏ ể ậ ự ế ớ ộ ớ
h nh.ỡ
§ 4. c c v d minh hoỏ ớ ụ ạ
Ch ng tr nh 1. ươ ỡ Ch ng tr nh minh ho c ch truy nh p tr cươ ỡ ạ ỏ ậ ự
ti p vào b nh màn h nh cú đ a ch đ u là 0xB800:0. Ch ngế ộ ớ ỡ ị ỉ ầ ươ
tr nh g m hàm main() và hai hàm sau:ỡ ồ
1. Hàm cuaso
void cuaso(int dongt,int cott,int dongd,int cotd,int maucs);
thi t l p m t c a s m u cú to đ gúc tr n-tr i là (dongt, cott) vàế ậ ộ ử ổ ầ ạ ộ ờ ỏ
gúc d i-ph i là (dongd,cotd). M u cho b i tham s maucs. đõyướ ả ầ ở ố ở
s d ng hàm pokeb và đ a ch phõn đo n.ử ụ ị ỉ ạ
2. Hàm duarmh
void duarmh(char *day, int dong, int cotd, int cotc,int m_nen,
int m_chu);
s đ a ra màn h nh m t d y ký t (ch a trong dóy) t i dũng dong,ẽ ư ỡ ộ ẫ ự ứ ạ
t c t cotd đ n cotc. M u n n cho b i m_nen, m u ch cho b iừ ộ ế ầ ề ở ầ ữ ở
m_ch . đõy s d ng to n t g n tr n đ a ch th c.ữ ở ử ụ ỏ ử ỏ ờ ị ỉ ự
Trong hàm main() s s d ng c c hàm cuaso và duarmh đ t oẽ ử ụ ỏ ể ạ
hai c a s và vi t hai dũng ch tr n trang màn h nh th hai (tử ổ ế ữ ờ ỡ ứ ừ
dũng 26 đ n dũng 50).ế
/*
ch ng tr nh minh ho c ch truy nh p tr c ti p vào bươ ỡ ạ ỏ ậ ự ế ộ
nh c a màn h nhớ ủ ỡ
*/
#include "dos.h"
#include "conio.h"
void duarmh(char *day, int dong,I nt cotd, int cotc,I nt m_nen,
int m_chu);
void cuaso(int dongt,int cott,int dongd,int cotd,int maucs);
main()
{
cuaso(26,1,50,80,BLUE);
duarmh("Chuc mung nam moi", 28, 30, 50, MAGENTA,
WHITE);
cuaso(30,20,46,60,RED);
duarmh("Chuc mung nam moi", 40, 30, 50, MAGENTA,
YELLOW);
getch();
}
void cuaso(int dongt,int cott,int dongd,int cotd,int maucs)
/* Dung dia phan doan */
{
int i, j, p, t, dt, dd, mau;
union REGS v, r;
/* Xac dinh thuoc tinh mau */
mau = (maucs << 4)+maucs;
/*
Xac dinh trang man hinh t
495 496

va cac chi so dong tren dt, dong duoi dd
trong trang t
*/
t=(dongt-1)/25;
dt=(dongt-1)-t*25; dd=(dongd-1)-t*25;
/* Chon t la trang hien thi */
v.h.ah=5;v.h.al=t; int86(0x10,&v,&r);
/*
Dua cac khoang trong (ma 32) va thuoc tinh mau
vao cac vi tri thich hop cua bo nho man hinh
*/
for (i=dt;i<=dd;++i)
{
p=t*4096+i*160+(cott-1)*2;
for (j=0;j<=cotd-cott;++j)
{
pokeb(0xb800,p+2*j,32);
pokeb(0xb800,p+2*j+1,mau);
}
}
}
void duarmh(char *day, int dong, int cotd, int cotc, int m_nen,
int m_chu)
/* Dung dia chi thuc */
{
int i,p,t,d,kt,mau;
char far *buf;
union REGS v,r;
/* Lay dia chi thuc cua bo nho man hinh */
buf=(char far*)MK_FP(0xb800,0);
/* Xac dinh thuoc tinh mau */
mau = (m_nen << 4)+m_chu;
/*
Xac dinh trang man hinh t
va cac chi so dong d trong trang t
*/
t=(dong-1)/25; d=dong-1-t*25;
/* Chon t la trang hien thi */
v.h.ah=5;v.h.al=t; int86(0x10,&v,&r);
p=t*4096+d*160+(cotd-1)*2;
/*
Dua cac ky tu va thuoc tinh mau
vao cac vi tri thich hop cua bo nho man hinh
*/
for (i=0;i<=cotc-cotd;++i)
{
if ((kt=day[i])==0) break;
buf[p+2*i]=kt;
buf[p+2*i+1]=mau;
}
}
Ch ng tr nh 2. ươ ỡ Bi t đ a ch c a c c th t c x lý ng t đ cế ị ỉ ủ ỏ ủ ụ ử ắ ượ
l u tr trong b nh t đ a ch 0000:0000 đ n 0000:0x0400.ư ữ ộ ớ ừ ị ỉ ế
Ch ng tr nh s cho bi t đ a ch c a th t c x lý ng t n (gi trươ ỡ ẽ ế ị ỉ ủ ủ ụ ử ắ ỏ ị
n nh p vào t bàn ph m). S hi u c a ng t đ c t nh t 0, nh ngậ ừ ớ ố ệ ủ ắ ượ ớ ừ ư
n đ c đ nh s t 1.ượ ỏ ố ừ
497 498

/*
Xac dinh dia chi cac thu tuc ngat */
#include "dos.h"
#include "conio.h" #include "stdio.h"
main()
{
unsigned char far *p; /*p se tro toi bang vecto ngat*/
int n; /* n - so hieu ngat, n=1,2,... */
int k; /* vi tri cua ngat n trong bang vecto ngat */
unsigned seg,off;
/* p tro toi bang vecto ngat */
p=(unsigned char far*)MK_FP(0,0);
clrscr();
while(1)
{
printf("\n So hieu ngat (Bam 0 - Ket thuc): ");
scanf("%d",&n); if(n==0) break;
k=(n-1)*4;
off=p[k]+256*p[k+1]; seg=p[k+2]+256*p[k+3];
printf("\nDia chi %x:%x",seg,off);
}
}
Ch ng tr nh 3.ươ ỡ Ch ng tr nh minh ho c ch d ng con trươ ỡ ạ ỏ ự ỏ
hàm đ th c hi n th t c kh i đ ng l i m y c a DOS, bi t đ aể ự ệ ủ ụ ở ộ ạ ỏ ủ ế ị
ch đ u c a th t c này là 0xFFFF:0000 . Ch ng tr nh y u c uỉ ầ ủ ủ ụ ươ ỡ ờ ầ
nh p m t kh u. N u ch n đỳng (b m ABCD và Enter) thậ ậ ẩ ế ọ ấ ỡ
ch ng tr nh ti p t c làm vi c, n u vào sai th s kh i đ ng l iươ ỡ ế ụ ệ ế ỡ ẽ ở ộ ạ
m y.ỏ
#include <dos.h>
#include <conio.h>
#include <iostream.h>
#include <ctype.h>
typedef void far (*HAM)(void);
void khoi_dong_may(void)
{
HAM f;
f = (HAM)MK_FP(0xFFFF,0);
f();
}
char mat_khau[]= {'A','B','C','D'};
int n = sizeof(mat_khau)/sizeof(char);
void main()
{
char i, ch, sai_mat_khau;
clrscr();
i=0;
sai_mat_khau=0;
cout << "\nMat khau: ";
while(1)
{
ch=getch();
if (ch==13) break;
cout << '*' ;
if (i<n)
{
499 500

