OSDN Git Service

6959ab2972212d8a3dd8d41128c8813cde04ceba
[csp-qt/common_source_project-fm7.git] / source / src / vm / mz2800 / serial.cpp
1 /*
2         SHARP MZ-2800 Emulator 'EmuZ-2800'
3
4         Author : Takeda.Toshiya
5         Date   : 2015.01.17 -
6
7         [ serial ]
8 */
9
10 #include "serial.h"
11 #include "../z80sio.h"
12
13 void SERIAL::reset()
14 {
15         addr_a0 = true;
16 }
17
18 void SERIAL::write_io8(uint32_t addr, uint32_t data)
19 {
20         switch(addr & 0xff) {
21         case 0xa0:
22         case 0xa1:
23         case 0xa2:
24         case 0xa3:
25                 if(addr_a0) {
26                         d_sio->write_io8(addr, data);
27                 }
28                 break;
29         case 0xb0:
30         case 0xb1:
31         case 0xb2:
32         case 0xb3:
33                 if(!addr_a0) {
34                         d_sio->write_io8(addr, data);
35                 }
36                 break;
37         case 0xcd:
38                 addr_a0 = ((data & 0x80) == 0);
39                 d_sio->set_tx_clock(0, (4000000.0 / 13.0) / (1 << ((data >> 3) & 7)));
40                 d_sio->set_rx_clock(0, (4000000.0 / 13.0) / (1 << ((data >> 3) & 7)));
41                 d_sio->set_tx_clock(1, (4000000.0 / 13.0) / (1 << ((data >> 0) & 7)));
42                 d_sio->set_rx_clock(1, (4000000.0 / 13.0) / (1 << ((data >> 0) & 7)));
43                 break;
44         }
45 }
46
47 uint32_t SERIAL::read_io8(uint32_t addr)
48 {
49         switch(addr & 0xff) {
50         case 0xa0:
51         case 0xa1:
52         case 0xa2:
53         case 0xa3:
54                 if(addr_a0) {
55                         return d_sio->read_io8(addr);
56                 }
57                 break;
58         case 0xb0:
59         case 0xb1:
60         case 0xb2:
61         case 0xb3:
62                 if(!addr_a0) {
63                         return d_sio->read_io8(addr);
64                 }
65                 break;
66         }
67         return 0xff;
68 }
69
70 #define STATE_VERSION   1
71
72 bool SERIAL::process_state(FILEIO* state_fio, bool loading)
73 {
74         if(!state_fio->StateCheckUint32(STATE_VERSION)) {
75                 return false;
76         }
77         if(!state_fio->StateCheckInt32(this_device_id)) {
78                 return false;
79         }
80         state_fio->StateBool(addr_a0);
81         return true;
82 }