2
« en: Marzo 19, 2012, 11:12:06 »
Hola
Como ya sabréis, el 6502 solo puede realizar las operaciones de suma y resta con acarreo. Tanto la multiplicación como la división deben implementarse mediante algoritmo. Presento un algoritmo de multiplicación basado en el principio de desplazamiento aritmético. Esta escrito en el ensamblador kickass.
:BasicUpstart2(inicio) // "trampolín" basic llamador del programa
.const M = $10 //Multiplicando
.const m = $11 //multiplicador
.const r1 = $12 //resultado 1
.const r2 = $13 //resultado 2
.const max = $ff //valor maximo
.const min = $00 //valor minimo
.const ite = $08 //Iteraciones
.pc = $810 "Codigo"
// Codigo del programa
inicio:
sei //desactiva interrupciones
lda V1 //inicializo Multiplicando
sta M //
lda V2 //inicializo multiplicador
sta m //
lda #min //inicializo resultado
sta r2 //
ldx #ite //inicializo x
bucle:
lsr m //desplazo m a la derecha
if: bcc eif //si acarreo = 0 salto eif
clc
adc M //sumo M
eif: ror //roto acum a la derecha
ror r2 //roto r2 a la derecha
dex //decremento x
bne bucle //salto a bucle
fin:
sta r1 //muevo resul a r1
cli //activa interrupciones
rts // vuelve al BASIC
// Datos
V1: .byte 0 //Variable Multiplicador
V2: .byte 0 //Variable multiplicando
V1 es la variable de entrada del multiplicador y V2 del multiplicando.
r1 y r2 son los registros de resultado. r1 para el byte alto y r2 para el byte bajo.
Se puede probar mediante:
poke2109,MMM:poke2110,mmm
sys2064
print peek(18):print peek(19)
Teniendo en cuenta que los valores devuelto por los peek hay que convertirlos a hexadecimal. Por ejemplo:
MMM = 25
mmm = 13
25*13 = 325 –> Hex = 01 45
peek(18) = 1–> Hex = 01
peek(19) = 69 –> Hex = 45