OSDN Git Service

7af88464742f4685b684967b780bbff09a592b71
[csp-qt/common_source_project-fm7.git] / source / src / vm / hc80 / io.h
1 /*
2         EPSON HC-80 Emulator 'eHC-80'
3
4         Author : Takeda.Toshiya
5         Date   : 2008.03.14 -
6
7         [ i/o ]
8 */
9
10 #ifndef _IO_H_
11 #define _IO_H_
12
13 #include "../vm.h"
14 #include "../../emu.h"
15 #include "../device.h"
16
17 #define SIG_IO_RXRDY    0
18 #define SIG_IO_BARCODE  1
19 #define SIG_IO_TF20     2
20
21 class FIFO;
22
23 class IO : public DEVICE
24 {
25 private:
26         DEVICE *d_cpu, *d_mem, *d_sio, *d_beep, *d_tf20;
27         
28         // registers
29         void update_intr();
30         uint32_t cur_clock;
31         uint8_t bcr, slbcr;
32         uint8_t isr, ier;
33         uint8_t ioctlr;
34         uint32_t icrc, icrb;
35         bool ear;
36         uint8_t vadr, yoff;
37         
38         // 7508
39         void send_to_7508(uint8_t val);
40         uint8_t rec_from_7508();
41         FIFO *cmd7508_buf, *rsp7508_buf;
42         // rtc
43         dll_cur_time_t cur_time;
44         int register_id;
45         bool onesec_intr, onesec_intr_enb;
46         bool alarm_intr, alarm_intr_enb;
47         uint8_t alarm[6];
48         // keyboard
49         void update_key(int code);
50         FIFO *key_buf;
51         bool kb_intr_enb;
52         bool kb_rep_enb, kb_caps;
53         uint8_t kb_rep_spd1, kb_rep_spd2;
54         // beep
55         bool beep;
56         // reset
57         bool res_z80, res_7508;
58         
59         // 6303
60         void process_6303();
61         uint8_t get_point(int x, int y);
62         void draw_point(int x, int y, uint16_t dot);
63         void draw_line(int sx, int sy, int ex, int ey, uint16_t ope);
64         uint8_t cmd6303, psr;
65         FIFO *cmd6303_buf, *rsp6303_buf;
66         uint8_t ram[0x10000];
67         uint8_t basic[0x8000];
68         uint8_t util[0x8000];
69         uint16_t cs_addr;               // character screen starting address
70         uint16_t gs_addr;               // graphics screen starting address
71         uint8_t lcd_on;         // lcd on/off (0=off, others=on)
72         uint8_t scr_mode;               // screen mode (0=graph, others=char)
73         uint16_t scr_ptr;               // screen pointer (8000h-97ffh)
74         uint8_t num_lines;      // number of lines
75         uint8_t curs_mode;      // cursor mode
76         uint8_t curs_x;         // cursor position
77         uint8_t curs_y;
78         uint8_t wnd_ptr_x;      // window pointer
79         uint8_t wnd_ptr_y;
80         uint8_t flash_block;    // block flashing
81         uint8_t cs_blocks;      // for character screen
82         uint8_t cs_block[40][3];
83         uint8_t gs_blocks;      // for graphics screen
84         uint8_t gs_block[144][3];
85         uint8_t font[256*8];
86         uint8_t udgc[256][255+2];
87         uint8_t mov[64][80];
88         uint8_t lcd[SCREEN_HEIGHT][SCREEN_WIDTH];
89         scrntype_t pd, pb;
90         int blink;
91         // tf20
92         FIFO *tf20_buf;
93         
94         // ramdisk
95         int device_type;
96         
97         // externam ram disk
98         uint8_t ext[0x40000];
99         uint32_t extar;
100         uint8_t extcr;
101         
102         // intelligent ram disk
103         void iramdisk_write_data(uint8_t val);
104         void iramdisk_write_cmd(uint8_t val);
105         uint8_t iramdisk_read_data();
106         uint8_t iramdisk_read_stat();
107         uint8_t iramdisk_sectors[15][64][128];
108         uint8_t iramdisk_cmd;
109         int iramdisk_count,iramdisk_dest;
110         uint8_t iramdisk_buf[130];
111         uint8_t *iramdisk_ptr;
112
113         int tmp_iramdisk_size;
114 public:
115         IO(VM_TEMPLATE* parent_vm, EMU* parent_emu) : DEVICE(parent_vm, parent_emu)
116         {
117                 set_device_name(_T("I/O Bus"));
118         }
119         ~IO() {}
120         
121         // common functions
122         void initialize();
123         void release();
124         void reset();
125         void sysreset();
126         void write_signal(int id, uint32_t data, uint32_t mask);
127         void event_frame();
128         void event_callback(int event_id, int err);
129         void write_io8(uint32_t addr, uint32_t data);
130         uint32_t read_io8(uint32_t addr);
131         uint32_t get_intr_ack();
132         void decl_state();
133         void save_state(FILEIO* state_fio);
134         bool load_state(FILEIO* state_fio);
135         
136         // unique functions
137         void set_context_cpu(DEVICE* device)
138         {
139                 d_cpu = device;
140         }
141         void set_context_mem(DEVICE* device)
142         {
143                 d_mem = device;
144         }
145         void set_context_sio(DEVICE* device)
146         {
147                 d_sio = device;
148         }
149         void set_context_beep(DEVICE* device)
150         {
151                 d_beep = device;
152         }
153         void set_context_tf20(DEVICE* device)
154         {
155                 d_tf20 = device;
156         }
157         void draw_screen();
158         void key_down(int code);
159         void key_up(int code);
160 };
161
162 #endif