OXYGENHUB
◆ main openmsx / src / MSXCharacterSets.cc
25.9 KiB · C++ · last changed chore(): initial commit 1 month ago source blame history raw
1
/** \file MSXCharacterSets.cc
2
 * MSX Character Set Data implementation.
3
 * Extracted from Printer.cc for shared use.
4
 */
5
6
#include "MSXCharacterSets.hh"
7
#include "xrange.hh"
8
#include <algorithm>
9
#include <array>
10
11
namespace openmsx {
12
13
static constexpr std::array<uint8_t, 256 * 8> MSXFontRaw = {
14
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0
15
	0x3C, 0x42, 0xA5, 0x81, 0xA5, 0x99, 0x42, 0x3C,  // 1
16
	0x3C, 0x7E, 0xDB, 0xFF, 0xFF, 0xDB, 0x66, 0x3C,  // 2
17
	0x6C, 0xFE, 0xFE, 0xFE, 0x7C, 0x38, 0x10, 0x00,  // 3
18
	0x10, 0x38, 0x7C, 0xFE, 0x7C, 0x38, 0x10, 0x00,  // 4
19
	0x10, 0x38, 0x54, 0xFE, 0x54, 0x10, 0x38, 0x00,  // 5
20
	0x10, 0x38, 0x7C, 0xFE, 0xFE, 0x10, 0x38, 0x00,  // 6
21
	0x00, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, 0x00,  // 7
22
	0xFF, 0xFF, 0xFF, 0xE7, 0xE7, 0xFF, 0xFF, 0xFF,  // 8
23
	0x38, 0x44, 0x82, 0x82, 0x82, 0x44, 0x38, 0x00,  // 9
24
	0xC7, 0xBB, 0x7D, 0x7D, 0x7D, 0xBB, 0xC7, 0xFF,  // 10
25
	0x0F, 0x03, 0x05, 0x79, 0x88, 0x88, 0x88, 0x70,  // 11
26
	0x38, 0x44, 0x44, 0x44, 0x38, 0x10, 0x7C, 0x10,  // 12
27
	0x30, 0x28, 0x24, 0x24, 0x28, 0x20, 0xE0, 0xC0,  // 13
28
	0x3C, 0x24, 0x3C, 0x24, 0x24, 0xE4, 0xDC, 0x18,  // 14
29
	0x10, 0x54, 0x38, 0xEE, 0x38, 0x54, 0x10, 0x00,  // 15
30
	0x10, 0x10, 0x10, 0x7C, 0x10, 0x10, 0x10, 0x10,  // 16
31
	0x10, 0x10, 0x10, 0xFF, 0x00, 0x00, 0x00, 0x00,  // 17
32
	0x00, 0x00, 0x00, 0xFF, 0x10, 0x10, 0x10, 0x10,  // 18
33
	0x10, 0x10, 0x10, 0xF0, 0x10, 0x10, 0x10, 0x10,  // 19
34
	0x10, 0x10, 0x10, 0x1F, 0x10, 0x10, 0x10, 0x10,  // 20
35
	0x10, 0x10, 0x10, 0xFF, 0x10, 0x10, 0x10, 0x10,  // 21
36
	0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,  // 22
37
	0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00,  // 23
38
	0x00, 0x00, 0x00, 0x1F, 0x10, 0x10, 0x10, 0x10,  // 24
39
	0x00, 0x00, 0x00, 0xF0, 0x10, 0x10, 0x10, 0x10,  // 25
40
	0x10, 0x10, 0x10, 0x1F, 0x00, 0x00, 0x00, 0x00,  // 26
41
	0x10, 0x10, 0x10, 0xF0, 0x00, 0x00, 0x00, 0x00,  // 27
42
	0x81, 0x42, 0x24, 0x18, 0x18, 0x24, 0x42, 0x81,  // 28
43
	0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80,  // 29
44
	0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01,  // 30
45
	0x00, 0x10, 0x10, 0xFF, 0x10, 0x10, 0x00, 0x00,  // 31
46
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 32
47
	0x20, 0x20, 0x20, 0x20, 0x00, 0x00, 0x20, 0x00,  // 33
48
	0x50, 0x50, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00,  // 34
49
	0x50, 0x50, 0xF8, 0x50, 0xF8, 0x50, 0x50, 0x00,  // 35
50
	0x20, 0x78, 0xA0, 0x70, 0x28, 0xF0, 0x20, 0x00,  // 36
51
	0xC0, 0xC8, 0x10, 0x20, 0x40, 0x98, 0x18, 0x00,  // 37
52
	0x40, 0xA0, 0x40, 0xA8, 0x90, 0x98, 0x60, 0x00,  // 38
53
	0x10, 0x20, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00,  // 39
54
	0x10, 0x20, 0x40, 0x40, 0x40, 0x20, 0x10, 0x00,  // 40
55
	0x40, 0x20, 0x10, 0x10, 0x10, 0x20, 0x40, 0x00,  // 41
56
	0x20, 0xA8, 0x70, 0x20, 0x70, 0xA8, 0x20, 0x00,  // 42
57
	0x00, 0x20, 0x20, 0xF8, 0x20, 0x20, 0x00, 0x00,  // 43
58
	0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x20, 0x40,  // 44
59
	0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00,  // 45
60
	0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00,  // 46
61
	0x00, 0x00, 0x08, 0x10, 0x20, 0x40, 0x80, 0x00,  // 47
62
	0x70, 0x88, 0x98, 0xA8, 0xC8, 0x88, 0x70, 0x00,  // 48
63
	0x20, 0x60, 0xA0, 0x20, 0x20, 0x20, 0xF8, 0x00,  // 49
64
	0x70, 0x88, 0x08, 0x10, 0x60, 0x80, 0xF8, 0x00,  // 50
65
	0x70, 0x88, 0x08, 0x30, 0x08, 0x88, 0x70, 0x00,  // 51
66
	0x10, 0x30, 0x50, 0x90, 0xF8, 0x10, 0x10, 0x00,  // 52
67
	0xF8, 0x80, 0xE0, 0x10, 0x08, 0x10, 0xE0, 0x00,  // 53
68
	0x30, 0x40, 0x80, 0xF0, 0x88, 0x88, 0x70, 0x00,  // 54
69
	0xF8, 0x88, 0x10, 0x20, 0x20, 0x20, 0x20, 0x00,  // 55
70
	0x70, 0x88, 0x88, 0x70, 0x88, 0x88, 0x70, 0x00,  // 56
71
	0x70, 0x88, 0x88, 0x78, 0x08, 0x10, 0x60, 0x00,  // 57
72
	0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00,  // 58
73
	0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x20, 0x40,  // 59
74
	0x18, 0x30, 0x60, 0xC0, 0x60, 0x30, 0x18, 0x00,  // 60
75
	0x00, 0x00, 0xF8, 0x00, 0xF8, 0x00, 0x00, 0x00,  // 61
76
	0xC0, 0x60, 0x30, 0x18, 0x30, 0x60, 0xC0, 0x00,  // 62
77
	0x70, 0x88, 0x08, 0x10, 0x20, 0x00, 0x20, 0x00,  // 63
78
	0x70, 0x88, 0x08, 0x68, 0xA8, 0xA8, 0x70, 0x00,  // 64
79
	0x20, 0x50, 0x88, 0x88, 0xF8, 0x88, 0x88, 0x00,  // 65
80
	0xF0, 0x48, 0x48, 0x70, 0x48, 0x48, 0xF0, 0x00,  // 66
81
	0x30, 0x48, 0x80, 0x80, 0x80, 0x48, 0x30, 0x00,  // 67
82
	0xE0, 0x50, 0x48, 0x48, 0x48, 0x50, 0xE0, 0x00,  // 68
83
	0xF8, 0x80, 0x80, 0xF0, 0x80, 0x80, 0xF8, 0x00,  // 69
84
	0xF8, 0x80, 0x80, 0xF0, 0x80, 0x80, 0x80, 0x00,  // 70
85
	0x70, 0x88, 0x80, 0xB8, 0x88, 0x88, 0x70, 0x00,  // 71
86
	0x88, 0x88, 0x88, 0xF8, 0x88, 0x88, 0x88, 0x00,  // 72
87
	0x70, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x00,  // 73
88
	0x38, 0x10, 0x10, 0x10, 0x90, 0x90, 0x60, 0x00,  // 74
89
	0x88, 0x90, 0xA0, 0xC0, 0xA0, 0x90, 0x88, 0x00,  // 75
90
	0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xF8, 0x00,  // 76
91
	0x88, 0xD8, 0xA8, 0xA8, 0x88, 0x88, 0x88, 0x00,  // 77
92
	0x88, 0xC8, 0xC8, 0xA8, 0x98, 0x98, 0x88, 0x00,  // 78
93
	0x70, 0x88, 0x88, 0x88, 0x88, 0x88, 0x70, 0x00,  // 79
94
	0xF0, 0x88, 0x88, 0xF0, 0x80, 0x80, 0x80, 0x00,  // 80
95
	0x70, 0x88, 0x88, 0x88, 0xA8, 0x90, 0x68, 0x00,  // 81
96
	0xF0, 0x88, 0x88, 0xF0, 0xA0, 0x90, 0x88, 0x00,  // 82
97
	0x70, 0x88, 0x80, 0x70, 0x08, 0x88, 0x70, 0x00,  // 83
98
	0xF8, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x00,  // 84
99
	0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x70, 0x00,  // 85
100
	0x88, 0x88, 0x88, 0x88, 0x50, 0x50, 0x20, 0x00,  // 86
101
	0x88, 0x88, 0x88, 0xA8, 0xA8, 0xD8, 0x88, 0x00,  // 87
102
	0x88, 0x88, 0x50, 0x20, 0x50, 0x88, 0x88, 0x00,  // 88
103
	0x88, 0x88, 0x88, 0x70, 0x20, 0x20, 0x20, 0x00,  // 89
104
	0xF8, 0x08, 0x10, 0x20, 0x40, 0x80, 0xF8, 0x00,  // 90
105
	0x70, 0x40, 0x40, 0x40, 0x40, 0x40, 0x70, 0x00,  // 91
106
	0x00, 0x00, 0x80, 0x40, 0x20, 0x10, 0x08, 0x00,  // 92
107
	0x70, 0x10, 0x10, 0x10, 0x10, 0x10, 0x70, 0x00,  // 93
108
	0x20, 0x50, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00,  // 94
109
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x00,  // 95
110
	0x40, 0x20, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00,  // 96
111
	0x00, 0x00, 0x70, 0x08, 0x78, 0x88, 0x78, 0x00,  // 97
112
	0x80, 0x80, 0xB0, 0xC8, 0x88, 0xC8, 0xB0, 0x00,  // 98
113
	0x00, 0x00, 0x70, 0x88, 0x80, 0x88, 0x70, 0x00,  // 99
114
	0x08, 0x08, 0x68, 0x98, 0x88, 0x98, 0x68, 0x00,  // 100
115
	0x00, 0x00, 0x70, 0x88, 0xF8, 0x80, 0x70, 0x00,  // 101
116
	0x10, 0x28, 0x20, 0xF8, 0x20, 0x20, 0x20, 0x00,  // 102
117
	0x00, 0x00, 0x68, 0x98, 0x98, 0x68, 0x08, 0x70,  // 103
118
	0x80, 0x80, 0xF0, 0x88, 0x88, 0x88, 0x88, 0x00,  // 104
119
	0x20, 0x00, 0x60, 0x20, 0x20, 0x20, 0x70, 0x00,  // 105
120
	0x10, 0x00, 0x30, 0x10, 0x10, 0x10, 0x90, 0x60,  // 106
121
	0x40, 0x40, 0x48, 0x50, 0x60, 0x50, 0x48, 0x00,  // 107
122
	0x60, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x00,  // 108
123
	0x00, 0x00, 0xD0, 0xA8, 0xA8, 0xA8, 0xA8, 0x00,  // 109
124
	0x00, 0x00, 0xB0, 0xC8, 0x88, 0x88, 0x88, 0x00,  // 110
125
	0x00, 0x00, 0x70, 0x88, 0x88, 0x88, 0x70, 0x00,  // 111
126
	0x00, 0x00, 0xB0, 0xC8, 0xC8, 0xB0, 0x80, 0x80,  // 112
127
	0x00, 0x00, 0x68, 0x98, 0x98, 0x68, 0x08, 0x08,  // 113
128
	0x00, 0x00, 0xB0, 0xC8, 0x80, 0x80, 0x80, 0x00,  // 114
129
	0x00, 0x00, 0x78, 0x80, 0xF0, 0x08, 0xF0, 0x00,  // 115
130
	0x40, 0x40, 0xF0, 0x40, 0x40, 0x48, 0x30, 0x00,  // 116
131
	0x00, 0x00, 0x90, 0x90, 0x90, 0x90, 0x68, 0x00,  // 117
132
	0x00, 0x00, 0x88, 0x88, 0x88, 0x50, 0x20, 0x00,  // 118
133
	0x00, 0x00, 0x88, 0xA8, 0xA8, 0xA8, 0x50, 0x00,  // 119
134
	0x00, 0x00, 0x88, 0x50, 0x20, 0x50, 0x88, 0x00,  // 120
135
	0x00, 0x00, 0x88, 0x88, 0x98, 0x68, 0x08, 0x70,  // 121
136
	0x00, 0x00, 0xF8, 0x10, 0x20, 0x40, 0xF8, 0x00,  // 122
137
	0x18, 0x20, 0x20, 0x40, 0x20, 0x20, 0x18, 0x00,  // 123
138
	0x20, 0x20, 0x20, 0x00, 0x20, 0x20, 0x20, 0x00,  // 124
139
	0xC0, 0x20, 0x20, 0x10, 0x20, 0x20, 0xC0, 0x00,  // 125
140
	0x40, 0xA8, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00,  // 126
141
	0x00, 0x00, 0x20, 0x50, 0xF8, 0x00, 0x00, 0x00,  // 127
142
	0x70, 0x88, 0x80, 0x80, 0x88, 0x70, 0x20, 0x60,  // 128
143
	0x90, 0x00, 0x00, 0x90, 0x90, 0x90, 0x68, 0x00,  // 129
144
	0x10, 0x20, 0x70, 0x88, 0xF8, 0x80, 0x70, 0x00,  // 130
145
	0x20, 0x50, 0x70, 0x08, 0x78, 0x88, 0x78, 0x00,  // 131
146
	0x48, 0x00, 0x70, 0x08, 0x78, 0x88, 0x78, 0x00,  // 132
147
	0x20, 0x10, 0x70, 0x08, 0x78, 0x88, 0x78, 0x00,  // 133
148
	0x20, 0x00, 0x70, 0x08, 0x78, 0x88, 0x78, 0x00,  // 134
149
	0x00, 0x70, 0x80, 0x80, 0x80, 0x70, 0x10, 0x60,  // 135
150
	0x20, 0x50, 0x70, 0x88, 0xF8, 0x80, 0x70, 0x00,  // 136
151
	0x50, 0x00, 0x70, 0x88, 0xF8, 0x80, 0x70, 0x00,  // 137
152
	0x20, 0x10, 0x70, 0x88, 0xF8, 0x80, 0x70, 0x00,  // 138
153
	0x50, 0x00, 0x00, 0x60, 0x20, 0x20, 0x70, 0x00,  // 139
154
	0x20, 0x50, 0x00, 0x60, 0x20, 0x20, 0x70, 0x00,  // 140
155
	0x40, 0x20, 0x00, 0x60, 0x20, 0x20, 0x70, 0x00,  // 141
156
	0x50, 0x00, 0x20, 0x50, 0x88, 0xF8, 0x88, 0x00,  // 142
157
	0x20, 0x00, 0x20, 0x50, 0x88, 0xF8, 0x88, 0x00,  // 143
158
	0x10, 0x20, 0xF8, 0x80, 0xF0, 0x80, 0xF8, 0x00,  // 144
159
	0x00, 0x00, 0x6C, 0x12, 0x7E, 0x90, 0x6E, 0x00,  // 145
160
	0x3E, 0x50, 0x90, 0x9C, 0xF0, 0x90, 0x9E, 0x00,  // 146
161
	0x60, 0x90, 0x00, 0x60, 0x90, 0x90, 0x60, 0x00,  // 147
162
	0x90, 0x00, 0x00, 0x60, 0x90, 0x90, 0x60, 0x00,  // 148
163
	0x40, 0x20, 0x00, 0x60, 0x90, 0x90, 0x60, 0x00,  // 149
164
	0x40, 0xA0, 0x00, 0xA0, 0xA0, 0xA0, 0x50, 0x00,  // 150
165
	0x40, 0x20, 0x00, 0xA0, 0xA0, 0xA0, 0x50, 0x00,  // 151
166
	0x90, 0x00, 0x90, 0x90, 0xB0, 0x50, 0x10, 0xE0,  // 152
167
	0x50, 0x00, 0x70, 0x88, 0x88, 0x88, 0x70, 0x00,  // 153
168
	0x50, 0x00, 0x88, 0x88, 0x88, 0x88, 0x70, 0x00,  // 154
169
	0x20, 0x20, 0x78, 0x80, 0x80, 0x78, 0x20, 0x20,  // 155
170
	0x18, 0x24, 0x20, 0xF8, 0x20, 0xE2, 0x5C, 0x00,  // 156
171
	0x88, 0x50, 0x20, 0xF8, 0x20, 0xF8, 0x20, 0x00,  // 157
172
	0xC0, 0xA0, 0xA0, 0xC8, 0x9C, 0x88, 0x88, 0x8C,  // 158
173
	0x18, 0x20, 0x20, 0xF8, 0x20, 0x20, 0x20, 0x40,  // 159
174
	0x10, 0x20, 0x70, 0x08, 0x78, 0x88, 0x78, 0x00,  // 160
175
	0x10, 0x20, 0x00, 0x60, 0x20, 0x20, 0x70, 0x00,  // 161
176
	0x20, 0x40, 0x00, 0x60, 0x90, 0x90, 0x60, 0x00,  // 162
177
	0x20, 0x40, 0x00, 0x90, 0x90, 0x90, 0x68, 0x00,  // 163
178
	0x50, 0xA0, 0x00, 0xA0, 0xD0, 0x90, 0x90, 0x00,  // 164
179
	0x28, 0x50, 0x00, 0xC8, 0xA8, 0x98, 0x88, 0x00,  // 165
180
	0x00, 0x70, 0x08, 0x78, 0x88, 0x78, 0x00, 0xF8,  // 166
181
	0x00, 0x60, 0x90, 0x90, 0x90, 0x60, 0x00, 0xF0,  // 167
182
	0x20, 0x00, 0x20, 0x40, 0x80, 0x88, 0x70, 0x00,  // 168
183
	0x00, 0x00, 0x00, 0xF8, 0x80, 0x80, 0x00, 0x00,  // 169
184
	0x00, 0x00, 0x00, 0xF8, 0x08, 0x08, 0x00, 0x00,  // 170
185
	0x84, 0x88, 0x90, 0xA8, 0x54, 0x84, 0x08, 0x1C,  // 171
186
	0x84, 0x88, 0x90, 0xA8, 0x58, 0xA8, 0x3C, 0x08,  // 172
187
	0x20, 0x00, 0x00, 0x20, 0x20, 0x20, 0x20, 0x00,  // 173
188
	0x00, 0x00, 0x24, 0x48, 0x90, 0x48, 0x24, 0x00,  // 174
189
	0x00, 0x00, 0x90, 0x48, 0x24, 0x48, 0x90, 0x00,  // 175
190
	0x28, 0x50, 0x20, 0x50, 0x88, 0xF8, 0x88, 0x00,  // 176
191
	0x28, 0x50, 0x70, 0x08, 0x78, 0x88, 0x78, 0x00,  // 177
192
	0x28, 0x50, 0x00, 0x70, 0x20, 0x20, 0x70, 0x00,  // 178
193
	0x28, 0x50, 0x00, 0x20, 0x20, 0x20, 0x70, 0x00,  // 179
194
	0x28, 0x50, 0x00, 0x70, 0x88, 0x88, 0x70, 0x00,  // 180
195
	0x50, 0xA0, 0x00, 0x60, 0x90, 0x90, 0x60, 0x00,  // 181
196
	0x28, 0x50, 0x00, 0x88, 0x88, 0x88, 0x70, 0x00,  // 182
197
	0x50, 0xA0, 0x00, 0xA0, 0xA0, 0xA0, 0x50, 0x00,  // 183
198
	0xFC, 0x48, 0x48, 0x48, 0xE8, 0x08, 0x50, 0x20,  // 184
199
	0x00, 0x50, 0x00, 0x50, 0x50, 0x50, 0x10, 0x20,  // 185
200
	0xC0, 0x44, 0xC8, 0x54, 0xEC, 0x54, 0x9E, 0x04,  // 186
201
	0x10, 0xA8, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00,  // 187
202
	0x00, 0x20, 0x50, 0x88, 0x50, 0x20, 0x00, 0x00,  // 188
203
	0x88, 0x10, 0x20, 0x40, 0x80, 0x28, 0x00, 0x00,  // 189
204
	0x7C, 0xA8, 0xA8, 0x68, 0x28, 0x28, 0x28, 0x00,  // 190
205
	0x38, 0x40, 0x30, 0x48, 0x48, 0x30, 0x08, 0x70,  // 191
206
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF,  // 192
207
	0xF0, 0xF0, 0xF0, 0xF0, 0x0F, 0x0F, 0x0F, 0x0F,  // 193
208
	0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,  // 194
209
	0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 195
210
	0x00, 0x00, 0x00, 0x3C, 0x3C, 0x00, 0x00, 0x00,  // 196
211
	0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00,  // 197
212
	0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0,  // 198
213
	0x0F, 0x0F, 0x0F, 0x0F, 0xF0, 0xF0, 0xF0, 0xF0,  // 199
214
	0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC,  // 200
215
	0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03,  // 201
216
	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,  // 202
217
	0x11, 0x22, 0x44, 0x88, 0x11, 0x22, 0x44, 0x88,  // 203
218
	0x88, 0x44, 0x22, 0x11, 0x88, 0x44, 0x22, 0x11,  // 204
219
	0xFE, 0x7C, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00,  // 205
220
	0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x7C, 0xFE,  // 206
221
	0x80, 0xC0, 0xE0, 0xF0, 0xE0, 0xC0, 0x80, 0x00,  // 207
222
	0x01, 0x03, 0x07, 0x0F, 0x07, 0x03, 0x01, 0x00,  // 208
223
	0xFF, 0x7E, 0x3C, 0x18, 0x18, 0x3C, 0x7E, 0xFF,  // 209
224
	0x81, 0xC3, 0xE7, 0xFF, 0xFF, 0xE7, 0xC3, 0x81,  // 210
225
	0xF0, 0xF0, 0xF0, 0xF0, 0x00, 0x00, 0x00, 0x00,  // 211
226
	0x00, 0x00, 0x00, 0x00, 0x0F, 0x0F, 0x0F, 0x0F,  // 212
227
	0x0F, 0x0F, 0x0F, 0x0F, 0x00, 0x00, 0x00, 0x00,  // 213
228
	0x00, 0x00, 0x00, 0x00, 0xF0, 0xF0, 0xF0, 0xF0,  // 214
229
	0x33, 0x33, 0xCC, 0xCC, 0x33, 0x33, 0xCC, 0xCC,  // 215
230
	0x00, 0x20, 0x20, 0x50, 0x50, 0x88, 0xF8, 0x00,  // 216
231
	0x20, 0x20, 0x70, 0x20, 0x70, 0x20, 0x20, 0x00,  // 217
232
	0x00, 0x00, 0x00, 0x50, 0x88, 0xA8, 0x50, 0x00,  // 218
233
	0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,  // 219
234
	0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF,  // 220
235
	0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0,  // 221
236
	0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F,  // 222
237
	0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00,  // 223
238
	0x00, 0x00, 0x68, 0x90, 0x90, 0x90, 0x68, 0x00,  // 224
239
	0x30, 0x48, 0x48, 0x70, 0x48, 0x48, 0x70, 0xC0,  // 225
240
	0xF8, 0x88, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00,  // 226
241
	0xF8, 0x50, 0x50, 0x50, 0x50, 0x50, 0x98, 0x00,  // 227
242
	0xF8, 0x88, 0x40, 0x20, 0x40, 0x88, 0xF8, 0x00,  // 228
243
	0x00, 0x00, 0x78, 0x90, 0x90, 0x90, 0x60, 0x00,  // 229
244
	0x00, 0x50, 0x50, 0x50, 0x50, 0x68, 0x80, 0x80,  // 230
245
	0x00, 0x50, 0xA0, 0x20, 0x20, 0x20, 0x20, 0x00,  // 231
246
	0xF8, 0x20, 0x70, 0xA8, 0xA8, 0x70, 0x20, 0xF8,  // 232
247
	0x20, 0x50, 0x88, 0xF8, 0x88, 0x50, 0x20, 0x00,  // 233
248
	0x70, 0x88, 0x88, 0x88, 0x50, 0x50, 0xD8, 0x00,  // 234
249
	0x30, 0x40, 0x40, 0x20, 0x50, 0x50, 0x50, 0x20,  // 235
250
	0x00, 0x00, 0x00, 0x50, 0xA8, 0xA8, 0x50, 0x00,  // 236
251
	0x08, 0x70, 0xA8, 0xA8, 0xA8, 0x70, 0x80, 0x00,  // 237
252
	0x38, 0x40, 0x80, 0xF8, 0x80, 0x40, 0x38, 0x00,  // 238
253
	0x70, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x00,  // 239
254
	0x00, 0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x00, 0x00,  // 240
255
	0x20, 0x20, 0xF8, 0x20, 0x20, 0x00, 0xF8, 0x00,  // 241
256
	0xC0, 0x30, 0x08, 0x30, 0xC0, 0x00, 0xF8, 0x00,  // 242
257
	0x18, 0x60, 0x80, 0x60, 0x18, 0x00, 0xF8, 0x00,  // 243
258
	0x10, 0x28, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,  // 244
259
	0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0xA0, 0x40,  // 245
260
	0x00, 0x20, 0x00, 0xF8, 0x00, 0x20, 0x00, 0x00,  // 246
261
	0x00, 0x50, 0xA0, 0x00, 0x50, 0xA0, 0x00, 0x00,  // 247
262
	0x00, 0x18, 0x24, 0x24, 0x18, 0x00, 0x00, 0x00,  // 248
263
	0x00, 0x30, 0x78, 0x78, 0x30, 0x00, 0x00, 0x00,  // 249
264
	0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00,  // 250
265
	0x3E, 0x20, 0x20, 0x20, 0xA0, 0x60, 0x20, 0x00,  // 251
266
	0xA0, 0x50, 0x50, 0x50, 0x00, 0x00, 0x00, 0x00,  // 252
267
	0x40, 0xA0, 0x20, 0x40, 0xE0, 0x00, 0x00, 0x00,  // 253
268
	0x00, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x00,  // 254
269
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 255
270
};
271
272
std::span<const uint8_t, 8 * 256> getMSXFontRaw()
273
{
274
	return MSXFontRaw;
275
}
276
277
// The German DIN and International character sets are identical, apart from the style of zero (0) character.
278
// The international character set has a zero with a slash, while the DIN character set has a dotted zero.
279
static constexpr auto MSXDINFontRaw = []{
280
	auto result = MSXFontRaw;
281
	// character 48: 0x70, 0x88, 0x98, 0xA8, 0xC8, 0x88, 0x70, 0x00
282
	// replaces by:  0x70, 0x88, 0x88, 0xA8, 0x88, 0x88, 0x70, 0x00
283
	size_t offset = 48 * 8;
284
	result[offset + 2] = 0x88;
285
	result[offset + 4] = 0x88;
286
	return result;
287
}();
288
289
std::span<const uint8_t, 8 * 256> getMSXDINFontRaw()
290
{
291
	return MSXDINFontRaw;
292
}
293
294
static constexpr auto MSXAsciiFontRaw = []{
295
	std::array<uint8_t, 96 * 8> result = {};
296
	for (size_t i = 0; i < result.size(); ++i) {
297
		result[i] = MSXFontRaw[0x20 * 8 + i];
298
	}
299
	return result;
300
}();
301
302
static constexpr std::array<uint8_t, 32 * 8> MSXJPFontRawPrefix = {
303
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0
304
	0x7E, 0x42, 0x7E, 0x42, 0x7E, 0x42, 0x82, 0x00,  // 1
305
	0x10, 0x92, 0x54, 0x10, 0x28, 0x44, 0x82, 0x00,  // 2
306
	0x12, 0x14, 0xF8, 0x14, 0x34, 0x52, 0x92, 0x00,  // 3
307
	0x10, 0x10, 0xFE, 0x10, 0x38, 0x54, 0x92, 0x00,  // 4
308
	0x10, 0x28, 0x7C, 0x92, 0x38, 0x54, 0xFE, 0x00,  // 5
309
	0x10, 0x10, 0x10, 0x7C, 0x10, 0x10, 0xFE, 0x00,  // 6
310
	0x7E, 0x42, 0x42, 0x7E, 0x42, 0x42, 0x7E, 0x00,  // 7
311
	0x40, 0x7E, 0x48, 0x3C, 0x28, 0x7E, 0x08, 0x00,  // 8
312
	0xFE, 0x92, 0x92, 0xFE, 0x82, 0x82, 0x86, 0x00,  // 9
313
	0x04, 0xEE, 0xA4, 0xEF, 0xA2, 0xEA, 0x06, 0x00,  // 10
314
	0x28, 0x44, 0x82, 0x3C, 0x14, 0x24, 0x4C, 0x00,  // 11
315
	0x28, 0xC8, 0x5C, 0xEA, 0x6C, 0xC8, 0x50, 0x00,  // 12
316
	0x7C, 0x20, 0x7C, 0x44, 0x7C, 0x44, 0x7C, 0x00,  // 13
317
	0x0C, 0x70, 0x10, 0xFE, 0x10, 0x10, 0x10, 0x00,  // 14
318
	0x7E, 0x10, 0x1E, 0x12, 0x22, 0x44, 0x08, 0x00,  // 15
319
	0x00, 0x7C, 0x28, 0x28, 0x28, 0x4E, 0x00, 0x00,  // 16
320
	0x10, 0x10, 0x10, 0xFF, 0x00, 0x00, 0x00, 0x00,  // 17
321
	0x00, 0x00, 0x00, 0xFF, 0x10, 0x10, 0x10, 0x10,  // 18
322
	0x10, 0x10, 0x10, 0xF0, 0x10, 0x10, 0x10, 0x10,  // 19
323
	0x10, 0x10, 0x10, 0x1F, 0x10, 0x10, 0x10, 0x10,  // 20
324
	0x10, 0x10, 0x10, 0xFF, 0x10, 0x10, 0x10, 0x10,  // 21
325
	0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,  // 22
326
	0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00,  // 23
327
	0x00, 0x00, 0x00, 0x1F, 0x10, 0x10, 0x10, 0x10,  // 24
328
	0x00, 0x00, 0x00, 0xF0, 0x10, 0x10, 0x10, 0x10,  // 25
329
	0x10, 0x10, 0x10, 0x1F, 0x00, 0x00, 0x00, 0x00,  // 26
330
	0x10, 0x10, 0x10, 0xF0, 0x00, 0x00, 0x00, 0x00,  // 27
331
	0x81, 0x42, 0x24, 0x18, 0x18, 0x24, 0x42, 0x81,  // 28
332
	0x10, 0x7C, 0x10, 0x10, 0x28, 0x44, 0x82, 0x00,  // 29
333
	0x10, 0x10, 0xFE, 0x92, 0xFE, 0x10, 0x10, 0x00,  // 30
334
	0x10, 0x10, 0x54, 0x54, 0x92, 0x10, 0x30, 0x00,  // 31
335
};
336
337
static constexpr std::array<uint8_t, 128 * 8> MSXJPFontRawSuffix = {
338
	0x10, 0x38, 0x7C, 0xFE, 0xFE, 0x38, 0x7C, 0x00,  // 128
339
	0x6C, 0xFE, 0xFE, 0xFE, 0x7C, 0x38, 0x10, 0x00,  // 129
340
	0x38, 0x38, 0xFE, 0xFE, 0xD6, 0x10, 0x7C, 0x00,  // 130
341
	0x10, 0x38, 0x7C, 0xFE, 0x7C, 0x38, 0x10, 0x00,  // 131
342
	0x00, 0x78, 0x84, 0x84, 0x84, 0x84, 0x78, 0x00,  // 132
343
	0x00, 0x78, 0xFC, 0xFC, 0xFC, 0xFC, 0x78, 0x00,  // 133
344
	0x20, 0xF0, 0x4C, 0x70, 0xA8, 0x40, 0x3C, 0x00,  // 134
345
	0x00, 0x20, 0x78, 0x20, 0x78, 0xB4, 0x64, 0x00,  // 135
346
	0x00, 0x00, 0x88, 0x84, 0x84, 0x84, 0x40, 0x00,  // 136
347
	0x00, 0x70, 0x00, 0x70, 0x88, 0x08, 0x30, 0x00,  // 137
348
	0x00, 0x70, 0x00, 0xF0, 0x20, 0x60, 0x98, 0x00,  // 138
349
	0x00, 0x20, 0xF8, 0x24, 0x78, 0xA4, 0x68, 0x00,  // 139
350
	0x00, 0x90, 0x58, 0x64, 0xA8, 0x20, 0x10, 0x00,  // 140
351
	0x00, 0x10, 0xB8, 0xD4, 0x94, 0x18, 0x20, 0x00,  // 141
352
	0x00, 0x10, 0x1C, 0x10, 0x70, 0x98, 0x74, 0x00,  // 142
353
	0x00, 0x00, 0x00, 0x78, 0x04, 0x04, 0x38, 0x00,  // 143
354
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 144
355
	0x20, 0x7C, 0x20, 0x7C, 0xAA, 0x92, 0x64, 0x00,  // 145
356
	0x00, 0x84, 0x82, 0x82, 0x82, 0x80, 0x40, 0x00,  // 146
357
	0x38, 0x00, 0x38, 0x44, 0x04, 0x08, 0x30, 0x00,  // 147
358
	0x70, 0x00, 0xF8, 0x10, 0x20, 0x60, 0x9C, 0x00,  // 148
359
	0x24, 0xFA, 0x20, 0x7C, 0xA2, 0xA2, 0x44, 0x00,  // 149
360
	0x40, 0x44, 0xF2, 0x4A, 0x48, 0x88, 0x30, 0x00,  // 150
361
	0x20, 0xFC, 0x10, 0xFC, 0x08, 0x80, 0x78, 0x00,  // 151
362
	0x08, 0x10, 0x20, 0x40, 0x20, 0x10, 0x08, 0x00,  // 152
363
	0x04, 0x84, 0x9E, 0x84, 0x84, 0x84, 0x48, 0x00,  // 153
364
	0x78, 0x04, 0x00, 0x00, 0x00, 0x80, 0x7C, 0x00,  // 154
365
	0x10, 0xFE, 0x08, 0x04, 0x04, 0x80, 0x78, 0x00,  // 155
366
	0x80, 0x80, 0x80, 0x80, 0x84, 0x88, 0x70, 0x00,  // 156
367
	0x08, 0xFE, 0x38, 0x48, 0x38, 0x08, 0x10, 0x00,  // 157
368
	0x44, 0x44, 0xFE, 0x44, 0x48, 0x40, 0x3C, 0x00,  // 158
369
	0x44, 0x28, 0xFE, 0x20, 0x40, 0x40, 0x3C, 0x00,  // 159
370
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 160
371
	0x00, 0x00, 0x00, 0x00, 0x60, 0x90, 0x60, 0x00,  // 161
372
	0x38, 0x20, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00,  // 162
373
	0x00, 0x00, 0x00, 0x20, 0x20, 0x20, 0xE0, 0x00,  // 163
374
	0x00, 0x00, 0x00, 0x00, 0x80, 0x40, 0x20, 0x00,  // 164
375
	0x00, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, 0x00,  // 165
376
	0xF8, 0x08, 0xF8, 0x08, 0x10, 0x20, 0x40, 0x00,  // 166
377
	0x00, 0x00, 0xF0, 0x10, 0x60, 0x40, 0x80, 0x00,  // 167
378
	0x00, 0x10, 0x20, 0x60, 0xA0, 0x20, 0x20, 0x00,  // 168
379
	0x00, 0x20, 0xF0, 0x90, 0x10, 0x20, 0x40, 0x00,  // 169
380
	0x00, 0x00, 0xF0, 0x20, 0x20, 0x20, 0xF0, 0x00,  // 170
381
	0x00, 0x20, 0xF0, 0x60, 0xA0, 0xA0, 0x20, 0x00,  // 171
382
	0x00, 0x40, 0xF8, 0x48, 0x50, 0x40, 0x40, 0x00,  // 172
383
	0x00, 0x00, 0x70, 0x10, 0x10, 0x10, 0xF8, 0x00,  // 173
384
	0x00, 0x00, 0xF0, 0x10, 0xF0, 0x10, 0xF0, 0x00,  // 174
385
	0x00, 0x00, 0xA8, 0xA8, 0x08, 0x10, 0x20, 0x00,  // 175
386
	0x00, 0x00, 0x80, 0x7C, 0x00, 0x00, 0x00, 0x00,  // 176
387
	0xF8, 0x08, 0x28, 0x30, 0x20, 0x20, 0x40, 0x00,  // 177
388
	0x08, 0x10, 0x20, 0x60, 0xA0, 0x20, 0x20, 0x00,  // 178
389
	0x20, 0xF8, 0x88, 0x88, 0x08, 0x10, 0x20, 0x00,  // 179
390
	0x00, 0xF8, 0x20, 0x20, 0x20, 0x20, 0xF8, 0x00,  // 180
391
	0x10, 0xF8, 0x10, 0x30, 0x50, 0x90, 0x10, 0x00,  // 181
392
	0x20, 0xF8, 0x28, 0x28, 0x28, 0x48, 0x88, 0x00,  // 182
393
	0x20, 0xF8, 0x20, 0xF8, 0x20, 0x20, 0x20, 0x00,  // 183
394
	0x78, 0x48, 0x88, 0x08, 0x08, 0x10, 0x20, 0x00,  // 184
395
	0x40, 0x78, 0x50, 0x90, 0x10, 0x10, 0x20, 0x00,  // 185
396
	0x00, 0xF8, 0x08, 0x08, 0x08, 0x08, 0xF8, 0x00,  // 186
397
	0x50, 0xF8, 0x50, 0x50, 0x10, 0x10, 0x20, 0x00,  // 187
398
	0x00, 0xC0, 0x08, 0xC8, 0x08, 0x10, 0xE0, 0x00,  // 188
399
	0x00, 0xF8, 0x08, 0x10, 0x20, 0x50, 0x88, 0x00,  // 189
400
	0x40, 0xF8, 0x48, 0x50, 0x40, 0x40, 0x38, 0x00,  // 190
401
	0x88, 0x88, 0x48, 0x08, 0x10, 0x20, 0x40, 0x00,  // 191
402
	0x78, 0x48, 0x78, 0x88, 0x08, 0x10, 0x20, 0x00,  // 192
403
	0x10, 0xE0, 0x20, 0xF8, 0x20, 0x20, 0x40, 0x00,  // 193
404
	0xA8, 0xA8, 0xA8, 0x08, 0x08, 0x10, 0x20, 0x00,  // 194
405
	0x70, 0x00, 0xF8, 0x20, 0x20, 0x20, 0x40, 0x00,  // 195
406
	0x40, 0x40, 0x60, 0x50, 0x48, 0x40, 0x40, 0x00,  // 196
407
	0x20, 0xF8, 0x20, 0x20, 0x20, 0x20, 0x40, 0x00,  // 197
408
	0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x00,  // 198
409
	0x00, 0xF8, 0x08, 0xD0, 0x20, 0x50, 0x88, 0x00,  // 199
410
	0x20, 0xF8, 0x08, 0x30, 0xE8, 0x20, 0x20, 0x00,  // 200
411
	0x08, 0x08, 0x08, 0x10, 0x20, 0x40, 0x80, 0x00,  // 201
412
	0x20, 0x10, 0x48, 0x48, 0x48, 0x48, 0x88, 0x00,  // 202
413
	0x80, 0x80, 0xF8, 0x80, 0x80, 0x80, 0x78, 0x00,  // 203
414
	0xF8, 0x08, 0x08, 0x08, 0x10, 0x20, 0x40, 0x00,  // 204
415
	0x00, 0x40, 0xA0, 0x10, 0x08, 0x08, 0x00, 0x00,  // 205
416
	0x20, 0xF8, 0x20, 0x20, 0xA8, 0xA8, 0x20, 0x00,  // 206
417
	0x00, 0xF8, 0x08, 0x08, 0x50, 0x20, 0x10, 0x00,  // 207
418
	0xF0, 0x00, 0x60, 0x00, 0x00, 0xF0, 0x08, 0x00,  // 208
419
	0x10, 0x20, 0x40, 0x80, 0x90, 0x88, 0xF8, 0x00,  // 209
420
	0x08, 0x08, 0x08, 0x50, 0x20, 0x50, 0x80, 0x00,  // 210
421
	0x78, 0x20, 0xF8, 0x20, 0x20, 0x20, 0x18, 0x00,  // 211
422
	0x40, 0xF8, 0x48, 0x48, 0x50, 0x40, 0x40, 0x00,  // 212
423
	0x00, 0x70, 0x10, 0x10, 0x10, 0x10, 0xF8, 0x00,  // 213
424
	0x00, 0xF8, 0x08, 0xF8, 0x08, 0x08, 0xF8, 0x00,  // 214
425
	0x70, 0x00, 0xF8, 0x08, 0x08, 0x10, 0x20, 0x00,  // 215
426
	0x48, 0x48, 0x48, 0x48, 0x48, 0x10, 0x20, 0x00,  // 216
427
	0x10, 0x50, 0x50, 0x50, 0x50, 0x58, 0x90, 0x00,  // 217
428
	0x40, 0x40, 0x40, 0x48, 0x48, 0x50, 0x60, 0x00,  // 218
429
	0x00, 0xF8, 0x88, 0x88, 0x88, 0x88, 0xF8, 0x00,  // 219
430
	0xF8, 0x88, 0x88, 0x08, 0x08, 0x10, 0x20, 0x00,  // 220
431
	0x00, 0xC0, 0x00, 0x08, 0x08, 0x10, 0xE0, 0x00,  // 221
432
	0x90, 0x48, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 222
433
	0x60, 0x90, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00,  // 223
434
	0x20, 0xF8, 0x20, 0x4E, 0x40, 0x90, 0x8E, 0x00,  // 224
435
	0x10, 0xFE, 0x20, 0x78, 0x04, 0x04, 0x78, 0x00,  // 225
436
	0x00, 0xFC, 0x02, 0x02, 0x02, 0x04, 0x18, 0x00,  // 226
437
	0xFE, 0x08, 0x10, 0x20, 0x20, 0x20, 0x1C, 0x00,  // 227
438
	0x20, 0x24, 0x38, 0x60, 0x80, 0x80, 0x7C, 0x00,  // 228
439
	0x2C, 0xF2, 0x44, 0x44, 0x9C, 0x26, 0x1C, 0x00,  // 229
440
	0x00, 0x9E, 0x80, 0x80, 0x80, 0x90, 0x4E, 0x00,  // 230
441
	0x48, 0x48, 0x7C, 0xD2, 0xB6, 0xAA, 0x4C, 0x00,  // 231
442
	0x40, 0x4C, 0xD2, 0x62, 0x4E, 0xD2, 0x4E, 0x00,  // 232
443
	0x00, 0x38, 0x54, 0x92, 0xA2, 0xA2, 0x44, 0x00,  // 233
444
	0x04, 0x9E, 0x84, 0x84, 0x8C, 0x96, 0x4C, 0x00,  // 234
445
	0x10, 0xE4, 0x26, 0x44, 0x44, 0x48, 0x30, 0x00,  // 235
446
	0x20, 0x10, 0x00, 0x20, 0x14, 0x52, 0xB2, 0x00,  // 236
447
	0x00, 0x00, 0x20, 0x50, 0x88, 0x04, 0x02, 0x00,  // 237
448
	0x1E, 0x84, 0x9E, 0x84, 0x8C, 0x96, 0x4C, 0x00,  // 238
449
	0x10, 0xFC, 0x10, 0xFC, 0x70, 0x98, 0x74, 0x00,  // 239
450
	0x70, 0x10, 0x14, 0x7E, 0xA4, 0xA4, 0x48, 0x00,  // 240
451
	0x20, 0xF4, 0x22, 0x60, 0xA2, 0x62, 0x1C, 0x00,  // 241
452
	0x48, 0x48, 0x7C, 0xAA, 0x92, 0xA2, 0x44, 0x00,  // 242
453
	0x20, 0xF8, 0x20, 0xF8, 0x20, 0x24, 0x18, 0x00,  // 243
454
	0x48, 0x5C, 0x6A, 0xE2, 0x24, 0x10, 0x10, 0x00,  // 244
455
	0x10, 0x9C, 0xB2, 0xD2, 0x92, 0x1C, 0x20, 0x00,  // 245
456
	0x10, 0x1C, 0x10, 0x10, 0x78, 0x94, 0x70, 0x00,  // 246
457
	0x60, 0x10, 0x80, 0xB8, 0xC4, 0x84, 0x38, 0x00,  // 247
458
	0x08, 0x84, 0x84, 0x84, 0x44, 0x08, 0x30, 0x00,  // 248
459
	0x78, 0x10, 0x38, 0x44, 0xB4, 0x4C, 0x38, 0x00,  // 249
460
	0x20, 0x2C, 0xF4, 0x24, 0x64, 0xA4, 0x26, 0x00,  // 250
461
	0x78, 0x10, 0x20, 0x78, 0x84, 0x04, 0x38, 0x00,  // 251
462
	0x40, 0x40, 0xDC, 0x62, 0x42, 0xC2, 0x44, 0x00,  // 252
463
	0x10, 0x10, 0x20, 0x20, 0x60, 0x52, 0x8C, 0x00,  // 253
464
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 254
465
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 255
466
};
467
468
static constexpr auto MSXJPFontRaw = []{
469
	std::array<uint8_t, 256 * 8> result = {};
470
	for (size_t i = 0; i < MSXJPFontRawPrefix.size(); ++i) {
471
		result[i] = MSXJPFontRawPrefix[i];
472
	}
473
	for (size_t i = 0; i < MSXAsciiFontRaw.size(); ++i) {
474
		result[0x20 * 8 + i] = MSXAsciiFontRaw[i];
475
	}
476
	constexpr std::array<uint8_t, 8> jpBackslash = {
477
		0x88, 0x50, 0x20, 0x70, 0x20, 0x70, 0x20, 0x00
478
	};
479
	for (size_t i = 0; i < jpBackslash.size(); ++i) {
480
		result[0x5C * 8 + i] = jpBackslash[i];
481
	}
482
	for (size_t i = 0; i < 8; ++i) {
483
		result[0x7F * 8 + i] = 0x00;
484
	}
485
	for (size_t i = 0; i < MSXJPFontRawSuffix.size(); ++i) {
486
		result[0x80 * 8 + i] = MSXJPFontRawSuffix[i];
487
	}
488
	return result;
489
}();
490
491
std::span<const uint8_t, 8 * 256> getMSXJPFontRaw()
492
{
493
	return MSXJPFontRaw;
494
}
495
496
497
// Convert MSX printer font to Epson printer font
498
// International MSX font, rotated 90 degrees and padded to 9 dots high.
499
static constexpr auto MSXFontRotated = []{
500
	std::array<uint8_t, 256 * 9> result = {};
501
	for (auto i : xrange(256)) {
502
		uint8_t oneBits = 0;
503
		int start = -1;
504
		int end = 0;
505
506
		// Rotate MSX character
507
		for (auto j : xrange(8)) {
508
			uint8_t charBits = 0;
509
			for (auto k : xrange(8)) {
510
				charBits |= uint8_t(((MSXFontRaw[8 * i + 7 - k] >> (7 - j)) & 1) << k);
511
			}
512
513
			oneBits |= charBits;
514
			if (oneBits  != 0 && start < 0) start = j;
515
			if (charBits != 0) end = j;
516
			result[9 * i + j + 1] = charBits;
517
		}
518
519
		end = end + 1;
520
		if (start < 0 || start >= 7) start = 0;
521
		if (end == 1) end = 5;
522
		end = std::min(end, 7);
523
		result[9 * i] = uint8_t((start << 4) | end);
524
	}
525
	return result;
526
}();
527
528
std::span<const uint8_t, 9 * 256> getMSXFontRotated()
529
{
530
	return MSXFontRotated;
531
}
532
533
} // namespace openmsx