quickdev16/snes/ascii/main.asm
optixx 09f42acfc8 o played with banks
o add ditz
o add checksize
2009-04-20 20:14:42 +02:00

818 lines
18 KiB
NASM
Raw Blame History

;============================================================================
; Includes
;============================================================================
;== Include MemoryMap, Vector Table, and HeaderInfo ==
.INCLUDE "header.inc"
.SECTION "MAIN"
.define dp $0000
.define sineswap $0002
.define sine_offset $0003
.define scrollval $0005
.define colbar_offset_1 $0006
.define colbar_offset_2 $0007
.define colbar_offset_3 $0008
.define colbar_offset_table $0010
.define colbar_color_table $0020
.define colbar_count $0030
.define colbar_color $0032
.define colbar_color_ptr $0034
.define hdma_table0 $0050
.define hdma_table1 $0200
.define plane_0 $0800
.define plane_1 $0c00
.define char_data $2000
.define logo_data $2200
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 setup
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 #$01
sta $4200 ; enable joypad read (bit one)
lda #$00
sta $2121
ldx #$0000
col_loop:
lda #$ff
sta $2122
lda #$7f
sta $2122
inx
cpx #$00ff
bne col_loop
ldx.w #char_data ; assign vram location
stx $2116 ; writing to $2118/9 will store data here!
ldx #$0000
copychar:
lda.w charset,x ; get character set data<74>(font data)
sta $2118 ; store bitplane 1
stz $2119 ; clear bitplane 2 and increase vram address
inx
cpx #$0200 ; transfer $0200 bytes
bne copychar
ldx #$0000
copy_logo: ; copy tile data to vram
lda.w optixx_logo,x ; using continuos tile vram pointer
sta $2118 ; charset @ $2000
stz $2119 ; logo @ $2200
inx
cpx #$0500
bne copy_logo
init_plane_0:
ldx.w #plane_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: ; write optixx logo tiles
ldx.w #plane_1
stx $2116
ldx #$0000
lda #$0040
init_plane_1_clear_1: ; 0x0140 tiles clear
sta $2118
stz $2119
inx
cpx #$0140
bne init_plane_1_clear_1
ldx #$0000
init_plane_1_loop_1:
ina
sta $2118
stz $2119
inx
cpx #$00a0 ; 0x00a0 logo tiles
bne init_plane_1_loop_1
ldx #$0000
lda #$0040
init_plane_1_clear_2:
sta $2118
stz $2119
inx
cpx #$01a0 ; 0x01a0 tiles clear
bne init_plane_1_clear_2
ldx #$0000
init_screen:
lda #$0f ; screen enabled, full brightness
sta $2100 ;
cli ; clear interrupt bit
init_scroll:
lda #$00
sta.w scrollval
init_sineoffset:
lda #$00
sta.w sine_offset
lda #$00
sta sineswap
ldx.w #colbar_1_color_values
stx colbar_color_table
ldx.w #colbar_2_color_values
stx colbar_color_table + $02
ldx.w #colbar_3_color_values
stx colbar_color_table + $04
ldx.w #colbar_1_color_values
stx colbar_color_table + $06
ldx.w #colbar_2_color_values
stx colbar_color_table + $08
ldx.w #colbar_3_color_values
stx colbar_color_table + $0a
lda #$00
sta colbar_offset_table
lda #$15
sta colbar_offset_table + $01
lda #$25
sta colbar_offset_table + $02
lda #$35
sta colbar_offset_table + $03
lda #$45
sta colbar_offset_table + $04
lda #$55
sta colbar_offset_table + $05
call_hmda_setup:
jsr init_hdma_table0
jsr init_hdma_table1
jmp intro
main:
jsr wait_vbl
jsr sine_plane
jsr sine_colbar
jsr scroll_plane
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 #$f2
mosaic_l:
jsr wait_vbl
jsr wait_vbl
txa
sta $2106
sbc #$10
tax
cmp #$02
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
sine_plane:
rep #$10
sep #$20
lda sine_offset
ina
sta sine_offset
cmp #$ff
bne sine_plane_c
lda #$00
sta sine_offset
lda sineswap ; check wich sine table ot take
ina
sta sineswap
cmp #$04 ; after 4 loop reset counter
bne sine_plane_c
lda #$00
sta sineswap
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 sineswap
cmp #$02 ; lower 2 use vsine 1
bmi sine_load_vsine1
sine_load_vsine2: ; else use vsine 2
lda.w vsine_2,y
bra sine_load_done
sine_load_vsine1:
lda.w vsine_1,y
sine_load_done:
adc #$c8 ; shift logo left
sta hdma_table0+3,x
inx
inx
cpx #$00c0 ; 64 hdma lines a 3 byte
bne sine_plane_l
rep #$30
sep #$20
rts
sine_colbar:
rep #$10
sep #$20
ldx #$00
sine_colbar_clear:
stz hdma_table1+1,x
stz hdma_table1+2,x
inx
inx
inx
cpx #$012c
bne sine_colbar_clear
lda #$00
sta colbar_count
ldy #$0000
sty colbar_color
sine_colbar_init:
ldy colbar_color
ldx colbar_color_table,y
stx colbar_color_ptr
lda.w colbar_count
tay
lda colbar_offset_table,y
ina
sta colbar_offset_table,y
cmp #$ff ; if end of sine table
bne sine_colbar_continue
lda #$00 ; reset table pointer
sta colbar_offset_table,y
sine_colbar_continue:
tay
lda.w colbarsine_1,y
tax
ldy #$0000
sine_colbar_loop:
lda (colbar_color_ptr),y
ora hdma_table1+1,x
and #$ff
sta hdma_table1+1,x
iny
lda (colbar_color_ptr),y
ora hdma_table1+2,x
and #$ff
sta hdma_table1+2,x
inx
inx
inx
iny
;iny
cpy #$0040 ; 32 colot lines a 2 byte
bne sine_colbar_loop
ldy colbar_color
iny
iny
sty colbar_color
lda.w colbar_count
ina
sta.w colbar_count
cmp #$06
bne sine_colbar_init
sine_colbar_end:
rep #$30
sep #$20
rts
; init hdma list
init_hdma_table0:
rep #$10
sep #$20
ldy #$0000
ldx #$0000
;lda #$00
;sta sine_offset
lda #$4c
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_1,y
lda #$00
sta hdma_table0,x
inx
lda #$00
sta hdma_table0,x
inx
iny
;cpx #$0183 ; (128 + 1) * 3 = 387 = 0x0183
cpx #$00c3 ; (64 + 1) * 3 = 195 = 0x00c0
bne init_hdma_table0_loop
lda #$4c
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
init_hdma_table1:
;rep #$10
;sep #$30
ldx #$0000
init_hdma_tabel1_copy:
ldy.w backcolors_color_values,x
tya
sta hdma_table1,x
inx
cpx #$0295
bne init_hdma_tabel1_copy
lda #$00
sta $4310
lda #$21
sta $4311
ldx.w #backcolors_color_list
stx $4312
lda #$00
sta $4314
lda #$02
sta $4320
lda #$22
sta $4321
;ldx.w #backcolors_color_values
ldx.w #hdma_table1
stx $4322
lda #$00
sta $4324
lda #%00000111
sta $420c
rep #$30
sep #$20
rts
setup:
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<66>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)
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 CONSOLE RELEASE "
.db " WWW.OPTIXX.ORG "
.db " "
.db " "
.db " "
.db " "
.db " "
.db " "
.db " "
.db " "
.db " "
.db " "
.db " "
.db " "
.db " "
.db " "
.db " "
.db " "
.db " "
.db " "
.db " "
.db " "
.db " "
.INCLUDE "vsine_1.s"
.INCLUDE "vsine_2.s"
.INCLUDE "backcolors.s"
.INCLUDE "colbar_1.s"
.INCLUDE "colbar_2.s"
.INCLUDE "colbar_3.s"
.INCLUDE "optixx_logo.s"
.INCLUDE "colbarsine_1.s"
.ends
.bank 1
.SECTION "GFX"
.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"