;----------------------------------------------------------------------------
;	galaxy rulez ;) who else is able to do sumthing like that!
;----------------------------------------------------------------------------
	heap	O=128k			;max 128k object buffer
	size	4			;4*32k blocks

	smc+				;yes, we want a smc header
	lrom				;yes, split in 32k hunks

;----------------------------------------------------------------------------
;	start of all
;----------------------------------------------------------------------------
.start:
	sei				;kill interupt
	phk				;push current bank to register
	plb				;pull data bank from stack
	clc				;clear carry flag
	xce				;excange carry and emulator bit

;----------------------------------------------------------------------------
;	initialize the fucking registers
;----------------------------------------------------------------------------
	rep	#$30
	sep	#$20
	jsr	Snes_Init		;oki dude, i've used it ;)
	rep	#$30
	sep	#$20

;----------------------------------------------------------------------------
;	my inits
;----------------------------------------------------------------------------
	stz	$2105			;plane tilesize #0
	lda	#$10			;plane vram location
	sta	$2107			;store plane:=$1000
	lda	#$02			;tile location
	sta	$210b			;store tile
	stz	$2121			;color palette #0
	lda	#$00			;color #0
	sta	$2122			;store color
	lda	#$7c			;color #0
	sta	$2122			;store color
	lda	#$ff			;color #1
	sta	$2122			;store color
	lda	#$7f			;color #1
	sta	$2122			;store color
	stz	$2122			;last color
	lda	#$01			;plane #1
	sta	$212c			;store plane
	lda	#$01			;counter
	sta	$4200			;store counter

;----------------------------------------------------------------------------
;	get vram address - font
;----------------------------------------------------------------------------
	ldx	#$1fff			;load x:=$1fff
	stx	$2116			;vmaddl		;address for vram read

;----------------------------------------------------------------------------
;	copy chars to vram
;----------------------------------------------------------------------------
	ldy	#$0000			;load y:=$0000

.copyfont:
	lda	font,y			;font address starts from y:=$0000
	sta	$2118			;vmdatal	;data for vram write
	stz	$2119			;vmdatah	;data for vram write
	iny				;increase y:=y+$0001
	cpy	#(fontend-font)		;did we reached the font end?
	bne	.copyfont		;nope? then continue copying

;----------------------------------------------------------------------------
;	get vram address - text
;----------------------------------------------------------------------------
	ldx	#$1000			;load x:=$1000
	stx	$2116			;vmaddl		;address for vram read

;----------------------------------------------------------------------------
;	clear text screen
;----------------------------------------------------------------------------
	ldx	#$0000			;load x:=$0000
	lda	#$20			;load a:=$20	;space
	and	#%00111111		;and accu with %00111111

.clearscreen:
	sta	$2118			;vmdatal	;data for vram write
	stz	$2119			;vmdatah	;data for vram write
	inx				;increase x:=x+$0001
	cpx	#(textend-text)		;compare if 32*32 chars
	bne	.clearscreen		;nope? then continue clearing

;----------------------------------------------------------------------------
;	initialize screen
;----------------------------------------------------------------------------
	lda	#%1111			;load a:=%1111	;brightest
	sta	$2100			;initdsp	;initial settings for screen

;----------------------------------------------------------------------------
;	get vram address - text
;----------------------------------------------------------------------------
	ldx	#$1000			;load x:=$1000
	stx	$2116			;vmaddl		;address for vram read

;----------------------------------------------------------------------------
;	init textprinter
;----------------------------------------------------------------------------
	ldx	#$0000			;load x:=$0000
	ldy	#$1000			;load y:=$1000

;----------------------------------------------------------------------------
;	the main loop, without exit! note this. load/save will crash!!
;----------------------------------------------------------------------------
.loop:
	lda	$4210			;*rdnmi		;nmi flag by v-blank & version number
	bpl	.loop			;v-blank reached?

	lda	text,x			;text address starts from x:=x+1
	cmp	#$ff			;compare accu if text reached end
	beq	.stay			;yes? then continue copying

	jsr	.printtext		;1st routine!

.stay:
	jmp	.loop			;stay in loop

;----------------------------------------------------------------------------
;	type text
;----------------------------------------------------------------------------
.printtext:
	lda	text,x			;text address starts from x:=$0000
	and	#%00111111		;and accu with %00111111
	sta	$2118			;vmdatal	;data for vram write
	stz	$2119			;vmdatah	;data for vram write
	inx				;increase x:=x+$0001
	sty	$2116			;vmaddl		;address for vram read
	iny				;increase y:=y+$0001
	rts				;return to v-blank interupt

;==========================================================================
;                   SNES Register Initialization routine
;==========================================================================
Snes_Init:
	sep 	#$30    ; X,Y,A are 8 bit numbers
	lda 	#$8F    ; screen off, full brightness
	sta 	$2100   ; brightness + screen enable register 
	stz 	$2101   ; Sprite register (size + address in VRAM)
	stz 	$2102   ; Sprite registers (address of sprite memory [OAM])
	stz 	$2103   ;    ""                       ""
	stz 	$2105   ; Mode 0, = Graphic mode register
	stz 	$2106   ; noplanes, no mosaic, = Mosaic register
	stz 	$2107   ; Plane 0 map VRAM location
	stz 	$2108   ; Plane 1 map VRAM location
	stz 	$2109   ; Plane 2 map VRAM location
	stz 	$210A   ; Plane 3 map VRAM location
	stz 	$210B   ; Plane 0+1 Tile data location
	stz 	$210C   ; Plane 2+3 Tile data location
	stz 	$210D   ; Plane 0 scroll x (first 8 bits)
	stz 	$210D   ; Plane 0 scroll x (last 3 bits) #$0 - #$07ff
	stz 	$210E   ; Plane 0 scroll y (first 8 bits)
	stz 	$210E   ; Plane 0 scroll y (last 3 bits) #$0 - #$07ff
	stz 	$210F   ; Plane 1 scroll x (first 8 bits)
	stz 	$210F   ; Plane 1 scroll x (last 3 bits) #$0 - #$07ff
	stz 	$2110   ; Plane 1 scroll y (first 8 bits)
	stz 	$2110   ; Plane 1 scroll y (last 3 bits) #$0 - #$07ff
	stz 	$2111   ; Plane 2 scroll x (first 8 bits)
	stz 	$2111   ; Plane 2 scroll x (last 3 bits) #$0 - #$07ff
	stz 	$2112   ; Plane 2 scroll y (first 8 bits)
	stz 	$2112   ; Plane 2 scroll y (last 3 bits) #$0 - #$07ff
	stz 	$2113   ; Plane 3 scroll x (first 8 bits)
	stz 	$2113   ; Plane 3 scroll x (last 3 bits) #$0 - #$07ff
	stz 	$2114   ; Plane 3 scroll y (first 8 bits)
	stz 	$2114   ; Plane 3 scroll y (last 3 bits) #$0 - #$07ff
	lda 	#$80    ; increase VRAM address after writing to $2119
	sta 	$2115   ; VRAM address increment register
	stz 	$2116   ; VRAM address low
	stz 	$2117   ; VRAM address high
	stz 	$211A   ; Initial Mode 7 setting register
	stz 	$211B   ; Mode 7 matrix parameter A register (low)
	lda 	#$01
	sta 	$211B   ; Mode 7 matrix parameter A register (high)
	stz 	$211C   ; Mode 7 matrix parameter B register (low)
	stz 	$211C   ; Mode 7 matrix parameter B register (high)
	stz 	$211D   ; Mode 7 matrix parameter C register (low)
	stz 	$211D   ; Mode 7 matrix parameter C register (high)
	stz 	$211E   ; Mode 7 matrix parameter D register (low)
	sta 	$211E   ; Mode 7 matrix parameter D register (high)
	stz 	$211F   ; Mode 7 center position X register (low)
	stz 	$211F   ; Mode 7 center position X register (high)
	stz 	$2120   ; Mode 7 center position Y register (low)
	stz 	$2120   ; Mode 7 center position Y register (high)
	stz 	$2121   ; Color number register ($0-ff)
	stz 	$2123   ; BG1 & BG2 Window mask setting register
	stz 	$2124   ; BG3 & BG4 Window mask setting register
	stz 	$2125   ; OBJ & Color Window mask setting register
	stz 	$2126   ; Window 1 left position register
	stz 	$2127   ; Window 2 left position register
	stz 	$2128   ; Window 3 left position register
	stz 	$2129   ; Window 4 left position register
	stz 	$212A   ; BG1, BG2, BG3, BG4 Window Logic register
	stz 	$212B   ; OBJ, Color Window Logic Register (or,and,xor,xnor)
	sta 	$212C   ; Main Screen designation (planes, sprites enable)
	stz 	$212D   ; Sub Screen designation
	stz 	$212E   ; Window mask for Main Screen
	stz 	$212F   ; Window mask for Sub Screen
	lda 	#$30
	sta 	$2130   ; Color addition & screen addition init setting
	stz 	$2131   ; Add/Sub sub designation for screen, sprite, color
	lda 	#$E0
	sta 	$2132   ; color data for addition/subtraction
	stz 	$2133   ; Screen setting (interlace x,y/enable SFX data)
	stz 	$4200   ; Enable V-blank, interrupt, Joypad register
	lda 	#$FF
	sta 	$4201   ; Programmable I/O port
	stz 	$4202   ; Multiplicand A
	stz 	$4203   ; Multiplier B
	stz 	$4204   ; Multiplier C
	stz 	$4205   ; Multiplicand C
	stz 	$4206   ; Divisor B
	stz 	$4207   ; Horizontal Count Timer
	stz 	$4208   ; Horizontal Count Timer MSB (most significant bit)
	stz 	$4209   ; Vertical Count Timer
	stz 	$420A   ; Vertical Count Timer MSB
	stz 	$420B   ; General DMA enable (bits 0-7)
	stz 	$420C   ; Horizontal DMA (HDMA) enable (bits 0-7)
	stz 	$420D	; Access cycle designation (slow/fast rom)
	rts

