24. Říjen 2017 - 11:21

Autor Téma: Assembler z80  (Přečteno 19294 krát)

zxretrosoft

  • Plný člen
  • ***
  • Příspěvků: 227
    • Zobrazit profil
    • zxretrosoft
Assembler z80
« kdy: 27. Červen 2010 - 11:05 »
Neumí tady někdo programovat (alespoň trochu) v assembleru Z80?

Rád bych se to naučil, ale pořád mi něco uniká... Stáhl jsem si Bity do bytu od L. Zajíčka, velice srozumitelná věc, ale zasekl jsem se v 2. části instrukčního souboru, přes který se nemůžu prokousat  ???

Nejradši jsem dosud používal překladač Prometheus od Proximy, ale začal jsem si postupně teď zvykat na velice přehledný a pohodlný zabudovaný editor přímo v emulátoru EmuZWin.

Mám taky pocit, že mi chybí dost kratších ukázek, abych si to mohl lépe osahat...  ::)

Zkrátka, neumí to někdo, aby mi s tím pomohl? Potřeboval bych se na několik konkrétnách věcí přeptat, případně to ještě nějak prokonzultovat a prohloubit si znalosti  8)
« Poslední změna: 27. Červen 2010 - 11:20 od amigainspired »
Jedna stará textovka vydá za desítky dnešních nadutých her.

KaiN

  • Starší člen
  • ****
  • Příspěvků: 419
    • Zobrazit profil
Re: Assembler z80
« Odpověď #1 kdy: 28. Červen 2010 - 08:55 »
Snad bych si ještě na něco mohl vzpomenout. Zajíček je super, sám jsem se to podle toho učil. Ještě snad někde v krabici ve sklepě mám tuhle a pár jiných knížek. Naprogramoval jsem v tom před mnoha a mnoha lety jednu celou hru - potápěč, poklad, chobotnice; podle nějaké ruské elektronické hry, a několik blbostí, jako např. rutinu pro psaní 42 písmen na řádek namísto 32 apod.

zxretrosoft

  • Plný člen
  • ***
  • Příspěvků: 227
    • Zobrazit profil
    • zxretrosoft
Re: Assembler z80
« Odpověď #2 kdy: 28. Červen 2010 - 10:05 »
Perfektní!  ;) - a nemáš náhodou zkušenosti s tím EmuZWin ? Mně totiž přijde zbytečný mastit to v dnešní době v Prometheovi (i když je super a předběhl dobu), když EmuZWin má tak pohodlný assembler editor přímo v sobě. Jenže nějak ho moc nechápu - když tam napíšu program, dám zkompilovat, nic se nestane...?  ::)
Jedna stará textovka vydá za desítky dnešních nadutých her.

KaiN

  • Starší člen
  • ****
  • Příspěvků: 419
    • Zobrazit profil
Re: Assembler z80
« Odpověď #3 kdy: 28. Červen 2010 - 11:08 »
Prometheus jsem nepoužíval.  :) Papír, tužku a GENS 3 a MONS 3 od HiSoft.  ;) Ještě jeden prográmek, něco jako Assembler Tutorial, v tom jsem zpočátku zkoušel krátký rutinky, šlo to dobře trasovat, ukazovalo to stavy registrů atd. EmuZWin jsem nezkoušel, ale nemusí se tam dát startovací adresa, aby to bylo spustitelné?

zxretrosoft

  • Plný člen
  • ***
  • Příspěvků: 227
    • Zobrazit profil
    • zxretrosoft
Re: Assembler z80
« Odpověď #4 kdy: 28. Červen 2010 - 11:21 »
jj, na tu startovací adresu jsem myslel - jenže pokud ji tam dám ve tvaru např. org 25000 (jako se zadávala v Prometheovi), nic se nestane i po kompilaci ani po pokusu o spuštění přes BASIC. Na to se musí nějak přijít - ten editor je fakt příjemný...  ???
Jedna stará textovka vydá za desítky dnešních nadutých her.

KaiN

  • Starší člen
  • ****
  • Příspěvků: 419
    • Zobrazit profil
Re: Assembler z80
« Odpověď #5 kdy: 30. Červen 2010 - 13:36 »
Stáhnul jsem si to, tak to doma vyzkouším a dám vědět, zda a na co jsem přišel.

