HispaMSX

Ayuda a un novato con Assembler

2004-09-13 15:41:59
Hola

 

Bueno, haciendo mis pruebecillas y chorradillas en asembler se me 
ocurrió probar a hacer un scroll lateral (Der->Izq), asi que empecé 
y parece que mas o menos funciona, pero creo que mi código tiene de 
tener algún error y mas bien grande, lo noto sobre todo el la 
velocidad ridícula que alcanza.

 

Si alguien es tan amable de mirárselo un poquillo y decirme que 
puede ser, aunque solo sea darme una pista….

 

El programa hace todas las operaciones sobre el VDP no se si seria 
mas correcto hacer el scroll sobre la ram y luego volcarlo al vdp, 
también deciros que antes de usar directamente el vdp (con in y 
out's) estuve con las rutinas de la bios, lo que pasa es que como lo 
vi tan lento poooosss me dio por probar :P

 

Bueno, aquí esta el código, lamento que este tan mal comentado, pero 
todo se mejorara.

 

Las variables b y c indican el rango de pantalla donde se ejecutara 
el scroll, tal y como estan ahora el scroll lo hace asi:

 

 

0,0 ----------------------------

     |           |               |

     |           |               |

     |-----------10,10        |

     |

                           |

     |                           |

     ----------------------------

 

 

Compila sin problemas con el asMSX

 

            .basic

            .bios

            .org 40000

            

            SCREEN  equ     0000h

            COLOR equ       8192

 

            ld b,25  // y

            ld c,32  // x

 

            di

 

// bucle para patearse el area de scroll

 

bucle:   call scroll  

            ld a,c

            dec a

            ld c,a

            jp nz,bucle

            ld a,b

            dec a

            ld b,a

            jp nz,bucle

            ei

            ret

 

 

// 

// calcula la dirección en la que debe leer y escribir

//

scroll:   ld de,32

            ld hl,0

            ld a,b

            cp 0

            jp z,columna

            

fila:       sra a   //  divido la fila entre 8

            sra a

            sra a

            cp 0

            jp z,nosup  // si el resultado de la división es 0 salta 
a nosup

 

supera: add hl,de

            dec a

            jp nz,supera

 

nosup:  ld a,b     //  selecciona solo los 3 primeros bis's de b

            and 7

            add a,l

            ld l,a

            

columna:ld de,8

            ld a,c

            cp 0

            jr z,sada

 

increm: add hl,de

            dec a

            cp 0

            jr nz,increm

// 

// aquí termina el calculo de la dirección (read/write)

//

 

 

 

sada:    ld de,SCREEN

            add hl,de

            ld a,[tmpdat]  // comprueba si la operación anterior 
tuvo tmpdat

            cp 1

            jp nz,ncarry   // si no hay tmpdat salta a ncarry

            ld a,0

            ld [tmpdat],a

            call LEEV

            sla a

            jr nc,nada    // si no hay tmpdat en la operario salta 
a "nada"

            push af       // en caso contrario pone [tmpdat] a 1

            ld a,1

            ld [tmpdat],a

            pop af

nada:    set 0,a       // pone el bit 0 a 1 y lo escribe en la vram

            call ESCRIV

            ret

ncarry:  ld a,0       

            ld [tmpdat],a

            call LEEV

            sla a

            jp nc,nada1

            push af

            ld a,1

            ld [tmpdat],a

            pop af

nada1:  call ESCRIV

            ret

 

ESCRIV: push af

            ld a,l

            out (99h),a

            ld a,h

            or 40h

            out (99h),a

            pop af

            out (98h),a

            ret

LEEV:  ld a,l

            out (99h),a

            ld a,h

            out (99h),a

            in a,(98h)

            ret

 

tmpdat: db 0



<Anterior en la conversación] Conversación actual [Siguiente en la conversación>