From 31bb5f85099e35a569a4536bd015af4f3e9d26cf Mon Sep 17 00:00:00 2001 From: John Lorentzson Date: Thu, 8 May 2025 22:05:48 +0200 Subject: [PATCH] Add offset label class --- wip-duuqnd/user-side-compiler/high-level.lisp | 5 ++--- wip-duuqnd/user-side-compiler/label.lisp | 19 +++++++++++++++++++ 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/wip-duuqnd/user-side-compiler/high-level.lisp b/wip-duuqnd/user-side-compiler/high-level.lisp index 09aadba..0ece9c5 100644 --- a/wip-duuqnd/user-side-compiler/high-level.lisp +++ b/wip-duuqnd/user-side-compiler/high-level.lisp @@ -47,8 +47,7 @@ (format stream "@~D" (ref-index object)))) (defmethod dereference ((ref reference-variable)) - (produce-instruction 'inst-ldy-immediate (ref-index ref)) - (produce-instruction 'inst-lda-absolute-y "VARVEC")) + (produce-instruction 'inst-lda-absolute (make-offset-label *varvec* (ref-index ref)))) (defclass node () ((%next :accessor next :accessor normal-next :initform nil))) @@ -77,7 +76,7 @@ (loop :for ref :in (arguments node) :for index :from 0 :do (dereference ref) - :do (produce-instruction 'inst-sta-absolute (format nil "ARGVEC+~D" index))) + :do (produce-instruction 'inst-sta-absolute (make-offset-label *argvec* index))) (produce-instruction 'inst-jsr-absolute (callee node)))) (defclass node-branch (node) diff --git a/wip-duuqnd/user-side-compiler/label.lisp b/wip-duuqnd/user-side-compiler/label.lisp index 6c64370..19be22e 100644 --- a/wip-duuqnd/user-side-compiler/label.lisp +++ b/wip-duuqnd/user-side-compiler/label.lisp @@ -26,3 +26,22 @@ (when (null name) (setf name (make-label-name (if (null name-prefix) "L" name-prefix)))) (make-instance 'label :name name :address address)) + +(defclass offset-label (label) + ((%offset-from :accessor offset-from :initarg :offset-from) + (%offset :accessor offset :initarg :offset))) + +(defmethod address ((object offset-label)) + (+ (address (offset-from object)) + (offset object))) + +(defmethod name ((object offset-label)) + (format nil "~A~C~D" + (name (offset-from object)) + (if (minusp (offset object)) + #\- + #\+) + (offset object))) + +(defun make-offset-label (src-label offset) + (make-instance 'offset-label :offset-from src-label :offset offset))