OldComp.cz

Komunitní diskuzní fórum pro fanoušky historických počítačů

Registrace na OCP IV ZDE!

Právě je 25 zář 2018, 17:43

Všechny časy jsou v UTC + 1 hodina




Odeslat nové téma Odpovědět na téma  [ Příspěvků: 77 ]  Přejít na stránku 1, 2, 3, 4, 5, 6  Další
Autor Zpráva
PříspěvekNapsal: 21 říj 2014, 07:00 
Offline
Pan Generální
Uživatelský avatar

Registrován: 18 čer 2013, 19:26
Příspěvky: 2161
Has thanked: 80 times
Been thanked: 305 times
Chtěl bych si něco naprogramovat a nerad bych to kazil hned od začátku, tak se chci zeptat:

1) Jaké je při programování v assembleru obvyklé/oblíbené/doporučené využití registrů Z80? Když pominu registry jako A nebo SP, které jsou dost nezastupitelné ;) , tak myslím třeba to, že BC se používá jako počet opakování cyklu, a podobné zažité zvyklosti...

2) A jak je to s voláním podprogramů, knihovních funkcí, či služeb OS, jestli je v tom taky nějaký léty osvědčený úsus. Předpokládám totiž, že se budu snažit, abych nemusel stejný kód psát víckrát, ;) a tudíž jaksi spontánně dospěju k tomu, že si budu budovat nějakou vlastní knihovnu funkcí... Takže mi jde o to, abych si položil solidní základ (také) v tom, že budu optimálním způsobem předávat parametry (a přebírat výsledky)...
Proto jsem si chtěl vzít příklad z nějaké knihovny, či operačního systému...

Předem díky za tipy... :)

Jiiira

_________________
www.zxsparrow.com


Nahoru
 Profil  
 
PříspěvekNapsal: 21 říj 2014, 09:00 
Offline
Pan Štábní

Registrován: 22 kvě 2013, 20:14
Příspěvky: 1962
Bydliště: Bratislava
Has thanked: 216 times
Been thanked: 356 times
Jiiira píše:
1) Jaké je při programování v assembleru obvyklé/oblíbené/doporučené využití registrů Z80? Když pominu registry jako A nebo SP, které jsou dost nezastupitelné ;) , tak myslím třeba to, že BC se používá jako počet opakování cyklu, a podobné zažité zvyklosti...
Nic take ako obvykle ci doporucene pouzitie registrov vo vseobecnosti neexistuje. Pokial to instrukcny subor umoznuje, mozes pouzit hocico na cokolvek. Napriklad v mojom rotazoomeri som pouzil SP pre uschovanie jednej suradnice vektora ktory definuje otocenie a zvecsenie obrazku. Takze ako registre pouzijes, je uplne na tvojej fantazii :)

Ale predsa len existuje zopar tipov, ktore vyplyvaju z instrukcneho suboru, a ktore tym padom umoznuju pisat efektivnejsie programy.
Napriklad:
B ... vdaka DJNZ je to vhodne 8-bitove pocitadlo v sluckach
HL ... vdaka adresovym moznostiam (HL) je vyhodne ho pouzivat na adresaciu pameti.
HL,DE ... vdaka ADD HL,rr... a EX DE,HL su vhodne pre pouzitie na 16-bitovu aritmetiku
HL=zdroj, DE=ciel, BC=dlzka ... takto je vyhodne pri praci s blokmi naplnat registre, aby si potom v pripade potreby presunu bloku mohol pouzit LDIR a pod.

Jiiira píše:
2) A jak je to s voláním podprogramů, knihovních funkcí, či služeb OS, jestli je v tom taky nějaký léty osvědčený úsus. Předpokládám totiž, že se budu snažit, abych nemusel stejný kód psát víckrát, ;) a tudíž jaksi spontánně dospěju k tomu, že si budu budovat nějakou vlastní knihovnu funkcí... Takže mi jde o to, abych si položil solidní základ (také) v tom, že budu optimálním způsobem předávat parametry (a přebírat výsledky)...
Proto jsem si chtěl vzít příklad z nějaké knihovny, či operačního systému...
Tu vo vseobecnosti existuju dva najpouzivanejsie modely predavania parametrov a vysledkov.
a) Vsetko v registroch - najefektivnejsie, najrychlejsie. 8 bitovy udaj obvykle v A, 16-bitovy v HL, 32 bitovy v nejakej dvojici 16-bit registrov. Ale pri vecsom mnozstve a rozsahu parametrov to zacne byt neprehladne.
b) Vsetko v pameti v presne specifikovanej strukture. Je to pomalsie, ale zase je to prehladne aj pri vela parametroch. Tento sposob pouzivaju niektore OS (betadisk, +d/disciple). Vyhodu je ze parametre mozno pohodlne nastavovat a citat pomocou (IX+offset).

