|
|
1.1 root 1: //
2: // nono
3: // Copyright (C) 2022 nono project
4: // Licensed under nono-license.txt
5: //
6:
7: //
8: // DIPSW
9: //
10:
11: #include "dipsw.h"
12: #include "config.h"
13: #include "mainapp.h"
14:
15: //
16: // DIPSW 共通クラス
17: //
18:
19: // コンストラクタ
20: DipswDevice::DipswDevice(int size_)
21: : inherited(OBJ_DIPSW)
22: {
23: dipsw.resize(size_);
24: }
25:
26: // デストラクタ
27: DipswDevice::~DipswDevice()
28: {
29: }
30:
31: // 値を設定。true/false の意味は機種依存。
32: void
1.1.1.2 ! root 33: DipswDevice::Set(uint n, bool val)
1.1 root 34: {
1.1.1.2 ! root 35: assertmsg(n < dipsw.size(),
! 36: "n=%u size=%zu: out of range", n, dipsw.size());
1.1 root 37:
38: dipsw[n] = val;
39: }
40:
41: // 値を取得。true/false の意味は機種依存。
42: bool
1.1.1.2 ! root 43: DipswDevice::Get(uint n) const
1.1 root 44: {
1.1.1.2 ! root 45: assertmsg(n < dipsw.size(),
! 46: "n=%u size=%zu: out of range", n, dipsw.size());
1.1 root 47:
48: return dipsw[n];
49: }
50:
51: // 位置を設定。pos は 0 が上、1 が下。
52: void
1.1.1.2 ! root 53: DipswDevice::SetPosition(uint n, uint pos)
1.1 root 54: {
55: bool val;
56:
57: if (upside == true) {
58: val = (pos == 0) ? true : false;
59: } else {
60: val = (pos == 0) ? false : true;
61: }
62: Set(n, val);
63: }
64:
65: // 位置を取得。戻り値は 0 が上、1 が下。
66: int
1.1.1.2 ! root 67: DipswDevice::GetPosition(uint n) const
1.1 root 68: {
69: bool val = Get(n);
70: int pos;
71:
72: if (upside == true) {
73: pos = (val ? 0 : 1);
74: } else {
75: pos = (val ? 1 : 0);
76: }
77: return pos;
78: }
79:
80:
81: //
82: // DIPSW (LUNA)
83: //
84:
85: // LUNA の DIPSW は #1, #2 にそれぞれ8個、計16個ある。
86: // DIPSW #1, #2 が設定ファイルの luna-dipsw{1,2} に対応する。
87: // luna-dipsw{1,2} はいずれも "0"/"1" を8つ並べた文字列であり、
88: // 先頭が本体表記でいう 1番、末尾側が本体表記でいう 8番に対応する。
89: // 値は "0" が down、"1" が up を表す。
90: //
91: // DipswDevice 内ではこの設定を読み込んで dipsw[0..15] として保持している。
92: // dipsw[0] が本体表記 #1-1 番、dipsw[15] が本体表記 #2-8 番に対応する。
93: // 値は false が down("0")、true が up("1") に対応する。
94:
95: // コンストラクタ
96: LunaDipswDevice::LunaDipswDevice()
97: : inherited(16)
98: {
99: // 上が true の方向。
100: upside = true;
101:
102: // LUNA-I と LUNA-88K で使いやすいように初期値を変えておく。
103: if (gMainApp.IsLUNA1()) {
104: gConfig->SetDefault("luna-dipsw1", "11110111");
105: } else {
106: gConfig->SetDefault("luna-dipsw1", "11111111");
107: }
108:
109: // DIPSW#2 はユーザ定義(?)なので(今の所?)どちらも共通。
110: gConfig->SetDefault("luna-dipsw2", "11111111");
111: }
112:
113: // デストラクタ
114: LunaDipswDevice::~LunaDipswDevice()
115: {
116: }
117:
118: // 初期化
119: bool
120: LunaDipswDevice::Init()
121: {
122: if (inherited::Init() == false) {
123: return false;
124: }
125:
126: const ConfigItem& item1 = gConfig->Find("luna-dipsw1");
127: const std::string& str1 = item1.AsString();
128: if (str1.size() != 8) {
129: item1.Err("must be 8 digits");
130: return false;
131: }
132:
133: const ConfigItem& item2 = gConfig->Find("luna-dipsw2");
134: const std::string& str2 = item2.AsString();
135: if (str2.size() != 8) {
136: item2.Err("must be 8 digits");
137: return false;
138: }
139:
140: for (int i = 0; i < 8; i++) {
141: dipsw[i] = (str1[i] != '0');
142: dipsw[i + 8] = (str2[i] != '0');
143: }
144:
145: // LUNA-I/LUNA-88K とも DIP#1-1 を up(=true) で自動起動。
146: bool val;
147: const ConfigItem& item_autoboot = gConfig->Find("dipsw-autoboot");
148: const std::string& autoboot = item_autoboot.AsString();
149: if (autoboot.empty() == false) {
150: if (autoboot == "yes") {
151: val = true;
152: } else if (autoboot == "no") {
153: val = false;
154: } else {
155: item_autoboot.Err();
156: return false;
157: }
158: dipsw[0] = val;
159: }
160:
161: // LUNA-I/LUNA-88K とも DIP#1-2 を down(=false) でシリアルコンソール。
162: const ConfigItem& item_serial = gConfig->Find("dipsw-serial");
163: const std::string& serial = item_serial.AsString();
164: if (serial.empty() == false) {
165: if (serial == "yes") {
166: val = false;
167: } else if (serial == "no") {
168: val = true;
169: } else {
170: item_serial.Err();
171: return false;
172: }
173: dipsw[1] = val;
174: }
175:
176: return true;
177: }
178:
179:
180: //
181: // DIPSW (NEWS)
182: //
183:
184: // コンストラクタ
185: NewsDipswDevice::NewsDipswDevice()
186: : inherited(8)
187: {
188: // 上が false の方向。
189: upside = false;
190: }
191:
192: // デストラクタ
193: NewsDipswDevice::~NewsDipswDevice()
194: {
195: }
196:
197: // 初期化
198: bool
199: NewsDipswDevice::Init()
200: {
201: if (inherited::Init() == false) {
202: return false;
203: }
204:
205: const ConfigItem& item = gConfig->Find("news-dipsw");
206: const std::string& str = item.AsString();
207: if (str.size() != 8) {
208: item.Err("Must be 8 digits");
209: return false;
210: }
211: for (int i = 0; i < 8; i++) {
212: dipsw[i] = (str[i] != '0');
213: }
214:
215: // DIP5 オン(true)で自動起動。
216: bool val;
217: const ConfigItem& item_autoboot = gConfig->Find("dipsw-autoboot");
218: const std::string& autoboot = item_autoboot.AsString();
219: if (autoboot.empty() == false) {
220: if (autoboot == "yes") {
221: val = true;
222: } else if (autoboot == "no") {
223: val = false;
224: } else {
225: item_autoboot.Err();
226: return false;
227: }
228: dipsw[4] = val;
229: }
230:
231: // DIP1,2,3 すべてオフでシリアルコンソール。
232: // シリアルコンソールでない場合はビデオカード/モニタを選択しないと
233: // いけないが、とりあえず NWB-512 モノクロビデオカード(?) にしとく。
234: const ConfigItem& item_serial = gConfig->Find("dipsw-serial");
235: const std::string& serial = item_serial.AsString();
236: if (serial.empty() == false) {
237: if (serial == "yes") {
238: dipsw[0] = false;
239: dipsw[1] = false;
240: dipsw[2] = false;
241: } else if (serial == "no") {
242: dipsw[0] = false;
243: dipsw[1] = false;
244: dipsw[2] = true;
245: } else {
246: item_serial.Err();
247: return false;
248: }
249: }
250:
251: return true;
252: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.