fix register use in putstring

was off by one, the syscall is write 
and the first arg is file_descriptor
ie 1 == stdout
This commit is contained in:
Torsten 2020-03-25 18:58:10 +02:00
parent 231ce0f69b
commit 4bae5c418b
6 changed files with 16 additions and 8 deletions

View File

@ -275,7 +275,8 @@ module Risc
end
def handle_putstring
str = get_register( :r0 ) # should test length, ie r2
# should test length, syscall_3 (syscall_1 is file_descriptor, ie stdout)
str = get_register( std_reg(:syscall_2) )
case str
when Symbol
@stdout << str.to_s

View File

@ -40,6 +40,8 @@ module Risc
:r0
when :syscall_2
:r1
when :syscall_3
:r2
when :saved_message
:r14
else

View File

@ -3,8 +3,8 @@ module SlotMachine
def to_risc(compiler)
builder = compiler.builder(compiler.source)
integer = builder.prepare_int_return # makes integer_tmp variable as return
word = Risc.syscall_reg(1).set_compiler(compiler)
length = Risc.syscall_reg(2).set_compiler(compiler)
word = Risc.syscall_reg(2).set_compiler(compiler)
length = Risc.syscall_reg(3).set_compiler(compiler)
builder.build do
string = message[:receiver].to_reg.known_type(:Word)
integer << string[:char_length]

View File

@ -35,9 +35,9 @@ module Risc
def test_pre_sys
done = main_ticks(24)
assert_equal Parfait::Word , @interpreter.get_register(:r0).class
assert_equal "Hello again" , @interpreter.get_register(:r0).to_string
assert_equal 11 , @interpreter.get_register(:r1)
assert_equal Parfait::Word , @interpreter.get_register(@interpreter.std_reg(:syscall_2)).class
assert_equal "Hello again" , @interpreter.get_register(@interpreter.std_reg(:syscall_2)).to_string
assert_equal 11 , @interpreter.get_register(@interpreter.std_reg(:syscall_3))
end
def test_sys

View File

@ -26,5 +26,10 @@ module Risc
int = @builder.allocate_int
assert_allocate
end
def test_compiler
int = @builder.allocate_int
assert int.compiler
assert int.symbol.to_s.start_with?("id_fac")
end
end
end

View File

@ -24,8 +24,8 @@ module SlotMachine
assert_reg_to_slot s + 1 , "id_factory_.next_object" , :message , 5
assert_slot_to_reg s + 2 ,:message , 2 , "message.receiver"
assert_slot_to_reg s + 3 ,"message.receiver" , 1 , "id_factory_.next_object"
assert_transfer s + 4 , :"message.receiver" , :syscall_1
assert_transfer s + 5 , "id_factory_.next_object" , :syscall_2
assert_transfer s + 4 , :"message.receiver" , :syscall_2
assert_transfer s + 5 , "id_factory_.next_object" , :syscall_3
assert_transfer s + 6 , :message , :saved_message
assert_syscall s + 7 , :putstring
assert_transfer s + 8 , :syscall_1 , :restore_integer_return