Otros sitios...

Búsqueda

Antispam

Programación de aplicaciones NitrOS-9 en ensamblador

June 26th, 2008 by Jorge Machin

Muchas de las primeras máquinas de 8 bits de antaño e incluso sistemas embebidos, rutinas de criptografía o de mátematicas de la actualidad se programan en lenguaje ensamblador para sacar la máxima velocidad a los microprocesadores.

La CoCo y el lenguaje de máquina
La CoCo y el lenguaje de máquina
según el manual del usuario

Obviamente al ser de bajo nivel es un lenguaje muy talachudo en el que uno debe ser muy ordenado y tener en la mente muy claro lo que se está haciendo. No he tenido la oportunidad de utilizarlo profesionalmente desde que no programo microcontroladores pero de vez en cuando leo, modifico o hago algunos scripts para mi vieja computadora de 8 bits; ya sea para su sistema operativo NitrOS-9 o en el mismísimo DECB.

Programa "Hello World"

Mi primer programa en ensamblador del microprocesador 6809 en NitrOS-9 fue el clásico "Hello World":

* Program hello

              nam    hello

* Add OS-9 definitions

              ifp1
              use /dd/defs/defsfile
              endc

tylg          set    Prgrm+Objct
atry          set    ReEnt+rev
rev           set    $01
edition       set    $01

              mod    eom,name,tylg,atrv,start,size

              org    0
              rmb    450
size          equ    .

name          fcs    /hello/
              tcb    edition

* Text to output:

hello         fcc    "Hello World!"
crtn          fcb    C$CR
heLen         equ    *-hello

* Program start

start         lda    #1            send to stdout
              leax   >hello,pcr    address of the data to write
              ldy    #heLen        number of bytes to write
              os9    I$WritLn

* Program exit

              clrb                  no errors
 end          os9       F$Exit      terminate

              emod
              equ       *
              end

El cual se compila con el siguiente comando:

asm hello.asm -o #16k

Como se puede ver en el código, al igual que muchos sistemas operativos como el MS-DOS, mucha de su programación consiste en llamar rutinas (os9) del sistema operativo, llamadas al BIOS o interrupciones del microprocesador, por lo que la programación puede llegar a ser menos complicada de lo que parece.

Técnicas especiales

Al programar en ensamblador en NitrOS-9, se debe siempre escribir código independiente de la posición porque el sistema operativo asigna las direcciones dependiendo de la memoria disponible. Esto se hace utilizando los comandos BRA, LBRA, BSR y LBSR. Para obtener las direcciones de constantes y tablas, se debe usar instrucciones LEA en lugar de las instrucciones inmediatas LD.

Para saber más...

La documentación con las especificaciones de las llamada al sistema, las podemos encontrar en el manual OS-9 Technical Information y la información sobre el uso del ensamblador esta disponible en el manual OS-9 Program development.

Posteado en Color Computer | No hay comentarios »

Proyección geométrica plana (Parte I)

May 18th, 2008 by Jorge Machin

Cuando era niño, programaba juegos en mi compú donde todo vivía en un mundo de dos dimensiones. No estaba tan mal porque las gráficas en ese entonces eran muy sencillas. De hecho, una nave espacial solía ser un aburrido cuadro rojo. Sin embargo, conforme fuí aprendiendo física, me fue necesario construir un mundo tridimensional, no sólo para hacer juegos, sino también para hacer mis cálculos y simulaciones.

Antes de consultar libros sobre el tema, intenté resolver el problema por mi cuenta. Yo lo visualizaba como convertir un espacio 3D (el mundo) a un espacio 2D (la pantalla). La manera más sencilla que se me ocurrió fue simplemente proyectar todos los puntos a una pared imaginaria en frente de mí. Las proyecciones podían ser de forma recta ignorando simplemente el eje Z; pero así no es muy atractivo porque no se crea la sensación de perspectiva. Es mejor proyectar con un ángulo imaginando que es el ángulo de visión del ojo. Mi primera representación (aplanada) fue esta:


Diagrama 1

