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 - Laddh

Páginas: [1] 2 3 ... 17
1
Ensamblador / Re:Rutinas de ensamblador con Laddh
« en: Hoy a las 11:32:09 »
Próximo capítulo: que el sprite pase los X > 255

Nos centraremos solo en esto porque lo merece. Al empezar a programar con sprites siempre nos encontraremos con este problema, en un byte solo caben valores de 0 a 255 pero en la pantalla visible se llega hasta la coordenada 346 x en horizontal. Para acceder a esa parte derecha de la pantalla hay que activar el bit correspondiente a cada sprite en el registro $d010, lda #1 sta $d010 para el sprite 0 por ejemplo, y señalar su nueva posición X volviendo a escribir 0 en su coordenada X, o sea 0=256, 1=257, etc, si seguimos avanzando hacia la derecha hasta 96 máximo que ya se saldría de la pantalla.
Y a la inversa si volvemos a la izquierda, habría que poner a 0 el bit correspondiente en el registro $d010 para que nos lo muestre en la parte izquierda de la pantalla, o sea, desactivar registro y poner el valor 255 en la coordenada X del sprite.
Esto es fácil de hacer con un sprite pero se complica cuando estas moviendo los 8 sprites por la pantalla, comprobar todas las posibles combinaciones de si están en el lado derecho o el izquierdo es arduo y farragoso si lo compruebas sprite por sprite, pero no hace mucho encontré una rutina de como lo controla el Richard Bayliss/TND en su excelente tutorial de Assemble it en https://tnd64.unikat.sk/ y es la rutina Expande que añadiremos a nuestro programa, con solo 11 mnemónicos, niquelao, ver para creer.
Ejecutar el programa y analizar la rutina en el listado, con esas simples líneas controla los 8 sprites, estén o no en pantalla en todo momento, lo que hace es crear unas variables spritepos para las coordenadas X,Y de los 8 sprites que estan al final del listado, y en la rutina EXPANDE las convierte a coordenadas hardware. Simple y efectivo. 
He añadido una rutina SpritesWave para que veáis como se mueven todos los sprites por pantalla.

Código: [Seleccionar]
; 10 SYS (2064) línea para que autoarranque el programa

*=$0801

        BYTE    $0E, $08, $0A, $00, $9E, $20, $28,  $32, $30, $36, $34, $29, $00, $00, $00

*=$0810 ;inicio del programa

v = $d000       ;variable que apunta al chip VIC, el que gestiona todo lo gráfico


        jsr musica      ;llama a rutina música por interrupciones
        jsr sprites     ;llamamos a la rutina para presentar el sprite en pantalla
loop    jsr raster_wait ;sin esto no veríamos nada, el código máquina es raaaaaapido               
        jsr PlayerControl ;la rutina para controlar el joystick
        jsr expande     ;controla msb de los sprites, > o < de 255 x
        jmp loop        ;vuelve al bucle principal


expande  ldx #$00       ;posición msb de los sprites
xloop    lda spritepos+1,x
         sta $d001,x
         lda spritepos,x
         asl        ;x position is more
         ror $d010  ;than 256 pixels
         sta $d000,x
         inx
         inx
         cpx #16
         bne xloop
         rts

SpritesWave
        lda contador
        tax
        inc contador

        lda tabla,x
        sta spritepos+4
        lda tabla+$100,x
        sta spritepos+5

        lda tabla,x
        sec
        sbc #10
        sta spritepos+6
        lda tabla+$100,x
        sta spritepos+7

        lda tabla,x
        sec
        sbc #20
        sta spritepos+8
        lda tabla+$100,x
        sta spritepos+9

        lda tabla,x
        sec
        sbc #30
        sta spritepos+2
        lda tabla+$100,x
        sta spritepos+3

        lda tabla,x
        sec
        sbc #40
        sta spritepos+10
        lda tabla+$100,x
        sta spritepos+11

        lda tabla,x
        sec
        sbc #50
        sta spritepos+12
        lda tabla+$100,x
        sta spritepos+13

        lda tabla,x
        sec
        sbc #60
        sta spritepos+14
        lda tabla+$100,x
        sta spritepos+15

        rts

