-
Notifications
You must be signed in to change notification settings - Fork 0
/
V_GETREC.CAS
188 lines (171 loc) · 6.15 KB
/
V_GETREC.CAS
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
183
184
185
186
187
188
/********************************************************/
/* */
/* Malte System/Volume _GetRecord */
/* 1993/05/14 */
/* */
/* Copyright (C) par les Chevaliers de Malte */
/* */
/********************************************************/
//
// Programmeur :
//
// Sylvain Maltais
//
// Directive de compilation conditionnel :
//
// __286__ Indique que les instructions doivent fonctionner
// sur indique 80286.
//
// __386__ Indique que les instructions doivent fonctionner
// sur indique 80386.
//
// ******************************************************
// INTERFACE/HEADER
// ******************************************************
#include <NUMERIC.H>
typedef Byte VolumeName[32];
typedef Byte FilePath[64];
typedef Byte FileName[32];
typedef Byte FileExt[8];
typedef Byte FileDescr[64];
typedef Byte FilePassWord[32];
typedef Byte PathStr[79];
#ifdef __PASCAL__
extern
#endif
class AVUP
{
typedef struct VolumeHeader
{
Byte Typing[127];
Byte Version;
VolumeName VolumeName;
String Description;
FilePassWord PassWord;
};
typedef struct VolumeIndexRecord
{
FilePath Path;
FileName Name;
FileExt Ext;
FileDescr Descr;
Boolean PassWordAuthorized;
FilePassWord PassWord;
LongInt Size;
LongInt LastTime;
LongInt Time;
Byte Language;
Word Category;
Byte Attribut;
LongInt Lo,Hi,Pos;
};
public:
void _GetRecord(LongInt _Handle, Word Size, const *Buffer);
void _SetRecord(LongInt _Handle, Word Size, const *Buffer);
void CopyVolumeFileInDOS(LongInt Handle, PathStr Path);
void CreateVolume(void);
void DeleteVolume(void);
void DeleteIndex(LongInt _Handle);
void GetHeaderVolume(FilePassWord PassWord, VolumeHeader *Header);
void GetIndex(LongInt _Handle, struct VolumeIndexRecord Buffer);
void GetRecord(LongInt _Handle, LongInt P, Word Size, const *Buffer);
void MoveFileDOSInVolume(PathStr Path, VolumeIndexRecord Target);
void SetHeaderVolume(FilePassWord OldPassWord, VolumeHeader Header);
void SetIndex(LongInt _Handle, VolumeIndexRecord Index);
void SetPassWord(LongInt _Handle, FilePassWord OldPassWord, FilePassWord PassWord);
void SetPassWordVolume(FilePassWord OldPassWord, FilePassWord PassWord);
void SetPos(LongInt _Handle, LongInt Pos);
void SetRecord(LongInt _Handle, LongInt P, Word Size, const *Buffer);
LongInt GetFirstEmptyIndex();
LongInt GetMaxIndex();
LongInt GetPos(LongInt _Handle);
LongInt NewFile(VolumeIndexRecord Info);
LongInt Open(VolumeIndexRecord Info);
Boolean PosIsUsed(LongInt Pos, LongInt Size);
private:
Word VHandleIndex;
Word VHandleData;
Boolean CacheIndex;
PathStr PathIndex,PathData;
};
// ******************************************************
// IMPLEMENTATION
// ******************************************************
#include <DOS.H>
extern void SetFilePos(Word _Handle, LongInt P);
extern void _GetRecord(Word _Handle, Word Size, const *Buffer);
#ifndef AVUP_GETRECORD
#define AVUP_GETRECORD
// ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
// ³ AVUP::_GetRecord ³Û
// ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙÛ
// ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
//
// Description :
//
// þ Cette proc‚dure lit une enregistrement … l'int‚rieur
// du volume que l'objet fixe.
//
// Note :
//
// þ La version pour 386 prend plus de place, mais … la fin
// du compte, vous ˆtes regagnant en rapid‚. Car les
// registres du 80386 supporte l'op‚ration sur 32-bits et
// il ne faut donc plus calculer en 2 parties.
//
#ifdef __386__
void AVUP::_GetRecord(LongInt _Handle, Word Size, const *Buffer)
{
struct VolumeIndexRecord Index;
LongInt P = Index.Pos, L = Index.Lo;
Word VH = VHandleData,
_Segment = FP_SEG(&Buffer),
_Offset = FP_OFF(&Buffer);
asm MOV AX,VH;
asm CMP AX,0xFFFF;
asm JE Exit_Now;
GetIndex(_Handle,Index);
asm MOV EAX,P;
asm ADD EAX,L;
asm PUSH EAX;
asm POP DX;
asm POP CX;
asm MOV AX,0x4200;
asm MOV BX,VH;
asm INT 0x21;
asm PUSH DS;
asm POP ES;
asm MOV AX,0x3F00;
asm MOV CX,Size;
asm MOV DX,_Offset;
asm MOV DS,_Segment;
asm INT 0x21;
asm PUSH ES;
asm POP DS;
Exit_Now:;
}
#else
void AVUP::_GetRecord(LongInt _Handle, Word Size, const *Buffer)
{
struct VolumeIndexRecord Index;
LongInt P = Index.Pos, L = Index.Lo;
Word VH = VHandleData,
_Segment = FP_SEG(&Buffer),
_Offset = FP_OFF(&Buffer);
if(VHandleIndex != -1)
{
GetIndex(_Handle,Index);
SetFilePos(VHandleData,Index.Pos + Index.Lo);
asm PUSH DS;
asm POP ES;
asm MOV AX,0x3F00;
asm MOV CX,Size;
asm MOV DX,_Offset;
asm MOV DS,_Segment;
asm INT 0x21;
asm PUSH ES;
asm POP DS;
}
}
#endif
#endif