Narsil č. 12

Motorola 68000 (10)

↑
Narsil MOTORO10 – obrázek 1

Obsah dnešního článku:

1) Komunikace strojového kódu a Basicu, "C"

2) Vykreslení obrázku PI1

3) Starfield, aneb jak se stát borcem v očích Traumy

STROJÁK, "C", GFA a Omicron Basic

Ve strojáku se dá dělat opravdu všechno, a protože kolikrát je nutné nějakým způsobem komunikovat mezi strojákem a Basicem, tak vám teď napíšu, jak v takových případech postupovat.

V Omikron Basicu je situace velmi jednoduchá. Parametry se odebírají ze zásobníku po slovech v pořadí v jakém byly zadány, tj.:

K=500000: CALL K( 10, 20, 30, 40)

Pak ve strojovém kódu odebíráte parametry tímto způsobem.

move.w 4(a7), d0 ;v d0 je 10

move.w 6(a7), d1 ;v d1 je 20

move.w 8(a7), d2 ;v d2 je 30

move.w 10(a7), d3 ;v d3 je 40

Pozor! Strojový podprogram v Omikronu už běží v Supervizor módu, takže ho není nutno do něj přepínat.

Pokud budete chtít předávát z Basicu long word, musíte použít funkce high(adresa) a low(adresa).

V jazyce "C" je situace obdobná, avšak provedená v opačném pořadí. Pozor! Toto pořadí může být také měněno pomocí různých nastavení jednotlivých kompilátorů jazyka "C", takže bych vždy doporučoval si vše před použitím strojového kódu v jazyce "C" řádně zkontrolovat. Každopádně, pokud v Turbo C 2.0 použijete Standard Stack Frames a zapnete No registr optimization, pak to vypadá takhle.

deklarace:

void Pokus(int termin, long penize, int Narsil)

zavolání:

Pokus( 10, 200000, 5320)

Tak to ve strojovem kódu přebereš takhle.

move.w 4(a7), d0 ;v d0 je 5320

move.l 6(a7), d1 ;v d1 je 200 000

move.l 10(a7), d2 ;v d2 je 10

A úplně nejspecifičtější volání má právě GFA Basic, tam se jedná o opravdovou perličku, a proto jsem pro vás připravil i malý prográmek s názvem GFAMUSIC.S, který vám umožní přehrávat hudby formátu .BAX i v GFA.

K jeho odzkoušení si nahrajte do GFA BASICu program GFAMUSIC.GFA, potřebujete navíc GFAMUSIC.DAT a libovolnou .BAX hudbu, v tomto případě je na disku DAV5_0_4.BAX.

Zdroják ke konverzní rutině najdete v souboru GFAMUSIC.S.

Takže pokud například zavoláte rutinu:

CALL Adresa(Adr_hudby, 0, 1), pak ve strojovém kódu odebereš parametry následujícím způsobem:

move.w 4(a7), d0 ;počet předávaných parametrů

move.l 6(a7), a0 ;adresa pole parametrů

Každý parametr v poli je dlouhý 4 bajty (long word), tzn. že se tady žádných problému se word a long word nemusíte obávat.

Parametry potom přeberete z pole velmi jednoduchým způsobem, tj. ve stejném pořadí v jakém jste je zapsali.

move.l (a0),a2 ;do a2 adresa hudby

move.l 4(a0),d1 ;0 do d1

move.l 8(a0),d2 ;1 do d2

A to by bylo vše týkající se předávání parametrů strojovému kódu v různých jazycích. Pozor! Samozřejmě při předávání můžete použít všech možností jednotlivých jazyků. V "C" můžete předávat pointry na pole, v Omikronu a GFA pomocí VARPTR zase adresu proměnných apod.

Vykreslení obrázku .PI1

Každý občas potřebuje vykreslit na úvod svého programu nějaký obrázek, a protože zdaleka ne všichni mají chuť kompilovat zdlouhavě program z nějakého jazyka, existuje možnost jak takovou věc udělat v nepoměrně kratším čase a především menší délkou i ve strojáku.

Jak tedy jak na to, vám poradí prográmek, který nese název PIC.S, jen upozorňuji, že tento program zobrazuje pouze obrázky ve formátu 320x200, ovšem po menší úpravě dozajista dosáhnete i jiných variant. Stačí jen vědět, že XBIOS 4, navrací při rozlišení 640x200 hodnotu 1 a při rozlišení 640x400 (mono) je v registru d0 zase 2.

A druhá věc, kterou byste měli vedět je formát obrázků PI1, PI2, PI3.

