00001 /* 00002 * Copyright (c) 2002, Adam Dunkels. 00003 * All rights reserved. 00004 * 00005 * Redistribution and use in source and binary forms, with or without 00006 * modification, are permitted provided that the following conditions 00007 * are met: 00008 * 1. Redistributions of source code must retain the above copyright 00009 * notice, this list of conditions and the following disclaimer. 00010 * 2. Redistributions in binary form must reproduce the above 00011 * copyright notice, this list of conditions and the following 00012 * disclaimer in the documentation and/or other materials provided 00013 * with the distribution. 00014 * 3. The name of the author may not be used to endorse or promote 00015 * products derived from this software without specific prior 00016 * written permission. 00017 * 00018 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS 00019 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 00020 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 00021 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY 00022 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 00023 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE 00024 * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 00025 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 00026 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 00027 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 00028 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 00029 * 00030 * This file is part of the Contiki desktop environment for the C64. 00031 * 00032 * $Id: petsciiconv.c,v 1.2 2010/01/31 23:46:19 oliverschmidt Exp $ 00033 * 00034 */ 00035 00036 /* 00037 static unsigned char petscii2ascii[128] = { 00038 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07, 00039 0x14,0x09,0x0d,0x11,0x93,0x0a,0x0e,0x0f, 00040 0x10,0x0b,0x12,0x13,0x08,0x15,0x16,0x17, 00041 0x18,0x19,0x1a,0x1b,0x1c,0x1d,0x1e,0x1f, 00042 0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27, 00043 0x28,0x29,0x2a,0x2b,0x2c,0x2d,0x2e,0x2f, 00044 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37, 00045 0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f, 00046 0x40,0x61,0x62,0x63,0x64,0x65,0x66,0x67, 00047 0x68,0x69,0x6a,0x6b,0x6c,0x6d,0x6e,0x6f, 00048 0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77, 00049 0x78,0x79,0x7a,0x5b,0x5c,0x5d,0x7e,0x5f, 00050 0xc0,0xc1,0xc2,0xc3,0xc4,0xc5,0xc6,0xc7, 00051 0xc8,0xc9,0xca,0xcb,0xcc,0xcd,0xce,0xcf, 00052 0xd0,0xd1,0xd2,0xd3,0xd4,0xd5,0xd6,0xd7, 00053 0xd8,0xd9,0xda,0xdb,0xdc,0xdd,0x7e,0xdf 00054 }; 00055 */ 00056 00057 static unsigned char ascii2petscii[128] = { 00058 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07, 00059 0x14,0x09,0x0d,0x11,0x93,0x0a,0x0e,0x0f, 00060 0x10,0x0b,0x12,0x13,0x08,0x15,0x16,0x17, 00061 0x18,0x19,0x1a,0x1b,0x1c,0x1d,0x1e,0x1f, 00062 0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27, 00063 0x28,0x29,0x2a,0x2b,0x2c,0x2d,0x2e,0x2f, 00064 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37, 00065 0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f, 00066 0x40,0xc1,0xc2,0xc3,0xc4,0xc5,0xc6,0xc7, 00067 0xc8,0xc9,0xca,0xcb,0xcc,0xcd,0xce,0xcf, 00068 0xd0,0xd1,0xd2,0xd3,0xd4,0xd5,0xd6,0xd7, 00069 0xd8,0xd9,0xda,0x5b,0x5c,0x5d,0x5e,0x5f, 00070 0xc0,0x41,0x42,0x43,0x44,0x45,0x46,0x47, 00071 0x48,0x49,0x4a,0x4b,0x4c,0x4d,0x4e,0x4f, 00072 0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57, 00073 0x58,0x59,0x5a,0xdb,0xdd,0xdd,0x5e,0xdf, 00074 }; 00075 00076 static unsigned int i; 00077 static unsigned char *ptr; 00078 00079 /*-----------------------------------------------------------------------------------*/ 00080 void 00081 petsciiconv_toascii(char *buf, unsigned int len) 00082 { 00083 static char c; 00084 00085 ptr = buf; 00086 for(i = len; i > 0; --i) { 00087 c = *ptr; 00088 if(c == 0x0a) { 00089 c = 0x0d; 00090 } else if(c == 0x0d) { 00091 c = 0x0a; 00092 } 00093 if(c != 0x40) { 00094 switch (c & 0xe0) { 00095 case 0x40: 00096 case 0x60: 00097 c ^= 0x20; 00098 break; 00099 case 0xc0: 00100 c ^= 0x80; 00101 break; 00102 } 00103 } 00104 *ptr = c & 0x7f; 00105 ++ptr; 00106 } 00107 } 00108 /*-----------------------------------------------------------------------------------*/ 00109 void 00110 petsciiconv_topetscii(char *buf, unsigned int len) 00111 { 00112 ptr = buf; 00113 for(i = len; i > 0; --i) { 00114 *ptr = ascii2petscii[*ptr & 0x7f]; 00115 ++ptr; 00116 } 00117 } 00118 /*-----------------------------------------------------------------------------------*/