add regdump

This commit is contained in:
David Voswinkel 2009-07-05 10:44:00 +02:00
parent 0a62ac52be
commit 9d707f612a
26 changed files with 1311 additions and 0 deletions

71
snes/regdump/Makefile Normal file
View File

@ -0,0 +1,71 @@
# SDK Config
PLATFORM=mac
ifeq ($(PLATFORM),linux)
# Linux Wine
SDK=/home/david/.wine/drive_c/65xx_FreeSDK
WINE=wine
EMU=zsnes
EMU_DEBUG=/home/david/Devel/arch/snes/tools/zsnes_linux_debug151/src/zsnesd -d
else
# Mac Wine
SDK=/Users/david/.wine/drive_c/65xx_FreeSDK
WINE=wine
EMU=zsnes
endif
CC=$(WINE) $(SDK)/bin/WDC816CC.exe
AS=$(WINE) $(SDK)/bin/WDC816AS.exe
LD=$(WINE) $(SDK)/bin/WDCLN.exe
PADBIN=$(WINE) tools/padbin.exe
PCX2SNES=$(WINE) tools/Pcx2Snes.exe
# Project
INC=$(SDK)/include
LIBS=$(SDK)/lib/cc
#OBJS=StartupSnes.obj main.obj pad.obj event.obj myEvents.obj PPU.obj debug.obj ressource.obj
OBJS=StartupSnes.obj main.obj pad.obj PPU.obj debug.obj ressource.obj
APP=regdump.smc
GFX=kungfu debugfont
all: $(APP) check
run:
$(EMU) $(APP)
debugger:
$(EMU_DEBUG) $(APP)
check:
ucon64 -chk $(APP)
debugfont:
$(PCX2SNES) ressource/debugFont -n -c16 -s8 -o1
StartupSnes.obj: StartupSnes.asm
$(AS) -V $?
ressource.obj: ressource.asm
$(AS) -V $?
%.obj: %.c
$(CC) -wl -wp -sop -MC -I $(INC) $?
$(APP): $(OBJS)
$(LD) -HB -M21 -V -T -Pff \
-C008000,0000 -U0000,0000 \
-Avectors=FFE4,7FE4 \
-Aregistration_data=FFB0,7FB0 \
-Aressource=38000,8000 \
-N $(OBJS) -L$(LIBS) -O $@
$(PADBIN) 0x20000 $(APP)
clean:
rm -vf $(APP) *.obj

80
snes/regdump/PPU.c Normal file
View File

@ -0,0 +1,80 @@
#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;
}

11
snes/regdump/PPU.h Normal file
View File

@ -0,0 +1,11 @@
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);

View File

@ -0,0 +1,240 @@
; 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 $0B
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

8
snes/regdump/data.h Normal file
View File

@ -0,0 +1,8 @@
#ifndef _DATA
typedef unsigned char byte;
typedef unsigned short word;
#define _DATA
#endif

227
snes/regdump/debug.c Normal file
View File

