OSDN Git Service

[VM][STATE] Apply new state framework to MZ80B, MZ2200 and MZ2500.
[csp-qt/common_source_project-fm7.git] / source / src / vm / mz2500 / mz1r13.cpp
1 /*
2         SHARP MZ-80B Emulator 'EmuZ-80B'
3         SHARP MZ-2200 Emulator 'EmuZ-2200'
4         SHARP MZ-2500 Emulator 'EmuZ-2500'
5
6         Author : Takeda.Toshiya
7         Date   : 2006.12.01 -
8
9         [ MZ-1R13 (Kanji ROM) ]
10 */
11
12 #include "mz1r13.h"
13
14 void MZ1R13::initialize()
15 {
16         // load rom images
17         memset(kanji, 0xff, sizeof(kanji));
18         memset(dic, 0xff, sizeof(dic));
19         
20         FILEIO* fio = new FILEIO();
21         if(fio->Fopen(create_local_path(_T("MZ-1R13_KAN.ROM")), FILEIO_READ_BINARY) || 
22            fio->Fopen(create_local_path(_T("KANJI2.ROM")), FILEIO_READ_BINARY)) {
23                 fio->Fread(kanji, sizeof(kanji), 1);
24                 fio->Fclose();
25         }
26         if(fio->Fopen(create_local_path(_T("MZ-1R13_DIC.ROM")), FILEIO_READ_BINARY)) {
27                 fio->Fread(dic, sizeof(dic), 1);
28                 fio->Fclose();
29         }
30         delete fio;
31         
32         address = 0;
33         select_kanji = true;
34 }
35
36 void MZ1R13::write_io8(uint32_t addr, uint32_t data)
37 {
38         switch(addr & 0xff) {
39         case 0xb8:
40                 address = (address & 0xff00) | (data << 0);
41                 break;
42         case 0xb9:
43                 address = (address & 0x00ff) | (data << 8);
44                 break;
45         case 0xba:
46                 select_kanji = ((data & 1) != 0);
47                 break;
48         case 0xbb:
49                 address++;
50                 break;
51         }
52 }
53
54 uint32_t MZ1R13::read_io8(uint32_t addr)
55 {
56         uint32_t offset = (address << 1) | (addr & 1);
57         uint8_t value = select_kanji ? kanji[offset & 0x1ffff] : dic[offset & 0x3fff];
58         
59         switch(addr & 0xff) {
60         case 0xb9:
61                 address++;
62         case 0xb8:
63                 return value;
64         case 0xbb:
65                 address++;
66         case 0xba:
67                 return ((value >> 7) & 0x01) | ((value >> 5) & 0x02) | ((value >> 3) & 0x04) | ((value >> 1) & 0x08) |
68                        ((value << 1) & 0x10) | ((value << 3) & 0x20) | ((value << 5) & 0x40) | ((value << 7) & 0x80);
69         }
70         return 0xff;
71 }
72
73 #define STATE_VERSION   1
74
75 #include "../../statesub.h"
76
77 void MZ1R13::decl_state()
78 {
79         enter_decl_state(STATE_VERSION);
80
81         DECL_STATE_ENTRY_UINT16(address);
82         DECL_STATE_ENTRY_BOOL(select_kanji);
83         
84         leave_decl_state();
85 }
86
87 void MZ1R13::save_state(FILEIO* state_fio)
88 {
89         if(state_entry != NULL) {
90                 state_entry->save_state(state_fio);
91         }
92 //      state_fio->FputUint32(STATE_VERSION);
93 //      state_fio->FputInt32(this_device_id);
94         
95 //      state_fio->FputUint16(address);
96 //      state_fio->FputBool(select_kanji);
97 }
98
99 bool MZ1R13::load_state(FILEIO* state_fio)
100 {
101         bool mb = false;
102         if(state_entry != NULL) {
103                 mb = state_entry->load_state(state_fio);
104         }
105         if(!mb) {
106                 return false;
107         }
108 //      if(state_fio->FgetUint32() != STATE_VERSION) {
109 //              return false;
110 //      }
111 //      if(state_fio->FgetInt32() != this_device_id) {
112 //              return false;
113 //      }
114 //      address = state_fio->FgetUint16();
115 //      select_kanji = state_fio->FgetBool();
116         return true;
117 }
118