Dmuse: Color and upper-ASCII codes
Contents
The Representation of Color in Dmuse Text Files
The design of the Dmuse screen has its origins in the old PC screen. The old PC screen, which was character based, used two bytes to represent each character cell on the screen: one byte for the character, and one for the color attributes. The color attribute byte had two parts: color of the foreground -- the letters, themselves -- and the color of the background -- the field on which the letters appeared. The Dmuse screen also uses this system to represent characters and their color attributes.
The ability to use different color combinations for characters has proven quite useful. The eye is quick to distinguish color, and this makes it easy to flag or highlight certain areas of the screen. But there needs to be a mechanism for coding this information for storage in a file; otherwise, no advantage would be gained in using colors, since this information would simply go away when the window was saved. The most direct way to store window data would be to store each cell: character and attribute. But this has two very large disadvantages. One, it is very wasteful, since most text is written in a "default" combination, e.g., white on black. Second, it makes the file very difficult to read by other programs, since only every other byte contains a valid character. The alternative used by Dmuse is to insert an escape sequence each time the color attribute in a line changes. Since these changes do not happen very often, the extra bytes do not add up to a lot of extra storage. And since the escape sequences come in blocks, they do not interfere with the characters, at least not on a massive scale.
The escape sequences used by Dmuse actually derive from those used by the old (c. 1965) HP 2640 Smart Terminal, on which the first Ibycus systems were based (see the History of Dmuse). Dmuse supports 16 different color combinations, which can be accessed by means of the four function keys, F5, F6, F7, F8, used with the four states: unaltered, Shft, Ctrl, and Ctrl+Shft. By convention, F5 is assigned the default combination, usually white on black. Here are the 16 escape codes used by Dmuse to flag these comgination changes in a file. <esc> here refers to the ASCII byte 27 (hex 0x1b).
Combination | Escape Sequence | |
---|---|---|
Character string | Dmuse key command | |
Combination 0: | <esc>&d@ | F5 |
Combination 1: | <esc>&dA | F6 |
Combination 2: | <esc>&dB | F7 |
Combination 3: | <esc>&dC | F8 |
Combination 4: | <esc>&dD | Shft+F5 |
Combination 5: | <esc>&dE | Shft+F6 |
Combination 6: | <esc>&dF | Shft+F7 |
Combination 7: | <esc>&dG | Shft+F8 |
Combination 8: | <esc>&dH | Ctrl+F5 |
Combination 9: | <esc>&dI | Ctrl+F6 |
Combination 10: | <esc>&dJ | Ctrl+F7 |
Combination 11: | <esc>&dK | Ctrl+F8 |
Combination 12: | <esc>&dL | Ctrl+Shft+F5 |
Combination 13: | <esc>&dM | Ctrl+Shft+F6 |
Combination 14: | <esc>&dN | Ctrl+Shft+F7 |
Combination 15: | <esc>&dO | Ctrl+Shft+F8 |
In a plain ASCII text editor, a file created by Dmuse might display the following string (using ? to represent the escape byte, 0x1b):
?&dAThis combination is black on red.?&d@
which would be displayed in Dmuse as:
This combination is black on red
with "?&dA" indicating color combination 1 (black letters on a red background), and "?&d@" indicating color combination 0 (return to default colors).
The Use of Non-standard ASCII Codes in Dmuse Files
Byte values range from 0 to 255. For purposes of representing text in Western European alphabets, only a subset of these values is agreed upon by everyone to have a standard meaning. For reasons now lost to most of us, this is called standard ASCII. The subset includes the values 32 to 126, and a few additional values such as 27 (= escape), 13 (= carriage return), 10 (= line-feed), and 9 (= Tab).
When text files are used to represent data that is meant to be read by multiple programs running on a variety of computer platforms, it is absolutely essential that ONLY standard ASCII be used. But it would be a shame to limit screen applications such as Dmuse to the 100 or so standard ASCII characters. Dmuse, for example, can display each of the letters, a,e,i,o,u, A,E,I,O,U, with the acute accent, the grave, the circumflex, and the umlaut or dieresis. Since Dmuse can put only one character in a cell, that's 10 x 4 = 40 additional screen characters. Another example: Dmuse can draw lines and boxes with both single and double lines. Tables and diagrams made with these characters have many useful applications. It takes 40 special characters to do this. So Dmuse does make use of almost all of the 256 byte values, even though only 100 of these values have a standard meaning.
This means that text files generated by Dmuse can have non-standard ASCII bytes in them. These bytes have a clear and sensible meaning to Dmuse, but other programs will interpret them differently with what may look like nonsensible results. There is no problem so long as files generated by Dmuse for general export (MuseData files, for example) contain bytes only from the standard ASCII set. Files intended for use by Dmuse alone are not subject to this limitation. Here is a list of the byte codes used by Dmuse.
Byte Code | Character description | Dmuse key command | |
---|---|---|---|
Dec | Hex | ||
0 | 0x00 | (no character) | (none) |
1 | 0x01 | musical sharp (♯) | Ctrl+Shft+A |
2 | 0x02 | musical flat (♭) | Ctrl+Shft+B |
3 | 0x03 | musical natural (♮) | Ctrl+Shft+C |
4 | 0x04 | centered diamond (♦) | Ctrl+Shft+D |
5 | 0x05 | top of the large open parenthesis | Ctrl+Shft+E |
6 | 0x06 | bottom of the large open parenthesis | Ctrl+Shft+F |
7 | 0x07 | large centered dot (•) | Shft+Alt+9 |
8 | 0x08 | top of the large close parenthesis | Ctrl+Shft+G |
9 | 0x09 | vertical dotted line, also used to represent Tab character (┊) |
Shft+Alt+0 (zero) |
10 | 0x0a | line-feed | Shft+Alt+- (minus) |
11 | 0x0b | copyright (©) | Ctrl+Shft+K |
12 | 0x0c | bottom of the large close parenthesis | Ctrl+Shft+H |
13 | 0x0d | carriage return | Ctrl+Shft+L |
14 | 0x0e | small arrow pointing right (→) | Ctrl+Shft+M |
15 | 0x0f | sun burst (☼) | Ctrl+Shft+O (letter) |
16 | 0x10 | large arrow head pointing right (►) | Ctrl+Shft+P |
17 | 0x11 | large arrow head pointing left (◄) | Ctrl+Shft+Q |
18 | 0x12 | start of small square root character (√) | Ctrl+Shft+R |
19 | 0x13 | top of square root character (_) | Ctrl+Shft+S |
20 | 0x14 | paragraph (¶) | Ctrl+Shft+T |
21 | 0x15 | section (§) | Ctrl+Shft+U |
22 | 0x16 | vertical part of large square root | Ctrl+Shft+V |
23 | 0x17 | start of large square root (\) | Ctrl+Shft+W |
24 | 0x18 | small arrow pointing up (↑) | Ctrl+Shft+X |
25 | 0x19 | small arrow pointing down (↓) | Ctrl+Shft+Y |
26 | 0x1a | plus or minus (±) | Shft+Alt+= |
27 | 0x1b | (escape, no character) | (none) |
28 | 0x1c | small arrow pointing left (←) | Ctrl+Shft+N |
29 | 0x1d | arrow both ways (↔) | (none) |
30 | 0x1e | large arrow head pointing up (▲) | Ctrl+Shft+I (letter) |
31 | 0x1f | large arrow head pointing down (▼) | Ctrl+Shft+J |
32-126 | (standard ASCII) | Standard Keys | |
127 | 0x7f | house (⌂) | Ctrl+Shft+Z |
128 | 0x80 | C-cedilla (Ç) | C then Alt+2 |
129 | 0x81 | u-umlaut (ü) | u then Alt+3 |
130 | 0x82 | e-acute (é) | e then Alt+7 |
131 | 0x83 | a-circumflex (â) | a then Alt+9 |
132 | 0x84 | a-umlaut (ä) | a then Alt+3 |
133 | 0x85 | a-grave (à) | a then Alt+8 |
134 | 0x86 | a-circle (å) | a then Alt+4 |
135 | 0x87 | c-cedilla (ç) | c then Alt+2 |
136 | 0x88 | e-circumflex (ê) | e then Alt+9 |
137 | 0x89 | e-dieresis (ë) | e then Alt+3 |
138 | 0x8a | e-grave (è) | e then Alt+8 |
139 | 0x8b | i-dieresis (ï) | i then Alt+3 |
140 | 0x8c | i-circumflex (î) | i then Alt+9 |
141 | 0x8d | i-grave (ì) | i then Alt+8 |
142 | 0x8e | A-umlaut (Ä) | A then Alt+3 |
143 | 0x8f | A-circle (Å) | A then Alt+4 |
144 | 0x90 | E-acute (é) | E then Alt+7 |
145 | 0x91 | ae (æ) | Shft+Alt+I |
146 | 0x92 | AE (Æ) | Shft+Alt+O |
147 | 0x93 | o-circumflex (ô) | o then Alt+9 |
148 | 0x94 | o-umlaut (ö) | o then Alt+3 |
149 | 0x95 | o-grave (ò) | o then Alt+8 |
150 | 0x96 | u-circumflex (û) | u then Alt+9 |
151 | 0x97 | u-grave (ù) | u then Alt+8 |
152 | 0x98 | y-dieresis (ü) | y then Alt+3 |
153 | 0x99 | O-umlaut (Ö) | O then Alt+3 |
154 | 0x9a | U-umlaut (Ü) | U then Alt+3 |
155 | 0x9b | cent (¢) | Shft+Alt+$ |
156 | 0x9c | British pound (£) | Shft+Alt+# |
157 | 0x9d | Japanese yen (¥) | Shft+Alt+@ |
158 | 0x9e | Pt (&Pt;) | Shft+Alt+P |
159 | 0x9f | florin (ƒ) | Shft+Alt+% |
160 | 0xa0 | a-acute (á) | a then Alt+7 |
161 | 0xa1 | i-acute (í) | i then Alt+7 |
162 | 0xa2 | o-acute (ó) | o then Alt+7 |
163 | 0xa3 | u-acute (ú) | u then Alt+7 |
164 | 0xa4 | n-tilde (ñ) | n then Alt+1 |
165 | 0xa5 | N-tilde (Ñ) | N then Alt+1 |
166 | 0xa6 | R-caron (Ř) | R then Alt+5 |
167 | 0xa7 | r-caron (ř) | r then Alt+5 |
168 | 0xa8 | inverted question (¿) | Shft+Alt+? |
169 | 0xa9 | right-angle up-left (⌐) | Alt+= |
170 | 0xaa | right-angle up-right (¬) | Alt+- |
171 | 0xab | half (½) | Shft+Alt+* |
172 | 0xac | quarter (¼) | Shft+Alt+& |
173 | 0xad | inverted exclamation (¡) | Shft+Alt+! |
174 | 0xae | left angle quote («) | Shft+Alt+< |
175 | 0xaf | right angle quote (») | Shft+Alt+> |
176 | 0xb0 | full cell quarter shade (░) | Alt+o |
177 | 0xb1 | full cell half shade (▒) | Alt+p |
178 | 0xb2 | full cell 3/4 shade (▓) | Alt+[ |
179 | 0xb3 | line drawing: single vertical line (│) | Alt+f |
180 | 0xb4 | line drawing: single right-center (┤) | Alt+d |
181 | 0xb5 | line drawing: single/double right-center | Shft+Alt+J |
182 | 0xb6 | line drawing: double/single right-center | Shft+Alt+D |
183 | 0xb7 | line drawing: double/single upper-right | Shft+Alt+E |
184 | 0xb8 | line drawing: single/double upper-right | Shft+Alt+U |
185 | 0xb9 | line drawing: double right-center | Alt+j |
186 | 0xba | line drawing: double vertical line | Alt+k |
187 | 0xbb | line drawing: double upper-right | Alt+u |
188 | 0xbc | line drawing: double lower-right | Alt+m |
189 | 0xbd | line drawing: double/single lower-right | Shft+Alt+C |
190 | 0xbe | line drawing: single/double lower-right | Shft+Alt+M |
191 | 0xbf | line drawing: single upper-right | Alt+e |
192 | 0xc0 | line drawing: single lower-left | Alt+z |
193 | 0xc1 | line drawing: single lower-center | Alt+x |
194 | 0xc2 | line drawing: single upper-center | Alt+w |
195 | 0xc3 | line drawing: single left-center | Alt+a |
196 | 0xc4 | line drawing: single horizontal line | Alt+r |
197 | 0xc5 | line drawing: single center | Alt+s |
198 | 0xc6 | line drawing: single/double left-center | Shft+Alt+G |
199 | 0xc7 | line drawing: double/single left-center | Shft+Alt+A |
200 | 0xc8 | line drawing: double lower-left | Alt+b |
201 | 0xc9 | line drawing: double upper-left | Alt+t |
202 | 0xca | line drawing: double lower-center | Alt+n |
203 | 0xcb | line drawing: double upper-center | Alt+y |
204 | 0xcc | line drawing: double left-center | Alt+g |
205 | 0xcd | line drawing: double horizontal line | Alt+i |
206 | 0xce | line drawing: double center (╬) | Alt+h |
207 | 0xcf | line drawing: single/double lower-center | Shft+Alt+N |
208 | 0xd0 | line drawing: double/single lower-center | Shft+Alt+X |
209 | 0xd1 | line drawing: single/double upper-center (╤) | Shft+Alt+Y |
210 | 0xd2 | line drawing: double/single upper-center | Shft+Alt+W |
211 | 0xd3 | line drawing: double/single lower-left | Shft+Alt+Z |
212 | 0xd4 | line drawing: single/double lower-left | Shft+Alt+B |
213 | 0xd5 | line drawing: single/double upper-left | Shft+Alt+T |
214 | 0xd6 | line drawing: double-single upper-left | Shft+Alt+Q |
215 | 0xd7 | line drawing: double/single center | Shft+Alt+S |
216 | 0xd8 | line drawing: single/double center | Shft+Alt+H |
217 | 0xd9 | line drawing: single lower-right | Shft+Alt+c |
218 | 0xda | line drawing: single upper-left | Shft+Alt+q |
219 | 0xdb | full cell full shade (█) | Alt+] |
220 | 0xdc | lower-half cell full shade (▄) | Alt+; |
221 | 0xdd | left-half cell full shade (▌) | Alt+, |
222 | 0xde | right-half cell full shade (▐) | Alt+. |
223 | 0xdf | upper-half cell full shade (▀) | Alt+l |
224 | 0xe0 | A-circumflex (Â) | A then Alt+9 |
225 | 0xe1 | A-grave (À) | A then Alt+8 |
226 | 0xe2 | A-acute (Á) | A then Alt+7 |
227 | 0xe3 | E-circumflex (Ê) | E then Alt+9 |
228 | 0xe4 | E-dieresis (Ë) | E then Alt+3 |
229 | 0xe5 | E-grave (È) | E then Alt+8 |
230 | 0xe6 | I-circumflex (Î} | I then Alt+9 |
231 | 0xe7 | I-grave (Ì) | I then Alt+8 |
232 | 0xe8 | I-acute (Í) | I then Alt+7 |
233 | 0xe9 | I-dieresis (Ï) | I then Alt+3 |
234 | 0xea | O-circumflex (Ô) | O then Alt+9 |
235 | 0xeb | O-grave (Ò) | O then Alt+8 |
236 | 0xec | O-acute (Ó) | O then Alt+7 |
237 | 0xed | U-circumflex (Û) | U then Alt+9 |
238 | 0xee | U-grave (Ù) | U then Alt+8 |
239 | 0xef | U-acute (Ú) | U then Alt+7 |
240 | 0xf0 | Y-dieresis (Ÿ) | Y then Alt+3 |
241 | 0xf1 | y-acute (ý) | y then Alt+7 |
242 | 0xf2 | Y-acute (Ý) | Y then Alt+7 |
243 | 0xf3 | o-slash (ø) | o then Alt+2 |
244 | 0xf4 | O-slash (Ø) | O then Alt+2 |
245 | 0xf5 | o-tilde (õ) | o then Alt+1 |
246 | 0xf6 | O-tilde (Õ) | O then Alt+1 |
247 | 0xf7 | German ss (ß) | s then Alt+2 |
248 | 0xf8 | S-caron (Š) | S then Alt+5 |
249 | 0xf9 | s-caron (š) | s then Alt+5 |
250 | 0xfa | small centered dot (·) | Shft+Alt+] |
251 | 0xfb | small capital phi (Φ) | (none) |
252 | 0xfc | large capital phi (Φ) | (none) |
253 | 0xfd | degree (°) | Shft+Alt+^ |
254 | 0xfe | centered box | Shft+Alt+[ |
255 | 0xff | cursor | (none) |
The following screen shot of Dmuse show the contents of this file which contains a list of each byte code as it is displayed in Dmuse (when the Dmuse fonts have been installed correctly for X11).