OldComp.cz
http://oldcomp.cz/

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

Autor:  faraon [ 06.01.2015, 06:51 ]
Předmět příspěvku:  Re: První krůčky v asm na PMD

Tak teď je asi ten správný čas na obeznámení se s "odbornou" historickou literaturou, doporučuji číst v pořadí v jakém spatřily světlo světa:

  1. Opravdoví programátoři nepoužívají Pascal - http://www.logix.cz/michal/humornik/Pojidaci.Kolacu.xp
  2. Příběh o Melovi - http://www.zive.cz/clanky/hacky-a-hacke ... fault.aspx

A potom se podívat o čem to byla vlastně řeč :lol:
[youtube]http://www.youtube.com/watch?v=7WaYYNUCWMY[/youtube]

Autor:  SC1 [ 06.01.2015, 09:46 ]
Předmět příspěvku:  Re: První krůčky v asm na PMD

Dovolím si drobnou OT vzpomínku na téma "zírání do assembleru". Blahé paměti jsme měli na škole předmět, jehož hlavním tématem bylo odstranit z kódu hazardy a optimalizovat ho na rychlost. Celé se to odehrávalo na simulátoru jakéhosi vymyšleného procesoru (asi aby nikdo nebyl ve výhodě). Pro získání zápočtu byla předložena úloha, kde bylo nutné vychytat všechny datové hazardy a zkrátit provádění programu v cyklech alespoň o 50 %. Ten zápočet byl klasifikovaný a známka se odvíjela od dosažené úspory strojového času.

Měli jsme ve finále všichni co dělat, abychom se na těch 50 % vůbec dostali. Když jsem potom po vyhlášení výsledků viděl, co se s tím ještě dalo dělat, tak jsem nevěřil.

To ale nebylo nic proti šoku, když v našich řadách byli odhaleni tři plagiátoři, které zkoušející usvědčil na základě příliš podobného "assemblerovského rukopisu". Vůbec nechápali, jak se na to přišlo. Normální člověk v tom nepoznal naprosto nic.

Autor:  zz_indigo [ 06.01.2015, 12:35 ]
Předmět příspěvku:  Re: První krůčky v asm na PMD

Inam Myslim si ze pitajuci by sa malnajprv naucit robit slusne v asemblery kym zacne studovat kody expertou v optimalizacii. Inak ho to moze dost demotivovat.

SC1 píše:
To ale nebylo nic proti šoku, když v našich řadách byli odhaleni tři plagiátoři, které zkoušející usvědčil na základě příliš podobného "assemblerovského rukopisu". Vůbec nechápali, jak se na to přišlo. Normální člověk v tom nepoznal naprosto nic.


To az taky problem nemusi byt. Ono aj optimalny algoritmus sa da obcas reralizovat roznyou sekvenciou prikazou + pouzite registre + pouzite pametove miesta, nazvoslovie a definovane funkcie.

Na vyske sme zo spolubyvajucim robili cca polke spoluziakou na intraku zadania v C-cku. To najtazsie bolo vzdy urobit sadu programou ktore nevyzeraju rovnako ale robia to iste.

Autor:  adent [ 06.01.2015, 13:51 ]
Předmět příspěvku:  Re: První krůčky v asm na PMD

zz_indigo píše:
Inam Myslim si ze pitajuci by sa malnajprv naucit robit slusne v asemblery kym zacne studovat kody expertou v optimalizacii. Inak ho to moze dost demotivovat.


To je pravda. Člověk, který si není jist v základech, tak triky (nebo řekněme "pokročilé techniky") nepochopí, a nejen to - může z nich získat falešné dojmy o tom, jak vlastně věci fungují.

Autor:  mmartinka [ 06.01.2015, 21:54 ]
Předmět příspěvku:  Re: První krůčky v asm na PMD

adent píše:
To je pravda. Člověk, který si není jist v základech, tak triky (nebo řekněme "pokročilé techniky") nepochopí, a nejen to - může z nich získat falešné dojmy o tom, jak vlastně věci fungují.


Naprostý souhlas...

Ale aby jsme se posunuli dál :) pro nás začátečníky platí co se nehýbe tak nežije. Proto jsem si zkusil svislý scroll...
Dělá mi to ale proužky, viz ukázka bin.
Kód:
; test šachovnice scroll

.ENGINE pmd

   .org 0
       mvi   a,7fh      ;barva
   lxi   h,49152      ;adresa obrazu
       mvi   b,20h      ;počet řádek
       mvi   c,06h      ;šířka
       mvi   e,10h
loop_h:
   mvi   d,08h      ;počet šířek na řádce (výsledek musí být 48)
