OldComp.cz

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


Právě je 28.03.2024, 16:47

Všechny časy jsou v UTC + 1 hodina [ Letní čas ]




Odeslat nové téma Odpovědět na téma  [ Příspěvků: 48 ]  Přejít na stránku 1, 2, 3, 4  Další
Autor Zpráva
 Předmět příspěvku: První krůčky v asm na PMD
PříspěvekNapsal: 02.01.2015, 12:26 
Offline
Radil

Registrován: 21.10.2013, 09:25
Příspěvky: 286
Has thanked: 161 times
Been thanked: 116 times
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


Nahoru
 Profil  
 
 Předmět příspěvku: Re: První krůčky v asm na PMD
PříspěvekNapsal: 02.01.2015, 14:13 
Offline
Óm Nejvyšší

Registrován: 22.05.2013, 21:14
Příspěvky: 3642
Bydliště: Bratislava
Has thanked: 371 times
Been thanked: 788 times
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]
879 krát
Nahoru
 Profil  
 
 Předmět příspěvku: Re: První krůčky v asm na PMD
PříspěvekNapsal: 02.01.2015, 15:04 
Offline
Radil

Registrován: 21.10.2013, 09:25
Příspěvky: 286
Has thanked: 161 times
Been thanked: 116 times
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:


Nahoru
 Profil  
 
 Předmět příspěvku: Re: První krůčky v asm na PMD
PříspěvekNapsal: 03.01.2015, 21:02 
Offline
Radil

Registrován: 21.10.2013, 09:25
Příspěvky: 286
Has thanked: 161 times
Been thanked: 116 times
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.


Nahoru
 Profil  
 
 Předmět příspěvku: Re: První krůčky v asm na PMD
PříspěvekNapsal: 03.01.2015, 21:16 
Offline
Pan Štábní
Uživatelský avatar

Registrován: 13.05.2013, 10:52
Příspěvky: 1669
Bydliště: Mliecna draha
Has thanked: 19 times
Been thanked: 124 times
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

_________________
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ředmět příspěvku: Re: První krůčky v asm na PMD
PříspěvekNapsal: 03.01.2015, 21:25 
Offline
Óm Nejvyšší

Registrován: 22.05.2013, 21:14
Příspěvky: 3642
Bydliště: Bratislava
Has thanked: 371 times
Been thanked: 788 times
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: )


Nahoru
 Profil  
 
 Předmět příspěvku: Re: První krůčky v asm na PMD
PříspěvekNapsal: 03.01.2015, 21:31 
Offline
Radil
Uživatelský avatar

Registrován: 13.05.2013, 17:48
Příspěvky: 529
Bydliště: Košice
Has thanked: 423 times
Been thanked: 265 times
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).

_________________
https://pmd85.borik.net - PMD 85 Emulátor, PMD 85, PMD 32-SD
https://pp01.borik.net - PP 01 Emulátor, PP 01, SD-ROM Modul


Nahoru
 Profil  
 
 Předmět příspěvku: Re: První krůčky v asm na PMD
PříspěvekNapsal: 03.01.2015, 23:07 
Offline
Radil

Registrován: 21.10.2013, 09:25
Příspěvky: 286
Has thanked: 161 times
Been thanked: 116 times
Díky "all", snad těch lamerských otazek nebude přibývat ;)


Nahoru
 Profil  
 
 Předmět příspěvku: Re: První krůčky v asm na PMD
PříspěvekNapsal: 04.01.2015, 00:07 
Offline
Kecka
Uživatelský avatar

Registrován: 27.11.2013, 14:57
Příspěvky: 48
Bydliště: Praha
Has thanked: 2 times
Been thanked: 22 times
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.)


Nahoru
 Profil  
 
 Předmět příspěvku: Re: První krůčky v asm na PMD
PříspěvekNapsal: 04.01.2015, 13:10 
Offline
Pan Štábní
Uživatelský avatar

Registrován: 13.05.2013, 10:52
Příspěvky: 1669
Bydliště: Mliecna draha
Has thanked: 19 times
Been thanked: 124 times
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'

_________________
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ředmět příspěvku: Re: První krůčky v asm na PMD
PříspěvekNapsal: 04.01.2015, 22:18 
Offline
Radil

Registrován: 21.10.2013, 09:25
Příspěvky: 286
Has thanked: 161 times
Been thanked: 116 times
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...


Nahoru
 Profil  
 
 Předmět příspěvku: Re: První krůčky v asm na PMD
PříspěvekNapsal: 04.01.2015, 22:51 
Offline
Kecka
Uživatelský avatar

Registrován: 27.11.2013, 14:57
Příspěvky: 48
Bydliště: Praha
Has thanked: 2 times
Been thanked: 22 times
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.


Nahoru
 Profil  
 
 Předmět příspěvku: Re: První krůčky v asm na PMD
PříspěvekNapsal: 05.01.2015, 14:45 
Offline
Radil

Registrován: 14.10.2013, 23:12
Příspěvky: 342
Has thanked: 261 times
Been thanked: 25 times
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


Nahoru
 Profil  
 
 Předmět příspěvku: Re: První krůčky v asm na PMD
PříspěvekNapsal: 05.01.2015, 18:30 
Offline
Radil
Uživatelský avatar

Registrován: 19.07.2013, 14:21
Příspěvky: 258
Bydliště: Košice
Has thanked: 143 times
Been thanked: 380 times
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. ;)


Nahoru
 Profil  
 
 Předmět příspěvku: Re: První krůčky v asm na PMD
PříspěvekNapsal: 05.01.2015, 23:27 
Offline
Kecka
Uživatelský avatar

Registrován: 27.11.2013, 14:57
Příspěvky: 48
Bydliště: Praha
Has thanked: 2 times
Been thanked: 22 times
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. :)


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ů: 48 ]  Přejít na stránku 1, 2, 3, 4  Další

Všechny časy jsou v UTC + 1 hodina [ Letní čas ]


Kdo je online

Uživatelé procházející toto fórum: Žádní registrovaní uživatelé a 1 návštěvní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