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:
parent
231ce0f69b
commit
4bae5c418b
@ -275,7 +275,8 @@ module Risc
|
|||||||
end
|
end
|
||||||
|
|
||||||
def handle_putstring
|
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
|
case str
|
||||||
when Symbol
|
when Symbol
|
||||||
@stdout << str.to_s
|
@stdout << str.to_s
|
||||||
|
@ -40,6 +40,8 @@ module Risc
|
|||||||
:r0
|
:r0
|
||||||
when :syscall_2
|
when :syscall_2
|
||||||
:r1
|
:r1
|
||||||
|
when :syscall_3
|
||||||
|
:r2
|
||||||
when :saved_message
|
when :saved_message
|
||||||
:r14
|
:r14
|
||||||
else
|
else
|
||||||
|
@ -3,8 +3,8 @@ module SlotMachine
|
|||||||
def to_risc(compiler)
|
def to_risc(compiler)
|
||||||
builder = compiler.builder(compiler.source)
|
builder = compiler.builder(compiler.source)
|
||||||
integer = builder.prepare_int_return # makes integer_tmp variable as return
|
integer = builder.prepare_int_return # makes integer_tmp variable as return
|
||||||
word = Risc.syscall_reg(1).set_compiler(compiler)
|
word = Risc.syscall_reg(2).set_compiler(compiler)
|
||||||
length = Risc.syscall_reg(2).set_compiler(compiler)
|
length = Risc.syscall_reg(3).set_compiler(compiler)
|
||||||
builder.build do
|
builder.build do
|
||||||
string = message[:receiver].to_reg.known_type(:Word)
|
string = message[:receiver].to_reg.known_type(:Word)
|
||||||
integer << string[:char_length]
|
integer << string[:char_length]
|
||||||
|
@ -35,9 +35,9 @@ module Risc
|
|||||||
|
|
||||||
def test_pre_sys
|
def test_pre_sys
|
||||||
done = main_ticks(24)
|
done = main_ticks(24)
|
||||||
assert_equal Parfait::Word , @interpreter.get_register(:r0).class
|
assert_equal Parfait::Word , @interpreter.get_register(@interpreter.std_reg(:syscall_2)).class
|
||||||
assert_equal "Hello again" , @interpreter.get_register(:r0).to_string
|
assert_equal "Hello again" , @interpreter.get_register(@interpreter.std_reg(:syscall_2)).to_string
|
||||||
assert_equal 11 , @interpreter.get_register(:r1)
|
assert_equal 11 , @interpreter.get_register(@interpreter.std_reg(:syscall_3))
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_sys
|
def test_sys
|
||||||
|
@ -26,5 +26,10 @@ module Risc
|
|||||||
int = @builder.allocate_int
|
int = @builder.allocate_int
|
||||||
assert_allocate
|
assert_allocate
|
||||||
end
|
end
|
||||||
|
def test_compiler
|
||||||
|
int = @builder.allocate_int
|
||||||
|
assert int.compiler
|
||||||
|
assert int.symbol.to_s.start_with?("id_fac")
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -24,8 +24,8 @@ module SlotMachine
|
|||||||
assert_reg_to_slot s + 1 , "id_factory_.next_object" , :message , 5
|
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 + 2 ,:message , 2 , "message.receiver"
|
||||||
assert_slot_to_reg s + 3 ,"message.receiver" , 1 , "id_factory_.next_object"
|
assert_slot_to_reg s + 3 ,"message.receiver" , 1 , "id_factory_.next_object"
|
||||||
assert_transfer s + 4 , :"message.receiver" , :syscall_1
|
assert_transfer s + 4 , :"message.receiver" , :syscall_2
|
||||||
assert_transfer s + 5 , "id_factory_.next_object" , :syscall_2
|
assert_transfer s + 5 , "id_factory_.next_object" , :syscall_3
|
||||||
assert_transfer s + 6 , :message , :saved_message
|
assert_transfer s + 6 , :message , :saved_message
|
||||||
assert_syscall s + 7 , :putstring
|
assert_syscall s + 7 , :putstring
|
||||||
assert_transfer s + 8 , :syscall_1 , :restore_integer_return
|
assert_transfer s + 8 , :syscall_1 , :restore_integer_return
|
||||||
|
Loading…
x
Reference in New Issue
Block a user