Welcome, Guest. Please login or register.


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

Offline IstvanV

  • EP addict
  • *
  • Posts: 4822
Re: SID lejátszó
« Reply #720 on: 2017.April.06. 14:15:34 »
a 8x8-s táblázattal rontunk a felbontáson, ami a rendes osztással majdnem 15 bit, a táblázattal meg csak 8 lenne, nem?

Elvileg ugyanaz az eredmény ha nem hibás a kód, még a kerekítés is (itt a DE a bemenet és a HL a kimenet, talán jobban is lehetne optimalizálni):
Code: ZiLOG Z80 Assembler
  1.         ld      l, d
  2.         ld      h, high freqMultTable
  3.         ld      d, high (freqMultTable + 256)
  4.         ld      a, (de)
  5.         scf
  6.         adc     a, (hl)
  7.         ld      e, a
  8.         inc     h
  9.         ld      a, 0
  10.         adc     a, (hl)
  11.         ld      l, e
  12.         rra
  13.         ld      h, a
  14.         rr      l

Offline geco

  • EP addict
  • *
  • Posts: 7217
  • Country: hu
    • Támogató Támogató
Re: SID lejátszó
« Reply #721 on: 2017.April.06. 14:24:23 »
Elvileg ugyanaz az eredmény ha nem hibás a kód, még a kerekítés is (itt a DE a bemenet és a HL a kimenet, talán jobban is lehetne optimalizálni):
Viszont ha fel tudunk menni 12KHz-re, mi legyen a maximum sebesség turbós gépen? 48KHz ? (ha Zozón múlik lesz 16 MHz-es EP is ;) )

Offline IstvanV

  • EP addict
  • *
  • Posts: 4822
Re: SID lejátszó
« Reply #722 on: 2017.April.06. 15:13:28 »
Viszont ha fel tudunk menni 12KHz-re, mi legyen a maximum sebesség turbós gépen? 48KHz ? (ha Zozón múlik lesz 16 MHz-es EP is ;) )

Magasabb mintavételezési frekvenciánál rosszabb a frekvencia konverzió pontossága, de nem tudom, ez a gyakorlatban mennyire jelent problémát a 48 kHz egyébként jobb minőségéhez képest. Ilyenkor a zaj frekvenciája 8.36 bites lenne, a többi hullámformánál pedig 12.36 bites.

A hangerő byte konvertáló táblázata még hatékonyabb lehetne így:
- négyszögjelnél hangerő * 4 + 1
- egyéb hullámformáknál hangminta táblázat kezdőcíme / 128

Ezzel a megoldással ebből a rutinból:
Code: ZiLOG Z80 Assembler
  1. .   892C  E6 80        AND   80
  2. .   892E  5F           LD    E, A
  3. .   892F  79           LD    A, C
  4. .   8930  E6 60        AND   60
  5. .   8932  28 12        JR    Z, 8946
  6. .   8934  FE 20        CP    20
  7. .   8936  28 16        JR    Z, 894E
  8. .   8938  FE 40        CP    40
  9. .   893A  28 1A        JR    Z, 8956
  10. .   893C  79           LD    A, C
  11. .   893D  E6 1F        AND   1F
  12. .   893F  06 41        LD    B, 41
  13. .   8941  B7           OR    A
  14. .   8942  28 12        JR    Z, 8956
  15. .   8944  80           ADD   A, B
  16. .   8945  C9           RET
  17. .   8946  79           LD    A, C
  18. .   8947  E6 1F        AND   1F
  19. .   8949  06 03        LD    B, 03
  20. .   894B  C3 41 89     JP    8941
  21. .   894E  79           LD    A, C
  22. .   894F  E6 1F        AND   1F
  23. .   8951  06 22        LD    B, 22
  24. .   8953  C3 41 89     JP    8941
  25. .   8956  79           LD    A, C
  26. .   8957  E6 1F        AND   1F
  27. .   8959  87           ADD   A, A
  28. .   895A  00           NOP
  29. .   895B  00           NOP
  30. .   895C  37           SCF
  31. .   895D  C9           RET

ez maradna (tulajdonképpen lehetne inline is, mert csak néhány utasítás):
Code: ZiLOG Z80 Assembler
  1.         ld    d, b
  2.         and   80h
  3.         ld    e, a
  4.         ld    b, high volumeConvTable
  5.         ld    a, (bc)
  6.         rra
  7.         ret

Szerk.: ez azonban nem működik a 8 bites DAC használatakor. Ilyenkor lehetne a táblázatban 8-szoros hangerő + 1, és utána még egy ADD A,A csak négszögjelnél, aminek a helyére 6 bites D/A esetén NOP kerül.

Szerk. 2: a PWM (B regiszter) elvesztése javítva.

Szerk. 3: egy csatorna vezérlése módosítva:
Code: ZiLOG Z80 Assembler
  1.         LD    E, (HL)
  2.         LD    D, A
  3.         ld    l, d
  4.         ld    h, high freqMultTable
  5.         ld    d, high (freqMultTable + 256)
  6.         ld    a, (de)
  7.         scf
  8.         adc   a, (hl)
  9.         ld    e, a
  10.         inc   h
  11.         ld    a, 0
  12.         adc   a, (hl)
  13.         ld    l, e
  14.         rra
  15.         ld    h, a
  16.         rr    l
  17.         POP   BC
  18.         LD    A, C
  19.         LD    (8897h), A
  20.         ld    d, b
  21.         and   80h
  22.         ld    e, a
  23.         ld    b, high volumeConvTable
  24.         ld    a, (bc)
  25.         rra
  26.         jr    c, l1
  27.         LD    (8929h), A
  28.         DI  
  29.         LD    (0045h), HL
  30.         LD    HL, 8927h
  31.         jr    l2
  32. l1:     rrca                            ; * 8-bit D/A: ADD A, A (87h)
  33.         LD    (8926h), A
  34.         ld    a, d
  35.         LD    (8923h), A
  36.         DI  
  37.         LD    (0045h), HL
  38.         LD    HL, 8922h
  39. l2:     LD    A, E
  40.         LD    (004Ch), A
  41.         LD    DE, 004Eh
  42.         LDI
  43.         LDI
  44.         LDI
  45.         LDI
  46.         EI  
  47.         LDI

az eredeti kód:
Code: ZiLOG Z80 Assembler
  1. .   87DB  5E           LD    E, (HL)
  2. .   87DC  57           LD    D, A
  3. .   87DD  C7           RST   00
  4. .   87DE  C1           POP   BC
  5. .   87DF  79           LD    A, C
  6. .   87E0  32 97 88     LD    (8897), A
  7. .   87E3  CD 2C 89     CALL  892C
  8. .   87E6  F3           DI  
  9. .   87E7  22 45 00     LD    (0045), HL
  10. .   87EA  38 0C        JR    C, 87F8
  11. .   87EC  32 29 89     LD    (8929), A
  12. .   87EF  7B           LD    A, E
  13. .   87F0  32 4C 00     LD    (004C), A
  14. .   87F3  21 27 89     LD    HL, 8927
  15. .   87F6  18 0E        JR    8806
  16. .   87F8  32 26 89     LD    (8926), A
  17. .   87FB  7B           LD    A, E
  18. .   87FC  32 4C 00     LD    (004C), A
  19. .   87FF  78           LD    A, B
  20. .   8800  32 23 89     LD    (8923), A
  21. .   8803  21 22 89     LD    HL, 8922
  22. .   8806  11 4E 00     LD    DE, 004E
  23. .   8809  ED A0        LDI
  24. .   880B  ED A0        LDI
  25. .   880D  ED A0        LDI
  26. .   880F  ED A0        LDI
  27. .   8811  FB           EI  
  28. .   8812  ED A0        LDI

Itt a négyszögjel hangereje mindig nyolcszoros (+1), csak a léptetés iránya változik a DAC felbontásától függően. Kis mértékben rövidült a letiltott megszakítás időtartama is.
« Last Edit: 2017.April.06. 18:53:14 by IstvanV »

Offline geco

  • EP addict
  • *
  • Posts: 7217
  • Country: hu
    • Támogató Támogató
Re: SID lejátszó
« Reply #723 on: 2017.April.07. 08:42:34 »
Elméletileg a leírt módosítások készen bekerültek még csak 10KHz-es lejátszással, valami nem stimmel, nem szól olyan jól, mint a régi, lehet elszúrtam valamit a táblakreálásnál, ma megnézem, és ha pont úgy szól, mint a régi, akkor emelek a digi lejátszás sebességén.
Valamit említettél a PWM-re is, hogy invertálva lenne az igazi?

Offline IstvanV

  • EP addict
  • *
  • Posts: 4822
Re: SID lejátszó
« Reply #724 on: 2017.April.07. 10:46:05 »
Valamit említettél a PWM-re is, hogy invertálva lenne az igazi?

Igen, valójában ez lenne pontos:
Code: ZiLOG Z80 Assembler
  1.         cp    PW
  2.         ccf
  3.         sbc   a, a
  4.         and   VOLUME
de nem tudom, hogyan lehetne ezt helyesen megoldani lassulás nélkül, ezért talán nem érné meg, mivel az invertált PWM egyébként nem sokat változtat a hangon.

Elméletileg a leírt módosítások készen bekerültek még csak 10KHz-es lejátszással, valami nem stimmel, nem szól olyan jól, mint a régi, lehet elszúrtam valamit a táblakreálásnál, ma megnézem, és ha pont úgy szól, mint a régi, akkor emelek a digi lejátszás sebességén.

A táblázatok tartalma 10 kHz-es mintavételezési frekvenciánál:

freqMultTable[n] = (n * 197) & 255
freqMultTable[n + 256] = (n * 197) / 256
volumeConvTable[n] = (n & 31) * 8 + 1    - ha négyszögjel vagy 0 hangerő
volumeConvTable[n] = ((triangleTables / 256) + (n & 31) - 1) * 2    - háromszögjel
volumeConvTable[n] = ((sawtoothTables / 256) + (n & 31) - 1) * 2    - fűrészjel
volumeConvTable[n] = ((noiseTables / 256) + (n & 31) - 1) * 2    - zaj
« Last Edit: 2017.April.07. 11:38:27 by IstvanV »

Offline IstvanV

  • EP addict
  • *
  • Posts: 4822
Re: SID lejátszó
« Reply #725 on: 2017.April.07. 15:45:18 »
Módosított snapshot (nem optimális megoldás, mert csak a memóriában szerkesztettem a kódot, így nem volt elkerülhető például a CALL használata):
[ Guests cannot view attachments ]

Szerk.: a gyorsulás nem túl jelentős, de 10870 Hz-en valószínűleg stabil lehetne. Elsősorban a nem 50 Hz-es file-ok jelentenek problémát.
« Last Edit: 2017.April.07. 16:01:33 by IstvanV »

Offline geco

  • EP addict
  • *
  • Posts: 7217
  • Country: hu
    • Támogató Támogató
Re: SID lejátszó
« Reply #726 on: 2017.April.07. 19:34:24 »
Eljutottam én is a sebességállításhoz, a hangzásbeli különbséget az okozta, hogy a négyszögjel hangerőtábláját csak 4x+1-gyel generáltam, nem 8x+1-gyel.
11904 Hz-en az 50Hz-es SID-ek stabilan működnek, a 150Hz-es Paperboy is jó, a 200Hz-es HVSC fagyizik
11363 Hz-en minden működik, a HVSC-nél előfordul, hogy a kicsomagolás után kevesebb, mint egy másodperc a várakozási rész.
Melyik legyen a végső beállítás 11363, vagy 10870 Hz?

