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 boolean smrModifyMemorySizeOn;
40:
41:
42: public static boolean smrSRAMBusErrorOn;
43:
44: public static JMenu smrRepeatDelayMenu;
45: public static JMenu smrRepeatIntervalMenu;
46: public static JMenu smrRomdbMenu;
47: public static JMenuItem smrModifyMemorySizeMenuItem;
48: public static JMenu smrMenu;
49: public static JMenu smrBootMenu;
50: public static JRadioButtonMenuItem smrSTDMenuItem;
51:
52:
53:
54: public static void smrInit () {
55:
56:
57: int sizeKB = Settings.sgsGetInt ("sramsize");
58: smrSramSizeRequest = (sizeKB == 16 ||
59: sizeKB == 32 ||
60: sizeKB == 64 ? sizeKB << 10 : 16 << 10);
61: smrSramCurrentSize = smrSramSizeRequest;
62: System.out.printf (Multilingual.mlnJapanese ?
63: "SRAM のサイズは %dKB です\n" :
64: "SRAM size is %dKB\n",
65: smrSramSizeRequest >> 10);
66:
67: boolean initialized = false;
68:
69:
70: smrSramName = "";
71: if (!initialized) {
72: smrSramName = Settings.sgsGetString ("sram");
73: if (smrSramName.length () != 0) {
74: byte[] array = XEiJ.rscGetFile (smrSramName, smrSramSizeRequest);
75: if (array != null) {
76: System.arraycopy (array, 0, MainMemory.mmrM8, 0x00ed0000, smrSramSizeRequest);
77: if (smrSramSizeRequest < 64 << 10) {
78: Arrays.fill (MainMemory.mmrM8, 0x00ed0000 + smrSramSizeRequest, 0x00ed0000 + (64 << 10), (byte) 0);
79: }
80: initialized = true;
81: }
82: }
83: }
84:
85:
86:
87: if (!initialized) {
88: byte[] array = Settings.sgsGetData ("sramdata");
89: if (array.length != 0) {
90: System.out.println (Multilingual.mlnJapanese ?
91: "SRAM のデータを復元します" :
92: "SRAM data is restored");
93: System.arraycopy (array, 0, MainMemory.mmrM8, 0x00ed0000, Math.min (array.length, smrSramSizeRequest));
94: if (array.length < smrSramSizeRequest) {
95: Arrays.fill (MainMemory.mmrM8, 0x00ed0000 + array.length, 0x00ed0000 + smrSramSizeRequest, (byte) 0);
96: }
97: if (smrSramSizeRequest < 64 << 10) {
98: Arrays.fill (MainMemory.mmrM8, 0x00ed0000 + smrSramSizeRequest, 0x00ed0000 + (64 << 10), (byte) 0);
99: }
100: initialized = true;
101: }
102: }
103:
104: if (!initialized) {
105: System.out.println (Multilingual.mlnJapanese ?
106: "SRAM をゼロクリアします" :
107: "SRAM is zero-cleared");
108: Arrays.fill (MainMemory.mmrM8, 0x00ed0000, 0x00ed0000 + (64 << 10), (byte) 0);
109: initialized = true;
110: }
111:
112:
113: int repeatDelay = Settings.sgsGetInt ("keydly");
114: smrRepeatDelay = -1 <= repeatDelay && repeatDelay <= 15 ? repeatDelay : -1;
115:
116:
117: int repeatInterval = Settings.sgsGetInt ("keyrep");
118: smrRepeatInterval = -1 <= repeatInterval && repeatInterval <= 15 ? repeatInterval : -1;
119:
120:
121: {
122: String s = Settings.sgsGetString ("romdb").toLowerCase ();
123: smrRomdbFlag = (s.equals ("off") ? 0 :
124: s.equals ("on") || s.equals ("aux") ? 255 :
125: s.equals ("con") ? 1 :
126: -1);
127: }
128:
129:
130: smrModifyMemorySizeOn = Settings.sgsGetOnOff ("modifymemorysize");
131:
132:
133: smrSRAMBusErrorOn = Settings.sgsGetOnOff ("srambuserror");
134:
135:
136: smrParseBootDevice (Settings.sgsGetString ("boot"));
137:
138: }
139:
140:
141:
142: public static void smrTini () {
143:
144:
145: Settings.sgsPutInt ("sramsize", smrSramSizeRequest >> 10);
146:
147:
148: Settings.sgsPutString ("sram", smrSramName);
149:
150:
151:
152:
153: Settings.sgsPutData ("sramdata", MainMemory.mmrM8, 0x00ed0000, 64 << 10);
154:
155:
156: Settings.sgsPutInt ("keydly", smrRepeatDelay);
157:
158:
159: Settings.sgsPutInt ("keyrep", smrRepeatInterval);
160:
161:
162: Settings.sgsPutString ("romdb",
163: smrRomdbFlag == 0 ? "off" :
164: smrRomdbFlag == 255 ? "aux" :
165: smrRomdbFlag == 1 ? "con" :
166: "");
167:
168:
169: Settings.sgsPutOnOff ("modifymemorysize", smrModifyMemorySizeOn);
170:
171:
172: Settings.sgsPutOnOff ("srambuserror", smrSRAMBusErrorOn);
173:
174:
175: Settings.sgsPutString ("boot",
176: smrBootDevice == -1 ? "default" :
177: smrBootDevice == 0x0000 ? "std" :
178: (smrBootDevice & 0xf000) == 0x9000 ? "fd" + (smrBootDevice >> 8 & 3) :
179: (smrBootDevice & 0xf000) == 0x8000 ? "hd" + (smrBootDevice >> 8 & 15) :
180: smrBootDevice == 0xa000 ?
181: (smrROMBootHandle & ~(7 << 2)) == SPC.SPC_HANDLE_EX ? "sc" + (smrROMBootHandle >> 2 & 7) :
182: (smrROMBootHandle & ~(7 << 2)) == SPC.SPC_HANDLE_IN ? "sc" + (smrROMBootHandle >> 2 & 7) :
183: smrROMBootHandle == HFS.HFS_BOOT_HANDLE ? "hf" + HFS.hfsBootUnit :
184: String.format ("rom$%08X", smrROMBootHandle) :
185: smrBootDevice == 0xb000 ? String.format ("ram$%08X", smrRAMBootAddress) :
186: "");
187:
188: }
189:
190: public static void smrMakeMenu () {
191:
192:
193: ActionListener listener = new ActionListener () {
194: @Override public void actionPerformed (ActionEvent ae) {
195: Object source = ae.getSource ();
196: String command = ae.getActionCommand ();
197: switch (command) {
198:
199: case "Modify the memory size in SRAM":
200: smrModifyMemorySizeOn = ((JCheckBoxMenuItem) source).isSelected ();
201: break;
202:
203: case "Zero-clear":
204: smrClear ();
205: break;
206: case "Import":
207: smrLoad ();
208: break;
209: case "Export":
210: smrSave ();
211: break;
212: case "16KB":
213: smrSramSizeRequest = 16384;
214: break;
215: case "32KB":
216: smrSramSizeRequest = 32768;
217: break;
218: case "64KB":
219: smrSramSizeRequest = 65536;
220: break;
221: case "Bus error when writing to SRAM":
222: smrSRAMBusErrorOn = ((JCheckBoxMenuItem) source).isSelected ();
223: break;
224: default:
225: System.out.println ("unknown action command " + command);
226: }
227: }
228: };
229:
230:
231: ActionListener delayListener = new ActionListener () {
232: @Override public void actionPerformed (ActionEvent ae) {
233: String command = ae.getActionCommand ();
234: switch (command) {
235: case "Follow settings in SWITCH.X":
236: smrRepeatDelay = -1;
237: Keyboard.kbdSetRepeatDelay (MainMemory.mmrRbs (0x00ed003a));
238: break;
239: case (200 + 100 * 0) + "ms":
240: case (200 + 100 * 1) + "ms":
241: case (200 + 100 * 2) + "ms":
242: case (200 + 100 * 3) + "ms":
243: case (200 + 100 * 4) + "ms":
244: case (200 + 100 * 5) + "ms":
245: case (200 + 100 * 6) + "ms":
246: case (200 + 100 * 7) + "ms":
247: case (200 + 100 * 8) + "ms":
248: case (200 + 100 * 9) + "ms":
249: case (200 + 100 * 10) + "ms":
250: case (200 + 100 * 11) + "ms":
251: case (200 + 100 * 12) + "ms":
252: case (200 + 100 * 13) + "ms":
253: case (200 + 100 * 14) + "ms":
254: case (200 + 100 * 15) + "ms":
255: {
256: int ms = Integer.parseInt (command.substring (0, command.length () - 2));
257:
258:
259: smrRepeatDelay = (ms - 200) * 1311 >>> 17;
260: Keyboard.kbdSetRepeatDelay (smrRepeatDelay);
261: MainMemory.mmrWb (0x00ed003a, smrRepeatDelay);
262: }
263: break;
264: default:
265: System.out.println ("unknown action command " + command);
266: }
267: }
268: };
269: ButtonGroup delayGroup = new ButtonGroup ();
270: smrRepeatDelayMenu =
271: Multilingual.mlnText (
272: ComponentFactory.createMenu (
273: "Repeat delay",
274: Multilingual.mlnText (
275: ComponentFactory.createRadioButtonMenuItem (delayGroup, smrRepeatDelay == -1, "Follow settings in SWITCH.X", delayListener),
276: "ja", "SWITCH.X の設定に従う"),
277: ComponentFactory.createRadioButtonMenuItem (delayGroup, smrRepeatDelay == 0, (200 + 100 * 0) + "ms", delayListener),
278: ComponentFactory.createRadioButtonMenuItem (delayGroup, smrRepeatDelay == 1, (200 + 100 * 1) + "ms", delayListener),
279: ComponentFactory.createRadioButtonMenuItem (delayGroup, smrRepeatDelay == 2, (200 + 100 * 2) + "ms", delayListener),
280: ComponentFactory.createRadioButtonMenuItem (delayGroup, smrRepeatDelay == 3, (200 + 100 * 3) + "ms", delayListener),
281: ComponentFactory.createRadioButtonMenuItem (delayGroup, smrRepeatDelay == 4, (200 + 100 * 4) + "ms", delayListener),
282: ComponentFactory.createRadioButtonMenuItem (delayGroup, smrRepeatDelay == 5, (200 + 100 * 5) + "ms", delayListener),
283: ComponentFactory.createRadioButtonMenuItem (delayGroup, smrRepeatDelay == 6, (200 + 100 * 6) + "ms", delayListener),
284: ComponentFactory.createRadioButtonMenuItem (delayGroup, smrRepeatDelay == 7, (200 + 100 * 7) + "ms", delayListener),
285: ComponentFactory.createRadioButtonMenuItem (delayGroup, smrRepeatDelay == 8, (200 + 100 * 8) + "ms", delayListener),
286: ComponentFactory.createRadioButtonMenuItem (delayGroup, smrRepeatDelay == 9, (200 + 100 * 9) + "ms", delayListener),
287: ComponentFactory.createRadioButtonMenuItem (delayGroup, smrRepeatDelay == 10, (200 + 100 * 10) + "ms", delayListener),
288: ComponentFactory.createRadioButtonMenuItem (delayGroup, smrRepeatDelay == 11, (200 + 100 * 11) + "ms", delayListener),
289: ComponentFactory.createRadioButtonMenuItem (delayGroup, smrRepeatDelay == 12, (200 + 100 * 12) + "ms", delayListener),
290: ComponentFactory.createRadioButtonMenuItem (delayGroup, smrRepeatDelay == 13, (200 + 100 * 13) + "ms", delayListener),
291: ComponentFactory.createRadioButtonMenuItem (delayGroup, smrRepeatDelay == 14, (200 + 100 * 14) + "ms", delayListener),
292: ComponentFactory.createRadioButtonMenuItem (delayGroup, smrRepeatDelay == 15, (200 + 100 * 15) + "ms", delayListener)
293: ),
294: "ja", "リピート開始");
295:
296:
297: ActionListener intervalListener = new ActionListener () {
298: @Override public void actionPerformed (ActionEvent ae) {
299: String command = ae.getActionCommand ();
300: switch (command) {
301: case "Follow settings in SWITCH.X":
302: smrRepeatInterval = -1;
303: Keyboard.kbdSetRepeatInterval (MainMemory.mmrRbs (0x00ed003b));
304: break;
305: case (30 + 5 * 0 * 0) + "ms":
306: case (30 + 5 * 1 * 1) + "ms":
307: case (30 + 5 * 2 * 2) + "ms":
308: case (30 + 5 * 3 * 3) + "ms":
309: case (30 + 5 * 4 * 4) + "ms":
310: case (30 + 5 * 5 * 5) + "ms":
311: case (30 + 5 * 6 * 6) + "ms":
312: case (30 + 5 * 7 * 7) + "ms":
313: case (30 + 5 * 8 * 8) + "ms":
314: case (30 + 5 * 9 * 9) + "ms":
315: case (30 + 5 * 10 * 10) + "ms":
316: case (30 + 5 * 11 * 11) + "ms":
317: case (30 + 5 * 12 * 12) + "ms":
318: case (30 + 5 * 13 * 13) + "ms":
319: case (30 + 5 * 14 * 14) + "ms":
320: case (30 + 5 * 15 * 15) + "ms":
321: {
322: int ms = Integer.parseInt (command.substring (0, command.length () - 2));
323:
324:
325: smrRepeatInterval = (int) Math.sqrt ((double) ((ms - 30) * 1639 >>> 13));
326: Keyboard.kbdSetRepeatInterval (smrRepeatInterval);
327: MainMemory.mmrWb (0x00ed003b, smrRepeatInterval);
328: }
329: break;
330: default:
331: System.out.println ("unknown action command " + command);
332: }
333: }
334: };
335: ButtonGroup intervalGroup = new ButtonGroup ();
336: smrRepeatIntervalMenu =
337: Multilingual.mlnText (
338: ComponentFactory.createMenu (
339: "Repeat interval",
340: Multilingual.mlnText (
341: ComponentFactory.createRadioButtonMenuItem (intervalGroup, smrRepeatInterval == -1, "Follow settings in SWITCH.X", intervalListener),
342: "ja", "SWITCH.X の設定に従う"),
343: ComponentFactory.createRadioButtonMenuItem (intervalGroup, smrRepeatInterval == 0, (30 + 5 * 0 * 0) + "ms", intervalListener),
344: ComponentFactory.createRadioButtonMenuItem (intervalGroup, smrRepeatInterval == 1, (30 + 5 * 1 * 1) + "ms", intervalListener),
345: ComponentFactory.createRadioButtonMenuItem (intervalGroup, smrRepeatInterval == 2, (30 + 5 * 2 * 2) + "ms", intervalListener),
346: ComponentFactory.createRadioButtonMenuItem (intervalGroup, smrRepeatInterval == 3, (30 + 5 * 3 * 3) + "ms", intervalListener),
347: ComponentFactory.createRadioButtonMenuItem (intervalGroup, smrRepeatInterval == 4, (30 + 5 * 4 * 4) + "ms", intervalListener),
348: ComponentFactory.createRadioButtonMenuItem (intervalGroup, smrRepeatInterval == 5, (30 + 5 * 5 * 5) + "ms", intervalListener),
349: ComponentFactory.createRadioButtonMenuItem (intervalGroup, smrRepeatInterval == 6, (30 + 5 * 6 * 6) + "ms", intervalListener),
350: ComponentFactory.createRadioButtonMenuItem (intervalGroup, smrRepeatInterval == 7, (30 + 5 * 7 * 7) + "ms", intervalListener),
351: ComponentFactory.createRadioButtonMenuItem (intervalGroup, smrRepeatInterval == 8, (30 + 5 * 8 * 8) + "ms", intervalListener),
352: ComponentFactory.createRadioButtonMenuItem (intervalGroup, smrRepeatInterval == 9, (30 + 5 * 9 * 9) + "ms", intervalListener),
353: ComponentFactory.createRadioButtonMenuItem (intervalGroup, smrRepeatInterval == 10, (30 + 5 * 10 * 10) + "ms", intervalListener),
354: ComponentFactory.createRadioButtonMenuItem (intervalGroup, smrRepeatInterval == 11, (30 + 5 * 11 * 11) + "ms", intervalListener),
355: ComponentFactory.createRadioButtonMenuItem (intervalGroup, smrRepeatInterval == 12, (30 + 5 * 12 * 12) + "ms", intervalListener),
356: ComponentFactory.createRadioButtonMenuItem (intervalGroup, smrRepeatInterval == 13, (30 + 5 * 13 * 13) + "ms", intervalListener),
357: ComponentFactory.createRadioButtonMenuItem (intervalGroup, smrRepeatInterval == 14, (30 + 5 * 14 * 14) + "ms", intervalListener),
358: ComponentFactory.createRadioButtonMenuItem (intervalGroup, smrRepeatInterval == 15, (30 + 5 * 15 * 15) + "ms", intervalListener)
359: ),
360: "ja", "リピート間隔");
361:
362:
363: ActionListener romdbListener = new ActionListener () {
364: @Override public void actionPerformed (ActionEvent ae) {
365: String command = ae.getActionCommand ();
366: switch (command) {
367: case "Follow settings in SWITCH.X":
368: smrRomdbFlag = -1;
369: break;
370: case "OFF":
371: smrRomdbFlag = 0;
372: break;
373: case "AUX":
374: smrRomdbFlag = 255;
375: break;
376: case "CON (when using IPLROM 1.6)":
377: smrRomdbFlag = 1;
378: break;
379: default:
380: System.out.println ("unknown action command " + command);
381: }
382: }
383: };
384: ButtonGroup romdbGroup = new ButtonGroup ();
385: smrRomdbMenu =
386: Multilingual.mlnText (
387: ComponentFactory.createMenu (
388: "ROM debugger start flag",
389: Multilingual.mlnText (
390: ComponentFactory.createRadioButtonMenuItem (romdbGroup, smrRomdbFlag == -1, "Follow settings in SWITCH.X", romdbListener),
391: "ja", "SWITCH.X の設定に従う"),
392: ComponentFactory.createRadioButtonMenuItem (romdbGroup, smrRomdbFlag == 0, "OFF", romdbListener),
393: ComponentFactory.createRadioButtonMenuItem (romdbGroup, smrRomdbFlag == 255, "AUX", romdbListener),
394: Multilingual.mlnText (
395: ComponentFactory.createRadioButtonMenuItem (romdbGroup, smrRomdbFlag == 1, "CON (when using IPLROM 1.6)", romdbListener),
396: "ja", "CON (IPLROM 1.6 使用時)")
397: ),
398: "ja", "ROM デバッガ起動フラグ");
399:
400:
401: smrModifyMemorySizeMenuItem =
402: Multilingual.mlnText (
403: ComponentFactory.createCheckBoxMenuItem (smrModifyMemorySizeOn, "Modify the memory size in SRAM", listener),
404: "ja", "SRAM にあるメモリサイズを修正する");
405:
406:
407: ButtonGroup sizeGroup = new ButtonGroup ();
408: smrMenu =
409: ComponentFactory.createMenu (
410: "SRAM",
411: Multilingual.mlnText (
412: ComponentFactory.createMenuItem ("Zero-clear", listener),
413: "ja", "ゼロクリア"),
414: Multilingual.mlnText (
415: ComponentFactory.createMenuItem ("Import", listener),
416: "ja", "インポート"),
417: Multilingual.mlnText (
418: ComponentFactory.createMenuItem ("Export", listener),
419: "ja", "エクスポート"),
420: ComponentFactory.createHorizontalSeparator (),
421: Multilingual.mlnText (
422: ComponentFactory.createRadioButtonMenuItem (sizeGroup, smrSramSizeRequest >> 10 == 16, "16KB", listener),
423: "ja", "16KB"),
424: Multilingual.mlnText (
425: ComponentFactory.createRadioButtonMenuItem (sizeGroup, smrSramSizeRequest >> 10 == 32, "32KB", listener),
426: "ja", "32KB"),
427: Multilingual.mlnText (
428: ComponentFactory.createRadioButtonMenuItem (sizeGroup, smrSramSizeRequest >> 10 == 64, "64KB", listener),
429: "ja", "64KB"),
430: ComponentFactory.createHorizontalSeparator (),
431: Multilingual.mlnText (
432: ComponentFactory.createCheckBoxMenuItem (smrSRAMBusErrorOn, "Bus error when writing to SRAM", listener),
433: "ja", "SRAM への書き込み時のバスエラー")
434: );
435:
436:
437: ButtonGroup bootGroup = new ButtonGroup ();
438: ActionListener bootListener = new ActionListener () {
439: @Override public void actionPerformed (ActionEvent ae) {
440: String command = ae.getActionCommand ();
441: smrParseBootDevice (
442: command.startsWith ("FDD ") ? "fd" + command.substring (4) :
443: command.startsWith ("SASI ") ? "hd" + command.substring (5) :
444: command.startsWith ("SCSI ") ? "sc" + command.substring (5) :
445: command.startsWith ("HFS ") ? "hf" + command.substring (4) :
446: command.equals ("STD") ? "std" :
447: "default");
448: if (smrBootDevice != -1) {
449: XEiJ.mpuSavedBootDevice = -1;
450: XEiJ.mpuSavedROMBootHandle = -1;
451: }
452: }
453: };
454: JMenu bootMenuFDD = ComponentFactory.createMenu ("FDD");
455: for (int u = 0; u < FDC.FDC_MAX_UNITS; u++) {
456: bootMenuFDD.add (ComponentFactory.createRadioButtonMenuItem (
457: bootGroup, smrBootDevice == 0x9070 + (u << 8),
458: "FDD " + u, bootListener));
459: }
460: JMenu bootMenuSASI = ComponentFactory.createMenu ("SASI");
461: for (int u = 0; u < 16; u++) {
462: bootMenuSASI.add (ComponentFactory.createRadioButtonMenuItem (
463: bootGroup, smrBootDevice == 0x8000 + (u << 8),
464: "SASI " + u, bootListener));
465: }
466: JMenu bootMenuSCSI = ComponentFactory.createMenu ("SCSI");
467: for (int u = 0; u < 8; u++) {
468: bootMenuSCSI.add (ComponentFactory.createRadioButtonMenuItem (
469: bootGroup, smrBootDevice == 0xa000 && (smrROMBootHandle == SPC.SPC_HANDLE_EX + (u << 2) ||
470: smrROMBootHandle == SPC.SPC_HANDLE_IN + (u << 2)), "SCSI " + u, bootListener));
471: }
472: JMenu bootMenuHFS = ComponentFactory.createMenu ("HFS");
473: for (int u = 0; u < HFS.HFS_MAX_UNITS; u++) {
474: bootMenuHFS.add (ComponentFactory.createRadioButtonMenuItem (
475: bootGroup, smrBootDevice == 0xa000 && smrROMBootHandle == HFS.HFS_BOOT_HANDLE && HFS.hfsBootUnit == u,
476: "HFS " + u, bootListener));
477: }
478: smrBootMenu =
479: Multilingual.mlnText (
480: ComponentFactory.createMenu (
481: "Boot device",
482: Multilingual.mlnText (
483: ComponentFactory.createRadioButtonMenuItem (bootGroup, smrBootDevice == -1, "Follow settings in SWITCH.X", bootListener),
484: "ja", "SWITCH.X の設定に従う"),
485: smrSTDMenuItem = ComponentFactory.createRadioButtonMenuItem (bootGroup, smrBootDevice == 0x0000, "STD", bootListener),
486: bootMenuFDD,
487: bootMenuSASI,
488: bootMenuSCSI,
489: bootMenuHFS
490: ),
491: "ja", "起動デバイス");
492:
493: }
494:
495:
496:
497: public static void smrParseBootDevice (String boot) {
498: smrBootDevice = -1;
499: smrROMBootHandle = -1;
500: smrRAMBootAddress = -1;
501: boot = boot.toLowerCase ();
502: if (boot.equals ("std")) {
503: smrBootDevice = 0x0000;
504: } else if (boot.startsWith ("fd")) {
505: int u = XEiJ.fmtParseInt (boot, 2, 0, FDC.FDC_MAX_UNITS - 1, FDC.FDC_MAX_UNITS);
506: if (u < FDC.FDC_MAX_UNITS) {
507: smrBootDevice = 0x9070 + (u << 8);
508: }
509: } else if (boot.startsWith ("hd")) {
510: int u = XEiJ.fmtParseInt (boot, 2, 0, 15, 16);
511: if (u < 16) {
512: smrBootDevice = 0x8000 + (u << 8);
513: }
514: } else if (boot.startsWith ("sc")) {
515: int u = XEiJ.fmtParseInt (boot, 2, 0, 7, 8);
516: if (u < 8) {
517: smrBootDevice = 0xa000;
518: smrROMBootHandle = SPC.SPC_HANDLE_EX + ((u & 7) << 2);
519: }
520: } else if (boot.startsWith ("hf")) {
521: int u = XEiJ.fmtParseInt (boot, 2, 0, HFS.HFS_MAX_UNITS - 1, HFS.HFS_MAX_UNITS);
522: if (u < HFS.HFS_MAX_UNITS) {
523: HFS.hfsBootUnit = u;
524: smrBootDevice = 0xa000;
525: smrROMBootHandle = HFS.HFS_BOOT_HANDLE;
526: }
527: } else if (boot.startsWith ("rom$")) {
528: int handle = XEiJ.fmtParseIntRadix (boot, 3, 0, 0x00ffffff, 0x01000000, 16);
529: if (handle < 0x01000000) {
530: smrBootDevice = 0xa000;
531: smrROMBootHandle = handle;
532: }
533: } else if (boot.startsWith ("ram$")) {
534: int handle = XEiJ.fmtParseIntRadix (boot, 3, 0, 0x00ffffff, 0x01000000, 16);
535: if (handle < 0x01000000) {
536: smrBootDevice = 0xb000;
537: smrRAMBootAddress = handle;
538: }
539: }
540: }
541:
542:
543:
544:
545:
546:
547: public static void smrReset () {
548: smrWriteEnableOn = false;
549:
550:
551: {
552: smrSramCurrentSize = smrSramSizeRequest;
553: XEiJ.busSuper (MemoryMappedDevice.MMD_SMR, 0x00ed0000, 0x00ed0000 + smrSramSizeRequest);
554: if (smrSramSizeRequest < 65536) {
555: XEiJ.busSuper (MemoryMappedDevice.MMD_NUL, 0x00ed0000 + smrSramSizeRequest, 0x00ed0000 + 65536);
556: }
557: System.out.printf (Multilingual.mlnJapanese ?
558: "SRAM の容量は %dKB ($%08X-$%08X) です\n" :
559: "Capacity of SRAM is %dKB ($%08X-$%08X)\n",
560: smrSramCurrentSize >> 10, 0x00ed0000, 0x00ed0000 + smrSramCurrentSize - 1);
561: }
562:
563:
564:
565:
566:
567:
568:
569:
570:
571:
572:
573:
574:
575:
576:
577:
578:
579:
580:
581:
582:
583: if ((smrROMBootHandle & ~(7 << 2)) == SPC.SPC_HANDLE_IN && !SPC.spcSCSIINOn) {
584: if (SPC.spcSCSIEXOn) {
585: smrROMBootHandle = SPC.SPC_HANDLE_EX + (smrROMBootHandle & (7 << 2));
586:
587: } else {
588: smrROMBootHandle = 0x00e80400;
589: if (smrBootDevice == 0xa000) {
590: smrBootDevice = 0x0000;
591: smrSTDMenuItem.setSelected (true);
592: }
593: }
594: }
595: if ((smrROMBootHandle & ~(7 << 2)) == SPC.SPC_HANDLE_EX && !SPC.spcSCSIEXOn) {
596: if (SPC.spcSCSIINOn) {
597: smrROMBootHandle = SPC.SPC_HANDLE_IN + (smrROMBootHandle & (7 << 2));
598:
599: } else {
600: smrROMBootHandle = 0x00e80400;
601: if (smrBootDevice == 0xa000) {
602: smrBootDevice = 0x0000;
603: smrSTDMenuItem.setSelected (true);
604: }
605: }
606: }
607: if (smrROMBootHandle == HFS.HFS_BOOT_HANDLE &&
608: (!HFS.hfsUnitArray[HFS.hfsBootUnit].abuConnected ||
609: !HFS.hfsUnitArray[HFS.hfsBootUnit].abuInserted)) {
610: smrROMBootHandle = 0x00e80400;
611: if (smrBootDevice == 0xa000) {
612: smrBootDevice = 0x0000;
613: smrSTDMenuItem.setSelected (true);
614: }
615: }
616:
617: if ((XEiJ.mpuROMBootHandle & ~(7 << 2)) == SPC.SPC_HANDLE_IN && !SPC.spcSCSIINOn) {
618: if (SPC.spcSCSIEXOn) {
619: XEiJ.mpuROMBootHandle = SPC.SPC_HANDLE_EX + (XEiJ.mpuROMBootHandle & (7 << 2));
620:
621: } else {
622: XEiJ.mpuROMBootHandle = 0x00e80400;
623: if (XEiJ.mpuBootDevice == 0xa000) {
624: XEiJ.mpuBootDevice = 0x0000;
625: }
626: }
627: }
628: if ((XEiJ.mpuROMBootHandle & ~(7 << 2)) == SPC.SPC_HANDLE_EX && !SPC.spcSCSIEXOn) {
629: if (SPC.spcSCSIINOn) {
630: XEiJ.mpuROMBootHandle = SPC.SPC_HANDLE_IN + (XEiJ.mpuROMBootHandle & (7 << 2));
631:
632: } else {
633: XEiJ.mpuROMBootHandle = 0x00e80400;
634: if (XEiJ.mpuBootDevice == 0xa000) {
635: XEiJ.mpuBootDevice = 0x0000;
636: }
637: }
638: }
639: if (XEiJ.mpuROMBootHandle == HFS.HFS_BOOT_HANDLE &&
640: (!HFS.hfsUnitArray[HFS.hfsBootUnit].abuConnected ||
641: !HFS.hfsUnitArray[HFS.hfsBootUnit].abuInserted)) {
642: XEiJ.mpuROMBootHandle = 0x00e80400;
643: if (XEiJ.mpuBootDevice == 0xa000) {
644: XEiJ.mpuBootDevice = 0x0000;
645: }
646: }
647:
648: smrOverride ();
649:
650: }
651:
652:
653:
654:
655: public static void smrOverride () {
656: if (MainMemory.mmrRls (0x00ed0000) == 0x82773638 &&
657: MainMemory.mmrRls (0x00ed0004) == 0x30303057) {
658:
659: if (smrModifyMemorySizeOn) {
660: int memorySizeAddress = 0x00ed0008;
661: int memorySizeOld = MainMemory.mmrRls (memorySizeAddress);
662: int memorySizeNew = MainMemory.mmrMemorySizeCurrent;
663: if (memorySizeOld != memorySizeNew) {
664: MainMemory.mmrWl (memorySizeAddress, memorySizeNew);
665: System.out.printf (Multilingual.mlnJapanese ?
666: "SRAM にあるメモリサイズを %dMB から %dMB に変更しました\n" :
667: "Changed the memory size in SRAM from %dMB to %dMB\n",
668: memorySizeOld >> 20,
669: memorySizeNew >> 20);
670: }
671: }
672:
673: int romHandleAddress = 0x00ed000c;
674: int romHandleOld = MainMemory.mmrRls (romHandleAddress);
675: int romHandleNew = XEiJ.mpuROMBootHandle != -1 ? XEiJ.mpuROMBootHandle : smrROMBootHandle;
676: if (romHandleNew != -1 &&
677: romHandleOld != romHandleNew) {
678: MainMemory.mmrWl (romHandleAddress, romHandleNew);
679: System.out.printf (Multilingual.mlnJapanese ?
680: "SRAM にある ROM 起動ハンドルを $%08X から $%08X に変更しました\n" :
681: "Changed the ROM boot handle in SRAM from $%08X to $%08X\n",
682: romHandleOld,
683: romHandleNew);
684: }
685:
686: int ramAddressAddress = 0x00ed0010;
687: int ramAddressOld = MainMemory.mmrRls (ramAddressAddress);
688: int ramAddressNew = smrRAMBootAddress;
689: if (ramAddressNew != -1 &&
690: ramAddressOld != ramAddressNew) {
691: MainMemory.mmrWl (ramAddressAddress, ramAddressNew);
692: System.out.printf (Multilingual.mlnJapanese ?
693: "SRAM にある RAM 起動アドレスを $%08X から $%08X に変更しました\n" :
694: "Changed the RAM boot address in SRAM from $%08X to $%08X\n",
695: ramAddressOld,
696: ramAddressNew);
697: }
698:
699: int deviceAddress = 0x00ed0018;
700: int deviceOld = MainMemory.mmrRwz (deviceAddress);
701: int deviceNew = XEiJ.mpuBootDevice != -1 ? XEiJ.mpuBootDevice : smrBootDevice;
702: if (deviceNew != -1 &&
703: deviceOld != deviceNew) {
704: MainMemory.mmrWw (deviceAddress, deviceNew);
705: System.out.printf (Multilingual.mlnJapanese ?
706: "SRAM にある起動デバイスを %s から %s に変更しました\n" :
707: "Changed the boot device in SRAM from %s to %s\n",
708: smrBootDescription (romHandleOld, ramAddressOld, deviceOld),
709: smrBootDescription (romHandleNew, ramAddressNew, deviceNew));
710: }
711:
712: int repeatDelayAddress = 0x00ed003a;
713: int repeatDelayOld = MainMemory.mmrRbz (repeatDelayAddress);
714: int repeatDelayNew = smrRepeatDelay;
715: if (repeatDelayNew != -1 &&
716: repeatDelayOld != repeatDelayNew) {
717: MainMemory.mmrWb (repeatDelayAddress, repeatDelayNew);
718: System.out.printf (Multilingual.mlnJapanese ?
719: "SRAM にあるリピート開始を %dms から %dms に変更しました\n" :
720: "Changed the repeat delay in SRAM from %dms to %dms\n",
721: 200 + 100 * (repeatDelayOld & 15),
722: 200 + 100 * (repeatDelayNew & 15));
723: }
724:
725: int repeatIntervalAddress = 0x00ed003b;
726: int repeatIntervalOld = MainMemory.mmrRbz (repeatIntervalAddress);
727: int repeatIntervalNew = smrRepeatInterval;
728: if (repeatIntervalNew != -1 &&
729: repeatIntervalOld != repeatIntervalNew) {
730: MainMemory.mmrWb (repeatIntervalAddress, repeatIntervalNew);
731: System.out.printf (Multilingual.mlnJapanese ?
732: "SRAM にあるリピート間隔を %dms から %dms に変更しました\n" :
733: "Changed the repeat interval in SRAM from %dms to %dms\n",
734: 30 + 5 * (repeatDelayOld & 15),
735: 30 + 5 * (repeatDelayNew & 15));
736: }
737:
738: if (smrRomdbFlag != -1) {
739: boolean iplrom16 = (XEiJ.currentAccelerator == XEiJ.ACCELERATOR_HYBRID ||
740: XEiJ.currentAccelerator == XEiJ.ACCELERATOR_060TURBO ||
741: XEiJ.currentAccelerator == XEiJ.ACCELERATOR_060TURBOPRO ||
742: ROM.romIPLROM16On);
743: boolean nonexistence = (XEiJ.currentModel.getIPLROM () == 130 && !iplrom16 &&
744: ROM.romROM30Data == null);
745: int address = 0x00ed0058;
746: int oldData = MainMemory.mmrRbz (address);
747: int newData = (nonexistence ? 0 :
748: !iplrom16 && smrRomdbFlag == 1 ? 255 :
749: smrRomdbFlag);
750: if (oldData != newData) {
751: MainMemory.mmrWb (address, newData);
752: System.out.printf (Multilingual.mlnJapanese ?
753: "SRAM にある ROM デバッガ起動フラグを %s から %s に変更しました\n" :
754: "ROM debugger startup flag in SRAM changed from %s to %s\n",
755: oldData == 0 ? "OFF" : oldData == 255 ? "AUX" : "CON",
756: newData == 0 ? "OFF" : newData == 255 ? "AUX" : "CON");
757: }
758: }
759:
760: int hdMaxAddress = 0x00ed005a;
761: int hdMaxOld = MainMemory.mmrRbz (hdMaxAddress);
762: int sasiFlag = MainMemory.mmrRbz (0x00ed006f) == 'V' ? MainMemory.mmrRbz (0x00ed0071) : 0;
763: int hdMaxNew = SPC.spcSCSIINOn ? 2 * (32 - Integer.numberOfLeadingZeros (sasiFlag)) : HDC.hdcHDMax;
764: if (hdMaxOld != hdMaxNew) {
765: MainMemory.mmrWb (hdMaxAddress, hdMaxNew);
766: System.out.printf (Multilingual.mlnJapanese ?
767: "SRAM にある SASI ハードディスクの最大数を %d から %d に変更しました\n" :
768: "Changed the maximum number of SASI hard disks in SRAM from %d to %d\n",
769: hdMaxOld, hdMaxNew);
770: }
771: }
772:
773:
774:
775: }
776:
777:
778:
779:
780:
781:
782:
783:
784:
785:
786:
787: public static String smrBootDescription (int romHandle, int ramAddress, int device) {
788: switch (device & 0xf000) {
789: case 0x8000:
790: return "HD" + (device >> 8 & 15);
791: case 0x9000:
792: return "2HD" + (device >> 8 & 3);
793: case 0xa000:
794: return ((romHandle & ~(7 << 2)) == SPC.SPC_HANDLE_IN ? "SCSI" + ((romHandle >> 2) & 7) :
795: (romHandle & ~(7 << 2)) == SPC.SPC_HANDLE_EX ? "SCSI" + ((romHandle >> 2) & 7) :
796: "ROM$" + XEiJ.fmtHex6 (romHandle));
797: case 0xb000:
798: return "RAM$" + XEiJ.fmtHex6 (ramAddress);
799: default:
800: return "STD";
801: }
802: }
803:
804:
805:
806: public static void smrClear () {
807: XEiJ.pnlExitFullScreen (true);
808: if (JOptionPane.showConfirmDialog (
809: XEiJ.frmFrame,
810: Multilingual.mlnJapanese ? "SRAM をクリアしますか?" : "Do you want to clear SRAM?",
811: Multilingual.mlnJapanese ? "確認" : "Confirmation",
812: JOptionPane.YES_NO_OPTION,
813: JOptionPane.PLAIN_MESSAGE) == JOptionPane.YES_OPTION) {
814: Arrays.fill (MainMemory.mmrM8, 0x00ed0000, 0x00ed0000 + 65536, (byte) 0x00);
815: }
816: }
817:
818:
819:
820: public static void smrLoad () {
821: JFileChooser2 fileChooser = new JFileChooser2 ();
822: fileChooser.setFileFilter (new javax.swing.filechooser.FileFilter () {
823: @Override public boolean accept (File file) {
824: String name = file.getName ();
825: String upperName = name.toUpperCase ();
826: return (file.isDirectory () ||
827: (file.isFile () &&
828: upperName.startsWith ("SRAM")));
829: }
830: @Override public String getDescription () {
831: return (Multilingual.mlnJapanese ?
832: "SRAM データファイル (SRAM*.*)" :
833: "SRAM data files (SRAM*.*)");
834: }
835: });
836: if (fileChooser.showOpenDialog (null) == JFileChooser.APPROVE_OPTION) {
837: File file = fileChooser.getSelectedFile ();
838: String name = file.getPath ();
839: if (!smrLoadData (name)) {
840: XEiJ.pnlExitFullScreen (true);
841: JOptionPane.showMessageDialog (null,
842: Multilingual.mlnJapanese ?
843: name + " のサイズが違います" :
844: name + " has wrong size");
845: return;
846: }
847: }
848: }
849:
850:
851:
852: public static boolean smrLoadData (String name) {
853: byte[] array = XEiJ.rscGetFile (name, smrSramSizeRequest);
854: if (array != null) {
855: System.arraycopy (array, 0, MainMemory.mmrM8, 0x00ed0000, smrSramSizeRequest);
856: if (smrSramSizeRequest < 65536) {
857: Arrays.fill (MainMemory.mmrM8, 0x00ed0000 + smrSramSizeRequest, 0x00ed0000 + 65536, (byte) 0x00);
858: }
859: return true;
860: }
861: return false;
862: }
863:
864:
865:
866: public static void smrSave () {
867: JFileChooser2 fileChooser = new JFileChooser2 ();
868: fileChooser.setFileFilter (new javax.swing.filechooser.FileFilter () {
869: @Override public boolean accept (File file) {
870: String name = file.getName ();
871: String upperName = name.toUpperCase ();
872: return (file.isDirectory () ||
873: (file.isFile () &&
874: upperName.startsWith ("SRAM")));
875: }
876: @Override public String getDescription () {
877: return (Multilingual.mlnJapanese ?
878: "SRAM データファイル (SRAM*.*)" :
879: "SRAM data files (SRAM*.*)");
880: }
881: });
882: if (fileChooser.showSaveDialog (null) == JFileChooser.APPROVE_OPTION) {
883: XEiJ.rscPutFile (fileChooser.getSelectedFile ().getPath (), MainMemory.mmrM8, 0x00ed0000, smrSramSizeRequest);
884: }
885: }
886:
887: }