(in-package "CL-USER") (defstruct (y-emu (:conc-name y-)) addr data readmem writemem type rst ir pc d csp dsp datamem tos litbase addro regA regB regC regD dataeno datbus dat_source dat_dest addr_source cdsp_source cdsp_dest cdspbus pcb_source mic_inst micr_pc aluOp aluOut ) (defparameter cpu0 (make-y-emu)) (setf (y-pc cpu0) 128) (defun high? (sig) (= sig 1)) (defun low? (sig) (= sig 0)) (defparameter *micro_store* (make-array 2048 :initial-element 0)) (defparameter *branch_store* (make-array 128 :initial-element 0)) (defun extract-field (n a b) (let ((mask (- (expt 2 (+ (- a b) 1)) 1))) (setf mask (ash mask b)) (ash (logand mask n) (- b)))) (defun decode-micro-inst (mic-inst) (values (extract-field mic-inst 31 27) (extract-field mic-inst 26 22) (extract-field mic-inst 21 17) (extract-field mic-inst 16 14) (extract-field mic-inst 13 11) (extract-field mic-inst 10 9) (extract-field mic-inst 7 7) (extract-field mic-inst 8 8) (extract-field mic-inst 6 0) (extract-field mic-inst 35 32))) (defun next-micr-pc (mic-pc mic-br) (if (= 0 mic-br) (+ mic-pc 1) (aref *branch_store* mic-br))) (defun alu-proc (opA opB opC aluOp) opA) (defun step-regs-cpu-1 (cpu) (let ((d (y-d cpu))) (case (y-dat_dest cpu) (0 (setf (y-ir cpu) (y-datbus cpu))) (1 (setf (y-tos cpu) (y-datbus cpu))) (2 (setf (y-litbase cpu) (y-datbus cpu))) (3 (setf (y-regA cpu) (y-datbus cpu))) (t (err (y-dat_dest cpu)))) (case (y-cdsp_dest cpu) (0 (setf (y-csp cpu) (y-cdspbus cpu))) (1 (setf (y-dsp cpu) (y-cdspbus cpu))) (2 (setf (y-csp cpu) (y-datbus cpu))) (3 (setf (y-dsp cpu) (y-datbus cpu))) (t (err (y-cdsp_dest cpu)))) (case (y-pcb_source cpu) (0 (setf (y-pc cpu) (+ (y-pc cpu) 4))) (1 (setf (y-pc cpu) (+ (y-pc cpu) d))) (2 (setf (y-pc cpu) (y-datbus cpu))) (t (err (y-pcb_source cpu)))))) (defun set-cpu-sources-1 (cpu) (set-addro cpu) (set-datbus cpu) (set-cdspbus cpu)) (defun set-addro (cpu) (let ((d (y-d cpu))) (setf (y-addro cpu) (case (y-addr_source cpu) (0 (y-dsp cpu)) (1 (+ (y-dsp cpu) 4)) (2 (- (y-dsp cpu) 4)) (3 (+ (y-dsp cpu) d)) (4 (y-csp cpu)) (5 (+ (y-csp cpu) 4)) (6 (- (y-csp cpu) 4)) (7 (+ (y-csp cpu) d)) (8 (y-pc cpu)) (9 (y-aluOut cpu)) (10 (+ (y-litbase cpu) d)) (t 'z))))) (defun set-datbus (cpu) ) (defun set-cdspbus (cpu) ) (defun err (n) (format t "error ~A in ~A ~%" n 0)) (defun extract-d (ir) (let ((mask (- (expt 2 16) - 1))) (ash (logand ir mask) 2))) (defun step-y-emu (cpu addr data rst) (let ((addr_source nil) (dat_source nil) (dat_dest nil) (cdsp_source nil) (cdsp_dest nil) (pcb_source nil) (dataeno nil) (readmem nil) (micr_pc nil) (aluOp nil)) (when (high? rst) (setf (y-pc cpu) 0) (setf (y-micr_pc cpu) 0) (return-from step-y-emu)) (setf (y-d) (extract-d (y-ir cpu))) (setf (y-aluOut cpu) (alu-proc (y-tos cpu) (y-datbus cpu) (y-regA cpu) (y-aluOp cpu))) (step-regs-cpu-1 cpu) (setf (y-mic_inst cpu) (aref *micro_store* (y-micr_pc cpu))) (multiple-value-setq (addr_source dat_source dat_dest cdsp_source cdsp_dest pcb_source dataeno readmem micr_br aluOp) (decode-micro-inst (y-mic_inst cpu))) (setf (y-addr_source cpu) addr_source) (setf (y-dat_source cpu) dat_source) (setf (y-dat_dest cpu) dat_dest) (setf (y-cdsp_source cpu) cdsp_source) (setf (y-cdsp_dest cpu) cdsp_dest) (setf (y-pcb_source cpu) pcb_source) (setf (y-dataeno cpu) dataeno) (setf (y-readmem cpu) readmem) (setf (y-micr_pc cpu) (next-micr-pc (y-micr_pc cpu) micr_br)) (setf (y-aluOp cpu) aluOp) (if (low? (y-dataeno cpu)) (setf (y-datamem cpu) data) (setf (y-datamem cpu) 'z)) (set-cpu-sources-1 cpu) (set addr (y-addro cpu)) (if (high? (y-dataeno cpu)) (setf (y-data cpu) (y-datbus cpu)))))