; **************************************************** ; EJERCICIO GESTION DE SPRITES EN TODA LA PANTALLA ; **************************************************** .INCLUDE "CONSTANTES.ASM" *=$0801 ; INICIA PROGRAMA EN ESA POSICION .WORD NEXT,10 ; CREA LINEA EN BASIC E INICIA CODIGO MAQUINA .NULL $9E,^START ; "SYS START" (START=INIT M.C.) NEXT .WORD 0 ; FIN BASIC ; LOAD SPRITES ; CARGA SPRITES *=$2000 ; CARGA SPRITES POSICION 49152 BANK0 .BINARY SPRITES.BIN FRAMES .BYTE 0 ; VIDEO FRAMES COUNTER FRAMES2 .BYTE 0 ; VIDEO FRAMES COUNTER *=FONTS_END ; CARGA PAQUETE DE FUENTES POSICION AL FINAL DE PROGRAMA ; START START ; HABILITA INTERRUPCIONES (SEI, DESABILITA) VICCHIP LDA VMCSB ; VIC-II CHIP MEMORY CONTROL REGISTER AND #$F1 ORA #$0A STA VMCSB ; VIC-II CHIP MEMORY CONTROL REGISTER ; COLOR NEGRO A PANTALLA Y BORDE LDA #$00 ; NEGRO STA EXTCOL ; BORDER COLOR LDA #$00 ; GRIS MEDIO STA BGCOL0 ; BACKGROUND COLOR 0 ; RUTINA QUE LIMPIA PANTALLA LDX #0 ; CARGA VALOR LDA #$00 ; SIMBOLO ESPACIO SEGUN EL SET DE CHAR CARGADO Y MODIFICADO BUCLE1 ; INICIO DE BUCLE STA $0400,X ; APLICA A POSICION DE COLOR MAS ESPACIO STA $04FF,X ; APLICA A POSICION DE COLOR MAS ESPACIO STA $05FE,X ; APLICA A POSICION DE COLOR MAS ESPACIO STA $06FD,X ; APLICA A POSICION DE COLOR MAS ESPACIO INX ; INCREMENTA ESPACIO CPX #255 ; TOPE DE ESPACIO BNE BUCLE1 ; SI NO ES IGUAL VUELVE A BUCLE ; ACTIVA MODO MULTICOLOR EN TODOS LOS SPRITES LDA #$FF ; CARGA MAXIMO VALOR STA SPMC ; SPRITE MULTICOLOR REGISTERS ; PREPARA PARAMETROS SPRITES 1,2 Y 3 Y MUESTRA EN PANTALLA ; PUNTEROS DE GRAFICO LDA #$80 ; BLOQUE GRAFICO STA POINSP0 ; PUNTERO SPRITE #0 LDA #$81 ; BLOQUE GRAFICO STA POINSP1 ; PUNTERO SPRITE #1 LDA #$82 ; BLOQUE GRAFICO STA POINSP2 ; PUNTERO SPRITE #0 ; COORDENADAS SPRITES 0 Y 1 LDA #150 ; CARGA VALOR 50 COORDENADAS DE XAIN STA SP0X ; APLICA A X SPRITE 0 LDA #80 ; CARGA VALOR 50 COORDENADAS DE XAIN STA SP1X ; APLICA A X SPRITE 0 LDA #200 ; CARGA VALOR 50 COORDENADAS DE XAIN STA SP0Y ; APLICA A Y SPRITE 0 STA SP1Y ; APLICA A Y SPRITE 0 STA SP2Y ; APLICA A Y SPRITE 0 ; COORDENADAS SPRITE 2 LDA $D010 ORA #%00000100 ; CARGA VALOR SPRITE O ENCENDIDO STA $D010 ; APLICA A $D010, POR ENCIMA DE 255 LDA #30 ; CARGA VALOR 50 COORDENADAS DE XAIN ; ATENCION PORQUE SOLO ES 30 YA QUE SE MOSTRARA POR ENCIMA ; DE LA BARRERA DE 255 COMO SE VE MAS ADELANTE STA SP2X ; APLICA A Y SPRITE 0 ; COLOR DE SPRITES LDA #$01 ; COLOR BLANCO STA SP0COL ; APLICA A COLOR SPRITE 0 STA SP1COL ; APLICA A COLOR SPRITE 0 STA SP2COL ; APLICA A COLOR SPRITE 0 ;ACTIVA TODOS LOS SPRITES LDA #$FF ; CARGA MAXIMO VALOR Y ACTIVARA TODOS LOS SPRITES STA SPENA ; APLICA A LA POSICION DE MEMORIA $DO15 QUE LO ACOMETE ; COMIENZA RUTINA QUE GESTIONA JOYSTICK EN PUERTO 2 Y QUE NOS PERMITIRA ; GESTIONAR EL MOVIMIENTO DEL SPRITE 0 QUE SERA EL NUESTRO MENUJOY DERECHA LDA CIAPRA ; CARGA POSICION DE JOY EN PUERTO 2 AND #8 ; COMPARA CON EL BIT QUE CONTROLA DERECHA BNE IZQUIERDA ; SI NO SE HA PULSADO MANDA A IZQUIERDA LDA #$80 ; BLOQUE GRAFICO FLECHA A LA DERECHA STA POINSP0 ; PUNTERO SPRITE #0 INC SP0X ; SI SE HA PULSADO MUEVE EN UN PUNTO EL SPRITE 0 A LA DERECHA JSR RETARDO ; RUTINA QUE CONTIENE BUCLE QUE CREA RETARDO DE TIEMPO IZQUIERDA LDA CIAPRA ; CARGA POSICION DE JOY EN PUERTO 2 AND #4 ; COMPARA CON EL BIT QUE CONTROLA IZQUIERDA BNE FINAL ; SI NO SE A PULSADO MANDA A ARRIBA LDA #$83 ; BLOQUE GRAFICO FLECHA A LA IZQUIERDA STA POINSP0 ; PUNTERO SPRITE #0 DEC SP0X ; SI SE HA PULSADO MUEVE EN UN PUNTO EL SPRITE 0 A LA IZQUIERDA JSR RETARDO ; RUTINA QUE CONTIENE BUCLE QUE CREA RETARDO DE TIEMPO FINAL JMP MENUJOY ; RETORNA AL INICIO DE BUCLE QUE GESTIONA JOYSTICIK RETARDO LDX #$FF CICL ; PRIMER BUCLE DEX BNE CICL LDX #$FF CICL2 ; SEGUNDO BUCLE DEX BNE CICL2 CICL3 ; SEGUNDO BUCLE DEX BNE CICL3 RTS ; DATA: FUENTES LETRAS *=$4000 CHARS .BINARY "FONTS.BIN" ; BANCO DE CARACTERES FONTS_END