annotate Plugins/Input/console/Gb_Cpu.h @ 334:0daaddb10914 trunk

[svn] Implement GYM playback.
author chainsaw
date Sun, 25 Dec 2005 13:31:46 -0800
parents 252843aac42f
children 7c5e886205ef
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
90
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
1
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
2 // Nintendo Game Boy 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 GB_CPU_H
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
7 #define GB_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 unsigned gb_addr_t; // 16-bit address
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
12
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
13 class Gbs_Emu;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
14
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
15 // Game Boy CPU emulator. Currently treats every instruction as taking 4 cycles.
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
16 class Gb_Cpu {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
17 typedef BOOST::uint8_t uint8_t;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
18 enum { page_bits = 8 };
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
19 enum { page_count = 0x10000 >> page_bits };
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
20 const uint8_t* code_map [page_count + 1];
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
21 long remain_;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
22 public:
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
23 Gb_Cpu();
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
24
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
25 // Set all registers to 0, unmap all memory, and map all code pages
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
26 // to unmapped_page.
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
27 void reset( const void* unmapped_page = NULL );
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 // Memory read/write function types. Memory reader return value must be 0 to 255.
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
30 Gbs_Emu* callback_data; // passed to memory read/write functions
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
31 typedef int (*reader_t)( Gbs_Emu* callback_data, gb_addr_t );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
32 typedef void (*writer_t)( Gbs_Emu* callback_data, gb_addr_t, int );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
33
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
34 // 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
35 // 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
36 enum { page_size = 1L << page_bits };
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
37
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
38 // 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
39 void map_code( gb_addr_t start, unsigned long size, const void* code );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
40
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
41 // Map data memory to read and write functions
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
42 void map_memory( gb_addr_t start, unsigned long size, reader_t, writer_t );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
43
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
44 // Access memory as the emulated CPU does.
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
45 int read( gb_addr_t );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
46 void write( gb_addr_t, int data );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
47 uint8_t* get_code( gb_addr_t ); // for use in a debugger
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 // Game Boy Z80 registers. *Not* kept updated during a call to run().
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
50 struct registers_t {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
51 BOOST::uint16_t pc;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
52 BOOST::uint16_t sp;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
53 uint8_t flags;
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 b;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
56 uint8_t c;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
57 uint8_t d;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
58 uint8_t e;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
59 uint8_t h;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
60 uint8_t l;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
61 } r;
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 // Interrupt enable flag set by EI and cleared by DI.
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
64 bool interrupts_enabled;
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 // Base address for RST vectors (normally 0).
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
67 gb_addr_t rst_base;
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 // Reasons that run() returns
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
70 enum result_t {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
71 result_cycles, // Requested number of cycles (or more) were executed
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
72 result_halt, // PC is at HALT instruction
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
73 result_badop // PC is at bad (unimplemented) instruction
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
74 };
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
75
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
76 // Run CPU for at least 'count' cycles, or until one of the above conditions
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
77 // arises. Return reason for stopping.
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
78 result_t run( long count );
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 // Number of clock cycles remaining for current run() call.
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
81 long remain() const;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
82
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
83 private:
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
84 // noncopyable
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
85 Gb_Cpu( const Gb_Cpu& );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
86 Gb_Cpu& operator = ( const Gb_Cpu& );
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 reader_t data_reader [page_count + 1]; // extra entry to catch overflow addresses
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
89 writer_t data_writer [page_count + 1];
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
90 };
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
91
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
92 inline long Gb_Cpu::remain() const {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
93 return remain_;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
94 }
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 #endif
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
97