sirka_w:
   mov   m,a         ;vyplnění adresy obrazu
   inx   h         ;zvýšení adresy obrazu
   dcr    c
   jnz    sirka_w      ;skok šířka čtverce
   mvi   c,06h
       xri   7fh         ;potřebuji negovat hodnotu
       dcr   d         ;snížení o jednu
       jnz   sirka_w      ;vykreslena jedna řádka
   dad   d         ;vypočítání další adresy řádku obrazu
   jc   opakovat
   dcr   b
   jnz   loop_h      ;vykreslena jedna řada čtverců
       xri   7fh         ;potřebuji negovat hodnotu
   mvi   b,20h      ;počet řádek
   jp   loop_h
opakovat:            ;skrolování svisle
   lxi   h,0b830h      ;adresa obrazu (- výpocet)
   mvi   b,08h      ;počet řádek
   mvi   c,06h      ;šířka
   mvi   d,20h      ;pro výpočet adresy (registr de)
   mvi   e,08h      ;počet šířek na řádce (výsledek musí být 48)
posuv_8:
   mov a,l         ;výpočet první řádky adresy ve čtverci
   adi   0d0h         ;tzn. +32 řádek k předchozí adrese
       mov   l,a         
   mov   a,h
   aci   07h
   mov   h,a
posuv_h:
   mov   a,m
   xri   7fh
   mov   m,a         ;vyplnění adresy obrazu
   inx   h         ;zvýšení adresy obrazu
   dcr   c
   jnz   posuv_h      ;skok šířka čtverce
   mvi   c,06h
   dcr   e         
   jnz   posuv_h      ;vykreslena jedna řádka
   mvi   e,08h      ;počet šířek na řádce (výsledek musí být 48)
   dcr   b
   jnz   posuv_8      ;překreslí 8x řádku
   mvi   b,08h      ;obnova počtu řádek
   mov a,l         ;výpočet vrchní řádky od které se bude začínat
   sui    0f0h
   mov l,a
   mov a,h
   sbi   037h
   mov   h,a
   dcr   d
   jnz    posuv_h
   jp   opakovat
   ret 
    .end


Přiložený bin - start JUMP 0000

Přílohy:
scroll.zip [259 bajtů]
742 krát

Autor:  adent [ 06.01.2015, 23:08 ]
Předmět příspěvku:  Re: První krůčky v asm na PMD

LE WOW! :) Sice to není scroll, jen to tak působí u šachovnice, ale furt dobrý.

A jestli můžu trošku radit - kód jsem nezkoumal, už je večer, jen jsem to tak okem přelítnul - tak bych měl první tip: Při programování v asm je důležité vědět, jestli optimalizuju na velikost (tj. potřebuju narvat co nejvíc funkcí do co nejmíň bajtů), nebo jestli optimalizuju na rychlost (tj. obětuju nějaký ten bajt na to, aby to celé pracovalo rychleji). Pokud optimalizuješ napsaný kód, tak to do určité míry jde dobře, jak ukázal Busy, ale pak si musíš vybrat: Jedeš na rychlost, nebo na paměť? Ukážu ti to názorně na jedné pasáži:

Kód:
sirka_w:
   mov   m,a         ;vyplnění adresy obrazu
   inx   h         ;zvýšení adresy obrazu
   dcr    c
   jnz    sirka_w      ;skok šířka čtverce


Tohle je "optimalizace na velikost" - 5 bajtů. Ovšem zabere to při každém průchodu mnoho T navíc (dcr c a podmíněný skok) - v tomto případě to zabere 324 T. Kdybych optimalizoval na rychlost, tak tu smyčku "rozvinu", tj. zopakuju ji. Navíc tady je počet opakování konstantní (6), takže když to celé šestkrát zopakuješ, tak to sice zabere 12 bajtů, ale bude to podstatně rychlejší:

Kód:
sirka_w:
   mov   m,a         ;vyplnění adresy obrazu
   inx   h         ;zvýšení adresy obrazu
   mov   m,a         ;vyplnění adresy obrazu
   inx   h         ;zvýšení adresy obrazu
   mov   m,a         ;vyplnění adresy obrazu
   inx   h         ;zvýšení adresy obrazu
   mov   m,a         ;vyplnění adresy obrazu
   inx   h         ;zvýšení adresy obrazu
   mov   m,a         ;vyplnění adresy obrazu
   inx   h         ;zvýšení adresy obrazu
   mov   m,a         ;vyplnění adresy obrazu
   inx   h         ;zvýšení adresy obrazu


Tedy +7 bajtů (12 místo 5), ale 72 cyklů procesoru (T), ergo zrychlení 77%, a navíc ušetříš jeden registr. A to se vyplatí!