Samozrejme oba sposoby mozno kombinovat a napr. jeden z parametrov v registroch bude adresa struktury v pameti s dalsimi parametrami.

Kompilery vyssich programovacich jazykov to robia tak, ze naPUSHuju vsetky hodnoty do zasobnika, kde si ich potom volana procedura preberie. Tento sposob je dobry na automaticky preklad, ale pre pisanie programov v asemebleri je tak trosku "kostrbaty" a neprehladny.


Nahoru
 Profil  
 
PříspěvekNapsal: 21 říj 2014, 13:29 
Offline
Pan Generální
Uživatelský avatar

Registrován: 18 čer 2013, 19:26
Příspěvky: 2161
Has thanked: 80 times
Been thanked: 305 times
Busy píše:
Jiiira píše:
1) Jaké je při programování v assembleru obvyklé/oblíbené/doporučené využití registrů Z80? Když pominu registry jako A nebo SP, které jsou dost nezastupitelné ;) , tak myslím třeba to, že BC se používá jako počet opakování cyklu, a podobné zažité zvyklosti...
Nic take ako obvykle ci doporucene pouzitie registrov vo vseobecnosti neexistuje. Pokial to instrukcny subor umoznuje, mozes pouzit hocico na cokolvek. Napriklad v mojom rotazoomeri som pouzil SP pre uschovanie jednej suradnice vektora ktory definuje otocenie a zvecsenie obrazku. Takze ako registre pouzijes, je uplne na tvojej fantazii :)

Ale predsa len existuje zopar tipov, ktore vyplyvaju z instrukcneho suboru, a ktore tym padom umoznuju pisat efektivnejsie programy.

Přesně to jsem měl na mysli, právě na to jsem se ptal ;)

Busy píše:
Napriklad:
B ... vdaka DJNZ je to vhodne 8-bitove pocitadlo v sluckach
HL ... vdaka adresovym moznostiam (HL) je vyhodne ho pouzivat na adresaciu pameti.
HL,DE ... vdaka ADD HL,rr... a EX DE,HL su vhodne pre pouzitie na 16-bitovu aritmetiku
HL=zdroj, DE=ciel, BC=dlzka ... takto je vyhodne pri praci s blokmi naplnat registre, aby si potom v pripade potreby presunu bloku mohol pouzit LDIR a pod.

OK, a ještě co registry IX a IY ? A v jakých situacích se hodí využívat druhou sadu registrů (nebo se bez ní člověk ve většině případů obejde?)

Busy píše:
Jiiira píše:
2) A jak je to s voláním podprogramů, knihovních funkcí, či služeb OS, jestli je v tom taky nějaký léty osvědčený úsus. Předpokládám totiž, že se budu snažit, abych nemusel stejný kód psát víckrát, ;) a tudíž jaksi spontánně dospěju k tomu, že si budu budovat nějakou vlastní knihovnu funkcí... Takže mi jde o to, abych si položil solidní základ (také) v tom, že budu optimálním způsobem předávat parametry (a přebírat výsledky)...
Proto jsem si chtěl vzít příklad z nějaké knihovny, či operačního systému...
Tu vo vseobecnosti existuju dva najpouzivanejsie modely predavania parametrov a vysledkov.
a) Vsetko v registroch - najefektivnejsie, najrychlejsie. 8 bitovy udaj obvykle v A, 16-bitovy v HL, 32 bitovy v nejakej dvojici 16-bit registrov. Ale pri vecsom mnozstve a rozsahu parametrov to zacne byt neprehladne.
b) Vsetko v pameti v presne specifikovanej strukture. Je to pomalsie, ale zase je to prehladne aj pri vela parametroch. Tento sposob pouzivaju niektore OS (betadisk, +d/disciple). Vyhodu je ze parametre mozno pohodlne nastavovat a citat pomocou (IX+offset).

