1 /*
2 * Copyright 1999, 2002 Michael J. Roberts
3 *
4 * Please see the accompanying license file, LICENSE.TXT, for information
5 * on using and copying this software.
6 */
7 /*
8 * Write test T3 image file.
9 */
10
11 #include <stdlib.h>
12 #include <stdio.h>
13
14 #include "t3std.h"
15 #include "vmfile.h"
16 #include "vmwrtimg.h"
17 #include "t3test.h"
18
19 /*
20 * display an argument and exit
21 */
errexit(const char * msg)22 static void errexit(const char *msg)
23 {
24 printf("%s\n", msg);
25 exit(1);
26 }
27
main(int argc,char ** argv)28 int main(int argc, char **argv)
29 {
30 CVmFile *fp = 0;
31 CVmImageWriter *volatile iw = 0;
32
33 /* initialize for testing */
34 test_init();
35
36 /* initialize error stack */
37 err_init(1024);
38
39 /* check arguments */
40 if (argc != 2)
41 errexit("usage: test_write <output-file>");
42
43 /* open the file */
44 fp = new CVmFile();
45
46 err_try
47 {
48 static const char *meta[] =
49 {
50 "tads-object"
51 };
52 static const char *bif[] =
53 {
54 "tads/030000"
55 };
56 static const unsigned char code0[] =
57 {
58 /*
59 * method header
60 */
61 0x00, /* parameter count */
62 0x00, /* reserved */
63 0x02, 0x00, /* local variable count */
64 0x20, 0x00, /* maximum stack usage */
65 0x00, 0x00, /* exception table offset */
66 0x00, 0x00, /* debugging records offset */
67 0x00, 0x00, 0x00, 0x00, /* defining object */
68
69 /*
70 * code
71 */
72
73 // local i; // -> local #0
74 // local j; // -> local #1
75 //
76 // say('hello, world!\n');
77 0x05, 0x00, 0x00, 0x00, 0x00, // pushstr 0x00000000
78 0xB1, 0x00, 0x01, // builtin_a 0
79
80 // for (i := 1 ; i < 100 ; ++i)
81 // {
82 0xDA, 0x00, // onelcl1 0
83 // $1:
84 0x80, 0x00, // getlcl1 0
85 0x03, 0x64, // pushint8 100
86 0x96, 0x29, 0x00, // jgt $2 ; +41
87
88 // j := i*3;
89 0x80, 0x00, // getlcl1 0
90 0x03, 0x03, // pushint8 3
91 0x24, // mul
92 0xE0, 0x01, // setlcl1 1
93
94 // say('i = ' + i + ', j = ' + j + '\n');
95 0x05, 0x10, 0x00, 0x00, 0x00, // pushstr 0x00000010
96 0x80, 0x00, // getlcl1 0
97 0x22, // add
98 0x05, 0x16, 0x00, 0x00, 0x00, // pushstr 0x00000016
99 0x22, // add
100 0x80, 0x01, // getlcl1 1
101 0x22, // add
102 0x05, 0x1E, 0x00, 0x00, 0x00, // pushstr 0x0000001E
103 0x22, // add
104 0xB1, 0x00, 0x01, // builtin_a 0
105
106 // } // end of for
107 0xD0, 0x00, 0x00, // inclcl 0
108 0x91, 0xD4, 0xFF, // jmp $1 ; -44
109 // $2:
110
111 // END OF FUNCTION
112 0x51 // retnil
113 };
114 static const unsigned char const0[] =
115 {
116 /* 0 = 0x0000 */
117 /* string "hello, world!\n" */
118 0x0E, 0x00, // length = 14
119 'h', 'e', 'l', 'l', 'o', ',', ' ',
120 'w', 'o', 'r', 'l', 'd', '!', 0x0A,
121
122 /* 16 = 0x0010 */
123 /* string "i = " */
124 0x04, 0x00, // length = 4
125 'i', ' ', '=', ' ',
126
127 /* 22 = 0x0016 */
128 /* string ", j = " */
129 0x06, 0x00, // length = 6
130 ',', ' ', 'j', ' ', '=', ' ',
131
132 /* 30 = 0x001E */
133 /* string "\n" */
134 0x01, 0x00, // length = 1
135 0x0A
136 };
137 static const char tool_data[4] = { 't', 'e', 's', 't' };
138
139 /* open the output file */
140 fp->open_write(argv[1], OSFTT3IMG);
141
142 /* create an image writer */
143 iw = new CVmImageWriter(fp);
144
145 /* start the file */
146 iw->prepare(1, tool_data);
147
148 /* write the entrypoint - enter at code offset zero */
149 iw->write_entrypt(0, 14, 10, 10, 2, 6, 1);
150
151 /* write an empty function set dependency table */
152 iw->write_func_dep(bif, sizeof(bif)/sizeof(bif[0]));
153
154 /* write our metaclass dependency table */
155 iw->write_meta_dep(meta, sizeof(meta)/sizeof(meta[0]));
156
157 /* write our code pool definition and pages */
158 iw->write_pool_def(1, 1, 4096, TRUE);
159 iw->write_pool_page(1, 0, (const char *)code0, sizeof(code0),
160 TRUE, 0);
161
162 /* write the constant pool definition and pages */
163 iw->write_pool_def(2, 1, 4096, TRUE);
164 iw->write_pool_page(2, 0, (const char *)const0, sizeof(const0),
165 TRUE, 0);
166
167 /* finish the image file data */
168 iw->finish();
169 }
170 err_catch(exc)
171 {
172 printf("exception caught: %d\n", exc->get_error_code());
173 }
174 err_end;
175
176 /* delete the image writer */
177 if (iw != 0)
178 delete iw;
179
180 /* release our file object */
181 if (fp != 0)
182 delete fp;
183
184 /* delete the error context */
185 err_terminate();
186
187 /* done */
188 return 0;
189 }
190
191