diff --git a/src/conio/allfonts.c b/src/conio/allfonts.c index f2d6a5452fa3898abb004efbf3405f108f27cc4f..40819226d860257211f46986fb691eed97c2bfcc 100644 --- a/src/conio/allfonts.c +++ b/src/conio/allfonts.c @@ -46,7 +46,8 @@ CIOLIBEXPORT struct conio_font_data_struct conio_fontdata[257] = { {NULL, NULL, NULL , "MicroKnight Plus (Amiga)", CIOLIB_ISO_8859_1}, {NULL, NULL, NULL, "Topaz Plus (Amiga)", CIOLIB_ISO_8859_1}, {NULL, NULL, NULL, "MicroKnight (Amiga)", CIOLIB_ISO_8859_1}, - {NULL, NULL, NULL, "Topaz (Amiga)", CIOLIB_ISO_8859_1} + {NULL, NULL, NULL, "Topaz (Amiga)", CIOLIB_ISO_8859_1}, + {NULL, NULL, NULL, "Prestel (8x16)", CIOLIB_PRESETL}, }; #else CIOLIBEXPORT struct conio_font_data_struct conio_fontdata[257] = { @@ -23607,7 +23608,263 @@ CIOLIBEXPORT struct conio_font_data_struct conio_fontdata[257] = { "\xf0\x60\x60\x7c\x66\x66\x66\x7c\x60\x60\xf0\x00\x00\x00" "\x66\x66\x00\x66\x66\x66\x66\x3c\x18\x18\x70\x00\x00\x00" , NULL, "Topaz (Amiga)", CIOLIB_ISO_8859_1} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} + ,{"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x18\x3c\x3c\x3c\x18\x18\x18\x00\x18\x18\x00\x00\x00\x00" + "\x00\x66\x66\x66\x24\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x38\x6c\x64\x60\x60\xf0\x60\x60\xe6\xfc\x00\x00\x00\x00" + "\x18\x18\x7c\xc6\xc2\xc0\x7c\x06\x06\x86\xc6\x7c\x18\x18\x00\x00" + "\x00\x00\x00\x00\xc2\xc6\x0c\x18\x30\x60\xc6\x86\x00\x00\x00\x00" + "\x00\x00\x38\x6c\x6c\x38\x76\xdc\xcc\xcc\xcc\x76\x00\x00\x00\x00" + "\x00\x30\x30\x30\x60\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x0c\x18\x30\x30\x30\x30\x30\x30\x18\x0c\x00\x00\x00\x00" + "\x00\x00\x30\x18\x0c\x0c\x0c\x0c\x0c\x0c\x18\x30\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x66\x3c\xff\x3c\x66\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x18\x18\x7e\x18\x18\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x18\x30\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\xfe\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x00\x00\x00\x00" + "\x00\x00\x00\x00\x02\x06\x0c\x18\x30\x60\xc0\x80\x00\x00\x00\x00" + "\x00\x00\x3c\x66\xc3\xc3\xdb\xdb\xc3\xc3\x66\x3c\x00\x00\x00\x00" + "\x00\x00\x18\x38\x78\x18\x18\x18\x18\x18\x18\x7e\x00\x00\x00\x00" + "\x00\x00\x7c\xc6\x06\x0c\x18\x30\x60\xc0\xc6\xfe\x00\x00\x00\x00" + "\x00\x00\x7c\xc6\x06\x06\x3c\x06\x06\x06\xc6\x7c\x00\x00\x00\x00" + "\x00\x00\x0c\x1c\x3c\x6c\xcc\xfe\x0c\x0c\x0c\x1e\x00\x00\x00\x00" + "\x00\x00\xfe\xc0\xc0\xc0\xfc\x06\x06\x06\xc6\x7c\x00\x00\x00\x00" + "\x00\x00\x38\x60\xc0\xc0\xfc\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" + "\x00\x00\xfe\xc6\x06\x06\x0c\x18\x30\x30\x30\x30\x00\x00\x00\x00" + "\x00\x00\x7c\xc6\xc6\xc6\x7c\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" + "\x00\x00\x7c\xc6\xc6\xc6\x7e\x06\x06\x06\x0c\x78\x00\x00\x00\x00" + "\x00\x00\x00\x00\x18\x18\x00\x00\x00\x18\x18\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x18\x18\x00\x00\x00\x18\x18\x30\x00\x00\x00\x00" + "\x00\x00\x00\x06\x0c\x18\x30\x60\x30\x18\x0c\x06\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x7e\x00\x00\x7e\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x60\x30\x18\x0c\x06\x0c\x18\x30\x60\x00\x00\x00\x00" + "\x00\x00\x7c\xc6\xc6\x0c\x18\x18\x18\x00\x18\x18\x00\x00\x00\x00" + "\x00\x00\x00\x7c\xc6\xc6\xde\xde\xde\xdc\xc0\x7c\x00\x00\x00\x00" + "\x00\x00\x10\x38\x6c\xc6\xc6\xfe\xc6\xc6\xc6\xc6\x00\x00\x00\x00" + "\x00\x00\xfc\x66\x66\x66\x7c\x66\x66\x66\x66\xfc\x00\x00\x00\x00" + "\x00\x00\x3c\x66\xc2\xc0\xc0\xc0\xc0\xc2\x66\x3c\x00\x00\x00\x00" + "\x00\x00\xf8\x6c\x66\x66\x66\x66\x66\x66\x6c\xf8\x00\x00\x00\x00" + "\x00\x00\xfe\x66\x62\x68\x78\x68\x60\x62\x66\xfe\x00\x00\x00\x00" + "\x00\x00\xfe\x66\x62\x68\x78\x68\x60\x60\x60\xf0\x00\x00\x00\x00" + "\x00\x00\x3c\x66\xc2\xc0\xc0\xde\xc6\xc6\x66\x3a\x00\x00\x00\x00" + "\x00\x00\xc6\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\xc6\x00\x00\x00\x00" + "\x00\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" + "\x00\x00\x1e\x0c\x0c\x0c\x0c\x0c\xcc\xcc\xcc\x78\x00\x00\x00\x00" + "\x00\x00\xe6\x66\x66\x6c\x78\x78\x6c\x66\x66\xe6\x00\x00\x00\x00" + "\x00\x00\xf0\x60\x60\x60\x60\x60\x60\x62\x66\xfe\x00\x00\x00\x00" + "\x00\x00\xc3\xe7\xff\xff\xdb\xc3\xc3\xc3\xc3\xc3\x00\x00\x00\x00" + "\x00\x00\xc6\xe6\xf6\xfe\xde\xce\xc6\xc6\xc6\xc6\x00\x00\x00\x00" + "\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" + "\x00\x00\xfc\x66\x66\x66\x7c\x60\x60\x60\x60\xf0\x00\x00\x00\x00" + "\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xd6\xde\x7c\x0c\x0e\x00\x00" + "\x00\x00\xfc\x66\x66\x66\x7c\x6c\x66\x66\x66\xe6\x00\x00\x00\x00" + "\x00\x00\x7c\xc6\xc6\x60\x38\x0c\x06\xc6\xc6\x7c\x00\x00\x00\x00" + "\x00\x00\xff\xdb\x99\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" + "\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" + "\x00\x00\xc3\xc3\xc3\xc3\xc3\xc3\xc3\x66\x3c\x18\x00\x00\x00\x00" + "\x00\x00\xc3\xc3\xc3\xc3\xc3\xdb\xdb\xff\x66\x66\x00\x00\x00\x00" + "\x00\x00\xc3\xc3\x66\x3c\x18\x18\x3c\x66\xc3\xc3\x00\x00\x00\x00" + "\x00\x00\xc3\xc3\xc3\x66\x3c\x18\x18\x18\x18\x3c\x00\x00\x00\x00" + "\x00\x00\xff\xc3\x86\x0c\x18\x30\x60\xc1\xc3\xff\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x30\x60\xfe\x60\x30\x00\x00\x00\x00\x00\x00" + "\x00\xc0\xc0\xc2\xc6\xcc\x18\x30\x60\xce\x9b\x06\x0c\x1f\x00\x00" + "\x00\x00\x00\x00\x00\x18\x0c\xfe\x0c\x18\x00\x00\x00\x00\x00\x00" + "\x00\x00\x18\x3c\x7e\x18\x18\x18\x18\x18\x18\x18\x00\x00\x00\x00" + "\x00\x00\x00\x6c\x6c\xfe\x6c\x6c\x6c\xfe\x6c\x6c\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00\x00\x00" + "\x00\x00\xe0\x60\x60\x78\x6c\x66\x66\x66\x66\x7c\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x7c\xc6\xc0\xc0\xc0\xc6\x7c\x00\x00\x00\x00" + "\x00\x00\x1c\x0c\x0c\x3c\x6c\xcc\xcc\xcc\xcc\x76\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x7c\xc6\xfe\xc0\xc0\xc6\x7c\x00\x00\x00\x00" + "\x00\x00\x38\x6c\x64\x60\xf0\x60\x60\x60\x60\xf0\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x76\xcc\xcc\xcc\xcc\xcc\x7c\x0c\xcc\x78\x00" + "\x00\x00\xe0\x60\x60\x6c\x76\x66\x66\x66\x66\xe6\x00\x00\x00\x00" + "\x00\x00\x18\x18\x00\x38\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" + "\x00\x00\x06\x06\x00\x0e\x06\x06\x06\x06\x06\x06\x66\x66\x3c\x00" + "\x00\x00\xe0\x60\x60\x66\x6c\x78\x78\x6c\x66\xe6\x00\x00\x00\x00" + "\x00\x00\x38\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\xe6\xff\xdb\xdb\xdb\xdb\xdb\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\xdc\x66\x66\x66\x66\x66\x66\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\xdc\x66\x66\x66\x66\x66\x7c\x60\x60\xf0\x00" + "\x00\x00\x00\x00\x00\x76\xcc\xcc\xcc\xcc\xcc\x7c\x0c\x0c\x1e\x00" + "\x00\x00\x00\x00\x00\xdc\x76\x66\x60\x60\x60\xf0\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x7c\xc6\x60\x38\x0c\xc6\x7c\x00\x00\x00\x00" + "\x00\x00\x10\x30\x30\xfc\x30\x30\x30\x30\x36\x1c\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\xcc\xcc\xcc\xcc\xcc\xcc\x76\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\xc3\xc3\xc3\xc3\x66\x3c\x18\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\xc3\xc3\xc3\xdb\xdb\xff\x66\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\xc3\x66\x3c\x18\x3c\x66\xc3\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x06\x0c\xf8\x00" + "\x00\x00\x00\x00\x00\xfe\xcc\x18\x30\x60\xc6\xfe\x00\x00\x00\x00" + "\x00\xc0\xc0\xc2\xc6\xcc\x18\x30\x66\xce\x96\x3e\x06\x06\x00\x00" + "\x00\x00\x66\x66\x66\x66\x66\x66\x66\x66\x66\x66\x00\x00\x00\x00" + "\x00\xe0\x30\xe2\x36\xec\x18\x30\x66\xce\x96\x3e\x06\x06\x00\x00" + "\x00\x00\x00\x00\x10\x00\x00\xfe\x00\x00\x10\x00\x00\x00\x00\x00" + "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\xf0\xf0\xf0\xf0\xf0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x0f\x0f\x0f\x0f\x0f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\xf0\xf0\xf0\xf0\xf0\xf0\x00\x00\x00\x00\x00" + "\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\x00\x00\x00\x00\x00" + "\x0f\x0f\x0f\x0f\x0f\xf0\xf0\xf0\xf0\xf0\xf0\x00\x00\x00\x00\x00" + "\xff\xff\xff\xff\xff\xf0\xf0\xf0\xf0\xf0\xf0\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x0f\x0f\x0f\x0f\x0f\x0f\x00\x00\x00\x00\x00" + "\xf0\xf0\xf0\xf0\xf0\x0f\x0f\x0f\x0f\x0f\x0f\x00\x00\x00\x00\x00" + "\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x00\x00\x00\x00\x00" + "\xff\xff\xff\xff\xff\x0f\x0f\x0f\x0f\x0f\x0f\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00" + "\xf0\xf0\xf0\xf0\xf0\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00" + "\x0f\x0f\x0f\x0f\x0f\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00" + "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf0\xf0\xf0\xf0\xf0" + "\xf0\xf0\xf0\xf0\xf0\x00\x00\x00\x00\x00\x00\xf0\xf0\xf0\xf0\xf0" + "\x0f\x0f\x0f\x0f\x0f\x00\x00\x00\x00\x00\x00\xf0\xf0\xf0\xf0\xf0" + "\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\xf0\xf0\xf0\xf0\xf0" + "\x00\x00\x00\x00\x00\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0" + "\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0" + "\x0f\x0f\x0f\x0f\x0f\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0" + "\xff\xff\xff\xff\xff\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0" + "\x00\x00\x00\x00\x00\x0f\x0f\x0f\x0f\x0f\x0f\xf0\xf0\xf0\xf0\xf0" + "\xf0\xf0\xf0\xf0\xf0\x0f\x0f\x0f\x0f\x0f\x0f\xf0\xf0\xf0\xf0\xf0" + "\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\xf0\xf0\xf0\xf0\xf0" + "\xff\xff\xff\xff\xff\x0f\x0f\x0f\x0f\x0f\x0f\xf0\xf0\xf0\xf0\xf0" + "\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xf0\xf0\xf0\xf0\xf0" + "\xf0\xf0\xf0\xf0\xf0\xff\xff\xff\xff\xff\xff\xf0\xf0\xf0\xf0\xf0" + "\x0f\x0f\x0f\x0f\x0f\xff\xff\xff\xff\xff\xff\xf0\xf0\xf0\xf0\xf0" + "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xf0\xf0\xf0\xf0\xf0" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0f\x0f\x0f\x0f\x0f" + "\xf0\xf0\xf0\xf0\xf0\x00\x00\x00\x00\x00\x00\x0f\x0f\x0f\x0f\x0f" + "\x0f\x0f\x0f\x0f\x0f\x00\x00\x00\x00\x00\x00\x0f\x0f\x0f\x0f\x0f" + "\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x0f\x0f\x0f\x0f\x0f" + "\x00\x00\x00\x00\x00\xf0\xf0\xf0\xf0\xf0\xf0\x0f\x0f\x0f\x0f\x0f" + "\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\x0f\x0f\x0f\x0f\x0f" + "\x0f\x0f\x0f\x0f\x0f\xf0\xf0\xf0\xf0\xf0\xf0\x0f\x0f\x0f\x0f\x0f" + "\xff\xff\xff\xff\xff\xf0\xf0\xf0\xf0\xf0\xf0\x0f\x0f\x0f\x0f\x0f" + "\x00\x00\x00\x00\x00\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f" + "\xf0\xf0\xf0\xf0\xf0\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f" + "\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f" + "\xff\xff\xff\xff\xff\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f" + "\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\x0f\x0f\x0f\x0f\x0f" + "\xf0\xf0\xf0\xf0\xf0\xff\xff\xff\xff\xff\xff\x0f\x0f\x0f\x0f\x0f" + "\x0f\x0f\x0f\x0f\x0f\xff\xff\xff\xff\xff\xff\x0f\x0f\x0f\x0f\x0f" + "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x0f\x0f\x0f\x0f\x0f" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff" + "\xf0\xf0\xf0\xf0\xf0\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff" + "\x0f\x0f\x0f\x0f\x0f\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff" + "\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff" + "\x00\x00\x00\x00\x00\xf0\xf0\xf0\xf0\xf0\xf0\xff\xff\xff\xff\xff" + "\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xff\xff\xff\xff\xff" + "\x0f\x0f\x0f\x0f\x0f\xf0\xf0\xf0\xf0\xf0\xf0\xff\xff\xff\xff\xff" + "\xff\xff\xff\xff\xff\xf0\xf0\xf0\xf0\xf0\xf0\xff\xff\xff\xff\xff" + "\x00\x00\x00\x00\x00\x0f\x0f\x0f\x0f\x0f\x0f\xff\xff\xff\xff\xff" + "\xf0\xf0\xf0\xf0\xf0\x0f\x0f\x0f\x0f\x0f\x0f\xff\xff\xff\xff\xff" + "\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\xff\xff\xff\xff\xff" + "\xff\xff\xff\xff\xff\x0f\x0f\x0f\x0f\x0f\x0f\xff\xff\xff\xff\xff" + "\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff" + "\xf0\xf0\xf0\xf0\xf0\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff" + "\x0f\x0f\x0f\x0f\x0f\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff" + "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x70\x70\x70\x70\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x07\x07\x07\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x77\x77\x77\x77\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x70\x70\x70\x70\x70\x00\x00\x00\x00\x00\x00" + "\x70\x70\x70\x70\x00\x70\x70\x70\x70\x70\x00\x00\x00\x00\x00\x00" + "\x07\x07\x07\x07\x00\x70\x70\x70\x70\x70\x00\x00\x00\x00\x00\x00" + "\x77\x77\x77\x77\x00\x70\x70\x70\x70\x70\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x07\x07\x07\x07\x07\x00\x00\x00\x00\x00\x00" + "\x70\x70\x70\x70\x00\x07\x07\x07\x07\x07\x00\x00\x00\x00\x00\x00" + "\x07\x07\x07\x07\x00\x07\x07\x07\x07\x07\x00\x00\x00\x00\x00\x00" + "\x77\x77\x77\x77\x00\x07\x07\x07\x07\x07\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x77\x77\x77\x77\x77\x00\x00\x00\x00\x00\x00" + "\x70\x70\x70\x70\x00\x77\x77\x77\x77\x77\x00\x00\x00\x00\x00\x00" + "\x07\x07\x07\x07\x00\x77\x77\x77\x77\x77\x00\x00\x00\x00\x00\x00" + "\x77\x77\x77\x77\x00\x77\x77\x77\x77\x77\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x70\x70\x70\x70\x00" + "\x70\x70\x70\x70\x00\x00\x00\x00\x00\x00\x00\x70\x70\x70\x70\x00" + "\x07\x07\x07\x07\x00\x00\x00\x00\x00\x00\x00\x70\x70\x70\x70\x00" + "\x77\x77\x77\x77\x00\x00\x00\x00\x00\x00\x00\x70\x70\x70\x70\x00" + "\x00\x00\x00\x00\x00\x70\x70\x70\x70\x70\x00\x70\x70\x70\x70\x00" + "\x70\x70\x70\x70\x00\x70\x70\x70\x70\x70\x00\x70\x70\x70\x70\x00" + "\x07\x07\x07\x07\x00\x70\x70\x70\x70\x70\x00\x70\x70\x70\x70\x00" + "\x77\x77\x77\x77\x00\x70\x70\x70\x70\x70\x00\x70\x70\x70\x70\x00" + "\x00\x00\x00\x00\x00\x07\x07\x07\x07\x07\x00\x70\x70\x70\x70\x00" + "\x70\x70\x70\x70\x00\x07\x07\x07\x07\x07\x00\x70\x70\x70\x70\x00" + "\x07\x07\x07\x07\x00\x07\x07\x07\x07\x07\x00\x70\x70\x70\x70\x00" + "\x77\x77\x77\x77\x00\x07\x07\x07\x07\x07\x00\x70\x70\x70\x70\x00" + "\x00\x00\x00\x00\x00\x77\x77\x77\x77\x77\x00\x70\x70\x70\x70\x00" + "\x70\x70\x70\x70\x00\x77\x77\x77\x77\x77\x00\x70\x70\x70\x70\x00" + "\x07\x07\x07\x07\x00\x77\x77\x77\x77\x77\x00\x70\x70\x70\x70\x00" + "\x77\x77\x77\x77\x00\x77\x77\x77\x77\x77\x00\x70\x70\x70\x70\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x07\x07\x07\x00" + "\x70\x70\x70\x70\x00\x00\x00\x00\x00\x00\x00\x07\x07\x07\x07\x00" + "\x07\x07\x07\x07\x00\x00\x00\x00\x00\x00\x00\x07\x07\x07\x07\x00" + "\x77\x77\x77\x77\x00\x00\x00\x00\x00\x00\x00\x07\x07\x07\x07\x00" + "\x00\x00\x00\x00\x00\x70\x70\x70\x70\x70\x00\x07\x07\x07\x07\x00" + "\x70\x70\x70\x70\x00\x70\x70\x70\x70\x70\x00\x07\x07\x07\x07\x00" + "\x07\x07\x07\x07\x00\x70\x70\x70\x70\x70\x00\x07\x07\x07\x07\x00" + "\x77\x77\x77\x77\x00\x70\x70\x70\x70\x70\x00\x07\x07\x07\x07\x00" + "\x00\x00\x00\x00\x00\x07\x07\x07\x07\x07\x00\x07\x07\x07\x07\x00" + "\x70\x70\x70\x70\x00\x07\x07\x07\x07\x07\x00\x07\x07\x07\x07\x00" + "\x07\x07\x07\x07\x00\x07\x07\x07\x07\x07\x00\x07\x07\x07\x07\x00" + "\x77\x77\x77\x77\x00\x07\x07\x07\x07\x07\x00\x07\x07\x07\x07\x00" + "\x00\x00\x00\x00\x00\x77\x77\x77\x77\x77\x00\x07\x07\x07\x07\x00" + "\x70\x70\x70\x70\x00\x77\x77\x77\x77\x77\x00\x07\x07\x07\x07\x00" + "\x07\x07\x07\x07\x00\x77\x77\x77\x77\x77\x00\x07\x07\x07\x07\x00" + "\x77\x77\x77\x77\x00\x77\x77\x77\x77\x77\x00\x07\x07\x07\x07\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x77\x77\x77\x77\x00" + "\x70\x70\x70\x70\x00\x00\x00\x00\x00\x00\x00\x77\x77\x77\x77\x00" + "\x07\x07\x07\x07\x00\x00\x00\x00\x00\x00\x00\x77\x77\x77\x77\x00" + "\x77\x77\x77\x77\x00\x00\x00\x00\x00\x00\x00\x77\x77\x77\x77\x00" + "\x00\x00\x00\x00\x00\x70\x70\x70\x70\x70\x00\x77\x77\x77\x77\x00" + "\x70\x70\x70\x70\x00\x70\x70\x70\x70\x70\x00\x77\x77\x77\x77\x00" + "\x07\x07\x07\x07\x00\x70\x70\x70\x70\x70\x00\x77\x77\x77\x77\x00" + "\x77\x77\x77\x77\x00\x70\x70\x70\x70\x70\x00\x77\x77\x77\x77\x00" + "\x00\x00\x00\x00\x00\x07\x07\x07\x07\x07\x00\x77\x77\x77\x77\x00" + "\x70\x70\x70\x70\x00\x07\x07\x07\x07\x07\x00\x77\x77\x77\x77\x00" + "\x07\x07\x07\x07\x00\x07\x07\x07\x07\x07\x00\x77\x77\x77\x77\x00" + "\x77\x77\x77\x77\x00\x07\x07\x07\x07\x07\x00\x77\x77\x77\x77\x00" + "\x00\x00\x00\x00\x00\x77\x77\x77\x77\x77\x00\x77\x77\x77\x77\x00" + "\x70\x70\x70\x70\x00\x77\x77\x77\x77\x77\x00\x77\x77\x77\x77\x00" + "\x07\x07\x07\x07\x00\x77\x77\x77\x77\x77\x00\x77\x77\x77\x77\x00" + "\x77\x77\x77\x77\x00\x77\x77\x77\x77\x77\x00\x77\x77\x77\x77\x00" + , NULL, NULL, "Prestel", CIOLIB_PRESTEL} ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} diff --git a/src/conio/ciolib.adoc b/src/conio/ciolib.adoc index 8df6bfe3c77d04cbda4bfb3dbfe20f5fe425b66d..cb4de0ce98348b437c790785fb82c7c4934a4d25 100644 --- a/src/conio/ciolib.adoc +++ b/src/conio/ciolib.adoc @@ -455,4 +455,10 @@ every size. The following table summarizes the available fonts. |√ | |ISO_8859_1 + +|Prestel +|√ +| +| +|ISO_8859_1 |=== diff --git a/src/conio/ciolib.h b/src/conio/ciolib.h index 5741d684d31e518a6df3f3ef27322b7ac8bdde36..17fce4e2c13328a757284fd447b654ed53d011ee 100644 --- a/src/conio/ciolib.h +++ b/src/conio/ciolib.h @@ -90,8 +90,8 @@ enum { ,CYAN ,RED ,MAGENTA - ,BROWN - ,LIGHTGRAY + ,BROWN + ,LIGHTGRAY ,DARKGRAY ,LIGHTBLUE ,LIGHTGREEN @@ -203,6 +203,8 @@ enum text_modes VESA_132X50 = 206, VESA_132X60 = 196, + PRESTEL_40X24 = 254, + /* Custom Mode */ CIOLIB_MODE_CUSTOM = 255, // Last mode... if it's over 255, text_info can't hold it. }; @@ -290,7 +292,7 @@ struct ciolib_screen { uint32_t palette[16]; }; -#define CONIO_FIRST_FREE_FONT 43 +#define CONIO_FIRST_FREE_FONT 44 typedef struct { int mode; diff --git a/src/conio/cterm.c b/src/conio/cterm.c index f8edc0bd4a9e79b4d3ad3c5f1525159da8883a71..91e5cfb5d49720061a45383fc7d57a29a975202b 100644 --- a/src/conio/cterm.c +++ b/src/conio/cterm.c @@ -784,12 +784,213 @@ setwindow(struct cterminal *cterm) WINDOW(col, row, max_col, max_row); } +static void +set_attr(struct cterminal *cterm, unsigned char colour, bool bg) +{ + if (bg) { + cterm->attr &= 0x8F; + cterm->attr |= ((colour & 0x07) << 4); + } + else { + cterm->attr &= 0xF8; + cterm->attr |= (colour & 0x07); + } + attr2palette(cterm->attr, bg ? NULL : &cterm->fg_color, bg ? &cterm->bg_color : NULL); + if (bg) + FREE_AND_NULL(cterm->bg_tc_str); + else + FREE_AND_NULL(cterm->fg_tc_str); +} + +static void +set_fgattr(struct cterminal *cterm, unsigned char colour) +{ + set_attr(cterm, colour, false ^ cterm->negative); +} + +static void +set_bgattr(struct cterminal *cterm, unsigned char colour) +{ + set_attr(cterm, colour, true ^ cterm->negative); +} + +static void +prestel_new_line(struct cterminal *cterm) +{ + cterm->extattr &= ~(CTERM_EXTATTR_PRESTEL_CONCEAL | CTERM_EXTATTR_PRESTEL_DOUBLE_HEIGHT | CTERM_EXTATTR_PRESTEL_HOLD | CTERM_EXTATTR_PRESTEL_MOSAIC | CTERM_EXTATTR_PRESTEL_SEPARATED); + cterm->attr = 7; + attr2palette(cterm->attr, &cterm->fg_color, &cterm->bg_color); + cterm->prestel_last_mosaic = 32; + TEXTATTR(cterm->attr); + setcolour(cterm->fg_color, cterm->bg_color); +} + +static void +prestel_apply_ctrl(struct cterminal *cterm, uint8_t ch) +{ + switch(ch) { + case 64: // Alphanumeric Black + set_fgattr(cterm, BLACK); + cterm->extattr &= ~(CTERM_EXTATTR_PRESTEL_MOSAIC); + cterm->prestel_last_mosaic = 32; + break; + case 65: // Alphanumeric Red + set_fgattr(cterm, RED); + cterm->extattr &= ~(CTERM_EXTATTR_PRESTEL_MOSAIC); + cterm->prestel_last_mosaic = 32; + break; + case 66: // Alphanumeric Green + set_fgattr(cterm, GREEN); + cterm->extattr &= ~(CTERM_EXTATTR_PRESTEL_MOSAIC); + cterm->prestel_last_mosaic = 32; + break; + case 67: // Alphanumeric Yellow + set_fgattr(cterm, BROWN); + cterm->extattr &= ~(CTERM_EXTATTR_PRESTEL_MOSAIC); + cterm->prestel_last_mosaic = 32; + break; + case 68: // Alphanumeric Blue + set_fgattr(cterm, BLUE); + cterm->extattr &= ~(CTERM_EXTATTR_PRESTEL_MOSAIC); + cterm->prestel_last_mosaic = 32; + break; + case 69: // Alphanumeric Magenta + set_fgattr(cterm, MAGENTA); + cterm->extattr &= ~(CTERM_EXTATTR_PRESTEL_MOSAIC); + cterm->prestel_last_mosaic = 32; + break; + case 70: // Alphanumeric Cyan + set_fgattr(cterm, CYAN); + cterm->extattr &= ~(CTERM_EXTATTR_PRESTEL_MOSAIC); + cterm->prestel_last_mosaic = 32; + break; + case 71: // Alphanumeric White + set_fgattr(cterm, LIGHTGRAY); + cterm->extattr &= ~(CTERM_EXTATTR_PRESTEL_MOSAIC); + cterm->prestel_last_mosaic = 32; + break; + case 72: // Flash + cterm->attr |= 0x80; + attr2palette(cterm->attr, &cterm->fg_color, &cterm->bg_color); + break; + case 73: // Steady + cterm->attr &= 0x7f; + attr2palette(cterm->attr, &cterm->fg_color, &cterm->bg_color); + break; + case 76: // Normal Height + cterm->extattr &= ~(CTERM_EXTATTR_PRESTEL_DOUBLE_HEIGHT); + cterm->prestel_last_mosaic = 32; + break; + case 77: // Double Height + cterm->extattr |= CTERM_EXTATTR_PRESTEL_DOUBLE_HEIGHT; + cterm->prestel_last_mosaic = 32; + break; + case 80: // Mosaic Black + set_fgattr(cterm, BLACK); + cterm->extattr |= CTERM_EXTATTR_PRESTEL_MOSAIC; + cterm->prestel_last_mosaic = 32; + break; + case 81: // Mosaic Red + set_fgattr(cterm, RED); + cterm->extattr |= CTERM_EXTATTR_PRESTEL_MOSAIC; + cterm->prestel_last_mosaic = 32; + break; + case 82: // Mosaic Green + set_fgattr(cterm, GREEN); + cterm->extattr |= CTERM_EXTATTR_PRESTEL_MOSAIC; + cterm->prestel_last_mosaic = 32; + break; + case 83: // Mosaic Yellow + set_fgattr(cterm, BROWN); + cterm->extattr |= CTERM_EXTATTR_PRESTEL_MOSAIC; + cterm->prestel_last_mosaic = 32; + break; + case 84: // Mosaic Blue + set_fgattr(cterm, BLUE); + cterm->extattr |= CTERM_EXTATTR_PRESTEL_MOSAIC; + cterm->prestel_last_mosaic = 32; + break; + case 85: // Mosaic Magenta + set_fgattr(cterm, MAGENTA); + cterm->extattr |= CTERM_EXTATTR_PRESTEL_MOSAIC; + cterm->prestel_last_mosaic = 32; + break; + case 86: // Mosaic Cyan + set_fgattr(cterm, CYAN); + cterm->extattr |= CTERM_EXTATTR_PRESTEL_MOSAIC; + cterm->prestel_last_mosaic = 32; + break; + case 87: // Mosaic White + set_fgattr(cterm, LIGHTGRAY); + cterm->extattr |= CTERM_EXTATTR_PRESTEL_MOSAIC; + cterm->prestel_last_mosaic = 32; + break; + case 88: // Conceal Display + cterm->attr |= 0x08; + cterm->extattr |= CTERM_EXTATTR_PRESTEL_MOSAIC; + break; + case 89: // Contiguous Mosaics + cterm->extattr &= ~(CTERM_EXTATTR_PRESTEL_SEPARATED); + break; + case 90: // Separated Mosaics + cterm->extattr |= CTERM_EXTATTR_PRESTEL_SEPARATED; + break; + case 92: // Black Background + set_bgattr(cterm, BLACK); + break; + case 93: // New Background + set_bgattr(cterm, cterm->attr & 0x07); + break; + case 94: // Hold Mosaics + cterm->extattr |= CTERM_EXTATTR_PRESTEL_HOLD; + break; + case 95: // Release Mosaics + cterm->extattr &= ~(CTERM_EXTATTR_PRESTEL_HOLD); + break; + } + TEXTATTR(cterm->attr); + setcolour(cterm->fg_color, cterm->bg_color); +} + +static void +prestel_get_state(struct cterminal *cterm) +{ + struct vmem_cell *line; + int sx, sy; + int tx, ty; + + SCR_XY(&sx, &sy); + TERM_XY(&tx, &ty); + line = malloc(sizeof(*line) * tx); + prestel_new_line(cterm); + if (tx > 1) { + vmem_gettext(cterm->x, sy, cterm->x + tx - 2, sy, line); + for (int i = 0; i < (tx - 1); i++) { + uint8_t ch = line[i].ch; + if (line[i].fg & 0x7F000000) { + ch = (line[i].fg & 0x7F000000) >> 24; + prestel_apply_ctrl(cterm, ch); + } + else { + if (ch >= 128) { + cterm->prestel_last_mosaic = ch; + if (ch >= 192) + cterm->prestel_last_mosaic -= 64; + } + } + } + } + free(line); +} + void cterm_gotoxy(struct cterminal *cterm, int x, int y) { coord_conv_xy(cterm, CTERM_COORD_TERM, CTERM_COORD_CURR, &x, &y); GOTOXY(x, y); ABS_XY(&cterm->xpos, &cterm->ypos); + if (cterm->emulation == CTERM_EMULATION_PRESTEL) + prestel_get_state(cterm); } static void @@ -2317,6 +2518,14 @@ adjust_currpos(struct cterminal *cterm, int xadj, int yadj, int scroll) ty = TERM_MINX; else ty += yadj; + if (cterm->emulation == CTERM_EMULATION_PRESTEL) { + while (ty > TERM_MAXY) { + ty -= TERM_MAXY; + } + while (ty < TERM_MINY) { + ty += TERM_MAXY; + } + } if (scroll) { while(ty > TERM_MAXY) { cterm_scrollup(cterm); @@ -2364,6 +2573,8 @@ adjust_currpos(struct cterminal *cterm, int xadj, int yadj, int scroll) if (ty < cterm->top_margin && y >= cterm->top_margin) ty = cterm->top_margin; GOTOXY(tx, ty); + if (cterm->emulation == CTERM_EMULATION_PRESTEL) + prestel_get_state(cterm); } static int @@ -2435,36 +2646,6 @@ set_negative(struct cterminal *cterm, bool on) } } -static void -set_attr(struct cterminal *cterm, unsigned char colour, bool bg) -{ - if (bg) { - cterm->attr &= 0x8F; - cterm->attr |= ((colour & 0x07) << 4); - } - else { - cterm->attr &= 0xF8; - cterm->attr |= (colour & 0x07); - } - attr2palette(cterm->attr, bg ? NULL : &cterm->fg_color, bg ? &cterm->bg_color : NULL); - if (bg) - FREE_AND_NULL(cterm->bg_tc_str); - else - FREE_AND_NULL(cterm->fg_tc_str); -} - -static void -set_fgattr(struct cterminal *cterm, unsigned char colour) -{ - set_attr(cterm, colour, false ^ cterm->negative); -} - -static void -set_bgattr(struct cterminal *cterm, unsigned char colour) -{ - set_attr(cterm, colour, true ^ cterm->negative); -} - static void set_bright_fg(struct cterminal *cterm, unsigned char colour, int flags) { @@ -4699,6 +4880,10 @@ struct cterminal* cterm_init(int height, int width, int xpos, int ypos, int back sem_init(&cterm->playnote_thread_terminated,0,0); _beginthread(playnote_thread, 0, cterm); } + if (cterm->emulation == CTERM_EMULATION_PRESTEL) { + cterm->cursor = _NOCURSOR; + SETCURSORTYPE(cterm->cursor); + } return cterm; } @@ -4751,12 +4936,25 @@ advance_char(struct cterminal *cterm, int *x, int *y, int move) GOTOXY(*x, *y); } else if(*y == bm && (*x == rm || *x == CURR_MAXX)) { - cond_scrollup(cterm); - move = 1; - *x = lm; + if (cterm->emulation == CTERM_EMULATION_PRESTEL) { + *y = cterm->top_margin; + move = 1; + *x = lm; + if (cterm->emulation == CTERM_EMULATION_PRESTEL) { + prestel_new_line(cterm); + } + } + else { + cond_scrollup(cterm); + move = 1; + *x = lm; + } } else { if(*x == rm || *x == CURR_MAXX) { + if (cterm->emulation == CTERM_EMULATION_PRESTEL) { + prestel_new_line(cterm); + } *x=lm; if (*y < CURR_MAXY) (*y)++; @@ -5014,6 +5212,48 @@ static void parse_macro_intro(struct cterminal *cterm) #define uctputs(c, p) ctputs(c, (char *)p) #define ustrcat(b, s) strcat((char *)b, (const char *)s) +static void +prestel_move(struct cterminal *cterm, int xadj, int yadj) +{ + int tx, ty; + + TERM_XY(&tx, &ty); + tx += xadj; + ty += yadj; + // First, fix up x... + while (tx < cterm->left_margin) { + ty--; + tx += TERM_MAXX; + } + while (tx > cterm->right_margin) { + ty++; + tx -= TERM_MAXX; + } + // Now fix up y + while (ty < cterm->top_margin) { + ty += TERM_MAXY; + } + while (ty > cterm->bottom_margin) { + ty -= TERM_MAXY; + } + GOTOXY(tx, ty); + prestel_get_state(cterm); +} + +static void prestel_fix_line(struct cterminal *cterm, int y) +{ + int sy = y; + int sx = 1; + int ex = 1; + struct vmem_cell *line; + + coord_conv_xy(cterm, CTERM_COORD_TERM, CTERM_COORD_SCREEN, &sy, &sx); + ex = sx + TERM_MAXX - 1; + line = malloc(sizeof(*line) * (ex - sx + 1)); + vmem_gettext(sx, sy, ex, sy, line); + free(line); +} + CIOLIBEXPORT char* cterm_write(struct cterminal * cterm, const void *vbuf, int buflen, char *retbuf, size_t retsize, int *speed) { const unsigned char *buf = (unsigned char *)vbuf; @@ -5079,6 +5319,8 @@ CIOLIBEXPORT char* cterm_write(struct cterminal * cterm, const void *vbuf, int b if(cterm->log==CTERM_LOG_RAW && cterm->logfile != NULL) fwrite(buf, buflen, 1, cterm->logfile); prn[0]=0; + if (cterm->emulation == CTERM_EMULATION_PRESTEL) + prestel_get_state(cterm); for(j=0;j<buflen;j++) { if(ustrlen(prn) >= sizeof(prn)-sizeof(cterm->escbuf)) { uctputs(cterm, prn); @@ -5218,27 +5460,51 @@ CIOLIBEXPORT char* cterm_write(struct cterminal * cterm, const void *vbuf, int b } else if(cterm->sequence) { ustrcat(cterm->escbuf,ch); - switch(legal_sequence(cterm->escbuf, sizeof(cterm->escbuf)-1)) { - case SEQ_BROKEN: - /* Broken sequence detected */ - ustrcat(prn,"\033"); - ustrcat(prn,cterm->escbuf); - cterm->escbuf[0]=0; - cterm->sequence=0; - if(ch[0]=='\033') { /* Broken sequence followed by a legal one! */ - if(prn[0]) /* Don't display the ESC */ - prn[ustrlen(prn)-1]=0; - uctputs(cterm, prn); - prn[0]=0; - cterm->sequence=1; - } - break; - case SEQ_INCOMPLETE: - break; - case SEQ_COMPLETE: - do_ansi(cterm, retbuf, retsize, speed, lastch); - lastch = 0; - break; + if (cterm->emulation == CTERM_EMULATION_PRESTEL) { + prestel_apply_ctrl(cterm, ch[0]); + cterm->escbuf[0]=0; + cterm->sequence=0; + if (cterm->extattr & CTERM_EXTATTR_PRESTEL_HOLD) { + tmpvc[0].ch = cterm->prestel_last_mosaic; + if ((tmpvc[0].ch >= 128) && (cterm->extattr & CTERM_EXTATTR_PRESTEL_SEPARATED)) + tmpvc[0].ch += 64; + } + else { + tmpvc[0].ch = ch[0] - 64; + } + tmpvc[0].legacy_attr=cterm->attr; + tmpvc[0].fg = cterm->fg_color | (ch[0] << 24); + tmpvc[0].bg = cterm->bg_color; + tmpvc[0].font = ciolib_attrfont(cterm->attr); + SCR_XY(&sx, &sy); + vmem_puttext(sx, sy, sx, sy, tmpvc); + ch[1]=0; + CURR_XY(&x, &y); + advance_char(cterm, &x, &y, 1); + } + else { + switch(legal_sequence(cterm->escbuf, sizeof(cterm->escbuf)-1)) { + case SEQ_BROKEN: + /* Broken sequence detected */ + ustrcat(prn,"\033"); + ustrcat(prn,cterm->escbuf); + cterm->escbuf[0]=0; + cterm->sequence=0; + if(ch[0]=='\033') { /* Broken sequence followed by a legal one! */ + if(prn[0]) /* Don't display the ESC */ + prn[ustrlen(prn)-1]=0; + uctputs(cterm, prn); + prn[0]=0; + cterm->sequence=1; + } + break; + case SEQ_INCOMPLETE: + break; + case SEQ_COMPLETE: + do_ansi(cterm, retbuf, retsize, speed, lastch); + lastch = 0; + break; + } } } else if (cterm->music) { @@ -5711,6 +5977,92 @@ CIOLIBEXPORT char* cterm_write(struct cterminal * cterm, const void *vbuf, int b break; } } + else if(cterm->emulation == CTERM_EMULATION_PRESTEL) { + switch(buf[j]) { + case 0: // NUL + uctputs(cterm, prn); + prn[0]=0; + break; + case 5: // ENQ + // Send memory 1 + if(strlen(retbuf) + 10 < retsize) + // TODO: Use the memories... + strcat(retbuf, "0000000000"); + break; + case 8: // APB (Active Position Packward) + lastch = 0; + uctputs(cterm, prn); + prn[0]=0; + prestel_move(cterm, -1, 0); + break; + case 9: // APF (Active Position Forward) + lastch = 0; + uctputs(cterm, prn); + prn[0]=0; + prestel_move(cterm, 1, 0); + break; + case 10: // APD (Active Position Down) + lastch = 0; + uctputs(cterm, prn); + prn[0]=0; + prestel_move(cterm, 0, 1); + break; + case 11: // APU (Active Position Up) + lastch = 0; + uctputs(cterm, prn); + prn[0]=0; + prestel_move(cterm, 0, -1); + break; + case 12: // CS (Clear Screen) + lastch = 0; + uctputs(cterm, prn); + prn[0]=0; + prestel_new_line(cterm); + cterm_clearscreen(cterm, (char)cterm->attr); + GOTOXY(CURR_MINX, CURR_MINY); + break; + case 17: // Cursor on + cterm->cursor=_NORMALCURSOR; + SETCURSORTYPE(cterm->cursor); + break; + case 20: // Cursor off + cterm->cursor=_NOCURSOR; + SETCURSORTYPE(cterm->cursor); + break; + case 27: // ESC + uctputs(cterm, prn); + prn[0]=0; + cterm->sequence=1; + break; + case 30: // APH (Active Position Home) + lastch = 0; + uctputs(cterm, prn); + prn[0]=0; + GOTOXY(CURR_MINX, CURR_MINY); + prestel_new_line(cterm); + break; + default: + if (buf[j] == 13 || buf[j] == 10 || (buf[j] >= 32 && buf[j] <= 127)) { + if (cterm->extattr & CTERM_EXTATTR_PRESTEL_MOSAIC) { + if (buf[j] < 64 && buf[j] >= 32) + ch[0] = buf[j] + 96; + else if (buf[j] >= 96 && buf[j] < 128) + ch[0] = buf[j] + 64; + else + ch[0] = buf[j]; + if (ch[0] >= 128) + cterm->prestel_last_mosaic = ch[0]; + if (cterm->extattr & CTERM_EXTATTR_PRESTEL_SEPARATED) { + if (ch[0] >= 128) + ch[0] += 64; + } + } + else + lastch = ch[0]; + ustrcat(prn,ch); + } + } + } else { /* ANSI-BBS */ if(cterm->doorway_char) { uctputs(cterm, prn); diff --git a/src/conio/cterm.h b/src/conio/cterm.h index 5aabe04686b035125c696a06b45fbf6e4c65b49c..7f9fb56338e2980afd2cc9dec70edaaad3a37671 100644 --- a/src/conio/cterm.h +++ b/src/conio/cterm.h @@ -56,6 +56,7 @@ typedef enum { CTERM_EMULATION_ANSI_BBS ,CTERM_EMULATION_PETASCII ,CTERM_EMULATION_ATASCII + ,CTERM_EMULATION_PRESTEL } cterm_emulation_t; typedef enum { @@ -127,6 +128,11 @@ struct cterminal { #define CTERM_EXTATTR_DECLRMM 0x0008 #define CTERM_EXTATTR_BRACKETPASTE 0x0010 #define CTERM_EXTATTR_DECBKM 0x0020 +#define CTERM_EXTATTR_PRESTEL_MOSAIC 0x0040 +#define CTERM_EXTATTR_PRESTEL_DOUBLE_HEIGHT 0x0080 +#define CTERM_EXTATTR_PRESTEL_CONCEAL 0x0100 +#define CTERM_EXTATTR_PRESTEL_SEPARATED 0x0200 +#define CTERM_EXTATTR_PRESTEL_HOLD 0x0400 int save_xpos; // Saved position (for later restore) int save_ypos; int sequence; // An escape sequence is being parsed @@ -227,6 +233,7 @@ struct cterminal { /* Alternate font renderer */ void (*font_render)(char *str); int skypix; + uint8_t prestel_last_mosaic; /* conio function pointers */ #ifdef CTERM_WITHOUT_CONIO diff --git a/src/conio/utf8_codepages.c b/src/conio/utf8_codepages.c index 1bdb9e67ffd71ba7a0a18cfc13f2ca1af733ea50..0be160741bac1b41d2087fb45610175e84c65616 100644 --- a/src/conio/utf8_codepages.c +++ b/src/conio/utf8_codepages.c @@ -1465,6 +1465,122 @@ const static uint32_t petsciil_unicode_table[256] = { 0x1fb83,0x2583, 0x2713, 0x2596, 0x259d, 0x2518, 0x2598,0x1fb96 }; +const static struct ciolib_cpmap prestel_table[] = { + {0xa3, '#'}, // £ + {0x2190, '['}, // ← + {0xbd, '\\'}, // ½ + {0x2192, ']'}, // → + {0x2191, '^'}, // ↑ + {0x2317, '_'}, // Viewdata square + {'_', '`'}, + {0xbc, '{'}, // ¼ + {0xbe, '}'}, // ¾ + {0xf7, '~'}, // ÷ + + /* Space */ {0x1fb00, 129}, {0x1fb01, 130}, {0x1fb02, 131}, + {0x1fb03, 132}, {0x1fb04, 133}, {0x1fb05, 134}, {0x1fb06, 135}, + {0x1fb07, 136}, {0x1fb08, 137}, {0x1fb09, 138}, {0x1fb0a, 139}, + {0x1fb0b, 140}, {0x1fb0c, 141}, {0x1fb0d, 142}, {0x1fb0e, 143}, + {0x1fb0f, 144}, {0x1fb10, 145}, {0x1fb11, 146}, {0x1fb12, 147}, + {0x1fb13, 148}, { 0x258c, 149}, {0x1fb14, 150}, {0x1fb15, 151}, + {0x1fb16, 152}, {0x1fb17, 153}, {0x1fb18, 154}, {0x1fb19, 155}, + {0x1fb1a, 156}, {0x1fb1b, 157}, {0x1fb1c, 158}, {0x1fb1d, 159}, + {0x1fb1e, 160}, {0x1fb1f, 161}, {0x1fb20, 162}, {0x1fb21, 163}, + {0x1fb22, 164}, {0x1fb23, 165}, {0x1fb24, 166}, {0x1fb25, 167}, + {0x1fb26, 168}, {0x1fb27, 169}, { 0x2590, 170}, {0x1fb28, 171}, + {0x1fb29, 172}, {0x1fb2a, 173}, {0x1fb2b, 174}, {0x1fb2c, 175}, + {0x1fb2d, 176}, {0x1fb2e, 177}, {0x1fb2f, 178}, {0x1fb30, 179}, + {0x1fb31, 180}, {0x1fb32, 181}, {0x1fb33, 182}, {0x1fb34, 183}, + {0x1fb35, 184}, {0x1fb36, 185}, {0x1fb37, 186}, {0x1fb38, 187}, + {0x1fb39, 188}, {0x1fb3a, 189}, {0x1fb3b, 190}, { 0x2588, 191}, + + /* Space */ {0x1ce51, 193}, {0x1ce52, 194}, {0x1ce53, 195}, + {0x1ce54, 196}, {0x1ce55, 197}, {0x1ce56, 198}, {0x1ce57, 199}, + {0x1ce58, 200}, {0x1ce59, 201}, {0x1ce5a, 202}, {0x1ce5b, 203}, + {0x1ce5c, 204}, {0x1ce5d, 205}, {0x1ce5e, 206}, {0x1ce5f, 207}, + {0x1ce60, 208}, {0x1ce61, 209}, {0x1ce62, 210}, {0x1ce63, 211}, + {0x1ce64, 212}, {0x1ce65, 213}, {0x1ce66, 214}, {0x1ce67, 215}, + {0x1ce68, 216}, {0x1ce69, 217}, {0x1ce6a, 218}, {0x1ce6b, 219}, + {0x1ce6c, 220}, {0x1ce6d, 221}, {0x1ce6e, 222}, {0x1ce6f, 223}, + {0x1ce70, 224}, {0x1ce71, 225}, {0x1ce72, 226}, {0x1ce73, 227}, + {0x1ce74, 228}, {0x1ce75, 229}, {0x1ce76, 230}, {0x1ce77, 231}, + {0x1ce78, 232}, {0x1ce79, 233}, {0x1ce7a, 234}, {0x1ce7b, 235}, + {0x1ce7c, 236}, {0x1ce7d, 237}, {0x1ce7e, 238}, {0x1ce7f, 239}, + {0x1ce80, 240}, {0x1ce81, 241}, {0x1ce82, 242}, {0x1ce83, 243}, + {0x1ce84, 244}, {0x1ce85, 245}, {0x1ce86, 246}, {0x1ce87, 247}, + {0x1ce88, 248}, {0x1ce89, 249}, {0x1ce8a, 250}, {0x1ce8b, 251}, + {0x1ce8c, 252}, {0x1ce8d, 253}, {0x1ce8e, 254}, {0x1ce8f, 255} +}; + +const static uint32_t prestel_unicode_table[256] = { + 0x00000, 0x00001, 0x00002, 0x00003, + 0x00004, 0x00005, 0x00006, 0x00007, + 0x00008, 0x00009, 0x0000a, 0x0000b, + 0x0000c, 0x0000d, 0x0000e, 0x0000f, + 0x00010, 0x00011, 0x00012, 0x00013, + 0x00014, 0x00015, 0x00016, 0x00017, + 0x00018, 0x00019, 0x0001a, 0x0001b, + 0x0001c, 0x0001d, 0x0001e, 0x0001f, + 0x00020, 0x00021, 0x00022, 0x000a3, + 0x00024, 0x00025, 0x00026, 0x00027, + 0x00028, 0x00029, 0x0002a, 0x0002b, + 0x0002c, 0x0002d, 0x0002e, 0x0002f, + 0x00030, 0x00031, 0x00032, 0x00033, + 0x00034, 0x00035, 0x00036, 0x00037, + 0x00038, 0x00039, 0x0003a, 0x0003b, + 0x0003c, 0x0003d, 0x0003e, 0x0003f, + 0x00040, 0x00041, 0x00042, 0x00043, + 0x00044, 0x00045, 0x00046, 0x00047, + 0x00048, 0x00049, 0x0004a, 0x0004b, + 0x0004c, 0x0004d, 0x0004e, 0x0004f, + 0x00050, 0x00051, 0x00052, 0x00053, + 0x00054, 0x00055, 0x00056, 0x00057, + 0x00058, 0x00059, 0x0005a, 0x02190, + 0x000bd, 0x02192, 0x02191, 0x02317, + 0x0005f, 0x00061, 0x00062, 0x00063, + 0x00064, 0x00065, 0x00066, 0x00067, + 0x00068, 0x00069, 0x0006a, 0x0006b, + 0x0006c, 0x0006d, 0x0006e, 0x0006f, + 0x00070, 0x00071, 0x00072, 0x00073, + 0x00074, 0x00075, 0x00076, 0x00077, + 0x00078, 0x00079, 0x0007a, 0x000bc, + 0x0007c, 0x000be, 0x000f7, 0x0007f, + + 0x00020, 0x1fb00, 0x1fb01, 0x1fb02, + 0x1fb03, 0x1fb04, 0x1fb05, 0x1fb06, + 0x1fb07, 0x1fb08, 0x1fb09, 0x1fb0a, + 0x1fb0b, 0x1fb0c, 0x1fb0d, 0x1fb0e, + 0x1fb0f, 0x1fb10, 0x1fb11, 0x1fb12, + 0x1fb13, 0x258c, 0x1fb14, 0x1fb15, + 0x1fb16, 0x1fb17, 0x1fb18, 0x1fb19, + 0x1fb1a, 0x1fb1b, 0x1fb1c, 0x1fb1d, + 0x1fb1e, 0x1fb1f, 0x1fb20, 0x1fb21, + 0x1fb22, 0x1fb23, 0x1fb24, 0x1fb25, + 0x1fb26, 0x1fb27, 0x2590, 0x1fb28, + 0x1fb29, 0x1fb2a, 0x1fb2b, 0x1fb2c, + 0x1fb2d, 0x1fb2e, 0x1fb2f, 0x1fb30, + 0x1fb31, 0x1fb32, 0x1fb33, 0x1fb34, + 0x1fb35, 0x1fb36, 0x1fb37, 0x1fb38, + 0x1fb39, 0x1fb3a, 0x1fb3b, 0x2588, + + 0x00020, 0x1ce51, 0x1ce52, 0x1ce53, + 0x1ce54, 0x1ce55, 0x1ce56, 0x1ce57, + 0x1ce58, 0x1ce59, 0x1ce5a, 0x1ce5b, + 0x1ce5c, 0x1ce5d, 0x1ce5e, 0x1ce5f, + 0x1ce60, 0x1ce61, 0x1ce62, 0x1ce63, + 0x1ce64, 0x1ce65, 0x1ce66, 0x1ce67, + 0x1ce68, 0x1ce69, 0x1ce6a, 0x1ce6b, + 0x1ce6c, 0x1ce6d, 0x1ce6e, 0x1ce6f, + 0x1ce70, 0x1ce71, 0x1ce72, 0x1ce73, + 0x1ce74, 0x1ce75, 0x1ce76, 0x1ce77, + 0x1ce78, 0x1ce79, 0x1ce7a, 0x1ce7b, + 0x1ce7c, 0x1ce7d, 0x1ce7e, 0x1ce7f, + 0x1ce80, 0x1ce81, 0x1ce82, 0x1ce83, + 0x1ce84, 0x1ce85, 0x1ce86, 0x1ce87, + 0x1ce88, 0x1ce89, 0x1ce8a, 0x1ce8b, + 0x1ce8c, 0x1ce8d, 0x1ce8e, 0x1ce8f +}; + static int cmptab(const void *key, const void *entry) { @@ -1889,6 +2005,10 @@ const struct codepage_def ciolib_cp[CIOLIB_CP_COUNT] = { {"PETSCIIL", CIOLIB_PETSCIIL, ftstr_to_utf8, utf8_to_cpstr, ft_from_unicode_cpoint, ft_cpoint_from_cptable, cpoint_from_cptable_ext, petsciil_table, sizeof(petsciil_table) / sizeof(petsciil_table[0]), petsciil_unicode_table, empty_ext_table}, + + {"PRESTEL", CIOLIB_PRESTEL, ftstr_to_utf8, utf8_to_cpstr, ft_from_unicode_cpoint, ft_cpoint_from_cptable, cpoint_from_cptable_ext, + prestel_table, sizeof(prestel_table) / sizeof(prestel_table[0]), + prestel_unicode_table, empty_ext_table}, }; uint8_t *cp_to_utf8(enum ciolib_codepage cp, const char *cpstr, size_t buflen, size_t *outlen) diff --git a/src/conio/utf8_codepages.h b/src/conio/utf8_codepages.h index 96235f4fe922a2a7d3062e0efd333223eb6bd16e..65846a3420dc36c63def793362d70f58ce30e110 100644 --- a/src/conio/utf8_codepages.h +++ b/src/conio/utf8_codepages.h @@ -25,6 +25,7 @@ enum ciolib_codepage { CIOLIB_ATASCII, CIOLIB_PETSCIIU, CIOLIB_PETSCIIL, + CIOLIB_PRESTEL, CIOLIB_CP_COUNT }; diff --git a/src/conio/vidmodes.c b/src/conio/vidmodes.c index ffb74d430c0535cb87ef5e2ec553c5435a240bdf..f25c03e22021406b989081a26340914bc9478ba6 100644 --- a/src/conio/vidmodes.c +++ b/src/conio/vidmodes.c @@ -124,11 +124,13 @@ struct video_params vparams[] = { {VGA80X25, COLOUR_PALETTE, 80, 25, 14, 15, 16, 9, 7, CIOLIB_VIDEO_EXPAND | CIOLIB_VIDEO_LINE_GRAPHICS_EXPAND, 4, 3, 720, 400}, /* DigitalMon */ {LCD80X25, COLOUR_PALETTE, 80, 25, 14, 15, 16, 8, 7, 0, 8, 5, 640, 400}, + /* Prestel */ + {PRESTEL_40X24, PRESTEL_PALETTE, 40, 24, 14, 15, 16, 8, 7, 0, 4, 3, 320, 384}, /* Custom mode */ - {CIOLIB_MODE_CUSTOM, COLOUR_PALETTE, 80, 25, 14, 15, 16, 8, 7, 0, 0, 0, -1, -1}, + {CIOLIB_MODE_CUSTOM, COLOUR_PALETTE, 80, 25, 14, 15, 16, 8, 7, 0, 0, 0, -1, -1}, }; -uint32_t palettes[5][16] = { +uint32_t palettes[6][16] = { /* Mono */ { 0x00, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07 @@ -149,6 +151,10 @@ uint32_t palettes[5][16] = { { 0x110, 0x111, 0x111, 0x111, 0x111, 0x111, 0x111, 0x111, 0x111, 0x111, 0x111, 0x111, 0x111, 0x111, 0x111, 0x111 }, + /* Prestel */ + { 0, 21, 46, 51, 196, 201, 226, 15, + 0, 21, 46, 51, 196, 201, 226, 15 + }, }; struct dac_colors dac_default[TOTAL_DAC_SIZE] = { @@ -172,63 +178,63 @@ struct dac_colors dac_default[TOTAL_DAC_SIZE] = { {255, 255, 255}, // White /* XTerm 256 colour palette */ - {0, 0, 0}, {0, 0, 95}, {0, 0, 135}, {0, 0, 175}, + {0, 0, 0}, {0, 0, 95}, {0, 0, 135}, {0, 0, 175}, // 16 {0, 0, 215}, {0, 0, 255}, {0, 95, 0}, {0, 95, 95}, {0, 95, 135}, {0, 95, 175}, {0, 95, 215}, {0, 95, 255}, {0, 135, 0}, {0, 135, 95}, {0, 135, 135}, {0, 135, 175}, - {0, 135, 215}, {0, 135, 255}, {0, 175, 0}, {0, 175, 95}, + {0, 135, 215}, {0, 135, 255}, {0, 175, 0}, {0, 175, 95}, // 32 {0, 175, 135}, {0, 175, 175}, {0, 175, 215}, {0, 175, 255}, {0, 215, 0}, {0, 215, 95}, {0, 215, 135}, {0, 215, 175}, {0, 215, 215}, {0, 215, 255}, {0, 255, 0}, {0, 255, 95}, - {0, 255, 135}, {0, 255, 175}, {0, 255, 215}, {0, 255, 255}, + {0, 255, 135}, {0, 255, 175}, {0, 255, 215}, {0, 255, 255}, // 48 {95, 0, 0}, {95, 0, 95}, {95, 0, 135}, {95, 0, 175}, {95, 0, 215}, {95, 0, 255}, {95, 95, 0}, {95, 95, 95}, {95, 95, 135}, {95, 95, 175}, {95, 95, 215}, {95, 95, 255}, - {95, 135, 0}, {95, 135, 95}, {95, 135, 135}, {95, 135, 175}, + {95, 135, 0}, {95, 135, 95}, {95, 135, 135}, {95, 135, 175}, // 64 {95, 135, 215}, {95, 135, 255}, {95, 175, 0}, {95, 175, 95}, {95, 175, 135}, {95, 175, 175}, {95, 175, 215}, {95, 175, 255}, {95, 215, 0}, {95, 215, 95}, {95, 215, 135}, {95, 215, 175}, - {95, 215, 215}, {95, 215, 255}, {95, 255, 0}, {95, 255, 95}, + {95, 215, 215}, {95, 215, 255}, {95, 255, 0}, {95, 255, 95}, // 80 {95, 255, 135}, {95, 255, 175}, {95, 255, 215}, {95, 255, 255}, {135, 0, 0}, {135, 0, 95}, {135, 0, 135}, {135, 0, 175}, {135, 0, 215}, {135, 0, 255}, {135, 95, 0}, {135, 95, 95}, - {135, 95, 135}, {135, 95, 175}, {135, 95, 215}, {135, 95, 255}, + {135, 95, 135}, {135, 95, 175}, {135, 95, 215}, {135, 95, 255}, // 96 {135, 135, 0}, {135, 135, 95}, {135, 135, 135}, {135, 135, 175}, {135, 135, 215}, {135, 135, 255}, {135, 175, 0}, {135, 175, 95}, {135, 175, 135}, {135, 175, 175}, {135, 175, 215}, {135, 175, 255}, - {135, 215, 0}, {135, 215, 95}, {135, 215, 135}, {135, 215, 175}, + {135, 215, 0}, {135, 215, 95}, {135, 215, 135}, {135, 215, 175}, // 112 {135, 215, 215}, {135, 215, 255}, {135, 255, 0}, {135, 255, 95}, {135, 255, 135}, {135, 255, 175}, {135, 255, 215}, {135, 255, 255}, {175, 0, 0}, {175, 0, 95}, {175, 0, 135}, {175, 0, 175}, - {175, 0, 215}, {175, 0, 255}, {175, 95, 0}, {175, 95, 95}, + {175, 0, 215}, {175, 0, 255}, {175, 95, 0}, {175, 95, 95}, // 128 {175, 95, 135}, {175, 95, 175}, {175, 95, 215}, {175, 95, 255}, {175, 135, 0}, {175, 135, 95}, {175, 135, 135}, {175, 135, 175}, {175, 135, 215}, {175, 135, 255}, {175, 175, 0}, {175, 175, 95}, - {175, 175, 135}, {175, 175, 175}, {175, 175, 215}, {175, 175, 255}, + {175, 175, 135}, {175, 175, 175}, {175, 175, 215}, {175, 175, 255}, // 144 {175, 215, 0}, {175, 215, 95}, {175, 215, 135}, {175, 215, 175}, {175, 215, 215}, {175, 215, 255}, {175, 255, 0}, {175, 255, 95}, {175, 255, 135}, {175, 255, 175}, {175, 255, 215}, {175, 255, 255}, - {215, 0, 0}, {215, 0, 95}, {215, 0, 135}, {215, 0, 175}, + {215, 0, 0}, {215, 0, 95}, {215, 0, 135}, {215, 0, 175}, // 160 {215, 0, 215}, {215, 0, 255}, {215, 95, 0}, {215, 95, 95}, {215, 95, 135}, {215, 95, 175}, {215, 95, 215}, {215, 95, 255}, {215, 135, 0}, {215, 135, 95}, {215, 135, 135}, {215, 135, 175}, - {215, 135, 215}, {215, 135, 255}, {215, 175, 0}, {215, 175, 95}, + {215, 135, 215}, {215, 135, 255}, {215, 175, 0}, {215, 175, 95}, // 176 {215, 175, 135}, {215, 175, 175}, {215, 175, 215}, {215, 175, 255}, {215, 215, 0}, {215, 215, 95}, {215, 215, 135}, {215, 215, 175}, {215, 215, 215}, {215, 215, 255}, {215, 255, 0}, {215, 255, 95}, - {215, 255, 135}, {215, 255, 175}, {215, 255, 215}, {215, 255, 255}, + {215, 255, 135}, {215, 255, 175}, {215, 255, 215}, {215, 255, 255}, // 192 {255, 0, 0}, {255, 0, 95}, {255, 0, 135}, {255, 0, 175}, {255, 0, 215}, {255, 0, 255}, {255, 95, 0}, {255, 95, 95}, {255, 95, 135}, {255, 95, 175}, {255, 95, 215}, {255, 95, 255}, - {255, 135, 0}, {255, 135, 95}, {255, 135, 135}, {255, 135, 175}, + {255, 135, 0}, {255, 135, 95}, {255, 135, 135}, {255, 135, 175}, // 208 {255, 135, 215}, {255, 135, 255}, {255, 175, 0}, {255, 175, 95}, {255, 175, 135}, {255, 175, 175}, {255, 175, 215}, {255, 175, 255}, {255, 215, 0}, {255, 215, 95}, {255, 215, 135}, {255, 215, 175}, - {255, 215, 215}, {255, 215, 255}, {255, 255, 0}, {255, 255, 95}, + {255, 215, 215}, {255, 215, 255}, {255, 255, 0}, {255, 255, 95}, // 224 {255, 255, 135}, {255, 255, 175}, {255, 255, 215}, {255, 255, 255}, {8, 8, 8}, {18, 18, 18}, {28, 28, 28}, {38, 38, 38}, {48, 48, 48}, {58, 58, 58}, {68, 68, 68}, {78, 78, 78}, - {88, 88, 88}, {98, 98, 98}, {108, 108, 108}, {118, 118, 118}, + {88, 88, 88}, {98, 98, 98}, {108, 108, 108}, {118, 118, 118}, // 240 {128, 128, 128}, {138, 138, 138}, {148, 148, 148}, {158, 158, 158}, {168, 168, 168}, {178, 178, 178}, {188, 188, 188}, {198, 198, 198}, {208, 208, 208}, {218, 218, 218}, {228, 228, 228}, {238, 238, 238}, @@ -259,7 +265,7 @@ struct dac_colors dac_default[TOTAL_DAC_SIZE] = { * Taken from https://www.pepto.de/projects/colorvic/ * a much more convincing source. */ - {0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00}, // 256 {0xFF, 0xFF, 0xFF}, {0x81, 0x33, 0x38}, {0x75, 0xCE, 0xC8}, diff --git a/src/conio/vidmodes.h b/src/conio/vidmodes.h index 411cd22be8f6efd9848a6fb86e64075257df71a0..634fcde70a1ec3e73b588b4e7bd7a727406e07b3 100644 --- a/src/conio/vidmodes.h +++ b/src/conio/vidmodes.h @@ -118,11 +118,12 @@ enum { ,COLOUR_PALETTE ,C64_PALETTE ,ATARI_PALETTE + ,PRESTEL_PALETTE }; -extern struct video_params vparams[56]; +extern struct video_params vparams[57]; #define NUMMODES (sizeof(vparams) / sizeof(struct video_params)) -extern uint32_t palettes[5][16]; +extern uint32_t palettes[6][16]; extern struct dac_colors dac_default[TOTAL_DAC_SIZE]; extern char vga_font_bitmap[4096]; extern char vga_font_bitmap14[3584]; diff --git a/src/syncterm/bbslist.c b/src/syncterm/bbslist.c index 6ea9f124b71b11dc682b89e8a102d9f12f215b81..04b925313cb2075d3714327cae50b6822dc8894d 100644 --- a/src/syncterm/bbslist.c +++ b/src/syncterm/bbslist.c @@ -233,12 +233,12 @@ int sortorder[sizeof(sort_order) / sizeof(struct sort_ static char *screen_modes[] = { "Current", "80x25", "LCD 80x25", "80x28", "80x30", "80x43", "80x50", "80x60", "132x37 (16:9)", "132x52 (5:4)", "132x25", "132x28", "132x30", "132x34", "132x43", "132x50", "132x60", "C64", "C128 (40col)", "C128 (80col)", - "Atari", "Atari XEP80", "Custom", "EGA 80x25", "VGA 80x25", NULL + "Atari", "Atari XEP80", "Custom", "EGA 80x25", "VGA 80x25", "Prestel", NULL }; char *screen_modes_enum[] = { "Current", "80x25", "LCD80x25", "80x28", "80x30", "80x43", "80x50", "80x60", "132x37", "132x52", "132x25", "132x28", "132x30", "132x34", "132x43", "132x50", "132x60", "C64", "C128-40col", "C128-80col", "Atari", - "Atari-XEP80", "Custom", "EGA80x25", "VGA80x25", NULL + "Atari-XEP80", "Custom", "EGA80x25", "VGA80x25", "Prestel", NULL }; char *log_levels[] = { @@ -1579,9 +1579,20 @@ edit_list(struct bbslist **list, struct bbslist *item, char *listpath, int isdef item->nostatus, &ini_style); } + else if (item->screen_mode == SCREEN_MODE_PRESTEL) { + SAFECOPY(item->font, font_names[43]); + iniSetString(&inifile, itemname, "Font", item->font, + &ini_style); + item->nostatus = 1; + iniSetBool(&inifile, + itemname, + "NoStatus", + item->nostatus, + &ini_style); + } else if ((i == SCREEN_MODE_C64) || (i == SCREEN_MODE_C128_40) || (i == SCREEN_MODE_C128_80) || (i == SCREEN_MODE_ATARI) - || (i == SCREEN_MODE_ATARI_XEP80)) { + || (i == SCREEN_MODE_ATARI_XEP80) || (i == SCREEN_MODE_PRESTEL)) { SAFECOPY(item->font, font_names[0]); iniSetString(&inifile, itemname, "Font", item->font, &ini_style); @@ -3495,6 +3506,8 @@ get_emulation(struct bbslist *bbs) case SCREEN_MODE_ATARI: case SCREEN_MODE_ATARI_XEP80: return CTERM_EMULATION_ATASCII; + case SCREEN_MODE_PRESTEL: + return CTERM_EMULATION_PRESTEL; default: return CTERM_EMULATION_ANSI_BBS; } @@ -3510,6 +3523,8 @@ get_emulation_str(cterm_emulation_t emu) return "PETSCII"; case CTERM_EMULATION_ATASCII: return "ATASCII"; + case CTERM_EMULATION_PRESTEL: + return "Prestel"; } return "none"; } diff --git a/src/syncterm/bbslist.h b/src/syncterm/bbslist.h index e1c9406e44814c2025dfaa6598571db8b40ce17a..29c1dfe2b6714fedbd9ee4825d261803e731c0a9 100644 --- a/src/syncterm/bbslist.h +++ b/src/syncterm/bbslist.h @@ -88,6 +88,8 @@ enum { , SCREEN_MODE_VGA_80X25 , + SCREEN_MODE_PRESTEL + , SCREEN_MODE_TERMINATOR }; diff --git a/src/syncterm/syncterm.c b/src/syncterm/syncterm.c index 3f7397b650b0c7688918c3e737355b019c5d64d2..3101cfc9f37b3863824c5f21413f31954c7e5e0f 100644 --- a/src/syncterm/syncterm.c +++ b/src/syncterm/syncterm.c @@ -2265,6 +2265,8 @@ screen_to_ciolib(int screen) return EGA80X25; case SCREEN_MODE_VGA_80X25: return VGA80X25; + case SCREEN_MODE_PRESTEL: + return PRESTEL_40X24; } gettextinfo(&ti); return ti.currmode; @@ -2320,6 +2322,8 @@ ciolib_to_screen(int ciolib) return SCREEN_MODE_CUSTOM; case EGA80X25: return SCREEN_MODE_EGA_80X25; + case PRESTEL_40X24: + return SCREEN_MODE_PRESTEL; } return SCREEN_MODE_CURRENT; } diff --git a/src/syncterm/term.c b/src/syncterm/term.c index d5ab686ffff17a89d753e6fba6ebe7d00e867971..39a4c992278da40e255a874b36d2ac1122d6a712 100644 --- a/src/syncterm/term.c +++ b/src/syncterm/term.c @@ -4413,6 +4413,51 @@ doterm(struct bbslist *bbs) break; } } + else if (key && (cterm->emulation == CTERM_EMULATION_PRESTEL)) { + switch (key) { + case '#': + ch[0] = '_'; + conn_send(ch, 1, 0); + break; + // TODO: Can send control chars instead... + case 8: + case CIO_KEY_DC: + case CIO_KEY_LEFT: + ch[0] = 8; + conn_send(ch, 1, 0); + break; + case CIO_KEY_RIGHT: + ch[0] = 9; + conn_send(ch, 1, 0); + break; + case CIO_KEY_UP: + ch[0] = 11; + conn_send(ch, 1, 0); + break; + case CIO_KEY_DOWN: + ch[0] = 10; + conn_send(ch, 1, 0); + break; + case CIO_KEY_HOME: + ch[0] = 0x1f; + conn_send(ch, 1, 0); + break; + case '_': + ch[0] = '`'; + conn_send(ch, 1, 0); + break; + // TODO: Map £ ('#'), ½ (\), ¼ ({), ¾ (}), ÷ (~) + // TODO: Add Reveal key + // TODO: Add clear screen key + // TODO: Make return # or some shit... + default: + if (key == 13 || (key < 129 && key > 31)) { + ch[0] = key; + conn_send(ch, 1, 0); + } + break; + } + } else if (key) { switch (key) { case CIO_KEY_LEFT: