Commit | Line | Data |
---|---|---|
a63d483c ML |
1 | /* Copyright (c) 1982 Regents of the University of California */ |
2 | ||
550fe947 | 3 | static char sccsid[] = "@(#)asm.c 1.2 %G%"; |
a63d483c ML |
4 | |
5 | /* | |
6 | * Assembly language dependent symbol routines. | |
7 | */ | |
8 | ||
9 | #include "defs.h" | |
10 | #include "symbols.h" | |
11 | #include "asm.h" | |
12 | #include "languages.h" | |
13 | #include "tree.h" | |
14 | #include "eval.h" | |
15 | #include "operators.h" | |
16 | #include "mappings.h" | |
17 | #include "process.h" | |
18 | #include "runtime.h" | |
19 | #include "machine.h" | |
20 | ||
21 | #define isdouble(range) ( \ | |
22 | range->symvalue.rangev.upper == 0 and range->symvalue.rangev.lower > 0 \ | |
23 | ) | |
24 | ||
25 | /* | |
26 | * Initialize assembly language information. | |
27 | */ | |
28 | ||
29 | public asm_init() | |
30 | { | |
31 | Language lang; | |
32 | ||
33 | lang = language_define("assembler", ".s"); | |
34 | language_setop(lang, L_PRINTDECL, asm_printdecl); | |
35 | language_setop(lang, L_PRINTVAL, asm_printval); | |
36 | language_setop(lang, L_TYPEMATCH, asm_typematch); | |
37 | } | |
38 | ||
39 | /* | |
40 | * Test if two types are compatible. | |
41 | */ | |
42 | ||
43 | public Boolean asm_typematch(type1, type2) | |
44 | Symbol type1, type2; | |
45 | { | |
46 | Boolean b; | |
47 | ||
48 | b = false; | |
49 | return b; | |
50 | } | |
51 | ||
52 | public asm_printdecl(s) | |
53 | Symbol s; | |
54 | { | |
55 | switch (s->class) { | |
56 | case VAR: | |
57 | case REF: | |
58 | printf("&%s = 0x%x", symname(s), s->symvalue.offset); | |
59 | break; | |
60 | ||
61 | case PROC: | |
62 | case FUNC: | |
63 | printf("%s (0x%x):", symname(s), codeloc(s)); | |
64 | break; | |
65 | ||
66 | default: | |
67 | error("class %s in c_printdecl", classname(s)); | |
68 | } | |
69 | putchar('\n'); | |
70 | } | |
71 | ||
72 | /* | |
73 | * Print out the value on the top of the expression stack | |
74 | * in the format for the type of the given symbol. | |
75 | */ | |
76 | ||
77 | public asm_printval(s) | |
78 | register Symbol s; | |
79 | { | |
80 | register Symbol t; | |
81 | register Integer len; | |
82 | ||
83 | switch (s->class) { | |
84 | case ARRAY: | |
85 | t = rtype(s->type); | |
86 | if (t->class == RANGE and istypename(t->type, "$char")) { | |
87 | len = size(s); | |
88 | sp -= len; | |
89 | printf("\"%.*s\"", len, sp); | |
90 | } else { | |
91 | printarray(s); | |
92 | } | |
93 | break; | |
94 | ||
95 | default: | |
96 | printf("0x%x", pop(Integer)); | |
97 | break; | |
98 | } | |
99 | } |