Programar puerto serie o puertos de expansion del Spectrum
Publicado: 27 Abr 2013, 09:28
por REHome
Hola:
Tengo un ZX Spectrum +2A 128K negro. Veo que tiene el puerto serie. Para comunicarlo con los demás dispositivos externo e incluso enviar mensajes por ahí para comunicarlo con otro Spectrum por poner un ejemplo.
Sólo necesito usar el pin 2, 3 y masa, con eso me basta para hacer experimento con él. Quiero hacerles unas preguntas.
1) El estandar en baudios del puerto RS232 es 9600 baudios. ¿Es capaz el Spectrum alcanzar esa velocidad?
2) ¿Qué velocidad alcanza como máximo?
Se que es para imprimir en la impresora, mi idea es enviar carácteres a la salida del RS232 del Spectrum, por ejemplo una letra como la "A", o que mensaje que diga: "Hola mundo".
Quiero hacer un ejemplo en Basic 128K que en pantalla mueste 4 letras, por ejemplo.
Pulse estas teclas: A) Envía la letra "A". B) Envía la letra "B". C) Envía la letra "C". D) Envía la letra "D".
En pantalla, abajo o arriba que ponga un texto que muestre. "Haz pulsado la tecla C".
No se programación Basic. ¿Es muy complejo de hacer?
Un cordial saludo.
Re: Programar puerto serie
Publicado: 27 Abr 2013, 11:04
por mcleod_ideafix
REHome escribió:No se programación Basic. ¿Es muy complejo de hacer?
Un cordial saludo.
Yo nunca he neceitado el puerto serie, así que no sé exactamente cómo se hace, pero eso debería venir explicado en el manual de BASIC del 128K. ¿Le has echado un vistazo?
Re: Programar puerto serie
Publicado: 27 Abr 2013, 11:24
por zup
Según el manual (inglés) del +3:
- FORMAT LINE <baudios> para cambiar velocidad. - FORMAT LPRINT "R" para que LPRINT imprima por puerto serie. - LPRINT "loquesea" para imprimir.
También puedes usar el canal "p" para mandar datos a la impresora, pero de entrada quizás no quieras complicarte tanto la vida.
Otras cosillas son que el +3 siempre usa hardware flow control, lo que significa que tu cable debería tener también DTR/DSR y CTS/RTS bien conectados (en el manual dicen cortocircuitar los pines 4 y 5). Lo que no veo por ninguna parte es cuántos bits transmite por byte, tipo de paridad y bits de parada (y cómo, si es que se pueden, cambiar estos parámetros).
En cuanto a velocidad... creo que el máximo absoluto teórico eran los 38400, pero algún bug (no sé si de firmware o de hardware) impedía utilizarlos. Me suena que en condiciones "normales" 19200 era el máximo, y en el manual dicen que 9600 es la velocidad por defecto (así que te debería funcionar siempre).
Re: Programar puerto serie
Publicado: 27 Abr 2013, 12:20
por REHome
Hola:
En el manual le he echado el ojo, no te explica demasiado. Como dices, falta la paridad, si son datos asíncronos o síncronos, cosas así. De todas maneras, con el HyperTerminal de Windows lo puedo averiguar haciendo pruebas. Intentaré aprender algo de BASIC para Spectrum, hasta la calculadora CASIO de 32K que tengo usa Basic.
10 FORMAT LPRINT "R" REM Seleccionar puerto serie. 20 PRINT "Zona de pruebas" 30 PRINT "A) Envía letra A." 30 PRINT "B) Envía letra B." 30 PRINT "C) Envía letra C." 30 PRINT "D) Envía letra D." 40 LPRINT "A"
No se como hacerlo en BASIC, voy a leer el manual. Tengo que lograr esto que si se hacer en C#. Hay que usar while para que leer completo el menú mostrado en pantalla y switch para escoger las opociones.
En resumen de lo que quiero hacer. En la pantalla debe aparecer el menú escrito arriba. Por cada botón que pulse, por ejemplo la letra "A" del teclado, envía por el puerto serie la letra "A", de paso, en la pantalla del TV debe aparecer este mensaje algo así:
Haz pulsado la letra "A".
Todo esto programado bajo BASIC del Spectrum. Ahora mismo echo un vistazo al libro para manejar bien la introducción de datos como entrada y salida, bueno, salida es PRINT, LPRINT para puerto serie. Los que quieran aprotar código en bienvenido.
Cuando consiga manejar el menú o envío de carácteres, me encargo de la electrónica que mostaré en fotos.
Gracias por reponder.
Re: Programar puerto serie
Publicado: 27 Abr 2013, 18:47
por zup
En el BASIC de Sinclair no existe un "caso de..." (switch), pero se puede simular. La forma más sencilla es poner algo así:
100 LET A$=INKEY$ 110 IF A$="A" OR A$="a" THEN LPRINT "A": GO TO 100 110 IF A$="B" OR A$="b" THEN LPRINT "B": GO TO 100 120 IF A$="C" OR A$="c" THEN LPRINT "C": GO TO 100 130 IF A$="D" OR A$="d" THEN LPRINT "D": GO TO 100 140 GO TO 100
El BASIC de Sinclair tampoco tiene bucles tipo "mientras" o "repetir... hasta". Solo dispones de bucles "para" (FOR) y de la sentencia GO TO. Como siempre, se pueden simular. Te pongo unos cuantos bucles de ejemplo (todo de memorieta):
Bucle FOR (muy diferente del de C), para 100 iteraciones
100 LET A$=INKEY$ 110 IF A$<>"" THEN LET A=A+1 120 PRINT A$; 130 IF A<>15 THEN GO TO 100
200 PRINT AT 10,10;A
Primero se inicializa el contador de iteraciones. El bucle "repetir" empieza en la línea 100 y el "hasta" está en la 130. El bucle cuenta cuántas veces tiene una tecla pulsada, y se repite hasta que ha acumulado 15 teclas (NOTA: Si pasas dos veces por el INKEY$ sin soltar la tecla, cuenta como dos pulsaciones). Por último, se imprime el valor de A (y si lo he hecho bien, debería ser 15).
100 IF A$<>"a" THEN GO TO 150 110 LET A=A+1 120 LET A$=INKEY$ 130 GO TO 100
200 PRINT AT 10,10;A
Las líneas 10 y 20 inicializan el contador A y esperan hasta que se pulse una tecla. El bucle "mientras" empieza en la línea 100 y acaba en la 130. Este bucle contará las vueltas que da mientras se esté pulsando la tecla "a". Del bucle se sale saltando a una línea por detrás de la última (la 130). En este caso, como la línea 150 no existe, seguiría por la 200 e imprimiría el contador de vueltas.
Espero no equivocarme en nada.
Re: Programar puerto serie
Publicado: 08 Dic 2013, 08:01
por REHome
Hola:
Muchas gracias zup por los códigos de arriba, también los que han aportado información. Tendré que ponerme en forma.
Retornando otra vez al Spectrum (por fin reparado del todo) quiero hacer un menú como indican arriba. Me he olvidado hasta de lo más básico y debo aprender de nuevo. Para los que tienen soltura en basic 128 K, quieran ayudar y hacer códigos, mi propuesta es esta. Hacer un buen menú principal del Spectrum, consiste en controlar le puerto serie del Spectrum para salidas y entradas de datos. En otras palabras, para jugar con él, curiosidad y hacer cosas nuevas que al parecer no usan mucho por estos foros el puerto serie, por ahora y que yo sepa.
Voy a controlar el puerto serie con un microcontrolador, usaré un display de 16x2 para probar y otro más grande 20x4. Por ahora estoy haciendo un simulador y funciona desde el PIC.
1) ¿De qué se trata? Consiste que desde el menú del Spectrum sea capaz de controlar el puerto serie.
2) ¿Qué controla Spectrum? Controla un microcontrolador, por ahora como salida y entrada de datos. Por ahora controla encender y apagar Led. También detecta cuando se ha pulsado un botón desde el PIC y Spectrum lee dichos datos y lo muestra en pantalla, todo por puerto serie.
3) ¿Para qué un LCD? Para mostrar información en tiempo real cuando un Led, ventilador, relés, motores, altavoz, sensores de temperatura y muchos dispositivos más. También se verán reflejados en el TV bajo del Spectrum.
4) ¿Por qué usar pantalla TV y LCD al mismo tiempo? No es necesario usar las dos pantallas al mismo tiempo. Spectrum podrá visualizar desde el LCD sin usar el TV el control del dispositivo a través del puerto serie. Si quieres que Spectrum haga de autómata o domótica y el PIC de actuador a las 24 horas como, por poner un ejemplo, tengo un jardín, al lado hay un cuarto de cristal con otro jardín solo para bonsáis. En él, Spectrum controla el regadía automático solo de 00:00 hasta las 02:00 de la mañana. Sabe cuando es de día o de noche. Cuando hace mucho calor o la temperatura ambiente es muy alta, si la temperaturta es alta, se abren las ventanas del techo con un motor dedicado a ello, se activan los ventiladores en su interior y mil cosas más, hasta donde te llega la imaginación. En el LCD solo se muestran números y letras, en el TV gracias al Spectrum, muestra dibujos, se puede hacer una simulación en dibujo con coordenadas, el jardín, abriendo las ventanas, ventilador girando, etc.
5) ¿Habiendo autómatas, Raspberry Pi y Arduino, para qué usar Spectrum? Por temas didacticos, a aprender nuevas experiencas con el tema de los ordenadores de antes y un largo etc.
6) ¿Spectrum controla o es el microcontrolador? Depende como lo programes, puede hacer Spectrum como autómata y microcontrolador como actuador. Sólo lo gobierna Spectrum. Spectrum puede hacer solo de consola para pulsar botones para dar órdenes, pero los timepos y programas el microcontrolador puede controlar Spectrum y el jardín si así se desea. El PIC controla la situación y envía datos al Spectrum que refleja en el TV. Hay muchas ideas en la imaginación. Como quieras programarlo. El PIC no necesita Spectrum para hacer el trabajo del jardín de los bonsáis si se le programa así.
7) Querido lector, ¿alguna pregunta o sugerencia?
Código en asm para el PIC16F887 para los que le pican la curiosidad. (Aún en proceso de desarrollo).
CBLOCK 0x20 TeclaPulsada ; Va a guardar el contenido de la tecla pulsada. MensajeApuntado ; Va a guarda la dirección del mensaje apuntado. Relays ; Estado de los relays Estado ; Estado general ENDC
ENTER EQU 0x0A ; Código de tecla "Enter" o "Retorno de Carro". CAMBIO_LINEA EQU 0x0D ; Código para el cambio de línea.
ORG 0x2100 ; Corresponde a la dirección 0 de la zona EEPROM ; de datos. DE 0x00,2,3
;**************************************************************************** ;* ZONA DE CODIGOS * ;****************************************************************************
;**************************************************************************** ;* Rutina Principal * ;****************************************************************************
ORG 0x00 goto Inicio
; ORG 4 ; Aquí se sitúa el vector de interrupción para ; goto LeeEntradasVisualiza ; atender las subrutinas de interrupción.
call Parado ; En principio todas las salidas deben estar movlw 0x02 call EEPROM_LeeDato movwf Relays call Ejecutar ; Enciende o apaga reles seleccionados call Mensaje_Reles call Visualiza ; Muestra mensaje en el display
call RS232_LineasBlanco ; Visualiza unas cuantas líneas en blanco call RS232_LineasBlanco ; para limpiar la pantalla. ; movlw b'10001000' ; Habilita la interrupción RBI y la general. ; movwf INTCON
; btfss PEntradasC,EntradaR1C ; ¿Bit 0 del PORTA es "1"? ; goto D1_OFF ; bsf PSalidasD,SalidaR1D ; goto Principal ;D1_OFF ; bcf PSalidasD,SalidaR1D
;**************************************************************************** ;* Testea Teclado y sensores * ;* * ;* Verifica caracer recibido y decide que accion ejecutar * ;****************************************************************************
TesteaTeclado movwf TeclaPulsada ; Guarda el contenido de la tecla pulsada. xorlw TECLA_RELE_1_ON ; ¿Es la tecla del movimiento hacia adelante? btfsc STATUS,Z ; goto R1_ON ; Sí, se desea movimiento hacia adelante.
movf TeclaPulsada,W ; Recupera el contenido de la tecla pulsada. xorlw TECLA_RELE_1_OFF ; ¿Es la tecla del movimiento hacia atrás? btfsc STATUS,Z ; goto R1_OFF ; Sí, se desea movimiento hacia atrás.
movf TeclaPulsada,W ; Recupera el contenido de la tecla pulsada. xorlw TECLA_RELE_2_ON ; ¿Es la tecla del movimiento hacia la izquierda? btfsc STATUS,Z ; goto R2_ON ; Sí, se desea movimiento hacia la izquierda.
movf TeclaPulsada,W ; Recupera el contenido de la tecla pulsada. xorlw TECLA_RELE_2_OFF ; ¿Es tecla del movimiento hacia la derecha? btfsc STATUS,Z ; goto R2_OFF ; Sí, se desea movimiento hacia la derecha.
movf TeclaPulsada,W ; Recupera el contenido de la tecla pulsada. xorlw TECLA_PARADA ; ¿Es la tecla de parada?. btfss STATUS,Z return ; No es ninguna tecla de movimiento. Sale.
Parado movlw 0x02 ; Muestra mensaje 02 movwf Estado ; movlw 0x00 ; Como se ha pulsado la tecla de parada se movwf Relays ; desactivan todas las salidas. return
R1_ON movlw 0x00 ; Muestra estado relays movwf Estado ; bsf Relays,SalidaR1D ; Activa Relay 1 return ;
R1_OFF movlw 0x00 ; Muestra estado relays movwf Estado ; bcf Relays,SalidaR1D ; Desctiva Relay 1 return ;
R2_ON movlw 0x00 ; Muestra estado relays movwf Estado ; bsf Relays,SalidaR2D ; Activa Relay 2 return ;
R2_OFF movlw 0x00 ; Muestra estado relays movwf Estado ; bcf Relays,SalidaR2D ; Desctiva Relay 2 return ;
R3_ON movlw 0x00 ; Muestra estado relays movwf Estado ; bsf Relays,SalidaR3D ; Activa Relay 3 return ;
R3_OFF movlw 0x00 ; Muestra estado relays movwf Estado ; bcf Relays,SalidaR3D ; Desctiva Relay 3 return ;
R4_ON movlw 0x00 ; Muestra estado relays movwf Estado ; bsf Relays,SalidaR4D ; Activa Relay 4 return ;
R4_OFF movlw 0x00 ; Muestra estado relays movwf Estado ; bcf Relays,SalidaR4D ; Desctiva Relay 4 return ;
R5_ON movlw 0x00 ; Muestra estado relays movwf Estado ; bsf Relays,SalidaR5D ; Desctiva Relay 5 return
R5_OFF movlw 0x00 ; Muestra estado relays movwf Estado ; bcf Relays,SalidaR5D ; Desctiva Relay 5 return
R6_ON movlw 0x00 ; Muestra estado relays movwf Estado ; bsf Relays,SalidaR6D ; Desctiva Relay 6 return
R6_OFF movlw 0x00 ; Muestra estado relays movwf Estado ; bcf Relays,SalidaR6D ; Desctiva Relay 6 return
R7_ON movlw 0x00 ; Muestra estado relays movwf Estado ; bsf Relays,SalidaR7D ; Desctiva Relay 7 return
R7_OFF movlw 0x00 ; Muestra estado relays movwf Estado ; bcf Relays,SalidaR7D ; Desctiva Relay 7 return
R8_ON movlw 0x00 ; Muestra estado relays movwf Estado ; bsf Relays,SalidaR8D ; Desctiva Relay 8 return
R8_OFF movlw 0x00 ; Muestra estado relays movwf Estado ; bcf Relays,SalidaR8D ; Desctiva Relay 8 return
Info movlw 0x01 ; Muestra mensaje 01 movwf Estado ; return
;**************************************************************************** ;* Ejecutar * ;* Obtiene estado de los relays y los activa en el puerto adecuado * ;**************************************************************************** Ejecutar movf Relays,W ; Carga estado de relays movwf PSalidasD ; en el puerto asignado Return
;**************************************************************************** ;* Visualiza * ;* Según el estado de las salidas visualiza el estado del sistema en el * ;* visualizador LCD y en el monitor del ordenador. * ;**************************************************************************** Visualiza movf Estado,W ; Mensaje 00? xorlw 0x00 ; btfsc STATUS,Z ; goto MostrarRelays ; Si, muestra estado de relays
clrf Estado ; ERROR!!!!, Reinicia variable de estado
MostrarRelays call LCD_Borra ; Borra la pantalla del modulo LCD. movlw Mensaje_Reles ; Muestra primera linea de mensaje call LCD_Mensaje ; " R1 R2 R3 R4" call LCD_Linea3 ; Selecciona 3a linea de display
call RS232_LineasBlanco ; Borra la pantalla del ordenador. movlw Mensaje_Mostrarlinea ; call RS232_Mensaje movlw Mensaje_Cambiolinea call RS232_Mensaje movlw Mensaje_Reles ; Lo visualiza en el HyperTerminal. call RS232_Mensaje call RS232_LineasBlanco movlw Mensaje_Cambiolinea call RS232_Mensaje
btfss Relays,SalidaR1D ; Rele 1 encendido? goto Mnsj_R1_OFF ; No, Escribe OFF
MostrarVersion movlw Mensaje_Info movwf MensajeApuntado ; Guarda la posición del mensaje. call LCD_Borra ; Borra la pantalla del modulo LCD. movf MensajeApuntado,W ; Visualiza el mensaje en la pantalla call LCD_Mensaje ; del visualizador LCD. call RS232_LineasBlanco ; Borra la pantalla del ordenador. movf MensajeApuntado,W call RS232_Mensaje ; Lo visualiza en el HyperTerminal. call RS232_LineasBlanco return
MostrarParado call Parado call MostrarRelays movlw MensajeParado movwf MensajeApuntado ; Guarda la posición del mensaje. ; call LCD_Borra ; Borra la pantalla del modulo LCD. call LCD_Linea4 ; Seleccionar la línea 4. movf MensajeApuntado,W ; Visualiza el mensaje en la pantalla call LCD_Mensaje ; del visualizador LCD. call RS232_LineasBlanco ; Borra la pantalla del ordenador. movf MensajeApuntado,W call RS232_Mensaje ; Lo visualiza en el HyperTerminal. call RS232_LineasBlanco return
MostrarActivado call Activar call MostrarRelays movlw Mensaje_Activar movwf MensajeApuntado ; Guarda la posición del mensaje. ; call LCD_Borra ; Borra la pantalla del modulo LCD. call LCD_Linea4 ; Seleccionar la línea 4. movf MensajeApuntado,W ; Visualiza el mensaje en la pantalla call LCD_Mensaje ; del visualizador LCD. call RS232_LineasBlanco ; Borra la pantalla del ordenador. movf MensajeApuntado,W call RS232_Mensaje ; Lo visualiza en el HyperTerminal. call RS232_LineasBlanco return
IF (FinTablaASCII>0xFF) ERROR "¡CUIDADO!: La tabla ha superado el tamaño de los" MESSG "primeros 256 bytes de memoria ROM. No funcionará correctamente." ENDIF
INCLUDE <RS232.INC> INCLUDE <RS232MEN.INC> INCLUDE <LCD_4BIT.INC> INCLUDE <LCD_MENS.INC> INCLUDE <RETARDOS.INC> INCLUDE <EEPROM.INC> END
Sólo necesito mientras estoy entretenido en programar asm para el PIC, buscar tiendas on-line para comprar componentes necesarios para este proyecto. Por otro lado, para aquellas que sepan muy bien programar basic para Spectrum 128 K se pueden animar en diseñar un buen menú principal cuyas carácterísteicas les pediré ahora.
Spectrum debe tener un menú principal, se lo muestro en forma de diagrama de flujos para hacer una idea, en él se muestra algo así:
Los valores que se cambian en tiempo real como indican abajo son los 1, los 0 y los mensajes de avisos y alarmas cuando se envía desde el PIC al Spectrum algún dato por puerto serie. Así que Spectrum parece que estará siempre leyendo.
Los que deseen programar el Spectrum, pueden empezar por el menú principal y la opción B). Cuando esté listo esa parte, haré pruebas sólidas con el PIC y les mostarré fotos y vídeos. Ahora tengo las herramientas adecuadas, la mayoría para practicar, solo me faltan algunos componentes como LCD 20x4 verde, por ahora me conformo con el simulador de PIC y el LCD de 16x2 en azul.
Ver foto en este spoiler, solo me hace falta el menú del Spectrum para empezar.
110 IF A$="A" OR A$="a" THEN LPRINT "A": GO TO 100
Siempre había asumido que de ser la condición falsa, ejecutaría el GOTO ...
REHome escribió:Código en asm para el PIC16F887 para los que le pican la curiosidad. (Aún en proceso de desarrollo).
Hay que tener ganas para programar ASM de los PIC
Re: Programar puerto serie
Publicado: 08 Dic 2013, 13:36
por REHome
Hola Zardoz:
Hoy tengo ganas para todo, tanto asm para PIC y Basic para ZX Spectrum +2 de 128 K para hacer cosas con él.
Aprender rápido el Basic para Spectrum solo para estas navidades del 2013 no me da tiempo, ejejjejej. Por eso necesito colaboración.
Explicaré paso a paso que hay que hacer en cada menú del Spectrum. Por ahora me centraré en dos, el menú principal y la opción [2] o la B) que antes la llamaba así.
Nada más encender el Spectrum, en realidad cargar la cinta, muestra el menú principal de abajo.
********** Menú principal ********** [1] Sistema de monitorización. [2] Sistema de gobierno desde Spectrum. [3] Modo sistema de gobierno gráfico . [4] Test. [5] Información. [6] Ayuda.
Al pulsar el botón número [2], accede directamente a otro menú llamado:
*** Sistema de gobierno desde Spectrum *** RL1 RL2 RL3 RL4 RL5 RL6 RL7 RL8 0 1 1 0 1 0 1 0 Mensajes de avisos o alarmas Para salir pulse "P".
Lo que hay que hacer aquí es, que los 1 y los 0 son datos que detecta en el puerto serie del ZX Spectrum +2A 128 K, significa activado para el 1 y desactivado para el 0. RL1 significa Relé 1 que controla el PIC. La imagen de abajo es una placa que en el fututo diseñaré algo similar, con los 8 relés.
Los mensajes de avisos llegan desde el PIC, al igual que los unos y ceros. También para abreviar se puede hacer así:
*** Sistema de gobierno desde Spectrum *** 1 2 3 4 5 6 7 8 RL 0 1 1 0 1 0 1 0 OUT Mensajes de avisos o alarmas Para salir pulse "P".
Puedes diseñar la primera parte del programa como quieran, incluido la presentación, sólo indico la idea, cada uno con su imaginación. El problema que tengo ahora, ¿quién está dispuesto a codear esta aventura un poco dura?
Un saludo.
Re: Programar puerto serie
Publicado: 08 Dic 2013, 21:50
por scooter
Ya puestos a hacer el boticario yo le pondria una uart hardware, eso facilita muuuuuucho ; con un 8052 a 1mip he comunicado sin pegas a 115kbps todo lo que sean uarts software es tumbar el sistema mientras comunica.
Re: Programar puerto serie
Publicado: 09 Dic 2013, 03:02
por REHome
Buenas:
No te preocupes en la electrónica. Llevará la comunicación hacia el PIC <--MAX232--> Spectrum la electrónica necesaria. La UART se hará físicamente, no te preocupes.
He hecho pruebas con el PIC16F84A, 16F88, 16F886, 16F887, 18F2550 y el 18F4550, todos de maravilla. Me falta Arduino, al tener la placa haré pruebas, incluyendo Raspberry Pi.
Este lo hice hace tiempo y funciona de maravilla. Spectrum solo envía un carácter en forma hexadecimal hacia le puerto serie, luego lo interpreta como apagar o encender un Led, motor, lo que quieras.
Aquí con la entrenadora de PIC, estoy usando Teensy ++ 2.0, haciendo pruebas de encender y apagar un Led y ventilador. Son tonterías que al final aprenderás hacer muchas cosas interesantes y complejas.
Voy a intentar hacer la primera pantalla del menú principal para Spectrum.
Edito: Menú principal, soso pero se ve y se entiende. Lo que tengo que hacer algo en la señal de vídeo, ya que uso un cable directamente al vídeo amarillo del RCA.
El programa hecho pero no es funcional. Debo aprender al menos como cambio de pantalla una a otra y luego volver, así poder hacer fucniones después.
Por cierto, al guardar el programa, escribí al final de código:
save "RS232"
Al recuperarlo, no encontró nada en la cinta, solo otros programas ya realizados hace tiempo. Que me recuerde alguien si es con save como se guarda. Con cargar es LOAD "RS232". Otra cosa. ¿Cómo se interrumpe un programa?
No se programar para Spectrum pero si para C# y ensamblador para PIC, jejejejeje. He hecho como un emulador no funcional para le puerto serie (cosa que si me animo lo haré funcional en todos los aspectos pero debo dejarlo bonito).
En el Spectrum veo que tiene "E/S EXPANSION", puerto paralelo, joyStick, así que lo miraré a fondo que se pueden hacer cosillas, cualquier sugerencia es bienvenida, estoy a tiempo para recibir ideas.
El ejecutable quien quiera mirarlo a fondo me lo dicen y se los paso por correo.
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;
namespace Spectrum_Menu { class Program { static void Main(string[] args) { // Muestra título de la ventana del programa. Console.Title = "ZX Spectrum +2A 128 K (Sinclair) - Zona de Pruebas"; Console.BackgroundColor = ConsoleColor.White; // Fondo de las letras blanco. Console.ForegroundColor = ConsoleColor.Black;
while (true) { Console.Clear(); // Limpia la pantalla y se pone blanco indicado arriba. Console.WriteLine(@"********** MENÚ PRINCIPAL **********
(1) Sistema de monitorización.
(2) Sistema de gobierno desde ZX Spectrum.
(3) Modo sistema de gobierno gráfico.
(4) Test.
(5) Información.
(6) Ayuda. ");
string menu = Console.ReadKey(true).KeyChar.ToString(); // Lectura del teclado para las opciones del menú. int switch_menu;
if (!int.TryParse(menu, out switch_menu)) continue; Console.Clear();
switch (switch_menu) { case 1: Console.WriteLine(@"****************** Sistema de monitorización ******************
IN 1 IN2 IN 3 IN 4 IN 5 IN 6 IN 7 IN 8 ---- ---- ---- ---- ---- ---- ---- ---- 0 1 0 0 1 0 0 1
Para salir pulse 'P'. "); break;
case 2: Console.WriteLine(@"*** Sistema de gobierno desde Spectrum ***
case 3: Console.WriteLine(@"**** Modo sistema de gobierno gráfico ****
"); break;
case 4: Console.WriteLine(@"**************** Test ****************
Todo lo que escribas aquí se enviará por puerto serie y se visualiza en el LCD.
Para salir pulsa la letra 'P'.
"); break;
case 5: Console.WriteLine(@"************* Información *************
Desde que pulse 'I' o 'i' muestra información en forma de texto leído desde Spectrum y el microcontrolador como versión del programa, firmware, contacto, foro de información como Zona de Pruebas, etc.
Lo que se nos ocurra. 'P para salir'.
"); break;
case 6: Console.WriteLine(@"*************** Ayuda ***************
En esta ventana se mostrarán textos y explicaciones de ayudas sobre los menús.
Ya lo explicaré más adelante.
"); break;
default: Console.WriteLine("Pulsa solo 'P' o 'p' para salir al menú principal"); break;
} while (Console.ReadKey(true).Key != ConsoleKey.P) ; } } } }
Basic + del Spectrum por ahora me parece complicado hacer menús. Quien se anime a echarme una mano o dar pistas.