blob: 7a46269a17586173b81805adf270bbffb5cca42c [file] [log] [blame]
adamdunkelsca9ddcb2003-03-19 14:13:31 +00001/*
2 * Copyright (c) 2002, Adam Dunkels.
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above
11 * copyright notice, this list of conditions and the following
12 * disclaimer in the documentation and/or other materials provided
13 * with the distribution.
adamdunkels1e45c6d2003-09-02 21:47:27 +000014 * 3. The name of the author may not be used to endorse or promote
adamdunkelsca9ddcb2003-03-19 14:13:31 +000015 * products derived from this software without specific prior
16 * written permission.
17 *
18 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
19 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
20 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
22 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
23 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
24 * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
25 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
26 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
27 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
28 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 *
30 * This file is part of the Contiki desktop environment for the C64.
31 *
adamdunkels1e45c6d2003-09-02 21:47:27 +000032 * $Id: petsciiconv.c,v 1.3 2003/09/02 21:47:28 adamdunkels Exp $
adamdunkelsca9ddcb2003-03-19 14:13:31 +000033 *
34 */
35
adamdunkels0b3eeba2003-08-24 22:39:15 +000036/*
adamdunkelsca9ddcb2003-03-19 14:13:31 +000037static unsigned char petscii2ascii[128] = {
38 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,
39 0x14,0x09,0x0d,0x11,0x93,0x0a,0x0e,0x0f,
40 0x10,0x0b,0x12,0x13,0x08,0x15,0x16,0x17,
41 0x18,0x19,0x1a,0x1b,0x1c,0x1d,0x1e,0x1f,
42 0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,
43 0x28,0x29,0x2a,0x2b,0x2c,0x2d,0x2e,0x2f,
44 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,
45 0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f,
46 0x40,0x61,0x62,0x63,0x64,0x65,0x66,0x67,
47 0x68,0x69,0x6a,0x6b,0x6c,0x6d,0x6e,0x6f,
48 0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,
49 0x78,0x79,0x7a,0x5b,0x5c,0x5d,0x7e,0x5f,
50 0xc0,0xc1,0xc2,0xc3,0xc4,0xc5,0xc6,0xc7,
51 0xc8,0xc9,0xca,0xcb,0xcc,0xcd,0xce,0xcf,
52 0xd0,0xd1,0xd2,0xd3,0xd4,0xd5,0xd6,0xd7,
53 0xd8,0xd9,0xda,0xdb,0xdc,0xdd,0x7e,0xdf
54};
adamdunkels0b3eeba2003-08-24 22:39:15 +000055*/
adamdunkelsca9ddcb2003-03-19 14:13:31 +000056
57static unsigned char ascii2petscii[128] = {
58 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,
59 0x14,0x09,0x0d,0x11,0x93,0x0a,0x0e,0x0f,
60 0x10,0x0b,0x12,0x13,0x08,0x15,0x16,0x17,
61 0x18,0x19,0x1a,0x1b,0x1c,0x1d,0x1e,0x1f,
62 0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,
63 0x28,0x29,0x2a,0x2b,0x2c,0x2d,0x2e,0x2f,
64 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,
65 0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f,
66 0x40,0xc1,0xc2,0xc3,0xc4,0xc5,0xc6,0xc7,
67 0xc8,0xc9,0xca,0xcb,0xcc,0xcd,0xce,0xcf,
68 0xd0,0xd1,0xd2,0xd3,0xd4,0xd5,0xd6,0xd7,
69 0xd8,0xd9,0xda,0x5b,0x5c,0x5d,0x5e,0x5f,
70 0xc0,0x41,0x42,0x43,0x44,0x45,0x46,0x47,
71 0x48,0x49,0x4a,0x4b,0x4c,0x4d,0x4e,0x4f,
72 0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,
73 0x58,0x59,0x5a,0xdb,0xdd,0xdd,0x5e,0xdf,
74};
75
76static unsigned int i;
77static unsigned char *ptr;
78
79/*-----------------------------------------------------------------------------------*/
80void
81petsciiconv_toascii(char *buf, unsigned int len)
82{
adamdunkels0b3eeba2003-08-24 22:39:15 +000083 static char c;
84
adamdunkelsca9ddcb2003-03-19 14:13:31 +000085 ptr = buf;
86 for(i = len; i > 0; --i) {
adamdunkels0b3eeba2003-08-24 22:39:15 +000087 c = *ptr;
88 if(c == 0x0a) {
89 c = 0x0d;
90 } else if(c == 0x0d) {
91 c = 0x0a;
92 }
93 switch (c & 0xe0) {
94 case 0x40:
95 case 0x60:
96 c ^= 0x20;
97 break;
98 case 0xc0:
99 c ^= 0x80;
100 break;
101 }
102 *ptr = c & 0x7f;
adamdunkelsca9ddcb2003-03-19 14:13:31 +0000103 ++ptr;
104 }
105}
106/*-----------------------------------------------------------------------------------*/
107void
108petsciiconv_topetscii(char *buf, unsigned int len)
109{
110 ptr = buf;
111 for(i = len; i > 0; --i) {
112 *ptr = ascii2petscii[*ptr & 0x7f];
113 ++ptr;
114 }
115}
116/*-----------------------------------------------------------------------------------*/