Amstrad CPC Emulátor

File-név: CPCEMU.COM
Program neve: Amstrad CPC Emulator
2006
Software-es CPC emulátor

1984-ben (tehát az Enterprise előtt) jelent meg a piacon az angol Amstrad cég CPC464 típusú, otthoni használatra tervezett mikroszámítógépe. A gép paramétereivel a Commodore 64 vetélytársa kívánt lenni, kihasítva minél nagyobb piaci részesedést a '80-as évek első felében igen jövedelmező 8-bites számítógéppiacból. Bár a Commodore-nak igazán nem lett vetélytársa, Európában jelentős üzleti sikereket ért el, (Elsősorban Franciaországban.), egészen 1990-ig gyártották. Sajnos ezen sikereket a késve megjelent Enterprise kárára könyvelhette el... Külsőleg leginkább a Sinclair ZX Spectrum +2-re hasonlít beépített magnetofonjával. Az 1985-től gyártott CPC664 bedig már beépített lemezmeghajtóval rendelkezett. Ez azonban az Amstrad által erőltetett 3" modell volt (Ezt építette a cég a Spectrum +3-ba is), melyhez a lemez nehezen beszerezhető és drága volt még a szigetországban is. Gyártásával még 1985-ben leálltak, helyette 1985 augusztusában az amerikai piacra kihozták az Amstrad CPC 6128-ast, 128K memóriával, szintén 3 collos beépített floppy-val, és az év végétől Amstrad illetve Schneider CPC 6128 néven Európában is elkezdték forgalmazni.

Teljesítménye hasonló az Enterprise-hoz:

  • A Zilog - méltán népszerű - Z80A processzorát használja, 4 MHz-s órajellel,
  • 64Kb RAM, 32 Kb ROM
  • 3-féle grafikus-mód:
    160 x 200 - 16 színnel,
    320 x 200 - 4 színnel,
    640 x 200 - 2 színnel.
  • Összesen 27 különböző szín közül válogathat a programozó.

Jogosan vetődhet fel a kérdés, hogy ha Spectrum emulátort lehet készíteni kedvenc gépünkhöz, miért ne lehetne CPC emulátort??? Természetesen - hála pl. az Enterpise rugalmas képernyőkezelésének - minden további nélkül lehet! A szkeptikusok rögtön legyintenek: a software-es Spectrum emulátorok leginkább csak BASIC programok futtatására alkalmasak, egy CPC emulátortól sem várhatunk többet. Szerencsére ez azonban nem igaz, mert a CPC operációs rendszere korántsem olyan kiforrott, mint az EXOS (még, hogy elfogult??? Én???). Ezért a CPC-n közvetlenül programozni a hardware-t elég bonyolult, sok program csak ROM hívásokat használ.

Az Emulátor
A program EXOS kompatibilis, azaz futtatható EP64-en is memóriabővítéssel (+48K memória szükséges.). Kazettás és lemezes rendszerben is működik, magnós konfigurációban van státusz sor (a betöltés megkönnyítése érdekében), lemezes rendszerben nincs. Az emulátor 64Kbyte-os CPC664-et emulál, a futtatható programoknak a következő feltételeket kell teljesíteni:

Tekintettel, hogy 16 színű üzemmódban CPC-n a színeket tetszőlegesen lehet összeválogatni, Enterprise-on viszont a felső 8 színt csak színcsoportokból (BIAS) lehet kiválasztani, a színek nem lesznek jók. Bár az emulátor lehetőséget nyújt a BIAS választására, ez a megoldás korántsem nevezhető tökéletesnek.
Az emulátor a következő speciális funkciókkal rendelkezik:

STOP+HOLD leállítja az emulátor működését (a keret fekete színűre változik).
  • Ha megállítjuk az emulátort, a beépített joystick jobbra-balra mozgatásával módosíthatjuk a BIAS-t (ennek 16 színes grafikus üzemmódot használó programoknál van hatása).
  • ESC - emulátor újraindítása.
CTRL+F1 visszatérés a STOP+HOLD módból
meleg RESET emulátor újraindítása
hideg RESET Enterprise újraindítása

Botkormány: játékoknál nem árt, ha van, az EXT2 botkormányon emulálja a program.

A CPC és az Enterprise billentyűzete közötti eltérések:

CPC Enterprise
RETURN
SHIFT
CTRL
CAPS
DEL
F9
F0
COPY
CLR
ENTER
jobb SHIFT
DEL
LOCK
DEL
HOLD
STOP
bal SHIFT
CTRL

