CHNG4:BNHVÀHINTHKÍT
§1.KHÁINIMCHUNG
Trongphnnàytasxemxétvicxlíhinthkítbngcáchxâm
nhptrctipvàobnh(direcmemoryaccessDMA).Tastìmhiucách
xâmnhptrc
tipmànhình.CáchnàynhanhhnlàdùngcáchàmcaC.
§2.CÁCTOÁNTBITWISE
1.Toántbitwiseand(&):Cdùng6toántbitwiseđctómtttrong
bngsau
Phéptoán Kíhiu
and &
or |
xor ^
dchphi >>
dchtrái <<
đo ~
Cácphéptoánnàycóthápdngchodliukiuint,charnhng
khôngápdngchosfloat.
Toánt&(khácviandlogic&&)cnhaitoánhngcókiuging
nhau.Cáctoánh
ngnàyđcandbitvibit.Toánt&thngdùngkim
traxemmtbitcthnàođócótrlàbaonhiêu.Vídđkimtrabitth3
cubinchcótr1hay0tadùngphéptoán:
ch&0x08;
2.Toántor:Toántor(khácorlogic||)thngdùngkthpcácbitt
cácbinkhácnhauvàomtbinduynht.Vídtacóhaibinlàch1vàch2
và
giscácbitt0 3cach1chacáctrmongmuncòncácbit4 7ca
ch2chacáctrmongmun.Khivit:
a=ch1|ch2;
thìc8bitcaađuchatrmongmu
n.
3.Toántdchphi>>:Toántnàylàmvictrênmtbinduynht.Toán
tnàydchtngbittrongtoánhngsangphi.Sbitdchchuynđcch
đnhtrongsđ
itheosautoánt.Vicdchphimtbitđngnghĩavivic
chiatoánhngcho.Víd:01110010 dchsangphi1bitslà
001
11001
36
4. Đitshexsangsnhphân:Tadùngcáctoántbitwiseđđimt
sthhexsangh2.Chngtrìnhnhsau:
Chngtrình41
#include<conio.h>
#include<stdio.h>
voidmain()
{
inti,num,bit;
unsignedintmask;
charstring[10],ch;
clrscr();
do
{
mask=0x8000;
printf(\nBanchomotso:);
scanf(%x,&num);
printf(Dangnhiphancuaso%xla:,num);
for(i=0;i<16;i++)
{
bit=(mask&num)?1:0;
printf(%d,bit);
if(i==7)
printf();
mask>>=1;
}
printf(\nBanmuontinhtiepkhong(c/k)?);
ch=getch();
}
while(ch==c);
getch();
}
Trongchngtrìnhtrêntadùngvònglpforđduytqua16bitca
binnguyênttráiquaphi.Lõicavnđlàcác
phátbiu:
bit=(mask&num)?1:0;
mask>>=1
Trongphátbiuđutiênmasklàbinchcómtbit1duynhtphíatrái
nht.Masknàyđc&vinumđxembittráinhtcanum
cólà1haylà
37
0.Nuktqukhác0(true)bittngngcanumlà1cònngclibit
tngnglà0.Saumiln&maskđcdchtrái1bitđxácđnhbittip
theocanum
là0hay1.
5.Cáctoántbitwisekhác:
a. Toántxor^:Toántxortrvtr1khichcó1bitchkhông
phi2bitcótrlà1
0 0 0
0 1 1
1 0 1
1 1 0
Toántxorcnkhiltbitnghĩalàhoánchuyngia1và0vì1xorvi1là
0và1xorvi0là1.Vídđltbitth3trongbinchtadùng:
ch^0x08
b.Toántdchphi<<:Toántnàytngttoántdchtrái.Giátr
cabitchènvàobênphiluônluônbng0.Dchphitngngvivic
nhânsđ
ócho2.
c.Toántđo:Toántnàylàtoántmtngôi.Nótácđnglêncác
bitcatoánhngvàđotrcabitt1sang0vàt0sang1.Đo2lnmt
sta
linhnđcscũ.
§3.BNHMÀNHÌNH
1.Kháinimchung:Mànhìnhthôngthngcó25dòngvàmidòngcó80
kít. Nhvytoàn bmàn hìnhcó2000kít. Mi
kíttrênmànhình
tngngvimtđachcthtrongbnhmànhình.Mikítdùng2
bytecabnhnày:bytethnhtchamãASCIIcakít(t0đn255
nay
t0đnff)vàbyteth2chathuctínhcanó.Nhvyđhinth
2000kít,bnhmànhìnhphicn4000byte.Bnhmànhìnhđnsc
btđutiB000hvàkt
thúctiB0F9F.Nutacómànhìnhmàuthìvùng
nh chochđvănbn s btđutB8000h và ktthúcti B8F9F.Khi
munhinthkíttrênmànhình,đontrìnhthvin
Csgiđontrình
ROMBIOSđđt kít cnhin thvàođachtngngtrongbnh
nàmhình.Numuncótcđnhanh,hãychèntrctipcácgiátrtrênvào
vùngnhmànhình.
2.Contrfar:Khibitđach,cáchthôngdngđđagiátrvàobnhlà
dùngcontr.Dovynutacnđakítvàovtríđutiêncavùngnh
mànhìnhthìtavi
t:
38
int*ptr;
ptr=0xB800;
*(ptr)=ch;
Đonchngtrìnhtrêncóvhplínhnglikhônglàmvicvìbin
contrthôngthngcóhaibytetrongkhiđachB0000hlidài5chs
(2,5
byte).Lídodnđntìnhtrngnàylàdocontrthngdùngđcha
đichnmtrongmtđonduynhtmàthôi.Trongh8086,mtđondài
10000hhay65535byte.Bêntrongcácđo
nđachyt0hđnFFFFh.Thông
thngcácdliucachngtrìnhCnmtrongmtđonnênđthâm
nhpcácđachnmngoàiđontaphidùngmtcchkhác.Bêntrong
8086,tìnhtrngnàyđckhcphcbngcáchdùngcácthanhghigilà
thanhghiđon.Cácđachnmngoàiđonđctolpbngthpđa
chđonvàđachoffset.
B 0 0 0
0 7 D 0
B 0 7 D 0
TronghìnhtrênđachđonB000hđcdchtrái4bitricngviđach
offset07D0torađachtuytđiB07D0h.
3.Dùngđachđon:offsettrongC:Nhvykhiđachn
mbênngoài
đondliu,Cdùngthpđon:offsetvàyêucudngbiudin32bit(4
byte,8chshex)vi4chschođachđonvà4chschođach
offset.DovyCcoiđachtuytđiB07D0là0xB00007D0(B000vàtheo
saulà07D0).TrongCcontr32đctínhbngcáchdchđachđonsang
trái16bitvàcngviđachoffset.Docon
trthôngthngkhôngthct
giđachdài32bitnêntaphidùngcontrfar.Contrnàyctgiđa
chdài4byte.Vìvychngtrìnhslà:
intfar*ptr;
ptr=0xB8000000;
*(ptr)=ch;
4.
Dùngmtkítđtômànhình:Chúngtadùngcontrfarđghi
lênmànhình2000bnsaocamtkít.Điunàytngtnhdùng
putch().Chngtrìnhktthúcghigõx
Chngtrình
42
39
#include<conio.h>
#include<stdio.h>
#definelength 2000
voidmain()
{
intfar*fptr;
intadd;
charch;
clrscr();
printf(Govaomotkitu,golaidethaydoi);
fptr=(intfar*)0xB8000000;
while((ch=getche())!=x)
for(add=0;add<length;add++)
*(fptr+add)=ch|0x0700;
}
Trongchngtrìnhphát
biu:
*(fptr+add)=ch|0x0700;
dùngđđinđykítlênmànhình.Binchlàkítmunđtvàobnh.
Hng s 0x0700 là byte thuc tính, có nghĩa là không chp nháy, không
đm,chtrngtrên
nnđen.
Phátbiukháccngiithích:
fptr=(intfar*)0xB8000000;
Ta dùng du ngoc vì hng 0xB8000000 và bin int far fptr có kiu khác
nhau:hngcóvlàsnguyêndàicònfptrlilàcontr
chđnkiuint.Do
đóđtránhnhcnhcatrìnhbiêndchtacnbinđikiulàmhngtr
tthànhcontrfarchđnint.Mànhìnhcóthđcxemnhmtmnghai
chiu
gmcáchàngvàct.Đachtngngtrongbnhđctínht
phépnhânshiuhàngvislngcttrongmthàngricngktqu
vàshiuctviđa
chbtđucavùngnhmànhình.Tacóchng
trìnhsau:
Chngtrình43
#include<conio.h>
#include<stdio.h>
#definerowmax25
#definecolmax80
voidmain()
{
intfar*fptr;
introw,col;
40
charch;
clrscr();
printf(Govaomotkitu,golaidethaydoi);
fptr=(intfar*)0xB8000000;
while((ch=getche())!=x)
for(row=0;row<rowmax;row++)
for(col=0;col<colmax;col++)
*(fptr+row*colmax+col)=ch|0x0700;
}
5.Trìnhxlívănbntheodòng:Đbitthênvstinlic
acontrfar
taxétthêmmttrìnhxlívănbntheodòng.Trìnhxlínàychlàmvic
trênmtdòngvănbn.Tastinhànhtheo2bc:đutiênlàmtchng
trìnhchophépngidùnggõvàomtdòngvàdichuynconnháytilui.
Cóthxoákítnhdichuynconnháytiđóvàghiđèlênnó.Chng
trìnhnhsau:
Chngtrình44
#include
<conio.h>
#include<dos.h>
#definecolmax80
#definerarrow77
#definelarrow75
#definevideo0x10
#definectrlc\x03
intcol=0;
intfar*fptr;
unionREGSreg;
voidmain()
{
charch;
voidclear(void);
voidcursor(void);
voidinsert(char);
fptr=(intfar*)0xB8000000;
clear();
cursor();
while((ch=getch())!=ctrlc)
{
41
if(ch==0)
{
ch=getch();
switch(ch)
{
caserarrow:if(col<colmax)
++col;
break;
caselarrow:if(col>0)
col;
break;
}
}
else
if(col<colmax)
insert(ch);
cursor();
}
}
voidcursor()
{
reg.h.ah=2;
reg.h.dl=col;
reg.h.dh=0;
reg.h.bh=0;
int86(video,®,®);
}
voidinsert(charch)
{
*(fptr+col)=ch|0x0700;
++col;
}
voidclear()
{
intj;
for(j=0;j<2000;j++)
*(fptr+j)=0x0700;
}
42
Đxoámànhìnhtađins0vàovùngnhmànhìnhvithuctính
07.Sauđóconnháyđcdichuynvđumànhìnhnhphcvnđnh
vtríconnháynhsau:
ngt10h
ah=0;
dh=shiudòng
dl=shiuct
bh=shiutrang,thnglà0
Phát biu switch dùngđđoán nhn các phímđc nhn là phím
thnghayphímchcnăng.Phímmũi
têndùngtănggimcolvàgihàm
cursor()đdichuynconnháytiđó.Nukítgõvàolàkítthng,nó
đcchènvàonhhàminsert().
6.Bytethuctính:Mtkíttrênmàn
hìnhđclugibi2byte:mt
bytelàmãcakítvàbytekialàthuctínhcanó.Bytethuctínhđc
chialàmnhiuphn,bitnàobng1thìthìthuctínht
ngngđcbt.
Bitth3điukhinđsángcònbitth7điukhinđchpnháy.Cácbit
cònlilà:6thànhphnđcamàunn;5thànhphngreencamàu
nn;4thành
phnbluecamàunn;2thànhphnđcamàuch;1
thànhphngreencamàuch;0thànhphnbluecamàuch.Talp
mtchngtrìnhđđinđymànhình
bngcáckítchpnháy.
Chngtrình45
#include<conio.h>
#include<stdio.h>
#definerowmax25
#definecolmax80
voidmain()
{
intfar*fptr;
introw,col;
charch;
clrscr();
printf(Govaomotkitu,golaidethaydoi);
fptr=(intfar*)0xB8000000;
while((ch=getche())!=x)
for(row=0;row<rowmax;row++)
for(col=0;col<colmax;col++)
43
*(fptr+row*colmax+col)=ch|0x8700;
}
Đbtchpnháytađbitth7thành1,3bitmàunn0,1và2đc
đttr1nênnnslàđen.Bytethuctínhlúcnàylà10000111=87h.
7. Chngtrìnhđinthuctính:Đhiusâuhnthuctínhcakíttaxét
chngtrìnhsau
Chngtrình46
#include<conio.h>
#include<stdio.h>
#definerowmax25
#definecolmax80
voidmain()
{
intfar*fptr;
charch,attr=0x07;
voidfill(char,char);
clrscr();
printf(Gonchochubinhthuong,\n);
printf(Gobchochuxanhnuocbien,\n);
printf(Goichochusang,\n);
printf(Gocchochuchopnhay,\n);
printf(Gorchochudaomau\n);
while((ch=getche())!=x)
{
switch(ch)
{
casen:attr=0x07;
break;
caseb:attr=attr&0x88;
attr=attr|0x01;
break;
casei:attr=attr^0x08;
break;
casec:attr=attr^0x80;
break;
caser:attr=attr&0x88;
attr=attr|0x70;
break;
44
}
fill(ch,attr);
}
}
voidfill(charch,charattr)
{
intfar*fptr;
introw,col;
fptr=(intfar*)0xB8000000;
for(row=0;row<rowmax;row++)
for(col=0;col<colmax;col++)
*(fptr+row*colmax+col)=ch|attr<<8;
}
Tronghàmfill()tacólnh
*(fptr+row*colmax+col)=ch|attr<<8;
vìattrlàkítnênphidchtrái8bittr
ckhikthpvich.
8.Trlixlívănbn:Bâygichúngtađãbitthuctínhcakítvàta
smrngchngtrìnhxlívănbnbng
cáchthêmvàovicchènvàhu
bkít,đimàu.
Chngtrình47
#include<conio.h>
#include<dos.h>
#definecolmax80
#definerarrow77
#definelarrow75
#definevideo0x10
#definenorm0x07
#defineblue0x01
#definebkspc8
#definealtu22
#definectrlc\x03
int
col=0;
intlength=0;
intfar*fptr;
unionREGSreg;
voidmain()
{
45
charch,attr=norm;
voidclear(void);
voidcursor(void);
voidinsert(char,char);
voiddel(void);
fptr=(intfar*)0xB8000000;
clear();
cursor();
while((ch=getch())!=ctrlc)
{
if(ch==0)
{
ch=getch();
switch(ch)
{
caserarrow:if(col<length)
++col;
break;
caselarrow:if(col>0)
col;
break;
casealtu:
attr=(attr==norm)?blue:norm;
}
}
else
switch(ch)
{
casebkspc:if(length>0)
del();
break;
default:if(length<colmax)
insert(ch,attr);
}
cursor();
}
}
voidcursor()
{
reg.h.ah=2;
46
reg.h.dl=col;
reg.h.dh=0;
reg.h.bh=0;
int86(video,®,®);
}
voidinsert(charch,charattr)
{
inti;
for(i=length;i>col;i)
*(fptr+i)=*(fptr+i1);
*(fptr+col)=ch|attr<<8;
++length;
++col;
}
voiddel()
{
inti;
for(i=col;i<=length;i++)
*(fptr+i1)=*(fptr+i);
length;
col;
}
voidclear()
{
intj;
for
(j=0;j<2000;j++)
*(fptr+j)=0x0700;
}
KhigõthpphímAlt+Usltbinattrqualigianorm(thuctính
07)vàblue(chochmàuxanhthuctính01).Hàminsert(0cóvònglpfor
dùngđthâmnhptrcti
pbnhvàcontrfarđdchcáckítsangtrái
khicnchèn.Tintrìmhdchphibtđutcuicâuđtránhghiđèlên.
§4.CÁCKIUBNHTRONGC
1.Đachđonvà
offset:TrongCkiubnhlàkháinimđchvlng
cácphnbnhkhácnhaumàchngtrìnhcóthchim.Cchophép6
47
kiubnhlàtiny,small,compact,medium,largevàhuge.Kiubnh
mcđnhlàsmall.
Bvixlídùngcácthanhghi16bitđghiđach.Thanhghi16bit
luđcffffhbytehay65536hay64Kbđa
ch.Vùngnhcókíchthc
nàygilàđon.Đtruycpđachnmngoàiđon,bvixlíphidùng
haithanhghilàthanhghiđonvàthanhghioffset.Đachthcđctính
b
ngcáchdchđachcathanhghiđonsangtrái4bitricngvithanh
ghioffset.Làmnhvytađánhđachđcfffffhhay1048576=1Mb.
2.Hailoichthcabvi
xlí:Bvixlídùnghaikĩthutkhácnhauđ
thamchiudliutrongbnh.Nuvtrícnthamchiunmtrongđon
64Kbvàđonnàyđãđcchđnhtrongthanhghiđo
nthìbvixlích
cndùngmtlnhduynhtđtruycpdliu.Cáchnàytngngvi
vicdùngcontrneartrongCvàthchinrtnhanh.Tráilinu
bvix
lícnthamchiuônhnmngoàiđonthìđutiênnóphithayđiđa
chđonvàsauđoalàđachoffset.Điunàytngngvivicdùngcon
trfartrong
Cvàthchinkháchm.
3.Cáckiucompact,small,mediumvàlarge:Có4loichthcabvix
língvi4kiubnhtrongC
Kiu Mã Dliu
small near near
medium far near
compact near far
large far far
Numãchngtrìnhnmgntrongmtđon64Kvàmãdliu
nmgntrongmtđon64Kkhácthìkiubnhsmalllàthíchhp.Nu
mãchngtrình
lnhn64Kvàmãdliunmgntrongmtđon64K
khácthìhãydùngkiubnhmedium.Numãchngtrìnhnhhn64K
vàmãdliulnhn
64Kthìhãydùngkiubnhcompact.Nucmã
chngtrìnhvàmãdliulnhn64Kthìhãydùngkiubnhlarge.
4.Kiutynivàkiuhuge:Kiutyniđcdùngtrong
cáctrnghpđc
bitvilngbnhchocmãchngtrìnhlnmãdliunmgntrong
mtđon. Kiu nàyđc dùngđto ra tp tin dng *.com. Ki
u huge
đcdùngchômtmcdliu(thnglàmng)màbnthânnólnhn
64K.
48
§5.TCHADANHMCTHITB
Đâylàmtvùngbnhdài2bytenmtrongvùngnhthpcóđa
chtuytđilà410hchathôngtinvthitbđcnivimáytính.Đ
truycp tnàytadùngcontrfar.Con trschtiđon0000,đach
offsetlà0410hvàđcbiudintrongClà00000410hay0x410.Tcha
danhmcthitbbaogm:
- bit0:
bng1nucóđĩamm
- bít1:khôngdùng
- bit2,3:RAMmchhthng00=16K;01=32K;11=64K
- bit 4, 5: kiu màn hình 01 màu(40 ct); 10 màu(80 ct); 11đn
s
c(80ct)
- bit6,7:sđĩa00mt;01hai;10ba;11bn
- bit8,9:cólpchípDMAhaykhông
- bit10,11:scngnitip
- bit12:cólpgameadaptorkhông
- bit13:cólpmáyinnitipkhông
- bit14,15:smáyinđangcó
Đxemxéttngbitvànhómbittrongtnàychúngtasdùngcác
toántbitweise.Nóichungtasdchtchadanh
mcthitbsangphi
vàđacácbitcnquantâmvàophíaphicatvàchecácbitkhôngquan
tâmpháitráibngtoántand.Ngoàitchadanhmcthitbtacóth
đctchakíchthcbnhtiđach413h.
Chngtrình48
#defineeqlist0x410
#definememsiz0x413
#include<conio.h>
#include<stdio.h>
voidmain()
{
intfar*fptr;
unsignedinteq,data;
clrscr();
fptr=(intfar*)eqlist;
eq=*(fptr);
data=eq>>14;
printf(So
mayinla:%d\n,data);
if(eq&0x2000)
printf(Comayinnoitiep\n);
data=(eq>>9)&7;
49
printf(Socongnoitiepla:%d\n,data+1);
if(eq&1)
{
data=(eq>>6)&3;
printf(Sodiamemla:%d\n,data);
}
else
printf(Khongcodiamem\n);
data=(eq>>4)&3;
switch(data)
{
case1:printf(Manhinhmau40cot\n);
break;
case2:printf(
Manhinhmau80cot\n);
break;
case3:printf(Manhinhdonsac80cot\n);
}
fptr=(intfar*)memsiz;
printf(Dungluongbonho:%dKbyte\n,*(fptr));
getch();
}
50