Emulador ZX Spectrum
Contingut
- 1 Introducció
- 2 Zesarux a Linux (abril 2020)
- 3 FBZX
- 4 Unreal Speccy Portable
- 5 Fuse
- 6 Emulador ZEsarUX (2015)
- 7 Emulador ZEsarUX (2016), versió 4.2
- 8 Configuració general
- 8.1 joanillo_arcade_frontend: sortir a l'emulador amb el 0
- 8.2 Fitxers de configuració. Redefinir les tecles
- 8.3 Configuració dels jocs
- 8.3.1 Jetpac
- 8.3.2 Manic Miner
- 8.3.3 Abu Simbel Profanation
- 8.3.4 Chukkie Egg
- 8.3.5 Android One
- 8.3.6 Arc of Yesod
- 8.3.7 Army Moves
- 8.3.8 Aspar GP Master
- 8.3.9 Astro Marine Corps
- 8.3.10 Atic Atac
- 8.3.11 Avalon
- 8.3.12 Batman
- 8.3.13 Bubble Bobble
- 8.3.14 Commando
- 8.3.15 Dan Dare: Pilot of the Future
- 8.3.16 Decathlon (Daley Thompson's Decathlon)
- 8.3.17 Elite
- 8.3.18 Equinox
- 8.3.19 Everyone's a Wally
- 8.3.20 Fantasy World Dizzy
- 8.3.21 Fred
- 8.3.22 Freddy Hardest
- 8.3.23 Freddy Hardest en Manhattan Sur
- 8.3.24 Game Over!
- 8.3.25 Gauntlet
- 8.3.26 Head Over Heels
- 8.3.27 Jet Set Willy
- 8.3.28 Knight Lore
- 8.3.29 La Abadía Del Crimen
- 8.3.30 Mad Mix Game
- 8.3.31 Match Day
- 8.3.32 Narco Police
- 8.3.33 Pacman 96
- 8.3.34 Perico Delgado
- 8.3.35 Prince of Persia
- 8.3.36 Pssst
- 8.3.37 Pyjamarama
- 8.3.38 Quazatron
- 8.3.39 R-Type
- 8.3.40 Rainbow Islands
- 8.3.41 Rambo
- 8.3.42 RoboCop
- 8.3.43 Sabre Wulf
- 8.3.44 Saimazoom
- 8.3.45 Scuba Dive
- 8.3.46 Shadow of the Unicorn
- 8.3.47 Sir Fred
- 8.3.48 Skool Daze
- 8.3.49 Sokoban
- 8.3.50 Spectral Invaders
- 8.3.51 Tetris
- 8.3.52 Thanatos
- 8.3.53 The Great Escape
- 8.3.54 The Hobbit
- 8.3.55 The Way of the Exploding Fist
- 8.3.56 Three Weeks in Paradise
- 8.3.57 Tornado Low Level (TLL)
- 8.3.58 Turbo Esprit
- 8.3.59 Underwurlde
- 8.3.60 Viaje al Centro de la Tierra
- 8.3.61 Winter Games
- 8.3.62 World Cup Football
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
- http://little-shop-of-pixels.blogspot.com/2012/02/making-of-spectrum-loading-screen-part2.html
- https://www.usebox.net/jjm/zxdev/
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:
- https://shred.zone/cilla/page/388/zx-spectrum-retro-game-programming.html
- https://chuntey.wordpress.com/2013/10/02/how-to-write-zx-spectrum-games-chapter-18/
- https://chuntey.wordpress.com/2012/12/18/how-to-write-zx-spectrum-games-chapter-1/
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
- http://www.rastersoft.com/fbzx.html#download_section
- http://www.raspberrypi.org/forums/viewtopic.php?f=78&t=24910
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)
- https://www.raspberrypi.org/forums/viewtopic.php?f=78&t=99864
- http://sourceforge.net/projects/zesarux/
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:
- http://www.worldofspectrum.org/bestgames.html
- http://doperoms.com/toproms.php?system=sinclair%20zx%20spectrum
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