1 /*
2 	Copyright (C) 2018  Clipsey
3 
4 	This program is free software; you can redistribute it and/or
5 	modify it under the terms of the GNU General Public License
6 	as published by the Free Software Foundation; either version 2
7 	of the License, or (at your option) any later version.
8 
9 	This program is distributed in the hope that it will be useful,
10 	but WITHOUT ANY WARRANTY; without even the implied warranty of
11 	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12 	GNU General Public License for more details.
13 
14 	You should have received a copy of the GNU General Public License
15 	along with this program; if not, write to the Free Software
16 	Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
17 */
18 module criscfe;
19 import crisc;
20 import std.stdio;
21 import std..string;
22 import std.array;
23 import std.conv;
24 import std.file;
25 import std.algorithm;
26 
27 enum licenseTextHeader = "CRISC ASM v. 1.0, Copyright (C) 2018 Clipsey
28 CRISC ASM is licensed under the GPLv2 license.
29 Run with -co for details.
30 ";
31 
32 enum licenseTextHeaderExec = "CRISC EXEC v. 1.0, Copyright (C) 2018 Clipsey
33 CRISC EXEC is licensed under the GPLv2 license.
34 Run with -co for details.
35 ";
36 
37 enum licenseText = "Copyright (C) 2018  Clipsey
38 
39 This program is free software; you can redistribute it and/or
40 modify it under the terms of the GNU General Public License
41 as published by the Free Software Foundation; either version 2
42 of the License, or (at your option) any later version.
43 
44 This program is distributed in the hope that it will be useful,
45 but WITHOUT ANY WARRANTY; without even the implied warranty of
46 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
47 GNU General Public License for more details.
48 
49 You should have received a copy of the GNU General Public License
50 along with this program; if not, write to the Free Software
51 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
52 ";
53 
54 class SysCallPrtC : SysCall {
55 
56 	this() {
57 		super("prtc");
58 	}
59 
60 	this(CPU valueptr) {
61 		super("prtc", valueptr);
62 	}
63 
64 	public override void execute() {
65 		version(CPU) {
66 			char c = cast(char)valueptr.pop();
67 			import std.stdio;
68 			write(c);
69 		}
70 	}
71 }
72 
73 void main(string[] args)
74 {
75 	version(CPU) {
76 		if (args.length <= 1) {
77 			writeln(licenseTextHeaderExec);
78 			writeln("Usage
79 \tcriscexec <file>");
80 			return;
81 		}
82 		if (args[1] == "--copyright" || args[1] == "-co") {
83 			writeln(licenseText);
84 			return;
85 		}
86 		auto processor = new CPU(cast(ubyte[])read(args[1]), 32, 512);
87 		processor.PushSyscalls([
88 			new SysCallPrtC(processor)]
89 		);
90 		while (processor.running) {
91 			processor.runCycle();   
92 		}
93 	}
94 
95 	version (ASM) {
96 		bool verbose = false;
97 		bool link = false;
98 		bool conv = false;
99 
100 		string linkTmp = "";
101 		string firstFile = "";
102 		string outFile = "";
103 
104 		writeln(licenseTextHeader);
105 
106 		foreach (file; args[1..$]) {
107 			if (file.startsWith("-")) {
108 				if (file == "--verbose" || file == "-v") {
109 					verbose = true;
110 				}
111 				if (file == "--link" || file == "-l") {
112 					link = true;
113 				}
114 				if (file == "--copyright" || file == "-co") {
115 					writeln(licenseText);
116 					return;
117 				}
118 				if (file == "--conv" || file == "-c") {
119 					conv = true;
120 				}
121 			} else {
122 				if (firstFile == "") firstFile = file;
123 				if (link) {
124 					linkTmp ~= "\n"~readText(file);
125 				} else {
126 					outFile = file[0..$-3]~"bin";
127 					File output = File(outFile, "w");
128 					auto compiler = new Compiler(true, [new SysCallPrtC()]);
129 					output.rawWrite(compiler.compile(readText(file)));
130 					if (verbose) compiler.printLabels();
131 					output.close();
132 				}
133 			}
134 		}
135 
136 		if (link) {
137 			outFile  = firstFile[0..$-3]~"bin";
138 			File output = File(outFile, "w");
139 			auto compiler = new Compiler(true, [new SysCallPrtC()]);
140 			output.rawWrite(compiler.compile(linkTmp));
141 			if (verbose) compiler.printLabels();
142 			output.close();
143 		}
144 		
145 		if (conv) 
146 			writeln(binToASMDESC(cast(ubyte[])read(outFile)));
147 
148 		if (args.length <= 1) {
149 			writeln("Usage
150 criscasm (flags) <files>
151 Flags
152 \t--verbose/-v       | Verbose mode
153 \t--link/-l          | Link asm files together (output will be named after the first file)
154 \t--conv/-c          | Assemble and view human-readable conversion of assembly
155 \t--copyright/-co    | View license.");
156 		}
157 	}
158 }