viernes, 27 de mayo de 2016

VOLCADO DEL BUFFER CON LDI (II): INICIO Y LECTURA DEL TECLADO



Como ya he dicho, el programa se ejecuta desde la dirección 24000. Esto corresponde a la memoria contenida. Lo primero que hacemos es deshabilitar las interrupciones, ya que no las vamos a usar de momento y colocar la pila.





Luego hay una serie de rutinas que sirven para crear las tablas que necesitamos para que el invento funcione y de momento no nos interesan.

A partir de la línea 102, tenemos lo siguiente:




Con XOR A, ponemos A=0 y con OUT (FEh),A ponemos el borde negro.

Llamamos a la rutina que nos borra la pantalla real:




Cargamos HL con el inicio de la pantalla real (4000h) y DE con HL+1 (4001h). Metemos en la primera dirección un cero y hacemos LDIR con BC igual al tamaño de la zona de los gráficos.

Para los atributos hacemos lo mismo desde el inicio de la zona de atributos, pero metemos un 6, con lo que pintamos la pantalla de amarillo.

Este método no es que sea muy optimizado, pero me da lo mismo, ya que aquí la velocidad no importa demasiado. Al borrar la pantalla real conviene hacer un HALT antes, para que el efecto sea más uniforme.

Después de esto, pintamos las rallas en el buffer y saltamos a INICIO que ya pertenece a la zona no contenida y que está en APRINCIPAL.ASM.

Para no liar mucho el asunto, voy a ir directamente a la lectura del teclado.




Todo lo concerniente a la teoría sobre la lectura del teclado lo puedes ver aquí.

Yo lo que hago es ir leyendo las letras que me interesan, OPQA y disparo y dependiendo de si están pulsadas o no, pongo a 1 un determinado bit del registro L. Ni que decir tiene que primero hay que poner L a cero...



Por ejemplo, si pulsamos a la vez la tecla derecha, la de arriba y el disparo, L=00011001b

En FINTEC paso el valor resultante de L al registro A, y lo guardo en la dirección JOY+1.

He dejado por ahí un código que en este ejemplo no uso, y es la lectura del Joystick Kempston en LEEJOY. Lo usaré más adelante.

El valor que voy dando al registro L según la tecla que esté pulsada no es trivial. Coincide con el valor que resulta de leer el Joystick, por lo que así unifico el resultado independientemente de que el personaje se maneje con teclado o Joystick.


7 comentarios:

  1. Hola. Es muy interesante esto que compartes. Hice juegos con la churrera pero nunca en Ensamblador. Y debo decirte que tenia ganas de conocer al respecto por lo que te estoy muy agradecido por compartir tu conocimiento. No voy muy rápido que digamos, por lo que tal vez te haga preguntas de publicaciones anteriores. Un abrazo y seguimos en contacto.

    ResponderEliminar
  2. Me alegro que te animes. Es mejor tomarlo con calma, ya que aunque no es muy difícil (si yo lo entiendo más o menos, cualquiera puede hacerlo) es muy importante ir consolidando bien los conocimientos. Y pregunta, que así aprendemos todos

    ResponderEliminar
  3. En vez de pasar el bit activado en el registro L al acumulador y luego del acumulador a JOY+1, usar directamente el registro L para guardar el resultado en JOY+1?
    ...
    LD (JOY+1),L

    ResponderEliminar
    Respuestas
    1. Hola. Gracias por leer el blog después de tanto tiempo.
      Que yo sepa, la instrucción que dices no existe. Solo se puede cargar una dirección de memoria con el acumulador. O dos seguidas con un registro doble.
      Un saludo.

      Eliminar
  4. Osea el acumulador solo sirve para guardar direcciones de memoria? nunca datos?
    [estoy aprendiendo]

    ResponderEliminar
  5. Osea el acumulador solo sirve para guardar direcciones de memoria? nunca datos?
    [estoy aprendiendo]

    ResponderEliminar
  6. No. Me refiero a que para meter un dato en una dirección de memoria, se usa el acumulador. De hecho, el acumulador es de 8 bits, por lo que solo puede guardar datos.
    Si yo quiero meter 5 en la dirección #FA00, haré:

    LD A,5
    LD (#FA00),A

    No puedo hacer: LD (#FFFF),5, por ejemplo. Ni LD L,5/ LD (#FA00),L.

    Ahora bien, si quiero meter #5555 en la dirección #FA00 (y #FA01, ya que #5555 son dos bytes), podré hacer, por ejemplo:

    LD HL,#5555
    LD (#FA00),HL

    ResponderEliminar