Samozrejme oba sposoby mozno kombinovat a napr. jeden z parametrov v registroch bude adresa struktury v pameti s dalsimi parametrami.

Takže se vlastně předává pointer na structuru... 8-)

Busy píše:
Kompilery vyssich programovacich jazykov to robia tak, ze naPUSHuju vsetky hodnoty do zasobnika, kde si ich potom volana procedura preberie. Tento sposob je dobry na automaticky preklad, ale pre pisanie programov v asemebleri je tak trosku "kostrbaty" a neprehladny.

Ale když se procedura volá CALLem, tak je na vrcholku zásobníku návratová adresa, ne? To se to vybírá "zpod ní"? :-o

_________________
www.zxsparrow.com


Nahoru
 Profil  
 
PříspěvekNapsal: 21 říj 2014, 14:22 
Offline
Pan Štábní

Registrován: 22 kvě 2013, 20:14
Příspěvky: 1962
Bydliště: Bratislava
Has thanked: 216 times
Been thanked: 356 times
Jiiira píše:
OK, a ještě co registry IX a IY ?
Indexove registry boli povodne navrhnute na spohodlnenie prace pre programatora, cosi ako vyssi programovaci jazyk. Mas v pameti nejaku oblast dat, smeruje do nej IX a ty teraz mozes adresovat lubovolny bajt dat presne ako pomocou (HL), ale bez toho, aby si musel registrom chodit po tych datach, pretoze mozes priamo do instrukcie napisat offset v rozsahu -128..+127: (IX+offset). Podobne ako vo vyssich jazykoch, umoznuje to pisat krasne a prehladne programy, avsak pododobne ako vo vyssich jazykoch, tieto programy bezia pomaly a zaberaju strasne moc pameti.

Preto napriklad v mojich 1k intrach nikdy konstrukciu (IX+offset) nepouzivam - ak som take potreboval, vzdy som to vyriesil nejak inak, kratsie, rychlejsie, efektivnejsie, a za cenu nizsej prehladnosti.

Indexove registre sa tiez zvyknu casto pouzivat pomocou neoficialnych instrukcii - ako dalsie vseobecne osembitove registre xh,xl,yh,yl. Napriklad ja ich casto pouzivam ako 8-bit pocitadla pre cykly, ked ostatne registre (vratane B-cka) su obsadene. Alebo ako priznak v ktorom prerusene nieco vracia do hlavneho programu a podobne.
Jiiira píše:
A v jakých situacích se hodí využívat druhou sadu registrů (nebo se bez ní člověk ve většině případů obejde?)
Druha sada bola navrhnuta povodne preto, aby sa zrychlila reakcia na prerusenie, alebo vo vseobecnosti rychlost volania lubovolneho podprogramu. Namiesto PUSHovania vsetkych registrov a nasledne ich POPovania sa len spravi EX AF,AF a EXX - co je ovela rychlejsie (no, indexove treba stale pushovat). Ale inak ich pouzitie je uplne lubovolne, kludne moze hlavny program pouzivat vsetky a podprogram ci prerusenie si potom poctivo pushne/popne co treba.

Dalsim zaujimavym pouzitim zaloznych registrov je velmi rychly prenos udajov. Na zaciatok zdrojoveho bloku nastavim SP, vyPOPujem vsetky registre, urobim EXX, EX AF,AF vypopujem zalozne registre, potom SP nastavim na koniec cieloveho bloku a vsetky registre zase naPUSHujem. Vdaka zaloznym registrom dokaze takto Z80 z pameti do seba naraz "nasat" az 20 bajtov, a nasledne ich vyklopit na miesto urcenia - prenos udajov je preto velmi rychly. Tento trik casto pouzivaju dema pre realizaciu zaujimavych grafickych efektov.
Jiiira píše:
Busy píše:
Kompilery vyssich programovacich jazykov to robia tak, ze naPUSHuju vsetky hodnoty do zasobnika, kde si ich potom volana procedura preberie. Tento sposob je dobry na automaticky preklad, ale pre pisanie programov v asemebleri je tak trosku "kostrbaty" a neprehladny.
Ale když se procedura volá CALLem, tak je na vrcholku zásobníku návratová adresa, ne? To se to vybírá "zpod ní"? :-o
To vobec nevadi :) Procedura si najprv zo zasobnika vyberie navratovu adresu, tu si niekde odlozi, potom povybera parametre, a na konci skoci na tuto navratovu adresu. A je to.


