Terminal program for MailStation devices
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

Initial import of msTERM

This is about 4 months of work, but most of the commits were hacks
and mistakes and me learning z80 assembly, so I'm sheepishly just
rebasing all of it down to a single commit.

joshua stein 69315da5

+7807
+1
.gitignore
··· 1 + obj/
+72
Makefile
··· 1 + # 2 + # msTERM 3 + # 4 + # Copyright (c) 2019 joshua stein <jcs@jcs.org> 5 + # 6 + # Permission to use, copy, modify, and distribute this software for any 7 + # purpose with or without fee is hereby granted, provided that the above 8 + # copyright notice and this permission notice appear in all copies. 9 + # 10 + # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 11 + # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 12 + # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 13 + # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 14 + # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 15 + # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 16 + # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 17 + # 18 + 19 + ASZ80 ?= sdasz80 -l 20 + SDCC ?= sdcc -mz80 21 + 22 + OBJ ?= obj/ 23 + 24 + all: msterm.bin 25 + 26 + clean: 27 + rm -f *.{map,bin,ihx,lst,rel,sym,lk,noi} 28 + 29 + crt0.rel: crt0.s 30 + $(ASZ80) -o $@ $> 31 + 32 + isr.rel: isr.s 33 + $(ASZ80) -o $@ $> 34 + 35 + putchar.rel: putchar.s 36 + $(ASZ80) -o $@ $> 37 + 38 + getchar.rel: getchar.s 39 + $(ASZ80) -o $@ $> 40 + 41 + lpt.rel: lpt.s 42 + $(ASZ80) -o $@ $> 43 + 44 + mailstation.rel: mailstation.c 45 + $(SDCC) -c $@ $> 46 + 47 + modem.rel: modem.s 48 + $(ASZ80) -o $@ $> 49 + 50 + mslib.rel: mslib.c 51 + $(SDCC) -c $@ $> 52 + 53 + msterm.rel: msterm.c 54 + $(SDCC) -c $@ $> 55 + 56 + csi.rel: csi.c 57 + $(SDCC) -c $@ $> 58 + 59 + # code-loc must be far enough to hold _HEADER code in crt0 60 + msterm.ihx: crt0.rel isr.rel putchar.rel getchar.rel lpt.rel mailstation.rel \ 61 + modem.rel msterm.rel mslib.rel csi.rel 62 + $(SDCC) --no-std-crt0 --code-loc 0x8100 --data-loc 0x0000 -o $@ $> 63 + 64 + msterm.bin: msterm.ihx 65 + hex2bin msterm.ihx >/dev/null 66 + @if [ `stat -f '%z' $@` -gt 16384 ]; then \ 67 + echo "$@ overflows a dataflash page, must be <= 16384"; \ 68 + exit 1; \ 69 + fi 70 + 71 + upload: all 72 + nc -N 192.168.1.129 12345 < msterm.bin
+311
crt0.s
··· 1 + ; vim:syntax=z8a:ts=8 2 + ; 3 + ; crt0 4 + ; msTERM 5 + ; 6 + ; Copyright (c) 2019 joshua stein <jcs@jcs.org> 7 + ; 8 + ; Permission to use, copy, modify, and distribute this software for any 9 + ; purpose with or without fee is hereby granted, provided that the above 10 + ; copyright notice and this permission notice appear in all copies. 11 + ; 12 + ; THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 13 + ; WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 14 + ; MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 15 + ; ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 16 + ; WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 17 + ; ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 18 + ; OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 19 + ; 20 + 21 + .module crt0 22 + 23 + .include "mailstation.inc" 24 + .globl _main 25 + .globl patch_isr 26 + .globl _lptrecv 27 + 28 + .area _HEADER (ABS) 29 + 30 + ; when running as a program from dataflash 31 + ; be sure to change --code-loc parameter in Makefile to 0x4100 32 + ;.org 0x4000 33 + 34 + ; when running from loader 35 + .org 0x8000 36 + 37 + jp boot 38 + 39 + .dw (icons) 40 + .dw (caption) 41 + .dw (dunno) 42 + 43 + dunno: 44 + .db #0 45 + xpos: 46 + .dw #0 47 + ypos: 48 + .dw #0 49 + caption: 50 + .dw #0x0001 ; ? 51 + .dw (endcap - caption - 6) ; number of chars 52 + .dw #0x0006 ; offset to first char 53 + .ascii "msTERM" ; the caption string 54 + endcap: 55 + 56 + icons: 57 + .dw (icon2 - icon1) ; size of icon1 58 + .dw (icon1 - icons) ; offset to icon1 59 + .dw (iconend - icon2) ; size of icon2 60 + .dw (icon2 - icons) ; offset to icon2 61 + 62 + icon1: 63 + .dw #0x0022 ; icon width (34, 5 bytes per row) 64 + .db #0x22 ; icon height (34) 65 + 66 + ; icon bitmap, low-order bit displays on the LEFT of each byte!) 67 + .db #0x55,#0x55,#0x55,#0x55,#0x55, #0xaa,#0xaa,#0xaa,#0xaa,#0xaa 68 + .db #0x55,#0x55,#0x55,#0x55,#0x55, #0xaa,#0xaa,#0xaa,#0xaa,#0xaa 69 + .db #0x55,#0x55,#0x55,#0x55,#0x55, #0xaa,#0xaa,#0xaa,#0xaa,#0xaa 70 + .db #0x55,#0x55,#0x55,#0x55,#0x55, #0xaa,#0xaa,#0xaa,#0xaa,#0xaa 71 + .db #0x55,#0x55,#0x55,#0x55,#0x55, #0xaa,#0xaa,#0x00,#0xaa,#0xaa 72 + .db #0x55,#0x55,#0x00,#0x55,#0x55, #0xaa,#0xaa,#0x00,#0xaa,#0xaa 73 + .db #0x55,#0x55,#0x00,#0x55,#0x55, #0xaa,#0xaa,#0x00,#0xaa,#0xaa 74 + .db #0x55,#0x55,#0x00,#0x55,#0x55, #0xaa,#0xaa,#0x00,#0xaa,#0xaa 75 + .db #0x55,#0x55,#0x00,#0x55,#0x55, #0xaa,#0xaa,#0xaa,#0xaa,#0xaa 76 + .db #0x55,#0x55,#0x55,#0x55,#0x55, #0xaa,#0xaa,#0xaa,#0xaa,#0xaa 77 + .db #0x55,#0x55,#0x55,#0x55,#0x55, #0xaa,#0xaa,#0xaa,#0xaa,#0xaa 78 + .db #0x55,#0x55,#0x55,#0x55,#0x55, #0xaa,#0xaa,#0xaa,#0xaa,#0xaa 79 + .db #0x55,#0x55,#0x55,#0x55,#0x55, #0xaa,#0xaa,#0xaa,#0xaa,#0xaa 80 + .db #0x55,#0x55,#0x55,#0x55,#0x55, #0xaa,#0xaa,#0xaa,#0xaa,#0xaa 81 + .db #0x55,#0x55,#0x55,#0x55,#0x55, #0xaa,#0xaa,#0xaa,#0xaa,#0xaa 82 + .db #0x55,#0x55,#0x55,#0x55,#0x55, #0xaa,#0xaa,#0xaa,#0xaa,#0xaa 83 + .db #0x55,#0x55,#0x55,#0x55,#0x55, #0xaa,#0xaa,#0xaa,#0xaa,#0xaa 84 + 85 + icon2: 86 + ; not used 87 + .dw #0x0000 ; width 88 + .db #0x00 ; height 89 + iconend: 90 + 91 + boot: 92 + ; preserve old slot4000 for later 93 + ld a, (#06) 94 + ld (startup_slot4000device), a 95 + ld a, (#05) 96 + ld (startup_slot4000page), a 97 + 98 + call gsinit ; initialize global variables 99 + call patch_isr ; install new ISR 100 + call _main ; main c code 101 + jp _exit 102 + 103 + ; ordering of segments for the linker 104 + .area _HOME 105 + 106 + .area _CODE 107 + 108 + .area _GSINIT 109 + 110 + gsinit:: 111 + 112 + .area _GSFINAL 113 + 114 + gsfinal:: 115 + ret 116 + 117 + ; variables 118 + .area _BSS 119 + 120 + startup_slot4000device: 121 + .ds 1 122 + startup_slot4000page: 123 + .ds 1 124 + 125 + _debug0:: 126 + .db #0 127 + _debug1:: 128 + .db #0 129 + _debug2:: 130 + .db #0 131 + _debug3:: 132 + .db #0 133 + _debug4:: 134 + .db #0 135 + 136 + .area _DATA 137 + 138 + .area _HEAP 139 + 140 + .area _CODE 141 + 142 + ; exit handler, jump back to loader 143 + _exit:: 144 + ld a, (startup_slot4000device) 145 + ld (#06), a 146 + ld a, (startup_slot4000page) 147 + ld (#05), a 148 + jp 0x4000 149 + 150 + _powerdown_mode:: 151 + call #0x0a6b ; firmware powerdownmode function 152 + 153 + _reboot:: 154 + jp 0x0000 155 + 156 + ; new_mail(unsigned char on) 157 + ; toggles 'new mail' light 158 + _new_mail:: 159 + di 160 + push ix 161 + ld ix, #0 162 + add ix, sp 163 + push hl 164 + push af 165 + ld a, 4(ix) 166 + cp #0 167 + jr z, light_off 168 + light_on: 169 + ld a, (p2shadow) 170 + set 4, a 171 + jr write_p2 172 + light_off: 173 + ld a, (p2shadow) 174 + res 4, a 175 + write_p2: 176 + ld (hl), a 177 + out (#0x02), a ; write p2shadow to port2 178 + pop af 179 + pop hl 180 + pop ix 181 + ei 182 + ret 183 + 184 + ; delay(unsigned int millis) 185 + ; call mailstation function that delays (stack) milliseconds 186 + _delay:: 187 + push ix 188 + ld ix, #0 189 + add ix, sp 190 + push af 191 + push bc 192 + push hl 193 + ld l, 4(ix) 194 + ld h, 5(ix) 195 + push hl 196 + call #0x0a5c 197 + pop hl 198 + pop hl 199 + pop bc 200 + pop af 201 + pop ix 202 + ret 203 + 204 + ; void lcd_sleep(void) 205 + ; turn the LCD off 206 + _lcd_sleep:: 207 + di 208 + ld a, (p2shadow) 209 + and #0b01111111 ; LCD_ON - turn port2 bit 7 off 210 + ld (p2shadow), a 211 + out (#0x02), a ; write p2shadow to port2 212 + ei 213 + ret 214 + 215 + 216 + ; void lcd_wake(void) 217 + ; turn the LCD on 218 + _lcd_wake:: 219 + di 220 + ld a, (p2shadow) 221 + or #0b10000000 ; LCD_ON - turn port2 bit 7 on 222 + ld (p2shadow), a 223 + out (#0x02), a ; write p2shadow to port2 224 + ei 225 + ret 226 + 227 + 228 + ; 8-bit multiplication 229 + ; de * a = hl 230 + mult8:: 231 + ld b, #8 232 + ld hl, #0 233 + mult8_loop: 234 + add hl, hl 235 + rlca 236 + jr nc, mult8_noadd 237 + add hl, de 238 + mult8_noadd: 239 + djnz mult8_loop 240 + mult8_out: 241 + ret 242 + 243 + ; 16-bit multiplication 244 + ; bc * de = hl 245 + mult16: 246 + ld a, b 247 + ld b, #16 248 + ld hl, #0 249 + mult16_loop: 250 + add hl, hl 251 + sla c 252 + rla 253 + jr nc, mult16_noadd 254 + add hl, de 255 + mult16_noadd: 256 + djnz mult16_loop 257 + ret 258 + 259 + 260 + ; 8-bit division 261 + ; divide e by c, store result in a and remainder in b 262 + div8: 263 + xor a 264 + ld b, #8 265 + div8_loop: 266 + rl e 267 + rla 268 + sub c 269 + jr nc, div8_noadd 270 + add a, c 271 + div8_noadd: 272 + djnz div8_loop 273 + ld b,a 274 + ld a,e 275 + rla 276 + cpl 277 + ret 278 + 279 + ; 16-bit division 280 + ; divide bc by de, store result in bc, remainder in hl 281 + div16: 282 + ld hl, #0 283 + ld a, b 284 + ld b, #8 285 + div16_loop1: 286 + rla 287 + adc hl, hl 288 + sbc hl, de 289 + jr nc, div16_noadd1 290 + add hl, de 291 + div16_noadd1: 292 + djnz div16_loop1 293 + rla 294 + cpl 295 + ld b, a 296 + ld a, c 297 + ld c, b 298 + ld b, #8 299 + div16_loop2: 300 + rla 301 + adc hl, hl 302 + sbc hl, de 303 + jr nc, div16_noadd2 304 + add hl, de 305 + div16_noadd2: 306 + djnz div16_loop2 307 + rla 308 + cpl 309 + ld b, c 310 + ld c, a 311 + ret
+335
csi.c
··· 1 + /* 2 + * ANSI CSI parser 3 + * msTERM 4 + * 5 + * Copyright (c) 2019 joshua stein <jcs@jcs.org> 6 + * 7 + * Permission to use, copy, modify, and distribute this software for any 8 + * purpose with or without fee is hereby granted, provided that the above 9 + * copyright notice and this permission notice appear in all copies. 10 + * 11 + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 12 + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 13 + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 14 + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 15 + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 16 + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 17 + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 18 + */ 19 + 20 + #include <stdio.h> 21 + #include <string.h> 22 + #include <stdlib.h> 23 + 24 + #include "mailstation.h" 25 + 26 + unsigned char csibuf[TEXT_COLS]; 27 + unsigned int csibuflen; 28 + 29 + unsigned char in_csi; 30 + 31 + void 32 + parseCSI(void) 33 + { 34 + int x, y, serviced; 35 + int param1 = -1, param2 = -1; 36 + char c = csibuf[csibuflen - 1]; 37 + char parambuf[4]; 38 + int parambuflen, off; 39 + #ifdef DEBUG 40 + char sb[TEXT_COLS]; 41 + #endif 42 + 43 + if (c < 'A' || (c > 'Z' && c < 'a') || c > 'z') 44 + return; 45 + 46 + switch (c) { 47 + case 'A': 48 + case 'B': 49 + case 'C': 50 + case 'D': 51 + case 'E': 52 + case 'F': 53 + case 'G': 54 + case 'J': 55 + case 'K': 56 + case 'S': 57 + case 'T': 58 + case 'd': 59 + case 'g': 60 + /* optional multiplier */ 61 + if (c == 'J' || c == 'K') 62 + param1 = 0; 63 + else 64 + param1 = 1; 65 + 66 + if (csibuflen > 1) { 67 + for (x = 0; x < csibuflen - 1, x < 4; x++) { 68 + parambuf[x] = csibuf[x]; 69 + parambuf[x + 1] = '\0'; 70 + } 71 + param1 = atoi(parambuf); 72 + } 73 + break; 74 + case 'H': 75 + case 'f': 76 + /* two optional parameters separated by ; each defaulting to 1 */ 77 + param1 = 1; 78 + param2 = 1; 79 + 80 + y = -1; 81 + for (x = 0; x < csibuflen; x++) { 82 + if (csibuf[x] == ';') { 83 + y = x; 84 + break; 85 + } 86 + } 87 + if (y == -1) 88 + /* CSI 17H -> CSI 17; */ 89 + y = csibuflen - 1; 90 + 91 + if (y > 0) { 92 + for (x = 0; x < y && x < 4; x++) { 93 + parambuf[x] = csibuf[x]; 94 + parambuf[x + 1] = '\0'; 95 + } 96 + param1 = atoi(parambuf); 97 + 98 + if (y < csibuflen - 2) { 99 + parambuf[0] = '\0'; 100 + for (x = 0; x < (csibuflen - 1 - y) && x < 4; x++) { 101 + parambuf[x] = csibuf[y + 1 + x]; 102 + parambuf[x + 1] = '\0'; 103 + } 104 + param2 = atoi(parambuf); 105 + } 106 + } 107 + break; 108 + } 109 + 110 + serviced = 1; 111 + 112 + uncursor(); 113 + 114 + switch (c) { 115 + case 'A': /* CUU - cursor up */ 116 + for (x = 0; x < param1; x++) 117 + if (cursory > 0) 118 + cursory--; 119 + break; 120 + case 'B': /* CUD - cursor down */ 121 + for (x = 0; x < param1; x++) 122 + if (cursory < TEXT_ROWS - 1) 123 + cursory++; 124 + break; 125 + case 'C': /* CUF - cursor forward */ 126 + for (x = 0; x < param1; x++) 127 + if (cursorx < TEXT_COLS) 128 + cursorx++; 129 + break; 130 + case 'D': /* CUB - cursor back */ 131 + for (x = 0; x < param1; x++) 132 + if (cursorx > 0) 133 + cursorx--; 134 + break; 135 + case 'E': /* CNL - cursor next line */ 136 + cursorx = 0; 137 + for (x = 0; x < param1; x++) 138 + if (cursory < TEXT_ROWS - 1) 139 + cursory++; 140 + break; 141 + case 'F': /* CPL - cursor previous line */ 142 + cursorx = 0; 143 + for (x = 0; x < param1; x++) 144 + if (cursory > 0) 145 + cursory--; 146 + break; 147 + case 'G': /* CHA - cursor horizontal absolute */ 148 + if (param1 > TEXT_COLS) 149 + param1 = TEXT_COLS; 150 + cursorx = param1; 151 + break; 152 + case 'H': /* CUP - cursor absolute position */ 153 + case 'f': /* HVP - horizontal vertical position */ 154 + if (param1 - 1 < 0) 155 + cursory = 0; 156 + else if (param1 > TEXT_ROWS) 157 + cursory = TEXT_ROWS - 1; 158 + else 159 + cursory = param1 - 1; 160 + 161 + if (param2 - 1 < 0) 162 + cursorx = 0; 163 + else if (param2 > TEXT_COLS) 164 + cursorx = TEXT_COLS - 1; 165 + else 166 + cursorx = param2 - 1; 167 + 168 + break; 169 + case 'J': /* ED - erase in display */ 170 + if (param1 == 0) { 171 + /* clear from cursor to end of screen */ 172 + for (y = cursory; y < TEXT_ROWS; y++) { 173 + for (x = 0; x < TEXT_COLS; x++) { 174 + if (y == cursory && x < cursorx) 175 + continue; 176 + 177 + putchar_attr(x, y, ' ', 0); 178 + } 179 + } 180 + } else if (param1 == 1) { 181 + /* clear from cursor to beginning of the screen */ 182 + for (y = cursory; y >= 0; y--) { 183 + for (x = TEXT_COLS; x >= 0; x--) { 184 + if (y == cursory && x > cursorx) 185 + continue; 186 + 187 + putchar_attr(x, y, ' ', 0); 188 + } 189 + } 190 + } else if (param1 == 2) { 191 + /* clear entire screen */ 192 + for (y = 0; y < TEXT_ROWS; y++) { 193 + for (x = 0; x < TEXT_COLS; x++) 194 + putchar_attr(x, y, ' ', 0); 195 + } 196 + } 197 + 198 + break; 199 + case 'K': /* EL - erase in line */ 200 + if (param1 == 0) { 201 + /* clear from cursor to end of line */ 202 + for (x = cursorx; x < TEXT_COLS; x++) 203 + putchar_attr(x, cursory, ' ', 0); 204 + } else if (param1 == 1) { 205 + /* clear from cursor to beginning of line */ 206 + for (x = cursorx; x >= 0; x--) 207 + putchar_attr(x, cursory, ' ', 0); 208 + } else if (param1 == 2) { 209 + /* clear entire line */ 210 + for (x = 0; x < TEXT_COLS - 1; x++) 211 + putchar_attr(x, cursory, ' ', 0); 212 + } 213 + break; 214 + case 'S': /* SU - scroll up */ 215 + /* TODO */ 216 + break; 217 + case 'T': /* SD - scroll down */ 218 + /* TODO */ 219 + break; 220 + case 'd': /* absolute line number */ 221 + if (param1 < 1) 222 + cursory = 0; 223 + else if (param1 > TEXT_ROWS) 224 + cursory = TEXT_ROWS; 225 + else 226 + cursory = param1 - 1; 227 + break; 228 + case 'g': /* clear tabs, ignore */ 229 + break; 230 + case 'h': /* reset, ignore */ 231 + break; 232 + case 'm': /* graphic changes */ 233 + parambuf[0] = '\0'; 234 + parambuflen = 0; 235 + 236 + off = (cursory * LCD_COLS) + cursorx; 237 + param2 = screenattrs[off]; 238 + 239 + for (x = 0; x < csibuflen; x++) { 240 + /* all the way to csibuflen to catch 'm' */ 241 + if (csibuf[x] == ';' || csibuf[x] == 'm') { 242 + param1 = atoi(parambuf); 243 + 244 + switch (param1) { 245 + case 0: /* reset */ 246 + case 22: /* normal color */ 247 + param2 = 0; 248 + break; 249 + case 1: /* bold */ 250 + param2 |= ATTR_BOLD; 251 + break; 252 + case 4: /* underline */ 253 + param2 |= ATTR_UNDERLINE; 254 + break; 255 + case 7: /* reverse */ 256 + param2 |= ATTR_REVERSE; 257 + break; 258 + case 21: /* bold off */ 259 + param2 &= ~(ATTR_BOLD); 260 + break; 261 + case 24: /* underline off */ 262 + param2 &= ~(ATTR_UNDERLINE); 263 + break; 264 + case 27: /* inverse off */ 265 + param2 &= ~(ATTR_REVERSE); 266 + break; 267 + } 268 + 269 + parambuf[0] = '\0'; 270 + parambuflen = 0; 271 + } else if (parambuflen < 4) { 272 + parambuf[parambuflen] = csibuf[x]; 273 + parambuflen++; 274 + parambuf[parambuflen] = '\0'; 275 + } 276 + } 277 + 278 + putchar_sgr = param2; 279 + putchar_attr(cursorx, cursory, screenbuf[off], param2); 280 + 281 + break; 282 + case 'n': /* DSR - device status report */ 283 + if (param1 == 5) { 284 + /* ok */ 285 + obuf[obuf_pos++] = 27; 286 + obuf[obuf_pos++] = '['; 287 + obuf[obuf_pos++] = '0'; 288 + obuf[obuf_pos++] = 'n'; 289 + } else if (param1 == 6) { 290 + /* CPR - report cursor position */ 291 + obuf[obuf_pos++] = 27; 292 + obuf[obuf_pos++] = '['; 293 + 294 + itoa(cursory + 1, parambuf, 10); 295 + for (x = 0; x < sizeof(parambuf); x++) { 296 + if (parambuf[x] == '\0') 297 + break; 298 + obuf[obuf_pos++] = parambuf[x]; 299 + } 300 + obuf[obuf_pos++] = ';'; 301 + 302 + itoa(cursorx + 1, parambuf, 10); 303 + for (x = 0; x < sizeof(parambuf); x++) { 304 + if (parambuf[x] == '\0') 305 + break; 306 + obuf[obuf_pos++] = parambuf[x]; 307 + } 308 + 309 + obuf[obuf_pos++] = 'R'; 310 + } 311 + break; 312 + default: 313 + /* 314 + * if the last character is a letter and we haven't serviced 315 + * it, assume it's a sequence we don't support and should just 316 + * suppress 317 + */ 318 + if (c < 65 || (c > 90 && c < 97) || c > 122) 319 + serviced = 0; 320 + } 321 + 322 + if (serviced) { 323 + #ifdef DEBUG 324 + sprintf(sb, "CSI (%d,%d): ", param1, param2); 325 + for (x = 0; x < csibuflen; x++) 326 + sprintf(sb, "%s%c", sb, csibuf[x]); 327 + update_statusbar(sb); 328 + #endif 329 + csibuflen = 0; 330 + csibuf[0] = '\0'; 331 + in_csi = 0; 332 + 333 + redraw_screen(); 334 + } 335 + }
+65
cursorx_lookup.inc
··· 1 + ; AUTOMATICALLY GENERATED FILE - see tools/generate_cursorx_lookup.rb 2 + .db #0x98 ; 10011000 - col group 19, offset 0 3 + .db #0x9d ; 10011101 - col group 19, offset 5 4 + .db #0x92 ; 10010010 - col group 18, offset 2 5 + .db #0x97 ; 10010111 - col group 18, offset 7 6 + .db #0x8c ; 10001100 - col group 17, offset 4 7 + .db #0x81 ; 10000001 - col group 16, offset 1 8 + .db #0x86 ; 10000110 - col group 16, offset 6 9 + .db #0x7b ; 01111011 - col group 15, offset 3 10 + .db #0x70 ; 01110000 - col group 14, offset 0 11 + .db #0x75 ; 01110101 - col group 14, offset 5 12 + .db #0x6a ; 01101010 - col group 13, offset 2 13 + .db #0x6f ; 01101111 - col group 13, offset 7 14 + .db #0x64 ; 01100100 - col group 12, offset 4 15 + .db #0x59 ; 01011001 - col group 11, offset 1 16 + .db #0x5e ; 01011110 - col group 11, offset 6 17 + .db #0x53 ; 01010011 - col group 10, offset 3 18 + .db #0x48 ; 01001000 - col group 9, offset 0 19 + .db #0x4d ; 01001101 - col group 9, offset 5 20 + .db #0x42 ; 01000010 - col group 8, offset 2 21 + .db #0x47 ; 01000111 - col group 8, offset 7 22 + .db #0x3c ; 00111100 - col group 7, offset 4 23 + .db #0x31 ; 00110001 - col group 6, offset 1 24 + .db #0x36 ; 00110110 - col group 6, offset 6 25 + .db #0x2b ; 00101011 - col group 5, offset 3 26 + .db #0x20 ; 00100000 - col group 4, offset 0 27 + .db #0x25 ; 00100101 - col group 4, offset 5 28 + .db #0x1a ; 00011010 - col group 3, offset 2 29 + .db #0x1f ; 00011111 - col group 3, offset 7 30 + .db #0x14 ; 00010100 - col group 2, offset 4 31 + .db #0x09 ; 00001001 - col group 1, offset 1 32 + .db #0x0e ; 00001110 - col group 1, offset 6 33 + .db #0x03 ; 00000011 - col group 0, offset 3 34 + .db #0x98 ; 10011000 - col group 19, offset 0 35 + .db #0x9d ; 10011101 - col group 19, offset 5 36 + .db #0x92 ; 10010010 - col group 18, offset 2 37 + .db #0x97 ; 10010111 - col group 18, offset 7 38 + .db #0x8c ; 10001100 - col group 17, offset 4 39 + .db #0x81 ; 10000001 - col group 16, offset 1 40 + .db #0x86 ; 10000110 - col group 16, offset 6 41 + .db #0x7b ; 01111011 - col group 15, offset 3 42 + .db #0x70 ; 01110000 - col group 14, offset 0 43 + .db #0x75 ; 01110101 - col group 14, offset 5 44 + .db #0x6a ; 01101010 - col group 13, offset 2 45 + .db #0x6f ; 01101111 - col group 13, offset 7 46 + .db #0x64 ; 01100100 - col group 12, offset 4 47 + .db #0x59 ; 01011001 - col group 11, offset 1 48 + .db #0x5e ; 01011110 - col group 11, offset 6 49 + .db #0x53 ; 01010011 - col group 10, offset 3 50 + .db #0x48 ; 01001000 - col group 9, offset 0 51 + .db #0x4d ; 01001101 - col group 9, offset 5 52 + .db #0x42 ; 01000010 - col group 8, offset 2 53 + .db #0x47 ; 01000111 - col group 8, offset 7 54 + .db #0x3c ; 00111100 - col group 7, offset 4 55 + .db #0x31 ; 00110001 - col group 6, offset 1 56 + .db #0x36 ; 00110110 - col group 6, offset 6 57 + .db #0x2b ; 00101011 - col group 5, offset 3 58 + .db #0x20 ; 00100000 - col group 4, offset 0 59 + .db #0x25 ; 00100101 - col group 4, offset 5 60 + .db #0x1a ; 00011010 - col group 3, offset 2 61 + .db #0x1f ; 00011111 - col group 3, offset 7 62 + .db #0x14 ; 00010100 - col group 2, offset 4 63 + .db #0x09 ; 00001001 - col group 1, offset 1 64 + .db #0x0e ; 00001110 - col group 1, offset 6 65 + .db #0x03 ; 00000011 - col group 0, offset 3
+75
font/hexfont2inc.rb
··· 1 + # 2 + # hexfont2inc 3 + # convert a hex-exported bitmap font (like from gbdfed) to an asm include file 4 + # msTERM 5 + # 6 + # Copyright (c) 2019 joshua stein <jcs@jcs.org> 7 + # 8 + # Permission to use, copy, modify, and distribute this software for any 9 + # purpose with or without fee is hereby granted, provided that the above 10 + # copyright notice and this permission notice appear in all copies. 11 + # 12 + # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 13 + # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 14 + # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 15 + # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 16 + # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 17 + # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 18 + # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 19 + # 20 + 21 + chars = [] 22 + char_size = 0 23 + all_bytes = [] 24 + 25 + if !ARGV[0] 26 + puts "usage: #{$0} <hex file converted from bdf>" 27 + exit 1 28 + end 29 + 30 + File.open(ARGV[0], "r") do |f| 31 + char = 0 32 + 33 + while f && !f.eof? 34 + line = f.gets 35 + 36 + # 0023:A0E0A0E0A000 37 + if !(m = line.match(/^(....):(.+)$/)) 38 + raise "unexpected format: #{line.inspect}" 39 + end 40 + 41 + char = m[1].to_i(16) 42 + char_size = (m[2].length / 2) 43 + 44 + # A0E0A0E0A000 45 + # -> [ "A0", "e0", "A0", "e0", "A0", "00", "00" ] 46 + bytes = m[2].scan(/(..)/).flatten 47 + 48 + # -> [ 0xa0, 0xe0, 0xa0, 0xe0, 0xa0, 0x00, 0x00 ] 49 + bytes = bytes.map{|c| c.to_i(16) } 50 + 51 + # -> [ 101000000, 11100000, ... ] 52 + # -> [ [ 1, 0, 1, 0, 0, 0, 0, 0 ], [ 1, 1, 1, 0, 0, 0, 0, 0 ], ... ] 53 + bytes = bytes.map{|c| sprintf("%08b", c).split(//).map{|z| z.to_i } } 54 + 55 + # -> [ [ 0, 0, 0, 0, 0, 1, 0, 1 ], [ 0, 0, 0, 0, 0, 1, 1, 1 ], ... ] 56 + bytes = bytes.map{|a| a.reverse } 57 + 58 + # -> [ 0x5, 0x7, ... ] 59 + bytes = bytes.map{|a| a.join.to_i(2) } 60 + 61 + chars[char] = bytes 62 + end 63 + end 64 + 65 + (0 .. 255).each do |c| 66 + if chars[c] && chars[c].any? 67 + print ".db " << chars[c].map{|c| sprintf("#0x%02x", c) }.join(", ") 68 + if c >= 32 && c <= 126 69 + print "\t; #{sprintf("%.3d", c)} - #{c.chr}" 70 + end 71 + print "\n" 72 + else 73 + puts ".db " << char_size.times.map{|c| "#0x00" }.join(", ") 74 + end 75 + end
+3397
font/spleen-5x8.bdf
··· 1 + STARTFONT 2.1 2 + COMMENT /* 3 + COMMENT * Spleen 5x8 1.0.3 4 + COMMENT * Copyright (c) 2018, Frederic Cambus 5 + COMMENT * https://www.cambus.net/ 6 + COMMENT * 7 + COMMENT * Created: 2018-08-08 8 + COMMENT * Last Updated: 2018-12-03 9 + COMMENT * 10 + COMMENT * Spleen is released under the BSD 2-Clause license. 11 + COMMENT * See LICENSE file for details. 12 + COMMENT */ 13 + FONT -misc-spleen-medium-r-normal--8-80-72-72-C-50-iso10646-1 14 + SIZE 8 72 72 15 + FONTBOUNDINGBOX 6 8 0 -1 16 + STARTPROPERTIES 18 17 + FAMILY_NAME "Spleen" 18 + FOUNDRY "misc" 19 + SLANT "R" 20 + SETWIDTH_NAME "Normal" 21 + PIXEL_SIZE 8 22 + POINT_SIZE 80 23 + RESOLUTION_X 72 24 + RESOLUTION_Y 72 25 + SPACING "C" 26 + AVERAGE_WIDTH 50 27 + CHARSET_REGISTRY "ISO10646" 28 + CHARSET_ENCODING "1" 29 + MIN_SPACE 5 30 + FONT_DESCENT 1 31 + FONT_ASCENT 7 32 + COPYRIGHT "Copyright (c) 2018, Frederic Cambus" 33 + DEFAULT_CHAR 32 34 + _GBDFED_INFO "Edited with gbdfed 1.6." 35 + ENDPROPERTIES 36 + CHARS 224 37 + STARTCHAR char0 38 + ENCODING 0 39 + SWIDTH 750 0 40 + DWIDTH 6 0 41 + BBX 6 8 0 -1 42 + BITMAP 43 + F8 44 + D8 45 + A8 46 + E8 47 + D8 48 + F8 49 + D8 50 + F8 51 + ENDCHAR 52 + STARTCHAR char1 53 + ENCODING 1 54 + SWIDTH 750 0 55 + DWIDTH 6 0 56 + BBX 6 8 0 -1 57 + BITMAP 58 + 70 59 + 88 60 + D8 61 + 88 62 + F8 63 + 88 64 + 70 65 + 00 66 + ENDCHAR 67 + STARTCHAR char2 68 + ENCODING 2 69 + SWIDTH 750 0 70 + DWIDTH 6 0 71 + BBX 6 8 0 -1 72 + BITMAP 73 + 70 74 + F8 75 + A8 76 + F8 77 + 88 78 + F8 79 + 70 80 + 00 81 + ENDCHAR 82 + STARTCHAR char3 83 + ENCODING 3 84 + SWIDTH 750 0 85 + DWIDTH 6 0 86 + BBX 6 8 0 -1 87 + BITMAP 88 + 00 89 + 50 90 + F8 91 + F8 92 + 70 93 + 20 94 + 00 95 + 00 96 + ENDCHAR 97 + STARTCHAR char4 98 + ENCODING 4 99 + SWIDTH 750 0 100 + DWIDTH 6 0 101 + BBX 6 8 0 -1 102 + BITMAP 103 + 00 104 + 20 105 + 70 106 + F8 107 + 70 108 + 20 109 + 00 110 + 00 111 + ENDCHAR 112 + STARTCHAR char5 113 + ENCODING 5 114 + SWIDTH 750 0 115 + DWIDTH 6 0 116 + BBX 6 8 0 -1 117 + BITMAP 118 + 00 119 + 20 120 + 70 121 + D8 122 + D8 123 + 20 124 + 70 125 + 00 126 + ENDCHAR 127 + STARTCHAR char6 128 + ENCODING 6 129 + SWIDTH 750 0 130 + DWIDTH 6 0 131 + BBX 6 8 0 -1 132 + BITMAP 133 + 00 134 + 20 135 + 70 136 + F8 137 + F8 138 + 20 139 + 70 140 + 00 141 + ENDCHAR 142 + STARTCHAR char7 143 + ENCODING 7 144 + SWIDTH 750 0 145 + DWIDTH 6 0 146 + BBX 6 8 0 -1 147 + BITMAP 148 + 00 149 + 00 150 + 20 151 + 70 152 + 70 153 + 20 154 + 00 155 + 00 156 + ENDCHAR 157 + STARTCHAR char8 158 + ENCODING 8 159 + SWIDTH 750 0 160 + DWIDTH 6 0 161 + BBX 6 8 0 -1 162 + BITMAP 163 + 70 164 + 70 165 + 50 166 + 00 167 + 50 168 + 70 169 + 70 170 + 70 171 + ENDCHAR 172 + STARTCHAR char9 173 + ENCODING 9 174 + SWIDTH 750 0 175 + DWIDTH 6 0 176 + BBX 6 8 0 -1 177 + BITMAP 178 + 00 179 + 00 180 + 20 181 + 50 182 + 50 183 + 20 184 + 00 185 + 00 186 + ENDCHAR 187 + STARTCHAR char10 188 + ENCODING 10 189 + SWIDTH 750 0 190 + DWIDTH 6 0 191 + BBX 6 8 0 -1 192 + BITMAP 193 + 70 194 + 70 195 + 50 196 + 20 197 + 20 198 + 50 199 + 70 200 + 70 201 + ENDCHAR 202 + STARTCHAR char11 203 + ENCODING 11 204 + SWIDTH 750 0 205 + DWIDTH 6 0 206 + BBX 6 8 0 -1 207 + BITMAP 208 + 00 209 + 30 210 + 70 211 + 90 212 + 90 213 + 60 214 + 00 215 + 00 216 + ENDCHAR 217 + STARTCHAR char12 218 + ENCODING 12 219 + SWIDTH 750 0 220 + DWIDTH 6 0 221 + BBX 6 8 0 -1 222 + BITMAP 223 + 00 224 + 20 225 + 50 226 + 50 227 + 20 228 + 70 229 + 20 230 + 00 231 + ENDCHAR 232 + STARTCHAR char13 233 + ENCODING 13 234 + SWIDTH 750 0 235 + DWIDTH 6 0 236 + BBX 6 8 0 -1 237 + BITMAP 238 + 00 239 + 38 240 + 38 241 + 20 242 + E0 243 + C0 244 + 00 245 + 00 246 + ENDCHAR 247 + STARTCHAR char14 248 + ENCODING 14 249 + SWIDTH 750 0 250 + DWIDTH 6 0 251 + BBX 6 8 0 -1 252 + BITMAP 253 + 00 254 + 38 255 + 38 256 + 28 257 + 28 258 + 50 259 + 00 260 + 00 261 + ENDCHAR 262 + STARTCHAR char15 263 + ENCODING 15 264 + SWIDTH 750 0 265 + DWIDTH 6 0 266 + BBX 6 8 0 -1 267 + BITMAP 268 + 00 269 + A8 270 + 70 271 + D8 272 + 70 273 + A8 274 + 00 275 + 00 276 + ENDCHAR 277 + STARTCHAR char16 278 + ENCODING 16 279 + SWIDTH 750 0 280 + DWIDTH 6 0 281 + BBX 6 8 0 -1 282 + BITMAP 283 + 00 284 + 40 285 + 60 286 + 70 287 + 70 288 + 60 289 + 40 290 + 00 291 + ENDCHAR 292 + STARTCHAR char17 293 + ENCODING 17 294 + SWIDTH 750 0 295 + DWIDTH 6 0 296 + BBX 6 8 0 -1 297 + BITMAP 298 + 00 299 + 10 300 + 30 301 + 70 302 + 70 303 + 30 304 + 10 305 + 00 306 + ENDCHAR 307 + STARTCHAR char18 308 + ENCODING 18 309 + SWIDTH 750 0 310 + DWIDTH 6 0 311 + BBX 6 8 0 -1 312 + BITMAP 313 + 00 314 + 20 315 + 70 316 + 20 317 + 70 318 + 20 319 + 00 320 + 00 321 + ENDCHAR 322 + STARTCHAR char19 323 + ENCODING 19 324 + SWIDTH 750 0 325 + DWIDTH 6 0 326 + BBX 6 8 0 -1 327 + BITMAP 328 + 00 329 + 50 330 + 50 331 + 50 332 + 50 333 + 00 334 + 50 335 + 00 336 + ENDCHAR 337 + STARTCHAR char20 338 + ENCODING 20 339 + SWIDTH 750 0 340 + DWIDTH 6 0 341 + BBX 6 8 0 -1 342 + BITMAP 343 + 00 344 + 70 345 + D0 346 + D0 347 + 50 348 + 50 349 + 00 350 + 00 351 + ENDCHAR 352 + STARTCHAR char21 353 + ENCODING 21 354 + SWIDTH 750 0 355 + DWIDTH 6 0 356 + BBX 6 8 0 -1 357 + BITMAP 358 + 60 359 + 90 360 + 60 361 + F0 362 + 70 363 + 90 364 + 60 365 + 00 366 + ENDCHAR 367 + STARTCHAR char22 368 + ENCODING 22 369 + SWIDTH 750 0 370 + DWIDTH 6 0 371 + BBX 6 8 0 -1 372 + BITMAP 373 + 00 374 + 00 375 + 00 376 + 00 377 + 00 378 + F8 379 + F8 380 + 00 381 + ENDCHAR 382 + STARTCHAR char23 383 + ENCODING 23 384 + SWIDTH 750 0 385 + DWIDTH 6 0 386 + BBX 6 8 0 -1 387 + BITMAP 388 + 20 389 + 70 390 + 20 391 + 20 392 + 70 393 + 20 394 + 70 395 + 00 396 + ENDCHAR 397 + STARTCHAR char24 398 + ENCODING 24 399 + SWIDTH 750 0 400 + DWIDTH 6 0 401 + BBX 6 8 0 -1 402 + BITMAP 403 + 20 404 + 70 405 + 20 406 + 20 407 + 20 408 + 20 409 + 00 410 + 00 411 + ENDCHAR 412 + STARTCHAR char25 413 + ENCODING 25 414 + SWIDTH 750 0 415 + DWIDTH 6 0 416 + BBX 6 8 0 -1 417 + BITMAP 418 + 20 419 + 20 420 + 20 421 + 20 422 + 70 423 + 20 424 + 00 425 + 00 426 + ENDCHAR 427 + STARTCHAR char26 428 + ENCODING 26 429 + SWIDTH 750 0 430 + DWIDTH 6 0 431 + BBX 6 8 0 -1 432 + BITMAP 433 + 00 434 + 00 435 + 20 436 + F0 437 + 20 438 + 00 439 + 00 440 + 00 441 + ENDCHAR 442 + STARTCHAR char27 443 + ENCODING 27 444 + SWIDTH 750 0 445 + DWIDTH 6 0 446 + BBX 6 8 0 -1 447 + BITMAP 448 + 00 449 + 00 450 + 40 451 + F0 452 + 40 453 + 00 454 + 00 455 + 00 456 + ENDCHAR 457 + STARTCHAR char28 458 + ENCODING 28 459 + SWIDTH 750 0 460 + DWIDTH 6 0 461 + BBX 6 8 0 -1 462 + BITMAP 463 + 00 464 + 00 465 + 80 466 + 80 467 + F8 468 + 00 469 + 00 470 + 00 471 + ENDCHAR 472 + STARTCHAR char29 473 + ENCODING 29 474 + SWIDTH 750 0 475 + DWIDTH 6 0 476 + BBX 6 8 0 -1 477 + BITMAP 478 + 00 479 + 00 480 + 50 481 + F8 482 + 50 483 + 00 484 + 00 485 + 00 486 + ENDCHAR 487 + STARTCHAR char30 488 + ENCODING 30 489 + SWIDTH 750 0 490 + DWIDTH 6 0 491 + BBX 6 8 0 -1 492 + BITMAP 493 + 00 494 + 00 495 + 20 496 + 70 497 + F8 498 + 00 499 + 00 500 + 00 501 + ENDCHAR 502 + STARTCHAR char31 503 + ENCODING 31 504 + SWIDTH 750 0 505 + DWIDTH 6 0 506 + BBX 6 8 0 -1 507 + BITMAP 508 + 00 509 + 00 510 + F8 511 + 70 512 + 20 513 + 00 514 + 00 515 + 00 516 + ENDCHAR 517 + STARTCHAR SPACE 518 + ENCODING 32 519 + SWIDTH 750 0 520 + DWIDTH 6 0 521 + BBX 6 8 0 -1 522 + BITMAP 523 + 00 524 + 00 525 + 00 526 + 00 527 + 00 528 + 00 529 + 00 530 + 00 531 + ENDCHAR 532 + STARTCHAR EXCLAMATION MARK 533 + ENCODING 33 534 + SWIDTH 750 0 535 + DWIDTH 6 0 536 + BBX 6 8 0 -1 537 + BITMAP 538 + 20 539 + 20 540 + 20 541 + 20 542 + 20 543 + 00 544 + 20 545 + 00 546 + ENDCHAR 547 + STARTCHAR QUOTATION MARK 548 + ENCODING 34 549 + SWIDTH 750 0 550 + DWIDTH 6 0 551 + BBX 6 8 0 -1 552 + BITMAP 553 + 50 554 + 50 555 + 50 556 + 00 557 + 00 558 + 00 559 + 00 560 + 00 561 + ENDCHAR 562 + STARTCHAR NUMBER SIGN 563 + ENCODING 35 564 + SWIDTH 750 0 565 + DWIDTH 6 0 566 + BBX 6 8 0 -1 567 + BITMAP 568 + 00 569 + 50 570 + F8 571 + 50 572 + 50 573 + F8 574 + 50 575 + 00 576 + ENDCHAR 577 + STARTCHAR DOLLAR SIGN 578 + ENCODING 36 579 + SWIDTH 750 0 580 + DWIDTH 6 0 581 + BBX 6 8 0 -1 582 + BITMAP 583 + 20 584 + 70 585 + A0 586 + 60 587 + 30 588 + 30 589 + E0 590 + 20 591 + ENDCHAR 592 + STARTCHAR PERCENT SIGN 593 + ENCODING 37 594 + SWIDTH 750 0 595 + DWIDTH 6 0 596 + BBX 6 8 0 -1 597 + BITMAP 598 + 10 599 + 90 600 + A0 601 + 20 602 + 40 603 + 50 604 + 90 605 + 80 606 + ENDCHAR 607 + STARTCHAR AMPERSAND 608 + ENCODING 38 609 + SWIDTH 750 0 610 + DWIDTH 6 0 611 + BBX 6 8 0 -1 612 + BITMAP 613 + 20 614 + 50 615 + 50 616 + 60 617 + A0 618 + 90 619 + 68 620 + 00 621 + ENDCHAR 622 + STARTCHAR APOSTROPHE 623 + ENCODING 39 624 + SWIDTH 750 0 625 + DWIDTH 6 0 626 + BBX 6 8 0 -1 627 + BITMAP 628 + 20 629 + 20 630 + 20 631 + 00 632 + 00 633 + 00 634 + 00 635 + 00 636 + ENDCHAR 637 + STARTCHAR LEFT PARENTHESIS 638 + ENCODING 40 639 + SWIDTH 750 0 640 + DWIDTH 6 0 641 + BBX 6 8 0 -1 642 + BITMAP 643 + 10 644 + 20 645 + 40 646 + 40 647 + 40 648 + 40 649 + 20 650 + 10 651 + ENDCHAR 652 + STARTCHAR RIGHT PARENTHESIS 653 + ENCODING 41 654 + SWIDTH 750 0 655 + DWIDTH 6 0 656 + BBX 6 8 0 -1 657 + BITMAP 658 + 40 659 + 20 660 + 10 661 + 10 662 + 10 663 + 10 664 + 20 665 + 40 666 + ENDCHAR 667 + STARTCHAR ASTERISK 668 + ENCODING 42 669 + SWIDTH 750 0 670 + DWIDTH 6 0 671 + BBX 6 8 0 -1 672 + BITMAP 673 + 00 674 + 00 675 + 90 676 + 60 677 + F0 678 + 60 679 + 90 680 + 00 681 + ENDCHAR 682 + STARTCHAR PLUS SIGN 683 + ENCODING 43 684 + SWIDTH 750 0 685 + DWIDTH 6 0 686 + BBX 6 8 0 -1 687 + BITMAP 688 + 00 689 + 00 690 + 20 691 + 20 692 + F8 693 + 20 694 + 20 695 + 00 696 + ENDCHAR 697 + STARTCHAR COMMA 698 + ENCODING 44 699 + SWIDTH 750 0 700 + DWIDTH 6 0 701 + BBX 6 8 0 -1 702 + BITMAP 703 + 00 704 + 00 705 + 00 706 + 00 707 + 00 708 + 20 709 + 20 710 + 40 711 + ENDCHAR 712 + STARTCHAR HYPHEN-MINUS 713 + ENCODING 45 714 + SWIDTH 750 0 715 + DWIDTH 6 0 716 + BBX 6 8 0 -1 717 + BITMAP 718 + 00 719 + 00 720 + 00 721 + 00 722 + F0 723 + 00 724 + 00 725 + 00 726 + ENDCHAR 727 + STARTCHAR FULL STOP 728 + ENCODING 46 729 + SWIDTH 750 0 730 + DWIDTH 6 0 731 + BBX 6 8 0 -1 732 + BITMAP 733 + 00 734 + 00 735 + 00 736 + 00 737 + 00 738 + 00 739 + 20 740 + 00 741 + ENDCHAR 742 + STARTCHAR SOLIDUS 743 + ENCODING 47 744 + SWIDTH 750 0 745 + DWIDTH 6 0 746 + BBX 6 8 0 -1 747 + BITMAP 748 + 10 749 + 10 750 + 20 751 + 20 752 + 40 753 + 40 754 + 80 755 + 80 756 + ENDCHAR 757 + STARTCHAR DIGIT ZERO 758 + ENCODING 48 759 + SWIDTH 750 0 760 + DWIDTH 6 0 761 + BBX 6 8 0 -1 762 + BITMAP 763 + 00 764 + 60 765 + 90 766 + B0 767 + D0 768 + 90 769 + 60 770 + 00 771 + ENDCHAR 772 + STARTCHAR DIGIT ONE 773 + ENCODING 49 774 + SWIDTH 750 0 775 + DWIDTH 6 0 776 + BBX 6 8 0 -1 777 + BITMAP 778 + 00 779 + 20 780 + 60 781 + 20 782 + 20 783 + 20 784 + 70 785 + 00 786 + ENDCHAR 787 + STARTCHAR DIGIT TWO 788 + ENCODING 50 789 + SWIDTH 750 0 790 + DWIDTH 6 0 791 + BBX 6 8 0 -1 792 + BITMAP 793 + 00 794 + 60 795 + 90 796 + 10 797 + 60 798 + 80 799 + F0 800 + 00 801 + ENDCHAR 802 + STARTCHAR DIGIT THREE 803 + ENCODING 51 804 + SWIDTH 750 0 805 + DWIDTH 6 0 806 + BBX 6 8 0 -1 807 + BITMAP 808 + 00 809 + 60 810 + 90 811 + 20 812 + 10 813 + 90 814 + 60 815 + 00 816 + ENDCHAR 817 + STARTCHAR DIGIT FOUR 818 + ENCODING 52 819 + SWIDTH 750 0 820 + DWIDTH 6 0 821 + BBX 6 8 0 -1 822 + BITMAP 823 + 00 824 + 80 825 + A0 826 + A0 827 + F0 828 + 20 829 + 20 830 + 00 831 + ENDCHAR 832 + STARTCHAR DIGIT FIVE 833 + ENCODING 53 834 + SWIDTH 750 0 835 + DWIDTH 6 0 836 + BBX 6 8 0 -1 837 + BITMAP 838 + 00 839 + F0 840 + 80 841 + F0 842 + 10 843 + 10 844 + E0 845 + 00 846 + ENDCHAR 847 + STARTCHAR DIGIT SIX 848 + ENCODING 54 849 + SWIDTH 750 0 850 + DWIDTH 6 0 851 + BBX 6 8 0 -1 852 + BITMAP 853 + 00 854 + 60 855 + 80 856 + E0 857 + 90 858 + 90 859 + 60 860 + 00 861 + ENDCHAR 862 + STARTCHAR DIGIT SEVEN 863 + ENCODING 55 864 + SWIDTH 750 0 865 + DWIDTH 6 0 866 + BBX 6 8 0 -1 867 + BITMAP 868 + 00 869 + F0 870 + 90 871 + 20 872 + 20 873 + 40 874 + 40 875 + 00 876 + ENDCHAR 877 + STARTCHAR DIGIT EIGHT 878 + ENCODING 56 879 + SWIDTH 750 0 880 + DWIDTH 6 0 881 + BBX 6 8 0 -1 882 + BITMAP 883 + 00 884 + 60 885 + 90 886 + 60 887 + 90 888 + 90 889 + 60 890 + 00 891 + ENDCHAR 892 + STARTCHAR DIGIT NINE 893 + ENCODING 57 894 + SWIDTH 750 0 895 + DWIDTH 6 0 896 + BBX 6 8 0 -1 897 + BITMAP 898 + 00 899 + 60 900 + 90 901 + 90 902 + 70 903 + 10 904 + 60 905 + 00 906 + ENDCHAR 907 + STARTCHAR COLON 908 + ENCODING 58 909 + SWIDTH 750 0 910 + DWIDTH 6 0 911 + BBX 6 8 0 -1 912 + BITMAP 913 + 00 914 + 00 915 + 00 916 + 20 917 + 00 918 + 00 919 + 20 920 + 00 921 + ENDCHAR 922 + STARTCHAR SEMICOLON 923 + ENCODING 59 924 + SWIDTH 750 0 925 + DWIDTH 6 0 926 + BBX 6 8 0 -1 927 + BITMAP 928 + 00 929 + 00 930 + 00 931 + 20 932 + 00 933 + 20 934 + 20 935 + 40 936 + ENDCHAR 937 + STARTCHAR LESS-THAN SIGN 938 + ENCODING 60 939 + SWIDTH 750 0 940 + DWIDTH 6 0 941 + BBX 6 8 0 -1 942 + BITMAP 943 + 00 944 + 10 945 + 20 946 + 40 947 + 40 948 + 20 949 + 10 950 + 00 951 + ENDCHAR 952 + STARTCHAR EQUALS SIGN 953 + ENCODING 61 954 + SWIDTH 750 0 955 + DWIDTH 6 0 956 + BBX 6 8 0 -1 957 + BITMAP 958 + 00 959 + 00 960 + 00 961 + F0 962 + 00 963 + F0 964 + 00 965 + 00 966 + ENDCHAR 967 + STARTCHAR GREATER-THAN SIGN 968 + ENCODING 62 969 + SWIDTH 750 0 970 + DWIDTH 6 0 971 + BBX 6 8 0 -1 972 + BITMAP 973 + 00 974 + 40 975 + 20 976 + 10 977 + 10 978 + 20 979 + 40 980 + 00 981 + ENDCHAR 982 + STARTCHAR QUESTION MARK 983 + ENCODING 63 984 + SWIDTH 750 0 985 + DWIDTH 6 0 986 + BBX 6 8 0 -1 987 + BITMAP 988 + 60 989 + 90 990 + 10 991 + 20 992 + 40 993 + 00 994 + 40 995 + 00 996 + ENDCHAR 997 + STARTCHAR COMMERCIAL AT 998 + ENCODING 64 999 + SWIDTH 750 0 1000 + DWIDTH 6 0 1001 + BBX 6 8 0 -1 1002 + BITMAP 1003 + 00 1004 + 60 1005 + 90 1006 + B0 1007 + B0 1008 + 80 1009 + 70 1010 + 00 1011 + ENDCHAR 1012 + STARTCHAR LATIN CAPITAL LETTER A 1013 + ENCODING 65 1014 + SWIDTH 750 0 1015 + DWIDTH 6 0 1016 + BBX 6 8 0 -1 1017 + BITMAP 1018 + 00 1019 + 60 1020 + 90 1021 + 90 1022 + F0 1023 + 90 1024 + 90 1025 + 00 1026 + ENDCHAR 1027 + STARTCHAR LATIN CAPITAL LETTER B 1028 + ENCODING 66 1029 + SWIDTH 750 0 1030 + DWIDTH 6 0 1031 + BBX 6 8 0 -1 1032 + BITMAP 1033 + 00 1034 + E0 1035 + 90 1036 + E0 1037 + 90 1038 + 90 1039 + E0 1040 + 00 1041 + ENDCHAR 1042 + STARTCHAR LATIN CAPITAL LETTER C 1043 + ENCODING 67 1044 + SWIDTH 750 0 1045 + DWIDTH 6 0 1046 + BBX 6 8 0 -1 1047 + BITMAP 1048 + 00 1049 + 70 1050 + 80 1051 + 80 1052 + 80 1053 + 80 1054 + 70 1055 + 00 1056 + ENDCHAR 1057 + STARTCHAR LATIN CAPITAL LETTER D 1058 + ENCODING 68 1059 + SWIDTH 750 0 1060 + DWIDTH 6 0 1061 + BBX 6 8 0 -1 1062 + BITMAP 1063 + 00 1064 + E0 1065 + 90 1066 + 90 1067 + 90 1068 + 90 1069 + E0 1070 + 00 1071 + ENDCHAR 1072 + STARTCHAR LATIN CAPITAL LETTER E 1073 + ENCODING 69 1074 + SWIDTH 750 0 1075 + DWIDTH 6 0 1076 + BBX 6 8 0 -1 1077 + BITMAP 1078 + 00 1079 + 70 1080 + 80 1081 + E0 1082 + 80 1083 + 80 1084 + 70 1085 + 00 1086 + ENDCHAR 1087 + STARTCHAR LATIN CAPITAL LETTER F 1088 + ENCODING 70 1089 + SWIDTH 750 0 1090 + DWIDTH 6 0 1091 + BBX 6 8 0 -1 1092 + BITMAP 1093 + 00 1094 + 70 1095 + 80 1096 + 80 1097 + E0 1098 + 80 1099 + 80 1100 + 00 1101 + ENDCHAR 1102 + STARTCHAR LATIN CAPITAL LETTER G 1103 + ENCODING 71 1104 + SWIDTH 750 0 1105 + DWIDTH 6 0 1106 + BBX 6 8 0 -1 1107 + BITMAP 1108 + 00 1109 + 70 1110 + 80 1111 + B0 1112 + 90 1113 + 90 1114 + 70 1115 + 00 1116 + ENDCHAR 1117 + STARTCHAR LATIN CAPITAL LETTER H 1118 + ENCODING 72 1119 + SWIDTH 750 0 1120 + DWIDTH 6 0 1121 + BBX 6 8 0 -1 1122 + BITMAP 1123 + 00 1124 + 90 1125 + 90 1126 + F0 1127 + 90 1128 + 90 1129 + 90 1130 + 00 1131 + ENDCHAR 1132 + STARTCHAR LATIN CAPITAL LETTER I 1133 + ENCODING 73 1134 + SWIDTH 750 0 1135 + DWIDTH 6 0 1136 + BBX 6 8 0 -1 1137 + BITMAP 1138 + 00 1139 + 70 1140 + 20 1141 + 20 1142 + 20 1143 + 20 1144 + 70 1145 + 00 1146 + ENDCHAR 1147 + STARTCHAR LATIN CAPITAL LETTER J 1148 + ENCODING 74 1149 + SWIDTH 750 0 1150 + DWIDTH 6 0 1151 + BBX 6 8 0 -1 1152 + BITMAP 1153 + 00 1154 + 70 1155 + 20 1156 + 20 1157 + 20 1158 + 20 1159 + C0 1160 + 00 1161 + ENDCHAR 1162 + STARTCHAR LATIN CAPITAL LETTER K 1163 + ENCODING 75 1164 + SWIDTH 750 0 1165 + DWIDTH 6 0 1166 + BBX 6 8 0 -1 1167 + BITMAP 1168 + 00 1169 + 90 1170 + 90 1171 + E0 1172 + 90 1173 + 90 1174 + 90 1175 + 00 1176 + ENDCHAR 1177 + STARTCHAR LATIN CAPITAL LETTER L 1178 + ENCODING 76 1179 + SWIDTH 750 0 1180 + DWIDTH 6 0 1181 + BBX 6 8 0 -1 1182 + BITMAP 1183 + 00 1184 + 80 1185 + 80 1186 + 80 1187 + 80 1188 + 80 1189 + 70 1190 + 00 1191 + ENDCHAR 1192 + STARTCHAR LATIN CAPITAL LETTER M 1193 + ENCODING 77 1194 + SWIDTH 750 0 1195 + DWIDTH 6 0 1196 + BBX 6 8 0 -1 1197 + BITMAP 1198 + 00 1199 + 90 1200 + F0 1201 + F0 1202 + 90 1203 + 90 1204 + 90 1205 + 00 1206 + ENDCHAR 1207 + STARTCHAR LATIN CAPITAL LETTER N 1208 + ENCODING 78 1209 + SWIDTH 750 0 1210 + DWIDTH 6 0 1211 + BBX 6 8 0 -1 1212 + BITMAP 1213 + 00 1214 + 90 1215 + D0 1216 + D0 1217 + B0 1218 + B0 1219 + 90 1220 + 00 1221 + ENDCHAR 1222 + STARTCHAR LATIN CAPITAL LETTER O 1223 + ENCODING 79 1224 + SWIDTH 750 0 1225 + DWIDTH 6 0 1226 + BBX 6 8 0 -1 1227 + BITMAP 1228 + 00 1229 + 60 1230 + 90 1231 + 90 1232 + 90 1233 + 90 1234 + 60 1235 + 00 1236 + ENDCHAR 1237 + STARTCHAR LATIN CAPITAL LETTER P 1238 + ENCODING 80 1239 + SWIDTH 750 0 1240 + DWIDTH 6 0 1241 + BBX 6 8 0 -1 1242 + BITMAP 1243 + 00 1244 + E0 1245 + 90 1246 + 90 1247 + E0 1248 + 80 1249 + 80 1250 + 00 1251 + ENDCHAR 1252 + STARTCHAR LATIN CAPITAL LETTER Q 1253 + ENCODING 81 1254 + SWIDTH 750 0 1255 + DWIDTH 6 0 1256 + BBX 6 8 0 -1 1257 + BITMAP 1258 + 00 1259 + 60 1260 + 90 1261 + 90 1262 + 90 1263 + 90 1264 + 60 1265 + 30 1266 + ENDCHAR 1267 + STARTCHAR LATIN CAPITAL LETTER R 1268 + ENCODING 82 1269 + SWIDTH 750 0 1270 + DWIDTH 6 0 1271 + BBX 6 8 0 -1 1272 + BITMAP 1273 + 00 1274 + E0 1275 + 90 1276 + 90 1277 + E0 1278 + 90 1279 + 90 1280 + 00 1281 + ENDCHAR 1282 + STARTCHAR LATIN CAPITAL LETTER S 1283 + ENCODING 83 1284 + SWIDTH 750 0 1285 + DWIDTH 6 0 1286 + BBX 6 8 0 -1 1287 + BITMAP 1288 + 00 1289 + 70 1290 + 80 1291 + 60 1292 + 10 1293 + 10 1294 + E0 1295 + 00 1296 + ENDCHAR 1297 + STARTCHAR LATIN CAPITAL LETTER T 1298 + ENCODING 84 1299 + SWIDTH 750 0 1300 + DWIDTH 6 0 1301 + BBX 6 8 0 -1 1302 + BITMAP 1303 + 00 1304 + F8 1305 + 20 1306 + 20 1307 + 20 1308 + 20 1309 + 20 1310 + 00 1311 + ENDCHAR 1312 + STARTCHAR LATIN CAPITAL LETTER U 1313 + ENCODING 85 1314 + SWIDTH 750 0 1315 + DWIDTH 6 0 1316 + BBX 6 8 0 -1 1317 + BITMAP 1318 + 00 1319 + 90 1320 + 90 1321 + 90 1322 + 90 1323 + 90 1324 + 70 1325 + 00 1326 + ENDCHAR 1327 + STARTCHAR LATIN CAPITAL LETTER V 1328 + ENCODING 86 1329 + SWIDTH 750 0 1330 + DWIDTH 6 0 1331 + BBX 6 8 0 -1 1332 + BITMAP 1333 + 00 1334 + 90 1335 + 90 1336 + 90 1337 + 90 1338 + 60 1339 + 60 1340 + 00 1341 + ENDCHAR 1342 + STARTCHAR LATIN CAPITAL LETTER W 1343 + ENCODING 87 1344 + SWIDTH 750 0 1345 + DWIDTH 6 0 1346 + BBX 6 8 0 -1 1347 + BITMAP 1348 + 00 1349 + 90 1350 + 90 1351 + 90 1352 + F0 1353 + F0 1354 + 90 1355 + 00 1356 + ENDCHAR 1357 + STARTCHAR LATIN CAPITAL LETTER X 1358 + ENCODING 88 1359 + SWIDTH 750 0 1360 + DWIDTH 6 0 1361 + BBX 6 8 0 -1 1362 + BITMAP 1363 + 00 1364 + 90 1365 + 90 1366 + 60 1367 + 60 1368 + 90 1369 + 90 1370 + 00 1371 + ENDCHAR 1372 + STARTCHAR LATIN CAPITAL LETTER Y 1373 + ENCODING 89 1374 + SWIDTH 750 0 1375 + DWIDTH 6 0 1376 + BBX 6 8 0 -1 1377 + BITMAP 1378 + 00 1379 + 90 1380 + 90 1381 + 90 1382 + 70 1383 + 10 1384 + E0 1385 + 00 1386 + ENDCHAR 1387 + STARTCHAR LATIN CAPITAL LETTER Z 1388 + ENCODING 90 1389 + SWIDTH 750 0 1390 + DWIDTH 6 0 1391 + BBX 6 8 0 -1 1392 + BITMAP 1393 + 00 1394 + F0 1395 + 10 1396 + 20 1397 + 40 1398 + 80 1399 + F0 1400 + 00 1401 + ENDCHAR 1402 + STARTCHAR LEFT SQUARE BRACKET 1403 + ENCODING 91 1404 + SWIDTH 750 0 1405 + DWIDTH 6 0 1406 + BBX 6 8 0 -1 1407 + BITMAP 1408 + 70 1409 + 40 1410 + 40 1411 + 40 1412 + 40 1413 + 40 1414 + 40 1415 + 70 1416 + ENDCHAR 1417 + STARTCHAR REVERSE SOLIDUS 1418 + ENCODING 92 1419 + SWIDTH 750 0 1420 + DWIDTH 6 0 1421 + BBX 6 8 0 -1 1422 + BITMAP 1423 + 80 1424 + 80 1425 + 40 1426 + 40 1427 + 20 1428 + 20 1429 + 10 1430 + 10 1431 + ENDCHAR 1432 + STARTCHAR RIGHT SQUARE BRACKET 1433 + ENCODING 93 1434 + SWIDTH 750 0 1435 + DWIDTH 6 0 1436 + BBX 6 8 0 -1 1437 + BITMAP 1438 + 70 1439 + 10 1440 + 10 1441 + 10 1442 + 10 1443 + 10 1444 + 10 1445 + 70 1446 + ENDCHAR 1447 + STARTCHAR CIRCUMFLEX ACCENT 1448 + ENCODING 94 1449 + SWIDTH 750 0 1450 + DWIDTH 6 0 1451 + BBX 6 8 0 -1 1452 + BITMAP 1453 + 00 1454 + 20 1455 + 50 1456 + 88 1457 + 00 1458 + 00 1459 + 00 1460 + 00 1461 + ENDCHAR 1462 + STARTCHAR LOW LINE 1463 + ENCODING 95 1464 + SWIDTH 750 0 1465 + DWIDTH 6 0 1466 + BBX 6 8 0 -1 1467 + BITMAP 1468 + 00 1469 + 00 1470 + 00 1471 + 00 1472 + 00 1473 + 00 1474 + 00 1475 + F0 1476 + ENDCHAR 1477 + STARTCHAR GRAVE ACCENT 1478 + ENCODING 96 1479 + SWIDTH 750 0 1480 + DWIDTH 6 0 1481 + BBX 6 8 0 -1 1482 + BITMAP 1483 + 40 1484 + 20 1485 + 00 1486 + 00 1487 + 00 1488 + 00 1489 + 00 1490 + 00 1491 + ENDCHAR 1492 + STARTCHAR LATIN SMALL LETTER A 1493 + ENCODING 97 1494 + SWIDTH 750 0 1495 + DWIDTH 6 0 1496 + BBX 6 8 0 -1 1497 + BITMAP 1498 + 00 1499 + 00 1500 + 60 1501 + 10 1502 + 70 1503 + 90 1504 + 70 1505 + 00 1506 + ENDCHAR 1507 + STARTCHAR LATIN SMALL LETTER B 1508 + ENCODING 98 1509 + SWIDTH 750 0 1510 + DWIDTH 6 0 1511 + BBX 6 8 0 -1 1512 + BITMAP 1513 + 80 1514 + 80 1515 + E0 1516 + 90 1517 + 90 1518 + 90 1519 + E0 1520 + 00 1521 + ENDCHAR 1522 + STARTCHAR LATIN SMALL LETTER C 1523 + ENCODING 99 1524 + SWIDTH 750 0 1525 + DWIDTH 6 0 1526 + BBX 6 8 0 -1 1527 + BITMAP 1528 + 00 1529 + 00 1530 + 70 1531 + 80 1532 + 80 1533 + 80 1534 + 70 1535 + 00 1536 + ENDCHAR 1537 + STARTCHAR LATIN SMALL LETTER D 1538 + ENCODING 100 1539 + SWIDTH 750 0 1540 + DWIDTH 6 0 1541 + BBX 6 8 0 -1 1542 + BITMAP 1543 + 10 1544 + 10 1545 + 70 1546 + 90 1547 + 90 1548 + 90 1549 + 70 1550 + 00 1551 + ENDCHAR 1552 + STARTCHAR LATIN SMALL LETTER E 1553 + ENCODING 101 1554 + SWIDTH 750 0 1555 + DWIDTH 6 0 1556 + BBX 6 8 0 -1 1557 + BITMAP 1558 + 00 1559 + 00 1560 + 70 1561 + 90 1562 + F0 1563 + 80 1564 + 70 1565 + 00 1566 + ENDCHAR 1567 + STARTCHAR LATIN SMALL LETTER F 1568 + ENCODING 102 1569 + SWIDTH 750 0 1570 + DWIDTH 6 0 1571 + BBX 6 8 0 -1 1572 + BITMAP 1573 + 30 1574 + 40 1575 + 40 1576 + E0 1577 + 40 1578 + 40 1579 + 40 1580 + 00 1581 + ENDCHAR 1582 + STARTCHAR LATIN SMALL LETTER G 1583 + ENCODING 103 1584 + SWIDTH 750 0 1585 + DWIDTH 6 0 1586 + BBX 6 8 0 -1 1587 + BITMAP 1588 + 00 1589 + 00 1590 + 70 1591 + 90 1592 + 90 1593 + 60 1594 + 10 1595 + E0 1596 + ENDCHAR 1597 + STARTCHAR LATIN SMALL LETTER H 1598 + ENCODING 104 1599 + SWIDTH 750 0 1600 + DWIDTH 6 0 1601 + BBX 6 8 0 -1 1602 + BITMAP 1603 + 80 1604 + 80 1605 + E0 1606 + 90 1607 + 90 1608 + 90 1609 + 90 1610 + 00 1611 + ENDCHAR 1612 + STARTCHAR LATIN SMALL LETTER I 1613 + ENCODING 105 1614 + SWIDTH 750 0 1615 + DWIDTH 6 0 1616 + BBX 6 8 0 -1 1617 + BITMAP 1618 + 00 1619 + 20 1620 + 00 1621 + 20 1622 + 20 1623 + 20 1624 + 20 1625 + 00 1626 + ENDCHAR 1627 + STARTCHAR LATIN SMALL LETTER J 1628 + ENCODING 106 1629 + SWIDTH 750 0 1630 + DWIDTH 6 0 1631 + BBX 6 8 0 -1 1632 + BITMAP 1633 + 00 1634 + 20 1635 + 00 1636 + 20 1637 + 20 1638 + 20 1639 + 20 1640 + C0 1641 + ENDCHAR 1642 + STARTCHAR LATIN SMALL LETTER K 1643 + ENCODING 107 1644 + SWIDTH 750 0 1645 + DWIDTH 6 0 1646 + BBX 6 8 0 -1 1647 + BITMAP 1648 + 80 1649 + 80 1650 + 90 1651 + A0 1652 + C0 1653 + A0 1654 + 90 1655 + 00 1656 + ENDCHAR 1657 + STARTCHAR LATIN SMALL LETTER L 1658 + ENCODING 108 1659 + SWIDTH 750 0 1660 + DWIDTH 6 0 1661 + BBX 6 8 0 -1 1662 + BITMAP 1663 + 40 1664 + 40 1665 + 40 1666 + 40 1667 + 40 1668 + 40 1669 + 30 1670 + 00 1671 + ENDCHAR 1672 + STARTCHAR LATIN SMALL LETTER M 1673 + ENCODING 109 1674 + SWIDTH 750 0 1675 + DWIDTH 6 0 1676 + BBX 6 8 0 -1 1677 + BITMAP 1678 + 00 1679 + 00 1680 + 90 1681 + F0 1682 + F0 1683 + 90 1684 + 90 1685 + 00 1686 + ENDCHAR 1687 + STARTCHAR LATIN SMALL LETTER N 1688 + ENCODING 110 1689 + SWIDTH 750 0 1690 + DWIDTH 6 0 1691 + BBX 6 8 0 -1 1692 + BITMAP 1693 + 00 1694 + 00 1695 + E0 1696 + 90 1697 + 90 1698 + 90 1699 + 90 1700 + 00 1701 + ENDCHAR 1702 + STARTCHAR LATIN SMALL LETTER O 1703 + ENCODING 111 1704 + SWIDTH 750 0 1705 + DWIDTH 6 0 1706 + BBX 6 8 0 -1 1707 + BITMAP 1708 + 00 1709 + 00 1710 + 60 1711 + 90 1712 + 90 1713 + 90 1714 + 60 1715 + 00 1716 + ENDCHAR 1717 + STARTCHAR LATIN SMALL LETTER P 1718 + ENCODING 112 1719 + SWIDTH 750 0 1720 + DWIDTH 6 0 1721 + BBX 6 8 0 -1 1722 + BITMAP 1723 + 00 1724 + 00 1725 + E0 1726 + 90 1727 + 90 1728 + E0 1729 + 80 1730 + 80 1731 + ENDCHAR 1732 + STARTCHAR LATIN SMALL LETTER Q 1733 + ENCODING 113 1734 + SWIDTH 750 0 1735 + DWIDTH 6 0 1736 + BBX 6 8 0 -1 1737 + BITMAP 1738 + 00 1739 + 00 1740 + 70 1741 + 90 1742 + 90 1743 + 70 1744 + 10 1745 + 10 1746 + ENDCHAR 1747 + STARTCHAR LATIN SMALL LETTER R 1748 + ENCODING 114 1749 + SWIDTH 750 0 1750 + DWIDTH 6 0 1751 + BBX 6 8 0 -1 1752 + BITMAP 1753 + 00 1754 + 00 1755 + 70 1756 + 90 1757 + 80 1758 + 80 1759 + 80 1760 + 00 1761 + ENDCHAR 1762 + STARTCHAR LATIN SMALL LETTER S 1763 + ENCODING 115 1764 + SWIDTH 750 0 1765 + DWIDTH 6 0 1766 + BBX 6 8 0 -1 1767 + BITMAP 1768 + 00 1769 + 00 1770 + 70 1771 + 80 1772 + 60 1773 + 10 1774 + E0 1775 + 00 1776 + ENDCHAR 1777 + STARTCHAR LATIN SMALL LETTER T 1778 + ENCODING 116 1779 + SWIDTH 750 0 1780 + DWIDTH 6 0 1781 + BBX 6 8 0 -1 1782 + BITMAP 1783 + 40 1784 + 40 1785 + E0 1786 + 40 1787 + 40 1788 + 40 1789 + 30 1790 + 00 1791 + ENDCHAR 1792 + STARTCHAR LATIN SMALL LETTER U 1793 + ENCODING 117 1794 + SWIDTH 750 0 1795 + DWIDTH 6 0 1796 + BBX 6 8 0 -1 1797 + BITMAP 1798 + 00 1799 + 00 1800 + 90 1801 + 90 1802 + 90 1803 + 90 1804 + 70 1805 + 00 1806 + ENDCHAR 1807 + STARTCHAR LATIN SMALL LETTER V 1808 + ENCODING 118 1809 + SWIDTH 750 0 1810 + DWIDTH 6 0 1811 + BBX 6 8 0 -1 1812 + BITMAP 1813 + 00 1814 + 00 1815 + 90 1816 + 90 1817 + 90 1818 + 60 1819 + 60 1820 + 00 1821 + ENDCHAR 1822 + STARTCHAR LATIN SMALL LETTER W 1823 + ENCODING 119 1824 + SWIDTH 750 0 1825 + DWIDTH 6 0 1826 + BBX 6 8 0 -1 1827 + BITMAP 1828 + 00 1829 + 00 1830 + 90 1831 + 90 1832 + F0 1833 + F0 1834 + 90 1835 + 00 1836 + ENDCHAR 1837 + STARTCHAR LATIN SMALL LETTER X 1838 + ENCODING 120 1839 + SWIDTH 750 0 1840 + DWIDTH 6 0 1841 + BBX 6 8 0 -1 1842 + BITMAP 1843 + 00 1844 + 00 1845 + 90 1846 + 60 1847 + 60 1848 + 90 1849 + 90 1850 + 00 1851 + ENDCHAR 1852 + STARTCHAR LATIN SMALL LETTER Y 1853 + ENCODING 121 1854 + SWIDTH 750 0 1855 + DWIDTH 6 0 1856 + BBX 6 8 0 -1 1857 + BITMAP 1858 + 00 1859 + 00 1860 + 90 1861 + 90 1862 + 90 1863 + 70 1864 + 10 1865 + E0 1866 + ENDCHAR 1867 + STARTCHAR LATIN SMALL LETTER Z 1868 + ENCODING 122 1869 + SWIDTH 750 0 1870 + DWIDTH 6 0 1871 + BBX 6 8 0 -1 1872 + BITMAP 1873 + 00 1874 + 00 1875 + F0 1876 + 10 1877 + 20 1878 + 40 1879 + F0 1880 + 00 1881 + ENDCHAR 1882 + STARTCHAR LEFT CURLY BRACKET 1883 + ENCODING 123 1884 + SWIDTH 750 0 1885 + DWIDTH 6 0 1886 + BBX 6 8 0 -1 1887 + BITMAP 1888 + 30 1889 + 40 1890 + 40 1891 + C0 1892 + C0 1893 + 40 1894 + 40 1895 + 30 1896 + ENDCHAR 1897 + STARTCHAR VERTICAL LINE 1898 + ENCODING 124 1899 + SWIDTH 750 0 1900 + DWIDTH 6 0 1901 + BBX 6 8 0 -1 1902 + BITMAP 1903 + 00 1904 + 20 1905 + 20 1906 + 20 1907 + 20 1908 + 20 1909 + 20 1910 + 00 1911 + ENDCHAR 1912 + STARTCHAR RIGHT CURLY BRACKET 1913 + ENCODING 125 1914 + SWIDTH 750 0 1915 + DWIDTH 6 0 1916 + BBX 6 8 0 -1 1917 + BITMAP 1918 + C0 1919 + 20 1920 + 20 1921 + 30 1922 + 30 1923 + 20 1924 + 20 1925 + C0 1926 + ENDCHAR 1927 + STARTCHAR TILDE 1928 + ENCODING 126 1929 + SWIDTH 750 0 1930 + DWIDTH 6 0 1931 + BBX 6 8 0 -1 1932 + BITMAP 1933 + 00 1934 + 48 1935 + B0 1936 + 00 1937 + 00 1938 + 00 1939 + 00 1940 + 00 1941 + ENDCHAR 1942 + STARTCHAR <control> 1943 + ENCODING 127 1944 + SWIDTH 750 0 1945 + DWIDTH 6 0 1946 + BBX 6 8 0 -1 1947 + BITMAP 1948 + 00 1949 + 00 1950 + 00 1951 + 00 1952 + 00 1953 + 00 1954 + 00 1955 + 00 1956 + ENDCHAR 1957 + STARTCHAR NO-BREAK SPACE 1958 + ENCODING 160 1959 + SWIDTH 750 0 1960 + DWIDTH 6 0 1961 + BBX 6 8 0 -1 1962 + BITMAP 1963 + 00 1964 + 00 1965 + 00 1966 + 00 1967 + 00 1968 + 00 1969 + 00 1970 + 00 1971 + ENDCHAR 1972 + STARTCHAR INVERTED EXCLAMATION MARK 1973 + ENCODING 161 1974 + SWIDTH 750 0 1975 + DWIDTH 6 0 1976 + BBX 6 8 0 -1 1977 + BITMAP 1978 + 00 1979 + 00 1980 + 00 1981 + 00 1982 + 00 1983 + 00 1984 + 00 1985 + 00 1986 + ENDCHAR 1987 + STARTCHAR CENT SIGN 1988 + ENCODING 162 1989 + SWIDTH 750 0 1990 + DWIDTH 6 0 1991 + BBX 6 8 0 -1 1992 + BITMAP 1993 + 00 1994 + 00 1995 + 00 1996 + 00 1997 + 00 1998 + 00 1999 + 00 2000 + 00 2001 + ENDCHAR 2002 + STARTCHAR POUND SIGN 2003 + ENCODING 163 2004 + SWIDTH 750 0 2005 + DWIDTH 6 0 2006 + BBX 6 8 0 -1 2007 + BITMAP 2008 + 00 2009 + 00 2010 + 00 2011 + 00 2012 + 00 2013 + 00 2014 + 00 2015 + 00 2016 + ENDCHAR 2017 + STARTCHAR CURRENCY SIGN 2018 + ENCODING 164 2019 + SWIDTH 750 0 2020 + DWIDTH 6 0 2021 + BBX 6 8 0 -1 2022 + BITMAP 2023 + 00 2024 + 00 2025 + 00 2026 + 00 2027 + 00 2028 + 00 2029 + 00 2030 + 00 2031 + ENDCHAR 2032 + STARTCHAR YEN SIGN 2033 + ENCODING 165 2034 + SWIDTH 750 0 2035 + DWIDTH 6 0 2036 + BBX 6 8 0 -1 2037 + BITMAP 2038 + 00 2039 + 00 2040 + 00 2041 + 00 2042 + 00 2043 + 00 2044 + 00 2045 + 00 2046 + ENDCHAR 2047 + STARTCHAR BROKEN BAR 2048 + ENCODING 166 2049 + SWIDTH 750 0 2050 + DWIDTH 6 0 2051 + BBX 6 8 0 -1 2052 + BITMAP 2053 + 00 2054 + 00 2055 + 00 2056 + 00 2057 + 00 2058 + 00 2059 + 00 2060 + 00 2061 + ENDCHAR 2062 + STARTCHAR SECTION SIGN 2063 + ENCODING 167 2064 + SWIDTH 750 0 2065 + DWIDTH 6 0 2066 + BBX 6 8 0 -1 2067 + BITMAP 2068 + 00 2069 + 00 2070 + 00 2071 + 00 2072 + 00 2073 + 00 2074 + 00 2075 + 00 2076 + ENDCHAR 2077 + STARTCHAR DIAERESIS 2078 + ENCODING 168 2079 + SWIDTH 750 0 2080 + DWIDTH 6 0 2081 + BBX 6 8 0 -1 2082 + BITMAP 2083 + 00 2084 + 00 2085 + 00 2086 + 00 2087 + 00 2088 + 00 2089 + 00 2090 + 00 2091 + ENDCHAR 2092 + STARTCHAR COPYRIGHT SIGN 2093 + ENCODING 169 2094 + SWIDTH 750 0 2095 + DWIDTH 6 0 2096 + BBX 6 8 0 -1 2097 + BITMAP 2098 + 00 2099 + 00 2100 + 00 2101 + 00 2102 + 00 2103 + 00 2104 + 00 2105 + 00 2106 + ENDCHAR 2107 + STARTCHAR FEMININE ORDINAL INDICATOR 2108 + ENCODING 170 2109 + SWIDTH 750 0 2110 + DWIDTH 6 0 2111 + BBX 6 8 0 -1 2112 + BITMAP 2113 + 00 2114 + 00 2115 + 00 2116 + 00 2117 + 00 2118 + 00 2119 + 00 2120 + 00 2121 + ENDCHAR 2122 + STARTCHAR LEFT-POINTING DOUBLE ANGLE QUOTATION MARK 2123 + ENCODING 171 2124 + SWIDTH 750 0 2125 + DWIDTH 6 0 2126 + BBX 6 8 0 -1 2127 + BITMAP 2128 + 00 2129 + 00 2130 + 00 2131 + 00 2132 + 00 2133 + 00 2134 + 00 2135 + 00 2136 + ENDCHAR 2137 + STARTCHAR NOT SIGN 2138 + ENCODING 172 2139 + SWIDTH 750 0 2140 + DWIDTH 6 0 2141 + BBX 6 8 0 -1 2142 + BITMAP 2143 + 00 2144 + 00 2145 + 00 2146 + 00 2147 + 00 2148 + 00 2149 + 00 2150 + 00 2151 + ENDCHAR 2152 + STARTCHAR SOFT HYPHEN 2153 + ENCODING 173 2154 + SWIDTH 750 0 2155 + DWIDTH 6 0 2156 + BBX 6 8 0 -1 2157 + BITMAP 2158 + 00 2159 + 00 2160 + 00 2161 + 00 2162 + 00 2163 + 00 2164 + 00 2165 + 00 2166 + ENDCHAR 2167 + STARTCHAR REGISTERED SIGN 2168 + ENCODING 174 2169 + SWIDTH 750 0 2170 + DWIDTH 6 0 2171 + BBX 6 8 0 -1 2172 + BITMAP 2173 + 00 2174 + 00 2175 + 00 2176 + 00 2177 + 00 2178 + 00 2179 + 00 2180 + 00 2181 + ENDCHAR 2182 + STARTCHAR MACRON 2183 + ENCODING 175 2184 + SWIDTH 750 0 2185 + DWIDTH 6 0 2186 + BBX 6 8 0 -1 2187 + BITMAP 2188 + 00 2189 + 00 2190 + 00 2191 + 00 2192 + 00 2193 + 00 2194 + 00 2195 + 00 2196 + ENDCHAR 2197 + STARTCHAR DEGREE SIGN 2198 + ENCODING 176 2199 + SWIDTH 750 0 2200 + DWIDTH 6 0 2201 + BBX 6 8 0 -1 2202 + BITMAP 2203 + 00 2204 + A8 2205 + 00 2206 + A8 2207 + 00 2208 + A8 2209 + 00 2210 + A8 2211 + ENDCHAR 2212 + STARTCHAR PLUS-MINUS SIGN 2213 + ENCODING 177 2214 + SWIDTH 750 0 2215 + DWIDTH 6 0 2216 + BBX 6 8 0 -1 2217 + BITMAP 2218 + 50 2219 + A8 2220 + 50 2221 + A8 2222 + 50 2223 + A8 2224 + 50 2225 + A8 2226 + ENDCHAR 2227 + STARTCHAR SUPERSCRIPT TWO 2228 + ENCODING 178 2229 + SWIDTH 750 0 2230 + DWIDTH 6 0 2231 + BBX 6 8 0 -1 2232 + BITMAP 2233 + F8 2234 + 50 2235 + F8 2236 + 50 2237 + F8 2238 + 50 2239 + F8 2240 + 50 2241 + ENDCHAR 2242 + STARTCHAR SUPERSCRIPT THREE 2243 + ENCODING 179 2244 + SWIDTH 750 0 2245 + DWIDTH 6 0 2246 + BBX 6 8 0 -1 2247 + BITMAP 2248 + 20 2249 + 20 2250 + 20 2251 + 20 2252 + 20 2253 + 20 2254 + 20 2255 + 20 2256 + ENDCHAR 2257 + STARTCHAR ACUTE ACCENT 2258 + ENCODING 180 2259 + SWIDTH 750 0 2260 + DWIDTH 6 0 2261 + BBX 6 8 0 -1 2262 + BITMAP 2263 + 20 2264 + 20 2265 + 20 2266 + 20 2267 + E0 2268 + 20 2269 + 20 2270 + 20 2271 + ENDCHAR 2272 + STARTCHAR MICRO SIGN 2273 + ENCODING 181 2274 + SWIDTH 750 0 2275 + DWIDTH 6 0 2276 + BBX 6 8 0 -1 2277 + BITMAP 2278 + 20 2279 + 20 2280 + 20 2281 + E0 2282 + 20 2283 + E0 2284 + 20 2285 + 20 2286 + ENDCHAR 2287 + STARTCHAR PILCROW SIGN 2288 + ENCODING 182 2289 + SWIDTH 750 0 2290 + DWIDTH 6 0 2291 + BBX 6 8 0 -1 2292 + BITMAP 2293 + 50 2294 + 50 2295 + 50 2296 + 50 2297 + D0 2298 + 50 2299 + 50 2300 + 50 2301 + ENDCHAR 2302 + STARTCHAR MIDDLE DOT 2303 + ENCODING 183 2304 + SWIDTH 750 0 2305 + DWIDTH 6 0 2306 + BBX 6 8 0 -1 2307 + BITMAP 2308 + 00 2309 + 00 2310 + 00 2311 + 00 2312 + F0 2313 + 50 2314 + 50 2315 + 50 2316 + ENDCHAR 2317 + STARTCHAR CEDILLA 2318 + ENCODING 184 2319 + SWIDTH 750 0 2320 + DWIDTH 6 0 2321 + BBX 6 8 0 -1 2322 + BITMAP 2323 + 00 2324 + 00 2325 + 00 2326 + E0 2327 + 20 2328 + E0 2329 + 20 2330 + 20 2331 + ENDCHAR 2332 + STARTCHAR SUPERSCRIPT ONE 2333 + ENCODING 185 2334 + SWIDTH 750 0 2335 + DWIDTH 6 0 2336 + BBX 6 8 0 -1 2337 + BITMAP 2338 + 50 2339 + 50 2340 + 50 2341 + D0 2342 + 10 2343 + D0 2344 + 50 2345 + 50 2346 + ENDCHAR 2347 + STARTCHAR MASCULINE ORDINAL INDICATOR 2348 + ENCODING 186 2349 + SWIDTH 750 0 2350 + DWIDTH 6 0 2351 + BBX 6 8 0 -1 2352 + BITMAP 2353 + 50 2354 + 50 2355 + 50 2356 + 50 2357 + 50 2358 + 50 2359 + 50 2360 + 50 2361 + ENDCHAR 2362 + STARTCHAR RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK 2363 + ENCODING 187 2364 + SWIDTH 750 0 2365 + DWIDTH 6 0 2366 + BBX 6 8 0 -1 2367 + BITMAP 2368 + 00 2369 + 00 2370 + 00 2371 + F0 2372 + 10 2373 + D0 2374 + 50 2375 + 50 2376 + ENDCHAR 2377 + STARTCHAR VULGAR FRACTION ONE QUARTER 2378 + ENCODING 188 2379 + SWIDTH 750 0 2380 + DWIDTH 6 0 2381 + BBX 6 8 0 -1 2382 + BITMAP 2383 + 50 2384 + 50 2385 + 50 2386 + D0 2387 + 10 2388 + F0 2389 + 00 2390 + 00 2391 + ENDCHAR 2392 + STARTCHAR VULGAR FRACTION ONE HALF 2393 + ENCODING 189 2394 + SWIDTH 750 0 2395 + DWIDTH 6 0 2396 + BBX 6 8 0 -1 2397 + BITMAP 2398 + 50 2399 + 50 2400 + 50 2401 + 50 2402 + F0 2403 + 00 2404 + 00 2405 + 00 2406 + ENDCHAR 2407 + STARTCHAR VULGAR FRACTION THREE QUARTERS 2408 + ENCODING 190 2409 + SWIDTH 750 0 2410 + DWIDTH 6 0 2411 + BBX 6 8 0 -1 2412 + BITMAP 2413 + 20 2414 + 20 2415 + 20 2416 + E0 2417 + 20 2418 + E0 2419 + 00 2420 + 00 2421 + ENDCHAR 2422 + STARTCHAR INVERTED QUESTION MARK 2423 + ENCODING 191 2424 + SWIDTH 750 0 2425 + DWIDTH 6 0 2426 + BBX 6 8 0 -1 2427 + BITMAP 2428 + 00 2429 + 00 2430 + 00 2431 + 00 2432 + E0 2433 + 20 2434 + 20 2435 + 20 2436 + ENDCHAR 2437 + STARTCHAR LATIN CAPITAL LETTER A WITH GRAVE 2438 + ENCODING 192 2439 + SWIDTH 750 0 2440 + DWIDTH 6 0 2441 + BBX 6 8 0 -1 2442 + BITMAP 2443 + 20 2444 + 20 2445 + 20 2446 + 20 2447 + 3C 2448 + 00 2449 + 00 2450 + 00 2451 + ENDCHAR 2452 + STARTCHAR LATIN CAPITAL LETTER A WITH ACUTE 2453 + ENCODING 193 2454 + SWIDTH 750 0 2455 + DWIDTH 6 0 2456 + BBX 6 8 0 -1 2457 + BITMAP 2458 + 20 2459 + 20 2460 + 20 2461 + 20 2462 + FC 2463 + 00 2464 + 00 2465 + 00 2466 + ENDCHAR 2467 + STARTCHAR LATIN CAPITAL LETTER A WITH CIRCUMFLEX 2468 + ENCODING 194 2469 + SWIDTH 750 0 2470 + DWIDTH 6 0 2471 + BBX 6 8 0 -1 2472 + BITMAP 2473 + 00 2474 + 00 2475 + 00 2476 + 00 2477 + FC 2478 + 20 2479 + 20 2480 + 20 2481 + ENDCHAR 2482 + STARTCHAR LATIN CAPITAL LETTER A WITH TILDE 2483 + ENCODING 195 2484 + SWIDTH 750 0 2485 + DWIDTH 6 0 2486 + BBX 6 8 0 -1 2487 + BITMAP 2488 + 20 2489 + 20 2490 + 20 2491 + 20 2492 + 3C 2493 + 20 2494 + 20 2495 + 20 2496 + ENDCHAR 2497 + STARTCHAR LATIN CAPITAL LETTER A WITH DIAERESIS 2498 + ENCODING 196 2499 + SWIDTH 750 0 2500 + DWIDTH 6 0 2501 + BBX 6 8 0 -1 2502 + BITMAP 2503 + 00 2504 + 00 2505 + 00 2506 + 00 2507 + FC 2508 + 00 2509 + 00 2510 + 00 2511 + ENDCHAR 2512 + STARTCHAR LATIN CAPITAL LETTER A WITH RING ABOVE 2513 + ENCODING 197 2514 + SWIDTH 750 0 2515 + DWIDTH 6 0 2516 + BBX 6 8 0 -1 2517 + BITMAP 2518 + 20 2519 + 20 2520 + 20 2521 + 20 2522 + FC 2523 + 20 2524 + 20 2525 + 20 2526 + ENDCHAR 2527 + STARTCHAR LATIN CAPITAL LETTER AE 2528 + ENCODING 198 2529 + SWIDTH 750 0 2530 + DWIDTH 6 0 2531 + BBX 6 8 0 -1 2532 + BITMAP 2533 + 20 2534 + 20 2535 + 20 2536 + 3C 2537 + 20 2538 + 3C 2539 + 20 2540 + 20 2541 + ENDCHAR 2542 + STARTCHAR LATIN CAPITAL LETTER C WITH CEDILLA 2543 + ENCODING 199 2544 + SWIDTH 750 0 2545 + DWIDTH 6 0 2546 + BBX 6 8 0 -1 2547 + BITMAP 2548 + 50 2549 + 50 2550 + 50 2551 + 50 2552 + 5C 2553 + 50 2554 + 50 2555 + 50 2556 + ENDCHAR 2557 + STARTCHAR LATIN CAPITAL LETTER E WITH GRAVE 2558 + ENCODING 200 2559 + SWIDTH 750 0 2560 + DWIDTH 6 0 2561 + BBX 6 8 0 -1 2562 + BITMAP 2563 + 50 2564 + 50 2565 + 50 2566 + 5C 2567 + 40 2568 + 7C 2569 + 00 2570 + 00 2571 + ENDCHAR 2572 + STARTCHAR LATIN CAPITAL LETTER E WITH ACUTE 2573 + ENCODING 201 2574 + SWIDTH 750 0 2575 + DWIDTH 6 0 2576 + BBX 6 8 0 -1 2577 + BITMAP 2578 + 00 2579 + 00 2580 + 00 2581 + 7C 2582 + 40 2583 + 5C 2584 + 50 2585 + 50 2586 + ENDCHAR 2587 + STARTCHAR LATIN CAPITAL LETTER E WITH CIRCUMFLEX 2588 + ENCODING 202 2589 + SWIDTH 750 0 2590 + DWIDTH 6 0 2591 + BBX 6 8 0 -1 2592 + BITMAP 2593 + 50 2594 + 50 2595 + 50 2596 + DC 2597 + 00 2598 + FC 2599 + 00 2600 + 00 2601 + ENDCHAR 2602 + STARTCHAR LATIN CAPITAL LETTER E WITH DIAERESIS 2603 + ENCODING 203 2604 + SWIDTH 750 0 2605 + DWIDTH 6 0 2606 + BBX 6 8 0 -1 2607 + BITMAP 2608 + 00 2609 + 00 2610 + 00 2611 + FC 2612 + 00 2613 + DC 2614 + 50 2615 + 50 2616 + ENDCHAR 2617 + STARTCHAR LATIN CAPITAL LETTER I WITH GRAVE 2618 + ENCODING 204 2619 + SWIDTH 750 0 2620 + DWIDTH 6 0 2621 + BBX 6 8 0 -1 2622 + BITMAP 2623 + 50 2624 + 50 2625 + 50 2626 + 5C 2627 + 40 2628 + 5C 2629 + 50 2630 + 50 2631 + ENDCHAR 2632 + STARTCHAR LATIN CAPITAL LETTER I WITH ACUTE 2633 + ENCODING 205 2634 + SWIDTH 750 0 2635 + DWIDTH 6 0 2636 + BBX 6 8 0 -1 2637 + BITMAP 2638 + 00 2639 + 00 2640 + 00 2641 + FC 2642 + 00 2643 + FC 2644 + 00 2645 + 00 2646 + ENDCHAR 2647 + STARTCHAR LATIN CAPITAL LETTER I WITH CIRCUMFLEX 2648 + ENCODING 206 2649 + SWIDTH 750 0 2650 + DWIDTH 6 0 2651 + BBX 6 8 0 -1 2652 + BITMAP 2653 + 50 2654 + 50 2655 + 50 2656 + DC 2657 + 00 2658 + DC 2659 + 50 2660 + 50 2661 + ENDCHAR 2662 + STARTCHAR LATIN CAPITAL LETTER I WITH DIAERESIS 2663 + ENCODING 207 2664 + SWIDTH 750 0 2665 + DWIDTH 6 0 2666 + BBX 6 8 0 -1 2667 + BITMAP 2668 + 20 2669 + 20 2670 + 20 2671 + FC 2672 + 00 2673 + FC 2674 + 00 2675 + 00 2676 + ENDCHAR 2677 + STARTCHAR LATIN CAPITAL LETTER ETH 2678 + ENCODING 208 2679 + SWIDTH 750 0 2680 + DWIDTH 6 0 2681 + BBX 6 8 0 -1 2682 + BITMAP 2683 + 50 2684 + 50 2685 + 50 2686 + FC 2687 + 00 2688 + FC 2689 + 00 2690 + 00 2691 + ENDCHAR 2692 + STARTCHAR LATIN CAPITAL LETTER N WITH TILDE 2693 + ENCODING 209 2694 + SWIDTH 750 0 2695 + DWIDTH 6 0 2696 + BBX 6 8 0 -1 2697 + BITMAP 2698 + 00 2699 + 00 2700 + 00 2701 + FC 2702 + 00 2703 + FC 2704 + 20 2705 + 20 2706 + ENDCHAR 2707 + STARTCHAR LATIN CAPITAL LETTER O WITH GRAVE 2708 + ENCODING 210 2709 + SWIDTH 750 0 2710 + DWIDTH 6 0 2711 + BBX 6 8 0 -1 2712 + BITMAP 2713 + 00 2714 + 00 2715 + 00 2716 + 00 2717 + FC 2718 + 50 2719 + 50 2720 + 50 2721 + ENDCHAR 2722 + STARTCHAR LATIN CAPITAL LETTER O WITH ACUTE 2723 + ENCODING 211 2724 + SWIDTH 750 0 2725 + DWIDTH 6 0 2726 + BBX 6 8 0 -1 2727 + BITMAP 2728 + 50 2729 + 50 2730 + 50 2731 + 50 2732 + FC 2733 + 00 2734 + 00 2735 + 00 2736 + ENDCHAR 2737 + STARTCHAR LATIN CAPITAL LETTER O WITH CIRCUMFLEX 2738 + ENCODING 212 2739 + SWIDTH 750 0 2740 + DWIDTH 6 0 2741 + BBX 6 8 0 -1 2742 + BITMAP 2743 + 20 2744 + 20 2745 + 20 2746 + 3C 2747 + 20 2748 + 3C 2749 + 00 2750 + 00 2751 + ENDCHAR 2752 + STARTCHAR LATIN CAPITAL LETTER O WITH TILDE 2753 + ENCODING 213 2754 + SWIDTH 750 0 2755 + DWIDTH 6 0 2756 + BBX 6 8 0 -1 2757 + BITMAP 2758 + 00 2759 + 00 2760 + 00 2761 + 3C 2762 + 20 2763 + 3C 2764 + 20 2765 + 20 2766 + ENDCHAR 2767 + STARTCHAR LATIN CAPITAL LETTER O WITH DIAERESIS 2768 + ENCODING 214 2769 + SWIDTH 750 0 2770 + DWIDTH 6 0 2771 + BBX 6 8 0 -1 2772 + BITMAP 2773 + 00 2774 + 00 2775 + 00 2776 + 00 2777 + 7C 2778 + 50 2779 + 50 2780 + 50 2781 + ENDCHAR 2782 + STARTCHAR MULTIPLICATION SIGN 2783 + ENCODING 215 2784 + SWIDTH 750 0 2785 + DWIDTH 6 0 2786 + BBX 6 8 0 -1 2787 + BITMAP 2788 + 50 2789 + 50 2790 + 50 2791 + 50 2792 + FC 2793 + 50 2794 + 50 2795 + 50 2796 + ENDCHAR 2797 + STARTCHAR LATIN CAPITAL LETTER O WITH STROKE 2798 + ENCODING 216 2799 + SWIDTH 750 0 2800 + DWIDTH 6 0 2801 + BBX 6 8 0 -1 2802 + BITMAP 2803 + 20 2804 + 20 2805 + 20 2806 + FC 2807 + 00 2808 + FC 2809 + 20 2810 + 20 2811 + ENDCHAR 2812 + STARTCHAR LATIN CAPITAL LETTER U WITH GRAVE 2813 + ENCODING 217 2814 + SWIDTH 750 0 2815 + DWIDTH 6 0 2816 + BBX 6 8 0 -1 2817 + BITMAP 2818 + 20 2819 + 20 2820 + 20 2821 + 20 2822 + E0 2823 + 00 2824 + 00 2825 + 00 2826 + ENDCHAR 2827 + STARTCHAR LATIN CAPITAL LETTER U WITH ACUTE 2828 + ENCODING 218 2829 + SWIDTH 750 0 2830 + DWIDTH 6 0 2831 + BBX 6 8 0 -1 2832 + BITMAP 2833 + 00 2834 + 00 2835 + 00 2836 + 00 2837 + 3C 2838 + 20 2839 + 20 2840 + 20 2841 + ENDCHAR 2842 + STARTCHAR LATIN CAPITAL LETTER U WITH CIRCUMFLEX 2843 + ENCODING 219 2844 + SWIDTH 750 0 2845 + DWIDTH 6 0 2846 + BBX 6 8 0 -1 2847 + BITMAP 2848 + F8 2849 + F8 2850 + F8 2851 + F8 2852 + F8 2853 + F8 2854 + F8 2855 + F8 2856 + ENDCHAR 2857 + STARTCHAR LATIN CAPITAL LETTER U WITH DIAERESIS 2858 + ENCODING 220 2859 + SWIDTH 750 0 2860 + DWIDTH 6 0 2861 + BBX 6 8 0 -1 2862 + BITMAP 2863 + 00 2864 + 00 2865 + 00 2866 + F8 2867 + F8 2868 + F8 2869 + F8 2870 + F8 2871 + ENDCHAR 2872 + STARTCHAR LATIN CAPITAL LETTER Y WITH ACUTE 2873 + ENCODING 221 2874 + SWIDTH 750 0 2875 + DWIDTH 6 0 2876 + BBX 6 8 0 -1 2877 + BITMAP 2878 + E0 2879 + E0 2880 + E0 2881 + E0 2882 + E0 2883 + E0 2884 + E0 2885 + E0 2886 + ENDCHAR 2887 + STARTCHAR LATIN CAPITAL LETTER THORN 2888 + ENCODING 222 2889 + SWIDTH 750 0 2890 + DWIDTH 6 0 2891 + BBX 6 8 0 -1 2892 + BITMAP 2893 + 38 2894 + 38 2895 + 38 2896 + 38 2897 + 38 2898 + 38 2899 + 38 2900 + 38 2901 + ENDCHAR 2902 + STARTCHAR LATIN SMALL LETTER SHARP S 2903 + ENCODING 223 2904 + SWIDTH 750 0 2905 + DWIDTH 6 0 2906 + BBX 6 8 0 -1 2907 + BITMAP 2908 + F8 2909 + F8 2910 + F8 2911 + F8 2912 + 00 2913 + 00 2914 + 00 2915 + 00 2916 + ENDCHAR 2917 + STARTCHAR LATIN SMALL LETTER A WITH GRAVE 2918 + ENCODING 224 2919 + SWIDTH 750 0 2920 + DWIDTH 6 0 2921 + BBX 6 8 0 -1 2922 + BITMAP 2923 + 00 2924 + 00 2925 + 00 2926 + 00 2927 + 00 2928 + 00 2929 + 00 2930 + 00 2931 + ENDCHAR 2932 + STARTCHAR LATIN SMALL LETTER A WITH ACUTE 2933 + ENCODING 225 2934 + SWIDTH 750 0 2935 + DWIDTH 6 0 2936 + BBX 6 8 0 -1 2937 + BITMAP 2938 + 00 2939 + 00 2940 + 00 2941 + 00 2942 + 00 2943 + 00 2944 + 00 2945 + 00 2946 + ENDCHAR 2947 + STARTCHAR LATIN SMALL LETTER A WITH CIRCUMFLEX 2948 + ENCODING 226 2949 + SWIDTH 750 0 2950 + DWIDTH 6 0 2951 + BBX 6 8 0 -1 2952 + BITMAP 2953 + 00 2954 + 00 2955 + 00 2956 + 00 2957 + 00 2958 + 00 2959 + 00 2960 + 00 2961 + ENDCHAR 2962 + STARTCHAR LATIN SMALL LETTER A WITH TILDE 2963 + ENCODING 227 2964 + SWIDTH 750 0 2965 + DWIDTH 6 0 2966 + BBX 6 8 0 -1 2967 + BITMAP 2968 + 00 2969 + 00 2970 + 00 2971 + 00 2972 + 00 2973 + 00 2974 + 00 2975 + 00 2976 + ENDCHAR 2977 + STARTCHAR LATIN SMALL LETTER A WITH DIAERESIS 2978 + ENCODING 228 2979 + SWIDTH 750 0 2980 + DWIDTH 6 0 2981 + BBX 6 8 0 -1 2982 + BITMAP 2983 + 00 2984 + 00 2985 + 00 2986 + 00 2987 + 00 2988 + 00 2989 + 00 2990 + 00 2991 + ENDCHAR 2992 + STARTCHAR LATIN SMALL LETTER A WITH RING ABOVE 2993 + ENCODING 229 2994 + SWIDTH 750 0 2995 + DWIDTH 6 0 2996 + BBX 6 8 0 -1 2997 + BITMAP 2998 + 00 2999 + 00 3000 + 00 3001 + 00 3002 + 00 3003 + 00 3004 + 00 3005 + 00 3006 + ENDCHAR 3007 + STARTCHAR LATIN SMALL LETTER AE 3008 + ENCODING 230 3009 + SWIDTH 750 0 3010 + DWIDTH 6 0 3011 + BBX 6 8 0 -1 3012 + BITMAP 3013 + 00 3014 + 00 3015 + 00 3016 + 00 3017 + 00 3018 + 00 3019 + 00 3020 + 00 3021 + ENDCHAR 3022 + STARTCHAR LATIN SMALL LETTER C WITH CEDILLA 3023 + ENCODING 231 3024 + SWIDTH 750 0 3025 + DWIDTH 6 0 3026 + BBX 6 8 0 -1 3027 + BITMAP 3028 + 00 3029 + 00 3030 + 00 3031 + 00 3032 + 00 3033 + 00 3034 + 00 3035 + 00 3036 + ENDCHAR 3037 + STARTCHAR LATIN SMALL LETTER E WITH GRAVE 3038 + ENCODING 232 3039 + SWIDTH 750 0 3040 + DWIDTH 6 0 3041 + BBX 6 8 0 -1 3042 + BITMAP 3043 + 00 3044 + 00 3045 + 00 3046 + 00 3047 + 00 3048 + 00 3049 + 00 3050 + 00 3051 + ENDCHAR 3052 + STARTCHAR LATIN SMALL LETTER E WITH ACUTE 3053 + ENCODING 233 3054 + SWIDTH 750 0 3055 + DWIDTH 6 0 3056 + BBX 6 8 0 -1 3057 + BITMAP 3058 + 00 3059 + 00 3060 + 00 3061 + 00 3062 + 00 3063 + 00 3064 + 00 3065 + 00 3066 + ENDCHAR 3067 + STARTCHAR LATIN SMALL LETTER E WITH CIRCUMFLEX 3068 + ENCODING 234 3069 + SWIDTH 750 0 3070 + DWIDTH 6 0 3071 + BBX 6 8 0 -1 3072 + BITMAP 3073 + 00 3074 + 00 3075 + 00 3076 + 00 3077 + 00 3078 + 00 3079 + 00 3080 + 00 3081 + ENDCHAR 3082 + STARTCHAR LATIN SMALL LETTER E WITH DIAERESIS 3083 + ENCODING 235 3084 + SWIDTH 750 0 3085 + DWIDTH 6 0 3086 + BBX 6 8 0 -1 3087 + BITMAP 3088 + 00 3089 + 00 3090 + 00 3091 + 00 3092 + 00 3093 + 00 3094 + 00 3095 + 00 3096 + ENDCHAR 3097 + STARTCHAR LATIN SMALL LETTER I WITH GRAVE 3098 + ENCODING 236 3099 + SWIDTH 750 0 3100 + DWIDTH 6 0 3101 + BBX 6 8 0 -1 3102 + BITMAP 3103 + 00 3104 + 00 3105 + 00 3106 + 00 3107 + 00 3108 + 00 3109 + 00 3110 + 00 3111 + ENDCHAR 3112 + STARTCHAR LATIN SMALL LETTER I WITH ACUTE 3113 + ENCODING 237 3114 + SWIDTH 750 0 3115 + DWIDTH 6 0 3116 + BBX 6 8 0 -1 3117 + BITMAP 3118 + 00 3119 + 00 3120 + 00 3121 + 00 3122 + 00 3123 + 00 3124 + 00 3125 + 00 3126 + ENDCHAR 3127 + STARTCHAR LATIN SMALL LETTER I WITH CIRCUMFLEX 3128 + ENCODING 238 3129 + SWIDTH 750 0 3130 + DWIDTH 6 0 3131 + BBX 6 8 0 -1 3132 + BITMAP 3133 + 00 3134 + 00 3135 + 00 3136 + 00 3137 + 00 3138 + 00 3139 + 00 3140 + 00 3141 + ENDCHAR 3142 + STARTCHAR LATIN SMALL LETTER I WITH DIAERESIS 3143 + ENCODING 239 3144 + SWIDTH 750 0 3145 + DWIDTH 6 0 3146 + BBX 6 8 0 -1 3147 + BITMAP 3148 + 00 3149 + 00 3150 + 00 3151 + 00 3152 + 00 3153 + 00 3154 + 00 3155 + 00 3156 + ENDCHAR 3157 + STARTCHAR LATIN SMALL LETTER ETH 3158 + ENCODING 240 3159 + SWIDTH 750 0 3160 + DWIDTH 6 0 3161 + BBX 6 8 0 -1 3162 + BITMAP 3163 + 00 3164 + 00 3165 + 00 3166 + 00 3167 + 00 3168 + 00 3169 + 00 3170 + 00 3171 + ENDCHAR 3172 + STARTCHAR LATIN SMALL LETTER N WITH TILDE 3173 + ENCODING 241 3174 + SWIDTH 750 0 3175 + DWIDTH 6 0 3176 + BBX 6 8 0 -1 3177 + BITMAP 3178 + 00 3179 + 00 3180 + 00 3181 + 00 3182 + 00 3183 + 00 3184 + 00 3185 + 00 3186 + ENDCHAR 3187 + STARTCHAR LATIN SMALL LETTER O WITH GRAVE 3188 + ENCODING 242 3189 + SWIDTH 750 0 3190 + DWIDTH 6 0 3191 + BBX 6 8 0 -1 3192 + BITMAP 3193 + 00 3194 + 00 3195 + 00 3196 + 00 3197 + 00 3198 + 00 3199 + 00 3200 + 00 3201 + ENDCHAR 3202 + STARTCHAR LATIN SMALL LETTER O WITH ACUTE 3203 + ENCODING 243 3204 + SWIDTH 750 0 3205 + DWIDTH 6 0 3206 + BBX 6 8 0 -1 3207 + BITMAP 3208 + 00 3209 + 00 3210 + 00 3211 + 00 3212 + 00 3213 + 00 3214 + 00 3215 + 00 3216 + ENDCHAR 3217 + STARTCHAR LATIN SMALL LETTER O WITH CIRCUMFLEX 3218 + ENCODING 244 3219 + SWIDTH 750 0 3220 + DWIDTH 6 0 3221 + BBX 6 8 0 -1 3222 + BITMAP 3223 + 00 3224 + 00 3225 + 00 3226 + 00 3227 + 00 3228 + 00 3229 + 00 3230 + 00 3231 + ENDCHAR 3232 + STARTCHAR LATIN SMALL LETTER O WITH TILDE 3233 + ENCODING 245 3234 + SWIDTH 750 0 3235 + DWIDTH 6 0 3236 + BBX 6 8 0 -1 3237 + BITMAP 3238 + 00 3239 + 00 3240 + 00 3241 + 00 3242 + 00 3243 + 00 3244 + 00 3245 + 00 3246 + ENDCHAR 3247 + STARTCHAR LATIN SMALL LETTER O WITH DIAERESIS 3248 + ENCODING 246 3249 + SWIDTH 750 0 3250 + DWIDTH 6 0 3251 + BBX 6 8 0 -1 3252 + BITMAP 3253 + 00 3254 + 00 3255 + 00 3256 + 00 3257 + 00 3258 + 00 3259 + 00 3260 + 00 3261 + ENDCHAR 3262 + STARTCHAR DIVISION SIGN 3263 + ENCODING 247 3264 + SWIDTH 750 0 3265 + DWIDTH 6 0 3266 + BBX 6 8 0 -1 3267 + BITMAP 3268 + 00 3269 + 00 3270 + 00 3271 + 00 3272 + 00 3273 + 00 3274 + 00 3275 + 00 3276 + ENDCHAR 3277 + STARTCHAR LATIN SMALL LETTER O WITH STROKE 3278 + ENCODING 248 3279 + SWIDTH 750 0 3280 + DWIDTH 6 0 3281 + BBX 6 8 0 -1 3282 + BITMAP 3283 + 00 3284 + 00 3285 + 00 3286 + 00 3287 + 00 3288 + 00 3289 + 00 3290 + 00 3291 + ENDCHAR 3292 + STARTCHAR LATIN SMALL LETTER U WITH GRAVE 3293 + ENCODING 249 3294 + SWIDTH 750 0 3295 + DWIDTH 6 0 3296 + BBX 6 8 0 -1 3297 + BITMAP 3298 + 00 3299 + 00 3300 + 00 3301 + 00 3302 + 00 3303 + 00 3304 + 00 3305 + 00 3306 + ENDCHAR 3307 + STARTCHAR LATIN SMALL LETTER U WITH ACUTE 3308 + ENCODING 250 3309 + SWIDTH 750 0 3310 + DWIDTH 6 0 3311 + BBX 6 8 0 -1 3312 + BITMAP 3313 + 00 3314 + 00 3315 + 00 3316 + 00 3317 + 00 3318 + 00 3319 + 00 3320 + 00 3321 + ENDCHAR 3322 + STARTCHAR LATIN SMALL LETTER U WITH CIRCUMFLEX 3323 + ENCODING 251 3324 + SWIDTH 750 0 3325 + DWIDTH 6 0 3326 + BBX 6 8 0 -1 3327 + BITMAP 3328 + 00 3329 + 00 3330 + 00 3331 + 00 3332 + 00 3333 + 00 3334 + 00 3335 + 00 3336 + ENDCHAR 3337 + STARTCHAR LATIN SMALL LETTER U WITH DIAERESIS 3338 + ENCODING 252 3339 + SWIDTH 750 0 3340 + DWIDTH 6 0 3341 + BBX 6 8 0 -1 3342 + BITMAP 3343 + 00 3344 + 00 3345 + 00 3346 + 00 3347 + 00 3348 + 00 3349 + 00 3350 + 00 3351 + ENDCHAR 3352 + STARTCHAR LATIN SMALL LETTER Y WITH ACUTE 3353 + ENCODING 253 3354 + SWIDTH 750 0 3355 + DWIDTH 6 0 3356 + BBX 6 8 0 -1 3357 + BITMAP 3358 + 70 3359 + 10 3360 + 20 3361 + 70 3362 + 00 3363 + 00 3364 + 00 3365 + 00 3366 + ENDCHAR 3367 + STARTCHAR LATIN SMALL LETTER THORN 3368 + ENCODING 254 3369 + SWIDTH 750 0 3370 + DWIDTH 6 0 3371 + BBX 6 8 0 -1 3372 + BITMAP 3373 + 7C 3374 + 7C 3375 + 7C 3376 + 7C 3377 + 7C 3378 + 00 3379 + 00 3380 + 00 3381 + ENDCHAR 3382 + STARTCHAR LATIN SMALL LETTER Y WITH DIAERESIS 3383 + ENCODING 255 3384 + SWIDTH 750 0 3385 + DWIDTH 6 0 3386 + BBX 6 8 0 -1 3387 + BITMAP 3388 + 00 3389 + 00 3390 + 00 3391 + 00 3392 + 00 3393 + 00 3394 + 00 3395 + 00 3396 + ENDCHAR 3397 + ENDFONT
+224
font/spleen-5x8.hex
··· 1 + 0000:F8D8A8E8D8F8D8F8 2 + 0001:7088D888F8887000 3 + 0002:70F8A8F888F87000 4 + 0003:0050F8F870200000 5 + 0004:002070F870200000 6 + 0005:002070D8D8207000 7 + 0006:002070F8F8207000 8 + 0007:0000207070200000 9 + 0008:7070500050707070 10 + 0009:0000205050200000 11 + 000A:7070502020507070 12 + 000B:0030709090600000 13 + 000C:0020505020702000 14 + 000D:00383820E0C00000 15 + 000E:0038382828500000 16 + 000F:00A870D870A80000 17 + 0010:0040607070604000 18 + 0011:0010307070301000 19 + 0012:0020702070200000 20 + 0013:0050505050005000 21 + 0014:0070D0D050500000 22 + 0015:609060F070906000 23 + 0016:0000000000F8F800 24 + 0017:2070202070207000 25 + 0018:2070202020200000 26 + 0019:2020202070200000 27 + 001A:000020F020000000 28 + 001B:000040F040000000 29 + 001C:00008080F8000000 30 + 001D:000050F850000000 31 + 001E:00002070F8000000 32 + 001F:0000F87020000000 33 + 0020:0000000000000000 34 + 0021:2020202020002000 35 + 0022:5050500000000000 36 + 0023:0050F85050F85000 37 + 0024:2070A0603030E020 38 + 0025:1090A02040509080 39 + 0026:20505060A0906800 40 + 0027:2020200000000000 41 + 0028:1020404040402010 42 + 0029:4020101010102040 43 + 002A:00009060F0609000 44 + 002B:00002020F8202000 45 + 002C:0000000000202040 46 + 002D:00000000F0000000 47 + 002E:0000000000002000 48 + 002F:1010202040408080 49 + 0030:006090B0D0906000 50 + 0031:0020602020207000 51 + 0032:006090106080F000 52 + 0033:0060902010906000 53 + 0034:0080A0A0F0202000 54 + 0035:00F080F01010E000 55 + 0036:006080E090906000 56 + 0037:00F0902020404000 57 + 0038:0060906090906000 58 + 0039:0060909070106000 59 + 003A:0000002000002000 60 + 003B:0000002000202040 61 + 003C:0010204040201000 62 + 003D:000000F000F00000 63 + 003E:0040201010204000 64 + 003F:6090102040004000 65 + 0040:006090B0B0807000 66 + 0041:00609090F0909000 67 + 0042:00E090E09090E000 68 + 0043:0070808080807000 69 + 0044:00E090909090E000 70 + 0045:007080E080807000 71 + 0046:00708080E0808000 72 + 0047:007080B090907000 73 + 0048:009090F090909000 74 + 0049:0070202020207000 75 + 004A:007020202020C000 76 + 004B:009090E090909000 77 + 004C:0080808080807000 78 + 004D:0090F0F090909000 79 + 004E:0090D0D0B0B09000 80 + 004F:0060909090906000 81 + 0050:00E09090E0808000 82 + 0051:0060909090906030 83 + 0052:00E09090E0909000 84 + 0053:007080601010E000 85 + 0054:00F8202020202000 86 + 0055:0090909090907000 87 + 0056:0090909090606000 88 + 0057:00909090F0F09000 89 + 0058:0090906060909000 90 + 0059:009090907010E000 91 + 005A:00F010204080F000 92 + 005B:7040404040404070 93 + 005C:8080404020201010 94 + 005D:7010101010101070 95 + 005E:0020508800000000 96 + 005F:00000000000000F0 97 + 0060:4020000000000000 98 + 0061:0000601070907000 99 + 0062:8080E0909090E000 100 + 0063:0000708080807000 101 + 0064:1010709090907000 102 + 0065:00007090F0807000 103 + 0066:304040E040404000 104 + 0067:00007090906010E0 105 + 0068:8080E09090909000 106 + 0069:0020002020202000 107 + 006A:00200020202020C0 108 + 006B:808090A0C0A09000 109 + 006C:4040404040403000 110 + 006D:000090F0F0909000 111 + 006E:0000E09090909000 112 + 006F:0000609090906000 113 + 0070:0000E09090E08080 114 + 0071:0000709090701010 115 + 0072:0000709080808000 116 + 0073:000070806010E000 117 + 0074:4040E04040403000 118 + 0075:0000909090907000 119 + 0076:0000909090606000 120 + 0077:00009090F0F09000 121 + 0078:0000906060909000 122 + 0079:00009090907010E0 123 + 007A:0000F0102040F000 124 + 007B:304040C0C0404030 125 + 007C:0020202020202000 126 + 007D:C0202030302020C0 127 + 007E:0048B00000000000 128 + 007F:0000000000000000 129 + 00A0:0000000000000000 130 + 00A1:0000000000000000 131 + 00A2:0000000000000000 132 + 00A3:0000000000000000 133 + 00A4:0000000000000000 134 + 00A5:0000000000000000 135 + 00A6:0000000000000000 136 + 00A7:0000000000000000 137 + 00A8:0000000000000000 138 + 00A9:0000000000000000 139 + 00AA:0000000000000000 140 + 00AB:0000000000000000 141 + 00AC:0000000000000000 142 + 00AD:0000000000000000 143 + 00AE:0000000000000000 144 + 00AF:0000000000000000 145 + 00B0:00A800A800A800A8 146 + 00B1:50A850A850A850A8 147 + 00B2:F850F850F850F850 148 + 00B3:2020202020202020 149 + 00B4:20202020E0202020 150 + 00B5:202020E020E02020 151 + 00B6:50505050D0505050 152 + 00B7:00000000F0505050 153 + 00B8:000000E020E02020 154 + 00B9:505050D010D05050 155 + 00BA:5050505050505050 156 + 00BB:000000F010D05050 157 + 00BC:505050D010F00000 158 + 00BD:50505050F0000000 159 + 00BE:202020E020E00000 160 + 00BF:00000000E0202020 161 + 00C0:202020203C000000 162 + 00C1:20202020FC000000 163 + 00C2:00000000FC202020 164 + 00C3:202020203C202020 165 + 00C4:00000000FC000000 166 + 00C5:20202020FC202020 167 + 00C6:2020203C203C2020 168 + 00C7:505050505C505050 169 + 00C8:5050505C407C0000 170 + 00C9:0000007C405C5050 171 + 00CA:505050DC00FC0000 172 + 00CB:000000FC00DC5050 173 + 00CC:5050505C405C5050 174 + 00CD:000000FC00FC0000 175 + 00CE:505050DC00DC5050 176 + 00CF:202020FC00FC0000 177 + 00D0:505050FC00FC0000 178 + 00D1:000000FC00FC2020 179 + 00D2:00000000FC505050 180 + 00D3:50505050FC000000 181 + 00D4:2020203C203C0000 182 + 00D5:0000003C203C2020 183 + 00D6:000000007C505050 184 + 00D7:50505050FC505050 185 + 00D8:202020FC00FC2020 186 + 00D9:20202020E0000000 187 + 00DA:000000003C202020 188 + 00DB:F8F8F8F8F8F8F8F8 189 + 00DC:000000F8F8F8F8F8 190 + 00DD:E0E0E0E0E0E0E0E0 191 + 00DE:3838383838383838 192 + 00DF:F8F8F8F800000000 193 + 00E0:0000000000000000 194 + 00E1:0000000000000000 195 + 00E2:0000000000000000 196 + 00E3:0000000000000000 197 + 00E4:0000000000000000 198 + 00E5:0000000000000000 199 + 00E6:0000000000000000 200 + 00E7:0000000000000000 201 + 00E8:0000000000000000 202 + 00E9:0000000000000000 203 + 00EA:0000000000000000 204 + 00EB:0000000000000000 205 + 00EC:0000000000000000 206 + 00ED:0000000000000000 207 + 00EE:0000000000000000 208 + 00EF:0000000000000000 209 + 00F0:0000000000000000 210 + 00F1:0000000000000000 211 + 00F2:0000000000000000 212 + 00F3:0000000000000000 213 + 00F4:0000000000000000 214 + 00F5:0000000000000000 215 + 00F6:0000000000000000 216 + 00F7:0000000000000000 217 + 00F8:0000000000000000 218 + 00F9:0000000000000000 219 + 00FA:0000000000000000 220 + 00FB:0000000000000000 221 + 00FC:0000000000000000 222 + 00FD:7010207000000000 223 + 00FE:7C7C7C7C7C000000 224 + 00FF:0000000000000000
+256
font/spleen-5x8.inc
··· 1 + .db #0x1f, #0x1b, #0x15, #0x17, #0x1b, #0x1f, #0x1b, #0x1f 2 + .db #0x0e, #0x11, #0x1b, #0x11, #0x1f, #0x11, #0x0e, #0x00 3 + .db #0x0e, #0x1f, #0x15, #0x1f, #0x11, #0x1f, #0x0e, #0x00 4 + .db #0x00, #0x0a, #0x1f, #0x1f, #0x0e, #0x04, #0x00, #0x00 5 + .db #0x00, #0x04, #0x0e, #0x1f, #0x0e, #0x04, #0x00, #0x00 6 + .db #0x00, #0x04, #0x0e, #0x1b, #0x1b, #0x04, #0x0e, #0x00 7 + .db #0x00, #0x04, #0x0e, #0x1f, #0x1f, #0x04, #0x0e, #0x00 8 + .db #0x00, #0x00, #0x04, #0x0e, #0x0e, #0x04, #0x00, #0x00 9 + .db #0x0e, #0x0e, #0x0a, #0x00, #0x0a, #0x0e, #0x0e, #0x0e 10 + .db #0x00, #0x00, #0x04, #0x0a, #0x0a, #0x04, #0x00, #0x00 11 + .db #0x0e, #0x0e, #0x0a, #0x04, #0x04, #0x0a, #0x0e, #0x0e 12 + .db #0x00, #0x0c, #0x0e, #0x09, #0x09, #0x06, #0x00, #0x00 13 + .db #0x00, #0x04, #0x0a, #0x0a, #0x04, #0x0e, #0x04, #0x00 14 + .db #0x00, #0x1c, #0x1c, #0x04, #0x07, #0x03, #0x00, #0x00 15 + .db #0x00, #0x1c, #0x1c, #0x14, #0x14, #0x0a, #0x00, #0x00 16 + .db #0x00, #0x15, #0x0e, #0x1b, #0x0e, #0x15, #0x00, #0x00 17 + .db #0x00, #0x02, #0x06, #0x0e, #0x0e, #0x06, #0x02, #0x00 18 + .db #0x00, #0x08, #0x0c, #0x0e, #0x0e, #0x0c, #0x08, #0x00 19 + .db #0x00, #0x04, #0x0e, #0x04, #0x0e, #0x04, #0x00, #0x00 20 + .db #0x00, #0x0a, #0x0a, #0x0a, #0x0a, #0x00, #0x0a, #0x00 21 + .db #0x00, #0x0e, #0x0b, #0x0b, #0x0a, #0x0a, #0x00, #0x00 22 + .db #0x06, #0x09, #0x06, #0x0f, #0x0e, #0x09, #0x06, #0x00 23 + .db #0x00, #0x00, #0x00, #0x00, #0x00, #0x1f, #0x1f, #0x00 24 + .db #0x04, #0x0e, #0x04, #0x04, #0x0e, #0x04, #0x0e, #0x00 25 + .db #0x04, #0x0e, #0x04, #0x04, #0x04, #0x04, #0x00, #0x00 26 + .db #0x04, #0x04, #0x04, #0x04, #0x0e, #0x04, #0x00, #0x00 27 + .db #0x00, #0x00, #0x04, #0x0f, #0x04, #0x00, #0x00, #0x00 28 + .db #0x00, #0x00, #0x02, #0x0f, #0x02, #0x00, #0x00, #0x00 29 + .db #0x00, #0x00, #0x01, #0x01, #0x1f, #0x00, #0x00, #0x00 30 + .db #0x00, #0x00, #0x0a, #0x1f, #0x0a, #0x00, #0x00, #0x00 31 + .db #0x00, #0x00, #0x04, #0x0e, #0x1f, #0x00, #0x00, #0x00 32 + .db #0x00, #0x00, #0x1f, #0x0e, #0x04, #0x00, #0x00, #0x00 33 + .db #0x00, #0x00, #0x00, #0x00, #0x00, #0x00, #0x00, #0x00 ; 032 - 34 + .db #0x04, #0x04, #0x04, #0x04, #0x04, #0x00, #0x04, #0x00 ; 033 - ! 35 + .db #0x0a, #0x0a, #0x0a, #0x00, #0x00, #0x00, #0x00, #0x00 ; 034 - " 36 + .db #0x00, #0x0a, #0x1f, #0x0a, #0x0a, #0x1f, #0x0a, #0x00 ; 035 - # 37 + .db #0x04, #0x0e, #0x05, #0x06, #0x0c, #0x0c, #0x07, #0x04 ; 036 - $ 38 + .db #0x08, #0x09, #0x05, #0x04, #0x02, #0x0a, #0x09, #0x01 ; 037 - % 39 + .db #0x04, #0x0a, #0x0a, #0x06, #0x05, #0x09, #0x16, #0x00 ; 038 - & 40 + .db #0x04, #0x04, #0x04, #0x00, #0x00, #0x00, #0x00, #0x00 ; 039 - ' 41 + .db #0x08, #0x04, #0x02, #0x02, #0x02, #0x02, #0x04, #0x08 ; 040 - ( 42 + .db #0x02, #0x04, #0x08, #0x08, #0x08, #0x08, #0x04, #0x02 ; 041 - ) 43 + .db #0x00, #0x00, #0x09, #0x06, #0x0f, #0x06, #0x09, #0x00 ; 042 - * 44 + .db #0x00, #0x00, #0x04, #0x04, #0x1f, #0x04, #0x04, #0x00 ; 043 - + 45 + .db #0x00, #0x00, #0x00, #0x00, #0x00, #0x04, #0x04, #0x02 ; 044 - , 46 + .db #0x00, #0x00, #0x00, #0x00, #0x0f, #0x00, #0x00, #0x00 ; 045 - - 47 + .db #0x00, #0x00, #0x00, #0x00, #0x00, #0x00, #0x04, #0x00 ; 046 - . 48 + .db #0x08, #0x08, #0x04, #0x04, #0x02, #0x02, #0x01, #0x01 ; 047 - / 49 + .db #0x00, #0x06, #0x09, #0x0d, #0x0b, #0x09, #0x06, #0x00 ; 048 - 0 50 + .db #0x00, #0x04, #0x06, #0x04, #0x04, #0x04, #0x0e, #0x00 ; 049 - 1 51 + .db #0x00, #0x06, #0x09, #0x08, #0x06, #0x01, #0x0f, #0x00 ; 050 - 2 52 + .db #0x00, #0x06, #0x09, #0x04, #0x08, #0x09, #0x06, #0x00 ; 051 - 3 53 + .db #0x00, #0x01, #0x05, #0x05, #0x0f, #0x04, #0x04, #0x00 ; 052 - 4 54 + .db #0x00, #0x0f, #0x01, #0x0f, #0x08, #0x08, #0x07, #0x00 ; 053 - 5 55 + .db #0x00, #0x06, #0x01, #0x07, #0x09, #0x09, #0x06, #0x00 ; 054 - 6 56 + .db #0x00, #0x0f, #0x09, #0x04, #0x04, #0x02, #0x02, #0x00 ; 055 - 7 57 + .db #0x00, #0x06, #0x09, #0x06, #0x09, #0x09, #0x06, #0x00 ; 056 - 8 58 + .db #0x00, #0x06, #0x09, #0x09, #0x0e, #0x08, #0x06, #0x00 ; 057 - 9 59 + .db #0x00, #0x00, #0x00, #0x04, #0x00, #0x00, #0x04, #0x00 ; 058 - : 60 + .db #0x00, #0x00, #0x00, #0x04, #0x00, #0x04, #0x04, #0x02 ; 059 - ; 61 + .db #0x00, #0x08, #0x04, #0x02, #0x02, #0x04, #0x08, #0x00 ; 060 - < 62 + .db #0x00, #0x00, #0x00, #0x0f, #0x00, #0x0f, #0x00, #0x00 ; 061 - = 63 + .db #0x00, #0x02, #0x04, #0x08, #0x08, #0x04, #0x02, #0x00 ; 062 - > 64 + .db #0x06, #0x09, #0x08, #0x04, #0x02, #0x00, #0x02, #0x00 ; 063 - ? 65 + .db #0x00, #0x06, #0x09, #0x0d, #0x0d, #0x01, #0x0e, #0x00 ; 064 - @ 66 + .db #0x00, #0x06, #0x09, #0x09, #0x0f, #0x09, #0x09, #0x00 ; 065 - A 67 + .db #0x00, #0x07, #0x09, #0x07, #0x09, #0x09, #0x07, #0x00 ; 066 - B 68 + .db #0x00, #0x0e, #0x01, #0x01, #0x01, #0x01, #0x0e, #0x00 ; 067 - C 69 + .db #0x00, #0x07, #0x09, #0x09, #0x09, #0x09, #0x07, #0x00 ; 068 - D 70 + .db #0x00, #0x0e, #0x01, #0x07, #0x01, #0x01, #0x0e, #0x00 ; 069 - E 71 + .db #0x00, #0x0e, #0x01, #0x01, #0x07, #0x01, #0x01, #0x00 ; 070 - F 72 + .db #0x00, #0x0e, #0x01, #0x0d, #0x09, #0x09, #0x0e, #0x00 ; 071 - G 73 + .db #0x00, #0x09, #0x09, #0x0f, #0x09, #0x09, #0x09, #0x00 ; 072 - H 74 + .db #0x00, #0x0e, #0x04, #0x04, #0x04, #0x04, #0x0e, #0x00 ; 073 - I 75 + .db #0x00, #0x0e, #0x04, #0x04, #0x04, #0x04, #0x03, #0x00 ; 074 - J 76 + .db #0x00, #0x09, #0x09, #0x07, #0x09, #0x09, #0x09, #0x00 ; 075 - K 77 + .db #0x00, #0x01, #0x01, #0x01, #0x01, #0x01, #0x0e, #0x00 ; 076 - L 78 + .db #0x00, #0x09, #0x0f, #0x0f, #0x09, #0x09, #0x09, #0x00 ; 077 - M 79 + .db #0x00, #0x09, #0x0b, #0x0b, #0x0d, #0x0d, #0x09, #0x00 ; 078 - N 80 + .db #0x00, #0x06, #0x09, #0x09, #0x09, #0x09, #0x06, #0x00 ; 079 - O 81 + .db #0x00, #0x07, #0x09, #0x09, #0x07, #0x01, #0x01, #0x00 ; 080 - P 82 + .db #0x00, #0x06, #0x09, #0x09, #0x09, #0x09, #0x06, #0x0c ; 081 - Q 83 + .db #0x00, #0x07, #0x09, #0x09, #0x07, #0x09, #0x09, #0x00 ; 082 - R 84 + .db #0x00, #0x0e, #0x01, #0x06, #0x08, #0x08, #0x07, #0x00 ; 083 - S 85 + .db #0x00, #0x1f, #0x04, #0x04, #0x04, #0x04, #0x04, #0x00 ; 084 - T 86 + .db #0x00, #0x09, #0x09, #0x09, #0x09, #0x09, #0x0e, #0x00 ; 085 - U 87 + .db #0x00, #0x09, #0x09, #0x09, #0x09, #0x06, #0x06, #0x00 ; 086 - V 88 + .db #0x00, #0x09, #0x09, #0x09, #0x0f, #0x0f, #0x09, #0x00 ; 087 - W 89 + .db #0x00, #0x09, #0x09, #0x06, #0x06, #0x09, #0x09, #0x00 ; 088 - X 90 + .db #0x00, #0x09, #0x09, #0x09, #0x0e, #0x08, #0x07, #0x00 ; 089 - Y 91 + .db #0x00, #0x0f, #0x08, #0x04, #0x02, #0x01, #0x0f, #0x00 ; 090 - Z 92 + .db #0x0e, #0x02, #0x02, #0x02, #0x02, #0x02, #0x02, #0x0e ; 091 - [ 93 + .db #0x01, #0x01, #0x02, #0x02, #0x04, #0x04, #0x08, #0x08 ; 092 - \ 94 + .db #0x0e, #0x08, #0x08, #0x08, #0x08, #0x08, #0x08, #0x0e ; 093 - ] 95 + .db #0x00, #0x04, #0x0a, #0x11, #0x00, #0x00, #0x00, #0x00 ; 094 - ^ 96 + .db #0x00, #0x00, #0x00, #0x00, #0x00, #0x00, #0x00, #0x0f ; 095 - _ 97 + .db #0x02, #0x04, #0x00, #0x00, #0x00, #0x00, #0x00, #0x00 ; 096 - ` 98 + .db #0x00, #0x00, #0x06, #0x08, #0x0e, #0x09, #0x0e, #0x00 ; 097 - a 99 + .db #0x01, #0x01, #0x07, #0x09, #0x09, #0x09, #0x07, #0x00 ; 098 - b 100 + .db #0x00, #0x00, #0x0e, #0x01, #0x01, #0x01, #0x0e, #0x00 ; 099 - c 101 + .db #0x08, #0x08, #0x0e, #0x09, #0x09, #0x09, #0x0e, #0x00 ; 100 - d 102 + .db #0x00, #0x00, #0x0e, #0x09, #0x0f, #0x01, #0x0e, #0x00 ; 101 - e 103 + .db #0x0c, #0x02, #0x02, #0x07, #0x02, #0x02, #0x02, #0x00 ; 102 - f 104 + .db #0x00, #0x00, #0x0e, #0x09, #0x09, #0x06, #0x08, #0x07 ; 103 - g 105 + .db #0x01, #0x01, #0x07, #0x09, #0x09, #0x09, #0x09, #0x00 ; 104 - h 106 + .db #0x00, #0x04, #0x00, #0x04, #0x04, #0x04, #0x04, #0x00 ; 105 - i 107 + .db #0x00, #0x04, #0x00, #0x04, #0x04, #0x04, #0x04, #0x03 ; 106 - j 108 + .db #0x01, #0x01, #0x09, #0x05, #0x03, #0x05, #0x09, #0x00 ; 107 - k 109 + .db #0x02, #0x02, #0x02, #0x02, #0x02, #0x02, #0x0c, #0x00 ; 108 - l 110 + .db #0x00, #0x00, #0x09, #0x0f, #0x0f, #0x09, #0x09, #0x00 ; 109 - m 111 + .db #0x00, #0x00, #0x07, #0x09, #0x09, #0x09, #0x09, #0x00 ; 110 - n 112 + .db #0x00, #0x00, #0x06, #0x09, #0x09, #0x09, #0x06, #0x00 ; 111 - o 113 + .db #0x00, #0x00, #0x07, #0x09, #0x09, #0x07, #0x01, #0x01 ; 112 - p 114 + .db #0x00, #0x00, #0x0e, #0x09, #0x09, #0x0e, #0x08, #0x08 ; 113 - q 115 + .db #0x00, #0x00, #0x0e, #0x09, #0x01, #0x01, #0x01, #0x00 ; 114 - r 116 + .db #0x00, #0x00, #0x0e, #0x01, #0x06, #0x08, #0x07, #0x00 ; 115 - s 117 + .db #0x02, #0x02, #0x07, #0x02, #0x02, #0x02, #0x0c, #0x00 ; 116 - t 118 + .db #0x00, #0x00, #0x09, #0x09, #0x09, #0x09, #0x0e, #0x00 ; 117 - u 119 + .db #0x00, #0x00, #0x09, #0x09, #0x09, #0x06, #0x06, #0x00 ; 118 - v 120 + .db #0x00, #0x00, #0x09, #0x09, #0x0f, #0x0f, #0x09, #0x00 ; 119 - w 121 + .db #0x00, #0x00, #0x09, #0x06, #0x06, #0x09, #0x09, #0x00 ; 120 - x 122 + .db #0x00, #0x00, #0x09, #0x09, #0x09, #0x0e, #0x08, #0x07 ; 121 - y 123 + .db #0x00, #0x00, #0x0f, #0x08, #0x04, #0x02, #0x0f, #0x00 ; 122 - z 124 + .db #0x0c, #0x02, #0x02, #0x03, #0x03, #0x02, #0x02, #0x0c ; 123 - { 125 + .db #0x00, #0x04, #0x04, #0x04, #0x04, #0x04, #0x04, #0x00 ; 124 - | 126 + .db #0x03, #0x04, #0x04, #0x0c, #0x0c, #0x04, #0x04, #0x03 ; 125 - } 127 + .db #0x00, #0x12, #0x0d, #0x00, #0x00, #0x00, #0x00, #0x00 ; 126 - ~ 128 + .db #0x00, #0x00, #0x00, #0x00, #0x00, #0x00, #0x00, #0x00 129 + .db #0x00, #0x00, #0x00, #0x00, #0x00, #0x00, #0x00, #0x00 130 + .db #0x00, #0x00, #0x00, #0x00, #0x00, #0x00, #0x00, #0x00 131 + .db #0x00, #0x00, #0x00, #0x00, #0x00, #0x00, #0x00, #0x00 132 + .db #0x00, #0x00, #0x00, #0x00, #0x00, #0x00, #0x00, #0x00 133 + .db #0x00, #0x00, #0x00, #0x00, #0x00, #0x00, #0x00, #0x00 134 + .db #0x00, #0x00, #0x00, #0x00, #0x00, #0x00, #0x00, #0x00 135 + .db #0x00, #0x00, #0x00, #0x00, #0x00, #0x00, #0x00, #0x00 136 + .db #0x00, #0x00, #0x00, #0x00, #0x00, #0x00, #0x00, #0x00 137 + .db #0x00, #0x00, #0x00, #0x00, #0x00, #0x00, #0x00, #0x00 138 + .db #0x00, #0x00, #0x00, #0x00, #0x00, #0x00, #0x00, #0x00 139 + .db #0x00, #0x00, #0x00, #0x00, #0x00, #0x00, #0x00, #0x00 140 + .db #0x00, #0x00, #0x00, #0x00, #0x00, #0x00, #0x00, #0x00 141 + .db #0x00, #0x00, #0x00, #0x00, #0x00, #0x00, #0x00, #0x00 142 + .db #0x00, #0x00, #0x00, #0x00, #0x00, #0x00, #0x00, #0x00 143 + .db #0x00, #0x00, #0x00, #0x00, #0x00, #0x00, #0x00, #0x00 144 + .db #0x00, #0x00, #0x00, #0x00, #0x00, #0x00, #0x00, #0x00 145 + .db #0x00, #0x00, #0x00, #0x00, #0x00, #0x00, #0x00, #0x00 146 + .db #0x00, #0x00, #0x00, #0x00, #0x00, #0x00, #0x00, #0x00 147 + .db #0x00, #0x00, #0x00, #0x00, #0x00, #0x00, #0x00, #0x00 148 + .db #0x00, #0x00, #0x00, #0x00, #0x00, #0x00, #0x00, #0x00 149 + .db #0x00, #0x00, #0x00, #0x00, #0x00, #0x00, #0x00, #0x00 150 + .db #0x00, #0x00, #0x00, #0x00, #0x00, #0x00, #0x00, #0x00 151 + .db #0x00, #0x00, #0x00, #0x00, #0x00, #0x00, #0x00, #0x00 152 + .db #0x00, #0x00, #0x00, #0x00, #0x00, #0x00, #0x00, #0x00 153 + .db #0x00, #0x00, #0x00, #0x00, #0x00, #0x00, #0x00, #0x00 154 + .db #0x00, #0x00, #0x00, #0x00, #0x00, #0x00, #0x00, #0x00 155 + .db #0x00, #0x00, #0x00, #0x00, #0x00, #0x00, #0x00, #0x00 156 + .db #0x00, #0x00, #0x00, #0x00, #0x00, #0x00, #0x00, #0x00 157 + .db #0x00, #0x00, #0x00, #0x00, #0x00, #0x00, #0x00, #0x00 158 + .db #0x00, #0x00, #0x00, #0x00, #0x00, #0x00, #0x00, #0x00 159 + .db #0x00, #0x00, #0x00, #0x00, #0x00, #0x00, #0x00, #0x00 160 + .db #0x00, #0x00, #0x00, #0x00, #0x00, #0x00, #0x00, #0x00 161 + .db #0x00, #0x00, #0x00, #0x00, #0x00, #0x00, #0x00, #0x00 162 + .db #0x00, #0x00, #0x00, #0x00, #0x00, #0x00, #0x00, #0x00 163 + .db #0x00, #0x00, #0x00, #0x00, #0x00, #0x00, #0x00, #0x00 164 + .db #0x00, #0x00, #0x00, #0x00, #0x00, #0x00, #0x00, #0x00 165 + .db #0x00, #0x00, #0x00, #0x00, #0x00, #0x00, #0x00, #0x00 166 + .db #0x00, #0x00, #0x00, #0x00, #0x00, #0x00, #0x00, #0x00 167 + .db #0x00, #0x00, #0x00, #0x00, #0x00, #0x00, #0x00, #0x00 168 + .db #0x00, #0x00, #0x00, #0x00, #0x00, #0x00, #0x00, #0x00 169 + .db #0x00, #0x00, #0x00, #0x00, #0x00, #0x00, #0x00, #0x00 170 + .db #0x00, #0x00, #0x00, #0x00, #0x00, #0x00, #0x00, #0x00 171 + .db #0x00, #0x00, #0x00, #0x00, #0x00, #0x00, #0x00, #0x00 172 + .db #0x00, #0x00, #0x00, #0x00, #0x00, #0x00, #0x00, #0x00 173 + .db #0x00, #0x00, #0x00, #0x00, #0x00, #0x00, #0x00, #0x00 174 + .db #0x00, #0x00, #0x00, #0x00, #0x00, #0x00, #0x00, #0x00 175 + .db #0x00, #0x00, #0x00, #0x00, #0x00, #0x00, #0x00, #0x00 176 + .db #0x00, #0x00, #0x00, #0x00, #0x00, #0x00, #0x00, #0x00 177 + .db #0x00, #0x15, #0x00, #0x15, #0x00, #0x15, #0x00, #0x15 178 + .db #0x0a, #0x15, #0x0a, #0x15, #0x0a, #0x15, #0x0a, #0x15 179 + .db #0x1f, #0x0a, #0x1f, #0x0a, #0x1f, #0x0a, #0x1f, #0x0a 180 + .db #0x04, #0x04, #0x04, #0x04, #0x04, #0x04, #0x04, #0x04 181 + .db #0x04, #0x04, #0x04, #0x04, #0x07, #0x04, #0x04, #0x04 182 + .db #0x04, #0x04, #0x04, #0x07, #0x04, #0x07, #0x04, #0x04 183 + .db #0x0a, #0x0a, #0x0a, #0x0a, #0x0b, #0x0a, #0x0a, #0x0a 184 + .db #0x00, #0x00, #0x00, #0x00, #0x0f, #0x0a, #0x0a, #0x0a 185 + .db #0x00, #0x00, #0x00, #0x07, #0x04, #0x07, #0x04, #0x04 186 + .db #0x0a, #0x0a, #0x0a, #0x0b, #0x08, #0x0b, #0x0a, #0x0a 187 + .db #0x0a, #0x0a, #0x0a, #0x0a, #0x0a, #0x0a, #0x0a, #0x0a 188 + .db #0x00, #0x00, #0x00, #0x0f, #0x08, #0x0b, #0x0a, #0x0a 189 + .db #0x0a, #0x0a, #0x0a, #0x0b, #0x08, #0x0f, #0x00, #0x00 190 + .db #0x0a, #0x0a, #0x0a, #0x0a, #0x0f, #0x00, #0x00, #0x00 191 + .db #0x04, #0x04, #0x04, #0x07, #0x04, #0x07, #0x00, #0x00 192 + .db #0x00, #0x00, #0x00, #0x00, #0x07, #0x04, #0x04, #0x04 193 + .db #0x04, #0x04, #0x04, #0x04, #0x3c, #0x00, #0x00, #0x00 194 + .db #0x04, #0x04, #0x04, #0x04, #0x3f, #0x00, #0x00, #0x00 195 + .db #0x00, #0x00, #0x00, #0x00, #0x3f, #0x04, #0x04, #0x04 196 + .db #0x04, #0x04, #0x04, #0x04, #0x3c, #0x04, #0x04, #0x04 197 + .db #0x00, #0x00, #0x00, #0x00, #0x3f, #0x00, #0x00, #0x00 198 + .db #0x04, #0x04, #0x04, #0x04, #0x3f, #0x04, #0x04, #0x04 199 + .db #0x04, #0x04, #0x04, #0x3c, #0x04, #0x3c, #0x04, #0x04 200 + .db #0x0a, #0x0a, #0x0a, #0x0a, #0x3a, #0x0a, #0x0a, #0x0a 201 + .db #0x0a, #0x0a, #0x0a, #0x3a, #0x02, #0x3e, #0x00, #0x00 202 + .db #0x00, #0x00, #0x00, #0x3e, #0x02, #0x3a, #0x0a, #0x0a 203 + .db #0x0a, #0x0a, #0x0a, #0x3b, #0x00, #0x3f, #0x00, #0x00 204 + .db #0x00, #0x00, #0x00, #0x3f, #0x00, #0x3b, #0x0a, #0x0a 205 + .db #0x0a, #0x0a, #0x0a, #0x3a, #0x02, #0x3a, #0x0a, #0x0a 206 + .db #0x00, #0x00, #0x00, #0x3f, #0x00, #0x3f, #0x00, #0x00 207 + .db #0x0a, #0x0a, #0x0a, #0x3b, #0x00, #0x3b, #0x0a, #0x0a 208 + .db #0x04, #0x04, #0x04, #0x3f, #0x00, #0x3f, #0x00, #0x00 209 + .db #0x0a, #0x0a, #0x0a, #0x3f, #0x00, #0x3f, #0x00, #0x00 210 + .db #0x00, #0x00, #0x00, #0x3f, #0x00, #0x3f, #0x04, #0x04 211 + .db #0x00, #0x00, #0x00, #0x00, #0x3f, #0x0a, #0x0a, #0x0a 212 + .db #0x0a, #0x0a, #0x0a, #0x0a, #0x3f, #0x00, #0x00, #0x00 213 + .db #0x04, #0x04, #0x04, #0x3c, #0x04, #0x3c, #0x00, #0x00 214 + .db #0x00, #0x00, #0x00, #0x3c, #0x04, #0x3c, #0x04, #0x04 215 + .db #0x00, #0x00, #0x00, #0x00, #0x3e, #0x0a, #0x0a, #0x0a 216 + .db #0x0a, #0x0a, #0x0a, #0x0a, #0x3f, #0x0a, #0x0a, #0x0a 217 + .db #0x04, #0x04, #0x04, #0x3f, #0x00, #0x3f, #0x04, #0x04 218 + .db #0x04, #0x04, #0x04, #0x04, #0x07, #0x00, #0x00, #0x00 219 + .db #0x00, #0x00, #0x00, #0x00, #0x3c, #0x04, #0x04, #0x04 220 + .db #0x1f, #0x1f, #0x1f, #0x1f, #0x1f, #0x1f, #0x1f, #0x1f 221 + .db #0x00, #0x00, #0x00, #0x1f, #0x1f, #0x1f, #0x1f, #0x1f 222 + .db #0x07, #0x07, #0x07, #0x07, #0x07, #0x07, #0x07, #0x07 223 + .db #0x1c, #0x1c, #0x1c, #0x1c, #0x1c, #0x1c, #0x1c, #0x1c 224 + .db #0x1f, #0x1f, #0x1f, #0x1f, #0x00, #0x00, #0x00, #0x00 225 + .db #0x00, #0x00, #0x00, #0x00, #0x00, #0x00, #0x00, #0x00 226 + .db #0x00, #0x00, #0x00, #0x00, #0x00, #0x00, #0x00, #0x00 227 + .db #0x00, #0x00, #0x00, #0x00, #0x00, #0x00, #0x00, #0x00 228 + .db #0x00, #0x00, #0x00, #0x00, #0x00, #0x00, #0x00, #0x00 229 + .db #0x00, #0x00, #0x00, #0x00, #0x00, #0x00, #0x00, #0x00 230 + .db #0x00, #0x00, #0x00, #0x00, #0x00, #0x00, #0x00, #0x00 231 + .db #0x00, #0x00, #0x00, #0x00, #0x00, #0x00, #0x00, #0x00 232 + .db #0x00, #0x00, #0x00, #0x00, #0x00, #0x00, #0x00, #0x00 233 + .db #0x00, #0x00, #0x00, #0x00, #0x00, #0x00, #0x00, #0x00 234 + .db #0x00, #0x00, #0x00, #0x00, #0x00, #0x00, #0x00, #0x00 235 + .db #0x00, #0x00, #0x00, #0x00, #0x00, #0x00, #0x00, #0x00 236 + .db #0x00, #0x00, #0x00, #0x00, #0x00, #0x00, #0x00, #0x00 237 + .db #0x00, #0x00, #0x00, #0x00, #0x00, #0x00, #0x00, #0x00 238 + .db #0x00, #0x00, #0x00, #0x00, #0x00, #0x00, #0x00, #0x00 239 + .db #0x00, #0x00, #0x00, #0x00, #0x00, #0x00, #0x00, #0x00 240 + .db #0x00, #0x00, #0x00, #0x00, #0x00, #0x00, #0x00, #0x00 241 + .db #0x00, #0x00, #0x00, #0x00, #0x00, #0x00, #0x00, #0x00 242 + .db #0x00, #0x00, #0x00, #0x00, #0x00, #0x00, #0x00, #0x00 243 + .db #0x00, #0x00, #0x00, #0x00, #0x00, #0x00, #0x00, #0x00 244 + .db #0x00, #0x00, #0x00, #0x00, #0x00, #0x00, #0x00, #0x00 245 + .db #0x00, #0x00, #0x00, #0x00, #0x00, #0x00, #0x00, #0x00 246 + .db #0x00, #0x00, #0x00, #0x00, #0x00, #0x00, #0x00, #0x00 247 + .db #0x00, #0x00, #0x00, #0x00, #0x00, #0x00, #0x00, #0x00 248 + .db #0x00, #0x00, #0x00, #0x00, #0x00, #0x00, #0x00, #0x00 249 + .db #0x00, #0x00, #0x00, #0x00, #0x00, #0x00, #0x00, #0x00 250 + .db #0x00, #0x00, #0x00, #0x00, #0x00, #0x00, #0x00, #0x00 251 + .db #0x00, #0x00, #0x00, #0x00, #0x00, #0x00, #0x00, #0x00 252 + .db #0x00, #0x00, #0x00, #0x00, #0x00, #0x00, #0x00, #0x00 253 + .db #0x00, #0x00, #0x00, #0x00, #0x00, #0x00, #0x00, #0x00 254 + .db #0x0e, #0x08, #0x04, #0x0e, #0x00, #0x00, #0x00, #0x00 255 + .db #0x3e, #0x3e, #0x3e, #0x3e, #0x3e, #0x00, #0x00, #0x00 256 + .db #0x00, #0x00, #0x00, #0x00, #0x00, #0x00, #0x00, #0x00
+156
getchar.s
··· 1 + ; vim:syntax=z8a:ts=8 2 + ; 3 + ; getchar and other keyboard routines 4 + ; msTERM 5 + ; 6 + ; Copyright (c) 2019 joshua stein <jcs@jcs.org> 7 + ; 8 + ; Permission to use, copy, modify, and distribute this software for any 9 + ; purpose with or without fee is hereby granted, provided that the above 10 + ; copyright notice and this permission notice appear in all copies. 11 + ; 12 + ; THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 13 + ; WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 14 + ; MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 15 + ; ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 16 + ; WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 17 + ; ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 18 + ; OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 19 + ; 20 + 21 + .module getchar 22 + 23 + .include "mailstation.inc" 24 + .globl _lptrecv 25 + 26 + .area _DATA 27 + 28 + ; scancode_table holds three tables of ascii characters which 29 + ; '_getchar' uses to determine which character to return, depending on 30 + ; the scancode pressed and the state of the shift and caps lock keys. 31 + .include "scancodes.inc" 32 + 33 + .area _BSS 34 + 35 + keyboardbuffer: 36 + .ds 2 ; scancode buffer for _getchar 37 + capslock: 38 + .db #0 39 + 40 + .area _CODE 41 + 42 + ; unsigned char peekkey(void) 43 + ; check for a scancode using the firmware, then look it up in the scancode 44 + ; table (respecting the shift key and caps lock as control) and return the 45 + ; ascii value of the key in the l register 46 + _peekkey:: 47 + ld de, #keyboardbuffer 48 + push de 49 + call get_keycode_from_buffer 50 + pop de 51 + ld a, (keyboardbuffer) ; check for caps lock first 52 + cp #0x60 53 + jr z, is_caps_lock 54 + jr not_caps_lock 55 + is_caps_lock: 56 + ld a, (keyboardbuffer + 1) ; check flags 57 + bit 0, a ; set=pressed, reset=released 58 + jp nz, caps_down 59 + ld a, #0 ; caps lock released 60 + ld (capslock), a 61 + jr nokey 62 + caps_down: 63 + ld a, #1 64 + ld (capslock), a 65 + jr nokey 66 + not_caps_lock: 67 + ld a, (keyboardbuffer + 1) ; check flags 68 + bit 0, a ; set=pressed, reset=released 69 + jp z, nokey ; key was released, bail 70 + bit 6, a ; when set, shift was held down 71 + jr z, lowercase 72 + capital: 73 + ld hl, #scancode_table_uppercase 74 + jr char_offset 75 + lowercase: 76 + ld a, (capslock) 77 + cp #1 78 + jr z, as_control 79 + ld hl, #scancode_table 80 + jr char_offset 81 + as_control: 82 + ld hl, #scancode_table_control 83 + jr char_offset 84 + char_offset: 85 + push hl 86 + ld hl, #50 87 + push hl 88 + call _delay 89 + pop hl 90 + pop hl 91 + ld a, (keyboardbuffer) 92 + ld b, #0 93 + ld c, a 94 + add hl, bc 95 + ld a, (hl) 96 + ld h, #0 97 + ld l, a 98 + ret 99 + nokey: 100 + ld h, #0 101 + ld l, #0 102 + ret 103 + 104 + 105 + ; unsigned char getkey(void) 106 + ; peekkey() but loops until a key is available 107 + _getkey:: 108 + call _peekkey 109 + ld a, l 110 + cp #0 111 + jp z, _getkey 112 + ret 113 + 114 + 115 + ; int getchar(void) 116 + ; uses _getkey and filters out non-printables, returns in l register 117 + _getchar:: 118 + call _getkey 119 + ld a, l 120 + cp a, #META_KEY_BEGIN 121 + jr nc, _getchar ; a >= 122 + ret 123 + 124 + 125 + ; int getkeyorlpt(void) 126 + ; alternate calls to peekkey() and lptrecv() to get a byte from whichever 127 + ; comes first 128 + ; h=1 is for keyboard input, h=2 is for lpt input, h=0 for nothing 129 + _getkeyorlpt:: 130 + call _peekkey2 131 + ld a, l 132 + cp #0 133 + jr z, trylpt 134 + ld h, #1 135 + ret 136 + trylpt: 137 + call _lptrecv 138 + ld h, #0 139 + cp #1 140 + jr z, _getkeyorlpt 141 + ld h, #2 142 + ret 143 + 144 + ; peekkey() with some looping 145 + _peekkey2:: 146 + ld b, #0xff 147 + peekkey2loop: 148 + push bc 149 + call _peekkey 150 + pop bc 151 + ld a, l 152 + cp #0 153 + jr nz, peekkey2out ; loop until a key is available 154 + djnz peekkey2loop 155 + peekkey2out: 156 + ret
+122
isr.s
··· 1 + ; vim:syntax=z8a:ts=8 2 + ; 3 + ; interrupt service routine 4 + ; msTERM 5 + ; 6 + ; Copyright (c) 2019 joshua stein <jcs@jcs.org> 7 + ; 8 + ; Permission to use, copy, modify, and distribute this software for any 9 + ; purpose with or without fee is hereby granted, provided that the above 10 + ; copyright notice and this permission notice appear in all copies. 11 + ; 12 + ; THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 13 + ; WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 14 + ; MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 15 + ; ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 16 + ; WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 17 + ; ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 18 + ; OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 19 + ; 20 + 21 + .module isr 22 + 23 + .include "mailstation.inc" 24 + .globl _modem_isr 25 + 26 + .area _CODE 27 + 28 + ; we're going to put 0xf7 at 0xf800 - 0xf8ff and then put 0xf8 in the 29 + ; 'i' register. when an interrupt happens in interrupt mode 2, some 30 + ; garbage will be on the bus and form an address 0xf800+garbage. 31 + ; the cpu will then read that address+1 which we know will contain 32 + ; 0xf7f7, and then jump to 0xf7f7, which we contain our own code, 33 + ; which will just be a 'jp isr' to our real ISR 34 + 35 + .equ isrjump, #0xf7 36 + .equ isrjumptable, #0xf800 37 + 38 + patch_isr:: 39 + di 40 + 41 + ; spray isrjump from isrjumptable to (isrjumptable + 0xff + 1) 42 + ld hl, #isrjumptable 43 + ld a, #isrjump 44 + ld (hl), a 45 + ld de, #isrjumptable + 1 46 + ld bc, #0x0100 47 + ldir ; ld (de), (hl); dec bc until 0 48 + 49 + ; put our jump at isrjump+isrjump 50 + ld h, #isrjump 51 + ld l, #isrjump 52 + ld (hl), #0xc3 ; jp 53 + inc hl 54 + ex de, hl 55 + ld hl, #isr 56 + ld a, h 57 + ld b, l 58 + ex de, hl 59 + ld (hl), b ; lower address of isr 60 + inc hl 61 + ld (hl), a ; upper address of isr 62 + 63 + ld hl, #isrjumptable 64 + ld a, h 65 + ld i, a ; interrupts will now be #0xf800 + rand 66 + im 2 ; enable interrupt mode 2 67 + 68 + xor a ; clear interrupt mask 69 + set 7, a ; allow interrupt 7 for power button 70 + set 6, a ; and 6 for modem 71 + set 2, a ; and 2 for keyboard 72 + set 1, a ; and 1 for keyboard 73 + ld (p3shadow), a ; store this mask in p3shadow 74 + out (0x3), a 75 + ei ; here we go! 76 + ret 77 + 78 + isr: 79 + push af 80 + push bc 81 + push de 82 + push hl 83 + push ix 84 + push iy 85 + in a, (0x3) 86 + bit 7, a ; power button 87 + jp nz, 0x1940 88 + bit 6, a ; modem 89 + jp nz, isr_6 90 + in a, (0x3) ; why read again? factory isr does 91 + bit 1, a ; keyboard scan, 64hz 92 + jp nz, 0x18d4 ; use factory handler 93 + bit 2, a ; keyboard when button pressed 94 + jp nz, 0x18e7 ; use factory handler 95 + xor a ; any other interrupt, just ignore 96 + out (0x3), a 97 + jp isrout 98 + isr_7: 99 + ld a, (p3shadow) 100 + res 7, a 101 + out (0x3), a ; reset interrupt 102 + ld a, (p3shadow) 103 + out (0x3), a ; set mask back to p3shadow 104 + call 0x3b19 ; default handler 105 + jp isrout 106 + isr_6: 107 + ld a, (p3shadow) 108 + res 6, a 109 + out (0x3), a ; reset interrupt 110 + ld a, (p3shadow) 111 + out (0x3), a ; set mask back to p3shadow 112 + call _modem_isr 113 + jp isrout 114 + isrout: 115 + pop iy 116 + pop ix 117 + pop hl 118 + pop de 119 + pop bc 120 + pop af 121 + ei 122 + reti
+239
lpt.s
··· 1 + ; vim:syntax=z8a:ts=8 2 + ; 3 + ; parallel port routines 4 + ; msTERM 5 + ; 6 + ; Copyright (c) 2019 joshua stein <jcs@jcs.org> 7 + ; 8 + ; Permission to use, copy, modify, and distribute this software for any 9 + ; purpose with or without fee is hereby granted, provided that the above 10 + ; copyright notice and this permission notice appear in all copies. 11 + ; 12 + ; THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 13 + ; WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 14 + ; MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 15 + ; ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 16 + ; WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 17 + ; ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 18 + ; OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 19 + ; 20 + 21 + .module lpt 22 + 23 + .include "mailstation.inc" 24 + 25 + .equ CONTROL, #0x2c 26 + .equ DATA, #0x2d 27 + .equ STATUS, #0x21 28 + 29 + .equ LPT_BUSY_IN, #0x40 30 + .equ LPT_BUSY_OUT, #0x08 31 + .equ LPT_STROBE_IN, #0x80 32 + .equ LPT_STROBE_OUT, #0x10 33 + .equ LPT_TRIB_MASK, #0x07 34 + .equ LPT_DIB_MASK, #0x03 35 + 36 + .area _CODE 37 + 38 + ; receive a tribble byte from host, return h=1 l=0 on error, else h=0, l=(byte) 39 + lptrecv_tribble: 40 + push bc 41 + ld hl, #0 ; h will contain error, l result 42 + xor a 43 + out (DATA), a ; drop busy/ack, wait for strobe 44 + ld b, #0xff ; try a bunch before bailing 45 + wait_for_strobe: 46 + in a, (STATUS) 47 + and #LPT_STROBE_IN ; inb(STATUS) & stbin 48 + jr nz, got_strobe 49 + jr wait_for_strobe 50 + strobe_failed: 51 + ld h, #1 52 + ld l, #0 53 + jr lptrecv_tribble_out 54 + got_strobe: 55 + in a, (STATUS) 56 + sra a 57 + sra a 58 + sra a 59 + and #LPT_TRIB_MASK ; & tribmask 60 + ld l, a 61 + ld a, #LPT_BUSY_OUT ; raise busy/ack 62 + out (DATA), a 63 + ld b, #0xff ; retry 255 times 64 + wait_for_unstrobe: 65 + in a, (STATUS) 66 + and #LPT_STROBE_IN ; inb(STATUS) & stbin 67 + jr z, lptrecv_tribble_out 68 + jr wait_for_unstrobe 69 + ; if we never get unstrobe, that's ok 70 + lptrecv_tribble_out: 71 + ld a, #LPT_BUSY_OUT ; raise busy/ack 72 + out (DATA), a 73 + pop bc 74 + ret 75 + 76 + 77 + ; unsigned char lptrecv(void) 78 + ; receive a full byte from host in three parts 79 + ; return h=1 l=0 on error, otherwise h=0, l=(byte) 80 + _lptrecv:: 81 + push bc 82 + call lptrecv_tribble 83 + ld a, h 84 + cp #1 85 + jr z, lptrecv_err ; bail early if h has an error 86 + ld b, l 87 + call lptrecv_tribble 88 + ld a, h 89 + cp #1 90 + jr z, lptrecv_err 91 + ld a, l 92 + sla a 93 + sla a 94 + sla a 95 + add b 96 + ld b, a ; += tribble << 3 97 + call lptrecv_tribble 98 + ld a, h 99 + cp #1 100 + jr z, lptrecv_err 101 + ld a, l 102 + and #LPT_DIB_MASK ; dibmask 103 + sla a 104 + sla a 105 + sla a 106 + sla a 107 + sla a 108 + sla a 109 + add b ; += (tribble & dibmask) << 6 110 + ld h, #0 111 + ld l, a 112 + lptrecv_out: 113 + pop bc 114 + ret 115 + lptrecv_err: 116 + pop bc 117 + ld hl, #0x0100 118 + ret 119 + 120 + 121 + ; send a tribble byte in register l to host, return l=0 on success 122 + lptsend_tribble: 123 + push bc 124 + ld h, #1 125 + ld c, #0xff ; 255*255 tries before bailing 126 + wait_for_busy_drop_outer: 127 + ld b, #0xff 128 + wait_for_busy_drop: 129 + in a, (STATUS) 130 + and #LPT_BUSY_IN ; inb(STATUS) & bsyin 131 + jr z, got_busy_drop 132 + djnz wait_for_busy_drop 133 + dec c 134 + ld a, c 135 + cp #0 136 + jr nz, wait_for_busy_drop_outer 137 + busy_drop_failed: 138 + jr lptsend_tribble_out 139 + got_busy_drop: 140 + ld a, l 141 + and #LPT_TRIB_MASK 142 + or #LPT_STROBE_OUT 143 + out (DATA), a 144 + ld c, #0xff ; try 255*255 tries before bailing 145 + wait_for_ack_outer: 146 + ld b, #0xff 147 + wait_for_ack: 148 + in a, (STATUS) 149 + and #LPT_BUSY_IN ; inb(STATUS) & stbin 150 + jr nz, lptsend_unstrobe 151 + djnz wait_for_ack 152 + dec c 153 + ld a, c 154 + cp #0 155 + jr nz, wait_for_ack_outer 156 + jr lptsend_tribble_out 157 + lptsend_unstrobe: 158 + ld a, #1 159 + out (DATA), a 160 + ld h, #0 ; success 161 + lptsend_tribble_out: 162 + ld a, #LPT_BUSY_OUT ; raise busy/ack 163 + out (DATA), a 164 + pop bc 165 + ld l, h ; l=1 error, l=0 success 166 + ld h, #0 167 + ret 168 + 169 + 170 + ; unsigned int lptsend(unsigned char b) 171 + ; returns 0 on success 172 + _lptsend:: 173 + push ix 174 + ld ix, #0 175 + add ix, sp 176 + ld l, 4(ix) ; char to send 177 + push hl 178 + call lptsend_tribble 179 + ld a, l 180 + pop hl 181 + cp #0 182 + jr z, tribble2 183 + ld hl, #0x1 184 + jr lptsend_error 185 + tribble2: 186 + push hl 187 + sra l 188 + sra l 189 + sra l ; b >> 3 190 + call lptsend_tribble 191 + ld a, l 192 + pop hl 193 + cp #0 194 + jr z, tribble3 195 + ld hl, #0x2 196 + jr lptsend_error 197 + tribble3: 198 + sra l 199 + sra l 200 + sra l 201 + sra l 202 + sra l 203 + sra l ; b >> 6 204 + call lptsend_tribble 205 + ld a, l 206 + cp #0 207 + jr z, lptsend_out 208 + ld hl, #0x3 209 + jr lptsend_error 210 + lptsend_out: 211 + ld hl, #0 212 + ld sp, ix 213 + pop ix 214 + ret 215 + lptsend_error: 216 + ld sp, ix 217 + pop ix 218 + ret 219 + 220 + 221 + ; send pushed 16-bit as two bytes 222 + _lptsend16:: 223 + push ix 224 + ld ix, #0 225 + add ix, sp 226 + push hl 227 + ld h, #0 228 + ld l, 5(ix) 229 + push hl 230 + call _lptsend 231 + pop hl 232 + ld l, 4(ix) 233 + push hl 234 + call _lptsend 235 + pop hl 236 + pop hl 237 + ld sp, ix 238 + pop ix 239 + ret
+89
mailstation.c
··· 1 + /* 2 + * mailstation utility functions 3 + * msTERM 4 + * 5 + * Copyright (c) 2019 joshua stein <jcs@jcs.org> 6 + * 7 + * Permission to use, copy, modify, and distribute this software for any 8 + * purpose with or without fee is hereby granted, provided that the above 9 + * copyright notice and this permission notice appear in all copies. 10 + * 11 + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 12 + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 13 + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 14 + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 15 + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 16 + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 17 + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 18 + */ 19 + 20 + #include <stdio.h> 21 + #include <string.h> 22 + 23 + #include "mailstation.h" 24 + 25 + volatile unsigned char __at(0x0) mem0; 26 + volatile unsigned char __at(0xdba2) p2shadow; 27 + volatile unsigned char __at(0xdba3) p3shadow; 28 + volatile unsigned char __at(0xdba0) p28shadow; 29 + 30 + volatile unsigned char *memp = &mem0; 31 + 32 + char * 33 + gets(char *s) 34 + { 35 + char c; 36 + unsigned int count = 0; 37 + 38 + for (;;) { 39 + c = getchar(); 40 + switch(c) { 41 + case '\b': // backspace 42 + if (count) { 43 + putchar ('\b'); 44 + putchar (' '); 45 + putchar ('\b'); 46 + s--; 47 + count--; 48 + } 49 + break; 50 + case '\n': 51 + case '\r': // CR or LF 52 + putchar('\r'); 53 + putchar('\n'); 54 + *s=0; 55 + return s; 56 + default: 57 + *s++=c; 58 + count++; 59 + putchar(c); 60 + break; 61 + } 62 + } 63 + } 64 + 65 + void 66 + update_statusbar(char *status, ...) 67 + { 68 + va_list args; 69 + char tstatus[255], c; 70 + char *result = NULL; 71 + unsigned char x, l; 72 + 73 + va_start(args, status); 74 + vsprintf(tstatus, status, args); 75 + va_end(args); 76 + 77 + l = strlen(tstatus); 78 + 79 + for (x = 0; x < TEXT_COLS; x++) { 80 + if (x >= l) 81 + c = ' '; 82 + else 83 + c = tstatus[x]; 84 + 85 + putchar_attr(LCD_ROWS - 1, x, c, ATTR_REVERSE); 86 + } 87 + 88 + redraw_screen(); 89 + }
+171
mailstation.h
··· 1 + /* 2 + * msTERM 3 + * 4 + * Copyright (c) 2019 joshua stein <jcs@jcs.org> 5 + * 6 + * Permission to use, copy, modify, and distribute this software for any 7 + * purpose with or without fee is hereby granted, provided that the above 8 + * copyright notice and this permission notice appear in all copies. 9 + * 10 + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 11 + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 12 + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 13 + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 14 + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 15 + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 16 + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 17 + */ 18 + 19 + #ifndef _INCL_MAILSTATION 20 + #define _INCL_MAILSTATION 21 + 22 + #include "meta_keys.h" 23 + 24 + /* define some ports - see 0x1b2b */ 25 + __sfr __at(0x01) portkeyboard; 26 + __sfr __at(0x02) port2; 27 + __sfr __at(0x05) slot4000page; 28 + __sfr __at(0x06) slot4000device; 29 + __sfr __at(0x07) slot8000page; 30 + __sfr __at(0x08) slot8000device; 31 + __sfr __at(0x09) portpowerstatus; 32 + __sfr __at(0x0d) portcpuclockrate; 33 + __sfr __at(0x28) port28; 34 + 35 + /* v2.54 firmware */ 36 + extern volatile unsigned char __at(0xdba2) p2shadow; 37 + extern volatile unsigned char __at(0xdba3) p3shadow; 38 + extern volatile unsigned char __at(0xdba0) p28shadow; 39 + 40 + /* device IDs that can be swapped into page4000 */ 41 + #define DEVICE_CODEFLASH 0x00 // 64 pages 42 + #define DEVICE_RAM 0x01 // 08 pages 43 + #define DEVICE_LCD_LEFT 0x02 // 01 pages 44 + #define DEVICE_DATAFLASH 0x03 // 32 pages 45 + #define DEVICE_LCD_RIGHT 0x04 // 01 pages 46 + #define DEVICE_MODEM 0x05 // 01 pages 47 + 48 + /* once DEVICE_LCD_{LEFT,RIGHT} is swapped into page4000, LCD starts here */ 49 + #define LCD_START 0x4038 50 + 51 + /* LCD parameters (2 screens) */ 52 + #define LCD_WIDTH (160 * 2) // 320 53 + #define LCD_HEIGHT 128 54 + #define LCD_COL_GROUPS 20 55 + #define LCD_COL_GROUP_WIDTH 8 56 + 57 + #define FONT_WIDTH 5 58 + #define FONT_HEIGHT 8 59 + 60 + /* columns of characters */ 61 + #define LCD_COLS (LCD_WIDTH / FONT_WIDTH) // 64 62 + #define LCD_ROWS (LCD_HEIGHT / FONT_HEIGHT) // 16 63 + #define TEXT_COLS LCD_COLS // 64 64 + #define TEXT_ROWS (LCD_ROWS - 1) // 15 65 + 66 + #define ATTR_DIRTY (1 << 0) 67 + #define ATTR_CURSOR (1 << 1) 68 + #define ATTR_REVERSE (1 << 2) 69 + #define ATTR_BOLD (1 << 3) 70 + #define ATTR_UNDERLINE (1 << 4) 71 + 72 + extern char screenbuf[LCD_COLS * LCD_ROWS]; 73 + extern char screenattrs[LCD_COLS * LCD_ROWS]; 74 + 75 + /* for printf */ 76 + #define BYTE_TO_BINARY_PATTERN "%c%c%c%c%c%c%c%c" 77 + #define BYTE_TO_BINARY(byte) \ 78 + (byte & 0x80 ? '1' : '0'), \ 79 + (byte & 0x40 ? '1' : '0'), \ 80 + (byte & 0x20 ? '1' : '0'), \ 81 + (byte & 0x10 ? '1' : '0'), \ 82 + (byte & 0x08 ? '1' : '0'), \ 83 + (byte & 0x04 ? '1' : '0'), \ 84 + (byte & 0x02 ? '1' : '0'), \ 85 + (byte & 0x01 ? '1' : '0') 86 + 87 + 88 + /* for debugging access from asm */ 89 + extern unsigned char debug0; 90 + extern unsigned char debug1; 91 + extern unsigned char debug2; 92 + extern unsigned char debug3; 93 + extern unsigned char debug4; 94 + 95 + 96 + /* crt0.s */ 97 + extern void powerdown_mode(void); 98 + extern void new_mail(unsigned char on); 99 + extern void reboot(void); 100 + extern void delay(unsigned int millis); 101 + extern void lcd_paint(void); 102 + 103 + 104 + /* mslib.c */ 105 + extern void uitoa(unsigned int value, char *string, int radix); 106 + extern void itoa(int value, char *string, int radix); 107 + 108 + 109 + /* csi.c */ 110 + extern void parseCSI(void); 111 + extern unsigned char in_csi; 112 + extern unsigned char csibuf[TEXT_COLS]; 113 + extern unsigned int csibuflen; 114 + 115 + 116 + /* putchar.s */ 117 + extern unsigned char cursorx; 118 + extern unsigned char cursory; 119 + extern unsigned char putchar_sgr; 120 + extern unsigned char putchar_quick; 121 + extern unsigned char *font_addr; 122 + extern void lcd_cas(unsigned char col); 123 + extern void lcd_sleep(void); 124 + extern void lcd_wake(void); 125 + extern void uncursor(void); 126 + extern void recursor(void); 127 + extern void clear_screen(void); 128 + extern void dirty_screen(void); 129 + extern void redraw_screen(void); 130 + extern void scroll_lcd_half(void); 131 + extern void clear_lcd_half(void); 132 + extern void stamp_char(unsigned char row, unsigned char col); 133 + extern void putchar_attr(unsigned char row, unsigned char col, unsigned char c, 134 + unsigned char attr); 135 + 136 + 137 + /* getchar.s */ 138 + extern unsigned char getscancode(unsigned char *charbuffer); 139 + extern char *gets(char *s); 140 + extern int getkey(void); 141 + extern int peekkey(void); 142 + extern int getkeyorlpt(void); 143 + 144 + 145 + /* lpt.s */ 146 + extern unsigned char lptsend(unsigned char b); 147 + extern int lptrecv(void); 148 + 149 + 150 + /* mailstation.c */ 151 + extern unsigned char *firmware_version; 152 + extern void setup(void); 153 + extern void update_statusbar(char *status, ...); 154 + 155 + 156 + /* modem.s */ 157 + extern unsigned char modem_curmsr; 158 + extern int modem_init(void); 159 + extern int modem_ier(void); 160 + extern int modem_iir(void); 161 + extern int modem_lcr(void); 162 + extern int modem_lsr(void); 163 + extern char modem_read(void); 164 + extern void modem_write(char c); 165 + 166 + 167 + /* msterm.c */ 168 + extern unsigned char obuf[TEXT_COLS]; 169 + extern unsigned char obuf_pos; 170 + 171 + #endif
+58
mailstation.inc
··· 1 + ; vim:syntax=z8a:ts=8:sw=8 2 + 3 + ; for firmware v2.54 4 + ; variables 5 + .equ p2shadow, #0xdba2 6 + .equ p3shadow, #0xdba3 7 + .equ p28shadow, #0xdba0 8 + ; functions 9 + .equ get_keycode_from_buffer,#0x0a9a 10 + .equ lcd_buf_to_screen, #0x2473 11 + ; buffers 12 + .equ lcd_buf, #0xc010 13 + .equ lcd_buf_end, #0xc010 + ((LCD_WIDTH * LCD_HEIGHT) / 8) - 1 14 + ; circular char[] buffer offset by *modem_buf_pos 15 + .equ modem_buf, #0xf600 16 + .equ modem_buf_pos, #0xf700 17 + 18 + ; some constants from mailstion.h 19 + .equ LCD_WIDTH, #160 * 2 ; 320 20 + .equ LCD_HEIGHT, #128 21 + .equ LCD_COL_GROUPS, #20 22 + .equ LCD_COL_GROUP_WIDTH, #8 23 + .equ FONT_WIDTH, #5 24 + .equ FONT_HEIGHT, #8 25 + .equ LCD_COLS, #LCD_WIDTH / FONT_WIDTH ; 64 26 + .equ LCD_ROWS, #LCD_HEIGHT / FONT_HEIGHT ; 16 27 + .equ TEXT_ROWS, #LCD_ROWS - 1 ; 15 28 + 29 + .equ DEVICE_LCD_LEFT, #0x02 30 + .equ DEVICE_DATAFLASH, #0x03 31 + .equ DEVICE_LCD_RIGHT, #0x04 32 + 33 + ; addressing the LCD once it's in slot4000_device 34 + .equ LCD_START, #0x4038 35 + 36 + .equ ATTR_BIT_DIRTY, #0 37 + .equ ATTR_BIT_CURSOR, #1 38 + .equ ATTR_BIT_REVERSE, #2 39 + .equ ATTR_BIT_BOLD, #3 40 + .equ ATTR_BIT_UNDERLINE, #4 41 + 42 + .equ ATTR_DIRTY, #(1 << ATTR_BIT_DIRTY) 43 + .equ ATTR_CURSOR, #(1 << ATTR_CURSOR) 44 + .equ ATTR_REVERSE, #(1 << ATTR_REVERSE) 45 + .equ ATTR_BOLD, #(1 << ATTR_BOLD) 46 + .equ ATTR_UNDERLINE, #(1 << ATTR_UNDERLINE) 47 + 48 + ; debug variables 49 + .globl _debug0 50 + .globl _debug1 51 + 52 + ; some commonly used functions 53 + .globl _delay 54 + .globl _lptsend 55 + .globl _lptsend16 56 + .globl div16 57 + .globl mult8 58 + .globl mult16
+26
meta_keys.h
··· 1 + /* AUTOMATICALLY GENERATED FILE - see tools/generate_scancodes.rb */ 2 + #define META_KEY_BEGIN 200 3 + #define KEY_MAIN_MENU 200 4 + #define KEY_BACK 201 5 + #define KEY_PRINT 202 6 + #define KEY_F1 203 7 + #define KEY_F2 204 8 + #define KEY_F3 205 9 + #define KEY_F4 206 10 + #define KEY_F5 207 11 + #define KEY_POWER 208 12 + #define KEY_SIZE 209 13 + #define KEY_SPELLING 210 14 + #define KEY_EMAIL 211 15 + #define KEY_PAGE_UP 212 16 + #define KEY_PAGE_DOWN 213 17 + #define KEY_CAPS_LOCK 214 18 + #define KEY_LEFT_SHIFT 215 19 + #define KEY_RIGHT_SHIFT 216 20 + #define KEY_FN 217 21 + #define KEY_UP 218 22 + #define KEY_DOWN 219 23 + #define KEY_LEFT 220 24 + #define KEY_RIGHT 221 25 + 26 + #define META_KEY_NONE 255
+269
modem.s
··· 1 + ; vim:syntax=z8a:ts=8 2 + ; 3 + ; modem routines for Rockwell RCV336DPFSP 4 + ; https://github.com/jcs/mailstation-tools/blob/master/docs/modem-RCV336DPFSP.pdf 5 + ; msTERM 6 + ; 7 + ; Copyright (c) 2019 joshua stein <jcs@jcs.org> 8 + ; 9 + ; Permission to use, copy, modify, and distribute this software for any 10 + ; purpose with or without fee is hereby granted, provided that the above 11 + ; copyright notice and this permission notice appear in all copies. 12 + ; 13 + ; THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 14 + ; WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 15 + ; MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 16 + ; ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 17 + ; WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 18 + ; ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 19 + ; OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 20 + ; 21 + 22 + .module modem 23 + 24 + .include "mailstation.inc" 25 + 26 + .area _DATA 27 + 28 + ; modem msr 29 + _modem_curmsr:: 30 + .db #0 31 + 32 + .area _CODE 33 + 34 + _modem_isr:: 35 + push hl 36 + call _modem_iir ; read IIR to identify interrupt 37 + bit #0, l 38 + jr nz, modem_isr_out ; no interrupt, how did we get here? 39 + ld a, l 40 + and #0b00001111 ; mask off high 4 bits 41 + ld l, a 42 + has_irq: 43 + and #0b00000110 ; receiver line status, some error 44 + jr nz, no_rls 45 + push hl 46 + call _modem_lsr ; what are we supposed to do with it? 47 + pop hl 48 + jr modem_isr_out 49 + no_rls: 50 + ld a, l 51 + and #0b00000100 ; received data available or timeout 52 + jr z, no_rda 53 + push hl 54 + call _modem_read 55 + ld b, l 56 + pop hl 57 + ld hl, #modem_buf 58 + ld a, (modem_buf_pos) 59 + ld l, a ; 0xf600 + (modembufpos) 60 + ld (hl), b 61 + inc a 62 + ld (modem_buf_pos), a 63 + jr modem_isr_out 64 + no_rda: 65 + modem_isr_out: 66 + ; XXX: why do we have to force this? the interrupt should trigger it 67 + ; in the no_rda jump 68 + call _modem_msr ; modem status update 69 + ld a, l 70 + ld (_modem_curmsr), a 71 + pop hl 72 + ret 73 + 74 + 75 + ; void modem_init(void) 76 + ; most of this is from 0x33f7 in v2.54 firmware 77 + _modem_init:: 78 + push bc 79 + push hl 80 + ld a, #0 81 + ld (modem_buf_pos), a 82 + call 0x3dbe ; disable caller id? 83 + ld a, (p3shadow) 84 + res 7, a ; disable caller id interrupt 85 + ld (p3shadow),a 86 + out (#0x03), a 87 + in a, (#0x29) ; XXX what is port 29? 88 + or #0x0c 89 + out (#0x29), a 90 + ld a, (p28shadow) 91 + set 2, a 92 + res 3, a 93 + ld (p28shadow), a 94 + out (#0x28), a ; XXX what is port 28? 95 + xor a 96 + ld (#0xe63b), a ; no idea what these shadow vars are 97 + ld (#0xe63a), a 98 + ld (#0xe64d), a 99 + ld (#0xe638), a ; but init them all to 0 100 + ; l33f8 101 + ld a, #0x01 102 + ld (#0xe638), a 103 + in a, (#0x06) ; store old slot4000device 104 + push af 105 + ld a, (p2shadow) ; read p2shadow 106 + res 5, a 107 + ld (p2shadow), a ; write p2shadow 108 + out (#0x02), a ; also write it to port2 109 + ld hl, #300 110 + push hl 111 + call _delay ; delay 300ms 112 + pop hl 113 + ld a, #0 114 + out (#0x26), a ; turn port 26 off 115 + ld hl, #100 ; 100 116 + push hl 117 + call _delay ; delay 100ms 118 + pop hl 119 + ld a, #0x01 120 + out (#0x26), a 121 + ld hl, #3000 ; 3000 122 + push hl 123 + call _delay ; delay 3 seconds 124 + pop hl 125 + ld a, #0x05 126 + out (#0x06), a ; switch slot4000device to modem 127 + ld a, #0b11000111 ; 14 byte trigger 128 + ;ld a, #0b00000111 ; XXX: try 1-byte trigger instead 129 + ld (#0x4002), a ; FCR = enable FIFO 130 + ld a, (#0xe62c) ; what variable is at 0xe62c? 131 + or a 132 + jr z, skip_dlab 133 + ld a, #0b10000011 134 + ld (#0x4003), a ; LCR = DLAB=1, 8n1 135 + ld a, #0x06 136 + ld (#0x4000), a ; DLL = 6 137 + ld a, #0 138 + ld (#0x4001), a ; DLM = 0 = divisor 6 = baud rate 19200 139 + skip_dlab: 140 + ld a, #0b00000011 141 + ld (#0x4003), a ; LCR = DLAB=0, 8n1 142 + ld a, (#0x4004) ; read MCR 143 + or #0b00001111 144 + ld (#0x4004), a ; MCR = enable HINT 145 + ld (_modem_curmsr), a 146 + ld a, #0b00001001 ; IER = EDSSI, ERBFI 147 + ld (#0x4001), a 148 + ld b, #0x01 149 + ld c, #0x06 150 + call 0x0a2f ; jp 0x1afb, do something with port 3 151 + pop af 152 + out (#0x06), a ; restore old slot4000device 153 + call 0x33ca ; init modem vars, activate interrupts 154 + pop hl 155 + pop bc 156 + ret 157 + 158 + 159 + ; char modem_read(void) 160 + ; return a byte in hl from the modem FIFO, from 0x3328 in v2.54 firmware 161 + _modem_read:: 162 + ; use hl 163 + in a, (0x06) ; save old slot4000device 164 + ld h, a ; into h 165 + ld a, #0x05 166 + out (0x06),a ; slot4000device = modem 167 + ld a, (0x4000) ; read byte from modem 168 + ld l, a ; into l 169 + ld a, h 170 + out (0x06), a ; set old slot4000device 171 + ld h, #0x00 172 + ret ; return hl 173 + 174 + 175 + ; void modem_write(char c) 176 + ; write a byte to the modem TX FIFO, from 0x33b6 in v2.54 firmware 177 + _modem_write:: 178 + push ix 179 + ld ix, #0 180 + add ix, sp 181 + push hl 182 + ld a, 4(ix) 183 + ld l, a 184 + in a, (0x06) 185 + ld h, a 186 + ld a, #0x05 187 + out (0x06), a 188 + ld a, l 189 + ld (0x4000), a 190 + ld a, h 191 + out (0x06), a 192 + pop hl 193 + pop ix 194 + ret 195 + 196 + 197 + ; int modem_ier(void) 198 + ; return modem IER register in hl, from 0x3339 in v2.54 firmware 199 + _modem_ier:: 200 + in a, (0x06) 201 + ld h, a 202 + ld a, #0x05 203 + out (0x06), a 204 + ld a, (0x4001) ; read modem IER 205 + ld l, a 206 + ld a, h 207 + out (0x06), a 208 + ld h, #0x0 209 + ret 210 + 211 + 212 + ; int modem_iir(void) 213 + ; return modem IIR register in hl, from 0x334a in v2.54 firmware 214 + _modem_iir:: 215 + in a, (0x06) 216 + ld h, a 217 + ld a, #0x05 218 + out (0x06), a 219 + ld a, (0x4002) ; read modem IIR 220 + ld l, a 221 + ld a, h 222 + out (0x06), a 223 + ld h, #0x0 224 + ret 225 + 226 + 227 + ; int modem_lcr(void) 228 + ; return modem LCR register in hl 229 + _modem_lcr:: 230 + in a, (0x06) 231 + ld h, a 232 + ld a, #0x05 233 + out (0x06), a 234 + ld a, (0x4003) ; read LCR 235 + ld l, a 236 + ld a, h 237 + out (0x06), a 238 + ld h, #0x00 239 + ret 240 + 241 + 242 + ; int modem_lsr(void) 243 + ; return modem LSR register in hl 244 + _modem_lsr:: 245 + in a, (0x06) 246 + ld h, a 247 + ld a, #0x05 248 + out (0x06), a 249 + ld a, (0x4005) ; read LSR 250 + ld l, a 251 + ld a, h 252 + out (0x06), a 253 + ld h, #0x00 254 + ret 255 + 256 + 257 + ; int modem_msr(void) 258 + ; return modem MSR register in hl 259 + _modem_msr:: 260 + in a, (0x06) 261 + ld h, a 262 + ld a, #0x05 263 + out (0x06), a 264 + ld a, (0x4006) ; read modem MSR 265 + ld l, a 266 + ld a, h 267 + out (0x06), a 268 + ld h, #0x0 269 + ret
+55
mslib.c
··· 1 + /* 2 + * utility functions 3 + * msTERM 4 + * 5 + * Copyright (c) 2019 joshua stein <jcs@jcs.org> 6 + * 7 + * Permission to use, copy, modify, and distribute this software for any 8 + * purpose with or without fee is hereby granted, provided that the above 9 + * copyright notice and this permission notice appear in all copies. 10 + * 11 + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 12 + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 13 + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 14 + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 15 + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 16 + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 17 + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 18 + */ 19 + 20 + /* From Bela Torok, 1999 <bela.torok@kssg.ch> */ 21 + 22 + #define NUMBER_OF_DIGITS 16 23 + 24 + void 25 + uitoa(unsigned int value, char *string, int radix) 26 + { 27 + unsigned char index, i; 28 + 29 + index = NUMBER_OF_DIGITS; 30 + i = 0; 31 + 32 + do { 33 + string[--index] = '0' + (value % radix); 34 + if (string[index] > '9') 35 + string[index] += 'A' - ':'; 36 + value /= radix; 37 + } while (value != 0); 38 + 39 + do { 40 + string[i++] = string[index++]; 41 + } while (index < NUMBER_OF_DIGITS); 42 + 43 + string[i] = '\0'; 44 + } 45 + 46 + void 47 + itoa(int value, char *string, int radix) 48 + { 49 + if (value < 0 && radix == 10) { 50 + *string++ = '-'; 51 + uitoa(-value, string, radix); 52 + } else { 53 + uitoa(value, string, radix); 54 + } 55 + }
+303
msterm.c
··· 1 + /* 2 + * msTERM 3 + * 4 + * Copyright (c) 2019 joshua stein <jcs@jcs.org> 5 + * 6 + * Permission to use, copy, modify, and distribute this software for any 7 + * purpose with or without fee is hereby granted, provided that the above 8 + * copyright notice and this permission notice appear in all copies. 9 + * 10 + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 11 + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 12 + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 13 + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 14 + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 15 + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 16 + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 17 + */ 18 + 19 + #include <stdio.h> 20 + #include <string.h> 21 + #include <stdlib.h> 22 + 23 + #include "mailstation.h" 24 + 25 + /* circular buffer */ 26 + unsigned char obuf[TEXT_COLS]; 27 + unsigned char obuf_pos; 28 + 29 + extern volatile unsigned char mem0; 30 + 31 + unsigned char lastkey; 32 + unsigned char esc; 33 + unsigned char old_modem_msr; 34 + 35 + #define MODEM_BUF 0xf600 36 + #define MODEM_BUF_POS 0xf700 37 + volatile unsigned char __at(MODEM_BUF) _modem_buf; 38 + volatile unsigned char __at(MODEM_BUF_POS) modem_buf_pos; 39 + 40 + #define MODEM_MSR_DCD (1 << 7) 41 + 42 + void process_keyboard(void); 43 + void process_input(unsigned char b); 44 + void maybe_update_statusbar(unsigned char force); 45 + 46 + #define DEBUG 47 + 48 + enum { 49 + SOURCE_MODEM, 50 + SOURCE_LPT, 51 + }; 52 + unsigned char source; 53 + 54 + #define STATUSBAR_CALL " Call " 55 + #define STATUSBAR_HANGUP " Hangup " 56 + #define STATUSBAR_BLANK " " 57 + #define STATUSBAR_SETTINGS " Settings " 58 + unsigned char statusbar_state; 59 + 60 + int main(void) 61 + { 62 + unsigned char *memp = &mem0; 63 + unsigned char *modem_buf = &_modem_buf; 64 + unsigned char old_obuf_pos; 65 + unsigned int b; 66 + unsigned char old_modem_buf_pos; 67 + 68 + restart: 69 + lastkey = 0; 70 + esc = 0; 71 + source = SOURCE_MODEM; //LPT; 72 + putchar_sgr = 0; 73 + putchar_quick = 0; 74 + in_csi = 0; 75 + csibuflen = 0; 76 + obuf_pos = 0; 77 + old_obuf_pos = 0; 78 + old_modem_msr = 0; 79 + debug0 = 0; 80 + 81 + clear_screen(); 82 + maybe_update_statusbar(1); 83 + 84 + if (source == SOURCE_MODEM) { 85 + printf("powering up modem..."); 86 + modem_init(); 87 + printf("\n"); 88 + obuf[obuf_pos++] = 'A'; 89 + obuf[obuf_pos++] = 'T'; 90 + obuf[obuf_pos++] = '\r'; 91 + 92 + old_modem_buf_pos = modem_buf_pos; 93 + } 94 + 95 + for (;;) { 96 + process_keyboard(); 97 + 98 + if (source == SOURCE_MODEM) { 99 + while (old_modem_buf_pos != modem_buf_pos) { 100 + if (!putchar_quick) 101 + putchar_quick = 1; 102 + 103 + //lptsend(modem_buf[old_modem_buf_pos]); 104 + process_input(modem_buf[old_modem_buf_pos]); 105 + old_modem_buf_pos++; 106 + } 107 + 108 + if (putchar_quick) { 109 + putchar_quick = 0; 110 + redraw_screen(); 111 + } 112 + } else if (source = SOURCE_LPT) { 113 + b = lptrecv(); 114 + if (b <= 0xff) 115 + process_input(b & 0xff); 116 + } 117 + 118 + while (old_obuf_pos != obuf_pos) { 119 + 120 + if (source == SOURCE_MODEM) { 121 + #if 0 122 + lsr = modem_lsr(); 123 + if (lsr & (1 << 5)) 124 + #endif 125 + /* Transmitter Holding Register Empty (THRE) */ 126 + modem_write(obuf[old_obuf_pos]); 127 + } else if (source == SOURCE_LPT) { 128 + lptsend(obuf[old_obuf_pos]); 129 + } else { 130 + putchar(obuf[old_obuf_pos]); 131 + } 132 + 133 + old_obuf_pos++; 134 + } 135 + 136 + maybe_update_statusbar(0); 137 + } 138 + 139 + return 0; 140 + } 141 + 142 + void 143 + maybe_update_statusbar(unsigned char force) 144 + { 145 + unsigned char s; 146 + unsigned char old_state = statusbar_state; 147 + 148 + if (modem_curmsr & MODEM_MSR_DCD) 149 + s = 1; /* DCD, change to 'hangup' */ 150 + else 151 + s = 0; 152 + 153 + if (s != (statusbar_state & (1 << 0))) 154 + statusbar_state ^= (1 << 0); 155 + 156 + if ((statusbar_state != old_state) || force) { 157 + update_statusbar("%s%s%s%s%s", 158 + statusbar_state & (1 << 0) ? STATUSBAR_HANGUP : STATUSBAR_CALL, 159 + STATUSBAR_BLANK, 160 + STATUSBAR_BLANK, 161 + STATUSBAR_BLANK, 162 + STATUSBAR_SETTINGS); 163 + } 164 + } 165 + 166 + void 167 + process_keyboard(void) 168 + { 169 + unsigned char b; 170 + 171 + b = peekkey(); 172 + 173 + /* this breaks key-repeat, but it's needed to debounce */ 174 + if (b == 0) 175 + lastkey = 0; 176 + else if (b == lastkey) 177 + b = 0; 178 + else 179 + lastkey = b; 180 + 181 + if (b == 0) 182 + return; 183 + 184 + switch (b) { 185 + case KEY_POWER: 186 + __asm 187 + jp 0x0000 188 + __endasm; 189 + break; 190 + case KEY_F1: 191 + if (modem_curmsr & MODEM_MSR_DCD) { 192 + } 193 + 194 + break; 195 + case KEY_BACK: 196 + /* send escape */ 197 + obuf[obuf_pos++] = 27; 198 + break; 199 + case KEY_PAGE_UP: 200 + obuf[obuf_pos++] = 27; 201 + obuf[obuf_pos++] = '['; 202 + obuf[obuf_pos++] = '5'; 203 + obuf[obuf_pos++] = '~'; 204 + break; 205 + case KEY_PAGE_DOWN: 206 + obuf[obuf_pos++] = 27; 207 + obuf[obuf_pos++] = '['; 208 + obuf[obuf_pos++] = '6'; 209 + obuf[obuf_pos++] = '~'; 210 + break; 211 + case KEY_UP: 212 + obuf[obuf_pos++] = 27; 213 + obuf[obuf_pos++] = '['; 214 + obuf[obuf_pos++] = 'A'; 215 + break; 216 + case KEY_DOWN: 217 + obuf[obuf_pos++] = 27; 218 + obuf[obuf_pos++] = '['; 219 + obuf[obuf_pos++] = 'B'; 220 + break; 221 + case KEY_LEFT: 222 + obuf[obuf_pos++] = 27; 223 + obuf[obuf_pos++] = '['; 224 + obuf[obuf_pos++] = 'D'; 225 + break; 226 + case KEY_RIGHT: 227 + obuf[obuf_pos++] = 27; 228 + obuf[obuf_pos++] = '['; 229 + obuf[obuf_pos++] = 'C'; 230 + break; 231 + case KEY_SIZE: 232 + //clear_screen(); 233 + redraw_screen(); 234 + break; 235 + default: 236 + if (b >= META_KEY_BEGIN) 237 + return; 238 + 239 + if (source == SOURCE_MODEM && b == '\n') 240 + b = '\r'; 241 + 242 + obuf[obuf_pos++] = b; 243 + } 244 + } 245 + 246 + void 247 + process_input(unsigned char b) 248 + { 249 + if (in_csi) { 250 + if (csibuflen >= sizeof(csibuf) - 1) { 251 + /* going to overflow, dump */ 252 + parseCSI(); 253 + in_csi = 0; 254 + esc = 0; 255 + csibuf[0] = '\0'; 256 + csibuflen = 0; 257 + } 258 + 259 + if (b == 27) { 260 + /* esc, maybe new csi, dump previous */ 261 + parseCSI(); 262 + in_csi = 0; 263 + esc = 1; 264 + csibuf[0] = '\0'; 265 + csibuflen = 0; 266 + } else { 267 + csibuf[csibuflen] = b; 268 + csibuflen++; 269 + parseCSI(); 270 + } 271 + 272 + return; 273 + } 274 + 275 + switch (b) { 276 + case 7: /* visual bell, ping 'new mail' light */ 277 + new_mail(1); 278 + delay(500); 279 + new_mail(0); 280 + break; 281 + case 9: /* tab */ 282 + while ((cursorx + 1) % 8 != 0) 283 + putchar(' '); 284 + break; 285 + case 27: /* esc */ 286 + if (esc) 287 + /* our previous esc is literal */ 288 + putchar(b); 289 + esc = 1; 290 + break; 291 + case 26: /* ^Z end of ansi */ 292 + break; 293 + case 91: /* [ */ 294 + if (esc) { 295 + esc = 0; 296 + in_csi = 1; 297 + break; 298 + } 299 + /* fall through */ 300 + default: 301 + putchar(b); 302 + } 303 + }
+822
putchar.s
··· 1 + ; vim:syntax=z8a:ts=8 2 + ; 3 + ; putchar 4 + ; msTERM 5 + ; 6 + ; Copyright (c) 2019 joshua stein <jcs@jcs.org> 7 + ; 8 + ; Permission to use, copy, modify, and distribute this software for any 9 + ; purpose with or without fee is hereby granted, provided that the above 10 + ; copyright notice and this permission notice appear in all copies. 11 + ; 12 + ; THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 13 + ; WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 14 + ; MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 15 + ; ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 16 + ; WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 17 + ; ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 18 + ; OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 19 + ; 20 + 21 + .module putchar 22 + 23 + .include "mailstation.inc" 24 + 25 + .area _DATA 26 + 27 + ; screen contents (characters) - should be 0xa000 - 0xa3ff 28 + _screenbuf:: 29 + .ds (LCD_COLS * LCD_ROWS) 30 + _screenbufend:: 31 + 32 + ; per-character attributes - should be 0xa400 - 0xa7ff 33 + ; see ATTR_* constants 34 + _screenattrs:: 35 + .ds (LCD_COLS * LCD_ROWS) 36 + _screenattrsend:: 37 + 38 + font_data:: 39 + .include "font/spleen-5x8.inc" 40 + 41 + ; lookup table for putchar 42 + ; left-most 5 bits are col group for lcd_cas 43 + ; last 3 bits are offset into col group 44 + cursorx_lookup_data:: 45 + .include "cursorx_lookup.inc" 46 + 47 + .area _BSS 48 + 49 + _cursorx:: ; cursor x position, 0-indexed 50 + .db #0 51 + _cursory:: ; cursor y position, 0-indexed 52 + .db #0 53 + _putchar_sgr:: ; current SGR for putchar() 54 + .db #0 55 + _putchar_quick:: ; when 1, don't call redraw_screen() 56 + .db #0 57 + 58 + 59 + .area _GSINIT 60 + 61 + call _clear_screen 62 + 63 + .area _CODE 64 + 65 + ; void lcd_cas(unsigned char col) 66 + ; enable CAS, address the LCD column col (in h), and disable CAS 67 + _lcd_cas:: 68 + push ix 69 + ld ix, #0 70 + add ix, sp 71 + push de 72 + ld a, (p2shadow) 73 + and #0b11110111 ; CAS(0) - turn port2 bit 3 off 74 + ld (p2shadow), a 75 + out (#0x02), a ; write p2shadow to port2 76 + ld de, #LCD_START 77 + ld a, 4(ix) 78 + ld (de), a ; write col argument 79 + ld a, (p2shadow) 80 + or #0b00001000 ; CAS(1) - turn port2 bit 3 on 81 + ld (p2shadow), a 82 + out (#0x02), a 83 + pop de 84 + ld sp, ix 85 + pop ix 86 + ret 87 + 88 + 89 + ; void clear_screen(void) 90 + _clear_screen:: 91 + di 92 + push bc 93 + push de 94 + push hl 95 + in a, (#06) 96 + ld h, a ; slot4000 device 97 + in a, (#05) 98 + ld l, a ; slot4000 page 99 + ld a, #DEVICE_LCD_RIGHT 100 + out (#06), a 101 + push hl 102 + call _clear_lcd_half 103 + ld a, #DEVICE_LCD_LEFT 104 + out (#06), a 105 + call _clear_lcd_half 106 + pop hl 107 + ld a, h 108 + out (#06), a 109 + ld a, l 110 + out (#05), a 111 + reset_cursor: 112 + xor a 113 + ld (_cursorx), a 114 + ld (_cursory), a 115 + ld (_putchar_sgr), a 116 + zero_screenbuf: 117 + ld hl, #_screenbuf 118 + ld de, #_screenbuf + 1 119 + ld bc, #_screenbufend - _screenbuf 120 + ld (hl), #' ' 121 + ldir 122 + zero_screenattrs: 123 + ld hl, #_screenattrs 124 + ld de, #_screenattrs + 1 125 + ld bc, #_screenattrsend - _screenattrs 126 + ld (hl), #0 127 + ldir 128 + clear_screen_out: 129 + pop hl 130 + pop de 131 + pop bc 132 + ei 133 + ret 134 + 135 + 136 + ; void clear_lcd_half(void) 137 + ; zero out the current LCD module (must already be in slot4000device) 138 + ; from v2.54 firmware at 0x2490 139 + _clear_lcd_half:: 140 + push bc 141 + push de 142 + ld b, #20 ; do 20 columns total 143 + clear_lcd_column: 144 + ld h, #0 145 + ld a, b 146 + dec a ; columns are 0-based 147 + ld l, a 148 + push hl 149 + call _lcd_cas 150 + pop hl 151 + push bc ; preserve our column counter 152 + ld hl, #LCD_START 153 + ld (hl), #0 ; zero out hl, then copy it to de 154 + ld de, #LCD_START + 1 ; de will always be the next line 155 + ld bc, #128 - 1 ; iterate (LCD_HEIGHT - 1) times 156 + ldir ; ld (de), (hl), bc-- until 0 157 + pop bc ; restore column counter 158 + djnz clear_lcd_column ; column--, if not zero keep going 159 + clear_done: 160 + pop de 161 + pop bc 162 + ret 163 + 164 + 165 + ; void dirty_screen(void) 166 + ; mark every character cell dirty, should follow with redraw_screen() 167 + _dirty_screen:: 168 + push bc 169 + push hl 170 + ld hl, #_screenattrs 171 + ld bc, #(LCD_COLS * LCD_ROWS) - 1 172 + add hl, bc 173 + dirty_lcd_loop: 174 + ld a, (hl) 175 + set #ATTR_BIT_DIRTY, a 176 + ld (hl), a 177 + dec hl 178 + dec bc 179 + ld a, b 180 + cp #0 181 + jr nz, dirty_lcd_loop 182 + ld a, c 183 + cp #0 184 + jr nz, dirty_lcd_loop 185 + pop hl 186 + pop bc 187 + ret 188 + 189 + 190 + ; void redraw_screen(void) 191 + _redraw_screen:: 192 + di 193 + push bc 194 + push de 195 + push hl 196 + ld b, #0 197 + redraw_rows: 198 + ld h, b 199 + ld l, #0 200 + call screenbuf_offset 201 + ld de, #_screenattrs 202 + add hl, de 203 + ld d, b ; store rows in d 204 + ld b, #0 205 + redraw_cols: 206 + ld a, (hl) 207 + bit #ATTR_BIT_DIRTY, a 208 + jr z, redraw_cols_next 209 + res #ATTR_BIT_DIRTY, a 210 + ld (hl), a 211 + push bc ; XXX figure out what is corrupting 212 + push de ; bc and de in stamp_char, these shouldn't be needed 213 + push hl 214 + ld h, #0 ; cols 215 + ld l, b 216 + push hl 217 + ld h, #0 ; rows 218 + ld l, d 219 + push hl 220 + call _stamp_char 221 + pop hl 222 + pop hl 223 + pop hl 224 + pop de 225 + pop bc 226 + redraw_cols_next: 227 + inc hl 228 + inc b 229 + ld a, b 230 + cp #LCD_COLS 231 + jr nz, redraw_cols 232 + ld b, d 233 + inc b 234 + ld a, b 235 + cp #LCD_ROWS 236 + jr nz, redraw_rows 237 + redraw_screen_out: 238 + pop hl 239 + pop de 240 + pop bc 241 + ei 242 + ret 243 + 244 + 245 + ; void scroll_lcd(void) 246 + ; scroll entire screen up by FONT_HEIGHT rows, minus statusbar 247 + _scroll_lcd:: 248 + di 249 + push bc 250 + push de 251 + push hl 252 + in a, (#06) 253 + ld h, a ; slot4000 device 254 + in a, (#05) 255 + ld l, a ; slot4000 page 256 + push hl 257 + ld a, #DEVICE_LCD_LEFT 258 + out (#06), a 259 + call _scroll_lcd_half 260 + ld a, #DEVICE_LCD_RIGHT 261 + out (#06), a 262 + call _scroll_lcd_half 263 + pop hl 264 + ld a, h 265 + out (#06), a 266 + ld a, l 267 + out (#05), a 268 + shift_bufs: 269 + ld b, #1 270 + screenbuf_shift_loop: 271 + ld h, b 272 + ld l, #0 273 + call screenbuf_offset 274 + ld de, #_screenbuf 275 + add hl, de ; hl = screenbuf[b * LCD_COLS] 276 + push hl 277 + ld de, #LCD_COLS 278 + add hl, de ; hl += LCD_COLS 279 + pop de ; de = screenbuf[b * LCD_COLS] 280 + push bc 281 + ld bc, #LCD_COLS 282 + ldir 283 + pop bc 284 + inc b 285 + ld a, b 286 + cp #TEXT_ROWS - 1 287 + jr nz, screenbuf_shift_loop 288 + screenattrs_shift: 289 + ld b, #1 290 + screenattrs_shift_loop: 291 + ld h, b 292 + ld l, #0 293 + call screenbuf_offset 294 + ld de, #_screenattrs 295 + add hl, de ; hl = screenattrs[b * LCD_COLS] 296 + push hl 297 + ld de, #LCD_COLS 298 + add hl, de 299 + pop de 300 + push bc 301 + ld bc, #LCD_COLS 302 + ldir 303 + pop bc 304 + inc b 305 + ld a, b 306 + cp #TEXT_ROWS - 1 307 + jr nz, screenattrs_shift_loop 308 + last_row_zero: 309 + ld a, #TEXT_ROWS - 1 310 + ld h, a 311 + ld l, #0 312 + call screenbuf_offset 313 + push hl 314 + ld de, #_screenbuf 315 + add hl, de 316 + ld d, #0 317 + ld e, #LCD_COLS - 1 318 + add hl, de 319 + ld b, #LCD_COLS 320 + ld a, (_putchar_sgr) 321 + last_row_zero_loop: 322 + ld (hl), #' ' 323 + dec hl 324 + djnz last_row_zero_loop 325 + last_row_attr_dirty: 326 + ld b, #LCD_COLS - 1 327 + pop hl ; screenattrs[LCD_COLS * TEXT_ROWS] 328 + ld de, #_screenattrs 329 + add hl, de 330 + ld d, #0 331 + ld e, #LCD_COLS 332 + add hl, de 333 + last_row_attr_loop: 334 + ld (hl), a 335 + dec hl 336 + djnz last_row_attr_loop 337 + scroll_lcd_out: 338 + pop hl 339 + pop de 340 + pop bc 341 + ei 342 + ret 343 + 344 + 345 + ; void scroll_lcd_half(void) 346 + ; scroll current LCD module up by FONT_HEIGHT rows, minus statusbar and 347 + ; zero out the last line of text (only to the LCD) 348 + _scroll_lcd_half:: 349 + push ix 350 + ld ix, #0 351 + add ix, sp 352 + push bc 353 + push de 354 + push hl 355 + ; alloc 2 bytes on the stack for local storage 356 + push hl 357 + ld a, #LCD_HEIGHT - (FONT_HEIGHT * 2) ; iterations of pixel row moves 358 + scroll_init: 359 + ld -1(ix), a ; store iterations 360 + ld b, #20 ; do 20 columns total 361 + scroll_lcd_column: 362 + ld -2(ix), b ; store new column counter 363 + ld a, b 364 + sub #1 ; columns are 0-based 365 + ld h, #0 366 + ld l, a 367 + push hl 368 + call _lcd_cas 369 + pop hl 370 + scroll_rows: 371 + ld b, #0 372 + ld c, -1(ix) ; bc = row counter 373 + ld hl, #LCD_START + 8 ; start of next line 374 + ld de, #LCD_START 375 + ldir ; ld (de), (hl), bc-- until 0 376 + scroll_zerolast: 377 + ld hl, #LCD_START 378 + ld d, #0 379 + ld e, -1(ix) 380 + add hl, de 381 + ld b, #FONT_HEIGHT 382 + scroll_zerolastloop: ; 8 times: zero hl, hl++ 383 + ld (hl), #0 384 + inc hl 385 + djnz scroll_zerolastloop 386 + ld b, -2(ix) 387 + djnz scroll_lcd_column ; column--, if not zero keep going 388 + pop hl 389 + pop de 390 + pop bc 391 + ld sp, ix 392 + pop ix 393 + ret 394 + 395 + 396 + ; address of screenbuf or screenattrs offset for a row/col in hl, returns in hl 397 + screenbuf_offset: 398 + push bc 399 + push de 400 + ; uses hl 401 + ex de, hl 402 + ld hl, #0 403 + ld a, d ; row 404 + cp #0 405 + jr z, multiply_srow_out ; only add rows if > 0 406 + ld bc, #LCD_COLS 407 + multiply_srow: 408 + add hl, bc 409 + dec a 410 + cp #0 411 + jr nz, multiply_srow 412 + multiply_srow_out: 413 + ld d, #0 ; col in e 414 + add hl, de ; hl = (row * LCD_COLS) + col 415 + pop de 416 + pop bc 417 + ret ; hl 418 + 419 + 420 + ; void stamp_char(unsigned int row, unsigned int col) 421 + ; row at 4(ix), col at 6(ix) 422 + ; TODO: store last col group, compare to -11(ix) and if same, don't bother 423 + ; changing LCD_CAS and re-reading 4038 data 424 + _stamp_char:: 425 + push ix 426 + ld ix, #0 427 + add ix, sp 428 + push bc 429 + push de 430 + push hl 431 + ld hl, #-14 ; stack bytes for local storage 432 + add hl, sp 433 + ld sp, hl 434 + in a, (#06) 435 + ld -3(ix), a ; stack[-3] = slot4000 device 436 + in a, (#05) 437 + ld -4(ix), a ; stack[-4] = slot4000 page 438 + find_char: 439 + ld h, 4(ix) 440 + ld l, 6(ix) 441 + call screenbuf_offset 442 + push hl 443 + ld de, #_screenbuf 444 + add hl, de ; hl = screenbuf[(row * LCD_COLS) + col] 445 + ld a, (hl) 446 + ld -5(ix), a ; stack[-5] = character to stamp 447 + pop hl 448 + ld de, #_screenattrs 449 + add hl, de ; hl = screenattrs[(row * LCD_COLS) + col] 450 + ld a, (hl) 451 + ld -6(ix), a ; stack[-6] = character attrs 452 + calc_font_data_base: 453 + ld h, #0 454 + ld l, -5(ix) ; char 455 + add hl, hl ; hl = char * FONT_HEIGHT (8) 456 + add hl, hl 457 + add hl, hl 458 + ld de, #font_data 459 + add hl, de 460 + ld -7(ix), l 461 + ld -8(ix), h ; stack[-8,-7] = char font data base addr 462 + calc_char_cell_base: 463 + ld h, #0 464 + ld l, 4(ix) ; row 465 + add hl, hl 466 + add hl, hl 467 + add hl, hl ; hl = row * FONT_HEIGHT (8) 468 + ld de, #LCD_START 469 + add hl, de ; hl = 4038 + (row * FONT_HEIGHT) 470 + ld -9(ix), l 471 + ld -10(ix), h ; stack[-10,-9] = lcd char cell base 472 + fetch_from_table: 473 + ld a, 6(ix) ; col 474 + ld hl, #cursorx_lookup_data 475 + ld b, #0 476 + ld c, a 477 + add hl, bc 478 + ld b, (hl) 479 + ld a, b 480 + pluck_col_group: 481 + and #0b11111000 ; upper 5 bits are col group 482 + srl a 483 + srl a 484 + srl a 485 + ld -11(ix), a ; stack[-11] = col group 486 + pluck_offset: 487 + ld a, b 488 + and #0b00000111 ; lower 3 bits are offset 489 + ld -12(ix), a ; stack[-12] = offset 490 + ld d, #FONT_HEIGHT ; for (row = FONT_HEIGHT; row >= 0; row--) 491 + next_char_row: 492 + ld a, d 493 + dec a 494 + ld h, -8(ix) ; char font data base 495 + ld l, -7(ix) 496 + ld b, #0 497 + ld c, a 498 + add hl, bc 499 + ld a, (hl) ; font_addr + (char * FONT_HEIGHT) + row 500 + ld b, -6(ix) 501 + bit #ATTR_BIT_REVERSE, b 502 + jr nz, reverse 503 + bit #ATTR_BIT_CURSOR, b 504 + jr nz, reverse 505 + jr not_reverse 506 + reverse: 507 + cpl ; flip em 508 + and #0b00011111 ; mask off bits not within FONT_WIDTH 509 + not_reverse: 510 + ld -13(ix), a ; stack[-13] = working font data 511 + ld a, -6(ix) 512 + bit #ATTR_BIT_UNDERLINE, a 513 + jr z, not_underline 514 + ld a, d 515 + cp #FONT_HEIGHT 516 + jr nz, not_underline 517 + underline: 518 + ld -13(ix), #0xff 519 + not_underline: 520 + ld a, 6(ix) ; col 521 + cp #LCD_COLS / 2 ; assume a char never spans both LCD sides 522 + jr nc, rightside 523 + leftside: 524 + ld a, #DEVICE_LCD_LEFT 525 + jr swap_lcd 526 + rightside: 527 + ld a, #DEVICE_LCD_RIGHT 528 + swap_lcd: 529 + out (#06), a 530 + ld e, #FONT_WIDTH ; for (col = FONT_WIDTH; col > 0; col--) 531 + next_char_col: ; inner loop, each col of each row 532 + ld -14(ix), #0b00011111 ; font data mask that will get shifted 533 + determine_cas: 534 + ld c, #0 535 + ld b, -11(ix) ; col group 536 + ld a, -12(ix) ; bit offset 537 + add #FONT_WIDTH 538 + sub e ; if offset+(5-col) is >= 8, advance col 539 + cp #LCD_COL_GROUP_WIDTH 540 + jr c, skip_advance ; if a >= 8, advance (dec b) 541 + dec b 542 + ld c, -12(ix) ; bit offset 543 + ld a, #LCD_COL_GROUP_WIDTH 544 + sub c 545 + ld c, a ; c = number of right shifts 546 + skip_advance: 547 + do_lcd_cas: 548 + ld h, #0 549 + ld l, b 550 + push hl 551 + call _lcd_cas 552 + pop hl 553 + ; if this character doesn't fit entirely in one lcd column, we need to 554 + ; span two of them and on the left one, shift font data and masks right 555 + ; to remove right-most bits that will be on the next column 556 + prep_right_shift: 557 + ld a, c 558 + cp #0 559 + jr z, prep_left_shift 560 + ld b, c 561 + ld c, -14(ix) ; matching mask 00011111 562 + ld a, -13(ix) ; load font data like 00010101 563 + right_shift: 564 + srl a ; shift font data right #b times 565 + srl c ; and mask to match 566 + djnz right_shift ; -> 10101000 567 + ld -14(ix), c 568 + jr done_left_shift 569 + ; shift font data and masks to the left 570 + prep_left_shift: 571 + ld c, -14(ix) ; mask 572 + ld a, -12(ix) ; (bit offset) times, shift font data 573 + cp #0 574 + ld b, a 575 + ld a, -13(ix) ; read new font data 576 + jr z, done_left_shift 577 + left_shift: 578 + sla a 579 + sla c 580 + djnz left_shift 581 + done_left_shift: 582 + ld b, a 583 + ld a, c 584 + cpl 585 + ld -14(ix), a ; invert mask 586 + ld a, b 587 + read_lcd_data: 588 + ld h, -10(ix) 589 + ld l, -9(ix) 590 + ld b, a 591 + ld a, d 592 + dec a 593 + ld c, a 594 + ld a, b 595 + ld b, #0 596 + add hl, bc ; hl = 4038 + (row * FONT_HEIGHT) + row - 1 597 + ld b, a ; store new font data 598 + ld a, (hl) ; read existing cell data 599 + and -14(ix) ; mask off new char cell 600 + or b ; combine data into cell 601 + ld (hl), a 602 + dec e 603 + jp nz, next_char_col 604 + dec d 605 + jp nz, next_char_row 606 + stamp_char_out: 607 + ld a, -3(ix) ; restore slot4000device 608 + out (#06), a 609 + ld a, -4(ix) ; restore slot4000page 610 + out (#05), a 611 + ld hl, #14 ; remove stack bytes 612 + add hl, sp 613 + ld sp, hl 614 + pop hl 615 + pop de 616 + pop bc 617 + ld sp, ix 618 + pop ix 619 + ret 620 + 621 + 622 + ; void uncursor(void) 623 + ; remove cursor attribute from old cursor position 624 + _uncursor:: 625 + push de 626 + push hl 627 + ld a, (_cursory) 628 + ld h, a 629 + ld a, (_cursorx) 630 + ld l, a 631 + call screenbuf_offset 632 + ld de, #_screenattrs 633 + add hl, de ; screenattrs[(cursory * TEXT_COLS) + cursorx] 634 + ld a, (hl) 635 + res #ATTR_BIT_CURSOR, a ; &= ~(ATTR_CURSOR) 636 + set #ATTR_BIT_DIRTY, a ; |= (ATTR_DIRTY) 637 + ld (hl), a 638 + pop hl 639 + pop de 640 + ret 641 + 642 + ; void recursor(void) 643 + ; force-set cursor attribute 644 + _recursor:: 645 + push de 646 + push hl 647 + ld a, (_cursory) 648 + ld h, a 649 + ld a, (_cursorx) 650 + ld l, a 651 + call screenbuf_offset 652 + ld de, #_screenattrs 653 + add hl, de ; screenattrs[(cursory * TEXT_COLS) + cursorx] 654 + ld a, (hl) 655 + or #(ATTR_CURSOR | ATTR_DIRTY) 656 + ld (hl), a 657 + pop hl 658 + pop de 659 + ret 660 + 661 + 662 + ; int putchar(int c) 663 + _putchar:: 664 + push ix 665 + ld ix, #0 666 + add ix, sp ; char to print is at 4(ix) 667 + push de 668 + push hl 669 + call _uncursor 670 + ld a, 4(ix) 671 + cp #'\b' ; backspace 672 + jr nz, not_backspace 673 + backspace: 674 + ld a, (_cursorx) 675 + cp #0 676 + jr nz, cursorx_not_zero 677 + ld a, (_cursory) 678 + cp #0 679 + jp z, putchar_fastout ; cursorx/y at 0,0, nothing to do 680 + dec a 681 + ld (_cursory), a ; cursory-- 682 + ld a, #LCD_COLS - 2 683 + ld (_cursorx), a 684 + jp putchar_out 685 + cursorx_not_zero: 686 + dec a 687 + ld (_cursorx), a ; cursorx--; 688 + jp putchar_out 689 + not_backspace: 690 + cp #'\r' 691 + jr nz, not_cr 692 + xor a 693 + ld (_cursorx), a ; cursorx = 0 694 + jr not_crlf 695 + not_cr: 696 + cp #'\n' 697 + jr nz, not_crlf 698 + xor a 699 + ld (_cursorx), a ; cursorx = 0 700 + ld a, (_cursory) 701 + inc a 702 + ld (_cursory), a ; cursory++ 703 + not_crlf: 704 + ld a, (_cursorx) 705 + cp #LCD_COLS 706 + jr c, not_longer_text_cols ; cursorx < TEXT_COLS 707 + xor a 708 + ld (_cursorx), a ; cursorx = 0 709 + ld a, (_cursory) 710 + inc a 711 + ld (_cursory), a 712 + not_longer_text_cols: 713 + ld a, (_cursory) 714 + cp #TEXT_ROWS 715 + jr c, scroll_out 716 + scroll_up_screen: 717 + call _scroll_lcd 718 + xor a 719 + ld (_cursorx), a 720 + ld a, #TEXT_ROWS - 1 721 + ld (_cursory), a ; cursory = TEXT_ROWS - 1 722 + scroll_out: 723 + ld a, 4(ix) 724 + cp a, #'\r' 725 + jr z, cr_or_lf 726 + cp a, #'\n' 727 + jr z, cr_or_lf 728 + jr store_char_in_buf 729 + cr_or_lf: 730 + ld a, (_putchar_quick) 731 + cp #1 732 + jr z, putchar_out 733 + call _redraw_screen 734 + jr putchar_fastout 735 + store_char_in_buf: 736 + ld a, (_cursory) 737 + ld h, a 738 + ld a, (_cursorx) 739 + ld l, a 740 + call screenbuf_offset 741 + push hl 742 + ld de, #_screenbuf 743 + add hl, de ; hl = screenbuf[(cursory * LCD_COLS) + cursorx] 744 + ld a, 4(ix) 745 + ld (hl), a ; store character 746 + pop hl 747 + ld de, #_screenattrs 748 + add hl, de ; hl = screenattrs[(cursory * LCD_COLS) + cursorx] 749 + ld a, (_putchar_sgr) 750 + set #ATTR_BIT_DIRTY, a 751 + ld (hl), a ; = putchar_sgr | ATTR_DIRTY 752 + advance_cursorx: 753 + ld a, (_cursorx) 754 + inc a 755 + ld (_cursorx), a 756 + cp #LCD_COLS ; if (cursorx >= LCD_COLS) 757 + jr c, putchar_out 758 + xor a 759 + ld (_cursorx), a 760 + ld a, (_cursory) 761 + inc a 762 + ld (_cursory), a 763 + check_cursory: 764 + cp #TEXT_ROWS ; and if (cursory >= TEXT_ROWS) 765 + jr c, putchar_out 766 + call _scroll_lcd 767 + ld a, #TEXT_ROWS - 1 768 + ld (_cursory), a ; cursory = TEXT_ROWS - 1 769 + putchar_out: 770 + ld a, (_cursory) 771 + ld h, a 772 + ld a, (_cursorx) 773 + ld l, a 774 + call screenbuf_offset 775 + ld de, #_screenattrs 776 + add hl, de ; hl = screenattrs[(cursory * LCD_COLS) + cursorx] 777 + ld a, (hl) ; read existing attrs 778 + set #ATTR_BIT_DIRTY, a 779 + set #ATTR_BIT_CURSOR, a 780 + ld (hl), a ; = putchar_sgr | ATTR_DIRTY | ATTR_CURSOR 781 + ld a, (_putchar_quick) 782 + cp #1 783 + jr z, putchar_fastout 784 + call _redraw_screen 785 + putchar_fastout: 786 + pop hl 787 + pop de 788 + ld sp, ix 789 + pop ix 790 + ret 791 + 792 + 793 + ; void putchar_attr(unsigned char row, unsigned char col, char c, char attr) 794 + ; directly manipulates screenbuf/attrs without scrolling or length checks 795 + ; row at 4(ix), col at 5(ix), c at 6(ix), attr at 7(ix) 796 + _putchar_attr:: 797 + push ix 798 + ld ix, #0 799 + add ix, sp 800 + push de 801 + push hl 802 + store_char: 803 + ld h, 4(ix) 804 + ld l, 5(ix) 805 + call screenbuf_offset 806 + push hl 807 + ld de, #_screenbuf 808 + add hl, de ; screenbuf[(row * TEXT_COLS) + col] 809 + ld a, 6(ix) 810 + ld (hl), a 811 + store_attrs: 812 + pop hl 813 + ld de, #_screenattrs 814 + add hl, de ; screenattrs[(row * TEXT_COLS) + col] 815 + ld a, 7(ix) 816 + set #ATTR_BIT_DIRTY, a 817 + ld (hl), a 818 + pop hl 819 + pop de 820 + ld sp, ix 821 + pop ix 822 + ret
+465
scancodes.inc
··· 1 + ; AUTOMATICALLY GENERATED FILE - see tools/generate_scancodes.rb 2 + .equ META_KEY_BEGIN, #0d200 3 + .equ META_KEY_NONE, #0d255 4 + 5 + scancode_table: 6 + .db #0d200 ; :MAIN_MENU 7 + .db #0d201 ; :BACK 8 + .db #0d202 ; :PRINT 9 + .db #0d203 ; :F1 10 + .db #0d204 ; :F2 11 + .db #0d205 ; :F3 12 + .db #0d206 ; :F4 13 + .db #0d207 ; :F5 14 + .db #0d255 15 + .db #0d255 16 + .db #0d255 17 + .db #0d255 18 + .db #0d255 19 + .db #0d255 20 + .db #0d255 21 + .db #0d208 ; :POWER 22 + .db #0d255 23 + .db #0d255 24 + .db #0d255 25 + .db #0d064 ; "@" 26 + .db #0d209 ; :SIZE 27 + .db #0d210 ; :SPELLING 28 + .db #0d211 ; :EMAIL 29 + .db #0d212 ; :PAGE_UP 30 + .db #0d255 31 + .db #0d255 32 + .db #0d255 33 + .db #0d255 34 + .db #0d255 35 + .db #0d255 36 + .db #0d255 37 + .db #0d255 38 + .db #0d096 ; "`" 39 + .db #0d049 ; "1" 40 + .db #0d050 ; "2" 41 + .db #0d051 ; "3" 42 + .db #0d052 ; "4" 43 + .db #0d053 ; "5" 44 + .db #0d054 ; "6" 45 + .db #0d055 ; "7" 46 + .db #0d255 47 + .db #0d255 48 + .db #0d255 49 + .db #0d255 50 + .db #0d255 51 + .db #0d255 52 + .db #0d255 53 + .db #0d255 54 + .db #0d056 ; "8" 55 + .db #0d057 ; "9" 56 + .db #0d048 ; "0" 57 + .db #0d045 ; "-" 58 + .db #0d061 ; "=" 59 + .db #0d008 ; "\b" 60 + .db #0d092 ; "\\" 61 + .db #0d213 ; :PAGE_DOWN 62 + .db #0d255 63 + .db #0d255 64 + .db #0d255 65 + .db #0d255 66 + .db #0d255 67 + .db #0d255 68 + .db #0d255 69 + .db #0d255 70 + .db #0d009 ; "\t" 71 + .db #0d113 ; "q" 72 + .db #0d119 ; "w" 73 + .db #0d101 ; "e" 74 + .db #0d114 ; "r" 75 + .db #0d116 ; "t" 76 + .db #0d121 ; "y" 77 + .db #0d117 ; "u" 78 + .db #0d255 79 + .db #0d255 80 + .db #0d255 81 + .db #0d255 82 + .db #0d255 83 + .db #0d255 84 + .db #0d255 85 + .db #0d255 86 + .db #0d105 ; "i" 87 + .db #0d111 ; "o" 88 + .db #0d112 ; "p" 89 + .db #0d091 ; "[" 90 + .db #0d093 ; "]" 91 + .db #0d059 ; ";" 92 + .db #0d039 ; "'" 93 + .db #0d010 ; "\n" 94 + .db #0d255 95 + .db #0d255 96 + .db #0d255 97 + .db #0d255 98 + .db #0d255 99 + .db #0d255 100 + .db #0d255 101 + .db #0d255 102 + .db #0d214 ; :CAPS_LOCK 103 + .db #0d097 ; "a" 104 + .db #0d115 ; "s" 105 + .db #0d100 ; "d" 106 + .db #0d102 ; "f" 107 + .db #0d103 ; "g" 108 + .db #0d104 ; "h" 109 + .db #0d106 ; "j" 110 + .db #0d255 111 + .db #0d255 112 + .db #0d255 113 + .db #0d255 114 + .db #0d255 115 + .db #0d255 116 + .db #0d255 117 + .db #0d255 118 + .db #0d107 ; "k" 119 + .db #0d108 ; "l" 120 + .db #0d044 ; "," 121 + .db #0d046 ; "." 122 + .db #0d047 ; "/" 123 + .db #0d218 ; :UP 124 + .db #0d219 ; :DOWN 125 + .db #0d221 ; :RIGHT 126 + .db #0d255 127 + .db #0d255 128 + .db #0d255 129 + .db #0d255 130 + .db #0d255 131 + .db #0d255 132 + .db #0d255 133 + .db #0d255 134 + .db #0d215 ; :LEFT_SHIFT 135 + .db #0d122 ; "z" 136 + .db #0d120 ; "x" 137 + .db #0d099 ; "c" 138 + .db #0d118 ; "v" 139 + .db #0d098 ; "b" 140 + .db #0d110 ; "n" 141 + .db #0d109 ; "m" 142 + .db #0d255 143 + .db #0d255 144 + .db #0d255 145 + .db #0d255 146 + .db #0d255 147 + .db #0d255 148 + .db #0d255 149 + .db #0d255 150 + .db #0d217 ; :FN 151 + .db #0d255 152 + .db #0d255 153 + .db #0d032 ; " " 154 + .db #0d255 155 + .db #0d255 156 + .db #0d216 ; :RIGHT_SHIFT 157 + .db #0d220 ; :LEFT 158 + 159 + scancode_table_uppercase: 160 + .db #0d200 ; :MAIN_MENU 161 + .db #0d201 ; :BACK 162 + .db #0d202 ; :PRINT 163 + .db #0d203 ; :F1 164 + .db #0d204 ; :F2 165 + .db #0d205 ; :F3 166 + .db #0d206 ; :F4 167 + .db #0d207 ; :F5 168 + .db #0d255 169 + .db #0d255 170 + .db #0d255 171 + .db #0d255 172 + .db #0d255 173 + .db #0d255 174 + .db #0d255 175 + .db #0d208 ; :POWER 176 + .db #0d255 177 + .db #0d255 178 + .db #0d255 179 + .db #0d064 ; "@" 180 + .db #0d209 ; :SIZE 181 + .db #0d210 ; :SPELLING 182 + .db #0d211 ; :EMAIL 183 + .db #0d212 ; :PAGE_UP 184 + .db #0d255 185 + .db #0d255 186 + .db #0d255 187 + .db #0d255 188 + .db #0d255 189 + .db #0d255 190 + .db #0d255 191 + .db #0d255 192 + .db #0d126 ; "~" 193 + .db #0d033 ; "!" 194 + .db #0d064 ; "@" 195 + .db #0d035 ; "#" 196 + .db #0d036 ; "$" 197 + .db #0d037 ; "%" 198 + .db #0d094 ; "^" 199 + .db #0d038 ; "&" 200 + .db #0d255 201 + .db #0d255 202 + .db #0d255 203 + .db #0d255 204 + .db #0d255 205 + .db #0d255 206 + .db #0d255 207 + .db #0d255 208 + .db #0d042 ; "*" 209 + .db #0d040 ; "(" 210 + .db #0d041 ; ")" 211 + .db #0d095 ; "_" 212 + .db #0d043 ; "+" 213 + .db #0d008 ; "\b" 214 + .db #0d124 ; "|" 215 + .db #0d213 ; :PAGE_DOWN 216 + .db #0d255 217 + .db #0d255 218 + .db #0d255 219 + .db #0d255 220 + .db #0d255 221 + .db #0d255 222 + .db #0d255 223 + .db #0d255 224 + .db #0d009 ; "\t" 225 + .db #0d081 ; "Q" 226 + .db #0d087 ; "W" 227 + .db #0d069 ; "E" 228 + .db #0d082 ; "R" 229 + .db #0d084 ; "T" 230 + .db #0d089 ; "Y" 231 + .db #0d085 ; "U" 232 + .db #0d255 233 + .db #0d255 234 + .db #0d255 235 + .db #0d255 236 + .db #0d255 237 + .db #0d255 238 + .db #0d255 239 + .db #0d255 240 + .db #0d073 ; "I" 241 + .db #0d079 ; "O" 242 + .db #0d080 ; "P" 243 + .db #0d123 ; "{" 244 + .db #0d125 ; "}" 245 + .db #0d058 ; ":" 246 + .db #0d034 ; "\"" 247 + .db #0d010 ; "\n" 248 + .db #0d255 249 + .db #0d255 250 + .db #0d255 251 + .db #0d255 252 + .db #0d255 253 + .db #0d255 254 + .db #0d255 255 + .db #0d255 256 + .db #0d214 ; :CAPS_LOCK 257 + .db #0d065 ; "A" 258 + .db #0d083 ; "S" 259 + .db #0d068 ; "D" 260 + .db #0d070 ; "F" 261 + .db #0d071 ; "G" 262 + .db #0d072 ; "H" 263 + .db #0d074 ; "J" 264 + .db #0d255 265 + .db #0d255 266 + .db #0d255 267 + .db #0d255 268 + .db #0d255 269 + .db #0d255 270 + .db #0d255 271 + .db #0d255 272 + .db #0d075 ; "K" 273 + .db #0d076 ; "L" 274 + .db #0d060 ; "<" 275 + .db #0d062 ; ">" 276 + .db #0d063 ; "?" 277 + .db #0d218 ; :UP 278 + .db #0d219 ; :DOWN 279 + .db #0d221 ; :RIGHT 280 + .db #0d255 281 + .db #0d255 282 + .db #0d255 283 + .db #0d255 284 + .db #0d255 285 + .db #0d255 286 + .db #0d255 287 + .db #0d255 288 + .db #0d215 ; :LEFT_SHIFT 289 + .db #0d090 ; "Z" 290 + .db #0d088 ; "X" 291 + .db #0d067 ; "C" 292 + .db #0d086 ; "V" 293 + .db #0d066 ; "B" 294 + .db #0d078 ; "N" 295 + .db #0d077 ; "M" 296 + .db #0d255 297 + .db #0d255 298 + .db #0d255 299 + .db #0d255 300 + .db #0d255 301 + .db #0d255 302 + .db #0d255 303 + .db #0d255 304 + .db #0d217 ; :FN 305 + .db #0d255 306 + .db #0d255 307 + .db #0d032 ; " " 308 + .db #0d255 309 + .db #0d255 310 + .db #0d216 ; :RIGHT_SHIFT 311 + .db #0d220 ; :LEFT 312 + 313 + scancode_table_control: 314 + .db #0d200 ; :MAIN_MENU 315 + .db #0d201 ; :BACK 316 + .db #0d202 ; :PRINT 317 + .db #0d203 ; :F1 318 + .db #0d204 ; :F2 319 + .db #0d205 ; :F3 320 + .db #0d206 ; :F4 321 + .db #0d207 ; :F5 322 + .db #0d255 323 + .db #0d255 324 + .db #0d255 325 + .db #0d255 326 + .db #0d255 327 + .db #0d255 328 + .db #0d255 329 + .db #0d208 ; :POWER 330 + .db #0d255 331 + .db #0d255 332 + .db #0d255 333 + .db #0d064 ; "@" 334 + .db #0d209 ; :SIZE 335 + .db #0d210 ; :SPELLING 336 + .db #0d211 ; :EMAIL 337 + .db #0d212 ; :PAGE_UP 338 + .db #0d255 339 + .db #0d255 340 + .db #0d255 341 + .db #0d255 342 + .db #0d255 343 + .db #0d255 344 + .db #0d255 345 + .db #0d255 346 + .db #0d096 ; "`" 347 + .db #0d049 ; "1" 348 + .db #0d050 ; "2" 349 + .db #0d027 ; 27 350 + .db #0d028 ; 28 351 + .db #0d029 ; 29 352 + .db #0d030 ; 30 353 + .db #0d031 ; 31 354 + .db #0d255 355 + .db #0d255 356 + .db #0d255 357 + .db #0d255 358 + .db #0d255 359 + .db #0d255 360 + .db #0d255 361 + .db #0d255 362 + .db #0d127 ; 127 363 + .db #0d057 ; "9" 364 + .db #0d048 ; "0" 365 + .db #0d031 ; 31 366 + .db #0d061 ; "=" 367 + .db #0d008 ; "\b" 368 + .db #0d028 ; 28 369 + .db #0d213 ; :PAGE_DOWN 370 + .db #0d255 371 + .db #0d255 372 + .db #0d255 373 + .db #0d255 374 + .db #0d255 375 + .db #0d255 376 + .db #0d255 377 + .db #0d255 378 + .db #0d009 ; "\t" 379 + .db #0d017 ; 17 380 + .db #0d023 ; 23 381 + .db #0d005 ; 5 382 + .db #0d018 ; 18 383 + .db #0d020 ; 20 384 + .db #0d025 ; 25 385 + .db #0d021 ; 21 386 + .db #0d255 387 + .db #0d255 388 + .db #0d255 389 + .db #0d255 390 + .db #0d255 391 + .db #0d255 392 + .db #0d255 393 + .db #0d255 394 + .db #0d009 ; 9 395 + .db #0d015 ; 15 396 + .db #0d016 ; 16 397 + .db #0d027 ; 27 398 + .db #0d029 ; 29 399 + .db #0d059 ; ";" 400 + .db #0d039 ; "'" 401 + .db #0d010 ; "\n" 402 + .db #0d255 403 + .db #0d255 404 + .db #0d255 405 + .db #0d255 406 + .db #0d255 407 + .db #0d255 408 + .db #0d255 409 + .db #0d255 410 + .db #0d214 ; :CAPS_LOCK 411 + .db #0d001 ; 1 412 + .db #0d019 ; 19 413 + .db #0d004 ; 4 414 + .db #0d006 ; 6 415 + .db #0d007 ; 7 416 + .db #0d008 ; 8 417 + .db #0d010 ; 10 418 + .db #0d255 419 + .db #0d255 420 + .db #0d255 421 + .db #0d255 422 + .db #0d255 423 + .db #0d255 424 + .db #0d255 425 + .db #0d255 426 + .db #0d011 ; 11 427 + .db #0d012 ; 12 428 + .db #0d044 ; "," 429 + .db #0d046 ; "." 430 + .db #0d031 ; 31 431 + .db #0d218 ; :UP 432 + .db #0d219 ; :DOWN 433 + .db #0d221 ; :RIGHT 434 + .db #0d255 435 + .db #0d255 436 + .db #0d255 437 + .db #0d255 438 + .db #0d255 439 + .db #0d255 440 + .db #0d255 441 + .db #0d255 442 + .db #0d215 ; :LEFT_SHIFT 443 + .db #0d026 ; 26 444 + .db #0d024 ; 24 445 + .db #0d003 ; 3 446 + .db #0d022 ; 22 447 + .db #0d002 ; 2 448 + .db #0d014 ; 14 449 + .db #0d013 ; 13 450 + .db #0d255 451 + .db #0d255 452 + .db #0d255 453 + .db #0d255 454 + .db #0d255 455 + .db #0d255 456 + .db #0d255 457 + .db #0d255 458 + .db #0d217 ; :FN 459 + .db #0d255 460 + .db #0d255 461 + .db #0d032 ; " " 462 + .db #0d255 463 + .db #0d255 464 + .db #0d216 ; :RIGHT_SHIFT 465 + .db #0d220 ; :LEFT
+44
tools/generate_cursorx_lookup.rb
··· 1 + #!/usr/bin/env ruby 2 + # 3 + # generate_cursorx_lookup 4 + # generate cursorx lookup table using 5 bits for col group and 3 for offset 5 + # msTERM 6 + # 7 + # Copyright (c) 2019 joshua stein <jcs@jcs.org> 8 + # 9 + # Permission to use, copy, modify, and distribute this software for any 10 + # purpose with or without fee is hereby granted, provided that the above 11 + # copyright notice and this permission notice appear in all copies. 12 + # 13 + # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 14 + # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 15 + # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 16 + # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 17 + # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 18 + # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 19 + # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 20 + # 21 + 22 + # pixels: 01234567012345670123456801234567012345670123456701234567012345670 23 + # col group: | 19 | 18 | 17 | 16 | 15 | 14 | 13 | 12 | 24 + # font cell: .....11111.....11111.....11111.....11111.....11111.....11111..... 25 + 26 + File.open("#{__dir__}/../cursorx_lookup.inc", "w+") do |f| 27 + f.puts "; AUTOMATICALLY GENERATED FILE - see tools/generate_cursorx_lookup.rb" 28 + 29 + pcol = 0 30 + 64.times do |x| 31 + col_group = 20 - (pcol / 8) - 1 32 + off = pcol % 8 33 + 34 + v = sprintf("%05b%03b", col_group, off).to_i(2) 35 + 36 + f.puts "\t.db #0x#{sprintf("%02x", v)}\t\t\t; #{sprintf("%08b", v)} - col group #{col_group}, offset #{off}" 37 + 38 + pcol += 5 39 + 40 + if pcol == 160 41 + pcol = 0 42 + end 43 + end 44 + end
+252
tools/generate_scancodes.rb
··· 1 + #!/usr/bin/env ruby 2 + # 3 + # generate_scancodes 4 + # generate scancode lookup tables 5 + # msTERM 6 + # 7 + # Copyright (c) 2019 joshua stein <jcs@jcs.org> 8 + # 9 + # Permission to use, copy, modify, and distribute this software for any 10 + # purpose with or without fee is hereby granted, provided that the above 11 + # copyright notice and this permission notice appear in all copies. 12 + # 13 + # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 14 + # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 15 + # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 16 + # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 17 + # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 18 + # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 19 + # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 20 + # 21 + 22 + META_KEY_BEGIN = 200 23 + 24 + KEYS = [ 25 + :MAIN_MENU, 26 + :BACK, 27 + :PRINT, 28 + :F1, 29 + :F2, 30 + :F3, 31 + :F4, 32 + :F5, 33 + :POWER, 34 + :SIZE, 35 + :SPELLING, 36 + :EMAIL, 37 + :PAGE_UP, 38 + :PAGE_DOWN, 39 + :CAPS_LOCK, 40 + :LEFT_SHIFT, 41 + :RIGHT_SHIFT, 42 + :FN, 43 + :UP, 44 + :DOWN, 45 + :LEFT, 46 + :RIGHT, 47 + ] 48 + 49 + META_KEY_NONE = 255 50 + 51 + UPPERCASES = { 52 + "`" => "~", 53 + "1" => "!", 54 + "2" => "@", 55 + "3" => "#", 56 + "4" => "$", 57 + "5" => "%", 58 + "6" => "^", 59 + "7" => "&", 60 + "8" => "*", 61 + "9" => "(", 62 + "0" => ")", 63 + "-" => "_", 64 + "=" => "+", 65 + "\\" => "|", 66 + "[" => "{", 67 + "]" => "}", 68 + ";" => ":", 69 + "'" => "\"", 70 + "," => "<", 71 + "." => ">", 72 + "/" => "?", 73 + } 74 + 75 + CONTROLS = { 76 + "a" => 1, 77 + "b" => 2, 78 + "c" => 3, 79 + "d" => 4, 80 + "e" => 5, 81 + "f" => 6, 82 + "g" => 7, 83 + "h" => 8, 84 + "i" => 9, 85 + "j" => 10, 86 + "k" => 11, 87 + "l" => 12, 88 + "m" => 13, 89 + "n" => 14, 90 + "o" => 15, 91 + "p" => 16, 92 + "q" => 17, 93 + "r" => 18, 94 + "s" => 19, 95 + "t" => 20, 96 + "u" => 21, 97 + "v" => 22, 98 + "w" => 23, 99 + "x" => 24, 100 + "y" => 25, 101 + "z" => 26, 102 + "3" => 27, 103 + "[" => 27, 104 + "4" => 28, 105 + "\\" => 28, 106 + "5" => 29, 107 + "]" => 29, 108 + "6" => 30, 109 + "7" => 31, 110 + "-" => 31, 111 + "/" => 31, 112 + "8" => 127, 113 + } 114 + 115 + SCANCODES = { 116 + 0 => :MAIN_MENU, 117 + 1 => :BACK, 118 + 2 => :PRINT, 119 + 3 => :F1, 120 + 4 => :F2, 121 + 5 => :F3, 122 + 6 => :F4, 123 + 7 => :F5, 124 + 15 => :POWER, 125 + 19 => "@", 126 + 20 => :SIZE, 127 + 21 => :SPELLING, 128 + 22 => :EMAIL, 129 + 23 => :PAGE_UP, 130 + 32 => "`", 131 + 33 => "1", 132 + 34 => "2", 133 + 35 => "3", 134 + 36 => "4", 135 + 37 => "5", 136 + 38 => "6", 137 + 39 => "7", 138 + 48 => "8", 139 + 49 => "9", 140 + 50 => "0", 141 + 51 => "-", 142 + 52 => "=", 143 + 53 => "\b", # backspace 144 + 54 => "\\", 145 + 55 => :PAGE_DOWN, 146 + 64 => "\t", 147 + 65 => "q", 148 + 66 => "w", 149 + 67 => "e", 150 + 68 => "r", 151 + 69 => "t", 152 + 70 => "y", 153 + 71 => "u", 154 + 80 => "i", 155 + 81 => "o", 156 + 82 => "p", 157 + 83 => "[", 158 + 84 => "]", 159 + 85 => ";", 160 + 86 => "'", 161 + 87 => "\n", 162 + 96 => :CAPS_LOCK, 163 + 97 => "a", 164 + 98 => "s", 165 + 99 => "d", 166 + 100 => "f", 167 + 101 => "g", 168 + 102 => "h", 169 + 103 => "j", 170 + 112 => "k", 171 + 113 => "l", 172 + 114 => ",", 173 + 115 => ".", 174 + 116 => "/", 175 + 117 => :UP, 176 + 118 => :DOWN, 177 + 119 => :RIGHT, 178 + 128 => :LEFT_SHIFT, 179 + 129 => "z", 180 + 130 => "x", 181 + 131 => "c", 182 + 132 => "v", 183 + 133 => "b", 184 + 134 => "n", 185 + 135 => "m", 186 + 144 => :FN, 187 + 147 => " ", 188 + 150 => :RIGHT_SHIFT, 189 + 151 => :LEFT, 190 + } 191 + 192 + File.open("#{__dir__}/../scancodes.inc", "w+") do |scf| 193 + scf.puts "; AUTOMATICALLY GENERATED FILE - see tools/generate_scancodes.rb" 194 + scf.puts "\t.equ\tMETA_KEY_BEGIN,\t#0d#{sprintf("%03d", META_KEY_BEGIN)}" 195 + scf.puts "\t.equ\tMETA_KEY_NONE,\t#0d#{sprintf("%03d", META_KEY_NONE)}" 196 + scf.puts 197 + 198 + 3.times do |x| 199 + if x == 0 200 + scf.puts "scancode_table:" 201 + elsif x == 1 202 + scf.puts 203 + scf.puts "scancode_table_uppercase:" 204 + elsif x == 2 205 + scf.puts 206 + scf.puts "scancode_table_control:" 207 + end 208 + 209 + (0 .. SCANCODES.keys.last).each do |sc| 210 + if k = SCANCODES[sc] 211 + origk = k 212 + if k.is_a?(Symbol) 213 + k = META_KEY_BEGIN + KEYS.index(k) 214 + elsif k.is_a?(String) 215 + k = k.ord 216 + end 217 + raise if !k 218 + 219 + if x == 1 220 + if u = UPPERCASES[origk] 221 + k = u.ord 222 + origk = u 223 + elsif ("a" .. "z").include?(origk) 224 + k = origk.upcase.ord 225 + origk = origk.upcase 226 + end 227 + elsif x == 2 228 + if u = CONTROLS[origk] 229 + k = u 230 + origk = u 231 + end 232 + end 233 + 234 + scf.puts "\t.db #0d#{sprintf("%03d", k)}\t\t; #{origk.inspect}" 235 + else 236 + scf.puts "\t.db #0d#{sprintf("%03d", META_KEY_NONE)}" 237 + end 238 + end 239 + end 240 + end 241 + 242 + File.open("#{__dir__}/../meta_keys.h", "w+") do |mkh| 243 + mkh.puts "/* AUTOMATICALLY GENERATED FILE - see tools/generate_scancodes.rb */" 244 + mkh.puts "#define\tMETA_KEY_BEGIN\t#{META_KEY_BEGIN}" 245 + 246 + KEYS.each_with_index do |k,x| 247 + mkh.puts "#define\tKEY_#{k}\t#{k.length < 3 ? "\t" : ""}#{META_KEY_BEGIN + x}" 248 + end 249 + 250 + mkh.puts 251 + mkh.puts "#define\tMETA_KEY_NONE\t#{META_KEY_NONE}" 252 + end