| -- |
| -- 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: |