KENBAK-1: El primer ordenador personal

Foro dedicado a sistemas varios: juguetes programables, calculadoras, agendas electrónicas, traductoras, y cualquier otro sistema de la época.
dancresp
Amiga 1200
Amiga 1200
Mensajes: 1393
Registrado: 23 Dic 2008, 17:53
Sistema Favorito: MSX
primer_sistema: ZX81
Primera consola: Atari 2600
Gracias dadas: 3 veces
Gracias recibidas: 20 veces

KENBAK-1: El primer ordenador personal

Mensajepor dancresp » 27 Jun 2014, 13:11

EL SISTEMA
El KENBAK-1 está considerado el primer “ordenador personal” disponible comercialmente. Esta designación le fue otorgada por el Computer History Museum en el año 1987.

Este equipo fue diseñado y fabricado por John Blankenbaker, quien creó la Kenbak Corporation, y comenzó a comercializarse en el año 1971 a través de la revista “Scientific American”. El nombre del equipo está basado en la mitad del apellido de su diseñador. Las máquinas fabricadas diferían ligeramente del prototipo pero tenían el mismo rendimiento y conjunto de instrucciones.

Kenbak-1_01_full.jpg
Kenbak-1_01_full.jpg (37.07 KiB) Visto 7691 veces


Un poco de historia
John Blankenbaker comenzó el diseño de un dispositivo de computación en el invierno de 1949 siendo estudiante de física en el Oregon State Collage. Su motivación principal fue la necesidad de realizar cálculos con logaritmos de forma rápida para el laboratorio de física semanal. Se inspiró en un artículo de mecánica que hablaba sobre los dispositivos de computación. Se centró en cómo escribir números con sólo dos dígitos: 0 y 1 y comenzó a investigar cómo realizar cálculos con estos números, sin embargo, tras un tiempo investigando en estos aspectos, comenzó a preguntarse cómo podría conseguir esto con dispositivos mecánicos como relés. El diseño que desarrolló fue un desastre y demasiado caro, pero estimuló su deseo de aprender más sobre computadoras.

En el verano de 1951, John Blankenbaker tuvo la oportunidad de trabajar en SEAC (National Bureau of Standards Eastern Automatic Computer) y, después de graduarse en 1952, trabajó en Hughes Aircraft Company y fue asignado a un departamento de trabajo dedicado a los equipos digitales. Para esta compañía diseñó la unidad aritmética de un procesador de datos profesionales y, en esta etapa de su vida se dio cuenta de que en un computador sólo era necesario un flip-flop (biestable capaz de almacenar un 1 o un 0) con la memoria suficiente.

En el otoño de 1970, John Blankenbaker estaba desempleado y decidió profundizar en la investigación de cómo conseguir un ordenador para uso personal de bajo coste, con un objetivo educativo, y que fuera capaz de satisfacer las necesidades de los usuarios a través de sencillos programas. Debido a su pequeño tamaño, el lenguaje de programación a utilizar sería un lenguaje máquina propio.

El objetivo inicial era conseguir un coste de componentes de 150 dólares por computador pero la cifra real fue de cerca de 250 dólares ya que el volumen de producción fue pequeño. Para abaratar costes utilizó interruptores y luces como entrada y salida de datos. En la primavera de 1971 el equipo estaba listo.

Los profesionales estaban entusiasmados con sus características y todos ellos coincidían en que era un computador para uso educativo. Tal vez por esto, se hizo hincapié en la comercialización en escuelas. Según John Blankenbaker, posiblemente hubiese sido mejor hacer centrarse en aspectos más divertidos y comercializarlo con más énfasis para uso personal. A parte de todo esto, en esta época, existía un problema con la venta a las instituciones educativas: su largo ciclo presupuestario.

Su comercialización fracasó ya que únicamente se vendieron 40 equipos, a un coste de 750 dólares cada uno. En 1973 cesó su producción y Kenbak Corporation cerró. Los derechos de la Kenbak Corporation fueron vendidos a la CTI Educational Corporation que continuaron la labor. Por ello, algunos de los computadores, el equivalente funcional a las unidades originales, llevan el nombre de esta Corporación (el nombre de la KENBAK-1 pasó a ser CTI 5050).

En la actualidad está catalogada la existencia de 10 ejemplares.



