Welcome, Guest. Please login or register.


Author Topic: Cybernoid (Read 13839 times)

Offline IstvanV

  • EP addict
  • *
  • Posts: 4822
Re: Cybernoid
« Reply #45 on: 2010.May.11. 11:02:59 »
Ez volt a cyber220.com?
 :oops:

Nem, ez az a mód, amit az első átiratokban használtam mindkét játéknál. A cyber220.com TONE_AND_NOISE_MODE=20h-val készült, amint azt a file név is jelzi.

Offline Lacika

  • EP addict
  • *
  • Posts: 3198
  • Country: hu
    • http://www.ep128.hu
Re: Cybernoid
« Reply #46 on: 2010.May.11. 11:36:17 »
Nem, ez az a mód, amit az első átiratokban használtam mindkét játéknál. A cyber220.com TONE_AND_NOISE_MODE=20h-val készült, amint azt a file név is jelzi.

Felraknál egy olyan változatot a második részből? :oops:
Úgy sokkal jobbak a robbanás / lövés hangjai.

Offline Zozosoft

  • Global Moderator
  • EP addict
  • *
  • Posts: 14733
  • Country: hu
    • http://enterprise.iko.hu/
Re: Cybernoid
« Reply #47 on: 2010.May.11. 12:01:33 »
Esetleg beállíthatóra lehetne csinálni? Pl amikor a csalást kérdi, akkor a funkcióbillentyûket nyomogatva.

Offline IstvanV

  • EP addict
  • *
  • Posts: 4822
Re: Cybernoid
« Reply #48 on: 2010.May.11. 23:13:45 »
Esetleg beállíthatóra lehetne csinálni? Pl amikor a csalást kérdi, akkor a funkcióbillentyûket nyomogatva.

A játék közben állítható az F1, F2, F5, F7, és F8 billentyűkkel:
  [ Guests cannot view attachments ]
  [ Guests cannot view attachments ]
  [ Guests cannot view attachments ]
  [ Guests cannot view attachments ]

Forráskód választható hang mód nélkül (az előző verzióhoz képest kisebb változtatásokkal):
  [ Guests cannot view attachments ]
  [ Guests cannot view attachments ]

Offline Zozosoft

  • Global Moderator
  • EP addict
  • *
  • Posts: 14733
  • Country: hu
    • http://enterprise.iko.hu/
Re: Cybernoid
« Reply #49 on: 2010.May.11. 23:26:35 »
A játék közben állítható az F1, F2, F5, F7, és F8 billentyûkkel:
Király! Bárcsak 20 évvel ezelõtt is ilyen support lett volna az EP játékokhoz!

Offline Lacika

  • EP addict
  • *
  • Posts: 3198
  • Country: hu
    • http://www.ep128.hu
Re: Cybernoid
« Reply #50 on: 2010.May.12. 08:13:39 »
A játék közben állítható az F1, F2, F5, F7, és F8 billentyűkkel:
 

Játék közben???  :smt041
Nem is gondoltam volna, hogy ezt meg lehet csinálni...
Full-extrás arcade!

Offline Lacika

  • EP addict
  • *
  • Posts: 3198
  • Country: hu
    • http://www.ep128.hu
Re: Cybernoid
« Reply #51 on: 2010.May.12. 18:12:23 »
A játék közben állítható az F1, F2, F5, F7, és F8 billentyűkkel:

AZ F8-al elérhető mód miben különbözik a többitől?

Offline IstvanV

  • EP addict
  • *
  • Posts: 4822
Re: Cybernoid
« Reply #52 on: 2010.May.12. 18:33:02 »
AZ F8-al elérhető mód miben különbözik a többitől?

F8-ra négyszögjel van felüláteresztő szűrővel és gyűrűmodulációval; az F7 csak gyűrűmoduláció.

Offline Zozosoft

  • Global Moderator
  • EP addict
  • *
  • Posts: 14733
  • Country: hu
    • http://enterprise.iko.hu/
Re: Cybernoid
« Reply #53 on: 2010.May.12. 19:19:40 »
F8-ra négyszögjel van felüláteresztõ szûrõvel és gyûrûmodulációval; az F7 csak gyûrûmoduláció.
Esetleg lehetne kérni egy Enterpress cikk pótló hozzászólást errõl az egész AY emuláció témáról?

Én ott tartok, mint amit az SpV-ben írtak annak idején  :oops:
Quote
A zene átírása már keményebb dió. Az AY-3-8912 regisztereinek leírása a SINCLAIR SPECTRUM JÁTÉK ÉS PROGRAM V. c. kötetében található (LSI ATSz. 1988.). A feladat az hogy olyan szubrutint készítsünk, amely a megfelelõ AY és DAVE regisztereket egymáshoz rendeli. Ezt a problémát még egyedüli és üdvözítõ módon nem sikerült megoldani.

A problémák:
• Hardware burkológörbe. Na ez az, ahol még nem Sikerült igazi áttörést végrehajtani. Szomorú tény, de ebben jobb az AY chip. Sajnos a "XENON" címû játék ENTERPRISE zenéje csak nyomokban emlékeztet az eredetire.

• Zajgenerátor. Abban az esetben, ha egy csatornán csak zaj szol, akkor majdnem teljes mértékben emulálható a zajeffekt. Ha egy csatornán egyszerre szól a zaj és a tiszta hang, akkor egyenlõre megáll a tudományunk.

Mindenesetre ha jól gondolom (hallom) akkor érdemes lenne egyes korábbi 128-as átíratokban upgradelni az AY rutint István félére!

Offline IstvanV

  • EP addict
  • *
  • Posts: 4822
Re: Cybernoid
« Reply #54 on: 2010.May.13. 00:30:38 »
Hardware burkológörbe. Na ez az, ahol még nem Sikerült igazi áttörést végrehajtani. Szomorú tény, de ebben jobb az AY chip. Sajnos a "XENON" címû játék ENTERPRISE zenéje csak nyomokban emlékeztet az eredetire

A burkológörbe megszakításból emulálható. Természetesen ez elfogyaszt némi CPU időt, és nagyobb burkológörbe frekvencia esetén a minőség sem tökéletes, de gyakran elfogadható eredményt lehet elérni. CPC átiratoknál jól használható a 300 Hz-es megszakítás, de ha fontos a minőség, akkor CPC és Spectrum átiratnál is lehet 1 kHz-es megszakításból emulálni a burkológörbét (ilyenkor kisebb problémát jelent, ha a játék HALT utasításokat használ időzítésre) - így még a Wec Le Mans motorhangja is, ha nem is tökéletes, de azért felismerhető. Az is megoldható, hogy ne minden 1 kHz-es megszakítás frissítse a burkológörbét, hanem csak például minden negyedik (rosszabb minőség, de kisebb CPU fogyasztás).

Quote
Ha egy csatornán egyszerre szól a zaj és a tiszta hang, akkor egyenlõre megáll a tudományunk

Valóban :oops: Ezt úgy oldottam meg, hogy fordításkor választhatóan csak négyszögjel vagy csak zaj legyen ilyenkor, vagy négyszögjel valamilyen torzítással (mint pl. az Exolon-ban).

Quote
Esetleg lehetne kérni egy Enterpress cikk pótló hozzászólást errõl az egész AY emuláció témáról?

Egyelőre ennyit sikerült leírni (remélhetőleg nem túl sok hibával), de ez később még kiegészíthető további információval:

Rövid AY regiszter leírás:

0: A csatorna négyszögjel frekvencia alsó 8 bit
1 (b0-b3): A csatorna négyszögjel frekvencia felső 4 bit
2: B csatorna négyszögjel frekvencia alsó 8 bit
3 (b0-b3): B csatorna négyszögjel frekvencia felső 4 bit
4: C csatorna négyszögjel frekvencia alsó 8 bit
5 (b0-b3): C csatorna négyszögjel frekvencia felső 4 bit

  frekvencia = F / N
  F = 62500 Hz CPC-n, F = 110840.47 Hz Spectrum 128-on
  N = a megadott 12 bites frekvencia érték (ha 0 vagy 1, akkor az osztó 1)

6 (b0-b4): zajgenerátor frekvencia (0-31, ha 0 vagy 1, akkor az osztó 1)
  N / F másodpercenként a következő művelet történik:
    - a 17 bites belső regiszter 1 bittel balra léptetődik
    - a 0. bit új értéke a léptetés előtti 16. és 13. bit között végzett
      XNOR művelet eredménye
    - a zajgenerátor kimenete a léptetés utáni 16. bit lesz
  Ez 131071 hosszúságú álvéletlenszám sorozatot generál (azért nem 131072,
  mert a 17 bites regiszter nem lehet 1FFFFh, akkor ugyanis végtelen
  ciklusban csak 1 lenne a kimenet; a kezdőérték 0FFFFh) - a lényeg, hogy
  a zajgenerátor nagyjából megfelel a DAVE 17 bites polinom számlálójának,
  bár a bitsorozat nem ugyanaz.

7 (b0-b5): mixer
  b0: A csatorna négyszögjel engedélyezése (0 = igen)
  b1: B csatorna négyszögjel engedélyezése (0 = igen)
  b2: C csatorna négyszögjel engedélyezése (0 = igen)
  b3: A csatorna zaj engedélyezése (0 = igen)
  b4: B csatorna zaj engedélyezése (0 = igen)
  b5: C csatorna zaj engedélyezése (0 = igen)

  Ha egy csatornán nincs semmi engedélyezve, akkor a csatorna kimenete
  '1' bit, azaz magas, amit például digitális hang lejátszására is fel
  lehet használni. Ezt az '1' szintet az adott csatorna négyszöggenerátora
  vagy a zajgenerátor is "lehúzhatja" nullára, ha engedélyezve van. Tehát
  négyszögjel+zaj esetén a két hang között AND művelet történik, ami
  egyfajta gyűrűmodulációnak tekinthető, de nem azonos a DAVE XNOR
  gyűrűmodulációjával.

8 (b0-b4): A csatorna hangerő / burkológörbe engedélyezés
9 (b0-b4): B csatorna hangerő / burkológörbe engedélyezés
10 (b0-b4): C csatorna hangerő / burkológörbe engedélyezés
  Ha a 4. bit 0, akkor az alsó 3 bit közvetlenül határozza meg a
  hangerőt, egyébként a hangerőt a burkológörbe verérli, és a 0-3. bitnek
  nincs hatása. A hangerő értékeknek az amplitúdó nem lineáris függvénye:
     0: 0.0000   4: 0.0423   8: 0.1691  12: 0.5704
     1: 0.0137   5: 0.0618   9: 0.2647  13: 0.6873
     2: 0.0205   6: 0.0847  10: 0.3527  14: 0.8482
     3: 0.0291   7: 0.1369  11: 0.4499  15: 1.0000

11: burkológörbe frekvencia alsó 8 bit
12: burkológörbe frekvencia felső 8 bit
  A burkológörbe generátor kimenete N / F másodperc időegységenként
  változik, ha N = 0 vagy 1, az 1 / F másodpercet jelent.

13 (b0-b3): burkológörbe mód / újraindítás
  Ennek a regiszternek az írása újraindítja a burkológörbét az elejéről.
  Az egyes bitek jelentése:
    0: hold
       ha ez 1, akkor az első periódus (16 időegység) után a burkológörbe
       generátor megáll, és a kimenet 0 lesz, ha az "alternate" és
       "attack" bitek értéke azonos vagy a "continue" bit 0, egyébként 15
    1: alternate
       folyamatos burkológörbe (continue = 1, hold = 0) esetén azt
       határozza meg, hogy mi történik, amikor a számláló 0 vagy 15
       elérése után túlcsordul:
         0: AND 15 (fűrészjel)
         1: az utolsó (0 vagy 15) kimenet ismétlődik, és az irány
            ellentétes lesz, azaz ...13, 14, 15, 15, 14, 13..., illetve
            ...2, 1, 0, 0, 1, 2... (háromszögjel)
    2: attack
       0: a burkológörbe 15-ről indul és csökken
       1: a burkológörbe 0-ról indul és növekszik
    3: continue
       ha ez 0, akkor az első periódus (16 időegység) után a burkológörbe
       generátor megáll, és a kimenet 0 lesz; a "hold" és "alternate"
       biteknek ilyenkor nincs hatása


Amint látható, a 0-5 regiszterek nagyjából megfelelnek a DAVE A0h-A5h portjainak, de a DAVE négyszögjel frekvenciája eltérő módon számítható:
  125000 / (N + 1)      (ha a BFh I/O port 1. bitje 0)
  83333.33 / (N + 1)    (ha a BFh I/O port 1. bitje 1)
Ezek az értékek 4 MHz-es gépre érvényesek, egyébként az órajellel arányosan nagyobbak.

Zajgenerátornak felhasználható a DAVE első három csatornája is 17 bites polinom számlálóval (ehhez az A6h portra 10h-t kell írni, ami felcseréli a 7 és 17 bites számlálót, azaz így az 1-3. csatorna használhatja a 17 bites, a 4. (nem használt) csatorna pedig a 7 bites számlálót). Figyelni kell azonban arra, hogy a zajgenerátort ez a négyszögjel frekvenciájának a kétszeresével mintavételezi, azaz a fel- és lefutó élnél is.

Ezek alapján a Spectrum és CPC frekvencia értékek így közelíthetők:
  Spectrum négyszögjel: N * 1.125 - 1
  Spectrum zaj:         N * 2.25 - 1
  CPC négyszögjel:      N * 2 - 1
  CPC zaj:              N * 4 - 1
A Spectrumnál az 1.125 ugyan nem egészen pontos, de az eltérés kisebb, mint 0.25%, és ez az arány egyszerűen számítható néhány Z80 utasítással.
Spectrum négyszögjel frekvencia konverzió (HL -> AL):
Code: ZiLOG Z80 Assembler
  1.         ld    b, h
  2.         ld    a, l
  3.         sra   b
  4.         rra
  5.         sra   b
  6.         rra
  7.         sra   b
  8.         rra
  9.         adc   a, l
  10.         ld    l, a
  11.         dec   hl
  12.         ld    a, b
  13.         adc   a, h
  14.         cp    10h
  15.         jr    nc, .l3                   ; overflow ?
  16. .l1:    ...
  17. .l3:    inc   l
  18.         inc   a
  19.         jr    z, .l1
  20.         ld    l, 0ffh
  21.         ld    a, 0fh
  22.         jp    .l1
Spectrum zaj frekvencia konverzió (A -> A):
Code: ZiLOG Z80 Assembler
  1.         cp    1
  2.         adc   a, 0
  3.         ld    h, a
  4.         rra
  5.         sla   h
  6.         rra
  7.         adc   a, h
  8.         dec   a
Ezek figyelnek a túlcsordulásra, a "speciális" N=0 esetre, ami azonos az N=1-el, és még arra is, hogy az eredmény ne lefelé legyen kerekítve, hanem a pontos (tört) értékhez a legközelebb legyen. Mindkét esetben a kód feltételezi, hogy a felső, AY által nem támogatott bitek 0-ra vannak állítva.
A CPC jóval egyszerűbb. Négyszögjel (HL -> AL):
Code: ZiLOG Z80 Assembler
  1.         add   hl, hl
  2.         dec   hl
  3.         ld    a, h
  4.         cp    10h
  5.         jr    nc, .l3                   ; overflow ?
  6. .l1:    ...
  7. .l3:    inc   l
  8.         inc   a
  9.         jr    z, .l1
  10.         ld    l, 0ffh
  11.         ld    a, 0fh
  12.         jp    .l1
Ez ugyan nem egészen jó, mert a 0 frekvenciát 0-ra konvertálja, pedig 1-re kellene. De mivel normál esetben (torzítás nélkül) egyik sem hallható, ez talán nem jelent komolyabb problémát. De egyszerűen javítható is az INC L helyére LD L, 1-et írva.
CPC zaj (A -> A):
Code: ZiLOG Z80 Assembler
  1.         cp    1
  2.         adc   a, 0
  3.         add   a, a
  4.         add   a, a
  5.         dec   a

A hangerőt egyszerű táblázattal lehet konvertálni (de ha nem fontos, hogy pontos legyen, megfelelhet a 4-el való szorzás is):
Code: ZiLOG Z80 Assembler
  1.         defb   0,  1,  2,  3,  4,  5,  6,  9
  2.         defb  12, 17, 22, 28, 36, 44, 53, 63
« Last Edit: 2010.May.13. 00:42:33 by IstvanV »

Offline geco

  • EP addict
  • *
  • Posts: 7113
  • Country: hu
    • Támogató Támogató
Re: Cybernoid
« Reply #55 on: 2010.May.13. 08:43:59 »
Hardware burkológörbe. Na ez az, ahol még nem Sikerült igazi áttörést végrehajtani. Szomorú tény, de ebben jobb az AY chip. Sajnos a "XENON" címû játék ENTERPRISE zenéje csak nyomokban emlékeztet az eredetire.
Az már nálam is ment, igaz 50Hz volt a maximum frekvencia, de az az alatti frekvenciával ellátott burkológörbéket jól kezelte, bele is futottam egy programba, ami magasabb frekvenciájú burkológörbét használ, el is gondolkoztam, hogy beteszem István AY emuját, majd előtte kiderítem, hogy befér-e, és a tökéletesebb emuláció miatt lassabb-e.

Offline geco

  • EP addict
  • *
  • Posts: 7113
  • Country: hu
    • Támogató Támogató
Re: Cybernoid
« Reply #56 on: 2010.May.13. 08:48:48 »
Valóban :oops: Ezt úgy oldottam meg, hogy fordításkor választhatóan csak négyszögjel vagy csak zaj legyen ilyenkor, vagy négyszögjel valamilyen torzítással (mint pl. az Exolon-ban).
Azt az opciót nem tetted bele, hogyha négyszögjel és zaj szól eccerre, akkor választható lenne az is, hogy szól a négyszögjel, és mellette a 31kHz-es zaj? Van pár program, aminél ez elég jó utánzás lenne, ahol a zajcsatornán cintányérszerű hang szól.
« Last Edit: 2010.May.13. 09:00:44 by geco »

Offline geco

  • EP addict
  • *
  • Posts: 7113
  • Country: hu
    • Támogató Támogató
Re: Cybernoid
« Reply #57 on: 2010.May.13. 09:06:54 »
Ezt az '1' szintet az adott csatorna négyszöggenerátora
  vagy a zajgenerátor is "lehúzhatja" nullára, ha engedélyezve van. Tehát
  négyszögjel+zaj esetén a két hang között AND művelet történik, ami
  egyfajta gyűrűmodulációnak tekinthető, de nem azonos a DAVE XNOR
  gyűrűmodulációjával.

Zajgenerátornak felhasználható a DAVE első három csatornája is 17 bites polinom számlálóval (ehhez az A6h portra 10h-t kell írni, ami felcseréli a 7 és 17 bites számlálót, azaz így az 1-3. csatorna használhatja a 17 bites, a 4. (nem használt) csatorna pedig a 7 bites számlálót). Figyelni kell azonban arra, hogy a zajgenerátort ez a négyszögjel frekvenciájának a kétszeresével mintavételezi, azaz a fel- és lefutó élnél is.
Nagyon tetszik a leírás, van egy csomó olyan dolog a leírtak között, amit a doksikban nem is láttam, igaz a felét lehet akkor se értettem volna, ha látom :D
Hogy derítetted ki, hogy zaj+hang esetén AND-eli a hangokat, a hengerő nem lineáris?
Én az A6h portot 1-3-as értékkel írtam a zajhoz, attól függően, hogy melyik csatornán volt zaj, ez nem jó, vagy miért választottad a polinom számlálós megoldást?

Offline Zozosoft

  • Global Moderator
  • EP addict
  • *
  • Posts: 14733
  • Country: hu
    • http://enterprise.iko.hu/
Re: Cybernoid
« Reply #58 on: 2010.May.13. 09:30:54 »
Ezek alapján a Spectrum és CPC frekvencia értékek így közelíthetõk:
  Spectrum négyszögjel: N * 1.125 - 1
  Spectrum zaj:         N * 2.25 - 1
  CPC négyszögjel:      N * 2 - 1
  CPC zaj:              N * 4 - 1