MUSICA    sei
          lda #<irq
          ldx #>irq
          sta $314
          stx $315
          lda #$00
          JSR $1000     ;INITIALIZE MUSIC
          cli
          RTS

irq       lda #$01
          STA $D019     ; ACK ANY RASTER IRQS
          JSR $1003     ;PLAY THE MUSIC
          jsr SpritesWave
          jmp $ea31


PlayerControl
        LDA $DC00   ;LEEMOS JOY
        AND #31     ;LA CUATRO DIRECCIONES ARRIBA ABAJO IZQ DER   
        CMP #30     ;MAS DIAGONALES Y FUEGO
        BEQ ARR
        CMP #29
        BEQ ABJ
        CMP #27
        BEQ IZQ
        CMP #23
        BEQ DER
        cmp #22
        beq derar
        cmp #21
        beq derab
        CMP #25
        BEQ IZQab
        CMP #26
        BEQ IZQar
        cmp #15
        beq fuego
        rts

arr     dec spritepos+1 ;coordenada vertical del sprite 0
        rts
abj     inc spritepos+1
        rts
izq     dec spritepos   ;coordenada horizontal del sprite 0
        rts
der     inc spritepos
        rts
derar   inc spritepos
        dec spritepos+1
        rts
derab   inc spritepos
        inc spritepos+1
        rts
izqab   dec spritepos
        inc spritepos+1
        rts
izqar   dec spritepos
        dec spritepos+1
        rts
fuego   inc $d020       ;cambia color del borde pantalla
        rts

raster_wait             ;espera línea raster 255, el raster pasa 50 veces por segundo
l       LDA #$ff        ;en pantalla
        CMP $D012
        BNE l
        BIT $d011
        BMI l
        rts

*=2368  ; la forma del sprite
 byte 9,86,0
 byte 37,86,0
 byte 149,86,0
 byte 85,86,0
 byte 85,170,170
 byte 86,37,86
 byte 86,37,86
 byte 86,37,86
 byte 86,37,90
 byte 86,42,168
 byte 86,42,168
 byte 86,47,250
 byte 86,47,254
 byte 86,47,254
 byte 86,47,254
 byte 86,42,170
 byte 85,170,0
 byte 85,86,0
 byte 149,86,0
 byte 37,86,0
 byte 9,86,0

sprites lda #255
        sta v+21        ;activamos todos los sprites
        sta v+28        ;activamos modo multicolor del sprite 0
        lda #37         ;puntero para indicar donde estan los datos del sprite, 37*64=2368
        sta 2040
        sta 2041
        sta 2042
        sta 2043
        sta 2044
        sta 2045
        sta 2046
        sta 2048
        lda #1          ;color sprites
        sta v+39
        lda #9          ;color sprites
        sta v+40
        lda #3          ;color sprites
        sta v+41
        lda #4          ;color sprites
        sta v+42
        lda #5          ;color sprites
        sta v+43
        lda #6          ;color sprites
        sta v+44
        lda #7          ;color sprites
        sta v+45
        lda #8          ;color sprites
        sta v+46

        lda #14         ;color multicolor 1, para todos los sprites
        sta v+37
        lda #2          ;color multicolor 2, para todos los sprites
        sta v+38
        lda #100        ;coordenadas x,y del sprite 0
        sta spritepos
        sta spritepos+1
        rts

*=$1000
incbin"commodore_64.sid",126

contador        byte 0

spritepos       BYTE $00,$00 ;SPRITE 0 X/Y
                BYTE $00,$00 ;SPRITE 1 X/Y
                BYTE $00,$00 ;SPRITE 2 X/Y
                BYTE $00,$00 ;SPRITE 3 X/Y
                BYTE $00,$00 ;SPRITE 4 X/Y
                BYTE $00,$00 ;SPRITE 5 X/Y
                BYTE $00,$00 ;SPRITE 6 X/Y
                BYTE $00,$00 ;SPRITE 7 X/Y

