Hola a todos los commodorianos. Es mi primera vez en el foro y me gustaria que alguien me ayudara
para resolver un problemilla que me esta voviendo loco. He hecho un programa para sacar un scroll
horizontal pero no es estable (tiembla). He metido el codigo de control del scroll dentro de la
interrupcion y tambien por fuera (en el bucle principal) y sigo teniendo el mismo problema. Mando
el codigo para ver si alguna alma samaritana me puede echar un cable. Muchisimas gracias de
antemano
;*************************************************************
;* SCROLL FINO CONTROLADO POR JOYSTICK EN PUERTO 2
;*************************************************************
scrloc01 = 1384 ; ultima columna de la pantalla
scrloc02 = 1424
scrloc03 = 1464
scrloc04 = 1504
scrloc05 = 1544
scrloc06 = 1584
scrloc07 = 1624
scrloc08 = 1664
scrloc09 = 1704
scrloc10 = 1744
scrloc11 = 1784
scrloc12 = 1824
scrloc13 = 1864
scrloc14 = 1904
scrloc15 = 1944
scrloc16 = 1984
joy2 = 56320 ; Joystick puerto 2
xfine = $fb ; Numero de pixels a desplazar
column = $fc ; Puntero al siguiente dato a "pokear"
irqexit = $ea81 ; Rutina de interrupción del Kernal
;
!to "scroll.prg",cbm ; tipo de CPU ( C-64 )
;
*= $c000 ; Direccion de comienzo
;
init lda #$07 ; Inicializa variables
sta xfine
lda #$00
sta column
sei ; Desactiva interrupciones del sistema
lda #$00
sta $d020 ; Color de borde a negro
lda #147
jsr $ffd2 ; borra la pantalla
lda #$7f
sta $dc0d ; Desactiva teclados reloj, etc
lda #<irq1
ldx #>irq1
sta $314 ; Prepara la 1ª interrupcion IRQ
stx $315
ldy #$1b
sty $d011 ; Pone la primera linea raster
lda #$01
sta $d01a ; Activa eh tipo de interrupción (raster)
cli ; Activa interrupciones del sistema
;
; Main loop
;
hold jsr charplot ; Pokea los datos en pantalla
jmp hold ; bucle sin fin
;
; Custom IRQ routines
;
irq1 inc $d019 ; Reconoce interrupciones raster
lda #$00
sta $d012 ; 1º linea raster (comienzo de la zona de scroll)
lda #$01
sta $d021 ; Pone el color de la pantalla a blanco
lda #<irq2
ldx #>irq2
sta $314 ; Prepara la segunda interrupción raster
stx $315
;
lda xfine ; Codigo de scroll fino
sta $d016
lda joy2 ; Lee el joystick
and #15
cmp #$07 ; A la derecha?
beq scroll ; Si, hace el scroll
jmp irqexit ; No, salta al sistema
;
scroll lda column ; Chequea el final del los datos a "scrolizar"
cmp #$ff ; Limite alcanzado?
bne goscroll ; No, sigue haciendo el scroll
jmp irqexit ; Si, final del scroll
;
goscroll
lda xfine ; Lee el flag de desplazamiento fino
sec
sbc #$01 ; velocidad del scroll
and #$07 ; Este trozo solo hace eso : desplaza la información de
sta xfine ; pantalla 7 a 0 Pixels (scroll de derecha a izquierda)
jmp irqexit ;
;
irq2 inc $d019 ; Reconoce interrupciones rastree
lda #$60
sta $d012 ; 2º linea raster
lda #$08
sta $d016 ; Zona de pantalla fija (para títulos, puntos, récords, etc)
lda #$03
sta $d021 ; Pone el color de pantalla a azul claro
lda #<irq1
ldx #>irq1
sta $314 ; Vuelve a poner la 1º rutina IRQ
stx $315
jmp irqexit ; Sale al sistema
;
; Plot & scroll chars routine
;
charplot
lda xfine ; Comprueba la posición del scroll (Pixels)
beq endsec ; Ha llegado a 0? Entonces hace scroll completo de caracteres
jmp nomove
endsec ldx #$00 ; Scroll completo de caracteres
wrapmsg lda scrloc01+1,x
sta scrloc01,x
lda scrloc02+1,x
sta scrloc02,x
lda scrloc03+1,x
sta scrloc03,x
lda scrloc04+1,x
sta scrloc04,x
lda scrloc05+1,x
sta scrloc05,x
lda scrloc06+1,x
sta scrloc06,x
lda scrloc07+1,x
sta scrloc07,x
lda scrloc08+1,x
sta scrloc08,x
lda scrloc09+1,x
sta scrloc09,x
lda scrloc10+1,x
sta scrloc10,x
lda scrloc11+1,x
sta scrloc11,x
lda scrloc12+1,x
sta scrloc12,x
lda scrloc13+1,x
sta scrloc13,x
lda scrloc14+1,x
sta scrloc14,x
lda scrloc15+1,x
sta scrloc15,x
lda scrloc16+1,x
sta scrloc16,x
inx
cpx #$28
bne wrapmsg
ldy column
lda tab01,y ; Pone nueva información en la columna 40 (oculta)
sta scrloc01+39
lda tab01,y
sta scrloc02+39
lda tab01,y
sta scrloc03+39
lda tab01,y
sta scrloc04+39
lda tab01,y
sta scrloc05+39
lda tab01,y
sta scrloc06+39
lda tab01,y
sta scrloc07+39
lda tab01,y
sta scrloc08+39
lda tab01,y
sta scrloc09+39
lda tab01,y
sta scrloc10+39
lda tab01,y
sta scrloc11+39
lda tab01,y
sta scrloc12+39
lda tab01,y
sta scrloc13+39
lda tab01,y
sta scrloc14+39
lda tab01,y
sta scrloc15+39
lda tab01,y
sta scrloc16+39
inc column
lda #$07
sta xfine
nomove rts
;
; Datos gráficos para el scroll
;
tab01 !byte 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30
!byte 33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60
!byte 61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88
!byte 89,90,91,82,83,84,85,86,87,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112
!byte 113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133
!byte 134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154
!byte 155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175
!byte 176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196
!byte 197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217
!byte 218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238
!byte 239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,32,0,0,0,0