Welcome, Guest. Please login or register.


Author Topic: Assembly programozás (Read 257327 times)

Offline Zozosoft

  • Global Moderator
  • EP addict
  • *
  • Posts: 14732
  • Country: hu
    • http://enterprise.iko.hu/
Re: Assembly programozás
« Reply #675 on: 2013.November.05. 09:49:08 »
Quote from: Povi
tudom, hogy az LPT-t kell birizgálni hozzá, de bevallom férfiasan, hogy nem nagyon értem...
Egyébként emlékszem, hogy sok évig nekem is "mumus" volt ez a LPT téma, meg a Z80/videó címek különbözősége. Aztán egyszer beugrik az embernek, és rájön, hogy tök egyszerű :-)

Offline IstvanV

  • EP addict
  • *
  • Posts: 4822
Re: Assembly programozás
« Reply #676 on: 2013.November.05. 12:37:01 »
Grafikus képernyő kezelésére az itt található programokban is van néhány egyszerű példa:
- video szegmensek foglalása és a nem használt szegmensek felszabadítása
- egyszerű LPT (az egész aktív képterület egy LPB) létrehozása és a cím beállítása
- BORDER és BIAS állítása EXOS hívással
- vonal rajzolása és terület feltöltése (FILL) 2 színű módban (graph.s)
- 16 színű pixel rajzolás dither használatával (mandel.s)
« Last Edit: 2013.November.05. 12:41:10 by IstvanV »

Offline IstvanV

  • EP addict
  • *
  • Posts: 4822
Re: Assembly programozás
« Reply #677 on: 2013.November.05. 12:51:48 »
Quote from: geco
A négyszögjelnél meg az említett 32-t, és azt a megfelelő volume értékkel lejátszani?
Az is egy lehetséges megoldás, de akkor a lejátszó kódban kell megvalósítani a hangerő szabályozását. Ez lehet egy egyszerű AND utasítás (7 ciklus a hangerű táblázat 14 ciklusa helyett), de akkor kis hangerőnél "kattog" a négyszögjel az indításakor és a kikapcsolásakor (mert például 48 és 16 helyett 32 és 0 értéke lehet fél hangerőnél). Vagy egy kis méretű táblázat csak négyszögjelhez (a többi hullámformánál letiltva), ami helyet takarítana meg (illetve valójában nem, csak nem lenne "szétszórva" a szabad terület, mint a 16K-s táblázatnál, amiből csak 4K ténylegesen használt) a hangerőszabályozás kisebb felbontása árán. Egyébként 16 hangerő szintnél a külön táblázat foglalna kevesebb helyet, és még 32-nél is csak kb. hasonló memória igénye lenne. :)

Offline IstvanV

  • EP addict
  • *
  • Posts: 4822
Re: Assembly programozás
« Reply #678 on: 2013.November.05. 13:29:17 »
Zaj összehasonlítás:

[ Guests cannot view attachments ]

3 különböző frekvencia, az utolsó a legnagyobb, amit a C64-es SID tud. Minden frekvencián a 3 generátor ebben a sorrendben hallható:
- 1.: PC-s véletlenszám generátor 8 bites felbontásra kerekítve (ez az eredeti - jó minőségű - SID zajt prbálja közelítően emulálni)
- 2.: 17 bites polinom számláló (~0.577x hangerővel, hogy ne legyen hangosabb, mint az előző)
- 3.: 256 elemű táblázat véletlenszerű 8 bites értékekkel feltöltve

Offline geco

  • EP addict
  • *
  • Posts: 7113
  • Country: hu
    • Támogató Támogató
Re: Assembly programozás
« Reply #679 on: 2013.November.05. 14:20:34 »
a polinom számlálós verzió egész jó, alacsony frekin hallottam különbséget.

Offline Povi

  • EP addict
  • *
  • Posts: 2297
  • Country: hu
    • http://povi.fw.hu