A abys to nemusel furt opakovat přes copy a paste, tak dáš:

Kód:
sirka_w:
   .rept 6
   mov   m,a         ;vyplnění adresy obrazu
   inx   h         ;zvýšení adresy obrazu
   .endm


a assembler to zopakuje za tebe.

PS: Ve skutečnosti to v tomto případě bude možná lepší i na velikost, pokud všude vyhodíš to - teď už zbytečné - MVI C, 6 před vstupem do smyčky...

Autor:  ub880d [ 07.01.2015, 05:20 ]
Předmět příspěvku:  Re: První krůčky v asm na PMD

"scroll" som napisal po svojom (snad funguje spravne ;]), novacikom prijemnu analyzu ;]
(je to sice pre iny asm, ale prepisat do preferovaneho by nemal byt problem)

Kód:
                cpu     8080
                relaxed on

                org     0   
               
                lxi     h,0xc000
                lxi     d,0x10
loop1           
                mov     a,h
                ani     0x08 
                jz      skipmvi
                mvi     a,0x3f
skipmvi
                mvi     b,8
loop2
                xri     0x3f
                mvi     c,6
loop3
                mov     m,a
                inx     h 
     
                dcr     c 
                jnz     loop3
               
                dcr     b
                jnz     loop2
               
                dad     d
                jnc     loop1
               
               

                lxi     d,0x07d0
                lxi     h,0xc000
                mvi     c,0x40
loop4
                mvi     b,0x30 
loop5
                mov     a,m
                xri     0x3f 
                mov     m,a
                inx     h 
               
                dcr     b 
                jnz     loop5
               
                dad     d
                jnc     loop4
               
                dad     b
                mov     a,h 
                ani     7
                ori     0xc0
                mov     h,a
                jmp     loop4

Autor:  adent [ 07.01.2015, 12:03 ]
Předmět příspěvku:  Re: První krůčky v asm na PMD

ub880d píše:
(je to sice pre iny asm, ale prepisat do preferovaneho by nemal byt problem)


Vyhodil jsem první dva řádky (CPU a relaxed), dopsal ".engine pmd" a dvojtečky za návěští... a bylo :)

Autor:  mmartinka [ 08.01.2015, 18:03 ]
Předmět příspěvku:  Re: První krůčky v asm na PMD

adent píše:
LE WOW! :) Sice to není scroll, jen to tak působí u šachovnice, ale furt dobrý.

Já vím že to jen tak vypadá, ale vypadá to dobře ;)

adent píše:
Kód:
sirka_w:
   mov   m,a         ;vyplnění adresy obrazu
   inx   h         ;zvýšení adresy obrazu
   dcr    c
   jnz    sirka_w      ;skok šířka čtverce


Tohle je "optimalizace na velikost" - 5 bajtů. Ovšem zabere to při každém průchodu mnoho T navíc (dcr c a podmíněný skok) - v tomto případě to zabere 324 T. Kdybych optimalizoval na rychlost, tak tu smyčku "rozvinu", tj. zopakuju ji. Navíc tady je počet opakování konstantní (6), takže když to celé šestkrát zopakuješ, tak to sice zabere 12 bajtů, ale bude to podstatně rychlejší:

A abys to nemusel furt opakovat přes copy a paste, tak dáš:

Kód:
sirka_w:
   .rept 6
   mov   m,a         ;vyplnění adresy obrazu
   inx   h         ;zvýšení adresy obrazu
   .endm

Díky za tip.

Autor:  mmartinka [ 08.01.2015, 18:11 ]
Předmět příspěvku:  Re: První krůčky v asm na PMD

Tak poslení varianta, je poučením z každé rady, je kratší a rychlejší což je pozitivní výsledek.

Kód:
; test šachovnice scroll

.ENGINE pmd

   .org 0
   mvi      a,7fh         ;barva
   lxi      h,49152      ;adresa obrazu
   mvi      b,20h      ;počet řádek
   mvi      e,10h
loop_h:
   mvi      d,08h      ;počet šířek na řádce (výsledek musí být 48)
sirka_w:
   .rept   6            ;makro 6x opakuje příkazy mezi .endm
   mov      m,a         ;vyplnění adresy obrazu
   inx      h         ;zvýšení adresy obrazu
   .endm
   xri      7fh         ;potřebuji negovat hodnotu
   dcr      d         ;snížení o jednu
   jnz      sirka_w      ;vykreslena jedna řádka
   dad      d         ;vypočítání další adresy řádku obrazu
   jc      opakovat
   dcr      b
   jnz      loop_h      ;vykreslena jedna řada čtverců
   xri      7fh         ;potřebuji negovat hodnotu
   mvi      b,20h      ;počet řádek
   jp      loop_h
