Forum

From PMD 85 Infoserver

Jump to: navigation, search
:: back to start of topic :: back to topic list ::
Message
Author  Author ::  Tomáš Pecina
Posted  Posted ::  2015-11-23 09:00:02 PM
Subject  Subject ::  Re: použití podprogramu Transf (EC00)monitoru
Ještě dodatek: předpokládám, že jste se upsal a měl jste na mysli příkaz JUMP, ne JOB. JOB sice dělá, co potřebujete, ale načtený kod okamžitě spustí, takže byste musel před basicový program dát nějakou proveditelnou preambuli (tak je to vyřešeno např. u demonstračního grafického programu pro PMD 85-1, který se spouští s BASICu příkazem ROM n; mají ho tu v archivu, takže pokud se chcete dát touto cestou, doporučuji prostudovat a inspirovat se).
 
Message
Author  Author ::  Jarda Páv
Posted  Posted ::  2015-11-24 01:10:22 PM
Subject  Subject ::  Re: použití podprogramu Transf (EC00)monitoru
Díky, chodí to!! Abych to vysvětlil jak to dělám: uložím do Eprom modulu dvě věci: jednak od adresy 2800 ten basicovský program a za druhé ten stroják (od adresy 2C00), co zavolá to přetažení a návrat do Basicu. Po naběhnutí vydkočím z Basicu do monitoru, v něm pomocí JOB 2C0003FFB00 zajistím přetažení a spuštění spouštecího strojáku do RAM od adresy B000 (tam by nemělo nic být, je to pro uživatelské ROM). No a ten zavolá podprogram Transf, který nakopíruje basicovský program do RAM od adresy 2400. Konec přetahovacího strojáku - funguje i bez CALL 2295 i s ním. To, na čem jsem pohořel (kromě školáckých chyb) byla absence C7 - RST0. Možná by bylo lepší těch 13 byte bát před basicovský program, o tuto délku to dát před adresu 2400 a bylo by to takové instantnější. Až budu mít čas, tak to zkusím. Díky moc Jarda
 
Message
Author  Author ::  Tomáš Pecina
Posted  Posted ::  2015-11-24 02:48:05 PM
Subject  Subject ::  Re: použití podprogramu Transf (EC00)monitoru
Tak to blahopřeji, ale bez volání funkce, která upraví pointer na konec programu, bych to raději nezkoušel, proměnné by přepisovaly program.
 
Message
Author  Author ::  Jarda páv
Posted  Posted ::  2015-11-24 05:04:25 PM
Subject  Subject ::  Re: použití podprogramu Transf (EC00)monitoru
Tak jsem to vyzkoušel i instantní varianatu a tady jsou výsledky:

Basicovy program v ROM modulu

var.1
uložím do ROM modulu na pozici ROM 0 (2800h) vlastní program, získaný provedením DUMp memory v simulátoru (od adresy 2400h - zacatek basicivého programu velikost - kam až je dávám 1024)
na další pozici v ROM modulu (2C00h) kratký "zavaděč" ve strojáku. Jedná se o volání podprogramu monitoru TRANSF (na adrese EC00h) CALL EC00
DW 2800 - odkud z ROM modulu
DW 03FF - délka
DW 2400 - kam v RAM (zač. basicu)
CALL 2295
RST 0
překlad je CD 00 EC 00 28 FF 03 00 24 CD 95 22 C7 a dorovnat na 1024 byte)

na PMD vyskočím z BAsicu do Monitoru
udělám JOB 2C0003FFB000 - kde přenesu zavaděč do oblasti RAM pro uživatelské ROM (B0000h) a spustím. Zavaděč přetahne basicový program z oblasti ROM0 (2800h) a provede měkký reset s náběhem Basicu

var. 1a
mám vše v ROM jako v předchozím popisu.
Nevyskočím z Basidu, jen dám příkaz ROM0

Nevýhoda varianty 1 a 1a je, že mám pro každý program samostatný zavaděč v samostatném prostoru

Var.2
zavaděč dám před basicový program (ten se posune o 13 byte) a to celé dám do ROM.
Zavaděč se upraví tak, aby přenesl data (basicový program) od adresy 2800h + délka zavaděče t.j. 280Dh
CALL EC00
DW 280D - odkud z ROM modulu (2800h pro pozici ROM0)
DW 02FF - délka (skutečná délka basic + zavaděč)
DW 2400 - kam v RAM (zač. basicu)
CALL 2295
RST 0
překlad je CD 00 EC 0D 28 FF 02 00 24 CD 95 22 C7 a pak navazuje basicový program

zavolám ROM0 z Basicu a je to
ROM0 přenese to celé do oblasti uživatelských ROM (B0000h), spustí zavaděč, ten z EPROM přenese basicový program do RAM od 2400h. Délka je nastavena v zavaděči.

Var 2a
dám do Eprom to co ve var. 2
Vyskočím z Basicu a dám JOB 2800000DB000

Výhodou je , že můžu přenášet libovolně dlouhé programy, nevýhodou je, že mám natvrdo nastavenou adresu pro program, t.j. když ho budu chtít dát do jiné pozice v EPROM, musím přepsat adresu v zavaděči. Var 2a - nepřenáší se zbytečně 1024 byte do RAM B0000
:: back to start of topic :: back to topic list ::