Takže 1 slovo, označuje rozlišení, pro něž je obrázek určen, tj. 0 pro 320x200, 1 pro 640x200 atd. Dalších 32 byte (16 slov) určuje jednotlivé barvy obrázku, přičemž při rozlišení 320x200 je využito všech 16 slov, při rozlišení 640x200 pouze 1. čtyři a při monochromatickém rozlišení pouze určíte, jestli bude pozadí černé a body bílé či naopak. Po těchto 34 bajtech hlavičky následuj 32000 bajtů dat. To je tzv. obrázek PI1 ve formátu DEGAS, jeho délka je 32034 bajtů, potom existuje i formát Degas Elite, který má délku 32066 bajtů a má ve zbývajících 32 bajtech (na konci souboru) informace o animacích, ale ty můžeme s klidem ignorovat. Snad se někdy k formátům obrázku u ATARI vrátíme, kdyby na ně však někdo nechtěl čekat (mluvím pouze o formátech bitmap a animací), tak si může z Internetového archívu comp.sys.atari.st.tech stáhnout soubor ATAPICT.TXT, nebo si objednat PD022, kde ten soubor taky najde. Myslím, že to by bylo k zobrazování obrázků všechno.

STARFIELD

A poslední věc, které se dneska budeme věnovat je STARFIELD. Proč zrovna STARFIELD? No, minule to byl scrolling, a protože pro Traumu není nikdo, kdo neudělal pole hvězd, dost velkej frajer, padlo rozhodnutí právě na něj. Musím vás však upozornit, že se jedná opravdu o nejednodušší a zároveň nejobecnější pole hvězd, jaké se dá pravděpodobně vytvořit, takže kdo by chtěl Traumu opravdu ohromit, bude si ho muset trochu předělat, např. přidat počet barev, rotaci apod.

Narsil MOTORO10 – obrázek 2

Takže naše pole pracuje na základě výpočtu perspektivy, tedy spíše napodobeniny tohoto výpočtu, přesný výpočet je prý (alespoň podle mých přátel strojařů a stavařů) trochu jiný, ovšem k větší realitě by stejně nepřispěl, tak co. Jak takovou perspektivu vypočítat si můžete přečíst na obrázku, poté ještě jednou v programu STARFIEL.S a nakonec vám to ještě jednou trochu vysvětlím já.

To pole, které používáme, má hvězdy pouze jedné barvy, tedy žádný efekt rozsvěcování při přibližování se nekoná, dále pracuje jen v rozlišení low (320x200) a opakuje se téměř každé VBL.

V programu byla použita tzv. metoda Double Buffering, v níž se využívá dvou obrazovek k vytvoření efektu plynulosti. Prostě se jedna obrazovka zapne (zobrazí), na druhou se v té době kreslí následující pozice a po dokreslení se přepne na ni, poté se následující informace zase začnou kreslit na předcházející obrazovku. Této metody již po dobrých 15 let využívají výrobci her a jak jsem se nedávno dozvěděl, měla by být implantována do nových grafických karet určených především pod Windows na IBM PC.

Ovšem ze všeho nejdříve si musíme vytvořit pole hvězd (121), které bude působit jako relativně realistická obloha. Pole a jeho souřadnice vytvořím pomocí XBIOSu 17, tj. generace 24- bitového náhodného čísla. Abych potom omezil rozsah na určitou velikost, použiju při vytváření příkaz děleno. Podobná věc by se dala řešit i pomocí LSR, ale protože máme dost času a protože chci aby vše bylo dostatečně elegantní, tak používám právě příkaz DIVU (děl bez znaménka). Poté prohodím půlky registru pomocí SWAP a zbytek je číslo právě mezi 0-1799 či podobně v závislosti na dělící konstantě. Vypočítanou souřadnici ještě omezím tak, aby mi z obrazovky neutekla dříve než vyjede z jejího okraje, tzn. že nesmí být Z=0, dokud nevyjede hvězda (bod) z pole 320x200 bodů. Abych dosáhl 3D efektu, musím všechny souřadnice zeznaménkovat, takže nakonec bude souřadnice záporná i kladná (jen u X a Y, u Z je vždy kladná).

Po vygenerování pole, začne vlastní výpočet a vykreslování. Výpočet probíhá podle klasických výpočtů o podobnosti trojúhelníku (viz obrázek). Jelikož se však ve strojovém kódu musíme vyhnout desetinným místům, tak nejdříve násobíme a potom teprve dělíme.

Po vykreslení hvězdičky se její souřadnice posune o 8 dopředu a jde se na další. Nakonec už jen zbývá přepnout na vykreslenou obrazovku a začít od znovu, tj. vymazáním té právě neaktivní. Vymazávání provádím pomocí movem.l, protože to je pravděpodobně nejrychlejší způsob.

Po uběhnutí určitého počtu kroku, nebo stisknutí SPACE BARu se nejdříve barva 0 a 1 přepíše na $777 a 0, a poté se předá program řízení opět do GENST.

Takže si to vše vyzkoušejte, udělejte přechody mých geniálních omikronových rutin do svého oblíbeného GFA, a moc se bavte.

HEAD. Jo, pošlete mě taky své strojákové výtvory, ať se můžu nečím konečně pokochat.