DataMuseum.dk

Presents historical artifacts from the history of:

Rational R1000/400

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about Rational R1000/400

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - download

⟦b972cab90⟧ Ada Source

    Length: 6144 (0x1800)
    Types: Ada Source
    Notes: 03_class, FILE, R1k_Segment, e3_tag, package body Transport, seg_04cdce

Derivation

└─⟦8527c1e9b⟧ Bits:30000544 8mm tape, Rational 1000, Arrival backup of disks in PAM's R1000
    └─ ⟦cfc2e13cd⟧ »Space Info Vol 2« 
        └─⟦this⟧ 

E3 Source Code



with Transport_Defs;
use Transport_Defs;
with System;
with Daemon_Talk;
with Transport_Byte_Order;

-- This package body is for talk_io (breakpointed Ada I/O).  It's shared
-- between the host (daemons) and target (in the talk_io library).
--
package body Transport is

    use Transport_Byte_Order;

    Packet_Length : constant := 24;

    type Byte_Array is array (Natural range <>) of Character;

    subtype Packet_Data is Byte_Array (1 .. Packet_Length);

    type Packet is
        record
            Channel : Transport_Integer;
            Length : Transport_Integer;
            More : Transport_Integer;
            Sum : Transport_Integer;
            Data : Packet_Data;
        end record;

    Pkt_Size : constant Integer := Packet'Size / 8;

    Scanned : Boolean;
    Pkt : Packet;

    procedure Send_Packet is
    begin
        Pkt.Sum := 0;
        Daemon_Talk.Do_Io (Pkt'Address, Pkt_Size, 1);
    end Send_Packet;

    function Receive_Packet return Boolean is
    begin
        Daemon_Talk.Do_Io (Pkt'Address, Pkt_Size, 2);
        return True;
    end Receive_Packet;

    --------------------------------------
    -- Breaks the message up into fixed --
    -- size packets and sends them out. --
    --------------------------------------
    procedure Send (Chan : in Transport_Defs.Channel_T;
                    Count : in Natural;
                    Buf_Addr : in System.Address) is
        L : Integer;
        More : Boolean;
        Current : Integer := 0;
        Data : Byte_Array (1 .. Count);
        for Data use at Buf_Addr;
    begin
        Pkt.Channel := To_Transport_Integer (Integer (Chan));
        loop
            L := Count - Current;
            if L > Packet_Length then
                L := Packet_Length;
            end if;
            Pkt.Data (1 .. L) := Data (Current + 1 .. Current + L);
            Pkt.Length := To_Transport_Integer (L);
            Current := Current + L;
            More := Current < Count;
            Pkt.More := To_Transport_Integer (Boolean'Pos (More));
            Send_Packet;
            exit when not More;
        end loop;
    end Send;

    ----------------------------------------------------------------
    -- Reads the channel number and saves it. This call must be   --
    -- followed by a receive call before any send calls are made. --
    ----------------------------------------------------------------
    function Scan (Timeout : Boolean := False) return Channel_T is
    begin
        if not Scanned then
            loop
                exit when Receive_Packet;
                if Timeout then
                    raise Transport_Timeout;
                end if;
            end loop;
            Scanned := True;
        end if;
        return Channel_T (To_Local_Integer (Pkt.Channel));
    end Scan;

    ------------------------------------
    -- Receive no more than count bytes --
    ------------------------------------
    procedure Receive (Chan : in Transport_Defs.Channel_T;
                       Count : in out Natural;
                       Buf_Addr : in System.Address;
                       Rcvd_Msg : out Boolean) is
        L : Integer;
        More : Boolean;
        Current : Integer := 0;
        Data : Byte_Array (1 .. Count);
        for Data use at Buf_Addr;
    begin
        if Count < 0 then
            raise Transport_Error;
        end if;
        if Scan /= Chan then
            Scanned := False;
            raise Transport_Error;
        end if;
        Scanned := False;
        loop
            L := To_Local_Integer (Pkt.Length);
            if L > Count then
                raise Transport_Error;
            end if;
            Data (Current + 1 .. Current + L) := Pkt.Data (1 .. L);
            Current := Current + L;
            More := Boolean'Val (To_Local_Integer (Pkt.More));
            exit when not More;
            if not Receive_Packet then
                raise Transport_Error;
            end if;
        end loop;
        Count := Current; -- bytes
        Rcvd_Msg := True;
    end Receive;

    procedure Put_Signal (Sig : Transport_Defs.Tdm_Sig_T) is
    begin
        null;
    end Put_Signal;


    procedure Reset is
    begin
        Scanned := False;
    end Reset;

    procedure Initialize (Verbose : Boolean := False;
                          Preempt : Boolean := False) is
    begin
        Reset;
    end Initialize;

    procedure Shutdown is
    begin
        null;
    end Shutdown;

begin
    Reset;
end Transport;

E3 Meta Data

    nblk1=5
    nid=0
    hdr6=a
        [0x00] rec0=28 rec1=00 rec2=01 rec3=000
        [0x01] rec0=1c rec1=00 rec2=02 rec3=004
        [0x02] rec0=1b rec1=00 rec2=03 rec3=018
        [0x03] rec0=1b rec1=00 rec2=04 rec3=06c
        [0x04] rec0=23 rec1=00 rec2=05 rec3=000
    tail 0x217541d6c874f7b6e131b 0x42a00088462060003