;----------------------------------------------------------------------------
;	font for the text
;----------------------------------------------------------------------------
font:
	dc.b	$00,$00,$00,$00,$00,$00,$00,$00		; @
	dc.b	$00,$00,$ff,$03,$7f,$73,$73,$00		; A
	dc.b	$00,$00,$fe,$03,$7e,$73,$7e,$00		; B
	dc.b	$00,$00,$3f,$70,$70,$70,$3f,$00		; C
	dc.b	$00,$00,$fe,$03,$73,$73,$7e,$00		; D
	dc.b	$00,$00,$ff,$00,$7f,$70,$7f,$00		; E
	dc.b	$00,$00,$7f,$00,$7f,$60,$60,$00		; F
	dc.b	$00,$00,$3f,$70,$73,$73,$3f,$00		; G
	dc.b	$00,$00,$73,$73,$7f,$73,$73,$70		; H
	dc.b	$00,$00,$1c,$1c,$1c,$1c,$1c,$00		; I
	dc.b	$00,$00,$ff,$06,$06,$06,$7e,$00		; J
	dc.b	$00,$00,$73,$76,$7c,$76,$73,$00		; K
	dc.b	$00,$70,$70,$70,$70,$70,$7f,$00		; L
	dc.b	$00,$00,$63,$77,$7f,$6b,$63,$60		; M
	dc.b	$40,$60,$73,$7b,$7f,$77,$73,$01		; N
	dc.b	$00,$00,$fe,$03,$63,$63,$3e,$00		; O
	dc.b	$00,$00,$fe,$03,$7e,$70,$70,$00		; P
	dc.b	$00,$00,$3e,$63,$63,$6f,$3e,$03		; Q
	dc.b	$00,$00,$fe,$03,$7e,$66,$63,$00		; R
	dc.b	$00,$00,$0f,$1c,$1c,$1c,$f8,$00		; S
	dc.b	$00,$00,$ff,$1c,$1c,$1c,$1c,$00		; T
	dc.b	$00,$00,$73,$73,$73,$73,$3e,$00		; U
	dc.b	$00,$00,$73,$73,$73,$3e,$1c,$00		; V
	dc.b	$03,$03,$63,$6b,$7f,$77,$63,$00		; W
	dc.b	$00,$00,$73,$73,$3e,$73,$73,$00		; X
	dc.b	$00,$00,$73,$73,$7f,$1c,$1c,$1c		; Y
	dc.b	$00,$00,$ff,$0e,$1c,$38,$7f,$00		; Z
	dc.b	$00,$3c,$38,$38,$38,$38,$38,$3c		; [
	dc.b	$00,$00,$1f,$38,$fe,$70,$7f,$00		; £
	dc.b	$00,$3c,$1c,$1c,$1c,$1c,$1c,$3c		; ]
	dc.b	$00,$18,$3c,$7e,$18,$18,$18,$18		; ^
	dc.b	$00,$00,$10,$3f,$7f,$3f,$10,$00		; <-
	dc.b	$00,$00,$00,$00,$00,$00,$00,$00		; SPACE
	dc.b	$00,$18,$18,$18,$18,$18,$00,$18		; !
	dc.b	$00,$6c,$6c,$00,$00,$00,$00,$00		; "
	dc.b	$00,$36,$7f,$36,$36,$7f,$36,$00		; #
	dc.b	$00,$08,$3c,$68,$3c,$16,$7c,$10		; $
	dc.b	$00,$00,$66,$6c,$18,$36,$66,$00		; %
	dc.b	$00,$1c,$36,$1c,$3f,$66,$7b,$00		; &
	dc.b	$0c,$18,$30,$00,$00,$00,$00,$00		; '
	dc.b	$00,$03,$06,$0c,$0c,$0c,$06,$03		; (
	dc.b	$00,$60,$30,$18,$18,$18,$30,$60		; )
	dc.b	$00,$18,$42,$18,$7e,$18,$42,$18		; *
	dc.b	$00,$00,$1c,$1c,$7f,$1c,$1c,$00		; +
	dc.b	$00,$00,$00,$00,$00,$30,$30,$60		; ,
	dc.b	$00,$00,$00,$00,$7f,$00,$00,$00		; -
	dc.b	$00,$00,$00,$00,$00,$30,$30,$00		; .
	dc.b	$00,$00,$03,$06,$0c,$18,$30,$60		; /
	dc.b	$00,$00,$7f,$63,$63,$63,$7f,$00		; 0
	dc.b	$00,$00,$3c,$0c,$0c,$0c,$0c,$1e		; 1
	dc.b	$00,$00,$7f,$03,$7f,$70,$7f,$00		; 2
	dc.b	$00,$00,$7f,$03,$1f,$03,$7f,$00		; 3
	dc.b	$70,$70,$76,$76,$7f,$06,$06,$00		; 4
	dc.b	$00,$00,$7f,$70,$7e,$07,$7e,$00		; 5
	dc.b	$70,$70,$70,$70,$7f,$73,$7f,$00		; 6
	dc.b	$00,$00,$7f,$03,$03,$03,$03,$03		; 7
	dc.b	$00,$00,$7f,$73,$7f,$73,$7f,$00		; 8
	dc.b	$00,$00,$7f,$73,$7f,$03,$03,$03		; 9
	dc.b	$00,$00,$18,$18,$00,$18,$18,$00		; :
	dc.b	$00,$00,$18,$18,$00,$18,$18,$30		; ;
	dc.b	$00,$0c,$18,$30,$60,$30,$18,$0c		; <
	dc.b	$00,$00,$00,$3c,$00,$3c,$00,$00		; =
	dc.b	$00,$30,$18,$0c,$06,$0c,$18,$30		; >
	dc.b	$00,$00,$7f,$63,$0f,$0c,$00,$0c		; ?
