forked from merchise/fortaleza
/
SE.ASM
268 lines (226 loc) · 4.68 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
; *******************************************************
; * *
; * 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]
; Stack frame types
DEFAULT@ EQU 0
NEAR@ EQU 0
FAR@ EQU sfFar
WINFAR EQU sfFar
; Entry code generation macro
ENTRY MACRO FrameType
IFB <FrameType>
@SF = DEFAULT@
ELSE
IFIDNI <FrameType>,<NEAR>
@SF = NEAR@
ELSE
IFIDNI <FrameType>,<FAR>
@SF = FAR@
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
ENDM
; Exit code generation macro
EXIT MACRO ArgSize
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
dosVersion 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