Welcome, Guest. Please login or register.

Login with username, password and session length


Author Topic: CPC (Read 146628 times)

Offline IstvanV

  • EP addict
  • *
  • Posts: 2418
  • OS:
  • Linux 64 bit (Suse) Linux 64 bit (Suse)
  • Browser:
  • Firefox 3.5.4 Firefox 3.5.4
    • View Profile
Re: CPC
« Reply #240 on: 2010.May.13. 16:25:20 »
Leírás az exolon.s-ben található Spectrum 128-as AY emulátor kódhoz (2. rész):

A burkológörbe emuláció 1 kHz-es megszakításból történik. Ennek a belépési pontja 0038h címen van:

Code: ZiLOG Z80 Assembler
  1.         phase 0038h
  2.  
  3.         push  af
  4.         in    a, (0b4h)
  5.         and   02h
  6.         jp    nz, envelopeInterrupt
  7.         ld    a, 31h
  8.         out   (0b4h), a
  9.         ei
  10.         jp    0000h
  11.  
  12.         dephase

Itt a B4h port 1. bitje alapján dönthető el, hogy 1 kHz-es megszakítás történt-e. Ha igen, akkor azonnal ugrik a burkológörbe emulátor rutinra. Egyébként törli a video megszakítást (5. bit), engedélyezi a video (4. bit) és 1 kHz-es (0. bit) megszakítást, majd a játék megszakítási rutinjára ugrik (a szinte biztosan az elején található PUSH AF utasítást átlépve). Előbb azonban engedélyezi a megszakításokat, hogy az esetleg lassú rutin futása közben is tovább működhessen a burkológörbe emuláció. A JP utasításhoz természetesen az adott játéktól függő címet kell írni a 0000h helyére.

Következik a burkológörbe emulátor rutin, amely így kezdődik:

Code: ZiLOG Z80 Assembler
  1. envelopeInterrupt:
  2.         ld    a, 13h
  3.         out   (0b4h), a
  4.     if ENV_SRATE_DIV > 1
  5. .lsrd1: ld    a, 0                      ; *
  6.         add   a, (256 + (ENV_SRATE_DIV / 2)) / ENV_SRATE_DIV
  7.         ld    (.lsrd1 + 1), a
  8.         jr    c, .lsrd2
  9.         pop   af
  10.         ei
  11.         ret
  12. .lsrd2:
  13.     endif

Törli az 1 kHz-es megszakítást (1. bit), és engedélyezi a video (4. bit) és 1 kHz-es (0. bit) megszakítást. Lehetőség van az 1 kHz-es megszakítás leosztására is, amellyel CPU idő takarítható meg rosszabb minőség árán.

Code: ZiLOG Z80 Assembler
  1.         push  bc
  2.         push  hl
  3. .l1:    ld    hl, 0000h                 ; * envelope counter
  4.         ld    bc, 010000h - (((110840 * ENV_SRATE_DIV) + 500) / 1000)
  5.         add   hl, bc
  6.         jr    c, .l16                   ; * JR if envelope is stopped
  7. .l2:    ld    bc, 0ffffh                ; * envelope frequency
  8. .l3:    ld    a, 0                      ; * envelope state (0 to 15)
  9. .l4:    dec   a                         ; * envelope direction (INC A or DEC A)
  10.         cp    10h
  11. .l5:    jr    nc, .l18                  ; * envelope mode
  12. .l6:    add   hl, bc
  13.         jr    nc, .l4
  14.         ld    (.l3 + 1), a
  15.         ld    (.l1 + 1), hl
  16.         or    low ayVolumeTable
  17.         ld    l, a
  18. .l7:    ld    h, high ayVolumeTable
  19.         ld    a, (hl)
  20.         pop   hl
  21.         jr    .l9                       ; * envelope enable mode
  22. .l8:    ...
  23. .l16:   ld    (.l1 + 1), hl
  24.         pop   hl
  25.         pop   bc
  26.         pop   af
  27.         ei
  28.         ret

Itt az .l1-nél található számláló minden burkológörbe megszakításnál csökken. A 110840 az AY frekvenciák számításánál használt konstans (ami 62500 CPC-n), az 1000 az emuláció "órajele" osztás előtt, az 500 pedig annak a fele kerekítéshez. CPC-nél a 300 Hz-es megszakítást használva ezeket át kell írni 300-ra és 150-re. Ha a számláló nem csordul túl (vagy ha a burkológörbe már lefutott és a JR C utasítás helyére JR került), akkor .l16-nál az új érték egyszerűen tárolódik, és a rutin visszatér.
Túlcsordulás esetén a számláló újratöltésére, és a burkológörbe állapot (0-15) frissítésére kerül sor. Érdemes megfigyelni, hogy nagy burkológörbe frekvenciánál a kód egyszerre többet is tud lépni a burkológörbe állapoton; ezért van a frekvencia korlátozása, hogy ez a ciklus ne lassulhasson le nagyon. Ha a burkológörbe állapot is túlcsordul, akkor a módtól függően ezek történhetnek:

