SRAM.java
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13: package xeij;
14:
15: import java.awt.event.*;
16: import java.io.*;
17: import java.util.*;
18: import javax.swing.*;
19:
20: public class SRAM {
21:
22: public static int smrSramSizeRequest;
23: public static int smrSramCurrentSize;
24:
25: public static String smrSramName;
26:
27: public static int smrBootDevice;
28: public static int smrROMBootHandle;
29: public static int smrRAMBootAddress;
30:
31: public static int smrRepeatDelay;
32: public static int smrRepeatInterval;
33: public static boolean smrWriteEnableOn;
34:
35:
36: public static int smrRomdbFlag;
37:
38:
39: public static int smrCacheMode;
40:
41:
42: public static int smrStupsndMode;
43:
44:
45: public static boolean smrModifyMemorySizeOn;
46:
47:
48: public static boolean smrSRAMBusErrorOn;
49:
50: public static JMenu smrRepeatDelayMenu;
51: public static JMenu smrRepeatIntervalMenu;
52: public static JMenu smrRomdbMenu;
53: public static JMenu smrCacheMenu;
54: public static JMenu smrStupsndMenu;
55: public static JMenuItem smrModifyMemorySizeMenuItem;
56: public static JMenu smrMenu;
57: public static JMenu smrBootMenu;
58: public static JRadioButtonMenuItem smrSTDMenuItem;
59:
60:
61:
62: public static void smrInit () {
63:
64:
65: int sizeKB = Settings.sgsGetInt ("sramsize");
66: smrSramSizeRequest = (sizeKB == 16 ||
67: sizeKB == 32 ||
68: sizeKB == 64 ? sizeKB << 10 : 16 << 10);
69: smrSramCurrentSize = smrSramSizeRequest;
70: System.out.printf (Multilingual.mlnJapanese ?
71: "SRAM のサイズは %dKB です\n" :
72: "SRAM size is %dKB\n",
73: smrSramSizeRequest >> 10);
74:
75: boolean initialized = false;
76:
77:
78: smrSramName = "";
79: if (!initialized) {
80: smrSramName = Settings.sgsGetString ("sram");
81: if (smrSramName.length () != 0) {
82: byte[] array = XEiJ.rscGetFile (smrSramName, smrSramSizeRequest);
83: if (array != null) {
84: System.arraycopy (array, 0, MainMemory.mmrM8, 0x00ed0000, smrSramSizeRequest);
85: if (smrSramSizeRequest < 64 << 10) {
86: Arrays.fill (MainMemory.mmrM8, 0x00ed0000 + smrSramSizeRequest, 0x00ed0000 + (64 << 10), (byte) 0);
87: }
88: initialized = true;
89: }
90: }
91: }
92:
93:
94:
95: if (!initialized) {
96: byte[] array = Settings.sgsGetData ("sramdata");
97: if (array.length != 0) {
98: System.out.println (Multilingual.mlnJapanese ?
99: "SRAM のデータを復元します" :
100: "SRAM data is restored");
101: System.arraycopy (array, 0, MainMemory.mmrM8, 0x00ed0000, Math.min (array.length, smrSramSizeRequest));
102: if (array.length < smrSramSizeRequest) {
103: Arrays.fill (MainMemory.mmrM8, 0x00ed0000 + array.length, 0x00ed0000 + smrSramSizeRequest, (byte) 0);
104: }
105: if (smrSramSizeRequest < 64 << 10) {
106: Arrays.fill (MainMemory.mmrM8, 0x00ed0000 + smrSramSizeRequest, 0x00ed0000 + (64 << 10), (byte) 0);
107: }
108: initialized = true;
109: }
110: }
111:
112: if (!initialized) {
113: System.out.println (Multilingual.mlnJapanese ?
114: "SRAM をゼロクリアします" :
115: "SRAM is zero-cleared");
116: Arrays.fill (MainMemory.mmrM8, 0x00ed0000, 0x00ed0000 + (64 << 10), (byte) 0);
117: initialized = true;
118: }
119:
120:
121: int repeatDelay = Settings.sgsGetInt ("keydly");
122: smrRepeatDelay = -1 <= repeatDelay && repeatDelay <= 15 ? repeatDelay : -1;
123:
124:
125: int repeatInterval = Settings.sgsGetInt ("keyrep");
126: smrRepeatInterval = -1 <= repeatInterval && repeatInterval <= 15 ? repeatInterval : -1;
127:
128:
129: {
130: String s = Settings.sgsGetString ("romdb").toLowerCase ();
131: smrRomdbFlag = (s.equals ("off") ? 0 :
132: s.equals ("on") || s.equals ("aux") ? 255 :
133: s.equals ("con") ? 1 :
134: -1);
135: }
136:
137:
138: smrCacheMode = smrStringToCache (Settings.sgsGetString ("cache"));
139:
140:
141: smrStupsndMode = smrStringToStupsnd (Settings.sgsGetString ("stupsnd"));
142:
143:
144: smrModifyMemorySizeOn = Settings.sgsGetOnOff ("modifymemorysize");
145:
146:
147: smrSRAMBusErrorOn = Settings.sgsGetOnOff ("srambuserror");
148:
149:
150: smrParseBootDevice (Settings.sgsGetString ("boot"));
151:
152: }
153:
154:
155:
156: public static void smrTini () {
157:
158:
159: Settings.sgsPutInt ("sramsize", smrSramSizeRequest >> 10);
160:
161:
162: Settings.sgsPutString ("sram", smrSramName);
163:
164:
165:
166:
167: Settings.sgsPutData ("sramdata", MainMemory.mmrM8, 0x00ed0000, 64 << 10);
168:
169:
170: Settings.sgsPutInt ("keydly", smrRepeatDelay);
171:
172:
173: Settings.sgsPutInt ("keyrep", smrRepeatInterval);
174:
175:
176: Settings.sgsPutString ("romdb",
177: smrRomdbFlag == 0 ? "off" :
178: smrRomdbFlag == 255 ? "aux" :
179: smrRomdbFlag == 1 ? "con" :
180: "");
181:
182:
183: Settings.sgsPutString ("cache", smrCacheToString (smrCacheMode));
184:
185:
186: Settings.sgsPutString ("stupsnd", smrStupsndToString (smrStupsndMode));
187:
188:
189: Settings.sgsPutOnOff ("modifymemorysize", smrModifyMemorySizeOn);
190:
191:
192: Settings.sgsPutOnOff ("srambuserror", smrSRAMBusErrorOn);
193:
194:
195: Settings.sgsPutString ("boot",
196: smrBootDevice == -1 ? "default" :
197: smrBootDevice == 0x0000 ? "std" :
198: (smrBootDevice & 0xf000) == 0x9000 ? "fd" + (smrBootDevice >> 8 & 3) :
199: (smrBootDevice & 0xf000) == 0x8000 ? "hd" + (smrBootDevice >> 8 & 15) :
200: smrBootDevice == 0xa000 ?
201: (smrROMBootHandle & ~(7 << 2)) == SPC.SPC_HANDLE_EX ? "sc" + (smrROMBootHandle >> 2 & 7) :
202: (smrROMBootHandle & ~(7 << 2)) == SPC.SPC_HANDLE_IN ? "sc" + (smrROMBootHandle >> 2 & 7) :
203: smrROMBootHandle == HFS.HFS_BOOT_HANDLE ? "hf" + HFS.hfsBootUnit :
204: String.format ("rom$%08X", smrROMBootHandle) :
205: smrBootDevice == 0xb000 ? String.format ("ram$%08X", smrRAMBootAddress) :
206: "");
207:
208: }
209:
210:
211:
212:
213: public static void smrMakeMenu () {
214:
215:
216: ActionListener listener = new ActionListener () {
217: @Override public void actionPerformed (ActionEvent ae) {
218: Object source = ae.getSource ();
219: String command = ae.getActionCommand ();
220: switch (command) {
221:
222: case "Modify the memory size in SRAM":
223: smrModifyMemorySizeOn = ((JCheckBoxMenuItem) source).isSelected ();
224: break;
225:
226: case "Zero-clear":
227: smrClear ();
228: break;
229: case "Import":
230: smrLoad ();
231: break;
232: case "Export":
233: smrSave ();
234: break;
235: case "16KB":
236: smrSramSizeRequest = 16384;
237: break;
238: case "32KB":
239: smrSramSizeRequest = 32768;
240: break;
241: case "64KB":
242: smrSramSizeRequest = 65536;
243: break;
244: case "Bus error when writing to SRAM":
245: smrSRAMBusErrorOn = ((JCheckBoxMenuItem) source).isSelected ();
246: break;
247: default:
248: System.out.println ("unknown action command " + command);
249: }
250: }
251: };
252:
253:
254: ActionListener delayListener = new ActionListener () {
255: @Override public void actionPerformed (ActionEvent ae) {
256: String command = ae.getActionCommand ();
257: switch (command) {
258: case "Follow settings in SWITCH.X":
259: smrRepeatDelay = -1;
260: Keyboard.kbdSetRepeatDelay (MainMemory.mmrRbs (0x00ed003a));
261: break;
262: case (200 + 100 * 0) + "ms":
263: case (200 + 100 * 1) + "ms":
264: case (200 + 100 * 2) + "ms":
265: case (200 + 100 * 3) + "ms":
266: case (200 + 100 * 4) + "ms":
267: case (200 + 100 * 5) + "ms":
268: case (200 + 100 * 6) + "ms":
269: case (200 + 100 * 7) + "ms":
270: case (200 + 100 * 8) + "ms":
271: case (200 + 100 * 9) + "ms":
272: case (200 + 100 * 10) + "ms":
273: case (200 + 100 * 11) + "ms":
274: case (200 + 100 * 12) + "ms":
275: case (200 + 100 * 13) + "ms":
276: case (200 + 100 * 14) + "ms":
277: case (200 + 100 * 15) + "ms":
278: {
279: int ms = Integer.parseInt (command.substring (0, command.length () - 2));
280:
281:
282: smrRepeatDelay = (ms - 200) * 1311 >>> 17;
283: Keyboard.kbdSetRepeatDelay (smrRepeatDelay);
284: MainMemory.mmrWb (0x00ed003a, smrRepeatDelay);
285: }
286: break;
287: default:
288: System.out.println ("unknown action command " + command);
289: }
290: }
291: };
292: ButtonGroup delayGroup = new ButtonGroup ();
293: smrRepeatDelayMenu =
294: Multilingual.mlnText (
295: ComponentFactory.createMenu (
296: "Repeat delay",
297: Multilingual.mlnText (
298: ComponentFactory.createRadioButtonMenuItem (delayGroup, smrRepeatDelay == -1, "Follow settings in SWITCH.X", delayListener),
299: "ja", "SWITCH.X の設定に従う"),
300: ComponentFactory.createRadioButtonMenuItem (delayGroup, smrRepeatDelay == 0, (200 + 100 * 0) + "ms", delayListener),
301: ComponentFactory.createRadioButtonMenuItem (delayGroup, smrRepeatDelay == 1, (200 + 100 * 1) + "ms", delayListener),
302: ComponentFactory.createRadioButtonMenuItem (delayGroup, smrRepeatDelay == 2, (200 + 100 * 2) + "ms", delayListener),
303: ComponentFactory.createRadioButtonMenuItem (delayGroup, smrRepeatDelay == 3, (200 + 100 * 3) + "ms", delayListener),
304: ComponentFactory.createRadioButtonMenuItem (delayGroup, smrRepeatDelay == 4, (200 + 100 * 4) + "ms", delayListener),
305: ComponentFactory.createRadioButtonMenuItem (delayGroup, smrRepeatDelay == 5, (200 + 100 * 5) + "ms", delayListener),
306: ComponentFactory.createRadioButtonMenuItem (delayGroup, smrRepeatDelay == 6, (200 + 100 * 6) + "ms", delayListener),
307: ComponentFactory.createRadioButtonMenuItem (delayGroup, smrRepeatDelay == 7, (200 + 100 * 7) + "ms", delayListener),
308: ComponentFactory.createRadioButtonMenuItem (delayGroup, smrRepeatDelay == 8, (200 + 100 * 8) + "ms", delayListener),
309: ComponentFactory.createRadioButtonMenuItem (delayGroup, smrRepeatDelay == 9, (200 + 100 * 9) + "ms", delayListener),
310: ComponentFactory.createRadioButtonMenuItem (delayGroup, smrRepeatDelay == 10, (200 + 100 * 10) + "ms", delayListener),
311: ComponentFactory.createRadioButtonMenuItem (delayGroup, smrRepeatDelay == 11, (200 + 100 * 11) + "ms", delayListener),
312: ComponentFactory.createRadioButtonMenuItem (delayGroup, smrRepeatDelay == 12, (200 + 100 * 12) + "ms", delayListener),
313: ComponentFactory.createRadioButtonMenuItem (delayGroup, smrRepeatDelay == 13, (200 + 100 * 13) + "ms", delayListener),
314: ComponentFactory.createRadioButtonMenuItem (delayGroup, smrRepeatDelay == 14, (200 + 100 * 14) + "ms", delayListener),
315: ComponentFactory.createRadioButtonMenuItem (delayGroup, smrRepeatDelay == 15, (200 + 100 * 15) + "ms", delayListener)
316: ),
317: "ja", "リピート開始");
318:
319:
320: ActionListener intervalListener = new ActionListener () {
321: @Override public void actionPerformed (ActionEvent ae) {
322: String command = ae.getActionCommand ();
323: switch (command) {
324: case "Follow settings in SWITCH.X":
325: smrRepeatInterval = -1;
326: Keyboard.kbdSetRepeatInterval (MainMemory.mmrRbs (0x00ed003b));
327: break;
328: case (30 + 5 * 0 * 0) + "ms":
329: case (30 + 5 * 1 * 1) + "ms":
330: case (30 + 5 * 2 * 2) + "ms":
331: case (30 + 5 * 3 * 3) + "ms":
332: case (30 + 5 * 4 * 4) + "ms":
333: case (30 + 5 * 5 * 5) + "ms":
334: case (30 + 5 * 6 * 6) + "ms":
335: case (30 + 5 * 7 * 7) + "ms":
336: case (30 + 5 * 8 * 8) + "ms":
337: case (30 + 5 * 9 * 9) + "ms":
338: case (30 + 5 * 10 * 10) + "ms":
339: case (30 + 5 * 11 * 11) + "ms":
340: case (30 + 5 * 12 * 12) + "ms":
341: case (30 + 5 * 13 * 13) + "ms":
342: case (30 + 5 * 14 * 14) + "ms":
343: case (30 + 5 * 15 * 15) + "ms":
344: {
345: int ms = Integer.parseInt (command.substring (0, command.length () - 2));
346:
347:
348: smrRepeatInterval = (int) Math.sqrt ((double) ((ms - 30) * 1639 >>> 13));
349: Keyboard.kbdSetRepeatInterval (smrRepeatInterval);
350: MainMemory.mmrWb (0x00ed003b, smrRepeatInterval);
351: }
352: break;
353: default:
354: System.out.println ("unknown action command " + command);
355: }
356: }
357: };
358: ButtonGroup intervalGroup = new ButtonGroup ();
359: smrRepeatIntervalMenu =
360: Multilingual.mlnText (
361: ComponentFactory.createMenu (
362: "Repeat interval",
363: Multilingual.mlnText (
364: ComponentFactory.createRadioButtonMenuItem (intervalGroup, smrRepeatInterval == -1, "Follow settings in SWITCH.X", intervalListener),
365: "ja", "SWITCH.X の設定に従う"),
366: ComponentFactory.createRadioButtonMenuItem (intervalGroup, smrRepeatInterval == 0, (30 + 5 * 0 * 0) + "ms", intervalListener),
367: ComponentFactory.createRadioButtonMenuItem (intervalGroup, smrRepeatInterval == 1, (30 + 5 * 1 * 1) + "ms", intervalListener),
368: ComponentFactory.createRadioButtonMenuItem (intervalGroup, smrRepeatInterval == 2, (30 + 5 * 2 * 2) + "ms", intervalListener),
369: ComponentFactory.createRadioButtonMenuItem (intervalGroup, smrRepeatInterval == 3, (30 + 5 * 3 * 3) + "ms", intervalListener),
370: ComponentFactory.createRadioButtonMenuItem (intervalGroup, smrRepeatInterval == 4, (30 + 5 * 4 * 4) + "ms", intervalListener),
371: ComponentFactory.createRadioButtonMenuItem (intervalGroup, smrRepeatInterval == 5, (30 + 5 * 5 * 5) + "ms", intervalListener),
372: ComponentFactory.createRadioButtonMenuItem (intervalGroup, smrRepeatInterval == 6, (30 + 5 * 6 * 6) + "ms", intervalListener),
373: ComponentFactory.createRadioButtonMenuItem (intervalGroup, smrRepeatInterval == 7, (30 + 5 * 7 * 7) + "ms", intervalListener),
374: ComponentFactory.createRadioButtonMenuItem (intervalGroup, smrRepeatInterval == 8, (30 + 5 * 8 * 8) + "ms", intervalListener),
375: ComponentFactory.createRadioButtonMenuItem (intervalGroup, smrRepeatInterval == 9, (30 + 5 * 9 * 9) + "ms", intervalListener),
376: ComponentFactory.createRadioButtonMenuItem (intervalGroup, smrRepeatInterval == 10, (30 + 5 * 10 * 10) + "ms", intervalListener),
377: ComponentFactory.createRadioButtonMenuItem (intervalGroup, smrRepeatInterval == 11, (30 + 5 * 11 * 11) + "ms", intervalListener),
378: ComponentFactory.createRadioButtonMenuItem (intervalGroup, smrRepeatInterval == 12, (30 + 5 * 12 * 12) + "ms", intervalListener),
379: ComponentFactory.createRadioButtonMenuItem (intervalGroup, smrRepeatInterval == 13, (30 + 5 * 13 * 13) + "ms", intervalListener),
380: ComponentFactory.createRadioButtonMenuItem (intervalGroup, smrRepeatInterval == 14, (30 + 5 * 14 * 14) + "ms", intervalListener),
381: ComponentFactory.createRadioButtonMenuItem (intervalGroup, smrRepeatInterval == 15, (30 + 5 * 15 * 15) + "ms", intervalListener)
382: ),
383: "ja", "リピート間隔");
384:
385:
386: ActionListener romdbListener = new ActionListener () {
387: @Override public void actionPerformed (ActionEvent ae) {
388: String command = ae.getActionCommand ();
389: switch (command) {
390: case "Follow settings in SWITCH.X":
391: smrRomdbFlag = -1;
392: break;
393: case "OFF":
394: smrRomdbFlag = 0;
395: break;
396: case "AUX":
397: smrRomdbFlag = 255;
398: break;
399: case "CON (when using IPLROM 1.6)":
400: smrRomdbFlag = 1;
401: break;
402: default:
403: System.out.println ("unknown action command " + command);
404: }
405: }
406: };
407: ButtonGroup romdbGroup = new ButtonGroup ();
408: smrRomdbMenu =
409: Multilingual.mlnText (
410: ComponentFactory.createMenu (
411: "ROM debugger start flag",
412: Multilingual.mlnText (
413: ComponentFactory.createRadioButtonMenuItem (romdbGroup, smrRomdbFlag == -1, "Follow settings in SWITCH.X", romdbListener),
414: "ja", "SWITCH.X の設定に従う"),
415: ComponentFactory.createRadioButtonMenuItem (romdbGroup, smrRomdbFlag == 0, "OFF", romdbListener),
416: ComponentFactory.createRadioButtonMenuItem (romdbGroup, smrRomdbFlag == 255, "AUX", romdbListener),
417: Multilingual.mlnText (
418: ComponentFactory.createRadioButtonMenuItem (romdbGroup, smrRomdbFlag == 1, "CON (when using IPLROM 1.6)", romdbListener),
419: "ja", "CON (IPLROM 1.6 使用時)")
420: ),
421: "ja", "ROM デバッガ起動フラグ");
422:
423:
424:
425:
426:
427:
428:
429:
430:
431: ActionListener cacheListener = new ActionListener () {
432: @Override public void actionPerformed (ActionEvent ae) {
433: String command = ae.getActionCommand ();
434: switch (command) {
435: case "Follow settings in CACHE.X":
436: smrCacheMode = -1;
437: break;
438: case "Disabled":
439: smrCacheMode = 0;
440: break;
441: case "Data cache disabled and instruction cache enabled":
442: smrCacheMode = 1;
443: break;
444: case "Data cache enabled and instruction cache disabled":
445: smrCacheMode = 2;
446: break;
447: case "Enabled":
448: smrCacheMode = 3;
449: break;
450: }
451: }
452: };
453: ButtonGroup cacheGroup = new ButtonGroup ();
454: smrCacheMenu =
455: Multilingual.mlnText (
456: ComponentFactory.createMenu (
457: "Cache mode at startup",
458: Multilingual.mlnText (
459: ComponentFactory.createRadioButtonMenuItem (
460: cacheGroup,
461: smrCacheMode == -1, "Follow settings in CACHE.X",
462: cacheListener),
463: "ja", "CACHE.X の設定に従う"),
464: Multilingual.mlnText (
465: ComponentFactory.createRadioButtonMenuItem (
466: cacheGroup,
467: smrCacheMode == 0, "Disabled",
468: cacheListener),
469: "ja", "無効"),
470: Multilingual.mlnText (
471: ComponentFactory.createRadioButtonMenuItem (
472: cacheGroup,
473: smrCacheMode == 1, "Data cache disabled and instruction cache enabled",
474: cacheListener),
475: "ja", "データキャッシュは無効、命令キャッシュは有効"),
476: Multilingual.mlnText (
477: ComponentFactory.createRadioButtonMenuItem (
478: cacheGroup,
479: smrCacheMode == 2, "Data cache enabled and instruction cache disabled",
480: cacheListener),
481: "ja", "データキャッシュは有効、命令キャッシュは無効"),
482: Multilingual.mlnText (
483: ComponentFactory.createRadioButtonMenuItem (
484: cacheGroup,
485: smrCacheMode == 3, "Enabled",
486: cacheListener),
487: "ja", "有効")
488: ),
489: "ja", "起動時のキャッシュモード");
490:
491:
492:
493:
494:
495:
496:
497:
498:
499:
500:
501:
502:
503:
504:
505:
506:
507:
508:
509: ActionListener stupsndListener = new ActionListener () {
510: @Override public void actionPerformed (ActionEvent ae) {
511: String command = ae.getActionCommand ();
512: switch (command) {
513: case "Follow settings in stupsnd.x":
514: smrStupsndMode = -1;
515: break;
516: case "Disabled":
517: smrStupsndMode = 0;
518: break;
519: case "Enabled (o5c)":
520: smrStupsndMode = 1;
521: break;
522: default:
523: smrStupsndMode = smrStringToStupsnd (command);
524: }
525: }
526: };
527: ButtonGroup stupsndGroup = new ButtonGroup ();
528: smrStupsndMenu =
529: Multilingual.mlnText (
530: ComponentFactory.createMenu (
531: "Startup sound",
532: Multilingual.mlnText (
533: ComponentFactory.createRadioButtonMenuItem (
534: stupsndGroup,
535: smrStupsndMode == -1, "Follow settings in stupsnd.x",
536: stupsndListener),
537: "ja", "stupsnd.x の設定に従う"),
538: Multilingual.mlnText (
539: ComponentFactory.createRadioButtonMenuItem (
540: stupsndGroup,
541: smrStupsndMode == 0, "Disabled",
542: stupsndListener),
543: "ja", "無効"),
544: Multilingual.mlnText (
545: ComponentFactory.createRadioButtonMenuItem (
546: stupsndGroup,
547: smrStupsndMode == 1, "Enabled (o5c)",
548: stupsndListener),
549: "ja", "有効 (o5c)")
550: ),
551: "ja", "起動音");
552: JMenu stupsndSubMenu = null;
553: for (int mode = 2; mode <= 126; mode++) {
554: if (mode % 4 == 3) {
555: continue;
556: }
557: if (mode == 2 || (mode + 4) % 16 == 0) {
558: stupsndSubMenu = ComponentFactory.createMenu ("o" + (mode + 4) / 16);
559: smrStupsndMenu.add (stupsndSubMenu);
560: }
561: stupsndSubMenu.add (
562: ComponentFactory.createRadioButtonMenuItem (
563: stupsndGroup,
564: smrStupsndMode == mode, smrStupsndToString (mode),
565: stupsndListener)
566: );
567: }
568:
569:
570: smrModifyMemorySizeMenuItem =
571: Multilingual.mlnText (
572: ComponentFactory.createCheckBoxMenuItem (smrModifyMemorySizeOn, "Modify the memory size in SRAM", listener),
573: "ja", "SRAM にあるメモリサイズを修正する");
574:
575:
576: ButtonGroup sizeGroup = new ButtonGroup ();
577: smrMenu =
578: ComponentFactory.createMenu (
579: "SRAM",
580: Multilingual.mlnText (
581: ComponentFactory.createMenuItem ("Zero-clear", listener),
582: "ja", "ゼロクリア"),
583: Multilingual.mlnText (
584: ComponentFactory.createMenuItem ("Import", listener),
585: "ja", "インポート"),
586: Multilingual.mlnText (
587: ComponentFactory.createMenuItem ("Export", listener),
588: "ja", "エクスポート"),
589: ComponentFactory.createHorizontalSeparator (),
590: Multilingual.mlnText (
591: ComponentFactory.createRadioButtonMenuItem (sizeGroup, smrSramSizeRequest >> 10 == 16, "16KB", listener),
592: "ja", "16KB"),
593: Multilingual.mlnText (
594: ComponentFactory.createRadioButtonMenuItem (sizeGroup, smrSramSizeRequest >> 10 == 32, "32KB", listener),
595: "ja", "32KB"),
596: Multilingual.mlnText (
597: ComponentFactory.createRadioButtonMenuItem (sizeGroup, smrSramSizeRequest >> 10 == 64, "64KB", listener),
598: "ja", "64KB"),
599: ComponentFactory.createHorizontalSeparator (),
600: Multilingual.mlnText (
601: ComponentFactory.createCheckBoxMenuItem (smrSRAMBusErrorOn, "Bus error when writing to SRAM", listener),
602: "ja", "SRAM への書き込み時のバスエラー")
603: );
604:
605:
606: ButtonGroup bootGroup = new ButtonGroup ();
607: ActionListener bootListener = new ActionListener () {
608: @Override public void actionPerformed (ActionEvent ae) {
609: String command = ae.getActionCommand ();
610: smrParseBootDevice (
611: command.startsWith ("FDD ") ? "fd" + command.substring (4) :
612: command.startsWith ("SASI ") ? "hd" + command.substring (5) :
613: command.startsWith ("SCSI ") ? "sc" + command.substring (5) :
614: command.startsWith ("HFS ") ? "hf" + command.substring (4) :
615: command.equals ("STD") ? "std" :
616: "default");
617: if (smrBootDevice != -1) {
618: XEiJ.mpuSavedBootDevice = -1;
619: XEiJ.mpuSavedROMBootHandle = -1;
620: }
621: }
622: };
623: JMenu bootMenuFDD = ComponentFactory.createMenu ("FDD");
624: for (int u = 0; u < FDC.FDC_MAX_UNITS; u++) {
625: bootMenuFDD.add (ComponentFactory.createRadioButtonMenuItem (
626: bootGroup, smrBootDevice == 0x9070 + (u << 8),
627: "FDD " + u, bootListener));
628: }
629: JMenu bootMenuSASI = ComponentFactory.createMenu ("SASI");
630: for (int u = 0; u < 16; u++) {
631: bootMenuSASI.add (ComponentFactory.createRadioButtonMenuItem (
632: bootGroup, smrBootDevice == 0x8000 + (u << 8),
633: "SASI " + u, bootListener));
634: }
635: JMenu bootMenuSCSI = ComponentFactory.createMenu ("SCSI");
636: for (int u = 0; u < 8; u++) {
637: bootMenuSCSI.add (ComponentFactory.createRadioButtonMenuItem (
638: bootGroup, smrBootDevice == 0xa000 && (smrROMBootHandle == SPC.SPC_HANDLE_EX + (u << 2) ||
639: smrROMBootHandle == SPC.SPC_HANDLE_IN + (u << 2)), "SCSI " + u, bootListener));
640: }
641: JMenu bootMenuHFS = ComponentFactory.createMenu ("HFS");
642: for (int u = 0; u < HFS.HFS_MAX_UNITS; u++) {
643: bootMenuHFS.add (ComponentFactory.createRadioButtonMenuItem (
644: bootGroup, smrBootDevice == 0xa000 && smrROMBootHandle == HFS.HFS_BOOT_HANDLE && HFS.hfsBootUnit == u,
645: "HFS " + u, bootListener));
646: }
647: smrBootMenu =
648: Multilingual.mlnText (
649: ComponentFactory.createMenu (
650: "Boot device",
651: Multilingual.mlnText (
652: ComponentFactory.createRadioButtonMenuItem (bootGroup, smrBootDevice == -1, "Follow settings in SWITCH.X", bootListener),
653: "ja", "SWITCH.X の設定に従う"),
654: smrSTDMenuItem = ComponentFactory.createRadioButtonMenuItem (bootGroup, smrBootDevice == 0x0000, "STD", bootListener),
655: bootMenuFDD,
656: bootMenuSASI,
657: bootMenuSCSI,
658: bootMenuHFS
659: ),
660: "ja", "起動デバイス");
661:
662: }
663:
664:
665:
666: public static void smrParseBootDevice (String boot) {
667: smrBootDevice = -1;
668: smrROMBootHandle = -1;
669: smrRAMBootAddress = -1;
670: boot = boot.toLowerCase ();
671: if (boot.equals ("std")) {
672: smrBootDevice = 0x0000;
673: } else if (boot.startsWith ("fd")) {
674: int u = XEiJ.fmtParseInt (boot, 2, 0, FDC.FDC_MAX_UNITS - 1, FDC.FDC_MAX_UNITS);
675: if (u < FDC.FDC_MAX_UNITS) {
676: smrBootDevice = 0x9070 + (u << 8);
677: }
678: } else if (boot.startsWith ("hd")) {
679: int u = XEiJ.fmtParseInt (boot, 2, 0, 15, 16);
680: if (u < 16) {
681: smrBootDevice = 0x8000 + (u << 8);
682: }
683: } else if (boot.startsWith ("sc")) {
684: int u = XEiJ.fmtParseInt (boot, 2, 0, 7, 8);
685: if (u < 8) {
686: smrBootDevice = 0xa000;
687: smrROMBootHandle = SPC.SPC_HANDLE_EX + ((u & 7) << 2);
688: }
689: } else if (boot.startsWith ("hf")) {
690: int u = XEiJ.fmtParseInt (boot, 2, 0, HFS.HFS_MAX_UNITS - 1, HFS.HFS_MAX_UNITS);
691: if (u < HFS.HFS_MAX_UNITS) {
692: HFS.hfsBootUnit = u;
693: smrBootDevice = 0xa000;
694: smrROMBootHandle = HFS.HFS_BOOT_HANDLE;
695: }
696: } else if (boot.startsWith ("rom$")) {
697: int handle = XEiJ.fmtParseIntRadix (boot, 3, 0, 0x00ffffff, 0x01000000, 16);
698: if (handle < 0x01000000) {
699: smrBootDevice = 0xa000;
700: smrROMBootHandle = handle;
701: }
702: } else if (boot.startsWith ("ram$")) {
703: int handle = XEiJ.fmtParseIntRadix (boot, 3, 0, 0x00ffffff, 0x01000000, 16);
704: if (handle < 0x01000000) {
705: smrBootDevice = 0xb000;
706: smrRAMBootAddress = handle;
707: }
708: }
709: }
710:
711:
712:
713:
714:
715:
716: public static void smrReset () {
717: smrWriteEnableOn = false;
718:
719:
720: {
721: smrSramCurrentSize = smrSramSizeRequest;
722: XEiJ.busSuper (MemoryMappedDevice.MMD_SMR, 0x00ed0000, 0x00ed0000 + smrSramSizeRequest);
723: if (smrSramSizeRequest < 65536) {
724: XEiJ.busSuper (MemoryMappedDevice.MMD_NUL, 0x00ed0000 + smrSramSizeRequest, 0x00ed0000 + 65536);
725: }
726: System.out.printf (Multilingual.mlnJapanese ?
727: "SRAM の容量は %dKB ($%08X-$%08X) です\n" :
728: "Capacity of SRAM is %dKB ($%08X-$%08X)\n",
729: smrSramCurrentSize >> 10, 0x00ed0000, 0x00ed0000 + smrSramCurrentSize - 1);
730: }
731:
732:
733:
734:
735:
736:
737:
738:
739:
740:
741:
742:
743:
744:
745:
746:
747:
748:
749:
750:
751:
752: if ((smrROMBootHandle & ~(7 << 2)) == SPC.SPC_HANDLE_IN && !SPC.spcSCSIINOn) {
753: if (SPC.spcSCSIEXOn) {
754: smrROMBootHandle = SPC.SPC_HANDLE_EX + (smrROMBootHandle & (7 << 2));
755:
756: } else {
757: smrROMBootHandle = 0x00e80400;
758: if (smrBootDevice == 0xa000) {
759: smrBootDevice = 0x0000;
760: smrSTDMenuItem.setSelected (true);
761: }
762: }
763: }
764: if ((smrROMBootHandle & ~(7 << 2)) == SPC.SPC_HANDLE_EX && !SPC.spcSCSIEXOn) {
765: if (SPC.spcSCSIINOn) {
766: smrROMBootHandle = SPC.SPC_HANDLE_IN + (smrROMBootHandle & (7 << 2));
767:
768: } else {
769: smrROMBootHandle = 0x00e80400;
770: if (smrBootDevice == 0xa000) {
771: smrBootDevice = 0x0000;
772: smrSTDMenuItem.setSelected (true);
773: }
774: }
775: }
776: if (smrROMBootHandle == HFS.HFS_BOOT_HANDLE &&
777: (!HFS.hfsUnitArray[HFS.hfsBootUnit].abuConnected ||
778: !HFS.hfsUnitArray[HFS.hfsBootUnit].abuInserted)) {
779: smrROMBootHandle = 0x00e80400;
780: if (smrBootDevice == 0xa000) {
781: smrBootDevice = 0x0000;
782: smrSTDMenuItem.setSelected (true);
783: }
784: }
785:
786: if ((XEiJ.mpuROMBootHandle & ~(7 << 2)) == SPC.SPC_HANDLE_IN && !SPC.spcSCSIINOn) {
787: if (SPC.spcSCSIEXOn) {
788: XEiJ.mpuROMBootHandle = SPC.SPC_HANDLE_EX + (XEiJ.mpuROMBootHandle & (7 << 2));
789:
790: } else {
791: XEiJ.mpuROMBootHandle = 0x00e80400;
792: if (XEiJ.mpuBootDevice == 0xa000) {
793: XEiJ.mpuBootDevice = 0x0000;
794: }
795: }
796: }
797: if ((XEiJ.mpuROMBootHandle & ~(7 << 2)) == SPC.SPC_HANDLE_EX && !SPC.spcSCSIEXOn) {
798: if (SPC.spcSCSIINOn) {
799: XEiJ.mpuROMBootHandle = SPC.SPC_HANDLE_IN + (XEiJ.mpuROMBootHandle & (7 << 2));
800:
801: } else {
802: XEiJ.mpuROMBootHandle = 0x00e80400;
803: if (XEiJ.mpuBootDevice == 0xa000) {
804: XEiJ.mpuBootDevice = 0x0000;
805: }
806: }
807: }
808: if (XEiJ.mpuROMBootHandle == HFS.HFS_BOOT_HANDLE &&
809: (!HFS.hfsUnitArray[HFS.hfsBootUnit].abuConnected ||
810: !HFS.hfsUnitArray[HFS.hfsBootUnit].abuInserted)) {
811: XEiJ.mpuROMBootHandle = 0x00e80400;
812: if (XEiJ.mpuBootDevice == 0xa000) {
813: XEiJ.mpuBootDevice = 0x0000;
814: }
815: }
816:
817: smrOverride ();
818:
819: }
820:
821:
822:
823:
824: public static void smrOverride () {
825: if (MainMemory.mmrRls (0x00ed0000) == 0x82773638 &&
826: MainMemory.mmrRls (0x00ed0004) == 0x30303057) {
827:
828:
829: if (smrModifyMemorySizeOn) {
830: int memorySizeAddress = 0x00ed0008;
831: int memorySizeOld = MainMemory.mmrRls (memorySizeAddress);
832: int memorySizeNew = MainMemory.mmrMemorySizeCurrent;
833: if (memorySizeOld != memorySizeNew) {
834: MainMemory.mmrWl (memorySizeAddress, memorySizeNew);
835: System.out.printf (Multilingual.mlnJapanese ?
836: "SRAM にあるメモリサイズを %dMB から %dMB に変更しました\n" :
837: "Changed the memory size in SRAM from %dMB to %dMB\n",
838: memorySizeOld >> 20,
839: memorySizeNew >> 20);
840: }
841: }
842:
843:
844: int romHandleAddress = 0x00ed000c;
845: int romHandleOld = MainMemory.mmrRls (romHandleAddress);
846: int romHandleNew = XEiJ.mpuROMBootHandle != -1 ? XEiJ.mpuROMBootHandle : smrROMBootHandle;
847: if (romHandleNew != -1 &&
848: romHandleOld != romHandleNew) {
849: MainMemory.mmrWl (romHandleAddress, romHandleNew);
850: System.out.printf (Multilingual.mlnJapanese ?
851: "SRAM にある ROM 起動ハンドルを $%08X から $%08X に変更しました\n" :
852: "Changed the ROM boot handle in SRAM from $%08X to $%08X\n",
853: romHandleOld,
854: romHandleNew);
855: }
856:
857:
858: int ramAddressAddress = 0x00ed0010;
859: int ramAddressOld = MainMemory.mmrRls (ramAddressAddress);
860: int ramAddressNew = smrRAMBootAddress;
861: if (ramAddressNew != -1 &&
862: ramAddressOld != ramAddressNew) {
863: MainMemory.mmrWl (ramAddressAddress, ramAddressNew);
864: System.out.printf (Multilingual.mlnJapanese ?
865: "SRAM にある RAM 起動アドレスを $%08X から $%08X に変更しました\n" :
866: "Changed the RAM boot address in SRAM from $%08X to $%08X\n",
867: ramAddressOld,
868: ramAddressNew);
869: }
870:
871:
872: int deviceAddress = 0x00ed0018;
873: int deviceOld = MainMemory.mmrRwz (deviceAddress);
874: int deviceNew = XEiJ.mpuBootDevice != -1 ? XEiJ.mpuBootDevice : smrBootDevice;
875: if (deviceNew != -1 &&
876: deviceOld != deviceNew) {
877: MainMemory.mmrWw (deviceAddress, deviceNew);
878: System.out.printf (Multilingual.mlnJapanese ?
879: "SRAM にある起動デバイスを %s から %s に変更しました\n" :
880: "Changed the boot device in SRAM from %s to %s\n",
881: smrBootDescription (romHandleOld, ramAddressOld, deviceOld),
882: smrBootDescription (romHandleNew, ramAddressNew, deviceNew));
883: }
884:
885:
886: int repeatDelayAddress = 0x00ed003a;
887: int repeatDelayOld = MainMemory.mmrRbz (repeatDelayAddress);
888: int repeatDelayNew = smrRepeatDelay;
889: if (repeatDelayNew != -1 &&
890: repeatDelayOld != repeatDelayNew) {
891: MainMemory.mmrWb (repeatDelayAddress, repeatDelayNew);
892: System.out.printf (Multilingual.mlnJapanese ?
893: "SRAM にあるリピート開始を %dms から %dms に変更しました\n" :
894: "Changed the repeat delay in SRAM from %dms to %dms\n",
895: 200 + 100 * (repeatDelayOld & 15),
896: 200 + 100 * (repeatDelayNew & 15));
897: }
898:
899:
900: int repeatIntervalAddress = 0x00ed003b;
901: int repeatIntervalOld = MainMemory.mmrRbz (repeatIntervalAddress);
902: int repeatIntervalNew = smrRepeatInterval;
903: if (repeatIntervalNew != -1 &&
904: repeatIntervalOld != repeatIntervalNew) {
905: MainMemory.mmrWb (repeatIntervalAddress, repeatIntervalNew);
906: System.out.printf (Multilingual.mlnJapanese ?
907: "SRAM にあるリピート間隔を %dms から %dms に変更しました\n" :
908: "Changed the repeat interval in SRAM from %dms to %dms\n",
909: 30 + 5 * (repeatDelayOld & 15),
910: 30 + 5 * (repeatDelayNew & 15));
911: }
912:
913: boolean iplrom16 = (XEiJ.currentAccelerator == XEiJ.ACCELERATOR_HYBRID ||
914: XEiJ.currentAccelerator == XEiJ.ACCELERATOR_060TURBO ||
915: XEiJ.currentAccelerator == XEiJ.ACCELERATOR_060TURBOPRO ||
916: ROM.romIPLROM16On);
917:
918:
919: if (smrRomdbFlag != -1) {
920: boolean nonexistence = (XEiJ.currentModel.getIPLROM () == 130 && !iplrom16 &&
921: ROM.romROM30Data == null);
922: int address = 0x00ed0058;
923: int oldData = MainMemory.mmrRbz (address);
924: int newData = (nonexistence ? 0 :
925: !iplrom16 && smrRomdbFlag == 1 ? 255 :
926: smrRomdbFlag);
927: if (oldData != newData) {
928: MainMemory.mmrWb (address, newData);
929: System.out.printf (Multilingual.mlnJapanese ?
930: "SRAM にある ROM デバッガ起動フラグを %s から %s に変更しました\n" :
931: "ROM debugger startup flag in SRAM changed from %s to %s\n",
932: oldData == 0 ? "OFF" : oldData == 255 ? "AUX" : "CON",
933: newData == 0 ? "OFF" : newData == 255 ? "AUX" : "CON");
934: }
935: }
936:
937:
938: if (smrCacheMode != -1) {
939: int address = 0x00ed0090;
940: int oldData = MainMemory.mmrRbz (address);
941: int newData = smrCacheMode;
942: if (oldData != newData) {
943: MainMemory.mmrWb (address, newData);
944: System.out.printf (Multilingual.mlnJapanese ?
945: "SRAM にある起動時のキャッシュモードを %s から %s に変更しました\n" :
946: "Cache mode at startup in SRAM changed from %s to %s\n",
947: smrCacheToString (oldData),
948: smrCacheToString (newData));
949: }
950: }
951:
952:
953: if (smrStupsndMode != -1) {
954: int address = 0x00ed0091;
955: int oldData = MainMemory.mmrRbz (address);
956: int newData = (!iplrom16 && 2 <= smrStupsndMode ? 1 :
957: smrStupsndMode);
958: if (oldData != newData) {
959: MainMemory.mmrWb (address, newData);
960: System.out.printf (Multilingual.mlnJapanese ?
961: "SRAM にある起動音の設定を %s から %s に変更しました\n" :
962: "Startup sound setting in SRAM changed from %s to %s\n",
963: smrStupsndToString (oldData),
964: smrStupsndToString (newData));
965: }
966: }
967:
968:
969: int hdMaxAddress = 0x00ed005a;
970: int hdMaxOld = MainMemory.mmrRbz (hdMaxAddress);
971: int sasiFlag = MainMemory.mmrRbz (0x00ed006f) == 'V' ? MainMemory.mmrRbz (0x00ed0071) : 0;
972: int hdMaxNew = SPC.spcSCSIINOn ? 2 * (32 - Integer.numberOfLeadingZeros (sasiFlag)) : HDC.hdcHDMax;
973: if (hdMaxOld != hdMaxNew) {
974: MainMemory.mmrWb (hdMaxAddress, hdMaxNew);
975: System.out.printf (Multilingual.mlnJapanese ?
976: "SRAM にある SASI ハードディスクの最大数を %d から %d に変更しました\n" :
977: "Changed the maximum number of SASI hard disks in SRAM from %d to %d\n",
978: hdMaxOld, hdMaxNew);
979: }
980:
981: }
982:
983:
984:
985: }
986:
987:
988:
989: public static String smrCacheToString (int mode) {
990: return (mode == 0 ? "off-off" :
991: mode == 1 ? "off-on" :
992: mode == 2 ? "on-off" :
993: mode == 3 ? "on-on" :
994: "");
995: }
996:
997:
998:
999: public static int smrStringToCache (String s) {
1000: s = s.toLowerCase ();
1001: return (s.equals ("off-off") ? 0 :
1002: s.equals ("off-on") ? 1 :
1003: s.equals ("on-off") ? 2 :
1004: s.equals ("on-on") ? 3 :
1005: -1);
1006: }
1007:
1008:
1009:
1010: public static String smrStupsndToString (int mode) {
1011: String s = "";
1012: if (mode == 0) {
1013: s = "off";
1014: } else if (mode == 1) {
1015: s = "on";
1016: } else if (2 <= mode && mode <= 127) {
1017: int i = mode - (mode >> 2);
1018: int o = i / 12;
1019: int n = i % 12;
1020: if (9 <= n) {
1021: o++;
1022: }
1023: s = "o" + o + (n == 0 ? "d#" :
1024: n == 1 ? "e" :
1025: n == 2 ? "f" :
1026: n == 3 ? "f#" :
1027: n == 4 ? "g" :
1028: n == 5 ? "g#" :
1029: n == 6 ? "a" :
1030: n == 7 ? "a#" :
1031: n == 8 ? "b" :
1032: n == 9 ? "c" :
1033: n == 10 ? "c#" :
1034: "d");
1035: }
1036: return s;
1037: }
1038:
1039:
1040:
1041: public static int smrStringToStupsnd (String s) {
1042: s = s.toLowerCase ();
1043: int mode = -1;
1044: if (s.equals ("off")) {
1045: mode = 0;
1046: } else if (s.equals ("on")) {
1047: mode = 1;
1048: } else {
1049: int l = s.length ();
1050: int c0 = l < 1 ? -1 : s.charAt (0);
1051: int c1 = l < 2 ? -1 : s.charAt (1);
1052: int c2 = l < 3 ? -1 : s.charAt (2);
1053: int c3 = l < 4 ? -1 : s.charAt (3);
1054: if (c0 == 'o' &&
1055: '0' <= c1 && c1 <= '8' &&
1056: 'a' <= c2 && c2 <= 'g') {
1057: int o = c1 - '0';
1058: int n = (c2 == 'a' ? 6 :
1059: c2 == 'b' ? 8 :
1060: c2 == 'c' ? -3 :
1061: c2 == 'd' ? -1 :
1062: c2 == 'e' ? 1 :
1063: c2 == 'f' ? 2 :
1064: 4);
1065: if (c3 == '#' || c3 == '+') {
1066: n++;
1067: } else if (c3 == '-') {
1068: n--;
1069: }
1070: int i = 12 * o + n;
1071: if (2 <= i && i <= 95) {
1072: mode = i + i / 3;
1073: }
1074: }
1075: }
1076: return mode;
1077: }
1078:
1079: static {
1080: if (false) {
1081:
1082: for (int mode = 0; mode <= 126; mode++) {
1083: if (mode % 4 == 3) {
1084: continue;
1085: }
1086: String s = smrStupsndToString (mode);
1087: int i = smrStringToStupsnd (s);
1088: System.out.printf ("mode=%d s=%s i=%d\n", mode, s, i);
1089: }
1090: }
1091: }
1092:
1093:
1094:
1095:
1096:
1097:
1098:
1099:
1100:
1101:
1102:
1103: public static String smrBootDescription (int romHandle, int ramAddress, int device) {
1104: switch (device & 0xf000) {
1105: case 0x8000:
1106: return "HD" + (device >> 8 & 15);
1107: case 0x9000:
1108: return "2HD" + (device >> 8 & 3);
1109: case 0xa000:
1110: return ((romHandle & ~(7 << 2)) == SPC.SPC_HANDLE_IN ? "SCSI" + ((romHandle >> 2) & 7) :
1111: (romHandle & ~(7 << 2)) == SPC.SPC_HANDLE_EX ? "SCSI" + ((romHandle >> 2) & 7) :
1112: "ROM$" + XEiJ.fmtHex6 (romHandle));
1113: case 0xb000:
1114: return "RAM$" + XEiJ.fmtHex6 (ramAddress);
1115: default:
1116: return "STD";
1117: }
1118: }
1119:
1120:
1121:
1122: public static void smrClear () {
1123: XEiJ.pnlExitFullScreen (true);
1124: if (JOptionPane.showConfirmDialog (
1125: XEiJ.frmFrame,
1126: Multilingual.mlnJapanese ? "SRAM をクリアしますか?" : "Do you want to clear SRAM?",
1127: Multilingual.mlnJapanese ? "確認" : "Confirmation",
1128: JOptionPane.YES_NO_OPTION,
1129: JOptionPane.PLAIN_MESSAGE) == JOptionPane.YES_OPTION) {
1130: Arrays.fill (MainMemory.mmrM8, 0x00ed0000, 0x00ed0000 + 65536, (byte) 0x00);
1131: }
1132: }
1133:
1134:
1135:
1136: public static void smrLoad () {
1137: JFileChooser2 fileChooser = new JFileChooser2 ();
1138: fileChooser.setFileFilter (new javax.swing.filechooser.FileFilter () {
1139: @Override public boolean accept (File file) {
1140: String name = file.getName ();
1141: String upperName = name.toUpperCase ();
1142: return (file.isDirectory () ||
1143: (file.isFile () &&
1144: upperName.startsWith ("SRAM")));
1145: }
1146: @Override public String getDescription () {
1147: return (Multilingual.mlnJapanese ?
1148: "SRAM データファイル (SRAM*.*)" :
1149: "SRAM data files (SRAM*.*)");
1150: }
1151: });
1152: if (fileChooser.showOpenDialog (null) == JFileChooser.APPROVE_OPTION) {
1153: File file = fileChooser.getSelectedFile ();
1154: String name = file.getPath ();
1155: if (!smrLoadData (name)) {
1156: XEiJ.pnlExitFullScreen (true);
1157: JOptionPane.showMessageDialog (null,
1158: Multilingual.mlnJapanese ?
1159: name + " のサイズが違います" :
1160: name + " has wrong size");
1161: return;
1162: }
1163: }
1164: }
1165:
1166:
1167:
1168: public static boolean smrLoadData (String name) {
1169: byte[] array = XEiJ.rscGetFile (name, smrSramSizeRequest);
1170: if (array != null) {
1171: System.arraycopy (array, 0, MainMemory.mmrM8, 0x00ed0000, smrSramSizeRequest);
1172: if (smrSramSizeRequest < 65536) {
1173: Arrays.fill (MainMemory.mmrM8, 0x00ed0000 + smrSramSizeRequest, 0x00ed0000 + 65536, (byte) 0x00);
1174: }
1175: return true;
1176: }
1177: return false;
1178: }
1179:
1180:
1181:
1182: public static void smrSave () {
1183: JFileChooser2 fileChooser = new JFileChooser2 ();
1184: fileChooser.setFileFilter (new javax.swing.filechooser.FileFilter () {
1185: @Override public boolean accept (File file) {
1186: String name = file.getName ();
1187: String upperName = name.toUpperCase ();
1188: return (file.isDirectory () ||
1189: (file.isFile () &&
1190: upperName.startsWith ("SRAM")));
1191: }
1192: @Override public String getDescription () {
1193: return (Multilingual.mlnJapanese ?
1194: "SRAM データファイル (SRAM*.*)" :
1195: "SRAM data files (SRAM*.*)");
1196: }
1197: });
1198: if (fileChooser.showSaveDialog (null) == JFileChooser.APPROVE_OPTION) {
1199: XEiJ.rscPutFile (fileChooser.getSelectedFile ().getPath (), MainMemory.mmrM8, 0x00ed0000, smrSramSizeRequest);
1200: }
1201: }
1202:
1203: }