zxretrosoft

  • Plný člen
  • ***
  • Příspěvků: 227
    • Zobrazit profil
    • zxretrosoft
Re: Assembler z80
« Odpověď #6 kdy: 30. Červen 2010 - 18:41 »
Díky předem!  ;)

Možná si zvyknu na ten Prometheus, ale přece jen bych radši něco modernějšího přímo na PC, vždyť - proč se trápit na ZX Spectru, když existují emulátory  ;D (I když uznávám, že trápit se na ZX Spectru má hodně co do sebe a je to svým způsobem nepřekonatelné  ;) )
Jedna stará textovka vydá za desítky dnešních nadutých her.

KaiN

  • Starší člen
  • ****
  • Příspěvků: 419
    • Zobrazit profil
Re: Assembler z80
« Odpověď #7 kdy: 1. Červenec 2010 - 13:47 »
Jo, čekat 4 minuty, až se to nahraje, a pak si přečíst "Tape loading error", to je nepřekonatelné. :)

Ale jinak jsem tomu nějak neporozumněl, vždyť toho Promethea si můžeš pustit na emulátoru na PC, ne?

zxretrosoft

  • Plný člen
  • ***
  • Příspěvků: 227
    • Zobrazit profil
    • zxretrosoft
Re: Assembler z80
« Odpověď #8 kdy: 1. Červenec 2010 - 20:56 »
jj, Promethea samozřejmě můžeš spustit na emulátoru, ale myslel jsem něco takového "pohodlnějšího" jako je to u dnešních editorů vyšších jazyků (např. BASIN pro Basic ap.).

Ale to je jedno, s Prometheem mám stejně nějaké problémky, přes které se ne a ne přenést...
  • Když ho nahraju, nevidím nahoře nějaké instrukce při odeslání a nějaké jo (např. ret vidím, ale ld hl,16384 už ne...  :-\
  • Když program napíšu v Prometheovi, nevím jak ho dostat ven a spustit (v Prometheovi ho spustím RUN, ale pokud ho chci zkompilovat a použít jako samostatnou rutinku, tak nevím jak - Prometheus počítá s tím, že to vystrčí na kazetu, ale s emulátorem tehdy nikdo nepočítal. Možná to jde úplně banálně, ale já bohužel nevím jak :-\
  • Nemůžu sehnat Promethea pro 128kB, mám jen 48kB verzi (byla vůbec speciální verze pro 128? Možná jo, říká se to, ale nikdo o ní neví...  :-\ Zkrátka v dnešní době bych se nerad limitoval 48kB verzí, pokud můžu bez problémů využít 128.

Takže jak vidno, je toho víc, proč nepoužít Promethea, ačkoli mám nejlepší vůli ho použít - tyhle 3 problémky bych zkrátka k úspěšnému používání Promethea potřeboval odstranit  ::)
Jedna stará textovka vydá za desítky dnešních nadutých her.

KaiN

  • Starší člen
  • ****
  • Příspěvků: 419
    • Zobrazit profil
Re: Assembler z80
« Odpověď #9 kdy: 2. Červenec 2010 - 08:10 »
Tak jsem ten EmuZWin vyzkoušel a řekl bych, že celý vtip je v tom, že on to kompiluje přímo do paměti RAM, takže spouštět to musíš (jakoby) z BASICu jako u klasického ZX. Napsal jsem tenhle "prográmek", který změní okraj obrazovky na černou barvu:

Kód: [Vybrat]
org 30000
xor a
out (254),a
ret

Když to zkompiluješ a následně v emulovaném ZX napíšeš např. RANDOMIZE USR 30000, tak se to spustí. No, takže soudím, že uložit to budeš muset taky z BASICu, myslím, že to je takhle: SAVE „nazev“ CODE 30000, délka kodu.

Přijde mi to velmi nepraktické.

zxretrosoft

  • Plný člen
  • ***
  • Příspěvků: 227
    • Zobrazit profil
    • zxretrosoft
Re: Assembler z80
« Odpověď #10 kdy: 2. Červenec 2010 - 09:00 »
Jo, díky, opravdu to funguje!  :)

Mně to nepřijde tak nepraktické, ale to je asi proto, že jsem na ničem jiném nijak nedělal... Jak bych to samé udělal v Prometheovi? Pokud ho nemáš, mohl bych ti ho poslat, ale nevim, jestli nemám nějakou špatnou verzi, protože se mi skutečně některé instrukce neukazují  :-\ Např. ent $ nebo org 30000 tam nedostanu.
Jedna stará textovka vydá za desítky dnešních nadutých her.

KaiN

  • Starší člen
  • ****
  • Příspěvků: 419
    • Zobrazit profil
Re: Assembler z80
« Odpověď #11 kdy: 2. Červenec 2010 - 09:45 »
Možná bude mít Prometheus pro zadání startovací adresy jiný příkaz než org. Poslat mi to můžeš, ale bez manuálu ty případné odlišné příkazy kompilátoru nezjistíme. Mail: Petr.Kain(zavináč)seznam.cz.

zxretrosoft

  • Plný člen
  • ***
  • Příspěvků: 227
    • Zobrazit profil
    • zxretrosoft
Re: Assembler z80
« Odpověď #12 kdy: 2. Červenec 2010 - 15:20 »
jj, právě že org xxxxx a ent $ by používat měl, ale mně se to tam ne a ne zobrazit...  ???

Pošlu ti tedy ten Prometheus + manuál k němu na e-mail.
Jedna stará textovka vydá za desítky dnešních nadutých her.

zxretrosoft

  • Plný člen
  • ***
  • Příspěvků: 227
    • Zobrazit profil
    • zxretrosoft
Re: Assembler z80
« Odpověď #13 kdy: 5. Červenec 2010 - 14:54 »
Tak jsem konečně získal funkční verzi Promethea - ten můj byl opravdu poškozený, proto vykazoval takové zvláštní chování...

Takže jdu experimentovat!  ;) A podám zprávu...  8)

