Commodore 64 (VICE)

De wikijoan
Salta a la navegació Salta a la cerca

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)

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
Remap keys vice.png

Llista de jocs

En format TAP:

I en format D64 (roms), millor:

Creo la carpeta roms/c64

Els millors jocs:

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