OSDN Git Service

7e4a5173bca6134f3ace90eb53ba0b6ca0fff9b4
[heavyosecpu/HeavyOSECPU.git] / usetek.c
1 \r
2 #include "osecpu.h"\r
3 #if (USE_TEK5 != 0)\r
4 /*----For using tek Begin----*/\r
5 #include "tek.h"\r
6 \r
7 int appackSub2(const UCHAR **pp, char *pif)\r
8 {\r
9         int r = 0;\r
10         const UCHAR *p = *pp;\r
11         if (*pif == 0) {\r
12                 r = *p >> 4;\r
13         } else {\r
14                 r = *p & 0x0f;\r
15                 p++;\r
16                 *pp = p;\r
17         }\r
18         *pif ^= 1;\r
19         \r
20         return r;\r
21 }\r
22 \r
23 int appackSub3u(const UCHAR **pp, char *pif)\r
24 {\r
25         int r = 0, i;\r
26         \r
27         r = appackSub2(pp, pif);\r
28         if (0x8 <= r && r <= 0xb) {\r
29                 r = r << 4 | appackSub2(pp, pif);\r
30                 r &= 0x3f;\r
31         } else if (0xc <= r && r <= 0xd) {\r
32                 r = r << 4 | appackSub2(pp, pif);\r
33                 r = r << 4 | appackSub2(pp, pif);\r
34                 r &= 0x1ff;\r
35         } else if (r == 0xe) {\r
36                 r = appackSub2(pp, pif);\r
37                 r = r << 4 | appackSub2(pp, pif);\r
38                 r = r << 4 | appackSub2(pp, pif);\r
39         } else if (r == 0x7) {\r
40                 i = appackSub3u(pp, pif);\r
41                 r = 0;\r
42                 while (i > 0) {\r
43                         r = r << 4 | appackSub2(pp, pif);\r
44                         i--;\r
45                 }\r
46         }\r
47         \r
48         return r;\r
49 }\r
50 \r
51 int tek5Decomp(UCHAR *buf, UCHAR *buf1, UCHAR *tmp)\r
52 {\r
53         static char tek5head[16] = {\r
54                 0x89, 0xff, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00,\r
55                 0x4f, 0x53, 0x41, 0x53, 0x4b, 0x43, 0x4d, 0x50\r
56         };\r
57         memcpy(tmp, tek5head, 16);\r
58         UCHAR *q = tmp + 16;\r
59         char iif = 0;\r
60         int i, tmpsiz;\r
61         const UCHAR *p = &buf[1];\r
62         i = appackSub3u(&p, &iif);\r
63         tmpsiz = appackSub3u(&p, &iif);\r
64         tmpsiz = tmpsiz << 8 | *p++;\r
65         *q++ = (tmpsiz >> 27) & 0xfe;\r
66         *q++ = (tmpsiz >> 20) & 0xfe;\r
67         *q++ = (tmpsiz >> 13) & 0xfe;\r
68         *q++ = (tmpsiz >>  6) & 0xfe;\r
69         *q++ = (tmpsiz << 1 | 1) & 0xff;\r
70         if (i == 1) *q++ = 0x15;\r
71         if (i == 2) *q++ = 0x19;\r
72         if (i == 3) *q++ = 0x21;\r
73         if (i >= 4) return -9;\r
74         while (p < buf1){\r
75                 *q++ = *p++;\r
76         }\r
77         if(tek_decomp(tmp, buf, tmpsiz) != 0){;\r
78                 // failed\r
79                 fputs("tek decomp error.\n", stderr);\r
80                 exit(1);\r
81         }\r
82         //success\r
83         return tmpsiz;\r
84 }\r
85 \r
86 /*----For using tek End----*/\r
87 #endif\r
88 \r