HDC.java
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18: package xeij;
19:
20: import java.awt.event.*;
21: import java.io.*;
22: import java.lang.*;
23: import java.util.*;
24: import java.util.zip.*;
25: import javax.swing.*;
26:
27: public class HDC {
28:
29: public static final boolean HDC_DEBUG_TRACE = false;
30: public static final boolean HDC_DEBUG_COMMAND = false;
31: public static final boolean HDC_DEBUG_UNIMPLEMENTED_COMMAND = true;
32:
33: public static final int HDC_BASE = 0x00e96000;
34: public static final int HDC_DATA_PORT = 0x00e96001;
35: public static final int HDC_STATUS_PORT = 0x00e96003;
36: public static final int HDC_RESET_PORT = 0x00e96005;
37: public static final int HDC_SELECTION_PORT = 0x00e96007;
38:
39: public static final int HDC_STATUS_MESSAGE = 0b10000;
40: public static final int HDC_STATUS_C_D = 0b01000;
41: public static final int HDC_STATUS_COMMAND = 0b01000;
42: public static final int HDC_STATUS_DATA = 0b00000;
43: public static final int HDC_STATUS_I_O = 0b00100;
44: public static final int HDC_STATUS_OUTPUT = 0b00000;
45: public static final int HDC_STATUS_INPUT = 0b00100;
46: public static final int HDC_STATUS_BUSY = 0b00010;
47: public static final int HDC_STATUS_FREE = 0b00000;
48: public static final int HDC_STATUS_REQUEST = 0b00001;
49:
50: public static final String[] HDC_COMMAND_NAME = (
51: "TestDriveReady" + "," +
52: "Recalibrate" + "," +
53: "" + "," +
54: "RequestSenseStatus" + "," +
55: "FormatDrive" + "," +
56: "CheckTrackFormat" + "," +
57: "FormatBlock" + "," +
58: "BadTrackFormat" + "," +
59: "Read" + "," +
60: "" + "," +
61: "Write" + "," +
62: "Seek" + "," +
63: "InitializeDriveCharacteristic" + "," +
64: "LastCorrectedBurstLength" + "," +
65: "AssignTrack" + "," +
66: "WriteSectorBuffer" + "," +
67: "ReadSectorBuffer" + "," +
68:
69: ",,,,,,,,,,,,,,," +
70: ",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +
71: ",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +
72: ",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +
73: ",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +
74: ",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," +
75: ",," +
76: "AssignDrive" + "," +
77: ",,,,,,,,,,,,,,,,,,,,,,,,,,,,," +
78: ",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"
79: ).split (",", 256);
80:
81:
82:
83: public static JMenu hdcMenu;
84:
85:
86: public static javax.swing.filechooser.FileFilter hdcFileFilter;
87:
88:
89: public static OpenDialog hdcOpenDialog;
90: public static int hdcOpenUnit;
91: public static ArrayList<File[]> hdcOpenHistory;
92:
93:
94: public static JDialog hdcFormatDialog;
95: public static JFileChooser2 hdcFormatFileChooser;
96: public static HDMedia hdcFormatMedia;
97: public static boolean hdcFormatCopySystemFiles;
98:
99:
100: public static final HDUnit[] hdcUnitArray = new HDUnit[16];
101: public static int hdcHDMax;
102:
103: public static int hdcSelectedID;
104: public static int hdcSelectedLUN;
105: public static HDUnit hdcTargetUnit;
106: public static int hdcBusStatus;
107:
108: public static byte[] hdcReadHandle;
109: public static byte[] hdcWriteHandle;
110: public static int hdcIndex;
111: public static int hdcLimit;
112: public static final byte[] hdcCommandBuffer = new byte[6];
113: public static final byte[] hdcStatusBuffer = new byte[1];
114: public static final byte[] hdcMessageBuffer = new byte[1];
115: public static final byte[] hdcSenseBuffer = new byte[4];
116: public static final byte[] hdcAssignDriveBuffer = new byte[10];
117:
118: public static int hdcLastFormatBlodkEnd;
119:
120: public static JCheckBoxMenuItem hdcSASIMenuItem;
121:
122:
123:
124: public static void hdcInit () {
125:
126:
127:
128:
129: hdcFileFilter = new javax.swing.filechooser.FileFilter () {
130: @Override public boolean accept (File file) {
131: if (file.isDirectory ()) {
132: return true;
133: }
134: if (!file.isFile ()) {
135: return false;
136: }
137: String path = file.getPath ();
138: if (hdcIsInserted (path)) {
139: return false;
140: }
141: long longLength = file.length ();
142: for (HDMedia media : HDMedia.HDM_ARRAY) {
143: if (media.humDiskEndByte == longLength) {
144: return true;
145: }
146: }
147: return false;
148: }
149: @Override public String getDescription () {
150: return (Multilingual.mlnJapanese ?
151: "SASI ハードディスクのイメージファイル (*.HDF)" :
152: "SASI hard disk image files (*.HDF)");
153: }
154: };
155:
156:
157: hdcOpenDialog = null;
158: hdcOpenUnit = 0;
159: hdcOpenHistory = new ArrayList<File[]> ();
160: for (int i = JFileChooser2.MAXIMUM_HISTORY_COUNT - 1; 0 <= i; i--) {
161: hdcAddHistory (JFileChooser2.pathsToFiles (Settings.sgsGetString ("sahistory" + i)));
162: }
163:
164:
165:
166:
167: hdcHDMax = 0;
168: for (int u = 0; u < 16; u++) {
169: HDUnit unit = hdcUnitArray[u] = new HDUnit (u);
170: if (u == 0) {
171: unit.connect (false);
172: }
173: String path = Settings.sgsGetString ("sa" + u);
174: String hdN = Settings.sgsGetString ("hd" + u);
175: if (!(hdN.equals ("") || hdN.equals ("none"))) {
176: String hdNWithoutR = hdN.endsWith (":R") || hdN.endsWith (":r") ? hdN.substring (0, hdN.length () - 2) : hdN;
177: int dotIndex = hdNWithoutR.lastIndexOf ('.');
178: String ext = dotIndex < 0 ? "" : hdNWithoutR.substring (dotIndex + 1);
179: if (ext.equalsIgnoreCase ("HDF") ||
180: HDMedia.hdmPathToMedia (hdNWithoutR, null) != null) {
181: path = hdN;
182: Settings.sgsPutString ("hd" + u, "");
183: }
184: }
185: boolean userWriteProtect = false;
186: if (path.toUpperCase ().endsWith (":R")) {
187: path = path.substring (0, path.length () - 2);
188: userWriteProtect = true;
189: }
190: boolean hostWriteProtect = !new File (path).canWrite ();
191: if (path.length () != 0) {
192: unit.connect (true);
193: if (unit.insert (path,
194: userWriteProtect || hostWriteProtect)) {
195: hdcAddHistory (new File (path).getAbsoluteFile ());
196: }
197: }
198: }
199:
200:
201: hdcFormatDialog = null;
202: hdcFormatFileChooser = null;
203: hdcFormatMedia = HDMedia.HDM_40MB;
204: hdcFormatCopySystemFiles = true;
205:
206: hdcSelectedID = -1;
207: hdcSelectedLUN = -1;
208: hdcTargetUnit = null;
209: hdcBusStatus = HDC_STATUS_FREE;
210:
211: hdcReadHandle = null;
212: hdcWriteHandle = null;
213: hdcIndex = 0;
214: hdcLimit = 0;
215:
216:
217:
218:
219:
220:
221: hdcLastFormatBlodkEnd = -1;
222:
223: }
224:
225:
226:
227: public static void hdcTini () {
228:
229:
230: for (HDUnit unit : hdcUnitArray) {
231: unit.hduTini ();
232: }
233:
234:
235:
236: if (hdcOpenDialog != null) {
237: Settings.sgsPutOnOff ("sareadonly", hdcOpenDialog.getReadOnly ());
238: Settings.sgsPutOnOff ("saappreboot", hdcOpenDialog.getReboot ());
239: ArrayList<String> pathsList = hdcOpenDialog.getHistory ();
240: int n = pathsList.size ();
241: for (int i = 0; i < n; i++) {
242: Settings.sgsPutString ("sahistory" + i, pathsList.get (i));
243: }
244: for (int i = n; i < 16; i++) {
245: Settings.sgsPutString ("sahistory" + i, "");
246: }
247: }
248:
249:
250: for (int u = 0; u < 16; u++) {
251: AbstractUnit unit = hdcUnitArray[u];
252: Settings.sgsPutString (
253: "sa" + u,
254: unit.abuConnected && unit.abuInserted ?
255: unit.abuWriteProtected ? unit.abuPath + ":R" : unit.abuPath :
256: "");
257: }
258:
259: }
260:
261: public static void hdcMakeMenu () {
262:
263:
264: ActionListener listener = new ActionListener () {
265: @Override public void actionPerformed (ActionEvent ae) {
266: Object source = ae.getSource ();
267: String command = ae.getActionCommand ();
268: switch (command) {
269: case "Create new SASI hard disk image files":
270: hdcOpenFormatDialog ();
271: break;
272: }
273: }
274: };
275:
276:
277: hdcMenu = ComponentFactory.createMenu ("SASI");
278: ComponentFactory.addComponents (
279: hdcMenu,
280: ComponentFactory.createHorizontalBox (
281: Multilingual.mlnText (
282: ComponentFactory.createLabel ("SASI hard disk"),
283: "ja", "SASI ハードディスク")),
284: ComponentFactory.createHorizontalSeparator ()
285: );
286: for (int u = 0; u < 16; u++) {
287: hdcMenu.add (hdcUnitArray[u].getMenuBox ());
288: }
289: ComponentFactory.addComponents (
290: hdcMenu,
291: ComponentFactory.createHorizontalSeparator (),
292: hdcSASIMenuItem = ComponentFactory.setEnabled (
293: Multilingual.mlnText (ComponentFactory.createCheckBoxMenuItem (!XEiJ.currentModel.isSCSI (), "Built-in SASI port", listener), "ja", "内蔵 SASI ポート"),
294: false),
295: ComponentFactory.createHorizontalSeparator (),
296: Multilingual.mlnText (ComponentFactory.createMenuItem ("Create new SASI hard disk image files", listener),
297: "ja", "SASI ハードディスクのイメージファイルの新規作成")
298: );
299:
300: }
301:
302:
303:
304: public static boolean hdcIsInserted (String path) {
305: for (HDUnit unit : hdcUnitArray) {
306: if (unit != null &&
307: unit.abuConnected &&
308: unit.abuInserted &&
309: unit.abuPath.equals (path)) {
310: return true;
311: }
312: }
313: return false;
314: }
315:
316: static class OpenDialog extends AbstractOpenDialog {
317: public OpenDialog () {
318: super (XEiJ.frmFrame,
319: "Open SASI hard disk image files",
320: "SASI ハードディスクのイメージファイルを開く",
321: false,
322: hdcFileFilter);
323: }
324: @Override public void openFiles (File[] files, boolean reboot) {
325: hdcOpenFiles (files, reboot);
326: }
327: }
328:
329:
330:
331: public static void hdcOpenFiles (File[] list, boolean reset) {
332: boolean success = true;
333: for (int u = hdcOpenUnit, k = 0; k < list.length; ) {
334: if (16 <= u) {
335: success = false;
336: break;
337: }
338: HDUnit unit = hdcUnitArray[u];
339: if (!unit.abuConnected) {
340: u++;
341: continue;
342: }
343: File file = list[k++];
344: if (!file.isFile ()) {
345: success = false;
346: continue;
347: }
348: if (!unit.insert (file.getPath (),
349: hdcOpenDialog.getReadOnly () || !file.canWrite ())) {
350: success = false;
351: continue;
352: }
353: u++;
354: }
355: if (success) {
356: hdcAddHistory (list);
357: if (reset) {
358: XEiJ.mpuReset (0x8000 | hdcOpenUnit << 8, -1);
359: }
360: }
361: }
362:
363:
364:
365:
366: public static void hdcMakeFormatDialog () {
367:
368:
369: ActionListener listener = new ActionListener () {
370: @Override public void actionPerformed (ActionEvent ae) {
371: switch (ae.getActionCommand ()) {
372: case JFileChooser.APPROVE_SELECTION:
373: case "Start formatting":
374: {
375: File[] list = hdcFormatFileChooser.getSelectedFiles ();
376: if (list.length > 0) {
377: hdcFormatDialog.setVisible (false);
378: if (!hdcFormatFiles (list)) {
379:
380: }
381: }
382: }
383: break;
384: case JFileChooser.CANCEL_SELECTION:
385: case "Cancel":
386: hdcFormatDialog.setVisible (false);
387: break;
388: case "10MB":
389: hdcFormatMedia = HDMedia.HDM_10MB;
390: break;
391: case "20MB":
392: hdcFormatMedia = HDMedia.HDM_20MB;
393: break;
394: case "40MB":
395: hdcFormatMedia = HDMedia.HDM_40MB;
396: break;
397: case "Copy system files":
398: hdcFormatCopySystemFiles = ((JCheckBox) ae.getSource ()).isSelected ();
399: break;
400: }
401: }
402: };
403:
404:
405: hdcMakeFormatFileChooser ();
406: hdcFormatFileChooser.setFileFilter (hdcFileFilter);
407: hdcFormatFileChooser.addActionListener (listener);
408:
409:
410: ButtonGroup mediaGroup = new ButtonGroup ();
411: hdcFormatDialog = Multilingual.mlnTitle (
412: ComponentFactory.createModalDialog (
413: XEiJ.frmFrame,
414: "Create new SASI hard disk image files",
415: ComponentFactory.createBorderPanel (
416: 0, 0,
417: ComponentFactory.createVerticalBox (
418: hdcFormatFileChooser,
419: ComponentFactory.createHorizontalBox (
420: Box.createHorizontalStrut (12),
421: Box.createHorizontalGlue (),
422: ComponentFactory.createRadioButtonMenuItem (mediaGroup, hdcFormatMedia == HDMedia.HDM_10MB, "10MB", listener),
423: ComponentFactory.createRadioButtonMenuItem (mediaGroup, hdcFormatMedia == HDMedia.HDM_20MB, "20MB", listener),
424: ComponentFactory.createRadioButtonMenuItem (mediaGroup, hdcFormatMedia == HDMedia.HDM_40MB, "40MB", listener),
425: Box.createHorizontalGlue (),
426: Box.createHorizontalStrut (12)
427: ),
428: Box.createVerticalStrut (12),
429: ComponentFactory.createHorizontalBox (
430: Box.createHorizontalStrut (12),
431: Box.createHorizontalGlue (),
432: Multilingual.mlnText (ComponentFactory.createCheckBox (hdcFormatCopySystemFiles, "Copy system files", listener), "ja", "システムファイルを転送する"),
433: Box.createHorizontalGlue (),
434: Box.createHorizontalStrut (12),
435: Multilingual.mlnText (ComponentFactory.createButton ("Start formatting", KeyEvent.VK_F, listener), "ja", "フォーマットを開始する"),
436: Box.createHorizontalStrut (12),
437: Multilingual.mlnText (ComponentFactory.createButton ("Cancel", KeyEvent.VK_C, listener), "ja", "キャンセル"),
438: Box.createHorizontalStrut (12)
439: ),
440: Box.createVerticalStrut (12)
441: )
442: )
443: ),
444: "ja", "SASI ハードディスクのイメージファイルの新規作成");
445:
446: }
447:
448:
449:
450: public static void hdcMakeFormatFileChooser () {
451: if (hdcFormatFileChooser == null) {
452: hdcFormatFileChooser = new JFileChooser2 ();
453:
454: hdcFormatFileChooser.setControlButtonsAreShown (false);
455: }
456: }
457:
458:
459:
460: public static void hdcOpenFormatDialog () {
461: if (hdcFormatDialog == null) {
462: hdcMakeFormatDialog ();
463: }
464: hdcFormatDialog.setVisible (true);
465: }
466:
467:
468:
469:
470: public static boolean hdcFormatFiles (File[] list) {
471: boolean success = true;
472: format:
473: {
474:
475: byte[] bb = new byte[(int) hdcFormatMedia.humDiskEndByte];
476: if (!hdcFormatMedia.hdmMakeFormatData (bb, hdcFormatCopySystemFiles)) {
477: success = false;
478: break format;
479: }
480:
481: int u = 0;
482: for (File file : list) {
483: String path = file.getPath ();
484: if (true) {
485: if (!path.toUpperCase ().endsWith (".HDF")) {
486: path += path.endsWith (".") ? "hdf" : ".hdf";
487: file = new File (path);
488: }
489: }
490: if (hdcIsInserted (path)) {
491: success = false;
492: break format;
493: }
494: if (!XEiJ.rscPutFile (path, bb, 0, bb.length)) {
495: success = false;
496: break format;
497: }
498:
499: while (u < 16) {
500: HDUnit unit = hdcUnitArray[u++];
501: if (unit.abuConnected &&
502: !unit.abuInserted &&
503: unit.insert (path,
504: false)) {
505:
506: break;
507: }
508: }
509: }
510: }
511: if (success) {
512: hdcAddHistory (list);
513: }
514: return success;
515: }
516:
517:
518:
519:
520: public static void hdcAddHistory (File file) {
521: hdcAddHistory (new File[] { file });
522: }
523:
524:
525:
526: public static void hdcAddHistory (File[] files) {
527: if (hdcOpenDialog == null) {
528: hdcOpenHistory.add (files);
529: } else {
530: hdcOpenDialog.addHistory (files);
531: }
532: hdcMakeFormatFileChooser ();
533: hdcFormatFileChooser.addHistory (files);
534: hdcFormatFileChooser.selectLastFiles ();
535: }
536:
537:
538:
539:
540:
541:
542:
543:
544:
545:
546:
547:
548:
549:
550:
551:
552:
553:
554:
555:
556:
557:
558:
559:
560:
561:
562:
563:
564:
565:
566:
567:
568:
569:
570:
571:
572:
573:
574:
575:
576:
577:
578:
579:
580:
581:
582:
583:
584:
585:
586:
587:
588:
589:
590:
591:
592: public static int hdcPeekStatus () {
593: return hdcBusStatus;
594: }
595:
596:
597:
598: public static int hdcReadStatus () {
599: int d = hdcBusStatus;
600: if (HDC_DEBUG_TRACE) {
601: System.out.printf ("%08x hdcReadStatus(%d,%d)=%02x\n", XEiJ.regPC0, hdcSelectedID, hdcSelectedLUN, d);
602: }
603: return d;
604: }
605:
606:
607:
608: public static void hdcWriteSelect (int d) {
609: d &= 255;
610: if (HDC_DEBUG_TRACE) {
611: System.out.printf ("%08x hdcWriteSelect(%02x)\n", XEiJ.regPC0, d);
612: }
613: if (d == 0) {
614: return;
615: }
616:
617: hdcSelectedID = Integer.numberOfTrailingZeros (d);
618: hdcSelectedLUN = -1;
619: hdcBusStatus = HDC_STATUS_BUSY;
620: }
621:
622:
623:
624: public static void hdcWriteCommand (int d) {
625: d &= 255;
626: if (HDC_DEBUG_TRACE) {
627: System.out.printf ("%08x hdcWriteCommand(%d,%d,%02x)\n", XEiJ.regPC0, hdcSelectedID, hdcSelectedLUN, d);
628: }
629:
630: hdcWriteHandle = hdcCommandBuffer;
631: hdcIndex = 0;
632: hdcLimit = 6;
633: hdcBusStatus = HDC_STATUS_COMMAND | HDC_STATUS_OUTPUT | HDC_STATUS_BUSY | HDC_STATUS_REQUEST;
634: HD63450.dmaFallPCL (1);
635: }
636:
637:
638:
639: public static void hdcWriteReset (int d) {
640: d &= 255;
641: if (HDC_DEBUG_TRACE) {
642: System.out.printf ("%08x hdcWriteReset(%d,%d,%02x)\n", XEiJ.regPC0, hdcSelectedID, hdcSelectedLUN, d);
643: }
644:
645: hdcBusFreePhase ();
646: }
647:
648:
649:
650: public static int hdcPeekData () {
651: return (hdcReadHandle == null ? 0 :
652: hdcReadHandle[hdcIndex] & 255);
653: }
654:
655:
656:
657: public static int hdcReadData () {
658: if (hdcReadHandle == null) {
659: if (HDC_DEBUG_TRACE) {
660: System.out.printf ("%08x hdcReadData(%d,%d)=%02x\n", XEiJ.regPC0, hdcSelectedID, hdcSelectedLUN, 0);
661: }
662: return 0;
663: }
664: int d = hdcReadHandle[hdcIndex++] & 255;
665: if (HDC_DEBUG_TRACE) {
666: System.out.printf ("%08x hdcReadData(%d,%d)=%02x\n", XEiJ.regPC0, hdcSelectedID, hdcSelectedLUN, d);
667: }
668: if (hdcIndex < hdcLimit) {
669: HD63450.dmaFallPCL (1);
670: } else if (hdcBusStatus == (HDC_STATUS_INPUT | HDC_STATUS_BUSY | HDC_STATUS_REQUEST)) {
671:
672: hdcStatusPhase (0, 0);
673: } else if (hdcBusStatus == (HDC_STATUS_COMMAND | HDC_STATUS_INPUT | HDC_STATUS_BUSY | HDC_STATUS_REQUEST)) {
674:
675: hdcReadHandle = hdcMessageBuffer;
676: hdcWriteHandle = null;
677: hdcIndex = 0;
678: hdcLimit = 1;
679: hdcBusStatus = HDC_STATUS_MESSAGE | HDC_STATUS_COMMAND | HDC_STATUS_INPUT | HDC_STATUS_BUSY | HDC_STATUS_REQUEST;
680: HD63450.dmaFallPCL (1);
681: } else {
682:
683: hdcBusFreePhase ();
684: IOInterrupt.ioiHdcFall ();
685: IOInterrupt.ioiHdcRise ();
686: }
687: return d;
688: }
689:
690:
691:
692: public static void hdcWriteData (int d) {
693: d &= 255;
694: if (HDC_DEBUG_TRACE) {
695: System.out.printf ("%08x hdcWriteData(%d,%d,%02x)\n", XEiJ.regPC0, hdcSelectedID, hdcSelectedLUN, d);
696: }
697: if (hdcWriteHandle == null) {
698: return;
699: }
700: hdcWriteHandle[hdcIndex++] = (byte) d;
701: if (hdcIndex < hdcLimit) {
702: HD63450.dmaFallPCL (1);
703: } else if (hdcBusStatus == (HDC_STATUS_OUTPUT | HDC_STATUS_BUSY | HDC_STATUS_REQUEST)) {
704: if (hdcWriteHandle == hdcAssignDriveBuffer) {
705: if (HDC_DEBUG_COMMAND) {
706: System.out.printf ("%08x SASI AssignDrive[", XEiJ.regPC0);
707: for (int i = 0; i < 10; i++) {
708: if (i > 0) {
709: System.out.print (',');
710: }
711: System.out.printf ("0x%02x", hdcAssignDriveBuffer[i] & 255);
712: }
713: System.out.println (']');
714: }
715:
716: }
717:
718: hdcStatusPhase (0, 0);
719: } else {
720: int cmd = hdcCommandBuffer[0] & 255;
721: if (HDC_DEBUG_COMMAND) {
722: String name = cmd < HDC_COMMAND_NAME.length ? HDC_COMMAND_NAME[cmd] : "";
723: if (name.length () == 0) {
724: name = "???";
725: }
726: System.out.printf ("%08x SASI %s(", XEiJ.regPC0, name);
727: for (int i = 0; i < hdcLimit; i++) {
728: if (i > 0) {
729: System.out.print (',');
730: }
731: System.out.printf ("0x%02x", hdcCommandBuffer[i] & 255);
732: }
733: System.out.println (')');
734: }
735: hdcSelectedLUN = hdcCommandBuffer[1] >> 5 & 7;
736: if (hdcSelectedLUN > 1) {
737:
738: hdcSenseBuffer[0] = 0x20;
739: hdcStatusPhase (2, 0);
740: return;
741: }
742: hdcTargetUnit = hdcUnitArray[hdcSelectedID << 1 | hdcSelectedLUN];
743: if (!hdcTargetUnit.abuInserted) {
744:
745: hdcSenseBuffer[0] = 0x20;
746: hdcStatusPhase (2, 0);
747: return;
748: }
749: if (hdcLastFormatBlodkEnd >= 0 && cmd != 0x06) {
750: HDMedia media = HDMedia.hdmLengthToMedia (hdcLastFormatBlodkEnd);
751: if (media != null) {
752: hdcTargetUnit.hduMedia = media;
753:
754: }
755: hdcLastFormatBlodkEnd = -1;
756: }
757: switch (cmd) {
758: case 0x00:
759: hdcDoTestDriveReady ();
760: break;
761: case 0x01:
762: hdcDoRecalibrate ();
763: break;
764: case 0x03:
765: hdcDoRequestSenseStatus ();
766: break;
767: case 0x04:
768: hdcDoFormatDrive ();
769: break;
770:
771: case 0x06:
772: hdcDoFormatBlock ();
773: break;
774:
775: case 0x08:
776: hdcDoRead ();
777: break;
778: case 0x0a:
779: hdcDoWrite ();
780: break;
781: case 0x0b:
782: hdcDoSeek ();
783: break;
784:
785:
786:
787:
788:
789: case 0xc2:
790: hdcDoAssignDrive ();
791: break;
792: default:
793: if (HDC_DEBUG_UNIMPLEMENTED_COMMAND) {
794: StringBuilder sb = new StringBuilder ();
795: String name = cmd < HDC_COMMAND_NAME.length ? HDC_COMMAND_NAME[cmd] : "";
796: if (name.length () == 0) {
797: name = "???";
798: }
799: sb.append (String.format ("%08x SASI %s(", XEiJ.regPC0, name));
800: for (int i = 0; i < hdcLimit; i++) {
801: if (i > 0) {
802: sb.append (',');
803: }
804: sb.append (String.format ("0x%02x", hdcCommandBuffer[i] & 255));
805: }
806: sb.append (')');
807: System.out.println (sb.toString ());
808: }
809:
810: hdcSenseBuffer[0] = 0x20;
811: hdcStatusPhase (2, 0);
812: }
813: }
814: }
815:
816:
817: public static void hdcDoTestDriveReady () {
818: if (HDC_DEBUG_TRACE) {
819: System.out.printf ("%08x hdcDoTestDriveReady(%d,%d)\n", XEiJ.regPC0, hdcSelectedID, hdcSelectedLUN);
820: }
821:
822: hdcStatusPhase (0, 0);
823: }
824:
825:
826: public static void hdcDoRecalibrate () {
827: if (HDC_DEBUG_TRACE) {
828: System.out.printf ("%08x hdcDoRecalibrate(%d,%d)\n", XEiJ.regPC0, hdcSelectedID, hdcSelectedLUN);
829: }
830:
831: hdcStatusPhase (0, 0);
832: }
833:
834:
835: public static void hdcDoRequestSenseStatus () {
836: if (HDC_DEBUG_TRACE) {
837: System.out.printf ("%08x hdcDoRequestSenseStatus(%d,%d)\n", XEiJ.regPC0, hdcSelectedID, hdcSelectedLUN);
838: }
839:
840: hdcReadHandle = hdcSenseBuffer;
841: hdcIndex = 0;
842: hdcLimit = 4;
843: hdcBusStatus = HDC_STATUS_INPUT | HDC_STATUS_BUSY | HDC_STATUS_REQUEST;
844: HD63450.dmaFallPCL (1);
845: }
846:
847:
848: public static void hdcDoFormatDrive () {
849: if (HDC_DEBUG_TRACE) {
850: System.out.printf ("%08x hdcDoFormatDrive(%d,%d)\n", XEiJ.regPC0, hdcSelectedID, hdcSelectedLUN);
851: }
852: if (!hdcTargetUnit.abuInserted || hdcTargetUnit.hduMedia == null ||
853: hdcTargetUnit.abuWriteProtected) {
854:
855: hdcSenseBuffer[0] = 0x20;
856: hdcStatusPhase (2, 0);
857: return;
858: }
859: hdcTargetUnit.hduWritten = true;
860:
861: Arrays.fill (hdcTargetUnit.hduImage, 0, (int) hdcTargetUnit.hduMedia.humDiskEndByte, (byte) 0);
862:
863: hdcStatusPhase (0, 0);
864: }
865:
866:
867:
868: public static void hdcDoFormatBlock () {
869: int i = (hdcCommandBuffer[1] & 31) << 16 | (char) (hdcCommandBuffer[2] << 8 | hdcCommandBuffer[3] & 255);
870: int n = 33;
871: if (HDC_DEBUG_TRACE) {
872: System.out.printf ("%08x hdcDoFormatBlock(%d,%d,%d,%d)\n", XEiJ.regPC0, hdcSelectedID, hdcSelectedLUN, i, n);
873: }
874: if (!hdcTargetUnit.abuInserted || hdcTargetUnit.hduMedia == null ||
875: hdcTargetUnit.abuWriteProtected) {
876:
877: hdcSenseBuffer[0] = 0x20;
878: hdcStatusPhase (2, 0);
879: return;
880: }
881: int l = i + n;
882: if (hdcTargetUnit.hduMedia.hdmDiskEndRecord < l) {
883:
884: hdcSenseBuffer[0] = 0x21;
885: hdcStatusPhase (2, 0);
886: return;
887: }
888: int begin = hdcTargetUnit.hduMedia.hdmBytesPerRecord * i;
889: int end = hdcTargetUnit.hduMedia.hdmBytesPerRecord * l;
890: hdcLastFormatBlodkEnd = end;
891: hdcTargetUnit.hduWritten = true;
892:
893: Arrays.fill (hdcTargetUnit.hduImage, begin, end, (byte) 0);
894:
895: hdcStatusPhase (0, 0);
896: }
897:
898:
899: public static void hdcDoRead () {
900: int i = (hdcCommandBuffer[1] & 31) << 16 | (char) (hdcCommandBuffer[2] << 8 | hdcCommandBuffer[3] & 255);
901: int n = hdcCommandBuffer[4] & 255;
902: if (n == 0) {
903: n = 256;
904: }
905: if (HDC_DEBUG_TRACE) {
906: System.out.printf ("%08x hdcDoRead(%d,%d,%d,%d)\n", XEiJ.regPC0, hdcSelectedID, hdcSelectedLUN, i, n);
907: }
908: if (!hdcTargetUnit.abuInserted || hdcTargetUnit.hduMedia == null) {
909:
910: hdcSenseBuffer[0] = 0x20;
911: hdcStatusPhase (2, 0);
912: return;
913: }
914: int l = i + n;
915: if (hdcTargetUnit.hduMedia.hdmDiskEndRecord < l) {
916:
917: hdcSenseBuffer[0] = 0x21;
918: hdcStatusPhase (2, 0);
919: return;
920: }
921:
922: hdcReadHandle = hdcTargetUnit.hduImage;
923: hdcIndex = hdcTargetUnit.hduMedia.hdmBytesPerRecord * i;
924: hdcLimit = hdcTargetUnit.hduMedia.hdmBytesPerRecord * l;
925: hdcBusStatus = HDC_STATUS_INPUT | HDC_STATUS_BUSY | HDC_STATUS_REQUEST;
926: HD63450.dmaFallPCL (1);
927: }
928:
929:
930: public static void hdcDoWrite () {
931: int i = (hdcCommandBuffer[1] & 31) << 16 | (char) (hdcCommandBuffer[2] << 8 | hdcCommandBuffer[3] & 255);
932: int n = hdcCommandBuffer[4] & 255;
933: if (n == 0) {
934: n = 256;
935: }
936: if (HDC_DEBUG_TRACE) {
937: System.out.printf ("%08x hdcDoWrite(%d,%d,%d,%d)\n", XEiJ.regPC0, hdcSelectedID, hdcSelectedLUN, i, n);
938: }
939: if (!hdcTargetUnit.abuInserted || hdcTargetUnit.hduMedia == null ||
940: hdcTargetUnit.abuWriteProtected) {
941:
942: hdcSenseBuffer[0] = 0x20;
943: hdcStatusPhase (2, 0);
944: return;
945: }
946: int l = i + n;
947: if (hdcTargetUnit.hduMedia.hdmDiskEndRecord < l) {
948:
949: hdcSenseBuffer[0] = 0x21;
950: hdcStatusPhase (2, 0);
951: return;
952: }
953: hdcTargetUnit.hduWritten = true;
954:
955: hdcWriteHandle = hdcTargetUnit.hduImage;
956: hdcIndex = hdcTargetUnit.hduMedia.hdmBytesPerRecord * i;
957: hdcLimit = hdcTargetUnit.hduMedia.hdmBytesPerRecord * l;
958: hdcBusStatus = HDC_STATUS_OUTPUT | HDC_STATUS_BUSY | HDC_STATUS_REQUEST;
959: HD63450.dmaFallPCL (1);
960: }
961:
962:
963: public static void hdcDoSeek () {
964: int i = (hdcCommandBuffer[1] & 31) << 16 | (char) (hdcCommandBuffer[2] << 8 | hdcCommandBuffer[3] & 255);
965: if (HDC_DEBUG_TRACE) {
966: System.out.printf ("%08x hdcDoSeek(%d,%d,%d)\n", XEiJ.regPC0, hdcSelectedID, hdcSelectedLUN, i);
967: }
968: if (!hdcTargetUnit.abuInserted || hdcTargetUnit.hduMedia == null) {
969:
970: hdcSenseBuffer[0] = 0x20;
971: hdcStatusPhase (2, 0);
972: return;
973: }
974: if (hdcTargetUnit.hduMedia.hdmDiskEndRecord <= i) {
975:
976: hdcSenseBuffer[0] = 0x21;
977: hdcStatusPhase (2, 0);
978: return;
979: }
980:
981: hdcStatusPhase (0, 0);
982: }
983:
984:
985: public static void hdcDoAssignDrive () {
986: if (HDC_DEBUG_TRACE) {
987: System.out.printf ("%08x hdcDoAssignDrive(%d,%d)\n", XEiJ.regPC0, hdcSelectedID, hdcSelectedLUN);
988: }
989:
990: hdcWriteHandle = hdcAssignDriveBuffer;
991: hdcIndex = 0;
992: hdcLimit = 10;
993: hdcBusStatus = HDC_STATUS_OUTPUT | HDC_STATUS_BUSY | HDC_STATUS_REQUEST;
994: HD63450.dmaFallPCL (1);
995: }
996:
997:
998:
999:
1000:
1001: public static void hdcStatusPhase (int status, int message) {
1002: hdcStatusBuffer[0] = (byte) status;
1003: hdcMessageBuffer[0] = (byte) message;
1004: hdcReadHandle = hdcStatusBuffer;
1005: hdcWriteHandle = null;
1006: hdcIndex = 0;
1007: hdcLimit = 1;
1008: hdcBusStatus = HDC_STATUS_COMMAND | HDC_STATUS_INPUT | HDC_STATUS_BUSY | HDC_STATUS_REQUEST;
1009: HD63450.dmaFallPCL (1);
1010: }
1011:
1012:
1013:
1014: public static void hdcBusFreePhase () {
1015: hdcSelectedID = -1;
1016: hdcSelectedLUN = -1;
1017: hdcTargetUnit = null;
1018: hdcBusStatus = HDC_STATUS_FREE;
1019: hdcReadHandle = null;
1020: hdcWriteHandle = null;
1021: hdcIndex = 0;
1022: hdcLimit = 0;
1023: HD63450.dmaRisePCL (1);
1024: }
1025:
1026:
1027:
1028:
1029:
1030:
1031:
1032:
1033:
1034:
1035:
1036:
1037:
1038:
1039:
1040:
1041:
1042:
1043:
1044:
1045:
1046:
1047:
1048:
1049:
1050:
1051:
1052:
1053:
1054:
1055:
1056:
1057:
1058:
1059:
1060:
1061:
1062:
1063:
1064:
1065:
1066:
1067:
1068:
1069:
1070:
1071:
1072:
1073:
1074:
1075:
1076:
1077:
1078:
1079:
1080:
1081:
1082:
1083:
1084:
1085:
1086:
1087:
1088:
1089:
1090:
1091:
1092:
1093:
1094:
1095:
1096:
1097:
1098:
1099:
1100:
1101:
1102:
1103:
1104: public static final byte[] HDC_DISK_IPL = "`\0\0\312\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\32\33[6;32HX68000 HARD DISK IPL MENU\33[25;22H\203J\201[\203\\\203\213\203L\201[\202\305\221I\221\360\202\265\202\304\203\212\203^\201[\203\223\203L\201[\202\360\211\237\202\265\202\304\202\255\202\276\202\263\202\242\0\33[26;28H\221I\221\360\202\265\202\275\202\340\202\314\202\360\216\251\223\256\213N\223\256\202\306\202\265\202\304\223o\230^\202\265\202\334\202\267\0\0O\372\3772B\205 <\0\0\0\216NO\36\0\341Gt\4&<\0\0\1\0C\372\2\306a\0\0022J\0f\0\1jC\372\2\270G\372\377\n\f\221X68Kf\0\1lt\16BCBDB\206C\351\0\20J\21g\26RF&\311\20)\0\b\b\0\0\0f\bRCJ\0f\2RDQ\312\377\340JCg\0\1Br\np\4NO\b\0\0\4f\22JDg\16SDg\34C\372\376\364a\0\1\304`(C\372\376\352a\0\1\272C\372\377>a\0\1\262`\24G\372\376\234 [$(\0\bJ(\0\bf\364`\0\0\276z\2BCE\372\376\204\"R\20)\0\bg\n\260\5g\6r\2a\0\1va\0\1\26X\212RC\266Fe\342`*a\0\1\6a\0\0\362\260<\0\35g:\260<\0005g\f\260<\0<g\32\260<\0>f\344a\0\0\350RC\266Fe\2BCa\0\0\262f\362`\314a\0\0\324SCj\0046\6SCa\0\0\236f\362`\270G\372\376\30\345C s0\0$(\0\bJ\5g:C\372\1\270r\16C\351\0\20J)\377\370g\22 \21\b\0\0\30f\nB\21\264\200g\4\22\274\0\2Q\311\377\342/\2t\4&<\0\0\1\0C\372\1\200a\0\0\350$\37\304\274\0\377\377\377&<\0\0\4\0C\372\375\274\323\374\0\0\4\0a\0\0\320J\0f\b\f\21\0`f\"N\321E\372\0\332C\372\0\314a\0\0\256\"Ja\0\0\250`\376E\372\0\343`\352E\372\0\372`\344E\372\1\21`\336A\372\375\200 \3\345@ p\0\0\20(\0\b\260\5g\2J\0NuB\200NO\340H\260<\0Nf\2p\35NuaZC\372\375V0\3\345@C\361\0\0r$t\t\324Cp#NO\"Qr(aF$\tA\372\0\342\224\210\350\212\204\374\0\n\324\274\0000\0000r \264|\0000g\0022\2a&HB2\2a r)a\34r a\30t\7BA\22\31a\20Q\312\377\370r\3`\2r\13p\"NONup NONup!NONupE`\2pFH\347x@2\7NOL\337\2\36Nu\32\33[16;33H\0 \203n\201[\203h\203f\203B\203X\203N\202\252\223\307\202\337\202\334\202\271\202\361\0 \212\307\227\235\203u\203\215\203b\203N\202\252\211\363\202\352\202\304\202\242\202\334\202\267\0 \213N\223\256\211\302\224\\\202\310\227\314\210\346\202\252\202\240\202\350\202\334\202\271\202\361\0\202h\202o\202k\203u\203\215\203b\203N\202\314\223\340\227e\202\252\210\331\217\355\202\305\202\267\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0".getBytes (XEiJ.ISO_8859_1);
1105:
1106:
1107:
1108:
1109:
1110:
1111:
1112:
1113:
1114:
1115:
1116:
1117:
1118:
1119:
1120:
1121:
1122:
1123:
1124:
1125:
1126:
1127:
1128:
1129:
1130:
1131:
1132:
1133:
1134:
1135:
1136:
1137:
1138:
1139:
1140:
1141:
1142:
1143:
1144:
1145:
1146:
1147:
1148:
1149:
1150:
1151:
1152:
1153:
1154:
1155:
1156:
1157:
1158:
1159:
1160:
1161:
1162:
1163:
1164:
1165:
1166:
1167:
1168:
1169:
1170:
1171:
1172:
1173:
1174:
1175:
1176:
1177:
1178: public static final byte[] HDC_PARTITION_IPL = "` Hudson soft 2.00\4\0\1\2\0\1\2\0\'r\370\24\0\0\0\0O\372\377\334C\372\0014a\0\1* <\0\0\0\216NO\22\0\341AB\202\24:\377\337B\200\20:\377\321\304\300B\2000:\377\312\324\200\345\202\324\272\377\312&<\0\0\4\0C\372\1\232a\0\0\310J\0f\0\0\320C\372\1\214<<\0\37$IG\372\1u~\n\20\32\200<\0 \260\33f\6Q\317\377\364`\24\323\374\0\0\0 Q\316\377\340C\372\0\310a\0\0\274`\376B\2000)\0\32\341XU@B\207\36:\377h\300\307\345\200\324\200B\2000:\377`\353\200\320\274\0\0\3\377\340\210\344\210\345\200\324\200H\347`\0C\372\1(&<\0\0\1\0aPL\337\0\6J\0fVC\372\1\24\fYHUfVT\211\f\231\0\0h\0fV/\31&\31\326\231/\3/\31\"|\0\0g\300\326\274\0\0\0@a\34\"\37$\37\"_J\0f A\371\0\0h\0\321\302S\201e\4B\30`\370N\321H\347x@pFNOL\337\2\36NuC\372\0Ha\30`\0\377\\C\372\0]a\16`\0\377RC\372\0ua\4`\0\377Hp!NONu\32\0\33[16;35HHuman.sys \202\252 \214\251\202\302\202\251\202\350\202\334\202\271\202\361\0\33[16;38H\203f\203B\203X\203N\202\252\201@\223\307\202\337\202\334\202\271\202\361\0\33[16;36HHuman.sys \202\252 \211\363\202\352\202\304\202\242\202\334\202\267\0\33[16;33HHuman.sys \202\314 \203A\203h\203\214\203X\202\252\210\331\217\355\202\305\202\267\0human sys\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0".getBytes (XEiJ.ISO_8859_1);
1179:
1180:
1181:
1182:
1183:
1184:
1185: public static class HDUnit extends AbstractUnit {
1186:
1187: public HDMedia hduMedia;
1188: public byte[] hduImage;
1189: public boolean hduWritten;
1190:
1191:
1192:
1193: public HDUnit (int number) {
1194: super (number);
1195: hduImage = null;
1196: hduWritten = false;
1197: }
1198:
1199:
1200:
1201:
1202: public void hduTini () {
1203: if (abuInserted) {
1204: hduFlush ();
1205: }
1206: }
1207:
1208:
1209:
1210: public boolean hduFlush () {
1211: if (!hduWritten) {
1212: return true;
1213: }
1214: if (abuWriteProtected) {
1215: return false;
1216: }
1217: if (!XEiJ.rscPutFile (abuPath, hduImage, 0, (int) hduMedia.humDiskEndByte)) {
1218: return false;
1219: }
1220: hduWritten = false;
1221: return true;
1222: }
1223:
1224:
1225:
1226: @Override protected void connect (boolean disconnectable) {
1227: super.connect (disconnectable);
1228: hduImage = new byte[HDMedia.HDM_MAX_BYTES_PER_DISK];
1229: hduWritten = false;
1230: }
1231:
1232:
1233:
1234: @Override protected void disconnect () {
1235: super.disconnect ();
1236: hduImage = null;
1237: }
1238:
1239:
1240:
1241: @Override protected boolean eject () {
1242: if (!hduFlush ()) {
1243: return false;
1244: }
1245: String path = abuPath;
1246: if (!super.eject ()) {
1247: return false;
1248: }
1249: if (hduMedia != null) {
1250: hdcAddHistory (new File (path).getAbsoluteFile ());
1251: System.out.println (Multilingual.mlnJapanese ?
1252: path + " を sa" + abuNumber + " から切り離しました" :
1253: path + " was removed from sa" + abuNumber);
1254: }
1255: hduMedia = null;
1256:
1257: if (hdcHDMax == abuNumber - 1) {
1258: int u = abuNumber - 1;
1259: while (u >= 0 && !hdcUnitArray[u].abuInserted) {
1260: u--;
1261: }
1262: hdcHDMax = u + 1;
1263: }
1264: return true;
1265: }
1266:
1267:
1268:
1269: @Override protected boolean open () {
1270: if (!super.open ()) {
1271: return false;
1272: }
1273: hdcOpenUnit = abuNumber;
1274: if (hdcOpenDialog == null) {
1275: hdcOpenDialog = new OpenDialog ();
1276: hdcOpenDialog.setReadOnly (Settings.sgsGetOnOff ("sareadonly"));
1277: hdcOpenDialog.setReboot (Settings.sgsGetOnOff ("saappreboot"));
1278: for (File[] files : hdcOpenHistory) {
1279: hdcOpenDialog.addHistory (files);
1280: }
1281: hdcOpenHistory.clear ();
1282: }
1283: hdcOpenDialog.rescanCurrentDirectory ();
1284: hdcOpenDialog.setVisible (true);
1285: return true;
1286: }
1287:
1288:
1289:
1290: @Override protected boolean insert (String path, boolean writeProtected) {
1291: if (hdcIsInserted (path)) {
1292: return false;
1293: }
1294: if (!super.insert (path, writeProtected)) {
1295: return false;
1296: }
1297:
1298: if (hdcHDMax <= abuNumber) {
1299: hdcHDMax = abuNumber + 1;
1300: }
1301: return true;
1302: }
1303:
1304:
1305:
1306: @Override protected boolean load (String path) {
1307: hduMedia = HDMedia.hdmPathToMedia (path, hduImage);
1308: if (hduMedia == null) {
1309: return false;
1310: }
1311: hduWritten = false;
1312: hdcAddHistory (new File (path).getAbsoluteFile ());
1313: System.out.println (Multilingual.mlnJapanese ?
1314: path + " を sa" + abuNumber + " に接続しました" :
1315: path + " was connected to sa" + abuNumber);
1316: return true;
1317: }
1318:
1319: }
1320:
1321:
1322:
1323: }
1324:
1325:
1326: