Add bytesquashing (turning instructions etc. into dead bytes)
This commit is contained in:
parent
010cc5dd87
commit
c336e43c19
2 changed files with 29 additions and 1 deletions
11
wip-duuqnd/user-side-compiler/bytesquash.lisp
Normal file
11
wip-duuqnd/user-side-compiler/bytesquash.lisp
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
(in-package #:user-side-compiler)
|
||||||
|
|
||||||
|
(defgeneric bytesquash (object)
|
||||||
|
(:method ((object integer))
|
||||||
|
(typecase object
|
||||||
|
((unsigned-byte 8) (list object))
|
||||||
|
((unsigned-byte 16) (list (ldb (byte 8 0) object)
|
||||||
|
(ldb (byte 8 8) object)))
|
||||||
|
(t (error "Cannot bytesquash integers larger than 16-bit."))))
|
||||||
|
(:method ((object label))
|
||||||
|
(bytesquash (address object))))
|
|
@ -32,9 +32,14 @@
|
||||||
""
|
""
|
||||||
(format nil " ~S" (operand object)))))))
|
(format nil " ~S" (operand object)))))))
|
||||||
|
|
||||||
(defclass complete-mixin ()
|
(defclass complete-instruction-mixin ()
|
||||||
((%opcode :allocation :class :reader opcode :initarg :opcode)))
|
((%opcode :allocation :class :reader opcode :initarg :opcode)))
|
||||||
|
|
||||||
|
(defmethod bytesquash ((object complete-instruction-mixin))
|
||||||
|
(append (list (opcode object))
|
||||||
|
(when (> (instruction-length object) 1)
|
||||||
|
(bytesquash (operand object)))))
|
||||||
|
|
||||||
(defclass immediate-mixin () ())
|
(defclass immediate-mixin () ())
|
||||||
(defclass implied-mixin () ())
|
(defclass implied-mixin () ())
|
||||||
(defclass accumulator-mixin () ())
|
(defclass accumulator-mixin () ())
|
||||||
|
@ -113,6 +118,18 @@
|
||||||
:finally (setf (cdr cell)
|
:finally (setf (cdr cell)
|
||||||
(list (make-label :name "PROGRAM_END" :address address)))))
|
(list (make-label :name "PROGRAM_END" :address address)))))
|
||||||
|
|
||||||
|
(defun bytesquash-instruction-list (instruction-list origin)
|
||||||
|
(let* ((end-label (find "PROGRAM_END" (remove-if-not #'labelp instruction-list)
|
||||||
|
:key #'name :test #'equalp))
|
||||||
|
(byte-vector (make-array (- (address end-label) origin)
|
||||||
|
:element-type '(unsigned-byte 8)
|
||||||
|
:fill-pointer 0)))
|
||||||
|
(loop :for thing :in instruction-list
|
||||||
|
:when (typep thing 'instruction)
|
||||||
|
:do (dolist (byte (bytesquash thing))
|
||||||
|
(vector-push byte byte-vector)))
|
||||||
|
byte-vector))
|
||||||
|
|
||||||
;;; Testing
|
;;; Testing
|
||||||
|
|
||||||
(define-instruction "TXA" nil (:implied #x8a))
|
(define-instruction "TXA" nil (:implied #x8a))
|
||||||
|
|
Loading…
Add table
Reference in a new issue