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 +# +# 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 - addi t3, zero, 0 - bge a0, zero, .digit10 - addi t3, zero, 1 - sub a0, zero, a0 + li t1, 10 + addi t0, s0, -9 -.digit10: + 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 + sb t2, 0(t0) + addi t0, t0, -1 -.write_call: - addi a0, zero, 1 - addi a1, a1, 1 - sub a2, s0, a1 - addi a7, zero, 64 # write - ecall +.Lprint_i_write_call: + mv a0, a1 + addi a1, t0, 1 + sub a2, s0, t0 + addi a2, a2, -9 + sw a2, 0(sp) - lw s0, 0(sp) - lw ra, 4(sp) - addi sp, sp, 16 + 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,54 +342,34 @@ 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 - - j .Lcompile_identifier_expression_end - -.Lcompile_identifier_expression_saved: - li t0, 0x00202c00 # \0,_ - lw t1, 16(sp) - or t0, t0, t1 - sw t0, 8(sp) - li t0, 0x6120766d # mv a - sw t0, 4(sp) - addi a0, sp, 4 - li a1, 7 - call _write_out - - mv a0, s1 - lw a1, 20(sp) - call _write_out - - li a0, '\n' - call _put_char + call _write_c j .Lcompile_identifier_expression_end @@ -398,28 +380,45 @@ compile_identifier_expression: 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 - 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, 12(sp) + lw a0, 8(a0) + call _write_i li t0, 0x29707328 # (sp) 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,_ + lw t1, 16(sp) + or t0, t0, t1 + sw t0, 8(sp) + li t0, 0x6120766d # mv a + sw t0, 4(sp) + li a0, 7 + addi a1, sp, 4 + call _write_s + + lw a0, 20(sp) + mv a1, s1 + call _write_s + + li a0, '\n' + 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 +.Lcompile_expression_address: + lw a0, 20(sp) + mv s1, a0 # Skip @. - lw a0, 20(sp) # Skip @. - addi a1, sp, 24 - call lex_next - mv s1, a0 + lw a0, 36(sp) + call compile_at_expression - 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 + j .Lcompile_expression_end - li a0, '\n' - call _put_char - - j .Lbuild_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, 28(sp) + lw a1, 32(sp) + call _write_s + + li a0, '\n' + call _write_c + + j .Lcompile_expression_advance + +.Lcompile_expression_advance: + lw s1, 20(sp) + +.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) - call _write_out + 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 _put_char + call _write_c - j .Lbuild_expression_advance - -.Lbuild_expression_advance: - lw s1, 20(sp) - -.Lbuild_expression_end: # 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 - loca8: Word - loca24: ^Byte loca4: ^Byte + loca8: Word + loca12: Word + loca16: Word + loca20: Word + loca24: ^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 - loca8: Word - loca20: ^Byte - loca12: ^Byte loca4: Bool + loca8: Word + loca12: ^Byte + 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.