66 lines
1.4 KiB
GDScript
66 lines
1.4 KiB
GDScript
class_name CPU
|
|
extends Node
|
|
|
|
signal cpu_tick
|
|
|
|
var cobor_vm := CoborVirtualMachine.new()
|
|
var running := false
|
|
var register_size := 16
|
|
var modules : Array[Module]
|
|
|
|
func _init() -> void:
|
|
cobor_vm.set_registers(register_size,[])
|
|
|
|
func _ready() -> void:
|
|
var register_index := 1
|
|
for child in get_children():
|
|
if child is Module:
|
|
var module := child as Module
|
|
modules.push_back(module)
|
|
module.set_reserved_registers(register_index)
|
|
register_index += module.get_register_reservation_size()
|
|
if $ProgrammingUI != null:
|
|
$ProgrammingUI.memory_setup()
|
|
|
|
func show_ui(show:bool)->void:
|
|
$ProgrammingUI.visible = show
|
|
|
|
func run_step() -> void:
|
|
if not running:
|
|
cobor_vm.set_registers(register_size,[])
|
|
running = true
|
|
_tick()
|
|
|
|
func run() -> void:
|
|
if not running:
|
|
cobor_vm.set_registers(register_size,[])
|
|
running = true
|
|
$CPUClock.start()
|
|
|
|
func _tick()->void:
|
|
for module in modules:
|
|
module.early_tick()
|
|
var err := cobor_vm.run_step()
|
|
if not err.is_empty():
|
|
print(err)
|
|
if cobor_vm.get_program_counter() >= cobor_vm.get_program_size():
|
|
stop()
|
|
for module in modules:
|
|
module.late_tick()
|
|
emit_signal("cpu_tick")
|
|
|
|
func pause()->void:
|
|
$CPUClock.stop()
|
|
|
|
func stop()->void:
|
|
running = false
|
|
$CPUClock.stop()
|
|
|
|
func compile_code(source_code: String)->void:
|
|
var errors := cobor_vm.parse_source_code(source_code)
|
|
if errors.is_empty():
|
|
print("Compiling Ok!")
|
|
else:
|
|
for error in errors:
|
|
print(error)
|