Nahoru
 Profil  
 
PříspěvekNapsal: 21 říj 2014, 17:05 
Offline
Kecálek

Registrován: 07 kvě 2014, 11:10
Příspěvky: 115
Bydliště: Jbc
Has thanked: 0 time
Been thanked: 24 times
Pokud se parametry predavaji pres zasobnik ve vyssim jazyce, pak zpravidla jejich odstraneni ridi volajici funkce (vi, kolik toho na zasobnik ulozila a kolik toho tedy ma odstranit).
Jsou i jazyky (napr. pascal), kde to resi volana funkce, ale IMHO to je mene prehledne...
Pro adresaci promennych/parametru na zasobniku se casto pouziva prave IX/IY registr. Pokud navic jsou ve funkci jeste lokalni promenne na zasobniku, tak IX-neco jsou promenne a IX+neco jsou parametry.


Nahoru
 Profil  
 
PříspěvekNapsal: 21 říj 2014, 21:00 
Offline
Radil
Uživatelský avatar

Registrován: 12 kvě 2013, 22:38
Příspěvky: 535
Bydliště: Praha
Has thanked: 293 times
Been thanked: 115 times
Busy:
BTW Nechtěl bys třeba udělat nějaký miniseriál k Z80? Aby to mohl každý jednoduše vyzkoušet a trošku se to naučit. Byl by to ostatně velký počin :S

_________________
http://www.oldgames.sk/user/zxretrosoft/


Nahoru
 Profil  
 
PříspěvekNapsal: 21 říj 2014, 22:32 
Offline
Kecálek
Uživatelský avatar

Registrován: 19 črc 2013, 13:21
Příspěvky: 154
Bydliště: Košice
Has thanked: 51 times
Been thanked: 149 times
zxretrosoft píše:
Nechtěl bys třeba udělat nějaký miniseriál k Z80?
Kolko tych serialov este bude musiet napisat, aby si to aj na oldcompe vsimli miestni retro-maniaci? :roll:


Nahoru
 Profil  
 
PříspěvekNapsal: 21 říj 2014, 22:36 
Offline
Pan Štábní
Uživatelský avatar

Registrován: 13 kvě 2013, 09:52
Příspěvky: 1770
Bydliště: Mliecna draha
Has thanked: 20 times
Been thanked: 124 times
mborik128 píše:
zxretrosoft píše:
Nechtěl bys třeba udělat nějaký miniseriál k Z80?
Kolko tych serialov este bude musiet napisat, aby si to aj na oldcompe vsimli miestni retro-maniaci? :roll:


To vies dnes je kazdy zvyknuty na personalizaciu ;-)

_________________
Amiga 600 + a602, Amiga 600 PCB only, Commodore 64+ZZ-RAM V1.0 512k+C1541(18k RAM)+sd2iec +9.600 Rs232, Commodore 116 + 64k upgrade, ZX 81 ISSUE1 + ZX81XRAM

http://zz-indigo.mavipet.sk/


Nahoru
 Profil  
 
PříspěvekNapsal: 21 říj 2014, 23:05 
Offline
Radil
Uživatelský avatar

Registrován: 12 kvě 2013, 22:38
Příspěvky: 535
Bydliště: Praha
Has thanked: 293 times
Been thanked: 115 times
Seriálů není nikdy dost. A když vidím, že tomu někdo takhle rozumí... díky za každý slovo! :thumbup:

_________________
http://www.oldgames.sk/user/zxretrosoft/


Nahoru
 Profil  
 
PříspěvekNapsal: 22 říj 2014, 08:28 
Offline
Pan Štábní

Registrován: 22 kvě 2013, 20:14
Příspěvky: 1962
Bydliště: Bratislava
Has thanked: 216 times
Been thanked: 356 times
zxretrosoft píše:
Seriálů není nikdy dost. A když vidím, že tomu někdo takhle rozumí... díky za každý slovo! :thumbup:
No tak pouzivanie registrov by asi na serial nebolo, ale ak chces nejake serialy, tak kukni sem:
http://busy.speccy.cz/tvorba/clanky.htm
Najdes tam tieto serialy:
- Strojovy kod pre pokrocilych
- Rychle graficke rutinky
- Assembler 8086 (ak by si chcel nieco naprogramovat aj na PeCi)

