OldComp.cz http://oldcomp.cz/ |
|
První krůčky v asm na PMD http://oldcomp.cz/viewtopic.php?f=50&t=2179 |
Stránka 2 z 4 |
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:
A potom se podívat o čem to byla vlastně řeč [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
|
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?
|
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 Pre zmazanie spritu sa rutina zavolá z rovnakými parametrami.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 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 [ 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...
|
Stránka 2 z 4 | Všechny časy jsou v UTC + 1 hodina [ Letní čas ] |
Powered by phpBB® Forum Software © phpBB Group http://www.phpbb.com/ |