El equipo
El computador KENBAK-1 fue diseñado en 1970 y es anterior a los microprocesadores, siendo construido a partir de componentes TTL, memorias MOS y luces e interruptores para la entrada y salida de datos. El primer microprocesador del mundo, el Intel 4004, no apareció hasta el año 1971.

Con todo, es un auténtico computador compuesto por 256 bytes de memoria RAM, una amplia variedad de instrucciones y una velocidad de proceso de 1MHz, pero carente de un programa residente, ya que no dispone de ROM. La memoria consiste en dos registros de tipo MOS de 1.024 bits cada uno. La lógica fue implementada mediante circuitos integrados de pequeña y mediana escala.

A diferencia de los microprocesadores convencionales en que los registros y flags son valores internos, aquí ocupan distintas posiciones de la memoria RAM, con lo que hay que se debe ir con cuidado a la hora de programar.

Su funcionamiento se reduce a introducir valores en su memoria y ejecutar el programa, ya que la mayor parte de sus 132 circuitos integrados se comporta, en conjunto, como un auténtico microprocesador.

Varias carencias en su diseño ayudaron al fracaso del equipo: la imposibilidad de ampliación del hardware, el engorro de introducir la información y la ausencia de un sistema para grabar y recuperar los programas.

kenbak1_mb.jpg
kenbak1_mb.jpg (274.45 KiB) Visto 7691 veces


El panel frontal del equipo dispone de 15 pulsadores, 12 luces y dos interruptores. Con 8 de estos pulsadores se puede introducir un valor de 1 byte y almacenarlo en cualquier posición de memoria mediante los botones “SET ADDRESS” y “STORE MEMORY”. Los datos en memoria pueden ser mostrados mediante 8 luces con los botones “DISPLAY ADDRESS” y “READ MEMORY”. El programa se ejecuta con el botón “START” y detenido mediante el botón “STOP”. El botón “CLEAR” limpia la entrada de datos actual.

Durante la ejecución de un programa se puede comunicar con el operador mostrando valores de un byte a través de las 8 luces, o se puede detener la ejecución mediante una instrucción HALT, introducir un valor, y reanudar la ejecución con “START”.


EL CODIGO MAQUINA DEL KENBAK-1
El único lenguaje de programación de este sistema es el código máquina, y está compuesto por un total de 14 instrucciones distintas.

Se utilizará la letra “o” para indicar valores en formato octal, “d” para el formato decimal y “b” para el formato binario.

A excepción de las instrucciones de rotación (SHIFT), desplazamiento (ROTATE), paro (HALT) y No-Op (NOOP), que requieren un único byte, el resto de las instrucciones ocupan dos bytes, una para la instrucción y la otra para indicar el modo de direccionamiento.

El sistema admite hasta 5 modos de direccionamiento distintos:
- Constant = Indica un valor numérico.
- Memory = El valor numérico indica una dirección de memoria.
- Indirect = El valor numérico indica una posición de memoria que contiene un puntero a una dirección de memoria.
- Indexed = El valor numérico más el valor del registro X indican una dirección de memoria.
- Ind/Ind = Es una combinación de los modos indirect e indexed.

El sistema dispone de 4 registros de un byte cada uno, que ocupan un total de 4 bytes de la memoria RAM:
- Registro A = Dirección 000 (000o).
- Registro B = Dirección 001 (001o).
- Registro X = Dirección 002 (002o). Se puede usar para métodos de direccionamiento indexados.
- Registro P = Dirección 003 (003o). Puntero que indica la posición de memoria que se va a ejecutar.

Summary_Instruc_Code.jpg
Summary_Instruc_Code.jpg (52.21 KiB) Visto 7691 veces


Y dispone de 3 flags de estado, que también ocupan un byte cada uno en la memoria RAM:
- Flag Carry / Overflow del registro A = Dirección 129 (201o).
- Flag Carry / Overflow del registro B = Dirección 130 (202o).
- Flag Carry / Overflow del registro X = Dirección 131 (203o).

El flag Carry se pone a 1 cuando un registro supera su valor máximo (255d / 377o), y el flag Overflow indica el signo del registro (0=Positivo / 1=Negativo).

El uso del sistema octal facilita la introducción de los programas ya que las instrucciones se dividen en tres partes, como se puede apreciar en la tabla anterior. La primera parte (bits 6 y 7) se forman con un valor entre 0 y 3, y las otras dos pueden contener un valor entre 0 y 7, de forma que cabe en un dígito del sistema octal (entre 0 y 7).

A continuación se muestra la tabla de codificación de la instrucción LOAD que aparece en el manual original:

Instruccion_LOAD.jpg
Instruccion_LOAD.jpg (32.51 KiB) Visto 7691 veces


Como se puede ver, los bits 7 y 6 indican el registro (A=0, B=1, C=2), los bits 5, 4 y 3 deben contener el valor 2 y los bits 2, 1 y 0 indican el modo de direccionamiento.

Así, para cargar en el registro B el valor de la posición de memoria 129d, cuyo mnemotécnico corresponde a “LOAD B,201”, se debe codificar de la siguiente manera:

Byte 1: 01 (Registro B) 010 (Instrucción LOAD) 100 (Modo Memory) = 01010100b = 84d = 124o
Byte 2: 10000001b = 129d = 201o

Al usar el KENBAK-1 se deberían introducir la secuencia de unos y ceros del formato binario en el teclado y pulsar la tecla STORE al finalizar cada byte.


INSTRUCCIONES DEL KENBAK-1
El sistema reconoce un total de 14 instrucciones distintas, con sus distintas opciones.

Para conocer el funcionamiento de las instrucciones se recomienda descargar una copia del manual original en formato PDF, pero aquí tenéis un breve resumen:

ADD
Suma al registro indicado un valor numérico o un valor de la memoria, en función del método de direccionamiento seleccionado.

Formato: ADD Dir/Op (2 bytes)

SUB
Resta del registro indicado un valor numérico o un valor de la memoria, en función del método de direccionamiento seleccionado.

Formato: SUB Dir/Op (2 bytes)

LOAD
Cargar en el registro indicado un valor numérico o un valor de la memoria, en función del método de direccionamiento seleccionado.

Formato: LOAD Dir/Op (2 bytes)

STORE
Guarda el valor del registro indicado en una posición de memoria, en función del método de direccionamiento seleccionado.

Formato: STORE Dir/Op (2 bytes)

AND
Realiza un AND lógico entre el registro A y un valor o posición de memoria, en función del método de direccionamiento seleccionado.

Formato: AND Dir/Op (2 bytes)

OR
Realiza un OR lógico entre el registro A y un valor o posición de memoria, en función del método de direccionamiento seleccionado.

Formato: OR Dir/Op (2 bytes)

LNEG
Realiza el complemento aritmético entre el registro A y un valor y un registro o posición de memoria, en función del método de direccionamiento seleccionado.

Formato: LNEG Dir/Op (2 bytes)

JUMP
Permite saltar a una dirección de memoria de forma condicional o incondicional.

Las condiciones admitidas son las siguientes: “=0”, “<>0”, “<0”, “>0” y “>=0”.

La opción “Jump&Mark” (bit 4 = 1) simula una especie de salto a subrutina, guardando en el primer byte de la posición de destino la dirección de origen para poder volver al finalizar la subrutina mediante un salto indirecto del valor de esa dirección.

Formato: JUMP Dir (2 bytes)

SKIP
Comprueba el bit indicado de una posición de memoria indicada y si coincide con el valor seleccionado salta la siguiente instrucción de dos bytes del programa (Registro P = P+2). Sino coincide sigue con la ejecución normal del programa.

Formato: SKIP Dir (2 bytes)

SET
Pone a 0 o 1 el bit indicado de una posición de memoria indicada.

Formato: SET Dir (2 bytes)

SHIFT
Realiza un desplazamiento a derecha o izquierda de entre 1 y 4 bits del registro A o B.

Si el desplazamiento es hacia la izquierda se rellenan los bits de la derecha con 0, y si es a la derecha se rellenan los bits de la izquierda con el valor del bit 7.

Formato: SHIFT (1 byte)

ROTATE
Realiza una rotación a derecha o izquierda de entre 1 y 4 bits del registro A o B.

Los bits que desaparecen por un lado aparecen por el otro.

Formato: ROTATE (1 byte)

NOOP
Incrementa el registro P en 1, sin afectar en nada a la ejecución del programa.

Formato: NOOP (1 byte)

HALT
Incrementa el registro P en 1 y detiene la ejecución del programa.

Formato: HALT (1 byte)


EMULADORES
Existen dos emuladores conocidos de este sistema.

The Ultimate Kenbak-1 Emulator (KenbakEm Ver 1.1)
Este emulador, programado por Frode van der Meeren en el año 2008, está programado en ensamblador x86 y es un fichero con extensión .COM que ocupa solo 4KB.

El principal problema es que se ha emulado el sistema de entrada de datos original. Esto lo hace poco práctico.

El programa no emula la velocidad del sistema original pero durante la ejecución permite modificarla, pulsando las teclas “+” y “-“.

Por otro lado, permite la grabación de hasta 10 programas, pulsando las teclas F1-F10.

Emul_DOS.jpg
Emul_DOS.jpg (16.99 KiB) Visto 7691 veces


Kenbak-1 JS
Este emulador funciona en un navegador de Internet y está programado enteramente en javascript.

La opción “Memory Loader” facilita la introducción de programas al poder introducir una lista de valores en formato octal. También hay la opción de introducir los valores a través de las teclas, como en el equipo original.

Por otro lado nos permite ver los valores de los 256 bytes de la memoria RAM, y destaca las posiciones usadas por el propio sistema.

También tenemos la opción de definir “Break Points” para detener el programa en unas direcciones determinadas de memoria.

Y para terminar, nos permite definir la velocidad de ejecución de los programas, aunque no emula la velocidad real.

Por el contrario, no permite guardar programas, salvo que guardemos los códigos introducidos en “Memory Loader” como un archivo de texto desde un programa externo, tipo “Bloc de notas”.

El principal defecto encontrado es que hay alguna instrucción que no se emula correctamente.

Emul_JS.gif
Emul_JS.gif (32.05 KiB) Visto 7691 veces


EL ENTRENADOR DE SCAINET SOFT
Debido a que el funcionamiento de ninguno de los dos emuladores me acababa de convencer, en el año 2012 decidí programar mi propio entrenador/emulador.

Este programa es un emulador que nos permite programar un KENBAK-1 de una forma rápida y sencilla.
Las 17 instrucciones de este sistema han sido emuladas correctamente.

KENBAK-1.gif
KENBAK-1.gif (17.3 KiB) Visto 7691 veces


En pantalla aparecen 8 cuadrados grises que representan las 8 luces disponibles en el KENBAK-1 original. Estas luces hacen de display del sistema, y reflejan el contenido de la dirección de memoria 128 durante la ejecución del programa, o de la 255 durante la programación.

Debajo aparece una matriz de 16x16 que representan los 256 bytes de memoria disponibles. En esta matriz aparecen ciertos posiciones en distintos colores, correspondientes a los 9 bytes que utiliza el sistema para funcionar:

000) Registro A.
001) Registro B.
002) Registro X. Se puede usar para métodos de direccionamiento indexado.
003) Registro P. Indica la posición de memoria que se va a ejecutar.
128) Registro de salida. Contiene el contenido del display.
129) Flags Carry y Overflow del registro A.
130) Flags Carry y Overflow del registro B.
131) Flags Carry y Overflow del registro X.
255) registro de entrada. Se almacena el valor de las teclas pulsadas durante la programación.

También aparece un cursor marcando una dirección de memoria. Este cursor se puede mover libremente por la memoria mediante las teclas de los cursores.

A la derecha de la matriz aparecen 3 marcadores:
1) Modo de ejecución.
2) Dirección de memoria del cursor, con el valor en decimal, octal y binario.
3) Contenido de la posición de memoria del cursor, también en los tres sistemas.

Y para terminar, junto al display aparece una línea de entrada "INPUT". Esta línea nos permite comunicarnos con el entrenador mediante una serie de comandos a los que se accede pulsando una tecla.


Funcionamiento del entrenador
La barra inferior indica las teclas disponibles y la función que realizan.

Se debe pulsar la tecla Escape para salir de la opción activa.

V - Valor
Nos permite entrar un valor en la posición de memoria del cursor.