Skvele stranky ma aj Martin Maly: http://strojak.cz/
Je tam sice iba 6502 a 8080 ale planuje tam doplnit aj Z80.


Nahoru
 Profil  
 
PříspěvekNapsal: 22 říj 2014, 08:35 
Offline
Radil
Uživatelský avatar

Registrován: 12 kvě 2013, 22:38
Příspěvky: 535
Bydliště: Praha
Has thanked: 293 times
Been thanked: 115 times
Díky!

_________________
http://www.oldgames.sk/user/zxretrosoft/


Nahoru
 Profil  
 
PříspěvekNapsal: 22 říj 2014, 18:00 
Offline
Profík
Uživatelský avatar

Registrován: 18 kvě 2013, 13:56
Příspěvky: 773
Has thanked: 93 times
Been thanked: 175 times
Assembler a ZX Spectrum od Universuma jsi už četl? Pro mne to byla velmi užitečná učebnice.

A mohu pomoct kdybys potřeboval s rozchozením ASu na Linuxu, nebo vysvětlit cokoli z mého webu (vzpomenu-li si po tak dlouhé době). Ke všem mým programům by tam měly být komentované zdrojáky. http://cygnus.speccy.cz/

_________________
https://cygnus.speccy.cz ZX Spectrum 128k, Betadisk, DivIDE, ESXDOS


Nahoru
 Profil  
 
PříspěvekNapsal: 22 říj 2014, 20:40 
Offline
Pan Štábní

Registrován: 22 kvě 2013, 20:14
Příspěvky: 1962
Bydliště: Bratislava
Has thanked: 216 times
Been thanked: 356 times
A ja ti zase mozem pomoct s rozchodenim SjASM - je opensource, takze v podstate na akejkolvek platforme (s C kompilerom) :) S Norom ho mame rozchodeny na Win a Mac.


Nahoru
 Profil  
 
PříspěvekNapsal: 23 říj 2014, 07:17 
Offline
Radil
Uživatelský avatar

Registrován: 12 kvě 2013, 22:38
Příspěvky: 535
Bydliště: Praha
Has thanked: 293 times
Been thanked: 115 times
Chlapi díky, podívám se na to! ;)


Citace:
Assembler a ZX Spectrum od Universuma jsi už četl? Pro mne to byla velmi užitečná učebnice.

Ano, kdysi, ještě si to vytisknu a pořádně to zkusím prostudovat.

_________________
http://www.oldgames.sk/user/zxretrosoft/


Nahoru
 Profil  
 
PříspěvekNapsal: 23 říj 2014, 07:31 
Offline
Pan Štábní

Registrován: 22 kvě 2013, 20:14
Příspěvky: 1962
Bydliště: Bratislava
Has thanked: 216 times
Been thanked: 356 times
zxcygnus píše:
Assembler a ZX Spectrum od Universuma jsi už četl? Pro mne to byla velmi užitečná učebnice.
Dalsia skvela knizka je Bity do bitu, autor Ladislav Zajicek. Sice nesuhlasim so vsetkym, co tam pise, ale celkove ju doporucujem.


Nahoru
 Profil  
 
Zobrazit příspěvky za předchozí:  Seřadit podle  
Odeslat nové téma Odpovědět na téma  [ Příspěvků: 77 ]  Přejít na stránku 1, 2, 3, 4, 5, 6  Další

Všechny časy jsou v UTC + 1 hodina


Kdo je online

Uživatelé procházející toto fórum: Žádní registrovaní uživatelé a 2 návštevníků


Nemůžete zakládat nová témata v tomto fóru
Nemůžete odpovídat v tomto fóru
Nemůžete upravovat své příspěvky v tomto fóru
Nemůžete mazat své příspěvky v tomto fóru
Nemůžete přikládat soubory v tomto fóru

Hledat:
Přejít na:  
Založeno na phpBB® Forum Software © phpBB Group
Český překlad – phpBB.cz