Autor Tema: Duda ensamblador  (Leído 3628 veces)

kerunaru

  • Commodoremaníaco
  • ****
  • Mensajes: 129
  • Y todo porque los cuerpos se atraen...
    • Ver Perfil
    • Retro entre amigos
Duda ensamblador
« en: Junio 18, 2011, 19:58:57 »
Buenas gente,

Os comento: Tengo un programa en ensamblador en donde quiero comprobar que se haya pulsado o un número o una letra.
El problema es que uso el comando BCC o BCS para comprobar que no se salga del intervalo. Os pongo el código:

[code]JSR $FFE1 ;Si hemos presionado RUN/STOP
BEQ $0351 ;Salimos del programa
JSR $FFE4 ;Cojo la tecla
CMP #$41  ;Comparo si menor que A
BCC $033C ;Si es menor comienza de nuevo
CMP #$5A  ;Comparo si es mayor que Z
BCS $033C ;Si es mayor comienza de nuevo
JSR $FFD2
AND #$0F  ;Pinto el valor
RTS[/quote]

No sé cómo evaluar dos intervalos ya que, al comprobar el primer intervalo, volverá a ir al comienzo del programa. Por ejemplo: si pulsamos #$30 (el número 0) cuando llegue a la línea donde comparo si es menor que A el programa empezará de nuevo...

Hay alguna manera de hacer varias comprobaciones simultáneas (cómo el && normal de toda la vida xD)

¡Gracias por vuestro tiempo!

The_WOZ

  • Commodorista
  • ***
  • Mensajes: 98
    • Ver Perfil
Duda ensamblador
« Respuesta #1 en: Junio 18, 2011, 23:56:27 »
Hola kernal.

Supongo quieres comparar entre 0 y 9 y entre A y Z.

Entonces lo que tienes que hacer es comparar primero el rango menor y luego al mayor y para reducir la complejidad del programa el primer rango lo chequeas al revez, primero el limite superior y luego el inferior, de esta manera:
[code]
$033C     JSR $FFE1 ;Si hemos presionado RUN/STOP
$033F     BEQ $0359 ;Salimos del programa
$0341     JSR $FFE4 ;Cojo la tecla

$0344     CMP #$39  ;Comparo si es mayor que 9
$0346     BCS $034C ; Si es mayor salto para comparar entre A-Z
$0348     CMP #$30  ;Comparo si es menor que 0
$034A     BCC $033C  ; Si es menor comienza de nuevo

$034C     CMP #$41  ;Comparo si menor que A
$034E     BCC $033C ;Si es menor comienza de nuevo
$0350     CMP #$5A  ;Comparo si es mayor que Z
$0352     BCS $033C ;Si es mayor comienza de nuevo
$0354     JSR $FFD2
$0357     AND #$0F  ;Pinto el valor
$0359     RTS
[/quote]

kerunaru

  • Commodoremaníaco
  • ****
  • Mensajes: 129
  • Y todo porque los cuerpos se atraen...
    • Ver Perfil
    • Retro entre amigos
Duda ensamblador
« Respuesta #2 en: Junio 19, 2011, 00:35:53 »
Cita de: "The_WOZ"
[code]
$0346     BCS $034C ; Si es mayor salto para comparar entre A-Z
[/quote]

¿Te puedes creer que no se me había ocurrido hacer un salto hacia adelante? Es la primera vez que hago cosas en ensamblador... Supongo que aún me falta rodaje...

¡Muchas gracias!

kerunaru

  • Commodoremaníaco
  • ****
  • Mensajes: 129
  • Y todo porque los cuerpos se atraen...
    • Ver Perfil
    • Retro entre amigos
Duda ensamblador
« Respuesta #3 en: Junio 19, 2011, 17:30:41 »
Vale. Ya he dado con la respuesta. Hay que completar lo que the_WOZ me propuso:

[code].033C JSR $FFE1 ;Si hemos presionado RUN/STOP
.033F BEQ $035D ;Salimos del programa
.0341 JSR $FFE4 ;Cojo la tecla

.0344 CMP #$39  ;Comparo si es mayor que 9
.0346 BCS $034C ; Si es mayor salto para comparar entre A-Z
.0348 CMP #$30  ;Comparo si es menor que 0
.034A BCC $033C  ; Si es menor comienza de nuevo

; Al pasar las dos comprobaciones anteriores
.034C CMP #$3A ; Comparo si es menor que 9
.034E BCC $0358 ; Entonces paso a pintado directamente

.0350 CMP #$41  ;Comparo si menor que A
.0352 BCC $033C ;Si es menor comienza de nuevo
.0354 CMP #$5B  ;Comparo si es mayor que Z
.0356 BCS $033C ;Si es mayor comienza de nuevo
.0358 JSR $FFD2
.035B AND #$0F  ;Pinto el valor
.035D RTS [/quote]

The_WOZ

  • Commodorista
  • ***
  • Mensajes: 98
    • Ver Perfil
Duda ensamblador
« Respuesta #4 en: Junio 19, 2011, 20:33:02 »
Bien! Veo que ya estas pensando en optimización.
Pero fijate que el salto en $0346 tiene que apuntar al CMP #$41 (si ya sabes que es mayor que 9, nunca va a ser menor que 9)

Ademas:
[code]
.034C CMP #$3A ; Comparo si es menor que 9
.034E BCC $0358 ; Entonces paso a pintado directamente
[/quote]
puede reemplazarse por un solo BCS :wink:

Al programar en assembler hay que volver a pensar como cuando lo haciamos en BASIC, en termino de GOTOs y encontrar la forma más eficaz de definir el flujo del programa para que pase por la menor cantidad de 'lineas' posible.