Mostrar Mensajes

Esta sección te permite ver todos los posts escritos por este usuario. Ten en cuenta que sólo puedes ver los posts escritos en zonas a las que tienes acceso en este momento.


Mensajes - albanchez2k

Páginas: [1]
1
Ensamblador / Algoritmo de división en ensamblador
« en: Abril 04, 2012, 12:16:44 »
Al igual que para la multiplicación, no existe un op-code que haga la división. Este es un algoritmo de división. Está hecho en Kikcass.

:BasicUpstart2(inicio)         // "trampolín" basic llamador del programa

.const D   = $10            //Dividendo
.const d   = $11            //divisor
.const r1  = $12            //cociente
.const r2  = $13            //resto
.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 Dividendo       
         sta D            //
         lda V2            //inicializo divisor   
         sta d            //
         lda #min         //inicializo acumulador
         sta r1            //inicializo r1
         ldx #ite         //inicializo X
         
bucle:
         asl r1            //desplazo r1 a la izquierda
         asl D            //desplazo D a la izquierda
         rol               //roto A a la izquierda
         cmp d            //comparo A con d
         bcc comp         // si A < d comp
         sec               //
         sbc d            //A - d
         inc r1            //incremento r1
comp:      dex               //decremento X
         bne bucle         //si X <> 0 bucle
fin:
         sta r2            //resto
         cli            //activa interrupciones
         rts             // vuelve al BASIC

// Datos
V1:    .byte 0               //Variable Dividendo
V2:    .byte 0               //Variable divisor

V1 es la variable de entrada del Dividendo y V2 del divisor.
r1 es el cociente y r2 es el resto

Se puede probar mediante:

poke2102,MMM:poke2103,mmm
sys2064
print peek(18):print peek(19) 

2
Ensamblador / Algoritmo de multiplicación en ensamblador
« 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

Páginas: [1]