Interruption mode reel depuis mode protegé avec DPMI [Resolu] - ASM - Programmation
Marsh Posté le 19-11-2015 à 17:07:06
Alors je regarderais ce que j'ai dans mes archives.
Comme je disais en MP, ça fait 15 ans que j'ai pas fait ça
Marsh Posté le 19-11-2015 à 17:17:22
Une doc un peu plus claire:
http://www.delorie.com/djgpp/doc/dpmi/api/310300.html
Marsh Posté le 20-11-2015 à 14:18:15
J'avais deja reperé cette doc.
Je vais tenter par faire un truc simple.
Code :
|
Ce code fonctionne car dmpi converti automatiquement l'interruption en mode reel.(automatic mirroring of interrupts into real mode by DMPI). Donc je vais essayer de refaire ce code comme si DMPI ne prenait pas en charge cette conversion, et du coup essayer d'utiliser le 300h (simulation interruption mode reel)...Toute aide est le bienvenue
Marsh Posté le 20-11-2015 à 15:01:23
Désolé, j'ai pas pris le temps de regarder dans mes archives.
Par contre du cas tu en es où ?
Tu fait ton appel dpmi et ça crashe ?
Marsh Posté le 20-11-2015 à 15:07:43
J'en suis a essayer de comprendre comment faire pour allouer ma structure et mes buffer dans le bloc memoire dos.
Donc dans un premier temps, j'essaie avec l'exemple de la fonction gettime ou il n'a que la fonction 2Ch à passer.
Puis j’essaierais avec la fonction 09h (afficher du texte) qui necessite en plus de transferrer du texte.
Et si ca marche je continue avec ma structure et mes buffers.
Code :
|
Je me retrouve avec une erreur d'allocation memoire
Marsh Posté le 20-11-2015 à 16:44:18
Si tu est bien en adressage flat 32bits, ça devrait être:
les edi, regs
mais lds sous-entends que "var regs:DPMIRegisters" devrait faire que "regs" résoudra vers une pointeur far de "dcs" en mode protégé (sélecteur 16bits:offset 32bits).
Si "regs" résous vers l'offset même de la structure "dcs" (sous-entendu par rapport à ds), alors il faut utiliser "lea edi,[dcs]".
(dans cas copier ds dans es, comme tu avais mis en commentaire)
Marsh Posté le 20-11-2015 à 17:59:08
Première étape, la plus simple, enfin bonne. J'ai tout revu, je m’étais planté dans le placement de mon 2C.
J'arrive a récupérer l'heure système a partir d'une simulation d'interruption (300h)
Code :
|
Prochaine étape. Essayer d'envoyer la structure suivante sur l'interruption $65. Ca attendra lundi
Code :
|
Marsh Posté le 23-11-2015 à 14:43:27
J'ai vu sous Borland pascal une fonction qui me semble intéressante
GlobalDosAlloc qui me permet d'allouer un zone mémoire sous les 640k
Code :
|
Mais là je ne sais pas trop comment m''y prendre. J'ai ma structure urb qui est actuellement en mémoire protegé. Il faudrait que je puisse la copier en mémoire réel ainsi que son contenu. Mais comment ?
Marsh Posté le 23-11-2015 à 15:53:58
GlobalDosAlloc ça permet effectivement de communiquer avec des services nécessitant des grosses structures en mémoire conventionnelle.
Après il y a un truc que je comprends pas : vu winapi et des registres -que- 16bits dans ton source, tu fais quoi avec BC7 ? un projet win16 ?
Ou alors ton projet est bien setupé pour du mode protégé (opérandes implicitement 32bits pour les même opcodes 16bits du mode réel), et tu utilises sciemment ce trick pour contourner les limites de BP7 ?
Normalement on faisait plutôt du DPMI pour un jeu/une démo sous à Dos à l'époque.
Si c'est pour attaquer un PIC en USB, normalement en Win32/64, tu as WinUSB & co...
Marsh Posté le 23-11-2015 à 16:10:05
Oui c'est un projet qui doit tourner uniquement sous dos et qui doit obligatoirement être compilé en protected mode. Borland Pascal 7 sait gerer le DMPI.
Mon but est de pouvoir à partir de mon programme faire appel a un programme résident (un driver USB - DOSUSB.COM) via l'interruption 65 en envoyant la structure URB qui contient le segment et l'offset d'un buffer.
Tu me dis si je ne suis pas clair
Je viens de trouver ça aussi, je vais voir si je peux m'en servir
ProtectedAddr := Ptr(L and $FFFF, 0);
Move( FontData, ProtectedAddr^, Size);
Edit : Ah qu'est ce que j'aurais voulu utliser WinUSB, ca m'aurait bien facilité la tache. Malheuresement, on m'impose BP7 (mon boss), Compilation en mode protected et bien sur que ca tourne sous dos, le vrai MS DOS
Marsh Posté le 23-11-2015 à 17:52:53
Je pense que je progresse, mais aussi que je me melange les pinceaux. J'ai toujours du mal avec les notions de segments, selector, offset ....malgré la lecture de documentation
Code :
|
Marsh Posté le 25-11-2015 à 00:11:33
Probleme résolu !
Merci à tous, je posterais la soluce demain, tranquillement.
Marsh Posté le 25-11-2015 à 10:01:47
rocky77 a écrit : |
Dans un contexte professionnel, si c'est pour maintenir du vieux software utilisé en production je veux bien (typique de l'info indus), mais autrement ce serait plus sain de rebooter l'appli avec un outil moderne et pérenne.
Marsh Posté le 25-11-2015 à 10:38:42
J'ai deja tenté de dire à mon boss qu'il serait temps de mettre à niveau le programme (qui doit bien avoir 50000 lignes de code). Mais il aime bien les vieux trucs et surtout veut pas se lancer dans cette mise à niveau.
Du coup, on se fait ch.., enfin je me fais ch... pour la maintenance de son programme indigeste
Marsh Posté le 25-11-2015 à 10:49:44
Le prob c'est que pour une réécriture d'un soft, il faut de la force de frappe.
Maintenant le premier truc à voir c'est le ratio code "fonctionnel" (ce qui est réellement utilie, ce qui traite vraiment de la donnée)/ code "inutile" (ce qui est imposé par les frameworks : ie par exemple les MFC sont responsables d'un gros tas de merde dans beaucoup de projets qui datent de la fin des années 90).
En réutilisant un framework moderne, tu élagues les lignes de caca en dégageant un gros volume de code useless. (ie Winforms vs MFC, etc...)
Bon là avec BP7, si vous voulez rester en Pascal pour pas perdre vos habitues, rebooter l'appli en Delphi (embarcadero) peut être une étape rentable : ça permettrait d'élaguer beaucoup de mochetés.
Spoiler : Si vous êtes dans une PME, vous êtes typiquement verrouillés dans le soft écrit il y a 10 ans, que vous avez pas le budget pour le refacto, et que vous ferez une murale lorsqu'un concurrent refera un soft équivalent mais moderne, qui lui aussi repartira dans le cycle de 10~15ans avant de faire sprotch à son tour |
Marsh Posté le 25-11-2015 à 11:17:05
Pour la forme, voici ma solution
Code :
|
Marsh Posté le 19-11-2015 à 16:04:43
Bonjour,
J'ai un programme en Borland Pascal 7 qui doit etre compilé en mode protégé. Dans ce programme, j'ai un appel a un interruption du mode réel. Donc j'ai besoin d'utiliser l'assembleur et les fonctions du DPMI.
Or mes connaissances en assembleur, DPMI et mémoire DOS sont proches du 0
J'ai trouvé dans les spécifications du DMPI, le "Simulate Real Mode Interrupt" 0300H. http://www.ctyme.com/intr/rb-5831.htm
J'ai même trouvé des exemples :
Mais voilà, le hic c'est que je dois faire passer lors de mon appel à mon interruption $65, la structure suivante, qui de plus contient des buffers !!
Bref ça fait 2 semaines que je suis dessus et que je mouline. N'hesitez pas a me poser des questions. J'ai toujours des difficultés pour arriver à etre clair.
Merci
Message édité par rocky77 le 25-11-2015 à 00:15:50