Én meg továbbgondoltam, a tömöríthetőség miatt, hogy mindezt lehetne 2 16K-s szegmenssel, ami a lejátszást bonyolítaná, egyik az aktív adat, a másik meg az épp kicsomagolásra kerülő adat, de még a holdban se járok, ezért az egész csak puszta elmélkedés.
Az
itt található egyszerű SID kártyás lejátszó valójában így működik (egy 16K-s blokk = 655 * 25 regiszter), a 8K-s változatot - ami bonyolítja a kicsomagoló rutint és a lejátszás 50 Hz-es részét - azért ajánlottam hogy a hangminta lejátszás közben ne kelljen sokat lapozni, és így még nem kerül gyakran használt szegmens video RAM-ba 128K-s gépen:
- 2 szegmens hangminta (1-2. lap)
- 1 szegmens (2*8K) puffer a tömörítetlen regiszter adat számára (3. lap)
- 1 szegmens bemeneti file puffer (1. lap), ez már lehet video RAM is a kevésbé intenzív hozzáférés miatt
Az is egy lehetőség hogy a hangminta memória csak egy szegmens méretű legyen, de akkor 32 helyett csak 16 táblázat lehet az egyes hullámformákhoz.
Igen, ezen is gondolkoztam, hogyha marad elég idő, akkor esetleg érdemes-e az adatot szétszórni regiszter sorrendbe, és a mostani gyors ( veremkezelős kiolvasással olvasni ), vagy érdemes-e az általad elsőre használt regisztersorrendes tömörítésre áttérni, akkor a fájl nagyobb, de gyorsabb az olvasás.
Az előbb említett lejátszónál legalábbis sokkal hatékonyabb ha mind a 25 regiszter külön 655 byte-os blokkba kerül, amit így tud lejátszani:
.l1: ld hl, 8000h ; * sidDataReadPos
ld de, 10000h - (655 + 1)
... ; puffer pozíció ellenőrzése, hogy elérte-e a blokk végét
.l4: ld bc, 655 * 25 + 1
add hl, bc
ld bc, 190fh
.l5: ld a, b
dec a
out (0eh), a
add hl, de
outi
jr nz, .l5
ld (sidDataReadPos), hl
Tehát a ciklusban ADD HL, DE utasítás kell a következő regiszterhez. De ez 50 Hz-es frekvencián nem nagy probléma, ha 20-25% CPU idő marad erre akkor az még mindig kb. 16000-20000 Z80 ciklus. Az így rendezett 4 és fél perces Cybernoid II példa file tömörítve 11238 byte, ha viszont az egyszerűbben lejátszható R0,R1,...R24,R0,R1,... sorrendre konvertálom, akkor már 50918 byte a méret, ami lapozás nélkül nem fér el a memóriában.
A legjobb lenne tesztelni a tömörítést már konvertált 12 regiszteres SID adaton is.
Szerk.: blokk méretek összehasonlítása, ez nem egészen pontos, de nagyjából látható a hatása a tömörítésre. 12 regiszternél valószínűleg kisebb blokk is elég hasonló hatékonysághoz, bár ezt még nem teszteltem.
1024: 55684 byte
2048: 34422 byte
4096: 23209 byte
8192: 16202 byte
16384: 11239 byte
32768: 8700 byte
65536: 7353 byte