DisassembleList.java
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13: package xeij;
14:
15: import java.awt.*;
16: import java.awt.event.*;
17: import java.lang.*;
18: import java.util.*;
19: import javax.swing.*;
20: import javax.swing.event.*;
21:
22: public class DisassembleList {
23:
24: public static final int DDP_ITEM_SIZE = 0x00000002;
25: public static final int DDP_PAGE_SIZE = 0x00000400;
26: public static final int DDP_ITEM_MASK = -DDP_ITEM_SIZE;
27: public static final int DDP_PAGE_MASK = -DDP_PAGE_SIZE;
28: public static final int DDP_MAX_ITEMS = DDP_PAGE_SIZE / DDP_ITEM_SIZE + 2;
29:
30: public static final char[] DDP_MOVEQD0_BASE = (
31:
32:
33: "moveq.l #$xx,d0").toCharArray ();
34: public static final char[] DDP_DCW_BASE = (
35:
36:
37: ".dc.w $xxxx").toCharArray ();
38:
39: public static int ddpItemCount;
40: public static int ddpItemIndex;
41: public static int ddpItemAddress;
42: public static int ddpPageAddress;
43: public static final int[] ddpAddressArray = new int[DDP_MAX_ITEMS];
44: public static final int[] ddpSplitArray = new int[DDP_MAX_ITEMS];
45: public static final int[] ddpCaretArray = new int[DDP_MAX_ITEMS];
46: public static final boolean[] ddpDCWArray = new boolean[DDP_MAX_ITEMS];
47:
48: public static JFrame ddpFrame;
49: public static ScrollTextArea ddpBoard;
50: public static JTextArea ddpTextArea;
51:
52: public static Hex8Spinner ddpSpinner;
53:
54: public static int ddpPopupAddress;
55:
56: public static boolean ddpBacktraceOn;
57: public static long ddpBacktraceRecord;
58: public static SpinnerNumberModel ddpBacktraceModel;
59: public static JSpinner ddpBacktraceSpinner;
60: public static JCheckBox ddpBacktraceCheckBox;
61:
62: public static String ddpStoppedBy;
63: public static int ddpStoppedAddress;
64:
65: public static int ddpSupervisorMode;
66: public static JCheckBox ddpSupervisorCheckBox;
67:
68: public static int ddpProgramMode;
69: public static RotaryButton ddpProgramButton;
70: public static JComboBox<String> ddpProgramBox;
71: public static int ddpProgramAge;
72:
73:
74:
75:
76: public static void ddpInit () {
77:
78: ddpItemCount = 0;
79: ddpItemIndex = 0;
80: ddpItemAddress = -1;
81: ddpPageAddress = 0;
82: ddpSupervisorMode = 1;
83:
84:
85:
86:
87:
88: ddpFrame = null;
89:
90: }
91:
92:
93: public static void ddpStart () {
94: if (RestorableFrame.rfmGetOpened (Settings.SGS_DDP_FRAME_KEY)) {
95: ddpOpen (-1, -1, true);
96: }
97: }
98:
99:
100:
101:
102: public static void ddpOpen (int address, int supervisor, boolean forceUpdate) {
103: if (ddpFrame == null) {
104: ddpMake ();
105: }
106: ddpFrame.setVisible (true);
107: ddpBacktraceRecord = -1L;
108: LabeledAddress.lblClear ();
109: ddpUpdate (address, supervisor, forceUpdate);
110: XEiJ.pnlExitFullScreen (false);
111: XEiJ.dbgVisibleMask |= XEiJ.DBG_DDP_VISIBLE_MASK;
112: }
113:
114:
115:
116: public static void ddpMake () {
117:
118:
119: ddpBoard = ComponentFactory.setPreferredSize (
120: ComponentFactory.setFont (new ScrollTextArea (), LnF.lnfMonospacedFont),
121: 730, 400);
122: ddpBoard.setMargin (new Insets (2, 4, 2, 4));
123: ddpBoard.setHighlightCursorOn (true);
124: ddpTextArea = ddpBoard.getTextArea ();
125: ddpTextArea.setEditable (false);
126: ddpTextArea.addMouseWheelListener ((mwe) -> {
127: int n = mwe.getWheelRotation ();
128: JViewport v = ddpBoard.getViewport ();
129: Point p = v.getViewPosition ();
130: v.setViewPosition (new Point (p.x,
131: Math.max (0,
132: Math.min (ddpTextArea.getSize ().height - v.getExtentSize ().height,
133: p.y + n * ddpTextArea.getFont ().getSize () * 5))));
134: });
135:
136:
137: ddpSpinner = ComponentFactory.createHex8Spinner (ddpPageAddress, DDP_ITEM_MASK, true, new ChangeListener () {
138:
139:
140:
141:
142: @Override public void stateChanged (ChangeEvent ce) {
143: if (XEiJ.dbgEventMask == 0) {
144: ddpUpdate (ddpSpinner.getAbsoluteValue (), ddpSupervisorMode, false);
145: }
146: }
147: });
148:
149:
150:
151:
152:
153:
154: ComponentFactory.addListener (
155: ddpTextArea,
156: new CaretListener () {
157: @Override public void caretUpdate (CaretEvent ce) {
158: if (XEiJ.dbgEventMask == 0) {
159: int p = ce.getDot ();
160: if (p == ce.getMark ()) {
161: int i = Arrays.binarySearch (ddpSplitArray, 1, ddpItemCount, p + 1);
162: i = (i >> 31 ^ i) - 1;
163: ddpSpinner.setHintIndex (i);
164:
165: }
166: }
167: }
168: });
169:
170:
171: ComponentFactory.addListener (
172: ddpTextArea,
173: new MouseAdapter () {
174: @Override public void mousePressed (MouseEvent me) {
175: if (XEiJ.mpuTask == null && me.isPopupTrigger ()) {
176: XEiJ.dbgShowPopup (me, ddpTextArea, true);
177: }
178: }
179: @Override public void mouseReleased (MouseEvent me) {
180: if (XEiJ.mpuTask == null && me.isPopupTrigger ()) {
181: XEiJ.dbgShowPopup (me, ddpTextArea, true);
182: }
183: }
184: });
185:
186:
187: ActionListener listener = new ActionListener () {
188: @Override public void actionPerformed (ActionEvent ae) {
189: Object source = ae.getSource ();
190: switch (ae.getActionCommand ()) {
191: case "Backtrace":
192: if (BranchLog.BLG_ON) {
193: ddpBacktraceOn = ((JCheckBox) ae.getSource ()).isSelected ();
194: if (XEiJ.dbgEventMask == 0) {
195: ddpUpdate (ddpAddressArray[ddpItemIndex], ddpSupervisorMode, true);
196: }
197: }
198: break;
199: case "User/Supervisor":
200: if (XEiJ.dbgEventMask == 0) {
201: ddpUpdate (ddpAddressArray[ddpItemIndex], ((JCheckBox) ae.getSource ()).isSelected () ? 1 : 0, true);
202: }
203: break;
204: case "Address and/or offset":
205: ddpProgramMode = ddpProgramButton.getIndex ();
206: if (XEiJ.dbgEventMask == 0) {
207: ddpUpdate (0, ddpSupervisorMode, true);
208: }
209: break;
210: case "Program name":
211: {
212: int index = ddpProgramBox.getSelectedIndex ();
213: if (0 <= index) {
214: if (index == 0) {
215: ddpSpinner.setOffset (0);
216: } else {
217: if (ddpProgramAge == LabeledAddress.lblProgramAge) {
218: ddpSpinner.setOffset (LabeledAddress.lblProgramHead[index - 1]);
219: }
220: }
221: }
222: }
223: break;
224: }
225: }
226: };
227:
228:
229: ddpProgramMode = 0;
230: ddpProgramButton = Multilingual.mlnToolTipText (
231: ComponentFactory.createRotaryButton (
232: "Address and/or offset",
233: listener,
234: ddpProgramMode,
235: XEiJ.createImage (
236: 20, 14,
237: "22222222222222222222" +
238: "2..................2" +
239: "2........22........2" +
240: "2......222222......2" +
241: "2.....22222222.....2" +
242: "2.....22.22........2" +
243: "2.....2222222......2" +
244: "2......2222222.....2" +
245: "2........22.22.....2" +
246: "2.....22222222.....2" +
247: "2......222222......2" +
248: "2........22........2" +
249: "2..................2" +
250: "22222222222222222222",
251: LnF.lnfRGB[0],
252: LnF.lnfRGB[6],
253: LnF.lnfRGB[12]),
254: XEiJ.createImage (
255: 20, 14,
256: "22222222222222222222" +
257: "2..................2" +
258: "2......22..........2" +
259: "2......22..........2" +
260: "2......22..........2" +
261: "2......22..........2" +
262: "2......22..........2" +
263: "2......22..........2" +
264: "2......22..........2" +
265: "2......22..........2" +
266: "2......2222222.....2" +
267: "2......2222222.....2" +
268: "2..................2" +
269: "22222222222222222222",
270: LnF.lnfRGB[0],
271: LnF.lnfRGB[6],
272: LnF.lnfRGB[12]),
273: XEiJ.createImage (
274: 20, 14,
275: "22222222222222222222" +
276: "2..................2" +
277: "2....22....22......2" +
278: "2..222222..22......2" +
279: "2.22222222.22......2" +
280: "2.22.22....22......2" +
281: "2.2222222..22......2" +
282: "2..2222222.22......2" +
283: "2....22.22.22......2" +
284: "2.22222222.22......2" +
285: "2..222222..2222222.2" +
286: "2....22....2222222.2" +
287: "2..................2" +
288: "22222222222222222222",
289: LnF.lnfRGB[0],
290: LnF.lnfRGB[6],
291: LnF.lnfRGB[12])
292: ),
293: "ja", "アドレスとオフセット");
294:
295:
296: ddpProgramBox = Multilingual.mlnToolTipText (
297: ComponentFactory.createComboBox (0, "Program name", listener, 16, ""),
298: "ja", "プログラム名");
299: ddpProgramBox.setMaximumRowCount (16);
300: ddpProgramAge = -1;
301:
302:
303: if (BranchLog.BLG_ON) {
304: ddpBacktraceOn = false;
305: ddpBacktraceRecord = -1L;
306:
307:
308: ddpBacktraceModel = new ReverseLongModel (0L, 0L, 0L, 1L);
309: ddpBacktraceSpinner = ComponentFactory.createNumberSpinner (ddpBacktraceModel, 10, new ChangeListener () {
310: @Override public void stateChanged (ChangeEvent ce) {
311: if (XEiJ.dbgEventMask == 0 && XEiJ.mpuTask == null) {
312: long record = ddpBacktraceModel.getNumber ().longValue ();
313: int i = (char) record << BranchLog.BLG_RECORD_SHIFT;
314: if (
315: ddpBacktraceRecord < record) {
316: ddpBacktraceRecord = record;
317: ddpUpdate (BranchLog.blgArray[i] & ~1, BranchLog.blgArray[i] & 1, false);
318: } else if (record < ddpBacktraceRecord) {
319: ddpBacktraceRecord = record;
320: ddpUpdate (BranchLog.blgArray[i + 1] & ~1, BranchLog.blgArray[i] & 1, false);
321: }
322: }
323: }
324: });
325:
326:
327: ddpBacktraceCheckBox =
328: Multilingual.mlnToolTipText (
329: ComponentFactory.createIconCheckBox (
330: ddpBacktraceOn,
331: LnF.LNF_BACK_TRACE_IMAGE,
332: LnF.LNF_BACK_TRACE_SELECTED_IMAGE,
333: "Backtrace", listener),
334: "ja", "バックトレース");
335: }
336:
337:
338: ddpSupervisorCheckBox =
339: Multilingual.mlnToolTipText (
340: ComponentFactory.createIconCheckBox (
341: ddpSupervisorMode != 0,
342: LnF.LNF_USER_SELECTED_IMAGE,
343: LnF.LNF_SUPERVISOR_SELECTED_IMAGE,
344: "User/Supervisor", listener),
345: "ja", "ユーザ/スーパーバイザ");
346:
347:
348: ddpFrame = Multilingual.mlnTitle (
349: ComponentFactory.createRestorableSubFrame (
350: Settings.SGS_DDP_FRAME_KEY,
351: "Disassemble list",
352: null,
353: ComponentFactory.createBorderPanel (
354: ddpBoard,
355: ComponentFactory.createHorizontalBox (
356: ddpProgramButton,
357: ddpProgramBox,
358: ddpSpinner,
359: ddpSupervisorCheckBox,
360: Box.createHorizontalStrut (12),
361: (BranchLog.BLG_ON ?
362: ComponentFactory.createHorizontalBox (
363: ddpBacktraceCheckBox,
364: ddpBacktraceSpinner,
365: Box.createHorizontalStrut (12)) :
366: null),
367: Box.createHorizontalGlue (),
368: XEiJ.mpuMakeOriIllegalCheckBox (),
369: XEiJ.mpuMakeStopOnErrorCheckBox (),
370: XEiJ.mpuMakeStopAtStartCheckBox (),
371: Box.createHorizontalStrut (12),
372: XEiJ.mpuMakeBreakButton (),
373: XEiJ.mpuMakeTraceButton (),
374: XEiJ.mpuMakeTrace10Button (),
375: XEiJ.mpuMakeTrace100Button (),
376: XEiJ.mpuMakeStepButton (),
377: XEiJ.mpuMakeStep10Button (),
378: XEiJ.mpuMakeStep100Button (),
379: XEiJ.mpuMakeReturnButton (),
380: XEiJ.mpuMakeRunButton ()
381: )
382: )
383: ),
384: "ja", "逆アセンブルリスト");
385: ComponentFactory.addListener (
386: ddpFrame,
387: new WindowAdapter () {
388: @Override public void windowClosing (WindowEvent we) {
389: XEiJ.dbgVisibleMask &= ~XEiJ.DBG_DDP_VISIBLE_MASK;
390: }
391: });
392:
393: ddpStoppedBy = null;
394: ddpStoppedAddress = -1;
395:
396: }
397:
398:
399:
400:
401: public static void ddpUpdate (int address, int supervisor, boolean forceUpdate) {
402:
403: XEiJ.dbgEventMask++;
404:
405: if (address == -1) {
406: ddpStoppedAddress = address = ddpStoppedBy == null ? XEiJ.regPC : XEiJ.regPC0;
407: forceUpdate = true;
408: } else if (address == 0) {
409: address = ddpItemAddress;
410: }
411:
412: if (supervisor == -1) {
413: supervisor = XEiJ.regSRS;
414: forceUpdate = true;
415: }
416:
417: if ((ddpSupervisorMode != 0) != (supervisor != 0)) {
418: ddpSupervisorMode = supervisor;
419: forceUpdate = true;
420: if (ddpSupervisorCheckBox.isSelected () != (supervisor != 0)) {
421: ddpSupervisorCheckBox.setSelected (supervisor != 0);
422: }
423: }
424:
425: if (forceUpdate) {
426: ddpItemCount = 0;
427: }
428:
429: address &= DDP_ITEM_MASK;
430:
431:
432: if (BranchLog.BLG_ON) {
433: if (XEiJ.mpuTask == null) {
434: long newestRecord = BranchLog.blgNewestRecord;
435: long oldestRecord = Math.max (0L, newestRecord - 65535);
436: if (
437: ddpBacktraceRecord < oldestRecord || newestRecord < ddpBacktraceRecord) {
438: ddpBacktraceRecord = newestRecord;
439: ddpBacktraceModel.setMaximum (Long.valueOf (newestRecord));
440: ddpBacktraceModel.setValue (Long.valueOf (newestRecord));
441: }
442: if (ddpBacktraceOn) {
443: int i = (char) ddpBacktraceRecord << BranchLog.BLG_RECORD_SHIFT;
444: if (address >>> 1 < BranchLog.blgArray[i] >>> 1) {
445: if (oldestRecord < ddpBacktraceRecord) {
446: ddpBacktraceRecord--;
447: ddpBacktraceModel.setValue (Long.valueOf (ddpBacktraceRecord));
448: address = BranchLog.blgArray[((char) ddpBacktraceRecord << BranchLog.BLG_RECORD_SHIFT) + 1] & ~1;
449: }
450: } else if (BranchLog.blgArray[i + 1] >>> 1 < address >>> 1) {
451: if (ddpBacktraceRecord < newestRecord) {
452: ddpBacktraceRecord++;
453: ddpBacktraceModel.setValue (Long.valueOf (ddpBacktraceRecord));
454: address = BranchLog.blgArray[(char) ddpBacktraceRecord << BranchLog.BLG_RECORD_SHIFT] & ~1;
455: }
456: }
457: }
458: }
459: }
460:
461: if (ddpItemCount != 0) {
462: int i = Arrays.binarySearch (ddpAddressArray, 1, ddpItemCount, address + 1);
463: i = (i >> 31 ^ i) - 1;
464: if (0 < i && i < ddpItemCount - 1 &&
465: ddpAddressArray[i] == address &&
466: !ddpDCWArray[i]) {
467:
468:
469:
470: ddpItemAddress = address;
471: if (ddpItemIndex != i) {
472: ddpItemIndex = i;
473: ddpTextArea.setCaretPosition (ddpCaretArray[i]);
474: }
475:
476:
477:
478:
479: XEiJ.dbgEventMask--;
480: return;
481: }
482: }
483:
484:
485: ddpItemAddress = address;
486:
487:
488:
489: ddpPageAddress = address & DDP_PAGE_MASK;
490: int pageEndAddress = ddpPageAddress + DDP_PAGE_SIZE;
491:
492:
493: int dataBytes = 10;
494: int addressWidth;
495: int codeWidth;
496: if (ddpProgramMode == 0) {
497:
498:
499:
500:
501:
502: addressWidth = 8;
503: codeWidth = 36;
504: } else if (ddpProgramMode == 1) {
505:
506:
507:
508:
509:
510: addressWidth = 7;
511: codeWidth = 37;
512: } else {
513:
514:
515:
516:
517:
518: addressWidth = 16;
519: codeWidth = 48;
520: }
521: String header = (new StringBuilder ().
522: append (XEiJ.DBG_SPACES, 0, addressWidth + 2).
523: append ("+0+1+2+3+4+5+6+7+8+9").
524: append (XEiJ.DBG_SPACES, 0, 2 + codeWidth + dataBytes - 2).
525: append ("▲\n")).toString ();
526: String footer = (new StringBuilder ().
527: append (XEiJ.DBG_SPACES, 0, addressWidth + 2).
528: append ("+0+1+2+3+4+5+6+7+8+9").
529: append (XEiJ.DBG_SPACES, 0, 2 + codeWidth + dataBytes - 2).
530: append ("▼")).toString ();
531:
532:
533: ddpAddressArray[0] = ddpPageAddress - DDP_ITEM_SIZE;
534: ddpSplitArray[0] = 0;
535: ddpCaretArray[0] = 0;
536: StringBuilder sb = new StringBuilder (header);
537: int itemCount = 1;
538: int itemAddress = ddpPageAddress;
539: int dcwAddress = pageEndAddress;
540: int dcwEndAddress = pageEndAddress;
541: boolean prevBranchFlag = false;
542:
543:
544: if (LabeledAddress.lblProgramCount == 0) {
545: LabeledAddress.lblUpdateProgram ();
546: }
547: if (ddpProgramAge != LabeledAddress.lblProgramAge) {
548: ddpProgramAge = LabeledAddress.lblProgramAge;
549: ddpProgramBox.removeAllItems ();
550: ddpProgramBox.addItem ("raw address");
551: for (int i = 0; i < LabeledAddress.lblProgramCount; i++) {
552: ddpProgramBox.addItem (XEiJ.fmtHex8 (new StringBuilder (), LabeledAddress.lblProgramHead[i]).append (' ').append (LabeledAddress.lblProgramName[i]).toString ());
553: }
554: }
555:
556: TreeMap<Integer,InstructionBreakPoint.InstructionBreakRecord> pointTable;
557: if (InstructionBreakPoint.IBP_ON) {
558: pointTable = InstructionBreakPoint.ibpPointTable;
559: }
560:
561: itemLoop:
562: do {
563: int itemEndAddress;
564: String code;
565:
566:
567:
568:
569:
570:
571:
572: if (dcwAddress <= itemAddress && itemAddress < dcwEndAddress) {
573: Disassembler.disStatus = 0;
574: int oc = MC68060.mmuPeekWordZeroCode (itemAddress, supervisor);
575: if ((oc & 0xfe00) == 0x7000 && MC68060.mmuPeekWordZeroCode (itemAddress + 2, supervisor) == 0x4e4f) {
576:
577: XEiJ.fmtHex2 (DDP_MOVEQD0_BASE, 10, oc);
578: code = String.valueOf (DDP_MOVEQD0_BASE);
579: } else {
580: XEiJ.fmtHex4 (DDP_DCW_BASE, 9, oc);
581: code = String.valueOf (DDP_DCW_BASE);
582: }
583: itemEndAddress = itemAddress + 2;
584: ddpDCWArray[itemCount] = true;
585: } else {
586: LabeledAddress.lblGetIndex (itemAddress);
587: code = Disassembler.disDisassemble (new StringBuilder (), itemAddress, supervisor,
588: LabeledAddress.lblLastGetHead, LabeledAddress.lblLastGetTail, ddpProgramMode).toString ();
589: for (int t = itemAddress + 2; t < Disassembler.disPC; t += 2) {
590: if (t == address ||
591: InstructionBreakPoint.IBP_ON && pointTable.containsKey (t)) {
592:
593:
594:
595: dcwAddress = itemAddress;
596: dcwEndAddress = t;
597: continue itemLoop;
598: }
599: }
600: itemEndAddress = Disassembler.disPC;
601: ddpDCWArray[itemCount] = false;
602: }
603:
604:
605: if (prevBranchFlag) {
606: sb.append ('\n');
607: }
608:
609:
610: if (itemAddress == address) {
611: ddpItemIndex = itemCount;
612: }
613: ddpAddressArray[itemCount] = itemAddress;
614: ddpSplitArray[itemCount] = sb.length ();
615:
616: if (prevBranchFlag) {
617:
618: if (true) {
619: int i = sb.length ();
620: LabeledAddress.lblSearch (sb, itemAddress);
621: if (i < sb.length ()) {
622: sb.append ('\n');
623: }
624: }
625: }
626:
627:
628: if (itemAddress == ddpStoppedAddress && ddpStoppedBy != null) {
629: sb.append (ddpStoppedBy).append ('\n');
630: }
631:
632: ddpCaretArray[itemCount] = sb.length ();
633:
634:
635: int lineAddress = itemAddress;
636: int lineEndAddress = Math.min (lineAddress + dataBytes, itemEndAddress);
637: {
638:
639:
640:
641: if (ddpProgramMode == 0 ||
642: ddpProgramMode == 2) {
643: XEiJ.fmtHex8 (sb, lineAddress);
644: }
645:
646:
647:
648:
649:
650:
651:
652:
653:
654:
655:
656: if (ddpProgramMode == 1 ||
657: ddpProgramMode == 2) {
658: int index = LabeledAddress.lblGetIndex (lineAddress);
659: if (index != -1 &&
660: LabeledAddress.lblLastGetHead != 0) {
661: if (ddpProgramMode == 2) {
662: sb.append (':');
663: }
664: XEiJ.fmtHex6 (sb.append ('L'), lineAddress - LabeledAddress.lblLastGetHead);
665: } else {
666: if (ddpProgramMode == 1) {
667: XEiJ.fmtHex8 (sb, lineAddress);
668: } else {
669:
670: sb.append (" ");
671: }
672: }
673: }
674: sb.append (" ");
675: }
676:
677: for (int a = lineAddress; a < lineEndAddress; a += 2) {
678: XEiJ.fmtHex4 (sb, MC68060.mmuPeekWordZeroCode (a, supervisor));
679: }
680: sb.append (XEiJ.DBG_SPACES, 0, 2 * Math.max (0, lineAddress + dataBytes - lineEndAddress) + 2);
681:
682: sb.append (code).append (XEiJ.DBG_SPACES, 0, Math.max (1, codeWidth - code.length ()));
683:
684: InstructionBreakPoint.InstructionBreakRecord r = InstructionBreakPoint.IBP_ON ? pointTable.get (itemAddress) : null;
685: if (r != null) {
686: if (r.ibrWaitInstruction != null) {
687: sb.append ("----");
688: }
689: if (r.ibrThreshold < 0) {
690: sb.append ("******");
691: } else if (r.ibrThreshold != 0x7fffffff) {
692: sb.append (r.ibrValue).append ('/').append (r.ibrThreshold);
693: }
694: } else {
695: for (int a = lineAddress; a < lineEndAddress; a++) {
696: int h = MC68060.mmuPeekByteZeroCode (a, supervisor);
697: int c;
698: if (0x81 <= h && h <= 0x9f || 0xe0 <= h && h <= 0xef) {
699: int l = MC68060.mmuPeekByteZeroCode (a + 1, supervisor);
700: if (0x40 <= l && l != 0x7f && l <= 0xfc) {
701: c = CharacterCode.chrSJISToChar[h << 8 | l];
702: if (c == 0) {
703: c = '※';
704: }
705: a++;
706: } else {
707: c = '.';
708: }
709: } else {
710: c = CharacterCode.chrSJISToChar[h];
711: if (c < 0x20 || c == 0x7f) {
712: c = '.';
713: }
714: }
715: sb.append ((char) c);
716: }
717: }
718: sb.append ('\n');
719:
720:
721: while (lineEndAddress < itemEndAddress) {
722: lineAddress = lineEndAddress;
723: lineEndAddress = Math.min (lineAddress + dataBytes, itemEndAddress);
724:
725:
726:
727: if (ddpProgramMode == 0 ||
728: ddpProgramMode == 2) {
729: XEiJ.fmtHex8 (sb, lineAddress);
730: }
731:
732:
733:
734:
735:
736:
737:
738:
739:
740:
741:
742: if (ddpProgramMode == 1 ||
743: ddpProgramMode == 2) {
744: int index = LabeledAddress.lblGetIndex (lineAddress);
745: if (index != -1 &&
746: LabeledAddress.lblLastGetHead != 0) {
747: if (ddpProgramMode == 2) {
748: sb.append (':');
749: }
750: XEiJ.fmtHex6 (sb.append ('L'), lineAddress - LabeledAddress.lblLastGetHead);
751: } else {
752: if (ddpProgramMode == 1) {
753: XEiJ.fmtHex8 (sb, lineAddress);
754: } else {
755:
756: sb.append (" ");
757: }
758: }
759: }
760: sb.append (" ");
761:
762: for (int a = lineAddress; a < lineEndAddress; a += 2) {
763: XEiJ.fmtHex4 (sb, MC68060.mmuPeekWordZeroCode (a, supervisor));
764: }
765: sb.append (XEiJ.DBG_SPACES, 0, 2 * Math.max (0, lineAddress + dataBytes - lineEndAddress) + 2 + codeWidth);
766:
767: for (int a = lineAddress; a < lineEndAddress; a++) {
768: int h = MC68060.mmuPeekByteZeroCode (a, supervisor);
769: int c;
770: if (0x81 <= h && h <= 0x9f || 0xe0 <= h && h <= 0xef) {
771: int l = MC68060.mmuPeekByteZeroCode (a + 1, supervisor);
772: if (0x40 <= l && l != 0x7f && l <= 0xfc) {
773: c = CharacterCode.chrSJISToChar[h << 8 | l];
774: if (c == 0) {
775: c = '※';
776: }
777: a++;
778: } else {
779: c = '.';
780: }
781: } else {
782: c = CharacterCode.chrSJISToChar[h];
783: if (c < 0x20 || c == 0x7f) {
784: c = '.';
785: }
786: }
787: sb.append ((char) c);
788: }
789: sb.append ('\n');
790: }
791:
792:
793: itemCount++;
794: itemAddress = itemEndAddress;
795:
796:
797: prevBranchFlag = (Disassembler.disStatus & Disassembler.DIS_ALWAYS_BRANCH) != 0;
798:
799: } while (itemAddress < pageEndAddress);
800:
801:
802: ddpAddressArray[itemCount] = itemAddress;
803: ddpSplitArray[itemCount] = sb.length ();
804: ddpCaretArray[itemCount] = sb.length ();
805: sb.append (footer);
806: itemCount++;
807: ddpItemCount = itemCount;
808:
809:
810: ddpTextArea.setText (sb.toString ());
811: ddpTextArea.setCaretPosition (ddpCaretArray[ddpItemIndex]);
812:
813:
814:
815:
816:
817: ddpSpinner.setHintArray (ddpAddressArray, itemCount);
818: ddpSpinner.setHintIndex (ddpItemIndex);
819:
820: XEiJ.dbgEventMask--;
821:
822: }
823:
824: }
825:
826:
827: