1 // Build don't link:
2 // Special g++ Options: -O
3 // GROUPS passed old-abort
4 typedef unsigned char uchar;
5 typedef unsigned short ushort;
6 typedef unsigned long ulong;
7 extern int swap_endian;
8 inline ushort
swapshort(ushort value)9 swapshort(ushort value)
10 {
11 value &= 0xffff;
12 return ((value << 8) | (value >> 8));
13 }
14 struct eshort
15 {
16 ushort data;
ushorteshort17 operator ushort() { return swap_endian ? swapshort(data) : data;}
eshorteshort18 eshort(ushort t) { data = swap_endian ? swapshort(t) : t;}
eshorteshort19 eshort() {}
20 };
21 inline ulong
swaplong(ulong value)22 swaplong(ulong value)
23 {
24 ulong v = (value << 16) | (value >> 16);
25 return ((v >> 8) & 0x00ff00ff) | ((v << 8) & 0xff00ff00);
26 };
27 struct elong
28 {
29 ulong data;
ulongelong30 operator ulong() { return swap_endian ? swaplong(data) : data;}
elongelong31 elong(ulong t) { data = swap_endian ? swaplong(t) : t; }
elongelong32 elong() {}
33 };
34 struct digiheader
35 {
36 uchar type[2];
37 eshort soft_version;
38 eshort lo_boot_rev;
39 eshort hi_boot_rev;
40 eshort load_segment;
41 eshort length;
42 eshort exec_start;
43 eshort image_offset;
44 elong startup_code[2];
45 elong checksum;
46 };
47 extern void uncompress(uchar* buf, ulong len);
48 extern ulong compress(char* filename, uchar* buffer, ulong);
49 struct filehdr
50 {
51 eshort f_magic;
52 eshort f_nscns;
53 elong f_timdat;
54 elong f_symptr;
55 elong f_nsyms;
56 eshort f_opthdr;
57 eshort f_flags;
58 };
59 struct aouthdr
60 {
61 eshort magic;
62 eshort vstamp;
63 elong tsize;
64 elong dsize;
65 elong bsize;
66 elong entry;
67 elong text_start;
68 elong data_start;
69 elong bss_start;
70 elong gprmask;
71 elong cprmask[4];
72 elong gp_value;
73 };
74 struct scnhdr
75 {
76 char s_name[8];
77 elong s_paddr;
78 elong s_vaddr;
79 elong s_size;
80 elong s_scnptr;
81 elong s_relptr;
82 elong s_lnnoptr;
83 eshort s_nreloc;
84 eshort s_nlnno;
85 elong s_flags;
86 };
87 int file_little_endian;
88 int host_little_endian;
89 int swap_endian;
90 int docheck;
91 int expand;
92 ulong memsize;
93 ulong compression_quality;
94 char *compressfile;
95 int debug_level;
96 extern "C" int getopt (int, char**, char*);
97 int
main(int argc,char ** argv)98 main(int argc, char** argv)
99 {
100 uchar checksum;
101 uchar docrc;
102 ulong len;
103 ulong maxlen;
104 int i;
105 int c;
106 int magic;
107 int tsize;
108 int dsize;
109 int quality;
110 char dummy;
111 uchar* code;
112 uchar* buf;
113 char* ap;
114 digiheader *dh;
115 compression_quality = 10000;
116 docheck = 0;
117 while ((c = getopt(argc, argv, "Ccdf:k:q:x:")) != -1)
118 {
119 switch (c)
120 {
121 default:
122 goto usage;
123 }
124 }
125 if ((expand && (docheck || compressfile || quality)) ||
126 (quality && !compressfile))
127 {
128 usage:
129 return(2);
130 }
131 if (compressfile)
132 {
133 dh->image_offset = len;
134
135 len += compress(compressfile, code + len, maxlen - len);
136 }
137 }
138