Code: ZiLOG Z80 Assembler
  1. .l17:   ld    l, low (ayVolumeTable + 15)       ; envelope modes 11 and 13
  2.         defb  01h                       ; = LD BC, nnnn
  3. .l18:   ld    l, low ayVolumeTable      ; envelope modes 0 to 7, 9, and 15
  4.         ld    a, 18h                    ; = JR +nn
  5.         ld    (.l2 - 2), a              ; stop envelope
  6.         jp    .l7
  7. .l19:   and   0fh                       ; envelope modes 8 and 12
  8.         jp    .l6
  9. .l20:   ld    a, (.l4)                  ; envelope modes 10 and 14
  10.         rrca
  11.         jr    c, .l21                   ; direction was DEC A ?
  12.         ld    a, 3dh
  13.         ld    (.l4), a                  ; direction = DEC A
  14.         ld    a, 15
  15.         jp    .l6
  16. .l21:   ld    a, 3ch
  17.         ld    (.l4), a                  ; direction = INC A
  18.         xor   a
  19.         jp    .l6

Az új kimenetnek megfelelően a DAVE hangerő regisztereket is be kell állítani, tehát a táblázatból olvasott konvertált hangerő a 8-9. regiszterekben beállított módtól függően a DAVE A8h-AFh portjaira kerülhet:

Code: ZiLOG Z80 Assembler
  1. .l8:    out   (0a8h), a                 ; envelope on channel A only
  2.     if ENABLE_STEREO == 0
  3.         out   (0ach), a
  4.     endif
  5. .l9:    pop   bc
  6.         pop   af
  7.         ei
  8.         ret
  9. .l10:   out   (0a8h), a                 ; envelope on channels A and B
  10.     if ENABLE_STEREO == 0
  11.         out   (0ach), a
  12.     endif
  13. .l11:
  14.     if ENABLE_STEREO != 0
  15.         ld    c, a                      ; envelope on channel B only
  16.         srl   c
  17.         srl   c
  18.         sub   c
  19.     endif
  20.         out   (0a9h), a
  21.         out   (0adh), a
  22.         pop   bc
  23.         pop   af
  24.         ei
  25.         ret
  26. .l12:   out   (0a8h), a                 ; envelope on channels A and C
  27.     if ENABLE_STEREO == 0
  28.         out   (0ach), a
  29.     endif
  30. .l13:
  31.     if ENABLE_STEREO == 0
  32.         out   (0aah), a
  33.     endif
  34.         out   (0aeh), a                 ; envelope on channel C only
  35.         pop   bc
  36.         pop   af
  37.         ei
  38.         ret
  39. .l14:   out   (0a8h), a                 ; envelope on channels A, B, and C
  40.     if ENABLE_STEREO == 0
  41.         out   (0ach), a
  42.     endif
  43. .l15:
  44.     if ENABLE_STEREO == 0
  45.         out   (0aah), a
  46.     endif
  47.         out   (0aeh), a                 ; envelope on channels B and C
  48.     if ENABLE_STEREO != 0
  49.         ld    c, a
  50.         srl   c
  51.         srl   c
  52.         sub   c
  53.     endif
  54.         out   (0a9h), a
  55.         out   (0adh), a
  56.         pop   bc
  57.         pop   af
  58.         ei
  59.         ret

Végül az AY emuláció inicializálása:

Code: ZiLOG Z80 Assembler
  1. ayReset:
  2.         di
  3.         ld    hl, ayRegisters - 1
  4.         ld    bc, 10afh
  5.         xor   a
  6. .l1:    inc   hl
  7.         out   (c), a
  8.         ld    (hl), a
  9.         dec   c
  10.         djnz  .l1
  11.         res   3, l                      ; register 7
  12.         ld    (hl), 3fh
  13.     if NO_ENVELOPE_IRQ == 0
  14.         ld    (envelopeInterrupt.l3 + 1), a
  15.         ld    a, 18h                    ; = JR +nn
  16.         ld    (envelopeInterrupt.l2 - 2), a
  17.         ld    hl, MIN_ENV_FREQVAL
  18.         ld    (envelopeInterrupt.l2 + 1), hl
  19.         ld    a, low (envelopeInterrupt.l9 - envelopeInterrupt.l8)
  20.         ld    (envelopeInterrupt.l8 - 1), a
  21.         ld    hl, irqCodeBegin
  22.         ld    de, 0038h
  23.         ld    c, low (irqCodeEnd - irqCodeBegin)
  24.         ldir
  25.     endif
  26.         ld    a, 0ch
  27.         out   (0bfh), a
  28.         ld    a, 10h
  29.         out   (0a6h), a                 ; use 17-bit noise generator
  30.     if NO_ENVELOPE_IRQ == 0
  31.         ld    a, 33h
  32.         out   (0b4h), a                 ; enable 1 kHz and video interrupts
  33.         ei
  34.     endif
  35.         ret

Itt az A6h portra írt 10h-t érdemes említeni, amely felcseréli a 7 és 17 bites polinom számlálókat. Így a DAVE első három csatornáján az utóbbi használható.

A CPC-s betöltőben az AY emulátor kissé eltér a frekvencia konverzió módosítása és a 300 Hz-es megszakítás használatának lehetősége miatt. Ezen kívül ott van olyan rutin, amely mind a 14 regisztert írja egyszerre egy táblázatból - ez gyorsabb, mint az ayRegisterWrite-ot 14-szer hívni, és a CPC-s programok gyakran használnak ilyen megoldást 50 Hz-es megszakításból.
« Last Edit: 2010.May.13. 16:51:03 by IstvanV »

Online Zozosoft

  • EP addict
  • *
  • Posts: 8237
  • Country: hu
  • OS:
  • Windows XP Windows XP
  • Browser:
  • Firefox 3.6.3 Firefox 3.6.3
    • View Profile
    • http://enterprise.iko.hu/
Re: CPC
« Reply #241 on: 2010.May.13. 16:44:34 »
Ezen kívül ott van olyan rutin, amely mind a 14 regisztert írja egyszerre egy táblázatból - ez gyorsabb, mint az ayRegisterWrite-ot 14-szer hívni, és a CPC-s programok gyakran használnak ilyen megoldást 50 Hz-es megszakításból.
Ilyen rutin a Spectrumos-os verzióhoz is kéne, ott is gyakran csinálnak ilyet a programok!

Offline IstvanV

  • EP addict
  • *
  • Posts: 2418
  • OS:
  • Linux 64 bit (Suse) Linux 64 bit (Suse)
  • Browser:
  • Firefox 3.5.4 Firefox 3.5.4
    • View Profile
Re: CPC
« Reply #242 on: 2010.May.13. 16:47:43 »
Ilyen rutin a Spectrumos-os verzióhoz is kéne, ott is gyakran csinálnak ilyet a programok!

Szerintem azt minimális változtatással (eltérő PUSH utasítások az .l3 után) be lehet másolni a cybrnoid.s-ből.

Offline IstvanV

  • EP addict
  • *
  • Posts: 2418
  • OS:
  • Linux 64 bit (Suse) Linux 64 bit (Suse)
  • Browser:
  • Firefox 3.5.4 Firefox 3.5.4
    • View Profile
Re: CPC
« Reply #243 on: 2010.May.13. 20:33:26 »
Ez még nincs kész, de érdemes átírni (már van egy átirat Spectrumról) ?
  * hydrofol.com (2.06 kB - downloaded 52 times.)
  * hydrofol.prg (64 kB - downloaded 54 times.)

Online Zozosoft

  • EP addict
  • *
  • Posts: 8237
  • Country: hu
  • OS:
  • Windows XP Windows XP
  • Browser:
  • Firefox 3.6.3 Firefox 3.6.3
    • View Profile
    • http://enterprise.iko.hu/
Re: CPC
« Reply #244 on: 2010.May.13. 21:36:28 »
Ez még nincs kész, de érdemes átírni (már van egy átirat Spectrumról) ?
Nagyon jól néz ki már így is! Ez a termenként más 4 színû paletta nagy felüdülés a megszokott Spectrum színek után! Esetleg akár még fel is lehetne extrásítani, hogy a teljes (szóba jöhetõ) EP színválaszték pörögjön, nem is csak a CPC-nek megfelelõek.

Na most kiderült, hogy honnan van a Small Demo egyik zenéje :-)
Ami azért is érdekes, mert a Spectrumos átíratban nem igazán sikerült az AY emuláció, így fel se lehet ismerni a zenét :-) ezek szerint kéne lenni ebbõl egy Gyányi átiratnak is?

