73 lines
2.3 KiB
Ada
73 lines
2.3 KiB
Ada
|
--
|
||
|
-- 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; either version 2 of the License, or
|
||
|
-- (at your option) any later version.
|
||
|
--
|
||
|
-- 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:
|