Files
quickdev16/snes/ascii/save.s
2009-04-05 18:47:38 +02:00

706 lines
18 KiB
ArmAsm
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
.EMPTYFILL 0
.LOROM
.MEMORYMAP
SLOTSIZE $8000
DEFAULTSLOT 0
SLOT 0 $0000 ; ram , direct page
SLOT 1 $2000 ; PPU1, APU
SLOT 2 $3000 ; SFX, DSP
SLOT 3 $4000 ; Controller
SLOT 4 $4200 ; PPU2, DMA
SLOT 5 $6000 ; RESERVED
SLOT 6 $8000 ; code segment
.ENDME
;.ROMBANKSIZE $8000
;.ROMBANKS $80
.ROMBANKMAP
BANKSTOTAL $80
BANKSIZE $8000
BANKS $80
.ENDRO
.NAME "optixx"
.BANK $00 SLOT 6
.ORG $0000
.ORGA $8000
.SECTION "MAIN"
.define dp $0000
.define xstorage1 $0001
.define xstorage2 $0002
.define sineoffset $0003
.define scrollval $0005
.define col_reg $0007
.define hdma_table0 $0010
.define plane_0 $0400
.define plane_1 $0800
.define tile $2000
init:
sei ;stop interrupts
phk ;get the current bank and store on stack
plb ;get value off stack and make it the current
;programming bank
clc ;clear carry bit
xce ;native 16 bit mode (no 6502 emulation!)
jsr init_hdma_table0
;==========================================================================
; start of snes register initialization
;==========================================================================
sep #$30 ; x,y,a are 8 bit numbers
lda #$8f ; screen off, full brightness
sta $2100 ; brightness + screen enable register
lda #$00 ;
sta $2101 ; sprite register (size + address in vram)
lda #$00
sta $2102 ; sprite registers (address of sprite memory [oam])
sta $2103 ; "" ""
lda #$00 ; mode 0
sta $2105 ; graphic mode register
lda #$00 ; no planes, no mosaic
sta $2106 ; mosaic register
lda #$00 ;
sta $2107 ; plane 0 map vram location
lda #$00
sta $2108 ; plane 1 map vram location
lda #$00
sta $2109 ; plane 2 map vram location
lda #$00
sta $210a ; plane 3 map vram location
lda #$00
sta $210b ; plane 0+1 tile data location
lda #$00
sta $210c ; plane 2+3 tile data location
lda #$00
sta $210d ; plane 0 scroll x (first 8 bits)
sta $210d ; plane 0 scroll x (last 3 bits) #$0 - #$07ff
sta $210e ; plane 0 scroll y (first 8 bits)
sta $210e ; plane 0 scroll y (last 3 bits) #$0 - #$07ff
sta $210f ; plane 1 scroll x (first 8 bits)
sta $210f ; plane 1 scroll x (last 3 bits) #$0 - #$07ff
sta $2110 ; plane 1 scroll y (first 8 bits)
sta $2110 ; plane 1 scroll y (last 3 bits) #$0 - #$07ff
sta $2111 ; plane 2 scroll x (first 8 bits)
sta $2111 ; plane 2 scroll x (last 3 bits) #$0 - #$07ff
sta $2112 ; plane 2 scroll y (first 8 bits)
sta $2112 ; plane 2 scroll y (last 3 bits) #$0 - #$07ff
sta $2113 ; plane 3 scroll x (first 8 bits)
sta $2113 ; plane 3 scroll x (last 3 bits) #$0 - #$07ff
sta $2114 ; plane 3 scroll y (first 8 bits)
sta $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
lda #$00
sta $2116 ; vram address low
sta $2117 ; vram address high
sta $211a ; initial mode 7 setting register
sta $211b ; mode 7 matrix parameter a register (low)
lda #$01
sta $211b ; mode 7 matrix parameter a register (high)
lda #$00
sta $211c ; mode 7 matrix parameter b register (low)
sta $211c ; mode 7 matrix parameter b register (high)
sta $211d ; mode 7 matrix parameter c register (low)
sta $211d ; mode 7 matrix parameter c register (high)
sta $211e ; mode 7 matrix parameter d register (low)
lda #$01
sta $211e ; mode 7 matrix parameter d register (high)
lda #$00
sta $211f ; mode 7 center position x register (low)
sta $211f ; mode 7 center position x register (high)
sta $2120 ; mode 7 center position y register (low)
sta $2120 ; mode 7 center position y register (high)
sta $2121 ; color number register ($0-ff)
sta $2123 ; bg1 & bg2 window mask setting register
sta $2124 ; bg3 & bg4 window mask setting register
sta $2125 ; obj & color window mask setting register
sta $2126 ; window 1 left position register
sta $2127 ; window 2 left position register
sta $2128 ; window 3 left position register
sta $2129 ; window 4 left position register
sta $212a ; bg1, bg2, bg3, bg4 window logic register
sta $212b ; obj, color window logic register (or,and,xor,xnor)
lda #$01
sta $212c ; main screen designation (planes, sprites enable)
lda #$00
sta $212d ; sub screen designation
lda #$00
sta $212e ; window mask for main screen
sta $212f ; window mask for sub screen
lda #$30
sta $2130 ; color addition & screen addition init setting
lda #$00
sta $2131 ; add/sub sub designation for screen, sprite, color
lda #$e0
sta $2132 ; color data for addition/subtraction
lda #$00
sta $2133 ; screen setting (interlace x,y/enable sfx data)
lda #$00
sta $4200 ; enable v-blank, interrupt, joypad register
lda #$ff
sta $4201 ; programmable i/o port
lda #$00
sta $4202 ; multiplicand a
sta $4203 ; multiplier b
sta $4204 ; multiplier c
sta $4205 ; multiplicand c
sta $4206 ; divisor b
sta $4207 ; horizontal count timer
sta $4208 ; horizontal count timer msb (most significant bit)
sta $4209 ; vertical count timer
sta $420a ; vertical count timer msb
sta $420b ; general dma enable (bits 0-7)
sta $420c ; horizontal dma (hdma) enable (bits 0-7)
sta $420d ; access cycle designation (slow/fast rom)
;===========================================================================
; end of init routine
;===========================================================================
rep #$30 ; x,y,a fixed -> 16 bit mode
sep #$20 ; accumulator -> 8 bit mode
lda #(dp+0) ;load direct page
tcd ;store & and assign
lda #(plane_0>>8) ; screen map data @ vram location $1000
sta $2107 ; plane 0 map location register
lda #(plane_1>>8) ; screen map data @ vram location $1000
sta $2108 ; plane 1 map location register
lda #$22 ; plane 0 and plane 1 tile graphics @ $2000
sta $210b ; plane 0 tile graphics register
lda #$00 ; mode 0 value / tile mode
sta $2105 ; graphics mode register
lda #%00000011 ;
sta $212c ; plane enable register
lda #$00
sta $2121 ; set color number to 0 (background)
lda #$46 ; blue color, lower 8 bits
sta $2122 ; enter color value #$46 to color num. (low)
lda #$69 ; blue color, higher 8 bits
sta $2122 ; enter color value #$69 to color num. (high)
lda #$ff ; white color, lower 8 bits
sta $2122 ; write to next color number (01)
sta $2122 ; enter same value to color number (01)
ldx #$00
col_loop:
txa
sta $2121
lda #$00
sta $2122
lda #$7f
sta $2122
txa
ina
tax
cmp #$ff
beq col_loop
lda #$01
sta $4200 ; enable joypad read (bit one)
;==========================================================================
; start transfer of graphics to vram
;==========================================================================
ldx #(tile+0) ; assign vram location
stx $2116 ; writing to $2118/9 will store data here!
ldx #$0000
copychar:
lda.w charset,x ; get character set data (font data)
sta $2118 ; store bitplane 1
stz $2119 ; clear bitplane 2 and increase vram address
inx
cpx #$0200 ; transfer $0200 bytes
bne copychar
init_plane_0:
ldx #(plane_0+0) ; assign vram location $1000 to $2116/7
stx $2116
ldx #$0000
init_plane_0_loop:
lda.w text_0,x ; get ascii text data
and #$3f ; we only want the first 64 characters
; convert ascii to c64 screen code
sta $2118
stz $2119 ; clear unwanted bits, no h/v flipping
inx
cpx #$0400 ; transfer entire screen
; $20*$20=$0400 (1024 bytes)
bne init_plane_0_loop
init_plane_1:
ldx #(plane_1+0) ; assign vram location $1000 to $2116/7
stx $2116
ldx #$0000
init_plane_1_loop:
lda.w text_1,x ; get ascii text data
and #$3f ; we only want the first 64 characters
; convert ascii to c64 screen code
sta $2118
stz $2119 ; clear unwanted bits, no h/v flipping
inx
cpx #$0400 ; transfer entire screen
; $20*$20=$0400 (1024 bytes)
bne init_plane_1_loop
init_screen:
lda #$0f ; screen enabled, full brightness
sta $2100 ;
cli ; clear interrupt bit
init_scroll:
lda #$00
sta.w scrollval
init_col_reg:
lda #$00
sta.w col_reg
init_sineoffset:
lda #$00
sta.w sineoffset
call_hmda_setup:
jsr init_hdma_table0
jmp intro
main:
jsr wait_vbl
jsr sine_plane
jsr scroll_plane
jsr cycle_color
jsr joypad
jmp main
; test vertical interrupt
wait_vbl:
lda $4210 ; check for vertical blank
and #$80
beq wait_vbl
rts
; joypad poll
joypad:
lda $4212 ; is joypad ready to be read?
and #$0001
bne joypad ; no? go back until it is!
lda $4219 ; read joypad high byte
and #$10 ; leave only "start" bit
bne reset ; "start" pressed? go to reset
rts ; if not then jump back to loop
reset:
sep #$30
lda #$00
pha ; push #$00 to stack
plb ; pull #$00 from stack and make it the
; the programming bank
jmp init ; jump long to $008000
; gfx routine
; intro stuff
intro:
rep #$30
sep #$20
ldx #$f1
mosaic_l:
jsr wait_vbl
txa
sta $2106
sbc #$10
tax
cmp #$01
bne mosaic_l
stz $2106
fade:
ldy #$0f
fade_dark:
jsr wait_vbl
tya
sta $2100
dey
cpy #$0000
bne fade_dark
ldy #$0000
fade_light:
jsr wait_vbl
tya
sta $2100
iny
cpy #$000f
bne fade_light
jmp main
; scroll loop
scroll_plane:
lda.w scrollval
sta $210e
stz $210e
adc #$01
sta.w scrollval
cmp #$ff
beq restore_scroll
rts
restore_scroll:
lda #$00
sta.w scrollval
rts
; cycle loop
cycle_color:
ldx #$0000
lda.w col_reg,x
adc #$01
stz $2121
sta $2122
stz $2122
sta col_reg
cmp #$7f
bne cycle_c
lda #$0000
sta col_reg
cycle_c:
rts
sine_plane:
rep #$10
sep #$20
lda sineoffset
ina
sta sineoffset
cmp #$ff
bne sine_plane_c
lda #$00
sta sineoffset
sine_plane_c:
tay
ldx #$0000
sine_plane_l:
iny
cpy #$ff
bne sine_plane_l_c
lda #$00
tay
sine_plane_l_c:
inx
lda.w vsine,y
sta hdma_table0+3,x
inx
inx
cpx #$0180
bne sine_plane_l
rep #$30
sep #$20
rts
; init hdma list
init_hdma_table0:
rep #$10
sep #$20
ldy #$0000
ldx #$0000
;lda #$00
;sta sineoffset
lda #$30
sta hdma_table0,x
inx
lda #$00
sta hdma_table0,x
inx
sta hdma_table0,x
inx
init_hdma_table0_loop:
lda #$01
sta hdma_table0,x
inx
lda vsine,y
sta hdma_table0,x
inx
lda #$00
sta hdma_table0,x
inx
iny
cpx #$0183 ; (128 + 1) * 3 = 387 = 0x0183
bne init_hdma_table0_loop
lda #$20
sta hdma_table0,x
inx
lda #$00
sta hdma_table0,x
inx
sta hdma_table0,x
inx
sta hdma_table0,x
inx
sta hdma_table0,x
lda #$02
sta $4300
lda #$0f
sta $4301
ldx.w #hdma_table0
;ldx.w #test_hmda_table
stx $4302
lda #$00
sta $4304
lda #%00000001
sta $420c
rep #$30
sep #$20
rts
charset:
.db $55,$aa,$55,$aa,$55,$aa,$55,$aa ;'@'
.db $00,$3c,$66,$7e,$66,$66,$66,$00 ;'a'
.db $00,$7c,$66,$7c,$66,$66,$7c,$00 ;'b'
.db $00,$3c,$66,$60,$60,$66,$3c,$00 ;'c'
.db $00,$78,$6c,$66,$66,$6c,$78,$00 ;'d'
.db $00,$7e,$60,$78,$60,$60,$7e,$00 ;'e'
.db $00,$7e,$60,$78,$60,$60,$60,$00 ;'f'
.db $00,$3c,$66,$60,$6e,$66,$3c,$00 ;'g'
.db $00,$66,$66,$7e,$66,$66,$66,$00 ;'h'
.db $00,$3c,$18,$18,$18,$18,$3c,$00 ;'i'
.db $00,$1e,$0c,$0c,$0c,$6c,$38,$00 ;'j'
.db $00,$6c,$78,$70,$78,$6c,$66,$00 ;'k'
.db $00,$60,$60,$60,$60,$60,$7e,$00 ;'l'
.db $00,$63,$77,$7f,$6b,$63,$63,$00 ;'m'
.db $00,$66,$76,$7e,$7e,$6e,$66,$00 ;'n'
.db $00,$3c,$66,$66,$66,$66,$3c,$00 ;'o'
.db $00,$7c,$66,$66,$7c,$60,$60,$00 ;'p'
.db $00,$3c,$66,$66,$66,$3c,$0e,$00 ;'q'
.db $00,$7c,$66,$66,$7c,$6c,$66,$00 ;'r'
.db $00,$3e,$60,$3c,$06,$66,$3c,$00 ;'s'
.db $00,$7e,$18,$18,$18,$18,$18,$00 ;'t'
.db $00,$66,$66,$66,$66,$66,$3c,$00 ;'u'
.db $00,$66,$66,$66,$66,$3c,$18,$00 ;'v'
.db $00,$63,$63,$6b,$7f,$77,$63,$00 ;'w'
.db $00,$66,$3c,$18,$3c,$66,$66,$00 ;'x'
.db $00,$66,$66,$3c,$18,$18,$18,$00 ;'y'
.db $00,$7e,$0c,$18,$30,$60,$7e,$00 ;'z'
.db $00,$3c,$30,$30,$30,$30,$3c,$00 ;'['
.db $c0,$60,$30,$18,$0c,$06,$03,$00 ;'|'
.db $00,$3c,$0c,$0c,$0c,$0c,$3c,$00 ;']'
.db $10,$38,$6c,$c6,$00,$00,$00,$00 ;'^'
.db $00,$00,$00,$00,$00,$00,$00,$fe ;'_'
.db $00,$00,$00,$00,$00,$00,$00,$00 ;' '
.db $00,$18,$18,$18,$00,$00,$18,$00 ;'!'
.db $00,$66,$66,$00,$00,$00,$00,$00 ;'"'
.db $00,$66,$ff,$66,$ff,$66,$00,$00 ;'#'
.db $00,$08,$1c,$28,$28,$1c,$08,$00 ;'$'
.db $00,$64,$6c,$18,$30,$6c,$4c,$00 ;'%'
.db $00,$00,$18,$18,$7e,$18,$18,$00 ;'&'
.db $00,$0c,$18,$00,$00,$00,$00,$00 ;'''
.db $00,$18,$30,$30,$30,$18,$0c,$00 ;'('
.db $00,$18,$0c,$0c,$0c,$18,$30,$00 ;')'
.db $00,$66,$3c,$ff,$3c,$66,$00,$00 ;'*'
.db $00,$18,$18,$7e,$18,$18,$00,$00 ;'+'
.db $00,$00,$00,$00,$00,$18,$18,$30 ;','
.db $00,$00,$00,$fe,$00,$00,$00,$00 ;'-'
.db $00,$00,$00,$00,$00,$18,$18,$00 ;'.'
.db $03,$06,$0c,$18,$30,$60,$c0,$00 ;'/'
.db $00,$3c,$66,$6e,$76,$66,$3c,$00 ;'0'
.db $00,$18,$38,$18,$18,$18,$7e,$00 ;'1'
.db $00,$7c,$06,$0c,$30,$60,$7e,$00 ;'2'
.db $00,$7e,$06,$1c,$06,$66,$3c,$00 ;'3'
.db $00,$0e,$1e,$36,$7f,$06,$06,$00 ;'4'
.db $00,$7e,$60,$7c,$06,$66,$3c,$00 ;'5'
.db $00,$3e,$60,$7c,$66,$66,$3c,$00 ;'6'
.db $00,$7e,$06,$0c,$0c,$0c,$0c,$00 ;'7'
.db $00,$3c,$66,$3c,$66,$66,$3c,$00 ;'8'
.db $00,$3c,$66,$3e,$06,$66,$3c,$00 ;'9'
.db $00,$00,$18,$00,$00,$18,$00,$00 ;':'
.db $00,$00,$18,$00,$00,$18,$18,$30 ;';'
.db $18,$18,$18,$18,$18,$18,$18,$00 ;'<'
.db $00,$00,$7e,$00,$7e,$00,$00,$00 ;'='
.db $18,$18,$0c,$0c,$0c,$0c,$18,$18 ;'>'
.db $00,$7c,$06,$0c,$18,$00,$18,$00 ;'?'
; 12345678901234567890123456789012
text_0:
.db "| _ _ |"
.db "| ___ _ __ | |_(_)_ ____ __|"
.db "| / _ \| '_ \| __| \ \/ /\ \/ /|"
.db "|| (_) | |_) | |_| |> < > < |"
.db "| \___/| .__/ \__|_/_/\_\/_/\_\|"
.db "| |_| |"
.db "| |"
.db "| |"
.db "| |"
.db "| OPTIXX ONCE A AGAIN |"
.db "| WITH A CLASSIS CONSOL |"
.db "| PIECE OF CODE... |"
.db "| |"
.db "| |"
.db "| |"
.db "| |"
.db "| |"
.db "| |"
.db "| |"
.db "| |"
.db "| |"
.db "| |"
.db "| |"
.db "| |"
.db "| |"
.db "| |"
.db "| |"
.db "| |"
.db "| |"
.db "| |"
.db "| |"
.db "| |"
.db "| |"
text_1:
.REPT 20
.db "| _ _ |"
.db "| ___ _ __ | |_(_)_ ____ __|"
.db "| / _ \| '_ \| __| \ \/ /\ \/ /|"
.db "|| (_) | |_) | |_| |> < > < |"
.db "| \___/| .__/ \__|_/_/\_\/_/\_\|"
.db "| |_| |"
.db "| |"
.ENDR
vsine:
.db 108,109,111,112,113,114,115,115,116,117,118,119,120,120,121
.db 122,122,123,123,124,124,125,125,125,126,126,126,127,127,127
.db 127,127,127,127,127,127,127,127,126,126,126,125,125,125,124
.db 124,123,123,122,122,121,120,120,119,118,117,116,115,115,114
.db 113,112,111,109,108,107,106,105,104,103,101,100,99,97,96,95
.db 93,92,91,89,88,86,85,83,82,80,79,77,76,74,73,71,70,68,67,65
.db 64,62,60,59,57,56,54,53,51,50,48,47,45,44,42,41,39,38,36,35
.db 34,32,31,30,28,27,26,24,23,22,21,20,19,18,16,15,14,13,12,12
.db 11,10,9,8,7,7,6,5,5,4,4,3,3,2,2,2,1,1,1,0,0,0,0,0,0,0,0,0,0
.db 0,1,1,1,2,2,2,3,3,4,4,5,5,6,7,7,8,9,10,11,12,12,13,14,15,16
.db 18,19,20,21,22,23,24,26,27,28,30,31,32,34,35,36,38,39,41,42
.db 44,45,47,48,50,51,53,54,56,57,59,60,62,64,65,67,68,70,71,73
.db 74,76,77,79,80,82,83,85,86,88,89,91,92,93,95,96,97,99,100,101
.db 103,104,105,106,107
vsine_end:
.ENDS
.BANK $04 SLOT 6
.ORGA $8000
long_label:
nop
nop
rts
.BANK $01 SLOT 6
.ORGA $8000
.BASE $01
.INCLUDE "music.s"
.BANK $02 SLOT 6
.ORG $0000
music_data_1:
.INCBIN "music1.bin"
.BANk $03 SLOT 6
.ORG $0000
music_data_2:
.INCBIN "music2.bin"