OSDN Git Service

dfad86ebc106bbc19995d9657cc9d47915529544
[heavyosecpu/HeavyOSECPU.git] / HeavyOSECPU / screen.c
1 #include "osecpu.h"
2
3 void putOsaskChar(int c, struct Regs *r)
4 {
5         if (0x10 <= c && c <= 0x1f)
6                 c = "0123456789ABCDEF"[c & 0x0f];
7         putchar(r->lastConsoleChar = c);
8         return;
9 }
10
11 void checkString(struct Regs *r, int rxx, int pxx)
12 {
13         char c = 0;
14         if (r->preg[pxx].typ != 0x03) c = 1;
15         if (r->preg[pxx].p < r->preg[pxx].p0) c = 1;
16         if (r->ireg[rxx] < 0) c = 1;
17         if (r->preg[pxx].p + r->ireg[rxx] > r->preg[pxx].p1) c = 1;
18         if (c != 0)
19                 (*(r->errHndl))(r);
20         return;
21 }
22
23 int loadColor(struct Regs *r, int rxx)
24 {
25         int c = r->ireg[rxx], m = r->ireg[0x31] & 0x0c, rr, gg, bb;
26         if (m == 0x04) {
27                 if (c < -1 || c > 7)
28                         (*(r->errHndl))(r);
29                 c = iColor1[c & 0x07];
30         }
31         if (m == 0x08) {
32                 // 00, 24, 48, 6d, 91, b6, da, ff
33                 if (c < 0 || c >= (1 << 9))
34                         (*(r->errHndl))(r);
35                 rr = (c >> 6) & 0x07;
36                 gg = (c >> 3) & 0x07;
37                 bb = c & 0x07;
38                 rr = (rr * 255) / 7;
39                 gg = (gg * 255) / 7;
40                 bb = (bb * 255) / 7;
41                 c = rr << 16 | gg << 8 | bb;
42         }
43         if (m == 0x0c) {
44                 // 00, 08, 10, 18, 20, 29, 31, 39,
45                 // 41, 4a, 52, 5a, 62, 6a, 73, 7b,
46                 // 83, 8b, 94, 9c, a4, ac, b4, bd,
47                 // c5, cd, d5, de, e6, ee, f6, ff
48                 if (c < 0 || c >= (1 << 15))
49                         (*(r->errHndl))(r);
50                 rr = (c >> 10) & 0x1f;
51                 gg = (c >> 5) & 0x1f;
52                 bb = c & 0x1f;
53                 rr = (rr * 255) / 31;
54                 gg = (gg * 255) / 31;
55                 bb = (bb * 255) / 31;
56                 c = rr << 16 | gg << 8 | bb;
57         }
58         return c;
59 }
60
61 void checkRect(struct Regs *r, int rxx)
62 {
63         char c = 0;
64         int i;
65         if (r->ireg[rxx + 0] <= 0 || r->ireg[rxx + 0] > v_xsiz) c = 1;
66         if (r->ireg[rxx + 1] <= 0 || r->ireg[rxx + 1] > v_ysiz) c = 1;
67         if (r->ireg[rxx + 2] < 0 || r->ireg[rxx + 2] >= v_xsiz) c = 1;
68         if (r->ireg[rxx + 3] < 0 || r->ireg[rxx + 3] >= v_ysiz) c = 1;
69         i = r->ireg[rxx + 2] + r->ireg[rxx + 0]; if (i <= 0 || i > v_xsiz) c = 1;
70         i = r->ireg[rxx + 1] + r->ireg[rxx + 3]; if (i <= 0 || i > v_ysiz) c = 1;
71         if (c != 0)
72                 (*(r->errHndl))(r);
73         return;
74 }