;	*********************************
;	*								*
;	*								*
;	*								*
;	*********************************

;.INCLUDE "CONSTANTES.ASM"	; NORMALMENTE AQUI YO CARGO EL ARCHIVO CONSTANTES QUE
					; AHORA ESTA ANULADO POR LOS DOS PUNTOS Y ADJUNTO EN EL PROGRAMA
					; PARA UNA CONSULTA MAS RAPIDA DEL LISTADO DE CONSTANTES QUE
					; UTILIZO

SP0X	=	$D000	; SPRITE 0 X POSITION
SP0Y	=	$D001	; SPRITE 0 Y POSITION
SP1X	=	$D002	; SPRITE 1 X POSITION
SP1Y	=	$D003	; SPRITE 1 Y POSITION
MSIGX	=	$D010	; MSB'S OF SPRITES 0-7 HORIZONTAL POSITIONS
POINSP0	=	$07F8	; POINTER 2040 SPRITE O
POINSP1	=	$07F9	; POINTER 2041 SPRITE 1
POINSP2	=	$07FA	; POINTER 2042 SPRITE 2
POINSP3	=	$07FB	; POINTER 2043 SPRITE 3
POINSP4	=	$07FC	; POINTER 2044 SPRITE 4
POINSP5 =	$07FD	; POINTER 2045 SPRITE 5
POINSP6 =	$07FE	; POINTER 2046 SPRITE 6
POINSP7 =	$07FF	; POINTER 2047 SPRITE 7

SCROLY	=	$D011	; VERTICAL FINE SCROLLING AND CONTROL REGISTER
RASTER	=	$D012	; READ CURRENT RASTER SCAN LINE/WRITE LINE TO COMPARE
					; FOR RASTER IRQ

SPENA	=	$D015	; SPRITE ENABLE REGISTER
SCROLX	=	$D016	; HORIZONTAL FINE SCROLLING AND CONTROL REGISTER
YXPAND	=	$D017	; SPRITE VERTICAL EXPANSION REGISTER
VMCSB	=	$D018	; VIC-II CHIP MEMORY CONTROL REGISTER
VICIRQ	=	$D019	; VIC INTERRUPT FLAG REGISTER
IRQMSK	=	$D01A	; IRQ MASK REGISTER
SPBGPR	=	$D01B	; SPRITE TO FOREGROUND DISPLAY PRIORITY REGISTER
SPMC	=	$D01C	; SPRITE MULTICOLOR REGISTERS
XXPAND	=	$D01D	; SPRITE HORIZONTAL EXPANSION REGISTER
SPSPCL	=	$D01E	; SPRITE TO SPRITE COLLISION REGISTER
SPBGCL	=	$D01F	; SPRITE TO FOREGROUND COLLISION REGISTER

EXTCOL	=	$D020	; BORDER COLOR REGISTER
BGCOL0	=	$D021	; BACKGROUND COLOR 0
BGCOL1	=	$D022	; BACKGROUND COLOR 1
BGCOL2	=	$D023	; BACKGROUND COLOR 2
BGCOL3	=	$D024	; BACKGROUND COLOR 3

SPMC0	=	$D025	; SPRITE MULTICOLOR 0
SPMC1	=	$D026	; SPRITE MULTICOLOR 1

SP0COL	=	$D027	; SPRITE 0 COLOR 
SP1COL	=	$D028	; SPRITE 1 COLOR 
SP2COL	=	$D029	; SPRITE 2 COLOR 
SP3COL	=	$D02A	; SPRITE 3 COLOR
SP4COL	=	$D02B	; SPRITE 4 COLOR
SP5COL	=	$D02C	; SPRITE 5 COLOR
SP6COL	=	$D02D	; SPRITE 6 COLOR
SP7COL	=	$D02E	; SPRITE 7 COLOR
COLRAM	=	$D800

CIAPRA	=	$DC00	; DATA PORT REGISTER A
CIAPRB	=	$DC01	; DATA PORT REGISTER B
CIDDRA	=	$DC02	; DATA DIRECTION REGISTER A
CIDDRB	=	$DC03	; DATA DIRECTION REGISTER B
CIASDR	=	$DC0C	; SERIAL DATA PORT
CIAICR	=	$DC0D	; INTERRUPT CONTROL REGISTER
CIACRA	=	$DC0E	; CONTROL REGISTER A
CIACRB	=	$DC0F	; CONTROL REGISTER B
LECOL	=	$0286	; LETTER COLOR
GETIN   =   $FFE4

; COMIENZA EL PROGRAMA

	*=$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
