Sunday, June 2, 2019

NCB48 3. Software

S MON48 monitorom sa pracuje jednoducho. Veď som ho aj spáchal za jeden veľkonočný predĺžený víkend:-) Napíše sa program, assembler/linkerom sa vytvorí HEX. Potom sa HEX pošle (buďto cez send file funkciu terminálu, alebo copy/paste do terminálu). Monitor spracuje HEX a uloží do programovej pamäte. Ladený program sa môže spustiť voľbou G alebo H. Aj keď je EA pin nastavený na internú pamäť programu, pri prekročení poslednej adresy sa MCU samo prepne na používanie externej programovej pamäte. Pri 8748 máme síce iba 64 byte pre dáta, ale pre vlastný program máme rozsah 400H-FFFH. Pri 8749 máme 128 byte pre dáta, ale pre vlastný program iba 800H-FFFH. Po návrate cez inštrukciu RET sa vypíše obsah flagov a môžeme prezerať obsah dátovej RAM cez príkaz I. Ak je monitor nepotrebný, tak spúšťame program od 000H tlačítkom reset s prepnutím na externú pamäť a máme k dispozícii celý rozsah 000H-FFFH

Popis príkazov monitora (dajú sa ukončiť CTRL-C), upload HEX nepotrebuje príkaz:
Ddump programovej pamäte, zadáva sa číslo stránky
Idump internej dátovej pamäte, autodetektne veľkosť 64 alebo 128 byte
Edump externej dátovej pamäte 256 byte v 8155
Smodifikácia programovej pamäte, zadáva sa adresa 000..FFF potom vstup jedného alebo viac byte
Mmodifikácia internej dátovej pamäte
Xmodifikácia externej dátovej pamäte
Gskok na adresu 400H
Hskok na adresu 800H


Ukážka uploadu Intel Hex a následný DUMP page 3, obsah pamäte je MON48.

Dve banky
Pri spúšťaní programu pomocou H a všeobecne pri programoch dlhších ako 2048 byte je tu rodinný MCS-48 zádrhel. Program counter PC je interne iba 11 bitový. To implikuje rozdelenie programového pamäťového priestoru 4kB na dve banky po 2kB. Pre úspešný skok z jednej banky do druhej musíme použiť dve inštrukcie. Jednu na nastavenie klopného obvodu pre bit 12 PC. A potom skočiť pomocou JMP alebo CALL v rámci 11 bitového priestoru, ale skončíme v druhom priestore. Taký malý hviezdny teleport:-) A pri zavolaní RET nastane zábava. Nakoľko je všetkých 12 bitov adresy uložených na stacku, tak sa ako očakávame vrátime do pôvodnej banky, ale klopný obvod pre bit 12 PC ostane nezmenený. Čo sa asi tak stane pri ďalšom JMP alebo CALL? A čo treba urobiť po návrate z teleportu do pôvodnej banky, aby sa program správal predvídateľne? Domáca úloha:-)

Prerušenia
Prerušenia sú dve, z pinu INT a z interného timer/countera. Po celú dobu prerušenia je bit 12 PC vždy nula. Preto sa v obsluhe prerušenia nedá volať žiadna rutina z hornej banky. Ďalší interrupt je zakázaný, povolí sa až vykonaním inštrukcie RETR. RETR zároveň obnoví aj banku registrov a flag F0. Vo flagu F1 sa preto môže posielať jednobitová informácia z prerušenia. Pri pretečení timer/countera sa nastaví flag TF, a vynulovať sa dá tento flag iba vykonaním inštrukcie JTF. Pre návrat z volaní CALL by sa mali v rámci interuptu používať inštrukcie RET, pretože nepovoľujú nové prerušenie.

Meranie času
Interný timer má na vstupe signál, ktorý sa získa tak, že CPU delí frekvenciu kryštálu 3, potom 5 a nakoniec 32 krát. Čo dáva takt 32 inštrukčných cyklov. Counter/timer počíta do 256 (čiže 8192 inštrukčných cyklov) a pretečie, v prerušení si môžeme počítať už čas. Existuje zopár kryštálov, ktoré sa dajú vydeliť na celé čísla. 9.8304MHz a 6.144MHz sa používajú aj pre konštrukcie s CPU 8085. 11.0592MHz zase pre zapojenia s o generáciu novším MCU 8051. Kryštál 3.6864MHz vyhovuje predpisu 3 až 4 MHz pre programátor a zároveň je vhodný aj na presný čas. Tu je tabuľka bežných kryštálov:

FrequencyRateNote
1228800100pre taktovačov
1105920090CMOS sa fláka
983040080
737280060
614400050TESLA tu asi končí
491520040
368640030SAP48
245760020pre padavky

V stĺpci Rate je počet prerušení za sekundu.

Matematické rutiny
V tej dávnej soc.dobe som mal k dispozícii na strednej škole kufríkač SB8035 (jediný kus pre celú školu a ani o ten nemal nikto záujem) a na ňom som si napríklad overil rutiny na sčítanie, odčítanie, násobenie a delenie 16-bitových čísel. Trošíčka problém bol, že násobenie a delenie som vtedy vedel iba v cykle, postupným pripočítavaním alebo odpočítavaním. Literatúra s lepšími algoritmami v socíkovských školách neexistovala, poradiť tiež nemal kto. Takže násobenie 65536 x 1 trvalo 65536 iterácii programu. Delenie 65536 / 1 rovnako. Ešte stále si pamätám, ako pri takýchto hraničných hodnotách na chvíľu zhasol display na SB8035 a potom zobrazil správny výsledok. Dnes už to viem aj rýchlejšie, iterácii stačí toľko, koľko bitov majú operandy. Treba pozrieť GITHUB.

Assembler/Linker
Na preklad MON48 som použil Telemark Assembler vo verzii 3.2, ktorá beží natívne pod Windows. Telemark upozorní, ak nájde relatívny skok mimo aktuálnej stránky. S kratším kódom pre MCS-48 som vyskúšal aj Macro Asembler AS, ktorý je použitý na BIOS pre NCB85 a tiež ASXXXX assembler, ktorý je použitý pre programy na CP/M kompilované pomocou SmallC kompilátora. ASXXXX má aj linker a možnosť projektov pozostávajúcich z viacerých zdrojových file. Obidva tieto assemblery tiež správne detekujú nepovolené relatívne skoky mimo stránky. Vyskúšal som aj XASM48 čo je Avocet 8048 Cross Assembler pre moje obľúbené CP/M. S Wordmasterom by to bolo super CP/M vývojové prostredie. Už len nejaký ten programátor 874x pre NCB85 chýba.

Záver
MON48 má ešte rezervy, viac ako 256 byte z 1024 je stále nevyužitých. Je možné dorobiť breakpointy, fill alebo iné príkazy. Bolo by zaujímavé naportovať Petr(a)48 na NCB48 a terminál. Ale zatiaľ sú moje vedomosti o Petrovi nedostatočné. Pohodlie Arduina alebo aspoň ISP programovania rady MCS-51 procesory rady MCS-48 s alebo bez EPROM nikdy neponúknu. Ale práve prítomnosť EPROM, prípadne externej EPROM ich robí magickou. Mazať si EPROMku cez priehľadné okienko UV svetlom a sledovať stopky, zapísať program do EPROM napätím 25 voltov, to je dnes už rarita. Presne takýto zážitok ponúka NCB48 a SAP48.
MON48 je na GITHUBe tu

No comments:

Post a Comment