|
|
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: 7168 (0x1c00)
Types: Ada Source
Notes: 03_class, FILE, R1k_Segment, e3_tag, package body Iop, seg_002fde
└─⟦8527c1e9b⟧ Bits:30000544 8mm tape, Rational 1000, Arrival backup of disks in PAM's R1000
└─⟦5a81ac88f⟧ »Space Info Vol 1«
└─⟦this⟧
with Device_Independent_Io;
with Io;
with Log;
with Profile;
with System;
--
package body Iop is
package Dio renames Device_Independent_Io;
subtype Byte is Enp_Driver.Byte;
function "+" (L, R : Byte) return Byte renames System."+";
function "/" (L, R : Byte) return Byte renames System."/";
function "mod" (L, R : Byte) return Byte renames System."mod";
function "<=" (L, R : Address) return Boolean renames Enp_Driver."<=";
Radix : constant := 16;
subtype Nybble is Byte range 0 .. 15;
Digit : constant array (Nybble) of Character :=
('0', '1', '2', '3', '4', '5', '6', '7',
'8', '9', 'a', 'b', 'c', 'd', 'e', 'f');
function Image (B : Byte_String) return String is
S : String (1 .. B'Length * 2);
Si : Positive := S'First;
begin
for Bi in B'Range loop
S (Si .. Si + 1) := (Digit (B (Bi) / Radix),
Digit (B (Bi) mod Radix));
Si := Si + 2;
end loop;
return S;
end Image;
function Image (A : Address) return String is
N : Long_Integer := Long_Integer (A);
S : String (1 .. 8);
begin
for Si in reverse S'Range loop
S (Si) := Digit (Nybble (N mod Radix));
N := N / Radix;
end loop;
return S;
end Image;
procedure Read (First : Address;
Quanta : Natural := 16;
Quantum : Iop_Quanta := Iop.Bytes) is
Data : Byte_String (1 .. Quanta * Enp_Driver.Quantum_Length (Quantum));
Count : Natural;
begin
Enp_Driver.Read (First, Data, Count, Quantum);
if Count > 0 then
Log.Put_Line (Image (First) & ": " &
Image (Data (Data'First .. Data'First + Count - 1)));
end if;
-- if Count < Length then
-- Log.Put_Line ("actually read" & Natural'Image (Count) & " bytes",
-- Profile.Warning_Msg);
-- end if;
end Read;
procedure Write (First : Address;
Data : Byte_String;
Quantum : Iop_Quanta := Iop.Bytes) is
Count : Natural;
begin
Enp_Driver.Write (First, Data, Count, Quantum);
if Count > 0 then
Log.Put_Line (Image (First) & ":=" &
Image (Data (Data'First .. Data'First + Count - 1)));
end if;
-- if Count < Data'Length then
-- Log.Put_Line ("actually wrote" & Natural'Image (Count) & " bytes",
-- Profile.Warning_Msg);
-- end if;
end Write;
procedure Scan (First : Address := Iop.Address'First;
Last : Address := Iop.Address'Last;
Quanta : Positive := 1;
Quantum : Iop_Quanta := Iop.Words) is
A : Address := First;
Ok : Boolean := True;
Step : constant Positive := Quanta *
Enp_Driver.Quantum_Length (Quantum);
Data : Byte_String (1 .. Step);
Count : Natural;
begin
while A <= Last loop
Enp_Driver.Read (A, Data, Count, Quantum);
if Count = Data'Length then
if not Ok then
Log.Put_Line (Image (A), Profile.Positive_Msg);
Ok := True;
end if;
else
if Ok then
Log.Put_Line (Image (A + Address (Count)),
Profile.Negative_Msg);
Ok := False;
end if;
end if;
if Count > 0 then
A := A + Address (Count);
else
A := A + Address (Step);
end if;
end loop;
end Scan;
procedure Dump (File_Name : String := "$iop_dump";
First : Address := Iop.Address'First;
Last : Address := Iop.Address (2 ** 19 - 1);
Quanta : Positive := 512;
Quantum : Iop_Quanta := Iop.Words) is
Quantum_Length : constant Positive :=
Enp_Driver.Quantum_Length (Quantum);
Step : constant Positive := Quanta * Quantum_Length;
File : Dio.File_Type;
A : Address := First;
Data : Byte_String (1 .. Step);
Count : Natural;
begin
begin
Dio.Open (File, Dio.Out_File, Name => File_Name);
exception
when Dio.Name_Error =>
Dio.Create (File, Name => File_Name);
end;
while A <= Last loop
if Address (Data'Length) <= Last - A + 1 then
Enp_Driver.Read (A, Data, Count, Quantum);
else
Enp_Driver.Read (A, Data (1 .. Positive (Last - A + 1)),
Count, Quantum);
end if;
exit when Count = 0;
Dio.Write (File, Data (1 .. Count));
A := A + Address (Count);
end loop;
Dio.Close (File);
end Dump;
end Iop;
nblk1=6
nid=0
hdr6=c
[0x00] rec0=21 rec1=00 rec2=01 rec3=066
[0x01] rec0=1d rec1=00 rec2=02 rec3=068
[0x02] rec0=19 rec1=00 rec2=03 rec3=03a
[0x03] rec0=1d rec1=00 rec2=04 rec3=040
[0x04] rec0=17 rec1=00 rec2=05 rec3=090
[0x05] rec0=0b rec1=00 rec2=06 rec3=000
tail 0x20f001376000806b0ea8a 0x42a00088462060003