ch ng 9ươ
Truy nh p tr c ti p 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 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 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 t vào v ng nh màn h nh, th s hi n l nư
màn h nh. M i t tr n màn h nh chi m 2 byte trong b nh ế
màn h nh: byte đ u ch a 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 ế
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 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 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 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 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
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 đ a ch đ u 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 (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 duarmh đ t o
hai c a s 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 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 0xFFFF:0000 . Ch ng tr nh y u c u ươ
nh p m t kh u. N u ch n đỳng (b m ABCD 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