Add initial Wii code
This commit is contained in:
parent
9ef7d8e075
commit
9b802afe65
|
@ -0,0 +1,138 @@
|
|||
#---------------------------------------------------------------------------------
|
||||
# Clear the implicit built in rules
|
||||
#---------------------------------------------------------------------------------
|
||||
.SUFFIXES:
|
||||
#---------------------------------------------------------------------------------
|
||||
ifeq ($(strip $(DEVKITPPC)),)
|
||||
$(error "Please set DEVKITPPC in your environment. export DEVKITPPC=<path to>devkitPPC")
|
||||
endif
|
||||
|
||||
include $(DEVKITPPC)/wii_rules
|
||||
|
||||
#---------------------------------------------------------------------------------
|
||||
# TARGET is the name of the output
|
||||
# BUILD is the directory where object files & intermediate files will be placed
|
||||
# SOURCES is a list of directories containing source code
|
||||
# INCLUDES is a list of directories containing extra header files
|
||||
#---------------------------------------------------------------------------------
|
||||
TARGET := boot
|
||||
BUILD := build
|
||||
SOURCES := source
|
||||
DATA := data
|
||||
INCLUDES :=
|
||||
|
||||
#---------------------------------------------------------------------------------
|
||||
# options for code generation
|
||||
#---------------------------------------------------------------------------------
|
||||
|
||||
CFLAGS = -g -O2 -Wall $(MACHDEP) $(INCLUDE)
|
||||
CXXFLAGS = $(CFLAGS)
|
||||
|
||||
LDFLAGS = -g $(MACHDEP) -Wl,-Map,$(notdir $@).map
|
||||
|
||||
#---------------------------------------------------------------------------------
|
||||
# any extra libraries we wish to link with the project
|
||||
#---------------------------------------------------------------------------------
|
||||
LIBS := -lwiiuse -lbte -logc -lm
|
||||
|
||||
#---------------------------------------------------------------------------------
|
||||
# list of directories containing libraries, this must be the top level containing
|
||||
# include and lib
|
||||
#---------------------------------------------------------------------------------
|
||||
LIBDIRS :=
|
||||
|
||||
#---------------------------------------------------------------------------------
|
||||
# no real need to edit anything past this point unless you need to add additional
|
||||
# rules for different file extensions
|
||||
#---------------------------------------------------------------------------------
|
||||
ifneq ($(BUILD),$(notdir $(CURDIR)))
|
||||
#---------------------------------------------------------------------------------
|
||||
|
||||
export OUTPUT := $(CURDIR)/$(TARGET)
|
||||
|
||||
export VPATH := $(foreach dir,$(SOURCES),$(CURDIR)/$(dir)) \
|
||||
$(foreach dir,$(DATA),$(CURDIR)/$(dir))
|
||||
|
||||
export DEPSDIR := $(CURDIR)/$(BUILD)
|
||||
|
||||
#---------------------------------------------------------------------------------
|
||||
# automatically build a list of object files for our project
|
||||
#---------------------------------------------------------------------------------
|
||||
CFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.c)))
|
||||
CPPFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.cpp)))
|
||||
sFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.s)))
|
||||
SFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.S)))
|
||||
BINFILES := $(foreach dir,$(DATA),$(notdir $(wildcard $(dir)/*.*)))
|
||||
|
||||
#---------------------------------------------------------------------------------
|
||||
# use CXX for linking C++ projects, CC for standard C
|
||||
#---------------------------------------------------------------------------------
|
||||
ifeq ($(strip $(CPPFILES)),)
|
||||
export LD := $(CC)
|
||||
else
|
||||
export LD := $(CXX)
|
||||
endif
|
||||
|
||||
export OFILES_BIN := $(addsuffix .o,$(BINFILES))
|
||||
export OFILES_SOURCES := $(CPPFILES:.cpp=.o) $(CFILES:.c=.o) $(sFILES:.s=.o) $(SFILES:.S=.o)
|
||||
export OFILES := $(OFILES_BIN) $(OFILES_SOURCES)
|
||||
|
||||
export HFILES := $(addsuffix .h,$(subst .,_,$(BINFILES)))
|
||||
|
||||
#---------------------------------------------------------------------------------
|
||||
# build a list of include paths
|
||||
#---------------------------------------------------------------------------------
|
||||
export INCLUDE := $(foreach dir,$(INCLUDES), -iquote $(CURDIR)/$(dir)) \
|
||||
$(foreach dir,$(LIBDIRS),-I$(dir)/include) \
|
||||
-I$(CURDIR)/$(BUILD) \
|
||||
-I$(LIBOGC_INC)
|
||||
|
||||
#---------------------------------------------------------------------------------
|
||||
# build a list of library paths
|
||||
#---------------------------------------------------------------------------------
|
||||
export LIBPATHS := -L$(LIBOGC_LIB) $(foreach dir,$(LIBDIRS),-L$(dir)/lib)
|
||||
|
||||
export OUTPUT := $(CURDIR)/$(TARGET)
|
||||
.PHONY: $(BUILD) clean
|
||||
|
||||
#---------------------------------------------------------------------------------
|
||||
$(BUILD):
|
||||
@[ -d $@ ] || mkdir -p $@
|
||||
@$(MAKE) --no-print-directory -C $(BUILD) -f $(CURDIR)/Makefile
|
||||
|
||||
#---------------------------------------------------------------------------------
|
||||
clean:
|
||||
@echo clean ...
|
||||
@rm -fr $(BUILD) $(OUTPUT).elf $(OUTPUT).dol
|
||||
|
||||
#---------------------------------------------------------------------------------
|
||||
run:
|
||||
wiiload $(TARGET).dol
|
||||
|
||||
|
||||
#---------------------------------------------------------------------------------
|
||||
else
|
||||
|
||||
DEPENDS := $(OFILES:.o=.d)
|
||||
|
||||
#---------------------------------------------------------------------------------
|
||||
# main targets
|
||||
#---------------------------------------------------------------------------------
|
||||
$(OUTPUT).dol: $(OUTPUT).elf
|
||||
$(OUTPUT).elf: $(OFILES)
|
||||
|
||||
$(OFILES_SOURCES) : $(HFILES)
|
||||
|
||||
#---------------------------------------------------------------------------------
|
||||
# This rule links in binary data with the .jpg extension
|
||||
#---------------------------------------------------------------------------------
|
||||
%.jpg.o %_jpg.h : %.jpg
|
||||
#---------------------------------------------------------------------------------
|
||||
@echo $(notdir $<)
|
||||
$(bin2o)
|
||||
|
||||
-include $(DEPENDS)
|
||||
|
||||
#---------------------------------------------------------------------------------
|
||||
endif
|
||||
#---------------------------------------------------------------------------------
|
Binary file not shown.
After Width: | Height: | Size: 11 KiB |
|
@ -0,0 +1,39 @@
|
|||
<!--
|
||||
For more information, see:
|
||||
<https://wiibrew.org/wiki/Homebrew_Channel#Configuring_Applications>.
|
||||
|
||||
The icon.png should be a PNG with 128x48 dimensions. See:
|
||||
<https://wiibrew.org/wiki/Homebrew_Channel#Adding_an_Icon>.
|
||||
<https://wiibrew.org/wiki/Homebrew_Channel_icons>.
|
||||
-->
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
||||
<app version="1">
|
||||
<!-- The name of the application -->
|
||||
<name>wii-pong</name>
|
||||
|
||||
<!-- The name of the person or group that wrote the code for the program. -->
|
||||
<coder>alex</coder>
|
||||
|
||||
<!-- The version of the application. -->
|
||||
<version></version>
|
||||
|
||||
<!--
|
||||
The data the application was released. It has to be a timestamp using
|
||||
this format: YYYYmmddHHMMSS
|
||||
-->
|
||||
<release_date></release_date>
|
||||
|
||||
<!--
|
||||
This is displayed on the main menu of the Homebrew Channel (before you
|
||||
select an application) and is used as a space to add a few words to
|
||||
describe the program.
|
||||
-->
|
||||
<short_description></short_description>
|
||||
|
||||
<!--
|
||||
This is displayed once the application is chosen. It describes the program
|
||||
and its function in great detail, and can be used to elaborate on a
|
||||
program's controls.
|
||||
-->
|
||||
<long_description></long_description>
|
||||
</app>
|
|
@ -0,0 +1,37 @@
|
|||
#include <cstdint>
|
||||
#include <cstdlib>
|
||||
|
||||
#include <gccore.h>
|
||||
#include <wiiuse/wpad.h>
|
||||
|
||||
#include "screen.h"
|
||||
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
auto screen = Screen{};
|
||||
|
||||
WPAD_Init();
|
||||
|
||||
Paddle my_paddle{ screen.height(), 15, 5 };
|
||||
|
||||
auto exit = false;
|
||||
while (!exit)
|
||||
{
|
||||
// Call WPAD_ScanPads each loop, this reads the latest controller states
|
||||
WPAD_ScanPads();
|
||||
const auto pressed = WPAD_ButtonsDown(0);
|
||||
if (pressed & WPAD_BUTTON_HOME)
|
||||
exit = true;
|
||||
|
||||
// Clear the frame buffer.
|
||||
screen.clear();
|
||||
|
||||
// drawing goes here
|
||||
|
||||
// Wait for the next frame
|
||||
screen.wait_for_vsync();
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
|
@ -0,0 +1,58 @@
|
|||
#include "screen.h"
|
||||
|
||||
#include <gccore.h>
|
||||
|
||||
Screen::Screen()
|
||||
{
|
||||
// Initialise the video system
|
||||
VIDEO_Init();
|
||||
|
||||
// Obtain the preferred video mode from the system
|
||||
// This will correspond to the settings in the Wii menu
|
||||
_rmode = VIDEO_GetPreferredMode(NULL);
|
||||
|
||||
// Allocate memory for the display in the uncached region
|
||||
_xfb = MEM_K0_TO_K1(SYS_AllocateFramebuffer(_rmode));
|
||||
|
||||
// Set up the video registers with the chosen mode
|
||||
VIDEO_Configure(_rmode);
|
||||
|
||||
// Tell the video hardware where our display memory is
|
||||
VIDEO_SetNextFramebuffer(_xfb);
|
||||
|
||||
// Make the display visible
|
||||
VIDEO_SetBlack(FALSE);
|
||||
|
||||
// Flush the video register changes to the hardware
|
||||
VIDEO_Flush();
|
||||
|
||||
// Wait for Video setup to complete
|
||||
VIDEO_WaitVSync();
|
||||
if (_rmode->viTVMode & VI_NON_INTERLACE)
|
||||
VIDEO_WaitVSync();
|
||||
}
|
||||
|
||||
void Screen::clear() noexcept
|
||||
{
|
||||
VIDEO_ClearFrameBuffer(_rmode, _xfb, COLOR_BLACK);
|
||||
}
|
||||
|
||||
void Screen::draw(int x, int y, uint16_t colour) noexcept
|
||||
{
|
||||
reinterpret_cast<uint16_t*>(_xfb)[(y * _rmode->fbWidth) + x] = colour;
|
||||
}
|
||||
|
||||
void Screen::wait_for_vsync() const noexcept
|
||||
{
|
||||
VIDEO_WaitVSync();
|
||||
}
|
||||
|
||||
int Screen::width() const noexcept
|
||||
{
|
||||
return _rmode->fbWidth;
|
||||
}
|
||||
|
||||
int Screen::height() const noexcept
|
||||
{
|
||||
return _rmode->xfbHeight;
|
||||
}
|
|
@ -0,0 +1,43 @@
|
|||
#pragma once
|
||||
|
||||
#include <cstdint>
|
||||
|
||||
#include <gccore.h>
|
||||
|
||||
|
||||
/// Class for drawing to the screen, simple abstraction around the raw
|
||||
/// framebuffer.
|
||||
class Screen final
|
||||
{
|
||||
public:
|
||||
/// Constructor.
|
||||
///
|
||||
/// \remarks Automatically selects the display settings.
|
||||
Screen();
|
||||
|
||||
/// Clear the screen.
|
||||
void clear() noexcept;
|
||||
|
||||
/// Draw a pixel to the screen.
|
||||
///
|
||||
/// \param x The x-coordinate to draw to.
|
||||
/// \param y The y-coordinate to draw to.
|
||||
/// \param colour The colour value to draw to the coordinate.
|
||||
void draw(int x, int y, uint16_t colour) noexcept;
|
||||
|
||||
/// Wait for a v-sync.
|
||||
void wait_for_vsync() const noexcept;
|
||||
|
||||
/// \return The width of the screen in pixels.
|
||||
int width() const noexcept;
|
||||
|
||||
/// \return The height of the screen in pixels.
|
||||
int height() const noexcept;
|
||||
|
||||
private:
|
||||
/// The allocated framebuffer.
|
||||
void* _xfb;
|
||||
|
||||
/// The rendermode object.
|
||||
GXRModeObj* _rmode;
|
||||
};
|
Loading…
Reference in New Issue