Friday, March 26, 2021

NCB85 20. Virtuálny disk

XMODEM je geniálny program. Umožňuje prenos súborov cez ten istý sériový kanál, cez ktorý prebieha komunikácia s konzolou CP/M. V rámci terminálovej session operátor komunikuje s CP/M a v prípade potreby spustí XMODEM a prenesie súbor z alebo na počítač s terminálom. Hyperterminál na WIN takisto podporuje XMODEM protokol, takže nie je treba nič viac.

NCB85V3 je jednodoskáč pre retro fandov, ktorí si chcú užiť zázrak elektromechanického ukladania dát na magnetické médium. Vyhrabať staré diskety, mechaniky, očistiť ich, naolejovať, pozapájať káble a sledovať ako neviditeľná inteligencia roztáča motory mechaník a hýbe hlavami. Lenže akokoľvek moc našim ušiam lahodí zvuk disketovej mechaniky v noci občas nechceme rušiť a nie každý má pochopenie. Hudobný sluch je skrátka výsada. Druhá vec je, že keď na PC kódim v Small C/ASM a v DDT na CP/M debugujem, každá zmena v kóde si vyžaduje nový a nový prenos súboru. Keď to človek robí už cca 20krát, čaro a fascinácia neochabujú, ale čas uteká. A ten druhý sériový port na MUARTe je pritom taký nevyužitý.

Potom je tu problém prvotnej diskety. Stačí jedna disketa s jediným programom XMODEM. Z nej nabootovať, posťahovať z PC CP/M programy, dáta. Vytvoriť si ďalšie a ďalšie diskety naformátovaním cez FDC.COM a kopírovaním dát cez PIP.COM. Lenže ako vytvoriť tú úplne prvú disketu? A je tu aj skupina užívateľov ktorú diskety neberú. Stačí im, že majú funkčné CP/M a vedia si presúvať obsah medzi CP/M a PC. Odteraz už nie je NCB85V3 iba jednodoskáč pre fandov diskiet. Už je pre všetkých. Pretože tu máme virtuálny disk.

Na strane PC je to aplikácia, ktorá schrúme súbory na hostiteľskom disku a na strane CP/M vidíme ... tie isté súbory. Cez druhý sériový port (čo u NCB85 nie je problém) sa prenáša obsah virtuálneho disku na hostiteľskom PC. Všetko čo je na PC vidíme v CP/M. Do BIOSu pribudli kratučké rutiny na prenos obsahu jedného sektoru z a do virtuálneho disku. To je všetko.
Zelené sú alokačné bloky adresára, červené sú pre súbory.

Pustím si FDC.COM a naformátujem si prvú disketu. Nakopírujem na ňu XM5.COM (XMODEM) a už môžem vyrábať diskety s ľubovoľným obsahom donekonečna. Alebo iný prípad. Aby som nemusel pri ladení programu znova a znova presúvať COM súbor cez XMODEM stačí, aby sa pri kompilácii dostal nový súbor do IN adresára. Virtuálny disk skanuje obsah IN na PC a všetko čo uvidí pridá do CP/M filesystému. Na strane CP/M potom stačí stlačiť CTRL-C na refresh obsahu. A máme nové COMko. Hurá do DDT nastaviť breakpointy a debugovať.

Prenos funguje obojsmerne. Takže zmeny v CP/M filesystéme sú viditeľné vo virtuálnom disku. Stlačením tlačítka Export sa všetky súbory uložia na hostiteľský disk do OUT adresára. Virtuálny disk je generický, to znamená mal by fungovať s akýmkoľvek CP/M systémom. Stačí si zmeniť nastavenia v YML súbore a doplniť pribalené mini rutiny do BIOSu svojeho CP/M.

Program je aj na GITe. Inštalačný postup je v install.txt Stačí mať Javu 11 a vyššiu a spustit to:-) RARko sa dá stiahnuť tu.

NCB85 19. V3 ROM Menu

NCB85V3 je spätne kompatibilné s NCB85V2, ale má jedno vylepšenie. Namiesto EPROM 2764 podporuje už 27256. Pri 2764 som musel oželieť MON85 (4kB) aby sa do obmedzených 8kB vošli aj CP/M (5.5kB) aj BIOS. Pri 27256 máme kapacitu 32kB tak sa obmedzovať nemusíme.