tabla     BYTE $B6,$B6,$B6,$B6,$B3,$B0,$AD,$AA,$A7,$A4,$A1,$9E,$9B,$98,$95,$92,$8F,$8C
          BYTE $89,$86,$83,$80,$7D,$7A,$77,$74,$71,$6E,$6B,$68,$65,$62,$5F,$5C,$59,$56,$53,$50
          BYTE $4D,$4A,$47,$44,$41,$3E,$3B,$38,$35,$32,$2F,$2C,$29,$26,$23,$20,$1D,$1A,$17,$14
          BYTE $11,$0E,$0B,$08,$05,$02,$FF,$FC,$F9,$F6,$FC,$FC,$FC,$FF,$02,$05,$08,$0B,$0E,$11
          BYTE $14,$17,$1A,$1D,$20,$23,$26,$29,$2C,$2F,$32,$35,$38,$3B,$3E,$41,$44,$47,$4A,$4D
          BYTE $50,$53,$56,$59,$5C,$5F,$62,$65,$68,$6B,$6E,$71,$74,$77,$7A,$7D,$80,$83,$86,$89
          BYTE $8C,$8F,$92,$95,$98,$9B,$9E,$A1,$A4,$A7,$AA,$AD,$B0,$B3,$B6,$B6,$B9,$B9,$B9,$B9
          BYTE $B9,$B9,$B6,$B3,$B0,$AD,$AA,$A7,$A4,$A1,$9E,$9B,$98,$95,$92,$8F,$8C,$89,$86,$83
          BYTE $80,$7D,$7A,$77,$74,$71,$6E,$6B,$68,$65,$62,$5F,$5C,$59,$56,$53,$50,$4D,$4A,$47
          BYTE $44,$41,$3E,$3B,$38,$35,$32,$2F,$2C,$29,$26,$23,$20,$1D,$1A,$17,$14,$11,$0E,$0B
          BYTE $08,$05,$02,$FF,$FC,$F9,$F6,$F6,$F6,$F6,$F6,$F6,$F6,$F6,$F6,$F6,$F6,$F6,$F6,$F6
          BYTE $F6,$F6,$F6,$F6,$F6,$F6,$F6,$F6,$F6,$F6,$F6,$F6,$F6,$F6,$F6,$F6,$F6,$F6,$F6,$F6
          BYTE $F6,$F6,$F6,$F6,$F6,$F6,$F6,$F6,$F6,$F6,$F6,$F6,$F6,$F6,$F6,$F6,$F6,$E6,$36,$36
          BYTE $36,$36,$36,$36,$36,$36,$36,$36,$36,$36,$36,$36,$36,$36,$36,$36,$36,$36,$36,$36
          BYTE $36,$36,$36,$36,$36,$36,$36,$36,$36,$36,$36,$36,$36,$36,$36,$36,$36,$36,$36,$36
          BYTE $36,$36,$36,$36,$36,$36,$36,$36,$36,$36,$36,$36,$36,$36,$36,$36,$36,$36,$36,$36
          BYTE $36,$36,$36,$36,$36,$36,$72,$72,$72,$72,$72,$72,$72,$72,$72,$72,$72,$72,$72,$72
          BYTE $72,$72,$72,$72,$72,$72,$72,$72,$72,$72,$72,$72,$72,$72,$72,$72,$72,$72,$72,$72
          BYTE $72,$72,$72,$72,$72,$72,$72,$72,$72,$72,$72,$72,$72,$72,$72,$72,$72,$72,$72,$72
          BYTE $72,$72,$72,$72,$72,$72,$72,$72,$72,$72,$72,$72,$B4,$B4,$B4,$B4,$B4,$B4,$B4,$B4
          BYTE $B4,$B4,$B4,$B4,$B4,$B4,$B4,$B4,$B4,$B4,$B4,$B4,$B4,$B4,$B4,$B4,$B4,$B4,$B4,$B4
          BYTE $B4,$B4,$B4,$B4,$B4,$B4,$B4,$B4,$B4,$B4,$B4,$B4,$B4,$B4,$B4,$B4,$B4,$B4,$B4,$B4
          BYTE $B4,$B4,$B4,$B4,$B4,$B4,$B4,$B4,$B4,$B4,$B4,$B4,$B4,$B4,$B4,$B4,$B4,$B4,$B4,$B4
          BYTE $B4,$B4,$B4,$B4,$B4,$B4,$B4,$B4,$B4,$B4,$B4,$B4,$B4,$B4,$B4,$B4,$B4,$B4,$B4,$B4
          BYTE $B4,$B4,$B4,$B4,$B4,$B4,$B4,$B4,$B4,$B4,$B4,$B4,$B4,$B4,$B4,$B4,$B4,$B4,$B4,$B4
          BYTE $B4,$B4,$B4,$B4,$B4,$B4,$B4,$B4,$B4,$B4,$B4,$B4,$B4,$5A

