viernes, 8 de julio de 2016

Preservación de máquinas (VI): Emulador Kenbak-1 Interface

 Índice de entradas de Preservación de máquinas 
Colabora con el proyecto: Simplemente haz click de vez en cuanto en los anuncios, no te cuesta nada y me ayudas con los costes del proyecto. Cada 11 click aportas un euro.


Como primer paso voy a desarrollar el interface para el emulador del Kenbak-1, esto me permite conocer a fondo como se comporta la máquina, y el manejo de su interface, en este caso los botones y luces frontales.

El desarrollo lo quiero hacer en Visual Studio, usando Visual Basic, que mejor que el viejo y querido Basic para emular estas máquinas, aunque luego lo pasaré a C para poder subirlo al Arduino.

El interface es muy simple, se trata de poner un fondo con la máquina, y sobre el ubicar para cada bombilla un objeto imagen, que puedo ir alternando entre dos imágenes, una de luz encendida y otra de luz apagada. Los interruptores lo mismo, son objetos imagen que voy alternando entre las dos posiciones del interruptor. Los botones son objetos button que ya tienen un pequeño efecto cuando los pulsas por no complicarme, aunque podrían ser imágenes igualmente. En los botones voy a activar que con clic se pulsan, y con doble-clic se mantienen pulsados hasta otros clic, de esta forma se pueden pulsar dos botones a la vez, lo que hace falta para la ejecución paso a paso.

Con esto tengo el interface del aparato, pero por comodidad voy a poner también los registros visibles y la memoria debajo, con botones para verla en octal, decimal, hexadecimal, binario, o no verla. Así es mas sencillo meter programas para el aparato. Al disponer solo de 256 posiciones de memoria, caben todas en una sola pantalla, pero no voy a poner 256 objetos TextBox durante el diseño, y responder a 256 eventos de validación diferentes en ellos, sino que los monto en tiempo de ejecución con un bucle y los enlazo a un solo manejador de eventos de validación, así es mas rápido y práctico. Cuando arranca el emulador la memoria está oculta por defecto, pero he puesto los registros principales visibles de todas formas.

Emulador sin memoria visible

Pulsando cualquiera de los botones se abrirá la inspección de la memoria y este es el resultado de momento, pues estoy pensando en otras alternativas para que se vea el código del programa, pero así cabe bien en una pantalla de ordenador actual.

Emulador con la memoria visible

Para los programadores, este es el trozo que crea los textBox de las posiciones de memoria, enlaza el evento de validación para poder editar sin problemas, y los añade al formulario:

'Creo los TextBox para presentar la memoria
For Col = 0 To 15
    For Lin = 0 To 15
        'Calculo la posición para evitar hacerlo muchas veces, y creo el TextBox con su manejador de evento
        Dim nro As Integer = Lin * 16 + Col
        
        Dim tb As New TextBox

        AddHandler tb.Validating, AddressOf bt_Validating

        'Ponemos colores especiales en estas posiciones de memoria
        Select Case nro
            Case posRegA, posRegAOC : tb.BackColor = col_RA
            Case posRegB, posRegBOC : tb.BackColor = col_RB
            Case posRegX, posRegXOC : tb.BackColor = col_RX
            Case posPC : tb.BackColor = col_PC
            Case posOUT : tb.BackColor = col_OU
            Case posIN : tb.BackColor = col_IN
        End Select
        
        'Ajusto el TextBox
        tb.Font = New System.Drawing.Font("Microsoft Sans Serif", 
                                          8.0!, 
                                          System.Drawing.FontStyle.Regular, 
                                          System.Drawing.GraphicsUnit.Point, 
                                          CType(0, Byte))
        tb.Location = New System.Drawing.Point(Base_Columna + (Col * tbAncho), 
                                               Base_Linea + (Lin * tbAlto))
        tb.Name = "M" + (nro).ToString.PadLeft(3, "0"c)
        tb.Size = New System.Drawing.Size(tbAncho, tbAlto)
        tb.TabIndex = 102 + (nro)
        tb.Text = tb.Name
        
        'Añado el TextBox al control que presenta la memoria
        Me.gbMemoria.Controls.Add(tb)
        
        'Me lo guardo en el arreglo
        tbMemoria(nro) = tb
        
    Next
Next

1 comentario: