Tengo un problemilla con la división en ensamblador. En la página
http://baze.au.com/misc/z80bits.html y también en alguna otra he encontrado unos algoritmos para la multiplicación y división de números sin signo en ensamblador. Todos los algoritmos funcionan bien, excepto el de la división entre un valor de 16 bits y otro de 8 bits, que unas veces funciona y otras no, por lo que creo que le falta algún detalle para que funciona correctamente en todos los casos.
El código para la división es este:
Código: Seleccionar todo
org #A003
ld hl,10533
ld c,139
xor a
ld b,16
bucle:
add hl,hl
rla
cp c
jr c,$+4
sub c
inc l
djnz bucle
ld (#A000),hl
ld (#A002),a
ret
Para probarlo he escrito este programa en BASIC:
Código: Seleccionar todo
10 MEMORY &9FFF
20 CALL &A003
30 PRINT PEEK(&A000)+PEEK(&A001)*256:REM imprime cociente
40 PRINT PEEK(&A002):REM imprime resto
Lo que hago es pegar el código ensamblador en la ventana Assembler del WinAPE y lo ensamblo (Ctrl+F9). Después en el emulador lanzo el programa BASIC y me da los resultados.
Con los valores que hay en HL (dividendo) y C (divisor) del código ensamblador no funciona correctamente, pero con otros muchos sí (por ejemplo 1000 y 100). ¿Sabeis alguien qué le falta o sobra al código ensamblador para que siempre divida correctamente?