UPM 3.03 - volitelně rozšířený monitor pro PMI-80

s nahráváním z PC a dalšími vymoženostmi

Motivací pro vznik monitoru UPM bylo vytvořit konfigurovatelný monitor pro PMI-80, který by obsahoval již existující rozšíření a ta, která jsem vytvořil, zejména o systém TRAPP pro nahrávání z a do PC. Dále jsem chtěl, aby každé rozšíření bylo možno snadno vložit nebo vypustit případně konfigurovat pomocí maker a proměnných. Takto si může každý vytvořit monitor podle svých představ. Jsou-li všechna rozšíření vypnuta, dostanete po kompilace přesně původní monitor pro PMI-80, což i pravidelně testuji. Dále jsem chtěl, aby monitor bylo snadno možné upravit pro jiný jednodeskový počítač než PMI-80.

Existující rozšíření byla volitelně zahrnuta tato:

Dále jsem přidal možnosti Při volbě jakéhokoliv rozšíření kromě podpory NMI na systému Z-80 zůstává monitor kompatibilní s původním, pochopitelně pokud uživatel nezvolí změnu adresace.


Volba cílové platformy: kompilace pro PMI-80, PMI-80M16, PMI-Z80 nebo JPR-PMI

Z uvedených maker je nutno použít právě jedno:

#define PMI80
Kompilace pro standardní PMI-80. Implicitní volba.

#define PMI80M16
Kompilace pro PMI-80M16. Změní uvítací hlášku na PMI-80M16, jinak dělá totéž jako volba PMI80 Pokud se Vám zmíněná hláška nelíbí, kompilujte s volbou PMI80, i když se jedná o PMI-80M16.

#define PMIZ80
Je určena pro klony PMI-80 založené na procesoru Z80. Uvítací hláška je změněna na "PMI-Z80". Je přidána podpora IRQ a volitelně ještě NMI přerušení procesoru Z80. Podrobnosti o podpoře přerušení Z80 jsou zde.

#define JPRPMI
Kompilace pro JPR-PMI, což je můj speciální klon PMI-80 založený na desce JPR-1. Při použití tohoto makra se změní uvítací hlášení, zde se navíc zobrazuje číslo verze monitoru. Dále se změní adresace paměti, přidá zpracování RST6, atd. Více je popsáno na stránce JPR-PMI.

Ochrana přenosového bitu po RST1

#define BRKCPRESERVE

Je prakticky nutností, pokud na PMI-80 používáte breakpointy. Originální zpracování přerušení RST1 totiž obsahuje chybu, která nuluje přenosový bit. Záludnost se skrývá zde:
...
000F lxi h,0000
0012 dad sp
0013 shld 1FE4
...
001C push psw
...
Po provedení LXI H,0000 a následném DAD SP se vždy vynuluje přenosový bit. DAD SP totiž nastavuje přenosový bit podle výsledku. S ohledem na to, že přičítáme k nule, k přenosu nikdy nedojde a přenosový bit se tedy vždy vynuluje. Až o několik instrukcí dále je provedeno PUSH PSW, to je již však přenosový bit vynulován a jeho původní stav navždy ztracen. Použijeme-li makro BRKCPRESERVE, změní se pořadí instrukcí tak, že se nejprve uloží stav PSW a až po té se provede DAD SP. Úprava je popsána v [1]. Při úpravě se pouze změní pořadí instrukcí a tak je monitor stále kompatibilní s původním. Tato volba implicitně je použita.

Filtrování zákmitů kláves aneb slowkey

#define SLOWKEY

Je určena pro případ, že máte starší klávesnici a PMI tak na jeden stisk klávesy zareaguje vícekrát. Při použití SLOWKEY se do kódu přidá softwarová filtrace zákmitů. PMI se tím však nepříjemně zpomalí, proto tuto volbu doporučuji pouze v případě, že je klávesnice Vašeho PMI skutečně problematická. Úprava byla převzata ze již neexistujících stránek Jirky Koutného. Původní zdroj nenalezen. Kód je při použití této volby delší o 10 byte, zůstává však kompatibilní s původním. Implicitně tato volba není použita.

Zabránění nežádoucímu rozsvěcení desetinných teček displeje

#define DPOINTS

