Motiváciou na toto cvičenie bol sud piva, ktorý som doviezol na tohtoročný Forever.
Po jeho narazení vyvstala otázka ako zaplatiť na bare za orosený krígeľ, keď niekto nemá drobné. Väčšina bankových aplikácií, ktoré máme na svojich sm(a)rt fónoch dokáže generovať QR kód, ktorý si druhá strana načíta, skontroluje údaje, sumu a potvrdí platbu. Čo však prinieslo problémy bol pokus o cezhraničné platby, keď vzácni hostia z Čiech či Poľska nevedeli načítať kód vygenerovaný slovenskou pobočkou banky operujúcej vo všetkých troch krajinách – mBank. Preto by asi stačilo zakódovať do podoby QR číslo účtu a nechať bežnú QR čítačku len skopírovať IBAN, na ktorý by mala prísť platba.
Na to sa už však bežná banková aplikácia použiť nedá a treba nejaký iný QR generátor. Väčšina z nich je on-line, len pripojenie na net nebolo v kulturáku najspoľahlivejšie, takže to nejakú chvíľu zabralo sa na jeden z nich dostať.
Tiež som nemohol byť na bare stále, aby som strkal pod nos kód z môjho telefónu všetkým piva chtivým. Takže prišla na rad tlač QR kódu. Hoci tlačiarne sme nejaké so sebou mali, tak buď chýbal kábel, ovládač alebo papier. Nakoniec sa nám podarilo vygenerovaný QR kód poslať emailom Heni, ktorá nám ho doma vytlačila a priniesla na akciu.
Som sa naštval, že všetky tieto moderné technológie sú akurát na milú kedveš a rozhodol, že nabudúce už budem mať riešenie hodné SinDiKatnika a teda generátor QR kódu na ZX Spectre, ktorý budem vedieť vytlačiť cez ZX Printer – alebo teda v mojom prípade Timex Sinclair TS 2040.
Na takýto ambiciózny projekt som si potreboval vyhradiť nejaký ucelenejší časový blok najlepšie cez víkend a tak sa vhodná príležitosť naskytla práve na jarnom stretnutí (prevažne) Sharpistov v penzióne vo Vrbiciach.
Martin Černý už vyzýval umelú inteligenciu, aby nám povedala čo bude takáto aktivita obnášať, no pri odpovedi typu “Vytvořit plnohodnotný QR kód na ZX Spectru je extrémně složité, ale teoreticky možné”, mi už nič nebránilo pustiť sa do toho. Tu by som kľudne mohol použiť staré dobré “Nehovorte, že sa to nedá, lebo sa nájde blbec ktorý to urobí”.
Našiel som teda generátor QR kódu na iný osembitový procák resp. mikrokontrolér – Atmel AVR. V Arduino IDE si pridáme v knižniciach (Tools -> Manage Libraries) QRCode od Richarda Moora:
Takto získame hlavnú časť programu qrcode.c
a hlavičkový súbor qrcode.h
. V príkladoch sa potom objaví tiež cca. 50 riadkový skeč QRCode.ino
. No a teraz nastal ten okamih ako toto všetko preniesť a skompilovať pre Spektrum.
S SDCC som sa tu už pred nejakým časom hral v projekte čítačky SD karty na Centronics porte +3 (sakra to už má 11 rokov), tak som si povedal, že je najvyšší čas sa mu znovu pozrieť na zúbok. Tento pôvodný projekt som kompiloval vtedajšou najnovšou verziou 3.4, no dnes mám v distribúcii Linuxu nainštalovanú verziu 4.2.
V zdrojákoch od Richarda Moora sa nachádza zopár dynamických deklarácií veľkosti polí (VLA), ktoré gcc
skrývajúce sa “pod kapotou” Arduino IDE nemá problém prechrústať, ale SDCC nám s prehľadom vyhubuje, aj keď mu špecifikujeme prepínač –std-c99
. Pavel Vymetálek mi poradil prerobiť to na statickú deklaráciu konštantou a keďže klasické Arduino Uno s ATmega328 má dokopy len 2KiB RAM, tak som sa rozohnil a každému z tých (tuším) piatich polí doprial grandiózne 2KiB v adresnom priestore Z80.
Následne som len pridal rutiny na vykresľovanie vypočítaného poľa bodov na obrazovku cez PLOT rutinu v ROM a generátor bol v podstate hotový. Predsa len prepisovať tých 900 riadkov kódu v C do assembleru Z80, by mi zrejme zabralo viac ako jeden deň.
Najviac času som strávil úpravou prilinkovávaných súčastí crt0_zx.s
, putchar.s
, ktorých štruktúra sa oproti predchádzajúcej verzii 3.x zmenila, následne som upravoval ešte zostavovací skript (build
), aby obsahoval len nevyhnuté súčasti a tiež obsahoval správne cesty. Tiež som sa trochu natrápil, aby som vedel odovzdať parametre z Basicu do C. Tam mi už pomohol disassembling zostavenej binárky, aby som mohol napoukovať čo do QR kódu vlastne chcem dať.

Záverečné rozuzlenie: generovanie QR kódu verzie 3 s 29×29 segmentami trvá na 3,5MHz Z80 niečo cez 2 minúty, takže bežať to na reálnom železe je naozaj len pre trpezlivých. Po objavení sa QR kódu na obrazovke, stačí dať z Basicu COPY
a máme ho aj vo fyzickom svete, ak je teda pripojený ZX printer alebo kompatibilný.

Zdrojáky pripravené na skompilovanie sú tu.
Výsledná TAPka tu.
Libora Lasotu výsledok môjho snaženia v sobotu večer zaujal, takže sa možno čoskoro dočkáme generátora aj na PMD 85 alebo SAPI.
Príjemné QR-kovanie,
Ikon
Pekné, moc pekné. Ovšem na SHARP akci by to chtělo psát na jaký počítač, ha?
@martinlukasek keď mi dáš adresu plot rutiny v ROM, tak to upravím aj na Sharpa. Dokonca som dostal tip na niečo omnoho rýchlejšie, napísané v asembleri, čo by stálo za úvahu zobrať na milosť https://github.com/leiradel/qrc1
Spätné upozornenie: SHARP setkání Vrbice – jaro 2025 | Martinův 8-bitový blog
Čo tam počíta 2 minúty? Budem musieť poštudovať