OSDN Git Service

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