Fonctions ofs() et seg() et unit crt.pas : Question pour les pros de l'assembleu

cs_hendrix Messages postés 65 Date d'inscription lundi 30 décembre 2002 Statut Membre Dernière intervention 18 novembre 2008 - 18 avril 2004 à 16:37
cs_Kenavo Messages postés 702 Date d'inscription vendredi 21 mars 2003 Statut Membre Dernière intervention 1 octobre 2009 - 26 avril 2004 à 11:13
Bonjour,

Ceux qui connaissent turbo pascal 5/6 doivent se souvenir qu'en utilisant l'unité crt.pas on disposait des fonctions ofs() et seg() qui permettaient de récupérer l'offset et le segment (J'ai un peu oublié tout ça ... ça commence à dater... )

Avec Delphi 2 (et 3 ?) je crois que l'on disposait de l'unité wincrt.pas qui permettait d'utiliser ces même fonctions sous windows dans un programme delphi.

Puis l'unité wincrt .pas a disparu.

Quelqu'un connait-il les fonctions qui ont remplacé ofs() et seg(), et dans quelle unité les trouver.
Sinon, quelqu'un sait il reconstuire ces fonctions pour pouvoir les utiliser en delphi 6/7

Merci d'avance de votre aide et de vos réponses.

hendrix

4 réponses

cs_Kenavo Messages postés 702 Date d'inscription vendredi 21 mars 2003 Statut Membre Dernière intervention 1 octobre 2009 5
20 avril 2004 à 16:48
Salut,

Si je ne me trompe pas, l'unité WINCRT existe dans Delphi 1. Elle offre les fonctions gotoxy, clrscr, etc ... et permettait d'écrire des applications "comme en Turbo" (applications "console").
Les fonctions seg() et ofs() décomposaient un adresse 20 bits en deux mots 16 bits. Mais c'était du temps du 16 bits ! Delphi 6/7, c'est du 32 bits et ces fonctions n'existent plus (en fait, depuis Delphi 2).

Kénavo

Code, Code, Codec !
0
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
21 avril 2004 à 23:00
Elle n'existent plus parce qu'elles n'ont plus aucune raison d'exister. La gestion de la mémoire est complètement différente sous Windows 32 bits.
Il va donc falloir faire autrement et se demander si c'est aussi indispensable que cela.
En clair, c'est une opportunité qui se présente pour revoir le code source qui doit dater un peu. Un petit coup de jeune ne lui fera surement pas de mal. :)
May Delphi be with you
0
cs_hendrix Messages postés 65 Date d'inscription lundi 30 décembre 2002 Statut Membre Dernière intervention 18 novembre 2008 1
24 avril 2004 à 22:25
Merci à tous pour ces quelques réponses. En fait c'est bien du très vieux code que je cherche à adapter, ça ressemble à ça pour les curieux:

const
EJECT_TRAY = 0;
CLOSE_TRAY = 5;
PLAY_TRACK = 132;
STOP_TRACK = 133;
RESUME_TRACK = 136;
RESET_CD = 2;

GET_TRACK_INFO = 11;
GET_DISK_INFO = 10;

READ_IOCTL = 3;
WRITE_IOCTL = 12;

MAX_CDS = 10;

UPC_CODE = 14;
LOCK_CODE = 1;

LOCK_CD = 0;
UNLOCK_CD = 1;

Q_INFO = 12;
MEDIA_CHANGE = 9;
DEVICE_STATUS = 6;
..............
type
rHRec = record
length : byte;
subUnitCode : byte;
commandCode : byte;
status : word;
reserved : array[1..8] of byte;
end;

IOCTLRec = record
r : rHRec;
MDB : byte;
tAOfs : word;
tASeg : word;
bytesToTransfer : word;
startingSector : word;
error : longint;
end;

TLockRec = record
r : rHRec;
code : byte;
lock : byte;
end;

