Welcome, Guest. Please login or register.


Author Topic: SID lejátszó (Read 248350 times)

Offline geco

  • EP addict
  • *
  • Posts: 7069
  • Country: hu
    • Támogató Támogató
Re: SID lejátszó
« Reply #735 on: 2017.April.10. 08:49:05 »
Ébredés után jutott eszembe, hogy ez nem fog menni, mert a gyorsabb vezérlésű SID-eknél az LPB biztos 1 hosszú.

Offline geco

  • EP addict
  • *
  • Posts: 7069
  • Country: hu
    • Támogató Támogató
Re: SID lejátszó
« Reply #736 on: 2017.April.10. 20:36:35 »
Betettem az IX nélküli kicsomagoló rutint, és eszközöltem a javallott módosításokat. A módosított kicsomagoló tökéletesen működik, gondolom most optimalizálsz, a hozzászólás eltűnéséből gondolom :) Természetesen ahogy szoktam, hibát vétettem, vagyis annyi, hogy a vezérlés nem lassult, hanem gyorsítani is sikerült rajta, jelentős 6, azaz jól látja mindenki 6 ciklust :ds_icon_cheesygrin: (igaz a DI-s rész 3 ciklussal hosszabb lett) ,ez eredetileg 12 lett volna ezzel a kóddal:
Code: [Select]
       ld      a,c
        ld      (v1vol+1),a
        ld      d,b
;        and     80h
;        ld      e,a
        ld      b,high volumeConvTable
        ld      a,(bc)
        inc     b
        rra
        jr      c,pulse1
        ld      (otherw+2),a    ;triangle sawtooth noise
        di  
        ld      (sidSynth.l1+1),hl
        ld      hl,otherw
        jr      wavtab1
pulse1  rrca                            ; * 8-bit d/a: add a, a (87h)
        ld      (pulsevl+1),a   ;volume value
        ld      a,d
        ld      (pulsew+1),a    ;pwm
        di  
        ld      (sidSynth.l1+1),hl
        ld      hl,pulsew
wavtab1 ;ld      a,e             ;ring mod
        ld      a,(bc)          ;xor a/and d
        ld      (sidSynth.l2),a
de, így a volumeConvTable-ből való adat kinyeréskor előfordult, hogy a C bit be volt lőve, eredetileg egy xor a-t akartam tenni a volumeConvTable elé,de akkor eszembe jutott, hogy a hangerő kijelzőnél AND D-el vágom le a hangerő értéket, ha azt kiszedem, és az LD DE,0e01fh helyett csak LD D,0e0h-t használok, akkor még gyorsítani is lehet 3x1 + 3 ciklust a következő módosítással :)
Code: [Select]
       ld      a,c
        and     1fh
        ld      (v1vol+1),a
        ld      d,b
;        and     80h
;        ld      e,a
        ld      b,high volumeConvTable
        ld      a,(bc)
        inc     b
        rra
        jr      c,pulse1
        ld      (otherw+2),a    ;triangle sawtooth noise
        di  
        ld      (sidSynth.l1+1),hl
        ld      hl,otherw
        jr      wavtab1
pulse1  rrca                            ; * 8-bit d/a: add a, a (87h)
        ld      (pulsevl+1),a   ;volume value
        ld      a,d
        ld      (pulsew+1),a    ;pwm
        di  
        ld      (sidSynth.l1+1),hl
        ld      hl,pulsew
wavtab1 ;ld      a,e             ;ring mod
        ld      a,(bc)          ;xor a/and d
        ld      (sidSynth.l2),a
természetesen ez is fagyival kezdett, mert az LD DE,0e01fh-ról LD D,0e0h-ra való átállásnál nem vettem figyelembe, hogy az 0e0h-t a program írja, ezt két helyen kellett még módosítani.

Csatolmány törölve
« Last Edit: 2017.April.18. 20:15:02 by geco »

Offline IstvanV

  • EP addict
  • *
  • Posts: 4822
Re: SID lejátszó
« Reply #737 on: 2017.April.10. 22:48:30 »
Quote
gondolom most optimalizálsz, a hozzászólás eltűnéséből gondolom :)

Valójában azért tűnt el, mert jobban meggondolva talán mégsem igazán jó ötlet. :oops: Csak akkor gyorsul a számított mértékben, ha 100% a CPU használat, bár a kicsomagolási idők így is valamivel jobbak lettek a korábbi verziónál.

Quote
(igaz a DI-s rész 3 ciklussal hosszabb lett)

Az LD A, (BC) lehetne a DI előtt is, ez ugyan 3 byte méretnövekedést eredményez, de a FILE-os szegmensen talán nincs nagy jelentősége.

Offline geco

  • EP addict
  • *
  • Posts: 7069
  • Country: hu
    • Támogató Támogató
Re: SID lejátszó
« Reply #738 on: 2017.April.10. 22:52:03 »
Az LD A, (BC) lehetne a DI előtt is, ez ugyan 3 byte méretnövekedést eredményez, de a FILE-os szegmensen talán nincs nagy jelentősége.
Egyelőre nincsen :D , meg is csinálom, így a DI-s rész 4 ciklussal rövidebb is, mint az eredetiben.

Offline IstvanV

  • EP addict
  • *
  • Posts: 4822
Re: SID lejátszó
« Reply #739 on: 2017.April.11. 12:05:05 »
Ez ugyanaz a verzió, ha már be van építve, akkor legyen hozzá forráskód is: :)
[ Guests cannot view attachments ]
[ Guests cannot view attachments ]    (IX-es változat)

Sebesség teszt (nem a lejátszóban, hanem csak a kicsomagoló rutinok egy egyszerű programba építve):

INTERNA.M64 (24124 byte, 396 másodperc):

decompress_m2_new.s: 4.434 másodperc
decompress_m2_8K.s: 4.438 másodperc
decompress_m2_8K_noIX.s: 4.668 másodperc

AUFWIED.M64 (15444 byte, 369 másodperc):

decompress_m2_new.s: 3.019 másodperc
decompress_m2_8K.s: 3.027 másodperc
decompress_m2_8K_noIX.s: 3.157 másodperc

ACEII.M64 (14237 byte, 315 másodperc):

decompress_m2_new.s: 2.729 másodperc
decompress_m2_8K.s: 2.725 másodperc
decompress_m2_8K_noIX.s: 2.850 másodperc

Az IRQ kezelés optimalizálása ~17-20% gyorsulást eredményez 4 MHz-es gépen 11364 Hz-es lejátszásnál és 50 Hz-es vezérlésnél.

Offline geco

  • EP addict
  • *
  • Posts: 7069
  • Country: hu
    • Támogató Támogató
Re: SID lejátszó
« Reply #740 on: 2017.April.11. 13:11:23 »
Ahogy nézem, jelentéktelen a lassulás, pláne, ha levetítjük ezt egy 50Hz-es megszakításra, igaz, ott a 1x KHz-es megszakítás befolyásoló tényezőnek, de mivel gyorsult az is 2%-ot szerintem jók vagyunk, én már azon gondolkoztam, hogy
50Hz-es vezérlést 11904 Hz-re
100Hz-es vezérlést 11363 Hz-re és a
100Hz fölötti vezérlést 10869 Hz-re állítom, ezeknek elméletileg stabilan kéne működnie.

Offline IstvanV

  • EP addict
  • *
  • Posts: 4822
Re: SID lejátszó
« Reply #741 on: 2017.April.11. 16:11:47 »
én már azon gondolkoztam, hogy
50Hz-es vezérlést 11904 Hz-re

Próbáltam 12500-at is, az még működik, de villog a raszter és 5 másodperc körüli kicsomagolási idő fordulhat elő. Ez akkor lehet probléma, ha az utolsó blokk nagyon rövid, bár ha jól látom, ilyenkor a vezérlés elvileg várna a következő blokkra (ha (015Bh) = 0):
Code: ZiLOG Z80 Assembler
  1. .   89A0  21 6A DE     LD    HL, DE6A
  2. .   89A3  23           INC   HL
  3. .   89A4  22 A1 89     LD    (89A1), HL
  4. .   89A7  7D           LD    A, L
  5. .   89A8  FE F8        CP    F8
  6. .   89AA  20 2B        JR    NZ, 89D7
  7. .   89AC  7C           LD    A, H
  8. .   89AD  E6 1F        AND   1F
  9. .   89AF  FE 1F        CP    1F
  10. .   89B1  20 24        JR    NZ, 89D7
  11. .   89B3  3A 5B 01     LD    A, (015B)
  12. .   89B6  B7           OR    A
  13. .   89B7  CA 2A 8B     JP    Z, 8B2A