Offline IstvanV

  • EP addict
  • *
  • Posts: 4822
Re: SID lejátszó
« Reply #727 on: 2017.April.08. 09:46:04 »
Melyik legyen a végső beállítás 11363, vagy 10870 Hz?

A 10870 megbízhatóbbnak tűnik, és az is jobb az eddigi 10000-nél. Esetleg 11364 csak 50 Hz-es file esetén, de az tovább bonyolítaná a sebesség beállítását. :) Vagy ha lehetne még gyorsítani a megszakítás kezelésen. Ha a kicsomagoló rutin nem használná az IX regisztert sem, akkor azzal 10 ciklus/hangminta lenne megtakarítható video megszakítás nélkül az IX-et számlálónak használva. De így a kivezérlésjelző és a raszter megjelenítésével probléma lehetne (villogás), mert a frissítésük "véletlenszerű" LPB-nél történne fix pozíció helyett.

Offline geco

  • EP addict
  • *
  • Posts: 7217
  • Country: hu
    • Támogató Támogató
Re: SID lejátszó
« Reply #728 on: 2017.April.08. 11:31:43 »
A 10870 megbízhatóbbnak tűnik, és az is jobb az eddigi 10000-nél. Esetleg 11364 csak 50 Hz-es file esetén, de az tovább bonyolítaná a sebesség beállítását. :) Vagy ha lehetne még gyorsítani a megszakítás kezelésen. Ha a kicsomagoló rutin nem használná az IX regisztert sem, akkor azzal 10 ciklus/hangminta lenne megtakarítható video megszakítás nélkül az IX-et számlálónak használva. De így a kivezérlésjelző és a raszter megjelenítésével probléma lehetne (villogás), mert a frissítésük "véletlenszerű" LPB-nél történne fix pozíció helyett.
Igen, pláne gyorsabb vezérlésű SID esetén, mint a HVSC, én az eslő megoldásra szavaznék, a másodiknál tényleg jelentős gyorsulást okozna hangmintánként 10 ciklus, a kijelző zavar egyelőre.

Offline geco

  • EP addict
  • *
  • Posts: 7217
  • Country: hu
    • Támogató Támogató
Re: SID lejátszó
« Reply #729 on: 2017.April.08. 12:56:13 »
Itt a teszt verzió, ami különböző lejátszási frekvenciát állít be az 50Hz-es vezérlésű, és 50Hz-nél gyorsabb vezérlésű zenékre, a kijelzőn nem látszik 4MHz-en, mert kerekített érték jelenik meg, 8MHz-en már van eltérés, leteszteltem magnós konfigon 4MHz-es gépen, turbós gépen (Dave is gyorsítva), és emu turbón (Dave nem gyorsul), és EXDOS alatt normál beállításokkal, én nem találtam hibát, de az nem jelent semmit, csekkoljátok ti is:)
Ha nincs hiba, akkor csomagolom, és megcsinálom a ROM verziót is.

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

Offline IstvanV

  • EP addict
  • *
  • Posts: 4822
Re: SID lejátszó
« Reply #730 on: 2017.April.09. 13:53:09 »
a másodiknál tényleg jelentős gyorsulást okozna hangmintánként 10 ciklus, a kijelző zavar egyelőre.

Egyéb lehetőségek gyorsításra:
- video megszakítás figyelése a főprogramban, -25 ciklus, de nem egyszerű megoldani, különösen mivel a DAVE megszakítás tárolói nem használhatók az adott megszakítás tiltásakor (Plus/4-en ilyenkor is olvashatók)
- a már említett IX regiszter nélküli (valamivel lassabb) kicsomagoló rutin, a hangminta lejátszásnál a DE' cseréje IX-re (+4 ciklus), viszont a DE'-t fix 8013h értékre állítva gyorsabb gyűrűmoduláció (-9 ciklus) és megszakítás törlés (-3 ciklus). Így a video megszakítás kezelése nem változik, de csak 8 ciklus a gyorsulás és bonyolultabb a gyűrűmoduláció vezérlése

