annotate Plugins/Input/console/Spc_Cpu.cpp @ 108:cde5ca21ddc3 trunk

[svn] Improved latency on the decode loop.
author nenolod
date Wed, 02 Nov 2005 21:45:23 -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 "Spc_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 #include "Snes_Spc.h"
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
10
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
11 /* Copyright (C) 2004-2005 Shay Green. This module is free software; you
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
12 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
13 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
14 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
15 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
16 WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
17 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
18 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
19 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
20 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
21
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
22 #include BLARGG_SOURCE_BEGIN
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
23
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
24 // Several instructions are commented out (or not even implemented). These aren't
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
25 // used by the SPC files tested.
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
26
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
27 // Optimize performance for the most common instructions, and size for the rest:
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
28 //
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
29 // 15% 0xF0 BEQ rel
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
30 // 8% 0xE4 MOV A,dp
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
31 // 4% 0xF5 MOV A,abs+X
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
32 // 4% 0xD0 BNE rel
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
33 // 4% 0x6F RET
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
34 // 4% 0x3F CALL addr
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
35 // 4% 0xF4 MOV A,dp+X
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
36 // 3% 0xC4 MOV dp,A
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
37 // 2% 0xEB MOV Y,dp
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
38 // 2% 0x3D INC X
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
39 // 2% 0xF6 MOV A,abs+Y
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
40 // (1% and below not shown)
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
41
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
42 Spc_Cpu::Spc_Cpu( uint8_t* ram_, Snes_Spc* e ) :
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
43 ram( ram_ ),
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
44 emu( *e )
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 remain_ = 0;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
47 BOOST_STATIC_ASSERT( sizeof (int) >= 4 );
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 #define READ( addr ) (emu.read( addr ))
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
51 #define WRITE( addr, value ) (emu.write( addr, value ))
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
52
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
53 #define READ_DP( addr ) READ( (addr) + dp )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
54 #define WRITE_DP( addr, value ) WRITE( (addr) + dp, value )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
55
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
56 #define READ_PROG( addr ) (ram [addr])
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
57 #define READ_PROG16( addr ) GET_LE16( &READ_PROG( addr ) )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
58
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
59 int Spc_Cpu::read( spc_addr_t addr )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
60 {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
61 return READ( addr );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
62 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
63
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
64 void Spc_Cpu::write( spc_addr_t addr, int data )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
65 {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
66 WRITE( addr, data );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
67 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
68
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
69 // Cycle table derived from text copy of SPC-700 manual (using regular expressions)
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
70 static const unsigned char cycle_table [0x100] = {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
71 2,8,4,5,3,4,3,6,2,6,5,4,5,4,6,8,
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
72 2,8,4,5,4,5,5,6,5,5,6,5,2,2,4,6,
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
73 2,8,4,5,3,4,3,6,2,6,5,4,5,4,5,4,
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
74 2,8,4,5,4,5,5,6,5,5,6,5,2,2,3,8,
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
75 2,8,4,5,3,4,3,6,2,6,4,4,5,4,6,6,
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
76 2,8,4,5,4,5,5,6,5,5,4,5,2,2,4,3,
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
77 2,8,4,5,3,4,3,6,2,6,4,4,5,4,5,5,
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
78 2,8,4,5,4,5,5,6,5,5,5,5,2,2,3,6,
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
79 2,8,4,5,3,4,3,6,2,6,5,4,5,2,4,5,
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
80 2,8,4,5,4,5,5,6,5,5,5,5,2,2,12,5,
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
81 3,8,4,5,3,4,3,6,2,6,4,4,5,2,4,4,
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
82 2,8,4,5,4,5,5,6,5,5,5,5,2,2,3,4,
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
83 3,8,4,5,4,5,4,7,2,5,6,4,5,2,4,9,
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
84 2,8,4,5,5,6,6,7,4,5,4,5,2,2,6,3,
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
85 2,8,4,5,3,4,3,6,2,4,5,3,4,3,4,3,
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
86 2,8,4,5,4,5,5,6,3,4,5,4,2,2,4,3
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 // The C,mem instructions are hardly used, so a non-inline function is used for
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
90 // the common access code.
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
91 unsigned Spc_Cpu::mem_bit( spc_addr_t pc )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
92 {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
93 unsigned addr = READ_PROG16( pc );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
94 unsigned t = READ( addr & 0x1fff ) >> (addr >> 13);
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
95 return (t << 8) & 0x100;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
96 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
97
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
98 #include BLARGG_ENABLE_OPTIMIZER
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
99
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
100 spc_time_t Spc_Cpu::run( spc_time_t cycle_count )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
101 {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
102 remain_ = cycle_count;
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 #if BLARGG_CPU_POWERPC
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
105 uint8_t* const ram = this->ram; // cache
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
106 #endif
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 // Stack pointer is kept one greater than usual SPC stack pointer to allow
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
109 // common pre-decrement and post-increment memory instructions that some
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
110 // processors have. Address wrap-around isn't supported.
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
111 #define PUSH( v ) (*--sp = (v))
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
112 #define PUSH16( v ) (sp -= 2, SET_LE16( sp, v ))
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
113 #define POP() (*sp++)
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
114 #define SET_SP( v ) (sp = ram + 0x101 + (v))
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
115 #define GET_SP() (sp - 0x101 - ram)
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
116
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
117 uint8_t* sp;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
118 SET_SP( r.sp );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
119
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
120 // registers
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
121 unsigned pc = r.pc;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
122 int a = r.a;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
123 int x = r.x;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
124 int y = r.y;
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 // status flags
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
127
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
128 const int st_n = 0x80;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
129 const int st_v = 0x40;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
130 const int st_p = 0x20;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
131 const int st_b = 0x10;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
132 const int st_h = 0x08;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
133 const int st_i = 0x04;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
134 const int st_z = 0x02;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
135 const int st_c = 0x01;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
136
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
137 // Special encoding for negative and zero being set simultaneously (by POP PSW).
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
138 // To do: be sure this works properly (I copied it from my NES 6502 emulator).
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
139 #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
140
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
141 #define CALC_STATUS( out ) do { \
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
142 out = status & ~(st_n | st_z | st_c); \
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
143 out |= (c >> 8) & st_c; \
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
144 out |= (dp >> 3) & st_p; \
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
145 if ( IS_NEG ) out |= st_n; \
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
146 if ( !(uint8_t) nz ) out |= st_z; \
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
147 } while ( 0 )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
148
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
149 #define SET_STATUS( in ) do { \
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
150 status = in & ~(st_n | st_z | st_c | st_p); \
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
151 c = in << 8; \
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
152 nz = in << 4; \
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
153 nz &= 0x820; \
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
154 nz ^= ~0xDF; \
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
155 dp = (in << 3) & 0x100; \
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
156 } while ( 0 )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
157
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
158 uint8_t status;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
159 int c; // store C as 'c' & 0x100.
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
160 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
161 unsigned dp; // direct page base
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
162 {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
163 int temp = r.status;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
164 SET_STATUS( temp );
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
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
167 goto loop;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
168
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
169 unsigned data; // first operand of instruction and temporary across function calls
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
170
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
171 // Common endings for instructions
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
172 cbranch_taken_loop: // compare and branch
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
173 data = READ_PROG( pc );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
174 branch_taken_loop: // taken branch (displacement already in 'data')
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
175 pc += (BOOST::int8_t) data; // sign-extend
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
176 remain_ -= 2;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
177 inc_pc_loop: // end of instruction with an operand
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
178 pc++;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
179 loop:
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
180
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
181 // Be sure all registers are in range. PC and SP wrap-around isn't handled so
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
182 // those checks might fail, but a, x, and y should always be in range.
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
183 check( (unsigned) pc < 0x10000 );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
184 check( (unsigned) GET_SP() < 0x100 );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
185 check( (unsigned) a < 0x100 );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
186 check( (unsigned) x < 0x100 );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
187 check( (unsigned) y < 0x100 );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
188
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
189 // 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
190 // and non-portable constructs are allowed.
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
191 #if BLARGG_NONPORTABLE && BLARGG_BIG_ENDIAN
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
192 data = *(BOOST::uint16_t*) &READ_PROG( pc );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
193 pc++;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
194 unsigned opcode = data >> 8;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
195 data = (uint8_t) data;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
196
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
197 #elif BLARGG_NONPORTABLE && BLARGG_LITTLE_ENDIAN
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
198 data = *(BOOST::uint16_t*) &READ_PROG( pc );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
199 pc++;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
200 unsigned opcode = (uint8_t) data;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
201 data >>= 8;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
202
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
203 #else
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
204 unsigned opcode = READ_PROG( pc );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
205 pc++;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
206 data = READ_PROG( pc );
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 #endif
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
209
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
210 if ( remain_ <= 0 )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
211 goto stop;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
212
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
213 remain_ -= cycle_table [opcode];
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
214
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
215 // Use 'data' for temporaries whose lifetime crosses read/write calls, otherwise
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
216 // use a local temporary.
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
217 switch ( opcode )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
218 {
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 #define BRANCH( cond ) \
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
221 if ( cond ) \
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
222 goto branch_taken_loop; \
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
223 goto inc_pc_loop;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
224
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
225 // Most-Common
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
226
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
227 case 0xF0: // BEQ (most common)
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
228 BRANCH( !(uint8_t) nz )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
229
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
230 case 0xD0: // BNE
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
231 BRANCH( (uint8_t) nz )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
232
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
233 case 0x3F: // CALL
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
234 PUSH16( pc + 2 );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
235 pc = READ_PROG16( pc );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
236 goto 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 case 0x6F: // RET
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
239 pc = POP();
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
240 pc += POP() * 0x100;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
241 goto loop;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
242
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
243 #define CASE( n ) case n:
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
244
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
245 // Define common address modes based on opcode for immediate mode. Execution
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
246 // ends with data set to the address of the operand.
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
247 #define ADDR_MODES( op ) \
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
248 CASE( op - 0x02 ) /* (X) */ \
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
249 data = x + dp; \
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
250 pc--; \
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
251 goto end_##op; \
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
252 CASE( op + 0x0F ) /* (dp)+Y */ \
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
253 data = READ_PROG16( data + dp ) + y;\
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
254 goto end_##op; \
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
255 CASE( op - 0x01 ) /* (dp+X) */ \
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
256 data = READ_PROG16( uint8_t (data + x) + dp );\
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
257 goto end_##op; \
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
258 CASE( op + 0x0E ) /* abs+Y */ \
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
259 data += y; \
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
260 goto abs_##op; \
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
261 CASE( op + 0x0D ) /* abs+X */ \
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
262 data += x; \
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
263 CASE( op - 0x03 ) /* abs */ \
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
264 abs_##op: \
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
265 pc++; \
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
266 data += 0x100 * READ_PROG( pc );\
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
267 goto end_##op; \
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
268 CASE( op + 0x0C ) /* dp+X */ \
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
269 data = uint8_t (data + x); \
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
270 CASE( op - 0x04 ) /* dp */ \
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
271 data += dp; \
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
272 end_##op:
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 // 1. 8-bit Data Transmission Commands. Group I
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 ADDR_MODES( 0xE8 ) // MOV A,addr
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
277 // case 0xE4: // MOV a,dp (most common)
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
278 mov_a_addr:
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
279 a = nz = READ( data );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
280 goto inc_pc_loop;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
281 case 0xBF: // MOV A,(X)+
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
282 data = x + dp;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
283 x = uint8_t (x + 1);
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
284 pc--;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
285 goto mov_a_addr;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
286
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
287 case 0xE8: // MOV A,imm
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
288 a = data;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
289 nz = data;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
290 goto inc_pc_loop;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
291
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
292 case 0xF9: // MOV X,dp+Y
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
293 data = uint8_t (data + y);
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
294 case 0xF8: // MOV X,dp
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
295 data += dp;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
296 goto mov_x_addr;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
297 case 0xE9: // MOV X,abs
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
298 data = READ_PROG16( pc );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
299 pc++;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
300 mov_x_addr:
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
301 data = READ( data );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
302 case 0xCD: // MOV X,imm
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
303 x = data;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
304 nz = data;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
305 goto inc_pc_loop;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
306
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
307 case 0xFB: // MOV Y,dp+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 0xEB: // MOV Y,dp
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
310 data += dp;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
311 goto mov_y_addr;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
312 case 0xEC: // MOV Y,abs
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
313 data = READ_PROG16( pc );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
314 pc++;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
315 mov_y_addr:
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
316 data = READ( data );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
317 case 0x8D: // MOV Y,imm
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
318 y = data;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
319 nz = data;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
320 goto inc_pc_loop;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
321
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
322 // 2. 8-BIT DATA TRANSMISSION COMMANDS. GROUP 2.
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
323
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
324 ADDR_MODES( 0xC8 ) // MOV addr,A
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
325 WRITE( data, a );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
326 goto inc_pc_loop;
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 {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
329 int temp;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
330 case 0xCC: // MOV abs,Y
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
331 temp = y;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
332 goto mov_abs_temp;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
333 case 0xC9: // MOV abs,X
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
334 temp = x;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
335 mov_abs_temp:
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
336 WRITE( READ_PROG16( pc ), temp );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
337 pc += 2;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
338 goto loop;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
339 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
340
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
341 case 0xD9: // MOV dp+Y,X
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
342 data = uint8_t (data + y);
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
343 case 0xD8: // MOV dp,X
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
344 WRITE( data + dp, x );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
345 goto inc_pc_loop;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
346
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
347 case 0xDB: // MOV dp+X,Y
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
348 data = uint8_t (data + x);
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
349 case 0xCB: // MOV dp,Y
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
350 WRITE( data + dp, y );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
351 goto inc_pc_loop;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
352
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
353 case 0xFA: // MOV dp,dp
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
354 data = READ( data + dp );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
355 case 0x8F: // MOV dp,#imm
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
356 pc++;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
357 WRITE_DP( READ_PROG( pc ), data );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
358 goto inc_pc_loop;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
359
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
360 // 3. 8-BIT DATA TRANSMISSIN COMMANDS, GROUP 3.
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 0x7D: // MOV A,X
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
363 a = x;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
364 nz = x;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
365 goto loop;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
366
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
367 case 0xDD: // MOV A,Y
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
368 a = y;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
369 nz = y;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
370 goto loop;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
371
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
372 case 0x5D: // MOV X,A
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
373 x = a;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
374 nz = a;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
375 goto loop;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
376
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
377 case 0xFD: // MOV Y,A
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
378 y = a;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
379 nz = a;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
380 goto loop;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
381
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
382 case 0x9D: // MOV X,SP
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
383 x = nz = GET_SP();
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
384 goto loop;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
385
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
386 case 0xBD: // MOV SP,X
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
387 SET_SP( x );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
388 goto 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 0xC6: // MOV (X),A (handled by MOV addr,A in group 2)
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
391
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
392 case 0xAF: // MOV (X)+,A
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
393 WRITE_DP( x, a );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
394 x++;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
395 goto loop;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
396
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
397 // 5. 8-BIT LOGIC OPERATION COMMANDS.
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
398
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
399 #define LOGICAL_OP( op, func ) \
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
400 ADDR_MODES( op ) /* addr */ \
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
401 data = READ( data ); \
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
402 case op: /* imm */ \
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
403 nz = a func##= data; \
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
404 goto inc_pc_loop; \
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
405 { unsigned addr; \
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
406 case op + 0x11: /* X,Y */ \
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
407 data = READ_DP( y ); \
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
408 addr = x + dp; \
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
409 pc--; \
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
410 goto addr_##op; \
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
411 case op + 0x01: /* dp,dp */ \
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
412 data = READ_DP( data ); \
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
413 case op + 0x10: /*dp,imm*/\
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
414 pc++; \
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
415 addr = READ_PROG( pc ) + dp;\
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
416 addr_##op: \
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
417 nz = data func READ( addr );\
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
418 WRITE( addr, nz ); \
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
419 goto inc_pc_loop; \
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
420 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
421
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
422 LOGICAL_OP( 0x28, & ); // AND
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
423
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
424 LOGICAL_OP( 0x08, | ); // OR
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 LOGICAL_OP( 0x48, ^ ); // EOR
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
427
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
428 // 4. 8-BIT ARITHMETIC OPERATION COMMANDS.
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
429
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
430 ADDR_MODES( 0x68 ) // CMP addr
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
431 data = READ( data );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
432 case 0x68: // CMP imm
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
433 nz = a - data;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
434 c = ~nz;
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 0x79: // CMP (X),(Y)
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
438 data = READ_DP( x );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
439 nz = data - READ_DP( y );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
440 c = ~nz;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
441 goto 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 0x69: // CMP (dp),(dp)
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
444 data = READ_DP( data );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
445 case 0x78: // CMP dp,imm
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
446 pc++;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
447 nz = READ_DP( READ_PROG( pc ) ) - data;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
448 c = ~nz;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
449 goto inc_pc_loop;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
450
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
451 case 0x3E: // CMP X,dp
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
452 data += dp;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
453 goto cmp_x_addr;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
454 case 0x1E: // CMP X,abs
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
455 data = READ_PROG16( pc );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
456 pc++;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
457 cmp_x_addr:
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
458 data = READ( data );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
459 case 0xC8: // CMP X,imm
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
460 nz = x - data;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
461 c = ~nz;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
462 goto inc_pc_loop;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
463
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
464 case 0x7E: // CMP Y,dp
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
465 data += dp;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
466 goto cmp_y_addr;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
467 case 0x5E: // CMP Y,abs
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
468 data = READ_PROG16( pc );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
469 pc++;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
470 cmp_y_addr:
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
471 data = READ( data );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
472 case 0xAD: // CMP Y,imm
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
473 nz = y - data;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
474 c = ~nz;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
475 goto inc_pc_loop;
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 {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
478 int addr;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
479 case 0xB9: // SBC (x),(y)
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
480 case 0x99: // ADC (x),(y)
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
481 pc--; // compensate for inc later
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
482 data = READ_DP( x );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
483 addr = y + dp;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
484 goto adc_addr;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
485 case 0xA9: // SBC dp,dp
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
486 case 0x89: // ADC dp,dp
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
487 data = READ_DP( data );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
488 case 0xB8: // SBC dp,imm
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
489 case 0x98: // ADC dp,imm
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
490 pc++;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
491 addr = READ_PROG( pc ) + dp;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
492 adc_addr:
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
493 nz = READ( addr );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
494 goto adc_data;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
495
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
496 // catch ADC and SBC together, then decode later based on operand
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
497 #undef CASE
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
498 #define CASE( n ) case n: case (n) + 0x20:
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
499 ADDR_MODES( 0x88 ) // ADC/SBC addr
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
500 data = READ( data );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
501 case 0xA8: // SBC imm
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
502 case 0x88: // ADC imm
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
503 addr = -1; // A
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
504 nz = a;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
505 adc_data: {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
506 if ( opcode & 0x20 )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
507 data ^= 0xff; // SBC
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
508 int carry = (c >> 8) & 1;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
509 int ov = (nz ^ 0x80) + carry + (BOOST::int8_t) data; // sign-extend
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
510 int hc = (nz & 15) + carry;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
511 c = nz += data + carry;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
512 hc = (nz & 15) - hc;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
513 status = (status & ~(st_v | st_h)) | ((ov >> 2) & st_v) | ((hc >> 1) & st_h);
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
514 if ( addr < 0 ) {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
515 a = (uint8_t) nz;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
516 goto inc_pc_loop;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
517 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
518 WRITE( addr, (uint8_t) nz );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
519 goto inc_pc_loop;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
520 }
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 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
523
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
524 // 6. ADDITION & SUBTRACTION COMMANDS.
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
525
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
526 #define INC_DEC_REG( reg, n ) \
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
527 nz = reg + n; \
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
528 reg = (uint8_t) nz; \
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
529 goto loop;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
530
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
531 case 0xBC: INC_DEC_REG( a, 1 ) // INC A
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
532 case 0x3D: INC_DEC_REG( x, 1 ) // INC X
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
533 case 0xFC: INC_DEC_REG( y, 1 ) // INC Y
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
534
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
535 case 0x9C: INC_DEC_REG( a, -1 ) // DEC A
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
536 case 0x1D: INC_DEC_REG( x, -1 ) // DEC X
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
537 case 0xDC: INC_DEC_REG( y, -1 ) // DEC Y
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
538
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
539 case 0x9B: // DEC dp+X
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
540 case 0xBB: // INC dp+X
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
541 data = uint8_t (data + x);
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
542 case 0x8B: // DEC dp
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
543 case 0xAB: // INC dp
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
544 data += dp;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
545 goto inc_abs;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
546 case 0x8C: // DEC abs
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
547 case 0xAC: // INC abs
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
548 data = READ_PROG16( pc );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
549 pc++;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
550 inc_abs:
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
551 nz = ((opcode >> 4) & 2) - 1;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
552 nz += READ( data );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
553 WRITE( data, (uint8_t) nz );
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 // 7. SHIFT, ROTATION COMMANDS
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
557
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
558 case 0x5C: // LSR A
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
559 c = 0;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
560 case 0x7C:{// ROR A
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
561 nz = ((c >> 1) & 0x80) | (a >> 1);
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
562 c = a << 8;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
563 a = nz;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
564 goto loop;
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
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
567 case 0x1C: // ASL A
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
568 c = 0;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
569 case 0x3C:{// ROL A
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
570 int temp = (c >> 8) & 1;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
571 c = a << 1;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
572 nz = c | temp;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
573 a = (uint8_t) nz;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
574 goto loop;
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
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
577 case 0x0B: // ASL dp
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
578 c = 0;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
579 data += dp;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
580 goto rol_mem;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
581 case 0x1B: // ASL dp+X
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
582 c = 0;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
583 case 0x3B: // ROL dp+X
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
584 data = uint8_t (data + x);
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
585 case 0x2B: // ROL dp
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
586 data += dp;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
587 goto rol_mem;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
588 case 0x0C: // ASL abs
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
589 c = 0;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
590 case 0x2C: // ROL abs
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
591 data = READ_PROG16( pc );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
592 pc++;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
593 rol_mem:
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
594 nz = (c >> 8) & 1;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
595 nz |= (c = READ( data ) << 1);
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
596 WRITE( data, (uint8_t) nz );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
597 goto inc_pc_loop;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
598
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
599 case 0x4B: // LSR dp
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
600 c = 0;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
601 data += dp;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
602 goto ror_mem;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
603 case 0x5B: // LSR dp+X
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
604 c = 0;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
605 case 0x7B: // ROR dp+X
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
606 data = uint8_t (data + x);
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
607 case 0x6B: // ROR dp
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
608 data += dp;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
609 goto ror_mem;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
610 case 0x4C: // LSR abs
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
611 c = 0;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
612 case 0x6C: // ROR abs
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
613 data = READ_PROG16( pc );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
614 pc++;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
615 ror_mem: {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
616 int temp = READ( data );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
617 nz = ((c >> 1) & 0x80) | (temp >> 1);
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
618 c = temp << 8;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
619 WRITE( data, nz );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
620 goto inc_pc_loop;
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
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
623 case 0x9F: // XCN
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
624 nz = a = (a >> 4) | uint8_t (a << 4);
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
625 goto loop;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
626
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
627 // 8. 16-BIT TRANSMISION COMMANDS
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
628
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
629 case 0xBA: // MOVW YA,dp
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
630 a = READ_DP( data );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
631 nz = (a & 0x7f) | (a >> 1);
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
632 y = READ_DP( uint8_t (data + 1) );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
633 nz |= y;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
634 goto inc_pc_loop;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
635
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
636 case 0xDA: // MOVW dp,YA
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
637 WRITE_DP( data, a );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
638 WRITE_DP( uint8_t (data + 1), y );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
639 goto inc_pc_loop;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
640
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
641 // 9. 16-BIT OPERATION COMMANDS.
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
642
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
643 case 0x3A: // INCW dp
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
644 case 0x1A:{// DECW dp
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
645 data += dp;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
646
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
647 // low byte
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
648 int temp = READ( data );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
649 temp += ((opcode >> 4) & 2) - 1; // +1 for INCW, -1 for DECW
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
650 nz = ((temp >> 1) | temp) & 0x7f;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
651 WRITE( data, (uint8_t) temp );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
652
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
653 // high byte
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
654 data = uint8_t (data + 1) + dp;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
655 temp >>= 8;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
656 temp = uint8_t (temp + READ( data ));
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
657 nz |= temp;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
658 WRITE( data, temp );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
659
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
660 goto inc_pc_loop;
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
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
663 case 0x9A: // SUBW YA,dp
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
664 case 0x7A: // ADDW YA,dp
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
665 {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
666 // read 16-bit addend
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
667 int temp = READ_DP( data );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
668 int sign = READ_DP( uint8_t (data + 1) );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
669 temp += 0x100 * sign;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
670 status &= ~(st_v | st_h);
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
671
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
672 // to do: fix half-carry for SUBW (it's probably wrong)
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 // for SUBW, negate and truncate to 16 bits
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
675 if ( opcode & 0x80 ) {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
676 temp = (temp ^ 0xFFFF) + 1;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
677 sign = temp >> 8;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
678 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
679
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
680 // add low byte (A)
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
681 temp += a;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
682 a = (uint8_t) temp;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
683 nz = (temp | (temp >> 1)) & 0x7f;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
684
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
685 // add high byte (Y)
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
686 temp >>= 8;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
687 c = y + temp;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
688 nz |= c;
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 // half-carry (temporary avoids CodeWarrior optimizer bug)
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
691 unsigned hc = (c & 15) - (y & 15);
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
692 status |= (hc >> 4) & st_h;
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 // overflow if sign of YA changed when previous sign and addend sign were same
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
695 status |= (((c ^ y) & ~(y ^ sign)) >> 1) & st_v;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
696
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
697 y = (uint8_t) c;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
698
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
699 goto inc_pc_loop;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
700 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
701
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
702 case 0x5A: { // CMPW YA,dp
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
703 int temp = a - READ_DP( data );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
704 nz = ((temp >> 1) | temp) & 0x7f;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
705 temp = y + (temp >> 8);
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
706 temp -= READ_DP( uint8_t (data + 1) );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
707 nz |= temp;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
708 c = ~temp;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
709 goto inc_pc_loop;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
710 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
711
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
712 // 10. MULTIPLICATION & DIVISON COMMANDS.
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
713
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
714 case 0xCF: { // MUL YA
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
715 unsigned temp = y * a;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
716 a = (uint8_t) temp;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
717 nz = ((temp >> 1) | temp) & 0x7f;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
718 y = temp >> 8;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
719 nz |= y;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
720 goto loop;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
721 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
722
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
723 case 0x9E: // DIV YA,X
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
724 {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
725 // behavior based on SPC CPU tests
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
726
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
727 status &= ~(st_h | st_v);
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
728
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
729 if ( y >= x )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
730 status |= st_v;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
731
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
732 if ( (y & 15) >= (x & 15) )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
733 status |= st_h;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
734
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
735 unsigned temp = y * 0x100 + a;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
736 if ( y < x * 2 ) {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
737 a = temp / x;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
738 y = temp - a * x;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
739 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
740 else {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
741 temp -= x * 0x200;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
742 a = temp / (256 - x);
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
743 y = temp - a * (256 - x) + x;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
744 a = 255 - a;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
745 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
746
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
747 nz = (uint8_t) a;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
748 a = (uint8_t) a;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
749
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
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
753 // 11. DECIMAL COMPENSATION COMMANDS.
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
754
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
755 // seem unused
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
756 // case 0xDF: // DAA
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
757 // case 0xBE: // DAS
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
758
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
759 // 12. BRANCHING COMMANDS.
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
760
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
761 case 0x2F: // BRA rel
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
762 goto branch_taken_loop;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
763
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
764 case 0x30: // BMI
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
765 BRANCH( IS_NEG )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
766
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
767 case 0x10: // BPL
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
768 BRANCH( !IS_NEG )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
769
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
770 case 0xB0: // BCS
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
771 BRANCH( c & 0x100 )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
772
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
773 case 0x90: // BCC
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
774 BRANCH( !(c & 0x100) )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
775
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
776 case 0x70: // BVS
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
777 BRANCH( status & st_v )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
778
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
779 case 0x50: // BVC
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
780 BRANCH( !(status & st_v) )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
781
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
782 case 0x03: // BBS dp.bit,rel
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
783 case 0x23:
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
784 case 0x43:
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
785 case 0x63:
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
786 case 0x83:
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
787 case 0xA3:
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
788 case 0xC3:
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
789 case 0xE3:
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
790 pc++;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
791 if ( (READ_DP( data ) >> (opcode >> 5)) & 1 )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
792 goto cbranch_taken_loop;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
793 goto inc_pc_loop;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
794
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
795 case 0x13: // BBC dp.bit,rel
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
796 case 0x33:
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
797 case 0x53:
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
798 case 0x73:
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
799 case 0x93:
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
800 case 0xB3:
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
801 case 0xD3:
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
802 case 0xF3:
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
803 pc++;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
804 if ( !((READ_DP( data ) >> (opcode >> 5)) & 1) )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
805 goto cbranch_taken_loop;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
806 goto inc_pc_loop;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
807
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
808 case 0xDE: // CBNE dp+X,rel
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
809 data = uint8_t (data + x);
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
810 // fall through
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
811 case 0x2E: // CBNE dp,rel
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
812 pc++;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
813 if ( READ_DP( data ) != a )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
814 goto cbranch_taken_loop;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
815 goto inc_pc_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 0xFE: // DBNZ Y,rel
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
818 y = uint8_t (y - 1);
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
819 if ( y )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
820 goto branch_taken_loop;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
821 goto inc_pc_loop;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
822
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
823 case 0x6E: { // DBNZ dp,rel
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
824 pc++;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
825 unsigned temp = READ_DP( data ) - 1;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
826 WRITE_DP( (uint8_t) data, (uint8_t) temp );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
827 if ( temp )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
828 goto cbranch_taken_loop;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
829 goto inc_pc_loop;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
830 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
831
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
832 case 0x1F: // JMP (abs+X)
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
833 pc = READ_PROG16( pc ) + x;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
834 // fall through
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
835 case 0x5F: // JMP abs
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
836 pc = READ_PROG16( pc );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
837 goto loop;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
838
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
839 // 13. SUB-ROUTINE CALL RETURN COMMANDS.
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
840
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
841 /*
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
842 // seems unused
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
843 case 0x0F: // BRK
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
844 PUSH16( pc + 1 );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
845 pc = READ_PROG16( 0xffde ); // vector address verified
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
846 int temp;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
847 CALC_STATUS( temp );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
848 PUSH( temp );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
849 status = (status | st_b) & ~st_i;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
850 goto loop;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
851 */
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
852
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
853 case 0x4F: // PCALL offset
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
854 pc++;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
855 PUSH16( pc );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
856 pc = 0xff00 + data;
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 case 0x01: // TCALL n
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
860 case 0x11:
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
861 case 0x21:
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
862 case 0x31:
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
863 case 0x41:
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
864 case 0x51:
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
865 case 0x61:
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
866 case 0x71:
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
867 case 0x81:
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
868 case 0x91:
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
869 case 0xA1:
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
870 case 0xB1:
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
871 case 0xC1:
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
872 case 0xD1:
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
873 case 0xE1:
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
874 case 0xF1:
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
875 PUSH16( pc );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
876 pc = READ_PROG16( 0xffde - (opcode >> 3) );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
877 goto loop;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
878
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
879 // 14. STACK OPERATION COMMANDS.
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
880
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
881 {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
882 int temp;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
883 case 0x7F: // RET1
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
884 temp = POP();
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
885 pc = POP();
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
886 pc |= POP() << 8;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
887 goto set_status;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
888 case 0x8E: // POP PSW
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
889 temp = POP();
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
890 set_status:
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
891 SET_STATUS( temp );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
892 goto loop;
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 case 0x0D: { // PUSH PSW
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
896 int temp;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
897 CALC_STATUS( temp );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
898 PUSH( temp );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
899 goto loop;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
900 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
901
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
902 case 0x2D: // PUSH A
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
903 PUSH( a );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
904 goto loop;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
905
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
906 case 0x4D: // PUSH X
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
907 PUSH( x );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
908 goto loop;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
909
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
910 case 0x6D: // PUSH Y
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
911 PUSH( y );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
912 goto loop;
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 case 0xAE: // POP A
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
915 a = POP();
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
916 goto loop;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
917
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
918 case 0xCE: // POP X
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
919 x = POP();
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
920 goto loop;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
921
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
922 case 0xEE: // POP Y
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
923 y = POP();
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
924 goto loop;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
925
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
926 // 15. BIT OPERATION COMMANDS.
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
927
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
928 case 0x02: // SET1
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
929 case 0x22:
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
930 case 0x42:
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
931 case 0x62:
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
932 case 0x82:
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
933 case 0xA2:
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
934 case 0xC2:
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
935 case 0xE2:
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
936 case 0x12: // CLR1
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
937 case 0x32:
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
938 case 0x52:
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
939 case 0x72:
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
940 case 0x92:
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
941 case 0xB2:
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
942 case 0xD2:
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
943 case 0xF2: {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
944 data += dp;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
945 int bit = 1 << (opcode >> 5);
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
946 int mask = ~bit;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
947 if ( opcode & 0x10 )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
948 bit = 0;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
949 WRITE( data, (READ( data ) & mask) | bit );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
950 goto inc_pc_loop;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
951 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
952
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
953 case 0x0E: // TSET1 abs
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
954 case 0x4E:{// TCLR1 abs
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
955 data = READ_PROG16( pc );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
956 pc += 2;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
957 unsigned temp = READ( data );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
958 nz = temp & a;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
959 temp &= ~a;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
960 if ( !(opcode & 0x40) )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
961 temp |= a;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
962 WRITE( data, temp );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
963 goto loop;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
964 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
965
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
966 case 0x4A: // AND1 C,mem.bit
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
967 c &= mem_bit( pc );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
968 pc += 2;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
969 goto loop;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
970 /*
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
971 // seem unused
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
972 case 0x6A: // AND1 C,/mem.bit
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
973 c &= ~mem_bit( pc );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
974 pc += 2;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
975 goto loop;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
976
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
977 case 0x0A: // OR1 C,mem.bit
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
978 c |= mem_bit( pc );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
979 pc += 2;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
980 goto loop;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
981
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
982 case 0x2A: // OR1 C,/mem.bit
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
983 c |= ~mem_bit( pc );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
984 pc += 2;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
985 goto loop;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
986 */
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
987
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
988 case 0x8A: // EOR1 C,mem.bit
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
989 c ^= mem_bit( pc );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
990 pc += 2;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
991 goto loop;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
992
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
993 case 0xEA: { // NOT1 C,mem.bit
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
994 data = READ_PROG16( pc );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
995 pc += 2;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
996 unsigned temp = READ( data & 0x1fff );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
997 temp ^= 1 << (data >> 13);
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
998 WRITE( data & 0x1fff, temp );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
999 goto loop;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
1000 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
1001
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
1002 case 0xCA: { // MOV1 mem.bit,C
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
1003 data = READ_PROG16( pc );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
1004 pc += 2;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
1005 unsigned temp = READ( data & 0x1fff );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
1006 unsigned bit = data >> 13;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
1007 temp = (temp & ~(1 << bit)) | ((c >> (8 - bit)) & 1);
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
1008 WRITE( data & 0x1fff, temp );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
1009 goto loop;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
1010 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
1011
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
1012 case 0xAA: // MOV1 C,mem.bit
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
1013 c = mem_bit( pc );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
1014 pc += 2;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
1015 goto loop;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
1016
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
1017 // 16. PROGRAM STATUS FLAG OPERATION COMMANDS.
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
1018
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
1019 case 0x60: // CLRC
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
1020 c = 0;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
1021 goto loop;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
1022
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
1023 case 0x80: // SETC
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
1024 c = ~0;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
1025 goto loop;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
1026
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
1027 case 0xED: // NOTC
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
1028 c ^= 0x100;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
1029 goto loop;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
1030
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
1031 case 0xE0: // CLRV
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
1032 status &= ~(st_v | st_h);
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
1033 goto loop;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
1034
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
1035 case 0x20: // CLRP
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
1036 dp = 0;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
1037 goto loop;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
1038
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
1039 case 0x40: // SETP
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
1040 dp = 0x100;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
1041 goto loop;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
1042
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
1043 /* // seem unused
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
1044 case 0xA0: // EI
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
1045 status |= st_i;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
1046 goto loop;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
1047
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
1048 case 0xC0: // DI
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
1049 status &= ~st_i;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
1050 goto loop;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
1051 */
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
1052
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
1053 // 17. OTHER COMMANDS.
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
1054
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
1055 case 0x00: // NOP
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
1056 goto loop;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
1057
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
1058 //case 0xEF: // SLEEP
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
1059 //case 0xFF: // STOP
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
1060
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
1061 } // switch
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
1062
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
1063 // unhandled instructions fall out of switch so emulator can catch them
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
1064
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
1065 stop:
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
1066 pc--;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
1067
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
1068 {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
1069 int temp;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
1070 CALC_STATUS( temp );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
1071 r.status = temp;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
1072 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
1073
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
1074 r.pc = pc;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
1075 r.sp = GET_SP();
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
1076 r.a = a;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
1077 r.x = x;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
1078 r.y = y;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
1079
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
1080 return remain_;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
1081 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
1082