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. #21
    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 430
    Points
    28 430
    Par défaut
    j'ai vu que sur le forum de DOSUSB il te propose une solution intéressante. Si tu arrives à lancer une application DOS depuis le mode protégé, tu pourrais faire une appli TurboPascal en mode réel pour interagir avec le driver USB puis retourner les infos au mode protégé...bon je sais pas si c'est facile de lancer un programme RM depuis le MP

    sinon une autre idée m'est venue, le mode UnREAL, si ton application a besoin de beaucoup de mémoire, il est possible tout en restant en mode réel d'accéder à la mémoire étendue, c'est ce que je fais dans ce projet qui attaque la carte Rage128 sous DOS en mode réel
    http://tothpaul.free.fr/sources.php?bp7.rage128

    si c'est un problème de code trop volumineux, les OVERLAY permettent de réduire l'occupation mémoire du code tout en restant en mode réel, c'est un peu le bazar mais c'est à envisager.

    cette page aussi donne des idées je pense
    http://www.phost.de/~stefan/turbo.html
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  2. #22
    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
    Bonjour,

    J'ai vu les alternatives mais je ne le sens pas bien. J'ai continué mes recherches, j'en suis arrivé au code ci-dessous mais j'ai l'impression que je me melange un peu les pinceaux avec les registre et les memoires (segments,selector,offset..)

    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
    Uses DOS, CRT, WINAPI;
    
    Const
     the_dev_add = 1;    (*Adresse peripherique usb*)
     in_endpoint = 1;
     out_endpoint = 1;    (* 2 avant *)
    (* myFN = 'dosuhci.txt';*)
     ATTENTE : INTEGER = 800  ;
    
    type
    DPMIRegisters = Record  {Registers for DPMI int callst}
        DPMI_EDI, DPMI_ESI, DPMI_EBP, EReserved,
        DPMI_EBX, DPMI_EDX, DPMI_ECX, DPMI_EAX : longint;
        DPMI_Flags, DPMI_ES, DPMI_DS, DPMI_FS, DPMI_GS,
        DPMI_IP, DPMI_CS, DPMI_SP, DPMI_SS : word;
    end;
    
    (* 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 *);
    
    type
     buffer = Array[0..255] Of Byte;
     p_buffer = ^buffer;
    
    Var
     urb: urbtype;
     buffer_o: Array[0..(*1024-1*)255] Of Byte;
     buffer_i: Array[0..(*1024-1*)255] 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 ;
     selseg, selseg_buff :longint;
     selector, selector_buff, segment, segment_buff : word;
     P_PM : p_buffer;
     P_PM_buff : p_buffer;
    
    function Intr386(const int_number:byte; const stack_words:word;
                           var regs:DPMIRegisters): word; assembler;
    asm
       push es
       push di
       xor bx, bx
       mov bl, int_number
       mov cx, stack_words
       les di,regs
       mov ax, 0300h
       int 31h
       pop di
       pop es
    end;
    
    
    {//////////////////////////// DO_OUT //////////////////////////////////}
    Procedure do_out;  { To PIC }
    Var
      DCS : DPMIRegisters;
    Begin
     selseg := globaldosalloc(40 );
     selector := word(selseg and $FFFF);
     segment := word(selseg SHR 16);
     P_PM:=ptr(selector,0);  {pointeur pour remplir ma structure dans la memoire <640k}
    
     writeln('1 ');
     selseg_buff := globaldosalloc(257);
     selector_buff := word(selseg_buff and $FFFF);
     segment_buff := word(selseg_buff SHR 16);
     P_PM_buff:=ptr(selector_buff,0);  {pointeur pour remplir mon buffer dans la memoire <640k}
     writeln('2 - size de buffer_o = ',sizeof(buffer_o));
    
     move(buffer_o,P_PM_Buff^,sizeof(buffer_o)); {copie des données du buffer dans la memoire <640k}
    
     writeln('3 ',P_PM_Buff^[0],' ',P_PM_Buff^[1],' ',P_PM_Buff^[2]);
    (* 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 := 0;(*ofs(P_PM_Buff^);*) {quoi mettre ??? ofs(P_PM_Buff^) ? 0? autre?}
     urb.buffer_seg := selector_buff;(*(seg(P_PM_Buff^);*) {quoi mettre ??? seg(P_PM_Buff^) ? autre ?
     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 *)
     fillchar(dcs, sizeof(dcs), 0);
     move(urb,P_PM^,sizeof(urb));  {copie des données de la struct. URB dans la memoire <640k}
     writeln('4');
     DCS.DPMI_ES := segment;{Est ce vraiment ca qu'il faut mettre}
     DCS.DPMI_DS := seg(P_PM^); {Est ce vraiment ca qu'il faut mettre}
     DCS.DPMI_EDX :=ofs(P_PM^);{Est ce vraiment ca qu'il faut mettre}
    writeln('5');
    intr386($65, 0, dcs);
    GlobalDosFree(selector);
    GlobalDosFree(selector_buff);
    (* Reg.DS := seg(urb);  {Ce que je cherche a remplacer depuis le debut !!!! Arghh}
     Reg.DX := ofs(urb);  {Ce que je cherche a remplacer depuis le debut !!!! Arghh}
     Intr($65,Reg);*)  {Ce que je cherche a remplacer depuis le debut !!!! Arghh}
     Inc(ReqNr);
    End (* do_out *);
    
    (*//////////////////////////// MAIN ////////////////////////////////////*)
    Begin
      ReqNr:=0;
      for i:=0 to 16 do tab_out[i]:=0;
      tab_out[2] := 64;
      packetlen:=17;
      for i:=0 to 16 do buffer_o[i]:=tab_out[i];
      do_out;
      repeat until keypressed;
    end. (* AXUSB.PAS *)
    
    [/cpp]

  3. #23
    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 430
    Points
    28 430
    Par défaut
    pas le temps de lire ton code

    mais en mode réel un pointeur c'est un couple Segment:Offset, le segment est placé dans un registre de segment CS, DS, ES, SS et l'offset est un déplacement à l'intérieur de ce segment (SI, DI, AX...peu importe) du coup la lecture de ES:[AX] s'écrit Mem[ES:AX] en Pascal est l'adresse physique "16 * ES + AX" avec des registre 16 bits on atteins alors les limites d'adressage du mode réel. Du coup la même adresse peut être accessible avec différents couples segment:offset pour peu que 16*segment+offset donne le même résultat, [1:0] = [0:16], [10:10] = [0:170], etc...

    en mode protégé la signification du registre de segment n'est plus la même, c'est un sélecteur dans une table de descripteurs (GDT)...voir mon tuto sur le boot en mode protégé contrairement au mode réel, la GDT indique une adresse de base mais aussi les modes d'accès possibles qui peuvent provoquer des violations d'accès quand on tente d'écrire dans une zone mémoire d'exécution par exemple.
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  4. #24
    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
    Ah ça fait plaisir de trouver la solution : la voici

    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
    
    function Intr386(const int_number:byte; const stack_words:word;
                           var regs:DPMIRegisters): word; assembler;
    asm
       push es
       push di
       xor bx, bx
       mov bl, int_number
       mov cx, stack_words
       les di,regs
       mov ax, 0300h
       int 31h
       pop di
       pop es
    end;
    
    
    (*//////////////////////////// DO_OUT //////////////////////////////////*)
    Procedure do_out;  (* To PIC *)
    Var
      DCS : DPMIRegisters;
      selseg, selseg_buff :longint;
      selector, selector_buff, segment, segment_buff : word;
      P_PM : p_buffer;
      P_PM_buff : p_buffer;
    
    Begin
     selseg := globaldosalloc(40);
     selector := word(selseg and $FFFF);
     segment := word(selseg SHR 16);
     P_PM:=ptr(selector,0);
    
     selseg_buff := globaldosalloc(257);
     selector_buff := word(selseg_buff and $FFFF);
     segment_buff := word(selseg_buff SHR 16);
     P_PM_buff:=ptr(selector_buff,0);
     move(buffer_o,P_PM_Buff^,sizeof(buffer_o)); (*REMPLISSAGE AVEC POINTEUR PROTECTED VERS MEMOIRE AVEC DONNEES MODE REEL *)
    
    (* 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 :=0; (* METTRE OFFSET A 0 *)
     urb.buffer_seg := segment_buff; (* SEGMENT ADRESSE EN MODE REEL *)
     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 *)
     fillchar(dcs, sizeof(dcs), 0);
     move(urb,P_PM^,sizeof(urb)); (*REMPLISSAGE AVEC POINTEUR PROTECTED VERS MEMOIRE AVEC DONNEES MODE REEL *)
     DCS.DPMI_ES := 0;(*segment;*)
     DCS.DPMI_DS := segment;(*ADRESSE SEGMENT MODE REEL DE MA STRUCTURE URB*)
     DCS.DPMI_EDX := 0;
     intr386($65, 0, dcs);
     GlobalDosFree(selector);
     GlobalDosFree(selector_buff);
     (* Reg.DS := seg(urb);
     Reg.DX := ofs(urb);
     Intr($65,Reg);*)
     Inc(ReqNr);
    End (* do_out *);

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, 20h18
  2. Passage en protected mode
    Par Mat000 dans le forum Programmation d'OS
    Réponses: 2
    Dernier message: 07/07/2008, 18h06
  3. [BP7] Conversion BP7 (DOS mode > Windows Mode)
    Par Transgarp dans le forum Turbo Pascal
    Réponses: 5
    Dernier message: 07/04/2008, 20h04
  4. Réponses: 3
    Dernier message: 15/02/2008, 10h06
  5. Réponses: 12
    Dernier message: 05/04/2007, 16h18

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