|
|
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 Low_Level_Io_8, seg_05c07d, seg_05c2a3
└─⟦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 Low_Level_Io_8 is
Base_Vector : constant := 119;
Interrupt_Vector_1 : constant := Base_Vector;
Interrupt_Vector_2 : constant := Base_Vector - 1;
Interrupt_Vector_3 : constant := Base_Vector - 2;
Interrupt_Vector_4 : constant := Base_Vector - 3;
Interrupt_Vector_5 : constant := Base_Vector - 4;
Interrupt_Vector_6 : constant := Base_Vector - 5;
Interrupt_Vector_7 : constant := Base_Vector - 6;
Interrupt_Vector_8 : constant := Base_Vector - 7;
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 (Interrupt_Vector_1);
pragma Passive (Abort_Unsafe, Ada_Krn_Defs.Default_Intr_Attr);
end It1;
task It2 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 (Interrupt_Vector_2);
pragma Passive (Abort_Unsafe, Ada_Krn_Defs.Default_Intr_Attr);
end It2;
task It3 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 (Interrupt_Vector_3);
pragma Passive (Abort_Unsafe, Ada_Krn_Defs.Default_Intr_Attr);
end It3;
task It4 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 (Interrupt_Vector_4);
pragma Passive (Abort_Unsafe, Ada_Krn_Defs.Default_Intr_Attr);
end It4;
task It5 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 (Interrupt_Vector_5);
pragma Passive (Abort_Unsafe, Ada_Krn_Defs.Default_Intr_Attr);
end It5;
task It6 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 (Interrupt_Vector_6);
pragma Passive (Abort_Unsafe, Ada_Krn_Defs.Default_Intr_Attr);
end It6;
task It7 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 (Interrupt_Vector_7);
pragma Passive (Abort_Unsafe, Ada_Krn_Defs.Default_Intr_Attr);
end It7;
task It8 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 (Interrupt_Vector_8);
pragma Passive (Abort_Unsafe, Ada_Krn_Defs.Default_Intr_Attr);
end It8;
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;
task body It2 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 It2;
task body It3 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 It3;
task body It4 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 It4;
task body It5 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 It5;
task body It6 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 It6;
task body It7 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 It7;
task body It8 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 It8;
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 Low_Level_Io_8;
nblk1=17
nid=d
hdr6=22
[0x00] rec0=1d rec1=00 rec2=01 rec3=026
[0x01] rec0=18 rec1=00 rec2=17 rec3=050
[0x02] rec0=1a rec1=00 rec2=0f rec3=04c
[0x03] rec0=1a rec1=00 rec2=0c rec3=01a
[0x04] rec0=23 rec1=00 rec2=10 rec3=06e
[0x05] rec0=20 rec1=00 rec2=09 rec3=00e
[0x06] rec0=20 rec1=00 rec2=07 rec3=010
[0x07] rec0=1e rec1=00 rec2=15 rec3=03c
[0x08] rec0=20 rec1=00 rec2=06 rec3=016
[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 0x2176b7422895a4dc813fb 0x42a00088462060003
Free Block Chain:
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 ┆