Offline nyuzga

  • EP addict
  • *
  • Posts: 1322
  • Country: hu
  • OS:
  • Windows XP Windows XP
  • Browser:
  • Opera 9.80 Opera 9.80
    • View Profile
Re: CPC
« Reply #245 on: 2010.May.13. 21:39:39 »
Ez még nincs kész, de érdemes átírni (már van egy átirat Spectrumról) ?

Igen. A ZX verziót már 1X majdnem sikerült végigjátszanom, de kifeküdt :)

Offline Attus

  • EP lover
  • *
  • Posts: 936
  • Country: hu
  • OS:
  • Linux 64 bit Linux 64 bit
  • Browser:
  • Safari Safari
    • View Profile
Re: CPC
« Reply #246 on: 2010.May.13. 22:00:13 »
Ez még nincs kész, de érdemes átírni (már van egy átirat Spectrumról) ?
Mindenképpen érdemes lenne, mert én sokat vacakoltam vele, nagyon tetszett.
Van jó mûködõ Hydrofool Spectrum átirat?
 :shock:
Sajnos a spectrum átirat, amit én csináltam hibás. Elszáll, mint nyuzgánál. Biztos õ is az enyémet nyomatta.
Kipróbáltam spectrum emulátorral az eredeti forrását, amibõl átírtam, de az is ugyanúgy, ugyanott elszállt, mint az átiratom. Más forrást nem tudtam keríteni.Lehet, hogy az EP klubból kikerült valahogyan az átirat, hisz Gyányi Sanyi abból szedte ki demójához a zenét.
Ezért nem is töltöttem fel a programjaim közé, mert nagy kudarc élményem okozója.
Sokat kerestem az okát, a pálya leíró részében van a hiba.
 :(
« Last Edit: 2010.May.13. 22:05:36 by Attus »

Offline nyuzga

  • EP addict
  • *
  • Posts: 1322
  • Country: hu
  • OS:
  • Windows XP Windows XP
  • Browser:
  • Opera 9.80 Opera 9.80
    • View Profile
Re: CPC
« Reply #247 on: 2010.May.13. 22:17:52 »
ILYEN! sem nagyon van EPén. :)

5088-0

Offline Lacika

  • EP addict
  • *
  • Posts: 2378
  • Country: hu
  • OS:
  • Windows XP Windows XP
  • Browser:
  • Firefox 3.6.3 Firefox 3.6.3
    • View Profile
    • http://www.ep128.hu
Re: CPC
« Reply #248 on: 2010.May.13. 22:57:30 »
Ami azért is érdekes, mert a Spectrumos átíratban nem igazán sikerült az AY emuláció, így fel se lehet ismerni a zenét

Ahogy így meghallgattam a Spectrum-os verziót, azt kell mondjam, nagy mértékben szépítetted a tényeket...  :ds_icon_cheesygrin:
Ami nálam letölthető az az Attus átirat? Mást nem találtam a sok-sok "ömlesztett" program között.  :cry:

Offline Attus

  • EP lover
  • *
  • Posts: 936
  • Country: hu
  • OS:
  • Linux Linux
  • Browser:
  • Firefox 3.6 Firefox 3.6
    • View Profile
Re: CPC
« Reply #249 on: 2010.May.13. 23:15:32 »
Ahogy így meghallgattam a Spectrum-os verziót, azt kell mondjam, nagy mértékben szépítetted a tényeket...  :ds_icon_cheesygrin:
Ami nálam letölthetõ az az Attus átirat? Mást nem találtam a sok-sok "ömlesztett" program között.  :cry:
Ha az én AY rutinom csinálja a "zenét" , akkor biztosan. az enyém. Korai átiratom, az Amaorute, Blacklamp korszakból. Az AY emuláció is "õskori". A stílusom felismerhetõ a betöltõ részében. DTF verziót nem is csináltam belõle, az elszállás okán.  :cry:
Mint írtam, a közzététel nem volt szándékos. Jó lenne  egy jól mûködö verzió, akár Spectrum, akár CPC átiratban.
« Last Edit: 2010.May.13. 23:18:38 by Attus »

Offline Lacika

  • EP addict
  • *
  • Posts: 2378
  • Country: hu
  • OS:
  • Windows XP Windows XP
  • Browser:
  • Microsoft Internet Explorer 6.0 Microsoft Internet Explorer 6.0
    • View Profile
    • http://www.ep128.hu