; 	START
	*=FONTS_END			; CARGA PAQUETE DE FUENTES POSICION AL FINAL DE PROGRAMA
	START				; HABILITA INTERRUPCIONES (SEI, DESABILITA)
			
	JSR MUEVECHARS		; MUEVE SET DE CHARS DE BANK1 A BANK0
	JSR VICCHIP			; VIC-II CHIP MEMORY CONTROL REGISTER	
	JSR OFFKEY			; APAGA TECLADO
	JSR NOTREP			; NO REPITE TECLA
	JSR COLPANT			; COLORES NEGRO PANTALLA Y BORDE PANTALLA
	JSR ONMULSPR		; ACTIVA MULTICOLOR SPRITES A TODOS
	JSR CLEAR2			; LIMPIA PANTALLA
	JSR MODOTEXTO		; FIJA MODO TEXTO TRAS MOVER LOS CHARS DE BANCO
		
	;	MONTA SPRITE NAVE
	JSR TIME50			; ESPERA RETARDO DE TIEMPO 50
	LDA	#90				; CARGA VALOR COORDENADA X
	STA	SP0X			; APLICA A X SPRITE 0
	STA	SP1X			; APLICA A X SPRITE 1
	LDA	#140			; CARGA VALOR
	STA	SP0Y			; APLICA A X SPRITE 0
	STA	SP1Y			; APLICA A X SPRITE 1
	LDA #$80			; CARGA GRAFICO NAVE
	STA POINSP0			; APLICA A PUNTERO SPRITE 0
	LDA #$84			; CARGA GRAFICO NEUTRO NEGRO A DISPARO
	STA POINSP1			; APLICA A PUNTERO SPRITE 1
	LDA	#$01			; CARGA BLANCO
	STA	SP0COL			; APLICA A COLOR SPRITE 0 NAVE
	LDA	#$07			; CARGA AMARILLO
	STA	SP1COL			; APLICA A COLOR SPRITE 1 DISPARO DE NAVE
	JSR MUCOLSPR3		; CONFIGURA MULTICOLOR 1 Y 2 DE SPRITES
	JSR ONSPR			; ACTIVA SPRITES
;	***********
INICIO
;	***********
	LDA	#$06			; COLOR AZUL
						; LA RUTINA ESTA PARTIDA EN DOS
	JSR COLCOMPL		; COLOR A TODOS LOS CHAR DE PARTE INFERIOR
	JSR COLCOMP2		; COLOR A TODOS LOS CHAR DE PARTE SUPERIOR
	
	;	CHEQUEO JOYSTICK
MAINJOY1				; MENU DEL JOYSTICK
									
DERECHA				;**********************
						;**     DERECHA 1    **
						;**********************
	LDA CIAPRB			; CARGA POSICION DE JOY
	AND #8				; COMPARA CON EL BIT QUE CONTROLA DERECHA
	BNE IZQUIERD		; SI NO SE HA PULSADO MANDA A IZQUIERDA
	LDA #$80			; SI SE HA PULSADO CARGA GRAFICO HORIZONTAL NAVE
	STA POINSP0			; APLICLA AL PUNTERO SPRITE 0
	INC SP0X			; INCREMENTA COORDENADA X DE SPRITE 0
	JSR GES255			; CHEQUEA RUTINA QUE GESTIONA SUPERACION DE 255 POR SPRITE
	INC SP0X			; INCREMENTA COORDENADA X DE SPRITE 0
	JSR GES255			; CHEQUEA RUTINA QUE GESTIONA SUPERACION DE 255 POR SPRITE
	JMP IZQUIERD		; FIN DE RUTINA MANDA Y CONTINUA CHEQUEANDO IZQUIERDA
	
; NUEVA RUTINA 255	
GES255					; RUTINA GESTIONA SUPERACION DE 255 EN SPRITE 0
   LDA $D000			; CARGA EL VALOR DE $D000
   CMP #$FF   			; LO COMPARA CON 255
   BEQ LABEL			; SI ES IGUAL (RESULTADO O) MANDA A LABEL
   RTS					; RETORNA
LABEL
	LDA #%00000001		; CARGA VALOR SPRITE O ENCENDIDO
	STA $D010			; APLICA A $D010, POR ENCIMA DE 255
    RTS					; RETORNA
	
