intTypePromotion=1
zunia.vn Tuyển sinh 2024 dành cho Gen-Z zunia.vn zunia.vn
ADSENSE

Lập trình bằng Turbo Pascal part 10

Chia sẻ: Ashfjshd Askfaj | Ngày: | Loại File: PDF | Số trang:22

107
lượt xem
27
download
 
  Download Vui lòng tải xuống để xem tài liệu đầy đủ

Bộ vi xử lí họ 8086 dùng 20 bit để đánh địa chỉ bộ nhớ. Suy ra nó quản lí được một không gian địa chỉ gồm 220 bit = 1 MB hay 1.048.576 địa chỉ. Nhưng các thanh ghi chỉ có 16 bit, chỉ có thể quản lí một không gian địa chỉ gồm 216 bit = 64 KB hay 65.536 địa chỉ. Vì lí do này, bộ nhớ được chia làm nhiều đoạn - segment, mỗi đoạn gồm 64 KB. Địa chỉ một ô nhớ gồm hai phần, có dạng Segment: offset. Segment là địa chỉ đoạn, được...

Chủ đề:
Lưu

Nội dung Text: Lập trình bằng Turbo Pascal part 10

  1. LËp tr×nh b»ng Turbo Pascal BP IP CS DS SS ES Flags 1.1.2 CÊu tróc cña ®Þa chØ trong bé nhí . Bé vi xö lÝ hä 8086 dïng 20 bit ®Ó ®¸nh ®Þa chØ bé nhí. Suy ra nã qu¶n lÝ ®−îc mét kh«ng gian ®Þa chØ gåm 220 bit = 1 MB hay 1.048.576 ®Þa chØ. Nh−ng c¸c thanh ghi chØ cã 16 bit, chØ cã thÓ qu¶n lÝ mét kh«ng gian ®Þa chØ gåm 216 bit = 64 KB hay 65.536 ®Þa chØ. V× lÝ do nμy, bé nhí ®−îc chia lμm nhiÒu ®o¹n - segment, mçi ®o¹n gåm 64 KB. §Þa chØ mét « nhí gåm hai phÇn, cã d¹ng Segment: offset. Segment lμ ®Þa chØ ®o¹n, ®−îc ghi trong c¸c thanh ghi ®o¹n, cßn offset lμ ®é dÞch chuyÓn, ®−îc ghi trong c¸c thanh ghi offset. §Þa chØ thùc cña « nhí sÏ nhËn ®−îc sau khi nh©n ®Þa chØ ®o¹n víi 16 (hay lμ dÞch tr¸i 4 bit) råi céng víi ®i¹ chØ offset. Trong Pascal ng−êi ta dïng dÊu hiÖu $ ®øng tr−íc mét sè hÖ ®Õm 16 (hexadecimal) ®Ó ph©n biÖt víi sè thËp ph©n th«ng th−êng. C¸c ®Þa chØ « nhí th−êng ®−îc viÕt b»ng sè trong hÖ ®Õm c¬ sè 16. VÝ dô $F12A:$E82B. §Þa chØ thùc t−¬ng øng sÏ lμ $F12A0 + $E82B = $FFACB. 1.2 C¸c ng¾t - interrupt 1024 byte ®Çu tiªn trong bé nhí ®−îc chia thμnh 256 bé 4 byte, chøa ®−îc 256 ®Þa chØ, trá ®Õn c¸c ch−¬ng tr×nh xö lÝ c¸c c«ng viÖc c¬ së cña hÖ thèng gäi lμ c¸c vÐc t¬ ng¾t - Interrupt. C¸c ng¾t ®−îc ®¸nh sè tõ 0 ®Õn 255 hay lμ tõ $00 ®Õn $FF. Mét ng¾t l¹i cã thÓ lμm vμi viÖc kh¸c nhau, mçi viÖc nh− thÕ còng g¸n t−¬ng øng víi mét sè nguyªn, gäi lμ chøc n¨ng cña ng¾t. VÝ dô, ng¾t sè 16 = $10 lμ ng¾t phôc vô mμn h×nh. Ng¾t nμy l¹i cã nhiÒu chøc n¨ng kh¸c nhau nh− $00: ThiÕt lËp chÕ ®é mμn h×nh. $03: LÊy to¹ ®é con ch¹y trªn mμn h×nh v¨n b¶n. $0F: LÊy chÕ ®é hiÖn t¹i cña mμn h×nh. .... NguyÔn §×nh Ho¸, ViÖn CNTT - §HQG Hμ néi 245
  2. LËp tr×nh b»ng Turbo Pascal D−íi ®©y lμ b¶ng mét sè vÐc t¬ ng¾t. Ng¾t sè T¸c dông ThËp Hex. ph©n Xö lÝ khi cã phÐp chia cho 0 0 $00 Cho ch¹y ch−¬ng tr×nh tõng b−íc (®Ó söa lçi) 1 $01 §äc m· quÐt tõ bμn phÝm 9 $09 BIOS gäi c¸c phôc vô mμn h×nh 16 $10 ... DOS chÊm døt ch−¬ng tr×nh .COM 32 $20 Thùc hiÖn rÊt nhiÒu chøc n¨ng cña DOS 33 $21 ... ... 1.3 Th©m nhËp trùc tiÕp qua thanh ghi vµ ng¾t 1.3.1 Thñ tôc gäi ng¾t. Ta nh¾c l¹i c¸ch gäi ng¾t thùc hiÖn c¸c chøc n¨ng cña chóng tõ mét ch−¬ng tr×nh viÕt b»ng hîp ng÷. Sau khi g¸n sè hiÖu chøc n¨ng cho thanh ghi AH, c©u lÖnh INT sè hiÖu ng¾t ®−îc dïng ®Ó gäi thùc hiÖn ng¾t. C¸c kÕt qu¶ nÕu cã ®−îc tr¶ vÒ trong c¸c thanh ghi. ViÖc gäi thùc hiÖn ng¾t tõ trong mét ch−¬ng tr×nh Pascal còng qua nh÷ng b−íc t−¬ng tù. Unit Dos cña TurboPascal cung cÊp c¸c hç trî cÇn thiÕt ®Ó thùc hiÖn gäi ng¾t. Tr−íc hÕt, ®Ó truy cËp c¸c thanh ghi cña bé vi xö lÝ, cã kiÓu d÷ liÖu thanh ghi - Registers ®−îc ®Þnh nghÜa trong Unit Dos nh− sau Type registers = record Case Integer of 0: (AX, BX, CX, DX, BP, SI, DI, DS, ES, Flags: word); 1: (AL, AH, BL, BH, CL, CH, DL, DH: byte); End; §©y lμ mét kiÓu b¶n ghi cã cÊu tróc thay ®æi nh»m cã thÓ th©m nhËp riªng rÏ byte thÊp vμ byte cao cña c¸c thanh ghi AX,BX,CX,DX. Unit Dos cung cÊp hai thñ tôc Intr vμ MsDos ®Ó gäi thùc hiÖn c¸c ng¾t. Intr( IntNum: Word; Var Regs: Registers); NguyÔn §×nh Ho¸, ViÖn CNTT - §HQG Hμ néi 246
  3. LËp tr×nh b»ng Turbo Pascal MsDos( Var Regs: Registers); BiÕn thanh ghi Regs ®ãng vai trß cung cÊp d÷ liÖu ®Çu vμo cho ng¾t ®−îc gäi vμ còng lμ n¬i ®Ó nhËn kÕt qu¶ tr¶ vÒ nÕu cã. MsDos dμnh riªng ®Ó gäi c¸c phôc vô cña Dos, øng víi ng¾t sè $21. Lêi gäi MsDos(Regs) t−¬ng ®−¬ng víi lêi gäi Intr( $21, Regs) v× ng¾t sè $21 lμ c¸c phôc vô cña DOS. 1.3.2 C¸c b−íc gäi ng¾t - Khai b¸o mét biÕn kiÓu thanh ghi, vÝ dô Regs - §Æt c¸c gi¸ trÞ cÇn thiÕt cho c¸c thanh ghi th«ng qua c¸c tr−êng cña biÕn Regs. Quy −íc: AH chøa sè hiÖu cña chøc n¨ng. AL chøa sè hiÖu cña chøc n¨ng phô (nÕu cã). C¸c thanh ghi cßn l¹i dïng ®Õn hay kh«ng tuú theo tõng ng¾t. - Gäi thùc hiÖn ng¾t b»ng Intr hay MsDos - NhËn kÕt qu¶ tr¶ vÒ trong c¸c tr−êng cña Regs (nÕu cÇn). §Ó biÕt c«ng viÖc cña mçi ng¾t, c¸c chøc n¨ng ng¾t kh¸c nhau, ý nghÜa cña th«ng tin tr¶ vÒ trong c¸c thanh ghi,v.v.. cÇn tham kh¶o c¸c tμi liÖu tra cøu vÒ hÖ thèng, hÖ ®iÒu hμnh DOS. 1.4 C¸c vÝ dô minh ho¹. 1.4.1 VÝ dô 1. Xem vμ ®Æt l¹i chÕ ®é mμn h×nh. Ng¾t thùc hiÖn c¸c dÞch vô mμn h×nh cã sè hiÖu $10. Ng¾t nμy cã nhiÒu chøc n¨ng kh¸c nhau. a) Xem chÕ ®é mμn h×nh hiÖn hμnh. Chøc n¨ng: AH:=$0F; Gi¸ trÞ tr¶ vÒ: AL = Sè hiÖu cña chÕ ®é mμn h×nh ; AH = sè cét; BH = sè hiÖu cña trang active; program LayCheDoManHinh; uses dos; var regs: registers; BEGIN regs.AH:=$0F; {$0F= chøc n¨ng lÊy chÕ ®é mμn h×nh} Intr($10,regs); {$10 lμ ng¾t vÒ dÞch vô mμn h×nh} With regs do begin NguyÔn §×nh Ho¸, ViÖn CNTT - §HQG Hμ néi 247
  4. LËp tr×nh b»ng Turbo Pascal writeln(' mode man hinh la:',AL); writeln(' so cot :',AH); writeln(' active page :',BH); end; readln END. b) ThiÕt lËp chÕ ®é cho mμn h×nh Chøc n¨ng: AH:=$00; Tham sè ®Çu vμo AL:= sè hiÖu mode mμn h×nh muèn thiÕt lËp; program ThietLapCheDoManHinh; uses dos; var i: integer; procedure SetVideoMode(mode: integer); var regs: registers; begin with regs do begin AH:=0; AL:=mode; Intr($10,regs); End end; BEGIN for i:=0 to 6 do begin SetVideoMode(i); Writeln(' man hinn dang o mode ',i); readln end; END. 1.4.2 VÝ dô 2. Xem vμ thiÕt lËp ngμy hÖ thèng. Ng¾t cã sè hiÖu $21 thùc hiÖn nhiÒu chøc n¨ng kh¸c nhau cña DOS. a) Xem ngμy hÖ thèng. Chøc n¨ng: $2A. Gi¸ trÞ tr¶ vÒ: DL = ngμy; DH = th¸ng; CX = N¨m; program LayNgayHeThong; uses dos; var regs: registers; date,year,month,day: string; NguyÔn §×nh Ho¸, ViÖn CNTT - §HQG Hμ néi 248
  5. LËp tr×nh b»ng Turbo Pascal BEGIN regs.AH:=$2A; { $2A= chøc n¨ng lÊy ngμy hÖ thèng} MsDos(regs); With regs do begin str(CX,year); {chuyÓn gÝa trÞ sè thμnh string} str(DH,month); str(DL,day); end; date:=day+'/'+month+'/'+year; Writeln('hom nay la ngay:',date); readln; END. b) §Æt ngμy th¸ng hÖ thèng Chøc n¨ng AH:=$2B; Tham sè ®Çu vμo: DL:= ngμy (0..31); DH:= th¸ng (0..12); CX:= N¨m (1980..2099); Gi¸ trÞ tr¶ vÒ: AL=0 nÕu thμnh c«ng. AL=255 nÕu cã lçi. program DatNgayThang; uses dos; var regs: registers; BEGIN with regs do begin AH:=$2B; { $2A= chøc n¨ng ®Æt ngμy hÖ thèng} DL:=15; DH:=1; CX:=1999; MsDos(Regs); if AL=0 then Writeln('da dat ngay xong !') else writeln('co loi'); end; END. 1.4.3 VÝ dô 3. Th«ng b¸o vïng trèng trªn ®Üa. §©y còng lμ mét chøc n¨ng cña ng¾t sè $21. Chøc n¨ng AH:= $36; Tham sè ®Çu vμo: DL:= sè hiÖu cña æ ®Üa (0,1,2...); Gi¸ trÞ tr¶ vÒ NguyÔn §×nh Ho¸, ViÖn CNTT - §HQG Hμ néi 249
  6. LËp tr×nh b»ng Turbo Pascal AX= sè sector cho mçi cluster ( = $FFFF nÕu æ ®Üa kh«ng hîp lÖ). BX= sè cluster kh«ng sö dung. CX= sè byte trªn mçi sector. DX= tæng sè sector. Sè vïng trèng trªn ®Üa = LongInt (AX)*BX*CX; program TinhVungTrongTrenDia; uses dos; var TenODia: char; Ketqua: LongInt; function SoByteConRoi(Drv: char): LongInt; var regs: registers; begin with regs do begin AH:=$36; DL:= Ord(Upcase(drv)) - 64; MsDos(Regs); if AX=$FFFF then SoByteConRoi:=-1 else SoByteConRoi:= LongInt(AX)*BX*CX; end; end; BEGIN write(' Cho ten o dia:'); readln(TenODia); Ketqua:= SoByteConRoi(TenODia); if Ketqua =-1 then writeln(' Co loi!') else writeln(' con ', Ketqua:0, 'byte trong '); readln; END. 1.5 Sö dông c¸c hµm, thñ tôc cña unit DOS Trong phÇn tr−íc ta ®· thÊy viÖc th©m nhËp hÖ thèng vμ thùc hiÖn mét sè chøc n¨ng hÖ ®iÒu hμnh DOS mét c¸ch trùc tiÕp sö dông c¸c ng¾t lμ kh¸ tØ mØ vμ mÊt nhiÒu c«ng søc. Unit DOS cña Turbo Pascal cung cÊp mét th− viÖn c¸c ch−¬ng tr×nh con lμm s½n, hç trî ng−êi sö dông trong c¸c giao tiÕp víi hÖ thèng vμ hÖ ®iÒu hμnh. Cã thÓ sö dông c¸c hμm, thñ tôc Êy ®Ó th©m nhËp hÖ thèng dÔ dμng h¬n. VÝ dô, cã thÓ xem vμ ®Æt ngμy th¸ng hÖ thèng b»ng c¸c thñ tôc GetDate, SetDate. program XemVaDatNgay_UnitDos; uses dos; var y,m,d,dow: word; BEGIN NguyÔn §×nh Ho¸, ViÖn CNTT - §HQG Hμ néi 250
  7. LËp tr×nh b»ng Turbo Pascal GetDate(y,m,d,dow); Writeln('GetDate cho ket qua la:',d:2,'/',m:2,'/',y:4,' thu:', dow:1); readln; SetDate(2000,01,01); {§Æt l¹i ngμy hÖ thèng} END. Cã thÓ lμm l¹i ch−¬ng tr×nh trong vÝ dô 3, xem sè byte cßn rçi trªn ®Üa b»ng thñ tôc DiskFree. program TinhVungTrongTrenDia_UnitDos; uses dos; var TenODia: char; SoODia: byte; Ketqua: longInt; BEGIN write(' Cho ten o dia:'); readln(TenODia); SoHieu:= Ord(Upcase(TenODia)) - 64; Ketqua:= DiskFree(SoHieu); if Ketqua =-1 then writeln(' Co loi!') else writeln('O dia ', TenODia,' con ', Ketqua DIV 1024 ,'Kbyte trong !'); readln; END. Râ rμng lμ víi sù hç trî cña unit Dos, viÖc th©m nhËp hÖ thèng, thùc hiÖn c¸c chøc n¨ng th«ng dông cña hÖ ®iÒu hμnh DOS trë nªn dÔ dμng h¬n nhiÒu. CÇn t×m hiÓu kÜ vÒ unit Dos ®Ó n¾m ®−îc c¸ch sö dông rÊt nhiÒu hμm vμ thñ tôc ®· ®−îc lμm s½n trong ®ã. 2. §iÒu khiÓn chuét 2.1 To¹ ®é chuét Mμn h×nh v¨n b¶n chuÈn gåm 80 cét, 25 dßng tøc lμ 2000 « ch÷ nhËt, mçi « hiÓn thÞ mét kÝ tù. Trong khi ®ã, mμn h×nh ®å ho¹ l¹i chia lμm nhiÒu ®iÓm ¶nh, thÊp nhÊt còng lμ 640 x 480 ®èi v¬Ý mμn h×nh VGA. §Ó con chuét cã thÓ dïng trong c¶ hai chÕ ®é mμn h×nh, ng−êi ta quy ®Þnh to¹ ®é micki cña chuét biÕn ®æi trong kho¶ng sau ®©y, kh«ng phô thuéc chÕ ®é v¨n b¶n hay ®å ho¹. 0 ≤ x_mouse ≤ 632. 0 ≤ y_mouse ≤ 192. NguyÔn §×nh Ho¸, ViÖn CNTT - §HQG Hμ néi 251
  8. LËp tr×nh b»ng Turbo Pascal §Ó chuyÓn sang to¹ ®é x_text, y_text trªn mμn h×nh v¨n b¶n, l−u ý r»ng 1 ≤ x_text ≤ 80, ≤ y_text ≤ 25 ta sÏ cã c«ng thøc ®æi to¹ ®é chuét sang to¹ ®é trªn mμn h×nh v¨n b¶n lμ x_text = x_mouse/8 + 1 y_text = y_mouse/8 + 1 Theo c«ng thøc trªn, ta sÏ ®−îc 8 x 8 = 64 ®iÓm chuét trong mét « kÝ tù trªn mμn h×nh v¨n b¶n. Khi nhÊn chuét vμo c¸c ®iÓm nμy ®Òu chØ øng víi mét « vÞ trÝ kÝ tù trªn mμn h×nh v¨n b¶n mμ th«i. C«ng thøc chuyÓn to¹ ®é chuét sang to¹ ®é trªn mμn h×nh ®å ho¹ lμ x_graphics = (x_mouse / 632) * getmaxx; y_graphics = (y_mouse / 192) * getmaxy; ë ®©y getmaxx, getmaxy lμ to¹ ®é x, to¹ ®é y lín nhÊt cña chÕ ®é ®å ho¹ ®ang xÐt. 2.2 Ng¾t ®iÒu khiÓn chuét $ 33 Con chuét ®−îc ®iÒu khiÓn th«ng qua sö dông ng¾t sè hiÖu $33. Ng¾t nμy cã nhiÒu chøc n¨ng kh¸c nhau. CÇn g¸n c¸c sè hiÖu chøc n¨ng (sÏ liÖt kª d−íi ®©y) cho thanh ghi AX (chø kh«ng ph¶i AH nh− c¸c ng¾t kh¸c) C¸c chøc n¨ng ®iÒu khiÓn chuét cña ng¾t $33. 1- Chøc n¨ng 0: khëi t¹o chuét §Çu ra AX:= 0 ch−a cμi ®Æt chuét AX:= -1 ®· cμI ®Æt chuét BX: = sè phÝm chuét (th−êng lμ 2) 2- Chøc n¨ng 1: Lμm hiÖn con trá chuét 3- Chøc n¨ng 2: Lμm Èn con trá chuét 4- Chøc n¨ng 3: LÊy vÞ trÝ vμ kiÓm tra nhÊn phÝm §Çu ra CX:= to¹ ®é x_mouse cña chuét. DX:= to¹ ®é y_mouse cña chuét. BX sÏ cho tr¹ng th¸i cña c¸c phÝm chuét Bit 0 = 0 phÝm tr¸i nh¶. Bit 0 = 1 phÝm tr¸i ®−îc nhÊn. Bit 1 = 0 phÝm ph¶I nh¶. Bit 1 = 1 phÝm ph¶I ®−îc nhÊn. 5 - Chøc n¨ng 4: Di chuyÓn con trá chuét. CX = to¹ ®é x míi §Çu vμo DX = to¹ ®é y míi NguyÔn §×nh Ho¸, ViÖn CNTT - §HQG Hμ néi 252
  9. LËp tr×nh b»ng Turbo Pascal 6- Hái tr¹ng th¸i vμ sè lÇn nhÊn phÝm kÓ tõ khi gäi chøc n¨ng nμy. §Çu vμo BX = phÝm cÇn hái: 0 = tr¸i, 1 = ph¶i, 2 = gi÷a. §Çu ra AX cho tr¹ng th¸i phÝm (0 = nh¶, 1 = nhÊn) BÝt 0 cho tr¹ng th¸i phÝm tr¸i. BÝt 1 cho tr¹ng th¸i phÝm ph¶i. BÝt 2 cho tr¹ng th¸i phÝm gi÷a. BX:= sè lÇn nhÊn CX:= to¹ ®é x lÇn nhÊn cuèi cïng DX:= to¹ ®é y lÇn nhÊn cuèi cïng 7- Hái tr¹ng th¸i vμ sè lÇn nh¶ phÝm kÓ tõ khi gäi chøc n¨ng nμy §Çu vμo BX = phÝm cÇn hái: 0 = tr¸I, 1 = ph¶I, 2 = gi÷a §Çu ra AX cho tr¹ng th¸i phÝm (0 = nh¶, 1 = nhÊn) BÝt 0 cho tr¹ng th¸i phÝm tr¸i. BÝt 1 cho tr¹ng th¸i phÝm ph¶i. BÝt 2 cho tr¹ng th¸i phÝm gi÷a. BX:= sè lÇn nhÊn. CX:= to¹ ®é x lÇn nhÊn cuèi cïng. DX:= to¹ ®é y lÇn nhÊn cuèi cïng. 8 - Chøc n¨ng 7: H¹n chÕ ph¹m vi di chuyÓn ngang cña chuét (ph¹m vi biÕn ®æi cña x_mouse) §Çu vμo: CX:= cét tr¸i DX:= cét ph¶i 9 - Chøc n¨ng 8: H¹n chÕ ph¹m vi di chuyÓn däc cña chuét (ph¹m vi biÕn ®æi cña y_mouse) §Çu vμo: CX:= Dßng trªn cïng. DX:= Dßng d−íi cïng. 2.3 VÝ dô minh ho¹. 2.3.1 Khëi t¹o chuét. Ta x©y dùng thñ tôc mouseInit thùc hiÖn c¸c chøc n¨ng: kiÓm tra nÕu ®· cμi ®Æt chuét th× thiÕt lËp to¹ ®é ban ®Çu cña chuét, h¹n chÕ ph¹m vi t¸c dông cña chuét trong mét khung h×nh ch÷ nhËt vμ cho hiÓn thÞ chuét (mét h×nh ch÷ nhËt) trªn mμn h×nh v¨n b¶n. §Ó dÔ nhí, ta ®Þnh nghÜa c¸c h»ng sè lμ c¸c chøc n¨ng cña ng¾t $33 nh− tr×nh bμy trªn. x,y lμ to¹ ®é ban ®Çu cña chuét. Left, Top, Right, Bottom NguyÔn §×nh Ho¸, ViÖn CNTT - §HQG Hμ néi 253
  10. LËp tr×nh b»ng Turbo Pascal Trong thñ tôc d−íi ®©y vμ c¸c thñ tôc kh¸c tiÕp theo sau, Regs lμ biÕn kiÓu thanh ghi. var Regs: registers; const INT_MOUSE = $33; (*ngat chuot*) MOUSE_INIT = $00; MOUSE_X_LIMIT = $07; MOUSE_Y_LIMIT = $08; MOUSE_SET_POSITION = $04; MOUSE_SHOW = $01; procedure mouseInit(x,y,left,top,right,bottom: integer); var mouse_status: integer; begin regs.AX:=MOUSE_INIT; intr(INT_MOUSE,regs); mouse_status:= regs.AX; if (mouse_status -1) then begin writeln('No mouse driver'); exit; end; regs.AX:= MOUSE_X_LIMIT; regs.CX:= left; regs.DX:= right; intr(INT_MOUSE,regs); regs.AX:= MOUSE_Y_LIMIT; regs.CX:= top; regs.DX:= bottom; intr(INT_MOUSE,regs); regs.AX:= MOUSE_SET_POSITION; regs.CX:= x; regs.DX:= y; intr(INT_MOUSE,regs); regs.AX:= MOUSE_SHOW; intr(INT_MOUSE, regs); end; 2.3.2 LÊy vÞ trÝ chuét. Sè hiÖu cña chøc n¨ng lÊy vÞ trÝ lμ 03. To¹ ®é chuét sÏ ®−îc ghi vμo c¸c biÕn nguyªn x, y. To¹ ®é nμy sÏ ®−îc dïng ®Ó ®æi sang to¹ ®é trªn mμn h×nh v¨n b¶n x_text, y_text hay to¹ ®é trªn mμn h×nh ®å ho¹ x_graphics, y_graphics nh− ®· nãi trªn. const MOUSE_GET_POSITION = $03; procedure getMousePosition(VAR x,y: integer); begin NguyÔn §×nh Ho¸, ViÖn CNTT - §HQG Hμ néi 254
  11. LËp tr×nh b»ng Turbo Pascal regs.AX:= MOUSE_GET_POSITION; intr(INT_MOUSE,regs); x:= regs.CX; y:= regs.DX; end; 2.3.3 B¾t sù kiÖn nhÊn vμ nh¶ phÝm chuét. Sù kiÖn th«ng dông nhÊt cña chuét cÇn xö lÝ lμ nhÊn phÝm vμ nh¶ phÝm. Thñ tôc getMouseClickLeft cho phÐp ghi l¹i sù kiÖn nhÊn phÝm chuét tr¸i vμ to¹ ®é ®iÓm nhÊn. Thñ tôc getMouseReleaseLeft cho phÐp ghi l¹i sù kiÖn th¶ phÝm chuét tr¸i vμ to¹ ®é ®iÓm th¶ chuét. Hoμn toμn t−¬ng tù ta cã thÓ ®ãn b¾t c¸c sù kiÖn chuét ph¶i. Const MOUSE_CLICK_COUNT = $05; MOUSE_RELEASE_COUNT = $06; procedure getMouseClickLeft(VAR numclick, x, y: integer); begin regs.AX:= MOUSE_CLICK_COUNT; regs.BX:= $00; intr(INT_MOUSE,regs); numclick:= regs.BX; x:= regs.CX; y:= regs.DX; end; procedure getMouseReleaseLeft(VAR numrelease, x, y: integer); begin regs.AX:= MOUSE_RELEASE_COUNT; regs.BX:= $00; intr(INT_MOUSE,regs); numrelease:= regs.BX; x:= regs.CX; y:= regs.DX; end; 2.4 Th− viÖn c¸c thñ tôc thao t¸c chuét. TËp hîp c¸c thñ tôc trªn ta cã thÓ x©y dùng mét th− viÖn c¸c hμm tiÖn Ých thao t¸c chuét. VÝ dô, unit mouse; INTERFACE const MOUSE_X_MAX = 632; MOUSE_Y_MAX = 192; NguyÔn §×nh Ho¸, ViÖn CNTT - §HQG Hμ néi 255
  12. LËp tr×nh b»ng Turbo Pascal INT_MOUSE = $33; (*ngat chuot*) MOUSE_INIT = $00; MOUSE_SHOW = $01; MOUSE_HIDDEN = $02; MOUSE_GET_POSITION = $03; MOUSE_SET_POSITION = $04; MOUSE_CLICK_COUNT = $05; MOUSE_RELEASE_COUNT = $06; MOUSE_X_LIMIT = $07; MOUSE_Y_LIMIT = $08; procedure mouseInit(x,y,left,top,right,bottom :integer); procedure getMousePosition(VAR x,y: integer); procedure getMouseClickLeft(VAR numclick, x, y : integer); procedure getMouseReleaseLeft(VAR numrelease, x, y : integer); { khai b¸o c¸c thñ tôc kh¸c n÷a } .. .. .. .. .. .. IMPLEMENTATION { TriÓn khai chi tiÕt c¸c thñ tôc ®· khai b¸o ë trªn } .. .. .. .. .. 2.5 øng dông vµo b¶ng chän. Ta ®· x©y dùng b¶ng chän, xö lÝ b»ng gâ phÝm mòi tªn. Cã thÓ bæ xung thªm c¸c thñ tôc xö lÝ sù kiÖn chuét ®Ó cho phÐp chän b»ng nhÊn phÝm tr¸i chuét. Thñ tôc xö lÝ gâ phÝm b©y giê ®−îc më réng thªm thμnh thñ tôc xö lÝ sù kiÖn, bao gåm c¶ sù kiÖn nhÊn chuét nh− sau. procedure XuLiSuKien; var i: integer; gophim: char; mouseclick: boolean; raw_x,raw_y, mouse_x, mouse_y, numclick: integer; begin i:=0; {mac dinh ban dau la muc chon thu nhat} mouseclick:= false; mouseInit(MOUSE_X_MAX div 2, MOUSE_Y_MAX div 2, 0,0,MOUSE_X_MAX, MOUSE_Y_MAX); repeat if keyPressed then begin {xu li go phim} NguyÔn §×nh Ho¸, ViÖn CNTT - §HQG Hμ néi 256
  13. LËp tr×nh b»ng Turbo Pascal .. .. .. .. end; {== phan xu li chuot ==} getMouseClickLeft(numclick,raw_x, raw_y); if (numclick > 0) then begin mouseclick:= true; mouse_x:= raw_x DIV 8 + 1; mouse_y:= raw_y DIV 8 + 1; {nhan chuot ben ngoai bang} if ((mouse_x < x) or ( x+rong < mouse_x) or (mouse_y < y) or ( y+SoMucChon < mouse_y)) then BangChon:= -1 else {nhan chuot ben trong bang} for i:=0 to SoMucChon do begin LamChimMucChon(i) ; if (mouse_y = y+i) then LamNoiMucChon(i); BangChon:=i; delay(50); { chØ ®Ó kÞp nhËn thÊy!} end; end; until (gophim=enter) or (gophim=esc) or mouseClick; end; 3. Th©m nhËp trùc tiÕp vµo bé nhí vµ cæng 3.1 Th©m nhËp trùc tiÕp bé nhí. Turbo Pascal hç trî th©m nhËp trùc tiÕp vμo bé nhí. C¶ bé nhí coi nh− mét m¶ng. KÝch th−íc cña c¸c phÇn tö m¶ng (« nhí) cã thÓ lμ 1 byte, 1 word (= 2 byte) hay 1 LongInt (= 4 byte). BiÕn m¶ng Mem dïng ®Ó truy cËp ®Õn tõng byte trong bé nhí. BiÕn m¶ng MemW dïng ®Ó truy cËp theo tõng Word. BiÕn m¶ng MemL dïng ®Ó truy cËp theo tõng LongInt. CÇn chØ râ ®Þa chØ cña « nhí ®Çu tiªn d−íi d¹ng Segment: offset. VÝ dô: Mem[$xxxx: $yyyy]: truy cËp mét byte bé nhí t¹i ®Þa chØ $xxxx: $yyyy. NguyÔn §×nh Ho¸, ViÖn CNTT - §HQG Hμ néi 257
  14. LËp tr×nh b»ng Turbo Pascal MemW[$xxxx: $yyyy]: truy cËp 2 byte bé nhí (1 word) kÓ tõ ®Þa chØ $xxxx: $yyyy. MemL[$xxxx: $yyyy]: truy cËp 4 byte bé nhí (1 LongInt) kÓ tõ ®Þa chØ $xxxx: $yyyy. VÝ dô 1. Vïng nhí mμn h×nh lμ b¾t dÇu tõ ®Þa chØ $B800:0000. ChÕ ®é v¨n b¶n cÇn l−u tr÷ 2000 (80 x 25) kÝ tù. Mçi kÝ tù chiÕm 2 byte, mét byte lμ m· ASCII, byte cßn l¹i lμ c¸c thuéc tÝnh hiÓn thÞ video (xem phÇn Unit Crt). Ta cã thÓ th©m nhËp trùc tiÕp vμo vïng nhí nμy ®Ó t¨ng tèc ®é cho c¸c thao t¸c hiÓn thÞ ra mμn h×nh. Ch−¬ng tr×nh d−íi ®©y thay toμn bé c¸c kÝ tù trèng b»ng dÊu sao “*” var i: word; begin for i:=1 to 2000-1 do if mem[$B800:i*2] = $20 then Mem[$B800:i*2]:= Ord('*'); end. VÝ dô 2. Khi ta x©y dùng c¸c ch−¬ng tr×nh con cã chøa c¸c lÖnh lμm thay ®æi hiÓn thÞ mμn h×nh vÝ dô nh− lμm c¸c b¶ng chän, hiÖn c¸c th«ng b¸o ... th× mét yªu cÇu lμ ph¶i chÐp l−u toμn bé hay mét vïng mμn h×nh bÞ thay ®æi vμ cho hiÓn thÞ l¹i nguyªn tr¹ng ban ®Çu sau khi ch−¬ng tr×nh con ®· kÕt thóc. Sö dông phÐp th©m nhËp trùc tiÕp bé nhí cã thÓ viÕt hai thñ tôc ®¬n gi¶n nh− trong ch−¬ng tr×nh sau ®©y. uses crt; type one_screen = array[0..4000-1] of word; {80*25*2=2000} var old_src: one_screen; origMode: integer; {®Ó l−u l¹i mode mμn h×nh tr−íc khi thay ®æi} procedure get_screen(var scr: one_screen); {truy cËp bé nhí mμn h×nh vμ chÐp l¹i toμn bé mμn h×nh hiÖn t¹i} var i: word; begin for i:=0 to 4000-1 do scr[i]:= memL[$B800:i]; end; procedure put_screen(var scr: one_screen); {truy cËp bé nhí mμn h×nh vμ cho hiÓn thÞ mμn h×nh ®· l−u} var i: word; begin NguyÔn §×nh Ho¸, ViÖn CNTT - §HQG Hμ néi 258
  15. LËp tr×nh b»ng Turbo Pascal for i:=0 to 4000-1 do memL[$B800:i]:= scr[i]; end; BEGIN origMode:= lastMode; {thay ®æi mode hiÓn thÞ} TextBackGround(Red); Clrscr; gotoxy(10,5); Writeln(' Day la man hinh se luu lai !'); Writeln(' go ENTER de luu man hinh !!!'); readln; get_screen(old_src); TextMode(origMode); Clrscr; Writeln('Man hinh cu da duoc luu lai'); Writeln('Go ENTER de xem man hinh cu !!!'); Readln; put_screen(old_src); Readln; TextMode(origMode); END. Th©m nhËp cæng. 3.2 C¸c thiÕt bÞ ngo¹i vi c¾m vμo m¸y tÝnh giao tiÕp víi bé xö lÝ th«ng qua trung gian mét vïng nhí gäi lμ c¸c cæng. C¸ch truy cËp trùc tiÕp c¸c cæng xuÊt nhËp (I/O port) còng gièng nh− truy cËp trùc tiÕp bé nhí tr×nh bμy ë phÇn trªn. M¶ng Port ®Ó truy cËp c¸c cæng theo tõng byte, M¶ng PortW ®Ó truy cËp c¸c cæng theo tõng Word. Port[ i ]: truy cËp mét byte vïng nhí cña cæng cã ®Þa chØ chøa trong biÕn i. PortW[ i ]: truy cËp mét Word vïng nhí cña cæng cã ®Þa chØ chøa trong biÕn i. Thay ®æi ®Þa chØ nμy ta sÏ truy cËp cæng cña c¸c thiÕt bÞ kh¸c nhau. Ch−¬ng tr×nh minh häa d−íi ®©y lμm mμn h×nh tr«i liªn tôc tõ ph¶i sang tr¸i b»ng c¸ch th©m nhËp trùc tiÕp vμo cæng CRT. program CuonManHinh; NguyÔn §×nh Ho¸, ViÖn CNTT - §HQG Hμ néi 259
  16. LËp tr×nh b»ng Turbo Pascal uses crt; const CrtAddr = $3D4; var i: word; procedure ScrollLeft(num: byte); begin for i:= 0 to num do begin asm CLI end; {CLI = Clear Interrupt flag} PortW[CrtAddr]:= Hi(i) SHL 8 + $0C; PortW[CrtAddr]:= Lo(i) SHL 8 + $0D; asm STI end; Delay(50); {STI = Set Interrupt flag} end; end; BEGIN ScrollLeft(80); END. 4. Ch−¬ng tr×nh th−êng tró 4.1 Kh¸i niÖm Khi thi hμnh mét ch−¬ng tr×nh, hÖ ®iÒu hμnh dμnh riªng mét khèi nhí ®Ó chøa m· lÖnh vμ c¸c d÷ liÖu cña ch−¬ng tr×nh. Lóc ch−¬ng tr×nh kÕt thóc, DOS sÏ gäi hμm $4C - kÕt thóc tiÕn tr×nh vμ gi¶i phãng vïng nhí dμnh riªng cho ch−¬ng tr×nh, chÐp Command.com ®Ì lªn vïng nμy. Mét c¸ch thø hai ®Ó kÕt thóc ch−¬ng tr×nh lμ dïng hμm Keep. Sù kh¸c biÖt gi÷a Keep vμ kÕt thóc b×nh th−êng lμ DOS kh«ng gi¶i phãng vïng nhí ®· dμnh cho ch−¬ng tr×nh, nghÜa lμ kh«ng chÐp Command.com ®Ì lªn vïng nμy mμ chÐp vμo phÇn cßn trèng kh¸c. Nh− vËy, ch−¬ng tr×nh vÉn cßn n»m l¹i trong bé nhí. Ch−¬ng tr×nh th−êng tró hay TSR- Terminate and Stay Resident - lμ ch−¬ng tr×nh mμ khi kÕt thóc kh«ng bÞ xo¸ khái bé nhí, nã vÉn cßn l−u l¹i chê vμ thùc hiÖn chøc n¨ng c«ng viÖc cña m×nh phôc vô cho ch−¬ng tr×nh kh¸c khi cÇn ®Õn. VÝ dô c¸c phÇn mÒm ®Ó chuyÓn bμn phÝm tõ gâ tiÕng Anh sang gâ ®−îc tiÕng ViÖt ®Òu lμ c¸c ch−¬ng tr×nh th−êng tró. Nã chÆn ng¾t bμn phÝm vμ thay vec t¬ ng¾t th«ng th−êng b»ng mét thñ tôc xö lÝ kh¸c ®Ó khi gâ aa th× sÏ chuyÓn thμnh m· cña ©, gâ dd th× chuyÓn thμnh m· cña ®, v.v... KÜ thuËt lËp tr×nh th−êng tró ®ßi hái ph¶i kÕt hîp chÆt chÏ víi hÖ thèng, chÆn vμ thay ®æi mét sè ng¾t ®Ó phôc vô cho môc ®Ých cña m×nh. NguyÔn §×nh Ho¸, ViÖn CNTT - §HQG Hμ néi 260
  17. LËp tr×nh b»ng Turbo Pascal 4.2 C¸ch x©y dùng mét ch−¬ng tr×nh th−êng tró 4.2.1 C¸c b−íc. C¸c b−íc c¬ b¶n ®Ó x©y dùng mét ch−¬ng tr×nh th−êng tró lμ: - X©y dùng thñ tôc xö lÝ ng¾t míi. - L−u l¹i c¸c vÐc t¬ ng¾t mμ ch−¬ng tr×nh sÏ chiÕm dông. - ThiÕt ®Æt l¹i c¸c vÐc t¬ ng¾t ®Ó øng víi c¸c thñ tôc ng¾t míi. - Phôc håi l¹i chóng khi kÕt thóc. - T¹o phÝm nãng ®Ó kÝch ho¹t, gì bá ch−¬ng tr×nh. 4.2.2 C¸c thñ tôc hç trî. Cã thÓ sö dông ng¾t $27 ®Ó kÕt thóc mét ch−¬ng tr×nh vμ cho th−êng tró. Tuy nhiªn Unit Dos cña Turbo Pascal cung cÊp cho chóng ta mét sè thñ tôc phôc vô x©y dùng ch−¬ng tr×nh th−êng tró. Tr−íc hÕt ®ã lμ hμm Keep ®· nãi ®Õn ë trªn . Keep(exitCode: word) ; Cho kÕt thóc ch−¬ng tr×nh vμ ë l¹i th−êng tró. M· tho¸t exitCode = 0 lμ kÕt thóc b×nh th−êng, exitCode = 1 lμ tho¸t b»ng Ctrl+C, exitCode = 2 lμ tho¸t khi chia cho 0. VËy mét ch−¬ng tr×nh th−êng tró ph¶i cã Keep(0) tr−íc tõ kho¸ END. Ngoμi ra cßn mét sè thñ tôc hç trî lμm viÖc vãi c¸c vÐc t¬ ng¾t. GetIntVec (IntNo: Byte; Vector: Pointer) ; L−u l¹i vÐc t¬ ng¾t sè hiÖu IntNo vμo ®Þa chØ x¸c dÞnh trong biÕn Vector. SetIntVec (IntNo: Byte; Vector: Pointer); §Æt l¹i vÐc t¬ ng¾t sè hiÖu IntNo øng víi ®Þa chØ x¸c ®Þnh trong biÕn Vector. To¸n tö lÊy ®Þa chØ @ hay Addr() th−êng ®−îc sö dông ®Ó lÊy ®Þa chØ cña mét thñ tôc xö lÝ ng¾t. thñ tôc xö lÝ ng¾t ph¶i cã kiÓu Interrupt. Mét ®iÓm cÇn l−u ý lμ ch−¬ng tr×nh th−êng tró kh«ng thÓ biÕt ch¾c c¸c ng¾t hiÖn t¹i cã ph¶i lμ b¶n gèc cña BIOS , DOS hay kh«ng v× cã thÓ mét ch−¬ng tr×nh th−êng tró kh¸c ®· thay thÕ nã råi ! 4.3 VÝ dô minh ho¹. NguyÔn §×nh Ho¸, ViÖn CNTT - §HQG Hμ néi 261
  18. LËp tr×nh b»ng Turbo Pascal 4.3.1 VÝ dô 1 §Çu tiªn ta xÐt mét vÝ dô ®¬n gi¶n, lμm mét ch−¬ng tr×nh th−êng tró chiÕm ng¾t sè $05 lμ ng¾t cã chøc n¨ng in néi dung cña mμn h×nh ra m¸y in. Ng¾t nμy øng víi phÝm Print-screen. Ta sÏ thay nã b»ng mét thñ tôc ng¾t míi, thùc hiÖn viÖc in ra kÝ tù #1 (khu«n mÆt c−êi) t¹i gãc mμn h×nh. program Smile1; {$M 1024,0,0} uses dos; procedure VietRaGocManHinh; interrupt; begin MemW[$B800:0]:=$0701; {07 lμ byte thuéc tÝnh, 01 lμ m· kÝ tù #1} end; BEGIN SetIntVec($00,saveInt00); {kh«i phôc ng¾t khi chia cho 0} SetIntVec($05,@VietRaGocManHinh); keep(0); END. Trong ch−¬ng tr×nh trªn cÇn l−u ý mÊy ®iÓm sau. 1- Ph¶i cã chØ thÞ biªn dÞch {$M 1024,0,0} ®Ó h¹n chÕ vïng Heap. Nh¾c l¹i r»ng chØ thÞ cho tr×nh biªn dÞch ph©n bè bé nhí {$M StackSize, HeapMin, HeapMax} cã c¸c gi¸ trÞ mÆc ®Þnh lμ {$M 16384, 0, 655360}, nghÜa lμ HeapMax cã thÓ ®¹t ®Õn ®Þa chØ cao nhÊt cña bé nhí RAM. NÕu HeapMax kh«ng ®−îc gi¬Ý h¹n bëi 0 vμ dïng hμm Keep ®Ó kÕt thóc ch−¬ng tr×nh th× bé nhí sÏ bÞ chiÕm dông hÕt ®Õn byte cuèi cïng, kh«ng cßn chç ®Ó t¸i n¹p l¹i Command.com khi kÕt thóc thi hμnh ch−¬ng tr×nh. 2- Khai b¸o Interrupt lμ b¾t buéc ®èi víi mét thñ tôc ng¾t, tøc lμ thñ tôc ®−îc gäi khi cã mét ng¾t x¶y ra. Trong ch−¬ng tr×nh nμy lμ thñ tôc VietRaGocManHinh. Lóc nμy tr×nh biªn dÞch sÏ sinh m· ®Ó cÊt gi÷ t¹m thêi néi dung tÊt c¶ c¸c thanh ghi tr−íc khi gäi thñ tôc ng¾t vμ hoμn nguyªn l¹i c¸c gi¸ trÞ thanh ghi sau khi thñ tôc ng¾t kÕt thóc. NÕu thiÕu khai b¸o nμy, tr×nh biªn dÞch coi thñ tôc ng¾t lμ mét thñ tôc th«ng th−êng nh− mäi thñ tôc kh¸c, kh«ng b¸o lçi vμo thêi ®iÓm dÞch vμ ch−¬ng tr×nh sÏ ®æ vì ngay. 3- LÖnh SetIntVec($00, SaveInt00) ®Ó kh«i phôc l¹i ng¾t $00 - "chia cho kh«ng". Ch−¬ng tr×nh trªn míi chØ quan t©m lμm thÕ nμo chiÕm chç cña mét ng¾t kh¸c. Nã ®· viÕt ®Ì lªn gi¸ trÞ gèc ban ®Çu cña ng¾t $05. Kh«ng cã c¸ch nμo ®Ó kh«i phôc l¹i chøc n¨ng gèc cña phÝm Print-Screen ngoμi viÖc t¾t m¸y khëi ®éng l¹i. NguyÔn §×nh Ho¸, ViÖn CNTT - §HQG Hμ néi 262
  19. LËp tr×nh b»ng Turbo Pascal Ch−¬ng tr×nh d−íi ®©y kh¾c phôc nh−îc ®iÓm nμy. Nã l−u l¹i ®Þa chØ chøa trong vec t¬ ng¾t $08 (lμ ng¾t ®ång hå hÖ thèng). Sau ®ã míi thay thÕ b»ng ®Þa chØ cña thñ tôc ng¾t VietRaGocManHinh_2 . Trong thñ tôc nμy, vÐc t¬ ng¾t $08 ®−îc ®Æt l¹i ®Ó trá ®Õn thñ tôc xö lÝ cò ®· l−u. program Smile2; {$M 1024,0,0} uses dos; var SaveInt08: pointer; procedure VietRaGocManHinh_2; interrupt; begin Inline($9C/ {PUSHF } $FF/$1E/SaveInt08); {CALL FAR [SaveInt08]} MemW[$B800:0]:=$0701; {07 lμ byte thuéc tÝnh, 01 lμ m· kÝ tù #1} end; BEGIN GetIntVec($08, SaveInt08); SetIntVec($08,@VietRaGocManHinh_2); keep(0); END. 4.3.2 VÝ dô 2 Mét ch−¬ng tr×nh hÑn giê. Ta thö x©y dùng mét ch−¬ng tr×nh th−êng tró phøc t¹p h¬n, cã xö lÝ dßng lÖnh. Dßng lÖnh Alarm n sÏ khëi ®éng ch−¬ng tr×nh vμ chê ®óng n phót m¸y sÏ ph¸t tiÕng cßi vμ dßng th«ng b¸o trªn mμn h×nh ®Ó nh¾c lμ ®· ®Õn giê hÑn. Trong thêi gian chê m¸y vÉn ho¹t ®éng b×nh th−êng. Ch−¬ng tr×nh sö dông ng¾t $1C lμ nhÞp ®ång hå cho ng−êi sö dông. Cø ®Òu ®Æn mét Tic th× ng¾t nμy ®−îc gäi mét lÇn. Mét gi©y ng¾t nμy ®−îc gäi kho¶ng 18.2 lÇn. Ta sÏ chÆn ng¾t nμy vμ thay thÕ nã b»ng thñ tôc xö lÝ míi, t¨ng biÕn ®Õm CurrentTime lªn mét ®¬n vÞ vμ so s¸nh víi kho¶ng thêi gian chê ®· Ên ®Þnh. NÕu v−ît qu¸ sÏ ph¸t lÖnh b¸o ®éng. C¸c b−íc c«ng viÖc mμ thñ tôc xö lÝ ph¶i lμm lμ - Phôc håi vect¬ ng¾t $1C tr¶ l¹i cho hÖ thèng. - L−u vect¬ ng¾t bμn phÝm, thay b»ng thñ tôc xö lÝ míi lμ: ph¸t cßi liªn tôc, hiÖn th«ng b¸o vμ ®îi gâ phÝm F12 ®Ó kÕt thóc thËt sù ch−¬ng tr×nh. program Alarm; {$M $1024,0,0} {cap bo nho $M Stacksize,heapmin,heapmax} uses crt,dos; const DefaultTime = 1; {Tham sè mÆc ®Þnh, b¸o thøc sau 1 phót} NguyÔn §×nh Ho¸, ViÖn CNTT - §HQG Hμ néi 263
  20. LËp tr×nh b»ng Turbo Pascal Var CurrentTime: longint; Worktime: word; {kho¶ng thêi gian ®îi b¸o thøc} KbdIntVec: procedure; {®Ó l−u ®Þa chØ cña ch−¬ng tr×nh xö lÝ ng¾t bμn phÝm cña hÖ thèng} {$F+} { force Far call} procedure KeyClick; interrupt; Begin gotoXY(1,1); TextColor(Yellow); TextBackGround(Red); Write(' Over time ! - Press F12 to continue.'); While Port[$60] 88 do Write(#7); { ph¸t cßi khi ch−a gâ F12(cã m· 88)®Ó chÊm døt} { Port[i] truy cËp cæng i=$60 lμ cæng bμn phÝm } SetIntVec($9,Addr(KbdIntVec)); Inline($9C); KbdIntVec; {gäi l¹i ch−¬ng tr×nh xö lÝ ng¾t bμn phÝm cò} end; {$F-} {$F+} procedure TestTime; interrupt; begin Inc(CurrentTime); if (CurrentTime >= Round(workTime*60*18.2)) then begin SetIntVec($1C,Addr(KbdIntVec)); {phôc håi vecto ng¾t $1C cò} GetIntVec($9,Addr(KbdIntVec)); {l−u vecto ng¾t bμn phÝm} SetIntVec($9,Addr(KeyClick)); {ng¾t bμn phÝm b©y giê nèi ®Õn KeyClick} end; Inline($9C); KbdIntVec; {gäi l¹i ch−¬ng tr×nh xö lÝ ng¾t bμn phÝm cò } end; {$F-} procedure TestParam; {xö lý tham sè dßng lÖnh = sè phót ®îi b¸o thøc} var WorkTimeStr: String; i: byte; code: integer; begin WorktimeStr:=''; For i:=1 to ParamCount do WorkTimeStr:= WorkTimeStr + ParamStr(i); NguyÔn §×nh Ho¸, ViÖn CNTT - §HQG Hμ néi 264
ADSENSE

CÓ THỂ BẠN MUỐN DOWNLOAD

 

Đồng bộ tài khoản
2=>2