RP5C15.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 class RP5C15 {
41:
42: public static final boolean RTC_DEBUG_TRACE = false;
43: public static final boolean RTC_DEBUG_WRITE = false;
44: public static final boolean RTC_DEBUG_GAP = false;
45:
46:
47:
48:
49:
50:
51: public static final int RTC_0_SECO0 = 0x01;
52: public static final int RTC_0_SECO1 = 0x03;
53:
54:
55: public static final int RTC_0_MINU0 = 0x05;
56: public static final int RTC_0_MINU1 = 0x07;
57:
58:
59:
60:
61:
62: public static final int RTC_0_HOUR0 = 0x09;
63: public static final int RTC_0_HOUR1 = 0x0b;
64:
65:
66:
67:
68:
69:
70:
71:
72: public static final int RTC_0_WDAY = 0x0d;
73:
74:
75:
76:
77:
78:
79:
80:
81: public static final int RTC_0_MDAY0 = 0x0f;
82: public static final int RTC_0_MDAY1 = 0x11;
83:
84:
85: public static final int RTC_0_MONT0 = 0x13;
86: public static final int RTC_0_MONT1 = 0x15;
87:
88:
89:
90:
91:
92:
93: public static final int RTC_0_YEAR0 = 0x17;
94: public static final int RTC_0_YEAR1 = 0x19;
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105: public static final int RTC_1_CLKOUT = 0x01;
106:
107:
108: public static final int RTC_1_ADJUST = 0x03;
109:
110:
111:
112:
113:
114: public static final int RTC_1_MINU0 = 0x05;
115: public static final int RTC_1_MINU1 = 0x07;
116: public static final int RTC_1_HOUR0 = 0x09;
117: public static final int RTC_1_HOUR1 = 0x0b;
118: public static final int RTC_1_WDAY = 0x0d;
119: public static final int RTC_1_MDAY0 = 0x0f;
120: public static final int RTC_1_MDAY1 = 0x11;
121:
122:
123: public static final int RTC_1_RULE = 0x15;
124:
125:
126:
127:
128:
129:
130: public static final int RTC_1_LEAP = 0x17;
131:
132:
133:
134: public static final int RTC_MODE = 0x1b;
135:
136:
137:
138:
139:
140: public static final int RTC_TEST = 0x1d;
141:
142:
143:
144:
145: public static final int RTC_RESET = 0x1f;
146:
147:
148:
149:
150: public static int rtcRule;
151: public static int rtcMove;
152: public static int rtcAlarm;
153: public static int rtcBank;
154: public static final byte[] rtcRegBank0 = new byte[32];
155: public static final byte[] rtcRegBank1 = new byte[32];
156: public static byte[] rtcRegCurrent;
157: public static int rtcTest;
158: public static MemoryMappedDevice rtcFirst;
159: public static long rtcTestStartCmil;
160: public static long rtcTestStartTime;
161:
162:
163:
164:
165:
166:
167:
168: public static int rtcWeekGap;
169:
170:
171:
172:
173:
174:
175:
176:
177:
178: public static long rtcInitialCmilGap;
179: public static long rtcCmilGap;
180: public static long rtcCmil;
181: public static int rtcCday;
182: public static int rtcDsec;
183:
184:
185:
186: public static void rtcInit () {
187: if (RTC_DEBUG_TRACE) {
188: System.out.printf ("rtcInit()\n");
189: }
190: rtcRule = 1;
191: rtcMove = 8;
192: rtcAlarm = 0;
193: rtcHzReset ();
194: rtcBank = 0;
195: rtcRegCurrent = rtcBank == 0 ? rtcRegBank0 : rtcRegBank1;
196: rtcTest = 0;
197: rtcFirst = rtcTest == 0 ? MemoryMappedDevice.MMD_RTC_FIRST : MemoryMappedDevice.MMD_RTC_TEST;
198: rtcTestStartCmil = 0;
199: rtcTestStartTime = 0;
200: if (RTC_DEBUG_TRACE) {
201: System.out.printf (" rtcRule=%d\n", rtcRule);
202: System.out.printf (" rtcMove=%d\n", rtcMove);
203: System.out.printf (" rtcBank=%d\n", rtcBank);
204: System.out.printf (" rtcTest=%d\n", rtcTest);
205: }
206:
207: rtcRegBank0[RTC_0_SECO0] = 0;
208: rtcRegBank0[RTC_0_SECO1] = 0;
209: rtcRegBank0[RTC_0_MINU0] = 0;
210: rtcRegBank0[RTC_0_MINU1] = 0;
211: rtcRegBank0[RTC_0_HOUR0] = 0;
212: rtcRegBank0[RTC_0_HOUR1] = 0;
213:
214: rtcRegBank0[RTC_0_WDAY] = 2;
215: rtcRegBank0[RTC_0_MDAY0] = 1;
216: rtcRegBank0[RTC_0_MDAY1] = 0;
217: rtcRegBank0[RTC_0_MONT0] = 1;
218: rtcRegBank0[RTC_0_MONT1] = 0;
219: rtcRegBank0[RTC_0_YEAR0] = 0;
220: rtcRegBank0[RTC_0_YEAR1] = 0;
221: rtcRegBank1[RTC_1_CLKOUT] = 0;
222: rtcRegBank1[RTC_1_ADJUST] = 0;
223: rtcRegBank1[RTC_1_MINU0] = 16;
224: rtcRegBank1[RTC_1_MINU1] = 16;
225: rtcRegBank1[RTC_1_HOUR0] = 16;
226: rtcRegBank1[RTC_1_HOUR1] = 16;
227: rtcRegBank1[RTC_1_WDAY] = 16;
228: rtcRegBank1[RTC_1_MDAY0] = 16;
229: rtcRegBank1[RTC_1_MDAY1] = 16;
230: rtcRegBank1[RTC_1_RULE] = (byte) rtcRule;
231: rtcRegBank1[RTC_1_LEAP] = 0;
232: rtcRegBank1[RTC_MODE] = (byte) (rtcMove + rtcBank);
233: rtcRegBank1[RTC_TEST] = (byte) rtcTest;
234: rtcRegBank1[RTC_RESET] = 0;
235: rtcWeekGap = 4;
236: rtcInitialCmilGap = TimeZone.getDefault ().getOffset (System.currentTimeMillis ());
237: rtcCmilGap = rtcInitialCmilGap;
238: if (RTC_DEBUG_GAP) {
239: System.out.printf ("rtcInit rtcCmilGap=%d\n", rtcCmilGap);
240: }
241: rtcCmil = 315532800000L;
242: rtcCday = 3652;
243: rtcDsec = 0;
244: if (RTC_DEBUG_TRACE) {
245: System.out.printf (" rtcWeekGap=%d\n", rtcWeekGap);
246: System.out.printf (" rtcCmilGap=%d\n", rtcCmilGap);
247: System.out.printf (" rtcCmil=%d (%s)\n", rtcCmil, DnT.dntSdttmCmil (rtcCmil));
248: System.out.printf (" rtcCday=%d (%s)\n", rtcCday, DnT.dntSdtCday (rtcCday));
249: System.out.printf (" rtcDsec=%d (%s)\n", rtcDsec, DnT.dntStmDsec (rtcDsec));
250: rtcDumpReg ();
251: System.out.printf (" 3652=%d\n", DnT.dntCdayYearMontMday (1980, 1, 1));
252: System.out.printf (" 40176=%d\n", DnT.dntCdayYearMontMday (2079, 12, 31));
253: System.out.printf (" 315532800000=%d\n", DnT.dntCmilYearMontMdayHourMinuSecoMill (1980, 1, 1, 0, 0, 0, 0));
254: System.out.printf (" 3471292799999=%d\n", DnT.dntCmilYearMontMdayHourMinuSecoMill (2079, 12, 31, 23, 59, 59, 999));
255: System.out.printf (" 1980-01-01=%s\n", DnT.dntSdtCday (3652));
256: System.out.printf (" 2079-12-31=%s\n", DnT.dntSdtCday (40176));
257: System.out.printf (" 1980-01-01 00:00:00.999=%s\n", DnT.dntSdttmCmil (315532800000L));
258: System.out.printf (" 2079-12-31 23:59:59.999=%s\n", DnT.dntSdttmCmil (3471292799999L));
259: }
260: }
261:
262:
263: public static void rtcReset () {
264: if (RTC_DEBUG_TRACE) {
265: System.out.printf ("rtcReset()\n");
266: }
267: }
268:
269:
270:
271: public static void rtcSetByHost () {
272: if (RTC_DEBUG_TRACE) {
273: System.out.printf ("rtcSetByHost()\n");
274: }
275: XEiJ.tmrTimer.schedule (new TimerTask () {
276: @Override public void run () {
277: if (rtcTest != 0) {
278:
279: XEiJ.busSuper (MemoryMappedDevice.MMD_RTC_FIRST, 0x00e8a000, 0x00e8c000);
280: rtcTest = 0;
281: rtcFirst = MemoryMappedDevice.MMD_RTC_FIRST;
282: if (RTC_DEBUG_TRACE) {
283: System.out.printf (" rtcTest=%d\n", rtcTest);
284: }
285: }
286: if (rtcMove == 0) {
287:
288: rtcMove = 8;
289: if (RTC_DEBUG_TRACE) {
290: System.out.printf (" rtcMove=%d\n", rtcMove);
291: }
292: }
293: rtcCmilGap = rtcInitialCmilGap;
294: if (RTC_DEBUG_GAP) {
295: System.out.printf ("rtcSetByHost rtcCmilGap=%d\n", rtcCmilGap);
296: }
297: if (RTC_DEBUG_TRACE) {
298: System.out.printf (" rtcCmilGap=%d\n", rtcCmilGap);
299: }
300: rtcUpdate ();
301: }
302: }, 10L);
303: }
304:
305: public static final long[] RTC_TEST_FREQ = {
306:
307: 0L,
308: XEiJ.TMR_FREQ / (16384L * ( 1L)),
309: XEiJ.TMR_FREQ / (16384L * ( 1L )),
310: XEiJ.TMR_FREQ / (16384L * ( 60L + 1L)),
311: XEiJ.TMR_FREQ / (16384L * ( 1L )),
312: XEiJ.TMR_FREQ / (16384L * ( 86400L + 1L)),
313: XEiJ.TMR_FREQ / (16384L * ( 1440L + 1L )),
314: XEiJ.TMR_FREQ / (16384L * ( 86400L + 60L + 1L)),
315: XEiJ.TMR_FREQ / (16384L * ( 1L )),
316: XEiJ.TMR_FREQ / (16384L * (31557600L + 1L)),
317: XEiJ.TMR_FREQ / (16384L * ( 525960L + 1L )),
318: XEiJ.TMR_FREQ / (16384L * (31557600L + 60L + 1L)),
319: XEiJ.TMR_FREQ * 4L / (16384L * ( 1461L + 4L )),
320: XEiJ.TMR_FREQ / (16384L * (31557600L + 86400L + 1L)),
321: XEiJ.TMR_FREQ / (16384L * ( 525960L + 1440L + 1L )),
322: XEiJ.TMR_FREQ / (16384L * (31557600L + 86400L + 60L + 1L)),
323: };
324: public static final long[] RTC_TEST_SCALE = {
325:
326: 0L,
327: ( 1000L),
328: ( 60000L ),
329: ( 1000L),
330: ( 86400000L ),
331: ( 1000L),
332: ( 60000L ),
333: ( 1000L),
334: (31557600000L ),
335: ( 1000L),
336: ( 60000L ),
337: ( 1000L),
338: ( 86400000L ),
339: ( 1000L),
340: ( 60000L ),
341: ( 1000L),
342: };
343:
344:
345:
346: public static void rtcTestUpdate () {
347: if (RTC_DEBUG_TRACE) {
348: System.out.printf ("rtcTestUpdate()\n");
349: }
350: if (rtcMove != 0) {
351: rtcSetCmil (rtcTestStartCmil +
352: ((XEiJ.mpuClockTime - rtcTestStartTime) / RTC_TEST_FREQ[rtcTest]) * RTC_TEST_SCALE[rtcTest]);
353: }
354: }
355:
356:
357:
358:
359:
360:
361:
362:
363:
364:
365: public static void rtcUpdate () {
366: if (RTC_DEBUG_TRACE) {
367: System.out.printf ("rtcUpdate()\n");
368: XEiJ.prgPrintStackTrace ();
369: }
370: if (rtcMove != 0) {
371: rtcSetCmil (System.currentTimeMillis () + rtcCmilGap);
372: }
373: }
374:
375:
376:
377: public static void rtcSetCmil (long cmil) {
378: if (RTC_DEBUG_TRACE) {
379: System.out.printf ("rtcSetCmil(%d)\n", cmil);
380: }
381:
382:
383:
384:
385: long shift = DnT.dntFdiv (cmil - 315532800000L, 3471292800000L - 315532800000L) * (3471292800000L - 315532800000L);
386: if (shift != 0L) {
387: cmil -= shift;
388: rtcCmilGap -= shift;
389: if (RTC_DEBUG_GAP) {
390: System.out.printf ("rtcSetCmil rtcCmilGap=%d\n", rtcCmilGap);
391: }
392: if (RTC_DEBUG_TRACE) {
393: System.out.printf (" rtcCmilGap=%d\n", rtcCmilGap);
394: }
395: }
396: if (rtcCmil != cmil) {
397: rtcCmil = cmil;
398: if (RTC_DEBUG_TRACE) {
399: System.out.printf (" rtcCmil=%d (%s)\n", rtcCmil, DnT.dntSdttmCmil (rtcCmil));
400: }
401: int cday = DnT.dntCdayCmil (cmil);
402: int dsec = DnT.dntDsecCmil (cmil);
403: if (rtcCday != cday) {
404: rtcCday = cday;
405: if (RTC_DEBUG_TRACE) {
406: System.out.printf (" rtcCday=%d (%s)\n", rtcCday, DnT.dntSdtCday (rtcCday));
407: }
408: int date = DnT.dntDateCday (cday);
409: int t = XEiJ.FMT_BCD4[DnT.dntYearDate (date) - 1980];
410: rtcRegBank0[RTC_0_YEAR1] = (byte) (t >> 4);
411: rtcRegBank0[RTC_0_YEAR0] = (byte) (t & 15);
412: rtcRegBank1[RTC_1_LEAP] = (byte) (t & 3);
413: t = XEiJ.FMT_BCD4[DnT.dntMontDate (date)];
414: rtcRegBank0[RTC_0_MONT1] = (byte) (t >> 4);
415: rtcRegBank0[RTC_0_MONT0] = (byte) (t & 15);
416: t = XEiJ.FMT_BCD4[DnT.dntMdayDate (date)];
417: rtcRegBank0[RTC_0_MDAY1] = (byte) (t >> 4);
418: rtcRegBank0[RTC_0_MDAY0] = (byte) (t & 15);
419: rtcRegBank0[RTC_0_WDAY] = (byte) DnT.dntFrem (cday + rtcWeekGap, 7);
420: if (RTC_DEBUG_TRACE) {
421: rtcDumpReg ();
422: }
423: }
424: if (rtcDsec != dsec) {
425: rtcDsec = dsec;
426: if (RTC_DEBUG_TRACE) {
427: System.out.printf (" rtcDsec=%d (%s)\n", rtcDsec, DnT.dntStmDsec (rtcDsec));
428: }
429: int time = DnT.dntTimeDsec (dsec);
430: int t = DnT.dntHourTime (time);
431: t = XEiJ.FMT_BCD4[rtcRule == 0 && 12 <= t ? t + 8 : t];
432: rtcRegBank0[RTC_0_HOUR1] = (byte) (t >> 4);
433: rtcRegBank0[RTC_0_HOUR0] = (byte) (t & 15);
434: t = XEiJ.FMT_BCD4[DnT.dntMinuTime (time)];
435: rtcRegBank0[RTC_0_MINU1] = (byte) (t >> 4);
436: rtcRegBank0[RTC_0_MINU0] = (byte) (t & 15);
437: t = XEiJ.FMT_BCD4[DnT.dntSecoTime (time)];
438: rtcRegBank0[RTC_0_SECO1] = (byte) (t >> 4);
439: rtcRegBank0[RTC_0_SECO0] = (byte) (t & 15);
440: if (RTC_DEBUG_TRACE) {
441: rtcDumpReg ();
442: }
443: }
444: }
445: }
446:
447:
448: public static void rtcDumpReg () {
449: System.out.printf (" L YY-MM-DD W R HH:MM:SS\n" +
450: " %01X %01X%01X-%01X%01X-%01X%01X %01X %01X %01X%01X:%01X%01X:%01X%01X\n",
451: rtcRegBank1[RTC_1_LEAP],
452: rtcRegBank0[RTC_0_YEAR1], rtcRegBank0[RTC_0_YEAR0],
453: rtcRegBank0[RTC_0_MONT1], rtcRegBank0[RTC_0_MONT0],
454: rtcRegBank0[RTC_0_MDAY1], rtcRegBank0[RTC_0_MDAY0],
455: rtcRegBank0[RTC_0_WDAY],
456: rtcRegBank1[RTC_1_RULE],
457: rtcRegBank0[RTC_0_HOUR1], rtcRegBank0[RTC_0_HOUR0],
458: rtcRegBank0[RTC_0_MINU1], rtcRegBank0[RTC_0_MINU0],
459: rtcRegBank0[RTC_0_SECO1], rtcRegBank0[RTC_0_SECO0]);
460: }
461:
462:
463: public static void rtcAddSeco (int seco) {
464: if (RTC_DEBUG_TRACE) {
465: System.out.printf ("rtcAddSeco(%d)\n", seco);
466: }
467: long mill = (long) seco * 1000L;
468: rtcCmilGap += mill;
469: if (RTC_DEBUG_GAP) {
470: System.out.printf ("rtcAddSeco rtcCmilGap=%d\n", rtcCmilGap);
471: }
472: rtcCmil += mill;
473: rtcCday = DnT.dntCdayCmil (rtcCmil);
474: rtcDsec = DnT.dntDsecCmil (rtcCmil);
475: if (RTC_DEBUG_TRACE) {
476: System.out.printf (" rtcCmilGap=%d\n", rtcCmilGap);
477: System.out.printf (" rtcCmil=%d (%s)\n", rtcCmil, DnT.dntSdttmCmil (rtcCmil));
478: System.out.printf (" rtcCday=%d (%s)\n", rtcCday, DnT.dntSdtCday (rtcCday));
479: System.out.printf (" rtcDsec=%d (%s)\n", rtcDsec, DnT.dntStmDsec (rtcDsec));
480: }
481: if (rtcTest != 0) {
482: rtcTestStartCmil = rtcCmil;
483: rtcTestStartTime = XEiJ.mpuClockTime;
484: if (RTC_DEBUG_TRACE) {
485: System.out.printf (" rtcTestStartCmil=%d (%s)\n", rtcTestStartCmil, DnT.dntSdttmCmil (rtcTestStartCmil));
486: System.out.printf (" rtcTestStartTime=%d\n", rtcTestStartTime);
487: }
488: }
489: }
490:
491:
492: public static void rtcAddMday (int mday) {
493: if (RTC_DEBUG_TRACE) {
494: System.out.printf ("rtcAddMday(%d)\n", mday);
495: }
496: rtcAddSeco (mday * 86400);
497: rtcWeekGap = DnT.dntFrem (rtcWeekGap - mday, 7);
498: if (RTC_DEBUG_TRACE) {
499: System.out.printf (" rtcWeekGap=%d\n", rtcWeekGap);
500: }
501: }
502:
503:
504:
505: public static int rtcPeekByte (int a) {
506: int d = rtcRegCurrent[a & 31] & 15;
507: if (RTC_DEBUG_TRACE) {
508: System.out.printf ("rtcPeekByte(0x%08x)=0x%02x\n", a, d & 255);
509: }
510: return d;
511: }
512:
513:
514:
515: public static int rtcReadByte (int a) {
516: int d = rtcRegCurrent[a & 31] & 15;
517: if (RTC_DEBUG_TRACE) {
518: System.out.printf ("rtcReadByte(0x%08x)=0x%02x\n", a, d & 255);
519: }
520: return d;
521: }
522:
523: public static final String[] RTC_REG_NAME = (
524: "one second," +
525: "ten seconds," +
526: "one minute," +
527: "ten minutes," +
528: "one hour," +
529: "ten hours," +
530: "day of week," +
531: "one day," +
532: "ten days," +
533: "one month," +
534: "ten months," +
535: "one year," +
536: "ten years," +
537: "mode," +
538: "test," +
539: "reset," +
540: "clkout," +
541: "adjust," +
542: "alarm one minute," +
543: "alarm ten minutes," +
544: "alarm one hour," +
545: "alarm ten hours," +
546: "alarm day of week," +
547: "alarm one day," +
548: "alarm ten days," +
549: "," +
550: "twenty four," +
551: "leap year," +
552: "," +
553: "mode," +
554: "test," +
555: "reset"
556: ).split (",");
557:
558:
559:
560: public static void rtcWriteByte (int a, int d) {
561: if (RTC_DEBUG_TRACE ||
562: (RTC_DEBUG_WRITE &&
563: (a & 31) != RTC_MODE && (byte) (d & (8 + 4)) != rtcMove + rtcAlarm)) {
564: System.out.printf ("%08X rtcWriteByte@%d(0x%08x(%s),0x%02x)\n",
565: XEiJ.regPC0, rtcBank, a,
566: (a & 1) == 0 ? "" : RTC_REG_NAME[rtcBank << 4 | ((a & 31) >> 1)],
567: d & 255);
568: }
569: switch (rtcBank << 5 | a & 31) {
570:
571: case 0 << 5 | RTC_0_SECO0:
572: d &= 15;
573: rtcAddSeco (d - rtcRegBank0[RTC_0_SECO0]);
574: rtcRegBank0[RTC_0_SECO0] = (byte) d;
575: if (RTC_DEBUG_TRACE) {
576: rtcDumpReg ();
577: }
578: return;
579: case 0 << 5 | RTC_0_SECO1:
580: d &= 7;
581: rtcAddSeco ((d - rtcRegBank0[RTC_0_SECO1]) * 10);
582: rtcRegBank0[RTC_0_SECO1] = (byte) d;
583: if (RTC_DEBUG_TRACE) {
584: rtcDumpReg ();
585: }
586: return;
587: case 0 << 5 | RTC_0_MINU0:
588: d &= 15;
589: rtcAddSeco ((d - rtcRegBank0[RTC_0_MINU0]) * 60);
590: rtcRegBank0[RTC_0_MINU0] = (byte) d;
591: if (RTC_DEBUG_TRACE) {
592: rtcDumpReg ();
593: }
594: return;
595: case 0 << 5 | RTC_0_MINU1:
596: d &= 7;
597: rtcAddSeco ((d - rtcRegBank0[RTC_0_MINU1]) * 600);
598: rtcRegBank0[RTC_0_MINU1] = (byte) d;
599: if (RTC_DEBUG_TRACE) {
600: rtcDumpReg ();
601: }
602: return;
603: case 0 << 5 | RTC_0_HOUR0:
604: d &= 15;
605: rtcAddSeco ((d - rtcRegBank0[RTC_0_HOUR0]) * 3600);
606: rtcRegBank0[RTC_0_HOUR0] = (byte) d;
607: if (RTC_DEBUG_TRACE) {
608: rtcDumpReg ();
609: }
610: return;
611: case 0 << 5 | RTC_0_HOUR1:
612: d &= 3;
613: rtcAddSeco (((d >> 1) - (rtcRegBank0[RTC_0_HOUR1] >> 1)) * (rtcRule == 0 ? 43200 : 72000) +
614: ((d & 1) - (rtcRegBank0[RTC_0_HOUR1] & 1)) * 36000);
615: rtcRegBank0[RTC_0_HOUR1] = (byte) d;
616: if (RTC_DEBUG_TRACE) {
617: rtcDumpReg ();
618: }
619: return;
620: case 0 << 5 | RTC_0_WDAY:
621: d &= 7;
622: {
623: int t = rtcWeekGap + d - rtcRegBank0[RTC_0_WDAY] + 7;
624:
625:
626: rtcWeekGap = t - (t * 19 >>> 7) * 7;
627: rtcRegBank0[RTC_0_WDAY] = (byte) d;
628: if (RTC_DEBUG_TRACE) {
629: System.out.printf (" rtcWeekGap=%d\n", rtcWeekGap);
630: rtcDumpReg ();
631: }
632: }
633: return;
634: case 0 << 5 | RTC_0_MDAY0:
635: d &= 15;
636: rtcAddMday (d - rtcRegBank0[RTC_0_MDAY0]);
637: rtcRegBank0[RTC_0_MDAY0] = (byte) d;
638: if (RTC_DEBUG_TRACE) {
639: rtcDumpReg ();
640: }
641: return;
642: case 0 << 5 | RTC_0_MDAY1:
643: d &= 3;
644: rtcAddMday ((d - rtcRegBank0[RTC_0_MDAY1]) * 10);
645: rtcRegBank0[RTC_0_MDAY1] = (byte) d;
646: if (RTC_DEBUG_TRACE) {
647: rtcDumpReg ();
648: }
649: return;
650: case 0 << 5 | RTC_0_MONT0:
651: d &= 15;
652: rtcAddMday (DnT.dntCdayYearMontMday (1980 + rtcRegBank0[RTC_0_YEAR1] * 10 + rtcRegBank0[RTC_0_YEAR0],
653: rtcRegBank0[RTC_0_MONT1] * 10 + d,
654: rtcRegBank0[RTC_0_MDAY1] * 10 + rtcRegBank0[RTC_0_MDAY0]) - rtcCday);
655: rtcRegBank0[RTC_0_MONT0] = (byte) d;
656: if (RTC_DEBUG_TRACE) {
657: rtcDumpReg ();
658: }
659: return;
660: case 0 << 5 | RTC_0_MONT1:
661: d &= 1;
662: rtcAddMday (DnT.dntCdayYearMontMday (1980 + rtcRegBank0[RTC_0_YEAR1] * 10 + rtcRegBank0[RTC_0_YEAR0],
663: d * 10 + rtcRegBank0[RTC_0_MONT0],
664: rtcRegBank0[RTC_0_MDAY1] * 10 + rtcRegBank0[RTC_0_MDAY0]) - rtcCday);
665: rtcRegBank0[RTC_0_MONT1] = (byte) d;
666: if (RTC_DEBUG_TRACE) {
667: rtcDumpReg ();
668: }
669: return;
670: case 0 << 5 | RTC_0_YEAR0:
671: d &= 15;
672: rtcAddMday (DnT.dntCdayYearMontMday (1980 + rtcRegBank0[RTC_0_YEAR1] * 10 + d,
673: rtcRegBank0[RTC_0_MONT1] * 10 + rtcRegBank0[RTC_0_MONT0],
674: rtcRegBank0[RTC_0_MDAY1] * 10 + rtcRegBank0[RTC_0_MDAY0]) - rtcCday);
675: rtcRegBank0[RTC_0_YEAR0] = (byte) d;
676: rtcRegBank1[RTC_1_LEAP] = (byte) (rtcRegBank0[RTC_0_YEAR1] * 10 + d & 3);
677: if (RTC_DEBUG_TRACE) {
678: rtcDumpReg ();
679: }
680: return;
681: case 0 << 5 | RTC_0_YEAR1:
682: d &= 15;
683: rtcAddMday (DnT.dntCdayYearMontMday (1980 + d * 10 + rtcRegBank0[RTC_0_YEAR0],
684: rtcRegBank0[RTC_0_MONT1] * 10 + rtcRegBank0[RTC_0_MONT0],
685: rtcRegBank0[RTC_0_MDAY1] * 10 + rtcRegBank0[RTC_0_MDAY0]) - rtcCday);
686: rtcRegBank0[RTC_0_YEAR1] = (byte) d;
687: rtcRegBank1[RTC_1_LEAP] = (byte) (d * 10 + rtcRegBank0[RTC_0_YEAR0] & 3);
688: if (RTC_DEBUG_TRACE) {
689: rtcDumpReg ();
690: }
691: return;
692:
693: case 1 << 5 | RTC_1_CLKOUT:
694:
695: return;
696: case 1 << 5 | RTC_1_ADJUST:
697:
698: return;
699:
700:
701:
702:
703:
704:
705:
706:
707:
708:
709:
710:
711:
712:
713: case 1 << 5 | RTC_1_RULE:
714: d &= 1;
715: if (rtcRule != d) {
716:
717: rtcAddSeco ((rtcRegBank0[RTC_0_HOUR1] >> 1) *
718: ((d == 0 ? 43200 : 72000) - (rtcRule == 0 ? 43200 : 72000)));
719: rtcRegBank1[RTC_1_RULE] = (byte) d;
720: rtcRule = d;
721: if (RTC_DEBUG_TRACE) {
722: System.out.printf (" rtcRule=%d\n", rtcRule);
723: rtcDumpReg ();
724: }
725: }
726: return;
727: case 1 << 5 | RTC_1_LEAP:
728:
729: return;
730:
731: case 0 << 5 | RTC_MODE:
732: case 1 << 5 | RTC_MODE:
733: d &= 8 + 4 + 1;
734: rtcBank = d & 1;
735: if (RTC_DEBUG_TRACE) {
736: System.out.printf (" rtcBank=%d\n", rtcBank);
737: }
738: rtcRegCurrent = rtcBank == 0 ? rtcRegBank0 : rtcRegBank1;
739: if (rtcMove < (d & 8)) {
740: if (rtcTest == 0) {
741: rtcCmilGap = rtcCmil - System.currentTimeMillis ();
742: rtcCmilGap = rtcCmilGap < 0L ? -(((-rtcCmilGap + 500L) / 1000L) * 1000L) : ((rtcCmilGap + 500L) / 1000L) * 1000L;
743: if (RTC_DEBUG_GAP) {
744: System.out.printf ("rtcWriteByte rtcCmilGap=%d\n", rtcCmilGap);
745: }
746: if (RTC_DEBUG_TRACE) {
747: System.out.printf (" rtcCmilGap=%d\n", rtcCmilGap);
748: }
749: } else {
750: rtcTestStartCmil = rtcCmil;
751: rtcTestStartTime = XEiJ.mpuClockTime;
752: if (RTC_DEBUG_TRACE) {
753: System.out.printf (" rtcTestStartCmil=%d (%s)\n", rtcTestStartCmil, DnT.dntSdttmCmil (rtcTestStartCmil));
754: System.out.printf (" rtcTestStartTime=%d\n", rtcTestStartTime);
755: }
756: }
757: }
758: rtcAlarm = d & 4;
759: rtcHzUpdate ();
760: rtcMove = d & 8;
761: if (RTC_DEBUG_TRACE) {
762: System.out.printf (" rtcMove=%d\n", rtcMove);
763: }
764: rtcRegBank0[RTC_MODE] = rtcRegBank1[RTC_MODE] = (byte) d;
765: return;
766: case 0 << 5 | RTC_TEST:
767: case 1 << 5 | RTC_TEST:
768: d &= 15;
769: if (rtcTest != d) {
770: if (d == 0) {
771: XEiJ.busSuper (MemoryMappedDevice.MMD_RTC_FIRST, 0x00e8a000, 0x00e8c000);
772: if (rtcMove != 0) {
773: rtcCmilGap = rtcCmil - System.currentTimeMillis ();
774: rtcCmilGap = rtcCmilGap < 0L ? -(((-rtcCmilGap + 500L) / 1000L) * 1000L) : ((rtcCmilGap + 500L) / 1000L) * 1000L;
775: if (RTC_DEBUG_GAP) {
776: System.out.printf ("rtcWriteByte rtcCmilGap=%d\n", rtcCmilGap);
777: }
778: if (RTC_DEBUG_TRACE) {
779: System.out.printf (" rtcCmilGap=%d\n", rtcCmilGap);
780: }
781: }
782: } else if (rtcTest == 0) {
783: XEiJ.busSuper (MemoryMappedDevice.MMD_RTC_TEST, 0x00e8a000, 0x00e8c000);
784: if (rtcMove != 0) {
785: rtcTestStartCmil = rtcCmil;
786: rtcTestStartTime = XEiJ.mpuClockTime;
787: if (RTC_DEBUG_TRACE) {
788: System.out.printf (" rtcTestStartCmil=%d (%s)\n", rtcTestStartCmil, DnT.dntSdttmCmil (rtcTestStartCmil));
789: System.out.printf (" rtcTestStartTime=%d\n", rtcTestStartTime);
790: }
791: }
792: } else {
793: if (rtcMove != 0) {
794: rtcTestStartCmil = rtcCmil;
795: rtcTestStartTime = XEiJ.mpuClockTime;
796: if (RTC_DEBUG_TRACE) {
797: System.out.printf (" rtcTestStartCmil=%d (%s)\n", rtcTestStartCmil, DnT.dntSdttmCmil (rtcTestStartCmil));
798: System.out.printf (" rtcTestStartTime=%d\n", rtcTestStartTime);
799: }
800: }
801: }
802: rtcTest = d;
803: rtcFirst = rtcTest == 0 ? MemoryMappedDevice.MMD_RTC_FIRST : MemoryMappedDevice.MMD_RTC_TEST;
804: if (RTC_DEBUG_TRACE) {
805: System.out.printf (" rtcTest=%d\n", rtcTest);
806: }
807: rtcRegBank0[RTC_TEST] = rtcRegBank1[RTC_TEST] = (byte) d;
808: }
809: return;
810: case 0 << 5 | RTC_RESET:
811: case 1 << 5 | RTC_RESET:
812: rtcResetHz = d & 12;
813: rtcHzUpdate ();
814: return;
815: }
816: }
817:
818:
819:
820:
821:
822:
823:
824:
825:
826:
827:
828:
829:
830:
831:
832:
833:
834:
835:
836:
837:
838:
839:
840: public static final long RTC_HZ_UNIT = XEiJ.TMR_FREQ / 32;
841: public static int rtcResetHz;
842: public static int rtcHzMode;
843: public static boolean rtcHzLowHigh;
844: public static int rtcHzStage;
845: public static long rtcHzTime;
846: public static void rtcHzReset () {
847: rtcResetHz = 12;
848: rtcHzMode = -1;
849: rtcHzLowHigh = false;
850: rtcHzStage = -1;
851: rtcHzTime = XEiJ.FAR_FUTURE;
852: }
853: public static final TickerQueue.Ticker RTC_HZ_TICKER = new TickerQueue.Ticker () {
854: @Override protected void tick () {
855: rtcHzLowHigh = !rtcHzLowHigh;
856: if (rtcHzLowHigh) {
857: MC68901.mfpAlarmRise ();
858: } else {
859: MC68901.mfpAlarmFall ();
860: }
861: int length = (rtcHzMode == 0 ? rtcHzStage < 15 ? 1 : 17 :
862: rtcHzMode == 1 ? 16 :
863: 1);
864: rtcHzStage += length;
865: if (rtcHzStage == 32) {
866: rtcHzStage = 0;
867: }
868: rtcHzTime += RTC_HZ_UNIT * length;
869: TickerQueue.tkqAdd (RTC_HZ_TICKER, rtcHzTime);
870: }
871: };
872: public static void rtcHzUpdate () {
873: int hzMode = rtcAlarm | rtcResetHz >> 2;
874: if (rtcHzMode != hzMode) {
875: rtcHzMode = hzMode;
876: if (rtcHzMode < 3) {
877: if (!rtcHzLowHigh) {
878: rtcHzLowHigh = true;
879: MC68901.mfpAlarmRise ();
880: }
881: rtcHzStage = (rtcHzMode == 0 ||
882: rtcHzMode == 2 ? 1 :
883: 16);
884: rtcHzTime = XEiJ.mpuClockTime + RTC_HZ_UNIT * rtcHzStage;
885: TickerQueue.tkqAdd (RTC_HZ_TICKER, rtcHzTime);
886: } else {
887: if (rtcHzLowHigh) {
888: rtcHzLowHigh = false;
889: MC68901.mfpAlarmFall ();
890: }
891: rtcHzStage = -1;
892: rtcHzTime = XEiJ.FAR_FUTURE;
893: TickerQueue.tkqRemove (RTC_HZ_TICKER);
894: }
895: }
896: }
897:
898:
899: }
900:
901:
902: