FoxIntermediateAssembler.Mod 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. MODULE FoxIntermediateAssembler; (** AUTHOR ""; PURPOSE ""; *)
  2. IMPORT IntermediateCode := FoxIntermediateCode, FoxAssembler, D := Debugging, Scanner := FoxScanner, Basic := FoxBasic;
  3. CONST Trace=FoxAssembler.Trace;
  4. TYPE
  5. Register* = LONGINT; (* index for InstructionSet.registers *)
  6. Operand* = IntermediateCode.Operand;
  7. TYPE
  8. Assembler*= OBJECT (FoxAssembler.Assembler)
  9. PROCEDURE Instruction*(CONST mnemonic: ARRAY OF CHAR);
  10. VAR i,numberOperands,mnem: LONGINT; pos: Basic.Position; VAR operands: ARRAY 3 OF Operand; instruction: IntermediateCode.Instruction;
  11. PROCEDURE ParseOperand;
  12. (* stub, must be overwritten by implementation *)
  13. VAR operand: IntermediateCode.Operand;
  14. result: FoxAssembler.Result;
  15. register1,register2:LONGINT;
  16. class1, class2: IntermediateCode.RegisterClass;
  17. stop,memory: BOOLEAN;
  18. BEGIN
  19. stop := FALSE;
  20. register1 := IntermediateCode.None;
  21. register2 := IntermediateCode.None;
  22. result.type := -1;
  23. result.value := 0;
  24. IF numberOperands >= 3 THEN Error(errorPosition,"too many operands")
  25. ELSE
  26. memory := ThisSymbol(Scanner.LeftBracket);
  27. IF (token.symbol = Scanner.Identifier) & IntermediateCode.DenotesRegister(token.identifierString,class1,register1) THEN
  28. NextToken;
  29. stop := ~ThisSymbol(Scanner.Plus);
  30. END;
  31. IF ~stop THEN
  32. IF (token.symbol = Scanner.Identifier) THEN
  33. IF IntermediateCode.DenotesRegister(token.identifierString,class2,register2) THEN
  34. NextToken;
  35. ELSIF GetNonConstant(errorPosition,token.identifierString,result) THEN
  36. NextToken;
  37. ELSIF Expression(result,FALSE) THEN
  38. END;
  39. ELSIF Expression(result,FALSE) THEN
  40. END;
  41. END;
  42. IF memory & ExpectSymbol(Scanner.RightBracket) THEN
  43. (*
  44. IntermediateCode.InitMemory(operand,register1,register2,result.value);
  45. *)
  46. ELSIF register1 # -1 THEN
  47. (*
  48. IntermediateCode.InitRegister(operand,0,register1);
  49. *)
  50. ELSE
  51. (*
  52. IntermediateCode.InitImmediate(operand,result.sizeInBits,result.value);
  53. *)
  54. END;
  55. (*
  56. IF result.fixup # NIL THEN
  57. IntermediateCode.AddFixup(operand,result.fixup);
  58. END;
  59. *)
  60. operands[numberOperands] := operand;
  61. END;
  62. END ParseOperand;
  63. BEGIN
  64. IF Trace THEN
  65. D.String("Instruction: "); D.String(mnemonic); D.String(" "); D.Ln;
  66. END;
  67. pos := errorPosition;
  68. mnem := IntermediateCode.FindMnemonic(mnemonic);
  69. IF mnem >= 0 THEN
  70. FOR i := 0 TO 2 DO IntermediateCode.InitOperand(operands[i]) END;
  71. numberOperands := 0;
  72. IF token.symbol # Scanner.Ln THEN
  73. REPEAT
  74. ParseOperand;
  75. INC(numberOperands);
  76. UNTIL error OR ~ThisSymbol(Scanner.Comma);
  77. END;
  78. IF ~error THEN
  79. IntermediateCode.InitInstruction(instruction, pos, SHORTINT(mnem), operands[0], operands[1], operands[2]);
  80. section.Emit(instruction);
  81. (*
  82. mnem,operands[0],operands[1],operands[2],section.resolved);
  83. *)
  84. END
  85. ELSE
  86. ErrorSS(pos,"unknown instruction ",mnemonic)
  87. END
  88. END Instruction;
  89. END Assembler;
  90. END FoxIntermediateAssembler.
  91. System.Free FoxInlineAssembler FoxInlineInstructionSet ~