1
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.
Por supuesto hay mejores rutinas para leer el joy de una sola comparación, pero esta es buena para comprender como lo hace
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