summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEugen Wissner <belka@caraus.de>2025-05-12 00:06:02 +0200
committerEugen Wissner <belka@caraus.de>2025-05-12 00:06:02 +0200
commitd85183c7a6842a4db83635c64cf85ddf37491971 (patch)
treee792f636b8545c215a1cdc29490dc8d74de5edba
parent707f983fe96e4ad9bf89b07a0b4e88465c7d111f (diff)
downloadelna-d85183c7a6842a4db83635c64cf85ddf37491971.tar.gz
Support named identifiers on the right side
-rw-r--r--boot/common-boot.s118
-rw-r--r--boot/stage1.s659
-rw-r--r--boot/stage2.elna519
-rw-r--r--boot/test.elna11
4 files changed, 720 insertions, 587 deletions
diff --git a/boot/common-boot.s b/boot/common-boot.s
index ad57b41..0c2ef6b 100644
--- a/boot/common-boot.s
+++ b/boot/common-boot.s
@@ -3,7 +3,7 @@
# obtain one at https://mozilla.org/MPL/2.0/.
.global _is_alpha, _is_digit, _is_alnum, _is_upper, _is_lower
-.global _write_out, _read_file, _write_error, _put_char, _printi
+.global _write_s, _read_file, _write_error, _write_c, _write_i, _print_i
.global _get, _memcmp, _memchr, _memmem, _memcpy
.global _divide_by_zero_error, _exit, _mmap
.global _strings_index, _string_equal
@@ -175,16 +175,20 @@ _is_alnum:
addi sp, sp, 16
ret
-.type _write_out, @function
-_write_out:
+# Writes a string to the standard output.
+#
+# Parameters:
+# a0 - Length of the string.
+# a1 - String pointer.
+.type _write_s, @function
+_write_s:
# Prologue.
addi sp, sp, -8
sw ra, 4(sp)
sw s0, 0(sp)
addi s0, sp, 8
- mv a2, a1
- mv a1, a0
+ mv a2, a0
li a0, STDOUT
li a7, SYS_WRITE
ecall
@@ -244,53 +248,87 @@ _divide_by_zero_error:
ecall
ret
-# a0 - Whole number.
+# Writes a number to a string buffer.
+#
+# t0 - Local buffer.
# t1 - Constant 10.
-# a1 - Local buffer.
# t2 - Current character.
# t3 - Whether the number is negative.
-.type printi, @function
-_printi:
- addi sp, sp, -16
- sw s0, 0(sp)
- sw ra, 4(sp)
- addi s0, sp, 16
- addi t1, zero, 10
- addi a1, s0, -1
-
- addi t3, zero, 0
- bge a0, zero, .digit10
- addi t3, zero, 1
- sub a0, zero, a0
-
-.digit10:
+#
+# Parameters:
+# a0 - Whole number.
+# a1 - Buffer pointer.
+#
+# Sets a0 to the length of the written number.
+.type _print_i, @function
+_print_i:
+ addi sp, sp, -32
+ sw ra, 28(sp)
+ sw s0, 24(sp)
+ addi s0, sp, 32
+
+ li t1, 10
+ addi t0, s0, -9
+
+ li t3, 0
+ bgez a0, .Lprint_i_digit10
+ li t3, 1
+ neg a0, a0
+
+.Lprint_i_digit10:
rem t2, a0, t1
addi t2, t2, '0'
- sb t2, 0(a1)
+ sb t2, 0(t0)
div a0, a0, t1
- addi a1, a1, -1
- bne zero, a0, .digit10
+ addi t0, t0, -1
+ bne zero, a0, .Lprint_i_digit10
- beq zero, t3, .write_call
+ beq zero, t3, .Lprint_i_write_call
addi t2, zero, '-'
- sb t2, 0(a1)
- addi a1, a1, -1
-
-.write_call:
- addi a0, zero, 1
- addi a1, a1, 1
- sub a2, s0, a1
- addi a7, zero, 64 # write
- ecall
+ sb t2, 0(t0)
+ addi t0, t0, -1
- lw s0, 0(sp)
- lw ra, 4(sp)
- addi sp, sp, 16
+.Lprint_i_write_call:
+ mv a0, a1
+ addi a1, t0, 1
+ sub a2, s0, t0
+ addi a2, a2, -9
+ sw a2, 0(sp)
+
+ call _memcpy
+
+ lw a0, 0(sp)
+
+ lw ra, 28(sp)
+ lw s0, 24(sp)
+ addi sp, sp, 32
+ ret
+
+# Writes a number to the standard output.
+#
+# Parameters:
+# a0 - Whole number.
+.type _write_i, @function
+_write_i:
+ addi sp, sp, -32
+ sw ra, 28(sp)
+ sw s0, 24(sp)
+ addi s0, sp, 32
+
+ addi a1, sp, 0
+ call _print_i
+
+ addi a1, sp, 0
+ call _write_s
+
+ lw ra, 28(sp)
+ lw s0, 24(sp)
+ addi sp, sp, 32
ret
# Writes a character from a0 into the standard output.
-.type _put_char, @function
-_put_char:
+.type _write_c, @function
+_write_c:
# Prologue
addi sp, sp, -16
sw ra, 12(sp)
diff --git a/boot/stage1.s b/boot/stage1.s
index d957af2..8258075 100644
--- a/boot/stage1.s
+++ b/boot/stage1.s
@@ -123,7 +123,7 @@ compile_binary_expression:
addi s0, sp, 32
li a0, 0
- call _build_expression
+ call compile_expression
mv a0, s1
addi a1, sp, 12
@@ -153,64 +153,64 @@ compile_binary_expression:
.Lcompile_binary_expression_equal:
mv s1, a0 # Skip =.
li a0, 1
- call _build_expression
- la a0, asm_sub_a0_a1
- li a1, ASM_SUB_A0_A1_SIZE
- call _write_out
+ call compile_expression
+ li a0, ASM_SUB_A0_A1_SIZE
+ la a1, asm_sub_a0_a1
+ call _write_s
- la a0, asm_seqz_a0
- li a1, ASM_SEQZ_A0_SIZE
- call _write_out
+ li a0, ASM_SEQZ_A0_SIZE
+ la a1, asm_seqz_a0
+ call _write_s
j .Lcompile_binary_expression_end
.Lcompile_binary_expression_and:
mv s1, a0 # Skip &.
li a0, 1
- call _build_expression
- la a0, asm_and_a0_a1
- li a1, ASM_AND_A0_A1_SIZE
- call _write_out
+ call compile_expression
+ li a0, ASM_AND_A0_A1_SIZE
+ la a1, asm_and_a0_a1
+ call _write_s
j .Lcompile_binary_expression_end
.Lcompile_binary_expression_or:
mv s1, a0 # Skip or.
li a0, 1
- call _build_expression
- la a0, asm_or_a0_a1
- li a1, ASM_OR_A0_A1_SIZE
- call _write_out
+ call compile_expression
+ li a0, ASM_OR_A0_A1_SIZE
+ la a1, asm_or_a0_a1
+ call _write_s
j .Lcompile_binary_expression_end
.Lcompile_binary_expression_plus:
mv s1, a0 # Skip +.
li a0, 1
- call _build_expression
- la a0, asm_add_a0_a1
- li a1, ASM_ADD_A0_A1_SIZE
- call _write_out
+ call compile_expression
+ li a0, ASM_ADD_A0_A1_SIZE
+ la a1, asm_add_a0_a1
+ call _write_s
j .Lcompile_binary_expression_end
.Lcompile_binary_expression_minus:
mv s1, a0 # Skip -.
li a0, 1
- call _build_expression
- la a0, asm_sub_a0_a1
- li a1, ASM_SUB_A0_A1_SIZE
- call _write_out
+ call compile_expression
+ li a0, ASM_SUB_A0_A1_SIZE
+ la a1, asm_sub_a0_a1
+ call _write_s
j .Lcompile_binary_expression_end
.Lcompile_binary_expression_product:
mv s1, a0 # Skip *.
li a0, 1
- call _build_expression
- la a0, asm_mul_a0_a1
- li a1, ASM_MUL_A0_A1_SIZE
- call _write_out
+ call compile_expression
+ li a0, ASM_MUL_A0_A1_SIZE
+ la a1, asm_mul_a0_a1
+ call _write_s
j .Lcompile_binary_expression_end
@@ -295,19 +295,21 @@ compile_identifier_expression:
call symbol_table_find
sw a0, 12(sp)
- mv a0, s1
- lw a1, 20(sp)
- call is_local_identifier
- bnez a0, .Lcompile_identifier_expression_local
+ beqz a0, .Lcompile_identifier_expression_by_name
+ lw t0, 0(a0)
+
+ li t1, INFO_PARAMETER
+ beq t0, t1, .Lcompile_identifier_expression_parameter
+ li t1, INFO_LOCAL
+ beq t0, t1, .Lcompile_identifier_expression_local
+
+.Lcompile_identifier_expression_by_name:
mv a0, s1
lw a1, 20(sp)
call is_register_identifier
bnez a0, .Lcompile_identifier_expression_saved
- lw t0, 12(sp)
- bnez t0, .Lcompile_identifier_expression_defined
-
# Global identifier.
lw t1, 16(sp)
li t0, 0x00202c00 # \0,_
@@ -315,16 +317,16 @@ compile_identifier_expression:
sw t0, 8(sp)
li t0, 0x6120616c # la a
sw t0, 4(sp)
- addi a0, sp, 4
- li a1, 7
- call _write_out
+ li a0, 7
+ addi a1, sp, 4
+ call _write_s
- mv a0, s1
- lw a1, 20(sp)
- call _write_out
+ lw a0, 20(sp)
+ mv a1, s1
+ call _write_s
li a0, '\n'
- call _put_char
+ call _write_c
lbu a0, (s1)
call _is_upper
@@ -340,86 +342,83 @@ compile_identifier_expression:
sw t0, 4(sp)
li t0, 0x6120776c # lw a
sw t0, 0(sp)
- addi a0, sp, 0
- li a1, 12
- call _write_out
+ li a0, 12
+ addi a1, sp, 0
+ call _write_s
j .Lcompile_identifier_expression_end
-.Lcompile_identifier_expression_defined:
+.Lcompile_identifier_expression_parameter:
lw t1, 16(sp)
li t0, 0x00202c00 # \0,_
or t0, t0, t1
sw t0, 8(sp)
li t0, 0x6120776c # lw a
sw t0, 4(sp)
- addi a0, sp, 4
- li a1, 7
- call _write_out
+ li a0, 7
+ addi a1, sp, 4
+ call _write_s
lw a0, 12(sp)
lw a0, 8(a0)
- call _printi
+ call _write_i
- li t0, 0x29707328 # (sp)
+ li t0, 0x29307328 # (s0)
sw t0, 8(sp)
- addi a0, sp, 8
- li a1, 4
- call _write_out
+ li a0, 4
+ addi a1, sp, 8
+ call _write_s
li a0, '\n'
- call _put_char
+ call _write_c
j .Lcompile_identifier_expression_end
-.Lcompile_identifier_expression_saved:
- li t0, 0x00202c00 # \0,_
+.Lcompile_identifier_expression_local:
lw t1, 16(sp)
+ li t0, 0x00202c00 # \0,_
or t0, t0, t1
sw t0, 8(sp)
- li t0, 0x6120766d # mv a
+ li t0, 0x6120776c # lw a
sw t0, 4(sp)
- addi a0, sp, 4
- li a1, 7
- call _write_out
+ li a0, 7
+ addi a1, sp, 4
+ call _write_s
- mv a0, s1
- lw a1, 20(sp)
- call _write_out
+ lw a0, 12(sp)
+ lw a0, 8(a0)
+ call _write_i
+ li t0, 0x29707328 # (sp)
+ sw t0, 8(sp)
+ li a0, 4
+ addi a1, sp, 8
+ call _write_s
li a0, '\n'
- call _put_char
+ call _write_c
j .Lcompile_identifier_expression_end
-.Lcompile_identifier_expression_local:
- lw t1, 16(sp)
+.Lcompile_identifier_expression_saved:
li t0, 0x00202c00 # \0,_
+ lw t1, 16(sp)
or t0, t0, t1
sw t0, 8(sp)
- li t0, 0x6120776c # lw a
+ li t0, 0x6120766d # mv a
sw t0, 4(sp)
- addi a0, sp, 4
- li a1, 7
- call _write_out
+ li a0, 7
+ addi a1, sp, 4
+ call _write_s
- mv a0, s1
- lw a1, 20(sp)
- addi a0, a0, 4 # Skip the "loca" variable prefix.
- addi a1, a1, -4 # Skip the "loca" variable prefix.
- call _write_out
+ lw a0, 20(sp)
+ mv a1, s1
+ call _write_s
- li t0, 0x29707328 # (sp)
- sw t0, 8(sp)
- addi a0, sp, 8
- li a1, 4
- call _write_out
li a0, '\n'
- call _put_char
+ call _write_c
j .Lcompile_identifier_expression_end
.Lcompile_identifier_expression_end:
-
# Epilogue.
lw ra, 28(sp)
lw s0, 24(sp)
@@ -429,8 +428,8 @@ compile_identifier_expression:
# Evalutes an expression and saves the result in a0.
#
# a0 - X in aX, the register number to save the result.
-.type _build_expression, @function
-_build_expression:
+.type compile_expression, @function
+compile_expression:
# Prologue.
addi sp, sp, -48
sw ra, 44(sp)
@@ -448,69 +447,47 @@ _build_expression:
lw a0, 24(sp)
li t0, TOKEN_MINUS
- beq a0, t0, .Lbuild_expression_negate
+ beq a0, t0, .Lcompile_expression_negate
li t0, TOKEN_AT
- beq a0, t0, .Lbuild_expression_address
+ beq a0, t0, .Lcompile_expression_address
li t0, TOKEN_INTEGER
- beq a0, t0, .Lbuild_expression_literal
+ beq a0, t0, .Lcompile_expression_literal
lw a0, 32(sp)
lbu a0, (a0)
li t0, '_'
- beq a0, t0, .Lbuild_expression_call
+ beq a0, t0, .Lcompile_expression_call
lw s1, 32(sp)
lw a0, 28(sp)
lw a1, 36(sp)
call compile_identifier_expression
- j .Lbuild_expression_advance
+ j .Lcompile_expression_advance
-.Lbuild_expression_negate:
+.Lcompile_expression_negate:
lw s1, 20(sp) # Skip the -.
mv a0, zero
- call _build_expression
+ call compile_expression
- la a0, asm_neg_a0
- li a1, ASM_NEG_A0_SIZE
- call _write_out
+ li a0, ASM_NEG_A0_SIZE
+ la a1, asm_neg_a0
+ call _write_s
- j .Lbuild_expression_end
+ j .Lcompile_expression_end
-.Lbuild_expression_address:
- lw t1, 36(sp)
- li t0, 0x20 # _
- sw t0, 16(sp)
- li t0, 0x2c707320 # _sp,
- sw t0, 12(sp)
- li t0, 0x2c006120 # _a\0,
- sw t0, 8(sp)
- sb t1, 10(sp)
- li t0, 0x69646461 # addi
- sw t0, 4(sp)
- addi a0, sp, 4
- li a1, 13
- call _write_out
-
- lw a0, 20(sp) # Skip @.
- addi a1, sp, 24
- call lex_next
- mv s1, a0
-
- lw a0, 32(sp)
- lw a1, 28(sp)
- addi a0, a0, 4 # Skip the "loca" variable prefix.
- addi a1, a1, -4 # Skip the "loca" variable prefix.
- call _write_out
+.Lcompile_expression_address:
+ lw a0, 20(sp)
+ mv s1, a0 # Skip @.
- li a0, '\n'
- call _put_char
+ lw a0, 36(sp)
+ call compile_at_expression
- j .Lbuild_expression_end
+ j .Lcompile_expression_end
-.Lbuild_expression_call:
+.Lcompile_expression_call:
lw a0, 20(sp)
addi a1, sp, 8
call lex_next
@@ -520,32 +497,140 @@ _build_expression:
lw a1, 28(sp)
call compile_call
- j .Lbuild_expression_end
+ j .Lcompile_expression_end
-.Lbuild_expression_literal:
+.Lcompile_expression_literal:
lw t1, 36(sp)
li t0, 0x00202c00 # \0,_
or t0, t0, t1
sw t0, 16(sp)
li t0, 0x6120696c # li a
sw t0, 12(sp)
- addi a0, sp, 12
- li a1, 7
- call _write_out
+ li a0, 7
+ addi a1, sp, 12
+ call _write_s
- lw a0, 32(sp)
- lw a1, 28(sp)
- call _write_out
+ lw a0, 28(sp)
+ lw a1, 32(sp)
+ call _write_s
li a0, '\n'
- call _put_char
+ call _write_c
- j .Lbuild_expression_advance
+ j .Lcompile_expression_advance
-.Lbuild_expression_advance:
+.Lcompile_expression_advance:
lw s1, 20(sp)
-.Lbuild_expression_end:
+.Lcompile_expression_end:
+ # Epilogue.
+ lw ra, 44(sp)
+ lw s0, 40(sp)
+ addi sp, sp, 48
+ ret
+
+# Expression taking an identifier address.
+#
+# Parameters:
+# a0 - Register number as character
+.type compile_at_expression, @function
+compile_at_expression:
+ # Prologue.
+ addi sp, sp, -48
+ sw ra, 44(sp)
+ sw s0, 40(sp)
+ addi s0, sp, 48
+
+ sw a0, 36(sp)
+
+ mv a0, s1
+ addi a1, sp, 24
+ call lex_next
+ mv s1, a0
+
+ lw a0, 28(sp)
+ lw a1, 32(sp)
+ call symbol_table_find
+ sw a0, 20(sp)
+ lw t0, 0(a0)
+
+ li t1, INFO_PARAMETER
+ beq t0, t1, .Lcompile_at_expression_parameter
+
+ li t1, INFO_LOCAL
+ beq t0, t1, .Lcompile_at_expression_local
+
+ unimp
+
+.Lcompile_at_expression_local:
+ lw a0, 36(sp)
+ li t0, 0x20 # _
+ sw t0, 16(sp)
+ li t0, 0x2c707320 # _sp,
+ sw t0, 12(sp)
+ li t0, 0x2c006120 # _a\0,
+ sw t0, 8(sp)
+ sb a0, 10(sp)
+ li t0, 0x69646461 # addi
+ sw t0, 4(sp)
+ li a0, 13
+ addi a1, sp, 4
+ call _write_s
+
+ lw a0, 20(sp)
+ lw a0, 8(a0)
+ call _write_i
+
+ j .Lcompile_at_expression_end
+
+.Lcompile_at_expression_parameter:
+ lw a0, 36(sp)
+ li t0, 0x20 # _
+ sw t0, 16(sp)
+ li t0, 0x2c307320 # _s0,
+ sw t0, 12(sp)
+ li t0, 0x2c006120 # _a\0,
+ sw t0, 8(sp)
+ sb a0, 10(sp)
+ li t0, 0x69646461 # addi
+ sw t0, 4(sp)
+ li a0, 13
+ addi a1, sp, 4
+ call _write_s
+
+ lw a0, 20(sp)
+ lw a0, 8(a0)
+ call _write_i
+
+ j .Lcompile_at_expression_end
+
+.Lcompile_at_expression_undefined:
+ lw a0, 36(sp)
+ li t0, 0x20 # _
+ sw t0, 16(sp)
+ li t0, 0x2c707320 # _sp,
+ sw t0, 12(sp)
+ li t0, 0x2c006120 # _a\0,
+ sw t0, 8(sp)
+ sb a0, 10(sp)
+ li t0, 0x69646461 # addi
+ sw t0, 4(sp)
+ li a0, 13
+ addi a1, sp, 4
+ call _write_s
+
+ lw a0, 32(sp)
+ lw a1, 28(sp)
+ addi a0, a1, -4 # Skip the "loca" variable prefix.
+ addi a1, a0, 4 # Skip the "loca" variable prefix.
+ call _write_s
+
+ j .Lcompile_at_expression_end
+
+.Lcompile_at_expression_end:
+ li a0, '\n'
+ call _write_c
+
# Epilogue.
lw ra, 44(sp)
lw s0, 40(sp)
@@ -583,49 +668,48 @@ compile_designator_expression:
sw t0, 12(sp)
li t0, 0x61207773 # sw a
sw t0, 8(sp)
- addi a0, sp, 8
- li a1, 7
- call _write_out
+ li a0, 7
+ addi a1, sp, 8
+ call _write_s
- lw a0, 20(sp)
- lw a1, 16(sp)
- addi a0, a0, 4 # Skip the "loca" variable prefix.
- addi a1, a1, -4 # Skip the "loca" variable prefix.
- call _write_out
+ lw a0, 16(sp)
+ lw a1, 20(sp)
+ addi a0, a0, -4 # Skip the "loca" variable prefix.
+ addi a1, a1, 4 # Skip the "loca" variable prefix.
+ call _write_s
li t0, '\n'
sw t0, 12(sp)
li t0, 0x29707328 # (sp)
sw t0, 8(sp)
- addi a0, sp, 8
- li a1, 5
- call _write_out
+ li a0, 5
+ addi a1, sp, 8
+ call _write_s
j .Lcompile_designator_expression_end
.Lcompile_designator_expression_saved:
li t0, 0x20766d # mv_
sw t0, 12(sp)
- addi a0, sp, 12
- li a1, 3
- call _write_out
+ li a0, 3
+ addi a1, sp, 12
+ call _write_s
- lw a0, 20(sp)
- lw a1, 16(sp)
- call _write_out
+ lw a0, 16(sp)
+ lw a1, 20(sp)
+ call _write_s
li t0, 0x0a # \n
sw t0, 12(sp)
li t0, 0x3061202c # , a0
sw t0, 8(sp)
- addi a0, sp, 8
- li a1, 5
- call _write_out
+ li a0, 5
+ addi a1, sp, 8
+ call _write_s
j .Lcompile_designator_expression_end
.Lcompile_designator_expression_end:
-
# Epilogue.
lw ra, 28(sp)
lw s0, 24(sp)
@@ -708,15 +792,15 @@ compile_call:
.Lcompile_call_argument:
li a0, 0
- call _build_expression
+ call compile_expression
li t0, 0x202c30 # 0,_
sw t0, 8(sp)
li t0, 0x61207773 # sw a
sw t0, 4(sp)
- addi a0, sp, 4
- li a1, 7
- call _write_out
+ li a0, 7
+ addi a1, sp, 4
+ call _write_s
lw t0, 12(sp) # Argument count for a procedure call.
@@ -725,15 +809,15 @@ compile_call:
li a0, -4
mul a0, t0, a0
addi a0, a0, 60
- call _printi
+ call _write_i
li t0, '\n'
sw t0, 8(sp)
li t0, 0x29707328 # (sp)
sw t0, 4(sp)
- addi a0, sp, 4
- li a1, 5
- call _write_out
+ li a0, 5
+ addi a1, sp, 4
+ call _write_s
lbu t0, (s1)
li t1, ','
@@ -752,25 +836,25 @@ compile_call:
.Lcompile_call_restore:
# Just go through all a0-a5 registers and read them from stack.
# If this stack value contains garbage, the procedure just shouldn't use it.
- la a0, asm_restore_parameters
- li a1, ASM_RESTORE_PARAMETERS_SIZE
- call _write_out
+ li a0, ASM_RESTORE_PARAMETERS_SIZE
+ la a1, asm_restore_parameters
+ call _write_s
.Lcompile_call_perform:
li t0, 0x20
sw t0, 8(sp)
li t0, 0x6c6c6163 # call
sw t0, 4(sp)
- addi a0, sp, 4
- li a1, 5
- call _write_out
+ li a0, 5
+ addi a1, sp, 4
+ call _write_s
- lw a0, 20(sp)
- lw a1, 16(sp)
- call _write_out
+ lw a0, 16(sp)
+ lw a1, 20(sp)
+ call _write_s
li a0, '\n'
- call _put_char
+ call _write_c
addi s1, s1, 1 # Skip the close paren.
@@ -816,9 +900,9 @@ compile_module_declaration:
sw s0, 16(sp)
addi s0, sp, 24
- la a0, global_start
- li a1, GLOBAL_START_SIZE
- call _write_out
+ li a0, GLOBAL_START_SIZE
+ la a1, global_start
+ call _write_s
# Skip "program".
mv a0, s1
@@ -848,9 +932,9 @@ compile_constant_section:
bne t0, t1, .Lcompile_constant_section_end
mv s1, a0
- la a0, section_rodata
- li a1, SECTION_RODATA_SIZE
- call _write_out
+ li a0, SECTION_RODATA_SIZE
+ la a1, section_rodata
+ call _write_s
.Lcompile_constant_section_item:
mv a0, s1
@@ -888,30 +972,30 @@ compile_constant:
call lex_next # Skip the assignment sign.
mv s1, a0
# Write identifier the identifier.
- lw a0, 20(sp)
- lw a1, 16(sp)
- call _write_out
+ lw a0, 16(sp)
+ lw a1, 20(sp)
+ call _write_s
# : .long
li t0, 0x20676e6f # ong_
sw t0, 4(sp)
li t0, 0x6c2e203a # : .l
sw t0, 0(sp)
- mv a0, sp
- li a1, 8
- call _write_out
+ li a0, 8
+ mv a1, sp
+ call _write_s
mv a0, s1
addi a1, sp, 12
call lex_next
mv s1, a0
- lw a0, 20(sp) # Save the literal pointer before advancing it.
- lw a1, 16(sp) # The literal length.
- call _write_out
+ lw a0, 16(sp) # The literal length.
+ lw a1, 20(sp) # Save the literal pointer before advancing it.
+ call _write_s
li a0, '\n'
- call _put_char
+ call _write_c
# Epilogue.
lw ra, 28(sp)
@@ -936,9 +1020,9 @@ compile_global_section:
bne t0, t1, .Lcompile_global_section_end
mv s1, a0
- la a0, section_bss
- li a1, SECTION_BSS_SIZE
- call _write_out
+ li a0, SECTION_BSS_SIZE
+ la a1, section_bss
+ call _write_s
.Lcompile_global_section_item:
mv a0, s1
@@ -987,37 +1071,37 @@ compile_global:
mv s1, a0
# .type identifier, @object
- la a0, asm_type
- li a1, ASM_TYPE_SIZE
- call _write_out
+ li a0, ASM_TYPE_SIZE
+ la a1, asm_type
+ call _write_s
- lw a0, 36(sp)
- lw a1, 32(sp)
- call _write_out
+ lw a0, 32(sp)
+ lw a1, 36(sp)
+ call _write_s
- la a0, asm_type_object
- li a1, ASM_TYPE_OBJECT_SIZE
- call _write_out
+ li a0, ASM_TYPE_OBJECT_SIZE
+ la a1, asm_type_object
+ call _write_s
# identifier: .zero size
- lw a0, 36(sp)
- lw a1, 32(sp)
- call _write_out
+ lw a0, 32(sp)
+ lw a1, 36(sp)
+ call _write_s
li t0, 0x206f7265 # ero_
sw t0, 12(sp)
li t0, 0x7a2e203a # : .z
sw t0, 8(sp)
- addi a0, sp, 8
- li a1, 8
- call _write_out
+ li a0, 8
+ addi a1, sp, 8
+ call _write_s
- lw a0, 24(sp)
- lw a1, 20(sp)
- call _write_out
+ lw a0, 20(sp)
+ lw a1, 24(sp)
+ call _write_s
li a0, '\n'
- call _put_char
+ call _write_c
# Epilogue.
lw ra, 44(sp)
@@ -1136,7 +1220,8 @@ compile_parameters:
sw s0, 40(sp)
addi s0, sp, 48
- sw zero, 12(sp) # Parameter offset counter.
+ li t0, -12
+ sw t0, 12(sp) # Parameter offset counter.
mv a0, s1
addi a1, sp, 28
@@ -1173,7 +1258,7 @@ compile_parameters:
call symbol_table_insert
lw t0, 12(sp)
- addi t0, t0, 4
+ addi t0, t0, -4
sw t0, 12(sp)
# Read the comma between the parameters or a closing paren.
@@ -1185,7 +1270,7 @@ compile_parameters:
li t1, TOKEN_COMMA
bne t0, t1, .Lcompile_parameters_end
# If it is a comma, read the name of the next parameter.
- addi a1, sp, 16
+ addi a1, sp, 28
call lex_next
mv s1, a0
@@ -1217,7 +1302,12 @@ compile_procedure:
lw a0, 16(sp)
lw a1, 20(sp)
- call _write_procedure_head
+ call write_procedure_head
+
+ /* DEBUG */
+ lw a0, 20(sp)
+ lw a1, 16(sp)
+ call _write_error
# Save the state of the symbol table before we enter the procedure scope.
la t0, symbol_table
@@ -1234,36 +1324,23 @@ compile_procedure:
mv s1, a0
# Generate the procedure prologue with a predefined stack size.
- la a0, prologue
- li a1, PROLOGUE_SIZE
- call _write_out
+ li a0, PROLOGUE_SIZE
+ la a1, prologue
+ call _write_s
# Save passed arguments on the stack.
- la a0, asm_preserve_parameters
- li a1, ASM_PRESERVE_PARAMETERS_SIZE
- call _write_out
+ li a0, ASM_PRESERVE_PARAMETERS_SIZE
+ la a1, asm_preserve_parameters
+ call _write_s
# Generate the body of the procedure.
call compile_statements
mv s1, a0 # Skip end.
# Generate the procedure epilogue with a predefined stack size.
- la a0, epilogue
- li a1, EPILOGUE_SIZE
- call _write_out
-
- /* DEBUG
- lw a0, 16(sp)
- lw a1, 20(sp)
- call symbol_table_find
- beqz a0, .x
-*/
- lw a0, 20(sp)
- lw a1, 16(sp)
- call _write_error
-
- call symbol_table_dump
- /* DEBUG */
+ li a0, EPILOGUE_SIZE
+ la a1, epilogue
+ call _write_s
# Restore the symbol table, removing symbols local to this procedure.
la t0, symbol_table
@@ -1296,16 +1373,16 @@ compile_goto:
li t0, 0x2e206a # j .
sw t0, 12(sp)
- addi a0, sp, 12
- li a1, 3
- call _write_out
+ li a0, 3
+ addi a1, sp, 12
+ call _write_s
- lw a0, 8(sp) # Saved dot position.
- lw a1, 4(sp)
- call _write_out
+ lw a0, 4(sp)
+ lw a1, 8(sp) # Saved dot position.
+ call _write_s
li a0, '\n'
- call _put_char
+ call _write_c
# Epilogue.
lw ra, 28(sp)
@@ -1330,14 +1407,14 @@ compile_label:
mv s1, a0
li a0, '.'
- call _put_char
- lw a0, 16(sp)
- lw a1, 12(sp)
- call _write_out
+ call _write_c
+ lw a0, 12(sp)
+ lw a1, 16(sp)
+ call _write_s
li a0, ':'
- call _put_char
+ call _write_c
li a0, '\n'
- call _put_char
+ call _write_c
# Epilogue.
lw ra, 28(sp)
@@ -1398,35 +1475,35 @@ compile_if:
li t0, 0x62626262 # bbbb
sb t0, 11(sp)
- addi a0, sp, 11
- li a1, 13
- call _write_out
+ li a0, 13
+ addi a1, sp, 11
+ call _write_s
# Write the label counter.
mv a0, s2
- call _printi
+ call _write_i
li a0, '\n'
- call _put_char
+ call _write_c
call compile_statements
mv s1, a0 # Skip end.
# Write the label prefix.
- addi a0, sp, 20
- li a1, 4
- call _write_out
+ li a0, 4
+ addi a1, sp, 20
+ call _write_s
# Write the label counter.
mv a0, s2
- call _printi
+ call _write_i
# Finalize the label.
li t0, 0x0a3a # :\n
sh t0, 16(sp)
- addi a0, sp, 16
- li a1, 2
- call _write_out
+ li a0, 2
+ addi a1, sp, 16
+ call _write_s
addi s2, s2, 1 # Increment the label counter.
@@ -1443,8 +1520,8 @@ compile_if:
# Parameters:
# a0 - Identifier length.
# a0 - Identifier pointer.
-.type _write_procedure_head, @function
-_write_procedure_head:
+.type write_procedure_head, @function
+write_procedure_head:
# Prologue.
addi sp, sp, -32
sw ra, 28(sp)
@@ -1455,27 +1532,27 @@ _write_procedure_head:
sw a1, 20(sp)
# .type identifier, @function
- la a0, asm_type
- li a1, ASM_TYPE_SIZE
- call _write_out
+ li a0, ASM_TYPE_SIZE
+ la a1, asm_type
+ call _write_s
- lw a0, 20(sp)
- lw a1, 16(sp)
- call _write_out
+ lw a0, 16(sp)
+ lw a1, 20(sp)
+ call _write_s
- la a0, asm_type_function
- li a1, ASM_TYPE_FUNCTION_SIZE
- call _write_out
+ li a0, ASM_TYPE_FUNCTION_SIZE
+ la a1, asm_type_function
+ call _write_s
- lw a0, 20(sp)
- lw a1, 16(sp)
- call _write_out
+ lw a0, 16(sp)
+ lw a1, 20(sp)
+ call _write_s
li t0, 0x0a3a # :\n
sw t0, 12(sp)
- addi a0, sp, 12
- li a1, 2
- call _write_out
+ li a0, 2
+ addi a1, sp, 12
+ call _write_s
# Epilogue.
lw ra, 28(sp)
@@ -1592,9 +1669,9 @@ compile_text_section:
sw s0, 8(sp)
addi s0, sp, 16
- la a0, section_text
- li a1, SECTION_TEXT_SIZE
- call _write_out
+ li a0, SECTION_TEXT_SIZE
+ la a1, section_text
+ call _write_s
# Epilogue.
lw ra, 12(sp)
@@ -1611,9 +1688,9 @@ compile_entry_point:
addi s0, sp, 32
# .type _start, @function
- la a0, asm_start
- li a1, ASM_START_SIZE
- call _write_out
+ li a0, ASM_START_SIZE
+ la a1, asm_start
+ call _write_s
mv a0, s1
addi a1, sp, 4
@@ -1624,9 +1701,9 @@ compile_entry_point:
call compile_statements
mv s1, a0 # Skip end.
- la a0, asm_exit
- li a1, ASM_EXIT_SIZE
- call _write_out
+ li a0, ASM_EXIT_SIZE
+ la a1, asm_exit
+ call _write_s
# Epilogue.
lw ra, 28(sp)
diff --git a/boot/stage2.elna b/boot/stage2.elna
index 6c11543..59bb42a 100644
--- a/boot/stage2.elna
+++ b/boot/stage2.elna
@@ -22,9 +22,9 @@ var
loca0: Word
loca4: Word
loca8: Word
+ loca12: ^Byte
loca16: Word
loca20: Word
- loca12: ^Byte
loca24: Bool
begin
_build_expression(0);
@@ -79,16 +79,16 @@ begin
_build_expression(1);
loca0 := 0x627573;
- _write_out(@loca0, 3);
- _write_out(@loca4, 4);
- _write_out(@loca4, 4);
- _write_out(@loca8, 4);
+ _write_s(3, @loca0);
+ _write_s(4, @loca4);
+ _write_s(4, @loca4);
+ _write_s(4, @loca8);
loca0 := 0x7a716573;
- _write_out(@loca0, 4);
- _write_out(@loca4, 4);
- _write_out(@loca4, 3);
- _put_char(0x0a);
+ _write_s(4, @loca0);
+ _write_s(4, @loca4);
+ _write_s(3, @loca4);
+ _write_c(0x0a);
goto .Lbuild_binary_expression_end;
@@ -96,10 +96,10 @@ begin
_advance(1);
_build_expression(1);
loca0 := 0x646e61;
- _write_out(@loca0, 3);
- _write_out(@loca4, 4);
- _write_out(@loca4, 4);
- _write_out(@loca8, 4);
+ _write_s(3, @loca0);
+ _write_s(4, @loca4);
+ _write_s(4, @loca4);
+ _write_s(4, @loca8);
goto .Lbuild_binary_expression_end;
@@ -107,10 +107,10 @@ begin
_advance(2);
_build_expression(1);
loca0 := 0x726f;
- _write_out(@loca0, 2);
- _write_out(@loca4, 4);
- _write_out(@loca4, 4);
- _write_out(@loca8, 4);
+ _write_s(2, @loca0);
+ _write_s(4, @loca4);
+ _write_s(4, @loca4);
+ _write_s(4, @loca8);
goto .Lbuild_binary_expression_end;
@@ -118,10 +118,10 @@ begin
_advance(1);
_build_expression(1);
loca0 := 0x646461;
- _write_out(@loca0, 3);
- _write_out(@loca4, 4);
- _write_out(@loca4, 4);
- _write_out(@loca8, 4);
+ _write_s(3, @loca0);
+ _write_s(4, @loca4);
+ _write_s(4, @loca4);
+ _write_s(4, @loca8);
goto .Lbuild_binary_expression_end;
@@ -129,10 +129,10 @@ begin
_advance(1);
_build_expression(1);
loca0 := 0x627573;
- _write_out(@loca0, 3);
- _write_out(@loca4, 4);
- _write_out(@loca4, 4);
- _write_out(@loca8, 4);
+ _write_s(3, @loca0);
+ _write_s(4, @loca4);
+ _write_s(4, @loca4);
+ _write_s(4, @loca8);
goto .Lbuild_binary_expression_end;
@@ -140,10 +140,10 @@ begin
_advance(1);
_build_expression(1);
loca0 := 0x6c756d;
- _write_out(@loca0, 3);
- _write_out(@loca4, 4);
- _write_out(@loca4, 4);
- _write_out(@loca8, 4);
+ _write_s(3, @loca0);
+ _write_s(4, @loca4);
+ _write_s(4, @loca4);
+ _write_s(4, @loca8);
goto .Lbuild_binary_expression_end;
@@ -151,6 +151,15 @@ begin
end
proc _compile_identifier_expression(loca84: Word, loca80: Byte)
+var
+ loca0: Word
+ loca4: ^Byte
+ loca8: Word
+ loca12: Bool
+ loca16: Word
+ loca20: Word
+ loca24: ^Byte
+ loca28: Byte
begin
loca24 := _current();
loca0 := 0x61636f6c;
@@ -158,17 +167,17 @@ begin
if loca0 = 0 then
loca8 := 0x6120776c;
- _write_out(@loca8, 4);
+ _write_s(4, @loca8);
loca8 := 0x00202c00 or loca80;
- _write_out(@loca8, 3);
+ _write_s(3, @loca8);
loca4 := loca24 + 4;
loca0 := loca84 - 4;
- _write_out(loca4, loca0);
+ _write_s(loca0, loca4);
loca8 := 0x29707328;
- _write_out(@loca8, 4);
- _put_char(0x0a);
+ _write_s(4, @loca8);
+ _write_c(0x0a);
goto .Lcompile_identifier_expression_end
end;
@@ -177,32 +186,32 @@ begin
loca12 := loca0 = 0x73;
if loca8 & loca12 then
loca8 := 0x6120766d;
- _write_out(@loca8, 4);
+ _write_s(4, @loca8);
loca8 := 0x00202c00 or loca80;
- _write_out(@loca8, 3);
- _write_out(loca24, loca84);
- _put_char(0x0a);
+ _write_s(3, @loca8);
+ _write_s(loca84, loca24);
+ _write_c(0x0a);
goto .Lcompile_identifier_expression_end
end;
loca8 := 0x6120616c;
- _write_out(@loca8, 4);
+ _write_s(4, @loca8);
loca8 := 0x00202c00 or loca80;
- _write_out(@loca8, 3);
+ _write_s(3, @loca8);
- _write_out(loca24, loca84);
- _put_char(0x0a);
+ _write_s(loca84, loca24);
+ _write_c(0x0a);
if _is_upper(loca0) then
loca8 := 0x6120776c;
- _write_out(@loca8, 4);
+ _write_s(4, @loca8);
loca8 := 0x28202c00 or loca28;
- _write_out(@loca8, 4);
- _put_char(0x61);
- _put_char(loca28);
- _put_char(0x29);
- _put_char(0x0a);
+ _write_s(4, @loca8);
+ _write_c(0x61);
+ _write_c(loca28);
+ _write_c(0x29);
+ _write_c(0x0a);
goto .Lcompile_identifier_expression_end
end;
@@ -210,14 +219,16 @@ begin
.Lcompile_identifier_expression_end
end
-proc _build_expression()
+proc _build_expression(loca84: Word)
var
loca0: Word
- loca20: Word
- loca28: Word
+ loca4: ^Byte
loca8: Word
+ loca12: Word
+ loca16: Word
+ loca20: Word
loca24: ^Byte
- loca4: ^Byte
+ loca28: Word
begin
loca28 := loca84 + 0x30;
@@ -250,24 +261,24 @@ begin
_build_expression(0);
loca8 := 0x2067656e;
- _write_out(@loca8, 4);
+ _write_s(4, @loca8);
loca8 := 0x202c3061;
- _write_out(@loca8, 4);
+ _write_s(4, @loca8);
loca8 := 0x0a3061;
- _write_out(@loca8, 3);
+ _write_s(3, @loca8);
goto .Lbuild_expression_advance;
.Lbuild_expression_address;
loca8 := 0x69646461;
- _write_out(@loca8, 4);
+ _write_s(4, @loca8);
loca8 := 0x6120;
- _write_out(@loca8, 2);
- _put_char(loca28);
+ _write_s(2, @loca8);
+ _write_c(loca28);
loca8 := 0x7073202c;
- _write_out(@loca8, 4);
+ _write_s(4, @loca8);
loca8 := 0x202c;
- _write_out(@loca8, 2);
+ _write_s(2, @loca8);
_advance(1);
_skip_spaces();
@@ -276,9 +287,9 @@ begin
loca4 := loca24 + 4;
loca0 := loca20 - 4;
- _write_out(loca4, loca0);
+ _write_s(loca0, loca4);
- _put_char(0xa);
+ _write_c(0xa);
goto .Lbuild_expression_advance;
@@ -291,12 +302,12 @@ begin
.Lbuild_expression_literal;
loca8 := 0x6120696c;
- _write_out(@loca8, 4);
+ _write_s(4, @loca8);
loca8 := 0x00202c00 or loca28;
- _write_out(@loca8, 3);
+ _write_s(3, @loca8);
- _write_out(loca24, loca20);
- _put_char(0x0a);
+ _write_s(loca20, loca24);
+ _write_c(0x0a);
goto .Lbuild_expression_advance;
@@ -309,23 +320,27 @@ end
proc _compile_designator_expression(loca84: ^Byte, loca80: Word)
var
loca0: Word
+ loca4: Int
+ loca8: Char
+ loca12: Bool
+ loca16: Bool
begin
loca0 := 0x61636f6c;
loca4 := _memcmp(@loca0, loca84, 4);
if loca4 = 0 then
loca0 := 0x61207773;
- _write_out(@loca0, 4);
+ _write_s(4, @loca0);
loca0 := 0x202c30;
- _write_out(@loca0, 3);
+ _write_s(3, @loca0);
loca84 := loca84 + 4;
loca80 := loca80 - 4;
- _write_out(loca84, loca80);
+ _write_s(loca80, loca84);
loca0 := 0x29707328;
- _write_out(@loca0, 4);
- _put_char(0x0a);
+ _write_s(4, @loca0);
+ _write_c(0x0a);
goto .Lcompile_designator_expression_end
end;
@@ -334,11 +349,11 @@ begin
loca16 := loca80 = 2;
if loca12 & loca16 then
loca0 := 0x20766d;
- _write_out(@loca0, 3);
- _write_out(loca84, loca80);
+ _write_s(3, @loca0);
+ _write_s(loca80, loca84);
loca0 := 0x3061202c;
- _write_out(@loca0, 4);
- _put_char(0x0a);
+ _write_s(4, @loca0);
+ _write_c(0x0a);
goto .Lcompile_designator_expression_end
end;
@@ -349,11 +364,11 @@ end
proc _compile_identifier()
var
loca0: Word
- loca16: Word
+ loca4: Bool
loca8: Word
- loca20: ^Byte
loca12: ^Byte
- loca4: Bool
+ loca16: Word
+ loca20: ^Byte
begin
loca20 := _current();
loca16 := _read_token();
@@ -388,8 +403,8 @@ proc _compile_call(loca84: ^Byte, loca80: Word)
var
loca0: Word
loca4: Word
- loca12: Word
loca8: ^Byte
+ loca12: Word
begin
loca12 := 0;
@@ -404,17 +419,17 @@ begin
_build_expression(0);
loca0 := 0x61207773;
- _write_out(@loca0, 4);
+ _write_s(4, @loca0);
loca0 := 0x202c30;
- _write_out(@loca0, 3);
+ _write_s(3, @loca0);
loca0 := -4 * loca12;
loca0 := loca0 + 60;
- _printi(loca0);
+ _write_i(loca0);
loca0 := 0x29707328;
- _write_out(@loca0, 4);
- _put_char(0x0a);
+ _write_s(4, @loca0);
+ _write_c(0x0a);
_skip_spaces();
loca8 := _current();
@@ -434,60 +449,60 @@ begin
.Lcompile_call_restore;
loca0 := 0x6120776c;
- _write_out(@loca0, 4);
+ _write_s(4, @loca0);
loca4 := 0x36202c30;
- _write_out(@loca4, 4);
+ _write_s(4, @loca4);
loca4 := 0x70732830;
- _write_out(@loca4, 4);
+ _write_s(4, @loca4);
loca4 := 0x0a29;
- _write_out(@loca4, 2);
+ _write_s(2, @loca4);
- _write_out(@loca0, 4);
+ _write_s(4, @loca0);
loca4 := 0x35202c31;
- _write_out(@loca4, 4);
+ _write_s(4, @loca4);
loca4 := 0x70732836;
- _write_out(@loca4, 4);
+ _write_s(4, @loca4);
loca4 := 0x0a29;
- _write_out(@loca4, 2);
+ _write_s(2, @loca4);
- _write_out(@loca0, 4);
+ _write_s(4, @loca0);
loca4 := 0x35202c32;
- _write_out(@loca4, 4);
+ _write_s(4, @loca4);
loca4 := 0x70732832;
- _write_out(@loca4, 4);
+ _write_s(4, @loca4);
loca4 := 0x0a29;
- _write_out(@loca4, 2);
+ _write_s(2, @loca4);
- _write_out(@loca0, 4);
+ _write_s(4, @loca0);
loca4 := 0x34202c33;
- _write_out(@loca4, 4);
+ _write_s(4, @loca4);
loca4 := 0x70732838;
- _write_out(@loca4, 4);
+ _write_s(4, @loca4);
loca4 := 0x0a29;
- _write_out(@loca4, 2);
+ _write_s(2, @loca4);
- _write_out(@loca0, 4);
+ _write_s(4, @loca0);
loca4 := 0x34202c34;
- _write_out(@loca4, 4);
+ _write_s(4, @loca4);
loca4 := 0x70732834;
- _write_out(@loca4, 4);
+ _write_s(4, @loca4);
loca4 := 0x0a29;
- _write_out(@loca4, 2);
+ _write_s(2, @loca4);
- _write_out(@loca0, 4);
+ _write_s(4, @loca0);
loca4 := 0x34202c35;
- _write_out(@loca4, 4);
+ _write_s(4, @loca4);
loca4 := 0x70732830;
- _write_out(@loca4, 4);
+ _write_s(4, @loca4);
loca4 := 0x0a29;
- _write_out(@loca4, 2);
+ _write_s(2, @loca4);
loca0 := 0x6c6c6163;
- _write_out(@loca0, 4);
- _put_char(0x20);
+ _write_s(4, @loca0);
+ _write_c(0x20);
- _write_out(loca84, loca80);
- _put_char(0x0a);
+ _write_s(loca80, loca84);
+ _write_c(0x0a);
_skip_spaces();
_advance(1)
@@ -623,10 +638,10 @@ var loca0: ^Byte
begin
loca0 := _current();
- _write_out(loca0, loca84);
+ _write_s(loca84, loca0);
_advance(loca84);
- _put_char(0xa);
+ _write_c(0xa);
_advance(1)
end
@@ -635,13 +650,13 @@ proc _compile_program()
var loca0: Word
begin
loca0 := 0x6f6c672e;
- _write_out(@loca0, 4);
+ _write_s(4, @loca0);
loca0 := 0x206c6162;
- _write_out(@loca0, 4);
+ _write_s(4, @loca0);
loca0 := 0x6174735f;
- _write_out(@loca0, 4);
+ _write_s(4, @loca0);
loca0 := 0x0a7472;
- _write_out(@loca0, 3);
+ _write_s(3, @loca0);
_advance(8)
end
@@ -652,15 +667,15 @@ var
loca4: ^Byte
begin
loca0 := 0x6365732e;
- _write_out(@loca0, 4);
+ _write_s(4, @loca0);
loca0 := 0x6e6f6974;
- _write_out(@loca0, 4);
+ _write_s(4, @loca0);
loca0 := 0x6f722e20;
- _write_out(@loca0, 4);
+ _write_s(4, @loca0);
loca0 := 0x61746164;
- _write_out(@loca0, 4);
+ _write_s(4, @loca0);
loca0 := 0x0a;
- _write_out(@loca0, 1);
+ _write_s(1, @loca0);
_advance(6);
@@ -685,25 +700,25 @@ begin
loca4 := _read_token();
loca8 := _current();
- _write_out(loca8, loca4);
+ _write_s(loca4, loca8);
_advance(loca4);
_skip_spaces();
_advance(2);
loca0 := 0x6c2e203a;
- _write_out(@loca0, 4);
+ _write_s(4, @loca0);
loca0 := 0x20676e6f;
- _write_out(@loca0, 4);
+ _write_s(4, @loca0);
_skip_spaces();
loca4 := _read_token();
loca8 := _current();
- _write_out(loca8, loca4);
+ _write_s(loca4, loca8);
_advance(loca4);
- _put_char(0x0a)
+ _write_c(0x0a)
end
proc _compile_variable_section()
@@ -712,13 +727,13 @@ var
loca4: ^Byte
begin
loca0 := 0x6365732e;
- _write_out(@loca0, 4);
+ _write_s(4, @loca0);
loca0 := 0x6e6f6974;
- _write_out(@loca0, 4);
+ _write_s(4, @loca0);
loca0 := 0x73622e20;
- _write_out(@loca0, 4);
+ _write_s(4, @loca0);
loca0 := 0x0a73;
- _write_out(@loca0, 2);
+ _write_s(2, @loca0);
_advance(4);
@@ -740,11 +755,14 @@ end
proc _compile_variable()
var
- loca28: ^Byte
- loca16: ^Byte
loca0: Word
- loca24: Word
+ loca4: Word
+ loca8: Word
+ loca12: Word
+ loca16: ^Byte
loca20: Word
+ loca24: Word
+ loca28: ^Byte
begin
loca24 := _read_token();
loca28 := _current();
@@ -769,42 +787,42 @@ begin
_advance(loca0);
loca0 := 0x7079742e;
- _write_out(@loca0, 4);
+ _write_s(4, @loca0);
loca0 := 0x2065;
- _write_out(@loca0, 2);
+ _write_s(2, @loca0);
- _write_out(loca28, loca24);
+ _write_s(loca24, loca28);
loca0 := 0x6f40202c;
- _write_out(@loca0, 4);
+ _write_s(4, @loca0);
loca0 := 0x63656a62;
- _write_out(@loca0, 4);
+ _write_s(4, @loca0);
loca0 := 0x0a74;
- _write_out(@loca0, 2);
+ _write_s(2, @loca0);
loca0 := 0x7a69732e;
- _write_out(@loca0, 4);
+ _write_s(4, @loca0);
loca0 := 0x2065;
- _write_out(@loca0, 2);
+ _write_s(2, @loca0);
- _write_out(loca28, loca24);
+ _write_s(loca24, loca28);
loca0 := 0x202c;
- _write_out(@loca0, 2);
+ _write_s(2, @loca0);
- _write_out(loca20, loca16);
- _put_char(0x0a);
+ _write_s(loca16, loca20);
+ _write_c(0x0a);
- _write_out(loca28, loca24);
+ _write_s(loca24, loca28);
loca0 := 0x7a2e203a;
- _write_out(@loca0, 4);
+ _write_s(4, @loca0);
loca0 := 0x206f7265;
- _write_out(@loca0, 4);
+ _write_s(4, @loca0);
- _write_out(loca20, loca16);
+ _write_s(loca16, loca20);
- _put_char(0x0a)
+ _write_c(0x0a)
end
proc _compile_procedure()
@@ -823,23 +841,23 @@ begin
_advance(loca16);
loca0 := 0x7079742e;
- _write_out(@loca0, 4);
+ _write_s(4, @loca0);
loca0 := 0x2065;
- _write_out(@loca0, 2);
+ _write_s(2, @loca0);
- _write_out(loca20, loca16);
+ _write_s(loca16, loca20);
loca0 := 0x6640202c;
- _write_out(@loca0, 4);
+ _write_s(4, @loca0);
loca0 := 0x74636e75;
- _write_out(@loca0, 4);
+ _write_s(4, @loca0);
loca0 := 0x0a6e6f69;
- _write_out(@loca0, 4);
+ _write_s(4, @loca0);
- _write_out(loca20, loca16);
+ _write_s(loca16, loca20);
loca0 := 0x0a3a;
- _write_out(@loca0, 2);
+ _write_s(2, @loca0);
_skip_spaces();
_advance(1);
@@ -862,85 +880,85 @@ begin
end;
loca0 := 0x69646461;
- _write_out(@loca0, 4);
+ _write_s(4, @loca0);
loca0 := 0x2c707320;
- _write_out(@loca0, 4);
- _write_out(@loca0, 4);
+ _write_s(4, @loca0);
+ _write_s(4, @loca0);
loca0 := 0x0a36392d;
- _write_out(@loca0, 4);
+ _write_s(4, @loca0);
loca0 := 0x72207773;
- _write_out(@loca0, 4);
+ _write_s(4, @loca0);
loca0 := 0x39202c61;
- _write_out(@loca0, 4);
+ _write_s(4, @loca0);
loca0 := 0x70732832;
- _write_out(@loca0, 4);
+ _write_s(4, @loca0);
loca0 := 0x0a29;
- _write_out(@loca0, 2);
+ _write_s(2, @loca0);
loca0 := 0x73207773;
- _write_out(@loca0, 4);
+ _write_s(4, @loca0);
loca0 := 0x38202c30;
- _write_out(@loca0, 4);
+ _write_s(4, @loca0);
loca0 := 0x70732838;
- _write_out(@loca0, 4);
+ _write_s(4, @loca0);
loca0 := 0x0a29;
- _write_out(@loca0, 2);
+ _write_s(2, @loca0);
loca0 := 0x69646461;
- _write_out(@loca0, 4);
+ _write_s(4, @loca0);
loca0 := 0x2c307320;
- _write_out(@loca0, 4);
+ _write_s(4, @loca0);
loca0 := 0x2c707320;
- _write_out(@loca0, 4);
+ _write_s(4, @loca0);
loca0 := 0x0a363920;
- _write_out(@loca0, 4);
+ _write_s(4, @loca0);
loca0 := 0x61207773;
- _write_out(@loca0, 4);
+ _write_s(4, @loca0);
loca4 := 0x38202c30;
- _write_out(@loca4, 4);
+ _write_s(4, @loca4);
loca8 := 0x70732834;
- _write_out(@loca8, 4);
+ _write_s(4, @loca8);
loca12 := 0x0a29;
- _write_out(@loca12, 2);
+ _write_s(2, @loca12);
- _write_out(@loca0, 4);
+ _write_s(4, @loca0);
loca4 := 0x38202c31;
- _write_out(@loca4, 4);
+ _write_s(4, @loca4);
loca8 := 0x70732830;
- _write_out(@loca8, 4);
- _write_out(@loca12, 2);
+ _write_s(4, @loca8);
+ _write_s(2, @loca12);
- _write_out(@loca0, 4);
+ _write_s(4, @loca0);
loca4 := 0x37202c32;
- _write_out(@loca4, 4);
+ _write_s(4, @loca4);
loca8 := 0x70732836;
- _write_out(@loca8, 4);
- _write_out(@loca12, 2);
+ _write_s(4, @loca8);
+ _write_s(2, @loca12);
- _write_out(@loca0, 4);
+ _write_s(4, @loca0);
loca4 := 0x37202c33;
- _write_out(@loca4, 4);
+ _write_s(4, @loca4);
loca8 := 0x70732832;
- _write_out(@loca8, 4);
- _write_out(@loca12, 2);
+ _write_s(4, @loca8);
+ _write_s(2, @loca12);
- _write_out(@loca0, 4);
+ _write_s(4, @loca0);
loca4 := 0x36202c34;
- _write_out(@loca4, 4);
+ _write_s(4, @loca4);
loca8 := 0x70732838;
- _write_out(@loca8, 4);
- _write_out(@loca12, 2);
+ _write_s(4, @loca8);
+ _write_s(2, @loca12);
- _write_out(@loca0, 4);
+ _write_s(4, @loca0);
loca4 := 0x36202c35;
- _write_out(@loca4, 4);
+ _write_s(4, @loca4);
loca8 := 0x70732838;
- _write_out(@loca8, 4);
- _write_out(@loca12, 2);
+ _write_s(4, @loca8);
+ _write_s(2, @loca12);
.Lcompile_procedure_body;
_skip_spaces();
@@ -960,43 +978,43 @@ begin
_advance(4);
loca0 := 0x7220776c;
- _write_out(@loca0, 4);
+ _write_s(4, @loca0);
loca0 := 0x39202c61;
- _write_out(@loca0, 4);
+ _write_s(4, @loca0);
loca0 := 0x70732832;
- _write_out(@loca0, 4);
+ _write_s(4, @loca0);
loca0 := 0x0a29;
- _write_out(@loca0, 2);
+ _write_s(2, @loca0);
loca0 := 0x7320776c;
- _write_out(@loca0, 4);
+ _write_s(4, @loca0);
loca0 := 0x38202c30;
- _write_out(@loca0, 4);
+ _write_s(4, @loca0);
loca0 := 0x70732838;
- _write_out(@loca0, 4);
+ _write_s(4, @loca0);
loca0 := 0x0a29;
- _write_out(@loca0, 2);
+ _write_s(2, @loca0);
loca0 := 0x69646461;
- _write_out(@loca0, 4);
+ _write_s(4, @loca0);
loca0 := 0x2c707320;
- _write_out(@loca0, 4);
- _write_out(@loca0, 4);
+ _write_s(4, @loca0);
+ _write_s(4, @loca0);
loca0 := 0x0a3639;
- _write_out(@loca0, 4);
+ _write_s(4, @loca0);
loca0 := 0x0a746572;
- _write_out(@loca0, 4)
+ _write_s(4, @loca0)
end
proc _token_compare(loca84: ^Byte, loca80: Word, loca76: ^Byte)
var
loca0: Bool
loca4: Byte
- loca12: Byte
loca8: Word
+ loca12: Byte
begin
.Ltoken_compare_loop;
loca4 := _front(loca76);
@@ -1038,12 +1056,13 @@ end
proc _compile_goto()
var
loca0: Word
+ loca4: Word
loca8: ^Byte
begin
_advance(4);
loca0 := 0x206a;
- _write_out(@loca0, 2);
+ _write_s(2, @loca0);
_skip_spaces();
loca8 := _current();
@@ -1052,15 +1071,16 @@ begin
loca0 := _read_token();
_advance(loca0);
loca0 := loca0 + 1;
- _write_out(loca8, loca0);
+ _write_s(loca0, loca8);
_advance(1);
- _put_char(0x0a)
+ _write_c(0x0a)
end
proc _compile_label(loca84: Word)
var
loca0: Word
+ loca4: Word
begin
loca0 := _current();
@@ -1072,10 +1092,10 @@ begin
if loca0 = 0x3b then
loca4 := loca4 - 1
end;
- _write_out(s1, loca4);
+ _write_s(loca4, s1);
- _put_char(0x3a);
- _put_char(0x0a);
+ _write_c(0x3a);
+ _write_c(0x0a);
_advance(loca84)
end
@@ -1089,11 +1109,12 @@ end
proc _compile_if()
var
+ loca0: Word
+ loca4: ^Byte
loca8: Word
loca12: Word
loca16: Word
loca20: Word
- loca4: ^Byte
begin
_advance(2);
_skip_spaces();
@@ -1107,15 +1128,15 @@ begin
loca16 := 0x66694c2e;
loca12 := 0x7a716562;
- _write_out(@loca12, 4);
+ _write_s(4, @loca12);
loca12 := 0x2c306120;
- _write_out(@loca12, 4);
- _put_char(0x20);
+ _write_s(4, @loca12);
+ _write_c(0x20);
- _write_out(@loca16, 4);
- _printi(s2);
+ _write_s(4, @loca16);
+ _write_i(s2);
- _put_char(0x0a);
+ _write_c(0x0a);
.Lcompile_if_loop;
_skip_spaces();
@@ -1131,11 +1152,11 @@ begin
goto .Lcompile_if_loop
end;
- _write_out(@loca16, 4);
- _printi(s2);
+ _write_s(4, @loca16);
+ _write_i(s2);
loca12 := 0x0a3a0a3a;
- _write_out(@loca12, 2);
+ _write_s(2, @loca12);
s2 := s2 + 1;
_advance(4)
@@ -1316,34 +1337,34 @@ proc _compile_text_section()
var loca0: Word
begin
loca0 := 0x6365732e;
- _write_out(@loca0, 4);
+ _write_s(4, @loca0);
loca0 := 0x6e6f6974;
- _write_out(@loca0, 4);
+ _write_s(4, @loca0);
loca0 := 0x65742e20;
- _write_out(@loca0, 4);
+ _write_s(4, @loca0);
loca0 := 0x0a7478;
- _write_out(@loca0, 3)
+ _write_s(3, @loca0)
end
proc _compile_entry_point()
var loca0: Word
begin
loca0 := 0x7079742e;
- _write_out(@loca0, 4);
+ _write_s(4, @loca0);
loca0 := 0x735f2065;
- _write_out(@loca0, 4);
+ _write_s(4, @loca0);
loca0 := 0x74726174;
- _write_out(@loca0, 4);
+ _write_s(4, @loca0);
loca0 := 0x6640202c;
- _write_out(@loca0, 4);
+ _write_s(4, @loca0);
loca0 := 0x74636e75;
- _write_out(@loca0, 4);
+ _write_s(4, @loca0);
loca0 := 0x0a6e6f69;
- _write_out(@loca0, 4);
+ _write_s(4, @loca0);
loca0 := 0x6174735f;
- _write_out(@loca0, 4);
+ _write_s(4, @loca0);
loca0 := 0x0a3a7472;
- _write_out(@loca0, 4);
+ _write_s(4, @loca0);
_advance(6)
end
@@ -1352,19 +1373,19 @@ proc _compile_exit()
var loca0: Word
begin
loca0 := 0x6120696c;
- _write_out(@loca0, 4);
+ _write_s(4, @loca0);
loca0 := 0x30202c30;
- _write_out(@loca0, 4);
+ _write_s(4, @loca0);
loca0 := 0x20696c0a;
- _write_out(@loca0, 4);
+ _write_s(4, @loca0);
loca0 := 0x202c3761;
- _write_out(@loca0, 4);
+ _write_s(4, @loca0);
loca0 := 0x650a3339;
- _write_out(@loca0, 4);
+ _write_s(4, @loca0);
loca0 := 0x6c6c6163;
- _write_out(@loca0, 4);
+ _write_s(4, @loca0);
loca0 := 0x0a;
- _write_out(@loca0, 1);
+ _write_s(1, @loca0);
_advance(4);
_skip_spaces()
diff --git a/boot/test.elna b/boot/test.elna
index f4ce4c5..3b7a962 100644
--- a/boot/test.elna
+++ b/boot/test.elna
@@ -1,14 +1,11 @@
program
-proc _main(x: Word)
-var loca0: Word
-loca4: Word
+proc _main(x: Word, y: Word)
begin
- loca0 := 0x0a2c3061;
- loca4 := x;
- _write_out(@loca4, 4)
+ _write_s(@x, 4);
+ _write_s(@y, 4)
end
begin
- _main()
+ _main(0x0a2c3061, 0x0a2c3062)
end.