2
Ensamblador / Re:Rutinas de ensamblador con Laddh
« en: Mayo 01, 2024, 13:43:56 »
Es una buena aclaración  :D

3
Ensamblador / Re:Rutinas de ensamblador con Laddh
« en: Abril 29, 2024, 11:51:43 »
Y sí, lo de la música es sencillísimo de utilizar, aunque más difícil de entender, el fichero SID es más que la "partitura", es un programa en si mismo con varios datos de formato, de ahí el ,126 que se incluye al final del incbin para saltarse esos datos. Estaría bien que algún virtuoso de la creación de música nos aclarase todo lo que conlleva un fichero SID.

4
Ensamblador / Re:Rutinas de ensamblador con Laddh
« en: Abril 29, 2024, 11:22:08 »
Correcto, el gráfico es una captura de nuestro querido foro, filtrado por el GangEd para convertirlo en un fichero con formato Koala.
Sí, en la próxima entrega añadiremos la rutina para cargar una pantalla de caracteres editados junto a que los sprites sobrepasen el limite de los 255 en X.

5
Ensamblador / Re:Rutinas de ensamblador con Laddh
« en: Abril 26, 2024, 13:25:18 »
Siguiente entrega, añadimos un par de rutinas al programa anterior, la de carga de una pantalla en modo alta resolución multicolor, y una rutina mínima para ejecutar música por interrupciones.
Estas pantallas hires, quedan mas guapas y espectaculares pero a costa de una gran ocupación de memoria, 10k en este caso de un grafico en formato Koala, que añadimos al programa con el incbin (include binario) en la posición de memoria $2000 (8192), tenéis la rutina cargahr para ver como lo hace.
Demasiado, yo solo le veo utilidad como gráfico de presentación del programa y luego ocupar esas mismas posiciones de memoria al cargar el resto del programa.
Lo de las interrupciones, yo no he encontrado un solo sitio donde te lo expliquen concienzudamente, pero a grandes rasgos es aprovechar la misma rutina de interrupción del sistema que 50 veces por segundo chequea el teclado, pantalla, todo el sistema, añadiendo tú rutina al vector $0314-$0315, como podéis ver en el listado, esa rutina ejecuta un sid que tengamos en la posición $1000 de memoria, añadida con su correspondiente incbin.
Así ya veis, que simplemente añadiendo rutinas que tengáis por separado, acabara  convirtiéndose en un programa más presentable.

Código: [Seleccionar]
; 10 SYS (2064) línea para que autoarranque el programa

*=$0801

        BYTE    $0E, $08, $0A, $00, $9E, $20, $28,  $32, $30, $36, $34, $29, $00, $00, $00

*=$0810 ;inicio del programa

v = $d000       ;variable que apunta al chip VIC, el que gestiona todo lo gráfico


        jsr cargahr     ;carga pantalla gráfica multicolor
        jsr musica      ;llama a rutina música por interrupciones
        jsr sprites     ;llamamos a la rutina para presentar el sprite en pantalla