Los valores se pueden entrar de 3 formas distintas:
1) Octal: Valor de 3 cifras, con dígitos comprendidos entre 0 y 7. Opción recomendada.
2) Decimal: Introducir un punto y a continuación se introduce un valor entre 0 y 255.
3) Binario: Valor de 8 cifras compuesto de ceros y unos.

Cada vez que se introduce un valor correcto, el cursor avanza una posición, y los marcadores laterales indican los valores correspondientes.

R - RUN
Ejecuta el programa a partir de la posición de memoria indicada por el registro “P” (byte 3) hasta que encuentra un valor 000 (instrucción HALT).

Hay tres formas de ejecución distintas:
1) FAST: El programa se ejecuta a la máxima velocidad. No se corresponde con la velocidad original del KENBAK-1.
2) SLOW: El programa se ejecuta a una velocidad más lenta. Ideal para apreciar ciertos efectos en el display.
3) DEBUG: Se ejecuta una instrucción cada vez que se pulsa la tecla espacio.

Pulsar la tecla ESC para detener la ejecución del programa.

Esc - BREAK
Detiene la ejecución del programa.

Space - STEP
En el modo de ejecución DEBUG ejecuta una instrucción del programa y se detiene.

M - MODE
Cambia el modo de ejecución del programa. Hay tres modos: FAST, SLOW y DEBUG.

N - NEW
Borra el contenido de la memoria y queda listo para empezar a trabajar. Se pide conformidad.

L - LOAD
Carga un fichero que contiene un volcado de la memoria en el momento que se realizó la grabación. El fichero, con extensión KBK, debe estar en la carpeta del emulador. Se pide el nombre del fichero a cargar, sin extensión.

S - SAVE
Graba un volcado de la memoria en un fichero con extensión KBK. Pide el nombre del fichero, pero por defecto propone el último nombre introducido.

Q - QUIT
Salir del entrenador. Se pide conformidad.

CURSORES
Nos permiten desplazar el cursor por la matriz de la memoria.

TAB – BASE
Cambia el sistema con el que se muestran los valores de la matriz. Puede ser decimal o octal.


Instalación:
El fichero incluye el ejecutable, el código fuente en Q-BASIC y 4 ficheros KBK de ejemplo.

KENBAK-1_Trainer.rar
(36.17 KiB) Descargado 298 veces


Descomprime el contenido del fichero en una carpeta. El ejecutable es un EXE de MS-DOS y funciona sin problemas bajo MS-DOS, Windows y virtualizadores.

Primeros pasos:
Si quieres ejecutar los programas de ejemplo:

1) Ejecuta el EXE para entrar en el entrenador.
2) Pulsa "L". Pedirá el nombre del fichero a cargar.
3) Escribe "BERZERK" y pulsa RETURN. Aparecerá el contenido de la memoria en la matriz.
4) Pulsa "R" para ejecutar el programa.
5) Una luz blanca iluminará el display moviéndose de un lado al otro.
6) Pulsa “Esc” para detener el programa, “M” para modificar la velocidad y opcionalmente “R” para volver al paso 4.

Hay tres ficheros más: CYLON, COUNTER y SUMA.


PROGRAMANDO EL KENBAK-1
Este es el primer programa que he desarrollado en este sistema con la ayuda del entrenador.

Programa SUMA.jpg
Programa SUMA.jpg (48.86 KiB) Visto 7691 veces


Su funcionamiento es muy simple:
1) El primer bloque (dirección 004 - 015) llena 64 bytes de la memoria, desde la dirección 160d hasta la 223d con un número ascendente, desde el 1 al 64. Su usa el registro A como contador y el registro X como índice y contador del bucle.

program_1.gif
program_1.gif (18.07 KiB) Visto 7691 veces


2) El segundo bloque (dirección 016 – 031) es un bucle sin fin que va recorriendo las 64 posiciones de memoria e incrementa su valor en 1. Se usa el registro X como índice y contador del bucle, y el registro A para guardar el valor de la posición de memoria que se está incrementando. En el display se muestra el valor del registro A.

program_2.gif
program_2.gif (18.21 KiB) Visto 7691 veces


El programa siempre se ejecuta a partir de la dirección de memoria que indica el registro P (dirección 003d), con lo que para ejecutar el programa desde el principio se deberá introducir este valor en el registro.

