PMI80
>... včetně výpočtů adres relativních skoků ...
Jenom takova drobnost - i8080 nemel relativni skoky, mel jenom absolutni skoky (instrukce C3) a jeho podminene varianty, tady uz si nejsem jisty kodama, snad C2, CA, D2, DA a tak dale. Relativni skoky mel az Z80 (kody 18, 12, 22, 1A, 2A jestli si dobre vzpominam). Dodnes si pamatuju odpocitavani F E D C B A 9 8 7 6 5 4 3 2 1 pri pocitani zpetnych skoku :-)
Vkladani loaderu v hexa kodech do pameti jsem taky provozoval. Vyrobil jsem ramdisk pro Sharp MZ821 a pri kazdem bootu jsem musel napsat v monitoru zavadeci rutinu, asi 20 bytes. Nastesti jsem potom nasel, ze v biosu uz byl zavadec pro jiny typ ramdisku a malou upravou hardwaru meho ramdisku jsem ho udelal kompatibilni, pak uz to bootovalo samo.
V článku jsem vyhodil "relativní", protože to mátlo. Ale myslel jsem to ale jinak - šlo mi právě o ten výpočet, že když někdo měl klasické `JNZ LOOP` a ten `LOOP` byl o pět instrukcí nahoru, tak si stejně musel dopočítat absolutní adresu.
A přidání další instrukce někam doprostřed kódu, to už bývalo na přepis (proto jsme na PMIčku dělali hodně NOPů, aby to nebylo nutný celý přepisovat).
(na druhou stranu mě u 6502 zase mátly skoky zpět, protože se mi blbě ručně počítala záporná čísla - vždycky jsem to hodil +- jednu adresu :-)
jojo, NOPove zony,, tech jsme si taky uzili jeste na TNS, kde jsme s kolegou delali interpreter FORTHu bez assembleru, vsechno v hexa kodech. To byly casy.
Ty kody uz z hlavy jen tak nedostanu. Udelal jsem si na to prehledny tabulky, ale ne takovy, jaky jsi daval do clanku. Tabulku 16x16 , vodorovne nizsi nibble, svisle horni nibble a do policek jsem napsal instrukce. Mozna to jeste nekde mam, to uz je kus historie. Jedna tabulka pro zakladni instrukce, druha pro extended (s prefixem ED). Napriklad ED B0 LDIR, moc uzitecna instrukce. Ovsem treba bitove operace jsem si nikdy nepamatoval, ty jsem moc nepouzival (prefix CB). .
Vidim, ze si spis pamatujes dekadicke kody - to bude nasledek Alesova uceni. Ja jsem se ho snazil preorientovat na normalni (cti hex) soustavu, ale on byl proste dekadickej. Ovsem pak nemas sanci si zapamatovat souvislosti, protoze instrukce jsou (logicky) v grupach podle urcitych bitu. Treba podminene skoky jsou ve sloupci 10,20,30,18,28,38. nebo LD registr,registr v zone od 40 do 7f s vyjimkou 76, coz by byla instrukce ld (hl),(hl) , ale je to instrukce halt - asi se jim to zacyklilo, tak to uz tak nechali :-).
Nedalo mi to, ted jsem sel hledat tabulku Z80 po internetu, tohle je ona: https://www.ticalc.org/archives/files/fileinfo/434/43427.html . Ted kdyz to konfrontuji s tim, co uz jsem napsal, vidim, ze jsem se trefil vsude.
Tyhle skupiny hexa čísel mi probudily paměť, až se divím. Tabulku pro 8080 (později pro Z80) jsem tenkrát ťukal na psacím stroji aby byla hezká a dobře čitelná... jen 4x64 řádků, přišlo mi to přehlednější, ke konci už jsem do ní skoro nenahlížel a sypal čísla mnoha instrukcí přímo. Vložené NOPy byly samozřejmě záchrana.
Můj počítač měl klávesnici, ale výstup jen na několik řad LEDek takže se to zadávalo v hexa ale četlo binárně. Hlavně se část RAM dala zamknout proti zápisu a část nechat nezamčenou.
Minimalistický monitor měl 126 bytů a jen asi 6 jednoklávesových povelů (aktuální číslo uložit do H, do L, do (HL) a inkrementovat L, skočit na adresu v HL, inkrementovat L, dekrementovat L; nebo tak nějak). Program se ukončil stiskem Reset (skok na adresu 0, kde byl monitor). A fungovalo to. Nezapomenutelné.
no hexa/deca to je s Alešem pravda. Navíc já měl doma 6502 a tam jsou instrukce trošku zmatenější - nerozdělují se podle nibblů ale podle vzoru aaabbbcc. Je to pěkně vidět tady http://nparker.llx.com/a2/opcodes.html. A navíc jsme používali tu nejdosupnější možnost programování - přes DATA v BASICu (a Atari BASIC neuměl hexa číslice).
OT: s Alešem si pamatuju první hodinu assembleru. Naučil nás instrukci MOV na BOBO a prohlásit - "no vidíte, to není těžké, už znáte čtvrtinu všech instrukcí" (tedy hapruje tam ten HALT, ale 63 kódů už jsme měli).