OSDN Git Service

ee2508d8bb49b121b16fdd82f51038a08e587948
[csp-qt/common_source_project-fm7.git] / source / src / vm / tk80bs / display.cpp
1 /*
2         NEC TK-80BS (COMPO BS/80) Emulator 'eTK-80BS'
3
4         Author : Takeda.Toshiya
5         Date   : 2008.08.26 -
6
7         [ display ]
8 */
9
10 #include "display.h"
11
12 static const int led_pattern[46][33] = {
13         {9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9},
14         {9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9},
15         {9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9},
16         {9,9,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,9,9},
17         {9,9,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,9,9},
18         {9,9,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,9,9},
19         {9,9,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,9,9},
20         {9,9,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2,0,0,0,0,9,9},
21         {9,9,0,0,0,0,6,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2,2,0,0,0,0,9,9},
22         {9,9,0,0,0,0,6,6,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2,2,2,0,0,0,0,9,9},
23         {9,9,0,0,0,0,6,6,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,0,0,0,0,9,9},
24         {9,9,0,0,0,0,6,6,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,0,0,0,0,9,9},
25         {9,9,0,0,0,0,6,6,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,0,0,0,0,9,9},
26         {9,9,0,0,0,0,6,6,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,0,0,0,0,9,9},
27         {9,9,0,0,0,0,6,6,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,0,0,0,0,9,9},
28         {9,9,0,0,0,0,6,6,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,0,0,0,0,9,9},
29         {9,9,0,0,0,6,6,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,0,0,0,0,0,9,9},
30         {9,9,0,0,0,6,6,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,0,0,0,0,0,9,9},
31         {9,9,0,0,0,6,6,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,0,0,0,0,0,9,9},
32         {9,9,0,0,0,6,6,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,0,0,0,0,0,9,9},
33         {9,9,0,0,0,6,6,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,0,0,0,0,0,9,9},
34         {9,9,0,0,0,0,6,0,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,0,2,0,0,0,0,0,0,9,9},
35         {9,9,0,0,0,0,0,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,0,0,0,0,0,0,0,9,9},
36         {9,9,0,0,0,0,5,0,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,0,3,0,0,0,0,0,0,9,9},
37         {9,9,0,0,0,5,5,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,3,3,0,0,0,0,0,9,9},
38         {9,9,0,0,0,5,5,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,3,3,0,0,0,0,0,9,9},
39         {9,9,0,0,0,5,5,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,3,3,0,0,0,0,0,9,9},
40         {9,9,0,0,0,5,5,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,3,3,0,0,0,0,0,9,9},
41         {9,9,0,0,0,5,5,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,3,3,0,0,0,0,0,9,9},
42         {9,9,0,0,5,5,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,3,3,0,0,0,0,0,0,9,9},
43         {9,9,0,0,5,5,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,3,3,0,0,0,0,0,0,9,9},
44         {9,9,0,0,5,5,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,3,3,0,0,0,0,0,0,9,9},
45         {9,9,0,0,5,5,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,3,3,0,0,0,0,0,0,9,9},
46         {9,9,0,0,5,5,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,3,3,0,0,0,0,0,0,9,9},
47         {9,9,0,0,5,5,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,3,3,0,0,0,0,0,0,9,9},
48         {9,9,0,0,5,5,0,4,4,4,4,4,4,4,4,4,4,4,4,4,4,0,3,3,3,0,8,8,8,0,0,9,9},
49         {9,9,0,0,5,0,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,0,3,3,0,8,8,8,0,0,9,9},
50         {9,9,0,0,0,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,0,3,0,8,8,8,0,0,9,9},
51         {9,9,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,9,9},
52         {9,9,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,9,9},
53         {9,9,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,9,9},
54         {9,9,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,9,9},
55         {9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9},
56         {9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9},
57         {9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9},
58         {9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9},
59 };
60
61 void DISPLAY::initialize()
62 {
63         // load rom image
64         FILEIO* fio = new FILEIO();
65         if(fio->Fopen(create_local_path(_T("FONT.ROM")), FILEIO_READ_BINARY)) {
66                 fio->Fread(font, sizeof(font), 1);
67                 fio->Fclose();
68         }
69         delete fio;
70         
71         mode = 2;
72         dma = true;
73 }
74
75 void DISPLAY::write_signal(int id, uint32_t data, uint32_t mask)
76 {
77         if(id == SIG_DISPLAY_MODE) {
78                 // 8255 PC on TK-80BS
79                 mode = data & mask;
80         } else if(id == SIG_DISPLAY_DMA) {
81                 // 8255 PC on TK-80
82                 dma = ((data & mask) != 0);
83         }
84 }
85
86 void DISPLAY::draw_screen()
87 {
88         // draw screen
89         scrntype_t color_w = (mode & 2) ? RGB_COLOR(255, 255, 255) : RGB_COLOR(0, 0, 1);
90         scrntype_t color_b = (mode & 2) ? RGB_COLOR(0, 0, 1) : RGB_COLOR(255, 255, 255);
91         int code_ofs = (mode & 1) << 8;
92         int ptr = 0;
93
94         for(int y = 0; y < 128; y += 8) {
95                 for(int x = 0; x < 256; x += 8) {
96                         int code = vram[ptr++];
97                         if(code != 0x20) {
98                                 vm->draw_ranges = 9;
99                         }
100                         code |= code_ofs;
101                         uint8_t* font_base = &font[code << 3];
102                         
103                         for(int l = 0; l < 8; l++) {
104                                 uint8_t pat = font_base[l];
105                                 scrntype_t* dest = &screen[l][x];
106                                 
107                                 dest[0] = (pat & 0x80) ? color_w : color_b;
108                                 dest[1] = (pat & 0x40) ? color_w : color_b;
109                                 dest[2] = (pat & 0x20) ? color_w : color_b;
110                                 dest[3] = (pat & 0x10) ? color_w : color_b;
111                                 dest[4] = (pat & 0x08) ? color_w : color_b;
112                                 dest[5] = (pat & 0x04) ? color_w : color_b;
113                                 dest[6] = (pat & 0x02) ? color_w : color_b;
114                                 dest[7] = (pat & 0x01) ? color_w : color_b;
115                         }
116                 }
117                 for(int l = 0; l < 8; l++) {
118                         scrntype_t* dest0 = emu->get_screen_buffer(vm_ranges[8].y + (y + l) * 2 + 0) + vm_ranges[8].x;
119                         scrntype_t* dest1 = emu->get_screen_buffer(vm_ranges[8].y + (y + l) * 2 + 1) + vm_ranges[8].x;
120                         scrntype_t* src = screen[l];
121                         for(int x = 0, xx = 0; x < 256; x++, xx += 2) {
122                                 dest0[xx] = dest0[xx + 1] = src[x];
123                         }
124                         memcpy(dest1, dest0, 256 * 2 * sizeof(scrntype_t));
125                 }
126         }
127         // draw 7-seg LEDs
128         scrntype_t col[10];
129         scrntype_t color_on  = RGB_COLOR(255, 8, 72);
130         scrntype_t color_off = RGB_COLOR(56, 0, 0);
131         col[0] = RGB_COLOR(38, 8, 0);
132         col[9] = color_off;
133         
134         memset(screen, 0, sizeof(screen));
135         for(int i = 0; i < 8; i++) {
136                 uint8_t pat = dma ? led[i] : 0;
137                 col[1] = pat & 0x01 ? color_on : color_off;
138                 col[2] = pat & 0x02 ? color_on : color_off;
139                 col[3] = pat & 0x04 ? color_on : color_off;
140                 col[4] = pat & 0x08 ? color_on : color_off;
141                 col[5] = pat & 0x10 ? color_on : color_off;
142                 col[6] = pat & 0x20 ? color_on : color_off;
143                 col[7] = pat & 0x40 ? color_on : color_off;
144                 col[8] = pat & 0x80 ? color_on : color_off;
145                 for(int y = 0; y < 46; y++) {
146                         scrntype_t* dest = emu->get_screen_buffer(vm_ranges[i].y + y) + vm_ranges[i].x;
147                         for(int x = 0; x < 33; x++) {
148                                 dest[x] = col[led_pattern[y][x]];
149                         }
150                 }
151         }
152 }
153
154 #define STATE_VERSION   1
155
156 void DISPLAY::save_state(FILEIO* state_fio)
157 {
158         state_fio->FputUint32(STATE_VERSION);
159         state_fio->FputInt32(this_device_id);
160         
161         state_fio->FputInt32(mode);
162         state_fio->FputBool(dma);
163 }
164
165 bool DISPLAY::load_state(FILEIO* state_fio)
166 {
167         if(state_fio->FgetUint32() != STATE_VERSION) {
168                 return false;
169         }
170         if(state_fio->FgetInt32() != this_device_id) {
171                 return false;
172         }
173         mode = state_fio->FgetInt32();
174         dma = state_fio->FgetBool();
175         return true;
176 }
177