ソースを参照

o add snes test sample

david 15 年 前
コミット
b2d38dd0de

+ 143 - 0
snes/simpletest/LoadGraphics.asm

@@ -0,0 +1,143 @@
+;============================================================================
+; Macros
+;============================================================================
+
+;============================================================================
+;LoadPalette - Macro that loads palette information into CGRAM
+;----------------------------------------------------------------------------
+; In: SRC_ADDR -- 24 bit address of source data, 
+;     START -- Color # to start on, 
+;     SIZE -- # of COLORS to copy
+;---------------------------------------------------------------------------- 
+; Out: None
+;----------------------------------------------------------------------------
+; Modifies: A,X
+; Requires: mem/A = 8 bit, X/Y = 16 bit
+;----------------------------------------------------------------------------
+.MACRO LoadPalette
+    lda #\2
+    sta $2121       ; Start at START color
+    lda #:\1        ; Using : before the parameter gets its bank.
+    ldx #\1         ; Not using : gets the offset address.
+    ldy #(\3 * 2)   ; 2 bytes for every color
+    jsr DMAPalette
+.ENDM
+
+;============================================================================
+; LoadBlockToVRAM -- Macro that simplifies calling LoadVRAM to copy data to VRAM
+;----------------------------------------------------------------------------
+; In: SRC_ADDR -- 24 bit address of source data
+;     DEST -- VRAM address to write to (WORD address!!)
+;     SIZE -- number of BYTEs to copy
+;----------------------------------------------------------------------------
+; Out: None
+;----------------------------------------------------------------------------
+; Modifies: A, X, Y
+;----------------------------------------------------------------------------
+
+;LoadBlockToVRAM SRC_ADDRESS, DEST, SIZE
+;   requires:  mem/A = 8 bit, X/Y = 16 bit
+.MACRO LoadBlockToVRAM
+    lda #$80
+    sta $2115
+    ldx #\2         ; DEST
+    stx $2116       ; $2116: Word address for accessing VRAM.
+    lda #:\1        ; SRCBANK
+    ldx #\1         ; SRCOFFSET
+    ldy #\3         ; SIZE
+    jsr LoadVRAM
+.ENDM
+
+
+
+
+;============================================================================
+; Routines
+;============================================================================
+
+.BANK 0
+.ORG 0
+.SECTION "LoadVRAMCode" SEMIFREE
+
+;============================================================================
+; LoadVRAM -- Load data into VRAM
+;----------------------------------------------------------------------------
+; In: A:X  -- points to the data
+;     Y     -- Number of bytes to copy (0 to 65535)  (assumes 16-bit index)
+;----------------------------------------------------------------------------
+; Out: None
+;----------------------------------------------------------------------------
+; Modifies: none
+;----------------------------------------------------------------------------
+; Notes:  Assumes VRAM address has been previously set!!
+;----------------------------------------------------------------------------
+LoadVRAM:
+    pha
+    phx
+    phy
+    phb
+    php         ; Preserve Registers
+    
+    sep #$20
+
+    stx $4302   ; Store Data offset into DMA source offset
+    sta $4304   ; Store data Bank into DMA source bank
+    sty $4305   ; Store size of data block
+
+    lda #$01
+    sta $4300   ; Set DMA mode (word, normal increment)
+    lda #$18    ; Set the destination register (VRAM write register)
+    sta $4301
+    lda #$01    ; Initiate DMA transfer (channel 1)
+    sta $420B
+
+    plp         ; restore registers
+    plb
+    ply
+    plx
+    pla
+    rts         ; return
+;============================================================================
+
+.ENDS
+
+.BANK 0
+.ORG 0
+.SECTION "DMAPaletteCode" SEMIFREE
+
+;============================================================================
+; DMAPalette -- Load entire palette using DMA
+;----------------------------------------------------------------------------
+; In: A:X  -- points to the data
+;      Y   -- Size of data
+;----------------------------------------------------------------------------
+; Out: None
+;----------------------------------------------------------------------------
+; Modifies: none
+;----------------------------------------------------------------------------
+DMAPalette:
+    pha
+    phx
+    phb
+    php         ; Preserve Registers
+    
+    sep #$20
+
+    stx $4302   ; Store data offset into DMA source offset
+    sta $4304   ; Store data bank into DMA source bank
+    sty $4305   ; Store size of data block
+
+    stz $4300   ; Set DMA Mode (byte, normal increment)
+    lda #$22    ; Set destination register ($2122 - CGRAM Write)
+    sta $4301
+    lda #$01    ; Initiate DMA transfer
+    sta $420B
+
+    plp         ; Restore registers
+    plb
+    plx
+    pla
+    rts         ; return from subroutine
+;============================================================================
+
+.ENDS

+ 30 - 0
snes/simpletest/Makefile

@@ -0,0 +1,30 @@
+#wla-65816 -o %1.asm %1.obj
+#wlalink -vr temp.prj %1.smc
+
+
+AS=wla-65816
+LD=wlalink
+
+OBJS=sprite.o
+APP=sprite.smc
+GFX=biker.pic
+EMU=/Applications/ZSNES.app/Contents/MacOS/ZSNES
+
+all: clean $(APP)
+
+run:  
+	$(EMU) $(APP)
+
+
+linkfile:
+	echo "[objects]" > linkerfile.prj
+
+%.o: %.asm
+	echo "$@" >> linkerfile.prj
+	$(AS) -o $?  $@
+
+$(APP):  linkfile $(GFX) $(OBJS) $(GFX)
+	$(LD) -vr linkerfile.prj  $@
+
+clean:
+	rm -vf $(APP) *.prj *.o

BIN
snes/simpletest/biker.clr


BIN
snes/simpletest/biker.pcx


BIN
snes/simpletest/biker.pic


+ 61 - 0
snes/simpletest/header.inc

@@ -0,0 +1,61 @@
+;------------------------------ Header File ---------------------------------
+;   This is basically a combo of MarctheMER's and Neviksti's header files
+; Perhaps reading their's will also help your understanding of the header,
+; but I believe this will be the simplest method of defining your header,
+; as Marc's doesn't provide a full explanation, and Neviksti's can be
+; a bit more difficult for beginners (using the WLA directives is easier).
+;----------------------------------------------------------------------------
+
+;==LoRom==      ; We'll get to HiRom some other time.
+.MEMORYMAP                      ; Begin describing the system architecture.
+  SLOTSIZE $8000                ; The slot is $8000 bytes in size. More details on slots later.
+  DEFAULTSLOT 0                 ; There's only 1 slot in SNES, there are more in other consoles.
+  SLOT 0 $8000                  ; Define's Slot 0's starting address.
+.ENDME          ; End MemoryMap definition
+
+.ROMBANKSIZE $8000              ; Every ROM bank is 32 KBytes in size
+.ROMBANKS 8                     ; 2 Mbits - Tell WLA we want to use 8 ROM Banks
+
+.SNESHEADER
+  ID "SNES"                     ; 1-4 letter string, just leave it as "SNES"
+  
+  NAME "SNES Tile Demo       "  ; Program Title - can't be over 21 bytes,
+  ;    "123456789012345678901"  ; use spaces for unused bytes of the name.
+
+  SLOWROM
+  LOROM
+
+  CARTRIDGETYPE $00             ; $00 = ROM only, see WLA documentation for others
+  ROMSIZE $08                   ; $08 = 2 Mbits,  see WLA doc for more..
+  SRAMSIZE $00                  ; No SRAM         see WLA doc for more..
+  COUNTRY $01                   ; $01 = U.S.  $00 = Japan, that's all I know
+  LICENSEECODE $00              ; Just use $00
+  VERSION $00                   ; $00 = 1.00, $01 = 1.01, etc.
+.ENDSNES
+
+.SNESNATIVEVECTOR               ; Define Native Mode interrupt vector table
+  COP EmptyHandler
+  BRK EmptyHandler
+  ABORT EmptyHandler
+  NMI VBlank
+  IRQ EmptyHandler
+.ENDNATIVEVECTOR
+
+.SNESEMUVECTOR                  ; Define Emulation Mode interrupt vector table
+  COP EmptyHandler
+  ABORT EmptyHandler
+  NMI EmptyHandler
+  RESET Start
+  IRQBRK EmptyHandler
+.ENDEMUVECTOR
+
+.BANK 0 SLOT 0                  ; Defines the ROM bank and the slot it is inserted in memory.
+.ORG 0                          ; .ORG 0 is really $8000, because the slot starts at $8000
+.SECTION "EmptyVectors" SEMIFREE
+
+EmptyHandler:
+        rti
+
+.ENDS
+
+.EMPTYFILL $00

+ 262 - 0
snes/simpletest/init.inc

@@ -0,0 +1,262 @@
+;------------------------------------------------------------------------
+;-  Written by: Neviksti
+;-     If you use my code, please share your creations with me
+;-     as I am always curious :)
+;------------------------------------------------------------------------
+
+
+;----------------------------------------------------------------------------
+; InitSNES -- my "standard" initialization of SNES memory and registers
+;----------------------------------------------------------------------------
+.MACRO InitSNES
+  sei                     ;disable interrupts
+  clc                     ;switch to native mode
+  xce
+
+  REP #$38		; mem/A = 16 bit, X/Y = 16 bit
+			;decimal mode off
+
+  LDX #$1FFF	;Setup the stack
+  TXS			;Transfer Index X to Stack Pointer Register
+
+  ;do the rest of the initialization in a routine
+  JSL $008000
+
+  SEP #$20		; mem/A = 8 bit
+.ENDM
+
+;----------------------------------------------------------------------------
+
+.BANK 0 SLOT 0
+.ORG 0
+.SECTION "InitializeSNESCode" FORCE
+
+InitializeSNES:
+  PHK			;set Data Bank = Program Bank
+  PLB
+
+  LDA #$0000	;set Direct Page = $0000
+  TCD			;Transfer Accumulator to Direct Register
+
+  LDX $1FFD		;we clear all the mem at one point ...
+  STX $4372  	;so save the return address in a place that won't get overwritten
+  LDX $1FFF
+  STX $4374
+
+  SEP #$20		; mem/A = 8 bit
+  REP #$10
+
+  LDA #$8F
+  STA $2100		;turn screen off for now, set brightness to normal
+
+  LDX #$2101
+_Loop00:		;regs $2101-$210C
+  STZ $00,X		;set Sprite,Character,Tile sizes to lowest, and set addresses to $0000
+  INX
+  CPX #$210D
+  BNE _Loop00
+
+_Loop01:		;regs $210D-$2114
+  STZ $00,X		;Set all BG scroll values to $0000
+  STZ $00,X
+  INX
+  CPX #$2115
+  BNE _Loop01
+
+  LDA #$80		;reg $2115
+  STA $2115		; Initialize VRAM transfer mode to word-access, increment by 1
+
+  STZ $2116		;regs $2117-$2117
+  STZ $2117		;VRAM address = $0000
+
+			;reg $2118-$2119
+			;VRAM write register... don't need to initialize
+
+  STZ $211A		;clear Mode7 setting
+
+  LDX #$211B
+_Loop02:		;regs $211B-$2120
+  STZ $00,X		;clear out the Mode7 matrix values
+  STZ $00,X
+  INX
+  CPX #$2121
+  BNE _Loop02
+
+			;reg $2121 - Color address, doesn't need initilaizing
+			;reg $2122 - Color data, is initialized later
+
+  LDX #$2123
+_Loop03:		;regs $2123-$2133
+  STZ $00,X		;turn off windows, main screens, sub screens, color addition,
+  INX			;fixed color = $00, no super-impose (external synchronization),
+  CPX #$2134	;no interlaced mode, normal resolution
+  BNE _Loop03
+
+			;regs $2134-$2136  - multiplication result, no initialization needed
+			;reg $2137 - software H/V latch, no initialization needed
+			;reg $2138 - Sprite data read, no initialization needed
+			;regs $2139-$213A  - VRAM data read, no initialization needed
+			;reg $213B - Color RAM data read, no initialization needed
+			;regs $213C-$213D  - H/V latched data read, no initialization needed
+
+  STZ $213E		;reg $213E - might not be necesary, but selects PPU master/slave mode
+			;reg $213F - PPU status flag, no initialization needed
+
+			;reg $2140-$2143 - APU communication regs, no initialization required
+
+			;reg $2180  -  read/write WRAM register, no initialization required
+			;reg $2181-$2183  -  WRAM address, no initialization required
+
+			;reg $4016-$4017  - serial JoyPad read registers, no need to initialize
+
+
+  STZ $4200		;reg $4200  - disable timers, NMI,and auto-joyread
+
+  LDA #$FF
+  STA $4201		;reg $4201  - programmable I/O write port, initalize to allow reading at in-port
+
+			;regs $4202-$4203  - multiplication registers, no initialization required
+			;regs $4204-$4206  - division registers, no initialization required
+
+			;regs $4207-$4208  - Horizontal-IRQ timer setting, since we disabled this, it is OK to not init
+			;regs $4209-$420A  - Vertical-IRQ timer setting, since we disabled this, it is OK to not init
+
+  STZ $420B		;reg $420B  - turn off all general DMA channels
+  STZ $420C		;reg $420C  - turn off all H-MA channels
+
+  STZ $420D		;reg $420D  - ROM access time to slow (2.68Mhz)
+
+  LDA $4210		;reg $4210  - NMI status, reading resets
+
+			;reg $4211  - IRQ status, no need to initialize
+			;reg $4212  - H/V blank and JoyRead status, no need to initialize
+			;reg $4213  - programmable I/O inport, no need to initialize
+
+			;reg $4214-$4215  - divide results, no need to initialize
+			;reg $4216-$4217  - multiplication or remainder results, no need to initialize
+
+			;regs $4218-$421f  - JoyPad read registers, no need to initialize
+
+			;regs $4300-$437F
+			;no need to intialize because DMA was disabled above
+			;also, we're not sure what all of the registers do, so it is better to leave them at
+			;their reset state value
+
+  JSR ClearVRAM      ;Reset VRAM
+  JSR ClearPalette   ;Reset colors
+
+  ;**** clear Sprite tables ********
+
+  STZ $2102	;sprites initialized to be off the screen, palette 0, character 0
+  STZ $2103
+  LDX #$0080
+  LDA #$F0
+_Loop08:
+  STA $2104	;set X = 240
+  STA $2104	;set Y = 240
+  STZ $2104	;set character = $00
+  STZ $2104	;set priority=0, no flips
+  DEX
+  BNE _Loop08
+
+  LDX #$0020
+_Loop09:
+  STZ $2104		;set size bit=0, x MSB = 0
+  DEX
+  BNE _Loop09
+
+  ;**** clear WRAM ********
+
+  STZ $2181		;set WRAM address to $000000
+  STZ $2182
+  STZ $2183
+
+  LDX #$8008
+  STX $4300         ;Set DMA mode to fixed source, BYTE to $2180
+  LDX #wram_fill_byte
+  STX $4302         ;Set source offset
+  LDA #:wram_fill_byte
+  STA $4304         ;Set source bank
+  LDX #$0000
+  STX $4305         ;Set transfer size to 64k bytes
+  LDA #$01
+  STA $420B         ;Initiate transfer
+
+  LDA #$01          ;now set the next 64k bytes
+  STA $420B         ;Initiate transfer
+
+  PHK			;make sure Data Bank = Program Bank
+  PLB
+
+  CLI			;enable interrupts again
+
+  LDX $4372  	;get our return address...
+  STX $1FFD
+  LDA $4374
+  STA $1FFF
+  RTL
+
+wram_fill_byte:
+.db $00
+
+;----------------------------------------------------------------------------
+; ClearVRAM -- Sets every byte of VRAM to zero
+; In: None
+; Out: None
+; Modifies: flags
+;----------------------------------------------------------------------------
+ClearVRAM:
+   pha
+   phx
+   php
+
+   REP #$30		; mem/A = 8 bit, X/Y = 16 bit
+   SEP #$20
+
+   LDA #$80
+   STA $2115         ;Set VRAM port to word access
+   LDX #$1809
+   STX $4300         ;Set DMA mode to fixed source, WORD to $2118/9
+   LDX #$0000
+   STX $2116         ;Set VRAM port address to $0000
+   STX $0000         ;Set $00:0000 to $0000 (assumes scratchpad ram)
+   STX $4302         ;Set source address to $xx:0000
+   LDA #$00
+   STA $4304         ;Set source bank to $00
+   LDX #$FFFF
+   STX $4305         ;Set transfer size to 64k-1 bytes
+   LDA #$01
+   STA $420B         ;Initiate transfer
+
+   STZ $2119         ;clear the last byte of the VRAM
+
+   plp
+   plx
+   pla
+   RTS
+
+;----------------------------------------------------------------------------
+; ClearPalette -- Reset all palette colors to zero
+; In: None
+; Out: None
+; Modifies: flags
+;----------------------------------------------------------------------------
+ClearPalette:
+   PHX
+   PHP
+   REP #$30		; mem/A = 8 bit, X/Y = 16 bit
+   SEP #$20
+
+   STZ $2121
+   LDX #$0100
+ClearPaletteLoop:
+   STZ $2122
+   STZ $2122
+   DEX
+   BNE ClearPaletteLoop
+
+   PLP
+   PLX
+   RTS
+
+.ENDS

