├── .gitignore ├── rawfont.h ├── sdl ├── bildschirmtext.png ├── README.md ├── btx-sdl.desktop ├── Makefile └── btx_sdl.c ├── web ├── make.sh ├── layer2.c └── main.c ├── iOS ├── btx_decoder │ ├── Assets.xcassets │ │ ├── Contents.json │ │ └── AppIcon.appiconset │ │ │ └── Contents.json │ ├── ViewController.h │ ├── AppDelegate.h │ ├── main.m │ ├── Info.plist │ ├── Base.lproj │ │ ├── Main.storyboard │ │ └── LaunchScreen.storyboard │ ├── AppDelegate.m │ └── ViewController.m └── btx_decoder.xcodeproj │ ├── project.xcworkspace │ ├── contents.xcworkspacedata │ └── xcshareddata │ │ └── IDEWorkspaceChecks.plist │ └── project.pbxproj ├── macOS ├── btx_decoder │ ├── Assets.xcassets │ │ ├── Contents.json │ │ └── AppIcon.appiconset │ │ │ └── Contents.json │ ├── main.m │ ├── AppDelegate.h │ ├── btx_decoder.entitlements │ ├── Info.plist │ ├── AppDelegate.m │ └── Base.lproj │ │ └── MainMenu.xib └── btx_decoder.xcodeproj │ ├── project.xcworkspace │ ├── contents.xcworkspacedata │ └── xcshareddata │ │ └── IDEWorkspaceChecks.plist │ └── project.pbxproj ├── layer2.h ├── layer6.h ├── xfont.h ├── font.h ├── layer2.c ├── README.md ├── .travis.yml ├── attrib.h ├── control.h ├── xfont.c └── rawfont.c /.gitignore: -------------------------------------------------------------------------------- 1 | xcuserdata 2 | -------------------------------------------------------------------------------- /rawfont.h: -------------------------------------------------------------------------------- 1 | extern char raw_font[]; 2 | -------------------------------------------------------------------------------- /sdl/bildschirmtext.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/probonopd/btx_decoder/master/sdl/bildschirmtext.png -------------------------------------------------------------------------------- /web/make.sh: -------------------------------------------------------------------------------- 1 | emcc -O3 ../layer6.c ../rawfont.c ../xfont.c main.c layer2.c -o btx_decoder.html --preload-file cept.bin 2 | -------------------------------------------------------------------------------- /iOS/btx_decoder/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /macOS/btx_decoder/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /sdl/README.md: -------------------------------------------------------------------------------- 1 | To compile type 2 | make 3 | 4 | Command-Line Parameters: 5 | ======================== 6 | 7 | ./btx-sdl \:\ 8 | -------------------------------------------------------------------------------- /sdl/btx-sdl.desktop: -------------------------------------------------------------------------------- 1 | [Desktop Entry] 2 | Name=BTX Decoder 3 | Comment=Bildschirmtext (BTX) decoder 4 | Exec=btx-sdl 5 | Icon=bildschirmtext 6 | Type=Application 7 | Categories=Network; 8 | -------------------------------------------------------------------------------- /iOS/btx_decoder/ViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // ViewController.h 3 | // btx_decoder 4 | // 5 | 6 | #import 7 | 8 | @interface ViewController : UIViewController 9 | 10 | 11 | @end 12 | 13 | -------------------------------------------------------------------------------- /macOS/btx_decoder/main.m: -------------------------------------------------------------------------------- 1 | // 2 | // main.m 3 | // btx_decoder 4 | // 5 | 6 | #import 7 | 8 | int main(int argc, const char * argv[]) { 9 | return NSApplicationMain(argc, argv); 10 | } 11 | -------------------------------------------------------------------------------- /macOS/btx_decoder/AppDelegate.h: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.h 3 | // btx_decoder 4 | // 5 | 6 | #import 7 | 8 | @interface AppDelegate : NSObject 9 | 10 | 11 | @end 12 | 13 | -------------------------------------------------------------------------------- /layer2.h: -------------------------------------------------------------------------------- 1 | extern void layer2_connect(void); 2 | extern void layer2_connect2(const char *, const int); 3 | extern int layer2_getc(void); 4 | extern void layer2_ungetc(void); 5 | extern void layer2_write(const unsigned char *s, unsigned int len); 6 | -------------------------------------------------------------------------------- /iOS/btx_decoder.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /macOS/btx_decoder.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /iOS/btx_decoder/AppDelegate.h: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.h 3 | // btx_decoder 4 | // 5 | 6 | #import 7 | 8 | @interface AppDelegate : UIResponder 9 | 10 | @property (strong, nonatomic) UIWindow *window; 11 | 12 | 13 | @end 14 | 15 | -------------------------------------------------------------------------------- /iOS/btx_decoder/main.m: -------------------------------------------------------------------------------- 1 | // 2 | // main.m 3 | // btx_decoder 4 | // 5 | 6 | #import 7 | #import "AppDelegate.h" 8 | 9 | int main(int argc, char * argv[]) { 10 | @autoreleasepool { 11 | return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /layer6.h: -------------------------------------------------------------------------------- 1 | extern int tia; /* 1: white-on-black mode, no attributes */ 2 | extern int reveal; /* 1: show hidden content */ 3 | extern int dirty; /* screen change that requires a redraw */ 4 | 5 | extern void init_layer6(void); 6 | extern int process_BTX_data(void); 7 | extern void redraw_screen_rect(int x1, int y1, int x2, int y2); 8 | -------------------------------------------------------------------------------- /iOS/btx_decoder.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /macOS/btx_decoder.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /macOS/btx_decoder/btx_decoder.entitlements: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | com.apple.security.app-sandbox 6 | 7 | com.apple.security.files.user-selected.read-only 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /xfont.h: -------------------------------------------------------------------------------- 1 | extern unsigned char *memimage; 2 | 3 | extern void init_xfont(void); 4 | extern void default_colors(void); 5 | extern void xputc(int c, int set, int x, int y, int xdouble, int ydouble, int underline, int diacrit, int fg, int bg, int fontheight, int rows); 6 | extern void xcursor(int x, int y, int fontheight); 7 | extern void define_fullrow_bg(int row, int index); 8 | extern void free_DRCS(void); 9 | extern void define_raw_DRC(int c, char *data, int bits); 10 | extern void define_color(unsigned int index, unsigned int r, unsigned int g, unsigned int b); 11 | extern void define_DCLUT(int entry, int index); 12 | -------------------------------------------------------------------------------- /sdl/Makefile: -------------------------------------------------------------------------------- 1 | #OBJS specifies which files to compile as part of the project 2 | OBJS = *.c ../*.c 3 | 4 | #CC specifies which compiler we're using 5 | CC = gcc 6 | 7 | #COMPILER_FLAGS specifies the additional compilation options we're using 8 | # -w suppresses all warnings 9 | COMPILER_FLAGS = -w -std=c99 10 | 11 | #LINKER_FLAGS specifies the libraries we're linking against 12 | LINKER_FLAGS = -lSDL2 -lpthread 13 | 14 | #OBJ_NAME specifies the name of our exectuable 15 | OBJ_NAME = btx-sdl 16 | 17 | #This is the target that compiles our executable 18 | all : $(OBJS) 19 | $(CC) $(OBJS) $(COMPILER_FLAGS) $(LINKER_FLAGS) -o $(OBJ_NAME) 20 | -------------------------------------------------------------------------------- /web/layer2.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | 6 | FILE *f; 7 | unsigned char last_char; 8 | int is_last_char_buffered = 0; 9 | 10 | void connect_to_service() 11 | { 12 | f = fopen("cept.bin", "r"); 13 | printf("opened: %p\n", f); 14 | } 15 | 16 | int layer2getc() 17 | { 18 | if (is_last_char_buffered) { 19 | is_last_char_buffered = 0; 20 | } else { 21 | last_char = fgetc(f); 22 | } 23 | return last_char; 24 | } 25 | 26 | void layer2ungetc() 27 | { 28 | is_last_char_buffered = 1; 29 | } 30 | 31 | void layer2write(unsigned char *s, unsigned int len) 32 | { 33 | } 34 | -------------------------------------------------------------------------------- /macOS/btx_decoder/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIconFile 10 | 11 | CFBundleIdentifier 12 | $(PRODUCT_BUNDLE_IDENTIFIER) 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | $(PRODUCT_NAME) 17 | CFBundlePackageType 18 | APPL 19 | CFBundleShortVersionString 20 | 1.0 21 | CFBundleVersion 22 | 1 23 | LSMinimumSystemVersion 24 | $(MACOSX_DEPLOYMENT_TARGET) 25 | NSHumanReadableCopyright 26 | Copyright © 2019 Michael Steil. All rights reserved. 27 | NSMainNibFile 28 | MainMenu 29 | NSPrincipalClass 30 | NSApplication 31 | 32 | 33 | -------------------------------------------------------------------------------- /macOS/btx_decoder/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "mac", 5 | "size" : "16x16", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "mac", 10 | "size" : "16x16", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "mac", 15 | "size" : "32x32", 16 | "scale" : "1x" 17 | }, 18 | { 19 | "idiom" : "mac", 20 | "size" : "32x32", 21 | "scale" : "2x" 22 | }, 23 | { 24 | "idiom" : "mac", 25 | "size" : "128x128", 26 | "scale" : "1x" 27 | }, 28 | { 29 | "idiom" : "mac", 30 | "size" : "128x128", 31 | "scale" : "2x" 32 | }, 33 | { 34 | "idiom" : "mac", 35 | "size" : "256x256", 36 | "scale" : "1x" 37 | }, 38 | { 39 | "idiom" : "mac", 40 | "size" : "256x256", 41 | "scale" : "2x" 42 | }, 43 | { 44 | "idiom" : "mac", 45 | "size" : "512x512", 46 | "scale" : "1x" 47 | }, 48 | { 49 | "idiom" : "mac", 50 | "size" : "512x512", 51 | "scale" : "2x" 52 | } 53 | ], 54 | "info" : { 55 | "version" : 1, 56 | "author" : "xcode" 57 | } 58 | } -------------------------------------------------------------------------------- /iOS/btx_decoder/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | APPL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleVersion 20 | 1 21 | LSRequiresIPhoneOS 22 | 23 | UILaunchStoryboardName 24 | LaunchScreen 25 | UIMainStoryboardFile 26 | Main 27 | UIRequiredDeviceCapabilities 28 | 29 | armv7 30 | 31 | UISupportedInterfaceOrientations 32 | 33 | UIInterfaceOrientationPortrait 34 | UIInterfaceOrientationLandscapeLeft 35 | UIInterfaceOrientationLandscapeRight 36 | 37 | UISupportedInterfaceOrientations~ipad 38 | 39 | UIInterfaceOrientationPortrait 40 | UIInterfaceOrientationPortraitUpsideDown 41 | UIInterfaceOrientationLandscapeLeft 42 | UIInterfaceOrientationLandscapeRight 43 | 44 | 45 | 46 | -------------------------------------------------------------------------------- /iOS/btx_decoder/Base.lproj/Main.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /web/main.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include "../layer2.h" 3 | #include "../layer6.h" 4 | #include "../xfont.h" 5 | 6 | #include 7 | 8 | #ifdef __EMSCRIPTEN__ 9 | #include 10 | #endif 11 | 12 | int main(int argc, char **argv) 13 | { 14 | // initialize decoder 15 | init_xfont(); 16 | init_layer6(); 17 | printf("init ok!\n"); 18 | connect_to_service(); 19 | 20 | printf("hello, world!\n"); 21 | 22 | int count = 0; 23 | for (;;) { 24 | if (process_BTX_data()) 25 | break; 26 | count++; 27 | // printf("%d\n", count); 28 | // if (count==1000) 29 | // break; 30 | } 31 | printf("done\n"); 32 | // return 0; 33 | 34 | SDL_Init(SDL_INIT_VIDEO); 35 | SDL_Surface *screen = SDL_SetVideoMode(480, 240, 32, SDL_SWSURFACE); 36 | 37 | #ifdef TEST_SDL_LOCK_OPTS 38 | EM_ASM("SDL.defaults.copyOnLock = false; SDL.defaults.discardOnLock = true; SDL.defaults.opaqueFrontBuffer = false;"); 39 | #endif 40 | 41 | if (SDL_MUSTLOCK(screen)) SDL_LockSurface(screen); 42 | for (int y = 0; y < 240; y++) { 43 | for (int x = 0; x < 480; x++) { 44 | int alpha = 255; 45 | *((Uint32*)screen->pixels + y * 480 + x) = 46 | SDL_MapRGBA(screen->format, 47 | memimage[(y * 480 + x) * 3], 48 | memimage[(y * 480 + x) * 3 + 1], 49 | memimage[(y * 480 + x) * 3 + 2], 50 | alpha); 51 | } 52 | } 53 | if (SDL_MUSTLOCK(screen)) SDL_UnlockSurface(screen); 54 | SDL_Flip(screen); 55 | 56 | 57 | SDL_Quit(); 58 | 59 | return 0; 60 | } 61 | 62 | -------------------------------------------------------------------------------- /iOS/btx_decoder/Base.lproj/LaunchScreen.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /iOS/btx_decoder/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "iphone", 5 | "size" : "20x20", 6 | "scale" : "2x" 7 | }, 8 | { 9 | "idiom" : "iphone", 10 | "size" : "20x20", 11 | "scale" : "3x" 12 | }, 13 | { 14 | "idiom" : "iphone", 15 | "size" : "29x29", 16 | "scale" : "2x" 17 | }, 18 | { 19 | "idiom" : "iphone", 20 | "size" : "29x29", 21 | "scale" : "3x" 22 | }, 23 | { 24 | "idiom" : "iphone", 25 | "size" : "40x40", 26 | "scale" : "2x" 27 | }, 28 | { 29 | "idiom" : "iphone", 30 | "size" : "40x40", 31 | "scale" : "3x" 32 | }, 33 | { 34 | "idiom" : "iphone", 35 | "size" : "60x60", 36 | "scale" : "2x" 37 | }, 38 | { 39 | "idiom" : "iphone", 40 | "size" : "60x60", 41 | "scale" : "3x" 42 | }, 43 | { 44 | "idiom" : "ipad", 45 | "size" : "20x20", 46 | "scale" : "1x" 47 | }, 48 | { 49 | "idiom" : "ipad", 50 | "size" : "20x20", 51 | "scale" : "2x" 52 | }, 53 | { 54 | "idiom" : "ipad", 55 | "size" : "29x29", 56 | "scale" : "1x" 57 | }, 58 | { 59 | "idiom" : "ipad", 60 | "size" : "29x29", 61 | "scale" : "2x" 62 | }, 63 | { 64 | "idiom" : "ipad", 65 | "size" : "40x40", 66 | "scale" : "1x" 67 | }, 68 | { 69 | "idiom" : "ipad", 70 | "size" : "40x40", 71 | "scale" : "2x" 72 | }, 73 | { 74 | "idiom" : "ipad", 75 | "size" : "76x76", 76 | "scale" : "1x" 77 | }, 78 | { 79 | "idiom" : "ipad", 80 | "size" : "76x76", 81 | "scale" : "2x" 82 | }, 83 | { 84 | "idiom" : "ipad", 85 | "size" : "83.5x83.5", 86 | "scale" : "2x" 87 | }, 88 | { 89 | "idiom" : "ios-marketing", 90 | "size" : "1024x1024", 91 | "scale" : "1x" 92 | } 93 | ], 94 | "info" : { 95 | "version" : 1, 96 | "author" : "xcode" 97 | } 98 | } -------------------------------------------------------------------------------- /iOS/btx_decoder/AppDelegate.m: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.m 3 | // btx_decoder 4 | // 5 | 6 | #import "AppDelegate.h" 7 | 8 | @interface AppDelegate () 9 | 10 | @end 11 | 12 | @implementation AppDelegate 13 | 14 | 15 | - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 16 | // Override point for customization after application launch. 17 | return YES; 18 | } 19 | 20 | 21 | - (void)applicationWillResignActive:(UIApplication *)application { 22 | // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. 23 | // Use this method to pause ongoing tasks, disable timers, and invalidate graphics rendering callbacks. Games should use this method to pause the game. 24 | } 25 | 26 | 27 | - (void)applicationDidEnterBackground:(UIApplication *)application { 28 | // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. 29 | // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. 30 | } 31 | 32 | 33 | - (void)applicationWillEnterForeground:(UIApplication *)application { 34 | // Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background. 35 | } 36 | 37 | 38 | - (void)applicationDidBecomeActive:(UIApplication *)application { 39 | // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. 40 | } 41 | 42 | 43 | - (void)applicationWillTerminate:(UIApplication *)application { 44 | // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. 45 | } 46 | 47 | 48 | @end 49 | -------------------------------------------------------------------------------- /font.h: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 1992, 1993 Arno Augustin, Frank Hoering, University of 3 | * Erlangen-Nuremberg, Germany. 4 | * All rights reserved. 5 | * 6 | * Redistribution and use in source and binary forms, with or without 7 | * modification, are permitted provided that the following conditions 8 | * are met: 9 | * 1. Redistributions of source code must retain the above copyright 10 | * notice, this list of conditions and the following disclaimer. 11 | * 2. Redistributions in binary form must reproduce the above copyright 12 | * notice, this list of conditions and the following disclaimer in the 13 | * documentation and/or other materials provided with the distribution. 14 | * 3. All advertising materials mentioning features or use of this software 15 | * must display the following acknowledgement: 16 | * This product includes software developed by the University of 17 | * Erlangen-Nuremberg, Germany. 18 | * 4. Neither the name of the University nor the names of its contributors 19 | * may be used to endorse or promote products derived from this software 20 | * without specific prior written permission. 21 | * 22 | * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR 23 | * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 24 | * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO 25 | * EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 26 | * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 27 | * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 28 | * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 29 | * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 30 | * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 31 | * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 32 | */ 33 | 34 | #define FONT_WIDTH 12 35 | #define FONT_HEIGHT 12 36 | 37 | #define PRIM 0 38 | #define SUP2 1 39 | #define SUPP 2 40 | #define SUP3 3 41 | #define SUP1 4 42 | #define DRCS 5 43 | 44 | #define G0 0 45 | #define G1 1 46 | #define G2 2 47 | #define G3 3 48 | #define L 4 49 | -------------------------------------------------------------------------------- /layer2.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | 6 | #define h_addr h_addr_list[0] /* for backward compatibility */ 7 | 8 | /* 9 | * The original Bildschirmtext service over modem supported 10 | * error correction in the form of checksummed sequences and 11 | * a ACK or NACK and resend feature. 12 | * This layer 2 interface connects using TCP/IP, so the server 13 | * does not send any error correction information, and this 14 | * code does not support receiving any. 15 | */ 16 | 17 | int sockfd; 18 | unsigned char last_char; 19 | int is_last_char_buffered = 0; 20 | 21 | #define HOST "localhost" 22 | //#define HOST "belgradstr.dyndns.org" 23 | #define PORT 20000 /* XXX the original port for CEPT is 20005 */ 24 | 25 | void layer2_connect() 26 | { 27 | layer2_connect2(HOST,PORT); 28 | } 29 | 30 | void layer2_connect2(const char *host, const int port) 31 | { 32 | struct hostent *he; 33 | struct sockaddr_in their_addr; 34 | 35 | if ((he = gethostbyname(host)) == NULL) { 36 | herror("gethostbyname"); 37 | exit(1); 38 | } 39 | 40 | if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) { 41 | perror("socket"); 42 | exit(1); 43 | } 44 | 45 | their_addr.sin_family = AF_INET; 46 | their_addr.sin_port = htons(port); 47 | their_addr.sin_addr = *((struct in_addr *)he->h_addr); 48 | bzero(&(their_addr.sin_zero), 8); 49 | 50 | if (connect(sockfd, (struct sockaddr *)&their_addr, sizeof(struct sockaddr)) == -1) { 51 | perror("connect"); 52 | exit(1); 53 | } 54 | } 55 | 56 | int layer2_getc() 57 | { 58 | if (is_last_char_buffered) { 59 | is_last_char_buffered = 0; 60 | } else { 61 | ssize_t numbytes = recv(sockfd, &last_char, 1, 0); 62 | if (numbytes == -1) { 63 | perror("recv"); 64 | exit(1); 65 | } 66 | } 67 | return last_char; 68 | } 69 | 70 | void layer2_ungetc() 71 | { 72 | is_last_char_buffered = 1; 73 | } 74 | 75 | void layer2_write(const unsigned char *s, unsigned int len) 76 | { 77 | if (send(sockfd, s, len, 0) == -1){ 78 | perror("send"); 79 | exit (1); 80 | } 81 | } 82 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # BTX Decoder 2 | 3 | BTX Decoder ist ein Client für den Bildschirmtext Onlinedienst. Er basiert auf der Decoder-Logik der BSD-lizensierten Software "XCept 2.1" von 1995 und wurde an moderne C-Compiler angepaßt. 4 | 5 | Der Kern des Decoders ist portables C mit minimalen Betriebssystem-Abhängigkeiten. Im Moment existieren Frontends für macOS und iOS. 6 | 7 | ## Copyright von XCept 2.1 8 | 9 | Copyright (c) 1992, 1993 Arno Augustin, Frank Hoering, University of 10 | Erlangen-Nuremberg, Germany. 11 | All rights reserved. 12 | 13 | Redistribution and use in source and binary forms, with or without 14 | modification, are permitted provided that the following conditions 15 | are met: 16 | 1. Redistributions of source code must retain the above copyright 17 | notice, this list of conditions and the following disclaimer. 18 | 2. Redistributions in binary form must reproduce the above copyright 19 | notice, this list of conditions and the following disclaimer in the 20 | documentation and/or other materials provided with the distribution. 21 | 3. All advertising materials mentioning features or use of this software 22 | must display the following acknowledgement: 23 | This product includes software developed by the University of 24 | Erlangen-Nuremberg, Germany. 25 | 4. Neither the name of the University nor the names of its contributors 26 | may be used to endorse or promote products derived from this software 27 | without specific prior written permission. 28 | 29 | THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR 30 | IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 31 | MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO 32 | EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 33 | SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 34 | PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 35 | OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 36 | WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 37 | OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 38 | ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 39 | 40 | ## Autor 41 | 42 | Die Modernisierung und das macOS-Frontend stammen von Michael Steil, E-Mail: mist64@mac.com 43 | 44 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | matrix: 2 | include: 3 | - os: linux 4 | language: c 5 | dist: trusty 6 | sudo: required 7 | - os: osx 8 | language: objc 9 | osx_image: xcode10.1 10 | env: 11 | - SDK_VERSION=10.9 SDKROOT=macosx10.9 12 | 13 | addons: 14 | apt: 15 | packages: 16 | - libsdl2-dev 17 | 18 | script: 19 | - | 20 | if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then 21 | echo "Downloading ${MACOSX_DEPLOYMENT_TARGET} sdk" 22 | curl -L -O https://github.com/phracker/MacOSX-SDKs/releases/download/MacOSX10.11.sdk/MacOSX${SDK_VERSION}.sdk.tar.xz 23 | sudo tar xf MacOSX*.sdk.tar.xz -C /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/ 24 | ls -lh /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/ 25 | plutil -replace MinimumSDKVersion -string ${SDK_VERSION} $(xcode-select -p)/Platforms/MacOSX.platform/Info.plist 26 | plutil -replace DTSDKName -string macosx${SDK_VERSION}internal $(xcode-select -p)/Platforms/MacOSX.platform/Info.plist 27 | sed -i -e 's|MACOSX_DEPLOYMENT_TARGET = 10.13|MACOSX_DEPLOYMENT_TARGET = 10.9|g' ./macOS/btx_decoder.xcodeproj/project.pbxproj 28 | xcodebuild -version -sdk 29 | set -o pipefail 30 | xcodebuild -project ./macOS/btx_decoder.xcodeproj -sdk $SDKROOT -arch x86_64 31 | mkdir -p out ; hdiutil create -format UDZO -srcfolder macOS/build/Release/ out/btx_decoder-$(git rev-parse --short HEAD).dmg 32 | elif [[ "$TRAVIS_OS_NAME" == "linux" ]]; then 33 | cd sdl/ 34 | make 35 | strip btx-sdl 36 | mkdir -p appdir/usr/bin ; cp btx-sdl appdir/usr/bin/ 37 | mkdir -p appdir/usr/share/icons/hicolor/256x256/apps ; cp bildschirmtext.png appdir/usr/share/icons/hicolor/256x256/apps/ 38 | mkdir -p appdir/usr/share/applications ; cp btx-sdl.desktop appdir/usr/share/applications/ 39 | wget -c -nv "https://github.com/probonopd/linuxdeployqt/releases/download/continuous/linuxdeployqt-continuous-x86_64.AppImage" 40 | chmod a+x linuxdeployqt-continuous-x86_64.AppImage 41 | ./linuxdeployqt-continuous-x86_64.AppImage appdir/usr/share/applications/*.desktop -appimage 42 | mkdir -p ../out ; cp btx-sdl BTX*.AppImage* ../out/ 43 | cd .. 44 | fi 45 | 46 | after_success: 47 | - wget -c https://github.com/probonopd/uploadtool/raw/master/upload.sh 48 | - bash upload.sh out/* 49 | 50 | branches: 51 | except: 52 | - # Do not build tags that we create when we upload to GitHub Releases 53 | - /^(?i:continuous)/ 54 | -------------------------------------------------------------------------------- /attrib.h: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 1992, 1993 Arno Augustin, Frank Hoering, University of 3 | * Erlangen-Nuremberg, Germany. 4 | * All rights reserved. 5 | * 6 | * Redistribution and use in source and binary forms, with or without 7 | * modification, are permitted provided that the following conditions 8 | * are met: 9 | * 1. Redistributions of source code must retain the above copyright 10 | * notice, this list of conditions and the following disclaimer. 11 | * 2. Redistributions in binary form must reproduce the above copyright 12 | * notice, this list of conditions and the following disclaimer in the 13 | * documentation and/or other materials provided with the distribution. 14 | * 3. All advertising materials mentioning features or use of this software 15 | * must display the following acknowledgement: 16 | * This product includes software developed by the University of 17 | * Erlangen-Nuremberg, Germany. 18 | * 4. Neither the name of the University nor the names of its contributors 19 | * may be used to endorse or promote products derived from this software 20 | * without specific prior written permission. 21 | * 22 | * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR 23 | * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 24 | * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO 25 | * EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 26 | * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 27 | * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 28 | * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 29 | * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 30 | * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 31 | * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 32 | * 33 | */ 34 | 35 | #define ATTR_UNDERLINE 0x00001 36 | #define ATTR_FLASH 0x00002 37 | #define ATTR_INVERTED 0x00008 38 | #define ATTR_WINDOW 0x00010 39 | #define ATTR_PROTECTED 0x00020 40 | #define ATTR_MARKED 0x00040 41 | #define ATTR_CONCEALED 0x00080 42 | #define ATTR_YDOUBLE 0x00100 43 | #define ATTR_XDOUBLE 0x00200 44 | 45 | #define ATTR_FOREGROUND 0x00400 /* only for set_attr() !! */ 46 | #define ATTR_BACKGROUND 0x00800 /* " */ 47 | #define ATTR_NODOUBLE 0x01000 /* " */ 48 | #define ATTR_XYDOUBLE 0x02000 /* " */ 49 | #define ATTR_SIZE 0x04000 50 | #define ATTR_ANYSIZE (ATTR_NODOUBLE|ATTR_XDOUBLE|ATTR_YDOUBLE|ATTR_XYDOUBLE) 51 | 52 | 53 | #define attrib(y,x,a) ((screen[(y)-1][(x)-1].attr & (a)) > 0) 54 | #define realattr(y,x,a) ((screen[(y)-1][(x)-1].real & (a)) > 0) 55 | #define attr_fg(y,x) screen[(y)-1][(x)-1].fg 56 | #define attr_bg(y,x) screen[(y)-1][(x)-1].bg 57 | 58 | #define BLACK 0 59 | #define RED 1 60 | #define GREEN 2 61 | #define YELLOW 3 62 | #define BLUE 4 63 | #define MAGENTA 5 64 | #define CYAN 6 65 | #define WHITE 7 66 | #define TRANSPARENT 8 67 | 68 | 69 | /* information stored at every character location */ 70 | struct screen_cell { 71 | unsigned int chr; 72 | unsigned char set; 73 | unsigned int attr; /* assigned attributes */ 74 | unsigned int mark; /* markers for each attribute */ 75 | unsigned char fg; 76 | unsigned char bg; 77 | unsigned int real; /* really displayed attributes (size !) */ 78 | }; 79 | -------------------------------------------------------------------------------- /sdl/btx_sdl.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include "../xfont.h" 8 | #include "../layer2.h" 9 | #include "../layer6.h" 10 | 11 | 12 | 13 | int quit=1; 14 | 15 | static int max(int a, int b) 16 | { 17 | if (akeysym.sym; 82 | if (k==SDLK_F1) layer2_write("\x13",1); //Initiator * 83 | if (k==SDLK_F2) layer2_write("\x1c",1); //Terminator # 84 | if (k==SDLK_LEFT) layer2_write("\x08",1); //left 85 | if (k==SDLK_RIGHT) layer2_write("\x09",1); //right 86 | if (k==SDLK_UP) layer2_write("\x0b",1); //Up 87 | if (k==SDLK_DOWN) layer2_write("\x0a",1); //Down 88 | if (k==SDLK_RETURN) layer2_write("\x0d",1); //Return 89 | if (k==SDLK_HOME) layer2_write("\x1e",1); //Active Position home 90 | } 91 | 92 | 93 | int main(int argc, char ** argv) 94 | { 95 | if (argc!=2) { 96 | printf("Usage: %s :\n", argv[0]); 97 | printf("Example: %s 195.201.94.166:20000\n", argv[0]); 98 | return 1; 99 | } 100 | pthread_t dec_thread; 101 | if(pthread_create(&dec_thread, NULL, decoder_thread, (void *) argv[1])) { 102 | fprintf(stderr, "Error creating thread\n"); 103 | return 1; 104 | } 105 | 106 | int width=480; 107 | int height=480; 108 | 109 | SDL_Init(SDL_INIT_VIDEO); 110 | 111 | SDL_Window * window = SDL_CreateWindow("BTX-Decoder", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, width, height, 0); 112 | 113 | SDL_Renderer * renderer = SDL_CreateRenderer(window, -1, 0); 114 | SDL_Texture * texture = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_ARGB8888, SDL_TEXTUREACCESS_STATIC, width, height); 115 | 116 | uint32_t pixels[width*height]; 117 | 118 | memset(pixels, 0xaa, width*height * sizeof(Uint32)); 119 | SDL_StartTextInput(); 120 | while (quit!=0) 121 | { 122 | int draw=0; 123 | if (dirty!=0) { 124 | dirty=0; 125 | draw=1; 126 | } 127 | int eventtimeout=40; 128 | if (draw!=0) eventtimeout=10; 129 | SDL_Event event; 130 | SDL_WaitEventTimeout(&event,250); 131 | switch (event.type) 132 | { 133 | case SDL_TEXTINPUT: 134 | handle_textinput(event.text.text); 135 | break; 136 | case SDL_KEYDOWN: 137 | handle_keydown(&event.key); 138 | break; 139 | case SDL_QUIT: 140 | quit = 0; 141 | break; 142 | case SDL_MOUSEBUTTONUP: 143 | break; 144 | case SDL_MOUSEBUTTONDOWN: 145 | case SDL_MOUSEMOTION: 146 | break; 147 | } 148 | if (draw!=0) { 149 | update_pixels(pixels, width, height); 150 | SDL_UpdateTexture(texture, NULL, pixels, width * sizeof(Uint32)); 151 | SDL_RenderClear(renderer); 152 | SDL_RenderCopy(renderer, texture, NULL, NULL); 153 | SDL_RenderPresent(renderer); 154 | } 155 | } 156 | 157 | SDL_StopTextInput(); 158 | SDL_DestroyTexture(texture); 159 | SDL_DestroyRenderer(renderer); 160 | 161 | SDL_DestroyWindow(window); 162 | SDL_Quit(); 163 | 164 | return 0; 165 | } 166 | -------------------------------------------------------------------------------- /iOS/btx_decoder/ViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // ViewController.m 3 | // btx_decoder 4 | // 5 | 6 | #import "ViewController.h" 7 | #import "xfont.h" 8 | #import "layer6.h" 9 | #import "control.h" 10 | #import "layer2.h" 11 | 12 | @interface ViewController () 13 | @property (nonatomic) NSTimeInterval nextFrameTime; 14 | @end 15 | 16 | @implementation ViewController 17 | { 18 | UIView *_btxView; 19 | UITextField *_textField; 20 | } 21 | 22 | - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string 23 | { 24 | NSLog(@"%lu/%lu '%@' (%lu)", (unsigned long)range.location, (unsigned long)range.length, string, (unsigned long)string.length); 25 | if (range.location == 0 && range.length == 1 && string.length == 0) { 26 | // backspace 27 | layer2_write((unsigned char *)"\b \b", 3); 28 | } else { 29 | const char *s = string.UTF8String; 30 | layer2_write((unsigned char *)s, (unsigned int)string.length); 31 | } 32 | return NO; 33 | } 34 | 35 | - (void)buttonPressed:(UIButton *)button 36 | { 37 | NSUInteger i = button.tag; 38 | unsigned char c; 39 | if (i) { 40 | c = TER; 41 | } else { 42 | c = INI; 43 | } 44 | layer2_write(&c, 1); 45 | } 46 | 47 | - (void)viewDidLayoutSubviews 48 | { 49 | CGRect frame = self.view.bounds; 50 | frame.origin.y = 50; 51 | frame.size.height = frame.size.width * 3.0 / 4.0; 52 | _btxView.frame = frame; 53 | 54 | _textField.frame = CGRectMake(0, CGRectGetMaxY(frame), frame.size.width, 30); 55 | } 56 | 57 | - (void)viewDidLoad 58 | { 59 | [super viewDidLoad]; 60 | 61 | self.view.backgroundColor = [UIColor blackColor]; 62 | 63 | _btxView = [[UIView alloc] init]; 64 | [self.view addSubview:_btxView]; 65 | 66 | const CGFloat kButtonSize = 50; 67 | 68 | const CGFloat kPlaceholderWidth = 100; 69 | UIView *_inputAccessoryView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, kPlaceholderWidth, kButtonSize)]; 70 | for (NSUInteger i = 0; i < 2; i++) { 71 | UIButton *button = [[UIButton alloc] init]; 72 | CGRect f; 73 | f.origin = CGPointMake(0, 0); 74 | f.size = CGSizeMake(kButtonSize, kButtonSize); 75 | button.frame = CGRectMake(i * kPlaceholderWidth / 2, 0, kPlaceholderWidth / 2, kButtonSize); 76 | if (i == 0) { 77 | button.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleRightMargin; 78 | } else { 79 | button.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleLeftMargin; 80 | } 81 | [button setTitle:i ? @"#" : @"*" forState:UIControlStateNormal]; 82 | button.backgroundColor = [UIColor grayColor]; 83 | [button setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal]; 84 | button.layer.borderColor = [UIColor lightGrayColor].CGColor; 85 | button.layer.borderWidth = .5; 86 | button.tag = i; 87 | [button addTarget:self action:@selector(buttonPressed:) forControlEvents:UIControlEventTouchUpInside]; 88 | [_inputAccessoryView addSubview:button]; 89 | } 90 | 91 | _textField = [[UITextField alloc] init]; 92 | [self.view addSubview:_textField]; 93 | _textField.text = @" "; 94 | _textField.delegate = self; 95 | _textField.autocapitalizationType = UITextAutocapitalizationTypeNone; 96 | _textField.autocorrectionType = UITextAutocorrectionTypeNo; 97 | _textField.inputAccessoryView = _inputAccessoryView; 98 | _textField.alpha = 0; 99 | [_textField becomeFirstResponder]; 100 | 101 | // initialize decoder 102 | init_xfont(); 103 | init_layer6(); 104 | 105 | layer2_connect(); 106 | 107 | // Thread 1: Decoder 108 | dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 109 | for (;;) { 110 | process_BTX_data(); 111 | } 112 | }); 113 | 114 | // Thread 2: Display 115 | dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 116 | NSTimeInterval TIME_PER_FRAME = 1.0 / 60; 117 | 118 | self.nextFrameTime = [NSDate timeIntervalSinceReferenceDate] + TIME_PER_FRAME; 119 | 120 | for (;;) { 121 | NSTimeInterval now = [NSDate timeIntervalSinceReferenceDate]; 122 | if (now < self.nextFrameTime) { 123 | [NSThread sleepForTimeInterval:self.nextFrameTime - now]; 124 | } else { 125 | if (dirty) { 126 | dirty = 0; 127 | 128 | CGDataProviderRef provider = CGDataProviderCreateWithData(NULL, memimage, 480*240*3, NULL); 129 | CGColorSpaceRef colorspace = CGColorSpaceCreateDeviceRGB(); 130 | 131 | CGImageRef image = CGImageCreate(480, 240, 8, 24, 480*3, colorspace, kCGBitmapByteOrderDefault | kCGImageAlphaNone, provider, NULL, NO, kCGRenderingIntentDefault); 132 | CFRelease(colorspace); 133 | CFRelease(provider); 134 | 135 | dispatch_async(dispatch_get_main_queue(), ^{ 136 | self->_btxView.layer.contents = CFBridgingRelease(image); 137 | }); 138 | } 139 | if (now - 2 * TIME_PER_FRAME > self.nextFrameTime) { 140 | self.nextFrameTime = now; 141 | } else { 142 | self.nextFrameTime += TIME_PER_FRAME; 143 | } 144 | } 145 | } 146 | }); 147 | } 148 | 149 | @end 150 | -------------------------------------------------------------------------------- /macOS/btx_decoder/AppDelegate.m: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.m 3 | // btx_decoder 4 | // 5 | 6 | #import "AppDelegate.h" 7 | #import 8 | #import "xfont.h" 9 | #import "layer6.h" 10 | #import "control.h" 11 | #import "layer2.h" 12 | 13 | @interface View : NSView 14 | 15 | @property (atomic, strong) id nextLayerContents; 16 | - (void)swapToNextFrame; 17 | @end 18 | 19 | static CVReturn renderCallback(__unused CVDisplayLinkRef displayLink, 20 | __unused const CVTimeStamp *inNow, 21 | __unused const CVTimeStamp *inOutputTime, 22 | __unused CVOptionFlags flagsIn, 23 | __unused CVOptionFlags *flagsOut, 24 | __unused void *displayLinkContext) { 25 | [(__bridge View *)displayLinkContext swapToNextFrame]; 26 | return kCVReturnSuccess; 27 | } 28 | 29 | 30 | @implementation View 31 | 32 | - (id)initWithFrame:(NSRect)frame { 33 | self = [super initWithFrame:frame]; 34 | if (self) { 35 | self.layer = [CALayer layer]; 36 | self.wantsLayer = YES; 37 | 38 | [self setupDisplayLink]; 39 | } 40 | return self; 41 | } 42 | 43 | - (void)drawRect:(__unused NSRect)dirtyRect { 44 | // intentionally nothing 45 | } 46 | 47 | - (void)setupDisplayLink { 48 | CVDisplayLinkRef displayLink; 49 | CGDirectDisplayID displayID = CGMainDisplayID(); 50 | CVReturn error = kCVReturnSuccess; 51 | error = CVDisplayLinkCreateWithCGDisplay(displayID, &displayLink); 52 | if (error) { 53 | NSLog(@"DisplayLink created with error:%d", error); 54 | displayLink = NULL; 55 | } 56 | CVDisplayLinkSetOutputCallback(displayLink, renderCallback, (__bridge void *)self); 57 | CVDisplayLinkStart(displayLink); 58 | } 59 | 60 | - (void)updateLayerContents { 61 | CGDataProviderRef provider = CGDataProviderCreateWithData(NULL, memimage, 480*240*3, NULL); 62 | CGColorSpaceRef colorspace = CGColorSpaceCreateDeviceRGB(); 63 | 64 | CGImageRef image = CGImageCreate(480, 240, 8, 24, 480*3, colorspace, kCGBitmapByteOrderDefault | kCGImageAlphaNone, provider, NULL, NO, kCGRenderingIntentDefault); 65 | CFRelease(colorspace); 66 | CFRelease(provider); 67 | 68 | self.nextLayerContents = CFBridgingRelease(image); 69 | } 70 | 71 | - (void)swapToNextFrame { 72 | id nextContents = self.nextLayerContents; 73 | if (nextContents) { 74 | self.nextLayerContents = nil; 75 | dispatch_async(dispatch_get_main_queue(), ^{ 76 | [CATransaction begin]; 77 | [CATransaction setDisableActions:YES]; 78 | self.layer.contents = nextContents; 79 | [CATransaction commit]; 80 | }); 81 | } 82 | } 83 | 84 | - (BOOL)acceptsFirstResponder 85 | { 86 | return YES; 87 | } 88 | 89 | - (void)keyDown:(NSEvent *)event 90 | { 91 | if (!event.characters.length) { 92 | return; 93 | } 94 | int ch = [event.characters characterAtIndex:0]; 95 | unsigned char c[3]; 96 | int len = 1; 97 | NSLog(@"c: 0x%x", ch); 98 | switch (ch) { 99 | case NSUpArrowFunctionKey: 100 | c[0] = APU; 101 | break; 102 | case NSDownArrowFunctionKey: 103 | c[0] = APD; 104 | break; 105 | case NSLeftArrowFunctionKey: 106 | c[0] = APB; 107 | break; 108 | case NSRightArrowFunctionKey: 109 | c[0] = APF; 110 | break; 111 | case NSF1FunctionKey: 112 | c[0] = INI; 113 | break; 114 | case NSF2FunctionKey: 115 | c[0] = TER; 116 | break; 117 | case NSF3FunctionKey: 118 | c[0] = DCT; 119 | break; 120 | case 0x7f: // backspace 121 | c[0] = APB; 122 | c[1] = ' '; 123 | c[2] = APB; 124 | len = 3; 125 | break; 126 | case 0xc4: // 'Ä' 127 | c[0] = SS2; 128 | c[1] = 'H'; 129 | c[2] = 'A'; 130 | len = 3; 131 | break; 132 | case 0xd6: // 'Ö' 133 | c[0] = SS2; 134 | c[1] = 'H'; 135 | c[2] = 'O'; 136 | len = 3; 137 | break; 138 | case 0xdc: // 'Ü' 139 | c[0] = SS2; 140 | c[1] = 'H'; 141 | c[2] = 'U'; 142 | len = 3; 143 | break; 144 | case 0xdf: // 'ß' 145 | c[0] = SS2; 146 | c[1] = '{'; 147 | len = 2; 148 | break; 149 | case 0xe4: // 'ä' 150 | c[0] = SS2; 151 | c[1] = 'H'; 152 | c[2] = 'a'; 153 | len = 3; 154 | break; 155 | case 0xf6: // 'ö' 156 | c[0] = SS2; 157 | c[1] = 'H'; 158 | c[2] = 'o'; 159 | len = 3; 160 | break; 161 | case 0xfc: // 'ü' 162 | c[0] = SS2; 163 | c[1] = 'H'; 164 | c[2] = 'u'; 165 | len = 3; 166 | break; 167 | default: 168 | c[0] = ch; 169 | } 170 | layer2_write(c, len); 171 | } 172 | 173 | 174 | @end 175 | 176 | @interface AppDelegate () 177 | 178 | @property (weak) IBOutlet NSWindow *window; 179 | @property (nonatomic) NSTimeInterval nextFrameTime; 180 | @end 181 | 182 | @implementation AppDelegate 183 | 184 | - (void)applicationDidFinishLaunching:(NSNotification *)notification 185 | { 186 | #ifdef PIXEL_EXACT 187 | CGFloat scale = 1; 188 | #else 189 | CGFloat scale = 1.5; 190 | CGFloat scaleX = scale * 1; 191 | CGFloat scaleY = scale * (4.0 / 3.0); // for a 4:3 aspect ratio 192 | #endif 193 | [self.window setFrame:CGRectMake(0, 1000, 480 * scaleX, 240 * scaleY + 22) display:YES]; 194 | 195 | CGRect bounds = self.window.contentView.frame; 196 | bounds.origin = CGPointZero; 197 | View *view = [[View alloc] initWithFrame:bounds]; 198 | [view setAutoresizingMask:NSViewWidthSizable | NSViewHeightSizable]; 199 | [self.window.contentView setAutoresizesSubviews:YES]; 200 | [self.window.contentView addSubview:view]; 201 | [self.window makeFirstResponder:view]; 202 | 203 | // initialize decoder 204 | init_xfont(); 205 | init_layer6(); 206 | 207 | layer2_connect(); 208 | 209 | // Thread 1: Decoder 210 | dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 211 | for (;;) { 212 | process_BTX_data(); 213 | } 214 | }); 215 | 216 | // Thread 2: Display 217 | dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 218 | NSTimeInterval TIME_PER_FRAME = 1.0 / 60; 219 | 220 | self.nextFrameTime = [NSDate timeIntervalSinceReferenceDate] + TIME_PER_FRAME; 221 | 222 | for (;;) { 223 | NSTimeInterval now = [NSDate timeIntervalSinceReferenceDate]; 224 | if (now < self.nextFrameTime) { 225 | [NSThread sleepForTimeInterval:self.nextFrameTime - now]; 226 | } else { 227 | if (dirty) { 228 | dirty = 0; 229 | [view updateLayerContents]; 230 | } 231 | if (now - 2 * TIME_PER_FRAME > self.nextFrameTime) { 232 | self.nextFrameTime = now; 233 | } else { 234 | self.nextFrameTime += TIME_PER_FRAME; 235 | } 236 | } 237 | } 238 | }); 239 | } 240 | 241 | @end 242 | -------------------------------------------------------------------------------- /control.h: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 1992, 1993 Arno Augustin, Frank Hoering, University of 3 | * Erlangen-Nuremberg, Germany. 4 | * All rights reserved. 5 | * 6 | * Redistribution and use in source and binary forms, with or without 7 | * modification, are permitted provided that the following conditions 8 | * are met: 9 | * 1. Redistributions of source code must retain the above copyright 10 | * notice, this list of conditions and the following disclaimer. 11 | * 2. Redistributions in binary form must reproduce the above copyright 12 | * notice, this list of conditions and the following disclaimer in the 13 | * documentation and/or other materials provided with the distribution. 14 | * 3. All advertising materials mentioning features or use of this software 15 | * must display the following acknowledgement: 16 | * This product includes software developed by the University of 17 | * Erlangen-Nuremberg, Germany. 18 | * 4. Neither the name of the University nor the names of its contributors 19 | * may be used to endorse or promote products derived from this software 20 | * without specific prior written permission. 21 | * 22 | * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR 23 | * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 24 | * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO 25 | * EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 26 | * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 27 | * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 28 | * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 29 | * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 30 | * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 31 | * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 32 | */ 33 | 34 | 35 | /* primary control function set (page 119 and annex 6) */ 36 | 37 | #define NUL 0x00 /* NOP time filler (level 2) */ 38 | #define SOH 0x01 /* start of heading (level 2) */ 39 | #define STX 0x02 /* start text (level 2) */ 40 | #define ETX 0x03 /* end text (level 2) */ 41 | #define EOT 0x04 /* end of transmission (level 2) */ 42 | #define ENQ 0x05 /* enquiry (level 2) */ 43 | #define ACK 0x06 /* acknowledge (level 2) */ 44 | #define ITB 0x07 /* end intermediate block (level 2) */ 45 | #define APB 0x08 /* active position back (level 6) */ 46 | #define APF 0x09 /* active position forward (level 6) */ 47 | #define APD 0x0a /* active position down (level 6) */ 48 | #define APU 0x0b /* active position up (level 6) */ 49 | #define CS 0x0c /* clear screen (level 6) */ 50 | #define APR 0x0d /* active position return (level 6) */ 51 | #define LS1 0x0e /* locking shift 1 (level 6) */ 52 | #define LS0 0x0f /* locking shift 0 (level 6) */ 53 | #define DLE 0x10 /* data link escape (level 2) */ 54 | #define CON 0x11 /* cursor on (level 6) */ 55 | #define RPT 0x12 /* repeat last character (level 6) */ 56 | #define INI 0x13 /* initiator '*' (level 7) */ 57 | #define COF 0x14 /* cursor off (level 6) */ 58 | #define NAK 0x15 /* negative acknowledge (level 2) */ 59 | #define SYN 0x16 /* (level 2) */ 60 | #define ETB 0x17 /* end textblock (level 2) */ 61 | #define CAN 0x18 /* cancel, clear to eol (level 6) */ 62 | #define SS2 0x19 /* single shift for G2 SET (level 6) */ 63 | #define DCT 0x1a /* terminate data collect (level 7) */ 64 | #define ESC 0x1b /* escape (level 6) */ 65 | #define TER 0x1c /* terminator '#' (level 7) */ 66 | #define SS3 0x1d /* single shift for G3 SET (level 6) */ 67 | #define APH 0x1e /* active position home (level 6) */ 68 | #define APA 0x1f /* active position (level 6) */ 69 | #define US 0x1f /* unit separator (= APA) (level 6) */ 70 | 71 | 72 | /* supplementary control function set repertory 1 (serial) C1S (page 121) */ 73 | 74 | #define ABK 0x80 /* Alphanumeric black */ 75 | #define ANR 0x81 /* Alphanumeric red */ 76 | #define ANG 0x82 /* Alphanumeric green */ 77 | #define ANY 0x83 /* Alphanumeric yellow */ 78 | #define ANB 0x84 /* Alphanumeric blue */ 79 | #define ANM 0x85 /* Alphanumeric magenta */ 80 | #define ANC 0x86 /* Alphanumeric cyan */ 81 | #define ANW 0x87 /* Alphanumeric white */ 82 | #define FSH 0x88 /* Flashing begin */ 83 | #define STD 0x89 /* Flashing steady */ 84 | #define EBX 0x8a /* End of window */ 85 | #define SBX 0x8b /* Start of window */ 86 | #define NSZ 0x8c /* Normal size */ 87 | #define DBH 0x8d /* Double height */ 88 | #define DBW 0x8e /* Double width */ 89 | #define DBS 0x8f /* Double size */ 90 | #define MBK 0x90 /* Mosaic black */ 91 | #define MSR 0x91 /* Mosaic red */ 92 | #define MSG 0x92 /* Mosaic green */ 93 | #define MSY 0x93 /* Mosaic yellow */ 94 | #define MSB 0x94 /* Mosaic blue */ 95 | #define MSM 0x95 /* Mosaic magenta */ 96 | #define MSC 0x96 /* Mosaic cyan */ 97 | #define MSW 0x97 /* Mosaic white */ 98 | #define CDY 0x98 /* Conceal display */ 99 | #define SPL 0x99 /* Stop lining */ 100 | #define STL 0x9a /* Start lining */ 101 | #define CSI 0x9b /* Control sequence introducer */ 102 | #define BBD 0x9c /* Black background */ 103 | #define NBD 0x9d /* New background */ 104 | #define HMS 0x9e /* Hold mosaic */ 105 | #define RMS 0x9f /* Release mosaic */ 106 | 107 | 108 | /* supplementary control function set repertory 2 (parallel) C1P (page 122) */ 109 | 110 | #define BKF 0x80 /* Black foreground */ 111 | #define RDF 0x81 /* Red foreground */ 112 | #define GRF 0x82 /* Green foreground */ 113 | #define YLF 0x83 /* Yellow foreground */ 114 | #define BLF 0x84 /* Blue foreground */ 115 | #define MGF 0x85 /* Magenta foreground */ 116 | #define CNF 0x86 /* Cyan foreground */ 117 | #define WHF 0x87 /* White foreground */ 118 | /* FSH 0x88 Flashing begin */ 119 | /* STD 0x89 Flashing steady */ 120 | /* EBX 0x8a End of window */ 121 | /* SBX 0x8b Start of window */ 122 | /* NSZ 0x8c Normal size */ 123 | /* DBH 0x8d Double height */ 124 | /* DBW 0x8e Double width */ 125 | /* DBS 0x8f Double size */ 126 | #define BKB 0x90 /* Black background */ 127 | #define RDB 0x91 /* Red background */ 128 | #define GRB 0x92 /* Green background */ 129 | #define YLB 0x93 /* Yellow background */ 130 | #define BLB 0x94 /* Blue background */ 131 | #define MGB 0x95 /* Magenta background */ 132 | #define CNB 0x96 /* Cyan background */ 133 | #define WHB 0x97 /* White background */ 134 | /* CDY 0x98 Conceal display */ 135 | /* SPL 0x99 Stop lining */ 136 | /* STL 0x9a Start lining */ 137 | /* CSI 0x9b Control sequence introducer */ 138 | #define NPO 0x9c /* Normal polarity */ 139 | #define IPO 0x9d /* Inverted polarity */ 140 | #define TRB 0x9e /* Transparent background */ 141 | #define STC 0x9f /* Stop conceal */ 142 | 143 | 144 | 145 | /* 146 | * control code sequences (annex 6) 147 | * 148 | 149 | US 0x20 TFI ... (annex 7.3) 150 | US 0x23 define DRCS (page 86) 151 | US 0x26 define color 152 | US 0x2d define format 153 | US 0x2f reset 154 | US position cursor at x, y 155 | 156 | ESC 0x22 0x40 invoke serial C1 set (page 116) 157 | ESC 0x22 0x41 invoke parallel C1 set 158 | ESC 0x23 0x21 full row attributes (page 134) 159 | ESC 0x23 0x20 full screen attributes (page 136) 160 | = BKB(C1P 0x50), RDB(C1P 0x51), .... 161 | 162 | ESC 0x28 G0 163 | ESC 0x29 G1 164 | ESC 0x2a G2 165 | ESC 0x2b G3 166 | = 0x40 primary graphic set 167 | 0x62 suppl. graphic set 168 | 0x63 2nd suppl. mosaic set 169 | 0x64 3rd suppl. mosaic set 170 | 0x20 0x40 DRCS 171 | 172 | ESC 0x7e LS1R locking shift 1 right (page 114) 173 | ESC 0x6e LS2 locking shift 2 174 | ESC 0x7d LS2R locking shift 2 right 175 | ESC 0x6f LS3 locking shift 3 176 | ESC 0x7c LS3R locking shift 3 right 177 | 178 | 179 | CSI 0x30 0x41 IVF inverted flash (page 131) 180 | CSI 0x31 0x41 RIF reduced intesity flash 181 | CSI 0x32 0x41 FF1 fast flash 1 182 | CSI 0x33 0x41 FF2 fast flash 2 183 | CSI 0x34 0x41 FF3 fast flash 3 184 | CSI 0x35 0x41 ICF increment flash 185 | CSI 0x36 0x41 DCF decrement flash 186 | 187 | CSI 0x42 STC stop conceal (same as C1P STC) (page 133) 188 | 189 | CSI 0x32 0x53 MMS marked mode start 190 | CSI 0x32 0x54 MMT makred mode stop 191 | 192 | CSI 0x31 0x50 PMS protected mode start 193 | CSI 0x31 0x51 PMC protected mode cancel 194 | 195 | CSI 0x30 0x40 CT1 color table 1 (page 137) 196 | CSI 0x31 0x40 CT2 color table 2 197 | CSI 0x32 0x40 CT3 color table 3 198 | CSI 0x33 0x40 CT4 color table 4 199 | 200 | CSI 0x3b 0x55 CSA create scrolling area 201 | CSI 0x3b 0x56 DSA delete scrolling area 202 | CSI 0x30 0x60 SCU scroll up 203 | CSI 0x31 0x60 SCD scroll down 204 | CSI 0x32 0x60 AIS activate implicit scrolling 205 | CSI 0x33 0x60 DIS deactivate implicit scrolling 206 | 207 | */ 208 | -------------------------------------------------------------------------------- /xfont.c: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 1992, 1993 Arno Augustin, Frank Hoering, University of 3 | * Erlangen-Nuremberg, Germany. 4 | * All rights reserved. 5 | * 6 | * Redistribution and use in source and binary forms, with or without 7 | * modification, are permitted provided that the following conditions 8 | * are met: 9 | * 1. Redistributions of source code must retain the above copyright 10 | * notice, this list of conditions and the following disclaimer. 11 | * 2. Redistributions in binary form must reproduce the above copyright 12 | * notice, this list of conditions and the following disclaimer in the 13 | * documentation and/or other materials provided with the distribution. 14 | * 3. All advertising materials mentioning features or use of this software 15 | * must display the following acknowledgement: 16 | * This product includes software developed by the University of 17 | * Erlangen-Nuremberg, Germany. 18 | * 4. Neither the name of the University nor the names of its contributors 19 | * may be used to endorse or promote products derived from this software 20 | * without specific prior written permission. 21 | * 22 | * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR 23 | * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 24 | * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO 25 | * EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 26 | * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 27 | * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 28 | * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 29 | * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 30 | * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 31 | * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 32 | */ 33 | 34 | #include 35 | #include 36 | #include "font.h" 37 | //#include "layer6.h" 38 | #include "attrib.h" 39 | #include "xfont.h" 40 | #include "rawfont.h" 41 | 42 | struct btxchar { 43 | struct btxchar *link; /* NULL: use this char, else: use linked char */ 44 | char *raw; /* pointer to raw font data */ 45 | char bits; /* depth in case of DRC */ 46 | }; /* 0: normal (index = yd*2+xd) */ 47 | /* 1: xdouble */ 48 | /* 2: ydouble */ 49 | /* 3: xydouble */ 50 | 51 | typedef struct { 52 | unsigned char red; 53 | unsigned char green; 54 | unsigned char blue; 55 | } color; 56 | 57 | unsigned char *memimage = NULL; 58 | 59 | /* local variables */ 60 | static struct btxchar btx_font[6*96]; 61 | static int fullrow_bg[24]; /* fullrow background color for eacch row */ 62 | static int dclut[4]; /* map the 4-color DRC's */ 63 | static color colormap[32+4+24]; /* store pixel value for each colorcell */ 64 | 65 | /* local functions */ 66 | static void xdraw_normal_char(struct btxchar *ch, int x, int y, int xd, int yd, int ul, struct btxchar *dia, int fg, int bg, int fontheight); 67 | static void xdraw_multicolor_char(struct btxchar *ch, int x, int y, int xd, int yd, int fontheight); 68 | 69 | /* 70 | * initialize character sets. 71 | */ 72 | 73 | void init_fonts() 74 | { 75 | static char raw_del[] = { 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 76 | 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 77 | 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f }; 78 | int n; 79 | 80 | /* primary graphic, 2nd suppl. mosaic, suppl. graphic, 3rd suppl. mosaic */ 81 | for(n=0; n<4*96; n++) { 82 | btx_font[n].raw = raw_font+n*2*FONT_HEIGHT; 83 | btx_font[n].bits = 1; 84 | btx_font[n].link = NULL; 85 | } 86 | 87 | /* link chars into '1st supplementary mosaic' (L) set */ 88 | for(n=0; n<32; n++) { 89 | btx_font[SUP1*96+n].link = btx_font+SUP2*96+n; 90 | btx_font[SUP1*96+n+32].link = btx_font+PRIM*96+n+32; 91 | btx_font[SUP1*96+n+64].link = btx_font+SUP2*96+n+64; 92 | } 93 | 94 | /* initialize the DEL character of the L set */ 95 | btx_font[L*96+0x7f-0x20].link = NULL; 96 | btx_font[L*96+0x7f-0x20].raw = raw_del; 97 | btx_font[L*96+0x7f-0x20].bits = 1; 98 | 99 | /* initialize DRCS font to all NULL's */ 100 | btx_font[DRCS*96+0].link = btx_font; /* link 'SPACE' */ 101 | for(n=1; n<96; n++) { 102 | btx_font[DRCS*96+n].bits = 0; 103 | btx_font[DRCS*96+n].raw = NULL; 104 | btx_font[DRCS*96+n].link = NULL; 105 | } 106 | } 107 | 108 | 109 | /* 110 | * draw the specified character at cursor position x, y (zero based). 111 | * The character is stretched according to xdouble, ydouble (1=stretch, 112 | * 0=don't). 113 | */ 114 | 115 | void xputc(int c, int set, int x, int y, int xdouble, int ydouble, int underline, int diacrit, int fg, int bg, int fontheight, int rows) 116 | { 117 | struct btxchar *ch, *dia; 118 | 119 | if(x<0 || y<0 || x>39 || y>rows-1) return; 120 | 121 | ch = btx_font + set*96 + c - 0x20; 122 | 123 | /* folow the link pointer */ 124 | if(ch->link) ch = ch->link; 125 | 126 | /* a yet undefined DRC should be drawn - draw a SPACE */ 127 | if(!ch->raw) ch = btx_font; 128 | 129 | if(ch->bits==1) { 130 | dia = diacrit ? btx_font + SUPP*96 + diacrit - 0x20 : NULL; 131 | xdraw_normal_char(ch, x, y, xdouble, ydouble, underline, dia, fg, bg, fontheight); 132 | } 133 | else { /* 2/4 bits */ 134 | xdraw_multicolor_char(ch, x, y, xdouble, ydouble, fontheight); 135 | } 136 | } 137 | 138 | 139 | #define set_mem(x, y, col) { \ 140 | memimage[(y)*480*3 + (x)*3 + 0] = colormap[col].red; \ 141 | memimage[(y)*480*3 + (x)*3 + 1] = colormap[col].green; \ 142 | memimage[(y)*480*3 + (x)*3 + 2] = colormap[col].blue; } 143 | 144 | static void xdraw_normal_char(struct btxchar *ch, int x, int y, int xd, int yd, int ul, struct btxchar *dia, int fg, int bg, int fontheight) 145 | { 146 | int i, j, z, s, yy, yyy, xxx; 147 | 148 | if(fg==TRANSPARENT) fg = 32+4+y; 149 | if(bg==TRANSPARENT) bg = 32+4+y; 150 | 151 | z=y*fontheight; 152 | for(yy=0; yy=0; i--) 157 | for(xxx=0; xxx<(xd+1); xxx++, s++) 158 | set_mem(s, z, ( (ch->raw[yy*2+j]&(1<raw[yy*2+j]&(1<=0; i--) { 183 | for(p=0, c=0; pbits; p++) 184 | if(ch->raw[p*2*FONT_HEIGHT+yy*2+j]&(1<bits==2) { 186 | c = dclut[c]; 187 | if(c==TRANSPARENT) c = 32+4+y; 188 | } 189 | else c += 16; 190 | for(xxx=0; xxx<(xd+1); xxx++, s++) set_mem(s, z, c); 191 | } 192 | z++; 193 | } 194 | } 195 | } 196 | 197 | 198 | void xcursor(int x, int y, int fontheight) 199 | { 200 | /* this inverts the character at the given location */ 201 | for (int yy = y * fontheight; yy < y * fontheight + fontheight; yy++) { 202 | for (int xx = x * 12; xx < x * 12 + 12; xx++) { 203 | memimage[(yy)*480*3 + (xx)*3 + 0] ^= 0xFF; 204 | memimage[(yy)*480*3 + (xx)*3 + 1] ^= 0xFF; 205 | memimage[(yy)*480*3 + (xx)*3 + 2] ^= 0xFF; 206 | } 207 | } 208 | } 209 | 210 | /* 211 | * defines the raw bitmap data for a DRC 'c'. If 'c' was in use before, 212 | * its old raw data is freed. 213 | */ 214 | 215 | void define_raw_DRC(int c, char *data, int bits) 216 | { 217 | struct btxchar *ch = btx_font + DRCS*96 + c - 0x20; 218 | int n; 219 | 220 | if(ch->raw) free(ch->raw); 221 | 222 | if(! (ch->raw = malloc(2*FONT_HEIGHT*bits)) ) { 223 | perror("XCEPT: no mem for raw DRCS"); 224 | exit(1); 225 | } 226 | 227 | ch->bits = bits; 228 | for(n=0; n<2*FONT_HEIGHT*bits; n++) ch->raw[n] = data[n]; 229 | 230 | ch->link = NULL; 231 | } 232 | 233 | 234 | /* 235 | * free the current DRCS completely 236 | */ 237 | void free_DRCS() 238 | { 239 | int n; 240 | 241 | btx_font[DRCS*96+0].link = btx_font; /* link 'SPACE' */ 242 | for(n=DRCS*96+1; n<(DRCS+1)*96; n++) { 243 | if(btx_font[n].raw) { 244 | free(btx_font[n].raw); 245 | btx_font[n].raw = NULL; 246 | } 247 | btx_font[n].link = NULL; 248 | btx_font[n].bits = 0; 249 | } 250 | } 251 | 252 | 253 | /* 254 | * initialize colormap entries for clut 0-3, DCLUT + fullrow background 255 | */ 256 | void default_colors() 257 | { 258 | int n; 259 | 260 | /* clut 0 + clut 1 */ 261 | for(n=0; n<16; n++) { /* page 112) */ 262 | if(n==8) { colormap[n] = colormap[0]; continue; } 263 | colormap[n].red = ((n&1)>0) ? ( ((n&8)==0) ? 0xff : 0x7f ) : 0; 264 | colormap[n].green = ((n&2)>0) ? ( ((n&8)==0) ? 0xff : 0x7f ) : 0; 265 | colormap[n].blue = ((n&4)>0) ? ( ((n&8)==0) ? 0xff : 0x7f ) : 0; 266 | } 267 | 268 | /* clut 2 + clut 3 */ 269 | for(n=0; n<8; n++) { 270 | colormap[n+16].red = colormap[n+24].red = n&1 ? 0xff : 0; 271 | colormap[n+16].green = colormap[n+24].green = n&2 ? 0xff : 0; 272 | colormap[n+16].blue = colormap[n+24].blue = n&4 ? 0xff : 0; 273 | } 274 | 275 | /* DCLUT */ 276 | for(n=0; n<4; n++) { 277 | colormap[32+n].red = colormap[n].red; 278 | colormap[32+n].green = colormap[n].green; 279 | colormap[32+n].blue = colormap[n].blue; 280 | dclut[n] = n; 281 | } 282 | 283 | /* fullrow background (BLACK) */ 284 | for(n=0; n<24; n++) { 285 | colormap[32+4+n].red = colormap[0].red; 286 | colormap[32+4+n].green = colormap[0].green; 287 | colormap[32+4+n].blue = colormap[0].blue; 288 | fullrow_bg[n] = 0; 289 | } 290 | } 291 | 292 | 293 | /* 294 | * define new RGB values for color 'index' in colormap 295 | */ 296 | void define_color(unsigned int index, unsigned int r, unsigned int g, unsigned int b) 297 | { 298 | int i; 299 | 300 | colormap[index].red = r << 4; 301 | colormap[index].green = g << 4; 302 | colormap[index].blue = b << 4; 303 | 304 | /* if DCLUT contains this color, change DCLUT color too */ 305 | for(i=0; i<4; i++) 306 | if(dclut[i]==index) define_DCLUT(i, index); 307 | 308 | /* if fullrow_bg contains this color, change fullrow color too */ 309 | for(i=0; i<24; i++) 310 | if(fullrow_bg[i]==index) define_fullrow_bg(i, index); 311 | } 312 | 313 | 314 | /* 315 | * set RGB values for DCLUT color 'entry' to those of color 'index'. 316 | */ 317 | void define_DCLUT(int entry, int index) 318 | { 319 | dclut[entry] = index; 320 | colormap[32+entry].red = colormap[index].red; 321 | colormap[32+entry].green = colormap[index].green; 322 | colormap[32+entry].blue = colormap[index].blue; 323 | } 324 | 325 | 326 | /* 327 | * set RGB values for fullrow_bg of 'row' to those of color 'index'. 328 | */ 329 | void define_fullrow_bg(int row, int index) 330 | { 331 | fullrow_bg[row] = index; 332 | colormap[32+4+row].red = colormap[index].red; 333 | colormap[32+4+row].green = colormap[index].green; 334 | colormap[32+4+row].blue = colormap[index].blue; 335 | } 336 | 337 | void init_xfont() 338 | { 339 | memimage = malloc(480*240*3); 340 | init_fonts(); 341 | default_colors(); 342 | } 343 | -------------------------------------------------------------------------------- /macOS/btx_decoder.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 50; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | CC05D90B21F8F4E60028FE70 /* layer2.c in Sources */ = {isa = PBXBuildFile; fileRef = CC05D90921F8F4E50028FE70 /* layer2.c */; }; 11 | CCB5A6AC21F7B09B00016DFA /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = CCB5A6AB21F7B09B00016DFA /* AppDelegate.m */; }; 12 | CCB5A6AE21F7B09C00016DFA /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = CCB5A6AD21F7B09C00016DFA /* Assets.xcassets */; }; 13 | CCB5A6B121F7B09C00016DFA /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = CCB5A6AF21F7B09C00016DFA /* MainMenu.xib */; }; 14 | CCB5A6B421F7B09C00016DFA /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = CCB5A6B321F7B09C00016DFA /* main.m */; }; 15 | CCB5A6C321F7B0CB00016DFA /* rawfont.c in Sources */ = {isa = PBXBuildFile; fileRef = CCB5A6BC21F7B0CB00016DFA /* rawfont.c */; }; 16 | CCB5A6C421F7B0CB00016DFA /* layer6.c in Sources */ = {isa = PBXBuildFile; fileRef = CCB5A6BD21F7B0CB00016DFA /* layer6.c */; }; 17 | CCB5A6C521F7B0CB00016DFA /* xfont.c in Sources */ = {isa = PBXBuildFile; fileRef = CCB5A6BE21F7B0CB00016DFA /* xfont.c */; }; 18 | /* End PBXBuildFile section */ 19 | 20 | /* Begin PBXFileReference section */ 21 | CC05D90921F8F4E50028FE70 /* layer2.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = layer2.c; path = ../layer2.c; sourceTree = ""; }; 22 | CC05D90A21F8F4E50028FE70 /* layer2.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = layer2.h; path = ../layer2.h; sourceTree = ""; }; 23 | CC05D90C21F8F8760028FE70 /* rawfont.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = rawfont.h; path = ../rawfont.h; sourceTree = ""; }; 24 | CCB5A6A721F7B09B00016DFA /* btx_decoder.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = btx_decoder.app; sourceTree = BUILT_PRODUCTS_DIR; }; 25 | CCB5A6AA21F7B09B00016DFA /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; 26 | CCB5A6AB21F7B09B00016DFA /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; 27 | CCB5A6AD21F7B09C00016DFA /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 28 | CCB5A6B021F7B09C00016DFA /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MainMenu.xib; sourceTree = ""; }; 29 | CCB5A6B221F7B09C00016DFA /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 30 | CCB5A6B321F7B09C00016DFA /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 31 | CCB5A6B521F7B09C00016DFA /* btx_decoder.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = btx_decoder.entitlements; sourceTree = ""; }; 32 | CCB5A6BC21F7B0CB00016DFA /* rawfont.c */ = {isa = PBXFileReference; fileEncoding = 4; indentWidth = 3; lastKnownFileType = sourcecode.c.c; name = rawfont.c; path = ../rawfont.c; sourceTree = ""; tabWidth = 8; }; 33 | CCB5A6BD21F7B0CB00016DFA /* layer6.c */ = {isa = PBXFileReference; fileEncoding = 4; indentWidth = 3; lastKnownFileType = sourcecode.c.c; name = layer6.c; path = ../layer6.c; sourceTree = ""; tabWidth = 8; }; 34 | CCB5A6BE21F7B0CB00016DFA /* xfont.c */ = {isa = PBXFileReference; fileEncoding = 4; indentWidth = 3; lastKnownFileType = sourcecode.c.c; name = xfont.c; path = ../xfont.c; sourceTree = ""; tabWidth = 8; }; 35 | CCB5A6BF21F7B0CB00016DFA /* font.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = font.h; path = ../font.h; sourceTree = ""; }; 36 | CCB5A6C021F7B0CB00016DFA /* attrib.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = attrib.h; path = ../attrib.h; sourceTree = ""; }; 37 | CCB5A6C221F7B0CB00016DFA /* control.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = control.h; path = ../control.h; sourceTree = ""; }; 38 | CCB5A6C621F7BB2E00016DFA /* layer6.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = layer6.h; path = ../layer6.h; sourceTree = ""; }; 39 | CCB5A6C721F7BB4B00016DFA /* xfont.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = xfont.h; path = ../xfont.h; sourceTree = ""; }; 40 | /* End PBXFileReference section */ 41 | 42 | /* Begin PBXFrameworksBuildPhase section */ 43 | CCB5A6A421F7B09B00016DFA /* Frameworks */ = { 44 | isa = PBXFrameworksBuildPhase; 45 | buildActionMask = 2147483647; 46 | files = ( 47 | ); 48 | runOnlyForDeploymentPostprocessing = 0; 49 | }; 50 | /* End PBXFrameworksBuildPhase section */ 51 | 52 | /* Begin PBXGroup section */ 53 | CCB5A69E21F7B09B00016DFA = { 54 | isa = PBXGroup; 55 | children = ( 56 | CCB5A6BB21F7B0C000016DFA /* shared */, 57 | CCB5A6A921F7B09B00016DFA /* btx_decoder */, 58 | CCB5A6A821F7B09B00016DFA /* Products */, 59 | ); 60 | sourceTree = ""; 61 | }; 62 | CCB5A6A821F7B09B00016DFA /* Products */ = { 63 | isa = PBXGroup; 64 | children = ( 65 | CCB5A6A721F7B09B00016DFA /* btx_decoder.app */, 66 | ); 67 | name = Products; 68 | sourceTree = ""; 69 | }; 70 | CCB5A6A921F7B09B00016DFA /* btx_decoder */ = { 71 | isa = PBXGroup; 72 | children = ( 73 | CCB5A6AA21F7B09B00016DFA /* AppDelegate.h */, 74 | CCB5A6AB21F7B09B00016DFA /* AppDelegate.m */, 75 | CCB5A6AD21F7B09C00016DFA /* Assets.xcassets */, 76 | CCB5A6AF21F7B09C00016DFA /* MainMenu.xib */, 77 | CCB5A6B221F7B09C00016DFA /* Info.plist */, 78 | CCB5A6B321F7B09C00016DFA /* main.m */, 79 | CCB5A6B521F7B09C00016DFA /* btx_decoder.entitlements */, 80 | ); 81 | path = btx_decoder; 82 | sourceTree = ""; 83 | }; 84 | CCB5A6BB21F7B0C000016DFA /* shared */ = { 85 | isa = PBXGroup; 86 | children = ( 87 | CCB5A6C021F7B0CB00016DFA /* attrib.h */, 88 | CCB5A6C221F7B0CB00016DFA /* control.h */, 89 | CCB5A6BF21F7B0CB00016DFA /* font.h */, 90 | CC05D90A21F8F4E50028FE70 /* layer2.h */, 91 | CC05D90921F8F4E50028FE70 /* layer2.c */, 92 | CCB5A6C621F7BB2E00016DFA /* layer6.h */, 93 | CCB5A6BD21F7B0CB00016DFA /* layer6.c */, 94 | CC05D90C21F8F8760028FE70 /* rawfont.h */, 95 | CCB5A6BC21F7B0CB00016DFA /* rawfont.c */, 96 | CCB5A6C721F7BB4B00016DFA /* xfont.h */, 97 | CCB5A6BE21F7B0CB00016DFA /* xfont.c */, 98 | ); 99 | name = shared; 100 | sourceTree = ""; 101 | }; 102 | /* End PBXGroup section */ 103 | 104 | /* Begin PBXNativeTarget section */ 105 | CCB5A6A621F7B09B00016DFA /* btx_decoder */ = { 106 | isa = PBXNativeTarget; 107 | buildConfigurationList = CCB5A6B821F7B09C00016DFA /* Build configuration list for PBXNativeTarget "btx_decoder" */; 108 | buildPhases = ( 109 | CCB5A6A321F7B09B00016DFA /* Sources */, 110 | CCB5A6A421F7B09B00016DFA /* Frameworks */, 111 | CCB5A6A521F7B09B00016DFA /* Resources */, 112 | ); 113 | buildRules = ( 114 | ); 115 | dependencies = ( 116 | ); 117 | name = btx_decoder; 118 | productName = btx_decoder; 119 | productReference = CCB5A6A721F7B09B00016DFA /* btx_decoder.app */; 120 | productType = "com.apple.product-type.application"; 121 | }; 122 | /* End PBXNativeTarget section */ 123 | 124 | /* Begin PBXProject section */ 125 | CCB5A69F21F7B09B00016DFA /* Project object */ = { 126 | isa = PBXProject; 127 | attributes = { 128 | LastUpgradeCheck = 1010; 129 | ORGANIZATIONNAME = "Michael Steil"; 130 | TargetAttributes = { 131 | CCB5A6A621F7B09B00016DFA = { 132 | CreatedOnToolsVersion = 10.1; 133 | }; 134 | }; 135 | }; 136 | buildConfigurationList = CCB5A6A221F7B09B00016DFA /* Build configuration list for PBXProject "btx_decoder" */; 137 | compatibilityVersion = "Xcode 9.3"; 138 | developmentRegion = en; 139 | hasScannedForEncodings = 0; 140 | knownRegions = ( 141 | en, 142 | Base, 143 | ); 144 | mainGroup = CCB5A69E21F7B09B00016DFA; 145 | productRefGroup = CCB5A6A821F7B09B00016DFA /* Products */; 146 | projectDirPath = ""; 147 | projectRoot = ""; 148 | targets = ( 149 | CCB5A6A621F7B09B00016DFA /* btx_decoder */, 150 | ); 151 | }; 152 | /* End PBXProject section */ 153 | 154 | /* Begin PBXResourcesBuildPhase section */ 155 | CCB5A6A521F7B09B00016DFA /* Resources */ = { 156 | isa = PBXResourcesBuildPhase; 157 | buildActionMask = 2147483647; 158 | files = ( 159 | CCB5A6AE21F7B09C00016DFA /* Assets.xcassets in Resources */, 160 | CCB5A6B121F7B09C00016DFA /* MainMenu.xib in Resources */, 161 | ); 162 | runOnlyForDeploymentPostprocessing = 0; 163 | }; 164 | /* End PBXResourcesBuildPhase section */ 165 | 166 | /* Begin PBXSourcesBuildPhase section */ 167 | CCB5A6A321F7B09B00016DFA /* Sources */ = { 168 | isa = PBXSourcesBuildPhase; 169 | buildActionMask = 2147483647; 170 | files = ( 171 | CC05D90B21F8F4E60028FE70 /* layer2.c in Sources */, 172 | CCB5A6C521F7B0CB00016DFA /* xfont.c in Sources */, 173 | CCB5A6C421F7B0CB00016DFA /* layer6.c in Sources */, 174 | CCB5A6B421F7B09C00016DFA /* main.m in Sources */, 175 | CCB5A6C321F7B0CB00016DFA /* rawfont.c in Sources */, 176 | CCB5A6AC21F7B09B00016DFA /* AppDelegate.m in Sources */, 177 | ); 178 | runOnlyForDeploymentPostprocessing = 0; 179 | }; 180 | /* End PBXSourcesBuildPhase section */ 181 | 182 | /* Begin PBXVariantGroup section */ 183 | CCB5A6AF21F7B09C00016DFA /* MainMenu.xib */ = { 184 | isa = PBXVariantGroup; 185 | children = ( 186 | CCB5A6B021F7B09C00016DFA /* Base */, 187 | ); 188 | name = MainMenu.xib; 189 | sourceTree = ""; 190 | }; 191 | /* End PBXVariantGroup section */ 192 | 193 | /* Begin XCBuildConfiguration section */ 194 | CCB5A6B621F7B09C00016DFA /* Debug */ = { 195 | isa = XCBuildConfiguration; 196 | buildSettings = { 197 | ALWAYS_SEARCH_USER_PATHS = NO; 198 | CLANG_ANALYZER_NONNULL = YES; 199 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 200 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 201 | CLANG_CXX_LIBRARY = "libc++"; 202 | CLANG_ENABLE_MODULES = YES; 203 | CLANG_ENABLE_OBJC_ARC = YES; 204 | CLANG_ENABLE_OBJC_WEAK = YES; 205 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 206 | CLANG_WARN_BOOL_CONVERSION = YES; 207 | CLANG_WARN_COMMA = YES; 208 | CLANG_WARN_CONSTANT_CONVERSION = YES; 209 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 210 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 211 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 212 | CLANG_WARN_EMPTY_BODY = YES; 213 | CLANG_WARN_ENUM_CONVERSION = YES; 214 | CLANG_WARN_INFINITE_RECURSION = YES; 215 | CLANG_WARN_INT_CONVERSION = YES; 216 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 217 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 218 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 219 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 220 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 221 | CLANG_WARN_STRICT_PROTOTYPES = YES; 222 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 223 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 224 | CLANG_WARN_UNREACHABLE_CODE = YES; 225 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 226 | CODE_SIGN_IDENTITY = "-"; 227 | COPY_PHASE_STRIP = NO; 228 | DEBUG_INFORMATION_FORMAT = dwarf; 229 | ENABLE_STRICT_OBJC_MSGSEND = YES; 230 | ENABLE_TESTABILITY = YES; 231 | GCC_C_LANGUAGE_STANDARD = gnu11; 232 | GCC_DYNAMIC_NO_PIC = NO; 233 | GCC_NO_COMMON_BLOCKS = YES; 234 | GCC_OPTIMIZATION_LEVEL = 0; 235 | GCC_PREPROCESSOR_DEFINITIONS = ( 236 | "DEBUG=1", 237 | "$(inherited)", 238 | ); 239 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 240 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 241 | GCC_WARN_UNDECLARED_SELECTOR = YES; 242 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 243 | GCC_WARN_UNUSED_FUNCTION = YES; 244 | GCC_WARN_UNUSED_VARIABLE = YES; 245 | MACOSX_DEPLOYMENT_TARGET = 10.13; 246 | MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; 247 | MTL_FAST_MATH = YES; 248 | ONLY_ACTIVE_ARCH = YES; 249 | SDKROOT = macosx; 250 | }; 251 | name = Debug; 252 | }; 253 | CCB5A6B721F7B09C00016DFA /* Release */ = { 254 | isa = XCBuildConfiguration; 255 | buildSettings = { 256 | ALWAYS_SEARCH_USER_PATHS = NO; 257 | CLANG_ANALYZER_NONNULL = YES; 258 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 259 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 260 | CLANG_CXX_LIBRARY = "libc++"; 261 | CLANG_ENABLE_MODULES = YES; 262 | CLANG_ENABLE_OBJC_ARC = YES; 263 | CLANG_ENABLE_OBJC_WEAK = YES; 264 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 265 | CLANG_WARN_BOOL_CONVERSION = YES; 266 | CLANG_WARN_COMMA = YES; 267 | CLANG_WARN_CONSTANT_CONVERSION = YES; 268 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 269 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 270 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 271 | CLANG_WARN_EMPTY_BODY = YES; 272 | CLANG_WARN_ENUM_CONVERSION = YES; 273 | CLANG_WARN_INFINITE_RECURSION = YES; 274 | CLANG_WARN_INT_CONVERSION = YES; 275 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 276 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 277 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 278 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 279 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 280 | CLANG_WARN_STRICT_PROTOTYPES = YES; 281 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 282 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 283 | CLANG_WARN_UNREACHABLE_CODE = YES; 284 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 285 | CODE_SIGN_IDENTITY = "-"; 286 | COPY_PHASE_STRIP = NO; 287 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 288 | ENABLE_NS_ASSERTIONS = NO; 289 | ENABLE_STRICT_OBJC_MSGSEND = YES; 290 | GCC_C_LANGUAGE_STANDARD = gnu11; 291 | GCC_NO_COMMON_BLOCKS = YES; 292 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 293 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 294 | GCC_WARN_UNDECLARED_SELECTOR = YES; 295 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 296 | GCC_WARN_UNUSED_FUNCTION = YES; 297 | GCC_WARN_UNUSED_VARIABLE = YES; 298 | MACOSX_DEPLOYMENT_TARGET = 10.13; 299 | MTL_ENABLE_DEBUG_INFO = NO; 300 | MTL_FAST_MATH = YES; 301 | SDKROOT = macosx; 302 | }; 303 | name = Release; 304 | }; 305 | CCB5A6B921F7B09C00016DFA /* Debug */ = { 306 | isa = XCBuildConfiguration; 307 | buildSettings = { 308 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 309 | CODE_SIGN_ENTITLEMENTS = btx_decoder/btx_decoder.entitlements; 310 | CODE_SIGN_STYLE = Automatic; 311 | COMBINE_HIDPI_IMAGES = YES; 312 | INFOPLIST_FILE = btx_decoder/Info.plist; 313 | LD_RUNPATH_SEARCH_PATHS = ( 314 | "$(inherited)", 315 | "@executable_path/../Frameworks", 316 | ); 317 | PRODUCT_BUNDLE_IDENTIFIER = "com.pagetable.btx-decoder"; 318 | PRODUCT_NAME = "$(TARGET_NAME)"; 319 | }; 320 | name = Debug; 321 | }; 322 | CCB5A6BA21F7B09C00016DFA /* Release */ = { 323 | isa = XCBuildConfiguration; 324 | buildSettings = { 325 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 326 | CODE_SIGN_ENTITLEMENTS = btx_decoder/btx_decoder.entitlements; 327 | CODE_SIGN_STYLE = Automatic; 328 | COMBINE_HIDPI_IMAGES = YES; 329 | INFOPLIST_FILE = btx_decoder/Info.plist; 330 | LD_RUNPATH_SEARCH_PATHS = ( 331 | "$(inherited)", 332 | "@executable_path/../Frameworks", 333 | ); 334 | PRODUCT_BUNDLE_IDENTIFIER = "com.pagetable.btx-decoder"; 335 | PRODUCT_NAME = "$(TARGET_NAME)"; 336 | }; 337 | name = Release; 338 | }; 339 | /* End XCBuildConfiguration section */ 340 | 341 | /* Begin XCConfigurationList section */ 342 | CCB5A6A221F7B09B00016DFA /* Build configuration list for PBXProject "btx_decoder" */ = { 343 | isa = XCConfigurationList; 344 | buildConfigurations = ( 345 | CCB5A6B621F7B09C00016DFA /* Debug */, 346 | CCB5A6B721F7B09C00016DFA /* Release */, 347 | ); 348 | defaultConfigurationIsVisible = 0; 349 | defaultConfigurationName = Release; 350 | }; 351 | CCB5A6B821F7B09C00016DFA /* Build configuration list for PBXNativeTarget "btx_decoder" */ = { 352 | isa = XCConfigurationList; 353 | buildConfigurations = ( 354 | CCB5A6B921F7B09C00016DFA /* Debug */, 355 | CCB5A6BA21F7B09C00016DFA /* Release */, 356 | ); 357 | defaultConfigurationIsVisible = 0; 358 | defaultConfigurationName = Release; 359 | }; 360 | /* End XCConfigurationList section */ 361 | }; 362 | rootObject = CCB5A69F21F7B09B00016DFA /* Project object */; 363 | } 364 | -------------------------------------------------------------------------------- /iOS/btx_decoder.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 50; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | CC5DD64C21FB48730038CEAC /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = CC5DD64B21FB48730038CEAC /* AppDelegate.m */; }; 11 | CC5DD64F21FB48730038CEAC /* ViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = CC5DD64E21FB48730038CEAC /* ViewController.m */; }; 12 | CC5DD65221FB48730038CEAC /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = CC5DD65021FB48730038CEAC /* Main.storyboard */; }; 13 | CC5DD65421FB48740038CEAC /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = CC5DD65321FB48740038CEAC /* Assets.xcassets */; }; 14 | CC5DD65721FB48740038CEAC /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = CC5DD65521FB48740038CEAC /* LaunchScreen.storyboard */; }; 15 | CC5DD65A21FB48740038CEAC /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = CC5DD65921FB48740038CEAC /* main.m */; }; 16 | CC5DD67D21FB49520038CEAC /* rawfont.c in Sources */ = {isa = PBXBuildFile; fileRef = CC5DD67521FB49520038CEAC /* rawfont.c */; }; 17 | CC5DD67E21FB49520038CEAC /* layer2.c in Sources */ = {isa = PBXBuildFile; fileRef = CC5DD67721FB49520038CEAC /* layer2.c */; }; 18 | CC5DD67F21FB49520038CEAC /* xfont.c in Sources */ = {isa = PBXBuildFile; fileRef = CC5DD67821FB49520038CEAC /* xfont.c */; }; 19 | CC5DD68021FB49520038CEAC /* layer6.c in Sources */ = {isa = PBXBuildFile; fileRef = CC5DD67B21FB49520038CEAC /* layer6.c */; }; 20 | /* End PBXBuildFile section */ 21 | 22 | /* Begin PBXFileReference section */ 23 | CC5DD64721FB48730038CEAC /* btx_decoder.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = btx_decoder.app; sourceTree = BUILT_PRODUCTS_DIR; }; 24 | CC5DD64A21FB48730038CEAC /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; 25 | CC5DD64B21FB48730038CEAC /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; 26 | CC5DD64D21FB48730038CEAC /* ViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ViewController.h; sourceTree = ""; }; 27 | CC5DD64E21FB48730038CEAC /* ViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ViewController.m; sourceTree = ""; }; 28 | CC5DD65121FB48730038CEAC /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 29 | CC5DD65321FB48740038CEAC /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 30 | CC5DD65621FB48740038CEAC /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 31 | CC5DD65821FB48740038CEAC /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 32 | CC5DD65921FB48740038CEAC /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 33 | CC5DD67121FB49520038CEAC /* rawfont.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = rawfont.h; path = ../../rawfont.h; sourceTree = ""; }; 34 | CC5DD67221FB49520038CEAC /* xfont.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = xfont.h; path = ../../xfont.h; sourceTree = ""; }; 35 | CC5DD67321FB49520038CEAC /* attrib.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = attrib.h; path = ../../attrib.h; sourceTree = ""; }; 36 | CC5DD67421FB49520038CEAC /* layer6.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = layer6.h; path = ../../layer6.h; sourceTree = ""; }; 37 | CC5DD67521FB49520038CEAC /* rawfont.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = rawfont.c; path = ../../rawfont.c; sourceTree = ""; }; 38 | CC5DD67621FB49520038CEAC /* control.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = control.h; path = ../../control.h; sourceTree = ""; }; 39 | CC5DD67721FB49520038CEAC /* layer2.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = layer2.c; path = ../../layer2.c; sourceTree = ""; }; 40 | CC5DD67821FB49520038CEAC /* xfont.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = xfont.c; path = ../../xfont.c; sourceTree = ""; }; 41 | CC5DD67921FB49520038CEAC /* layer2.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = layer2.h; path = ../../layer2.h; sourceTree = ""; }; 42 | CC5DD67A21FB49520038CEAC /* font.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = font.h; path = ../../font.h; sourceTree = ""; }; 43 | CC5DD67B21FB49520038CEAC /* layer6.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = layer6.c; path = ../../layer6.c; sourceTree = ""; }; 44 | /* End PBXFileReference section */ 45 | 46 | /* Begin PBXFrameworksBuildPhase section */ 47 | CC5DD64421FB48730038CEAC /* Frameworks */ = { 48 | isa = PBXFrameworksBuildPhase; 49 | buildActionMask = 2147483647; 50 | files = ( 51 | ); 52 | runOnlyForDeploymentPostprocessing = 0; 53 | }; 54 | /* End PBXFrameworksBuildPhase section */ 55 | 56 | /* Begin PBXGroup section */ 57 | CC5DD63E21FB48730038CEAC = { 58 | isa = PBXGroup; 59 | children = ( 60 | CC5DD66F21FB48B10038CEAC /* shared */, 61 | CC5DD64921FB48730038CEAC /* btx_decoder */, 62 | CC5DD64821FB48730038CEAC /* Products */, 63 | ); 64 | sourceTree = ""; 65 | }; 66 | CC5DD64821FB48730038CEAC /* Products */ = { 67 | isa = PBXGroup; 68 | children = ( 69 | CC5DD64721FB48730038CEAC /* btx_decoder.app */, 70 | ); 71 | name = Products; 72 | sourceTree = ""; 73 | }; 74 | CC5DD64921FB48730038CEAC /* btx_decoder */ = { 75 | isa = PBXGroup; 76 | children = ( 77 | CC5DD64A21FB48730038CEAC /* AppDelegate.h */, 78 | CC5DD64B21FB48730038CEAC /* AppDelegate.m */, 79 | CC5DD64D21FB48730038CEAC /* ViewController.h */, 80 | CC5DD64E21FB48730038CEAC /* ViewController.m */, 81 | CC5DD65021FB48730038CEAC /* Main.storyboard */, 82 | CC5DD65321FB48740038CEAC /* Assets.xcassets */, 83 | CC5DD65521FB48740038CEAC /* LaunchScreen.storyboard */, 84 | CC5DD65821FB48740038CEAC /* Info.plist */, 85 | CC5DD65921FB48740038CEAC /* main.m */, 86 | ); 87 | path = btx_decoder; 88 | sourceTree = ""; 89 | }; 90 | CC5DD66F21FB48B10038CEAC /* shared */ = { 91 | isa = PBXGroup; 92 | children = ( 93 | CC5DD67321FB49520038CEAC /* attrib.h */, 94 | CC5DD67621FB49520038CEAC /* control.h */, 95 | CC5DD67A21FB49520038CEAC /* font.h */, 96 | CC5DD67721FB49520038CEAC /* layer2.c */, 97 | CC5DD67921FB49520038CEAC /* layer2.h */, 98 | CC5DD67B21FB49520038CEAC /* layer6.c */, 99 | CC5DD67421FB49520038CEAC /* layer6.h */, 100 | CC5DD67521FB49520038CEAC /* rawfont.c */, 101 | CC5DD67121FB49520038CEAC /* rawfont.h */, 102 | CC5DD67821FB49520038CEAC /* xfont.c */, 103 | CC5DD67221FB49520038CEAC /* xfont.h */, 104 | ); 105 | name = shared; 106 | path = btx_decoder; 107 | sourceTree = ""; 108 | }; 109 | /* End PBXGroup section */ 110 | 111 | /* Begin PBXNativeTarget section */ 112 | CC5DD64621FB48730038CEAC /* btx_decoder */ = { 113 | isa = PBXNativeTarget; 114 | buildConfigurationList = CC5DD65D21FB48740038CEAC /* Build configuration list for PBXNativeTarget "btx_decoder" */; 115 | buildPhases = ( 116 | CC5DD64321FB48730038CEAC /* Sources */, 117 | CC5DD64421FB48730038CEAC /* Frameworks */, 118 | CC5DD64521FB48730038CEAC /* Resources */, 119 | ); 120 | buildRules = ( 121 | ); 122 | dependencies = ( 123 | ); 124 | name = btx_decoder; 125 | productName = btx_decoder; 126 | productReference = CC5DD64721FB48730038CEAC /* btx_decoder.app */; 127 | productType = "com.apple.product-type.application"; 128 | }; 129 | /* End PBXNativeTarget section */ 130 | 131 | /* Begin PBXProject section */ 132 | CC5DD63F21FB48730038CEAC /* Project object */ = { 133 | isa = PBXProject; 134 | attributes = { 135 | LastUpgradeCheck = 1010; 136 | ORGANIZATIONNAME = "Michael Steil"; 137 | TargetAttributes = { 138 | CC5DD64621FB48730038CEAC = { 139 | CreatedOnToolsVersion = 10.1; 140 | }; 141 | }; 142 | }; 143 | buildConfigurationList = CC5DD64221FB48730038CEAC /* Build configuration list for PBXProject "btx_decoder" */; 144 | compatibilityVersion = "Xcode 9.3"; 145 | developmentRegion = en; 146 | hasScannedForEncodings = 0; 147 | knownRegions = ( 148 | en, 149 | Base, 150 | ); 151 | mainGroup = CC5DD63E21FB48730038CEAC; 152 | productRefGroup = CC5DD64821FB48730038CEAC /* Products */; 153 | projectDirPath = ""; 154 | projectRoot = ""; 155 | targets = ( 156 | CC5DD64621FB48730038CEAC /* btx_decoder */, 157 | ); 158 | }; 159 | /* End PBXProject section */ 160 | 161 | /* Begin PBXResourcesBuildPhase section */ 162 | CC5DD64521FB48730038CEAC /* Resources */ = { 163 | isa = PBXResourcesBuildPhase; 164 | buildActionMask = 2147483647; 165 | files = ( 166 | CC5DD65721FB48740038CEAC /* LaunchScreen.storyboard in Resources */, 167 | CC5DD65421FB48740038CEAC /* Assets.xcassets in Resources */, 168 | CC5DD65221FB48730038CEAC /* Main.storyboard in Resources */, 169 | ); 170 | runOnlyForDeploymentPostprocessing = 0; 171 | }; 172 | /* End PBXResourcesBuildPhase section */ 173 | 174 | /* Begin PBXSourcesBuildPhase section */ 175 | CC5DD64321FB48730038CEAC /* Sources */ = { 176 | isa = PBXSourcesBuildPhase; 177 | buildActionMask = 2147483647; 178 | files = ( 179 | CC5DD64F21FB48730038CEAC /* ViewController.m in Sources */, 180 | CC5DD65A21FB48740038CEAC /* main.m in Sources */, 181 | CC5DD64C21FB48730038CEAC /* AppDelegate.m in Sources */, 182 | CC5DD67F21FB49520038CEAC /* xfont.c in Sources */, 183 | CC5DD68021FB49520038CEAC /* layer6.c in Sources */, 184 | CC5DD67D21FB49520038CEAC /* rawfont.c in Sources */, 185 | CC5DD67E21FB49520038CEAC /* layer2.c in Sources */, 186 | ); 187 | runOnlyForDeploymentPostprocessing = 0; 188 | }; 189 | /* End PBXSourcesBuildPhase section */ 190 | 191 | /* Begin PBXVariantGroup section */ 192 | CC5DD65021FB48730038CEAC /* Main.storyboard */ = { 193 | isa = PBXVariantGroup; 194 | children = ( 195 | CC5DD65121FB48730038CEAC /* Base */, 196 | ); 197 | name = Main.storyboard; 198 | sourceTree = ""; 199 | }; 200 | CC5DD65521FB48740038CEAC /* LaunchScreen.storyboard */ = { 201 | isa = PBXVariantGroup; 202 | children = ( 203 | CC5DD65621FB48740038CEAC /* Base */, 204 | ); 205 | name = LaunchScreen.storyboard; 206 | sourceTree = ""; 207 | }; 208 | /* End PBXVariantGroup section */ 209 | 210 | /* Begin XCBuildConfiguration section */ 211 | CC5DD65B21FB48740038CEAC /* Debug */ = { 212 | isa = XCBuildConfiguration; 213 | buildSettings = { 214 | ALWAYS_SEARCH_USER_PATHS = NO; 215 | CLANG_ANALYZER_NONNULL = YES; 216 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 217 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 218 | CLANG_CXX_LIBRARY = "libc++"; 219 | CLANG_ENABLE_MODULES = YES; 220 | CLANG_ENABLE_OBJC_ARC = YES; 221 | CLANG_ENABLE_OBJC_WEAK = YES; 222 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 223 | CLANG_WARN_BOOL_CONVERSION = YES; 224 | CLANG_WARN_COMMA = YES; 225 | CLANG_WARN_CONSTANT_CONVERSION = YES; 226 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 227 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 228 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 229 | CLANG_WARN_EMPTY_BODY = YES; 230 | CLANG_WARN_ENUM_CONVERSION = YES; 231 | CLANG_WARN_INFINITE_RECURSION = YES; 232 | CLANG_WARN_INT_CONVERSION = YES; 233 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 234 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 235 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 236 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 237 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 238 | CLANG_WARN_STRICT_PROTOTYPES = YES; 239 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 240 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 241 | CLANG_WARN_UNREACHABLE_CODE = YES; 242 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 243 | CODE_SIGN_IDENTITY = "iPhone Developer"; 244 | COPY_PHASE_STRIP = NO; 245 | DEBUG_INFORMATION_FORMAT = dwarf; 246 | ENABLE_STRICT_OBJC_MSGSEND = YES; 247 | ENABLE_TESTABILITY = YES; 248 | GCC_C_LANGUAGE_STANDARD = gnu11; 249 | GCC_DYNAMIC_NO_PIC = NO; 250 | GCC_NO_COMMON_BLOCKS = YES; 251 | GCC_OPTIMIZATION_LEVEL = 0; 252 | GCC_PREPROCESSOR_DEFINITIONS = ( 253 | "DEBUG=1", 254 | "$(inherited)", 255 | ); 256 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 257 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 258 | GCC_WARN_UNDECLARED_SELECTOR = YES; 259 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 260 | GCC_WARN_UNUSED_FUNCTION = YES; 261 | GCC_WARN_UNUSED_VARIABLE = YES; 262 | IPHONEOS_DEPLOYMENT_TARGET = 12.1; 263 | MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; 264 | MTL_FAST_MATH = YES; 265 | ONLY_ACTIVE_ARCH = YES; 266 | SDKROOT = iphoneos; 267 | }; 268 | name = Debug; 269 | }; 270 | CC5DD65C21FB48740038CEAC /* Release */ = { 271 | isa = XCBuildConfiguration; 272 | buildSettings = { 273 | ALWAYS_SEARCH_USER_PATHS = NO; 274 | CLANG_ANALYZER_NONNULL = YES; 275 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 276 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 277 | CLANG_CXX_LIBRARY = "libc++"; 278 | CLANG_ENABLE_MODULES = YES; 279 | CLANG_ENABLE_OBJC_ARC = YES; 280 | CLANG_ENABLE_OBJC_WEAK = YES; 281 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 282 | CLANG_WARN_BOOL_CONVERSION = YES; 283 | CLANG_WARN_COMMA = YES; 284 | CLANG_WARN_CONSTANT_CONVERSION = YES; 285 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 286 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 287 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 288 | CLANG_WARN_EMPTY_BODY = YES; 289 | CLANG_WARN_ENUM_CONVERSION = YES; 290 | CLANG_WARN_INFINITE_RECURSION = YES; 291 | CLANG_WARN_INT_CONVERSION = YES; 292 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 293 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 294 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 295 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 296 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 297 | CLANG_WARN_STRICT_PROTOTYPES = YES; 298 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 299 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 300 | CLANG_WARN_UNREACHABLE_CODE = YES; 301 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 302 | CODE_SIGN_IDENTITY = "iPhone Developer"; 303 | COPY_PHASE_STRIP = NO; 304 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 305 | ENABLE_NS_ASSERTIONS = NO; 306 | ENABLE_STRICT_OBJC_MSGSEND = YES; 307 | GCC_C_LANGUAGE_STANDARD = gnu11; 308 | GCC_NO_COMMON_BLOCKS = YES; 309 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 310 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 311 | GCC_WARN_UNDECLARED_SELECTOR = YES; 312 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 313 | GCC_WARN_UNUSED_FUNCTION = YES; 314 | GCC_WARN_UNUSED_VARIABLE = YES; 315 | IPHONEOS_DEPLOYMENT_TARGET = 12.1; 316 | MTL_ENABLE_DEBUG_INFO = NO; 317 | MTL_FAST_MATH = YES; 318 | SDKROOT = iphoneos; 319 | VALIDATE_PRODUCT = YES; 320 | }; 321 | name = Release; 322 | }; 323 | CC5DD65E21FB48740038CEAC /* Debug */ = { 324 | isa = XCBuildConfiguration; 325 | buildSettings = { 326 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 327 | CODE_SIGN_STYLE = Automatic; 328 | INFOPLIST_FILE = btx_decoder/Info.plist; 329 | LD_RUNPATH_SEARCH_PATHS = ( 330 | "$(inherited)", 331 | "@executable_path/Frameworks", 332 | ); 333 | PRODUCT_BUNDLE_IDENTIFIER = "com.pagetable.btx-decoder"; 334 | PRODUCT_NAME = "$(TARGET_NAME)"; 335 | TARGETED_DEVICE_FAMILY = "1,2"; 336 | }; 337 | name = Debug; 338 | }; 339 | CC5DD65F21FB48740038CEAC /* Release */ = { 340 | isa = XCBuildConfiguration; 341 | buildSettings = { 342 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 343 | CODE_SIGN_STYLE = Automatic; 344 | INFOPLIST_FILE = btx_decoder/Info.plist; 345 | LD_RUNPATH_SEARCH_PATHS = ( 346 | "$(inherited)", 347 | "@executable_path/Frameworks", 348 | ); 349 | PRODUCT_BUNDLE_IDENTIFIER = "com.pagetable.btx-decoder"; 350 | PRODUCT_NAME = "$(TARGET_NAME)"; 351 | TARGETED_DEVICE_FAMILY = "1,2"; 352 | }; 353 | name = Release; 354 | }; 355 | /* End XCBuildConfiguration section */ 356 | 357 | /* Begin XCConfigurationList section */ 358 | CC5DD64221FB48730038CEAC /* Build configuration list for PBXProject "btx_decoder" */ = { 359 | isa = XCConfigurationList; 360 | buildConfigurations = ( 361 | CC5DD65B21FB48740038CEAC /* Debug */, 362 | CC5DD65C21FB48740038CEAC /* Release */, 363 | ); 364 | defaultConfigurationIsVisible = 0; 365 | defaultConfigurationName = Release; 366 | }; 367 | CC5DD65D21FB48740038CEAC /* Build configuration list for PBXNativeTarget "btx_decoder" */ = { 368 | isa = XCConfigurationList; 369 | buildConfigurations = ( 370 | CC5DD65E21FB48740038CEAC /* Debug */, 371 | CC5DD65F21FB48740038CEAC /* Release */, 372 | ); 373 | defaultConfigurationIsVisible = 0; 374 | defaultConfigurationName = Release; 375 | }; 376 | /* End XCConfigurationList section */ 377 | }; 378 | rootObject = CC5DD63F21FB48730038CEAC /* Project object */; 379 | } 380 | -------------------------------------------------------------------------------- /rawfont.c: -------------------------------------------------------------------------------- 1 | /* 2 | * This font was extracted from the ROM of the 3 | * SIEMENS/Commodore "Universal Btx Decoder" 4 | * cartridge for the Commodore 64 (software V3.3) 5 | * Commodore Artikel Nr. 606491 6 | */ 7 | 8 | unsigned char raw_font[] = { 9 | 10 | /* raw 'primary graphic' set */ 11 | /* 0x20 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13 | /* 0x21 */ 0, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 14 | 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15 | /* 0x22 */ 0, 0, 29, 48, 12, 48, 25, 32, 0, 0, 0, 0, 16 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17 | /* 0x23 */ 0, 0, 12, 48, 12, 48, 63, 60, 12, 48, 63, 60, 18 | 12, 48, 12, 48, 0, 0, 0, 0, 0, 0, 0, 0, 19 | /* 0x24 */ 0, 0, 48, 12, 31, 56, 56, 28, 48, 12, 56, 28, 20 | 31, 56, 48, 12, 0, 0, 0, 0, 0, 0, 0, 0, 21 | /* 0x25 */ 0, 0, 28, 28, 54, 48, 29, 32, 3, 0, 6, 56, 22 | 13, 44, 56, 56, 0, 0, 0, 0, 0, 0, 0, 0, 23 | /* 0x26 */ 0, 0, 15, 0, 25, 32, 25, 32, 31, 38, 48, 60, 24 | 48, 28, 15, 54, 0, 0, 0, 0, 0, 0, 0, 0, 25 | /* 0x27 */ 0, 0, 28, 0, 12, 0, 24, 0, 0, 0, 0, 0, 26 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27 | /* 0x28 */ 0, 0, 0, 12, 0, 48, 3, 0, 3, 0, 3, 0, 28 | 0, 48, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 29 | /* 0x29 */ 0, 0, 12, 0, 3, 0, 0, 48, 0, 48, 0, 48, 30 | 3, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31 | /* 0x2a */ 0, 0, 3, 0, 51, 12, 15, 48, 3, 0, 15, 48, 32 | 51, 12, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33 | /* 0x2b */ 0, 0, 0, 0, 3, 0, 3, 0, 31, 56, 3, 0, 34 | 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35 | /* 0x2c */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36 | 14, 0, 6, 0, 12, 0, 0, 0, 0, 0, 0, 0, 37 | /* 0x2d */ 0, 0, 0, 0, 0, 0, 0, 0, 31, 56, 0, 0, 38 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 39 | /* 0x2e */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40 | 6, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 41 | /* 0x2f */ 0, 0, 0, 24, 0, 48, 1, 32, 3, 0, 6, 0, 42 | 12, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 43 | /* 0x30 */ 0, 0, 15, 48, 24, 24, 24, 24, 24, 24, 24, 24, 44 | 24, 24, 15, 48, 0, 0, 0, 0, 0, 0, 0, 0, 45 | /* 0x31 */ 0, 0, 3, 0, 15, 0, 3, 0, 3, 0, 3, 0, 46 | 3, 0, 15, 48, 0, 0, 0, 0, 0, 0, 0, 0, 47 | /* 0x32 */ 0, 0, 15, 56, 24, 12, 0, 12, 7, 56, 12, 0, 48 | 24, 0, 31, 60, 0, 0, 0, 0, 0, 0, 0, 0, 49 | /* 0x33 */ 0, 0, 15, 56, 24, 12, 0, 12, 1, 56, 0, 12, 50 | 24, 12, 15, 56, 0, 0, 0, 0, 0, 0, 0, 0, 51 | /* 0x34 */ 0, 0, 3, 48, 6, 48, 12, 48, 24, 48, 63, 60, 52 | 0, 48, 1, 56, 0, 0, 0, 0, 0, 0, 0, 0, 53 | /* 0x35 */ 0, 0, 31, 60, 24, 0, 31, 56, 0, 12, 0, 12, 54 | 24, 12, 15, 56, 0, 0, 0, 0, 0, 0, 0, 0, 55 | /* 0x36 */ 0, 0, 15, 56, 24, 12, 24, 0, 31, 56, 24, 12, 56 | 24, 12, 15, 56, 0, 0, 0, 0, 0, 0, 0, 0, 57 | /* 0x37 */ 0, 0, 31, 60, 24, 12, 0, 24, 0, 48, 1, 32, 58 | 3, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 59 | /* 0x38 */ 0, 0, 15, 56, 24, 12, 24, 12, 15, 56, 24, 12, 60 | 24, 12, 15, 56, 0, 0, 0, 0, 0, 0, 0, 0, 61 | /* 0x39 */ 0, 0, 15, 56, 24, 12, 24, 12, 15, 60, 0, 12, 62 | 24, 12, 15, 56, 0, 0, 0, 0, 0, 0, 0, 0, 63 | /* 0x3a */ 0, 0, 0, 0, 0, 0, 14, 0, 14, 0, 0, 0, 64 | 14, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65 | /* 0x3b */ 0, 0, 0, 0, 0, 0, 14, 0, 14, 0, 0, 0, 66 | 14, 0, 6, 0, 12, 0, 0, 0, 0, 0, 0, 0, 67 | /* 0x3c */ 0, 0, 1, 48, 3, 0, 6, 0, 12, 0, 6, 0, 68 | 3, 0, 1, 48, 0, 0, 0, 0, 0, 0, 0, 0, 69 | /* 0x3d */ 0, 0, 0, 0, 0, 0, 31, 56, 0, 0, 31, 56, 70 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 71 | /* 0x3e */ 0, 0, 14, 0, 3, 0, 1, 32, 0, 48, 1, 32, 72 | 3, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 73 | /* 0x3f */ 0, 0, 15, 32, 24, 24, 0, 48, 3, 0, 3, 0, 74 | 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 75 | /* 0x40 */ 0, 0, 31, 56, 48, 12, 51, 60, 54, 12, 51, 60, 76 | 48, 0, 31, 60, 0, 0, 0, 0, 0, 0, 0, 0, 77 | /* 0x41 */ 0, 0, 3, 32, 12, 24, 24, 12, 24, 12, 31, 60, 78 | 24, 12, 24, 12, 0, 0, 0, 0, 0, 0, 0, 0, 79 | /* 0x42 */ 0, 0, 63, 48, 24, 12, 24, 12, 31, 48, 24, 12, 80 | 24, 12, 63, 48, 0, 0, 0, 0, 0, 0, 0, 0, 81 | /* 0x43 */ 0, 0, 15, 60, 24, 12, 24, 0, 24, 0, 24, 0, 82 | 24, 12, 15, 56, 0, 0, 0, 0, 0, 0, 0, 0, 83 | /* 0x44 */ 0, 0, 63, 48, 24, 24, 24, 12, 24, 12, 24, 12, 84 | 24, 24, 63, 48, 0, 0, 0, 0, 0, 0, 0, 0, 85 | /* 0x45 */ 0, 0, 63, 60, 24, 12, 24, 0, 31, 32, 24, 0, 86 | 24, 12, 63, 60, 0, 0, 0, 0, 0, 0, 0, 0, 87 | /* 0x46 */ 0, 0, 63, 60, 24, 12, 24, 0, 31, 32, 24, 0, 88 | 24, 0, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 89 | /* 0x47 */ 0, 0, 15, 60, 24, 12, 24, 0, 24, 62, 24, 12, 90 | 24, 12, 15, 60, 0, 0, 0, 0, 0, 0, 0, 0, 91 | /* 0x48 */ 0, 0, 60, 30, 24, 12, 24, 12, 31, 60, 24, 12, 92 | 24, 12, 60, 30, 0, 0, 0, 0, 0, 0, 0, 0, 93 | /* 0x49 */ 0, 0, 15, 48, 3, 0, 3, 0, 3, 0, 3, 0, 94 | 3, 0, 15, 48, 0, 0, 0, 0, 0, 0, 0, 0, 95 | /* 0x4a */ 0, 0, 7, 60, 0, 24, 0, 24, 0, 24, 0, 24, 96 | 48, 24, 31, 48, 0, 0, 0, 0, 0, 0, 0, 0, 97 | /* 0x4b */ 0, 0, 60, 28, 24, 48, 25, 32, 31, 0, 25, 32, 98 | 24, 48, 60, 28, 0, 0, 0, 0, 0, 0, 0, 0, 99 | /* 0x4c */ 0, 0, 60, 0, 24, 0, 24, 0, 24, 0, 24, 0, 100 | 24, 12, 63, 60, 0, 0, 0, 0, 0, 0, 0, 0, 101 | /* 0x4d */ 0, 0, 56, 14, 28, 28, 30, 60, 27, 44, 25, 12, 102 | 24, 12, 60, 30, 0, 0, 0, 0, 0, 0, 0, 0, 103 | /* 0x4e */ 0, 0, 60, 30, 30, 12, 31, 12, 25, 44, 24, 60, 104 | 24, 28, 60, 12, 0, 0, 0, 0, 0, 0, 0, 0, 105 | /* 0x4f */ 0, 0, 7, 48, 12, 24, 24, 12, 24, 12, 24, 12, 106 | 12, 24, 7, 48, 0, 0, 0, 0, 0, 0, 0, 0, 107 | /* 0x50 */ 0, 0, 63, 48, 24, 12, 24, 12, 31, 48, 24, 0, 108 | 24, 0, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 109 | /* 0x51 */ 0, 0, 7, 48, 12, 24, 24, 12, 24, 12, 24, 12, 110 | 12, 24, 7, 48, 0, 60, 0, 0, 0, 0, 0, 0, 111 | /* 0x52 */ 0, 0, 63, 48, 24, 24, 24, 24, 31, 48, 25, 32, 112 | 24, 48, 60, 28, 0, 0, 0, 0, 0, 0, 0, 0, 113 | /* 0x53 */ 0, 0, 15, 60, 24, 12, 24, 0, 15, 56, 0, 12, 114 | 24, 12, 31, 56, 0, 0, 0, 0, 0, 0, 0, 0, 115 | /* 0x54 */ 0, 0, 63, 60, 51, 12, 3, 0, 3, 0, 3, 0, 116 | 3, 0, 7, 32, 0, 0, 0, 0, 0, 0, 0, 0, 117 | /* 0x55 */ 0, 0, 60, 60, 24, 24, 24, 24, 24, 24, 24, 24, 118 | 24, 24, 15, 48, 0, 0, 0, 0, 0, 0, 0, 0, 119 | /* 0x56 */ 0, 0, 60, 60, 24, 24, 24, 24, 24, 24, 12, 48, 120 | 7, 32, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 121 | /* 0x57 */ 0, 0, 60, 60, 24, 24, 24, 24, 27, 24, 27, 24, 122 | 27, 24, 12, 48, 0, 0, 0, 0, 0, 0, 0, 0, 123 | /* 0x58 */ 0, 0, 56, 28, 24, 24, 12, 48, 3, 0, 12, 48, 124 | 24, 24, 56, 28, 0, 0, 0, 0, 0, 0, 0, 0, 125 | /* 0x59 */ 0, 0, 56, 28, 24, 24, 12, 48, 3, 0, 3, 0, 126 | 3, 0, 7, 32, 0, 0, 0, 0, 0, 0, 0, 0, 127 | /* 0x5a */ 0, 0, 31, 60, 24, 12, 0, 24, 1, 32, 6, 0, 128 | 24, 12, 31, 60, 0, 0, 0, 0, 0, 0, 0, 0, 129 | /* 0x5b */ 15, 48, 12, 0, 12, 0, 12, 0, 12, 0, 12, 0, 130 | 12, 0, 12, 0, 15, 48, 0, 0, 0, 0, 0, 0, 131 | /* 0x5c */ 0, 0, 56, 0, 12, 0, 6, 0, 3, 0, 1, 32, 132 | 0, 48, 0, 28, 0, 0, 0, 0, 0, 0, 0, 0, 133 | /* 0x5d */ 15, 48, 0, 48, 0, 48, 0, 48, 0, 48, 0, 48, 134 | 0, 48, 0, 48, 15, 48, 0, 0, 0, 0, 0, 0, 135 | /* 0x5e */ 7, 0, 13, 32, 24, 48, 0, 0, 0, 0, 0, 0, 136 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 137 | /* 0x5f */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 138 | 0, 0, 0, 0, 0, 0, 63, 60, 0, 0, 0, 0, 139 | /* 0x60 */ 0, 0, 24, 0, 12, 0, 0, 0, 0, 0, 0, 0, 140 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 141 | /* 0x61 */ 0, 0, 0, 0, 0, 0, 7, 48, 0, 12, 15, 60, 142 | 24, 12, 15, 60, 0, 0, 0, 0, 0, 0, 0, 0, 143 | /* 0x62 */ 0, 0, 56, 0, 24, 0, 31, 56, 24, 12, 24, 12, 144 | 24, 12, 63, 56, 0, 0, 0, 0, 0, 0, 0, 0, 145 | /* 0x63 */ 0, 0, 0, 0, 0, 0, 15, 60, 24, 12, 24, 0, 146 | 24, 0, 15, 60, 0, 0, 0, 0, 0, 0, 0, 0, 147 | /* 0x64 */ 0, 0, 0, 28, 0, 12, 15, 60, 24, 12, 24, 12, 148 | 24, 12, 15, 62, 0, 0, 0, 0, 0, 0, 0, 0, 149 | /* 0x65 */ 0, 0, 0, 0, 0, 0, 15, 56, 24, 12, 31, 60, 150 | 24, 0, 15, 56, 0, 0, 0, 0, 0, 0, 0, 0, 151 | /* 0x66 */ 0, 0, 1, 56, 3, 0, 15, 48, 3, 0, 3, 0, 152 | 3, 0, 7, 32, 0, 0, 0, 0, 0, 0, 0, 0, 153 | /* 0x67 */ 0, 0, 0, 0, 0, 0, 15, 60, 24, 24, 24, 24, 154 | 24, 24, 15, 56, 0, 24, 7, 48, 0, 0, 0, 0, 155 | /* 0x68 */ 0, 0, 56, 0, 24, 0, 31, 48, 24, 24, 24, 24, 156 | 24, 24, 60, 60, 0, 0, 0, 0, 0, 0, 0, 0, 157 | /* 0x69 */ 0, 0, 1, 32, 0, 0, 7, 32, 1, 32, 1, 32, 158 | 1, 32, 7, 56, 0, 0, 0, 0, 0, 0, 0, 0, 159 | /* 0x6a */ 0, 0, 0, 48, 0, 0, 0, 0, 7, 48, 0, 48, 160 | 0, 48, 0, 48, 48, 48, 31, 32, 0, 0, 0, 0, 161 | /* 0x6b */ 0, 0, 56, 0, 24, 0, 24, 28, 25, 48, 31, 0, 162 | 25, 48, 56, 28, 0, 0, 0, 0, 0, 0, 0, 0, 163 | /* 0x6c */ 0, 0, 15, 0, 3, 0, 3, 0, 3, 0, 3, 0, 164 | 3, 0, 15, 48, 0, 0, 0, 0, 0, 0, 0, 0, 165 | /* 0x6d */ 0, 0, 0, 0, 0, 0, 60, 48, 51, 12, 51, 12, 166 | 51, 12, 51, 12, 0, 0, 0, 0, 0, 0, 0, 0, 167 | /* 0x6e */ 0, 0, 0, 0, 0, 0, 59, 48, 28, 24, 24, 24, 168 | 24, 24, 60, 60, 0, 0, 0, 0, 0, 0, 0, 0, 169 | /* 0x6f */ 0, 0, 0, 0, 0, 0, 15, 48, 24, 24, 24, 24, 170 | 24, 24, 15, 48, 0, 0, 0, 0, 0, 0, 0, 0, 171 | /* 0x70 */ 0, 0, 0, 0, 0, 0, 63, 48, 24, 24, 24, 24, 172 | 24, 24, 31, 48, 24, 0, 60, 0, 0, 0, 0, 0, 173 | /* 0x71 */ 0, 0, 0, 0, 0, 0, 15, 60, 24, 24, 24, 24, 174 | 24, 24, 15, 56, 0, 24, 0, 60, 0, 0, 0, 0, 175 | /* 0x72 */ 0, 0, 0, 0, 0, 0, 61, 56, 14, 12, 12, 0, 176 | 12, 0, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 177 | /* 0x73 */ 0, 0, 0, 0, 0, 0, 15, 56, 24, 0, 15, 48, 178 | 0, 24, 31, 48, 0, 0, 0, 0, 0, 0, 0, 0, 179 | /* 0x74 */ 0, 0, 3, 0, 3, 0, 31, 56, 3, 0, 3, 0, 180 | 3, 0, 1, 48, 0, 0, 0, 0, 0, 0, 0, 0, 181 | /* 0x75 */ 0, 0, 0, 0, 0, 0, 56, 56, 24, 24, 24, 24, 182 | 24, 56, 15, 28, 0, 0, 0, 0, 0, 0, 0, 0, 183 | /* 0x76 */ 0, 0, 0, 0, 0, 0, 60, 60, 24, 24, 12, 48, 184 | 7, 32, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 185 | /* 0x77 */ 0, 0, 0, 0, 0, 0, 48, 12, 51, 12, 55, 44, 186 | 60, 60, 24, 24, 0, 0, 0, 0, 0, 0, 0, 0, 187 | /* 0x78 */ 0, 0, 0, 0, 0, 0, 56, 56, 13, 32, 7, 0, 188 | 13, 32, 56, 56, 0, 0, 0, 0, 0, 0, 0, 0, 189 | /* 0x79 */ 0, 0, 0, 0, 0, 0, 60, 60, 24, 24, 12, 48, 190 | 7, 32, 3, 0, 6, 0, 28, 0, 0, 0, 0, 0, 191 | /* 0x7a */ 0, 0, 0, 0, 0, 0, 31, 60, 16, 24, 3, 32, 192 | 12, 4, 31, 60, 0, 0, 0, 0, 0, 0, 0, 0, 193 | /* 0x7b */ 1, 56, 3, 0, 3, 0, 3, 0, 6, 0, 3, 0, 194 | 3, 0, 3, 0, 1, 56, 0, 0, 0, 0, 0, 0, 195 | /* 0x7c */ 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 196 | 3, 0, 3, 0, 3, 0, 3, 0, 0, 0, 0, 0, 197 | /* 0x7d */ 15, 0, 1, 32, 1, 32, 1, 32, 0, 48, 1, 32, 198 | 1, 32, 1, 32, 15, 0, 0, 0, 0, 0, 0, 0, 199 | /* 0x7e */ 63, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 200 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 201 | /* 0x7f */ 0, 0, 31, 62, 31, 62, 31, 62, 31, 62, 31, 62, 202 | 31, 62, 31, 62, 31, 62, 0, 0, 0, 0, 0, 0, 203 | 204 | /* raw '2nd supplementary mosaic' set */ 205 | /* 0x20 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 206 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 207 | /* 0x21 */ 63, 0, 63, 0, 63, 0, 0, 0, 0, 0, 0, 0, 208 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 209 | /* 0x22 */ 0, 63, 0, 63, 0, 63, 0, 0, 0, 0, 0, 0, 210 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 211 | /* 0x23 */ 63, 63, 63, 63, 63, 63, 0, 0, 0, 0, 0, 0, 212 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 213 | /* 0x24 */ 0, 0, 0, 0, 0, 0, 63, 0, 63, 0, 63, 0, 214 | 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 215 | /* 0x25 */ 63, 0, 63, 0, 63, 0, 63, 0, 63, 0, 63, 0, 216 | 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 217 | /* 0x26 */ 0, 63, 0, 63, 0, 63, 63, 0, 63, 0, 63, 0, 218 | 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 219 | /* 0x27 */ 63, 63, 63, 63, 63, 63, 63, 0, 63, 0, 63, 0, 220 | 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 221 | /* 0x28 */ 0, 0, 0, 0, 0, 0, 0, 63, 0, 63, 0, 63, 222 | 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 223 | /* 0x29 */ 63, 0, 63, 0, 63, 0, 0, 63, 0, 63, 0, 63, 224 | 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 225 | /* 0x2a */ 0, 63, 0, 63, 0, 63, 0, 63, 0, 63, 0, 63, 226 | 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 227 | /* 0x2b */ 63, 63, 63, 63, 63, 63, 0, 63, 0, 63, 0, 63, 228 | 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 229 | /* 0x2c */ 0, 0, 0, 0, 0, 0, 63, 63, 63, 63, 63, 63, 230 | 63, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 231 | /* 0x2d */ 63, 0, 63, 0, 63, 0, 63, 63, 63, 63, 63, 63, 232 | 63, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 233 | /* 0x2e */ 0, 63, 0, 63, 0, 63, 63, 63, 63, 63, 63, 63, 234 | 63, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 235 | /* 0x2f */ 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 236 | 63, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 237 | /* 0x30 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 238 | 0, 0, 63, 0, 63, 0, 63, 0, 0, 0, 0, 0, 239 | /* 0x31 */ 63, 0, 63, 0, 63, 0, 0, 0, 0, 0, 0, 0, 240 | 0, 0, 63, 0, 63, 0, 63, 0, 0, 0, 0, 0, 241 | /* 0x32 */ 0, 63, 0, 63, 0, 63, 0, 0, 0, 0, 0, 0, 242 | 0, 0, 63, 0, 63, 0, 63, 0, 0, 0, 0, 0, 243 | /* 0x33 */ 63, 63, 63, 63, 63, 63, 0, 0, 0, 0, 0, 0, 244 | 0, 0, 63, 0, 63, 0, 63, 0, 0, 0, 0, 0, 245 | /* 0x34 */ 0, 0, 0, 0, 0, 0, 63, 0, 63, 0, 63, 0, 246 | 63, 0, 63, 0, 63, 0, 63, 0, 0, 0, 0, 0, 247 | /* 0x35 */ 63, 0, 63, 0, 63, 0, 63, 0, 63, 0, 63, 0, 248 | 63, 0, 63, 0, 63, 0, 63, 0, 0, 0, 0, 0, 249 | /* 0x36 */ 0, 63, 0, 63, 0, 63, 63, 0, 63, 0, 63, 0, 250 | 63, 0, 63, 0, 63, 0, 63, 0, 0, 0, 0, 0, 251 | /* 0x37 */ 63, 63, 63, 63, 63, 63, 63, 0, 63, 0, 63, 0, 252 | 63, 0, 63, 0, 63, 0, 63, 0, 0, 0, 0, 0, 253 | /* 0x38 */ 0, 0, 0, 0, 0, 0, 0, 63, 0, 63, 0, 63, 254 | 0, 63, 63, 0, 63, 0, 63, 0, 0, 0, 0, 0, 255 | /* 0x39 */ 63, 0, 63, 0, 63, 0, 0, 63, 0, 63, 0, 63, 256 | 0, 63, 63, 0, 63, 0, 63, 0, 0, 0, 0, 0, 257 | /* 0x3a */ 0, 63, 0, 63, 0, 63, 0, 63, 0, 63, 0, 63, 258 | 0, 63, 63, 0, 63, 0, 63, 0, 0, 0, 0, 0, 259 | /* 0x3b */ 63, 63, 63, 63, 63, 63, 0, 63, 0, 63, 0, 63, 260 | 0, 63, 63, 0, 63, 0, 63, 0, 0, 0, 0, 0, 261 | /* 0x3c */ 0, 0, 0, 0, 0, 0, 63, 63, 63, 63, 63, 63, 262 | 63, 63, 63, 0, 63, 0, 63, 0, 0, 0, 0, 0, 263 | /* 0x3d */ 63, 0, 63, 0, 63, 0, 63, 63, 63, 63, 63, 63, 264 | 63, 63, 63, 0, 63, 0, 63, 0, 0, 0, 0, 0, 265 | /* 0x3e */ 0, 63, 0, 63, 0, 63, 63, 63, 63, 63, 63, 63, 266 | 63, 63, 63, 0, 63, 0, 63, 0, 0, 0, 0, 0, 267 | /* 0x3f */ 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 268 | 63, 63, 63, 0, 63, 0, 63, 0, 0, 0, 0, 0, 269 | /* 0x40 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 270 | 0, 0, 48, 0, 56, 0, 62, 0, 0, 0, 0, 0, 271 | /* 0x41 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 272 | 0, 0, 56, 0, 63, 0, 63, 60, 0, 0, 0, 0, 273 | /* 0x42 */ 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 48, 0, 274 | 56, 0, 60, 0, 62, 0, 63, 0, 0, 0, 0, 0, 275 | /* 0x43 */ 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 60, 0, 276 | 63, 0, 63, 48, 63, 56, 63, 62, 0, 0, 0, 0, 277 | /* 0x44 */ 0, 0, 32, 0, 32, 0, 48, 0, 56, 0, 56, 0, 278 | 60, 0, 60, 0, 62, 0, 63, 0, 0, 0, 0, 0, 279 | /* 0x45 */ 0, 0, 48, 0, 56, 0, 60, 0, 63, 0, 63, 32, 280 | 63, 48, 63, 60, 63, 62, 63, 63, 0, 0, 0, 0, 281 | /* 0x46 */ 1, 63, 7, 63, 31, 63, 63, 63, 63, 63, 63, 63, 282 | 63, 63, 63, 63, 63, 63, 63, 63, 0, 0, 0, 0, 283 | /* 0x47 */ 0, 3, 0, 63, 7, 63, 63, 63, 63, 63, 63, 63, 284 | 63, 63, 63, 63, 63, 63, 63, 63, 0, 0, 0, 0, 285 | /* 0x48 */ 0, 63, 1, 63, 3, 63, 7, 63, 15, 63, 31, 63, 286 | 63, 63, 63, 63, 63, 63, 63, 63, 0, 0, 0, 0, 287 | /* 0x49 */ 0, 1, 0, 7, 0, 31, 0, 63, 3, 63, 15, 63, 288 | 63, 63, 63, 63, 63, 63, 63, 63, 0, 0, 0, 0, 289 | /* 0x4a */ 0, 63, 1, 63, 1, 63, 3, 63, 7, 63, 7, 63, 290 | 15, 63, 15, 63, 31, 63, 63, 63, 0, 0, 0, 0, 291 | /* 0x4b */ 0, 0, 0, 0, 0, 0, 0, 1, 0, 15, 3, 63, 292 | 31, 63, 63, 63, 63, 63, 63, 63, 0, 0, 0, 0, 293 | /* 0x4c */ 31, 63, 15, 63, 7, 63, 3, 63, 1, 63, 1, 63, 294 | 3, 63, 7, 63, 15, 63, 31, 63, 0, 0, 0, 0, 295 | /* 0x4d */ 32, 1, 48, 3, 56, 7, 60, 15, 62, 31, 63, 63, 296 | 63, 63, 63, 63, 63, 63, 63, 63, 0, 0, 0, 0, 297 | /* 0x4e */ 0, 0, 24, 0, 24, 0, 24, 0, 24, 0, 24, 0, 298 | 24, 0, 24, 0, 24, 0, 0, 0, 0, 0, 0, 0, 299 | /* 0x4f */ 51, 12, 12, 51, 12, 51, 51, 12, 51, 12, 12, 51, 300 | 12, 51, 51, 12, 51, 12, 12, 51, 0, 0, 0, 0, 301 | /* 0x50 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 302 | 0, 0, 0, 3, 0, 7, 0, 31, 0, 0, 0, 0, 303 | /* 0x51 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 304 | 0, 0, 0, 7, 0, 63, 15, 63, 0, 0, 0, 0, 305 | /* 0x52 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 3, 306 | 0, 7, 0, 15, 0, 31, 0, 63, 0, 0, 0, 0, 307 | /* 0x53 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 15, 308 | 0, 63, 3, 63, 7, 63, 31, 63, 0, 0, 0, 0, 309 | /* 0x54 */ 0, 0, 0, 1, 0, 1, 0, 3, 0, 3, 0, 7, 310 | 0, 7, 0, 15, 0, 15, 0, 31, 0, 0, 0, 0, 311 | /* 0x55 */ 0, 1, 0, 3, 0, 7, 0, 31, 0, 63, 1, 63, 312 | 3, 63, 15, 63, 31, 63, 63, 63, 0, 0, 0, 0, 313 | /* 0x56 */ 63, 32, 63, 56, 63, 60, 63, 63, 63, 63, 63, 63, 314 | 63, 63, 63, 63, 63, 63, 63, 63, 0, 0, 0, 0, 315 | /* 0x57 */ 48, 0, 63, 0, 63, 56, 63, 63, 63, 63, 63, 63, 316 | 63, 63, 63, 63, 63, 63, 63, 63, 0, 0, 0, 0, 317 | /* 0x58 */ 63, 0, 63, 32, 63, 48, 63, 56, 63, 60, 63, 62, 318 | 63, 63, 63, 63, 63, 63, 63, 63, 0, 0, 0, 0, 319 | /* 0x59 */ 32, 0, 56, 0, 62, 0, 63, 0, 63, 0, 63, 48, 320 | 63, 60, 63, 63, 63, 63, 63, 63, 0, 0, 0, 0, 321 | /* 0x5a */ 63, 0, 63, 32, 63, 32, 63, 48, 63, 56, 63, 56, 322 | 63, 60, 63, 60, 63, 62, 63, 63, 0, 0, 0, 0, 323 | /* 0x5b */ 0, 0, 0, 0, 0, 0, 32, 0, 60, 0, 63, 48, 324 | 63, 62, 63, 63, 63, 63, 63, 63, 0, 0, 0, 0, 325 | /* 0x5c */ 63, 62, 63, 60, 63, 56, 63, 48, 63, 32, 63, 32, 326 | 63, 48, 63, 56, 63, 60, 63, 62, 0, 0, 0, 0, 327 | /* 0x5d */ 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 62, 31, 328 | 60, 15, 56, 7, 48, 3, 32, 1, 0, 0, 0, 0, 329 | /* 0x5e */ 0, 0, 0, 6, 0, 6, 0, 6, 0, 6, 0, 6, 330 | 0, 6, 0, 6, 0, 6, 0, 0, 0, 0, 0, 0, 331 | /* 0x5f */ 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 332 | 63, 63, 63, 63, 63, 63, 63, 63, 0, 0, 0, 0, 333 | /* 0x60 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 334 | 0, 0, 0, 63, 0, 63, 0, 63, 0, 0, 0, 0, 335 | /* 0x61 */ 63, 0, 63, 0, 63, 0, 0, 0, 0, 0, 0, 0, 336 | 0, 0, 0, 63, 0, 63, 0, 63, 0, 0, 0, 0, 337 | /* 0x62 */ 0, 63, 0, 63, 0, 63, 0, 0, 0, 0, 0, 0, 338 | 0, 0, 0, 63, 0, 63, 0, 63, 0, 0, 0, 0, 339 | /* 0x63 */ 63, 63, 63, 63, 63, 63, 0, 0, 0, 0, 0, 0, 340 | 0, 0, 0, 63, 0, 63, 0, 63, 0, 0, 0, 0, 341 | /* 0x64 */ 0, 0, 0, 0, 0, 0, 63, 0, 63, 0, 63, 0, 342 | 63, 0, 0, 63, 0, 63, 0, 63, 0, 0, 0, 0, 343 | /* 0x65 */ 63, 0, 63, 0, 63, 0, 63, 0, 63, 0, 63, 0, 344 | 63, 0, 0, 63, 0, 63, 0, 63, 0, 0, 0, 0, 345 | /* 0x66 */ 0, 63, 0, 63, 0, 63, 63, 0, 63, 0, 63, 0, 346 | 63, 0, 0, 63, 0, 63, 0, 63, 0, 0, 0, 0, 347 | /* 0x67 */ 63, 63, 63, 63, 63, 63, 63, 0, 63, 0, 63, 0, 348 | 63, 0, 0, 63, 0, 63, 0, 63, 0, 0, 0, 0, 349 | /* 0x68 */ 0, 0, 0, 0, 0, 0, 0, 63, 0, 63, 0, 63, 350 | 0, 63, 0, 63, 0, 63, 0, 63, 0, 0, 0, 0, 351 | /* 0x69 */ 63, 0, 63, 0, 63, 0, 0, 63, 0, 63, 0, 63, 352 | 0, 63, 0, 63, 0, 63, 0, 63, 0, 0, 0, 0, 353 | /* 0x6a */ 0, 63, 0, 63, 0, 63, 0, 63, 0, 63, 0, 63, 354 | 0, 63, 0, 63, 0, 63, 0, 63, 0, 0, 0, 0, 355 | /* 0x6b */ 63, 63, 63, 63, 63, 63, 0, 63, 0, 63, 0, 63, 356 | 0, 63, 0, 63, 0, 63, 0, 63, 0, 0, 0, 0, 357 | /* 0x6c */ 0, 0, 0, 0, 0, 0, 63, 63, 63, 63, 63, 63, 358 | 63, 63, 0, 63, 0, 63, 0, 63, 0, 0, 0, 0, 359 | /* 0x6d */ 63, 0, 63, 0, 63, 0, 63, 63, 63, 63, 63, 63, 360 | 63, 63, 0, 63, 0, 63, 0, 63, 0, 0, 0, 0, 361 | /* 0x6e */ 0, 63, 0, 63, 0, 63, 63, 63, 63, 63, 63, 63, 362 | 63, 63, 0, 63, 0, 63, 0, 63, 0, 0, 0, 0, 363 | /* 0x6f */ 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 364 | 63, 63, 0, 63, 0, 63, 0, 63, 0, 0, 0, 0, 365 | /* 0x70 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 366 | 0, 0, 63, 63, 63, 63, 63, 63, 0, 0, 0, 0, 367 | /* 0x71 */ 63, 0, 63, 0, 63, 0, 0, 0, 0, 0, 0, 0, 368 | 0, 0, 63, 63, 63, 63, 63, 63, 0, 0, 0, 0, 369 | /* 0x72 */ 0, 63, 0, 63, 0, 63, 0, 0, 0, 0, 0, 0, 370 | 0, 0, 63, 63, 63, 63, 63, 63, 0, 0, 0, 0, 371 | /* 0x73 */ 63, 63, 63, 63, 63, 63, 0, 0, 0, 0, 0, 0, 372 | 0, 0, 63, 63, 63, 63, 63, 63, 0, 0, 0, 0, 373 | /* 0x74 */ 0, 0, 0, 0, 0, 0, 63, 0, 63, 0, 63, 0, 374 | 63, 0, 63, 63, 63, 63, 63, 63, 0, 0, 0, 0, 375 | /* 0x75 */ 63, 0, 63, 0, 63, 0, 63, 0, 63, 0, 63, 0, 376 | 63, 0, 63, 63, 63, 63, 63, 63, 0, 0, 0, 0, 377 | /* 0x76 */ 0, 63, 0, 63, 0, 63, 63, 0, 63, 0, 63, 0, 378 | 63, 0, 63, 63, 63, 63, 63, 63, 0, 0, 0, 0, 379 | /* 0x77 */ 63, 63, 63, 63, 63, 63, 63, 0, 63, 0, 63, 0, 380 | 63, 0, 63, 63, 63, 63, 63, 63, 0, 0, 0, 0, 381 | /* 0x78 */ 0, 0, 0, 0, 0, 0, 0, 63, 0, 63, 0, 63, 382 | 0, 63, 63, 63, 63, 63, 63, 63, 0, 0, 0, 0, 383 | /* 0x79 */ 63, 0, 63, 0, 63, 0, 0, 63, 0, 63, 0, 63, 384 | 0, 63, 63, 63, 63, 63, 63, 63, 0, 0, 0, 0, 385 | /* 0x7a */ 0, 63, 0, 63, 0, 63, 0, 63, 0, 63, 0, 63, 386 | 0, 63, 63, 63, 63, 63, 63, 63, 0, 0, 0, 0, 387 | /* 0x7b */ 63, 63, 63, 63, 63, 63, 0, 63, 0, 63, 0, 63, 388 | 0, 63, 63, 63, 63, 63, 63, 63, 0, 0, 0, 0, 389 | /* 0x7c */ 0, 0, 0, 0, 0, 0, 63, 63, 63, 63, 63, 63, 390 | 63, 63, 63, 63, 63, 63, 63, 63, 0, 0, 0, 0, 391 | /* 0x7d */ 63, 0, 63, 0, 63, 0, 63, 63, 63, 63, 63, 63, 392 | 63, 63, 63, 63, 63, 63, 63, 63, 0, 0, 0, 0, 393 | /* 0x7e */ 0, 63, 0, 63, 0, 63, 63, 63, 63, 63, 63, 63, 394 | 63, 63, 63, 63, 63, 63, 63, 63, 0, 0, 0, 0, 395 | /* 0x7f */ 0, 0, 31, 62, 31, 62, 31, 62, 31, 62, 31, 62, 396 | 31, 62, 31, 62, 31, 62, 0, 0, 0, 0, 0, 0, 397 | 398 | /* raw 'supplementary graphic' set */ 399 | /* 0x20 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 400 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 401 | /* 0x21 */ 0, 0, 3, 0, 0, 0, 3, 0, 3, 0, 3, 0, 402 | 3, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 403 | /* 0x22 */ 0, 0, 1, 32, 1, 32, 15, 60, 25, 44, 25, 32, 404 | 25, 32, 15, 60, 1, 32, 1, 32, 0, 0, 0, 0, 405 | /* 0x23 */ 0, 0, 1, 56, 3, 12, 3, 0, 15, 48, 3, 0, 406 | 3, 0, 31, 60, 0, 0, 0, 0, 0, 0, 0, 0, 407 | /* 0x24 */ 3, 0, 15, 48, 51, 12, 51, 0, 15, 48, 3, 12, 408 | 51, 12, 15, 48, 3, 0, 0, 0, 0, 0, 0, 0, 409 | /* 0x25 */ 0, 0, 48, 12, 48, 12, 48, 12, 12, 48, 3, 0, 410 | 15, 48, 3, 0, 3, 0, 0, 0, 0, 0, 0, 0, 411 | /* 0x26 */ 0, 0, 12, 48, 12, 48, 63, 60, 12, 48, 63, 60, 412 | 12, 48, 12, 48, 0, 0, 0, 0, 0, 0, 0, 0, 413 | /* 0x27 */ 0, 0, 15, 60, 24, 0, 15, 56, 24, 12, 15, 56, 414 | 0, 12, 31, 56, 0, 0, 0, 0, 0, 0, 0, 0, 415 | /* 0x28 */ 0, 0, 48, 12, 31, 56, 56, 28, 48, 12, 56, 28, 416 | 31, 56, 48, 12, 0, 0, 0, 0, 0, 0, 0, 0, 417 | /* 0x29 */ 0, 0, 6, 0, 12, 0, 14, 0, 0, 0, 0, 0, 418 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 419 | /* 0x2a */ 0, 0, 6, 24, 12, 48, 14, 56, 0, 0, 0, 0, 420 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 421 | /* 0x2b */ 0, 0, 6, 12, 12, 24, 24, 48, 49, 32, 24, 48, 422 | 12, 24, 6, 12, 0, 0, 0, 0, 0, 0, 0, 0, 423 | /* 0x2c */ 0, 0, 4, 0, 12, 0, 28, 0, 63, 63, 28, 0, 424 | 12, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 425 | /* 0x2d */ 1, 32, 3, 48, 7, 56, 15, 60, 1, 32, 1, 32, 426 | 1, 32, 1, 32, 1, 32, 0, 0, 0, 0, 0, 0, 427 | /* 0x2e */ 0, 0, 0, 32, 0, 48, 0, 56, 63, 60, 0, 56, 428 | 0, 48, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 429 | /* 0x2f */ 0, 0, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 430 | 15, 60, 7, 56, 3, 48, 1, 32, 0, 0, 0, 0, 431 | /* 0x30 */ 7, 32, 12, 48, 7, 32, 0, 0, 0, 0, 0, 0, 432 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 433 | /* 0x31 */ 0, 0, 3, 0, 3, 0, 63, 60, 3, 0, 3, 0, 434 | 0, 0, 63, 60, 0, 0, 0, 0, 0, 0, 0, 0, 435 | /* 0x32 */ 15, 0, 49, 32, 3, 0, 12, 0, 63, 32, 0, 0, 436 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 437 | /* 0x33 */ 62, 0, 3, 0, 6, 0, 3, 0, 62, 0, 0, 0, 438 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 439 | /* 0x34 */ 0, 0, 0, 0, 0, 0, 12, 24, 6, 48, 3, 32, 440 | 6, 48, 12, 24, 0, 0, 0, 0, 0, 0, 0, 0, 441 | /* 0x35 */ 0, 0, 0, 0, 0, 0, 24, 24, 24, 24, 24, 24, 442 | 24, 24, 31, 44, 24, 0, 24, 0, 0, 0, 0, 0, 443 | /* 0x36 */ 0, 0, 15, 60, 51, 12, 51, 12, 15, 60, 3, 12, 444 | 3, 12, 3, 12, 0, 0, 0, 0, 0, 0, 0, 0, 445 | /* 0x37 */ 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 446 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 447 | /* 0x38 */ 0, 0, 0, 0, 3, 0, 0, 0, 31, 56, 0, 0, 448 | 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 449 | /* 0x39 */ 0, 0, 14, 0, 6, 0, 12, 0, 0, 0, 0, 0, 450 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 451 | /* 0x3a */ 0, 0, 14, 56, 6, 24, 12, 48, 0, 0, 0, 0, 452 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 453 | /* 0x3b */ 0, 0, 49, 32, 24, 48, 12, 24, 6, 12, 12, 24, 454 | 24, 48, 49, 32, 0, 0, 0, 0, 0, 0, 0, 0, 455 | /* 0x3c */ 12, 0, 60, 0, 12, 12, 12, 48, 3, 30, 12, 54, 456 | 49, 38, 1, 62, 0, 6, 0, 0, 0, 0, 0, 0, 457 | /* 0x3d */ 12, 0, 60, 0, 12, 12, 12, 48, 3, 30, 13, 35, 458 | 48, 12, 0, 48, 1, 63, 0, 0, 0, 0, 0, 0, 459 | /* 0x3e */ 60, 0, 6, 2, 12, 12, 6, 48, 59, 30, 12, 54, 460 | 49, 38, 3, 62, 0, 6, 0, 0, 0, 0, 0, 0, 461 | /* 0x3f */ 0, 0, 3, 0, 0, 0, 3, 0, 3, 0, 6, 0, 462 | 12, 0, 12, 24, 7, 48, 0, 0, 0, 0, 0, 0, 463 | /* 0x40 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 464 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 465 | /* 0x41 */ 3, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 0, 466 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 467 | /* 0x42 */ 3, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 468 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 469 | /* 0x43 */ 3, 0, 12, 48, 0, 0, 0, 0, 0, 0, 0, 0, 470 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 471 | /* 0x44 */ 7, 12, 12, 56, 0, 0, 0, 0, 0, 0, 0, 0, 472 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 473 | /* 0x45 */ 31, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 474 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 475 | /* 0x46 */ 12, 48, 7, 32, 0, 0, 0, 0, 0, 0, 0, 0, 476 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 477 | /* 0x47 */ 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 478 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 479 | /* 0x48 */ 12, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 480 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 481 | /* 0x49 */ 12, 24, 12, 24, 0, 0, 0, 0, 0, 0, 0, 0, 482 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 483 | /* 0x4a */ 7, 32, 12, 48, 7, 32, 0, 0, 0, 0, 0, 0, 484 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 485 | /* 0x4b */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 486 | 0, 0, 1, 0, 1, 0, 7, 0, 0, 0, 0, 0, 487 | /* 0x4c */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 488 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 489 | /* 0x4d */ 12, 48, 25, 32, 0, 0, 0, 0, 0, 0, 0, 0, 490 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 491 | /* 0x4e */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 492 | 0, 0, 2, 0, 2, 0, 3, 32, 0, 0, 0, 0, 493 | /* 0x4f */ 12, 48, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 494 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 495 | /* 0x50 */ 0, 0, 0, 0, 0, 0, 0, 0, 63, 63, 0, 0, 496 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 497 | /* 0x51 */ 12, 0, 60, 0, 12, 0, 12, 0, 12, 0, 0, 0, 498 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 499 | /* 0x52 */ 31, 62, 48, 3, 55, 51, 54, 27, 55, 35, 54, 51, 500 | 54, 27, 48, 3, 31, 60, 0, 0, 0, 0, 0, 0, 501 | /* 0x53 */ 31, 60, 48, 6, 51, 54, 54, 54, 54, 6, 54, 54, 502 | 51, 38, 48, 6, 31, 60, 0, 0, 0, 0, 0, 0, 503 | /* 0x54 */ 0, 0, 0, 0, 63, 4, 9, 44, 9, 60, 9, 20, 504 | 9, 4, 9, 4, 0, 0, 0, 0, 0, 0, 0, 0, 505 | /* 0x55 */ 3, 32, 3, 48, 3, 24, 3, 12, 3, 0, 15, 0, 506 | 63, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 507 | /* 0x56 */ 6, 12, 6, 12, 0, 0, 7, 48, 0, 12, 15, 60, 508 | 24, 12, 15, 60, 0, 0, 0, 0, 0, 0, 0, 0, 509 | /* 0x57 */ 12, 48, 12, 48, 0, 0, 15, 48, 24, 24, 24, 24, 510 | 24, 24, 15, 48, 0, 0, 0, 0, 0, 0, 0, 0, 511 | /* 0x58 */ 24, 24, 24, 24, 0, 0, 56, 56, 24, 24, 24, 24, 512 | 24, 56, 15, 28, 0, 0, 0, 0, 0, 0, 0, 0, 513 | /* 0x59 */ 12, 48, 0, 0, 7, 48, 12, 24, 24, 12, 31, 60, 514 | 24, 12, 24, 12, 0, 0, 0, 0, 0, 0, 0, 0, 515 | /* 0x5a */ 12, 48, 0, 0, 7, 48, 12, 24, 24, 12, 24, 12, 516 | 12, 24, 7, 48, 0, 0, 0, 0, 0, 0, 0, 0, 517 | /* 0x5b */ 12, 48, 0, 0, 60, 60, 24, 24, 24, 24, 24, 24, 518 | 24, 24, 15, 48, 0, 0, 0, 0, 0, 0, 0, 0, 519 | /* 0x5c */ 0, 0, 24, 8, 56, 16, 24, 32, 25, 60, 26, 36, 520 | 4, 60, 8, 36, 16, 60, 0, 0, 0, 0, 0, 0, 521 | /* 0x5d */ 60, 0, 6, 8, 28, 16, 6, 32, 61, 60, 2, 36, 522 | 4, 60, 8, 36, 16, 60, 0, 0, 0, 0, 0, 0, 523 | /* 0x5e */ 60, 0, 32, 8, 60, 16, 6, 32, 61, 60, 2, 36, 524 | 4, 60, 8, 36, 16, 60, 0, 0, 0, 0, 0, 0, 525 | /* 0x5f */ 62, 0, 34, 8, 4, 16, 8, 32, 9, 60, 2, 36, 526 | 4, 60, 8, 36, 16, 60, 0, 0, 0, 0, 0, 0, 527 | /* 0x60 */ 0, 0, 15, 48, 24, 24, 48, 12, 48, 12, 24, 24, 528 | 12, 48, 60, 60, 0, 0, 0, 0, 0, 0, 0, 0, 529 | /* 0x61 */ 0, 0, 7, 56, 15, 0, 25, 32, 25, 60, 31, 32, 530 | 48, 48, 48, 62, 0, 0, 0, 0, 0, 0, 0, 0, 531 | /* 0x62 */ 0, 0, 15, 48, 12, 12, 12, 12, 63, 12, 12, 12, 532 | 12, 12, 15, 48, 0, 0, 0, 0, 0, 0, 0, 0, 533 | /* 0x63 */ 0, 0, 15, 48, 0, 24, 15, 56, 24, 24, 15, 60, 534 | 0, 0, 63, 60, 0, 0, 0, 0, 0, 0, 0, 0, 535 | /* 0x64 */ 12, 48, 63, 60, 12, 48, 12, 48, 15, 48, 12, 48, 536 | 12, 48, 12, 48, 0, 0, 0, 0, 0, 0, 0, 0, 537 | /* 0x65 */ 63, 63, 60, 63, 63, 63, 60, 63, 60, 63, 57, 63, 538 | 51, 63, 51, 39, 56, 15, 63, 63, 0, 0, 0, 0, 539 | /* 0x66 */ 0, 0, 48, 60, 48, 12, 48, 12, 48, 12, 48, 12, 540 | 48, 12, 48, 12, 3, 48, 0, 0, 0, 0, 0, 0, 541 | /* 0x67 */ 0, 0, 48, 0, 48, 0, 48, 0, 48, 48, 48, 0, 542 | 48, 0, 63, 60, 0, 0, 0, 0, 0, 0, 0, 0, 543 | /* 0x68 */ 0, 0, 12, 0, 12, 0, 15, 0, 12, 0, 60, 0, 544 | 12, 0, 15, 60, 0, 0, 0, 0, 0, 0, 0, 0, 545 | /* 0x69 */ 0, 12, 7, 56, 24, 60, 25, 44, 25, 12, 27, 12, 546 | 30, 12, 15, 48, 24, 0, 0, 0, 0, 0, 0, 0, 547 | /* 0x6a */ 0, 0, 15, 62, 49, 32, 49, 32, 49, 60, 49, 0, 548 | 49, 32, 15, 62, 0, 0, 0, 0, 0, 0, 0, 0, 549 | /* 0x6b */ 0, 0, 15, 48, 24, 24, 24, 24, 24, 24, 15, 48, 550 | 0, 0, 63, 60, 0, 0, 0, 0, 0, 0, 0, 0, 551 | /* 0x6c */ 0, 0, 63, 0, 12, 0, 15, 48, 12, 12, 15, 48, 552 | 12, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 553 | /* 0x6d */ 0, 0, 63, 60, 3, 0, 3, 0, 15, 48, 3, 0, 554 | 3, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 555 | /* 0x6e */ 0, 0, 51, 48, 60, 12, 48, 12, 48, 12, 48, 12, 556 | 51, 12, 48, 48, 0, 0, 0, 0, 0, 0, 0, 0, 557 | /* 0x6f */ 0, 0, 48, 0, 48, 0, 15, 48, 12, 12, 12, 12, 558 | 12, 12, 12, 12, 0, 0, 0, 0, 0, 0, 0, 0, 559 | /* 0x70 */ 0, 0, 0, 0, 0, 0, 48, 48, 51, 0, 60, 0, 560 | 51, 12, 48, 48, 0, 0, 0, 0, 0, 0, 0, 0, 561 | /* 0x71 */ 0, 0, 14, 24, 49, 38, 1, 38, 15, 62, 49, 32, 562 | 49, 38, 14, 60, 0, 0, 0, 0, 0, 0, 0, 0, 563 | /* 0x72 */ 0, 0, 0, 48, 3, 60, 0, 48, 15, 48, 48, 48, 564 | 48, 48, 15, 48, 0, 0, 0, 0, 0, 0, 0, 0, 565 | /* 0x73 */ 3, 0, 1, 56, 3, 48, 0, 24, 0, 12, 15, 60, 566 | 48, 12, 15, 48, 0, 0, 0, 0, 0, 0, 0, 0, 567 | /* 0x74 */ 0, 0, 12, 0, 63, 0, 12, 0, 15, 48, 12, 12, 568 | 12, 12, 12, 12, 0, 0, 0, 0, 0, 0, 0, 0, 569 | /* 0x75 */ 0, 0, 0, 0, 0, 0, 7, 48, 0, 48, 0, 48, 570 | 0, 48, 0, 48, 0, 0, 0, 0, 0, 0, 0, 0, 571 | /* 0x76 */ 0, 0, 48, 48, 0, 0, 48, 48, 48, 48, 48, 48, 572 | 48, 48, 48, 48, 1, 32, 0, 0, 0, 0, 0, 0, 573 | /* 0x77 */ 0, 0, 15, 0, 3, 0, 3, 0, 3, 12, 3, 0, 574 | 3, 0, 15, 48, 0, 0, 0, 0, 0, 0, 0, 0, 575 | /* 0x78 */ 3, 0, 3, 0, 3, 48, 3, 0, 15, 0, 3, 0, 576 | 3, 0, 1, 48, 0, 0, 0, 0, 0, 0, 0, 0, 577 | /* 0x79 */ 0, 0, 0, 12, 7, 56, 24, 60, 25, 44, 27, 12, 578 | 30, 12, 15, 48, 24, 0, 0, 0, 0, 0, 0, 0, 579 | /* 0x7a */ 0, 0, 0, 0, 14, 24, 49, 38, 49, 60, 49, 32, 580 | 49, 38, 14, 28, 0, 0, 0, 0, 0, 0, 0, 0, 581 | /* 0x7b */ 0, 0, 7, 32, 24, 24, 24, 24, 25, 32, 24, 24, 582 | 24, 24, 27, 48, 24, 0, 24, 0, 0, 0, 0, 0, 583 | /* 0x7c */ 0, 0, 12, 0, 12, 0, 15, 48, 12, 12, 15, 48, 584 | 12, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 585 | /* 0x7d */ 0, 0, 3, 0, 63, 60, 3, 0, 15, 48, 3, 0, 586 | 3, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 0, 587 | /* 0x7e */ 0, 0, 0, 0, 0, 0, 51, 48, 60, 12, 48, 12, 588 | 51, 12, 48, 48, 0, 0, 0, 0, 0, 0, 0, 0, 589 | /* 0x7f */ 0, 0, 31, 62, 31, 62, 31, 62, 31, 62, 31, 62, 590 | 31, 62, 31, 62, 31, 62, 0, 0, 0, 0, 0, 0, 591 | 592 | /* raw '3rd supplementary mosaic' set */ 593 | /* 0x20 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 594 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 595 | /* 0x21 */ 63, 63, 60, 63, 63, 63, 60, 63, 60, 63, 57, 63, 596 | 51, 63, 51, 39, 56, 15, 63, 63, 0, 0, 0, 0, 597 | /* 0x22 */ 63, 63, 60, 63, 63, 63, 60, 63, 60, 63, 57, 63, 598 | 51, 63, 51, 39, 56, 15, 63, 63, 0, 0, 0, 0, 599 | /* 0x23 */ 63, 63, 60, 63, 63, 63, 60, 63, 60, 63, 57, 63, 600 | 51, 63, 51, 39, 56, 15, 63, 63, 0, 0, 0, 0, 601 | /* 0x24 */ 63, 63, 60, 63, 63, 63, 60, 63, 60, 63, 57, 63, 602 | 51, 63, 51, 39, 56, 15, 63, 63, 0, 0, 0, 0, 603 | /* 0x25 */ 63, 63, 60, 63, 63, 63, 60, 63, 60, 63, 57, 63, 604 | 51, 63, 51, 39, 56, 15, 63, 63, 0, 0, 0, 0, 605 | /* 0x26 */ 63, 63, 60, 63, 63, 63, 60, 63, 60, 63, 57, 63, 606 | 51, 63, 51, 39, 56, 15, 63, 63, 0, 0, 0, 0, 607 | /* 0x27 */ 63, 63, 60, 63, 63, 63, 60, 63, 60, 63, 57, 63, 608 | 51, 63, 51, 39, 56, 15, 63, 63, 0, 0, 0, 0, 609 | /* 0x28 */ 63, 63, 60, 63, 63, 63, 60, 63, 60, 63, 57, 63, 610 | 51, 63, 51, 39, 56, 15, 63, 63, 0, 0, 0, 0, 611 | /* 0x29 */ 63, 63, 60, 63, 63, 63, 60, 63, 60, 63, 57, 63, 612 | 51, 63, 51, 39, 56, 15, 63, 63, 0, 0, 0, 0, 613 | /* 0x2a */ 63, 63, 60, 63, 63, 63, 60, 63, 60, 63, 57, 63, 614 | 51, 63, 51, 39, 56, 15, 63, 63, 0, 0, 0, 0, 615 | /* 0x2b */ 63, 63, 60, 63, 63, 63, 60, 63, 60, 63, 57, 63, 616 | 51, 63, 51, 39, 56, 15, 63, 63, 0, 0, 0, 0, 617 | /* 0x2c */ 63, 63, 60, 63, 63, 63, 60, 63, 60, 63, 57, 63, 618 | 51, 63, 51, 39, 56, 15, 63, 63, 0, 0, 0, 0, 619 | /* 0x2d */ 63, 63, 60, 63, 63, 63, 60, 63, 60, 63, 57, 63, 620 | 51, 63, 51, 39, 56, 15, 63, 63, 0, 0, 0, 0, 621 | /* 0x2e */ 63, 63, 60, 63, 63, 63, 60, 63, 60, 63, 57, 63, 622 | 51, 63, 51, 39, 56, 15, 63, 63, 0, 0, 0, 0, 623 | /* 0x2f */ 63, 63, 60, 63, 63, 63, 60, 63, 60, 63, 57, 63, 624 | 51, 63, 51, 39, 56, 15, 63, 63, 0, 0, 0, 0, 625 | /* 0x30 */ 63, 63, 60, 63, 63, 63, 60, 63, 60, 63, 57, 63, 626 | 51, 63, 51, 39, 56, 15, 63, 63, 0, 0, 0, 0, 627 | /* 0x31 */ 63, 63, 60, 63, 63, 63, 60, 63, 60, 63, 57, 63, 628 | 51, 63, 51, 39, 56, 15, 63, 63, 0, 0, 0, 0, 629 | /* 0x32 */ 63, 63, 60, 63, 63, 63, 60, 63, 60, 63, 57, 63, 630 | 51, 63, 51, 39, 56, 15, 63, 63, 0, 0, 0, 0, 631 | /* 0x33 */ 63, 63, 60, 63, 63, 63, 60, 63, 60, 63, 57, 63, 632 | 51, 63, 51, 39, 56, 15, 63, 63, 0, 0, 0, 0, 633 | /* 0x34 */ 63, 63, 60, 63, 63, 63, 60, 63, 60, 63, 57, 63, 634 | 51, 63, 51, 39, 56, 15, 63, 63, 0, 0, 0, 0, 635 | /* 0x35 */ 63, 63, 60, 63, 63, 63, 60, 63, 60, 63, 57, 63, 636 | 51, 63, 51, 39, 56, 15, 63, 63, 0, 0, 0, 0, 637 | /* 0x36 */ 63, 63, 60, 63, 63, 63, 60, 63, 60, 63, 57, 63, 638 | 51, 63, 51, 39, 56, 15, 63, 63, 0, 0, 0, 0, 639 | /* 0x37 */ 63, 63, 60, 63, 63, 63, 60, 63, 60, 63, 57, 63, 640 | 51, 63, 51, 39, 56, 15, 63, 63, 0, 0, 0, 0, 641 | /* 0x38 */ 63, 63, 60, 63, 63, 63, 60, 63, 60, 63, 57, 63, 642 | 51, 63, 51, 39, 56, 15, 63, 63, 0, 0, 0, 0, 643 | /* 0x39 */ 63, 63, 60, 63, 63, 63, 60, 63, 60, 63, 57, 63, 644 | 51, 63, 51, 39, 56, 15, 63, 63, 0, 0, 0, 0, 645 | /* 0x3a */ 63, 63, 60, 63, 63, 63, 60, 63, 60, 63, 57, 63, 646 | 51, 63, 51, 39, 56, 15, 63, 63, 0, 0, 0, 0, 647 | /* 0x3b */ 63, 63, 60, 63, 63, 63, 60, 63, 60, 63, 57, 63, 648 | 51, 63, 51, 39, 56, 15, 63, 63, 0, 0, 0, 0, 649 | /* 0x3c */ 63, 63, 60, 63, 63, 63, 60, 63, 60, 63, 57, 63, 650 | 51, 63, 51, 39, 56, 15, 63, 63, 0, 0, 0, 0, 651 | /* 0x3d */ 63, 63, 60, 63, 63, 63, 60, 63, 60, 63, 57, 63, 652 | 51, 63, 51, 39, 56, 15, 63, 63, 0, 0, 0, 0, 653 | /* 0x3e */ 63, 63, 60, 63, 63, 63, 60, 63, 60, 63, 57, 63, 654 | 51, 63, 51, 39, 56, 15, 63, 63, 0, 0, 0, 0, 655 | /* 0x3f */ 63, 63, 60, 63, 63, 63, 60, 63, 60, 63, 57, 63, 656 | 51, 63, 51, 39, 56, 15, 63, 63, 0, 0, 0, 0, 657 | /* 0x40 */ 1, 32, 1, 32, 1, 32, 63, 63, 63, 63, 63, 63, 658 | 63, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 659 | /* 0x41 */ 0, 0, 0, 0, 0, 0, 63, 63, 63, 63, 63, 63, 660 | 63, 63, 1, 32, 1, 32, 1, 32, 0, 0, 0, 0, 661 | /* 0x42 */ 1, 32, 1, 32, 1, 32, 1, 63, 1, 63, 1, 63, 662 | 1, 63, 1, 32, 1, 32, 1, 32, 0, 0, 0, 0, 663 | /* 0x43 */ 1, 32, 1, 32, 1, 32, 63, 32, 63, 32, 63, 32, 664 | 63, 32, 1, 32, 1, 32, 1, 32, 0, 0, 0, 0, 665 | /* 0x44 */ 3, 0, 6, 0, 12, 0, 24, 0, 48, 0, 48, 0, 666 | 24, 0, 12, 0, 6, 0, 3, 0, 0, 0, 0, 0, 667 | /* 0x45 */ 0, 48, 0, 24, 0, 12, 0, 6, 0, 3, 0, 3, 668 | 0, 6, 0, 12, 0, 24, 0, 48, 0, 0, 0, 0, 669 | /* 0x46 */ 0, 0, 0, 0, 0, 0, 0, 0, 32, 1, 48, 3, 670 | 24, 6, 12, 12, 6, 24, 3, 48, 0, 0, 0, 0, 671 | /* 0x47 */ 3, 48, 6, 24, 12, 12, 24, 6, 48, 3, 32, 1, 672 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 673 | /* 0x48 */ 3, 0, 6, 0, 12, 0, 24, 0, 48, 0, 32, 0, 674 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 675 | /* 0x49 */ 0, 48, 0, 24, 0, 12, 0, 6, 0, 3, 0, 1, 676 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 677 | /* 0x4a */ 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 48, 0, 678 | 24, 0, 12, 0, 6, 0, 3, 0, 0, 0, 0, 0, 679 | /* 0x4b */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 3, 680 | 0, 6, 0, 12, 0, 24, 0, 48, 0, 0, 0, 0, 681 | /* 0x4c */ 1, 32, 1, 32, 1, 32, 63, 63, 63, 63, 63, 63, 682 | 1, 32, 1, 32, 1, 32, 1, 32, 0, 0, 0, 0, 683 | /* 0x4d */ 0, 0, 0, 0, 0, 0, 3, 48, 7, 56, 7, 56, 684 | 3, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 685 | /* 0x4e */ 0, 0, 7, 56, 31, 62, 63, 63, 63, 63, 63, 63, 686 | 63, 63, 31, 62, 7, 56, 0, 0, 0, 0, 0, 0, 687 | /* 0x4f */ 0, 0, 7, 56, 28, 14, 48, 3, 48, 3, 48, 3, 688 | 48, 3, 28, 14, 7, 56, 0, 0, 0, 0, 0, 0, 689 | /* 0x50 */ 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 690 | 1, 32, 1, 32, 1, 32, 1, 32, 0, 0, 0, 0, 691 | /* 0x51 */ 0, 0, 0, 0, 0, 0, 0, 0, 63, 63, 63, 63, 692 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 693 | /* 0x52 */ 0, 0, 0, 0, 0, 0, 0, 0, 1, 63, 1, 63, 694 | 1, 32, 1, 32, 1, 32, 1, 32, 0, 0, 0, 0, 695 | /* 0x53 */ 0, 0, 0, 0, 0, 0, 0, 0, 63, 32, 63, 32, 696 | 1, 32, 1, 32, 1, 32, 1, 32, 0, 0, 0, 0, 697 | /* 0x54 */ 1, 32, 1, 32, 1, 32, 1, 32, 1, 63, 1, 63, 698 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 699 | /* 0x55 */ 1, 32, 1, 32, 1, 32, 1, 32, 63, 32, 63, 32, 700 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 701 | /* 0x56 */ 1, 32, 1, 32, 1, 32, 1, 32, 1, 63, 1, 63, 702 | 1, 32, 1, 32, 1, 32, 1, 32, 0, 0, 0, 0, 703 | /* 0x57 */ 1, 32, 1, 32, 1, 32, 1, 32, 63, 32, 63, 32, 704 | 1, 32, 1, 32, 1, 32, 1, 32, 0, 0, 0, 0, 705 | /* 0x58 */ 0, 0, 0, 0, 0, 0, 0, 0, 63, 63, 63, 63, 706 | 1, 32, 1, 32, 1, 32, 1, 32, 0, 0, 0, 0, 707 | /* 0x59 */ 1, 32, 1, 32, 1, 32, 1, 32, 63, 63, 63, 63, 708 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 709 | /* 0x5a */ 1, 32, 1, 32, 1, 32, 1, 32, 63, 63, 63, 63, 710 | 1, 32, 1, 32, 1, 32, 1, 32, 0, 0, 0, 0, 711 | /* 0x5b */ 0, 0, 0, 0, 3, 0, 3, 48, 63, 60, 63, 60, 712 | 3, 48, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 713 | /* 0x5c */ 0, 0, 0, 0, 0, 48, 3, 48, 15, 63, 15, 63, 714 | 3, 48, 0, 48, 0, 0, 0, 0, 0, 0, 0, 0, 715 | /* 0x5d */ 0, 0, 1, 32, 3, 48, 7, 56, 15, 60, 1, 32, 716 | 1, 32, 1, 32, 1, 32, 1, 32, 0, 0, 0, 0, 717 | /* 0x5e */ 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 15, 60, 718 | 7, 56, 3, 48, 1, 32, 0, 0, 0, 0, 0, 0, 719 | /* 0x5f */ 63, 63, 60, 63, 63, 63, 60, 63, 60, 63, 57, 63, 720 | 51, 63, 51, 39, 56, 15, 63, 63, 0, 0, 0, 0, 721 | /* 0x60 */ 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 722 | 63, 63, 15, 63, 7, 63, 1, 63, 0, 0, 0, 0, 723 | /* 0x61 */ 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 724 | 63, 63, 7, 63, 0, 63, 0, 3, 0, 0, 0, 0, 725 | /* 0x62 */ 63, 63, 63, 63, 63, 63, 63, 63, 31, 63, 15, 63, 726 | 7, 63, 3, 63, 1, 63, 0, 63, 0, 0, 0, 0, 727 | /* 0x63 */ 63, 63, 63, 63, 63, 63, 63, 63, 15, 63, 3, 63, 728 | 0, 63, 0, 15, 0, 7, 0, 1, 0, 0, 0, 0, 729 | /* 0x64 */ 63, 63, 31, 63, 31, 63, 15, 63, 7, 63, 7, 63, 730 | 3, 63, 3, 63, 1, 63, 0, 63, 0, 0, 0, 0, 731 | /* 0x65 */ 31, 63, 15, 63, 7, 63, 3, 63, 1, 63, 0, 31, 732 | 0, 15, 0, 7, 0, 3, 0, 1, 0, 0, 0, 0, 733 | /* 0x66 */ 62, 0, 56, 0, 48, 0, 0, 0, 0, 0, 0, 0, 734 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 735 | /* 0x67 */ 63, 60, 63, 0, 56, 0, 0, 0, 0, 0, 0, 0, 736 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 737 | /* 0x68 */ 63, 0, 62, 0, 60, 0, 56, 0, 48, 0, 32, 0, 738 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 739 | /* 0x69 */ 63, 62, 63, 56, 63, 32, 63, 0, 60, 0, 48, 0, 740 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 741 | /* 0x6a */ 63, 0, 62, 0, 62, 0, 60, 0, 56, 0, 56, 0, 742 | 48, 0, 48, 0, 32, 0, 0, 0, 0, 0, 0, 0, 743 | /* 0x6b */ 63, 63, 63, 63, 63, 63, 63, 62, 63, 48, 60, 0, 744 | 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 745 | /* 0x6c */ 32, 0, 48, 0, 56, 0, 60, 0, 62, 0, 62, 0, 746 | 60, 0, 56, 0, 48, 0, 32, 0, 0, 0, 0, 0, 747 | /* 0x6d */ 31, 62, 15, 60, 7, 56, 3, 48, 1, 32, 0, 0, 748 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 749 | /* 0x6e */ 63, 63, 60, 63, 63, 63, 60, 63, 60, 63, 57, 63, 750 | 51, 63, 51, 39, 56, 15, 63, 63, 0, 0, 0, 0, 751 | /* 0x6f */ 63, 63, 60, 63, 63, 63, 60, 63, 60, 63, 57, 63, 752 | 51, 63, 51, 39, 56, 15, 63, 63, 0, 0, 0, 0, 753 | /* 0x70 */ 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 754 | 63, 63, 63, 60, 63, 56, 63, 32, 0, 0, 0, 0, 755 | /* 0x71 */ 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 756 | 63, 63, 63, 56, 63, 0, 48, 0, 0, 0, 0, 0, 757 | /* 0x72 */ 63, 63, 63, 63, 63, 63, 63, 63, 63, 62, 63, 60, 758 | 63, 56, 63, 48, 63, 32, 63, 0, 0, 0, 0, 0, 759 | /* 0x73 */ 63, 63, 63, 63, 63, 63, 63, 63, 63, 60, 63, 48, 760 | 63, 0, 60, 0, 56, 0, 32, 0, 0, 0, 0, 0, 761 | /* 0x74 */ 63, 63, 63, 62, 63, 62, 63, 60, 63, 56, 63, 56, 762 | 63, 48, 63, 48, 63, 32, 63, 0, 0, 0, 0, 0, 763 | /* 0x75 */ 63, 62, 63, 60, 63, 56, 63, 48, 63, 32, 62, 0, 764 | 60, 0, 56, 0, 48, 0, 32, 0, 0, 0, 0, 0, 765 | /* 0x76 */ 0, 31, 0, 7, 0, 1, 0, 0, 0, 0, 0, 0, 766 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 767 | /* 0x77 */ 15, 63, 0, 63, 0, 7, 0, 0, 0, 0, 0, 0, 768 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 769 | /* 0x78 */ 0, 63, 0, 31, 0, 15, 0, 7, 0, 3, 0, 1, 770 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 771 | /* 0x79 */ 31, 63, 7, 63, 1, 63, 0, 63, 0, 15, 0, 3, 772 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 773 | /* 0x7a */ 0, 63, 0, 31, 0, 31, 0, 15, 0, 7, 0, 7, 774 | 0, 3, 0, 3, 0, 1, 0, 0, 0, 0, 0, 0, 775 | /* 0x7b */ 63, 63, 63, 63, 63, 63, 31, 63, 3, 63, 0, 15, 776 | 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 777 | /* 0x7c */ 0, 3, 0, 7, 0, 15, 0, 31, 0, 63, 0, 63, 778 | 0, 31, 0, 15, 0, 7, 0, 3, 0, 0, 0, 0, 779 | /* 0x7d */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 32, 780 | 3, 48, 7, 56, 15, 60, 31, 62, 0, 0, 0, 0, 781 | /* 0x7e */ 63, 63, 60, 63, 63, 63, 60, 63, 60, 63, 57, 63, 782 | 51, 63, 51, 39, 56, 15, 63, 63, 0, 0, 0, 0, 783 | /* 0x7f */ 0, 0, 31, 62, 31, 62, 31, 62, 31, 62, 31, 62, 784 | 31, 62, 31, 62, 31, 62, 0, 0, 0, 0, 0, 0, 785 | 786 | }; 787 | -------------------------------------------------------------------------------- /macOS/btx_decoder/Base.lproj/MainMenu.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 | 169 | 170 | 171 | 172 | 173 | 174 | 175 | 176 | 177 | 178 | 179 | 180 | 181 | 182 | 183 | 184 | 185 | 186 | 187 | 188 | 189 | 190 | 191 | 192 | 193 | 194 | 195 | 196 | 197 | 198 | 199 | 200 | 201 | 202 | 203 | 204 | 205 | 206 | 207 | 208 | 209 | 210 | 211 | 212 | 213 | 214 | 215 | 216 | 217 | 218 | 219 | 220 | 221 | 222 | 223 | 224 | 225 | 226 | 227 | 228 | 229 | 230 | 231 | 232 | 233 | 234 | 235 | 236 | 237 | 238 | 239 | 240 | 241 | 242 | 243 | 244 | 245 | 246 | 247 | 248 | 249 | 250 | 251 | 252 | 253 | 254 | 255 | 256 | 257 | 258 | 259 | 260 | 261 | 262 | 263 | 264 | 265 | 266 | 267 | 268 | 269 | 270 | 271 | 272 | 273 | 274 | 275 | 276 | 277 | 278 | 279 | 280 | 281 | 282 | 283 | 284 | 285 | 286 | 287 | 288 | 289 | 290 | 291 | 292 | 293 | 294 | 295 | 296 | 297 | 298 | 299 | 300 | 301 | 302 | 303 | 304 | 305 | 306 | 307 | 308 | 309 | 310 | 311 | 312 | 313 | 314 | 315 | 316 | 317 | 318 | 319 | 320 | 321 | 322 | 323 | 324 | 325 | 326 | 327 | 328 | 329 | 330 | 331 | 332 | 333 | 334 | 335 | 336 | 337 | 338 | 339 | 340 | 341 | 342 | 343 | 344 | 345 | 346 | 347 | 348 | 349 | 350 | 351 | 352 | 353 | 354 | 355 | 356 | 357 | 358 | 359 | 360 | 361 | 362 | 363 | 364 | 365 | 366 | 367 | 368 | 369 | 370 | 371 | 372 | 373 | 374 | 375 | 376 | 377 | 378 | 379 | 380 | 381 | 382 | 383 | 384 | 385 | 386 | 387 | 388 | 389 | 390 | 391 | 392 | 393 | 394 | 395 | 396 | 397 | 398 | 399 | 400 | 401 | 402 | 403 | 404 | 405 | 406 | 407 | 408 | 409 | 410 | 411 | 412 | 413 | 414 | 415 | 416 | 417 | 418 | 419 | 420 | 421 | 422 | 423 | 424 | 425 | 426 | 427 | 428 | 429 | 430 | 431 | 432 | 433 | 434 | 435 | 436 | 437 | 438 | 439 | 440 | 441 | 442 | 443 | 444 | 445 | 446 | 447 | 448 | 449 | 450 | 451 | 452 | 453 | 454 | 455 | 456 | 457 | 458 | 459 | 460 | 461 | 462 | 463 | 464 | 465 | 466 | 467 | 468 | 469 | 470 | 471 | 472 | 473 | 474 | 475 | 476 | 477 | 478 | 479 | 480 | 481 | 482 | 483 | 484 | 485 | 486 | 487 | 488 | 489 | 490 | 491 | 492 | 493 | 494 | 495 | 496 | 497 | 498 | 499 | 500 | 501 | 502 | 503 | 504 | 505 | 506 | 507 | 508 | 509 | 510 | 511 | 512 | 513 | 514 | 515 | 516 | 517 | 518 | 519 | 520 | 521 | 522 | 523 | 524 | 525 | 526 | 527 | 528 | 529 | 530 | 531 | 532 | 533 | 534 | 535 | 536 | 537 | Default 538 | 539 | 540 | 541 | 542 | 543 | 544 | Left to Right 545 | 546 | 547 | 548 | 549 | 550 | 551 | Right to Left 552 | 553 | 554 | 555 | 556 | 557 | 558 | 559 | 560 | 561 | 562 | Default 563 | 564 | 565 | 566 | 567 | 568 | 569 | Left to Right 570 | 571 | 572 | 573 | 574 | 575 | 576 | Right to Left 577 | 578 | 579 | 580 | 581 | 582 | 583 | 584 | 585 | 586 | 587 | 588 | 589 | 590 | 591 | 592 | 593 | 594 | 595 | 596 | 597 | 598 | 599 | 600 | 601 | 602 | 603 | 604 | 605 | 606 | 607 | 608 | 609 | 610 | 611 | 612 | 613 | 614 | 615 | 616 | 617 | 618 | 619 | 620 | 621 | 622 | 623 | 624 | 625 | 626 | 627 | 628 | 629 | 630 | 631 | 632 | 633 | 634 | 635 | 636 | 637 | 638 | 639 | 640 | 641 | 642 | 643 | 644 | 645 | 646 | 647 | 648 | 649 | 650 | 651 | 652 | 653 | 654 | 655 | 656 | 657 | 658 | 659 | 660 | 661 | 662 | 663 | 664 | 665 | 666 | 667 | 668 | 669 | 670 | 671 | 672 | 673 | 674 | 675 | 676 | 677 | 678 | 679 | 680 | 681 | 682 | 683 | 684 | 685 | 686 | 687 | 688 | 689 | 690 | 691 | 692 | 693 | --------------------------------------------------------------------------------