Add offset label class

This commit is contained in:
John Lorentzson 2025-05-08 22:05:48 +02:00
parent 15a70836ac
commit 31bb5f8509
2 changed files with 21 additions and 3 deletions

View file

@ -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)

View file

@ -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))