From 5fd0592e0bf449ec25392d2cb1b4c3b45b9cd718 Mon Sep 17 00:00:00 2001 From: aleksei Date: Sun, 14 Apr 2024 12:34:40 +1000 Subject: Some housekeeping --- macro.lisp | 65 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 macro.lisp (limited to 'macro.lisp') diff --git a/macro.lisp b/macro.lisp new file mode 100644 index 0000000..39070ab --- /dev/null +++ b/macro.lisp @@ -0,0 +1,65 @@ +;; -*- mode: common-lisp -*- +#| +clasm-6502: An assembler for the 6502 written in Common Lisp. +Copyright (C) 2024 Aleksei Eaves + +This library is free software; you can redistribute it and/or +modify it under the terms of the GNU Lesser General Public +License as published by the Free Software Foundation; either +version 2.1 of the License, or (at your option) any later version. + +This library is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public +License along with this library; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +|# + +#| +To solve the problem of the colliding syntax rules +We can test only the addressin modes we know the opcode to have +This not only solves this problem, it just makes more sense. + +Need to use the existing lists to find keywords to watch out for during compilation. +ESPECIALLY run through the output of macro-list to find collisions +This owuld make it simple +|# + +(defun macro-pass (program-list) + "Translate a programs macros" + (let ((macro-association-list + (let ((return-alist nil)) + (dolist (i program-list) + (if (equal (syntax-rule (cadr i) *line-syntax*) 'macro) + (setf return-alist + (cons (list (first (cadr i)) (car (last (cadr i)))) + return-alist)) + nil)) + return-alist)) + (return-list nil)) + ;; For every line in program list.. + (dolist (i program-list) + ;; ..excluding the macro lines.. + (if (eq (syntax-rule (cadr i) *line-syntax*) 'macro) + nil + ;; ..add to return list this value: + (setf return-list + (cons + ;; For every word in the line, + (let ((append-list nil)) + (dolist (j (cadr i)) + (setf append-list + ;; add it to the output line, and change whatever is a macro. + (cons (if (assoc j macro-association-list :test #'string=) + (cadr (assoc j macro-association-list :test #'string=)) + j) + append-list))) + ;; Return the line number and program. + (cons (car i) + (list (reverse append-list)))) + return-list)))) + ;; Return everything. + (reverse return-list))) -- cgit v1.2.3