commit 7ee21c7d1a90e5b1bf1a815478dc2c622513c587 Author: Thomas Cherryhomes Date: Fri Jan 25 16:09:42 2019 -0600 Initial commit. Builds to skeleton. diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..cc1d68c --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,25 @@ + +# To use this example as a standalone project using CMake: +# mkdir build +# cd build +# cmake .. -DCMAKE_TOOLCHAIN_FILE=path/to/Retro68-build/toolchain/m68k-apple-macos/cmake/retro68.toolchain.cmake +# make + +cmake_minimum_required(VERSION 2.8) + +add_application(PLATOTERM + help.c + io.c + keyboard.c + main.c + protocol.c + screen.c + terminal.c + touch.c + trace.c + ) +target_link_libraries(PLATOTERM "-lm") + +# save 200KB of code by removing unused stuff +set_target_properties(PLATOTERM PROPERTIES LINK_FLAGS "-Wl,-gc-sections") + diff --git a/build.sh b/build.sh new file mode 100755 index 0000000..b5842e5 --- /dev/null +++ b/build.sh @@ -0,0 +1,4 @@ +#!/bin/bash + +rm -rf build && mkdir build && cd build +cmake .. -DCMAKE_TOOLCHAIN_FILE=~/Retro68/Retro68build/toolchain/m68k-apple-macos/cmake/retro68.toolchain.cmake && make && cp PLATOTERM.dsk /mnt/d/BasiliskII/ diff --git a/font.h b/font.h new file mode 100644 index 0000000..74e280b --- /dev/null +++ b/font.h @@ -0,0 +1,486 @@ +/** + * Font definitions for font memories M0 and M1 + */ + +unsigned char font[]={ +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 0x20 space */ +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + +0x00,0x00,0x00,0x10,0x10,0x10,0x10,0x10, /* 0x21 ! */ +0x10,0x00,0x00,0x10,0x00,0x00,0x00,0x00, + +0x00,0x00,0x00,0x28,0x28,0x28,0x00,0x00, /* 0x22 " */ +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + +0x00,0x00,0x00,0x28,0x28,0xfe,0x28,0xfe, /* 0x23 # */ +0x28,0x28,0x00,0x00,0x00,0x00,0x00,0x00, + +0x00,0x00,0x00,0x10,0x7c,0x92,0x90,0x7c, /* 0x24 $ */ +0x12,0x92,0x7c,0x10,0x00,0x00,0x00,0x00, + +0x00,0x00,0x00,0x40,0xa2,0xa4,0x48,0x10, /* 0x25 % */ +0x24,0x4a,0x8a,0x04,0x00,0x00,0x00,0x00, + +0x00,0x00,0x00,0x20,0x50,0x50,0x20,0x62, /* 0x26 & */ +0x92,0x8c,0x8c,0x72,0x00,0x00,0x00,0x00, + +0x00,0x00,0x00,0x10,0x10,0x10,0x00,0x00, /* 0x27 ' */ +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + +0x00,0x00,0x00,0x02,0x04,0x08,0x08,0x08, /* 0x28 ( */ +0x08,0x08,0x08,0x04,0x02,0x00,0x00,0x00, + +0x00,0x00,0x00,0x80,0x40,0x20,0x20,0x20, /* 0x29 ) */ +0x20,0x20,0x20,0x40,0x80,0x00,0x00,0x00, + +0x00,0x00,0x00,0x00,0x00,0x10,0x54,0x28, /* 0x2a * */ +0x28,0x54,0x10,0x00,0x00,0x00,0x00,0x00, + +0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x10, /* 0x2b + */ +0x7c,0x10,0x10,0x00,0x00,0x00,0x00,0x00, + +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 0x2c , */ +0x00,0x00,0x30,0x30,0x10,0x20,0x00,0x00, + +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 0x2d - */ +0x7c,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 0x2e . */ +0x00,0x00,0x30,0x30,0x00,0x00,0x00,0x00, + +0x00,0x00,0x00,0x00,0x00,0x02,0x04,0x08, /* 0x2f / */ +0x10,0x20,0x40,0x80,0x00,0x00,0x00,0x00, + +0x00,0x00,0x00,0x00,0x3a,0x44,0x4c,0x54, /* 0x30 0 */ +0x54,0x64,0x44,0xb8,0x00,0x00,0x00,0x00, + +0x00,0x00,0x00,0x00,0x10,0x30,0x10,0x10, /* 0x31 1 */ +0x10,0x10,0x10,0x38,0x00,0x00,0x00,0x00, + +0x00,0x00,0x00,0x00,0x38,0x44,0x04,0x08, /* 0x32 2 */ +0x10,0x20,0x40,0x7c,0x00,0x00,0x00,0x00, + +0x00,0x00,0x00,0x00,0x38,0x44,0x04,0x18, /* 0x33 3 */ +0x04,0x04,0x44,0x38,0x00,0x00,0x00,0x00, + +0x00,0x00,0x00,0x00,0x04,0x0c,0x14,0x24, /* 0x34 4 */ +0x7e,0x04,0x04,0x04,0x00,0x00,0x00,0x00, + +0x00,0x00,0x00,0x00,0x7c,0x40,0x40,0x78, /* 0x35 5 */ +0x04,0x04,0x08,0x70,0x00,0x00,0x00,0x00, + +0x00,0x00,0x00,0x00,0x18,0x20,0x40,0x78, /* 0x36 6 */ +0x44,0x44,0x44,0x38,0x00,0x00,0x00,0x00, + +0x00,0x00,0x00,0x00,0x7c,0x04,0x08,0x08, /* 0x37 7 */ +0x10,0x10,0x20,0x20,0x00,0x00,0x00,0x00, + +0x00,0x00,0x00,0x00,0x38,0x44,0x44,0x38, /* 0x38 8 */ +0x44,0x44,0x44,0x38,0x00,0x00,0x00,0x00, + +0x00,0x00,0x00,0x00,0x38,0x44,0x44,0x44, /* 0x39 9 */ +0x3c,0x04,0x08,0x30,0x00,0x00,0x00,0x00, + +0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30, /* 0x3a : */ +0x00,0x00,0x30,0x30,0x00,0x00,0x00,0x00, + +0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30, /* 0x3b ; */ +0x00,0x00,0x30,0x30,0x10,0x20,0x00,0x00, + +0x00,0x00,0x00,0x00,0x00,0x08,0x10,0x20, /* 0x3c < */ +0x40,0x20,0x10,0x08,0x00,0x00,0x00,0x00, + +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7c, /* 0x3d = */ +0x00,0x7c,0x00,0x00,0x00,0x00,0x00,0x00, + +0x00,0x00,0x00,0x00,0x00,0x20,0x10,0x08, /* 0x3e > */ +0x04,0x08,0x10,0x20,0x00,0x00,0x00,0x00, + +0x00,0x00,0x00,0x38,0x44,0x44,0x04,0x08, /* 0x3f ? */ +0x10,0x10,0x00,0x10,0x00,0x00,0x00,0x00, + +0x00,0x00,0x00,0x00,0x00,0x38,0x44,0x9a, /* 0x40 @ */ +0xaa,0xaa,0x9c,0x40,0x38,0x00,0x00,0x00, + +0x00,0x00,0x00,0x38,0x44,0x82,0x82,0xfe, /* 0x41 A */ +0x82,0x82,0x82,0x82,0x00,0x00,0x00,0x00, + +0x00,0x00,0x00,0xf8,0x84,0x84,0xfc,0x82, /* 0x42 B */ +0x82,0x82,0x82,0xfc,0x00,0x00,0x00,0x00, + +0x00,0x00,0x00,0x3c,0x42,0x80,0x80,0x80, /* 0x43 C */ +0x80,0x80,0x42,0x3c,0x00,0x00,0x00,0x00, + +0x00,0x00,0x00,0xf0,0x88,0x84,0x84,0x84, /* 0x44 D */ +0x84,0x84,0x88,0xf0,0x00,0x00,0x00,0x00, + +0x00,0x00,0x00,0xfe,0x80,0x80,0x80,0xf8, /* 0x45 E */ +0x80,0x80,0x80,0xfe,0x00,0x00,0x00,0x00, + +0x00,0x00,0x00,0xfe,0x80,0x80,0x80,0xf0, /* 0x46 F */ +0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x00, + +0x00,0x00,0x00,0x3c,0x42,0x80,0x80,0x80, /* 0x47 G */ +0x8e,0x82,0x42,0x3c,0x00,0x00,0x00,0x00, + +0x00,0x00,0x00,0x82,0x82,0x82,0x82,0xfe, /* 0x48 H */ +0x82,0x82,0x82,0x82,0x00,0x00,0x00,0x00, + +0x00,0x00,0x00,0x7c,0x10,0x10,0x10,0x10, /* 0x49 I */ +0x10,0x10,0x10,0x7c,0x00,0x00,0x00,0x00, + +0x00,0x00,0x00,0x3e,0x08,0x08,0x08,0x08, /* 0x4a J */ +0x08,0x08,0x88,0x70,0x00,0x00,0x00,0x00, + +0x00,0x00,0x00,0x82,0x84,0x88,0x90,0xa0, /* 0x4b K */ +0xd0,0x88,0x84,0x82,0x00,0x00,0x00,0x00, + +0x00,0x00,0x00,0x80,0x80,0x80,0x80,0x80, /* 0x4c L */ +0x80,0x80,0x80,0xfe,0x00,0x00,0x00,0x00, + +0x00,0x00,0x00,0x82,0xc6,0xaa,0x92,0x82, /* 0x4d M */ +0x82,0x82,0x82,0x82,0x00,0x00,0x00,0x00, + +0x00,0x00,0x00,0x82,0xc2,0xa2,0xa2,0x92, /* 0x4e N */ +0x8a,0x8a,0x86,0x82,0x00,0x00,0x00,0x00, + +0x00,0x00,0x00,0x38,0x44,0x82,0x82,0x82, /* 0x4f O */ +0x82,0x82,0x44,0x38,0x00,0x00,0x00,0x00, + +0x00,0x00,0x00,0xfc,0x82,0x82,0x82,0xfc, /* 0x50 P */ +0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x00, + +0x00,0x00,0x00,0x38,0x44,0x82,0x82,0x82, /* 0x51 Q */ +0x82,0x82,0x44,0x38,0x10,0x0c,0x00,0x00, + +0x00,0x00,0x00,0xfc,0x82,0x82,0x82,0xfc, /* 0x52 R */ +0x90,0x88,0x84,0x82,0x00,0x00,0x00,0x00, + +0x00,0x00,0x00,0x7c,0x82,0x80,0x80,0x7c, /* 0x53 S */ +0x02,0x02,0x82,0x7c,0x00,0x00,0x00,0x00, + +0x00,0x00,0x00,0xfe,0x10,0x10,0x10,0x10, /* 0x54 T */ +0x10,0x10,0x10,0x10,0x00,0x00,0x00,0x00, + +0x00,0x00,0x00,0x82,0x82,0x82,0x82,0x82, /* 0x55 U */ +0x82,0x82,0x82,0x7c,0x00,0x00,0x00,0x00, + +0x00,0x00,0x00,0x82,0x82,0x44,0x44,0x44, /* 0x56 V */ +0x28,0x28,0x10,0x10,0x00,0x00,0x00,0x00, + +0x00,0x00,0x00,0x82,0x82,0x82,0x92,0x92, /* 0x57 W */ +0x92,0x92,0xaa,0x44,0x00,0x00,0x00,0x00, + +0x00,0x00,0x00,0x82,0x82,0x44,0x28,0x10, /* 0x58 X */ +0x28,0x44,0x82,0x82,0x00,0x00,0x00,0x00, + +0x00,0x00,0x00,0x82,0x82,0x44,0x28,0x10, /* 0x59 Y */ +0x10,0x10,0x10,0x10,0x10,0x00,0x00,0x00, + +0x00,0x00,0x00,0xfe,0x82,0x04,0x08,0x10, /* 0x5a Z */ +0x20,0x40,0x82,0xfe,0x00,0x00,0x00,0x00, + +0x00,0x00,0x00,0x0e,0x08,0x08,0x08,0x08, /* 0x5b [ */ +0x08,0x08,0x08,0x08,0x0e,0x00,0x00,0x00, + +0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x40, /* 0x5c \ */ +0x20,0x10,0x08,0x04,0x02,0x00,0x00,0x00, + +0x00,0x00,0x00,0xe0,0x20,0x20,0x20,0x20, /* 0x5d ] */ +0x20,0x20,0x20,0x20,0xe0,0x00,0x00,0x00, + +0x00,0x10,0x28,0x44,0x00,0x00,0x00,0x00, /* 0x5e ^ */ +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 0x5f _ */ +0x00,0x00,0x00,0x00,0x00,0xfe,0x00,0x00, + +0x00,0x40,0x20,0x10,0x00,0x00,0x00,0x00, /* 0x60 ` */ +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + +0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x04, /* 0x61 a */ +0x7c,0x84,0x84,0x7a,0x00,0x00,0x00,0x00, + +0x00,0x00,0x00,0x80,0x80,0x80,0xb8,0xc4, /* 0x62 b */ +0x82,0x82,0xc4,0xb8,0x00,0x00,0x00,0x00, + +0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0x42, /* 0x63 c */ +0x80,0x80,0x42,0x3c,0x00,0x00,0x00,0x00, + +0x00,0x00,0x00,0x02,0x02,0x02,0x3a,0x46, /* 0x64 d */ +0x82,0x82,0x46,0x3a,0x00,0x00,0x00,0x00, + +0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0x42, /* 0x65 e */ +0xfe,0x80,0x40,0x3e,0x00,0x00,0x00,0x00, + +0x00,0x00,0x00,0x0c,0x12,0x10,0x38,0x10, /* 0x66 f */ +0x10,0x10,0x10,0x38,0x00,0x00,0x00,0x00, + +0x00,0x00,0x00,0x00,0x00,0x00,0x7a,0x84, /* 0x67 g */ +0x84,0x78,0x80,0x7c,0x82,0x7c,0x00,0x00, + +0x00,0x00,0x00,0xc0,0x40,0x40,0x5c,0x62, /* 0x68 h */ +0x42,0x42,0x42,0x42,0x00,0x00,0x00,0x00, + +0x00,0x00,0x00,0x10,0x00,0x00,0x30,0x10, /* 0x69 i */ +0x10,0x10,0x10,0x38,0x00,0x00,0x00,0x00, + +0x00,0x00,0x00,0x10,0x00,0x00,0x30,0x10, /* 0x6a j */ +0x10,0x10,0x10,0x10,0x10,0x10,0x60,0x00, + +0x00,0x00,0x00,0xc0,0x40,0x40,0x4c,0x50, /* 0x6b k */ +0x60,0x50,0x48,0xc6,0x00,0x00,0x00,0x00, + +0x00,0x00,0x00,0x30,0x10,0x10,0x10,0x10, /* 0x6c l */ +0x10,0x10,0x10,0x38,0x00,0x00,0x00,0x00, + +0x00,0x00,0x00,0x00,0x00,0x00,0xec,0x92, /* 0x6d m */ +0x92,0x92,0x92,0x92,0x00,0x00,0x00,0x00, + +0x00,0x00,0x00,0x00,0x00,0x00,0xdc,0x62, /* 0x6e n */ +0x42,0x42,0x42,0x42,0x00,0x00,0x00,0x00, + +0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x44, /* 0x6f o */ +0x82,0x82,0x44,0x38,0x00,0x00,0x00,0x00, + +0x00,0x00,0x00,0x00,0x00,0x00,0xb8,0xc4, /* 0x70 p */ +0x82,0x82,0xc4,0xb8,0x80,0x80,0x80,0x00, + +0x00,0x00,0x00,0x00,0x00,0x00,0x3a,0x46, /* 0x71 q */ +0x82,0x82,0x46,0x3a,0x02,0x02,0x02,0x00, + +0x00,0x00,0x00,0x00,0x00,0x00,0xdc,0x62, /* 0x72 r */ +0x40,0x40,0x40,0x40,0x00,0x00,0x00,0x00, + +0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0x80, /* 0x73 s */ +0x7c,0x02,0x82,0x7c,0x00,0x00,0x00,0x00, + +0x00,0x00,0x00,0x20,0x20,0x20,0xfc,0x20, /* 0x74 t */ +0x20,0x20,0x20,0x1c,0x00,0x00,0x00,0x00, + +0x00,0x00,0x00,0x00,0x00,0x00,0x84,0x84, /* 0x75 u */ +0x84,0x84,0x84,0x7a,0x00,0x00,0x00,0x00, + +0x00,0x00,0x00,0x00,0x00,0x00,0xc6,0x44, /* 0x76 v */ +0x28,0x28,0x10,0x10,0x00,0x00,0x00,0x00, + +0x00,0x00,0x00,0x00,0x00,0x00,0x82,0x92, /* 0x77 w */ +0x92,0x92,0xaa,0x44,0x00,0x00,0x00,0x00, + +0x00,0x00,0x00,0x00,0x00,0x00,0xc2,0x24, /* 0x78 x */ +0x18,0x18,0x24,0x42,0x00,0x00,0x00,0x00, + +0x00,0x00,0x00,0x00,0x00,0x00,0x82,0x82, /* 0x79 y */ +0x82,0x44,0x28,0x10,0x20,0x40,0x80,0x00, + +0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x88, /* 0x7a z */ +0x10,0x20,0x44,0xfc,0x00,0x00,0x00,0x00, + +0x00,0x00,0x00,0x06,0x08,0x08,0x08,0x08, /* 0x7b { */ +0x10,0x08,0x08,0x08,0x08,0x06,0x00,0x00, + +0x00,0x00,0x00,0x38,0x38,0x38,0x38,0x00, /* 0x7c | */ +0x38,0x38,0x38,0x38,0x00,0x00,0x00,0x00, + +0x00,0x00,0x00,0xc0,0x20,0x20,0x20,0x20, /* 0x7d } */ +0x10,0x20,0x20,0x20,0x20,0xc0,0x00,0x00, + +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 0x7e ~ */ +0x32,0x4c,0x00,0x00,0x00,0x00,0x00,0x00, + +0x00,0x00,0x00,0x7c,0x7c,0x7c,0x7c,0x7c, /* 0x7f box */ +0x7c,0x7c,0x00,0x00,0x00,0x00,0x00,0x00, + +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 0xa0 space */ +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + +0x00,0x00,0x00,0x00,0x00,0x02,0x04,0x08, /* 0xa1 ! = slant */ +0x10,0x20,0x40,0x80,0x00,0x00,0x00,0x00, + +0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0x00, /* 0xa2 " = equivalent */ +0x7c,0x00,0x7c,0x00,0x00,0x00,0x00,0x00, + +0x00,0x00,0x32,0x4c,0x00,0x00,0x00,0x00, /* 0xa3 # = tilde */ +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + +0x00,0x00,0x00,0x00,0x00,0x10,0x30,0x5e, /* 0xa4 $ = assignment */ +0x80,0x5e,0x30,0x10,0x00,0x00,0x00,0x00, + +0x00,0x00,0x00,0x00,0x00,0x02,0x04,0xfe, /* 0xa5 % = not equal */ +0x10,0xfe,0x40,0x80,0x00,0x00,0x00,0x00, + +0x00,0x00,0x00,0x00,0x00,0x10,0x38,0x7c, /* 0xa6 & = up arrow */ +0x10,0x10,0x10,0x10,0x00,0x00,0x00,0x00, + +0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x0c, /* 0xa7 ' = right arrow */ +0xfe,0x0c,0x08,0x00,0x00,0x00,0x00,0x00, + +0x00,0x00,0x00,0x00,0x00,0x10,0x10,0x10, /* 0xa8 ( = down arrow */ +0x10,0x7c,0x38,0x10,0x00,0x00,0x00,0x00, + +0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x60, /* 0xa9 ) = left arrow */ +0xfe,0x60,0x20,0x00,0x00,0x00,0x00,0x00, + +0x00,0x00,0x00,0x00,0x00,0x00,0x24,0x18, /* 0xaa * = multiply */ +0x18,0x24,0x00,0x00,0x00,0x00,0x00,0x00, + +0x00,0x00,0x00,0xfe,0x40,0x20,0x10,0x08, /* 0xab + = cap sigma */ +0x10,0x20,0x40,0xfe,0x00,0x00,0x00,0x00, + +0x00,0x00,0x00,0x00,0x10,0x10,0x28,0x28, /* 0xac , = cap delta */ +0x44,0x44,0x82,0xfe,0x00,0x00,0x00,0x00, + +0x00,0x00,0x00,0x00,0x00,0x00,0x44,0x44, /* 0xad - = union */ +0x44,0x38,0x00,0x00,0x00,0x00,0x00,0x00, + +0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x44, /* 0xae . = intersection */ +0x44,0x44,0x00,0x00,0x00,0x00,0x00,0x00, + +0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00, /* 0xaf / = divide */ +0x7c,0x00,0x10,0x00,0x00,0x00,0x00,0x00, + +0x00,0x00,0x00,0x00,0x00,0x00,0x62,0x92, /* 0xb0 0 = alpha */ +0x94,0x88,0x98,0x66,0x00,0x00,0x00,0x00, + +0x00,0x00,0x00,0x00,0x18,0x24,0x44,0x78, /* 0xb1 1 = beta */ +0x44,0x42,0x42,0x7c,0x40,0x40,0x80,0x00, + +0x00,0x00,0x00,0x30,0x48,0x44,0x20,0x30, /* 0xb2 2 = delta */ +0x48,0x44,0x44,0x38,0x00,0x00,0x00,0x00, + +0x00,0x00,0x00,0x40,0x20,0x20,0x10,0x10, /* 0xb3 3 = lambda */ +0x28,0x28,0x44,0x44,0x00,0x00,0x00,0x00, + +0x00,0x00,0x00,0x00,0x00,0x00,0x24,0x24, /* 0xb4 4 = micro */ +0x24,0x24,0x24,0x3a,0x20,0x20,0xc0,0x00, + +0x00,0x00,0x00,0x00,0x00,0x02,0x7c,0xa8, /* 0xb5 5 = pi */ +0x28,0x28,0x28,0x28,0x00,0x00,0x00,0x00, + +0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0x12, /* 0xb6 6 = rho */ +0x22,0x22,0x64,0x58,0x40,0x80,0x80,0x00, + +0x00,0x00,0x00,0x00,0x00,0x00,0x3e,0x50, /* 0xb7 7 = sigma */ +0x88,0x88,0x88,0x70,0x00,0x00,0x00,0x00, + +0x00,0x00,0x00,0x00,0x00,0x00,0x44,0x82, /* 0xb8 8 = omega */ +0x92,0x92,0x92,0x6c,0x00,0x00,0x00,0x00, + +0x00,0x00,0x00,0x00,0x0c,0x30,0xc0,0x30, /* 0xb9 9 = less than or equal */ +0x0c,0x00,0xfc,0x00,0x00,0x00,0x00,0x00, + +0x00,0x00,0x00,0x00,0x60,0x18,0x06,0x18, /* 0xba : = greater than or equal */ +0x60,0x00,0x7e,0x00,0x00,0x00,0x00,0x00, + +0x00,0x00,0x00,0x38,0x44,0x82,0x82,0xfe, /* 0xbb ; = cap theta */ +0x82,0x82,0x44,0x38,0x00,0x00,0x00,0x00, + +0x00,0x00,0x00,0x02,0x04,0x08,0x18,0x28, /* 0xbc < = left embed */ +0x48,0x28,0x18,0x0c,0x02,0x00,0x00,0x00, + +0x00,0x00,0x00,0x30,0x48,0x48,0x30,0x00, /* 0xbd = = degree */ +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + +0x00,0x00,0x00,0x80,0x40,0x20,0x30,0x28, /* 0xbe > = right embed */ +0x24,0x28,0x30,0x60,0x80,0x00,0x00,0x00, + +0x00,0x00,0x00,0xc0,0xa0,0x90,0x48,0x24, /* 0xbf ? = arrow */ +0x12,0x24,0x48,0x90,0xa0,0xc0,0x00,0x00, + +0x00,0x00,0xfe,0x00,0x00,0x3c,0x42,0x80, /* 0xc0 @ = center of copyright */ +0x80,0x42,0x3c,0x00,0x00,0xfe,0x00,0x00, + +0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x00, /* 0xc1 A = umlaut */ +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + +0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0x44, /* 0xc2 B = box */ +0x44,0x7c,0x00,0x00,0x00,0x00,0x00,0x00, + +0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x48, /* 0xc3 C = dot product */ +0x48,0x30,0x00,0x00,0x00,0x00,0x00,0x00, + +0x00,0x00,0x00,0x00,0x00,0x10,0x38,0x7c, /* 0xc4 D = diamond */ +0xfe,0x7c,0x38,0x10,0x00,0x00,0x00,0x00, + +0x00,0x00,0x00,0x00,0x00,0x82,0x44,0x28, /* 0xc5 E = cross product */ +0x10,0x28,0x44,0x82,0x00,0x00,0x00,0x00, + +0x00,0x04,0x08,0x10,0x00,0x00,0x00,0x00, /* 0xc6 F = acute accent */ +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 0xc7 G = cedilla */ +0x00,0x00,0x00,0x04,0x08,0x10,0x00,0x00, + +0x00,0x44,0x28,0x10,0x00,0x00,0x00,0x00, /* 0xc8 H = hacek */ +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + +0x00,0x00,0x00,0x00,0x00,0x10,0x38,0x7c, /* 0xc9 I = universal separator */ +0x10,0x7c,0x38,0x10,0x00,0x00,0x00,0x00, + +0x00,0x00,0x00,0x10,0x10,0x10,0x10,0x10, /* 0xca J = vertical bar */ +0x10,0x10,0x10,0x10,0x00,0x00,0x00,0x00, + +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 0xcb K */ +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 0xcc L */ +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 0xcd M */ +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 0xce N */ +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 0xcf O */ +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 0xd0 P */ +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 0xd1 Q */ +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 0xd2 R */ +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 0xd3 S */ +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 0xd4 T */ +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 0xd5 U */ +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 0xd6 V */ +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 0xd7 W */ +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 0xd8 X */ +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 0xd9 Y */ +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 0xda Z */ +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 0xdb [ */ +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 0xdc \ */ +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 0xdd ] */ +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 0xde ^ */ +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 0xdf _ */ +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 +}; + diff --git a/help.c b/help.c new file mode 100644 index 0000000..5f43cee --- /dev/null +++ b/help.c @@ -0,0 +1,3367 @@ +#include "help.h" +#include "screen.h" + +/** + * Help screen PLATO stream, drawn to page 2 + */ +padByte help[] = + { + 0x1b, + 0x02, +0x1b, +0x0c, +0x1b, +0x12, +0x1b, +0xd1, +0xc0, +0x50, +0xc0, +0x1b, +0xe1, +0xff, +0xff, +0xff, +0xff, +0xff, +0xff, +0xff, +0xff, +0x1b, +0xe2, +0xc0, +0xc0, +0xc0, +0xc0, +0x1b, +0x0c, +0x1b, +0x12, +0x1d, +0xaf, +0xf0, +0xa0, +0xc0, +0x1b, +0x5a, +0x1b, +0xd1, +0xc0, +0x44, +0x41, +0x1d, +0x21, +0x60, +0x22, +0x50, +0x1b, +0x5a, +0x9f, +0x1b, +0x12, +0x1b, +0xcc, +0x1b, +0xcf, +0x1b, +0xca, +0x4b, +0xc5, +0x59, +0x42, +0xcf, +0x41, +0xd2, +0x44, +0xa0, +0x48, +0xc5, +0xcc, +0x50, +0x1d, +0x2e, +0xf0, +0xa0, +0xd8, +0x1b, +0x5a, +0x1b, +0xe1, +0xff, +0xff, +0xff, +0xff, +0xcf, +0xc0, +0x9f, +0x1b, +0x12, +0x1b, +0xcc, +0x1b, +0x4e, +0x1b, +0xca, +0x50, +0xcc, +0x41, +0xd4, +0xcf, +0xa0, +0xa0, +0x1b, +0xe1, +0xc0, +0xfc, +0xcf, +0xc0, +0x1b, +0x12, +0xd8, +0x36, +0xb8, +0x30, +0x30, +0x30, +0x1d, +0xf0, +0x24, +0x50, +0x1b, +0x5a, +0x1b, +0xe1, +0xff, +0xff, +0xff, +0xff, +0xcf, +0xc0, +0x9f, +0x1b, +0x12, +0x50, +0xcc, +0x41, +0xd4, +0xcf, +0xa0, +0xa0, +0x1b, +0xe1, +0xc0, +0xfc, +0xcf, +0xc0, +0x1b, +0x12, +0xd8, +0x36, +0xb8, +0x30, +0x30, +0x30, +0x1d, +0xf0, +0x28, +0x50, +0x1b, +0x5a, +0x1b, +0xe1, +0xff, +0xff, +0xff, +0xff, +0xcf, +0xc0, +0x9f, +0x1b, +0x12, +0x50, +0xcc, +0x41, +0xd4, +0xcf, +0xa0, +0xa0, +0x1b, +0xe1, +0xc0, +0xfc, +0xcf, +0xc0, +0x1b, +0x12, +0xd8, +0x36, +0xb8, +0x30, +0x30, +0x30, +0x1b, +0xe1, +0xff, +0xff, +0xc3, +0xc0, +0xc0, +0x1d, +0x22, +0x60, +0xa0, +0x50, +0x1b, +0x12, +0x60, +0x24, +0x48, +0x2e, +0xf0, +0x48, +0xf0, +0xa0, +0x50, +0x22, +0x60, +0x50, +0x1d, +0x60, +0x24, +0x48, +0x60, +0x28, +0x48, +0x2e, +0xf0, +0x48, +0xf0, +0x24, +0x48, +0x22, +0x60, +0x48, +0x1d, +0x60, +0x28, +0x48, +0x60, +0xac, +0x48, +0x2e, +0xf0, +0x48, +0xf0, +0x28, +0x48, +0x22, +0x60, +0x48, +0x1d, +0x2e, +0xf0, +0xa0, +0x50, +0xf0, +0x24, +0x48, +0xaf, +0x60, +0x48, +0x60, +0xa0, +0x50, +0x2e, +0xf0, +0x50, +0x1d, +0xf0, +0x24, +0x48, +0xf0, +0x28, +0x48, +0xaf, +0x60, +0x48, +0x60, +0x24, +0x48, +0x2e, +0xf0, +0x48, +0x1d, +0xf0, +0x28, +0x48, +0xf0, +0xac, +0x48, +0xaf, +0x60, +0x48, +0x60, +0x28, +0x48, +0x2e, +0xf0, +0x48, +0x1d, +0x2d, +0xf0, +0xa0, +0xd8, +0x1b, +0x5a, +0x1b, +0xe1, +0xff, +0xff, +0xff, +0xff, +0xcf, +0xc0, +0x9f, +0x1b, +0x12, +0x41, +0x4e, +0x53, +0xa0, +0xa0, +0xa0, +0xa0, +0x1b, +0xe1, +0xc0, +0xfc, +0xcf, +0xc0, +0x1b, +0x12, +0xc3, +0xd4, +0xd2, +0xcc, +0x2d, +0x41, +0x8d, +0x1b, +0xe1, +0xff, +0xff, +0xff, +0xff, +0xcf, +0xc0, +0x1b, +0x12, +0x42, +0x41, +0xc3, +0x4b, +0xa0, +0xa0, +0xa0, +0x1b, +0xe1, +0xc0, +0xfc, +0xcf, +0xc0, +0x1b, +0x12, +0xc3, +0xd4, +0xd2, +0xcc, +0x2d, +0x42, +0x8d, +0x1b, +0xe1, +0xff, +0xff, +0xff, +0xff, +0xcf, +0xc0, +0x1b, +0x12, +0xc3, +0xcf, +0x50, +0x59, +0xa0, +0xa0, +0xa0, +0x1b, +0xe1, +0xc0, +0xfc, +0xcf, +0xc0, +0x1b, +0x12, +0xc3, +0xd4, +0xd2, +0xcc, +0x2d, +0xc3, +0x8d, +0x1b, +0xe1, +0xff, +0xff, +0xff, +0xff, +0xcf, +0xc0, +0x1b, +0x12, +0x44, +0x41, +0xd4, +0x41, +0xa0, +0xa0, +0xa0, +0x1b, +0xe1, +0xc0, +0xfc, +0xcf, +0xc0, +0x1b, +0x12, +0xc3, +0xd4, +0xd2, +0xcc, +0x2d, +0x44, +0x8d, +0x1b, +0xe1, +0xff, +0xff, +0xff, +0xff, +0xcf, +0xc0, +0x1b, +0x12, +0xc5, +0x44, +0xc9, +0xd4, +0xa0, +0xa0, +0xa0, +0x1b, +0xe1, +0xc0, +0xfc, +0xcf, +0xc0, +0x1b, +0x12, +0xc3, +0xd4, +0xd2, +0xcc, +0x2d, +0xc5, +0x8d, +0x1b, +0xe1, +0xff, +0xff, +0xff, +0xff, +0xcf, +0xc0, +0x1b, +0x12, +0xc6, +0xcf, +0x4e, +0xd4, +0xa0, +0xa0, +0xa0, +0x1b, +0xe1, +0xc0, +0xfc, +0xcf, +0xc0, +0x1b, +0x12, +0xc3, +0xd4, +0xd2, +0xcc, +0x2d, +0xc6, +0x8d, +0x1b, +0xe1, +0xff, +0xff, +0xff, +0xff, +0xcf, +0xc0, +0x1b, +0x12, +0x1b, +0xc3, +0xaf, +0xa0, +0xa0, +0xa0, +0xa0, +0xa0, +0xa0, +0x1b, +0xe1, +0xc0, +0xfc, +0xcf, +0xc0, +0x1b, +0x12, +0x1b, +0x42, +0xc3, +0xd4, +0xd2, +0xcc, +0x2d, +0x47, +0x8d, +0x1b, +0xe1, +0xff, +0xff, +0xff, +0xff, +0xcf, +0xc0, +0x1b, +0x12, +0x48, +0xc5, +0xcc, +0x50, +0xa0, +0xa0, +0xa0, +0x1b, +0xe1, +0xc0, +0xfc, +0xcf, +0xc0, +0x1b, +0x12, +0xc3, +0xd4, +0xd2, +0xcc, +0x2d, +0x48, +0x8d, +0x1b, +0xe1, +0xff, +0xff, +0xff, +0xff, +0xcf, +0xc0, +0x1b, +0x12, +0x4d, +0xc9, +0xc3, +0xd2, +0xcf, +0xa0, +0xa0, +0x1b, +0xe1, +0xc0, +0xfc, +0xcf, +0xc0, +0x1b, +0x12, +0xc3, +0xd4, +0xd2, +0xcc, +0x2d, +0x4d, +0x8d, +0x1b, +0xe1, +0xff, +0xff, +0xff, +0xff, +0xcf, +0xc0, +0x1b, +0x12, +0x4d, +0xc9, +0xc3, +0xd2, +0xcf, +0xa0, +0xa0, +0x1b, +0xe1, +0xc0, +0xfc, +0xcf, +0xc0, +0x1b, +0x12, +0xc3, +0xd4, +0xd2, +0xcc, +0x2d, +0x4d, +0x8d, +0x1b, +0xe1, +0xff, +0xff, +0xff, +0xff, +0xcf, +0xc0, +0x1b, +0x12, +0x4e, +0xc5, +0xd8, +0xd4, +0xa0, +0xa0, +0xa0, +0x1b, +0xe1, +0xc0, +0xfc, +0xcf, +0xc0, +0x1b, +0x12, +0xc5, +0x4e, +0xd4, +0xc5, +0xd2, +0x8d, +0x1b, +0xe1, +0xff, +0xff, +0xff, +0xff, +0xcf, +0xc0, +0x1b, +0x12, +0x53, +0xd1, +0x55, +0xa0, +0xa0, +0xa0, +0xa0, +0x1b, +0xe1, +0xc0, +0xfc, +0xcf, +0xc0, +0x1b, +0x12, +0xc3, +0xd4, +0xd2, +0xcc, +0x2d, +0xd1, +0x8d, +0x1b, +0xe1, +0xff, +0xff, +0xff, +0xff, +0xcf, +0xc0, +0x1b, +0x12, +0xc5, +0xd2, +0x41, +0x53, +0xc5, +0xa0, +0xa0, +0x1b, +0xe1, +0xc0, +0xfc, +0xcf, +0xc0, +0x1b, +0x12, +0x42, +0x41, +0xc3, +0x4b, +0x53, +0x50, +0x8d, +0x1b, +0xe1, +0xff, +0xff, +0xff, +0xff, +0xcf, +0xc0, +0x1b, +0x12, +0x53, +0xd4, +0xcf, +0x50, +0xa0, +0xa0, +0xa0, +0x1b, +0xe1, +0xc0, +0xfc, +0xcf, +0xc0, +0x1b, +0x12, +0xc3, +0xd4, +0xd2, +0xcc, +0x2d, +0x53, +0x8d, +0x1b, +0xe1, +0xff, +0xff, +0xff, +0xff, +0xcf, +0xc0, +0x1b, +0x12, +0xd4, +0xc5, +0xd2, +0x4d, +0xa0, +0xa0, +0xa0, +0x1b, +0xe1, +0xc0, +0xfc, +0xcf, +0xc0, +0x1b, +0x12, +0xc3, +0xd4, +0xd2, +0xcc, +0x2d, +0xd4, +0x8d, +0x1b, +0xe1, +0xff, +0xff, +0xff, +0xff, +0xcf, +0xc0, +0x1b, +0x12, +0x53, +0x55, +0x50, +0xc5, +0xd2, +0xa0, +0xa0, +0x1b, +0xe1, +0xc0, +0xfc, +0xcf, +0xc0, +0x1b, +0x12, +0xc3, +0xd4, +0xd2, +0xcc, +0x2d, +0x50, +0x8d, +0x1b, +0xe1, +0xff, +0xff, +0xff, +0xff, +0xcf, +0xc0, +0x1b, +0x12, +0x53, +0x55, +0x42, +0xa0, +0xa0, +0xa0, +0xa0, +0x1b, +0xe1, +0xc0, +0xfc, +0xcf, +0xc0, +0x1b, +0x12, +0xc3, +0xd4, +0xd2, +0xcc, +0x2d, +0x59, +0x8d, +0x1b, +0xe1, +0xff, +0xff, +0xff, +0xff, +0xcf, +0xc0, +0x1b, +0x12, +0x53, +0xc9, +0x47, +0xa0, +0xa0, +0xa0, +0xa0, +0x1b, +0xe1, +0xc0, +0xfc, +0xcf, +0xc0, +0x1b, +0x12, +0xc3, +0xd4, +0xd2, +0xcc, +0x2d, +0x2b, +0x8d, +0x1b, +0xe1, +0xff, +0xff, +0xff, +0xff, +0xcf, +0xc0, +0x1b, +0x12, +0x44, +0xcc, +0xd4, +0xa0, +0xa0, +0xa0, +0xa0, +0x1b, +0xe1, +0xc0, +0xfc, +0xcf, +0xc0, +0x1b, +0x12, +0xc3, +0xd4, +0xd2, +0xcc, +0x2d, +0x2d, +0x8d, +0x1b, +0xe1, +0xff, +0xff, +0xff, +0xff, +0xcf, +0xc0, +0x1b, +0x12, +0x1b, +0xc3, +0x24, +0xa0, +0xa0, +0xa0, +0xa0, +0xa0, +0xa0, +0x1b, +0xe1, +0xc0, +0xfc, +0xcf, +0xc0, +0x1b, +0x12, +0x1b, +0x42, +0xc5, +0x53, +0xc3, +0x1d, +0xf0, +0x24, +0x50, +0x1b, +0x5a, +0x1b, +0xe1, +0xff, +0xff, +0xff, +0xff, +0xcf, +0xc0, +0x9f, +0x1b, +0x12, +0x1b, +0xc3, +0x30, +0xa0, +0xa0, +0xa0, +0xa0, +0xa0, +0xa0, +0x1b, +0xe1, +0xc0, +0xfc, +0xcf, +0xc0, +0x1b, +0x12, +0x1b, +0x42, +0x4d, +0xc9, +0xc3, +0xd2, +0xcf, +0xa0, +0xe1, +0x8d, +0x1b, +0xe1, +0xff, +0xff, +0xff, +0xff, +0xcf, +0xc0, +0x1b, +0x12, +0x1b, +0xc3, +0xb1, +0xa0, +0xa0, +0xa0, +0xa0, +0xa0, +0xa0, +0x1b, +0xe1, +0xc0, +0xfc, +0xcf, +0xc0, +0x1b, +0x12, +0x1b, +0x42, +0x4d, +0xc9, +0xc3, +0xd2, +0xcf, +0xa0, +0xe2, +0x8d, +0x1b, +0xe1, +0xff, +0xff, +0xff, +0xff, +0xcf, +0xc0, +0x1b, +0x12, +0xa0, +0x88, +0x1b, +0xc3, +0x47, +0xa0, +0xa0, +0xa0, +0xa0, +0xa0, +0xa0, +0x1b, +0xe1, +0xc0, +0xfc, +0xcf, +0xc0, +0x1b, +0x12, +0x1b, +0x42, +0x4d, +0xc9, +0xc3, +0xd2, +0xcf, +0xa0, +0x63, +0x8d, +0x1b, +0xe1, +0xff, +0xff, +0xff, +0xff, +0xcf, +0xc0, +0x1b, +0x12, +0x1b, +0xc3, +0xb2, +0xa0, +0xa0, +0xa0, +0xa0, +0xa0, +0xa0, +0x1b, +0xe1, +0xc0, +0xfc, +0xcf, +0xc0, +0x1b, +0x12, +0x1b, +0x42, +0x4d, +0xc9, +0xc3, +0xd2, +0xcf, +0xa0, +0xe4, +0x8d, +0x1b, +0xe1, +0xff, +0xff, +0xff, +0xff, +0xcf, +0xc0, +0x1b, +0x12, +0xa0, +0x88, +0x1b, +0xc3, +0xc6, +0xa0, +0xa0, +0xa0, +0xa0, +0xa0, +0xa0, +0x1b, +0xe1, +0xc0, +0xfc, +0xcf, +0xc0, +0x1b, +0x12, +0x1b, +0x42, +0x4d, +0xc9, +0xc3, +0xd2, +0xcf, +0xa0, +0x65, +0x8d, +0x1b, +0xe1, +0xff, +0xff, +0xff, +0xff, +0xcf, +0xc0, +0x1b, +0x12, +0xe1, +0x1d, +0x2b, +0x60, +0xd4, +0x9f, +0x65, +0xa0, +0xa0, +0xa0, +0xa0, +0xa0, +0xa0, +0x1b, +0xe1, +0xc0, +0xfc, +0xcf, +0xc0, +0x1b, +0x12, +0x4d, +0xc9, +0xc3, +0xd2, +0xcf, +0xa0, +0xe7, +0x8d, +0x1b, +0xe1, +0xff, +0xff, +0xff, +0xff, +0xcf, +0xc0, +0x1b, +0x12, +0x6f, +0x88, +0xaf, +0xa0, +0xa0, +0xa0, +0xa0, +0xa0, +0xa0, +0x1b, +0xe1, +0xc0, +0xfc, +0xcf, +0xc0, +0x1b, +0x12, +0x4d, +0xc9, +0xc3, +0xd2, +0xcf, +0xa0, +0xe8, +0x8d, +0x1b, +0xe1, +0xff, +0xff, +0xff, +0xff, +0xcf, +0xc0, +0x1b, +0x12, +0xe1, +0x88, +0x1d, +0xaa, +0xe2, +0x50, +0x9f, +0x1b, +0xc3, +0xbd, +0x1d, +0x60, +0xd8, +0x9f, +0xa0, +0xa0, +0xa0, +0xa0, +0xa0, +0xa0, +0x1b, +0xe1, +0xc0, +0xfc, +0xcf, +0xc0, +0x1b, +0x12, +0x1b, +0x42, +0x4d, +0xc9, +0xc3, +0xd2, +0xcf, +0xa0, +0x6a, +0x8d, +0x1b, +0xe1, +0xff, +0xff, +0xff, +0xff, +0xcf, +0xc0, +0x1b, +0x12, +0xe1, +0x88, +0x1b, +0xc3, +0x41, +0xa0, +0xa0, +0xa0, +0xa0, +0xa0, +0xa0, +0x1b, +0xe1, +0xc0, +0xfc, +0xcf, +0xc0, +0x1b, +0x12, +0x1b, +0x42, +0x4d, +0xc9, +0xc3, +0xd2, +0xcf, +0xa0, +0xeb, +0x8d, +0x1b, +0xe1, +0xff, +0xff, +0xff, +0xff, +0xcf, +0xc0, +0x1b, +0x12, +0x1b, +0xc3, +0x33, +0xa0, +0xa0, +0xa0, +0xa0, +0xa0, +0xa0, +0x1b, +0xe1, +0xc0, +0xfc, +0xcf, +0xc0, +0x1b, +0x12, +0x1b, +0x42, +0x4d, +0xc9, +0xc3, +0xd2, +0xcf, +0xa0, +0x6c, +0x8d, +0x1b, +0xe1, +0xff, +0xff, +0xff, +0xff, +0xcf, +0xc0, +0x1b, +0x12, +0x1b, +0xc3, +0xb4, +0xa0, +0xa0, +0xa0, +0xa0, +0xa0, +0xa0, +0x1b, +0xe1, +0xc0, +0xfc, +0xcf, +0xc0, +0x1b, +0x12, +0x1b, +0x42, +0x4d, +0xc9, +0xc3, +0xd2, +0xcf, +0xa0, +0xed, +0x8d, +0x1b, +0xe1, +0xff, +0xff, +0xff, +0xff, +0xcf, +0xc0, +0x1b, +0x12, +0xa0, +0x88, +0x1b, +0xc3, +0xa3, +0xa0, +0xa0, +0xa0, +0xa0, +0xa0, +0xa0, +0x1b, +0xe1, +0xc0, +0xfc, +0xcf, +0xc0, +0x1b, +0x12, +0x1b, +0x42, +0x4d, +0xc9, +0xc3, +0xd2, +0xcf, +0xa0, +0xee, +0x8d, +0x1b, +0xe1, +0xff, +0xff, +0xff, +0xff, +0xcf, +0xc0, +0x1b, +0x12, +0x1b, +0xc3, +0xbd, +0xa0, +0xa0, +0xa0, +0xa0, +0xa0, +0xa0, +0x1b, +0x59, +0x50, +0x41, +0xc0, +0x1b, +0xe1, +0xc0, +0xfc, +0xcf, +0xc0, +0x1b, +0x12, +0x1b, +0x42, +0x4d, +0xc9, +0xc3, +0xd2, +0xcf, +0xa0, +0x6f, +0x8d, +0x1b, +0xe1, +0xff, +0xff, +0xff, +0xff, +0xcf, +0xc0, +0x1b, +0x12, +0x1b, +0xc3, +0x35, +0xa0, +0xa0, +0xa0, +0xa0, +0xa0, +0xa0, +0x1b, +0xe1, +0xc0, +0xfc, +0xcf, +0xc0, +0x1b, +0x12, +0x1b, +0x42, +0x4d, +0xc9, +0xc3, +0xd2, +0xcf, +0xa0, +0xf0, +0x8d, +0x1b, +0xe1, +0xff, +0xff, +0xff, +0xff, +0xcf, +0xc0, +0x1b, +0x12, +0xa0, +0x88, +0x60, +0xa0, +0xa0, +0xa0, +0xa0, +0xa0, +0xa0, +0x1b, +0xe1, +0xc0, +0xfc, +0xcf, +0xc0, +0x1b, +0x12, +0x4d, +0xc9, +0xc3, +0xd2, +0xcf, +0xa0, +0x71, +0x8d, +0x1b, +0xe1, +0xff, +0xff, +0xff, +0xff, +0xcf, +0xc0, +0x1b, +0x12, +0x1b, +0xc3, +0x36, +0xa0, +0xa0, +0xa0, +0xa0, +0xa0, +0xa0, +0x1b, +0xe1, +0xc0, +0xfc, +0xcf, +0xc0, +0x1b, +0x12, +0x1b, +0x42, +0x4d, +0xc9, +0xc3, +0xd2, +0xcf, +0xa0, +0x72, +0x8d, +0x1b, +0xe1, +0xff, +0xff, +0xff, +0xff, +0xcf, +0xc0, +0x1b, +0x12, +0x1b, +0xc3, +0xb7, +0xa0, +0xa0, +0xa0, +0xa0, +0xa0, +0xa0, +0x1b, +0xe1, +0xc0, +0xfc, +0xcf, +0xc0, +0x1b, +0x12, +0x1b, +0x42, +0x4d, +0xc9, +0xc3, +0xd2, +0xcf, +0xa0, +0xf3, +0x8d, +0x1b, +0xe1, +0xff, +0xff, +0xff, +0xff, +0xcf, +0xc0, +0x1b, +0x12, +0x1b, +0xc3, +0xbb, +0xa0, +0xa0, +0xa0, +0xa0, +0xa0, +0xa0, +0x1b, +0xe1, +0xc0, +0xfc, +0xcf, +0xc0, +0x1b, +0x12, +0x1b, +0x42, +0x4d, +0xc9, +0xc3, +0xd2, +0xcf, +0xa0, +0x74, +0x8d, +0x1b, +0xe1, +0xff, +0xff, +0xff, +0xff, +0xcf, +0xc0, +0x1b, +0x12, +0xa0, +0x88, +0x1b, +0xc3, +0x41, +0xa0, +0xa0, +0xa0, +0xa0, +0xa0, +0xa0, +0x1b, +0xe1, +0xc0, +0xfc, +0xcf, +0xc0, +0x1b, +0x12, +0x1b, +0x42, +0x4d, +0xc9, +0xc3, +0xd2, +0xcf, +0xa0, +0xf5, +0x8d, +0x1b, +0xe1, +0xff, +0xff, +0xff, +0xff, +0xcf, +0xc0, +0x1b, +0x12, +0xa0, +0x88, +0x1b, +0xc3, +0x48, +0xa0, +0xa0, +0xa0, +0xa0, +0xa0, +0xa0, +0x1b, +0xe1, +0xc0, +0xfc, +0xcf, +0xc0, +0x1b, +0x12, +0x1b, +0x42, +0x4d, +0xc9, +0xc3, +0xd2, +0xcf, +0xa0, +0xf6, +0x8d, +0x1b, +0xe1, +0xff, +0xff, +0xff, +0xff, +0xcf, +0xc0, +0x1b, +0x12, +0x1b, +0xc3, +0xb8, +0xa0, +0xa0, +0xa0, +0xa0, +0xa0, +0xa0, +0x1b, +0xe1, +0xc0, +0xfc, +0xcf, +0xc0, +0x1b, +0x12, +0x1b, +0x42, +0x4d, +0xc9, +0xc3, +0xd2, +0xcf, +0xa0, +0x77, +0x8d, +0x1b, +0xe1, +0xff, +0xff, +0xff, +0xff, +0xcf, +0xc0, +0x1b, +0x12, +0xa0, +0x88, +0xde, +0xa0, +0xa0, +0xa0, +0xa0, +0xa0, +0xa0, +0x1b, +0xe1, +0xc0, +0xfc, +0xcf, +0xc0, +0x1b, +0x12, +0x4d, +0xc9, +0xc3, +0xd2, +0xcf, +0xa0, +0x78, +0x1d, +0x2d, +0xf0, +0x28, +0x50, +0x1b, +0x5a, +0x1b, +0xe1, +0xff, +0xff, +0xff, +0xff, +0xcf, +0xc0, +0x9f, +0x1b, +0x12, +0x6f, +0x88, +0x1b, +0xc3, +0x41, +0xa0, +0xa0, +0xa0, +0xa0, +0xa0, +0xa0, +0x1b, +0xe1, +0xc0, +0xfc, +0xcf, +0xc0, +0x1b, +0x12, +0x1b, +0x42, +0x4d, +0xc9, +0xc3, +0xd2, +0xcf, +0xa0, +0xf9, +0x8d, +0x1b, +0xe1, +0xff, +0xff, +0xff, +0xff, +0xcf, +0xc0, +0x1b, +0x12, +0xcc, +0xc5, +0x4d, +0x42, +0xa0, +0xa0, +0xa0, +0x1b, +0xe1, +0xc0, +0xfc, +0xcf, +0xc0, +0x1b, +0x12, +0x4d, +0xc9, +0xc3, +0xd2, +0xcf, +0xa0, +0x30, +0x8d, +0x1b, +0xe1, +0xff, +0xff, +0xff, +0xff, +0xcf, +0xc0, +0x1b, +0x12, +0xd2, +0xc5, +0x4d, +0x42, +0xa0, +0xa0, +0xa0, +0x1b, +0xe1, +0xc0, +0xfc, +0xcf, +0xc0, +0x1b, +0x12, +0x4d, +0xc9, +0xc3, +0xd2, +0xcf, +0xa0, +0xb1, +0x8d, +0x1b, +0xe1, +0xff, +0xff, +0xff, +0xff, +0xcf, +0xc0, +0x1b, +0x12, +0x1b, +0xc3, +0x3f, +0xa0, +0xa0, +0xa0, +0xa0, +0xa0, +0xa0, +0x1b, +0xe1, +0xc0, +0xfc, +0xcf, +0xc0, +0x1b, +0x12, +0x1b, +0x42, +0x4d, +0xc9, +0xc3, +0xd2, +0xcf, +0xa0, +0x36, +0x8d, +0x1b, +0xe1, +0xff, +0xff, +0xff, +0xff, +0xcf, +0xc0, +0x1b, +0x12, +0x1b, +0xc3, +0xc3, +0xa0, +0xa0, +0xa0, +0xa0, +0xa0, +0xa0, +0x1b, +0xe1, +0xc0, +0xfc, +0xcf, +0xc0, +0x1b, +0x12, +0x1b, +0x42, +0x4d, +0xc9, +0xc3, +0xd2, +0xcf, +0xa0, +0x33, +0x8d, +0x1b, +0xe1, +0xff, +0xff, +0xff, +0xff, +0xcf, +0xc0, +0x1b, +0x12, +0x1b, +0xc3, +0xc9, +0xa0, +0xa0, +0xa0, +0xa0, +0xa0, +0xa0, +0x1b, +0xe1, +0xc0, +0xfc, +0xcf, +0xc0, +0x1b, +0x12, +0x1b, +0x42, +0x4d, +0xc9, +0xc3, +0xd2, +0xcf, +0xa0, +0xac, +0x8d, +0x1b, +0xe1, +0xff, +0xff, +0xff, +0xff, +0xcf, +0xc0, +0x1b, +0x12, +0x1b, +0xc3, +0xa5, +0xa0, +0xa0, +0xa0, +0xa0, +0xa0, +0xa0, +0x1b, +0xe1, +0xc0, +0xfc, +0xcf, +0xc0, +0x1b, +0x12, +0x1b, +0x42, +0x4d, +0xc9, +0xc3, +0xd2, +0xcf, +0xa0, +0xbd, +0x8d, +0x1b, +0xe1, +0xff, +0xff, +0xff, +0xff, +0xcf, +0xc0, +0x1b, +0x12, +0x1b, +0xc3, +0xa9, +0xa0, +0xa0, +0xa0, +0xa0, +0xa0, +0xa0, +0x1b, +0xe1, +0xc0, +0xfc, +0xcf, +0xc0, +0x1b, +0x12, +0x1b, +0x42, +0x4d, +0xc9, +0xc3, +0xd2, +0xcf, +0xa0, +0x41, +0x8d, +0x1b, +0xe1, +0xff, +0xff, +0xff, +0xff, +0xcf, +0xc0, +0x1b, +0x12, +0x1b, +0xc3, +0x28, +0xa0, +0xa0, +0xa0, +0xa0, +0xa0, +0xa0, +0x1b, +0xe1, +0xc0, +0xfc, +0xcf, +0xc0, +0x1b, +0x12, +0x1b, +0x42, +0x4d, +0xc9, +0xc3, +0xd2, +0xcf, +0xa0, +0xd8, +0x8d, +0x1b, +0xe1, +0xff, +0xff, +0xff, +0xff, +0xcf, +0xc0, +0x1b, +0x12, +0x1b, +0xc3, +0x27, +0xa0, +0xa0, +0xa0, +0xa0, +0xa0, +0xa0, +0x1b, +0xe1, +0xc0, +0xfc, +0xcf, +0xc0, +0x1b, +0x12, +0x1b, +0x42, +0x4d, +0xc9, +0xc3, +0xd2, +0xcf, +0xa0, +0x44, +0x8d, +0x1b, +0xe1, +0xff, +0xff, +0xff, +0xff, +0xcf, +0xc0, +0x1b, +0x12, +0x1b, +0xc3, +0xa6, +0xa0, +0xa0, +0xa0, +0xa0, +0xa0, +0xa0, +0x1b, +0xe1, +0xc0, +0xfc, +0xcf, +0xc0, +0x1b, +0x12, +0x1b, +0x42, +0x4d, +0xc9, +0xc3, +0xd2, +0xcf, +0xa0, +0xd7, +0x8d, +0x1b, +0xe1, +0xff, +0xff, +0xff, +0xff, +0xcf, +0xc0, +0x1b, +0x12, +0x28, +0x1b, +0xc3, +0xc0, +0x1b, +0x42, +0xa9, +0xa0, +0xa0, +0xa0, +0xa0, +0x1b, +0xe1, +0xc0, +0xfc, +0xcf, +0xc0, +0x1b, +0x12, +0x4d, +0xc9, +0xc3, +0xd2, +0xcf, +0xa0, +0xc3, +0x8d, +0x1b, +0xe1, +0xff, +0xff, +0xff, +0xff, +0xcf, +0xc0, +0x1b, +0x12, +0x1b, +0xc3, +0x44, +0xa0, +0xa0, +0xa0, +0xa0, +0xa0, +0xa0, +0x1b, +0xe1, +0xc0, +0xfc, +0xcf, +0xc0, +0x1b, +0x12, +0x1b, +0x42, +0x4d, +0xc9, +0xc3, +0xd2, +0xcf, +0xa0, +0xc6, +0x8d, +0x1b, +0xe1, +0xff, +0xff, +0xff, +0xff, +0xcf, +0xc0, +0x1b, +0x12, +0x41, +0x1d, +0x27, +0x60, +0xd4, +0x9f, +0xc5, +0xa0, +0xa0, +0xa0, +0xa0, +0xa0, +0xa0, +0x1b, +0xe1, +0xc0, +0xfc, +0xcf, +0xc0, +0x1b, +0x12, +0x4d, +0xc9, +0xc3, +0xd2, +0xcf, +0xa0, +0x47, +0x8d, +0x1b, +0xe1, +0xff, +0xff, +0xff, +0xff, +0xcf, +0xc0, +0x1b, +0x12, +0xcf, +0x88, +0x1d, +0xa6, +0x71, +0x50, +0x9f, +0xaf, +0x1d, +0xf0, +0xd8, +0x9f, +0xa0, +0xa0, +0xa0, +0xa0, +0xa0, +0xa0, +0x1b, +0xe1, +0xc0, +0xfc, +0xcf, +0xc0, +0x1b, +0x12, +0x4d, +0xc9, +0xc3, +0xd2, +0xcf, +0xa0, +0x48, +0x8d, +0x1b, +0xe1, +0xff, +0xff, +0xff, +0xff, +0xcf, +0xc0, +0x1b, +0x12, +0x1b, +0xc3, +0xca, +0xa0, +0xa0, +0xa0, +0xa0, +0xa0, +0xa0, +0x1b, +0xe1, +0xc0, +0xfc, +0xcf, +0xc0, +0x1b, +0x12, +0x1b, +0x42, +0x4d, +0xc9, +0xc3, +0xd2, +0xcf, +0xa0, +0xc9, +0x8d, +0x1b, +0xe1, +0xff, +0xff, +0xff, +0xff, +0xcf, +0xc0, +0x1b, +0x12, +0x41, +0x88, +0x1d, +0xa5, +0xf5, +0x50, +0x9f, +0x1b, +0xc3, +0xbd, +0x1b, +0x41, +0xa0, +0xa0, +0xa0, +0xa0, +0xa0, +0xa0, +0x1b, +0xe1, +0xc0, +0xfc, +0xcf, +0xc0, +0x1b, +0x12, +0x1b, +0x42, +0x4d, +0xc9, +0xc3, +0xd2, +0xcf, +0xa0, +0xca, +0x8d, +0x1b, +0xe1, +0xff, +0xff, +0xff, +0xff, +0xcf, +0xc0, +0x1b, +0x12, +0x41, +0x88, +0x1d, +0x63, +0x50, +0x9f, +0x1b, +0xc3, +0x41, +0x1d, +0x60, +0xd8, +0x9f, +0xa0, +0xa0, +0xa0, +0xa0, +0xa0, +0xa0, +0x1b, +0xe1, +0xc0, +0xfc, +0xcf, +0xc0, +0x1b, +0x12, +0x1b, +0x42, +0x4d, +0xc9, +0xc3, +0xd2, +0xcf, +0xa0, +0x4b, +0x8d, +0x1b, +0xe1, +0xff, +0xff, +0xff, +0xff, +0xcf, +0xc0, +0x1b, +0x12, +0x1b, +0xc3, +0x42, +0xa0, +0xa0, +0xa0, +0xa0, +0xa0, +0xa0, +0x1b, +0xe1, +0xc0, +0xfc, +0xcf, +0xc0, +0x1b, +0x12, +0x1b, +0x42, +0x4d, +0xc9, +0xc3, +0xd2, +0xcf, +0xa0, +0x6f, +0x8d, +0x1b, +0xe1, +0xff, +0xff, +0xff, +0xff, +0xcf, +0xc0, +0x1b, +0x12, +0xcf, +0x88, +0x1d, +0x24, +0x63, +0x50, +0x9f, +0x1b, +0xc3, +0x41, +0x1d, +0x60, +0xd8, +0x9f, +0xa0, +0xa0, +0xa0, +0xa0, +0xa0, +0xa0, +0x1b, +0xe1, +0xc0, +0xfc, +0xcf, +0xc0, +0x1b, +0x12, +0x1b, +0x42, +0x4d, +0xc9, +0xc3, +0xd2, +0xcf, +0xa0, +0x59, +0x8d, +0x1b, +0xe1, +0xff, +0xff, +0xff, +0xff, +0xcf, +0xc0, +0x1b, +0x12, +0x1b, +0xc3, +0x39, +0xa0, +0xa0, +0xa0, +0xa0, +0xa0, +0xa0, +0x1b, +0xe1, +0xc0, +0xfc, +0xcf, +0xc0, +0x1b, +0x12, +0x1b, +0x42, +0x4d, +0xc9, +0xc3, +0xd2, +0xcf, +0xa0, +0x3c, +0x8d, +0x1b, +0xe1, +0xff, +0xff, +0xff, +0xff, +0xcf, +0xc0, +0x1b, +0x12, +0x1b, +0xc3, +0x3a, +0xa0, +0xa0, +0xa0, +0xa0, +0xa0, +0xa0, +0x1b, +0xe1, +0xc0, +0xfc, +0xcf, +0xc0, +0x1b, +0x12, +0x1b, +0x42, +0x4d, +0xc9, +0xc3, +0xd2, +0xcf, +0xa0, +0xbe, +0x8d, +0x1b, +0xe1, +0xff, +0xff, +0xff, +0xff, +0xcf, +0xc0, +0x1b, +0x12, +0x1b, +0xc3, +0x22, +0xa0, +0xa0, +0xa0, +0xa0, +0xa0, +0xa0, +0x1b, +0xe1, +0xc0, +0xfc, +0xcf, +0xc0, +0x1b, +0x12, +0x1b, +0x42, +0x4d, +0xc9, +0xc3, +0xd2, +0xcf, +0xa0, +0xa9, +0x1d, +0x2e, +0xf0, +0x2d, +0xc0, +0x1b, +0x5a, +0x1b, +0xe1, +0xc0, +0xfc, +0xff, +0xff, +0xff, +0xff, +0x9f, +0x1b, +0x12, +0xd4, +0xd4, +0x59, +0xa0, +0x4b, +0x65, +0xf9, +0xf3, +0x1d, +0x2d, +0xf0, +0xac, +0x50, +0x1b, +0x5a, +0x1b, +0xe1, +0xff, +0xff, +0xc3, +0xf0, +0xff, +0xff, +0x9f, +0x1b, +0x12, +0xc6, +0xb1, +0xa0, +0xa0, +0x1b, +0xe1, +0xff, +0xff, +0xff, +0xff, +0xff, +0xff, +0xff, +0xff, +0x1b, +0x12, +0xd4, +0xd4, +0x59, +0xa0, +0x4d, +0x6f, +0xe4, +0x65, +0x8d, +0x1b, +0xe1, +0xff, +0xff, +0xc3, +0xf0, +0xff, +0xff, +0x1b, +0x12, +0xc6, +0xb2, +0xa0, +0xa0, +0x1b, +0xe1, +0xff, +0xff, +0xff, +0xff, +0xff, +0xff, +0xff, +0xff, +0x1b, +0x12, +0x50, +0xcc, +0x41, +0xd4, +0xcf, +0xa0, +0x4d, +0x6f, +0xe4, +0x65, +0x8d, +0x1b, +0xe1, +0xff, +0xff, +0xc3, +0xf0, +0xff, +0xff, +0x1b, +0x12, +0xc6, +0xb1, +0x30, +0xa0, +0x1b, +0xe1, +0xff, +0xff, +0xff, +0xff, +0xff, +0xff, +0xff, +0xff, +0x1b, +0x12, +0xd1, +0xf5, +0x69, +0x74, +0x8d, +0x1b, +0xe1, +0xff, +0xff, +0xc3, +0xf0, +0xff, +0xff, +0x1b, +0x12, +0x42, +0xd2, +0xc5, +0x41, +0x4b, +0xa0, +0xa0, +0xa0, +0xa0, +0xa0, +0xa0, +0xa0, +0xa0, +0xa0, +0x8d, +0xa0, +0xa0, +0xa0, +0xa0, +0xa0, +0xa0, +0xa0, +0x1b, +0xe1, +0xff, +0xff, +0xff, +0xff, +0xff, +0xff, +0xff, +0xff, +0x1b, +0x12, +0x48, +0xe1, +0xee, +0xe7, +0xa0, +0x55, +0xf0, +0x8d, +0x1b, +0xe1, +0xff, +0xff, +0xc3, +0xf0, +0xff, +0xff, +0x1b, +0x12, +0xc3, +0xd4, +0xd2, +0xcc, +0x2d, +0x44, +0xa0, +0xa0, +0xa0, +0xa0, +0xa0, +0xa0, +0xa0, +0xa0, +0x8d, +0xa0, +0xa0, +0xa0, +0xa0, +0xa0, +0xa0, +0xa0, +0x1b, +0xe1, +0xff, +0xff, +0xff, +0xff, +0xff, +0xff, +0xff, +0xff, +0x1b, +0x12, +0x44, +0x69, +0xe1, +0x6c, +0x8d, +0x1b, +0xe1, +0xff, +0xff, +0xc3, +0xf0, +0xff, +0xff, +0x1b, +0x12, +0xc3, +0xd4, +0xd2, +0xcc, +0x2d, +0x33, +0xa0, +0xa0, +0xa0, +0xa0, +0xa0, +0xa0, +0xa0, +0x1b, +0xe1, +0xff, +0xff, +0xff, +0xff, +0xff, +0xff, +0xff, +0xff, +0x1b, +0x12, +0xa0, +0x8d, +0xa0, +0xa0, +0xa0, +0xa0, +0xa0, +0xa0, +0x33, +0x30, +0x30, +0xa0, +0x42, +0xe1, +0xf5, +0xe4, +0x8d, +0x1b, +0xe1, +0xff, +0xff, +0xc3, +0xf0, +0xff, +0xff, +0x1b, +0x12, +0xc3, +0xd4, +0xd2, +0xcc, +0x2d, +0xb1, +0xa0, +0xa0, +0xa0, +0xa0, +0xa0, +0xa0, +0xa0, +0x1b, +0xe1, +0xff, +0xff, +0xff, +0xff, +0xff, +0xff, +0xff, +0xff, +0x1b, +0x12, +0xa0, +0x8d, +0xa0, +0xa0, +0xa0, +0xa0, +0xa0, +0xb1, +0xb2, +0x30, +0x30, +0xa0, +0x42, +0xe1, +0xf5, +0xe4, +0x8d, +0x1b, +0xe1, +0xff, +0xff, +0xc3, +0xf0, +0xff, +0xff, +0x1b, +0x12, +0xc3, +0xd4, +0xd2, +0xcc, +0x2d, +0xb2, +0xa0, +0xa0, +0xa0, +0xa0, +0xa0, +0xa0, +0xa0, +0x1b, +0xe1, +0xff, +0xff, +0xff, +0xff, +0xff, +0xff, +0xff, +0xff, +0x1b, +0x12, +0xa0, +0x8d, +0xa0, +0xa0, +0xa0, +0xa0, +0xa0, +0xb2, +0xb4, +0x30, +0x30, +0xa0, +0x42, +0xe1, +0xf5, +0xe4, +0x8d, +0x1b, +0xe1, +0xff, +0xff, +0xc3, +0xf0, +0xff, +0xff, +0x1b, +0x12, +0xc3, +0xd4, +0xd2, +0xcc, +0x2d, +0x36, +0xa0, +0xa0, +0xa0, +0xa0, +0xa0, +0xa0, +0xa0, +0x1b, +0xe1, +0xff, +0xff, +0xff, +0xff, +0xff, +0xff, +0xff, +0xff, +0x1b, +0x12, +0xa0, +0x8d, +0xa0, +0xa0, +0xa0, +0xa0, +0xa0, +0x39, +0x36, +0x30, +0x30, +0xa0, +0x42, +0xe1, +0xf5, +0xe4, +0x8d, +0x1b, +0xe1, +0xff, +0xff, +0xc3, +0xf0, +0xff, +0xff, +0x1b, +0x12, +0xc3, +0xd4, +0xd2, +0xcc, +0x2d, +0x39, +0xa0, +0xa0, +0xa0, +0xa0, +0xa0, +0xa0, +0xa0, +0x1b, +0xe1, +0xff, +0xff, +0xff, +0xff, +0xff, +0xff, +0xff, +0xff, +0x1b, +0x12, +0xa0, +0x8d, +0xa0, +0xa0, +0xa0, +0xa0, +0xb1, +0x39, +0xb2, +0x30, +0x30, +0xa0, +0x42, +0xe1, +0xf5, +0xe4, +0x8d, +0x1b, +0x59, +0x50, +0x41, +0xc0, +0x1b, +0xe1, +0xff, +0xff, +0xc3, +0xf0, +0xff, +0xff, +0x1b, +0x12, +0xc3, +0xd4, +0xd2, +0xcc, +0x2d, +0xb8, +0xa0, +0xa0, +0xa0, +0xa0, +0xa0, +0xa0, +0xa0, +0x1b, +0xe1, +0xff, +0xff, +0xff, +0xff, +0xff, +0xff, +0xff, +0xff, +0x1b, +0x12, +0xa0, +0x8d, +0xa0, +0xa0, +0xa0, +0xa0, +0x33, +0xb8, +0xb4, +0x30, +0x30, +0xa0, +0x42, +0xe1, +0xf5, +0xe4, +0x8d, +0x1b, +0xe1, +0xff, +0xff, +0xc3, +0xf0, +0xff, +0xff, +0x1b, +0x12, +0xc3, +0xd4, +0xd2, +0xcc, +0x2d, +0x53, +0x48, +0xc9, +0xc6, +0xd4, +0x2d, +0x44, +0xa0, +0x1b, +0xe1, +0xff, +0xff, +0xff, +0xff, +0xff, +0xff, +0xff, +0xff, +0x1b, +0x12, +0xa0, +0x8d, +0xa0, +0xc5, +0xe4, +0x69, +0x74, +0xa0, +0x44, +0x69, +0xe1, +0x6c, +0xa0, +0x53, +0x74, +0x72, +0x8d, +0x1b, +0xe1, +0xff, +0xff, +0xc3, +0xf0, +0xff, +0xff, +0x1b, +0x12, +0xc3, +0xd4, +0xd2, +0xcc, +0x2d, +0x53, +0x48, +0xc9, +0xc6, +0xd4, +0x2d, +0xc9, +0xa0, +0x1b, +0xe1, +0xff, +0xff, +0xff, +0xff, +0xff, +0xff, +0xff, +0xff, +0x1b, +0x12, +0xa0, +0x8d, +0xa0, +0xc5, +0xe4, +0x69, +0x74, +0xa0, +0xc9, +0xee, +0x69, +0x74, +0xa0, +0x53, +0x74, +0x72, +0x1b, +0x59, +0x50, +0x41, +0xc0, +0x1b, +0x03, + }; + +/** + * help_init(void) - Initialize and draw help + */ +void help_init(void) +{ +} diff --git a/help.h b/help.h new file mode 100644 index 0000000..83638bb --- /dev/null +++ b/help.h @@ -0,0 +1,11 @@ +#ifndef HELP_H +#define HELP_H + +#include "protocol.h" + +/** + * help_init(void) - Initialize and draw help + */ +void help_init(void); + +#endif /* HELP_H */ diff --git a/io.c b/io.c new file mode 100755 index 0000000..67bc34c --- /dev/null +++ b/io.c @@ -0,0 +1,67 @@ +#include "io.h" +#include "protocol.h" +#include "terminal.h" + +#define true 1 +#define false 0 + +extern unsigned char trace_active; + +void io_init(void) +{ +} + +void io_send_byte(unsigned char b) +{ +} + +void io_main(void) +{ +} + +/** + * io_send_string(str,len) + * Send string to port. + */ +void io_send_string(const char* str, int len) +{ +} + +/** + * io_set_baud(int baud) - Set baud rate + */ +void io_set_baud(int baud) +{ +} + +/** + * io_hang_up(void) - Hang up modem + */ +void io_hang_up(void) +{ +} + +/** + * io_send_cr(void) + */ +void io_send_cr(void) +{ +} + +/** + * io_send_dial(void) - Send dial string to modem + */ +void io_send_dial(void) +{ +} + +/** + * io_send_back_out(void) - send back out + */ +void io_send_back_out(void) +{ +} + +void io_done() +{ +} diff --git a/io.h b/io.h new file mode 100755 index 0000000..5da498e --- /dev/null +++ b/io.h @@ -0,0 +1,67 @@ +/** + * PLATOTerm64 - A PLATO Terminal for the Commodore 64 + * Based on Steve Peltz's PAD + * + * Author: Thomas Cherryhomes + * + * io.h - Input/output functions (serial/ethernet) + */ + +#ifndef IO_H +#define IO_H + +#define XON 0x11 +#define XOFF 0x13 + +/** + * io_init() - Set-up the I/O + */ +void io_init(void); + +/** + * io_send_byte(b) - Send specified byte out + */ +void io_send_byte(unsigned char b); + +/** + * io_send_string(str,len) + * Send string to port. + */ +void io_send_string(const char* str, int len); + +/** + * io_main() - The IO main loop + */ +void io_main(void); + +/** + * io_set_baud(int baud) - Set baud rate + */ +void io_set_baud(int baud); + +/** + * io_hang_up(void) - Hang up modem + */ +void io_hang_up(void); + +/** + * io_send_cr(void) + */ +void io_send_cr(void); + +/** + * io_send_dial(void) - send dial string + */ +void io_send_dial(void); + +/** + * io_send_back_out(void) - send back out + */ +void io_send_back_out(void); + +/** + * io_done() - Called to close I/O + */ +void io_done(void); + +#endif /* IO_H */ diff --git a/key.h b/key.h new file mode 100644 index 0000000..8cfb99a --- /dev/null +++ b/key.h @@ -0,0 +1,400 @@ +/** + * + * KEY_H generated by mk_ascii_key_h.c + */ + +#include "plato_key.h" + +int key_to_pkey[]={ + PKEY_NOKEY, /* 0x00 NUL */ + PKEY_NOKEY, /* 0x01 CTRL-A */ + PKEY_NOKEY, /* 0x02 CTRL-B */ + PKEY_NOKEY, /* 0x03 CTRL-C */ + PKEY_NOKEY, /* 0x04 CTRL-D */ + PKEY_NOKEY, /* 0x05 CTRL-E */ + PKEY_NOKEY, /* 0x06 CTRL-F */ + PKEY_NOKEY, /* 0x07 CTRL-G */ + PKEY_NOKEY, /* 0x08 CTRL-H */ + PKEY_TAB, /* 0x09 CTRL-I */ + PKEY_NOKEY, /* 0x0a CTRL-J */ + PKEY_NOKEY, /* 0x0b CTRL-K */ + PKEY_NOKEY, /* 0x0c CTRL-L */ + PKEY_NEXT, /* 0x0d CTRL-M */ + PKEY_NOKEY, /* 0x0e CTRL-N */ + PKEY_NOKEY, /* 0x0f CTRL-O */ + PKEY_NOKEY, /* 0x10 CTRL-P */ + PKEY_NOKEY, /* 0x11 CTRL-Q */ + PKEY_NOKEY, /* 0x12 CTRL-R */ + PKEY_NOKEY, /* 0x13 CTRL-S */ + PKEY_NOKEY, /* 0x14 CTRL-T */ + PKEY_NOKEY, /* 0x15 CTRL-U */ + PKEY_NOKEY, /* 0x16 CTRL-V */ + PKEY_NOKEY, /* 0x17 CTRL-W */ + PKEY_NOKEY, /* 0x18 CTRL-X */ + PKEY_NOKEY, /* 0x19 CTRL-Y */ + PKEY_NOKEY, /* 0x1a CTRL-Z */ + PKEY_ASSIGN, /* 0x1b ESC */ + PKEY_NOKEY, /* 0x1c */ + PKEY_NOKEY, /* 0x1d */ + PKEY_NOKEY, /* 0x1e */ + PKEY_NOKEY, /* 0x1f */ + PKEY_SPACE, /* 0x20 SPACE */ + PKEY_EXCLAMATION, /* 0x21 ! */ + PKEY_QUOTE, /* 0x22 " */ + PKEY_POUND, /* 0x23 # */ + PKEY_DOLLAR, /* 0x24 $ */ + PKEY_PERCENT, /* 0x25 % */ + PKEY_AMPERSAND, /* 0x26 & */ + PKEY_APOSTROPHE, /* 0x27 ' */ + PKEY_PARENTHESIS_LEFT, /* 0x28 ( */ + PKEY_PARENTHESIS_RIGHT, /* 0x29 ) */ + PKEY_ASTERISK, /* 0x2a * */ + PKEY_PLUS, /* 0x2b + */ + PKEY_COMMA, /* 0x2c , */ + PKEY_MINUS, /* 0x2d - */ + PKEY_PERIOD, /* 0x2e . */ + PKEY_SLASH, /* 0x2f / */ + PKEY_0, /* 0x30 0 */ + PKEY_1, /* 0x31 1 */ + PKEY_2, /* 0x32 2 */ + PKEY_3, /* 0x33 3 */ + PKEY_4, /* 0x34 4 */ + PKEY_5, /* 0x35 5 */ + PKEY_6, /* 0x36 6 */ + PKEY_7, /* 0x37 7 */ + PKEY_8, /* 0x38 8 */ + PKEY_9, /* 0x39 9 */ + PKEY_COLON, /* 0x3a : */ + PKEY_SEMICOLON, /* 0x3b ; */ + PKEY_LESS_THAN, /* 0x3c < */ + PKEY_EQUALS, /* 0x3d = */ + PKEY_GREATER_THAN, /* 0x3e > */ + PKEY_QUESTION_MARK, /* 0x3f ? */ + PKEY_AT, /* 0x40 @ */ + PKEY_A, /* 0x41 A */ + PKEY_B, /* 0x42 B */ + PKEY_C, /* 0x43 C */ + PKEY_D, /* 0x44 D */ + PKEY_E, /* 0x45 E */ + PKEY_F, /* 0x46 F */ + PKEY_G, /* 0x47 G */ + PKEY_H, /* 0x48 H */ + PKEY_I, /* 0x49 I */ + PKEY_J, /* 0x4a J */ + PKEY_K, /* 0x4b K */ + PKEY_L, /* 0x4c L */ + PKEY_M, /* 0x4d M */ + PKEY_N, /* 0x4e N */ + PKEY_O, /* 0x4f O */ + PKEY_P, /* 0x50 P */ + PKEY_Q, /* 0x51 Q */ + PKEY_R, /* 0x52 R */ + PKEY_S, /* 0x53 S */ + PKEY_T, /* 0x54 T */ + PKEY_U, /* 0x55 U */ + PKEY_V, /* 0x56 V */ + PKEY_W, /* 0x57 W */ + PKEY_X, /* 0x58 X */ + PKEY_Y, /* 0x59 Y */ + PKEY_Z, /* 0x5a Z */ + PKEY_BRACKET_LEFT, /* 0x5b [ */ + PKEY_SLASH, /* 0x5c / */ + PKEY_BRACKET_RIGHT, /* 0x5d ] */ + PKEY_CIRCUMFLEX, /* 0x5e ^ */ + PKEY_UNDERSCORE, /* 0x5f _ */ + PKEY_GRAVE, /* 0x60 ` */ + PKEY_a, /* 0x61 a */ + PKEY_b, /* 0x62 b */ + PKEY_c, /* 0x63 c */ + PKEY_d, /* 0x64 d */ + PKEY_e, /* 0x65 e */ + PKEY_f, /* 0x66 f */ + PKEY_g, /* 0x67 g */ + PKEY_h, /* 0x68 h */ + PKEY_i, /* 0x69 i */ + PKEY_j, /* 0x6a j */ + PKEY_k, /* 0x6b k */ + PKEY_l, /* 0x6c l */ + PKEY_m, /* 0x6d m */ + PKEY_n, /* 0x6e n */ + PKEY_o, /* 0x6f o */ + PKEY_p, /* 0x70 p */ + PKEY_q, /* 0x71 q */ + PKEY_r, /* 0x72 r */ + PKEY_s, /* 0x73 s */ + PKEY_t, /* 0x74 t */ + PKEY_u, /* 0x75 u */ + PKEY_v, /* 0x76 v */ + PKEY_w, /* 0x77 w */ + PKEY_x, /* 0x78 x */ + PKEY_y, /* 0x79 y */ + PKEY_z, /* 0x7a z */ + PKEY_LEFT_CURLY_BRACE, /* 0x7b { */ + PKEY_BAR, /* 0x7c | */ + PKEY_RIGHT_CURLY_BRACE, /* 0x7d } */ + PKEY_TILDE, /* 0x7e ~ */ + PKEY_ERASE, /* 0x7f DEL */ +}; + +/* CTRL key mappings, |= 0x80 for shifted ctrl-keys */ +/* HELP is handled by a scancode/shift state override */ +/* NEXT/NEXT1 is handled by a scancode/shift state override */ +int ctrl_key_to_pkey[]={ + PKEY_NOKEY, /* 0x00 NUL */ + PKEY_ANS, /* 0x01 CTRL-A */ + PKEY_BACK, /* 0x02 CTRL-B */ + PKEY_COPY, /* 0x03 CTRL-C */ + PKEY_DATA, /* 0x04 CTRL-D */ + PKEY_EDIT, /* 0x05 CTRL-E */ + PKEY_FONT, /* 0x06 CTRL-F */ + PKEY_DIVIDE, /* 0x07 CTRL-G */ + PKEY_ERASE, /* 0x08 CTRL-H */ + PKEY_NOKEY, /* 0x09 CTRL-I */ + PKEY_NOKEY, /* 0x0a CTRL-J */ + PKEY_NOKEY, /* 0x0b CTRL-K */ + PKEY_LAB, /* 0x0c CTRL-L */ + PKEY_NEXT, /* 0x0d CTRL-M */ + PKEY_NEXT, /* 0x0e CTRL-N */ + PKEY_BACK, /* 0x0f CTRL-O */ + PKEY_SUPER, /* 0x10 CTRL-P */ + PKEY_SQUARE, /* 0x11 CTRL-Q */ + PKEY_ERASE, /* 0x12 CTRL-R */ + PKEY_STOP, /* 0x13 CTRL-S */ + PKEY_TERM, /* 0x14 CTRL-T */ + PKEY_NOKEY, /* 0x15 CTRL-U */ + PKEY_NOKEY, /* 0x16 CTRL-V */ + PKEY_NOKEY, /* 0x17 CTRL-W */ + PKEY_MULTIPLY, /* 0x18 CTRL-X */ + PKEY_SUB, /* 0x19 CTRL-Y */ + PKEY_NOKEY, /* 0x1a CTRL-Z */ + PKEY_NOKEY, /* 0x1b ESC */ + PKEY_NOKEY, /* 0x1c */ + PKEY_NOKEY, /* 0x1d */ + PKEY_NOKEY, /* 0x1e */ + PKEY_NOKEY, /* 0x1f */ + PKEY_BACKSPACE, /* 0x20 SPACE */ + PKEY_NOKEY, /* 0x21 ! */ + PKEY_NOKEY, /* 0x22 " */ + PKEY_NOKEY, /* 0x23 # */ + PKEY_NOKEY, /* 0x24 $ */ + PKEY_NOKEY, /* 0x25 % */ + PKEY_NOKEY, /* 0x26 & */ + PKEY_NOKEY, /* 0x27 ' */ + PKEY_NOKEY, /* 0x28 ( */ + PKEY_NOKEY, /* 0x29 ) */ + PKEY_NOKEY, /* 0x2a * */ + PKEY_SIGMA, /* 0x2b + */ + PKEY_NOKEY, /* 0x2c , */ + PKEY_DELTA, /* 0x2d - */ + PKEY_NOKEY, /* 0x2e . */ + PKEY_NOKEY, /* 0x2f / */ + PKEY_NOKEY, /* 0x30 0 */ + PKEY_NOKEY, /* 0x31 1 */ + PKEY_NOKEY, /* 0x32 2 */ + PKEY_NOKEY, /* 0x33 3 */ + PKEY_NOKEY, /* 0x34 4 */ + PKEY_NOKEY, /* 0x35 5 */ + PKEY_NOKEY, /* 0x36 6 */ + PKEY_NOKEY, /* 0x37 7 */ + PKEY_NOKEY, /* 0x38 8 */ + PKEY_NOKEY, /* 0x39 9 */ + PKEY_NOKEY, /* 0x3a : */ + PKEY_NOKEY, /* 0x3b ; */ + PKEY_NOKEY, /* 0x3c < */ + PKEY_NOKEY, /* 0x3d = */ + PKEY_NOKEY, /* 0x3e > */ + PKEY_NOKEY, /* 0x3f ? */ + PKEY_NOKEY, /* 0x40 @ */ + PKEY_NOKEY, /* 0x41 A */ + PKEY_NOKEY, /* 0x42 B */ + PKEY_NOKEY, /* 0x43 C */ + PKEY_NOKEY, /* 0x44 D */ + PKEY_NOKEY, /* 0x45 E */ + PKEY_NOKEY, /* 0x46 F */ + PKEY_NOKEY, /* 0x47 G */ + PKEY_NOKEY, /* 0x48 H */ + PKEY_NOKEY, /* 0x49 I */ + PKEY_NOKEY, /* 0x4a J */ + PKEY_NOKEY, /* 0x4b K */ + PKEY_NOKEY, /* 0x4c L */ + PKEY_NOKEY, /* 0x4d M */ + PKEY_NOKEY, /* 0x4e N */ + PKEY_NOKEY, /* 0x4f O */ + PKEY_NOKEY, /* 0x50 P */ + PKEY_NOKEY, /* 0x51 Q */ + PKEY_NOKEY, /* 0x52 R */ + PKEY_NOKEY, /* 0x53 S */ + PKEY_NOKEY, /* 0x54 T */ + PKEY_NOKEY, /* 0x55 U */ + PKEY_NOKEY, /* 0x56 V */ + PKEY_NOKEY, /* 0x57 W */ + PKEY_NOKEY, /* 0x58 X */ + PKEY_NOKEY, /* 0x59 Y */ + PKEY_NOKEY, /* 0x5a Z */ + PKEY_NOKEY, /* 0x5b [ */ + PKEY_NOKEY, /* 0x5c / */ + PKEY_NOKEY, /* 0x5d ] */ + PKEY_NOKEY, /* 0x5e ^ */ + PKEY_NOKEY, /* 0x5f _ */ + PKEY_NOKEY, /* 0x60 ` */ + PKEY_NOKEY, /* 0x61 a */ + PKEY_NOKEY, /* 0x62 b */ + PKEY_NOKEY, /* 0x63 c */ + PKEY_NOKEY, /* 0x64 d */ + PKEY_NOKEY, /* 0x65 e */ + PKEY_NOKEY, /* 0x66 f */ + PKEY_NOKEY, /* 0x67 g */ + PKEY_NOKEY, /* 0x68 h */ + PKEY_NOKEY, /* 0x69 i */ + PKEY_NOKEY, /* 0x6a j */ + PKEY_NOKEY, /* 0x6b k */ + PKEY_NOKEY, /* 0x6c l */ + PKEY_NOKEY, /* 0x6d m */ + PKEY_NOKEY, /* 0x6e n */ + PKEY_NOKEY, /* 0x6f o */ + PKEY_NOKEY, /* 0x70 p */ + PKEY_NOKEY, /* 0x71 q */ + PKEY_NOKEY, /* 0x72 r */ + PKEY_NOKEY, /* 0x73 s */ + PKEY_NOKEY, /* 0x74 t */ + PKEY_NOKEY, /* 0x75 u */ + PKEY_NOKEY, /* 0x76 v */ + PKEY_NOKEY, /* 0x77 w */ + PKEY_NOKEY, /* 0x78 x */ + PKEY_NOKEY, /* 0x79 y */ + PKEY_NOKEY, /* 0x7a z */ + PKEY_NOKEY, /* 0x7b { */ + PKEY_NOKEY, /* 0x7c | */ + PKEY_NOKEY, /* 0x7d } */ + PKEY_NOKEY, /* 0x7e ~ */ + PKEY_NOKEY, /* 0x7f DEL */ + PKEY_NOKEY, /* 0x80 */ + PKEY_ANS, /* 0x81 */ + PKEY_BACK1, /* 0x82 */ + PKEY_COPY1, /* 0x83 */ + PKEY_DATA1, /* 0x84 */ + PKEY_EDIT1, /* 0x85 */ + PKEY_FONT, /* 0x86 */ + PKEY_INTERSECT, /* 0x87 */ + PKEY_HELP1, /* 0x88 */ + PKEY_NOKEY, /* 0x89 */ + PKEY_NOKEY, /* 0x8A */ + PKEY_NOKEY, /* 0x8B */ + PKEY_LAB1, /* 0x8C */ + PKEY_MICRO, /* 0x8D */ + PKEY_NEXT1, /* 0x8E */ + PKEY_NOKEY, /* 0x8F */ + PKEY_SUPER1, /* 0x90 */ + PKEY_ACCESS, /* 0x91 */ + PKEY_ERASE1, /* 0x92 */ + PKEY_STOP1, /* 0x93 */ + PKEY_TERM, /* 0x94 */ + PKEY_NOKEY, /* 0x95 */ + PKEY_NOKEY, /* 0x96 */ + PKEY_NOKEY, /* 0x97 */ + PKEY_NOKEY, /* 0x98 */ + PKEY_SUB1, /* 0x99 */ + PKEY_NOKEY, /* 0x9A */ + PKEY_NOKEY, /* 0x9B */ + PKEY_NOKEY, /* 0x9C */ + PKEY_NOKEY, /* 0x9D */ + PKEY_NOKEY, /* 0x9E */ + PKEY_NOKEY, /* 0x9F */ + PKEY_NOKEY, /* 0xA0 */ + PKEY_NOKEY, /* 0xA1 */ + PKEY_NOKEY, /* 0xA2 */ + PKEY_NOKEY, /* 0xA3 */ + PKEY_NOKEY, /* 0xA4 */ + PKEY_NOKEY, /* 0xA5 */ + PKEY_NOKEY, /* 0xA6 */ + PKEY_NOKEY, /* 0xA7 */ + PKEY_NOKEY, /* 0xA8 */ + PKEY_NOKEY, /* 0xA9 */ + PKEY_NOKEY, /* 0xAA */ + PKEY_NOKEY, /* 0xAB */ + PKEY_NOKEY, /* 0xAC */ + PKEY_NOKEY, /* 0xAD */ + PKEY_NOKEY, /* 0xAE */ + PKEY_NOKEY, /* 0xAF */ + PKEY_NOKEY, /* 0xB0 */ + PKEY_NOKEY, /* 0xB1 */ + PKEY_NOKEY, /* 0xB2 */ + PKEY_NOKEY, /* 0xB3 */ + PKEY_NOKEY, /* 0xB4 */ + PKEY_NOKEY, /* 0xB5 */ + PKEY_NOKEY, /* 0xB6 */ + PKEY_NOKEY, /* 0xB7 */ + PKEY_NOKEY, /* 0xB8 */ + PKEY_NOKEY, /* 0xB9 */ + PKEY_NOKEY, /* 0xBA */ + PKEY_NOKEY, /* 0xBB */ + PKEY_NOKEY, /* 0xBC */ + PKEY_NOKEY, /* 0xBD */ + PKEY_NOKEY, /* 0xBE */ + PKEY_NOKEY, /* 0xBF */ + PKEY_NOKEY, /* 0xC0 */ + PKEY_NOKEY, /* 0xC1 */ + PKEY_NOKEY, /* 0xC2 */ + PKEY_NOKEY, /* 0xC3 */ + PKEY_NOKEY, /* 0xC4 */ + PKEY_NOKEY, /* 0xC5 */ + PKEY_NOKEY, /* 0xC6 */ + PKEY_NOKEY, /* 0xC7 */ + PKEY_NOKEY, /* 0xC8 */ + PKEY_NOKEY, /* 0xC9 */ + PKEY_NOKEY, /* 0xCA */ + PKEY_NOKEY, /* 0xCB */ + PKEY_NOKEY, /* 0xCC */ + PKEY_NOKEY, /* 0xCD */ + PKEY_NOKEY, /* 0xCE */ + PKEY_NOKEY, /* 0xCF */ + PKEY_NOKEY, /* 0xD0 */ + PKEY_NOKEY, /* 0xD1 */ + PKEY_NOKEY, /* 0xD2 */ + PKEY_NOKEY, /* 0xD3 */ + PKEY_NOKEY, /* 0xD4 */ + PKEY_NOKEY, /* 0xD5 */ + PKEY_NOKEY, /* 0xD6 */ + PKEY_NOKEY, /* 0xD7 */ + PKEY_NOKEY, /* 0xD8 */ + PKEY_NOKEY, /* 0xD9 */ + PKEY_NOKEY, /* 0xDA */ + PKEY_NOKEY, /* 0xDB */ + PKEY_NOKEY, /* 0xDC */ + PKEY_NOKEY, /* 0xDD */ + PKEY_NOKEY, /* 0xDE */ + PKEY_NOKEY, /* 0xDF */ + PKEY_NOKEY, /* 0xE0 */ + PKEY_NOKEY, /* 0xE1 */ + PKEY_NOKEY, /* 0xE2 */ + PKEY_NOKEY, /* 0xE3 */ + PKEY_NOKEY, /* 0xE4 */ + PKEY_NOKEY, /* 0xE5 */ + PKEY_NOKEY, /* 0xE6 */ + PKEY_NOKEY, /* 0xE7 */ + PKEY_NOKEY, /* 0xE8 */ + PKEY_NOKEY, /* 0xE9 */ + PKEY_NOKEY, /* 0xEA */ + PKEY_NOKEY, /* 0xEB */ + PKEY_NOKEY, /* 0xEC */ + PKEY_NOKEY, /* 0xED */ + PKEY_NOKEY, /* 0xEE */ + PKEY_NOKEY, /* 0xEF */ + PKEY_NOKEY, /* 0xF0 */ + PKEY_NOKEY, /* 0xF1 */ + PKEY_NOKEY, /* 0xF2 */ + PKEY_NOKEY, /* 0xF3 */ + PKEY_NOKEY, /* 0xF4 */ + PKEY_NOKEY, /* 0xF5 */ + PKEY_NOKEY, /* 0xF6 */ + PKEY_NOKEY, /* 0xF7 */ + PKEY_NOKEY, /* 0xF8 */ + PKEY_NOKEY, /* 0xF9 */ + PKEY_NOKEY, /* 0xFA */ + PKEY_NOKEY, /* 0xFB */ + PKEY_NOKEY, /* 0xFC */ + PKEY_NOKEY, /* 0xFD */ + PKEY_NOKEY, /* 0xFE */ + PKEY_NOKEY, /* 0xFF */ +}; + diff --git a/keyboard.c b/keyboard.c new file mode 100755 index 0000000..998e524 --- /dev/null +++ b/keyboard.c @@ -0,0 +1,26 @@ +#include "keyboard.h" +#include "key.h" +#include "protocol.h" +#include "io.h" +#include "screen.h" +#include "trace.h" + +#define true 1 +#define false 0 + +extern unsigned char running; +extern unsigned char help_active; +extern char tmp[64]; + +void keyboard_out(int platoKey) +{ +} + +void keyboard_main(void) +{ +} + +void keyboard_out_tty(int ch) +{ +} + diff --git a/keyboard.h b/keyboard.h new file mode 100755 index 0000000..3c9b71b --- /dev/null +++ b/keyboard.h @@ -0,0 +1,31 @@ +/** + * PLATOTerm64 - A PLATO Terminal for the Commodore 64 + * Based on Steve Peltz's PAD + * + * Author: Thomas Cherryhomes + * + * keyboard.h - Keyboard functions + */ + +#ifndef KEYBOARD_H +#define KEYBOARD_H + +/** + * keyboard_out - If platoKey < 0x7f, pass off to protocol + * directly. Otherwise, platoKey is an access key, and the + * ACCESS key must be sent, followed by the particular + * access key from PTAT_ACCESS. + */ +void keyboard_out(int platoKey); + +/** + * keyboard_main - Handle the keyboard presses + */ +void keyboard_main(void); + +/** + * keyboard_out_tty - keyboard output to serial I/O in TTY mode + */ +void keyboard_out_tty(int ch); + +#endif diff --git a/main.c b/main.c new file mode 100755 index 0000000..4a7d1a7 --- /dev/null +++ b/main.c @@ -0,0 +1,38 @@ +#include "protocol.h" +#include "screen.h" +#include "io.h" +#include "terminal.h" +#include "keyboard.h" +#include "touch.h" +#include "splash.h" +#include "help.h" + +#define true 1 +#define false 0 + +unsigned char already_started=false; +unsigned char running=false; + +void main(void) +{ + screen_init(); + touch_init(); + help_init(); + NoEcho=padT; + ShowPLATO(splash,sizeof(splash)); + NoEcho=padF; + terminal_initial_position(); + io_init(); + running=true; + screen_show_dial(); + screen_greeting(); + while (running==true) + { + keyboard_main(); + io_main(); + touch_main(); + } + io_done(); + touch_done(); + screen_done(); +} diff --git a/plato_key.h b/plato_key.h new file mode 100644 index 0000000..d32c9f9 --- /dev/null +++ b/plato_key.h @@ -0,0 +1,252 @@ +/** + * plato_key.h + * PLATO specific key mappings + * used by key.h + * this define table is ordered as in s0ascers document. + */ + +#ifndef PLATO_KEY_H +#define PLATO_KEY_H + +#define PKEY_a 0x41 +#define PKEY_A 0x61 +#define PKEY_b 0x42 +#define PKEY_B 0x62 +#define PKEY_c 0x43 +#define PKEY_C 0x63 +#define PKEY_d 0x44 +#define PKEY_D 0x64 +#define PKEY_e 0x45 +#define PKEY_E 0x65 +#define PKEY_f 0x46 +#define PKEY_F 0x66 +#define PKEY_g 0x47 +#define PKEY_G 0x67 +#define PKEY_h 0x48 +#define PKEY_H 0x68 +#define PKEY_i 0x49 +#define PKEY_I 0x69 +#define PKEY_j 0x4a +#define PKEY_J 0x6a +#define PKEY_k 0x4b +#define PKEY_K 0x6b +#define PKEY_l 0x4c +#define PKEY_L 0x6C +#define PKEY_m 0x4d +#define PKEY_M 0x6d +#define PKEY_n 0x4e +#define PKEY_N 0x6e +#define PKEY_o 0x4f +#define PKEY_O 0x6f +#define PKEY_p 0x50 +#define PKEY_P 0x70 +#define PKEY_q 0x51 +#define PKEY_Q 0x71 +#define PKEY_r 0x52 +#define PKEY_R 0x72 +#define PKEY_s 0x53 +#define PKEY_S 0x73 +#define PKEY_t 0x54 +#define PKEY_T 0x74 +#define PKEY_u 0x55 +#define PKEY_U 0x75 +#define PKEY_v 0x56 +#define PKEY_V 0x76 +#define PKEY_w 0x57 +#define PKEY_W 0x77 +#define PKEY_x 0x58 +#define PKEY_X 0x78 +#define PKEY_y 0x59 +#define PKEY_Y 0x79 +#define PKEY_z 0x5a +#define PKEY_Z 0x7A +#define PKEY_0 0x00 +#define PKEY_LESS_THAN 0x20 +#define PKEY_1 0x01 +#define PKEY_GREATER_THAN 0x21 +#define PKEY_2 0x02 +#define PKEY_BRACKET_LEFT 0x22 +#define PKEY_3 0x03 +#define PKEY_BRACKET_RIGHT 0x23 +#define PKEY_4 0x04 +#define PKEY_DOLLAR 0x24 +#define PKEY_5 0x05 +#define PKEY_PERCENT 0x25 +#define PKEY_6 0x06 +#define PKEY_UNDERSCORE 0x26 +#define PKEY_7 0x07 +#define PKEY_APOSTROPHE 0x27 +#define PKEY_8 0x08 +#define PKEY_ASTERISK 0x28 +#define PKEY_9 0x09 +#define PKEY_PARENTHESIS_LEFT 0x29 +#define PKEY_EQUALS 0x5B +#define PKEY_PARENTHESIS_RIGHT 0x7B +#define PKEY_PLUS 0x0E +#define PKEY_SIGMA 0x2E +#define PKEY_ASSIGN 0x0D +#define PKEY_SHIFT 0x2D +#define PKEY_MINUS 0x0F +#define PKEY_DELTA 0x2F +#define PKEY_DIVIDE 0x0B +#define PKEY_INTERSECT 0x2B +#define PKEY_MULTIPLY 0x0A +#define PKEY_UNION 0x2A +#define PKEY_SEMICOLON 0x5c +#define PKEY_COLON 0x7c +#define PKEY_PERIOD 0x5e +#define PKEY_EXCLAMATION 0x7e +#define PKEY_COMMA 0x5f +#define PKEY_QUOTE 0x7f +#define PKEY_SLASH 0x5d +#define PKEY_QUESTION_MARK 0x7d +#define PKEY_SUPER 0x10 +#define PKEY_SUPER1 0x30 +#define PKEY_SUB 0x11 +#define PKEY_SUB1 0x31 +#define PKEY_ANS 0x12 +#define PKEY_TERM 0x32 +#define PKEY_COPY 0x1B +#define PKEY_COPY1 0x3B +#define PKEY_TAB 0x0c +#define PKEY_CR 0x2c +#define PKEY_ERASE 0x13 +#define PKEY_ERASE1 0x33 +#define PKEY_MICRO 0x14 +#define PKEY_FONT 0x34 +#define PKEY_HELP 0x15 +#define PKEY_HELP1 0x35 +#define PKEY_SQUARE 0x1C +#define PKEY_ACCESS 0x3C +#define PKEY_NEXT 0x16 +#define PKEY_NEXT1 0x36 +#define PKEY_EDIT 0x17 +#define PKEY_EDIT1 0x37 +#define PKEY_BACK 0x18 +#define PKEY_BACK1 0x38 +#define PKEY_LAB 0x1D +#define PKEY_LAB1 0x3D +#define PKEY_DATA 0x19 +#define PKEY_DATA1 0x39 +#define PKEY_STOP 0x1a +#define PKEY_STOP1 0x3a +#define PKEY_SPACE 0x40 +#define PKEY_BACKSPACE 0x60 +#define PKEY_PRINT 0x1F +#define PKEY_PRINT1 0x3F +#define PKEY_NOKEY 0xFF /* no key mapping */ + +/* The following keys require an ACCESS key combination */ +#define PKEY_ALPHA 0x80 +#define PKEY_BETA 0x81 +#define PKEY_CEDILLA 0x82 +#define PKEY_LOWERCASE_DELTA 0x83 +#define PKEY_ACUTE_ACCENT 0x84 +#define PKEY_LOWERCASE_AE 0x85 +#define PKEY_LOWERCASE_OE 0x86 +#define PKEY_LOWERCASE_A_WITH_RING 0x87 +#define PKEY_LOWERCASE_A_WITH_DIAERESIS 0x88 +#define PKEY_LAMBDA 0x89 +#define PKEY_MU 0x8A +#define PKEY_TILDE 0x8B +#define PKEY_DEGREE 0x8C +#define PKEY_PI 0x8D +#define PKEY_GRAVE 0x8E +#define PKEY_RHO 0x8F +#define PKEY_LOWERCASE_SIGMA 0x90 +#define PKEY_THETA 0x91 +#define PKEY_DIARESIS 0x92 +#define PKEY_HACEK 0x93 +#define PKEY_CAPITAL_PI 0x94 +#define PKEY_CIRCUMFLEX 0x95 +#define PKEY_LEFT_EMBED 0x96 +#define PKEY_RIGHT_EMBED 0x97 +#define PKEY_AT 0x98 +#define PKEY_ARROW 0x99 +#define PKEY_AMPERSAND 0x9A +#define PKEY_INTERPUNCT 0x9B +#define PKEY_LOWER_TILDE 0x9C +#define PKEY_DELIMITER 0x9D +#define PKEY_BACKSLASH 0x9E +#define PKEY_NOT_EQUAL 0x9F +#define PKEY_LOWERCASE_O_WITH_DIARESIS 0xA0 +#define PKEY_LEFT_ARROW 0xA1 +#define PKEY_DOWN_ARROW 0xA2 +#define PKEY_RIGHT_ARROW 0xA3 +#define PKEY_UP_ARROW 0xA4 +#define PKEY_COPYRIGHT 0xA5 +#define PKEY_DIAMOND 0xA6 +#define PKEY_UPPERCASE_AE 0xA7 +#define PKEY_UPPERCASE_OE 0xA8 +#define PKEY_BAR 0xA9 +#define PKEY_UPPERCASE_A_WITH_RING 0xAA +#define PKEY_UPPERCASE_A_WITH_DIAERESIS 0xAB +#define PKEY_ACCESS_SQUARE 0xAC +#define PKEY_UPPERCASE_O_WITH_DIARESIS 0xAD +#define PKEY_LESS_THAN_OR_EQUAL 0xAE +#define PKEY_GREATER_THAN_OR_EQUAL 0xAF +#define PKEY_LEFT_CURLY_BRACE 0xB0 +#define PKEY_RIGHT_CURLY_BRACE 0xB1 +#define PKEY_POUND 0xB2 +#define PKEY_BIG_CROSS 0xB3 +#define PKEY_EQUIVALENT 0xB4 + +/* ACCESS Key combinations. */ +static const unsigned char ACCESS_KEYS[] = { + PKEY_a, /* 0x80 a ɑ alpha */ + PKEY_B, /* 0x81 b ß beta */ + PKEY_c, /* 0x82 c cedilla */ + PKEY_d, /* 0x83 d δ delta */ + PKEY_e, /* 0x84 e ' acute accent */ + PKEY_g, /* 0x85 g æ ae */ + PKEY_h, /* 0x86 h oe oe */ + PKEY_j, /* 0x87 j å a with ring */ + PKEY_k, /* 0x88 k ä a with diaeresis */ + PKEY_l, /* 0x89 l ƛ lambda */ + PKEY_m, /* 0x8A m μ mu */ + PKEY_n, /* 0x8B n ~ tilde */ + PKEY_o, /* 0x8C o ° degree */ + PKEY_p, /* 0x8D p π pi */ + 0x51, /* 0x8E q ` grave */ + PKEY_r, /* 0x8F r ρ rho */ + PKEY_s, /* 0x90 s σ sigma */ + PKEY_t, /* 0x91 t θ theta */ + PKEY_u, /* 0x92 u ¨ diaeresis */ + PKEY_v, /* 0x93 v hacek (upside down circumflex) */ + PKEY_w, /* 0x94 w ϖ capital pi */ + PKEY_x, /* 0x95 x ^ circumflex */ + PKEY_0, /* 0x96 0 l-embed */ + PKEY_1, /* 0x97 1 r-embed */ + PKEY_5, /* 0x98 5 @ */ + PKEY_6, /* 0x99 6 arrow */ + PKEY_PLUS, /* 0x9a + & */ + 0x26, /* 0x9b & interpunct */ + PKEY_COLON, /* 0x9c : ~ lower tilde */ + 0x5f, /* 0x9d , delimiter */ + PKEY_SLASH, /* 0x9e / \ */ + PKEY_EQUALS, /* 0x9f = not equal */ + PKEY_y, /* 0xA0 y ö */ + 0x61, /* 0xA1 A left arrow */ + 0x78, /* 0xA2 X down arrow */ + 0x64, /* 0xA3 D right arrow */ + 0x77, /* 0xA4 W up arrow */ + 0x63, /* 0xA5 C © */ + 0x66, /* 0xA6 F ♦ */ + 0x67, /* 0xA7 G Æ */ + 0x68, /* 0xA8 H OE */ + 0x69, /* 0xA9 I | */ + 0x6A, /* 0xAA J Å */ + 0x6B, /* 0xAB K Ä */ + 0x6F, /* 0xAC O SQUARE */ + 0x79, /* 0xAD Y Ö */ + 0x20, /* 0xAE < ≤ */ + 0x21, /* 0xAF > ≥ */ + 0x5B, /* 0xB0 [ { */ + PKEY_SLASH, /* 0xB1 ] } */ + 0x24, /* 0xB2 $ # */ + 0x9a, /* 0xB3 & big cross */ + 0x7B /* 0xB4 EQUIVALENT */ +}; + +#endif /* PLATO_KEY_H */ + diff --git a/protocol.c b/protocol.c new file mode 100755 index 0000000..e676580 --- /dev/null +++ b/protocol.c @@ -0,0 +1,987 @@ +/** + * PLATOTerm64 - A PLATO Terminal for the Commodore 64 + * Based on Steve Peltz's PAD + * + * Author: Thomas Cherryhomes + * This file written by Steve Peltz. Copyright notice preserved. + * and this code has been used with permission, and can be considered + * public domain. + * + * protocol.c - Protocol decoder functions + */ + +/* Copyright (c) 1990 by Steve Peltz */ + +#include "protocol.h" + +#define true 1 +#define false 0 + +#define BSIZE 64 + +static padBool EscFlag; /* Currently in an escape sequence */ +static Mode PMode, /* Mode */ + CMode; /* Command */ +static unsigned short SubMode; /* Block/Line modes */ +static DataType PType, /* Mode type */ + CType; /* Current type */ +static unsigned short Phase; /* Phase of current type */ +static padWord theWord; /* Data received for various data types */ +static padByte theChar; +static padByte rawChar; +static padByte lastChar; +static padRGB theColor; +static unsigned short LowX, /* Previous coordinates received */ + HiX, LowY, HiY; +static padPt CurCoord; /* Current coordinate */ +static padWord Margin; /* Margin for CR */ +static padWord MemAddr; /* Load address for program data */ +static unsigned short CharCnt; /* Current count for loading chars */ +static charData Char; /* Character data */ +static padByte charBuff[BSIZE]; +static unsigned short charCount; /* Count of characters currently buffered */ +static padPt charCoord; + +extern unsigned char terminal_get_features(void); +extern unsigned char terminal_get_type(void); +extern unsigned char terminal_get_subtype(void); +extern unsigned char terminal_get_load_file(void); +extern unsigned char terminal_get_configuration(void); +extern unsigned short terminal_get_char_address(void); +extern padByte terminal_mem_read(padWord addr); +extern padByte terminal_ext_in(void); + +extern void screen_wait(void); +extern void screen_beep(void); +extern void io_send_byte(unsigned char b); +extern void screen_block_draw(padPt* Coord1, padPt* Coord2); +extern void screen_dot_draw(padPt* Coord); +extern void screen_line_draw(padPt* Coord1, padPt* Coord2); +extern void screen_char_draw(padPt* Coord, unsigned char* ch, unsigned char count); +extern void screen_tty_char(padByte theChar); +extern void screen_foreground(padRGB* theColor); +extern void screen_background(padRGB* theColor); +extern void screen_paint(padPt* Coord); +extern void terminal_mem_load(padWord addr, padWord value); +extern void terminal_char_load(padWord charnum, charData theChar); +extern void terminal_mode_5(padWord value); +extern void terminal_mode_6(padWord value); +extern void terminal_mode_7(padWord value); +extern void touch_allow(padBool allow); +extern void terminal_ext_allow(padBool allow); +extern void terminal_set_ext_in(padWord device); +extern void terminal_set_ext_out(padWord device); +extern void terminal_ext_out(padByte value); +extern void screen_clear(void); +extern void terminal_set_tty(void); +extern void terminal_set_plato(void); + +#ifdef PROTOCOL_DEBUG +extern void log(const char* format, ...); +#endif + +static padByte PTAT0[128] = { /* PLATO to ASCII lookup table */ + 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, /* original mapping */ + 0x38, 0x39, 0x26, 0x60, 0x0a, 0x5e, 0x2b, 0x2d, + 0x13, 0x04, 0x07, 0x08, 0x7b, 0x0b, 0x0d, 0x1a, + 0x02, 0x12, 0x01, 0x03, 0x7d, 0x0c, 0x83, 0x85, + 0x3c, 0x3e, 0x5b, 0x5d, 0x24, 0x25, 0x5f, 0x7c, + 0x2a, 0x28, 0x40, 0x27, 0x1c, 0x5c, 0x23, 0x7e, + 0x17, 0x05, 0x14, 0x19, 0x7f, 0x09, 0x1e, 0x18, + 0x0e, 0x1d, 0x11, 0x16, 0x00, 0x0f, 0x87, 0x88, + 0x20, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, + 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, + 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, + 0x78, 0x79, 0x7a, 0x3d, 0x3b, 0x2f, 0x2e, 0x2c, + 0x1f, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, + 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, + 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, + 0x58, 0x59, 0x5a, 0x29, 0x3a, 0x3f, 0x21, 0x22 +}; + +static padByte PTAT1[128] = { + 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, /* flow control mapping */ + 0x38, 0x39, 0x26, 0x60, 0x09, 0x5e, 0x2b, 0x2d, + 0x17, 0x04, 0x07, 0x08, 0x7b, 0x0b, 0x0d, 0x1a, + 0x02, 0x12, 0x01, 0x03, 0x7d, 0x0c, 0x83, 0x85, + 0x3c, 0x3e, 0x5b, 0x5d, 0x24, 0x25, 0x5f, 0x27, + 0x2a, 0x28, 0x40, 0x7c, 0x1c, 0x5c, 0x23, 0x7e, + 0x97, 0x84, 0x14, 0x19, 0x7f, 0x0a, 0x1e, 0x18, + 0x0e, 0x1d, 0x05, 0x16, 0x9d, 0x0f, 0x87, 0x88, + 0x20, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, + 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, + 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, + 0x78, 0x79, 0x7a, 0x3d, 0x3b, 0x2f, 0x2e, 0x2c, + 0x1f, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, + 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, + 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, + 0x58, 0x59, 0x5a, 0x29, 0x3a, 0x3f, 0x21, 0x22 +}; + +/* externally referenced variables */ + +padPt PLATOSize={512,512}; /* Logical screen size */ +CharMem CurMem; /* Font to plot in */ +padBool TTY, /* TTY mode */ + FlowControl, /* Flow control on */ + ModeBold, /* Character plotting conditions */ + Rotate, Reverse; +DispMode CurMode; /* Current PLATO plotting mode */ +padBool FastText; /* Indicate to main program if text optimizations can be done. */ +padBool NoEcho=padF; + +/*----------------------------------------------* + * InitPAD, InitTTY, InitPLATO * + * * + * Called to initialize PAD variables. * + * Calls back to external routines to * + * set up proper plotting conditions. * + *----------------------------------------------*/ + +void +InitPAD (void) +{ + InitTTY (); +} + +void +InitTTY (void) +{ + charCount = 0; + EscFlag = false; + TTY = true; + FastText = true; + FlowControl = false; + terminal_set_tty(); +} + +void +InitPLATO (void) +{ + if (TTY) + InitPLATOx (); +} + +void +InitPLATOx (void) +{ + charCount = 0; + EscFlag = false; + TTY = false; + terminal_set_plato (); + SetMode (mAlpha, tByte); + LowX = 0; + HiX = 0; + LowY = 0; + HiY = 0; + CurCoord.x = 0; + CurCoord.y = 0; + MemAddr = 0; + CharCnt = 0; + Margin = 0; + ModeBold = false; + Rotate = false; + Reverse = false; + FastText = true; + CurMem = M0; + CurMode = ModeRewrite; +} + + +/*----------------------------------------------* + * Key * + * * + * Send a 10-bit internal key. If a keyset * + * key, translate, else send as escaped * + * sequence. * + *----------------------------------------------*/ + +void +Key (padWord theKey) +{ + if (theKey >> 7) + { + io_send_byte (0x1b); + io_send_byte (0x40 | (theKey & 0x3f)); + io_send_byte (0x60 | ((theKey >> 6) & 0x0f)); + } + else + { + + if (FlowControl == 0) + theKey = PTAT0[theKey]; + else + theKey = PTAT1[theKey]; + + if (theKey & 0x80) + { + io_send_byte (0x1b); + io_send_byte (theKey & 0x7f); + } + else + io_send_byte (theKey); + } +} + +/*----------------------------------------------* + * Touch * + * * + * Send a touch key (01yyyyxxxx). * + *----------------------------------------------*/ + +void Touch(padPt* where) +{ + io_send_byte(0x1b); + io_send_byte(0x1f); + io_send_byte(0x40 + (where->x & 0x1f)); + io_send_byte(0x40 + ((where->x >> 5) & 0x0f)); + io_send_byte(0x40 + (where->y & 0x1f)); + io_send_byte(0x40 + ((where->y >> 5) & 0x0f)); + + Key(0x100 | ((where->x >> 1) & 0xF0) | + ((where->y >> 5) & 0x0F)); +} + +/*----------------------------------------------* + * Ext * + * * + * Send an external key (10xxxxxxxx). * + *----------------------------------------------*/ + +void +Ext (padWord theKey) +{ + Key (0x200 | (theKey & 0xFF)); +} + + +/*----------------------------------------------* + * Echo * + * * + * Send an echo key (001xxxxxx). * + *----------------------------------------------*/ + +void +Echo (padWord theKey) +{ + if (NoEcho==padT) + return; + Key (0x080 | theKey); +} + + + +/*----------------------------------------------* + * SetCommand, SetMode * + * * + * Set state machine variables. * + *----------------------------------------------*/ + +void +SetCommand (Mode theMode, DataType theType) +{ + CMode = theMode; + CType = theType; + Phase = 0; +} + +void +SetMode (Mode theMode, DataType theType) +{ + PMode = theMode; + PType = theType; + SubMode = 0; + SetCommand (theMode, theType); +} + + +/*----------------------------------------------* + * FixXY * + * * + * Move location by offset, then make sure * + * it is still on the screen. * + *----------------------------------------------*/ + +void +FixXY (short DX, short DY) +{ + if (ModeBold) + { + DX = DX * 2; + DY = DY * 2; + } + if (Reverse) + DX = -DX; + if (Rotate) + { + CurCoord.x = CurCoord.x + DY; + CurCoord.y = CurCoord.y + DX; + } + else + { + CurCoord.x = CurCoord.x + DX; + CurCoord.y = CurCoord.y + DY; + } + + if (CurCoord.x < 0) + CurCoord.x += PLATOSize.x; + else if (CurCoord.x >= PLATOSize.x) + CurCoord.x -= PLATOSize.x; + + if (CurCoord.y < 0) + CurCoord.y += PLATOSize.y; + else if (CurCoord.y >= PLATOSize.y) + CurCoord.y -= PLATOSize.y; +} + + +/*----------------------------------------------* + * Superx, Subx, etc. * + * * + * Various character positioning commands. * + *----------------------------------------------*/ + +void +Superx (void) +{ + FixXY (0, 5); +} + +void +Subx (void) +{ + FixXY (0, -5); +} + +void +Marginx (void) +{ + if (Rotate) + Margin = CurCoord.y; + else + Margin = CurCoord.x; +} + +void +BSx (void) +{ + FixXY (-8, 0); +} + +void +HTx (void) +{ + FixXY (8, 0); +} + +void +LFx (void) +{ + FixXY (0, -16); +} + +void +VTx (void) +{ + FixXY (0, 16); +} + +void +FFx (void) +{ + CurCoord.y = 0; + CurCoord.x = 0; + LFx (); +} + +void +CRx (void) +{ + if (Rotate) + CurCoord.y = Margin; + else + CurCoord.x = Margin; + LFx (); +} + + +/*----------------------------------------------* + * LoadCoordx * + * * + * Assemble completed coordinate. * + *----------------------------------------------*/ + +void +LoadCoordx (padPt * SetCoord) +{ + SetCoord->x = (HiX << 5) + LowX; + SetCoord->y = (HiY << 5) + LowY; +} + + +/*----------------------------------------------* + * Blockx, Pointx, Linex, Alphax * + * * + * Plot the specified item at the * + * current location. * + *----------------------------------------------*/ + +void +Blockx (void) +{ + padPt NewCoord; + + if (SubMode == 0) + { + LoadCoordx (&CurCoord); + SubMode = 1; + } + else + { + LoadCoordx (&NewCoord); + screen_block_draw (&CurCoord, &NewCoord); + SubMode = 0; + CurCoord.y-=15; + CurCoord.x+=16; + } +} + +void +Pointx (void) +{ + LoadCoordx (&CurCoord); + screen_dot_draw (&CurCoord); +} + +void +Linex (void) +{ + padPt OldCoord; + + if (SubMode == 0) + { + LoadCoordx (&CurCoord); + SubMode = 1; + } + else + { + OldCoord.y = CurCoord.y; + OldCoord.x = CurCoord.x; + LoadCoordx (&CurCoord); + screen_line_draw (&OldCoord, &CurCoord); + } +} + +void +Alphax (void) +{ + if (charCount == 0) + charCoord = CurCoord; + charBuff[charCount++] = theChar; + HTx (); + if (charCount >= BSIZE) + { + screen_char_draw (&charCoord, charBuff, charCount); + charCount = 0; + } +} + + +/*----------------------------------------------* + * LoadEchox * + * * + * Echo responses to system. * + *----------------------------------------------*/ + +void +LoadEchox (void) +{ + theWord &= 0x7f; + switch (theWord) + { + + case 0x52: + FlowControl=true; + if (FlowControl) + Echo (0x53); /* flow control on */ + else + Echo (0x52); /* flow control not on */ + break; + case 0x60: /* Inquire about ascii specific features. */ + Echo (terminal_get_features()); + break; + case 0x70: + Echo (terminal_get_type ()); /* terminal type */ + break; + + case 0x71: + Echo (terminal_get_subtype()); /* subtype */ + break; + + case 0x72: + Echo (terminal_get_load_file ()); /* load file */ + break; + + case 0x73: + Echo (terminal_get_configuration ()); /* configuration */ + break; + + case 0x7A: + Key (0x3FF); /* send backout */ + break; + + case 0x7B: + screen_beep (); + break; /* beep */ + + case 0x7D: + Echo (terminal_mem_read (MemAddr) & 0x7F); + break; + + default: + Echo (theWord); /* normal echo */ + break; + } +} + +void +LoadAddrx (void) +{ + MemAddr = theWord; + CharCnt = 0; +} + +void +LoadCharx (void) +{ + Char[CharCnt] = theWord; + if (CharCnt < 7) + CharCnt++; + else + { + terminal_char_load ((((MemAddr - terminal_get_char_address ()) >> 4) & 0x7f), Char); + CharCnt = 0; + MemAddr += 16; + } +} + +void +LoadMemx (void) +{ + terminal_mem_load (MemAddr, theWord); + MemAddr += 2; +} + +void +SSFx (void) +{ + padByte device; + + device = (theWord >> 10) & 0xFF; + if (device == 1) + { + terminal_ext_allow ((theWord >> 3) & 1); + touch_allow ((theWord >> 5) & 1); + } + else if ((theWord >> 9) & 1) + { + terminal_set_ext_in (device); + if (!((theWord >> 8) & 1)) + Ext (terminal_ext_in ()); + } + else + { + terminal_set_ext_out (device); + if (!((theWord >> 8) & 1)) + terminal_ext_out (theWord & 0xFF); + } +} + +void +Externalx (void) +{ + terminal_ext_out ((theWord >> 8) & 0xFF); + terminal_ext_out (theWord & 0xFF); +} + +void +GoMode (void) +{ + switch (CMode) + { + case mBlock: + Blockx (); + break; + case mPoint: + Pointx (); + break; + case mLine: + Linex (); + break; + case mAlpha: + Alphax (); + break; + case mLoadCoord: + LoadCoordx (&CurCoord); + break; + case mLoadAddr: + LoadAddrx (); + break; + case mSSF: + SSFx (); + break; + case mExternal: + Externalx (); + break; + case mLoadEcho: + LoadEchox (); + break; + case mLoadChar: + LoadCharx (); + break; + case mLoadMem: + LoadMemx (); + break; + case mMode5: + terminal_mode_5 (theWord); + break; + case mMode6: + terminal_mode_6 (theWord); + break; + case mMode7: + terminal_mode_7 (theWord); + break; + case mFore: + screen_foreground(&theColor); + break; + case mBack: + screen_background(&theColor); + break; + case mPaint: + screen_paint(&CurCoord); + break; + } + CMode = PMode; + CType = PType; + Phase = 0; +} + +void +GoWord (void) +{ + switch (Phase) + { + case 0: + theWord = theChar & 0x3F; + Phase = 1; + break; + case 1: + theWord |= ((theChar & 0x3F) << 6); + Phase = 2; + break; + case 2: + theWord |= ((theChar & 0x3F) << 12); + GoMode (); + break; + } +} + +void +GoCoord (void) +{ + unsigned short CoordType, CoordValue; + + CoordValue = theChar & 0x1F; + CoordType = ((theChar >> 5) & 3); + switch (CoordType) + { + case 1: + switch (Phase) + { + case 0: + HiY = CoordValue; + break; + case 1: + HiX = CoordValue; + break; + } + Phase = 1; + break; + case 2: + LowX = CoordValue; + GoMode (); + break; + case 3: + LowY = CoordValue; + Phase = 1; + break; + } +} + +void +GoColor (void) +{ + switch (Phase) + { + case 0: + theColor.blue = (theChar & 0x3f); + break; + case 1: + theColor.blue |= (theChar & 0x03) << 6; + theColor.green = (theChar & 0x3c) >> 2; + break; + case 2: + theColor.green |= (theChar & 0x0f) << 4; + theColor.red = (theChar & 0x30) >> 4; + break; + case 3: + theColor.red |= (theChar & 0x3f) << 2; + break; + } + if (Phase < 3) + Phase++; + else + GoMode (); +} + +void +GoPaint (void) +{ + if (Phase == 0) + Phase = 1; + else + GoMode (); + +} + +void +DataChar (void) +{ + switch (CType) + { + case tByte: + Alphax (); + break; + case tWord: + GoWord (); + break; + case tCoord: + GoCoord (); + break; + case tColor: + GoColor (); + break; + case tPaint: + GoPaint (); + break; + } +} + +void +ShowPLATO (padByte *buff, unsigned short count) +{ + while (count--) + { + theChar = *buff++; + if (lastChar==0xFF && theChar==0xFF) + { + lastChar=0; + } + else + { + rawChar=theChar; + theChar &=0x7F; + if (TTY) + { + if (!EscFlag) + screen_tty_char (theChar); + else if (theChar == 0x02) + InitPLATOx (); + } + else if (EscFlag) + { + switch (theChar) + { + case 0x03: + InitTTY (); + break; + + case 0x0C: + screen_clear (); + break; + + case 0x11: + CurMode = ModeInverse; + SetFast(); + break; + case 0x12: + CurMode = ModeWrite; + SetFast(); + break; + case 0x13: + CurMode = ModeErase; + SetFast(); + break; + case 0x14: + CurMode = ModeRewrite; + SetFast(); + break; + + case 0x32: + SetCommand (mLoadCoord, tCoord); + break; + + case 0x40: + Superx (); + break; + case 0x41: + Subx (); + break; + + case 0x42: + CurMem = M0; + break; + case 0x43: + CurMem = M1; + break; + case 0x44: + CurMem = M2; + break; + case 0x45: + CurMem = M3; + break; + + case 0x4A: + Rotate = false; + SetFast(); + break; + case 0x4B: + Rotate = true; + SetFast(); + break; + case 0x4C: + Reverse = false; + SetFast(); + break; + case 0x4D: + Reverse = true; + SetFast(); + break; + case 0x4E: + ModeBold = false; + SetFast(); + break; + case 0x4F: + ModeBold = true; + SetFast(); + break; + + case 0x50: + SetMode (mLoadChar, tWord); + break; + case 0x51: + SetCommand (mSSF, tWord); + break; + case 0x52: + SetCommand (mExternal, tWord); + break; + case 0x53: + SetMode (mLoadMem, tWord); + break; + case 0x54: + SetMode (mMode5, tWord); + break; + case 0x55: + SetMode (mMode6, tWord); + break; + case 0x56: + SetMode (mMode7, tWord); + break; + case 0x57: + SetCommand (mLoadAddr, tWord); + break; + case 0x59: + SetCommand (mLoadEcho, tWord); + break; + + case 0x5A: + Marginx (); + break; + + case 0x61: + SetCommand (mFore, tColor); + break; + case 0x62: + SetCommand (mBack, tColor); + break; + case 0x63: + SetCommand (mPaint, tPaint); + break; + } + } + else if (theChar < 0x20) + { + if (charCount > 0) + { + screen_char_draw (&charCoord, charBuff, charCount); + charCount = 0; + } + switch (theChar) + { + case 0x00: + screen_wait(); + case 0x08: + BSx (); + break; + case 0x09: + HTx (); + break; + case 0x0A: + LFx (); + break; + case 0x0B: + VTx (); + break; + case 0x0C: + FFx (); + break; + case 0x0D: + CRx (); + break; + + case 0x19: + SetMode (mBlock, tCoord); + break; + case 0x1C: + SetMode (mPoint, tCoord); + break; + case 0x1D: + SetMode (mLine, tCoord); + break; + case 0x1F: + SetMode (mAlpha, tByte); + break; + } + } + else + DataChar (); + + EscFlag = (theChar == 0x1B); + lastChar=rawChar; + } + } + if (charCount > 0) + { + screen_char_draw (&charCoord, charBuff, charCount); + charCount = 0; + } +} + +/** + * SetFast() + * Toggle fast text output if mode = write or erase, and no rotate or bold + */ +void SetFast(void) +{ + FastText = (((CurMode == ModeWrite) || (CurMode == ModeErase)) && ((Rotate == padF) && (ModeBold == padF))); +} diff --git a/protocol.h b/protocol.h new file mode 100755 index 0000000..131a9ab --- /dev/null +++ b/protocol.h @@ -0,0 +1,95 @@ +/** + * PLATOTerm64 - A PLATO Terminal for the Commodore 64 + * Based on Steve Peltz's PAD + * + * Author: Thomas Cherryhomes + * This file written by Steve Peltz. Copyright notice preserved. + * and this code has been used with permission, and can be considered + * public domain. + * + * protocol.h - Protocol decoder functions + */ + +/* Copyright (c) 1990 by Steve Peltz */ + +#ifndef PROTOCOL_H +#define PROTOCOL_H + +#define ACCESS 0x3c + +typedef unsigned char padByte; +typedef enum {padF, padT} padBool; +typedef unsigned char padChar; +typedef short padWord; +typedef padWord charData[8]; +typedef struct { + padByte red, + green, + blue; + } padRGB; + +typedef struct { + padWord x, + y; + } padPt; + +typedef enum {ModeWrite, ModeErase, ModeRewrite, ModeInverse} DispMode; +typedef enum {M0, M1, M2, M3} CharMem; + +typedef enum { mBlock, mPoint, mLine, mAlpha, mLoadCoord, mLoadChar, mSSF, + mExternal, mLoadMem, mMode5, mMode6, mMode7, mLoadAddr, + mLoadEcho, mFore, mBack, mPaint } Mode; + +typedef enum { tByte, tWord, tCoord, tColor, tPaint } DataType; + +extern padPt PLATOSize; +extern CharMem CurMem; +extern padBool TTY, + FlowControl, + ModeBold, + Rotate, + Reverse; +extern DispMode CurMode; +extern padBool NoEcho; + +void InitPAD(void); +void InitTTY(void); +void InitPLATO(void); +void InitPLATOx(void); +void Key(padWord theKey); +void Touch(padPt* where); +void Ext(padWord theKey); +void Echo(padWord theKey); +void SetCommand(Mode theMode, DataType theType); +void SetMode(Mode theMode, DataType theType); +void FixXY(short DX, short DY); +void Superx(void); +void Subx(void); +void Marginx(void); +void BSx(void); +void HTx(void); +void LFx(void); +void VTx(void); +void FFx(void); +void CRx(void); +void LoadCoordx(padPt* SetCoord); +void Blockx(void); +void Pointx(void); +void Linex(void); +void Alphax(void); +void LoadEchox(void); +void LoadAddrx(void); +void LoadCharx(void); +void LoadMemx(void); +void SSFx(void); +void Externalx(void); +void GoMode(void); +void GoWord(void); +void GoCoord(void); +void GoColor(void); +void GoPaint(void); +void DataChar(void); +void ShowPLATO(padByte* buff, unsigned short count); +void SetFast(void); + +#endif diff --git a/screen.c b/screen.c new file mode 100644 index 0000000..a7bfd38 --- /dev/null +++ b/screen.c @@ -0,0 +1,599 @@ +#include +#include +#include +#include "screen.h" +#include "font.h" +#include "protocol.h" +#include "io.h" + +#define true 1 +#define false 0 +#define FONTPTR(a) (a<<4) +#define X(x) (x) +#define Y(y) (y^0x1FF) + +char tmp[64]; +int previousMode; +unsigned char CharWide=8; +unsigned char CharHigh=16; +padPt TTYLoc; +padPt statusLoc={0,0}; +unsigned char fontm23[2048]; +extern padBool FastText; /* protocol.c */ +padRGB palette[16]; +unsigned long current_foreground=1; +unsigned long current_background=0; +padRGB current_foreground_rgb={255,255,255}; +padRGB current_background_rgb={0,0,0}; +int highest_color_index; +padRGB palette_help[16]; +padRGB palette_backup[16]; +unsigned long current_foreground_backup=1; +unsigned long current_background_backup=0; +padRGB current_foreground_rgb_backup={255,255,255}; +padRGB current_background_rgb_backup={0,0,0}; +int highest_color_index_backup; +unsigned char help_active=false; + +/** + * screen_init() - Set up the screen + */ +void screen_init(void) +{ +} + +/** + * screen_update_colors() - Set the terminal colors + */ +void screen_update_colors(void) +{ +} + +/** + * screen_clear_palette - Clear the palette + */ +void screen_clear_palette(void) +{ + int i; + for (i=0;i<8;i++) + { + palette[i].red=0; + palette[i].green=0; + palette[i].blue=0; + } +} + + +/** + * screen_wait(void) - Sleep for approx 16.67ms + */ +void screen_wait(void) +{ +} + +/** + * screen_beep(void) - Beep the terminal + */ +void screen_beep(void) +{ +} + +/** + * screen_clear - Clear the screen + */ +void screen_clear(void) +{ +} + +/** + * screen_color_matching(color) - return index of matching color, or a new index, + * if not found. + */ +unsigned char screen_color_matching(padRGB* theColor) +{ + unsigned char i; + for (i=0;i<8;i++) + { + if (i>highest_color_index) + { + palette[i].red=theColor->red; + palette[i].green=theColor->green; + palette[i].blue=theColor->blue; + highest_color_index++; + return i; + } + else + { + if ((palette[i].red==theColor->red) && + (palette[i].green==theColor->green) && + (palette[i].blue==theColor->blue)) + { + return i; + } + } + } +} + +/** + * screen_foreground - set foreground color + */ +void screen_foreground(padRGB* theColor) +{ + current_foreground_rgb.red=theColor->red; + current_foreground_rgb.green=theColor->green; + current_foreground_rgb.blue=theColor->blue; + current_foreground=screen_color_matching(theColor); + screen_update_colors(); +} + +/** + * screen_background - set background_color + */ +void screen_background(padRGB* theColor) +{ + current_background_rgb.red=theColor->red; + current_background_rgb.green=theColor->green; + current_background_rgb.blue=theColor->blue; + current_background=screen_color_matching(theColor); + screen_update_colors(); +} + +/** + * screen_current_color(void) - Set the current pen mode + */ +int screen_current_color(void) +{ + if (CurMode==ModeInverse || CurMode==ModeErase) + return current_background; + else + return current_foreground; +} + +/** + * screen_block_draw(Coord1, Coord2) - Perform a block fill from Coord1 to Coord2 + */ +void screen_block_draw(padPt* Coord1, padPt* Coord2) +{ +} + +/** + * screen_dot_draw(Coord) - Plot a mode 0 pixel + */ +void screen_dot_draw(padPt* Coord) +{ +} + +/** + * screen_line_draw(Coord1, Coord2) - Draw a mode 1 line + */ +void screen_line_draw(padPt* Coord1, padPt* Coord2) +{ +} + +/** + * screen_char_draw(Coord, ch, count) - Output buffer from ch* of length count as PLATO characters + */ +void screen_char_draw(padPt* Coord, unsigned char* ch, unsigned char count) +{ + short offset; /* due to negative offsets */ + unsigned short x; /* Current X and Y coordinates */ + unsigned short y; + unsigned short* px; /* Pointers to X and Y coordinates used for actual plotting */ + unsigned short* py; + unsigned char i; /* current character counter */ + unsigned char a; /* current character byte */ + unsigned char j,k; /* loop counters */ + char b; /* current character row bit signed */ + unsigned char width=8; + unsigned char height=16; + unsigned char FONT_SIZE_X=8; + unsigned char FONT_SIZE_Y=16; + unsigned short deltaX=1; + unsigned short deltaY=1; + unsigned char mainColor=1; + unsigned char altColor=0; + unsigned char *p; + unsigned char* curfont; + + switch(CurMem) + { + case M0: + curfont=font; + offset=-32; + break; + case M1: + curfont=font; + offset=64; + break; + case M2: + curfont=fontm23; + offset=-32; + break; + case M3: + curfont=fontm23; + offset=32; + break; + } + + if (CurMode==ModeRewrite) + { + altColor=current_background; + } + else if (CurMode==ModeInverse) + { + altColor=current_foreground; + } + + if (CurMode==ModeErase || CurMode==ModeInverse) + mainColor=current_background; + else + mainColor=current_foreground; + + x=X(Coord->x&0x1FF); + + if (ModeBold) + y=Y((Coord->y)+30&0x1FF); + else + y=Y((Coord->y)+15&0x1FF); + + if (FastText==padF) + { + goto chardraw_with_fries; + } + + /* the diet chardraw routine - fast text output. */ + + for (i=0;ix+=width; + x+=width; + y-=height; + } + + return; + +} + +/** + * screen_tty_char - Called to plot chars when in tty mode + */ +void screen_tty_char(padByte theChar) +{ + if ((theChar >= 0x20) && (theChar < 0x7F)) { + screen_char_draw(&TTYLoc, &theChar, 1); + TTYLoc.x += CharWide; + } + else if ((theChar == 0x0b)) /* Vertical Tab */ + { + TTYLoc.y += CharHigh; + } + else if ((theChar == 0x08) && (TTYLoc.x > 7)) /* backspace */ + { + padPt ec1,ec2; + TTYLoc.x -= CharWide; + ec1.x=TTYLoc.x; + ec1.y=TTYLoc.y; + ec2.x=TTYLoc.x+CharWide; + ec2.y=TTYLoc.y+CharHigh; + CurMode=ModeErase; + screen_block_draw(&ec1,&ec2); + CurMode=ModeRewrite; + } + else if (theChar == 0x0A) /* line feed */ + TTYLoc.y -= CharHigh; + else if (theChar == 0x0D) /* carriage return */ + TTYLoc.x = 0; + + if (TTYLoc.x + CharWide > 511) { /* wrap at right side */ + TTYLoc.x = 0; + TTYLoc.y -= CharHigh; + } + + if (TTYLoc.y < 0) { + screen_clear(); + TTYLoc.y=495; + } + +} + +/** + * screen_paint - Called to paint at location. + */ +void screen_paint(padPt* Coord) +{ +} + +/** + * screen_clear_status(void) + * Clear status area + */ +void screen_clear_status(void) +{ +} + +/** + * screen_show_status(msg) + */ +void screen_show_status(unsigned char* msg) +{ + int previous_foreground=current_foreground; + int previous_background=current_background; + padPt coord={0,0}; + screen_clear_status(); + current_foreground=0; + current_background=1; + screen_char_draw(&coord,msg,strlen(msg)); + current_foreground=previous_foreground; + current_background=previous_background; +} + +/** + * screen_show_baud_rate - Show baud rate + */ +void screen_show_baud_rate(int baud) +{ + sprintf(tmp,"%d Baud",baud); + screen_show_status(tmp); +} + +/** + * screen_show_dial - Show dial in TTY mode + */ +void screen_show_dial(void) +{ +} + +/** + * screen_show_hang_up - Show hang-up message + */ +void screen_show_hang_up(void) +{ + screen_show_status("Hanging up..."); +} + +/** + * screen_show_dialing_status - Show dialing status. + */ +void screen_show_dialing_status(void) +{ + screen_show_status("Dialing..."); +} + +/** + * screen_help_save_palette(void) - Save initial help palette + * for future restore by screen_help_restore_palette(void) + */ +void screen_help_save_palette(void) +{ + int i; + for (i=0;i<16;i++) + { + palette_help[i].red=palette[i].red; + palette_help[i].green=palette[i].green; + palette_help[i].blue=palette[i].blue; + } +} + +/** + * screen_help_restore_palette(void) - Restore the help + * palette, because the help screen is visible. + */ +void screen_help_restore_palette(void) +{ + int i; + for (i=0;i<16;i++) + { + palette[i].red=palette_help[i].red; + palette[i].green=palette_help[i].green; + palette[i].blue=palette_help[i].blue; + } + screen_update_colors(); +} + +/** + * screen_save_palette(void) - Save current screen palette state + * for restore by screen_restore_palette(void) + */ +void screen_save_palette(void) +{ + int i; + + current_foreground_backup=current_foreground; + current_background_backup=current_background; + current_foreground_rgb_backup.red=current_foreground_rgb.red; + current_foreground_rgb_backup.green=current_foreground_rgb.green; + current_foreground_rgb_backup.blue=current_foreground_rgb.blue; + current_background_rgb_backup.red=current_background_rgb.red; + current_background_rgb_backup.green=current_background_rgb.green; + current_background_rgb_backup.blue=current_background_rgb.blue; + highest_color_index_backup=highest_color_index; + + for (i=0;i<16;i++) + { + palette_backup[i].red=palette[i].red; + palette_backup[i].green=palette[i].green; + palette_backup[i].blue=palette[i].blue; + } + +} + +/** + * screen_restore_palette(void) - Restore current screen palette + * upon return from help screen. + */ +void screen_restore_palette(void) +{ + int i; + + current_foreground=current_foreground_backup; + current_background=current_background_backup; + current_foreground_rgb.red=current_foreground_rgb_backup.red; + current_foreground_rgb.green=current_foreground_rgb_backup.green; + current_foreground_rgb.blue=current_foreground_rgb_backup.blue; + current_background_rgb.red=current_background_rgb_backup.red; + current_background_rgb.green=current_background_rgb_backup.green; + current_background_rgb.blue=current_background_rgb_backup.blue; + highest_color_index=highest_color_index_backup; + + for (i=0;i<16;i++) + { + palette[i].red=palette_backup[i].red; + palette[i].green=palette_backup[i].green; + palette[i].blue=palette_backup[i].blue; + } + + screen_update_colors(); + +} + +/** + * screen_show_help - SHow help + */ +void screen_show_help(void) +{ +} + +/** + * screen_trace_status - Show trace status + */ +void screen_trace_status(const char* status) +{ + char tmp_status_msg[13]; + sprintf(tmp_status_msg,"TRACE: %s",status); + screen_show_status(tmp_status_msg); +} + +/** + * screen_help_mode_status(void) + * Put help mode status at bottom of help screen + */ +void screen_help_mode_status(void) +{ + screen_show_status("HELP Mode - Press any key to return to terminal."); +} + +/** + * screen_greeting(void) + * show initial greeting + */ +void screen_greeting(void) +{ + /* sprintf(tmp,"v1.0 Ready - %5d baud - Press HELP for keys.",config.baud); */ + screen_show_status(tmp); +} + +/** + * screen_done() + * Close down TGI + */ +void screen_done(void) +{ +} diff --git a/screen.h b/screen.h new file mode 100755 index 0000000..f4a833b --- /dev/null +++ b/screen.h @@ -0,0 +1,168 @@ +/** + * PLATOTerm64 - A PLATO Terminal for the Commodore 64 + * Based on Steve Peltz's PAD + * + * Author: Thomas Cherryhomes + * + * screen.h - Display output functions + */ + +#ifndef SCREEN_H +#define SCREEN_H + +#include "protocol.h" + +/** + * screen_init() - Set up the screen + */ +void screen_init(void); + +/** + * screen_update_colors() - Set the terminal colors + */ +void screen_update_colors(void); + +/** + * screen_wait(void) - Sleep for approx 16.67ms + */ +void screen_wait(void); + +/** + * screen_beep(void) - Beep the terminal + */ +void screen_beep(void); + +/** + * screen_clear_palette - Clear the palette + */ +void screen_clear_palette(void); + +/** + * screen_clear - Clear the screen + */ +void screen_clear(void); + +/** + * screen_current_color(void) - Set the current pen mode + */ +int screen_current_color(void); + +/** + * screen_block_draw(Coord1, Coord2) - Perform a block fill from Coord1 to Coord2 + */ +void screen_block_draw(padPt* Coord1, padPt* Coord2); + +/** + * screen_dot_draw(Coord) - Plot a mode 0 pixel + */ +void screen_dot_draw(padPt* Coord); + +/** + * screen_line_draw(Coord1, Coord2) - Draw a mode 1 line + */ +void screen_line_draw(padPt* Coord1, padPt* Coord2); + +/** + * screen_char_draw(Coord, ch, count) - Output buffer from ch* of length count as PLATO characters + */ +void screen_char_draw(padPt* Coord, unsigned char* ch, unsigned char count); + +/** + * screen_tty_char - Called to plot chars when in tty mode + */ +void screen_tty_char(unsigned char theChar); + +/** + * screen_color_matching(color) - return index of matching color, or a new index, + * if not found. + */ +unsigned char screen_color_matching(padRGB* theColor); + +/** + * screen_foreground - Called to set foreground color. + */ +void screen_foreground(padRGB* theColor); + +/** + * screen_background - Called to set foreground color. + */ +void screen_background(padRGB* theColor); + +/** + * screen_paint - Called to paint at location. + */ +void screen_paint(padPt* Coord); + +/** + * screen_show_baud_rate - Show baud rate + */ +void screen_show_baud_rate(int baud); + +/** + * screen_show_hang_up - Show hang-up message + */ +void screen_show_hang_up(void); + +/** + * screen_show_dial - Show dial in TTY mode + */ +void screen_show_dial(void); + +/** + * screen_show_dialing_status - Show dialing status. + */ +void screen_show_dialing_status(void); + +/** + * screen_help_save_palette(void) - Save initial help palette + * for future restore by screen_help_restore_palette(void) + */ +void screen_help_save_palette(void); + +/** + * screen_help_restore_palette(void) - Restore the help + * palette, because the help screen is visible. + */ +void screen_help_restore_palette(void); + +/** + * screen_save_palette(void) - Save current screen palette state + * for restore by screen_restore_palette(void) + */ +void screen_save_palette(void); + +/** + * screen_restore_palette(void) - Restore current screen palette + * upon return from help screen. + */ +void screen_restore_palette(void); + +/** + * screen_show_help - SHow help + */ +void screen_show_help(void); + +/** + * screen_trace_status - Show trace status + */ +void screen_trace_status(const char* status); + +/** + * screen_help_mode_status(void) + * Put help mode status at bottom of help screen + */ +void screen_help_mode_status(void); + +/** + * screen_greeting(void) + * show initial greeting + */ +void screen_greeting(void); + +/** + * screen_done() + * Close down TGI + */ +void screen_done(void); + +#endif /* SCREEN_H */ diff --git a/splash.h b/splash.h new file mode 100755 index 0000000..39900cc --- /dev/null +++ b/splash.h @@ -0,0 +1,1940 @@ +#include "protocol.h" + +padByte splash[] = +{ + 0x1b, + 0x02, +0x1b, +0x0c, +0x1b, +0x12, +0x1b, +0xd1, +0xc0, +0x50, +0xc0, +0x1b, +0xe1, +0xff, +0xff, +0xff, +0xff, +0xff, +0xff, +0xff, +0xff, +0x1b, +0xe2, +0xc0, +0xc0, +0xc0, +0xc0, +0x1b, +0x0c, +0x1b, +0x12, +0x1d, +0xaf, +0xf0, +0xa0, +0xc0, +0x1b, +0x5a, +0x1b, +0xd1, +0xc0, +0x44, +0x41, +0x1b, +0xd1, +0xc0, +0x50, +0xc0, +0x1b, +0x0c, +0x1b, +0x12, +0x1b, +0xd1, +0xc0, +0x50, +0xc0, +0x1b, +0x5a, +0x1b, +0xe1, +0xdb, +0x53, +0xcf, +0x7d, +0x1b, +0xe2, +0xcf, +0x7d, +0x53, +0xcf, +0x1b, +0xd1, +0xc0, +0x50, +0xc0, +0x1b, +0x0c, +0x1b, +0x12, +0x1b, +0xd1, +0xc0, +0x50, +0xc0, +0x1d, +0x2e, +0xf0, +0x21, +0xc0, +0x1b, +0x5a, +0x1d, +0x2d, +0xee, +0xa0, +0xc9, +0xaf, +0x71, +0xc9, +0xf5, +0xca, +0x77, +0xcc, +0xf9, +0x4e, +0xfa, +0xcf, +0x7b, +0xd4, +0x7b, +0x21, +0x44, +0xfa, +0xc9, +0x78, +0xcc, +0xf6, +0x50, +0x74, +0xd1, +0x71, +0x53, +0xee, +0x55, +0x6c, +0x56, +0x66, +0xd7, +0xe1, +0xd7, +0x2e, +0xfc, +0x56, +0xf9, +0xd4, +0xf6, +0xd2, +0x74, +0x50, +0x72, +0x4d, +0xf0, +0xc9, +0xee, +0xc3, +0xed, +0xa0, +0x5a, +0x59, +0x2d, +0xee, +0x59, +0xc9, +0x1d, +0x2e, +0xfc, +0x59, +0xaf, +0x6c, +0x59, +0x6c, +0x21, +0xc0, +0x42, +0xeb, +0xc3, +0x6a, +0x44, +0x69, +0xc5, +0xe7, +0xc6, +0x65, +0x47, +0xe1, +0xc6, +0x2e, +0x7e, +0x44, +0xfc, +0x41, +0xc0, +0xfc, +0xa0, +0x59, +0x1d, +0x2d, +0xf6, +0x21, +0xdb, +0xaf, +0xfa, +0xdb, +0xfa, +0x22, +0x4b, +0x2d, +0xfc, +0x4b, +0xfc, +0xa3, +0x42, +0xee, +0x42, +0xee, +0x22, +0x44, +0x42, +0xf0, +0x21, +0x5f, +0x72, +0x5c, +0xf6, +0xdb, +0x1d, +0xee, +0xa3, +0x41, +0xaf, +0xf5, +0xd7, +0x77, +0xd8, +0x78, +0x59, +0xfa, +0x5a, +0x7b, +0xdb, +0xfc, +0xde, +0x7d, +0x24, +0xc0, +0x42, +0xfc, +0xc5, +0xfa, +0x48, +0x78, +0xc9, +0xf6, +0x4b, +0x2d, +0xee, +0xa5, +0x41, +0xee, +0x24, +0x50, +0x7d, +0xcc, +0x7d, +0xa3, +0xd7, +0xee, +0xd1, +0x41, +0x1d, +0x2e, +0x6c, +0x5a, +0xaf, +0xed, +0x24, +0x41, +0x2e, +0x6c, +0x48, +0x6c, +0xa3, +0x5a, +0x1d, +0x2d, +0xee, +0xa5, +0xc9, +0xaf, +0xed, +0xc9, +0xed, +0x24, +0x5a, +0x7b, +0x5a, +0x7b, +0xa6, +0x47, +0xed, +0x47, +0xed, +0xa5, +0x59, +0x2d, +0xee, +0x59, +0xc9, +0x1d, +0x2e, +0xf0, +0x27, +0xc6, +0x1d, +0x2d, +0xee, +0xc9, +0x6f, +0xc0, +0xf0, +0xa6, +0x5c, +0x71, +0xd8, +0xf5, +0x53, +0x78, +0xd1, +0xfc, +0x4d, +0x2e, +0x60, +0xca, +0x63, +0xca, +0x66, +0x48, +0x6c, +0xc6, +0x74, +0x44, +0xf5, +0x44, +0xf9, +0x44, +0x7d, +0xc5, +0xaf, +0xe1, +0xc6, +0x65, +0x48, +0xe8, +0xca, +0x6c, +0xcc, +0xee, +0x4e, +0xf0, +0x50, +0xf3, +0x53, +0xf5, +0x55, +0x77, +0xd8, +0x78, +0xdb, +0xfa, +0x5f, +0xfc, +0x27, +0xc5, +0x7d, +0x4d, +0x4e, +0xfc, +0xd4, +0x7b, +0x59, +0xf9, +0xde, +0x77, +0x28, +0x41, +0xf6, +0xc3, +0x74, +0xc6, +0x71, +0x48, +0xee, +0x4b, +0x6a, +0x4e, +0x65, +0x50, +0xe1, +0xd2, +0x2e, +0xfc, +0xd4, +0xfa, +0xd4, +0xf5, +0xd4, +0x72, +0xd4, +0x6c, +0x53, +0x69, +0xd2, +0xe4, +0x50, +0xe1, +0xcf, +0x2d, +0x7d, +0xcc, +0xfa, +0xc9, +0xf6, +0xc6, +0xf3, +0xc3, +0x71, +0x27, +0xde, +0x6f, +0xdb, +0xee, +0x56, +0xc9, +0x1d, +0xaf, +0x6c, +0xc9, +0x4d, +0xeb, +0xd2, +0x6a, +0x55, +0xe7, +0x5a, +0x65, +0xdd, +0xe1, +0x5f, +0x2e, +0x7d, +0x28, +0x41, +0xfa, +0x42, +0xf6, +0xc3, +0xf3, +0xc3, +0xed, +0x42, +0x6a, +0xc0, +0xe7, +0x27, +0xde, +0xe4, +0xdd, +0x63, +0x5a, +0xe1, +0xd8, +0x2d, +0xff, +0xff, +0xd4, +0x7e, +0x50, +0x7d, +0x4d, +0xca, +0x7e, +0xc5, +0x2e, +0x60, +0x42, +0xe2, +0xa6, +0x5f, +0x63, +0x5c, +0x66, +0x5a, +0x69, +0xd8, +0xeb, +0xd7, +0x6c, +0x56, +0xf0, +0x55, +0x74, +0x55, +0x78, +0x55, +0x7d, +0xd7, +0xaf, +0xe1, +0x59, +0xe4, +0x5c, +0x65, +0xdd, +0xe7, +0x5f, +0xe8, +0x27, +0xc0, +0x69, +0x41, +0x6a, +0xc3, +0xeb, +0xc5, +0x6c, +0xc9, +0x1d, +0x2d, +0xee, +0xa9, +0x41, +0xaf, +0xed, +0x41, +0xed, +0x28, +0xd2, +0x7b, +0xd2, +0x7b, +0xa9, +0x5f, +0xed, +0x5f, +0xd1, +0x2d, +0xee, +0xd1, +0x41, +0x1d, +0xfc, +0xaa, +0xc6, +0xaf, +0x71, +0xc6, +0x74, +0x47, +0x77, +0x48, +0x78, +0x48, +0xf9, +0xc9, +0xfa, +0xca, +0x7b, +0xcc, +0xfc, +0xcf, +0xfc, +0x2b, +0xcc, +0x6c, +0xcc, +0x6c, +0xaa, +0x55, +0x2e, +0x7e, +0x55, +0x7e, +0x2b, +0x4b, +0xf0, +0x4b, +0xf0, +0xaa, +0x55, +0x2d, +0x7e, +0x55, +0x7e, +0x2b, +0xcc, +0xee, +0xcc, +0xee, +0xaa, +0x50, +0x6f, +0x4d, +0xf0, +0x4b, +0x71, +0xca, +0x72, +0x48, +0x74, +0x47, +0xf6, +0xc6, +0xfc, +0xc6, +0x1d, +0xee, +0x2b, +0x4e, +0xaf, +0x71, +0x4e, +0xf5, +0xcf, +0x77, +0x50, +0xd1, +0x78, +0xd2, +0xf9, +0x53, +0xfa, +0xd4, +0x7b, +0x55, +0x7b, +0xac, +0xc9, +0x4b, +0xfa, +0x4e, +0xf9, +0xd1, +0x78, +0x53, +0x77, +0x55, +0xf6, +0x56, +0xf5, +0xd7, +0xf3, +0x59, +0x72, +0x5a, +0x71, +0xdb, +0x6f, +0x5c, +0xee, +0xdd, +0x6c, +0xde, +0x69, +0x5f, +0xe7, +0x5f, +0x65, +0x5f, +0x63, +0x5f, +0x2e, +0xff, +0xff, +0xde, +0xfc, +0xdd, +0x7b, +0x5c, +0xf9, +0xdb, +0x77, +0x59, +0xf5, +0xd7, +0x74, +0x55, +0xf3, +0xd2, +0x72, +0xd1, +0x71, +0xcf, +0x2d, +0xee, +0x2d, +0x44, +0xee, +0xac, +0x50, +0x2e, +0x6f, +0xc0, +0x71, +0x2b, +0x5f, +0x74, +0x5f, +0x77, +0xac, +0xc0, +0xf9, +0x42, +0xfa, +0x44, +0x7b, +0xc5, +0xfc, +0xc6, +0x48, +0x7e, +0x4b, +0xaf, +0x60, +0x4d, +0xe2, +0x4d, +0x66, +0x4d, +0x69, +0xcc, +0xeb, +0xca, +0xed, +0x48, +0xed, +0x2b, +0xde, +0x2d, +0xee, +0xde, +0x4e, +0x1d, +0xee, +0x2d, +0x42, +0xaf, +0xf5, +0x42, +0x78, +0xc3, +0xfa, +0xc5, +0x7b, +0x47, +0xfc, +0xca, +0xcc, +0x7b, +0xd1, +0xfa, +0xd4, +0x78, +0x55, +0x77, +0x56, +0xf5, +0xd7, +0x2e, +0x63, +0x2e, +0xc6, +0xaf, +0xf5, +0xd2, +0x77, +0x53, +0xf9, +0x55, +0xfa, +0x56, +0x7b, +0xd7, +0xfc, +0xd8, +0x7d, +0xdb, +0x5f, +0xfc, +0xaf, +0x42, +0xfa, +0xc5, +0x78, +0x47, +0xf5, +0xc9, +0x72, +0xc9, +0x2d, +0xee, +0xc9, +0xee, +0x2e, +0xdb, +0xaf, +0x65, +0xdb, +0x2d, +0xf5, +0x4e, +0x72, +0x4e, +0xf0, +0xcc, +0xee, +0xc9, +0xc3, +0xf0, +0xc0, +0x71, +0x2d, +0x5f, +0x72, +0xde, +0x78, +0xdd, +0x7e, +0xdb, +0x2e, +0xe4, +0x59, +0xeb, +0xd7, +0xaf, +0xe4, +0xcf, +0x2d, +0xee, +0xcf, +0x42, +0x1d, +0x2e, +0xf0, +0xaf, +0xdb, +0x1b, +0x59, +0x50, +0x41, +0xc0, +0x1b, +0xd1, +0xc0, +0x50, +0xc0, +0x1d, +0xac, +0xeb, +0xa9, +0xde, +0x1b, +0x5a, +0x9f, +0x1b, +0x12, +0x1b, +0xcc, +0x1b, +0xcf, +0x1b, +0xca, +0x66, +0x6f, +0x72, +0x1b, +0xcc, +0x1b, +0x4e, +0x1b, +0xca, +0x1d, +0x22, +0xfa, +0xa0, +0xc0, +0x1b, +0x5a, +0x1b, +0xe1, +0xdb, +0x53, +0xcf, +0x7d, +0x1b, +0xe2, +0xcf, +0x7d, +0x53, +0xcf, +0x1b, +0x12, +0x1d, +0xaa, +0x69, +0x22, +0x4b, +0x2b, +0x66, +0xa3, +0x48, +0xaa, +0x69, +0x5a, +0x69, +0x22, +0x4b, +0x1d, +0xed, +0x56, +0x7d, +0xa3, +0xc6, +0xed, +0xd1, +0xed, +0x22, +0x56, +0x1d, +0x69, +0x24, +0xc0, +0xac, +0xe8, +0x22, +0xdb, +0xe8, +0x24, +0x4e, +0xaa, +0x69, +0xa5, +0xd2, +0x69, +0x24, +0xc0, +0x1d, +0xee, +0xc3, +0xac, +0xe4, +0xa3, +0x44, +0xe4, +0x24, +0xc9, +0xaa, +0xee, +0xa5, +0xc9, +0xee, +0x24, +0xc3, +0x1d, +0x2b, +0xeb, +0xa5, +0x44, +0xac, +0xe8, +0x24, +0x53, +0xe8, +0xa6, +0x41, +0x2b, +0xeb, +0xa5, +0x44, +0x1d, +0xf3, +0xc5, +0xac, +0xe4, +0x56, +0xe4, +0x24, +0x5c, +0x2b, +0xf3, +0xa5, +0xc5, +0x1d, +0xaa, +0xed, +0xa6, +0xcc, +0xee, +0xc6, +0x6f, +0xc3, +0x71, +0x41, +0xf3, +0xc0, +0x74, +0xa5, +0x5f, +0xf6, +0x5f, +0xf9, +0x5f, +0x2b, +0xfa, +0xa6, +0xc5, +0x7d, +0xc6, +0xff, +0xff, +0x47, +0xac, +0xe1, +0xc9, +0x63, +0xcc, +0xe4, +0xcf, +0x65, +0x53, +0x66, +0xd8, +0x66, +0x27, +0xca, +0x65, +0x4e, +0x63, +0xd1, +0xe1, +0x53, +0x2b, +0x7e, +0xd4, +0x78, +0xd4, +0xf3, +0x53, +0x4b, +0x78, +0x4b, +0xfa, +0xca, +0x7b, +0x48, +0x7b, +0xa6, +0xd7, +0x53, +0xf9, +0x50, +0x77, +0x4e, +0xf3, +0x4d, +0xee, +0xcc, +0x6f, +0xcf, +0xf0, +0xd4, +0xf0, +0x27, +0xc5, +0x6f, +0xca, +0xee, +0x4d, +0xeb, +0x50, +0x69, +0xd1, +0x65, +0xd1, +0x60, +0xd1, +0xaa, +0xfc, +0x50, +0x78, +0xcf, +0x74, +0x4d, +0xf0, +0xca, +0xee, +0x47, +0xed, +0xc3, +0xed, +0xa6, +0xcc, +0x1d, +0xf5, +0xdd, +0x4e, +0xf6, +0x4b, +0x77, +0xc9, +0xfa, +0xc9, +0x2b, +0xe2, +0xca, +0x66, +0xcc, +0xe7, +0xcf, +0xe8, +0x55, +0xe8, +0x27, +0x42, +0xe7, +0x44, +0x65, +0x47, +0x63, +0x47, +0xaa, +0xfc, +0xc6, +0xf9, +0xc5, +0xf6, +0x41, +0xf5, +0xa6, +0xde, +0x1d, +0x74, +0x28, +0x53, +0xc3, +0xf5, +0x27, +0x5f, +0xf6, +0xdd, +0x77, +0x5c, +0xf9, +0xdb, +0xfc, +0xdb, +0xff, +0xff, +0x5c, +0x2b, +0x63, +0xde, +0xe4, +0x5f, +0x65, +0x28, +0xc0, +0x66, +0xc3, +0x55, +0x65, +0x5a, +0xe2, +0x5c, +0xaa, +0xff, +0xff, +0x5c, +0x77, +0x5a, +0xf5, +0xd7, +0x74, +0x55, +0x53, +0x1d, +0x2b, +0xee, +0xd7, +0xca, +0xc5, +0x6f, +0xc3, +0x72, +0x42, +0x7b, +0xc3, +0x7d, +0xc6, +0x7e, +0x4b, +0xd8, +0xdb, +0x7d, +0xde, +0x7b, +0xa9, +0xc0, +0x78, +0xc0, +0x71, +0x28, +0xde, +0x6f, +0x5c, +0xee, +0xd8, +0x1d, +0xac, +0x66, +0xca, +0x5f, +0x65, +0xa9, +0xc3, +0xe4, +0xc6, +0xe1, +0x48, +0x60, +0xc9, +0x2b, +0x7e, +0xc9, +0xfa, +0xc9, +0x74, +0x48, +0x6f, +0xc6, +0x6a, +0x42, +0x65, +0xc5, +0xe1, +0xc5, +0xaa, +0xfc, +0xc5, +0xf5, +0xc3, +0x71, +0x41, +0x6f, +0x28, +0xde, +0xee, +0xdb, +0xed, +0xd7, +0x41, +0xed, +0x27, +0xdd, +0x6f, +0xd7, +0x72, +0xd4, +0xf5, +0x53, +0xfa, +0x53, +0x2b, +0x60, +0xd4, +0x65, +0x55, +0xe8, +0xd8, +0x6a, +0xdb, +0xed, +0x59, +0x71, +0xd8, +0x77, +0x59, +0x7d, +0xdb, +0xac, +0xe1, +0xde, +0xe4, +0x28, +0x41, +0x66, +0xc9, +0x1d, +0xaa, +0xed, +0xaa, +0xc5, +0xed, +0xa9, +0x59, +0xee, +0xd1, +0xf0, +0x4b, +0x74, +0xc9, +0xf9, +0xc9, +0x2b, +0x7b, +0xcf, +0xac, +0xe1, +0x53, +0x63, +0x56, +0xe4, +0x59, +0x65, +0xdd, +0x66, +0xaa, +0x44, +0xcf, +0x65, +0x55, +0xe4, +0xd8, +0xe2, +0x5a, +0x60, +0x5c, +0x2b, +0xfc, +0xdd, +0x78, +0xdd, +0x71, +0x5c, +0xaa, +0x74, +0x56, +0x72, +0xd4, +0xf0, +0xd2, +0xee, +0x4e, +0xed, +0xc9, +0xc5, +0x1d, +0xf5, +0xc3, +0xf5, +0xa9, +0xd7, +0xf6, +0x53, +0xf9, +0x50, +0xfc, +0x50, +0x2b, +0x77, +0x55, +0x7b, +0xd8, +0x7d, +0x5c, +0x7d, +0xaa, +0xcf, +0xfc, +0xd4, +0x77, +0x55, +0xaa, +0xfa, +0xcf, +0x77, +0x4d, +0xf6, +0x4b, +0xf5, +0x48, +0xc3, +0x1d, +0xf5, +0x2b, +0x59, +0x4b, +0xf6, +0x47, +0x78, +0xc5, +0xfa, +0x44, +0x2b, +0x66, +0xc6, +0xf9, +0x4b, +0x7b, +0x4d, +0xfc, +0x4e, +0x7d, +0xd1, +0x7d, +0xac, +0x44, +0xfa, +0xc9, +0xf3, +0xc9, +0xaa, +0xf9, +0x42, +0x77, +0xc0, +0xf6, +0x2b, +0x5f, +0xf5, +0x5c, +0x59, +0x1d, +0xed, +0xdd, +0x48, +0x6f, +0x41, +0x72, +0xaa, +0xdd, +0xf9, +0x5c, +0x2b, +0xf3, +0x2b, +0x41, +0xfa, +0xc3, +0xff, +0xff, +0xc6, +0xac, +0x63, +0xca, +0xe4, +0x4e, +0x65, +0xd4, +0x66, +0x56, +0x66, +0xac, +0x42, +0x65, +0xc9, +0xe4, +0x4b, +0xe1, +0xcf, +0x2b, +0x7d, +0xd1, +0x78, +0xd1, +0x74, +0xd1, +0x6c, +0xcf, +0xaa, +0x71, +0x48, +0x6f, +0x44, +0xee, +0xc0, +0xed, +0x2b, +0xdd, +0x1d, +0xed, +0x2d, +0xcc, +0xc0, +0xed, +0xac, +0x5a, +0x6f, +0x55, +0x71, +0xd2, +0xf5, +0x50, +0x78, +0x50, +0x7e, +0xd1, +0x2b, +0xfa, +0xd7, +0xac, +0x60, +0x5a, +0xe2, +0xdd, +0x63, +0x5f, +0x65, +0x2d, +0xc3, +0x66, +0xc9, +0x56, +0xe4, +0xde, +0x63, +0x2e, +0x41, +0x60, +0xc3, +0x2b, +0xff, +0xff, +0x44, +0xfc, +0xc5, +0xf9, +0xc5, +0x74, +0x44, +0xeb, +0xc3, +0xaa, +0xf3, +0x2d, +0x5c, +0x72, +0xdb, +0xf0, +0x59, +0xee, +0x55, +0xed, +0xd1, +0xcc, +0x1d, +0xf5, +0x4e, +0xc0, +0xf6, +0xac, +0xdb, +0x77, +0x59, +0x78, +0xd8, +0xfc, +0xd8, +0x2b, +0xf3, +0x5c, +0x78, +0xde, +0xfc, +0x2d, +0x41, +0x7d, +0x44, +0x1b, +0x59, +0x50, +0x41, +0xc0, +0xd8, +0xfc, +0xdb, +0xfa, +0x5c, +0x78, +0xdd, +0x72, +0x5c, +0xaa, +0x7b, +0xd7, +0x77, +0xd4, +0xf5, +0xd1, +0x4e, +0x1b, +0xe1, +0xdb, +0x53, +0xcf, +0x7d, +0x1b, +0xe2, +0xdb, +0x53, +0xcf, +0x7d, +0x1d, +0x2e, +0x74, +0xa0, +0xd4, +0x1b, +0x63, +0xc0, +0xc0, +0x1d, +0xf6, +0x22, +0x44, +0x1b, +0x63, +0xc0, +0xc0, +0x1d, +0x66, +0xa3, +0xd4, +0x1b, +0x63, +0xc0, +0xc0, +0x1d, +0x66, +0xa5, +0xd1, +0x1b, +0x63, +0xc0, +0xc0, +0x1d, +0x2d, +0xf6, +0x27, +0xcc, +0x1b, +0x63, +0xc0, +0xc0, +0x1d, +0x2e, +0x60, +0xa9, +0xc9, +0x1b, +0x63, +0xc0, +0xc0, +0x1d, +0xf5, +0xaa, +0xcf, +0x1b, +0x63, +0xc0, +0xc0, +0x1d, +0x72, +0x2b, +0x56, +0x1b, +0x63, +0xc0, +0xc0, +0x1d, +0x2d, +0x77, +0x2e, +0xc6, +0x1b, +0x63, +0xc0, +0xc0, +0x1d, +0xaa, +0x6c, +0x22, +0xd2, +0x1b, +0x63, +0xc0, +0xc0, +0x1d, +0x2b, +0xee, +0xa3, +0x4d, +0x1b, +0x63, +0xc0, +0xc0, +0x1d, +0xac, +0xe4, +0xa5, +0x59, +0x1b, +0x63, +0xc0, +0xc0, +0x1d, +0x60, +0x27, +0xcc, +0x1b, +0x63, +0xc0, +0xc0, +0x1d, +0x2b, +0x7d, +0xa9, +0x44, +0x1b, +0x63, +0xc0, +0xc0, +0x1d, +0xac, +0x60, +0xaa, +0xca, +0x1b, +0x63, +0xc0, +0xc0, +0x1d, +0xe2, +0x2b, +0xdd, +0x1b, +0x63, +0xc0, +0xc0, +0x1d, +0x60, +0x2d, +0xcf, +0x1b, +0x63, +0xc0, +0xc0, +0x1b, +0x63, +0xc0, +0xc0, +0x1b, +0xe1, +0xdb, +0x53, +0xcf, +0x7d, +0x1b, +0xe2, +0xcf, +0x7d, +0x53, +0xcf, +0x1b, +0xd1, +0xc0, +0x50, +0xc0, +0x1d, +0xa9, +0x60, +0xa0, +0xc0, +0x1b, +0x5a, +0x9f, +0x1b, +0x12, +0xc3, +0x6f, +0xf0, +0xf9, +0x72, +0x69, +0xe7, +0xe8, +0x74, +0xa0, +0x28, +0x1b, +0xc3, +0xc0, +0x1b, +0x42, +0xa9, +0xa0, +0xb2, +0x30, +0xb1, +0xb8, +0xa0, +0xc9, +0xd2, +0x41, +0xd4, +0x41, +0x2e, +0xcf, +0x4e, +0xcc, +0xc9, +0x4e, +0xc5, +0x2e, +0xa0, +0xd4, +0xe8, +0x69, +0xf3, +0xa0, +0x74, +0x65, +0x72, +0xed, +0x69, +0xee, +0xe1, +0x6c, +0xa0, +0x69, +0xf3, +0xa0, +0x72, +0x65, +0x6c, +0x65, +0xe1, +0xf3, +0x65, +0xe4, +0xa0, +0xf5, +0xee, +0xe4, +0x65, +0x72, +0x8d, +0x74, +0xe8, +0x65, +0xa0, +0x47, +0x4e, +0x55, +0xa0, +0x50, +0xf5, +0xe2, +0x6c, +0x69, +0x63, +0xa0, +0xcc, +0x69, +0x63, +0x65, +0xee, +0xf3, +0x65, +0x2e, +0xa0, +0xd2, +0xf5, +0xee, +0xa0, +0x74, +0xe8, +0x65, +0xa0, +0xf0, +0x72, +0x6f, +0xe7, +0x72, +0xe1, +0xed, +0xa0, +0x47, +0x50, +0xcc, +0xac, +0xa0, +0x66, +0x6f, +0x72, +0xa0, +0xe4, +0x65, +0x74, +0xe1, +0x69, +0x6c, +0xf3, +0x2e, +0x1d, +0x1b, +0x12, +0x28, +0xf0, +0x2e, +0x48, +0x1d, +0xa9, +0x74, +0xa0, +0xc0, +0x74, +0xaf, +0x5f, +0x1d, +0x28, +0x6c, +0xa0, +0xc0, +0x6c, +0xaf, +0x5f, +0x1b, +0x59, +0x50, +0x41, +0xc0, +0x1b, +0x03, +}; + diff --git a/terminal.c b/terminal.c new file mode 100755 index 0000000..7ae9ed2 --- /dev/null +++ b/terminal.c @@ -0,0 +1,246 @@ +/** + * PLATOTerm64 - A PLATO Terminal for the Commodore 64 + * Based on Steve Peltz's PAD + * + * Author: Thomas Cherryhomes + * + * terminal.c - Terminal state functions + */ + +/* Some functions are intentionally stubbed. */ +#pragma warn(unused-param, off) + +#include +#include "terminal.h" +#include "screen.h" +#include "protocol.h" + +/** + * ASCII Features to return in Features + */ +#define ASC_ZFGT 0x01 +#define ASC_ZPCKEYS 0x02 +#define ASC_ZKERMIT 0x04 +#define ASC_ZWINDOW 0x08 + +#define true 1 +#define false 0 + +/** + * protocol.c externals + */ +extern CharMem CurMem; +extern padBool TTY; +extern padBool ModeBold; +extern padBool Rotate; +extern padBool Reverse; +extern DispMode CurMode; +extern padBool FlowControl; + +/** + * screen.c externals + */ +extern unsigned char CharWide; +extern unsigned char CharHigh; +extern padPt TTYLoc; + +extern unsigned char already_started; + +#define FONTPTR(a) (a<<4) + +extern unsigned char fontm23[2048]; + +static unsigned char BTAB[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01}; +static unsigned char u; +static unsigned char curr_word; + +/** + * terminal_init() + * Initialize terminal state + */ +void terminal_init(void) +{ + terminal_set_tty(); +} + +/** + * terminal_initial_position() + * Set terminal initial position after splash screen. + */ +void terminal_initial_position(void) +{ + TTYLoc.x=0; + TTYLoc.y=239; } + +/** + * terminal_set_tty(void) - Switch to TTY mode + */ +void terminal_set_tty(void) +{ + if (already_started) + screen_clear(); + TTY=true; + ModeBold=padF; + Rotate=padF; + Reverse=padF; + CurMem=M0; + CurMode=ModeRewrite; + /* CurMode=ModeWrite; /\* For speed reasons. *\/ */ + CharWide=8; + CharHigh=16; + TTYLoc.x = 0; + TTYLoc.y = 495; + screen_show_status("TTY Mode"); +} + +/** + * terminal_set_plato(void) - Switch to PLATO mode + */ +void terminal_set_plato(void) +{ + TTY=false; + screen_clear(); + screen_show_status("PLATO Mode"); +} + +/** + * terminal_get_features(void) - Inquire about terminal ASCII features + */ +unsigned char terminal_get_features(void) +{ + return ASC_ZFGT; /* This terminal can do Fine Grained Touch (FGT) */ +} + +/** + * terminal_get_type(void) - Return the appropriate terminal type + */ +unsigned char terminal_get_type(void) +{ + return 12; /* ASCII terminal type */ +} + +/** + * terminal_get_subtype(void) - Return the appropriate terminal subtype + */ +unsigned char terminal_get_subtype(void) +{ + return 1; /* ASCII terminal subtype IST-III */ +} + +/** + * terminal_get_load_file(void) - Return the appropriate terminal loadfile (should just be 0) + */ +unsigned char terminal_get_load_file(void) +{ + return 0; /* This terminal does not load its resident from the PLATO system. */ +} + +/** + * terminal_get_configuration(void) - Return the terminal configuration + */ +unsigned char terminal_get_configuration(void) +{ + return 0x40; /* Touch panel is present. */ +} + +/** + * terminal_get_char_address(void) - Return the base address of the character set. + */ +unsigned short terminal_get_char_address(void) +{ + return 0x3000; /* What the? Shouldn't this be 0x3800? */ +} + +/** + * terminal_mem_read - Read a byte of program memory. + * not needed for our terminal, but must + * be decoded. + */ +padByte terminal_mem_read(padWord addr) +{ + return (0xFF); +} + +/** + * terminal_mem_load - Write a byte to non-character memory. + * not needed for our terminal, but must be decoded. + */ +void terminal_mem_load(padWord addr, padWord value) +{ + /* Not Implemented */ +} + +/** + * Mode5, 6, and 7 are basically stubbed. + */ +void terminal_mode_5(padWord value) +{ +} + +void terminal_mode_6(padWord value) +{ +} + +void terminal_mode_7(padWord value) +{ +} + +/** + * terminal_ext_allow - External Input allowed. Not implemented. + */ +void terminal_ext_allow(padBool allow) +{ + /* Not Implemented */ +} + +/** + * terminal_set_ext_in - Set which device to get input from. + * Not implemented + */ +void terminal_set_ext_in(padWord device) +{ +} + +/** + * terminal_set_ext_out - Set which device to send external data to. + * Not implemented + */ +void terminal_set_ext_out(padWord device) +{ +} + +/** + * terminal_ext_in - get an external input from selected device. + * Not implemented. + */ +padByte terminal_ext_in(void) +{ + return 0; +} + +/** + * terminal_ext_out - Send an external output to selected device + * Not implemented. + */ +void terminal_ext_out(padByte value) +{ +} + +/** + * terminal_char_load - Store a character into the user definable + * character set. + */ +void terminal_char_load(padWord charnum, charData theChar) +{ + memset(&fontm23[FONTPTR(charnum)],0,16); + for (curr_word=0;curr_word<8;curr_word++) + { + for (u=16; u-->0; ) + { + if (theChar[curr_word] & 1< + * + * terminal.c - Terminal state functions + */ + +#ifndef TERMINAL_H +#define TERMINAL_H + +#include "protocol.h" + +/** + * terminal_init() + * Initialize terminal state + */ +void terminal_init(void); + +/** + * terminal_initial_position() + * Set terminal initial position after splash screen. + */ +void terminal_initial_position(void); + +/** + * terminal_set_tty(void) - Switch to TTY mode + */ +void terminal_set_tty(void); + +/** + * terminal_set_plato(void) - Switch to PLATO mode + */ +void terminal_set_plato(void); + +/** + * terminal_get_features(void) - Inquire about terminal ASCII features + */ +unsigned char terminal_get_features(void); + +/** + * terminal_get_type(void) - Return the appropriate terminal type + */ +unsigned char terminal_get_type(void); + +/** + * terminal_get_subtype(void) - Return the appropriate terminal subtype + */ +unsigned char terminal_get_subtype(void); + +/** + * terminal_get_load_file(void) - Return the appropriate terminal loadfile (should just be 0) + */ +unsigned char terminal_get_load_file(void); + +/** + * terminal_get_configuration(void) - Return the terminal configuration + */ +unsigned char terminal_get_configuration(void); + +/** + * terminal_get_char_address(void) - Return the base address of the character set. + */ +unsigned short terminal_get_char_address(void); + +/** + * terminal_mem_read - Read a byte of program memory. + * not needed for our terminal, but must + * be decoded. + */ +padByte terminal_mem_read(padWord addr); + +/** + * terminal_mem_load - Write a byte to non-character memory. + * not needed for our terminal, but must be decoded. + */ +void terminal_mem_load(padWord addr, padWord value); + +/** + * terminal_char_load - Store a character into the user definable + * character set. + */ +void terminal_char_load(padWord charnum, charData theChar); + +/** + * terminal_mode_5, 6, and 7 are basically stubbed. + */ +void terminal_mode_5(padWord value); +void terminal_mode_6(padWord value); +void terminal_mode_7(padWord value); + +/** + * terminal_ext_allow - External Input allowed. Not implemented. + */ +void terminal_ext_allow(padBool allow); + +/** + * terminal_set_ext_in - Set which device to get input from. + * Not implemented + */ +void terminal_set_ext_in(padWord device); + +/** + * terminal_set_ext_out - Set which device to send external data to. + * Not implemented + */ +void terminal_set_ext_out(padWord device); + +/** + * terminal_ext_in - get an external input from selected device. + * Not implemented. + */ +padByte terminal_ext_in(void); + +/** + * terminal_ext_out - Send an external output to selected device + * Not implemented. + */ +void terminal_ext_out(padByte value); + +#endif diff --git a/touch.c b/touch.c new file mode 100644 index 0000000..5944670 --- /dev/null +++ b/touch.c @@ -0,0 +1,39 @@ +#include "touch.h" +#include "screen.h" + +#define X(x) (x) +#define Y(y) (y^0x1FF) + +padBool lmb=padF; +padBool lastlmb=padF; /* left mouse button state */ +padBool isAllowed; + +/** + * touch_init(void) + * Initiialize mouse + */ +void touch_init(void) +{ +} + +/** + * enable/disable mouse cursor + */ +void touch_allow(padBool allow) +{ +} + +padBool touch_lmb(void) +{ +} + +void touch_main(void) +{ +} + +/** + * touch done + */ +void touch_done(void) +{ +} diff --git a/touch.h b/touch.h new file mode 100644 index 0000000..649fc12 --- /dev/null +++ b/touch.h @@ -0,0 +1,33 @@ +#ifndef TOUCH_H +#define TOUCH_H + +#include "protocol.h" + +/** + * touch_init(void) + * Initiialize mouse + */ +void touch_init(void); + +/** + * enable/disable mouse cursor + */ +void touch_allow(padBool allow); + +/** + * Is left mouse button pressed? + */ +padBool touch_lmb(void); + +/** + * Get mouse position, and if LMB pressed, send touch event. + */ +void touch_main(void); + +/** + * touch done + */ +void touch_done(void); + + +#endif /* TOUCH_H */ diff --git a/trace.c b/trace.c new file mode 100644 index 0000000..a524ffb --- /dev/null +++ b/trace.c @@ -0,0 +1,52 @@ +/** + * PLATOTerm64 - A PLATO Terminal for the Commodore 64 + * Based on Steve Peltz's PAD + * + * Author: Thomas Cherryhomes + * + * trace.c - Trace output functions. + */ + +#include +#include "protocol.h" + +#define true 1 +#define false 0 + +#define TRACE_FILE "trace.txt" + +unsigned char trace_active=false; + +static int trace_handle; + +/** + * trace_open(void) + * Open trace file trace.txt + */ +void trace_open(void) +{ +} + +/** + * trace_append(buf, len) + * Append data from ShowPLATO into buffer + */ +void trace_append(padByte* buf, int len) +{ +} + +/** + * trace_close(void) + * Close trace file. + */ +void trace_close(void) +{ +} + +/** + * trace_toggle(void) + * Toggle trace on/off + */ +void trace_toggle(void) +{ +} diff --git a/trace.h b/trace.h new file mode 100644 index 0000000..cf5a93c --- /dev/null +++ b/trace.h @@ -0,0 +1,31 @@ +#ifndef TRACE_H +#define TRACE_H + +/** + * PLATOTerm64 - A PLATO Terminal for the Commodore 64 + * Based on Steve Peltz's PAD + * + * Author: Thomas Cherryhomes + * + * trace.h - Trace output functions. + */ + +/** + * trace_open(void) + * Open trace file trace.txt + */ +void trace_open(void); + +/** + * trace_append(buf, len) + * Append data from ShowPLATO into buffer + */ +void trace_append(padByte* buf, int len); + +/** + * trace_close(void) + * Close trace file. + */ +void trace_close(void); + +#endif /* TRACE_H */