opakovat:               ;skrolování svisle
   lxi      h,0c000h      ;adresa obrazu
   lxi      d,007d0h      
   mvi      c,30h      ;počet znaků na řádce (48)
   mvi      b,20h
posuv_h:
   mov      a,m
   xri      7fh
   mov      m,a         ;vyplnění adresy obrazu
   inx      h         ;zvýšení adresy obrazu
   dcr      c
   jnz      posuv_h      ;vykreslena jedna řádka
   mvi      c,30h      ;počet znaků na řádce (48)
   dad      d
   jnc      posuv_h   
   mov      a,l         ;výpočet vrchní řádky od které se bude začínat
   sui      0c0h
   mov      l,a
   mov      a,h
   sbi      03fh
   mov      h,a
   dcr      b
   jnz      posuv_h
   jp      opakovat
   .end


Rád bych zkusil pohyb šachové figurky po šachovnici. Má nebo je někde nějaká jednoduchá ukázka pohybu s sprajtem?

Přílohy:
scroll_2.zip [243 bajtů]
724 krát

Autor:  ub880d [ 08.01.2015, 22:13 ]
Předmět příspěvku:  Re: První krůčky v asm na PMD

mmartinka píše:
Tak poslení varianta, je poučením z každé rady, je kratší a rychlejší což je pozitivní výsledek.

este Busyho pripomienka cislo 2 (a ako sa vravi, aj majster tesar sa utne a tak aj busyho rutinka trpi tym co pripominal ;])

ja aby som nemusel riesit atributove kolizie (pri pouziti colorace) som kreslil zelenu. aby to bolo cervene bez kolizii, treba pridat este jednu instrukciu (do mojej verzie), to by mohla byt dalsia uloha pre kodovania chtivych zaciatocnikov ;]

a este jedna drobnost, tvoja "finalna" verzia obsahuje prebytocnu instrukciu, kto ju najde? ;]

Autor:  rombor [ 08.01.2015, 23:58 ]
Předmět příspěvku:  Re: První krůčky v asm na PMD

mmartinka píše:
Rád bych zkusil pohyb šachové figurky po šachovnici. Má nebo je někde nějaká jednoduchá ukázka pohybu s sprajtem?
Pre nakreslenie spritov odporúčam použiť náš RM-TEAM 8bit Sprite Editor.

Pre konkrétny prípad šachovej figúrky bude stačiť nemaskovaný sprite, ktorý sa bude zobrazovať napr. invertovane voči pozadiu, teda konkrétnemu políčku. To si ale vyžiada, aby boli čierne a biele figúrky odlíšené aj kresbou. Pre daný príklad ukážky zobrazenia spritu, to ale postačuje.
Kód:
; I: HL=adresa VRAM, DE=adresa dát spritu
DrawSprite:
   mvi   c,32  ; výška 32 mikroriadkov
DrawSpriteL:
   mvi  b,6    ; šírka 6 znakových pozícií
DrawSpriteR:
   ldax d      ; byte predlohy
   xra  m      ; "invertuj" s obsahom VRAM
   mov  m,a    ; a ulož do VRAM
   inx  d      ; posuň ukazatele
   inx  h
   dcr  b      ; opakuj pre celú šírku
   jnz  DrawSpriteR
   mov  a,c    ; odpamätaj zostávajúcu výšku
   mvi  c,64-6 ; posuň sa na ďalší mikroriadok VRAM
   dad  b
   mov  c,a    ; obnov zostávajúcu výšku
   dcr  c      ; opakuj pre celú výšku
   jnz  DrawSpriteL
   ret
Pre zmazanie spritu sa rutina zavolá z rovnakými parametrami.
Pohyb spritu je už iba zmena adresy VRAM medzi volaniami rutiny.

Autor:  ub880d [ 09.01.2015, 09:24 ]
Předmět příspěvku:  Re: První krůčky v asm na PMD

prave naopak, kedze sa kresli po sachovnici, odporucam maskovane sprite, aby figurky vypadali rovnako na bielych aj na ciernych poliach.
Kód:
                cpu     8080
                relaxed on 
               
farba           equ     0x80

                org     0
               
                lxi     h,0xc000
                lxi     d,0x10
loop1           
                mov     a,h
                ani     0x08
                mvi     a,farba
                jz      skipmvi
                xri     0x3f
skipmvi         
                mvi     b,8
loop2
                xri     0x3f
                mvi     c,6
