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

⟦e1cdf857a⟧ Ada Source

    Length: 13312 (0x3400)
    Types: Ada Source
    Notes: 03_class, FILE, R1k_Segment, e3_tag, package body Low_Level_Io_2, seg_05c1e2, seg_05c2a1

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 System;
with Duart_68681;  
use Duart_68681;
with Pic_68155;  
with Unchecked_Conversion;
with Ada_Krn_Defs;

package body Low_Level_Io_2 is

    Interrupt_Vector : constant := 100;

    First_Call : Boolean := True;

    function To_Reg is new Unchecked_Conversion
                              (System.Address, Duart_68681.Acc_Channel);
    Duart : Duart_68681.Objet;
    for Duart use at System.Address'Ref (16#03001000#);
    Pic : Pic_68155.Objet;
    for Pic use at System.Address'Ref (16#03010020#);

    procedure Init_Port (Port : in Object) is
    begin
        Port.Regs.Sr := Duart_68681.Vitesse_9600;
        Port.Regs.Cr := Duart_68681.Reset_Pointeur_Mr;
        Port.Regs.Mr := Duart_68681.Sans_Parite_8_Bits;
        Port.Regs.Mr := Duart_68681.Un_Stop_Bit;
        Port.Regs.Cr := Duart_68681.Valider_Rx_Tx;
        Duart.Int := Duart_68681.Get_Int
                        (Name => Port.Name, Rx => True, Tx => False);
    end Init_Port;

    procedure Initialize is
    begin
        Duart.Acr := Duart_68681.Duart_Simple;
        Pic.R3 := Pic_68155.Activer_Lrq1;
        Pic.R0 := Pic_68155.Adresser_Cr1;
        Pic.R1 := Pic_68155.Activer_Sur_Front;
    end Initialize;

    task Duart_Task is
        entry Go (P : in Object);
        entry Rx_A (C : out Duart_68681.Byte);
        entry Tx_A (C : in Duart_68681.Byte);
        entry Rx_B (C : out Duart_68681.Byte);
        entry Tx_B (C : in Duart_68681.Byte);  
        entry It;
        for It use at System.Address'Ref (Interrupt_Vector);
        pragma Passive (Abort_Unsafe, Ada_Krn_Defs.Default_Intr_Attr);
    end Duart_Task;

    function It_Rx (Port : in Object; Reg : in Duart_68681.Byte)
                   return Boolean is
        Rg : Duart_68681.Loc_Byte;
        for Rg use at Reg'Address;
    begin
        if Port = null then
            return False;
        else
            return Rg (Port.Bit_It_Rx);
        end if;
    end It_Rx;
    function It_Tx (Port : in Object; Reg : in Duart_68681.Byte)
                   return Boolean is
        Rg : Duart_68681.Loc_Byte;
        for Rg use at Reg'Address;
    begin
        if Port = null then
            return False;
        else
            return Rg (Port.Bit_It_Tx);
        end if;
    end It_Tx;

    task body Duart_Task is  
        Init_Done : array (Duart_68681.Port_Name) of Boolean :=
           (others => False);
        Ports : array (Duart_68681.Port_Name) of Object;
        Reg_Isr : Duart_68681.Byte;
    begin
        loop  
            select  
                accept Go (P : in Object) do
                    Ports (P.Name) := P;
                    Init_Done (P.Name) := True;
                end Go;
            or
                when Init_Done (Port_A) and then Ports (Port_A).Tx_Ready =>
                    accept Tx_A (C : in Duart_68681.Byte) do
                        Ports (Port_A).Regs.Tx_Rx := C;
                        Duart.Int :=
                           Duart_68681.Get_Int
                              (Name => Port_A, Rx => False, Tx => True);
                        Ports (Port_A).Tx_Ready := False;
                    end Tx_A;
            or
                when Init_Done (Port_A) and then Ports (Port_A).Rx_Ready =>
                    accept Rx_A (C : out Duart_68681.Byte) do
                        C := Ports (Port_A).Car;
                        Ports (Port_A).Rx_Ready := False;
                    end Rx_A;
            or  
                when Init_Done (Port_B) and then Ports (Port_B).Tx_Ready =>
                    accept Tx_B (C : in Duart_68681.Byte) do
                        Ports (Port_B).Regs.Tx_Rx := C;
                        Duart.Int :=
                           Duart_68681.Get_Int
                              (Name => Port_B, Tx => True, Rx => False);
                        Ports (Port_B).Tx_Ready := False;
                    end Tx_B;  
            or
                when Init_Done (Port_B) and then Ports (Port_B).Rx_Ready =>
                    accept Rx_B (C : out Duart_68681.Byte) do
                        C := Ports (Port_B).Car;
                        Ports (Port_B).Rx_Ready := False;
                    end Rx_B;
            or
                accept It do
                    Reg_Isr := Duart.Int;
                    if It_Rx (Port => Ports (Port_A), Reg => Reg_Isr) then
                        Ports (Port_A).Car := Ports (Port_A).Regs.Tx_Rx;
                        Ports (Port_A).Rx_Ready := True;
                    end if;
                    if It_Tx (Port => Ports (Port_A), Reg => Reg_Isr) then  
                        Duart.Int :=
                           Duart_68681.Get_Int
                              (Name => Port_A, Rx => True, Tx => False);
                        Ports (Port_A).Tx_Ready := True;
                    end if;
                    if It_Rx (Port => Ports (Port_B), Reg => Reg_Isr) then
                        Ports (Port_B).Car := Ports (Port_B).Regs.Tx_Rx;
                        Ports (Port_B).Rx_Ready := True;
                    end if;
                    if It_Tx (Port => Ports (Port_B), Reg => Reg_Isr) then  
                        Duart.Int :=
                           Duart_68681.Get_Int
                              (Name => Port_B, Rx => True, Tx => False);
                        Ports (Port_B).Tx_Ready := True;
                    end if;
                end It;
            end select;
        end loop;
    end Duart_Task;

    function Open (Name : in Duart_68681.Port_Name;
                   S : in Duart_68681.Stop_Bit := Duart_68681.Stop_Bit_1;
                   P : in Duart_68681.Parity := Duart_68681.Parity_None;
                   C : in Duart_68681.Car_Length :=
                      Duart_68681.Car_Length_8_Bit;
                   B : in Duart_68681.Baud_Rate := Duart_68681.Baud_Rate_9600)
                  return Object is
        Port : Object := new Port_Infos;
    begin
        if First_Call then
            Initialize;
            First_Call := False;
        end if;
        Port.Name := Name;  
        if Name = Port_A then
            Port.Regs := To_Reg (Duart.Port_A'Address);
            Port.Bit_It_Tx := 8;
            Port.Bit_It_Rx := 7;
        else
            Port.Regs := To_Reg (Duart.Port_B'Address);
            Port.Bit_It_Tx := 4;
            Port.Bit_It_Rx := 3;
        end if;
        Init_Port (Port => Port);
        Duart_Task.Go (P => Port);
        return Port;
    end Open;

    function Byte_Available (Port : in Object) return Boolean is
    begin
        return Port.Rx_Ready;
    end Byte_Available;

    function Receive (Port : in Object) return Duart_68681.Byte is
        C : Duart_68681.Byte;
    begin
        if Port.Name = Port_A then
            Duart_Task.Rx_A (C);
        else
            Duart_Task.Rx_B (C);
        end if;
        return C;
    end Receive;

    procedure Send (Port : in Object; Car : in Duart_68681.Byte) is
    begin
        if Port.Name = Port_A then
            Duart_Task.Tx_A (Car);
        else
            Duart_Task.Tx_B (Car);
        end if;
    end Send;

    procedure Close (Port : in Object) is
    begin
        null;
    end Close;
begin
    Duart.Ivr := Interrupt_Vector;
end Low_Level_Io_2;

E3 Meta Data

    nblk1=c
    nid=9
    hdr6=10
        [0x00] rec0=1f rec1=00 rec2=01 rec3=01e
        [0x01] rec0=1a rec1=00 rec2=07 rec3=020
        [0x02] rec0=1f rec1=00 rec2=05 rec3=096
        [0x03] rec0=14 rec1=00 rec2=0c rec3=042
        [0x04] rec0=14 rec1=00 rec2=02 rec3=008
        [0x05] rec0=15 rec1=00 rec2=0b rec3=008
        [0x06] rec0=1e rec1=00 rec2=06 rec3=014
        [0x07] rec0=1a rec1=00 rec2=08 rec3=000
        [0x08] rec0=1d rec1=00 rec2=03 rec3=000
        [0x09] rec0=22 rec1=00 rec2=05 rec3=000
        [0x0a] rec0=05 rec1=00 rec2=04 rec3=000
        [0x0b] rec0=e2 rec1=80 rec2=00 rec3=000
    tail 0x2176b8bfc895a7e1ef86a 0x42a00088462060003
Free Block Chain:
  0x9: 0000  00 03 03 fc 00 1b 20 20 20 20 20 20 20 20 20 20  ┆                ┆
  0x3: 0000  00 04 00 03 00 00 00 01 00 00 00 00 00 00 00 00  ┆                ┆
  0x4: 0000  00 0a 01 4d 80 09 64 20 73 65 6c 65 63 74 3b 09  ┆   M  d select; ┆
  0xa: 0000  00 00 00 42 80 1c 6f 72 74 73 20 28 50 6f 72 74  ┆   B  orts (Port┆