Jednodesková výzva: první kolo

Tak, moji milí, doufám, že jste nažhavení do programování, že jste si oprášili stroják a že jste načerpali ducha jednodeskových počítačů z 80. let. Pojďme na to.

Nejprve pár věcí k samotné výzvě: rozhodl jsem se, že bude mít několik kol, a že bude mít dvě hlavní kategorie. První kategorií je Z80/8080, druhá kategorie je 6502. V každém kole zadám úkol, hodně volně, abych nechal prostor vaší tvůrčí energii a neotřelým myšlenkám, a každý, kdo úkol splní, dostane za dané kolo bod. Pokud udělá věci „nad plán“, dostane další body. Dva z vás (z každé kategorie jeden), co projdou celou výzvou a získají nejvíc bodů, na konci ode mne dostanou přesně ten jednodeskáč, co budu v průběhu celé výzvy stavět…

Podmínky jsou prosté. Píše se v assembleru pro ten který procesor, a soutěžní příspěvky musí být zveřejněny jako assemblerovský zdroják (tedy žádný HEX) v nějaké otevřené podobě. Ideálně na GitHubu jako repo nebo jako Gist. Do komentářů sem napište odkaz, a do zdrojáku pak nějaký kontakt na sebe. Nezapomeňte uvést licenci (doporučuju BSD, MIT nebo CC) a nezapomeňte na nějaký návod k obsluze.

Zadání pro první kolo je zde:

Máte holý počítač. To znamená jen procesor, paměti a jeden sériový port. Máte 1 kB RAM, 4 kB ROM a sériový obvod 6850 (nebojte, je velmi jednoduchý). Počítač nepoužívá přerušení. Napište pro takový počítač jednoduchý obslužný program (monitor), který bude umožňovat základní činnosti, tedy měnit obsah paměti a spouštět programy. Pokud zvládnete i víc funkcí, třeba debugování, breakpoint apod., budou body navíc.

Inspirace: třeba sériové rozhraní KIM-1…

Stroje:

Z80: 4kB ROM (0000h-0fffh), 1 kB RAM (8000h-83ffh), 6850 zapojena na IO portech 00h (řízení/status) a 01h (data).

6502: 4kB ROM (f000h-ffffh), 1kB RAM (0000h-03ffh), 6850 zapojena na adresách a000h (řízení / status) a a001h (data).

Pro jednoduchost prosím inicializujte 6850 pomocí zápisu hodnoty 15h do řídicího registru. Bližší info najdete třeba na Strojáku. Chybové stavy 6850 můžete ignorovat.

Vše je jasné? Tedy vzhůru do toho! Držím palce!

Příště: sedmisegmentovky a klávesnice.

PS: Můžete psát a ladit v online IDE ASM80.comzde je návod, jak si nastavit virtuální stroj…

Líbil se vám článek? Podpořte autora na Patreonu
Příspěvek byl publikován v rubrice Emulace, Hardware se štítky , , , , . Můžete si uložit jeho odkaz mezi své oblíbené záložky.
  • Roman Bórik

    Zvolené adresy pre 6850 sú zámerne 01h – CTRL, 02h – DATA? To by v tomto prípade musel byť na signál RS pripojený adresový signál A1. Aj v tomto prípade by som potom očakával, že bude pre CTRL zvolená adresa 00h.
    Obvykle je výberovým signálom A0 a potom CTRL=00h a DATA=01h.

  • Pardon, moje chyba, opravuju…

  • Václav Šlajs

    Jak dlouho budou jednotliva kola trvat? Zatim mam prvni „hodne uplacanou“ verzi, ale zacalo mne to bavit tak rozhodne jeste nekoncim 🙂 https://github.com/VelkyVenik/6502-monitor

  • Dám třeba dva týdny, to je tak reálné… Za bugrepo na ASM80, díky, mrknu na to, a k tomu zdrojáku: poslední řádek v bloku RESET je „JSR loop“. Nemělo by to být JMP? 🙂

  • Juggernaut

    Tak tady je můj příspěvek – kategorie Z-80: https://github.com/vlieber/jednodeskova-vyzva.git

    [ Omlouvám se za poněkud nesourodé formátování zdrojáků, hlavně velká/malá písmena. Na část kódu jsem použil zabudovaný formátovač z ASM80, který vše převedl na velká písmena. To se mi nelíbilo, ale už se mi nechtělo investovat do ručního přeformátovávání zpět… ]

  • Václav Šlajs

    Dva tydny, super. To mam jeste spoustu casu. Ano JMP tam ma byt, ale na funkcnost to JSR nema vliv, jenom ty dva bajty…:) Diky za upozorneni.

  • Ono to tak bývalo, že se v assemleru převáděla jména návěští na velká písmena, stejně tak na příkazy. Ten formatter ještě vylepším, díky za tip.

    Mimochodem, pokud chcete přeložit HEX na sérii DB, použijte http://www.asm80.com/tools/index.html#/ – to je teď úplná novinka

  • Ad readme: jesli máte na mysli „kopírovat HEX do konzoly v emulátoru“, to ještě vymyslím… 🙂 Hned jak najdu trošku času.

  • Já bych to neřešil vůbec, přehodil bych celý ten blok loop na místo toho JSR a unstrukci vypustil. Až tam budete přidávat další funkce, bude se to hodit! 🙂

  • Václav Šlajs

    Mne prave prislo ze se mi to takle bude hodit pro pridavani dalsich funkci.. Ale necham si jako assembler novacek poradit 🙂

    Jinak se mi podarilo opakovane nasimulovat problem na ASM80 s blokama, o kterem jsem psal. Jakmile dam neco do .block tak to skace o jeden byte dal nez by melo – https://gist.github.com/VelkyVenik/c92b363f5060f1d49fa93d394c9f5b8f

  • Díky, o víkendu na to sednu a opravím! A přidím i jednu novinku…

  • Chya objevena. Dělá to instrukce STA, pokud není během prvního průchodu jasné, jak bude dlouhá. Pokud se později, při dalších průchodech, zjistí, že lze použít kratší variantu, použije ji, ale block se už nerenderuje znovu…

  • Tak, k ASM80 jsem přidal:
    – možnost poslat soubor po sériové lince do emulátoru
    – zachytávání toho, co přijde po sériové lince
    – direktivy cstr, pstr, istr
    a opravil jsem chybu s vadnou adresací .block

    Zítra popíšu v článku

  • Václav Šlajs

    Zaludna chyba, opravdu uz jste to nasadil na web? Zkousim to a porad se mi to chova stejne spatne.

  • Kdepak, nasazoval jsem včera odpoledne. Navíc je to přes CDN, a to trvá, než se rozšíří 🙁

  • Testovací kód:

    .ORG $0

    LDA #$41
    STA test
    JSR far

    .block
    @far: nop
    .endblock

    test equ 4

  • Václav Šlajs

    Funguje, diky. A workspaces online, import z githubu atd.. tomu rikam jizda 🙂