--
-- Copyright (C) 2015 secunet Security Networks AG
--
-- This program is free software; you can redistribute it and/or modify
-- it under the terms of the GNU General Public License as published by
-- the Free Software Foundation; version 2 of the License.
--
-- This program is distributed in the hope that it will be useful,
-- but WITHOUT ANY WARRANTY; without even the implied warranty of
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-- GNU General Public License for more details.
--

with System;
with System.Machine_Code;

package body HW.Port_IO
with
   Refined_State  => (State => null),
   SPARK_Mode     => Off
is

   generic
      type Word is private;
   procedure Port_In (Value : out Word; Port : Port_Type);

   procedure Port_In (Value : out Word; Port : Port_Type) is
   begin
      System.Machine_Code.Asm
        ("in %1, %0",
         Inputs   => (Port_Type'Asm_Input ("Nd", Port)),
         Outputs  => (Word'Asm_Output ("=a", Value)),
         Volatile => True);
   end Port_In;

   procedure InB_Body is new Port_In (Word => Word8);
   procedure InB (Value : out Word8; Port : Port_Type) renames InB_Body;

   procedure InW_Body is new Port_In (Word => Word16);
   procedure InW (Value : out Word16; Port : Port_Type) renames InW_Body;

   procedure InL_Body is new Port_In (Word => Word32);
   procedure InL (Value : out Word32; Port : Port_Type) renames InL_Body;

   ----------------------------------------------------------------------------

   generic
      type Word is private;
   procedure Port_Out (Port : Port_Type; Value : Word);

   procedure Port_Out (Port : Port_Type; Value : Word) is
   begin
      System.Machine_Code.Asm
        ("out %1, %0",
         Inputs   => (Port_Type'Asm_Input ("Nd", Port),
                      Word'Asm_Input ("a", Value)),
         Volatile => True);
   end Port_Out;

   procedure OutB_Body is new Port_Out (Word => Word8);
   procedure OutB (Port : Port_Type; Value : Word8) renames OutB_Body;

   procedure OutW_Body is new Port_Out (Word => Word16);
   procedure OutW (Port : Port_Type; Value : Word16) renames OutW_Body;

   procedure OutL_Body is new Port_Out (Word => Word32);
   procedure OutL (Port : Port_Type; Value : Word32) renames OutL_Body;

end HW.Port_IO;

--  vim: set ts=8 sts=3 sw=3 et:
