|
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 - download
Length: 29696 (0x7400) Types: Ada Source Notes: 03_class, FILE, R1k_Segment, e3_tag, package body Port_Serie_68k, seg_05a2e4
└─⟦8527c1e9b⟧ Bits:30000544 8mm tape, Rational 1000, Arrival backup of disks in PAM's R1000 └─ ⟦cfc2e13cd⟧ »Space Info Vol 2« └─⟦this⟧
with V_Bits; with System; package body Port_Serie_68k is --======================================================== -- Fonctions Privees, Non declarees dans la specification --======================================================== function Calcul_Adresse_Port (Port_Serie : G_Defs.Port; Index : Integer) return G_Defs.Adresse is Resultat : G_Defs.Adresse; begin Resultat := System."+" (Adresse_Circuit, Index); case Port_Serie is when G_Defs.Port_A => return Resultat; when G_Defs.Port_B => return System."+" (Resultat, 8); end case; end Calcul_Adresse_Port; function Compare_Deux_Registres (Registre1 : G_Defs.Byte; Registre2 : G_Defs.Byte) return Boolean is begin if V_Bits.Bit_And (G_Defs.Byte'Pos (Registre1), G_Defs.Byte'Pos (Registre2)) /= 0 then return True; else return False; end if; end Compare_Deux_Registres; procedure Test_Transmit_Error (Port_Serie : G_Defs.Port) is Reg_Sra : G_Defs.Byte; for Reg_Sra use at Calcul_Adresse_Port (Port_Serie => Port_Serie, Index => C_68681.Index.Registre_Statut); begin if Compare_Deux_Registres (Reg_Sra, C_68681.Masque.Parity_Error) = True then Emission_Reception (Port_Serie => Port_Serie, Mode => E_R); raise Parity_Error; elsif Compare_Deux_Registres (Reg_Sra, C_68681.Masque.Framing_Error) = True then Emission_Reception (Port_Serie => Port_Serie, Mode => E_R); raise Framing_Error; elsif Compare_Deux_Registres (Reg_Sra, C_68681.Masque.Overrun_Error) = True then Emission_Reception (Port_Serie => Port_Serie, Mode => E_R); raise Overrun_Error; end if; end Test_Transmit_Error; function Masquage_Du_Registre (Registre : G_Defs.Byte; Mask : C_68681.Masque.Objet) return G_Defs.Byte is Resultat : Integer; begin Resultat := V_Bits.Bit_And (G_Defs.Byte'Pos (Registre), G_Defs.Byte'Pos (Mask (1))); Resultat := V_Bits.Bit_Or (Resultat, G_Defs.Byte'Pos (Mask (2))); return G_Defs.Byte (Resultat); end Masquage_Du_Registre; --********************************************************************** -- Le DUART 68681 genere le vecteur d'interruption, le PICU 68155 -- par defaut en genere un egalement il faut donc invalider l'emission -- du vecteur d'interruption provenant du PICU -- ******************************************************************** procedure Invalidation_Vecteur_It_68155 is Reg_R1_68115, Reg_R0_68115, Reg_R3_68115, Reg_R5_68115, Reg_Tempo : G_Defs.Byte; for Reg_R0_68115 use at Adresse_Base_Gestionnaire_It; for Reg_R1_68115 use at System."+" (Adresse_Base_Gestionnaire_It, 2); for Reg_R3_68115 use at System."+" (Adresse_Base_Gestionnaire_It, 6); for Reg_R5_68115 use at System."+" (Adresse_Base_Gestionnaire_It, 10); begin Reg_R3_68115 := 2#00000010#; Reg_R5_68115 := 2#00000000#; Reg_R0_68115 := 2#00000001#; Reg_R1_68115 := 2; end Invalidation_Vecteur_It_68155; --******************************************************** -- Reset du pointeur MR pour etre certain d'ecrire sur MR1 --******************************************************** procedure Reset_Pointeur_Mr (Port_Serie : G_Defs.Port) is Reg_Cra, Reg_Tempo : G_Defs.Byte; for Reg_Cra use at Calcul_Adresse_Port (Port_Serie => Port_Serie, Index => C_68681.Index.Registre_Commande); begin Reg_Cra := C_68681.Masque.Reset_Pointeur_Mr; end Reset_Pointeur_Mr; --======================================================== -- Fonctions et procedures publiees dans la specification --======================================================== --************************************************************* -- Positionnement de la vitesse en Emission/Reception du DUART --************************************************************* procedure Pos_Vitesse (Port_Serie : G_Defs.Port; Vitesse : G_Defs.Baud_Rate) is Reg_Acr, Reg_Csra : G_Defs.Byte; for Reg_Acr use at Calcul_Adresse_Port (Port_Serie => Port_Serie, Index => C_68681.Index.Registre_Auxiliaire); for Reg_Csra use at Calcul_Adresse_Port (Port_Serie => Port_Serie, Index => C_68681.Index.Registre_Statut); begin Reg_Acr := C_68681.Masque.Acr7_1; case Vitesse is when G_Defs.Bd300 => Reg_Csra := C_68681.Masque.Vitesse_300; when G_Defs.Bd600 => Reg_Csra := C_68681.Masque.Vitesse_600; when G_Defs.Bd1200 => Reg_Csra := C_68681.Masque.Vitesse_1200; when G_Defs.Bd2400 => Reg_Csra := C_68681.Masque.Vitesse_2400; when G_Defs.Bd4800 => Reg_Csra := C_68681.Masque.Vitesse_4800; when G_Defs.Bd9600 => Reg_Csra := C_68681.Masque.Vitesse_9600; when G_Defs.Bd19200 => Reg_Csra := C_68681.Masque.Vitesse_19200; end case; end Pos_Vitesse; --***************************************************************** -- Positionne le type de parite ( None, Even ou Odd )gere par UART --***************************************************************** procedure Pos_Parite (Port_Serie : G_Defs.Port; Val_Parite : G_Defs.Parite) is Mr1, Old_Mr1 : G_Defs.Byte; for Mr1 use at Calcul_Adresse_Port (Port_Serie => Port_Serie, Index => C_68681.Index.Registre_Mode); begin Reset_Pointeur_Mr (Port_Serie => Port_Serie); Old_Mr1 := Mr1; Reset_Pointeur_Mr (Port_Serie => Port_Serie); case Val_Parite is when G_Defs.None => Mr1 := Masquage_Du_Registre (Registre => Old_Mr1, Mask => C_68681.Masque.Sans_Parite); when G_Defs.Even => Mr1 := Masquage_Du_Registre (Registre => Old_Mr1, Mask => C_68681.Masque.Parite_Paire); when G_Defs.Odd => Mr1 := Masquage_Du_Registre (Registre => Old_Mr1, Mask => C_68681.Masque.Parite_Impair); end case; end Pos_Parite; --********************************************** -- Positionne le nombre de Stop Bits pour UART --********************************************** procedure Pos_Stop_Bits (Port_Serie : G_Defs.Port; Val_Stop_Bits : G_Defs.Stop_Bits) is Mr2, Dummy, Reg_Tempo : G_Defs.Byte; for Mr2 use at Calcul_Adresse_Port (Port_Serie => Port_Serie, Index => C_68681.Index.Registre_Mode); begin Reset_Pointeur_Mr (Port_Serie => Port_Serie); Dummy := Mr2; -- Incremente Pointeur Mr a Mr2_x Mr2 := Dummy; Reg_Tempo := Mr2; case Val_Stop_Bits is when 1 => Mr2 := Masquage_Du_Registre (Registre => Reg_Tempo, Mask => C_68681.Masque.Un_Stop_Bit); when 2 => Mr2 := Masquage_Du_Registre (Registre => Reg_Tempo, Mask => C_68681.Masque.Deux_Stop_Bit); end case; end Pos_Stop_Bits; --****************************************************** -- Positionne le nombre de Bits par caractere pour UART --****************************************************** procedure Pos_Nbre_Bits_Caractere (Port_Serie : G_Defs.Port; Val_Nbre_Bits_Par_Caractere : G_Defs.Nbre_Bits_Par_Caractere) is Mr1, Old_Mr1 : G_Defs.Byte; for Mr1 use at Calcul_Adresse_Port (Port_Serie => Port_Serie, Index => C_68681.Index.Registre_Mode); begin Reset_Pointeur_Mr (Port_Serie => Port_Serie); Old_Mr1 := Mr1; Reset_Pointeur_Mr (Port_Serie => Port_Serie); case Val_Nbre_Bits_Par_Caractere is when 5 => Mr1 := Masquage_Du_Registre (Registre => Old_Mr1, Mask => C_68681.Masque.Caractere_5_Bit); when 6 => Mr1 := Masquage_Du_Registre (Registre => Old_Mr1, Mask => C_68681.Masque.Caractere_6_Bit); when 7 => Mr1 := Masquage_Du_Registre (Registre => Old_Mr1, Mask => C_68681.Masque.Caractere_7_Bit); when 8 => Mr1 := Masquage_Du_Registre (Registre => Old_Mr1, Mask => C_68681.Masque.Caractere_8_Bit); end case; end Pos_Nbre_Bits_Caractere; procedure Emission_Reception (Port_Serie : G_Defs.Port; Mode : Mode_Emission_Reception) is Reg_Cra : G_Defs.Byte; for Reg_Cra use at Calcul_Adresse_Port (Port_Serie => Port_Serie, Index => C_68681.Index.Registre_Commande); begin if Mode = E then Reg_Cra := C_68681.Masque.Validation_Emission; elsif Mode = R then Reg_Cra := C_68681.Masque.Validation_Reception; elsif Mode = E_R then Reg_Cra := C_68681.Masque.Validation_Emission_Reception; elsif Mode = Aucun then Reg_Cra := C_68681.Masque.Aucune_Emission_Reception; end if; end Emission_Reception; --*********************************************************** -- Configure le masque d'interruption en fct du mode choisi --*********************************************************** procedure Pos_Interruption (Mode : Mode_Emission_Reception) is Reg_Int : G_Defs.Byte; for Reg_Int use at System."+" (Adresse_Circuit, C_68681.Index.Registre_Statut_Masque_Interruption); begin Invalidation_Vecteur_It_68155; case Mode is when E => Reg_Int := C_68681.Masque.Validation_Interruption_Emission; when R => Reg_Int := C_68681.Masque.Validation_Interruption_Reception; when E_R => Reg_Int := C_68681.Masque. Validation_Interruption_Emission_Reception; when Ea_R => Reg_Int := C_68681.Masque. Validation_Interruption_Emission_A_Reception; when Eb_R => Reg_Int := C_68681.Masque. Validation_Interruption_Emission_B_Reception; when Aucun => Reg_Int := C_68681.Masque.Sans_It; end case; end Pos_Interruption; --************************************************************** -- Calcul de l'adresse de l'interruption a partir de l'adresse -- de base et du numero d'IT --************************************************************** function Calcul_Adresse_It (No_It : G_Defs.Vecteur_It) return G_Defs.Adresse is Reg_Ivr : G_Defs.Byte; for Reg_Ivr use at Calcul_Adresse_Port (Port_Serie => G_Defs.Port_A, Index => C_68681.Index.Vecteur_Interruption); begin Reg_Ivr := G_Defs.Byte (No_It); return System."+" (Adresse_Base_It, No_It); end Calcul_Adresse_It; procedure Interruption_Reception_Sur_R_Rdy (Port_Serie : G_Defs.Port) is Mr1, Old_Mr1 : G_Defs.Byte; for Mr1 use at Calcul_Adresse_Port (Port_Serie => Port_Serie, Index => C_68681.Index.Registre_Mode); begin Reset_Pointeur_Mr (Port_Serie); Old_Mr1 := Mr1; Reset_Pointeur_Mr (Port_Serie); Mr1 := Masquage_Du_Registre (Old_Mr1, C_68681.Masque.R_Int_Select); end Interruption_Reception_Sur_R_Rdy; --************************************** -- Pour une interruption materielle, -- donne le type evenement a traiter --************************************** function Donner_Evenement_Interruption return Evenement_Interruption is Reg_Isr : G_Defs.Byte; for Reg_Isr use at Calcul_Adresse_Port (Port_Serie => G_Defs.Port_A, Index => C_68681.Index. Registre_Statut_Masque_Interruption); begin if Compare_Deux_Registres (Registre1 => C_68681.Masque.Est_Ce_Reception_A, Registre2 => Reg_Isr) = True then return Reception_A; elsif Compare_Deux_Registres (Registre1 => C_68681.Masque.Est_Ce_Reception_B, Registre2 => Reg_Isr) = True then return Reception_B; elsif Compare_Deux_Registres (Registre1 => C_68681.Masque.Est_Ce_Emission_A, Registre2 => Reg_Isr) = True then return Emission_A; elsif Compare_Deux_Registres (Registre1 => C_68681.Masque.Est_Ce_Emission_B, Registre2 => Reg_Isr) = True then return Emission_B; else return Inconnu; end if; end Donner_Evenement_Interruption; function Lire_Donnee (Port_Serie : G_Defs.Port) return G_Defs.Byte is Reg_Data, Reg_Csra : G_Defs.Byte; for Reg_Data use at Calcul_Adresse_Port (Port_Serie => Port_Serie, Index => C_68681.Index.Registre_Donnees); for Reg_Csra use at Calcul_Adresse_Port (Port_Serie => Port_Serie, Index => C_68681.Index.Registre_Statut); begin Test_Transmit_Error (Port_Serie => Port_Serie); return Reg_Data; end Lire_Donnee; --************************* -- Ecrire Octet dans DUART --************************* procedure Ecrire_Donnee (Port_Serie : G_Defs.Port; Donnee : G_Defs.Byte) is Reg_Data, Reg_Csra : G_Defs.Byte; for Reg_Data use at Calcul_Adresse_Port (Port_Serie => Port_Serie, Index => C_68681.Index.Registre_Donnees); for Reg_Csra use at Calcul_Adresse_Port (Port_Serie => Port_Serie, Index => C_68681.Index.Registre_Statut); begin Test_Transmit_Error (Port_Serie => Port_Serie); Reg_Data := Donnee; end Ecrire_Donnee; procedure Ecrire_Donnee_Sans_It (Port_Serie : G_Defs.Port; Donnee : G_Defs.Byte) is Reg_Data, Reg_Csra : G_Defs.Byte; for Reg_Data use at Calcul_Adresse_Port (Port_Serie => Port_Serie, Index => C_68681.Index.Registre_Donnees); for Reg_Csra use at Calcul_Adresse_Port (Port_Serie => Port_Serie, Index => C_68681.Index.Registre_Statut); begin while (Compare_Deux_Registres (Reg_Csra, C_68681.Masque.Emetteur_Pret) = False) loop null; end loop; Test_Transmit_Error (Port_Serie => Port_Serie); Reg_Data := Donnee; end Ecrire_Donnee_Sans_It; function Lire_Donnee_Sans_It (Port_Serie : G_Defs.Port) return G_Defs.Byte is Reg_Data, Reg_Csra : G_Defs.Byte; for Reg_Data use at Calcul_Adresse_Port (Port_Serie => Port_Serie, Index => C_68681.Index.Registre_Donnees); for Reg_Csra use at Calcul_Adresse_Port (Port_Serie => Port_Serie, Index => C_68681.Index.Registre_Statut); begin while (Compare_Deux_Registres (Reg_Csra, C_68681.Masque.Recepteur_Pret) = False) loop null; end loop; Test_Transmit_Error (Port_Serie => Port_Serie); return Reg_Data; end Lire_Donnee_Sans_It; begin --*********************************************** -- Initialisation par defaut des Ports du DUART --*********************************************** for Port_Init in G_Defs.Port'First .. G_Defs.Port'Last loop Pos_Interruption (Mode => Aucun); Emission_Reception (Port_Serie => Port_Init, Mode => Aucun); Interruption_Reception_Sur_R_Rdy (Port_Init); Pos_Vitesse (Port_Serie => Port_Init, Vitesse => G_Defs.Bd9600); Pos_Parite (Port_Serie => Port_Init, Val_Parite => G_Defs.None); Pos_Stop_Bits (Port_Serie => Port_Init, Val_Stop_Bits => 1); Pos_Nbre_Bits_Caractere (Port_Serie => Port_Init, Val_Nbre_Bits_Par_Caractere => 8); end loop; end Port_Serie_68k;
nblk1=1c nid=6 hdr6=26 [0x00] rec0=1d rec1=00 rec2=01 rec3=018 [0x01] rec0=17 rec1=00 rec2=03 rec3=08e [0x02] rec0=19 rec1=00 rec2=0e rec3=04c [0x03] rec0=1a rec1=00 rec2=10 rec3=01a [0x04] rec0=15 rec1=00 rec2=05 rec3=00c [0x05] rec0=1a rec1=00 rec2=04 rec3=08a [0x06] rec0=18 rec1=00 rec2=1b rec3=00e [0x07] rec0=1a rec1=00 rec2=14 rec3=02c [0x08] rec0=15 rec1=00 rec2=0a rec3=004 [0x09] rec0=18 rec1=00 rec2=1c rec3=00c [0x0a] rec0=16 rec1=00 rec2=17 rec3=014 [0x0b] rec0=17 rec1=00 rec2=07 rec3=01a [0x0c] rec0=18 rec1=00 rec2=08 rec3=070 [0x0d] rec0=17 rec1=00 rec2=12 rec3=03c [0x0e] rec0=17 rec1=00 rec2=0b rec3=026 [0x0f] rec0=19 rec1=00 rec2=18 rec3=046 [0x10] rec0=18 rec1=00 rec2=13 rec3=072 [0x11] rec0=17 rec1=00 rec2=02 rec3=090 [0x12] rec0=08 rec1=00 rec2=0c rec3=000 [0x13] rec0=04 rec1=00 rec2=06 rec3=000 [0x14] rec0=18 rec1=00 rec2=02 rec3=034 [0x15] rec0=15 rec1=00 rec2=0d rec3=07c [0x16] rec0=06 rec1=00 rec2=06 rec3=000 [0x17] rec0=09 rec1=00 rec2=06 rec3=000 [0x18] rec0=08 rec1=00 rec2=14 rec3=000 [0x19] rec0=1a rec1=00 rec2=0e rec3=066 [0x1a] rec0=10 rec1=00 rec2=14 rec3=000 [0x1b] rec0=00 rec1=00 rec2=00 rec3=000 tail 0x21769c0b28924917c1ab1 0x42a00088462060003 Free Block Chain: 0x6: 0000 00 0d 00 6e 80 3f 20 20 20 20 20 20 20 20 20 20 ┆ n ? ┆ 0xd: 0000 00 0f 01 3f 80 47 20 20 20 20 20 20 20 50 6f 73 ┆ ? G Pos┆ 0xf: 0000 00 16 03 fc 80 1d 20 20 20 20 20 20 20 20 20 20 ┆ ┆ 0x16: 0000 00 15 03 fc 00 1a 20 20 20 20 20 20 20 20 20 20 ┆ ┆ 0x15: 0000 00 09 03 f9 80 22 20 20 20 20 20 20 20 20 20 20 ┆ " ┆ 0x9: 0000 00 19 03 fc 80 0a 52 65 67 5f 54 65 6d 70 6f 2c ┆ Reg_Tempo,┆ 0x19: 0000 00 1a 03 fc 80 0a 75 5f 52 65 67 69 73 74 72 65 ┆ u_Registre┆ 0x1a: 0000 00 11 03 fc 80 1c 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ┆ **********┆ 0x11: 0000 00 00 00 05 80 02 2a 2a 02 63 74 65 75 72 5f 49 ┆ ** cteur_I┆