Máte-li u displeje zapojené desetinné tečky, pak při zobrazování pomocí standardních funkcí monitoru jsou všechny tečky trvale rozsvícené a je to poměrně otravné. Například uvítací hlášení vypadá takto:

Příčinou je znaková tabulka - v původní znakové tabulce je v definicích všech znaků nejvyšší bit nastaven na 0. Stačí tedy znakovou tabulku upravit, aby se nejvyšší bit měl hodnotu 1 - a toho se dosáhne tím, že se při kompilaci použije makro DPOINTS. Pak se znaky opět zobrazují standardně:
Výjimkou je znak ?, kde je tečka působí přirozeně a je tam ponechána. S ohledem na to, že se mění pouze tabulka znaků a kód je beze změn, nemůže to ovlivnit softwarovou kompatibilitu. Teoreticky může volba DPOINTS činit potíže při použití magnetofonu (používá ho ale někdo?). Pokud nemáte ani magnetofon, ani nemáte zapojené desetinné tečky, lze tedy makro DPOINTS charakterizovat jako "neškodné". Proto je implicitně použito. I při použití makra DPOINTS si ve vlastních programech samozřejmě můžete desetinné tečky rozsvěcovat podle libosti.

Integrován TRAPP

Rutiny pro práci s magnetofonem lze nahradit podporou TRAPP systému pro přenos mezi PMI-80 a PC a pak je modifikována tabulka příkazů. Po stisknutí L na PMI se přímo zavolá program pro přenos dat z PC do PMI-80. Po stisknutí S na PMI se zavolá program pro přenos dat z PMI-80 do PC. Je nutno použít právě jedno z těchto maker:

TRAPP je použit implicitně. Pokud ho ale nechcete a chcete použít původní rutiny pro práci s magnetofonem, použijte makro

#define PMITAPE

Uživatelský program

#define ADDUSRCMD

Využije 3 volné byty za tabulkou příkazů pro přidání volání uživatelského příkazu zvolenou klávesou. Neovlivňuje kompatibilitu. Defaultně je jako klávesa použito rovnítko a adresa uživatelského příkazu je 0400 hexa. Po stisknutí = na PMI se tedy provede skok na adresu 0400 hexa kde je očekáván uživatelský program. Pokud je zde volná adresa, obvykle se načte FF, což je kód instrukce RST 7 a provede se zpracování přerušení s následným návratem do monitoru PMI-80. Kód klávesy, kterou se uživatelský příkaz aktivuje je definovaný v proměnné USRCMDKEY a adresa uživatelského programu je definována proměnnou USRCMDADR, oboje lze změnit. Implicitní použití je
USRCMDKEY .equ 090h
USRCMDADR .equ 00400h

Rozšíření znakové tabulky

#define ADDCHARS

Na konci tabulky znaků pro zobrazování je u originálního monitoru pět nevyužitých byte. Doplnil jsem zde znaky k, U a W, které v původní tabulce nejsou. Po úpravě je k dispozici celá abeceda, pokud u budeme používat jako v. a dále protože je v tabulce h a H, lze H používat místo X. Pochopitelně je potřeba si to pamatovat a čtení znaků vyžaduje trochu fantazie, ale lepší řešení neexistuje. Kódy přidaných znaků jsou:
znak k U W
hexa kód 24 25 26
Implicitně je použito. Protože jsou pouze změněny nepoužívané byty, nemůže to mít vliv na kompatibilitu.

Modifikace uvítací zprávy

#define MODWMSG

Standardně je použita uvítací zpráva podle cílového počítače, tedy: "PMI -80" pro PMI-80, PMI-80M16 pro PMI-80M16, "PMI-Z80" pro PMI-Z80, JPRPMIxxx pro JPR-PMI, xxx je číslo verze UPM. Toto nemusí každému vyhovovat. Použijete-li makro MODWMSG, zpráva se předefinuje na Vaši vlastní. K definici zprávy je pak nutno ještě použít makra MWM1 až MWM9. Každé odpovídá jedné pozici na displeji, počítá se zleva. Definovaná hodnota určije znak ve znakové tabulce PMI.
Příklad:
#define MWM1 01eh ;"
#define MWM2 019h ;[mezera]
#define MWM3 010h ;t
#define MWM4 00eh ;E
#define MWM5 005h ;S
#define MWM6 010h ;t
#define MWM7 019h ;[mezera]
#define MWM8 019h ;[mezera]
#define MWM9 01eh ;"
Implicitně se nepoužívá.