Offline geco

  • EP addict
  • *
  • Posts: 7217
  • Country: hu
    • Támogató Támogató
Re: SID lejátszó
« Reply #731 on: 2017.April.09. 15:22:36 »
Egyéb lehetőségek gyorsításra:
- video megszakítás figyelése a főprogramban, -25 ciklus, de nem egyszerű megoldani, különösen mivel a DAVE megszakítás tárolói nem használhatók az adott megszakítás tiltásakor (Plus/4-en ilyenkor is olvashatók)
- a már említett IX regiszter nélküli (valamivel lassabb) kicsomagoló rutin, a hangminta lejátszásnál a DE' cseréje IX-re (+4 ciklus), viszont a DE'-t fix 8013h értékre állítva gyorsabb gyűrűmoduláció (-9 ciklus) és megszakítás törlés (-3 ciklus). Így a video megszakítás kezelése nem változik, de csak 8 ciklus a gyorsulás és bonyolultabb a gyűrűmoduláció vezérlése
Az elsőt hogyan lehetne megoldani? a kicsomagoló rutinba is beágyazni egy videómegszakítás figyelést?
Ha jól emlékszem Dave-en keresztül nem tiltunk megszakítást, csak DI-vel, vagy az új megoldáshoz kéne valamelyiket tiltani?
Ahogy én gondolom, nem kéne, be kéne ágyazni a video megszakítás figyelést a kicsomagoló rutinba, meg a kicsomagolás utáni várakozásba (ez a része egyszerű)

Offline geco

  • EP addict
  • *
  • Posts: 7217
  • Country: hu
    • Támogató Támogató
Re: SID lejátszó
« Reply #732 on: 2017.April.09. 20:08:41 »
Már értem a problémát, ha nem tiltjuk a videó megszakítást, akkor a videó megszakítás törlésével lesznek gondjaink, ha töröljük minden Dave megszakításban, akkor nem jut a program az 50Hz-es vezérléshez, ha nem töröljük ,akkor végtelen ciklusba kerül a Dave megszakítás ha videó megszakítás alatt kerültünk oda :D , és a másik probléma, hogy minden di-vel , és ei-vel az 50Hz-es csekkolást is ki/be kell kapcsolni (ez a kisebbik probléma, szinte nem is az :) )
Én azt hittem, hogy kikapcsolt videó megszakítás mellett legalább az interrupt byte elérését az LPT-ben jelzi a 0b4h port.

Offline IstvanV

  • EP addict
  • *
  • Posts: 4822
Re: SID lejátszó
« Reply #733 on: 2017.April.09. 22:12:10 »
Én azt hittem, hogy kikapcsolt videó megszakítás mellett legalább az interrupt byte elérését az LPT-ben jelzi a 0b4h port.

Jelzi, de csak a 4. bit. Így nehezebb megoldani, mert a bit változását kell figyelni, és az LPT-nél is fontos hogy a VINT bit elég hosszú ideig legyen 0 és 1 is ahhoz, hogy ne vesszen el megszakítás.

Offline geco

  • EP addict
  • *
  • Posts: 7217
  • Country: hu
    • Támogató Támogató
Re: SID lejátszó
« Reply #734 on: 2017.April.09. 23:11:23 »
Jelzi, de csak a 4. bit. Így nehezebb megoldani, mert a bit változását kell figyelni, és az LPT-nél is fontos hogy a VINT bit elég hosszú ideig legyen 0 és 1 is ahhoz, hogy ne vesszen el megszakítás.
Na erre emlékeztem én is, de most a teszt alatt valahogy sose volt a 4. bit beállított. Betettem a figyelést a kicsomagoló rutinba két helyre: a Read8bit.L1-re, és a readencodedvalue-ba, és a várakozásba a halt után. Azt nem néztem, milyen hosszú a VINT-es LPB.