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

⟦183b87ca0⟧ Ada Source

    Length: 5120 (0x1400)
    Types: Ada Source
    Notes: 03_class, FILE, R1k_Segment, e3_tag, package body Timer_68, seg_0505c6

Derivation

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

E3 Source Code



package body Timer_68 is


    type Byte is new Natural range 0 .. 255;
    for Byte'Size use 8;

    -- registres Timer : MFP 68901

    Reg_Vr : Byte;  -- Vector register
    Reg_Iera : Byte; -- Interrupt enable register a
    Reg_Imra : Byte; -- Interrupt mask register a
    Reg_Tadr : Byte; -- Timer A data register
    Reg_Tacr : Byte; -- Timer A control register

    for Reg_Vr use at System.To_Address (16#0301_000B#);
    for Reg_Iera use at System.To_Address (16#0301_0003#);
    for Reg_Imra use at System.To_Address (16#0301_0009#);
    for Reg_Tadr use at System.To_Address (16#0301_000F#);
    for Reg_Tacr use at System.To_Address (16#0301_000C#);

    -- registre PICU : 68115

    Reg_R0 : Byte; -- pointer register
    Reg_R1 : Byte; -- control register
    Reg_R3 : Byte; -- local interrupt mask register
    Reg_R5 : Byte; -- system bus interrupt mask register

    for Reg_R0 use at System.To_Address (16#03010020#);
    for Reg_R1 use at System.To_Address (16#03010022#);
    for Reg_R3 use at System.To_Address (16#03010026#);
    for Reg_R5 use at System.To_Address (16#0301002A#);

    Mode_Timer_A : Timer_Mode;


    function Ou (B1, B2 : Byte) return Byte is
        B11, B22, B3 : Byte;  
        N : Natural;
    begin  
        B11 := B1;
        B22 := B2;
        B3 := 0;
        for I in 0 .. 7 loop
            if (B11 mod 2) = 1 or (B22 mod 2) = 1 then
                N := 1;
            else
                N := 0;
            end if;
            B3 := B3 + Byte (N * (2 ** I));
            B11 := B11 / 2;
            B22 := B22 / 2;
        end loop;  
        return B3;
    end Ou;

    procedure Set (Mode : Timer_Mode; Duration : T_Duration) is
    begin
        Mode_Timer_A := Mode;
        Reg_Tadr := Byte (Duration);
    end Set;


    procedure Start is
    begin
        case Mode_Timer_A is
            when Delay_Div_4 =>
                Reg_Tacr := 2#0000_0001#;
            when Delay_Div_10 =>
                Reg_Tacr := 2#0000_0010#;
            when Delay_Div_16 =>
                Reg_Tacr := 2#0000_0011#;
            when Delay_Div_50 =>
                Reg_Tacr := 2#0000_0100#;
            when Delay_Div_64 =>
                Reg_Tacr := 2#0000_0101#;
            when Delay_Div_100 =>
                Reg_Tacr := 2#0000_0110#;
            when Delay_Div_200 =>
                Reg_Tacr := 2#0000_0111#;
        end case;
    end Start;


    procedure Stop is
    begin
        Reg_Tacr := 2#0000_0000#;
    end Stop;


    function Get_Interrupt_Vector_Number return System.Address is
    begin
        return System.To_Address (2#1111_1101#);
    end Get_Interrupt_Vector_Number;

begin

    Mode_Timer_A := Delay_Div_4;

    Reg_R3 := Ou (Reg_R3, 2#0000_0100#);
    Reg_R5 := Ou (Reg_R5, 2#0000_0000#);
    Reg_R0 := 2#0000_0010#;
    Reg_R1 := 2#0000_0010#;

    Reg_Vr := 2#1111_0000#;
    Reg_Iera := 2#0010_0000#;
    Reg_Imra := 2#0010_0000#;

end Timer_68;

E3 Meta Data

    nblk1=4
    nid=0
    hdr6=8
        [0x00] rec0=1e rec1=00 rec2=01 rec3=026
        [0x01] rec0=26 rec1=00 rec2=02 rec3=02a
        [0x02] rec0=25 rec1=00 rec2=03 rec3=014
        [0x03] rec0=05 rec1=00 rec2=04 rec3=000
    tail 0x2154ae12a87804c8d625b 0x42a00088462060003