@ -0,0 +1,3 @@ |
|||||
|
[submodule "src/rfm12/rfm12_lib"] |
||||
|
path = src/rfm12/rfm12_lib |
||||
|
url = https://github.com/das-labor/librfm12.git |
@ -0,0 +1,13 @@ |
|||||
|
language: c |
||||
|
|
||||
|
# install dependencies |
||||
|
before_install: |
||||
|
- uname -a |
||||
|
- lsb_release -a |
||||
|
|
||||
|
install: |
||||
|
- sudo apt-get install -qq libncurses5-dev gcc-avr avr-libc |
||||
|
|
||||
|
# run tests |
||||
|
script: |
||||
|
- make test |
@ -1,27 +0,0 @@ |
|||||
|
|
||||
**** Ubuntu Linux ***** |
|
||||
To Compile for the AVR you'll need the packages gcc-avr and avr-libc. You'll |
|
||||
also need gcc and libncurses to be able to use menuconfig. To use the simulator |
|
||||
you'll also need libglut. |
|
||||
|
|
||||
Type |
|
||||
$ make menuconfig |
|
||||
and set your settings or load one of the default profiles. Then type |
|
||||
$ make |
|
||||
to compile for the avr. You can upload the image to a borg-16's serial |
|
||||
bootloader (foodloader) by typing |
|
||||
$ make sflash |
|
||||
. |
|
||||
|
|
||||
|
|
||||
****Windows XP**** |
|
||||
Under Windows you'll need to install the following things: |
|
||||
-WinAVR |
|
||||
-Cygwin with the following packages: |
|
||||
--gcc |
|
||||
--libncurses-devel |
|
||||
--make (the one that WinAVR delivers doesn't work right) |
|
||||
--opengl (for the simulator) |
|
||||
|
|
||||
now go to the cygwin bash shell and use the same commands as with Linux to |
|
||||
compile and flash. |
|
@ -1,32 +0,0 @@ |
|||||
|
|
||||
OBJ = borg_hw.o main.o util.o pixel.o program.o borg_can.o can.o \ |
|
||||
spi.o scrolltext3.o font_arial8.o joystick.o snake.o \ |
|
||||
eeprom_reserve.o persistentCounter.o prng.o matrix.o \ |
|
||||
invader_draw.o invader_init.o invader_proc.o invaders2.o \ |
|
||||
tetris/tetris.o menu.o gameoflife.o memxor.o noekeon_asm.o \ |
|
||||
mcuf.o uart.o |
|
||||
|
|
||||
CANADDR = 0x43 |
|
||||
|
|
||||
SERIAL = /dev/ttyUSB0 |
|
||||
|
|
||||
include ../../make/avr.mk |
|
||||
|
|
||||
.PHONY: tetris/tetris.o |
|
||||
tetris/tetris.o: |
|
||||
$(MAKE) "MCU_CC=$(MCU_CC)" "MCU_LD=$(MCU_LD)" "LDFLAGS=$(LDFLAGS)" \ |
|
||||
"CFLAGS=$(CFLAGS) -DNDEBUG -pedantic -std=c99" --directory=tetris |
|
||||
|
|
||||
LAUNCH_BOOTLOADER = launch-bootloader |
|
||||
|
|
||||
sflash: $(OUT).hex |
|
||||
$(LAUNCH_BOOTLOADER) $(SERIAL) 115200 |
|
||||
avrdude -p m32 -b 115200 -u -c avr109 -P $(SERIAL) -U f:w:$(OUT).hex -F |
|
||||
echo X > $(SERIAL) |
|
||||
|
|
||||
urflash: image_with_bootloader.hex |
|
||||
avrdude -p m32 -c bsd -P /dev/parport0 -U hfuse:w:0xdc:m |
|
||||
avrdude -p m32 -c bsd -P /dev/parport0 -U lfuse:w:0xef:m |
|
||||
avrdude -p m32 -c bsd -P /dev/parport0 -U f:w:image_with_bootloader.hex |
|
||||
avrdude -p m32 -c bsd -P /dev/parport0 -U e:w:image_eeprom.hex |
|
||||
avrdude -p m32 -c bsd -P /dev/parport0 -U lock:w:0x2f:m |
|
@ -0,0 +1,122 @@ |
|||||
|
Borgware-2D |
||||
|
=========== |
||||
|
|
||||
|
Firmware for AVR based two-dimensional LED matrices, especially the |
||||
|
[Blinken Borgs](http://www.das-labor.org/wiki/Blinken_Borgs) from |
||||
|
[Das LABOR](http://das-labor.org/index.en.php). |
||||
|
Main platform is the [Borg16](http://www.das-labor.org/wiki/Borg16) construction |
||||
|
kit. Other supported platforms are the |
||||
|
[LED Brett](http://www.hackerspace-ffm.de/wiki/index.php?title=LedBrett) |
||||
|
projector from [Hackerspace FFM](http://www.hackerspace-ffm.de) or the |
||||
|
[ELO Ping-Pong Board](http://www.elo-web.de/elo/mikrocontroller-und-programmierung/ping-pong/das-franzis-pingpong). |
||||
|
|
||||
|
![Small Borg16](/doc/img/Borg16-small.jpg) |
||||
|
![Glow Lamp Borg](/doc/img/Glow_Lamp_Borg.jpg) |
||||
|
|
||||
|
Animations |
||||
|
---------- |
||||
|
|
||||
|
![Matrix](/doc/img/anim-matrix.png) |
||||
|
![Fire](/doc/img/anim-feuer.png) |
||||
|
![Scrolling Text](/doc/img/anim-scroll.png) |
||||
|
|
||||
|
[Animated GIF (3.5 MB)](/doc/img/borg_anim.gif) |
||||
|
|
||||
|
Games |
||||
|
----- |
||||
|
|
||||
|
![Snake](/doc/img/game-snake.png) |
||||
|
![Tetris](/doc/img/game-tetris.png) |
||||
|
|
||||
|
* Tetris |
||||
|
* Classic: Standard Tetris Clone |
||||
|
* First Person Tetris: Rotate the bucket instead of the Tetromino. |
||||
|
* Bastet: Dices the worst the possible Tetromino the whole time. |
||||
|
* Snake |
||||
|
* Breakout |
||||
|
* Space Invaders |
||||
|
|
||||
|
Build |
||||
|
===== |
||||
|
|
||||
|
Supported build platforms are Linux, FreeBSD and Windows (via Cygwin). Due to |
||||
|
customized linker scripts, simulator support is currently limited to x86 and |
||||
|
x86_64 archs. Following dependencies have to be met: |
||||
|
|
||||
|
Linux / FreeBSD |
||||
|
--------------- |
||||
|
|
||||
|
Package names are based on Debian/Ubuntu repositories. Please adapt the names |
||||
|
according to your Linux distribution (or FreeBSD for that matter). |
||||
|
|
||||
|
* build-essential (pulls in an ordinary gcc build tool chain for the host) |
||||
|
* bc |
||||
|
* make (gmake on FreeBSD) |
||||
|
* libncurses5-dev |
||||
|
* gcc-avr |
||||
|
* avr-libc |
||||
|
* binutils-avr |
||||
|
* avrdude |
||||
|
* freeglut3-dev |
||||
|
|
||||
|
Windows |
||||
|
------- |
||||
|
* AVR GCC toolchain for Windows, choose your poison: |
||||
|
* [WinAVR](http://winavr.sourceforge.net) |
||||
|
* already includes [avrdude](http://www.nongnu.org/avrdude/) |
||||
|
* installer offers to add the toolchain to the system path |
||||
|
* straight forward download from SourceForge |
||||
|
* project abandoned in 2010, therefore heavily outdated (avr-gcc 4.3.3) |
||||
|
* [Atmel AVR Toolchain for Windows](http://www.atmel.com/tools/atmelavrtoolchainforwindows.aspx) |
||||
|
* actively maintained, therefore fairly up to date |
||||
|
* homepage nags you with rather awkward registration process before download |
||||
|
* you have to add the toolchain to the system path manually |
||||
|
* avrdude is not included (but it is possible to install WinAVR in parallel) |
||||
|
* [Cygwin(64)](http://www.cygwin.com/) |
||||
|
* bc |
||||
|
* make |
||||
|
* gcc-core |
||||
|
* gdb (in case you want to debug your code in the simulator) |
||||
|
* libncurses-devel (Cygwin) |
||||
|
* libncursesw-devel (Cygwin64) |
||||
|
* [libusb-win32](http://sourceforge.net/apps/trac/libusb-win32/wiki) in case you |
||||
|
want to use an USBasp programmer device with avrdude |
||||
|
|
||||
|
Configure |
||||
|
--------- |
||||
|
|
||||
|
Open a (Cygwin) terminal, change to your checkout directory and type: |
||||
|
> make menuconfig |
||||
|
|
||||
|
This starts a curses based text interface for configuring certain aspects of |
||||
|
your target platform. Be careful if you use an IDE like Eclipse to manage the |
||||
|
build, as integrated terminal emulators tend to choke on curses generated shell |
||||
|
output. Make sure that 'make menuconfig' has been run at least once in an |
||||
|
ordinary terminal emulator after a fresh checkout or after issuing 'make |
||||
|
mrproper'. |
||||
|
|
||||
|
Compile |
||||
|
------- |
||||
|
|
||||
|
To build for the actual target platform, just type: |
||||
|
> make |
||||
|
|
||||
|
If you want to test and debug your code within a GUI application, you can use |
||||
|
the simulator: |
||||
|
> make simulator |
||||
|
|
||||
|
In case you build on FreeBSD, just use 'gmake' instead of 'make'. |
||||
|
|
||||
|
You can start the simulator by typing ./borgsim(.exe) |
||||
|
|
||||
|
Simulator Handling |
||||
|
------------------ |
||||
|
|
||||
|
Please keep in mind that the simulator is NOT an emulator. All it does is |
||||
|
compile the source code to a native host application so you can step through |
||||
|
your C-Code. The GUI thread reads the simulated frame buffer every 40ms and |
||||
|
draws its contents. |
||||
|
|
||||
|
Joystick directions are simulated by the WASD keys and SPACE acts as the fire |
||||
|
button. The OpenGL based simulator (Linux/FreeBSD) enables you to adjust the |
||||
|
viewing angle of the LED matrix via the arrow keys (not available on Windows). |
@ -1,7 +0,0 @@ |
|||||
|
|
||||
Hier liegt der Versuch, eine universelle Codebasis für 2d-borgs zu bauen, die |
|
||||
durch 'make menuconfig' konfigurierbar ist. |
|
||||
Zur Zeit ist es bereits möglich, gewisse Dinge in menuconfig einzustellen. |
|
||||
Einfach mal ansehen! Compiliert werden kann das Ganze auch schon. |
|
||||
Außerdem wird grade versucht, das Ganze mit dem Borg-api-Simulator zu |
|
||||
integrieren. |
|
@ -1,13 +0,0 @@ |
|||||
TARGET = libcan.a |
|
||||
TOPDIR = .. |
|
||||
|
|
||||
include $(TOPDIR)/defaults.mk |
|
||||
|
|
||||
ifeq ($(CAN_SUPPORT),y) |
|
||||
SRC = can.c |
|
||||
SRC += borg_can.c |
|
||||
SRC += lap.c |
|
||||
SRC += spi.c |
|
||||
endif |
|
||||
|
|
||||
include $(TOPDIR)/rules.mk |
|
After Width: | Height: | Size: 24 KiB |
After Width: | Height: | Size: 34 KiB |
After Width: | Height: | Size: 6.9 KiB |
After Width: | Height: | Size: 3.7 KiB |
After Width: | Height: | Size: 3.1 KiB |
After Width: | Height: | Size: 3.3 MiB |
After Width: | Height: | Size: 1.9 KiB |
After Width: | Height: | Size: 5.2 KiB |
@ -1,10 +0,0 @@ |
|||||
TARGET = |
|
||||
TOPDIR = ../.. |
|
||||
|
|
||||
include $(TOPDIR)/defaults.mk |
|
||||
|
|
||||
ifeq ($(GAME_BREAKOUT),y) |
|
||||
SRC = breakout.c playfield.c rebound.c score.c level.c ball.c messages.c |
|
||||
endif |
|
||||
|
|
||||
include $(TOPDIR)/rules.mk |
|
@ -1,8 +0,0 @@ |
|||||
TARGET = |
|
||||
TOPDIR = ../.. |
|
||||
|
|
||||
include $(TOPDIR)/defaults.mk |
|
||||
|
|
||||
SRC = kart.c |
|
||||
|
|
||||
include $(TOPDIR)/rules.mk |
|
@ -1,8 +0,0 @@ |
|||||
TARGET = |
|
||||
TOPDIR = ../.. |
|
||||
|
|
||||
include $(TOPDIR)/defaults.mk |
|
||||
|
|
||||
SRC = snake_game.c |
|
||||
|
|
||||
include $(TOPDIR)/rules.mk |
|
@ -1,8 +0,0 @@ |
|||||
TARGET = |
|
||||
TOPDIR = ../.. |
|
||||
|
|
||||
include $(TOPDIR)/defaults.mk |
|
||||
|
|
||||
SRC = invader_init.c invader_draw.c invader_proc.c invaders2.c |
|
||||
|
|
||||
include $(TOPDIR)/rules.mk |
|
@ -0,0 +1,231 @@ |
|||||
|
/* Default linker script, for normal executables */ |
||||
|
OUTPUT_FORMAT("elf32-avr","elf32-avr","elf32-avr") |
||||
|
OUTPUT_ARCH(avr:51) |
||||
|
MEMORY |
||||
|
{ |
||||
|
text (rx) : ORIGIN = 0, LENGTH = 128K |
||||
|
data (rw!x) : ORIGIN = 0x800060, LENGTH = 0xffa0 |
||||
|
eeprom (rw!x) : ORIGIN = 0x810000, LENGTH = 64K |
||||
|
fuse (rw!x) : ORIGIN = 0x820000, LENGTH = 1K |
||||
|
lock (rw!x) : ORIGIN = 0x830000, LENGTH = 1K |
||||
|
signature (rw!x) : ORIGIN = 0x840000, LENGTH = 1K |
||||
|
} |
||||
|
SECTIONS |
||||
|
{ |
||||
|
/* Read-only sections, merged into text segment: */ |
||||
|
.hash : { *(.hash) } |
||||
|
.dynsym : { *(.dynsym) } |
||||
|
.dynstr : { *(.dynstr) } |
||||
|
.gnu.version : { *(.gnu.version) } |
||||
|
.gnu.version_d : { *(.gnu.version_d) } |
||||
|
.gnu.version_r : { *(.gnu.version_r) } |
||||
|
.rel.init : { *(.rel.init) } |
||||
|
.rela.init : { *(.rela.init) } |
||||
|
.rel.text : |
||||
|
{ |
||||
|
*(.rel.text) |
||||
|
*(.rel.text.*) |
||||
|
*(.rel.gnu.linkonce.t*) |
||||
|
} |
||||
|
.rela.text : |
||||
|
{ |
||||
|
*(.rela.text) |
||||
|
*(.rela.text.*) |
||||
|
*(.rela.gnu.linkonce.t*) |
||||
|
} |
||||
|
.rel.fini : { *(.rel.fini) } |
||||
|
.rela.fini : { *(.rela.fini) } |
||||
|
.rel.rodata : |
||||
|
{ |
||||
|
*(.rel.rodata) |
||||
|
*(.rel.rodata.*) |
||||
|
*(.rel.gnu.linkonce.r*) |
||||
|
} |
||||
|
.rela.rodata : |
||||
|
{ |
||||
|
*(.rela.rodata) |
||||
|
*(.rela.rodata.*) |
||||
|
*(.rela.gnu.linkonce.r*) |
||||
|
} |
||||
|
.rel.data : |
||||
|
{ |
||||
|
*(.rel.data) |
||||
|
*(.rel.data.*) |
||||
|
*(.rel.gnu.linkonce.d*) |
||||
|
} |
||||
|
.rela.data : |
||||
|
{ |
||||
|
*(.rela.data) |
||||
|
*(.rela.data.*) |
||||
|
*(.rela.gnu.linkonce.d*) |
||||
|
} |
||||
|
.rel.ctors : { *(.rel.ctors) } |
||||
|
.rela.ctors : { *(.rela.ctors) } |
||||
|
.rel.dtors : { *(.rel.dtors) } |
||||
|
.rela.dtors : { *(.rela.dtors) } |
||||
|
.rel.got : { *(.rel.got) } |
||||
|
.rela.got : { *(.rela.got) } |
||||
|
.rel.bss : { *(.rel.bss) } |
||||
|
.rela.bss : { *(.rela.bss) } |
||||
|
.rel.plt : { *(.rel.plt) } |
||||
|
.rela.plt : { *(.rela.plt) } |
||||
|
/* Internal text space or external memory. */ |
||||
|
.text : |
||||
|
{ |
||||
|
*(.vectors) |
||||
|
KEEP(*(.vectors)) |
||||
|
/* For data that needs to reside in the lower 64k of progmem. */ |
||||
|
*(.progmem.gcc*) |
||||
|
*(.progmem*) |
||||
|
. = ALIGN(2); |
||||
|
__trampolines_start = . ; |
||||
|
/* The jump trampolines for the 16-bit limited relocs will reside here. */ |
||||
|
*(.trampolines) |
||||
|
*(.trampolines*) |
||||
|
__trampolines_end = . ; |
||||
|
/* For future tablejump instruction arrays for 3 byte pc devices. |
||||
|
We don't relax jump/call instructions within these sections. */ |
||||
|
*(.jumptables) |
||||
|
*(.jumptables*) |
||||
|
/* For code that needs to reside in the lower 128k progmem. */ |
||||
|
*(.lowtext) |
||||
|
*(.lowtext*) |
||||
|
__ctors_start = . ; |
||||
|
*(.ctors) |
||||
|
__ctors_end = . ; |
||||
|
__dtors_start = . ; |
||||
|
*(.dtors) |
||||
|
__dtors_end = . ; |
||||
|
KEEP(SORT(*)(.ctors)) |
||||
|
KEEP(SORT(*)(.dtors)) |
||||
|
/* From this point on, we don't bother about wether the insns are |
||||
|
below or above the 16 bits boundary. */ |
||||
|
*(.init0) /* Start here after reset. */ |
||||
|
KEEP (*(.init0)) |
||||
|
*(.init1) |
||||
|
KEEP (*(.init1)) |
||||
|
*(.init2) /* Clear __zero_reg__, set up stack pointer. */ |
||||
|
KEEP (*(.init2)) |
||||
|
*(.init3) |
||||
|
KEEP (*(.init3)) |
||||
|
*(.init4) /* Initialize data and BSS. */ |
||||
|
KEEP (*(.init4)) |
||||
|
*(.init5) |
||||
|
KEEP (*(.init5)) |
||||
|
*(.init6) /* C++ constructors. */ |
||||
|
KEEP (*(.init6)) |
||||
|
*(.init7) |
||||
|
KEEP (*(.init7)) |
||||
|
*(.init8) |
||||
|
KEEP (*(.init8)) |
||||
|
*(.init9) /* Call main(). */ |
||||
|
KEEP (*(.init9)) |
||||
|
*(.text) |
||||
|
. = ALIGN(2); |
||||
|
*(.text.*) |
||||
|
. = ALIGN(2); |
||||
|
*(.fini9) /* _exit() starts here. */ |
||||
|
KEEP (*(.fini9)) |
||||
|
*(.fini8) |
||||
|
KEEP (*(.fini8)) |
||||
|
*(.fini7) |
||||
|
KEEP (*(.fini7)) |
||||
|
*(.fini6) /* C++ destructors. */ |
||||
|
KEEP (*(.fini6)) |
||||
|
*(.fini5) |
||||
|
KEEP (*(.fini5)) |
||||
|
*(.fini4) |
||||
|
KEEP (*(.fini4)) |
||||
|
*(.fini3) |
||||
|
KEEP (*(.fini3)) |
||||
|
*(.fini2) |
||||
|
KEEP (*(.fini2)) |
||||
|
*(.fini1) |
||||
|
KEEP (*(.fini1)) |
||||
|
*(.fini0) /* Infinite loop after program termination. */ |
||||
|
KEEP (*(.fini0)) |
||||
|
_etext = . ; |
||||
|
} > text |
||||
|
.data : AT (ADDR (.text) + SIZEOF (.text)) |
||||
|
{ |
||||
|
PROVIDE (__data_start = .) ; |
||||
|
*(.data) |
||||
|
*(.data*) |
||||
|
*(.rodata) /* We need to include .rodata here if gcc is used */ |
||||
|
*(.rodata*) /* with -fdata-sections. */ |
||||
|
*(.gnu.linkonce.d*) |
||||
|
PROVIDE (_game_descriptors_start__ = .) ; |
||||
|
*(.game_descriptors) |
||||
|
PROVIDE (_game_descriptors_end__ = .) ; |
||||
|
. = ALIGN(2); |
||||
|
_edata = . ; |
||||
|
PROVIDE (__data_end = .) ; |
||||
|
} > data |
||||
|
.bss SIZEOF(.data) + ADDR(.data) : |
||||
|
{ |
||||
|
PROVIDE (__bss_start = .) ; |
||||
|
*(.bss) |
||||
|
*(.bss*) |
||||
|
*(COMMON) |
||||
|
PROVIDE (__bss_end = .) ; |
||||
|
} > data |
||||
|
__data_load_start = LOADADDR(.data); |
||||
|
__data_load_end = __data_load_start + SIZEOF(.data); |
||||
|
/* Global data not cleared after reset. */ |
||||
|
.noinit SIZEOF(.bss) + ADDR(.bss) : |
||||
|
{ |
||||
|
PROVIDE (__noinit_start = .) ; |
||||
|
*(.noinit*) |
||||
|
PROVIDE (__noinit_end = .) ; |
||||
|
_end = . ; |
||||
|
PROVIDE (__heap_start = .) ; |
||||
|
} > data |
||||
|
.eeprom : |
||||
|
{ |
||||
|
*(.eeprom*) |
||||
|
__eeprom_end = . ; |
||||
|
} > eeprom |
||||
|
.fuse : |
||||
|
{ |
||||
|
KEEP(*(.fuse)) |
||||
|
KEEP(*(.lfuse)) |
||||
|
KEEP(*(.hfuse)) |
||||
|
KEEP(*(.efuse)) |
||||
|
} > fuse |
||||
|
.lock : |
||||
|
{ |
||||
|
KEEP(*(.lock*)) |
||||
|
} > lock |
||||
|
.signature : |
||||
|
{ |
||||
|
KEEP(*(.signature*)) |
||||
|
} > signature |
||||
|
/* Stabs debugging sections. */ |
||||
|
.stab 0 : { *(.stab) } |
||||
|
.stabstr 0 : { *(.stabstr) } |
||||
|
.stab.excl 0 : { *(.stab.excl) } |
||||
|
.stab.exclstr 0 : { *(.stab.exclstr) } |
||||
|
.stab.index 0 : { *(.stab.index) } |
||||
|
.stab.indexstr 0 : { *(.stab.indexstr) } |
||||
|
.comment 0 : { *(.comment) } |
||||
|
/* DWARF debug sections. |
||||
|
Symbols in the DWARF debugging sections are relative to the beginning |
||||
|
of the section so we begin them at 0. */ |
||||
|
/* DWARF 1 */ |
||||
|
.debug 0 : { *(.debug) } |
||||
|
.line 0 : { *(.line) } |
||||
|
/* GNU DWARF 1 extensions */ |
||||
|
.debug_srcinfo 0 : { *(.debug_srcinfo) } |
||||
|
.debug_sfnames 0 : { *(.debug_sfnames) } |
||||
|
/* DWARF 1.1 and DWARF 2 */ |
||||
|
.debug_aranges 0 : { *(.debug_aranges) } |
||||
|
.debug_pubnames 0 : { *(.debug_pubnames) } |
||||
|
/* DWARF 2 */ |
||||
|
.debug_info 0 : { *(.debug_info) *(.gnu.linkonce.wi.*) } |
||||
|
.debug_abbrev 0 : { *(.debug_abbrev) } |
||||
|
.debug_line 0 : { *(.debug_line) } |
||||
|
.debug_frame 0 : { *(.debug_frame) } |
||||
|
.debug_str 0 : { *(.debug_str) } |
||||
|
.debug_loc 0 : { *(.debug_loc) } |
||||
|
.debug_macinfo 0 : { *(.debug_macinfo) } |
||||
|
} |
@ -0,0 +1,316 @@ |
|||||
|
/* Default linker script, for normal executables */ |
||||
|
OUTPUT_FORMAT(pei-x86-64) |
||||
|
SEARCH_DIR("/usr/x86_64-pc-cygwin/lib"); SEARCH_DIR("/usr/lib"); SEARCH_DIR("/usr/lib/w32api"); |
||||
|
SECTIONS |
||||
|
{ |
||||
|
/* Make the virtual address and file offset synced if the alignment is |
||||
|
lower than the target page size. */ |
||||
|
. = SIZEOF_HEADERS; |
||||
|
. = ALIGN(__section_alignment__); |
||||
|
.text __image_base__ + ( __section_alignment__ < 0x1000 ? . : __section_alignment__ ) : |
||||
|
{ |
||||
|
*(.init) |
||||
|
*(.text) |
||||
|
*(SORT(.text$*)) |
||||
|
*(.text.*) |
||||
|
*(.gnu.linkonce.t.*) |
||||
|
*(.glue_7t) |
||||
|
*(.glue_7) |
||||
|
. = ALIGN(8); |
||||
|
___CTOR_LIST__ = .; __CTOR_LIST__ = . ; |
||||
|
LONG (-1); LONG (-1);*(.ctors); *(.ctor); *(SORT(.ctors.*)); LONG (0); LONG (0); |
||||
|
___DTOR_LIST__ = .; __DTOR_LIST__ = . ; |
||||
|
LONG (-1); LONG (-1); *(.dtors); *(.dtor); *(SORT(.dtors.*)); LONG (0); LONG (0); |
||||
|
*(.fini) |
||||
|
/* ??? Why is .gcc_exc here? */ |
||||
|
*(.gcc_exc) |
||||
|
PROVIDE (etext = .); |
||||
|
*(.gcc_except_table) |
||||
|
} |
||||
|
/* The Cygwin32 library uses a section to avoid copying certain data |
||||
|
on fork. This used to be named ".data". The linker used |
||||
|
to include this between __data_start__ and __data_end__, but that |
||||
|
breaks building the cygwin32 dll. Instead, we name the section |
||||
|
".data_cygwin_nocopy" and explicitly include it after __data_end__. */ |
||||
|
.data BLOCK(__section_alignment__) : |
||||
|
{ |
||||
|
__data_start__ = . ; |
||||
|
*(.data) |
||||
|
*(.data2) |
||||
|
*(SORT(.data$*)) |
||||
|
*(.jcr) |
||||
|
. = ALIGN(16); |
||||
|
_eeprom_start__ = . ; |
||||
|
__eeprom_start__ = . ; |
||||
|
*(.eeprom) |
||||
|
. = ALIGN(16); |
||||
|
_game_descriptors_start__ = . ; |
||||
|
__game_descriptors_start__ = . ; |
||||
|
*(.game_descriptors) |
||||
|
_game_descriptors_end__ = . ; |
||||
|
__game_descriptors_end__ = . ; |
||||
|
__data_end__ = . ; |
||||
|
*(.data_cygwin_nocopy) |
||||
|
} |
||||
|
.rdata BLOCK(__section_alignment__) : |
||||
|
{ |
||||
|
*(.rdata) |
||||
|
*(SORT(.rdata$*)) |
||||
|
__rt_psrelocs_start = .; |
||||
|
*(.rdata_runtime_pseudo_reloc) |
||||
|
__rt_psrelocs_end = .; |
||||
|
} |
||||
|
__rt_psrelocs_size = __rt_psrelocs_end - __rt_psrelocs_start; |
||||
|
___RUNTIME_PSEUDO_RELOC_LIST_END__ = .; |
||||
|
__RUNTIME_PSEUDO_RELOC_LIST_END__ = .; |
||||
|
___RUNTIME_PSEUDO_RELOC_LIST__ = . - __rt_psrelocs_size; |
||||
|
__RUNTIME_PSEUDO_RELOC_LIST__ = . - __rt_psrelocs_size; |
||||
|
.eh_frame BLOCK(__section_alignment__) : |
||||
|
{ |
||||
|
*(.eh_frame*) |
||||
|
} |
||||
|
.pdata BLOCK(__section_alignment__) : |
||||
|
{ |
||||
|
*(.pdata*) |
||||
|
} |
||||
|
.xdata BLOCK(__section_alignment__) : |
||||
|
{ |
||||
|
*(.xdata*) |
||||
|
} |
||||
|
.bss BLOCK(__section_alignment__) : |
||||
|
{ |
||||
|
__bss_start__ = . ; |
||||
|
*(.bss) |
||||
|
*(COMMON) |
||||
|
__bss_end__ = . ; |
||||
|
} |
||||
|
.edata BLOCK(__section_alignment__) : |
||||
|
{ |
||||
|
*(.edata) |
||||
|
} |
||||
|
/DISCARD/ : |
||||
|
{ |
||||
|
*(.debug$S) |
||||
|
*(.debug$T) |
||||
|
*(.debug$F) |
||||
|
*(.drectve) |
||||
|
*(.note.GNU-stack) |
||||
|
*(.gnu.lto_*) |
||||
|
} |
||||
|
.idata BLOCK(__section_alignment__) : |
||||
|
{ |
||||
|
/* This cannot currently be handled with grouped sections. |
||||
|
See pep.em:sort_sections. */ |
||||
|
SORT(*)(.idata$2) |
||||
|
SORT(*)(.idata$3) |
||||
|
/* These zeroes mark the end of the import list. */ |
||||
|
LONG (0); LONG (0); LONG (0); LONG (0); LONG (0); |
||||
|
SORT(*)(.idata$4) |
||||
|
__IAT_start__ = .; |
||||
|
SORT(*)(.idata$5) |
||||
|
__IAT_end__ = .; |
||||
|
SORT(*)(.idata$6) |
||||
|
SORT(*)(.idata$7) |
||||
|
} |
||||
|
.CRT BLOCK(__section_alignment__) : |
||||
|
{ |
||||
|
___crt_xc_start__ = . ; |
||||
|
*(SORT(.CRT$XC*)) /* C initialization */ |
||||
|
___crt_xc_end__ = . ; |
||||
|
___crt_xi_start__ = . ; |
||||
|
*(SORT(.CRT$XI*)) /* C++ initialization */ |
||||
|
___crt_xi_end__ = . ; |
||||
|
___crt_xl_start__ = . ; |
||||
|
*(SORT(.CRT$XL*)) /* TLS callbacks */ |
||||
|
/* ___crt_xl_end__ is defined in the TLS Directory support code */ |
||||
|
___crt_xp_start__ = . ; |
||||
|
*(SORT(.CRT$XP*)) /* Pre-termination */ |
||||
|
___crt_xp_end__ = . ; |
||||
|
___crt_xt_start__ = . ; |
||||
|
*(SORT(.CRT$XT*)) /* Termination */ |
||||
|
___crt_xt_end__ = . ; |
||||
|
} |
||||
|
/* Windows TLS expects .tls$AAA to be at the start and .tls$ZZZ to be |
||||
|
at the end of the .tls section. This is important because _tls_start MUST |
||||
|
be at the beginning of the section to enable SECREL32 relocations with TLS |
||||
|
data. */ |
||||
|
.tls BLOCK(__section_alignment__) : |
||||
|
{ |
||||
|
___tls_start__ = . ; |
||||
|
*(.tls$AAA) |
||||
|
*(.tls) |
||||
|
*(.tls$) |
||||
|
*(SORT(.tls$*)) |
||||
|
*(.tls$ZZZ) |
||||
|
___tls_end__ = . ; |
||||
|
} |
||||
|
.endjunk BLOCK(__section_alignment__) : |
||||
|
{ |
||||
|
/* end is deprecated, don't use it */ |
||||
|
PROVIDE (end = .); |
||||
|
PROVIDE ( _end = .); |
||||
|
__end__ = .; |
||||
|
} |
||||
|
.rsrc BLOCK(__section_alignment__) : |
||||
|
{ |
||||
|
*(.rsrc) |
||||
|
*(SORT(.rsrc$*)) |
||||
|
} |
||||
|
.reloc BLOCK(__section_alignment__) : |
||||
|
{ |
||||
|
*(.reloc) |
||||
|
} |
||||
|
.stab BLOCK(__section_alignment__) (NOLOAD) : |
||||
|
{ |
||||
|
*(.stab) |
||||
|
} |
||||
|
.stabstr BLOCK(__section_alignment__) (NOLOAD) : |
||||
|
{ |
||||
|
*(.stabstr) |
||||
|
} |
||||
|
/* DWARF debug sections. |
||||
|
Symbols in the DWARF debugging sections are relative to the beginning |
||||
|
of the section. Unlike other targets that fake this by putting the |
||||
|
section VMA at 0, the PE format will not allow it. */ |
||||
|
/* DWARF 1.1 and DWARF 2. */ |
||||
|
.debug_aranges BLOCK(__section_alignment__) (NOLOAD) : |
||||
|
{ |
||||
|
*(.debug_aranges) |
||||
|
} |
||||
|
.zdebug_aranges BLOCK(__section_alignment__) (NOLOAD) : |
||||
|
{ |
||||
|
*(.zdebug_aranges) |
||||
|
} |
||||
|
.debug_pubnames BLOCK(__section_alignment__) (NOLOAD) : |
||||
|
{ |
||||
|
*(.debug_pubnames) |
||||
|
} |
||||
|
.zdebug_pubnames BLOCK(__section_alignment__) (NOLOAD) : |
||||
|
{ |
||||
|
*(.zdebug_pubnames) |
||||
|
} |
||||
|
.debug_pubtypes BLOCK(__section_alignment__) (NOLOAD) : |
||||
|
{ |
||||
|
*(.debug_pubtypes) |
||||
|
} |
||||
|
.zdebug_pubtypes BLOCK(__section_alignment__) (NOLOAD) : |
||||
|
{ |
||||
|
*(.zdebug_pubtypes) |
||||
|
} |
||||
|
/* DWARF 2. */ |
||||
|
.debug_info BLOCK(__section_alignment__) (NOLOAD) : |
||||
|
{ |
||||
|
*(.debug_info .gnu.linkonce.wi.*) |
||||
|
} |
||||
|
.zdebug_info BLOCK(__section_alignment__) (NOLOAD) : |
||||
|
{ |
||||
|
*(.zdebug_info .zdebug.gnu.linkonce.wi.*) |
||||
|
} |
||||
|
.debug_abbrev BLOCK(__section_alignment__) (NOLOAD) : |
||||
|
{ |
||||
|
*(.debug_abbrev) |
||||
|
} |
||||
|
.zdebug_abbrev BLOCK(__section_alignment__) (NOLOAD) : |
||||
|
{ |
||||
|
*(.zdebug_abbrev) |
||||
|
} |
||||
|
.debug_line BLOCK(__section_alignment__) (NOLOAD) : |
||||
|
{ |
||||
|
*(.debug_line) |
||||
|
} |
||||
|
.zdebug_line BLOCK(__section_alignment__) (NOLOAD) : |
||||
|
{ |
||||
|
*(.zdebug_line) |
||||
|
} |
||||
|
.debug_frame BLOCK(__section_alignment__) (NOLOAD) : |
||||
|
{ |
||||
|
*(.debug_frame) |
||||
|
} |
||||
|
.zdebug_frame BLOCK(__section_alignment__) (NOLOAD) : |
||||
|
{ |
||||
|
*(.zdebug_frame) |
||||
|
} |
||||
|
.debug_str BLOCK(__section_alignment__) (NOLOAD) : |
||||
|
{ |
||||
|
*(.debug_str) |
||||
|
} |
||||
|
.zdebug_str BLOCK(__section_alignment__) (NOLOAD) : |
||||
|
{ |
||||
|
*(.zdebug_str) |
||||
|
} |
||||
|
.debug_loc BLOCK(__section_alignment__) (NOLOAD) : |
||||
|
{ |
||||
|
*(.debug_loc) |
||||
|
} |
||||
|
.zdebug_loc BLOCK(__section_alignment__) (NOLOAD) : |
||||
|
{ |
||||
|
*(.zdebug_loc) |
||||
|
} |
||||
|
.debug_macinfo BLOCK(__section_alignment__) (NOLOAD) : |
||||
|
{ |
||||
|
*(.debug_macinfo) |
||||
|
} |
||||
|
.zdebug_macinfo BLOCK(__section_alignment__) (NOLOAD) : |
||||
|
{ |
||||
|
*(.zdebug_macinfo) |
||||
|
} |
||||
|
/* SGI/MIPS DWARF 2 extensions. */ |
||||
|
.debug_weaknames BLOCK(__section_alignment__) (NOLOAD) : |
||||
|
{ |
||||
|
*(.debug_weaknames) |
||||
|
} |
||||
|
.zdebug_weaknames BLOCK(__section_alignment__) (NOLOAD) : |
||||
|
{ |
||||
|
*(.zdebug_weaknames) |
||||
|
} |
||||
|
.debug_funcnames BLOCK(__section_alignment__) (NOLOAD) : |
||||
|
{ |
||||
|
*(.debug_funcnames) |
||||
|
} |
||||
|
.zdebug_funcnames BLOCK(__section_alignment__) (NOLOAD) : |
||||
|
{ |
||||
|
*(.zdebug_funcnames) |
||||
|
} |
||||
|
.debug_typenames BLOCK(__section_alignment__) (NOLOAD) : |
||||
|
{ |
||||
|
*(.debug_typenames) |
||||
|
} |
||||
|
.zdebug_typenames BLOCK(__section_alignment__) (NOLOAD) : |
||||
|
{ |
||||
|
*(.zdebug_typenames) |
||||
|
} |
||||
|
.debug_varnames BLOCK(__section_alignment__) (NOLOAD) : |
||||
|
{ |
||||
|
*(.debug_varnames) |
||||
|
} |
||||
|
.zdebug_varnames BLOCK(__section_alignment__) (NOLOAD) : |
||||
|
{ |
||||
|
*(.zdebug_varnames) |
||||
|
} |
||||
|
.debug_macro BLOCK(__section_alignment__) (NOLOAD) : |
||||
|
{ |
||||
|
*(.debug_macro) |
||||
|
} |
||||
|
.zdebug_macro BLOCK(__section_alignment__) (NOLOAD) : |
||||
|
{ |
||||
|
*(.zdebug_macro) |
||||
|
} |
||||
|
/* DWARF 3. */ |
||||
|
.debug_ranges BLOCK(__section_alignment__) (NOLOAD) : |
||||
|
{ |
||||
|
*(.debug_ranges) |
||||
|
} |
||||
|
.zdebug_ranges BLOCK(__section_alignment__) (NOLOAD) : |
||||
|
{ |
||||
|
*(.zdebug_ranges) |
||||
|
} |
||||
|
/* DWARF 4. */ |
||||
|
.debug_types BLOCK(__section_alignment__) (NOLOAD) : |
||||
|
{ |
||||
|
*(.debug_types .gnu.linkonce.wt.*) |
||||
|
} |
||||
|
.zdebug_types BLOCK(__section_alignment__) (NOLOAD) : |
||||
|
{ |
||||
|
*(.zdebug_types .zdebug.gnu.linkonce.wt.*) |
||||
|
} |
||||
|
} |
@ -1,9 +0,0 @@ |
|||||
TARGET = libanimations.a |
|
||||
TOPDIR = .. |
|
||||
|
|
||||
include $(TOPDIR)/defaults.mk |
|
||||
|
|
||||
SRC = menu.c |
|
||||
|
|
||||
|
|
||||
include $(TOPDIR)/rules.mk |
|
@ -1,8 +0,0 @@ |
|||||
TARGET = objects |
|
||||
TOPDIR = .. |
|
||||
|
|
||||
include $(TOPDIR)/defaults.mk |
|
||||
|
|
||||
SRC = rfm12.c borg_rfm12.c |
|
||||
|
|
||||
include $(TOPDIR)/rules.mk |
|
@ -1,4 +0,0 @@ |
|||||
|
|
||||
#include "rfm12_config.h" |
|
||||
#include "rfm12_lib/rfm12.c" |
|
||||
|
|
@ -1,4 +0,0 @@ |
|||||
|
|
||||
#include "rfm12_config.h" |
|
||||
#include "rfm12_lib/rfm12.h" |
|
||||
|
|
@ -1,10 +0,0 @@ |
|||||
TARGET = objects |
|
||||
TOPDIR = .. |
|
||||
|
|
||||
include $(TOPDIR)/defaults.mk |
|
||||
|
|
||||
SRC = scrolltext3.c |
|
||||
|
|
||||
SRC += $(shell echo $(SCROLLTEXT_FONT) | tr A-Z a-z).c |
|
||||
|
|
||||
include $(TOPDIR)/rules.mk |
|
@ -1,102 +0,0 @@ |
|||||
PRG = borgSim |
|
||||
APP = $(PRG).app/Contents/MacOS/$(PRG) |
|
||||
OPTIMIZE = -O2 |
|
||||
LIBS = -lpthread -framework Carbon -framework GLUT -framework OpenGL -framework Foundation -framework AppKit |
|
||||
CC = gcc |
|
||||
LD = ld |
|
||||
|
|
||||
override CFLAGS = -g -Wall -pedantic -std=c99 $(OPTIMIZE) -DOSX_ |
|
||||
$(DEFS) |
|
||||
override LDFLAGS = -Wl --prebind |
|
||||
|
|
||||
OBJ = breakpoint.o font_arial8.o font_small6.o font_uni53.o invader_draw.o \
|
|
||||
invader_init.o invader_proc.o invaders2.o joystick.o main.o menu.o pixel.o \
|
|
||||
program.o scrolltext3.o snake.o trackball.o util.o tetris/input.o \
|
|
||||
tetris/logic.o tetris/piece.o tetris/playfield.o tetris/view.o |
|
||||
|
|
||||
all: Makefile.osx $(APP) |
|
||||
|
|
||||
$(APP): $(OBJ) |
|
||||
test -d $(PRG).app/Contents/MacOS/ || mkdir -p $(PRG).app/Contents/MacOS/ |
|
||||
test -d $(PRG).app/Contents/Resources/ || mkdir -p $(PRG).app/Resources/ |
|
||||
test $(PRG).app/Contents/Rescources/borg3d.icns || cp -f borg3d.icns $(PRG).app/Contents/Rescources/ |
|
||||
$(CC) $(CFLAGS) $(LDFLAGS) $(LIBS) $(OBJ) -o $@ |
|
||||
|
|
||||
clean: |
|
||||
rm -rf $(OBJ) $(PRG) $(PRG).app/ |
|
||||
|
|
||||
breakpoint.o: breakpoint.c pixel.h util.h config.h |
|
||||
$(CC) $(CFLAGS) -c -o breakpoint.o breakpoint.c |
|
||||
|
|
||||
font_arial8.o: font_arial8.c font.h |
|
||||
$(CC) $(CFLAGS) -c -o font_arial8.o font_arial8.c |
|
||||
|
|
||||
font_small6.o: font_small6.c font.h |
|
||||
$(CC) $(CFLAGS) -c -o font_small6.o font_small6.c |
|
||||
|
|
||||
font_uni53.o: font_uni53.c font.h |
|
||||
$(CC) $(CFLAGS) -c -o font_uni53.o font_uni53.c |
|
||||
|
|
||||
invader_draw.o: invader_draw.c invaders2.h pixel.h util.h config.h \ |
|
||||
scrolltext.h joystick.h |
|
||||
$(CC) $(CFLAGS) -c -o invader_draw.o invader_draw.c |
|
||||
|
|
||||
invader_init.o: invader_init.c invaders2.h pixel.h util.h config.h \ |
|
||||
scrolltext.h joystick.h |
|
||||
$(CC) $(CFLAGS) -c -o invader_init.o invader_init.c |
|
||||
|
|
||||
invader_proc.o: invader_proc.c invaders2.h pixel.h util.h config.h \ |
|
||||
scrolltext.h joystick.h |
|
||||
$(CC) $(CFLAGS) -c -o invader_proc.o invader_proc.c |
|
||||
|
|
||||
invaders2.o: invaders2.c util.h invaders2.h pixel.h config.h scrolltext.h \ |
|
||||
joystick.h |
|
||||
$(CC) $(CFLAGS) -c -o invaders2.o invaders2.c |
|
||||
|
|
||||
joystick.o: joystick.c joystick.h |
|
||||
$(CC) $(CFLAGS) -c -o joystick.o joystick.c |
|
||||
|
|
||||
main.o: main.c config.h pixel.h util.h program.h menu.h tetris/logic.h \ |
|
||||
tetris/piece.h trackball.h snake.h scrolltext.h |
|
||||
$(CC) $(CFLAGS) -c -o main.o main.c |
|
||||
|
|
||||
menu.o: menu.c menu.h config.h util.h pixel.h joystick.h snake.h \ |
|
||||
tetris/logic.h tetris/piece.h invaders2.h scrolltext.h |
|
||||
$(CC) $(CFLAGS) -c -o menu.o menu.c |
|
||||
|
|
||||
pixel.o: pixel.c pixel.h util.h config.h |
|
||||
$(CC) $(CFLAGS) -c -o pixel.o pixel.c |
|
||||
|
|
||||
program.o: program.c pixel.h util.h config.h program.h joystick.h |
|
||||
$(CC) $(CFLAGS) -c -o program.o program.c |
|
||||
|
|
||||
scrolltext3.o: scrolltext3.c config.h scrolltext.h pixel.h util.h \ |
|
||||
font_arial8.h font.h font_small6.h font_uni53.h |
|
||||
$(CC) $(CFLAGS) -c -o scrolltext3.o scrolltext3.c |
|
||||
|
|
||||
snake.o: snake.c pixel.h util.h config.h joystick.h |
|
||||
$(CC) $(CFLAGS) -c -o snake.o snake.c |
|
||||
|
|
||||
trackball.o: trackball.c trackball.h |
|
||||
$(CC) $(CFLAGS) -c -o trackball.o trackball.c |
|
||||
|
|
||||
util.o: util.c joystick.h |
|
||||
$(CC) $(CFLAGS) -c -o util.o util.c |
|
||||
|
|
||||
tetris/input.o: tetris/input.c joystick.h util.h tetris/input.h |
|
||||
$(CC) $(CFLAGS) -c -o tetris/input.o tetris/input.c |
|
||||
|
|
||||
tetris/logic.o: tetris/logic.c tetris/logic.h tetris/piece.h \ |
|
||||
tetris/playfield.h tetris/view.h tetris/input.h |
|
||||
$(CC) $(CFLAGS) -c -o tetris/logic.o tetris/logic.c |
|
||||
|
|
||||
tetris/piece.o: tetris/piece.c tetris/piece.h |
|
||||
$(CC) $(CFLAGS) -c -o tetris/piece.o tetris/piece.c |
|
||||
|
|
||||
tetris/playfield.o: tetris/playfield.c tetris/playfield.h tetris/piece.h |
|
||||
$(CC) $(CFLAGS) -c -o tetris/playfield.o tetris/playfield.c |
|
||||
|
|
||||
tetris/view.o: tetris/view.c config.h pixel.h util.h scrolltext.h \ |
|
||||
tetris/logic.h tetris/piece.h tetris/playfield.h tetris/view.h |
|
||||
$(CC) $(CFLAGS) -c -o tetris/view.o tetris/view.c |
|
||||
|
|
@ -0,0 +1,88 @@ |
|||||
|
/**
|
||||
|
* \defgroup moire A moire like pattern. |
||||
|
* @{ |
||||
|
*/ |
||||
|
|
||||
|
/**
|
||||
|
* @file moire.c |
||||
|
* @brief Implementation of a simple moire like pattern. |
||||
|
* @author Christian Kroll |
||||
|
*/ |
||||
|
|
||||
|
#include "../config.h" |
||||
|
#include "../pixel.h" |
||||
|
#include "../util.h" |
||||
|
|
||||
|
/**
|
||||
|
* Number of pixels of the complete border. |
||||
|
*/ |
||||
|
#define NUMBER_OF_BORDER_PIXELS (2u * UNUM_COLS + 2u * (UNUM_ROWS - 2u)) |
||||
|
|
||||
|
/**
|
||||
|
* Draws a moire like pattern. Works best if the number of border pixels is a |
||||
|
* multiple of the size of the gradient color map. |
||||
|
*/ |
||||
|
void moire(void) |
||||
|
{ |
||||
|
// add rotating color map
|
||||
|
#if NUMPLANE == 3 |
||||
|
static unsigned char const gradient[] = {0, 1, 2, 3, 2, 1}; |
||||
|
#else |
||||
|
static unsigned char gradient[NUMPLANE * 2u] = {0}; |
||||
|
for (unsigned char i = 1; i <= NUMPLANE; ++i) |
||||
|
{ |
||||
|
gradient[i] = i; |
||||
|
gradient[(NUMPLANE * 2) - i] = i; |
||||
|
} |
||||
|
#endif |
||||
|
|
||||
|
unsigned int cycles = 30000; |
||||
|
unsigned char pos = 0, color_index = 0; |
||||
|
pixel p1 = (pixel){0 ,0}; |
||||
|
|
||||
|
while(cycles--) |
||||
|
{ |
||||
|
// walk around the border; do that by mapping a linear increasing value
|
||||
|
// to appropriate screen coordinates
|
||||
|
|
||||
|
// first pixel is between top right and top left corner
|
||||
|
if (pos < NUM_COLS) |
||||
|
{ |
||||
|
p1.x = pos; |
||||
|
} |
||||
|
// first pixel is between top left and bottom left corner
|
||||
|
else if (pos < (NUM_COLS + NUM_ROWS - 1)) |
||||
|
{ |
||||
|
p1.y = pos - (NUM_COLS - 1); |
||||
|
} |
||||
|
// first pixel is between bottom left and bottom right corner
|
||||
|
else if (pos < (2 * NUM_COLS + NUM_ROWS - 2)) |
||||
|
{ |
||||
|
p1.x = 2 * NUM_COLS + NUM_ROWS - 3 - pos; |
||||
|
} |
||||
|
// first pixel is between bottom right and top left corner
|
||||
|
else |
||||
|
{ |
||||
|
p1.y = 3 * NUM_COLS + NUM_ROWS - 4 - pos; |
||||
|
} |
||||
|
|
||||
|
// second pixel in opposite direction
|
||||
|
pixel const p2 = (pixel){NUM_COLS - 1 - p1.x, NUM_ROWS - 1 - p1.y}; |
||||
|
|
||||
|
// draw line right accross the display and switch to next color
|
||||
|
line(p1, p2, gradient[color_index++]); |
||||
|
|
||||
|
// if we have reached the origin, reset position, rotate color index and
|
||||
|
// wait for 40 ms (25 fps) to make the frame visible for human viewers
|
||||
|
if (++pos == NUMBER_OF_BORDER_PIXELS) |
||||
|
{ |
||||
|
pos = 0; |
||||
|
++color_index; |
||||
|
wait(40); |
||||
|
} |
||||
|
// ensure the color index keeps within bounds
|
||||
|
color_index %= (2u * NUMPLANE); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
/*@}*/ |
@ -0,0 +1,19 @@ |
|||||
|
/**
|
||||
|
* \defgroup moire A moire like pattern. |
||||
|
* @{ |
||||
|
*/ |
||||
|
|
||||
|
/**
|
||||
|
* @file moire.h |
||||
|
* @brief Interface file for a moire pattern implementation. |
||||
|
* @author Christian Kroll |
||||
|
*/ |
||||
|
|
||||
|
#ifndef MOIRE_H_ |
||||
|
#define MOIRE_H_ |
||||
|
|
||||
|
void moire(void); |
||||
|
|
||||
|
#endif /* MOIRE_H_ */ |
||||
|
|
||||
|
/*@}*/ |