Add initial Wii code
This commit is contained in:
parent
9ef7d8e075
commit
9b802afe65
138
wii/Makefile
Normal file
138
wii/Makefile
Normal file
@ -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
|
||||||
|
#---------------------------------------------------------------------------------
|
BIN
wii/icon.png
Normal file
BIN
wii/icon.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 11 KiB |
39
wii/meta.xml
Normal file
39
wii/meta.xml
Normal file
@ -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>
|
37
wii/source/main.cpp
Normal file
37
wii/source/main.cpp
Normal file
@ -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;
|
||||||
|
}
|
58
wii/source/screen.cpp
Normal file
58
wii/source/screen.cpp
Normal file
@ -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;
|
||||||
|
}
|
43
wii/source/screen.h
Normal file
43
wii/source/screen.h
Normal file
@ -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…
x
Reference in New Issue
Block a user