annotate src/console/Ay_Emu.cxx @ 3024:965c0df4ae84

Patch from John Lindgren to skip corrupted frames, from Debian bug #514674.
author Tony Vroon <chainsaw@gentoo.org>
date Thu, 09 Apr 2009 23:58:13 +0100
parents 5abb9030e8a7
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
341
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 316
diff changeset
1 // Game_Music_Emu 0.5.2. http://www.slack.net/~ant/
316
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
2
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
3 #include "Ay_Emu.h"
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
4
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
5 #include "blargg_endian.h"
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
6 #include <string.h>
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
7
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
8 /* Copyright (C) 2006 Shay Green. This module is free software; you
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
9 can redistribute it and/or modify it under the terms of the GNU Lesser
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
10 General Public License as published by the Free Software Foundation; either
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
11 version 2.1 of the License, or (at your option) any later version. This
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
12 module is distributed in the hope that it will be useful, but WITHOUT ANY
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
14 FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
15 details. You should have received a copy of the GNU Lesser General Public
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
16 License along with this module; if not, write to the Free Software Foundation,
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
17 Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
18
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
19 #include "blargg_source.h"
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
20
341
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 316
diff changeset
21 long const spectrum_clock = 3546900;
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 316
diff changeset
22 long const cpc_clock = 2000000;
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 316
diff changeset
23
316
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
24 unsigned const ram_start = 0x4000;
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
25 int const osc_count = Ay_Apu::osc_count + 1;
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
26
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
27 Ay_Emu::Ay_Emu()
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
28 {
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
29 beeper_output = 0;
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
30 set_type( gme_ay_type );
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
31
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
32 static const char* const names [osc_count] = {
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
33 "Wave 1", "Wave 2", "Wave 3", "Beeper"
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
34 };
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
35 set_voice_names( names );
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
36
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
37 static int const types [osc_count] = {
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
38 wave_type | 0, wave_type | 1, wave_type | 2, mixed_type | 0
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
39 };
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
40 set_voice_types( types );
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
41 set_silence_lookahead( 6 );
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
42 }
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
43
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
44 Ay_Emu::~Ay_Emu() { }
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
45
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
46 // Track info
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
47
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
48 static byte const* get_data( Ay_Emu::file_t const& file, byte const* ptr, int min_size )
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
49 {
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
50 long pos = ptr - (byte const*) file.header;
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
51 long file_size = file.end - (byte const*) file.header;
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
52 assert( (unsigned long) pos <= (unsigned long) file_size - 2 );
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
53 int offset = (BOOST::int16_t) get_be16( ptr );
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
54 if ( !offset || blargg_ulong (pos + offset) > blargg_ulong (file_size - min_size) )
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
55 return 0;
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
56 return ptr + offset;
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
57 }
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
58
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
59 static blargg_err_t parse_header( byte const* in, long size, Ay_Emu::file_t* out )
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
60 {
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
61 typedef Ay_Emu::header_t header_t;
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
62 out->header = (header_t const*) in;
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
63 out->end = in + size;
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
64
341
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 316
diff changeset
65 if ( size < Ay_Emu::header_size )
316
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
66 return gme_wrong_file_type;
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
67
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
68 header_t const& h = *(header_t const*) in;
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
69 if ( memcmp( h.tag, "ZXAYEMUL", 8 ) )
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
70 return gme_wrong_file_type;
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
71
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
72 out->tracks = get_data( *out, h.track_info, (h.max_track + 1) * 4 );
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
73 if ( !out->tracks )
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
74 return "Missing track data";
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
75
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
76 return 0;
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
77 }
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
78
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
79 static void copy_ay_fields( Ay_Emu::file_t const& file, track_info_t* out, int track )
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
80 {
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
81 Gme_File::copy_field_( out->song, (char const*) get_data( file, file.tracks + track * 4, 1 ) );
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
82 byte const* track_info = get_data( file, file.tracks + track * 4 + 2, 6 );
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
83 if ( track_info )
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
84 out->length = get_be16( track_info + 4 ) * (1000L / 50); // frames to msec
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
85
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
86 Gme_File::copy_field_( out->author, (char const*) get_data( file, file.header->author, 1 ) );
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
87 Gme_File::copy_field_( out->comment, (char const*) get_data( file, file.header->comment, 1 ) );
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
88 }
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
89
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
90 blargg_err_t Ay_Emu::track_info_( track_info_t* out, int track ) const
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
91 {
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
92 copy_ay_fields( file, out, track );
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
93 return 0;
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
94 }
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
95
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
96 struct Ay_File : Gme_Info_
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
97 {
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
98 Ay_Emu::file_t file;
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
99
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
100 Ay_File() { set_type( gme_ay_type ); }
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
101
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
102 blargg_err_t load_mem_( byte const* begin, long size )
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
103 {
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
104 RETURN_ERR( parse_header( begin, size, &file ) );
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
105 set_track_count( file.header->max_track + 1 );
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
106 return 0;
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
107 }
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
108
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
109 blargg_err_t track_info_( track_info_t* out, int track ) const
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
110 {
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
111 copy_ay_fields( file, out, track );
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
112 return 0;
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
113 }
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
114 };
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
115
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
116 static Music_Emu* new_ay_emu () { return BLARGG_NEW Ay_Emu ; }
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
117 static Music_Emu* new_ay_file() { return BLARGG_NEW Ay_File; }
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
118
2004
5abb9030e8a7 Hush down some warnings.
Eugene Paskevich <eugene@raptor.kiev.ua>
parents: 341
diff changeset
119 gme_type_t_ const gme_ay_type [1] = {{ "ZX Spectrum", 0, &new_ay_emu, &new_ay_file, "AY", 1 }};
316
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
120
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
121 // Setup
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
122
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
123 blargg_err_t Ay_Emu::load_mem_( byte const* in, long size )
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
124 {
341
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 316
diff changeset
125 assert( offsetof (header_t,track_info [2]) == header_size );
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 316
diff changeset
126
316
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
127 RETURN_ERR( parse_header( in, size, &file ) );
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
128 set_track_count( file.header->max_track + 1 );
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
129
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
130 if ( file.header->vers > 2 )
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
131 set_warning( "Unknown file version" );
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
132
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
133 set_voice_count( osc_count );
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
134 apu.volume( gain() );
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
135
341
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 316
diff changeset
136 return setup_buffer( spectrum_clock );
316
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
137 }
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
138
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
139 void Ay_Emu::update_eq( blip_eq_t const& eq )
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
140 {
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
141 apu.treble_eq( eq );
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
142 }
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
143
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
144 void Ay_Emu::set_voice( int i, Blip_Buffer* center, Blip_Buffer*, Blip_Buffer* )
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
145 {
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
146 if ( i >= Ay_Apu::osc_count )
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
147 beeper_output = center;
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
148 else
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
149 apu.osc_output( i, center );
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
150 }
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
151
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
152 // Emulation
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
153
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
154 void Ay_Emu::set_tempo_( double t )
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
155 {
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
156 play_period = blip_time_t (clock_rate() / 50 / t);
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
157 }
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
158
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
159 blargg_err_t Ay_Emu::start_track_( int track )
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
160 {
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
161 RETURN_ERR( Classic_Emu::start_track_( track ) );
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
162
341
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 316
diff changeset
163 memset( mem.ram + 0x0000, 0xC9, 0x100 ); // fill RST vectors with RET
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 316
diff changeset
164 memset( mem.ram + 0x0100, 0xFF, 0x4000 - 0x100 );
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 316
diff changeset
165 memset( mem.ram + ram_start, 0x00, sizeof mem.ram - ram_start );
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 316
diff changeset
166 memset( mem.padding1, 0xFF, sizeof mem.padding1 );
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 316
diff changeset
167 memset( mem.ram + 0x10000, 0xFF, sizeof mem.ram - 0x10000 );
316
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
168
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
169 // locate data blocks
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
170 byte const* const data = get_data( file, file.tracks + track * 4 + 2, 14 );
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
171 if ( !data ) return "File data missing";
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
172
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
173 byte const* const more_data = get_data( file, data + 10, 6 );
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
174 if ( !more_data ) return "File data missing";
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
175
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
176 byte const* blocks = get_data( file, data + 12, 8 );
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
177 if ( !blocks ) return "File data missing";
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
178
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
179 // initial addresses
341
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 316
diff changeset
180 cpu::reset( mem.ram );
316
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
181 r.sp = get_be16( more_data );
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
182 r.b.a = r.b.b = r.b.d = r.b.h = data [8];
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
183 r.b.flags = r.b.c = r.b.e = r.b.l = data [9];
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
184 r.alt.w = r.w;
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
185 r.ix = r.iy = r.w.hl;
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
186
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
187 unsigned addr = get_be16( blocks );
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
188 if ( !addr ) return "File data missing";
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
189
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
190 unsigned init = get_be16( more_data + 2 );
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
191 if ( !init )
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
192 init = addr;
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
193
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
194 // copy blocks into memory
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
195 do
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
196 {
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
197 blocks += 2;
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
198 unsigned len = get_be16( blocks ); blocks += 2;
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
199 if ( addr + len > 0x10000 )
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
200 {
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
201 set_warning( "Bad data block size" );
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
202 len = 0x10000 - addr;
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
203 }
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
204 check( len );
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
205 byte const* in = get_data( file, blocks, 0 ); blocks += 2;
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
206 if ( len > blargg_ulong (file.end - in) )
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
207 {
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
208 set_warning( "Missing file data" );
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
209 len = file.end - in;
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
210 }
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
211 //dprintf( "addr: $%04X, len: $%04X\n", addr, len );
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
212 if ( addr < ram_start && addr >= 0x400 ) // several tracks use low data
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
213 dprintf( "Block addr in ROM\n" );
341
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 316
diff changeset
214 memcpy( mem.ram + addr, in, len );
316
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
215
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
216 if ( file.end - blocks < 8 )
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
217 {
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
218 set_warning( "Missing file data" );
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
219 break;
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
220 }
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
221 }
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
222 while ( (addr = get_be16( blocks )) != 0 );
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
223
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
224 // copy and configure driver
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
225 static byte const passive [] = {
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
226 0xF3, // DI
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
227 0xCD, 0, 0, // CALL init
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
228 0xED, 0x5E, // LOOP: IM 2
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
229 0xFB, // EI
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
230 0x76, // HALT
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
231 0x18, 0xFA // JR LOOP
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
232 };
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
233 static byte const active [] = {
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
234 0xF3, // DI
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
235 0xCD, 0, 0, // CALL init
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
236 0xED, 0x56, // LOOP: IM 1
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
237 0xFB, // EI
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
238 0x76, // HALT
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
239 0xCD, 0, 0, // CALL play
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
240 0x18, 0xF7 // JR LOOP
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
241 };
341
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 316
diff changeset
242 memcpy( mem.ram, passive, sizeof passive );
316
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
243 unsigned play_addr = get_be16( more_data + 4 );
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
244 //dprintf( "Play: $%04X\n", play_addr );
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
245 if ( play_addr )
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
246 {
341
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 316
diff changeset
247 memcpy( mem.ram, active, sizeof active );
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 316
diff changeset
248 mem.ram [ 9] = play_addr;
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 316
diff changeset
249 mem.ram [10] = play_addr >> 8;
316
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
250 }
341
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 316
diff changeset
251 mem.ram [2] = init;
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 316
diff changeset
252 mem.ram [3] = init >> 8;
316
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
253
341
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 316
diff changeset
254 mem.ram [0x38] = 0xFB; // Put EI at interrupt vector (followed by RET)
316
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
255
341
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 316
diff changeset
256 memcpy( mem.ram + 0x10000, mem.ram, 0x80 ); // some code wraps around (ugh)
316
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
257
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
258 beeper_delta = int (apu.amp_range * 0.65);
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
259 last_beeper = 0;
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
260 apu.reset();
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
261 next_play = play_period;
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
262
341
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 316
diff changeset
263 // start at spectrum speed
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 316
diff changeset
264 change_clock_rate( spectrum_clock );
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 316
diff changeset
265 set_tempo( tempo() );
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 316
diff changeset
266
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 316
diff changeset
267 spectrum_mode = false;
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 316
diff changeset
268 cpc_mode = false;
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 316
diff changeset
269 cpc_latch = 0;
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 316
diff changeset
270
316
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
271 return 0;
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
272 }
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
273
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
274 // Emulation
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
275
341
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 316
diff changeset
276 void Ay_Emu::cpu_out_misc( cpu_time_t time, unsigned addr, int data )
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 316
diff changeset
277 {
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 316
diff changeset
278 if ( !cpc_mode )
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 316
diff changeset
279 {
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 316
diff changeset
280 switch ( addr & 0xFEFF )
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 316
diff changeset
281 {
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 316
diff changeset
282 case 0xFEFD:
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 316
diff changeset
283 spectrum_mode = true;
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 316
diff changeset
284 apu_addr = data & 0x0F;
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 316
diff changeset
285 return;
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 316
diff changeset
286
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 316
diff changeset
287 case 0xBEFD:
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 316
diff changeset
288 spectrum_mode = true;
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 316
diff changeset
289 apu.write( time, apu_addr, data );
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 316
diff changeset
290 return;
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 316
diff changeset
291 }
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 316
diff changeset
292 }
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 316
diff changeset
293
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 316
diff changeset
294 if ( !spectrum_mode )
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 316
diff changeset
295 {
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 316
diff changeset
296 switch ( addr >> 8 )
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 316
diff changeset
297 {
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 316
diff changeset
298 case 0xF6:
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 316
diff changeset
299 switch ( data & 0xC0 )
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 316
diff changeset
300 {
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 316
diff changeset
301 case 0xC0:
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 316
diff changeset
302 apu_addr = cpc_latch & 0x0F;
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 316
diff changeset
303 goto enable_cpc;
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 316
diff changeset
304
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 316
diff changeset
305 case 0x80:
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 316
diff changeset
306 apu.write( time, apu_addr, cpc_latch );
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 316
diff changeset
307 goto enable_cpc;
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 316
diff changeset
308 }
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 316
diff changeset
309 break;
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 316
diff changeset
310
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 316
diff changeset
311 case 0xF4:
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 316
diff changeset
312 cpc_latch = data;
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 316
diff changeset
313 goto enable_cpc;
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 316
diff changeset
314 }
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 316
diff changeset
315 }
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 316
diff changeset
316
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 316
diff changeset
317 dprintf( "Unmapped OUT: $%04X <- $%02X\n", addr, data );
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 316
diff changeset
318 return;
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 316
diff changeset
319
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 316
diff changeset
320 enable_cpc:
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 316
diff changeset
321 if ( !cpc_mode )
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 316
diff changeset
322 {
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 316
diff changeset
323 cpc_mode = true;
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 316
diff changeset
324 change_clock_rate( cpc_clock );
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 316
diff changeset
325 set_tempo( tempo() );
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 316
diff changeset
326 }
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 316
diff changeset
327 }
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 316
diff changeset
328
316
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
329 void ay_cpu_out( Ay_Cpu* cpu, cpu_time_t time, unsigned addr, int data )
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
330 {
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
331 Ay_Emu& emu = STATIC_CAST(Ay_Emu&,*cpu);
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
332
341
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 316
diff changeset
333 if ( (addr & 0xFF) == 0xFE && !emu.cpc_mode )
316
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
334 {
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
335 int delta = emu.beeper_delta;
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
336 data &= 0x10;
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
337 if ( emu.last_beeper != data )
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
338 {
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
339 emu.last_beeper = data;
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
340 emu.beeper_delta = -delta;
341
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 316
diff changeset
341 emu.spectrum_mode = true;
316
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
342 if ( emu.beeper_output )
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
343 emu.apu.synth_.offset( time, delta, emu.beeper_output );
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
344 }
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
345 }
341
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 316
diff changeset
346 else
316
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
347 {
341
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 316
diff changeset
348 emu.cpu_out_misc( time, addr, data );
316
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
349 }
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
350 }
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
351
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
352 int ay_cpu_in( Ay_Cpu*, unsigned addr )
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
353 {
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
354 // keyboard read and other things
341
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 316
diff changeset
355 if ( (addr & 0xFF) == 0xFE )
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 316
diff changeset
356 return 0xFF; // other values break some beeper tunes
316
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
357
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
358 dprintf( "Unmapped IN : $%04X\n", addr );
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
359 return 0xFF;
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
360 }
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
361
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
362 blargg_err_t Ay_Emu::run_clocks( blip_time_t& duration, int )
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
363 {
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
364 set_time( 0 );
341
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 316
diff changeset
365 if ( !(spectrum_mode | cpc_mode) )
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 316
diff changeset
366 duration /= 2; // until mode is set, leave room for halved clock rate
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 316
diff changeset
367
316
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
368 while ( time() < duration )
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
369 {
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
370 cpu::run( min( duration, next_play ) );
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
371
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
372 if ( time() >= next_play )
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
373 {
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
374 next_play += play_period;
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
375
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
376 if ( r.iff1 )
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
377 {
341
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 316
diff changeset
378 if ( mem.ram [r.pc] == 0x76 )
316
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
379 r.pc++;
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
380
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
381 r.iff1 = r.iff2 = 0;
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
382
341
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 316
diff changeset
383 mem.ram [--r.sp] = r.pc >> 8;
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 316
diff changeset
384 mem.ram [--r.sp] = r.pc;
316
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
385 r.pc = 0x38;
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
386 cpu::adjust_time( 12 );
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
387 if ( r.im == 2 )
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
388 {
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
389 cpu::adjust_time( 6 );
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
390 unsigned addr = r.i * 0x100u + 0xFF;
341
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 316
diff changeset
391 r.pc = mem.ram [(addr + 1) & 0xFFFF] * 0x100u + mem.ram [addr];
316
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
392 }
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
393 }
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
394 }
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
395 }
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
396 duration = time();
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
397 next_play -= duration;
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
398 check( next_play >= 0 );
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
399 adjust_time( -duration );
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
400
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
401 apu.end_frame( duration );
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
402
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
403 return 0;
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents:
diff changeset
404 }