Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - Zugriff auf Register???
Physikerpepe - Mi 11.08.04 22:22
Titel: Zugriff auf Register???
Hallo,
kann mir jemand sagen, wie ich unter Delphi Zugriff auf die Registers bekomme?
Unter TurboPascal sah das ganze so aus:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| function xxx( command : word; param_ptr : pointer ) : pointer; far; var reg : registers; begin reg.ds:=seg(param_ptr^); reg.dx:=ofs(param_ptr^); reg.ax:=command; intr(test_interrupt, reg); if reg.ax=0 then xxx:=ptr(reg.ds, reg.dx) else begin ... end; end; |
Leider gibt es unter Delphi keine Variablen vom Typ Registers.
Ich könnte zu Not die Register mit dem Assambler ansprechen:
Delphi-Quelltext
1: 2: 3: 4: 5:
| asm mov ds,param_ptr^ mov dx,param_ptr^ mov ax,command end; |
Allerdings weiß ich nicht, was die befehle "seg" und "ofs" bedeuten und wie sie in Delphi heißen!
Weiterhin weiß ich nicht wie man die Zeile "intr(test_interrupt, reg)" (ein Interrupt wird ausgeführt) nach Delphi übersetzt!
Kann mir jemand helfen?
pepe
Muetze1 - Do 12.08.04 00:01
Moin!
1. Interrupts gibt es zwar noch, aber unter Win32 werden diese nicht mehr genutzt und deine Win32 Anwendung greift auf Funktionen aus DLLs zu, die dir Windows und andere Programme zur Verfügung stellen.
2. Im Win32 werden lineare Adressen verwendet ohne Segmente/Offsets zur Adressierung sondern mit einem Deskriptor und einem 32 Bit Offset. Daher gibt es kein Seg mehr und auch keine Ofs() Funktion mehr.
3. Was willst du überhaupt machen, als dass du noch alte Interrupt Funktionen nutzt?
MfG
Muetze1
Physikerpepe - Do 12.08.04 09:36
@muetzel:
Verdammt ich habe geahnt das sowas in der Richtung kommt! :(
Ich habe eine sehr alte Hardware die ich ansprechen möchte! Diese Hardware stammt aus DOS-Zeite und hat KEINE DLL!
Das Gerät wird vor der Verwendung mit einer EXE-Datei (zu der ich keinen Quellcode habe) initialisiert und dann über Interrupts angesprochen! Damit diese Hardware angesprochen werden kann stellte der Hersteller ein alltes TurboPascall zur Verfügung (den kompletten Quelltext findest du in dem Tread "altes TP-Programm unter Delphi").
Ich habe das alte Programm nun schon fast komplett übersetzt, nur komme ich an der Stelle mit dem Interrupt nicht weiter!
Da die Hardware auf einem Rechner mit Windows98 läuft, also noch direkter Hardwarezugiff erlaubt ist, muss das doch irgendwie zu bewerkstelligen sein!??
@teebee:
Leider funktioniert der Link bei mir nicht! :(
Pepe
Muetze1 - Do 12.08.04 10:47
Moin!
Ähm, nein. Naja, oder: vielleicht. Also:
Grundlegend hast du die Möglichkeit unter Windows 9x/ME direkten Hardwarezugriff zu machen - genauso wie bei NT/2000/XP, nur das bei Win9x das OS dies nicht überwacht (besser: überwachen kann) und daher nicht meckert. Aber: du willst nicht auf die Hardware sondern auf Software, weil die Funktionen sich vom Treiber ja anscheinend auf einem Soft-Int installieren. Da ist aber wiederrum das Problem, das man das nur mit viel Aufwand und Umwegen von einem Windows 32 Bit Programm aus machen kann. Wenn du direkten Hardwarezugriff machen willst, dann musst du aber auch über die Hardware Bescheid wissen (Ports, Interrupts, Speicherbereiche, Befehle, Statusinformationen, etc) und genau diese Informationen hast du IMHO nicht.
Dann könntest du ja noch sagen, dass du den Treiber beim Starten unter 98 Laden kannst und dann unter Windows auf die installierten Routinen zugreifen kannst - auch nicht so ohne weiteres möglich, da Win32 in einem 32 Bit System arbeitet und der Treiber in einem 16 Bit System. Es werden aber nun keine 16 Bit Software ISR/INT Handler in das 32 Bit System gelegt und umgekehrt auch nicht. Der letzte Weg geht aber mit viel Aufwand noch, aber das lohnt sich wirklich nicht.
Für mich stellt sich die Frage ob du nicht wirklich eine DLL oder andere Möglichkeit findest diese Karte unter Windows zu betreiben. Vielleicht hat ja schon ein anderer mal eine DLL oder anderes zum ansprechen der Hardware programmiert.
MfG
Muetze1
teebee - Do 12.08.04 11:16
Physikerpepe hat folgendes geschrieben: |
@teebee:
Leider funktioniert der Link bei mir nicht! :( |
Bei mir tut er,
gib im MSDN mal 'Interrupt 21h' in die Suche ein,
Gruß, teebee
Physikerpepe - Do 12.08.04 11:45
@muetzel:
Ohhh, du hast soeben alle meine Befürchtungen wahr werden lassen :-)
Nun, da kann ich leider nicht´s machen!
Habe das Problem "vorläufig" so gelöst:
Habe das alte TP-Programm (in TurboPascal) umgeschrieben, sodass es sich jetzt jede Sekunde den aktuellen Befehl aus einer Textdatei holt.
Mit meinem neuen Delphi-Programm schreibe ich nun per Push-Button-Ereigniss den aktuellen Befehl in diese Datei!
Das Ganze klappt reibungslos, aber ich weiß das es mich bis in alle Zeiten ärgern wird im Hintergrund dieses blöde DOS-Fenster zu sehen :shock:
Wollte doch alles schön in EINER GUI vereinbaren!
Aber man kann nix erzwingen :-)
PS: Kann ich unter TurboPascal das vorhandene Programm "einfach" zu einer Dll compilieren?
pepe
Physikerpepe - Do 12.08.04 11:49
@teebee:
Der link funzt jetz, nur kann ich damit leider nix anfangen :?
Aber trotzdem Danke!
pepe
OlafSt - Fr 13.08.04 15:52
Ob es nicht vielleicht einfacher wäre, einen Device-Treiber für die Hardware zu schreiben ?
Software-Interrupts in das Win32-System "einzuschleusen" ist beinahe ebensoviel Aufwand - und ob das mit der nächsten Windows-Version auch noch funktioniert, steht auf einem anderen Blatt Papier.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!