22 Channel *uartrxch, *uarttxch;
23 int mousex, mousey, mousebut;
26 u8int kbdctrl, uartctrl;
47 bp = Bopen("diagbits", OREAD);
48 if(bp == nil) sysfatal("Bopen: %r");
49 Bread(bp, rom, sizeof(rom));
53 for(i = 0; i < 6; i++){
54 bp = Bopen(smprint("rom%d", i), OREAD);
55 if(bp == nil) sysfatal("Bopen: %r");
58 s = Brdline(bp, '\n');
59 if(s == nil || Blinelen(bp) == 0) break;
60 s[Blinelen(bp) - 1] = 0;
61 x = strtol(s, nil, 8);
68 if((i & 1) == 0) p = q;
71 write(3, rom, sizeof(rom));
80 nbrecv(keych, &keybuf);
81 if(keybuf >= 0 && (kbdctrl & ACIARXIRQ) != 0)
86 if(uartrxbuf < 0 && uartrxctr <= 0){
87 nbrecv(uartrxch, &uartrxbuf);
88 uartrxctr = FREQ * 11 / baud;
90 if(uarttxbuf >= 0 && nbsend(uarttxch, &uarttxbuf) > 0)
92 if(uartrxbuf >= 0 && (uartctrl & ACIARXIRQ) != 0 || uarttxbuf < 0 && (uartctrl & ACIATXMASK) == ACIATXIRQ)
104 if(a < 8) a += 0x40000;
105 if(a < 0x40000) return ram[a/2];
106 if(a >= 0x40000 && a < 0x40000 + sizeof(rom))
107 return rom[(a - 0x40000)/2];
109 case 01400000: return mousey;
110 case 01400002: return mousex;
111 case 01400010: /* uart status */
113 if(uartrxbuf >= 0) rc |= 1;
114 if(uarttxbuf < 0) rc |= 2;
116 case 01400012: /* uart data */
124 return mousebut | mousebut << 8;
125 case 01400026: return 0; /* mouse: unknown purpose */
126 case 01400030: return daddr >> 2; /* display address */
127 case 01400040: return dstat; /* display status */
128 case 01400060: /* keyboard status */
130 if(keybuf >= 0) rc |= 1;
132 case 01400062: /* keyboard data */
137 print("read %.8o (curpc = %.6x)\n", a, curpc & 0x3fffff);
142 memwrite(u32int a, u16int v, u16int m)
144 extern Rectangle updated;
150 y = (a - daddr) / 100;
151 x = (((a & ~1) - daddr) % 100) * 8;
152 if(updated.min.x > x) updated.min.x = x;
153 if(updated.max.x < x+16) updated.max.x = x+16;
154 if(updated.min.y > y) updated.min.y = y;
155 if(updated.max.y <= y) updated.max.y = y+1;
157 ram[a/2] = ram[a/2] & ~m | v & m;
161 case 01400010: uartctrl = v; return;
162 case 01400012: uarttxbuf = (uchar) v; return;
163 case 01400024: return; /* mouse: purpose unknown */
164 case 01400026: return; /* mouse: purpose unknown */
165 case 01400030: daddr = ((daddr >> 2) & ~m | v & m) << 2; return;
166 case 01400040: dstat = dstat & ~m | v & m; invert = -(dstat & 1); updated = Rect(0, 0, SX, SY); return;
167 case 01400056: /* sound; exact function unknown */ return;
168 case 01400060: kbdctrl = v; return;
169 case 01400062: /* reset keyboard */ return;
170 case 01400070: irq &= ~INTVBL; return;
171 case 01400156: /* sound; exact function unknown */ return;
173 print("write %.8o = %.4x (mask = %.4x, curpc = %.6x)\n", a, v, m, curpc & 0x3fffff);