summaryrefslogtreecommitdiff
path: root/04b/in04b
diff options
context:
space:
mode:
Diffstat (limited to '04b/in04b')
-rw-r--r--04b/in04b96
1 files changed, 96 insertions, 0 deletions
diff --git a/04b/in04b b/04b/in04b
new file mode 100644
index 0000000..f312b54
--- /dev/null
+++ b/04b/in04b
@@ -0,0 +1,96 @@
+; types: char, short, int, long, *type
+; declaration:
+; global <type> <name>
+; local <type> <name>
+; :<label>
+; statement:
+; <declaration>
+; if <term> <==/</>/>=/<=/!=> <term> goto <label> NOTE: this uses signed comparisons
+; goto <label>
+; <lvalue> = <rvalue>
+; <lvalue> += <rvalue>
+; <lvalue> -= <rvalue>
+; <function>(<term>, <term>, ...)
+; syscall(<term>, <term>, ...)
+; return <rvalue>
+; byte <number>
+; 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>
+; NOTE: *, /, % are signed (imul and idiv)
+; <term> * <term>
+; <term> / <term>
+; <term> % <term>
+; <term> & <term>
+; <term> | <term>
+; <term> ^ <term>
+; <term> < <term> (left shift)
+; <term> > <term> (unsigned right shift)
+
+main() ; hello
+
+global char x
+global short y ;123
+global long z
+
+function strlen(*char s)
+ local long 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 long 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]