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 08:54:51 PM
Subject  Subject ::  Re: použití podprogramu Transf (EC00)monitoru
>Zkoušel jsem více cest - příkaz JUMp EC00 280003ffB000 - to nešlo

JUMP čte pouze jeden parametr, ty další se ztratily, takže tudy cesta nevede.

>napsal jsem krátký kód ve strojáku (CALL EC00 2800 03FF 2400 v překladu DC 00 EC 28 00 03 FF 24 00, který jsem dal v emulátoru na EPROM adresu 2C00, příkazem JOB spustil a nevím co se přeneslo, ale provedl se reset. Prosím, nevíte někdo co dělám špatně?

Jste na dobré cestě, ale máte v kodu několik chyb: 1. opcode pro CALL je 0xcd, ne 0xdc; 2. parametry se zapisují v pořadí LSB-MSB, tedy "CD 00 EC 00 28 FF 03 00 24"; 3. za volání transferové rutiny musíte dát nějaké smysluplné pokračování, např. "C7", což je RST 0 = teplý start BASICu.
 
Message
Author  Author ::  Roman Bórik
Posted  Posted ::  2015-11-23 09:12:37 PM
Subject  Subject ::  Re: použití podprogramu Transf (EC00)monitoru
Práve som sa chystal tiež niečo podobné napísať, len ste ma predbehli.
Doplním iba, že ak sa má skutočne nahrať z ROM Modulu BASIC, je potrebné po nahratí programu v BASICu na adresu 2400h, ešte zavolať rutinu na adrese 2295h, aby sa v BASICu inicializovali vektory konca programu. Takže:

CALL EC00
DW 2800
DW 03FF
DW 2400
CALL 2295
RST 0

Vo výsledku: CD 00 EC 00 28 FF 03 00 24 CD 95 22 C7
 
Message
Author  Author ::  Tomáš Pecina
Posted  Posted ::  2015-11-24 07:54:05 AM
Subject  Subject ::  Re: použití podprogramu Transf (EC00)monitoru
Ano, přesně tak, teplý start BASICu tuto kontrolu sám neprovádí, pouze se podívá na začátek programu.

Jen pro úplnost, kdyby tohle chtěl někdo dělat kompatibilně pro všechny tři modely PMD, musí postupovat jinak a volat 0x1e04, a předtím na zásobník uložit návratovou adresu a další hodnotu, která se před návratem uloží do HL, tedy např.

LXI H,0
PUSH H
PUSH H
JMP 1E04H

PMDčko je prostě rafinovaný stroj, u kterého jsou i ty nejjednodušší operace složité :-)
 
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 ::