initial commit: a mess of assembly code
[fmap.git] / x86_64_sse2_x87 / fasm / examples / 8051 / 8051.inc
blob89e33e5f6ccee75f4cc1a43abcdf01a238879de4
1 \r
2 ; This is a very basic implementation of 8051 instruction set, which treats\r
3 ; all types of addresses as plain numeric values and therefore is not able to\r
4 ; detect whether symbol has been used in context it was not intended for.\r
5 \r
6 element R\r
7 \r
8 repeat 8 i:0\r
9   element R#i? : R + i\r
10 end repeat\r
12 element @\r
14 element @R0? : @\r
15 element @R1? : @ + 1\r
17 macro AJMP? addr\r
18         local value\r
19         value = +addr\r
20         if value and not 7FFh = ($+2) and not 7FFh\r
21                 db 01h + value shr 3 and 11100000b,value and 0FFh\r
22         else\r
23                 err "address out of range"\r
24         end if\r
25 end macro\r
27 macro ACALL? addr\r
28         local value\r
29         value = +addr\r
30         if value and not 7FFh = ($+2) and not 7FFh\r
31                 db 11h + value shr 3 and 11100000b,value and 0FFh\r
32         else\r
33                 err "address out of range"\r
34         end if\r
35 end macro\r
37 macro LCALL? addr\r
38         local value\r
39         value = +addr\r
40         db 12h,value shr 8,value and 0FFh\r
41 end macro\r
43 macro LJMP? addr\r
44         local value\r
45         value = +addr\r
46         db 02h,value shr 8,value and 0FFh\r
47 end macro\r
49 macro SJMP? addr\r
50         local offset\r
51         offset = -($+2)+addr\r
52         if offset>=-80h & offset<80h\r
53                 db 80h,offset\r
54         else\r
55                 err "relative jump out of range"\r
56         end if\r
57 end macro\r
59 macro CALL? addr\r
60         local value\r
61         value = +addr\r
62         if value and not 7FFh = ($+2) and not 7FFh\r
63                 db 11h + value shr 3 and 11100000b\r
64         else\r
65                 db 12h,value shr 8\r
66         end if\r
67         db value and 0FFh\r
68 end macro\r
70 macro JMP? addr\r
71         local value,offset\r
72         match =@A? + =DPTR?, addr\r
73                 db 73h\r
74         else\r
75                 value = +addr\r
76                 offset = value-($+2)\r
77                 if offset>=-80h & offset<80h\r
78                         db 80h,offset\r
79                 else\r
80                         if value and not 7FFh = ($+2) and not 7FFh\r
81                                 db 01h + value shr 3 and 11100000b\r
82                         else\r
83                                 db 02h,value shr 8\r
84                         end if\r
85                         db value and 0FFh\r
86                 end if\r
87         end match\r
88 end macro\r
90 macro CJNE? operand1,operand2,addr\r
91         local value,offset\r
92         offset = -($+3)+addr\r
93         if offset>=-80h & offset<80h\r
94                 match =A?, operand1\r
95                         match #data, operand2\r
96                                 value = +data\r
97                                 db 0B4h,value\r
98                         else\r
99                                 value = +operand2\r
100                                 db 0B5h,value\r
101                         end match\r
102                 else match #data,operand2\r
103                         value = +operand1\r
104                         if value eq value element 1\r
105                                 if value metadata 1 relativeto @\r
106                                         db 0B6h + value metadata 1 - @\r
107                                 else if value metadata 1 relativeto R\r
108                                         db 0B8h + value metadata 1 - R\r
109                                 else\r
110                                         err "invalid operand"\r
111                                 end if\r
112                                 db +data\r
113                         else\r
114                                 err "invalid operand"\r
115                         end if\r
116                 else\r
117                         err 'invalid operand'\r
118                 end match\r
119                 db offset\r
120         else\r
121                 err "relative jump out of range"\r
122         end if\r
123 end macro\r
125 macro DJNZ? operand,addr\r
126         local value,offset\r
127         value = +operand\r
128         if value relativeto 0\r
129                 offset = -($+3)+addr\r
130                 if offset>=-80h & offset<80h\r
131                         db 0D5h,value,offset\r
132                 else\r
133                         err "relative jump out of range"\r
134                 end if\r
135         else if value eq value element 1 & value metadata 1 relativeto R\r
136                 offset = -($+2)+addr\r
137                 if offset>=-80h & offset<80h\r
138                         db 0D8h + value metadata 1 - R,offset\r
139                 else\r
140                         err "relative jump out of range"\r
141                 end if\r
142         else\r
143                 err "invalid operand"\r
144         end if\r
145 end macro\r
147 macro JBC? operand,addr\r
148         local offset\r
149         offset = -($+3)+addr\r
150         if offset>=-80h & offset<80h\r
151                 db 10h,operand,offset\r
152         else\r
153                 err "relative jump out of range"\r
154         end if\r
155 end macro\r
157 macro JB? operand,addr\r
158         local offset\r
159         offset = -($+3)+addr\r
160         if offset>=-80h & offset<80h\r
161                 db 20h,operand,offset\r
162         else\r
163                 err "relative jump out of range"\r
164         end if\r
165 end macro\r
167 macro JNB? operand,addr\r
168         local offset\r
169         offset = -($+3)+addr\r
170         if offset>=-80h & offset<80h\r
171                 db 30h,operand,offset\r
172         else\r
173                 err "relative jump out of range"\r
174         end if\r
175 end macro\r
177 macro JC? addr\r
178         local offset\r
179         offset = -($+2)+addr\r
180         if offset>=-80h & offset<80h\r
181                 db 40h,offset\r
182         else\r
183                 err "relative jump out of range"\r
184         end if\r
185 end macro\r
187 macro JNC? addr\r
188         local offset\r
189         offset = -($+2)+addr\r
190         if offset>=-80h & offset<80h\r
191                 db 50h,offset\r
192         else\r
193                 err "relative jump out of range"\r
194         end if\r
195 end macro\r
197 macro JZ? addr\r
198         local offset\r
199         offset = -($+2)+addr\r
200         if offset>=-80h & offset<80h\r
201                 db 60h,offset\r
202         else\r
203                 err "relative jump out of range"\r
204         end if\r
205 end macro\r
207 macro JNZ? addr\r
208         local offset\r
209         offset = -($+2)+addr\r
210         if offset>=-80h & offset<80h\r
211                 db 70h,offset\r
212         else\r
213                 err "relative jump out of range"\r
214         end if\r
215 end macro\r
217 macro ADD? accu,operand\r
218         local value\r
219         match =A?, accu\r
220                 match #data, operand\r
221                         value = +data\r
222                         db 24h,value\r
223                 else\r
224                         value = +operand\r
225                         if value relativeto 0\r
226                                 db 25h,value\r
227                         else if value eq value element 1\r
228                                 if value metadata 1 relativeto @\r
229                                         db 26h + value metadata 1 - @\r
230                                 else if value metadata 1 relativeto R\r
231                                         db 28h + value metadata 1 - R\r
232                                 else\r
233                                         err "invalid operand"\r
234                                 end if\r
235                         else\r
236                                 err "invalid operand"\r
237                         end if\r
238                 end match\r
239         else\r
240                 err 'invalid operand'\r
241         end match\r
242 end macro\r
244 macro ADDC? accu,operand\r
245         local value\r
246         match =A?, accu\r
247                 match #data, operand\r
248                         value = +data\r
249                         db 34h,value\r
250                 else\r
251                         value = +operand\r
252                         if value relativeto 0\r
253                                 db 35h,value\r
254                         else if value eq value element 1\r
255                                 if value metadata 1 relativeto @\r
256                                         db 36h + value metadata 1 - @\r
257                                 else if value metadata 1 relativeto R\r
258                                         db 38h + value metadata 1 - R\r
259                                 else\r
260                                         err "invalid operand"\r
261                                 end if\r
262                         else\r
263                                 err "invalid operand"\r
264                         end if\r
265                 end match\r
266         else\r
267                 err 'invalid operand'\r
268         end match\r
269 end macro\r
271 macro SUBB? accu,operand\r
272         local value\r
273         match =A?, accu\r
274                 match #data, operand\r
275                         value = +data\r
276                         db 94h,value\r
277                 else\r
278                         value = +operand\r
279                         if value relativeto 0\r
280                                 db 95h,value\r
281                         else if value eq value element 1\r
282                                 if value metadata 1 relativeto @\r
283                                         db 96h + value metadata 1 - @\r
284                                 else if value metadata 1 relativeto R\r
285                                         db 98h + value metadata 1 - R\r
286                                 else\r
287                                         err "invalid operand"\r
288                                 end if\r
289                         else\r
290                                 err "invalid operand"\r
291                         end if\r
292                 end match\r
293         else\r
294                 err 'invalid operand'\r
295         end match\r
296 end macro\r
298 macro ANL? dest,src\r
299         local value,data_value\r
300         match =A?, dest\r
301                 match #data, src\r
302                         value = +data\r
303                         db 54h,value\r
304                 else\r
305                         value = +src\r
306                         if value relativeto 0\r
307                                 db 55h,value\r
308                         else if value eq value element 1\r
309                                 if value metadata 1 relativeto @\r
310                                         db 56h + value metadata 1 - @\r
311                                 else if value metadata 1 relativeto R\r
312                                         db 58h + value metadata 1 - R\r
313                                 else\r
314                                         err "invalid operand"\r
315                                 end if\r
316                         else\r
317                                 err "invalid operand"\r
318                         end if\r
319                 end match\r
320         else match =C?, dest\r
321                 match /addr,src\r
322                         db 0B0h,addr\r
323                 else\r
324                         db 82h,src\r
325                 end match\r
326         else\r
327                 match =A?, src\r
328                         value = +dest\r
329                         db 52h,value\r
330                 else match #data, src\r
331                         value = +dest\r
332                         data_value = +data\r
333                         db 53h,value,data_value\r
334                 else\r
335                         err 'invalid operand'\r
336                 end match\r
337         end match\r
338 end macro\r
340 macro ORL? dest,src\r
341         local value,data_value\r
342         match =A?, dest\r
343                 match #data, src\r
344                         value = +data\r
345                         db 44h,value\r
346                 else\r
347                         value = +src\r
348                         if value relativeto 0\r
349                                 db 45h,value\r
350                         else if value eq value element 1\r
351                                 if value metadata 1 relativeto @\r
352                                         db 46h + value metadata 1 - @\r
353                                 else if value metadata 1 relativeto R\r
354                                         db 48h + value metadata 1 - R\r
355                                 else\r
356                                         err "invalid operand"\r
357                                 end if\r
358                         else\r
359                                 err "invalid operand"\r
360                         end if\r
361                 end match\r
362         else match =C?, dest\r
363                 match /addr,src\r
364                         db 0A0h,addr\r
365                 else\r
366                         db 72h,src\r
367                 end match\r
368         else\r
369                 match =A?, src\r
370                         value = +dest\r
371                         db 42h,value\r
372                 else match #data, src\r
373                         value = +dest\r
374                         data_value = +data\r
375                         db 43h,value,data_value\r
376                 else\r
377                         err 'invalid operand'\r
378                 end match\r
379         end match\r
380 end macro\r
382 macro XRL? dest,src\r
383         local value,data_value\r
384         match =A?, dest\r
385                 match #data, src\r
386                         value = +data\r
387                         db 64h,value\r
388                 else\r
389                         value = +src\r
390                         if value relativeto 0\r
391                                 db 65h,value\r
392                         else if value eq value element 1\r
393                                 if value metadata 1 relativeto @\r
394                                         db 66h + value metadata 1 - @\r
395                                 else if value metadata 1 relativeto R\r
396                                         db 68h + value metadata 1 - R\r
397                                 else\r
398                                         err "invalid operand"\r
399                                 end if\r
400                         else\r
401                                 err "invalid operand"\r
402                         end if\r
403                 end match\r
404         else\r
405                 match =A?, src\r
406                         value = +dest\r
407                         db 62h,value\r
408                 else match #data, src\r
409                         value = +dest\r
410                         data_value = +data\r
411                         db 63h,value,data_value\r
412                 else\r
413                         err 'invalid operand'\r
414                 end match\r
415         end match\r
416 end macro\r
418 macro CLR? operand\r
419         match =A?, operand\r
420                 db 0E4h\r
421         else match =C?, operand\r
422                 db 0C3h\r
423         else\r
424                 db 0C2h,operand\r
425         end match\r
426 end macro\r
428 macro CPL? operand\r
429         match =A?, operand\r
430                 db 0F4h\r
431         else match =C?, operand\r
432                 db 0B3h\r
433         else\r
434                 db 0B2h,operand\r
435         end match\r
436 end macro\r
438 macro SETB? operand\r
439         match =C?, operand\r
440                 db 0D3h\r
441         else\r
442                 db 0D2h,operand\r
443         end match\r
444 end macro\r
446 macro DEC? operand\r
447         local value\r
448         match =A?, operand\r
449                 db 14h\r
450         else\r
451                 value = +operand\r
452                 if value relativeto 0\r
453                         db 15h,value\r
454                 else if value eq value element 1\r
455                         if value metadata 1 relativeto @\r
456                                 db 16h + value metadata 1 - @\r
457                         else if value metadata 1 relativeto R\r
458                                 db 18h + value metadata 1 - R\r
459                         else\r
460                                 err "invalid operand"\r
461                         end if\r
462                 else\r
463                         err "invalid operand"\r
464                 end if\r
465         end match\r
466 end macro\r
468 macro INC? operand\r
469         local value\r
470         match =A?, operand\r
471                 db 04h\r
472         else match =DPTR?, operand\r
473                 db 0A3h\r
474         else\r
475                 value = +operand\r
476                 if value relativeto 0\r
477                         db 05h,value\r
478                 else if value eq value element 1\r
479                         if value metadata 1 relativeto @\r
480                                 db 06h + value metadata 1 - @\r
481                         else if value metadata 1 relativeto R\r
482                                 db 08h + value metadata 1 - R\r
483                         else\r
484                                 err "invalid operand"\r
485                         end if\r
486                 else\r
487                         err "invalid operand"\r
488                 end if\r
489         end match\r
490 end macro\r
492 macro MOV? dest,src\r
493         local value,data_value\r
494         match =A?, dest\r
495                 match #data, src\r
496                         value = +data\r
497                         db 74h,value\r
498                 else\r
499                         value = +src\r
500                         if value relativeto 0\r
501                                 db 0E5h,value\r
502                         else if value eq value element 1\r
503                                 if value metadata 1 relativeto @\r
504                                         db 0E6h + value metadata 1 - @\r
505                                 else if value metadata 1 relativeto R\r
506                                         db 0E8h + value metadata 1 - R\r
507                                 else\r
508                                         err "invalid operand"\r
509                                 end if\r
510                         else\r
511                                 err "invalid operand"\r
512                         end if\r
513                 end match\r
514         else match =C?, dest\r
515                 db 0A2h,src\r
516         else match =C?, src\r
517                 db 92h,dest\r
518         else match =DPTR?, dest\r
519                 value = src\r
520                 db 90h\r
521                 if value eqtype ''\r
522                       dw +src\r
523                 else\r
524                       db value shr 8,value and 0FFh\r
525                 end if\r
526         else\r
527                 value = +dest\r
528                 if value relativeto 0\r
529                         match =A?, src\r
530                                 db 0F5h,value\r
531                         else match #data, src\r
532                                 data_value = +data\r
533                                 db 75h,value,data_value\r
534                         else\r
535                                 @value2 = +src\r
536                                 if @value2 relativeto 0\r
537                                         db 85h,@value2,value\r
538                                 else if @value2 eq @value2 element 1\r
539                                         if @value2 metadata 1 relativeto @\r
540                                                 db 86h + @value2 metadata 1 - @,value\r
541                                         else if @value2 metadata 1 relativeto R\r
542                                                 db 88h + @value2 metadata 1 - R,value\r
543                                         end if\r
544                                 else if\r
545                                         err "invalid operand"\r
546                                 end if\r
547                         end match\r
548                 else if value eq value element 1\r
549                         if value metadata 1 relativeto @\r
550                                 match =A?, src\r
551                                         db 0F6h + value metadata 1 - @\r
552                                 else match #data, src\r
553                                         data_value = +data\r
554                                         db 76h + value metadata 1 - @,data_value\r
555                                 else\r
556                                         data_value = +src\r
557                                         db 0A6h + value metadata 1 - @,data_value\r
558                                 end match\r
559                         else if value metadata 1 relativeto R\r
560                                 match =A?, src\r
561                                         db 0F8h + value metadata 1 - R\r
562                                 else match #data, src\r
563                                         data_value = +data\r
564                                         db 78h + value metadata 1 - R,data_value\r
565                                 else\r
566                                         data_value = +src\r
567                                         db 0A8h + value metadata 1 - R,data_value\r
568                                 end match\r
569                         else\r
570                                 err "invalid operand"\r
571                         end if\r
572                 else\r
573                         err "invalid operand"\r
574                 end if\r
575         end match\r
576 end macro\r
578 macro MOVC? operands&\r
579         match =A?=, =@A? + =DPTR?, operands\r
580                 db 93h\r
581         else match =A?=, =@A? + =PC?, operands\r
582                 db 83h\r
583         else\r
584                 err "invalid operand"\r
585         end match\r
586 end macro\r
588 macro MOVX? dest,src\r
589         local value\r
590         match =A?, dest\r
591                 match =@DPTR?, src\r
592                         db 0E0h\r
593                 else\r
594                         value = +src\r
595                         if value eq value element 1 & value metadata 1 relativeto @\r
596                                 db 0E2h + value metadata 1 - @\r
597                         else\r
598                                 err "invalid operand"\r
599                         end if\r
600                 end match\r
601         else match =A?, src\r
602                 match =@DPTR?, dest\r
603                         db 0F0h\r
604                 else\r
605                         value = +dest\r
606                         if value eq value element 1 & value metadata 1 relativeto @\r
607                                 db 0F2h + value metadata 1 - @\r
608                         else\r
609                                 err "invalid operand"\r
610                         end if\r
611                 end match\r
612         else\r
613                 err "invalid operand"\r
614         end match\r
615 end macro\r
617 macro SWAP? operand\r
618         match =A?, operand\r
619                 db 0C4h\r
620         else\r
621                 err 'invalid operand'\r
622         end match\r
623 end macro\r
625 macro DA? operand\r
626         match =A?, operand\r
627                 db 0D4h\r
628         else\r
629                 err 'invalid operand'\r
630         end match\r
631 end macro\r
633 macro RR? operand\r
634         match =A?, operand\r
635                 db 03h\r
636         else\r
637                 err 'invalid operand'\r
638         end match\r
639 end macro\r
641 macro RRC? operand\r
642         match =A?, operand\r
643                 db 13h\r
644         else\r
645                 err 'invalid operand'\r
646         end match\r
647 end macro\r
649 macro RL? operand\r
650         match =A?, operand\r
651                 db 23h\r
652         else\r
653                 err 'invalid operand'\r
654         end match\r
655 end macro\r
657 macro RLC? operand\r
658         match =A?, operand\r
659                 db 33h\r
660         else\r
661                 err 'invalid operand'\r
662         end match\r
663 end macro\r
665 macro DIV? operand\r
666         match =AB?, operand\r
667                 db 84h\r
668         else\r
669                 err "invalid operand"\r
670         end match\r
671 end macro\r
673 macro MUL? operand\r
674         match =AB?, operand\r
675                 db 0A4h\r
676         else\r
677                 err "invalid operand"\r
678         end match\r
679 end macro\r
681 macro NOP?\r
682         db 0\r
683 end macro\r
685 macro POP? addr\r
686         local value\r
687         value = +addr\r
688         db 0D0h,value\r
689 end macro\r
691 macro PUSH? addr\r
692         local value\r
693         value = +addr\r
694         db 0C0h,value\r
695 end macro\r
697 macro RET?\r
698         db 22h\r
699 end macro\r
701 macro RETI?\r
702         db 32h\r
703 end macro\r
705 macro XCH? accu,operand\r
706         local value\r
707         match =A?, accu\r
708                 value = +operand\r
709                 if value relativeto 0\r
710                         db 0C5h,value\r
711                 else if value eq value element 1\r
712                         if value metadata 1 relativeto @\r
713                                 db 0C6h + value metadata 1 - @\r
714                         else if value metadata 1 relativeto R\r
715                                 db 0C8h + value metadata 1 - R\r
716                         else\r
717                                 err "invalid operand"\r
718                         end if\r
719                 else\r
720                         err "invalid operand"\r
721                 end if\r
722         else\r
723                 err 'invalid operand'\r
724         end match\r
725 end macro\r
727 macro XCHD? accu,src\r
728         local value\r
729         match =A?, accu\r
730                 value = +src\r
731                 if value eq value element 1 & value metadata 1 relativeto @\r
732                         db 0D6h + value metadata 1 - @\r
733                 else\r
734                         err "invalid operand"\r
735                 end if\r
736         else\r
737                 err "invalid operand"\r
738         end match\r
739 end macro\r
741 struc EQU? value\r
742         . = value\r
743 end struc\r
745 DSEG?.$ = 0\r
746 DSEG?.open = 0\r
748 macro DSEG? @:at DSEG?.$\r
749         if ~ DSEG?.open\r
750                 virtual @\r
751                 DSEG?.open = 1\r
752         else\r
753                 match =AT? addr, @\r
754                         org addr\r
755                 else\r
756                         err 'invalid argument'\r
757                 end match\r
758         end if\r
759 end macro\r
761 macro CSEG? @\r
762         if DSEG?.open\r
763                 DSEG?.$ = $\r
764                 end virtual\r
765                 DSEG?.open = 0\r
766         end if\r
767         match =AT? addr, @\r
768                 org addr\r
769         else match any, @\r
770                 err 'invalid argument'\r
771         end match\r
772 end macro\r
774 macro bitslabel definition\r
775         match name =at? address, definition\r
776                 label name at address\r
777                 repeat 8, i:0\r
778                         label name.i at address+i\r
779                 end repeat\r
780         else\r
781                 err 'syntax error'\r
782         end match\r
783 end macro\r
785 ; Data addresses:\r
787 bitslabel P0    at 080h\r
788 bitslabel SP    at 081h\r
789 bitslabel DPL   at 082h\r
790 bitslabel DPH   at 083h\r
791 bitslabel PCON  at 087h\r
792 bitslabel TCON  at 088h\r
793 bitslabel TMOD  at 089h\r
794 bitslabel TL0   at 08Ah\r
795 bitslabel TL1   at 08Bh\r
796 bitslabel TH0   at 08Ch\r
797 bitslabel TH1   at 08Dh\r
798 bitslabel P1    at 090h\r
799 bitslabel SCON  at 098h\r
800 bitslabel SBUF  at 099h\r
801 bitslabel P2    at 0A0h\r
802 bitslabel IE    at 0A8h\r
803 bitslabel P3    at 0B0h\r
804 bitslabel IP    at 0B8h\r
805 bitslabel PSW   at 0D0h\r
806 bitslabel ACC   at 0E0h\r
807 bitslabel B     at 0F0h\r
809 ; Bit addresses:\r
811 label IT0       at 088h\r
812 label IE0       at 089h\r
813 label IT1       at 08Ah\r
814 label IE1       at 08Bh\r
815 label TR0       at 08Ch\r
816 label TF0       at 08Dh\r
817 label TR1       at 08Eh\r
818 label TF1       at 08Fh\r
819 label RI        at 098h\r
820 label TI        at 099h\r
821 label RB8       at 09Ah\r
822 label TB8       at 09Bh\r
823 label REN       at 09Ch\r
824 label SM2       at 09Dh\r
825 label SM1       at 09Eh\r
826 label SM0       at 09Fh\r
827 label EX0       at 0A8h\r
828 label ET0       at 0A9h\r
829 label EX1       at 0AAh\r
830 label ET1       at 0ABh\r
831 label ES        at 0ACh\r
832 label EA        at 0AFh\r
833 label RXD       at 0B0h\r
834 label TXD       at 0B1h\r
835 label INT0      at 0B2h\r
836 label INT1      at 0B3h\r
837 label T0        at 0B4h\r
838 label T1        at 0B5h\r
839 label WR        at 0B6h\r
840 label RD        at 0B7h\r
841 label PX0       at 0B8h\r
842 label PT0       at 0B9h\r
843 label PX1       at 0BAh\r
844 label PT1       at 0BBh\r
845 label PS        at 0BCh\r
846 label P         at 0D0h\r
847 label OV        at 0D2h\r
848 label RS0       at 0D3h\r
849 label RS1       at 0D4h\r
850 label F0        at 0D5h\r
851 label AC        at 0D6h\r
852 label CY        at 0D7h\r
854 ; Code addresses:\r
856 label RESET     at 000h\r
857 label EXTI0     at 003h\r
858 label TIMER0    at 00Bh\r
859 label EXTI1     at 013h\r
860 label TIMER1    at 01Bh\r
861 label SINT      at 023h\r