MC68901.java
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13: package xeij;
14:
15: import java.lang.*;
16:
17: public class MC68901 {
18:
19: public static final boolean MFP_DELAYED_INTERRUPT = true;
20:
21:
22: public static final int MFP_GPIP_DATA = 0x00e88001;
23: public static final int MFP_AER = 0x00e88003;
24: public static final int MFP_DDR = 0x00e88005;
25: public static final int MFP_IERA = 0x00e88007;
26: public static final int MFP_IERB = 0x00e88009;
27: public static final int MFP_IPRA = 0x00e8800b;
28: public static final int MFP_IPRB = 0x00e8800d;
29: public static final int MFP_ISRA = 0x00e8800f;
30: public static final int MFP_ISRB = 0x00e88011;
31: public static final int MFP_IMRA = 0x00e88013;
32: public static final int MFP_IMRB = 0x00e88015;
33: public static final int MFP_VECTOR = 0x00e88017;
34: public static final int MFP_TACR = 0x00e88019;
35: public static final int MFP_TBCR = 0x00e8801b;
36: public static final int MFP_TCDCR = 0x00e8801d;
37:
38: public static final int MFP_TADR = 0x00e8801f;
39: public static final int MFP_TBDR = 0x00e88021;
40: public static final int MFP_TCDR = 0x00e88023;
41: public static final int MFP_TDDR = 0x00e88025;
42: public static final int MFP_SYNC_CHAR = 0x00e88027;
43: public static final int MFP_UCR = 0x00e88029;
44: public static final int MFP_RSR = 0x00e8802b;
45: public static final int MFP_TSR = 0x00e8802d;
46: public static final int MFP_UDR = 0x00e8802f;
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64: public static final int MFP_GPIP_ALARM_LEVEL = 0;
65: public static final int MFP_GPIP_EXPWON_LEVEL = 1;
66: public static final int MFP_GPIP_POWER_LEVEL = 2;
67: public static final int MFP_GPIP_OPMIRQ_LEVEL = 3;
68: public static final int MFP_GPIP_VDISP_LEVEL = 4;
69: public static final int MFP_GPIP_RINT_LEVEL = 6;
70: public static final int MFP_GPIP_HSYNC_LEVEL = 7;
71:
72:
73: public static final int MFP_GPIP_ALARM_MASK = 1 << MFP_GPIP_ALARM_LEVEL;
74: public static final int MFP_GPIP_EXPWON_MASK = 1 << MFP_GPIP_EXPWON_LEVEL;
75: public static final int MFP_GPIP_POWER_MASK = 1 << MFP_GPIP_POWER_LEVEL;
76: public static final int MFP_GPIP_OPMIRQ_MASK = 1 << MFP_GPIP_OPMIRQ_LEVEL;
77: public static final int MFP_GPIP_VDISP_MASK = 1 << MFP_GPIP_VDISP_LEVEL;
78: public static final int MFP_GPIP_RINT_MASK = 1 << MFP_GPIP_RINT_LEVEL;
79: public static final int MFP_GPIP_HSYNC_MASK = 1 << MFP_GPIP_HSYNC_LEVEL;
80:
81:
82: public static final int MFP_ALARM_LEVEL = 0;
83: public static final int MFP_EXPWON_LEVEL = 1;
84: public static final int MFP_POWER_LEVEL = 2;
85: public static final int MFP_OPMIRQ_LEVEL = 3;
86: public static final int MFP_TIMER_D_LEVEL = 4;
87: public static final int MFP_TIMER_C_LEVEL = 5;
88: public static final int MFP_VDISP_LEVEL = 6;
89: public static final int MFP_TIMER_B_LEVEL = 8;
90: public static final int MFP_OUTPUT_ERROR_LEVEL = 9;
91: public static final int MFP_OUTPUT_EMPTY_LEVEL = 10;
92: public static final int MFP_INPUT_ERROR_LEVEL = 11;
93: public static final int MFP_INPUT_FULL_LEVEL = 12;
94: public static final int MFP_TIMER_A_LEVEL = 13;
95: public static final int MFP_RINT_LEVEL = 14;
96: public static final int MFP_HSYNC_LEVEL = 15;
97:
98:
99: public static final int MFP_ALARM_MASK = 1 << MFP_ALARM_LEVEL;
100: public static final int MFP_EXPWON_MASK = 1 << MFP_EXPWON_LEVEL;
101: public static final int MFP_POWER_MASK = 1 << MFP_POWER_LEVEL;
102: public static final int MFP_OPMIRQ_MASK = 1 << MFP_OPMIRQ_LEVEL;
103: public static final int MFP_TIMER_D_MASK = 1 << MFP_TIMER_D_LEVEL;
104: public static final int MFP_TIMER_C_MASK = 1 << MFP_TIMER_C_LEVEL;
105: public static final int MFP_VDISP_MASK = 1 << MFP_VDISP_LEVEL;
106: public static final int MFP_TIMER_B_MASK = 1 << MFP_TIMER_B_LEVEL;
107: public static final int MFP_OUTPUT_ERROR_MASK = 1 << MFP_OUTPUT_ERROR_LEVEL;
108: public static final int MFP_OUTPUT_EMPTY_MASK = 1 << MFP_OUTPUT_EMPTY_LEVEL;
109: public static final int MFP_INPUT_ERROR_MASK = 1 << MFP_INPUT_ERROR_LEVEL;
110: public static final int MFP_INPUT_FULL_MASK = 1 << MFP_INPUT_FULL_LEVEL;
111: public static final int MFP_TIMER_A_MASK = 1 << MFP_TIMER_A_LEVEL;
112: public static final int MFP_RINT_MASK = 1 << MFP_RINT_LEVEL;
113: public static final int MFP_HSYNC_MASK = 1 << MFP_HSYNC_LEVEL;
114:
115: public static final long MFP_OSC_FREQ = 4000000L;
116:
117:
118: public static final long MFP_DELTA[] = {
119: XEiJ.FAR_FUTURE,
120: 4 * XEiJ.TMR_FREQ / MFP_OSC_FREQ,
121: 10 * XEiJ.TMR_FREQ / MFP_OSC_FREQ,
122: 16 * XEiJ.TMR_FREQ / MFP_OSC_FREQ,
123: 50 * XEiJ.TMR_FREQ / MFP_OSC_FREQ,
124: 64 * XEiJ.TMR_FREQ / MFP_OSC_FREQ,
125: 100 * XEiJ.TMR_FREQ / MFP_OSC_FREQ,
126: 200 * XEiJ.TMR_FREQ / MFP_OSC_FREQ,
127: };
128:
129:
130: public static final int MFP_UDR_QUEUE_BITS = 4;
131: public static final int MFP_UDR_QUEUE_SIZE = 1 << MFP_UDR_QUEUE_BITS;
132: public static final int MFP_UDR_QUEUE_MASK = MFP_UDR_QUEUE_SIZE - 1;
133:
134:
135:
136:
137: public static int mfpGpipAlarm;
138: public static int mfpGpipExpwon;
139: public static int mfpGpipPower;
140: public static int mfpGpipOpmirq;
141: public static int mfpGpipVdisp;
142: public static int mfpGpipRint;
143: public static int mfpGpipHsync;
144:
145:
146:
147: public static int mfpAer;
148: public static int mfpIer;
149: public static int mfpImr;
150: public static int mfpVectorHigh;
151: public static int mfpTaPrescale;
152: public static int mfpTbPrescale;
153: public static int mfpTcPrescale;
154: public static int mfpTdPrescale;
155: public static boolean mfpTaEventcount;
156: public static boolean mfpTbEventcount;
157: public static int mfpTaInitial;
158: public static int mfpTbInitial;
159: public static int mfpTcInitial;
160: public static int mfpTdInitial;
161: public static int mfpTaCurrent;
162: public static int mfpTbCurrent;
163: public static int mfpTcCurrent;
164: public static int mfpTdCurrent;
165: public static boolean mfpTbKeyboardOn;
166:
167: public static int mfpUCR;
168:
169:
170:
171:
172:
173:
174:
175:
176:
177:
178:
179:
180:
181:
182:
183:
184:
185:
186:
187:
188:
189: public static int mfpRSR;
190:
191:
192:
193:
194:
195:
196:
197:
198:
199:
200:
201:
202:
203:
204:
205:
206: public static int mfpTSR;
207:
208:
209:
210:
211:
212:
213:
214:
215:
216:
217:
218:
219: public static long mfpTSRBufferFullTime;
220: public static long mfpTSRBufferFullEnd;
221:
222:
223:
224:
225: public static final int[] mfpInnerRequest = new int[16];
226: public static final int[] mfpInnerAcknowledged = new int[16];
227: public static final boolean[] mfpInnerInService = new boolean[16];
228: public static int mfpInnerLevel;
229:
230:
231: public static long mfpTaStart;
232: public static long mfpTbStart;
233: public static long mfpTcStart;
234: public static long mfpTdStart;
235: public static long mfpTaDelta;
236: public static long mfpTbDelta;
237: public static long mfpTcDelta;
238: public static long mfpTdDelta;
239: public static long mfpTaClock;
240: public static long mfpTbClock;
241: public static long mfpTcClock;
242: public static long mfpTdClock;
243:
244:
245:
246:
247:
248:
249: public static final int[] mfpUdrQueueArray = new int[MFP_UDR_QUEUE_SIZE];
250: public static volatile int mfpUdrQueueRead;
251: public static volatile int mfpUdrQueueWrite;
252:
253:
254:
255: public static void mfpInit () {
256:
257:
258:
259:
260: for (int i = 0; i < MFP_UDR_QUEUE_SIZE; i++) {
261: mfpUdrQueueArray[i] = 0;
262: }
263: mfpUdrQueueRead = 0;
264: mfpUdrQueueWrite = 0;
265: mfpReset ();
266: }
267:
268:
269: public static void mfpReset () {
270: mfpGpipAlarm = 0;
271: mfpGpipExpwon = MFP_GPIP_EXPWON_MASK;
272: mfpGpipPower = 0;
273: mfpGpipOpmirq = MFP_GPIP_OPMIRQ_MASK;
274: mfpGpipVdisp = 0;
275: mfpGpipRint = MFP_GPIP_RINT_MASK;
276: mfpGpipHsync = 0;
277: mfpAer = 0;
278: mfpIer = 0;
279: for (int i = 0; i < 16; i++) {
280: mfpInnerRequest[i] = 0;
281: mfpInnerAcknowledged[i] = 0;
282: mfpInnerInService[i] = false;
283: }
284: mfpImr = 0;
285: mfpVectorHigh = 0;
286: mfpTaPrescale = 0;
287: mfpTbPrescale = 0;
288: mfpTcPrescale = 0;
289: mfpTdPrescale = 0;
290: mfpTaEventcount = false;
291: mfpTbEventcount = false;
292: mfpTaInitial = 256;
293: mfpTbInitial = 256;
294: mfpTcInitial = 256;
295: mfpTdInitial = 256;
296: mfpTaCurrent = 0;
297: mfpTbCurrent = 0;
298: mfpTcCurrent = 0;
299: mfpTdCurrent = 0;
300: mfpTaStart = 0L;
301: mfpTbStart = 0L;
302: mfpTcStart = 0L;
303: mfpTdStart = 0L;
304: mfpTaClock = XEiJ.FAR_FUTURE;
305: mfpTbClock = XEiJ.FAR_FUTURE;
306: mfpTcClock = XEiJ.FAR_FUTURE;
307: mfpTdClock = XEiJ.FAR_FUTURE;
308: mfpUCR = 0x88;
309: mfpRSR = 0x01;
310: mfpTSR = 0x01;
311: mfpTSRBufferFullTime = 0L;
312: mfpTSRBufferFullEnd = 0L;
313: if (MFP_KBD_ON) {
314:
315: mfpKbdReadPointer = 0;
316: mfpKbdWritePointer = 0;
317: mfpKbdLastData = 0;
318: mfpTkClock = XEiJ.FAR_FUTURE;
319:
320: }
321: TickerQueue.tkqRemove (mfpTaTicker);
322: TickerQueue.tkqRemove (mfpTbTicker);
323: TickerQueue.tkqRemove (mfpTcTicker);
324: TickerQueue.tkqRemove (mfpTdTicker);
325: TickerQueue.tkqRemove (mfpTkTicker);
326: }
327:
328:
329:
330:
331:
332:
333:
334:
335:
336:
337:
338:
339:
340:
341:
342:
343:
344:
345: public static int mfpAcknowledge () {
346: for (int i = 15; i >= 0; i--) {
347: if ((mfpImr & 1 << i) != 0) {
348: int request = mfpInnerRequest[i];
349: if (mfpInnerAcknowledged[i] != request) {
350: mfpInnerAcknowledged[i] = request;
351: mfpInnerInService[mfpInnerLevel = i] = true;
352: return mfpVectorHigh + i;
353: }
354: }
355: }
356: return 0;
357: }
358:
359:
360:
361:
362: public static void mfpDone () {
363: mfpInnerInService[mfpInnerLevel] = false;
364: for (int i = 15; i >= 0; i--) {
365: if ((mfpImr & 1 << i) != 0 && mfpInnerAcknowledged[i] != mfpInnerRequest[i]) {
366: if (MFP_DELAYED_INTERRUPT) {
367: XEiJ.mpuDIRR |= XEiJ.MPU_MFP_INTERRUPT_MASK;
368: } else {
369: XEiJ.mpuIRR |= XEiJ.MPU_MFP_INTERRUPT_MASK;
370: }
371: return;
372: }
373: }
374: }
375:
376:
377:
378:
379: public static void mfpKeyboardInput (int scanCode) {
380: if (!mfpTbKeyboardOn) {
381: return;
382: }
383: scanCode &= 0xff;
384: if (mfpUdrQueueWrite + 1 != mfpUdrQueueRead) {
385: mfpUdrQueueWrite = mfpUdrQueueWrite + 1;
386: mfpUdrQueueArray[mfpUdrQueueWrite & MFP_UDR_QUEUE_MASK] = scanCode;
387: if ((mfpIer & MFP_INPUT_FULL_MASK) != 0) {
388: mfpInnerRequest[MFP_INPUT_FULL_LEVEL]++;
389: if ((mfpImr & MFP_INPUT_FULL_MASK) != 0) {
390: if (MFP_DELAYED_INTERRUPT) {
391: XEiJ.mpuDIRR |= XEiJ.MPU_MFP_INTERRUPT_MASK;
392: } else {
393: XEiJ.mpuIRR |= XEiJ.MPU_MFP_INTERRUPT_MASK;
394: }
395: }
396: }
397: }
398: }
399:
400:
401:
402: public static final TickerQueue.Ticker mfpTaTicker = new TickerQueue.Ticker () {
403: @Override protected void tick () {
404: if ((mfpIer & MFP_TIMER_A_MASK) != 0) {
405: mfpInnerRequest[MFP_TIMER_A_LEVEL]++;
406: if ((mfpImr & MFP_TIMER_A_MASK) != 0) {
407: if (MFP_DELAYED_INTERRUPT) {
408: XEiJ.mpuDIRR |= XEiJ.MPU_MFP_INTERRUPT_MASK;
409: } else {
410: XEiJ.mpuIRR |= XEiJ.MPU_MFP_INTERRUPT_MASK;
411: }
412: }
413: }
414: mfpTaClock += mfpTaDelta * mfpTaInitial;
415: TickerQueue.tkqAdd (mfpTaTicker, mfpTaClock);
416: }
417: };
418:
419:
420: public static final TickerQueue.Ticker mfpTbTicker = new TickerQueue.Ticker () {
421: @Override protected void tick () {
422: if ((mfpIer & MFP_TIMER_B_MASK) != 0) {
423: mfpInnerRequest[MFP_TIMER_B_LEVEL]++;
424: if ((mfpImr & MFP_TIMER_B_MASK) != 0) {
425: if (MFP_DELAYED_INTERRUPT) {
426: XEiJ.mpuDIRR |= XEiJ.MPU_MFP_INTERRUPT_MASK;
427: } else {
428: XEiJ.mpuIRR |= XEiJ.MPU_MFP_INTERRUPT_MASK;
429: }
430: }
431: }
432: mfpTbClock += mfpTbDelta * mfpTbInitial;
433: TickerQueue.tkqAdd (mfpTbTicker, mfpTbClock);
434: }
435: };
436:
437:
438: public static final TickerQueue.Ticker mfpTcTicker = new TickerQueue.Ticker () {
439: @Override protected void tick () {
440: if ((mfpIer & MFP_TIMER_C_MASK) != 0) {
441: mfpInnerRequest[MFP_TIMER_C_LEVEL]++;
442: if ((mfpImr & MFP_TIMER_C_MASK) != 0) {
443: if (MFP_DELAYED_INTERRUPT) {
444: XEiJ.mpuDIRR |= XEiJ.MPU_MFP_INTERRUPT_MASK;
445: } else {
446: XEiJ.mpuIRR |= XEiJ.MPU_MFP_INTERRUPT_MASK;
447: }
448: }
449: }
450: mfpTcClock += mfpTcDelta * mfpTcInitial;
451: TickerQueue.tkqAdd (mfpTcTicker, mfpTcClock);
452: }
453: };
454:
455:
456: public static final TickerQueue.Ticker mfpTdTicker = new TickerQueue.Ticker () {
457: @Override protected void tick () {
458: if ((mfpIer & MFP_TIMER_D_MASK) != 0) {
459: mfpInnerRequest[MFP_TIMER_D_LEVEL]++;
460: if ((mfpImr & MFP_TIMER_D_MASK) != 0) {
461: if (MFP_DELAYED_INTERRUPT) {
462: XEiJ.mpuDIRR |= XEiJ.MPU_MFP_INTERRUPT_MASK;
463: } else {
464: XEiJ.mpuIRR |= XEiJ.MPU_MFP_INTERRUPT_MASK;
465: }
466: }
467: }
468: mfpTdClock += mfpTdDelta * mfpTdInitial;
469: TickerQueue.tkqAdd (mfpTdTicker, mfpTdClock);
470: }
471: };
472:
473:
474: public static final TickerQueue.Ticker mfpTkTicker = new TickerQueue.Ticker () {
475: @Override protected void tick () {
476: if (MFP_KBD_ON) {
477:
478:
479: long time = System.currentTimeMillis () - 10L;
480: if (time < mfpTkTime) {
481: mfpTkClock = XEiJ.mpuClockTime + XEiJ.TMR_FREQ / 1000 * (mfpTkTime - time);
482: TickerQueue.tkqAdd (mfpTkTicker, mfpTkClock);
483: } else {
484: if (mfpTbKeyboardOn) {
485: if (mfpKbdReadPointer != mfpKbdWritePointer) {
486: if ((mfpIer & MFP_INPUT_FULL_MASK) != 0) {
487: mfpInnerRequest[MFP_INPUT_FULL_LEVEL]++;
488: if ((mfpImr & MFP_INPUT_FULL_MASK) != 0) {
489:
490: if (MFP_DELAYED_INTERRUPT) {
491: XEiJ.mpuDIRR |= XEiJ.MPU_MFP_INTERRUPT_MASK;
492: } else {
493: XEiJ.mpuIRR |= XEiJ.MPU_MFP_INTERRUPT_MASK;
494: }
495: }
496: }
497: }
498: }
499: mfpTkClock = XEiJ.FAR_FUTURE;
500: TickerQueue.tkqRemove (mfpTkTicker);
501:
502: }
503: }
504: }
505: };
506:
507:
508:
509:
510:
511: public static void mfpAlarmRise () {
512: if (mfpGpipAlarm == 0) {
513: mfpGpipAlarm = MFP_GPIP_ALARM_MASK;
514: if ((mfpAer & MFP_GPIP_ALARM_MASK) != 0 && (mfpIer & MFP_ALARM_MASK) != 0) {
515: mfpInnerRequest[MFP_ALARM_LEVEL]++;
516: if ((mfpImr & MFP_ALARM_MASK) != 0) {
517: if (MFP_DELAYED_INTERRUPT) {
518: XEiJ.mpuDIRR |= XEiJ.MPU_MFP_INTERRUPT_MASK;
519: } else {
520: XEiJ.mpuIRR |= XEiJ.MPU_MFP_INTERRUPT_MASK;
521: }
522: }
523: }
524: }
525: }
526: public static void mfpAlarmFall () {
527: if (mfpGpipAlarm != 0) {
528: mfpGpipAlarm = 0;
529: if ((mfpAer & MFP_GPIP_ALARM_MASK) == 0 && (mfpIer & MFP_ALARM_MASK) != 0) {
530: mfpInnerRequest[MFP_ALARM_LEVEL]++;
531: if ((mfpImr & MFP_ALARM_MASK) != 0) {
532: if (MFP_DELAYED_INTERRUPT) {
533: XEiJ.mpuDIRR |= XEiJ.MPU_MFP_INTERRUPT_MASK;
534: } else {
535: XEiJ.mpuIRR |= XEiJ.MPU_MFP_INTERRUPT_MASK;
536: }
537: }
538: }
539: }
540: }
541:
542:
543: public static void mfpExpwonRise () {
544: if (mfpGpipExpwon == 0) {
545: mfpGpipExpwon = MFP_GPIP_EXPWON_MASK;
546: if ((mfpAer & MFP_GPIP_EXPWON_MASK) != 0 && (mfpIer & MFP_EXPWON_MASK) != 0) {
547: mfpInnerRequest[MFP_EXPWON_LEVEL]++;
548: if ((mfpImr & MFP_EXPWON_MASK) != 0) {
549: if (MFP_DELAYED_INTERRUPT) {
550: XEiJ.mpuDIRR |= XEiJ.MPU_MFP_INTERRUPT_MASK;
551: } else {
552: XEiJ.mpuIRR |= XEiJ.MPU_MFP_INTERRUPT_MASK;
553: }
554: }
555: }
556: }
557: }
558: public static void mfpExpwonFall () {
559: if (mfpGpipExpwon != 0) {
560: mfpGpipExpwon = 0;
561: if ((mfpAer & MFP_GPIP_EXPWON_MASK) == 0 && (mfpIer & MFP_EXPWON_MASK) != 0) {
562: mfpInnerRequest[MFP_EXPWON_LEVEL]++;
563: if ((mfpImr & MFP_EXPWON_MASK) != 0) {
564: if (MFP_DELAYED_INTERRUPT) {
565: XEiJ.mpuDIRR |= XEiJ.MPU_MFP_INTERRUPT_MASK;
566: } else {
567: XEiJ.mpuIRR |= XEiJ.MPU_MFP_INTERRUPT_MASK;
568: }
569: }
570: }
571: }
572: }
573:
574:
575: public static void mfpPowerRise () {
576: if (mfpGpipPower == 0) {
577: mfpGpipPower = MFP_GPIP_POWER_MASK;
578: if ((mfpAer & MFP_GPIP_POWER_MASK) != 0 && (mfpIer & MFP_POWER_MASK) != 0) {
579: mfpInnerRequest[MFP_POWER_LEVEL]++;
580: if ((mfpImr & MFP_POWER_MASK) != 0) {
581: if (MFP_DELAYED_INTERRUPT) {
582: XEiJ.mpuDIRR |= XEiJ.MPU_MFP_INTERRUPT_MASK;
583: } else {
584: XEiJ.mpuIRR |= XEiJ.MPU_MFP_INTERRUPT_MASK;
585: }
586: }
587: }
588: }
589: }
590: public static void mfpPowerFall () {
591: if (mfpGpipPower != 0) {
592: mfpGpipPower = 0;
593: if ((mfpAer & MFP_GPIP_POWER_MASK) == 0 && (mfpIer & MFP_POWER_MASK) != 0) {
594: mfpInnerRequest[MFP_POWER_LEVEL]++;
595: if ((mfpImr & MFP_POWER_MASK) != 0) {
596: if (MFP_DELAYED_INTERRUPT) {
597: XEiJ.mpuDIRR |= XEiJ.MPU_MFP_INTERRUPT_MASK;
598: } else {
599: XEiJ.mpuIRR |= XEiJ.MPU_MFP_INTERRUPT_MASK;
600: }
601: }
602: }
603: }
604: }
605:
606:
607: public static void mfpOpmirqRise () {
608: if (mfpGpipOpmirq == 0) {
609: mfpGpipOpmirq = MFP_GPIP_OPMIRQ_MASK;
610: if ((mfpAer & MFP_GPIP_OPMIRQ_MASK) != 0 && (mfpIer & MFP_OPMIRQ_MASK) != 0) {
611: mfpInnerRequest[MFP_OPMIRQ_LEVEL]++;
612: if ((mfpImr & MFP_OPMIRQ_MASK) != 0) {
613: if (MFP_DELAYED_INTERRUPT) {
614: XEiJ.mpuDIRR |= XEiJ.MPU_MFP_INTERRUPT_MASK;
615: } else {
616: XEiJ.mpuIRR |= XEiJ.MPU_MFP_INTERRUPT_MASK;
617: }
618: }
619: }
620: }
621: }
622: public static void mfpOpmirqFall () {
623: if (mfpGpipOpmirq != 0) {
624: mfpGpipOpmirq = 0;
625: if ((mfpAer & MFP_GPIP_OPMIRQ_MASK) == 0 && (mfpIer & MFP_OPMIRQ_MASK) != 0) {
626: mfpInnerRequest[MFP_OPMIRQ_LEVEL]++;
627: if ((mfpImr & MFP_OPMIRQ_MASK) != 0) {
628: if (MFP_DELAYED_INTERRUPT) {
629: XEiJ.mpuDIRR |= XEiJ.MPU_MFP_INTERRUPT_MASK;
630: } else {
631: XEiJ.mpuIRR |= XEiJ.MPU_MFP_INTERRUPT_MASK;
632: }
633: }
634: }
635: }
636: }
637:
638:
639: public static void mfpVdispRise () {
640:
641: mfpGpipVdisp = MFP_GPIP_VDISP_MASK;
642: if ((mfpAer & MFP_GPIP_VDISP_MASK) != 0) {
643: if ((mfpIer & MFP_VDISP_MASK) != 0) {
644: mfpInnerRequest[MFP_VDISP_LEVEL]++;
645: if ((mfpImr & MFP_VDISP_MASK) != 0) {
646: if (MFP_DELAYED_INTERRUPT) {
647: XEiJ.mpuDIRR |= XEiJ.MPU_MFP_INTERRUPT_MASK;
648: } else {
649: XEiJ.mpuIRR |= XEiJ.MPU_MFP_INTERRUPT_MASK;
650: }
651: }
652: }
653: if (mfpTaEventcount && --mfpTaCurrent <= 0) {
654: mfpTaCurrent = mfpTaInitial;
655: if ((mfpIer & MFP_TIMER_A_MASK) != 0) {
656: mfpInnerRequest[MFP_TIMER_A_LEVEL]++;
657: if ((mfpImr & MFP_TIMER_A_MASK) != 0) {
658: if (MFP_DELAYED_INTERRUPT) {
659: XEiJ.mpuDIRR |= XEiJ.MPU_MFP_INTERRUPT_MASK;
660: } else {
661: XEiJ.mpuIRR |= XEiJ.MPU_MFP_INTERRUPT_MASK;
662: }
663: }
664: }
665: }
666: }
667:
668: }
669: public static void mfpVdispFall () {
670:
671: mfpGpipVdisp = 0;
672: if ((mfpAer & MFP_GPIP_VDISP_MASK) == 0) {
673: if ((mfpIer & MFP_VDISP_MASK) != 0) {
674: mfpInnerRequest[MFP_VDISP_LEVEL]++;
675: if ((mfpImr & MFP_VDISP_MASK) != 0) {
676: if (MFP_DELAYED_INTERRUPT) {
677: XEiJ.mpuDIRR |= XEiJ.MPU_MFP_INTERRUPT_MASK;
678: } else {
679: XEiJ.mpuIRR |= XEiJ.MPU_MFP_INTERRUPT_MASK;
680: }
681: }
682: }
683: if (mfpTaEventcount && --mfpTaCurrent <= 0) {
684: mfpTaCurrent = mfpTaInitial;
685: if ((mfpIer & MFP_TIMER_A_MASK) != 0) {
686: mfpInnerRequest[MFP_TIMER_A_LEVEL]++;
687: if ((mfpImr & MFP_TIMER_A_MASK) != 0) {
688: if (MFP_DELAYED_INTERRUPT) {
689: XEiJ.mpuDIRR |= XEiJ.MPU_MFP_INTERRUPT_MASK;
690: } else {
691: XEiJ.mpuIRR |= XEiJ.MPU_MFP_INTERRUPT_MASK;
692: }
693: }
694: }
695: }
696: }
697:
698: }
699:
700:
701: public static void mfpRintRise () {
702:
703: mfpGpipRint = MFP_GPIP_RINT_MASK;
704: if ((mfpAer & MFP_GPIP_RINT_MASK) != 0 && (mfpIer & MFP_RINT_MASK) != 0) {
705: mfpInnerRequest[MFP_RINT_LEVEL]++;
706: if ((mfpImr & MFP_RINT_MASK) != 0) {
707: if (MFP_DELAYED_INTERRUPT) {
708: XEiJ.mpuDIRR |= XEiJ.MPU_MFP_INTERRUPT_MASK;
709: } else {
710: XEiJ.mpuIRR |= XEiJ.MPU_MFP_INTERRUPT_MASK;
711: }
712: }
713: }
714:
715: }
716: public static void mfpRintFall () {
717:
718: mfpGpipRint = 0;
719: if ((mfpAer & MFP_GPIP_RINT_MASK) == 0 && (mfpIer & MFP_RINT_MASK) != 0) {
720: mfpInnerRequest[MFP_RINT_LEVEL]++;
721: if ((mfpImr & MFP_RINT_MASK) != 0) {
722: if (MFP_DELAYED_INTERRUPT) {
723: XEiJ.mpuDIRR |= XEiJ.MPU_MFP_INTERRUPT_MASK;
724: } else {
725: XEiJ.mpuIRR |= XEiJ.MPU_MFP_INTERRUPT_MASK;
726: }
727: }
728: }
729:
730: }
731:
732:
733: public static void mfpHsyncRise () {
734:
735: mfpGpipHsync = MFP_GPIP_HSYNC_MASK;
736: if ((mfpAer & MFP_GPIP_HSYNC_MASK) != 0 && (mfpIer & MFP_HSYNC_MASK) != 0) {
737: mfpInnerRequest[MFP_HSYNC_LEVEL]++;
738: if ((mfpImr & MFP_HSYNC_MASK) != 0) {
739: if (MFP_DELAYED_INTERRUPT) {
740: XEiJ.mpuDIRR |= XEiJ.MPU_MFP_INTERRUPT_MASK;
741: } else {
742: XEiJ.mpuIRR |= XEiJ.MPU_MFP_INTERRUPT_MASK;
743: }
744: }
745: }
746:
747: }
748: public static void mfpHsyncFall () {
749:
750: mfpGpipHsync = 0;
751: if ((mfpAer & MFP_GPIP_HSYNC_MASK) == 0 && (mfpIer & MFP_HSYNC_MASK) != 0) {
752: mfpInnerRequest[MFP_HSYNC_LEVEL]++;
753: if ((mfpImr & MFP_HSYNC_MASK) != 0) {
754: if (MFP_DELAYED_INTERRUPT) {
755: XEiJ.mpuDIRR |= XEiJ.MPU_MFP_INTERRUPT_MASK;
756: } else {
757: XEiJ.mpuIRR |= XEiJ.MPU_MFP_INTERRUPT_MASK;
758: }
759: }
760: }
761:
762: }
763:
764:
765:
766:
767:
768:
769:
770:
771:
772:
773:
774:
775:
776:
777:
778:
779:
780:
781:
782:
783:
784:
785:
786:
787:
788:
789:
790:
791:
792:
793:
794:
795:
796:
797:
798:
799:
800:
801:
802:
803:
804:
805:
806:
807:
808:
809:
810:
811:
812:
813:
814:
815:
816: public static final boolean MFP_KBD_ON = false;
817: public static final int MFP_KBD_SIZE = 256;
818: public static final int MFP_KBD_MASK = MFP_KBD_SIZE - 1;
819: public static final int[] mfpKbdBuffer = new int[MFP_KBD_SIZE];
820: public static volatile int mfpKbdReadPointer;
821: public static volatile int mfpKbdWritePointer;
822: public static int mfpKbdLastData;
823: public static long mfpTkClock;
824: public static long mfpTkTime;
825:
826:
827:
828:
829:
830:
831:
832: public static void mfpKbdInput (int data, boolean repeat) {
833: if (!mfpTbKeyboardOn) {
834: return;
835: }
836: int w = mfpKbdWritePointer;
837: if (w + 1 != mfpKbdReadPointer) {
838: mfpKbdBuffer[w & MFP_KBD_MASK] = (repeat ? 0x00010000 : 0x00000000) | data;
839: mfpKbdWritePointer = w + 1;
840: if ((mfpIer & MFP_INPUT_FULL_MASK) != 0) {
841: mfpInnerRequest[MFP_INPUT_FULL_LEVEL]++;
842: if ((mfpImr & MFP_INPUT_FULL_MASK) != 0) {
843:
844: if (MFP_DELAYED_INTERRUPT) {
845: XEiJ.mpuDIRR |= XEiJ.MPU_MFP_INTERRUPT_MASK;
846: } else {
847: XEiJ.mpuIRR |= XEiJ.MPU_MFP_INTERRUPT_MASK;
848: }
849: }
850: }
851: }
852: }
853:
854:
855:
856: public static int mfpKbdReadData () {
857: int r = mfpKbdReadPointer;
858: int w = mfpKbdWritePointer;
859: if (r != w) {
860: int s = mfpKbdBuffer[r & MFP_KBD_MASK];
861: if (r + 1 != w && s < 0) {
862: mfpKbdReadPointer = r = r + 1;
863: s = mfpKbdBuffer[r & MFP_KBD_MASK];
864: }
865: mfpKbdLastData = (char) s;
866: if (r + 1 != w) {
867: mfpKbdReadPointer = r + 1;
868: if ((mfpIer & MFP_INPUT_FULL_MASK) != 0) {
869: mfpInnerRequest[MFP_INPUT_FULL_LEVEL]++;
870: if ((mfpImr & MFP_INPUT_FULL_MASK) != 0) {
871:
872: if (MFP_DELAYED_INTERRUPT) {
873: XEiJ.mpuDIRR |= XEiJ.MPU_MFP_INTERRUPT_MASK;
874: } else {
875: XEiJ.mpuIRR |= XEiJ.MPU_MFP_INTERRUPT_MASK;
876: }
877: }
878: }
879: } else if ((s >> 16) == 0x0000) {
880: mfpKbdReadPointer = r + 1;
881: } else if ((s >> 16) == 0x0001) {
882: mfpKbdBuffer[r & MFP_KBD_MASK] = 0xffff0000 | s;
883: if (mfpTkTicker.time == Long.MAX_VALUE &&
884: (mfpIer & MFP_INPUT_FULL_MASK) != 0) {
885: mfpTkClock = XEiJ.mpuClockTime + XEiJ.TMR_FREQ / 1000 * Keyboard.kbdRepeatDelay;
886: TickerQueue.tkqAdd (mfpTkTicker, mfpTkClock);
887: mfpTkTime = System.currentTimeMillis () + Keyboard.kbdRepeatDelay;
888: }
889: } else {
890: if (mfpTkTicker.time == Long.MAX_VALUE &&
891: (mfpIer & MFP_INPUT_FULL_MASK) != 0) {
892: mfpTkClock = XEiJ.mpuClockTime + XEiJ.TMR_FREQ / 1000 * Keyboard.kbdRepeatInterval;
893: TickerQueue.tkqAdd (mfpTkTicker, mfpTkClock);
894: mfpTkTime = System.currentTimeMillis () + Keyboard.kbdRepeatInterval;
895: }
896: }
897: }
898: return mfpKbdLastData;
899: }
900:
901:
902:
903:
904: public static int mfpPeekByte (int a) {
905: try {
906: return (a & (XEiJ.BUS_MOTHER_MASK & 0xffff803f)) == MFP_UDR ? mfpUdrQueueArray[mfpUdrQueueRead & MFP_UDR_QUEUE_MASK] : mfpReadByte (a);
907: } catch (M68kException e) {
908: }
909: return 0;
910: }
911:
912:
913: public static int mfpReadByte (int a) throws M68kException {
914: XEiJ.mpuClockTime += XEiJ.busWaitTime.mfp;
915: switch (a & (XEiJ.BUS_MOTHER_MASK & 0xffff803f)) {
916: case MFP_GPIP_DATA:
917: return mfpGpipHsync | mfpGpipRint | 0b00100000 | mfpGpipVdisp | mfpGpipOpmirq | mfpGpipPower | mfpGpipExpwon | mfpGpipAlarm;
918: case MFP_AER:
919: return mfpAer;
920: case MFP_DDR:
921: return 0x00;
922: case MFP_IERA:
923: return mfpIer >>> 8;
924: case MFP_IERB:
925: return mfpIer & 0xff;
926: case MFP_IPRA:
927: return ((mfpInnerRequest[15] != mfpInnerAcknowledged[15] ? 0b10000000 : 0) |
928: (mfpInnerRequest[14] != mfpInnerAcknowledged[14] ? 0b01000000 : 0) |
929: (mfpInnerRequest[13] != mfpInnerAcknowledged[13] ? 0b00100000 : 0) |
930: (mfpInnerRequest[12] != mfpInnerAcknowledged[12] ? 0b00010000 : 0) |
931: (mfpInnerRequest[11] != mfpInnerAcknowledged[11] ? 0b00001000 : 0) |
932: (mfpInnerRequest[10] != mfpInnerAcknowledged[10] ? 0b00000100 : 0) |
933: (mfpInnerRequest[ 9] != mfpInnerAcknowledged[ 9] ? 0b00000010 : 0) |
934: (mfpInnerRequest[ 8] != mfpInnerAcknowledged[ 8] ? 0b00000001 : 0));
935: case MFP_IPRB:
936: return ((mfpInnerRequest[ 7] != mfpInnerAcknowledged[ 7] ? 0b10000000 : 0) |
937: (mfpInnerRequest[ 6] != mfpInnerAcknowledged[ 6] ? 0b01000000 : 0) |
938: (mfpInnerRequest[ 5] != mfpInnerAcknowledged[ 5] ? 0b00100000 : 0) |
939: (mfpInnerRequest[ 4] != mfpInnerAcknowledged[ 4] ? 0b00010000 : 0) |
940: (mfpInnerRequest[ 3] != mfpInnerAcknowledged[ 3] ? 0b00001000 : 0) |
941: (mfpInnerRequest[ 2] != mfpInnerAcknowledged[ 2] ? 0b00000100 : 0) |
942: (mfpInnerRequest[ 1] != mfpInnerAcknowledged[ 1] ? 0b00000010 : 0) |
943: (mfpInnerRequest[ 0] != mfpInnerAcknowledged[ 0] ? 0b00000001 : 0));
944: case MFP_ISRA:
945: return ((mfpInnerInService[15] ? 0b10000000 : 0) |
946: (mfpInnerInService[14] ? 0b01000000 : 0) |
947: (mfpInnerInService[13] ? 0b00100000 : 0) |
948: (mfpInnerInService[12] ? 0b00010000 : 0) |
949: (mfpInnerInService[11] ? 0b00001000 : 0) |
950: (mfpInnerInService[10] ? 0b00000100 : 0) |
951: (mfpInnerInService[ 9] ? 0b00000010 : 0) |
952: (mfpInnerInService[ 8] ? 0b00000001 : 0));
953: case MFP_ISRB:
954: return ((mfpInnerInService[ 7] ? 0b10000000 : 0) |
955: (mfpInnerInService[ 6] ? 0b01000000 : 0) |
956: (mfpInnerInService[ 5] ? 0b00100000 : 0) |
957: (mfpInnerInService[ 4] ? 0b00010000 : 0) |
958: (mfpInnerInService[ 3] ? 0b00001000 : 0) |
959: (mfpInnerInService[ 2] ? 0b00000100 : 0) |
960: (mfpInnerInService[ 1] ? 0b00000010 : 0) |
961: (mfpInnerInService[ 0] ? 0b00000001 : 0));
962: case MFP_IMRA:
963: return mfpImr >>> 8;
964: case MFP_IMRB:
965: return mfpImr & 0xff;
966: case MFP_VECTOR:
967: return mfpVectorHigh;
968: case MFP_TACR:
969: return (mfpTaEventcount ? 0x08 : 0) | mfpTaPrescale;
970: case MFP_TBCR:
971: return (mfpTbEventcount ? 0x08 : 0) | mfpTbPrescale;
972: case MFP_TCDCR:
973: return mfpTcPrescale << 4 | mfpTdPrescale;
974: case MFP_TADR:
975: if (mfpTaEventcount || mfpTaPrescale == 0) {
976: return mfpTaCurrent & 0xff;
977: }
978: return mfpTaInitial - (int) (Math.floor ((double) (XEiJ.mpuClockTime - mfpTaStart) / mfpTaDelta) % mfpTaInitial) & 0xff;
979: case MFP_TBDR:
980: if (mfpTbEventcount || mfpTbPrescale == 0) {
981: return mfpTbCurrent & 0xff;
982: }
983: return mfpTbInitial - (int) (Math.floor ((double) (XEiJ.mpuClockTime - mfpTbStart) / mfpTbDelta) % mfpTbInitial) & 0xff;
984: case MFP_TCDR:
985: if (mfpTcPrescale == 0) {
986: return mfpTcCurrent & 0xff;
987: }
988: return mfpTcInitial - (int) (Math.floor ((double) (XEiJ.mpuClockTime - mfpTcStart) / mfpTcDelta) % mfpTcInitial) & 0xff;
989: case MFP_TDDR:
990: if (mfpTdPrescale == 0) {
991: return mfpTdCurrent & 0xff;
992: }
993: return mfpTdInitial - (int) (Math.floor ((double) (XEiJ.mpuClockTime - mfpTdStart) / mfpTdDelta) % mfpTdInitial) & 0xff;
994: case MFP_SYNC_CHAR:
995: return 0;
996: case MFP_UCR:
997: return mfpUCR;
998: case MFP_RSR:
999: if (MFP_KBD_ON) {
1000: return (mfpRSR |
1001: (mfpKbdReadPointer == mfpKbdWritePointer ? 0 : 0x80));
1002: } else {
1003: return (mfpRSR |
1004: (mfpUdrQueueRead == mfpUdrQueueWrite ? 0 : 0x80));
1005: }
1006: case MFP_TSR:
1007: return (mfpTSR |
1008: (XEiJ.mpuClockTime < mfpTSRBufferFullEnd ? 0 : 0x80));
1009: case MFP_UDR:
1010: if (MFP_KBD_ON) {
1011: return mfpKbdReadData ();
1012: } else {
1013: if (mfpUdrQueueRead != mfpUdrQueueWrite) {
1014: mfpUdrQueueRead = mfpUdrQueueRead + 1;
1015: if (mfpUdrQueueRead != mfpUdrQueueWrite) {
1016: if ((mfpIer & MFP_INPUT_FULL_MASK) != 0) {
1017: mfpInnerRequest[MFP_INPUT_FULL_LEVEL]++;
1018: if ((mfpImr & MFP_INPUT_FULL_MASK) != 0) {
1019: if (MFP_DELAYED_INTERRUPT) {
1020: XEiJ.mpuDIRR |= XEiJ.MPU_MFP_INTERRUPT_MASK;
1021: } else {
1022: XEiJ.mpuIRR |= XEiJ.MPU_MFP_INTERRUPT_MASK;
1023: }
1024: }
1025: }
1026: }
1027: }
1028: return mfpUdrQueueArray[mfpUdrQueueRead & MFP_UDR_QUEUE_MASK];
1029: }
1030: default:
1031: if ((a & 1) == 0 &&
1032: !XEiJ.currentIsSecond) {
1033: return MemoryMappedDevice.MMD_NUL.mmdRbz (a);
1034: }
1035: return 0xff;
1036: }
1037: }
1038:
1039:
1040: public static void mfpWriteByte (int a, int d) throws M68kException {
1041: XEiJ.mpuClockTime += XEiJ.busWaitTime.mfp;
1042: switch (a & (XEiJ.BUS_MOTHER_MASK & 0xffff803f)) {
1043: case MFP_GPIP_DATA:
1044: return;
1045: case MFP_AER:
1046: mfpAer = d & 0xff;
1047: return;
1048: case MFP_DDR:
1049: return;
1050: case MFP_IERA:
1051: d = (char) (d << 8);
1052: int oldIera = mfpIer;
1053: mfpIer = d | (mfpIer & 0xff);
1054:
1055: if ((short) d >= 0) {
1056: mfpInnerAcknowledged[15] = mfpInnerRequest[15];
1057: }
1058: if (d << 31 - 14 >= 0) {
1059: mfpInnerAcknowledged[14] = mfpInnerRequest[14];
1060: }
1061: if (d << 31 - 13 >= 0) {
1062: mfpInnerAcknowledged[13] = mfpInnerRequest[13];
1063: }
1064: if (d << 31 - 12 >= 0) {
1065: mfpInnerAcknowledged[12] = mfpInnerRequest[12];
1066: } else if (oldIera << 31 - 12 >= 0 &&
1067: (MFP_KBD_ON ?
1068: mfpKbdReadPointer != mfpKbdWritePointer :
1069: mfpUdrQueueRead != mfpUdrQueueWrite)) {
1070: mfpInnerRequest[MFP_INPUT_FULL_LEVEL]++;
1071: if ((mfpImr & MFP_INPUT_FULL_MASK) != 0) {
1072:
1073: if (MFP_DELAYED_INTERRUPT) {
1074: XEiJ.mpuDIRR |= XEiJ.MPU_MFP_INTERRUPT_MASK;
1075: } else {
1076: XEiJ.mpuIRR |= XEiJ.MPU_MFP_INTERRUPT_MASK;
1077: }
1078: }
1079: }
1080: if (d << 31 - 11 >= 0) {
1081: mfpInnerAcknowledged[11] = mfpInnerRequest[11];
1082: }
1083: if (d << 31 - 10 >= 0) {
1084: mfpInnerAcknowledged[10] = mfpInnerRequest[10];
1085: }
1086: if (d << 31 - 9 >= 0) {
1087: mfpInnerAcknowledged[ 9] = mfpInnerRequest[ 9];
1088: }
1089: if (d << 31 - 8 >= 0) {
1090: mfpInnerAcknowledged[ 8] = mfpInnerRequest[ 8];
1091: }
1092: return;
1093: case MFP_IERB:
1094: mfpIer = (mfpIer & ~0xff) | (d & 0xff);
1095:
1096: if ((byte) d >= 0) {
1097: mfpInnerAcknowledged[ 7] = mfpInnerRequest[ 7];
1098: }
1099: if (d << 31 - 6 >= 0) {
1100: mfpInnerAcknowledged[ 6] = mfpInnerRequest[ 6];
1101: }
1102: if (d << 31 - 5 >= 0) {
1103: mfpInnerAcknowledged[ 5] = mfpInnerRequest[ 5];
1104: }
1105: if (d << 31 - 4 >= 0) {
1106: mfpInnerAcknowledged[ 4] = mfpInnerRequest[ 4];
1107: }
1108: if (XEiJ.TEST_BIT_3_SHIFT ? d << 31 - 3 >= 0 : (d & 8) == 0) {
1109: mfpInnerAcknowledged[ 3] = mfpInnerRequest[ 3];
1110: }
1111: if (XEiJ.TEST_BIT_2_SHIFT ? d << 31 - 2 >= 0 : (d & 4) == 0) {
1112: mfpInnerAcknowledged[ 2] = mfpInnerRequest[ 2];
1113: }
1114: if (XEiJ.TEST_BIT_1_SHIFT ? d << 31 - 1 >= 0 : (d & 2) == 0) {
1115: mfpInnerAcknowledged[ 1] = mfpInnerRequest[ 1];
1116: }
1117: if (XEiJ.TEST_BIT_0_SHIFT ? d << 31 - 0 >= 0 : (d & 1) == 0) {
1118: mfpInnerAcknowledged[ 0] = mfpInnerRequest[ 0];
1119: }
1120: return;
1121: case MFP_IPRA:
1122:
1123: switch (d & 0xff) {
1124: case 0b01111111:
1125: mfpInnerAcknowledged[15] = mfpInnerRequest[15];
1126: break;
1127: case 0b10111111:
1128: mfpInnerAcknowledged[14] = mfpInnerRequest[14];
1129: break;
1130: case 0b11011111:
1131: mfpInnerAcknowledged[13] = mfpInnerRequest[13];
1132: break;
1133: case 0b11101111:
1134: mfpInnerAcknowledged[12] = mfpInnerRequest[12];
1135: break;
1136: case 0b11110111:
1137: mfpInnerAcknowledged[11] = mfpInnerRequest[11];
1138: break;
1139: case 0b11111011:
1140: mfpInnerAcknowledged[10] = mfpInnerRequest[10];
1141: break;
1142: case 0b11111101:
1143: mfpInnerAcknowledged[ 9] = mfpInnerRequest[ 9];
1144: break;
1145: case 0b11111110:
1146: mfpInnerAcknowledged[ 8] = mfpInnerRequest[ 8];
1147: break;
1148: }
1149: return;
1150: case MFP_IPRB:
1151:
1152: switch (d & 0xff) {
1153: case 0b01111111:
1154: mfpInnerAcknowledged[ 7] = mfpInnerRequest[ 7];
1155: break;
1156: case 0b10111111:
1157: mfpInnerAcknowledged[ 6] = mfpInnerRequest[ 6];
1158: break;
1159: case 0b11011111:
1160: mfpInnerAcknowledged[ 5] = mfpInnerRequest[ 5];
1161: break;
1162: case 0b11101111:
1163: mfpInnerAcknowledged[ 4] = mfpInnerRequest[ 4];
1164: break;
1165: case 0b11110111:
1166: mfpInnerAcknowledged[ 3] = mfpInnerRequest[ 3];
1167: break;
1168: case 0b11111011:
1169: mfpInnerAcknowledged[ 2] = mfpInnerRequest[ 2];
1170: break;
1171: case 0b11111101:
1172: mfpInnerAcknowledged[ 1] = mfpInnerRequest[ 1];
1173: break;
1174: case 0b11111110:
1175: mfpInnerAcknowledged[ 0] = mfpInnerRequest[ 0];
1176: break;
1177: }
1178: return;
1179: case MFP_ISRA:
1180:
1181: switch (d & 0xff) {
1182: case 0b01111111:
1183: mfpInnerInService[15] = false;
1184: break;
1185: case 0b10111111:
1186: mfpInnerInService[14] = false;
1187: break;
1188: case 0b11011111:
1189: mfpInnerInService[13] = false;
1190: break;
1191: case 0b11101111:
1192: mfpInnerInService[12] = false;
1193: break;
1194: case 0b11110111:
1195: mfpInnerInService[11] = false;
1196: break;
1197: case 0b11111011:
1198: mfpInnerInService[10] = false;
1199: break;
1200: case 0b11111101:
1201: mfpInnerInService[ 9] = false;
1202: break;
1203: case 0b11111110:
1204: mfpInnerInService[ 8] = false;
1205: break;
1206: }
1207: return;
1208: case MFP_ISRB:
1209:
1210: switch (d & 0xff) {
1211: case 0b01111111:
1212: mfpInnerInService[ 7] = false;
1213: break;
1214: case 0b10111111:
1215: mfpInnerInService[ 6] = false;
1216: break;
1217: case 0b11011111:
1218: mfpInnerInService[ 5] = false;
1219: break;
1220: case 0b11101111:
1221: mfpInnerInService[ 4] = false;
1222: break;
1223: case 0b11110111:
1224: mfpInnerInService[ 3] = false;
1225: break;
1226: case 0b11111011:
1227: mfpInnerInService[ 2] = false;
1228: break;
1229: case 0b11111101:
1230: mfpInnerInService[ 1] = false;
1231: break;
1232: case 0b11111110:
1233: mfpInnerInService[ 0] = false;
1234: break;
1235: }
1236: return;
1237: case MFP_IMRA:
1238: mfpImr = (d & 0xff) << 8 | (mfpImr & 0xff);
1239:
1240: if ((byte) d < 0 && mfpInnerRequest[15] != mfpInnerAcknowledged[15] ||
1241: d << 31 - 6 < 0 && mfpInnerRequest[14] != mfpInnerAcknowledged[14] ||
1242: d << 31 - 5 < 0 && mfpInnerRequest[13] != mfpInnerAcknowledged[13] ||
1243: d << 31 - 4 < 0 && mfpInnerRequest[12] != mfpInnerAcknowledged[12] ||
1244: (XEiJ.TEST_BIT_3_SHIFT ? d << 31 - 3 < 0 : (d & 8) != 0) && mfpInnerRequest[11] != mfpInnerAcknowledged[11] ||
1245: (XEiJ.TEST_BIT_2_SHIFT ? d << 31 - 2 < 0 : (d & 4) != 0) && mfpInnerRequest[10] != mfpInnerAcknowledged[10] ||
1246: (XEiJ.TEST_BIT_1_SHIFT ? d << 31 - 1 < 0 : (d & 2) != 0) && mfpInnerRequest[ 9] != mfpInnerAcknowledged[ 9] ||
1247: (XEiJ.TEST_BIT_0_SHIFT ? d << 31 - 0 < 0 : (d & 1) != 0) && mfpInnerRequest[ 8] != mfpInnerAcknowledged[ 8]) {
1248: if (MFP_DELAYED_INTERRUPT) {
1249: XEiJ.mpuDIRR |= XEiJ.MPU_MFP_INTERRUPT_MASK;
1250: } else {
1251: XEiJ.mpuIRR |= XEiJ.MPU_MFP_INTERRUPT_MASK;
1252: }
1253: }
1254: return;
1255: case MFP_IMRB:
1256: mfpImr = (mfpImr & ~0xff) | (d & 0xff);
1257:
1258: if ((byte) d < 0 && mfpInnerRequest[ 7] != mfpInnerAcknowledged[ 7] ||
1259: d << 31 - 6 < 0 && mfpInnerRequest[ 6] != mfpInnerAcknowledged[ 6] ||
1260: d << 31 - 5 < 0 && mfpInnerRequest[ 5] != mfpInnerAcknowledged[ 5] ||
1261: d << 31 - 4 < 0 && mfpInnerRequest[ 4] != mfpInnerAcknowledged[ 4] ||
1262: (XEiJ.TEST_BIT_3_SHIFT ? d << 31 - 3 < 0 : (d & 8) != 0) && mfpInnerRequest[ 3] != mfpInnerAcknowledged[ 3] ||
1263: (XEiJ.TEST_BIT_2_SHIFT ? d << 31 - 2 < 0 : (d & 4) != 0) && mfpInnerRequest[ 2] != mfpInnerAcknowledged[ 2] ||
1264: (XEiJ.TEST_BIT_1_SHIFT ? d << 31 - 1 < 0 : (d & 2) != 0) && mfpInnerRequest[ 1] != mfpInnerAcknowledged[ 1] ||
1265: (XEiJ.TEST_BIT_0_SHIFT ? d << 31 - 0 < 0 : (d & 1) != 0) && mfpInnerRequest[ 0] != mfpInnerAcknowledged[ 0]) {
1266: if (MFP_DELAYED_INTERRUPT) {
1267: XEiJ.mpuDIRR |= XEiJ.MPU_MFP_INTERRUPT_MASK;
1268: } else {
1269: XEiJ.mpuIRR |= XEiJ.MPU_MFP_INTERRUPT_MASK;
1270: }
1271: }
1272: return;
1273: case MFP_VECTOR:
1274: mfpVectorHigh = 0xf0 & d;
1275: return;
1276: case MFP_TACR:
1277: {
1278: int prevPrescale = mfpTaPrescale;
1279: mfpTaEventcount = (d & 0x08) != 0;
1280: mfpTaPrescale = d & 0x07;
1281: if (mfpTaEventcount && mfpTaPrescale != 0) {
1282: mfpTaEventcount = false;
1283: mfpTaPrescale = 0;
1284: }
1285: if (mfpTaEventcount) {
1286: if (prevPrescale != 0) {
1287: mfpTaCurrent = mfpTaInitial - (int) (Math.floor ((double) (XEiJ.mpuClockTime - mfpTaStart) / mfpTaDelta) % mfpTaInitial);
1288: }
1289: mfpTaClock = XEiJ.FAR_FUTURE;
1290: TickerQueue.tkqRemove (mfpTaTicker);
1291: } else if (mfpTaPrescale != 0) {
1292:
1293: mfpTaClock = (mfpTaStart = XEiJ.mpuClockTime) + (mfpTaDelta = MFP_DELTA[mfpTaPrescale]) * mfpTaInitial;
1294: TickerQueue.tkqAdd (mfpTaTicker, mfpTaClock);
1295: } else {
1296: if (prevPrescale != 0) {
1297: mfpTaCurrent = mfpTaInitial - (int) (Math.floor ((double) (XEiJ.mpuClockTime - mfpTaStart) / mfpTaDelta) % mfpTaInitial);
1298: }
1299: mfpTaClock = XEiJ.FAR_FUTURE;
1300: TickerQueue.tkqRemove (mfpTaTicker);
1301: }
1302: }
1303: return;
1304: case MFP_TBCR:
1305: {
1306: int prevPrescale = mfpTbPrescale;
1307: mfpTbEventcount = (d & 0x08) != 0;
1308: mfpTbPrescale = d & 0x07;
1309: mfpTbKeyboardOn = !mfpTbEventcount && mfpTbPrescale == 0x01 && mfpTbInitial == 0x0d;
1310: if (mfpTbEventcount && mfpTbPrescale != 0) {
1311: mfpTbEventcount = false;
1312: mfpTbPrescale = 0;
1313: }
1314: if (mfpTbEventcount) {
1315: if (prevPrescale != 0) {
1316: mfpTbCurrent = mfpTbInitial - (int) (Math.floor ((double) (XEiJ.mpuClockTime - mfpTbStart) / mfpTbDelta) % mfpTbInitial);
1317: }
1318: mfpTbClock = XEiJ.FAR_FUTURE;
1319: TickerQueue.tkqRemove (mfpTbTicker);
1320: } else if (mfpTbPrescale != 0) {
1321:
1322: mfpTbClock = (mfpTbStart = XEiJ.mpuClockTime) + (mfpTbDelta = MFP_DELTA[mfpTbPrescale]) * mfpTbInitial;
1323: TickerQueue.tkqAdd (mfpTbTicker, mfpTbClock);
1324: } else {
1325: if (prevPrescale != 0) {
1326: mfpTbCurrent = mfpTbInitial - (int) (Math.floor ((double) (XEiJ.mpuClockTime - mfpTbStart) / mfpTbDelta) % mfpTbInitial);
1327: }
1328: mfpTbClock = XEiJ.FAR_FUTURE;
1329: TickerQueue.tkqRemove (mfpTbTicker);
1330: }
1331: }
1332: return;
1333: case MFP_TCDCR:
1334: {
1335: int prevPrescale = mfpTcPrescale;
1336: mfpTcPrescale = d >> 4 & 0x07;
1337: if (mfpTcPrescale != 0) {
1338:
1339: mfpTcClock = (mfpTcStart = XEiJ.mpuClockTime) + (mfpTcDelta = MFP_DELTA[mfpTcPrescale]) * mfpTcInitial;
1340: TickerQueue.tkqAdd (mfpTcTicker, mfpTcClock);
1341: } else {
1342: if (prevPrescale != 0) {
1343: mfpTcCurrent = mfpTcInitial - (int) (Math.floor ((double) (XEiJ.mpuClockTime - mfpTcStart) / mfpTcDelta) % mfpTcInitial);
1344: }
1345: mfpTcClock = XEiJ.FAR_FUTURE;
1346: TickerQueue.tkqRemove (mfpTcTicker);
1347: }
1348: }
1349: {
1350: int prevPrescale = mfpTdPrescale;
1351: mfpTdPrescale = d & 0x07;
1352: if (mfpTdPrescale != 0) {
1353:
1354: mfpTdClock = (mfpTdStart = XEiJ.mpuClockTime) + (mfpTdDelta = MFP_DELTA[mfpTdPrescale]) * mfpTdInitial;
1355: TickerQueue.tkqAdd (mfpTdTicker, mfpTdClock);
1356: } else {
1357: if (prevPrescale != 0) {
1358: mfpTdCurrent = mfpTdInitial - (int) (Math.floor ((double) (XEiJ.mpuClockTime - mfpTdStart) / mfpTdDelta) % mfpTdInitial);
1359: }
1360: mfpTdClock = XEiJ.FAR_FUTURE;
1361: TickerQueue.tkqRemove (mfpTdTicker);
1362: }
1363: }
1364: return;
1365: case MFP_TADR:
1366:
1367: d &= 0xff;
1368: mfpTaInitial = d == 0 ? 256 : d;
1369: if (!mfpTaEventcount && mfpTaPrescale == 0) {
1370: mfpTaCurrent = mfpTaInitial;
1371: }
1372: return;
1373: case MFP_TBDR:
1374:
1375: d &= 0xff;
1376: mfpTbInitial = d == 0 ? 256 : d;
1377: mfpTbKeyboardOn = !mfpTbEventcount && mfpTbPrescale == 0x01 && mfpTbInitial == 0x0d;
1378: if (!mfpTbEventcount && mfpTbPrescale == 0) {
1379: mfpTbCurrent = mfpTbInitial;
1380: }
1381: return;
1382: case MFP_TCDR:
1383:
1384: d &= 0xff;
1385: mfpTcInitial = d == 0 ? 256 : d;
1386: if (mfpTcPrescale == 0) {
1387: mfpTcCurrent = mfpTcInitial;
1388: }
1389: return;
1390: case MFP_TDDR:
1391:
1392: d &= 0xff;
1393: mfpTdInitial = d == 0 ? 256 : d;
1394: if (mfpTdPrescale == 0) {
1395: mfpTdCurrent = mfpTdInitial;
1396: }
1397: return;
1398: case MFP_SYNC_CHAR:
1399: return;
1400: case MFP_UCR:
1401: mfpUCR = d & 0b11111110;
1402: mfpTSRBufferFullTime = (mfpTbDelta * mfpTbInitial *
1403: 2 *
1404: ((mfpUCR & 0x80) != 0 ? 16 : 1) *
1405: ((1 * 2) +
1406: ((8 - ((mfpUCR >> 5) & 3)) * 2) +
1407: (((mfpUCR >> 3) & 3) + 1)) / 2);
1408: return;
1409: case MFP_RSR:
1410: mfpRSR = d & 0b00000001;
1411: return;
1412: case MFP_TSR:
1413: mfpTSR = d & 0b00000001;
1414: return;
1415: case MFP_UDR:
1416: if (mfpTbKeyboardOn) {
1417: if ((byte) d < 0) {
1418: Keyboard.kbdSetLedStatus (d);
1419: } else if ((d & 0xf8) == 0x40) {
1420: } else if ((d & 0xf8) == 0x48) {
1421: } else if ((d & 0xfc) == 0x54) {
1422: Keyboard.kbdSetLedBrightness (d);
1423: } else if ((d & 0xfc) == 0x58) {
1424: } else if ((d & 0xfc) == 0x5c) {
1425: } else if ((d & 0xf0) == 0x60) {
1426: Keyboard.kbdSetRepeatDelay (0x0f & d);
1427: } else if ((d & 0xf0) == 0x70) {
1428: Keyboard.kbdSetRepeatInterval (0x0f & d);
1429: }
1430: }
1431: mfpTSRBufferFullEnd = XEiJ.mpuClockTime + mfpTSRBufferFullTime;
1432: return;
1433: default:
1434: if ((a & 1) == 0 &&
1435: !XEiJ.currentIsSecond) {
1436: MemoryMappedDevice.MMD_NUL.mmdWb (a, d);
1437: }
1438: return;
1439: }
1440: }
1441:
1442:
1443:
1444: }
1445:
1446:
1447: