npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@moaqzdev/abacus

v0.1.0

Published

Implementación de la máquina elemental Abacus

Readme

Abacus

Formato de instrucciones

Cada instrucción en Abacus ocupa 16 bits y se compone de dos partes:

  • Código de Operación (CO): Los 4 bits más significativos (0-F en hexadecimal).
  • Operando (Op): Los 12 bits restantes que representan una dirección de memoria o un valor inmediato.

Abacus es una máquina de una sola dirección. Esto significa que las operaciones no pueden manipular dos celdas de memoria simultáneamente. El acumulador (AC) actúa como el intermediario.

Por ejemplo, para sumar los valores de dos celdas de memoria distintas y guardar el resultado en una tercera, se debe realizar lo siguiente:

  1. Se trae el primer valor desde la memoria al AC.
  2. Se suma el segundo valor de memoria al contenido actual del AC.
  3. Se traslada el resultado final desde el AC de vuelta a la memoria.

El conjunto de instrucciones de la máquina Abacus es el siguiente:

| Código (Hex) | Operación | Descripción | | ------------ | ------------------- | ---------------------------------------------------------------- | | 0 | Carga inmediata | Carga el valor del operando directamente en el AC. | | 1 | Carga | Carga en el AC el contenido de la dirección de memoria indicada. | | 2 | Almacena | Guarda el contenido del AC en la dirección de memoria indicada. | | 3 | Suma | Suma al AC el contenido de la dirección de memoria indicada. | | 4 | NOT (AC) | Invierte los bits del acumulador. | | 5 | Bifurca si (AC) = 0 | Salta a la dirección del operando si el acumulador es cero. | | 6 | Bifurca si (AC) > 0 | Salta a la dirección del operando si el acumulador es positivo. | | 7 | Bifurca si (AC) < 0 | Salta a la dirección del operando si el acumulador es negativo. | | F | Fin de Programa | Detiene la ejecución de la máquina. |

Guía de Uso

Instalación

npm install @moaqzdev/abacus

Inicialización de la Máquina

Para comenzar, instancia la clase AbacusMachine. Opcionalmente se le puede pasar un parámetro baseAddress para indicar el punto de carga.

import { AbacusMachine } from "@moaqzdev/abacus";

const machine = new AbacusMachine({
  baseAddress: 0x100,
});

// o
const machine = new AbacusMachine(); // Se asume que el punto de carga es 0x200.

Gestión de Memoria y Datos

setMemoryValue(direccion, valor)

Escribe un valor de 16 bits en una dirección específica.

// Guardamos el número 25 en la dirección 0x200
machine.setMemoryValue("200", 25);

// Guardamos una instrucción: Código 1 + Operando 200
machine.setMemoryValue("100", 0x1200);

[!WARNING] Si se desea guardar números en hexadecimal se deben incluir con el prefijo 0x, de lo contrario, serán tratados como decimales.

getMemoryValue(direccion)

Lee el contenido de una dirección de memoria.

const resultado = machine.getMemoryValue("201");
console.log(`El valor en 0x201 es: ${resultado}`);

[!IMPORTANT] Los datos en memoria se guardan en binario pero al recuperarlos se convierten automáticamente a números decimales.

Ejecución y Control

Una vez cargado el programa y los datos se puede controlar el flujo de ejecución del programa a través de los siguientes métodos:

step(n)

Ejecuta una cantidad específica de instrucciones.

machine.step(); // Ejecuta la siguiente instrucción
machine.step(5); // Ejecuta las próximas 5 instrucciones

run()

Ejecuta el programa de forma continua hasta que la máquina encuentre la instrucción Fin de Programa (código F).

machine.run();

Inspección de Registros

Puedes consultar el estado interno del procesador en cualquier momento usando los siguientes métodos:

getAccumulator

Retorna el valor actual del registro AC.

console.log("Valor actual en el AC:", machine.getAccumulator);

getProgramCounter

Retorna la dirección de la próxima instrucción que el RPI tiene apuntada.

console.log("Siguiente instrucción en:", machine.getProgramCounter.toString(16));

[!IMPORTANT] La dirección se devuelve en decimal. Para convertirla a hexadecimal usamos .toString(16).

Demo

const machine = new AbacusMachine({ baseAddress: 0x100 });

// 1. Cargamos los datos en memoria
machine.setMemoryValue("200", 15); // Valor A
machine.setMemoryValue("201", 10); // Valor B

// 2. Cargamos el programa (instrucciones)
machine.setMemoryValue("100", 0x1200); // Carga (1) el contenido de 200
machine.setMemoryValue("101", 0x3201); // Suma (3) el contenido de 201
machine.setMemoryValue("102", 0x2202); // Almacena (2) en 202
machine.setMemoryValue("103", 0xf000); // Fin de Programa (F)

// 3. Ejecutamos
machine.run();

// 4. Verificamos el resultado
console.log("Resultado de la suma:", machine.getMemoryValue("202")); // Output: 25

[!IMPORTANT] Los tests son documentacion viva, si aún tienes dudas de qué se puede hacer con Abacus puedes consultar los tests.