Re: Assembly programozás
« Reply #680 on: 2013.November.05. 15:05:18 »
Quote from: IstvanV
Grafikus képernyő kezelésére az itt található programokban is van néhány egyszerű példa:
- video szegmensek foglalása és a nem használt szegmensek felszabadítása
- egyszerű LPT (az egész aktív képterület egy LPB) létrehozása és a cím beállítása
- BORDER és BIAS állítása EXOS hívással
- vonal rajzolása és terület feltöltése (FILL) 2 színű módban (graph.s)
- 16 színű pixel rajzolás dither használatával (mandel.s)
igen, nézegettem azokat is, nekem főleg az LPT-vel voltak gondok, a szabályos szegmensigénylés eddig is ment :-) meg a rajzoló rutinokra gondoltam, hogy föl kéne használni Pascal-ban, és lenne egy übergyors pitpixel, lineto, moveto és floodfill rutin :-)
*** Speicherplatz zu klein

Offline IstvanV

  • EP addict
  • *
  • Posts: 4822
Re: Assembly programozás
« Reply #681 on: 2013.November.06. 12:27:47 »
Quote from: geco
a polinom számlálós verzió egész jó, alacsony frekin hallottam különbséget.
Egy probléma azért még van a polinom számlálóval: ez sem kompatibilis azzal, ha 20h a kimenet, amikor nincs hang. Tehát ez is "kattogna" alacsony hangerőnél. Ha minden hullámformánál 00h lenne a kikapcsolt hang, akkor legalább következetesen fordulna elő ez a "hiba". :) Így azonban már lehetséges lenne a hangerő táblázat elkerülése, és AND utasítás használata a négyszögjel és zaj 6 bites hangerő szabályozásához. A fűrészjelnél és a háromszögjelnél külön táblázatokat készítve minden hangerőhoz az 5 bites felbontás még elfogadható memória igényű (2 * 8 KB), és a táblázatokban nem csak lineárisan növekvő hangerő lehet - a logaritmikus jobban kihasználja a korlátozott felbontást. További előny, hogy pont marad még idő gyűrűmodulációra is:

Code: ZiLOG Z80 Assembler
  1. sidSynth:
  2.         di                              ;                                 4
  3. .l1:    ld      bc, 0000h               ; * frequency 1 (= SID_freq/4)   14
  4.         add     ix, bc                  ;                                29
  5.         ld      a, h                    ;                                33
  6. .l2:    and     00h                     ; * 00h/80h: ring mod. off/on    40
  7.         xor     ixh                     ;                                48
  8.         ld      e, a                    ;                                52
  9. .l3:    ld      d, high triangleTable   ; * waveform/volume 1            59
  10.         ld      a, (de)                 ;                                66
  11. .l4:    and     0ffh                    ; * square/noise volume or FFh   73
  12.         out     (0a8h), a               ;                                84
  13. .l5:    ld      bc, 0000h               ; * frequency 2 (= SID_freq/4)   94
  14.         add     iy, bc                  ;                               109
  15.         ld      a, ixh                  ;                               117
  16. .l6:    and     00h                     ; * 00h/80h: ring mod. off/on   124
  17.         xor     iyh                     ;                               132
  18.         ld      e, a                    ;                               136
  19. .l7:    ld      d, high triangleTable   ; * waveform/volume 2           143
  20.         ld      a, (de)                 ;                               150
  21. .l8:    and     0ffh                    ; * square/noise volume or FFh  157
  22.         out     (0adh), a               ;                               168
  23. .l9:    ld      bc, 0000h               ; * frequency 3 (= SID_freq/4)  178
  24.         add     hl, bc                  ;                               189
  25.         ld      a, iyh                  ;                               197
  26. .l10:   and     00h                     ; * 00h/80h: ring mod. off/on   204
  27.         xor     h                       ;                               208
  28.         ld      e, a                    ;                               212
  29. .l11:   ld      d, high triangleTable   ; * waveform/volume 3           219
  30.         ld      a, (de)                 ;                               226
  31. .l12:   and     0ffh                    ; * square/noise volume or FFh  233
  32.         out     (0aah), a               ;                               244
  33.         ei                              ;                               248
  34.         jp      sidSynth                ;                               258

Így (a megszakítások által "ellopott" időt figyelmen kívül hagyva, ami lassítja és torzítja a lejátszást) a mintavételezési frekvencia 15503.88 Hz, ami jól közelíti a PAL C64-es SID órajelének a 64-ed részét (15394.51 Hz), egyszerűsítve a frekvencia konverziót, legalábbis a zaj kivételével. Problémák:
- a paraméterek kezelése megszakításban viszonylag bonyolult a konverziók és a különböző hullámformák eltérő megvalósítása miatt
- "kattogás" a 20h helyett 00h referencia szint miatt
- alacsony frekvencián a polinom számlálós zaj eltér az eredeti SID zajtól (ha nem is nagyon zavaróan); figyelni kell még a zaj hangerejére is, amit csökkenteni kell a többi hullámformához képest, hogy ne legyen túl hangos

Éredekes lenne még egy nagyobb tudású, de lassabb emulátort készíteni, ami turbós gépeken a lehető legjobb minőséget próbálná elérni (szinkron emulációja, nagy táblázatos zaj, nagy frekvenciájú megszakítás jobb burkológörbékhez, stb.).
« Last Edit: 2013.November.06. 12:31:27 by IstvanV »

Offline geco

  • EP addict
  • *
  • Posts: 7113
  • Country: hu
    • Támogató Támogató
Re: Assembly programozás
« Reply #682 on: 2013.November.06. 13:28:42 »
:smt041 Ez teccik, ha elődolgozott adatokkat használunk, akkor az sokat faraghat a megszakításban futó vezérlés idejéből, pl a zaj hangerejét is előemésztve adni a vezérlés szájába, úgy gondoltam, hogy semmit se kelljen online konvertálni, midnen konvertálnivaló legyen előre lekonvertálva ( zaj frekvencia, esetleg már a 64-gyel való osztás is legyen elrőe elintézve ha nem zajunk van, és a zaj volume értékei is, az egy másik kérdés, hogy ezt a program intézze futás előtt, vagy eleve már a beolvasott fájl így tartalmazza ezeket az értékeket )
« Last Edit: 2013.November.06. 14:00:45 by geco »

Offline Zozosoft

  • Global Moderator
  • EP addict
  • *
  • Posts: 14732
  • Country: hu
    • http://enterprise.iko.hu/
Re: Assembly programozás
« Reply #683 on: 2013.November.06. 13:31:52 »
Quote from: IstvanV
Éredekes lenne még egy nagyobb tudású, de lassabb emulátort készíteni, ami turbós gépeken a lehető legjobb minőséget próbálná elérni
Ezt már én is akartam javasolni!

Offline Z80System

  • EP addict
  • *
  • Posts: 3848
  • Country: hu
Re: Assembly programozás
« Reply #684 on: 2013.November.13. 15:19:20 »
Olyanban gondolkodok, hogy a csillagmozgatásom is teljesen letárolt lesz (amint próbalok bármit számolni, vagy sebessegtáblazatot használni, rögtön duplázódik az ideje), es a letárolt mozgásból pedig pop -al akarok olvasni, ezért a csillagmozgas kirajzolo kodot betennem chunk -okban a 4KHz hangmegszakításba (mert a főprogramban a megszak miatt nem hasznalhatok SP -t) oly módon, hogy mikor lement az az X darab hangmegszak, amelyek a hang mellett a csillagokat is rajzolják, akkor az utolsó átváltja a hangmegszakot a korábban már tárgyalt síma és gyors hangmegszakra, és a csillagrajzolós verziót majd csak a video megszak figyelés után váltja vissza a főprogram.

Így azt akarom elérni, hogy mikor a csillagos verzió fut, az olyan legyen, mintha az főprogramban futna, csak a főprogramnak olyankor egyáltalán nem lesz ideje futni, hanem a hangmegszak töltse ki az összes időt, aztán meg mikor a sima hangmegszak van, akkor az maximális sebességgel pörögjön, és így a főprogram is.

Na most az lenne a kérdés, hogy van -e erre elvben lehetőség ?
Tehát feltételezve, hogy a csillagrajzolás kód szinte semilyen feltételes utasítást nem fog végrehajtani, tehát nagyjából konstans ideje lesz, mondjuk elvben mintha csak NOP -okat tartalmazna,
akkor lehet -e ezt olyan jól kiidőzíteni, hogy kihasználja a 4KHz megszak teljes idejét, majd visszamenjen a főprogramba, gyakorlatilag csak azért, hogy újra hívódhasson a megszakítás ?
Tehát a kérdés csak valami olyasmi, hogy van -e a "megszakítás ütemezőjének" az EP harverében valami olyan pontatlansága, ami miatt nem tudom teljesen kitölteni az 1/4KHz időt, és valami "nagyobb" idő ráhagyással kell majd dolgozzak, hogy véletlen ki ne csússzak a megszak időből (nem akarok kimaradt hangot), és az X darab megszakítás ezért egy komolyabb overhead -et tesz majd a csillagmozgatásom kódjára ahhoz képest, mintha a főprogramban futna ?
Z80 System

