/* * voicebox.c - Emulation of the Alien Group Voice Box I and II * * Copyright (C) 2010 Atari800 development team (see DOC/CREDITS) * * This file is part of the Atari800 emulator project which emulates * the Atari 400, 800, 800XL, 130XE, and 5200 8-bit computers. * * Atari800 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. * * Atari800 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 Atari800; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include #include #include #include "voicebox.h" #include "atari.h" #include "votraxsnd.h" #include "pokey.h" #include "log.h" #include "pia.h" int VOICEBOX_enabled = FALSE; int VOICEBOX_ii = FALSE; int VOICEBOX_Initialise(int *argc, char *argv[]) { int i, j; for (i = j = 1; i < *argc; i++) { if (strcmp(argv[i], "-voicebox") == 0) { VOICEBOX_enabled = TRUE; VOICEBOX_ii = FALSE; } else if (strcmp(argv[i], "-voiceboxii") == 0){ VOICEBOX_enabled = TRUE; VOICEBOX_ii = TRUE; } else { if (strcmp(argv[i], "-help") == 0) { Log_print("\t-voicebox Emulate the Alien Group Voice Box I"); Log_print("\t-voiceboxii Emulate the Alien Group Voice Box II"); } argv[j++] = argv[i]; } } *argc = j; return TRUE; } /* For Voice Box I */ void VOICEBOX_SKCTLPutByte(int byte) { static int prev_byte; static int prev_prev_byte; static int voice_box_byte; static int voice_box_bit; if (!VOICEBOX_enabled || VOICEBOX_ii) return; if (PIA_PACTL&0x08) return; /* Cassette motor line must be on */ #ifdef DEBUG_VOICEBOX printf ("SKCTL: %2x\n",byte); #endif if (prev_prev_byte == 0xf7 && prev_byte == 0x03 && (byte == 0xff || byte == 0x03)) { if (byte != 0x03) { voice_box_byte += (1<< (7-voice_box_bit)); } voice_box_bit++; if (voice_box_bit > 7 ) { voice_box_bit = 0; #ifdef DEBUG_VOICEBOX printf("VOICE BOX BYTE: %02X\n",voice_box_byte); #endif VOTRAXSND_PutByte(voice_box_byte); voice_box_byte = 0; } } prev_prev_byte = prev_byte; prev_byte = byte; } /* For Voice Box II */ void VOICEBOX_SEROUTPutByte(int byte) { if (!VOICEBOX_enabled || !VOICEBOX_ii) return; if (PIA_PACTL&0x08) return; /* Cassette motor line must be on */ if ((POKEY_SKCTL & 0x70) == 0x60 ) { int byte_swapped = 0; int i; for (i=0;i<8;i++) { byte_swapped += ((!!(byte&(1<