OSDN Git Service

[VM][FM7] Disk/2DD : Fix applied machines definition.
[csp-qt/common_source_project-fm7.git] / source / src / vm / dummydevice.cpp
1 /*
2  * I/O termination dummy [dummydevice.cpp]
3  * 
4  * Author: K.Ohta <whatisthis.sowhat _at_ gmail.com>
5  * License: GPLv2
6  * History:
7  *   Jul 30, 2015 : Initial
8  *
9  */
10
11 #include "dummydevice.h"
12
13
14 DUMMYDEVICE::DUMMYDEVICE(VM* parent_vm, EMU* parent_emu) : DEVICE(parent_vm, parent_emu)
15 {
16         status = 0x00000000;
17         clear_on_reset = true;
18         clear_with_zero = true;
19 }
20
21 DUMMYDEVICE::~DUMMYDEVICE()
22 {
23 }
24
25 uint32 DUMMYDEVICE::read_signal(int id)
26 {
27
28         if((id >= SIG_DUMMYDEVICE_BIT0) && (id <= SIG_DUMMYDEVICE_BIT31)) {
29                 if((status & (1 << (id - SIG_DUMMYDEVICE_BIT0))) != 0) {
30                         return 0xffffffff;
31                 } else {
32                         return 0x00000000;
33                 }
34         } else if(id == SIG_DUMMYDEVICE_READWRITE) {
35                 return status;
36         } else if(id == SIG_DUMMYDEVICE_CLEAR_ON_RESET) {
37                 return (clear_on_reset) ? 0xffffffff : 0x00000000;
38         } else if(id == SIG_DUMMYDEVICE_CLEAR_WITH_ZERO) {
39                 return (clear_with_zero) ? 0xffffffff : 0x00000000;
40         }
41         return 0;
42 }
43
44 void DUMMYDEVICE::write_signal(int id, uint32 data, uint32 mask)
45 {
46         if((id >= SIG_DUMMYDEVICE_BIT0) && (id <= SIG_DUMMYDEVICE_BIT31)) {
47                 bool flag = ((data & mask) != 0);
48                 if(flag) {
49                         status |= (1 << (id - SIG_DUMMYDEVICE_BIT0));
50                 } else {
51                         status &= ~(1 << (id - SIG_DUMMYDEVICE_BIT0));
52                 }                       
53         } else if(id == SIG_DUMMYDEVICE_READWRITE) {
54                 status = data & mask;
55         } else if(id == SIG_DUMMYDEVICE_CLEAR_ON_RESET) {
56                 clear_on_reset = ((data & mask) != 0);
57         } else if(id == SIG_DUMMYDEVICE_CLEAR_WITH_ZERO) {
58                 clear_with_zero = ((data & mask) != 0);
59         }
60         return;
61 }
62
63 void DUMMYDEVICE::reset()
64 {
65         if(clear_on_reset) {
66                 if(clear_with_zero) {
67                         status = 0;
68                 } else {
69                         status = 0xffffffff;
70                 }
71         }
72 }
73
74 #define STATE_VERSION 1
75 void DUMMYDEVICE::save_state(FILEIO *state_fio)
76 {
77         state_fio->FputUint32_BE(STATE_VERSION);
78         state_fio->FputInt32_BE(this_device_id);
79         // Version 1
80         {
81                 state_fio->FputUint32_BE(status);
82                 state_fio->FputBool(clear_on_reset);
83                 state_fio->FputBool(clear_with_zero);
84         }
85 }
86
87 bool DUMMYDEVICE::load_state(FILEIO *state_fio)
88 {
89         uint32 version;
90         version = state_fio->FgetUint32_BE();
91         if(this_device_id != state_fio->FgetInt32_BE()) return false;
92         // Version 1
93         if((version < 1) || (version > STATE_VERSION)) return false;
94         {
95                 status = state_fio->FgetUint32_BE();
96                 clear_on_reset = state_fio->FgetBool();
97                 clear_with_zero = state_fio->FgetBool();
98         }
99         return true;
100 }