1 package com.tapina.robe.runtime;
2
3 import com.tapina.robe.module.ModuleUtils;
4 import com.tapina.robe.swi.*;
5
6 import java.io.File;
7 import java.io.FileInputStream;
8 import java.io.FileOutputStream;
9 import java.io.IOException;
10 import java.util.Date;
11 import java.util.logging.Level;
12 import java.util.logging.Logger;
13
14 /***
15 * Created by IntelliJ IDEA.
16 * User: gareth
17 * Date: Aug 26, 2003
18 * Time: 12:18:19 PM
19 */
20 public final class Monitor {
21 private static final Logger log = Logger.getLogger(Monitor.class.getName());
22 private static long startTime;
23
24 private static void go(byte[] image, int loadAddress, int execAddress) {
25 Environment env = new Environment(loadAddress, image);
26 Wimp.getInstance().setSlotSize(512 * 1024, env.getMemoryMap());
27 startTime = System.currentTimeMillis();
28 try {
29 CodeBlock codeBlock;
30 final int[] R = env.getCpu().R;
31 R[15] = execAddress;
32 while (true) {
33 final int pc = env.getCpu().getPC();
34 codeBlock = env.getMemoryMap().addEntryPoint(pc);
35 R[15] += 8;
36 if (pc == 0x8004) {
37 FileOutputStream out = new FileOutputStream("Unsqueezed");
38 out.write(((RawDataBlock) env.getMemoryMap().getDataBlock(0x8000)).getBytes());
39 out.close();
40 }
41 codeBlock.execute(env);
42 log.finer("Exiting block at " + Integer.toHexString(pc) + " and going to " + Integer.toHexString(env.getCpu().getPC()));
43 }
44 } catch (Exception e) {
45 e.printStackTrace(System.out);
46 log.info("CPU: " + env.getCpu().toString());
47 log.info("Memory map: " + env.getMemoryMap().toString());
48 }
49 }
50
51 /***
52 * LOAD ANY REQUIRED RESOURCES HERE.
53 * NOTE THAT SWI CALLS EXPECT RISC OS-FORMAT PATHS.
54 * e.g. Wimp.getInstance().spriteOp(11, "$.DrawPlus.!DrawPlus.!Sprites22");
55 */
56 private static void loadResources() {
57
58 Wimp.getInstance().spriteOp(11, "$.Volumes.Personal.Projects.ROBE.tools.examples.DrawPlus.!DrawPlus.!Sprites22");
59 }
60
61 /***
62 * LOAD THE PROGRAM IMAGE HERE.
63 * NOTE THAT THIS IS A JAVA CALL SO A NATIVE PATH SHOULD BE USED.
64 * e.g. File f = new File("/DrawPlus/!DrawPlus/!RunImage");
65 * @return File data in a byte array
66 */
67 private static byte[] loadImage() throws IOException {
68
69 File f = new File("/Volumes/Personal/Projects/ROBE/tools/examples/DrawPlus/!DrawPlus/!RunImage");
70
71 long len = f.length();
72 byte image[] = new byte[(int) len];
73 FileInputStream inputStream = new FileInputStream(f);
74 inputStream.read(image);
75 inputStream.close();
76 return image;
77 }
78
79 /***
80 * WRITE THE PROGRAM'S ENVIRONMENT HERE.
81 * THIS ALLOWS THE PROGRAM ACCESS TO ITS COMMAND LINE AND START TIME.
82 * e.g. OSExt.getInstance().writeEnv("!RunImage -depth 4,4,8", new Date());
83 * YOU MAY ALSO WISH TO SET VARIABLE VALUES.
84 * e.g. OS.getInstance().setVarVal("My$Dir", "$.Foo", 0);
85 */
86 private static void setEnvironment() {
87
88
89
90
91 OS.getInstance().setVarVal("DrawPlus$Dir", "$.Volumes.Personal.Projects.ROBE.tools.examples.DrawPlus.!DrawPlus", 0);
92 OSExt.getInstance().writeEnv("!RunImage -mask 4,8,0", new Date());
93
94
95
96
97
98
99
100
101
102
103
104 }
105
106 private static void setGccEnv() {
107 final OS os = OS.getInstance();
108 final String gccDir = "$.Volumes.Personal.Projects.ROBE.tools.gcc.!gcc";
109 os.setVarVal("GCC$Dir", gccDir, 0);
110 os.setVarVal("Run$Path", "GCCbin:", 0);
111 os.setVarVal("GCCbin$Path", gccDir + ".bin.", 0);
112 os.setVarVal("GCCpkg$Path", gccDir + ".", 0);
113 os.setVarVal("GCCsys$Path", gccDir + ".sys.", 0);
114 os.setVarVal("GCClcl$Path", gccDir + ".local.", 0);
115 os.setVarVal("Sys$RCLimit", "65536", 0);
116 os.setVarVal("UnixFS$/tmp", "$.private.tmp", 0);
117 final String sfix = "f:for:F:fpp:cc:cxx:cpp:c++:C:ii:rpo:ads:adb:ada:c:m:h:i:s:S:ali:adc:xrb:xrs:l:o:p:pas:ph:gpi:gpc:y:tcc";
118 os.setVarVal("UnixEnv$gcc$sfix", sfix, 0);
119 os.setVarVal("UnixEnv$cc1$sfix", sfix, 0);
120 os.setVarVal("UnixEnv$cc1plus$sfix", sfix, 0);
121 os.setVarVal("UnixEnv$cpp$sfix", sfix, 0);
122 os.setVarVal("UnixEnv$g++$sfix", sfix, 0);
123 os.setVarVal("UnixEnv$g77$sfix", sfix, 0);
124 os.setVarVal("UnixEnv$f771$sfix", sfix, 0);
125 os.setVarVal("UnixEnv$gcov$sfix", sfix, 0);
126 os.setVarVal("UnixEnv$make$sfix", sfix, 0);
127 os.setVarVal("UnixEnv$as$sfix", "h:S:s:o", 0);
128 os.setVarVal("GNATada$Path", gccDir + ".adainc.", 0);
129 os.setVarVal("GNATInc$Path", "gnatada:1.,gnatada:2.,gnatada:3.,gnatada:4.,gnatada:5.,gnatada:6.,gnatada:7.", 0);
130 os.setVarVal("GNATlib$Path", "gcc:adalib.1.,gcc:adalib.2.,gcc:adalib.3.,gcc:adalib.4.,gcc:adalib.5.,gcc:adalib.6.,gcc:adalib.7.", 0);
131 os.setVarVal("Path", "<Run$Path>", 2);
132 }
133
134 public static void main(String[] args) throws Exception {
135 Runtime.getRuntime().addShutdownHook(new Thread() {
136 public void run() {
137 final long executionTime = (System.currentTimeMillis() - startTime);
138 log.info("Executed " + Instruction.count + " instructions in " + executionTime + "ms" +
139 " = " + ((double) Instruction.count * 1000 / ((double) executionTime)) + "/s");
140 }
141 });
142
143 loadResources();
144 byte[] image = loadImage();
145
146
147 Logger.getLogger("com.tapina.robe.swi").setLevel(Level.WARNING);
148
149 Logger.getLogger("com.tapina.robe.runtime").setLevel(Level.FINEST);
150
151 setEnvironment();
152
153 go(image, 0x8000, 0x8000);
154 }
155
156
157 }