P.S. Jo, a ten org tam fakt nemá být, klasicky s ent $ a pak kód, startovací adresa se zadává před spuštěním... Ačkoliv by měl Prometheus org standartně umět, ale jak říkám, teprve zkouším, tak uvidíme...
« Poslední změna: 5. Červenec 2010 - 16:16 od amigainspired »
Jedna stará textovka vydá za desítky dnešních nadutých her.

zxretrosoft

  • Plný člen
  • ***
  • Příspěvků: 227
    • Zobrazit profil
    • zxretrosoft
Re: Assembler z80
« Odpověď #14 kdy: 5. Červenec 2010 - 19:00 »
Takže, pokusím se shrnout některé své první dojmy z programování v assembleru Z80 - možná ze sebe udělám totálního blbce, ale i za tu cenu budu rád, pokud se mi moje otázky někdo pokusí s trpělivostí vysvětlit  ::)

Přepsal jsem si z pěkné knihy Assembler a ZX Spectrum jeden z prvních příkladů a zdá se mi, že jsem buď nic nepochopil, nebo že to autor dostatečně nevysvětluje a nemám to ani z čeho pochopit. Obojí je možné, takže posuďte sami. Ať tak nebo tak mi jistě pomůže každá konstruktivní odpověď.

V příloze přikládám co by to mělo dělat - vytiskne se na obrazovku vlevo odshora pole 8x8 stejných znaků v různé barvě s různým podkladem.

Opisuji z knihy i s vysvětlivkami:

Kód: [Vybrat]
ent $ ;místo pro spuštění
START call #D6B ;podprogram pro CLS
ld a,2 ;číslo kanálu do registru A
call #1601 ;zavolání podprogramu
ld c,8 ;8 řádků
LOOP ld b,8 ;8 sloupců
LOOP2 ld a,22 ;nastavení tiskové pozice
rst 16
ld a,c
rst 16
ld a,b
rst 16
ld a,16 ;nastavení barvy inkoustu
rst 16
ld a,b
dec a
rst 16
ld a,17 ;nastavení barvy papíru
rst 16
ld a,c
dec a
rst 16
ld a,"@" ;vystiskni znak @
rst 16
djnz LOOP2 ;vnitřní cyklus
dec c ;zmenši C o jedničku
jr nz,LOOP ;vnější cyklus
ret ;po skončení návrat