+ 209 - 0
snes/simpletest/sprite.asm

@@ -0,0 +1,209 @@
+;============================================================================
+; Includes
+;============================================================================
+
+;== Include MemoryMap, Vector Table, and HeaderInfo ==
+.INCLUDE "header.inc"
+
+;== Include SNES Initialization routines ==
+.INCLUDE "init.inc"
+.INCLUDE "LoadGraphics.asm"
+
+
+;== EQUates ==
+.EQU PalNum $0000       ; Use some RAM
+
+;============================================================================
+; Main Code
+;============================================================================
+
+.MACRO Stall
+    .REPT 3
+        WAI
+    .ENDR
+.ENDM
+
+.BANK 0 SLOT 0
+.ORG 0
+.SECTION "MainCode"
+
+Start:
+    InitSNES    ; Clear registers, etc.
+
+    rep #$10
+    sep #$20
+
+    lda #%00001001
+    sta $2105
+
+    ; Blue Background
+    stz $2121
+    lda #$40
+    sta $2122
+    sta $2122
+    
+    ; Load Palette for our tiles
+    LoadPalette SprPal, 128, 16     ; Sprite Palettes start at color 128
+
+    ; Load Tile data to VRAM
+    LoadBlockToVRAM Sprite, $0000, $0800
+
+    jsr SpriteInit
+    
+    lda #($80-16)
+    sta $0000
+    
+    lda #(224/2 - 16)
+    sta $0001
+    
+    stz $0002
+    lda #%01110000
+    sta $0003
+ 
+    ;lda #%11000000
+    ;sta $0100
+ 
+   
+    lda #%01010100
+    sta $0200
+    
+    ; Setup Video modes and other stuff, then turn on the screen
+    jsr SetupVideo
+
+    lda #$80
+    sta $4200       ; Enable NMI
+
+
+Infinity:
+    Stall
+    lda PalNum
+    clc
+    adc #$01
+    and #$ff        ; If > palette starting color > 24 (00011100), make 0
+    sta PalNum
+
+    jmp Infinity    ; bwa hahahahaha
+
+;============================================================================
+SpriteInit:
+	php	
+
+	rep	#$30	;16bit mem/A, 16 bit X/Y
+	
+	ldx #$0000
+    lda #$0001
+_setoffscr:
+    sta $0000,X
+    inx
+    inx
+    inx
+    inx
+    cpx #$0200
+    bne _setoffscr
+;==================
+	ldx #$0000
+	lda #$5555
+_clr:
+	sta $0200, X		;initialize all sprites to be off the screen
+	inx
+	inx
+	cpx #$0020
+	bne _clr
+;==================
+
+	plp
+	rts
+;============================================================================
+;============================================================================
+; SetupVideo -- Sets up the video mode and tile-related registers
+;----------------------------------------------------------------------------
+; In: None
+;----------------------------------------------------------------------------
+; Out: None
+;----------------------------------------------------------------------------
+SetupVideo:
+    php
+    
+    rep #$10
+    sep #$20
+    
+    stz $2102
+    stz $2103
+    
+    ;*********transfer sprite data
+
+	stz $2102		; set OAM address to 0
+	stz $2103
+
+	LDY #$0400
+	STY $4300		; CPU -> PPU, auto increment, write 1 reg, $2104 (OAM Write)
+	stz $4302
+	stz $4303		; source offset
+	LDY #$0220
+	STY $4305		; number of bytes to transfer
+	LDA #$7E
+	STA $4304		; bank address = $7E  (work RAM)
+	LDA #$01
+	STA $420B		;start DMA transfer
+	
+	lda #%10100000
+    sta $2101
+
+    lda #%00010000            ; Enable BG1
+    sta $212C
+    
+    lda #$0F
+    sta $2100           ; Turn on screen, full Brightness
+
+    plp
+    rts
+
+
+
+;============================================================================
+VBlank:
+    rep #$30        ; A/mem=16 bits, X/Y=16 bits (to push all 16 bits)
+    phb
+	pha
+	phx
+	phy
+	phd
+
+    sep #$20        ; A/mem=8 bit    
+    
+    
+
+    stz $2121
+    lda PalNum
+    sta $2122
+    sta $2122
+
+
+    lda $4210       ; Clear NMI flag
+    rep #$30        ; A/Mem=16 bits, X/Y=16 bits 
+    
+    PLD 
+	PLY 
+	PLX 
+	PLA 
+	PLB 
+
+    sep #$20
+    RTI
+
+;============================================================================
+.ENDS
+
+;============================================================================
+; Character Data
+;============================================================================
+.BANK 1 SLOT 0
+.ORG 0
+.SECTION "CharacterData"
+Sprite:
+    .INCBIN "biker.pic"
+    
+SprPal:
+    .INCBIN "biker.clr"
+
+.ENDS