View Javadoc

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()); // Give a default slot of 256K
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  //        Wimp.getInstance().spriteOp(11, "$.Volumes.Personal.Projects.ROBE.tools.examples.!FormText.!Sprites22");
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  //        File f = new File("/Volumes/Personal/Acorn/Graphics/Apps/DrawPlus/!DrawPlus/!RunImage");
69          File f = new File("/Volumes/Personal/Projects/ROBE/tools/examples/DrawPlus/!DrawPlus/!RunImage");
70  //        File f = new File("/Volumes/Personal/Projects/ROBE/tools/examples/wined/!WinEd/!RunImage");
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  //        OSExt.getInstance().writeEnv("gif2spr $.Volumes.Personal.Acorn.Graphics.Images.x-files", new Date());
88  //        setGccEnv();
89  
90  /* !DrawPlus */
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          /* !WinEd
94          IconSprites <Obey$Dir>.!Sprites
95          Set WinEd$Dir <Obey$Dir>
96          Set WinEd$Path Choices:Wined.,<WinEd$Dir>.
97          Set Alias$@RunType_FEC /<Wined$Dir>.!Run %%*0
98          final String winEdDir = "$.Volumes.Personal.Projects.ROBE.tools.examples.wined.!WinEd";
99          OS.getInstance().setVarVal("WinEd$Dir", winEdDir, 0);
100         OS.getInstance().setVarVal("WinEd$Path", "Choices:Wined.," + winEdDir + '.', 0);
101         OSExt.getInstance().writeEnv("!RunImage 4096", new Date());
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         // Turn SWI logging down
147         Logger.getLogger("com.tapina.robe.swi").setLevel(Level.WARNING);
148         // Turn Monitor logging up
149         Logger.getLogger("com.tapina.robe.runtime").setLevel(Level.FINEST);
150 
151         setEnvironment();
152 
153         go(image, 0x8000, 0x8000);
154     }
155 
156 
157 }