itt azonban hiba lehet, hogy a pozíció növelése után a következő megszakítás már átugraná ezt a részt és szemetet játszana le. Az LD (89A1), HL-t esetleg célszerűbb lenne az LD DE, FD56 elé helyezni, így egy másik hasonló utasítás törölhető is.

A 11905 Hz még nem villog, tehát az valóban stabil lenne.
« Last Edit: 2017.April.11. 16:15:30 by IstvanV »

Offline geco

  • EP addict
  • *
  • Posts: 7069
  • Country: hu
    • Támogató Támogató
Re: SID lejátszó
« Reply #742 on: 2017.April.11. 21:11:00 »
Módosítások eszközölve :) Legújabb teszt verzió, már ROM verzió is van a csomagban.

Csatolmány törölve.
« Last Edit: 2017.April.18. 20:14:33 by geco »

Offline IstvanV

  • EP addict
  • *
  • Posts: 4822
Re: SID lejátszó
« Reply #743 on: 2017.April.12. 09:41:58 »
Módosítások eszközölve :) Legújabb teszt verzió, már ROM verzió is van a csomagban.

Egy lehetséges hiba: 4 MHz-es CPU-n 12 kHz-et ír ki, de továbbra is 11364 Hz frekvenciát állít be.

Offline geco

  • EP addict
  • *
  • Posts: 7069
  • Country: hu
    • Támogató Támogató
Re: SID lejátszó
« Reply #744 on: 2017.April.12. 11:16:29 »
Egy lehetséges hiba: 4 MHz-es CPU-n 12 kHz-et ír ki, de továbbra is 11364 Hz frekvenciát állít be.
Elszúrtam, mindenhol eggyel magasabb értéket állítok be, mint kéne, elszámoltam :lol:

Offline IstvanV

  • EP addict
  • *
  • Posts: 4822
Re: SID lejátszó
« Reply #745 on: 2017.April.12. 11:59:22 »
Újabb ötlet gyorsításra: video megszakítás helyett a hangminta frekvenciát osztani két lépésben, először kb. 500 Hz-re (12500 / 25), aztán tovább a vezérlés frekvenciájára (50 Hz = 500 / 10). Ha a kivezérlésjelző alatt van egy elég hosszú VINT-es LPB (a video megszakítás jelenlegi pozíciója alapján legfeljebb 48 sor azaz 3 ms idő lehetséges), akkor az 500 Hz-en még megbízhatóan figyelhető a B4h port 4. bitjén. A második számláló lefutására történik a vezérlés, a VINT bit felfutó élére pedig a kijelzés frissítése.

Ez ugyan nem egyszerű módosítás, különösen az optimális frekvencia osztók beállítása a hangminta és a vezérlés frekvencia alapján, tehát nem biztos, hogy megéri.

Amit nyerni lehet vele az IRQ rutinban:
- 25 ciklus gyorsulás a video megszakítás tárolójának a figyelése nélkül
- 3 ciklus lassulás a megszakítás törlésekor (E regiszter helyett konstans)
- 11 ciklus lassulás az első számláló (DEC E és JR Z)
- ~113 ciklus lassulás csak a lefutásakor (nem feltétlenül jól optimalizálva), átlagosan 113 / 25 = 4.52 ciklus
Azaz ~6.5 ciklus / hangminta nyerhető. Ezen kívül lehetségessé válik nem csak 50 Hz többszöröseinek a támogatása, és fix VINT pozíció használata.

Offline geco

  • EP addict
  • *
  • Posts: 7069
  • Country: hu
    • Támogató Támogató
Re: SID lejátszó
« Reply #746 on: 2017.April.12. 13:24:42 »
Tehát úgy, hogy az 500 Hz legyen fix, tehát azt kell a tényleges lejátszási frekvenciából számolni, és a vezérlési sebességet meg az 500 Hz tovább osztásából?
Első körben a digi lejátszó futna addig ciklusban, amíg eléri az 500 Hz-et, ilyenkor mindig csekkolunk 4. bitet a 0b4h porton, ha aktív, akkor ugrás a display vezérlésre, majd csekkolni hogy a zenevezérlő ciklus elérte-e a 0-t, ha igen, vezérlés, egyébként visszatérés a megszakításból?

A Dave osztó hibát javítottam a lenti csomagban

Offline IstvanV

  • EP addict
  • *
  • Posts: 4822
Re: SID lejátszó
« Reply #747 on: 2017.April.12. 13:52:16 »
Tehát úgy, hogy az 500 Hz legyen fix, tehát azt kell a tényleges lejátszási frekvenciából számolni, és a vezérlési sebességet meg az 500 Hz tovább osztásából?

Az 500 Hz változhat kis mértékben, így pontosabb lehet a frekvencia. Például 200 Hz-es bemeneti file esetén 500-ból csak 250 vagy 167 Hz lehetne, viszont a 400 vagy 600 már jól osztható. A használható tartományt korlátozza a VINT hosszúsága (nem veszhet el video megszakítás), nagyobb frekvencia pedig több CPU időt használ.

Quote
Első körben a digi lejátszó futna addig ciklusban, amíg eléri az 500 Hz-et, ilyenkor mindig csekkolunk 4. bitet a 0b4h porton, ha aktív, akkor ugrás a display vezérlésre, majd csekkolni hogy a zenevezérlő ciklus elérte-e a 0-t, ha igen, vezérlés, egyébként visszatérés a megszakításból?

Valami ilyesmivel próbálkoztam, ez nem biztos hogy optimális (vagy működő) megoldás:
Code: ZiLOG Z80 Assembler
  1.         dec     e
  2.         jr      z, l1
  3.         exx
  4.         ex      af, af'
  5.         ei
  6.         ret
  7.  
  8. l1:     ld      e, 25                   ; *    12
  9.         exx
  10.         ei
  11.         ex      af, af'
  12.         push    af                      ;      23
  13.         in      a, (0b4h)               ;      34
  14.         cpl                             ;      38
  15.         and     10h                     ;      45
  16. l2:     cp      00h                     ; *    52
  17.         ld      (l2 + 1), a             ;      65
  18. l3:     ld      a, 10                   ; *    72
  19.         dec     a                       ;      76
  20.         ld      (l3 + 1), a             ;      89
  21.         jr      z, l4                   ;      96
  22.         jr      c, l4                   ;     103
  23.         pop     af                      ;     113
  24.         ret
  25. l4:
Itt az l1-nél kezdődő rész lehet 30h alatt is, ha nincs elég hely. Az l4-nél Z=1 esetén a vezérlésnek kell futni, C=1-nél pedig a kijelzésnek, ezek egyszerre is történhetnek.

Szerk.: 12500 Hz-en 6 ciklussal gyorsabb megszakítás kezelés még nem elég ahhoz, hogy ne villogjon a raszter.

Szerk. 2: a CPL megtakarítható a VINT áthelyezésével a kivezérlésjelzőre és/vagy elé. Esetleg a kivezérlésjelző megoldható úgy, hogy ne legyen minden sor külön LPB, így egyszerűbb a frissítése.
« Last Edit: 2017.April.13. 08:38:53 by IstvanV »

Offline geco

  • EP addict
  • *
  • Posts: 7069
  • Country: hu
    • Támogató Támogató
Re: SID lejátszó
« Reply #748 on: 2017.April.12. 14:21:32 »
Tetszik a külön Z bit és külön carry állító rész, szerintem működik :)

Offline geco

  • EP addict
  • *
  • Posts: 7069
  • Country: hu
    • Támogató Támogató
Re: SID lejátszó
« Reply #749 on: 2017.April.13. 16:22:57 »
Most néztem az LPT-t, elméletileg 100 raszter sorra mehet a VINT bit, 48 a volume kijelző alatt az Enterprise feliratig, és 52 a reload bitig, mivel nem akarunk interruptot, csak a figyelni a VINT beállítást, így pakolhatunk egymás utáni LPB-kbe VINT bitet, működnie kell, nem? Ezzel a második ciklusszámlálót akár csökkenthetnénk 4-re is, amivel megspórolnánk 678 ciklust. A képernyő tetején 27 raszter sor úgyszintén nem használt, előre tettem a kijelzős dolgokat, és csak utána lesz a zene vezérlés, ha esetleg a 27 képsor sor nem elég a képernyőn való piszmogásra, a VINT-es képsorokból még elvehetünk, max a ciklusszámláló 5 lesz.
Mit szólsz?