Compare commits

..

No commits in common. '20deea66150e38a6c71989884b2ef2c0eb6b034a' and '586e5af3dd02814072ab8f0c757f6edca061f142' have entirely different histories.

  1. 144
      src/rustint/core.clj

@ -1719,19 +1719,6 @@
; ATAN: Incrementa cont-prg en 1, quita de la pila un elemento numerico, calcula su arcotangente y la coloca al final de la pila.
; ABS: Incrementa cont-prg en 1, quita de la pila un elemento numerico, calcula su valor absoluto y lo coloca al final de la pila.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; No puedo usar or a secas:
; Can't take value of a macro: #'clojure.core/or
(defn or-diadico [arg1 arg2]
(or arg1 arg2)
)
; No puedo usar and a secas:
; Can't take value of a macro: #'clojure.core/and
(defn and-diadico [arg1 arg2]
(and arg1 arg2)
)
(defn interpretar [cod regs-de-act cont-prg pila mapa-regs]
(let [fetched (cod cont-prg),
opcode (if (symbol? fetched) fetched (first fetched)),
@ -1878,22 +1865,6 @@
POPADD (let [res (asignar-aritmetico regs-de-act pila reg-actual fetched +)]
(if (nil? res) res (recur cod res (inc cont-prg) (vec (butlast pila)) mapa-regs)))
; POPSUB: Como POPADD, pero resta.
POPSUB (let [res (asignar-aritmetico regs-de-act pila reg-actual fetched -)]
(if (nil? res) res (recur cod res (inc cont-prg) (vec (butlast pila)) mapa-regs)))
; POPMUL: Como POPADD, pero multiplica.
POPMUL (let [res (asignar-aritmetico regs-de-act pila reg-actual fetched *)]
(if (nil? res) res (recur cod res (inc cont-prg) (vec (butlast pila)) mapa-regs)))
; POPDIV: Como POPADD, pero divide.
POPDIV (let [res (asignar-aritmetico regs-de-act pila reg-actual fetched dividir)]
(if (nil? res) res (recur cod res (inc cont-prg) (vec (butlast pila)) mapa-regs)))
; POPMOD: Como POPADD, pero calcula el resto de la division.
POPMOD (let [res (asignar-aritmetico regs-de-act pila reg-actual fetched rem)]
(if (nil? res) res (recur cod res (inc cont-prg) (vec (butlast pila)) mapa-regs)))
; Incrementa cont-prg en 1 y quita el ultimo elemento de pila. El argumento indica en reg-actual las coordenadas [#reg-act, offset] donde sumar el elemento en regs-de-act al llamar recursivamente a interpretar (verificando la compatibilidad de los tipos)
; Por ejemplo:
; fetched: [POPADDREF 2]
@ -1908,22 +1879,6 @@
POPADDREF (let [res (asignar-aritmetico-ref regs-de-act pila reg-actual fetched +)]
(if (nil? res) res (recur cod res (inc cont-prg) (vec (butlast pila)) mapa-regs)))
; POPSUBREF: Como POPADDREF, pero resta.
POPSUBREF (let [res (asignar-aritmetico-ref regs-de-act pila reg-actual fetched -)]
(if (nil? res) res (recur cod res (inc cont-prg) (vec (butlast pila)) mapa-regs)))
; POPMULREF: Como POPADDREF, pero multiplica.
POPMULREF (let [res (asignar-aritmetico-ref regs-de-act pila reg-actual fetched *)]
(if (nil? res) res (recur cod res (inc cont-prg) (vec (butlast pila)) mapa-regs)))
; POPDIVREF: Como POPADDREF, pero divide.
POPDIVREF (let [res (asignar-aritmetico-ref regs-de-act pila reg-actual fetched dividir)]
(if (nil? res) res (recur cod res (inc cont-prg) (vec (butlast pila)) mapa-regs)))
; POPMODREF: Como POPADDREF, pero calcula el resto de la division.
POPMODREF (let [res (asignar-aritmetico-ref regs-de-act pila reg-actual fetched rem)]
(if (nil? res) res (recur cod res (inc cont-prg) (vec (butlast pila)) mapa-regs)))
; Incrementa cont-prg en 1, quita de la pila dos elementos, calcula su suma y la coloca al final de la pila
; fetched: ADD
; pila recibida: [1 0 0 3 4]
@ -1932,18 +1887,9 @@
(if (nil? res) res (recur cod regs-de-act (inc cont-prg) res mapa-regs)))
; PUSHFI: PUSH FROM INSTRUCTION. Direccionamiento inmediato. Incrementa cont-prg en 1 y agrega al final de pila el valor del argumento.
PUSHFI (let [
res (conj pila (second fetched))
]
(recur cod regs-de-act (inc cont-prg) res mapa-regs)
)
; PUSHFM: PUSH FROM MEMORY. Direccionamiento directo. Incrementa cont-prg en 1 y agrega al final de pila el elemento ubicado en la posicion de reg-actual indicada por el valor del argumento.
PUSHFM (let [
res (conj pila (second (reg-actual (second fetched))))
]
PUSHFI (let [res (conj pila (second fetched))
(recur cod regs-de-act (inc cont-prg) res mapa-regs)
)
])
; NOT: Incrementa cont-prg en 1, quita de la pila un elemento booleano, lo niega y lo coloca al final de la pila.
@ -2017,92 +1963,6 @@
; SUB: Como ADD, pero resta.
SUB (let [res (aplicar-operador-diadico - pila)]
(if (nil? res) res (recur cod regs-de-act (inc cont-prg) res mapa-regs)))
; OR: Como ADD, pero calcula el or entre los dos valores
OR (let [res (aplicar-operador-diadico or-diadico pila)]
(if (nil? res) res (recur cod regs-de-act (inc cont-prg) res mapa-regs)))
; AND: Como ADD, pero calcula el and entre los dos valores.
AND (let [res (aplicar-operador-diadico and-diadico pila)]
(if (nil? res) res (recur cod regs-de-act (inc cont-prg) res mapa-regs)))
; SQRT: Incrementa cont-prg en 1, quita de la pila un elemento numerico, calcula su raiz cuadrada y la coloca al final de la pila.
SQRT (let [
res (Math/sqrt (last pila)),
nueva_pila (assoc pila (- (count pila) 1) res)
]
(recur cod regs-de-act (inc cont-prg) nueva_pila mapa-regs)
)
; SIN: Incrementa cont-prg en 1, quita de la pila un elemento numerico, calcula su seno y lo coloca al final de la pila.
SIN (let [
res (Math/sin (last pila)),
nueva_pila (assoc pila (- (count pila) 1) res)
]
(recur cod regs-de-act (inc cont-prg) nueva_pila mapa-regs)
)
; ATAN: Incrementa cont-prg en 1, quita de la pila un elemento numerico, calcula su arcotangente y la coloca al final de la pila.
ATAN (let [
res (Math/atan (last pila)),
nueva_pila (assoc pila (- (count pila) 1) res)
]
(recur cod regs-de-act (inc cont-prg) nueva_pila mapa-regs)
)
; ABS: Incrementa cont-prg en 1, quita de la pila un elemento numerico, calcula su valor absoluto y lo coloca al final de la pila.
ABS (let [
res (Math/abs (last pila)),
nueva_pila (assoc pila (- (count pila) 1) res)
]
(recur cod regs-de-act (inc cont-prg) nueva_pila mapa-regs)
)
; FLUSH: Purga la salida e incrementa cont-prg en 1.
FLUSH (do (flush) (recur cod regs-de-act (inc cont-prg) pila mapa-regs))
; NL: New line. Imprime un salto de linea e incrementa cont-prg en 1.
NL (do (println) (recur cod regs-de-act (inc cont-prg) pila mapa-regs))
; JMP: Salto incondicional. Cambia cont-prg por el valor del argumento.
JMP (recur cod regs-de-act (second fetched) pila mapa-regs)
; JC: Salto condicional. Quita el ultimo valor de la pila. Si este es true, cambia cont-prg por el valor del argumento. Si no, incrementa cont-prg en 1.
JC (let [last_val (last pila),
pila (pop pila),
next_cont_prg (
cond
(true? last_val) (second fetched)
:else (inc cont-prg)
)
] (recur cod regs-de-act next_cont_prg pila mapa-regs)
)
; CAL: Llamada a una funcion. Agrega al final de regs-de-act el reg-de-act (proveniente de mapa-regs) indicado por el argumento,
; cambia cont-prg por el valor del argumento y coloca al final de la pila la direccion de retorno (el valor del argumento incrementado en 1).
CAL (let [
argval (second fetched),
next_cont_prg argval,
reg-act-to-add (get mapa-regs argval),
retdir (inc argval)
]
(recur cod (conj regs-de-act reg-act-to-add) next_cont_prg (conj pila retdir) mapa-regs)
)
; RETN: Indica el retorno de la llamada a un procedimiento (no funcion). Llama recursivamente a interpretar con valores actualizados de
; regs-de-act (se elimina el ultimo de ellos), cont-prg (pasa a ser el ultimo valor en la pila) y pila (se quita de ella el nuevo cont-prg).
RETN (recur cod (pop regs-de-act) (last pila) (pop pila) mapa-regs)
; CHR: Incrementa cont-prg en 1, quita de la pila dos elementos (un string y un indice), selecciona el char del string indicado por el indice y lo coloca al final de la pila.
CHR (let [
next_cont_prg (inc cont-prg),
args (take-last 2 pila),
s (first args),
idx (second args),
ch (nth s idx)
next_pila (conj (vec (drop-last 2 pila)) ch),
] (recur cod regs-de-act next_cont_prg next_pila mapa-regs)
)
)
)
)

Loading…
Cancel
Save