Compare commits

...

2 commits

Author SHA1 Message Date
6f0b19720d Add method for compiling nodes following the NEXT chain 2025-03-28 11:47:27 +01:00
dc80e6e1e3 Nicer printing of nodes and references
References print shorter and show their contents, call nodes now show
what they're calling and with what arguments. Additionally, generated
code for a node starts with a comment of the node as printed.
2025-03-28 11:46:03 +01:00

View file

@ -16,23 +16,42 @@
(defclass reference-constant (reference) (defclass reference-constant (reference)
((%value :accessor ref-value :initarg :value))) ((%value :accessor ref-value :initarg :value)))
(defmethod print-object ((object reference-constant) stream)
(print-unreadable-object (object stream :type t)
(format stream "~D" (ref-value object))))
(defmethod dereference ((ref reference-constant)) (defmethod dereference ((ref reference-constant))
(format-inst t "LDA #~D" (ref-value ref))) (format-inst t "LDA #~D" (ref-value ref)))
(defclass reference-variable (reference) (defclass reference-variable (reference)
((%index :accessor ref-index :initarg :index))) ((%index :accessor ref-index :initarg :index)))
(defmethod print-object ((object reference-variable) stream)
(print-unreadable-object (object stream :type t)
(format stream "@~D" (ref-index object))))
(defmethod dereference ((ref reference-variable)) (defmethod dereference ((ref reference-variable))
(format-inst t "LDY #~D" (ref-index ref)) (format-inst t "LDY #~D" (ref-index ref))
(format-inst t "LDA VARVEC,Y")) (format-inst t "LDA VARVEC,Y"))
(defclass node () (defclass node ()
((%next :accessor next :accessor normal-next))) ((%next :accessor next :accessor normal-next :initform nil)))
(defmethod generate-code :before ((node node))
(format t ";; ~A~%" node))
(defmethod generate-code :after ((node node))
(terpri))
(defclass node-call (node) (defclass node-call (node)
((%callee :accessor callee :initarg :callee) ((%callee :accessor callee :initarg :callee)
(%arguments :accessor arguments :initarg :arguments))) (%arguments :accessor arguments :initarg :arguments)))
(defmethod print-object ((object node-call) stream)
(print-unreadable-object (object stream :type t :identity t)
(format stream "~A~A" (callee object) (arguments object))))
(defmethod generate-code ((node node-call)) (defmethod generate-code ((node node-call))
(loop :for ref :in (arguments node) (loop :for ref :in (arguments node)
:for index :from 0 :for index :from 0
@ -72,6 +91,11 @@
(format-inst t "PLA") (format-inst t "PLA")
(format-inst t "TAX")) (format-inst t "TAX"))
(defmethod compile-starting-at ((node node))
(generate-code node)
(unless (null (next node))
(compile-starting-at (next node))))
(defun make-call (callee args) (defun make-call (callee args)
(let ((arguments (let ((arguments
(loop :for (constp value) :in args (loop :for (constp value) :in args