|
|
DataMuseum.dkPresents historical artifacts from the history of: Rational R1000/400 |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about Rational R1000/400 Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - download
Length: 6144 (0x1800)
Types: Ada Source
Notes: 03_class, FILE, R1k_Segment, e3_tag, package body Machine_Io, seg_04cc9e, seg_04cd87
└─⟦8527c1e9b⟧ Bits:30000544 8mm tape, Rational 1000, Arrival backup of disks in PAM's R1000
└─⟦cfc2e13cd⟧ »Space Info Vol 2«
└─⟦this⟧
with Device_Independent_Io;
with Io_Exceptions;
with System;
with Text_Io;
with Terminal_Specific;
package body Machine_Io is
function Blocked_Read return My_Types.Byte;
package Byte_Io is new Text_Io.Integer_Io (System.Byte); -- trace
F_In_Out : Terminal_Specific.File_Type;
Col : Natural; -- trace
Current_Level : Debug_Level := None;
Current_Timeout : Duration := 2.0;
procedure Set (Timeout : Duration) is
begin
Current_Timeout := Timeout;
end Set;
procedure Debug (Level : Debug_Level) is
begin
Current_Level := Level;
end Debug;
function Debug return String is
begin
return Debug_Level'Image (Current_Level);
end Debug;
procedure Open (With_Mode : Open_Mode) is
Mode : Device_Independent_Io.File_Mode;
begin
Col := 0; -- trace
case With_Mode is
when Read_Mode =>
Mode := Device_Independent_Io.In_File;
when Write_Mode =>
Mode := Device_Independent_Io.Out_File;
end case;
Device_Independent_Io.Open
(File => F_In_Out, Mode => Mode, Name => Io_Port, Form => "");
if With_Mode = Read_Mode then
Terminal_Specific.Input.Set_Editing
(File => F_In_Out, Mode => "None");
Terminal_Specific.Input.Set_Echo (File => F_In_Out, Echo => False);
else
-- AAAAARRGH ! le code 16#A# (LF) est accompagne d'un CR
Terminal_Specific.Output.Map_Lf_To_Crlf
(File => F_In_Out, Value => False);
end if;
exception
when Io_Exceptions.Use_Error =>
Close;
raise Open_Error;
end Open;
procedure Close is
begin
Device_Independent_Io.Close (File => F_In_Out);
if (Current_Level /= None) then
Text_Io.Put_Line ("");
end if;
end Close;
procedure Flush is
begin
Open (With_Mode => Read_Mode);
Terminal_Specific.Input.Flush (F_In_Out);
Close;
end Flush;
procedure Write (S : in My_Types.Byte_String) is
To_Send : System.Byte_String (1 .. S'Length);
begin
if (Current_Level /= None) then
Text_Io.Put_Line ("Write : ");
end if;
for K in S'Range loop
To_Send (K) := System.Byte (S (K));
if (Current_Level = Bytes) then
Byte_Io.Put (Item => To_Send (K), Width => 7, Base => 16);
if (K mod 10) = 0 then
Text_Io.Put_Line (""); -- trace
end if;
end if;
end loop;
Device_Independent_Io.Write (File => F_In_Out, Item => To_Send);
end Write;
function Read return My_Types.Byte is
Byte_Read : My_Types.Byte;
task Timed is
entry Start;
entry Read (Some_Byte : out My_Types.Byte);
end Timed;
task body Timed is
To_Read : My_Types.Byte;
begin
select
accept Start;
To_Read := Blocked_Read;
accept Read (Some_Byte : out My_Types.Byte) do
Some_Byte := To_Read;
end Read;
end select;
end Timed;
begin
Timed.Start;
select
Timed.Read (Byte_Read);
or
delay Current_Timeout;
abort Timed;
raise Read_Timeout;
end select;
return Byte_Read;
exception
-- La tache peut etre morte avant le RdV ! -> cable debranche pendant la lecture ...
when Tasking_Error =>
raise Read_Timeout;
end Read;
function Blocked_Read return My_Types.Byte is
Byte_Read : System.Byte;
begin
Device_Independent_Io.Read (File => F_In_Out, Item => Byte_Read);
if Current_Level /= None then
if Col = 0 then -- trace
Text_Io.Put_Line ("Read :");
end if;
end if;
Col := Col + 1; -- trace
if Current_Level = Bytes then
Byte_Io.Put (Item => Byte_Read, Width => 7, Base => 16); -- trace
if (Col mod 10) = 0 then
Text_Io.Put_Line (""); -- trace
end if;
end if;
return My_Types.Byte (Byte_Read);
end Blocked_Read;
end Machine_Io;
nblk1=5
nid=0
hdr6=a
[0x00] rec0=28 rec1=00 rec2=01 rec3=03e
[0x01] rec0=1d rec1=00 rec2=02 rec3=01e
[0x02] rec0=24 rec1=00 rec2=03 rec3=022
[0x03] rec0=26 rec1=00 rec2=04 rec3=012
[0x04] rec0=17 rec1=00 rec2=05 rec3=000
tail 0x217540cda874f6e5e88c1 0x42a00088462060003