Commodore 64 (VICE)
Contingut
Introducció
Vice - the Versatile Commodore Emulator
Petita història de Commodore:
Manual d'usuari (pdf):
Instal.lació
NOTA. Ho he instal.lat a la RPi3 sense problemes. En canvi, a la RPi B+ he tingut problemes en la compilació.
- 31 March 2017. Version 3.1 released (no hi ha canvis importants respecte la versió 3.0 que em puguin afectar)
descarrego: vice-3.1.tar.gz
Segueixo també:
Prerequisits:
sudo apt-get update $ sudo apt-get install libice-dev -> ja ho tenia $ sudo apt-get install libreadline-dev $ sudo apt-get install libsdl1.2-dev -> ja ho tenia $ sudo apt-get install libxt-dev $ sudo apt-get install libxmu-dev $ sudo apt-get install libxaw7-dev $ sudo apt-get install libx11-dev -> ha fet alguna modificació
També:
$ sudo apt-get install byacc $ sudo apt-get install flex $ tar xvzf vice-3.1.tar.gz $ cd vice-3.1/ ./configure --enable-sdlui --with-sdlsound -with-x=no prefereixo fer-ho amb ./configure --enable-sdlui --with-alsa -with-x=no $ make $ sudo make install
Hi ha varis executables, però a mi m'interessa l'emulador del Commodore 64:
$ x64
F12 és per accedir al menu de l'emulador.
Un cop arrenca l'emulador tinc el prompt igual que tenia en el Commodore 64. Per exenmple, puc escriure Basic en la línia de comandes:
10 PRINT "HOLA MON" RUN HOLA MON
Configuració
Tutorial bàsic de com configurar el VICE per carregar un joc:
Opcions que necessitaré:
-sounddev alsa
In order to enlarge the screen go to the Options menu and select the Double Size option
A mi m'interessa que un joc es pugui carregar automàticament:
Aquestes són les principals opcions que em poden interessar:
$ x64 --help ...-config <filename> Specify config file -autostart <Name> Attach and autostart tape/disk image <name> -1 <Name> Attach <name> as a tape image -directory <Path> Define search path to locate system files -menukey <key> Keycode of the menu activate key -menukeyup <key> Keycode of the menu up key -menukeydown <key> Keycode of the menu down key -menukeyleft <key> Keycode of the menu left key -menukeyright <key> Keycode of the menu right key -menukeyselect <key> Keycode of the menu select key -menukeycancel <key> Keycode of the menu cancel key -menukeyexit <key> Keycode of the menu exit key -menukeymap <key> Keycode of the menu map key -confirmonexit Enable confirm on exit +confirmonexit Disable confirm on exit -nativemonitor Enable native monitor +nativemonitor Disable native monitor -keymap <number> Specify index of keymap file (0=symbolic, 1=positional, 2=symbolic (user), 3=positional (user)) -keyboardmapping <number> Specify host keyboard layout -keyboardtype <number> Specify emulated keyboard type -symkeymap <Name> Specify name of symbolic keymap file -poskeymap <Name> Specify name of positional keymap file -sdlglfilter <mode> Set OpenGL filtering mode (0 = nearest, 1 = linear) -pal Use PAL sync factor -model <Model> Set C64 model (c64/c64c/c64old, ntsc/newntsc/oldntsc, drean, jap, c64gs, pet64, ultimax) -keyset Enable keyset +keyset Disable keyset -hotkeyfile <name> Specify name of hotkey file -eventstartmode <Mode> Set event start mode (0: file save, 1: file load, 2: reset, 3: playback) ...
És interessant veure la barra de Status (F12 > Status) per tal de veure la velocitat. És correcte que surti 100% i 50fps. En el menú puc escollir una velocitat més ràpida per a la càrrega d'un joc. (200% o no-limit, que significa el màxim)
Configuració que funciona
important: El so anava fatal fins que he trobat: disable resid sound emulation by choosing fastsid as your sid chip model "machine settings->model settings->SID settings->SID model->6581 (FastSID) this will give you a huge performance boost. Do not enable double size or enable a render filter for games that need a lot of CPU time ( but it is off default )
Aquesta opció en línia de comanda és:
-sidenginemodel <engine and model> Specify SID engine and model (0: FastSID 6581, 1: FastSID 8580, 256: ReSID 6581, 257: ReSID 8580, 258: ReSID 8580 + digiboost) -sidenginemodel 0
c64/set_joan.cfg
/usr/local/bin/x64 -sounddev alsa -sdlbitdepth 8 -sidenginemodel 0 -config /home/pi/roms/c64/set_joan.cfg -autostart /home/pi/roms/c64/1942.d64 /usr/local/bin/x64 -config /home/pi/roms/c64/set_joan.cfg -autostart /home/pi/roms/c64/1942.d64
Si el fitxer de configuració està ben configurat, no calen altres opcions. En qualsevol cas, les opcions que fiqui en línia de comandes passen per sobre de les que hi pugui haver en el fitxer de configuració.
El fitxer de configuració c64/set_joan.cfg, en el menú em deixa redefinir keymap1 i keymap2, i associar els joysticks als keymaps. Ara ho tinc amb left, right, up, down i 3 (Fire), i l'altre J,L,I,K i A (fire). Hi ha jocs (com el 1942) que per defecte utilitzen keymap2.
SidEngine=0 SidModel=0 KeySet1North=273 KeySet1East=275 KeySet1South=274 KeySet1West=276 KeySet1Fire=51 KeySet2North=105 KeySet2East=108 KeySet2South=107 KeySet2West=106 KeySet2Fire=97 KeySet2Y=97 KeySet2N=97
Load "*",8,1
Aquesta és la comanda que fem servir per carregar un programa en memòria.
LOAD "*",8,1
The general syntax is:
LOAD ["<filename>"[, <device number>[, <secondary number>]]]
- The filename * means the first file on the the disk
- The first number parameter is a device number. 8 is the device number for the first disk drive. From the Wikipedia article on Commodore DOS. By convention, the first disk drive unit on a system has device number 8, the second drive, if present, 9, etc., up to a maximum of 15. This seems to come from the IEEE-488 bus, which the Commodore PET used.
- The second number parameter, in this case 1, means to load the stored program into memory, starting at the memory location specified by the first two bytes in the file you are loading. This is generally used for machine language programs. 0, by contrast, is the default value, and would load the stored program to $0801 (the beginning of BASIC memory)
Si fico els dos punts (:) significa fer RUN un cop s'ha carregat en memòria:
LOAD "*",8,1:
Sortir amb el '0'
Ha costat una mica aquesta vegada.
En el VICE, per sortir de l'emulador primer hem de fer F12 per entrar en el menú principal, aleshores escollir Quit Emulator, i Enter. En el Retropie així és com ho fan, tenint en compte que es pot mapejar la tecla F12 a una altra tecla.
La idea és associar el 0 com a tecla per entrar al menú UI, i captar el codi que s'executa quan entrem en el menú, i allà provocar la sortida del programa. Es fa de la següent manera:
Select – Settings Management Select – Define UI Keys (compte!, perquè aquesta opció queda amagada a sota, no es veuen totes les opcions) Select – Activate Menu -> ho canvio pel 0
I gravo els meus settings a un fitxer de settings. En el fitxer de configuració (set_joan.cfg de moment) queda l'entrada:
MenuKey=48
on el 48 és la tecla 0.
I ara del que es tracta és d'aconseguir que quan obri el menu, en realitat faci un shutdown de l'aplicació.
cerquem per F12 dins els fitxers:
cd ~/vice-3.1/src/
$ find . -type f -print | xargs egrep -i F12 | more
...
./arch/sdl/ui.c:
./arch/sdl/kbd.c: { 293, SDLK_F12 },
./arch/sdl/ui.c, línia 596:
void ui_sdl_quit(void) -> aquesta serà la funció per finalitzar el programa
{
if (confirm_on_exit) {
if (message_box("VICE QUESTION", "Do you really want to exit?", MESSAGE_YESNO) != 0) {
return;
}
}
ui.c, línia 733
void ui_shutdown(void) -> funciona quan sortim del menú, però no del programa
{
printf("FINAL.......\n");
DBG(("%s", __func__));
sdl_ui_file_selection_dialog_shutdown();
}
El directori que m'interessa és arch/sdl. El directori arch/unix fa referència a Linux amb les X. Però jo des de l Quan faig canvis en el directori arch/sdl he de recompilar, però si faig make i sudo make install triga molt. Per recompilar s'ha de fer:
cd ~/vice-3.1/src cd arch/sdl/ make cd ../.. #en comptes de fer make en el directori src/ faig (només vull actualitzar l'aplicatiu x64): g++ -g -O3 -Wstrict-prototypes -Wall -W -Wno-unused-parameter -Wno-missing-field-initializers -Wno-sign-compare -I/usr/include/SDL -D_GNU_SOURCE=1 -D_REENTRANT -Wl,-rpath -Wl,/usr/local/lib/vice/lib -o x64 alarm.o attach.o autostart.o autostart-prg.o cbmdos.o cbmimage.o charset.o clipboard.o clkguard.o cmdline.o color.o crc32.o datasette.o debug.o dma.o embedded.o event.o findpath.o fliplist.o gcr.o info.o init.o initcmdline.o interrupt.o ioutil.o kbdbuf.o keyboard.o lib.o libm_math.o log.o machine-bus.o machine.o main.o network.o opencbmlib.o palette.o ram.o rawfile.o rawnet.o resources.o romset.o screenshot.o snapshot.o socket.o sound.o sysfile.o translate.o traps.o util.o vicefeatures.o vsync.o zfile.o zipcode.o midi.o ../src/tapeport/libtapeport.a ../src/c64/libc64.a ../src/tapeport/libtapeport.a ../src/c64/cart/libc64cartsystem.a ../src/c64/cart/libc64cart.a ../src/c64/cart/libc64commoncart.a ../src/drive/iec/libdriveiec.a ../src/drive/iecieee/libdriveiecieee.a ../src/drive/iec/c64exp/libdriveiecc64exp.a ../src/drive/ieee/libdriveieee.a ../src/drive/libdrive.a ../src/drive/tcbm/libdrivetcbm.a ../src/iecbus/libiecbus.a ../src/lib/p64/libp64.a ../src/parallel/libparallel.a ../src/vdrive/libvdrive.a ../src/sid/libsid.a ../src/monitor/libmonitor.a ../src/joyport/libjoyport.a ../src/samplerdrv/libsamplerdrv.a ../src/sounddrv/libsounddrv.a ../src/mididrv/libmididrv.a ../src/socketdrv/libsocketdrv.a ../src/hwsiddrv/libhwsiddrv.a ../src/iodrv/libiodrv.a ../src/gfxoutputdrv/libgfxoutputdrv.a ../src/printerdrv/libprinterdrv.a ../src/rs232drv/librs232drv.a ../src/diskimage/libdiskimage.a ../src/fsdevice/libfsdevice.a ../src/tape/libtape.a ../src/fileio/libfileio.a ../src/serial/libserial.a ../src/core/libcore.a ../src/vicii/libvicii.a ../src/raster/libraster.a ../src/userport/libuserport.a ../src/diag/libdiag.a ../src/rtc/librtc.a ../src/video/libvideo.a ../src/arch/sdl/libarch.a ../src/imagecontents/libimagecontents.a ../src/resid/libresid.a ../src/platform/libplatform.a -lpulse-simple -lpulse -lasound -ljpeg -lpng -lz -ldl ../src/arch/sdl/libarch.a -lnsl -lreadline -lvorbisenc -lvorbisfile -lvorbis -logg -lm -ldl -L/usr/lib/arm-linux-gnueabihf -lSDL -lGL -lSDLmain -lSDL -lvorbisfile -logg -lvorbis -lvorbisenc ls -la x64 #per comprovar la data de creació del binari cd arch/sdl/
i compte perquè sense fer sudo make install, l'executable que val està a ~/vice-3.1/src/x64.
Els principals fitxers candidats dins del directori arch/sdl on he de mirar per capturar quan entro dins el menú principal són:
- ui.c
- kbd.c
- uimenu.c
- x64_ui.c
- menu_common.c
- menu_settings.c
Per ex, codi que he mirat:
x64_ui.c:
{ "Quit emulator",
MENU_ENTRY_OTHER,
quit_callback,
NULL },
SDL_MENU_LIST_END
};
void c64ui_shutdown(void)
{
uikeyboard_menu_shutdown();
uisid_menu_shutdown();
uicart_menu_shutdown();
uipalette_menu_shutdown();
uijoyport_menu_shutdown();
./menu_common.h:extern UI_MENU_CALLBACK(quit_callback);
./menu_common.c:UI_MENU_CALLBACK(quit_callback)
menu_common.c:
UI_MENU_CALLBACK(quit_callback)
{
if (activated) {
ui_sdl_quit();
}
return NULL;
}
ui.c:
switch (e.type) {
case SDL_QUIT:
DBG(("ui_handle_misc_sdl_event: SDL_QUIT"));
ui_sdl_quit();
break;
ui.c:
void ui_sdl_quit(void)
{
if (confirm_on_exit) {
if (message_box("VICE QUESTION", "Do you really want to exit?", MESSAGE_YESNO) != 0) {
return;
}
}
x64_ui.c:
static const ui_menu_entry_t x64_main_menu[] = {
{ "Autostart image",
MENU_ENTRY_DIALOG,
autostart_callback,
NULL },
...
{ "Help",
MENU_ENTRY_SUBMENU,
submenu_callback,
(ui_callback_data_t)help_menu },
{ "Settings management",
MENU_ENTRY_SUBMENU,
submenu_callback,
(ui_callback_data_t)settings_manager_menu },
{ "Quit emulator",
MENU_ENTRY_OTHER,
quit_callback,
NULL },
SDL_MENU_LIST_END
};
x64_ui.c:
int c64ui_init(void)
{
#ifdef SDL_DEBUG
fprintf(stderr, "%s\n", __func__);
#endif
sdl_ui_set_menu_params = NULL;
uijoyport_menu_create(1, 1, 1, 1, 0);
uisampler_menu_create();
uicart_menu_create();
uidrive_menu_create();
uikeyboard_menu_create();
uipalette_menu_create("VICII", NULL);
uisid_menu_create();
uiclockport_rr_mmc_menu_create();
uiclockport_ide64_menu_create();
uimedia_menu_create();
sdl_ui_set_main_menu(x64_main_menu);
sdl_ui_set_menu_font(mem_chargen_rom + 0x800, 8, 8);
sdl_vkbd_set_vkbd(&vkbd_c64);
#ifdef HAVE_FFMPEG
sdl_menu_ffmpeg_init();
#endif
return 0;
}
He mirat tots aquests fitxers amb deteniment, posant punts de control, i no me n'en sortia. També he mirat dins el directori src/ alguns fitxers com ara event.c, init.c, interrupt.c, però tampoc ho aconseguia.
Com que estic en un punt difícil, torno a compilar, fent: --enable-debug per tal de què em doni més pistes, i efectivament això ha sigut providencial:
./configure --enable-debug --enable-sdlui --with-alsa -with-x=no make sudo make install
una possible solució cutre és:
Select – Settings Management Select – Define UI Keys (compte!, perquè aquesta opció queda amagada a sota, no es veuen totes les opcions) Select – Activate Menu -> ho canvio pel 0 Select – Return -> ficar el 1, que és una de les tecles que faig servir
I aleshores puc fer exit amb 0, els cursors, i 1.
Però la solució bona és la següent. Com que he compilat amb --enable-debug, veig que quan acaba el programa surt un missatge:
uimenu.c:377: Warning: Memory bluimenu.c:377: Warning: Memory block(s) allocated here was not free'd (Memory le callstack: uimenu.c:173: Warning: Memory block(s) allocated here was not free'd (Memory le callstack: attach.c:518: ock(s) allocated here was not free'd (Memory le callstack:
El fitxer uimenu.c ja me l'havia mirat molt, però no mirava en el lloc correcte. Fico un control en la línia 373, i efectivament veig que es printa quan entro en el menú. Per tant, és aquí on provoco la sortida de l'aplicació x64:
uimenu.c, línia 373:
static void sdl_ui_trap(WORD addr, void *data)
{
//printf("sortim\n\n");
ui_sdl_quit();
trap significa precisament això, atrapar l'event del teclat. I torno a compilar tal com he fet més amunt.
Resum per sortir amb el '0'
$ cd ~/vice-3.1/src/arch/sdl
Editar uimenu.c, línia 373:
static void sdl_ui_trap(WORD addr, void *data)
{
//printf("sortim\n\n");
ui_sdl_quit();
make cd ../.. #en comptes de fer make en el directori src/ faig (només vull actualitzar l'aplicatiu x64): g++ -g -O3 -Wstrict-prototypes -Wall -W -Wno-unused-parameter -Wno-missing-field-initializers -Wno-sign-compare -I/usr/include/SDL -D_GNU_SOURCE=1 -D_REENTRANT -Wl,-rpath -Wl,/usr/local/lib/vice/lib -o x64 alarm.o attach.o autostart.o autostart-prg.o cbmdos.o cbmimage.o charset.o clipboard.o clkguard.o cmdline.o color.o crc32.o datasette.o debug.o dma.o embedded.o event.o findpath.o fliplist.o gcr.o info.o init.o initcmdline.o interrupt.o ioutil.o kbdbuf.o keyboard.o lib.o libm_math.o log.o machine-bus.o machine.o main.o network.o opencbmlib.o palette.o ram.o rawfile.o rawnet.o resources.o romset.o screenshot.o snapshot.o socket.o sound.o sysfile.o translate.o traps.o util.o vicefeatures.o vsync.o zfile.o zipcode.o midi.o ../src/tapeport/libtapeport.a ../src/c64/libc64.a ../src/tapeport/libtapeport.a ../src/c64/cart/libc64cartsystem.a ../src/c64/cart/libc64cart.a ../src/c64/cart/libc64commoncart.a ../src/drive/iec/libdriveiec.a ../src/drive/iecieee/libdriveiecieee.a ../src/drive/iec/c64exp/libdriveiecc64exp.a ../src/drive/ieee/libdriveieee.a ../src/drive/libdrive.a ../src/drive/tcbm/libdrivetcbm.a ../src/iecbus/libiecbus.a ../src/lib/p64/libp64.a ../src/parallel/libparallel.a ../src/vdrive/libvdrive.a ../src/sid/libsid.a ../src/monitor/libmonitor.a ../src/joyport/libjoyport.a ../src/samplerdrv/libsamplerdrv.a ../src/sounddrv/libsounddrv.a ../src/mididrv/libmididrv.a ../src/socketdrv/libsocketdrv.a ../src/hwsiddrv/libhwsiddrv.a ../src/iodrv/libiodrv.a ../src/gfxoutputdrv/libgfxoutputdrv.a ../src/printerdrv/libprinterdrv.a ../src/rs232drv/librs232drv.a ../src/diskimage/libdiskimage.a ../src/fsdevice/libfsdevice.a ../src/tape/libtape.a ../src/fileio/libfileio.a ../src/serial/libserial.a ../src/core/libcore.a ../src/vicii/libvicii.a ../src/raster/libraster.a ../src/userport/libuserport.a ../src/diag/libdiag.a ../src/rtc/librtc.a ../src/video/libvideo.a ../src/arch/sdl/libarch.a ../src/imagecontents/libimagecontents.a ../src/resid/libresid.a ../src/platform/libplatform.a -lpulse-simple -lpulse -lasound -ljpeg -lpng -lz -ldl ../src/arch/sdl/libarch.a -lnsl -lreadline -lvorbisenc -lvorbisfile -lvorbis -logg -lm -ldl -L/usr/lib/arm-linux-gnueabihf -lSDL -lGL -lSDLmain -lSDL -lvorbisfile -logg -lvorbis -lvorbisenc ls -la x64 #per comprovar la data de creació del binari sudo make install
Ara ja tinc el binari x64 modificat a /usr/local/bin.
Remapejar les tecles (TBD)
- Molts jocs utilitzen Y, N and capslock (run/stop), i s'haurien de remapejar.
- https://wpguru.co.uk/2014/09/how-to-map-your-commodore-keyboard-in-vice-2-4/
- http://vice-emu.pokefinder.org/index.php/Keymaps
Opcions línia de comanda:
-keymap <number> Specify index of keymap file (0=symbolic, 1=positional, 2=symbolic (user), 3=positional (user)) -keyboardmapping <number> Specify host keyboard layout -keyboardtype <number> Specify emulated keyboard type -symkeymap <Name> Specify name of symbolic keymap file
- https://wiki.libsdl.org/SDLKeycodeLookup
- https://i0.wp.com/wpguru.co.uk/wp-content/uploads/2014/09/Screen-Shot-2014-09-01-at-15.34.50.png
Llista de jocs
En format TAP:
I en format D64 (roms), millor:
Creo la carpeta roms/c64
Els millors jocs:
- http://www.lemon64.com/games/votes_list.php
- https://www.retrogamer.net/top_10/top-ten-commodore-64-games/
1942 Airborne Ranger Alter Ego: Male Version Alternate Reality II: The Dungeon Archon: The Light and the Dark Armalyte Ballblazer Barbarian: The Ultimate Warrior Bard's Tale II, The: The Destiny Knight Bard's Tale III, The: Thief of Fate Bard's Tale, The: Tales of the Unknown Barry McGuigan World Championship Boxing Beach-Head II: The Dictator Strikes Back Boulder Dash Boulder Dash Construction Kit Boulder Dash II: Rockford's Revenge Bruce Lee Bubble Bobble Buggy Boy California Games Champions of Krynn Crazy Comets Creatures Creatures 2: Torture Trouble Curse of the Azure Bonds Defender of the Crown Detective Game, The Dino Eggs Dropzone Elite Emlyn Hughes International Soccer Encounter Enforcer: Fullmetal Megablaster Exile Fort Apocalypse Ghostbusters Grand Prix Circuit Great Giana Sisters, The Gunship H.E.R.O. - Helicopter Emergency Rescue Operation Head Over Heels Heart of Africa Heavy Metal Paradroid IK+ Impossible Mission International Karate Jumpman Katakis Laser Squad Last Ninja 2 Last Ninja, The Leaderboard Executive Leaderboard Golf Legacy of the Ancients Lode Runner Lords of Midnight M.U.L.E. Mad Doctor Maniac Mansion Mayhem in Monsterland Mercenary: Escape from Targ MicroProse Soccer Midnight Resistance Montezuma's Revenge MYTH: History in the Making Neuromancer Newcomer Paradroid Pirates! Pitstop II Pool of Radiance Prince of Persia Project Firestart Project Stealth Fighter Racing Destruction Set Raid on Bungeling Bay Rainbow Islands Realm of Impossibility Rescue on Fractalus Rodland Samurai Warrior: The Battles of Usagi Yojimbo Sentinel, The Seven Cities of Gold Silent Service Skate or Die! Space Taxi Spy vs Spy Street Rod Stunt Car Racer Summer Games Summer Games 2 Supremacy Times of Lore Train, The: Escape to Normandy Turrican Turrican II: The Final Fight Ultima III: Exodus Ultima IV: Quest of the Avatar Ultima V: Warriors of Destiny Uridium Wasteland Way of the Exploding Fist, The Winter Games Wizard of Wor Wizball World Class Leader Board World Games Zak McKracken and the Alien Mindbenders
creat per Joan Quintana Compte, maig 2017