Offline ergoGnomik

  • EP addict
  • *
  • Posts: 1298
  • Country: hu
  • Stray cat from Commodore alley
Re: Assembly programozás
« Reply #685 on: 2013.November.13. 15:35:04 »
Quote from: Z80System
Tehát a kérdés csak valami olyasmi, hogy van -e a "megszakítás ütemezőjének" az EP harverében valami olyan pontatlansága, ami miatt nem tudom teljesen kitölteni az 1/4KHz időt, és valami "nagyobb" idő ráhagyással kell majd dolgozzak, hogy véletlen ki ne csússzak a megszak időből (nem akarok kimaradt hangot), és az X darab megszakítás ezért egy komolyabb overhead -et tesz majd a csillagmozgatásom kódjára ahhoz képest, mintha a főprogramban futna ?
Igazából nem pont a "megszakítás ütemezője" miatt, de természetesen bizonyos időzítési pontatlanságra számítanod kell mindenképp. Legalábbis szerintem. Nem tudod semmilyen módon garantálni, hogy a megszakításkezelő órajelre pontosan mikor induljon el, mivel nem fogod tudni, hogy éppen milyen utasítást hajt végre a Z80. Ezen felül mivel a videomemóriát írod, számolnod kell a Nick által lefoglalt buszciklusokkal is. Bár ez utóbbira IstvanV vagy Zozo lehet, hogy tudna rajzolni neked egy táblázatot az egyes rasztersorokban a processzor számára elérhető szabad ciklusokról. A legegyszerűbb valószínűleg az lenne, ha elméleti számítások helyett írnál egy tesztprogramot, és tesztelnéd mennyi idő áll rendelkezésre biztonságosan.

Offline Z80System

  • EP addict
  • *
  • Posts: 3848
  • Country: hu
Re: Assembly programozás
« Reply #686 on: 2013.November.13. 15:38:52 »
Quote
A legegyszerűbb valószínűleg az lenne, ha elméleti számítások helyett írnál egy tesztprogramot, és tesztelnéd mennyi idő áll rendelkezésre biztonságosan.


Hát pont ez az, amit meg akarnék úszni a kérdezgetéssel ... Nyilván ha ilyen megoldás mellett döntök, akkor annak kikísérletezésétől, hogy mekkora chunk -okban tudom a csillagaimat kirajzolni, nem ment meg senki.

De ha már most eltántorít valaki attól, hogy az 1/4KHz -es időintervallum méretéhez képest egy komoly méretű lehet az ilyen bizonytalanság miatti ráhagyás vesztesége, akkor megúszok egy csomó felesleges kísérletezést.
Z80 System

Offline lgb

  • EP addict
  • *
  • Posts: 3563
  • Country: hu
  • æðsta yfirmaður
    • http://lgb.hu/
Re: Assembly programozás
« Reply #687 on: 2013.November.13. 16:29:31 »
Quote from: Z80System
Tehát feltételezve, hogy a csillagrajzolás kód szinte semilyen feltételes utasítást nem fog végrehajtani, tehát nagyjából konstans ideje lesz, mondjuk elvben mintha csak NOP -okat tartalmazna,
akkor lehet -e ezt olyan jól kiidőzíteni, hogy kihasználja a 4KHz megszak teljes idejét, majd visszamenjen a főprogramba, gyakorlatilag csak azért, hogy újra hívódhasson a megszakítás ?
Tehát a kérdés csak valami olyasmi, hogy van -e a "megszakítás ütemezőjének" az EP harverében valami olyan pontatlansága, ami miatt nem tudom teljesen kitölteni az 1/4KHz időt, és valami "nagyobb" idő ráhagyással kell majd dolgozzak, hogy véletlen ki ne csússzak a megszak időből (nem akarok kimaradt hangot), és az X darab megszakítás ezért egy komolyabb overhead -et tesz majd a csillagmozgatásom kódjára ahhoz képest, mintha a főprogramban futna ?


Hat, nem biztos, hogy igazam van, de: ha Dave-ben nem torlod az adott interrupt-hoz tartozo latch-t, akkor a megszakitasbol valo visszateres utan azonnal ujra megszakitas lesz belole. Elvileg ez amugy tipikus programozasi hiba is, hogy elfelejti vki torolni, de jelen esetben lehet hasznos is. Persze, nem art, ha tenyleg konstans ideje van a megszakitasodnak, ha nem akarod, hogy szoras legyen a sebessegben. Speciel ez erdekes dolog, mert ha turbos gepen futtatod, akkor viszont annyival gyorsabb is lesz, mivel itt akkor a CPU sebessege fogja meghatarozni (mennyi ido alatt fut le az interrupt rutinod - hisz utana azonnal ujra interrupt lesz) a dolog sebesseget egyedul ...

Viszont nem teljesen ertem ez mire jo, ilyen elven ne is terj vissza az interrupt-bol amig a foprogramnak ugysem kell futnia, minek is akkor? Vagy lehet, valamit nem ertek, amugy csak ezt a hozzaszolast olvastam eppen az egesz temabol :)

Offline Z80System

  • EP addict
  • *
  • Posts: 3848
  • Country: hu
Re: Assembly programozás
« Reply #688 on: 2013.November.13. 16:33:11 »
Quote
Viszont nem teljesen ertem ez mire jo, ilyen elven ne is terj vissza az interrupt-bol amig a foprogramnak ugysem kell futnia, minek is akkor?


Hát pont azért amit írtál ... mert akkor turbós gépen is jó lesz.

Sima gépre kéne becipőkanalazni, ott érdekes hogy mennyit bukok a szórás miatt. Komoly méretű -e a szórás miatti ráhagyás az 1/KHz intervallumok esetén.

Ha a gép meg ennél gyorsabb, akkor lesznek lukak, de az már nem számít, nem kell, hogy turbó gépen gyorsabban menjen. Sőt, az viszont kell a hang miatt, hogy a megszak ne menjen gyorsabban ... :)
Z80 System

Offline ergoGnomik

  • EP addict
  • *
  • Posts: 1298
  • Country: hu
  • Stray cat from Commodore alley
Re: Assembly programozás
« Reply #689 on: 2013.November.13. 16:40:14 »
Quote from: Z80System
Hát pont ez az, amit meg akarnék úszni a kérdezgetéssel ... Nyilván ha ilyen megoldás mellett döntök, akkor annak kikísérletezésétől, hogy mekkora chunk -okban tudom a csillagaimat kirajzolni, nem ment meg senki.

De ha már most eltántorít valaki attól, hogy az 1/4KHz -es időintervallum méretéhez képest egy komoly méretű lehet az ilyen bizonytalanság miatti ráhagyás vesztesége, akkor megúszok egy csomó felesleges kísérletezést.
De most komolyan! Tényleg azt várod, hogy valami nem létező kódról itt bárki megmondja neked, hogy tudja teljesíteni a kritériumaidat vagy sem?!

Egyébként tegyük fel egy pillanatra a gondolkodó sapkát! 4kHz-es megszakításnál van 1000 órajelciklusod két megszakításkérés között. Ebből ha levonod a használni tervezett leghosszabb Z80 utasítás órajelciklusainak kétszeresét, akkor nagyjából meg van az az érték, ami garantáltan rendelkezésedre fog állni. 312 soros LPT esetén nagyjából 3,9 soronként fog bekövetkezni megszakítás. Ha lenne információ arról, hogy rasztersoronként mennyi órajel szabad a videomemória írására illetve tudnád, hogy hány ciklusonként akarod írni, akkor valszeg tudnál egy becslést adni arra, hogy átlagosan mennyi késleltetést fog összeszedni a kódod a Nick buszfoglalása miatt a megjelenített képernyő sorokban.

De gondolom te nem ezt szeretted volna itt olvasni, hanem valami "Igen, 332." szerű választ. Félek, ez nem fog menni. Senkinek.