;; -*- 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 |# ;; Rules for interpreting the purpose of some line. (setf *grammar* '( (label (lambda (l) (and (eq (last-char (first l)) #\:) (eq (length l) 1)))) (label-instruction (lambda (l) (and (eq (last-char (first l)) #\:) (member (read-from-string (second l)) *opcodes*)))) (attribute (lambda (l) (equal (char (first l) 0) #\.))) (instruction (lambda (l) (member (read-from-string (first l)) *opcodes*))) (macro (lambda (l) (equal (second l) "="))) (unknown (lambda (l) t)))) (defun syntax-rule (line list) "Apply a syntax rule against a delimited line from a program." (dolist (i (extract-keys list)) (let ((z (funcall (eval (cadr (assoc i list))) line))) (if (not (equal z nil)) (return i) nil)))) (syntax-rule '("LABEL:" "LDA" "$05") *grammar*) (syntax-rule '("LDA" "$05") *grammar*) (syntax-rule '("AS" "=" "THAT") *grammar*) (syntax-rule '("LABEL:") *grammar*) (syntax-rule '("hhhh") *grammar*) (syntax-rule '(".org" "$FF00") *grammar*)