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