loop    jsr raster_wait ;sin esto no veríamos nada, el código máquina es raaaaaapido               
        jsr PlayerControl ;la rutina para controlar el joystick
        jmp loop        ;vuelve al bucle principal


cargahr LDA #$01        ; Carga A con #$00, que es el código del color negro.
        STA $D020       ; Guarda el valor #$00 en la dirección $D020, que corresponde al borde de la pantalla.
        STA $D021       ; Guarda el valor #$00 en la dirección $D021, que corresponde al fondo de la pantalla.
        TAX             ; Transfiere el contenido de A a X. De esta manera carga X con #$00, que es el valor inicial de un bucle, ahorrando espacio de memoria.
COPIA   LDA $3F40,X     ; Carga A con el valor de la dirección $3F40 y siguientes.
        STA $0400,X     ; Guarda el valor de A en la posición $0400 y siguientes del mapa de memoria de la pantalla.
        LDA $4040,X     ; Carga A con el valor de la dirección $4040 y siguientes.
        STA $0500,X     ; Guarda el valor de A en la posición $0500 y siguientes.
        LDA $4140,X     ; Carga A con el valor de la dirección $4140 y siguientes.
        STA $0600,X     ; Guarda el valor de A en la posición $0600 y siguientes.
        LDA $4240,X     ; Carga A con el valor de la dirección $4240 y siguientes.
        STA $0700,X     ; Guarda el valor de A en la posición $0700 y siguientes.
        LDA $4328,X     ; Carga A con el valor de la dirección $4328 y siguientes.
        STA $D800,X     ; Guarda el valor de A en la posición $D800 y siguientes del mapa de colores de pantalla.
        LDA $4428,X     ; Carga A con el valor de la dirección $4428 y siguientes.
        STA $D900,X     ; Guarda el valor de A en la posición $D800 y siguientes.
        LDA $4528,X     ; Carga A con el valor de la dirección $4528 y siguientes.
        STA $DA00,X     ; Guarda el valor de A en la posición $D800 y siguientes.
        LDA $4628,X     ; Carga A con el valor de la dirección $4628 y siguientes.
        STA $DB00,X     ; Guarda el valor de A en la posición $D800 y siguientes.
        DEX             ; Decrementa el valor de X.
        BNE COPIA       ; Salta a COPIA hasta que el valor de X=#$00.
        LDA #$3B        ; Carga A con #$3B
        LDX #$18        ; Carga X con #$18
        LDY #$18        ; Carga Y con #$18, que determina que el código del bitmap realizado con el KOALA necesariamente debe ensamblarse a partir de la dirección de memoria $2000.
        STA $D011       ; Guarda el valor de A en la dirección $D011, que selecciona el modo bitmap.
        STX $D016       ; Guarda el valor de X en la dirección $D016, que selecciona el modo multicolor.
        STY $D018     
        rts

MUSICA    sei
          lda #<irq
          ldx #>irq
          sta $314
          stx $315
          lda #$00
          JSR $1000     ;INITIALIZE MUSIC
          cli
          RTS

irq       lda #$01
          STA $D019     ; ACK ANY RASTER IRQS
          JSR $1003     ;PLAY THE MUSIC
          jmp $ea31


PlayerControl
        LDA $DC00   ;LEEMOS JOY
        AND #31     ;LA CUATRO DIRECCIONES ARRIBA ABAJO IZQ DER   
        CMP #30     ;MAS DIAGONALES Y FUEGO
        BEQ ARR
        CMP #29
        BEQ ABJ
        CMP #27
        BEQ IZQ
        CMP #23
        BEQ DER
        cmp #22
        beq derar
        cmp #21
        beq derab
        CMP #25
        BEQ IZQab
        CMP #26
        BEQ IZQar
        cmp #15
        beq fuego
        rts

arr     dec v+1 ;coordenada vertical del sprite 0
        rts
abj     inc v+1
        rts
izq     dec v   ;coordenada horizontal del sprite 0
        rts
der     inc v
        rts
derar   inc v
        dec v+1
        rts
