Emulador ZX Spectrum

De wikijoan
Salta a la navegació Salta a la cerca

Contingut

Introducció

bas2tap

Compila bé a Linux, perquè no té cap dependència especial.

Build:

$ make
o bé:
$ gcc -Wall -o bas2tap bas2tap.c -lm
10 FOR n=1 TO 10
20 PRINT "JOAN"
30 NEXT n

$ ./bas2tap codi/prova1.bas codi/prova1.tap

tape2wav

Tinc el ZX Spectrum +, i vull fer funcionar les ROMs que es poden trobar a Internet. Per convertir els fitxers tape a wav:

La utiltiat tape2wav es troba dins de l'emulador fuse.

fuse-emulator-utils - The Free Unix Spectrum Emulator - Utilities
$ sudo apt-get install fuse-emulator-utils

$ tape2wav
tape2wav: usage: tape2wav [-r rate] <infile> <outfile>
Try `tape2wav --help' for more information.
$ tape2wav -r 44100 Jetpac\ \(1983\)\(Ultimate\)\[a\].tzx jetpac.wav

Els fitxers d'entrada possible són:

  • Tape images: .tzx, .tap, .spc, .sta, .ltp (read/write) and .pzx, Warajevo .tap, Z80Em and CSW version 1 (read only

Les roms les puc descarregar per exemple de:

Per gravar i fer play directament des de la línia de comandes:

$ arecord -r 44100 -f cd -t wav -D plughw:0 foobar.wav
$ aplay -D plughw:0 foobar.wav

tap2bas

A fuse-emulator-utils trobem una altra utilitat interessant, listbasic, que ens permet convertir un .tap al codi basic.

$ listbasic rainbow2.tap
   10 REM Rainbowtype 2.0
   20 BORDER 0
   30 PAPER 0
   40 CLS 
   50 LET b=0
...
$ listbasic EscapeTCR3.TAP > ../BAS/EscapeTCR3.BAS

Explicació del format TAP:

The .TAP files contain blocks of tape-saved data. All blocks start with two bytes specifying how many bytes will follow (not counting the two length bytes). Then raw tape data follows, including the flag and checksum bytes.

Screen SCR format

Explicació del format de pantalla SCR i mapeig de la memòria de la pantalla:


Loading screen how to (funciona, TBD)

$ cat LOADER.TAP LOADING_SCREEN.TAP > FINAL.TAP

PASMO: ASM to TAP

Descarreguem la versió pasmo-0.5.4.beta2

$ ./configure
$ make

$ ./pasmo --name NombrePrograma --tapbas Archivo.asm Archivo.tap --public
$ ./pasmo --name PROVA --tapbas /home/joan/prova/LoadingScreen.asm /home/joan/prova/LOADING_SCREEN.TAP --public

Format SCR

Utilitat png2scr:

png2scr
This tool converts a 24 or 32 bit PNG image to ZX Spectrum SCR format.

Example (will generate image.png.scr):

$ png2scr.py image.png
You can get help with the -h flag.
$ git clone https://github.com/reidrac/png2scr.git
$ python png2scr.py example.png 
'example.png.scr' created

Image size must be 256x192

Per exportar una imatge a 32 bits amb el gimp (o imagemagick):

Loading screen

TBD:

Parteixo de què tinc un joc en format .TAP i una loading screen en format .SCR, i s'han de combinar en un fitxer .TAP.

Faré la prova amb un joc que es diu ''EscapeTCR3'' i que he trobat a:
*https://spectrumcomputing.co.uk/forums/viewtopic.php?f=9&t=1402
mkdir EscapeTCR3
cd EscapeTCR3

Tinc també el fitxer lluna.scr, que he creat a partir d'un png que he trobat a la xarxa, tal com s'explica més amunt.

script loader.bas:
10 PAPER 7 : INK 0 : PRINT AT 0,0
***20 LOAD "" SCREEN$

script LoadingScreen.asm:
org 0
incbin "lluna.scr"

LoadingScreen.asm is the assembly file which will include the loading screen you've created.

bas2tap -a10 -sLOAD loader.bas LOADER.TAP
que en el meu cas és:
$ /home/joan/bas2tap/bas2tap -a10 -sLOAD loader.bas LOADER.TAP

Ara el .asm del LoadScreen l'he de convertir a TAP:

$ pasmo --name NombrePrograma --tapbas Archivo.asm Archivo.tap --public
$ /home/joan/pasmo-0.5.4.beta2/pasmo --name EscapeTCR3 --tapbas LoadingScreen.asm LOADING_SCREEN.TAP 

i en aquests moments tinc dos fitxers TAP que hauré de combinar: LOADER.TAP i LOADING_SCREEN.TAP. Ho farem de la següent manera:

$ cat LOADER.TAP LOADING_SCREEN.TAP > EscapeTCR3.TAP

Hi ara ja puc obrir aquest fitxer amb un emulador.

$ /home/joan/zesarux/src/zesarux EscapeTCR3.TAP
o bé
cd /home/joan/zesarux/src/
$ ./zesarux /home/joan/projectes/ZX_Spectrum/EscapeTCR3/EscapeTCR3.TAP

Programació de jocs. Z88DK: Z80 Developement Kit

Per programar jocs per al spectrum Dev Tools:

Z80 Assembler

Ja ho havia treballat això en una altra banda:

Zesarux a Linux (abril 2020)

git clone https://github.com/chernandezba/zesarux.git

requirements Linux:

# GNU/Linux and other Unix systems (except Raspberry-raspbian)

- x11Checking for audio alsa ... not found
Checking for audio pulse ... not found
Checking for coreaudio ... not found
Checking for Cocoa Mac OS X GUI ... not found
Checking for sdl libraries ... not found
Checking for libsndfile ... not found

$ sudo apt-cache search alsa | grep dev

sudo apt-get update   
libao-dev - Cross Platform Audio Output Library Development
libasound2-dev - shared library for ALSA applications -- development files

libsdl1.2-dev
libsdl-sound1.2
libsdl-sound1.2-dev


$ sudo apt-cache search libsndfile
libsndfile1 - Library for reading/writing audio files
libsndfile1-dev - Development files for libsndfile; a library for reading/writing audio files

Checking for audio alsa ... found
Checking for audio pulse ... found
Checking for sdl libraries ... found
Checking for libsndfile ... found

- libpthreads
- alsa
- pulse
- no specific distribution nor kernel version is required, so it should run in all GNU/Linux machines
* GNU/Linux and other Unix systems (except Raspberry-raspbian)

    $ ./configure --enable-memptr --enable-visualmem --enable-cpustats
    $ make clean
    $ make
    $ ./zesarux
$ ./zesarux --version
ZEsarUX v.8.2-SN - xxx edition. 16 March 2020

Drivers d'àudio

L'àudio no funciona, falten els drivers

$ ./zesarux --help
ZEsarUX v.8.2-SN - xxx edition. 16 March 2020
...
--ao driver        Audio output driver. Valid drivers: dsp null
--aofile file      Also output sound to raw file
...
$ ./configure

...
Checking for audio alsa ... not found
Checking for audio pulse ... not found
Checking for coreaudio ... not found
Checking for Cocoa Mac OS X GUI ... not found
Checking for sdl libraries ... not found
Checking for libsndfile ... not found

$ sudo apt-cache search alsa | grep dev

sudo apt-get update   
libao-dev - Cross Platform Audio Output Library Development
libasound2-dev - shared library for ALSA applications -- development files

libsdl1.2-dev
libsdl-sound1.2
libsdl-sound1.2-dev

$ sudo apt-cache search libsndfile
libsndfile1 - Library for reading/writing audio files
libsndfile1-dev - Development files for libsndfile; a library for reading/writing audio files

Checking for audio alsa ... found
Checking for audio pulse ... found
Checking for sdl libraries ... found
Checking for libsndfile ... found

Ara ja tinc els drivers:

$ ./zesarux --help
...
--ao driver        Audio output driver. Valid drivers: pulse alsa sdl dsp null
--aofile file      Also output sound to wav or raw file

Les opcions amb SDL funcionen bé:

--ao sdl --vo sdl

Pantalla complerta

Podem fer servir les opcions:

--disableborder --zoom 1 --fullscreen --disablefooter --simulaterealload
  • --disableborder: si ho comento, puc veure les stripes lines del cassette, però la zona de jugar queda més petita.
  • --hidemousepointer: és més real, però es fa una mica difícil sortir de l'emulador sense el punter.

Cosetes

Estic fent una prova programant directament amb BASIC des de l'emulador. On carai són les cometes dobles?:

  • Alt-P

FBZX

A Linux s'utilitza FUSE en l'entorn gràfic, i s'ha portat a la RPi. Però fer-ho des de l'entorn gràfic no és una bona solució. Per tant, el millor és descarregar i compilar FBZX. M'ha compilat bé, però d'entrada no funciona.

Unreal Speccy Portable

Funciona! (TBD) Portable ZX-Spectrum emulator supports Z80 128K (Pentagon) AY/YM, Beeper, Beta

NOTA. Funciona amb el teclat, però no es pot portar a la RPi la simulació del teclat. El tema és que cada joc funciona amb tecles diferents i crec que no es pot configurar.

Supported formats: sna, z80, szx, rzx, tap, tzx, csw, trd, scl, fdi, zip.

https://bitbucket.org/djdron/unrealspeccyp/wiki/Home
https://bitbucket.org/djdron/unrealspeccyp/downloads
unreal-speccy-portable_0.0.43_rpi.zip
cd usp_0.0.43/

+ native GLES v2 render with indexed textures & uber-shader ;)
+ SDL for keyboard input & sound
+ files sorting in open file dialog
+ select last opened file

Note : use 50 Hz screen modes for full synchronization.
You can set it in /boot/config.txt
hdmi_group=1
hdmi_mode=19

Keys:
ESC - menu
Arrows, CTRL - joystick
F12 - reset
F7 - pause
F2 - quick save
F3 - quick load
F5 - start/stop tape

http://www.worldofspectrum.org/infoseekid.cgi?id=0003012

./unreal_speccy_portable res/rom/MANIC.TAP
./unreal_speccy_portable res/rom/Manic_Miner.tzx
funcionen correctament.

El tema està en què he utilitzat directament el binari. Puc compilar des de les fonts? Puc definir el teclat?

Per descarregar el codi font:
git clone https://bitbucket.org/djdron/unrealspeccyp.git
cd ~/unrealspeccyp/build/rpi
$ make

obtenim el mateix error que teníem compilant Gearboy:
/usr/bin/ld: Release/platform/rpi/rpi_video.o: undefined reference to symbol 'vc_dispmanx_element_add'
//opt/vc/lib/libbcm_host.so: error adding symbols: DSO missing from command line
collect2: ld returned 1 exit status

A ui/ui_list.cpp tinc una pista de com funcionen les tecles:
bool eList::OnKey(char key, dword flags)
{
        switch(key)
        {
        case 'l': Selected(selected - page_size);       return true;
        case 'r': Selected(selected + page_size);       return true;
        case 'u': Selected(selected - 1);                       return true;
        case 'd': Selected(selected + 1);                       return true;
        case 'f':
        case 'e':
        case ' ': Notify(N_SELECTED);                           return true;
        }
        return false;
}

i bàsicament el que hauré de configurar és platform/sdl/sdl_keys.cpp on estan definides les sdl_keys amb quines tecles estan mapejades.

A algú li ha passat el mateix que a mi:
http://www.raspberrypi.org/forums/viewtopic.php?f=78&t=16707&start=25
(llegir amb calma)

FUSE is using SDL for video output. It's ugly on Raspberry Pi (no vsync, no filtering, software stretching).
Unreal Speccy Portable (USP) uses GLESv2 rendering (GPU hardware accelerated features).
Please read topic from this post

build/rpi/makefile: I had to add -lbcm_host (or I received an error "undefined reference to symbol 'vc_dispmanx_element_add')

Code: Select all
    LFLAGS = -s -L$(SDKSTAGE)/opt/vc/lib -lbcm_host -lGLESv2 -lEGL `sdl-config --libs` -lz -lpng

L'únic canvi que he hagut de fer és afegir -lbcm_host
L'executable està a Release/

/home/pi/unrealspeccyp/build/rpi/Release/unreal_speccy_portable /home/pi/roms/spectrum/MANIC.TAP
funciona

mkdir /home/pi/roms
mkdir /home/pi/roms/spectrum

$ scp MANIC.TAP pi@192.168.1.37:/home/pi/roms/spectrum
$ scp Manic_Miner.tzx pi@192.168.1.37:/home/pi/roms/spectrum

Doncs ara no sé per què ja no funciona.

El problema del Spectrum és que és molt depenent de la configuració del teclat, i cada joc pot tenir una configuració diferent. Per exemple, en el Jet Pac, per començar el joc és la tecla 5, i no es pot redefinir. Per tant, està pensat per jugar amb el teclat. Tot i que el Spectrum tenia un joystick, això no vol dir que es pugui jugar sense teclat.

Per tant, encara que l'emulador està bé, emula bé, i es pot integrar en una màquina Arcade, jugar als jocs en una màquina Arcade és crec impossible.

Fuse

(TBD)

Emulador ZEsarUX (2015)

Crec que aquest emulador supera el tema de la configuració del teclat, doncs té l'opció --joystickevent que serveix per mapejar les tecles. La idea doncs seria que per cada joc mapejo les tecles que fan funcionar el joc a les tecles de la meva màquina.

Instal.lació

Existeix un binari per a Raspbian, però provaré de compilar des de les fonts: ZEsarUX_src-3.1.tar.gz

Llegim en la documentació que per a la Raspberry necessitem: On Raspberry:

  • libssl
  • libpthreads
  • alsa
  • video support is provided by Framebuffer driver (fbdev), but you can also try
./configure

(You may also enable the features:
./configure --enable-memptr --enable-visualmem --enable-cpustats
It makes the emulator use a bit more CPU power)


(On raspberry-raspbian, I recommend:
export CFLAGS=-O3
export LDFLAGS=-O3

./configure --enable-raspberry
and not enable memptr, visualmem or cpustats
)


./configure --enable-raspberry

i es genera correctament el Makefile

gcc  -O3 -Wall -Wextra -fsigned-char -c charset.c
gcc  -O3 -Wall -Wextra -fsigned-char -c scrstdout.c
gcc  -O3 -Wall -Wextra -fsigned-char -c scrsimpletext.c
gcc  -O3 -Wall -Wextra -fsigned-char -c scrcaca.c
gcc  -O3 -Wall -Wextra -fsigned-char -I/usr/X11R6/include -I/opt/X11/include -c scrxwindows.c
gcc  -O3 -Wall -Wextra -fsigned-char -c scrsdl.c
gcc  -O3 -Wall -Wextra -fsigned-char -c audiosdl.c
gcc  -O3 -Wall -Wextra -fsigned-char -c common_sdl.c
gcc  -O3 -Wall -Wextra -fsigned-char -c scrfbdev.c
gcc  -O3 -Wall -Wextra -fsigned-char -c autoselectoptions.c
gcc  -O3 -Wall -Wextra -fsigned-char -c chardetect.c
gcc  -O3 -Wall -Wextra -fsigned-char -c textspeech.c
gcc  -O3 -Wall -Wextra -fsigned-char -c scrnull.c
gcc  -O3 -Wall -Wextra -fsigned-char -c audiodsp.c
gcc  -O3 -Wall -Wextra -fsigned-char -c audioalsa.c
gcc  -O3 -Wall -Wextra -fsigned-char -c audiopulse.c
gcc  -O3 -Wall -Wextra -fsigned-char -c audionull.c
gcc  -O3 -Wall -Wextra -fsigned-char -c ay38912.c
gcc  -O3 -Wall -Wextra -fsigned-char -c cpu.c 
gcc  -O3 -Wall -Wextra -fsigned-char -c codsinpr.c
gcc  -O3 -Wall -Wextra -fsigned-char -c codprddfd.c
gcc  -O3 -Wall -Wextra -fsigned-char -c codpred.c
gcc  -O3 -Wall -Wextra -fsigned-char -c operaciones.c
gcc  -O3 -Wall -Wextra -fsigned-char -c debug.c
gcc  -O3 -Wall -Wextra -fsigned-char -c tape.c
gcc  -O3 -Wall -Wextra -fsigned-char -c tape_tap.c
gcc  -O3 -Wall -Wextra -fsigned-char -c tape_tzx.c
gcc  -O3 -Wall -Wextra -fsigned-char -c tape_smp.c
gcc  -O3 -Wall -Wextra -fsigned-char -c audio.c
gcc  -O3 -Wall -Wextra -fsigned-char -c screen.c
gcc  -O3 -Wall -Wextra -fsigned-char -c mem128.c
gcc  -O3 -Wall -Wextra -fsigned-char -c zx8081.c
gcc  -O3 -Wall -Wextra -fsigned-char -c z88.c
gcc  -O3 -Wall -Wextra -fsigned-char -c zxuno.c
gcc  -O3 -Wall -Wextra -fsigned-char -c snap.c
gcc  -O3 -Wall -Wextra -fsigned-char -c snap_z81.c
gcc  -O3 -Wall -Wextra -fsigned-char -c snap_zx8081.c
gcc  -O3 -Wall -Wextra -fsigned-char -c menu.c
gcc  -O3 -Wall -Wextra -fsigned-char -c core_spectrum.c
gcc  -O3 -Wall -Wextra -fsigned-char -c core_zx8081.c
gcc  -O3 -Wall -Wextra -fsigned-char -c core_z88.c
gcc  -O3 -Wall -Wextra -fsigned-char -c timer.c	
gcc  -O3 -Wall -Wextra -fsigned-char -c contend.c
gcc  -O3 -Wall -Wextra -fsigned-char -c disassemble.c
gcc  -O3 -Wall -Wextra -fsigned-char -c utils.c
gcc  -O3 -Wall -Wextra -fsigned-char -c playtzx.c
gcc  -O3 -Wall -Wextra -fsigned-char -c joystick.c
gcc  -O3 -Wall -Wextra -fsigned-char -c ula.c
gcc  -O3 -Wall -Wextra -fsigned-char -c mmc.c
gcc  -O3 -Wall -Wextra -fsigned-char -c divmmc.c
gcc  -O3 -Wall -Wextra -fsigned-char -c zxpand.c
gcc  -O3 -Wall -Wextra -fsigned-char -c spectra.c
gcc  -O3 -Wall -Wextra -fsigned-char -c printers.c
gcc  -O3 -Wall -Wextra -fsigned-char -c realjoystick.c
gcc  -O3 -Wall -Wextra -fsigned-char -c ulaplus.c
gcc  -O3 -Wall -Wextra -fsigned-char -c main_unix.c
gcc  -O3 -Wall -Wextra -fsigned-char cpu.o main_unix.o charset.o scrstdout.o scrsimpletext.o   scrcaca.o scrxwindows.o scrsdl.o audiosdl.o common_sdl.o scrfbdev.o autoselectoptions.o chardetect.o textspeech.o scrnull.o screen.o mem128.o audiodsp.o audioalsa.o audiopulse.o  audionull.o ay38912.o codsinpr.o codprddfd.o codpred.o operaciones.o debug.o tape.o tape_tap.o tape_tzx.o tape_smp.o audio.o zx8081.o z88.o zxuno.o snap.o snap_z81.o snap_zx8081.o menu.o core_spectrum.o core_zx8081.o core_z88.o timer.o contend.o disassemble.o utils.o playtzx.o joystick.o ula.o mmc.o divmmc.o zxpand.o spectra.o printers.o realjoystick.o ulaplus.o -o zesarux -O3 -lcaca -lSDL -lX11 -L/usr/X11R6/lib -L/opt/X11/lib -lXext -lpthread -lasound -lpulse -lpulse-simple -lpthread
$ sudo make install

Configuració

$ ./zesarux --help
Usage:
[--tape] file      Insert input standard tape file. Supported formats: Spectrum: .TAP, .TZX -- ZX80: .O, .80, .Z81 -- ZX81: .P, .81, .Z81 -- All machines: .RWA, .SMP, .WAV
[--realtape] file  Insert input real tape file. Supported formats: Spectrum: .TAP, .TZX -- ZX80: .O, .80, .Z81 -- ZX81: .P, .81, .Z81 -- All machines: .RWA, .SMP, .WAV
[--snap] file      Load snapshot file. Supported formats: Spectrum: .Z80, .ZX, .SP, .SNA -- ZX80: .ZX, .O, .80 -- ZX81: .ZX, .P, .81, .Z81
...
--vo driver        Video output driver. Valid drivers: xwindows sdl fbdev caca stdout simpletext null
...
--vofilefps n      FPS of the output video [1|2|5|10|25|50] (default:5)
...
--ao driver        Audio output driver. Valid drivers: pulse alsa sdl dsp null
...
--machine          Machine type: 
 16k    Spectrum 16k
 48k    Spectrum 48k
 Inves  Inves Spectrum+
	...

I millor:

$ ./zesarux --experthelp

on s'explica tota la configuració del teclat i joysticks. Les opcions que funcionen són aquestes:

$ ./zesarux --vo fbdev --ao alsa --machine 48k --fullscreen --quickexit --disablerealjoystick --disablefooter --nowelcomemessage --tape /home/pi/roms/zxspectrum/Chuckie_Egg.tap
$ /home/pi/ZEsarUX-3.1/zesarux --vo fbdev --ao alsa --machine 48k --fullscreen --quickexit --disablerealjoystick --disablefooter --nowelcomemessage --tape /home/pi/roms/zxspectrum/Chuckie_Egg.tap

Fixem-nos que com a video driver s'ha d'utiltizar sdl, o bé fbdev (el framebuffer directament). Al final he d'utilitzar sdl perquè les tecles del cursor no reponen bé amb fbdev. El so no és cap meravella.

Totes les opcions es poden ficar en el fitxer de configuració: .zesaruxrc

Per sortir del joc és una mica xungo: primer s'ha d'apretar F5 per entrar al menú, i després s'ha d'apretar F10 per tal de sortir de l'emulador (i per tant sortir del joc).

Adaptació al front-end joanillo_arcade_frontend

Si utilitzo el driver de video sdl, el fitxer que s'ha de tocar és el scrsdl.c, i per recompilar el projecte després de les modificacions:

gcc  -O3 -Wall -Wextra -fsigned-char -c scrsdl.c

gcc  -O3 -Wall -Wextra -fsigned-char cpu.o main_unix.o charset.o scrstdout.o scrsimpletext.o   scrcaca.o scrxwindows.o scrsdl.o audiosdl.o common_sdl.o scrfbdev.o autoselectoptions.o chardetect.o textspeech.o scrnull.o screen.o mem128.o audiodsp.o audioalsa.o audiopulse.o  audionull.o ay38912.o codsinpr.o codprddfd.o codpred.o operaciones.o debug.o tape.o tape_tap.o tape_tzx.o tape_smp.o audio.o zx8081.o z88.o zxuno.o snap.o snap_z81.o snap_zx8081.o menu.o core_spectrum.o core_zx8081.o core_z88.o timer.o contend.o disassemble.o utils.o playtzx.o joystick.o ula.o mmc.o divmmc.o zxpand.o spectra.o printers.o realjoystick.o ulaplus.o -o zesarux -O3 -lcaca -lSDL -lX11 -L/usr/X11R6/lib -L/opt/X11/lib -lXext -lpthread -lasound -lpulse -lpulse-simple -lpthread

Al final ja funciona la integració. D'una banda s'ha de modificar el fitxer scrsdl.c de manera que pugui fer un mapping entre les tecles de les meves màquines amb les tecles que s'han d'utilitzar en el joc. De fet el codi (versió 3.1) només contempla el mapping de diferents tipus de joystick als jocs. M'ha ajudat molt el César Hernández Baño, l'autor del projecte.

L'altre problema que s'ha de solucionar és que jo vull una solució que sigui vàlida per qualsevol joc. Ha d'haver-hi uns fitxers de configuració per cada joc, i quan arrenco l'emulador s'ha de llegir aquest fitxer de configuració i fer el mapping de tecles particular del joc concret.

(TBD)

Millorar el so

Sembla ser que quan migri de RPi B+ a RPi 2, el so millorarà bastant.

He modificat diferents paràmetres ALSA que hi ha a les opcions, i el frameskip, i no es nota cap millora. La idea és controlar el %de CPU, i si aconsegueixo un % de CPU baix és probable que el so s'escolti millor.

(TBD)

ROMS

Les ROMs dels 100 millors jocs els puc agafar de:

Les roms les puc renombrar. M'interessen les roms que tenen format .tap o .tzx

Tecles a les roms

El problema dels jocs de ZX Spectrum és que cada joc té una configuració de teclat diferent, i això fa que s'hagi de mapejar joc per joc.

Les instruccions d'alguns jocs es poden trobar en alguns jocs a http://www.worldofspectrum.org. En la informació del joc hi ha en alguns casos fitxers de text amb informació del joc, per ex:

Jetpac:

  • Start Game: 5
  • How Many Players?:
  • Left: Z
  • Right: X
  • Up:
  • Down:
  • But1: S (disparar)
  • But2: Q (propulsió)

Chukkie Egg:

  • Start Game: S
  • How Many Players?: 1
  • Left: 9
  • Right: 0
  • Up: 2
  • Down: W
  • But1: . (punt) o m (saltar)
  • But2:

Manic Miner:

  • Start Game: Enter
  • How Many Players?:
  • Left: o (lletra o)
  • Right: p
  • Up:
  • Down:
  • But1: Space (saltar)
  • But2:

Monty on the Run:

  • Start Game: Enter
  • How Many Players?:
  • Left: Q
  • Right: W
  • Up: Y
  • Down: H
  • But1: Space (saltar)
  • But2:

Emulador ZEsarUX (2016), versió 4.2

Instal.lació a la RPi3

Descarrego el codi font: ZEsarUX_src-4.2.tar.gz, tot i que també existeix un bin per a Raspbian.

La compilació es fa igual que en la versió anterior, i funciona sense problemes.

Configuració general

Existeix el fitxer de configuració /home/pi/.zesaruxrc. Per ex:

--vo sdl
--ao alsa
--zoomx 3
--zoomy 3
--machine 48k
--quickexit
--realvideo
--fullscreen
--hidemousepointer
--disableborder
--simulaterealloadfast 
--disablefooter
--nowelcomemessage
--disablerealjoystick
;--smartloadpath /home/pi/roms/zxspectrum

Recordem que per sortir de l'emulador podem fer F5 (menu) i F10 (Exit Simulator).

Aleshores per entrar al joc podem fer:

/home/pi/ZEsarUX-4.2/zesarux --tape /home/pi/roms/zxspectrum/Chuckie_Egg.tap
/home/pi/ZEsarUX-4.2/zesarux --snap /home/pi/roms/zxspectrum/Abusimb.z80

De moment no veig com funciona l'opció smartloadpath.

Puc utilitzar tant els video drivers --vo sdl com --vo fbdev. Ara bé, el factor d'escala per tal de què es vegi el joc a tota la pantalla és diferent. En la TV el que funciona és:

--vo sdl
--zoomx 3
--zoomy 3
--vo fbdev
--zoomx 2
--zoomy 2

però en un monitor de 19 podria ser diferent.

Per al so es pot utilitzar tant alsa com sdl, de moment no veig la diferència. Al contrari de la RPi B+, amb aquesta nova versió i RPi3 el so està força bé.

joanillo_arcade_frontend: sortir a l'emulador amb el 0

En el fitxer srcsdl.c: (faig servir SDL com a video driver) (línia 489)

void scrsdl_deal_keys(int pressrelease,int tecla)
{

        //printf ("scrsdl_deal_keys tecla: %d 0x%X pressrelease: %d\n",tecla,tecl
        //printf ("tecla: 0x%X\n",tecla);
        if (tecla == '0') end_emulator(); //'0'=48

Aquests printfs no mostren res per pantalla. Per assegurar-me de què el codi passa per aquí i de quins són els codis que pitjo, concretament left, right, up, down, fico:

FILE *ptr;
ptr=fopen("./tecles.txt","a+");
fprintf(ptr, "scrsdl_deal_keys tecla: %d 0x%X pressrelease: %d\n",tecla,tecla,pressrelease);
fprintf(ptr, "tecla: 0x%X\n",tecla);
fprintf(ptr, "\n");
fclose(ptr);

I d'aquesta manera tinc la certesa de què es detecten les tecles left, right, up, down:

SDLK_LEFT:276
SDLK_RIGHT:275
SDLK_UP:273
SDLK_DOWN:274

Fitxers de configuració. Redefinir les tecles

Aquesta és la principal novetat d'aquesta versió.

$ ./zesarux --helpcustomconfig
ZEsarUX - ZX Second-Emulator And Released for UniX
Copyright (C) 2013 Cesar Hernandez Bano

ZEsarUX Version: 4.2 Date: 5 December 2016 - Rescue on Fractalus edition

Custom config help:

Custom config files are configuration files for every program or game you want.
When you load a tape/snapshot, the emulator will search for a file, identical name of the file you load,
but adding extension .config, and it will apply every parameter contained in the file.

So, if you load for example: game.tap, it will be searched a file game.tap.config
This config file is a text file you can edit; the format is like the .zesaruxrc main configuration file,
but not every command line parameter allowed on main configuration file is allowed on a custom config file.
There are some .config files included in this emulator.
The following are the allowed parameters on a custom config file, we don't describe the parameters that are the same as on command line:

--machine id 
--programname text          Set the name of the tape/snapshot, shown on footer
--programsettingsinfo text  Set the text for settings information, shown on footer
--frameskip n
--disableborder
--enableborder              Enable border
--aychip                    Enable AY-Chip
--zx8081mem n
--zx8081ram8K2000
--zx8081ram16K8000
--zx8081ram16KC000
--zx8081vsyncsound
--realvideo
--snoweffect
--enableinterlace           Enable interlace video mode
--disableinterlace          Disable interlace video mode
--enableulaplus             Enable ULAplus video modes
--disableulaplus            Disable ULAplus video modes
--enablespectra             Enable Spectra video modes
--disablespectra            Disable Spectra video modes
--enabletimexvideo          Enable Timex video modes
--disabletimexvideo         Disable Timex video modes
--enablezgx
--wrx
--chroma81
--vsync-minimum-length n 
--no-horiz-stabilization    Disable Horizontal Stabilization
--gigascreen                Enable GigaScreen emulation
--enablezx8081lnctradjust   Enable LNCTR adjust on ZX80/81
--disablezx8081lnctradjust  Disable LNCTR adjust on ZX80/81
--redefinekey src dest
--clearredefinekey          Clear redefine key table
--joystickemulated type
--joystickevent but evt
--joystickkeybt but key
--joystickkeyev evt key
--cleareventlist

Els fitxers .config estan en el mateix directori que les roms, i a mi m'interessa bàsicament l'opció --redefinekey src dest.

El redefinekey he d'entendre bé com funciona. Per ex, en el Chuckie Egg, el saltar pot ser 'm' o '.'. La redefinició de la 'm' funciona, però amb el punt no. D'altra banda, es redefineix la tecla, però la tecla antiga encara funciona. El '9' és esquerra, que ho redefineixo per exemple a '8'.

--redefinekey 'f' 'm'
--redefinekey '8' '9'

també es pot utiltizar els codis ASCII:

--redefinekey 102 109

en comptes de 'f' i 'm'.

Per exemple, per al Chukie Egg podríem tindrem:

--machine 48k
--clearredefinekey
--redefinekey '2' 's'
--redefinekey '1' '1'
--redefinekey '9' '2'
--redefinekey '3' 'm'
--redefinekey 'j' '9'
--redefinekey 'l' '0'
--redefinekey 'i' '2'
--redefinekey 'k' 'w'

Fico el paràmetre de la màquina perquè depenent del joc utilitzaré 48k o 128k, o alguna altra.

Però de moment m'ha sigut impossible utilitzar les tecles del cursor: left, right , up, down.

Sembla ser que aquests fitxers de configuració no tenen previst utilitzar les tecles SDLK_LEFT, etc

La solució que trobo és redefinir sempre a j,l,i,k, i hardcoded faré que quan es detecta SDLK_LEFT, dispari la j, i el mateix per als altres. scrsdl.c, línia 694:

                        case SDLK_LEFT:
                                //util_set_reset_key(UTIL_KEY_LEFT,pressrelease);
                                convert_numeros_letras_puerto_teclado(106,pressrelease);
                        break;

                        case SDLK_RIGHT:
                                //util_set_reset_key(UTIL_KEY_RIGHT,pressrelease);
                                convert_numeros_letras_puerto_teclado(108,pressrelease);
                        break;

                        case SDLK_DOWN:
                                //util_set_reset_key(UTIL_KEY_DOWN,pressrelease);
                                convert_numeros_letras_puerto_teclado(107,pressrelease);
                        break;

                        case SDLK_UP:
                                //util_set_reset_key(UTIL_KEY_UP,pressrelease);
                                convert_numeros_letras_puerto_teclado(105,pressrelease);

Tecles Enter i Space

Aquestes dues tecles són especials i no es poden redefinir. He estat mirant i tocant coses en el codi però res. Això és important perquè jocs com el Manic Miner obligatòriament s'ha de fer servir el Enter. De moment ho deixo així, s'ha de fer servir el Enter per jugar al Manic Miner.

Configuració dels jocs

Jetpac

  • Start Game: 5
  • How Many Players?:
  • Left: Z
  • Right: X
  • Up:
  • Down:
  • But1: S (disparar)
  • But2: Q (propulsió)
--machine 48k
--clearredefinekey
--redefinekey '1' '5'
--redefinekey 'j' 'z'
--redefinekey 'l' 'x'
--redefinekey '4' 's'
--redefinekey '3' 'q'

Manic Miner

  • Start Game: Enter
  • How Many Players?:
  • Left: o (lletra o)
  • Right: p
  • Up:
  • Down:
  • But1: Space,Z (saltar)
  • But2:
--machine 48k
;--clearredefinekey
;--redefinekey 49 13
;--redefinekey 51 32
--redefinekey '3' 'z'
--redefinekey 'j' 'o'
--redefinekey 'l' 'p'

Abu Simbel Profanation

  • O=IZQUIERDA
  • P=DERECHA
  • Q-A=SALTAR
  • 1=Parar la acción

nota: després de Pause, utilitza el Enter per continuar la partida. Quan s'acaba la partida, només es pot tornar a començar amb Enter.

--machine 48k
--clearredefinekey
--redefinekey '1' '3'
--redefinekey 'j' 'o'
--redefinekey 'l' 'p'
--redefinekey '3' 'q'
;--redefinekey '4' '1'

Chukkie Egg

  • Start Game: S
  • How Many Players?: 1,2,3,4
  • Left: 9
  • Right: 0
  • Up: 2
  • Down: W
  • But1: . (punt) o m (saltar)
  • But2:
--machine 48k
--clearredefinekey
--redefinekey '2' 's'
--redefinekey '1' '1'
--redefinekey '9' '2'
--redefinekey '3' 'm'
--redefinekey 'j' '9'
--redefinekey 'l' '0'
--redefinekey 'i' '2'
--redefinekey 'k' 'w'

Android One

  • N: no vull instruccions
  • k: seleccionar keyboard
  • P, up. girar
  • L, left, right: caminar
  • Space, M: disparar
  • Z: defensa
--machine 48k
--clearredefinekey
--redefinekey '2' 'n'  
--redefinekey '1' 'k'
--redefinekey '3' 'p'
--redefinekey '4' 'm'
--redefinekey '5' 'z'

Arc of Yesod

  • escollir keyboard: 1
  • Left: Z, C, B, M
  • Right: X, V, N
  • Jump / Sphere up: Q to P
  • Drop smart bomb / Sphere down: A to L
  • Toggle between Sphere & Charlie: 1 to 0
--machine 48k
--clearredefinekey
--redefinekey 'j' 'x'
--redefinekey 'l' 'z'
--redefinekey '3' 'q'
--redefinekey '4' 'a'
--redefinekey '5' '6'

Army Moves


Aspar GP Master

  • 1: Practicar
  • Q: pujar
  • A: baixar
  • O: esquerra
  • P: dreta
  • Espai: frenar/embrague
--machine 48k
--clearredefinekey
--redefinekey '1' '1'  
--redefinekey 'i' 'q'
--redefinekey 'k' 'a'
--redefinekey 'l' 'p'
--redefinekey 'j' 'o'

NOTA: no se fer el SPACE

Astro Marine Corps

Tecles redefinibles

  • DISPARAR.............FUEGO
  • AVANZAR..............IZQUIERDA O DERECHA
  • AVANZAR DISPARANDO...IZQUIERDA O DERECHA CON FUEGO
  • AVANZAR DISPARANDO HACIA ARRIBA.........IZQUIERDA O DERECHA CON FUEGO Y LUEGO ARRIBA
  • DISPARAR HACIA ARRIBA...............FUEGO Y LUEGO ARRIBA
  • SALTAR...............ARRIBA
  • SALTAR HACIA ADELANTE.............IZQUIERDA O DERECHA Y ARRIBA
  • SALTAR Y DISPARAR HACIA ARRIBA.........ARRIBA Y LUEGO FUEGO
  • SALTAR Y DISPARAR HACIA ADELANTE.......IZQUIERDA O DERECHA Y ARRIBA, Y LUEGO FUEGO (soltando arriba)
  • SALTAR Y DISPARAR DIAGONAL ARRIBA......IZQUIERDA O DERECHA Y ARRIBA, Y LUEGO FUEGO
  • SALTAR Y DISPARAR DIAGONAL ABAJO.......IZQUIERDA 0 DERECHA Y ARRIBA Y LUEGO FUEGO Y ABAJO (saltando arriba )
  • AGACHARSE............ABAJO
  • AGACHARSE Y DISPARAR.ABAJO Y FUEGO

Per tant les tecles són:

  • Foc: SPACE
  • LEFT: O
  • RIGHT: P
  • UP (saltar): A
  • DOWN (ajupir-se): A
  • M: Granada
--machine 128k
--clearredefinekey
--redefinekey 'i' 'q'
--redefinekey 'k' 'a'
--redefinekey 'l' 'p'
--redefinekey 'j' 'o'
--redefinekey '3' 32
--redefinekey '4' 'm'

NOTA. No sé redefinir l'espai, la qual cosa és un problema en aquest joc.

Atic Atac

  • 0 = Start Game
  • Q = IZQUIERDA
  • W = DERECHA
  • E = ABAJO
  • R = ARRIBA
  • T = FUEGO
  • Z o SYMBOL SHIFT = COGER/TIRAR
  • CAPS SHIFT O SPACE = PAUSA
--machine 48k
--clearredefinekey
--redefinekey '1' '0'
--redefinekey 'i' 'r'
--redefinekey 'k' 'e'
--redefinekey 'l' 'w'
--redefinekey 'j' 'q'
--redefinekey '3' 't'
--redefinekey '4' 'z'

Avalon

4: escollir teclat A: up Z: down B: left M: Right H: Foc

--machine 48k
--clearredefinekey
--redefinekey '1' '4'
--redefinekey 'i' 'a'
--redefinekey 'k' 'z'
--redefinekey 'j' 'b'
--redefinekey 'l' 'm'
--redefinekey '3' 'h'

NOTA: Es necessita el Enter

Batman

  • IZQUIERDA: O, 6
  • DERECHA: P, 7
  • ARRIBA: A
  • ABAJO: Z
  • SALTO: SPACE, SYMBOL,SHIFT, M, N, B, 0
  • LLEVAR: SPACE, CAPS, SHIFT, Z, X, C, V
  • PAUSA: 1
--machine 48k
--clearredefinekey
--redefinekey 'i' 'a'
--redefinekey 'k' 'z'
--redefinekey 'j' 'o'
--redefinekey 'l' 'p'
--redefinekey '3' 'm'
--redefinekey '4' 'c'

NOTA: no sé redefinir el Enter

Bubble Bobble


Commando


Dan Dare: Pilot of the Future

Keyboard:

  • Q up
  • A down
  • O left
  • P right
  • fire...b n m Symbol-Shift Space.

Decathlon (Daley Thompson's Decathlon)


Elite

  • Left: 9
  • Right: 0 Or Kempston,
  • Up: 2 Cursor, Fuller
  • Down: W Joystick
  • Fire: Z
  • Grenade: M

Equinox

  • A = USE
  • 0 = LEFT
  • P = RIGHT
  • CAPSHIFT SPACE = RESET
  • 3 = PAUSE
  • M = FIRE
  • Q=THRUST

Everyone's a Wally


Fantasy World Dizzy


Fred


Freddy Hardest


Freddy Hardest en Manhattan Sur


Game Over!


Gauntlet


Head Over Heels


Jet Set Willy


Knight Lore


La Abadía Del Crimen


Mad Mix Game


Match Day


Narco Police


Pacman 96


Perico Delgado


Prince of Persia


Pssst


Pyjamarama


Quazatron


R-Type


Rainbow Islands


Rambo


RoboCop


Sabre Wulf


Saimazoom


Scuba Dive


Shadow of the Unicorn


Sir Fred


Skool Daze


Sokoban


Spectral Invaders


Tetris


Thanatos


The Great Escape


The Hobbit


The Way of the Exploding Fist


Three Weeks in Paradise


Tornado Low Level (TLL)


Turbo Esprit


Underwurlde


Viaje al Centro de la Tierra


Winter Games


World Cup Football