TListenerMips.java 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213
  1. /*
  2. * To change this license header, choose License Headers in Project Properties.
  3. * To change this template file, choose Tools | Templates
  4. * and open the template in the editor.
  5. */
  6. package target.mips;
  7. import API.Api;
  8. import API.Utils;
  9. import java.util.ArrayList;
  10. import java.util.HashMap;
  11. import template.TPLInterface;
  12. import template.TemplateCtx;
  13. import template.TemplateParser;
  14. /**
  15. *
  16. * @author EUGENIO CARVALHO
  17. */
  18. class TListenerMips extends template.TListener {
  19. public HashMap<String, TPLInterface> templates;
  20. // public int AddressGap = 1;
  21. public TListenerMips(TemplateCtx ctx, TemplateCtx gctx) {
  22. super(ctx, gctx);
  23. }
  24. @Override
  25. public void exitCall(TemplateParser.CallContext ctx) {
  26. ArrayList<String> arguments = ExecCall(ctx);
  27. if (Utils.Empty(this.returnCall)) {
  28. switch (ctx.ID().getText()) {
  29. case "OFFSET":
  30. this.returnCall = OFFSET(arguments);
  31. break;
  32. case "INSTHEX":
  33. this.returnCall = INSTHEX(arguments);
  34. break;
  35. case "INSTDEC":
  36. this.returnCall = INSTDEC(arguments);
  37. break;
  38. case "INSTBIN":
  39. this.returnCall = INSTBIN(arguments);
  40. break;
  41. case "BIN":
  42. this.returnCall = BIN(arguments);
  43. case "RBIN":
  44. this.returnCall = RBIN(arguments);
  45. break;
  46. }
  47. }
  48. }
  49. public String OFFSET(ArrayList<String> args) {
  50. return args.get(0) + "(" + args.get(1) + ")";
  51. }
  52. @Override
  53. protected String L(ArrayList<String> arguments) {
  54. // System.out.println("TemplateListener::" + arguments);
  55. String label = arguments.get(0).trim();
  56. if (label.equals("")) {
  57. return label;
  58. }
  59. String format,
  60. base = gctx.G("label." + label).split("\\+")[0],
  61. laddress = gctx.G(label);
  62. // System.out.printf("TemplateListener:{%s\n %s\n %s\n}\n", base, label, laddress);
  63. int value = Integer.parseInt(laddress);
  64. if (arguments.size() > 1) {
  65. format = arguments.get(1);
  66. } else {
  67. format = "dec";
  68. }
  69. int address = value;
  70. switch (ctx.G("type")) {
  71. case "J": // (j | jal) Salta para o endereco de destino
  72. // System.out.println(">>>>" + label + ":" + format + ":" + value + ":" + FormatNum(value, format));
  73. // address = valueint;
  74. break;
  75. case "I": // (bne...) Salta para posicao em relacao ao pc atual
  76. // System.out.println("I Branch:" + base + "->" + Integer.parseInt(gctx.G(base)) + ":" + label + ":" + value+":"+FormatNum(value, format));
  77. address = Integer.parseInt(gctx.G(base)) + value;
  78. // System.out.println("Tranalate>>>>>>>>> I:[" + address + "]" + ctx);
  79. // address -= Integer.parseInt(ctx.G("block.position"));
  80. break;
  81. default:
  82. System.out.println(String.format("Label type '%s' not defined", ctx.G("type")));
  83. }
  84. // address = address * this.AddressGap;
  85. // value = value * this.AddressGap;
  86. // System.out.println("============LaBEL:" + label + ":" + format + ":" + value + ":" + base);
  87. // System.out.println("============LaBEL:" + value + ":" + address);
  88. return laddress.trim().equals("")
  89. ? ""
  90. : (FormatNum(address, format) + " <" + base + "+0x" + FormatNum(value, format) + ">");
  91. }
  92. // Converte um binario para hex
  93. protected String INSTHEX(ArrayList<String> arguments) {
  94. try {
  95. String bin = INSTBIN(arguments);
  96. if (Utils.Empty(bin)) {
  97. return "";
  98. }
  99. String hex = PAD(Long.toString(Long.parseLong(bin, 2), 16), "0", 8);
  100. ctx.Set("inst.hex", hex);
  101. return hex;
  102. } catch (Exception e) {
  103. if (ctx.G("inst").equals("bgtz")) {
  104. System.out.println("hex-Error:" + e.getMessage());
  105. e.printStackTrace();
  106. }
  107. return "error!";
  108. }
  109. }
  110. protected String INSTDEC(ArrayList<String> arguments) {
  111. try {
  112. String bin = INSTBIN(arguments);
  113. if (Utils.Empty(bin)) {
  114. return "";
  115. }
  116. String hex = PAD(Long.toString(Long.parseLong(bin, 2), 10), "0", 10);
  117. ctx.Set("inst.hex", hex);
  118. return hex;
  119. } catch (Exception e) {
  120. if (ctx.G("inst").equals("bgtz")) {
  121. System.out.println("hex-Error:" + e.getMessage());
  122. e.printStackTrace();
  123. }
  124. return "error!";
  125. }
  126. }
  127. protected String INSTBIN(ArrayList<String> arguments) {
  128. String type = ctx.G("type");
  129. if (type.equals("label")) {
  130. return "";
  131. }
  132. //
  133. switch (type) {
  134. case "S": // (j | jal) Salta para o endereco de destino
  135. // System.out.println("instbin:" + ctx);
  136. break;
  137. case "J": // (j | jal) Salta para o endereco de destino
  138. ctx.Set("target", BIN(gctx.G(ctx.G("label")), 26));
  139. break;
  140. case "I": // (bne...) Salta para posicao em relacao ao pc atual
  141. if (ctx.G("offset").equals("") && !ctx.G("label").equals("")) {
  142. int target = Integer.parseInt(gctx.G(ctx.G("label")));
  143. int position = Integer.parseInt(ctx.G("global.position")) + 1;
  144. // System.out.println("INSTBIN:->" + FormatNum(target - position, "hex"));
  145. ctx.Set("offset", (target - position) + "");
  146. }
  147. // System.out.println("INSTBIN[" + type + ":" + bin + "]:" + ctx);
  148. break;
  149. case "R": // (bne...) Salta para posicao em relacao ao pc atual
  150. // System.out.println("INSTBIN[" + type + "]:" + ctx);
  151. break;
  152. default:
  153. }
  154. String bin = templates.get("bin." + type).Render(ctx);
  155. ctx.Set("inst.bin", bin);
  156. // System.out.println("bin." + type + "::" + bin);
  157. return bin;
  158. }
  159. protected String BIN(ArrayList<String> arguments) {
  160. // System.out.println("BIN(" + arguments + ")");
  161. return BIN(arguments.get(0), arguments.get(1));
  162. }
  163. protected String BIN(String val, String pad) {
  164. return BIN(val, Integer.parseInt(pad));
  165. }
  166. protected String BIN(String val, int pad) {
  167. return Api.num2bin(val, pad);
  168. }
  169. protected String RBIN(ArrayList<String> arguments) {
  170. // System.out.println("RBIN(" + arguments + ")");
  171. String reg = arguments.get(0);
  172. if (reg.equals("")) {
  173. reg = "0";
  174. }
  175. if (!Utils.isNumber(reg)) {
  176. reg = Mips.Register(reg);
  177. }
  178. return Api.num2bin(reg, Integer.parseInt(arguments.get(1)));
  179. }
  180. }