Página 1 de 1

CÓMO MULTIPLICAR NÚMEROS GRANDES EN ENSAMBLADOR

Publicado: Sab Abr 23, 2016 10:45 am
por Kodaly
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.

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

Publicado: Sab Abr 23, 2016 4:27 pm
por antoniovillena
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

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

Publicado: Sab Abr 23, 2016 9:56 pm
por Kyp
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

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

Publicado: Dom Abr 24, 2016 10:30 am
por Kodaly
Muchísimas gracias a los dos.

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

Publicado: Mié Abr 27, 2016 7:59 pm
por Scooter
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

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

Publicado: Mié Abr 27, 2016 8:36 pm
por antoniovillena
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.

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

Publicado: Vie Abr 29, 2016 4:48 pm
por Kodaly
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?

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

Publicado: Sab Abr 30, 2016 4:31 pm
por Scooter
Si que da resultado, pero es muchísimo más lento

Enviado desde mi fnac 5.7 mediante Tapatalk