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