loop3
                mov     m,a
                inx     h
               
                dcr     c
                jnz     loop3   
               
                dcr     b
                jnz     loop2
               
                dad     d
                jnc     loop1
               
                lxi     h,figurka
                lxi     d,0xc000
                call    draw_piece
               
                lxi     h,figurka
                lxi     d,0xc006
                call    draw_piece
               
                lxi     h,figurka
                lxi     d,0xc40f
                call    draw_piece
               
                ret
               
                ;hl=sprite de=screen position
draw_piece
                mvi     c,32
draw_loop1
                mvi     b,6
draw_loop2
                ldax    d
                ana     m
                inx     h
                ora     m
                inx     h
                stax    d
                inx     d
                dcr     b
                jnz     draw_loop2
               
                mov     a,e
                adi     0x40-6
                mov     e,a
                jnc     skipinr
                inr     d
skipinr
                dcr     c
                jnz     draw_loop1
                ret
               
figurka
                db      255,0,255,0,255,0,255,0,255,0,255,0
                db      255,0,255,0,255,0,255,0,255,0,255,0
                db      255,0,255,0,255,0,255,0,255,0,255,0
                db      255,0,255,0,255,0,255,0,255,0,255,0
                db      255,0,255,0,255,0,192,0,255,0,255,0
                db      255,0,255,0,199,0,192,30,254,0,255,0
                db      255,0,255,0,193,48,192,55,252,0,255,0
                db      255,0,255,0,192,60,192,59,252,1,255,0
                db      255,0,207,0,192,14,192,47,252,1,255,0
                db      255,0,199,32,192,15,192,55,252,1,255,0
                db      255,0,199,48,192,63,192,27,252,1,255,0
                db      255,0,199,48,192,63,192,47,252,1,255,0
                db      255,0,199,32,192,63,192,55,252,1,255,0
                db      255,0,207,0,192,63,192,59,252,0,255,0
                db      255,0,223,0,192,32,192,63,254,0,255,0
                db      255,0,255,0,199,32,192,63,254,0,255,0
                db      255,0,255,0,199,48,192,31,254,0,255,0
                db      255,0,255,0,195,48,192,31,255,0,255,0
                db      255,0,255,0,193,56,192,31,255,0,255,0
                db      255,0,255,0,192,60,192,31,255,0,255,0
                db      255,0,223,0,192,62,192,31,255,0,255,0
                db      255,0,207,0,192,63,192,31,252,0,255,0
                db      255,0,199,32,192,63,192,63,240,1,255,0
                db      255,0,195,48,192,63,192,63,224,7,255,0
                db      255,0,195,24,192,0,192,0,224,12,255,0
                db      255,0,195,56,192,63,192,63,224,15,255,0
                db      255,0,195,48,192,63,192,63,224,7,255,0
                db      255,0,199,0,192,0,192,0,240,0,255,0
                db      255,0,255,0,255,0,255,0,255,0,255,0
                db      255,0,255,0,255,0,255,0,255,0,255,0
                db      255,0,255,0,255,0,255,0,255,0,255,0   
                db      255,0,255,0,255,0,255,0,255,0,255,0 

Autor:  mmartinka [ 09.01.2015, 14:20 ]
Předmět příspěvku:  Re: První krůčky v asm na PMD

rombor píše:
mmartinka píše:
Rád bych zkusil pohyb šachové figurky po šachovnici. Má nebo je někde nějaká jednoduchá ukázka pohybu s sprajtem?
Pre nakreslenie spritov odporúčam použiť náš RM-TEAM 8bit Sprite Editor.

O vašem editoru spritu vím a také jsem ho použil :)

Díky za kód funguje parádně, ale ještě prozkoumat to s maskováním.
Příloha:
otisk.png
otisk.png [ 6.34 KiB | Zobrazeno 29406 krát ]

Autor:  mmartinka [ 11.01.2015, 18:34 ]
Předmět příspěvku:  Re: První krůčky v asm na PMD

rombor píše:
mmartinka píše:
Rád bych zkusil pohyb šachové figurky po šachovnici. Má nebo je někde nějaká jednoduchá ukázka pohybu s sprajtem?
Pre nakreslenie spritov odporúčam použiť náš RM-TEAM 8bit Sprite Editor.

Stahl jsem si vaši poslední verzi a nakreslil si pár figurek.
Mě osobně chybělo:
skrytí linek mezi pixely;
vedlejší náhled obrázku s maskou;

Jinak super prográmek...

Přílohy:
figurky2.png
figurky2.png [ 6.66 KiB | Zobrazeno 29342 krát ]

Stránka 24 Všechny časy jsou v UTC + 1 hodina [ Letní čas ]
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/