Hangkezelés

Az Amstrad CPC hangkeltéséért az AY-3-8912 chip a felelős (mint a 128K-s Spectrumokban). A hangemuláció nem tökéletes, de az 1.2-es verzió előrelépést jelent e téren: Envelope emuláció megvalósítva, a legrövidebb envelope sajnos csak 50Hz lehet.
Zaj emuláció sokkal jobb, de itt is van hiányosság: egyszerre zaj, és normál hang nem szólhat egy hangcsatornán, mivel a zaj frekvenciáját a hangfrekvenica regiszterek egyikén keresztül lehet beállítani. (A régebbi verzióban fix 30 kHz-es zaj szólt csak.) Elkészült egy olyan rutin is, ami hangot+30kHz-es zajt is tud lejátszani, ha zaj+normál hang igény érkezik, és AY 6-os regiszter által beállított frekvenciájú zajt, ha csak zajigény érkezett. Sajnos nagyon sok program beállítja a zaj+normál hang igényt akkor is, ha csak zajt játszik le, így elég rossz volt a hatás (fix 30kHz-es zaj szólalt meg, és hallgatott el) pl. az Airwolfban, köze nem volt az eredetihez, itt az előző verzió hangkezelése biztosítja a jobb hangzást.
A letölthető file két verziót tartalmaz:

Az 1.3-as verzió

Az AY emulálásában előrelépés történt: zajok javítása, és frekvencia értékek javítása, mindhárom csatornán szólhat a zaj (de normál hang nem, ha épp zaj is van az adott csatornán). Megszűnt a két különböző változat.
Emellett a billentyűzet és botkormány kezelésben történtek kényelmi változások. Ha egy játék GET JOY rutinon keresztül figyeli a joysticket, akkor az EXT2 botkormány helyett az Ep beépített botkormányán is működik a botkormányfigyelés (a tűzgomb a SPACE). Továbbá a ROM billentyűmátrixában történt néhány változtatás, így a billentyűzetkiosztás a jobb oldali táblázat szerint változott.

Új funkció, hogy a STOP+ENTER megnyomásával visszaállíthatjuk a videoszinkront. Ez akkor hasznos, ha egy játékban villognak a sprite-ok.

A CPC és az Enterprise billentyűzete közötti eltérések:

CPC Enterprise
RETURN
SHIFT
CTRL
CAPS
DEL
F9
F0
COPY
CLR
ENTER
SHIFT
CTRL
LOCK
DEL
HOLD
STOP
CTRL+F1
ERASE

Programok betöltése

CPC-s programot betölteni a

RUN"file-név"

paranccsal lehet, de a CPC BASIC-je "elnézi nekünk", ha lefelejtjük a záró idézőjelet. Magnós rendszerben (ahol nem kötelező file-nevet megadni) tehát a legegyszerűbb parancs:

RUN"

Lemezes rendszerben a

CAT

paranccsal kérhetünk directory-t a lemezről, de ezt nem a CPC képernyőn jeleníti meg az emulátor, henem egy külön videólapon. Az emulátor használatához az ESC megnyomásával térhetünk vissza.

Kompatibilitás
Az emulátorral a CPC programok kb. 15%-a futtatható. Ez nem tűnik soknak, de figyelembe véve a CPC kb. 2000 programot számláló sotware-választékát, több mint 300 játékot jelent. Tekintettel, hogy a CPC nem is ismeri az attribútum képernyő-módot, ezen programok üdítően hatnak a Spectrum átiratokhoz szokott szemnek, bár néhány programnál szembesülhetünk azzal, hogy az attribútum grafikának is megvannak az előnyei (sok játéknak van CPC-s és Spectrum változata is). Az emulátorral kompatibilis játékokat az Amstrad CPC programcsokor tartalmazza. Az emulátor ismert hibái:

Akik nem elégszenek meg a letölthető emulátor-kompatibilis játékokkal, és szeretnének internetről letöltött programokat kipróbálni, azok azzal szembesülnek, hogy a programok többnyire disk image-formátumban hozzáférhetők. Ilyen formátumban azonban nem tudjuk betölteni, az image file-ból ki kell másolnunk a programfile-okat. Erre a CPCXFS programot használhatjuk. Egyszerű parancssoros program, de a használatától nem kell megijedni, rendkívül egyszerű dolgunk van:

Nyissuk meg az image file-t:

open disknév.DSK

A .DSK kiterjesztést feltételezi a program, tehát elég beírni csak a nevet, kiterjesztés nélkül.
Másoljuk ki az összes programfile-t:

mget *.*

Ezután bezárhatjuk a megnyitott disk image-et:

close

A programból szabályosan az EXIT paranccsal léphetünk ki.

Az emulátor átiratokhoz való felhasználása
Ha egy CPC-s program nem fut az emulátorral, a program átírásához is felhasználhatjuk, jelentősen megkönnyítve munkánkat (pl. az Alien Attack ilyen átirat):

1. Az OS ROM betöltése után el kell tárolni a használt RAM szegmenseket, a képernyő Nick címét a ROM megfelelő helyein:

ld hl,30h
ld de,3b30h
ld b,h
ld c,l
ldir

ld (1578h),a
ld (1001h),a
ld (1626h),a

ld (15a2h),a

ld (159eh),a
ld (358ch),a

ld (1596h),a
ld (17cbh),a
ld (3590h),a
ld (359ch),a

ld (3594h),a
ld (35a0h),a

ld (15a8h),a
ld (15cbh),a
ld (35a4h),a
ld (35ceh),a
ld (3766h),a

ld (3755h),a
ld (17b6h),a
ld (15b7h),a

ld (384bh),hl

ld (3858h),hl

; EXOS 30h-60h 2B30h-ra másolása



; OS664 ROM

; BASIC ROM (elhagyható,ha
; a program nem használ Basic-et)
; CPC RAM0


; CPC RAM1


; CPC RAM2

; CPC RAM3, videó szegmens



;LPT szegmens

;Nick-nek megadott videócím

;C000h-a Nicknek megadott videócím

(ezek az értékek 1000h-ra betöltött OS ROM-ra érvényesek)

2. 2, 200+SYNC soros LPT létrehozása, mindkettőnek ugyanazon a 4K-s részen, és ugyanazon a memóriaszegmensen belül  kell lennie (pl. ha LPT1 2000h-n van, akkor LPT2 2DA0h-n), mivel az emu 2 LPT-t használ a villogás emulálásához (CPC is két palettát használ), és csak a 82h portot használja a váltáshoz. LPT váltás:

0784h
0786h
0788h
0789h
078Bh
078Dh
3E00
D383
C9
3EDA
D383
C9
ld a,00h
out (82h),a
ret
ld a,0dah
out (82h),a
ret

Ha a használandó LPT címei eltérnek a 0000h-tól, 0DA0h-tól, akkor a ( 7.) pontban leírtakat kell változtatni.
Az LPT-ben 6 olyan LPB-nek kell lennie egymástól egyforma távolságban, ami videó megszakítást generál, a CPC 300 Hz-es megszakítását így sikerült emulálni.

3. Az átírt program futtatása előtt szükséges az OS ROM-ot elindítan, hogy a szükséges inicializálást elvégezze:

JP 0000h

4. A ROM meghívása előtt a megfelelő RAM szegmenseket be kell lapozni:

page0 - OS ROM
page1 - CPC RAM0
page2 - CPC RAM2
page3 - CPC RAM3

5. Két szubrutinhívást törölni kell és elhelyezni azt a JP utasítást, ami meghívja az átírt programot.

0647h
064Fh

0654h

CDBC24
CD1E00

C37700

CALL 24BCh
CALL 001Eh

JP 0077h

; Cas inicializálás
; Képernyő init, gyártó, géptípus kiírása

; ide lehet tenni a program indítási címét

104Eh-105Eh
105Fh-106Fh
  ; 1. paletta (inicializáláskor innen tölti fel a palettát)
; 2. paletta (inicializáláskor innen tölti fel a palettát)

6. Ha az átírt program nem 320x200-as képernyőt használ:

284EH

0150C8

LD BC,0C850H

; C8h 200 sor
; 50h 80 byte = 40 karakter/sor

  (ez a rész csak a képernyő scrollozásával foglalkozik)
2770h 06C8 LD B,0C8h ; C8h 200 sor

7. Az emulátorban használttól eltérő LPT címek esetén:

2758h
275Fh

1118C0
11B8CD

LD DE,0C018h
LD DE,0CDB8h

; 1. LPT
; 2. LPT

(Page3-ra lett belapozva az LPT szegmens, a 18h-s eltérés azért van, mert az első 10h byte a Státusz soré, ezért cseréli a program 18h-tól a színbyte-okat.)

(ez a rész csak a paletta módosításával foglalkozik +2770h)

Ha szükség van egy kis szabad területre, akkor az OS ROM 28C4h-2C01h területe felhasználható, ez az eredeti magnókezelő érintetlenül hagyott része.