IZQUIERD				;**********************
						;**    IZQUIERDA 1   **
						;**********************
	LDA CIAPRB			; CARGA POSICION DE JOY
	AND #4				; COMPARA CON EL BIT QUE CONTROLA IZQUIERDA
	BNE ARRIBA			; SI NO SE A PULSADO MANDA A ARRIBA
	LDA #$80			; SI SE HA PULSADO CARGA GRAFICO HORIZONTAL NAVE
	STA POINSP0			; APLICLA AL PUNTERO SPRITE 0
	DEC SP0X			; DECREMENTA COORDENADA X DE SPRITE 0
	JSR GES255B			; CHEQUEA RUTINA QUE GESTIONA SUPERACION DE 255 POR SPRITE
	DEC SP0X			; DECREMENTA COORDENADA X DE SPRITE 0
	JSR GES255B			; CHEQUEA RUTINA QUE GESTIONA SUPERACION DE 255 POR SPRITE
	JMP ARRIBA			; FIN DE RUTINA MANDA Y CONTINUA CHEQUEANDO ARRIBA
	
; NUEVA RUTINA 255
GES255B	
   LDA $D000	 		; CARGA VALOR DE $D000
   CMP #$FF   			; LO COMPARA CON 255
   BEQ LABEL2			; SI ES IGUAL (RESULTADO O) MANDA A LABEL2
   RTS					; RETORNA
LABEL2
	LDA #%00000000		; CARGA VALOR SPRITE O APAGADO
	STA $D010			; APLICA A $D010, POR DEBAJO DE 255
    RTS					; RETORNA
	
ARRIBA					;**********************
						;**      ARRIBA 1     **
						;**********************
	LDA CIAPRB			; CARGA POSICION DE JOY
	AND #1				; COMPARA CON VALOR ABAJO 1
	BNE ABA				; SI NO SE A PULSADO MANDA A ABA ABAJO
	LDA #$81			; SI SE HA PULSADO CARGA ONDULACION NAVE ARRIBA
	STA POINSP0			; APLICA A PUNTERO SPRITE 0 NAVE
	DEC SP0Y			; DECREMENTA COORDENADA Y SPRITE 0
	DEC SP0Y			; DECREMENTA COORDENADA Y SPRITE 0
	JMP FUEGO			; FIN DE RUTINA MANDA Y CONTINUA CHEQUEANDO FUEGO
ABA
	LDA #$80			; NO SE HA PULSADO Y CARGA GRAFICO NAVE HORIZONTAL
	STA POINSP0			; APLICA A PUNTERO SPRITE 0
	JMP ABAJO			; FIN DE RUTINA MANDA Y CONTINUA CHEQUEANDO ABAJO

ABAJO					;**********************
						;**      ABAJO 1     **
						;**********************
	LDA CIAPRB			; CARGA POSICION DE JOY
	AND #2				; COMPARA CON VALOR ABAJO 1
	BNE FUE				; SI NO SE A PULSADO MANDA A FUE FUEGO
	LDA #$82			; SI SE HA PULSADO CARGA ONDULACION NAVE ABAJO
	STA POINSP0			; APLICA A PUNTERO SPRITE 0 NAVE
	INC SP0Y			; INCREMENTA COORDENADA Y SPRITE 0
	INC SP0Y			; INCREMENTA COORDENADA Y SPRITE 0
	JMP FUEGO			; FIN DE RUTINA MANDA Y CONTINUA CHEQUEANDO FUEGO
	
FUE
	LDA #$80			; NO SE HA PULSADO Y CARGA GRAFICO NAVE HORIZONTAL
	STA POINSP0			; APLICA A PUNTERO SPRITE 0
	JMP FUEGO			; FIN DE RUTINA MANDA Y CONTINUA CHEQUEANDO FUEGO

FUEGO					;**********************
						;**      FUEGO 1     **
						;**********************
	JSR GESFIRE			; CHEQUEA RUTINA QUE CONTROLA DISPARO DE LA NAVE
	JSR TIME1			; RETARDO DE TIEMPO 1
	JMP MAINJOY1		; SALTA EL INICIO DEL CONTROL DEL JOYSTICK CREA BUCLE
	

;  RUTINA QUE GESTIONA DISPARO

GESFIRE					; GESTIONA DISPARO NAVE
	LDA POINSP1			; CARGA PUNTERO DE DISPARO NAVE SPRITE 1
	CMP #$83			; COMPARA CON GRAFICO DISPARO	
	BEQ MUDISDE			; SI YA SE HA MOSTRADO, HAY UN DISPARO EFECTUADO CON LO
						; SOLO LO MOVERA, MANDA A MUDISDE, MUEVE DISPARO DERECHA
						
						; SI NO HAY NINGUN DISPARO PULSADO CHEQUEARA SI SE HA
						; PULSADO DISPARO
	LDA CIAPRB			; CARGA POSICION DE JOY
	AND #16				; COMPARA CON EL BIT QUE CONTROLA DISPARO
	BNE SEVAYA			; SI NO SE HA PULSADO MANDA A SEVAYA Y RETORNA CON RTS
						; EN DEFINITIVA NO HACE NADA
						; SI SE PULSA MONTARA UN DISPARO NUEVO CON RUTINA MONTADE
						
MONTADE					; MONTA DISPARO A LA DERECHA
	LDA SP0X			; CARGA COORDENADA X DEL SPRITE 0
	STA SP1X			; APLICA A COORDENADA X DEL SPRITE 1
	LDA SP0Y			; CARGA COORDENADA Y DEL SPRITE 0
	STA SP1Y			; APLICA A COORDENADA X DEL SPRITE 1
	LDA #$83			; CARGA GRAFICO DISPARO DE NAVE
	STA POINSP1			; APLICA A PUNTERO SPRITE 1
	JMP MUDISDE			; MANDA A RUTINA QUE MUEVE DISPARO A LA DERECHA, MUDISDE
	
MUDISDE					; MUEVE EL DISPARO A LA DERECHA
	INC SP1X			; INCREMENTA X SPRITE 1
	INC SP1X			; INCREMENTA X SPRITE 1
	JSR PUFA1			; CHEQUEA SI DISPARO HA LLEGADO A TOPE DE PANTALLA DERECHO
	INC SP1X			; INCREMENTA X SPRITE 1
	INC SP1X			; INCREMENTA X SPRITE 1
	JSR PUFA1			; CHEQUEA SI DISPARO HA LLEGADO A TOPE DE PANTALLA DERECHO
	INC SP1X			; INCREMENTA X SPRITE 1
	INC SP1X			; INCREMENTA X SPRITE 1
	JSR PUFA1			; CHEQUEA SI DISPARO HA LLEGADO A TOPE DE PANTALLA DERECHO
	INC SP1X			; INCREMENTA X SPRITE 1
	INC SP1X			; INCREMENTA X SPRITE 1
	JSR PUFA1			; CHEQUEA SI DISPARO HA LLEGADO A TOPE DE PANTALLA DERECHO
SEVAYA					; RUTINA QUE RETORNA
	RTS					; RETORNA
	
PUFA1					; RUTINA QUE MIRA SI EL DISPARO HA LLEGADO A TOPE DE PANTALLA
	LDA SP1X			; CARGA COORDENADA X DE SPRITE 1 DISPARO DE NAVE
	CMP #254			; LA COMPARA CON 254
	BEQ PARED20			; SI ES IGUAL MANDA A PARED20 Y RESTAURA EL DISPARO
	RTS					; RETORNA
	
PARED20					; RESTAURA DISPARO UNA VEZ LLEGA A LIMITE PANTALLA
	LDA #$84			; CARGA GRAFICO NEUTRO NEGRO RESTAURA DISPARO
	STA POINSP1			; APLICA A PUNTERO SPRITE 1
	LDA #0				; CARGA VALOR 0
	STA SP1X			; APLICA A COORDENADA X SPRITE 1 DISPARO NAVE
	LDA #255			; CARGA VALOR 255
	LDA SP1Y			; APLICA A COORDENADA X SPRITE 1 DISPARO NAVE
						; Y EL DISPARO QUEDA ALOJADO EN UN ESQUINAZO DE LA PANTALLA
						; Y OCULTO
	JMP SEVAYA			; MANDA A SEVAYA Y RETORNA
	
	; ***********************************************
	;             RUTINAS OPERATIVAS
	; ***********************************************
	
; LIMPIA PANTALLA
CLEAR2				; LIMPIA PANTALLA
	LDX #0			; CARGA VALOR
	LDA #$20		; SIMBOLO ESPACIO
BUCLE56				; 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 BUCLE56		; SI NO ES IGUAL VUELVE A BUCLE
	RTS	
;	ACTIVA MULTICOLOR SPRITES
ONMULSPR
	LDA	#$FF		
	STA	SPMC		; SPRITE MULTICOLOR REGISTERS
	RTS
;	FIJA MODO TEXTO
MODOTEXTO
	LDA #$12
	STA $D018
	LDA #$1B
	STA $D011
	LDA #$08
	STA $D016
	RTS
;	COLOR PANTALLA
COLPANT
	LDA	#$00		; NEGRO
	STA	EXTCOL		; BORDER COLOR
	LDA	#$00		; BLACK
	STA	BGCOL0		; BACKGROUND COLOR 0
	RTS
