CÓMO MULTIPLICAR NÚMEROS GRANDES EN ENSAMBLADOR

Todo sobre la creación, diseño y programación de nuevo software para
nuestro Spectrum

Moderador: Sir Cilve Sinclair

Responder
Kodaly
Herbert
Mensajes: 75
Registrado: Lun Jul 23, 2012 1:55 pm

CÓMO MULTIPLICAR NÚMEROS GRANDES EN ENSAMBLADOR

Mensaje por Kodaly » Sab Abr 23, 2016 10:45 am

Muy buenas. Estoy aprendiendo ensamblador y para practicar estoy creando una rutina para pintar las pantallas de mapa de un juego. Hasta ahora todo bien pero tengo un problema a la hora de apuntar a memoria para dibujar un número de pantalla. Tendría que multiplicar por 176 y no sé cómo. Supongo que habrá que trabajar por un lado con la parte alta y con la baja por otro pero no encuentro un patrón que me cuadre. Gracias.

Avatar de Usuario
antoniovillena
Nonamed
Mensajes: 1164
Registrado: Dom Ene 09, 2011 8:55 am

Re: CÓMO MULTIPLICAR NÚMEROS GRANDES EN ENSAMBLADOR

Mensaje por antoniovillena » Sab Abr 23, 2016 4:27 pm

Si es una constante de 8 bits, como es tu caso, esta macro (es para SjAsmPlus pero se puede adaptar para otros ensambladores) te vale:

Código: Seleccionar todo

  MACRO multsub first, second
    IF  data & first
        add     hl, hl
      IF  data & second
        add     hl, de
      ENDIF
    ENDIF
  ENDM

  MACRO mult8x8 data
    IF  data = 0
        ld      hl, 0
    ELSE
        ld      h, 0
        ld      l, e
      IF  data != 1 & data != 2 & data != 4 & data != 8 & data != 16 & data != 32 & data != 64 & data != 128
        ld      d, h
      ENDIF
        multsub %10000000, %01000000
        multsub %11000000, %00100000
        multsub %11100000, %00010000
        multsub %11110000, %00001000
        multsub %11111000, %00000100
        multsub %11111100, %00000010
        multsub %11111110, %00000001
    ENDIF
  ENDM
Imagen

Avatar de Usuario
Kyp
Sabreman
Mensajes: 444
Registrado: Lun Dic 16, 2013 6:16 pm

Re: CÓMO MULTIPLICAR NÚMEROS GRANDES EN ENSAMBLADOR

Mensaje por Kyp » Sab Abr 23, 2016 9:56 pm

Algo más "legible":

Código: Seleccionar todo

MUL16  ld   hl,0		; hl = de*a, b = 0
       ld   b,8
.loop  add  hl,hl
       rlca
       jr	nc,.noadd
       add  hl,de
.noadd djnz .loop
       ret

Kodaly
Herbert
Mensajes: 75
Registrado: Lun Jul 23, 2012 1:55 pm

Re: CÓMO MULTIPLICAR NÚMEROS GRANDES EN ENSAMBLADOR

Mensaje por Kodaly » Dom Abr 24, 2016 10:30 am

Muchísimas gracias a los dos.

Avatar de Usuario
Scooter
Freddy Hardest
Mensajes: 711
Registrado: Jue Nov 11, 2010 10:17 pm

Re: CÓMO MULTIPLICAR NÚMEROS GRANDES EN ENSAMBLADOR

Mensaje por Scooter » Mié Abr 27, 2016 7:59 pm

Yo lo rotaría cuatro veces y luego lo multiplicas por 11, o al revés. Primero lo multiplicas por 11 y luego lo rotas cuatro veces. Si quieres velocidad puede hacer una tabla con los resultados de la multiplicación por 11.
¿Que valores puede tomar el número a multiplicar? ¿De 0 a 255 o está más restringido? Si son pocos los valores sale una tabla pequeñitos.

Enviado desde mi fnac 5.7 mediante Tapatalk
Aquellos chalados en sus viejos cacharros...

Avatar de Usuario
antoniovillena
Nonamed
Mensajes: 1164
Registrado: Dom Ene 09, 2011 8:55 am

Re: CÓMO MULTIPLICAR NÚMEROS GRANDES EN ENSAMBLADOR

Mensaje por antoniovillena » Mié Abr 27, 2016 8:36 pm

Lo que te dice Scooter es el caso particular de multiplicar por 176. La macro que te puse arriba es para el caso general de multiplicar por cualquier constante. En caso de 176 la macro se desenrollaría de la siguiente forma:

Código: Seleccionar todo

      ld      h, 0
      ld      l, e
      ld      d, h
      add     hl, hl
      add     hl, hl
      add     hl, de
      add     hl, hl
      add     hl, de
      add     hl, hl
      add     hl, hl
      add     hl, hl
      add     hl, hl
Si pones la entrada en E, tienes la salida en HL. Son 9*11+15= 114 ciclos y 13 bytes. Puedes hacerlo en menos bytes, pero dudo mucho que en menos ciclos.
Imagen

Kodaly
Herbert
Mensajes: 75
Registrado: Lun Jul 23, 2012 1:55 pm

Re: CÓMO MULTIPLICAR NÚMEROS GRANDES EN ENSAMBLADOR

Mensaje por Kodaly » Vie Abr 29, 2016 4:48 pm

Gracias a scooter y a antoniovillena. Probaré esto último.

Otra forma que se me ha ocurrido es sumar con acarreo 176 a hl en un bucle (siendo b el número de pantalla). Supongo que no es tan óptimo pero para mis prácticas ha dado resultado.

Incluso así he logrado hacer un scroll horizontal carácter a carácter y funciona a buena velocidad. El problema es que el sprite parpadea por pintarse una pantalla encima de otra y borrarse también el sprite. ¿Cómo solucionar esto? Sólo se me ocurre modificar la rutina de impresión de pantalla para que no pinte nada justo en las coordenadas donde esté el sprite. Creo que habría que hacer muchos cálculos para esto. ¿Alguna otra forma más sencilla de evitar el parpadeo?

Avatar de Usuario
Scooter
Freddy Hardest
Mensajes: 711
Registrado: Jue Nov 11, 2010 10:17 pm

Re: CÓMO MULTIPLICAR NÚMEROS GRANDES EN ENSAMBLADOR

Mensaje por Scooter » Sab Abr 30, 2016 4:31 pm

Si que da resultado, pero es muchísimo más lento

Enviado desde mi fnac 5.7 mediante Tapatalk
Aquellos chalados en sus viejos cacharros...

Responder

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 9 invitados