-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathequ.s
executable file
·380 lines (357 loc) · 6.61 KB
/
equ.s
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
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
NotEquateDefinition:
mov bx,#InvalidInstrMessage
call PanicRecover
DefineNewSymbol:
call FindSymbol
jc NotaRedefinition
mov ax,PresentFileNameOffset
mov DefFileNameOffset[di],ax
mov ax,InputLineNumber
mov DefLineNumber[di],ax
test Attributes[di],#IsDefined
jz DefiningNow
mov bx, #RedefinitionMessage
call PanicRecover
NotaRedefinition:
call AddSymbol
DefiningNow:
push di
call IgnoreSpaces
call GetChar
cmpb al,#':'
jnz NotLabelDefinition
mov ax,LocationCounter
mov bx,#Calculated
jmps ValidSymbolDefinition
NotLabelDefinition:
cmpb al,#'='
jnz NotEquateDefinition
call GetToken
call ProcessExpression
ValidSymbolDefinition:
pop di
or bx,#IsDefined
mov Attributes[di],bx
mov Value[di],ax
ret
ProcessExpression: |maintain flags upto compile
mov di,#PostFixBufferStart
push LastFilledSymbol
push StringSpace
call CompileExpression
mov si,#PostFixBufferStart
call EvaluateExpression
mov bx,#9 |IsEquate or Calculated
jc NotEvaluatable |reclaim strings and entries
pop StringSpace |Evaluatable
pop LastFilledSymbol
mov di,LastFilledSymbol
mov [di],#0
ret
NotEvaluatable:
pop cx |The old StringSpace can go to the moon, new fake symbols added
pop cx |and the filledsymbol
and bx, #NotCalculated
call IsSimpleExpression
jnz NotSimpleExpression
or bx, #IsFake |not calculated and fake
| call DisplayRegister
| call DisplayMessage
| db ':Found S ',0
| push ax
| mov ax,LastFilledSymbol
| call DisplayRegister
| pop ax
| call DisplayMessage
| db 0dh,0ah,0
ret
NotSimpleExpression: |Has to be stored on the string space
mov ax, StringSpace
push ax
call TransferExprToSpace
pop ax
mov StringSpace,di
ret
DecimalConvertNumber:
mov si,#InputWord
cmpb [si],#'''
jz CharLiteralFound
cmpb 1[si],#'x' |Hex Number
jz HexNumberFound
xor ax,ax
mov bx,#10
xor dx,dx
DecConvNumber1:
mov cx,ax
xorb ah,ah
lodsb
call IsNumAL
jnc FinishedDecimalConvert
sub ax,#48
xchg cx,ax
mul bx
or dx,dx
jnz ReportLargeDecConst
add ax,cx
jc ReportLargeDecConst
jmps DecConvNumber1
FinishedDecimalConvert:
mov ax,cx
ret
HexNumberFound:
inc si |get past the 0x
inc si
xor ax,ax
HexNumberFound1:
mov cx,ax
lodsb
call IsHexAL
jnc FinishedDecimalConvert
subb al,#'0'
cmpb al,#10
jc ZeroToNine
subb al,#7
ZeroToNine:
shl cx
jc ReportLargeDecConst
shl cx
jc ReportLargeDecConst
shl cx
jc ReportLargeDecConst
shl cx
jc ReportLargeDecConst
xorb ah,ah
or ax,cx
jmps HexNumberFound1
ReportLargeDecConst:
mov bx, #LargeConstMessage
call PanicRecover
CharLiteralFound:
movb al,1[si]
movb ah,#0
ret
TransferExprToSpace:
mov di, StringSpace
mov si, #PostFixBufferStart
ExprTransferNext:
lodsw
stosw
call CheckStringTableOverflow
or ax,ax
jz ExprTransferEnd
movb cl,ah
orb cl,cl
jz ExprTransferNext
ExprTransferSame:
lodsw
stosw
decb cl
jnz ExprTransferSame
jmps ExprTransferNext
ExprTransferEnd:
ret
IsSimpleExpression:
push si
mov si,#PostFixBufferStart
lodsw
cmp ax,#256 |0100 for single operand
jnz SimpleExprEnd
lodsw
lodsw
cmp ax,#0
jnz SimpleExprEnd
mov ax,-4[si]
SimpleExprEnd:
pop si
ret
|This routine gets an operand from the input
|
GotRegister:
movb al,[si]
ret
OperandExpected:
mov bx,#OperandExpectedMessage
call PanicRecover
GetBasicOperand:
push bx
call GetToken
pop bx
jc OperandExpected
mov si,#InputWord
lodsb
call IsAlphaAL
jnc NotARegister |A Register always start with a character
cmpb 1[si],#0 |A Register name is always 2 chars
jnz NotARegister
mov si,#SmallRegisters
push bx
call MatchKeyword
pop bx
movb cl,#1
jnc GotRegister
mov si,#BigRegisters
push bx
call MatchKeyword
pop bx
movb cl,#2
jnc GotRegister
mov si,#SegmentRegisters
push bx
call MatchKeyword
pop bx
movb cl,#3
jnc GotRegister
NotARegister:
cmpb al,#'#'
jnz NotanImmediate
call GetExprValInd
movb cl,#4
ret
NotanImmediate:
cmpb InputWord,#'['
jnz NotAnAddressingMode
call GetAddressingMode
movb cl,#5
ret
NotAnAddressingMode:
| call DisplayMessage
| db 'calling',0dh,0ah,0
call GetExprValInd1
pushf
| call DisplayRegister
cmpb InputWord,#'['
jz HasAddressToo
popf
movb cl,#6
ret
HasAddressToo:
push ax
call GetAddressingMode
pop ax
popf
movb cl,#7
ret
CompilerFakes:
.word 0
GetExprValInd1:
push bx
clc
jmps GEVI1
GetExprValInd:
push bx
call GetToken
GEVI1:
call ProcessExpression
test bx,#Calculated
jnz ExprValueFound
test bx,#IsFake
jnz GotExprIndex
push ax
push bx
call BackupInputWord
mov di,#InputWord
movb al,#'_'
stosb
stosb
inc CompilerFakes
mov ax,CompilerFakes
call SprintRegister
xorb al,al
stosb
call AddSymbol
call RestoreInputWord
pop bx
pop ax
or bx,#IsDefined
| or bx,#IsFake
mov Value[di],ax
mov Attributes[di],bx
mov ax,di
GotExprIndex:
pop bx
call AddOffEnt
stc
ret
ExprValueFound:
pop bx
clc
ret
WrongMode:
mov bx,#InvalidAddrMode
call PanicRecover
GetAddressingMode:
call GetToken
mov si,#AddressingModes
call MatchKeyword
jc WrongMode
call GetToken
cmpb InputWord,#']'
jnz WrongMode
movb bl,[si]
ret
GetOperand:
push si
call GetBasicOperand
pop si
pushf
cmpb cl,#3
jnc NotNormalRegister
orb al,#192
NoValues:
xorb ah,ah
GetOperandEnd:
popf
ret
NotNormalRegister:
cmpb cl,#3
jnz NotSegmentRegister
shlb al
shlb al
shlb al
jmp NoValues
NotSegmentRegister:
cmpb cl,#4
jnz NotanImmediate1
mov bx,ax
xorb ch,ch
popf
pushf
adcb ch,#0
movb ah,#2
jmp GetOperandEnd
NotanImmediate1:
cmpb cl,#5
jnz NotJustMode
movb al,bl
jmp NoValues
NotJustMode:
xchg bx,ax
cmpb cl,#6
jnz NotJustDisp
xorb ch,ch
popf
pushf
jnc KnownMode
incb ch
mov bx,#1
KnownMode:
movb al,#6
movb ah,#2
jmp GetOperandEnd
NotJustDisp:
movb ch,#0
popf
pushf
jc DispUnknown
orb bh,bh
jnz DispEnd
movb ah,#1
orb al,#64
jmp GetOperandEnd
DispUnknown:
movb ch,#1
mov bx,#1
DispEnd:
movb ah,#2
orb al,#128
jmp GetOperandEnd