;	NO REPITE TECLA
NOTREP
	LDA #$7F
	STA $28A
	RTS
;	DESCONECTA TECLADO
OFFKEY
	LDA #$00
	STA CIDDRA		; DATA DIRECTION REGISTER A
	RTS
	;	VIC-II CHIP MEMORY CONTROL REGISTER	
VICCHIP
	LDA VMCSB			; VIC-II CHIP MEMORY CONTROL REGISTER
	AND	#$F1		
	ORA	#$0A		
	STA	VMCSB			; VIC-II CHIP MEMORY CONTROL REGISTER
	RTS
;	MUEVE CHARS	
MUEVECHARS
	PORIGEN   = $FC
	PDESTINO  = $FE
	ZPBASE    = $FA
	LDA #<CHARS
	STA PORIGEN
	LDA #>CHARS
	STA PORIGEN+1
	LDA #<$0800
	STA PDESTINO
	LDA #>$0800
	STA PDESTINO+1
	
	LDY #0
	LDA PORIGEN
	CLC
	ADC #<2048		;NUMERO BYTES PARTE BAJA
	STA ZPBASE
	LDA PORIGEN+1
	ADC #>2048		;NUMERO BYTES PARTE ALTA
	STA ZPBASE+1	
COPIA
	LDA (PORIGEN),Y
	STA (PDESTINO),Y
	INC PORIGEN
	BNE SKIP0
	INC PORIGEN+1
SKIP0
	INC PDESTINO
	BNE SKIP1
	INC PDESTINO+1	
SKIP1
	LDA PORIGEN
	CMP ZPBASE
	BNE COPIA
	LDA PORIGEN+1
	CMP ZPBASE+1
	BNE COPIA
	RTS
	
	;	*** TIME1 ***
TIME1
	LDX #$01		; 1 TIME
REGU
	LDA $D012
	CMP #$F8
	BEQ REGU
RATA
	LDA $D012
	CMP #$F8
	BNE RATA                  
	BNE REGU
	DEX
	BNE REGU
	RTS	
;	*** TIME50 ***
TIME50
	LDX #$32		; 50 TIME
RETA
	LDA $D012
	CMP #$F8
	BEQ RETA
RAS
	LDA $D012
	CMP #$F8
	BNE RAS                  
	BNE RETA
	DEX
	BNE RETA
	RTS	
;	MULTICOLOR 1 Y 2 SPRITES, BLANCO-AZUL
MUCOLSPR3
	LDA	#$0B		; GRIS OSCURO
	STA	SPMC0		; MULTICOLOR SPRITE 1
	LDA	#$06		; AZUL
	STA	SPMC1		; MCOLOR 2
	RTS
;	ACTIVA SPRITES
ONSPR
	LDA #$FF
	STA SPENA
	RTS
;	DESACTIVA SPRITES
OFFSPR
	LDA #$00
	STA SPENA
	RTS
;   APLICA COLOR SELECCIONADO ANTES A TODOS LOS SPRITES
COLSPR
	STA	SP0COL			; SPRITE 1
	STA	SP1COL			; SPRITE 1
	STA	SP2COL			; SPRITE 2
	STA	SP3COL			; SPRITE 3
	STA	SP4COL			; SPRITE 4
	STA	SP5COL			; SPRITE 5
	STA	SP6COL			; SPRITE 6
	STA	SP7COL			; SPRITE 7
	RTS		
;	COLOR PANTALLA
COLCOMPL			; COLOR COPLETO SOLO A PARTE INFERIOR
	LDX #0			; CARGA VALOR
BUCLE54				; INICIO DE BUCLE
	STA	$D878,X		
	STA	$D977,X	
	STA	$DA76,X
	STA	$DB75,X
	INX				; INCREMENTA ESPACIO
	CPX #255		; TOPE DE ESPACIO
	BNE BUCLE54		; SI NO ES IGUAL VUELVE A BUCLE
	RTS
;	COLOR PANTALLA
COLCOMP2			; COLOR COPLETO SOLO A PARTE SUPERIOR		
	LDX	#$00		
CPAN2	
	STA	$D800,X	
	STA	$D828,X	
	STA	$D850,X	
	INX	
	CPX #40
	BNE	CPAN2
	RTS	
	
	;********************
	; SEGMENTOS DE DATOS
	;********************
; DATA: FUENTES LETRAS
	*=$4000
	CHARS
	.BINARY	"FONTS.BIN"	; BANCO DE CARACTERES
	FONTS_END