@ -0,0 +1,227 @@
#include <string.h>
#include <stdarg.h>
#include <stdio.h>
#include <fcntl.h>
#include "debug.h"
#include "data.h"
#include "pad.h"
#include "PPU.h"
#include "ressource.h"
#define DEBUG_BUFFER_SIZE 256
word debug_map[0x400];
char debug_buffer[DEBUG_BUFFER_SIZE];
//char screen_buffer[DEBUG_BUFFER_SIZE];
void debug_init(void)
{
memset(debug_map, 0, 0x800);
memset(debug_buffer, 0,DEBUG_BUFFER_SIZE);
#if 0
memset(screen_buffer, 0, DEBUG_BUFFER_SIZE);
printfc("screen_buffer=%p\n",screen_buffer);
printfc("debug_buffer=%p\n",debug_buffer);
printfc("debug_map=%p\n",debug_map);
#endif
}
void debug_enable(void)
{
VRAMLoad((word) debugFont_pic, 0x5000, 2048);
VRAMLoad((word) debug_map, 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;
}
y ++;
x = y * 0x20;
buffer++;
waitForVBlank();
continue;
}
*(byte *) 0x2115 = 0x80;
*(word *) 0x2116 = 0x4000 + x;
*(byte *) 0x2118 = *buffer - 32;
x++;
buffer++;
#if 0
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(debug_buffer, fmt, ap);
va_end(ap);
_print_screen(y, debug_buffer);
//memset(debug_buffer, 0, DEBUG_BUFFER_SIZE);
//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 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 (clear) {
printfc("*\n");
clear = 0;
}
printfc("%06lX:", addr + i);
for (j = 0; j < 16; j++) {
printfc(" %x", 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");
}
}
/*
* 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;
}

8
snes/regdump/debug.h Normal file
View File

@ -0,0 +1,8 @@
#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);

294
snes/regdump/event.asm Normal file
View File

@ -0,0 +1,294 @@
;:ts=8
R0 equ 1
R1 equ 5
R2 equ 9
R3 equ 13
code
xdef __initEvents
func
__initEvents:
longa on
longi on
stz |__events
rts
L2 equ 0
L3 equ 1
ends
efunc
code
xdef __createEvent
func
__createEvent:
longa on
longi on
tsc
sec
sbc #L5
tcs
phd
tcd
callback_0 set 3
myEvent_1 set 0
pea #<$8
jsr __malloc
sta <L6+myEvent_1
lda #$0
sta (<L6+myEvent_1)
lda <L5+callback_0
ldy #$2
sta (<L6+myEvent_1),Y
lda #$0
ldy #$6
sta (<L6+myEvent_1),Y
dey
dey
sta (<L6+myEvent_1),Y
lda <L6+myEvent_1
tay
lda <L5+1
sta <L5+1+2
pld
tsc
clc
adc #L5+2
tcs
tya
rts
L5 equ 2
L6 equ 1
ends
efunc
code
xdef __addEvent
func
__addEvent:
longa on
longi on
tsc
sec
sbc #L8
tcs
phd
tcd
callback_0 set 3
noDuplicateCallback_0 set 5
lastEvent_1 set 0
myEvent_1 set 2
lda |__events
bne L10001
pei <L8+callback_0
jsr __createEvent
sta |__events
L11:
tay
lda <L8+1
sta <L8+1+4
pld
tsc
clc
adc #L8+4
tcs
tya
rts
L10001:
lda |__events
bra L20000
L20004:
ldy #$2
lda (<L9+lastEvent_1),Y
cmp <L8+callback_0
bne L10005
L20005:
lda #$0
bra L11
L20002:
lda <L8+noDuplicateCallback_0
cmp #<$1
bne L10004
ldy #$2
lda (<L9+lastEvent_1),Y
cmp <L8+callback_0
beq L20005
L10004:
ldy #$6
lda (<L9+lastEvent_1),Y
L20000:
sta <L9+lastEvent_1
ldy #$6
lda (<L9+lastEvent_1),Y
bne L20002
lda <L8+noDuplicateCallback_0
cmp #<$1
beq L20004
L10005:
pei <L8+callback_0
jsr __createEvent
sta <L9+myEvent_1
lda <L9+lastEvent_1
ldy #$4
sta (<L9+myEvent_1),Y
lda <L9+myEvent_1
iny
iny
sta (<L9+lastEvent_1),Y
lda <L9+myEvent_1
bra L11
L8 equ 4
L9 equ 1
ends
efunc
code
xdef __removeEvent
func
__removeEvent:
longa on
longi on
tsc
sec
sbc #L17
tcs
phd
tcd
eventElement_0 set 3
alone_1 set 0
next_1 set 1
previous_1 set 3
sep #$20
longa off
stz <L18+alone_1
rep #$20
longa on
ldy #$6
lda (<L17+eventElement_0),Y
sta <L18+next_1
dey
dey
lda (<L17+eventElement_0),Y
sta <L18+previous_1
iny
iny
lda (<L17+eventElement_0),Y
beq L10006
dey
dey
lda (<L17+eventElement_0),Y
beq L10006
sep #$20
longa off
inc <L18+alone_1
rep #$20
longa on
lda <L18+previous_1
sta (<L18+next_1),Y
lda <L18+next_1
bra L20007
L10006:
ldy #$6
lda (<L17+eventElement_0),Y
beq L10008
sep #$20
longa off
inc <L18+alone_1
rep #$20
longa on
lda #$0
dey
dey
sta (<L18+next_1),Y
lda <L18+next_1
sta |__events
bra L10007
L10008:
ldy #$4
lda (<L17+eventElement_0),Y
beq L10007
sep #$20
longa off
inc <L18+alone_1
rep #$20
longa on
lda #$0
L20007:
ldy #$6
sta (<L18+previous_1),Y
L10007:
pei <L17+eventElement_0
jsr __free
lda <L18+alone_1
and #$ff
bne L24
stz |__events
L24:
lda <L17+1
sta <L17+1+2
pld
tsc
clc
adc #L17+2
tcs
rts
L17 equ 5
L18 equ 1
ends
efunc
code
xdef __processEvents
func
__processEvents:
longa on
longi on
tsc
sec
sbc #L25
tcs
phd
tcd
currentEvent_1 set 0
returnValue_1 set 2
lda |__events
L20008:
sta <L26+currentEvent_1
lda <L26+currentEvent_1
bne L20010
pld
tsc
clc
adc #L25
tcs
rts
L20010:
lda (<L26+currentEvent_1)
pha
ldy #$2
lda (<L26+currentEvent_1),Y
xref __~cal
jsr __~cal
sep #$20
longa off
sta <L26+returnValue_1
cmp #<$1
rep #$20
longa on
bne L10014
lda (<L26+currentEvent_1)
ina
sta (<L26+currentEvent_1)
bra L10015
L10014:
pei <L26+currentEvent_1
jsr __removeEvent
L10015:
ldy #$6
lda (<L26+currentEvent_1),Y
bra L20008
L25 equ 3
L26 equ 1
ends
efunc
xref __malloc
xref __free
udata
xdef __events
__events
ds 2
ends

101
snes/regdump/event.c Normal file
View File

@ -0,0 +1,101 @@
#include <stdlib.h>
#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;
}
}

16
snes/regdump/event.h Normal file
View File

@ -0,0 +1,16 @@
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);

22
snes/regdump/inject.py Normal file
View File

@ -0,0 +1,22 @@
import os
import sys
def main():
bank_size = 2 ** 15
rom = open(sys.argv[1],"r").read()
out = open(sys.argv[1].replace(".smc",".inject"),"r+")
out.write(rom)
out.seek(0x2140)
for i in range(0,128):
out.write(chr(i))
out.close()
if __name__ == '__main__':
main()

68
snes/regdump/main.c Normal file
View File

@ -0,0 +1,68 @@
#include "data.h";
#include "pad.h";
#include "event.h";
#include "myEvents.h";
#include "ressource.h";
#include "PPU.h"
#include "debug.h"
#include <stdlib.h>
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 main(void) {
word x,y;
padStatus pad1;
unsigned long addr;
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();
addr = 0x21400;
x = 0;
y = 0;
for (addr = 0x2100 ; addr < 0x21C0; addr+=8){
waitForVBlank();
printfs(y,"%lX: %02X %02X %02X %02X %02X %02X %02X %02X",addr,
*(byte *) addr,*(byte *) (addr +1),*(byte *) (addr+2),*(byte *) (addr+3),
*(byte *) (addr+4),*(byte *) (addr +5),*(byte *) (addr+6),*(byte *) (addr+7));
y++;
}
while(1){
while(!pad1.start) {
waitForVBlank();
pad1 = readPad((byte) 0);
}
}
while(1);
}
void IRQHandler(void) {
}
void NMIHandler(void) {
//processEvents();
}

97
snes/regdump/myEvents.c Normal file
View File

@ -0,0 +1,97 @@
#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;
}

6
snes/regdump/myEvents.h Normal file
View File

@ -0,0 +1,6 @@
char fadeOut(word counter);
char fadeIn(word counter);
char mosaicOut(word counter);
char mosaicIn(word counter);
char NMIReadPad(word counter);
char scrollLeft(word counter);

17
snes/regdump/pad.c Normal file
View File

@ -0,0 +1,17 @@
#include "data.h";
#include "pad.h";
void enablePad(void) {
// Enable pad reading and NMI
*(byte*)0x4200 = 0x81;
}
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;
}

19
snes/regdump/pad.h Normal file
View File

@ -0,0 +1,19 @@
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 padStatus readPad(byte padNumber);

View File

@ -0,0 +1,23 @@
ressource .section
; XDEF __title_map
;__title_map:
; INSERT ressource/kungfu.map
;
; XDEF __title_pic
;__title_pic:
; INSERT ressource/kungfu.pic
;
; XDEF __title_pal
;__title_pal:
;make INSERT ressource/kungfu.clr
XDEF _~debugFont_pic
_~debugFont_pic
INSERT ressource/debugFont.pic
XDEF _~debugFont_pal
_~debugFont_pal
INSERT ressource/debugFont.clr
.ends

3
snes/regdump/ressource.h Normal file
View File

@ -0,0 +1,3 @@
extern word debugFont_pic[];
extern word debugFont_pal[];

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.