Popis príkazov monitora (dajú sa ukončiť CTRL-C), upload HEX nepotrebuje príkaz:
D | dump programovej pamäte, zadáva sa číslo stránky |
I | dump internej dátovej pamäte, autodetektne veľkosť 64 alebo 128 byte |
E | dump externej dátovej pamäte 256 byte v 8155 |
S | modifikácia programovej pamäte, zadáva sa adresa 000..FFF potom vstup jedného alebo viac byte |
M | modifikácia internej dátovej pamäte |
X | modifikácia externej dátovej pamäte |
G | skok na adresu 400H |
H | skok 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:
Frequency | Rate | Note |
1228800 | 100 | pre taktovačov |
11059200 | 90 | CMOS sa fláka |
9830400 | 80 | |
7372800 | 60 | |
6144000 | 50 | TESLA tu asi končí |
4915200 | 40 | |
3686400 | 30 | SAP48 |
2457600 | 20 | pre 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