{"id":931625,"date":"2025-04-10T22:03:44","date_gmt":"2025-04-10T21:03:44","guid":{"rendered":"https:\/\/sindik.at\/?p=931625"},"modified":"2025-04-10T22:03:44","modified_gmt":"2025-04-10T21:03:44","slug":"generovanie-qr-kodov-na-zx-spectre","status":"publish","type":"post","link":"https:\/\/sindik.at\/?p=931625","title":{"rendered":"Generovanie QR k\u00f3dov na ZX Spectre"},"content":{"rendered":"\n<p>Motiv\u00e1ciou na toto cvi\u010denie bol sud piva, ktor\u00fd som doviezol na tohtoro\u010dn\u00fd Forever.<\/p>\n\n\n\n<!--more-->\n\n\n\n<p>Po jeho narazen\u00ed vyvstala ot\u00e1zka ako zaplati\u0165 na bare za orosen\u00fd kr\u00edge\u013e, ke\u010f niekto nem\u00e1 drobn\u00e9. V\u00e4\u010d\u0161ina bankov\u00fdch aplik\u00e1ci\u00ed, ktor\u00e9 m\u00e1me na svojich sm(a)rt f\u00f3noch dok\u00e1\u017ee generova\u0165 QR k\u00f3d, ktor\u00fd si druh\u00e1 strana na\u010d\u00edta, skontroluje \u00fadaje, sumu a potvrd\u00ed platbu. \u010co v\u0161ak prinieslo probl\u00e9my bol pokus o cezhrani\u010dn\u00e9 platby, ke\u010f vz\u00e1cni hostia z \u010ciech \u010di Po\u013eska nevedeli na\u010d\u00edta\u0165 k\u00f3d vygenerovan\u00fd slovenskou pobo\u010dkou banky operuj\u00facej vo v\u0161etk\u00fdch troch krajin\u00e1ch &#8211; mBank. Preto by asi sta\u010dilo zak\u00f3dova\u0165 do podoby QR \u010d\u00edslo \u00fa\u010dtu a necha\u0165 be\u017en\u00fa QR \u010d\u00edta\u010dku len skop\u00edrova\u0165 IBAN, na ktor\u00fd by mala pr\u00eds\u0165 platba.<\/p>\n\n\n\n<p>Na to sa u\u017e v\u0161ak be\u017en\u00e1 bankov\u00e1 aplik\u00e1cia pou\u017ei\u0165 ned\u00e1 a treba nejak\u00fd in\u00fd QR gener\u00e1tor. V\u00e4\u010d\u0161ina z nich je on-line, len pripojenie na net nebolo v kultur\u00e1ku najspo\u013eahlivej\u0161ie, tak\u017ee to nejak\u00fa chv\u00ed\u013eu zabralo sa na jeden z nich dosta\u0165.<\/p>\n\n\n\n<p>Tie\u017e som nemohol by\u0165 na bare st\u00e1le, aby som strkal pod nos k\u00f3d z m\u00f4jho telef\u00f3nu v\u0161etk\u00fdm piva chtiv\u00fdm. Tak\u017ee pri\u0161la na rad tla\u010d QR k\u00f3du. Hoci tla\u010diarne sme nejak\u00e9 so sebou mali, tak bu\u010f ch\u00fdbal k\u00e1bel, ovl\u00e1da\u010d alebo papier. Nakoniec sa n\u00e1m podarilo vygenerovan\u00fd QR k\u00f3d posla\u0165\u00a0 emailom Heni, ktor\u00e1 n\u00e1m ho doma vytla\u010dila a priniesla na akciu.<\/p>\n\n\n\n<p>Som sa na\u0161tval, \u017ee v\u0161etky tieto modern\u00e9 technol\u00f3gie s\u00fa akur\u00e1t na mil\u00fa kedve\u0161 a rozhodol, \u017ee nabud\u00face u\u017e budem ma\u0165 rie\u0161enie hodn\u00e9 SinDiKatnika a teda gener\u00e1tor QR k\u00f3du na ZX Spectre, ktor\u00fd budem vedie\u0165 vytla\u010di\u0165 cez ZX Printer &#8211; alebo teda v mojom pr\u00edpade Timex Sinclair TS 2040.<\/p>\n\n\n\n<p>Na tak\u00fdto ambici\u00f3zny projekt som si potreboval vyhradi\u0165 nejak\u00fd ucelenej\u0161\u00ed \u010dasov\u00fd blok najlep\u0161ie cez v\u00edkend a tak sa vhodn\u00e1 pr\u00edle\u017eitos\u0165 naskytla pr\u00e1ve na jarnom stretnut\u00ed (preva\u017ene) Sharpistov v penzi\u00f3ne vo Vrbiciach.<\/p>\n\n\n\n<p>Martin \u010cern\u00fd u\u017e vyz\u00fdval umel\u00fa inteligenciu, aby n\u00e1m povedala \u010do bude tak\u00e1to aktivita obn\u00e1\u0161a\u0165, no pri odpovedi typu \u201cVytvo\u0159it plnohodnotn\u00fd QR k\u00f3d na ZX Spectru je extr\u00e9mn\u011b slo\u017eit\u00e9, ale teoreticky mo\u017en\u00e9\u201d, mi u\u017e ni\u010d nebr\u00e1nilo pusti\u0165 sa do toho. Tu by som k\u013eudne mohol pou\u017ei\u0165 star\u00e9 dobr\u00e9 \u201cNehovorte, \u017ee sa to ned\u00e1, lebo sa n\u00e1jde blbec ktor\u00fd to urob\u00ed\u201d.<\/p>\n\n\n\n<p>Na\u0161iel som teda gener\u00e1tor QR k\u00f3du na in\u00fd osembitov\u00fd proc\u00e1k resp. mikrokontrol\u00e9r &#8211; Atmel AVR. V Arduino IDE si prid\u00e1me v kni\u017eniciach (Tools -> Manage Libraries) QRCode od Richarda Moora:<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-rt.googleusercontent.com\/docsz\/AD_4nXezIHXow_o3njMuWAwffykkIzD5zpXo67hhJ_jY7NjMhWFaL_hXFPGVR5UhPBARETg-8vxkVMid-0p4-6xDJ5DaxcUhmnp4oaCp4qNNusxhHoL-diFfy-MU6UFlCUzkyspdKFE_MQ?key=eos9vmYSHvUewzEGBYvG1lt_\" alt=\"\"\/><\/figure>\n\n\n\n<p>Takto z\u00edskame hlavn\u00fa \u010das\u0165 programu <code>qrcode.c<\/code> a hlavi\u010dkov\u00fd s\u00fabor <code>qrcode.h<\/code>. V pr\u00edkladoch sa potom objav\u00ed tie\u017e cca. 50 riadkov\u00fd ske\u010d <code>QRCode.ino<\/code>. No a teraz nastal ten okamih ako toto v\u0161etko prenies\u0165 a skompilova\u0165 pre Spektrum.<\/p>\n\n\n\n<p>S SDCC som sa tu u\u017e pred nejak\u00fdm \u010dasom hral v projekte <a href=\"https:\/\/sindik.at\/?p=929780\">\u010d\u00edta\u010dky SD karty na Centronics porte +3<\/a> (sakra to u\u017e m\u00e1 11 rokov), tak som si povedal, \u017ee je najvy\u0161\u0161\u00ed \u010das sa mu znovu pozrie\u0165 na z\u00fabok. Tento p\u00f4vodn\u00fd projekt som kompiloval vtedaj\u0161ou najnov\u0161ou verziou 3.4, no dnes m\u00e1m v distrib\u00facii Linuxu nain\u0161talovan\u00fa verziu 4.2.<\/p>\n\n\n\n<p>V zdroj\u00e1koch od Richarda Moora sa nach\u00e1dza zop\u00e1r dynamick\u00fdch deklar\u00e1ci\u00ed ve\u013ekosti pol\u00ed (VLA), ktor\u00e9 <code>gcc<\/code> skr\u00fdvaj\u00face sa \u201cpod kapotou\u201d Arduino IDE nem\u00e1 probl\u00e9m prechr\u00fasta\u0165, ale SDCC n\u00e1m s preh\u013eadom vyhubuje, aj ke\u010f mu \u0161pecifikujeme prep\u00edna\u010d <code>\u2013std-c99<\/code>. Pavel Vymet\u00e1lek mi poradil prerobi\u0165 to na statick\u00fa deklar\u00e1ciu kon\u0161tantou a ke\u010f\u017ee klasick\u00e9 Arduino Uno s ATmega328 m\u00e1 dokopy len 2KiB RAM, tak som sa rozohnil a ka\u017ed\u00e9mu z t\u00fdch (tu\u0161\u00edm) piatich pol\u00ed doprial grandi\u00f3zne 2KiB v adresnom priestore Z80.<\/p>\n\n\n\n<p>N\u00e1sledne som len pridal rutiny na vykres\u013eovanie vypo\u010d\u00edtan\u00e9ho po\u013ea bodov na obrazovku cez PLOT rutinu v ROM a gener\u00e1tor bol v podstate hotov\u00fd. Predsa len prepisova\u0165 t\u00fdch 900 riadkov k\u00f3du v C do assembleru Z80, by mi zrejme zabralo viac ako jeden de\u0148.<\/p>\n\n\n\n<p>Najviac \u010dasu som str\u00e1vil \u00fapravou prilinkov\u00e1van\u00fdch s\u00fa\u010dast\u00ed <code>crt0_zx.s<\/code>, <code>putchar.s<\/code>, ktor\u00fdch \u0161trukt\u00fara sa oproti predch\u00e1dzaj\u00facej verzii 3.x zmenila, n\u00e1sledne som upravoval e\u0161te zostavovac\u00ed skript (<code>build<\/code>), aby obsahoval len nevyhnut\u00e9 s\u00fa\u010dasti a tie\u017e obsahoval spr\u00e1vne cesty. Tie\u017e som sa trochu natr\u00e1pil, aby som vedel odovzda\u0165 parametre z Basicu do C. Tam mi u\u017e pomohol disassembling zostavenej bin\u00e1rky, aby som mohol napoukova\u0165 \u010do do QR k\u00f3du vlastne chcem da\u0165.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/sindik.at\/wp-content\/uploads\/2025\/04\/QR_EnterText.png\"><img loading=\"lazy\" decoding=\"async\" width=\"644\" height=\"540\" src=\"https:\/\/sindik.at\/wp-content\/uploads\/2025\/04\/QR_EnterText.png\" alt=\"\" class=\"wp-image-931626\" srcset=\"https:\/\/sindik.at\/wp-content\/uploads\/2025\/04\/QR_EnterText.png 644w, https:\/\/sindik.at\/wp-content\/uploads\/2025\/04\/QR_EnterText-300x252.png 300w, https:\/\/sindik.at\/wp-content\/uploads\/2025\/04\/QR_EnterText-358x300.png 358w\" sizes=\"auto, (max-width: 644px) 100vw, 644px\" \/><\/a><\/figure>\n\n\n\n<p>Z\u00e1vere\u010dn\u00e9 rozuzlenie: generovanie QR k\u00f3du verzie 3 s 29&#215;29 segmentami trv\u00e1 na 3,5MHz Z80 nie\u010do <strong>cez 2 min\u00faty<\/strong>, tak\u017ee be\u017ea\u0165 to na re\u00e1lnom \u017eeleze je naozaj len pre trpezliv\u00fdch. Po objaven\u00ed sa QR k\u00f3du na obrazovke, sta\u010d\u00ed da\u0165 z Basicu <code>COPY<\/code> a m\u00e1me ho aj vo fyzickom svete, ak je teda pripojen\u00fd ZX printer alebo kompatibiln\u00fd.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/sindik.at\/wp-content\/uploads\/2025\/04\/QR_Output.png\"><img loading=\"lazy\" decoding=\"async\" width=\"644\" height=\"540\" src=\"https:\/\/sindik.at\/wp-content\/uploads\/2025\/04\/QR_Output.png\" alt=\"\" class=\"wp-image-931627\" srcset=\"https:\/\/sindik.at\/wp-content\/uploads\/2025\/04\/QR_Output.png 644w, https:\/\/sindik.at\/wp-content\/uploads\/2025\/04\/QR_Output-300x252.png 300w, https:\/\/sindik.at\/wp-content\/uploads\/2025\/04\/QR_Output-358x300.png 358w\" sizes=\"auto, (max-width: 644px) 100vw, 644px\" \/><\/a><\/figure>\n\n\n\n<p>Zdroj\u00e1ky pripraven\u00e9 na skompilovanie s\u00fa <a href=\"https:\/\/sindik.at\/data\/qr_build.zip\">tu<\/a>.<br>V\u00fdsledn\u00e1 TAPka <a href=\"https:\/\/sindik.at\/data\/qr_loader.tap\">tu<\/a>.<\/p>\n\n\n\n<p>Libora Lasotu v\u00fdsledok m\u00f4jho sna\u017eenia v sobotu ve\u010der zaujal, tak\u017ee sa mo\u017eno \u010doskoro do\u010dk\u00e1me gener\u00e1tora aj na PMD 85 alebo SAPI.\u00a0<\/p>\n\n\n\n<p>Pr\u00edjemn\u00e9 QR-kovanie,<br>Ikon<br><br><br><br><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Motiv\u00e1ciou na toto cvi\u010denie bol sud piva, ktor\u00fd som doviezol na tohtoro\u010dn\u00fd Forever.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2}},"categories":[6],"tags":[],"class_list":["post-931625","post","type-post","status-publish","format-standard","hentry","category-tema-3-software-php"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/p5aqy8-3Umd","jetpack_likes_enabled":true,"jetpack-related-posts":[],"_links":{"self":[{"href":"https:\/\/sindik.at\/index.php?rest_route=\/wp\/v2\/posts\/931625","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/sindik.at\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/sindik.at\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/sindik.at\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/sindik.at\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=931625"}],"version-history":[{"count":1,"href":"https:\/\/sindik.at\/index.php?rest_route=\/wp\/v2\/posts\/931625\/revisions"}],"predecessor-version":[{"id":931628,"href":"https:\/\/sindik.at\/index.php?rest_route=\/wp\/v2\/posts\/931625\/revisions\/931628"}],"wp:attachment":[{"href":"https:\/\/sindik.at\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=931625"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/sindik.at\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=931625"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/sindik.at\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=931625"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}