summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/video/pc1251.cpp
blob: ee7780d2e3d384c709d9e21244c7185404a135ed (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
// license:GPL-2.0+
// copyright-holders:Peter Trauner
#include "emu.h"

#include "includes/pocketc.h"
#include "includes/pc1251.h"

// TODO: Convert to SVG rendering or internal layout

#define LOG_LCD (1 << 0)

#define VERBOSE (0)
#include "logmacro.h"

const char *const pc1251_state::s_def[5] =
{
	"11  111 111",
	"1 1 1   1  ",
	"1 1 111 11 ",
	"1 1 1   1  ",
	"11  111 1  "
};
const char *const pc1251_state::s_shift[5] =
{
	" 11 1 1 1 111 111",
	"1   1 1 1 1    1 ",
	" 1  111 1 11   1 ",
	"  1 1 1 1 1    1 ",
	"11  1 1 1 1    1 "
};
const char *const pc1251_state::s_de[5] =
{
	"11  111",
	"1 1 1  ",
	"1 1 111",
	"1 1 1  ",
	"11  111"
};
const char *const pc1251_state::s_g[5] =
{
	" 11",
	"1  ",
	"1 1",
	"1 1",
	" 11"
};
const char *const pc1251_state::s_rad[5] =
{
	"11   1  11 ",
	"1 1 1 1 1 1",
	"11  111 1 1",
	"1 1 1 1 1 1",
	"1 1 1 1 11 "
};
const char *const pc1251_state::s_run[5] =
{
	"11  1 1 1  1",
	"1 1 1 1 11 1",
	"11  1 1 1 11",
	"1 1 1 1 1  1",
	"1 1  1  1  1"
};
const char *const pc1251_state::s_pro[5] =
{
	"11  11   1  ",
	"1 1 1 1 1 1 ",
	"11  11  1 1 ",
	"1   1 1 1 1 ",
	"1   1 1  1  "
};
const char *const pc1251_state::s_rsv[5] =
{
	"11   11 1   1",
	"1 1 1   1   1",
	"11   1   1 1 ",
	"1 1   1  1 1 ",
	"1 1 11    1  "
};

READ8_MEMBER(pc1251_state::lcd_read)
{
	uint8_t data = m_reg[offset & 0xff];
	LOGMASKED(LOG_LCD, "pc1251 read %.3x %.2x\n", offset, data);
	return data;
}

WRITE8_MEMBER(pc1251_state::lcd_write)
{
	LOGMASKED(LOG_LCD, "pc1251 write %.3x %.2x\n", offset, data);
	m_reg[offset & 0xff] = data;
}

#define DOWN 62
#define RIGHT 68

uint32_t pc1251_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
	int color[2] =
	{
		7, //pocketc_colortable[PC1251_CONTRAST][0],
		8, //pocketc_colortable[PC1251_CONTRAST][1]
	};

	bitmap.fill(11, cliprect);

	const int contrast = m_dsw0->read() & 7;
	int x = RIGHT;
	int y = DOWN;
	for (int i = 0; i < 60; x += 3)
		for (int j = 0; j < 5; j++, i++, x += 3)
			m_gfxdecode->gfx(0)->opaque(bitmap, cliprect, m_reg[i], contrast, 0, 0, x, y);

	for (int i = 0x7b; i >= 0x40; x += 3)
		for (int j = 0; j < 5; j++, i--, x += 3)
			m_gfxdecode->gfx(0)->opaque(bitmap,cliprect, m_reg[i], contrast, 0, 0, x, y);

	/* 0x3c 1 def?, 4 g, 8 de
	   0x3d 2 shift, 4 rad, 8 error
	   0x3e 1 pro?, 2 run?, 4rsv?*/

	pocketc_draw_special(bitmap, RIGHT+18,  DOWN-10, s_def,   BIT(m_reg[0x3c], 0) ? color[1] : color[0]);
	pocketc_draw_special(bitmap, RIGHT+142, DOWN-10, s_g,     BIT(m_reg[0x3c], 2) ? color[1] : color[0]);
	pocketc_draw_special(bitmap, RIGHT+134, DOWN-10, s_de,    BIT(m_reg[0x3c], 3) ? color[1] : color[0]);

	pocketc_draw_special(bitmap, RIGHT,     DOWN-10, s_shift, BIT(m_reg[0x3d], 1) ? color[1] : color[0]);
	pocketc_draw_special(bitmap, RIGHT+146, DOWN-10, s_rad,   BIT(m_reg[0x3d], 2) ? color[1] : color[0]);

	pocketc_draw_special(bitmap, RIGHT+38,  DOWN-10, s_pro,   BIT(m_reg[0x3e], 0) ? color[1] : color[0]);
	pocketc_draw_special(bitmap, RIGHT+53,  DOWN-10, s_run,   BIT(m_reg[0x3e], 1) ? color[1] : color[0]);
	pocketc_draw_special(bitmap, RIGHT+68,  DOWN-10, s_rsv,   BIT(m_reg[0x3e], 2) ? color[1] : color[0]);

	return 0;
}