|
|
1.1 root 1: /*
2: * UAE - The Un*x Amiga Emulator
3: *
4: * CIA chip support
5: *
6: * Copyright 1995 Bernd Schmidt, Alessandro Bissacco
7: * Copyright 1996 Stefan Reinauer
8: */
9:
10: #include "sysconfig.h"
11: #include "sysdeps.h"
12: #include <assert.h>
13:
14: #include "config.h"
15: #include "options.h"
16: #include "events.h"
17: #include "memory.h"
18: #include "custom.h"
19: #include "cia.h"
20: #include "disk.h"
21: #include "xwin.h"
22: #include "keybuf.h"
23: #include "gui.h"
24:
25: #define DIV10 5 /* Yes, a bad identifier. */
26:
27: /* battclock stuff */
28: #define RTC_D_ADJ 8
29: #define RTC_D_IRQ 4
30: #define RTC_D_BUSY 2
31: #define RTC_D_HOLD 1
32: #define RTC_E_t1 8
33: #define RTC_E_t0 4
34: #define RTC_E_INTR 2
35: #define RTC_E_MASK 1
36: #define RTC_F_TEST 8
37: #define RTC_F_24_12 4
38: #define RTC_F_STOP 2
39: #define RTC_F_RSET 1
40:
41: static UBYTE clock_control_d = RTC_D_ADJ + RTC_D_HOLD;
42: static UBYTE clock_control_e = 0;
43: static UBYTE clock_control_f = RTC_F_24_12;
44:
45: static UBYTE ciaaicr,ciaaimask,ciabicr,ciabimask;
46: static UBYTE ciaacra,ciaacrb,ciabcra,ciabcrb;
47: static ULONG ciaata,ciaatb,ciabta,ciabtb;
48: static UWORD ciaala,ciaalb,ciabla,ciablb;
49: static ULONG ciaatod,ciabtod,ciaatol,ciabtol,ciaaalarm,ciabalarm;
50: static int ciaatodon, ciabtodon;
51: static int ciaatlatch,ciabtlatch;
52: static UBYTE ciaapra,ciaaprb,ciaadra,ciaadrb,ciaasdr;
53: static UBYTE ciabpra,ciabprb,ciabdra,ciabdrb,ciabsdr;
54: static int div10;
55: static int kbstate, kback;
56:
57: static int prtopen;
58: static FILE *prttmp;
59:
60: static void setclr(UBYTE *p, UBYTE val)
61: {
62: if (val & 0x80) {
63: *p |= val & 0x7F;
64: } else {
65: *p &= ~val;
66: }
67: }
68:
69: static void RethinkICRA(void)
70: {
71: if (ciaaimask & ciaaicr) {
72: ciaaicr |= 0x80;
73: custom_bank.wput(0xDFF09C,0x8008);
74: } else {
75: ciaaicr &= 0x7F;
76: /* custom_bank.wput(0xDFF09C,0x0008);*/
77: }
78: }
79:
80: static void RethinkICRB(void)
81: {
82: #if 0 /* ??? What's this then? */
83: if (ciabicr & 0x10) {
84: custom_bank.wput(0xDFF09C,0x9000);
85: }
86: #endif
87: if (ciabimask & ciabicr) {
88: ciabicr |= 0x80;
89: custom_bank.wput(0xDFF09C,0xA000);
90: } else {
91: ciabicr &= 0x7F;
92: /* custom_bank.wput(0xDFF09C,0x2000);*/
93: }
94: }
95:
96: static int lastdiv10;
97:
98: static void CIA_update(void)
99: {
100: unsigned long int ccount = cycles - eventtab[ev_cia].oldcycles + lastdiv10;
101: unsigned long int ciaclocks = ccount / DIV10;
102:
103: int aovfla = 0, aovflb = 0, bovfla = 0, bovflb = 0;
104:
105: lastdiv10 = div10;
106: div10 = ccount % DIV10;
107:
108: /* CIA A timers */
109: if ((ciaacra & 0x21) == 0x01) {
110: assert((ciaata+1) >= ciaclocks);
111: if ((ciaata+1) == ciaclocks) {
112: aovfla = 1;
113: if ((ciaacrb & 0x61) == 0x41) {
114: if (ciaatb-- == 0) aovflb = 1;
115: }
116: }
117: ciaata -= ciaclocks;
118: }
119: if ((ciaacrb & 0x61) == 0x01) {
120: assert((ciaatb+1) >= ciaclocks);
121: if ((ciaatb+1) == ciaclocks) aovflb = 1;
122: ciaatb -= ciaclocks;
123: }
124:
125: /* CIA B timers */
126: if ((ciabcra & 0x21) == 0x01) {
127: assert((ciabta+1) >= ciaclocks);
128: if ((ciabta+1) == ciaclocks) {
129: bovfla = 1;
130: if ((ciabcrb & 0x61) == 0x41) {
131: if (ciabtb-- == 0) bovflb = 1;
132: }
133: }
134: ciabta -= ciaclocks;
135: }
136: if ((ciabcrb & 0x61) == 0x01) {
137: assert ((ciabtb+1) >= ciaclocks);
138: if ((ciabtb+1) == ciaclocks) bovflb = 1;
139: ciabtb -= ciaclocks;
140: }
141: if (aovfla) {
142: ciaaicr |= 1; RethinkICRA();
143: ciaata = ciaala;
144: if (ciaacra & 0x8) ciaacra &= ~1;
145: }
146: if (aovflb) {
147: ciaaicr |= 2; RethinkICRA();
148: ciaatb = ciaalb;
149: if (ciaacrb & 0x8) ciaacrb &= ~1;
150: }
151: if (bovfla) {
152: ciabicr |= 1; RethinkICRB();
153: ciabta = ciabla;
154: if (ciabcra & 0x8) ciabcra &= ~1;
155: }
156: if (bovflb) {
157: ciabicr |= 2; RethinkICRB();
158: ciabtb = ciablb;
159: if (ciabcrb & 0x8) ciabcrb &= ~1;
160: }
161: }
162:
163: static void CIA_calctimers(void)
164: {
165: int ciaatimea = -1, ciaatimeb = -1, ciabtimea = -1, ciabtimeb = -1;
166:
167: eventtab[ev_cia].oldcycles = cycles;
168:
169: if ((ciaacra & 0x21) == 0x01) {
170: ciaatimea = (DIV10-div10) + DIV10*ciaata;
171: }
172: if ((ciaacrb & 0x61) == 0x41) {
173: /* Timer B will not get any pulses if Timer A is off. */
174: if (ciaatimea >= 0) {
175: /* If Timer A is in one-shot mode, and Timer B needs more than
176: * one pulse, it will not underflow. */
177: if (ciaatb == 0 || (ciaacra & 0x8) == 0) {
178: /* Otherwise, we can determine the time of the underflow. */
179: ciaatimeb = ciaatimea + ciaala * DIV10 * ciaatb;
180: }
181: }
182: }
183: if ((ciaacrb & 0x61) == 0x01) {
184: ciaatimeb = (DIV10-div10) + DIV10*ciaatb;
185: }
186:
187: if ((ciabcra & 0x21) == 0x01) {
188: ciabtimea = (DIV10-div10) + DIV10*ciabta;
189: }
190: if ((ciabcrb & 0x61) == 0x41) {
191: /* Timer B will not get any pulses if Timer A is off. */
192: if (ciabtimea >= 0) {
193: /* If Timer A is in one-shot mode, and Timer B needs more than
194: * one pulse, it will not underflow. */
195: if (ciabtb == 0 || (ciabcra & 0x8) == 0) {
196: /* Otherwise, we can determine the time of the underflow. */
197: ciabtimeb = ciabtimea + ciabla * DIV10 * ciabtb;
198: }
199: }
200: }
201: if ((ciabcrb & 0x61) == 0x01) {
202: ciabtimeb = (DIV10-div10) + DIV10*ciabtb;
203: }
204: eventtab[ev_cia].active = (ciaatimea != -1 || ciaatimeb != -1
205: || ciabtimea != -1 || ciabtimeb != -1);
206: if (eventtab[ev_cia].active) {
207: unsigned long int ciatime = ~0L;
208: if (ciaatimea != -1) ciatime = ciaatimea;
209: if (ciaatimeb != -1 && ciaatimeb < ciatime) ciatime = ciaatimeb;
210: if (ciabtimea != -1 && ciabtimea < ciatime) ciatime = ciabtimea;
211: if (ciabtimeb != -1 && ciabtimeb < ciatime) ciatime = ciabtimeb;
212: eventtab[ev_cia].evtime = ciatime + cycles;
213: }
214: events_schedule();
215: }
216:
217: void CIA_handler(void)
218: {
219: CIA_update();
220: CIA_calctimers();
221: }
222:
223: void diskindex_handler(void)
224: {
225: eventtab[ev_diskindex].evtime += cycles - eventtab[ev_diskindex].oldcycles;
226: eventtab[ev_diskindex].oldcycles = cycles;
227: /* printf(".\n");*/
228: ciabicr |= 0x10;
229: RethinkICRB();
230: }
231:
232: void CIA_hsync_handler(void)
233: {
234: static int keytime = 0;
235:
236: if (ciabtodon)
237: ciabtod++;
238: ciabtod &= 0xFFFFFF;
239:
240: if (ciabtod == ciabalarm) {
241: ciabicr |= 4; RethinkICRB();
242: }
243: if (keys_available() && kback && (++keytime & 15) == 0) {
244: switch(kbstate) {
245: case 0:
246: ciaasdr = (BYTE)~0xFB; /* aaarghh... stupid compiler */
247: kbstate++;
248: break;
249: case 1:
250: kbstate++;
251: ciaasdr = (BYTE)~0xFD;
252: break;
253: case 2:
254: ciaasdr = ~get_next_key();
255: break;
256: }
257: ciaaicr |= 8; RethinkICRA();
258: }
259: }
260:
261: void CIA_vsync_handler()
262: {
263: if (ciaatodon)
264: ciaatod++;
265: ciaatod &= 0xFFFFFF;
266: if (ciaatod == ciaaalarm) {
267: ciaaicr |= 4; RethinkICRA();
268: }
269: }
270:
271: static UBYTE ReadCIAA(UWORD addr)
272: {
273: UBYTE tmp;
274:
275: switch(addr & 0xf){
276: case 0:
277: tmp = (DISK_status() & 0x3C);
278: if (!buttonstate[0]) tmp |= 0x40;
279: if (!joy0button) tmp |= 0x80;
280: return tmp;
281: case 1:
282: return ciaaprb;
283: case 2:
284: return ciaadra;
285: case 3:
286: return ciaadrb;
287: case 4:
288: return ciaata & 0xff;
289: case 5:
290: return ciaata >> 8;
291: case 6:
292: return ciaatb & 0xff;
293: case 7:
294: return ciaatb >> 8;
295: case 8:
296: if (ciaatlatch) {
297: ciaatlatch = 0;
298: return ciaatol & 0xff;
299: } else return ciaatod & 0xff;
300: case 9:
301: if (ciaatlatch) return (ciaatol >> 8) & 0xff;
302: else return (ciaatod >> 8) & 0xff;
303: case 10:
304: ciaatlatch = 1; ciaatol = ciaatod; /* ??? only if not already latched? */
305: return (ciaatol >> 16) & 0xff;
306: case 12:
307: return ciaasdr;
308: case 13:
309: tmp = ciaaicr; ciaaicr = 0; RethinkICRA(); return tmp;
310: case 14:
311: return ciaacra;
312: case 15:
313: return ciaacrb;
314: }
315: return 0;
316: }
317:
318: static UBYTE ReadCIAB(UWORD addr)
319: {
320: UBYTE tmp;
321:
322: switch(addr & 0xf){
323: case 0:
324: fprintf (stderr,"ciabpra (Modem Register) read: 0x%02x\n",ciabpra);
325: return ciabpra;
326: case 1:
327: return ciabprb;
328: case 2:
329: return ciabdra;
330: case 3:
331: return ciabdrb;
332: case 4:
333: return ciabta & 0xff;
334: case 5:
335: return ciabta >> 8;
336: case 6:
337: return ciabtb & 0xff;
338: case 7:
339: return ciabtb >> 8;
340: case 8:
341: if (ciabtlatch) {
342: ciabtlatch = 0;
343: return ciabtol & 0xff;
344: } else return ciabtod & 0xff;
345: case 9:
346: if (ciabtlatch) return (ciabtol >> 8) & 0xff;
347: else return (ciabtod >> 8) & 0xff;
348: case 10:
349: ciabtlatch = 1; ciabtol = ciabtod;
350: return (ciabtol >> 16) & 0xff;
351: case 12:
352: return ciabsdr;
353: case 13:
354: tmp = ciabicr; ciabicr = 0; RethinkICRB();
355: return tmp;
356: case 14:
357: return ciabcra;
358: case 15:
359: return ciabcrb;
360: }
361: return 0;
362: }
363:
364: static void WriteCIAA(UWORD addr,UBYTE val)
365: {
366: int oldled;
367: switch(addr & 0xf){
368: case 0:
369: oldled = ciaapra & 2;
370: ciaapra = (ciaapra & ~0x3) | (val & 0x3); LED(ciaapra & 0x2);
371: if ((ciaapra & 2) != oldled)
372: gui_led (0, !(ciaapra & 2));
373: break;
374: case 1:
375: ciaaprb = val;
376: if (prtopen==1) {
377: #ifndef __DOS__
378: fprintf (prttmp,"%c",val);
379: #else
380: fputc (val, prttmp);
381: fflush (prttmp);
382: #endif
383: if (val==0x04) {
384: #if defined(__unix) && !defined(__bebox__) && !defined(__DOS__)
385: pclose (prttmp);
386: #else
387: fclose (prttmp);
388: #endif
389: prtopen = 0;
390: }
391: } else {
392: #if defined(__unix) && !defined(__bebox__) && !defined(__DOS__)
393: prttmp=(FILE *)popen ((char *)prtname,"w");
394: #else
395: prttmp=(FILE *)fopen ((char *)prtname,"wb");
396: #endif
397: if (prttmp != NULL) {
398: prtopen = 1;
399: #ifndef __DOS__
400: fprintf (prttmp,"%c",val);
401: #else
402: fputc (val, prttmp);
403: fflush (prttmp);
404: #endif
405: }
406: }
407: ciaaicr |= 0x10;
408: break;
409: case 2:
410: ciaadra = val; break;
411: case 3:
412: ciaadrb = val; break;
413: case 4:
414: CIA_update();
415: ciaala = (ciaala & 0xff00) | val;
416: CIA_calctimers();
417: break;
418: case 5:
419: CIA_update();
420: ciaala = (ciaala & 0xff) | (val << 8);
421: if ((ciaacra & 1) == 0)
422: ciaata = ciaala;
423: if (ciaacra & 8) {
424: ciaata = ciaala;
425: ciaacra |= 1;
426: }
427: CIA_calctimers();
428: break;
429: case 6:
430: CIA_update();
431: ciaalb = (ciaalb & 0xff00) | val;
432: CIA_calctimers();
433: break;
434: case 7:
435: CIA_update();
436: ciaalb = (ciaalb & 0xff) | (val << 8);
437: if ((ciaacrb & 1) == 0)
438: ciaatb = ciaalb;
439: if (ciaacrb & 8) {
440: ciaatb = ciaalb;
441: ciaacrb |= 1;
442: }
443: CIA_calctimers();
444: break;
445: case 8:
446: if (ciaacrb & 0x80){
447: ciaaalarm = (ciaaalarm & ~0xff) | val;
448: } else {
449: ciaatod = (ciaatod & ~0xff) | val;
450: ciaatodon = 1;
451: }
452: break;
453: case 9:
454: if (ciaacrb & 0x80){
455: ciaaalarm = (ciaaalarm & ~0xff00) | (val << 8);
456: } else {
457: ciaatod = (ciaatod & ~0xff00) | (val << 8);
458: ciaatodon = 0;
459: }
460: break;
461: case 10:
462: if (ciaacrb & 0x80){
463: ciaaalarm = (ciaaalarm & ~0xff0000) | (val << 16);
464: } else {
465: ciaatod = (ciaatod & ~0xff0000) | (val << 16);
466: ciaatodon = 0;
467: }
468: break;
469: case 12:
470: ciaasdr = val; break;
471: case 13:
472: setclr(&ciaaimask,val); break; /* ??? call RethinkICR() ? */
473: case 14:
474: CIA_update();
475: ciaacra = val;
476: if (ciaacra & 0x10){
477: ciaacra &= ~0x10;
478: ciaata = ciaala;
479: }
480: if (ciaacra & 0x40) {
481: kback = 1;
482: }
483: CIA_calctimers();
484: break;
485: case 15:
486: CIA_update();
487: ciaacrb = val;
488: if (ciaacrb & 0x10){
489: ciaacrb &= ~0x10;
490: ciaatb = ciaalb;
491: }
492: CIA_calctimers();
493: break;
494: }
495: }
496:
497: static void WriteCIAB(UWORD addr,UBYTE val)
498: {
499: switch(addr & 0xf){
500: case 0:
501: ciabpra = (ciabpra & ~0x3) | (val & 0x3); break;
502: case 1:
503: ciabprb = val; DISK_select(val); break;
504: case 2:
505: ciabdra = val; break;
506: case 3:
507: ciabdrb = val; break;
508: case 4:
509: CIA_update();
510: ciabla = (ciabla & 0xff00) | val;
511: CIA_calctimers();
512: break;
513: case 5:
514: CIA_update();
515: ciabla = (ciabla & 0xff) | (val << 8);
516: if ((ciabcra & 1) == 0)
517: ciabta = ciabla;
518: if (ciabcra & 8) {
519: ciabta = ciabla;
520: ciabcra |= 1;
521: }
522: CIA_calctimers();
523: break;
524: case 6:
525: CIA_update();
526: ciablb = (ciablb & 0xff00) | val;
527: CIA_calctimers();
528: break;
529: case 7:
530: CIA_update();
531: ciablb = (ciablb & 0xff) | (val << 8);
532: if ((ciabcrb & 1) == 0)
533: ciabtb = ciablb;
534: if (ciabcrb & 8) {
535: ciabtb = ciablb;
536: ciabcrb |= 1;
537: }
538: CIA_calctimers();
539: break;
540: case 8:
541: if (ciabcrb & 0x80){
542: ciabalarm = (ciabalarm & ~0xff) | val;
543: } else {
544: ciabtod = (ciabtod & ~0xff) | val;
545: ciabtodon = 1;
546: }
547: break;
548: case 9:
549: if (ciabcrb & 0x80){
550: ciabalarm = (ciabalarm & ~0xff00) | (val << 8);
551: } else {
552: ciabtod = (ciabtod & ~0xff00) | (val << 8);
553: ciabtodon = 0;
554: }
555: break;
556: case 10:
557: if (ciabcrb & 0x80){
558: ciabalarm = (ciabalarm & ~0xff0000) | (val << 16);
559: } else {
560: ciabtod = (ciabtod & ~0xff0000) | (val << 16);
561: ciabtodon = 0;
562: }
563: break;
564: case 12:
565: ciabsdr = val;
566: break;
567: case 13:
568: setclr(&ciabimask,val);
569: break;
570: case 14:
571: CIA_update();
572: ciabcra = val;
573: if (ciabcra & 0x10){
574: ciabcra &= ~0x10;
575: ciabta = ciabla;
576: }
577: CIA_calctimers();
578: break;
579: case 15:
580: CIA_update();
581: ciabcrb = val;
582: if (ciabcrb & 0x10){
583: ciabcrb &= ~0x10;
584: ciabtb = ciablb;
585: }
586: CIA_calctimers();
587: break;
588: }
589: }
590:
591: void CIA_reset(void)
592: {
593: kback = 1;
594: kbstate = 0;
595:
596: ciaatlatch = ciabtlatch = 0;
597: ciaatod = ciabtod = 0; ciaatodon = ciabtodon = 0;
598: ciaaicr = ciabicr = ciaaimask = ciabimask = 0;
599: ciaacra = ciaacrb = ciabcra = ciabcrb = 0x4; /* outmode = toggle; */
600: ciaala = ciaalb = ciabla = ciablb = ciaata = ciaatb = ciabta = ciabtb = 0xFFFF;
601: div10 = 0;
602: lastdiv10 = 0;
603: CIA_calctimers();
604:
605: ciabpra = 0xDC;
606: }
607:
608: void dumpcia(void)
609: {
610: printf("A: CRA: %02x, CRB: %02x, IMASK: %02x, TOD: %08lx %7s TA: %04lx, TB: %04lx\n",
611: (int)ciaacra, (int)ciaacrb, (int)ciaaimask, ciaatod,
612: ciaatlatch ? " latched" : "", ciaata, ciaatb);
613: printf("B: CRA: %02x, CRB: %02x, IMASK: %02x, TOD: %08lx %7s TA: %04lx, TB: %04lx\n",
614: (int)ciabcra, (int)ciabcrb, (int)ciabimask, ciabtod,
615: ciabtlatch ? " latched" : "", ciabta, ciabtb);
616: }
617:
618: /* CIA memory access */
619:
620: static ULONG cia_lget(CPTR) REGPARAM;
621: static UWORD cia_wget(CPTR) REGPARAM;
622: static UBYTE cia_bget(CPTR) REGPARAM;
623: static void cia_lput(CPTR, ULONG) REGPARAM;
624: static void cia_wput(CPTR, UWORD) REGPARAM;
625: static void cia_bput(CPTR, UBYTE) REGPARAM;
626:
627: addrbank cia_bank = {
628: default_alget, default_awget,
629: cia_lget, cia_wget, cia_bget,
630: cia_lput, cia_wput, cia_bput,
631: default_xlate, default_check
632: };
633:
634: ULONG cia_lget(CPTR addr)
635: {
636: return cia_bget(addr+3);
637: }
638:
639: UWORD cia_wget(CPTR addr)
640: {
641: return cia_bget(addr+1);
642: }
643:
644: UBYTE cia_bget(CPTR addr)
645: {
646: if ((addr & 0x3001) == 0x2001)
647: return ReadCIAA((addr & 0xF00) >> 8);
648: if ((addr & 0x3001) == 0x1000)
649: return ReadCIAB((addr & 0xF00) >> 8);
650: return 0;
651: }
652:
653: void cia_lput(CPTR addr, ULONG value)
654: {
655: cia_bput(addr+3,value); /* FIXME ? */
656: }
657:
658: void cia_wput(CPTR addr, UWORD value)
659: {
660: cia_bput(addr+1,value);
661: }
662:
663: void cia_bput(CPTR addr, UBYTE value)
664: {
665: if ((addr & 0x3001) == 0x2001)
666: WriteCIAA((addr & 0xF00) >> 8,value);
667: if ((addr & 0x3001) == 0x1000)
668: WriteCIAB((addr & 0xF00) >> 8,value);
669: }
670:
671: /* battclock memory access */
672:
673: static ULONG clock_lget(CPTR) REGPARAM;
674: static UWORD clock_wget(CPTR) REGPARAM;
675: static UBYTE clock_bget(CPTR) REGPARAM;
676: static void clock_lput(CPTR, ULONG) REGPARAM;
677: static void clock_wput(CPTR, UWORD) REGPARAM;
678: static void clock_bput(CPTR, UBYTE) REGPARAM;
679:
680: addrbank clock_bank = {
681: default_alget, default_awget,
682: clock_lget, clock_wget, clock_bget,
683: clock_lput, clock_wput, clock_bput,
684: default_xlate, default_check
685: };
686:
687: ULONG clock_lget(CPTR addr)
688: {
689: return clock_bget(addr+3);
690: }
691:
692: UWORD clock_wget(CPTR addr)
693: {
694: return clock_bget(addr+1);
695: }
696:
697: UBYTE clock_bget(CPTR addr)
698: {
699: time_t t=time(0);
700: struct tm *ct;
701: ct=localtime(&t);
702: switch (addr & 0x3f)
703: {
704: case 0x03: return ct->tm_sec % 10;
705: case 0x07: return ct->tm_sec / 10;
706: case 0x0b: return ct->tm_min % 10;
707: case 0x0f: return ct->tm_min / 10;
708: case 0x13: return ct->tm_hour % 10;
709: case 0x17: return ct->tm_hour / 10;
710: case 0x1b: return ct->tm_mday % 10;
711: case 0x1f: return ct->tm_mday / 10;
712: case 0x23: return (ct->tm_mon+1) % 10;
713: case 0x27: return (ct->tm_mon+1) / 10;
714: case 0x2b: return ct->tm_year % 10;
715: case 0x2f: return ct->tm_year / 10;
716:
717: case 0x33: return ct->tm_wday; /*Hack by -=SR=- */
718: case 0x37: return clock_control_d;
719: case 0x3b: return clock_control_e;
720: case 0x3f: return clock_control_f;
721: }
722: return 0;
723: }
724:
725: void clock_lput(CPTR addr, ULONG value)
726: {
727: /* No way */
728: }
729:
730: void clock_wput(CPTR addr, UWORD value)
731: {
732: /* No way */
733: }
734:
735: void clock_bput(CPTR addr, UBYTE value)
736: {
737: switch (addr & 0x3f)
738: {
739: case 0x37: clock_control_d=value; break;
740: case 0x3b: clock_control_e=value; break;
741: case 0x3f: clock_control_f=value; break;
742: }
743: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.