From c14d25f6e2b2690e6127b5fa85d40b5ace49c320 Mon Sep 17 00:00:00 2001 From: ikari Date: Wed, 21 Oct 2009 00:51:36 +0200 Subject: [PATCH] cleanup, more gfx tests --- snes/Makefile | 2 +- snes/const.a65 | 27 ++++- snes/data.a65 | 51 ++++++++ snes/main.a65 | 317 +++++++++++++++---------------------------------- snes/reset.a65 | 64 +++++----- snes/text.a65 | 51 +++++++- 6 files changed, 251 insertions(+), 261 deletions(-) diff --git a/snes/Makefile b/snes/Makefile index 08d6ff1..92fb41a 100644 --- a/snes/Makefile +++ b/snes/Makefile @@ -1,4 +1,4 @@ -OBJS = header.ips reset.o65 main.o65 font.o65 palette.o65 data.o65 const.o65 logo.o65 text.o65 # gfx.o65 # vars.o65 +OBJS = header.ips reset.o65 main.o65 font.o65 palette.o65 data.o65 const.o65 logo.o65 text.o65 dma.o65 # gfx.o65 # vars.o65 all: menu.bin diff --git a/snes/const.a65 b/snes/const.a65 index 2146cea..26b85c6 100644 --- a/snes/const.a65 +++ b/snes/const.a65 @@ -1,6 +1,7 @@ +version .byt " v0.1",0 zero .word 0 bg2tile .byt $20 -hdma_pal .byt 44 +hdma_pal_src .byt 44 .byt $60, $2d .byt 24 .byt $00, $00 @@ -35,7 +36,9 @@ hdma_pal .byt 44 .byt 1 .byt $60, $2d .byt $00 -hdma_cg_addr .byt $f0 + +hdma_cg_addr_src + .byt $f0 .byt $00, $00, $00, $00, $00, $00, $00, $00 .byt $00, $00, $00, $00, $00, $00, $00, $00 .byt $00, $00, $00, $00, $00, $00, $00, $00 @@ -66,11 +69,25 @@ hdma_cg_addr .byt $f0 .byt $00, $00, $00, $00, $00, $00, $00, $00 .byt $00, $00, $00, $00, $00, $00, $00, $00 .byt $00 -hdma_mode .byt 74, $03, $01, $05, $00 -hdma_scroll .byt 74 +hdma_mode_src .byt 74, $03, $01, $05, $00 +hdma_scroll_src .byt 74 .byt $00, $00, $ff, $00 .byt $01 .byt $fc, $00, $05, $00 .byt $00 - +hdma_math_src .byt 1 + .byt $00, $e0 + .byt 1 + .byt $00, $e0 + .byt 1 + .byt $60, $bf + .byt 8 + .byt $60, $b0 + .byt 1 + .byt $60, $bf + .byt 1 + .byt $00, $e0 + .byt 0 hello .byt "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aliquam ultrices pharetra libero et ultricies. Proin massa arcu, mattis eu gravida in, tempor sed magna. Mauris molestie purus urna, ut venenatis lorem. Nam nunc lorem, lacinia vel porta quis, sodales eleifend turpis. Aliquam nunc elit, consequat in malesuada vel, elementum eget ipsum. Duis eu lectus nec ipsum imperdiet adipiscing a ac nulla. Mauris risus nisi, posuere nec mollis ac, blandit quis lacus. Donec a sapien felis, ut tempus quam. Nunc semper erat et ipsum accumsan in condimentum enim adipiscing. Sed lobortis accumsan venenatis. Donec euismod mauris gravida risus convallis commodo. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Duis vehicula sem sit amet arcu luctus rhoncus. Etiam sed vulputate ligula. Etiam mauris lectus, eleifend nec fermentum id, bibendum sit amet purus. Pellentesque sollicitudin turpis in leo pharetra vulputate. Sed consequat mattis tortor vitae consectetur. Nullam quis ante in nisl venenatis dignissim. Duis mattis lacus euismod leo volutpat. ", 0 +lohello .byt "Miau", 0 + diff --git a/snes/data.a65 b/snes/data.a65 index 6800d3b..e045ff6 100644 --- a/snes/data.a65 +++ b/snes/data.a65 @@ -26,3 +26,54 @@ print_y .byt 0 ;y coordinate print_src .word 0 ;source data address print_bank .byt 0 ;source data bank print_pal .byt 0 ;palette number for text output + +;----------parameters for dma---------- +dma_a_bank .byt 0 +dma_a_addr .word 0 +dma_b_reg .byt 0 +dma_len .word 0 +dma_mode .byt 0 + +;----------state information---------- +bar_pos .byt 0 ; y position of select bar + +;----------hdma values in RAM +hdma_pal .byt 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + .byt 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + .byt 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + .byt 0,0,0,0 +hdma_cg_addr .byt 0 + .byt 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + .byt 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + .byt 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + .byt 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + .byt 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + .byt 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + .byt 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + .byt 0 + .byt 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + .byt 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + .byt 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + .byt 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + .byt 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + .byt 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + .byt 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + .byt 0 +hdma_mode .byt 0,0,0,0,0 +hdma_scroll .byt 0 + .byt 0,0,0,0 + .byt 0 + .byt 0,0,0,0 + .byt 0 +hdma_math .byt 0 + .byt 0,0 + .byt 0 + .byt 0,0 + .byt 0 + .byt 0,0 + .byt 0 + .byt 0,0 + .byt 0 + .byt 0,0 + .byt 0 +infloop .byt 0,0 ; to be filled w/ 80 FE diff --git a/snes/main.a65 b/snes/main.a65 index 7b290e9..587c6a9 100644 --- a/snes/main.a65 +++ b/snes/main.a65 @@ -1,58 +1,18 @@ #include "memmap.i65" +#include "dma.i65" GAME_MAIN: jsr snes_init jsr setup_gfx - jsr tests jsr setup_hdma - - bra - + jsr tests + jsr colortest + jmp @infloop ;infinite loop in WRAM -setup_hdma: +colortest: sep #$20 : .as rep #$10 : .xl - stz $420b - stz $420c - - lda #$02 ;A to B; direct; 2x single reg - sta $4320 ;we use ch. 2 for color data - lda #$22 ;2122 = CG RAM - sta $4321 ;dest: CG RAM - lda #^hdma_pal - ldy #!hdma_pal - sty $4322 - sta $4324 - - lda #$00 ;A to B; direct; 1x single reg - sta $4310 ;ch. 1 for color address - lda #$21 ;2121 = CG addr - sta $4311 ;dest: CG Address - lda #^hdma_cg_addr - ldy #!hdma_cg_addr - sty $4312 - sta $4314 - - lda #$00 ;A to B; direct; 1x single reg - sta $4330 ;ch. 3 for mode switch - lda #$05 ;2105 = BG mode - sta $4331 - lda #^hdma_mode - ldy #!hdma_mode - sty $4332 - sta $4334 - - lda #$03 ;A to B; direct; 2x 2x single reg - sta $4340 ;ch. 4 for scroll - lda #$0d ;210e = BG1VOFS - sta $4341 - lda #^hdma_scroll - ldy #!hdma_scroll - sty $4342 - sta $4344 - -; lda #$06 -; sta $420c ;enable HDMA ch. 1+2 - lda #$80 - sta $4200 ;enable V-BLANK NMI + stz $2130 rts setup_gfx: @@ -61,119 +21,93 @@ setup_gfx: stz $420b stz $420c ;clear tilemap buffers - lda #$08 ;A to B; fixed, one reg - sta $4300 - lda #^zero - ldy #!zero - sty $4302 - sta $4304 - ldx #$0 ;65536 - stx $4305 ldx #$0000 stx $2181 lda #$01 sta $2183 + DMA0(#$08, #0, #^zero, #!zero, #$80) + +;copy 2bpp font (can be used as 4-bit lores font!) + ldx #$4000 + stx $2116 + DMA0(#$01, #$2000, #^font2, #!font2, #$18) + +;copy 4bpp font + ldx #$0000 + stx $2116 + DMA0(#$01, #$4000, #^font4, #!font4, #$18) + +;clear BG1 tilemap + ldx #BG1_TILE_BASE + stx $2116 + DMA0(#$09, #$800, #^zero, #!zero, #$18) + +;clear BG2 tilemap + ldx #BG2_TILE_BASE + stx $2116 + DMA0(#$09, #$800, #^zero, #!zero, #$18) + +;copy logo tiles + ldx #$2000 + stx $2116 + DMA0(#$01, #$3480, #^logo, #!logo, #$18) + +;copy logo tilemap + ldx #BG1_TILE_BASE + stx $2116 + DMA0(#$01, #$280, #^logomap, #!logomap, #$18) + +;set palette + stz $2121 + DMA0(#$00, #$200, #^palette, #!palette, #$22) + +;copy hdma tables so we can work "without" the cartridge +;palette + lda #^hdma_pal + ldx #!hdma_pal + stx $2181 + sta $2183 + DMA0(#$00, #52, #^hdma_pal_src, #!hdma_pal_src, #$80) + +;CG addr for palette + lda #^hdma_cg_addr + ldx #!hdma_cg_addr + stx $2181 + sta $2183 + DMA0(#$00, #227, #^hdma_cg_addr_src, #!hdma_cg_addr_src, #$80) + +;screen mode + lda #^hdma_mode + ldx #!hdma_mode + stx $2181 + sta $2183 + DMA0(#$00, #5, #^hdma_mode_src, #!hdma_mode_src, #$80) + +;bg scroll + lda #^hdma_scroll + ldx #!hdma_scroll + stx $2181 + sta $2183 + DMA0(#$00, #11, #^hdma_scroll_src, #!hdma_scroll_src, #$80); + +;color math + lda #^hdma_math + ldx #!hdma_math + stx $2181 + sta $2183 + DMA0(#$00, #19, #^hdma_math_src, #!hdma_math_src, #$80); + +;copy infinite loop to WRAM lda #$80 - sta $4301 - lda #$01 - sta $420b + sta infloop + lda #$fe + sta infloop+1 - lda #$01 ;A to B; (direct); non-fixed, inc, two reg - sta $4300 ;to DMA ch.0 ctrl - lda #^font2 ;font source bank - ldy #!font2 ;font source address - sty $4302 ;address -> 4302,4303 - sta $4304 ;bank -> 4304 - ldx #$2000 ;transfer size - stx $4305 ;to reg - ldx #$4000 ;BG2 chr - stx $2116 ;VRAM address 0x8000 - lda #$18 ;VRAM data port - sta $4301 ;to channel 0 tgt address - lda #$01 ;ch 0 enable - sta $420b ;GPDMA GO! - - lda #$01 ;A to B; (direct); non-fixed, inc, two reg - sta $4300 ;to DMA ch.0 ctrl - lda #^font4 ;font source bank - ldy #!font4 ;font source address - sty $4302 ;address -> 4302,4303 - sta $4304 ;bank -> 4304 - ldx #$4000 ;transfer size - stx $4305 ;to reg - ldx #$0000 ;BG1 chr - stx $2116 ;VRAM address 0x0000 - lda #$18 ;VRAM data port - sta $4301 ;to channel 0 tgt address - lda #$01 ;ch 0 enable - sta $420b ;GPDMA GO! - - lda #$09 ;A to B; fixed, two reg - sta $4300 - lda #^zero - ldy #!zero - sty $4302 - sta $4304 - ldx #$1000 - stx $4305 ;zero 4096b of VRAM - ldx #$5000 - stx $2116 ;from 0xa000-0xafff - lda #$18 ;VRAM data port - sta $4301 ;to channel 0 tgt address - lda #$01 - sta $420b - -; copy logo - lda #$01 ;A to B; (direct); non-fixed, inc, two reg - sta $4300 ;to DMA ch.0 ctrl - lda #^logo ;font source bank - ldy #!logo ;font source address - sty $4302 ;address -> 4302,4303 - sta $4304 ;bank -> 4304 - ldx #$3480 ;transfer size - stx $4305 ;to reg - ldx #$2000 ;after font - stx $2116 ;VRAM address 0x4000 - lda #$18 ;VRAM data port - sta $4301 ;to channel 0 tgt address - lda #$01 ;ch 0 enable - sta $420b ;GPDMA GO! - -; copy logo tilemap - lda #$01 ;A to B; (direct); non-fixed, inc, two reg - sta $4300 ;to DMA ch.0 ctrl - lda #^logomap ;font source bank - ldy #!logomap ;font source address - sty $4302 ;address -> 4302,4303 - sta $4304 ;bank -> 4304 - ldx #$280 ;transfer size - stx $4305 ;to reg - ldx #$5400 ;BG1 tilemap - stx $2116 ;VRAM address 0x6800 - lda #$18 ;VRAM data port - sta $4301 ;to channel 0 tgt address - lda #$01 ;ch 0 enable - sta $420b ;GPDMA GO! - stz $2121 ;palette index 0 - lda #$00 - sta $4300 - lda #^palette - ldy #!palette - sty $4302 - sta $4304 - ldx #$200 - stx $4305 - lda #$22 ;CG RAM port - sta $4301 - lda #$01 - sta $420b rts tests: sep #$20 : .as ;8-bit accumulator rep #$10 : .xl ;16-bit index - lda #$0f - sta $2100 ;screen on, full brightness lda #$03 ;mode 3, mode 5 via HDMA :D sta $2105 lda #$54 ;Tilemap addr 0xA800 @@ -190,11 +124,8 @@ tests: lda #$00 sta $2130 stz $2121 - lda #$0 - ldx #$0 - ldy #$0 - lda #$44 - sta @AVR_CMD + lda #$0f + sta $2100 ;screen on, full brightness lda #0 sta print_x lda #10 @@ -203,7 +134,15 @@ tests: ldx #!hello sta print_bank stx print_src - jsr print + jsr hiprint + lda #^version + ldx #!version + sta print_bank + stx print_src + stz print_x + lda #8 + sta print_y + jsr loprint rts snes_init: @@ -298,73 +237,3 @@ snes_init: stz $420c ; rts -texttest: - rep #$10 : .xl - sep #$20 : .as -;copy test text - lda #$00 ;A->B, inc, 1 reg - sta $4300 - lda #^hello - ldy #!hello - sty $4302 - sta $4304 - ldx #31 ;26 bytes - stx $4305 - ldx #$5140 - stx $2116 - lda #$18 - sta $4301 - stz $2115 ;increment after LOW byte (write to 2118) - lda #$01 - sta $420b - - lda #$08 ;A->B, fixed, 1 reg - sta $4300 - lda #^bg2tile - ldy #!bg2tile - sty $4302 - sta $4304 - ldx #31 ;26 bytes - stx $4305 - ldx #$5140 - stx $2116 - lda #$19 - sta $4301 - lda #$80 - sta $2115 ;increment after HIGH byte (write to 2119) - lda #$01 - sta $420b - - lda #$00 ;A->B, inc, 1 reg - sta $4300 - lda #^hello - ldy #!hello+4 - sty $4302 - sta $4304 - ldx #$c ;24 bytes - stx $4305 - ldx #$5540 - stx $2116 - lda #$18 - sta $4301 - stz $2115 ;increment after LOW byte (write to 2118) - lda #$01 - sta $420b - - lda #$08 ;A->B, fixed, 1 reg - sta $4300 - lda #^bg2tile - ldy #!bg2tile - sty $4302 - sta $4304 - ldx #$c ;24 bytes - stx $4305 - ldx #$5540 - stx $2116 - lda #$19 - sta $4301 - lda #$80 - sta $2115 ;increment after HIGH byte (write to 2119) - lda #$01 - sta $420b - rts diff --git a/snes/reset.a65 b/snes/reset.a65 index e3cf9c0..fcf73c7 100644 --- a/snes/reset.a65 +++ b/snes/reset.a65 @@ -2,49 +2,57 @@ ; See http://bisqwit.iki.fi/source/snescom.html for details. #include "memmap.i65" - +#include "dma.i65" #define TILE_ADDR_REG_VAL(addr, scsize) \ (((addr & $FC00) >> 8) + scsize) #define BMAP_ADDR_REG_VAL(addr, addr2) \ (((addr & $F000) >> 12) | (((addr2 & $F000) >> 12) << 4)) -; NMI - called once per screen refresh (or something like that) +; NMI - called on VBlank NMI_ROUTINE: sep #$20 : .as - lda @$4210 + lda #$00 + pha + plb + lda $4210 - lda #$01 - sta $4300 - lda #^BG1_TILE_BUF - ldx #!BG1_TILE_BUF+64*10 - stx $4302 - sta $4304 - ldx #$380*2-64*10 - stx $4305 ldx #BG1_TILE_BASE+32*10 stx $2116 - lda #$18 - sta $4301 - lda #$01 - sta $420b + DMA0(#$01, #$380*2-64*10, #^BG1_TILE_BUF, #!BG1_TILE_BUF+64*10, #$18) - lda #$01 - sta $4300 - lda #^BG2_TILE_BUF - ldx #!BG2_TILE_BUF+64*10 - stx $4302 - sta $4304 - ldx #$380*2-64*10 - stx $4305 ldx #BG2_TILE_BASE+32*10 stx $2116 - lda #$18 - sta $4301 + DMA0(#$01, #$380*2-64*10, #^BG2_TILE_BUF, #!BG2_TILE_BUF+64*10, #$18); + + ldx #BG2_TILE_BASE + stx $2116 + DMA0(#$01, #64*10, #^BG2_TILE_BUF, #!BG2_TILE_BUF, #$18); + + lda bar_pos + inc + bne + + inc ++ + cmp #224 + bne + + lda #1 ++ + sta bar_pos + cmp #113 + bcs lower_half + sta hdma_math lda #$01 - sta $420b - - lda #$1e ; ch. 1-4 + sta hdma_math+3 + bra math_cont +lower_half + clc + sbc #111 + sta hdma_math+3 + lda #112 + sta hdma_math +math_cont + lda #$3e ; ch. 1-5 sta @$420c ; trigger HDMA rtl diff --git a/snes/text.a65 b/snes/text.a65 index d949b29..8a07d31 100644 --- a/snes/text.a65 +++ b/snes/text.a65 @@ -1,6 +1,6 @@ .text #include "memmap.i65" -print: +hiprint: rep #$30 : .xl : .al lda !print_x and #$00ff @@ -12,7 +12,7 @@ print: phx bra print_bg_cont print_bg1 - ldx #!BG2_TILE_BUF+1 ; for 2nd loop + ldx #!BG2_TILE_BUF+2 ; for 2nd loop phx ldx #!BG1_TILE_BUF ; for 1st loop da whoop phx @@ -39,7 +39,7 @@ print_bg_cont ; because VRAM can only be accessed during VBLANK and forced blanking. sta $2181 sep #$20 : .as - lda #$7f ;we really only need the lsb. full bank for clarity + lda #$7f ;we really only need bit 0. full bank given for clarity sta $2183 print_loop ldx !print_src @@ -98,4 +98,49 @@ print_end pha plb rts + + +loprint: + rep #$30 : .xl : .al + lda !print_x + and #$00ff + asl ;double the offset for WRAM addressing + clc + adc #!BG2_TILE_BUF + sta !print_x + lda !print_y + and #$00ff + asl + asl + asl + asl + asl + asl ;double the offset for WRAM addressing + clc + adc !print_x +; we need to transfer to WRAM and from there to VRAM via DMA during VBLANK +; because VRAM can only be accessed during VBLANK and forced blanking. + sta $2181 + sep #$20 : .as + lda #$7f ;we really only need bit 0. full bank given for clarity + sta $2183 + ldx !print_src + lda !print_bank + pha + plb +loprint_loop_inner + lda !0,x + beq loprint_end + sta @$2180 + lda #$00 + adc #$00 + ora #$20 + sta @$2180 + inx + bra loprint_loop_inner +loprint_end + lda #$00 + pha + plb + rts