OSDN Git Service

4856ea8027fcc016a9eb5e47d78c061a470d6150
[csp-qt/common_source_project-fm7.git] / source / src / vm / tk80bs / display.cpp
1 /*\r
2         NEC TK-80BS (COMPO BS/80) Emulator 'eTK-80BS'\r
3 \r
4         Author : Takeda.Toshiya\r
5         Date   : 2008.08.26 -\r
6 \r
7         [ display ]\r
8 */\r
9 \r
10 #include "display.h"\r
11 #include "../../fileio.h"\r
12 \r
13 static const int dest_x[8] = {\r
14         1, 26, 51, 76, 106, 131, 156, 181\r
15 };\r
16 static const int pat_led[35][24] = {\r
17         {9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9},\r
18         {9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9},\r
19         {9,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2,0,0,9},\r
20         {9,0,0,0,6,0,1,1,1,1,1,1,1,1,1,1,1,1,0,2,2,0,0,9},\r
21         {9,0,0,0,6,6,0,1,1,1,1,1,1,1,1,1,1,0,2,2,2,0,0,9},\r
22         {9,0,0,0,6,6,6,0,0,0,0,0,0,0,0,0,0,0,2,2,2,0,0,9},\r
23         {9,0,0,0,6,6,6,0,0,0,0,0,0,0,0,0,0,0,2,2,2,0,0,9},\r
24         {9,0,0,0,6,6,6,0,0,0,0,0,0,0,0,0,0,0,2,2,2,0,0,9},\r
25         {9,0,0,0,6,6,6,0,0,0,0,0,0,0,0,0,0,0,2,2,2,0,0,9},\r
26         {9,0,0,0,6,6,6,0,0,0,0,0,0,0,0,0,0,0,2,2,2,0,0,9},\r
27         {9,0,0,0,6,6,6,0,0,0,0,0,0,0,0,0,0,0,2,2,2,0,0,9},\r
28         {9,0,0,6,6,6,0,0,0,0,0,0,0,0,0,0,0,2,2,2,0,0,0,9},\r
29         {9,0,0,6,6,6,0,0,0,0,0,0,0,0,0,0,0,2,2,2,0,0,0,9},\r
30         {9,0,0,6,6,6,0,0,0,0,0,0,0,0,0,0,0,2,2,2,0,0,0,9},\r
31         {9,0,0,6,6,6,0,0,0,0,0,0,0,0,0,0,0,2,2,2,0,0,0,9},\r
32         {9,0,0,6,6,6,0,0,0,0,0,0,0,0,0,0,0,2,2,2,0,0,0,9},\r
33         {9,0,0,0,6,0,7,7,7,7,7,7,7,7,7,7,7,0,2,0,0,0,0,9},\r
34         {9,0,0,0,0,7,7,7,7,7,7,7,7,7,7,7,7,7,0,0,0,0,0,9},\r
35         {9,0,0,0,5,0,7,7,7,7,7,7,7,7,7,7,7,0,3,0,0,0,0,9},\r
36         {9,0,0,5,5,5,0,0,0,0,0,0,0,0,0,0,0,3,3,3,0,0,0,9},\r
37         {9,0,0,5,5,5,0,0,0,0,0,0,0,0,0,0,0,3,3,3,0,0,0,9},\r
38         {9,0,0,5,5,5,0,0,0,0,0,0,0,0,0,0,0,3,3,3,0,0,0,9},\r
39         {9,0,0,5,5,5,0,0,0,0,0,0,0,0,0,0,0,3,3,3,0,0,0,9},\r
40         {9,0,0,5,5,5,0,0,0,0,0,0,0,0,0,0,0,3,3,3,0,0,0,9},\r
41         {9,0,5,5,5,0,0,0,0,0,0,0,0,0,0,0,3,3,3,0,0,0,0,9},\r
42         {9,0,5,5,5,0,0,0,0,0,0,0,0,0,0,0,3,3,3,0,0,0,0,9},\r
43         {9,0,5,5,5,0,0,0,0,0,0,0,0,0,0,0,3,3,3,0,0,0,0,9},\r
44         {9,0,5,5,5,0,0,0,0,0,0,0,0,0,0,0,3,3,3,0,0,0,0,9},\r
45         {9,0,5,5,5,0,0,0,0,0,0,0,0,0,0,0,3,3,3,0,0,0,0,9},\r
46         {9,0,5,5,5,0,0,0,0,0,0,0,0,0,0,0,3,3,3,0,0,0,0,9},\r
47         {9,0,5,5,0,4,4,4,4,4,4,4,4,4,4,0,3,3,3,0,0,0,0,9},\r
48         {9,0,5,0,4,4,4,4,4,4,4,4,4,4,4,4,0,3,3,0,8,8,0,9},\r
49         {9,0,0,4,4,4,4,4,4,4,4,4,4,4,4,4,4,0,3,0,8,8,0,9},\r
50         {9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9},\r
51         {9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9},\r
52 };\r
53 static const int pat_kb[31][42] = {\r
54         {1,1,1,1,1,1,1,1,1,0,0,1,1,1,0,0,0,1,1,1,0,0,1,1,1,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0},\r
55         {1,1,1,1,1,1,1,1,1,0,0,1,1,1,0,0,0,1,1,1,0,0,1,1,1,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0},\r
56         {1,1,1,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,1,0,0,1,1,1,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0},\r
57         {1,1,1,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,1,0,0,1,1,1,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0},\r
58         {1,1,1,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,1,0,0,1,1,1,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0},\r
59         {1,1,1,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,1,0,0,1,1,1,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0},\r
60         {1,1,1,1,1,1,1,0,0,0,0,1,1,1,0,0,0,1,1,1,0,0,1,1,1,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0},\r
61         {1,1,1,1,1,1,1,0,0,0,0,1,1,1,0,0,0,1,1,1,0,0,1,1,1,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0},\r
62         {1,1,1,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,1,0,0,1,1,1,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0},\r
63         {1,1,1,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,1,0,0,1,1,1,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0},\r
64         {1,1,1,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,1,0,0,1,1,1,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0},\r
65         {1,1,1,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,1,0,0,1,1,1,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0},\r
66         {1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1,1},\r
67         {1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1,1},\r
68         {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},\r
69         {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},\r
70         {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},\r
71         {2,2,2,2,2,2,2,2,2,0,0,2,2,2,0,0,0,2,2,2,0,0,0,0,2,2,2,2,2,0,0,0,0,0,0,2,2,2,2,2,0,0},\r
72         {2,2,2,2,2,2,2,2,2,0,0,2,2,2,0,0,0,2,2,2,0,0,0,0,2,2,2,2,2,0,0,0,0,0,0,2,2,2,2,2,0,0},\r
73         {0,0,0,2,2,2,0,0,0,0,0,2,2,2,0,0,0,2,2,2,0,0,2,2,2,0,0,0,2,2,2,0,0,2,2,2,0,0,0,2,2,2},\r
74         {0,0,0,2,2,2,0,0,0,0,0,2,2,2,0,0,0,2,2,2,0,0,2,2,2,0,0,0,2,2,2,0,0,2,2,2,0,0,0,2,2,2},\r
75         {0,0,0,2,2,2,0,0,0,0,0,2,2,2,0,2,2,2,0,0,0,0,2,2,2,0,0,0,2,2,2,0,0,2,2,2,0,0,0,2,2,2},\r
76         {0,0,0,2,2,2,0,0,0,0,0,2,2,2,0,2,2,2,0,0,0,0,2,2,2,0,0,0,2,2,2,0,0,2,2,2,0,0,0,2,2,2},\r
77         {0,0,0,2,2,2,0,0,0,0,0,2,2,2,2,2,0,0,0,0,0,0,0,0,2,2,2,2,2,0,0,0,0,2,2,2,0,0,0,2,2,2},\r
78         {0,0,0,2,2,2,0,0,0,0,0,2,2,2,2,2,0,0,0,0,0,0,0,0,2,2,2,2,2,0,0,0,0,2,2,2,0,0,0,2,2,2},\r
79         {0,0,0,2,2,2,0,0,0,0,0,2,2,2,0,2,2,2,0,0,0,0,2,2,2,0,0,0,2,2,2,0,0,2,2,2,0,0,0,2,2,2},\r
80         {0,0,0,2,2,2,0,0,0,0,0,2,2,2,0,2,2,2,0,0,0,0,2,2,2,0,0,0,2,2,2,0,0,2,2,2,0,0,0,2,2,2},\r
81         {0,0,0,2,2,2,0,0,0,0,0,2,2,2,0,0,0,2,2,2,0,0,2,2,2,0,0,0,2,2,2,0,0,2,2,2,0,0,0,2,2,2},\r
82         {0,0,0,2,2,2,0,0,0,0,0,2,2,2,0,0,0,2,2,2,0,0,2,2,2,0,0,0,2,2,2,0,0,2,2,2,0,0,0,2,2,2},\r
83         {0,0,0,2,2,2,0,0,0,0,0,2,2,2,0,0,0,2,2,2,0,0,0,0,2,2,2,2,2,0,0,0,0,0,0,2,2,2,2,2,0,0},\r
84         {0,0,0,2,2,2,0,0,0,0,0,2,2,2,0,0,0,2,2,2,0,0,0,0,2,2,2,2,2,0,0,0,0,0,0,2,2,2,2,2,0,0},\r
85 };\r
86 \r
87 void DISPLAY::initialize()\r
88 {\r
89         // load rom image\r
90         FILEIO* fio = new FILEIO();\r
91         if(fio->Fopen(emu->bios_path(_T("FONT.ROM")), FILEIO_READ_BINARY)) {\r
92                 fio->Fread(font, sizeof(font), 1);\r
93                 fio->Fclose();\r
94         }\r
95         delete fio;\r
96         \r
97         mode = 2;\r
98         dma = 0x80;\r
99 }\r
100 \r
101 void DISPLAY::write_signal(int id, uint32 data, uint32 mask)\r
102 {\r
103         if(id == SIG_DISPLAY_MODE) {\r
104                 // 8255 PC on TK-80BS\r
105                 mode = data & mask;\r
106         } else if(id == SIG_DISPLAY_DMA) {\r
107                 // 8255 PC on TK-80\r
108                 dma = data & mask;\r
109         }\r
110 }\r
111 \r
112 void DISPLAY::draw_screen()\r
113 {\r
114         // draw screen\r
115         scrntype col_w = (mode & 2) ? RGB_COLOR(255, 255, 255) : 0;\r
116         scrntype col_b = (mode & 2) ? 0 : RGB_COLOR(255, 255, 255);\r
117         int code_ofs = (mode & 1) << 8;\r
118         int ptr = 0;\r
119         \r
120         for(int y = 0; y < 128; y += 8) {\r
121                 for(int x = 0; x < 256; x += 8) {\r
122                         int code = vram[ptr++] | code_ofs;\r
123                         uint8* font_base = &font[code << 3];\r
124                         \r
125                         for(int l = 0; l < 8; l++) {\r
126                                 uint8 pat = font_base[l];\r
127                                 scrntype* dest = &screen[l][x];\r
128                                 \r
129                                 dest[0] = (pat & 0x80) ? col_w : col_b;\r
130                                 dest[1] = (pat & 0x40) ? col_w : col_b;\r
131                                 dest[2] = (pat & 0x20) ? col_w : col_b;\r
132                                 dest[3] = (pat & 0x10) ? col_w : col_b;\r
133                                 dest[4] = (pat & 0x08) ? col_w : col_b;\r
134                                 dest[5] = (pat & 0x04) ? col_w : col_b;\r
135                                 dest[6] = (pat & 0x02) ? col_w : col_b;\r
136                                 dest[7] = (pat & 0x01) ? col_w : col_b;\r
137                         }\r
138                 }\r
139                 for(int l = 0; l < 8; l++) {\r
140                         scrntype* dest = emu->screen_buffer(y + l);\r
141                         scrntype* src = screen[l];\r
142                         memcpy(dest, src, 256 * sizeof(scrntype));\r
143                 }\r
144         }\r
145         // draw leds\r
146         scrntype col_red = RGB_COLOR(255, 0, 0);\r
147         scrntype col_on = RGB_COLOR(255, 8, 72);\r
148         scrntype col_off = RGB_COLOR(56, 0, 0);\r
149         scrntype col[10];\r
150         \r
151         memset(screen, 0, sizeof(screen));\r
152         for(int i = 0; i < 8; i++) {\r
153                 for(int i = 0; i < 8; i++) {\r
154                         uint8 pat = dma ? led[i] : 0;\r
155                         col[0] = 0;\r
156                         col[1] = pat & 0x01 ? col_on : col_off;\r
157                         col[2] = pat & 0x02 ? col_on : col_off;\r
158                         col[3] = pat & 0x04 ? col_on : col_off;\r
159                         col[4] = pat & 0x08 ? col_on : col_off;\r
160                         col[5] = pat & 0x10 ? col_on : col_off;\r
161                         col[6] = pat & 0x20 ? col_on : col_off;\r
162                         col[7] = pat & 0x40 ? col_on : col_off;\r
163                         col[8] = pat & 0x80 ? col_on : col_off;\r
164                         col[9] = col_red;\r
165                         for(int y = 0; y < 35; y++) {\r
166                                 scrntype *dest = &screen[y + 1][dest_x[i]];\r
167                                 for(int x = 0; x < 24; x++) {\r
168                                         dest[x] = col[pat_led[y][x]];\r
169                                 }\r
170                         }\r
171                 }\r
172         }\r
173         // draw kb type\r
174         col[1] = d_key->read_signal(0) & 1 ? col_red : col_off;\r
175         col[2] = d_key->read_signal(0) & 2 ? col_red : col_off;\r
176         \r
177         for(int y = 0; y < 31; y++) {\r
178                 scrntype *dest = &screen[y + 3][210];\r
179                 for(int x = 0; x < 42; x++) {\r
180                         dest[x] = col[pat_kb[y][x]];\r
181                 }\r
182         }\r
183         \r
184         // copy to screen\r
185         for(int y = 0; y < 36; y++) {\r
186                 scrntype* dest = emu->screen_buffer(y + 128);\r
187                 scrntype* src = screen[y];\r
188                 memcpy(dest, src, 256 * sizeof(scrntype));\r
189         }\r
190 }\r
191 \r