2498 lines
116 KiB
HTML
2498 lines
116 KiB
HTML
<html>
|
||
|
||
<head>
|
||
<meta http-equiv="Content-Type"
|
||
content="text/html; charset=windows-1250">
|
||
<meta name="GENERATOR" content="Microsoft FrontPage Express 2.0">
|
||
<title>PicoVGA - displej VGA/TV na Raspberry Pico</title>
|
||
</head>
|
||
|
||
<body bgcolor="#FFFFFF" text="#000000">
|
||
<div align="center"><center>
|
||
|
||
<table border="0" width="100%">
|
||
<tr>
|
||
<td width="33%"><p align="left"><a href="../index.html"><font
|
||
face="Arial"><< Zpìt</font></a></p>
|
||
</td>
|
||
<td width="33%"> </td>
|
||
<td width="34%"><p align="right"><font face="Arial"> <u>Èesky:</u>
|
||
<img src="img/cz2.gif" width="50" height="30">, </font><a
|
||
href="index_en.html"><font face="Arial">English: <img
|
||
src="img/en.gif" border="0" width="50" height="30"></font></a></p>
|
||
</td>
|
||
</tr>
|
||
</table>
|
||
</center></div>
|
||
|
||
<p align="center"><font color="#FF8000" size="5" face="Arial"><strong>PicoVGA</strong>
|
||
<strong>- displej VGA/TV na Raspberry Pico</strong></font></p>
|
||
|
||
<p align="center"><font face="Arial">verze 1.0, èerven 2021</font></p>
|
||
|
||
<p align="center"><font face="Arial">(c) Miroslav Nìmeèek</font></p>
|
||
|
||
<p align="center"><a href="img/picovga1.jpg"><font face="Arial"><img
|
||
src="img/picovga1_m.jpg" border="0" width="400" height="319"></font></a></p>
|
||
|
||
<p align="center"><a href="http://www.breatharian.eu/hw/picovga/dwn/PicoVga.zip"><font face="Arial">Download
|
||
knihovny PicoVGA</font></a></p>
|
||
|
||
<p align="center"><font face="Arial">Video s ukázkovými
|
||
programy: </font><a
|
||
href="https://www.youtube.com/watch?v=wX1IPa3Q0LU"><font
|
||
face="Arial">https://www.youtube.com/watch?v=wX1IPa3Q0LU</font></a></p>
|
||
|
||
<p align="center"><a
|
||
href="https://www.youtube.com/watch?v=wX1IPa3Q0LU"><font
|
||
face="Arial"><img src="img/picovga.jpg" border="0" width="600"
|
||
height="500"></font></a></p>
|
||
|
||
<p><font face="Arial"><strong>Obsah</strong></font></p>
|
||
|
||
<ul>
|
||
<li><a href="#property"><font face="Arial">Vlastnosti
|
||
knihovny PicoVGA</font></a></li>
|
||
<li><a href="#rules"><font face="Arial">Zásady pro použití
|
||
knihovny PicoVGA</font></a></li>
|
||
<li><a href="#instal"><font face="Arial">Instalace</font></a></li>
|
||
<li><a href="#diagram"><font face="Arial">Schéma zapojení</font></a></li>
|
||
<li><a href="#project"><font face="Arial">Zaèlenìní do
|
||
projektu</font></a></li>
|
||
<li><a href="#compile"><font face="Arial">Pøeklad projektu</font></a></li>
|
||
<li><a href="#folders"><font face="Arial">Složky</font></a></li>
|
||
<li><a href="#init"><font face="Arial">Inicializace
|
||
videomódu</font></a></li>
|
||
<li><a href="#core"><font face="Arial">Volání programu
|
||
druhého jádra</font></a></li>
|
||
<li><a href="#mode"><font face="Arial">Nastavení módu
|
||
obsahu displeje</font></a></li>
|
||
<li><a href="#layers"><font face="Arial">Pøekryvné vrstvy</font></a></li>
|
||
<li><a href="#sprites"><font face="Arial">Sprajty</font></a></li>
|
||
<li><a href="#canvas"><font face="Arial">Canvas</font></a></li>
|
||
<li><a href="#matrix"><font face="Arial">Transformaèní
|
||
matice</font></a></li>
|
||
<li><a href="#overclock"><font face="Arial">Pøetaktování
|
||
procesoru</font></a></li>
|
||
<li><a href="#print"><font face="Arial">Tisk textu</font></a></li>
|
||
<li><a href="#sound"><font face="Arial">Zvukový výstup PWM</font></a></li>
|
||
<li><a href="#random"><font face="Arial">Generátor náhody</font></a></li>
|
||
<li><a href="#fonts"><font face="Arial">Fonty</font></a></li>
|
||
<li><a href="#import"><font face="Arial">Import obrázkù a
|
||
zvukù</font></a></li>
|
||
<li><a href="#demo"><font face="Arial">Ukázkové programy</font></a></li>
|
||
</ul>
|
||
|
||
<p><font face="Arial">Knihovna PicoVGA umožòuje výstup z
|
||
Raspberry Pico na VGA monitor nebo na PAL/NTSC televizor, se
|
||
zamìøením na snadné použití v technické a herní praxi.
|
||
Poskytuje 4 grafické pøekryvné vrstvy s prùhledností,
|
||
témìø 30 formátù frame bufferù, které lze spolu libovolnì
|
||
kombinovat, a díky tomu si vystaèí s omezenou velikostí RAM
|
||
pamìti. K úspoøe RAM pamìti pøispívá i omezení výstupu
|
||
na 8 bitù.</font></p>
|
||
|
||
<p><font face="Arial">Procesor RP2040 obsahuje 264 KB pamìti
|
||
RAM. Pro výstup obrazu ve vyšším rozlišení to není mnoho,
|
||
a proto je potøeba pamìtí RAM velmi šetøit. V technické
|
||
praxi a pro retro hry (pro dokonalejší hry procesor nemá
|
||
výkon) plnì postaèí 8-bitový grafický výstup ve formátu
|
||
R3G3B2 (tedy èervená 3 bity, zelená 3 bity a modrá 2 bity).
|
||
Výstup v 16 nebo 24 bitech v bìžné praxi není smysluplný,
|
||
protože Raspberry Pico nemá dostatek pamìti ani výkonu k
|
||
poskytnutí tak velkého objemu dat v jiných oblastech než
|
||
krátká dema. S využitím techniky ditheringu lze i pøi
|
||
8-bitovém výstupu dosáhnout zajímavé výsledky zobrazení.</font></p>
|
||
|
||
<p><font face="Arial">Chcete-li si knihovnu vyzkoušet, staèí v
|
||
nejjednodušším pøípadì vzít 8 rezistorù, propojit jimi
|
||
výstupy GP0 až GP7 s RGB konektorem VGA nebo SCART TV, HSync
|
||
(CSync) pøipojit na GP8, sluchátka na GP19 a nahrát </font><a
|
||
href="#demo"><font face="Arial">demo program</font></a><font
|
||
face="Arial"> pøes USB (programy jsou v balíku knihovny
|
||
pøipravné již pøeložené). Je-li potøeba ovládání z
|
||
klávesnice, spustit konzolový program napø. </font><a
|
||
href="dwn/begPutty.zip"><font face="Arial">begPutty</font></a><font
|
||
face="Arial">, ale vìtšina programù funguje i bez klávesnice.</font></p>
|
||
|
||
<p><img src="img/PicoVGA_diagram2.jpg" width="450" height="346"></p>
|
||
|
||
<p><font face="Arial"><em>Licenèní podmínky:</em> Zdrojové
|
||
kódy knihovny PicoVGA a zdrojové kódy ukázkových programù
|
||
knihovny PicoVGA jsou k dispozici volnì k dalšímu použití a
|
||
modifikacím. To se nevztahuje na nìkteré grafické a zvukové
|
||
prvky (jako jsou napø. zvuky ve høe Pac-Man) a na definice
|
||
scén hry Sokoban, nebo<62> se k nim vztahují autorská práva
|
||
tøetích stran a mohou uplatòovat jiné podmínky šíøení.</font></p>
|
||
|
||
<h2><a name="property"></a><font face="Arial">Vlastnosti knihovny
|
||
PicoVGA</font></h2>
|
||
|
||
<ul>
|
||
<li><font face="Arial">1 základní vrstva a 3 pøekryvné
|
||
vrstvy s prùhledností, s využitím modulu PIO0</font></li>
|
||
<li><font face="Arial">8-bitový výstup ve formátu R3G3B2</font></li>
|
||
<li><font face="Arial">výstup na VGA monitor v rozlišení
|
||
256x192 až 1280x960</font></li>
|
||
<li><font face="Arial">výstup na televizor v prokládaném
|
||
módu PAL nebo NTSC v rozlišení až 1024x576 nebo
|
||
848x480</font></li>
|
||
<li><font face="Arial">témìø 30 formátù frame bufferù:
|
||
grafika 8/4/2/1 bitù, dlaždice, texty, speciální
|
||
formáty (grafy)</font></li>
|
||
<li><font face="Arial">barevné palety pro textové režimy a
|
||
grafické formáty s omezenou bitovou hloubkou</font></li>
|
||
<li><font face="Arial">frame buffery rùzných formátù lze
|
||
v obraze spolu libovolnì kombinovat do pásù a
|
||
segmentù</font></li>
|
||
<li><font face="Arial">RLE komprese obrazu (vhodné pro
|
||
kresby)</font></li>
|
||
<li><font face="Arial">módy prùhlednosti s volitelnou
|
||
klíèovou barvou</font></li>
|
||
<li><font face="Arial">hardwarové sprajty v pøekryvných
|
||
vrstvách</font></li>
|
||
<li><font face="Arial">výstup vrstev jen do urèených
|
||
výstupních pinù (barevné roviny)</font></li>
|
||
<li><font face="Arial">automatická konfigurace videomódu
|
||
podle zadaného rozlišení a èasování</font></li>
|
||
<li><font face="Arial">automatické pøetaktování procesoru
|
||
podle požadovaného rozlišení</font></li>
|
||
<li><font face="Arial">knihovna používá 2. jádro
|
||
procesoru, pro hlavní program je vyhrazeno 1. jádro</font></li>
|
||
<li><font face="Arial">doplòkovì PWM zvukový výstup
|
||
(nemusí být použit)</font></li>
|
||
</ul>
|
||
|
||
<p><font face="Arial">Zde pøíklad výstupu na televizor v
|
||
prokládaném (interlaced) módu, s redukcí z VGA konektoru na
|
||
SCART TV konektor. Redukce VGA/SCART obsahuje jen jednoduché
|
||
propojení pinù konektorù, pøípadnì ještì 1 rezistor pro
|
||
blanking signál.</font></p>
|
||
|
||
<p align="center"><a href="img/picovga2.jpg"><font face="Arial"><img
|
||
src="img/picovga2_m.jpg" border="0" width="400" height="311"></font></a></p>
|
||
|
||
<h2><a name="rules"></a><font face="Arial">Zásady pro použití
|
||
knihovny PicoVGA</font></h2>
|
||
|
||
<p><font face="Arial">Generování obrazu na Raspberry Pico je
|
||
záležitost limitního využití procesoru a je mu nutné
|
||
podøídit ostatní èinnosti procesoru. Pøi použití PicoVGA
|
||
knihovny je nutné pamatovat na nìkolik zásad:</font></p>
|
||
|
||
<p><font face="Arial">Knihovna bìží vždy na druhém jádru
|
||
procesoru a program na prvním jádru. Renderování obrazu je
|
||
schopné jádro procesoru zcela vytížit a zpravidla je pro
|
||
další využití nevyužitelné. Oddìlení funkcí jader má
|
||
výhodu i v tom, že jádra se navzájem neovlivòují a není
|
||
potøeba vzájemné uzamykání. První jádro jednoduše
|
||
používá zápis do frame bufferù a druhé jádro obsahy frame
|
||
bufferù zobrazuje, aniž je mezi nimi nutná nìjaká
|
||
komunikace. Tím se celková práce usnadní a urychlí.</font></p>
|
||
|
||
<p><font face="Arial">Je-li pøece jen druhé jádro málo
|
||
vytížené (napø. pøi zobrazení 8-bitové grafiky, která se
|
||
jednoduše pøenáší pomocí DMA pøenosu), lze ho využít
|
||
též na práci hlavního programu. Je však nutno poèítat s
|
||
nìkterými omezeními - program v druhém jádru by nemìl
|
||
používat pøerušení (narušovalo by èinnost renderovací
|
||
funkce), interpolaèní jednotku by mìl používat s opatrností
|
||
(renderovací funkce její stav neuchová) a nesmí zakázat
|
||
pøerušení.</font></p>
|
||
|
||
<p><font face="Arial">Dùležitou zásadou je, že všechna data,
|
||
ke kterým má mít PicoVGA knihovna pøístup, <strong>musí
|
||
být uložena v pamìti RAM</strong>. Externí pamì<6D> flash je
|
||
pomalá a nelze použít pro renderovací funkce. Pokud by se
|
||
napø. mìl zobrazit obrázek z pamìti flash, je nutné ho
|
||
nejdøíve zkopírovat do bufferu v pamìti RAM a potom
|
||
renderovací funkci pøedat ukazatel na kopii obrázku v RAM.
|
||
Pokud by se jí pøedal ukazatel na obrázek ve flash, pomalý
|
||
pøístup k flash by zpùsoboval výpadky obrazu. Kromì
|
||
obrázkù to platí napø. i pro fonty a vzory dlaždic.</font></p>
|
||
|
||
<p><font face="Arial">Pøi rozvrhování obrazu je nutné
|
||
poèítat s omezenou rychlostí vykreslování. Nìkteré módy
|
||
se vykreslí velmi rychle (napø. 8-bitová grafika se jen
|
||
pøenáší z frame bufferu pomocí DMA) a nìkteré módy jsou
|
||
velmi nároèné na vykreslování - napø. renderování
|
||
sprajtù v pomalém režimu. Pøi použití nároèného
|
||
vykreslování se mùže stát, že nìkterá videolinka se
|
||
nevyrenderuje dostateènì rychle v potøebném èase a obraz se
|
||
rozpadne (vypadne synchronizace). V takových pøípadech je
|
||
nutné použít jiný mód, nebo zmenšit vykreslovanou plochu
|
||
(doplnit ji jinými módy, rychlejšími - napø. po stranách
|
||
obrazu doplnit ovládací prvky tvoøené dlaždicemi), zmenšit
|
||
rozlišení obrazovky nebo zvýšit rychlost hodin procesoru.
|
||
Videolinky jsou renderovány samostatnì a proto jde vždy jen o
|
||
obsah na jedné videolince, videolinky se navzájem
|
||
neovlivòují. Napø. rychlost vykreslování sprajtù otestujete
|
||
tak, že umístíte všechny sprajty vedle sebe horizontálnì
|
||
(nejnároènìjší pøípad) a ovìøíte, zda nevypadne
|
||
synchronizace obrazu.</font></p>
|
||
|
||
<p><font face="Arial">Opatrnosti je tøeba dbát i v pøípadì
|
||
použití DMA pøenosu. DMA se používá k pøenosu dat do PIO.
|
||
Pøestože se pøi pøenosu využívá FIFO mezipamì<6D>, mùže
|
||
znamenat použití jiného DMA kanálu zpoždìní renderovacího
|
||
DMA kanálu a tím i výpadek obrazu. Pøetížení DMA mùže
|
||
nastat napø. pøi rychlém pøenosu vìtšího bloku dat v RAM
|
||
pamìti. Ovšem nejvìtším zatížením je DMA pøenos dat z
|
||
flash pamìti. V tom pøípadì DMA kanál èeká na naètení
|
||
dat z flash pøes QSPI a blokuje tak renderovací DMA kanál.</font></p>
|
||
|
||
<p><font face="Arial">Generátoru obrazu je nutné podøídit i
|
||
frekvenci hodin procesoru. Pøed inicializací videomódu
|
||
knihovna vypoèítá potøebnou frekvenci systémových hodin
|
||
tak, aby èasování odpovídalo požadavku a aby byla rychlost
|
||
procesoru dostateèná pro potøebné rozlišení obrazu. Je
|
||
dobré zpoèátku si vypoètenou frekvenci hodin vypsat pro
|
||
kontrolu na konzole. Je možné knihovnì zakázat zmìnu
|
||
systémových hodin, nebo jí pøedepsat jen urèitý rozsah, v
|
||
tom pøípadì mohou být nìkteré módy nedosažitelné (nebo
|
||
se obraz mùže rozpadat).</font></p>
|
||
|
||
<p><font face="Arial">Obrazové buffery musí být zarovnané na
|
||
4 bajty (32-bitové slovo procesoru) a obrazové segmenty musí
|
||
být horizontálnì zarovnané na 4 pixely - to se týká
|
||
horizontální pozice segmentu, jeho šíøky, zarovnání
|
||
(wrapx) a offsetu (offx). Zarovnání se netýká vertikálního
|
||
smìru. Toto omezení je nutné z toho dùvodu, že obrazová
|
||
informace se pøenáší do PIO øadièe pomocí 32-bitového DMA
|
||
pøenosu, a ten musí být zarovnaný na 32-bitové slovo. Jedno
|
||
32-bitové slovo obsahuje 4 pixely (1 pixel má 8 bitù), proto i
|
||
horizontální data v obraze musí být zarovnána na 4 pixely.
|
||
Nelze tedy dìlat jemné horizontální skrolování obrazu po 1
|
||
pixelu (omezení se netýká vertikálního skrolování), ale
|
||
pouze po 4 pixelech. Výjimkou jsou pomalé sprajty, které se
|
||
vykreslují softwarovì do videolinky, a mohou se proto posouvat
|
||
po 1 pixelu. Stejnì tak se omezení netýká softwarového
|
||
vykreslování do framebufferu (napø. vykreslení obrázku do
|
||
videopamìti mùže probìhnout na jakoukoliv souøadnici).</font></p>
|
||
|
||
<h2><a name="instal"></a><font face="Arial">Instalace</font></h2>
|
||
|
||
<p><font face="Arial">Knihovna PicoVGA je pøipravena pro
|
||
zjednodušený pøeklad ve Windows prostøedí, kdy vyžaduje
|
||
pouze instalaci ARM-GCC pøekladaèe. Pøeklad pro Linux není
|
||
pøipraven, tuto oblast pøenechávám nìkomu znalejšímu Linux
|
||
prostøedí. ;-)</font></p>
|
||
|
||
<p><font face="Arial">K pøekladu potøebujete <strong>ARM-GCC</strong>
|
||
pøekladaè. Ten si mùžete stáhnout zde:</font></p>
|
||
|
||
<p><a
|
||
href="https://developer.arm.com/tools-and-software/open-source-software/developer-tools/gnu-toolchain/gnu-rm/downloads"><font
|
||
face="Arial">https://developer.arm.com/tools-and-software/open-source-software/developer-tools/gnu-toolchain/gnu-rm/downloads</font></a></p>
|
||
|
||
<p><font face="Arial">V souèasnosti by se jednalo o verzi <strong>gcc-arm-none-eabi-10-2020-q4-major-win32.exe</strong>.
|
||
Doporuèuji pøekladaè nainstalovat do složky <strong>C:\ARM10</strong>
|
||
a pøi instalaci vypnout volbu pro pøidání cesty do PATH.
|
||
Jednotlivé verze pøekladaèe nejsou vždy až tak úplnì
|
||
zamìnitelné a je proto praktické mít nainstalováno více
|
||
verzí (složky C:\ARM9, C:\ARM8 atd.) a cestu do použité verze
|
||
pøekladaèe pøidat až uvnitø povelového souboru. Tímto
|
||
zpùsobem jsou pøipravené i pøekladové soubory v PicoVGA.
|
||
Budete-li chtít zmìnit cestu do složky pøekladaèe, naleznete
|
||
ji v pøekladových souborech <strong>_c1.bat</strong> a <strong>_boot2\c.bat</strong>.
|
||
Nechcete-li používat více verzí pøekladaèe, ponechte
|
||
instalaci do implicitní složky a ponechte zapnutou volbu pro
|
||
pøidání cesty do PATH, pøeklad bude fungovat správnì také.</font></p>
|
||
|
||
<p><font face="Arial">Knihovnu PicoVGA rozbalte do nìjaké
|
||
složky. Kamkoliv, kde budete chtít pracovat. ... A tím je
|
||
instalace ukonèena. :-)</font></p>
|
||
|
||
<p><font face="Arial">Další doporuèení pro snadné použití
|
||
RaspberryPicoSDK knihoven ve Windows naleznete v popisu
|
||
"Snadný pøeklad Raspberry Pico pod Windows": </font><a
|
||
href="http://www.breatharian.eu/hw/rasppico/index.html"><font
|
||
face="Arial">http://www.breatharian.eu/hw/rasppico/index.html</font></a><font
|
||
face="Arial"> .</font></p>
|
||
|
||
<h2><a name="diagram"></a><font face="Arial">Schéma zapojení</font></h2>
|
||
|
||
<p><font face="Arial">Nepøedkládám zde celkové zapojení
|
||
které jsem použil, protože knihovna vznikla jako souèást
|
||
retro herního poèítaèe s Raspberry Pico a je zatím ve
|
||
vývoji. Zde je zjednodušené schéma zapojení výstupu na VGA
|
||
monitor (doplnìno o zvukový PWM výstup):</font></p>
|
||
|
||
<p><font face="Arial"><img src="img/PicoVGA_diagram.jpg"
|
||
width="800" height="444"></font></p>
|
||
|
||
<p><font face="Arial">Synchronizaèní výstup má formát
|
||
synchronizaèní smìsi CSYNC (composite synchro, HSYNC + VSYNC).
|
||
Poèítaèové monitory podporují smíšenou synchronizaci
|
||
CSYNC. Signál se pøivádí na vstup HSYNC (oznaèovaný též
|
||
jako CSYNC). Na pin VSYNC konektoru VGA je pøiveden zvukový
|
||
výstup, to pro pøípad výstupu na televizor. VGA monitor má
|
||
na tomto pinu vstupní impedanci 75 ohmù, díky tomu se audio
|
||
signál utlumí a VGA monitor ho ignoruje a nepovažuje za
|
||
vertikální synchronizaci. Po zasunutí audio konektoru se
|
||
výstup na VGA monitor odpojí a zvukový signál je vyveden ven
|
||
(napø. na audio sluchátka).</font></p>
|
||
|
||
<p><font face="Arial">Televizor je pøipojen na VGA výstup pøes
|
||
redukci, která jednoduše propojí piny VGA konektoru s
|
||
pøíslušnými piny SCART konektoru. V tomto pøípadì se
|
||
využije i audio signál pøivedený na VGA konektor. Není tak
|
||
nutné, aby zaøízení obsahovalo i speciální konektor pro
|
||
televizor. Napìtí 5V z pinu 9 se využije jako ovládací
|
||
napìtí pro SCART konektor - pin 16 SCART konektoru (Blanking)
|
||
se pøipojí pøes odpor 100 ohmù a pin 8 (Switch) se pøipojí
|
||
pøímo.</font></p>
|
||
|
||
<p><font face="Arial">Není zde zakresleno pøipojení
|
||
klávesnice. Všechny ukázkové programy jsou pøipravené tak,
|
||
aby bylo možné použít ovládání programu pøes konzoli na
|
||
USB virtuálním portu. Staèí Pico pøipojit k PC pøes USB
|
||
kabel, kterým probíhá programování, a spustit konzolový
|
||
program (napø. </font><a href="dwn/begPutty.zip"><font
|
||
face="Arial">begPutty</font></a><font face="Arial">), který se
|
||
pøipojí k virtuálnímu USB COM portu. Bližší popis
|
||
pøipojení naleznete v </font><a
|
||
href="http://www.breatharian.eu/hw/rasppico/index.html"><font
|
||
face="Arial">popisu SDK</font></a><font face="Arial">.</font></p>
|
||
|
||
<h2><a name="project"></a><font face="Arial">Zaèlenìní do
|
||
projektu</font></h2>
|
||
|
||
<p><font face="Arial">Pøi zaèlenìní PicoVGA knihovny do
|
||
projektu je nejjednodušší cestou použít nìkterý již
|
||
existující ukázkový projekt. Pro maximální jednoduchost
|
||
jsou do projektù zaèlenìny všechny zdrojové soubory.
|
||
Pøeklad sice trvá o nìco déle, ale nevyžaduje úpravy
|
||
výbìru a poøadí pøekládaných souborù, èímž se
|
||
výslednì práce zjednoduší.</font></p>
|
||
|
||
<p><font face="Arial">Pøi zaèlenìní knihovny do již
|
||
existujícího projektu je potøeba pøevzít složku _picovga,
|
||
která obsahuje zdrojové soubory knihovny PicoVGA. V souboru
|
||
global.h naleznete hlavièkové soubory *.h, které se do
|
||
projektu zaèleòují (_picovga/define.h atd.). Pøidávané
|
||
pøekládané soubory naleznete v souboru Makefile.inc. Jednak
|
||
skupina souborù v assembleru "ASM picovga" a jednak C
|
||
zdrojové kódy "C picovga".</font></p>
|
||
|
||
<p><font face="Arial">Knihovna PicoVGA vyžaduje pøi pøekladu
|
||
soubor <strong>vga.pio</strong>, pøeložený pomocí
|
||
pøekladaèe pioasm.exe do souboru vga.pio.h. V aktuální
|
||
složce projektu vyhledává soubor <strong>include.h</strong>,
|
||
který obsahuje seznam všech hlavièkových souborù, vèetnì
|
||
vga.pio.h.</font></p>
|
||
|
||
<p><font face="Arial">Dále v aktuální složce vyhledává
|
||
soubor <strong>vga_config.h</strong>. Ten obsahuje nastavení
|
||
knihovny PicoVGA, jako napø. velikost renderovacích bufferù.
|
||
Souboru vga_config.h si vìtšinou všímat nemusíte. Musíte do
|
||
nìj zasáhnout obvykle v tìchto pøípadech:</font></p>
|
||
|
||
<ul>
|
||
<li><font face="Arial">Když použijete rozlišení displeje
|
||
vìtší než 640x480 pixelù. Typicky v konfiguraèním
|
||
souboru bývá nastaveno maximální rozlišení 640x480.
|
||
Tento údaj je nutné pøi vìtším rozlišení upravit,
|
||
aby si knihovna rezervovala vìtší buffery pro
|
||
renderovací funkce.</font></li>
|
||
<li><font face="Arial">Druhým pøípadem, kdy musíte
|
||
konfiguraci upravit, je nedostatek pamìti RAM. Je zde
|
||
ještì nìjaká rezerva, na které mùžete nìjakou
|
||
pamì<6D> uspoøit. Jednak mùžete snížit nastavené
|
||
rozlišení MAXX, MAXY a MAXLINE až na reálnou hodnotu.
|
||
Dále mùžete snížit poèet vrstev LAYERS až na
|
||
skuteènì použitou hodnotu (v rozsahu 1 až 4). A
|
||
koneènì mùžete snížit poèet segmentù a pruhù na
|
||
skuteènou hodnotu SEGMAX a STRIPMAX (minimum 1).</font></li>
|
||
<li><font face="Arial">Tøetím pøípadem je použití
|
||
velkého množství pruhù a segmentù displeje. Bìžnì
|
||
jsou zde nastaveny hodnoty 8 pruhù (=horizontální
|
||
pásy) a 8 segmentù (=vertikální rozdìlení každého
|
||
pásu).</font></li>
|
||
</ul>
|
||
|
||
<h2><a name="compile"></a><font face="Arial">Pøeklad projektu</font></h2>
|
||
|
||
<p><font face="Arial">Všechny demo pøíklady v PicoVGA jsou
|
||
již pøipravené pøeložené (pøeložený soubor má vždy
|
||
jméno <strong>program.uf2</strong>) - pøeloženo pro VGA
|
||
monitor a USB konzolovou klávesnici. Staèí je jen nahrát do
|
||
Pico spuštìním <strong>e.bat</strong> (="Export").
|
||
Budete-li chtít v kódu nìco mìnit, nový pøeklad zajistíte
|
||
spuštìním <strong>c.bat</strong> (="Compile"). Ve
|
||
FAR jen stisknìte c<Enter>. Vyèištìní pøekladu
|
||
provedete spuštìním <strong>d.bat</strong>
|
||
(="Delete"). Smažou se všechny pøechodné soubory a
|
||
ponechá se jen výsledný pøeložený soubor program.uf2.</font></p>
|
||
|
||
<p><font face="Arial">Bìhem pøekladu je zajištìno, že pøi
|
||
úpravách souborù *.c, *.asm a *.cpp se pøekládají jen
|
||
zmìnìné soubory, ne celý projekt. Není tedy nutný
|
||
kompletní pøeklad po každé zmìnì kódu. Není zde ovšem
|
||
zajištìn pøeklad v závislosti na hlavièkových souborech
|
||
*.h, na to je potøeba pamatovat. Tedy bìžnì pøekládat
|
||
zrychlenì pomocí c.bat a jen po podstatnìjších zmìnách v
|
||
*.h nebo pøi podezøelém chování nejdøíve vymazat starý
|
||
pøeklad pomocí d.bat a provést pak plný pøeklad.</font></p>
|
||
|
||
<p><font face="Arial">V základní složce PicoVGA naleznete
|
||
ještì soubory <strong>c_all.bat</strong> a <strong>d_all.bat </strong>-
|
||
slouží k hromadnému pøeložení nebo proèištìní pøekladu
|
||
všech demo programù.</font></p>
|
||
|
||
<p><font face="Arial">V souboru Makefile, nacházejícím se u
|
||
každého projektu, naleznete nastavení projektu. Zpravidla si
|
||
vystaèíte s tím, že budete pøidávat další zdrojové
|
||
soubory *.c k promìnné CSRC a soubory *.cpp k promìnné SRC.
|
||
Budete-li do projektu pøidávat hlavièkové soubory *.h,
|
||
pøidávejte je do souboru src\include.h. Odkaz na include.h
|
||
uvedete na zaèátku každého souboru *.c a *.cpp.</font></p>
|
||
|
||
<p><font face="Arial">Pøeložený program mùžete do Pico
|
||
nahrát buï pøetažením myší, nebo povelovým souborem <strong>e.bat</strong>.
|
||
Pro ten úèel je užiteèné disk pojmenovat jednotnì napø. R:
|
||
(=Raspberry). Pøejmenování se provede ve správì poèítaèe
|
||
- pøes Tento poèítaè / Spravovat. Nebo upravit jméno disku v
|
||
souboru <strong>_e1.bat</strong>.</font></p>
|
||
|
||
<h2><a name="folders"></a><font face="Arial">Složky</font></h2>
|
||
|
||
<p><font face="Arial">V PicoVGA naleznete následující složky:</font></p>
|
||
|
||
<p><font face="Arial"><strong>_boot2</strong> - Zavadìèe 2.
|
||
stupnì.</font></p>
|
||
|
||
<p><font face="Arial"><strong>_exe</strong> - program elf2uf2 pro
|
||
export pøeloženého programu z formátu elf2 do formátu uf2, a
|
||
pioasm, pøekladaè programù pro PIO. Programy jsou pøipraveny
|
||
pro 64-bitový systém Windows. Pro 32-bitový systém použijte
|
||
knihovny ze složky 32bit.</font></p>
|
||
|
||
<p><font face="Arial"><strong>_picovga</strong> - knihovna
|
||
PicoVGA, spolu s podpùrnými programy</font></p>
|
||
|
||
<p><font face="Arial"><strong>_sdk</strong> - knihovní soubory
|
||
SDK. Struktura je zjednodušená oproti originálnímu SDK.
|
||
Všechny *.c soubory se nacházejí v jedné složce a všechny
|
||
*.h soubory ve složce include.</font></p>
|
||
|
||
<p><font face="Arial"><strong>_tinyusb</strong> - knihovna
|
||
TinyUSB pro obsluhu USB portu.</font></p>
|
||
|
||
<p><font face="Arial"><strong>_tools</strong> - utility pro
|
||
obsluhu pøekladu z knihovny MinGW, jako je program
|
||
"make.exe" atd.</font></p>
|
||
|
||
<p><font face="Arial"><strong>_www</strong> - obsah této www
|
||
stránky s popisem.</font></p>
|
||
|
||
<p><font face="Arial">Ostatní složky obsahují demo pøíklady.</font></p>
|
||
|
||
<h2><a name="init"></a><font face="Arial">Inicializace videomódu</font></h2>
|
||
|
||
<p><font face="Arial">Videomód lze inicializovat buï
|
||
zjednodušenì samotnou funkci Video() nebo podrobnìji pomocí
|
||
následujících funkcí.</font></p>
|
||
|
||
<p><font face="Arial"><strong>Video(u8 dev, u8 res, u8 form, u8*
|
||
buf, const void* buf2)</strong> ... Zjednodušená inicializace
|
||
videomódu. Popis funkce a parametrù naleznete ve vga_vmode.h.
|
||
Tato funkce v sobì zahrnuje následující funkce uvedené zde
|
||
níže. Podporuje jen 1 segment displeje a má omezený
|
||
repertoár formátù a rozlišení, ale v nìkterých pøípadech
|
||
mùže staèit. Funkci staèí pøedat jen ukazatel na frame
|
||
buffer, což je pole u8 o dostateèné velikosti pro obrazová
|
||
data. Funkce používá implicitní globální struktury knihovny
|
||
(Cfg, Vmode, Canvas), jinak je možné v programu používat
|
||
implicitní globální struktury libovolnì. Pøi použití
|
||
funkce Video nejsou následující inicializaèní funkce
|
||
potøebné.</font></p>
|
||
|
||
<p><font face="Arial"><strong>multicore_launch_core1(VgaCore)</strong>
|
||
... První funkce, která by mìla být volána v projektu,
|
||
spustí druhé jádro procesoru s PicoVGA knihovnou.</font></p>
|
||
|
||
<p><font face="Arial"><strong>void VgaCfg(const sVgaCfg* cfg,
|
||
sVmode* vmode)</strong> ... Pøíprava struktury pro nastavení
|
||
videomódu. Struktura sVgaCfg (popis ve vga_vmode.h) obsahuje
|
||
požadované vlastnosti videomódu - požadované rozlišení
|
||
displeje, minimální frekvence procesoru a požadované
|
||
èasování signálu sVideo* (též ve vga_vmode.h), pøípadnì
|
||
ještì požadovaný mód pøekryvné vrstvy. Mùžete nejdøíve
|
||
zavolat funkci <strong>VgaCfgDef</strong>, která pøednastaví
|
||
strukturu na implicitní parametry - rozlišení 640x480, VGA
|
||
displej, frekvence procesoru 120 až 270 MHz. Funkce VgaCfg
|
||
pøipraví strukturu popisovaèe sVmode, která se pozdìji
|
||
pøedá nicializaèní funkci. V této chvíli ještì k
|
||
žádným operacím nedochází, pouze se poèítá potøebné
|
||
nastavení. Po výpoètu je možné nìkteré položky struktury
|
||
sVmode ještì dokorigovat. V knihovnì jsou pøipraveny
|
||
globální struktury Cfg a Vmode, které lze pro funkci použít.
|
||
Požadované rozlišení obrazu a èasování signálu jsou dvì
|
||
na sobì nezávislé vlastnosti. U èasování jste omezeni jen
|
||
poètem videolinek obrazu, ale jinak v jejich rámci mùžete
|
||
nastavit jakékoliv rozlišení obrazu. Napø. u PAL a NTSC
|
||
obrazu mùžete nastavit VGA rozlišení obrazu. Chcete-li
|
||
zajistit univerzálnost programu, aby ho bylo možné spouštìt
|
||
jak na VGA monitoru, tak na televizoru, použijte VGA rozlišení
|
||
640x480 nebo 320x240 (pøíp. 512x400 a 256x192, kvùli omezení
|
||
RAM). Pøi zmìnì displeje staèí jen zvolit èasování
|
||
VGA/PAL nebo NTSC, pro program se rozlišení nemìní.</font></p>
|
||
|
||
<p><font face="Arial"><strong>set_sys_clock_pll(Vmode.vco*1000,
|
||
Vmode.pd1, Vmode.pd2)</strong> ... Nastavení systémových
|
||
hodin. Funkce VgaCfg vypoèetla potøebnou frekvenci procesoru,
|
||
vypoètené hodnoty se pøedají funkci pro nastavení
|
||
systémových hodin. Funkci VgaCfg lze zadat požadovaný limit
|
||
frekvence.</font></p>
|
||
|
||
<p><font face="Arial"><strong>ScreenClear(pScreen)</strong> ...
|
||
Vymazání displeje a inicializace struktury displeje.
|
||
Minimálnì tato funkce by mìla být volána pøed inicializací
|
||
videmódu. Inicializuje strukturu popisovaèe obsahu displej na
|
||
kterou ukazuje pScreen (obvykle to je implicitní struktura
|
||
knihovny Screen) tím že nastaví poèet segmentù na 0.
|
||
Obrazovka bude èerná, dokud ji nenaplníme popisovaèi obsahu
|
||
(viz níže).</font></p>
|
||
|
||
<p><font face="Arial"><strong>VgaInitReq(&Vmode)</strong> ...
|
||
Inicializace videomódu. Funkce pøedá knihovnì ukazatel na
|
||
popisovaè formátu, který vygenerovala funkce VgaCfg. Ve
|
||
skuteènosti tato funkce inicializaci videomódu neprovede, pouze
|
||
knihovnì v druhém jádru procesoru pøedá ukazatel a pak
|
||
èeká na potvrzení ukonèení inicializace. Je-li potøeba
|
||
videomód zmìnit (týká se to zmìny èasování videosignálu
|
||
a zmìny typu pøekryvných vrstev), je nutné nejdøíve
|
||
zastavit generování obrazu voláním funkce VgaInitReq s
|
||
parametrem NULL, a teprve až potom zavolat funkci s novým
|
||
nastavením videomódu.</font></p>
|
||
|
||
<h2><a name="core"></a><font face="Arial">Volání programu
|
||
druhého jádra</font></h2>
|
||
|
||
<p><font face="Arial">Není-li druhé jádro pøíliš
|
||
vytížené generováním obrazu, lze mu pøedat požadavek k
|
||
provedení funkce. Generování obrazu to neovlivní, pouze se
|
||
mùže stát, že pøi velké zátìži generátoru pojede
|
||
požadovaná funkce pomalu. Funkce nesmí používat
|
||
pøerušení, nesmí zakázat pøerušení a mùže být omezeno
|
||
použití hardwarového interpolátoru (pøerušení displeje
|
||
jeho stav neuchová).</font></p>
|
||
|
||
<p><font face="Arial"><strong>Core1Exec(void (*fnc)())</strong>
|
||
... provedení funkce jádrem 1.</font></p>
|
||
|
||
<p><font face="Arial"><strong>Bool Core1Busy()</strong> ... test,
|
||
zda je jádro 1 zaneprázdnìné provádìním funkce.</font></p>
|
||
|
||
<p><font face="Arial"><strong>Core1Wait()</strong> ... èekání
|
||
na ukonèení funkce v jádru 1.</font></p>
|
||
|
||
<h2><a name="mode"></a><font face="Arial">Nastavení módu obsahu
|
||
displeje</font></h2>
|
||
|
||
<p><font face="Arial">Pøi zobrazení obrazu je pro knihovnu
|
||
výchozí ukazatel <strong>pScreen</strong>. Ukazuje na strukturu
|
||
sScreen, která popisuje obsah displeje. Raspberry Pico má
|
||
omezenou velikost pamìti RAM a nemùže pojmout obraz ve velkém
|
||
rozlišení. Proto je nutné obraz skládat z menších segmentù
|
||
tak, aby se minimalizovaly èásti nároèné na pamì<6D>.</font></p>
|
||
|
||
<p><font face="Arial"><em>Poznámka:</em> Následující popisy
|
||
formátu obrazu se týkají pouze základní obrazové vrstvy 0.
|
||
Ta jediná mùže obsahovat segmenty v rùzném formátu.
|
||
Pøekryvné vrstvy 1 až 3 jsou na formátu základní vrstvy
|
||
nezávislé, sdílejí s ní jen celkovou plochu displeje, ale
|
||
používají svùj vlastní formát obrazu.</font></p>
|
||
|
||
<p><font face="Arial"><strong>ScreenClear(sScreen* s)</strong>
|
||
... Vynuluje struktury popisovaèe displeje, èímž provede
|
||
vymazání displeje. Tuto funkci je vhodné zavolat vždy na
|
||
zaèátku vytváøení nové definice obsahu obrazovky
|
||
(inicializace segmentù).</font></p>
|
||
|
||
<p><font face="Arial"><strong>sStrip* ScreenAddStrip(sScreen* s,
|
||
int height)</strong> ... Funkce pøidá na konec definice
|
||
obrazovky nový horizontální pruh o zadané výšce poètu
|
||
videolinek. Maximální poèet pruhù je urèen konstantou
|
||
STRIPMAX (implicitnì 8) v souboru vga_config.h. Bez pøidaných
|
||
segmentù je pruh prázdný (èerný).</font></p>
|
||
|
||
<p><font face="Arial"><strong>sSegm* ScreenAddSegm(sStrip* strip,
|
||
int width)</strong> ... Funkce pøidá na konec pruhu nový
|
||
obrazový segment o zadané šíøce. Segment bude obsahovat
|
||
jeden formát obrazu. U naprosté vìtšiny formátù musí být
|
||
šíøka násobkem 4 (násobek 4 pixelù).</font></p>
|
||
|
||
<p><font face="Arial">Následují funkce pro nastavení
|
||
konkrétního formátu obrazového segmentu. Definici segmentu
|
||
sSegm naleznete ve vga_screen.h. Jsou zde i nìkteré parametry,
|
||
které nejsou funkcemi øízeny: offx urèuje horizontální
|
||
posun obrazu (horizontální skrolování). U naprosté vìtšiny
|
||
formátù musí být horizontální skrolování v násobcích 4.
|
||
Parametr offy urèuje vertikální skrolování. To lze
|
||
provádìt jemnì po linkách. Porametr wrapx urèuje
|
||
zarovnání, po kterém se obsah bufferu opakuje. Je tak možné
|
||
napø. zobrazit obrázek dlaždicovì nebo naopak vytvoøit
|
||
virtuální obrazovku vìtší než displej. Tento parametr musí
|
||
být opìt násobkem 4. Podobnì parametr wrapy urèuje
|
||
vertikální opakování obrazu. Parametr dbly zdvojí
|
||
vertikální linky. To lze použít u obrazu s malým
|
||
horizontálním rozlišením.</font></p>
|
||
|
||
<p><font face="Arial">Parametr 'wb' funkcí udává délku linky
|
||
v bajtech. Parametr 'data' je ukazatel na frame buffer s
|
||
grafickými daty. Parametr 'font', u funkcí pro text, je
|
||
ukazatel na font. Font je 1-bitový mono obrázek s 256 znaky na
|
||
øádek. Každý znak je široký 8 pixelù, délka linky tedy je
|
||
2048 pixelù (256 bajtù). Vertikálnì mùže mít font
|
||
libovolný rozmìr - výšku fontu udává parametr 'fontheight'.
|
||
Seznam fontù, které jsou k dispozici, naleznete ve složce
|
||
_picovga\font.</font></p>
|
||
|
||
<p><font face="Arial"><strong>ScreenSegmColor(sSegm* segm, u32
|
||
col1, u32 col2)</strong> ... Segment bude vyplnìn barvou
|
||
(GF_COLOR). Parametry col1 a col2 pøedstavují barvy 4 pixelù
|
||
pro sudou a lichou linku. Segment tak mùže namísto spojité
|
||
barvy obsahovat barevný rastr. K slouèení barev 4 pixelù lze
|
||
použít makro MULTICOL.</font></p>
|
||
|
||
<p><font face="Arial"><strong>ScreenSegmGrad1(sSegm* segm, const
|
||
void* data, int wb)</strong> ... Segment bude vyplnìn barevným
|
||
gradientem (GF_GRAD1). Gradientem je 1 linka 8-bitových pixelù.
|
||
Gradientem lze horizontálnì posouvat parametrem offx.</font></p>
|
||
|
||
<p><font face="Arial"><strong>ScreenSegmGrad2(sSegm* segm, const
|
||
void* data, int wb)</strong> ... Gradient se 2 linkami, sudá a
|
||
lichá (GF_GRAD2).</font></p>
|
||
|
||
<p><font face="Arial"><strong>ScreenSegmGraph8(sSegm* segm, const
|
||
void* data, int wb)</strong> ... 8-bitová grafika 256 barev
|
||
(GF_GRAPH8). Každý pixel je 1 bajt. Tento mód patøí k
|
||
nejrychlejším, data se z frame bufferu jednoduše posílají do
|
||
PIO øadièe pomocí DMA pøenosu. Ovšem také k
|
||
nejnároènìjším na pamì<6D>. Reálnì se do pamìti vejde
|
||
obraz o rozlišení maximálnì 512x400 pixelù (EGA videomód).</font></p>
|
||
|
||
<p><font face="Arial"><strong>ScreenSegmGraph4(sSegm* segm, const
|
||
void* data, const void* trans, int wb)</strong> ... 4-bitová
|
||
paletová grafika 16 barev (GF_GRAPH4). V 1 bajtu jsou 2 pixely
|
||
(první pixel je ve vyšších 4 bitech bajtu). Funkce vyžaduje
|
||
pøekladovou tabulku palet, která se vygeneruje následující
|
||
funkcí:</font></p>
|
||
|
||
<p><font face="Arial"><strong>GenPal16Trans(u16* trans, const u8*
|
||
pal)</strong> ... Vygenerování pøekladové tabulky palet pro
|
||
funkci ScreenSegmGraph4. Pøekladová tabulka je 256 položek o
|
||
rozmìru 16 bitù, v pamìti tedy zabere 512 bajtù. Tabulka je
|
||
použita bìhem zobrazení k interním úèelùm, musí být
|
||
zarovnána na 4 bajty a musí být k dispozici po celou dobu
|
||
zobrazování segmentu. Vstupem funkce je tabulka palet, což je
|
||
16 položek barev o rozmìru 1 bajt.</font></p>
|
||
|
||
<p><font face="Arial"><strong>ScreenSegmGraph2(sSegm* segm, const
|
||
void* data, const void* trans, int wb)</strong> ... 2-bitová
|
||
paletová grafika 4 barvy (GF_GRAPH2). V 1 bajtu jsou 4 pixely
|
||
(první pixel v nejvyšších 2 bitech). Funkce vyžaduje
|
||
pøekladovou tabulku palet, která se vygeneruje následující
|
||
funkcí:</font></p>
|
||
|
||
<p><font face="Arial"><strong>GenPal4Trans(u32* trans, const u8*
|
||
pal)</strong> ... Vygenerování pøekladové tabulky palet pro
|
||
funkci ScreenSegmGraph2. Pøekladová tabulka je 256 položek o
|
||
rozmìru 32 bitù, v pamìti tedy zabere 1024 bajtù. Tabulka je
|
||
použita bìhem zobrazení k interním úèelùm, musí být
|
||
zarovnána na 4 bajty a musí být k dispozici po celou dobu
|
||
zobrazování segmentu. Vstupem funkce je tabulka palet, což
|
||
jsou 4 položky barev o rozmìru 1 bajt.</font></p>
|
||
|
||
<p><font face="Arial"><strong>ScreenSegmGraph1(sSegm* segm, const
|
||
void* data, u8 bg, u8 fg, int wb)</strong> ... 1-bitová mono
|
||
grafika 2 barvy (GF_GRAPH1). V 1 bajtu je 8 pixelù (první pixel
|
||
v nejvyšším bitu). Funkce vyžaduje barvu pozadí bg a
|
||
popøedí fg.</font></p>
|
||
|
||
<p><font face="Arial"><strong>ScreenSegmMText(sSegm* segm, const
|
||
void* data, const void* font, u16 fontheight, u8 bg, u8 fg, int
|
||
wb)</strong> ... Mono text (GF_MTEXT). U mono textu je barva
|
||
popøedí a pozadí platná pro celý segment. V obrazové
|
||
pamìti jsou jednotlivé znaky, 1 bajt je jeden znak.</font></p>
|
||
|
||
<p><font face="Arial"><strong>ScreenSegmAText(sSegm* segm, const
|
||
void* data, const void* font, u16 fontheight, const void* pal,
|
||
int wb)</strong> ... Atributový text (GF_ATEXT). U atributového
|
||
textu pøedstavuje každý znak dvojice bajtù. První bajt je
|
||
ASCII hodnota znaku, druhý bajt je barevný atribut. Vyšší 4
|
||
bity atributu pøedstavují barvu pozadí, nižší 4 bity
|
||
atributu je barva popøedí. Barvy se pøekládají z tabulky
|
||
palet o 16 barvách.</font></p>
|
||
|
||
<p><font face="Arial"><strong>ScreenSegmFText(sSegm* segm, const
|
||
void* data, const void* font, u16 fontheight, u8 bg, int wb)</strong>
|
||
... Text s barvou popøedí (GF_FTEXT). U textu s popøedím
|
||
pøedstavuje každý znak dvojice bajtù. První bajt je ASCII
|
||
hodnota znaku, druhý bajt je barva popøedí. Barva pozadí je
|
||
spoleèná, udává ji parametr 'bg'. Za zmínku stojí, že
|
||
implicitní fonty knihovny obsahují ve vyšší polovinì fontù
|
||
(bit 7 nastaven) invertovanou nižší polovinu fontu - tím lze
|
||
zajistit znak s volitelnou barvou pozadí.</font></p>
|
||
|
||
<p><font face="Arial"><strong>ScreenSegmCText(sSegm* segm, const
|
||
void* data, const void* font, u16 fontheight, int wb)</strong>
|
||
... Text s barvou (GF_CTEXT). U textu s barvou zabírá každý
|
||
znak 3 bajty. První bajt je ASCII hodnota znaku, druhý bajt je
|
||
barva pozadí a tøetí bajt je barva popøedí.</font></p>
|
||
|
||
<p><font face="Arial"><strong>ScreenSegmGText(sSegm* segm, const
|
||
void* data, const void* font, u8 fontheight, u8 bg, const void*
|
||
grad, int wb)</strong> ... Text s gradientem (GF_GTEXT). V tomto
|
||
módu je každý znak zastoupen 1 bajtem v pamìti a barva
|
||
pozadí je urèena paramtrem 'bg', podobnì jako u mono textu.
|
||
Namísto barvy popøedí je zde parametr 'grad', což je ukazatel
|
||
na gradient barev o délce rovnající se grafické délce
|
||
øádku textu (napø. pro 40 znakù má gradient 320 bajtù). Z
|
||
tabulky gradientu je pøevzata barva popøedí pro každý pixel
|
||
znaku.</font></p>
|
||
|
||
<p><font face="Arial"><strong>ScreenSegmDText(sSegm* segm, const
|
||
void* data, const void* font, u8 fontheight, u8 bg, const void*
|
||
grad, int wb)</strong> ... Text s dvojitým gradientem
|
||
(GF_DTEXT). Funkce je totožná s pøedcházející funkcí s
|
||
tím rozdílem, že každý pixel znaku se generuje jako 2 pixely
|
||
obrazu. Tedy znak má dvojnásobnou šíøku. Je to jediný
|
||
textový mód umožòující zobrazení znakù s dvojnásobnou
|
||
šíøkou. Gradient barev zde funguje obdobnì, avšaj 1 bajt
|
||
gradientu pøedstavuje 1 pixel znaku (jako u pøedešlé funkce),
|
||
ne 1 zobrazený pixel. Tedy øádek 40 znakù vyžaduje opìt
|
||
gradient 320 bajtù.</font></p>
|
||
|
||
<p><font face="Arial"><strong>ScreenSegmTile(sSegm* segm, const
|
||
void* data, const void* tiles, int w, int h, int wb)</strong> ...
|
||
Dlaždice ve sloupci (GF_TILE). Dlaždice jsou obrazové segmenty
|
||
o zadaném rozmìru (šíøka a výška dlaždice je 'w' a 'h').
|
||
Vzory dlaždic jsou uspoøádané do jednoho obrazu. V tomto
|
||
pøípadì do sloupce o šíøce 1 dlaždice. Parametr 'tiles' je
|
||
ukazatel na obraz sloupce dlaždic. Parametr 'data' je ukazatel
|
||
na pole bajtù, kde každý bajt pøedstavuje zobrazené èíslo
|
||
dlaždice. Dlaždic tedy mùže být maximálnì 256. Parametr
|
||
'wb' se vztahuje k délce øádku pole indexù (ne k délce
|
||
obrazu s dlaždicemi). Šíøka dlaždice musí být násobek 4,
|
||
nejménì 8. Dlaždice umožòují efektivní zobrazení
|
||
obrazové informace, tím že se obraz mùže opakovat. Lze tak
|
||
dosáhnout velkého rozlišení obrazu s malými nároky na
|
||
pamì<EFBFBD>.</font></p>
|
||
|
||
<p><font face="Arial"><strong>ScreenSegmTile2(sSegm* segm, const
|
||
void* data, const void* tiles, int w, int h, int tilewb, int wb)</strong>
|
||
... Dlaždice v øádku (GF_TILE2). Funkce je alternativou k
|
||
pøedešlé funkci s tím rozdílem, že vzory dlaždic jsou v
|
||
obraze uspoøádány do jednoho øádku. To mùže být
|
||
pohodlnìjší pøi vytváøení obrazu dlaždic, ovšem je
|
||
nutné navíc zadat parametr 'tilewb' pøedstavující délku
|
||
linky obrazu dlaždic. Obvykle tilewb = poèet dlaždic *
|
||
šíøka dlaždice.</font></p>
|
||
|
||
<p><font face="Arial"><strong>ScreenSegmLevel(sSegm* segm, const
|
||
void* data, u8 bg, u8 fg, u8 zero)</strong> ... Segment
|
||
zobrazení úrovnì (GF_LEVEL). Segment slouží k zobrazení
|
||
grafù. Vstupem je pole bajtù 'data' o délce odpovídající
|
||
šíøce pole v pixelech. Hodnota bajtu pøedstavuje výšku
|
||
grafu na dané souøadnici X. Displej zobrazí barvu popøedí
|
||
nebo pozadí podle toho, zda zobrazený pixel leží nad hodnotou
|
||
z pole dat nebo pod. Parametr 'zero' udává výšku referenèní
|
||
nuly. Nula neznamená negativní èísla v datech, èísla jsou
|
||
stále udaná jako bezznaménková (s nulou na spodním okraji).
|
||
Od referenèní nuly se zamìní barva pozadí a popøedí. To
|
||
má za následek, že graf vypadá vizuálnì symetrický kolem
|
||
referenèní nuly. Vzhled segmentu mùžete vidìt v ukázkovém
|
||
programu Oscilloscope (dolní køivka).</font></p>
|
||
|
||
<p><font face="Arial"><strong>ScreenSegmLevelGrad(sSegm* segm,
|
||
const void* data, const void* sample1, const void* sample2)</strong>
|
||
... Segment zobrazení úrovnì s gradientem (GF_LEVELGRAD).
|
||
Segment slouží k zobazení grafù, podobnì jako pøedešlá
|
||
funkce. Liší se tím, že barva se udává jako vertikální
|
||
gradient o výšce odpovídající výšce segmentu. Leží-li
|
||
pixel pod hodnotou dat, použije se barva z prvního gradientu.
|
||
Jinak se použije druhý gradient. Pøíklad využití lze vidìt
|
||
v ukázkovém programu Level Meter, k zobrazení spektra.</font></p>
|
||
|
||
<p><font face="Arial"><strong>ScreenSegmOscil(sSegm* segm, const
|
||
void* data, u8 bg, u8 fg, int pixh)</strong> ... Segment
|
||
zobrazení køivky osciloskopu (GF_OSCIL). Segment se funkcí
|
||
podobá segmentu pro zobrazení úrovnì. Liší se tím, že
|
||
køivka se zobrazí jako èára o tlouštce 'pixh' pixelù. Tato
|
||
funkce už je nároènìjší a nemusí být schopna stihnout
|
||
obsloužit celou šíøku obrazu.</font></p>
|
||
|
||
<p><font face="Arial"><strong>ScreenSegmOscLine(sSegm* segm,
|
||
const void* data, u8 bg, u8 fg)</strong> ... Segment spojité
|
||
køivky osciloskopu (GF_OSCLINE). Køivka se zobrazí jako
|
||
spojitá èára o tlouš<75>ce 1 pixel. Tento mód je již velmi
|
||
nároèný na vykreslení a je proto urychlen snížením
|
||
horizontálního rozlišení na polovinu (vykresluje body
|
||
široké 2 pixely).</font></p>
|
||
|
||
<p><font face="Arial"><strong>ScreenSegmPlane2(sSegm* segm, const
|
||
void* data, int plane, const void* trans, int wb)</strong> ...
|
||
2-bitová paletová grafika 4 barvy ve 2 rovinách (GF_PLANE2).
|
||
Mód se funkcí podobá grafickému módu 2-bitových barev,
|
||
avšak jednotlivé bity pixelù jsou uloženy do 2 samostatných
|
||
barevných rovin. Tento režim se podobá CGA grafickému módu
|
||
poèítaèù PC. Jednotlivé roviny odpovídají dvìma
|
||
samostatným monochromatickým grafickým módùm. Každý bajt
|
||
roviny obsahuje 8 pixelù (první pixel v nejvyšším bitu).
|
||
Parametr 'plane' je relativní offset druhé roviny od první
|
||
roviny, udané parametrem 'data'. Funkce vyžaduje pøekladovou
|
||
tabulku palet, která se vygeneruje následující funkcí:</font></p>
|
||
|
||
<p><font face="Arial"><strong>GenPal4Plane(u32* trans, const u8*
|
||
pal)</strong> ... Vygenerování pøekladové tabulky palet pro
|
||
funkci ScreenSegmPlane2. Pøekladová tabulka je 256 položek o
|
||
rozmìru 32 bitù, v pamìti tedy zabere 1024 bajtù. Tabulka je
|
||
použita bìhem zobrazení k interním úèelùm, musí být
|
||
zarovnána na 4 bajty a musí být k dispozici po celou dobu
|
||
zobrazování segmentu. Vstupem funkce je tabulka palet, což
|
||
jsou 4 položky barev o rozmìru 1 bajt.</font></p>
|
||
|
||
<p><font face="Arial">V utilitách knihovny PicoVGA není sice k
|
||
dispozici program, který pøipraví obrázek v módu 2 rovin,
|
||
ale k dispozici je interní funkce <strong>Plane2Conv</strong>,
|
||
která zkonvertuje obrázek v 4 barvách na mód se 2 rovinami.
|
||
Tedy obrázek se k programu pøipojí jako 4-barevný, a k
|
||
pøípravì kopie v RAM se použije konverzní funkce.</font></p>
|
||
|
||
<p><font face="Arial"><strong>ScreenSegmAttrib8(sSegm* segm,
|
||
const void* data, const void* attr, const u8* pal, int wb)</strong>
|
||
... Grafický mód s atributy (GF_ATTRIB8). Tento mód je známý
|
||
z poèítaèù ZX Spectrum. Parametr 'data' je ukazatel na data
|
||
pixelù. Odpovídá to monochromatickému módu zobrazení, kdy
|
||
každý bit rozliší, zda se použije barva popøedí nebo
|
||
pozadí. Parametr 'attr' je ukazatel na pole atributù barev.
|
||
Atribut barvy je bajt, kde nižší 4 bity pøedstavují barvu
|
||
popøedí a horní 4 bity barvu pozadí. Atribut se zkonvertuje
|
||
na barevný pixel pomocí tabulky palet 'pal', což je pole 16
|
||
bajtù barev. Každý atribut urèuje barvy popøedí a pozadí
|
||
pro skupinku 8 x 8 pixelù. Na každých 8 bajtù pixelù tedy
|
||
pøipadá 1 bajt atributù barev. Parametr 'wb' zde udává
|
||
šíøku linky v bajtech jak pro pole pixelù, tak pro pole
|
||
atributù. Rozdíl je v tom, že adresa v poli atributù se
|
||
neinkrementuje po každé lince, ale po 8 linkách.</font></p>
|
||
|
||
<p><font face="Arial">V utilitách knihovny PicoVGA není sice k
|
||
dispozici program, který pøipraví obrázek v módu atributù,
|
||
ale k dispozici je interní funkce <strong>Attr8Conv</strong>,
|
||
která zkonvertuje obrázek v 16 barvách na mód s atributy.
|
||
Tedy obrázek se k programu pøipojí jako 16-barevný, a k
|
||
pøípravì kopie v RAM se použije konverzní funkce.</font></p>
|
||
|
||
<p><font face="Arial"><strong>ScreenSegmProgress(sSegm* segm,
|
||
const void* data, const void* sample1, const void* sample2)</strong>
|
||
... Progress indikátor (GF_PROGRESS). Progress indikátor je
|
||
horizontální ukazatel. Parametr 'data' je pole bajtù o délce
|
||
odpovídající výšce segmentu. Hodnota bajtu udává délku
|
||
linky v násobcích 4 pixelù. Tedy hodnota 0 až 255
|
||
pøedstavuje délku indikátoru 0 až 1020 pixelù. V první
|
||
èásti indikátoru (< data) se zobrazí barevný gradient
|
||
'sample1', pro druhou èást (>= data) se zobrazí 'sample2'.</font></p>
|
||
|
||
<p><font face="Arial"><strong>ScreenSegmGraph8Mat(sSegm* segm,
|
||
const void* data, const int* mat, u16 xbits, u16 ybits)</strong>
|
||
... 8-bitová grafika s 2D maticovou transformací. Tento segment
|
||
zobrazí 8-bitový obraz s transformacemi - otoèení, zmìna
|
||
mìøítka, zešikmení a posun. Obraz musí mít šíøku a
|
||
výšku jako mocnina 2. Šíøka a výška obrazu se zadává
|
||
pomocí parametrù xbits a ybits jako poèet bitù rozmìru.
|
||
Napø. pro obraz 512 x 256 pixelù je xbits = 9, ybits = 8.
|
||
Parametr 'mat' je ukazatel na pole 6 integer parametrù
|
||
transformaèní matice - viz sekce </font><a href="#matrix"><font
|
||
face="Arial">Transformaèní matice</font></a><font face="Arial">.
|
||
Segment nepodporuje parametry pro posun a wrapování obrazu,
|
||
musí se ponechat na implicitních hodnotách.</font></p>
|
||
|
||
<p><font face="Arial"><strong>ScreenSegmGraph8Persp(sSegm* segm,
|
||
const void* data, const int* mat, u16 xbits, u16 ybits, u16
|
||
horiz)</strong> ... 8-bitová grafika s 3D perspektivou. Segment
|
||
je podobný pøedešlému segmentu, jen navíc na obraz uplatní
|
||
perspektivní deformaci. Je vhodný na zobrazení terénu (SNES
|
||
mód 7). Parametr 'horiz' udává posun horizontu nad hranici
|
||
segmentu, tedy stupeò zešikmení perspektivy.</font></p>
|
||
|
||
<p><font face="Arial"><strong>ScreenSegmTilePersp(sSegm* segm,
|
||
const u8* map, const u8* tiles, const int* mat, u8 mapwbits, u8
|
||
maphbits, u8 tilebits, s8 horizon)</strong> ... Dlaždicová
|
||
grafika s 3D perspektivou. Slouží podobnì jako pøedešlá
|
||
funkce k zobrazení terénu s 3D projekcí. Namísto 8-bitové
|
||
grafiky používá definici dlaždic. To umožòuje zobrazení
|
||
velmi rozsáhlých terénù. Parametr 'map' je ukazatel na mapu
|
||
dlaždic - indexy dlaždic 0 až 255. Šíøka a výška mapy
|
||
musí být mocnina 2 a zadávají se jako poèet bitù mapwbits a
|
||
maphbits. Dlaždice musí mít ètvercový rozmìr, který musí
|
||
být také jako mocnina 2. Rozmìr dlaždic se udává parametrem
|
||
tilebits jako poèet bitù rozmìru. Parametr 'tiles' je ukazatel
|
||
na obraz se vzorem dlaždic, uspoøádaných do 1 sloupce
|
||
dlaždic. Parametr 'horizon' udává posun horizontu nad hranici
|
||
segmentu / 4. Kladné èíslo pøedstavuje posun horizontu, pøi
|
||
záporném èísle se perspektiva otoèí (lze použít k
|
||
zobrazení oblohy). Nulová hodnota perspektivu vypne - v tom
|
||
pøípadì se funkce podobá funkci pro zobrazení obrazu s
|
||
transformaèní maticí (s polem dlaždic lze rotovat, zešikmit
|
||
atd).</font></p>
|
||
|
||
<p><font face="Arial"><strong>ScreenSegmTilePersp15(sSegm* segm,
|
||
const u8* map, const u8* tiles, const int* mat, u8 mapwbits, u8
|
||
maphbits, u8 tilebits, s8 horizon)</strong> ... Podobná funkce,
|
||
ale pixely se vykreslují o šíøce 1.5 pixelu. Funkci lze
|
||
využít pokud pøedešlá funkce nestíhá renderování.</font></p>
|
||
|
||
<p><font face="Arial"><strong>ScreenSegmTilePersp2(sSegm* segm,
|
||
const u8* map, const u8* tiles, const int* mat, u8 mapwbits, u8
|
||
maphbits, u8 tilebits, s8 horizon)</strong> ... Podobná funkce,
|
||
ale pixely se vykreslují o šíøce 2 pixelù. Funkci lze
|
||
využít pokud pøedešlá funkce nestíhá renderování.</font></p>
|
||
|
||
<p><font face="Arial"><strong>ScreenSegmTilePersp3(sSegm* segm,
|
||
const u8* map, const u8* tiles, const int* mat, u8 mapwbits, u8
|
||
maphbits, u8 tilebits, s8 horizon)</strong> ... Podobná funkce,
|
||
ale pixely se vykreslují o šíøce 3 pixelù. Funkci lze
|
||
využít pokud pøedešlá funkce nestíhá renderování.</font></p>
|
||
|
||
<p><font face="Arial"><strong>ScreenSegmTilePersp4(sSegm* segm,
|
||
const u8* map, const u8* tiles, const int* mat, u8 mapwbits, u8
|
||
maphbits, u8 tilebits, s8 horizon)</strong> ... Podobná funkce,
|
||
ale pixely se vykreslují o šíøce 4 pixelù. Funkci lze
|
||
využít pokud pøedešlá funkce nestíhá renderování.</font></p>
|
||
|
||
<h2><a name="layers"></a><font face="Arial">Pøekryvné vrstvy</font></h2>
|
||
|
||
<p><font face="Arial">Zobrazení obrazu knihovnou PicoVGA se
|
||
provádí pomocí øadièe PIO procesoru. Používá se PIO0.
|
||
Druhý øadiè, PIO1, je nepoužitý a lze využít k jiným
|
||
úèelùm. PIO0 obsahuje 4 state machine, SM0 až SM3. Všechny
|
||
state machine PIO0 používají spoleèný program o velikosti 32
|
||
instrukcí. Každý state machine obsluhuje 1 pøekryvnou vrstvu.
|
||
SM0 obsluhuje základní vrstvu 0, spolu s obsluhou
|
||
synchronizaèního signálu. Program pro obsluhu základní
|
||
vrstvy tvoøí 15 instrukcí, poèínaje offsetem 17. Tato èást
|
||
programu je nemìnná a používá se vždy. Ostatní 3 vrstvy, 1
|
||
až 3, SM1 až SM3, používají druhou èást programové
|
||
pamìti, 17 instrukcí od adresy 0. Tato èást se mùže mìnit,
|
||
podle módu pøekryvných vrstev. Všechny 3 pøekryvné vrstvy
|
||
používají spoleèný program a musí proto pracovat ve
|
||
stejném módu zobrazení. Nìkteré módy pøekryvných vrstev
|
||
používají stejný program a mohou být sdíleny - blíže v
|
||
tabulce níže.</font></p>
|
||
|
||
<p><font face="Arial"><em>Poznámka:</em> Pouze základní vrstva
|
||
0 mùže obsahovat segmenty v rùzném formátu. Pøekryvné
|
||
vrstvy 1 až 3 jsou na formátu základní vrstvy nezávislé,
|
||
sdílejí s ní jen celkovou plochu displeje, ale používají
|
||
svùj vlastní formát obrazu, u kterého se udává pouze
|
||
souøadnice a rozmìr.</font></p>
|
||
|
||
<p><font face="Arial"><u>Pøekryvné vrstvy mohou použít jeden
|
||
z následujících programù:</u></font></p>
|
||
|
||
<p><font face="Arial"><strong>LAYERPROG_BASE</strong> ... je
|
||
oznaèení programu základní vrstvy 0. Nelze použít pro
|
||
pøekryvné vrstvy. Použití parametru u pøekryvné vrstvy
|
||
znamená, že vrstva je neaktivní (nepoužívá program).</font></p>
|
||
|
||
<p><font face="Arial"><strong>LAYERPROG_KEY</strong> ... vrstva s
|
||
klíèovou barvou. Zadaná barva je nahrazena prùhledností.</font></p>
|
||
|
||
<p><font face="Arial"><strong>LAYERPROG_BLACK</strong> ...
|
||
prùhlednost s èernou barvou. Èerná barva je nahrazena
|
||
prùhledností. Oproti pøedešlému módu je výhoda menší
|
||
nároènosti na rychlost procesoru.</font></p>
|
||
|
||
<p><font face="Arial"><strong>LAYERPROG_WHITE</strong> ...
|
||
prùhlednost s bílou barvou. Je rychlejší podobnì jako
|
||
pøedešlá funkce a je vhodné použít tam, kde je potøeba
|
||
zachovat èernou barvu, ale mùže se oželet bílá barva. Pøi
|
||
pøípravì obrazu se obraz nekopíruje z Flash do RAM funkcí
|
||
memcpy, ale použije se funkce <strong>CopyWhiteImg</strong>.
|
||
Funkce zajistí, že pixely kopírovaného obrázku se
|
||
inkrementují o 1. Tím se zmìní bílá barva (s hodnotou 255)
|
||
na èernou barvu (s hodnotou 0). Od této chvíle se s obrázkem
|
||
pracuje jako by mìl prùhlednost s èernou barvou - napø. se
|
||
udává èerná barva pro funkci vykreslení sprajtù. Teprve až
|
||
se obrázek dostane do programu v PIO0, program pixel
|
||
zprùhlední stejnì jako v pøípadì èerné barvy, ale
|
||
souèasnì hodnotu pixelu dekrementuje. Tím se barvy vrátí
|
||
zpìt k pùvodní hodnotì, èerná barva se stane èernou a
|
||
bílá barva byla použita jako prùhlednost.</font></p>
|
||
|
||
<p><font face="Arial"><strong>LAYERPROG_MONO</strong> ... Tento
|
||
program v sobì zahrnuje 2 podprogramy. Prvním je zobrazení
|
||
monochromatického obrazu. Pro každý bit obrazových dat se
|
||
buï zobrazí zvolená barva obrazu nebo pøíslušný pixel bude
|
||
prùhledný. Tento mód je použit v pøíkladu Oscilloscope k
|
||
zobrazení møížky pøes obrazovku osciloskopu. Druhým
|
||
podprogramem je zobrazení barevného obrazu bez prùhlednosti.
|
||
Pixely barev se zobrazují tak jak jsou, bez možnosti
|
||
prùhlednosti, ale lze definovat rozmìry obdélníku obrazu a
|
||
jeho souøadnici na displeji. Tedy jakási obdoba jednoho
|
||
obdélníkového sprajtu bez prùhlednosti.</font></p>
|
||
|
||
<p><font face="Arial"><strong>LAYERPROG_RLE</strong> ... Mód RLE
|
||
komprese. RLE komprese není nìjaký obecnì platný formát.
|
||
Znamená, že data obsahují informace o délce segmentu. V tomto
|
||
pøípadì knihovny PicoVGA obsahují obrazová data pøímo
|
||
instrukce pro PIO program. Pøesnìji - data obrazu jsou
|
||
prokládána adresami skokù uvnitø programu. Obraz je
|
||
pøipraven pomocí programu <strong>RaspPicoRle</strong> a je
|
||
silnì vázaný na použitý program vrstvy. Pokud by se napø.
|
||
posunuly instrukce v programu, formát RLE komprese by pøestal
|
||
fungovat. To je také dùvod, proè program pro základní vrstvu
|
||
0 je umístìn na konci programové pamìti a programy
|
||
pøekryvných vrstvev na zaèátku - aby se snížila šance, že
|
||
pøi zmìnách v programu se zmìní umístìní programu v
|
||
pamìti, kdy by RLE komprese pøestala fungovat. Po úpravì RLE
|
||
programu v PIO je nutné aktualizovat i konverzní program.</font></p>
|
||
|
||
<p><font face="Arial">V definici videomódu pomocí funkce VgaCfg
|
||
se zadává požadovaný mód každé pøekryvné vrstvy. Z módu
|
||
vrstvy se odvozuje použitý program a funkce pro obsluhu
|
||
vykreslení vrstvy. Více módù vrstvy mùže sdílet shodný
|
||
typ programu. Módy vrstev mají rùzné požadavky na
|
||
èasování state machine. Konfiguraèní funkce to zohlední a
|
||
pøizpùsobí tomu frekvenci procesoru.</font></p>
|
||
|
||
<p><font face="Arial"><u>Módy pøekryvných vrstev:</u></font></p>
|
||
|
||
<p><font face="Arial">Módy *WHITE, používající bílou
|
||
prùhlednou barvu, vyžadují pøípravu obrazu pomocí funkce
|
||
CopyWhiteImg, jak je uvedeno u programu LAYERPROG_WHITE.</font></p>
|
||
|
||
<p><font face="Arial"><strong>LAYERMODE_BASE</strong> ...
|
||
Oznaèuje mód základní vrstvy 0. Pro pøekryvnou vrstvu nelze
|
||
použít, ale používá se k oznaèení neaktivní vypnuté
|
||
pøekryvné vrstvy.</font></p>
|
||
|
||
<p><font face="Arial"><strong>LAYERMODE_KEY</strong> ... Vrstva
|
||
se zadanou klíèovou barvou.</font></p>
|
||
|
||
<p><font face="Arial"><strong>LAYERMODE_BLACK</strong> ... Vrstva
|
||
s èernou klíèovou barvou.</font></p>
|
||
|
||
<p><font face="Arial"><strong>LAYERMODE_WHITE</strong> ... Vrstva
|
||
s bílou klíèovou barvou.</font></p>
|
||
|
||
<p><font face="Arial"><strong>LAYERMODE_MONO</strong> ...
|
||
Monochormatický obraz.</font></p>
|
||
|
||
<p><font face="Arial"><strong>LAYERMODE_COLOR</strong> ...
|
||
Barevný obraz (bez prùhlednosti).</font></p>
|
||
|
||
<p><font face="Arial"><strong>LAYERMODE_RLE</strong> ... Obraz s
|
||
RLE kompresí.</font></p>
|
||
|
||
<p><font face="Arial"><strong>LAYERMODE_SPRITEKEY</strong> ...
|
||
Sprajty se zadanou klíèovou barvou.</font></p>
|
||
|
||
<p><font face="Arial"><strong>LAYERMODE_SPRITEBLACK</strong> ...
|
||
Sprajty s èernou klíèovou barvou.</font></p>
|
||
|
||
<p><font face="Arial"><strong>LAYERMODE_SPRITEWHITE</strong> ...
|
||
Sprajty s bílou klíèovou barvou.</font></p>
|
||
|
||
<p><font face="Arial"><strong>LAYERMODE_FASTSPRITEKEY</strong>
|
||
... Rychlé sprajty se zadanou klíèovou barvou.</font></p>
|
||
|
||
<p><font face="Arial"><strong>LAYERMODE_FASTSPRITEBLACK</strong>
|
||
... Rychlé sprajty s èernou klíèovou barvou.</font></p>
|
||
|
||
<p><font face="Arial"><strong>LAYERMODE_FASTSPRITEWHITE</strong>
|
||
... Rychlé sprajty s bílou klíèovou barvou.</font></p>
|
||
|
||
<p><font face="Arial"><strong>LAYERMODE_PERSPKEY</strong> ...
|
||
Obraz s transformaèní maticí se zadanou klíèovou barvou.</font></p>
|
||
|
||
<p><font face="Arial"><strong>LAYERMODE_PERSPBLACK</strong> ...
|
||
Obraz s transformaèní maticí s èernou klíèovou barvou.</font></p>
|
||
|
||
<p><font face="Arial"><strong>LAYERMODE_PERSPWHITE</strong> ...
|
||
Obraz s transformaèní maticí s bílou klíèovou barvou.</font></p>
|
||
|
||
<p><font face="Arial"><strong>LAYERMODE_PERSP2KEY</strong> ...
|
||
Obraz s transformaèní maticí se zadanou klíèovou barvou a
|
||
zdvojenou šíøkou.</font></p>
|
||
|
||
<p><font face="Arial"><strong>LAYERMODE_PERSP2BLACK</strong> ...
|
||
Obraz s transformaèní maticí s èernou klíèovou barvou a
|
||
zdvojenou šíøkou.</font></p>
|
||
|
||
<p><font face="Arial"><strong>LAYERMODE_PERSP2WHITE</strong> ...
|
||
Obraz s transformaèní maticí s bílou barvou a zdvojenou
|
||
šíøkou.</font></p>
|
||
|
||
<p><font face="Arial"><u>Sdílené módy pøekryvných vrstev:</u></font></p>
|
||
|
||
<p><font face="Arial">Módy vrstev lze spolu kombinovat jen pokud
|
||
používají stejný program. CPP je minimální požadovaný
|
||
poèet taktù SMx na pixel.</font></p>
|
||
<div align="center"><center>
|
||
|
||
<table border="1">
|
||
<tr>
|
||
<td> </td>
|
||
<td align="center"><font face="Arial">PROG_BASE</font></td>
|
||
<td align="center"><font face="Arial">PROG_KEY</font></td>
|
||
<td align="center"><font face="Arial">PROG_BLACK</font></td>
|
||
<td align="center"><font face="Arial">PROG_WHITE</font></td>
|
||
<td align="center"><font face="Arial">PROG_MONO</font></td>
|
||
<td align="center"><font face="Arial">PROG_RLE</font></td>
|
||
<td align="center"><font face="Arial">CPP</font></td>
|
||
</tr>
|
||
<tr>
|
||
<td><font face="Arial">LAYERMODE_BASE</font></td>
|
||
<td align="center"><font face="Arial">x</font></td>
|
||
<td align="center"> </td>
|
||
<td align="center"> </td>
|
||
<td align="center"> </td>
|
||
<td align="center"> </td>
|
||
<td align="center"> </td>
|
||
<td align="center"><font face="Arial">2</font></td>
|
||
</tr>
|
||
<tr>
|
||
<td><font face="Arial">LAYERMODE_KEY</font></td>
|
||
<td align="center"> </td>
|
||
<td align="center"><font face="Arial">x</font></td>
|
||
<td align="center"> </td>
|
||
<td align="center"> </td>
|
||
<td align="center"> </td>
|
||
<td align="center"> </td>
|
||
<td align="center"><font face="Arial">6</font></td>
|
||
</tr>
|
||
<tr>
|
||
<td><font face="Arial">LAYERMODE_BLACK</font></td>
|
||
<td align="center"> </td>
|
||
<td align="center"> </td>
|
||
<td align="center"><font face="Arial">x</font></td>
|
||
<td align="center"> </td>
|
||
<td align="center"> </td>
|
||
<td align="center"> </td>
|
||
<td align="center"><font face="Arial">4</font></td>
|
||
</tr>
|
||
<tr>
|
||
<td><font face="Arial">LAYERMODE_WHITE</font></td>
|
||
<td align="center"> </td>
|
||
<td align="center"> </td>
|
||
<td align="center"> </td>
|
||
<td align="center"><font face="Arial">x</font></td>
|
||
<td align="center"> </td>
|
||
<td align="center"> </td>
|
||
<td align="center"><font face="Arial">4</font></td>
|
||
</tr>
|
||
<tr>
|
||
<td><font face="Arial">LAYERMODE_MONO</font></td>
|
||
<td align="center"> </td>
|
||
<td align="center"> </td>
|
||
<td align="center"> </td>
|
||
<td align="center"> </td>
|
||
<td align="center"><font face="Arial">x</font></td>
|
||
<td align="center"> </td>
|
||
<td align="center"><font face="Arial">4</font></td>
|
||
</tr>
|
||
<tr>
|
||
<td><font face="Arial">LAYERMODE_COLOR</font></td>
|
||
<td align="center"> </td>
|
||
<td align="center"> </td>
|
||
<td align="center"> </td>
|
||
<td align="center"> </td>
|
||
<td align="center"><font face="Arial">x</font></td>
|
||
<td align="center"> </td>
|
||
<td align="center"><font face="Arial">2</font></td>
|
||
</tr>
|
||
<tr>
|
||
<td><font face="Arial">LAYERMODE_RLE</font></td>
|
||
<td align="center"> </td>
|
||
<td align="center"> </td>
|
||
<td align="center"> </td>
|
||
<td align="center"> </td>
|
||
<td align="center"> </td>
|
||
<td align="center"><font face="Arial">x</font></td>
|
||
<td align="center"><font face="Arial">3</font></td>
|
||
</tr>
|
||
<tr>
|
||
<td><font face="Arial">LAYERMODE_SPRITEKEY</font></td>
|
||
<td align="center"> </td>
|
||
<td align="center"><font face="Arial">x</font></td>
|
||
<td align="center"> </td>
|
||
<td align="center"> </td>
|
||
<td align="center"> </td>
|
||
<td align="center"> </td>
|
||
<td align="center"><font face="Arial">6</font></td>
|
||
</tr>
|
||
<tr>
|
||
<td><font face="Arial">LAYERMODE_SPRITEBLACK</font></td>
|
||
<td align="center"> </td>
|
||
<td align="center"> </td>
|
||
<td align="center"><font face="Arial">x</font></td>
|
||
<td align="center"> </td>
|
||
<td align="center"> </td>
|
||
<td align="center"> </td>
|
||
<td align="center"><font face="Arial">4</font></td>
|
||
</tr>
|
||
<tr>
|
||
<td><font face="Arial">LAYERMODE_SPRITEWHITE</font></td>
|
||
<td align="center"> </td>
|
||
<td align="center"> </td>
|
||
<td align="center"> </td>
|
||
<td align="center"><font face="Arial">x</font></td>
|
||
<td align="center"> </td>
|
||
<td align="center"> </td>
|
||
<td align="center"><font face="Arial">4</font></td>
|
||
</tr>
|
||
<tr>
|
||
<td><font face="Arial">LAYERMODE_FASTSPRITEKEY</font></td>
|
||
<td align="center"> </td>
|
||
<td align="center"><font face="Arial">x</font></td>
|
||
<td align="center"> </td>
|
||
<td align="center"> </td>
|
||
<td align="center"> </td>
|
||
<td align="center"> </td>
|
||
<td align="center"><font face="Arial">6</font></td>
|
||
</tr>
|
||
<tr>
|
||
<td><font face="Arial">LAYERMODE_FASTSPRITEBLACK</font></td>
|
||
<td align="center"> </td>
|
||
<td align="center"> </td>
|
||
<td align="center"><font face="Arial">x</font></td>
|
||
<td align="center"> </td>
|
||
<td align="center"> </td>
|
||
<td align="center"> </td>
|
||
<td align="center"><font face="Arial">4</font></td>
|
||
</tr>
|
||
<tr>
|
||
<td><font face="Arial">LAYERMODE_FASTSPRITEWHITE</font></td>
|
||
<td align="center"> </td>
|
||
<td align="center"> </td>
|
||
<td align="center"> </td>
|
||
<td align="center"><font face="Arial">x</font></td>
|
||
<td align="center"> </td>
|
||
<td align="center"> </td>
|
||
<td align="center"><font face="Arial">4</font></td>
|
||
</tr>
|
||
<tr>
|
||
<td><font face="Arial">LAYERMODE_PERSPKEY</font></td>
|
||
<td align="center"> </td>
|
||
<td align="center"><font face="Arial">x</font></td>
|
||
<td align="center"> </td>
|
||
<td align="center"> </td>
|
||
<td align="center"> </td>
|
||
<td align="center"> </td>
|
||
<td align="center"><font face="Arial">6</font></td>
|
||
</tr>
|
||
<tr>
|
||
<td><font face="Arial">LAYERMODE_PERSPBLACK</font></td>
|
||
<td align="center"> </td>
|
||
<td align="center"> </td>
|
||
<td align="center"><font face="Arial">x</font></td>
|
||
<td align="center"> </td>
|
||
<td align="center"> </td>
|
||
<td align="center"> </td>
|
||
<td align="center"><font face="Arial">4</font></td>
|
||
</tr>
|
||
<tr>
|
||
<td><font face="Arial">LAYERMODE_PERSPWHITE</font></td>
|
||
<td align="center"> </td>
|
||
<td align="center"> </td>
|
||
<td align="center"> </td>
|
||
<td align="center"><font face="Arial">x</font></td>
|
||
<td align="center"> </td>
|
||
<td align="center"> </td>
|
||
<td align="center"><font face="Arial">4</font></td>
|
||
</tr>
|
||
<tr>
|
||
<td><font face="Arial">LAYERMODE_PERSP2KEY</font></td>
|
||
<td align="center"> </td>
|
||
<td align="center"><font face="Arial">x</font></td>
|
||
<td align="center"> </td>
|
||
<td align="center"> </td>
|
||
<td align="center"> </td>
|
||
<td align="center"> </td>
|
||
<td align="center"><font face="Arial">6</font></td>
|
||
</tr>
|
||
<tr>
|
||
<td><font face="Arial">LAYERMODE_PERSP2BLACK</font></td>
|
||
<td align="center"> </td>
|
||
<td align="center"> </td>
|
||
<td align="center"><font face="Arial">x</font></td>
|
||
<td align="center"> </td>
|
||
<td align="center"> </td>
|
||
<td align="center"> </td>
|
||
<td align="center"><font face="Arial">4</font></td>
|
||
</tr>
|
||
<tr>
|
||
<td><font face="Arial">LAYERMODE_PERSP2WHITE</font></td>
|
||
<td align="center"> </td>
|
||
<td align="center"> </td>
|
||
<td align="center"> </td>
|
||
<td align="center"><font face="Arial">x</font></td>
|
||
<td align="center"> </td>
|
||
<td align="center"> </td>
|
||
<td align="center"><font face="Arial">4</font></td>
|
||
</tr>
|
||
</table>
|
||
</center></div>
|
||
|
||
<p><font face="Arial"><u>Volba zápisových rovin</u></font></p>
|
||
|
||
<p><font face="Arial">Standardnì probíhá výstup obrazu z
|
||
vrstev do všech výstupních pinù. To lze zmìnit
|
||
pøedefinováním polí <strong>LayerFirstPin</strong> a <strong>LayerNumPin</strong>
|
||
(ve vga_layer.cpp). Lze urèit pro každou vrstvu zvláš<C3A1>, do
|
||
kterých výstupních pinù se bude zapisovat. Tím lze vytvoøit
|
||
jakousi pseudo-prùhlednost. Napø. jedna vrstva bude vykreslovat
|
||
køivky èervenou barvou, jiná vrstva zelenou barvou, a barvy se
|
||
budou nezávisle na sobì prolínat. Pøi pøedefinování pinù
|
||
je však nutné poèítat s tím, že se posune i offset
|
||
mapování pinù. Výstup bude probíhat vždy od nejnižších
|
||
bitù pixelu.</font></p>
|
||
|
||
<p><font face="Arial"><u>Konfigurace pøekryvných vrstev</u></font></p>
|
||
|
||
<p><font face="Arial">Prvním krokem pro nastavení pøekryvné
|
||
vrstvy je zadání módu vrstvy pro inicializaèní funkci <strong>VgaCfg</strong>.
|
||
Funkce detekuje potøebný program a potøebné èasování.
|
||
Nekontroluje se, zda jsou spolu kombinovány správné módy
|
||
vrstev.</font></p>
|
||
|
||
<p><font face="Arial">Jako druhý krok je inicializace
|
||
popisovaèe vrstvy - struktura sLayer v poli LayerScreen. Je
|
||
vhodné k tomu použít inicializaèní funkci:</font></p>
|
||
|
||
<p><font face="Arial"><strong>LayerSetup(u8 inx, const u8* img,
|
||
const sVmode* vmode, u16 w, u16 h, u8 col = 0, const void* par =
|
||
NULL)</strong> ... Parametr 'inx' obsahuje èíslo vrstvy 1..3,
|
||
'img' je ukazatel na obrazová data, 'vmode' je ukazatel na
|
||
pøipravenou strukturu Vmode, 'w' je šíøka obrazu, 'h' je
|
||
výška obrazu, 'col' je klíèová barva. V pøípadì módù
|
||
*BLACK i *WHITE zadejte barvu COL_BLACK (resp. 0). 'par' je
|
||
doplòkový parametr. Funkce nastaví rozmìry obrázku a jeho
|
||
adresu. Souøadnice vynuluje. Pozici obrazu na obrazovce lze
|
||
nastavit funkcemi LayetSetX a LayerSetY. Souøadnice nezávisí
|
||
na grafických módech základní vrstvy a vztahují se k levému
|
||
hornímu rohu aktivní plochy obrazovky.</font></p>
|
||
|
||
<p><font face="Arial">Po inicializaci zùstává vrstva vypnutá.
|
||
Viditelnost vrstvy je nutné zapnout voláním funkce <strong>LayerOn</strong>.</font></p>
|
||
|
||
<p><font face="Arial">V pøípadì módu s transformaèní
|
||
maticí (LAYERMODE_PERSP*) se namísto uvedené funkce použije
|
||
tato funkce:</font></p>
|
||
|
||
<p><font face="Arial"><strong>LayerPerspSetup(u8 inx, const u8*
|
||
img, const sVmode* vmode, u16 w, u16 h, u8 xbits, u8 ybits, s8
|
||
horiz, const int* mat, u8 col = 0)</strong> ... Na rozdíl od
|
||
pøedešlé funkce se zadává navíc rozmìr zdrojového
|
||
obrázku v poètu bitù (rozmìry obrázku musí být mocnina 2),
|
||
výška horizontu/4 (pro zápornou hodnotu se podlaha zmìní na
|
||
strop, pro nulu se neuplatòuje perspektivní transformace) a
|
||
ukazatel na </font><a href="#matrix"><font face="Arial">transformaèní
|
||
matici</font></a><font face="Arial"> v celoèíselném tvaru.</font></p>
|
||
|
||
<p><font face="Arial">V pøípadì módu se sprajty se použije
|
||
tato funkce:</font></p>
|
||
|
||
<p><font face="Arial"><strong>LayerSpriteSetup(u8 inx, sSprite**
|
||
sprite, u16 spritenum, const sVmode* vmode, s16 x, s16 y, u16 w,
|
||
u16 h, u8 col = 0)</strong> ... Od pøedešlých funkcí se
|
||
liší zadáním souøadnice plochy se sprajty, ukazatele na pole
|
||
adres sprajtù a poètem sprajtù.</font></p>
|
||
|
||
<h2><a name="sprites"></a><font face="Arial">Sprajty</font></h2>
|
||
|
||
<p><font face="Arial">Sprajty lze používat v pøekryvných
|
||
rovinách s programy KEY, BLACK a WHITE. Jsou dvì možnosti
|
||
použití sprajtù:</font></p>
|
||
|
||
<ol>
|
||
<li><font face="Arial">Pomalé sprajty, módy
|
||
LAYERMODE_SPRITE*. Sprajty jsou generované softwarovì.
|
||
Renderovací funkce linky nejdøíve vymaže buffer linky
|
||
prùhlednou barvou a pak postupnì prochází pole
|
||
sprajtù. Hledá, které sprajty danou adresu Y
|
||
pøekrývají a v tom pøípadì linku vykreslí do
|
||
bufferu. Sprajty v tomto módu mají výhodu, že se
|
||
mohou libovolnì pøekrývat (poøadí pøekrývání
|
||
vychází z poøadí umístìní v poli adres) a mohou se
|
||
posouvat jemnì po pixelech. Hlavní nevýhodou je velká
|
||
nároènost na vykreslování. I malé množství
|
||
sprajtù mùže zpùsobit pøeteèení renderovacího
|
||
èasu linky a tím výpadek obrazu. Je však nutno si
|
||
uvìdomit, že se jedná o množství sprajtù (a jejich
|
||
rozmìry) na stejné videolince. Sprajty na vzdálených
|
||
souøadnicích Y se neovlivòují. Chcete-li ovìøit,
|
||
zda renderovací funkce bude daný poèet sprajtù
|
||
zvládat, umístìte sprajty horizontálnì vedle sebe. A
|
||
naopak, chcete-li zajistit nízké vykreslovací nároky,
|
||
zajistìte, aby se sprajty nedostaly do stejných
|
||
vertikálních souøadnic Y. Nebo zmenšete šíøku
|
||
sprajtù.</font></li>
|
||
<li><font face="Arial">Rychlé sprajty, módy
|
||
LAYERMODE_FASTSPRITE*. Sprajty se nevykreslují
|
||
softwarovì do renderovacího bufferu, ale posílají se
|
||
pøímo do PIO pomocí DMA pøenosu. Díky tomu je
|
||
renderování sprajtù velmi rychlé a je možné
|
||
zobrazit více sprajtù vedle sebe. Samozøejmì to
|
||
pøináší na druhou stranu nevýhody. Souøadnice X
|
||
sprajtù i jejich šíøka musí být násobkem 4,
|
||
sprajty nelze po obrazovce posouvat jemnì (nevztahuje se
|
||
na souøadnici Y). Ale pøedevším, sprajty se nemohou
|
||
pøímo pøekrývat. Jeden sprajt mùže pokraèovat ve
|
||
vykreslování tam, kde pøedešlý sprajt skonèil. Tedy
|
||
pøedešlý sprajt mùže utnout zaèátek
|
||
následujícího sprajtu. Je zde urèité ošetøení,
|
||
které mùže situaci mírnì zlepšit. Pro zlepšení
|
||
pøekryvù (a zrychlení renderování) je souèástí
|
||
sprajtù i tabulka která udává, kolik pixelù od
|
||
okraje zaèíná neprùhledná linka sprajtu a jak je
|
||
dlouhá. K vygenerování tabulky lze použít funkci <strong>SpritePrepLines</strong>.
|
||
U rychlých sprajtù musí být tato informace násobkem
|
||
4. Tedy zajistíme-li, že zaèátky a konce linek obrazu
|
||
budou zaèínat a konèit na násobcích 4, sprajty se
|
||
budou pøekrývat témìø správnì (pokud nebudou mít
|
||
vnitøní prùhlednosti). Jinak v místì pøekryvu mohou
|
||
vznikat prùhledné díry. Jedním z požadavkù na
|
||
rychlé sprajty je i to, že seznam sprajtù musí být
|
||
setøídìný podle souøadnice X. K tomu slouží
|
||
podpùrná funkce <strong>SortSprite</strong>.</font></li>
|
||
</ol>
|
||
|
||
<p><font face="Arial">Pøi použití sprajtù bude prvním krokem
|
||
zadání módu vrstvy LAYERMODE_*SPRITE* pro inicializaèní
|
||
funkci <strong>VgaCfg</strong>.</font></p>
|
||
|
||
<p><font face="Arial">Druhým krokem bude sestavení pole
|
||
zaèátkù a délek linek vzorù obrazù sprajtù pomocí funkce <strong>SpritePrepLines</strong>.
|
||
Funkci se pøedá ukazatel na obrázek každého sprajtu (jsou
|
||
podporovány pouze sprajty s 8-bitovou barvou), rozmìry
|
||
obrázku, ukazatele na pole zaèátkù a délek linek (rozmìry
|
||
polí odpovídají výšce sprajtu) a klíèová barva
|
||
prùhlednosti. Funkce vyhledá zaèátky a konce linek a zapíše
|
||
je do polí. Parametr 'fast' udává, zda se tabulky generují
|
||
pro rychlé sprajty - v tom pøípadì se zaèátky a délky
|
||
linek vydìlí 4. Pro pomalé sprajty je nutné poèítat s
|
||
omezením šíøky sprajtu na 255 pixelù.</font></p>
|
||
|
||
<p><font face="Arial"><strong>SpritePrepLines(const u8* img, u8*
|
||
x0, u8* w0, u16 w, u16 h, u16 wb, u8 col, Bool fast)</strong></font></p>
|
||
|
||
<p><font face="Arial">Tøetím krokem bude sestavení seznamu
|
||
sprajtù a inicializace sprajtù - pøedevším ukazatel na
|
||
obrázek, rozmìry a souøadnice sprajtu. Seznam sprajtù je pole
|
||
ukazatelù na sprajty. Každý sprajt mùže být v seznamu jen
|
||
jednou, ale více sprajtù mùže sdílet stejný obraz sprajtu a
|
||
stejné pole zaèátkù a délek linek. Pomalé sprajty mohou
|
||
mít souøadnice i mimo povolený rozsah (oøíznou se), ale u
|
||
rychlých sprajtù doporuèuji nepøekraèovat horizontální
|
||
limity obrazovky, oøíznutí obrazu není ještì správnì
|
||
doladìné a program by se mohl zhroutit.</font></p>
|
||
|
||
<p><font face="Arial">Sprajty nemají sice parametr pro
|
||
vypínání pøi neèinnosti, ale jejich vypnutí lze zajistit
|
||
nastavením souøadnice Y mimo obrazovku. Pøi renderování se
|
||
vyhledávají viditelné sprajty podle souøadnice Y, neplatná
|
||
souøadnice Y zajistí bezpeèné znefunkènìní sprajtu.</font></p>
|
||
|
||
<p><font face="Arial">Rychlé sprajty vyžadují setøídìní
|
||
seznamu podle souøadnice X. K tomu slouží funkce SortSprite,
|
||
které se pøedá ukazatel na seznam sprajtù a poèet sprajtù v
|
||
seznamu. Tato funkce by se mìla zavolat vždy, když zmìníte
|
||
souøadnice X sprajtù. Pøechodné stavy (napø. chvilkové
|
||
chybné pøekrytí sprajtù) nevadí, jde jen o krátkodobé
|
||
optické chyby, program to neohrozí. Funkce tøídí bublinkovou
|
||
metodou, tedy celkem pomalu, ale zatím se nezdálo že by to
|
||
nìèemu škodilo (sprajtù nebývá mnoho).</font></p>
|
||
|
||
<p><font face="Arial"><strong>SortSprite(sSprite** list, int num)</strong></font></p>
|
||
|
||
<p><font face="Arial">Posledním krokem je inicialitzace vrstvy
|
||
se sprajty. Funkce byla popsána v pøedešlé kapitole.</font></p>
|
||
|
||
<p><font face="Arial"><strong>LayerSpriteSetup(u8 inx, sSprite**
|
||
sprite, u16 spritenum, const sVmode* vmode, s16 x, s16 y, u16 w,
|
||
u16 h, u8 col = 0)</strong></font></p>
|
||
|
||
<p><font face="Arial">Následuje už jen zapnutí viditelnosti
|
||
vrstvy funkcí <strong>LayerOn</strong> a øízení sprajtù
|
||
zmìnou jejich souøadnic X a Y a zmìnou jejich obrázkù img.</font></p>
|
||
|
||
<h2><a name="canvas"></a><font face="Arial">Canvas</font></h2>
|
||
|
||
<p><font face="Arial">Canvas je kreslicí plátno. Je to
|
||
podpùrná knihovna pro práci s grafickou plochou a obrázky
|
||
(blíže soubor <strong>canvas.h</strong> ve složce
|
||
_picovga\util). Struktura sCanvas je soubor parametrù, které
|
||
popisují grafickou plochu, pro použití v kreslicích
|
||
funkcích. Grafickou plochou mùže být jak grafický frame
|
||
buffer, tak i obrázek, a to i ve Flash.</font></p>
|
||
|
||
<p><font face="Arial">Chcete-li kreslit do grafické plochy,
|
||
pøipojte k ní nejdøíve canvas jako definici popisující
|
||
strukturu plochy. A stejnì tak, chcete-li vykreslit do plochy
|
||
obrázek, nejdøíve pro obrázek vytvoøte jeho canvas s
|
||
parametry. Jako parametry se do struktury zadá ukazatel na data
|
||
obrázku, rozmìry obrázku a formát. Jako kreslicí plocha
|
||
mùže být grafická plocha s hloubkou 1, 2, 4, 8 bitù nebo s
|
||
atributy. V pøípadì kreslení obrázku do plochy musí mít
|
||
zdrojový a cílový canvas stejný formát. V pøípadì
|
||
transformaèních matic lze kreslit pouze do 8-bitového
|
||
grafického formátu.</font></p>
|
||
|
||
<p><font face="Arial"><em>Poznámka:</em> V PicoVGA je k
|
||
dispozici implicitní canvas Canvas. Je na nìj automaticky
|
||
pøipojen grafický frame buffer pøi inicializaci pomocí funkce
|
||
Video. Jinak je možné ho používat v programu libovolnì.</font></p>
|
||
|
||
<p><font face="Arial"><strong>DrawRect(sCanvas* canvas, int x,
|
||
int y, int w, int h, u8 col)</strong> ... vykreslení
|
||
obdélníku.</font></p>
|
||
|
||
<p><font face="Arial"><strong>DrawFrame(sCanvas* canvas, int x,
|
||
int y, int w, int h, u8 col)</strong> ... vykreslení rámu o
|
||
tlouš<EFBFBD>ce 1 pixel.</font></p>
|
||
|
||
<p><font face="Arial"><strong>DrawClear(sCanvas* canvas)</strong>
|
||
... vyplnìní canvasu èernou barvou.</font></p>
|
||
|
||
<p><font face="Arial"><strong>DrawPoint(sCanvas* canvas, int x,
|
||
int y, u8 col)</strong> ... vykreslení pixelu.</font></p>
|
||
|
||
<p><font face="Arial"><strong>DrawLine(sCanvas* canvas, int x1,
|
||
int y1, int x2, int y2, u8 col)</strong> ... vykreslení èáry.</font></p>
|
||
|
||
<p><font face="Arial"><strong>DrawFillCircle(sCanvas* canvas, int
|
||
x0, int y0, int r, u8 col, u8 mask=0xff)</strong> ... vykreslení
|
||
vyplnìného kruhu. x0 a y0 jsou souøadnice støedu, r je
|
||
polomìr. Maska 'mask' udává pomocí bitù 0 až 7, které
|
||
osminy kruhu se vykreslí.</font></p>
|
||
|
||
<p><font face="Arial"><strong>DrawCircle(sCanvas* canvas, int x0,
|
||
int y0, int r, u8 col, u8 mask=0xff)</strong> ... vykreslení
|
||
kružnice, parametry jako u pøedešlé funkce.</font></p>
|
||
|
||
<p><font face="Arial"><strong>DrawText(sCanvas* canvas, const
|
||
char* text, int x, int y, u8 col, const void* font, int
|
||
fontheight=8, int scalex=1, int scaley=1)</strong> ... výpis
|
||
textu s prùhledným pozadím. scalex a scaley je mìøítko
|
||
zvìtšení ve smìrech X a Y.</font></p>
|
||
|
||
<p><font face="Arial"><strong>DrawTextBg(sCanvas* canvas, const
|
||
char* text, int x, int y, u8 col, u8 bgcol, const void* font, int
|
||
fontheight=8, int scalex=1, int scaley=1)</strong> ... výpis
|
||
textu se zadanou barvou pozadí</font></p>
|
||
|
||
<p><font face="Arial"><strong>DrawImg(sCanvas* canvas, sCanvas*
|
||
src, int xd, int yd, int xs, int ys, int w, int h)</strong> ...
|
||
vykreslení obrázku (bez prùhlednosti).</font></p>
|
||
|
||
<p><font face="Arial"><strong>DrawBlit(sCanvas* canvas, sCanvas*
|
||
src, int xd, int yd, int xs, int ys, int w, int h, u8 col)</strong>
|
||
... vykreslení obrázku, prùhlednost zadaná klíèovou barvou.</font></p>
|
||
|
||
<p><font face="Arial"><strong>DrawImgMat(sCanvas* canvas, const
|
||
sCanvas* src, int x, int y, int w, int h, const class cMat2Df* m,
|
||
u8 mode, u8 color)</strong> ... vykreslení obrázku s
|
||
transformací pomocí </font><a href="#matrix"><font face="Arial">transformaèní
|
||
matice</font></a><font face="Arial"> (otáèení atd.). Bližší
|
||
info v canvas.h.</font></p>
|
||
|
||
<p><font face="Arial"><strong>DrawTileMap(sCanvas* canvas, const
|
||
sCanvas* src, const u8* map, int mapwbits, int maphbits, int
|
||
tilebits, int x, int y, int w, int h, const cMat2Df* mat, u8
|
||
horizon)</strong> ... vykreslení mapy dlaždic s perspektivou.</font></p>
|
||
|
||
<p><font face="Arial"><strong>DrawImgLine(sCanvas* canvas,
|
||
sCanvas* src, int xd, int yd, int xs, int ys, int wd, int ws)</strong>
|
||
... vykreslení linky obrazu s interpolací.</font></p>
|
||
|
||
<h2><a name="matrix"></a><font face="Arial">Transformaèní
|
||
matice</font></h2>
|
||
|
||
<p><font face="Arial">Nìkteré vykreslovací funkce používají
|
||
k zobrazení transformaèní matici cMat2Df, která definuje
|
||
transformaci obrazu (blíže soubor <strong>mat2d.h</strong> ve
|
||
složce _picovga\util). Matice má 6 èíselných prvkù typu
|
||
float. Transformace se pøipraví nastavením výchozího stavu
|
||
funkcí Unit a poté postupným zadáváním transformací.
|
||
Použitím matice se provede s obrazem operace, jako by se
|
||
jednotlivé operace zadávaly postupnì.</font></p>
|
||
|
||
<p><font face="Arial"><strong>GetX</strong> ... provedení
|
||
transformace pro souøadnici X</font></p>
|
||
|
||
<p><font face="Arial"><strong>GetY</strong> ... provedení
|
||
transformace pro souøadnici Y</font></p>
|
||
|
||
<p><font face="Arial"><strong>Unit</strong> ... inicializace
|
||
matice na jednotkový výchozí stav</font></p>
|
||
|
||
<p><font face="Arial"><strong>Copy</strong> ... kopie matice</font></p>
|
||
|
||
<p><font face="Arial"><strong>TransX</strong> ... posun ve smìru
|
||
X</font></p>
|
||
|
||
<p><font face="Arial"><strong>TransY</strong> ... posun ve smìru
|
||
Y</font></p>
|
||
|
||
<p><font face="Arial"><strong>ScaleX</strong> ... zmìna
|
||
mìøítka ve smìru X</font></p>
|
||
|
||
<p><font face="Arial"><strong>ScaleY</strong> ... zmìna
|
||
mìøítka ve smìru Y</font></p>
|
||
|
||
<p><font face="Arial"><strong>RotSC</strong> ... rotace se
|
||
zadáním výsledkù funkce sin(a) a cos(a)</font></p>
|
||
|
||
<p><font face="Arial"><strong>Rot</strong> ... rotace se
|
||
zadáním úhlu</font></p>
|
||
|
||
<p><font face="Arial"><strong>Rot90</strong> ... rotace o 90°</font></p>
|
||
|
||
<p><font face="Arial"><strong>Rot180</strong> ... rotace o 180°</font></p>
|
||
|
||
<p><font face="Arial"><strong>Rot270</strong> ... rotace o 270°</font></p>
|
||
|
||
<p><font face="Arial"><strong>ShearX</strong> ... zkosení ve
|
||
smìru X</font></p>
|
||
|
||
<p><font face="Arial"><strong>ShearY</strong> ... zkosení ve
|
||
smìru Y</font></p>
|
||
|
||
<p><font face="Arial"><strong>FlipY</strong> ... vertikální
|
||
pøeklopení</font></p>
|
||
|
||
<p><font face="Arial"><strong>FlipX</strong> ... horizontální
|
||
pøeklopení</font></p>
|
||
|
||
<p><font face="Arial"><strong>PrepDrawImg(int ws, int hs, int x0,
|
||
int y0, int wd, int hd, float shearx, float sheary, float r,
|
||
float tx, float ty)</strong> ... Pøíprava matice pro
|
||
vykreslovací funkci. Poøadí operací je zvoleno tak, jako by
|
||
se obraz nejdøíve posunul do bodu tx a ty, provedla se zmìna
|
||
mìøítka, zešikmení, pak rotace a nakonec posun do cílových
|
||
souøadnic.</font></p>
|
||
|
||
<p><font face="Arial"><strong>ExportInt(int* mat)</strong> ...
|
||
Export matice do celoèíselného pole (6 prvkù int). Po
|
||
transformaci obsahuje 12 spodních bitù èísla desetinnou
|
||
èást èísla, horních 20 bitù obsahuje celoèíselnou èást
|
||
èísla. Vykreslovací funkce vyžadují tento celoèíselný
|
||
tvar transformaèní matice.</font></p>
|
||
|
||
<h2><a name="overclock"></a><font face="Arial">Pøetaktování
|
||
procesoru</font></h2>
|
||
|
||
<p><font face="Arial">Nìkteré zobrazující funkce mohou být
|
||
nároèné na rychlost procesoru a mohou vyžadovat
|
||
pøetaktování na vyšší rychlost. Je nutno poèítat s tím,
|
||
že pøetaktováním se procesor dostává do oblastí s
|
||
nezaruèenou správnou funkcí. Knihovna PicoVGA umožòuje
|
||
øídit pøetaktování procesoru, podle požadovaného
|
||
videomódu. Ve funkci VgaCfg lze zadat minimální a maximální
|
||
frekvenci procesoru. Implicitnì knihovna povoluje rozsah 120 až
|
||
270 MHz. Mùže se však stát, že pøi vyšších frekvencích
|
||
bude procesor pracovat chybnì a mùže být nutné horní
|
||
hranici snížit.</font></p>
|
||
|
||
<p><font face="Arial">Vyhledanou frekvenci procesoru lze nastavit
|
||
funkcí <strong>set_sys_clock_pll</strong>.</font></p>
|
||
|
||
<p><font face="Arial"><strong>bool vcocalc(u32 reqkhz, u32 input,
|
||
u32 vcomin, u32 vcomax, bool lowvco, u32* outkhz, u32* outvco,
|
||
u16* outfbdiv, u8* outpd1, u8* outpd2)</strong> ... Funkce pro
|
||
vyhledání optimálního nastavení PLL generátoru
|
||
systémových hodin. Funkci se zadá požadovaná výstupní
|
||
frekvence, vstupní frekvence krystalu (v Raspberry Pico 12 MHz),
|
||
minimální a maximální frekvence oscilátoru VCO. Výstupem
|
||
jsou parametry pro nastavení PLL oscilátoru. Funkce navrací
|
||
True, pokud se jí podaøilo nalézt nastavení pro pøesnou
|
||
hodnotu požadované frekvence. Jinak vyhledá nastavení pro
|
||
nejbližší frekvenci a vrátí False. Blíže soubor <strong>overclock.h</strong>
|
||
ve složce _picovga\util.</font></p>
|
||
|
||
<p><font face="Arial"><strong>bool FindSysClock(u32 reqkhz, u32*
|
||
outkhz, u32* outvco, u16* outfbdiv, u8* outpd1, u8* outpd2)</strong>
|
||
... Vyhledání nastavení PLL generátoru s implicitními
|
||
parametry.</font></p>
|
||
|
||
<p><font face="Arial"><strong>void
|
||
__not_in_flash_func(FlashSpeedSetup)(int baud)</strong> ...
|
||
Nastavení rychlosti interface pro externí flash.</font></p>
|
||
|
||
<h2><a name="print"></a><font face="Arial">Tisk textu</font></h2>
|
||
|
||
<p><font face="Arial">Funkce pro tisk textu se používají k
|
||
výstupu textu do textového frame bufferu (blíže soubor <strong>print.h</strong>
|
||
ve složce _picovga\util). V souèasnosti jsou podporované
|
||
formáty bufferù GF_ATEXT (text s barevným atributem) a
|
||
GF_MTEXT (mono text).</font></p>
|
||
|
||
<p><font face="Arial"><strong>PrintSetup(u8* buf, int bufw, int
|
||
bufh, int bufwb)</strong> ... Inicializace obsluhy tisku textu.
|
||
Funkci se pøedá ukazatel na textový frame buffer a jeho
|
||
rozmìry. Je-li délka øádku v bajtech nižší než
|
||
dvojnásobek šíøky, zvolí se formát mono textu GF_MTEXT,
|
||
jinak se použije formát s atributy GF_ATEXT. Tato funkce je
|
||
automaticky volána pøi inicializaci videomódu pomocí funkce
|
||
Video.</font></p>
|
||
|
||
<p><font face="Arial"><strong>int PrintX, PrintY</strong> ...
|
||
Aktuální tisková pozice.</font></p>
|
||
|
||
<p><font face="Arial"><strong>u8 PrintCol</strong> ... Aktuální
|
||
tisková barva (neuplatní se u mono textu).</font></p>
|
||
|
||
<p><font face="Arial"><strong>PrintClear()</strong> ...
|
||
Vymazání textového bufferu aktuálnì zvolenou barvou.</font></p>
|
||
|
||
<p><font face="Arial"><strong>PrintHome()</strong> ... Pøesun
|
||
ukazatele na zaèátek prvního øádku.</font></p>
|
||
|
||
<p><font face="Arial"><strong>PrintSetPos(int x, int y)</strong>
|
||
... Nastavení tiskového ukazatele (sloupec a øádek).</font></p>
|
||
|
||
<p><font face="Arial"><strong>PrintAddPos(int x, int y)</strong>
|
||
... Relativní posun tiskového ukazatele.</font></p>
|
||
|
||
<p><font face="Arial"><strong>PrintSetCol(u8 col)</strong> ...
|
||
Nastavení tiskové barvy. Použijte makro PC_COLOR k sestavení
|
||
barevného atributu.</font></p>
|
||
|
||
<p><font face="Arial"><strong>PrintChar0(char ch)</strong> ...
|
||
Vytištìní znaku do tiskového bufferu, bez zohlednìní
|
||
øídicích znakù.</font></p>
|
||
|
||
<p><font face="Arial"><strong>PrintChar(char ch)</strong> ...
|
||
Vytištìní znaku do tiskového bufferu, s obsluhou øídicích
|
||
znakù CR, LF a TAB</font></p>
|
||
|
||
<p><font face="Arial"><strong>PrintSpc()</strong> ...
|
||
Vytištìní mezery.</font></p>
|
||
|
||
<p><font face="Arial"><strong>PrintSpcTo(int pos)</strong> ...
|
||
Vytištìní mezer až po zadanou pozici.</font></p>
|
||
|
||
<p><font face="Arial"><strong>PrintCharRep(char ch, int num)</strong>
|
||
... Opakovaný tisk znaku.</font></p>
|
||
|
||
<p><font face="Arial"><strong>PrintSpcRep(int num)</strong> ...
|
||
Opakovaný tisk mezery.</font></p>
|
||
|
||
<p><font face="Arial"><strong>PrintText(const char* text)</strong>
|
||
... Tisk textu.</font></p>
|
||
|
||
<p><font face="Arial"><strong>PrintHLine(int x, int y, int w)</strong>
|
||
... Vykreslení horizontální linky. Ke kreslení se
|
||
používají znaky pro kreslení èar s kódem 17 až 31, tak jak
|
||
jsou nadfinovány ve </font><a href="#fonts"><font face="Arial">fontech</font></a><font
|
||
face="Arial"> knihovny PicoVGA. Pøi kreslení se èára
|
||
kombinuje se znaky které jsou již v tiskovém bufferu tak, aby
|
||
se èáry správnì spojovaly a pøekrývaly. Funkce neošetøuje
|
||
pøeteèení mimo povolený rozsah displeje.</font></p>
|
||
|
||
<p><font face="Arial"><strong>PrintVLine(int x, int y, int h)</strong>
|
||
... Vykreslení vertikální linky. Ke kreslení se používají
|
||
znaky pro kreslení èar s kódem 17 až 31, tak jak jsou
|
||
nadfinovány ve fontech knihovny PicoVGA. Pøi kreslení se
|
||
èára kombinuje se znaky které jsou již v tiskovém bufferu
|
||
tak, aby se èáry správnì spojovaly a pøekrývaly. Funkce
|
||
neošetøuje pøeteèení mimo povolený rozsah displeje.</font></p>
|
||
|
||
<p><font face="Arial"><strong>PrintFrame(int x, int y, int w, int
|
||
h)</strong> ... Vykreslení èárového rámu. Funkce používá
|
||
pøedešlé 2 kreslicí funkce.</font></p>
|
||
|
||
<h2><a name="sound"></a><font face="Arial">Zvukový výstup PWM</font></h2>
|
||
|
||
<p><font face="Arial">Knihovna PicoVGA obsahuje podporu pro
|
||
výstup zvuku pomocí PWM modulace. Implicitnì výstup zvuku
|
||
probíhá na port GPIO19 - nadefinováno v souboru <strong>pwmsnd.h</strong>
|
||
ve složce _picovga\util. Na port se lze napojit pøímo
|
||
(napø.sluchátka) nebo lépe pøes jednoduchý RC filtr s dolní
|
||
propustí.</font></p>
|
||
|
||
<p><font face="Arial">Výstup zvuku pomocí PWM modulace má
|
||
výhodu v tom, že postaèí 1 výstupní pin a výstupní obvody
|
||
jsou velmi jednoduché. Nevýhodou je zašumìní zvuku
|
||
modulaèním kmitoètem a nízká bitová hloubka zvuku
|
||
(používá se hloubka 8 bitù). Vyšší hloubka není možná z
|
||
dùvodu omezené frevence procesoru. Tento výstup je
|
||
postaèující pro vìtšinu bìžných nenároèných aplikací
|
||
(jako jsou retro hry). Pro vyšší kvalitu zvuku se musí
|
||
použít jiný zpùsob.</font></p>
|
||
|
||
<p><font face="Arial"><em>Poznámka:</em> Dojde-li ke zmìnì
|
||
systémových hodin, je nutné reinicializovat nastavení
|
||
zvukového výstupu novým zavoláním inicializaèní funkce.</font></p>
|
||
|
||
<p><font face="Arial"><strong>PWMSndInit()</strong> ...
|
||
Inicializace knihovny pro výstup zvuku PWM. </font></p>
|
||
|
||
<p><font face="Arial"><strong>PlaySound(const u8* snd, int len,
|
||
Bool rep = False, float speed = 1.0f)</strong> ... Pøehrátí
|
||
zvuku. Zvuk musí být ve formátu nekomprimovaný PCM, mono, 8
|
||
bitù, frekvence 22050 Hz. V parametrech lze zadat, zda se zvuk
|
||
bude opakovat a jaká bude relativní rychlost jeho
|
||
pøehrávání (zvuk lze paramtrem 'speed' zrychlit nebo
|
||
zpomalit).</font></p>
|
||
|
||
<p><font face="Arial"><strong>StopSound()</strong> ... Zastaví
|
||
pøehrávání zvuku. Výstup na výstupní pin bude probíhat i
|
||
nadále (projeví se slabým šumem), ale použije se hodnota
|
||
nuly 128.</font></p>
|
||
|
||
<p><font face="Arial"><strong>SpeedSound(float speed)</strong>
|
||
... Nastavení rychlosti pøehrávání. Používá se pøi
|
||
opakovaném pøehrávání zvuku ke zmìnì výšky tónu (napø.
|
||
zvuk motoru auta). Hodnota 1.0 pøedstavuje standardní rychlost
|
||
pøehrávání.</font></p>
|
||
|
||
<p><font face="Arial"><strong>Bool PlayingSound()</strong> ...
|
||
Testuje, zda probíhá pøehrávání zvuku.</font></p>
|
||
|
||
<p><font face="Arial"><strong>SetNextSound(const u8* snd, int
|
||
len)</strong> ... Nastavení dalšího zvuku k pøehrátí.
|
||
Používá se u opakovaných zvukù, aby se dokonèilo
|
||
pøehrátí aktuálnáího zvuku a pokraèovalo se dalším
|
||
zvukem.</font></p>
|
||
|
||
<h2><a name="random"></a><font face="Arial">Generátor náhody</font></h2>
|
||
|
||
<p><font face="Arial">Knihovna cRandom (blíže viz soubor rand.h
|
||
ve složce _picovga\util) nahrazuje a rozšiøuje standardní
|
||
generátor náhodných èísel. Jako seed se používá
|
||
64-bitové èíslo, což zajistí dostateènou náhodnost
|
||
èísla. Omezenou náhodnost standardního 32-bitového
|
||
generátoru lze pozorovat napø. pøi generování terénu -
|
||
projeví se jako vlny v terénu. Lze použít buï globální
|
||
promìnnou Rand a funkce k ní patøící, nebo si vytvoøit
|
||
další lokální generátor cRandom. Následující funkce se
|
||
vztahují ke globálním generátoru Rand. Pøi startu programu
|
||
se doporuèuje použít funkci RandInitSeed, která zajistí
|
||
neopakující se náhodnost generátoru.</font></p>
|
||
|
||
<p><font face="Arial"><strong>u64 RandSeed()</strong> ...
|
||
Navrátí aktuální stav seed generátoru náhody. Lze použít
|
||
k uchování stavu generátoru a jeho pozdìjší obnovì, za
|
||
úèelem reprodukovatelné sekvence náhody.</font></p>
|
||
|
||
<p><font face="Arial"><strong>RandSetSeed(u64 seed)</strong> ...
|
||
Nastavení seed generátoru náhody. Bez nastavení seed
|
||
zaèíná generátor náhody s implicitní hodnotou 0, která
|
||
vznikne nulováním pamìti pøi startu programu.</font></p>
|
||
|
||
<p><font face="Arial"><strong>RandInitSeed()</strong> ...
|
||
Inicializace generátoru náhody náhorným èíslem. Funkce
|
||
používá výstup z ROSC èítaèe. Pøestože jeho výstup
|
||
nezajistí velkou pestrost náhodnosti, bude tím zajištìno,
|
||
že pøi opakovaném startu programu se nebude zaèínat se
|
||
stejnou posloupností náhodnosti. Tato funkce by mìla být
|
||
volána vždy na zaèátku po spuštìní programu.</font></p>
|
||
|
||
<p><font face="Arial"><strong>u8 RandU8()</strong> ...
|
||
Generování èísla u8 (0..255)</font></p>
|
||
|
||
<p><font face="Arial"><strong>u16 RandU16()</strong> ...
|
||
Generování èísla u16 (0..65535)</font></p>
|
||
|
||
<p><font face="Arial"><strong>u32 RandU32()</strong> ...
|
||
Generování èísla u32 (0..0xFFFFFFFF)</font></p>
|
||
|
||
<p><font face="Arial"><strong>u64 RandU64()</strong> ...
|
||
Generování èísla u64 (0..0xFFFFFFFFFFFFFFFF)</font></p>
|
||
|
||
<p><font face="Arial"><strong>s8 RandS8()</strong> ...
|
||
Generování èísla s8 (-128..+127)</font></p>
|
||
|
||
<p><font face="Arial"><strong>s16 RandS16()</strong> ...
|
||
Generování èísla s16 (-32 768..+-32 767)</font></p>
|
||
|
||
<p><font face="Arial"><strong>s32 RandS32()</strong> ...
|
||
Generování èísla s32 (-0x80000000..+0x7FFFFFFF)</font></p>
|
||
|
||
<p><font face="Arial"><strong>s64 RandS64()</strong> ...
|
||
Generování èísla s64
|
||
(-0x8000000000000000..+0x7FFFFFFFFFFFFFFF)</font></p>
|
||
|
||
<p><font face="Arial"><strong>float RandFloat()</strong> ...
|
||
Generování desetinného èísla float v rozsahu 0 (vèetnì
|
||
nuly) až 1 (vyjma 1).</font></p>
|
||
|
||
<p><font face="Arial"><strong>double RandDouble()</strong> ...
|
||
Generování desetinného èísla double v rozsahu 0 (vèetnì
|
||
nuly) až 1 (vyjma 1).</font></p>
|
||
|
||
<p><font face="Arial">Generování èísel od 0 po zadané
|
||
maximum (vèetnì maxima):</font></p>
|
||
|
||
<p><font face="Arial"><strong>u8 RandU8Max(u8 max)</strong></font></p>
|
||
|
||
<p><font face="Arial"><strong>u16 RandU16Max(u16 max)</strong></font></p>
|
||
|
||
<p><font face="Arial"><strong>u32 RandU32Max(u32 max)</strong></font></p>
|
||
|
||
<p><font face="Arial"><strong>u64 RandU64Max(u64 max)</strong></font></p>
|
||
|
||
<p><font face="Arial"><strong>s8 RandS8Max(s8 max)</strong></font></p>
|
||
|
||
<p><font face="Arial"><strong>s16 RandS16Max(s16 max)</strong></font></p>
|
||
|
||
<p><font face="Arial"><strong>s32 RandS32Max(s32 max)</strong></font></p>
|
||
|
||
<p><font face="Arial"><strong>s64 RandS64Max(s64 max)</strong></font></p>
|
||
|
||
<p><font face="Arial"><strong>float RandFloatMax(float max)</strong>
|
||
... Generování èísla float od 0 (vèetnì nuly) po zadané
|
||
maximum (vyjma maxima)</font></p>
|
||
|
||
<p><font face="Arial"><strong>double RandDoubleMax(double max)</strong>
|
||
... Generování èísla double od 0 (vèetnì nuly) po zadané
|
||
maximum (vyjma maxima)</font></p>
|
||
|
||
<p><font face="Arial">Generování èísel v zadaném rozsahu,
|
||
vèetnì hranièních hodnot (je-li min > max, vygeneruje se
|
||
èíslo vnì intervalu):</font></p>
|
||
|
||
<p><font face="Arial"><strong>u8 RandU8MinMax(u8 min, u8 max)</strong></font></p>
|
||
|
||
<p><font face="Arial"><strong>u16 RandU16MinMax(u16 min, u16 max)</strong></font></p>
|
||
|
||
<p><font face="Arial"><strong>u32 RandU32MinMax(u32 min, u32 max)</strong></font></p>
|
||
|
||
<p><font face="Arial"><strong>u64 RandU64MinMax(u64 min, u64 max)</strong></font></p>
|
||
|
||
<p><font face="Arial"><strong>s8 RandS8MinMax(s8 min, s8 max)</strong></font></p>
|
||
|
||
<p><font face="Arial"><strong>s16 RandS16MinMax(s16 min, s16 max)</strong></font></p>
|
||
|
||
<p><font face="Arial"><strong>s32 RandS32MinMax(s32 min, s32 max)</strong></font></p>
|
||
|
||
<p><font face="Arial"><strong>s64 RandS64MinMax(s64 min, s64 max)</strong></font></p>
|
||
|
||
<p><font face="Arial"><strong>float RandFloatMinMax(float min,
|
||
float max)</strong> ... Generování èísla float v rozsahu min
|
||
(vèetnì minima) až max (vyjma maxima)</font></p>
|
||
|
||
<p><font face="Arial"><strong>double RandDoubleMinMax(double min,
|
||
double max)</strong> ... Generování èísla double v rozsahu
|
||
min (vèetnì minima) až max (vyjma maxima)</font></p>
|
||
|
||
<p><font face="Arial"><strong>float RandGaussF(float mean = 0,
|
||
float sigma = 1)</strong> ... Generování Gaussova náhodného
|
||
èísla float, se støedem 'mean' a šíøkou intervalu 'width'.</font></p>
|
||
|
||
<p><font face="Arial"><strong>double RandGaussD(double mean = 0,
|
||
double sigma = 1)</strong> ... Generování Gaussova náhodného
|
||
èísla double, se støedem 'mean' a šíøkou intervalu 'width'.</font></p>
|
||
|
||
<p><font face="Arial">Následující funkce slouží ke
|
||
generování terénù, pomocí skládání vln závislých na
|
||
souøadnici. Výstupem je èíslo v rozsahu -1 až +1.</font></p>
|
||
|
||
<p><font face="Arial"><strong>float Noise1D(int x, int seed)</strong>
|
||
... Generátor náhody s 1 souøadnicí.</font></p>
|
||
|
||
<p><font face="Arial"><strong>float Noise2D(int x, int y, int
|
||
seed)</strong> ... Generátor náhody se 2 souøadnicemi.</font></p>
|
||
|
||
<p><font face="Arial"><strong>float Noise3D(int x, int y, int z,
|
||
int seed)</strong> ... Generátor náhody se 3 souøadnicemi.</font></p>
|
||
|
||
<p><font face="Arial"><strong>float SmoothNoise1D(float x, int
|
||
scale, int seed)</strong> ... Interpolovaný generátor náhody s
|
||
1 rozmìrem.</font></p>
|
||
|
||
<p><font face="Arial"><strong>float SmoothNoise2D(float x, float
|
||
y, int scale, int seed)</strong> ... Interpolovaný generátor
|
||
náhody se 2 rozmìry.</font></p>
|
||
|
||
<h2><a name="fonts"></a><font face="Arial">Fonty</font></h2>
|
||
|
||
<p><font face="Arial">Ve složce _picovga\font naleznete fonty
|
||
pøipravené pro využití v programech. Fonty v PicoVGA mají
|
||
formát monochromatického obrázku (tj. 1 pixel je 1 bit) s 256
|
||
znaky na øádku a s šíøkou znakù 8 pixelù. Celková
|
||
šíøka obrázku tak je 2048 pixelù (256 bajtù). Výška fontu
|
||
mùže být libovolná, ale standardnì jsou v knihovnì fonty s
|
||
výškou 8, 14 a 16 linek. Fonty jsou exportované utilitou
|
||
RaspPicoImg do formátu zdrojového textu *.cpp, pøidají se k
|
||
programu jako bajtové pole.</font></p>
|
||
|
||
<p><font face="Arial">Pøíklad fontu font_bold_8x8:</font></p>
|
||
|
||
<p><font face="Arial"><img src="img/font1.jpg" width="288"
|
||
height="288"></font></p>
|
||
|
||
<h2><a name="import"></a><font face="Arial">Import obrázkù a
|
||
zvukù</font></h2>
|
||
|
||
<p><font face="Arial">Ve složce _picovga\_exe naleznete
|
||
podpùrné programy (utility) sloužící ke konverzi obrázkù a
|
||
zvukù do interního tvaru použitého knihovnou PicoVGA. Soubory
|
||
se k programu pøidávají ve formì zdrojového kódu, jako
|
||
pole. Programy jsou pøipraveny ve Visual Studio 2005. Jsou to
|
||
konzolové programy a tak by nemìla být nároèná jejich
|
||
úprava i pod Linux.</font></p>
|
||
|
||
<p><font face="Arial">Ve složce _picovga\_exe naleznete soubory
|
||
s paletami *.act. Soubory použijete ve Photoshopu nebo Gimpu
|
||
pøi konverzi obrázkù do palet PicoVGA. Nejdùležitìjší je
|
||
soubor palet <strong>pal332.act</strong>. Je vygenerovaný
|
||
programem <strong>pal332.exe</strong> (ve složce pal332) a
|
||
definuje základní 8-bitové barvy PicoVGA. Ve složce pal332
|
||
naleznete též soubor <strong>pal332.csv</strong>, který
|
||
obsahuje podrobné informace o barvách - poøadové èíslo
|
||
barvy, RGB hodnotu barvy a hodnoty jednotlivých složek. Soubor
|
||
mùžete zobrazit v Excelu nebo Open Office, ale také
|
||
jakýmkoliv textovým editorem. Mùže být užiteèný napø. v
|
||
pøípadì, když si ve Photoshopu pøeètete RGB HEX hodnotu
|
||
barvy a chcete vìdìt, indexu které barvy to odpovídá v
|
||
PicoVGA. V tom pøípadì HEX kód vyhledáte v souboru (funkcí
|
||
Najít) a na zaèátku øádku si pøeètete pøíslušný kód
|
||
barvy.</font></p>
|
||
|
||
<p><font face="Arial">Pøi importu obrázku do barev PicoVGA
|
||
zkonvertujete obrázek do indexových barev, jako palety zvolíte
|
||
"Custom" (vlastní palety) a ze souborù palet naètete
|
||
pøíslušnou paletu. V nìkterých pøípadech (fotografie)
|
||
mùže být užiteèné zapnout volbu ditheringu (obvykle metoda
|
||
Diffusion s 75%), jindy je lepší bez ditheringu.</font></p>
|
||
|
||
<p><font face="Arial">Uložený obrázek importujete do PicoVGA
|
||
programem <strong>RaspPicoImg</strong> (ve složce
|
||
_picovga\_exe\img). Obrázek ukládejte vždy do souboru formátu
|
||
Windows BMP, vypnutá komprese a zapnuté obrácené poøadí
|
||
linek. V pøípadì 8-bitové grafiky použijte k importu soubor
|
||
palet pal332.act a obrázek uložte jako 8-bitový paletový
|
||
soubor BMP. Pøi exportu do 4-bitové grafiky použijte 4-bitové
|
||
palety, obvykle pal4_PC.act (palety CGA) nebo pal4_ZX.act (palety
|
||
ZX Spectrum) a obrázek uložte jako 4-bitový paletový
|
||
obrázek. Pøi exportu do 2-bitové grafiky použijte nìkterou
|
||
ze 2-bitových palet palcga*.act (palety CGA v módu 1 až 6).
|
||
Obrázek BMP nepodporuje 2-bitový formát, ale mùžete ho
|
||
uložit jako 4-bitový, program RaspPicoImg rozpozná z palet že
|
||
se jedná o 2-bitový obrázek a provede pøíslušnou konverzi.
|
||
Pøi exportu do 1-bitové grafiky (mono) použijte soubor palet
|
||
pal1.act a obrázek uložte jako 1-bitový paletový soubor.</font></p>
|
||
|
||
<p><font face="Arial">Pøi konverzi obrázku do RLE
|
||
komprimovaného formátu použijte program <strong>RaspPcoRle</strong>
|
||
ve složce _picovga\_exe\rle. Vstupem programu je obrázek BMP
|
||
zkonvertovaný do 8-bitových palet PicoVGA (soubor palet
|
||
pal332.act), uložený bez komprese, se zapnutým obráceným
|
||
poøadím linek. Ètvrtý parametrem programu je èíslo barvy,
|
||
která se použije jako prùhlednost. Èíslo barvy najdete z HEX
|
||
kódu (zjištìný ve Photoshopu kapátkem) v souboru pal332.act.
|
||
Nemá-li obrázek mít prùhlednost, zadejte namísto barvy
|
||
prùhlednosti -1.</font></p>
|
||
|
||
<p><font face="Arial">Program RaspPicoRle je silnì závislý na
|
||
PIO programu RLE. Do kódu ukládá instrukce s offsety
|
||
potøebnými k funkci programu. Musíte proto použít vždy
|
||
program ze stejné verze, jako je PicoVGA knihovna, protože
|
||
nìkdy v budoucnu mùže dojít ke zmìnì formátu použitého
|
||
RLE kódu.</font></p>
|
||
|
||
<p><font face="Arial">Ve složce snd naleznete program <strong>RaspPicoSnd</strong>,
|
||
kterým lze importovat zvuky do PicoVGA. Importovaný zvuk musí
|
||
být ve formátu WAV, bez komprese (komprese PCM), 8 bitù, mono,
|
||
rate 22050 Hz. K úpravám zvuku mùžete použít editor Cool
|
||
Edit, nebo free program Audacity. Audacity disponuje mnoha
|
||
zvukovými efekty, umožòuje dobrou manipulaci se zvukovými
|
||
stopami a byl jím i pøipraven zvuk pro video s ukázkami
|
||
programù knihovny PicoVGA.</font></p>
|
||
|
||
<h2><a name="demo"></a><font face="Arial">Ukázkové programy</font></h2>
|
||
|
||
<p><font face="Arial">Programy jsou pøipraveny pro ovládání
|
||
klávesnicí pøes konzoli v PC (doporuèeno </font><a
|
||
href="dwn/begPutty.zip"><font face="Arial">begPutty</font></a><font
|
||
face="Arial">) a virtuální sériový USB port. Podrobnìjší
|
||
návod k pøipojení konzole naleznete v èlánku o </font><a
|
||
href="http://www.breatharian.eu/hw/rasppico/index.html"><font
|
||
face="Arial">RaspPicoSDK</font></a><font face="Arial">. Nìkteré
|
||
hry používají zvuk - generování PWM zvuku pøes pin GP19.
|
||
Hry s PWM zvukem jsou oznaèeny poznámkou "(zvuk)".</font></p>
|
||
<div align="left">
|
||
|
||
<table border="0" cellpadding="2">
|
||
<tr>
|
||
<td align="right" width="510"><a href="img/ants.jpg"><font
|
||
face="Arial"><img src="img/ants_m.jpg" border="0"
|
||
width="250" height="188"></font></a><font face="Arial"> </font><a
|
||
href="img/ants2.jpg"><font face="Arial"><img
|
||
src="img/ants2_m.jpg" border="0" width="250" height="188"></font></a></td>
|
||
<td valign="top"><font face="Arial"><strong>Ants</strong>
|
||
- karetní hra (zvuk). Dvì mraveništì spolu soupeøí
|
||
o nadvládu. Cílem je postavit vyšší hrad.
|
||
Ovládání: J vlevo, L vpravo, mezerník vybrat kartu, D
|
||
odložit, H pomoc, Q konec. Lze hrát proti jinému
|
||
hráèi i proti poèítaèi.</font></td>
|
||
</tr>
|
||
<tr>
|
||
<td align="right" width="510"><a href="img/balloons.jpg"><font
|
||
face="Arial"><img src="img/balloons_m.jpg" border="0"
|
||
width="250" height="188"></font></a></td>
|
||
<td valign="top"><font face="Arial"><strong>Balloons</strong>
|
||
- demonstrace použití sprajtù, poletující balonky
|
||
(celkem 43 sprajtù).</font></td>
|
||
</tr>
|
||
<tr>
|
||
<td align="right" width="510"><a href="img/draw.jpg"><font
|
||
face="Arial"><img src="img/draw_m.jpg" border="0"
|
||
width="250" height="188"></font></a></td>
|
||
<td valign="top"><font face="Arial"><strong>Draw</strong>
|
||
- demonstrace kreslení grafických prvkù. Pro ukázku
|
||
se støídá pomalé vykreslování a kreslení
|
||
maximální rychlostí.</font></td>
|
||
</tr>
|
||
<tr>
|
||
<td align="right" width="510"><a href="img/earth.jpg"><font
|
||
face="Arial"><img src="img/earth_m.jpg" border="0"
|
||
width="250" height="188"></font></a></td>
|
||
<td valign="top"><font face="Arial"><strong>Earth</strong>
|
||
- rotující zemìkoule. Softwarová sférická
|
||
transformace obrázku.</font></td>
|
||
</tr>
|
||
<tr>
|
||
<td align="right" width="510"><a href="img/eggs.jpg"><font
|
||
face="Arial"><img src="img/eggs_m.jpg" border="0"
|
||
width="250" height="188"></font></a><font face="Arial"> </font><a
|
||
href="img/eggs2.jpg"><font face="Arial"><img
|
||
src="img/eggs2_m.jpg" border="0" width="250" height="188"></font></a></td>
|
||
<td valign="top"><font face="Arial"><strong>Eggs</strong>
|
||
- logická hra (zvuk). Vychází ze hry Reversi. Cílem
|
||
je získat co nejvíce vlastních kamenù. Jeden hráè
|
||
mìní kameny ve smìru slepice-kuøe-vejce, druhý
|
||
hráè opaèným smìrem. Ovládání: L vpravo, I
|
||
nahoru, J vlevo, K dolù, H pomoc, Q konec, P 2 hráèi,
|
||
D demo, mezerník položení kamene, Enter ok. Lze hrát
|
||
proti jinému hráèi i proti poèítaèi.</font></td>
|
||
</tr>
|
||
<tr>
|
||
<td align="right" width="510"><a href="img/fifteen.jpg"><font
|
||
face="Arial"><img src="img/fifteen_m.jpg" border="0"
|
||
width="250" height="188"></font></a></td>
|
||
<td valign="top"><font face="Arial"><strong>Fifteen</strong>
|
||
- logická hra (zvuk). Cílem je seøadit kameny v
|
||
poøadí 1 až 15. Ovládání: L vpravo, I nahoru, J
|
||
vlevo, K dolù, Q nová hra.</font></td>
|
||
</tr>
|
||
<tr>
|
||
<td align="right" width="510"><a href="img/flag.jpg"><font
|
||
face="Arial"><img src="img/flag_m.jpg" border="0"
|
||
width="250" height="188"></font></a></td>
|
||
<td valign="top"><font face="Arial"><strong>Flag</strong>
|
||
- vlající vlajka.</font></td>
|
||
</tr>
|
||
<tr>
|
||
<td align="right" width="510"><a
|
||
href="img/ghostracing.jpg"><font face="Arial"><img
|
||
src="img/ghostracing_m.jpg" border="0" width="250"
|
||
height="188"></font></a></td>
|
||
<td valign="top"><font face="Arial"><strong>Ghost Racing</strong>
|
||
- závody aut (zvuk). Po projetí prvního kola (je
|
||
nutný prùjezd checkpointy) se objeví soupeø -
|
||
"duch", který kopíruje vaši pøedchozí
|
||
cestu. Soupeøíte tak sami se sebou. Ve høe jsou celkem
|
||
2 soupeøi duchové (druhý se má objevit po projetí
|
||
druhého kola). Hra je nedodìlaná - nepodaøilo se mi
|
||
vypoèítat správnou transformaci obrazu soupeøù do
|
||
kamery a je teï jen velmi pøibližná. Je to spíš jen
|
||
polotovar pro inspiraci a demonstraci 3D projekce terénu
|
||
(plochy z dlaždic). Ovládání: I pøeøadit nahoru, K
|
||
pøeøadit dolù, J doleva, L doprava. Lze zaøadit 5
|
||
rychlostních stupòù. Pùvodnì byla možná i
|
||
zpáteèka, ale ta spíš pøekážela.</font></td>
|
||
</tr>
|
||
<tr>
|
||
<td align="right" width="510"><a
|
||
href="img/gingerhouse.jpg"><font face="Arial"><img
|
||
src="img/gingerhouse_m.jpg" border="0" width="250"
|
||
height="188"></font></a><font face="Arial"> </font><a
|
||
href="img/gingerhouse2.jpg"><font face="Arial"><img
|
||
src="img/gingerhouse2_m.jpg" border="0" width="250"
|
||
height="188"></font></a></td>
|
||
<td valign="top"><font face="Arial"><strong>Gingerbread
|
||
House</strong> - pohádková knížka o perníkové
|
||
chaloupce. Program slouží jako ukázka práce s
|
||
obrázky s RLE kompresí. Ovládání: J pøedchozí
|
||
stránka, L další stránka.</font></td>
|
||
</tr>
|
||
<tr>
|
||
<td align="right" width="510"><a href="img/hello.jpg"><font
|
||
face="Arial"><img src="img/hello_m.jpg" border="0"
|
||
width="250" height="188"></font></a></td>
|
||
<td valign="top"><font face="Arial"><strong>Hello World</strong>
|
||
- nejjednodušší ukázkový pøíklad použití
|
||
knihovny PicoVGA.</font></td>
|
||
</tr>
|
||
<tr>
|
||
<td align="right" width="510"><a href="img/hypno.jpg"><font
|
||
face="Arial"><img src="img/hypno_m.jpg" border="0"
|
||
width="250" height="188"></font></a></td>
|
||
<td valign="top"><font face="Arial"><strong>Hypno</strong>
|
||
- hypnotizující rotující obrazec. Ukázka maticové
|
||
transformace obrázku.</font></td>
|
||
</tr>
|
||
<tr>
|
||
<td align="right" width="510"><a
|
||
href="img/levelmeter.jpg"><font face="Arial"><img
|
||
src="img/levelmeter_m.jpg" border="0" width="250"
|
||
height="188"></font></a></td>
|
||
<td valign="top"><font face="Arial"><strong>Level Meter</strong>
|
||
- simulace indikátoru spektra hudby (zvuk). Program
|
||
používá mód zobrazení úrovní grafu s gradientem.
|
||
Vstupem pro displej je pole hodnot. Není potøeba obraz
|
||
indikátorù generovat programovì a tak lze dosáhnout
|
||
velmi rychlé odezvy na zmìnu. V demo ukázce se
|
||
používají náhodné vzorky.</font></td>
|
||
</tr>
|
||
<tr>
|
||
<td align="right" width="510"><a href="img/life.jpg"><font
|
||
face="Arial"><img src="img/life_m.jpg" border="0"
|
||
width="250" height="188"></font></a></td>
|
||
<td valign="top"><font face="Arial"><strong>Life</strong>
|
||
- simulátor života bunìk (celulární automat). Buòky
|
||
se v každém kroku mìní podle poètu sousedních
|
||
bunìk: pro 1 a ménì buòka zaniká na osamocení, pro
|
||
4 a více buòka zaniká na pøemnožení, pro 3 vznikne
|
||
nová buòka, pro 2 není zmìna. Ve høe se lze
|
||
pøepínat mezi 10 obrazovkami (sloty) a pøenášet
|
||
obraz mezi nimi pomocí schránky. V každém slotu je
|
||
pøedpøipravena definice populárních kombinací.
|
||
Ovládání: L vpravo, I nahoru, J vlevo, K dolù, C
|
||
kopie do chránky, V vložení ze schránky, D vymazání
|
||
plochy, mezerník zmìna buòky, Enter start/stop
|
||
automatu, 0-9 výbìr slotu.</font></td>
|
||
</tr>
|
||
<tr>
|
||
<td align="right" width="510"><a href="img/lines.jpg"><font
|
||
face="Arial"><img src="img/lines_m.jpg" border="0"
|
||
width="250" height="188"></font></a></td>
|
||
<td valign="top"><font face="Arial"><strong>Lines</strong>
|
||
- generátor èárových relaxaèních obrazcù.</font></td>
|
||
</tr>
|
||
<tr>
|
||
<td align="right" width="510"><a
|
||
href="img/mandelbrot.jpg"><font face="Arial"><img
|
||
src="img/mandelbrot_m.jpg" border="0" width="250"
|
||
height="188"></font></a><font face="Arial"> </font><a
|
||
href="img/mandelbrot2.jpg"><font face="Arial"><img
|
||
src="img/mandelbrot2_m.jpg" border="0" width="250"
|
||
height="188"></font></a></td>
|
||
<td valign="top"><font face="Arial"><strong>Mandelbrot</strong>
|
||
- generátor fraktálových obrazcù Mandelbrotovy
|
||
množiny. Ke generování je použita integer matematika
|
||
a díky tomu je pøekreslení obrazce rychlé. Je však
|
||
nutno poèítat s tím, že pøi zvìtšování
|
||
mìøítka zobrazení je potøebná rostoucí pøesnost
|
||
poètu èíslic. Použitá integer a float matematika
|
||
vystaèí do mìøítka zvìtšení 10^5, double
|
||
matematika do mìøítka 10^10. Pøi dalším
|
||
zvìtšování se namísto obrazce zobrazí už jen
|
||
barevné èáry. Ovládání: E nahoru, S vlevo, D
|
||
vpravo, X dolù, Q zvìtšení mìøítka, A zmenšení
|
||
mìøítka, L volba nízkého rozlišení 132x100, M
|
||
volba støedního rozlišení 264x200, H volba vysokého
|
||
rozlišení 528x400, I pøepnutí na celoèíselnou
|
||
matematiku (nejrychlejší, dosah do 10^-5), F pøepnutí
|
||
na float matematiku (pomalejší, dosah do 10^-5), B
|
||
pøepnutí na double matematiku (pomalá, dosah do
|
||
10^-10), O snížení poètu krokù iterací, P
|
||
zvýšení poètu krokù iterací, U zvýšení
|
||
systémových hodin, T snížení systémových hodin,
|
||
mezera pøekreslení obrazovky.</font></td>
|
||
</tr>
|
||
<tr>
|
||
<td align="right" width="510"><a
|
||
href="img/matrixrain.jpg"><font face="Arial"><img
|
||
src="img/matrixrain_m.jpg" border="0" width="250"
|
||
height="188"></font></a></td>
|
||
<td valign="top"><font face="Arial"><strong>Matrix Rain</strong>
|
||
- simulace "matrixového kódového deštì".
|
||
Používá textový videomód.</font></td>
|
||
</tr>
|
||
<tr>
|
||
<td align="right" width="510"><a href="img/maze.jpg"><font
|
||
face="Arial"><img src="img/maze_m.jpg" border="0"
|
||
width="250" height="188"></font></a></td>
|
||
<td valign="top"><font face="Arial"><strong>Maze</strong>
|
||
- cílem je najít cestu z bludištì. Bludištì jsou
|
||
generována náhodnì programovì. Ovládání: J vlevo,
|
||
I nahoru, L vpravo, K dolù, H pomoc (ukázání
|
||
dveøí).</font></td>
|
||
</tr>
|
||
<tr>
|
||
<td align="right" width="510"><a href="img/monoscope.jpg"><font
|
||
face="Arial"><img src="img/monoscope_m.jpg" border="0"
|
||
width="250" height="188"></font></a><font face="Arial"> </font><a
|
||
href="img/monoscope2.jpg"><font face="Arial"><img
|
||
src="img/monoscope2_m.jpg" border="0" width="250"
|
||
height="188"></font></a></td>
|
||
<td valign="top"><font face="Arial"><strong>Monoscope</strong>
|
||
- test videomódù. Klávesami 0 až 9 a A až U lze
|
||
pøepínat rozlišení displeje, od 256x192 po 1280x960,
|
||
pro VGA monitor i PAL/NTSC televizor. Pro televizor se
|
||
pro vyšší rozlišení používá prokládaný obraz
|
||
(jako je TV vysílání), pro nižší rozlišení se
|
||
použije neprokládaný mód (jako jsou výstupy z
|
||
8-bitových poèítaèù). Lze využít k testování
|
||
zobrazení na rùzná zaøízení. Jednotlivé testovací
|
||
obrazce jsou v programu uchovány jako pøipravené
|
||
obrázky s RLE kompresí. Bylo by možné program upravit
|
||
tak, aby používal jen 1 obrázek, který se bude
|
||
pøepoèítávat podle potøeby, ale musel by se pøi
|
||
generování komprimovat do RAM s RLE kompresí, protože
|
||
v plné velikosti by se do RAM nevešel.</font></td>
|
||
</tr>
|
||
<tr>
|
||
<td align="right" width="510"><a
|
||
href="img/oscilloscope.jpg"><font face="Arial"><img
|
||
src="img/oscilloscope_m.jpg" border="0" width="250"
|
||
height="188"></font></a></td>
|
||
<td valign="top"><font face="Arial"><strong>Oscilloscope</strong>
|
||
- demonstrace zobrazení signálù osciloskopu. Program
|
||
používá mód zobrazení grafù a køivek. Obraz
|
||
prùbìhu signálu není nutné generovat softwarovì,
|
||
displeji se pøedá pouze pole hodnot, a to umožòuje
|
||
velmi rychlou odezvu na zmìnu hodnot. V demo ukázce
|
||
jsou vzorky generované programovì. Slouží i jako
|
||
ukázka skládání segmentù obrazu v rùzném módu.
|
||
Základní obrázek osciloskopu je 8-bitová bitmapa (s
|
||
ditheringem), skládající se ze 4 pruhù. V místì
|
||
obrazovky jsou použity 2 prvky pro zobrazení grafù.
|
||
Obrazovku pøekrývá pøekryvná prùhledná vrstva s
|
||
møížkou.</font></td>
|
||
</tr>
|
||
<tr>
|
||
<td align="right" width="510"><a href="img/pacman.jpg"><font
|
||
face="Arial"><img src="img/pacman_m.jpg" border="0"
|
||
width="250" height="188"></font></a><font face="Arial"> </font><a
|
||
href="img/pacman2.jpg"><font face="Arial"><img
|
||
src="img/pacman2_m.jpg" border="0" width="250"
|
||
height="188"></font></a></td>
|
||
<td valign="top"><font face="Arial"><strong>Pac-Man</strong>
|
||
- populární akèní hra (zvuk). Hra se snaží
|
||
napodobit pùvodní verzi hry z roku 1980, od
|
||
spoleènosti Namco. Je dodržena logika chování duchù,
|
||
poèítání skore a levelù. Upozoròuji, že zvuky a
|
||
vzhled jsou pøevzaty z pùvodní hry, vztahuje se na nì
|
||
copyright spoleènosti Namco a proto hra slouží jen
|
||
jako inspiraèní ukázka. Ovládání: J vlevo, I
|
||
nahoru, L vpravo, K dolù, A pauza.</font></td>
|
||
</tr>
|
||
<tr>
|
||
<td align="right" width="510"><a href="img/pi.jpg"><font
|
||
face="Arial"><img src="img/pi_m.jpg" border="0"
|
||
width="250" height="188"></font></a></td>
|
||
<td valign="top"><font face="Arial"><strong>Pi</strong> -
|
||
výpoèet èísla Pi na 4833 èíslic. Po výpoètu je
|
||
výsledek zkontrolován s oèekávaným vzorkem.</font></td>
|
||
</tr>
|
||
<tr>
|
||
<td align="right" width="510"><a href="img/pixels.jpg"><font
|
||
face="Arial"><img src="img/pixels_m.jpg" border="0"
|
||
width="250" height="188"></font></a></td>
|
||
<td valign="top"><font face="Arial"><strong>Pixels</strong>
|
||
- náhodné generování barevných pixelù.</font></td>
|
||
</tr>
|
||
<tr>
|
||
<td align="right" width="510"><a
|
||
href="img/raytracing.jpg"><font face="Arial"><img
|
||
src="img/raytracing_m.jpg" border="0" width="250"
|
||
height="188"></font></a></td>
|
||
<td valign="top"><font face="Arial"><strong>Raytracing</strong>
|
||
- generování 3D obrazce metodou ray tracing. Vzhledem k
|
||
omezené barevné hloubce PicoVGA je pøi zobrazení
|
||
použit rastrový dithering ("zrnitost"
|
||
obrázku).</font></td>
|
||
</tr>
|
||
<tr>
|
||
<td align="right" width="510"><a href="img/sokoban.jpg"><font
|
||
face="Arial"><img src="img/sokoban_m.jpg" border="0"
|
||
width="250" height="188"></font></a><font face="Arial"> </font><a
|
||
href="img/sokoban2.jpg"><font face="Arial"><img
|
||
src="img/sokoban2_m.jpg" border="0" width="250"
|
||
height="188"></font></a></td>
|
||
<td valign="top"><font face="Arial"><strong>Sokoban</strong>
|
||
- logická hra (zvuk). Cílem je pøesunout bedny na
|
||
oznaèená políèka. Hra obsahuje 3000 scén od
|
||
rùzných autorù, spolu s jejich øešením.
|
||
Ovládání: L vpravo, I nahoru, J vlevo, K dolù, H
|
||
pomoc (ukázka øešení scény), R restart scény, Q
|
||
pøedchozí scéna, W další scéna, P výpis info.</font></td>
|
||
</tr>
|
||
<tr>
|
||
<td align="right" width="510"><a href="img/spheres.jpg"><font
|
||
face="Arial"><img src="img/spheres_m.jpg" border="0"
|
||
width="250" height="188"></font></a></td>
|
||
<td valign="top"><font face="Arial"><strong>Spheres</strong>
|
||
- náhodné generování koulí.</font></td>
|
||
</tr>
|
||
<tr>
|
||
<td align="right" width="510"><a href="img/spots.jpg"><font
|
||
face="Arial"><img src="img/spots_m.jpg" border="0"
|
||
width="250" height="188"></font></a></td>
|
||
<td valign="top"><font face="Arial"><strong>Spots</strong>
|
||
- náhodné generování skvrn.</font></td>
|
||
</tr>
|
||
<tr>
|
||
<td align="right" width="510"><a href="img/tetris.jpg"><font
|
||
face="Arial"><img src="img/tetris_m.jpg" border="0"
|
||
width="250" height="188"></font></a></td>
|
||
<td valign="top"><font face="Arial"><strong>Tetris</strong>
|
||
- populární hra, skládání kostek (zvuk).
|
||
Ovládání: L vpravo, I otoèení, J vlevo, K
|
||
položení, A pauza.</font></td>
|
||
</tr>
|
||
<tr>
|
||
<td align="right" width="510"><a href="img/train.jpg"><font
|
||
face="Arial"><img src="img/train_m.jpg" border="0"
|
||
width="250" height="188"></font></a><font face="Arial"> </font><a
|
||
href="img/train2.jpg"><font face="Arial"><img
|
||
src="img/train2_m.jpg" border="0" width="250"
|
||
height="188"></font></a></td>
|
||
<td valign="top"><font face="Arial"><strong>Train</strong>
|
||
- logická hra na principu Hada (zvuk). Cílem je
|
||
posbírat všechny pøedmìty a projet branou. Hra má 50
|
||
scén, spolu s jejich øešením. Ovládání: L vpravo,
|
||
I nahoru, J vlevo, K dolù, H pomoc (ukázka øešení
|
||
scény), Enter zadání hesla, Esc zpìt, BS smazání
|
||
znaku.</font></td>
|
||
</tr>
|
||
<tr>
|
||
<td align="right" width="510"><a href="img/twister.jpg"><font
|
||
face="Arial"><img src="img/twister_m.jpg" border="0"
|
||
width="250" height="188"></font></a></td>
|
||
<td valign="top"><font face="Arial"><strong>Twister</strong>
|
||
- zkroucení texturovaného kvádru. Slouží jako
|
||
ukázka programové deformace obrázku, s využitím
|
||
hardwarového interpolátoru.</font></td>
|
||
</tr>
|
||
<tr>
|
||
<td align="right" width="510"><a
|
||
href="img/watersurface.jpg"><font face="Arial"><img
|
||
src="img/watersurface_m.jpg" border="0" width="250"
|
||
height="188"></font></a></td>
|
||
<td valign="top"><font face="Arial"><strong>Water Surface</strong>
|
||
- simulace vlnící se vodní hladiny (zvuk).</font></td>
|
||
</tr>
|
||
</table>
|
||
</div>
|
||
|
||
<p align="center"><a href="http://www.breatharian.eu/hw/picovga/dwn/PicoVga.zip"><font face="Arial">Download
|
||
knihovny PicoVGA</font></a></p>
|
||
|
||
<p> </p>
|
||
|
||
<p align="right"><font face="Arial">Autor: Miroslav Nìmeèek, </font><a
|
||
href="http://panda38.sweb.cz"><font face="Arial">http://panda38.sweb.cz</font></a></p>
|
||
</body>
|
||
</html>
|