IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Turbo Pascal Discussion :

Compilation Real Mode/Protected Mode et DOS USB


Sujet :

Turbo Pascal

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2011
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 26
    Points : 29
    Points
    29
    Par défaut Compilation Real Mode/Protected Mode et DOS USB
    Bonjour,

    J'ai créé un programme de test qui permet de gérer à partir d'un PC des entrées/sorties via l'USB sur une carte électronique.
    Pour cela, j'ai compilé mon programme en real mode.

    Je démarre le PC, MS-DOS se lance.

    Je charge le driver DOSUSB.COM de Georg Potthast que l'on peut trouver ici http://www.dosusb.net/
    Puis je lance mon programme compilé en real mode.

    De cette facon tout se deroule bien, la communication USB est fonctionnelle

    MAIS s'agissant d'un programme de test destiné à être implémenté dans le code d'un programme beaucoup plus important, j'ai besoin de compiler le programme en protected mode. Et malheureusement, lorsque je compile en protected mode, la compilation se passe bien mais lors de l'execution, plus de communication et je ne sais pas comment résoudre mon problème.

    Si vous avez des idées, je suis preneur.

    Voici le code source :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
     
    {$i-}
    Program AXUSBES;
     
    Uses DOS, CRT;
     
    Const
     the_dev_add = 1;    (*Adresse peripherique usb*)
     in_endpoint = 1;
     out_endpoint = 1;   
     ATTENTE : INTEGER = 800  ;
     
     
    (* define structure of URB *)
    Type
     urbtype = Record
     transaction_token: byte (* control (2Dh), in (69h), out (E1h) as hex code *);
     chain_end_flag   : byte {another urb follow this urb in memory? zero=no,one=yes};
     dev_add          : byte;
     end_point        : byte;
     error_code       : byte;
     status           : byte (* returned by dosuhci *);
     transaction_flags: word (* reserved *);
     buffer_off       : word (* for in/out *);
     buffer_seg       : word (* for in/out *);
     buffer_length    : word (* for in/out *);
     actual_length    : word (* for in/out *);
     setup_buffer_off : word (* for control *);
     setup_buffer_seg : word (* for control *);
     start_frame      : word (* reserved *);
     nr_of_packets    : word (* iso *);
     int_interval     : byte (* reserved *);
     error_count      : byte (* reserved *);
     timeout          : word (* reserved *);
     next_urb_off     : word (* reserved *);
     next_urb_seg     : word (* reserved *);
    end (* 32 byte long *);
     
    Var
     urb: urbtype;
     buffer_o: Array[0..1024-1] Of Byte;
     buffer_i: Array[0..1024-1] Of Byte;
     packetlen: Word;
     bStr: String;
     f: File;
     ReqNr: Word;
     tab_out: Array[0..16] Of Byte;   {To PIC}
     tab_in: Array[0..32] Of Byte;   {From PIC}
     i,j,choix,val,quit_proc,quit_ok: integer;
     SNOOPY, TEST_SNOOPY : BOOLEAN ;
     
    (*//////////////////////////// DO_OUT //////////////////////////////////*)
    Procedure do_out;  (* To PIC *)
     
    Var
     Reg: Registers;
    Begin
     (*WriteLn('Before request nr.:', ReqNr:4, '  packetlen: ', packetlen);*)
    (* set up out request *)
     urb.transaction_token := $E1;(* $E1= Sortie*)
     urb.chain_end_flag := 0;
     urb.dev_add := the_dev_add;  (* Adresse Microchip =1 si c'est le seul usb connecte à la carte mere*)
     urb.end_point := out_endpoint;    (* =1 *)
     urb.error_code := 0;
     urb.status := 0;
     urb.transaction_flags := 0;
     urb.buffer_off := ofs(buffer_o);
     urb.buffer_seg := seg(buffer_o);
     urb.buffer_length := packetlen;
     urb.actual_length := 64;
     urb.setup_buffer_off := 0;
     urb.setup_buffer_seg := 0;
     urb.start_frame := 0;
     urb.nr_of_packets := 0;
     urb.int_interval := 0;
     urb.error_count := 0;
     urb.timeout := 0;
     urb.next_urb_off := 0;
     urb.next_urb_seg := 0;
    (* now call DosUHCI *)
     Reg.DS := seg(urb);
     Reg.DX := ofs(urb);
     Intr($65, Reg);
     (*WriteLn('After request nr.:', ReqNr:4, '  Error: ', urb.error_code);*)
     Inc(ReqNr);
    End (* do_out *);
     
    (*//////////////////////////// DO_IN ///////////////////////////////////*)
    Procedure do_IN;  (* From PIC *)
     
    Var
     Reg: Registers;
    Begin
     (*WriteLn('Before request nr.:', ReqNr:4, '  packetlen: ', packetlen);*)
     (* set up in request *)
     urb.transaction_token := $69;(* $69=Entree*)
     urb.chain_end_flag := 0;
     urb.dev_add := the_dev_add;  (* Adresse Microchip=1 si c'est le seul usb connecte à la carte mere*)
     urb.end_point := in_endpoint;(* =1 *)
     urb.error_code := 0;
     urb.status := 0;
     urb.transaction_flags := 0;
     urb.buffer_off := ofs(buffer_i);
     urb.buffer_seg := seg(buffer_i);
     urb.buffer_length := packetlen;
     urb.actual_length := 64;
     urb.setup_buffer_off := 0;
     urb.setup_buffer_seg := 0;
     urb.start_frame := 0;
     urb.nr_of_packets := 0;
     urb.int_interval := 0;
     urb.error_count := 0;
     urb.timeout := 0;
     urb.next_urb_off := 0;
     urb.next_urb_seg := 0;
    (* now call DosUHCI *)
     Reg.DS := seg(urb);
     Reg.DX := ofs(urb);
     Intr($65, Reg);
     (*WriteLn('After request nr.:', ReqNr:4, '  Error: ', urb.error_code);*)
     Inc(ReqNr);
    End (* do_in *);
     
    (*//////////////////////////// WATCHDOG /////////////////////////////*)
    Procedure watchdog;
     
    VAR SORTIE1  : BYTE ;
    BEGIN
         IF ( SNOOPY AND TEST_SNOOPY) THEN SORTIE1 := 1 ELSE SORTIE1 := 0 ;
         tab_out[7]:=SORTIE1;     {PORT [$314] := SORTIE1 ;}
         packetlen:=17;
         for i:=0 to 16 do buffer_o[i]:=tab_out[i];
         do_out;
         SNOOPY := NOT (SNOOPY);
    END ;
     
    (*//////////////////////////// TWATCHDOG /////////////////////////////*)
    Procedure twatchdog;
    Var I : Integer;
    BEGIN
       TEST_SNOOPY := FALSE ;
       DELAY(ATTENTE) ;
       TEST_SNOOPY := TRUE  ;
       WHILE NOT KEYPRESSED DO
       BEGIN
          WATCHDOG ;
          FOR I := 1 to 1000 do ;
       END ;
    END ;
     
     
    (*//////////////////////////// MAIN ////////////////////////////////////*)
    Begin
     demarrage;
     quit_ok:=0;
     While quit_ok=0 do
     Begin
      ReqNr:=0;
      quit_proc:=0;
      for i:=0 to 16 do tab_out[i]:=0;
      for i:=0 to 32 do tab_in[i]:=0;
      packetlen:=17;
      for i:=0 to 16 do buffer_o[i]:=tab_out[i];
      do_out;
      (*Menu de selection*)
      clrscr;
      writeLn('Menu - selectionnez un test :');
      writeLn(' ');
      writeLn('0 - Watchdog');
      writeLn(' ');
      writeLn('256 pour quitter');
      writeLn(' ');
      write('Test : ');
      readLn(choix);
      case choix of
       0 : twatchdog;
       256 : quitter;
       -10000..-1,9..255,257..10000 : erreur;
      end;
      delay(300);
     end;
    end. (* AXUSB.PAS *)
    Merci

  2. #2
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 445
    Points
    28 445
    Par défaut
    c'est tout à fait normal, quand le processeur bascule en mode protégé, les interruptions du mode réel ne sont plus valides.

    EDIT: tu peux consulter cet exemple du SWAG
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2011
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 26
    Points : 29
    Points
    29
    Par défaut
    Je te remercie pour ta réponse. Je vais aller voir le lien que tu m'as donné et voir si j'arrive à y comprendre quelque chose

    EDIT : Ce n'est pas gagné. Le code m'est incompréhensible à plus de 80%
    Je vais déjà tenter d'ajouter la fonction RMInterrupt à mon programme et voir si ça compile

    EDIT2 :
    - Bon, j'ai bien compris que mon interruption $65 posait problème en mode protégé.
    - J'ai récupéré le code du programme dpmiwin (SWAG) en modifiant $61 par $65 et en modifiant les uses afin de pouvoir le compiler (crt, dos, winapi au lieu de winprocs,
    wintypes, win31, wincrt )
    - Je lance le DOSUSB.COM qui me dit gentiment que "DOSUSB Driver 2.0 installed at int 0x65"
    - Je lance le dpmiwin.exe compilé en mode protected mais malheureusement j'ai le message "Something went wrong!"

    Après je ne sais pas trop si c'est comme ça qu'il faut s'y prendre ou si il faut que je récupère un bout de code de dpmiwin et que je l’intègre a mon programme ? Bref, c'est pas gagné cette histoire

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2011
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 26
    Points : 29
    Points
    29
    Par défaut
    Bon, malheureusement je bloque toujours.

    Je suppose que je dois remplacer ce bout de code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Reg.DS := seg(urb);
     Reg.DX := ofs(urb);
     Intr($65, Reg);
    par l'appel à la fonction RMInterrupt. Le probleme est de savoir comment l'appeler. D'un coté j'ai le type register et de l'autre un tDPMICallStruc


    Pour rappel voici le code exemple que Paul TOTH m'a indiqué
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    program dpmiwin;               {from c't 1/1992 # 197}
     
    uses
      winprocs,
      wintypes,
      win31,
      wincrt;
     
    type
      tDPMICallStruc = Record  {for use by RMInterrupt}
        EDI, ESI, EBP, Reserved,
        EBX, EDX, ECX, EAX : longint;
        Flags, ES, DS, FS,
        GS, IP, CS, SP, SS : word;
      end;
     
    function RMInterrupt(IntNo, flags, copywords : byte;
                         var DPMICallStruc : tDPMICallStruc) : boolean;
    begin
      asm
        push es       {save es en di from protected mode on stack}
        push di
        mov bh, flags {if bit 0 is zero interrupt controller ...}
                      {... and A20-line will be reset. other bits must be zero}
        mov bl, intno {put interrupt nummer to be executed in register bl}
        mov cx, word ptr copywords {cx = number of words that are to be copied...}
                      { from... prot. mode to real mode stack}
        mov ax, 0300h {put DPMI simulate real mode interrupt nummer in register ax}
        les di, dpmiCallStruc  {16-bits pointer to record - 32 bits uses edi}
                      {les di, ...: load segment (2 bytes) dpmicallstruc in}
                      { register di en offset (ook 2 bytes) }
                      { in register es. in short load pointer to dpmicallstruc}
                      { in registers di:es                                 }
        int 31h       {excute interrupt nummer in bl in real-mode after filling }
               { cpu-registers with values from dpmicallstruc and return in}
               { protected mode with contents of cpu-registers at end of real-mode}
               { interrupt in dpmicallstruc. i.o.w. act as if dpmicallstruc  }
               { are the cpu-registers at the end of excuting the real-mode int.}
        jc @error
        mov ax, 1           {function succesfull}
        jmp @done
       @error:
        xor ax, ax          {make ax=0, function not succesfull}
       @done:
        pop di              {put es and di back}
        pop es
      end;
    end;
     
    var
      selector  : word;
      segment   : word;
      selseg    : longint;
      dcs       : tdpmicallstruc;
      printstrg : pchar;
     
    begin
      fillchar(dcs, sizeof(dcs), 0);    {zero dcs}
        {------- verify presence of dpmitsr in memory}
      dcs.eax := $00000000;  {just for clarity that ax is called with function 0}
                             { as contents is already zero because of use}
                             { of function filchar() on previous line. }
      rminterrupt($61, 0, 0, dcs);
      if (dcs.eax and $ffff = $affe) then
        writeln('DPMItsr in memory')
       else
         writeln('Something went wrong!');
                 {this part needs improvement.                 }
                 {if dpmitsr is not in memory then pc may crash,}
                 { which is not strange as then an interrupt  }
                 { is called that most likely is 0000:0000 in        }
                 { memory.                                        }
                 {this is to be substituted with a routine that first checks}
                 { that pointer of int. 61 is not 0000:0000.        }
        {------- read string through pointer}
      dcs.eax := $00000100;              {call int. 61 (=dpmitsr) with ah = 1}
      rminterrupt($61, 0, 0, dcs);
      selector := allocselector(word(nil)); {make new selector and fill with values:}
      setselectorbase(selector, longint(dcs.es) * 16);
                                          { base: es is put in by 'dpmitsr'}
      setselectorlimit(selector, longint($ffff));
                                         { and limit: $ffff is maximum value. this}
                                         { does not give problems because we put a}
                                         { 'zero-terminated' string on the screen.}
      printstrg := ptr(selector, word(dcs.edi));   {also di is put in by 'dpmitsr'  }
      writeln(printstrg);
      freeselector(selector);
        {------- read string by making a copy from real-mode memory to
                  Windows-memory in low 640k-area}
      selseg := globaldosalloc(100); {allocate 100 bytes Windows-memory below 640k.}
                                   {high word of longint 'selseg' is segment for }
                                   { use in real-mode and low word is selector    }
                                   { for use in protected mode.                 }
      if selseg <> 0 then
      begin
        selector := word(selseg and $ffff);  {determine selector}
        segment  := word(selseg shr 16);      {determine segment}
        dcs.eax  := $00000200;               {call int. 61 (=dpmitsr) with ah = 2   }
        dcs.es   := segment;                   {use segment for int. 61 in real-mode}
        dcs.edi  := 0;                       {offset is 0                          }
        rminterrupt($61, 0, 0, dcs);
        printstrg := ptr(selector, 0);
        writeln(printstrg);
        globaldosfree(selector);
      end;
    end.

  5. #5
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 730
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 730
    Points : 15 132
    Points
    15 132
    Par défaut
    Salut,

    alors là, ton histoire c'est pas du tout ma tasse de thé et je ne pourrai pas t'aider d'un millimètre sauf à te dire qu'éventuellement, tu pourrais aussi poster une question dans la section Assembleur du forum, des fois que quelqu'un connaisse sur le bout des doigts ces bascules réel/protégé.
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2011
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 26
    Points : 29
    Points
    29
    Par défaut
    Salut,

    merci, j'y vais de ce pas

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2011
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 26
    Points : 29
    Points
    29
    Par défaut
    Je continue mon moulinage tout seul comme un grand

    J'ai tenté de remplacer logiquement le code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Reg.DS := seg(urb);
     Reg.DX := ofs(urb);
     Intr($65, Reg);
    par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    fillchar(dcs, sizeof(dcs), 0);    {zero dcs}
    dcs.edx := ofs(urb); 
    dcs.ds :=seg(urb);                      
    dcs.es := 0;
    rminterrupt($65, 0, 0, dcs);
    Ca plante pas, mais ca ne fonctionne toujours pas

  8. #8
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 445
    Points
    28 445
    Par défaut
    il faudrait trouver une implémentation Pascal de l'accès USB

    il y a bien ceci http://pascal.developpez.com/telecha...4030/Unite-USB mais la partie PCI utilise une Interruption du mode réel, on trouve en rond du coup

    par contre la partie qui utilise Port[] est quand à elle indépendante du mode d'exécution du processeur.
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2011
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 26
    Points : 29
    Points
    29
    Par défaut
    C'est exact, la tache me semble bien compliqué, surtout pour mon niveau
    Merci en tous cas d'essayer de m'aider.

    J'avais vu dans un programme compilé en mode protegé l'appel à une interruption écrite comme ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    INTR($80,Dos.Registers(PARMS))
    Du coup j'ai tenté de faire pareil en rajoutant le Dos.Registers
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Avant
    Intr($65, Reg);
     
    Après
    INTR($65,Dos.Registers(Reg));
    Toujours pas bon

  10. #10
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 730
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 730
    Points : 15 132
    Points
    15 132
    Par défaut
    Salut,

    2 questions de newbie :
    1- pourquoi veux-tu à tout prix passer en mode réel, et gérer toi-même les interruptions ? J'ai bien compris que ton bout de code doit s'intégrer dans un autre plus gros, mais la libUsb dont on parle dans le forum de FreePascal ne pourrait-elle pas convenir pour faire ce que tu as à faire avec le port Usb ?

    2- tu écris $65 alors que dans le code fourni par Paul il est écrit $61 : peux-tu expliquer cette différence ?

    Merci,
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  11. #11
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2011
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 26
    Points : 29
    Points
    29
    Par défaut
    Salut,

    Je vais essayer d'etre clair. Editeur/Compilateur : Borland Pascal 7

    1er cas ou tout fonctionne.
    1 - Je compile mon bout de code, celui du post1 en "real mode application"
    2 - Je lance le driver DOSUSB.COM. En retour j'ai un message qui me dit DOSUSB Driver installé à l'adresse interruption 0x65h
    3 - Je lance mon programme compilé, qui lance l'interruption 65 pour appeler le driver "DOSUSB"


    2eme cas ou ça ne fonctionne pas.
    1 - Je compile mon bout de code, celui du post1 en "protected mode application"
    2 - Je lance le driver DOSUSB.COM. En retour j'ai un message qui me dit DOSUSB Driver installé sur interruption 0x65h
    3 - Je lance mon programme compilé qui lance l'interruption 65 pour appeler le driver "DOSUSB"
    Dans ce cas le programme(l'interruption) ne semble pas enclencher l'appel vers le driver.

    Dans le cas du code fourni par Paul, le $61 était un exemple. Les adresses réservées pour les interruptions logicielles utilisateur vont de $60 à $67

    Je ne connais pas la libUSB de freePascal, mais est elle utilisable par Borland Pascal 7. Et puis, malheureusement, j'ai une grosse contrainte : compilation sous Borland Pascal en protected mode application, à cause du programme qui a une bonne dizaine d'unité et un tres grand nombre de lignes de code.

  12. #12
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 730
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 730
    Points : 15 132
    Points
    15 132
    Par défaut
    Citation Envoyé par rocky77 Voir le message
    Salut,

    Je vais essayer d'etre clair.
    Raté : tu expliques un tas de trucs mais tu ne réponds pas à la première question, que je repose, du coup :
    Citation Envoyé par Jipété Voir le message
    1- pourquoi veux-tu à tout prix passer en mode réel, et gérer toi-même les interruptions ?
    Merci pour l'info 61/65.

    Citation Envoyé par rocky77 Voir le message
    Je ne connais pas la libUSB de freePascal, mais est-elle utilisable par Borland Pascal 7 ?
    Pas la moindre idée (je n'ai pas l'intention de trifouiller de l'Usb avec mes codes), mais je t'invite à faire une recherche sur le forum de FreePascal.
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  13. #13
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 445
    Points
    28 445
    Par défaut
    Citation Envoyé par Jipété Voir le message
    Salut,

    2 questions de newbie :
    1- pourquoi veux-tu à tout prix passer en mode réel, et gérer toi-même les interruptions ? J'ai bien compris que ton bout de code doit s'intégrer dans un autre plus gros, mais la libUsb dont on parle dans le forum de FreePascal ne pourrait-elle pas convenir pour faire ce que tu as à faire avec le port Usb ?
    en fait DOSUSB.com est ce qu'on appelle un programme résidant. A la belle époque du DOS on utilisait notamment MOUSE.COM pour gérer la souris
    ce programme reste en mémoire et installe un vecteur sur l'interruption $65 qui sert de point d'entrée dans son API.

    Ce programme étant un mode réel, il faut être en mode réel pour l'invoquer.

    Citation Envoyé par Jipété Voir le message
    2- tu écris $65 alors que dans le code fourni par Paul il est écrit $61 : peux-tu expliquer cette différence ?
    Merci,
    ce n'était qu'un exemple en effet.

    Après FreePascal est initialement développé en Turbo Pascal, il est donc envisageable de migrer le projet TP vers FPC...y compris en mode réel d'ailleurs http://wiki.freepascal.org/DOS

    Petite remarque également, Turbo Pascal utilise un mode protégé 16bits (compatible 286), alors que FPC utilise un DOSExtender 32bits (nécessite un 386).
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  14. #14
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2011
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 26
    Points : 29
    Points
    29
    Par défaut
    @Jipété : désolé

    @Paul : Merci, en effet c'est bien plus clair

  15. #15
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 730
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 730
    Points : 15 132
    Points
    15 132
    Par défaut
    Bonjour,

    merci pour tes explications, Paul, mais, comment dire ?, elles arrivent en second niveau si je puis dire : tu nous expliques le fonctionnement du driver dosusb (merci , ah les bons vieux tsr qu'il fallait installer en mémoire à coups de memmaker ! Toute une époque...), mais rocky77 ne nous dit toujours pas pourquoi il veut utiliser ce driver.

    Tout ce qu'on peut lire à ce propos dans son premier post, c'est ça :

    Citation Envoyé par rocky77 Voir le message
    J'ai créé un programme de test qui permet de gérer à partir d'un PC des entrées/sorties via l'USB sur une carte électronique.
    [...]
    MAIS s'agissant d'un programme de test destiné à être implémenté dans le code d'un programme beaucoup plus important, j'ai besoin de compiler le programme en protected mode.
    De la première ligne je comprends qu'il veut envoyer et recevoir des données de/vers un périphérique USB (carte électronique ou autre, c'est pas le souci : il y en a tout plein qui s'amusent avec Arduino et compagnie).
    Et de la seconde je ne vois que cet impératif de compilation en protected mode. Pourquoi ? Juste parce que le programme est beaucoup plus important ?
    Il nous manque un truc, là, un lien, un rapport de cause à effet...

    Je repose donc la suite de ma question (oui, il y avait deux questions dans une ) : pourquoi ne pas utiliser la libUSB (en supposant qu'elle soit opérationnelle), qui doit être capable d'envoyer et de recevoir de/vers un port USB (sinon elle ne porterait pas ce nom, àmha) ?
    Un lien à voir
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  16. #16
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2011
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 26
    Points : 29
    Points
    29
    Par défaut
    Salut,

    Alors l’impératif de compiler en protected mode vient du fait que je dois mettre mon bout de code dans un programme beaucoup plus important, comportant pas mal d'unités. Et que si je compile ce programme beaucoup plus important en mode réel, j'ai une erreur lors de la compilation : Erreur 107 -> Too may relocation items. Erreur que je n'ai plus en compilant en protected mode application.

    Donc je vais essayer de chercher sur les 2 pistes que vous m'avez indiqué, le DosExtender et la libusb.

    Je vais regarder comment installer ce DosExtender dans le DOS

  17. #17
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2011
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 26
    Points : 29
    Points
    29
    Par défaut
    Bon, je viens vous apporter quelques nouvelles. Après quelques recherches, la plus part des dos extender sont incompatibles avec les executables générés par Borland Pascal 7.
    J'ai réussi a prendre contact avec un gars de la société tenberry (dos4gw) et qui m'a un peu aiguillé en me disant que ce truc, http://www.delorie.com/djgpp/doc/dpmi/api/310300.html, devrait marcher.
    Donc il faut que je vois comment bien utiliser le tout premier code que Paul m'avait indiqué.

  18. #18
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2011
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 26
    Points : 29
    Points
    29
    Par défaut
    Bon je ne pensais pas que ça allait se compliquer a ce point

    Message de Terry Colligan que je n'ose plus embeter
    The driver RM code at int $65 can only reference memory in the first megabyte. Your program and its data will be allocated somewhere above one megabyte, so you have to:

    Allocate the structure to be passed to your driver in DOS memory.
    If the structure points to memory buffers, those also have to be in DOS memory. Otherwise the driver won't be able to see them
    Get a PM pointer to the structure in DOS memory.
    Use that pointer to fill in the structure and buffers.
    Change all of the addresses to be real-mode addresses in the structure.

    There are DPMI calls to help you do all of the above, but it's not as simple as the code you've written so far.

    It's all doable, and probably in a few days work for you, but it's not trivial.

    You might start by trying an interrupt which doesn't need a structure, like the DOS get time subfunction. Once you have that working, try an int $65 which doesn't involve buffers so that you only have to worry about allocating the structure in DOS memory. Finally, you can do the full job, with buffers in DOS memory as well as the structure.

    It's somewhat messy, but it's not really all that hard.

  19. #19
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 730
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 730
    Points : 15 132
    Points
    15 132
    Par défaut
    Salut,
    Citation Envoyé par rocky77 Voir le message
    Bon je ne pensais pas que ça allait se compliquer a ce point
    Et l'option "libUSB", elle dit quoi ?
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  20. #20
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2011
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 26
    Points : 29
    Points
    29
    Par défaut
    L'option libusb est mise de coté pour le moment. Pour l'utiliser, il faudrait que je passe le code sur FreePascal. Et comme ce n'est pas 100% compatible avec Borland Pascal 7, la personne qui est au dessus de moi m'a dit "Niet".

Discussions similaires

  1. erreurs compil au passage en mode x64
    Par visuallover dans le forum VC++ .NET
    Réponses: 4
    Dernier message: 06/01/2010, 19h18
  2. Passage en protected mode
    Par Mat000 dans le forum Programmation d'OS
    Réponses: 2
    Dernier message: 07/07/2008, 17h06
  3. [BP7] Conversion BP7 (DOS mode > Windows Mode)
    Par Transgarp dans le forum Turbo Pascal
    Réponses: 5
    Dernier message: 07/04/2008, 19h04
  4. Réponses: 3
    Dernier message: 15/02/2008, 09h06
  5. Réponses: 12
    Dernier message: 05/04/2007, 15h18

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo