MemoryMappedDevice.java
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35: package xeij;
36:
37: import java.lang.*;
38: import java.util.*;
39:
40: public enum MemoryMappedDevice {
41:
42:
43:
44: MMD_MMR {
45: @Override public String toString () {
46: return Multilingual.mlnJapanese ? "メインメモリ" : "Main Memory";
47: }
48:
49: @Override protected byte mmdPbs (int a) {
50: a &= XEiJ.BUS_MOTHER_MASK;
51: return MainMemory.mmrM8[a];
52: }
53: @Override protected int mmdPbz (int a) {
54: a &= XEiJ.BUS_MOTHER_MASK;
55: return MainMemory.mmrM8[a] & 0xff;
56: }
57: @Override protected int mmdPws (int a) {
58: a &= XEiJ.BUS_MOTHER_MASK;
59: if (MainMemory.MMR_USE_BYTE_BUFFER) {
60: return MainMemory.mmrBuffer.getShort (a);
61: } else {
62: return MainMemory.mmrM8[a] << 8 | (MainMemory.mmrM8[a + 1] & 0xff);
63: }
64: }
65: @Override protected int mmdPwz (int a) {
66: a &= XEiJ.BUS_MOTHER_MASK;
67: if (MainMemory.MMR_USE_BYTE_BUFFER) {
68: return MainMemory.mmrBuffer.getChar (a);
69: } else {
70: return (char) (MainMemory.mmrM8[a] << 8 | (MainMemory.mmrM8[a + 1] & 0xff));
71: }
72: }
73: @Override protected int mmdPls (int a) {
74: a &= XEiJ.BUS_MOTHER_MASK;
75: if (MainMemory.MMR_USE_BYTE_BUFFER) {
76: return MainMemory.mmrBuffer.getInt (a);
77: } else {
78: return MainMemory.mmrM8[a] << 24 | (MainMemory.mmrM8[a + 1] & 0xff) << 16 | (char) (MainMemory.mmrM8[a + 2] << 8 | (MainMemory.mmrM8[a + 3] & 0xff));
79: }
80: }
81:
82: @Override protected byte mmdRbs (int a) throws M68kException {
83: XEiJ.mpuClockTime += XEiJ.busWaitTime.ram;
84: a &= XEiJ.BUS_MOTHER_MASK;
85: return MainMemory.mmrM8[a];
86: }
87: @Override protected int mmdRbz (int a) throws M68kException {
88: XEiJ.mpuClockTime += XEiJ.busWaitTime.ram;
89: a &= XEiJ.BUS_MOTHER_MASK;
90: return MainMemory.mmrM8[a] & 0xff;
91: }
92: @Override protected int mmdRws (int a) throws M68kException {
93: XEiJ.mpuClockTime += XEiJ.busWaitTime.ram;
94: a &= XEiJ.BUS_MOTHER_MASK;
95: if (MainMemory.MMR_USE_BYTE_BUFFER) {
96: return MainMemory.mmrBuffer.getShort (a);
97: } else {
98: return MainMemory.mmrM8[a] << 8 | (MainMemory.mmrM8[a + 1] & 0xff);
99: }
100: }
101: @Override protected int mmdRwz (int a) throws M68kException {
102: XEiJ.mpuClockTime += XEiJ.busWaitTime.ram;
103: a &= XEiJ.BUS_MOTHER_MASK;
104: if (MainMemory.MMR_USE_BYTE_BUFFER) {
105: return MainMemory.mmrBuffer.getChar (a);
106: } else {
107: return (char) (MainMemory.mmrM8[a] << 8 | (MainMemory.mmrM8[a + 1] & 0xff));
108: }
109: }
110: @Override protected int mmdRls (int a) throws M68kException {
111: XEiJ.mpuClockTime += XEiJ.busWaitTime.ramlong;
112: a &= XEiJ.BUS_MOTHER_MASK;
113: if (MainMemory.MMR_USE_BYTE_BUFFER) {
114: return MainMemory.mmrBuffer.getInt (a);
115: } else {
116: return MainMemory.mmrM8[a] << 24 | (MainMemory.mmrM8[a + 1] & 0xff) << 16 | (char) (MainMemory.mmrM8[a + 2] << 8 | (MainMemory.mmrM8[a + 3] & 0xff));
117: }
118: }
119:
120: @Override protected void mmdWb (int a, int d) throws M68kException {
121: XEiJ.mpuClockTime += XEiJ.busWaitTime.ram;
122: a &= XEiJ.BUS_MOTHER_MASK;
123: MainMemory.mmrM8[a ] = (byte) d;
124: }
125: @Override protected void mmdWw (int a, int d) throws M68kException {
126: XEiJ.mpuClockTime += XEiJ.busWaitTime.ram;
127: a &= XEiJ.BUS_MOTHER_MASK;
128: if (MainMemory.MMR_USE_BYTE_BUFFER) {
129: MainMemory.mmrBuffer.putShort (a, (short) d);
130: } else {
131: MainMemory.mmrM8[a ] = (byte) (d >> 8);
132: MainMemory.mmrM8[a + 1] = (byte) d;
133: }
134: }
135: @Override protected void mmdWl (int a, int d) throws M68kException {
136: XEiJ.mpuClockTime += XEiJ.busWaitTime.ramlong;
137: a &= XEiJ.BUS_MOTHER_MASK;
138: if (MainMemory.MMR_USE_BYTE_BUFFER) {
139: MainMemory.mmrBuffer.putInt (a, d);
140: } else {
141: MainMemory.mmrM8[a ] = (byte) (d >> 24);
142: MainMemory.mmrM8[a + 1] = (byte) (d >> 16);
143: MainMemory.mmrM8[a + 2] = (byte) (d >> 8);
144: MainMemory.mmrM8[a + 3] = (byte) d;
145: }
146: }
147: },
148:
149:
150:
151:
152:
153:
154: MMD_MM1 {
155: @Override public String toString () {
156: return Multilingual.mlnJapanese ? "1MB 搭載機の 2MB 目" : "2nd MB of machines with 1MB";
157: }
158:
159: @Override protected byte mmdRbs (int a) throws M68kException {
160: XEiJ.mpuClockTime += XEiJ.busWaitTime.ram;
161: return (byte) ((a & 1) == 0 ? mmdRwz (a) >> 8 : mmdRwz (a));
162: }
163: @Override protected int mmdRbz (int a) throws M68kException {
164: XEiJ.mpuClockTime += XEiJ.busWaitTime.ram;
165: return (a & 1) == 0 ? mmdRwz (a) >> 8 : mmdRwz (a) & 0xff;
166: }
167: @Override protected int mmdRws (int a) throws M68kException {
168: XEiJ.mpuClockTime += XEiJ.busWaitTime.ram;
169: return (short) mmdRwz (a);
170: }
171: @Override protected int mmdRwz (int a) throws M68kException {
172: XEiJ.mpuClockTime += XEiJ.busWaitTime.ram;
173: return XEiJ.currentModel.isShodai () ? 0x6100 : 0xffff;
174: }
175: @Override protected int mmdRls (int a) throws M68kException {
176: XEiJ.mpuClockTime += XEiJ.busWaitTime.ramlong;
177: return mmdRwz (a) << 16 | mmdRwz (a + 2);
178: }
179:
180: @Override protected void mmdWb (int a, int d) throws M68kException {
181: XEiJ.mpuClockTime += XEiJ.busWaitTime.ram;
182: }
183: @Override protected void mmdWw (int a, int d) throws M68kException {
184: XEiJ.mpuClockTime += XEiJ.busWaitTime.ram;
185: }
186: @Override protected void mmdWl (int a, int d) throws M68kException {
187: XEiJ.mpuClockTime += XEiJ.busWaitTime.ramlong;
188: }
189: },
190:
191:
192:
193: MMD_XMM {
194: @Override public String toString () {
195: return Multilingual.mlnJapanese ? "拡張メモリ" : "Expansion Memory";
196: }
197:
198: @Override protected byte mmdPbs (int a) {
199: a -= XEiJ.busExMemoryStart;
200: return XEiJ.busExMemoryArray[a];
201: }
202: @Override protected int mmdPbz (int a) {
203: a -= XEiJ.busExMemoryStart;
204: return XEiJ.busExMemoryArray[a] & 0xff;
205: }
206: @Override protected int mmdPws (int a) {
207: a -= XEiJ.busExMemoryStart;
208: return XEiJ.busExMemoryArray[a] << 8 | (XEiJ.busExMemoryArray[a + 1] & 0xff);
209: }
210: @Override protected int mmdPwz (int a) {
211: a -= XEiJ.busExMemoryStart;
212: return (char) (XEiJ.busExMemoryArray[a] << 8 | (XEiJ.busExMemoryArray[a + 1] & 0xff));
213: }
214: @Override protected int mmdPls (int a) {
215: a -= XEiJ.busExMemoryStart;
216: return XEiJ.busExMemoryArray[a] << 24 | (XEiJ.busExMemoryArray[a + 1] & 0xff) << 16 | (char) (XEiJ.busExMemoryArray[a + 2] << 8 | (XEiJ.busExMemoryArray[a + 3] & 0xff));
217: }
218:
219: @Override protected byte mmdRbs (int a) throws M68kException {
220: a -= XEiJ.busExMemoryStart;
221: return XEiJ.busExMemoryArray[a];
222: }
223: @Override protected int mmdRbz (int a) throws M68kException {
224: a -= XEiJ.busExMemoryStart;
225: return XEiJ.busExMemoryArray[a] & 0xff;
226: }
227: @Override protected int mmdRws (int a) throws M68kException {
228: a -= XEiJ.busExMemoryStart;
229: return XEiJ.busExMemoryArray[a] << 8 | (XEiJ.busExMemoryArray[a + 1] & 0xff);
230: }
231: @Override protected int mmdRwz (int a) throws M68kException {
232: a -= XEiJ.busExMemoryStart;
233: return (char) (XEiJ.busExMemoryArray[a] << 8 | (XEiJ.busExMemoryArray[a + 1] & 0xff));
234: }
235: @Override protected int mmdRls (int a) throws M68kException {
236: a -= XEiJ.busExMemoryStart;
237: return XEiJ.busExMemoryArray[a] << 24 | (XEiJ.busExMemoryArray[a + 1] & 0xff) << 16 | (char) (XEiJ.busExMemoryArray[a + 2] << 8 | (XEiJ.busExMemoryArray[a + 3] & 0xff));
238: }
239:
240: @Override protected void mmdWb (int a, int d) throws M68kException {
241: a -= XEiJ.busExMemoryStart;
242: XEiJ.busExMemoryArray[a ] = (byte) d;
243: }
244: @Override protected void mmdWw (int a, int d) throws M68kException {
245: a -= XEiJ.busExMemoryStart;
246: XEiJ.busExMemoryArray[a ] = (byte) (d >> 8);
247: XEiJ.busExMemoryArray[a + 1] = (byte) d;
248: }
249: @Override protected void mmdWl (int a, int d) throws M68kException {
250: a -= XEiJ.busExMemoryStart;
251: XEiJ.busExMemoryArray[a ] = (byte) (d >> 24);
252: XEiJ.busExMemoryArray[a + 1] = (byte) (d >> 16);
253: XEiJ.busExMemoryArray[a + 2] = (byte) (d >> 8);
254: XEiJ.busExMemoryArray[a + 3] = (byte) d;
255: }
256: },
257:
258:
259:
260:
261:
262:
263:
264:
265:
266:
267: MMD_GE0 {
268: @Override public String toString () {
269: return Multilingual.mlnJapanese ? "グラフィックス画面 (512 ドット 16 色 ページ 0)" : "Graphics Screen (512 dots 16 colors page 0)";
270: }
271:
272: @Override protected byte mmdPbs (int a) {
273: return ((a & 1) == 0 ? 0 :
274: GraphicScreen.graM4[(a >> 1) & 0x3ffff]);
275: }
276: @Override protected int mmdPbz (int a) {
277: return ((a & 1) == 0 ? 0 :
278: GraphicScreen.graM4[(a >> 1) & 0x3ffff]);
279: }
280: @Override protected int mmdPws (int a) {
281: return GraphicScreen.graM4[(a >> 1) & 0x3ffff];
282: }
283: @Override protected int mmdPwz (int a) {
284: return GraphicScreen.graM4[(a >> 1) & 0x3ffff];
285: }
286: @Override protected int mmdPls (int a) {
287: return (GraphicScreen.graM4[( a >> 1) & 0x3ffff] << 16 |
288: GraphicScreen.graM4[((a + 2) >> 1) & 0x3ffff]);
289: }
290:
291: @Override protected byte mmdRbs (int a) throws M68kException {
292: XEiJ.mpuClockTime += XEiJ.busWaitTime.gvram;
293: return ((a & 1) == 0 ? 0 :
294: GraphicScreen.graM4[(a >> 1) & 0x3ffff]);
295: }
296: @Override protected int mmdRbz (int a) throws M68kException {
297: XEiJ.mpuClockTime += XEiJ.busWaitTime.gvram;
298: return ((a & 1) == 0 ? 0 :
299: GraphicScreen.graM4[(a >> 1) & 0x3ffff]);
300: }
301: @Override protected int mmdRws (int a) throws M68kException {
302: XEiJ.mpuClockTime += XEiJ.busWaitTime.gvram;
303: return GraphicScreen.graM4[(a >> 1) & 0x3ffff];
304: }
305: @Override protected int mmdRwz (int a) throws M68kException {
306: XEiJ.mpuClockTime += XEiJ.busWaitTime.gvram;
307: return GraphicScreen.graM4[(a >> 1) & 0x3ffff];
308: }
309: @Override protected int mmdRls (int a) throws M68kException {
310: XEiJ.mpuClockTime += XEiJ.busWaitTime.gvram * 2;
311: return (GraphicScreen.graM4[( a >> 1) & 0x3ffff] << 16 |
312: GraphicScreen.graM4[((a + 2) >> 1) & 0x3ffff]);
313: }
314:
315: @Override protected void mmdWb (int a, int d) throws M68kException {
316: XEiJ.mpuClockTime += XEiJ.busWaitTime.gvram;
317: if ((a & 1) != 0) {
318: GraphicScreen.graM4[(a >> 1) & 0x3ffff] = (byte) (d & 15);
319: int y = (a >> 10) - CRTC.crtR13GrYCurr[0] & 511;
320: CRTC.crtRasterStamp[y ] = 0;
321: CRTC.crtRasterStamp[y + 512] = 0;
322: }
323: }
324: @Override protected void mmdWw (int a, int d) throws M68kException {
325: XEiJ.mpuClockTime += XEiJ.busWaitTime.gvram;
326: GraphicScreen.graM4[(a >> 1) & 0x3ffff] = (byte) (d & 15);
327: int y = (a >> 10) - CRTC.crtR13GrYCurr[0] & 511;
328: CRTC.crtRasterStamp[y ] = 0;
329: CRTC.crtRasterStamp[y + 512] = 0;
330: }
331: @Override protected void mmdWl (int a, int d) throws M68kException {
332: XEiJ.mpuClockTime += XEiJ.busWaitTime.gvram * 2;
333: GraphicScreen.graM4[( a >> 1) & 0x3ffff] = (byte) ((d >> 16) & 15);
334: GraphicScreen.graM4[((a + 2) >> 1) & 0x3ffff] = (byte) ( d & 15);
335: int y = (a >> 10) - CRTC.crtR13GrYCurr[0] & 511;
336: CRTC.crtRasterStamp[y ] = 0;
337: CRTC.crtRasterStamp[y + 512] = 0;
338: if ((a & 1022) == 1022) {
339: y = (y + 1) & 511;
340: CRTC.crtRasterStamp[y ] = 0;
341: CRTC.crtRasterStamp[y + 512] = 0;
342: }
343: }
344: },
345:
346:
347:
348:
349:
350:
351:
352:
353:
354:
355: MMD_GE1 {
356: @Override public String toString () {
357: return Multilingual.mlnJapanese ? "グラフィックス画面 (512 ドット 16 色 ページ 1)" : "Graphics Screen (512 dots 16 colors page 1)";
358: }
359:
360: @Override protected byte mmdPbs (int a) {
361: return ((a & 1) == 0 ? 0 :
362: GraphicScreen.graM4[0x40000 + ((a >> 1) & 0x3ffff)]);
363: }
364: @Override protected int mmdPbz (int a) {
365: return ((a & 1) == 0 ? 0 :
366: GraphicScreen.graM4[0x40000 + ((a >> 1) & 0x3ffff)]);
367: }
368: @Override protected int mmdPws (int a) {
369: return GraphicScreen.graM4[0x40000 + ((a >> 1) & 0x3ffff)];
370: }
371: @Override protected int mmdPwz (int a) {
372: return GraphicScreen.graM4[0x40000 + ((a >> 1) & 0x3ffff)];
373: }
374: @Override protected int mmdPls (int a) {
375: return (GraphicScreen.graM4[0x40000 + (( a >> 1) & 0x3ffff)] << 16 |
376: GraphicScreen.graM4[0x40000 + (((a + 2) >> 1) & 0x3ffff)]);
377: }
378:
379: @Override protected byte mmdRbs (int a) throws M68kException {
380: XEiJ.mpuClockTime += XEiJ.busWaitTime.gvram;
381: return ((a & 1) == 0 ? 0 :
382: GraphicScreen.graM4[0x40000 + ((a >> 1) & 0x3ffff)]);
383: }
384: @Override protected int mmdRbz (int a) throws M68kException {
385: XEiJ.mpuClockTime += XEiJ.busWaitTime.gvram;
386: return ((a & 1) == 0 ? 0 :
387: GraphicScreen.graM4[0x40000 + ((a >> 1) & 0x3ffff)]);
388: }
389: @Override protected int mmdRws (int a) throws M68kException {
390: XEiJ.mpuClockTime += XEiJ.busWaitTime.gvram;
391: return GraphicScreen.graM4[0x40000 + ((a >> 1) & 0x3ffff)];
392: }
393: @Override protected int mmdRwz (int a) throws M68kException {
394: XEiJ.mpuClockTime += XEiJ.busWaitTime.gvram;
395: return GraphicScreen.graM4[0x40000 + ((a >> 1) & 0x3ffff)];
396: }
397: @Override protected int mmdRls (int a) throws M68kException {
398: XEiJ.mpuClockTime += XEiJ.busWaitTime.gvram * 2;
399: return (GraphicScreen.graM4[0x40000 + (( a >> 1) & 0x3ffff)] << 16 |
400: GraphicScreen.graM4[0x40000 + (((a + 2) >> 1) & 0x3ffff)]);
401: }
402:
403: @Override protected void mmdWb (int a, int d) throws M68kException {
404: XEiJ.mpuClockTime += XEiJ.busWaitTime.gvram;
405: if ((a & 1) != 0) {
406: GraphicScreen.graM4[0x40000 + ((a >> 1) & 0x3ffff)] = (byte) (d & 15);
407: int y = (a >> 10) - CRTC.crtR13GrYCurr[1] & 511;
408: CRTC.crtRasterStamp[y ] = 0;
409: CRTC.crtRasterStamp[y + 512] = 0;
410: }
411: }
412: @Override protected void mmdWw (int a, int d) throws M68kException {
413: XEiJ.mpuClockTime += XEiJ.busWaitTime.gvram;
414: GraphicScreen.graM4[0x40000 + ((a >> 1) & 0x3ffff)] = (byte) (d & 15);
415: int y = (a >> 10) - CRTC.crtR13GrYCurr[1] & 511;
416: CRTC.crtRasterStamp[y ] = 0;
417: CRTC.crtRasterStamp[y + 512] = 0;
418: }
419: @Override protected void mmdWl (int a, int d) throws M68kException {
420: XEiJ.mpuClockTime += XEiJ.busWaitTime.gvram * 2;
421: GraphicScreen.graM4[0x40000 + (( a >> 1) & 0x3ffff)] = (byte) ((d >> 16) & 15);
422: GraphicScreen.graM4[0x40000 + (((a + 2) >> 1) & 0x3ffff)] = (byte) ( d & 15);
423: int y = (a >> 10) - CRTC.crtR13GrYCurr[1] & 511;
424: CRTC.crtRasterStamp[y ] = 0;
425: CRTC.crtRasterStamp[y + 512] = 0;
426: if ((a & 1022) == 1022) {
427: y = (y + 1) & 511;
428: CRTC.crtRasterStamp[y ] = 0;
429: CRTC.crtRasterStamp[y + 512] = 0;
430: }
431: }
432: },
433:
434:
435:
436:
437:
438:
439:
440:
441:
442:
443: MMD_GE2 {
444: @Override public String toString () {
445: return Multilingual.mlnJapanese ? "グラフィックス画面 (512 ドット 16 色 ページ 2)" : "Graphics Screen (512 dots 16 colors page 2)";
446: }
447:
448: @Override protected byte mmdPbs (int a) {
449: return ((a & 1) == 0 ? 0 :
450: GraphicScreen.graM4[0x80000 + ((a >> 1) & 0x3ffff)]);
451: }
452: @Override protected int mmdPbz (int a) {
453: return ((a & 1) == 0 ? 0 :
454: GraphicScreen.graM4[0x80000 + ((a >> 1) & 0x3ffff)]);
455: }
456: @Override protected int mmdPws (int a) {
457: return GraphicScreen.graM4[0x80000 + ((a >> 1) & 0x3ffff)];
458: }
459: @Override protected int mmdPwz (int a) {
460: return GraphicScreen.graM4[0x80000 + ((a >> 1) & 0x3ffff)];
461: }
462: @Override protected int mmdPls (int a) {
463: return (GraphicScreen.graM4[0x80000 + (( a >> 1) & 0x3ffff)] << 16 |
464: GraphicScreen.graM4[0x80000 + (((a + 2) >> 1) & 0x3ffff)]);
465: }
466:
467: @Override protected byte mmdRbs (int a) throws M68kException {
468: XEiJ.mpuClockTime += XEiJ.busWaitTime.gvram;
469: return ((a & 1) == 0 ? 0 :
470: GraphicScreen.graM4[0x80000 + ((a >> 1) & 0x3ffff)]);
471: }
472: @Override protected int mmdRbz (int a) throws M68kException {
473: XEiJ.mpuClockTime += XEiJ.busWaitTime.gvram;
474: return ((a & 1) == 0 ? 0 :
475: GraphicScreen.graM4[0x80000 + ((a >> 1) & 0x3ffff)]);
476: }
477: @Override protected int mmdRws (int a) throws M68kException {
478: XEiJ.mpuClockTime += XEiJ.busWaitTime.gvram;
479: return GraphicScreen.graM4[0x80000 + ((a >> 1) & 0x3ffff)];
480: }
481: @Override protected int mmdRwz (int a) throws M68kException {
482: XEiJ.mpuClockTime += XEiJ.busWaitTime.gvram;
483: return GraphicScreen.graM4[0x80000 + ((a >> 1) & 0x3ffff)];
484: }
485: @Override protected int mmdRls (int a) throws M68kException {
486: XEiJ.mpuClockTime += XEiJ.busWaitTime.gvram * 2;
487: return (GraphicScreen.graM4[0x80000 + (( a >> 1) & 0x3ffff)] << 16 |
488: GraphicScreen.graM4[0x80000 + (((a + 2) >> 1) & 0x3ffff)]);
489: }
490:
491: @Override protected void mmdWb (int a, int d) throws M68kException {
492: XEiJ.mpuClockTime += XEiJ.busWaitTime.gvram;
493: if ((a & 1) != 0) {
494: GraphicScreen.graM4[0x80000 + ((a >> 1) & 0x3ffff)] = (byte) (d & 15);
495: int y = (a >> 10) - CRTC.crtR13GrYCurr[2] & 511;
496: CRTC.crtRasterStamp[y ] = 0;
497: CRTC.crtRasterStamp[y + 512] = 0;
498: }
499: }
500: @Override protected void mmdWw (int a, int d) throws M68kException {
501: XEiJ.mpuClockTime += XEiJ.busWaitTime.gvram;
502: GraphicScreen.graM4[0x80000 + ((a >> 1) & 0x3ffff)] = (byte) (d & 15);
503: int y = (a >> 10) - CRTC.crtR13GrYCurr[2] & 511;
504: CRTC.crtRasterStamp[y ] = 0;
505: CRTC.crtRasterStamp[y + 512] = 0;
506: }
507: @Override protected void mmdWl (int a, int d) throws M68kException {
508: XEiJ.mpuClockTime += XEiJ.busWaitTime.gvram * 2;
509: GraphicScreen.graM4[0x80000 + (( a >> 1) & 0x3ffff)] = (byte) ((d >> 16) & 15);
510: GraphicScreen.graM4[0x80000 + (((a + 2) >> 1) & 0x3ffff)] = (byte) ( d & 15);
511: int y = (a >> 10) - CRTC.crtR13GrYCurr[2] & 511;
512: CRTC.crtRasterStamp[y ] = 0;
513: CRTC.crtRasterStamp[y + 512] = 0;
514: if ((a & 1022) == 1022) {
515: y = (y + 1) & 511;
516: CRTC.crtRasterStamp[y ] = 0;
517: CRTC.crtRasterStamp[y + 512] = 0;
518: }
519: }
520: },
521:
522:
523:
524:
525:
526:
527:
528:
529:
530:
531: MMD_GE3 {
532: @Override public String toString () {
533: return Multilingual.mlnJapanese ? "グラフィックス画面 (512 ドット 16 色 ページ 3)" : "Graphics Screen (512 dots 16 colors page 3)";
534: }
535:
536: @Override protected byte mmdPbs (int a) {
537: return ((a & 1) == 0 ? 0 :
538: GraphicScreen.graM4[0xc0000 + ((a >> 1) & 0x3ffff)]);
539: }
540: @Override protected int mmdPbz (int a) {
541: return ((a & 1) == 0 ? 0 :
542: GraphicScreen.graM4[0xc0000 + ((a >> 1) & 0x3ffff)]);
543: }
544: @Override protected int mmdPws (int a) {
545: return GraphicScreen.graM4[0xc0000 + ((a >> 1) & 0x3ffff)];
546: }
547: @Override protected int mmdPwz (int a) {
548: return GraphicScreen.graM4[0xc0000 + ((a >> 1) & 0x3ffff)];
549: }
550: @Override protected int mmdPls (int a) {
551: return (GraphicScreen.graM4[0xc0000 + (( a >> 1) & 0x3ffff)] << 16 |
552: GraphicScreen.graM4[0xc0000 + (((a + 2) >> 1) & 0x3ffff)]);
553: }
554:
555: @Override protected byte mmdRbs (int a) throws M68kException {
556: XEiJ.mpuClockTime += XEiJ.busWaitTime.gvram;
557: return ((a & 1) == 0 ? 0 :
558: GraphicScreen.graM4[0xc0000 + ((a >> 1) & 0x3ffff)]);
559: }
560: @Override protected int mmdRbz (int a) throws M68kException {
561: XEiJ.mpuClockTime += XEiJ.busWaitTime.gvram;
562: return ((a & 1) == 0 ? 0 :
563: GraphicScreen.graM4[0xc0000 + ((a >> 1) & 0x3ffff)]);
564: }
565: @Override protected int mmdRws (int a) throws M68kException {
566: XEiJ.mpuClockTime += XEiJ.busWaitTime.gvram;
567: return GraphicScreen.graM4[0xc0000 + ((a >> 1) & 0x3ffff)];
568: }
569: @Override protected int mmdRwz (int a) throws M68kException {
570: XEiJ.mpuClockTime += XEiJ.busWaitTime.gvram;
571: return GraphicScreen.graM4[0xc0000 + ((a >> 1) & 0x3ffff)];
572: }
573: @Override protected int mmdRls (int a) throws M68kException {
574: XEiJ.mpuClockTime += XEiJ.busWaitTime.gvram * 2;
575: return (GraphicScreen.graM4[0xc0000 + (( a >> 1) & 0x3ffff)] << 16 |
576: GraphicScreen.graM4[0xc0000 + (((a + 2) >> 1) & 0x3ffff)]);
577: }
578:
579: @Override protected void mmdWb (int a, int d) throws M68kException {
580: XEiJ.mpuClockTime += XEiJ.busWaitTime.gvram;
581: if ((a & 1) != 0) {
582: GraphicScreen.graM4[0xc0000 + ((a >> 1) & 0x3ffff)] = (byte) (d & 15);
583: int y = (a >> 10) - CRTC.crtR13GrYCurr[3] & 511;
584: CRTC.crtRasterStamp[y ] = 0;
585: CRTC.crtRasterStamp[y + 512] = 0;
586: }
587: }
588: @Override protected void mmdWw (int a, int d) throws M68kException {
589: XEiJ.mpuClockTime += XEiJ.busWaitTime.gvram;
590: GraphicScreen.graM4[0xc0000 + ((a >> 1) & 0x3ffff)] = (byte) (d & 15);
591: int y = (a >> 10) - CRTC.crtR13GrYCurr[3] & 511;
592: CRTC.crtRasterStamp[y ] = 0;
593: CRTC.crtRasterStamp[y + 512] = 0;
594: }
595: @Override protected void mmdWl (int a, int d) throws M68kException {
596: XEiJ.mpuClockTime += XEiJ.busWaitTime.gvram * 2;
597: GraphicScreen.graM4[0xc0000 + (( a >> 1) & 0x3ffff)] = (byte) ((d >> 16) & 15);
598: GraphicScreen.graM4[0xc0000 + (((a + 2) >> 1) & 0x3ffff)] = (byte) ( d & 15);
599: int y = (a >> 10) - CRTC.crtR13GrYCurr[3] & 511;
600: CRTC.crtRasterStamp[y ] = 0;
601: CRTC.crtRasterStamp[y + 512] = 0;
602: if ((a & 1022) == 1022) {
603: y = (y + 1) & 511;
604: CRTC.crtRasterStamp[y ] = 0;
605: CRTC.crtRasterStamp[y + 512] = 0;
606: }
607: }
608: },
609:
610:
611:
612:
613:
614:
615:
616:
617:
618:
619:
620:
621: MMD_GF0 {
622: @Override public String toString () {
623: return Multilingual.mlnJapanese ? "グラフィックス画面 (512 ドット 256 色 ページ 0)" : "Graphics Screen (512 dots 256 colors page 0)";
624: }
625:
626: @Override protected byte mmdPbs (int a) {
627: return (byte) ((a & 1) == 0 ? 0 :
628: GraphicScreen.graM4[0x40000 + ((a >> 1) & 0x3ffff)] << 4 |
629: GraphicScreen.graM4[ ((a >> 1) & 0x3ffff)]);
630: }
631: @Override protected int mmdPbz (int a) {
632: return ((a & 1) == 0 ? 0 :
633: GraphicScreen.graM4[0x40000 + ((a >> 1) & 0x3ffff)] << 4 |
634: GraphicScreen.graM4[ ((a >> 1) & 0x3ffff)]);
635: }
636: @Override protected int mmdPws (int a) {
637: int i = (a >> 1) & 0x3ffff;
638: return (GraphicScreen.graM4[0x40000 + i] << 4 |
639: GraphicScreen.graM4[ i]);
640: }
641: @Override protected int mmdPwz (int a) {
642: int i = (a >> 1) & 0x3ffff;
643: return (GraphicScreen.graM4[0x40000 + i] << 4 |
644: GraphicScreen.graM4[ i]);
645: }
646: @Override protected int mmdPls (int a) {
647: int i0 = ( a >> 1) & 0x3ffff;
648: int i1 = ((a + 2) >> 1) & 0x3ffff;
649: return (GraphicScreen.graM4[0x40000 + i0] << 20 |
650: GraphicScreen.graM4[ i0] << 16 |
651: GraphicScreen.graM4[0x40000 + i1] << 4 |
652: GraphicScreen.graM4[ i1]);
653: }
654:
655: @Override protected byte mmdRbs (int a) throws M68kException {
656: XEiJ.mpuClockTime += XEiJ.busWaitTime.gvram;
657: return (byte) ((a & 1) == 0 ? 0 :
658: GraphicScreen.graM4[0x40000 + ((a >> 1) & 0x3ffff)] << 4 |
659: GraphicScreen.graM4[ ((a >> 1) & 0x3ffff)]);
660: }
661: @Override protected int mmdRbz (int a) throws M68kException {
662: XEiJ.mpuClockTime += XEiJ.busWaitTime.gvram;
663: return ((a & 1) == 0 ? 0 :
664: GraphicScreen.graM4[0x40000 + ((a >> 1) & 0x3ffff)] << 4 |
665: GraphicScreen.graM4[ ((a >> 1) & 0x3ffff)]);
666: }
667: @Override protected int mmdRws (int a) throws M68kException {
668: XEiJ.mpuClockTime += XEiJ.busWaitTime.gvram;
669: int i = (a >> 1) & 0x3ffff;
670: return (GraphicScreen.graM4[0x40000 + i] << 4 |
671: GraphicScreen.graM4[ i]);
672: }
673: @Override protected int mmdRwz (int a) throws M68kException {
674: XEiJ.mpuClockTime += XEiJ.busWaitTime.gvram;
675: int i = (a >> 1) & 0x3ffff;
676: return (GraphicScreen.graM4[0x40000 + i] << 4 |
677: GraphicScreen.graM4[ i]);
678: }
679: @Override protected int mmdRls (int a) throws M68kException {
680: XEiJ.mpuClockTime += XEiJ.busWaitTime.gvram * 2;
681: int i0 = ( a >> 1) & 0x3ffff;
682: int i1 = ((a + 2) >> 1) & 0x3ffff;
683: return (GraphicScreen.graM4[0x40000 + i0] << 20 |
684: GraphicScreen.graM4[ i0] << 16 |
685: GraphicScreen.graM4[0x40000 + i1] << 4 |
686: GraphicScreen.graM4[ i1]);
687: }
688:
689: @Override protected void mmdWb (int a, int d) throws M68kException {
690: XEiJ.mpuClockTime += XEiJ.busWaitTime.gvram;
691: if ((a & 1) != 0) {
692: int i = (a >> 1) & 0x3ffff;
693: GraphicScreen.graM4[0x40000 + i] = (byte) ((d >> 4) & 15);
694: GraphicScreen.graM4[ i] = (byte) ( d & 15);
695: a >>= 10;
696: int y = a - CRTC.crtR13GrYCurr[0] & 511;
697: CRTC.crtRasterStamp[y ] = 0;
698: CRTC.crtRasterStamp[y + 512] = 0;
699: y = a - CRTC.crtR13GrYCurr[1] & 511;
700: CRTC.crtRasterStamp[y ] = 0;
701: CRTC.crtRasterStamp[y + 512] = 0;
702: }
703: }
704: @Override protected void mmdWw (int a, int d) throws M68kException {
705: XEiJ.mpuClockTime += XEiJ.busWaitTime.gvram;
706: int i = (a >> 1) & 0x3ffff;
707: GraphicScreen.graM4[0x40000 + i] = (byte) ((d >> 4) & 15);
708: GraphicScreen.graM4[ i] = (byte) ( d & 15);
709: a >>= 10;
710: int y = a - CRTC.crtR13GrYCurr[0] & 511;
711: CRTC.crtRasterStamp[y ] = 0;
712: CRTC.crtRasterStamp[y + 512] = 0;
713: y = a - CRTC.crtR13GrYCurr[1] & 511;
714: CRTC.crtRasterStamp[y ] = 0;
715: CRTC.crtRasterStamp[y + 512] = 0;
716: }
717: @Override protected void mmdWl (int a, int d) throws M68kException {
718: XEiJ.mpuClockTime += XEiJ.busWaitTime.gvram * 2;
719: int i0 = ( a >> 1) & 0x3ffff;
720: int i1 = ((a + 2) >> 1) & 0x3ffff;
721: GraphicScreen.graM4[0x40000 + i0] = (byte) ((d >> 20) & 15);
722: GraphicScreen.graM4[ i0] = (byte) ((d >> 16) & 15);
723: GraphicScreen.graM4[0x40000 + i1] = (byte) ((d >> 4) & 15);
724: GraphicScreen.graM4[ i1] = (byte) ( d & 15);
725: int b = (a + 2) >>> 10;
726: int y = b - CRTC.crtR13GrYCurr[0] & 511;
727: CRTC.crtRasterStamp[y ] = 0;
728: CRTC.crtRasterStamp[y + 512] = 0;
729: y = b - CRTC.crtR13GrYCurr[1] & 511;
730: CRTC.crtRasterStamp[y ] = 0;
731: CRTC.crtRasterStamp[y + 512] = 0;
732: a >>>= 10;
733: if (a != b) {
734: y = a - CRTC.crtR13GrYCurr[0] & 511;
735: CRTC.crtRasterStamp[y ] = 0;
736: CRTC.crtRasterStamp[y + 512] = 0;
737: y = a - CRTC.crtR13GrYCurr[1] & 511;
738: CRTC.crtRasterStamp[y ] = 0;
739: CRTC.crtRasterStamp[y + 512] = 0;
740: }
741: }
742: },
743:
744:
745:
746:
747:
748:
749:
750:
751:
752:
753:
754:
755: MMD_GF1 {
756: @Override public String toString () {
757: return Multilingual.mlnJapanese ? "グラフィックス画面 (512 ドット 256 色 ページ 1)" : "Graphics Screen (512 dots 256 colors page 1)";
758: }
759:
760: @Override protected byte mmdPbs (int a) {
761: return (byte) ((a & 1) == 0 ? 0 :
762: GraphicScreen.graM4[0xc0000 + ((a >> 1) & 0x3ffff)] << 4 |
763: GraphicScreen.graM4[0x80000 + ((a >> 1) & 0x3ffff)]);
764: }
765: @Override protected int mmdPbz (int a) {
766: return ((a & 1) == 0 ? 0 :
767: GraphicScreen.graM4[0xc0000 + ((a >> 1) & 0x3ffff)] << 4 |
768: GraphicScreen.graM4[0x80000 + ((a >> 1) & 0x3ffff)]);
769: }
770: @Override protected int mmdPws (int a) {
771: int i = (a >> 1) & 0x3ffff;
772: return (GraphicScreen.graM4[0xc0000 + i] << 4 |
773: GraphicScreen.graM4[0x80000 + i]);
774: }
775: @Override protected int mmdPwz (int a) {
776: int i = (a >> 1) & 0x3ffff;
777: return (GraphicScreen.graM4[0xc0000 + i] << 4 |
778: GraphicScreen.graM4[0x80000 + i]);
779: }
780: @Override protected int mmdPls (int a) {
781: int i0 = ( a >> 1) & 0x3ffff;
782: int i1 = ((a + 2) >> 1) & 0x3ffff;
783: return (GraphicScreen.graM4[0xc0000 + i0] << 20 |
784: GraphicScreen.graM4[0x80000 + i0] << 16 |
785: GraphicScreen.graM4[0xc0000 + i1] << 4 |
786: GraphicScreen.graM4[0x80000 + i1]);
787: }
788:
789: @Override protected byte mmdRbs (int a) throws M68kException {
790: XEiJ.mpuClockTime += XEiJ.busWaitTime.gvram;
791: return (byte) ((a & 1) == 0 ? 0 :
792: GraphicScreen.graM4[0xc0000 + ((a >> 1) & 0x3ffff)] << 4 |
793: GraphicScreen.graM4[0x80000 + ((a >> 1) & 0x3ffff)]);
794: }
795: @Override protected int mmdRbz (int a) throws M68kException {
796: XEiJ.mpuClockTime += XEiJ.busWaitTime.gvram;
797: return ((a & 1) == 0 ? 0 :
798: GraphicScreen.graM4[0xc0000 + ((a >> 1) & 0x3ffff)] << 4 |
799: GraphicScreen.graM4[0x80000 + ((a >> 1) & 0x3ffff)]);
800: }
801: @Override protected int mmdRws (int a) throws M68kException {
802: XEiJ.mpuClockTime += XEiJ.busWaitTime.gvram;
803: int i = (a >> 1) & 0x3ffff;
804: return (GraphicScreen.graM4[0xc0000 + i] << 4 |
805: GraphicScreen.graM4[0x80000 + i]);
806: }
807: @Override protected int mmdRwz (int a) throws M68kException {
808: XEiJ.mpuClockTime += XEiJ.busWaitTime.gvram;
809: int i = (a >> 1) & 0x3ffff;
810: return (GraphicScreen.graM4[0xc0000 + i] << 4 |
811: GraphicScreen.graM4[0x80000 + i]);
812: }
813: @Override protected int mmdRls (int a) throws M68kException {
814: XEiJ.mpuClockTime += XEiJ.busWaitTime.gvram * 2;
815: int i0 = ( a >> 1) & 0x3ffff;
816: int i1 = ((a + 2) >> 1) & 0x3ffff;
817: return (GraphicScreen.graM4[0xc0000 + i0] << 20 |
818: GraphicScreen.graM4[0x80000 + i0] << 16 |
819: GraphicScreen.graM4[0xc0000 + i1] << 4 |
820: GraphicScreen.graM4[0x80000 + i1]);
821: }
822:
823: @Override protected void mmdWb (int a, int d) throws M68kException {
824: XEiJ.mpuClockTime += XEiJ.busWaitTime.gvram;
825: if ((a & 1) != 0) {
826: int i = (a >> 1) & 0x3ffff;
827: GraphicScreen.graM4[0xc0000 + i] = (byte) ((d >> 4) & 15);
828: GraphicScreen.graM4[0x80000 + i] = (byte) ( d & 15);
829: a >>= 10;
830: int y = a - CRTC.crtR13GrYCurr[2] & 511;
831: CRTC.crtRasterStamp[y ] = 0;
832: CRTC.crtRasterStamp[y + 512] = 0;
833: y = a - CRTC.crtR13GrYCurr[3] & 511;
834: CRTC.crtRasterStamp[y ] = 0;
835: CRTC.crtRasterStamp[y + 512] = 0;
836: }
837: }
838: @Override protected void mmdWw (int a, int d) throws M68kException {
839: XEiJ.mpuClockTime += XEiJ.busWaitTime.gvram;
840: int i = (a >> 1) & 0x3ffff;
841: GraphicScreen.graM4[0xc0000 + i] = (byte) ((d >> 4) & 15);
842: GraphicScreen.graM4[0x80000 + i] = (byte) ( d & 15);
843: a >>= 10;
844: int y = a - CRTC.crtR13GrYCurr[2] & 511;
845: CRTC.crtRasterStamp[y ] = 0;
846: CRTC.crtRasterStamp[y + 512] = 0;
847: y = a - CRTC.crtR13GrYCurr[3] & 511;
848: CRTC.crtRasterStamp[y ] = 0;
849: CRTC.crtRasterStamp[y + 512] = 0;
850: }
851: @Override protected void mmdWl (int a, int d) throws M68kException {
852: XEiJ.mpuClockTime += XEiJ.busWaitTime.gvram * 2;
853: int i0 = ( a >> 1) & 0x3ffff;
854: int i1 = ((a + 2) >> 1) & 0x3ffff;
855: GraphicScreen.graM4[0xc0000 + i0] = (byte) ((d >> 20) & 15);
856: GraphicScreen.graM4[0x80000 + i0] = (byte) ((d >> 16) & 15);
857: GraphicScreen.graM4[0xc0000 + i1] = (byte) ((d >> 4) & 15);
858: GraphicScreen.graM4[0x80000 + i1] = (byte) ( d & 15);
859: int b = (a + 2) >>> 10;
860: int y = b - CRTC.crtR13GrYCurr[2] & 511;
861: CRTC.crtRasterStamp[y ] = 0;
862: CRTC.crtRasterStamp[y + 512] = 0;
863: y = b - CRTC.crtR13GrYCurr[3] & 511;
864: CRTC.crtRasterStamp[y ] = 0;
865: CRTC.crtRasterStamp[y + 512] = 0;
866: a >>>= 10;
867: if (a != b) {
868: y = a - CRTC.crtR13GrYCurr[2] & 511;
869: CRTC.crtRasterStamp[y ] = 0;
870: CRTC.crtRasterStamp[y + 512] = 0;
871: y = a - CRTC.crtR13GrYCurr[3] & 511;
872: CRTC.crtRasterStamp[y ] = 0;
873: CRTC.crtRasterStamp[y + 512] = 0;
874: }
875: }
876: },
877:
878:
879:
880:
881:
882:
883:
884:
885:
886:
887:
888:
889:
890:
891:
892:
893:
894:
895:
896:
897:
898:
899:
900:
901:
902:
903:
904:
905:
906:
907:
908:
909:
910:
911:
912:
913: MMD_GM2 {
914: @Override public String toString () {
915: return Multilingual.mlnJapanese ? "グラフィックス画面 (メモリモード 2)" : "Graphics Screen (memory mode 2)";
916: }
917:
918: @Override protected byte mmdPbs (int a) {
919: if ((a & 0x00080001) == 0x00000001) {
920: int i = (a >> 1) & 0x3ffff;
921: return (byte) (GraphicScreen.graM4[0x40000 + i] << 4 |
922: GraphicScreen.graM4[ i]);
923: } else {
924: return 0x00;
925: }
926: }
927: @Override protected int mmdPbz (int a) {
928: if ((a & 0x00080001) == 0x00000001) {
929: int i = (a >> 1) & 0x3ffff;
930: return (GraphicScreen.graM4[0x40000 + i] << 4 |
931: GraphicScreen.graM4[ i]);
932: } else {
933: return 0x00;
934: }
935: }
936: @Override protected int mmdPws (int a) {
937: int i = (a >> 1) & 0x3ffff;
938: if ((a & 0x00080000) == 0x00000000) {
939: return (GraphicScreen.graM4[0x40000 + i] << 4 |
940: GraphicScreen.graM4[ i]);
941: } else {
942: return (GraphicScreen.graM4[0xc0000 + i] << 4 |
943: GraphicScreen.graM4[0x80000 + i]);
944: }
945: }
946: @Override protected int mmdPwz (int a) {
947: int i = (a >> 1) & 0x3ffff;
948: if ((a & 0x00080000) == 0x00000000) {
949: return (GraphicScreen.graM4[0x40000 + i] << 4 |
950: GraphicScreen.graM4[ i]);
951: } else {
952: return (GraphicScreen.graM4[0xc0000 + i] << 4 |
953: GraphicScreen.graM4[0x80000 + i]);
954: }
955: }
956: @Override protected int mmdPls (int a) {
957: return mmdPws (a) << 16 | mmdPwz (a + 2);
958: }
959:
960: @Override protected byte mmdRbs (int a) throws M68kException {
961: XEiJ.mpuClockTime += XEiJ.busWaitTime.gvram;
962: if ((a & 0x00080001) == 0x00000001) {
963: int i = (a >> 1) & 0x3ffff;
964: return (byte) (GraphicScreen.graM4[0x40000 + i] << 4 |
965: GraphicScreen.graM4[ i]);
966: } else {
967: return 0x00;
968: }
969: }
970: @Override protected int mmdRbz (int a) throws M68kException {
971: XEiJ.mpuClockTime += XEiJ.busWaitTime.gvram;
972: if ((a & 0x00080001) == 0x00000001) {
973: int i = (a >> 1) & 0x3ffff;
974: return (GraphicScreen.graM4[0x40000 + i] << 4 |
975: GraphicScreen.graM4[ i]);
976: } else {
977: return 0x00;
978: }
979: }
980: @Override protected int mmdRws (int a) throws M68kException {
981: XEiJ.mpuClockTime += XEiJ.busWaitTime.gvram;
982: int i = (a >> 1) & 0x3ffff;
983: if ((a & 0x00080000) == 0x00000000) {
984: return (GraphicScreen.graM4[0x40000 + i] << 4 |
985: GraphicScreen.graM4[ i]);
986: } else {
987: return (GraphicScreen.graM4[0xc0000 + i] << 4 |
988: GraphicScreen.graM4[0x80000 + i]);
989: }
990: }
991: @Override protected int mmdRwz (int a) throws M68kException {
992: XEiJ.mpuClockTime += XEiJ.busWaitTime.gvram;
993: int i = (a >> 1) & 0x3ffff;
994: if ((a & 0x00080000) == 0x00000000) {
995: return (GraphicScreen.graM4[0x40000 + i] << 4 |
996: GraphicScreen.graM4[ i]);
997: } else {
998: return (GraphicScreen.graM4[0xc0000 + i] << 4 |
999: GraphicScreen.graM4[0x80000 + i]);
1000: }
1001: }
1002: @Override protected int mmdRls (int a) throws M68kException {
1003: return mmdRws (a) << 16 | mmdRwz (a + 2);
1004: }
1005:
1006: @Override protected void mmdWb (int a, int d) throws M68kException {
1007: XEiJ.mpuClockTime += XEiJ.busWaitTime.gvram;
1008: int i = (a >> 1) & 0x3ffff;
1009: if ((a & 0x00000001) == 0x00000000) {
1010: if (XEiJ.currentMPU < Model.MPU_MC68LC040) {
1011: GraphicScreen.graM4[0xc0000 + i] = (byte) ((d >> 4) & 15);
1012: GraphicScreen.graM4[0x80000 + i] = (byte) ( d & 15);
1013: } else {
1014: GraphicScreen.graM4[0xc0000 + i] = 0;
1015: GraphicScreen.graM4[0x80000 + i] = 0;
1016: }
1017: a >>>= 10;
1018: int y = a - CRTC.crtR13GrYCurr[3] & 511;
1019: CRTC.crtRasterStamp[y ] = 0;
1020: CRTC.crtRasterStamp[y + 512] = 0;
1021: y = a - CRTC.crtR13GrYCurr[2] & 511;
1022: CRTC.crtRasterStamp[y ] = 0;
1023: CRTC.crtRasterStamp[y + 512] = 0;
1024: } else {
1025: GraphicScreen.graM4[0x40000 + i] = (byte) ((d >> 4) & 15);
1026: GraphicScreen.graM4[ i] = (byte) ( d & 15);
1027: a >>>= 10;
1028: int y = a - CRTC.crtR13GrYCurr[1] & 511;
1029: CRTC.crtRasterStamp[y ] = 0;
1030: CRTC.crtRasterStamp[y + 512] = 0;
1031: y = a - CRTC.crtR13GrYCurr[0] & 511;
1032: CRTC.crtRasterStamp[y ] = 0;
1033: CRTC.crtRasterStamp[y + 512] = 0;
1034: }
1035: }
1036: @Override protected void mmdWw (int a, int d) throws M68kException {
1037: XEiJ.mpuClockTime += XEiJ.busWaitTime.gvram;
1038: int i = (a >> 1) & 0x3ffff;
1039: GraphicScreen.graM4[0xc0000 + i] = (byte) ((d >> 4) & 15);
1040: GraphicScreen.graM4[0x80000 + i] = (byte) ( d & 15);
1041: GraphicScreen.graM4[0x40000 + i] = (byte) ((d >> 4) & 15);
1042: GraphicScreen.graM4[ i] = (byte) ( d & 15);
1043: a >>>= 10;
1044: int y = a - CRTC.crtR13GrYCurr[3] & 511;
1045: CRTC.crtRasterStamp[y ] = 0;
1046: CRTC.crtRasterStamp[y + 512] = 0;
1047: y = a - CRTC.crtR13GrYCurr[2] & 511;
1048: CRTC.crtRasterStamp[y ] = 0;
1049: CRTC.crtRasterStamp[y + 512] = 0;
1050: y = a - CRTC.crtR13GrYCurr[1] & 511;
1051: CRTC.crtRasterStamp[y ] = 0;
1052: CRTC.crtRasterStamp[y + 512] = 0;
1053: y = a - CRTC.crtR13GrYCurr[0] & 511;
1054: CRTC.crtRasterStamp[y ] = 0;
1055: CRTC.crtRasterStamp[y + 512] = 0;
1056: }
1057: @Override protected void mmdWl (int a, int d) throws M68kException {
1058: mmdWw (a, d >> 16);
1059: mmdWw (a + 2, d);
1060: }
1061: },
1062:
1063:
1064:
1065:
1066:
1067:
1068:
1069:
1070:
1071:
1072:
1073:
1074:
1075:
1076:
1077:
1078:
1079: MMD_GG0 {
1080: @Override public String toString () {
1081: return Multilingual.mlnJapanese ? "グラフィックス画面 (512 ドット 65536 色)" : "Graphics Screen (512 dots 65536 colors)";
1082: }
1083:
1084: @Override protected byte mmdPbs (int a) {
1085: int i = (a >> 1) & 0x3ffff;
1086: return (byte) ((a & 1) == 0 ?
1087: GraphicScreen.graM4[0xc0000 + i] << 4 |
1088: GraphicScreen.graM4[0x80000 + i] :
1089: GraphicScreen.graM4[0x40000 + i] << 4 |
1090: GraphicScreen.graM4[ i]);
1091: }
1092: @Override protected int mmdPbz (int a) {
1093: int i = (a >> 1) & 0x3ffff;
1094: return ((a & 1) == 0 ?
1095: GraphicScreen.graM4[0xc0000 + i] << 4 |
1096: GraphicScreen.graM4[0x80000 + i] :
1097: GraphicScreen.graM4[0x40000 + i] << 4 |
1098: GraphicScreen.graM4[ i]);
1099: }
1100: @Override protected int mmdPws (int a) {
1101: int i = (a >> 1) & 0x3ffff;
1102: return (short) (GraphicScreen.graM4[0xc0000 + i] << 12 |
1103: GraphicScreen.graM4[0x80000 + i] << 8 |
1104: GraphicScreen.graM4[0x40000 + i] << 4 |
1105: GraphicScreen.graM4[ i]);
1106: }
1107: @Override protected int mmdPwz (int a) {
1108: int i = (a >> 1) & 0x3ffff;
1109: return (GraphicScreen.graM4[0xc0000 + i] << 12 |
1110: GraphicScreen.graM4[0x80000 + i] << 8 |
1111: GraphicScreen.graM4[0x40000 + i] << 4 |
1112: GraphicScreen.graM4[ i]);
1113: }
1114: @Override protected int mmdPls (int a) {
1115: int i0 = ( a >> 1) & 0x3ffff;
1116: int i1 = ((a + 2) >> 1) & 0x3ffff;
1117: return (GraphicScreen.graM4[0xc0000 + i0] << 28 |
1118: GraphicScreen.graM4[0x80000 + i0] << 24 |
1119: GraphicScreen.graM4[0x40000 + i0] << 20 |
1120: GraphicScreen.graM4[ i0] << 16 |
1121: GraphicScreen.graM4[0xc0000 + i1] << 12 |
1122: GraphicScreen.graM4[0x80000 + i1] << 8 |
1123: GraphicScreen.graM4[0x40000 + i1] << 4 |
1124: GraphicScreen.graM4[ i1]);
1125: }
1126:
1127: @Override protected byte mmdRbs (int a) throws M68kException {
1128: XEiJ.mpuClockTime += XEiJ.busWaitTime.gvram;
1129: int i = (a >> 1) & 0x3ffff;
1130: return (byte) ((a & 1) == 0 ?
1131: GraphicScreen.graM4[0xc0000 + i] << 4 |
1132: GraphicScreen.graM4[0x80000 + i] :
1133: GraphicScreen.graM4[0x40000 + i] << 4 |
1134: GraphicScreen.graM4[ i]);
1135: }
1136: @Override protected int mmdRbz (int a) throws M68kException {
1137: XEiJ.mpuClockTime += XEiJ.busWaitTime.gvram;
1138: int i = (a >> 1) & 0x3ffff;
1139: return ((a & 1) == 0 ?
1140: GraphicScreen.graM4[0xc0000 + i] << 4 |
1141: GraphicScreen.graM4[0x80000 + i] :
1142: GraphicScreen.graM4[0x40000 + i] << 4 |
1143: GraphicScreen.graM4[ i]);
1144: }
1145: @Override protected int mmdRws (int a) throws M68kException {
1146: XEiJ.mpuClockTime += XEiJ.busWaitTime.gvram;
1147: int i = (a >> 1) & 0x3ffff;
1148: return (short) (GraphicScreen.graM4[0xc0000 + i] << 12 |
1149: GraphicScreen.graM4[0x80000 + i] << 8 |
1150: GraphicScreen.graM4[0x40000 + i] << 4 |
1151: GraphicScreen.graM4[ i]);
1152: }
1153: @Override protected int mmdRwz (int a) throws M68kException {
1154: XEiJ.mpuClockTime += XEiJ.busWaitTime.gvram;
1155: int i = (a >> 1) & 0x3ffff;
1156: return (GraphicScreen.graM4[0xc0000 + i] << 12 |
1157: GraphicScreen.graM4[0x80000 + i] << 8 |
1158: GraphicScreen.graM4[0x40000 + i] << 4 |
1159: GraphicScreen.graM4[ i]);
1160: }
1161: @Override protected int mmdRls (int a) throws M68kException {
1162: XEiJ.mpuClockTime += XEiJ.busWaitTime.gvram * 2;
1163: int i0 = ( a >> 1) & 0x3ffff;
1164: int i1 = ((a + 2) >> 1) & 0x3ffff;
1165: return (GraphicScreen.graM4[0xc0000 + i0] << 28 |
1166: GraphicScreen.graM4[0x80000 + i0] << 24 |
1167: GraphicScreen.graM4[0x40000 + i0] << 20 |
1168: GraphicScreen.graM4[ i0] << 16 |
1169: GraphicScreen.graM4[0xc0000 + i1] << 12 |
1170: GraphicScreen.graM4[0x80000 + i1] << 8 |
1171: GraphicScreen.graM4[0x40000 + i1] << 4 |
1172: GraphicScreen.graM4[ i1]);
1173: }
1174:
1175: @Override protected void mmdWb (int a, int d) throws M68kException {
1176: XEiJ.mpuClockTime += XEiJ.busWaitTime.gvram;
1177: int i = (a >> 1) & 0x3ffff;
1178: if ((a & 1) == 0) {
1179: GraphicScreen.graM4[0xc0000 + i] = (byte) ((d >> 4) & 15);
1180: GraphicScreen.graM4[0x80000 + i] = (byte) ( d & 15);
1181: a >>= 10;
1182: int y = a - CRTC.crtR13GrYCurr[2] & 511;
1183: CRTC.crtRasterStamp[y ] = 0;
1184: CRTC.crtRasterStamp[y + 512] = 0;
1185: y = a - CRTC.crtR13GrYCurr[3] & 511;
1186: CRTC.crtRasterStamp[y ] = 0;
1187: CRTC.crtRasterStamp[y + 512] = 0;
1188: } else {
1189: GraphicScreen.graM4[0x40000 + i] = (byte) ((d >> 4) & 15);
1190: GraphicScreen.graM4[ i] = (byte) ( d & 15);
1191: a >>= 10;
1192: int y = a - CRTC.crtR13GrYCurr[0] & 511;
1193: CRTC.crtRasterStamp[y ] = 0;
1194: CRTC.crtRasterStamp[y + 512] = 0;
1195: y = a - CRTC.crtR13GrYCurr[1] & 511;
1196: CRTC.crtRasterStamp[y ] = 0;
1197: CRTC.crtRasterStamp[y + 512] = 0;
1198: }
1199: }
1200: @Override protected void mmdWw (int a, int d) throws M68kException {
1201: XEiJ.mpuClockTime += XEiJ.busWaitTime.gvram;
1202: int i = (a >> 1) & 0x3ffff;
1203: GraphicScreen.graM4[0xc0000 + i] = (byte) ((d >> 12) & 15);
1204: GraphicScreen.graM4[0x80000 + i] = (byte) ((d >> 8) & 15);
1205: GraphicScreen.graM4[0x40000 + i] = (byte) ((d >> 4) & 15);
1206: GraphicScreen.graM4[ i] = (byte) ( d & 15);
1207: a >>= 10;
1208: int y = a - CRTC.crtR13GrYCurr[0] & 511;
1209: CRTC.crtRasterStamp[y ] = 0;
1210: CRTC.crtRasterStamp[y + 512] = 0;
1211: y = a - CRTC.crtR13GrYCurr[1] & 511;
1212: CRTC.crtRasterStamp[y ] = 0;
1213: CRTC.crtRasterStamp[y + 512] = 0;
1214: y = a - CRTC.crtR13GrYCurr[2] & 511;
1215: CRTC.crtRasterStamp[y ] = 0;
1216: CRTC.crtRasterStamp[y + 512] = 0;
1217: y = a - CRTC.crtR13GrYCurr[3] & 511;
1218: CRTC.crtRasterStamp[y ] = 0;
1219: CRTC.crtRasterStamp[y + 512] = 0;
1220: }
1221: @Override protected void mmdWl (int a, int d) throws M68kException {
1222: XEiJ.mpuClockTime += XEiJ.busWaitTime.gvram * 2;
1223: int i0 = ( a >> 1) & 0x3ffff;
1224: int i1 = ((a + 2) >> 1) & 0x3ffff;
1225: GraphicScreen.graM4[0xc0000 + i0] = (byte) (d >>> 28);
1226: GraphicScreen.graM4[0x80000 + i0] = (byte) ((d >> 24) & 15);
1227: GraphicScreen.graM4[0x40000 + i0] = (byte) ((d >> 20) & 15);
1228: GraphicScreen.graM4[ i0] = (byte) ((d >> 16) & 15);
1229: GraphicScreen.graM4[0xc0000 + i1] = (byte) ((char) d >> 12);
1230: GraphicScreen.graM4[0x80000 + i1] = (byte) ((d >> 8) & 15);
1231: GraphicScreen.graM4[0x40000 + i1] = (byte) ((d >> 4) & 15);
1232: GraphicScreen.graM4[ i1] = (byte) ( d & 15);
1233: int b = (a + 2) >>> 10;
1234: int y = b - CRTC.crtR13GrYCurr[0] & 511;
1235: CRTC.crtRasterStamp[y ] = 0;
1236: CRTC.crtRasterStamp[y + 512] = 0;
1237: y = b - CRTC.crtR13GrYCurr[1] & 511;
1238: CRTC.crtRasterStamp[y ] = 0;
1239: CRTC.crtRasterStamp[y + 512] = 0;
1240: y = b - CRTC.crtR13GrYCurr[2] & 511;
1241: CRTC.crtRasterStamp[y ] = 0;
1242: CRTC.crtRasterStamp[y + 512] = 0;
1243: y = b - CRTC.crtR13GrYCurr[3] & 511;
1244: CRTC.crtRasterStamp[y ] = 0;
1245: CRTC.crtRasterStamp[y + 512] = 0;
1246: a >>>= 10;
1247: if (a != b) {
1248: y = a - CRTC.crtR13GrYCurr[0] & 511;
1249: CRTC.crtRasterStamp[y ] = 0;
1250: CRTC.crtRasterStamp[y + 512] = 0;
1251: y = a - CRTC.crtR13GrYCurr[1] & 511;
1252: CRTC.crtRasterStamp[y ] = 0;
1253: CRTC.crtRasterStamp[y + 512] = 0;
1254: y = a - CRTC.crtR13GrYCurr[2] & 511;
1255: CRTC.crtRasterStamp[y ] = 0;
1256: CRTC.crtRasterStamp[y + 512] = 0;
1257: y = a - CRTC.crtR13GrYCurr[3] & 511;
1258: CRTC.crtRasterStamp[y ] = 0;
1259: CRTC.crtRasterStamp[y + 512] = 0;
1260: }
1261: }
1262: },
1263:
1264:
1265:
1266:
1267:
1268:
1269:
1270:
1271:
1272:
1273: MMD_GH0 {
1274: @Override public String toString () {
1275: return Multilingual.mlnJapanese ? "グラフィックス画面 (1024 ドット 16 色)" : "Graphics Screen (1024 dots 16 colors)";
1276: }
1277:
1278: @Override protected byte mmdPbs (int a) {
1279: return ((a & 1) == 0 ? 0 :
1280: GraphicScreen.graM4[((a >> 1) & 0x801ff) | ((a << 8) & 0x40000) | ((a >> 2) & 0x3fe00)]);
1281: }
1282: @Override protected int mmdPbz (int a) {
1283: return ((a & 1) == 0 ? 0 :
1284: GraphicScreen.graM4[((a >> 1) & 0x801ff) | ((a << 8) & 0x40000) | ((a >> 2) & 0x3fe00)]);
1285: }
1286: @Override protected int mmdPws (int a) {
1287: return GraphicScreen.graM4[((a >> 1) & 0x801ff) | ((a << 8) & 0x40000) | ((a >> 2) & 0x3fe00)];
1288: }
1289: @Override protected int mmdPwz (int a) {
1290: return GraphicScreen.graM4[((a >> 1) & 0x801ff) | ((a << 8) & 0x40000) | ((a >> 2) & 0x3fe00)];
1291: }
1292: @Override protected int mmdPls (int a) {
1293: int i0 = ((a >> 1) & 0x801ff) | ((a << 8) & 0x40000) | ((a >> 2) & 0x3fe00);
1294: a += 2;
1295: int i1 = ((a >> 1) & 0x801ff) | ((a << 8) & 0x40000) | ((a >> 2) & 0x3fe00);
1296: return (GraphicScreen.graM4[i0] << 16 |
1297: GraphicScreen.graM4[i1]);
1298: }
1299:
1300: @Override protected byte mmdRbs (int a) throws M68kException {
1301: XEiJ.mpuClockTime += XEiJ.busWaitTime.gvram;
1302: return ((a & 1) == 0 ? 0 :
1303: GraphicScreen.graM4[((a >> 1) & 0x801ff) | ((a << 8) & 0x40000) | ((a >> 2) & 0x3fe00)]);
1304: }
1305: @Override protected int mmdRbz (int a) throws M68kException {
1306: XEiJ.mpuClockTime += XEiJ.busWaitTime.gvram;
1307: return ((a & 1) == 0 ? 0 :
1308: GraphicScreen.graM4[((a >> 1) & 0x801ff) | ((a << 8) & 0x40000) | ((a >> 2) & 0x3fe00)]);
1309: }
1310: @Override protected int mmdRws (int a) throws M68kException {
1311: XEiJ.mpuClockTime += XEiJ.busWaitTime.gvram;
1312: return GraphicScreen.graM4[((a >> 1) & 0x801ff) | ((a << 8) & 0x40000) | ((a >> 2) & 0x3fe00)];
1313: }
1314: @Override protected int mmdRwz (int a) throws M68kException {
1315: XEiJ.mpuClockTime += XEiJ.busWaitTime.gvram;
1316: return GraphicScreen.graM4[((a >> 1) & 0x801ff) | ((a << 8) & 0x40000) | ((a >> 2) & 0x3fe00)];
1317: }
1318: @Override protected int mmdRls (int a) throws M68kException {
1319: XEiJ.mpuClockTime += XEiJ.busWaitTime.gvram * 2;
1320: int i0 = ((a >> 1) & 0x801ff) | ((a << 8) & 0x40000) | ((a >> 2) & 0x3fe00);
1321: a += 2;
1322: int i1 = ((a >> 1) & 0x801ff) | ((a << 8) & 0x40000) | ((a >> 2) & 0x3fe00);
1323: return (GraphicScreen.graM4[i0] << 16 |
1324: GraphicScreen.graM4[i1]);
1325: }
1326:
1327: @Override protected void mmdWb (int a, int d) throws M68kException {
1328: XEiJ.mpuClockTime += XEiJ.busWaitTime.gvram;
1329: if ((a & 1) != 0) {
1330: CRTC.crtRasterStamp[(a >> 11) - CRTC.crtR13GrYCurr[0] & 1023] = 0;
1331: GraphicScreen.graM4[((a >> 1) & 0x801ff) | ((a << 8) & 0x40000) | ((a >> 2) & 0x3fe00)] = (byte) (d & 15);
1332: }
1333: }
1334: @Override protected void mmdWw (int a, int d) throws M68kException {
1335: XEiJ.mpuClockTime += XEiJ.busWaitTime.gvram;
1336: CRTC.crtRasterStamp[(a >> 11) - CRTC.crtR13GrYCurr[0] & 1023] = 0;
1337: GraphicScreen.graM4[((a >> 1) & 0x801ff) | ((a << 8) & 0x40000) | ((a >> 2) & 0x3fe00)] = (byte) (d & 15);
1338: }
1339: @Override protected void mmdWl (int a, int d) throws M68kException {
1340: XEiJ.mpuClockTime += XEiJ.busWaitTime.gvram * 2;
1341: CRTC.crtRasterStamp[(a >> 11) - CRTC.crtR13GrYCurr[0] & 1023] = 0;
1342: GraphicScreen.graM4[((a >> 1) & 0x801ff) | ((a << 8) & 0x40000) | ((a >> 2) & 0x3fe00)] = (byte) ((d >> 16) & 15);
1343: a += 2;
1344: CRTC.crtRasterStamp[(a >> 11) - CRTC.crtR13GrYCurr[0] & 1023] = 0;
1345: GraphicScreen.graM4[((a >> 1) & 0x801ff) | ((a << 8) & 0x40000) | ((a >> 2) & 0x3fe00)] = (byte) ( d & 15);
1346: }
1347: },
1348:
1349:
1350:
1351:
1352:
1353:
1354:
1355:
1356:
1357:
1358:
1359:
1360: MMD_GI0 {
1361: @Override public String toString () {
1362: return Multilingual.mlnJapanese ? "グラフィックス画面 (1024 ドット 256 色)" : "Graphics Screen (1024 dots 256 colors)";
1363: }
1364:
1365: @Override protected byte mmdPbs (int a) {
1366: int i = ((a >> 1) & 0x801ff) | ((a << 8) & 0x40000) | ((a >> 2) & 0x3fe00);
1367: return (byte) ((a & 1) == 0 ? 0 :
1368: GraphicScreen.graM4[0x100000 + i] << 4 |
1369: GraphicScreen.graM4[ i]);
1370: }
1371: @Override protected int mmdPbz (int a) {
1372: int i = ((a >> 1) & 0x801ff) | ((a << 8) & 0x40000) | ((a >> 2) & 0x3fe00);
1373: return ((a & 1) == 0 ? 0 :
1374: GraphicScreen.graM4[0x100000 + i] << 4 |
1375: GraphicScreen.graM4[ i]);
1376: }
1377: @Override protected int mmdPws (int a) {
1378: int i = ((a >> 1) & 0x801ff) | ((a << 8) & 0x40000) | ((a >> 2) & 0x3fe00);
1379: return (GraphicScreen.graM4[0x100000 + i] << 4 |
1380: GraphicScreen.graM4[ i]);
1381: }
1382: @Override protected int mmdPwz (int a) {
1383: int i = ((a >> 1) & 0x801ff) | ((a << 8) & 0x40000) | ((a >> 2) & 0x3fe00);
1384: return (GraphicScreen.graM4[0x100000 + i] << 4 |
1385: GraphicScreen.graM4[ i]);
1386: }
1387: @Override protected int mmdPls (int a) {
1388: int i0 = ((a >> 1) & 0x801ff) | ((a << 8) & 0x40000) | ((a >> 2) & 0x3fe00);
1389: a += 2;
1390: int i1 = ((a >> 1) & 0x801ff) | ((a << 8) & 0x40000) | ((a >> 2) & 0x3fe00);
1391: return (GraphicScreen.graM4[0x100000 + i0] << 20 |
1392: GraphicScreen.graM4[ i0] << 16 |
1393: GraphicScreen.graM4[0x100000 + i1] << 4 |
1394: GraphicScreen.graM4[ i1]);
1395: }
1396:
1397: @Override protected byte mmdRbs (int a) throws M68kException {
1398: XEiJ.mpuClockTime += XEiJ.busWaitTime.gvram;
1399: int i = ((a >> 1) & 0x801ff) | ((a << 8) & 0x40000) | ((a >> 2) & 0x3fe00);
1400: return (byte) ((a & 1) == 0 ? 0 :
1401: GraphicScreen.graM4[0x100000 + i] << 4 |
1402: GraphicScreen.graM4[ i]);
1403: }
1404: @Override protected int mmdRbz (int a) throws M68kException {
1405: XEiJ.mpuClockTime += XEiJ.busWaitTime.gvram;
1406: int i = ((a >> 1) & 0x801ff) | ((a << 8) & 0x40000) | ((a >> 2) & 0x3fe00);
1407: return ((a & 1) == 0 ? 0 :
1408: GraphicScreen.graM4[0x100000 + i] << 4 |
1409: GraphicScreen.graM4[ i]);
1410: }
1411: @Override protected int mmdRws (int a) throws M68kException {
1412: XEiJ.mpuClockTime += XEiJ.busWaitTime.gvram;
1413: int i = ((a >> 1) & 0x801ff) | ((a << 8) & 0x40000) | ((a >> 2) & 0x3fe00);
1414: return (GraphicScreen.graM4[0x100000 + i] << 4 |
1415: GraphicScreen.graM4[ i]);
1416: }
1417: @Override protected int mmdRwz (int a) throws M68kException {
1418: XEiJ.mpuClockTime += XEiJ.busWaitTime.gvram;
1419: int i = ((a >> 1) & 0x801ff) | ((a << 8) & 0x40000) | ((a >> 2) & 0x3fe00);
1420: return (GraphicScreen.graM4[0x100000 + i] << 4 |
1421: GraphicScreen.graM4[ i]);
1422: }
1423: @Override protected int mmdRls (int a) throws M68kException {
1424: XEiJ.mpuClockTime += XEiJ.busWaitTime.gvram * 2;
1425: int i0 = ((a >> 1) & 0x801ff) | ((a << 8) & 0x40000) | ((a >> 2) & 0x3fe00);
1426: a += 2;
1427: int i1 = ((a >> 1) & 0x801ff) | ((a << 8) & 0x40000) | ((a >> 2) & 0x3fe00);
1428: return (GraphicScreen.graM4[0x100000 + i0] << 20 |
1429: GraphicScreen.graM4[ i0] << 16 |
1430: GraphicScreen.graM4[0x100000 + i1] << 4 |
1431: GraphicScreen.graM4[ i1]);
1432: }
1433:
1434: @Override protected void mmdWb (int a, int d) throws M68kException {
1435: XEiJ.mpuClockTime += XEiJ.busWaitTime.gvram;
1436: if ((a & 1) != 0) {
1437: CRTC.crtRasterStamp[(a >> 11) - CRTC.crtR13GrYCurr[0] & 1023] = 0;
1438: int i = ((a >> 1) & 0x801ff) | ((a << 8) & 0x40000) | ((a >> 2) & 0x3fe00);
1439: GraphicScreen.graM4[0x100000 + i] = (byte) ((d >> 4) & 15);
1440: GraphicScreen.graM4[ i] = (byte) ( d & 15);
1441: }
1442: }
1443: @Override protected void mmdWw (int a, int d) throws M68kException {
1444: XEiJ.mpuClockTime += XEiJ.busWaitTime.gvram;
1445: CRTC.crtRasterStamp[(a >> 11) - CRTC.crtR13GrYCurr[0] & 1023] = 0;
1446: int i = ((a >> 1) & 0x801ff) | ((a << 8) & 0x40000) | ((a >> 2) & 0x3fe00);
1447: GraphicScreen.graM4[0x100000 + i] = (byte) ((d >> 4) & 15);
1448: GraphicScreen.graM4[ i] = (byte) ( d & 15);
1449: }
1450: @Override protected void mmdWl (int a, int d) throws M68kException {
1451: XEiJ.mpuClockTime += XEiJ.busWaitTime.gvram * 2;
1452: CRTC.crtRasterStamp[(a >> 11) - CRTC.crtR13GrYCurr[0] & 1023] = 0;
1453: int i0 = ((a >> 1) & 0x801ff) | ((a << 8) & 0x40000) | ((a >> 2) & 0x3fe00);
1454: a += 2;
1455: CRTC.crtRasterStamp[(a >> 11) - CRTC.crtR13GrYCurr[0] & 1023] = 0;
1456: int i1 = ((a >> 1) & 0x801ff) | ((a << 8) & 0x40000) | ((a >> 2) & 0x3fe00);
1457: GraphicScreen.graM4[0x100000 + i0] = (byte) ((d >> 20) & 15);
1458: GraphicScreen.graM4[ i0] = (byte) ((d >> 16) & 15);
1459: GraphicScreen.graM4[0x100000 + i1] = (byte) ((d >> 4) & 15);
1460: GraphicScreen.graM4[ i1] = (byte) ( d & 15);
1461: }
1462: },
1463:
1464:
1465:
1466:
1467:
1468:
1469:
1470:
1471:
1472:
1473:
1474:
1475:
1476:
1477:
1478:
1479:
1480: MMD_GJ0 {
1481: @Override public String toString () {
1482: return Multilingual.mlnJapanese ? "グラフィックス画面 (1024 ドット 65536 色)" : "Graphics Screen (1024 dots 65536 colors)";
1483: }
1484:
1485: @Override protected byte mmdPbs (int a) {
1486: int i = ((a >> 1) & 0x801ff) | ((a << 8) & 0x40000) | ((a >> 2) & 0x3fe00);
1487: return (byte) ((a & 1) == 0 ?
1488: GraphicScreen.graM4[0x300000 + i] << 4 |
1489: GraphicScreen.graM4[0x200000 + i] :
1490: GraphicScreen.graM4[0x100000 + i] << 4 |
1491: GraphicScreen.graM4[ i]);
1492: }
1493: @Override protected int mmdPbz (int a) {
1494: int i = ((a >> 1) & 0x801ff) | ((a << 8) & 0x40000) | ((a >> 2) & 0x3fe00);
1495: return ((a & 1) == 0 ?
1496: GraphicScreen.graM4[0x300000 + i] << 4 |
1497: GraphicScreen.graM4[0x200000 + i] :
1498: GraphicScreen.graM4[0x100000 + i] << 4 |
1499: GraphicScreen.graM4[ i]);
1500: }
1501: @Override protected int mmdPws (int a) {
1502: int i = ((a >> 1) & 0x801ff) | ((a << 8) & 0x40000) | ((a >> 2) & 0x3fe00);
1503: return (short) (GraphicScreen.graM4[0x300000 + i] << 12 |
1504: GraphicScreen.graM4[0x200000 + i] << 8 |
1505: GraphicScreen.graM4[0x100000 + i] << 4 |
1506: GraphicScreen.graM4[ i]);
1507: }
1508: @Override protected int mmdPwz (int a) {
1509: int i = ((a >> 1) & 0x801ff) | ((a << 8) & 0x40000) | ((a >> 2) & 0x3fe00);
1510: return (GraphicScreen.graM4[0x300000 + i] << 12 |
1511: GraphicScreen.graM4[0x200000 + i] << 8 |
1512: GraphicScreen.graM4[0x100000 + i] << 4 |
1513: GraphicScreen.graM4[ i]);
1514: }
1515: @Override protected int mmdPls (int a) {
1516: int i0 = ((a >> 1) & 0x801ff) | ((a << 8) & 0x40000) | ((a >> 2) & 0x3fe00);
1517: a += 2;
1518: int i1 = ((a >> 1) & 0x801ff) | ((a << 8) & 0x40000) | ((a >> 2) & 0x3fe00);
1519: return (GraphicScreen.graM4[0x300000 + i0] << 28 |
1520: GraphicScreen.graM4[0x200000 + i0] << 24 |
1521: GraphicScreen.graM4[0x100000 + i0] << 20 |
1522: GraphicScreen.graM4[ i0] << 16 |
1523: GraphicScreen.graM4[0x300000 + i1] << 12 |
1524: GraphicScreen.graM4[0x200000 + i1] << 8 |
1525: GraphicScreen.graM4[0x100000 + i1] << 4 |
1526: GraphicScreen.graM4[ i1]);
1527: }
1528:
1529: @Override protected byte mmdRbs (int a) throws M68kException {
1530: XEiJ.mpuClockTime += XEiJ.busWaitTime.gvram;
1531: int i = ((a >> 1) & 0x801ff) | ((a << 8) & 0x40000) | ((a >> 2) & 0x3fe00);
1532: return (byte) ((a & 1) == 0 ?
1533: GraphicScreen.graM4[0x300000 + i] << 4 |
1534: GraphicScreen.graM4[0x200000 + i] :
1535: GraphicScreen.graM4[0x100000 + i] << 4 |
1536: GraphicScreen.graM4[ i]);
1537: }
1538: @Override protected int mmdRbz (int a) throws M68kException {
1539: XEiJ.mpuClockTime += XEiJ.busWaitTime.gvram;
1540: int i = ((a >> 1) & 0x801ff) | ((a << 8) & 0x40000) | ((a >> 2) & 0x3fe00);
1541: return ((a & 1) == 0 ?
1542: GraphicScreen.graM4[0x300000 + i] << 4 |
1543: GraphicScreen.graM4[0x200000 + i] :
1544: GraphicScreen.graM4[0x100000 + i] << 4 |
1545: GraphicScreen.graM4[ i]);
1546: }
1547: @Override protected int mmdRws (int a) throws M68kException {
1548: XEiJ.mpuClockTime += XEiJ.busWaitTime.gvram;
1549: int i = ((a >> 1) & 0x801ff) | ((a << 8) & 0x40000) | ((a >> 2) & 0x3fe00);
1550: return (short) (GraphicScreen.graM4[0x300000 + i] << 12 |
1551: GraphicScreen.graM4[0x200000 + i] << 8 |
1552: GraphicScreen.graM4[0x100000 + i] << 4 |
1553: GraphicScreen.graM4[ i]);
1554: }
1555: @Override protected int mmdRwz (int a) throws M68kException {
1556: XEiJ.mpuClockTime += XEiJ.busWaitTime.gvram;
1557: int i = ((a >> 1) & 0x801ff) | ((a << 8) & 0x40000) | ((a >> 2) & 0x3fe00);
1558: return (GraphicScreen.graM4[0x300000 + i] << 12 |
1559: GraphicScreen.graM4[0x200000 + i] << 8 |
1560: GraphicScreen.graM4[0x100000 + i] << 4 |
1561: GraphicScreen.graM4[ i]);
1562: }
1563: @Override protected int mmdRls (int a) throws M68kException {
1564: XEiJ.mpuClockTime += XEiJ.busWaitTime.gvram * 2;
1565: int i0 = ((a >> 1) & 0x801ff) | ((a << 8) & 0x40000) | ((a >> 2) & 0x3fe00);
1566: a += 2;
1567: int i1 = ((a >> 1) & 0x801ff) | ((a << 8) & 0x40000) | ((a >> 2) & 0x3fe00);
1568: return (GraphicScreen.graM4[0x300000 + i0] << 28 |
1569: GraphicScreen.graM4[0x200000 + i0] << 24 |
1570: GraphicScreen.graM4[0x100000 + i0] << 20 |
1571: GraphicScreen.graM4[ i0] << 16 |
1572: GraphicScreen.graM4[0x300000 + i1] << 12 |
1573: GraphicScreen.graM4[0x200000 + i1] << 8 |
1574: GraphicScreen.graM4[0x100000 + i1] << 4 |
1575: GraphicScreen.graM4[ i1]);
1576: }
1577:
1578: @Override protected void mmdWb (int a, int d) throws M68kException {
1579: XEiJ.mpuClockTime += XEiJ.busWaitTime.gvram;
1580: CRTC.crtRasterStamp[(a >> 11) - CRTC.crtR13GrYCurr[0] & 1023] = 0;
1581: int i = ((a >> 1) & 0x801ff) | ((a << 8) & 0x40000) | ((a >> 2) & 0x3fe00);
1582: if ((a & 1) == 0) {
1583: GraphicScreen.graM4[0x300000 + i] = (byte) ((d >> 4) & 15);
1584: GraphicScreen.graM4[0x200000 + i] = (byte) ( d & 15);
1585: } else {
1586: GraphicScreen.graM4[0x100000 + i] = (byte) ((d >> 4) & 15);
1587: GraphicScreen.graM4[ i] = (byte) ( d & 15);
1588: }
1589: }
1590: @Override protected void mmdWw (int a, int d) throws M68kException {
1591: XEiJ.mpuClockTime += XEiJ.busWaitTime.gvram;
1592: CRTC.crtRasterStamp[(a >> 11) - CRTC.crtR13GrYCurr[0] & 1023] = 0;
1593: int i = ((a >> 1) & 0x801ff) | ((a << 8) & 0x40000) | ((a >> 2) & 0x3fe00);
1594: GraphicScreen.graM4[0x300000 + i] = (byte) ((char) d >> 12);
1595: GraphicScreen.graM4[0x200000 + i] = (byte) ((d >> 8) & 15);
1596: GraphicScreen.graM4[0x100000 + i] = (byte) ((d >> 4) & 15);
1597: GraphicScreen.graM4[ i] = (byte) ( d & 15);
1598: }
1599: @Override protected void mmdWl (int a, int d) throws M68kException {
1600: XEiJ.mpuClockTime += XEiJ.busWaitTime.gvram * 2;
1601: CRTC.crtRasterStamp[(a >> 11) - CRTC.crtR13GrYCurr[0] & 1023] = 0;
1602: int i0 = ((a >> 1) & 0x801ff) | ((a << 8) & 0x40000) | ((a >> 2) & 0x3fe00);
1603: a += 2;
1604: CRTC.crtRasterStamp[(a >> 11) - CRTC.crtR13GrYCurr[0] & 1023] = 0;
1605: int i1 = ((a >> 1) & 0x801ff) | ((a << 8) & 0x40000) | ((a >> 2) & 0x3fe00);
1606: GraphicScreen.graM4[0x300000 + i0] = (byte) (d >>> 28);
1607: GraphicScreen.graM4[0x200000 + i0] = (byte) ((d >> 24) & 15);
1608: GraphicScreen.graM4[0x100000 + i0] = (byte) ((d >> 20) & 15);
1609: GraphicScreen.graM4[ i0] = (byte) ((d >> 16) & 15);
1610: GraphicScreen.graM4[0x300000 + i1] = (byte) ((char) d >> 12);
1611: GraphicScreen.graM4[0x200000 + i1] = (byte) ((d >> 8) & 15);
1612: GraphicScreen.graM4[0x100000 + i1] = (byte) ((d >> 4) & 15);
1613: GraphicScreen.graM4[ i1] = (byte) ( d & 15);
1614: }
1615: },
1616:
1617:
1618:
1619: MMD_TXT {
1620: @Override public String toString () {
1621: return Multilingual.mlnJapanese ? "テキスト画面" : "Text Screen";
1622: }
1623:
1624: @Override protected byte mmdPbs (int a) {
1625: a &= XEiJ.BUS_MOTHER_MASK;
1626: return MainMemory.mmrM8[a];
1627: }
1628: @Override protected int mmdPbz (int a) {
1629: a &= XEiJ.BUS_MOTHER_MASK;
1630: return MainMemory.mmrM8[a] & 0xff;
1631: }
1632: @Override protected int mmdPws (int a) {
1633: a &= XEiJ.BUS_MOTHER_MASK;
1634: if (MainMemory.MMR_USE_BYTE_BUFFER) {
1635: return MainMemory.mmrBuffer.getShort (a);
1636: } else {
1637: return MainMemory.mmrM8[a] << 8 | (MainMemory.mmrM8[a + 1] & 0xff);
1638: }
1639: }
1640: @Override protected int mmdPwz (int a) {
1641: a &= XEiJ.BUS_MOTHER_MASK;
1642: if (MainMemory.MMR_USE_BYTE_BUFFER) {
1643: return MainMemory.mmrBuffer.getChar (a);
1644: } else {
1645: return (char) (MainMemory.mmrM8[a] << 8 | (MainMemory.mmrM8[a + 1] & 0xff));
1646: }
1647: }
1648: @Override protected int mmdPls (int a) {
1649: a &= XEiJ.BUS_MOTHER_MASK;
1650: if (MainMemory.MMR_USE_BYTE_BUFFER) {
1651: return MainMemory.mmrBuffer.getInt (a);
1652: } else {
1653: return MainMemory.mmrM8[a] << 24 | (MainMemory.mmrM8[a + 1] & 0xff) << 16 | (char) (MainMemory.mmrM8[a + 2] << 8 | (MainMemory.mmrM8[a + 3] & 0xff));
1654: }
1655: }
1656:
1657: @Override protected byte mmdRbs (int a) throws M68kException {
1658: XEiJ.mpuClockTime += XEiJ.busWaitTime.tvram;
1659: a &= XEiJ.BUS_MOTHER_MASK;
1660: return MainMemory.mmrM8[a];
1661: }
1662: @Override protected int mmdRbz (int a) throws M68kException {
1663: XEiJ.mpuClockTime += XEiJ.busWaitTime.tvram;
1664: a &= XEiJ.BUS_MOTHER_MASK;
1665: return MainMemory.mmrM8[a] & 0xff;
1666: }
1667: @Override protected int mmdRws (int a) throws M68kException {
1668: XEiJ.mpuClockTime += XEiJ.busWaitTime.tvram;
1669: a &= XEiJ.BUS_MOTHER_MASK;
1670: if (MainMemory.MMR_USE_BYTE_BUFFER) {
1671: return MainMemory.mmrBuffer.getShort (a);
1672: } else {
1673: return MainMemory.mmrM8[a] << 8 | (MainMemory.mmrM8[a + 1] & 0xff);
1674: }
1675: }
1676: @Override protected int mmdRwz (int a) throws M68kException {
1677: XEiJ.mpuClockTime += XEiJ.busWaitTime.tvram;
1678: a &= XEiJ.BUS_MOTHER_MASK;
1679: if (MainMemory.MMR_USE_BYTE_BUFFER) {
1680: return MainMemory.mmrBuffer.getChar (a);
1681: } else {
1682: return (char) (MainMemory.mmrM8[a] << 8 | (MainMemory.mmrM8[a + 1] & 0xff));
1683: }
1684: }
1685: @Override protected int mmdRls (int a) throws M68kException {
1686: XEiJ.mpuClockTime += XEiJ.busWaitTime.tvram * 2;
1687: a &= XEiJ.BUS_MOTHER_MASK;
1688: if (MainMemory.MMR_USE_BYTE_BUFFER) {
1689: return MainMemory.mmrBuffer.getInt (a);
1690: } else {
1691: return MainMemory.mmrM8[a] << 24 | (MainMemory.mmrM8[a + 1] & 0xff) << 16 | (char) (MainMemory.mmrM8[a + 2] << 8 | (MainMemory.mmrM8[a + 3] & 0xff));
1692: }
1693: }
1694:
1695: @Override protected void mmdWb (int a, int d) throws M68kException {
1696: XEiJ.mpuClockTime += XEiJ.busWaitTime.tvram;
1697: a &= XEiJ.BUS_MOTHER_MASK;
1698: int x;
1699: if (CRTC.crtSimAccess) {
1700: a &= 0x00e1ffff;
1701: if (CRTC.crtBitMask) {
1702: d &= ~(x = CRTC.crtR23Mask >> ((~a & 1) << 3));
1703: if (CRTC.crtSimPlane0) {
1704: MainMemory.mmrM8[a ] = (byte) (MainMemory.mmrM8[a ] & x | d);
1705: }
1706: if (CRTC.crtSimPlane1) {
1707: MainMemory.mmrM8[a + 0x00020000] = (byte) (MainMemory.mmrM8[a + 0x00020000] & x | d);
1708: }
1709: if (CRTC.crtSimPlane2) {
1710: MainMemory.mmrM8[a + 0x00040000] = (byte) (MainMemory.mmrM8[a + 0x00040000] & x | d);
1711: }
1712: if (CRTC.crtSimPlane3) {
1713: MainMemory.mmrM8[a + 0x00060000] = (byte) (MainMemory.mmrM8[a + 0x00060000] & x | d);
1714: }
1715: } else {
1716: if (CRTC.crtSimPlane0) {
1717: MainMemory.mmrM8[a ] = (byte) d;
1718: }
1719: if (CRTC.crtSimPlane1) {
1720: MainMemory.mmrM8[a + 0x00020000] = (byte) d;
1721: }
1722: if (CRTC.crtSimPlane2) {
1723: MainMemory.mmrM8[a + 0x00040000] = (byte) d;
1724: }
1725: if (CRTC.crtSimPlane3) {
1726: MainMemory.mmrM8[a + 0x00060000] = (byte) d;
1727: }
1728: }
1729: } else if (CRTC.crtBitMask) {
1730: x = CRTC.crtR23Mask >> ((~a & 1) << 3);
1731: MainMemory.mmrM8[a] = (byte) (MainMemory.mmrM8[a] & x | d & ~x);
1732: } else {
1733: MainMemory.mmrM8[a] = (byte) d;
1734: }
1735:
1736: a = ((a & 0x0001ffff) >> 7) - CRTC.crtR11TxYCurr & 1020;
1737: CRTC.crtRasterStamp[a ] = 0;
1738: CRTC.crtRasterStamp[a + 1] = 0;
1739: CRTC.crtRasterStamp[a + 2] = 0;
1740: CRTC.crtRasterStamp[a + 3] = 0;
1741: }
1742: @Override protected void mmdWw (int a, int d) throws M68kException {
1743: XEiJ.mpuClockTime += XEiJ.busWaitTime.tvram;
1744: a &= XEiJ.BUS_MOTHER_MASK;
1745: int e;
1746: int x;
1747: int y;
1748: if (CRTC.crtSimAccess) {
1749: a &= 0x00e1ffff;
1750: if (CRTC.crtBitMask) {
1751: e = d >> 8 & ~(y = (x = CRTC.crtR23Mask) >> 8);
1752: d &= ~x;
1753: if (CRTC.crtSimPlane0) {
1754: MainMemory.mmrM8[a ] = (byte) (MainMemory.mmrM8[a ] & y | e);
1755: MainMemory.mmrM8[a + 0x00000001] = (byte) (MainMemory.mmrM8[a + 0x00000001] & x | d);
1756: }
1757: if (CRTC.crtSimPlane1) {
1758: MainMemory.mmrM8[a + 0x00020000] = (byte) (MainMemory.mmrM8[a + 0x00020000] & y | e);
1759: MainMemory.mmrM8[a + 0x00020001] = (byte) (MainMemory.mmrM8[a + 0x00020001] & x | d);
1760: }
1761: if (CRTC.crtSimPlane2) {
1762: MainMemory.mmrM8[a + 0x00040000] = (byte) (MainMemory.mmrM8[a + 0x00040000] & y | e);
1763: MainMemory.mmrM8[a + 0x00040001] = (byte) (MainMemory.mmrM8[a + 0x00040001] & x | d);
1764: }
1765: if (CRTC.crtSimPlane3) {
1766: MainMemory.mmrM8[a + 0x00060000] = (byte) (MainMemory.mmrM8[a + 0x00060000] & y | e);
1767: MainMemory.mmrM8[a + 0x00060001] = (byte) (MainMemory.mmrM8[a + 0x00060001] & x | d);
1768: }
1769: } else {
1770: e = d >> 8;
1771: if (CRTC.crtSimPlane0) {
1772: MainMemory.mmrM8[a ] = (byte) e;
1773: MainMemory.mmrM8[a + 0x00000001] = (byte) d;
1774: }
1775: if (CRTC.crtSimPlane1) {
1776: MainMemory.mmrM8[a + 0x00020000] = (byte) e;
1777: MainMemory.mmrM8[a + 0x00020001] = (byte) d;
1778: }
1779: if (CRTC.crtSimPlane2) {
1780: MainMemory.mmrM8[a + 0x00040000] = (byte) e;
1781: MainMemory.mmrM8[a + 0x00040001] = (byte) d;
1782: }
1783: if (CRTC.crtSimPlane3) {
1784: MainMemory.mmrM8[a + 0x00060000] = (byte) e;
1785: MainMemory.mmrM8[a + 0x00060001] = (byte) d;
1786: }
1787: }
1788: } else if (CRTC.crtBitMask) {
1789: y = (x = CRTC.crtR23Mask) >> 8;
1790: MainMemory.mmrM8[a ] = (byte) (MainMemory.mmrM8[a ] & y | (d >> 8) & ~y);
1791: MainMemory.mmrM8[a + 1] = (byte) (MainMemory.mmrM8[a + 1] & x | d & ~x);
1792: } else {
1793: if (MainMemory.MMR_USE_BYTE_BUFFER) {
1794: MainMemory.mmrBuffer.putShort (a, (short) d);
1795: } else {
1796: MainMemory.mmrM8[a ] = (byte) (d >> 8);
1797: MainMemory.mmrM8[a + 1] = (byte) d;
1798: }
1799: }
1800:
1801: a = ((a & 0x0001ffff) >> 7) - CRTC.crtR11TxYCurr & 1020;
1802: CRTC.crtRasterStamp[a ] = 0;
1803: CRTC.crtRasterStamp[a + 1] = 0;
1804: CRTC.crtRasterStamp[a + 2] = 0;
1805: CRTC.crtRasterStamp[a + 3] = 0;
1806: }
1807: @Override protected void mmdWl (int a, int d) throws M68kException {
1808: XEiJ.mpuClockTime += XEiJ.busWaitTime.tvram * 2;
1809: a &= XEiJ.BUS_MOTHER_MASK;
1810: int e;
1811: int f;
1812: int g;
1813: int x;
1814: int y;
1815: if (CRTC.crtSimAccess) {
1816: a &= 0x00e1ffff;
1817: if (CRTC.crtBitMask) {
1818: g = d >> 24 & ~(y = (x = CRTC.crtR23Mask) >> 8);
1819: f = d >> 16 & ~x;
1820: e = d >> 8 & ~y;
1821: d &= ~x;
1822: if (CRTC.crtSimPlane0) {
1823: MainMemory.mmrM8[a ] = (byte) (MainMemory.mmrM8[a ] & y | g);
1824: MainMemory.mmrM8[a + 0x00000001] = (byte) (MainMemory.mmrM8[a + 0x00000001] & x | f);
1825: MainMemory.mmrM8[a + 0x00000002] = (byte) (MainMemory.mmrM8[a + 0x00000002] & y | e);
1826: MainMemory.mmrM8[a + 0x00000003] = (byte) (MainMemory.mmrM8[a + 0x00000003] & x | d);
1827: }
1828: if (CRTC.crtSimPlane1) {
1829: MainMemory.mmrM8[a + 0x00020000] = (byte) (MainMemory.mmrM8[a + 0x00020000] & y | g);
1830: MainMemory.mmrM8[a + 0x00020001] = (byte) (MainMemory.mmrM8[a + 0x00020001] & x | f);
1831: MainMemory.mmrM8[a + 0x00020002] = (byte) (MainMemory.mmrM8[a + 0x00020002] & y | e);
1832: MainMemory.mmrM8[a + 0x00020003] = (byte) (MainMemory.mmrM8[a + 0x00020003] & x | d);
1833: }
1834: if (CRTC.crtSimPlane2) {
1835: MainMemory.mmrM8[a + 0x00040000] = (byte) (MainMemory.mmrM8[a + 0x00040000] & y | g);
1836: MainMemory.mmrM8[a + 0x00040001] = (byte) (MainMemory.mmrM8[a + 0x00040001] & x | f);
1837: MainMemory.mmrM8[a + 0x00040002] = (byte) (MainMemory.mmrM8[a + 0x00040002] & y | e);
1838: MainMemory.mmrM8[a + 0x00040003] = (byte) (MainMemory.mmrM8[a + 0x00040003] & x | d);
1839: }
1840: if (CRTC.crtSimPlane3) {
1841: MainMemory.mmrM8[a + 0x00060000] = (byte) (MainMemory.mmrM8[a + 0x00060000] & y | g);
1842: MainMemory.mmrM8[a + 0x00060001] = (byte) (MainMemory.mmrM8[a + 0x00060001] & x | f);
1843: MainMemory.mmrM8[a + 0x00060002] = (byte) (MainMemory.mmrM8[a + 0x00060002] & y | e);
1844: MainMemory.mmrM8[a + 0x00060003] = (byte) (MainMemory.mmrM8[a + 0x00060003] & x | d);
1845: }
1846: } else {
1847: g = d >> 24;
1848: f = d >> 16;
1849: e = d >> 8;
1850: if (CRTC.crtSimPlane0) {
1851: MainMemory.mmrM8[a ] = (byte) g;
1852: MainMemory.mmrM8[a + 0x00000001] = (byte) f;
1853: MainMemory.mmrM8[a + 0x00000002] = (byte) e;
1854: MainMemory.mmrM8[a + 0x00000003] = (byte) d;
1855: }
1856: if (CRTC.crtSimPlane1) {
1857: MainMemory.mmrM8[a + 0x00020000] = (byte) g;
1858: MainMemory.mmrM8[a + 0x00020001] = (byte) f;
1859: MainMemory.mmrM8[a + 0x00020002] = (byte) e;
1860: MainMemory.mmrM8[a + 0x00020003] = (byte) d;
1861: }
1862: if (CRTC.crtSimPlane2) {
1863: MainMemory.mmrM8[a + 0x00040000] = (byte) g;
1864: MainMemory.mmrM8[a + 0x00040001] = (byte) f;
1865: MainMemory.mmrM8[a + 0x00040002] = (byte) e;
1866: MainMemory.mmrM8[a + 0x00040003] = (byte) d;
1867: }
1868: if (CRTC.crtSimPlane3) {
1869: MainMemory.mmrM8[a + 0x00060000] = (byte) g;
1870: MainMemory.mmrM8[a + 0x00060001] = (byte) f;
1871: MainMemory.mmrM8[a + 0x00060002] = (byte) e;
1872: MainMemory.mmrM8[a + 0x00060003] = (byte) d;
1873: }
1874: }
1875: } else if (CRTC.crtBitMask) {
1876: y = (x = CRTC.crtR23Mask) >> 8;
1877: MainMemory.mmrM8[a ] = (byte) (MainMemory.mmrM8[a ] & y | (d >> 24) & ~y);
1878: MainMemory.mmrM8[a + 1] = (byte) (MainMemory.mmrM8[a + 1] & x | (d >> 16) & ~x);
1879: MainMemory.mmrM8[a + 2] = (byte) (MainMemory.mmrM8[a + 1] & y | (d >> 8) & ~y);
1880: MainMemory.mmrM8[a + 3] = (byte) (MainMemory.mmrM8[a + 1] & x | d & ~x);
1881: } else {
1882: if (MainMemory.MMR_USE_BYTE_BUFFER) {
1883: MainMemory.mmrBuffer.putInt (a, d);
1884: } else {
1885: MainMemory.mmrM8[a ] = (byte) (d >> 24);
1886: MainMemory.mmrM8[a + 1] = (byte) (d >> 16);
1887: MainMemory.mmrM8[a + 2] = (byte) (d >> 8);
1888: MainMemory.mmrM8[a + 3] = (byte) d;
1889: }
1890: }
1891:
1892: int b = ((a & 0x0001ffff) >> 7) - CRTC.crtR11TxYCurr & 1020;
1893: CRTC.crtRasterStamp[b ] = 0;
1894: CRTC.crtRasterStamp[b + 1] = 0;
1895: CRTC.crtRasterStamp[b + 2] = 0;
1896: CRTC.crtRasterStamp[b + 3] = 0;
1897: a = ((a + 2 & 0x0001ffff) >> 7) - CRTC.crtR11TxYCurr & 1020;
1898: if (a != b) {
1899: CRTC.crtRasterStamp[a ] = 0;
1900: CRTC.crtRasterStamp[a + 1] = 0;
1901: CRTC.crtRasterStamp[a + 2] = 0;
1902: CRTC.crtRasterStamp[a + 3] = 0;
1903: }
1904: }
1905: },
1906:
1907:
1908:
1909:
1910:
1911:
1912:
1913:
1914:
1915:
1916:
1917:
1918:
1919: MMD_CRT {
1920: @Override public String toString () {
1921: return Multilingual.mlnJapanese ? "CRT コントローラ" : "CRT Controller";
1922: }
1923:
1924: @Override protected int mmdRbz (int a) throws M68kException {
1925: XEiJ.mpuClockTime += XEiJ.busWaitTime.crtc;
1926: int aa = a & 0x07ff;
1927: if (aa < 0x0400) {
1928: aa &= 0x003f;
1929: switch (aa) {
1930:
1931:
1932:
1933:
1934:
1935:
1936:
1937:
1938:
1939:
1940:
1941:
1942:
1943:
1944:
1945:
1946:
1947:
1948:
1949:
1950:
1951:
1952:
1953:
1954:
1955:
1956:
1957:
1958:
1959:
1960:
1961:
1962:
1963:
1964:
1965:
1966:
1967:
1968:
1969:
1970:
1971:
1972:
1973:
1974:
1975:
1976:
1977:
1978:
1979:
1980:
1981:
1982:
1983:
1984:
1985:
1986:
1987:
1988: case 0x0028:
1989: return (CRTC.crtTextStorage << 4 |
1990: CRTC.crtGraphicStorage << 3 |
1991: CRTC.crtMemoryModePort);
1992: case 0x0029:
1993: return (CRTC.crtHighResoPort << 4 |
1994: CRTC.crtVResoPort << 2 |
1995: CRTC.crtHResoPort);
1996: case 0x002a:
1997: return ((CRTC.crtBitMask ? 0b00000010 : 0) |
1998: (CRTC.crtSimAccess ? 0b00000001 : 0));
1999: case 0x002b:
2000: return ((CRTC.crtSimPlane3 ? 0b10000000 : 0) |
2001: (CRTC.crtSimPlane2 ? 0b01000000 : 0) |
2002: (CRTC.crtSimPlane1 ? 0b00100000 : 0) |
2003: (CRTC.crtSimPlane0 ? 0b00010000 : 0) |
2004: (CRTC.crtCCPlane3 ? 0b00001000 : 0) |
2005: (CRTC.crtCCPlane2 ? 0b00000100 : 0) |
2006: (CRTC.crtCCPlane1 ? 0b00000010 : 0) |
2007: (CRTC.crtCCPlane0 ? 0b00000001 : 0));
2008:
2009:
2010:
2011:
2012:
2013:
2014:
2015:
2016:
2017:
2018:
2019:
2020:
2021:
2022:
2023:
2024:
2025:
2026:
2027:
2028:
2029:
2030:
2031:
2032:
2033:
2034:
2035:
2036:
2037: default:
2038: return 0x00;
2039:
2040:
2041: }
2042: } else {
2043: aa &= 0xff;
2044: if (aa < 0x80) {
2045: return super.mmdRbz (a);
2046: } else {
2047: aa &= 0x01;
2048: if (aa == 0) {
2049: return 0;
2050: } else {
2051: return ((CRTC.crtRasterCopyOn ? 8 : 0) |
2052: (CRTC.crtClearFrames != 0 ? 2 : 0));
2053: }
2054: }
2055: }
2056: }
2057: @Override protected int mmdRwz (int a) throws M68kException {
2058: XEiJ.mpuClockTime += XEiJ.busWaitTime.crtc;
2059: int aa = a & 0x07ff;
2060: if (aa < 0x0400) {
2061: aa &= 0x003f;
2062: switch (aa) {
2063:
2064:
2065:
2066:
2067:
2068:
2069:
2070:
2071:
2072:
2073:
2074:
2075:
2076:
2077:
2078:
2079:
2080:
2081:
2082:
2083:
2084:
2085:
2086:
2087:
2088:
2089:
2090:
2091:
2092:
2093:
2094:
2095:
2096:
2097: case 0x0028:
2098: return (CRTC.crtTextStorage << 12 |
2099: CRTC.crtGraphicStorage << 11 |
2100: CRTC.crtMemoryModePort << 8 |
2101: CRTC.crtHighResoPort << 4 |
2102: CRTC.crtVResoPort << 2 |
2103: CRTC.crtHResoPort);
2104: case 0x002a:
2105: return ((CRTC.crtBitMask ? 0b00000010_00000000 : 0) |
2106: (CRTC.crtSimAccess ? 0b00000001_00000000 : 0) |
2107: (CRTC.crtSimPlane3 ? 0b00000000_10000000 : 0) |
2108: (CRTC.crtSimPlane2 ? 0b00000000_01000000 : 0) |
2109: (CRTC.crtSimPlane1 ? 0b00000000_00100000 : 0) |
2110: (CRTC.crtSimPlane0 ? 0b00000000_00010000 : 0) |
2111: (CRTC.crtCCPlane3 ? 0b00000000_00001000 : 0) |
2112: (CRTC.crtCCPlane2 ? 0b00000000_00000100 : 0) |
2113: (CRTC.crtCCPlane1 ? 0b00000000_00000010 : 0) |
2114: (CRTC.crtCCPlane0 ? 0b00000000_00000001 : 0));
2115:
2116:
2117:
2118:
2119:
2120:
2121:
2122:
2123:
2124:
2125:
2126:
2127: default:
2128: return 0x0000;
2129: }
2130: } else {
2131: aa &= 0xff;
2132: if (aa < 0x80) {
2133: return super.mmdRbz (a);
2134: } else {
2135: return ((CRTC.crtRasterCopyOn ? 8 : 0) |
2136: (CRTC.crtClearFrames != 0 ? 2 : 0));
2137: }
2138: }
2139: }
2140: @Override protected int mmdRls (int a) throws M68kException {
2141: return mmdRwz (a) << 16 | mmdRwz (a + 2);
2142: }
2143:
2144: @Override protected void mmdWb (int a, int d) throws M68kException {
2145: XEiJ.mpuClockTime += XEiJ.busWaitTime.crtc;
2146: int aa = a & 0x07ff;
2147: if (aa < 0x0400) {
2148: aa &= 0x003f;
2149: switch (aa) {
2150: case 0x0001:
2151: CRTC.crtR00HFrontEndPort = (d & 0xff) | (CRTC.crtR00Bit0Zero ? 0x00 : 0x01);
2152: {
2153: int curr = CRTC.crtR00HFrontEndMask == 0 ? CRTC.crtR00HFrontEndPort : CRTC.crtR00HFrontEndTest;
2154: if (CRTC.crtR00HFrontEndCurr != curr) {
2155: CRTC.crtR00HFrontEndCurr = curr;
2156: CRTC.crtRestart ();
2157: }
2158: }
2159: return;
2160: case 0x0003:
2161: CRTC.crtR01HSyncEndPort = d & 0xff;
2162: {
2163: int curr = CRTC.crtR01HSyncEndMask == 0 ? CRTC.crtR01HSyncEndPort : CRTC.crtR01HSyncEndTest;
2164: if (CRTC.crtR01HSyncEndCurr != curr) {
2165: CRTC.crtR01HSyncEndCurr = curr;
2166: CRTC.crtRestart ();
2167: }
2168: }
2169: return;
2170: case 0x0005:
2171: CRTC.crtR02HBackEndPort = d & 0xff;
2172: {
2173: int curr = CRTC.crtR02HBackEndMask == 0 ? CRTC.crtR02HBackEndPort : CRTC.crtR02HBackEndTest;
2174: if (CRTC.crtR02HBackEndCurr != curr) {
2175: CRTC.crtR02HBackEndCurr = curr;
2176: CRTC.crtRestart ();
2177: }
2178: }
2179: return;
2180: case 0x0007:
2181: CRTC.crtR03HDispEndPort = d & 0xff;
2182: {
2183: int curr = CRTC.crtR03HDispEndMask == 0 ? CRTC.crtR03HDispEndPort : CRTC.crtR03HDispEndTest;
2184: if (CRTC.crtR03HDispEndCurr != curr) {
2185: CRTC.crtR03HDispEndCurr = curr;
2186: CRTC.crtRestart ();
2187: }
2188: }
2189: return;
2190: case 0x0008:
2191: CRTC.crtR04VFrontEndPort = (d & (CRTC.crtVerticalMask >> 8)) << 8 | (CRTC.crtR04VFrontEndPort & 0xff);
2192: {
2193: int curr = CRTC.crtR04VFrontEndMask == 0 ? CRTC.crtR04VFrontEndPort : CRTC.crtR04VFrontEndTest;
2194: if (CRTC.crtR04VFrontEndCurr != curr) {
2195: CRTC.crtR04VFrontEndCurr = curr;
2196: if (CRTC.CRT_RASTER_HASH_ON) {
2197: CRTC.crtUpdateRasterHash ();
2198: }
2199: CRTC.crtRestart ();
2200: }
2201: }
2202: return;
2203: case 0x0009:
2204: CRTC.crtR04VFrontEndPort = (CRTC.crtR04VFrontEndPort & ~0xff) | (d & 0xff);
2205: {
2206: int curr = CRTC.crtR04VFrontEndMask == 0 ? CRTC.crtR04VFrontEndPort : CRTC.crtR04VFrontEndTest;
2207: if (CRTC.crtR04VFrontEndCurr != curr) {
2208: CRTC.crtR04VFrontEndCurr = curr;
2209: if (CRTC.CRT_RASTER_HASH_ON) {
2210: CRTC.crtUpdateRasterHash ();
2211: }
2212: CRTC.crtRestart ();
2213: }
2214: }
2215: return;
2216: case 0x000a:
2217: CRTC.crtR05VSyncEndPort = (d & (CRTC.crtVerticalMask >> 8)) << 8 | (CRTC.crtR05VSyncEndPort & 0xff);
2218: {
2219: int curr = CRTC.crtR05VSyncEndMask == 0 ? CRTC.crtR05VSyncEndPort : CRTC.crtR05VSyncEndTest;
2220: if (CRTC.crtR05VSyncEndCurr != curr) {
2221: CRTC.crtR05VSyncEndCurr = curr;
2222: CRTC.crtRestart ();
2223: }
2224: }
2225: return;
2226: case 0x000b:
2227: CRTC.crtR05VSyncEndPort = (CRTC.crtR05VSyncEndPort & ~0xff) | (d & 0xff);
2228: {
2229: int curr = CRTC.crtR05VSyncEndMask == 0 ? CRTC.crtR05VSyncEndPort : CRTC.crtR05VSyncEndTest;
2230: if (CRTC.crtR05VSyncEndCurr != curr) {
2231: CRTC.crtR05VSyncEndCurr = curr;
2232: CRTC.crtRestart ();
2233: }
2234: }
2235: return;
2236: case 0x000c:
2237: CRTC.crtR06VBackEndPort = (d & (CRTC.crtVerticalMask >> 8)) << 8 | (CRTC.crtR06VBackEndPort & 0xff);
2238: {
2239: int curr = CRTC.crtR06VBackEndMask == 0 ? CRTC.crtR06VBackEndPort : CRTC.crtR06VBackEndTest;
2240: if (CRTC.crtR06VBackEndCurr != curr) {
2241: CRTC.crtR06VBackEndCurr = curr;
2242: CRTC.crtVDispStart = curr + 1;
2243: if (CRTC.CRT_RASTER_HASH_ON) {
2244: CRTC.crtUpdateRasterHash ();
2245: }
2246: CRTC.crtRestart ();
2247: }
2248: }
2249: return;
2250: case 0x000d:
2251: CRTC.crtR06VBackEndPort = (CRTC.crtR06VBackEndPort & ~0xff) | (d & 0xff);
2252: {
2253: int curr = CRTC.crtR06VBackEndMask == 0 ? CRTC.crtR06VBackEndPort : CRTC.crtR06VBackEndTest;
2254: if (CRTC.crtR06VBackEndCurr != curr) {
2255: CRTC.crtR06VBackEndCurr = curr;
2256: CRTC.crtVDispStart = curr + 1;
2257: if (CRTC.CRT_RASTER_HASH_ON) {
2258: CRTC.crtUpdateRasterHash ();
2259: }
2260: CRTC.crtRestart ();
2261: }
2262: }
2263: return;
2264: case 0x000e:
2265: CRTC.crtR07VDispEndPort = (d & (CRTC.crtVerticalMask >> 8)) << 8 | (CRTC.crtR07VDispEndPort & 0xff);
2266: {
2267: int curr = CRTC.crtR07VDispEndMask == 0 ? CRTC.crtR07VDispEndPort : CRTC.crtR07VDispEndTest;
2268: if (CRTC.crtR07VDispEndCurr != curr) {
2269: CRTC.crtR07VDispEndCurr = curr;
2270: CRTC.crtVIdleStart = curr + 1;
2271: if (CRTC.CRT_RASTER_HASH_ON) {
2272: CRTC.crtUpdateRasterHash ();
2273: }
2274: CRTC.crtRestart ();
2275: }
2276: }
2277: return;
2278: case 0x000f:
2279: CRTC.crtR07VDispEndPort = (CRTC.crtR07VDispEndPort & ~0xff) | (d & 0xff);
2280: {
2281: int curr = CRTC.crtR07VDispEndMask == 0 ? CRTC.crtR07VDispEndPort : CRTC.crtR07VDispEndTest;
2282: if (CRTC.crtR07VDispEndCurr != curr) {
2283: CRTC.crtR07VDispEndCurr = curr;
2284: CRTC.crtVIdleStart = curr + 1;
2285: if (CRTC.CRT_RASTER_HASH_ON) {
2286: CRTC.crtUpdateRasterHash ();
2287: }
2288: CRTC.crtRestart ();
2289: }
2290: }
2291: return;
2292: case 0x0011:
2293: d &= 0xff;
2294: if (CRTC.crtR08Adjust != d) {
2295: CRTC.crtR08Adjust = d;
2296: CRTC.crtRestart ();
2297: }
2298: return;
2299: case 0x0012:
2300: CRTC.crtR09IRQRasterPort = (d & (CRTC.crtVerticalMask >> 8)) << 8 | (CRTC.crtR09IRQRasterPort & 0xff);
2301: {
2302: int curr = CRTC.crtR09IRQRasterMask == 0 ? CRTC.crtR09IRQRasterPort : CRTC.crtR09IRQRasterTest;
2303: if (CRTC.crtR09IRQRasterCurr != curr) {
2304: CRTC.crtR09IRQRasterCurr = curr;
2305: if (CRTC.CRT_RASTER_HASH_ON) {
2306: CRTC.crtUpdateRasterHash ();
2307: }
2308: if (RasterBreakPoint.RBP_ON) {
2309: RasterBreakPoint.rbpCheckIRQ ();
2310: }
2311: }
2312: }
2313: return;
2314: case 0x0013:
2315: CRTC.crtR09IRQRasterPort = (CRTC.crtR09IRQRasterPort & ~0xff) | (d & 0xff);
2316: {
2317: int curr = CRTC.crtR09IRQRasterMask == 0 ? CRTC.crtR09IRQRasterPort : CRTC.crtR09IRQRasterTest;
2318: if (CRTC.crtR09IRQRasterCurr != curr) {
2319: CRTC.crtR09IRQRasterCurr = curr;
2320: if (CRTC.CRT_RASTER_HASH_ON) {
2321: CRTC.crtUpdateRasterHash ();
2322: }
2323: if (RasterBreakPoint.RBP_ON) {
2324: RasterBreakPoint.rbpCheckIRQ ();
2325: }
2326: }
2327: }
2328: return;
2329: case 0x0014:
2330: CRTC.crtR10TxXPort = (d & 0x03) << 8 | (CRTC.crtR10TxXPort & 0xff);
2331: {
2332: int curr = CRTC.crtR10TxXMask == 0 ? CRTC.crtR10TxXPort : CRTC.crtR10TxXTest;
2333: if (CRTC.crtR10TxXCurr != curr) {
2334: CRTC.crtR10TxXCurr = curr;
2335: CRTC.crtAllStamp += 2;
2336: }
2337: }
2338: return;
2339: case 0x0015:
2340: CRTC.crtR10TxXPort = (CRTC.crtR10TxXPort & ~0xff) | (d & 0xff);
2341: {
2342: int curr = CRTC.crtR10TxXMask == 0 ? CRTC.crtR10TxXPort : CRTC.crtR10TxXTest;
2343: if (CRTC.crtR10TxXCurr != curr) {
2344: CRTC.crtR10TxXCurr = curr;
2345: CRTC.crtAllStamp += 2;
2346: }
2347: }
2348: return;
2349: case 0x0016:
2350: CRTC.crtR11TxYPort = (d & 0x03) << 8 | (CRTC.crtR11TxYPort & 0xff);
2351: {
2352: int curr = CRTC.crtR11TxYMask == 0 ? CRTC.crtR11TxYPort : CRTC.crtR11TxYTest;
2353: if (CRTC.crtR11TxYCurr != curr) {
2354: CRTC.crtR11TxYCurr = curr;
2355:
2356: }
2357: }
2358: return;
2359: case 0x0017:
2360: CRTC.crtR11TxYPort = (CRTC.crtR11TxYPort & ~0xff) | (d & 0xff);
2361: {
2362: int curr = CRTC.crtR11TxYMask == 0 ? CRTC.crtR11TxYPort : CRTC.crtR11TxYTest;
2363: if (CRTC.crtR11TxYCurr != curr) {
2364: CRTC.crtR11TxYCurr = curr;
2365:
2366: }
2367: }
2368: return;
2369: case 0x0018:
2370: case 0x001c:
2371: case 0x0020:
2372: case 0x0024:
2373: {
2374: int p = (aa - 0x0018) >> 2;
2375: CRTC.crtR12GrXPort[p] = (d & (p == 0 ? 0x03 : 0x01)) << 8 | (CRTC.crtR12GrXPort[p] & 0xff);
2376: int curr = CRTC.crtR12GrXMask[p] == 0 ? CRTC.crtR12GrXPort[p] : CRTC.crtR12GrXTest[p];
2377: if (CRTC.crtR12GrXCurr[p] != curr) {
2378: CRTC.crtR12GrXCurr[p] = curr;
2379: CRTC.crtAllStamp += 2;
2380: }
2381: }
2382: return;
2383: case 0x0019:
2384: case 0x001d:
2385: case 0x0021:
2386: case 0x0025:
2387: {
2388: int p = (aa - 0x0018) >> 2;
2389: CRTC.crtR12GrXPort[p] = (CRTC.crtR12GrXPort[p] & ~0xff) | (d & 0xff);
2390: int curr = CRTC.crtR12GrXMask[p] == 0 ? CRTC.crtR12GrXPort[p] : CRTC.crtR12GrXTest[p];
2391: if (CRTC.crtR12GrXCurr[p] != curr) {
2392: CRTC.crtR12GrXCurr[p] = curr;
2393: CRTC.crtAllStamp += 2;
2394: }
2395: }
2396: return;
2397: case 0x001a:
2398: case 0x001e:
2399: case 0x0022:
2400: case 0x0026:
2401: {
2402: int p = (aa - 0x0018) >> 2;
2403: CRTC.crtR13GrYPort[p] = (d & (p == 0 ? 0x03 : 0x01)) << 8 | (CRTC.crtR13GrYPort[p] & 0xff);
2404: int curr = CRTC.crtR13GrYMask[p] == 0 ? CRTC.crtR13GrYPort[p] : CRTC.crtR13GrYTest[p];
2405: if (CRTC.crtR13GrYCurr[p] != curr) {
2406: CRTC.crtR13GrYCurr[p] = curr;
2407:
2408: }
2409: }
2410: return;
2411: case 0x001b:
2412: case 0x001f:
2413: case 0x0023:
2414: case 0x0027:
2415: {
2416: int p = (aa - 0x0018) >> 2;
2417: CRTC.crtR13GrYPort[p] = (CRTC.crtR13GrYPort[p] & ~0xff) | (d & 0xff);
2418: int curr = CRTC.crtR13GrYMask[p] == 0 ? CRTC.crtR13GrYPort[p] : CRTC.crtR13GrYTest[p];
2419: if (CRTC.crtR13GrYCurr[p] != curr) {
2420: CRTC.crtR13GrYCurr[p] = curr;
2421:
2422: }
2423: }
2424: return;
2425: case 0x0028:
2426: CRTC.crtSetMemoryMode (d >> 4, d >> 3, d);
2427: return;
2428: case 0x0029:
2429: CRTC.crtHighResoPort = d >>> 4 & 1;
2430: CRTC.crtVResoPort = d >>> 2 & 3;
2431: CRTC.crtHResoPort = d & 3;
2432: SpriteScreen.sprAccessible = SpriteScreen.spr768x512 || (d & 0b10010) != 0b10010;
2433: int highResoCurr = CRTC.crtHighResoMask == 0 ? CRTC.crtHighResoPort : CRTC.crtHighResoTest;
2434: int vResoCurr = CRTC.crtVResoMask == 0 ? CRTC.crtVResoPort : CRTC.crtVResoTest;
2435: int hResoCurr = CRTC.crtHResoMask == 0 ? CRTC.crtHResoPort : CRTC.crtHResoTest;
2436: if (CRTC.crtHighResoCurr != highResoCurr ||
2437: CRTC.crtVResoCurr != vResoCurr ||
2438: CRTC.crtHResoCurr != hResoCurr) {
2439: CRTC.crtHighResoCurr = highResoCurr;
2440: CRTC.crtVResoCurr = vResoCurr;
2441: CRTC.crtHResoCurr = hResoCurr;
2442: CRTC.crtRestart ();
2443: }
2444: return;
2445: case 0x002a:
2446: CRTC.crtBitMask = XEiJ.TEST_BIT_1_SHIFT ? d << 31 - 1 < 0 : (d & 2) != 0;
2447: CRTC.crtSimAccess = XEiJ.TEST_BIT_0_SHIFT ? d << 31 - 0 < 0 : (d & 1) != 0;
2448: return;
2449: case 0x002b:
2450: CRTC.crtSimPlane3 = (byte) d < 0;
2451: CRTC.crtSimPlane2 = d << 25 < 0;
2452: CRTC.crtSimPlane1 = d << 26 < 0;
2453: CRTC.crtSimPlane0 = d << 27 < 0;
2454: CRTC.crtCCPlane3 = XEiJ.TEST_BIT_3_SHIFT ? d << 31 - 3 < 0 : (d & 8) != 0;
2455: CRTC.crtCCPlane2 = XEiJ.TEST_BIT_2_SHIFT ? d << 31 - 2 < 0 : (d & 4) != 0;
2456: CRTC.crtCCPlane1 = XEiJ.TEST_BIT_1_SHIFT ? d << 31 - 1 < 0 : (d & 2) != 0;
2457: CRTC.crtCCPlane0 = XEiJ.TEST_BIT_0_SHIFT ? d << 31 - 0 < 0 : (d & 1) != 0;
2458: return;
2459: case 0x002c:
2460: CRTC.crtR22SrcBlock = d & 0xff;
2461: return;
2462: case 0x002d:
2463: CRTC.crtR22DstBlock = d & 0xff;
2464: return;
2465: case 0x002e:
2466: CRTC.crtR23Mask = (d & 0xff) << 8 | (CRTC.crtR23Mask & 0xff);
2467: return;
2468: case 0x002f:
2469: CRTC.crtR23Mask = (CRTC.crtR23Mask & ~0xff) | (d & 0xff);
2470: return;
2471:
2472:
2473:
2474:
2475:
2476:
2477:
2478:
2479:
2480:
2481:
2482:
2483:
2484:
2485:
2486:
2487:
2488:
2489:
2490:
2491:
2492: default:
2493: return;
2494: }
2495: } else {
2496: aa &= 0xff;
2497: if (aa < 0x80) {
2498: super.mmdWb (a, d);
2499: } else {
2500: aa &= 0x01;
2501: if (aa == 0) {
2502: return;
2503: } else {
2504: boolean rasterCopyOn = (d & 8) != 0;
2505: if (CRTC.crtRasterCopyOn != rasterCopyOn) {
2506: CRTC.crtRasterCopyOn = rasterCopyOn;
2507: if (CRTC.CRT_RASTER_HASH_ON) {
2508: CRTC.crtUpdateRasterHash ();
2509: }
2510: }
2511: if (CRTC.crtClearFrames == 0) {
2512: CRTC.crtClearStandby = (d & 2) != 0;
2513: }
2514: return;
2515: }
2516: }
2517: }
2518: }
2519: @Override protected void mmdWw (int a, int d) throws M68kException {
2520: XEiJ.mpuClockTime += XEiJ.busWaitTime.crtc;
2521: int aa = a & 0x07ff;
2522: if (aa < 0x0400) {
2523: aa &= 0x003f;
2524: switch (aa) {
2525: case 0x0000:
2526: CRTC.crtR00HFrontEndPort = (d & 0xff) | (CRTC.crtR00Bit0Zero ? 0x00 : 0x01);
2527: {
2528: int curr = CRTC.crtR00HFrontEndMask == 0 ? CRTC.crtR00HFrontEndPort : CRTC.crtR00HFrontEndTest;
2529: if (CRTC.crtR00HFrontEndCurr != curr) {
2530: CRTC.crtR00HFrontEndCurr = curr;
2531: CRTC.crtRestart ();
2532: }
2533: }
2534: return;
2535: case 0x0002:
2536: CRTC.crtR01HSyncEndPort = d & 0xff;
2537: {
2538: int curr = CRTC.crtR01HSyncEndMask == 0 ? CRTC.crtR01HSyncEndPort : CRTC.crtR01HSyncEndTest;
2539: if (CRTC.crtR01HSyncEndCurr != curr) {
2540: CRTC.crtR01HSyncEndCurr = curr;
2541: CRTC.crtRestart ();
2542: }
2543: }
2544: return;
2545: case 0x0004:
2546: CRTC.crtR02HBackEndPort = d & 0xff;
2547: {
2548: int curr = CRTC.crtR02HBackEndMask == 0 ? CRTC.crtR02HBackEndPort : CRTC.crtR02HBackEndTest;
2549: if (CRTC.crtR02HBackEndCurr != curr) {
2550: CRTC.crtR02HBackEndCurr = curr;
2551: CRTC.crtRestart ();
2552: }
2553: }
2554: return;
2555: case 0x0006:
2556: CRTC.crtR03HDispEndPort = d & 0xff;
2557: {
2558: int curr = CRTC.crtR03HDispEndMask == 0 ? CRTC.crtR03HDispEndPort : CRTC.crtR03HDispEndTest;
2559: if (CRTC.crtR03HDispEndCurr != curr) {
2560: CRTC.crtR03HDispEndCurr = curr;
2561: CRTC.crtRestart ();
2562: }
2563: }
2564: return;
2565: case 0x0008:
2566: CRTC.crtR04VFrontEndPort = d & CRTC.crtVerticalMask;
2567: {
2568: int curr = CRTC.crtR04VFrontEndMask == 0 ? CRTC.crtR04VFrontEndPort : CRTC.crtR04VFrontEndTest;
2569: if (CRTC.crtR04VFrontEndCurr != curr) {
2570: CRTC.crtR04VFrontEndCurr = curr;
2571: if (CRTC.CRT_RASTER_HASH_ON) {
2572: CRTC.crtUpdateRasterHash ();
2573: }
2574: CRTC.crtRestart ();
2575: }
2576: }
2577: return;
2578: case 0x000a:
2579: CRTC.crtR05VSyncEndPort = d & CRTC.crtVerticalMask;
2580: {
2581: int curr = CRTC.crtR05VSyncEndMask == 0 ? CRTC.crtR05VSyncEndPort : CRTC.crtR05VSyncEndTest;
2582: if (CRTC.crtR05VSyncEndCurr != curr) {
2583: CRTC.crtR05VSyncEndCurr = curr;
2584: CRTC.crtRestart ();
2585: }
2586: }
2587: return;
2588: case 0x000c:
2589: CRTC.crtR06VBackEndPort = d & CRTC.crtVerticalMask;
2590: {
2591: int curr = CRTC.crtR06VBackEndMask == 0 ? CRTC.crtR06VBackEndPort : CRTC.crtR06VBackEndTest;
2592: if (CRTC.crtR06VBackEndCurr != curr) {
2593: CRTC.crtR06VBackEndCurr = curr;
2594: CRTC.crtVDispStart = curr + 1;
2595: if (CRTC.CRT_RASTER_HASH_ON) {
2596: CRTC.crtUpdateRasterHash ();
2597: }
2598: CRTC.crtRestart ();
2599: }
2600: }
2601: return;
2602: case 0x000e:
2603: CRTC.crtR07VDispEndPort = d & CRTC.crtVerticalMask;
2604: {
2605: int curr = CRTC.crtR07VDispEndMask == 0 ? CRTC.crtR07VDispEndPort : CRTC.crtR07VDispEndTest;
2606: if (CRTC.crtR07VDispEndCurr != curr) {
2607: CRTC.crtR07VDispEndCurr = curr;
2608: CRTC.crtVIdleStart = curr + 1;
2609: if (CRTC.CRT_RASTER_HASH_ON) {
2610: CRTC.crtUpdateRasterHash ();
2611: }
2612: CRTC.crtRestart ();
2613: }
2614: }
2615: return;
2616: case 0x0010:
2617: d &= 0xff;
2618: if (CRTC.crtR08Adjust != d) {
2619: CRTC.crtR08Adjust = d;
2620: CRTC.crtRestart ();
2621: }
2622: return;
2623: case 0x0012:
2624: CRTC.crtR09IRQRasterPort = d & CRTC.crtVerticalMask;
2625: {
2626: int curr = CRTC.crtR09IRQRasterMask == 0 ? CRTC.crtR09IRQRasterPort : CRTC.crtR09IRQRasterTest;
2627: if (CRTC.crtR09IRQRasterCurr != curr) {
2628: CRTC.crtR09IRQRasterCurr = curr;
2629: if (CRTC.CRT_RASTER_HASH_ON) {
2630: CRTC.crtUpdateRasterHash ();
2631: }
2632: if (RasterBreakPoint.RBP_ON) {
2633: RasterBreakPoint.rbpCheckIRQ ();
2634: }
2635: }
2636: }
2637: return;
2638: case 0x0014:
2639: CRTC.crtR10TxXPort = d & 0x03ff;
2640: {
2641: int curr = CRTC.crtR10TxXMask == 0 ? CRTC.crtR10TxXPort : CRTC.crtR10TxXTest;
2642: if (CRTC.crtR10TxXCurr != curr) {
2643: CRTC.crtR10TxXCurr = curr;
2644: CRTC.crtAllStamp += 2;
2645: }
2646: }
2647: return;
2648: case 0x0016:
2649: CRTC.crtR11TxYPort = d & 0x03ff;
2650: {
2651: int curr = CRTC.crtR11TxYMask == 0 ? CRTC.crtR11TxYPort : CRTC.crtR11TxYTest;
2652: if (CRTC.crtR11TxYCurr != curr) {
2653: CRTC.crtR11TxYCurr = curr;
2654:
2655: }
2656: }
2657: return;
2658: case 0x0018:
2659: case 0x001c:
2660: case 0x0020:
2661: case 0x0024:
2662: {
2663: int p = (aa - 0x0018) >> 2;
2664: CRTC.crtR12GrXPort[p] = d & (p == 0 ? 0x03ff : 0x01ff);
2665: int curr = CRTC.crtR12GrXMask[p] == 0 ? CRTC.crtR12GrXPort[p] : CRTC.crtR12GrXTest[p];
2666: if (CRTC.crtR12GrXCurr[p] != curr) {
2667: CRTC.crtR12GrXCurr[p] = curr;
2668: CRTC.crtAllStamp += 2;
2669: }
2670: }
2671: return;
2672: case 0x001a:
2673: case 0x001e:
2674: case 0x0022:
2675: case 0x0026:
2676: {
2677: int p = (aa - 0x0018) >> 2;
2678: CRTC.crtR13GrYPort[p] = d & (p == 0 ? 0x03ff : 0x01ff);
2679: int curr = CRTC.crtR13GrYMask[p] == 0 ? CRTC.crtR13GrYPort[p] : CRTC.crtR13GrYTest[p];
2680: if (CRTC.crtR13GrYCurr[p] != curr) {
2681: CRTC.crtR13GrYCurr[p] = curr;
2682:
2683: }
2684: }
2685: return;
2686: case 0x0028:
2687: CRTC.crtSetMemoryMode (d >> 12, d >> 11, d >> 8);
2688: CRTC.crtHighResoPort = d >>> 4 & 1;
2689: CRTC.crtVResoPort = d >>> 2 & 3;
2690: CRTC.crtHResoPort = d & 3;
2691: SpriteScreen.sprAccessible = SpriteScreen.spr768x512 || (d & 0b10010) != 0b10010;
2692: int highResoCurr = CRTC.crtHighResoMask == 0 ? CRTC.crtHighResoPort : CRTC.crtHighResoTest;
2693: int vResoCurr = CRTC.crtVResoMask == 0 ? CRTC.crtVResoPort : CRTC.crtVResoTest;
2694: int hResoCurr = CRTC.crtHResoMask == 0 ? CRTC.crtHResoPort : CRTC.crtHResoTest;
2695: if (CRTC.crtHighResoCurr != highResoCurr ||
2696: CRTC.crtVResoCurr != vResoCurr ||
2697: CRTC.crtHResoCurr != hResoCurr) {
2698: CRTC.crtHighResoCurr = highResoCurr;
2699: CRTC.crtVResoCurr = vResoCurr;
2700: CRTC.crtHResoCurr = hResoCurr;
2701: CRTC.crtRestart ();
2702: }
2703: return;
2704: case 0x002a:
2705: CRTC.crtBitMask = d << 22 < 0;
2706: CRTC.crtSimAccess = d << 23 < 0;
2707: CRTC.crtSimPlane3 = (byte) d < 0;
2708: CRTC.crtSimPlane2 = d << 25 < 0;
2709: CRTC.crtSimPlane1 = d << 26 < 0;
2710: CRTC.crtSimPlane0 = d << 27 < 0;
2711: CRTC.crtCCPlane3 = XEiJ.TEST_BIT_3_SHIFT ? d << 31 - 3 < 0 : (d & 8) != 0;
2712: CRTC.crtCCPlane2 = XEiJ.TEST_BIT_2_SHIFT ? d << 31 - 2 < 0 : (d & 4) != 0;
2713: CRTC.crtCCPlane1 = XEiJ.TEST_BIT_1_SHIFT ? d << 31 - 1 < 0 : (d & 2) != 0;
2714: CRTC.crtCCPlane0 = XEiJ.TEST_BIT_0_SHIFT ? d << 31 - 0 < 0 : (d & 1) != 0;
2715: return;
2716: case 0x002c:
2717: CRTC.crtR22SrcBlock = d >> 8 & 0xff;
2718: CRTC.crtR22DstBlock = d & 0xff;
2719: return;
2720: case 0x002e:
2721: CRTC.crtR23Mask = (char) d;
2722: return;
2723:
2724:
2725:
2726:
2727:
2728:
2729:
2730:
2731: default:
2732: return;
2733: }
2734: } else {
2735: aa &= 0xff;
2736: if (aa < 0x80) {
2737: super.mmdWw (a, d);
2738: } else {
2739: boolean rasterCopyOn = (d & 8) != 0;
2740: if (CRTC.crtRasterCopyOn != rasterCopyOn) {
2741: CRTC.crtRasterCopyOn = rasterCopyOn;
2742: if (CRTC.CRT_RASTER_HASH_ON) {
2743: CRTC.crtUpdateRasterHash ();
2744: }
2745: }
2746: if (CRTC.crtClearFrames == 0) {
2747: CRTC.crtClearStandby = (d & 2) != 0;
2748: }
2749: return;
2750: }
2751: }
2752: }
2753: @Override protected void mmdWl (int a, int d) throws M68kException {
2754: mmdWw (a , d >> 16);
2755: mmdWw (a + 2, d );
2756: }
2757: },
2758:
2759:
2760:
2761:
2762:
2763:
2764:
2765:
2766:
2767:
2768:
2769:
2770:
2771:
2772:
2773: MMD_VCN {
2774: @Override public String toString () {
2775: return Multilingual.mlnJapanese ? "ビデオコントローラ" : "Video Controller";
2776: }
2777:
2778: @Override protected int mmdRbz (int a) throws M68kException {
2779: int aa = a & 0x1fff;
2780: if (aa < 0x0400) {
2781: XEiJ.mpuClockTime += XEiJ.busWaitTime.palet;
2782: int d = (aa < 0x0200 ? VideoController.vcnPal16G8[aa >> 1] :
2783: VideoController.vcnPal16TSPort[(aa - 0x0200) >> 1]);
2784: return (aa & 1) == 0 ? d >> 8 : d & 0xff;
2785: } else {
2786: XEiJ.mpuClockTime += XEiJ.busWaitTime.vicon;
2787: int d = (aa < 0x0500 ? VideoController.vcnReg1Port :
2788: aa < 0x0600 ? VideoController.vcnReg2Port :
2789: aa < 0x0700 ? VideoController.vcnReg3Port :
2790: 0);
2791: return (aa & 1) == 0 ? d >> 8 : d & 0xff;
2792: }
2793: }
2794: @Override protected int mmdRwz (int a) throws M68kException {
2795: int aa = a & 0x1fff;
2796: if (aa < 0x0400) {
2797: XEiJ.mpuClockTime += XEiJ.busWaitTime.palet;
2798: return (aa < 0x0200 ? VideoController.vcnPal16G8[aa >> 1] :
2799: VideoController.vcnPal16TSPort[(aa - 0x0200) >> 1]);
2800: } else {
2801: XEiJ.mpuClockTime += XEiJ.busWaitTime.vicon;
2802: return (aa < 0x0500 ? VideoController.vcnReg1Port :
2803: aa < 0x0600 ? VideoController.vcnReg2Port :
2804: aa < 0x0700 ? VideoController.vcnReg3Port :
2805: 0);
2806: }
2807: }
2808: @Override protected int mmdRls (int a) throws M68kException {
2809: return mmdRwz (a) << 16 | mmdRwz (a + 2);
2810: }
2811:
2812: @Override protected void mmdWb (int a, int d) throws M68kException {
2813: int aa = a & 0x1fff;
2814: if (aa < 0x0200) {
2815: XEiJ.mpuClockTime += XEiJ.busWaitTime.palet;
2816: d &= 0xff;
2817: int n = aa >> 1;
2818: if ((aa & 1) == 0) {
2819: VideoController.vcnPal32G8[n] = VideoController.vcnPalTbl[
2820: VideoController.vcnPal16G8[n] = d << 8 | (VideoController.vcnPal16G8[n] & 0xff)
2821: ];
2822: if ((n & 1) == 0) {
2823: VideoController.vcnPal8G16L[n] = d;
2824: } else {
2825: VideoController.vcnPal8G16H[n - 1] = d << 8;
2826: }
2827: } else {
2828: VideoController.vcnPal32G8[n] = VideoController.vcnPalTbl[
2829: VideoController.vcnPal16G8[n] = (VideoController.vcnPal16G8[n] & ~0xff) | d
2830: ];
2831: if ((n & 1) == 0) {
2832: VideoController.vcnPal8G16L[n + 1] = d;
2833: } else {
2834: VideoController.vcnPal8G16H[n] = d << 8;
2835: }
2836: }
2837: if ((VideoController.vcnReg3Curr & 0x001f) != 0) {
2838: CRTC.crtAllStamp += 2;
2839: }
2840: } else if (aa < 0x0400) {
2841: XEiJ.mpuClockTime += XEiJ.busWaitTime.palet;
2842: d &= 0xff;
2843: int n = (aa - 0x0200) >> 1;
2844: d = ((aa & 1) == 0 ?
2845: d << 8 | (VideoController.vcnPal16TS[n] & 0xff) :
2846: (VideoController.vcnPal16TS[n] & ~0xff) | d);
2847: VideoController.vcnPal16TSPort[n] = d;
2848: if (!ScreenModeTest.smtPatternTestOn) {
2849: VideoController.vcnPal32TS[n] = VideoController.vcnPalTbl[d];
2850: if ((VideoController.vcnReg3Curr << 31 - 6 < 0 && SpriteScreen.sprReg4BgCtrlCurr << 31 - 9 < 0) ||
2851: (VideoController.vcnReg3Curr << 31 - 5 < 0 && n < 16)) {
2852: CRTC.crtAllStamp += 2;
2853: }
2854: }
2855: } else if (aa < 0x0500) {
2856: XEiJ.mpuClockTime += XEiJ.busWaitTime.vicon;
2857: d = (aa & 1) == 0 ? 0x00 : d & 0x07;
2858: if (VideoController.vcnReg1Port != d) {
2859: VideoController.vcnReg1Port = d;
2860: VideoController.vcnReg1Curr = ((VideoController.vcnReg1Port & ~VideoController.vcnReg1Mask) |
2861: (VideoController.vcnReg1Test & VideoController.vcnReg1Mask));
2862: VideoController.vcnUpdateMode ();
2863: }
2864: } else if (aa < 0x0600) {
2865: XEiJ.mpuClockTime += XEiJ.busWaitTime.vicon;
2866: d = ((aa & 1) == 0 ?
2867: (d & 0x3f) << 8 | (VideoController.vcnReg2Port & 0xff) :
2868: (VideoController.vcnReg2Port & ~0xff) | (d & 0xff));
2869: if (VideoController.vcnReg2Port != d) {
2870: VideoController.vcnReg2Port = d;
2871: VideoController.vcnReg2Curr = ((VideoController.vcnReg2Port & ~VideoController.vcnReg2Mask) |
2872: (VideoController.vcnReg2Test & VideoController.vcnReg2Mask));
2873: VideoController.vcnUpdateMode ();
2874: }
2875: } else if (aa < 0x0700) {
2876: XEiJ.mpuClockTime += XEiJ.busWaitTime.vicon;
2877: d = ((aa & 1) == 0 ?
2878: (d & 0xff) << 8 | (VideoController.vcnReg3Port & 0xff) :
2879: (VideoController.vcnReg3Port & ~0xff) | (d & 0xff));
2880: if (VideoController.vcnReg3Port != d) {
2881: VideoController.vcnReg3Port = d;
2882: VideoController.vcnReg3Curr = ((VideoController.vcnReg3Port & ~VideoController.vcnReg3Mask) |
2883: (VideoController.vcnReg3Test & VideoController.vcnReg3Mask));
2884: VideoController.vcnUpdateMode ();
2885: }
2886: } else {
2887: XEiJ.mpuClockTime += XEiJ.busWaitTime.vicon;
2888: }
2889: }
2890: @Override protected void mmdWw (int a, int d) throws M68kException {
2891: int aa = a & 0x1fff;
2892: if (aa < 0x0200) {
2893: XEiJ.mpuClockTime += XEiJ.busWaitTime.palet;
2894: int n = aa >> 1;
2895: VideoController.vcnPal32G8[n] = VideoController.vcnPalTbl[
2896: VideoController.vcnPal16G8[n] = (char) d
2897: ];
2898: if ((n & 1) == 0) {
2899: VideoController.vcnPal8G16L[n] = d >> 8 & 0xff;
2900: VideoController.vcnPal8G16L[n + 1] = d & 0xff;
2901: } else {
2902: VideoController.vcnPal8G16H[n - 1] = d & 0xff00;
2903: VideoController.vcnPal8G16H[n] = (d & 0xff) << 8;
2904: }
2905: if ((VideoController.vcnReg3Curr & 0x001f) != 0) {
2906: CRTC.crtAllStamp += 2;
2907: }
2908: } else if (aa < 0x0400) {
2909: XEiJ.mpuClockTime += XEiJ.busWaitTime.palet;
2910: int n = (aa - 0x0200) >> 1;
2911: d = (char) d;
2912: VideoController.vcnPal16TSPort[n] = d;
2913: if (!ScreenModeTest.smtPatternTestOn) {
2914: VideoController.vcnPal32TS[n] = VideoController.vcnPalTbl[d];
2915: if ((VideoController.vcnReg3Curr << 31 - 6 < 0 && SpriteScreen.sprReg4BgCtrlCurr << 31 - 9 < 0) ||
2916: (VideoController.vcnReg3Curr << 31 - 5 < 0 && n < 16)) {
2917: CRTC.crtAllStamp += 2;
2918: }
2919: }
2920: } else if (aa < 0x0500) {
2921: XEiJ.mpuClockTime += XEiJ.busWaitTime.vicon;
2922: d &= 0x0007;
2923: if (VideoController.vcnReg1Port != d) {
2924: VideoController.vcnReg1Port = d;
2925: VideoController.vcnReg1Curr = ((VideoController.vcnReg1Port & ~VideoController.vcnReg1Mask) |
2926: (VideoController.vcnReg1Test & VideoController.vcnReg1Mask));
2927: VideoController.vcnUpdateMode ();
2928: }
2929: } else if (aa < 0x0600) {
2930: XEiJ.mpuClockTime += XEiJ.busWaitTime.vicon;
2931: d &= 0x3fff;
2932: if (VideoController.vcnReg2Port != d) {
2933: VideoController.vcnReg2Port = d;
2934: VideoController.vcnReg2Curr = ((VideoController.vcnReg2Port & ~VideoController.vcnReg2Mask) |
2935: (VideoController.vcnReg2Test & VideoController.vcnReg2Mask));
2936: VideoController.vcnUpdateMode ();
2937: }
2938: } else if (aa < 0x0700) {
2939: XEiJ.mpuClockTime += XEiJ.busWaitTime.vicon;
2940: d &= 0xffff;
2941: if (VideoController.vcnReg3Port != d) {
2942: VideoController.vcnReg3Port = d;
2943: VideoController.vcnReg3Curr = ((VideoController.vcnReg3Port & ~VideoController.vcnReg3Mask) |
2944: (VideoController.vcnReg3Test & VideoController.vcnReg3Mask));
2945: VideoController.vcnUpdateMode ();
2946: }
2947: } else {
2948: XEiJ.mpuClockTime += XEiJ.busWaitTime.vicon;
2949: }
2950: }
2951: @Override protected void mmdWl (int a, int d) throws M68kException {
2952: mmdWw (a , d >> 16);
2953: mmdWw (a + 2, d );
2954: }
2955: },
2956:
2957:
2958:
2959:
2960:
2961:
2962:
2963:
2964:
2965:
2966: MMD_DMA {
2967: @Override public String toString () {
2968: return Multilingual.mlnJapanese ? "DMA コントローラ" : "DMA Controller";
2969: }
2970:
2971: @Override protected int mmdRbz (int a) throws M68kException {
2972: XEiJ.mpuClockTime += XEiJ.busWaitTime.dmac;
2973: return HD63450.dmaReadByte (a);
2974: }
2975: @Override protected int mmdRwz (int a) throws M68kException {
2976: XEiJ.mpuClockTime += XEiJ.busWaitTime.dmac;
2977: return HD63450.dmaReadWord (a);
2978: }
2979: @Override protected int mmdRls (int a) throws M68kException {
2980: XEiJ.mpuClockTime += XEiJ.busWaitTime.dmac * 2;
2981: return HD63450.dmaReadLong (a);
2982: }
2983:
2984: @Override protected void mmdWb (int a, int d) throws M68kException {
2985: XEiJ.mpuClockTime += XEiJ.busWaitTime.dmac;
2986: HD63450.dmaWriteByte (a, d);
2987: return;
2988: }
2989: @Override protected void mmdWw (int a, int d) throws M68kException {
2990: XEiJ.mpuClockTime += XEiJ.busWaitTime.dmac;
2991: HD63450.dmaWriteWord (a, d);
2992: return;
2993: }
2994: @Override protected void mmdWl (int a, int d) throws M68kException {
2995: XEiJ.mpuClockTime += XEiJ.busWaitTime.dmac * 2;
2996: HD63450.dmaWriteLong (a, d);
2997: return;
2998: }
2999: },
3000:
3001:
3002:
3003:
3004:
3005:
3006:
3007:
3008: MMD_SVS {
3009: @Override public String toString () {
3010: return Multilingual.mlnJapanese ? "スーパーバイザ領域設定" : "Supervisor Area Setting";
3011: }
3012:
3013: @Override protected void mmdWb (int a, int d) throws M68kException {
3014: if ((a & 1) == 0) {
3015: super.mmdWb (a, d);
3016: } else {
3017: XEiJ.mpuClockTime += XEiJ.busWaitTime.sysport;
3018: MainMemory.mmrSetSupervisorArea (d);
3019: }
3020: }
3021: @Override protected void mmdWw (int a, int d) throws M68kException {
3022: mmdWb (a + 1, d);
3023: }
3024: @Override protected void mmdWl (int a, int d) throws M68kException {
3025: mmdWw (a, d >> 16);
3026: mmdWw (a + 2, d);
3027: }
3028: },
3029:
3030:
3031:
3032:
3033:
3034:
3035:
3036:
3037: MMD_MFP {
3038: @Override public String toString () {
3039: return Multilingual.mlnJapanese ? "MFP" : "MFP";
3040: }
3041:
3042: @Override protected int mmdPbz (int a) {
3043: return MC68901.mfpPeekByte (a);
3044: }
3045:
3046: @Override protected int mmdRbz (int a) throws M68kException {
3047: return MC68901.mfpReadByte (a);
3048: }
3049: @Override protected int mmdRwz (int a) throws M68kException {
3050: return 0xff00 | mmdRbz (a + 1);
3051: }
3052: @Override protected int mmdRls (int a) throws M68kException {
3053: return mmdRwz (a) << 16 | mmdRwz (a + 2);
3054: }
3055:
3056: @Override protected void mmdWb (int a, int d) throws M68kException {
3057: MC68901.mfpWriteByte (a, d);
3058: }
3059: @Override protected void mmdWw (int a, int d) throws M68kException {
3060: mmdWb (a + 1, d);
3061: }
3062: @Override protected void mmdWl (int a, int d) throws M68kException {
3063: mmdWw (a, d >> 16);
3064: mmdWw (a + 2, d);
3065: }
3066: },
3067:
3068:
3069:
3070:
3071:
3072:
3073:
3074:
3075: MMD_RTC_FIRST {
3076: @Override public String toString () {
3077: return Multilingual.mlnJapanese ? "RTC" : "RTC";
3078: }
3079:
3080: @Override protected byte mmdPbs (int a) {
3081: return (byte) RP5C15.rtcPeekByte (a);
3082: }
3083: @Override protected int mmdPbz (int a) {
3084: return RP5C15.rtcPeekByte (a);
3085: }
3086: @Override protected int mmdPws (int a) {
3087: return RP5C15.rtcPeekByte (a + 1);
3088: }
3089: @Override protected int mmdPwz (int a) {
3090: return RP5C15.rtcPeekByte (a + 1);
3091: }
3092: @Override protected int mmdPls (int a) {
3093: return (RP5C15.rtcPeekByte (a + 1) << 16 |
3094: RP5C15.rtcPeekByte (a + 3));
3095: }
3096:
3097: @Override protected byte mmdRbs (int a) throws M68kException {
3098: if ((a & 1) == 0 &&
3099: !XEiJ.currentIsSecond) {
3100: return super.mmdRbs (a);
3101: }
3102: XEiJ.mpuClockTime += XEiJ.busWaitTime.rtc;
3103: XEiJ.busSuper (MemoryMappedDevice.MMD_RTC_NEXT, 0x00e8a000, 0x00e8c000);
3104: RP5C15.rtcUpdate ();
3105: return (byte) RP5C15.rtcReadByte (a);
3106: }
3107: @Override protected int mmdRbz (int a) throws M68kException {
3108: if ((a & 1) == 0 &&
3109: !XEiJ.currentIsSecond) {
3110: return super.mmdRbz (a);
3111: }
3112: XEiJ.mpuClockTime += XEiJ.busWaitTime.rtc;
3113: XEiJ.busSuper (MemoryMappedDevice.MMD_RTC_NEXT, 0x00e8a000, 0x00e8c000);
3114: RP5C15.rtcUpdate ();
3115: return RP5C15.rtcReadByte (a);
3116: }
3117: @Override protected int mmdRws (int a) throws M68kException {
3118: XEiJ.mpuClockTime += XEiJ.busWaitTime.rtc;
3119: XEiJ.busSuper (MemoryMappedDevice.MMD_RTC_NEXT, 0x00e8a000, 0x00e8c000);
3120: RP5C15.rtcUpdate ();
3121: return RP5C15.rtcReadByte (a + 1);
3122: }
3123: @Override protected int mmdRwz (int a) throws M68kException {
3124: XEiJ.mpuClockTime += XEiJ.busWaitTime.rtc;
3125: XEiJ.busSuper (MemoryMappedDevice.MMD_RTC_NEXT, 0x00e8a000, 0x00e8c000);
3126: RP5C15.rtcUpdate ();
3127: return RP5C15.rtcReadByte (a + 1);
3128: }
3129: @Override protected int mmdRls (int a) throws M68kException {
3130: XEiJ.mpuClockTime += XEiJ.busWaitTime.rtc * 2;
3131: XEiJ.busSuper (MemoryMappedDevice.MMD_RTC_NEXT, 0x00e8a000, 0x00e8c000);
3132: RP5C15.rtcUpdate ();
3133: return (RP5C15.rtcReadByte (a + 1) << 16 |
3134: RP5C15.rtcReadByte (a + 3));
3135: }
3136:
3137: @Override protected void mmdWb (int a, int d) throws M68kException {
3138: if ((a & 1) == 0 &&
3139: !XEiJ.currentIsSecond) {
3140: super.mmdWb (a, d);
3141: }
3142: XEiJ.mpuClockTime += XEiJ.busWaitTime.rtc;
3143: XEiJ.busSuper (MemoryMappedDevice.MMD_RTC_NEXT, 0x00e8a000, 0x00e8c000);
3144: RP5C15.rtcUpdate ();
3145: RP5C15.rtcWriteByte (a, d);
3146: }
3147: @Override protected void mmdWw (int a, int d) throws M68kException {
3148: XEiJ.mpuClockTime += XEiJ.busWaitTime.rtc;
3149: XEiJ.busSuper (MemoryMappedDevice.MMD_RTC_NEXT, 0x00e8a000, 0x00e8c000);
3150: RP5C15.rtcUpdate ();
3151: RP5C15.rtcWriteByte (a + 1, d);
3152: }
3153: @Override protected void mmdWl (int a, int d) throws M68kException {
3154: XEiJ.mpuClockTime += XEiJ.busWaitTime.rtc * 2;
3155: XEiJ.busSuper (MemoryMappedDevice.MMD_RTC_NEXT, 0x00e8a000, 0x00e8c000);
3156: RP5C15.rtcUpdate ();
3157: RP5C15.rtcWriteByte (a + 1, d >> 16);
3158: RP5C15.rtcWriteByte (a + 3, d);
3159: }
3160: },
3161:
3162:
3163:
3164: MMD_RTC_NEXT {
3165: @Override public String toString () {
3166: return Multilingual.mlnJapanese ? "RTC" : "RTC";
3167: }
3168:
3169: @Override protected byte mmdPbs (int a) {
3170: return (byte) RP5C15.rtcPeekByte (a);
3171: }
3172: @Override protected int mmdPbz (int a) {
3173: return RP5C15.rtcPeekByte (a);
3174: }
3175: @Override protected int mmdPws (int a) {
3176: return RP5C15.rtcPeekByte (a + 1);
3177: }
3178: @Override protected int mmdPwz (int a) {
3179: return RP5C15.rtcPeekByte (a + 1);
3180: }
3181: @Override protected int mmdPls (int a) {
3182: return (RP5C15.rtcPeekByte (a + 1) << 16 |
3183: RP5C15.rtcPeekByte (a + 3));
3184: }
3185:
3186: @Override protected byte mmdRbs (int a) throws M68kException {
3187: if ((a & 1) == 0 &&
3188: !XEiJ.currentIsSecond) {
3189: return super.mmdRbs (a);
3190: }
3191: XEiJ.mpuClockTime += XEiJ.busWaitTime.rtc;
3192: return (byte) RP5C15.rtcReadByte (a);
3193: }
3194: @Override protected int mmdRbz (int a) throws M68kException {
3195: if ((a & 1) == 0 &&
3196: !XEiJ.currentIsSecond) {
3197: return super.mmdRbz (a);
3198: }
3199: XEiJ.mpuClockTime += XEiJ.busWaitTime.rtc;
3200: return RP5C15.rtcReadByte (a);
3201: }
3202: @Override protected int mmdRws (int a) throws M68kException {
3203: XEiJ.mpuClockTime += XEiJ.busWaitTime.rtc;
3204: return RP5C15.rtcReadByte (a + 1);
3205: }
3206: @Override protected int mmdRwz (int a) throws M68kException {
3207: XEiJ.mpuClockTime += XEiJ.busWaitTime.rtc;
3208: return RP5C15.rtcReadByte (a + 1);
3209: }
3210: @Override protected int mmdRls (int a) throws M68kException {
3211: XEiJ.mpuClockTime += XEiJ.busWaitTime.rtc * 2;
3212: return (RP5C15.rtcReadByte (a + 1) << 16 |
3213: RP5C15.rtcReadByte (a + 3));
3214: }
3215:
3216: @Override protected void mmdWb (int a, int d) throws M68kException {
3217: if ((a & 1) == 0 &&
3218: !XEiJ.currentIsSecond) {
3219: super.mmdWb (a, d);
3220: }
3221: XEiJ.mpuClockTime += XEiJ.busWaitTime.rtc;
3222: RP5C15.rtcWriteByte (a, d);
3223: }
3224: @Override protected void mmdWw (int a, int d) throws M68kException {
3225: XEiJ.mpuClockTime += XEiJ.busWaitTime.rtc;
3226: RP5C15.rtcWriteByte (a + 1, d);
3227: }
3228: @Override protected void mmdWl (int a, int d) throws M68kException {
3229: XEiJ.mpuClockTime += XEiJ.busWaitTime.rtc * 2;
3230: RP5C15.rtcWriteByte (a + 1, d >> 16);
3231: RP5C15.rtcWriteByte (a + 3, d);
3232: }
3233: },
3234:
3235:
3236:
3237: MMD_RTC_TEST {
3238: @Override public String toString () {
3239: return Multilingual.mlnJapanese ? "RTC テスト" : "RTC test";
3240: }
3241:
3242: @Override protected byte mmdPbs (int a) {
3243: return (byte) RP5C15.rtcPeekByte (a);
3244: }
3245: @Override protected int mmdPbz (int a) {
3246: return RP5C15.rtcPeekByte (a);
3247: }
3248: @Override protected int mmdPws (int a) {
3249: return RP5C15.rtcPeekByte (a + 1);
3250: }
3251: @Override protected int mmdPwz (int a) {
3252: return RP5C15.rtcPeekByte (a + 1);
3253: }
3254: @Override protected int mmdPls (int a) {
3255: return (RP5C15.rtcPeekByte (a + 1) << 16 |
3256: RP5C15.rtcPeekByte (a + 3));
3257: }
3258:
3259: @Override protected byte mmdRbs (int a) throws M68kException {
3260: if ((a & 1) == 0 &&
3261: !XEiJ.currentIsSecond) {
3262: return super.mmdRbs (a);
3263: }
3264: XEiJ.mpuClockTime += XEiJ.busWaitTime.rtc;
3265: RP5C15.rtcTestUpdate ();
3266: return (byte) RP5C15.rtcReadByte (a);
3267: }
3268: @Override protected int mmdRbz (int a) throws M68kException {
3269: if ((a & 1) == 0 &&
3270: !XEiJ.currentIsSecond) {
3271: return super.mmdRbz (a);
3272: }
3273: XEiJ.mpuClockTime += XEiJ.busWaitTime.rtc;
3274: RP5C15.rtcTestUpdate ();
3275: return RP5C15.rtcReadByte (a);
3276: }
3277: @Override protected int mmdRws (int a) throws M68kException {
3278: XEiJ.mpuClockTime += XEiJ.busWaitTime.rtc;
3279: RP5C15.rtcTestUpdate ();
3280: return RP5C15.rtcReadByte (a + 1);
3281: }
3282: @Override protected int mmdRwz (int a) throws M68kException {
3283: XEiJ.mpuClockTime += XEiJ.busWaitTime.rtc;
3284: RP5C15.rtcTestUpdate ();
3285: return RP5C15.rtcReadByte (a + 1);
3286: }
3287: @Override protected int mmdRls (int a) throws M68kException {
3288: XEiJ.mpuClockTime += XEiJ.busWaitTime.rtc * 2;
3289: RP5C15.rtcTestUpdate ();
3290: return (RP5C15.rtcReadByte (a + 1) << 16 |
3291: RP5C15.rtcReadByte (a + 3));
3292: }
3293:
3294: @Override protected void mmdWb (int a, int d) throws M68kException {
3295: if ((a & 1) == 0 &&
3296: !XEiJ.currentIsSecond) {
3297: super.mmdWb (a, d);
3298: }
3299: XEiJ.mpuClockTime += XEiJ.busWaitTime.rtc;
3300: RP5C15.rtcTestUpdate ();
3301: RP5C15.rtcWriteByte (a, d);
3302: }
3303: @Override protected void mmdWw (int a, int d) throws M68kException {
3304: XEiJ.mpuClockTime += XEiJ.busWaitTime.rtc;
3305: RP5C15.rtcTestUpdate ();
3306: RP5C15.rtcWriteByte (a + 1, d);
3307: }
3308: @Override protected void mmdWl (int a, int d) throws M68kException {
3309: XEiJ.mpuClockTime += XEiJ.busWaitTime.rtc * 2;
3310: RP5C15.rtcTestUpdate ();
3311: RP5C15.rtcWriteByte (a + 1, d >> 16);
3312: RP5C15.rtcWriteByte (a + 3, d);
3313: }
3314: },
3315:
3316:
3317:
3318:
3319:
3320:
3321:
3322:
3323: MMD_PRN {
3324: @Override public String toString () {
3325: return Multilingual.mlnJapanese ? "プリンタポート" : "Printer Port";
3326: }
3327:
3328: @Override protected int mmdRbz (int a) throws M68kException {
3329: XEiJ.mpuClockTime += XEiJ.busWaitTime.prnport;
3330: a &= 3;
3331: return (a == (PrinterPort.PRN_DATA & 3) ? PrinterPort.prnReadData () :
3332: a == (PrinterPort.PRN_STROBE & 3) ? PrinterPort.prnReadStrobe () :
3333: 0xff);
3334: }
3335: @Override protected int mmdRwz (int a) throws M68kException {
3336: return 0xff00 | mmdRbz (a + 1);
3337: }
3338: @Override protected int mmdRls (int a) throws M68kException {
3339: return 0xff00ff00 | mmdRbz (a + 1) << 16 | mmdRbz (a + 3);
3340: }
3341:
3342: @Override protected void mmdWb (int a, int d) throws M68kException {
3343: XEiJ.mpuClockTime += XEiJ.busWaitTime.prnport;
3344: a &= 3;
3345: if (a == (PrinterPort.PRN_DATA & 3)) {
3346: PrinterPort.prnWriteData (d);
3347: } else if (a == (PrinterPort.PRN_STROBE & 3)) {
3348: PrinterPort.prnWriteStrobe (d);
3349: }
3350: }
3351: @Override protected void mmdWw (int a, int d) throws M68kException {
3352: mmdWb (a + 1, d);
3353: }
3354: @Override protected void mmdWl (int a, int d) throws M68kException {
3355: mmdWb (a + 1, d >> 16);
3356: mmdWb (a + 3, d);
3357: }
3358: },
3359:
3360:
3361:
3362:
3363:
3364:
3365:
3366:
3367: MMD_SYS {
3368: @Override public String toString () {
3369: return Multilingual.mlnJapanese ? "システムポート" : "System Port";
3370: }
3371:
3372: @Override protected int mmdRbz (int a) throws M68kException {
3373: XEiJ.mpuClockTime += XEiJ.busWaitTime.sysport;
3374: switch (a & 15) {
3375: case 0x01:
3376: return 0b11110000 | VideoController.vcnTargetContrastPort;
3377: case 0x03:
3378: return 0b11111000 | XEiJ.pnlStereoscopicShutter;
3379: case 0x07:
3380: return 0b11110100 | (Keyboard.kbdOn ? 8 : 0) | CRTC.crtHRLPort << 1;
3381: case 0x0b:
3382: return (XEiJ.currentModel.isX68030 () ? 0xdc :
3383: XEiJ.currentMPU < Model.MPU_MC68020 ?
3384: XEiJ.mpuClockMHz <= 10.0 ? 0xff : 0xfe :
3385: XEiJ.mpuClockMHz <= 20.0 ? 0xff : 0xfe);
3386: }
3387: return 0xff;
3388: }
3389: @Override protected int mmdRwz (int a) throws M68kException {
3390: return 0xff00 | mmdRbz (a + 1);
3391: }
3392: @Override protected int mmdRls (int a) throws M68kException {
3393: return 0xff00ff00 | mmdRbz (a + 1) << 16 | mmdRbz (a + 3);
3394: }
3395:
3396: @Override protected void mmdWb (int a, int d) throws M68kException {
3397: d &= 0xff;
3398: switch (a & 15) {
3399: case 0x01:
3400: VideoController.vcnTargetContrastPort = d & 15;
3401: {
3402: int curr = VideoController.vcnTargetContrastMask == 0 ? VideoController.vcnTargetContrastPort : VideoController.vcnTargetContrastTest;
3403: if (VideoController.vcnTargetContrastCurr != curr) {
3404: VideoController.vcnTargetContrastCurr = curr;
3405: VideoController.vcnTargetScaledContrast = VideoController.VCN_CONTRAST_SCALE * VideoController.vcnTargetContrastCurr;
3406: CRTC.crtContrastClock = XEiJ.mpuClockTime;
3407: CRTC.crtFrameTaskClock = Math.min (CRTC.crtContrastClock, CRTC.crtCaptureClock);
3408: }
3409: }
3410: return;
3411: case 0x03:
3412: XEiJ.pnlStereoscopicShutter = d & 3;
3413: break;
3414: case 0x07:
3415: {
3416: CRTC.crtHRLPort = d >> 1 & 1;
3417: int curr = CRTC.crtHRLMask == 0 ? CRTC.crtHRLPort : CRTC.crtHRLTest;
3418: if (CRTC.crtHRLCurr != curr) {
3419: CRTC.crtHRLCurr = curr;
3420: CRTC.crtRestart ();
3421: }
3422: if ((d & 1 << 2) != 0) {
3423: XEiJ.sysResetNMI ();
3424: }
3425: }
3426: return;
3427: case 0x09:
3428: if (XEiJ.currentModel.isX68030 ()) {
3429:
3430:
3431:
3432:
3433:
3434:
3435:
3436:
3437:
3438:
3439:
3440: if (XEiJ.currentModel.isX68030 ()) {
3441: XEiJ.mpuROMWaitCycles = (d >> 4 & 15) + 2;
3442: XEiJ.mpuRAMWaitCycles = (d & 15) == 0 ? 0 : (d & 15) + 2;
3443: XEiJ.mpuSetWait ();
3444: }
3445: }
3446: return;
3447: case 0x0d:
3448: SRAM.smrWriteEnableOn = d == 0x31;
3449: return;
3450: }
3451: }
3452: @Override protected void mmdWw (int a, int d) throws M68kException {
3453: mmdWb (a + 1, d);
3454: }
3455: @Override protected void mmdWl (int a, int d) throws M68kException {
3456: mmdWb (a + 1, d >> 16);
3457: mmdWb (a + 3, d);
3458: }
3459: },
3460:
3461:
3462:
3463:
3464:
3465:
3466:
3467:
3468:
3469:
3470: MMD_OPM {
3471: @Override public String toString () {
3472: return Multilingual.mlnJapanese ? "FM 音源" : "FM Sound Generator";
3473: }
3474:
3475: @Override protected int mmdRbz (int a) throws M68kException {
3476: if ((a & 1) == 0 &&
3477: !XEiJ.currentIsSecond) {
3478: return super.mmdRbz (a);
3479: }
3480: XEiJ.mpuClockTime += XEiJ.busWaitTime.opm;
3481: return (a & 3) == 3 ? OPM.opmYM2151.readStatus () : 0xff;
3482: }
3483: @Override protected int mmdRwz (int a) throws M68kException {
3484: return 0xff00 | mmdRbz (a + 1);
3485: }
3486: @Override protected int mmdRls (int a) throws M68kException {
3487: return 0xff00ff00 | mmdRbz (a + 1) << 16 | mmdRbz (a + 3);
3488: }
3489:
3490: @Override protected void mmdWb (int a, int d) throws M68kException {
3491: if ((a & 1) == 0 &&
3492: !XEiJ.currentIsSecond) {
3493: super.mmdWb (a, d);
3494: }
3495: XEiJ.mpuClockTime += XEiJ.busWaitTime.opm;
3496: a &= XEiJ.BUS_MOTHER_MASK;
3497: a &= 3;
3498: d &= 0xff;
3499: if (a == 3) {
3500: OPM.opmYM2151.generate (SoundSource.SND_CHANNELS *
3501: (OPM.OPM_BLOCK_SAMPLES - Math.max (0, (int) ((double) (SoundSource.sndBlockClock - XEiJ.mpuClockTime) /
3502: (double) OPM.OPM_SAMPLE_TIME))));
3503: OPM.opmYM2151.writeData (d);
3504: } else if (a == 1) {
3505: OPM.opmYM2151.writeAddress (d);
3506: }
3507: }
3508: @Override protected void mmdWw (int a, int d) throws M68kException {
3509: mmdWb (a + 1, d);
3510: }
3511: @Override protected void mmdWl (int a, int d) throws M68kException {
3512: mmdWb (a + 1, d >> 16);
3513: mmdWb (a + 3, d);
3514: }
3515: },
3516:
3517:
3518:
3519:
3520:
3521:
3522:
3523:
3524: MMD_PCM {
3525: @Override public String toString () {
3526: return Multilingual.mlnJapanese ? "ADPCM 音源" : "ADPCM Sound Generator";
3527: }
3528:
3529: @Override protected int mmdRbz (int a) throws M68kException {
3530: if ((a & 1) == 0 &&
3531: !XEiJ.currentIsSecond) {
3532: return super.mmdRbz (a);
3533: }
3534: XEiJ.mpuClockTime += XEiJ.busWaitTime.adpcm;
3535: return (a & 3) == 1 ? (ADPCM.pcmActive ? 0b10000000 : 0) | 0x40 : 0xff;
3536: }
3537: @Override protected int mmdRwz (int a) throws M68kException {
3538: return 0xff00 | mmdRbz (a + 1);
3539: }
3540: @Override protected int mmdRls (int a) throws M68kException {
3541: return 0xff00ff00 | mmdRbz (a + 1) << 16 | mmdRbz (a + 3);
3542: }
3543:
3544: @Override protected void mmdWb (int a, int d) throws M68kException {
3545: if ((a & 1) == 0 &&
3546: !XEiJ.currentIsSecond) {
3547: super.mmdWb (a, d);
3548: }
3549: XEiJ.mpuClockTime += XEiJ.busWaitTime.adpcm;
3550: a &= XEiJ.BUS_MOTHER_MASK;
3551: a &= 3;
3552: if (a == 1) {
3553: if ((d & 0b00000001) != 0) {
3554: if (ADPCM.pcmActive) {
3555: ADPCM.pcmClock = XEiJ.FAR_FUTURE;
3556: TickerQueue.tkqRemove (SoundSource.sndPcmTicker);
3557: ADPCM.pcmActive = false;
3558: ADPCM.pcmEncodedData = -1;
3559: ADPCM.pcmDecoderPointer = 0;
3560: HD63450.dmaRisePCL (3);
3561: HD63450.dmaRiseREQ (3);
3562: }
3563: } else if ((d & 0b00000010) != 0) {
3564: if (!ADPCM.pcmActive) {
3565:
3566: int remainingSamples = Math.max (0, (int) ((double) (SoundSource.sndBlockClock - XEiJ.mpuClockTime) / (double) ADPCM.PCM_SAMPLE_TIME));
3567: ADPCM.pcmClock = SoundSource.sndBlockClock - ADPCM.PCM_SAMPLE_TIME * (long) remainingSamples;
3568: TickerQueue.tkqAdd (SoundSource.sndPcmTicker, ADPCM.pcmClock);
3569: ADPCM.pcmActive = true;
3570: int newPointer = SoundSource.SND_CHANNELS * (ADPCM.PCM_BLOCK_SAMPLES - remainingSamples);
3571: if (ADPCM.pcmPointer < newPointer) {
3572: ADPCM.pcmFillBuffer (newPointer);
3573: } else {
3574: ADPCM.pcmPointer = newPointer;
3575: }
3576:
3577: HD63450.dmaFallPCL (3);
3578: HD63450.dmaFallREQ (3);
3579: }
3580:
3581:
3582: }
3583: } else if (a == 3) {
3584: if (ADPCM.pcmActive) {
3585: ADPCM.pcmEncodedData = d & 0xff;
3586: HD63450.dmaRisePCL (3);
3587: HD63450.dmaRiseREQ (3);
3588: }
3589: }
3590: }
3591: @Override protected void mmdWw (int a, int d) throws M68kException {
3592: mmdWb (a + 1, d);
3593: }
3594: @Override protected void mmdWl (int a, int d) throws M68kException {
3595: mmdWb (a + 1, d >> 16);
3596: mmdWb (a + 3, d);
3597: }
3598: },
3599:
3600:
3601:
3602:
3603:
3604:
3605:
3606:
3607: MMD_FDC {
3608: @Override public String toString () {
3609: return Multilingual.mlnJapanese ? "FD コントローラ" : "FD Controller";
3610: }
3611:
3612: @Override protected byte mmdPbs (int a) {
3613: return (byte) mmdPbz (a);
3614: }
3615: @Override protected int mmdPbz (int a) {
3616: a &= XEiJ.BUS_MOTHER_MASK;
3617: switch (a) {
3618: case FDC.FDC_STATUS_PORT:
3619: return FDC.fdcPeekStatus ();
3620: case FDC.FDC_DATA_PORT:
3621: return FDC.fdcPeekData ();
3622: case FDC.FDC_DRIVE_STATUS:
3623: return FDC.fdcPeekDriveStatus ();
3624: }
3625: return 0xff;
3626: }
3627: @Override protected int mmdPws (int a) {
3628: return (short) (mmdPbz (a) << 8 | mmdPbz (a + 1));
3629: }
3630: @Override protected int mmdPwz (int a) {
3631: return mmdPbz (a) << 8 | mmdPbz (a + 1);
3632: }
3633: @Override protected int mmdPls (int a) {
3634: return mmdPwz (a) << 16 | mmdPwz (a + 2);
3635: }
3636:
3637: @Override protected int mmdRbz (int a) throws M68kException {
3638: if ((a & 1) == 0 &&
3639: !XEiJ.currentIsSecond) {
3640: return super.mmdRbz (a);
3641: }
3642: XEiJ.mpuClockTime += XEiJ.busWaitTime.fdc;
3643: a &= XEiJ.BUS_MOTHER_MASK;
3644: switch (a) {
3645: case FDC.FDC_STATUS_PORT:
3646: return FDC.fdcReadStatus ();
3647: case FDC.FDC_DATA_PORT:
3648: return FDC.fdcReadData ();
3649: case FDC.FDC_DRIVE_STATUS:
3650: return FDC.fdcReadDriveStatus ();
3651: }
3652: return 0xff;
3653: }
3654: @Override protected int mmdRwz (int a) throws M68kException {
3655: return 0xff00 | mmdRbz (a + 1);
3656: }
3657: @Override protected int mmdRls (int a) throws M68kException {
3658: return 0xff00ff00 | mmdRbz (a + 1) << 16 | mmdRbz (a + 3);
3659: }
3660:
3661: @Override protected void mmdWb (int a, int d) throws M68kException {
3662: if ((a & 1) == 0 &&
3663: !XEiJ.currentIsSecond) {
3664: super.mmdWb (a, d);
3665: }
3666: XEiJ.mpuClockTime += XEiJ.busWaitTime.fdc;
3667: a &= XEiJ.BUS_MOTHER_MASK;
3668: switch (a) {
3669: case FDC.FDC_STATUS_PORT:
3670: FDC.fdcWriteCommand (d);
3671: break;
3672: case FDC.FDC_DATA_PORT:
3673: FDC.fdcWriteData (d);
3674: break;
3675: case FDC.FDC_DRIVE_STATUS:
3676: FDC.fdcWriteDriveControl (d);
3677: break;
3678: case FDC.FDC_DRIVE_SELECT:
3679: FDC.fdcWriteDriveSelect (d);
3680: break;
3681: }
3682: }
3683: @Override protected void mmdWw (int a, int d) throws M68kException {
3684: mmdWb (a + 1, d);
3685: }
3686: @Override protected void mmdWl (int a, int d) throws M68kException {
3687: mmdWb (a + 1, d >> 16);
3688: mmdWb (a + 3, d);
3689: }
3690: },
3691:
3692:
3693:
3694:
3695:
3696:
3697:
3698:
3699:
3700: MMD_HDC {
3701: @Override public String toString () {
3702: return Multilingual.mlnJapanese ? "内蔵 SASI/SCSI ポート" : "Internal SASI/SCSI Port";
3703: }
3704:
3705: @Override protected int mmdPbz (int a) {
3706: if ((a & 0x01) == 0) {
3707: return 0xff;
3708: } else {
3709: if (SPC.spcSCSIINOn) {
3710: if ((a & 0x20) == 0) {
3711: return ((a & 0x02) == 0 ? 0x00 : 0xff);
3712: } else {
3713: return SPC.spcSCSIINChip.spiPeek (a);
3714: }
3715: } else {
3716: switch (a & 0x3f) {
3717: case HDC.HDC_DATA_PORT & 0x3f:
3718: return HDC.hdcPeekData ();
3719: case HDC.HDC_STATUS_PORT & 0x3f:
3720: return HDC.hdcPeekStatus ();
3721: case HDC.HDC_RESET_PORT & 0x3f:
3722: return 0xff;
3723: case HDC.HDC_SELECTION_PORT & 0x3f:
3724: return 0xff;
3725: default:
3726: return 0xff;
3727: }
3728: }
3729: }
3730: }
3731: @Override protected int mmdPwz (int a) {
3732: return 0xff00 | mmdPbz (a + 1);
3733: }
3734: @Override protected int mmdPls (int a) {
3735: return 0xff00ff00 | mmdPbz (a + 1) << 16 | mmdPbz (a + 3);
3736: }
3737:
3738: @Override protected int mmdRbz (int a) throws M68kException {
3739: XEiJ.mpuClockTime += XEiJ.busWaitTime.hdc;
3740: if ((a & 0x01) == 0) {
3741: if (XEiJ.currentIsSecond) {
3742: return 0xff;
3743: }
3744: return super.mmdRbz (a);
3745: } else {
3746: if (SPC.spcSCSIINOn) {
3747: if ((a & 0x20) == 0) {
3748: return ((a & 0x02) == 0 ? 0x00 : 0xff);
3749: } else {
3750: return SPC.spcSCSIINChip.spiRead (a);
3751: }
3752: } else {
3753: switch (a & 0x3f) {
3754: case HDC.HDC_DATA_PORT & 0x3f:
3755: return HDC.hdcReadData ();
3756: case HDC.HDC_STATUS_PORT & 0x3f:
3757: return HDC.hdcReadStatus ();
3758: case HDC.HDC_RESET_PORT & 0x3f:
3759: return 0xff;
3760: case HDC.HDC_SELECTION_PORT & 0x3f:
3761: return 0xff;
3762: default:
3763: return 0xff;
3764: }
3765: }
3766: }
3767: }
3768: @Override protected int mmdRwz (int a) throws M68kException {
3769: return 0xff00 | mmdRbz (a + 1);
3770: }
3771: @Override protected int mmdRls (int a) throws M68kException {
3772: return 0xff00ff00 | mmdRbz (a + 1) << 16 | mmdRbz (a + 3);
3773: }
3774:
3775: @Override protected void mmdWb (int a, int d) throws M68kException {
3776: XEiJ.mpuClockTime += XEiJ.busWaitTime.hdc;
3777: if ((a & 0x01) == 0) {
3778: if (XEiJ.currentIsSecond) {
3779: return;
3780: }
3781: super.mmdWb (a, d);
3782: } else {
3783: if (SPC.spcSCSIINOn) {
3784: if ((a & 0x20) == 0) {
3785: return;
3786: } else {
3787: SPC.spcSCSIINChip.spiWrite (a, d);
3788: return;
3789: }
3790: } else {
3791: switch (a & 0x3f) {
3792: case HDC.HDC_DATA_PORT & 0x3f:
3793: HDC.hdcWriteData (d);
3794: return;
3795: case HDC.HDC_STATUS_PORT & 0x3f:
3796: HDC.hdcWriteCommand (d);
3797: return;
3798: case HDC.HDC_RESET_PORT & 0x3f:
3799: HDC.hdcWriteReset (d);
3800: return;
3801: case HDC.HDC_SELECTION_PORT & 0x3f:
3802: HDC.hdcWriteSelect (d);
3803: return;
3804: default:
3805: return;
3806: }
3807: }
3808: }
3809: }
3810: @Override protected void mmdWw (int a, int d) throws M68kException {
3811: mmdWb (a + 1, d);
3812: }
3813: @Override protected void mmdWl (int a, int d) throws M68kException {
3814: mmdWb (a + 1, d >> 16);
3815: mmdWb (a + 3, d);
3816: }
3817: },
3818:
3819:
3820:
3821:
3822:
3823:
3824:
3825:
3826: MMD_SCC {
3827: @Override public String toString () {
3828: return Multilingual.mlnJapanese ? "SCC" : "SCC";
3829: }
3830:
3831: @Override protected int mmdPbz (int a) {
3832: return Z8530.sccReadByte (a, true);
3833: }
3834: @Override protected int mmdPwz (int a) {
3835: return 0xff00 | mmdPbz (a + 1);
3836: }
3837: @Override protected int mmdPls (int a) {
3838: return 0xff00ff00 | mmdPbz (a + 1) << 16 | mmdPbz (a + 3);
3839: }
3840:
3841: @Override protected int mmdRbz (int a) throws M68kException {
3842: if ((a & 1) == 0 &&
3843: !XEiJ.currentIsSecond) {
3844: return super.mmdRbz (a);
3845: }
3846: return Z8530.sccReadByte (a, false);
3847: }
3848: @Override protected int mmdRwz (int a) throws M68kException {
3849: return 0xff00 | mmdRbz (a + 1);
3850: }
3851: @Override protected int mmdRls (int a) throws M68kException {
3852: return 0xff00ff00 | mmdRbz (a + 1) << 16 | mmdRbz (a + 3);
3853: }
3854:
3855: @Override protected void mmdWb (int a, int d) throws M68kException {
3856: if ((a & 1) == 0 &&
3857: !XEiJ.currentIsSecond) {
3858: super.mmdWb (a, d);
3859: }
3860: Z8530.sccWriteByte (a, d);
3861: }
3862: @Override protected void mmdWw (int a, int d) throws M68kException {
3863: mmdWb (a + 1, d);
3864: }
3865: @Override protected void mmdWl (int a, int d) throws M68kException {
3866: mmdWb (a + 1, d >> 16);
3867: mmdWb (a + 3, d);
3868: }
3869: },
3870:
3871:
3872:
3873:
3874:
3875:
3876:
3877:
3878: MMD_PPI {
3879: @Override public String toString () {
3880: return Multilingual.mlnJapanese ? "PPI" : "PPI";
3881: }
3882:
3883: @Override protected int mmdRbz (int a) throws M68kException {
3884: if ((a & 1) == 0 &&
3885: !XEiJ.currentIsSecond) {
3886: return super.mmdRbz (a);
3887: }
3888: XEiJ.mpuClockTime += XEiJ.busWaitTime.ppi;
3889: return PPI.ppiReadByte (a);
3890: }
3891: @Override protected int mmdRwz (int a) throws M68kException {
3892: return 0xff00 | mmdRbz (a + 1);
3893: }
3894: @Override protected int mmdRls (int a) throws M68kException {
3895: return 0xff00ff00 | mmdRbz (a + 1) << 16 | mmdRbz (a + 3);
3896: }
3897:
3898: @Override protected void mmdWb (int a, int d) throws M68kException {
3899: if ((a & 1) == 0 &&
3900: !XEiJ.currentIsSecond) {
3901: super.mmdWb (a, d);
3902: }
3903: XEiJ.mpuClockTime += XEiJ.busWaitTime.ppi;
3904: PPI.ppiWriteByte (a, d);
3905: }
3906: @Override protected void mmdWw (int a, int d) throws M68kException {
3907: mmdWb (a + 1, d);
3908: }
3909: @Override protected void mmdWl (int a, int d) throws M68kException {
3910: mmdWb (a + 1, d >> 16);
3911: mmdWb (a + 3, d);
3912: }
3913: },
3914:
3915:
3916:
3917:
3918:
3919:
3920:
3921:
3922: MMD_IOI {
3923: @Override public String toString () {
3924: return Multilingual.mlnJapanese ? "I/O 割り込み" : "I/O Interrupt";
3925: }
3926:
3927: @Override protected int mmdRbz (int a) throws M68kException {
3928: if ((a & 1) == 0 &&
3929: !XEiJ.currentIsSecond) {
3930: return super.mmdRbz (a);
3931: }
3932: XEiJ.mpuClockTime += XEiJ.busWaitTime.ioi;
3933: a &= XEiJ.BUS_MOTHER_MASK;
3934: if (a == IOInterrupt.IOI_STATUS) {
3935: return IOInterrupt.ioiReadStatus ();
3936: } else if (a == IOInterrupt.IOI_VECTOR) {
3937:
3938: return 0xff;
3939: } else {
3940: return super.mmdRbz (a);
3941: }
3942: }
3943: @Override protected int mmdRwz (int a) throws M68kException {
3944: return 0xff00 | mmdRbz (a + 1);
3945: }
3946: @Override protected int mmdRls (int a) throws M68kException {
3947: return 0xff00ff00 | mmdRbz (a + 1) << 16 | mmdRbz (a + 3);
3948: }
3949:
3950: @Override protected void mmdWb (int a, int d) throws M68kException {
3951: if ((a & 1) == 0 &&
3952: !XEiJ.currentIsSecond) {
3953: super.mmdWb (a, d);
3954: }
3955: XEiJ.mpuClockTime += XEiJ.busWaitTime.ioi;
3956: a &= XEiJ.BUS_MOTHER_MASK;
3957: if (a == IOInterrupt.IOI_STATUS) {
3958: IOInterrupt.ioiWriteEnable (d);
3959: } else if (a == IOInterrupt.IOI_VECTOR) {
3960: IOInterrupt.ioiWriteVector (d);
3961: } else {
3962: super.mmdWb (a, d);
3963: }
3964: }
3965: @Override protected void mmdWw (int a, int d) throws M68kException {
3966: mmdWb (a + 1, d);
3967: }
3968: @Override protected void mmdWl (int a, int d) throws M68kException {
3969: mmdWb (a + 1, d >> 16);
3970: mmdWb (a + 3, d);
3971: }
3972: },
3973:
3974:
3975:
3976: MMD_XB1 {
3977: @Override public String toString () {
3978: return Multilingual.mlnJapanese ? "拡張ボード領域 1" : "Expansion Board Area 1";
3979: }
3980:
3981: @Override protected int mmdPbz (int a) {
3982: if ((a & (XEiJ.BUS_MOTHER_MASK & -0x20)) == 0x00e9e000) {
3983: if ((7 & XEiJ.currentCopro1) != 0) {
3984: return XEiJ.fpuCoproboard1.cirPeekByteZero (a);
3985: } else {
3986: return 0xff;
3987: }
3988: }
3989: if ((a & (XEiJ.BUS_MOTHER_MASK & -0x20)) == 0x00e9e080) {
3990: if ((7 & XEiJ.currentCopro2) != 0) {
3991: return XEiJ.fpuCoproboard2.cirPeekByteZero (a);
3992: } else {
3993: return 0xff;
3994: }
3995: }
3996: if ((a & (XEiJ.BUS_MOTHER_MASK & -HFS.HFS_ROM_SIZE)) == HFS.HFS_ADDRESS) {
3997: a &= XEiJ.BUS_MOTHER_MASK;
3998: return MainMemory.mmrM8[a] & 0xff;
3999: }
4000: if (Keyboard.KBD_ZKEY_ON &&
4001: (a & (XEiJ.BUS_MOTHER_MASK & -Keyboard.KBD_ZKEY_IO_SIZE)) == Keyboard.KBD_ZKEY_IO_ADDRESS) {
4002: return Keyboard.kbdZKeyIOReadByte (a);
4003: }
4004: return 0xff;
4005: }
4006: @Override protected int mmdPwz (int a) {
4007: if ((a & (XEiJ.BUS_MOTHER_MASK & -0x20)) == 0x00e9e000) {
4008: if ((7 & XEiJ.currentCopro1) != 0) {
4009: return XEiJ.fpuCoproboard1.cirPeekWordZero (a);
4010: } else {
4011: return 0xffff;
4012: }
4013: }
4014: if ((a & (XEiJ.BUS_MOTHER_MASK & -0x20)) == 0x00e9e080) {
4015: if ((7 & XEiJ.currentCopro2) != 0) {
4016: return XEiJ.fpuCoproboard2.cirPeekWordZero (a);
4017: } else {
4018: return 0xffff;
4019: }
4020: }
4021: if ((a & (XEiJ.BUS_MOTHER_MASK & -HFS.HFS_ROM_SIZE)) == HFS.HFS_ADDRESS) {
4022: a &= XEiJ.BUS_MOTHER_MASK;
4023: return (char) (MainMemory.mmrM8[a] << 8 | (MainMemory.mmrM8[a + 1] & 0xff));
4024: }
4025: if (Keyboard.KBD_ZKEY_ON &&
4026: (a & (XEiJ.BUS_MOTHER_MASK & -Keyboard.KBD_ZKEY_IO_SIZE)) == Keyboard.KBD_ZKEY_IO_ADDRESS) {
4027: return Keyboard.kbdZKeyIOReadWord (a);
4028: }
4029: return 0xffff;
4030: }
4031: @Override protected int mmdPls (int a) {
4032: if ((a & (XEiJ.BUS_MOTHER_MASK & -0x20)) == 0x00e9e000) {
4033: if ((7 & XEiJ.currentCopro1) != 0) {
4034: return XEiJ.fpuCoproboard1.cirPeekLong (a);
4035: } else {
4036: return -1;
4037: }
4038: }
4039: if ((a & (XEiJ.BUS_MOTHER_MASK & -0x20)) == 0x00e9e080) {
4040: if ((7 & XEiJ.currentCopro2) != 0) {
4041: return XEiJ.fpuCoproboard2.cirPeekLong (a);
4042: } else {
4043: return -1;
4044: }
4045: }
4046: if ((a & (XEiJ.BUS_MOTHER_MASK & -HFS.HFS_ROM_SIZE)) == HFS.HFS_ADDRESS) {
4047: a &= XEiJ.BUS_MOTHER_MASK;
4048: return MainMemory.mmrM8[a] << 24 | (MainMemory.mmrM8[a + 1] & 0xff) << 16 | (char) (MainMemory.mmrM8[a + 2] << 8 | (MainMemory.mmrM8[a + 3] & 0xff));
4049: }
4050: if (Keyboard.KBD_ZKEY_ON &&
4051: (a & (XEiJ.BUS_MOTHER_MASK & -Keyboard.KBD_ZKEY_IO_SIZE)) == Keyboard.KBD_ZKEY_IO_ADDRESS) {
4052: return Keyboard.kbdZKeyIOReadLong (a);
4053: }
4054: return -1;
4055: }
4056:
4057: @Override protected int mmdRbz (int a) throws M68kException {
4058: if ((a & (XEiJ.BUS_MOTHER_MASK & -0x20)) == 0x00e9e000) {
4059: if ((7 & XEiJ.currentCopro1) != 0) {
4060: return XEiJ.fpuCoproboard1.cirReadByteZero (a);
4061: } else {
4062: return super.mmdRbz (a);
4063: }
4064: }
4065: if ((a & (XEiJ.BUS_MOTHER_MASK & -0x20)) == 0x00e9e080) {
4066: if ((7 & XEiJ.currentCopro2) != 0) {
4067: return XEiJ.fpuCoproboard2.cirReadByteZero (a);
4068: } else {
4069: return super.mmdRbz (a);
4070: }
4071: }
4072: if ((a & (XEiJ.BUS_MOTHER_MASK & -HFS.HFS_ROM_SIZE)) == HFS.HFS_ADDRESS) {
4073: a &= XEiJ.BUS_MOTHER_MASK;
4074: return MainMemory.mmrM8[a] & 0xff;
4075: }
4076: if (Keyboard.KBD_ZKEY_ON &&
4077: (a & (XEiJ.BUS_MOTHER_MASK & -Keyboard.KBD_ZKEY_IO_SIZE)) == Keyboard.KBD_ZKEY_IO_ADDRESS) {
4078: return Keyboard.kbdZKeyIOReadByte (a);
4079: }
4080: return super.mmdRbz (a);
4081: }
4082: @Override protected int mmdRwz (int a) throws M68kException {
4083: if ((a & (XEiJ.BUS_MOTHER_MASK & -0x20)) == 0x00e9e000) {
4084: if ((7 & XEiJ.currentCopro1) != 0) {
4085: return XEiJ.fpuCoproboard1.cirReadWordZero (a);
4086: } else {
4087: return super.mmdRwz (a);
4088: }
4089: }
4090: if ((a & (XEiJ.BUS_MOTHER_MASK & -0x20)) == 0x00e9e080) {
4091: if ((7 & XEiJ.currentCopro2) != 0) {
4092: return XEiJ.fpuCoproboard2.cirReadWordZero (a);
4093: } else {
4094: return super.mmdRwz (a);
4095: }
4096: }
4097: if ((a & (XEiJ.BUS_MOTHER_MASK & -HFS.HFS_ROM_SIZE)) == HFS.HFS_ADDRESS) {
4098: a &= XEiJ.BUS_MOTHER_MASK;
4099: return (char) (MainMemory.mmrM8[a] << 8 | (MainMemory.mmrM8[a + 1] & 0xff));
4100: }
4101: if (Keyboard.KBD_ZKEY_ON &&
4102: (a & (XEiJ.BUS_MOTHER_MASK & -Keyboard.KBD_ZKEY_IO_SIZE)) == Keyboard.KBD_ZKEY_IO_ADDRESS) {
4103: return Keyboard.kbdZKeyIOReadWord (a);
4104: }
4105: return super.mmdRwz (a);
4106: }
4107: @Override protected int mmdRls (int a) throws M68kException {
4108: if ((a & (XEiJ.BUS_MOTHER_MASK & -0x20)) == 0x00e9e000) {
4109: if ((7 & XEiJ.currentCopro1) != 0) {
4110: return XEiJ.fpuCoproboard1.cirReadLong (a);
4111: } else {
4112: return super.mmdRls (a);
4113: }
4114: }
4115: if ((a & (XEiJ.BUS_MOTHER_MASK & -0x20)) == 0x00e9e080) {
4116: if ((7 & XEiJ.currentCopro2) != 0) {
4117: return XEiJ.fpuCoproboard2.cirReadLong (a);
4118: } else {
4119: return super.mmdRls (a);
4120: }
4121: }
4122: if ((a & (XEiJ.BUS_MOTHER_MASK & -HFS.HFS_ROM_SIZE)) == HFS.HFS_ADDRESS) {
4123: a &= XEiJ.BUS_MOTHER_MASK;
4124: return MainMemory.mmrM8[a] << 24 | (MainMemory.mmrM8[a + 1] & 0xff) << 16 | (char) (MainMemory.mmrM8[a + 2] << 8 | (MainMemory.mmrM8[a + 3] & 0xff));
4125: }
4126: if (Keyboard.KBD_ZKEY_ON &&
4127: (a & (XEiJ.BUS_MOTHER_MASK & -Keyboard.KBD_ZKEY_IO_SIZE)) == Keyboard.KBD_ZKEY_IO_ADDRESS) {
4128: return Keyboard.kbdZKeyIOReadLong (a);
4129: }
4130: return super.mmdRls (a);
4131: }
4132:
4133: @Override protected void mmdWb (int a, int d) throws M68kException {
4134: if ((a & (XEiJ.BUS_MOTHER_MASK & -0x20)) == 0x00e9e000) {
4135: if ((7 & XEiJ.currentCopro1) != 0) {
4136: XEiJ.fpuCoproboard1.cirWriteByte (a, d);
4137: return;
4138: } else {
4139: super.mmdWb (a, d);
4140: return;
4141: }
4142: }
4143: if ((a & (XEiJ.BUS_MOTHER_MASK & -0x20)) == 0x00e9e080) {
4144: if ((7 & XEiJ.currentCopro2) != 0) {
4145: XEiJ.fpuCoproboard2.cirWriteByte (a, d);
4146: return;
4147: } else {
4148: super.mmdWb (a, d);
4149: return;
4150: }
4151: }
4152: if (Keyboard.KBD_ZKEY_ON &&
4153: (a & (XEiJ.BUS_MOTHER_MASK & -Keyboard.KBD_ZKEY_IO_SIZE)) == Keyboard.KBD_ZKEY_IO_ADDRESS) {
4154: Keyboard.kbdZKeyIOWriteByte (a, d);
4155: return;
4156: }
4157: super.mmdWb (a, d);
4158: }
4159: @Override protected void mmdWw (int a, int d) throws M68kException {
4160: if ((a & (XEiJ.BUS_MOTHER_MASK & -0x20)) == 0x00e9e000) {
4161: if ((7 & XEiJ.currentCopro1) != 0) {
4162: XEiJ.fpuCoproboard1.cirWriteWord (a, d);
4163: return;
4164: } else {
4165: super.mmdWw (a, d);
4166: return;
4167: }
4168: }
4169: if ((a & (XEiJ.BUS_MOTHER_MASK & -0x20)) == 0x00e9e080) {
4170: if ((7 & XEiJ.currentCopro2) != 0) {
4171: XEiJ.fpuCoproboard2.cirWriteWord (a, d);
4172: return;
4173: } else {
4174: super.mmdWw (a, d);
4175: return;
4176: }
4177: }
4178: if (Keyboard.KBD_ZKEY_ON &&
4179: (a & (XEiJ.BUS_MOTHER_MASK & -Keyboard.KBD_ZKEY_IO_SIZE)) == Keyboard.KBD_ZKEY_IO_ADDRESS) {
4180: Keyboard.kbdZKeyIOWriteWord (a, d);
4181: return;
4182: }
4183: super.mmdWw (a, d);
4184: }
4185: @Override protected void mmdWl (int a, int d) throws M68kException {
4186: if ((a & (XEiJ.BUS_MOTHER_MASK & -0x20)) == 0x00e9e000) {
4187: if ((7 & XEiJ.currentCopro1) != 0) {
4188: XEiJ.fpuCoproboard1.cirWriteLong (a, d);
4189: return;
4190: } else {
4191: super.mmdWl (a, d);
4192: return;
4193: }
4194: }
4195: if ((a & (XEiJ.BUS_MOTHER_MASK & -0x20)) == 0x00e9e080) {
4196: if ((7 & XEiJ.currentCopro2) != 0) {
4197: XEiJ.fpuCoproboard2.cirWriteLong (a, d);
4198: return;
4199: } else {
4200: super.mmdWl (a, d);
4201: return;
4202: }
4203: }
4204: if (Keyboard.KBD_ZKEY_ON &&
4205: (a & (XEiJ.BUS_MOTHER_MASK & -Keyboard.KBD_ZKEY_IO_SIZE)) == Keyboard.KBD_ZKEY_IO_ADDRESS) {
4206: Keyboard.kbdZKeyIOWriteLong (a, d);
4207: return;
4208: }
4209: super.mmdWl (a, d);
4210: }
4211: },
4212:
4213:
4214:
4215:
4216:
4217:
4218: MMD_EXS {
4219: @Override public String toString () {
4220: return Multilingual.mlnJapanese ? "拡張 SCSI ポート" : "Expansion SCSI Port";
4221: }
4222:
4223: @Override protected int mmdPbz (int a) {
4224: if ((a & (-32 & XEiJ.BUS_MOTHER_MASK)) == SPC.SPC_BASE_EX) {
4225: if ((a & 0x01) == 0) {
4226: return 0xff;
4227: } else {
4228: return SPC.spcSCSIEXChip.spiPeek (a);
4229: }
4230: } else {
4231: return 0xff & MainMemory.mmrM8[a];
4232: }
4233: }
4234: @Override protected int mmdPwz (int a) {
4235: XEiJ.mpuClockTime += XEiJ.busWaitTime.hdc;
4236: if ((a & (-32 & XEiJ.BUS_MOTHER_MASK)) == SPC.SPC_BASE_EX) {
4237: return 0xff00 | SPC.spcSCSIEXChip.spiPeek (a + 1);
4238: } else {
4239: return (0xff & MainMemory.mmrM8[a]) << 8 | (0xff & MainMemory.mmrM8[a + 1]);
4240: }
4241: }
4242: @Override protected int mmdPls (int a) {
4243: return mmdPwz (a) << 16 | mmdPwz (a + 2);
4244: }
4245:
4246: @Override protected int mmdRbz (int a) throws M68kException {
4247: XEiJ.mpuClockTime += XEiJ.busWaitTime.hdc;
4248: if ((a & (-32 & XEiJ.BUS_MOTHER_MASK)) == SPC.SPC_BASE_EX) {
4249: if ((a & 0x01) == 0) {
4250: if (XEiJ.currentIsSecond) {
4251: return 0xff;
4252: }
4253: return super.mmdRbz (a);
4254: } else {
4255: return SPC.spcSCSIEXChip.spiRead (a);
4256: }
4257: } else {
4258: return 0xff & MainMemory.mmrM8[a];
4259: }
4260: }
4261: @Override protected int mmdRwz (int a) throws M68kException {
4262: XEiJ.mpuClockTime += XEiJ.busWaitTime.hdc;
4263: if ((a & (-32 & XEiJ.BUS_MOTHER_MASK)) == SPC.SPC_BASE_EX) {
4264: return 0xff00 | SPC.spcSCSIEXChip.spiRead (a + 1);
4265: } else {
4266: return (0xff & MainMemory.mmrM8[a]) << 8 | (0xff & MainMemory.mmrM8[a + 1]);
4267: }
4268: }
4269: @Override protected int mmdRls (int a) throws M68kException {
4270: return mmdRwz (a) << 16 | mmdRwz (a + 2);
4271: }
4272:
4273: @Override protected void mmdWb (int a, int d) throws M68kException {
4274: XEiJ.mpuClockTime += XEiJ.busWaitTime.hdc;
4275: if ((a & (-32 & XEiJ.BUS_MOTHER_MASK)) == SPC.SPC_BASE_EX) {
4276: if ((a & 1) == 0) {
4277: if (XEiJ.currentIsSecond) {
4278: return;
4279: }
4280: super.mmdWb (a, d);
4281: } else {
4282: SPC.spcSCSIEXChip.spiWrite (a, d);
4283: return;
4284: }
4285: } else {
4286: super.mmdWb (a, d);
4287: }
4288: }
4289: @Override protected void mmdWw (int a, int d) throws M68kException {
4290: XEiJ.mpuClockTime += XEiJ.busWaitTime.hdc;
4291: if ((a & (-32 & XEiJ.BUS_MOTHER_MASK)) == SPC.SPC_BASE_EX) {
4292: SPC.spcSCSIEXChip.spiWrite (a + 1, d);
4293: return;
4294: } else {
4295: super.mmdWw (a, d);
4296: }
4297: }
4298: @Override protected void mmdWl (int a, int d) throws M68kException {
4299: mmdWw (a, d >> 16);
4300: mmdWw (a + 2, d);
4301: }
4302: },
4303:
4304:
4305:
4306:
4307:
4308:
4309:
4310:
4311:
4312:
4313:
4314:
4315:
4316:
4317:
4318:
4319:
4320:
4321:
4322:
4323: MMD_XB2 {
4324: @Override public String toString () {
4325: return Multilingual.mlnJapanese ? "拡張ボード領域 2" : "Expansion Board Area 2";
4326: }
4327:
4328: @Override protected int mmdRbz (int a) throws M68kException {
4329: a &= XEiJ.BUS_MOTHER_MASK;
4330: if (0x00eaff81 <= a && a <= 0x00eaff89 && (a & 1) != 0) {
4331: return MainMemory.mmrM8[a] & 0xff;
4332: }
4333: if (XEiJ.bnkOn && a == 0x00eaff7f) {
4334: return XEiJ.bnkPageStart >> 17;
4335: }
4336: return super.mmdRbz (a);
4337: }
4338:
4339: @Override protected void mmdWb (int a, int d) throws M68kException {
4340: a &= XEiJ.BUS_MOTHER_MASK;
4341: if (0x00eaff81 <= a && a <= 0x00eaff89 && (a & 1) != 0) {
4342: MainMemory.mmrM8[a] = (byte) d;
4343: a = (a & 14) + 2 << 20;
4344: for (int m = 1; m <= 128; m <<= 1) {
4345: if ((d & m) == 0) {
4346: XEiJ.busUser ( MemoryMappedDevice.MMD_MMR, a, a + 0x00040000);
4347: } else {
4348: XEiJ.busSuper (MemoryMappedDevice.MMD_MMR, a, a + 0x00040000);
4349: }
4350: a += 0x00040000;
4351: }
4352: return;
4353: }
4354: if (XEiJ.bnkOn && a == 0x00eaff7f) {
4355: XEiJ.bnkPageStart = (d & 0xff) << 17;
4356: return;
4357: }
4358: super.mmdWb (a, d);
4359: }
4360: },
4361:
4362:
4363:
4364:
4365:
4366:
4367:
4368:
4369:
4370:
4371:
4372:
4373:
4374:
4375:
4376:
4377:
4378:
4379:
4380:
4381:
4382: MMD_SPR {
4383: @Override public String toString () {
4384: return Multilingual.mlnJapanese ? "スプライト画面" : "Sprite Screen";
4385: }
4386:
4387: @Override protected byte mmdRbs (int a) throws M68kException {
4388: XEiJ.mpuClockTime += XEiJ.busWaitTime.sprc;
4389: return (byte) SpriteScreen.sprReadByte (a);
4390: }
4391: @Override protected int mmdRbz (int a) throws M68kException {
4392: XEiJ.mpuClockTime += XEiJ.busWaitTime.sprc;
4393: return SpriteScreen.sprReadByte (a);
4394: }
4395: @Override protected int mmdRws (int a) throws M68kException {
4396: XEiJ.mpuClockTime += XEiJ.busWaitTime.sprc;
4397: return (short) SpriteScreen.sprReadWord (a);
4398: }
4399: @Override protected int mmdRwz (int a) throws M68kException {
4400: XEiJ.mpuClockTime += XEiJ.busWaitTime.sprc;
4401: return SpriteScreen.sprReadWord (a);
4402: }
4403: @Override protected int mmdRls (int a) throws M68kException {
4404: XEiJ.mpuClockTime += XEiJ.busWaitTime.sprc * 2;
4405: return SpriteScreen.sprReadLong (a);
4406: }
4407:
4408: @Override protected void mmdWb (int a, int d) throws M68kException {
4409: XEiJ.mpuClockTime += XEiJ.busWaitTime.sprc;
4410: SpriteScreen.sprWriteByte (a, d);
4411: }
4412: @Override protected void mmdWw (int a, int d) throws M68kException {
4413: XEiJ.mpuClockTime += XEiJ.busWaitTime.sprc;
4414: SpriteScreen.sprWriteWord (a, d);
4415: }
4416: @Override protected void mmdWl (int a, int d) throws M68kException {
4417: XEiJ.mpuClockTime += XEiJ.busWaitTime.sprc * 2;
4418: SpriteScreen.sprWriteLong (a, d);
4419: }
4420: },
4421:
4422:
4423:
4424:
4425:
4426:
4427:
4428:
4429:
4430:
4431: MMD_XB3 {
4432: @Override public String toString () {
4433: return Multilingual.mlnJapanese ? "拡張ボード領域 3" : "Expansion Board Area 3";
4434: }
4435:
4436: @Override protected int mmdRbz (int a) throws M68kException {
4437: a &= XEiJ.BUS_MOTHER_MASK;
4438: if (XEiJ.currentAccelerator == XEiJ.ACCELERATOR_XELLENT30 &&
4439: XEiJ.xt3PortAddress <= a && a < XEiJ.xt3PortAddress + 0x4000) {
4440: return (a & 1) == 0 ? 0 : XEiJ.xt3PortRead ();
4441: }
4442: if (MercuryUnit.MU4_ON && MercuryUnit.mu4On &&
4443: (a & 0x00ffff80) == 0x00ecc080) {
4444: return MercuryUnit.mu4ReadByte (a);
4445: }
4446: return super.mmdRbz (a);
4447: }
4448: @Override protected int mmdRwz (int a) throws M68kException {
4449: a &= XEiJ.BUS_MOTHER_MASK;
4450: if (XEiJ.currentAccelerator == XEiJ.ACCELERATOR_XELLENT30 &&
4451: XEiJ.xt3PortAddress <= a && a < XEiJ.xt3PortAddress + 0x4000) {
4452: return XEiJ.xt3PortRead ();
4453: }
4454: if (MercuryUnit.MU4_ON && MercuryUnit.mu4On &&
4455: (a & 0x00ffff80) == 0x00ecc080) {
4456: return MercuryUnit.mu4ReadWord (a);
4457: }
4458: return super.mmdRwz (a);
4459: }
4460: @Override protected int mmdRls (int a) throws M68kException {
4461: a &= XEiJ.BUS_MOTHER_MASK;
4462: if (XEiJ.currentAccelerator == XEiJ.ACCELERATOR_XELLENT30 &&
4463: XEiJ.xt3PortAddress <= a && a < XEiJ.xt3PortAddress + 0x4000) {
4464: return XEiJ.xt3PortRead () << 16 | XEiJ.xt3PortRead ();
4465: }
4466: if (MercuryUnit.MU4_ON && MercuryUnit.mu4On &&
4467: (a & 0x00ffff80) == 0x00ecc080) {
4468: return MercuryUnit.mu4ReadWord (a) << 16 | MercuryUnit.mu4ReadWord (a + 2);
4469: }
4470: return super.mmdRls (a);
4471: }
4472: @Override protected void mmdWb (int a, int d) throws M68kException {
4473: a &= XEiJ.BUS_MOTHER_MASK;
4474: if (XEiJ.currentAccelerator == XEiJ.ACCELERATOR_XELLENT30 &&
4475: XEiJ.xt3PortAddress <= a && a < XEiJ.xt3PortAddress + 0x4000) {
4476: if ((a & 1) == 0) {
4477: } else {
4478: XEiJ.xt3PortWrite (d);
4479: }
4480: return;
4481: }
4482: if (MercuryUnit.MU4_ON && MercuryUnit.mu4On &&
4483: (a & 0x00ffff80) == 0x00ecc080) {
4484: MercuryUnit.mu4WriteByte (a, d);
4485: return;
4486: }
4487: super.mmdWb (a, d);
4488: }
4489: @Override protected void mmdWw (int a, int d) throws M68kException {
4490: a &= XEiJ.BUS_MOTHER_MASK;
4491: if (XEiJ.currentAccelerator == XEiJ.ACCELERATOR_XELLENT30 &&
4492: XEiJ.xt3PortAddress <= a && a < XEiJ.xt3PortAddress + 0x4000) {
4493: XEiJ.xt3PortWrite (d);
4494: return;
4495: }
4496: if (MercuryUnit.MU4_ON && MercuryUnit.mu4On &&
4497: (a & 0x00ffff80) == 0x00ecc080) {
4498: MercuryUnit.mu4WriteWord (a, d);
4499: return;
4500: }
4501: super.mmdWw (a, d);
4502: }
4503: @Override protected void mmdWl (int a, int d) throws M68kException {
4504: a &= XEiJ.BUS_MOTHER_MASK;
4505: if (XEiJ.currentAccelerator == XEiJ.ACCELERATOR_XELLENT30 &&
4506: XEiJ.xt3PortAddress <= a && a < XEiJ.xt3PortAddress + 0x4000) {
4507: XEiJ.xt3PortWrite (d >> 16);
4508: XEiJ.xt3PortWrite (d);
4509: return;
4510: }
4511: if (MercuryUnit.MU4_ON && MercuryUnit.mu4On &&
4512: (a & 0x00ffff80) == 0x00ecc080) {
4513: MercuryUnit.mu4WriteWord (a, d >> 16);
4514: MercuryUnit.mu4WriteWord (a + 2, d);
4515: return;
4516: }
4517: super.mmdWl (a, d);
4518: }
4519: },
4520:
4521:
4522:
4523: MMD_XTM {
4524: @Override public String toString () {
4525: return Multilingual.mlnJapanese ? "Xellent30 の SRAM" : "SRAM on Xellent30";
4526: }
4527:
4528: @Override protected byte mmdPbs (int a) {
4529: a -= XEiJ.xt3MemoryPosition;
4530: return XEiJ.xt3MemoryArray[a];
4531: }
4532: @Override protected int mmdPbz (int a) {
4533: a -= XEiJ.xt3MemoryPosition;
4534: return XEiJ.xt3MemoryArray[a] & 0xff;
4535: }
4536: @Override protected int mmdPws (int a) {
4537: a -= XEiJ.xt3MemoryPosition;
4538: return XEiJ.xt3MemoryArray[a] << 8 | (XEiJ.xt3MemoryArray[a + 1] & 0xff);
4539: }
4540: @Override protected int mmdPwz (int a) {
4541: a -= XEiJ.xt3MemoryPosition;
4542: return (char) (XEiJ.xt3MemoryArray[a] << 8 | (XEiJ.xt3MemoryArray[a + 1] & 0xff));
4543: }
4544: @Override protected int mmdPls (int a) {
4545: a -= XEiJ.xt3MemoryPosition;
4546: return XEiJ.xt3MemoryArray[a] << 24 | (XEiJ.xt3MemoryArray[a + 1] & 0xff) << 16 | (char) (XEiJ.xt3MemoryArray[a + 2] << 8 | (XEiJ.xt3MemoryArray[a + 3] & 0xff));
4547: }
4548:
4549: @Override protected byte mmdRbs (int a) throws M68kException {
4550: a -= XEiJ.xt3MemoryPosition;
4551: return XEiJ.xt3MemoryArray[a];
4552: }
4553: @Override protected int mmdRbz (int a) throws M68kException {
4554: a -= XEiJ.xt3MemoryPosition;
4555: return XEiJ.xt3MemoryArray[a] & 0xff;
4556: }
4557: @Override protected int mmdRws (int a) throws M68kException {
4558: a -= XEiJ.xt3MemoryPosition;
4559: return XEiJ.xt3MemoryArray[a] << 8 | (XEiJ.xt3MemoryArray[a + 1] & 0xff);
4560: }
4561: @Override protected int mmdRwz (int a) throws M68kException {
4562: a -= XEiJ.xt3MemoryPosition;
4563: return (char) (XEiJ.xt3MemoryArray[a] << 8 | (XEiJ.xt3MemoryArray[a + 1] & 0xff));
4564: }
4565: @Override protected int mmdRls (int a) throws M68kException {
4566: a -= XEiJ.xt3MemoryPosition;
4567: return XEiJ.xt3MemoryArray[a] << 24 | (XEiJ.xt3MemoryArray[a + 1] & 0xff) << 16 | (char) (XEiJ.xt3MemoryArray[a + 2] << 8 | (XEiJ.xt3MemoryArray[a + 3] & 0xff));
4568: }
4569:
4570: @Override protected void mmdWb (int a, int d) throws M68kException {
4571: a -= XEiJ.xt3MemoryPosition;
4572: XEiJ.xt3MemoryArray[a ] = (byte) d;
4573: }
4574: @Override protected void mmdWw (int a, int d) throws M68kException {
4575: a -= XEiJ.xt3MemoryPosition;
4576: XEiJ.xt3MemoryArray[a ] = (byte) (d >> 8);
4577: XEiJ.xt3MemoryArray[a + 1] = (byte) d;
4578: }
4579: @Override protected void mmdWl (int a, int d) throws M68kException {
4580: a -= XEiJ.xt3MemoryPosition;
4581: XEiJ.xt3MemoryArray[a ] = (byte) (d >> 24);
4582: XEiJ.xt3MemoryArray[a + 1] = (byte) (d >> 16);
4583: XEiJ.xt3MemoryArray[a + 2] = (byte) (d >> 8);
4584: XEiJ.xt3MemoryArray[a + 3] = (byte) d;
4585: }
4586: },
4587:
4588:
4589:
4590: MMD_SMR {
4591: @Override public String toString () {
4592: return Multilingual.mlnJapanese ? "SRAM" : "SRAM";
4593: }
4594:
4595: @Override protected byte mmdPbs (int a) {
4596: a &= XEiJ.BUS_MOTHER_MASK;
4597: return MainMemory.mmrM8[a];
4598: }
4599: @Override protected int mmdPbz (int a) {
4600: a &= XEiJ.BUS_MOTHER_MASK;
4601: return MainMemory.mmrM8[a] & 0xff;
4602: }
4603: @Override protected int mmdPws (int a) {
4604: a &= XEiJ.BUS_MOTHER_MASK;
4605: if (MainMemory.MMR_USE_BYTE_BUFFER) {
4606: return MainMemory.mmrBuffer.getShort (a);
4607: } else {
4608: return MainMemory.mmrM8[a] << 8 | (MainMemory.mmrM8[a + 1] & 0xff);
4609: }
4610: }
4611: @Override protected int mmdPwz (int a) {
4612: a &= XEiJ.BUS_MOTHER_MASK;
4613: if (MainMemory.MMR_USE_BYTE_BUFFER) {
4614: return MainMemory.mmrBuffer.getChar (a);
4615: } else {
4616: return (char) (MainMemory.mmrM8[a] << 8 | (MainMemory.mmrM8[a + 1] & 0xff));
4617: }
4618: }
4619: @Override protected int mmdPls (int a) {
4620: a &= XEiJ.BUS_MOTHER_MASK;
4621: if (MainMemory.MMR_USE_BYTE_BUFFER) {
4622: return MainMemory.mmrBuffer.getInt (a);
4623: } else {
4624: return MainMemory.mmrM8[a] << 24 | (MainMemory.mmrM8[a + 1] & 0xff) << 16 | (char) (MainMemory.mmrM8[a + 2] << 8 | (MainMemory.mmrM8[a + 3] & 0xff));
4625: }
4626: }
4627:
4628: @Override protected byte mmdRbs (int a) throws M68kException {
4629: XEiJ.mpuClockTime += XEiJ.busWaitTime.sram;
4630: a &= XEiJ.BUS_MOTHER_MASK;
4631: XEiJ.mpuClockTime += XEiJ.busWaitTime.sram;
4632: return MainMemory.mmrM8[a];
4633: }
4634: @Override protected int mmdRbz (int a) throws M68kException {
4635: XEiJ.mpuClockTime += XEiJ.busWaitTime.sram;
4636: a &= XEiJ.BUS_MOTHER_MASK;
4637: XEiJ.mpuClockTime += XEiJ.busWaitTime.sram;
4638: return MainMemory.mmrM8[a] & 0xff;
4639: }
4640: @Override protected int mmdRws (int a) throws M68kException {
4641: return (short) mmdRwz (a);
4642: }
4643: @Override protected int mmdRwz (int a) throws M68kException {
4644: XEiJ.mpuClockTime += XEiJ.busWaitTime.sram;
4645: a &= XEiJ.BUS_MOTHER_MASK;
4646: XEiJ.mpuClockTime += XEiJ.busWaitTime.sram;
4647: int d;
4648: if (MainMemory.MMR_USE_BYTE_BUFFER) {
4649: d = MainMemory.mmrBuffer.getChar (a);
4650: } else {
4651: d = (char) (MainMemory.mmrM8[a] << 8 | (MainMemory.mmrM8[a + 1] & 0xff));
4652: }
4653: return d;
4654: }
4655: @Override protected int mmdRls (int a) throws M68kException {
4656: XEiJ.mpuClockTime += XEiJ.busWaitTime.sram * 2;
4657: a &= XEiJ.BUS_MOTHER_MASK;
4658: XEiJ.mpuClockTime += XEiJ.busWaitTime.sram * 2;
4659: int d;
4660: if (MainMemory.MMR_USE_BYTE_BUFFER) {
4661: d = MainMemory.mmrBuffer.getInt (a);
4662: } else {
4663: d = MainMemory.mmrM8[a] << 24 | (MainMemory.mmrM8[a + 1] & 0xff) << 16 | (char) (MainMemory.mmrM8[a + 2] << 8 | (MainMemory.mmrM8[a + 3] & 0xff));
4664: }
4665: return d;
4666: }
4667:
4668: @Override protected void mmdWb (int a, int d) throws M68kException {
4669: XEiJ.mpuClockTime += XEiJ.busWaitTime.sram;
4670: if (SRAM.smrWriteEnableOn) {
4671: a &= XEiJ.BUS_MOTHER_MASK;
4672: XEiJ.mpuClockTime += XEiJ.busWaitTime.sram;
4673: MainMemory.mmrM8[a] = (byte) d;
4674: if (a == 0x00ed002b || a == 0x00ed0059) {
4675: Keyboard.kbdRepaint ();
4676: } else if (a == 0x00ed005a) {
4677: if (0x00fe0000 <= XEiJ.regPC0 && XEiJ.regPC0 <= 0x00ffffff) {
4678: SRAM.smrOverride ();
4679: }
4680: }
4681: } else {
4682: System.out.printf ("%08X writing $%02X to $%08X in a write-protected state\n", XEiJ.regPC0, d & 0xff, a);
4683: if (SRAM.smrSRAMBusErrorOn) {
4684: super.mmdWb (a, d);
4685: }
4686: }
4687: }
4688: @Override protected void mmdWw (int a, int d) throws M68kException {
4689: XEiJ.mpuClockTime += XEiJ.busWaitTime.sram;
4690: if (SRAM.smrWriteEnableOn) {
4691: a &= XEiJ.BUS_MOTHER_MASK;
4692: XEiJ.mpuClockTime += XEiJ.busWaitTime.sram;
4693: MainMemory.mmrM8[a ] = (byte) (d >> 8);
4694: MainMemory.mmrM8[a + 1] = (byte) d;
4695: if (a == (0x00ed002b & -2) || a == (0x00ed0059 & -2)) {
4696: Keyboard.kbdRepaint ();
4697: }
4698: } else {
4699: System.out.printf ("%08X writing $%04X to $%08X in a write-protected state\n", XEiJ.regPC0, d & 0xffff, a);
4700: if (SRAM.smrSRAMBusErrorOn) {
4701: super.mmdWw (a, d);
4702: }
4703: }
4704: }
4705: @Override protected void mmdWl (int a, int d) throws M68kException {
4706: if (SRAM.smrWriteEnableOn) {
4707: mmdWw (a , d >> 16);
4708: mmdWw (a + 2, d );
4709: } else {
4710: System.out.printf ("%08X writing $%08X to $%08X in a write-protected state\n", XEiJ.regPC0, d, a);
4711: if (SRAM.smrSRAMBusErrorOn) {
4712: super.mmdWl (a, d);
4713: }
4714: }
4715: }
4716: },
4717:
4718:
4719:
4720:
4721: MMD_XB4 {
4722: @Override public String toString () {
4723: return Multilingual.mlnJapanese ? "拡張ボード領域 4" : "Expansion Board Area 4";
4724: }
4725:
4726: @Override protected byte mmdRbs (int a) throws M68kException {
4727: if (XEiJ.bnkOn) {
4728: a &= XEiJ.BUS_MOTHER_MASK;
4729: a = XEiJ.bnkPageStart + (a - 0x00ee0000);
4730: return XEiJ.bnkMemory[a];
4731: }
4732: return super.mmdRbs (a);
4733: }
4734: @Override protected int mmdRbz (int a) throws M68kException {
4735: if (XEiJ.bnkOn) {
4736: a &= XEiJ.BUS_MOTHER_MASK;
4737: a = XEiJ.bnkPageStart + (a - 0x00ee0000);
4738: return XEiJ.bnkMemory[a] & 0xff;
4739: }
4740: return super.mmdRbz (a);
4741: }
4742: @Override protected int mmdRws (int a) throws M68kException {
4743: if (XEiJ.bnkOn) {
4744: a &= XEiJ.BUS_MOTHER_MASK;
4745: a = XEiJ.bnkPageStart + (a - 0x00ee0000);
4746: return ((XEiJ.bnkMemory[a ] ) << 8 |
4747: (XEiJ.bnkMemory[a + 1] & 0xff));
4748: }
4749: return super.mmdRws (a);
4750: }
4751: @Override protected int mmdRwz (int a) throws M68kException {
4752: if (XEiJ.bnkOn) {
4753: a &= XEiJ.BUS_MOTHER_MASK;
4754: a = XEiJ.bnkPageStart + (a - 0x00ee0000);
4755: return ((XEiJ.bnkMemory[a ] & 0xff) << 8 |
4756: (XEiJ.bnkMemory[a + 1] & 0xff));
4757: }
4758: return super.mmdRwz (a);
4759: }
4760: @Override protected int mmdRls (int a) throws M68kException {
4761: if (XEiJ.bnkOn) {
4762: a &= XEiJ.BUS_MOTHER_MASK;
4763: a = XEiJ.bnkPageStart + (a - 0x00ee0000);
4764: return ((XEiJ.bnkMemory[a ] ) << 24 |
4765: (XEiJ.bnkMemory[a + 1] & 0xff) << 16 |
4766: (XEiJ.bnkMemory[a + 2] & 0xff) << 8 |
4767: (XEiJ.bnkMemory[a + 3] & 0xff));
4768: }
4769: return super.mmdRls (a);
4770: }
4771:
4772: @Override protected void mmdWb (int a, int d) throws M68kException {
4773: if (XEiJ.bnkOn) {
4774: a &= XEiJ.BUS_MOTHER_MASK;
4775: a = XEiJ.bnkPageStart + (a - 0x00ee0000);
4776: XEiJ.bnkMemory[a] = (byte) d;
4777: return;
4778: }
4779: super.mmdWb (a, d);
4780: }
4781: @Override protected void mmdWw (int a, int d) throws M68kException {
4782: if (XEiJ.bnkOn) {
4783: a &= XEiJ.BUS_MOTHER_MASK;
4784: a = XEiJ.bnkPageStart + (a - 0x00ee0000);
4785: XEiJ.bnkMemory[a ] = (byte) (d >> 8);
4786: XEiJ.bnkMemory[a + 1] = (byte) d;
4787: return;
4788: }
4789: super.mmdWw (a, d);
4790: }
4791: @Override protected void mmdWl (int a, int d) throws M68kException {
4792: if (XEiJ.bnkOn) {
4793: a &= XEiJ.BUS_MOTHER_MASK;
4794: a = XEiJ.bnkPageStart + (a - 0x00ee0000);
4795: XEiJ.bnkMemory[a ] = (byte) (d >> 24);
4796: XEiJ.bnkMemory[a + 1] = (byte) (d >> 16);
4797: XEiJ.bnkMemory[a + 2] = (byte) (d >> 8);
4798: XEiJ.bnkMemory[a + 3] = (byte) d;
4799: return;
4800: }
4801: super.mmdWl (a, d);
4802: }
4803: },
4804:
4805:
4806:
4807: MMD_CG1 {
4808: @Override public String toString () {
4809: return Multilingual.mlnJapanese ? "CGROM" : "CGROM";
4810: }
4811:
4812: @Override protected byte mmdPbs (int a) {
4813: a &= XEiJ.BUS_MOTHER_MASK;
4814: return MainMemory.mmrM8[a];
4815: }
4816: @Override protected int mmdPbz (int a) {
4817: a &= XEiJ.BUS_MOTHER_MASK;
4818: return MainMemory.mmrM8[a] & 0xff;
4819: }
4820: @Override protected int mmdPws (int a) {
4821: a &= XEiJ.BUS_MOTHER_MASK;
4822: if (MainMemory.MMR_USE_BYTE_BUFFER) {
4823: return MainMemory.mmrBuffer.getShort (a);
4824: } else {
4825: return MainMemory.mmrM8[a] << 8 | (MainMemory.mmrM8[a + 1] & 0xff);
4826: }
4827: }
4828: @Override protected int mmdPwz (int a) {
4829: a &= XEiJ.BUS_MOTHER_MASK;
4830: if (MainMemory.MMR_USE_BYTE_BUFFER) {
4831: return MainMemory.mmrBuffer.getChar (a);
4832: } else {
4833: return (char) (MainMemory.mmrM8[a] << 8 | (MainMemory.mmrM8[a + 1] & 0xff));
4834: }
4835: }
4836: @Override protected int mmdPls (int a) {
4837: a &= XEiJ.BUS_MOTHER_MASK;
4838: if (MainMemory.MMR_USE_BYTE_BUFFER) {
4839: return MainMemory.mmrBuffer.getInt (a);
4840: } else {
4841: return MainMemory.mmrM8[a] << 24 | (MainMemory.mmrM8[a + 1] & 0xff) << 16 | (char) (MainMemory.mmrM8[a + 2] << 8 | (MainMemory.mmrM8[a + 3] & 0xff));
4842: }
4843: }
4844:
4845: @Override protected byte mmdRbs (int a) throws M68kException {
4846: XEiJ.mpuClockTime += XEiJ.busWaitTime.rom;
4847: a &= XEiJ.BUS_MOTHER_MASK;
4848: return MainMemory.mmrM8[a];
4849: }
4850: @Override protected int mmdRbz (int a) throws M68kException {
4851: XEiJ.mpuClockTime += XEiJ.busWaitTime.rom;
4852: a &= XEiJ.BUS_MOTHER_MASK;
4853: return MainMemory.mmrM8[a] & 0xff;
4854: }
4855: @Override protected int mmdRws (int a) throws M68kException {
4856: XEiJ.mpuClockTime += XEiJ.busWaitTime.rom;
4857: a &= XEiJ.BUS_MOTHER_MASK;
4858: if (MainMemory.MMR_USE_BYTE_BUFFER) {
4859: return MainMemory.mmrBuffer.getShort (a);
4860: } else {
4861: return MainMemory.mmrM8[a] << 8 | (MainMemory.mmrM8[a + 1] & 0xff);
4862: }
4863: }
4864: @Override protected int mmdRwz (int a) throws M68kException {
4865: XEiJ.mpuClockTime += XEiJ.busWaitTime.rom;
4866: a &= XEiJ.BUS_MOTHER_MASK;
4867: if (MainMemory.MMR_USE_BYTE_BUFFER) {
4868: return MainMemory.mmrBuffer.getChar (a);
4869: } else {
4870: return (char) (MainMemory.mmrM8[a] << 8 | (MainMemory.mmrM8[a + 1] & 0xff));
4871: }
4872: }
4873: @Override protected int mmdRls (int a) throws M68kException {
4874: XEiJ.mpuClockTime += XEiJ.busWaitTime.romlong;
4875: a &= XEiJ.BUS_MOTHER_MASK;
4876: if (MainMemory.MMR_USE_BYTE_BUFFER) {
4877: return MainMemory.mmrBuffer.getInt (a);
4878: } else {
4879: return MainMemory.mmrM8[a] << 24 | (MainMemory.mmrM8[a + 1] & 0xff) << 16 | (char) (MainMemory.mmrM8[a + 2] << 8 | (MainMemory.mmrM8[a + 3] & 0xff));
4880: }
4881: }
4882: },
4883:
4884:
4885:
4886: MMD_CG2 {
4887: @Override public String toString () {
4888: return Multilingual.mlnJapanese ? "CGROM" : "CGROM";
4889: }
4890:
4891: @Override protected byte mmdPbs (int a) {
4892: a &= XEiJ.BUS_MOTHER_MASK;
4893: return MainMemory.mmrM8[a];
4894: }
4895: @Override protected int mmdPbz (int a) {
4896: a &= XEiJ.BUS_MOTHER_MASK;
4897: return MainMemory.mmrM8[a] & 0xff;
4898: }
4899: @Override protected int mmdPws (int a) {
4900: a &= XEiJ.BUS_MOTHER_MASK;
4901: if (MainMemory.MMR_USE_BYTE_BUFFER) {
4902: return MainMemory.mmrBuffer.getShort (a);
4903: } else {
4904: return MainMemory.mmrM8[a] << 8 | (MainMemory.mmrM8[a + 1] & 0xff);
4905: }
4906: }
4907: @Override protected int mmdPwz (int a) {
4908: a &= XEiJ.BUS_MOTHER_MASK;
4909: if (MainMemory.MMR_USE_BYTE_BUFFER) {
4910: return MainMemory.mmrBuffer.getChar (a);
4911: } else {
4912: return (char) (MainMemory.mmrM8[a] << 8 | (MainMemory.mmrM8[a + 1] & 0xff));
4913: }
4914: }
4915: @Override protected int mmdPls (int a) {
4916: a &= XEiJ.BUS_MOTHER_MASK;
4917: if (MainMemory.MMR_USE_BYTE_BUFFER) {
4918: return MainMemory.mmrBuffer.getInt (a);
4919: } else {
4920: return MainMemory.mmrM8[a] << 24 | (MainMemory.mmrM8[a + 1] & 0xff) << 16 | (char) (MainMemory.mmrM8[a + 2] << 8 | (MainMemory.mmrM8[a + 3] & 0xff));
4921: }
4922: }
4923:
4924: @Override protected byte mmdRbs (int a) throws M68kException {
4925: XEiJ.mpuClockTime += XEiJ.busWaitTime.rom;
4926: a &= XEiJ.BUS_MOTHER_MASK;
4927: return MainMemory.mmrM8[a];
4928: }
4929: @Override protected int mmdRbz (int a) throws M68kException {
4930: XEiJ.mpuClockTime += XEiJ.busWaitTime.rom;
4931: a &= XEiJ.BUS_MOTHER_MASK;
4932: return MainMemory.mmrM8[a] & 0xff;
4933: }
4934: @Override protected int mmdRws (int a) throws M68kException {
4935: XEiJ.mpuClockTime += XEiJ.busWaitTime.rom;
4936: a &= XEiJ.BUS_MOTHER_MASK;
4937: if (MainMemory.MMR_USE_BYTE_BUFFER) {
4938: return MainMemory.mmrBuffer.getShort (a);
4939: } else {
4940: return MainMemory.mmrM8[a] << 8 | (MainMemory.mmrM8[a + 1] & 0xff);
4941: }
4942: }
4943: @Override protected int mmdRwz (int a) throws M68kException {
4944: XEiJ.mpuClockTime += XEiJ.busWaitTime.rom;
4945: a &= XEiJ.BUS_MOTHER_MASK;
4946: if (MainMemory.MMR_USE_BYTE_BUFFER) {
4947: return MainMemory.mmrBuffer.getChar (a);
4948: } else {
4949: return (char) (MainMemory.mmrM8[a] << 8 | (MainMemory.mmrM8[a + 1] & 0xff));
4950: }
4951: }
4952: @Override protected int mmdRls (int a) throws M68kException {
4953: XEiJ.mpuClockTime += XEiJ.busWaitTime.romlong;
4954: a &= XEiJ.BUS_MOTHER_MASK;
4955: if (MainMemory.MMR_USE_BYTE_BUFFER) {
4956: return MainMemory.mmrBuffer.getInt (a);
4957: } else {
4958: return MainMemory.mmrM8[a] << 24 | (MainMemory.mmrM8[a + 1] & 0xff) << 16 | (char) (MainMemory.mmrM8[a + 2] << 8 | (MainMemory.mmrM8[a + 3] & 0xff));
4959: }
4960: }
4961: },
4962:
4963:
4964:
4965: MMD_ROM {
4966: @Override public String toString () {
4967: return Multilingual.mlnJapanese ? "ROM" : "ROM";
4968: }
4969:
4970: @Override protected byte mmdPbs (int a) {
4971: a &= XEiJ.BUS_MOTHER_MASK;
4972: return MainMemory.mmrM8[a];
4973: }
4974: @Override protected int mmdPbz (int a) {
4975: a &= XEiJ.BUS_MOTHER_MASK;
4976: return MainMemory.mmrM8[a] & 0xff;
4977: }
4978: @Override protected int mmdPws (int a) {
4979: a &= XEiJ.BUS_MOTHER_MASK;
4980: if (MainMemory.MMR_USE_BYTE_BUFFER) {
4981: return MainMemory.mmrBuffer.getShort (a);
4982: } else {
4983: return MainMemory.mmrM8[a] << 8 | (MainMemory.mmrM8[a + 1] & 0xff);
4984: }
4985: }
4986: @Override protected int mmdPwz (int a) {
4987: a &= XEiJ.BUS_MOTHER_MASK;
4988: if (MainMemory.MMR_USE_BYTE_BUFFER) {
4989: return MainMemory.mmrBuffer.getChar (a);
4990: } else {
4991: return (char) (MainMemory.mmrM8[a] << 8 | (MainMemory.mmrM8[a + 1] & 0xff));
4992: }
4993: }
4994: @Override protected int mmdPls (int a) {
4995: a &= XEiJ.BUS_MOTHER_MASK;
4996: if (MainMemory.MMR_USE_BYTE_BUFFER) {
4997: return MainMemory.mmrBuffer.getInt (a);
4998: } else {
4999: return MainMemory.mmrM8[a] << 24 | (MainMemory.mmrM8[a + 1] & 0xff) << 16 | (char) (MainMemory.mmrM8[a + 2] << 8 | (MainMemory.mmrM8[a + 3] & 0xff));
5000: }
5001: }
5002:
5003: @Override protected byte mmdRbs (int a) throws M68kException {
5004: XEiJ.mpuClockTime += XEiJ.busWaitTime.rom;
5005: a &= XEiJ.BUS_MOTHER_MASK;
5006: return MainMemory.mmrM8[a];
5007: }
5008: @Override protected int mmdRbz (int a) throws M68kException {
5009: XEiJ.mpuClockTime += XEiJ.busWaitTime.rom;
5010: a &= XEiJ.BUS_MOTHER_MASK;
5011: return MainMemory.mmrM8[a] & 0xff;
5012: }
5013: @Override protected int mmdRws (int a) throws M68kException {
5014: XEiJ.mpuClockTime += XEiJ.busWaitTime.rom;
5015: a &= XEiJ.BUS_MOTHER_MASK;
5016: if (MainMemory.MMR_USE_BYTE_BUFFER) {
5017: return MainMemory.mmrBuffer.getShort (a);
5018: } else {
5019: return MainMemory.mmrM8[a] << 8 | (MainMemory.mmrM8[a + 1] & 0xff);
5020: }
5021: }
5022: @Override protected int mmdRwz (int a) throws M68kException {
5023: XEiJ.mpuClockTime += XEiJ.busWaitTime.rom;
5024: a &= XEiJ.BUS_MOTHER_MASK;
5025: if (MainMemory.MMR_USE_BYTE_BUFFER) {
5026: return MainMemory.mmrBuffer.getChar (a);
5027: } else {
5028: return (char) (MainMemory.mmrM8[a] << 8 | (MainMemory.mmrM8[a + 1] & 0xff));
5029: }
5030: }
5031: @Override protected int mmdRls (int a) throws M68kException {
5032: XEiJ.mpuClockTime += XEiJ.busWaitTime.romlong;
5033: a &= XEiJ.BUS_MOTHER_MASK;
5034: if (MainMemory.MMR_USE_BYTE_BUFFER) {
5035: return MainMemory.mmrBuffer.getInt (a);
5036: } else {
5037: return MainMemory.mmrM8[a] << 24 | (MainMemory.mmrM8[a + 1] & 0xff) << 16 | (char) (MainMemory.mmrM8[a + 2] << 8 | (MainMemory.mmrM8[a + 3] & 0xff));
5038: }
5039: }
5040: },
5041:
5042:
5043:
5044: MMD_IBP {
5045: @Override public String toString () {
5046: return Multilingual.mlnJapanese ? "命令ブレークポイント" : "Instruction Break Point";
5047: }
5048: @Override protected int mmdRwz (int a) throws M68kException {
5049: if (InstructionBreakPoint.IBP_ON) {
5050: InstructionBreakPoint.InstructionBreakRecord[] hashTable = InstructionBreakPoint.ibpHashTable;
5051: for (InstructionBreakPoint.InstructionBreakRecord r = hashTable[a >> 1 & InstructionBreakPoint.IBP_HASH_MASK];
5052: r != null;
5053: r = r.ibrNext) {
5054: if (r.ibrPhysicalAddress == a) {
5055: if (r.ibrValue == r.ibrTarget) {
5056: if (r.ibrThreshold < 0) {
5057: InstructionBreakPoint.ibpRemove (r.ibrLogicalAddress, XEiJ.regSRS);
5058: XEiJ.mpuContinue = true;
5059: } else if (r.ibrTarget < r.ibrThreshold) {
5060: r.ibrTarget = r.ibrThreshold;
5061: XEiJ.mpuContinue = true;
5062: } else {
5063: if (r.ibrScriptElement != null &&
5064: r.ibrScriptElement.exlEval (ExpressionEvaluator.EVM_EXPRESSION).exlFloatValue.iszero ()) {
5065: break;
5066: }
5067: r.ibrTarget++;
5068: XEiJ.mpuContinue = false;
5069: }
5070: M68kException.m6eNumber = M68kException.M6E_INSTRUCTION_BREAK_POINT;
5071: throw M68kException.m6eSignal;
5072: } else {
5073: if (r.ibrWaitInstruction != null) {
5074: WaitInstruction.instruction = r.ibrWaitInstruction;
5075: return XEiJ.EMX_OPCODE_EMXWAIT;
5076: }
5077: r.ibrValue++;
5078: break;
5079: }
5080: }
5081: }
5082: }
5083: if (DataBreakPoint.DBP_ON) {
5084: return DataBreakPoint.dbpMemoryMap[a >>> XEiJ.BUS_PAGE_BITS].mmdRwz (a);
5085: } else {
5086: return XEiJ.busMemoryMap[a >>> XEiJ.BUS_PAGE_BITS].mmdRwz (a);
5087: }
5088: }
5089: },
5090:
5091:
5092:
5093: MMD_DBP {
5094: @Override public String toString () {
5095: return Multilingual.mlnJapanese ? "データブレークポイント" : "Data Break Point";
5096: }
5097:
5098: @Override protected byte mmdPbs (int a) {
5099: return (XEiJ.regSRS != 0 ? XEiJ.busSuperMap : XEiJ.busUserMap)[a >>> XEiJ.BUS_PAGE_BITS].mmdPbs (a);
5100: }
5101: @Override protected int mmdPbz (int a) {
5102: return (XEiJ.regSRS != 0 ? XEiJ.busSuperMap : XEiJ.busUserMap)[a >>> XEiJ.BUS_PAGE_BITS].mmdPbz (a);
5103: }
5104: @Override protected int mmdPws (int a) {
5105: return (XEiJ.regSRS != 0 ? XEiJ.busSuperMap : XEiJ.busUserMap)[a >>> XEiJ.BUS_PAGE_BITS].mmdPws (a);
5106: }
5107: @Override protected int mmdPwz (int a) {
5108: return (XEiJ.regSRS != 0 ? XEiJ.busSuperMap : XEiJ.busUserMap)[a >>> XEiJ.BUS_PAGE_BITS].mmdPwz (a);
5109: }
5110: @Override protected int mmdPls (int a) {
5111: return (XEiJ.regSRS != 0 ? XEiJ.busSuperMap : XEiJ.busUserMap)[a >>> XEiJ.BUS_PAGE_BITS].mmdPls (a);
5112: }
5113:
5114: @Override protected byte mmdRbs (int a) throws M68kException {
5115: int d = (XEiJ.regSRS != 0 ? XEiJ.busSuperMap : XEiJ.busUserMap)[a >>> XEiJ.BUS_PAGE_BITS].mmdRbs (a);
5116: DataBreakPoint.dbpBreak (DataBreakPoint.DBP_BYTE, a, d, false);
5117: return (byte) d;
5118: }
5119: @Override protected int mmdRbz (int a) throws M68kException {
5120: int d = (XEiJ.regSRS != 0 ? XEiJ.busSuperMap : XEiJ.busUserMap)[a >>> XEiJ.BUS_PAGE_BITS].mmdRbz (a);
5121: DataBreakPoint.dbpBreak (DataBreakPoint.DBP_BYTE, a, d, false);
5122: return d;
5123: }
5124: @Override protected int mmdRws (int a) throws M68kException {
5125: int d = (XEiJ.regSRS != 0 ? XEiJ.busSuperMap : XEiJ.busUserMap)[a >>> XEiJ.BUS_PAGE_BITS].mmdRws (a);
5126: DataBreakPoint.dbpBreak (DataBreakPoint.DBP_WORD, a, d, false);
5127: return d;
5128: }
5129: @Override protected int mmdRwz (int a) throws M68kException {
5130: int d = (XEiJ.regSRS != 0 ? XEiJ.busSuperMap : XEiJ.busUserMap)[a >>> XEiJ.BUS_PAGE_BITS].mmdRwz (a);
5131: DataBreakPoint.dbpBreak (DataBreakPoint.DBP_WORD, a, d, false);
5132: return d;
5133: }
5134: @Override protected int mmdRls (int a) throws M68kException {
5135: int d = (XEiJ.regSRS != 0 ? XEiJ.busSuperMap : XEiJ.busUserMap)[a >>> XEiJ.BUS_PAGE_BITS].mmdRls (a);
5136: DataBreakPoint.dbpBreak (DataBreakPoint.DBP_LONG, a, d, false);
5137: return d;
5138: }
5139:
5140: @Override protected void mmdWb (int a, int d) throws M68kException {
5141: (XEiJ.regSRS != 0 ? XEiJ.busSuperMap : XEiJ.busUserMap)[a >>> XEiJ.BUS_PAGE_BITS].mmdWb (a, d);
5142: DataBreakPoint.dbpBreak (DataBreakPoint.DBP_BYTE, a, d, true);
5143: }
5144: @Override protected void mmdWw (int a, int d) throws M68kException {
5145: (XEiJ.regSRS != 0 ? XEiJ.busSuperMap : XEiJ.busUserMap)[a >>> XEiJ.BUS_PAGE_BITS].mmdWw (a, d);
5146: DataBreakPoint.dbpBreak (DataBreakPoint.DBP_WORD, a, d, true);
5147: }
5148: @Override protected void mmdWl (int a, int d) throws M68kException {
5149: (XEiJ.regSRS != 0 ? XEiJ.busSuperMap : XEiJ.busUserMap)[a >>> XEiJ.BUS_PAGE_BITS].mmdWl (a, d);
5150: DataBreakPoint.dbpBreak (DataBreakPoint.DBP_LONG, a, d, true);
5151: }
5152: },
5153:
5154:
5155:
5156: MMD_NUL {
5157: @Override public String toString () {
5158: return Multilingual.mlnJapanese ? "ヌルデバイス" : "Null Device";
5159: }
5160: };
5161:
5162:
5163:
5164:
5165:
5166:
5167: protected byte mmdPbs (int a) {
5168: return (byte) mmdPbz (a);
5169: }
5170: protected int mmdPbz (int a) {
5171: try {
5172: return mmdRbz (a);
5173: } catch (M68kException e) {
5174: }
5175: return 0xff;
5176: }
5177: protected int mmdPws (int a) {
5178: return (short) mmdPwz (a);
5179: }
5180: protected int mmdPwz (int a) {
5181: try {
5182: return mmdRwz (a);
5183: } catch (M68kException e) {
5184: }
5185: return 0xffff;
5186: }
5187: protected int mmdPls (int a) {
5188: try {
5189: return mmdRls (a);
5190: } catch (M68kException e) {
5191: }
5192: return -1;
5193: }
5194:
5195:
5196:
5197: protected byte mmdRbs (int a) throws M68kException {
5198: return (byte) mmdRbz (a);
5199: }
5200: protected int mmdRbz (int a) throws M68kException {
5201: MC68060.m60BusErrorOnRead ();
5202: M68kException.m6eNumber = M68kException.M6E_ACCESS_FAULT;
5203: M68kException.m6eAddress = a;
5204: M68kException.m6eDirection = XEiJ.MPU_WR_READ;
5205: M68kException.m6eSize = XEiJ.MPU_SS_BYTE;
5206: throw M68kException.m6eSignal;
5207: }
5208: protected int mmdRws (int a) throws M68kException {
5209: return (short) mmdRwz (a);
5210: }
5211: protected int mmdRwz (int a) throws M68kException {
5212: MC68060.m60BusErrorOnRead ();
5213: M68kException.m6eNumber = M68kException.M6E_ACCESS_FAULT;
5214: M68kException.m6eAddress = a;
5215: M68kException.m6eDirection = XEiJ.MPU_WR_READ;
5216: M68kException.m6eSize = XEiJ.MPU_SS_WORD;
5217: throw M68kException.m6eSignal;
5218: }
5219: protected int mmdRls (int a) throws M68kException {
5220: MC68060.m60BusErrorOnRead ();
5221: M68kException.m6eNumber = M68kException.M6E_ACCESS_FAULT;
5222: M68kException.m6eAddress = a;
5223: M68kException.m6eDirection = XEiJ.MPU_WR_READ;
5224: M68kException.m6eSize = XEiJ.MPU_SS_LONG;
5225: throw M68kException.m6eSignal;
5226: }
5227:
5228:
5229:
5230: protected void mmdVb (int a, int d) {
5231: try {
5232: mmdWb (a, d);
5233: } catch (M68kException e) {
5234: }
5235: }
5236: protected void mmdVw (int a, int d) {
5237: try {
5238: mmdWw (a, d);
5239: } catch (M68kException e) {
5240: }
5241: }
5242: protected void mmdVl (int a, int d) {
5243: try {
5244: mmdWl (a, d);
5245: } catch (M68kException e) {
5246: }
5247: }
5248:
5249:
5250: protected void mmdWb (int a, int d) throws M68kException {
5251: MC68060.m60BusErrorOnWrite ();
5252: M68kException.m6eNumber = M68kException.M6E_ACCESS_FAULT;
5253: M68kException.m6eAddress = a;
5254: M68kException.m6eDirection = XEiJ.MPU_WR_WRITE;
5255: M68kException.m6eSize = XEiJ.MPU_SS_BYTE;
5256: throw M68kException.m6eSignal;
5257: }
5258: protected void mmdWw (int a, int d) throws M68kException {
5259: MC68060.m60BusErrorOnWrite ();
5260: M68kException.m6eNumber = M68kException.M6E_ACCESS_FAULT;
5261: M68kException.m6eAddress = a;
5262: M68kException.m6eDirection = XEiJ.MPU_WR_WRITE;
5263: M68kException.m6eSize = XEiJ.MPU_SS_WORD;
5264: throw M68kException.m6eSignal;
5265: }
5266: protected void mmdWl (int a, int d) throws M68kException {
5267: MC68060.m60BusErrorOnWrite ();
5268: M68kException.m6eNumber = M68kException.M6E_ACCESS_FAULT;
5269: M68kException.m6eAddress = a;
5270: M68kException.m6eDirection = XEiJ.MPU_WR_WRITE;
5271: M68kException.m6eSize = XEiJ.MPU_SS_LONG;
5272: throw M68kException.m6eSignal;
5273: }
5274: }
5275:
5276:
5277: