OSDN Git Service

dea0a9a25a857eb9ca3b86cb912be808ff0d39e5
[csp-qt/common_source_project-fm7.git] / source / src / vm / mz700 / kanji.cpp
1 /*
2         SHARP MZ-700 Emulator 'EmuZ-700'
3         SHARP MZ-800 Emulator 'EmuZ-800'
4         SHARP MZ-1500 Emulator 'EmuZ-1500'
5
6         Author : Takeda.Toshiya
7         Date   : 2014.12.26-
8
9         [ kanji/dictionary rom ]
10 */
11
12 #include "kanji.h"
13
14 void KANJI::initialize()
15 {
16         memset(kanji, 0xff, sizeof(kanji));
17         memset(dic, 0xff, sizeof(dic));
18         
19         // load rom images
20         FILEIO* fio = new FILEIO();
21         if(fio->Fopen(create_local_path(_T("KANJI.ROM")), FILEIO_READ_BINARY)) {
22                 fio->Fread(kanji, sizeof(kanji), 1);
23                 fio->Fclose();
24         } else if(fio->Fopen(create_local_path(_T("MZ1R23.ROM")), FILEIO_READ_BINARY)) {
25                 fio->Fread(kanji, sizeof(kanji), 1);
26                 fio->Fclose();
27         }
28         if(fio->Fopen(create_local_path(_T("DICT.ROM")), FILEIO_READ_BINARY)) {
29                 fio->Fread(dic, sizeof(dic), 1);
30                 fio->Fclose();
31         } else if(fio->Fopen(create_local_path(_T("MZ1R24.ROM")), FILEIO_READ_BINARY)) {
32                 fio->Fread(dic, sizeof(dic), 1);
33                 fio->Fclose();
34         }
35         delete fio;
36 }
37
38 void KANJI::reset()
39 {
40         control_reg = kanji_addr = dic_addr = 0;
41 }
42
43 void KANJI::write_io8(uint32_t addr, uint32_t data)
44 {
45         switch(addr & 0xff) {
46         case 0xb8:
47                 control_reg = data;
48                 break;
49         case 0xb9:
50                 dic_addr = (addr & 0xff00) | data;
51                 kanji_addr = dic_addr << 5;
52                 break;
53         }
54 }
55
56 uint32_t KANJI::read_io8(uint32_t addr)
57 {
58         uint32_t val;
59         
60         switch(addr & 0xff) {
61         case 0xb9:
62                 if(control_reg & 0x80) {
63                         val = kanji[(kanji_addr++) & 0x1ffff];
64                 } else {
65                         val = dic[((control_reg & 3) << 16) | ((dic_addr++) & 0xffff)];
66                 }
67                 if(control_reg & 0x40) {
68                         val = ((val & 0x80) >> 7) | ((val & 0x40) >> 5) | ((val & 0x20) >> 3) | ((val & 0x10) >> 1) | ((val & 8) << 1) | ((val & 4) << 3) | ((val & 2) << 5) | ((val & 1) << 7);
69                 }
70                 return val;
71         }
72         return 0xff;
73 }
74
75 #define STATE_VERSION   1
76
77 #include "../../statesub.h"
78
79 void KANJI::decl_state()
80 {
81         enter_decl_state(STATE_VERSION);
82         
83         DECL_STATE_ENTRY_UINT32(control_reg);
84         DECL_STATE_ENTRY_UINT32(kanji_addr);
85         DECL_STATE_ENTRY_UINT32(dic_addr);
86         
87         leave_decl_state();
88 }
89
90 void KANJI::save_state(FILEIO* state_fio)
91 {
92         if(state_entry != NULL) {
93                 state_entry->save_state(state_fio);
94         }
95 //      state_fio->FputUint32(STATE_VERSION);
96 //      state_fio->FputInt32(this_device_id);
97         
98 //      state_fio->FputUint32(control_reg);
99 //      state_fio->FputUint32(kanji_addr);
100 //      state_fio->FputUint32(dic_addr);
101 }
102
103 bool KANJI::load_state(FILEIO* state_fio)
104 {
105         bool mb = false;
106         if(state_entry != NULL) {
107                 mb = state_entry->load_state(state_fio);
108         }
109         if(!mb) {
110                 return false;
111         }
112 //      if(state_fio->FgetUint32() != STATE_VERSION) {
113 //              return false;
114 //      }
115 //      if(state_fio->FgetInt32() != this_device_id) {
116 //              return false;
117 //      }
118 //      control_reg = state_fio->FgetUint32();
119 //      kanji_addr = state_fio->FgetUint32();
120 //      dic_addr = state_fio->FgetUint32();
121         return true;
122 }
123
124 bool KANJI::process_state(FILEIO* state_fio, bool loading)
125 {
126         if(!state_fio->StateCheckUint32(STATE_VERSION)) {
127                 return false;
128         }
129         if(!state_fio->StateCheckInt32(this_device_id)) {
130                 return false;
131         }
132         state_fio->StateUint32(control_reg);
133         state_fio->StateUint32(kanji_addr);
134         state_fio->StateUint32(dic_addr);
135         return true;
136 }