derab   inc v
        inc v+1
        rts
izqab   dec v
        inc v+1
        rts
izqar   dec v
        dec v+1
        rts
fuego   inc $d020       ;cambia color del borde pantalla
        rts

raster_wait             ;espera línea raster 255, el raster pasa 50 veces por segundo
l       LDA #$ff        ;en pantalla
        CMP $D012
        BNE l
        BIT $d011
        BMI l
        rts

sprites lda #1
        sta v+21        ;activamos sprite 0
        sta v+28        ;activamos modo multicolor del sprite 0
        lda #37         ;puntero para indicar donde estan los datos del sprite, 37*64=2368
        sta 2040
        lda #1          ;color blanco a sprite 0
        sta v+39
        lda #14         ;color multicolor 1, para todos los sprites
        sta v+37
        lda #2          ;color multicolor 2, para todos los sprites
        sta v+38
        lda #100        ;coordenadas x,y del sprite 0
        sta v
        sta v+1
        rts

*=$1000
incbin"commodore_64.sid",126

*=$2000
incbin"hiresmcm.koa",2

*=2368  ; la forma del sprite
 byte 9,86,0
 byte 37,86,0
 byte 149,86,0
 byte 85,86,0
 byte 85,170,170
 byte 86,37,86
 byte 86,37,86
 byte 86,37,86
 byte 86,37,90
 byte 86,42,168
 byte 86,42,168
 byte 86,47,250
 byte 86,47,254
 byte 86,47,254
 byte 86,47,254
 byte 86,42,170
 byte 85,170,0
 byte 85,86,0
 byte 149,86,0
 byte 37,86,0
 byte 9,86,0

6
Ensamblador / Re:Rutinas de ensamblador con Laddh
« en: Abril 22, 2024, 11:52:51 »
A por ello! y tu próxima aventura será sin más limitación que lo que imagines  ;)

7
Ensamblador / Re:Rutinas de ensamblador con Laddh
« en: Abril 21, 2024, 12:12:11 »
Pues cuando utilices la función del Trascal del joy, en esta primera entrega tienes listado y ejemplo de como funciona la lectura del joystick, así también sabrás como funciona "por dentro"

8
Ensamblador / Re:Rutinas de ensamblador con Laddh
« en: Abril 20, 2024, 18:57:15 »
Aaaaahg!, yo quería convertirte en talibán del asm!!!

9
Ensamblador / Re:Rutinas de ensamblador con Laddh
« en: Abril 20, 2024, 11:37:43 »
Esa es la intención, a ver si colapsamos CSDB con nuestras producciones!!!  ;D

10
Ensamblador / Re:Rutinas de ensamblador con Laddh
« en: Abril 19, 2024, 22:07:15 »
Siempre he utilizado el CBM Prg Studio, es cómodo, y tienes a mano los editores de sprites y caracteres.

11
Ensamblador / Rutinas de ensamblador con Laddh
« en: Abril 19, 2024, 13:11:48 »
Buenas commodorianos, inicio aquí este hilo, dirigido para los que como yo hace algunos años, tengan la chispa, la inquietud de querer hacer algo con su commodore64 en ensamblador y hacer algo más que darle a la palanca, pero se les hace un muro infranqueable y aún no se han atrevido a saltar del trampolín. En ensamblador, nada de gamemakers porque estaréis limitados a lo que hace el maker y os quedareis con las ganas. Nada de teoría y parrafadas técnicas porque ni yo me las se, vamos a lo práctico con un ejemplo que funciona, se pueda ver lo que hace, comentado y abierto a lo que se os ocurra. Por supuesto que algún libro del 6510, 6502 os tenéis que leer, no hace falta memorizar, solo pillar la idea, especialmente de las comparaciones.
Seguiremos el esqueleto de como yo lo fui aprendiendo.
Primero una rutina de Joystick para mover un sprite. En mi caso se acabo contiendo en Race.
Una rutina para presentar una pantalla gráfica de alta resolución. Se convirtió en Argos.
Una rutina para presentar un pantalla de caracteres editados. Se convirtió en Excalibur.
Una rutina de scroll por hardware lateral. Se convirtió en Mad Race.
Y si la cosa se anima y hay interés, pues lo que vaya saliendo.

