CÓMO MULTIPLICAR NÚMEROS GRANDES EN ENSAMBLADOR
Moderador: Sir Cilve Sinclair
-
- Herbert
- Mensajes: 75
- Registrado: Lun Jul 23, 2012 1:55 pm
CÓMO MULTIPLICAR NÚMEROS GRANDES EN ENSAMBLADOR
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.
- antoniovillena
- Nonamed
- Mensajes: 1164
- Registrado: Dom Ene 09, 2011 8:55 am
Re: CÓMO MULTIPLICAR NÚMEROS GRANDES EN ENSAMBLADOR
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
- Kyp
- Sabreman
- Mensajes: 444
- Registrado: Lun Dic 16, 2013 6:16 pm
Re: CÓMO MULTIPLICAR NÚMEROS GRANDES EN ENSAMBLADOR
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
-
- Herbert
- Mensajes: 75
- Registrado: Lun Jul 23, 2012 1:55 pm
Re: CÓMO MULTIPLICAR NÚMEROS GRANDES EN ENSAMBLADOR
Muchísimas gracias a los dos.
- Scooter
- Freddy Hardest
- Mensajes: 711
- Registrado: Jue Nov 11, 2010 10:17 pm
Re: CÓMO MULTIPLICAR NÚMEROS GRANDES EN ENSAMBLADOR
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
¿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...
- antoniovillena
- Nonamed
- Mensajes: 1164
- Registrado: Dom Ene 09, 2011 8:55 am
Re: CÓMO MULTIPLICAR NÚMEROS GRANDES EN ENSAMBLADOR
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:
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.
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
-
- Herbert
- Mensajes: 75
- Registrado: Lun Jul 23, 2012 1:55 pm
Re: CÓMO MULTIPLICAR NÚMEROS GRANDES EN ENSAMBLADOR
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?
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?
- Scooter
- Freddy Hardest
- Mensajes: 711
- Registrado: Jue Nov 11, 2010 10:17 pm
Re: CÓMO MULTIPLICAR NÚMEROS GRANDES EN ENSAMBLADOR
Si que da resultado, pero es muchísimo más lento
Enviado desde mi fnac 5.7 mediante Tapatalk
Enviado desde mi fnac 5.7 mediante Tapatalk
Aquellos chalados en sus viejos cacharros...
¿Quién está conectado?
Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 14 invitados