This is c128.c in view mode; [Download] [Up]
/* * c128.c * * Written by * Ettore Perazzoli (ettore@comm2000.it) * * Based on the original work in VICE 0.11.0 by * Jouko Valta (jopi@stekt.oulu.fi) * * This file is part of VICE, the Versatile Commodore Emulator. * See README for copyright notice. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA * 02111-1307 USA. * */ #include "vice.h" #include <stdio.h> #include <stdlib.h> #include "c128.h" #include "1541cpu.h" #include "attach.h" #include "autostart.h" #include "c128mem.h" #include "c128ui.h" #include "c64cia.h" #include "interrupt.h" #include "kbd.h" #include "kbdbuf.h" #include "machine.h" #include "maincpu.h" #include "mon.h" #include "patchrom.h" #include "serial.h" #include "sid.h" #include "tapeunit.h" #include "c64tpi.h" #include "traps.h" #include "true1541.h" #include "utils.h" #include "vicii.h" #include "vmachine.h" #include "vsync.h" #ifdef __MSDOS__ #include "c128kbd.h" #endif #ifdef HAVE_RS232 #include "rs232.h" #include "c64acia.h" #include "rsuser.h" #endif #ifdef HAVE_PRINTER #include "print.h" #include "prdevice.h" #include "pruser.h" #endif #ifdef HAVE_MOUSE #include "mouse.h" #endif static void vsync_hook(void); /* ------------------------------------------------------------------------- */ const char machine_name[] = "C128"; static trap_t c128_serial_traps[] = { { "SerialListen", 0xE355, 0xE5BA, {0x20, 0x73, 0xE5}, serialattention }, { "SerialSaListen", 0xE37C, 0xE5BA, {0x20, 0x73, 0xE5}, serialattention }, { "SerialSendByte", 0xE38C, 0xE5BA, {0x20, 0x73, 0xE5}, serialsendbyte }, { "SerialReceiveByte", 0xE43E, 0xE5BA, {0x20, 0x73, 0xE5}, serialreceivebyte }, { "Serial ready", 0xE569, 0xE572, {0xAD, 0x00, 0xDD}, trap_serial_ready }, { "Serial ready", 0xE4F5, 0xE572, {0xAD, 0x00, 0xDD}, trap_serial_ready }, { NULL } }; /* Tape traps. */ static trap_t c128_tape_traps[] = { { "FindHeader", 0xE8D3, 0xE8D6, {0x20, 0xF2, 0xE9}, findheader }, { "WriteHeader", 0xE96E, 0xE971, {0x20, 0x1C, 0xEA}, writeheader }, { "TapeReceive", 0xEA60, 0xEE57, {0x20, 0x9B, 0xEE}, tapereceive }, { NULL, 0, 0, {0, 0, 0}, NULL } }; /* ------------------------------------------------------------------------ */ /* C128-specific resource initialization. This is called before initializing the machine itself with `machine_init()'. */ int machine_init_resources(void) { if (traps_init_resources() < 0 || vsync_init_resources() < 0 || video_init_resources() < 0 || c128_mem_init_resources() < 0 || vic_ii_init_resources() < 0 || sound_init_resources() < 0 || sid_init_resources() < 0 #ifdef HAVE_RS232 || acia1_init_resources() < 0 || rs232_init_resources() < 0 || rsuser_init_resources() < 0 #endif #ifdef HAVE_PRINTER || print_init_resources() < 0 || prdevice_init_resources() < 0 || pruser_init_resources() < 0 #endif #ifdef HAVE_MOUSE || mouse_init_resources() < 0 #endif || kbd_init_resources() < 0 || true1541_init_resources() < 0) return -1; return 0; } /* C128-specific command-line option initialization. */ int machine_init_cmdline_options(void) { if (traps_init_cmdline_options() < 0 || vsync_init_cmdline_options() < 0 || video_init_cmdline_options() < 0 || c128_mem_init_cmdline_options() < 0 || vic_ii_init_cmdline_options() < 0 || sound_init_cmdline_options() < 0 || sid_init_cmdline_options() < 0 #ifdef HAVE_RS232 || acia1_init_cmdline_options() < 0 || rs232_init_cmdline_options() < 0 || rsuser_init_cmdline_options() < 0 #endif #ifdef HAVE_PRINTER || print_init_cmdline_options() < 0 || prdevice_init_cmdline_options() < 0 || pruser_init_cmdline_options() < 0 #endif #ifdef HAVE_MOUSE || mouse_init_cmdline_options() < 0 #endif || kbd_init_cmdline_options() < 0 || true1541_init_cmdline_options() < 0) return -1; return 0; } /* C128-specific initialization. */ int machine_init(void) { if (mem_load() < 0) return -1; printf("\nInitializing Serial Bus...\n"); /* Setup trap handling. */ traps_init(); /* Initialize serial traps. If user does not want them, or if the ``true1541'' emulation is used, do not install them. */ serial_init(c128_serial_traps); /* Initialize drives, and attach true 1541 emulation hooks to drive 8 (which is the only true 1541-capable device). */ file_system_set_hooks(8, true1541_attach_floppy, true1541_detach_floppy); file_system_init(); #ifdef HAVE_RS232 /* initialize RS232 handler */ rs232_init(); rsuser_init(); #endif #ifdef HAVE_PRINTER /* initialize print devices */ print_init(); #endif /* Initialize the tape emulation. */ tape_init(0xb2, 0x90, 0x93, 0xA09, 0, 0xc1, 0xae, c128_tape_traps, 842, 208); /* Fire up the hardware-level 1541 emulation. */ true1541_init(C128_PAL_CYCLES_PER_SEC, C128_NTSC_CYCLES_PER_SEC); /* Initialize autostart. FIXME: at least 0xa26 is only for 40 cols */ autostart_init(3 * C128_PAL_RFSH_PER_SEC * C128_PAL_CYCLES_PER_RFSH, 1, 0xa27, 0xe0, 0xec, 0xee); /* Initialize the VIC-II emulation. */ if (vic_ii_init() == NULL) return -1; vic_ii_enable_extended_keyboard_rows(1); cia1_enable_extended_keyboard_rows(1); /* Initialize the keyboard. */ #ifndef __MSDOS__ if (kbd_init() < 0) return -1; #else if (c128_kbd_init() < 0) return -1; #endif /* Initialize the monitor. */ monitor_init(&maincpu_monitor_interface, &true1541_monitor_interface); /* Initialize vsync and register our hook function. */ vsync_init(C128_PAL_RFSH_PER_SEC, C128_PAL_CYCLES_PER_SEC, vsync_hook); /* Initialize sound. Notice that this does not really open the audio device yet. */ sound_init(C128_PAL_CYCLES_PER_SEC, C128_PAL_CYCLES_PER_RFSH); /* Initialize keyboard buffer. */ kbd_buf_init(842, 208, 10, C128_PAL_CYCLES_PER_RFSH * C128_PAL_RFSH_PER_SEC); /* Initialize the C128-specific part of the UI. */ c128_ui_init(); #ifdef HAVE_MOUSE /* Initialize mouse support (if present). */ mouse_init(); #endif return 0; } /* C128-specific reset sequence. */ void machine_reset(void) { maincpu_int_status.alarm_handler[A_RASTERDRAW] = int_rasterdraw; maincpu_int_status.alarm_handler[A_RASTERFETCH] = int_rasterfetch; maincpu_int_status.alarm_handler[A_RASTER] = int_raster; maincpu_int_status.alarm_handler[A_CIA1TOD] = int_cia1tod; maincpu_int_status.alarm_handler[A_CIA1TA] = int_cia1ta; maincpu_int_status.alarm_handler[A_CIA1TB] = int_cia1tb; maincpu_int_status.alarm_handler[A_CIA2TOD] = int_cia2tod; maincpu_int_status.alarm_handler[A_CIA2TA] = int_cia2ta; maincpu_int_status.alarm_handler[A_CIA2TB] = int_cia2tb; #ifdef HAVE_RS232 maincpu_int_status.alarm_handler[A_ACIA1] = int_acia1; maincpu_int_status.alarm_handler[A_RSUSER] = int_rsuser; #endif initialize_memory(); reset_cia1(); reset_cia2(); sid_reset(); reset_tpi(); #ifdef HAVE_RS232 reset_acia1(); rs232_reset(); rsuser_reset(); #endif #ifdef HAVE_PRINTER print_reset(); #endif /* The VIC-II must be the *last* to be reset. */ reset_vic_ii(); autostart_reset(); true1541_reset(); } void machine_shutdown(void) { /* Detach all devices. */ serial_remove(-1); } /* ------------------------------------------------------------------------- */ /* This hook is called at the end of every frame. */ static void vsync_hook(void) { CLOCK sub; true1541_vsync_hook(); autostart_advance(); /* We have to make sure the number of cycles subtracted is multiple of `C128_PAL_CYCLES_PER_RFSH' here, or the VIC-II emulation could go nuts. */ sub = maincpu_prevent_clk_overflow(C128_PAL_CYCLES_PER_RFSH); if (sub > 0) { vic_ii_prevent_clk_overflow(sub); cia1_prevent_clk_overflow(sub); cia2_prevent_clk_overflow(sub); sound_prevent_clk_overflow(sub); vsync_prevent_clk_overflow(sub); } /* The 1541 has to deal both with our overflowing and its own one, so it is called even when there is no overflowing in the main CPU. */ true1541_prevent_clk_overflow(sub); #ifdef HAS_JOYSTICK joystick(); #endif } int machine_set_restore_key(int v) { maincpu_set_nmi(I_RESTORE, v?1:0); return 1; }
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.