A nyní k mojim skromným otázkám, kde přemýšlím spíš nahlas, abyste viděli jakým způsobem jsem se to pokusil dešifrovat:

  • ent $ je univerzální instrukce pro spuštění, rozumím tomu tedy tak, že musí být na začátku každého programu ať se děje co se děje a přemýšlení nad tím je jen mařením času.
  • call #D6B má volat podprogram pro CLS - zřejmě je v ROM uložen podprogram CLS, který v assembleru zavolám zkrátka touhle instrukcí stejně jako ho z Basicu zavolám pomocí CLS - takže proč příkaz vypadá jak vypadá mě celkem nemusí zajímat (tzn. call #D6B=CLS).
  • ld a,2 má znamenat "číslo kanálu do registru A". Z knihy jsem se předtím dozvěděl, že číslo 2 je prostě ekvivalent basicovského PRINT a musí být umístěno v registru A, takže není co řešit, jen mechanicky určím co dělat.
  • call #1601 - mělo by být "zavolání podprogramu", který by měl otevřít kanál - další mechanická věc, o kterém nemusím (zatím) zřejmě dalece přemýšlet.
  • ld c,8 a ld b,8 - dvě instrukce po sobě, které mají určit 8 řádků a 8 sloupců. Víc než 9 jich být asi nemůže, páč je to jen jednoduchý registr? Možná bych chtěl vědět, jak jich napsat i víc... Ale to je teď jedno. Proč do registru C umisťuji počet řádků a do registru B počet sloupců? Může to být i naopak? Jak mám zadat více řádků a více sloupců? Můžu použít i dvojregistr?
  • ld a,22 - zde je do registru A, který už byl použit, tedy je zase volný k použití, vloženo číslo 22. Autor uvádí k následujícím 6 řádkům, že se jedná o "nastavení tiskové pozice". Předtím jsme se dozvěděli, že příkaz rst 16 zabezpečuje tisk znaku. V programu postupujeme tedy tak, že do registru A se zapíše 22, pak se vytiskne znak. Nechápu proč 22, proč do A a proč mám vytisknout hned něco, když ani nevím co - znak jsme zatím evidentně neuvedli. Dobře. Pak dochází k výměně ld a,c, čili registr C se přesune do A, co to znamená a proč? Do C jsme předtím vložili 8, do A 22, nyní je tedy obsah A=8. Následně se znak vytiskne rst 16. Nakonec ld a,b, čili obsah B do A, v B bylo 8, obsah A je nyní zase 8. Výtisk rst 16(? proč pokaždé "výtisk"?). Představuji si to tak, že se tady vytvořila nějaká tisková pozice v podobě jakési imaginární sítě, kde co bude a nakonec tam dosadíme ten konkrétní znak a on se všude v té síti zobrazí. Možná jsem úplně vedle a možná ne...
  • Následuje nastavení barvy inkoustu. ld a,16 znamená, že do A jde 16, to se vytiskne(? nevím co se vlastně pořádně tiskne); pak ld a,b, čili 8 jde do A, výtisk, zmenšení o 1 (dec a) a opět ten výtisk.
  • Pak se nastaví barva papíru - nějak podobně jako u barvy inkoustu, ale je tam namísto 16 do A instrukce 17 do A(?). Proč zrovna 17, to je otázka.
  • Nakonec zjevně napíšeme, co chceme vlastně konkrétně vytisknout - tj. v A umístíme nějaký znak do uvozovek (není to příliš elegantní pro assembler, ale možná to jde i jinak) a hned jeho tisk rst 16.
  • Proběhnou cykly, které by se daly při nijak drastické snaze pochopit, a po skončení návrat pomocí ret (bohužel netuším kam).

Jak říkám, možná jsem úplný jelito, ale tohle je všechno, co jsem z toho příkladu jakžtakž dešifroval. Moc to - jak vidíte - stále nechápu. Celému tomu algoritmu rozumím tak, že něco připraví (síť toho, kde co bude a jaké to bude mít parametry) a pak to tam reálně vloží.
Možná by mi pomohl třeba i vývojový diagram - umí ho k tomu někdo jednoduše nakreslit? Mělo by to vůbec smysl pro pochopení tohodle příkládku?  ::)

Za každou radu předem děkuji!!  ;)
« Poslední změna: 6. Červenec 2010 - 14:35 od amigainspired »
Jedna stará textovka vydá za desítky dnešních nadutých her.