diff options
-rw-r--r-- | 04a/Makefile | 7 | ||||
-rw-r--r-- | 04a/in03 | 74 | ||||
-rw-r--r-- | 04a/in04a | 3 | ||||
-rw-r--r-- | 04b/Makefile | 7 | ||||
-rw-r--r-- | 04b/in04 | 95 | ||||
-rw-r--r-- | Makefile | 4 |
6 files changed, 190 insertions, 0 deletions
diff --git a/04a/Makefile b/04a/Makefile new file mode 100644 index 0000000..e6187d4 --- /dev/null +++ b/04a/Makefile @@ -0,0 +1,7 @@ +all: out03 +out03: in03 ../03/out02 + ../03/out02 +%.html: %.md ../markdown + ../markdown $< +clean: + rm -f out* README.html diff --git a/04a/in03 b/04a/in03 new file mode 100644 index 0000000..acd18ab --- /dev/null +++ b/04a/in03 @@ -0,0 +1,74 @@ +I=8S +A=d3 +?I!A:usage_error +; open input file + J=S + ; argv[1] is at *(rsp+16) + J+=d16 + J=8J + I=d0 + syscall x2 + J=A + ?J<0:input_file_error +; open output file + J=S + ; argv[2] is at *(rsp+24) + J+=d24 + J=8J + I=x241 + D=x1ed + syscall x2 + J=A + ?J<0:output_file_error +J=d0 +syscall x3c + +:usage_error + B=:usage_error_message + call :error + +:usage_error_message + str Please provide an input and an output file. + xa + x0 + +:input_file_error + B=:input_file_error_message + !:error + +:input_file_error_message + str Couldn't open input file. + xa + x0 + +:output_file_error + B=:output_file_error_message + !:error + +:output_file_error_message + str Couldn't open output file. + xa + x0 + +:error + J=B + call :strlen + D=A + I=J + J=d2 + syscall x1 + J=d1 + syscall x3c + +:strlen + I=B + D=B + :strlen_loop + C=1I + ?C=0:strlen_ret + I+=d1 + !:strlen_loop + :strlen_ret + I-=D + A=I + return diff --git a/04a/in04a b/04a/in04a new file mode 100644 index 0000000..c08c184 --- /dev/null +++ b/04a/in04a @@ -0,0 +1,3 @@ +#define A 777 +#define B 226 +A+B diff --git a/04b/Makefile b/04b/Makefile new file mode 100644 index 0000000..e6187d4 --- /dev/null +++ b/04b/Makefile @@ -0,0 +1,7 @@ +all: out03 +out03: in03 ../03/out02 + ../03/out02 +%.html: %.md ../markdown + ../markdown $< +clean: + rm -f out* README.html diff --git a/04b/in04 b/04b/in04 new file mode 100644 index 0000000..1b362ad --- /dev/null +++ b/04b/in04 @@ -0,0 +1,95 @@ +// types: char, uchar, short, ushort, int, uint, long, ulong, *type +// declaration: +// static <type> <name>; +// local <type> <name>; +// :<label> +// statement: +// <declaration> +// if <term> <==/</>/>=/<=/!=> <term> goto <label> +// goto <label> +// <lvalue> = <rvalue> +// <lvalue> += <rvalue> +// <lvalue> -= <rvalue> +// <function>(<term>, <term>, ...) +// syscall(<term>, <term>, ...) +// return <rvalue>; +// term: +// <var> +// <number> +// number: +// 'c +// 12345 +// 0xabc +// lvalue: +// <var> +// *<var> +// <var>[<term>] +// rvalue: +// `<string>` +// <var> +// &<var> +// *<var> +// <var>[<term>] +// ~<var> +// <function>(<term>, <term>, ...) +// syscall(<term>, <term>, ...) +// <term> + <term> +// <term> - <term> +// <term> * <term> +// <term> / <term> +// <term> % <term> +// <term> & <term> +// <term> | <term> +// <term> ^ <term> +// <term> < <term> (left shift) +// <term> > <term> (right shift) +// (<term> ] <term>) + +main(); + +static char x; +static uchar y; +static long z; + +function strlen(*char s) + local ulong len; + local char c; + len = 0; + :strlen.loop + c = s[len]; + if c == 0 goto strlen.loop_end; + len += 1; + goto strlen.loop + :strlen.loop_end + return len; + +function putc(char c) + local char *p; + p = &c; + syscall(1, 1, p, 1, 0, 0, 0, 0); + return; + +function puts(*char s) + local ulong len; + len = strlen(s); + syscall(1, 1, s, len, 0, 0, 0, 0); + return; + +function main() + local *char hello; + hello = `Hello, world! +`; + puts(hello); + syscall(0x3c, 0, 0, 0, 0, 0, 0, 0); + +function f(*long x, **long y) + local long v; + local *long p; + v = *x; + p = *y; + *p = v; + if v == 0 goto something; + p[1] = v + 1; + return p[2]; + :something + return p[1]; @@ -3,11 +3,15 @@ all: markdown README.html $(MAKE) -C 01 $(MAKE) -C 02 $(MAKE) -C 03 + $(MAKE) -C 04a + $(MAKE) -C 04b clean: $(MAKE) -C 00 clean $(MAKE) -C 01 clean $(MAKE) -C 02 clean $(MAKE) -C 03 clean + $(MAKE) -C 04a clean + $(MAKE) -C 04b clean rm -f markdown rm -f README.html markdown: markdown.c |