OSDN Git Service

[VM][I286] Save cpustate without StateBuffer().
[csp-qt/common_source_project-fm7.git] / source / src / vm / hc20 / memory.h
1 /*
2         EPSON HC-20 Emulator 'eHC-20'
3
4         Author : Takeda.Toshiya
5         Date   : 2011.05.23-
6
7         [ memory ]
8 */
9
10 #ifndef _HC20_MEMORY_H_
11 #define _HC20_MEMORY_H_
12
13 #include "../vm.h"
14 #include "../../emu.h"
15 #include "../device.h"
16
17 #define SIG_MEMORY_PORT_2       0
18 #define SIG_MEMORY_PORT_3       1
19 #define SIG_MEMORY_PORT_4       2
20 #define SIG_MEMORY_SIO_MAIN     3
21 #define SIG_MEMORY_SIO_TF20     4
22 #define SIG_MEMORY_RTC_IRQ      5
23
24 #define CMT_BUFFER_SIZE         0x40000
25
26 class BEEP;
27 class FIFO;
28
29 class HC20_MEMORY : public DEVICE
30 {
31 private:
32         BEEP *d_beep;
33         DEVICE *d_cpu, *d_rtc, *d_sio_tf20;
34         
35         uint8_t wdmy[0x2000];
36         uint8_t rdmy[0x2000];
37         uint8_t* wbank[8];
38         uint8_t* rbank[8];
39         
40         // memory with expansion unit
41         uint8_t ram[0x8000];    // 0000h-7fffh
42         uint8_t rom[0x8000];    // 8000h-ffffh (internal)
43         uint8_t ext[0x4000];    // 8000h-bfffh
44         
45         FIFO *cmd_buf;
46         bool sio_select;
47         bool special_cmd_masked;
48         uint8_t slave_mem[0x10000];
49         
50         struct {
51                 double freq;
52                 int period;
53                 int remain;
54         } sound[256];
55         int sound_ptr;
56         int sound_count;
57         uint8_t sound_reply;
58         double sound_freq;
59         double tone_table[57];
60         
61         uint8_t key_stat[256], key_flag[256];
62         int key_data, key_strobe, key_intmask;
63         
64         FILEIO* cmt_fio;
65         bool cmt_play, cmt_rec;
66         _TCHAR cmt_file_path[_MAX_PATH];
67         int cmt_count;
68         uint8_t cmt_buffer[CMT_BUFFER_SIZE];
69         
70         typedef struct {
71                 uint8_t buffer[80];
72                 int bank;
73                 int addr;
74         } lcd_t;
75         lcd_t lcd[6];
76         
77         scrntype_t lcd_render[32][120];
78         scrntype_t pd, pb;
79         uint8_t lcd_select, lcd_data;
80         int lcd_clock;
81         
82         int int_status;
83         int int_mask;
84
85         bool tmp_wbank_is_ext;
86         bool tmp_rbank_is_ext;
87         
88         void update_sound();
89         void update_keyboard();
90         void update_intr();
91         void send_to_slave(uint8_t val);
92         void send_to_main(uint8_t val);
93         
94 public:
95         HC20_MEMORY(VM_TEMPLATE* parent_vm, EMU* parent_emu) : DEVICE(parent_vm, parent_emu)
96         {
97                 set_device_name(_T("Memory Bus"));
98         }
99         ~HC20_MEMORY() {}
100         
101         // common functions
102         void initialize();
103         void release();
104         void reset();
105         void write_data8(uint32_t addr, uint32_t data);
106         uint32_t read_data8(uint32_t addr);
107         void write_signal(int id, uint32_t data, uint32_t mask);
108         void event_callback(int event_id, int err);
109         bool process_state(FILEIO* state_fio, bool loading);
110         
111         // unique functions
112         void set_context_beep(BEEP* device)
113         {
114                 d_beep = device;
115         }
116         void set_context_cpu(DEVICE* device)
117         {
118                 d_cpu = device;
119         }
120         void set_context_rtc(DEVICE* device)
121         {
122                 d_rtc = device;
123         }
124         void set_context_sio_tf20(DEVICE* device)
125         {
126                 d_sio_tf20 = device;
127         }
128         void notify_power_off();
129         void key_down(int code);
130         void key_up(int code);
131         void play_tape(const _TCHAR* file_path);
132         void rec_tape(const _TCHAR* file_path);
133         void close_tape();
134         bool is_tape_inserted()
135         {
136                 return (cmt_play || cmt_rec);
137         }
138         void draw_screen();
139 };
140
141 #endif
142