22 Channel *uartrxch, *uarttxch;
23 int mousex, mousey, mousebut;
26 u8int kbdctrl, uartctrl;
47 bp = Bopen("/sys/lib/blit/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("/sys/lib/blit/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;
79 nbrecv(keych, &keybuf);
80 if(keybuf >= 0 && (kbdctrl & ACIARXIRQ) != 0)
85 if(uartrxbuf < 0 && uartrxctr <= 0){
86 nbrecv(uartrxch, &uartrxbuf);
87 uartrxctr = FREQ * 11 / baud;
89 if(uarttxbuf >= 0 && nbsend(uarttxch, &uarttxbuf) > 0)
91 if(uartrxbuf >= 0 && (uartctrl & ACIARXIRQ) != 0 || uarttxbuf < 0 && (uartctrl & ACIATXMASK) == ACIATXIRQ)
103 if(a < 8) a += 0x40000;
104 if(a < 0x40000) return ram[a/2];
105 if(a >= 0x40000 && a < 0x40000 + sizeof(rom))
106 return rom[(a - 0x40000)/2];
108 case 01400000: return mousey;
109 case 01400002: return mousex;
110 case 01400010: /* uart status */
112 if(uartrxbuf >= 0) rc |= 1;
113 if(uarttxbuf < 0) rc |= 2;
115 case 01400012: /* uart data */
123 return mousebut | mousebut << 8;
124 case 01400026: return 0; /* mouse: unknown purpose */
125 case 01400030: return daddr >> 2; /* display address */
126 case 01400040: return dstat; /* display status */
127 case 01400060: /* keyboard status */
129 if(keybuf >= 0) rc |= 1;
131 case 01400062: /* keyboard data */
136 print("read %.8o (curpc = %.6x)\n", a, curpc & 0x3fffff);
141 memwrite(u32int a, u16int v, u16int m)
143 extern Rectangle updated;
149 y = (a - daddr) / 100;
150 x = (((a & ~1) - daddr) % 100) * 8;
151 if(updated.min.x > x) updated.min.x = x;
152 if(updated.max.x < x+16) updated.max.x = x+16;
153 if(updated.min.y > y) updated.min.y = y;
154 if(updated.max.y <= y) updated.max.y = y+1;
156 ram[a/2] = ram[a/2] & ~m | v & m;
160 case 01400010: uartctrl = v; return;
161 case 01400012: uarttxbuf = (uchar) v; return;
162 case 01400024: return; /* mouse: purpose unknown */
163 case 01400026: return; /* mouse: purpose unknown */
164 case 01400030: daddr = ((daddr >> 2) & ~m | v & m) << 2; return;
165 case 01400040: dstat = dstat & ~m | v & m; invert = -(dstat & 1); updated = Rect(0, 0, SX, SY); return;
166 case 01400056: /* sound; exact function unknown */ return;
167 case 01400060: kbdctrl = v; return;
168 case 01400062: /* reset keyboard */ return;
169 case 01400070: irq &= ~INTVBL; return;
170 case 01400156: /* sound; exact function unknown */ return;
172 print("write %.8o = %.4x (mask = %.4x, curpc = %.6x)\n", a, v, m, curpc & 0x3fffff);