Takže slávime návrat skvelého MON85 vo verzii 1.2 kde Roman Bórik pridal podporu nedokumentovaných inštrukcií CPU 8085. Miesta bolo stále dosť. Tak som pridal BIOSy pre rôzne verzie disketových mechaník a pre novinku, virtuálny disk.

Po zapnutí si stačí vybrať:


Priestor v EPROM je rozdelený nasledovne.
0000-0FFF Monitor 85
1000-1300 Menu
1300-2900 BDOS DD00 (for BIOS F300)
2900-3F00 BDOS DE00 (for BIOS F400)
3F00-4800 BIOS VD+2x144 (F300)
4800-5100 BIOS VD+2x120 (F400)
5100-5A00 BIOS VD+2x360 (F400)
5A00-6300 BIOS 3x144 (F400)
6300-6C00 BIOS 3x120 (F400)
6C00-7500 BIOS 2x144+1x500k (F400)
7500-7E00 BIOS 2x120+1x500k (F400)
7E00-8000 free


Obsah EPROM sa dá stiahnut tu. Zdrojové kódy nedávam do GITu, pretože je to stále v bastel fáze. Vychádzajú z posledného BIOSu V3, ktorý je v GITe. Obsah EPROM 27256 sa nedá celý vybuildovať na jedno spustenie. Rozdiely medzi BIOSmi s virtuálnymi diskami a bez nich som nedokázal narýchlo vyriešiť IF a ENDIF v zdrojových kódoch BIOSu. Takže pri výrobe obsahu EPROM si pomáham aj ručne, kopírujem obsah podadresárov so zmodifikovaným kódom do hlavného adresára.

Saturday, August 8, 2020

Oscillator TTL

Postaviť dobrý oscilátor riadený kryštálom nie je jednoduché. Musí byť necitlivý na zmeny napájacieho napätia a teploty ale hlavne musí vždy kmitať. Na nete je zopár schém, ale väčšinou pre ne platí, že sa to dá aj lepšie. Buďto preťažujú kryštál, alebo pracujú na hranici v inom parametri. Známa schéma s dvomi hradlami preťažuje oscilátor, ten má preto veľmi nízke Q a obvod sa nemusí vždy rozkmitať. A ak je aj iná schéma lepšia tak nakoľko TTL rodina má veľa typov a radov, vyvstáva otázka ktorý rad a konkrétny typ použiť. Občas sa dokonca vyskytnú aj chyby typu, že niekto použije známu schému s 7404 hradlami, ale v rámci nejakej nepozornosti, nevedomosti alebo optimalizácie počtu čipov sa rozhodne použiť 7414, čo je Schmitt ekvivalent 7404. Takýto oscilátor určite nebude kmitať na očakávanom kmitočte.

” I have a 16 MHz quartz crystal that I’ve hooked up with a Pierce oscillator circuit (diagram attached) and which oscillates at the wrong frequency, around 40 kHz.”
“A Schmitt trigger won’t work in this kind of circuit. Use a 74HC04 instead. I think the first inverter in your CMOS Crystal Oscillator circuit has to be linear, and should be unbuffered.”
“Thank you, that was the problem.”

Krátke zhrnutie je takéto: nikdy nepoužívat Schmittove hradlá a radšej nikdy nepoužívať buffered typy. Pokiaľ možno používať CMOS typy, Pierce topológiu oscilátora a vyhýbať sa LS alebo ešte starším TTL. Prvý stupeň oscilátora by mal pracovať v lineárnom režime. Pre oscilátory sú výhodné špeciálne unbuffered typy ako napr. 74HCU04, 74LVCU04. Čo sú buffered a unbuffered je vysvetlené napr. v "Texas Instrument - Application Report SCHA004 - October 2002". Ďalšie výborné zdroje informácii o oscilátoroch sú "Texas Instrument -Application Report SZZA043 - January 2004" a šlabikár oscilátorov "Fairchild Semiconductor Application Note 118 October 1974".

Ja som sa trošku pohral s oscilátormi v rámci návrhu NCB48 a nakoniec som použil hotový oscilátor. Ono je to tak, buďto má čip vlastný oscilátor (8085, 8048, 74HCT4060), alebo to nebude robiť to čo má:-) Výrobca to má väčšinou zvládnuté na stopro a my len pripojíme kryštál a pár pasívnych súčiastok, alebo použijeme hotový oscilátor, alebo prídeme s nejakým nie moc dobrým riešením. Lenže nie vždy sa podarí nájsť požadovaný hotový oscilátor na trhu, TTL oscilátory už vymierajú a aj výber frekvencií je nižší ako u samotných kryštálov. Tiež môže nastať situácia, že potrebujeme tri rôzne oscilátory, ale kúpiť sa dajú len po 10 kusov. Namiesto kupovania 30ks by bolo lepšie mať univerzál 3ks a osadiť si ich podľa potreby.

Preto som sa rozhodol vyskúšať obvody od Philipsu špecificky navrhnuté pre oscilátory. Prvý je 74LVC1GX04. Kombinuje v sebe funkčnosť buffered a nebuffered hradiel 7404, je typu CMOS, funguje od 1.65V do 5.5V a je v miniatúrnom puzdre TSOP6.



Navrhol som dve doštičky. Jedna má vývody ako štandardný Half-Can TTL oscilátor a má rozmery DIP-8. Napájanie +5V je klasika pin 8, GND je pin 4, výstup je pin 5. Pin 1 je NC. Osadil som ju do NCB48. Používa 1206 SMD rezistory a kondenzátory. Preto je obtiažne na nej experimentovať a hľadať použiteľné hodnoty pasívnych súčiastok.
Druhá doštička je experimentálna, osadzuje sa klasickými odpormi a kondenzátormi. Ja som ju osadil iba zdierkami zo socketov. Takže môžem bez letovania vymieňať súčiastky a hľadať rozsah použiteľných hodnôt.

Druhý obvod, ktorý som vyskúšal je 74HCT6323A. Puzdro SOT96-1, rozsah napájania 3-6V. Je trošku drahší, ale obsahuje preddeličku. Preto sa môže použiť kryštál, ktorý kmitá na násobku požadovanej frekvencie. Podobne ako u 74LVC1GX04 som vytvoril dve verzie. Jedna je s vývodmi ako Full-Can TTL oscilátor a má rozmery DIP-14. Používa 1206 SMD súčiastky.

Druhá verzia je zase experimentálna, osadená zdierkami na rýchlu výmenu klasických súčiastok.



Použitý kryštál 16.666MHz a zapojenie preddeličky /2 dáva na výstupe z oscilátora 8.333MHz so striedou perfektných 50%. Namiesto 2k2 rezistoru som musel použiť kondenzátor 47p (fungoval aj 68 a 75), presne ako sa píše v datasheete. Rozmermi aj frekvenciou pasuje do Atari XF-551.
Všetky doštičky sa dajú objednať na OSH Park https://oshpark.com/profiles/archeocomp

Saturday, November 16, 2019

Blog wait-state

Do 8-bitovej retro komunity pribudol nový blog z najväčšej die.. z Prievidze :-)
wait-state.blogspot.com

Marián tu bude popisovať svoje počiny. Hneď na úvod má lahôdku v podobe nádherne prevedenej úpravy Consul klávesnice a jednej historickej perličky.

Wednesday, October 2, 2019

DCF-77 decoder

Niekde som čítal, že dnes sa už asi nikto do projektov s 8048 nebude púšťať. Napísal som program pre 8048 na dekódovanie časového signálu DCF-77 z Mainflingenu. Vysiela sa od roku 1970 výkonom cca 50kW a ako jediný v Európe ešte nejakú dobu určite bude. Program je síce bohato okomentovaný, ale aj tak by som ho o pár rokov asi márne lúštil, tak tu je rámcový opis. Program je na Githube tu: https://github.com/ncb85/ncb48/tree/master/dcf77

Ako sa vysiela DCF-77 je krásne vidno tu: DCF-77 Live


Na obrázku je vyznačené, kde sa nachádzajú minúty a hodiny (formát je BCD+parita - dvojkové číslo sa číta zprava, nie zľava ako je zvykom)

Signál má sekundový takt. Logická 1 má na začiatku sekundy 200ms vysokú úroveň, po zvyšok je signál v nízkej úrovni. Logická 0 má na začiatku sekundy 100ms vysokú úroveň, zvyšok nízku. 8048 má hodiny 4.9152MHz, čo dáva takt timer prerušenia 40Hz. To znamená, že sekunda je vzorkovaná 40x. Pre logickú 1 musí byť prvých 8 vzoriek vo vysokej úrovni a pre 0 iba štyri vzorky. 8 a 4 sú celkom výhodné čísla. Jeden byte je 8 bitov.

Takto nejako:
jednotka         1111111100000000000000000000000000000000
nula                1111000000000000000000000000000000000000
60. sekunda    0000000000000000000000000000000000000000

Jeden byte RAM používam ako posuvný register. Pri každom prerušení nasuniem aktuálnu logickú úroveň do byte zprava. Bit naľavo vypadáva. Potom si rozdelím byte na dve polovice. A spočítam koľko jednotiek je v každej polovici. Ak nájdem jednu polovicu takú a druhú onakú, tak máme prechod z jedného stavu do druhého. Vtedy si nastavím ďalší pomocný byte ako counter a počítam čas od do. Vyhodnocujem dĺžku vysokej úrovne pulzu a kontrolujem min./max. šírku obidvoch častí pulzu. Výsledkom sú v sekundovom takte pulzy 1 alebo 0 (ako na obrázku hore), alebo chyba. Toto sa deje v prerušení od timer, preto aj názov - timer.asm   Z princípu funkcie vyplývajú dve veci: program (ale nie čas hodín) je 4 prerušenia (0.1s) oneskorený za vysielaním a prerušenie sa vykonáva 40x za sekundu ale výstup z neho (PULSE_VALID) je iba 1x za sekundu.

O úroveň vyššie je decoder.asm. Nepracuje už v prerušení, ale v hlavnej slučke. Tam z pulzov vychádzajúcich z timer.asm dekóduje čas. Čas je priamo v BCD. Výsledný čas okrem kontroly na paritu kontrolujem aj formálne, aby nebol napr. 28:62. Ako je známe maximum je 23:59 :-) Kontrolujú sa aj bity 1 a 20, ktoré majú vždy pevnú hodnotu 0 resp. 1. Okrem toho kontrolujem prítomnosť kompletnej sekvencie pulzov. Aj posledná sekunda (samé 0) sa musí objaviť len v dobe pre ňu určenej. Po uplynutí aktuálnej minúty sa nastavuje nový čas z vysielania, samozrejme ak prešiel všetkými kontrolami. Kontroly sú také poctivé, že zatiaľ som nikdy nevidel falošný čas.

Aktuálny čas 8048 sa posúva pri každom prerušení v clock.asm S výhodou sa využíva inštrukcia DA A na počítanie s BCD číslami. A nakoniec sa aktuálny čas zobrazuje. Dá sa aj staticky aj multiplexne. Pre rôzne moduly displayov sú rôzne asm file. dis2x595.asm je pre 8-miestny multiplexovaný modul z eBay (hľadaj 74HC595 LED display), disNx595.asm je pre statické 2,3,4 miestne zreťazené moduly z eBay (hľadaj 74HC595 static LED display)

Pridal som aj modul s čipom DS1302 zálohovaným batériou CR2032, aby sa mohli hodiny aj vypínať. DS1302 je obvod hodiniek s tepelne nekompenzovaným externým kryštálom 32.768kHz a za deň si v kľude ubehne aj pár sekúnd od presného času. Za mesiac to ide do minút. Po zapnutí sa preberie čas z DS1302 a po rozlúštení časového signálu, čo môže trvať aj dlhšiu dobu, sa čas upraví na presnú hodnotu.

Pripojenie prijímača DCF je do vstupu T0. Momentálne su pulzy invertované, lebo ich prevádzam na TTL úroveň jedným NPN tranzistorom - výstup je z kolektoru. Ak by boli pulzy neinvertované, je treba zmeniť inštrukciu JT0 na JNT0 (v timer.asm)
_TCIN2   CLR C
         JT0 _TCIN3
Výstup na riadenie display a komunikácie s DS1302 je na porte P1.
P1.0 data pin of display
P1.1 clock pin of display
P1.2 latch pin of display
P1.3 data pin of DS1302
P1.4 clock pin of DS1302
P1.5 CE pin of DS1302

Sunday, June 2, 2019

SAP48 1. Programmer

Pre ROM/EPROM typy členov rady MCS-48 potrebujeme aj programátor a čítačku programovej pamäte. Na programovanie sú potrebné dve napätia 25V a 23V, prípadne 21V a 18V, podľa toho či máme NMOS alebo HMOS obvod. Tesly sú NMOS. Pri ROM verziach je treba znížiť napätie VDD na 12V a druhé napätie PROG odpadá. Programátor TL866 (de facto nový bastler štandard) a podobné už 8748 nepodporujú. Asi kvôli tým dvom napätiam. Arduino Mega stojí cca 7,- EUR a má 8kB RAM a my potrebujeme 1kB alebo 2kB na dáta programovej pamäte 874X a pár byte na premenné programu. Arduino Uno je lacnejšie, ale má iba 2kB RAM, čiže pár byte by pri 8749 chýbalo. Takže som navrhol shield pre Megu so zero insertion force socketom a pár súčiastkami k tomu.



Na doske sú dve LED pre kontrolu ALE signálu. Ak svietia približne rovnakým jasom, tak je čip funkčný a generuje ALE signál. Ak nesvietia rovnako, niekde je problém a pokus o programovanie čipu by bol fatálny. Prúd LED v kľudovom stave nie je rovnaký, ale ALE (ale to sú náhody) signál je silne nesymetrický a jeho prítomnosť pôsobí tak, že obidve svietia rovnako silno. Pri inej svietivosti LED to môže byť trošku rozdielne, ale vždy by sa mali približne vyrovnať.

Ďalšia LED ukazuje prítomnosť napájacieho napätia 5V a posledná signalizuje keď je na PROG vstupe vysoké programovacie napätie. Potrebné napätia sú stabilizované pomocou troch kusov LM317. Vo Willem programmeri je hardwarovo nemožné mať na PROG vysoké napätie ak je na EA nízke. Čo by bolo mimochodom tiež fatálne. Tu je to ošetrené iba softwarovo. Na rozdiel od Willlema a legendárnej konštrukcie "Univerzální programátor pamětí" v červenom AR 11/88 je tu ale PROG pin v neaktívnom stave naozaj floating a nie na 5V, čiže tak ako je to v dokumentácii výrobcu. Ale asi to nie je katastrofické, lebo Willem vie naprogramovať tieto čipy aj viac krát a nie iba prvý a posledný raz. Willem vytvára nižšie napätie 23/18V z vyššieho 25/21V zaradením 3 kusov diód .. čo nie je celkom dokonalé:-) Pretože požadovaná delta je v prvom prípade 2V a v druhom 3V.

Obslužný program je napísaný v jazyku Arduina. Komunikuje cez sériovú linku 9600 baud, 8-bit dáta, 1-stop bit, no parity. Je možné využívať aj zabudovaný terminál v Arduino prostredí, ale doporučujem použiť napr. Hyperterminál. Cez terminál nahráme Intel HEX do pamäti Arduina, skontrolujeme a naprogramujeme. Okrem programovania je možné aj iba čítať obsah ROM a EPROM programovej pamäte vložených čipov. Čítanie EPROM zároveň aj vyhodnotí, či je čip zmazaný (obsahuje samé nuly). Vždy napíše Chip is erased, ready to be programmed. alebo !!!Chip is not erased!!! ak EPROM nie je zmazaná. Program je tak trochu aj "blbuvzdorný". Podarilo sa mi poslať do Arduino program trošilínka presahujúci 1024 byte a pohoda. Nadbytočné byte odignoroval a 8748 správne naprogramoval.

Popis ovládania:
Cvýber typu 8748 (1kB) alebo 8749 (2kB)
Tvstup do testovacieho menu, kde je možné nakalibrovať napätia a otestovať funkčnosť tranzistorových spínačov
Lnahrá Intel HEX do RAM pamäte programátora
Hpošle obsah RAM pamäte programátora do terminálu vo forme Intel HEX
Pnaprogramuje obsah RAM pamäte programátora do čipu v sockete
Rprečíta obsah ROM/EPROM vloženého čipu a uloží ho RAM pamäte programátora
Vporovná obsah RAM s obsahom ROM/EPROM na čipe v sockete

Schéma je tu
Program je na GITHUBe tu

Doporučujem osadiť najskôr súčiastky, potom lišty s headrami a nakoniec socket. Rezistor R22 sa neosádza pozri DOPLNENIE. Pri R25 4k7 nie je dobre vidno hodnotu na doske. Programátor vyžaduje nastavenie správnych napätí ručne pomocou trimrov na doske. Preto nemožno bez prestavenia napätí striedať EPROMkové NMOS s EPROMkovými HMOS čipmi a ani ROM čipmi. Ja som nastavil 5.1V, 18.1V a 21.0V na vyskúšanie HMOS. Stabilizátor pre 5V má veľký úbytok a potrebuje chladič. Čip vložíme do programátoru, až keď sú všetky napätia skontrolované (položka menu T) a v nízkom stave, a tiež iba vtedy keď je Arduino napájané cez USB. Pre pokrytie aj HMOS aj NMOS napätí 21V-25V a 18V-23V je treba aby P1 a P2 mali hodnotu 2k. EPROM potrebujeme sem tam aj vymazať. Slnečný svit je slabý, ale kto nemá mazačku nemusí zúfať, pretože UV sterilizátor na zubné kefky z eBay funguje výborne a schváli ho aj manželka.

Programátor som otestoval na pár HMOS čipoch, aj násobne na tom istom čipe a s testom v doske NCB48 a bez nehody. Na oživenie bastlenia na MCS-48 by pre začiatok mohol tento komplex schém, dosiek a programov stačiť. Pár dosiek NCB48/SAP48 a súčiastok ešte nájdem, tak kto chce nech napíše. Rád by som zrealizoval programátor s SMD súčiastkami. Ešte by som ho rád celý vtesnal do 3D tlačenej krabičky ako napr. zmienený TL866.



DOPLNENIE: ozvali sa mi používatelia a záujemci o SAP48 a pri výmene skúseností a komunikácii sa zistilo nasledovné. HMOS verzia 8748H/8749H má občasný problém. Symptóm je taký, že sa naprogramuje pár byte a potom sa zistí chyba a programovanie sa zastaví. Pri inej konštalácii hviezd ten istý čip na druhý deň môže prejsť až do konca bez chyby. Identický problém (pri Willem programátore) aj s riešením je popísaný na vintage computer fóre tu: http://www.vcfed.org/forum/showthread.php?24379-Needed-Microcontroller-programming-(D8749). Príspevky #4,#6,#9,#11,#14
Takže sme ja a Marián osadili R22 odporom 1M s paralelne pripojeným kondíkom 4n7 (ja som našiel iba 680k odpor) a programovanie už zbieha bez zaváhania. Bude sa jednať o nejakú chorobu HMOS 8748/49, ktorá zdá sa postihuje aj HMOS EEPROM INTEL D2816. V datasheetu k D2816 na strane 2-31 dole v odstavci Vpp Pulse "píšou něco o tom, že Vpp musí růst exponenciálně (RC waveform)" ako si všimol Melsoft.

Zmenu som uviedol aj do schémy. Zatiaľ asi nikto neprogramoval NMOS verziu, ale tá by podľa linkovanej témy mala byť bezproblémová aj bez modu. Aj ja aj Marián aj Melsoft sme už bez problémov programovali aj TESLA NMOS MHB8748. Nakoľko sme už mali MOD z programovania HMOSov, tak sme len zvýšili napätia a fungovalo to aj na NMOS.
DOPLNENIE 2: zoznam podporovaných typov môžeme rozšíriť aj o 8741 a 8742. Marián vyskúšal a funguje.

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