annotate Plugins/Input/console/Nes_Cpu.cpp @ 334:0daaddb10914 trunk

[svn] Implement GYM playback.
author chainsaw
date Sun, 25 Dec 2005 13:31:46 -0800
parents 252843aac42f
children 7c5e886205ef
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
90
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
1
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
2 // Game_Music_Emu 0.2.4. http://www.slack.net/~ant/libs/
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
3
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
4 #include "Nes_Cpu.h"
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
5
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
6 #include <limits.h>
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
7
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
8 #include "blargg_endian.h"
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
9
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
10 /* Copyright (C) 2003-2005 Shay Green. This module is free software; you
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
11 can redistribute it and/or modify it under the terms of the GNU Lesser
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
12 General Public License as published by the Free Software Foundation; either
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
13 version 2.1 of the License, or (at your option) any later version. This
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
14 module is distributed in the hope that it will be useful, but WITHOUT ANY
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
15 WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
16 FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
17 more details. You should have received a copy of the GNU Lesser General
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
18 Public License along with this module; if not, write to the Free Software
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
19 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
20
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
21 #include BLARGG_SOURCE_BEGIN
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
22
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
23 // Common instructions:
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
24 // 7.40% D0 BNE
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
25 // 6.05% F0 BEQ
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
26 // 5.46% BD LDA abs,X
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
27 // 4.44% C8 INY
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
28 // 4.32% 85 STA zp
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
29 // 4.29% C9 CMP imm
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
30 // 3.74% 20 JSR
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
31 // 3.66% 60 RTS
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
32 // 3.23% 8D STA abs
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
33 // 3.02% AD LDA abs
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
34
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
35 #ifndef NES_CPU_FIXED_CYCLES
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
36 #define NES_CPU_FIXED_CYCLES 0
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
37 #endif
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
38
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
39 static void write_unmapped( Nsf_Emu*, nes_addr_t, int )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
40 {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
41 check( false );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
42 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
43
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
44 static int read_unmapped( Nsf_Emu*, nes_addr_t )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
45 {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
46 check( false );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
47 return 0;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
48 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
49
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
50 Nes_Cpu::Nes_Cpu()
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
51 {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
52 callback_data = NULL;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
53 data_writer [page_count] = write_unmapped;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
54 data_reader [page_count] = read_unmapped;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
55 reset();
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
56 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
57
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
58 void Nes_Cpu::reset( const void* unmapped_code_page )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
59 {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
60 r.status = 0;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
61 r.sp = 0;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
62 r.pc = 0;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
63 r.a = 0;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
64 r.x = 0;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
65 r.y = 0;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
66
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
67 cycle_count = 0;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
68 base_time = 0;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
69 #if NES_CPU_IRQ_SUPPORT
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
70 cycle_limit = 0;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
71 #endif
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
72
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
73 for ( int i = 0; i < page_count + 1; i++ )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
74 code_map [i] = (uint8_t*) unmapped_code_page;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
75
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
76 map_memory( 0, 0x10000, read_unmapped, write_unmapped );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
77 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
78
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
79 void Nes_Cpu::map_code( nes_addr_t start, unsigned long size, const void* data )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
80 {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
81 // start end end must fall on page bounadries
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
82 require( start % page_size == 0 && size % page_size == 0 );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
83
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
84 unsigned first_page = start / page_size;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
85 for ( unsigned i = size / page_size; i--; )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
86 code_map [first_page + i] = (uint8_t*) data + i * page_size;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
87 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
88
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
89 void Nes_Cpu::map_memory( nes_addr_t start, unsigned long size, reader_t read, writer_t write )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
90 {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
91 // start end end must fall on page bounadries
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
92 require( start % page_size == 0 && size % page_size == 0 );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
93
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
94 if ( !read )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
95 read = read_unmapped;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
96 if ( !write )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
97 write = write_unmapped;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
98 unsigned first_page = start / page_size;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
99 for ( unsigned i = size / page_size; i--; ) {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
100 data_reader [first_page + i] = read;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
101 data_writer [first_page + i] = write;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
102 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
103 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
104
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
105 // Note: 'addr' is evaulated more than once in some of the macros, so it
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
106 // must not contain side-effects.
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
107
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
108 #define LOW_MEM( a ) (low_mem [int (a)])
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
109
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
110 #define READ( addr ) (data_reader [(addr) >> page_bits]( callback_data, addr ))
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
111 #define WRITE( addr, data ) (data_writer [(addr) >> page_bits]( callback_data, addr, data ))
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
112
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
113 #define READ_PROG( addr ) (code_map [(addr) >> page_bits] [(addr) & (page_size - 1)])
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
114 #define READ_PROG16( addr ) GET_LE16( &READ_PROG( addr ) )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
115
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
116 #define PUSH( v ) (*--sp = (v))
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
117 #define POP() (*sp++)
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
118
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
119 int Nes_Cpu::read( nes_addr_t addr ) {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
120 return READ( addr );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
121 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
122
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
123 void Nes_Cpu::write( nes_addr_t addr, int value ) {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
124 WRITE( addr, value );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
125 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
126
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
127 #ifndef NES_CPU_GLUE_ONLY
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
128
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
129 static const unsigned char cycle_table [256] = {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
130 7,6,2,8,3,3,5,5,3,2,2,2,4,4,6,6,
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
131 2,5,2,8,4,4,6,6,2,4,2,7,4,4,7,7,
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
132 6,6,2,8,3,3,5,5,4,2,2,2,4,4,6,6,
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
133 2,5,2,8,4,4,6,6,2,4,2,7,4,4,7,7,
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
134 6,6,2,8,3,3,5,5,3,2,2,2,3,4,6,6,
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
135 2,5,2,8,4,4,6,6,2,4,2,7,4,4,7,7,
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
136 6,6,2,8,3,3,5,5,4,2,2,2,5,4,6,6,
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
137 2,5,2,8,4,4,6,6,2,4,2,7,4,4,7,7,
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
138 2,6,2,6,3,3,3,3,2,2,2,2,4,4,4,4,
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
139 2,6,2,6,4,4,4,4,2,5,2,5,5,5,5,5,
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
140 2,6,2,6,3,3,3,3,2,2,2,2,4,4,4,4,
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
141 2,5,2,5,4,4,4,4,2,4,2,4,4,4,4,4,
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
142 2,6,2,8,3,3,5,5,2,2,2,2,4,4,6,6,
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
143 2,5,2,8,4,4,6,6,2,4,2,7,4,4,7,7,
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
144 2,6,3,8,3,3,5,5,2,2,2,2,4,4,6,6,
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
145 2,5,2,8,4,4,6,6,2,4,2,7,4,4,7,7
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
146 };
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
147
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
148 #include BLARGG_ENABLE_OPTIMIZER
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
149
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
150 // on machines with relatively few registers:
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
151 // use local temporaries (if no function calls) over all other variables
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
152 // these are most likely to be in registers, so use them over others if possible:
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
153 // pc
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
154 // nz (so calculate with nz first, then assign to other variable if necessary)
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
155 // data
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
156 // this
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
157 Nes_Cpu::result_t Nes_Cpu::run( nes_time_t end )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
158 {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
159 #if NES_CPU_IRQ_SUPPORT
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
160 end_time( end );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
161 #else
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
162 cycle_count -= (end - base_time);
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
163 base_time = end;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
164 #endif
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
165
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
166 result_t result = result_cycles;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
167
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
168 #if BLARGG_CPU_POWERPC
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
169 // cache commonly-used values in registers
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
170 long cycle_count = this->cycle_count;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
171 writer_t* const data_writer = this->data_writer;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
172 reader_t* const data_reader = this->data_reader;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
173 uint8_t* const low_mem = this->low_mem;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
174 #endif
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
175
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
176 // stack pointer is kept one greater than usual 6502 stack pointer
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
177 #define SET_SP( v ) (sp = low_mem + 0x101 + (v))
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
178 #define GET_SP() (sp - 0x101 - low_mem)
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
179 uint8_t* sp;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
180 SET_SP( r.sp );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
181
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
182 // registers
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
183 unsigned pc = r.pc;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
184 int a = r.a;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
185 int x = r.x;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
186 int y = r.y;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
187
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
188 // status flags
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
189
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
190 #define IS_NEG (int ((nz + 0x800) | (nz << (CHAR_BIT * sizeof (int) - 8))) < 0)
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
191
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
192 const int st_n = 0x80;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
193 const int st_v = 0x40;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
194 const int st_r = 0x20;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
195 const int st_b = 0x10;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
196 const int st_d = 0x08;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
197 const int st_i = 0x04;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
198 const int st_z = 0x02;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
199 const int st_c = 0x01;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
200
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
201 #define CALC_STATUS( out ) do { \
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
202 out = status & ~(st_n | st_z | st_c); \
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
203 out |= (c >> 8) & st_c; \
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
204 if ( IS_NEG ) out |= st_n; \
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
205 if ( (nz & 0xFF) == 0 ) out |= st_z; \
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
206 } while ( false )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
207
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
208 #define SET_STATUS( in ) do { \
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
209 status = in & ~(st_n | st_z | st_c | st_b | st_r); \
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
210 c = in << 8; \
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
211 nz = in << 4; \
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
212 nz &= 0x820; \
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
213 nz ^= ~0xDF; \
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
214 } while ( false )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
215
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
216 uint8_t status;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
217 int c; // store C as 'c' & 0x100.
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
218 int nz; // store Z as 'nz' & 0xFF == 0. see above for encoding of N.
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
219 {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
220 int temp = r.status;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
221 SET_STATUS( temp );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
222 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
223
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
224 goto loop;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
225
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
226 unsigned data;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
227
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
228 branch_taken: {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
229 unsigned old_pc = pc;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
230 pc += (BOOST::int8_t) data;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
231 if ( !NES_CPU_FIXED_CYCLES )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
232 cycle_count += 1 + (((old_pc ^ (pc + 1)) >> 8) & 1);
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
233 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
234 inc_pc_loop:
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
235 pc++;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
236 loop:
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
237
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
238 check( (unsigned) pc < 0x10000 );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
239 check( (unsigned) GET_SP() < 0x100 );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
240 check( (unsigned) a < 0x100 );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
241 check( (unsigned) x < 0x100 );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
242 check( (unsigned) y < 0x100 );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
243
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
244 // Read opcode and first operand. Optimize if processor's byte order is known
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
245 // and non-portable constructs are allowed.
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
246 #if BLARGG_NONPORTABLE && BLARGG_BIG_ENDIAN
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
247 data = *(BOOST::uint16_t*) &READ_PROG( pc );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
248 pc++;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
249 unsigned opcode = data >> 8;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
250 data = (uint8_t) data;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
251
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
252 #elif BLARGG_NONPORTABLE && BLARGG_LITTLE_ENDIAN
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
253 data = *(BOOST::uint16_t*) &READ_PROG( pc );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
254 pc++;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
255 unsigned opcode = (uint8_t) data;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
256 data >>= 8;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
257
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
258 #else
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
259 unsigned opcode = READ_PROG( pc );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
260 pc++;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
261 data = READ_PROG( pc );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
262
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
263 #endif
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
264
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
265 if ( cycle_count >= cycle_limit )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
266 goto stop;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
267
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
268 cycle_count += NES_CPU_FIXED_CYCLES ? NES_CPU_FIXED_CYCLES : cycle_table [opcode];
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
269
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
270 #if BLARGG_CPU_POWERPC
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
271 this->cycle_count = cycle_count;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
272 #endif
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
273
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
274 switch ( opcode )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
275 {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
276 #define ADD_PAGE (pc++, data += 0x100 * READ_PROG( pc ));
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
277 #define GET_ADDR() READ_PROG16( pc )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
278
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
279 #if NES_CPU_FIXED_CYCLES
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
280 #define HANDLE_PAGE_CROSSING( lsb )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
281 #else
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
282 #define HANDLE_PAGE_CROSSING( lsb ) cycle_count += (lsb) >> 8;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
283 #endif
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
284
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
285 #define INC_DEC_XY( reg, n ) \
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
286 reg = uint8_t (nz = reg + n); \
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
287 goto loop;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
288
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
289 #define IND_Y { \
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
290 int temp = LOW_MEM( data ) + y; \
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
291 data = temp + 0x100 * LOW_MEM( uint8_t (data + 1) ); \
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
292 HANDLE_PAGE_CROSSING( temp ); \
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
293 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
294
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
295 #define IND_X { \
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
296 int temp = data + x; \
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
297 data = LOW_MEM( uint8_t (temp) ) + 0x100 * LOW_MEM( uint8_t (temp + 1) ); \
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
298 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
299
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
300 #define ARITH_ADDR_MODES( op ) \
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
301 case op - 0x04: /* (ind,x) */ \
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
302 IND_X \
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
303 goto ptr##op; \
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
304 case op + 0x0C: /* (ind),y */ \
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
305 IND_Y \
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
306 goto ptr##op; \
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
307 case op + 0x10: /* zp,X */ \
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
308 data = uint8_t (data + x); \
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
309 case op + 0x00: /* zp */ \
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
310 data = LOW_MEM( data ); \
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
311 goto imm##op; \
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
312 case op + 0x14: /* abs,Y */ \
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
313 data += y; \
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
314 goto ind##op; \
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
315 case op + 0x18: /* abs,X */ \
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
316 data += x; \
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
317 ind##op: \
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
318 HANDLE_PAGE_CROSSING( data ); \
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
319 case op + 0x08: /* abs */ \
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
320 ADD_PAGE \
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
321 ptr##op: \
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
322 data = READ( data ); \
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
323 case op + 0x04: /* imm */ \
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
324 imm##op: \
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
325
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
326 // Often-Used
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
327
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
328 case 0xD0: // BNE
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
329 if ( (uint8_t) nz )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
330 goto branch_taken;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
331 goto inc_pc_loop;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
332
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
333 case 0xF0: // BEQ
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
334 if ( !(uint8_t) nz )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
335 goto branch_taken;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
336 goto inc_pc_loop;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
337
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
338 case 0xBD: // LDA abs,X
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
339 data += x;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
340 lda_ind_common:
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
341 HANDLE_PAGE_CROSSING( data );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
342 case 0xAD: // LDA abs
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
343 ADD_PAGE
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
344 lda_ptr:
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
345 nz = a = READ( data );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
346 goto inc_pc_loop;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
347
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
348 case 0xC8: INC_DEC_XY( y, 1 ) // INY
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
349
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
350 case 0x95: // STA zp,x
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
351 data = uint8_t (data + x);
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
352 case 0x85: // STA zp
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
353 LOW_MEM( data ) = a;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
354 goto inc_pc_loop;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
355
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
356 ARITH_ADDR_MODES( 0xC5 ) // CMP
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
357 nz = a - data;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
358 compare_common:
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
359 c = ~nz;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
360 goto inc_pc_loop;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
361
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
362 case 0x4C: // JMP abs
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
363 pc++;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
364 goto jmp_common;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
365
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
366 case 0x20: // JSR
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
367 pc++;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
368 PUSH( pc >> 8 );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
369 PUSH( pc );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
370 jmp_common:
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
371 pc = data + 0x100 * READ_PROG( pc );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
372 goto loop;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
373
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
374 case 0x60: // RTS
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
375 // often-used instruction
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
376 pc = POP();
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
377 pc += 0x100 * POP();
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
378 goto inc_pc_loop;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
379
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
380 case 0x9D: // STA abs,X
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
381 data += x;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
382 sta_ind_common:
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
383 HANDLE_PAGE_CROSSING( data );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
384 case 0x8D: // STA abs
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
385 ADD_PAGE
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
386 sta_ptr:
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
387 WRITE( data, a );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
388 goto inc_pc_loop;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
389
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
390 case 0xB5: // LDA zp,x
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
391 data = uint8_t (data + x);
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
392 case 0xA5: // LDA zp
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
393 data = LOW_MEM( data );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
394 case 0xA9: // LDA #imm
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
395 a = nz = data;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
396 goto inc_pc_loop;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
397
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
398 case 0xA8: // TAY
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
399 y = a;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
400 case 0x98: // TYA
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
401 a = nz = y;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
402 goto loop;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
403
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
404 // Branch
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
405
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
406 #define BRANCH( cond ) \
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
407 if ( cond ) \
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
408 goto branch_taken; \
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
409 goto inc_pc_loop;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
410
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
411 case 0x50: // BVC
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
412 BRANCH( !(status & st_v) )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
413
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
414 case 0x70: // BVS
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
415 BRANCH( status & st_v )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
416
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
417 case 0xB0: // BCS
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
418 BRANCH( c & 0x100 )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
419
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
420 case 0x90: // BCC
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
421 BRANCH( !(c & 0x100) )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
422
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
423 case 0x10: // BPL
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
424 BRANCH( !IS_NEG )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
425
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
426 case 0x30: // BMI
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
427 BRANCH( IS_NEG )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
428
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
429 // Load/store
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
430
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
431 case 0x94: // STY zp,x
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
432 data = uint8_t (data + x);
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
433 case 0x84: // STY zp
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
434 LOW_MEM( data ) = y;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
435 goto inc_pc_loop;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
436
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
437 case 0x96: // STX zp,y
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
438 data = uint8_t (data + y);
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
439 case 0x86: // STX zp
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
440 LOW_MEM( data ) = x;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
441 goto inc_pc_loop;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
442
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
443 case 0xB6: // LDX zp,y
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
444 data = uint8_t (data + y);
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
445 case 0xA6: // LDX zp
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
446 data = LOW_MEM( data );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
447 case 0xA2: // LDX imm
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
448 x = data;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
449 nz = data;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
450 goto inc_pc_loop;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
451
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
452 case 0xB4: // LDY zp,x
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
453 data = uint8_t (data + x);
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
454 case 0xA4: // LDY zp
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
455 data = LOW_MEM( data );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
456 case 0xA0: // LDY imm
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
457 y = data;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
458 nz = data;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
459 goto inc_pc_loop;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
460
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
461 case 0xB1: // LDA (ind),Y
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
462 IND_Y
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
463 goto lda_ptr;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
464
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
465 case 0xA1: // LDA (ind,X)
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
466 IND_X
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
467 goto lda_ptr;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
468
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
469 case 0xB9: // LDA abs,Y
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
470 data += y;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
471 goto lda_ind_common;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
472
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
473 case 0x91: // STA (ind),Y
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
474 IND_Y
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
475 goto sta_ptr;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
476
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
477 case 0x81: // STA (ind,X)
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
478 IND_X
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
479 goto sta_ptr;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
480
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
481 case 0x99: // STA abs,Y
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
482 data += y;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
483 goto sta_ind_common;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
484
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
485 case 0xBC: // LDY abs,X
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
486 data += x;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
487 HANDLE_PAGE_CROSSING( data );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
488 case 0xAC:{// LDY abs
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
489 pc++;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
490 unsigned addr = data + 0x100 * READ_PROG( pc );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
491 y = nz = READ( addr );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
492 goto inc_pc_loop;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
493 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
494
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
495 case 0xBE: // LDX abs,y
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
496 data += y;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
497 HANDLE_PAGE_CROSSING( data );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
498 case 0xAE:{// LDX abs
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
499 pc++;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
500 unsigned addr = data + 0x100 * READ_PROG( pc );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
501 x = nz = READ( addr );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
502 goto inc_pc_loop;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
503 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
504
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
505 {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
506 int temp;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
507 case 0x8C: // STY abs
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
508 temp = y;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
509 goto store_abs;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
510
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
511 case 0x8E: // STX abs
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
512 temp = x;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
513 store_abs:
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
514 int addr = GET_ADDR();
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
515 WRITE( addr, temp );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
516 pc += 2;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
517 goto loop;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
518 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
519
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
520 // Compare
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
521
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
522 case 0xEC:{// CPX abs
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
523 unsigned addr = GET_ADDR();
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
524 pc++;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
525 data = READ( addr );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
526 goto cpx_data;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
527 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
528
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
529 case 0xE4: // CPX zp
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
530 data = LOW_MEM( data );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
531 case 0xE0: // CPX imm
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
532 cpx_data:
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
533 nz = x - data;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
534 goto compare_common;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
535
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
536 case 0xCC:{// CPY abs
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
537 unsigned addr = GET_ADDR();
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
538 pc++;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
539 data = READ( addr );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
540 goto cpy_data;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
541 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
542
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
543 case 0xC4: // CPY zp
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
544 data = LOW_MEM( data );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
545 case 0xC0: // CPY imm
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
546 cpy_data:
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
547 nz = y - data;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
548 goto compare_common;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
549
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
550 // Logical
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
551
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
552 ARITH_ADDR_MODES( 0x25 ) // AND
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
553 nz = (a &= data);
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
554 goto inc_pc_loop;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
555
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
556 ARITH_ADDR_MODES( 0x45 ) // EOR
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
557 nz = (a ^= data);
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
558 goto inc_pc_loop;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
559
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
560 ARITH_ADDR_MODES( 0x05 ) // ORA
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
561 nz = (a |= data);
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
562 goto inc_pc_loop;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
563
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
564 // Add/Subtract
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
565
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
566 ARITH_ADDR_MODES( 0x65 ) // ADC
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
567 adc_imm: {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
568 int carry = (c >> 8) & 1;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
569 int ov = (a ^ 0x80) + carry + (BOOST::int8_t) data; // sign-extend
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
570 c = nz = a + data + carry;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
571 a = (uint8_t) nz;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
572 status = (status & ~st_v) | ((ov >> 2) & 0x40);
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
573 goto inc_pc_loop;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
574 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
575
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
576 ARITH_ADDR_MODES( 0xE5 ) // SBC
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
577 case 0xEB: // unofficial equivalent
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
578 data ^= 0xFF;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
579 goto adc_imm;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
580
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
581 case 0x2C:{// BIT abs
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
582 unsigned addr = GET_ADDR();
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
583 pc++;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
584 nz = READ( addr );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
585 goto bit_common;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
586 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
587
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
588 case 0x24: // BIT zp
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
589 nz = LOW_MEM( data );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
590 bit_common:
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
591 status = (status & ~st_v) | (nz & st_v);
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
592 if ( !(a & nz) ) // use special encoding since N and Z might both be set
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
593 nz = ((nz & 0x80) << 4) ^ ~0xFF;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
594 goto inc_pc_loop;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
595
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
596 // Shift/Rotate
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
597
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
598 case 0x4A: // LSR A
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
599 c = 0;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
600 case 0x6A: // ROR A
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
601 nz = (c >> 1) & 0x80; // could use bit insert macro here
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
602 c = a << 8;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
603 nz |= a >> 1;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
604 a = nz;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
605 goto loop;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
606
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
607 case 0x0A: // ASL A
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
608 nz = a << 1;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
609 c = nz;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
610 a = (uint8_t) nz;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
611 goto loop;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
612
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
613 case 0x2A: { // ROL A
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
614 nz = a << 1;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
615 int temp = (c >> 8) & 1;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
616 c = nz;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
617 nz |= temp;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
618 a = (uint8_t) nz;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
619 goto loop;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
620 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
621
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
622 case 0x3E: // ROL abs,X
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
623 data += x;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
624 goto rol_abs;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
625
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
626 case 0x1E: // ASL abs,X
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
627 data += x;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
628 case 0x0E: // ASL abs
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
629 c = 0;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
630 case 0x2E: // ROL abs
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
631 rol_abs:
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
632 HANDLE_PAGE_CROSSING( data );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
633 ADD_PAGE
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
634 nz = (c >> 8) & 1;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
635 nz |= (c = READ( data ) << 1);
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
636 rotate_common:
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
637 WRITE( data, (uint8_t) nz );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
638 goto inc_pc_loop;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
639
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
640 case 0x7E: // ROR abs,X
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
641 data += x;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
642 goto ror_abs;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
643
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
644 case 0x5E: // LSR abs,X
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
645 data += x;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
646 case 0x4E: // LSR abs
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
647 c = 0;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
648 case 0x6E: // ROR abs
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
649 ror_abs: {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
650 HANDLE_PAGE_CROSSING( data );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
651 ADD_PAGE
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
652 int temp = READ( data );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
653 nz = ((c >> 1) & 0x80) | (temp >> 1);
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
654 c = temp << 8;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
655 goto rotate_common;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
656 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
657
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
658 case 0x76: // ROR zp,x
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
659 data = uint8_t (data + x);
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
660 goto ror_zp;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
661
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
662 case 0x56: // LSR zp,x
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
663 data = uint8_t (data + x);
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
664 case 0x46: // LSR zp
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
665 c = 0;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
666 case 0x66: // ROR zp
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
667 ror_zp: {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
668 int temp = LOW_MEM( data );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
669 nz = ((c >> 1) & 0x80) | (temp >> 1);
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
670 c = temp << 8;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
671 goto write_nz_zp;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
672 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
673
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
674 case 0x36: // ROL zp,x
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
675 data = uint8_t (data + x);
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
676 goto rol_zp;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
677
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
678 case 0x16: // ASL zp,x
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
679 data = uint8_t (data + x);
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
680 case 0x06: // ASL zp
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
681 c = 0;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
682 case 0x26: // ROL zp
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
683 rol_zp:
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
684 nz = (c >> 8) & 1;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
685 nz |= (c = LOW_MEM( data ) << 1);
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
686 goto write_nz_zp;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
687
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
688 // Increment/Decrement
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
689
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
690 case 0xE8: INC_DEC_XY( x, 1 ) // INX
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
691 case 0xCA: INC_DEC_XY( x, -1 ) // DEX
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
692 case 0x88: INC_DEC_XY( y, -1 ) // DEY
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
693
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
694 case 0xF6: // INC zp,x
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
695 data = uint8_t (data + x);
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
696 case 0xE6: // INC zp
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
697 nz = 1;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
698 goto add_nz_zp;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
699
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
700 case 0xD6: // DEC zp,x
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
701 data = uint8_t (data + x);
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
702 case 0xC6: // DEC zp
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
703 nz = -1;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
704 add_nz_zp:
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
705 nz += LOW_MEM( data );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
706 write_nz_zp:
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
707 LOW_MEM( data ) = nz;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
708 goto inc_pc_loop;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
709
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
710 case 0xFE: // INC abs,x
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
711 HANDLE_PAGE_CROSSING( data + x );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
712 data = x + GET_ADDR();
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
713 goto inc_ptr;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
714
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
715 case 0xEE: // INC abs
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
716 data = GET_ADDR();
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
717 inc_ptr:
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
718 nz = 1;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
719 goto inc_common;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
720
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
721 case 0xDE: // DEC abs,x
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
722 HANDLE_PAGE_CROSSING( data + x );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
723 data = x + GET_ADDR();
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
724 goto dec_ptr;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
725
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
726 case 0xCE: // DEC abs
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
727 data = GET_ADDR();
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
728 dec_ptr:
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
729 nz = -1;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
730 inc_common:
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
731 nz += READ( data );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
732 pc += 2;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
733 WRITE( data, (uint8_t) nz );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
734 goto loop;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
735
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
736 // Transfer
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
737
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
738 case 0xAA: // TAX
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
739 x = a;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
740 case 0x8A: // TXA
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
741 a = nz = x;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
742 goto loop;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
743
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
744 case 0x9A: // TXS
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
745 SET_SP( x ); // verified (no flag change)
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
746 goto loop;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
747
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
748 case 0xBA: // TSX
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
749 x = nz = GET_SP();
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
750 goto loop;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
751
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
752 // Stack
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
753
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
754 case 0x48: // PHA
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
755 PUSH( a ); // verified
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
756 goto loop;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
757
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
758 case 0x68: // PLA
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
759 a = nz = POP();
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
760 goto loop;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
761
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
762 {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
763 int temp;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
764 case 0x40: // RTI
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
765 temp = POP();
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
766 pc = POP();
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
767 pc |= POP() << 8;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
768 goto set_status;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
769 case 0x28: // PLP
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
770 temp = POP();
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
771 set_status:
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
772 #if !NES_CPU_IRQ_SUPPORT
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
773 SET_STATUS( temp );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
774 goto loop;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
775 #endif
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
776 data = status & st_i;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
777 SET_STATUS( temp );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
778 if ( !(data & ~status) )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
779 goto loop;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
780 result = result_cli; // I flag was just cleared
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
781 goto end;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
782 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
783
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
784 case 0x08: { // PHP
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
785 int temp;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
786 CALC_STATUS( temp );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
787 temp |= st_b | st_r;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
788 PUSH( temp );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
789 goto loop;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
790 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
791
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
792 case 0x6C: // JMP (ind)
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
793 data = GET_ADDR();
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
794 pc = READ( data );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
795 data++;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
796 pc |= READ( data ) << 8;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
797 goto loop;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
798
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
799 case 0x00: { // BRK
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
800 pc += 2; // verified
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
801 PUSH( pc >> 8 );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
802 PUSH( pc );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
803 status |= st_i;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
804 int temp;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
805 CALC_STATUS( temp );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
806 PUSH( temp | st_b | st_r );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
807 pc = READ_PROG16( 0xFFFE );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
808 goto loop;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
809 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
810
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
811 // Flags
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
812
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
813 case 0x38: // SEC
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
814 c = ~0;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
815 goto loop;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
816
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
817 case 0x18: // CLC
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
818 c = 0;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
819 goto loop;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
820
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
821 case 0xB8: // CLV
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
822 status &= ~st_v;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
823 goto loop;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
824
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
825 case 0xD8: // CLD
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
826 status &= ~st_d;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
827 goto loop;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
828
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
829 case 0xF8: // SED
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
830 status |= st_d;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
831 goto loop;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
832
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
833 case 0x58: // CLI
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
834 #if !NES_CPU_IRQ_SUPPORT
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
835 status &= ~st_i;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
836 goto loop;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
837 #endif
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
838 if ( !(status & st_i) )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
839 goto loop;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
840 status &= ~st_i;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
841 result = result_cli;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
842 goto end;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
843
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
844 case 0x78: // SEI
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
845 status |= st_i;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
846 goto loop;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
847
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
848 // undocumented
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
849
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
850 case 0x0C: case 0x1C: case 0x3C: case 0x5C: case 0x7C: case 0xDC: case 0xFC: // SKW
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
851 pc++;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
852 case 0x74: case 0x04: case 0x14: case 0x34: case 0x44: case 0x54: case 0x64: // SKB
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
853 case 0x80: case 0x82: case 0x89: case 0xC2: case 0xD4: case 0xE2: case 0xF4:
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
854 goto inc_pc_loop;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
855
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
856 case 0xEA: case 0x1A: case 0x3A: case 0x5A: case 0x7A: case 0xDA: case 0xFA: // NOP
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
857 goto loop;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
858
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
859 // unimplemented
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
860
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
861 case 0x9B: // TAS
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
862 case 0x9C: // SAY
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
863 case 0x9E: // XAS
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
864 case 0x93: // AXA
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
865 case 0x9F: // AXA
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
866 case 0x0B: // ANC
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
867 case 0x2B: // ANC
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
868 case 0xBB: // LAS
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
869 case 0x4B: // ALR
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
870 case 0x6B: // AAR
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
871 case 0x8B: // XAA
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
872 case 0xAB: // OAL
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
873 case 0xCB: // SAX
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
874 case 0x02: case 0x12: case 0x22: case 0x32: // ?
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
875 case 0x42: case 0x52: case 0x62: case 0x72:
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
876 case 0x92: case 0xB2: case 0xD2: case 0xF2:
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
877 case 0x83: case 0x87: case 0x8F: case 0x97: // AXS
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
878 case 0xA3: case 0xA7: case 0xAF: case 0xB3: case 0xB7: case 0xBF: // LAX
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
879 case 0xE3: case 0xE7: case 0xEF: case 0xF3: case 0xF7: case 0xFB: case 0xFF: // INS
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
880 case 0xC3: case 0xC7: case 0xCF: case 0xD3: case 0xD7: case 0xDB: case 0xDF: // DCM
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
881 case 0x63: case 0x67: case 0x6F: case 0x73: case 0x77: case 0x7B: case 0x7F: // RRA
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
882 case 0x43: case 0x47: case 0x4F: case 0x53: case 0x57: case 0x5B: case 0x5F: // LSE
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
883 case 0x23: case 0x27: case 0x2F: case 0x33: case 0x37: case 0x3B: case 0x3F: // RLA
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
884 case 0x03: case 0x07: case 0x0F: case 0x13: case 0x17: case 0x1B: case 0x1F: // ASO
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
885 result = result_badop;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
886 goto stop;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
887 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
888 assert( false );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
889
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
890 stop:
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
891 pc--;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
892 end:
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
893
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
894 {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
895 int temp;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
896 CALC_STATUS( temp );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
897 r.status = temp;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
898 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
899
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
900 base_time += cycle_count;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
901 #if NES_CPU_IRQ_SUPPORT
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
902 this->cycle_limit -= cycle_count;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
903 #endif
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
904 this->cycle_count = 0;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
905 r.pc = pc;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
906 r.sp = GET_SP();
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
907 r.a = a;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
908 r.x = x;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
909 r.y = y;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
910
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
911 return result;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
912 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
913
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
914 #endif
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
915