OSDN Git Service

[VM][STATE] Use namespace {VMNAME} to separate per VMs.
[csp-qt/common_source_project-fm7.git] / source / src / vm / qc10 / mfont.cpp
1 /*
2         EPSON QC-10 Emulator 'eQC-10'
3
4         Author : Takeda.Toshiya
5         Date   : 2008.03.24 -
6
7         [ multifont rom card ]
8 */
9
10 #include "mfont.h"
11 #include "../i8259.h"
12 #include "../../fifo.h"
13
14 #define BIT_IBF 0x80
15 #define BIT_ERR 2
16 #define BIT_OBF 1
17
18 namespace QC10 {
19
20 void MFONT::initialize()
21 {
22         memset(mfont, 0xff, sizeof(mfont));
23         
24         // load multifont rom image
25         FILEIO* fio = new FILEIO();
26         if(fio->Fopen(create_local_path(_T("MFONT.ROM")), FILEIO_READ_BINARY)) {
27                 fio->Fread(mfont, sizeof(mfont), 1);
28                 fio->Fclose();
29         }
30         delete fio;
31         
32         cmd = new FIFO(4);
33         res = new FIFO(38);
34         
35         status = 0;
36 }
37
38 void MFONT::release()
39 {
40         cmd->release();
41         delete cmd;
42         res->release();
43         delete res;
44 }
45
46 void MFONT::write_io8(uint32_t addr, uint32_t data)
47 {
48         switch(addr & 0xff) {
49         case 0xfc:
50                 cmd->write(data);
51                 if(cmd->count() == 3) {
52                         int mode = cmd->read();
53                         int code = cmd->read();
54                         code |= cmd->read() << 8;
55                         
56                         if(0x200 <= code && code < 0xc00) {
57                                 int ofs = (code - 0x200) * 36;
58                                 res->clear();
59                                 res->write(0x40);
60                                 for(int i = 0; i < 36; i++) {
61                                         res->write(mfont[ofs + i]);
62                                 }
63                                 status = BIT_IBF | BIT_OBF;
64                                 d_pic->write_signal(SIG_I8259_IR7 | SIG_I8259_CHIP1, 1, 1);
65                         } else {
66                                 // error
67                                 status = BIT_ERR;
68                         }
69                 }
70                 break;
71         case 0xfd:
72                 // set irq
73                 d_pic->write_signal(SIG_I8259_IR7 | SIG_I8259_CHIP1, 1, 1);
74                 break;
75         }
76 }
77
78 uint32_t MFONT::read_io8(uint32_t addr)
79 {
80         uint32_t val;
81         
82         switch(addr & 0xff) {
83         case 0xfc:
84                 val = res->read();
85                 if(res->empty()) {
86                         status = 0;
87                 }
88                 return val;
89         case 0xfd:
90                 // reset irq
91                 d_pic->write_signal(SIG_I8259_IR7 | SIG_I8259_CHIP1, 0, 1);
92                 return status;
93         }
94         return 0xff;
95 }
96
97 #define STATE_VERSION   1
98
99 bool MFONT::process_state(FILEIO* state_fio, bool loading)
100 {
101         if(!state_fio->StateCheckUint32(STATE_VERSION)) {
102                 return false;
103         }
104         if(!state_fio->StateCheckInt32(this_device_id)) {
105                 return false;
106         }
107         state_fio->StateUint8(status);
108         if(!cmd->process_state((void *)state_fio, loading)) {
109                 return false;
110         }
111         if(!res->process_state((void *)state_fio, loading)) {
112                 return false;
113         }
114         return true;
115 }
116
117 }