annotate Plugins/Input/console/Nes_Cpu.h @ 352:f13ab2d8e9cf trunk

[svn] various fixes :(
author nenolod
date Mon, 26 Dec 2005 14:12:35 -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 // Nintendo Entertainment System (NES) 6502 CPU emulator
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 // Game_Music_Emu 0.2.4. Copyright (C) 2003-2005 Shay Green. GNU LGPL license.
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 #ifndef NES_CPU_H
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
7 #define NES_CPU_H
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
8
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
9 #include "blargg_common.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 typedef long nes_time_t; // clock cycle count
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
12 typedef unsigned nes_addr_t; // 16-bit address
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
13
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
14 class Nsf_Emu;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
15
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
16 #ifndef NES_CPU_IRQ_SUPPORT
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
17 #define NES_CPU_IRQ_SUPPORT 0
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
18 #endif
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
19
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
20 class Nes_Cpu {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
21 typedef BOOST::uint8_t uint8_t;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
22 enum { page_bits = 11 };
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
23 enum { page_count = 0x10000 >> page_bits };
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
24 const uint8_t* code_map [page_count + 1];
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
25 public:
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
26 Nes_Cpu();
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
27
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
28 // Clear registers, unmap memory, and map code pages to unmapped_page.
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
29 void reset( const void* unmapped_page = NULL );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
30
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
31 // Memory read/write function types. Reader must return value from 0 to 255.
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
32 Nsf_Emu* callback_data;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
33 typedef int (*reader_t)( Nsf_Emu* callback_data, nes_addr_t );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
34 typedef void (*writer_t)( Nsf_Emu* callback_data, nes_addr_t, int value );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
35
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
36 // Memory mapping functions take a block of memory of specified 'start' address
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
37 // and 'size' in bytes. Both start address and size must be a multiple of page_size.
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
38 enum { page_size = 1L << page_bits };
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
39
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
40 // Map code memory to 'code' (memory accessed via the program counter)
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
41 void map_code( nes_addr_t start, unsigned long size, const void* code );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
42
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
43 // Map data memory to read and write functions
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
44 void map_memory( nes_addr_t start, unsigned long size, reader_t, writer_t );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
45
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
46 // Access memory as the emulated CPU does.
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
47 int read( nes_addr_t );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
48 void write( nes_addr_t, int value );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
49 uint8_t* get_code( nes_addr_t );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
50
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
51 // NES 6502 registers. *Not* kept updated during a call to run().
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
52 struct registers_t {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
53 BOOST::uint16_t pc;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
54 uint8_t a;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
55 uint8_t x;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
56 uint8_t y;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
57 uint8_t status;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
58 uint8_t sp;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
59 } r;
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 // Reasons that run() returns
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
62 enum result_t {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
63 result_cycles, // Requested number of cycles (or more) were executed
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
64 result_cli, // I flag cleared
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
65 result_badop // unimplemented/illegal instruction
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
66 };
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
67
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
68 // Run CPU to or after end_time, or until a stop reason from above
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
69 // is encountered. Return the reason for stopping.
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
70 result_t run( nes_time_t end_time );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
71
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
72 nes_time_t time() const { return base_time + cycle_count; }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
73 void time( nes_time_t t );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
74 nes_time_t end_time() const { return base_time + cycle_limit; }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
75 void end_frame( nes_time_t );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
76 #if NES_CPU_IRQ_SUPPORT
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
77 void end_time( nes_time_t t ) { cycle_limit = t - base_time; }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
78 #endif
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
79
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
80 private:
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
81 // noncopyable
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
82 Nes_Cpu( const Nes_Cpu& );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
83 Nes_Cpu& operator = ( const Nes_Cpu& );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
84
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
85 nes_time_t cycle_count;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
86 nes_time_t base_time;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
87 #if NES_CPU_IRQ_SUPPORT
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
88 nes_time_t cycle_limit;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
89 #else
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
90 enum { cycle_limit = 0 };
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
91 #endif
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 reader_t data_reader [page_count + 1]; // extra entry to catch address overflow
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
94 writer_t data_writer [page_count + 1];
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
95
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
96 public:
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
97 // low_mem is a full page size so it can be mapped with code_map
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
98 uint8_t low_mem [page_size > 0x800 ? page_size : 0x800];
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
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
101 inline BOOST::uint8_t* Nes_Cpu::get_code( nes_addr_t addr ) {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
102 return (uint8_t*) &code_map [(addr) >> page_bits] [(addr) & (page_size - 1)];
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
103 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
104
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
105 #if NES_CPU_IRQ_SUPPORT
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
106 inline void Nes_Cpu::time( nes_time_t t ) {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
107 t -= time();
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
108 cycle_limit -= t;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
109 base_time += t;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
110 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
111 #else
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
112 inline void Nes_Cpu::time( nes_time_t t ) {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
113 cycle_count = t - base_time;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
114 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
115 #endif
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 inline void Nes_Cpu::end_frame( nes_time_t end_time ) {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
118 base_time -= end_time;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
119 assert( time() >= 0 );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
120 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
121
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
122 #endif
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
123