Re: CPC
« Reply #250 on: 2010.May.14. 08:24:27 »
Mint írtam, a közzététel nem volt szándékos. Jó lenne  egy jól mûködö verzió, akár Spectrum, akár CPC átiratban.

Akkor én is törölni fogom az oldalról.

Online geco

  • EP addict
  • *
  • Posts: 1859
  • Country: hu
  • OS:
  • Windows XP Windows XP
  • Browser:
  • Firefox 3.6.3 Firefox 3.6.3
    • View Profile
Re: CPC
« Reply #251 on: 2010.May.14. 09:27:12 »
Ez még nincs kész, de érdemes átírni (már van egy átirat Spectrumról) ?
 

Ha lenne, akkor is érdemes lenne, nemcsak a kis 256x192-es képernyőt csodálhatjuk, és tuti színesebb is, mint a spectrum verzió, és még színesebbé is lehet tenni.
Úgy látom a CDT image-eket preferálod, és betöltés után mented le a 64kb-tos memóriát, CPCxfs program használatával a Disc image-ekből kinyerhetők a file-ok, ha nem CP/M-es a lemez, sőt már CP/M-es lemezről is sikerült file-okat kinyerni, vagy csak simán track adatot normál CPC-s lemezről (Sorcery Plus kb 64kb-ot olvasott trackekből)

Online Zozosoft

  • EP addict
  • *
  • Posts: 8237
  • Country: hu
  • OS:
  • Windows XP Windows XP
  • Browser:
  • Firefox 3.6.3 Firefox 3.6.3
    • View Profile
    • http://enterprise.iko.hu/
Re: CPC
« Reply #252 on: 2010.May.14. 09:35:29 »
Úgy látom a CDT image-eket preferálod, és betöltés után mented le a 64kb-tos memóriát
Az Airwolf megnézésekor én úgy csináltam, hogy a load rom rutinra raktam töréspontot, és feljegyeztem hova mennyit töltött.
Ez esetben a lemezes verzió valami agyonfeltört volt, és a mérete is kisebb volt pár K-val... így alkalmatlan volt az összehasonlításra.

Offline szipucsu

  • EP addict
  • *
  • Posts: 3830
  • Country: hu
  • OS:
  • Windows XP Windows XP
  • Browser:
  • Firefox 3.6.3 Firefox 3.6.3
    • View Profile
    • Webnyelv.hu - Tanuljunk nyelveket!
Re: CPC
« Reply #253 on: 2010.May.14. 13:26:07 »
Az Airwolf megnézésekor én úgy csináltam, hogy a load rom rutinra raktam töréspontot, és feljegyeztem hova mennyit töltött.
Ez esetben a lemezes verzió valami agyonfeltört volt, és a mérete is kisebb volt pár K-val... így alkalmatlan volt az összehasonlításra.
Ha már feltörték, rendbe rakhatták volna a fagyást a végén. Fogadjunk, hogy még annyit sem javítottak rajta, hogy legalább ne fagyjon le. :D
Az EP jobb volt, mint a PC, nem volt Windows újratelepítés, hirtelen kikapcsoláskor scandisk, kék képernyõ pedig legfeljebb a DOS ablakban volt, az is más funkcióval.
The EP was better than the PC- no scandisk/reinstall/blue screen

Offline IstvanV

  • EP addict
  • *
  • Posts: 2418
  • OS:
  • Linux 64 bit (Suse) Linux 64 bit (Suse)
  • Browser:
  • Firefox 3.5.4 Firefox 3.5.4
    • View Profile
Re: CPC
« Reply #254 on: 2010.May.14. 16:47:09 »
Esetleg akár még fel is lehetne extrásítani, hogy a teljes (szóba jöhetõ) EP színválaszték pörögjön, nem is csak a CPC-nek megfelelõek.

A pályákat kellene módosítani, vagy elég csak a CPC-s színekhez rendelt EP-s színeket cserélni (mint pl. a Batman-ben, ahol a narancsszín helyére egy világosabb sárga került) ? Ez a táblázat konvertálja a CPC-s színeket:
Code: ZiLOG Z80 Assembler
  1. cpcColorTable:
  2.         defb  007h, 007h, 096h, 0dfh, 004h, 04dh, 006h, 04fh
  3.         defb  04dh, 0dfh, 0dbh, 0ffh, 049h, 06dh, 04bh, 06fh
  4.         defb  004h, 096h, 092h, 0b6h, 000h, 024h, 002h, 026h
  5.         defb  005h, 097h, 093h, 0b7h, 001h, 025h, 003h, 027h
Melyik szín(eke)t lenne érdemes változtatni ?