summaryrefslogtreecommitdiff
path: root/crenshaw
diff options
context:
space:
mode:
authorAndreas Baumann <mail@andreasbaumann.cc>2018-08-17 15:13:51 +0200
committerAndreas Baumann <mail@andreasbaumann.cc>2018-08-17 15:13:51 +0200
commita92040828b10dee6e699417742fd40733439c11b (patch)
tree7b31ac440c5dcab166debf7af8a6a9532d0f7aca /crenshaw
parentef905e956911d0010532ee8348c144474ce8f1d6 (diff)
downloadcompilertests-a92040828b10dee6e699417742fd40733439c11b.tar.gz
compilertests-a92040828b10dee6e699417742fd40733439c11b.tar.bz2
crenshaw: separea function and variable code emitition, arange code before data section
Diffstat (limited to 'crenshaw')
-rw-r--r--crenshaw/main.pas27
1 files changed, 18 insertions, 9 deletions
diff --git a/crenshaw/main.pas b/crenshaw/main.pas
index 74999f1..339484c 100644
--- a/crenshaw/main.pas
+++ b/crenshaw/main.pas
@@ -1,6 +1,8 @@
program Main;
-const TAB = ^I;
+const
+ TAB = ^I;
+ CR = ^M;
var Look : char;
@@ -218,18 +220,24 @@ begin
}
end;
+procedure Functions;
+var i : integer;
+begin
+ for i := 0 to nof_symbols-1 do begin
+ if symbols[i].sym_type = FunctionType then begin
+ EmitLabel(symbols[i].name);
+ EmitLn('ret');
+ end;
+ end;
+end;
+
procedure Variables;
var i : integer;
begin
for i := 0 to nof_symbols-1 do begin
- EmitLabel(symbols[i].name);
- case symbols[i].sym_type of
- VariableType: begin
- EmitLn('dw 0');
- end;
- FunctionType: begin
- EmitLn('ret');
- end;
+ if symbols[i].sym_type = VariableType then begin
+ EmitLabel(symbols[i].name);
+ EmitLn('dw 0');
end;
end;
end;
@@ -237,6 +245,7 @@ end;
procedure Epilogue;
begin
EmitLn('hlt');
+ Functions;
Variables;
{
EmitLn('leave');