fontend:

;----------------------------------------------------------------------------
;	the text to be printed on the screen!
;----------------------------------------------------------------------------
text:
;		-01234567890123456789012345678901-
	dc.b	"                                "
	dc.b	"  ------------------------------"
	dc.b	"  XX XX XXXX XXXX. XXX XXXX XXXX"
	dc.b	"  XXX XXXXXXX XXXXXX XXXXX XXXX "
	dc.b	"  XXXXXXXX XXXXXXX XXX XX XXXXXX"
	dc.b	"  XXXXX XXXXXXXXXXXXX XXXXXXXXXX"
	dc.b	"  XX XXXXXXXX. XXXXX XXXXXXX XXX"
	dc.b	"  XXXX XXXXXXXXXXXX XXX XXXXX.  "
	dc.b	"  ------------------------------"
	dc.b	"  XXXX XXXXXXX XXXXX. XXXX XXXX "
	dc.b	"  XXXXXX XXX XXXXXX XXXXXX XXX  "
	dc.b	"  XXX XXX XXXX XXXXXX XXXXXXX   "
	dc.b	"  XXXXXXXX XXXXX XXXXX XXXXXXXX."
	dc.b	"  ------------------------------"
	dc.b	"  XXXX XXXXX XXXXXX XXXXXX      "
	dc.b	"  XXXXXX XXX XX XXXX X XX XXXXXX"
	dc.b	"  XXXXXXXX XXXXXXXX.........    "
	dc.b	"  ------------------------------"
	dc.b	"                                "
	dc.b	"  SUPER      #####              "
	dc.b	"            ##   ##             "
	dc.b	"            ##                  "
	dc.b	"            ## ####             "
	dc.b	"            ##   ##             "
	dc.b	"            ##   ##             "
	dc.b	"             ###### ALAXY !!!!! "
	dc.b	"                                "
	dc.b	"  ------------------------------"
	dc.b	"                                "
textend:

	dc.b	$ff			;textend marker

;----------------------------------------------------------------------------
;	cardridge inits
;----------------------------------------------------------------------------
	org	$ffc0			;cart name
cart_name:
	dc.b	"GALAXY"

	org	$ffd9			;maker id code
maker_id:
	dc.b	9

	org	$ffdb			;version number
version_nr:
	dc.b	1

	org	$fffc			;reset vector in 6502 mode
reset_vector:
	dcr.w	$8000
