summaryrefslogtreecommitdiff
path: root/04b
diff options
context:
space:
mode:
Diffstat (limited to '04b')
-rw-r--r--04b/in0315
-rw-r--r--04b/in04b57
2 files changed, 34 insertions, 38 deletions
diff --git a/04b/in03 b/04b/in03
index 38b45e3..f9da689 100644
--- a/04b/in03
+++ b/04b/in03
@@ -243,7 +243,6 @@ align
reserve d8
:handle_global
- xcc
; ignore if this is the second pass
C=:second_pass
C=1C
@@ -262,6 +261,7 @@ align
8C=I
J=:global_variables
D=d5
+
call :ident_lookup
C=A
?C!0:global_redeclaration
@@ -458,17 +458,15 @@ align
; look up identifier rsi in list rdi with separation rdx between entries
; returns address of whatever's right after the identifier in the list, or 0 if not found
:ident_lookup
- C=:second_pass
- C=1C
- ; use default of 1 on first pass
- ?C=0:return_1
-
C=:ident_lookup_sep
8C=D
C=:ident_lookup_i
8C=I
:ident_lookup_loop
+ ; check if reached the end of the table
+ C=1J
+ ?C=0:return_0
I=:ident_lookup_i
I=8I
call :ident=
@@ -485,9 +483,6 @@ align
C=:ident_lookup_sep
C=8C
J+=C
- ; check if reached the end of the table
- C=1J
- ?C=0:return_0
!:ident_lookup_loop
; can the character in rbx appear in an identifier?
@@ -525,8 +520,8 @@ align
; variable
J=:local_variables
- D=d5
xcc
+ D=d5
call :ident_lookup
C=A
?C=0:rax2term_try_global
diff --git a/04b/in04b b/04b/in04b
index a6e76b9..4a1e7e3 100644
--- a/04b/in04b
+++ b/04b/in04b
@@ -1,4 +1,3 @@
-; types: char, short, int, long, *type
; declaration:
; global <type> <name>
; local <type> <name>
@@ -11,7 +10,7 @@
; <lvalue> += <rvalue>
; <lvalue> -= <rvalue>
; <function>(<term>, <term>, ...)
-; syscall <term>, <term>, ...
+; syscall <term> <term> ...
; return <rvalue>
; byte <number>
; term:
@@ -29,7 +28,7 @@
; `<string>`
; <var>
; &<var>
-; *<var>
+; *1 <var> / *2 <var> / *4 <var> / *8 <var>
; <var>[<term>]
; ~<var>
; <function>(<term>, <term>, ...)
@@ -48,18 +47,20 @@
main() ; hello
-global char x
-global short y ;123
-global long z
+global x
+global y ;123
+global z
:strlen
function
- argument *char s
- local long len
- local char c
+ argument s
+ local len
+ local c
+ local p
len = 0
:strlen_loop
- c = s[len]
+ p = s + len
+ c = *1 p
if c == 0 goto strlen_loop_end
len += 1
goto strlen_loop
@@ -68,40 +69,40 @@ function
:putc
function
- argument char c
- local *char p
+ argument c
+ local p
p = &c
- syscall 1, 1, p, 1, 0, 0, 0, 0
+ syscall 1 1 p 1 0 0 0 0
return
:puts
function
- argument *char s
- local long len
+ argument s
+ local len
len = strlen(s)
- syscall 1, 1, s, len, 0, 0, 0, 0
+ syscall 1 1 s len 0 0 0 0
return
:main
function
- local *char hello
+ local hello
hello = `Hello, world!
`
puts(hello)
- syscall 0x3c, 0, 0, 0, 0, 0, 0, 0
+ syscall 0x3c 0 0 0 0 0 0 0
:f
function
- argument *long x
- argument *long y
- local long v
- local *long p
- v = *x
- p = *y
- *p = v
+ argument x
+ argument y
+ local v
+ local p
+ v = *4x
+ p = *8y
+ *4p = v
if v == 0 goto something
- p[1] = v + 1
- return p[2]
+ *1p = v + 1
+ return *2p
:something
- return p[1]
+ return *4p