Každý, kdo někdy zkoušel naprogramovat něco v (Turbo)BASICU v grafickém módu, narazil jistě na problém s rychlostí. Pokud chcete provést na obrazovce nějakou grafickou animaci, bude to asi příliž pomalé.
Takže pro Vás, kteří potřebujete rychle vykreslit na dané místo nějaký grafický objekt, je určen následující text:
Dvojice strojových podprogramů (soubor SIRVYS.OBJ), které jsem pro Vás vyrobil, jsou po nahrání umístěny v 6. stránce paměti. Volají se z Basicu (či z TB) takto:
1536 .. startovací adresa podprogramu pro tisk ODK .. místo v paměti RAM, od kterého máte uložena grafická data daného objektu SIR .. šířka grafického objektu (udává se v bytech) VYS .. výška grafického objektu (udává se v bodech) X .. x-ová souřadnice umístění objektu na obrazovku (v bytech) Y .. y-ová souřadnice (v bodech)
1539 .. startovací adresa podprogramu pro vyfocení části obrazu KAM .. místo v paměti RAM, od kterého budou uložena data grafického objektu ležícího na daném místě obrazovky SIR .. šířka grafického objektu (udává se v bytech) VYS .. výška grafického objektu (udává se v bodech) X .. x-ová souřadnice místa na obrazovce (v bytech) Y .. y-ová souřadnice (v bodech)
Pozn.:
Údaj "v bytech" znamená v různých grafických módech různý počet bodů:
Gr.mód: Bodů na byte: Bytů na 1 řádek: 0 1 40 1 1 20 2 1 20 3 4 10 4 8 10 5 4 20 6 8 20 7 4 40 8 8 40 9 2 40 10 2 40 11 2 40 12 1 40 13 1 40 14 8 20 15 4 40
Př.
Pro určení místa v paměti, kam je možné uložit nafocené pozice (parametr KAM), je nutné zjistit začátek a konec volné paměti. Začátek najdeme zjištěním obsahu adres 144,145 (dvoubytová hodnota; ?DPEEK(144)), konec na adresách 741,742 (také dvoubytová hodnota). Přitom musíte brát neustále v úvahu, že prodlužováním (T)Basicovského programu se začátek volné paměti posunuje. Rovněž DIMenzování polí a řetězců má stejný účinek. Na horní mez volného prostoru má vliv použitý grafický mód - doporučuji vyzkoušet aktivaci požadovaného módu, a pak zjistit DPEEK(741). Paměť mezi takto zadefinovaným začátkem a koncem můžete použít pro vlastní potřebu.
Velikost potřebné paměti pro nějaký gr. objekt zjistíte vynásobením jeho šířky a výšky (SIZE=SIR*VYS). Pokud tedy chcete zaznamenat více objektů, je vždy nutno posunout parametr KAM o velikost předtím zaznamenaného objektu, jinak dojde k jeho překrytí novým.
Pokud máte nafoceny z obrazovky nějaké objekty, můžete si je uložit na záznamové médium a později už přímo z tohoto média načíst. Využitím tohoto způsobu odpadá nutnost vykreslovat a nafocovat na začátku programu grafické objekty, které pak budou v programu používány. Způsob s načtením grafických dat objektů ze záznamového média je elegantnější a šetří paměť, kterou by potřeboval vlastní (T)BASIC progam na operace spojené s vykreslováním a nafocováním těchto objektů.
Př.
GR.8 REM Namalování 3 grafických objektů ... REM Nafocení: REM 1.objekt 5x30 z místa 0,0 uložit do paměti od adr. 30000 A=USR(1539,30000,5,30,0,0) REM 2.objekt 7x50 z místa 10,30 uložit do paměti od adr. 30150 (velikost předchozího objetu = 5*30 = 150 ; 30000+150=30150) A=USR(1539,30150,7,50,10,30) REM 3.objekt 4x16 z místa 20,50 uložit od adr. 30500 (=30150+7*50) A=USR(1539,30500,4,16,20,50) REM Poslední ukládaný objekt končí na adrese 30500+4*16 = 30564. Velikost všech tří objektů je 30564-30000=564 bytů. REM Uložení na záznamové médium: OPEN#1,8,0,"D:NAZEV" BPUT#1,30000,564 CLOSE#1 END
Až budete tyto objekty potřebovat v nějakém programu, na jeho začátku data načtete:
OPEN#1,4,0,"D:NAZEV" BGET#1,30000,564 CLOSE#1 REM ...a pak je můžete tisknout A=USR(1536,30000,... ) A=USR(1536,30150,... ) A=USR(1536,30500,... ) END
NEZAPOMEŇTE:
Samozřejmostí je, že v každém programu, ve kterém chcete tyto strojové podprogramy používat, musíte (nejlépe někde hned na začátku) zajistit jejich načtení příkazem BLOAD"D:SIRVYS.OBJ".
Pro snazší pochopení jsem napsal program v TurboBasicu, ve kterém jsou ukázána některá možná využití těchto strojových podprogramů.