-
Notifications
You must be signed in to change notification settings - Fork 1
/
8051-2.asm
492 lines (490 loc) · 10.8 KB
/
8051-2.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
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
;---------------------------------
; Cross-Assembler for 8051 Series
; Copyright (C) 1997 by Rst7/CBS
; Adding by (R)soft 1999-2000
;---------------------------------
;
opcode EQU 0
secondbyte EQU 0-1
;
DEFMAC byte2
DEFB \0,\1
ENDMAC
DEFMAC byte
DEFB \0
ENDMAC
;
DEFMAC compil@1
DEFB \0
.IF secondbyte-#FFFF
.ELSE
DEFB secondbyte
secondbyte = 0-1
.ENDIF
ENDMAC
;
DEFMAC Error
\0
ENDMAC
;
DEFMAC compile@
\r .IF "\c\c"-"RR"
.ELSE
Error Adressing Error in @Rx
.ENDIF
\r .IF " \n\c"-" 0"
compil@1 opcode+6
.ENDIF
\r .IF " \n\c"-" 1"
compil@1 opcode+7
.ENDIF
Error Adressing Error in @Rx
ENDMAC
;
DEFMAC compilead
DEFB opcode+5,\0
.IF secondbyte-#FFFF
.ELSE
DEFB secondbyte
secondbyte = 0-1
.ENDIF
ENDMAC
;
DEFMAC compilereg
\r DEFB opcode+"\n\c"-"0"+8
.IF secondbyte-#FFFF
.ELSE
DEFB secondbyte
secondbyte = 0-1
.ENDIF
ENDMAC
;
DEFMAC mov.2A
\r .IF " \c"-" #"
byte2 #74,\n\s
.ENDIF
\r .IF " \c"-" @"
compile@ \n\s
.ENDIF
\r .IF ("\c\c"-"RR")|(" \n\c"-" 0"/8)|("\n\c"-" ")
compilereg \0
.ENDIF
compilead \0
ENDMAC
;
DEFMAC mov.fromA
;
\r .IF " \c"-" @"
compile@ \n\s
.ENDIF
\r .IF ("\c\c"-"RR")|(" \n\c"-" 0"/8)|("\n\c"-" ")
compilereg \0
.ENDIF
compilead \0
ENDMAC
;
;---------------------------------
DEFMAC MOV.part2
;\r\s,\n
.IF ("\c\c"-"RR")|(" \n\c"-" 0"/8)|("\n\c"-" ")
secondbyte = \0&#FF
opcode = #80
compilereg \1
.ENDIF
;\r\s,\n
DEFB #85,\s;,\0
;
ENDMAC
;----
DEFMAC MOVC A,@A+PC
DEFB #83
ENDMAC
DEFMAC MOVC A,@A+DPTR
DEFB #93
ENDMAC
DEFMAC MOVX A,@DPTR
DEFB #E0
ENDMAC
DEFMAC MOVX @DPTR,A
DEFB #F0
ENDMAC
DEFMAC MOVX A,@R0
DEFB #E2
ENDMAC
DEFMAC MOVX A,@R1
DEFB #E3
ENDMAC
DEFMAC MOVX @R0,A
DEFB #F2
ENDMAC
DEFMAC MOVX @R1,A
DEFB #F3
ENDMAC
DEFMAC MOV DPTR,#
DEFB #90
DEFB \0/256,\0
ENDMAC
;----
DEFMAC MOV
;
.IF " \1"-" C"
byte2 #92,\0
.ENDIF
.IF " \0"-" C"
byte2 #A2,\1
.ENDIF
;
.IF " \1"-" A"
opcode = #F0
mov.fromA \0 ;
.ENDIF
.IF " \0"-" A"
opcode = #E0
mov.2A \1 ;
.ENDIF
;\r\s,\n
.IF " \c"-" #"
secondbyte = \n\s
secondbyte = secondbyte&#FF
opcode = #70
mov.fromA \0 ;
.ENDIF
;
\r .IF " \c"-" @"
secondbyte = \1&#FF
opcode = #A0
compile@ \n\s
.ENDIF
;
\r .IF ("\c\c"-"RR")|(" \n\c"-" 0"/8)|(" \n\c"-" ,")
secondbyte = \1&#FF
opcode = #A0
compilereg \0
.ENDIF
;
;\r\s,
.IF " \n\c"-" @"
secondbyte = \0&#FF
opcode = #80
compile@ \n\s
.ENDIF
MOV.part2 \0,\1 ;
ENDMAC
;----
DEFMAC onebytecmd
.IF " \1"-" \2"
DEFB \0
.ELSE
Error Need '\2' operand
.ENDIF
ENDMAC
;
DEFMAC RR
onebytecmd #03,\0,A
ENDMAC
DEFMAC RRC
onebytecmd #13,\0,A
ENDMAC
DEFMAC RL
onebytecmd #23,\0,A
ENDMAC
DEFMAC RLC
onebytecmd #33,\0,A
ENDMAC
DEFMAC RET
onebytecmd #22,\0,
ENDMAC
DEFMAC RETI
onebytecmd #32,\0,
ENDMAC
DEFMAC DIV
onebytecmd #84,\0,AB
ENDMAC
DEFMAC MUL
onebytecmd #A4,\0,AB
ENDMAC
DEFMAC SWAP
onebytecmd #C4,\0,A
ENDMAC
DEFMAC DA
onebytecmd #D4,\0,A
ENDMAC
;------
DEFMAC parse1
\r .IF " \c"-" #"
byte2 opcode+4,\n\s
.ENDIF
\r .IF " \c"-" @"
compile@ \n\s
.ENDIF
\r .IF ("\c\c"-"RR")|(" \n\c"-" 0"/8)|("\n\c"-" ")
compilereg \0
.ENDIF
compilead \0
ENDMAC
;
DEFMAC parse2
.IF \2
Error Illegal adressing mode
.ENDIF
.IF " \0"-" A"
byte2 opcode+2,\1
.ENDIF
.IF " \r\c"-" #"
DEFB opcode+3
byte2 \1,\n\s,
.ENDIF
Error Illegal adressing mode
ENDMAC
;
DEFMAC parse
opcode = \1
.IF " \2"-" A"
parse1 \0 ;
.ELSE
parse2 \0,\2,\3
.ENDIF
ENDMAC
;
DEFMAC ADD
parse \1,#20,\0,0
ENDMAC
DEFMAC ADDC
parse \1,#30,\0,0
ENDMAC
;
DEFMAC ORL.part2
\r .IF " \c"-" /"
DEFB #A0,\n\s
.ELSE
DEFB #72,\s
.ENDIF
ENDMAC
;
DEFMAC ORL
.IF " \0"-" C"
ORL.part2 \1
.ENDIF
parse \1,#40,\0,1
ENDMAC
;
DEFMAC ANL.part2
\r .IF " \c"-" /"
DEFB #B0,\n\s
.ELSE
DEFB #82,\s
.ENDIF
ENDMAC
;
DEFMAC ANL
.IF " \0"-" C"
ANL.part2 \1
.ENDIF
parse \1,#50,\0,1
ENDMAC
DEFMAC XRL
parse \1,#60,\0,1
ENDMAC
DEFMAC SUBB
parse \1,#90,\0,0
ENDMAC
;!!!
DEFMAC CJNE
parse \1,#B0,\0,0
ENDMAC
;
DEFMAC XCHD A,@R0
DEFB #D6
ENDMAC
DEFMAC XCHD A,@R1
DEFB #D7
ENDMAC
DEFMAC XCH
parse \1,#C0,\0,0
ENDMAC
;
DEFMAC INC.part2
\r .IF ("\c\c"-"RR")|(" \n\c"-" 0"/8)|("\n\c"-" ")
compilereg \0
.ENDIF
\r .IF ("\c\n\c\n"-"DP")|("\c\n\c\n\s "-"TR")
byte #A3
.ENDIF
compilead \0
ENDMAC
DEFMAC INC
.IF "~~\1"-"~~"
.ELSE
Error Only one operand need
.ENDIF
opcode = 0
\r .IF " \c"-" A"
byte opcode+4
.ENDIF
\r .IF " \c"-" @"
compile@ \n\s
.ENDIF
INC.part2 \0 ; ;
ENDMAC
;
DEFMAC DEC.part2
\r .IF ("\c\c"-"RR")|(" \n\c"-" 0"/8)|("\n\c"-" ")
compilereg \0
.ENDIF
compilead \0
ENDMAC
DEFMAC DEC
.IF "~~\1"-"~~"
.ELSE
Error Only one operand need
.ENDIF
opcode = #10
\r .IF " \c"-" A"
byte opcode+4
.ENDIF
\r .IF " \c"-" @"
compile@ \n\s
.ENDIF
DEC.part2 \0 ; ;
ENDMAC
;
DEFMAC DJNZ
opcode = #D0
secondbyte = \1-$-2
.IF secondbyte+#80/256
.ELSE
Error DJNZ too far
.ENDIF
secondbyte = secondbyte&255
\r .IF ("\c\c"-"RR")|(" \n\c"-" 0"/8)|(" \n\c"-" ,")
compilereg \0
.ENDIF
compilead \0
ENDMAC
;
DEFMAC JMP @A+DPTR
DEFB #73
ENDMAC
;
DEFMAC PUSH
DEFB #C0,\0
ENDMAC
DEFMAC POP
DEFB #D0,\0
ENDMAC
;
DEFMAC CPL C
DEFB #B3
ENDMAC
DEFMAC CLR C
DEFB #C3
ENDMAC
DEFMAC SETB C
DEFB #D3
ENDMAC
;
DEFMAC CPL
DEFB #B2,\0
ENDMAC
DEFMAC CLR
DEFB #C2,\0
ENDMAC
DEFMAC SETB
DEFB #D2,\0
ENDMAC
;
DEFMAC LJMP
DEFB #02,\0/256,\0
ENDMAC
DEFMAC LCALL
DEFB #12,\0/256,\0
ENDMAC
;
DEFMAC AJMP
DEFB #01|(\0ʼ/8),\0
ENDMAC
DEFMAC ACALL
DEFB #11|(\0ʼ/8),\0
ENDMAC
;
DEFMAC sendrel
opcode = \1-$-2
.IF opcode+#80/256
.ELSE
Error Relative jump too far
.ENDIF
DEFB \0
.IF "~~\2"-"~~"
.ELSE
DEFB \2
.ENDIF
DEFB opcode
ENDMAC
;
DEFMAC JBC
sendrel #10,\1,\0
ENDMAC
DEFMAC JB
sendrel #20,\1,\0
ENDMAC
DEFMAC JNB
sendrel #30,\1,\0
ENDMAC
DEFMAC JC
sendrel #40,\0
ENDMAC
DEFMAC JNC
sendrel #50,\0
ENDMAC
DEFMAC JZ
sendrel #60,\0
ENDMAC
DEFMAC JNZ
sendrel #70,\0
ENDMAC
DEFMAC SJMP
sendrel #80,\0
ENDMAC
;----------------------------------------------------
; Define symbolical names of internal ports/registers
; AT89S53 Microcontrollers Extend
;----------------------------------------------------
P0 EQU #80 ;Port 0
SPP EQU #81 ;Stack Point Register
DP0L EQU #82 ;DPTR0 (Main) Low byte
DPL EQU #82
DP0H EQU #83 ;DPTR0 (Main) High byte
DPH EQU #83
DP1L EQU #84 ;DPTR1 Low byte
DP1H EQU #85 ;DPTR1 High byte
SPDR EQU #86 ;Serial Peripheral interface Data Register
PCON EQU #87 ;Power CONtrol
TCON EQU #88 ;Timer CONtrol
TMOD EQU #89 ;Timer MODe
TL0 EQU #8A ;Timer 0 Low byte
TL1 EQU #8B ;Timer 1 Low byte
TH0 EQU #8C ;Timer 0 High byte
TH1 EQU #8D ;Timer 1 High byte
P1 EQU #90 ;Port 1
WMCON EQU #96 ;Wait/Memory CONtrol
SCON EQU #98 ;Serial CONtrol
SBUF EQU #99 ;Serial BUFer
P2 EQU #A0 ;Port 2
IE EQU #A8 ;Interrupt Enable
SPSR EQU #AA ;Serial Peripheral interface Status Register
P3 EQU #B0 ;Port 3
IP EQU #B8 ;Interrupt Priority
T2CON EQU #C8 ;Timer 2 Control
T2MOD EQU #C9 ;Timer 2 MODe
RCAP2L EQU #CA ;
RCAP2H EQU #CB ;
TL2 EQU #CC ;Timer 2 Low byte
TH2 EQU #CD ;Timer 2 High byte
PSW EQU #D0 ;Flags Register
SPCR EQU #D5 ;Serial Pheripheral Control Register
ACC EQU #E0 ;ACCumulator
BREG EQU #F0 ;B REGisrer
;
ORG #8000
.PHASE 0
;