A Spectrumnál az 1.125 ugyan nem egészen pontos, de az eltérés kisebb, mint 0.25%, és ez az arány egyszerûen számítható néhány Z80 utasítással.
Na ezzel se foglalkoztak az általam látott AY rutinok.

Offline IstvanV

  • EP addict
  • *
  • Posts: 4822
Re: Cybernoid
« Reply #59 on: 2010.May.13. 14:10:27 »
Azt az opciót nem tetted bele, hogyha négyszögjel és zaj szól eccerre, akkor választható lenne az is, hogy szól a négyszögjel, és mellette a 31kHz-es zaj?

Én az A6h portot 1-3-as értékkel írtam a zajhoz, attól függően, hogy melyik csatornán volt zaj, ez nem jó, vagy miért választottad a polinom számlálós megoldást?

Mindkét kérdésre alapvetően ugyanaz a válasz: jóval egyszerűbb volt úgy megoldani, hogy az AY három csatornájának közvetlenül feleljen meg a DAVE első három csatornája, és ne kelljen a csatornákat dinamikusan foglalni (figyelembe véve azokat a lehetőségeket, hogy például egyszerre több csatornán is lehet engedélyezve zaj - akár úgy is, hogy az egyiken van burkológörbe, a másikon pedig nincs, illetve tovább bonyolítja a helyzetet a sztereó hang, és figyelni kell azt, hogy mikor van szabad csatorna zajgenerátor órajelnek, és mikor kell a 31.25 kHz-et használni). Így a négyszögjel+zaj problémától eltekintve egyszerű és gyors kóddal lehetett elfogadhatóan pontos és az AY hardver működéséhez közeli emulációt megvalósítani.

Quote
Van pár program, aminél ez elég jó utánzás lenne, ahol a zajcsatornán cintányérszerű hang szól.

Ilyenkor valóban nem működik túl jól, mert az alapértelmezett (1-es) módban a cintányér "elfedi" az adott csatornán a négyszögjelet, a torzításokkal pedig a négyszögjel a cintányér idejére alacsony frekvenciájú zajjá változik :oops: (az első talán kevésbé zavaró). A gyűrűmoduláció még akár viszonylag elfogadható eredményt is adhat, ha a négyszögjel+zaj véletlenül éppen a B csatornán van (mert akkor a gyűrűmoduláció forrása a zajcsatorna lesz) - esetleg ha ez mindig ugyanazon a csatornán történik, akkor az emulációban meg lehetne keverni a csatornák sorrendjét, hogy a "problémás" csatorna kerüljön a DAVE második hanggenerátorára.
A DAVE zajcsatornájának a fent említett dinamikus használatához gyakorlatilag újra kellene írni az AY emulátort.

Quote
Nagyon tetszik a leírás, van egy csomó olyan dolog a leírtak között, amit a doksikban nem is láttam, igaz a felét lehet akkor se értettem volna, ha látom :D
Hogy derítetted ki, hogy zaj+hang esetén AND-eli a hangokat, a hengerő nem lineáris?

A hangerő táblázatot több helyen lehet látni például különböző PC-s CPC és Spectrum emulátorokban (kisebb eltérésekkel, az alkatrészek szórása és mérési pontatlanságok miatt), de talán az eredeti AY dokumentáció is említi, hogy nem lineáris, csak nem jó értékeket adtak meg. Az itt látható táblázat a FUSE Spectrum emulátorból van. Az AND műveletet szintén más emulátorokban láttam, de mivel azt, hogy az alapértelmezett (tiltott négyszögjel és zaj) szint magas, több helyen is említik (pl. Wikipedia), könnyen lehet rá következtetni, ugyanis az AND művelet egyszerűbb hardvert igényel, mint a két jelet rendesen (összeadással vagy nagy frekvenciájú időosztással) keverni. A zajgenerátor algoritmus is megtalálható különböző más emulátorokban (itt is található például egy rövid x86 assembler rutin).