hac_0.26.0_19beb1f4/src/compile/emit/hac_sys-targets-amd64_windows_console_fasm.ads

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
-------------------------------------------------------------------------------------
--
--  HAC - HAC Ada Compiler
--
--  A compiler in Ada for an Ada subset
--
--  Copyright, license, etc. : see top package.
--
-------------------------------------------------------------------------------------
--
--  This target is AMD64, Windows, using the Flat Assembler (FASM).
--  https://flatassembler.net/

with Ada.Containers.Vectors;
with HAT;

package HAC_Sys.Targets.AMD64_Windows_Console_FASM is

  type Machine is limited new Targets.Machine with private;

  --------------------
  --  Informations  --
  --------------------

  overriding function Name (m : Machine) return String is ("Windows 64 Console via FASM");
  overriding function CPU (m : Machine) return String is ("AMD64");
  overriding function OS (m : Machine) return String is ("Windows");
  overriding function Null_Terminated_String_Literals (m : Machine) return Boolean is (True);

  -------------------------------------------
  --  Initialize & Finalize Code Emission  --
  -------------------------------------------

  overriding procedure Initialize_Code_Emission (m : in out Machine);
  overriding procedure Finalize_Code_Emission
    (m       : in out Machine;
     strings :        String);

  ----------------------------
  --  Machine Instructions  --
  ----------------------------

  overriding procedure Emit_Arithmetic_Binary_Instruction
    (m         : in out Machine;
     operator  :        Defs.Arithmetic_Binary_Operator;
     base_typ  :        Defs.Numeric_Typ);

  overriding procedure Emit_Halt (m : in out Machine);

  overriding procedure Emit_Push_Discrete_Literal
    (m : in out Machine; x : Defs.HAC_Integer);

  overriding procedure Emit_Push_Discrete_Literals
    (m : in out Machine; x, y : Defs.HAC_Integer);

  ----------------------------
  --  Built-In Subprograms  --
  ----------------------------

  overriding procedure Emit_HAT_Builtin_Procedure
    (m            : in out Machine;
     builtin_proc :        Defs.SP_Code;
     parameter    :        Defs.HAC_Integer);

  -------------
  --  Misc.  --
  -------------

  overriding function Assembler_File_Name (m : Machine) return String;

private

  type Instruction is
    (add,
     ccall,
     idiv,
     imul,
     mov,
     pop,
     push,
     push_immediate,
     stdcall,
     sub,
     xor_i);

  type Assembler_Line is record
    label     : HAT.VString := HAT.Null_VString;
    instr     : Instruction;
    operand_1 : HAT.VString := HAT.Null_VString;
    operand_2 : HAT.VString := HAT.Null_VString;
  end record;

  package Assembler_Buffers is new Ada.Containers.Vectors (Positive, Assembler_Line);

  type Machine is limited new Targets.Machine with record
    asm_file : HAT.File_Type;
    asm_buf  : Assembler_Buffers.Vector;
  end record;

end HAC_Sys.Targets.AMD64_Windows_Console_FASM;