|
|
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: 24576 (0x6000)
Types: Ada Source
Notes: 03_class, FILE, R1k_Segment, e3_tag, package body Ll_Vect_60, seg_05c25a, seg_05c29f
└─⟦8527c1e9b⟧ Bits:30000544 8mm tape, Rational 1000, Arrival backup of disks in PAM's R1000
└─⟦cfc2e13cd⟧ »Space Info Vol 2«
└─⟦this⟧
with System;
with Unsigned_Types;
with Unchecked_Conversion;
with Duart_2661;
with Pic_68155;
with Ada_Krn_Defs;
package body Ll_Vect_60 is
Base_Vector : constant := 16#15#;
First_Call : Boolean := True;
type Pic_Acc is access Pic_68155.Objet;
Pic : Pic_Acc;
type Io_8_Objet is array (Port_Nb) of Duart_2661.Objet;
for Io_8_Objet'Size use 8 * Duart_2661.Taille;
type Io_8_Acc is access Io_8_Objet;
Io_8 : Io_8_Acc;
function To_Pic is new Unchecked_Conversion
(Unsigned_Types.Unsigned_Integer, Pic_Acc);
function To_Io_8 is new Unchecked_Conversion
(Unsigned_Types.Unsigned_Integer, Io_8_Acc);
task It1 is
entry Go (P : in Object);
entry Rx (C : out Duart_2661.Byte);
entry Tx (C : in Duart_2661.Byte);
entry It;
for It use at System.Address'Ref (Base_Vector);
pragma Passive (Abort_Unsafe, Ada_Krn_Defs.Default_Intr_Attr);
end It1;
procedure Init_It (P : in Port_Nb; Rx, Tx : in Boolean := True) is
begin
if Rx and Tx then
Io_8 (P).Cr := Duart_2661.Activer_It_Rx_Tx;
elsif Rx then
Io_8 (P).Cr := Duart_2661.Activer_It_Rx;
elsif Tx then
Io_8 (P).Cr := Duart_2661.Activer_It_Tx;
else
Io_8 (P).Cr := Duart_2661.Desactiver_It;
end if;
end Init_It;
function It_Rx (Reg : in Duart_2661.Byte) return Boolean is
Rg : Duart_2661.Loc_Byte;
for Rg use at Reg'Address;
begin
return Rg (7);
end It_Rx;
function It_Tx (Reg : in Duart_2661.Byte) return Boolean is
Rg : Duart_2661.Loc_Byte;
for Rg use at Reg'Address;
begin
return Rg (8);
end It_Tx;
procedure Incremente (Index : in out Index_Infos) is
begin
if Index = Max_Index_Infos then
Index := 1;
else
Index := Index + 1;
end if;
end Incremente;
procedure Do_It (Port : in Object) is
Sr : Duart_2661.Byte;
begin
Sr := Io_8 (Port.Nb).Sr;
if It_Rx (Reg => Sr) then
Port.Buffer (Port.Index_In) := Io_8 (Port.Nb).Tx_Rx;
Incremente (Port.Index_In);
if Port.Index_In = Port.Index_Out then
Incremente (Port.Index_Out);
end if;
Port.Rx_Ready := True;
end if;
if It_Tx (Reg => Sr) then
Port.Tx_Ready := True;
Init_It (P => Port.Nb, Tx => False, Rx => True);
end if;
end Do_It;
procedure Do_Tx (Port : in Object; Car : in Duart_2661.Byte) is
begin
Init_It (P => Port.Nb, Tx => True, Rx => False);
Io_8 (Port.Nb).Tx_Rx := Car;
Port.Tx_Ready := False;
end Do_Tx;
procedure Do_Rx (Port : in Object; Car : out Duart_2661.Byte) is
begin
Car := Port.Buffer (Port.Index_Out);
Incremente (Port.Index_Out);
if Port.Index_In = Port.Index_Out then
Port.Rx_Ready := False;
else
Port.Rx_Ready := True;
end if;
end Do_Rx;
task body It1 is
Port : Object;
Init_Done : Boolean := False;
begin
loop
select
accept Go (P : in Object) do
Port := P;
Init_Done := True;
end Go;
or
accept It do
Do_It (Port => Port);
end It;
or
when Init_Done and then Port.Tx_Ready =>
accept Tx (C : in Duart_2661.Byte) do
Do_Tx (Port => Port, Car => C);
end Tx;
or
when Init_Done and then Port.Rx_Ready =>
accept Rx (C : out Duart_2661.Byte) do
Do_Rx (Port => Port, Car => C);
end Rx;
end select;
end loop;
end It1;
procedure Initialize is
Pic_Add : constant Unsigned_Types.Unsigned_Integer := 16#0301_0020#;
Io_8_Add : constant Unsigned_Types.Unsigned_Integer := 16#F400_0000#;
begin
Pic := To_Pic (Pic_Add);
Io_8 := To_Io_8 (Io_8_Add);
end Initialize;
function Open (Nb : in Port_Nb;
S : in Duart_2661.Stop_Bit := Duart_2661.Stop_Bit_1;
P : in Duart_2661.Parity := Duart_2661.Parity_None;
C : in Duart_2661.Car_Length := Duart_2661.Car_Length_8_Bit;
B : in Duart_2661.Baud_Rate := Duart_2661.Baud_Rate_9600)
return Object is
Port : Object := new Port_Infos;
begin
if First_Call then
Initialize;
First_Call := False;
end if;
Port.Nb := Nb;
-- case Port.Nb is
-- when 1 =>
It1.Go (P => Port);
-- when 2 =>
-- It2.Go (P => Port);
-- when 3 =>
-- It3.Go (P => Port);
-- when 4 =>
-- It4.Go (P => Port);
-- when 5 =>
-- It5.Go (P => Port);
-- when 6 =>
-- It6.Go (P => Port);
-- when 7 =>
-- It7.Go (P => Port);
-- when 8 =>
-- It8.Go (P => Port);
-- end case;
Io_8 (Port.Nb).Mr := Duart_2661.Get_Mr1 (S => S, P => P, C => C);
Io_8 (Port.Nb).Mr := Duart_2661.Get_Mr2 (B => B);
Init_It (P => Port.Nb, Tx => False, Rx => True);
Pic.R5 := Pic_68155.Activer_Irq1;
return Port;
end Open;
function Receive (Port : in Object) return Duart_2661.Byte is
C : Duart_2661.Byte;
begin
-- case Port.Nb is
-- when 1 =>
It1.Rx (C);
-- when 2 =>
-- It2.Rx (C);
-- when 3 =>
-- It3.Rx (C);
-- when 4 =>
-- It4.Rx (C);
-- when 5 =>
-- It5.Rx (C);
-- when 6 =>
-- It6.Rx (C);
-- when 7 =>
-- It7.Rx (C);
-- when 8 =>
-- It8.Rx (C);
-- end case;
return C;
end Receive;
procedure Send (Port : in Object; Car : in Duart_2661.Byte) is
begin
-- case Port.Nb is
-- when 1 =>
It1.Tx (Car);
-- when 2 =>
-- It2.Tx (Car);
-- when 3 =>
-- It3.Tx (Car);
-- when 4 =>
-- It4.Tx (Car);
-- when 5 =>
-- It5.Tx (Car);
-- when 6 =>
-- It6.Tx (Car);
-- when 7 =>
-- It7.Tx (Car);
-- when 8 =>
-- It8.Tx (Car);
-- end case;
end Send;
function Byte_Available (Port : in Object) return Boolean is
begin
if Port.Index_In /= Port.Index_Out then
return True;
else
return False;
end if;
end Byte_Available;
procedure Close (Port : in Object) is
begin
Init_It (P => Port.Nb, Tx => False, Rx => False);
end Close;
end Ll_Vect_60;
nblk1=17
nid=8
hdr6=12
[0x00] rec0=1f rec1=00 rec2=01 rec3=056
[0x01] rec0=09 rec1=00 rec2=17 rec3=01a
[0x02] rec0=23 rec1=00 rec2=10 rec3=06e
[0x03] rec0=20 rec1=00 rec2=09 rec3=00e
[0x04] rec0=1d rec1=00 rec2=07 rec3=024
[0x05] rec0=1b rec1=00 rec2=05 rec3=03c
[0x06] rec0=1f rec1=00 rec2=16 rec3=02a
[0x07] rec0=25 rec1=00 rec2=02 rec3=012
[0x08] rec0=09 rec1=00 rec2=03 rec3=000
[0x09] rec0=1f rec1=00 rec2=12 rec3=00a
[0x0a] rec0=1e rec1=00 rec2=0e rec3=030
[0x0b] rec0=1e rec1=00 rec2=14 rec3=002
[0x0c] rec0=1e rec1=00 rec2=02 rec3=062
[0x0d] rec0=19 rec1=00 rec2=05 rec3=02e
[0x0e] rec0=20 rec1=00 rec2=03 rec3=002
[0x0f] rec0=25 rec1=00 rec2=08 rec3=03a
[0x10] rec0=14 rec1=00 rec2=16 rec3=000
[0x11] rec0=1f rec1=00 rec2=0d rec3=000
[0x12] rec0=21 rec1=00 rec2=07 rec3=04a
[0x13] rec0=0c rec1=00 rec2=05 rec3=000
[0x14] rec0=00 rec1=00 rec2=00 rec3=000
[0x15] rec0=00 rec1=00 rec2=00 rec3=000
[0x16] rec0=00 rec1=00 rec2=00 rec3=000
tail 0x2176b917e895b3c949fe8 0x42a00088462060003
Free Block Chain:
0x8: 0000 00 14 00 c9 00 0f 20 20 20 20 20 20 20 20 65 6e ┆ en┆
0x14: 0000 00 0e 03 fc 80 21 70 74 20 54 78 20 28 43 20 3a ┆ !pt Tx (C :┆
0xe: 0000 00 12 03 fc 80 09 20 20 20 20 20 20 20 6f 72 09 ┆ or ┆
0x12: 0000 00 06 03 fc 80 11 20 20 20 20 20 61 63 63 65 70 ┆ accep┆
0x6: 0000 00 15 03 fc 00 26 20 20 20 20 20 20 20 20 20 20 ┆ & ┆
0x15: 0000 00 0c 03 f9 80 0c 20 20 20 20 73 65 6c 65 63 74 ┆ select┆
0xc: 0000 00 0f 03 fc 80 18 65 66 20 28 49 6e 74 65 72 72 ┆ ef (Interr┆
0xf: 0000 00 0d 03 fc 80 02 29 3b 02 00 11 20 20 20 20 20 ┆ ); ┆
0xd: 0000 00 13 01 eb 80 0f 20 20 20 20 20 20 77 68 65 6e ┆ when┆
0x13: 0000 00 11 03 f7 80 1c 20 69 73 20 6e 65 77 20 55 6e ┆ is new Un┆
0x11: 0000 00 04 03 fc 80 03 49 74 3b 03 00 0e 20 20 20 20 ┆ It; ┆
0x4: 0000 00 0b 00 11 80 0e 20 20 20 20 20 20 20 20 20 20 ┆ ┆
0xb: 0000 00 0a 00 04 80 01 20 01 02 28 50 29 3b 07 00 09 ┆ (P); ┆
0xa: 0000 00 00 00 08 80 05 74 65 5f 41 70 05 06 20 08 0e ┆ te_Ap ┆