Hoy en día cualquiera puede usar una placa Arduino o similar para programar una seria de relés que controlan artefactos eléctricos a voluntad… Pero ¿dónde está la gracia en eso?
Así que hace varios meses me planteé la idea de controlar artefactos eléctricos con un computador antiguo y nada mejor que usar el querido Windows 3.11 para trabajo en grupo (Pensé en usar Turbo C en MS-DOS pero mejor dejo esa parte a alguien mejor en programación)
¿De dónde viene la idea?
La idea viene de un proyecto muy antiguo mío, de hecho el proyecto para el cual diseñé mi primera placa de circuito impreso dibujando a mano y usando Paintbrush para el esquemático, más de 20 años atrás. Quería conseguir el mismo objetivo pero en ese tiempo usar un computador era legítimamente mi única opción.

¿Cómo funciona?
La premisa de la implementación es bastante simple, se usa el puerto paralelo del computador (el que se usaba para impresoras), el cual tiene al menos 8 bits de datos controlables por el computador. Estos bits se pueden escribir mediante una operación de IO a la dirección 378h y voilá.
Como Windows 3.11 no tiene nimiedades como control de acceso a periféricos y ridiculeces de seguridad, es tan simple como mandar una secuencia de comandos en assembler y se puede controlar estos bits a voluntad.
En el mundo exterior, basta con conectar estos bits a un buffer (en mi mente aún resuena la recomendación que me dieron en su tiempo 74LS244, 74LS244, 74LS244… No tenía donde anotar así que lo memoricé) y desde el buffer a unos transistores que actúan una serie de relés.
Este último circuito, algo que se consigue por unos pocos dólares hoy en día en Aliexpress, lo tuve que diseñar y construir a mano. Lo bueno es que en su tiempo descubrí también que podía usar el puerto 379h para controles adicionales, así podría decidir si los relés eran controlados localmente con switches físicos, o desde el computador.
En fin, dejando los caminos sinuosos de un viejo recordando sus historias, la otra parte de la implementación es, por supuesto, un software capaz de programar eventos de acuerdo al horario. Esta última parte nunca logré implementarla completamente cuando estaba en el colegio, así que será el foco del proyecto actual.
Programando con Windows 3.11
El software preferido para mi programa es Borland Delphi… No Delphi 4, 6, 7, XE ni mucho menos esta cosa de Embarcadero, símplemente Delphi.

Debo decir, para mi sorpresa, de que Delphi es extremadamente usable, estable y rápido. Una excelente experiencia y documentación. Con tanta versión y años que han pasado, no se pueden obtener consejos útiles de Stack Overflow, o ChatGPT o Claude… Ni el Internet era suficientemente popular para que hubiera material.

A lo anterior agregaría también que trabajar con Windows 3.11 y manejar archivos en disquetes no es tan terrible como suena inicialmente. De hecho Windows ya tenía varias características útiles, como mover el cursor de a palabras en un editor de texto con las flechas del teclado cuando está presionada la tecla Control (¿sabía que se podía hacer eso?), capturas de pantalla, cambiar de ventana con Alt+Tab, etc. Lo que más eché de menos fue algún mecanismo de control de versión, aunque Delphi tiene un sistema razonable para guardar copias de seguridad de la versión previa de cada archivo.
Implementación del Programa
La parte fundamental del programa es el control del puerto paralelo, que se hace directamente en assembler con las siguientes funciones:

La función PortOut fucniona de la siguiente manera:
- Toma el valor de IOPort y lo guarda en el registro DX
- Toma el valor de la variable Value y la guarda en el registro AL
- Finalmente ejecuta la instrucción de E/S (o I/O) de escribir en el puerto en DX el valor de AL.
La función PortIn por su parte:
- Igual que la función anterior, guarda el número de puerto que queremos en DX.
- Ejecuta la instrucción de E/S de leer del puerto definido por DX y poner el valor en AL.
- Finalmente escribe en la variable Result el contenido de AL.
Todo esto sin ningún tipo de chequeo de que el programa tiene las atribuciones de acceder directamete al hardware del sistema. Hermoso!! Hasta que un programa tenga algún error que le haga escribir donde no deba y se caiga todo por supuesto.
Lo anterior va de la mano con las funciones para leer y escribir bits individuales para controlar salidas particulares del puerto de la impresora. Estas funciones usan PortIn y PortOut.
Finalmente el resto del código es un sistema de programación por día y hora que puede almacenar una cantidad de eventos y los va ejecutando secuencialmente a medida que el día de la semana y la hora coinciden. Generando un itinerario para el control de artefactos que se repite de manera semanal.
El código completo está disponible en GitHub, aunque no creo que el sistema de eventos sea el más elegante o inteligente la verdad… Al menos funciona para lo que quiero demostrar 🙂
La interfaz gráfica
Quizás el aspecto más interesante de usar Windows 3.11 y Delphi es la interfaz gráfica, que permite controlar manualmente los 8 canales disponibles y además agregar los eventos programados.
