.-----------------------------------------------. ! ! ! ! ! BIOLIB Verzija 1.0 ! ! ! ! ! ! ! ! KNJI@NICA GRAFI^NIH UKAZOV ! ! ZA GRAFI^NI PARTNER ! ! ! ! ! ! Priro~nik za uporabo ! ! ! ! ! ! Ident: 82 092 044 ! !_______________________________________________! Izdaja: November 1986 Operacijski sistem: CP/M 80 Pred vami je prva izdaja priro~nika za uporabo za KNJI@NICO GRAFI^NIH UKAZOV ZA GRAFI^NI PARTNER. Verjetno se vam bodo ob branju priro~nika porodile nove ideje, na{li boste bolj{e razlage, bolj{e izraze, odkrili morebitne napake in podobno. Za vsako va{o pripombo, poslano na obrazcu v prilogi, se vam zahvaljujemo. ISKRA DELTA i Pridr`ujemo si izklju~no avtorsko pravico do programskega proizvoda, opisanega v tem priro~niku, vklju~no z vso pripadajo~o dokumentacijo. Pridr`ujemo si pravico do sprememb brez predhodnega obvestila in ne odgovarjamo za {kodne posledice morebitne nevsklajenosti informacij v priro~niku s proizvodom, ter za morebitne napake. Jam~imo za uporabnost programskih proizvodov na opremi, ki jo je dobavila in instalirala DO ISKRA DELTA. Ta priro~nik vsebuje tudi tehni~no navodilo (Zakon o standardizaciji, Uradni list SFRJ {t. 38/77) ISKRA DELTA Proizvodnja ra~unalni{kih sistemov in in`eniring Parmova 41 61000 LJUBLJANA JUGOSLAVIJA ii KAZALO ====== UVOD . . . . . . . . . . . . . . . . . . . . . . . . . . . . 0-1 1. SPLO[NI GRAFI^NI UKAZI . . . . . . . . . . . . . . . . . 1-1 1.1 Ginit - Inicializacija in brisanje slike . . . . . 1-1 1.2 Gexit - Konec dela z grafiko . . . . . . . . . . . 1-2 1.3 Gclr - Brisanje grafi~ne slike. . . . . . . . . . . 1-3 2. UKAZI ZA RISANJE . . . . . . . . . . . . . . . . . . . . 2-1 2.1 Gxy - Za~etna pozicija risanja . . . . . . . . . . 2-1 2.2 Draw - Risanje linije absolutno . . . . . . . . . . 2-2 2.3 Vect - Risanje linije relativno . . . . . . . . . . 2-3 2.4 Blkvect - Risanje ve~ linij relativno . . . . . . . 2-4 2.5 Circ - Risanje kroga . . . . . . . . . . . . . . . 2-5 3. GRAFI^NI TEKST . . . . . . . . . . . . . . . . . . . . . 3-1 3.1 Gtext - Grafi~ni tekst . . . . . . . . . . . . . . 3-1 4. ZAPOLNJENI GEOMETRI^NI LIKI . . . . . . . . . . . . . . 4-1 4.1 Vbar - stolpci . . . . . . . . . . . . . . . . . . 4-1 4.2 Ring - zapolnjen kolobar . . . . . . . . . . . . . 4-3 4.3 Disc - zapolnjen krog . . . . . . . . . . . . . . . 4-4 5. ^ITANJE TO^K IZ GRAFI^NE SLIKE . . . . . . . . . . . . . 5-1 5.1 Getpix - ^itanje ene pike . . . . . . . . . . . . . 5-1 5.2 Getblk - ^itanje polja pik (128 x 8) . . . . . . . 5-2 iii 6. DELO S SLIKAMI . . . . . . . . . . . . . . . . . . . . . 6-1 6.1 Pixmem - Nastavitev prikaza in zapisovanja v eno od dveh slik . . . . . . 6-1 6.2 Scroll - Vertikalna rotacija slike . . . . . . . . 6-2 7. POSEBNI GRAFI^NI UKAZI . . . . . . . . . . . . . . . . . 7-1 7.1 Cursor - Premikanje in ~itanje grafi~nega kurzorja 7-1 7.2 Qfill - Polnenje enostavnih oblik z vzorcem . . . . 7-3 DODATEK A A. PRIMER UPORABE GRAFI^NE KNJI@NICE. . . . . . . . . . . . A-1 A.1 V Pascal-u . . . . . . . . . . . . . . . . . . . . A-1 A.2 V Fortran-u . . . . . . . . . . . . . . . . . . . . A-1 DODATEK B B. KNJI@NICA PODPROGRAMOV V PASCAL-U . . . . . . . . . . . B-1 DODATEK C C. KNJI@NICA PODPROGRAMOV V FORTRAN-U . . . . . . . . . . . C-1 DODATEK D D. ADRESE GRAFI^NEGA PROCESORJA . . . . . . . . . . . . . . D-1 DODATEK E E. KREIRANJE GRAFI^NE KNJI@NICE ZA FORTRAN . . . . . . . . E-1 iv UUUVVVOOODDD KNJI@NICA GRAFI^NIH UKAZOV ZA GRAFI^NI PARTNER Grafi~ni Partner ima v BIOS-u (Basic Input Outpur System) nekaj grafi~nih ukazov, ki so dostopni uporabniku na ve~ na~inov. V naslednjih poglavjih in dodatkih je opisana uporaba grafi~nih ukazov iz programskega jezika Fortran in TurboPascal. Za ostale prevajalnike je potrebno izdelati grafi~ne podprograme podobno, kot so podprogrami v Fortranu in TurboPascalu v dodatkih. UVOD 0 - 1 PPPOOOGGGLLLAAAVVVJJJEEE 111 1. SPLO[NI GRAFI^NI UKAZI =========================== 1.1 Ginit - Inicializacija in brisanje slike --------------------------------------------- Sintaksa: Fortran: call ginit(ifmat) Pascal: ginit(ifmat); Razlaga: Inicializacija grafi~nega procesorja, nastavitev resolucije in brisanje grafi~ne slike. Navadno uporabljamo GINIT na za~etku programa. Opis parametrov: ime - tip - opis ifmat - byte - parameter, s katerim izberemo resolucijo na ekranu mikrora~unalnika. ifmat = 0 ---> resolucija je 1024 x 256 to~k ifmat = 1 ---> resolucija je 1024 x 512 to~k Primer: Fortran : call ginit(0) Pascal : ginit(0); Splo[ni grafi~ni ukazi 1 - 1 1.2 Gexit - Konec dela z grafiko --------------------------------- Sintaksa: Fortran: call gexit Pascal: gexit; Razlaga: Brisanje grafi~ne slike in nastavitev resolucije na 1024 x 256 to~k. Navadno ta ukaz uporabljamo pred izstopom iz programa. Primer: Fortran : call gexit Pascal : gexit; Splo[ni grafi~ni ukazi 1 - 2 1.3 Gclr - Brisanje grafi~ne slike ----------------------------------- Sintaksa: Fortran: call gclr Pascal: gclr; Razlaga: Brisanje grafi~ne slike na ekranu. Resolucija in ostale nastavitve ostanejo nespremenjene. Primer: Fortran: call gclr Pascal: gclr; Splo[ni grafi~ni ukazi 1 - 3 PPPOOOGGGLLLAAAVVVJJJEEE 222 2. UKAZI ZA RISANJE ===================== 2.1 Gxy - Za~etna pozicija risanja ----------------------------------- Sintaksa: Fortran: call gxy( ix, iy ) Pascal: gxy( ix, iy ); Razlaga: Premik na absolutno pozicijo (ix, iy) na ekranu pri ~emer je (0,0) spodnji levi kot na ekranu. Ukaz uporabljamo pri nastavitvi pozicije za grafi~ni tekst, pri nastavitvi za~etne pozicije pri risanju linij itd. Opis parametrov: ime - tip - opis ix - integer - absolutna koordinata x iy - integer - absolutna koordinata y Primer: Nastavi pozicijo na to~ko (100,200)! Fortran: call gxy( 100, 200 ) Pascal: gxy( 100, 200); Ukazi za risanje 2 - 1 2.2 Draw - Risanje linije absolutno ------------------------------------ Sintaksa: Fortran: call draw( ix, iy, iatt ) Pascal: draw( ix, iy, iatt ); Razlaga: Risanje ravne ~rte od trenutne pozicije do pozicije podane s parametri. Ri{e se absolutno. S tretjim parametrom izberemo tip linije in na~in risanja. Opis parametrov: ix - integer - absolutna koordinata x iy - integer - absolutna koordinata y iatt - byte - tip linije: bit 1 in 0: 00 polna ~rta 01 ~rtkana ~rta 10 pike 11 ~rta, pika, ... - na~in pisanja: bit 5 in 4: 00 write 01 xor 10 clear 11 clear Primer: Nari{i ~rto od to~ke (100,200) do to~ke (200,250)! Fortran: call gxy( 100, 200 ); call draw( 200, 250 ); Pascal: gxy( 100, 200 ); draw( 200, 250 ); Ukazi za risanje 2 - 2 2.3 Vect - Risanje linije relativno ------------------------------------ Sintaksa: Fortran: call vect( idx, idy, iatt ) Pascal: vect( idx, idy, iatt ); Razlaga: Vektorsko risanje ravnih ~rt od trenutne pozicije do relativne pozicije (idx,idy). Tip ~rte podamo z iatt. Opis parametrov: ix - integer - relativna koordinata x iy - integer - relativna koordinata y iatt - byte - tip linije: bit 1 in 0: 00 polna ~rta 01 ~rtkana ~rta 10 pike 11 ~rta, pika, ... - na~in pisanja: bit 5 in 4: 00 write 01 xor 10 clear 11 clear Primer: Nari{i ~rto od to~ke (100,200) do to~ke, ki je relativno premaknjena za (100,-50) od prve to~ke! Fortran: call gxy(100,200) call vect(100,-50) Pascal: gxy( 100, 200 ); vect( 100, -50 ); Ukazi za risanje 2 - 3 2.4 Blkvect - Risanje ve~ linij relativno ------------------------------------------ Sintaksa: Fortran: call blkvect( ixp, iyp, iatt, nm ) Pascal: blkvect( ixp, iyp, iatt, nm ); Razlaga: Risanje verige vektorjev. To~ke so podane z vektorji ixp in iyp. Prva to~ka je absolutna vse ostale pa so relativne! Opis parametrov: ixp - integer vektor dol`ine 30 - vektor koordinat x iyp - integer vektor dol`ine 30 - vektor koordinat y iatt - byte - tip linije: bit 1 in 0: 00 polna ~rta 01 ~rtkana ~rta 10 pike 11 ~rta, pika, ... - na~in pisanja: bit 5 in 4: 00 write 01 xor 10 clear 11 clear nm - byte - {tevilo vektorjev (max 29) Primer: Fortran: dimension ix(3), iy(3) ix(1) = 100 iy(1) = 100 ix(2) = 10 iy(2) = -5 ix(3) = -2 iy(3) = -6 call blkvect( ix, iy, 0, 2 ) Pascal: var ix, iy : array[1..30] of integer; begin ix[1] := 100; iy[1] := 100; ix[2] := 10; iy[2] := -5; ix[3] := -2; iy[3] := -6; blkvect( ix, iy, 0, 2 ); end; Ukazi za risanje 2 - 4 2.5 Circ - Risanje kroga ------------------------- Sintaksa: Fortran: call circ( ix, iy, ir ) Pascal: circ( ix, iy, ir ) Razlaga: Risanje kroga s sredi{~em v absolutni to~ki (ix, iy) z radijem ir. Opis parametrov: ix, iy - integer - koordinati sredi{~a kroga ir - byte - radij kroga (0..255) Primer: Nari{i krog s sredi{~em v to~ki (100,100) in z radijem 50! Fortran: call circ( 100, 100, 50 ) Pascal: circ( 100, 100, 50 ); Ukazi za risanje 2 - 5 PPPOOOGGGLLLAAAVVVJJJEEE 333 3. GRAFI^NI TEKST =================== 3.1 Gtext - Grafi~ni tekst --------------------------- Sintaksa: Fortran: call gtext( istr, is, iatt ) Pascal: gtext( istr, is, iatt ); Razlaga: Pisanje grafi~nega teksta v vodoravni smeri od pozicije podane s funkcijo GXY. Velikost ~rk in na~in izpisa nastavimo s parametroma. Opis parametrov: istr - byte vektor dol`ine do 120 - parameter vsebuje tekst, ki ga `elimo izpisati. Prvi element vsebuje binarno {tevilo znakov teksta vklju~no s presledki, naslednji elementi vektorja pa vsebujejo posamezne ascii znake. is - byte - velikost ~rk (1..16) za vi~ino in (1..16) za ~irino. Velikost 1 ima kodo 1 in je najmanj~a, velikost 16 pa ima kodo 0 in je najve~ja. {irina znaka ... zgornji del byta (biti 7..4) {t. koda {t.pik 1 16 5 2 32 10 3 48 15 ........................ 15 240 75 16 0 80 Grafi~ni tekst 3 - 1 vi{ina znaka ... spodnji del byta (biti 3..0) {t. koda {t.pik 1 1 8 2 2 16 3 3 24 ........................ 15 15 120 16 0 128 iatt - byte - na~in pisave, oblika in kot ~rk oblika ~rk (bit 0): 0 normalne ~rke 1 italics ~rke kot ~rk (bit 1): 0 pokon~ne ~rke 1 le`e~e ~rke (90 stopinj proti urine- mu kazalcu) - na~in pisanja: bit 5 in 4: 00 write 01 xor 10 clear 11 clear Primer: Napi{i naslednje grafi~no besedilo ('Pisanje') na pozicijo (135,77) z normalnimi ~rkami, v write na~inu in z vi{ino ~rk 5 in {irino ~rk 4! Fortran: byte string, velikost dimension string(120) call gxy(125,77) string[2] := 'P' string[3] := 'i' string[4] := 's' string[5] := 'a' string[6] := 'n' string[7] := 'j' string[8] := 'e' string[1] := 7 velikost := 5 + 4 * 16 call gtext( string, velikost, 0 ) Pascal: gxy(135,77); gtext('Pisanje', 4*16+5, 0); Grafi~ni tekst 3 - 2 PPPOOOGGGLLLAAAVVVJJJEEE 444 4. ZAPOLNJENI GEOMETRI^NI LIKI =============================== 4.1 Vbar - stolpci ------------------- Sintaksa: Fortran: call vbar( ivis, isir, iatt ) Pascal: circ( ivis, isir, iatt ) Razlaga: Risanje polnjenega pravokotnika na predhodno izbrani poziciji. Levi spodnji kot pravokotnika sovpada z izbrano pozicijo. Opis parametrov: ivis - byte - visina pravokotnika (0..255) isir - byte - sirina pravokotnika (0..255) iatt - byte - tip in na~in polnenja tip polnenja: bit 1 in 0 : 00 polna ~rta 01 ~rtkana ~rta 10 pike 11 ~rtkana ~rta na~in polnenja: bit 5 in 4 : 00 write 01 xor 10 clear 11 clear Primer: Nari{i pravokotnik vi{ine 77 in {irine 50 z levim spodnjim vogalom na poziciji (133, 100). Pravokotnik naj bo polnjen s pikami v xor na~inu. Zapolnjeni geometri~ni liki 4 - 1 Fortran: byte iat call gxy( 133, 100 ) iat = 2 + 16 * 1 call vbar( 77, 50, iat ) Pascal: gxy( 133, 100 ); call vbar( 77, 50, 2 + 16 * 1 ); Zapolnjeni geometri~ni liki 4 - 2 4.2 Ring - zapolnjen kolobar ----------------------------- Sintaksa: Fortran: call ring( ix, iy, ir, itt ) Pascal: circ( ix, iy, ir, itt ) Razlaga: Risanje zapolnjenega kolobarja s sredi{~em v absolutni to~ki (ix, iy) z radijem ir in debelino kolobarja itt. Opis parametrov: ix, iy - integer - koordinati sredi{~a kolobarja ir - byte - zunanji radij kolobarja (0..255) itt - byte - debelina kolobarja (0..255) Primer: Nari{i zapolnjen kolobar s sredi{~em v to~ki (100,100) in z radijem 50 in debelino 30! Fortran: call ring( 100, 100, 50, 30 ) Pascal: ring( 100, 100, 50, 30 ); Zapolnjeni geometri~ni liki 4 - 3 4.3 Disc - zapolnjen krog -------------------------- Sintaksa: Fortran: call disc( ix, iy, ir ) Pascal: disc( ix, iy, ir ) Razlaga: Risanje zapolnjenega kroga s sredi{~em v absolutni to~ki (ix, iy) z radijem ir. Opis parametrov: ix, iy - integer - koordinati sredi{~a kroga ir - byte - radij kroga (0..255) Primer: Nari{i zapolnjen krog s sredi{~em v to~ki (100,100) in z radijem 50! Fortran: call disc( 100, 100, 50 ) Pascal: disc( 100, 100, 50 ); Zapolnjeni geometri~ni liki 4 - 4 PPPOOOGGGLLLAAAVVVJJJEEE 555 5. ^ITANJE TO^K IZ GRAFI^NE SLIKE ================================= 5.1 Getpix - ^itanje ene pike ------------------------------ Sintaksa: Fortran: i = getpix Pascal: i := getpix; Razlaga: ^itanje to~ke na trenutni poziciji. ^e je to~ka pri`gana, je rezultat 1, ~e pa je ugasnjena, je rezultat 0. Rezultat je tipa byte. Primer: ^itaj vrednost to~ke na poziciji (100, 100)! Fortran: call gxy( 100, 100 ) i = getpix Pascal: gxy( 100, 100 ) i := getpix; ^itanje to~k iz grafi~ne slike 5 - 1 5.2 Getblk - ^itanje polja pik (128 x 8) ----------------------------------------- Sintaksa: Fortran: call getblk( ix, iy, ibpnt ) Pascal: getblk( ix, iy, ibopt ) Razlaga: ^itanje bloka pik (matrika 128 x 8 ) z ekrana. Vsak byte vsebuje pokon~ni stolpec pik. Bit 0 vsebuje zgornjo biko, bit 7 pa spodnjo. Pika podana s koordinatama (ix, iy) se nahaja v prvem bytu v bitu 7 (levi spodnji kot matrike). Naslednji byte vsebuje pike desno od predhodnjih. Opis parametrov: ix, iy - integer - koordinati levega spodnjega kota matrike 128 x 8 pik ibopt - byte vektor dol`ine 128 za kopiranje to~k Primer: ^itaj matriko pik z ekrana. Levi spodnji kot ima pozicijo (100, 100), desni zgornji kot pa (227,7)! Fortran: byte bpnt dimension bpnt(128) call getblk( 100, 100, bpnt ) Pascal: type blk = array{1..128} of char; blkpnt = ^blk; var bpnt : blkpnt; buff : blk; begin bpnt := ptr( buff ); bpntgetblk( 100, 100, bpnt ); end; ^itanje to~k iz grafi~ne slike 5 - 2 PPPOOOGGGLLLAAAVVVJJJEEE 666 6. DELO S SLIKAMI ================== 6.1 Pixmem - Nastavitev prikaza in ----------------------------------- zapisovanja v eno od dveh slik ------------------------------ Sintaksa: Fortran: call pixmem( i ) Pascal: pixmem( i ); Razlaga: Preklop prikaza in risanje grafi~ne slike. Na voljo imamo dve sliki, naenkrat prika`emo samo eno, ri{emo pa v katerokoli neodvisno od prikazovanja. Opis parametrov: i - byte - preklop prikaza slike (bit 0) in risanje na sliko (bit 1) bit 0 = 0 ... prikaz slike 0 1 ... prikaz slike 1 bit 1 = 0 ... ri{i na sliko 0 1 ... ri{i na sliko 1 Primer: Nastavi risanje na sliko 1 in prikaz slike 0! Fortran: call pixmem( 2 ) Pascal: pixmem( 2 ); Delo s slikami 6 - 1 6.2 Scroll - Vertikalna rotacija slike --------------------------------------- Sintaksa: Fortran: call scroll( n, ismer ) Pascal: scroll( n, ismer ); Razlaga: Rotiranje grafi~ne slike za n vrstic navzgor (navzdol). Vrstica, ki izgine zgoraj (spodaj) se pojavi spodaj (zgoraj). Opis parametrov: n - byte - {tevilo vrstic (0..255) ismer - byte - smer rotacije slike ismer = 0 ... premik slike navzdol 1 ... premik slike navzgor Primer: Rotiraj sliko za 14 vrstic navzgor! Fortran: call scroll( 14, 1 ) Pascal: scroll( 14, 1 ); Delo s slikami 6 - 2 PPPOOOGGGLLLAAAVVVJJJEEE 777 7. POSEBNI GRAFI^NI UKAZI ================================= 7.1 Cursor - premikanje in ~itanje grafi~nega kurzorja ------------------------------------------------------- Sintaksa: Fortran: cursor( rf, ix, iy, istep ) Pascal: kazalec := cursor( rf, ix, iy, istep ); Razlaga: ^itanje pozicije z ekrana. Na ekran se najprej nari{e kri`, katerega lahko premikamo s smernimi pu{~icami na tipkovnici na vse {tiri strani. S tipkami PF1 .. PF4 spreminjamo korak premikanja kurzorja. S pritiskom na tipko zaklju~imo funkcijo (podprogram). V Pascalu imamo funkcijo, ki vrne kazalec na koordinati pozicije, v fortranu pa pozicijo dobimo preko parametra ix in iy. Opis parametrov: rf - boolean (v fortranu byte) - zastavica za nastavitev nove pozicije kri`a fr = 0 ... ne upo{teva ix in iy temve~ upo{teva staro pozicijo 1 ... upo{teva ix in iy za nastavitev pozicije kurzorja ix, iy - integer - koordinati nove pozicije kurzorja (kri'a) istep - byte - korak pri premiku kurzorja (kri`a) v pikah na ekranu (max. 255) Posebni grafi~ni ukazi 7 - 1 Primer: Po`eni ukaz za ~itanje pozicije z ekrana. Za~etna pozicija naj bo (100,100), korak pa 10 pik. Fortran: ix = 100 iy = 100 call cursor( 1, ix, iy, 10 ) Pascal: var kaz : integer; begin kaz = cursor( true, 100, 100, 10 ); ix := ^kaz; iy := ^(kaz+2); end; Posebni grafi~ni ukazi 7 - 2 7.2 Qfill - Polnenje enostavnih oblik z vzorcem ------------------------------------------------ Sintaksa: Fortran: call qfill( ix, iy, ixm, iym, mode ) Pascal: qfill( ix, iy, ixm, iym, mode ); Razlaga: Polnenje podro~ij v vodoravni ali navpi~ni smeri. Algoritem polnenja je enostaven in ne dopu{~a konkavnosti v navpi~ni smeri, ~e polnimo v vodoravni smeri. Podobno velja za polnenje v navpi~ni smeri. Opis parametrov: ix, iy - integer - koordinati za~etka polnenja ixm - byte - x maska za polnenje podro~ja iym - byte - y maska za polnenje podro~ja mode - byte - na~in polnenja bit 0 = 0 vodoravno 1 navpi~no Opomba: zaradi specifi~nosti algoritma, ki omogo~a zelo hitro polnenje, pri nekaterih polnenjih pride do napake. V tem primeru poizkusimo z zamenjavo na~ina polnenja ali pa z razdelitvijo podro~ja na dva ali ve~ delov. Primer: Nari{i in zapolni ~etverokotnik z vzorcem pik, ki so oddaljene med seboj za 4 pike. Fortran: call qfil( 100, 100, 132, 132, 0 ) Pascal: qfil( 100, 100, $84, $84, 0 ); Posebni grafi~ni ukazi 7 - 3 DDDOOODDDAAATTTEEEKKK AAA A. PRIMER UPORABE GRAFI^NE KNJI@NICE ====================================== A.1 V Pascal-u --------------- V TurboPascal-u uporabimo opcijo 'Include' za vgradnjo grafi~ne knji`nice, ki je v datoteki BIOLIB.PAS, v uporabnikov program. Primer: Program test; {$I biolib.pas} begin ginit(0); circ(100,100,50); end. A.2 V Fortran-u ---------------- V Fortran-u napisani program linkamo z grafi~no knji`nico. Primer: program napisemo na datoteko test.for: call ginit( 0 ) call circ(100,100,50) end Program prevedemo na slede~ na~in: F80 =test L80 test,gpforlib/s,forlib/s,test/n/e Kreiranje grafi~ne knji`nice je podano v dodatku E! Primer uporabe grafi~ne knji`nice A - 1 DDDOOODDDAAATTTEEEKKK BBB B. KNJI@NICA PODPROGRAMOV V PASCAL-U ====================================== procedure ginit (fmat : byte); var gi : array[1..4] of byte; begin gi[1]:=2;gi[2]:=0; gi[3]:=0; gi[4]:=fmat; bios(37,addr(gi)); end; procedure gexit; var n : array[1..2] of integer; begin n[1]:=1; n[2]:=1; bios(37,addr(n)); end; procedure gclr; var n : array [1..2] of integer; begin n[1]:=1;n[2]:=3; bios(37,addr(n)); end; Knji`nica podprogramov v Pascal-u B - 1 procedure gxy(x,y:integer); type xyp = record n : integer; cmd: byte; xp : integer; yp : integer end; var xy : xyp; begin with xy do begin n:=5; cmd := 04; xp :=x; yp :=y; end; bios(37,addr(xy)) end; procedure circ(x,y,rad:integer); type cir = record n: integer; cmd: byte; xp: integer; yp: integer; r : byte; end; var c : cir; begin with c do begin n:=6; cmd := 07; xp:=x; yp:=y; r:=rad; end; bios(37,addr(c)) end; Knji`nica podprogramov v Pascal-u B - 2 procedure disc(x,y,rad:integer); type cir = record n: integer; cmd: byte; xp: integer; yp: integer; r : byte; end; var c : cir; begin with c do begin n:=6; cmd := 09; xp:=x; yp:=y; r:=rad; end; bios(37,addr(c)) end; procedure ring(x,y,rad,tt:integer); type cir = record n: integer; cmd: byte; xp: integer; yp: integer; r : byte; t : byte; end; var c : cir; begin with c do begin n:=7; cmd := 08; xp:=x; yp:=y; r:=rad; t:=tt; end; bios(37,addr(c)) end; Knji`nica podprogramov v Pascal-u B - 3 type std = string[120]; procedure gtext( str :std; s, t :byte); type tt = record n : integer; cmd : byte; cs : byte; ct : byte; txt : std end; var tx : tt; begin with tx do begin n:=length(str)+5; cmd:=05; cs:=s; ct:=t; txt:=str; end; bios(37,addr(tx)); end; procedure vbar(l,w,attr:byte); type vbt = record n :integer; cmd :byte; len :byte; wid :byte; att : byte end; var vb : vbt; begin with vb do begin n:=6; cmd:=06; len:=l; wid:=w; att:=attr end; bios(37,addr(vb)); end; Knji`nica podprogramov v Pascal-u B - 4 procedure draw(x,y: integer; att: byte); type drw = record n: integer; cmd: byte; at: byte; xw: integer; yw: integer; end; var dr: drw; begin with dr do begin n:=7; cmd:=10; xw:=x; yw:=y; at:=att end; bios(37,addr(dr)); end; procedure vect(dx,dy: integer; attr: byte); type vec = record n: integer; cmd: byte; att: byte; dxx: integer; dyy: integer; end; var ve: vec; begin with ve do begin n:=6; cmd:=11; att:=attr; dxx:=dx; dyy:=dy; end; bios(37,addr(ve)); end; Knji`nica podprogramov v Pascal-u B - 5 procedure scroll(lines: integer ; dir : byte); type scr = record n : integer; cmd : byte; lin : byte; dire: byte end; var scrl : scr; begin with scrl do begin n:=3; cmd:=12; lin:=lines; dire := dir; end; bios(37,addr(scrl)); end; function cursor(rf : boolean; xcrs,ycrs,step : integer): integer; type crs = record n : integer; cmd : byte ; fl : boolean; xc : integer; yc : integer; st : byte end; var crsv : crs; xypnt : ^integer; begin with crsv do begin n:=7; cmd := 14; fl := rf; xc := xcrs; yc := ycrs ; st := step; end; cursor := bioshl(37,addr(crsv)); end; Knji`nica podprogramov v Pascal-u B - 6 type delta= array[1..10,1..2] of integer; var vect_block : delta; procedure blkvect( xp,yp : integer ; lt: byte ; nm : byte ); type blkv = record n : integer; f : byte; x : integer; y : integer; ltype : byte; number : byte; vxy : delta; end; var bulkv : blkv ; begin with bulkv do begin n:=nm*4+8; f := 15; x:=xp;y:=yp;ltype:=lt;number:=nm; vxy := vect_block; end; bios(37,addr(bulkv)); end; function getpix: boolean; const gpx : array[1..2] of integer = (2,13); begin getpix:=(bios(37,addr(gpx))=1); end; procedure qfill(xpos,ypos: integer; xmask,ymask:byte; mode : boolean); type qf = record n : integer; code : byte; x : integer; y : integer; xm : byte; ym : byte; md : boolean end; var qfv : qf; begin with qfv do begin n:=8; code := 16; x:=xpos; y:=ypos; xm:=xmask; ym:=ymask; md:=mode end; bios(37,addr(qfv)); end; Knji`nica podprogramov v Pascal-u B - 7 procedure pixmem(i: byte); type pi = record nm: integer; cd: byte; px: byte; end; var pix : pi; begin with pix do begin nm:=3; cd:=17; px:=i end; bios(37,addr(pix)); end; type blk = array[1..128] of char; blkpnt = ^blk; procedure getblk ( x,y : integer ; var bpnt : blkpnt ); type gb = record nm : integer; cd : byte; xs : integer; ys : integer end; var gbl : gb; begin with gbl do begin nm:=6; cd:=18; xs:=x; ys:=y; end; bpnt:=ptr(BiosHl(37,addr(gbl))) end; Knji`nica podprogramov v Pascal-u B - 8 DDDOOODDDAAATTTEEEKKK CCC C. KNJI@NICA PODPROGRAMOV V FORTRAN-U ======================================= Fortranska knji`nica grafi~nih ukazov za grafi~ni Partner je zbirka podprogramov, ki omogo~ajo klice osnovhih grafi~nih ukazov iz FORTRAN-a. Knji`nica se nahaja na datoteki GPFORLIB.REL (glej dodatek E) in jo linkamo z glavnim programom in standardno fortansko knji`nico na naslednji na~in: L80 test,GPFORLIB/S,FORLIB/S,test/N/E pri ~emer je 'test' glavni program, lahko pa dodamo {e druge knji`nice ali podprograme. ----------------------------------------------------------------- subroutine ginit(fmat) byte vector, fmat dimension vector(4) vector(1) = 2 vector(2) = 0 vector(3) = 0 vector(4) = fmat call bios37( vector ) return end C subroutine gexit byte vector dimension vector(4) vector(1) = 1 vector(2) = 0 vector(3) = 1 vector(4) = 0 call bios37( vector ) return end C subroutine gclr byte vector dimension vector(4) vector(1) = 1 Knji`nica podprogramov v Fortran-u C - 1 vector(2) = 0 vector(3) = 3 vector(4) = 0 call bios37( vector ) return end C subroutine gxy(ix,iy) byte vector,ix,iy dimension ix(2),iy(2),vector(7) vector(1) = 5 vector(2) = 0 vector(3) = 4 vector(4) = ix(1) vector(5) = ix(2) vector(6) = iy(1) vector(7) = iy(2) call bios37( vector ) return end C subroutine draw(x, y, att) byte x,y,att,vector dimension x(2),y(2),vector(8) vector(1) = 6 vector(2) = 0 vector(3) = 10 vector(4) = att vector(5) = x(1) vector(6) = x(2) vector(7) = y(1) vector(8) = y(2) call bios37( vector ) return end C subroutine vect(dx,dy,attr) byte dx,dy,attr,vector dimension dx(2), dy(2), vector(8) vector(1) = 6 vector(2) = 0 vector(3) = 11 vector(4) = attr vector(5) = dx(1) vector(6) = dx(2) vector(7) = dy(1) vector(8) = dy(2) call bios37( vector ) return end C subroutine blvect( xp, yp, lt, nm ) byte xp,yp,lt,nm,vector dimension xp(58),yp(58),vector(128) if (nm .gt. 29) then nm = 29 Knji`nica podprogramov v Fortran-u C - 2 vector(1) = 7 + 4 * nm vector(2) = 0 vector(3) = 15 vector(4) = xp(1) vector(5) = xp(2) vector(6) = yp(1) vector(7) = yp(2) vector(8) = lt vector(9) = nm write(3,100)lt,nm 100 format(i5,' ',i5) do 20 i = 1, nm j = i*4 k = i*2 vector(j+6) = xp(k+1) vector(j+7) = xp(k+2) vector(j+8) = yp(k+1) vector(j+9) = yp(k+2) 20 continue call bios37( vector ) return end C C subroutine circ(x, y, r ) byte x, y, r, vector dimension x(2), y(2), vector(8) vector(1) = 6 vector(2) = 0 vector(3) = 7 vector(4) = x(1) vector(5) = x(2) vector(6) = y(1) vector(7) = y(2) vector(8) = r call bios37( vector ) return end C subroutine gtext( str, s, t ) byte str,s,t,vector dimension vector(128), str(120) i=1 10 if (str(i) .eq. 0) goto 20 i = i + 1 if (i .le. 120) goto 10 20 continue i = i - 1 if (i .eq. 0) goto 40 vector(1) = i + 4 vector(2) = 0 vector(3) = 5 vector(4) = s vector(5) = t vector(6) = i Knji`nica podprogramov v Fortran-u C - 3 do 30 j = 1, i k = 6 + j 30 vector(k) = str(j) call bios37( vector ) 40 return end C subroutine vbar( l, w, attr ) byte l, w, attr, vector dimension vector(6) vector(1) = 4 vector(2) = 0 vector(3) = 6 vector(4) = l vector(5) = w vector(6) = attr call bios37( vector ) return end C subroutine ring(x,y,r,tt) byte x,y,r,tt,vector dimension x(2),y(2),vector(9) vector(1) = 7 vector(2) = 0 vector(3) = 8 vector(4) = x(1) vector(5) = x(2) vector(6) = y(1) vector(7) = y(2) vector(8) = r vector(9) = tt call bios37( vector ) return end C subroutine disc(x,y,r) byte x,y,r,vector dimension x(2),y(2),vector(8) vector(1) = 6 vector(2) = 0 vector(3) = 9 vector(4) = x(1) vector(5) = x(2) vector(6) = y(1) vector(7) = y(2) vector(8) = r call bios37( vector ) return end C subroutine getpix(j) byte vector,j dimension vector(3) vector(1) = 1 Knji`nica podprogramov v Fortran-u C - 4 vector(2) = 0 vector(3) = 13 call gbio37( vector ) j = vector(1) return end C subroutine getblk( x, y, bpnt ) byte x, y, bpnt, vector dimension x(2), y(2), bpnt(128), vector(128) vector(1) = 5 vector(2) = 0 vector(3) = 18 vector(4) = x(1) vector(5) = x(2) vector(6) = y(1) vector(7) = y(2) call bio128( vector ) do 10 i=1,128 10 bpnt(i) = vector(i) return end C subroutine pixmem( i ) byte i, vector dimension vector(4), i(2) vector(1) = 2 vector(2) = 0 vector(3) = 17 vector(4) = i(1) call bios37( vector ) return end C subroutine scroll( lines, dir ) byte lines,dir,vector dimension lines(2), dir(2),vector(6) vector(1) = 3 vector(2) = 0 vector(3) = 12 vector(4) = lines(1) vector(5) = lines(2) vector(6) = dir(1) call bios37( vector ) return end C subroutine cursor(rf,xc,yc,step) byte rf,xc,yc,step,vector dimension vector(9),xc(2),yc(2) vector(1) = 7 vector(2) = 0 vector(3) = 14 vector(4) = rf vector(5) = xc(1) Knji`nica podprogramov v Fortran-u C - 5 vector(6) = xc(2) vector(7) = yc(1) vector(8) = yc(2) vector(9) = step call biohl4( vector ) xc(1) = vector(1) xc(2) = vector(2) yc(1) = vector(3) yc(2) = vector(4) return end C subroutine qfill( xpos, ypos, xmask, ymask, mode ) byte xpos, ypos, xmask, ymask, mode, vector dimension xpos(2),ypos(2),vector(12) vector(1) = 8 vector(2) = 0 vector(3) = 16 vector(4) = xpos(1) vector(5) = xpos(2) vector(6) = ypos(1) vector(7) = ypos(2) vector(8) = xmask vector(9) = ymask vector(10) = mode vector(11) = 0 call bios37( vector ) return end C Knji`nica podprogramov v Fortran-u C - 6 DDDOOODDDAAATTTEEEKKK DDD D. ADRESE GRAFI^NEGA PROCESORJA ================================= TTThhhooommmsssooonnn GGGDDDPPP pppooorrrtttsss Hex. naslov 20 read : status write : command ---------------------------------------------------------------- 7 6 5 4 3 2 1 0 glej tabelo ! | | | | | | | +- light pen end | | | | | | +--- vertical blanking | | | | | +----- ready | | | | +------- pen out of display | | | +--------- ligt pen irq | | +----------- vb irq | +------------- ready irq +--------------- IRQ 21 r/w control register 1 ---------------------------------------------------------------- 7 6 5 4 3 2 1 0 | | | | | | | +--- HIGH = pen down ; LOW = pen up | | | | | | +----- HIGH = pen ; LOW = eraser | | | | | +------- HIGH = write only | | | | +--------- HIGH = cyclic screen ( write if pen out ) | | | +----------- enable lpen irq | | +------------- enable vb irq | +--------------- enable ready irq +----------------- not used, read as 0 Adrese grafi~nega procesorja D - 1 22 r/w control register 2 ---------------------------------------------------------------- 7 6 5 4 3 2 1 0 | | | | | | | +--- vector type | | | | | | +----- vector type | | | | | +------- HIGH = tilted characters | | | | +--------- HIGH = characters on vert. axis | | | +----------- X | | +------------- X | +--------------- X +----------------- X 23 r/w character size regaister ---------------------------------------------------------------- 7 6 5 4 3 2 1 0 | | | | | | | +--- P0 | | | | | | +----- P1 | | | | | +------- P2 | | | | +--------- P3 ( scaling on x axis ) | | | +----------- Q0 | | +------------- Q1 | +--------------- Q2 +----------------- Q3 ( scaling on y axis ) 24 reserved 25 r/w deltax 26 reserved 27 r/w deltay 28 r/w xpos MSBs 29 r/w xpos LSBs 2A r/w ypos MSBs 2B r/w ypos LSBs 2C read XLP write reserved 2D read YLP write reserved 2E reserved 2F read status ( no interrupt reset ) write reserved Adrese grafi~nega procesorja D - 2 ZZZ888000 pppiiiooo pppooorrrtttsss 30 r/w graphic common control ---------------------------------------------------------------- 7 6 5 4 3 2 1 0 | | | | | | | +--- display page of memory | | | | | | +----- write page of memeory | | | | | +------- write mode ( xor / nor ) | | | | +--------- format 0 | | | +----------- format 1 | | +------------- gdpint ( read only ) | +--------------- avdint ( read only ) +----------------- scroll mode 31 write : pio port a control regiser 32 r/w common text atributes ---------------------------------------------------------------- 7 6 5 4 3 2 1 0 | | | | | | | +--- dot stretch | | | | | | +----- cursor mode | | | | | +------- monochrome / colour | | | | +--------- force background / blue forground | | | +----------- reverse screen / green foreground | | +------------- dots / char 0 | +--------------- dots / char 1 +----------------- 24 / 16 Mhz text video clock 33 write : pio port b control register Adrese grafi~nega procesorja D - 3 DDDOOODDDAAATTTEEEKKK EEE E. KREIRANJE GRAFI^NE KNJI@NICE ZA FORTRAN ============================================ Za kreiranje grafi~ne knji`nice za Fortran potrebujemo naslednje sistemske programe: M80.COM F80.COM LIB80.COM RENAME.COM in naslednje izvorne programe: BIOS37.MAC GPFORLIB.FOR Postopek prevajanja in kreiranja grafi~ne knji`nice: M80 BIOS37 ,= BIOS37 F80 GPFORLIB,= GPFORLIB LIB80 GP=GPFORLIB,BIOS37/E RENAME GPFORLIB.REL=GP.REL Primer prevajanja in linkanja programa test z grafi~no knji`nico: F80 =test L80 test,GPFORLIB/S,FORLIB/S,test/N/E Izvorni program BIOS37.MAC potreben za kreiranje fortranske knji`nice: .Z80 ;BIOS37.MAC ;Klic bios rutine 37. (graficni ukazi) ;VHOD: HL ... vektor, ki vsebuje vse podatke za izvrsitev ; graficnega ukaza ; Kreiranje grafi~ne knji`nice za Fortran E - 1 bios: LD B,H ;BC=HL LD C,L ; LD A,(1) ;citaj bios low byte addr LD L,A ;spravi v reg.L LD A,(2) ;citaj bios high byte addr LD H,A ;spravi v reg.H LD DE,37*3 ;37*3 ;postavi v reg.DE odmik do ; graf. funkcije ADD HL,DE ;pristej odmik JP (HL) ;skoci na bios funkcijo ; klic biosa brez vracanja rezultatov funkcije BIOS37::push hl ;spravi registre push de push bc call bios ;poklice bios 37 pop bc ;restavrira registre pop de pop hl ret ;return LOC1: DW 0 ;adresa 1.parametra ; klic bios funkcij, ki vrnejo rezultate funkcije preko ; parametra 1! GBIO37::LD (LOC1),HL ;spravi adreso parametra CALL BIOS37 ;klici bios 37 LD HL,(LOC1) ;rezultat prenesi v parameter LD (HL),A RET biohl4::push de push bc ld (loc1),hl call bios ex de,hl ld hl,(loc1) ex de,hl ld bc,4 ldir ld hl,(loc1) pop bc pop de ret bio128::push de push bc ld (loc1),hl call bios ex de,hl ld hl,(loc1) ex de,hl ld bc,128 ldir ld hl,(loc1) pop bc pop de ret END Kreiranje grafi~ne knji`nice za Fortran E - 2 BIOLIB KNJI@NICA GRAFI^NIH UKAZOV ZA PARTNER Uporabni~ki priro~nik /Ident: xx xxx xxx/ Prva izdaja Izdajatelj: c ISKRA DELTA, TR@NO KOMUNICIRANJE, Parmova 41, Ljubljana LJUBLJANA November 1986