Ajout des instructions que la VM doit reconnaitre

This commit is contained in:
Bertrand BRUN 2010-10-15 19:56:43 +02:00
parent 3237acd2d1
commit be4c1636b7

128
VM/instruction.lisp Normal file
View File

@ -0,0 +1,128 @@
;; TODO : Penser a cree une fonction qui initialise un tableau en fonction d'un parametre.
(setq memory (make-array 100))
(defun getValueInMemory (index)
(aref memory index))
(defun setValueInMemory (index value)
(setf (aref memory index) value))
;;On initialise les registres a rien (peut etre faut il mettre 0 ?)
(setf R0 nil)
(setf R1 nil)
(setf R2 nil)
;; On initialise le registre de pointeur de base a l'indice 0 du tableau memory
(setf BP 0)
;; On initialise le registre de pointeur de pile a la valeur du pointeur de base
(setf SP BP)
;; On initialise le registre du compteur ordinale a la taille du tableau - 1
;; TODO : Recupere la taille du tableau dynamiquement.
(setf PC 99)
;; On initialise les registres booleen a faux (nil)
(setf PP nil)
(setf EQ nil)
(setf PG nil)
(defun LOAD (address register)
(setf register (getValueInMemory address)))
(defun STORE (register address)
(setValueInMemory address register))
;; TODO : Remplir la fonction MOVE
(defun MOVE (reg1 reg2)
)
(defun ADD (reg1 reg2)
(setf reg2 (+ reg2 reg1)))
(defun SUB (reg1 reg2)
(setf reg2 (- reg2 reg1)))
(defun MULT (reg1 reg2)
(setf reg2 (* reg2 reg1)))
(defun DIV (reg1 reg2)
(setf reg2 (/ reg2 reg1)))
(defun INCR (register)
(setf register (+ register 1)))
(defun DECR (register)
(setf register (- register 1)))
(defun PUSH (register)
(progn (INCR SP)
(STORE register SP)))
(defun POP (register)
(progn (LOAD SP register)
(DECR SP)))
;; TODO : Remplir la fonction JMP
(defun JMP (dst)
)
;; TODO : Remplir la fonction JSR
(defun JSR (dst)
)
;; TODO : Remplir la fonction RTN
(defun RTN ()
)
(defun CMP (reg1 reg2)
(cond ((= (getValueInMemory reg1) (getValueInMemory reg2))
(progn (setf EQ T)
(setf PP nil)
(setf PG nil)))
((< (getValueInMemory reg1) (getValueInMemory reg2))
(progn (setf EQ nil)
(setf PP T)
(setf PG nil)))
(T
(progn (setf EQ nil)
(setf PP nil)
(setf PG T)))))
(defun JEQ (label)
(if EQ
(JMP label))
)
(defun JPG (label)
(if PG
(JMP label))
)
(defun JPP (label)
(if PP
(JMP label))
)
(defun JPE (label)
(if (or PP EQ)
(JMP label))
)
(defun JGE (label)
(if (or PG EQ)
(JMP label))
)
(defun JNE (label)
(if (not EQ)
(JMP label))
)
;; TODO : Remplir la fonction NOP
(defun NOP ()
)
;; TODO : Remplir la fonction HALT
(defun HALT ()
)