Código: [Seleccionar]
; 10 SYS (2064) línea para que autoarranque el programa

*=$0801

        BYTE    $0E, $08, $0A, $00, $9E, $20, $28,  $32, $30, $36, $34, $29, $00, $00, $00

*=$0810 ;inicio del programa

v = $d000       ;variable que apunta al chip VIC, el que gestiona todo lo gráfico

        jsr sprites     ;llamamos a la rutina para presentar el sprite en pantalla
loop    jsr raster_wait ;sin esto no veríamos nada, el código máquina es raaaaaapido               
        jsr PlayerControl ;la rutina para controlar el joystick
        jmp loop        ;vuelve al bucle principal

PlayerControl
        LDA $DC00   ;LEEMOS JOY
        AND #31     ;LA CUATRO DIRECCIONES ARRIBA ABAJO IZQ DER   
        CMP #30     ;MAS DIAGONALES Y FUEGO
        BEQ ARR
        CMP #29
        BEQ ABJ
        CMP #27
        BEQ IZQ
        CMP #23
        BEQ DER
        cmp #22
        beq derar
        cmp #21
        beq derab
        CMP #25
        BEQ IZQab
        CMP #26
        BEQ IZQar
        cmp #15
        beq fuego
        rts

arr     dec v+1 ;coordenada vertical del sprite 0
        rts
abj     inc v+1
        rts
izq     dec v   ;coordenada horizontal del sprite 0
        rts
der     inc v
        rts
derar   inc v
        dec v+1
        rts
derab   inc v
        inc v+1
        rts
izqab   dec v
        inc v+1
        rts
izqar   dec v
        dec v+1
        rts
fuego   inc $d020       ;cambia color del borde pantalla
        rts

raster_wait             ;espera línea raster 255, el raster pasa 50 veces por segundo
l       LDA #$ff        ;en pantalla
        CMP $D012
        BNE l
        BIT $d011
        BMI l
        rts

sprites lda #1
        sta v+21        ;activamos sprite 0
        sta v+28        ;activamos modo multicolor del sprite 0
        lda #192        ;puntero para indicar donde estan los datos del sprite, 192*64=12288
        sta 2040
        lda #1          ;color blanco a sprite 0
        sta v+39
        lda #14         ;color multicolor 1, para todos los sprites
        sta v+37
        lda #2          ;color multicolor 2, para todos los sprites
        sta v+38
        lda #100        ;coordenadas x,y del sprite 0
        sta v
        sta v+1
        rts

*=12288 ; la forma del sprite
 byte 9,86,0
 byte 37,86,0
 byte 149,86,0
 byte 85,86,0
 byte 85,170,170
 byte 86,37,86
 byte 86,37,86
 byte 86,37,86
 byte 86,37,90
 byte 86,42,168
 byte 86,42,168
 byte 86,47,250
 byte 86,47,254
 byte 86,47,254
 byte 86,47,254
 byte 86,42,170
 byte 85,170,0
 byte 85,86,0
 byte 149,86,0
 byte 37,86,0
 byte 9,86,0

Por supuesto hay mejores rutinas para leer el joy de una sola comparación, pero esta es buena para comprender como lo hace

