{"id":931529,"date":"2024-12-20T22:33:17","date_gmt":"2024-12-20T21:33:17","guid":{"rendered":"https:\/\/sindik.at\/?p=931529"},"modified":"2024-12-21T07:27:59","modified_gmt":"2024-12-21T06:27:59","slug":"terminal-debugger-pre-z80","status":"publish","type":"post","link":"https:\/\/sindik.at\/?p=931529","title":{"rendered":"Terminal Debugger pre Z80"},"content":{"rendered":"\n<p>Mal\u00e1, ale u\u017eito\u010dn\u00e1 pom\u00f4cka pre v\u00fdvoj softv\u00e9ru pre procesory Z80 na re\u00e1lnom hardv\u00e9ri.<\/p>\n\n\n\n<!--more-->\n\n\n\n<p>V dne\u0161nej dobe, na rozdiel od 8-bitovej minulosti, v\u00e4\u010d\u0161ina akt\u00edvnych program\u00e1torov p\u00ed\u0161e k\u00f3d na modern\u00fdch po\u010d\u00edta\u010doch a na testovanie a ladenie pou\u017e\u00edva emul\u00e1tor. M\u00e1 to svoje v\u00fdhody, ako takmer pr\u00e1zdny st\u00f4l, mo\u017enos\u0165 p\u00edsa\u0165 k\u00f3d kdeko\u013evek \u010di kedyko\u013evek a vyu\u017e\u00edva\u0165 modern\u00e9 prvky ladenia. Netreba vysklada\u0165 cel\u00fd ekosyst\u00e9m historick\u00e9ho po\u010d\u00edta\u010da a n\u00e1ro\u010dne zaznamen\u00e1va\u0165 k\u00f3d na magnetof\u00f3nov\u00fa p\u00e1sku \u010di disketov\u00fa mechaniku pri ka\u017edej zmene k\u00f3du, ako to bolo be\u017en\u00e9 v minulosti.<\/p>\n\n\n\n<p>Ja s\u00e1m s\u00edce p\u00ed\u0161em v\u00e4\u010d\u0161inu k\u00f3du na PC, ale testujem ho na re\u00e1lnych po\u010d\u00edta\u010doch. Z m\u00f4jho poh\u013eadu je to r\u00fdchlej\u0161ie ako v emul\u00e1tore, na \u201cdva kliky\u201d m\u00e1m zkompilovan\u00fd k\u00f3d v po\u010d\u00edta\u010di prenesen\u00fd cez s\u00e9riov\u00fa linku a ihne\u010f vid\u00edm v\u00fdsledok svojho program\u00e1torsk\u00e9ho umenia. Ale ke\u010f\u017ee nie som g\u00e9nius ako Barnaby (<a href=\"http:\/\/www.computer-timeline.com\/timeline\/barnaby-and-rubenstein\/\">autor Wordstar, nap\u00edsal 137000 riadkov perfektn\u00e9ho k\u00f3du<\/a> v asembleri za 4 mesiace), a chybi\u010dky v k\u00f3de \u010dasto sk\u00fa\u0161aj\u00fa moju trpezlivos\u0165, t\u00fdch iter\u00e1ci\u00ed k dosiahnutiu po\u017eadovan\u00e9ho v\u00fdsledku b\u00fdva ve\u013ek\u00e9 mno\u017estvo. Niektor\u00e9 chyby sa v\u0161ak h\u013eadaj\u00fa dos\u0165 \u0165a\u017eko a ladenie tak zaber\u00e1 prive\u013ea drahocenn\u00e9ho \u010dasu. Preto som sa u\u017e d\u00e1vno rozhodol u\u013eah\u010di\u0165 si tento proces nejakou jednoduchou pom\u00f4ckou, a tak vznikol Tiny Debugger.<\/p>\n\n\n\n<p>Prv\u00e1 verzia zobrazovala registre a obsah pam\u00e4te na obrazovke po\u010d\u00edta\u010da. Probl\u00e9mom bolo, \u017ee sa v\u017edy \u010das\u0165 obrazovky premazala zobrazovan\u00fdmi \u00fadajmi, a tak ju bolo potrebn\u00e9 vopred uschova\u0165. Aj tak mi neuverite\u013ene pomohla s dokon\u010den\u00edm jednej hry, ktor\u00fa som vtedy p\u00edsal. K\u00f3d debuggera sa prilinkoval k projektu a vo vhodn\u00fdch miestach k\u00f3du sa doplnilo volanie debuggera ako break-point.<\/p>\n\n\n\n<p>Druh\u00e1 verzia bola doplnen\u00e1 o mo\u017enos\u0165 zasiahnu\u0165 do be\u017eiaceho programu, teda zmeni\u0165 registre, upravi\u0165 miesta v pam\u00e4ti a nastavi\u0165 vybran\u00fd port. Aby to bolo u\u017e\u00edvate\u013esky jednoduch\u00e9, bol debugger rozdelen\u00fd na dve \u010dasti: klientsk\u00e1 be\u017eala na testovanom syst\u00e9me, zatia\u013e \u010do riadiaca na PC, navz\u00e1jom komunikuj\u00fac cez s\u00e9riov\u00e9 rozhranie. Na tento \u00fa\u010del som vytvoril program pre OS Windows s u\u017e\u00edvate\u013esky pr\u00edvetiv\u00fdm prostred\u00edm pre zobrazenie a zmenu registrov \u010di obsahu pam\u00e4te.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/sindik.at\/wp-content\/uploads\/2024\/12\/ID_regs.png\"><img loading=\"lazy\" decoding=\"async\" width=\"448\" height=\"282\" src=\"https:\/\/sindik.at\/wp-content\/uploads\/2024\/12\/ID_regs.png\" alt=\"\" class=\"wp-image-931530\" srcset=\"https:\/\/sindik.at\/wp-content\/uploads\/2024\/12\/ID_regs.png 448w, https:\/\/sindik.at\/wp-content\/uploads\/2024\/12\/ID_regs-300x189.png 300w\" sizes=\"auto, (max-width: 448px) 100vw, 448px\" \/><\/a><\/figure>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/sindik.at\/wp-content\/uploads\/2024\/12\/ID_mem.png\"><img loading=\"lazy\" decoding=\"async\" width=\"450\" height=\"282\" src=\"https:\/\/sindik.at\/wp-content\/uploads\/2024\/12\/ID_mem.png\" alt=\"\" class=\"wp-image-931531\" srcset=\"https:\/\/sindik.at\/wp-content\/uploads\/2024\/12\/ID_mem.png 450w, https:\/\/sindik.at\/wp-content\/uploads\/2024\/12\/ID_mem-300x188.png 300w\" sizes=\"auto, (max-width: 450px) 100vw, 450px\" \/><\/a><\/figure>\n\n\n\n<p>Na stretnutiach Forever som t\u00fato utilitu predv\u00e1dzal Pavlovi, ktor\u00e9mu sa hne\u010f zap\u00e1\u010dila. Tento sp\u00f4sob ladenia programov je toti\u017e jedna z m\u00e1la mo\u017enost\u00ed, ktor\u00fa m\u00e1te, ak rob\u00edte programy pre nov\u00fd hardv\u00e9r, alebo chcete ovl\u00e1da\u0165 perif\u00e9rie, ktor\u00e9 emul\u00e1tory (zatia\u013e) nepodporuj\u00fa. Pavel v\u0161ak pou\u017e\u00edva na v\u00fdvoj Linux, tak\u017ee m\u00f4j debugger by nemohol priamo pou\u017ei\u0165. Po pos\u00faden\u00ed mo\u017enost\u00ed som preto navrhol tretiu verziu, ktor\u00e1 je nez\u00e1visl\u00e1 na v\u00fdvojovom syst\u00e9me. Na klientskej strane muselo d\u00f4js\u0165 k roz\u0161\u00edreniu k\u00f3du, ktor\u00fd zah\u0155\u0148a jednoduch\u00fd interpreter pr\u00edkazov.<\/p>\n\n\n\n<p>Na PC posta\u010d\u00ed spusten\u00fd \u013eubovo\u013en\u00fd termin\u00e1lov\u00fd program. Z laden\u00e9ho k\u00f3du sa potom len zavol\u00e1 vstupn\u00fd bod debuggera, ktor\u00fd na z\u00e1klade pr\u00edkazov obsluhy zobrazuje po\u017eadovan\u00e9 \u00fadaje. Vytvoril som dve verzie, v jednej sa vyu\u017e\u00edva existuj\u00faci z\u00e1sobn\u00edk, a je preto vhodnej\u0161\u00ed pre pr\u00e1cu v ROM, ale je potrebn\u00e9 po\u010d\u00edta\u0165 s ve\u013ekos\u0165ou d\u00e1t, ktor\u00e9 si debugger odklad\u00e1 na z\u00e1sobn\u00edk. Druh\u00e1 verzia si vytv\u00e1ra vlastn\u00fd z\u00e1sobn\u00edk a p\u00f4vodn\u00fd z\u00e1sobn\u00edk sa sna\u017e\u00ed nevyu\u017e\u00edva\u0165. Inak je spr\u00e1vanie oboch verzi\u00ed rovnak\u00e9. Ve\u013ekos\u0165 skompilovan\u00e9ho k\u00f3du je menej ako 2kB.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/sindik.at\/wp-content\/uploads\/2024\/12\/TD_regs.jpg\"><img loading=\"lazy\" decoding=\"async\" width=\"354\" height=\"130\" src=\"https:\/\/sindik.at\/wp-content\/uploads\/2024\/12\/TD_regs.jpg\" alt=\"\" class=\"wp-image-931532\" srcset=\"https:\/\/sindik.at\/wp-content\/uploads\/2024\/12\/TD_regs.jpg 354w, https:\/\/sindik.at\/wp-content\/uploads\/2024\/12\/TD_regs-300x110.jpg 300w\" sizes=\"auto, (max-width: 354px) 100vw, 354px\" \/><\/a><\/figure>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/sindik.at\/wp-content\/uploads\/2024\/12\/TD_flags.jpg\"><img loading=\"lazy\" decoding=\"async\" width=\"360\" height=\"82\" src=\"https:\/\/sindik.at\/wp-content\/uploads\/2024\/12\/TD_flags.jpg\" alt=\"\" class=\"wp-image-931533\" srcset=\"https:\/\/sindik.at\/wp-content\/uploads\/2024\/12\/TD_flags.jpg 360w, https:\/\/sindik.at\/wp-content\/uploads\/2024\/12\/TD_flags-300x68.jpg 300w\" sizes=\"auto, (max-width: 360px) 100vw, 360px\" \/><\/a><\/figure>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/sindik.at\/wp-content\/uploads\/2024\/12\/TD_write.jpg\"><img loading=\"lazy\" decoding=\"async\" width=\"486\" height=\"127\" src=\"https:\/\/sindik.at\/wp-content\/uploads\/2024\/12\/TD_write.jpg\" alt=\"\" class=\"wp-image-931534\" srcset=\"https:\/\/sindik.at\/wp-content\/uploads\/2024\/12\/TD_write.jpg 486w, https:\/\/sindik.at\/wp-content\/uploads\/2024\/12\/TD_write-300x78.jpg 300w\" sizes=\"auto, (max-width: 486px) 100vw, 486px\" \/><\/a><\/figure>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/sindik.at\/wp-content\/uploads\/2024\/12\/TD_dump.jpg\"><img loading=\"lazy\" decoding=\"async\" width=\"653\" height=\"141\" src=\"https:\/\/sindik.at\/wp-content\/uploads\/2024\/12\/TD_dump.jpg\" alt=\"\" class=\"wp-image-931535\" srcset=\"https:\/\/sindik.at\/wp-content\/uploads\/2024\/12\/TD_dump.jpg 653w, https:\/\/sindik.at\/wp-content\/uploads\/2024\/12\/TD_dump-300x65.jpg 300w, https:\/\/sindik.at\/wp-content\/uploads\/2024\/12\/TD_dump-500x108.jpg 500w\" sizes=\"auto, (max-width: 653px) 100vw, 653px\" \/><\/a><\/figure>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/sindik.at\/wp-content\/uploads\/2024\/12\/TD_port.jpg\"><img loading=\"lazy\" decoding=\"async\" width=\"218\" height=\"114\" src=\"https:\/\/sindik.at\/wp-content\/uploads\/2024\/12\/TD_port.jpg\" alt=\"\" class=\"wp-image-931536\"\/><\/a><\/figure>\n\n\n\n<p>Debugger reaguje na tucet pr\u00edkazov s parametrami. Na z\u00e1klade toho poskytuje relevatn\u00e9 inform\u00e1cie alebo vykon\u00e1va zmeny. Za niektor\u00fdmi pr\u00edkazmi s\u00fa povinn\u00e9 jeden alebo dva parametre, v\u00e4\u010d\u0161inou adresa a d\u00e1ta. Odde\u013eova\u010de medzi pr\u00edkazom a parametrami nie s\u00fa povinn\u00e9, a\u017e na pr\u00edpady, kedy by do\u0161lo k nespr\u00e1vnej interpret\u00e1cii d\u00e1t.<\/p>\n\n\n\n<p><code>R - v\u00fdpis registrov<br>A - zmena hodnoty registra alebo registrov\u00e9ho p\u00e1ru<br>F - v\u00fdpis stavov\u00e9ho registra F<br>M - v\u00fdpis pam\u00e4te<br>W - z\u00e1pis do pam\u00e4te<br>O - zmena portu<br>I - zistenie stavu portu<br>J - ukon\u010denie debuggera a skok na definovan\u00fa adresu<br>C - zavolanie podprogramu a n\u00e1vrat do debuggera<br>B - reset<br>Q - ukon\u010denie debuggera a pokra\u010dovanie v programe<br>H - zobrazenie n\u00e1povedy<\/code><\/p>\n\n\n\n<p>K\u00f3d obsahuje dve \u010dasti, jednu v\u0161eobecn\u00fa a druh\u00fa z\u00e1visl\u00fa na hardv\u00e9ri. V druhej treba prisp\u00f4sobi\u0165 rutiny na pr\u00edjem a odoslanie znaku cez s\u00e9riov\u00fa linku. V pr\u00edpade, \u017ee sa pou\u017e\u00edva bitbanging, treba da\u0165 pozor na \u010dasovanie. Pri p\u00edsan\u00ed pr\u00edkazu na kl\u00e1vesnici to nevad\u00ed, ale ak by sa pou\u017eila nejak\u00e1 forma odosielania preddefinovan\u00fdch pr\u00edkazov z termin\u00e1lov\u00e9ho programu, spracovanie prijat\u00fdch d\u00e1t by mohlo zlyha\u0165. Vtedy treba pou\u017ei\u0165 ni\u017e\u0161iu r\u00fdchlos\u0165 prenosu alebo prida\u0165 stop-bit.<\/p>\n\n\n\n<p>Zdrojov\u00e9 k\u00f3dy s\u00fa dostupn\u00e9 na <a href=\"https:\/\/sites.google.com\/site\/lost8bits\/sk\/8-pr%C3%ADstroje-a-meranie\/tdebugger\">mojom blogu<\/a>.<\/p>\n\n\n\n<p>Mimochodom, aj hra <a href=\"https:\/\/blog.stevewetherill.com\/2022\/02\/odin-computer-graphics-part-one-1985.html\">Nodes of Yesod<\/a> pre ZX Spectrum bola p\u00edsan\u00e1 na po\u010d\u00edta\u010di s CP\/M a testovan\u00e1 na ZX pren\u00e1\u0161an\u00edm d\u00e1t cez s\u00e9riov\u00fd port na Interface 1.<\/p>\n\n\n\n<p>Martin M1<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Mal\u00e1, ale u\u017eito\u010dn\u00e1 pom\u00f4cka pre v\u00fdvoj softv\u00e9ru pre procesory Z80 na re\u00e1lnom hardv\u00e9ri.<\/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":[5,6],"tags":[],"class_list":["post-931529","post","type-post","status-publish","format-standard","hentry","category-tema-2-hardware-php","category-tema-3-software-php"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/p5aqy8-3UkF","jetpack_likes_enabled":true,"jetpack-related-posts":[],"_links":{"self":[{"href":"https:\/\/sindik.at\/index.php?rest_route=\/wp\/v2\/posts\/931529","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=931529"}],"version-history":[{"count":2,"href":"https:\/\/sindik.at\/index.php?rest_route=\/wp\/v2\/posts\/931529\/revisions"}],"predecessor-version":[{"id":931539,"href":"https:\/\/sindik.at\/index.php?rest_route=\/wp\/v2\/posts\/931529\/revisions\/931539"}],"wp:attachment":[{"href":"https:\/\/sindik.at\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=931529"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/sindik.at\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=931529"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/sindik.at\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=931529"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}