1
Ensamblador / Re:Rutinas de ensamblador con Laddh
« en: Mayo 13, 2024, 19:17:27 »
Pues míratelo, ahí los tienes en la rutina expande, y en el ejecutable en acción.
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.
; 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
; 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
; 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