Oznámení

Sbalit
Aktuálně žádná oznámení.

Assembler - všeobecná logika

Sbalit
X
 
  • Filtr
  • Čas
  • Zobrazit
Vymazat vše
new posts

  • Lisiak
    odpověděl
    Resi se nejak u hole Amigy 500/1200 jejich detekce v ramci programovani? Rozdily vykonu obou pocitacu jsou celkem znacne. Tedy pokud chceme provest neco na obrazovce a zabezpecit aby to stejne rychle delala i A500 znamena to hodne velike osekani celkovych moznosti, z meho pohledu dost radikalni osekani, protoze A1200 je vuci A500 opravdu celkem rychlik.

    A taky casovani VBLANK mi pro holou A500 zatim pride hodne hrube. Tedy ze se za 1 snimek po programove strace u hole A500 toho neda moc stihnout. Ale samozrejme me prvni dojmy.

    Kdyby jsem nemusel resit u ASM vykon A500, ale pouze A1200 a vyssi, citim se podstatne lepe

    Vložit komentář:


  • Lisiak
    odpověděl
    Tak dnes taková drobnost, udělal jsem to prvně a to zvýšení 2 menších čítačů. Jeden v rozsahu 4 bitů (o hodnotu +1) a druhý v rozsahu 2 bajtů (ale jen těsně, horní hranice čísla se motá kolem 500 desítkově a tam je to o hodnotu +3) v jedné instrukci.

    Alespoň mně to pobavilo

    ADD.L #$30010, A1

    Vložit komentář:


  • Lisiak
    odpověděl
    Pokus rozběhani intra na A500+ s 2MB chip RAM. První problém je někde v miniwraperu od Photona co odstavuje systém, ten jsem zatím kompletně vyhodil. Další problém je v zobrazovací části textu.

    Ale...
    ​​​​​​


    ​​​​​

    Vložit komentář:


  • Lisiak
    odpověděl
    Nedá mi to a zajímá mně jak šikovně by si řešil skutečnost, že při jiném režimu zobrazování textu (znaky 1 až 9 a A až F), vůči tomu standardnímu se ti začne na A1200 hudba v tempu zpomalovat a když dáš u CIA hodnotu o 1 menší máš tempo skladby moc rychlé. Jak by si to pak přibrzdil, aniž by si přidával co i jen 1 řádek dalšího kódu? Opět jen pro zajímavost, ve skutečnosti se hodnota nastavení CIA sníží o 5, protože se dělá celkem 5 cyklů (hraje se melodie rychlostí 5). Já mám rychlost i 0, tedy v MODu je nastavení 5 a u mně 4 🙂

    ...jen se s tebou bavím o tom co mně baví. Ono mně někdy ty řešení opravdu pobaví, minimálně v závěru.

    ​​​​​​

    Vložit komentář:


  • Lisiak
    odpověděl
    Díky, já LEA používám zatím jako PC relativní adresaci, vím že to byl příklad . Já řešil zacyklení celého intra a to je skok více než 2 byte. Jenže pokud chceš použít při odečtu i poslední bit ze 2 byte, jíž musíš pracovat s rozsahem Long, aby byl výsledek správný, co jsem si musel uvědomit. Na pro mně potřebný skok mi 2 byte nestačí. Tak si jen odchytnu poslední bit ze 2 byte a provedu skok přímo v kódu, aniž bych hodnotu zadával do textového enginu. Nižší hodnoty bez posledního bitu ze 2 bytu jsou již zpracovávány textovým enginem. Já si teď ověřuji, jestli mám ten skok správný. Ono nedělám skok na úplný začátek, to jen tak pro zajímavost. Kvůli tomu si ještě budu muset sesynchronizovat druhou smyčku programu s tou první.

    Vložit komentář:


  • Defor
    odpověděl
    Hodnota v adresovém registru je vždy v plném rozsahu 32 bitů. Adresové registry podporují pouze aritmetické operace v plném rozsahu 32 bitů.
    V důsledku to znamená, že jakákoliv hodnota s menším počtem bitů (8 nebo 16) použitá jako vstupní operand je automaticky rozšířená na plný rozsah 32 bitů. Hodnota vstupního operandu se vždy bere, že je se znaménkem!
    Z tvého popisu to vypadá, jako by nebylo možné mít v adresovém registru hodnotu $8000 aniž by nebyla rozšířená na 32 bitové číslo $FFFF8000. To samozřejmě není pravda. K nastavení nebo vynulování horních 16 bitů dojde pouze při přesunu nebo při aritmetické operaci.
    Code:
    move.w #$8000,d0
    move.w d0,a0
    v A0 bude hodnota #$FFFF8000.
    Code:
    lea.l $8000,a0
    Tady bude mít A0 normálně hodnotu $00008000.
    Code:
    moveq #-1,d0
    add.w d0,a0
    bude mít stejný výsledek jako
    Code:
    moveq #-1,d0
    add.l d0,a0
    Z toho vyplývají některé optimalizace. Např. je zbytečné dělat
    Code:
    add.l #2,a0
    stačí
    Code:
    add.w #2,a0
    Je zbytečné dělat
    Code:
    lea.l $4,a6
    stačí
    Code:
    lea.l $4.w,a6
    (assembler se zaplou optimalizací si toho ale asi všimne a udělá úpravu sám)
    apod.
    Naposledy upravil Defor; 24.03.2023, 19:48:01.

    Vložit komentář:


  • Lisiak
    odpověděl
    ​​​​​​Předpokládám, že vlastnost, když máme v adresovém registru v rozsahu word nejvyšší bit na logické 1 = 8000h, se další 2 byte (druhý word z Longu nastaví na hodnotu FFFF = FFFF8000h) má opodstatnění o kterém zatím nevím... .

    Edit: pokud do adresového registru dáváme hodnotu v rozsahu wordu...
    Naposledy upravil Lisiak; 22.03.2023, 14:13:47.

    Vložit komentář:


  • Lisiak
    odpověděl
    Autorem citovaného textu je Lisiak Přejít na původní příspěvek
    ​​​​​​
    Někdo si může říci neúspěch. Já tohle žeru. To je boží jak to na té poddimenzované frekvenci pro vykonání programové smyčky nestíhá!
    Problém dle všeho vyřešen.

    Vložit komentář:


  • Lisiak
    odpověděl
    Já to prostě nedám a tuhle informací ze dneška pustím ven. Chtěl jsem zobrazovat můj hudební formát v reálném čase i na obrazovku, nicméně ta nízká frekvence na které běží můj program pověšený na mou hudební rutinu je tak nízká, že mi u tohohle rychlého zobrazování textu začala má A1200 pouze s Fast RAM malinko táhnout zvuk. Tenhle problém již nebudu řešit a asi zobrazím hudební formát běžným pomalejším způsobem aby to i 020ka dávala.
    ​​​​​​
    Někdo si může říci neúspěch. Já tohle žeru. To je boží jak to na té poddimenzované frekvenci pro vykonání programové smyčky nestíhá!

    Samozřejmě výkonu u 020 je dost, jen jsem ji moc "přiškrtil" na rychlé zobrazování textu

    Vložit komentář:


  • Lisiak
    odpověděl
    Já mám již skladbu ve 2 patternech v mém formátu nějaký pátek převedenou, ale dnes jsem se něčím zabýval a přimělo se mně to podívat na velikost 2 patternů v bytech.

    Nesoutěžím, to není cíl, ale drobnosti jednoduše potěší.

    Info z Eagleplayeru a pak můj skok přes 2 patterny u stejné skladby.

    EP: 3132 bajtů, můj hudební formát 1092 bajtů (444 hexa)

    MOD je samozřejmě komplexnější formát ale i tak jsem byl překvapen. Počítal jsem že budu celkově tak na 2 KB. Tedy 1 KB na jeden pattern.

    Tak jen tak pro zajímavost...

    Vložit komentář:


  • Lisiak
    odpověděl
    Díky za odpověď. Jsem opět o něco chytřejší. Dnes jsem provedl nějaké testy jak to vše vypadá s mezerou místo nuly a myslím že je to ok. Pro použití nuly bych musel opět drobátko nabalit kód, tak když to není nutný, nebudu to dělat.

    Já mám 2 druhy vizuální mezery. Ta druhá mezera říká, že se má provést další veliký cyklus programu, tedy se opustí část kódu, která by se jinak opakovala. Zároveň se tahle funkce "druhé" mezery dá použít i jako časovač, aniž by jsem jej musel definovat, co je taky fajn.

    ​​​​​ V té druhé části máš asi makra. K těm jsem se nedostal, i když princip je dle všeho jednoduchý. Dělají se tam nějaké bitové (bytové?) posuny.
    Ale to u mně není na pořadu dne.

    Já jen ROR, ROL, ASR, ASL...

    Vložit komentář:


  • Defor
    odpověděl
    Obvykle se za logickou pravdu (true) používá jakákoliv _nenulová_ hodnota. Má to tak C, C++, C# a asi i mnoho dalších procedurálních jazyků vycházejících z Algolu. Naopak nepravda (false) je definována jako nulová hodnota, bez ohledu na počet bitů.
    Ve tvém případě by to tedy mohlo být tak, že "space" je tam, kde je nula, jinak se zobrazí znak. Problém může být to, že "space" je vlastně taky znak. Ale to nemusí být v praxi potřebné.
    Pokud ale chceš mít uloženy informace true/false, že se někde něco (v prostoru) zobrazuje, ta nejúspornější varianta uložení je tzv. bitfield array - pole bitů. Například v C/C++ hodnotu true/false pro celočíselný index X získáš jako ( bitarray[ X >> 3 ] & ( 0x80 >> ( X & 7 ) ) ). Nastavit hodnotu můžeš použitím ( IsTrue ? bitarray[ X >> 3 ] |= ( 0x80 >> ( X & 7 ) ) : bitarray[ X >> 3 ] &= ~( 0x80 >> ( X & 7 ) ) ). Pro deklaraci "unsigned char* bitarray;".

    Vložit komentář:


  • Lisiak
    odpověděl
    ...tak použil jsem větu:
    Místo hodnoty 0 je použitá mezera.

    Vložit komentář:


  • Lisiak
    odpověděl
    ...tedy to co jsem napsal vlastně není pořád přesné, protože mezera bude pouze za stavu kdy budeme mít vynulovaný kompletně celý 1 byte

    Vložit komentář:


  • Lisiak
    odpověděl


    Jak co nejlépe pro kohokoliv podat informaci o tom, že se budou na obrazovce zobrazovat pouze data, které mají hodnotu logické 1. Data se budou zobrazovat v hexadecimální soustavě, ale tahle informace již podaná je. To je spíše info pro vás. Kde nebudou logické 1 budou mezery / mezera.

    Vložit komentář:

Zpracovávám...
X