Modifikace dotazovacího znaku

#define MODPROMPT <hodnota>

Použijete-li toto makro, změní se dotazovací znak monitoru z otazníku na Vámi požadovaný. Jako hodnota použijte číslo znaku dle znakové tabulky PMI.
Příklad:
#define MODPROMPT 018H ; znak =
Implicitně se nepoužívá.

Modifikace umístění RAM - pro pokročilé uživatele

#define MODVPAGE <hodnota>

Použijte pouze tehdy, má-li Váš klon PMI nestandardně umístěnou RAM. Jako hodnota použijte horní byte adresy, kam má umístit monitor svoje proměnné, buffer displeje, atd. Dolní byte adres se vždy použijí standardní. Je-li kompilace pro standardní PMI, makro nepoužijte (ponechte zakomentované). Pro JPR-PMI se změna umístění RAM provede automaticky a toto makro zde není potřeba.

Modifikace umístění počáteční adresy - pro pokročilé uživatele

#define MODBASE <hodnota>

Změní počáteční adresu celého monitoru na hodnota. Takto je možno např. vytvořit pokusnou kompilaci monitoru, tu nahrát do RAM a spustit v RAM (pokud ovšem máte RAM dostatečně velkou). Není-li požadována změna počáteční adresy, makro nepoužijte (ponechte zakomentované).

Číslo verze

Na adrese 0037h lze najít číslo verze UPM (neplatí pro JPR-PMI). Horní nibble odpovídá číslu před tečkou a dolní nibble číslu za tečkou, tedy verze 3.03 je zde kódována jako 33h. Originálně je zde nevyužitý byte s hodnotou FF. Takto je možné zjistit verzi UPM. Zavedl jsem to ale až od verze 3.02. Uložení čísla verze není možné vypnout tak jednoduše, jako ostatní změny. Považuji totiž za vhodné, aby bylo vždy možno UPM snadno rozpoznat.


Kompilace

Standardní nastavení monitoru je:

Tyto možnosti si každý může změnit dle své potřeby. Nastavení se provádí v souboru upm_cfg.asm podle tohoto manuálu a poznámky jsou i přímo v souboru upm_cfg.asm.

V zip archivu je kromě všech potřebných zdrojových kódů přiložen i Telemark assembler a dávkové soubory. Kompilace je jednoduchá. Po úpravě souboru upm_cfg.asm spustíte dávkový soubor compile_monitor_hex.bat nebo compile_monitor_bin.bat podle toho, zda si přejete získat binárku nebo IntelHEX soubor.

Nutno poznamenat, že dle dostupných informací lze přiložený Telemark assembler volně šířit, správně by se ale měl při delším používání zaplatit licenční poplatek. Pro zvídavce doplním, že hlavním souborem ke kompilaci je soubor upm_main.asm, z něj se "inkluduje" zmíněný upm_cfg.asm a dle potřeby ještě trapp0.asm a trapp1.asm nebo pmitape.asm a tapetext.asm.

TRAPP je souběžným projektem k UPM a shodně jdou i čísla verzí. Proto jsou v zip archivu přiloženy i soubory compile_trapp_hex.bat a compile_trapp_bin.bat pro kompilace TRAPP samostatně do binárního nebo IntelHEX souboru. Zde ale možnosti konfigurace nejsou tak komfortní jako u UPM. Počáteční adresa je 0400h (pro instalaci do přídavné EPROM) a předpokládá se, že TRAPP je připojen na uživatelský port. Případnou změnu počáteční adresy je nutno provést v souboru trapp0.asm u direktivy .ORG. Je-li TRAPP připojen na služební port, je nutné zakomentovat makro #define PMI_TRAPP_UP a odkomentovat #define PMI_TRAPP_SP

Kdo má dotaz, ať neváhá a napíše mi E-mail na sdq(at)post.cz. Rovněž mohu provést kompilaci komukoliv přesně podle jeho představ. Nic si za to neúčtuju. Jen se musím předem omluvit za někdy delší čas vyhovění požadavku, pokud jsem zrovna zavalen jinými činnostmi.


Stáhnout UPM nebo TRAPP verze 3.03 - aktuální


Starší verze

Verze 3.02.
Verze před 3.02.


Reference


Zpět