From f91fa39aefc0a82391e42e4d9a72a2917acde4d5 Mon Sep 17 00:00:00 2001 From: Dane Johnson Date: Tue, 19 Aug 2025 13:30:59 -0500 Subject: [PATCH] WIP runtime more. How do I mark primitives+broken hearts? --- asm/runtime.scm | 70 +++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 65 insertions(+), 5 deletions(-) diff --git a/asm/runtime.scm b/asm/runtime.scm index 43f5d3b..5e9e355 100644 --- a/asm/runtime.scm +++ b/asm/runtime.scm @@ -3,9 +3,9 @@ ;; These need to be initialized with the runtime (variable scan 0) (variable free 0) -(variable root 0) (variable old 0) (variable new 0) +(variable root 0) (push main) (jmp) @@ -36,21 +36,81 @@ alloc-do-gc (push alloc) (jmp) -gc-start ;; ( -- ) +gc-run ;; ( -- ) ; Move scan & free to start of new memory (ref new) (dup) (set! free) (set! scan) (ref root) -(push relocate-object) +(push relocate-cons) (call) (push gc-loop) (call) +; Flip old and new +(ref old) +(ref new) +(set! old) +(set! new) (return) -relocate-object ;; (o -- ) -;; TODO +relocate-cons ;; (o -- ) +(dup) +(@) +(push relocate-reg) +(call) +(push 4) +(+) +(@) +(push relocate-reg) +relocate-reg ;; (r -- ) +(dup) +(push cons?) +(call) +(push reg-relocated) +(if) +(dup) +(push eol?) +(call) +(not) +(push reg-relocated) +(if) +(dup) +(push broken-heart?) +(call) +(push copy-and-construct) +(if) +(dup) ;; Broken heart, copy updated address from cdr +(push 4) +(+) +(@) ;; Retrieve new address +(dup) +(!) ;; Write it here +(push reg-relocated) +(jmp) +copy-and-construct +(dup) ;; Wasn't a broken heart, move car to new memory +(@) +(push free) +(!) +(dup) ;; Push cdr to new memory +(push 4) +(+) +(@) +(push free) +(push 4) +(+) +(!) +(dup) ;; Construct the broken heart +(push install-broken-heart) +(call) +(ref free) ;; Move free pointer +(push 8) +(+) +(set! free) +reg-relocated +(drop) +(return) main ;; TODO