1
Ensamblador / Re:Rutinas de ensamblador con Laddh
« en: Mayo 01, 2024, 13:43:56 »
Es una buena aclaració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 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
Lo que no entiendo muy bien es lo que dices de "tengo 3 pantallas", cada una con su propio comienzo.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...
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.
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
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
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 vesSí, 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
; 10 SYS2064
*=$0801
BYTE $0B, $08, $0A, $00, $9E, $32, $30, $36, $34, $00, $00, $00
v=$d000
screen_control_register1 = $d011
screen_control_register2 = $d016
*=2064
jsr PANCHAR
jsr PANTALLA
jsr carga_pres_d
jsr sprites
loop jsr joy
jsr raster_wait
jmp loop
PANCHAR LDA 56578
ORA #3 ;PREPARAMOS PARA SELECCIONAR EL ...
STA 56578
LDA 56576
AND #252
ORA #2 ; ... BANCO DE VIDEO 1 (16384)
STA 56576
; COMO MEMORIA PANTALLA SE QUEDA EN SU POSICIÓN POR DEFECTO, NO LA CAMBIAMOS
; LDA $D018
; AND #15
; ORA #16 ;POSICIÓN PANTALLA DENTRO DEL BANCO
; STA $D018
; SI QUISIERAMOS EL CURSOR
; LDA #68 ;CURSOR PANTALLA EN BANCO 1
; STA 648
LDA $D018
AND #240 ;ESTABLECEMOS EL MODO CARACTER
ORA #12 ;BUSCA CARACTERES A PARTIR DE 12288 + DIR BANCO 1
STA $D018
LDA $D016
ORA #16 ;MODO CARACTER MULTICOLOR
STA $D016
RTS
carga_pres_d ;Carga la primera pantalla P0
ldx #0
COPIAp1 LDA $c000,X
STA $4400,X
LDA $c100,X
STA $4500,X
LDA $c200,X
STA $4600,X
LDA $c300,X
STA $4700,X
DEX
BNE COPIAp1
rts
raster_wait ;espera línea raster
l1r LDA #$ff
CMP $D012
BNE l1r
BIT $d011
BMI l1r
rts
PANTALLA
LDA #6
STA $D021 ;COLOR FONDO
LDA #2
STA $D022 ;MULTICOLOR 1
LDA #4
STA $D023 ;MULTICOLOR 2
lda #8
sta $286
LDA screen_control_register2
AND #$F7 ;pone pantalla en 38 columnas
STA screen_control_register2
RTS
sprites lda #3 ; Activa sprites
sta v+21
lda #2
sta v+28
lda #32
sta 2040+16384
lda #34
sta 2041+16384
lda #3
sta v+29
sta v+23
lda #0
sta v+39
lda #1
sta v+40
lda #3
sta v+37
lda #7
sta v+38
lda #160
sta v
sta v+2
lda #100
sta v+1
sta v+3
rts
joy 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 #31
beq nofire
cmp #15
beq fire
cmp #22
beq der
cmp #21
beq der
CMP #25
BEQ IZQ
CMP #26
BEQ IZQ
JMP joy
arr jsr arriba
rts
abj jsr abajo
rts
izq jsr izquierda
rts
der jsr derecha
rts
nofire rts
fire rts
arriba dec v+1
dec v+3
rts
abajo inc v+1
inc v+3
rts
izquierda
lda #33
sta 2040+16384
lda #35
sta 2041+16384
jsr right
jsr right
RTS
DERECHA lda #32
sta 2040+16384
lda #34
sta 2041+16384
JSR left
jsr left
RTS
left
LDX screen_offset
DEX
STX screen_offset
CPX #$FF
BEQ continue
JMP end
continue
LDX #$07
STX screen_offset
jsr move_rows_left
jsr advance_scroll
end
LDA screen_control_register2
AND #$F8
ORA screen_offset
STA screen_control_register2
rts
move_rows_left
LDX #$00
l2
LDA $4401,X
STA $4400,X
LDA $4429,X
STA $4428,X
LDA $4451,X
STA $4450,X
LDA $4479,X
STA $4478,X
LDA $44A1,X
STA $44A0,X
LDA $44C9,X
STA $44C8,X
LDA $44F1,X
STA $44F0,X
LDA $4519,X
STA $4518,X
LDA $4541,X
STA $4540,X
LDA $4569,X
STA $4568,X
LDA $4591,X
STA $4590,X
LDA $45B9,X
STA $45B8,X
LDA $45E1,X
STA $45E0,X
LDA $4609,X
STA $4608,X
LDA $4631,X
STA $4630,X
LDA $4659,X
STA $4658,X
LDA $4681,X
STA $4680,X
LDA $46A9,X
STA $46A8,X
LDA $46D1,X
STA $46D0,X
LDA $46F9,X
STA $46F8,X
INX
CPX #$27
BNE l2
rts
advance_scroll
lda contador
cmp #39
bpl advance_scroll2
tax
lda $c400,x
sta $4427
lda $c428,x
sta $444f
lda $c450,x
sta $4477
lda $c478,x
sta $449f
lda $c4a0,x
sta $44c7
lda $c4c8,x
sta $44ef
lda $c4f0,x
sta $4517
lda $c518,x
sta $453f
lda $c540,x
sta $4567
lda $c568,x
sta $458f
lda $c590,x
sta $45b7
lda $c5b8,x
sta $45df
lda $c5e0,x
sta $4607
lda $c608,x
sta $462f
lda $c630,x
sta $4657
lda $c658,x
sta $467f
lda $c680,x
sta $46a7
lda $c6a8,x
sta $46cf
lda $c6d0,x
sta $46f7
lda $c6f8,x
sta $471f
inc contador
rts
screen_offset byte $00
contador byte 0
advance_scroll2
lda contador2
cmp #39
bpl advance_scroll3
tax
lda $c800,x
sta $4427
lda $c828,x
sta $444f
lda $c850,x
sta $4477
lda $c878,x
sta $449f
lda $c8a0,x
sta $44c7
lda $c8c8,x
sta $44ef
lda $c8f0,x
sta $4517
lda $c918,x
sta $453f
lda $c940,x
sta $4567
lda $c968,x
sta $458f
lda $c990,x
sta $45b7
lda $c9b8,x
sta $45df
lda $c9e0,x
sta $4607
lda $ca08,x
sta $462f
lda $ca30,x
sta $4657
lda $ca58,x
sta $467f
lda $ca80,x
sta $46a7
lda $caa8,x
sta $46cf
lda $cad0,x
sta $46f7
lda $caf8,x
sta $471f
inc contador2
rts
contador2 byte 0
advance_scroll3
lda contador3
cmp #39
bpl torna
tax
lda $c000,x
sta $4427
lda $c028,x
sta $444f
lda $c050,x
sta $4477
lda $c078,x
sta $449f
lda $c0a0,x
sta $44c7
lda $c0c8,x
sta $44ef
lda $c0f0,x
sta $4517
lda $c118,x
sta $453f
lda $c140,x
sta $4567
lda $c168,x
sta $458f
lda $c190,x
sta $45b7
lda $c1b8,x
sta $45df
lda $c1e0,x
sta $4607
lda $c208,x
sta $462f
lda $c230,x
sta $4657
lda $c258,x
sta $467f
lda $c280,x
sta $46a7
lda $c2a8,x
sta $46cf
lda $c2d0,x
sta $46f7
lda $c2f8,x
sta $471f
inc contador3
rts
contador3 byte 0
torna lda #0
sta contador
sta contador2
sta contador3
jsr advance_scroll
rts
right
LDX screen_offset_r
inx
STX screen_offset_r
CPX #8
Beq continuer
JMP endr
continuer
LDX #$00
STX screen_offset_r
jsr move_rows_right
jsr advance_scrollr
endr
LDA screen_control_register2
AND #$F8
ORA screen_offset_r
STA screen_control_register2
rts
move_rows_right
ldx #38
lp1 lda $4400+80,x
sta $4401+80,x
lda $4400+120,x
sta $4401+120,x
lda $4400+160,x
sta $4401+160,x
lda $4400+200,x
sta $4401+200,x
lda $4400+240,x
sta $4401+240,x
lda $4400+280,x
sta $4401+280,x
lda $4400+320,x
sta $4401+320,x
lda $4400+360,x
sta $4401+360,x
lda $4400+400,x
sta $4401+400,x
lda $4400+440,x
sta $4401+440,x
lda $4400+480,x
sta $4401+480,x
lda $4400+520,x
sta $4401+520,x
lda $4400+560,x
sta $4401+560,x
lda $4400+600,x
sta $4401+600,x
lda $4400+640,x
sta $4401+640,x
lda $4400+680,x
sta $4401+680,x
lda $4400+720,x
sta $4401+720,x
lda $4400+760,x
sta $4401+760,x
dex
cpx #$ff
beq fin
jmp lp1
fin rts
advance_scrollr
lda contadorr
cmp #0
bmi advance_scrollr2
tax
lda $c877,x
sta $4450
lda $c89f,x
sta $4478
lda $c8c7,x
sta $44a0
lda $c8ef,x
sta $44c8
lda $c917,x
sta $44f0
lda $c93f,x
sta $4518
lda $c967,x
sta $4540
lda $c98f,x
sta $4568
lda $c9b7,x
sta $4590
lda $c9df,x
sta $45b8
lda $ca07,x
sta $45e0
lda $ca2f,x
sta $4608
lda $ca57,x
sta $4630
lda $ca7f,x
sta $4658
lda $caa7,x
sta $4680
lda $cacf,x
sta $46a8
lda $caf7,x
sta $46d0
lda $cb1f,x
sta $46f8
dec contadorr
rts
screen_offset_r byte $00
contadorr byte 39
advance_scrollr2
lda contadorr2
cmp #0
bmi advance_scrollr3
tax
lda $c477,x
sta $4450
lda $c49f,x
sta $4478
lda $c4c7,x
sta $44a0
lda $c4ef,x
sta $44c8
lda $c517,x
sta $44f0
lda $c53f,x
sta $4518
lda $c567,x
sta $4540
lda $c58f,x
sta $4568
lda $c5b7,x
sta $4590
lda $c5df,x
sta $45b8
lda $c607,x
sta $45e0
lda $c62f,x
sta $4608
lda $c657,x
sta $4630
lda $c67f,x
sta $4658
lda $c6a7,x
sta $4680
lda $c6cf,x
sta $46a8
lda $c6f7,x
sta $46d0
lda $c71f,x
sta $46f8
dec contadorr2
rts
contadorr2 byte 39
advance_scrollr3
lda contadorr3
cmp #0
bmi tornar
tax
lda $c077,x
sta $4450
lda $c09f,x
sta $4478
lda $c0c7,x
sta $44a0
lda $c0ef,x
sta $44c8
lda $c117,x
sta $44f0
lda $c13f,x
sta $4518
lda $c167,x
sta $4540
lda $c18f,x
sta $4568
lda $c1b7,x
sta $4590
lda $c1df,x
sta $45b8
lda $c207,x
sta $45e0
lda $c22f,x
sta $4608
lda $c257,x
sta $4630
lda $c27f,x
sta $4658
lda $c2a7,x
sta $4680
lda $c2cf,x
sta $46a8
lda $c2f7,x
sta $46d0
lda $c31f,x
sta $46f8
dec contadorr3
rts
contadorr3 byte 39
tornar lda #39
sta contadorr
sta contadorr2
sta contadorr3
jsr advance_scrollr
rts
*=$4800
incbin "sprites.bin"
* = $7000 ;28672 ;CARACTERES EN BANCO 1 (12288 + 16384) ;
incbin"chars.bin"
*=$c000 ;Pantallas
incbin"p0.bin"
*=$c400
incbin"p1.bin"
*=$c800
incbin"p2.bin"