add 3d game
I added a simple 3D maze game that is a pretty impressive demo of what Microwatt can do. It's based on #347 Signed-off-by: Jacob Lifshay <programmerjake@gmail.com>pull/354/head^2
							parent
							
								
									9cb4948690
								
							
						
					
					
						commit
						73835ceb1b
					
				| @ -1,11 +1,24 @@ | ||||
| #pragma once | ||||
|  | ||||
| #include <stdbool.h> | ||||
| #include <stddef.h> | ||||
|  | ||||
| #ifdef __cplusplus | ||||
| extern "C" | ||||
| { | ||||
| #endif | ||||
|  | ||||
| void console_init(void); | ||||
| void console_set_irq_en(bool rx_irq, bool tx_irq); | ||||
| int getchar(void); | ||||
| bool console_havechar(void); | ||||
| int putchar(int c); | ||||
| int puts(const char *str); | ||||
|  | ||||
| #ifndef __USE_LIBC | ||||
| size_t strlen(const char *s); | ||||
| #endif | ||||
|  | ||||
| #ifdef __cplusplus | ||||
| } | ||||
| #endif | ||||
|  | ||||
| @ -1,7 +1,18 @@ | ||||
| #pragma once | ||||
|  | ||||
| #include <stdbool.h> | ||||
|  | ||||
| #ifdef __cplusplus | ||||
| extern "C" | ||||
| { | ||||
| #endif | ||||
|  | ||||
| int usb_getchar(void); | ||||
| bool usb_havechar(void); | ||||
| int usb_putchar(int c); | ||||
| int usb_puts(const char *str); | ||||
| void usb_console_init(void); | ||||
|  | ||||
| #ifdef __cplusplus | ||||
| } | ||||
| #endif | ||||
|  | ||||
| @ -0,0 +1,6 @@ | ||||
| usb_3d_game_emu | ||||
| *.o | ||||
| *.elf | ||||
| *.hex | ||||
| *.bin | ||||
|  | ||||
| @ -0,0 +1,44 @@ | ||||
| ARCH = $(shell uname -m) | ||||
| ifneq ("$(ARCH)", "ppc64") | ||||
| ifneq ("$(ARCH)", "ppc64le") | ||||
| 	CROSS_COMPILE ?= powerpc64le-linux-gnu- | ||||
| endif | ||||
| endif | ||||
|  | ||||
| CC = $(CROSS_COMPILE)gcc | ||||
| CXX = $(CROSS_COMPILE)g++ | ||||
| LD = $(CROSS_COMPILE)ld | ||||
| OBJCOPY = $(CROSS_COMPILE)objcopy | ||||
|  | ||||
| COMMON_FLAGS = -Os -g -Wall -msoft-float -mno-string -mno-multiple -mno-vsx -mno-altivec -mlittle-endian -fno-stack-protector -mstrict-align -ffreestanding -fdata-sections -ffunction-sections -I../include | ||||
| COMMON_FLAGS += -Werror -Wextra | ||||
| CXXFLAGS = $(COMMON_FLAGS) -std=c++14 -fno-exceptions | ||||
| CFLAGS = $(COMMON_FLAGS) -std=c99 | ||||
| ASFLAGS = $(CFLAGS) | ||||
| LDFLAGS = -T powerpc.lds | ||||
|  | ||||
| all: usb_3d_game.hex | ||||
|  | ||||
| console.o: ../lib/console.c | ||||
| 	$(CC) $(CPPFLAGS) $(CFLAGS) -c $< -o $@ | ||||
|  | ||||
| liteuart_console.o: ../lib/liteuart_console.c | ||||
| 	$(CC) $(CPPFLAGS) $(CFLAGS) -c $< -o $@ | ||||
|  | ||||
| usb_3d_game.elf: usb_3d_game.o head.o console.o liteuart_console.o | ||||
| 	$(LD) $(LDFLAGS) -o $@ $^ | ||||
|  | ||||
| usb_3d_game.bin: usb_3d_game.elf | ||||
| 	$(OBJCOPY) -O binary $^ $@ | ||||
|  | ||||
| usb_3d_game.hex: usb_3d_game.bin | ||||
| 	../scripts/bin2hex.py $^ > $@ | ||||
|  | ||||
| usb_3d_game_emu: usb_3d_game.cpp | ||||
| 	c++ -g -Wall -std=c++14 -Werror -Wextra -o usb_3d_game_emu usb_3d_game.cpp -DEMULATE_TARGET | ||||
|  | ||||
| clean: | ||||
| 	@rm -f *.o usb_3d_game.elf usb_3d_game.bin usb_3d_game.hex usb_3d_game_emu | ||||
| distclean: clean | ||||
| 	rm -f *~ | ||||
|  | ||||
| @ -0,0 +1,39 @@ | ||||
| # 3D Maze Game | ||||
|  | ||||
| Based on: <https://github.com/programmerjake/rv32/tree/v0.1.0.1-alpha/software> | ||||
|  | ||||
| # Run without FPGA/hardware-simulation | ||||
|  | ||||
| Resize your terminal to be at least 100x76. | ||||
|  | ||||
| Building: | ||||
| ```bash | ||||
| cd usb_3d_game | ||||
| make usb_3d_game_emu | ||||
| ``` | ||||
|  | ||||
| Running: | ||||
| ```bash | ||||
| ./usb_3d_game_emu | ||||
| ``` | ||||
|  | ||||
| # Run on OrangeCrab v0.2.1 | ||||
|  | ||||
| Set the OrangeCrab into firmware upload mode by plugging it in to USB while the button is pressed, then run the following commands: | ||||
|  | ||||
| Building/Flashing: | ||||
| ```bash | ||||
| (cd usb_3d_game; make) | ||||
| sudo make FPGA_TARGET=ORANGE-CRAB-0.21 dfuprog DOCKER=1 LITEDRAM_GHDL_ARG=-gUSE_LITEDRAM=false RAM_INIT_FILE=usb_3d_game/usb_3d_game.hex MEMORY_SIZE=$((1<<18)) | ||||
| ``` | ||||
|  | ||||
| Then, in a separate terminal that you've resized to be at least 100x76, run (replacing ttyACM0 with whatever serial device the OrangeCrab is): | ||||
| ```bash | ||||
| sudo tio /dev/ttyACM0 | ||||
| ``` | ||||
|  | ||||
| # Controls | ||||
|  | ||||
| Use WASD or the Arrow keys to move around. Press Ctrl+C to quit or restart. | ||||
|  | ||||
| The goal is a set of flashing blocks, nothing special yet happens when you reach them though. | ||||
| @ -0,0 +1,107 @@ | ||||
| /* Copyright 2013-2014 IBM Corp. | ||||
|  * | ||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||
|  * you may not use this file except in compliance with the License. | ||||
|  * You may obtain a copy of the License at | ||||
|  * | ||||
|  * 	http://www.apache.org/licenses/LICENSE-2.0 | ||||
|  * | ||||
|  * Unless required by applicable law or agreed to in writing, software | ||||
|  * distributed under the License is distributed on an "AS IS" BASIS, | ||||
|  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or | ||||
|  * implied. | ||||
|  * See the License for the specific language governing permissions and | ||||
|  * limitations under the License. | ||||
|  */ | ||||
|  | ||||
| #define STACK_TOP 0x20000 | ||||
|  | ||||
| #define FIXUP_ENDIAN						   \ | ||||
| 	tdi   0,0,0x48;	  /* Reverse endian of b . + 8		*/ \ | ||||
| 	b     191f;	  /* Skip trampoline if endian is good	*/ \ | ||||
| 	.long 0xa600607d; /* mfmsr r11				*/ \ | ||||
| 	.long 0x01006b69; /* xori r11,r11,1			*/ \ | ||||
| 	.long 0x05009f42; /* bcl 20,31,$+4			*/ \ | ||||
| 	.long 0xa602487d; /* mflr r10				*/ \ | ||||
| 	.long 0x14004a39; /* addi r10,r10,20			*/ \ | ||||
| 	.long 0xa64b5a7d; /* mthsrr0 r10			*/ \ | ||||
| 	.long 0xa64b7b7d; /* mthsrr1 r11			*/ \ | ||||
| 	.long 0x2402004c; /* hrfid				*/ \ | ||||
| 191: | ||||
|  | ||||
|  | ||||
| /* Load an immediate 64-bit value into a register */ | ||||
| #define LOAD_IMM64(r, e)			\ | ||||
| 	lis     r,(e)@highest;			\ | ||||
| 	ori     r,r,(e)@higher;			\ | ||||
| 	rldicr  r,r, 32, 31;			\ | ||||
| 	oris    r,r, (e)@h;			\ | ||||
| 	ori     r,r, (e)@l; | ||||
|  | ||||
| 	.section ".head","ax" | ||||
|  | ||||
| 	/* | ||||
| 	 * Microwatt currently enters in LE mode at 0x0, so we don't need to | ||||
| 	 * do any endian fix ups> | ||||
| 	 */ | ||||
| 	. = 0 | ||||
| .global _start | ||||
| _start: | ||||
| 	b	boot_entry | ||||
|  | ||||
| 	/* QEMU enters at 0x10 */ | ||||
| 	. = 0x10 | ||||
| 	FIXUP_ENDIAN | ||||
| 	b	boot_entry | ||||
|  | ||||
| 	. = 0x100 | ||||
| 	FIXUP_ENDIAN | ||||
| 	b	boot_entry | ||||
|  | ||||
| .global boot_entry | ||||
| boot_entry: | ||||
| 	/* setup stack */ | ||||
| 	LOAD_IMM64(%r1, STACK_TOP - 0x100) | ||||
| 	LOAD_IMM64(%r12, main) | ||||
| 	mtctr	%r12, | ||||
| 	bctrl | ||||
| 	b . | ||||
|  | ||||
| #define EXCEPTION(nr)		\ | ||||
| 	.= nr			;\ | ||||
| 	b	. | ||||
|  | ||||
| 	/* More exception stubs */ | ||||
| 	EXCEPTION(0x300) | ||||
| 	EXCEPTION(0x380) | ||||
| 	EXCEPTION(0x400) | ||||
| 	EXCEPTION(0x480) | ||||
| 	EXCEPTION(0x500) | ||||
| 	EXCEPTION(0x600) | ||||
| 	EXCEPTION(0x700) | ||||
| 	EXCEPTION(0x800) | ||||
| 	EXCEPTION(0x900) | ||||
| 	EXCEPTION(0x980) | ||||
| 	EXCEPTION(0xa00) | ||||
| 	EXCEPTION(0xb00) | ||||
| 	EXCEPTION(0xc00) | ||||
| 	EXCEPTION(0xd00) | ||||
| 	EXCEPTION(0xe00) | ||||
| 	EXCEPTION(0xe20) | ||||
| 	EXCEPTION(0xe40) | ||||
| 	EXCEPTION(0xe60) | ||||
| 	EXCEPTION(0xe80) | ||||
| 	EXCEPTION(0xf00) | ||||
| 	EXCEPTION(0xf20) | ||||
| 	EXCEPTION(0xf40) | ||||
| 	EXCEPTION(0xf60) | ||||
| 	EXCEPTION(0xf80) | ||||
| #if 0 | ||||
| 	EXCEPTION(0x1000) | ||||
| 	EXCEPTION(0x1100) | ||||
| 	EXCEPTION(0x1200) | ||||
| 	EXCEPTION(0x1300) | ||||
| 	EXCEPTION(0x1400) | ||||
| 	EXCEPTION(0x1500) | ||||
| 	EXCEPTION(0x1600) | ||||
| #endif | ||||
| @ -0,0 +1,13 @@ | ||||
| SECTIONS | ||||
| { | ||||
| 	. = 0; | ||||
| 	.head : { | ||||
| 		KEEP(*(.head)) | ||||
|  	} | ||||
| 	. = 0x1000; | ||||
| 	.text : { *(.text) } | ||||
| 	. = 0x2a000; | ||||
| 	.data : { *(.data) } | ||||
| 	.rodata : { *(.rodata) } | ||||
| 	.bss : { *(.bss) } | ||||
| } | ||||
											
												
													File diff suppressed because it is too large
													Load Diff
												
											
										
									
								
					Loading…
					
					
				
		Reference in New Issue
	
	 Jacob Lifshay
						Jacob Lifshay