-
Notifications
You must be signed in to change notification settings - Fork 5
/
Copy pathSE.ASM
359 lines (302 loc) · 6.57 KB
/
SE.ASM
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
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
; *******************************************************
; * *
; * VERSION CONTROL EQUATES *
; * *
; *******************************************************
; Boolean values
FALSE EQU 0
TRUE EQU NOT FALSE
; Version equates
IFDEF _Windows_
WindowsVersion EQU TRUE
DPMIVersion EQU FALSE
ELSE
IFDEF _DPMI_
WindowsVersion EQU FALSE
DPMIVersion EQU TRUE
ELSE
WindowsVersion EQU FALSE
DPMIVersion EQU FALSE
ENDIF
ENDIF
; *******************************************************
; * *
; * MACROS *
; * *
; *******************************************************
LOCALS @@
; Public variable definition macro
VAR MACRO Symbol,SType,Count
PUBLIC Symbol
Symbol LABEL SType
IF Count
DB SType * Count DUP(?)
ENDIF
ENDM
; Parameter definition macro
ARG MACRO Symbol,SType,Count
LOCAL Offset
@AP = @AP + SType * Count
Offset = @AP
Symbol EQU (SType PTR [BP+@AF-Offset])
ENDM
@AP = 0
@AF = 0
; Local variables definition macro
LOC MACRO Symbol,SType,Count
LOCAL Offset
@LP = @LP + SType * Count
Offset = @LP
Symbol EQU (SType PTR [BP+@LF-Offset])
ENDM
@LP = 0
@LF = 0
; Stack frame modifiers
sfFar EQU 01H ;FAR frame
sfMarkBP EQU 02H ;Make saved BP odd
sfSaveDS EQU 04H ;Save DS at [BP-2]
sfInitDS EQU 08H ;Init DS using SS
; Default stack frame type
sfDefault = 0
; Stack frame types
IF WindowsVersion
WINFAR EQU sfFar+sfMarkBP+sfSaveDS
ELSE
WINFAR EQU sfFar
ENDIF
; Entry code generation macro
ENTRY MACRO FrameType
IFB <FrameType>
@SF = sfDefault
ELSE
IFIDNI <FrameType>,<NEAR>
@SF = 0
ELSE
IFIDNI <FrameType>,<FAR>
@SF = sfFar
ELSE
@SF = FrameType
ENDIF
ENDIF
ENDIF
IF @SF AND sfMarkBP
INC BP
ENDIF
PUSH BP
MOV BP,SP
IF @SF AND sfFar
@AF = @AP + 6
ELSE
@AF = @AP + 4
ENDIF
IF @SF AND sfSaveDS
PUSH DS
@LF = -2
ELSE
@LF = 0
ENDIF
IF @LP
SUB SP,@LP
ENDIF
IF @SF AND sfInitDS
PUSH DS
PUSH SS
POP DS
ENDIF
ENDM
; Exit code generation macro
EXIT MACRO ArgSize
IF @SF AND sfInitDS
POP DS
ENDIF
IF @LF - @LP
MOV SP,BP
ENDIF
POP BP
IF @SF AND sfMarkBP
DEC BP
ENDIF
IFNB <ArgSize>
@AP = ArgSize
ENDIF
IF @SF AND sfFar
RETF @AP
ELSE
RETN @AP
ENDIF
@AP = 0
@LP = 0
ENDM
; *******************************************************
; * *
; * EQUATES *
; * *
; *******************************************************
; 10-Byte record
b0 EQU (BYTE PTR 0)
b1 EQU (BYTE PTR 1)
b2 EQU (BYTE PTR 2)
b3 EQU (BYTE PTR 3)
b4 EQU (BYTE PTR 4)
b5 EQU (BYTE PTR 5)
b6 EQU (BYTE PTR 6)
b7 EQU (BYTE PTR 7)
b8 EQU (BYTE PTR 8)
b9 EQU (BYTE PTR 9)
; 5-Word record
w0 EQU (WORD PTR 0)
w2 EQU (WORD PTR 2)
w4 EQU (WORD PTR 4)
w6 EQU (WORD PTR 6)
w8 EQU (WORD PTR 8)
; Pointer record
ofs EQU (WORD PTR 0)
seg EQU (WORD PTR 2)
; 8087 status word masks
mIE EQU 0001H
mDE EQU 0002H
mZE EQU 0004H
mOE EQU 0008H
mUE EQU 0010H
mPE EQU 0020H
mC0 EQU 0100H
mC1 EQU 0200H
mC2 EQU 0400H
mC3 EQU 4000H
; ASCII equates
bell EQU 07H
bs EQU 08H
tab EQU 09H
lf EQU 0AH
cr EQU 0DH
eof EQU 1AH
esc EQU 1BH
del EQU 7FH
; DOS interrupt vector number
DOS EQU 21H
; DOS function codes
dosSetDrive EQU 0EH
dosGetDrive EQU 19H
dosSetDTA EQU 1AH
dosSetInt EQU 25H
dosParse EQU 29H
dosGetDate EQU 2AH
dosSetDate EQU 2BH
dosGetTime EQU 2CH
dosSetTime EQU 2DH
dosGetVersion EQU 30H
dosGetInt EQU 35H
dosCreateDir EQU 39H
dosRemoveDir EQU 3AH
dosSetDir EQU 3BH
dosCreate EQU 3CH
dosOpen EQU 3DH
dosClose EQU 3EH
dosRead EQU 3FH
dosWrite EQU 40H
dosDelete EQU 41H
dosSeek EQU 42H
dosAttrib EQU 43H
dosIOCtl EQU 44H
dosGetDir EQU 47H
dosSetMem EQU 4AH
dosExec EQU 4BH
dosExit EQU 4CH
dosGetExit EQU 4DH
dosFindFirst EQU 4EH
dosSetPSP EQU 50H
dosGetPSP EQU 51H
dosMakePSP EQU 55H
dosRename EQU 56H
dosFDate EQU 57H
; Program segment prefix variables
pspMemTop EQU (WORD PTR 02H)
pspFileTab EQU (BYTE PTR 18H)
pspEnvSeg EQU (WORD PTR 2CH)
pspFCB1 EQU (BYTE PTR 5CH)
pspFCB2 EQU (BYTE PTR 6CH)
pspCmdLine EQU (BYTE PTR 80H)
; Free-list memory record layout
mNext EQU (DWORD PTR 0)
mSize EQU (DWORD PTR 4)
mRecSize EQU 8
; File record layout
fHandle EQU (WORD PTR 0)
fMode EQU (WORD PTR 2)
fBufSize EQU (WORD PTR 4)
fPrivate EQU (WORD PTR 6)
fBufPos EQU (WORD PTR 8)
fBufEnd EQU (WORD PTR 10)
fBufPtr EQU (DWORD PTR 12)
fOpenProc EQU (DWORD PTR 16)
fInOutProc EQU (DWORD PTR 20)
fFlushProc EQU (DWORD PTR 24)
fCloseProc EQU (DWORD PTR 28)
fUserData EQU (BYTE PTR 32)
fName EQU (BYTE PTR 48)
fBuffer EQU (BYTE PTR 128)
fRecSize EQU 256
; fMode values
fmClosed EQU 0D7B0H
fmInput EQU 0D7B1H
fmOutput EQU 0D7B2H
fmInOut EQU 0D7B3H
; Overlay header record
ovSignature EQU (WORD PTR 0)
ovSaveReturn EQU (WORD PTR 2)
ovFilePos EQU (WORD PTR 4)
ovCodeSize EQU (WORD PTR 8)
ovFixupSize EQU (WORD PTR 10)
ovJumpCount EQU (WORD PTR 12)
ovLink EQU (WORD PTR 14)
ovSegment EQU (WORD PTR 16)
ovRetryCount EQU (WORD PTR 18)
ovNext EQU (WORD PTR 20)
ovEmsPage EQU (WORD PTR 22)
ovEmsOffset EQU (WORD PTR 24)
ovUserData EQU (BYTE PTR 26)
ovVectors EQU (BYTE PTR 32)
ovRecSize EQU 32
; Windows data segment variables
pPtrCount EQU (WORD PTR DS:04H)
pLocalHeap EQU (WORD PTR DS:06H)
pAtomTable EQU (WORD PTR DS:08H)
pStackTop EQU (WORD PTR DS:0AH)
pStackBot EQU (WORD PTR DS:0CH)
pStackMin EQU (WORD PTR DS:0EH)
; DPMI interrupt vector
DPMI EQU 31H
; DPMI function codes
dpmiGetDesc EQU 0000H ;Allocate descriptors
dpmiFreeDesc EQU 0001H ;Free descriptor
dpmiSegToDesc EQU 0002H ;Map segment to descriptor
dpmiGetSelInc EQU 0003H ;Get selector increment value
dpmiGetSegBase EQU 0006H ;Get segment base address
dpmiSetSegBase EQU 0007H ;Set segment base address
dpmiSetSegSize EQU 0008H ;Set segment size
dpmiGetRealInt EQU 0200H ;Get real mode int handler
dpmiSetRealInt EQU 0201H ;Set real mode int handler
dpmiGetExcept EQU 0202H ;Get exception handler
dpmiSetExcept EQU 0203H ;Set exception handler
dpmiGetInt EQU 0204H ;Get interrupt handler
dpmiSetInt EQU 0205H ;Set interrupt handler
dpmiGetRMCB EQU 0303H ;Get real mode call-back
dpmiGetVersion EQU 0400H ;Get version information
; Real mode call-back registers structure
realDI EQU (DWORD PTR 00H)
realSI EQU (DWORD PTR 04H)
realBP EQU (DWORD PTR 08H)
realBX EQU (DWORD PTR 10H)
realDX EQU (DWORD PTR 14H)
realCX EQU (DWORD PTR 18H)
realAX EQU (DWORD PTR 1CH)
realFlags EQU (WORD PTR 20H)
realES EQU (WORD PTR 22H)
realDS EQU (WORD PTR 24H)
realFS EQU (WORD PTR 26H)
realGS EQU (WORD PTR 28H)
realIP EQU (WORD PTR 2AH)
realCS EQU (WORD PTR 2CH)
realSP EQU (WORD PTR 2EH)
realSS EQU (WORD PTR 30H)
realRegsSize EQU 32H