diff options
-rw-r--r-- | Makefile | 131 | ||||
-rw-r--r-- | Makefile.gc | 131 | ||||
-rw-r--r-- | Makefile.wii | 131 | ||||
-rw-r--r-- | README.md | 6 | ||||
-rw-r--r-- | build.bat | 10 | ||||
-rw-r--r-- | gba/Makefile | 168 | ||||
-rw-r--r-- | gba/source/main.c | 94 | ||||
-rw-r--r-- | source/main.c | 400 |
8 files changed, 1070 insertions, 1 deletions
diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..f7dcdae --- /dev/null +++ b/Makefile | |||
@@ -0,0 +1,131 @@ | |||
1 | #--------------------------------------------------------------------------------- | ||
2 | # Clear the implicit built in rules | ||
3 | #--------------------------------------------------------------------------------- | ||
4 | .SUFFIXES: | ||
5 | #--------------------------------------------------------------------------------- | ||
6 | ifeq ($(strip $(DEVKITPPC)),) | ||
7 | $(error "Please set DEVKITPPC in your environment. export DEVKITPPC=<path to>devkitPPC") | ||
8 | endif | ||
9 | |||
10 | include $(DEVKITPPC)/wii_rules | ||
11 | |||
12 | #--------------------------------------------------------------------------------- | ||
13 | # TARGET is the name of the output | ||
14 | # BUILD is the directory where object files & intermediate files will be placed | ||
15 | # SOURCES is a list of directories containing source code | ||
16 | # INCLUDES is a list of directories containing extra header files | ||
17 | #--------------------------------------------------------------------------------- | ||
18 | TARGET := boot | ||
19 | BUILD := build | ||
20 | SOURCES := source | ||
21 | DATA := data | ||
22 | INCLUDES := source | ||
23 | |||
24 | #--------------------------------------------------------------------------------- | ||
25 | # options for code generation | ||
26 | #--------------------------------------------------------------------------------- | ||
27 | |||
28 | CFLAGS = -g -O2 -Wall $(MACHDEP) $(INCLUDE) | ||
29 | CXXFLAGS = $(CFLAGS) | ||
30 | |||
31 | LDFLAGS = -g $(MACHDEP) -Wl,-Map,$(notdir $@).map | ||
32 | |||
33 | #--------------------------------------------------------------------------------- | ||
34 | # any extra libraries we wish to link with the project | ||
35 | #--------------------------------------------------------------------------------- | ||
36 | LIBS := -lfat -logc | ||
37 | |||
38 | |||
39 | #--------------------------------------------------------------------------------- | ||
40 | # list of directories containing libraries, this must be the top level containing | ||
41 | # include and lib | ||
42 | #--------------------------------------------------------------------------------- | ||
43 | LIBDIRS := $(DEVKITPPC)/lib $(CURDIR) | ||
44 | |||
45 | #--------------------------------------------------------------------------------- | ||
46 | # no real need to edit anything past this point unless you need to add additional | ||
47 | # rules for different file extensions | ||
48 | #--------------------------------------------------------------------------------- | ||
49 | ifneq ($(BUILD),$(notdir $(CURDIR))) | ||
50 | #--------------------------------------------------------------------------------- | ||
51 | |||
52 | export OUTPUT := $(CURDIR)/$(TARGET) | ||
53 | |||
54 | export VPATH := $(foreach dir,$(SOURCES),$(CURDIR)/$(dir)) \ | ||
55 | $(foreach dir,$(DATA),$(CURDIR)/$(dir)) | ||
56 | |||
57 | export DEPSDIR := $(CURDIR)/$(BUILD) | ||
58 | |||
59 | #--------------------------------------------------------------------------------- | ||
60 | # automatically build a list of object files for our project | ||
61 | #--------------------------------------------------------------------------------- | ||
62 | CFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.c))) | ||
63 | CPPFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.cpp))) | ||
64 | sFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.s))) | ||
65 | SFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.S))) | ||
66 | BINFILES := $(foreach dir,$(DATA),$(notdir $(wildcard $(dir)/*.*))) | ||
67 | |||
68 | #--------------------------------------------------------------------------------- | ||
69 | # use CXX for linking C++ projects, CC for standard C | ||
70 | #--------------------------------------------------------------------------------- | ||
71 | ifeq ($(strip $(CPPFILES)),) | ||
72 | export LD := $(CC) | ||
73 | else | ||
74 | export LD := $(CXX) | ||
75 | endif | ||
76 | |||
77 | export OFILES := $(addsuffix .o,$(BINFILES)) \ | ||
78 | $(CPPFILES:.cpp=.o) $(CFILES:.c=.o) \ | ||
79 | $(sFILES:.s=.o) $(SFILES:.S=.o) | ||
80 | |||
81 | #--------------------------------------------------------------------------------- | ||
82 | # build a list of include paths | ||
83 | #--------------------------------------------------------------------------------- | ||
84 | export INCLUDE := $(foreach dir,$(INCLUDES),-I$(CURDIR)/$(dir)) \ | ||
85 | $(foreach dir,$(LIBDIRS),-I$(dir)/include) \ | ||
86 | -I$(CURDIR)/$(BUILD) \ | ||
87 | -I$(LIBOGC_INC) | ||
88 | |||
89 | #--------------------------------------------------------------------------------- | ||
90 | # build a list of library paths | ||
91 | #--------------------------------------------------------------------------------- | ||
92 | export LIBPATHS := $(foreach dir,$(LIBDIRS),-L$(dir)/lib) \ | ||
93 | -L$(LIBOGC_LIB) | ||
94 | |||
95 | export OUTPUT := $(CURDIR)/$(TARGET) | ||
96 | .PHONY: $(BUILD) clean | ||
97 | |||
98 | #--------------------------------------------------------------------------------- | ||
99 | $(BUILD): | ||
100 | @[ -d $@ ] || mkdir -p $@ | ||
101 | @make --no-print-directory -C $(BUILD) -f $(CURDIR)/Makefile | ||
102 | |||
103 | #--------------------------------------------------------------------------------- | ||
104 | clean: | ||
105 | @echo clean ... | ||
106 | @rm -fr $(BUILD) $(OUTPUT).elf $(OUTPUT).dol $(CURDIR)/data/gba_mb.gba | ||
107 | |||
108 | #--------------------------------------------------------------------------------- | ||
109 | else | ||
110 | |||
111 | DEPENDS := $(OFILES:.o=.d) | ||
112 | |||
113 | #--------------------------------------------------------------------------------- | ||
114 | # main targets | ||
115 | #--------------------------------------------------------------------------------- | ||
116 | $(OUTPUT).dol: $(OUTPUT).elf | ||
117 | $(OUTPUT).elf: $(OFILES) | ||
118 | |||
119 | #--------------------------------------------------------------------------------- | ||
120 | # This rule links in binary data with the .jpg extension | ||
121 | #--------------------------------------------------------------------------------- | ||
122 | %.gba.o : %.gba | ||
123 | #--------------------------------------------------------------------------------- | ||
124 | @echo $(notdir $<) | ||
125 | $(bin2o) | ||
126 | |||
127 | -include $(DEPENDS) | ||
128 | |||
129 | #--------------------------------------------------------------------------------- | ||
130 | endif | ||
131 | #--------------------------------------------------------------------------------- | ||
diff --git a/Makefile.gc b/Makefile.gc new file mode 100644 index 0000000..82e10f1 --- /dev/null +++ b/Makefile.gc | |||
@@ -0,0 +1,131 @@ | |||
1 | #--------------------------------------------------------------------------------- | ||
2 | # Clear the implicit built in rules | ||
3 | #--------------------------------------------------------------------------------- | ||
4 | .SUFFIXES: | ||
5 | #--------------------------------------------------------------------------------- | ||
6 | ifeq ($(strip $(DEVKITPPC)),) | ||
7 | $(error "Please set DEVKITPPC in your environment. export DEVKITPPC=<path to>devkitPPC") | ||
8 | endif | ||
9 | |||
10 | include $(DEVKITPPC)/gamecube_rules | ||
11 | |||
12 | #--------------------------------------------------------------------------------- | ||
13 | # TARGET is the name of the output | ||
14 | # BUILD is the directory where object files & intermediate files will be placed | ||
15 | # SOURCES is a list of directories containing source code | ||
16 | # INCLUDES is a list of directories containing extra header files | ||
17 | #--------------------------------------------------------------------------------- | ||
18 | TARGET := linkcabledump_gc | ||
19 | BUILD := build | ||
20 | SOURCES := source | ||
21 | DATA := data | ||
22 | INCLUDES := source | ||
23 | |||
24 | #--------------------------------------------------------------------------------- | ||
25 | # options for code generation | ||
26 | #--------------------------------------------------------------------------------- | ||
27 | |||
28 | CFLAGS = -g -O2 -Wall $(MACHDEP) $(INCLUDE) | ||
29 | CXXFLAGS = $(CFLAGS) | ||
30 | |||
31 | LDFLAGS = -g $(MACHDEP) -Wl,-Map,$(notdir $@).map | ||
32 | |||
33 | #--------------------------------------------------------------------------------- | ||
34 | # any extra libraries we wish to link with the project | ||
35 | #--------------------------------------------------------------------------------- | ||
36 | LIBS := -lfat -logc | ||
37 | |||
38 | |||
39 | #--------------------------------------------------------------------------------- | ||
40 | # list of directories containing libraries, this must be the top level containing | ||
41 | # include and lib | ||
42 | #--------------------------------------------------------------------------------- | ||
43 | LIBDIRS := $(DEVKITPPC)/lib $(CURDIR) | ||
44 | |||
45 | #--------------------------------------------------------------------------------- | ||
46 | # no real need to edit anything past this point unless you need to add additional | ||
47 | # rules for different file extensions | ||
48 | #--------------------------------------------------------------------------------- | ||
49 | ifneq ($(BUILD),$(notdir $(CURDIR))) | ||
50 | #--------------------------------------------------------------------------------- | ||
51 | |||
52 | export OUTPUT := $(CURDIR)/$(TARGET) | ||
53 | |||
54 | export VPATH := $(foreach dir,$(SOURCES),$(CURDIR)/$(dir)) \ | ||
55 | $(foreach dir,$(DATA),$(CURDIR)/$(dir)) | ||
56 | |||
57 | export DEPSDIR := $(CURDIR)/$(BUILD) | ||
58 | |||
59 | #--------------------------------------------------------------------------------- | ||
60 | # automatically build a list of object files for our project | ||
61 | #--------------------------------------------------------------------------------- | ||
62 | CFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.c))) | ||
63 | CPPFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.cpp))) | ||
64 | sFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.s))) | ||
65 | SFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.S))) | ||
66 | BINFILES := $(foreach dir,$(DATA),$(notdir $(wildcard $(dir)/*.*))) | ||
67 | |||
68 | #--------------------------------------------------------------------------------- | ||
69 | # use CXX for linking C++ projects, CC for standard C | ||
70 | #--------------------------------------------------------------------------------- | ||
71 | ifeq ($(strip $(CPPFILES)),) | ||
72 | export LD := $(CC) | ||
73 | else | ||
74 | export LD := $(CXX) | ||
75 | endif | ||
76 | |||
77 | export OFILES := $(addsuffix .o,$(BINFILES)) \ | ||
78 | $(CPPFILES:.cpp=.o) $(CFILES:.c=.o) \ | ||
79 | $(sFILES:.s=.o) $(SFILES:.S=.o) | ||
80 | |||
81 | #--------------------------------------------------------------------------------- | ||
82 | # build a list of include paths | ||
83 | #--------------------------------------------------------------------------------- | ||
84 | export INCLUDE := $(foreach dir,$(INCLUDES),-I$(CURDIR)/$(dir)) \ | ||
85 | $(foreach dir,$(LIBDIRS),-I$(dir)/include) \ | ||
86 | -I$(CURDIR)/$(BUILD) \ | ||
87 | -I$(LIBOGC_INC) | ||
88 | |||
89 | #--------------------------------------------------------------------------------- | ||
90 | # build a list of library paths | ||
91 | #--------------------------------------------------------------------------------- | ||
92 | export LIBPATHS := $(foreach dir,$(LIBDIRS),-L$(dir)/lib) \ | ||
93 | -L$(LIBOGC_LIB) | ||
94 | |||
95 | export OUTPUT := $(CURDIR)/$(TARGET) | ||
96 | .PHONY: $(BUILD) clean | ||
97 | |||
98 | #--------------------------------------------------------------------------------- | ||
99 | $(BUILD): | ||
100 | @[ -d $@ ] || mkdir -p $@ | ||
101 | @make --no-print-directory -C $(BUILD) -f $(CURDIR)/Makefile.gc | ||
102 | |||
103 | #--------------------------------------------------------------------------------- | ||
104 | clean: | ||
105 | @echo clean ... | ||
106 | @rm -fr $(BUILD) $(OUTPUT).elf $(OUTPUT).dol | ||
107 | |||
108 | #--------------------------------------------------------------------------------- | ||
109 | else | ||
110 | |||
111 | DEPENDS := $(OFILES:.o=.d) | ||
112 | |||
113 | #--------------------------------------------------------------------------------- | ||
114 | # main targets | ||
115 | #--------------------------------------------------------------------------------- | ||
116 | $(OUTPUT).dol: $(OUTPUT).elf | ||
117 | $(OUTPUT).elf: $(OFILES) | ||
118 | |||
119 | #--------------------------------------------------------------------------------- | ||
120 | # This rule links in binary data with the .jpg extension | ||
121 | #--------------------------------------------------------------------------------- | ||
122 | %.gba.o : %.gba | ||
123 | #--------------------------------------------------------------------------------- | ||
124 | @echo $(notdir $<) | ||
125 | $(bin2o) | ||
126 | |||
127 | -include $(DEPENDS) | ||
128 | |||
129 | #--------------------------------------------------------------------------------- | ||
130 | endif | ||
131 | #--------------------------------------------------------------------------------- | ||
diff --git a/Makefile.wii b/Makefile.wii new file mode 100644 index 0000000..341c37b --- /dev/null +++ b/Makefile.wii | |||
@@ -0,0 +1,131 @@ | |||
1 | #--------------------------------------------------------------------------------- | ||
2 | # Clear the implicit built in rules | ||
3 | #--------------------------------------------------------------------------------- | ||
4 | .SUFFIXES: | ||
5 | #--------------------------------------------------------------------------------- | ||
6 | ifeq ($(strip $(DEVKITPPC)),) | ||
7 | $(error "Please set DEVKITPPC in your environment. export DEVKITPPC=<path to>devkitPPC") | ||
8 | endif | ||
9 | |||
10 | include $(DEVKITPPC)/wii_rules | ||
11 | |||
12 | #--------------------------------------------------------------------------------- | ||
13 | # TARGET is the name of the output | ||
14 | # BUILD is the directory where object files & intermediate files will be placed | ||
15 | # SOURCES is a list of directories containing source code | ||
16 | # INCLUDES is a list of directories containing extra header files | ||
17 | #--------------------------------------------------------------------------------- | ||
18 | TARGET := linkcabledump_wii | ||
19 | BUILD := build | ||
20 | SOURCES := source | ||
21 | DATA := data | ||
22 | INCLUDES := source | ||
23 | |||
24 | #--------------------------------------------------------------------------------- | ||
25 | # options for code generation | ||
26 | #--------------------------------------------------------------------------------- | ||
27 | |||
28 | CFLAGS = -g -O2 -Wall $(MACHDEP) $(INCLUDE) | ||
29 | CXXFLAGS = $(CFLAGS) | ||
30 | |||
31 | LDFLAGS = -g $(MACHDEP) -Wl,-Map,$(notdir $@).map | ||
32 | |||
33 | #--------------------------------------------------------------------------------- | ||
34 | # any extra libraries we wish to link with the project | ||
35 | #--------------------------------------------------------------------------------- | ||
36 | LIBS := -lfat -logc | ||
37 | |||
38 | |||
39 | #--------------------------------------------------------------------------------- | ||
40 | # list of directories containing libraries, this must be the top level containing | ||
41 | # include and lib | ||
42 | #--------------------------------------------------------------------------------- | ||
43 | LIBDIRS := $(DEVKITPPC)/lib $(CURDIR) | ||
44 | |||
45 | #--------------------------------------------------------------------------------- | ||
46 | # no real need to edit anything past this point unless you need to add additional | ||
47 | # rules for different file extensions | ||
48 | #--------------------------------------------------------------------------------- | ||
49 | ifneq ($(BUILD),$(notdir $(CURDIR))) | ||
50 | #--------------------------------------------------------------------------------- | ||
51 | |||
52 | export OUTPUT := $(CURDIR)/$(TARGET) | ||
53 | |||
54 | export VPATH := $(foreach dir,$(SOURCES),$(CURDIR)/$(dir)) \ | ||
55 | $(foreach dir,$(DATA),$(CURDIR)/$(dir)) | ||
56 | |||
57 | export DEPSDIR := $(CURDIR)/$(BUILD) | ||
58 | |||
59 | #--------------------------------------------------------------------------------- | ||
60 | # automatically build a list of object files for our project | ||
61 | #--------------------------------------------------------------------------------- | ||
62 | CFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.c))) | ||
63 | CPPFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.cpp))) | ||
64 | sFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.s))) | ||
65 | SFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.S))) | ||
66 | BINFILES := $(foreach dir,$(DATA),$(notdir $(wildcard $(dir)/*.*))) | ||
67 | |||
68 | #--------------------------------------------------------------------------------- | ||
69 | # use CXX for linking C++ projects, CC for standard C | ||
70 | #--------------------------------------------------------------------------------- | ||
71 | ifeq ($(strip $(CPPFILES)),) | ||
72 | export LD := $(CC) | ||
73 | else | ||
74 | export LD := $(CXX) | ||
75 | endif | ||
76 | |||
77 | export OFILES := $(addsuffix .o,$(BINFILES)) \ | ||
78 | $(CPPFILES:.cpp=.o) $(CFILES:.c=.o) \ | ||
79 | $(sFILES:.s=.o) $(SFILES:.S=.o) | ||
80 | |||
81 | #--------------------------------------------------------------------------------- | ||
82 | # build a list of include paths | ||
83 | #--------------------------------------------------------------------------------- | ||
84 | export INCLUDE := $(foreach dir,$(INCLUDES),-I$(CURDIR)/$(dir)) \ | ||
85 | $(foreach dir,$(LIBDIRS),-I$(dir)/include) \ | ||
86 | -I$(CURDIR)/$(BUILD) \ | ||
87 | -I$(LIBOGC_INC) | ||
88 | |||
89 | #--------------------------------------------------------------------------------- | ||
90 | # build a list of library paths | ||
91 | #--------------------------------------------------------------------------------- | ||
92 | export LIBPATHS := $(foreach dir,$(LIBDIRS),-L$(dir)/lib) \ | ||
93 | -L$(LIBOGC_LIB) | ||
94 | |||
95 | export OUTPUT := $(CURDIR)/$(TARGET) | ||
96 | .PHONY: $(BUILD) clean | ||
97 | |||
98 | #--------------------------------------------------------------------------------- | ||
99 | $(BUILD): | ||
100 | @[ -d $@ ] || mkdir -p $@ | ||
101 | @make --no-print-directory -C $(BUILD) -f $(CURDIR)/Makefile.wii | ||
102 | |||
103 | #--------------------------------------------------------------------------------- | ||
104 | clean: | ||
105 | @echo clean ... | ||
106 | @rm -fr $(BUILD) $(OUTPUT).elf $(OUTPUT).dol | ||
107 | |||
108 | #--------------------------------------------------------------------------------- | ||
109 | else | ||
110 | |||
111 | DEPENDS := $(OFILES:.o=.d) | ||
112 | |||
113 | #--------------------------------------------------------------------------------- | ||
114 | # main targets | ||
115 | #--------------------------------------------------------------------------------- | ||
116 | $(OUTPUT).dol: $(OUTPUT).elf | ||
117 | $(OUTPUT).elf: $(OFILES) | ||
118 | |||
119 | #--------------------------------------------------------------------------------- | ||
120 | # This rule links in binary data with the .jpg extension | ||
121 | #--------------------------------------------------------------------------------- | ||
122 | %.gba.o : %.gba | ||
123 | #--------------------------------------------------------------------------------- | ||
124 | @echo $(notdir $<) | ||
125 | $(bin2o) | ||
126 | |||
127 | -include $(DEPENDS) | ||
128 | |||
129 | #--------------------------------------------------------------------------------- | ||
130 | endif | ||
131 | #--------------------------------------------------------------------------------- | ||
diff --git a/README.md b/README.md index 0d0ac36..6598337 100644 --- a/README.md +++ b/README.md | |||
@@ -1,2 +1,6 @@ | |||
1 | # gba-link-cable-dumper | 1 | # gba-link-cable-dumper |
2 | a gc and wii homebrew app to dump gba roms via the gc gba link cable | 2 | a gc and wii homebrew app to dump gba roms via the gc gba link cable. |
3 | |||
4 | # Usage | ||
5 | just have a gc controller in port 1 and a gba without a game inserted in port 2. | ||
6 | The gba files dumped will be placed in a folder called "dumps" on your main device (sd gecko on gamecube and sd/usb on wii). | ||
diff --git a/build.bat b/build.bat new file mode 100644 index 0000000..aece78f --- /dev/null +++ b/build.bat | |||
@@ -0,0 +1,10 @@ | |||
1 | cd gba | ||
2 | make clean | ||
3 | make | ||
4 | cd .. | ||
5 | mv -f gba/gba_mb.gba data/gba_mb.gba | ||
6 | make -f Makefile.gc clean | ||
7 | make -f Makefile.gc | ||
8 | make -f Makefile.wii clean | ||
9 | make -f Makefile.wii | ||
10 | pause \ No newline at end of file | ||
diff --git a/gba/Makefile b/gba/Makefile new file mode 100644 index 0000000..99dfbb6 --- /dev/null +++ b/gba/Makefile | |||
@@ -0,0 +1,168 @@ | |||
1 | #--------------------------------------------------------------------------------- | ||
2 | # Clear the implicit built in rules | ||
3 | #--------------------------------------------------------------------------------- | ||
4 | .SUFFIXES: | ||
5 | #--------------------------------------------------------------------------------- | ||
6 | ifeq ($(strip $(DEVKITARM)),) | ||
7 | $(error "Please set DEVKITARM in your environment. export DEVKITARM=<path to>devkitARM) | ||
8 | endif | ||
9 | |||
10 | include $(DEVKITARM)/gba_rules | ||
11 | |||
12 | #--------------------------------------------------------------------------------- | ||
13 | # TARGET is the name of the output, if this ends with _mb a multiboot image is generated | ||
14 | # BUILD is the directory where object files & intermediate files will be placed | ||
15 | # SOURCES is a list of directories containing source code | ||
16 | # DATA is a list of directories containing data files | ||
17 | # INCLUDES is a list of directories containing header files | ||
18 | #--------------------------------------------------------------------------------- | ||
19 | TARGET := $(shell basename $(CURDIR))_mb | ||
20 | BUILD := build | ||
21 | SOURCES := source | ||
22 | DATA := | ||
23 | GRAPHICS := gfx | ||
24 | INCLUDES := | ||
25 | |||
26 | #--------------------------------------------------------------------------------- | ||
27 | # options for code generation | ||
28 | #--------------------------------------------------------------------------------- | ||
29 | ARCH := -mthumb -mthumb-interwork | ||
30 | |||
31 | CFLAGS := -g -Wall -O3\ | ||
32 | -mcpu=arm7tdmi -mtune=arm7tdmi\ | ||
33 | -fomit-frame-pointer\ | ||
34 | -ffast-math \ | ||
35 | $(ARCH) | ||
36 | |||
37 | CFLAGS += $(INCLUDE) | ||
38 | |||
39 | CXXFLAGS := $(CFLAGS) -fno-rtti -fno-exceptions | ||
40 | |||
41 | ASFLAGS := $(ARCH) | ||
42 | LDFLAGS = -g $(ARCH) -Wl,-Map,$(notdir $@).map | ||
43 | |||
44 | #--------------------------------------------------------------------------------- | ||
45 | # any extra libraries we wish to link with the project | ||
46 | #--------------------------------------------------------------------------------- | ||
47 | LIBS := -lgba | ||
48 | |||
49 | #--------------------------------------------------------------------------------- | ||
50 | # list of directories containing libraries, this must be the top level containing | ||
51 | # include and lib | ||
52 | #--------------------------------------------------------------------------------- | ||
53 | LIBDIRS := $(LIBGBA) | ||
54 | |||
55 | #--------------------------------------------------------------------------------- | ||
56 | # no real need to edit anything past this point unless you need to add additional | ||
57 | # rules for different file extensions | ||
58 | #--------------------------------------------------------------------------------- | ||
59 | ifneq ($(BUILD),$(notdir $(CURDIR))) | ||
60 | #--------------------------------------------------------------------------------- | ||
61 | |||
62 | export OUTPUT := $(CURDIR)/$(TARGET) | ||
63 | export VPATH := $(foreach dir,$(SOURCES),$(CURDIR)/$(dir)) \ | ||
64 | $(foreach dir,$(DATA),$(CURDIR)/$(dir)) | ||
65 | |||
66 | export DEPSDIR := $(CURDIR)/$(BUILD) | ||
67 | |||
68 | #--------------------------------------------------------------------------------- | ||
69 | # automatically build a list of object files for our project | ||
70 | #--------------------------------------------------------------------------------- | ||
71 | CFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.c))) | ||
72 | CPPFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.cpp))) | ||
73 | SFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.s))) | ||
74 | BINFILES := $(foreach dir,$(DATA),$(notdir $(wildcard $(dir)/*.*))) | ||
75 | BMPFILES := $(foreach dir,$(GRAPHICS),$(notdir $(wildcard $(dir)/*.bmp))) | ||
76 | |||
77 | #--------------------------------------------------------------------------------- | ||
78 | # use CXX for linking C++ projects, CC for standard C | ||
79 | #--------------------------------------------------------------------------------- | ||
80 | ifeq ($(strip $(CPPFILES)),) | ||
81 | #--------------------------------------------------------------------------------- | ||
82 | export LD := $(CC) | ||
83 | #--------------------------------------------------------------------------------- | ||
84 | else | ||
85 | #--------------------------------------------------------------------------------- | ||
86 | export LD := $(CXX) | ||
87 | #--------------------------------------------------------------------------------- | ||
88 | endif | ||
89 | #--------------------------------------------------------------------------------- | ||
90 | |||
91 | export OFILES := $(addsuffix .o,$(BINFILES)) \ | ||
92 | $(BMPFILES:.bmp=.o) \ | ||
93 | $(CPPFILES:.cpp=.o) $(CFILES:.c=.o) $(SFILES:.s=.o) | ||
94 | |||
95 | #--------------------------------------------------------------------------------- | ||
96 | # build a list of include paths | ||
97 | #--------------------------------------------------------------------------------- | ||
98 | export INCLUDE := $(foreach dir,$(INCLUDES),-I$(CURDIR)/$(dir)) \ | ||
99 | $(foreach dir,$(LIBDIRS),-I$(dir)/include) \ | ||
100 | -I$(CURDIR)/$(BUILD) | ||
101 | |||
102 | #--------------------------------------------------------------------------------- | ||
103 | # build a list of library paths | ||
104 | #--------------------------------------------------------------------------------- | ||
105 | export LIBPATHS := $(foreach dir,$(LIBDIRS),-L$(dir)/lib) | ||
106 | |||
107 | .PHONY: $(BUILD) clean | ||
108 | |||
109 | #--------------------------------------------------------------------------------- | ||
110 | $(BUILD): | ||
111 | @[ -d $@ ] || mkdir -p $@ | ||
112 | @make --no-print-directory -C $(BUILD) -f $(CURDIR)/Makefile | ||
113 | |||
114 | all : $(BUILD) | ||
115 | #--------------------------------------------------------------------------------- | ||
116 | clean: | ||
117 | @echo clean ... | ||
118 | @rm -fr $(BUILD) $(TARGET).elf $(TARGET).gba | ||
119 | |||
120 | #--------------------------------------------------------------------------------- | ||
121 | else | ||
122 | |||
123 | DEPENDS := $(OFILES:.o=.d) | ||
124 | |||
125 | #--------------------------------------------------------------------------------- | ||
126 | # main targets | ||
127 | #--------------------------------------------------------------------------------- | ||
128 | $(OUTPUT).gba : $(OUTPUT).elf | ||
129 | |||
130 | $(OUTPUT).elf : $(OFILES) | ||
131 | |||
132 | |||
133 | #--------------------------------------------------------------------------------- | ||
134 | # The bin2o rule should be copied and modified | ||
135 | # for each extension used in the data directories | ||
136 | #--------------------------------------------------------------------------------- | ||
137 | |||
138 | #--------------------------------------------------------------------------------- | ||
139 | # This rule links in binary data with the .bin extension | ||
140 | #--------------------------------------------------------------------------------- | ||
141 | %.bin.o : %.bin | ||
142 | #--------------------------------------------------------------------------------- | ||
143 | @echo $(notdir $<) | ||
144 | @$(bin2o) | ||
145 | |||
146 | #--------------------------------------------------------------------------------- | ||
147 | # This rule links in binary data with the .raw extension | ||
148 | #--------------------------------------------------------------------------------- | ||
149 | %.raw.o : %.raw | ||
150 | #--------------------------------------------------------------------------------- | ||
151 | @echo $(notdir $<) | ||
152 | @$(bin2o) | ||
153 | |||
154 | #--------------------------------------------------------------------------------- | ||
155 | # This rule creates assembly source files using grit | ||
156 | # grit takes an image file and a .grit describing how the file is to be processed | ||
157 | # add additional rules like this for each image extension | ||
158 | # you use in the graphics folders | ||
159 | #--------------------------------------------------------------------------------- | ||
160 | %.s %.h : %.bmp %.grit | ||
161 | #--------------------------------------------------------------------------------- | ||
162 | grit $< -fts -o$* | ||
163 | |||
164 | -include $(DEPENDS) | ||
165 | |||
166 | #--------------------------------------------------------------------------------- | ||
167 | endif | ||
168 | #--------------------------------------------------------------------------------- | ||
diff --git a/gba/source/main.c b/gba/source/main.c new file mode 100644 index 0000000..9d05189 --- /dev/null +++ b/gba/source/main.c | |||
@@ -0,0 +1,94 @@ | |||
1 | |||
2 | #include <gba_console.h> | ||
3 | #include <gba_video.h> | ||
4 | #include <gba_interrupt.h> | ||
5 | #include <gba_systemcalls.h> | ||
6 | #include <gba_input.h> | ||
7 | #include <gba_sio.h> | ||
8 | #include <stdio.h> | ||
9 | #include <stdlib.h> | ||
10 | |||
11 | u32 getGameSize(void) | ||
12 | { | ||
13 | if(*(vu32*)(0x08000004) != 0x51AEFF24) | ||
14 | return 0; | ||
15 | u32 i; | ||
16 | for(i = (1<<20); i < (1<<25); i<<=1) | ||
17 | { | ||
18 | vu16 *rompos = (vu16*)(0x08000000+i); | ||
19 | int j; | ||
20 | bool romend = true; | ||
21 | for(j = 0; j < 0x1000; j++) | ||
22 | { | ||
23 | if(rompos[j] != j) | ||
24 | { | ||
25 | romend = false; | ||
26 | break; | ||
27 | } | ||
28 | } | ||
29 | if(romend) break; | ||
30 | } | ||
31 | return i; | ||
32 | } | ||
33 | //--------------------------------------------------------------------------------- | ||
34 | // Program entry point | ||
35 | //--------------------------------------------------------------------------------- | ||
36 | int main(void) { | ||
37 | //--------------------------------------------------------------------------------- | ||
38 | |||
39 | // the vblank interrupt must be enabled for VBlankIntrWait() to work | ||
40 | // since the default dispatcher handles the bios flags no vblank handler | ||
41 | // is required | ||
42 | irqInit(); | ||
43 | irqEnable(IRQ_VBLANK); | ||
44 | |||
45 | consoleDemoInit(); | ||
46 | REG_JOYTR = 0; | ||
47 | // ansi escape sequence to set print co-ordinates | ||
48 | // /x1b[line;columnH | ||
49 | u32 i; | ||
50 | iprintf("\x1b[9;10HROM Dumper\n"); | ||
51 | iprintf("\x1b[10;5HPlease look at the TV\n"); | ||
52 | REG_HS_CTRL |= 6; | ||
53 | while (1) { | ||
54 | if((REG_HS_CTRL&4)) | ||
55 | { | ||
56 | REG_HS_CTRL |= 4; | ||
57 | u32 gamesize = getGameSize(); | ||
58 | REG_JOYTR = gamesize; | ||
59 | while((REG_HS_CTRL&4) == 0) ; | ||
60 | REG_HS_CTRL |= 4; | ||
61 | if(gamesize == 0) | ||
62 | { | ||
63 | REG_JOYTR = 0; | ||
64 | continue; //nothing to read | ||
65 | } | ||
66 | //game in, send header | ||
67 | for(i = 0; i < 0xC0; i+=4) | ||
68 | { | ||
69 | REG_JOYTR = *(vu32*)(0x08000000+i); | ||
70 | while((REG_HS_CTRL&4) == 0) ; | ||
71 | REG_HS_CTRL |= 4; | ||
72 | } | ||
73 | //wait for other side to choose | ||
74 | while((REG_HS_CTRL&2) == 0) ; | ||
75 | REG_HS_CTRL |= 2; | ||
76 | if(REG_JOYRE == 0) | ||
77 | { | ||
78 | REG_JOYTR = 0; | ||
79 | continue; //nothing to read | ||
80 | } | ||
81 | //dump the game | ||
82 | for(i = 0; i < gamesize; i+=4) | ||
83 | { | ||
84 | REG_JOYTR = *(vu32*)(0x08000000+i); | ||
85 | while((REG_HS_CTRL&4) == 0) ; | ||
86 | REG_HS_CTRL |= 4; | ||
87 | } | ||
88 | REG_JOYTR = 0; | ||
89 | } | ||
90 | Halt(); | ||
91 | } | ||
92 | } | ||
93 | |||
94 | |||
diff --git a/source/main.c b/source/main.c new file mode 100644 index 0000000..afe3423 --- /dev/null +++ b/source/main.c | |||
@@ -0,0 +1,400 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2016 FIX94 | ||
3 | * | ||
4 | * This software may be modified and distributed under the terms | ||
5 | * of the MIT license. See the LICENSE file for details. | ||
6 | */ | ||
7 | #include <gccore.h> | ||
8 | #include <stdio.h> | ||
9 | #include <malloc.h> | ||
10 | #include <unistd.h> | ||
11 | #include <string.h> | ||
12 | #include <stdlib.h> | ||
13 | #include <sys/types.h> | ||
14 | #include <sys/stat.h> | ||
15 | #include <fcntl.h> | ||
16 | #include <dirent.h> | ||
17 | #include <fat.h> | ||
18 | |||
19 | extern u8 gba_mb_gba[]; | ||
20 | extern u32 gba_mb_gba_size; | ||
21 | |||
22 | void printmain() | ||
23 | { | ||
24 | printf("\x1b[2J"); | ||
25 | printf("\x1b[37m"); | ||
26 | printf("GBA Link Cable Dumper v1.0 by FIX94\n"); | ||
27 | } | ||
28 | |||
29 | u8 *resbuf,*cmdbuf; | ||
30 | volatile u16 pads = 0; | ||
31 | volatile bool ctrlerr = false; | ||
32 | void ctrlcb(s32 chan, u32 ret) | ||
33 | { | ||
34 | if(ret) | ||
35 | { | ||
36 | ctrlerr = true; | ||
37 | return; | ||
38 | } | ||
39 | //just call us again | ||
40 | pads = (~((resbuf[1]<<8)|resbuf[0]))&0x3FF; | ||
41 | SI_Transfer(1,cmdbuf,1,resbuf,5,ctrlcb,350); | ||
42 | } | ||
43 | |||
44 | volatile u32 transval = 0; | ||
45 | void transcb(s32 chan, u32 ret) | ||
46 | { | ||
47 | transval = 1; | ||
48 | } | ||
49 | |||
50 | volatile u32 resval = 0; | ||
51 | void acb(s32 res, u32 val) | ||
52 | { | ||
53 | resval = val; | ||
54 | } | ||
55 | |||
56 | unsigned int docrc(u32 crc, u32 val) | ||
57 | { | ||
58 | int i; | ||
59 | for(i = 0; i < 0x20; i++) | ||
60 | { | ||
61 | if((crc^val)&1) | ||
62 | { | ||
63 | crc>>=1; | ||
64 | crc^=0xa1c1; | ||
65 | } | ||
66 | else | ||
67 | crc>>=1; | ||
68 | val>>=1; | ||
69 | } | ||
70 | return crc; | ||
71 | } | ||
72 | |||
73 | static inline void wait_for_transfer() | ||
74 | { | ||
75 | //350 is REALLY pushing it already, cant go further | ||
76 | do{ usleep(350); }while(transval == 0); | ||
77 | } | ||
78 | |||
79 | void endproc() | ||
80 | { | ||
81 | printf("Start pressed, exit\n"); | ||
82 | VIDEO_WaitVSync(); | ||
83 | VIDEO_WaitVSync(); | ||
84 | exit(0); | ||
85 | } | ||
86 | unsigned int calckey(unsigned int size) | ||
87 | { | ||
88 | unsigned int ret = 0; | ||
89 | size=(size-0x200) >> 3; | ||
90 | int res1 = (size&0x3F80) << 1; | ||
91 | res1 |= (size&0x4000) << 2; | ||
92 | res1 |= (size&0x7F); | ||
93 | res1 |= 0x380000; | ||
94 | int res2 = res1; | ||
95 | res1 = res2 >> 0x10; | ||
96 | int res3 = res2 >> 8; | ||
97 | res3 += res1; | ||
98 | res3 += res2; | ||
99 | res3 <<= 24; | ||
100 | res3 |= res2; | ||
101 | res3 |= 0x80808080; | ||
102 | |||
103 | if((res3&0x200) == 0) | ||
104 | { | ||
105 | ret |= (((res3)&0xFF)^0x4B)<<24; | ||
106 | ret |= (((res3>>8)&0xFF)^0x61)<<16; | ||
107 | ret |= (((res3>>16)&0xFF)^0x77)<<8; | ||
108 | ret |= (((res3>>24)&0xFF)^0x61); | ||
109 | } | ||
110 | else | ||
111 | { | ||
112 | ret |= (((res3)&0xFF)^0x73)<<24; | ||
113 | ret |= (((res3>>8)&0xFF)^0x65)<<16; | ||
114 | ret |= (((res3>>16)&0xFF)^0x64)<<8; | ||
115 | ret |= (((res3>>24)&0xFF)^0x6F); | ||
116 | } | ||
117 | return ret; | ||
118 | } | ||
119 | void doreset() | ||
120 | { | ||
121 | cmdbuf[0] = 0xFF; //reset | ||
122 | transval = 0; | ||
123 | SI_Transfer(1,cmdbuf,1,resbuf,3,transcb,0); | ||
124 | wait_for_transfer(); | ||
125 | } | ||
126 | void getstatus() | ||
127 | { | ||
128 | cmdbuf[0] = 0; //status | ||
129 | transval = 0; | ||
130 | SI_Transfer(1,cmdbuf,1,resbuf,3,transcb,0); | ||
131 | wait_for_transfer(); | ||
132 | } | ||
133 | u32 recvsafe() | ||
134 | { | ||
135 | memset(resbuf,0,32); | ||
136 | cmdbuf[0]=0x14; //read | ||
137 | transval = 0; | ||
138 | SI_Transfer(1,cmdbuf,1,resbuf,5,transcb,0); | ||
139 | wait_for_transfer(); | ||
140 | return *(vu32*)resbuf; | ||
141 | } | ||
142 | void sendsafe(u32 msg) | ||
143 | { | ||
144 | cmdbuf[0]=0x15;cmdbuf[1]=(msg>>0)&0xFF;cmdbuf[2]=(msg>>8)&0xFF; | ||
145 | cmdbuf[3]=(msg>>16)&0xFF;cmdbuf[4]=(msg>>24)&0xFF; | ||
146 | transval = 0; | ||
147 | resbuf[0] = 0; | ||
148 | SI_Transfer(1,cmdbuf,5,resbuf,1,transcb,0); | ||
149 | wait_for_transfer(); | ||
150 | } | ||
151 | u32 recvfast() | ||
152 | { | ||
153 | cmdbuf[0]=0x14; //read | ||
154 | transval = 0; | ||
155 | SI_Transfer(1,cmdbuf,1,resbuf,5,transcb,0); | ||
156 | usleep(275); | ||
157 | while(transval == 0) ; | ||
158 | return *(vu32*)resbuf; | ||
159 | } | ||
160 | bool dirExists(const char *path) | ||
161 | { | ||
162 | DIR *dir; | ||
163 | dir = opendir(path); | ||
164 | if(dir) | ||
165 | { | ||
166 | closedir(dir); | ||
167 | return true; | ||
168 | } | ||
169 | return false; | ||
170 | } | ||
171 | int main(int argc, char *argv[]) | ||
172 | { | ||
173 | void *xfb = NULL; | ||
174 | GXRModeObj *rmode = NULL; | ||
175 | VIDEO_Init(); | ||
176 | rmode = VIDEO_GetPreferredMode(NULL); | ||
177 | xfb = MEM_K0_TO_K1(SYS_AllocateFramebuffer(rmode)); | ||
178 | VIDEO_Configure(rmode); | ||
179 | VIDEO_SetNextFramebuffer(xfb); | ||
180 | VIDEO_SetBlack(FALSE); | ||
181 | VIDEO_Flush(); | ||
182 | VIDEO_WaitVSync(); | ||
183 | if(rmode->viTVMode&VI_NON_INTERLACE) VIDEO_WaitVSync(); | ||
184 | int x = 24, y = 32, w, h; | ||
185 | w = rmode->fbWidth - (32); | ||
186 | h = rmode->xfbHeight - (48); | ||
187 | CON_InitEx(rmode, x, y, w, h); | ||
188 | VIDEO_ClearFrameBuffer(rmode, xfb, COLOR_BLACK); | ||
189 | PAD_Init(); | ||
190 | cmdbuf = memalign(32,32); | ||
191 | resbuf = memalign(32,32); | ||
192 | u8 *testdump = memalign(32,0x400000); | ||
193 | if(!testdump) return 0; | ||
194 | if(!fatInitDefault()) | ||
195 | { | ||
196 | printmain(); | ||
197 | printf("ERROR: No usable device found to write dumped files to!\n"); | ||
198 | VIDEO_WaitVSync(); | ||
199 | VIDEO_WaitVSync(); | ||
200 | sleep(5); | ||
201 | exit(0); | ||
202 | } | ||
203 | mkdir("/dumps", S_IREAD | S_IWRITE); | ||
204 | if(!dirExists("/dumps")) | ||
205 | { | ||
206 | printmain(); | ||
207 | printf("ERROR: Could not create dumps folder, make sure you have a supported device connected!\n"); | ||
208 | VIDEO_WaitVSync(); | ||
209 | VIDEO_WaitVSync(); | ||
210 | sleep(5); | ||
211 | exit(0); | ||
212 | } | ||
213 | int i; | ||
214 | while(1) | ||
215 | { | ||
216 | printmain(); | ||
217 | printf("Waiting for a GBA in port 2...\n"); | ||
218 | resval = 0; | ||
219 | ctrlerr = false; | ||
220 | |||
221 | SI_GetTypeAsync(1,acb); | ||
222 | while(1) | ||
223 | { | ||
224 | if(resval) | ||
225 | { | ||
226 | if(resval == 0x80 || resval & 8) | ||
227 | { | ||
228 | resval = 0; | ||
229 | SI_GetTypeAsync(1,acb); | ||
230 | } | ||
231 | else if(resval) | ||
232 | break; | ||
233 | } | ||
234 | PAD_ScanPads(); | ||
235 | VIDEO_WaitVSync(); | ||
236 | if(PAD_ButtonsHeld(0)) | ||
237 | endproc(); | ||
238 | } | ||
239 | if(resval & SI_GBA) | ||
240 | { | ||
241 | printf("GBA Found! Waiting on BIOS\n"); | ||
242 | resbuf[2]=0; | ||
243 | while(!(resbuf[2]&0x10)) | ||
244 | { | ||
245 | doreset(); | ||
246 | getstatus(); | ||
247 | } | ||
248 | printf("Ready, sending dumper\n"); | ||
249 | unsigned int sendsize = ((gba_mb_gba_size+7)&~7); | ||
250 | unsigned int ourkey = calckey(sendsize); | ||
251 | //printf("Our Key: %08x\n", ourkey); | ||
252 | //get current sessionkey | ||
253 | u32 sessionkeyraw = recvsafe(); | ||
254 | u32 sessionkey = __builtin_bswap32(sessionkeyraw^0x7365646F); | ||
255 | //send over our own key | ||
256 | sendsafe(__builtin_bswap32(ourkey)); | ||
257 | unsigned int fcrc = 0x15a0; | ||
258 | //send over gba header | ||
259 | for(i = 0; i < 0xC0; i+=4) | ||
260 | { | ||
261 | sendsafe(__builtin_bswap32(*(vu32*)(gba_mb_gba+i))); | ||
262 | if(!(resbuf[0]&0x2)) printf("Possible error %02x\n",resbuf[0]); | ||
263 | } | ||
264 | //printf("Header done! Sending ROM...\n"); | ||
265 | for(i = 0xC0; i < sendsize; i+=4) | ||
266 | { | ||
267 | u32 enc = ((gba_mb_gba[i+3]<<24)|(gba_mb_gba[i+2]<<16)|(gba_mb_gba[i+1]<<8)|(gba_mb_gba[i])); | ||
268 | fcrc=docrc(fcrc,enc); | ||
269 | sessionkey = (sessionkey*0x6177614B)+1; | ||
270 | enc^=sessionkey; | ||
271 | enc^=((~(i+(0x20<<20)))+1); | ||
272 | enc^=0x20796220; | ||
273 | sendsafe(enc); | ||
274 | if(!(resbuf[0]&0x2)) printf("Possible error %02x\n",resbuf[0]); | ||
275 | } | ||
276 | fcrc |= (sendsize<<16); | ||
277 | //printf("ROM done! CRC: %08x\n", fcrc); | ||
278 | //send over CRC | ||
279 | sessionkey = (sessionkey*0x6177614B)+1; | ||
280 | fcrc^=sessionkey; | ||
281 | fcrc^=((~(i+(0x20<<20)))+1); | ||
282 | fcrc^=0x20796220; | ||
283 | sendsafe(fcrc); | ||
284 | //get crc back (unused) | ||
285 | recvsafe(); | ||
286 | printf("Done!\n"); | ||
287 | sleep(2); | ||
288 | //hm | ||
289 | while(1) | ||
290 | { | ||
291 | printmain(); | ||
292 | printf("Press A once you have a GBA Game inserted.\n \n"); | ||
293 | PAD_ScanPads(); | ||
294 | VIDEO_WaitVSync(); | ||
295 | u32 btns = PAD_ButtonsDown(0); | ||
296 | if(btns&PAD_BUTTON_START) | ||
297 | endproc(); | ||
298 | else if(btns&PAD_BUTTON_A) | ||
299 | { | ||
300 | if(recvsafe() == 0) //ready | ||
301 | { | ||
302 | sleep(1); //gba rom prepare | ||
303 | u32 gbasize = __builtin_bswap32(recvsafe()); | ||
304 | if(gbasize == 0) | ||
305 | { | ||
306 | printf("ERROR: No (Valid) GBA Card inserted!\n"); | ||
307 | VIDEO_WaitVSync(); | ||
308 | VIDEO_WaitVSync(); | ||
309 | sleep(2); | ||
310 | continue; | ||
311 | } | ||
312 | for(i = 0; i < 0xC0; i+=4) | ||
313 | *(vu32*)(testdump+i) = recvfast(); | ||
314 | printf("Game Name: %.12s\n",(char*)(testdump+0xA0)); | ||
315 | printf("Game ID: %.4s\n",(char*)(testdump+0xAC)); | ||
316 | printf("Company ID: %.2s\n",(char*)(testdump+0xB0)); | ||
317 | printf("ROM Size: %02.02f MB\n \n",((float)(gbasize/1024))/1024.f); | ||
318 | char gamename[64]; | ||
319 | sprintf(gamename,"/dumps/%.12s [%.4s%.2s].gba", | ||
320 | (char*)(testdump+0xA0),(char*)(testdump+0xAC),(char*)(testdump+0xB0)); | ||
321 | FILE *f = fopen(gamename,"rb"); | ||
322 | if(f) | ||
323 | { | ||
324 | fclose(f); | ||
325 | sendsafe(0); | ||
326 | printf("ERROR: Game already dumped! Please insert another game.\n"); | ||
327 | VIDEO_WaitVSync(); | ||
328 | VIDEO_WaitVSync(); | ||
329 | sleep(2); | ||
330 | continue; | ||
331 | } | ||
332 | printf("Press A to dump this game, it will take about %i minutes.\n",gbasize/1024/1024*3/2); | ||
333 | printf("Press B if you want to cancel dumping this game.\n\n"); | ||
334 | int dumping = 0; | ||
335 | while(1) | ||
336 | { | ||
337 | PAD_ScanPads(); | ||
338 | VIDEO_WaitVSync(); | ||
339 | u32 btns = PAD_ButtonsDown(0); | ||
340 | if(btns&PAD_BUTTON_START) | ||
341 | endproc(); | ||
342 | else if(btns&PAD_BUTTON_A) | ||
343 | { | ||
344 | dumping = 1; | ||
345 | break; | ||
346 | } | ||
347 | else if(btns&PAD_BUTTON_B) | ||
348 | break; | ||
349 | } | ||
350 | sendsafe(dumping); | ||
351 | if(dumping == 0) | ||
352 | continue; | ||
353 | //create base file with size | ||
354 | printf("Creating file...\n"); | ||
355 | int fd = open(gamename, O_WRONLY|O_CREAT); | ||
356 | if(fd >= 0) | ||
357 | { | ||
358 | ftruncate(fd, gbasize); | ||
359 | close(fd); | ||
360 | } | ||
361 | f = fopen(gamename,"wb"); | ||
362 | if(!f) | ||
363 | { | ||
364 | printf("ERROR: Could not create file! Exit...\n"); | ||
365 | VIDEO_WaitVSync(); | ||
366 | VIDEO_WaitVSync(); | ||
367 | sleep(5); | ||
368 | exit(0); | ||
369 | } | ||
370 | printf("Dumping...\n"); | ||
371 | u32 bytes_read = 0; | ||
372 | while(gbasize > 0) | ||
373 | { | ||
374 | int toread = (gbasize > 0x400000 ? 0x400000 : gbasize); | ||
375 | int j; | ||
376 | for(j = 0; j < toread; j+=4) | ||
377 | { | ||
378 | *(vu32*)(testdump+j) = recvfast(); | ||
379 | bytes_read+=4; | ||
380 | if((bytes_read&0xFFFF) == 0) | ||
381 | { | ||
382 | printf("\r%02.02f MB done",(float)(bytes_read/1024)/1024.f); | ||
383 | VIDEO_WaitVSync(); | ||
384 | } | ||
385 | //printf("%02x%02x%02x%02x",resbuf[0],resbuf[1],resbuf[2],resbuf[3]); | ||
386 | } | ||
387 | fwrite(testdump,toread,1,f); | ||
388 | gbasize -= toread; | ||
389 | } | ||
390 | printf("\nClosing file\n"); | ||
391 | fclose(f); | ||
392 | printf("Game dumped!\n"); | ||
393 | sleep(5); | ||
394 | } | ||
395 | } | ||
396 | } | ||
397 | } | ||
398 | } | ||
399 | return 0; | ||
400 | } | ||