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

Đồ họa máy tính - Chương 1 Màn hình của máy tính - Bài 2

Chia sẻ: Nguyễn Nhi | Ngày: | Loại File: PDF | Số trang:21

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

Truy cập vào bộ nhớ màn hình Về nguyên tắc có 2 cách để truy cập bộ nhớ màn hình và các thanh ghi + Cách 1: Sử dụng các dịch vụ ngắt của ROM BIOS, ROM BIOS cung cấp t-ơng đối đầy đủ các ch-ơng trình con ứng với các ngắt để phục vụ cho công việc này + Cách 2: Truy cập trực tiếp đ-a vào các địa chỉ của các cổng (port) thông qua các ngôn ngữ lập trình Cách 1 đơn giản tuy nhiên có nh-ợc điểm tốc độ truy nhập chậm ...

Chủ đề:
Lưu

Nội dung Text: Đồ họa máy tính - Chương 1 Màn hình của máy tính - Bài 2

  1. Kü thuËt §å ho¹ m¸y tÝnh 12 640*480 1 16 8*16 - Chóng ta cã thÓ tù h¹n chÕ vÒ sè trang cho mçi chÕ ®é cña mµn h×nh. VÝ dô: - Mode E cã tÊt c¶ 128000 pixel/page. V× 8 pixel øng víi mét byte trªn mét bit plane do ®ã cÇn 16000 byte/bit plane/ page - mét trang cÇn 64000 byte xÊp xØ 64 kb. Do vËy tèi ®a chØ cã thÓ hiÓn thÞ ®−îc 4 trang. - Mode D: cã 64000 pixel/ page. V× pixel øng víi mét byte trªn mét bit plane do ®ã cÇn 8000 byte/ bit plane/ page - mét trang cÇn 32000 byte xÊp xØ 32kb/page do ®ã tèi ®a chØ cã thÓ cã 8 trang. - Ng−êi ta còng cã thÓ biÕt ®−îc ®Þa chØ ®Çu cña mçi trang trong tõng chÕ ®é lµm viÖc cña mµn h×nh. Mode D: A000 - A1F3F A200 - A3F3F A400 - A5F3F A600 - A7F3F A800 - A9F3F AA00 - ABF3F AC00 - ADF3F AE00 - AFF3F Mode E: A000 - A3E7F A400 - A7E7F A800 - ABE7E AC00 - AFE7E $2. Truy cËp vμo bé nhí mμn h×nh VÒ nguyªn t¾c cã 2 c¸ch ®Ó truy cËp bé nhí mµn h×nh vµ c¸c thanh ghi + C¸ch 1: Sö dông c¸c dÞch vô ng¾t cña ROM BIOS, ROM BIOS cung cÊp t−¬ng ®èi ®Çy ®ñ c¸c ch−¬ng tr×nh con øng víi c¸c ng¾t ®Ó phôc vô cho c«ng viÖc nµy + C¸ch 2: Truy cËp trùc tiÕp ®−a vµo c¸c ®Þa chØ cña c¸c cæng (port) th«ng qua c¸c ng«n ng÷ lËp tr×nh C¸ch 1 ®¬n gi¶n tuy nhiªn cã nh−îc ®iÓm tèc ®é truy nhËp chËm I. Sö dông c¸c dÞch vô ng¾t Int 10H cña ROM BIOS D−íi ®©y lµ mét vµi ng¾t cña ROM BIOS 1. §−a mét pixel vμo bé nhí mμn h×nh input AH=0Ch AL=mμu BH=trang CX=x (cét) 8
  2. Kü thuËt §å ho¹ m¸y tÝnh DX=y (dßng) Procedure writepixel(col,row,color: integer); Var v : Registers; Begin v.ah:=$0C; v.al := color; v.bh:=0; v.cx:=col; v.dx:=row; intr($10,v); End; 2. §äc d÷ liÖu cña mét pixel input AH=ODh BH=trang CX=x (cét) DX=y (dßng) output: AL=Color (gi¸ trÞ mμu cña pixel) Function readpixel(col,row: integer): integer; Var v : Registers; Begin v.ah:=$0D; v.bh:=0; v.cx:=col; v.dx:=row; intr($10,v); readpixel:=v.al; end; 3. §äc d÷ liÖu tõ thanh ghi mμu (color Register) Input: AH=10h AL=15h BX=n (sè hiÖu thanh ghi mμu) Output: CH=®é kÝch ho¹t mμu Green CL=®é kÝch ho¹t mμu Blue DH=®é kÝch ho¹t mμu Red Type RGB_COLOR_TYP = Record 9
  3. Kü thuËt §å ho¹ m¸y tÝnh red : Word; green : Word; blue : Word; End; Procedure read_color_reg(index: integer;Var color: RGB_COLOR_TYP); Var R : registers; Begin R.ax:=$1015; R.bx:=index; intr($10,R); color.red:=R.dh; color.green:=R.ch; color.blue:=R.cl; End; 4. Ghi mμu vμo mét thanh ghi mμu (Color Register) Input: AH=10h AL=10h BX=sè hiÖu thanh ghi mμu CH=®é kÝch ho¹t mμu green CL=®é kÝch ho¹t mμu Blue DH=®é kÝch ho¹t mμu Red Type RGB_COLOR_TYP = Record red : Word; green : Word; blue : Word; End; Procedure write_color_reg(index: Integer;color: RGB_COLOR_TYP); Var R : registers; Begin R.ax:=$1010; R.bx:=index; R.dh:=color.red; R.ch:=color.green; R.cl:=color.blue; intr($10,R); End; C¸c vÝ dô: VÝ dô 1: §−a mét pixel vµo bé nhí mµn h×nh 10
  4. Kü thuËt §å ho¹ m¸y tÝnh Uses Crt,dos,Graph; Var v : Registers; gd,gm,col,row,color: integer; Procedure writepixel(col,row,color: integer); Var v : Registers; Begin v.ah:=$0C; v.al := color; v.bh:=0; v.cx:=col; v.dx:=row; intr($10,v); End; Begin Write('Nhap toa do diem: '); Readln(col, row); Write('Nhap mau ve diem: '); Readln(color); gd:=0; initgraph(gd,gm,' '); writepixel(col,row,color); Readln; closegraph; End. VÝ dô 2: §äc d÷ liÖu cña mét pixel Uses Crt,dos,Graph; Var v : Registers; gd,gm,col,row,color: integer; Function readpixel(col,row: integer): integer; Var v : Registers; Begin v.ah:=$0D; v.bh:=0; v.cx:=col; v.dx:=row; intr($10,v); readpixel:=v.al; end; Begin gd:=0; initgraph(gd,gm,' '); 11
  5. Kü thuËt §å ho¹ m¸y tÝnh col:=320; row:=240; color:=WHITE; putpixel(col,row,color); directvideo:=false; Writeln('Mau cua diem la: ',readpixel(col,row)); Readln; closegraph; End. VÝ dô 3 : ®äc néi dung thanh ghi mµu th«ng qua ng¾t Program Read_Write_Color_Registers; Uses crt,graph,dos; Type RGB_COLOR_TYP = Record red : Word; green : Word; blue : Word; End; Procedure set_mode(mode: integer); Var R : registers; Begin R.ax:=$4f02; R.bx:=mode; intr($10,R); End; Procedure writepixel(col,row,color: integer); Var R : registers; Begin R.ah:=$0C; R.al := color; R.bh:=0; R.cx:=col; R.dx:=row; intr($10,R); End; Procedure write_color_reg(index: Integer;color: RGB_COLOR_TYP); Var R : registers; Begin R.ax:=$1010; R.bx:=index; R.dh:=color.red; R.ch:=color.green; R.cl:=color.blue; intr($10,R); 12
  6. Kü thuËt §å ho¹ m¸y tÝnh End; Procedure read_color_reg(index: integer;Var color: RGB_COLOR_TYP); Var R : registers; Begin R.ax:=$1015; R.bx:=index; intr($10,R); color.red:=R.dh; color.green:=R.ch; color.blue:=R.cl; End; Var gd,gm,x,y,index: integer; color: RGB_COLOR_TYP; Begin clrscr; gm:=$13; set_mode(gm); directvideo:=false; index:=WHITE; read_color_reg(index,color); Writeln('3 mau cua thanh ghi mau WHITE la: '); Writeln('Red: ',color.red,'; Green: ',color.green,'; Blue: ',color.blue); Readkey; index:=Blue; color.red:=63; color.green:=0; color.blue:=63; write_color_reg(index,color); (* Ve duong thang ngang *) y:=100; for x:=0 To 319 Do writepixel(x,y,index); Readkey; gm:=3; (* Text Mode *) set_mode(gm); End. II. HÖ thèng c¸c thanh ghi cña mµn h×nh Bé nhí mµn h×nh dïng ®Ó chøa th«ng tin hay d÷ liÖu cña ®iÓm ¶nh. §Ó t¹o ra mµu s¾c hiÓn thÞ ®iÓm ¶nh trªn mµn h×nh, mµn h×nh cßn cã mét hÖ thèng c¸c thanh ghi (Register) t−¬ng ®èi phøc t¹p, c¸c thanh ghi nµy cho phÐp ng−êi lËp tr×nh gi¸n tiÕp hoÆc trùc tiÕp truy nhËp, d−íi ®©y chóng ta sÏ t×m hiÓu s¬ l−îc vÒ hÖ thèng c¸c thanh ghi cña mµn h×nh 13
  7. Kü thuËt §å ho¹ m¸y tÝnh C¸c thanh ghi cña mµn h×nh rÊt nhiÒu song cã thÓ ph©n chia thµnh 6 nhãm c¬ b¶n ®ã lµ c¸c nhãm sau: 1. Nhãm general (External Register) 2. Nhãm Sequence Register 3. Nhãm CRTC Register 4. Nhãm Graphics Register 5. Attribute Register 6. Nhãm Color Register (ChØ cã ë VGA) Chó ý: ChØ c¸c thanh ghi cña nhãm General vµ thanh ghi chän mµu (Color Select Register) cña nhãm Attribute Register lµ cã thÓ truy nhËp trùc tiÕp vµo nã th«ng qua cæng I/O (I/O port) nghÜa lµ ng−êi lËp tr×nh cã thÓ dïng c¸c lÖnh In, Out ®Ó truy cËp vµo c¸c thanh ghi nµy th«ng qua ®Þa chØ cña cæng C¸c thanh ghi cßn l¹i ®−îc truy nhËp gi¸n tiÕp th«ng qua thanh ghi ®Þa chØ (address Register) vµ thanh ghi d÷ liÖu (data Register) hai thanh ghi nµy cã ®Þa chØ liªn l¹c th«ng qua ®Þa chØ cæng Cã thÓ minh ho¹: C¸c thanh ghi trong nhãm thanh ghi thuéc tÝnh kh«ng truy nhËp theo ph−¬ng ph¸p trªn, dïng cïng mét ®Þa chØ cæng ®Ó lÊy ®Þa chØ vµ d÷ liÖu ë ®Þa chØ 3C0 Nhãm 1 (General hay External Register) Nhãm nµy cã 4 thanh ghi cã ®é dµi 8 bit, nhiÖm vô cña c¸c thanh ghi nhãm nµy lµ thiÕt lËp tr¹ng th¸i c¸ch thøc kiÓm tra chÕ ®é lµm viÖc cña mµn h×nh nhãm 1 cho ë b¶ng sau: Tªn thanh ghi §Þa chØ ghi vμo (Write) §Þa chØ ®äc ra Miscellaneous output 3C2 3CC Feature control 3DA/3BA 3CA Input Status #0 0 3C2 14
  8. Kü thuËt §å ho¹ m¸y tÝnh Input Status #1 3DA/3BA 3DA/3CA Nhãm 2 (Sequencer Register) Nhãm nµy gåm 6 thanh ghi kh«ng cã ®Þa chØ liªn l¹c víi bé nhí, nã dïng mét thanh ghi trong nhãm lµm thµnh ®Þa chØ, thanh ghi nµy chøa chØ sè cña thanh ghi trong nhãm cÇn truy nhËp vµ mét thanh ghi d÷ liÖu C¸c thanh ghi cña nhãm cho trong b¶ng sau: Tªn thanh ghi ChØ sè thanh ghi §Þa chØ ghi vμo §Þa chØ ®äc ra address 3C4 3C4 Reset 0 3C5 3C5 Clock mode 1 3C5 3C5 Map mask 2 3C5 3C5 3 3C5 3C5 Character Map Mask Memory mode 4 3C5 3C5 Trong sè c¸c thanh ghi cña nhãm trªn chóng ta quan t©m ®Õn thanh ghi Map Mask thanh ghi nµy cã nhiÖm vô x¸c ®Þnh bit plane ®−îc truy cËp. C¸c thanh ghi trong nhãm CRTC coi bé nhí mµn h×nh lµ mét d·y 32 bit. Mét thanh ghi 32 bit ®−îc t¹o ra ®Ó liªn hÖ gi÷a c¸c thanh ghi trong nhãm CRTC vµ bé nhí mµn h×nh. Mçi lÇn ®−a sè liÖu vµo bé nhí mµn h×nh 4 byte ®−îc ®−a vµo 4 bit plane. Thanh ghi Map Mask cã nhiÖm vô xem bit plane nµo ®−îc söa ®æi. D¹ng cña thanh ghi nµy nh− sau: 6 5 4 3 2 1 b3 b2 b1 b0 ⎧ 0 viÖc truy cËp bit plane kh«ng cho phÐp bj = ⎨ ⎩1 viÖc truy cËp bit plane cho phÐp Nhãm 3 (CRTC) Nhãm nµy gåm 26 thanh ghi víi EGA, 24 thanh ghi víi VGA. Chøc n¨ng cña nhãm nµy x¸c ®Þnh c¸c th«ng tin vÒ sè hµng, sè cét, chiÒu cao, chiÒu réng, cña chÕ ®é hiÓn thÞ...... Nã ®−îc truy cËp th«ng qua thanh ghi ®Þa chØ vµ thanh ghi d÷ liÖu C¸c thanh ghi cña nhãm nµy cho trong b¶ng sau: Tªn gäi thanh ghi ChØ sè §Þa chØ ghi ®Þa chØ ®äc thanh ghi address 3D4/3B4 3D4/3B4 Horizontal Total 0 3D5/3B5 3D5/3B5 Horizontal Display end 1 nt nt 15
  9. Kü thuËt §å ho¹ m¸y tÝnh Start horizontal Blank 2 nt nt end horizontal Blank 3 nt nt Start horizontal Retrace 4 nt nt end horizontal Retrace 5 nt nt vertical total 6 nt nt overflow 7 nt nt preset row scan 8 nt nt max scan line 9 nt nt cursor start A nt nt cursor end B nt nt Start address high C nt nt Start address low D nt nt Cursor location hight E nt nt Cursor location low F nt nt Vertical Retrace start 10 nt nt Vertical Retrace low 11 nt nt Vertical Display end 12 nt nt offset 13 nt nt Underline location 14 nt nt Start Vertical Blank 15 nt nt End Vertical Blank 16 nt nt Mode control 17 nt nt Line compare 18 nt nt Nhãm 4 (Graphics Controller Registers) Nhãm nµy gåm 9 thanh ghi c¸c thanh ghi trong nhãm ®−îc truy cËp th«ng qua thanh ghi ®Þa chØ vµ thanh ghi d÷ liÖu Tªn gäi thanh ghi ChØ sè §Þa chØ ghi §Þa chØ ®äc Graphics address 3CE 3CE 16
  10. Kü thuËt §å ho¹ m¸y tÝnh Set/Reset O 3cf 3cf Enable Set/Reset 1 3cf 3cf Color Compare 2 3cf 3cf data Rotate 3 3cf 3cf Read Map 4 3cf 3cf Mode 5 3cf 3cf Miscelaneous 6 3cf 3cf Color don't care 7 3cf 3cf Bit Map 8 3cf 3cf C¸c thanh ghi Set/Reset, Enable Set/Reset vµ c¸c bitplan cã sù t−¬ng øng 1-1. Thanh ghi Set/Reset chøa khu«n mÉu cÇn ghi vµo bit plane, enable Set/Reset chØ ba bit plane nµo cÇn ®−îc söa Nhãm 5: (attribute controler Register) Nhãm nµy gåm 21 thanh (EGA cã 20 thanh) c¸c thanh ghi cña nhãm cho ë b¶ng d−íi ®©y: Tªn thanh ghi ChØ sè §Þa chØ ghi vμo §Þa chØ ®äc ra address 3CO 3C1 O ÷F Palette 3CO 3C1 Mode control 10 3CO 3C1 Overscan color 11 3CO 3C1 Color plane enable 12 3CO 3C1 Horizontal pixel paning 13 3CO 3C1 Color Select 14 3CO 3C1 Nhãm nµy cã 16 thanh ghi palette mçi thanh ghi palette ®−îc sö dông ®Ó chuyÓn d÷ liÖu tõ bé nhí mµn h×nh thµnh mµu. Mçi thanh ghi palett cã ®é dµi 16 bit (nã t¹o tõ RAM) nã x¸c ®Þnh gi¸ trÞ t−¬ng øng víi pixel trong bé nhí mµn h×nh. §èi víi VGA c¸c gi¸ trÞ nµy l¹i lµ gi¸ trÞ trá ®Õn thanh ghi mµu trong nhãm 256 thanh ghi mµu. Khi ho¹t ®éng ë chÕ ®é cña VGA, thanh ghi palette chøa 6 bit, 6 bit nµy t¹o ra ®Þa chØ ®Ó trá vµo mét trong 64 thanh ghi mµu M· mµu trong thanh ghi pallette t¹o theo nguyªn t¾c sau: 6 bit m· mµu ®−îc chia thµnh hai nhãm Nhãm mµu c¬ b¶n RGB (3 bit) Nhãm mµu thay ®æi c−êng ®é cña mµu t−¬ng øng R1G1B1 (3 bit) 17
  11. Kü thuËt §å ho¹ m¸y tÝnh Mçi mµu cã 4 kh¶ n¨ng t¹o tõ c¸c cÆp R1R, G1G, B1B vµ do ®ã tÊt c¶ 64 mµu. C¸c mµu t¹o ra theo tØ lÖ sau: (R1G1B1) (RGB) C−êng ®é kÝch ho¹t 0 0 0% 0 1 33% 1 0 66% 1 1 100% III. Truy cËp trùc tiÕp qua cæng vµ bé nhí mµn h×nh ViÖc truy nhËp vµo mµn h×nh th«ng qua c¸c dÞch vô ng¾t cña ROM BIOS rÊt chËm kh«ng ®¸p øng ®−îc c¸c yªu cÇu cña c¸c øng dông vÒ ®å ho¹ ®Ó t¨ng tèc ®é truy nhËp ng−êi ta ph¶i truy cËp trùc tiÕp vµo bé nhí mµn h×nh th«ng qua c¸c cæng (port) 1. ChÕ ®é 320x200 256 mµu §©y lµ chÕ ®é mode $13 vµ bé nhí mµn h×nh ®−îc tæ chøc thµnh m¶ng mét chiÒu (d¹ng gãi) gåm cã 320x200=64000 phÇn (t−¬ng ®−¬ng 64K) tö mçi phÇn tö lµ mét byte. Bé nhí cña m¸y chñ dµnh cho bé nhí mµn h×nh lµ 64K tõ A000:0000 ®Õn A000:FFFF (65536 byte hay 64KB), ®Ó vÏ mét ®iÓm cã to¹ ®é (x,y) lªn mµn h×nh ta chØ cÇn g¸n Mem[$A000:320*y+x]:=Color; Cßn ®Ó ®äc mµu cña mét ®iÓm cã to¹ ®é (x,y) trªn mµn h×nh ta chØ cÇn g¸n Color:=Mem[$A000:320*y+x]; Sau ®©y lµ c¸c thñ tôc ®äc ghi : Const Buffer: Word = $A000; Procedure writepixel(col,row,color: integer); Var address : Word; Begin address:=320*row+col; Mem[Buffer: address]:=color; End; Function readpixel(col,row: integer): Byte; Var address : Word; Begin address:=320*row+col; readpixel :=Mem[Buffer: address]; End; 2. ChÕ ®é 640x480 16 mµu Gi¶ sö ë c¸c mode 16 mµu (D,E,10,12 lµ c¸c chÕ ®é 4 bit plane) mµn h×nh cã ®é ph©n gi¶i n x m (n sè cét, m sè hµng) ®Ó x¸c ®Þnh vÞ trÝ cña byte chøa pixel cã to¹ ®é (x,y) ta cã thÓ x¸c ®Þnh theo c«ng thøc: k = y * n div 8 + x div 8 VÞ trÝ cña bit liªn quan ®Õn pixel cã to¹ ®é (x,y) ®−îc x¸c lËp theo c«ng thøc: 18
  12. Kü thuËt §å ho¹ m¸y tÝnh VÞ trÝ bit = 7 - (x mod 8) VÝ dô: ë chÕ ®é ph©n gi¶i 640 x 480 pixel cã to¹ ®é (100,100) byte chøa th«ng tin cña pixel lµ byte thø k k=100x640 div 8 + 100 div 8= 8000+12=8012 VÞ trÝ cña bit trong byte thø k l=7-(x mod 8) (phÇn d− x chia cho 8) §Ó t¨ng tèc ®é tÝnh to¸n ta dïng phÐp ®Èy ph¶i (Shr) thay cho thay cho phÐp lÊy phÇn d− (Mod) §iÓm 0 1 2 3 4 5 6 7 Byte Bit Plane 7 6 5 4 3 2 1 0 1 B 1 0 1 1 0 0 0 1 2 G 0 1 0 0 1 1 0 1 3 R 1 1 1 1 0 0 1 0 4 I 0 0 0 0 1 1 0 1 IRGB 0101 0110 0101 0101 1010 1010 0100 1011 §Ó ghi ra mµn h×nh trong chÕ ®é 4 bit plane chóng ta ph¶i ghi ®ång thêi 8 ®iÓm, mçi ®iÓm gåm cã 4 bit mµu vµ 4 bit mµu ®ã l¹i n»m trong 4 byte ë cïng vÞ trÝ gièng nh− ë b¶ng trªn. Ta h·y xem l¹i nhãm 2 (Sequencer Register), trong nhãm nµy thanh ghi sè 2 (Map Mask) sÏ x¸c ®Þnh bit plane nµo ®−îc truy cËp: Tªn thanh ghi ChØ sè thanh ghi §Þa chØ ghi vμo §Þa chØ ®äc ra address 3C4 3C4 Map mask 2 3C5 3C5 Mçi lÇn ®−a sè liÖu vµo bé nhí mµn h×nh, 4 byte ®−îc ®−a vµo 4 bit plane. Thanh ghi Map Mask cã nhiÖm vô xem bit plane nµo ®−îc söa ®æi. D¹ng cña thanh ghi nµy nh− sau: b3 b2 b1 b0 0001, 0010, 0100, 1000 ®Ó truy nhËp vµo mét bit plane ta cÇn hai lÖnh LÖnh 1 : x¸c ®Þnh thanh ghi cÇn truy nhËp lµ thanh ghi mapmask LÖnh 2 : ®−a sè liÖu bit plane cÇn truy cËp vµo thanh ghi mapmask Hai lÖnh cã d¹ng: port[$3C4]:=2; (Vµo thanh ghi cÇn truy cËp) port[$3C5]:= n; (®−a sè liÖu bitplan cÇn truy cËp vµo thanh ghi Mapmask) (n=1,2,4,8) Vµ ta cÇn 4 lÇn nh− vËy ®Ó truy cËp vµo 4 bit plane Thñ tôc ghi 8 ®iÓm ra mµn h×nh b»ng 4 byte : Procedure write_8_pixel(x,y: integer; Var b: four_byte); Var 19
  13. Kü thuËt §å ho¹ m¸y tÝnh j,address: Integer; Begin port[$3c4]:=2; address:=y*80+(x shr 3); j:=1; For i:=0 To 3 Do Begin port[$3c5]:=j; Mem[buffer:address]:=b[i]; j:=j*2; End; End; §Ó ®äc trªn mµn h×nh trong chÕ ®é 4 bit plane chóng ta ph¶i ®äc ®ång thêi 8 ®iÓm, mçi ®iÓm gåm cã 4 bit mµu vµ 4 bit mµu ®ã l¹i n»m trong 4 byte ë cïng vÞ trÝ. Ta chó ý ®Õn nhãm thanh ghi thø 4 (Graphics Control Register). Trong nhãm cã thanh ghi mang chØ sè 4 (Read Map), thanh ghi nµy x¸c ®Þnh bit plane nµo sÏ ®−îc phÐp ®−a sè liÖu ra : Tªn gäi thanh ghi ChØ sè §Þa chØ ghi §Þa chØ ®äc Graphics address 3CE 3CE Read Map 4 3cf 3cf §Ó thùc hiÖn phÐp ®äc mét bit plane nµo ®ã chóng ta cÇn cã hai lÖnh: LÖnh 1. X¸c ®Þnh sè hiÖu cña thanh ghi trong nhãm cÇn truy nhËp LÖnh 2: X¸c ®Þnh sè hiÖu bitplane LÖnh 1: Port($3ce):=4; LÖnh 2: Port($3cf):=bitplane; Vµ ta cÇn 4 lÇn nh− vËy ®Ó truy cËp vµo 4 bit plane Type four_byte = array[0..3] of Byte; Thñ tôc ®äc 8 ®iÓm trªn mµn h×nh vµo 4 byte : Procedure read_8_pixel(x,y: integer; Var b: four_byte); Var address,color: integer; Begin address:=y*80+(x shr 3); port[$3ce]:=4; for i:=0 To 3 Do Begin port[$3cf]:=i; b[i]:=Mem[buffer:address]; End; End; Thñ tôc vÏ mét ®iÓm : ®Ó vÏ mét ®iÓm trªn mµn h×nh ta ®äc 4 byte liªn quan ®Õn ®iÓm ®ã (4 byte øng víi 8 ®iÓm cã chøa ®iÓm cÇn vÏ), mµ vÞ trÝ cña ®iÓm cÇn vÏ 20
  14. Kü thuËt §å ho¹ m¸y tÝnh trong 8 ®iÓm ®¸nh sè tõ 0 ®Õn 7 lµ p=7-(x mod 8), sau ®ã ta thay bit thø p cña mçi byte trong 4 byte ®ã b»ng bit mµu cÇn vÏ (b»ng c¸ch ®æi mµu cÇn vÏ ®iÓm ra c¬ sè 2 vÝ dô n=5 th× n=0101) Procedure putdot(x,y,n: integer); Var p,m: byte; ma: four_byte; Begin p:=7-(x mod 8); m:=1; For i:=1 To p Do m:=m*2; For i:=0 To 3 Do Begin ma[i]:=(n shr i) mod 2; ma[i]:=ma[i]*m; End; read_8_pixel(x,y,b); For i:=0 To 3 Do Begin If ma[i]=0 Then b[i]:=b[i] And ($FF-m) Else b[i]:=b[i] Or ma[i]; End; write_8_pixel(x,y,b); End; VÝ dô 4: Ghi mét ®iÓm ¶nh vµo bé nhí mµn h×nh ë chÕ ®é 4 bit plane th«ng qua cæng. Program Four_Bit_Planes; Uses Crt,dos; Const buffer: Word=$A000; gd: integer=0; Type four_byte = array[0..3] of Byte; Var gm,x,y,i: integer; b: four_byte; (**********************) Procedure set_mode(mode: integer); Var R : registers; Begin R.ax:=$4f02; R.bx:=mode; intr($10,R); End; (**********************) 21
  15. Kü thuËt §å ho¹ m¸y tÝnh Procedure write_8_pixel(x,y: integer; Var b: four_byte); Var j,address: Integer; Begin port[$3c4]:=2; address:=y*80+(x shr 3); j:=1; For i:=0 To 3 Do Begin port[$3c5]:=j; Mem[buffer:address]:=b[i]; j:=j*2; End; End; (**********************) Procedure read_8_pixel(x,y: integer; Var b: four_byte); Var address,color: integer; Begin address:=y*80+(x shr 3); port[$3ce]:=4; for i:=0 To 3 Do Begin port[$3cf]:=i; b[i]:=Mem[buffer:address]; End; End; (**********************) Procedure putdot(x,y,n: integer); Var p,m: byte; ma: four_byte; Begin p:=7-(x mod 8); m:=1; For i:=1 To p Do m:=m*2; For i:=0 To 3 Do Begin ma[i]:=(n shr i) mod 2; ma[i]:=ma[i]*m; End; read_8_pixel(x,y,b); For i:=0 To 3 Do Begin If ma[i]=0 Then b[i]:=b[i] And ($FF-m) 22
  16. Kü thuËt §å ho¹ m¸y tÝnh Else b[i]:=b[i] Or ma[i]; End; write_8_pixel(x,y,b); End; (**********************) Begin Set_mode($12); y:=150; for x:=0 To 639 Do putdot(x,y,Magenta); Readkey; y:=300; for x:=0 To 639 Do putdot(x,y,Yellow); Readkey; Set_mode(3); End. VÝ dô 5: §äc d÷ liÖu tõ chÕ ®é 4 bit plane th«ng qua c¸c cæng cña c¸c thanh ghi §o¹n ch−¬ng tr×nh sau m« t¶ c¸ch ®äc mét ®iÓm ¶nh tõ bé nhí mµn h×nh Program Read_Pixel_Color; Uses Crt,dos,graph; Const buffer: Word=$A000; gd: integer=0; Var gm,x,y: integer; Function getdot(x,y: integer): integer; Var i,address,b,color: integer; c: array[0..3] of integer; Begin address:=y*80+(x shr 3); port[$3ce]:=4; b:=x mod 8; for i:=0 To 3 Do Begin port[$3cf]:=i; c[i]:=Mem[buffer:address]; c[i]:=c[i] shl b; c[i]:=c[i] shr 7; End; color:=c[0]+2*c[1]+4*c[2]+8*c[3]; getdot:=color; End; Begin 23
  17. Kü thuËt §å ho¹ m¸y tÝnh initgraph(gd,gm,'c:\tp\bgi'); directvideo:=false; x:=320;y:=240; putpixel(x,y,WHITE); Writeln('Mau cua diem la : ',getdot(x,y)); readkey; closegraph; End. 3. ChÕ ®é 640x480 256 mµu (mode $101) Ta xÐt tr−êng hîp ®äc/ghi vµo bé nhí mµn h×nh ë chÕ ®é 256 mµu theo chuÈn VESA (chó ý trong TP øng víi mode $101 ®é ph©n gi¶i 640x480, 256 mµu) ë chÕ ®é nµy bé nhí mµn h×nh ®−îc tæ chøc thµnh 5 m¶ng mét chiÒu, mçi m¶ng gåm 65536 phÇn tö (mçi phÇn tö lµ 1 byte, mçi byte øng víi 1 pixel) vµ do ®ã ta cÇn cã 5 m¶ng ®¸nh sè tõ 0 ®Õn 4 ®Ó cã thÓ chøa ®−îc 640x480 byte. Mçi mét m¶ng nh− vËy gäi lµ mét Bank (d¶i), nh− vËy mét bank 64K ®óng b»ng 64K mµ bé nhí cña m¸y chñ dµnh cho mµn h×nh, mµ cã 5 bank nh− vËy (do ®ã bé nhí mµn h×nh ph¶i cã Ýt nhÊt lµ 64K x 5 = 320K th× míi cã thÓ ®Æt ®−îc chÕ ®é nµy) vµ bé nhí cña m¸y chñ chØ cã thÓ ¸nh x¹ vµo mét bank cña bé nhí mµn h×nh vµ ®Ó cho bank (tõ 0-4) nµo ®−îc ¸nh x¹ ta dïng thñ tôc sau : Procedure setbank(banknum: Integer); Var R : Registers; Begin R.ax:=$4f05; R.bx:=0; R.dx:=banknum; Intr($10,R); End; Mét ®iÓm cã to¹ ®é (x,y) trªn mµn h×nh sÏ lµ ®iÓm thø linear_address:=y*640+x; Mµ mçi mét bank cã 65536 ®iÓm nªn ®iÓm ®ã sÏ nÇm ë bank thø bank_num:=linear_address Div 65536; vµ ®Þa chØ cña ®iÓm ®ã ë bank nµy lµ pixel_offset:=linear_address Mod 65536; VÝ dô 6: §o¹n ch−¬ng tr×nh sau m« t¶ thñ tôc ®äc/ghi ®iÓm ¶nh ë chÕ ®é 256 mµu Program VGA_256_Color; Uses Crt,Dos; Const buffer: Word=$A000; Var v : Registers; x,y,mode: Integer; Procedure set_mode(mode: Integer); Begin v.ax:=$4f02; v.bx:=mode; Intr($10,v); 24
  18. Kü thuËt §å ho¹ m¸y tÝnh End; Procedure setbank(banknum: Integer); Begin v.ax:=$4f05; v.bx:=0; v.dx:=banknum; Intr($10,v); End; Procedure putdot(x,y: LongInt; color: Integer); Var linearaddress: LongInt; banknum: Integer; pixeloffset: Word; Begin linearaddress:=y*640+x; banknum:=linearaddress Div 65536; pixeloffset:=linearaddress Mod 65536; setbank(banknum); Mem[buffer:pixeloffset]:=color; End; Function getdot(x, y: LongInt): Integer; Var linearaddress: LongInt; banknum,color: Integer; pixeloffset: Word; Begin linearaddress:=y*640+x; banknum:=linearaddress Div 65536; pixeloffset:=linearaddress Mod 65536; setbank(banknum); getdot:=Mem[buffer:pixeloffset]; End; Begin clrscr; mode:=$101; (* 640x480, 256 mau *) set_mode(mode); directvideo:=False; x:=320; y:=240; putdot(x,y,WHITE); Writeln('Mau cua diem la : ',getdot(x,y)); Readkey; mode:=3; (*80x25x16*) set_mode(mode); End. 25
  19. Kü thuËt §å ho¹ m¸y tÝnh VÝ dô 7: ®äc néi dung thanh ghi mµu th«ng qua cæng Program Read_Write_Color_Registers; Uses crt,graph,dos; Const COLOR_MASK=$3C6; COLOR_REG_RD=$3C7; COLOR_REG_WR=$3C8; COLOR_DATA= $3C9; Type RGB_COLOR_TYP = Record red : Word; green : Word; blue : Word; End; Procedure set_ mode(mode: integer); Var R : registers; Begin R.ax:=$4f02; R.bx:=mode; intr($10,R); End; Procedure write_color_reg(index: Integer;color: RGB_COLOR_TYP); Begin port[COLOR_REG_WR]:=index; port[COLOR_DATA]:=color.red; port[COLOR_DATA]:=color.green; port[COLOR_DATA]:=color.blue; End; Procedure read_color_reg(index: integer;Var color: RGB_COLOR_TYP); Begin port[COLOR_REG_RD]:=index; color.red:=port[COLOR_DATA]; color.green:=port[COLOR_DATA]; color.blue:=port[COLOR_DATA]; End; Var VIDEO_BUFFER : Word; gd,gm,x,y,index: integer; color: RGB_COLOR_TYP; 26
  20. Kü thuËt §å ho¹ m¸y tÝnh Begin clrscr; VIDEO_BUFFER:=$A000; gm:=$13; set_ mode(gm); directvideo:=false; index:=WHITE; read_color_reg(index,color); Writeln('3 mau cua thanh ghi mau WHITE la: '); Writeln('Red: ',color.red,'; Green: ',color.green,'; Blue: ',color.blue); Readkey; index:=BLUE; color.red:=63; color.green:=0; color.blue:=63; write_color_reg(index,color); (* Ve duong thang ngang *) y:=100; for x:=0 To 319 Do Mem[VIDEO_BUFFER:y*320+x]:=index; Readkey; gm:=3; (* Text Mode *) set_graph_mode(gm); End. VÝ dô 8: lµm mµn h×nh s¸ng tèi dÇn dÇn Program Display; Uses crt,dos; Const COLOR_MASK=$3C6; COLOR_REG_RD=$3C7; COLOR_REG_WR=$3C8; COLOR_DATA= $3C9; b: Integer = 1; type RGB_COLOR_TYP = Record red : Word; green : Word; blue : Word; End; Procedure set_mode(mode: integer); Var R : registers; Begin R.ax:=$4f02; R.bx:=mode; 27
ADSENSE

CÓ THỂ BẠN MUỐN DOWNLOAD

 

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