{ MUKOGR.PAS } { Základné utility pre prácu s grafickým režimom. } { } { Author: Ľuboš Saloky } { Datum: 01.01.1996 http://www.trsek.com } unit MukoGr; INTERFACE type TKurzor=array[0..33] of word; { ----- farby, premenne pristupne uzivatelovi ----- } const Cierna=0;Cervena=1;Oranzova=2;Zlta=3;Zelena=4;Svetlomodra=5;Modra=6; Ruzova=7;Bordova=8;Hneda=9;Hnedocervena=10; Hodiny:TKurzor=(0,0,61455,57351,49155,32769,0,0,0,0,0,0,32769,49155,57351, 61455,33153,33729,0,4080,4104,8452,19746,17730,16770,16642,16386,18450,10212,4104,4080,1632,15420,0); SipkaDole:TKurzor=(8,13,65535,65535,63519,63519,63519,63519,0,0,32769,49155,57351,61455,63519, 64575,65151,65535,0,0,0,960,960,960,960,32766,16380,8184,4080,2016,960,384,0,0); SipkaHore:TKurzor=(8,2,65535,65151,64575,63519,61455,57351,49155,32769,0,0,63519,63519,63519, 63519,65535,65535,0,0,384,960,2016,4080,8184,16380,32766,960,960,960,960,0,0,0); SipkaVlavo:TKurzor=(2,8,65343,65087,64575,63551,61503,57347,49155,32771,32771,49155,57347,61503,63551, 64575,65087,65343,0,128,384,896,1920,3968,8184,16376,16376,8184,3968,1920,896,384,128,0); SipkaVpravo:TKurzor=(13,8,64767,64639,64575,64543,64527,49159,49155,49153,49153,49155,49159,64527,64543, 64575,64639,64767,0,256,384,448,480,496,8184,8188,8188,8184,496,480,448,384,256,0); Otaznik:TKurzor=(7,14,63519,61455,57351,49603,50115,59331,65415,65295,65055,64575,63615,63615,64767, 63615,63615,64767,0,2016,3120,6168,6168,24,48,96,192,384,768,768,0,768,768,0); Obycajny:TKurzor=(0,0,16383,8191,4095,2047,1023,511,255,127,63,31,511,4351,12543, 63615,63615,63615,0,16384,24576,28672,30720,31744,32256,32512,32640,31744,27648,17920,1536,768,768,0); Terc:TKurzor=(8,8,65535,64543,61447,57347,49281,50145,34800,34352,36408,34352,34800,50145,49281, 57347,61447,64543,0,0,448,1584,2056,4100,4100,8194,8322,8194,4100,4100,2056,1584,448,0); Ruka:TKurzor=(8,0,64543,63503,61447,53251,32769,1,1,32769,49153,57345,61441,61443,63491,63495,63495, 63495,128,864,1360,1368,9556,21844,19460,9220,4100,2052,1028,1032,520,528,1008,0); Paleta:array[0..767] of byte=( 0,0,0,4,4,4,8,8,8,13,13,13,17,17,17,21,21,21,25,25,25,29,29,29,34,34,34,38,38,38,42,42, 42,46,46,46,50,50,50,55,55,55,59,59,59,63,63,63,16,0,0,21,0,0,26,0,0,32,0,0,37,0,0,42, 0,0,47,0,0,53,0,0,58,0,0,63,0,0,63,16,16,63,23,23,63,30,30,63,36,36,63,43,43,63,50,50, 16,9,0,21,12,0,26,15,0,32,19,0,37,22,0,42,25,0,47,28,0,53,32,0,58,35,0,63,38,0,63,40, 6,63,43,13,63,46,19,63,48,25,63,50,32,63,53,38,16,16,0,20,20,0,25,25,0,29,29,0,33,33,0,37, 37,0,42,42,0,46,46,0,50,50,0,54,54,0,59,59,0,63,63,0,63,63,10,63,63,20,63,63,29,63,63,39, 0,15,0,0,20,0,0,26,0,0,31,0,0,36,0,0,42,0,0,47,0,0,52,0,0,58,0,0,63,0,8,63, 8,16,63,16,24,63,24,31,63,31,39,63,39,47,63,47,0,15,15,0,19,19,0,24,24,0,28,28,0,32,32,0, 37,37,0,41,41,0,46,46,0,50,50,0,54,54,0,59,59,0,63,63,10,63,63,20,63,63,30,63,63,40,63,63, 0,0,20,0,0,24,0,0,28,0,0,32,0,0,36,0,0,40,0,0,43,0,0,47,0,0,51,0,0,55,0,0, 59,0,0,63,10,10,63,20,20,63,30,30,63,40,40,63,17,0,17,21,0,21,25,0,25,30,0,30,34,0,34,38, 0,38,42,0,42,46,0,46,50,0,50,55,0,55,59,0,59,63,0,63,63,11,63,63,22,63,63,34,63,63,45,63, 12,0,17,15,0,22,19,0,26,22,0,31,26,0,35,29,0,40,32,0,45,36,0,49,39,0,54,43,0,58,46,0, 63,49,8,63,52,16,63,54,24,63,57,32,63,60,40,63,17,12,3,20,15,5,23,17,8,26,20,10,29,23,13,32, 26,15,35,28,17,38,31,20,41,34,22,44,36,25,47,39,27,49,42,30,51,44,33,53,47,37,55,49,40,57,52,43, 16,8,16,19,11,19,22,13,22,25,16,25,28,19,28,30,22,30,33,24,33,36,27,36,39,30,39,42,32,42,45,35, 45,47,38,47,49,41,49,52,45,52,54,48,54,56,51,56,63,63,63,0,62,17,0,61,17,0,61,18,0,60,18,0, 59,19,0,58,20,0,57,20,0,57,21,0,56,21,0,55,22,0,54,23,0,53,23,0,52,24,0,52,24,0,51,25, 0,50,26,0,49,26,0,48,27,0,48,27,0,47,28,0,46,29,0,45,29,0,44,30,0,44,30,0,43,31,0,42, 32,0,41,32,0,40,33,0,40,33,0,39,34,0,38,35,0,37,35,0,36,36,0,36,36,0,35,37,0,34,38,0, 33,38,0,32,39,0,32,40,0,31,40,0,30,41,0,29,41,0,28,42,0,27,43,0,27,43,0,26,44,0,25,44, 0,24,45,0,23,46,0,23,46,0,22,47,0,21,47,0,20,48,0,19,49,0,19,49,0,18,50,0,17,50,0,16, 51,0,15,52,0,15,52,0,14,53,0,13,53,0,12,54,0,11,55,0,10,55,0,10,56,0,9,56,0,8,57,0, 7,58,0,6,58,0,6,59,0,5,59,0,4,60,0,3,61,0,2,61,0,2,62,0,1,62,0,0,63,63,63,63); var kx,ky:integer; Adresa,Posun:word; {aktualny offset, posun pri vypise textov} Color:byte; {farba} Ret:string; {tu je retazec po nacitani cez Kurzor} OknoXMin,OknoXMax,OknoYMin,OknoYMax:word;{okraje okna pre proceduru PrilepBitmapu} VSeg:word; {segment VideoRAM} Font:array[0..16383] of byte; { ----- zakladne procedury ----- } procedure InicializujGrafiku; procedure ZavriGrafiku; { ----- procedury pre pracu s farbami ----- } procedure NastavFarbu(cislo,r,g,b:byte); procedure ZistiFarbu(cislo:byte;var r,g,b:byte); { ----- elementarne graficke procedury ----- } procedure ZmazObrazovku; procedure Nastav(px,py:integer;pColor:byte); {nastavi kurzor a farbu} procedure PolozBod(px,py:word;pColor:byte);{polozi bod v pozicii kurzora aktualnej farby} function ZistiBod(px,py:word):byte; {do premennej Color ulozi farbu na mieste kurzora} procedure CiaraVodorovna(Dlzka:word); {ciara z miesta kurzora} procedure CiaraZvisla(Dlzka:word); procedure VyplnPlochu(DeltaX,DeltaY:word); {vyplni ju zadanou farbou} { ----- dalsie procedury ----- } procedure Obdlznik(DeltaX,DeltaY:word); {ramcek bez vyplne} procedure Ramcek(DeltaX,DeltaY,FarbaVnutra:word);{lavy horny roh na mieste kurzora, vyfarbi znutra} procedure CakajNaVOI; {caka na ukoncenie zobrazovania} procedure NacitajFontAPaletu(FontStr:string); procedure VypisPriehladne(s:string;Odtien:byte); {40.000 zn./s, "prilepuje" retazec na aktualnu poziciu} procedure NastavTvarKurzora(Zdroj:word); { ----- procedury pre pracu s bitmapami ----- } procedure PrilepBitmapu(DeltaX,DeltaY,Zdroj:word);{zdroj je offset bitmapy} procedure PrilepPriehladnuBitmapu(DeltaX,DeltaY,Zdroj:word); procedure StiahniBitmapu(DeltaX,DeltaY,Ciel:word);{Ciel je offset bitmapy} procedure KopirujObrazovku(VSeg1,VSeg2:word); procedure PrilepDynamickuBitmapu(DeltaX,DeltaY:word;Zdroj:pointer);{nerespektuje Okno____} IMPLEMENTATION var KonY:word; procedure InicializujGrafiku; begin asm mov ax,13h int 10h end; end; procedure ZavriGrafiku;assembler; asm mov ax,3 int 10h end; procedure NastavFarbu(cislo,r,g,b:byte); begin port[$3C8]:=cislo; port[$3C9]:=r; port[$3C9]:=g; port[$3C9]:=b; end; procedure ZistiFarbu(cislo:byte;var r,g,b:byte); var x:byte; begin port[$3C7]:=cislo; r:=port[$3C9]; g:=port[$3C9]; b:=port[$3C9]; end; procedure ZmazObrazovku;assembler; asm cld mov es,VSeg db 66h; mov cx,16000; dw 0 db 66h; xor di,di; dw 0 db 66h; xor ax,ax; dw 0 db 66h; rep stosw; dw 0 end; procedure Nastav(px,py:integer;pColor:byte);assembler; asm mov al,pColor mov Color,al mov cx,320 mov ax,py mov ky,ax imul cx mov bx,px mov kx,bx add ax,bx mov Adresa,ax {nastav offset ciela} end; procedure PolozBod(px,py:word;pColor:byte);assembler; asm mov es,VSeg mov cx,320 mov ax,py mul cx add ax,px mov di,ax mov al,pColor stosb end; function ZistiBod(px,py:word):byte; var pColor:byte; begin asm mov es,VSeg mov cx,320 mov ax,py mul cx add ax,px mov di,ax mov al,byte[es:di] mov pColor,al end; ZistiBod:=pColor; end; procedure CiaraVodorovna(Dlzka:word);assembler; asm cld mov es,VSeg mov di,Adresa mov al,Color mov cx,Dlzka jcxz @Koniec rep stosb @Koniec: end; procedure CiaraZvisla(Dlzka:word);assembler; asm mov es,VSeg mov di,Adresa mov al,Color mov cx,Dlzka jcxz @Koniec @DalsiBod: mov [es:di],al add di,320 loop @DalsiBod @Koniec: end; procedure VyplnPlochu(DeltaX,DeltaY:word);assembler; asm cmp DeltaX,0 je @Koniec cmp DeltaY,0 je @Koniec cld mov es,VSeg mov di,Adresa mov bx,DeltaY mov dx,320 sub dx,DeltaX {v DX je 320-DeltaX} mov al,Color @DalsiRiadok:mov cx,DeltaX rep stosb add di,dx dec bx jnz @DalsiRiadok @Koniec: end; procedure Obdlznik(DeltaX,DeltaY:word); begin CiaraZvisla(DeltaY); CiaraVodorovna(DeltaX); Adresa:=Adresa+DeltaX-1; CiaraZvisla(DeltaY); Adresa:=Adresa+320*DeltaY-DeltaX-319; CiaraVodorovna(DeltaX); Adresa:=Adresa-320*DeltaY; end; procedure Ramcek(DeltaX,DeltaY,FarbaVnutra:word);assembler; asm cld cmp DeltaX,0 je @Koniec cmp DeltaY,0 je @Koniec mov es,VSeg mov di,Adresa mov bp,sp mov bx,DeltaY sub bx,2 {v BX pocet riadkov vnutra} mov cx,DeltaX mov dx,320 sub dx,cx {v DX je 320-DeltaX} mov al,Color rep stosb {1. riadok} @DalsiRiadok:add di,dx stosb {1. bod} mov ax,FarbaVnutra mov cx,DeltaX sub cx,2 rep stosb {vnutro} mov al,Color stosb {posledny bod} dec bx jnz @DalsiRiadok add di,dx mov al,Color mov cx,DeltaX rep stosb @Koniec: end; procedure CakajNaVOI;assembler; asm mov dx,03DAh @vz1: in al,dx and al,08h jnz @vz1 @vz2: in al,dx and al,08h jz @vz2 end; procedure NacitajFontAPaletu(FontStr:string); var f:file; pX:word; begin Assign(f,FontStr); Reset(f,16384); BlockRead(f,Font,1); Close(f); for px:=0 to 255 do NastavFarbu(px,Paleta[3*px],Paleta[3*px+1],Paleta[3*px+2]); end; procedure VypisPriehladne(s:string;Odtien:byte); var c1,c2:word; DDiak:boolean; begin c2:=0; Odtien:=Odtien*16; for c1:=1 to Ord(s[0]) do begin c2:=c2+1; {kvoli Enter a vypocitavaniu offsetu ciela} DDiak:=False; asm mov es,VSeg mov dx,Posun lea si,Font {data pre pismeno} @Dalsie: lea bx,s add bx,c1 {pismeno} mov ah,0 mov al,byte[ss:bx] cmp al,13 {spracovanie Enter} jne @Normalne add Adresa,dx mov c2,1 inc c1 jmp @Dalsie { ----- vypocet offsetov zdroja a ciela ----- } @Normalne: mov di,Adresa mov bx,c2 shl bx,3 sub bx,8 add di,bx {offset ciela} mov cx,0 cmp al,'`' {dlzen} je @Diak cmp al,'~' {makcen} je @Diak cmp al,'^' {vokan} je @Diak cmp al,'|' {dve bodky} je @Diak jmp @Dalej @Diak: sub di,320 mov DDiak,True @Dalej: shl ax,6 {offset zdroja} add si,ax {ukazuje na aktualne pismeno} { ----- vypisovanie pismena ----- } @DalsiBod: mov al,byte[si] and al,$0F jz @Nekresli mov al,byte[si] add al,Odtien mov [es:di],al @Nekresli: inc si inc di inc cx test cl,00000111b jnz @Pokracuj add di,312 @Pokracuj: cmp cx,63 jbe @DalsiBod cmp DDiak,True {spracovanie diakritiky} jne @Koniec @Diak2: dec c2 @Koniec: end; end; end; procedure NastavTvarKurzora(Zdroj:word); begin asm mov ax,ds mov es,ax mov si,Zdroj mov dx,si add dx,4 mov ax,9 mov bx,word[si] mov cx,word[si+2] int 33h end; end; procedure PrilepBitmapu(DeltaX,DeltaY,Zdroj:word);assembler; asm cld cmp DeltaX,0 je @Koniec cmp DeltaY,0 je @Koniec mov ax,DeltaY add ax,ky mov KonY,ax mov es,VSeg mov si,Zdroj { Zdroj -> ... } mov di,Adresa { ... -> Adresa} mov bx,kx { x-ova sur. } mov dx,ky { y-ova sur. } @DalsiRiadok:mov cx,DeltaX @DalsiBod: lodsb cmp bx,OknoXMin {kontrola rozsahu} jl @Nekresli cmp bx,OknoXMax jg @Nekresli cmp dx,OknoYMin jl @Nekresli cmp dx,OknoYMax jg @Nekresli mov byte[es:di],al @Nekresli: inc di {offset na dalsi bod, aj ked predosly nebol polozeny} inc bx {zvys x-ovu sur.} loop @DalsiBod {potial kreslenie 1 riadka} mov bx,kx {vrat x-ovu sur. na zaciatok} inc dx {dalsi riadok} add di,320 sub di,DeltaX {uprav DI} cmp dx,KonY jl @DalsiRiadok @Koniec: end; procedure PrilepPriehladnuBitmapu(DeltaX,DeltaY,Zdroj:word);assembler; asm cld cmp DeltaX,0 je @Koniec cmp DeltaY,0 je @Koniec mov ax,DeltaY add ax,ky mov KonY,ax mov es,VSeg mov si,Zdroj { Zdroj -> ... } mov di,Adresa { ... -> Adresa} mov bx,kx { x-ova sur. } mov dx,ky { y-ova sur. } @DalsiRiadok:mov cx,DeltaX @DalsiBod: lodsb cmp al,0 {nova podmienka oproti PrilepBitmapu} je @Nekresli cmp bx,OknoXMin {kontrola rozsahu} jl @Nekresli cmp bx,OknoXMax jg @Nekresli cmp dx,OknoYMin jl @Nekresli cmp dx,OknoYMax jg @Nekresli mov byte[es:di],al @Nekresli: inc di {offset na dalsi bod, aj ked predosly nebol polozeny} inc bx {zvys x-ovu sur.} loop @DalsiBod {potial kreslenie 1 riadka} mov bx,kx {vrat x-ovu sur. na zaciatok} inc dx {dalsi riadok} add di,320 sub di,DeltaX {uprav DI} cmp dx,KonY jl @DalsiRiadok @Koniec: end; procedure PrilepDynamickuBitmapu(DeltaX,DeltaY:word;Zdroj:pointer);assembler; asm cld cmp DeltaX,0 je @Koniec cmp DeltaY,0 je @Koniec mov es,VSeg mov dx,DeltaY mov bx,DeltaX mov di,Adresa { ... -> Adresa} push ds lds si,Zdroj {Zdroj -> .... } add si,16 @DalsiRiadok:mov cx,DeltaX rep movsb add di,320 sub di,bx {uprav DI} dec dx jnz @DalsiRiadok pop ds @Koniec: end; procedure StiahniBitmapu(DeltaX,DeltaY,Ciel:word);assembler; asm cld cmp DeltaX,0 je @Koniec cmp DeltaY,0 je @Koniec mov si,Adresa push ds mov ax,ds mov es,ax mov ax,VSeg mov ds,ax mov di,Ciel {nastavene su DS:SI -> ES:DI} mov dx,320 sub dx,DeltaX {v DX je posun zdrojoveho offsetu} mov bx,DeltaY @DalsiRiadok:mov cx,DeltaX rep movsb add si,dx dec bx jnz @DalsiRiadok pop ds @Koniec: end; procedure KopirujObrazovku(VSeg1,VSeg2:word);assembler; asm cld push ds mov ds,VSeg1 mov es,VSeg2 db 66h; mov si,0; dw 0 db 66h; mov di,0; dw 0 db 66h; mov cx,16000; dw 0 db 66h; rep movsw pop ds end; BEGIN OknoXMin:=0; OknoXMax:=319; OknoYMin:=0; OknoYMax:=199; VSeg:=$A000; Posun:=8*320; END.