OldComp.cz
http://oldcomp.cz/

První krůčky v asm na PMD
http://oldcomp.cz/viewtopic.php?f=50&t=2179
Stránka 14

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 :thumbup:
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 :poke:

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

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.
Rutinka optimalizovana na rychlost - je uz dlhsia, ma 66 bajtov:
Kód:
farb    =       #7F

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.
Zdrojaky aj skompilovane binarky som dal do prilohy - subory *.bin staci nahrat a spustit od adresy #0000.

Přílohy:
Sachovnica.rar [2.53 KiB]
885 krát

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 :cry:

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

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.
Ano, presne tak, mas pravdu, je to opakujuci sa kod, cislo je pocet opakovani. Aj preto som k zdrojaku (v prilohe) prilozil protokol o preklade *.lst, aby bolo v pripade pochybnosti jasne co je ako prelozene - takze to podla toho mozes skontrolovat. (Kompiler, ktory nevie generovat protokol o preklade, nie je u mna poriadny kompiler :whist: )

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 :shock:

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.
myslim, ze bych je spocital na jedne ruce a to bych jeste nektere prsty nepouzil
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? :)
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 14 Všechny časy jsou v UTC + 1 hodina [ Letní čas ]
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/