From 2e59b07d7de990fb8dabef7db519c765c9f775d6 Mon Sep 17 00:00:00 2001 From: optixx Date: Fri, 16 Oct 2009 07:27:50 +0200 Subject: [PATCH] cleanup --- snes/loadertest/Makefile | 77 -- snes/loadertest/PPU.c | 90 --- snes/loadertest/PPU.h | 11 - snes/loadertest/StartupSnes.asm | 240 ------- snes/loadertest/crc.c | 37 - snes/loadertest/crc.h | 3 - snes/loadertest/data.h | 8 - snes/loadertest/debug.c | 224 ------ snes/loadertest/debug.h | 8 - snes/loadertest/event.c | 106 --- snes/loadertest/event.h | 17 - snes/loadertest/integer.h | 48 -- snes/loadertest/main.c | 93 --- snes/loadertest/myEvents.c | 103 --- snes/loadertest/myEvents.h | 6 - snes/loadertest/pad.c | 26 - snes/loadertest/pad.h | 20 - snes/loadertest/ressource.asm | 9 - snes/loadertest/ressource.h | 2 - snes/loadertest/ressource/debugFont.clr | Bin 512 -> 0 bytes snes/loadertest/ressource/debugFont.pcx | Bin 3154 -> 0 bytes snes/loadertest/ressource/debugFont.pic | Bin 2048 -> 0 bytes snes/loadertest/ressource/debugFont.xcf | Bin 6237 -> 0 bytes snes/loadertest/tools/padbin.exe | Bin 16095 -> 0 bytes snes/xmsnes/InitSNES.asm | 262 ------- snes/xmsnes/Makefile | 7 - snes/xmsnes/cheader.inc | 41 -- snes/xmsnes/graphics/bg.pcx | Bin 12709 -> 0 bytes snes/xmsnes/graphics/bg2.pcx | Bin 166 -> 0 bytes snes/xmsnes/graphics/bub.pcx | Bin 1920 -> 0 bytes snes/xmsnes/graphics/font.pcx | Bin 2678 -> 0 bytes snes/xmsnes/graphics/gfx_bg.inc | 906 ----------------------- snes/xmsnes/graphics/gfx_bg2.inc | 13 - snes/xmsnes/graphics/gfx_bub.inc | 138 ---- snes/xmsnes/graphics/gfx_font.inc | 102 --- snes/xmsnes/graphics/gfx_window.inc | 19 - snes/xmsnes/graphics/gfx_window2.inc | 19 - snes/xmsnes/graphics/window.pcx | Bin 238 -> 0 bytes snes/xmsnes/graphics/window2.pcx | Bin 238 -> 0 bytes snes/xmsnes/main.asm | 910 ------------------------ snes/xmsnes/main.link | 3 - snes/xmsnes/make.sh | 5 - snes/xmsnes/memmap.inc | 42 -- snes/xmsnes/snes.inc | 179 ----- snes/xmsnes/spx_snes.asm | 701 ------------------ snes/xmsnes/test.xmp | Bin 180290 -> 0 bytes snes/xmsnes/vram.txt | 12 - 47 files changed, 4487 deletions(-) delete mode 100644 snes/loadertest/Makefile delete mode 100644 snes/loadertest/PPU.c delete mode 100644 snes/loadertest/PPU.h delete mode 100644 snes/loadertest/StartupSnes.asm delete mode 100644 snes/loadertest/crc.c delete mode 100644 snes/loadertest/crc.h delete mode 100644 snes/loadertest/data.h delete mode 100644 snes/loadertest/debug.c delete mode 100644 snes/loadertest/debug.h delete mode 100644 snes/loadertest/event.c delete mode 100644 snes/loadertest/event.h delete mode 100644 snes/loadertest/integer.h delete mode 100644 snes/loadertest/main.c delete mode 100644 snes/loadertest/myEvents.c delete mode 100644 snes/loadertest/myEvents.h delete mode 100644 snes/loadertest/pad.c delete mode 100644 snes/loadertest/pad.h delete mode 100644 snes/loadertest/ressource.asm delete mode 100644 snes/loadertest/ressource.h delete mode 100644 snes/loadertest/ressource/debugFont.clr delete mode 100644 snes/loadertest/ressource/debugFont.pcx delete mode 100644 snes/loadertest/ressource/debugFont.pic delete mode 100644 snes/loadertest/ressource/debugFont.xcf delete mode 100644 snes/loadertest/tools/padbin.exe delete mode 100644 snes/xmsnes/InitSNES.asm delete mode 100644 snes/xmsnes/Makefile delete mode 100644 snes/xmsnes/cheader.inc delete mode 100644 snes/xmsnes/graphics/bg.pcx delete mode 100644 snes/xmsnes/graphics/bg2.pcx delete mode 100644 snes/xmsnes/graphics/bub.pcx delete mode 100644 snes/xmsnes/graphics/font.pcx delete mode 100644 snes/xmsnes/graphics/gfx_bg.inc delete mode 100644 snes/xmsnes/graphics/gfx_bg2.inc delete mode 100644 snes/xmsnes/graphics/gfx_bub.inc delete mode 100644 snes/xmsnes/graphics/gfx_font.inc delete mode 100644 snes/xmsnes/graphics/gfx_window.inc delete mode 100644 snes/xmsnes/graphics/gfx_window2.inc delete mode 100644 snes/xmsnes/graphics/window.pcx delete mode 100644 snes/xmsnes/graphics/window2.pcx delete mode 100644 snes/xmsnes/main.asm delete mode 100644 snes/xmsnes/main.link delete mode 100644 snes/xmsnes/make.sh delete mode 100644 snes/xmsnes/memmap.inc delete mode 100644 snes/xmsnes/snes.inc delete mode 100644 snes/xmsnes/spx_snes.asm delete mode 100644 snes/xmsnes/test.xmp delete mode 100644 snes/xmsnes/vram.txt diff --git a/snes/loadertest/Makefile b/snes/loadertest/Makefile deleted file mode 100644 index 2f976d6..0000000 --- a/snes/loadertest/Makefile +++ /dev/null @@ -1,77 +0,0 @@ -# SDK Config - - -PLATFORM=$(shell uname) - -ifeq ($(PLATFORM),Linux) - # Linux Wine - SDK=/home/david/.wine/drive_c/65xx_FreeSDK - WINE=wine - EMU=../../tools/bsnes/bsnes - DISASM=/home/david/Devel/arch/snes/devkit/bin/disasm - UCON=ucon64 -else - # Mac Wine - SDK=/Users/david/.wine/drive_c/65xx_FreeSDK - WINE=wine - EMU=zsnes - DISASM=/Users/david/Devel/arch/snes/devkit/bin/disasm - UCON=ucon64 -endif - -CC=$(WINE) $(SDK)/bin/WDC816CC.exe -AS=$(WINE) $(SDK)/bin/WDC816AS.exe -LD=$(WINE) $(SDK)/bin/WDCLN.exe -PADBIN=$(WINE) tools/padbin.exe - -# Project - -INC=$(SDK)/include -LIBS=-L$(SDK)/lib/cc -#-L$(SDK)/lib/c134 - - -OBJS=StartupSnes.obj main.obj pad.obj PPU.obj debug.obj ressource.obj -APP=loadertest.smc -GFX=debugfont - -all: $(APP) - -run: - $(EMU) $(APP) - - -disasm: $(APP) - rm -rf $(APP) - $(DISASM) $(APP) > $(APP).asm - -upload: header - ucon64 --port=usb --xsnesram $(APP) - -repair: $(APP) - $(UCON) -snes -chk $(APP) 2>&1 >/dev/null - rm -rf *.bak - -header: $(APP) - $(UCON) -smc $(APP) - rm -rf *.bak - -StartupSnes.obj: StartupSnes.asm - $(AS) -V $? - -ressource.obj: ressource.asm - $(AS) -V $? - -%.obj: %.c - $(CC) -wl -wp -sop -MC -I $(INC) $? - -$(APP): $(OBJS) - $(LD) -B -HB -M21 -V -T -Pff \ - -C008000,0000 -U0000,0000 \ - -Avectors=FFE4,7FE4 \ - -Aregistration_data=FFB0,7FB0 \ - -Aressource=18000,8000 \ - -N $(OBJS) $(LIBS) -O $@ - $(PADBIN) 0x20000 $(APP) -clean: - rm -vf $(APP) *.obj *.TMP diff --git a/snes/loadertest/PPU.c b/snes/loadertest/PPU.c deleted file mode 100644 index a0fd197..0000000 --- a/snes/loadertest/PPU.c +++ /dev/null @@ -1,90 +0,0 @@ -#include "data.h" - -byte tileMapLocation[4]; -word characterLocation[4]; - -void waitForVBlank(void) -{ - byte Status; - do { - Status = *(byte *) 0x4210; - } while (!(Status & 0x80)); -} - -void setTileMapLocation(word vramDst, byte screenProp, byte bgNumber) -{ - tileMapLocation[bgNumber] = ((vramDst >> 8) & 0xfc) | (screenProp & 0x03); - *(byte *) (0x2107 + bgNumber) = tileMapLocation[bgNumber]; -} - -void restoreTileMapLocation(byte bgNumber) -{ - *(byte *) (0x2107 + bgNumber) = tileMapLocation[bgNumber]; -} - -void setCharacterLocation(word vramDst, byte bgNumber) -{ - characterLocation[bgNumber] = vramDst; - if (bgNumber < 2) { - *(byte *) 0x210b = - (characterLocation[1] >> 8 & 0xf0) + (characterLocation[0] >> 12); - } else { - *(byte *) 0x210c = - (characterLocation[3] >> 8 & 0xf0) + (characterLocation[2] >> 12); - } -} - -void restoreCharacterLocation(byte bgNumber) -{ - setCharacterLocation(characterLocation[bgNumber], bgNumber); -} - -void VRAMByteWrite(byte value, word vramDst) -{ - *(byte *) 0x2115 = 0x80; - *(word *) 0x2116 = vramDst; - - *(byte *) 0x2118 = value; -} - -void VRAMLoad(word src, word vramDst, word size) -{ - // set address in VRam for read or write ($2116) + block size transfer ($2115) - *(byte *) 0x2115 = 0x80; - *(word *) 0x2116 = vramDst; - - *(word *) 0x4300 = 0x1801; // set DMA control register (1 word inc) - // and destination ($21xx xx -> 0x18) - *(word *) 0x4302 = src; // DMA channel x source address offset - // (low $4302 and high $4303 optimisation) - *(byte *) 0x4304 = 0x01; // DMA channel x source address bank - *(word *) 0x4305 = size; // DMA channel x transfer size - // (low $4305 and high $4306 optimisation) - - // Turn on DMA transfer for this channel - waitForVBlank(); - *(byte *) 0x2100 = 0x80; - *(byte *) 0x420b = 0x01; - *(byte *) 0x2100 = 0x00; -} - -void CGRAMLoad(word src, byte cgramDst, word size) -{ - - // set address in VRam for read or write + block size - *(byte *) 0x2121 = cgramDst; - - *(word *) 0x4300 = 0x2200; // set DMA control register (1 byte inc) - // and destination ($21xx xx -> 022) - *(word *) 0x4302 = src; // DMA channel x source address offset - // (low $4302 and high $4303 optimisation) - *(byte *) 0x4304 = 0x01; // DMA channel x source address bank - *(word *) 0x4305 = size; // DMA channel x transfer size - // (low $4305 and high $4306 optimisation) - - // Turn on DMA transfer for this channel - waitForVBlank(); - *(byte *) 0x2100 = 0x80; - *(byte *) 0x420b = 0x01; - *(byte *) 0x2100 = 0x00; -} diff --git a/snes/loadertest/PPU.h b/snes/loadertest/PPU.h deleted file mode 100644 index a0a3899..0000000 --- a/snes/loadertest/PPU.h +++ /dev/null @@ -1,11 +0,0 @@ -extern byte tileMapLocation[4]; -extern word characterLocation[4]; - -void waitForVBlank(void); -void setTileMapLocation(word vramDst, byte screenProp, byte bgNumber); -void restoreTileMapLocation(byte bgNumber); -void setCharacterLocation(word vramDst, byte bgNumber); -void restoreCharacterLocation(byte bgNumber); -void VRAMByteWrite(byte value, word vramDst); -void VRAMLoad(word src, word vramDst, word size); -void CGRAMLoad(word src, byte cgramDst, word size); diff --git a/snes/loadertest/StartupSnes.asm b/snes/loadertest/StartupSnes.asm deleted file mode 100644 index 623e2cc..0000000 --- a/snes/loadertest/StartupSnes.asm +++ /dev/null @@ -1,240 +0,0 @@ -; SNES ROM startup code - -;****************************************************************************** -;*** Define a special section in case most of the code is not in bank 0. *** -;****************************************************************************** - -;STACK EQU $01ff ;CHANGE THIS FOR YOUR SYSTEM - -;STARTUP SECTION OFFSET $008000 - -CODE - - XDEF START -START: - XREF _~main - - sei ; Disabled interrupts - clc ; clear carry to switch to native mode - xce ; Xchange carry & emulation bit. native mode - rep #$18 ; Binary mode (decimal mode off), X/Y 16 bit - LONGI ON - ldx #$1FFF ; set stack to $1FFF - txs - - rep #$30 - longa on - longi on - - ; Init data used for heap - ; see heap definition below - XREF _~_heap_top - XREF _~_mem_start - stz _~_heap_top - stz _~_mem_start - - XREF _~preInit - jsr >_~preInit - - sep #$30 ; X,Y,A are 8 bit numbers - LONGA OFF - LONGI OFF - 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) - cli ; Enable interrupts - - rep #$30 - longa on - longi on - - jsr >_~main - brk - - XDEF IRQ -IRQ: - XREF _~IRQHandler - LONGA ON - LONGI ON - rep #$30 - pha - phx - phy - jsr _~IRQHandler - ply - plx - pla - rti - - XDEF NMI -NMI: - XREF _~NMIHandler - LONGA ON - LONGI ON - rep #$30 - pha - phx - phy - phd - phb - lda #$0000 - sep #$30 ; X,Y,A are 8 bit numbers - LONGA OFF - LONGI OFF - lda $4210 ; Read NMI - LONGA ON - LONGI ON - rep #$30 - jsr _~NMIHandler - plb - pld - ply - plx - pla - rti - -DIRQ: - rti - -ENDS - -;****************************************************************************** -;*** Heap definition *** -;****************************************************************************** - -DATA - - XDEF _~heap_start - XDEF _~heap_end - -_~heap_start: - WORD $1000 -_~heap_end: - WORD $1200 - -;****************************************************************************** -;*** SNES ROM Registartion Data *** -;****************************************************************************** - -REGISTRATION_DATA SECTION - -MAKER_CODE FCC /FF/ -GAME_CODE FCC /SMWJ/ -FIXED_VALUE0 BYTE $00, $00, $00, $00, $00, $00, $00 -EXPANSION_RAM_SIZE BYTE $00 -SPECIAL_VERSION BYTE $00 -CARTRIDGE_TYPE_SUB BYTE $00 -GAME_TITLE FCC /GAME TITLE !/ - ;012345678901234567890; -MAP_MODE BYTE $20 -CARTRIDGE_SIZE BYTE $00 -ROM_SIZE BYTE $09 -RAM_SIZE BYTE $00 -DESTINATION_CODE BYTE $00 -FIXED_VALUE1 BYTE $33 -MASK_ROM_VERSION BYTE $00 -COMPLEMENT_CHECK BYTE $00, $00 -CHEKSUM BYTE $00, $00 - -;****************************************************************************** -;*** SNES Interrupts and Reset vector *** -;****************************************************************************** - -VECTORS SECTION -; Native vector -N_COP DW DIRQ -N_BRK DW DIRQ -N_ABORT DW DIRQ -N_NMI DW NMI -N_RSRVD DW DIRQ -N_IRQ DW IRQ - DS 4 -; Emulation vector -E_COP DW DIRQ -E_RSRVD DW DIRQ -E_ABORT DW DIRQ -E_NMI DW DIRQ -E_RESET DW START -E_IRQ DW DIRQ - -END - diff --git a/snes/loadertest/crc.c b/snes/loadertest/crc.c deleted file mode 100644 index 12749a3..0000000 --- a/snes/loadertest/crc.c +++ /dev/null @@ -1,37 +0,0 @@ -#include "data.h" - - -word crc_update(char far * data, word size) -{ - word i; - word j; - word crc = 0; - for (j = 0; j < size; j++) { - crc = crc ^ ((word) data[j] << 8); - for (i = 0; i < 8; i++) { - if (crc & 0x8000) - crc = (crc << 1) ^ 0x1021; - else - crc <<= 1; - } - } - return crc; -} - - -word crc_update_mem(unsigned long addr, word size) -{ - word i; - word j; - word crc = 0; - for (j = 0; j < size; j++) { - crc = crc ^ ((word) * (byte *) (addr + j) << 8); - for (i = 0; i < 8; i++) { - if (crc & 0x8000) - crc = (crc << 1) ^ 0x1021; - else - crc <<= 1; - } - } - return crc; -} diff --git a/snes/loadertest/crc.h b/snes/loadertest/crc.h deleted file mode 100644 index 8108d80..0000000 --- a/snes/loadertest/crc.h +++ /dev/null @@ -1,3 +0,0 @@ - -word crc_update(byte * data, word size); -word crc_update_mem(unsigned long, word size); diff --git a/snes/loadertest/data.h b/snes/loadertest/data.h deleted file mode 100644 index 673102c..0000000 --- a/snes/loadertest/data.h +++ /dev/null @@ -1,8 +0,0 @@ - -#ifndef _DATA - -typedef unsigned char byte; -typedef unsigned short word; - -#define _DATA -#endif diff --git a/snes/loadertest/debug.c b/snes/loadertest/debug.c deleted file mode 100644 index 5a3ba02..0000000 --- a/snes/loadertest/debug.c +++ /dev/null @@ -1,224 +0,0 @@ -#include -#include -#include -#include - -#include "debug.h" -#include "data.h" -#include "pad.h" -#include "PPU.h" -#include "ressource.h" - - - -#define DEBUG_BUFFER_SIZE 128 - -word debugMap[0x400]; -char debug_buffer[DEBUG_BUFFER_SIZE]; -char screen_buffer[DEBUG_BUFFER_SIZE]; - - -void debug_init(void) -{ - word i; - for (i = 0; i < 0x400; i++) { - debugMap[i] = 0x00; - } - memset(debug_buffer, 0, DEBUG_BUFFER_SIZE); - memset(screen_buffer, 0,DEBUG_BUFFER_SIZE); -} - - -void debug_enable(void) -{ - VRAMLoad((word) debugFont_pic, 0x5000, 2048); - VRAMLoad((word) debugMap, 0x4000, 0x0800); - setTileMapLocation(0x4000, (byte) 0x00, (byte) 0); - setCharacterLocation(0x5000, (byte) 0); - *(byte *) 0x2100 = 0x0f; // enable background - - // Font Color - // hex(24 << 10 | 24 << 5 | 24 ) = '0x6318' - *(byte *) 0x2121 = 0x02; - *(byte *) 0x2122 = 0xff; - *(byte *) 0x2122 = 0x7f; - - // Font Border Color - *(byte *) 0x2121 = 0x00; - *(byte *) 0x2122 = 0x00; - *(byte *) 0x2122 = 0x00; - - // Background Color - *(byte *) 0x2121 = 0x01; - *(byte *) 0x2122 = 0x05; - *(byte *) 0x2122 = 0x29; - - -} - -void clears(void) -{ - word i, y; - for (y = 0; y < 20; y++) { - waitForVBlank(); - for (i = 0; i < 32; i++) { - *(byte *) 0x2115 = 0x80; - *(word *) 0x2116 = 0x4000 + i + (y * 0x20); - *(byte *) 0x2118 = 0; - } - } -} - -void _print_char(word y, word x, char c) -{ - waitForVBlank(); - VRAMByteWrite((byte) (c - 32), (word) (0x4000 + x + (y * 0x20))); -} - -void _print_screen(word y, char *buffer) -{ - char l; - unsigned int x; - x = y * 0x20; - l = strlen(buffer); - waitForVBlank(); - while (*buffer) { - if (*buffer == '\n') { - while (x++ < 32) { - *(byte *) 0x2115 = 0x80; - *(word *) 0x2116 = 0x4000 + x + (y * 0x20); - *(byte *) 0x2118 = 0; - } - x = 0; - y += 0x20; - buffer++; - waitForVBlank(); - continue; - } - *(byte *) 0x2115 = 0x80; - *(word *) 0x2116 = 0x4000 + x; - *(byte *) 0x2118 = *buffer - 32; - x++; - buffer++; -#if 1 - waitForVBlank(); -#endif - } -} -void _print_console(const char *buffer) -{ - while (*buffer) - *(byte *) 0x3000 = *buffer++; -} - - - - -void printfc(const char *fmt, ...) -{ - va_list ap; - va_start(ap, fmt); - vsprintf(debug_buffer, fmt, ap); - va_end(ap); - _print_console(debug_buffer); - //memset(debug_buffer,0,DEBUG_BUFFER_SIZE); - -} - -void printfs(word y, const char *fmt, ...) -{ - va_list ap; - va_start(ap, fmt); - vsprintf(screen_buffer, fmt, ap); - va_end(ap); - _print_screen(y, screen_buffer); - //memset(screen_buffer, 0, DEBUG_BUFFER_SIZE); -} - -void printc_packet(unsigned long addr, unsigned int len, byte * packet) -{ - unsigned int i, j; - unsigned int sum = 0; - unsigned int last_sum = 0; - unsigned int clear = 0; - - for (i = 0; i < len; i += 16) { - - sum = 0; - for (j = 0; j < 16; j++) { - sum += packet[i + j]; - } - if (!sum) { - clear = 1; - continue; - } - - if (last_sum == sum) { - clear = 1; - continue; - } - - if (clear) { - printfc("*\n"); - clear = 0; - } - printfc("%06lX:", addr + i); - for (j = 0; j < 16; j++) { - printfc(" %02x", packet[i + j]); - } - printfc(" |"); - for (j = 0; j < 16; j++) { - if (packet[i + j] >= 33 && packet[i + j] <= 126) - printfc("%c", packet[i + j]); - else - printfc("."); - } - printfc("|\n"); - last_sum = sum; - } -} -/* - * keep the linker happy - */ -int open(const char *_name, int _mode) -{ - _print_console("open called\n"); - return -1; -} - -int close(int fd) -{ - _print_console("close called\n"); - return -1; - -} - -size_t read(int fd, void *buff, size_t len) -{ - _print_console("read called\n"); - return 0; -} - -size_t write(int fd, void *buffer, size_t len) -{ - _print_console("write called\n"); - return 0; -} - -long lseek(int fd, long off, int count) -{ - _print_console("lseek called\n"); - return 0; -} - -int unlink(const char *name) -{ - _print_console("unlink called\n"); - return -1; -} - -int isatty() -{ - _print_console("isatty called\n"); - return 1; -} diff --git a/snes/loadertest/debug.h b/snes/loadertest/debug.h deleted file mode 100644 index 6f82af9..0000000 --- a/snes/loadertest/debug.h +++ /dev/null @@ -1,8 +0,0 @@ -#include "data.h" - -void debug_init(void); -void debug_enable(void); -void printfs(word y, const char *fmt, ...); -void printfc(const char *fmt, ...); -void clears(void); -void printc_packet(unsigned long addr, unsigned int len, byte * packet); diff --git a/snes/loadertest/event.c b/snes/loadertest/event.c deleted file mode 100644 index d3bc9ba..0000000 --- a/snes/loadertest/event.c +++ /dev/null @@ -1,106 +0,0 @@ -#include - -#include "data.h"; -#include "event.h"; - -event *events; - -void initEvents(void) -{ - events = NULL; -} - -event *createEvent(char (*callback) (word counter)) -{ - event *myEvent; - - myEvent = (event *) malloc(sizeof(event)); - - myEvent->VBlankCount = 0; - myEvent->callback = callback; - myEvent->nextEvent = NULL; - myEvent->previousEvent = NULL; - - - return myEvent; -} - -event *addEvent(char (*callback) (word counter), int noDuplicateCallback) -{ - - event *lastEvent; - event *myEvent; - - if (events == NULL) { - events = createEvent(callback); - return events; - } else { - lastEvent = events; - // TODO optimise this with noduplicate - while (lastEvent->nextEvent != NULL) { - if (noDuplicateCallback == 1 && lastEvent->callback == *callback) { - return NULL; - } - lastEvent = lastEvent->nextEvent; - } - if (noDuplicateCallback == 1 && lastEvent->callback == *callback) { - return NULL; - } - myEvent = createEvent(callback); - myEvent->previousEvent = lastEvent; - lastEvent->nextEvent = myEvent; - return myEvent; - } - - -} - -void removeEvent(event * eventElement) -{ - - byte alone = 0; - event *next, *previous; - - next = eventElement->nextEvent; - previous = eventElement->previousEvent; - - if (eventElement->nextEvent != NULL && eventElement->previousEvent != NULL) { - alone++; - next->previousEvent = previous; - previous->nextEvent = next; - - } else if (eventElement->nextEvent != NULL) { - alone++; - next->previousEvent = NULL; - events = next; - - } else if (eventElement->previousEvent != NULL) { - alone++; - previous->nextEvent = NULL; - } - - free(eventElement); - - if (alone == 0) { - events = NULL; - } -} - -void processEvents(void) -{ - - event *currentEvent; - char returnValue; - - currentEvent = events; - while (currentEvent != NULL) { - returnValue = currentEvent->callback(currentEvent->VBlankCount); - if (returnValue == EVENT_CONTINUE) { - currentEvent->VBlankCount++; - } else { - removeEvent(currentEvent); - } - currentEvent = currentEvent->nextEvent; - } - -} diff --git a/snes/loadertest/event.h b/snes/loadertest/event.h deleted file mode 100644 index 0f38195..0000000 --- a/snes/loadertest/event.h +++ /dev/null @@ -1,17 +0,0 @@ -typedef struct event { - word VBlankCount; - char (*callback) (word counter); - struct event *previousEvent; - struct event *nextEvent; -} event; - -#define EVENT_STOP 0 -#define EVENT_CONTINUE 1 - -extern event *events; - -void initEvents(void); -extern event *addEvent(char (*callback) (word counter), - int noDuplicateCallback); -extern void removeEvent(event * eventElement); -extern void processEvents(void); diff --git a/snes/loadertest/integer.h b/snes/loadertest/integer.h deleted file mode 100644 index 68843e0..0000000 --- a/snes/loadertest/integer.h +++ /dev/null @@ -1,48 +0,0 @@ -/*-------------------------------------------*/ -/* - * Integer type definitions for FatFs module - */ -/*-------------------------------------------*/ - -#ifndef _INTEGER - - -/* - * These types must be 16-bit, 32-bit or larger integer - */ -typedef int INT; -typedef unsigned int UINT; - -/* - * These types must be 8-bit integer - */ -typedef signed char CHAR; -typedef unsigned char UCHAR; -typedef unsigned char BYTE; - -/* - * These types must be 16-bit integer - */ -typedef short SHORT; -typedef unsigned short USHORT; -typedef unsigned short WORD; -typedef unsigned short WCHAR; - -/* - * These types must be 32-bit integer - */ -typedef long LONG; -typedef unsigned long ULONG; -typedef unsigned long DWORD; - -/* - * Boolean type - */ -// enum { false = 0 , true } bool; - -//typedef int BOOL; -#define FALSE 0 -#define TRUE 1 - -#define _INTEGER -#endif diff --git a/snes/loadertest/main.c b/snes/loadertest/main.c deleted file mode 100644 index 1d05be9..0000000 --- a/snes/loadertest/main.c +++ /dev/null @@ -1,93 +0,0 @@ - -#include -#include -#include - -#include "data.h"; -#include "pad.h"; -#include "event.h"; -#include "myEvents.h"; -#include "ressource.h"; -#include "PPU.h" -#include "debug.h" -#include "integer.h" - - - -typedef void (*FUNC) (void); - -padStatus pad1; - -void initInternalRegisters(void) -{ - characterLocation[0] = 0x0000; - characterLocation[1] = 0x0000; - characterLocation[2] = 0x0000; - characterLocation[3] = 0x0000; - debug_init(); -} - -void preInit(void) -{ - - // For testing purpose ... - // Insert code here to be executed before register init -} - -void halt(void) -{ - while (1); -} - -void wait(void) -{ - printfc("SNES::wait: press A to continue\n"); - enablePad(); - pad1 = readPad((byte) 0); - while (!pad1.A) { - waitForVBlank(); - pad1 = readPad((byte) 0); - } - printfc("SNES::wait: done\n"); -} - -void boot(DWORD addr) -{ - FUNC fn; - //printfc("SNES::boot addr=%lx\n", addr); - fn = (FUNC) addr; - fn(); - -} - -unsigned char i; -unsigned char j; - -void main(void) -{ - initInternalRegisters(); - *(byte *) 0x2105 = 0x01; // MODE 1 value - *(byte *) 0x212c = 0x01; // Plane 0 (bit one) enable register - *(byte *) 0x212d = 0x00; // All subPlane disable - *(byte *) 0x2100 = 0x0f; // enable background - - debug_enable(); - i=0; - j=0; - while (1) { - printfs(0,"IRQ COUNT %i", i); - printfs(1,"NMI COUNT %i", j++); - waitForVBlank(); - } -} - -void IRQHandler(void) -{ - i = i + 1; -} - -void NMIHandler(void) -{ - - // processEvents(); -} diff --git a/snes/loadertest/myEvents.c b/snes/loadertest/myEvents.c deleted file mode 100644 index 832c70d..0000000 --- a/snes/loadertest/myEvents.c +++ /dev/null @@ -1,103 +0,0 @@ -#include "data.h"; -#include "pad.h"; -#include "event.h"; - -extern padStatus pad1; -extern word scrollValue; - -char fadeOut(word counter) -{ - static byte fadeOutValue; - - if (counter == 0) { - // init fade value - fadeOutValue = 0x0f; - } else { - fadeOutValue--; - } - - *(byte *) 0x2100 = fadeOutValue; - - if (fadeOutValue == 0x00) { - return EVENT_STOP; - } else { - return EVENT_CONTINUE; - } -} - -char fadeIn(word counter) -{ - static byte fadeInValue; - - if (counter == 0) { - // init fade value - fadeInValue = 0x00; - } else { - fadeInValue++; - } - - *(byte *) 0x2100 = fadeInValue; - - if (fadeInValue >= 0x0f) { - return EVENT_STOP; - } else { - return EVENT_CONTINUE; - } -} - -char mosaicOut(word counter) -{ - static byte mosaicOutValue; - - if (counter == 0) { - // init fade value - mosaicOutValue = 0xff; - } else { - mosaicOutValue -= 0x10; - } - - *(byte *) 0x2106 = mosaicOutValue; - - if (mosaicOutValue == 0x0f) { - return EVENT_STOP; - } else { - return EVENT_CONTINUE; - } -} - -char mosaicIn(word counter) -{ - static byte mosaicInValue; - - if (counter == 0) { - // init fade value - mosaicInValue = 0x0f; - } else { - mosaicInValue += 0x10; - } - - *(byte *) 0x2106 = mosaicInValue; - - if (mosaicInValue == 0xff) { - return EVENT_STOP; - } else { - return EVENT_CONTINUE; - } -} - -char NMIReadPad(word counter) -{ - pad1 = readPad((byte) 0); - - return EVENT_CONTINUE; -} - -char scrollLeft(word counter) -{ - scrollValue++; - - *(byte *) 0x210d = (byte) scrollValue; - *(byte *) 0x210d = (byte) (scrollValue >> 8); - - return EVENT_CONTINUE; -} diff --git a/snes/loadertest/myEvents.h b/snes/loadertest/myEvents.h deleted file mode 100644 index 0f2412a..0000000 --- a/snes/loadertest/myEvents.h +++ /dev/null @@ -1,6 +0,0 @@ -char fadeOut(word counter); -char fadeIn(word counter); -char mosaicOut(word counter); -char mosaicIn(word counter); -char NMIReadPad(word counter); -char scrollLeft(word counter); diff --git a/snes/loadertest/pad.c b/snes/loadertest/pad.c deleted file mode 100644 index 9304eb1..0000000 --- a/snes/loadertest/pad.c +++ /dev/null @@ -1,26 +0,0 @@ -#include "data.h"; -#include "pad.h"; -#include "debug.h"; - -void enablePad(void) -{ - // Enable pad reading and NMI - *(byte *) 0x4200 = 0x01; -} - -void disablePad(void) -{ - // Enable pad reading and NMI - *(byte *) 0x4200 = 0x00; -} - -padStatus readPad(byte padNumber) -{ - word test; - padStatus *status; - padNumber = padNumber << 1; - test = (word) * (byte *) 0x4218 + padNumber << 8; - test |= (word) * (byte *) 0x4219 + padNumber; - status = (padStatus *) & test; - return *status; -} diff --git a/snes/loadertest/pad.h b/snes/loadertest/pad.h deleted file mode 100644 index 33fbde5..0000000 --- a/snes/loadertest/pad.h +++ /dev/null @@ -1,20 +0,0 @@ -typedef struct padStatus { - byte right:1; - byte left:1; - byte down:1; - byte up:1; - byte start:1; // Enter - byte select:1; // Space - byte Y:1; // X - byte B:1; // C - // -------------------------------- - byte Dummy:4; - byte R:1; // Z - byte L:1; // A - byte X:1; // S - byte A:1; // D -} padStatus; - -extern void enablePad(void); -extern void disablePad(void); -extern padStatus readPad(byte padNumber); diff --git a/snes/loadertest/ressource.asm b/snes/loadertest/ressource.asm deleted file mode 100644 index 9bb76ef..0000000 --- a/snes/loadertest/ressource.asm +++ /dev/null @@ -1,9 +0,0 @@ -ressource .section - - - XDEF _~debugFont_pic -_~debugFont_pic - INSERT ressource/debugFont.pic - - -.ends diff --git a/snes/loadertest/ressource.h b/snes/loadertest/ressource.h deleted file mode 100644 index 7f65ed4..0000000 --- a/snes/loadertest/ressource.h +++ /dev/null @@ -1,2 +0,0 @@ - -extern word debugFont_pic[]; diff --git a/snes/loadertest/ressource/debugFont.clr b/snes/loadertest/ressource/debugFont.clr deleted file mode 100644 index aad44283e99541114e6541c0de05a3287372b22e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 512 ncmZQzkY|u!nqIUuYJZe`banBJ`uh0)%zx_t*E5WQ5fB0Z+_wtD diff --git a/snes/loadertest/ressource/debugFont.pcx b/snes/loadertest/ressource/debugFont.pcx deleted file mode 100644 index 9a481e084bc507111f54174d01131fa9268d0117..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3154 zcmeH}Yi`^y41{F^MT??G$^8!?KawWfGqg9^&Nn1wyImB>?`C%`$$Sil6m9L-Pt%vC z&wcvbo~EaX^}9Y(o8RwrM7U4a@5}TyEp45)w)ooH^xU-CB;9p&U7JLU=3i4s%W}a= zzs0{;*NDE{U$x#7yyLJ7@tDHJAXijEKK@0-5%+rA6{?FRA))Z9?AomKG|bj$RuXNS zHFPbR7tJ==Syo_0KkTcH<(ic#V@j)6hK4LrX9ph3p*hIri!X4Sq&~JMN)37t`Lc@fl1J z^$RWTJ*uie(W&fS_lCs1z~x`OYNNBXf8SbRYc{Kk8>G8vMKCu9U0rWMSt-E+;`t$A z-+Kphh1rD!Uc(diAvhk7lXs>rs51l{j##lT#Y1F;WU^kVq^knZ$2YySA|D^DH;K+i zJ4Zb-a@=+Bo=#&LERNz_MaR*TOMBME8PCk02r&7@>79o?do6)A1Ndwg)@kOOVOFXE e$`Su8mYUo)-}K++-tPJwe{w!n9~Jm-D)1XJOx*kc diff --git a/snes/loadertest/ressource/debugFont.pic b/snes/loadertest/ressource/debugFont.pic deleted file mode 100644 index ea179dc0fc59ef93fe15239af9bb545c4bab84b1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2048 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 diff --git a/snes/xmsnes/InitSNES.asm b/snes/xmsnes/InitSNES.asm deleted file mode 100644 index d3a2f5a..0000000 --- a/snes/xmsnes/InitSNES.asm +++ /dev/null @@ -1,262 +0,0 @@ -;------------------------------------------------------------------------ -;- 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 diff --git a/snes/xmsnes/Makefile b/snes/xmsnes/Makefile deleted file mode 100644 index 613116b..0000000 --- a/snes/xmsnes/Makefile +++ /dev/null @@ -1,7 +0,0 @@ - - -all: - sh make.sh - -run: - zsnes xmsnes.smc diff --git a/snes/xmsnes/cheader.inc b/snes/xmsnes/cheader.inc deleted file mode 100644 index 89abfeb..0000000 --- a/snes/xmsnes/cheader.inc +++ /dev/null @@ -1,41 +0,0 @@ -;----------------------------------------------------------------------; -; Header File ; -; (Written By MarcTheMER) ; -; Email: marcthemer@hotmail.com ; -;======================================================================; -; I had written this simple yet useful header file to help SNES ; -; programmers with their assembly. This section of code modifies the ; -; SNES cartridge header so it is compatable for use on zsnes or snes9x ; -;======================================================================; -; If you use any of my header files to create an awesome game please ; -; email me as I am always trying to learn new programming skills. ; -;----------------------------------------------------------------------; - - -.SNESNATIVEVECTOR ; Defines inturupt vactor table - COP DoNothing - BRK DoNothing - ABORT DoNothing - NMI VBlank - IRQ DoNothing -.ENDNATIVEVECTOR - -.SNESEMUVECTOR ; Defines inturupt vactor table - COP DoNothing - ABORT DoNothing - NMI DoNothing ; I wouldn't recomend using emulation mode. - RESET Main - IRQBRK DoNothing -.ENDEMUVECTOR - - -.EMPTYFILL $00 ; fills the rom with $00 - -.BANK 0 SLOT 0 -.ORG 0 -.SECTION "EmptyVectors" SEMIFREE ; Set up interupt vector coding. - -DoNothing: - RTI - -.ENDS diff --git a/snes/xmsnes/graphics/bg.pcx b/snes/xmsnes/graphics/bg.pcx deleted file mode 100644 index 3d120bea116ead1fc6a08d593172837be3e46469..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12709 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 diff --git a/snes/xmsnes/graphics/bub.pcx b/snes/xmsnes/graphics/bub.pcx deleted file mode 100644 index 8d15e273d926d02e26ed65cd6a98c6bbd34c99ec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1920 zcmc(fL1-OC7{?Q-my*jgP2!^jN8Y|K5{*v)>NqfftlcJuj5&;OuP^?UE%f9mI+&DEp&ucuG` z-2C{-qqB==;tR9qXJ+Hzzx_OxC;uPHByUFYp;Y|%O(uBeli`UGDQbrDSDBm`)sVE>3b1Od(l}Q%@OQ%F< zXwo2Stn7-hS@0MpaK|P+99HJK-Gjn0Al}x-MQJPym>QW{F zaY}O=I(70$_gY=ab~;#tS-j2Bu)Nj77#zWlOK(yVw+|iE(iPq~agOX@<}^ncp$dXW zf*P{lzjj{4Jdqr-`8t=Vosc) zl~+jyymBej+a!kOjsCzz<2zsHrFQXT-|XLEGf|uOd`((h?2*0BTeToFj}%E=xJtFt zXM4eBD-|cLJ}mUj!VY#?b+6DDOPf{FBmI@2x8E)8pjBes>$eUiYAHmgRe?L^UzC&T za)LUYzM79p`va;*U?hDVRX*9r6X)9;KJ!Tp zoFZ)bWZVv2!vp3kpN!(j1J`|q4z1*j7y^dSQdXgF6vh<;H$-T>bO5LpifKbNVr0@H z;)03F^gvIDl360VCs-i?NU#JLq0riqq!d7orRugEF`iQeidb>SPpJ_eA7r2-Lr^%t zW2$_?8|DsGi%v9J0MUpdqGMu&2qi;??}04DjM#M?mMypJ02BT)(+C^e)1d#ZwIAs8L>eSh_Cyr7`b2x`+(ojc%zLrBH^ zDrGH%q%Q5cnz7Ss+&-W5E#Ek>(Oql7tQUGUI>?^;Ek}qOg_arfJ+;8#yw_I(*QhiW zfv#YdoGzGRQtN2lyaf6PM=%R)?~-PZ`TkntPy?*)5}`YFh>*kMw7Uo_zM-tdB@FuF zC8ayTe(TUPoF*|E+pjQ@8b=d1nYfTOz?NOXt%Ar$uuVm83Mrq+(cDQa|8Efg1`1r> A5&!@I diff --git a/snes/xmsnes/graphics/font.pcx b/snes/xmsnes/graphics/font.pcx deleted file mode 100644 index e2d2228adb12c922881d86828cc3793aadd5df0d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2678 zcmbW3O^#eO5XWt6kPxe9OWE6X0j`h>vB+wcxehmA@7LXvAQ%NHiXw>EvVbFu5Wjzw zUv~?!Vk|$~_2K&0mwUeXDnBIt-llK0q=)kG^7qSM<>m2B`Z}fGQhMd|x9Phd((iwy zkB{l``=8R6Khvw`jQl!f-~7MN#p<-#rnNDxwjXVrjMMmR&CWJzvAIp#MwuhqaG~8e z+2}hWJ6hv|ZIa!P?KWm@BhNCnRz`2TNw)09EwvT4&!|c~X>JMXwA=yEFCnNaG~v%G z8q&3#Z3ihgTdSB|vRsPUoM2CVuyD4{W`hP~Ak;ESgW@0zn((0aWYtlfaO>h8`dy_L ztK-Ro0ID5PNtX)~`@d9oziZ?NfLxJ$rsEBd(VmqXWgv8RTyaU@#F9daMr1d4qxZP zS-0u7$%!5~GcdE!#G>#C$iV%=j^tpca&^oD9wDmj(>RvRsMjL5FbfR^Yu zhYj^hM|5_ONvKblrwwcc?Chn$5Pr?#t%ZZ3JVla7F3PDyw^=t5S(wn5`b@aXlmt9B zZaZQB5D|;9^_gPlU-%ljW?jXJ1HqCmLA#^7?BxAGM(CAM_d=1zqMXw30_c!@A1iw= zfIS%jBGX64BkO2);vFoC0ISD7sL+x^;9DS1Fy;$o!<7lAg!`RKAKWk6m1OvifXJF7H5hww4uo6uHvj zj`Fi{@2vuaNWoK8YzRdY0WWSW$~>xSqE$Hj_|P?83Zx(K-u==Gx)eewe6R^6y~b`iFOK|hbAA?+q1TQStV^MVQdV+6ebWuY%E{reR#fEx z+X;Z&<{Y_`F9i_`1g* z91jDZgO2YJ8-Z0w^~3n?PH&G^FR)OX^hRc1`i-)5i@zi^v5J@N=)0G9Sj_q3=9$si-7X=3@5fT?0wE4TF$_* z;0(is*9_u9AbkvsDh!NZ26=?QDWLXaO2!PQl#Gukon}x*a6m$o@R&{mO@tXDe9GAH Gh!Oy3bTJeF diff --git a/snes/xmsnes/graphics/window2.pcx b/snes/xmsnes/graphics/window2.pcx deleted file mode 100644 index 8ccb5f9ef0daed12e26b2a3c50065ab02e63223c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 238 zcmd;LWn^Ih0(S;>1`i;Vk&{VDOPMooPEB2n1%tqI1_lX+ML_v_28HbmPo6V~mNPKy zIK#m3nn6Mcq>q77g@F;wAdfIO#lXyPOi+p8l%UcP!P5*v2o6Yy5+37epouU;j7}*j H9}xrqrnW3? diff --git a/snes/xmsnes/main.asm b/snes/xmsnes/main.asm deleted file mode 100644 index 974160d..0000000 --- a/snes/xmsnes/main.asm +++ /dev/null @@ -1,910 +0,0 @@ -; XMSNES EXAMPLE DEMO! - -.define nsongs 5 ; number of songs in package - -.include "memmap.inc" ; memory map stuff -.include "cheader.inc" ; snes rom header -.include "InitSNES.asm" ; snes initialization code - -.include "snes.inc" ; snes register definitions - -.BANK 1 - -.SECTION "GRAPHICS" ; include graphics (bank1) -.include "graphics\gfx_window.inc" -.include "graphics\gfx_font.inc" -.include "graphics\gfx_bg.inc" -.include "graphics\gfx_bg2.inc" -;.include "graphics\gfx_bub.inc" -.ENDS - -.BANK 2 SLOT 3 ; include songs/samples (bank2) -.SECTION "SPX_PACKAGE" -TEST_PACKAGE: -.incbin "test.xmp" -.ENDS - -.ramsection "globals" BANK 0 SLOT 1 -bg_ripple: db ; for bg effect -bg_rippleL: db - -scr_fade: db ; for fading screen -scr_flash: dsb 3 ; for flashing screen - -joypad: dw ; joypad state -joypadc: dw ; joypad 'clicks' -joypadl: dw ; last joypad state - -svar1: dw ; general purpose -svar2: dw - -current_song: dw - -music_vol: dw ; 8.8 fixed - -custom_string: dsb 32 - -effect1: db ; sound effect indexes -effect2: db -effect3: db -effect4: db - -inst_timer: dw - -.ends - -.BANK 0 - -.SECTION "MAIN" - -Main: - InitSNES ; initialize everything - REP #$10 ; 16bit index - SEP #$20 ; 8bit accu - - lda #$80 ; turn off screen - sta REG_INIDISP - - lda #%00001001 ; set display mode - sta REG_BGMODE ; mode 1 - - jsl LoadBG ; load background bg - jsl BuildWindow ; build the window thingy - jsl LoadFont ; load the font - jsl ClearAllText ; reset the text layer - - ;ldx #STR_SPCDATA ; draw "SPC Ports" - ;ldy #14*32+12 - jsl DrawText - - lda #%0110 ; blend the window with the background - sta REG_TM ; enable bg1/2 main screen - lda #%0000 ; enable bg0 subscreen - sta REG_TD ; - - lda #%01100011 ; add bg0+backdrop+bg1 and half the result - sta REG_CGADSUB - lda #%00000010 - sta REG_CGWSEL - - ;--------------------------------------------------------- - ; SETUP XMSNES - ;jsl BootSPC ; send code and initialize - ;jsl SPX_Transfer_LFT ; transfer frequency table (linear mode) - - ;ldx #TEST_PACKAGE ; load package - ;lda #:TEST_PACKAGE ; - ;jsl SPXP_InstallPackage ; - - ;ldx #0 ; load song 0 - ;jsl ChangeSong - - ; song is playing now... - ;--------------------------------------------------------- - - lda #%10100001 ; enable vblank irq, enable joypad - sta REG_NMITIMEN - - cli ; enable interrupts - wai - - lda #0 ; reset darkness - sta scr_fade ; - sta REG_INIDISP ; - - ldx #22000 ; set playback volume - stx music_vol ; - ;jsl SPXM_SetVol ; - -_mainloop: - - ;----------------------------------- - ; SCREEN FADE-IN - - lda scr_fade - cmp #255 - beq + - clc - adc #2 - bcc ++ - lda #255 -++ - sta scr_fade - lsr - lsr - lsr - lsr - sta REG_INIDISP -+ ;-------------------------------------- - - - jsl UpdateBG ; Update the background effect - ;jsl DrawSPCData ; Read SPC Ports and display them - - bit inst_timer+1 ; timer to hide instructions - bmi ++ ; - rep #$20 ; - lda inst_timer ; - dea ; - bpl + ; - ldy #(25*32) ; - ldx #32 ; - jsl ClearText ; -+ ; - sta inst_timer ; - sep #$20 ; -++ ; - - ;jsl SPX_Routine ; call this every frame, or every so often - - ;-------------------------------------- - ; slide music volume to full - - rep #$20 - lda music_vol - cmp #$FFFF - beq + - adc #44 - bcc ++ - lda #$FFFF -++ - sta music_vol - sep #$20 - xba -; jsl SPXM_SetVol -+ ;---------------------------------------- - - ;--------------------------------------- - ; if user presses left, decrease song#, load new song - - sep #$20 - lda joypadc+1 - and #1 - beq + - ldx current_song - inx - cpx #nsongs - bcc ++ - ldx #nsongs-1 -++ - jsl ChangeSong -+ ;------------------------------------------------- - ; if user presses right, increase song#, load new song - - lda joypadc+1 - and #%10 - beq + - ldx current_song - dex - bpl ++ - ldx #0 -++ - jsl ChangeSong -+ ;-------------------------------------------------- - - ;------------------------------------------------ - ; if user presses A, play effect1, full volume, freq:4 - - lda joypadc - and #%10000000 - beq + - ; A was pressed - lda #$04 ; freq/priority - xba - lda effect1 ; sample# - beq + - tax - lda #$77 ; volume - jsl SPXS_Play -+ ;----------------------------------------------- - ; if user presses B, play effect2, full volume, freq:4 - - lda joypadc+1 - and #%10000000 - beq + - ; B was pressed - lda #$04 ; freq/priority - xba - lda effect2 ; sample# - beq + - tax - lda #$77 ; volume - jsl SPXS_Play -+ ;----------------------------------------------- - ; if user presses X, play effect3, full volume, freq:4 - lda joypadc - and #%1000000 - beq + - ; X was pressed - lda #$04 ; freq/priority - xba - lda effect3 ; sample# - beq + - tax - lda #$77 ; volume - jsl SPXS_Play -+ ;----------------------------------------------- - ; if user presses Y, play effect4, full volume, freq:3 - - lda joypadc+1 - and #%1000000 - beq + - ; Y was pressed - lda #$03 ; freq/priority - xba - lda effect4 ; sample# - beq + - tax - lda #$77 ; volume - jsl SPXS_Play -+ ;------------------------------------------------ - - ldx #0 - stx joypadc - wai ; wait for vblank - jmp _mainloop ; loop - -;--------------------------------------------------------- -; this function gets called when the snes receives a song message from the spc -MessageReceived: - ; a = message - cmp #1 - bne + - jsl FlashScreen ; #1 = flash screen message -+ - rtl -;--------------------------------------------------------- - -FlashScreen: - lda #16 - sta scr_flash - rtl - -;--------------------------------------------------------- - -cs_jumptable: -.dw CS_WAR -.dw CS_ACID -.dw CS_JOURNEY -.dw CS_SATELLITE -.dw CS_RUSINA - -ChangeSong: - ; x = song - stx current_song ; save song# - - stz effect1 ; zero out sound effect indexes - stz effect2 - stz effect3 - stz effect4 - - jsl SPXM_Reset ; queue reset playback - jsl SPX_Flush ; flush - - rep #$20 ; get song*2 - lda current_song - asl - tax - sep #$20 - jmp (cs_jumptable,x) ; and jump - -CS_WAR: - ldx #STR_WAR_AUTHOR ; get author string - phx - ldx #STR_WAR_TITLE ; song title - jmp CS_BEGINDRAWING -CS_ACID: ; other songs - ldx #STR_ACID_AUTHOR ; etc - phx - ldx #STR_ACID_TITLE - jmp CS_BEGINDRAWING -CS_JOURNEY: - ldx #STR_JOURNEY_AUTHOR - phx - ldx #STR_JOURNEY_TITLE - jmp CS_BEGINDRAWING -CS_SATELLITE: - ldx #STR_SATELLITE_AUTHOR - phx - ldx #STR_SATELLITE_TITLE - jmp CS_BEGINDRAWING -CS_RUSINA: - ldx #STR_RUSINA_AUTHOR - phx - ldx #STR_RUSINA_TITLE - jmp CS_BEGINDRAWING -CS_BEGINDRAWING: - - phx ;preserve - - ldy #(8*32) ; clear text - ldx #32 - jsl ClearText - - ldy #(10*32) - ldx #32 - jsl ClearText - - plx ;restore - - ldy #16+(8*32) ; draw title - jsl DrawCentered - plx - ldy #16+(10*32) ; draw author - jsl DrawCentered - - ldx current_song ; get song# - jsl SPXP_LoadSong ; transfer song - - ldx current_song ; check if song is 4 (has sound effects) - cpx #4 ; - bne + - - ; load some sfx - - ldx #0 ; hh.wav - ldy #0 - jsl SPXP_LoadSample - sta effect1 - ldx #1 ; ow.wav - ldy #0 - jsl SPXP_LoadSample - sta effect2 - ldx #2 ; sd.wav - ldy #0 - jsl SPXP_LoadSample - sta effect3 - ldx #3 ; OWWW.wav - ldy #0 - jsl SPXP_LoadSample - sta effect4 - - ; be sure not to load too much stuff - ldy #(25*32) - ldx #32 - jsl ClearText - ldx #STR_INST1 ; tell the user to push buttons - ldy #(25*32)+16 - jsl DrawCentered - bra ++ -+ - ldy #(25*32) - ldx #32 - jsl ClearText - ldx #STR_INST2 ; tell the user to push buttons - ldy #(25*32)+16 - jsl DrawCentered -++ - - ldx #300 - stx inst_timer - - jsl SPXM_Play ; start playing song - rtl ; return - -;------------------------------------------------------------------------------- -; TEXT RENDERING STUFF - -DrawText: - ; x = source - ; y = offset - stz REG_VMAIN ; setup vram increment stuff - rep #$20 ; set destination address - tya ; - ora #($9000/2) ; - sta REG_VMADDL ; - tay ; - sec ; - sep #$20 ; -_dt_loop: - lda $0000, x ; - beq _dt_exit ; exit when 0 - inx ; increment counter - sbc #32 ; viewable ascii characters start at 32 - bpl + ; check for newline - tya ; newline - adc #32 ; edit vram address - sta REG_VMADDL ; - tay ; - sec ; - bra _dt_loop ; loop -+ - sta REG_VMDATAL ; store value - bra _dt_loop ; loop -_dt_exit: - rtl ; end - -ClearText: - ; x = length - ; y = offset - - stz REG_VMAIN ; setup vram pointer - rep #$20 ; - tya ; - ora #($9000/2) ; - sta REG_VMADDL ; - sep #$20 - lda #$00 ; start clearing memory - -_ct_loop: - sta REG_VMDATAL ; store... - dex ; count... - bne _ct_loop ; loop... -_ct_exit: - sep #$20 ; restore 8-bit accu - rtl ; end - -ClearAllText: - lda #%10000000 ; setup vram pointer - sta REG_VMAIN ; - ldx #($9000/2) - stx REG_VMADDL - - ldx #$100|(0<<10)|(1<<13) ; $100 = blank tile - ldy #1024 ; 1024 = 32*32 tiles -- - stx REG_VMDATAL ; store value - dey ; count.. - bne - ; loop - rtl ; end - -DrawCentered: - ; x = string address - ; y = line - sty svar2 - stx svar1 - jsl strlen - rep #$20 - txa - sec - sbc svar1 - lsr - clc - eor #$FFFF - inc a - adc svar2 - tay - ldx svar1 - sep #$20 - jmp DrawText - -DrawSPCData: - lda #0 - xba - - ldx #0 - stx svar1 -- - lda REG_APUI00, x - inx - stx svar2 - pha - lsr - lsr - lsr - lsr - clc - tay - lda HEX2ASCII, y - ldx svar1 - sta custom_string,x - inx - pla - and #$0F - tay - lda HEX2ASCII, y - sta custom_string,x - inx - lda #32 - sta custom_string,x - inx - stx svar1 - ldx svar2 - cpx #4 - bne - - ldy #11+(16*32) - ldx #custom_string - jsl DrawText - rtl - -;--------------------------------------------------------------------------------------------------------------------------------------------------------------------- -; INITIALIZATION / EFFECTS - -LoadBub: - lda #%10000000 - sta REG_VMAIN - ldx #$ - -BuildWindow: - lda #%10000000 ; setup vram pointer - sta REG_VMAIN - ldx #$7C00/2 - stx REG_VMADDL - ldx #0 - REP #$20 -- - lda.l gfx_window, x ; load graphics - sta REG_VMDATAL - inx - inx - cpx #$120 - bne - - SEP #$20 - LDA #-1 ; setup bg attributes - sta REG_BG0VOFS - stz REG_BG0VOFS - - - lda #($11<<2) - sta REG_BG0SC - - ldy #($8800)/2 - sty REG_VMADDL - - ldx #464 - ldy #1024 -- stx REG_VMDATAL - dey - bne - - - ldy #($8980)/2 - sty REG_VMADDL - ldx #1000|(2<<10) - ldy #32 -- stx REG_VMDATAL - dey - bne - - ldx #1000|(2<<10) - ldy #32*11 -- stx REG_VMDATAL - dey - bne - - ldx #1000|(2<<10) - ldy #32 -- stx REG_VMDATAL - dey - bne - - - lda #32 ; load palette - sta REG_CGADD - ldx #gfxp_window - ldy #32 - lda #(REG_CGDATA&255) - xba - lda #:gfxp_window - jsl DMA_TRANSFER - rtl - -LoadFont: - lda #%10000000 ; setup vram pointer - sta REG_VMAIN - ldy #($7000/2) - sty REG_VMADDL - ldx #0 - rep #$20 - -- - lda.l gfx_font, x ; load byte - sta REG_VMDATAL ; store - inx ; count - inx - cpx #$600 ; transfer $600*2 bytes - bne - - sep #$20 ; setup palette - lda #0 - sta REG_CGADD - sta REG_CGDATA - sta REG_CGDATA - lda #$FF ; white - sta REG_CGDATA - lda #$7F - sta REG_CGDATA - lda #%00000000 ; black - sta REG_CGDATA - sta REG_CGDATA - - lda #-1 ; setup bg - sta REG_BG2VOFS - stz REG_BG2VOFS - lda #($12<<2) ; source = $9000 - sta REG_BG2SC - - lda #$03 ; set character offset - sta REG_BG23NBA - - rtl - -LoadBG: - lda #%10000000 - sta REG_VMAIN - ldx #0 - stx REG_VMADDL - - ldx #$1000 - ; transfer data - REP #$20 - -- - lda.l gfx_bg-$1000, x - sta REG_VMDATAL - inx - inx - bpl - - - - ldx #0 - stx REG_VMADDL -- lda.l gfx_bg2, x - sta REG_VMDATAL - inx - inx - cpx #96 - bne - - - sep #$20 - - lda #-1 - sta REG_BG1VOFS - stz REG_BG1VOFS - - lda #($10<<2) - sta REG_BG1SC - ; setup bg - ldy #$8000/2 - sty REG_VMADDL - - ldy #(1<<10) -- - sty REG_VMDATAL - iny - cpy #896|(1<<10) - bne - - - ldy #$8000/2 - sty REG_VMADDL - ldy #32*5 - ldx #2|(3<<10) -- - stx REG_VMDATAL - dey - bne - - - ldy #32 - ldx #1|(3<<10) -- stx REG_VMDATAL - dey - bne - - - ldy #$84C0/2 - sty REG_VMADDL - ldy #32 - ldx #0|(3<<10) -- stx REG_VMDATAL - dey - bne - - - ldy #32*8 - ldx #2|(3<<10) -- - stx REG_VMDATAL - dey - bne - - - lda #48 - sta REG_CGADD - - ldx #gfxp_bg2 - ldy #32 - lda #(REG_CGDATA & 255) - xba - lda #:gfxp_bg2 - jsl DMA_TRANSFER - - rtl - -BG_PALETTE: -;.dw 0,0,1024,1024,2048,2048,2081,3105,3105,4129,4129,4129,5153,5153,6177,6210,6210,6210,6177,5153,5153,4129,4129,4129,3105,3105,2081,2048,2048,1024,1024,0,0,0,1024,1024,2048,2048,2081,3105,3105,4129,4129,4129,5153,5153,6177,6210, -;.dw 6276,6276,7300,7300,8324,8324,8357,9381,9381,10405,10405,10405,11429,11429,12453,12486,12486,12486,12453,11429,11429,10405,10405,10405,9381,9381,8357,8324,8324,7300,7300,6276,6276,6276,7300,7300,8324,8324,8357,9381,9381,10405,10405,10405,11429,11429,12453,12486, -.dw 4162,5186,5186,6243,6243,7267,8291,8291,9348,9348,10372,11396,11396,12453,12453,13477,14501,13477,12453,12453,11396,11396,10372,9348,9348,8291,8291,7267,6243,6243,5186,5186,4162,5186,5186,6243,6243,7267,8291,8291,9348,9348,10372,11396,11396,12453,12453,13477, -;.dw 2116,2117,2117,3174,3174,3175,3176,3176,4233,4233,4234,4235,4235,5292,5292,5293,5294,5293,5292,5292,4235,4235,4234,4233,4233,3176,3176,3175,3174,3174,2117,2117,2116,2117,2117,3174,3174,3175,3176,3176,4233,4233,4234,4235,4235,5292,5292,5293, ;red -UpdateBG: - - clc - lda bg_rippleL - adc #99 - sta bg_rippleL - bcs + - rtl -+ - - lda bg_ripple - inc a - rep #$20 - and #31 - sta bg_ripple - asl - tay - sep #$20 - - lda #0 - sta REG_CGADD - ldx #16 - - - lda scr_flash - rep #$20 - and #31 - asl - asl - asl - asl - asl - ora scr_flash - asl - asl - asl - asl - asl - ora scr_flash - sta scr_flash+1 - sep #$20 - - cmp #0 - beq + - dec scr_flash - dec scr_flash - dec scr_flash - dec scr_flash -+ - clc - lda BG_PALETTE, y - adc scr_flash+1 - sta REG_CGDATA - lda BG_PALETTE+1, y - adc scr_flash+2 - sta REG_CGDATA - lda #16 - sta REG_CGADD - -- - lda BG_PALETTE, y - adc scr_flash+1 - sta REG_CGDATA - - lda BG_PALETTE+1, y - adc scr_flash+2 - sta REG_CGDATA - iny - iny - dex - bne - - - rtl - -;----------------------------------------------------------------------------------------------------------------------------------------------------------------- -; DMA - -DMA_TRANSFER: - ; x = src - ; y = length - ; a = bank# - ; b = dest - stz REG_DMAP0 ; set mode - stx REG_A1T0L ; set source - sta REG_A1B0 ; set bank# - xba ; - sta REG_BBAD0 ; set dest - sty REG_DAS0L ; set #bytes - lda #1 ; start transfer - sta REG_MDMAEN - rtl ; end - -;---------------------------------------------------------------------------------------------------------------------------------------------------------- -; INTERRUPTS -.index 16 -.accu 8 - -VBlank: - sei - rep #$20 - pha ; preserve a - - lda joypad ; update last joypad state - sta joypadl ; - - sep #$20 - lda #1 -- - bit $4212 ; check if joypad is ready - bne - ; wait... - rep #$20 - lda REG_JOY1L ; load joystate - sta joypad ; save to memory - eor joypadl ; mask with old state - and joypad ; mask some more.. - sta joypadc ; store button 'clicks' - - sep #$20 - lda REG_TIMEUP ; do something - rep #$20 - pla ; restore a - rti ; exit - -;-------------------------------------------------------------------------------------- -; misc - -strlen: - ; x = str address - ; returns x = str address + length -- - lda $0000, x - beq + - inx - bra - -+ - rtl - -;------------------------------------------------------------------------------------- -; STRINGS -STR_HELP: -.DB "Press left/right to", 1 -.db "change songs",0 - -STR_SPCDATA: -.db "SPC Ports",0 - -HEX2ASCII: -.db 48,49,50,51,52,53,54,55,56,57,65,66,67,68,69,70 - -STR_WAR_TITLE: -.db "War in Middle Earth", 0 -STR_WAR_AUTHOR: -.db "by Skaven", 0 - -STR_ACID_TITLE: -.db "Acidjazzed Evening", 0 -STR_ACID_AUTHOR: -.db "by Tempest", 0 - -STR_JOURNEY_TITLE: -.db "Your Journey Awaits", 0 -STR_JOURNEY_AUTHOR: -.db "by AlexG", 0 - -STR_SATELLITE_TITLE: -.db "Satellite One",0 -STR_SATELLITE_AUTHOR: -.db "by Purple Motion",0 - -STR_RUSINA_TITLE: -.db "Rusinahumppa",0 -STR_RUSINA_AUTHOR: -.db "by Croaker",0 - -STR_INST1: -.db "Press A/B/X/Y for SFX",0 - -STR_INST2 -.db "Change songs with left/right",0 - -.ENDS diff --git a/snes/xmsnes/main.link b/snes/xmsnes/main.link deleted file mode 100644 index deb9ed1..0000000 --- a/snes/xmsnes/main.link +++ /dev/null @@ -1,3 +0,0 @@ -[objects] -main.obj -spx_snes.obj diff --git a/snes/xmsnes/make.sh b/snes/xmsnes/make.sh deleted file mode 100644 index 34d9614..0000000 --- a/snes/xmsnes/make.sh +++ /dev/null @@ -1,5 +0,0 @@ -rm *.obj -rm *.smc -wla-65816 -ov main.asm main.obj -wla-65816 -ov spx_snes.asm spx_snes.obj -wlalink -rvS main.link xmsnes.smc diff --git a/snes/xmsnes/memmap.inc b/snes/xmsnes/memmap.inc deleted file mode 100644 index 403ace6..0000000 --- a/snes/xmsnes/memmap.inc +++ /dev/null @@ -1,42 +0,0 @@ -.MEMORYMAP - SLOTSIZE $8000 - DEFAULTSLOT 0 - SLOT 0 $8000 - SLOT 1 $0000 - SLOT 2 $2000 - SLOTSIZE $40000 - SLOT 3 $8000 -.ENDME - -.ROMBANKMAP -BANKSTOTAL 3 -BANKSIZE $8000 -BANKS 2 -BANKSIZE $40000 -BANKS 1 -.ENDRO - -.SMC - - -.SNESHEADER - - ID "SNES" - - NAME "XMSNES " ; Title (can't be over 21 bytes) - ; "123456789012345678901" (just a guide) - - SLOWROM ; Slow ROM - LOROM ; LO ROM - - - -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 $02 ; $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 diff --git a/snes/xmsnes/snes.inc b/snes/xmsnes/snes.inc deleted file mode 100644 index c79c780..0000000 --- a/snes/xmsnes/snes.inc +++ /dev/null @@ -1,179 +0,0 @@ -;-----------; -; SNES.ASM \ -;---------------------------; -; SNES Register Definitions ; -; by eKid ; -;---------------------------+--; -; Information taken from- ; -; QWERTIE'S SNES DOCUMENTATION ; -; AND ; -; YOSHI'S DOCUMENTS ; -;------------------------------; - -.EQU REG_INIDISP $2100 ; Screen Display Register 1B/W -.EQU REG_OBSEL $2101 ; OAM Size Control 1B/W -.EQU REG_OAMADDL $2102 ; OAM Access Address 2B/W -.EQU REG_OAMADDH $2103 -.EQU REG_OAMDATA $2104 ; OAM Data Write 1B/W -.EQU REG_BGMODE $2105 ; Screen Mode Register 1B/W -.EQU REG_MOSAIC $2106 ; Screen Pixelation Register 1B/W -.EQU REG_BG0SC $2107 ; BG0 VRAM Location Register 1B/W -.EQU REG_BG1SC $2108 ; BG1 VRAM Location Register 1B/W -.EQU REG_BG2SC $2109 ; BG2 VRAM Location Register 1B/W -.EQU REG_BG3SC $210A ; BG3 VRAM Location Register 1B/W -.EQU REG_BG01NBA $210B ; BG0/1 Character Bases 1B/W -.EQU REG_BG23NBA $210C ; BG2/3 Character Bases 1B/W -.EQU REG_BG0HOFS $210D ; BG0 Vertical Scroll 1B/W D -.EQU REG_BG0VOFS $210E ; BG0 Vertical Scroll 1B/W D -.EQU REG_BG1HOFS $210F ; BG1 Horizontal Scroll 1B/W D -.EQU REG_BG1VOFS $2110 ; BG1 Vertical Scroll 1B/W D -.EQU REG_BG2HOFS $2111 ; BG2 Horizontal Scroll 1B/W D -.EQU REG_BG2VOFS $2112 ; BG2 Vertical Scroll 1B/W D -.EQU REG_BG3HOFS $2113 ; BG3 Horiztonal Scroll 1B/W D -.EQU REG_BG3VOFS $2114 ; BG3 Vertical Scroll 1B/W D -.EQU REG_VMAIN $2115 ; Video Port Control 1B/W -.EQU REG_VMADDL $2116 ; Video Port Address 2B/W -.EQU REG_VMADDH $2117 -.EQU REG_VMDATAL $2118 ; Video Port Data 2B/W -.EQU REG_VMDATAH $2119 -.EQU REG_M7SEL $211A ; MODE7 settings register 1B/W -.EQU REG_M7A $211B ; MODE7 COSINE A 1B/W -.EQU REG_M7B $211C ; MODE7 SINE A 1B/W -.EQU REG_M7C $211D ; MODE7 SINE B 1B/W -.EQU REG_M7D $211E ; MODE7 COSINE B 1B/W -.EQU REG_M7X $211F ; MODE7 Center Pos X 1B/W D -.EQU REG_M7Y $2120 ; MODE7 Center Pos Y 1B/W D -.EQU REG_CGADD $2121 ; CGRAM Address 1B/W -.EQU REG_CGDATA $2122 ; CGRAM Data Write 1B/W D -.EQU REG_W01SEL $2123 ; Window Mask Settings Reg1 1B/W -.EQU REG_W23SEL $2124 ; Window Mask Settings Reg2 1B/W -.EQU REG_WH0 $2126 ; Window 1 Left Posision Reg 1B/W -.EQU REG_WH1 $2127 ; Window 1 Right Position Reg 1B/W -.EQU REG_WH2 $2128 ; Window 2 Left Position Reg 1B/W -.EQU REG_WH3 $2129 ; Window 2 Right Position Reg 1B/W -.EQU REG_WBGLOG $212A ; Mask Logic for Window 1 & 2 1B/W -.EQU REG_WOBJLOG $212B ; Mask Logic for Color&OBJ Windows 1B/W -.EQU REG_TM $212C ; Main Screen Designation 1B/W -.EQU REG_TD $212D ; Sub-Screen Designation 1B/W -.EQU REG_TMW $212E ; WinMask Main Designation Reg 1B/W -.EQU REG_TSW $212F ; WinMask Sub Designation Reg 1B/W -.EQU REG_CGWSEL $2130 ; Fixed Color/Screen Addition Reg 1B/W -.EQU REG_CGADSUB $2131 ; +/- For Screens/BGs/OBJs 1B/W -.EQU REG_COLDATA $2132 ; Fixed Color Data for +/- 1B/W -.EQU REG_SETINI $2133 ; Screen Mode Select Reg 1B/W -.EQU REG_MPYL $2134 ; Multiplication Result Low 1B/R -.EQU REG_MPYM $2135 ; Middle 1B/R -.EQU REG_MPYH $2136 ; High 1B/R -.EQU REG_SLHV $2137 ; Sofware Latch For H/V Counter 1B/R -.EQU REG_OAMDATAREAD $2138 ; OAM Data Read 1B/R -.EQU REG_VMDATALREAD $2139 ; VRAM Data Read High 1B/R -.EQU REG_VMDATAHREAD $213A ; VRAM Data Read Low 1B/R -.EQU REG_CGDATAREAD $213B ; CGRAM Data Read 1B/R -.EQU REG_OPHCT $213C ; X Scanline Location 1B/R D -.EQU REG_OPVCT $213D ; Y Scanline Location 1B/R D -.EQU REG_STAT77 $213E ; PPU Status Flag & Version 1B/R -.EQU REG_STAT78 $213F ; PPU Status Flag & Version 1B/R -.EQU REG_APUI00 $2140 ; Sound Register 1B/RW -.EQU REG_APUI01 $2141 ; Sound Register 1B/RW -.EQU REG_APUI02 $2142 ; Sound Register 1B/RW -.EQU REG_APUI03 $2143 ; Sound Register 1B/RW -.EQU REG_WMDATA $2180 ; WRAM Data Read/Write 1B/RW -.EQU REG_WMADDL $2181 ; WRAM Address (Low) 1B/RW -.EQU REG_WMADDM $2182 ; WRAM Address (Middle) 1B/RW -.EQU REG_WMADDH $2183 ; WRAM Address (High) 1B/RW -.EQU REG_NMITIMEN $4200 ; Counter Enable 1B/W -.EQU REG_WRIO $4201 ; Programmable I/O Port 1B/W -.EQU REG_WRMPYA $4202 ; Multiplicand 1B/W -.EQU REG_WRMPYB $4203 ; Multiplier 1B/W -.EQU REG_WRDIVL $4204 ; Dividend 2B/W ??? -.EQU REG_WRDIVH $4205 ; ??? -.EQU REG_WRDIVB $4206 ; Divisor ??? -.EQU REG_HTIMEL $4207 ; Video X IRQ Beam Pointer 2B/W -.EQU REG_HTIMEH $4208 -.EQU REG_VTIMEL $4209 ; Video Y IRQ Beam Pointer 2B/W -.EQU REG_VTIMEH $420A -.EQU REG_MDMAEN $420B ; DMA Enable Register 1B/W -.EQU REG_MHDMAEN $420C ; HDMA Enable Register 1B/W -.EQU REG_MEMSEL $420D ; Cycle Speed Register 1B/W -.EQU REG_RDNMI $4210 ; NMI Register 1B/R -.EQU REG_TIMEUP $4211 ; Video IRQ Register 1B/RW -.EQU REG_HVBJOY $4212 ; Status Register 1B/RW -.EQU REG_RDIO $4213 ; Programmable I/O Port 1B/RW -.EQU REG_RDDIVL $4214 ; Quotient Of Divide Result 2B/R -.EQU REG_RDDIVH $4215 -.EQU REG_RDMPYL $4216 ; Multiplication Or Divide Result 2B/R -.EQU REG_RDMPYH $4217 -.EQU REG_JOY1L $4218 ; Joypad #1 Status 2B/R -.EQU REG_JOY1H $4219 -.EQU REG_JOY2L $421A ; Joypad #2 Status 2B/R -.EQU REG_JOY2H $421B -.EQU REG_JOY3L $421C ; Joypad #3 Status 2B/R -.EQU REG_JOY3H $421D -.EQU REG_JOY4L $421E ; Joypad #4 Status 2B/R -.EQU REG_JOY4H $421F - -.EQU REG_DMAP0 $4300 ; DMA Control Register 1B/W -.EQU REG_BBAD0 $4301 ; DMA Destination Register 1B/W -.EQU REG_A1T0L $4302 ; DMA Source Address 2B/W -.EQU REG_A1T0H $4303 -.EQU REG_A1B0 $4304 ; Source Bank Address 1B/W -.EQU REG_DAS0L $4305 ; DMA Transfer size/HDMA Address 2B/W -.EQU REG_DAS0H $4306 -.EQU REG_NTRL0 $430A ; Number Of Lines For HDMA 1B/W -.EQU REG_DMAP1 $4310 ; DMA 1 -.EQU REG_BBAD1 $4311 -.EQU REG_A1T1L $4312 -.EQU REG_A1T1H $4313 -.EQU REG_A1B1 $4314 -.EQU REG_DAS1L $4315 -.EQU REG_DAS1H $4316 -.EQU REG_NTRL1 $431A -.EQU REG_DMAP2 $4310 ; DMA 2 -.EQU REG_BBAD2 $4311 -.EQU REG_A1T2L $4312 -.EQU REG_A1T2H $4313 -.EQU REG_A1B2 $4314 -.EQU REG_DAS2L $4315 -.EQU REG_DAS2H $4316 -.EQU REG_NTRL2 $431A -.EQU REG_DMAP3 $4310 ; DMA 3 -.EQU REG_BBAD3 $4311 -.EQU REG_A1T3L $4312 -.EQU REG_A1T3H $4313 -.EQU REG_A1B3 $4314 -.EQU REG_DAS3L $4315 -.EQU REG_DAS3H $4316 -.EQU REG_NTRL3 $431A -.EQU REG_DMAP4 $4310 ; DMA 4 -.EQU REG_BBAD4 $4311 -.EQU REG_A1T4L $4312 -.EQU REG_A1T4H $4313 -.EQU REG_A1B4 $4314 -.EQU REG_DAS4L $4315 -.EQU REG_DAS4H $4316 -.EQU REG_NTRL4 $431A -.EQU REG_DMAP5 $4310 ; DMA 5 -.EQU REG_BBAD5 $4311 -.EQU REG_A1T5L $4312 -.EQU REG_A1T5H $4313 -.EQU REG_A1B5 $4314 -.EQU REG_DAS5L $4315 -.EQU REG_DAS5H $4316 -.EQU REG_NTRL5 $431A -.EQU REG_DMAP6 $4310 ; DMA 6 -.EQU REG_BBAD6 $4311 -.EQU REG_A1T6L $4312 -.EQU REG_A1T6H $4313 -.EQU REG_A1B6 $4314 -.EQU REG_DAS6L $4315 -.EQU REG_DAS6H $4316 -.EQU REG_NTRL6 $431A -.EQU REG_DMAP7 $4310 ; DMA 7 -.EQU REG_BBAD7 $4311 -.EQU REG_A1T7L $4312 -.EQU REG_A1T7H $4313 -.EQU REG_A1B7 $4314 -.EQU REG_DAS7L $4315 -.EQU REG_DAS7H $4316 -.EQU REG_NTRL7 $431A -.EQU REG_FBNANACNT $FEED ; Banana Register... 1B/RW diff --git a/snes/xmsnes/spx_snes.asm b/snes/xmsnes/spx_snes.asm deleted file mode 100644 index 3c81789..0000000 --- a/snes/xmsnes/spx_snes.asm +++ /dev/null @@ -1,701 +0,0 @@ -;------------------------------------------------------------------------------------------------------------------------ -; Copyright (c) 2007, Mukunda Johnson -; -; All rights reserved. -; -; Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: -; -; * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. -; * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -; * Neither the name of the nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. -; -; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -; "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -; LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -; A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR -; CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -; EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -; PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -; LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -; NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -;----------------------------------------------------------------------------------- - -.equ REG_APUI00 $2140 -.equ REG_APUI01 $2141 -.equ REG_APUI02 $2142 -.equ REG_APUI03 $2143 - -.include "memmap.inc" ; replace with your memory definitions - -.MACRO SPX_RECEIVE_MESSAGE - sta spx_message - and #15 - jsl MessageReceived ; SET THIS TO YOUR MESSAGE HANDLER -.ENDM - -.define SPX_STACK_SIZE $10 ; increase stack size if neccesary - -.define SPX_XMSOFFSET $2100 - -.MACRO SPX_SYNC - lda spx_validation ; load validation -- cmp REG_APUI03 ; sync - bne - -.ENDM - -.ramsection "spx_var" BANK 0 SLOT 1 -spx_spvar: db -spx_validation: db -spx_package_adr: dsb 3 - -spx_stack: dsb SPX_STACK_SIZE*4 ; FIFO stack -spx_stack_r: dw ; stack read position -spx_stack_w: dw ; stack write position - -spx_var1: dw -spx_var2: dw -spx_var3: dw -spx_var4: dw - -spx_message: db - -ddd: db - -.ends - -.bank 0 -.SECTION "SPX_SNES" - -spx_binary: -.incbin "spx_binaries\spx_core.bin" -spx_lft: -.incbin "spx_binaries\spx_lft.bin" -spx_aft: -.incbin "spx_binaries\spx_aft.bin" -spx_aftf: -.incbin "spx_binaries\spx_aftf.bin" - -.INDEX 16 - -;---------------------------------------------------------------------------------------------------- -BootSPC: - ldx #spx_binary - lda #:spx_binary - - ; x = source address (word) 16-BIT INDEX - ; a = bank (byte) 8-BIT AKKU - - sei ; disable interrupts during upload - - stx spx_var1 ; store source address in var1 - sta spx_var1+2 ; store bank - - REP #$20 ; 16-bit akku - lda #$BBAA ; Check if SPC is ready -- cmp REG_APUI00 ; - bne - ; - - SEP #$20 ; 8-bit akku - ldy #0 ; reset data counter - lda #0 ; reset port0 data (for protocol) - xba ; swap out - - ; load first block - lda #$01 ; port1 = NOT 0 - sta REG_APUI01 ; - - REP #$20 ; 16-bit akku - lda [spx_var1], y ; load data transfer address - iny ; increase data pointer - iny ; - sta REG_APUI02 ; ports2/3 = TRANSFER ADDRESS - - SEP #$20 ; 8-bit akku - lda #$CC ; port0 = $CC (protocol) - sta REG_APUI00 ; - -- cmp REG_APUI00 ; wait for SPC reply - bne - ; - - REP #$20 ; 16-bit akku - lda [spx_var1], y ; load data LENGTH - tax ; transfer to X - SEP #$20 ; 8-bit akku - iny ; increase data pointer - iny ; - lda [spx_var1], y ; load first byte (real data) - iny ; increase pointer - sta REG_APUI01 ; port1 = data - - lda #0 ; port0 = 0 (start sending data) - sta REG_APUI00 ; - -- cmp REG_APUI00 ; wait for SPC reply - bne - ; - - dex ; prepare loop - xba ; swap counter/data - -scr_data_loop: - lda [spx_var1], y ; load byte - iny ; inc pointer - xba ; swap to counter - -- cmp REG_APUI00 ; check/wait for SPC reply - bne - ; - - ina ; increase counter - REP #$20 ; port1 = data - sta REG_APUI00 ; port0 = counter - SEP #$20 ; - - xba ; swap to data - - dex ; decrease loop counter - bne scr_data_loop ; loop - - xba ; swap to counter - -- cmp REG_APUI00 ; check/wait for SPC reply - bne - ; - - xba ; swap to data - - REP #$20 ; 16-bit akku - pha ; preserve - lda [spx_var1], y ; load next block size - tax ; transfer to X - pla ; restore - SEP #$20 ; 8-bit akku - - iny ; increase data pointer - iny ; - cpx #0 ; load another block? (if block size is 0, then no) - beq scr_terminate ; ... - - REP #$20 ; yes.. - pha ; preserve - lda [spx_var1], y ; load something - tax ; transfer to X - pla ; restore - SEP #$20 ; 8-bit akku - - iny ; increase pointer - iny ; - lda #1 ; port1 = NOT 0 - sta REG_APUI01 ; - stx REG_APUI02 ; port2/3 = transfer address - xba ; swap to counter - ina ; counter += 2, != 0 -- ina ; - beq - ; - - sta REG_APUI00 ; store in port0 - -- cmp REG_APUI00 ; wait for SPC reply - bne - ; - bra scr_data_loop ; jump to data loop - -scr_terminate: ; no... - stz REG_APUI01 ; port1 = 0 - REP #$20 ; 16-bit akku - pha ; preserve - lda [spx_var1], y ; load program start address - tax ; transfer to X - pla ; restore - SEP #$20 ; 8-bit akku - - stx REG_APUI02 ; port2/3 = program start address - xba ; swap to counter - ina ; counter += 2, != 0 -- ina ; - beq - ; - - sta REG_APUI00 ; port0 = counter -- cmp REG_APUI00 ; wait for SPC reply - bne - ; - ; TRANSFER COMPLETE. - cli ; enable interrupts - - jmp SPX_Init ; Initialize -;----------------------------------------------------------------------------------------------------- -SPX_Init: - lda #0 ; reset validation - sta spx_validation - sta spx_stack_w ; reset stack read/write - sta spx_stack_r - - REP #$20 - lda #$FEED ; initial sync -- cmp REG_APUI00 ; - bne - - SEP #$20 - RTL - -;----------------------------------------------------------------------------------------------------- -SPX_Transfer_XMS: - ; ayy = 24-bit address - sty spx_var1 ; save address - sta spx_var2 - rep #$20 ; 16bit everything - rep #$10 - lda [spx_var1] ; load length - tax ; x = length/3 - ldy #SPX_XMSOFFSET - lda spx_var1 - pha - sep #$20 - lda spx_var2 - jsl SPX_Transfer - - ply - rtl -;----------------------------------------------------------------------------------------------------- -.accu 8 -SPX_Transfer_LFT: - sep #$20 ; 8-bit akku - rep #$10 ; 16-bit index - ldx #(768/3) ; set transfer length (bytes/3) - ldy #(spx_lft & 65535) ; load snes offset - phy ; push - ldy #$300 ; $300-$5FF = linear frequency LUT - lda #:spx_lft ; get bank# - - JSL SPX_Transfer ; transfer data - - ply ; free stack - - lda.b #$1C ; set table - sta REG_APUI02 ; - stz REG_APUI01 ; - JSL SPX_SEND ; - - RTL ; return - -;----------------------------------------------------------------------------------------------------- -SPX_Transfer_AFT: - sep #$20 ; 8-bit akku - rep #$10 ; 16-bit index - ldx #(768/3) ; set transfer length (bytes/3) - ldy #(spx_aft & 65535) ; load snes offset - phy ; push - ldy #$300 ; $300-$5FF = amiga period LUT - lda #:spx_aft ; get bank# - JSL SPX_Transfer ; transfer data - ply ; free stack - - ldx #1365 ; 4096/3, rounded down - ldy #(spx_aftf & 65535) ; load snes offset - phy ; push - ldy #$F000 ; $F000-$FFFF = amiga->freq LUT - lda #:spx_aftf ; get bank# - JSL SPX_Transfer ; transfer data - ply ; free stack - lda #$1C ; set table - sta REG_APUI02 ; - lda #$01 ; - sta REG_APUI01 ; - JSL SPX_SEND ; - RTL ; return - -;----------------------------------------------------------------------------------------------------- -.INDEX 16 -.ACCU 8 - -.MACRO SPX_TRANSFER_INCPOINTER - iny ; increase pointer - iny ; - bpl ++ ; check for overflow - cpy #$8001 ; check for an overflow reading - bne + ; fix data if so - dey ; - dey ; - lda [spx_var1], y ; read low byte - sta REG_APUI00 ; store - ldy #$0000 ; read high byte - inc spx_var1+2 ; next bank - lda [spx_var1], y ; - sta REG_APUI01 ; - iny ; - lda spx_validation ; - xba ; - bra ++ ; -+ ; if not just increase bank# - inc spx_var1+2 ; increase bank# - ldy #$0000 ; reset counter -++ -.ENDM - -SPX_Transfer_SAMP: - sei ; $14 = SAMPLE TRANSFER - sta spx_var1+2 ; - SPX_SYNC ; - lda #$14 ; - jmp SPX_TRANSFER_MOD; - -SPX_Transfer: - ; SPX_Transfer - ; parameters: - ; a = file bank :8 - ; x = length/4 :16 - ; y = spc offset :16 - ; stack:1 = snes_offset :16 - - ; types - ; 0 = xms - ; 1 = freq table - - sei ; disable interrupts - - sta spx_var1+2 ; store bank# - - SPX_SYNC ; sync with spc - - lda #$1A ; $1A = GENERIC TRANSFER -SPX_TRANSFER_MOD: - sta REG_APUI02 ; set message type - - REP #$20 ; set spc write position - tya ; - SEP #$20 ; - sta REG_APUI00 ; - xba ; - sta REG_APUI01 ; - - lda spx_validation ; validate data - eor #128 ; - ora #1 - sta REG_APUI03 ; -- cmp REG_APUI03 ; wait for spc to respond - bne - - -; eor #128 ; prepare transfer mode - - sta spx_validation ; save - - REP #$20 ; 16-bit akku - lda 4, S ; load file offset sp+4 - - sec ; set carry - sbc #$8000 ; subtract - tay ; transfer to y - SEP #$20 ; 8-bit akku - lda #$80 ; set offset in var1 - stz spx_var1 ; reset mem pointers - sta spx_var1+1 ; - - REP #$20 ; 16-bit akku - -_stf_start: ; loop: - - lda [spx_var1], y ; load data - sta spx_var3 ; save - - SPX_TRANSFER_INCPOINTER - - sep #$20 - lda [spx_var1], y ; get third byte - - iny ; increase pointer - bpl + - ldy #$0000 - inc spx_var1+2 -+ - sta spx_spvar ; store - lda spx_validation ; get validation - eor #128 ; - sta spx_validation ; update - eor #128 ; reverse - - phx ; preserve - ldx spx_spvar ; get ready - -- cmp REG_APUI03 ; sync with spc - bne - ; - - lda spx_var3 ; load byte1 - sta REG_APUI00 ; store byte1 - lda spx_var3+1 ; load byte2 - sta REG_APUI01 ; store byte2 - stx REG_APUI02 ; store byte3/validation - plx ; restore - rep #$20 - - dex ; decrease counter - bne _stf_start ; loop until finished - - sep #$20 - - stz REG_APUI03 ; send 0 - stz spx_validation - lda #0 -- cmp REG_APUI03 ; wait for reply - bne - - - cli ; enable interrupts - RTL ; return --make sure higher function frees stack space - -;-------------------------------------------------------------------------------------------------------- -.index 16 -SPX_Queue: - ; a = $00/$01 message - ; x = $02/$03 params - ; accumulator can be 8 or 16 bit, do not read anything with it - ldy spx_stack_w ; load stack position - sta spx_stack, y ; store bytes0/1 - iny ; increase pointer - iny - txa ; get high word - sta spx_stack, y ; store bytes 2/3 - iny ; increase pointer - iny - cpy #SPX_STACK_SIZE*4 ; wrap to stack size - bcc + - ldy #0 -+ - sty spx_stack_w ; save stack position - rtl - -;--------------------------------------------------------------------------------------------------------- -.accu 8 -SPX_Routine: - ; get messages - lda REG_APUI00 ; check if port0 is different - cmp spx_message - beq + - SPX_RECEIVE_MESSAGE ; if so then a message was received -+ - lda spx_validation ; check if spc has processed last message - cmp REG_APUI03 - beq + - rtl ; not ready -+ - ldy spx_stack_r ; load stack read position - cpy spx_stack_w ; exit function if it equals write position (no messages) - bne + - rtl -+ - lda spx_stack, y ; load byte0 - sta REG_APUI00 ; store - iny - lda spx_stack, y ; load byte1 - sta REG_APUI01 ; store - iny - lda spx_stack, y ; load byte2 - sta REG_APUI02 ; store - iny - lda spx_stack, y ; load byte3 - lda spx_validation ; add validation - and #128 - eor #128 - ora spx_stack, y ; store - sta REG_APUI03 ; message dispatched - sta spx_validation ; save validation - - iny - - cpy #SPX_STACK_SIZE*4 ; wrap read counter to stack size - bcc + - ldy #0 -+ - sty spx_stack_r ; save - - rtl - -SPX_Flush: ; flushes queue - jsl SPX_Routine ; call routine - ldy spx_stack_r ; check for more messages - cpy spx_stack_w - bne SPX_Flush ; loop - rtl ; exit - -SPXM_Play: - ldx #$1E ; $1E = play message - jmp SPX_Queue - -SPXM_BuildDir: - ldx #$1B ; $1B = build directory - jmp SPX_Queue - -SPXM_Reset: ; blocking function - ldx #$1D ; $1D = RESET XMS - jmp SPX_Queue - -SPXM_SetVol: - ; a = volume - ldx #$18 ; $18 = set XM playback volume - jmp SPX_Queue - -SPX_SetVol: - ; a = volume L } 16bit akku - ; b = volume R } resets afterwards - ldx #$19 ; $19 = change main volume - jmp SPX_Queue - -.accu 8 -.index 16 -SPXS_Play: - ; a = volume [llllrrrr] - ; x = sample#/priority/frequency [0ccfffffssssssss] - - pha ; rearrange data - rep #$20 - txa - sep #$20 - pha - rep #$20 - and #$FF00 - ora #$20 ; $20 = play sample - tax - sep #$20 - pla - xba - pla - rep #$20 - - jsl SPX_Queue - sep #$20 - rtl - -SPXS_SetParam: - ; a = index - ; x = param - xba ; rearrange data - tax - xba - rep #$20 - ldx #$21 ; $21 = message - jsl SPX_Queue ; queue - sep #$20 - rtl - -SPX_SEND: ; blocking send - lda spx_validation ; get validation - eor #128 ; change - sta REG_APUI03 ; set port data - sta spx_validation ; save validation -- cmp REG_APUI03 ; wait for spc reply - bne - - - RTL ; exit - -SPXP_InstallPackage: - ; x = address (16-bit) ; - ; a = bank# - stx spx_package_adr ; store offset - sta spx_package_adr+2 ; store bank - rtl - -SPXP_LoadSong: - ; x = index (16-bit) - - sep #$20 ; 8bit akku - txa ; a=x - sta $4202 ; multiply a*3 - lda #3 ; - sta $4203 ; 8 cycles... ; ... - - ; setup send - rep #$20 ; read package address - - lda #$10 - nop - nop - nop ; small delay - clc - adc $4216 ; add multiplication result - tay ; y=result - - lda spx_package_adr ; read package address - adc [spx_package_adr], y ; add song offset - ora #$8000 ; - pha ; save result - sep #$20 ; 8bit akku - lda spx_package_adr+2 ; load bank# - iny - iny - adc [spx_package_adr], y ; add song offset - ply ; restore address - - jsl SPX_Transfer_XMS ; transfer song - - ; transfer samples - - SPX_SYNC - - lda #$17 ; ask for sample requests - sta REG_APUI02 - jsl SPX_SEND --- - - ; message received - lda REG_APUI02 ; satisfy request - cmp #$9C ; 9c = no more samples - beq + - ldx REG_APUI00 - ldy #0 - jsl SPXP_LoadSample ; send sample - - jsl SPX_SEND ; sync - - jmp -- -+ - rtl - -SPXP_LoadSample: - ; x = index (16-bit) - ; y = spc address, 0=use next available - - rep #$20 ; 16-bit akku - txa ; a=x - sta spx_var1 ; save - asl ; shift - adc spx_var1 ; add (a = index*3 now) - phy - ldy #4 - adc [spx_package_adr],y ; add sample table offset - - tay - clc - lda spx_package_adr - adc [spx_package_adr], y - ora #$8000 ; wrap around ROM area if overflow - sta spx_var1 - - sep #$20 - lda spx_package_adr+2 - iny - iny - adc [spx_package_adr], y - adc #0 ; increase on overflow - sta spx_var2 - - rep #$20 - - lda [spx_var1] ; load sample size/3 - tax ; transfer to x - - lda spx_var1 ; load snes address - - ply - pha - sep #$20 ; 8-bit akku - lda spx_var2 ; load bank# - - jsl SPX_Transfer_SAMP ; transfer data - ply ; restore stack - - lda spx_validation ; get sample # - eor #128 - sta REG_APUI03 -- cmp REG_APUI03 - bne - - sta spx_validation - - lda REG_APUI00 - - rtl ; return - -.ENDS diff --git a/snes/xmsnes/test.xmp b/snes/xmsnes/test.xmp deleted file mode 100644 index f473d32084a2ab7e823e046d69e0ab2894bec7cc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 180290 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

}88KzbXTU`%%USk>c;BFb7 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 G%>Myh@T%Vc diff --git a/snes/xmsnes/vram.txt b/snes/xmsnes/vram.txt deleted file mode 100644 index e175e9c..0000000 --- a/snes/xmsnes/vram.txt +++ /dev/null @@ -1,12 +0,0 @@ -graphic source locations - -$0000-$7000 / $0000-$0380 : gfx_bg -$7000-$7600 / $0380-$03E0 : gfx_font - -$7C00-$7D20 : $03E0-$03E9 : gfx_window - -tile map locations - -$8000-$8800 : $10 : background (bg1) -$8800-$8C00 : $11 : window (bg0) -$9000-$9C00 : $12 : text (bg2) \ No newline at end of file