El funcionamiento en el entrenador es curioso porque nos permite ver como va cambiando el contenido de la memoria, y como este cambio afecta a los flags y al display.

He probado el programa en mi entrenador y en el emulador en javascript y el funcionamiento es idéntico. La única diferencia es que el entrenador permite ver el contenido de la memoria en formato decimal o octal, y el emulador en javascript solo lo muestra en octal. Es más claro ver los valores en decimal.


Os invito a probarlo.
Buscando la IP de la W.O.P.R.

Avatar de Usuario
jotego
Atari 1040 STf
Atari 1040 STf
Mensajes: 657
Registrado: 16 Ene 2013, 23:25
Sistema Favorito: Atari ST
primer_sistema: Amstrad CPC
consola_favorita: Sony PlayStation 2
Primera consola: Atari Lynx
Ubicación: Valencia (España)
Gracias dadas: 27 veces
Gracias recibidas: 44 veces
Contactar:

Re: KENBAK-1: El primer ordenador personal

Mensajepor jotego » 27 Jun 2014, 13:35

¡Qué interesante! Es una buena muestra de cómo las ideas y los productos no aparecen de un día para otro. Ahí ya hay un código de instrucciones, flags, memorias... conceptos básicos de un ordenador aunque no haya CPU propiamente dicha.

Avatar de Usuario
Joss
Atari 1040 STf
Atari 1040 STf
Mensajes: 930
Registrado: 17 Jul 2012, 20:07
Gracias dadas: 14 veces
Gracias recibidas: 2 veces

Re: KENBAK-1: El primer ordenador personal

Mensajepor Joss » 27 Jun 2014, 20:39

Coincido. Super interesante! Gracias por la descripción y el aporte :)

Avatar de Usuario
Lord British
Amiga 2500
Amiga 2500
Mensajes: 4297
Registrado: 27 Jul 2010, 12:20
Gracias dadas: 15 veces
Gracias recibidas: 45 veces

Re: KENBAK-1: El primer ordenador personal

Mensajepor Lord British » 27 Jun 2014, 22:26

Muy interesante y ademas en Español, que casi todas estas cosas estan en ingles.

Luna
Amiga 1200
Amiga 1200
Mensajes: 1974
Registrado: 01 Jun 2013, 16:21
Sistema Favorito: PC
primer_sistema: ZX81
consola_favorita: Sega Saturn
Primera consola: Atari 2600
Ubicación: Republica de catalunya
Gracias dadas: 30 veces
Gracias recibidas: 29 veces
Contactar:

Re: KENBAK-1: El primer ordenador personal

Mensajepor Luna » 28 Jun 2014, 18:42

Que pasa si le haces sumar el valor numerico de un byte de memoria de manera que el resultado sea mayor a 255? ¿El resultado pasa a ocupar 2 bytes? y si ese segundo byte estaba previamente ocupado por una parte del programa? ¿abre un agujero de gusano?
Me ¿Autorespondo? 253 + 5 =002 (al volver a 0, el 0 que me olvidé contar)
Última edición por Luna el 01 Jul 2014, 13:13, editado 1 vez en total.

dancresp
Amiga 1200
Amiga 1200
Mensajes: 1393
Registrado: 23 Dic 2008, 17:53
Sistema Favorito: MSX
primer_sistema: ZX81
Primera consola: Atari 2600
Gracias dadas: 3 veces
Gracias recibidas: 20 veces

Re: KENBAK-1: El primer ordenador personal

Mensajepor dancresp » 29 Jun 2014, 22:24

Luna escribió:Que pasa si le haces sumar el valor numerico de un byte de memoria de manera que el resultado sea mayor a 255? ¿El resultado pasa a ocupar 2 bytes? y si ese segundo byte estaba previamente ocupado por una parte del programa? ¿abre un agujero de gusano?
Me ¿Autorespondo? 253 + 5 =003 (al volver a 0)

Bueno, en el fondo un byte es como el contador de vueltas de un casete.
Cuando llega al máximo se vuelve a poner a cero y sigue, con el detalle de activar una banderita (flag) que nos indica si se ha producido ese desbordamiento.

y 253+5 no son 3, son 2: 253, 254, 255, 0, 1 y 2.
Buscando la IP de la W.O.P.R.


Volver a “Sistemas Varios”

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 9 invitados