12
Desarrollo / Re:TRSE, Turbo Rascal Sintax Error
« en: Marzo 15, 2024, 19:27:04 »
Hola Josepzin y compañía, yo es que estos compiladores ( C, Pascal..) para commodore64 no los veo, en un pc con gigas de memoria libre pues no importa que el ejecutable que te resulte al compilar sea mas o menos grande, pero en nuestra panera si quieres hacer un proyecto ya grande cada byte es vital, enseguida te quedas sin espacio y os pongo un ejemplo para veáis claro lo que quiero explicar. Buscando ejemplos para multiplexar sprites llegué a un listado en C con el cc65 para mostrar 64 sprites en pantalla, el listado era cortito y con un bucle creaba 8 sprites por linea raster, bien, pero cuando me bajo el ejecutable creado y me lo miro, ocupaba casi toda la memoria, había creado 64 veces la misma rutina incrementando en uno, cuando con un simple bucle en ensamblador en unos pocos bytes lo tienes hecho.
No los veo optimizados para trabajar en un entorno tan restringido como es el de nuestros micros.
Ya puestos y si de verdad tienes empeño, metete al ensamblador que solo son unos poco nemónicos a memorizar y como dice mirazulado lo que hay que saber es de la máquina, en vez de aprenderte un montón de comandos y librerías que aún te llevara mas tiempo, y haces un código mucho mas eficiente.
A mí, el que me parece difícil ahora es el Basic  ;D

13
General / Re:C64 Cracks
« en: Enero 25, 2024, 16:53:25 »
Estan bien estos juegos de estrategia y pensar un poco, no todo es pegar tiritos. Buen trabajo con el crack, Bieno.

14
Ensamblador / Re:Scroll de varias pantallas a izquierda y derecha
« en: Noviembre 19, 2023, 20:27:24 »
Conseguido!!!  ;D  como bien indicaba Dashiad se trata de tener un mapa con un espacio contiguo en memoria, en el caso de este ejemplo de 100 caracteres de ancho por 50 de alto, lo que ahorra y mucho los cálculos comparado con el que yo hacía con tres pantallas por separado. A grandes rasgos se trata de sobre el mapa, disponer una "ventana" de 40x25, que es la pantalla real, que mueves con un offset de sus coordenadas x,y de arriba a la izquierda. Ahora ya puedes girar el joystick izquierda derecha arriba abajo que la pantalla mantiene perfectamente su estructura y no se desmorona.
Con esto ya puedo tirar adelante el proyecto que tengo en la cabeza, ha costado unos meses pero como mola programar el C64!

15
Ensamblador / Re:Scroll de varias pantallas a izquierda y derecha
« en: Abril 26, 2023, 08:47:16 »
Citar
Lo que no entiendo muy bien es lo que dices de "tengo 3 pantallas", cada una con su propio comienzo.
Cuando he implementado scroll, yo he montado un "mapa". Un mapa con scroll puede tener perfectamente 3 pantallas y media de ancho, y tiene 1 único comienzo en memoria.
Bueno, esto si me da una idea de por donde tirar, tal como lo tengo implementado controlo con un contador hasta 40 caracteres por pantalla y ahí paso a la pantalla siguiente, seria controlar hasta 120 con el contador entonces y poner las pantallas contiguas en memoria, a probar...
Citar
Si, además, el mapa está compuesto de tiles...
Nunca le he visto sentido a utilizar tiles en el C64 ya que al hacer el scroll por hardware mueves la pantalla entera de caracteres y no le veo utilidad, o lo más seguro que no acabo de comprender la idea
Citar
Lo que me resulta más complicado son las distintas formas de activar el scroll. O sea, cuándo y cómo "mueves la camara". En el video de Robocop, hay una especie de "caja" donde se mueve el personaje, de la cual no sale (excepto en los extremos del mapa). El personaje "empuja" la cámara cuando llega al borde de esa caja, y así activa el scroll, que se hace a velocidad constante.
Pues sí, entiendo que será con un control exhaustivo de coordenadas x,y del sprite traducidas a coordenadas de caracteres
Citar
Ya hace mucho que lo hice, asi que no recuerdo los detalles, pero cuando haces scroll, entras en el modo en el que el c64 deja visibles sólo 38 columnas, en vez de 40, por lo que las columnas "incompletas" de los lados, no las ves
Sí, supongo que es modus operandis de scroll por hardware en el C64, pasar a modo 38 columnas, activar el scroll por hardware, scroll por software para mover una columna en toda la pantalla, volver a empezar, así lo he visto siempre en todos los ejemplos, si miráis el listado así esta 

Páginas: [1] 2 3 ... 17