TUPCRec = record
code : byte;
control : byte;
UPC : array[1..7] of byte;
zero : byte;
aFrame : byte;
end;
................

procedure setIOCTL( var i : IOCTLRec );
var index : byte;
begin
with i do begin
with r do begin
length := 0;
subUnitCode := 0;
commandCode := 0;
status := 0;
for index := 1 to 8 do reserved[index] := 0;
end;{with R}
MDB := 0;
tASeg := 0;
tAOfs := 0;
bytesToTransfer := 0;
startingSector := 0;
error := 0;
end;{with i}
end;
..........................

procedure ejectCD( drive : word );
var index : word;

ejRec : record
code : byte;
end;

i : IOCTLRec;
rq : rHRec;
s,o : word;
begin

setIOCTL(i);
with i do begin
bytesToTransfer := 1;
tAOfs := ofs(ejRec);
tASeg := seg(ejRec);
end;

with i.r do begin
length := sizeof(i);
commandCode := 12;
end;

ejRec.code := EJECT_TRAY;
s := seg(i);
o := ofs(i);
asm
mov ax,1510h
mov cx,drive
mov es,S
mov bx,O
int 2fh
end;
end;
..........................
procedure closeCD( drive : word );
var index : word;

ejRec : record
code : byte;
end;

i : IOCTLRec;
rq : rHRec;
s,o : word;
begin

setIOCTL(i);
with i do begin
bytesToTransfer := 1;
tAOfs := ofs(ejRec);
tASeg := seg(ejRec);
end;

with i.r do begin
length := sizeof(i);
commandCode := 12;
end;

ejRec.code := CLOSE_TRAY;
s := seg(i);
o := ofs(i);
asm
mov ax,1510h
mov cx,drive
mov es,S
mov bx,O
int 2fh
end;
end;
....................................
procedure lockCD( drive : word );
var index : word;

lockRec : record
code : byte;
lock : byte;
end;

i : IOCTLRec;
rq : rHRec;
s,o : word;
begin

setIOCTL(i);
with i do begin
bytesToTransfer := 2;
tAOfs := ofs(lockRec);
tASeg := seg(lockRec);
end;

with i.r do begin
length := sizeof(i);
commandCode := 12;
end;

lockRec.code := LOCK_CODE;
lockRec.lock := LOCK_CD;
s := seg(i);
o := ofs(i);
asm
mov ax,1510h
mov cx,drive
mov es,S
mov bx,O
int 2fh
end;
end;
............................
procedure unlockCD( drive : word );
var index : word;

lockRec : record
code : byte;
lock : byte;
end;

i : IOCTLRec;
rq : rHRec;
s,o : word;
begin

setIOCTL(i);
with i do begin
bytesToTransfer := 2;
tAOfs := ofs(lockRec);
tASeg := seg(lockRec);
end;

with i.r do begin
length := sizeof(i);
commandCode := 12;
end;

lockRec.code := LOCK_CODE;
lockRec.lock := LOCK_CD;
s := seg(i);
o := ofs(i);
asm
mov ax,1510h
mov cx,drive
mov es,S
mov bx,O
int 2fh
end;
end;
............................

C'est surtout la proc lockcd qui m'intéressait....
Ca faisait l'objet d'une autre question que j'ai posé dans le forum. Mais je pense qu'il n'y a peut-être pas la fonction en delphi qui va bien alors j'ai regardé côté assembler, vous sacez tout.
Maintenant je ne sais pas comment faire pour me passer de ofs() et seg()...parce que je ne suis pas un dieu de delphi et encore moins de l'assembler !!!

Si vous avez l'idée géniale pour "locker" ce maudit tiroir de cdrom, je suis preneur.

merci d'avance !
hendrix
0
cs_Kenavo Messages postés 702 Date d'inscription vendredi 21 mars 2003 Statut Membre Dernière intervention 1 octobre 2009 5
26 avril 2004 à 11:13
0
Rejoignez-nous