OldComp.cz http://oldcomp.cz/ |
|
První krůčky v asm na PMD http://oldcomp.cz/viewtopic.php?f=50&t=2179 |
Stránka 1 z 4 |
Autor: | mmartinka [ 02.01.2015, 12:26 ] |
Předmět příspěvku: | První krůčky v asm na PMD |
Protože jsem vždy obdivoval lidi co vládnou jazykem ASM. Rozhodl jsem se, že se tomuto také naučím. A protože mám doma PMD 2, ASM 8080 je teď mojí hračkou Pro první krok, jsem si určil vykreslit na obrazovce šachovnici. Což se podařilo, ale rád bych, aby mi někdo zkušenější ukázal na případné nedostatky. Tu je kód Kód: ; test šachovnice
sirka: .equ 0100h vyska: .equ 0101h .org 0 lxi h,sirka mvi m,06h ;šířka inx h mvi m,20h ;výška lxi h,49152 ;adresa obrazu mvi b,255 ;počet řádek mvi c,127 ;barva pole loop256: mvi d,08h ;počet šířek na řádce (výsledek musí být 48) sirka_w: mov m,c ;vyplnění adresy obrazu inx h ;zvýšení adresy obrazu push h lxi h,sirka dcr m pop h jnz sirka_w ;skok šířka čtverce push h lxi h,sirka mvi m,06h pop h mov a,c cma ;potřebuji negovat hodnotu mov c,a dcr d ;snížení o jednu jnz sirka_w mov a,l ;vypočítání adresy řádku obrazu adi 16 mov l,a jnc loop inr h loop: push h lxi h,vyska ;kontola výšky čtverce dcr m pop h jz zmena dcr b jnz loop256 ret zmena: mov a,c cma ;potřebuji negovat hodnotu mov c,a push h lxi h,vyska mvi m,20h pop h dcr b jnz loop256 .end |
Autor: | Busy [ 02.01.2015, 14:13 ] | ||
Předmět příspěvku: | Re: První krůčky v asm na PMD | ||
mmartinka píše: Protože jsem vždy obdivoval lidi co vládnou jazykem ASM. Rozhodl jsem se, že se tomuto také naučím. A protože mám doma PMD 2, ASM 8080 je teď mojí hračkou Vyborne rozhodnutie mmartinka píše: Pro první krok, jsem si určil vykreslit na obrazovce šachovnici. Což se podařilo, ale rád bych, aby mi někdo zkušenější ukázal na případné nedostatky. Nedostatky som si tam vsimol take okate tri:1. Skus vyuzivat registre naplno, napr. register E nikde nevidim pouzity. Mas v pameti dve premenne (sirka,vyska). Skus aj tieto pametove premenne mat v registroch. Ak sa to podari, usetris kopec kodu typu push h: lxi h,adresa: mvi m,daco: pop h a program bude kratsi a pobezi rychlejsie. 2. Hodnotu farby negujes pomocu cma. Toto nerob, pretoze ak vyfarbene stvorce maju #7F tak nevyfarbene budu #80 co na originalnom PMD85 sice nevadi, ale s ColorAce rozsirenim to moze blbnut (atributove konflikty). 3. Zabudol si namalovat posledny pixelovy riadok sachovnice Jeden z dobrych sposobov ucenia je pozriet sa ako to robia ini. Napriklad takto by som to robil ja. Rutinka optimalizovana na dlzku kodu - ma 36 bajtov: Kód: farba = #7F Rutinka optimalizovana na rychlost - je uz dlhsia, ma 66 bajtov:start ld hl,#C000 ;; HL = ukazovatel do videoramky ld a,farba ;; A = farba pre vyplnene stvorceky ld e,#10 ;; Konstana pre posun adresy videoramky loop11 ld b,#20 ;; Vyska stvorcekov v pixelovych riadkoch loop22 ld c,#08 ;; Pocet stvorcekov vo vodorovnom smere loop33 ld d,#06 ;; Sirka stvorcekov v sesticiach pixelov loop44 ld (hl),a ;; Vyfarbime 6 pixelov naraz inc l ;; Posun na dalsi bajt videoramky dec d ;; Vyfarbili sme uz celu sirku stvorceka ? jp nz,loop44 ;; Ak nie tak pokracujeme v slucke xor farba ;; Invertujeme farbu v A dec c ;; Urobili sme uz vsetky stvorceky na sirku ? jp nz,loop33 ;; Ak nie tak pokracujeme v slucke add hl,de ;; Posun adresy na dalsi pixelovy riadok ret c ;; Ak sme uz vyfarbili celu videoram, tak koniec dec b ;; Uz su vsetky riadky v ramci jedneho stvorceka ? jp nz,loop22 ;; Ak nie tak pokracujeme v slucke xor farba ;; Zase invertujeme farbu v A jp loop11 ;; A opakujeme pre dalsi riadok so stvorcekmi. Kód: farb = #7F Zdrojaky aj skompilovane binarky som dal do prilohy - subory *.bin staci nahrat a spustit od adresy #0000.
start ld hl,#0000 ;; Ako prve si musime odpametat adresu zasobnika add hl,sp ;; pretoze pocas prace budeme pouzivat register SP ld (koniec+1),hl ld hl,#C030 ;; Koniec prveho pixeloveho riadku vo videoramke ld bc,#0000 ;; BC nastavime na farbu tmavych stvorcekov ld de,farb<<8|farb ;; DE nastavime na farbu svetlych stvorcekov loop ld a,#20 ;; Vyska stvorcekov v pixelovych riadkoch fill ld sp,hl ;; Zasobnik nastavime na koniec pixeloveho riadku DUP #04 ;; Seriou PUSH:PUSH... vykreslime pixelovy riadok DUP #03 push bc EDUP DUP #03 push de EDUP EDUP ld sp,#40 ;; Adresu videoramky posunieme add hl,sp ;; na koniec dalsieho pixeloveho riadku jp c,koniec ;; Ak je uz koniec videoramky, tak bude koniec rutinky dec a ;; Uz sme nakreslili vsetky pixelove riadky stvorceka ? jp nz,fill ;; Ak nie tak pokracujeme v slucke ld a,b ;; Vymena obsahu registrov BC a DE ld b,e ;; tym padom sa nam farby stvorcekov vymenia ld c,e ld d,a ld e,a jp loop ;; A pokracujeme vo vykonavani rutinky. koniec ld sp,#5555 ;; Na zaver rutinky este obnovime zasobnik ret ;; aby sme sa vedeli korektne vratit nazad.
|
Autor: | mmartinka [ 02.01.2015, 15:04 ] |
Předmět příspěvku: | Re: První krůčky v asm na PMD |
Díky za vaše příklady ... podle toho co vidím, jsem na hromádku sněhu použil sněžnou rolbu místo optimální lopaty |
Autor: | mmartinka [ 03.01.2015, 21:02 ] |
Předmět příspěvku: | Re: První krůčky v asm na PMD |
Busy píše: Jeden z dobrych sposobov ucenia je pozriet sa ako to robia ini. Napriklad takto by som to robil ja. Rutinka optimalizovana na dlzku kodu - ma 36 bajtov: Na to že je to optimalizovaný na délku, tomu stačí na vykreslení plovina taktů co mě. Velice se mi tento příklad líbí, i proto že kód je pro mě čitelnější. Busy píše: Rutinka optimalizovana na rychlost - je uz dlhsia, ma 66 bajtov: Kód: DUP #04 ;; Seriou PUSH:PUSH... vykreslime pixelovy riadok DUP #03 push bc EDUP DUP #03 push de EDUP EDUP DUP a EDUP je nějaké makro pro překladač? Jako že místo několikrát opakujícího se push, napíšete jednou DUP a počet opakování? Na zkoušení kódu používám online http://www.asm80.com v módu pro i8080. Zatím nevím jak to správně pochopit. |
Autor: | zz_indigo [ 03.01.2015, 21:16 ] |
Předmět příspěvku: | Re: První krůčky v asm na PMD |
mmartinka píše: DUP a EDUP je nějaké makro pro překladač? Jako že místo několikrát opakujícího se push, napíšete jednou DUP a počet opakování? Na zkoušení kódu používám online http://www.asm80.com v módu pro i8080. Zatím nevím jak to správně pochopit. Ak si to dobre pametam DUP (pocet) .. EDUP znamena ze kod medzi DUP a EDUP za zapise pocet -krat DUP #03 push de EDUP znamena push de push de push de |
Autor: | Busy [ 03.01.2015, 21:25 ] |
Předmět příspěvku: | Re: První krůčky v asm na PMD |
mmartinka píše: Busy píše: Kód: DUP #04 ;; Seriou PUSH:PUSH... vykreslime pixelovy riadok DUP #03 push bc EDUP DUP #03 push de EDUP EDUP |
Autor: | rombor [ 03.01.2015, 21:31 ] |
Předmět příspěvku: | Re: První krůčky v asm na PMD |
mmartinka píše: Na zkoušení kódu používám online http://www.asm80.com v módu pro i8080. Zatím nevím jak to správně pochopit. Tento online assembler/prekladač má na to pseudoinštrukciu .rept (viď. Help dole na stránkach prekladača).
|
Autor: | mmartinka [ 03.01.2015, 23:07 ] |
Předmět příspěvku: | Re: První krůčky v asm na PMD |
Díky "all", snad těch lamerských otazek nebude přibývat |
Autor: | adent [ 04.01.2015, 00:07 ] |
Předmět příspěvku: | Re: První krůčky v asm na PMD |
Chválím jak rozhodnutí, tak assembler. Pokud bys měl s assemblerem nějaký problém, tak piš přímo mně - třeba na asm80@maly.cz (nojo, měl bych si udělat schránku, já vím...), vysvětlím, případně opravím. Jo a rychlý kurz assembleru 8080 jsem dával na http://strojak.cz - tyhle Busyho fígly tam brzy dopíšu, to je dobrý nápad (jako třeba proč používat opakované PUSH apod.) |
Autor: | zz_indigo [ 04.01.2015, 13:10 ] |
Předmět příspěvku: | Re: První krůčky v asm na PMD |
mmartinka píše: Díky "all", snad těch lamerských otazek nebude přibývat To nieje az tak lamerska otazka. Kazdy druhy asembler ma ine makra a funkcie takze sa clovek bez problemou zamota. Napr v TASM sa pouziva DUP inak text DB 5 DUP('w') => text DB 'wwwww' |
Autor: | mmartinka [ 04.01.2015, 22:18 ] |
Předmět příspěvku: | Re: První krůčky v asm na PMD |
adent píše: Jo a rychlý kurz assembleru 8080 jsem dával na http://strojak.cz - tyhle Busyho fígly tam brzy dopíšu, to je dobrý nápad (jako třeba proč používat opakované PUSH apod.) Já jsem o používání PUSHování právě četl v článku na vášich stránkách, ale bez ukázky si clověk nedokáže představit jak je to rychlé. Busyho příklad je tou pravou ukázkou Rád používám asm80, ale nevím jak jednoduše uložit soubor abych ho mohl potom načíst v PMD85emu. Zkoušel jsem pásku ale také se mi to nedařilo oteřít v emulátoru. IDE80 je zajímavý projekt, ale na mém systému osx 10.6.8 spíše nefunguje než funguje. Nikde jsem nenašel minimální požadavky na systém... |
Autor: | adent [ 04.01.2015, 22:51 ] |
Předmět příspěvku: | Re: První krůčky v asm na PMD |
mmartinka píše: Rád používám asm80, ale nevím jak jednoduše uložit soubor abych ho mohl potom načíst v PMD85emu. Zkoušel jsem pásku ale také se mi to nedařilo oteřít v emulátoru. Rozumím. Právě teď dělám na "exportérech" pro různé platformy, zatím mi to exportuje do TAP a SNA pro ZX Spectrum a do PRG pro C64. Tak já ještě doplním export PMDtape. Stay tuned. mmartinka píše: IDE80 je zajímavý projekt, ale na mém systému osx 10.6.8 spíše nefunguje než funguje. Nikde jsem nenašel minimální požadavky na systém... Nojo, to byl quick and dirty hack, aby "něco" pro Maca bylo. Problém je ten, že Maca nemám (prostě nemám!), a tak to pro něj překládám spíš jako intuitivně. Jestli můžu poprosit o hlášení těch bugů, ideálně přes uservoice na té stránce (je to ta ikona s otazníkem nahoře), anebo na mail admin@asm80.com (aspoň to vyzkouším). Díky moc. |
Autor: | JohnBlbec [ 05.01.2015, 14:45 ] |
Předmět příspěvku: | Re: První krůčky v asm na PMD |
mmartinka píše: Díky za vaše příklady ... podle toho co vidím, jsem na hromádku sněhu použil sněžnou rolbu místo optimální lopaty :cry: takhle si to nesmis brat, busy je jiny level :-D pochopit jeho excelentni kod (at uz asm tak i basic) dokaze jen par lidi. myslim, ze bych je spocital na jedne ruce a to bych jeste nektere prsty nepouzil :-D |
Autor: | mborik128 [ 05.01.2015, 18:30 ] |
Předmět příspěvku: | Re: První krůčky v asm na PMD |
JohnBlbec píše: pochopit jeho excelentni kod (at uz asm tak i basic) dokaze jen par lidi. Netreba prehanat. Kazdy dobre napisany a optimalny kod v assembleri sa na prvy pohlad moze zdat "nepochopitelny", ale to je sposobene iba samotnym zapisom assembleru, ktory nie je nijak strukturovany, instrukcie su iba zhlukom 2 az 4 pismen, par pismen oznacujucich registre... chce vela rokov skusenosti vidiet vyznam takeho zapisu na prvy pohlad. Po ponoreni sa do problematiky a pretrasovani (v hlave / na papier / v pocitaci) clovek zisti, ze to nie je ziadna raketova veda, ale iba mnoho rokov skusenosti a mohutne vyuzivanie tzv. best practises. Ale to iste predsa plati pre kazdy jeden programovaci jazyk, ci nie? myslim, ze bych je spocital na jedne ruce a to bych jeste nektere prsty nepouzil Mam to stastie, ze s Busym mozem spolupracovat a ze sme v kontakte a z jeho kodu som sa mohol vela tych best practises a "hackov" naucit. Pochopil som ale to podstatne: Busyho caro nie je v samotnom kode - to je predsa stale ten isty assembler, ktory sa dokaze ktokolvek naucit a sikovne pouzivat - ale v tom, ako dokaze riesene problemy zjednodusovat az na kost. A to predviedol uz vo svojom prvom prispevku do tejto temy. |
Autor: | adent [ 05.01.2015, 23:27 ] |
Předmět příspěvku: | Re: První krůčky v asm na PMD |
Martin (Bórik) má pravdu, ano, není to tak, že by Busy znal nějaké instrukce, co jiní neznají, ale prostě "vidí". A nejlepší je učit se od těch, co vidí, protože pak člověk zahlídne taky. Mimochodem, já jsem si teď dělal kurz teorie programovacích jazyků na Courseře, a u popisu "tail recursion" mi došlo, že to je vlastně ta optimalizace, kdy člověk místo CALL neco RET udělá JMP neco Ale jinak doporučuju totéž: vzít cizí zdroják, koukat se do něj, a snažit se pochopit, co která část dělá: "Aha, tady se kreslí do obrazovky, tady se čeká, tady se něco počítá, tady hraje zvuk... aha, a jak se generuje...?" To je nejlepší škola. Ostatně, třeba půlka příkladů z mé kapitoly o násobení v kódu 8080 je typický příklad: viděl jsem rutinu a přemýšlel jsem, jak to funguje... Jak to dělá, že posouvá registry H, L a A jako jeden osmnáctibitový a že mu to na konci tak hezky vyjde? Tužka, papír, krokování, sledování příznaků, pak jsem udělal třikrát AHA!, a zapadlo to do sebe. A to je hodně hezký okamžik, BTW. |
Stránka 1 z 4 | Všechny časy jsou v UTC + 1 hodina [ Letní čas ] |
Powered by phpBB® Forum Software © phpBB Group http://www.phpbb.com/ |