Nuestro observador esta en el origen y mirando hacia Z, P es el punto que queremos proyectar, X es el punto proyectado y d es la distancia a nuestra pantalla imaginaria.

Ahora, ni modo, a hacer álgebra. Por triángulos semejantes tenemos:

frac { X_p } { sqrt { d^2 + {X_p}^2} } = frac { P_x } { sqrt { {P_x}^2 + {P_z}^2}

Haciendo un lado los pasos engorosos, despejamos Xp:

X_p = frac { P_x} { P_z } d

Por analogía, encontramos Yp:

Y_p = frac { P_y} { P_z } d

De las dos ecuaciones anteriores, es fácil deducir que d es matemáticamente un factor de escala y que al usar estas ecuaciones, los objetos se ven más grandes conforme se acercan al observador y reducen su tamaño al alejarse; sin importar si nuestros puntos se encuentran antes o después del punto d.

Pero no hemos terminado; nuestra pantalla hasta ahora esta en "coordenadas mundiales" las cuales no tienen porque concordar con las coordenadas de nuestra pantalla. De hecho, las coordenadas de nuestra pantalla son siempre positivas y el origen esta en la esquina superior izquierda. Es necesario hacer la transformación de coordenadas mundiales a coordenadas de la pantalla.


Diagrama 2

Con un poco de observación, se puede encontrar el factor de conversión para el eje x:

S_x = S_{xmin} + ( S_{xmax} - S{xmin} ) frac { X_p - W_L} { W_R - W_L }

En la mayoría de los casos se puede suponer para Sxmin un valor de cero:

S_x = S_{xmax}  frac { X_p - W_L} { W_R - W_L }

Si queremos manejar la pantalla mostrando 4 cuadrantes, entonces W_R = -W_L:

S_x = S_{xmax}  frac { X_p + W_L} { 2 W_R }

De forma similar para el caso del eje y:

S_y = S_{ymin} + ( S_{ymax} - S{ymin} ) frac { W_T - Y_P} { W_T - W_B }

De igual forma, se puede suponer para Symin un valor de cero:

S_y = S_{ymax} frac { W_T - Y_P} { W_T - W_B }

Para acomodar en cuatro cuadrantes, W_B = -W_T:

S_y = S_{ymax} frac { W_T - Y_P} { 2 W_T }

Conclusiones:

Ya con esto podemos armar una ciudad de casas de cerrillos con fórmulas con operaciones muy sencillas. Incluso corren relativamente rápido en las antigüas máquinas de 8 bits:


Aplicando las formulas en una computadora de 0.895 MHz

Las fórmulas presentadas aquí son muy limitadas, pero demuestran lo fácil que puede ser trabajar la tercera dimensión. En posts posteriores se trabajarán más para quitar las restricciones autoimpuestas como que el plano de proyección este únicamente perpendicular el eje Z y que el centro de proyección se encuentre únicamente en el origen.

Posteado en 3D, Color Computer, Matemáticas, Maxin Lab | No hay comentarios »

Emulando a la Color Computer 3 (parte IV)

May 4th, 2008 by Jorge Machin

Aunque con un emulador es suficiente usar imágenes de diskettes para trabajar o jugar un rato, no hay nada mejor que tener un sistema con un disco duro donde podamos ordenar en un solo lugar todos nuestros programas y sentir que nuestra CoCo podría rivalizar en funcionalidad a nuestra PC... Bueno, debo de reconocer que a veces algunas cosas me apasionan más de la cuenta, pero la Color Computer es considerada por muchos como la computadora de 8 bits más poderosa que ha existido y si la han utilizado sabrán a que me refiero.

Agregando un disco duro a nuestro emulador

La Color Computer real manejaba diskettes por medio de una "disketera" conectada por medio de un cartucho, el cual tenía un ROM con un "sistema operativo de disco - DOS" que extendía el lenguaje BASIC con comandos y rutinas en lenguaje de máquina que daban el soporte básico para el manejo de archivos en diskettes de 5.25 pulgadas (de un sólo lado).

Que yo sepa, la Radio Shack nunca sacó a la venta discos duros para la Color Computer; sin embargo, otras compañías diseñaron interfaces para soportarlos con versiones adaptadas de su sistema operativo de disco.

Por lo tanto, de igual forma debemos sustituir el Disk Extended Color Basic en el archivo zip con los ROMs en el emulador; es decir, debemos cambiar el archivo DISK11.ROM en el archivo coco3.zip por uno que nos de soporte para disco duro. Afortunadamente, Robert Gault, tiene preparado en su página de Internet el ROM RGBDOS modificado para usarse en emuladores y todas las herramientas necesarias para echar andar nuestro disco duro virtual. La página de Internet de Robert Gault donde se encuentra el RGBDOS es http://home.att.net/~robert.gault/Coco/Downloads/Downloads.htm

Una vez bajado el archivo RGBDOS.ZIP es necesario quitarle los dos primeros bytes al archivo DISK.ROM porque está preparado para el emulador de Jeff Vavasour. El nuevo archivo DISK.ROM debe sustituir al archivo DISK11.ROM (DECB) dentro el archivo coco3h.zip.

Al iniciar MESS, se comparan la checksums de los ROMs, por lo que es muy probable que nos marque un error de CRC al correrlo la primera vez. En la configuración del archivo se puede modificar para evitar el warning. La pantalla de inicio, ahora es esta:

RGB-DOS
El RGB-DOS despliega un nuevo mensaje de bienvenida

El siguiente paso es crear el archivo donde se va a contener nuestro disco virtual. Esto se hace con la opción Devices/Virtual Hard Disk/Create y dándole un nombre al archivo. Al reiniciar, ya no aparecerá el mensaje de error que nos informa sobre la falta del disco duro.

Si queremos que el disco duro se monte automáticamente cada que iniciemos MESS, debemos agregar su ruta al archivo de configuración cfg/coco3h.cfg.

Ahora para inicializar el disco duro seguimos los siguientes pasos:

Paso 1: Montamos el disco TOOLS.dsk en la unidad de diskettes 0 y el NitrOS9boot.os9 en la unidad de diskettes 1. Estas dos imagenes de disco las podemos encontrar en el archivo RGBDOS.ZIP.

Paso 2: Accedemos a los diskettes ejecutando el comando DRIVE OFF.

Paso 3: Cargamos y ejecutamos el programa CREATE.BAS (LOAD "CREATE.BAS" y RUN ). Después de unos minutos nos habrá creado 255 diskettes virtuales y aumentado nuestro archivo vhd a 128 MB aproximadamente. Cada disco virtual es accesible con el comando DRIVE.

Paso 4: Sustituimos el disco TOOLS.dsk por nuestro disco de Sistema de NitrOS-9. Activamos nuevamente las unidades de diskette con DRIVE ON y booteamos desde él con el comando DOS.

Paso 5: Formateamos el disco duro con los siguientes comandos:

load /d1/hdrive
iniz /h0
format /h0

Paso 6: Se copian los archivos del disco del sistema con la siguiente orden:

chd /d0; dsave -s48 /h0 ! shell -p

Paso7: Reseteamos y ahora nos aparecerá un menú del cual abandonamos con la tecla escape. Colocamos nuevamente el disco Tools.dsk en la unidad de discos 0 y ejecutamos el programa link.bas dando como parámetro el número 254 para el número de disco de arranque.

Paso 8: Probamos bootear NitrOS-9 con el comando DOS 254 y ¡ya tenemos nuestro disco duro!.

Posteado en Color Computer, Emuladores | 1 Comment »

Emulando a la Color Computer 3 (parte III)

April 27th, 2008 by Jorge Machin

Ahora que podemos emular a la Color Computer en Windows o en Linux, podemos divertirnos por horas y horas; ya sea jugando con los videojuegos de antaño, trabajando con sus aplicaciones o programando como en los buenos tiempos. Pero primero es necesario hacer nuestra lista de sitios de donde podemos obtener recursos.

Algunos sitios importantes de la comunidad

La comunidad en Internet de la Color Computer es más grande de lo que se pudiera imaginar. Es fácil encontrar nuestros programas favoritos de antaño e incluso encontrar nuevos incluso con técnicas de programación actuales. Esta es la lista de los sitios que considero de visita obligada:

- Repositorio RTSI

Es una colección muy grande de programas freeware para OS-9 y NitrOS-9 de todo tipo.

- CoCo3.com

Es el sitio donde se reunen la mayoría de las personalidades del mundo de la Color Computer para ayudar y compartir sus proyectos. Su visita es altamente recomendada.

- Lista de juegos de L. Curtis Boyle

Aquí se puede encontrar una recopilación de los juegos más famosos de la Color Computer. Muchos de ellos se pueden bajar con el permiso expreso de los programadores.

- Maltedmedia

En este repositorio se pueden encontrar una enorme cantidad de manuales.

- Archivos Coco Downunder

Otro repositorio con manuales y programas.

NitrOS-9

NitrOS-9 es una versión moderna del sistema operativo OS-9 de Microware que vendía la Radio Shack para darle un carácter profesional a su computadora casera. Esta escrito por varios de los programadores originales y es compatible a nivel binario con su antecesor e incluso tiene resuelto muchos bugs y problemas propios de las computadoras de generación pasada como el apocalíptico Y2K.

Se puede bajar las imágenes de diskette en su sitio oficial o desde sourceforge. Para usarlas con MESS es necesario cambiarles la extensión a .os9 a todos los archivos .dsk. Con eso ya están listas para "bootear" con el comando DOS del DECB.

Discos de sistema

Quizás el primer paso con Nitros-9 es crear un disco de arranque para hacer pruebas en él. Obviamente la velocidad de los diskettes en el emulador es mayor que en una Coco real porque estamos usando en realidad el disco duro de la computadora. No es raro que al crear y manejar archivos sea preferible usar el emulador a menos que tengamos una interfase SuperIDE de Cloud09.

Para crear un disco de arranque se siguen los siguientes pasos:

Paso 1: Crear el archivo que va a ser nuestra imagen con la opción Devices->Floppy #1->Create, dándole un nombre con extensión .os9 y eligiendo el tipo CoCo OS-9 disk image.

Los primeros diskettes de la color computer estaban organizados en 35 pistas con 18 sectores de 338 bytes de los cuales 256 eran para datos. Obviamente al haces 35*18*256, nos da la capacidad de 161,280 bytes.

En NitrOS-9 es común usar una geometría de 40 pistas de 18 sectores de 256 bytes de datos y dos lados que da como capacidad 40*18*256*2 ó 368640 (360 KB). Es recomendable usar esa geometría en NitrOS-9.

Paso 2: En el directiorio /d0/nitros9/6809l2/scripts existe un script llamado mb, el cual tiene automatizado el proceso de crear un disco de arranque. Sólo es necesario cambiarse a el y ejecutarlo.

Manejando ventanas simultaneas con procesos diferentes

Tanto NitrOS-9 LII como el venerable OS-9 LII permiten manejar hasta 7 ventanas que se pueden acceder como dispositivos con una denominación que va del /w1 al /w7. En cada una de ellas podemos correr procesos diferentes o abrir terminales sin el riesgo de que se llene de basura como ocurriá con las versiones del LI.

Para crear una ventana se utiliza el comando wcreate:

wcreate /dispositivo tipo posx posy tamx tamy color_fondo color_fuente color_borde

Donde el tipo de ventana puede ser cualquiera de estos:

255 Ventana que se despliega actualmente
00 Ventana del proceso actual
01 40 x 24 8 colores texto.
02 80 x 24 8 colores texto.
05 640 x 192 2 colores gráficas.
06 320 x 192 4 colores gráficas.
07 640 x 192 4 colores gráficas.
08 320 x 192 16 colores gráficas.

Y los números de los colores son los siguientes:

00 y 08 Blanco
01 y 09 Azul
02 y 10 Negro
03 y 11 Verde
04 y 12 Rojo
05 y 13 Amarillo
06 y 14 Magenta
07 y 15 Cian

Un ejemplo para crear 3 ventanas con una terminal en cada una en una misma pantalla se puede hacer de esta forma:

wcreate /w7 -s=2 0 12 80 12 00 01 00
shell i=/w7&
--> Ahora nos cambiamos de ventana con la tecla inicio
wcreate /w6 -s=0 0 0 40 12 04 05 00
shell i=/w6&
wcreate /w5 -s=0 40 0 40 12 02 03 00
shell i=/w5&

Lo cual fue algo que me dejó con la boca abierta hace 20 años y no me cansaba de aburrir a las visitas enseñandóles como corría 3 programas en BASIC compilado al mismo tiempo. Como se puede adivinar, al igual que en Linux, el & es el separador de comandos es el que permite la ejecución concurrente.

Aquí dejo un vídeo que subí a Youtube para estar a tono de nuevo:

Unos años después tuve mi primera PC y su MS-DOS no podía hacer eso; a lo mucho podía hacer "task switching". ¡Ah! claro, se me olvidaba en la explicación; para eliminar una ventana se usa el comando ex.

Archivo de autoarranque

En NitrOS-9, el archivo que sirve como equivalente al autoexec.bat de MS-DOS se llama startup. Con un editor de texto como EDIT o TS/EDIT podemos hacer todas las modificaciones que queramos. Aunque, como siempre, la recomendación es sacarle un respaldo antes.

Ahora que si es más intrépido, puede modificar el el módulo sysgo con lenguaje ensamblador o C.

Posteado en Color Computer, Emuladores | No hay comentarios »

Emulando a la Color Computer 3 (parte II)

March 29th, 2008 by Jorge Machin

En este post se describe como instalar SDLMESS en Linux para emular a la Color Computer 3.

Simulando a la CoCo 3 en Linux
Nada de pantallas azules con la TRS-80 CoCo

Instalación

1. Bajar de http://rbelmont.mameworld.info/?page_id=163 los fuentes del emulador SDLMESS.

2. Desempaquetar los fuentes en /usr/local/share

unzip sdlmess0124.zip

3. Dentro del directorio sdlmess0124, asegurar que se tenga las comentado las siguientes banderas en el archivo makefile.sdl:

#BUILD_ZLIB = 1
#BUILD_EXPAT = 1

Pues la mayoría de los sistemas Linux ya tienen instaladas esas librerias. Adicionalmente se puede habilitar la siguiente bandera o modificarla con otra de acuerdo al microprocesador de nuestra máquina:

ARCHOPTS= -march=pentiumpro

4. Compilamos con:

make -f makefile.sdl

Nota:

Si se tiene un sistema de dos procesadores, se debe de agregar la bandera -j3 y -j5 si se utiliza quad-core.

5. Terminada la compilación, es necesario crear el directorio roms donde se deben colocar los archivos con los roms de las computadoras que queremos emular. Para nuestra Color Computer 3, se debee conseguir en internet los roms para MESS ( un archivo coco3h.zip o coco3.zip ) y correr de preferencia la emulación con el microprocesador mejorado 6309 porque de esta forma podemos utilizar practicamente todas las aplicaciones recientes y antigüas que encontremos en Internet.

6. Crear un archivo de configuración cocoh.ini en el directorio ini con los parámetros comunes de uso.

#
# CORE MISC OPTIONS
#
skip_gameinfo             1

#
# WINDOWS VIDEO OPTIONS
#
window                    1
maximize                  0

#
# MESS SPECIFIC OPTIONS
#
ramsize                   524288
skip_warnings             1

7. Agregar la ruta del emulador al $PATH.

8. El emulador se corre con el corre con el comando mess.

Algunas consideraciones

- Para acceder a los menúes de configuración es necesario presionar la tecla del bloqueo de desplazamiento (ScrLck) y después presionar la tecla TAB.

Posteado en Color Computer, Emuladores | 2 Comentarios »

« Anteriores