[r]
(1)chương 9
Truy nh p tr c ti p vào b nhậ ự ế ộ ớ
Trong chương tr nh b y c c v n đ :ỡ ầ ỏ ấ ề
+ Hai ki u đ a ch : Đ a ch phõn đo n đ 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 h nh, truy nh p tr c ti p vào b nh mànộ ỡ ậ ự ế ộ
h nhỡ
+ D ng tr đ l y d li u t b nh phõn đo nự ỏ ể ấ ữ ệ ộ
+ D ng tr hàm đ th c hi n c c th t c c a DOSự ỏ ể ự ệ ỏ ủ ụ ủ
§ 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 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 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 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 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 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
§ B nh h nh văn b nộ ớ ỡ ả
2.1 C ch bi u di n ký t b nh h nhỏ ể ễ ự ộ ớ ỡ
B nh 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 h nh, th nú s hi n l nư ộ ự ự ỡ ỡ ẽ ệ
màn h nh M i ký t tr n h nh chi m byte 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 byte thu c t nh C c bit c a byte thu c t nh:ể ị ọ ộ ỏ ủ ộ
B7B6B5B4B3B2B1B0 chia làm nhúm:
+ Nhúm 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 g m c c bit B6, B5 B4 C c bit ch a đồ ỏ ỏ ứ ược m t s nguy n t đ n bi u th m u n n c a ký t ộ ố ế ể ị ầ ề ủ ự
+ Nhúm g m c c bit B3, B2, B1 B0 C c bit ch a đồ ỏ ỏ ứ ược m t s nguy n t đ n 15 bi u th 16 m u c a ký t ộ ố ế ể ị ầ ủ ự
2.2 Trang h nhỡ
(2)M i trang h nh g m 80x25 ký t , đú c n 80x25x2=4000ỗ ỡ ự ầ
byte b nh Th c t m i trang h nh độ ự ế ỗ ỡ ược phõn b 4096 ố = 0x1000 byte Nh v y trang h nh đư ậ ỡ ược phõn b nh sau:ố
+ Trang h nh th b t đ u t đ a ch 0xB800:0x0000ỡ ứ ắ ầ ị ỉ
+ Trang h nh th b t đ u t đ a ch 0xB800:0x1000ỡ ứ ắ ầ ị ỉ
+ Trang h nh th b t đ u t đ a ch 0xB800:0x2000ỡ ứ ắ ầ ị ỉ
+ Trang h nh th b t đ u t đ a ch 0xB800:0x3000ỡ ứ ắ ầ ị ỉ
2.3 Ch n trang hi n thọ ể ị
T i m i th i m ch cú th hi n th đạ ỗ ể ỉ ể ể ị ược m t trangộ
màn h nh Đ hi n th trang h nh th t (t=0,1,2,3) chỳng ta sỡ ể ể ị ỡ ứ
d ng ch c c a ng t 0x10 theo m u sau:ụ ứ ủ ắ ẫ
union REGS v,r;
v.h.ah = ; // Ch c 5ứ
v.h.al = t ; // S hi u trang 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 h nh, sau đú d ng ch c c a ng t 0x10 độ ỡ ự ứ ủ ắ ể
ch 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 v.h.ah = ; v.h.al = ; int86(0x10,&v,&r); for (i=0;i<8;++i)
pokeb(0xb800,0x1000+i,d2[i]); getch();
//Hien thi trang v.h.ah = ; v.h.al = ; int86(0x10,&v,&r); getch();
//Hien thi trang v.h.ah = ; v.h.al = ; int86(0x10,&v,&r); getch();
}
§ 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)
(3)V d 1ớ ụ Sau 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 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 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.ỡ
§ c c v d minh hoỏ ớ ụ ạ
Chương tr nh ỡ Chương tr nh minh ho c ch truy nh p tr cỡ ỏ ậ ự
ti p vào b nh h nh cú đ a ch đ u 0xB800:0 Chế ộ ỡ ị ỉ ầ ương tr nh g m hàm main() 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 (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 đ 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 h nh m t d y ký t (ch a 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 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 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