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

CÓMO MULTIPLICAR NÚMEROS GRANDES EN ENSAMBLADOR

Notapor Kodaly el 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.
Kodaly
Herbert
 
Mensajes: 68
Registrado: Lun Jul 23, 2012 1:55 pm

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

Notapor antoniovillena el 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
antoniovillena
Nonamed
 
Mensajes: 1152
Registrado: Dom Ene 09, 2011 9:55 am

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

Notapor Kyp el 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
Avatar de Usuario
Kyp
Manic Miner
 
Mensajes: 221
Registrado: Lun Dic 16, 2013 7:16 pm

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

Notapor Kodaly el Dom Abr 24, 2016 10:30 am

Muchísimas gracias a los dos.
Kodaly
Herbert
 
Mensajes: 68
Registrado: Lun Jul 23, 2012 1:55 pm

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

Notapor Scooter el Mie 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
Scooter
Freddy Hardest
 
Mensajes: 705
Registrado: Jue Nov 11, 2010 11:17 pm

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

Notapor antoniovillena el Mie 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
Avatar de Usuario
antoniovillena
Nonamed
 
Mensajes: 1152
Registrado: Dom Ene 09, 2011 9:55 am

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

Notapor Kodaly el 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?
Kodaly
Herbert
 
Mensajes: 68
Registrado: Lun Jul 23, 2012 1:55 pm

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

Notapor Scooter el 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...
Avatar de Usuario
Scooter
Freddy Hardest
 
Mensajes: 705
Registrado: Jue Nov 11, 2010 11:17 pm


Volver a Programación y nuevos desarrollos

¿Quién está conectado?

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

cron