Latest compatible version of Classicube from the original GitHub repository (https://github.com/ClassiCube/ClassiCube) that can be compiled on Classicube for PowerMac PPC running Mac OS X 10.4.

This commit is contained in:
Andrei Alexandru
2025-12-17 13:17:57 +02:00
commit c71492f846
1248 changed files with 422858 additions and 0 deletions

131
misc/32x/32x.h Normal file
View File

@@ -0,0 +1,131 @@
#ifndef __32X_H__
#define __32X_H__
/* Create a 5:5:5 RGB color */
#define COLOR(r,g,b) (((r)&0x1F)|((g)&0x1F)<<5|((b)&0x1F)<<10)
#define MARS_CRAM (*(volatile unsigned short *)0x20004200)
#define MARS_FRAMEBUFFER (*(volatile unsigned short *)0x24000000)
#define MARS_OVERWRITE_IMG (*(volatile unsigned short *)0x24020000)
#define MARS_SDRAM (*(volatile unsigned short *)0x26000000)
#define MARS_SYS_INTMSK (*(volatile unsigned short *)0x20004000)
#define MARS_SYS_DMACTR (*(volatile unsigned short *)0x20004006)
#define MARS_SYS_DMASAR (*(volatile unsigned long *)0x20004008)
#define MARS_SYS_DMADAR (*(volatile unsigned long *)0x2000400C)
#define MARS_SYS_DMALEN (*(volatile unsigned short *)0x20004010)
#define MARS_SYS_DMAFIFO (*(volatile unsigned short *)0x20004012)
#define MARS_SYS_VRESI_CLR (*(volatile unsigned short *)0x20004014)
#define MARS_SYS_VINT_CLR (*(volatile unsigned short *)0x20004016)
#define MARS_SYS_HINT_CLR (*(volatile unsigned short *)0x20004018)
#define MARS_SYS_CMDI_CLR (*(volatile unsigned short *)0x2000401A)
#define MARS_SYS_PWMI_CLR (*(volatile unsigned short *)0x2000401C)
#define MARS_SYS_COMM0 (*(volatile unsigned short *)0x20004020) /* Master SH2 communication */
#define MARS_SYS_COMM2 (*(volatile unsigned short *)0x20004022)
#define MARS_SYS_COMM4 (*(volatile unsigned short *)0x20004024) /* Slave SH2 communication */
#define MARS_SYS_COMM6 (*(volatile unsigned short *)0x20004026)
#define MARS_SYS_COMM8 (*(volatile unsigned short *)0x20004028) /* controller 1 current value */
#define MARS_SYS_COMM10 (*(volatile unsigned short *)0x2000402A) /* controller 2 current value */
#define MARS_SYS_COMM12 (*(volatile unsigned long *)0x2000402C) /* vcount current value */
#define MARS_PWM_CTRL (*(volatile unsigned short *)0x20004030)
#define MARS_PWM_CYCLE (*(volatile unsigned short *)0x20004032)
#define MARS_PWM_LEFT (*(volatile unsigned short *)0x20004034)
#define MARS_PWM_RIGHT (*(volatile unsigned short *)0x20004036)
#define MARS_PWM_MONO (*(volatile unsigned short *)0x20004038)
#define MARS_VDP_DISPMODE (*(volatile unsigned short *)0x20004100)
#define MARS_VDP_FILLEN (*(volatile unsigned short *)0x20004104)
#define MARS_VDP_FILADR (*(volatile unsigned short *)0x20004106)
#define MARS_VDP_FILDAT (*(volatile unsigned short *)0x20004108)
#define MARS_VDP_FBCTL (*(volatile unsigned short *)0x2000410A)
#define MARS_SH2_ACCESS_VDP 0x8000
#define MARS_68K_ACCESS_VDP 0x0000
#define MARS_PAL_FORMAT 0x0000
#define MARS_NTSC_FORMAT 0x8000
#define MARS_VDP_PRIO_68K 0x0000
#define MARS_VDP_PRIO_32X 0x0080
#define MARS_224_LINES 0x0000
#define MARS_240_LINES 0x0040
#define MARS_VDP_MODE_OFF 0x0000
#define MARS_VDP_MODE_256 0x0001
#define MARS_VDP_MODE_32K 0x0002
#define MARS_VDP_MODE_RLE 0x0003
#define MARS_VDP_VBLK 0x8000
#define MARS_VDP_HBLK 0x4000
#define MARS_VDP_PEN 0x2000
#define MARS_VDP_FEN 0x0002
#define MARS_VDP_FS 0x0001
#define SH2_CCTL_CP 0x10
#define SH2_CCTL_TW 0x08
#define SH2_CCTL_CE 0x01
#define SH2_FRT_TIER (*(volatile unsigned char *)0xFFFFFE10)
#define SH2_FRT_FTCSR (*(volatile unsigned char *)0xFFFFFE11)
#define SH2_FRT_FRCH (*(volatile unsigned char *)0xFFFFFE12)
#define SH2_FRT_FRCL (*(volatile unsigned char *)0xFFFFFE13)
#define SH2_FRT_OCRH (*(volatile unsigned char *)0xFFFFFE14)
#define SH2_FRT_OCRL (*(volatile unsigned char *)0xFFFFFE15)
#define SH2_FRT_TCR (*(volatile unsigned char *)0xFFFFFE16)
#define SH2_FRT_TOCR (*(volatile unsigned char *)0xFFFFFE17)
#define SH2_FRT_ICRH (*(volatile unsigned char *)0xFFFFFE18)
#define SH2_FRT_ICRL (*(volatile unsigned char *)0xFFFFFE19)
#define SH2_DMA_SAR0 (*(volatile unsigned long *)0xFFFFFF80)
#define SH2_DMA_DAR0 (*(volatile unsigned long *)0xFFFFFF84)
#define SH2_DMA_TCR0 (*(volatile unsigned long *)0xFFFFFF88)
#define SH2_DMA_CHCR0 (*(volatile unsigned long *)0xFFFFFF8C)
#define SH2_DMA_VCR0 (*(volatile unsigned long *)0xFFFFFFA0)
#define SH2_DMA_DRCR0 (*(volatile unsigned char *)0xFFFFFE71)
#define SH2_DMA_SAR1 (*(volatile unsigned long *)0xFFFFFF90)
#define SH2_DMA_DAR1 (*(volatile unsigned long *)0xFFFFFF94)
#define SH2_DMA_TCR1 (*(volatile unsigned long *)0xFFFFFF98)
#define SH2_DMA_CHCR1 (*(volatile unsigned long *)0xFFFFFF9C)
#define SH2_DMA_VCR1 (*(volatile unsigned long *)0xFFFFFFA8)
#define SH2_DMA_DRCR1 (*(volatile unsigned char *)0xFFFFFE72)
#define SH2_DMA_DMAOR (*(volatile unsigned long *)0xFFFFFFB0)
#define SH2_INT_IPRA (*(volatile unsigned short *)0xFFFFFEE2)
#define SEGA_CTRL_UP 0x0001
#define SEGA_CTRL_DOWN 0x0002
#define SEGA_CTRL_LEFT 0x0004
#define SEGA_CTRL_RIGHT 0x0008
#define SEGA_CTRL_B 0x0010
#define SEGA_CTRL_C 0x0020
#define SEGA_CTRL_A 0x0040
#define SEGA_CTRL_START 0x0080
#define SEGA_CTRL_Z 0x0100
#define SEGA_CTRL_Y 0x0200
#define SEGA_CTRL_X 0x0400
#define SEGA_CTRL_MODE 0x0800
#define SEGA_CTRL_TYPE 0xF000
#define SEGA_CTRL_THREE 0x0000
#define SEGA_CTRL_SIX 0x1000
#define SEGA_CTRL_NONE 0xF000
#ifdef __cplusplus
extern "C" {
#endif
/* global functions in sh2_crt0.s */
extern void fast_memcpy(void *dst, void *src, int len);
extern void CacheControl(int mode);
extern void CacheClearLine(void* ptr);
extern void ScreenStretch(int src, int width, int height, int interp);
#ifdef __cplusplus
}
#endif
#endif

109
misc/32x/Makefile Normal file
View File

@@ -0,0 +1,109 @@
ifdef $(GENDEV)
ROOTDIR = $(GENDEV)
else
ROOTDIR = /opt/toolchains/sega
endif
#---------------------------------------------------------------------------------
# Configurable options
#---------------------------------------------------------------------------------
TARGET = ClassiCube-32x
BUILD_DIR = build/32x
SOURCE_DIRS = src src/32x misc/32x
#---------------------------------------------------------------------------------
# Code generation
#---------------------------------------------------------------------------------
C_FILES = $(foreach dir,$(SOURCE_DIRS),$(wildcard $(dir)/*.c))
S_FILES = misc/32x/sh2_crt0.s
OBJS = $(addprefix $(BUILD_DIR)/, $(notdir $(C_FILES:%.c=%.o) $(S_FILES:%.s=%.o)))
LDSCRIPTSDIR = $(ROOTDIR)/ldscripts
LIBS = $(LIBPATH) -lc -lgcc -lgcc-Os-4-200 -lnosys
LIBPATH = -L$(ROOTDIR)/sh-elf/lib -L$(ROOTDIR)/sh-elf/lib/gcc/sh-elf/4.6.2 -L$(ROOTDIR)/sh-elf/sh-elf/lib
INCPATH = -I$(ROOTDIR)/sh-elf/include -I$(ROOTDIR)/sh-elf/sh-elf/include
SHCCFLAGS = -m2 -mb -Ofast -Wall -g -c -fomit-frame-pointer -DPLAT_32X -ffunction-sections -fdata-sections
SHHWFLAGS = -m2 -mb -O1 -Wall -g -c -fomit-frame-pointer
SHLDFLAGS = -T $(LDSCRIPTSDIR)/mars.ld -nostdlib -Wl,--gc-sections
SHASFLAGS = --big
MDLDFLAGS = -T $(LDSCRIPTSDIR)/md.ld --oformat binary
MDASFLAGS = -m68000 --register-prefix-optional
SHPREFIX = $(ROOTDIR)/sh-elf/bin/sh-elf-
SHCC = $(SHPREFIX)gcc
SHAS = $(SHPREFIX)as
SHLD = $(SHPREFIX)ld
SHOBJC = $(SHPREFIX)objcopy
MDPREFIX = $(ROOTDIR)/m68k-elf/bin/m68k-elf-
MDAS = $(MDPREFIX)as
MDLD = $(MDPREFIX)ld
# Dependency tracking
DEPFLAGS = -MT $@ -MMD -MP -MF $(BUILD_DIR)/$*.d
DEPFILES := $(OBJS:%.o=%.d)
#---------------------------------------------------------------------------------
# main targets
#---------------------------------------------------------------------------------
all: $(BUILD_DIR) $(BUILD_DIR)/m68k_crt0.bin $(BUILD_DIR)/m68k_crt1.bin $(TARGET).bin
clean:
rm -f $(BUILD_DIR)/*.o $(BUILD_DIR)/*.bin $(TARGET).bin $(TARGET).elf
$(BUILD_DIR):
mkdir -p $(BUILD_DIR)
#---------------------------------------------------------------------------------
# binary generation
#---------------------------------------------------------------------------------
$(TARGET).bin: $(TARGET).elf
$(SHOBJC) -O binary $< $(BUILD_DIR)/temp.bin
dd if=$(BUILD_DIR)/temp.bin of=$@ bs=64K conv=sync
$(TARGET).elf: $(OBJS)
$(SHCC) $(SHLDFLAGS) $(OBJS) $(LIBS) -o $(TARGET).elf
$(BUILD_DIR)/m68k_crt0.o: misc/32x/m68k_crt0.s
$(MDAS) $(MDASFLAGS) $< -o $@
$(BUILD_DIR)/m68k_crt0.bin: $(BUILD_DIR)/m68k_crt0.o
$(MDLD) $(MDLDFLAGS) $< -o $@
$(BUILD_DIR)/m68k_crt1.o: misc/32x/m68k_crt1.s
$(MDAS) $(MDASFLAGS) $< -o $@
$(BUILD_DIR)/m68k_crt1.bin: $(BUILD_DIR)/m68k_crt1.o
$(MDLD) $(MDLDFLAGS) $< -o $@
#---------------------------------------------------------------------------------
# object generation
#---------------------------------------------------------------------------------
$(BUILD_DIR)/%.o: src/%.c
$(SHCC) $(SHCCFLAGS) $(INCPATH) $(DEPFLAGS) $< -o $@
$(BUILD_DIR)/%.o: src/32x/%.c
$(SHCC) $(SHCCFLAGS) $(INCPATH) $(DEPFLAGS) $< -o $@
$(BUILD_DIR)/%.o: misc/32x/%.c
$(SHCC) $(SHCCFLAGS) $(INCPATH) $(DEPFLAGS) $< -o $@
$(BUILD_DIR)/%.o: misc/32x/%.s
$(SHAS) $(SHASFLAGS) $(INCPATH) $< -o $@
#---------------------------------------------------------------------------------
# Dependency tracking
#---------------------------------------------------------------------------------
$(DEPFILES):
include $(wildcard $(DEPFILES))

256
misc/32x/hw_32x.c Normal file
View File

@@ -0,0 +1,256 @@
/*
* Licensed under the BSD license
*
* debug_32x.c - Debug screen functions.
*
* Copyright (c) 2005 Marcus R. Brown <mrbrown@ocgnet.org>
* Copyright (c) 2005 James Forshaw <tyranid@gmail.com>
* Copyright (c) 2005 John Kelley <ps2dev@kelley.ca>
*
* Altered for 32X by Chilly Willy
*/
#include "32x.h"
#include <stdarg.h>
#include <stdio.h>
#include <string.h>
static int init = 0;
static unsigned short fgc = 0, bgc = 0;
static unsigned char fgs = 0, bgs = 0;
static unsigned short currentFB = 0;
void Hw32xSetFGColor(int s, int r, int g, int b)
{
volatile unsigned short *palette = &MARS_CRAM;
fgs = s;
fgc = COLOR(r, g, b);
palette[fgs] = fgc;
}
void Hw32xSetBGColor(int s, int r, int g, int b)
{
volatile unsigned short *palette = &MARS_CRAM;
bgs = s;
bgc = COLOR(r, g, b);
palette[bgs] = bgc;
}
void Hw32xInit(int vmode, int lineskip)
{
volatile unsigned short *frameBuffer16 = &MARS_FRAMEBUFFER;
int i;
// Wait for the SH2 to gain access to the VDP
while ((MARS_SYS_INTMSK & MARS_SH2_ACCESS_VDP) == 0) ;
if (vmode == MARS_VDP_MODE_32K)
{
// Set 16-bit direct mode, 224 lines
MARS_VDP_DISPMODE = MARS_224_LINES | MARS_VDP_MODE_32K;
// init both framebuffers
// Flip the framebuffer selection bit and wait for it to take effect
MARS_VDP_FBCTL = currentFB ^ 1;
while ((MARS_VDP_FBCTL & MARS_VDP_FS) == currentFB) ;
currentFB ^= 1;
// rewrite line table
for (i=0; i<224/(lineskip+1); i++)
{
if (lineskip)
{
int j = lineskip + 1;
while (j)
{
frameBuffer16[i*(lineskip+1) + (lineskip + 1 - j)] = i*320 + 0x100; /* word offset of line */
j--;
}
}
else
{
if (i<200)
frameBuffer16[i] = i*320 + 0x100; /* word offset of line */
else
frameBuffer16[i] = 200*320 + 0x100; /* word offset of line */
}
}
// clear screen
for (i=0x100; i<0x10000; i++)
frameBuffer16[i] = 0;
// Flip the framebuffer selection bit and wait for it to take effect
MARS_VDP_FBCTL = currentFB ^ 1;
while ((MARS_VDP_FBCTL & MARS_VDP_FS) == currentFB) ;
currentFB ^= 1;
// rewrite line table
for (i=0; i<224/(lineskip+1); i++)
{
if (lineskip)
{
int j = lineskip + 1;
while (j)
{
frameBuffer16[i*(lineskip+1) + (lineskip + 1 - j)] = i*320 + 0x100; /* word offset of line */
j--;
}
}
else
{
if (i<200)
frameBuffer16[i] = i*320 + 0x100; /* word offset of line */
else
frameBuffer16[i] = 200*320 + 0x100; /* word offset of line */
}
}
// clear screen
for (i=0x100; i<0x10000; i++)
frameBuffer16[i] = 0;
}
Hw32xSetFGColor(255,31,31,31);
Hw32xSetBGColor(0,0,0,0);
init = vmode;
}
void Hw32xScreenClear()
{
int i;
int l = (init == MARS_VDP_MODE_256) ? 320*224/2 + 0x100 : 320*200 + 0x100;
volatile unsigned short *frameBuffer16 = &MARS_FRAMEBUFFER;
// clear screen
for (i=0x100; i<l; i++)
frameBuffer16[i] = 0;
// Flip the framebuffer selection bit and wait for it to take effect
MARS_VDP_FBCTL = currentFB ^ 1;
while ((MARS_VDP_FBCTL & MARS_VDP_FS) == currentFB) ;
currentFB ^= 1;
// clear screen
for (i=0x100; i<l; i++)
frameBuffer16[i] = 0;
Hw32xSetFGColor(255,31,31,31);
Hw32xSetBGColor(0,0,0,0);
}
void Hw32xDelay(int ticks)
{
unsigned long ct = MARS_SYS_COMM12 + ticks;
while (MARS_SYS_COMM12 < ct) ;
}
void Hw32xScreenFlip(int wait)
{
// Flip the framebuffer selection bit
MARS_VDP_FBCTL = currentFB ^ 1;
if (wait)
{
while ((MARS_VDP_FBCTL & MARS_VDP_FS) == currentFB) ;
currentFB ^= 1;
}
}
void Hw32xFlipWait()
{
while ((MARS_VDP_FBCTL & MARS_VDP_FS) == currentFB) ;
currentFB ^= 1;
}
// MD Command support code ---------------------------------------------
unsigned short HwMdReadPad(int port)
{
if (port == 0)
return MARS_SYS_COMM8;
else if (port == 1)
return MARS_SYS_COMM10;
else
return SEGA_CTRL_NONE;
}
unsigned char HwMdReadSram(unsigned short offset)
{
while (MARS_SYS_COMM0) ; // wait until 68000 has responded to any earlier requests
MARS_SYS_COMM2 = offset;
MARS_SYS_COMM0 = 0x0100; // Read SRAM
while (MARS_SYS_COMM0) ;
return MARS_SYS_COMM2 & 0x00FF;
}
void HwMdWriteSram(unsigned char byte, unsigned short offset)
{
while (MARS_SYS_COMM0) ; // wait until 68000 has responded to any earlier requests
MARS_SYS_COMM2 = offset;
MARS_SYS_COMM0 = 0x0200 | byte; // Write SRAM
while (MARS_SYS_COMM0) ;
}
int HwMdReadMouse(int port)
{
unsigned int mouse1, mouse2;
while (MARS_SYS_COMM0) ; // wait until 68000 has responded to any earlier requests
MARS_SYS_COMM0 = 0x0300|port; // tells 68000 to read mouse
while (MARS_SYS_COMM0 == (0x0300|port)) ; // wait for mouse value
mouse1 = MARS_SYS_COMM0;
mouse2 = MARS_SYS_COMM2;
MARS_SYS_COMM0 = 0; // tells 68000 we got the mouse value
return (int)((mouse1 << 16) | mouse2);
}
void HwMdClearScreen(void)
{
while (MARS_SYS_COMM0) ; // wait until 68000 has responded to any earlier requests
MARS_SYS_COMM0 = 0x0400; // Clear Screen (Name Table B)
while (MARS_SYS_COMM0) ;
}
void HwMdSetOffset(unsigned short offset)
{
while (MARS_SYS_COMM0) ; // wait until 68000 has responded to any earlier requests
MARS_SYS_COMM2 = offset;
MARS_SYS_COMM0 = 0x0500; // Set offset (into either Name Table B or VRAM)
while (MARS_SYS_COMM0) ;
}
void HwMdSetNTable(unsigned short word)
{
while (MARS_SYS_COMM0) ; // wait until 68000 has responded to any earlier requests
MARS_SYS_COMM2 = word;
MARS_SYS_COMM0 = 0x0600; // Set word at offset in Name Table B
while (MARS_SYS_COMM0) ;
}
void HwMdSetVram(unsigned short word)
{
while (MARS_SYS_COMM0) ; // wait until 68000 has responded to any earlier requests
MARS_SYS_COMM2 = word;
MARS_SYS_COMM0 = 0x0700; // Set word at offset in VRAM
while (MARS_SYS_COMM0) ;
}
void HwMdPuts(char *str, int color, int x, int y)
{
HwMdSetOffset(((y<<6) | x) << 1);
while (*str)
HwMdSetNTable(((*str++ - 0x20) & 0xFF) | color);
}
void HwMdPutc(char chr, int color, int x, int y)
{
HwMdSetOffset(((y<<6) | x) << 1);
HwMdSetNTable(((chr - 0x20) & 0xFF) | color);
}
// Slave SH2 support code ----------------------------------------------
void slave(void)
{
while (1) ;
}

30
misc/32x/hw_32x.h Normal file
View File

@@ -0,0 +1,30 @@
#ifndef HW_32X_H
#define HW_32X_H
#include <stdarg.h>
#include <stdio.h>
#include <string.h>
extern void Hw32xSetFGColor(int s, int r, int g, int b);
extern void Hw32xSetBGColor(int s, int r, int g, int b);
extern void Hw32xInit(int vmode, int lineskip);
extern int Hw32xScreenGetX();
extern int Hw32xScreenGetY();
extern void Hw32xScreenSetXY(int x, int y);
extern void Hw32xScreenClear();
extern void Hw32xDelay(int ticks);
extern void Hw32xScreenFlip(int wait);
extern void Hw32xFlipWait();
extern unsigned short HwMdReadPad(int port);
extern unsigned char HwMdReadSram(unsigned short offset);
extern void HwMdWriteSram(unsigned char byte, unsigned short offset);
extern int HwMdReadMouse(int port);
extern void HwMdClearScreen(void);
extern void HwMdSetOffset(unsigned short offset);
extern void HwMdSetNTable(unsigned short word);
extern void HwMdSetVram(unsigned short word);
extern void HwMdPuts(char *str, int color, int x, int y);
extern void HwMdPutc(char chr, int color, int x, int y);
#endif

98
misc/32x/m68k_crt0.s Normal file
View File

@@ -0,0 +1,98 @@
| SEGA 32X support code for the 68000
| by Chilly Willy
| First part of rom header
.text
| Initial exception vectors. When the console is first turned on, it is
| in MegaDrive mode. All vectors just point to the code to start up the
| Mars adapter. After the adapter is enabled, none of these vectors will
| appear as the adapter uses its own vector table to route exceptions to
| the jump table. 0x3F0 is where the 68000 starts at for the 32X.
.long 0x01000000,0x000003F0,0x000003F0,0x000003F0,0x000003F0,0x000003F0,0x000003F0,0x000003F0
.long 0x000003F0,0x000003F0,0x000003F0,0x000003F0,0x000003F0,0x000003F0,0x000003F0,0x000003F0
.long 0x000003F0,0x000003F0,0x000003F0,0x000003F0,0x000003F0,0x000003F0,0x000003F0,0x000003F0
.long 0x000003F0,0x000003F0,0x000003F0,0x000003F0,0x000003F0,0x000003F0,0x000003F0,0x000003F0
.long 0x000003F0,0x000003F0,0x000003F0,0x000003F0,0x000003F0,0x000003F0,0x000003F0,0x000003F0
.long 0x000003F0,0x000003F0,0x000003F0,0x000003F0,0x000003F0,0x000003F0,0x000003F0,0x000003F0
.long 0x000003F0,0x000003F0,0x000003F0,0x000003F0,0x000003F0,0x000003F0,0x000003F0,0x000003F0
.long 0x000003F0,0x000003F0,0x000003F0,0x000003F0,0x000003F0,0x000003F0,0x000003F0,0x000003F0
| Standard MegaDrive ROM header at 0x100
.ascii "SEGA 32X Example" /* SEGA must be the first four chars for TMSS */
.ascii "(C)2024 "
.ascii "ClassiCube 32X " /* export name */
.ascii " "
.ascii " "
.ascii "ClassiCube 32X " /* domestic (Japanese) name */
.ascii " "
.ascii " "
.ascii "GM MK-0000 -00"
.word 0x0000 /* checksum - not needed */
.ascii "J6 "
.long 0x00000000,0x0007FFFF /* ROM start, end */
.long 0x00FF0000,0x00FFFFFF /* RAM start, end */
.ifdef HAS_SAVE_RAM
.ascii "RA" /* External RAM */
.byte 0xF8 /* don't clear + odd bytes */
.byte 0x20 /* SRAM */
.long 0x00200001,0x0020FFFF /* SRAM start, end */
.else
.ascii " " /* no SRAM */
.endif
.ascii " "
.ascii " "
.ifdef MYTH_HOMEBREW
.ascii "MYTH3900" /* memo indicates Myth native executable */
.else
.ascii " " /* memo */
.endif
.ascii " "
.ascii " "
.ascii "F " /* enable any hardware configuration */
| Mars exception vector jump table at 0x200
jmp 0x880800.l /* reset = hot start */
jsr 0x880806.l /* EX_BusError */
jsr 0x880806.l /* EX_AddrError */
jsr 0x880806.l /* EX_IllInstr */
jsr 0x880806.l /* EX_DivByZero */
jsr 0x880806.l /* EX_CHK */
jsr 0x880806.l /* EX_TrapV */
jsr 0x880806.l /* EX_Priviledge */
jsr 0x880806.l /* EX_Trace */
jsr 0x880806.l /* EX_LineA */
jsr 0x880806.l /* EX_LineF */
.space 72 /* reserved */
jsr 0x880806.l /* EX_Spurious */
jsr 0x880806.l /* EX_Level1 */
jsr 0x880806.l /* EX_Level2 */
jsr 0x880806.l /* EX_Level3 */
jmp 0x88080C.l /* EX_Level4 HBlank */
jsr 0x880806.l /* EX_Level5 */
jmp 0x880812.l /* EX_Level6 VBlank */
jsr 0x880806.l /* EX_Level7 */
jsr 0x880806.l /* EX_Trap0 */
jsr 0x880806.l /* EX_Trap1 */
jsr 0x880806.l /* EX_Trap2 */
jsr 0x880806.l /* EX_Trap3 */
jsr 0x880806.l /* EX_Trap4 */
jsr 0x880806.l /* EX_Trap5 */
jsr 0x880806.l /* EX_Trap6 */
jsr 0x880806.l /* EX_Trap7 */
jsr 0x880806.l /* EX_Trap8 */
jsr 0x880806.l /* EX_Trap9 */
jsr 0x880806.l /* EX_TrapA */
jsr 0x880806.l /* EX_TrapB */
jsr 0x880806.l /* EX_TrapC */
jsr 0x880806.l /* EX_TrapD */
jsr 0x880806.l /* EX_TrapE */
jsr 0x880806.l /* EX_TrapF */
.space 166 /* reserved */

1846
misc/32x/m68k_crt1.s Normal file

File diff suppressed because it is too large Load Diff

802
misc/32x/sh2_crt0.s Normal file
View File

@@ -0,0 +1,802 @@
! SEGA 32X support code for SH2
! by Chilly Willy
! Rom header and SH2 init/exception code - must be first in object list
.text
! Standard MD Header at 0x000
.incbin "build/32x/m68k_crt0.bin", 0, 0x3C0
! Standard Mars Header at 0x3C0
.ascii "ClassiCube 32X " /* module name (16 chars) */
.long 0x00000000 /* version */
.long __text_end-0x02000000 /* Source (in ROM) */
.long 0x00000000 /* Destination (in SDRAM) */
.long __data_size /* Size */
.long 0x06000240 /* Master SH2 Jump */
.long 0x06000244 /* Slave SH2 Jump */
.long 0x06000000 /* Master SH2 VBR */
.long 0x06000120 /* Slave SH2 VBR */
! Standard MD startup code at 0x3F0
.incbin "build/32x/m68k_crt1.bin"
.data
! Master Vector Base Table at 0x06000000
.long mstart /* Cold Start PC */
.long 0x0603FC00 /* Cold Start SP */
.long mstart /* Manual Reset PC */
.long 0x0603FC00 /* Manual Reset SP */
.long main_err /* Illegal instruction */
.long 0x00000000 /* reserved */
.long main_err /* Invalid slot instruction */
.long 0x20100400 /* reserved */
.long 0x20100420 /* reserved */
.long main_err /* CPU address error */
.long main_err /* DMA address error */
.long main_err /* NMI vector */
.long main_err /* User break vector */
.space 76 /* reserved */
.long main_err /* TRAPA #32 */
.long main_err /* TRAPA #33 */
.long main_err /* TRAPA #34 */
.long main_err /* TRAPA #35 */
.long main_err /* TRAPA #36 */
.long main_err /* TRAPA #37 */
.long main_err /* TRAPA #38 */
.long main_err /* TRAPA #39 */
.long main_err /* TRAPA #40 */
.long main_err /* TRAPA #41 */
.long main_err /* TRAPA #42 */
.long main_err /* TRAPA #43 */
.long main_err /* TRAPA #44 */
.long main_err /* TRAPA #45 */
.long main_err /* TRAPA #46 */
.long main_err /* TRAPA #47 */
.long main_err /* TRAPA #48 */
.long main_err /* TRAPA #49 */
.long main_err /* TRAPA #50 */
.long main_err /* TRAPA #51 */
.long main_err /* TRAPA #52 */
.long main_err /* TRAPA #53 */
.long main_err /* TRAPA #54 */
.long main_err /* TRAPA #55 */
.long main_err /* TRAPA #56 */
.long main_err /* TRAPA #57 */
.long main_err /* TRAPA #58 */
.long main_err /* TRAPA #59 */
.long main_err /* TRAPA #60 */
.long main_err /* TRAPA #61 */
.long main_err /* TRAPA #62 */
.long main_err /* TRAPA #63 */
.long main_irq /* Level 1 IRQ */
.long main_irq /* Level 2 & 3 IRQ's */
.long main_irq /* Level 4 & 5 IRQ's */
.long main_irq /* PWM interupt */
.long main_irq /* Command interupt */
.long main_irq /* H Blank interupt */
.long main_irq /* V Blank interupt */
.long main_irq /* Reset Button */
! Slave Vector Base Table at 0x06000120
.long sstart /* Cold Start PC */
.long 0x06040000 /* Cold Start SP */
.long sstart /* Manual Reset PC */
.long 0x06040000 /* Manual Reset SP */
.long slav_err /* Illegal instruction */
.long 0x00000000 /* reserved */
.long slav_err /* Invalid slot instruction */
.long 0x20100400 /* reserved */
.long 0x20100420 /* reserved */
.long slav_err /* CPU address error */
.long slav_err /* DMA address error */
.long slav_err /* NMI vector */
.long slav_err /* User break vector */
.space 76 /* reserved */
.long slav_err /* TRAPA #32 */
.long slav_err /* TRAPA #33 */
.long slav_err /* TRAPA #34 */
.long slav_err /* TRAPA #35 */
.long slav_err /* TRAPA #36 */
.long slav_err /* TRAPA #37 */
.long slav_err /* TRAPA #38 */
.long slav_err /* TRAPA #39 */
.long slav_err /* TRAPA #40 */
.long slav_err /* TRAPA #41 */
.long slav_err /* TRAPA #42 */
.long slav_err /* TRAPA #43 */
.long slav_err /* TRAPA #44 */
.long slav_err /* TRAPA #45 */
.long slav_err /* TRAPA #46 */
.long slav_err /* TRAPA #47 */
.long slav_err /* TRAPA #48 */
.long slav_err /* TRAPA #49 */
.long slav_err /* TRAPA #50 */
.long slav_err /* TRAPA #51 */
.long slav_err /* TRAPA #52 */
.long slav_err /* TRAPA #53 */
.long slav_err /* TRAPA #54 */
.long slav_err /* TRAPA #55 */
.long slav_err /* TRAPA #56 */
.long slav_err /* TRAPA #57 */
.long slav_err /* TRAPA #58 */
.long slav_err /* TRAPA #59 */
.long slav_err /* TRAPA #60 */
.long slav_err /* TRAPA #61 */
.long slav_err /* TRAPA #62 */
.long slav_err /* TRAPA #63 */
.long slav_irq /* Level 1 IRQ */
.long slav_irq /* Level 2 & 3 IRQ's */
.long slav_irq /* Level 4 & 5 IRQ's */
.long slav_irq /* PWM interupt */
.long slav_irq /* Command interupt */
.long slav_irq /* H Blank interupt */
.long slav_irq /* V Blank interupt */
.long slav_irq /* Reset Button */
! The main SH2 starts here at 0x06000240
mstart:
bra mcont
nop
! The slave SH2 starts here at 0x06000244
sstart:
bra scont
nop
! Each section of code below has its own data table so that the code
! can be extended without worrying about the offsets becoming too big.
! This results in duplicate entries, but not so many that we care. :)
mcont:
! clear interrupt flags
mov.l _master_int_clr,r1
mov.w r0,@-r1 /* PWM INT clear */
mov.w r0,@r1
mov.w r0,@-r1 /* CMD INT clear */
mov.w r0,@r1
mov.w r0,@-r1 /* H INT clear */
mov.w r0,@r1
mov.w r0,@-r1 /* V INT clear */
mov.w r0,@r1
mov.w r0,@-r1 /* VRES INT clear */
mov.w r0,@r1
mov.l _master_stk,r15
! purge cache and turn it off
mov.l _master_cctl,r0
mov #0x10,r1
mov.b r1,@r0
! clear bss
mov #0,r0
mov.l _master_bss_start,r1
mov.l _master_bss_end,r2
0:
mov.l r0,@r1
cmp/eq r1,r2
bf/s 0b
add #4,r1
! wait for 68000 to finish init
mov.l _master_sts,r0
mov.l _master_ok,r1
1:
mov.l @r0,r2
nop
nop
cmp/eq r1,r2
bt 1b
! do all initializers
mov.l _master_do_init,r0
jsr @r0
nop
! let Slave SH2 run
mov #0,r1
mov.l r1,@(4,r0) /* clear slave status */
mov #0x80,r0
mov.l _master_adapter,r1
mov.b r0,@r1 /* set FM */
mov #0x00,r0
mov.b r0,@(1,r1) /* set int enables */
mov #0x20,r0
ldc r0,sr /* allow ints */
! purge cache, turn it on, and run main()
mov.l _master_cctl,r0
mov #0x11,r1
mov.b r1,@r0
mov.l _master_go,r0
jsr @r0
nop
! do all finishers
mov.l _master_do_fini,r0
jsr @r0
nop
2:
bra 2b
nop
.align 2
_master_int_clr:
.long 0x2000401E /* one word passed last int clr reg */
_master_stk:
.long 0x0603FC00 /* Cold Start SP */
_master_sts:
.long 0x20004020
_master_ok:
.ascii "M_OK"
_master_adapter:
.long 0x20004000
_master_cctl:
.long 0xFFFFFE92
_master_go:
.long _main
_master_bss_start:
.long __bss_start
_master_bss_end:
.long __bss_end
_master_do_init:
.long __INIT_SECTION__
_master_do_fini:
.long __FINI_SECTION__
scont:
! clear interrupt flags
mov.l _slave_int_clr,r1
mov.w r0,@-r1 /* PWM INT clear */
mov.w r0,@r1
mov.w r0,@-r1 /* CMD INT clear */
mov.w r0,@r1
mov.w r0,@-r1 /* H INT clear */
mov.w r0,@r1
mov.w r0,@-r1 /* V INT clear */
mov.w r0,@r1
mov.w r0,@-r1 /* VRES INT clear */
mov.w r0,@r1
mov.l _slave_stk,r15
! wait for Master SH2 and 68000 to finish init
mov.l _slave_sts,r0
mov.l _slave_ok,r1
1:
mov.l @r0,r2
nop
nop
cmp/eq r1,r2
bt 1b
mov.l _slave_adapter,r1
mov #0x00,r0
mov.b r0,@(1,r1) /* set int enables (different from master despite same address!) */
mov #0x20,r0
ldc r0,sr /* allow ints */
! purge cache, turn it on, and run slave()
mov.l _slave_cctl,r0
mov #0x11,r1
mov.b r1,@r0
mov.l _slave_go,r0
jmp @r0
nop
.align 2
_slave_int_clr:
.long 0x2000401E /* one word passed last int clr reg */
_slave_stk:
.long 0x06040000 /* Cold Start SP */
_slave_sts:
.long 0x20004024
_slave_ok:
.ascii "S_OK"
_slave_adapter:
.long 0x20004000
_slave_cctl:
.long 0xFFFFFE92
_slave_go:
.long _slave
! Master exception handler
main_err:
rte
nop
! Master IRQ handler
main_irq:
mov.l r0,@-r15
stc sr,r0 /* SR holds IRQ level in I3-I0 */
shlr2 r0
and #0x38,r0
cmp/eq #0x28,r0
bt main_h_irq
cmp/eq #0x18,r0
bt main_pwm_irq
cmp/eq #0x30,r0
bt main_v_irq
cmp/eq #0x20,r0
bt main_cmd_irq
cmp/eq #0x38,r0
bt main_vres_irq
mov.l @r15+,r0
rte
nop
main_v_irq:
mov.l r1,@-r15
mov.l mvi_mars_adapter,r1
mov.w r0,@(0x16,r1) /* clear V IRQ */
nop
nop
nop
nop
! handle V IRQ
mov.l @r15+,r1
mov.l @r15+,r0
rte
nop
.align 2
mvi_mars_adapter:
.long 0x20004000
main_h_irq:
mov.l r1,@-r15
mov.l mhi_mars_adapter,r1
mov.w r0,@(0x18,r1) /* clear H IRQ */
nop
nop
nop
nop
! handle H IRQ
mov.l @r15+,r1
mov.l @r15+,r0
rte
nop
.align 2
mhi_mars_adapter:
.long 0x20004000
main_cmd_irq:
mov.l r1,@-r15
mov.l mci_mars_adapter,r1
mov.w r0,@(0x1A,r1) /* clear CMD IRQ */
nop
nop
nop
nop
! handle CMD IRQ
mov.l @r15+,r1
mov.l @r15+,r0
rte
nop
.align 2
mci_mars_adapter:
.long 0x20004000
main_pwm_irq:
mov.l r1,@-r15
mov.l mpi_mars_adapter,r1
mov.w r0,@(0x1C,r1) /* clear PWM IRQ */
nop
nop
nop
nop
! handle PWM IRQ
mov.l @r15+,r1
mov.l @r15+,r0
rte
nop
.align 2
mpi_mars_adapter:
.long 0x20004000
main_vres_irq:
mov.l mvri_mars_adapter,r1
mov.w r0,@(0x14,r1) /* clear VRES IRQ */
nop
nop
nop
nop
mov #0x0F,r0
shll2 r0
shll2 r0
ldc r0,sr /* disallow ints */
mov.l mvri_master_stk,r15
mov.l mvri_master_vres,r0
jmp @r0
nop
.align 2
mvri_mars_adapter:
.long 0x20004000
mvri_master_stk:
.long 0x0603FC00 /* Cold Start SP */
mvri_master_vres:
.long main_reset
! Slave exception handler
slav_err:
rte
nop
! Slave IRQ handler
slav_irq:
mov.l r0,@-r15
stc sr,r0 /* SR holds IRQ level I3-I0 */
shlr2 r0
and #0x38,r0
cmp/eq #0x28,r0
bt slav_h_irq
cmp/eq #0x18,r0
bt slav_pwm_irq
cmp/eq #0x30,r0
bt slav_v_irq
cmp/eq #0x20,r0
bt slav_cmd_irq
cmp/eq #0x38,r0
bt slav_vres_irq
mov.l @r15+,r0
rte
nop
slav_v_irq:
mov.l r1,@-r15
mov.l svi_mars_adapter,r1
mov.w r0,@(0x16,r1) /* clear V IRQ */
nop
nop
nop
nop
! handle V IRQ
mov.l @r15+,r1
mov.l @r15+,r0
rte
nop
.align 2
svi_mars_adapter:
.long 0x20004000
slav_h_irq:
mov.l r1,@-r15
mov.l shi_mars_adapter,r1
mov.w r0,@(0x18,r1) /* clear H IRQ */
nop
nop
nop
nop
! handle H IRQ
mov.l @r15+,r1
mov.l @r15+,r0
rte
nop
.align 2
shi_mars_adapter:
.long 0x20004000
slav_cmd_irq:
mov.l r1,@-r15
mov.l sci_mars_adapter,r1
mov.w r0,@(0x1A,r1) /* clear CMD IRQ */
nop
nop
nop
nop
! handle CMD IRQ
mov.l @r15+,r1
mov.l @r15+,r0
rte
nop
.align 2
sci_mars_adapter:
.long 0x20004000
slav_pwm_irq:
mov.l r1,@-r15
mov.l spi_mars_adapter,r1
mov.w r0,@(0x1C,r1) /* clear PWM IRQ */
nop
nop
nop
nop
! handle PWM IRQ
mov.l @r15+,r1
mov.l @r15+,r0
rte
nop
.align 2
spi_mars_adapter:
.long 0x20004000
slav_vres_irq:
mov.l svri_mars_adapter,r1
mov.w r0,@(0x14,r1) /* clear VRES IRQ */
nop
nop
nop
nop
mov #0x0F,r0
shll2 r0
shll2 r0
ldc r0,sr /* disallow ints */
mov.l svri_slave_stk,r15
mov.l svri_slave_vres,r0
jmp @r0
nop
.align 2
svri_mars_adapter:
.long 0x20004000
svri_slave_stk:
.long 0x06040000 /* Cold Start SP */
svri_slave_vres:
.long slav_reset
! Fast memcpy function - copies longs, runs from sdram for speed
! On entry: r4 = dst, r5 = src, r6 = len (in longs)
.align 4
.global _fast_memcpy
_fast_memcpy:
mov.l @r5+,r3
mov.l r3,@r4
dt r6
bf/s _fast_memcpy
add #4,r4
rts
nop
! Cache clear line function
! On entry: r4 = ptr - should be 16 byte aligned
.align 4
.global _CacheClearLine
_CacheClearLine:
mov.l _cache_flush,r0
or r0,r4
mov #0,r0
mov.l r0,@r4
rts
nop
.align 2
_cache_flush:
.long 0x40000000
! Cache control function
! On entry: r4 = cache mode => 0x10 = CP, 0x08 = TW, 0x01 = CE
.align 4
.global _CacheControl
_CacheControl:
mov.l _sh2_cctl,r0
mov.b r4,@r0
rts
nop
.align 2
_sh2_cctl:
.long 0xFFFFFE92
! void ScreenStretch(int src, int width, int height, int interp);
! On entry: r4 = src pointer, r5 = width, r6 = height, r7 = interpolate
.align 4
.global _ScreenStretch
_ScreenStretch:
cmp/pl r7
bt ss_interp
! stretch screen without interpolation
0:
mov r5,r3
shll r3
mov r3,r2
shll r2
add r4,r3
add r4,r2
1:
add #-2,r3
mov.w @r3,r0
extu.w r0,r1
shll16 r0
or r1,r0
mov.l r0,@-r2
cmp/eq r3,r4
bf 1b
/* next line */
mov.w ss_pitch,r0
dt r6
bf/s 0b
add r0,r4
rts
nop
ss_interp:
! stretch screen with interpolation
0:
mov r5,r3
shll r3
mov r3,r2
shll r2
add r4,r3
add r4,r2
mov #0,r7
1:
add #-2,r3
mov.w @r3,r0
mov.w ss_mask,r1
and r0,r1 /* masked curr pixel */
shll16 r0
add r1,r7 /* add to masked prev pixel */
shlr r7 /* blended pixel */
or r7,r0 /* curr pixel << 16 | blended pixel */
mov r1,r7 /* masked prev pixel = masked curr pixel */
mov.l r0,@-r2
cmp/eq r3,r4
bf 1b
/* next line */
mov.w ss_pitch,r0
dt r6
bf/s 0b
add r0,r4
rts
nop
ss_mask:
.word 0x7BDE
ss_pitch:
.word 640
.align 2
.text
main_reset:
! do any master SH2 specific reset code here
mov.l slav_st,r0
mov.l slav_ok,r1
0:
mov.l @r0,r2
nop
nop
cmp/eq r1,r2
bf 0b /* wait for slave */
! recopy rom data to sdram
mov.l rom_header,r1
mov.l @r1,r2 /* src relative to start of rom */
mov.l @(4,r1),r3 /* dst relative to start of sdram */
mov.l @(8,r1),r4 /* size (longword aligned) */
mov.l rom_start,r1
add r1,r2
mov.l sdram_start,r1
add r1,r3
shlr2 r4 /* number of longs */
add #-1,r4
1:
mov.l @r2+,r0
mov.l r0,@r3
add #4,r3
dt r4
bf 1b
mov.l main_st,r0
mov.l main_ok,r1
mov.l r1,@r0 /* tell everyone reset complete */
mov.l main_go,r0
jmp @r0
nop
slav_reset:
! do any slave SH2 specific reset code here
mov.l slav_st,r0
mov.l slav_ok,r1
mov.l r1,@r0 /* tell master to start reset */
mov.l main_st,r0
mov.l main_ok,r1
0:
mov.l @r0,r2
nop
nop
cmp/eq r1,r2
bf 0b /* wait for master to do the work */
mov.l slav_go,r0
jmp @r0
nop
.align 2
main_st:
.long 0x20004020
main_ok:
.ascii "M_OK"
main_go:
.long mstart
rom_header:
.long 0x220003D4
rom_start:
.long 0x22000000
sdram_start:
.long 0x26000000
slav_st:
.long 0x20004024
slav_ok:
.ascii "S_OK"
slav_go:
.long sstart
.global _start
_start:

127
misc/3ds/Makefile Normal file
View File

@@ -0,0 +1,127 @@
ifeq ($(strip $(DEVKITPRO)),)
$(error "Please set DEVKITPRO in your environment. export DEVKITPRO=<path to>devkitPro)
endif
#---------------------------------------------------------------------------------
# Configurable options
#---------------------------------------------------------------------------------
# Name of the final output
TARGET = ClassiCube-3ds
# List of directories containing source code
SOURCE_DIRS = src src/3ds third_party/bearssl/src
# List of directories containing shader files
SHDR_DIRS = misc/3ds
# List of directories containing more header files
INCLUDES = -Ithird_party/bearssl/inc
# Directory where object files are placed
BUILD_DIR = build/3ds
APP_ICON = misc/3ds/icon.png
APP_TITLE = ClassiCube
APP_DESCRIPTION = Simple block building sandbox
APP_AUTHOR = ClassiCube team
CIA_BANNER_BIN = misc/3ds/banner.bin
CIA_ICON_BIN = misc/3ds/icon.bin
CIA_SPEC_RSF = misc/3ds/spec.rsf
#---------------------------------------------------------------------------------
# Code generation
#---------------------------------------------------------------------------------
S_FILES = $(foreach dir,$(SOURCE_DIRS),$(wildcard $(dir)/*.S))
C_FILES = $(foreach dir,$(SOURCE_DIRS),$(wildcard $(dir)/*.c))
OBJS = $(addprefix $(BUILD_DIR)/, $(notdir $(C_FILES:%.c=%.o) $(S_FILES:%.S=%.o)))
PICAFILES := $(foreach dir,$(SHDR_DIRS),$(notdir $(wildcard $(dir)/*.v.pica)))
OBJS += $(addprefix $(BUILD_DIR)/, $(PICAFILES:.v.pica=.shbin.o))
ARCH = -march=armv6k -mtune=mpcore -mfloat-abi=hard -mtp=soft
CFLAGS = -g -Wall -O2 -mword-relocations -ffunction-sections $(ARCH) $(INCLUDE) -D__3DS__
ASFLAGS = -g $(ARCH)
LDFLAGS = -specs=3dsx.specs -g $(ARCH)
LIBS = -lctru -lm
CTRULIB = $(DEVKITPRO)/libctru
INCLUDES += $(foreach dir, $(CTRULIB), -I$(dir)/include)
LDFLAGS += $(foreach dir, $(CTRULIB), -L$(dir)/lib)
# Dependency tracking
DEPFLAGS = -MT $@ -MMD -MP -MF $(BUILD_DIR)/$*.d
DEPFILES := $(OBJS:%.o=%.d)
#---------------------------------------------------------------------------------
# Compiler tools
#---------------------------------------------------------------------------------
PREFIX := $(DEVKITPRO)/devkitARM/bin/arm-none-eabi-
ARM_AS := $(PREFIX)as
ARM_CC := $(PREFIX)gcc
ARM_CXX := $(PREFIX)g++
_DSXTOOL := $(DEVKITPRO)/tools/bin/3dsxtool
SMDHTOOL := $(DEVKITPRO)/tools/bin/smdhtool
PICASSO := $(DEVKITPRO)/tools/bin/picasso
BIN2S := $(DEVKITPRO)/tools/bin/bin2s
#---------------------------------------------------------------------------------
# Main targets
#---------------------------------------------------------------------------------
default: $(BUILD_DIR) $(TARGET).cia
clean:
rm $(TARGET).cia $(TARGET).3dsx $(TARGET).elf $(OBJS)
$(BUILD_DIR):
mkdir -p $(BUILD_DIR)
#---------------------------------------------------------------------------------
# Executable generation
#---------------------------------------------------------------------------------
$(TARGET).elf: $(OBJS)
$(ARM_CC) $(LDFLAGS) $^ -o $@ $(LIBS)
$(BUILD_DIR).smdh: $(APP_ICON)
$(SMDHTOOL) --create "$(APP_TITLE)" "$(APP_DESCRIPTION)" "$(APP_AUTHOR)" $(APP_ICON) $@
$(TARGET).3dsx: $(TARGET).elf $(BUILD_DIR).smdh
$(_DSXTOOL) $< $@ --smdh=$(BUILD_DIR).smdh
$(BUILD_DIR)/makerom:
wget https://github.com/3DSGuy/Project_CTR/releases/download/makerom-v0.18.3/makerom-v0.18.3-ubuntu_x86_64.zip -O $(BUILD_DIR)/makerom.zip
unzip $(BUILD_DIR)/makerom.zip -d $(BUILD_DIR)
chmod +x $(BUILD_DIR)/makerom
$(TARGET).cia : $(TARGET).3dsx $(BUILD_DIR)/makerom
$(BUILD_DIR)/makerom -f cia -o $(TARGET).cia -elf $(TARGET).elf -rsf $(CIA_SPEC_RSF) -icon $(CIA_ICON_BIN) -banner $(CIA_BANNER_BIN) -exefslogo -target t
#---------------------------------------------------------------------------------
# Object generation
#---------------------------------------------------------------------------------
$(BUILD_DIR)/%.o: src/%.c
$(ARM_CC) $(CFLAGS) $(INCLUDES) $(DEPFLAGS) -c $< -o $@
$(BUILD_DIR)/%.o: src/3ds/%.c
$(ARM_CC) $(CFLAGS) $(INCLUDES) $(DEPFLAGS) -c $< -o $@
$(BUILD_DIR)/%.o: third_party/bearssl/src/%.c
$(ARM_CC) $(CFLAGS) $(INCLUDES) -c $< -o $@
$(BUILD_DIR)/%.shbin: misc/3ds/%.v.pica
$(PICASSO) $< -o $@
$(BUILD_DIR)/%.shbin.o: $(BUILD_DIR)/%.shbin
$(BIN2S) $< | $(ARM_AS) -o $@
#---------------------------------------------------------------------------------
# Dependency tracking
#---------------------------------------------------------------------------------
$(DEPFILES):
include $(wildcard $(DEPFILES))

BIN
misc/3ds/audio.wav Normal file

Binary file not shown.

BIN
misc/3ds/banner.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

33
misc/3ds/coloured.v.pica Normal file
View File

@@ -0,0 +1,33 @@
; Vertex shader for rendering coloured vertices for PICA200 GPU on the Nintendo 3DS
; ==================================================================================
; Uniforms
.fvec MVP[4];
; Constants
.constf ONE_DIV_255(0.003921568627, 0.003921568627, 0.003921568627, 0.003921568627)
; Outputs
.out out_pos position
.out out_col color
; Inputs (defined as aliases for convenience)
.alias in_pos v0
.alias in_col v1
.proc main
; r0 = in_pos
mov r0, in_pos
; out_pos = MVP * r0
dp4 out_pos.x, MVP[0], r0
dp4 out_pos.y, MVP[1], r0
dp4 out_pos.z, MVP[2], r0
dp4 out_pos.w, MVP[3], r0
; out_col = in_col * ONE_DIV_255
mul out_col, ONE_DIV_255, in_col
end
.end

BIN
misc/3ds/icon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

38
misc/3ds/offset.v.pica Normal file
View File

@@ -0,0 +1,38 @@
; Vertex shader for rendering textured vertices with an offset for PICA200 GPU on the Nintendo 3DS
; ==================================================================================
; Uniforms
.fvec MVP[4];
.fvec tex_offset;
; Constants
.constf ONE_DIV_255(0.003921568627, 0.003921568627, 0.003921568627, 0.003921568627)
; Outputs
.out out_pos position
.out out_col color
.out out_tex texcoord0
; Inputs (defined as aliases for convenience)
.alias in_pos v0
.alias in_col v1
.alias in_tex v2
.proc main
; r0 = in_pos
mov r0, in_pos
; out_pos = MVP * r0
dp4 out_pos.x, MVP[0], r0
dp4 out_pos.y, MVP[1], r0
dp4 out_pos.z, MVP[2], r0
dp4 out_pos.w, MVP[3], r0
; out_col = in_col * ONE_DIV_255
mul out_col, ONE_DIV_255, in_col
; out_tex = in_tex + tex_offset
add out_tex, tex_offset, in_tex
end
.end

5
misc/3ds/readme.md Normal file
View File

@@ -0,0 +1,5 @@
Commands used to generate the .bin files:
`bannertool makebanner -i banner.png -a audio.wav -o banner.bin`
`bannertool makesmdh -s ClassiCube -l ClassiCube -p UnknownShadow200 -i icon.png -o icon.bin`

204
misc/3ds/spec.rsf Normal file
View File

@@ -0,0 +1,204 @@
# https://github.com/msikma/3ds-tpl
# https://gist.github.com/jakcron/9f9f02ffd94d98a72632
BasicInfo:
Title : ClassiCube
CompanyCode : "00"
ProductCode : CCBE
ContentType : Application
Logo : Nintendo
TitleInfo:
UniqueId : 0x00CCBE
Category : Application
CardInfo:
MediaSize : 128MB # 128MB / 256MB / 512MB / 1GB / 2GB / 4GB
MediaType : Card1 # Card1 / Card2
CardDevice : NorFlash # NorFlash(Pick this if you use savedata) / None
Option:
UseOnSD : true # true if App is to be installed to SD
FreeProductCode : true # Removes limitations on ProductCode
MediaFootPadding : false # If true CCI files are created with padding
EnableCrypt : false # Enables encryption for NCCH and CIA
EnableCompress : true # Compresses exefs code
AccessControlInfo:
#UseExtSaveData : true
#ExtSaveDataId: 0xff3ff
#UseExtendedSaveDataAccessControl: true
#AccessibleSaveDataIds: [0x101, 0x202, 0x303, 0x404, 0x505, 0x606]
SystemControlInfo:
SaveDataSize: 128KB
RemasterVersion: 0
StackSize: 0x40000
AccessControlInfo:
FileSystemAccess:
- Debug
- DirectSdmc
- DirectSdmcWrite
IdealProcessor : 0
AffinityMask : 1
Priority : 16
SystemMode : 80MB
MaxCpu : 0x9E # Default
DisableDebug : false
EnableForceDebug : false
CanWriteSharedPage : false
CanUsePrivilegedPriority : false
CanUseNonAlphabetAndNumber : false
PermitMainFunctionArgument : false
CanShareDeviceMemory : false
RunnableOnSleep : false
SpecialMemoryArrange : false
CoreVersion : 2
DescVersion : 2
ReleaseKernelMajor : "02"
ReleaseKernelMinor : "33"
MemoryType : Application
HandleTableSize: 512
# New3DS Exclusive Process Settings
SystemModeExt : 124MB # Legacy(Default)/124MB/178MB Legacy:Use Old3DS SystemMode
CpuSpeed : 804MHz # 268MHz(Default)/804MHz
EnableL2Cache : true # false(default)/true
CanAccessCore2 : true
# Virtual Address Mappings
IORegisterMapping:
- 1ff50000-1ff57fff # DSP memory
- 1ff70000-1ff77fff
MemoryMapping:
- 1f000000-1f5fffff:r # VRAM
SystemCallAccess:
ArbitrateAddress: 34
Break: 60
CancelTimer: 28
ClearEvent: 25
ClearTimer: 29
CloseHandle: 35
ConnectToPort: 45
ControlMemory: 1
CreateAddressArbiter: 33
CreateEvent: 23
CreateMemoryBlock: 30
CreateMutex: 19
CreateSemaphore: 21
CreateThread: 8
CreateTimer: 26
DuplicateHandle: 39
ExitProcess: 3
ExitThread: 9
GetCurrentProcessorNumber: 17
GetHandleInfo: 41
GetProcessId: 53
GetProcessIdOfThread: 54
GetProcessIdealProcessor: 6
GetProcessInfo: 43
GetResourceLimit: 56
GetResourceLimitCurrentValues: 58
GetResourceLimitLimitValues: 57
GetSystemInfo: 42
GetSystemTick: 40
GetThreadContext: 59
GetThreadId: 55
GetThreadIdealProcessor: 15
GetThreadInfo: 44
GetThreadPriority: 11
MapMemoryBlock: 31
OutputDebugString: 61
QueryMemory: 2
ReleaseMutex: 20
ReleaseSemaphore: 22
SendSyncRequest1: 46
SendSyncRequest2: 47
SendSyncRequest3: 48
SendSyncRequest4: 49
SendSyncRequest: 50
SetThreadPriority: 12
SetTimer: 27
SignalEvent: 24
SleepThread: 10
UnmapMemoryBlock: 32
WaitSynchronization1: 36
WaitSynchronizationN: 37
InterruptNumbers:
# Service List
# Maximum 34 services (32 if firmware is prior to 9.3.0)
ServiceAccessControl:
- APT:U
- $hioFIO
- $hostio0
- $hostio1
- ac:u
- boss:U
- cam:u
- cecd:u
- cfg:u
- dlp:FKCL
- dlp:SRVR
- dsp::DSP
- frd:u
- fs:USER
- gsp::Gpu
- hid:USER
- mic:u
- ndm:u
- news:s
- nwm::UDS
- ptm:u
- pxi:dev
- soc:U
- gsp::Lcd
- y2r:u
- ldr:ro
- ir:USER
- ir:u
- csnd:SND
- am:u
- ns:s
SystemControlInfo:
# Modules that run services listed above should be included below
# Maximum 48 dependencies
# If a module is listed that isn't present on the 3DS, the title will get stuck at the logo (3ds waves)
# So act, nfc and qtm are commented for 4.x support. Uncomment if you need these.
# <module name>:<module titleid>
Dependency:
ac: 0x0004013000002402L
am: 0x0004013000001502L
boss: 0x0004013000003402L
camera: 0x0004013000001602L
cecd: 0x0004013000002602L
cfg: 0x0004013000001702L
codec: 0x0004013000001802L
csnd: 0x0004013000002702L
dlp: 0x0004013000002802L
dsp: 0x0004013000001a02L
friends: 0x0004013000003202L
gpio: 0x0004013000001b02L
gsp: 0x0004013000001c02L
hid: 0x0004013000001d02L
i2c: 0x0004013000001e02L
ir: 0x0004013000003302L
mcu: 0x0004013000001f02L
mic: 0x0004013000002002L
ndm: 0x0004013000002b02L
news: 0x0004013000003502L
nim: 0x0004013000002c02L
nwm: 0x0004013000002d02L
pdn: 0x0004013000002102L
ps: 0x0004013000003102L
ptm: 0x0004013000002202L
ro: 0x0004013000003702L
socket: 0x0004013000002e02L
spi: 0x0004013000002302L

37
misc/3ds/textured.v.pica Normal file
View File

@@ -0,0 +1,37 @@
; Vertex shader for rendering textured vertices for PICA200 GPU on the Nintendo 3DS
; ==================================================================================
; Uniforms
.fvec MVP[4];
; Constants
.constf ONE_DIV_255(0.003921568627, 0.003921568627, 0.003921568627, 0.003921568627)
; Outputs
.out out_pos position
.out out_col color
.out out_tex texcoord0
; Inputs (defined as aliases for convenience)
.alias in_pos v0
.alias in_col v1
.alias in_tex v2
.proc main
; r0 = in_pos
mov r0, in_pos
; out_pos = MVP * r0
dp4 out_pos.x, MVP[0], r0
dp4 out_pos.y, MVP[1], r0
dp4 out_pos.z, MVP[2], r0
dp4 out_pos.w, MVP[3], r0
; out_col = in_col * ONE_DIV_255
mul out_col, ONE_DIV_255, in_col
; out_tex = in_tex
mov out_tex, in_tex
end
.end

BIN
misc/CCicon.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 107 KiB

BIN
misc/CCicon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.0 KiB

View File

@@ -0,0 +1,50 @@
<?xml version="1.0" encoding="utf-8"?>
<Package
xmlns="http://schemas.microsoft.com/appx/manifest/foundation/windows10"
xmlns:mp="http://schemas.microsoft.com/appx/2014/phone/manifest"
xmlns:uap="http://schemas.microsoft.com/appx/manifest/uap/windows10"
IgnorableNamespaces="uap mp">
<Identity
Name="64f1d536-965b-4190-90d3-47d861786f88"
Publisher="CN=ClassiCube"
Version="1.0.0.0" />
<mp:PhoneIdentity PhoneProductId="64f1d536-965b-4190-90d3-47d861786f88" PhonePublisherId="00000000-0000-0000-0000-000000000000"/>
<Properties>
<DisplayName>ClassiCube-UWP</DisplayName>
<PublisherDisplayName>ClassiCube</PublisherDisplayName>
<Logo>Assets\StoreLogo.png</Logo>
</Properties>
<Dependencies>
<TargetDeviceFamily Name="Windows.Universal" MinVersion="10.0.0.0" MaxVersionTested="10.0.0.0" />
</Dependencies>
<Resources>
<Resource Language="x-generate"/>
</Resources>
<Applications>
<Application Id="App"
Executable="$targetnametoken$.exe"
EntryPoint="ClassiCube_UWP.App">
<uap:VisualElements
DisplayName="ClassiCube-UWP"
Description="ClassiCube-UWP"
BackgroundColor="transparent" Square44x44Logo="Assets\Square44x44Logo.png" Square150x150Logo="Assets\Square150x150Logo.png">
<uap:DefaultTile>
<uap:ShowNameOnTiles>
<uap:ShowOn Tile="square150x150Logo"/>
</uap:ShowNameOnTiles>
</uap:DefaultTile>
</uap:VisualElements>
</Application>
</Applications>
<Capabilities>
<Capability Name="internetClient" />
</Capabilities>
</Package>

809
misc/UWP/Platform_UWP.cpp Normal file
View File

@@ -0,0 +1,809 @@
#include "../../src/Core.h"
#include "../../src/_PlatformBase.h"
#include "../../src/Stream.h"
#include "../../src/SystemFonts.h"
#include "../../src/Funcs.h"
#include "../../src/Utils.h"
#include "../../src/Errors.h"
#define WIN32_LEAN_AND_MEAN
#define NOSERVICE
#define NOMCX
#define NOIME
#ifndef UNICODE
#define UNICODE
#define _UNICODE
#endif
#include <windows.h>
#include <winsock2.h>
#include <ws2tcpip.h>
#include <shellapi.h>
#include <wincrypt.h>
#include <winrt/Windows.Foundation.h>
#include <winrt/Windows.System.h>
using namespace winrt;
using namespace Windows::Foundation;
using namespace Windows::System;
static HANDLE heap;
const cc_result ReturnCode_FileShareViolation = ERROR_SHARING_VIOLATION;
const cc_result ReturnCode_FileNotFound = ERROR_FILE_NOT_FOUND;
const cc_result ReturnCode_DirectoryExists = ERROR_ALREADY_EXISTS;
const cc_result ReturnCode_SocketInProgess = WSAEINPROGRESS;
const cc_result ReturnCode_SocketWouldBlock = WSAEWOULDBLOCK;
const cc_result ReturnCode_SocketDropped = WSAECONNRESET;
const char* Platform_AppNameSuffix = "";
cc_bool Platform_ReadonlyFilesystem;
cc_uint8 Platform_Flags = PLAT_FLAG_SINGLE_PROCESS;
#define UWP_STRING(str) ((wchar_t*)(str)->uni)
/*########################################################################################################################*
*---------------------------------------------------------Memory----------------------------------------------------------*
*#########################################################################################################################*/
void* Mem_Set(void* dst, cc_uint8 value, unsigned numBytes) { return memset( dst, value, numBytes); }
void* Mem_Copy(void* dst, const void* src, unsigned numBytes) { return memcpy( dst, src, numBytes); }
void* Mem_Move(void* dst, const void* src, unsigned numBytes) { return memmove(dst, src, numBytes); }
void* Mem_TryAlloc(cc_uint32 numElems, cc_uint32 elemsSize) {
cc_uint32 size = CalcMemSize(numElems, elemsSize);
return size ? HeapAlloc(heap, 0, size) : NULL;
}
void* Mem_TryAllocCleared(cc_uint32 numElems, cc_uint32 elemsSize) {
cc_uint32 size = CalcMemSize(numElems, elemsSize);
return size ? HeapAlloc(heap, HEAP_ZERO_MEMORY, size) : NULL;
}
void* Mem_TryRealloc(void* mem, cc_uint32 numElems, cc_uint32 elemsSize) {
cc_uint32 size = CalcMemSize(numElems, elemsSize);
return size ? HeapReAlloc(heap, 0, mem, size) : NULL;
}
void Mem_Free(void* mem) {
if (mem) HeapFree(heap, 0, mem);
}
/*########################################################################################################################*
*------------------------------------------------------Logging/Time-------------------------------------------------------*
*#########################################################################################################################*/
/* TODO: check this is actually accurate */
static cc_uint64 sw_freqMul = 1, sw_freqDiv = 1;
cc_uint64 Stopwatch_ElapsedMicroseconds(cc_uint64 beg, cc_uint64 end) {
if (end < beg) return 0;
return ((end - beg) * sw_freqMul) / sw_freqDiv;
}
static HANDLE conHandle;
static BOOL hasDebugger;
void Platform_Log(const char* msg, int len) {
char tmp[2048 + 1];
DWORD wrote;
if (conHandle) {
WriteFile(conHandle, msg, len, &wrote, NULL);
WriteFile(conHandle, "\n", 1, &wrote, NULL);
}
if (!hasDebugger) return;
len = min(len, 2048);
Mem_Copy(tmp, msg, len); tmp[len] = '\0';
OutputDebugStringA(tmp);
OutputDebugStringA("\n");
}
#define FILETIME_EPOCH 50491123200ULL
#define FILETIME_UNIX_EPOCH 11644473600ULL
#define FileTime_TotalSecs(time) ((time / 10000000) + FILETIME_EPOCH)
#define FileTime_UnixTime(time) ((time / 10000000) - FILETIME_UNIX_EPOCH)
TimeMS DateTime_CurrentUTC(void) {
FILETIME ft;
cc_uint64 raw;
GetSystemTimeAsFileTime(&ft);
/* in 100 nanosecond units, since Jan 1 1601 */
raw = ft.dwLowDateTime | ((cc_uint64)ft.dwHighDateTime << 32);
return FileTime_TotalSecs(raw);
}
void DateTime_CurrentLocal(struct cc_datetime* t) {
SYSTEMTIME localTime;
GetLocalTime(&localTime);
t->year = localTime.wYear;
t->month = localTime.wMonth;
t->day = localTime.wDay;
t->hour = localTime.wHour;
t->minute = localTime.wMinute;
t->second = localTime.wSecond;
}
static cc_bool sw_highRes;
cc_uint64 Stopwatch_Measure(void) {
LARGE_INTEGER t;
FILETIME ft;
if (sw_highRes) {
QueryPerformanceCounter(&t);
return (cc_uint64)t.QuadPart;
} else {
GetSystemTimeAsFileTime(&ft);
return (cc_uint64)ft.dwLowDateTime | ((cc_uint64)ft.dwHighDateTime << 32);
}
}
/*########################################################################################################################*
*-------------------------------------------------------Crash handling----------------------------------------------------*
*#########################################################################################################################*/
static const char* ExceptionDescribe(cc_uint32 code) {
switch (code) {
case EXCEPTION_ACCESS_VIOLATION: return "ACCESS_VIOLATION";
case EXCEPTION_ILLEGAL_INSTRUCTION: return "ILLEGAL_INSTRUCTION";
case EXCEPTION_INT_DIVIDE_BY_ZERO: return "DIVIDE_BY_ZERO";
}
return NULL;
}
static LONG WINAPI UnhandledFilter(struct _EXCEPTION_POINTERS* info) {
cc_string msg; char msgBuffer[128 + 1];
const char* desc;
cc_uint32 code;
cc_uintptr addr;
code = (cc_uint32)info->ExceptionRecord->ExceptionCode;
addr = (cc_uintptr)info->ExceptionRecord->ExceptionAddress;
desc = ExceptionDescribe(code);
String_InitArray_NT(msg, msgBuffer);
if (desc) {
String_Format2(&msg, "Unhandled %c error at %x", desc, &addr);
} else {
String_Format2(&msg, "Unhandled exception 0x%h at %x", &code, &addr);
}
DWORD numArgs = info->ExceptionRecord->NumberParameters;
if (numArgs) {
numArgs = min(numArgs, EXCEPTION_MAXIMUM_PARAMETERS);
String_AppendConst(&msg, " [");
for (DWORD i = 0; i < numArgs; i++)
{
String_Format1(&msg, "0x%x,", &info->ExceptionRecord->ExceptionInformation[i]);
}
String_Append(&msg, ']');
}
msg.buffer[msg.length] = '\0';
Logger_DoAbort(0, msg.buffer, info->ContextRecord);
return EXCEPTION_EXECUTE_HANDLER; /* TODO: different flag */
}
void CrashHandler_Install(void) {
SetUnhandledExceptionFilter(UnhandledFilter);
}
void Process_Abort2(cc_result result, const char* raw_msg) {
Logger_DoAbort(result, raw_msg, NULL);
}
/*########################################################################################################################*
*-----------------------------------------------------Directory/File------------------------------------------------------*
*#########################################################################################################################*/
void Directory_GetCachePath(cc_string* path) { }
void Platform_EncodePath(cc_filepath* dst, const cc_string* src) {
Platform_EncodeString(dst, src);
}
cc_result Directory_Create(const cc_filepath* path) {
if (CreateDirectoryW(UWP_STRING(path), NULL)) return 0;
return GetLastError();
}
int File_Exists(const cc_filepath* path) {
DWORD attribs = GetFileAttributesW(UWP_STRING(path));
return attribs != INVALID_FILE_ATTRIBUTES && !(attribs & FILE_ATTRIBUTE_DIRECTORY);
}
static cc_result Directory_EnumCore(const cc_string* dirPath, const cc_string* file, DWORD attribs,
void* obj, Directory_EnumCallback callback) {
cc_string path; char pathBuffer[MAX_PATH + 10];
int is_dir;
/* ignore . and .. entry */
if (file->length == 1 && file->buffer[0] == '.') return 0;
if (file->length == 2 && file->buffer[0] == '.' && file->buffer[1] == '.') return 0;
String_InitArray(path, pathBuffer);
String_Format2(&path, "%s/%s", dirPath, file);
is_dir = attribs & FILE_ATTRIBUTE_DIRECTORY;
callback(&path, obj, is_dir);
return 0;
}
cc_result Directory_Enum(const cc_string* dirPath, void* obj, Directory_EnumCallback callback) {
cc_string path; char pathBuffer[MAX_PATH + 10];
WIN32_FIND_DATAW eW;
int i, ansi = false;
cc_filepath str;
HANDLE find;
cc_result res;
/* Need to append \* to search for files in directory */
String_InitArray(path, pathBuffer);
String_Format1(&path, "%s\\*", dirPath);
Platform_EncodePath(&str, &path);
find = FindFirstFileW(UWP_STRING(&str), &eW);
if (!find || find == INVALID_HANDLE_VALUE)
return GetLastError();
do {
path.length = 0;
for (i = 0; i < MAX_PATH && eW.cFileName[i]; i++) {
/* TODO: UTF16 to codepoint conversion */
String_Append(&path, Convert_CodepointToCP437(eW.cFileName[i]));
}
if ((res = Directory_EnumCore(dirPath, &path, eW.dwFileAttributes, obj, callback))) return res;
} while (FindNextFileW(find, &eW));
res = GetLastError(); /* return code from FindNextFile */
FindClose(find);
return res == ERROR_NO_MORE_FILES ? 0 : res;
}
static cc_result DoFile(cc_file* file, const cc_filepath* path, DWORD access, DWORD createMode) {
*file = CreateFile2(UWP_STRING(path), access, FILE_SHARE_READ, createMode, NULL);
if (*file && *file != INVALID_HANDLE_VALUE) return 0;
return GetLastError();
}
cc_result File_Open(cc_file* file, const cc_filepath* path) {
return DoFile(file, path, GENERIC_READ, OPEN_EXISTING);
}
cc_result File_Create(cc_file* file, const cc_filepath* path) {
return DoFile(file, path, GENERIC_WRITE | GENERIC_READ, CREATE_ALWAYS);
}
cc_result File_OpenOrCreate(cc_file* file, const cc_filepath* path) {
return DoFile(file, path, GENERIC_WRITE | GENERIC_READ, OPEN_ALWAYS);
}
cc_result File_Read(cc_file file, void* data, cc_uint32 count, cc_uint32* bytesRead) {
/* NOTE: the (DWORD*) cast assumes that sizeof(long) is 4 */
BOOL success = ReadFile(file, data, count, (DWORD*)bytesRead, NULL);
return success ? 0 : GetLastError();
}
cc_result File_Write(cc_file file, const void* data, cc_uint32 count, cc_uint32* bytesWrote) {
/* NOTE: the (DWORD*) cast assumes that sizeof(long) is 4 */
BOOL success = WriteFile(file, data, count, (DWORD*)bytesWrote, NULL);
return success ? 0 : GetLastError();
}
cc_result File_Close(cc_file file) {
return CloseHandle(file) ? 0 : GetLastError();
}
cc_result File_Seek(cc_file file, int offset, int seekType) {
static cc_uint8 modes[] = { FILE_BEGIN, FILE_CURRENT, FILE_END };
DWORD pos = SetFilePointer(file, offset, NULL, modes[seekType]);
return pos != INVALID_SET_FILE_POINTER ? 0 : GetLastError();
}
cc_result File_Position(cc_file file, cc_uint32* pos) {
*pos = SetFilePointer(file, 0, NULL, FILE_CURRENT);
return *pos != INVALID_SET_FILE_POINTER ? 0 : GetLastError();
}
cc_result File_Length(cc_file file, cc_uint32* len) {
LARGE_INTEGER raw;
if (!GetFileSizeEx(file, &raw)) return GetLastError();
*len = raw.QuadPart;
return 0;
}
/*########################################################################################################################*
*--------------------------------------------------------Threading--------------------------------------------------------*
*#############################################################################################################p############*/
void Thread_Sleep(cc_uint32 milliseconds) { Sleep(milliseconds); }
static DWORD WINAPI ExecThread(void* param) {
Thread_StartFunc func = (Thread_StartFunc)param;
func();
return 0;
}
void Thread_Run(void** handle, Thread_StartFunc func, int stackSize, const char* name) {
DWORD threadID;
HANDLE thread = CreateThread(NULL, 0, ExecThread, (void*)func, CREATE_SUSPENDED, &threadID);
if (!thread) Process_Abort2(GetLastError(), "Creating thread");
*handle = thread;
ResumeThread(thread);
}
void Thread_Detach(void* handle) {
if (!CloseHandle((HANDLE)handle)) {
Process_Abort2(GetLastError(), "Freeing thread handle");
}
}
void Thread_Join(void* handle) {
WaitForSingleObject((HANDLE)handle, INFINITE);
Thread_Detach(handle);
}
void* Mutex_Create(const char* name) {
CRITICAL_SECTION* ptr = (CRITICAL_SECTION*)Mem_Alloc(1, sizeof(CRITICAL_SECTION), "mutex");
InitializeCriticalSection(ptr);
return ptr;
}
void Mutex_Free(void* handle) {
DeleteCriticalSection((CRITICAL_SECTION*)handle);
Mem_Free(handle);
}
void Mutex_Lock(void* handle) { EnterCriticalSection((CRITICAL_SECTION*)handle); }
void Mutex_Unlock(void* handle) { LeaveCriticalSection((CRITICAL_SECTION*)handle); }
void* Waitable_Create(const char* name) {
void* handle = CreateEventA(NULL, false, false, NULL);
if (!handle) {
Process_Abort2(GetLastError(), "Creating waitable");
}
return handle;
}
void Waitable_Free(void* handle) {
if (!CloseHandle((HANDLE)handle)) {
Process_Abort2(GetLastError(), "Freeing waitable");
}
}
void Waitable_Signal(void* handle) { SetEvent((HANDLE)handle); }
void Waitable_Wait(void* handle) {
WaitForSingleObject((HANDLE)handle, INFINITE);
}
void Waitable_WaitFor(void* handle, cc_uint32 milliseconds) {
WaitForSingleObject((HANDLE)handle, milliseconds);
}
/*########################################################################################################################*
*---------------------------------------------------------Socket----------------------------------------------------------*
*#########################################################################################################################*/
/* Sanity check to ensure cc_sockaddr struct is large enough to contain all socket addresses supported by this platform */
static char sockaddr_size_check[sizeof(SOCKADDR_STORAGE) < CC_SOCKETADDR_MAXSIZE ? 1 : -1];
static cc_result ParseHostNew(char* host, int port, cc_sockaddr* addrs, int* numValidAddrs) {
char portRaw[32]; cc_string portStr;
struct addrinfo hints = { 0 };
struct addrinfo* result;
struct addrinfo* cur;
int i = 0;
hints.ai_socktype = SOCK_STREAM;
hints.ai_protocol = IPPROTO_TCP;
String_InitArray(portStr, portRaw);
String_AppendInt(&portStr, port);
portRaw[portStr.length] = '\0';
int res = getaddrinfo(host, portRaw, &hints, &result);
if (res == WSAHOST_NOT_FOUND) return SOCK_ERR_UNKNOWN_HOST;
if (res) return res;
/* Prefer IPv4 addresses first */
for (cur = result; cur && i < SOCKET_MAX_ADDRS; cur = cur->ai_next)
{
if (cur->ai_family != AF_INET) continue;
SocketAddr_Set(&addrs[i], cur->ai_addr, cur->ai_addrlen); i++;
}
for (cur = result; cur && i < SOCKET_MAX_ADDRS; cur = cur->ai_next)
{
if (cur->ai_family == AF_INET) continue;
SocketAddr_Set(&addrs[i], cur->ai_addr, cur->ai_addrlen); i++;
}
freeaddrinfo(result);
*numValidAddrs = i;
return i == 0 ? ERR_INVALID_ARGUMENT : 0;
}
cc_result Socket_ParseAddress(const cc_string* address, int port, cc_sockaddr* addrs, int* numValidAddrs) {
SOCKADDR_IN* addr4 = (SOCKADDR_IN* )addrs[0].data;
SOCKADDR_IN6* addr6 = (SOCKADDR_IN6*)addrs[0].data;
cc_winstring str;
INT size;
*numValidAddrs = 0;
Platform_EncodeString(&str, address);
size = sizeof(*addr4);
if (!WSAStringToAddressW(UWP_STRING(&str), AF_INET, NULL, (SOCKADDR*)addr4, &size)) {
addr4->sin_port = htons(port);
addrs[0].size = size;
*numValidAddrs = 1;
return 0;
}
size = sizeof(*addr6);
if (!WSAStringToAddressW(UWP_STRING(&str), AF_INET6, NULL, (SOCKADDR*)addr6, &size)) {
addr6->sin6_port = htons(port);
addrs[0].size = size;
*numValidAddrs = 1;
return 0;
}
return ParseHostNew(str.ansi, port, addrs, numValidAddrs);
}
cc_result Socket_Create(cc_socket* s, cc_sockaddr* addr, cc_bool nonblocking) {
SOCKADDR* raw_addr = (SOCKADDR*)addr->data;
*s = socket(raw_addr->sa_family, SOCK_STREAM, IPPROTO_TCP);
if (*s == -1) return WSAGetLastError();
if (nonblocking) {
u_long blockingMode = -1; /* non-blocking mode */
ioctlsocket(*s, FIONBIO, &blockingMode);
}
return 0;
}
cc_result Socket_Connect(cc_socket s, cc_sockaddr* addr) {
SOCKADDR* raw_addr = (SOCKADDR*)addr->data;
int res = connect(s, raw_addr, addr->size);
return res == -1 ? WSAGetLastError() : 0;
}
cc_result Socket_Read(cc_socket s, cc_uint8* data, cc_uint32 count, cc_uint32* modified) {
int recvCount = recv(s, (char*)data, count, 0);
if (recvCount != -1) { *modified = recvCount; return 0; }
*modified = 0; return WSAGetLastError();
}
cc_result Socket_Write(cc_socket s, const cc_uint8* data, cc_uint32 count, cc_uint32* modified) {
int sentCount = send(s, (const char*)data, count, 0);
if (sentCount != -1) { *modified = sentCount; return 0; }
*modified = 0; return WSAGetLastError();
}
void Socket_Close(cc_socket s) {
shutdown(s, SD_BOTH);
closesocket(s);
}
static cc_result Socket_Poll(cc_socket s, int mode, cc_bool* success) {
fd_set set;
struct timeval time = { 0 };
int selectCount;
set.fd_count = 1;
set.fd_array[0] = s;
if (mode == SOCKET_POLL_READ) {
selectCount = select(1, &set, NULL, NULL, &time);
} else {
selectCount = select(1, NULL, &set, NULL, &time);
}
if (selectCount == -1) { *success = false; return WSAGetLastError(); }
*success = set.fd_count != 0; return 0;
}
cc_result Socket_CheckReadable(cc_socket s, cc_bool* readable) {
return Socket_Poll(s, SOCKET_POLL_READ, readable);
}
cc_result Socket_CheckWritable(cc_socket s, cc_bool* writable) {
int resultSize = sizeof(cc_result);
cc_result res = Socket_Poll(s, SOCKET_POLL_WRITE, writable);
if (res || *writable) return res;
/* https://stackoverflow.com/questions/29479953/so-error-value-after-successful-socket-operation */
getsockopt(s, SOL_SOCKET, SO_ERROR, (char*)&res, &resultSize);
return res;
}
/*########################################################################################################################*
*-----------------------------------------------------Process/Module------------------------------------------------------*
*#########################################################################################################################*/
cc_bool Process_OpenSupported = true;
static cc_result Process_RawGetExePath(cc_winstring* path, int* len) {
*len = GetModuleFileNameW(NULL, UWP_STRING(path), NATIVE_STR_LEN);
path->uni[*len] = '\0';
if (*len) return 0;
return GetLastError();
}
cc_result Process_StartGame2(const cc_string* args, int numArgs) {
union STARTUPINFO_union {
STARTUPINFOW wide;
STARTUPINFOA ansi;
} si = { 0 }; // less compiler warnings this way
cc_winstring path;
cc_string argv; char argvBuffer[NATIVE_STR_LEN];
PROCESS_INFORMATION pi = { 0 };
cc_winstring raw;
cc_result res;
int len, i;
if (Platform_IsSingleProcess()) return SetGameArgs(args, numArgs);
if ((res = Process_RawGetExePath(&path, &len))) return res;
si.wide.cb = sizeof(STARTUPINFOW);
String_InitArray(argv, argvBuffer);
/* Game doesn't actually care about argv[0] */
String_AppendConst(&argv, "cc");
for (i = 0; i < numArgs; i++)
{
if (String_IndexOf(&args[i], ' ') >= 0) {
String_Format1(&argv, " \"%s\"", &args[i]);
} else {
String_Format1(&argv, " %s", &args[i]);
}
}
Platform_EncodeString(&raw, &argv);
if (!CreateProcessW(UWP_STRING(&path), UWP_STRING(&raw), NULL, NULL,
false, 0, NULL, NULL, &si.wide, &pi)) return GetLastError();
/* Don't leak memory for process return code */
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
return 0;
}
void Process_Exit(cc_result code) { ExitProcess(code); }
cc_result Process_StartOpen(const cc_string* args) {
cc_winstring raw;
Platform_EncodeString(&raw, args);
auto str = hstring(UWP_STRING(&raw));
auto uri = Uri(str);
auto options = Windows::System::LauncherOptions();
options.TreatAsUntrusted(true);
Windows::System::Launcher::LaunchUriAsync(uri, options);
return 0;
}
/*########################################################################################################################*
*--------------------------------------------------------Updater----------------------------------------------------------*
*#########################################################################################################################*/
#define UPDATE_TMP TEXT("CC_prev.exe")
#define UPDATE_SRC TEXT(UPDATE_FILE)
cc_bool Updater_Supported = true;
#if defined _M_IX86
const struct UpdaterInfo Updater_Info = {
"&eDirect3D 9 is recommended", 2,
{
{ "Direct3D9", "ClassiCube.exe" },
{ "OpenGL", "ClassiCube.opengl.exe" }
}
};
#elif defined _M_X64
const struct UpdaterInfo Updater_Info = {
"&eDirect3D 9 is recommended", 2,
{
{ "Direct3D9", "ClassiCube.64.exe" },
{ "OpenGL", "ClassiCube.64-opengl.exe" }
}
};
#elif defined _M_ARM64
const struct UpdaterInfo Updater_Info = { "", 1, { { "Direct3D11", "cc-arm64-d3d11.exe" } } };
#elif defined _M_ARM
const struct UpdaterInfo Updater_Info = { "", 1, { { "Direct3D11", "cc-arm32-d3d11.exe" } } };
#else
const struct UpdaterInfo Updater_Info = { "&eCompile latest source code to update", 0 };
#endif
cc_bool Updater_Clean(void) {
return DeleteFile(UPDATE_TMP) || GetLastError() == ERROR_FILE_NOT_FOUND;
}
cc_result Updater_Start(const char** action) {
cc_winstring path;
cc_result res;
int len;
*action = "Getting executable path";
if ((res = Process_RawGetExePath(&path, &len))) return res;
*action = "Moving executable to CC_prev.exe";
if (!path.uni[0]) return ERR_NOT_SUPPORTED; /* MoveFileA returns ERROR_ACCESS_DENIED on Win 9x anyways */
if (!MoveFileExW(UWP_STRING(&path), UPDATE_TMP, MOVEFILE_REPLACE_EXISTING)) return GetLastError();
*action = "Replacing executable";
if (!MoveFileExW(UPDATE_SRC, UWP_STRING(&path), MOVEFILE_REPLACE_EXISTING)) return GetLastError();
*action = "Restarting game";
return Process_StartGame2(NULL, 0);
}
cc_result Updater_GetBuildTime(cc_uint64* timestamp) {
cc_winstring path;
cc_file file;
FILETIME ft;
cc_uint64 raw;
cc_result res;
int len;
if ((res = Process_RawGetExePath(&path, &len))) return res;
if ((res = File_Open(&file, &path))) return res;
if (GetFileTime(file, NULL, NULL, &ft)) {
raw = ft.dwLowDateTime | ((cc_uint64)ft.dwHighDateTime << 32);
*timestamp = FileTime_UnixTime(raw);
} else {
res = GetLastError();
}
File_Close(file);
return res;
}
/* Don't need special execute permission on windows */
cc_result Updater_MarkExecutable(void) { return 0; }
cc_result Updater_SetNewBuildTime(cc_uint64 timestamp) {
static const cc_string path = String_FromConst(UPDATE_FILE);
cc_filepath str;
cc_file file;
FILETIME ft;
cc_uint64 raw;
cc_result res;
Platform_EncodePath(&str, &path);
res = File_OpenOrCreate(&file, &str);
if (res) return res;
raw = 10000000 * (timestamp + FILETIME_UNIX_EPOCH);
ft.dwLowDateTime = (cc_uint32)raw;
ft.dwHighDateTime = (cc_uint32)(raw >> 32);
if (!SetFileTime(file, NULL, NULL, &ft)) res = GetLastError();
File_Close(file);
return res;
}
/*########################################################################################################################*
*-------------------------------------------------------Dynamic lib-------------------------------------------------------*
*#########################################################################################################################*/
const cc_string DynamicLib_Ext = String_FromConst(".dll");
static cc_result dynamicErr;
static cc_bool loadingPlugin;
void* DynamicLib_Load2(const cc_string* path) {
return NULL;
}
void* DynamicLib_Get2(void* lib, const char* name) {
return NULL;
}
cc_bool DynamicLib_DescribeError(cc_string* dst) {
return false;
}
/*########################################################################################################################*
*--------------------------------------------------------Platform---------------------------------------------------------*
*#########################################################################################################################*/
void Platform_EncodeString(cc_winstring* dst, const cc_string* src) {
cc_unichar* uni;
char* ansi;
int i;
if (src->length > FILENAME_SIZE) Process_Abort("String too long to expand");
uni = dst->uni;
for (i = 0; i < src->length; i++)
{
*uni++ = Convert_CP437ToUnicode(src->buffer[i]);
}
*uni = '\0';
ansi = dst->ansi;
for (i = 0; i < src->length; i++)
{
*ansi++ = (char)dst->uni[i];
}
*ansi = '\0';
}
static void Platform_InitStopwatch(void) {
LARGE_INTEGER freq;
sw_highRes = QueryPerformanceFrequency(&freq);
if (sw_highRes) {
sw_freqMul = 1000 * 1000;
sw_freqDiv = freq.QuadPart;
} else { sw_freqDiv = 10; }
}
void Platform_Init(void) {
WSADATA wsaData;
cc_result res;
Platform_InitStopwatch();
heap = GetProcessHeap();
hasDebugger = IsDebuggerPresent();
AttachConsole(-1); /* ATTACH_PARENT_PROCESS */
conHandle = GetStdHandle(STD_OUTPUT_HANDLE);
if (conHandle == INVALID_HANDLE_VALUE) conHandle = NULL;
res = WSAStartup(MAKEWORD(2, 2), &wsaData);
if (res) Logger_SysWarn(res, "starting WSA");
}
void Platform_Free(void) {
WSACleanup();
HeapDestroy(heap);
}
cc_bool Platform_DescribeError(cc_result res, cc_string* dst) {
WCHAR chars[NATIVE_STR_LEN];
DWORD flags = FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS;
res = FormatMessageW(flags, NULL, res, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
chars, NATIVE_STR_LEN, NULL);
if (!res) return false;
String_AppendUtf16(dst, chars, res * 2);
return true;
}
/*########################################################################################################################*
*-------------------------------------------------------Encryption--------------------------------------------------------*
*#########################################################################################################################*/
cc_result Platform_Encrypt(const void* data, int len, cc_string* dst) {
return 200;
}
cc_result Platform_Decrypt(const void* data, int len, cc_string* dst) {
return 200;
}
cc_result Platform_GetEntropy(void* data, int len) {
return ERR_NOT_SUPPORTED;
}
/*########################################################################################################################*
*-----------------------------------------------------Configuration-------------------------------------------------------*
*#########################################################################################################################*/
int Platform_GetCommandLineArgs(int argc, STRING_REF char** argv, cc_string* args) {
return GetGameArgs(args);
}
cc_result Platform_SetDefaultCurrentDirectory(int argc, char** argv) {
return 0;
}

327
misc/UWP/Window_UWP.cpp Normal file
View File

@@ -0,0 +1,327 @@
#include "../../src/Core.h"
#include <winrt/Windows.ApplicationModel.DataTransfer.h>
#include <winrt/Windows.ApplicationModel.h>
#include <winrt/Windows.ApplicationModel.Core.h>
#include <winrt/Windows.ApplicationModel.Activation.h>
#include <winrt/Windows.Devices.Input.h>
#include <winrt/Windows.Foundation.h>
#include <winrt/Windows.Graphics.Display.h>
#include <winrt/Windows.Storage.Pickers.h>
#include <winrt/Windows.System.h>
#include <winrt/Windows.UI.Core.h>
using namespace winrt;
using namespace Windows::ApplicationModel;
using namespace Windows::ApplicationModel::Core;
using namespace Windows::ApplicationModel::DataTransfer;
using namespace Windows::ApplicationModel::Activation;
using namespace Windows::Devices::Input;
using namespace Windows::Graphics::Display;
using namespace Windows::Foundation;
using namespace Windows::System;
using namespace Windows::UI::Core;
using namespace Windows::UI::Input;
#include "../../src/_WindowBase.h"
#include "../../src/String.h"
#include "../../src/Funcs.h"
#include "../../src/Bitmap.h"
#include "../../src/Options.h"
#include "../../src/Errors.h"
#include "../../src/Graphics.h"
#include "../../src/Game.h"
#define UWP_STRING(str) ((wchar_t*)(str)->uni)
/*########################################################################################################################*
*--------------------------------------------------Public implementation--------------------------------------------------*
*#########################################################################################################################*/
void Window_PreInit(void) {
DisplayInfo.CursorVisible = true;
}
void Window_Init(void) {
CoreWindow& window = CoreWindow::GetForCurrentThread();
Input.Sources = INPUT_SOURCE_NORMAL;
DisplayInfo.Width = 640;
DisplayInfo.Height = 480;
DisplayInfo.Depth = 32;
DisplayInfo.ScaleX = 1.0f;
DisplayInfo.ScaleY = 1.0f;
Rect bounds = window.Bounds();
WindowInfo.UIScaleX = DEFAULT_UI_SCALE_X;
WindowInfo.UIScaleY = DEFAULT_UI_SCALE_Y;
WindowInfo.Width = bounds.Width;
WindowInfo.Height = bounds.Height;
WindowInfo.Exists = true;
}
void Window_Free(void) { }
void Window_Create2D(int width, int height) { }
void Window_Create3D(int width, int height) { }
void Window_Destroy(void) {
}
void Window_SetTitle(const cc_string* title) {
}
void Clipboard_GetText(cc_string* value) {
DataPackageView content = Clipboard::GetContent();
hstring str = content.GetTextAsync().get();
}
void Clipboard_SetText(const cc_string* value) {
cc_winstring raw;
Platform_EncodeString(&raw, value);
auto str = hstring(UWP_STRING(&raw));
DataPackage package = DataPackage();
package.SetText(str);
Clipboard::SetContent(package);
}
int Window_GetWindowState(void) {
return WINDOW_STATE_NORMAL;
}
cc_result Window_EnterFullscreen(void) {
return ERR_NOT_SUPPORTED;
}
cc_result Window_ExitFullscreen(void) {
return ERR_NOT_SUPPORTED;
}
int Window_IsObscured(void) { return 0; }
void Window_Show(void) {
}
void Window_SetSize(int width, int height) {
}
void Window_RequestClose(void) {
Event_RaiseVoid(&WindowEvents.Closing);
}
void Window_ProcessEvents(float delta) {
CoreWindow& window = CoreWindow::GetForCurrentThread();
CoreDispatcher& dispatcher = window.Dispatcher();
dispatcher.ProcessEvents(CoreProcessEventsOption::ProcessAllIfPresent);
}
void Gamepads_Init(void) {
}
void Gamepads_Process(float delta) { }
static void Cursor_GetRawPos(int* x, int* y) {
CoreWindow& window = CoreWindow::GetForCurrentThread();
Point point = window.PointerPosition();
*x = point.X;
*y = point.Y;
}
void Cursor_SetPosition(int x, int y) {
CoreWindow& window = CoreWindow::GetForCurrentThread();
Point point = Point(x, y);
window.PointerPosition(point);
}
static void Cursor_DoSetVisible(cc_bool visible) {
}
static void ShowDialogCore(const char* title, const char* msg) {
}
static cc_result OpenSaveFileDialog(const cc_string* filters, FileDialogCallback callback, cc_bool load,
const char* const* fileExts, const cc_string* defaultName) {
return ERR_NOT_SUPPORTED;
//auto picker = Windows::Storage::Pickers::FileOpenPicker();
//picker.FileTypeFilter().Append(hstring(L".jpg"));
//Windows::Storage::StorageFile file = picker->PickSingleFileAsync();
}
cc_result Window_OpenFileDialog(const struct OpenFileDialogArgs* args) {
const char* const* fileExts = args->filters;
cc_string filters; char buffer[NATIVE_STR_LEN];
int i;
/* Filter tokens are \0 separated - e.g. "Maps (*.cw;*.dat)\0*.cw;*.dat\0 */
String_InitArray(filters, buffer);
String_Format1(&filters, "%c (", args->description);
for (i = 0; fileExts[i]; i++)
{
if (i) String_Append(&filters, ';');
String_Format1(&filters, "*%c", fileExts[i]);
}
String_Append(&filters, ')');
String_Append(&filters, '\0');
for (i = 0; fileExts[i]; i++)
{
if (i) String_Append(&filters, ';');
String_Format1(&filters, "*%c", fileExts[i]);
}
String_Append(&filters, '\0');
return OpenSaveFileDialog(&filters, args->Callback, true, fileExts, &String_Empty);
}
cc_result Window_SaveFileDialog(const struct SaveFileDialogArgs* args) {
const char* const* titles = args->titles;
const char* const* fileExts = args->filters;
cc_string filters; char buffer[NATIVE_STR_LEN];
int i;
/* Filter tokens are \0 separated - e.g. "Map (*.cw)\0*.cw\0 */
String_InitArray(filters, buffer);
for (i = 0; fileExts[i]; i++)
{
String_Format2(&filters, "%c (*%c)", titles[i], fileExts[i]);
String_Append(&filters, '\0');
String_Format1(&filters, "*%c", fileExts[i]);
String_Append(&filters, '\0');
}
return OpenSaveFileDialog(&filters, args->Callback, false, fileExts, &args->defaultName);
}
static GfxResourceID fb_tex, fb_vb;
static void AllocateVB(void) {
struct VertexTextured* data = (struct VertexTextured*)Gfx_RecreateAndLockVb(&fb_vb,
VERTEX_FORMAT_TEXTURED, 4);
data[0].x = -1.0f; data[0].y = -1.0f; data[0].z = 0.0f; data[0].Col = PACKEDCOL_WHITE; data[0].U = 0.0f; data[0].V = 1.0f;
data[1].x = 1.0f; data[1].y = -1.0f; data[1].z = 0.0f; data[1].Col = PACKEDCOL_WHITE; data[1].U = 1.0f; data[1].V = 1.0f;
data[2].x = 1.0f; data[2].y = 1.0f; data[2].z = 0.0f; data[2].Col = PACKEDCOL_WHITE; data[2].U = 1.0f; data[2].V = 0.0f;
data[3].x = -1.0f; data[3].y = 1.0f; data[3].z = 0.0f; data[3].Col = PACKEDCOL_WHITE; data[3].U = 0.0f; data[2].V = 0.0f;
Gfx_UnlockVb(fb_vb);
}
void Window_AllocFramebuffer(struct Bitmap* bmp, int width, int height) {
bmp->scan0 = (BitmapCol*)Mem_Alloc(width * height, BITMAPCOLOR_SIZE, "bitmap");
bmp->width = width;
bmp->height = height;
if (!Gfx.Created) Gfx_Create();
fb_tex = Gfx_AllocTexture(bmp, bmp->width, TEXTURE_FLAG_NONPOW2, false);
AllocateVB();
Game.Width = Window_Main.Width;
Game.Height = Window_Main.Height;
Gfx_OnWindowResize();
}
void Window_DrawFramebuffer(Rect2D r, struct Bitmap* bmp) {
struct Bitmap part;
part.scan0 = Bitmap_GetRow(bmp, r.y) + r.x;
part.width = r.width;
part.height = r.height;
Gfx_BeginFrame();
Gfx_BindIb(Gfx.DefaultIb);
Gfx_UpdateTexture(fb_tex, r.x, r.y, &part, bmp->width, false);
Gfx_LoadMatrix(MATRIX_VIEW, &Matrix_Identity);
Gfx_LoadMatrix(MATRIX_PROJ, &Matrix_Identity);
Gfx_SetDepthTest(false);
Gfx_SetAlphaTest(false);
Gfx_SetAlphaBlending(false);
Gfx_SetVertexFormat(VERTEX_FORMAT_COLOURED);
Gfx_SetVertexFormat(VERTEX_FORMAT_TEXTURED);
Gfx_BindTexture(fb_tex);
Gfx_BindVb(fb_vb);
Gfx_DrawVb_IndexedTris(4);
Gfx_EndFrame();
}
void Window_FreeFramebuffer(struct Bitmap* bmp) {
Mem_Free(bmp->scan0);
Gfx_DeleteTexture(&fb_tex);
Gfx_DeleteVb(&fb_vb);
}
static cc_bool rawMouseInited, rawMouseSupported;
static void InitRawMouse(void) {
}
void OnscreenKeyboard_Open(struct OpenKeyboardArgs* args) { }
void OnscreenKeyboard_SetText(const cc_string* text) { }
void OnscreenKeyboard_Close(void) { }
void Window_EnableRawMouse(void) {
DefaultEnableRawMouse();
if (!rawMouseInited) InitRawMouse();
rawMouseInited = true;
}
void Window_UpdateRawMouse(void) {
if (rawMouseSupported) {
/* handled in WM_INPUT messages */
CentreMousePosition();
} else {
DefaultUpdateRawMouse();
}
}
void Window_DisableRawMouse(void) {
DefaultDisableRawMouse();
}
struct CCApp : implements<CCApp, IFrameworkViewSource, IFrameworkView>
{
// IFrameworkViewSource interface
IFrameworkView CreateView()
{
return *this;
}
// IFrameworkView interface
void Initialize(CoreApplicationView const& view)
{
}
void Load(hstring const& entryPoint)
{
}
void Uninitialize()
{
}
void Run()
{
CoreWindow& window = CoreWindow::GetForCurrentThread();
window.Activate();
Window_Main.Handle.ptr = get_abi(window);
extern int main(int argc, char** argv);
main(0, NULL);
}
void SetWindow(CoreWindow const& win)
{
}
};
int __stdcall wWinMain(void*, void*, wchar_t** argv, int argc)
{
auto app = make<CCApp>();
CoreApplication::Run(app);
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

44
misc/amiga/Makefile_68k Normal file
View File

@@ -0,0 +1,44 @@
AS=m68k-amigaos-as
CC=m68k-amigaos-gcc
CXX=m68k-amigaos-g++
CFLAGS :=-O1 -fno-math-errno -DPLAT_AMIGA -DCC_BUILD_NOFPU
TARGET := ClassiCube-68k
BUILD_DIR := build-amiga-68k
SOURCE_DIR := src
LDFLAGS :=
C_SOURCES := $(wildcard $(SOURCE_DIR)/*.c)
C_ASSEMS := $(patsubst $(SOURCE_DIR)/%.c, $(BUILD_DIR)/%.S, $(C_SOURCES))
C_OBJECTS := $(patsubst $(SOURCE_DIR)/%.c, $(BUILD_DIR)/%.o, $(C_SOURCES))
# Dependency tracking
DEPFLAGS = -MT $@ -MMD -MP -MF $(BUILD_DIR)/$*.d
DEPFILES := $(C_OBJECTS:%.o=%.d)
#---------------------------------------------------------------------------------
# main targets
#---------------------------------------------------------------------------------
default: $(BUILD_DIR) $(TARGET).exe
$(BUILD_DIR):
mkdir -p $(BUILD_DIR)
$(TARGET).exe: $(C_OBJECTS)
$(CC) $(LDFLAGS) -o $(TARGET).exe $(C_OBJECTS)
#---------------------------------------------------------------------------------
# object generation
#---------------------------------------------------------------------------------
$(C_OBJECTS): $(BUILD_DIR)/%.o : $(BUILD_DIR)/%.S
$(AS) $< -o $@
$(C_ASSEMS): $(BUILD_DIR)/%.S : $(SOURCE_DIR)/%.c
$(CC) $(CFLAGS) $(DEPFLAGS) -S -c $< -o $@
# Dependency tracking
$(DEPFILES):
include $(wildcard $(DEPFILES))

41
misc/bitmap_font_gen.cs Normal file
View File

@@ -0,0 +1,41 @@
void Main()
{
Console.WriteLine("static cc_uint8 font_bitmap[][8] = {");
using (Bitmap bmp = new Bitmap(@"C:\classicube-dev\default.png"))
{
for (int CY = 0; CY < 16; CY++)
for (int CX = 0; CX < 16; CX++)
DecodeTile(bmp, CX, CY);
}
Console.WriteLine("}");
}
static void DecodeTile(Bitmap bmp, int cx, int cy) {
int c = (cy << 4) | cx;
if (c <= 32 || c >= 127) return;
int X = cx * 8, Y = cy * 8;
Console.Write("\t{ ");
for (int y = Y; y < Y + 8; y++) {
uint mask = 0;
int shift = 0;
for (int x = X; x < X + 8; x++, shift++) {
Color P = bmp.GetPixel(x, y);
if (P.A == 0) {
mask |= 0u << shift;
} else if (P.R == 255 && P.G == 255 && P.B == 255 && P.A == 255) {
mask |= 1u << shift;
} else {
throw new InvalidOperationException("unsupported colour" + P);
}
}
string suffix = y == Y + 7 ? " " : ",";
Console.Write("0x" + mask.ToString("X2") + suffix);
}
Console.WriteLine("}, /* " + (char)c + " */");
}

View File

@@ -0,0 +1,65 @@
#!/bin/bash
# This is similar to buildbot.sh but builds plugins for the game instead
# Some variables must be set before invoking this script. See buildtestplugin.sh
cd $ROOT
echo $(pwd)
FILES=$(find . -type f -name "*.c" | tr '\n' ' ')
FLAGS="-shared -fPIC -O1 -s -std=c99"
echo $FILES
# ----------------------------- compile linux
NIX32_CC="gcc -m32"
NIX64_CC="gcc -m64"
NIX_FLAGS="-nostartfiles -Wl,--entry=0"
echo "Compiling linux32.."
$NIX32_CC $FILES -I ~/client/src/ -I ./src/ -o ${PLUGIN}_nix32.so $FLAGS $NIX_FLAGS
echo "Compiling linux64.."
$NIX64_CC $FILES -I ~/client/src/ -I ./src/ -o ${PLUGIN}_nix64.so $FLAGS $NIX_FLAGS
# ----------------------------- compile macOS
MAC32_CC=~/osx/target/bin/o32-clang
MAC64_CC=~/osx/target/bin/o64-clang
MAC_FLAGS="-undefined dynamic_lookup"
echo "Compiling mac32.."
$MAC32_CC $FILES -I ~/client/src/ -I ./src/ -o ${PLUGIN}_mac32.dylib $FLAGS $MAC_FLAGS
echo "Compiling mac64.."
$MAC64_CC $FILES -I ~/client/src/ -I ./src/ -o ${PLUGIN}_mac64.dylib $FLAGS $MAC_FLAGS
# ----------------------------- compile Windows
WIN32_CC=i686-w64-mingw32-gcc
WIN64_CC=x86_64-w64-mingw32-gcc
# TODO: Figure out why we sometimes need this with mingw
# If we don't include nostart files for some plugins, get a
# ertr000001.o:(.rdata+0x0): undefined reference to `_pei386_runtime_relocator'
# Seems to happen if you use exported variables from the game
if [ -z "$LITE_MODE" ]; then
WIN_FLAGS=""
else
WIN_FLAGS="-nostartfiles -Wl,--entry=0"
fi
# NOTE: You also need to install 'mingw-w64-tools' package for gendef
echo "Compiling win32"
rm ClassiCube.exe ClassiCube.def
cp ~/client/src/cc-w32-d3d.exe ClassiCube.exe
gendef ClassiCube.exe
i686-w64-mingw32-dlltool -d ClassiCube.def -l libClassiCube.a -D ClassiCube.exe
$WIN32_CC $FILES -I ~/client/src/ -I ./src/ -o ${PLUGIN}_win32.dll $FLAGS $WIN_FLAGS -L . -lClassiCube
echo "Compiling win64"
rm ClassiCube.exe ClassiCube.def
cp ~/client/src/cc-w64-d3d.exe ClassiCube.exe
gendef ClassiCube.exe
x86_64-w64-mingw32-dlltool -d ClassiCube.def -l libClassiCube.a -D ClassiCube.exe
$WIN64_CC $FILES -I ~/client/src/ -I ./src/ -o ${PLUGIN}_win64.dll $FLAGS $WIN_FLAGS -L . -lClassiCube
# ----------------------------- compile raspberry pi
RPI_CC=~/rpi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin/arm-linux-gnueabihf-gcc-4.8.3
RPI_FLAGS="-nostartfiles -Wl,--entry=0"
echo "Compiling rpi"
$RPI_CC $FILES -I ~/client/src/ -I ./src/ -o ${PLUGIN}_rpi.so $FLAGS $RPI_FLAGS

View File

@@ -0,0 +1,4 @@
#!/bin/bash
ROOT=~/plugins/test/
PLUGIN=test
source ./buildbot_plugin.sh

View File

@@ -0,0 +1,6 @@
This folder contains build scripts for automatically compiling ClassiCube
|File|Description|
|--------|-------|
|buildbot_plugin.sh | Compiles specified plugin for various platforms |
|buildtestplugin.sh | Example script for how to use buildbot_plugin.sh |

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,34 @@
-----BEGIN CERTIFICATE-----
MIIF3jCCA8agAwIBAgIQAf1tMPyjylGoG7xkDjUDLTANBgkqhkiG9w0BAQwFADCB
iDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0pl
cnNleSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNV
BAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAw
MjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMCVVMxEzARBgNV
BAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU
aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBSU0EgQ2Vy
dGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK
AoICAQCAEmUXNg7D2wiz0KxXDXbtzSfTTK1Qg2HiqiBNCS1kCdzOiZ/MPans9s/B
3PHTsdZ7NygRK0faOca8Ohm0X6a9fZ2jY0K2dvKpOyuR+OJv0OwWIJAJPuLodMkY
tJHUYmTbf6MG8YgYapAiPLz+E/CHFHv25B+O1ORRxhFnRghRy4YUVD+8M/5+bJz/
Fp0YvVGONaanZshyZ9shZrHUm3gDwFA66Mzw3LyeTP6vBZY1H1dat//O+T23LLb2
VN3I5xI6Ta5MirdcmrS3ID3KfyI0rn47aGYBROcBTkZTmzNg95S+UzeQc0PzMsNT
79uq/nROacdrjGCT3sTHDN/hMq7MkztReJVni+49Vv4M0GkPGw/zJSZrM233bkf6
c0Plfg6lZrEpfDKEY1WJxA3Bk1QwGROs0303p+tdOmw1XNtB1xLaqUkL39iAigmT
Yo61Zs8liM2EuLE/pDkP2QKe6xJMlXzzawWpXhaDzLhn4ugTncxbgtNMs+1b/97l
c6wjOy0AvzVVdAlJ2ElYGn+SNuZRkg7zJn0cTRe8yexDJtC/QV9AqURE9JnnV4ee
UB9XVKg+/XRjL7FQZQnmWEIuQxpMtPAlR1n6BB6T1CZGSlCBst6+eLf8ZxXhyVeE
Hg9j1uliutZfVS7qXMYoCAQlObgOK6nyTJccBz8NUvXt7y+CDwIDAQABo0IwQDAd
BgNVHQ4EFgQUU3m/WqorSs9UgOHYm8Cd8rIDZsswDgYDVR0PAQH/BAQDAgEGMA8G
A1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAFzUfA3P9wF9QZllDHPF
Up/L+M+ZBn8b2kMVn54CVVeWFPFSPCeHlCjtHzoBN6J2/FNQwISbxmtOuowhT6KO
VWKR82kV2LyI48SqC/3vqOlLVSoGIG1VeCkZ7l8wXEskEVX/JJpuXior7gtNn3/3
ATiUFJVDBwn7YKnuHKsSjKCaXqeYalltiz8I+8jRRa8YFWSQEg9zKC7F4iRO/Fjs
8PRF/iKz6y+O0tlFYQXBl2+odnKPi4w2r78NBc5xjeambx9spnFixdjQg3IM8WcR
iQycE0xyNN+81XHfqnHd4blsjDwSXWXavVcStkNr/+XeTWYRUc+ZruwXtuhxkYze
Sf7dNXGiFSeUHM9h4ya7b6NnJSFd5t0dCy5oGzuCr+yDZ4XUmFF0sbmZgIn/f3gZ
XHlKYC6SQK5MNyosycdiyA5d9zZbyuAlJQG03RoHnHcAP9Dc1ew91Pq7P8yF1m9/
qS3fuQL39ZeatTXaw2ewh0qpKJ4jjv9cJ2vhsE/zB+4ALtRZh8tSQZXq9EfX7mRB
VXyNWQKV3WKdwrnuWih0hKWbt5DHDAff9Yk2dDLWKMGwsAvgnEzDHNb842m1R0aB
L6KCq9NjRHDEjf8tM7qtj3u1cIiuPhnPQCjY/MiQu12ZIvVS5ljFH4gxQ+6IHdfG
jjxDah2nGN59PRbxYvnKkKj9
-----END CERTIFICATE-----

397
misc/certs/certs.h Normal file
View File

@@ -0,0 +1,397 @@
// This file includes the following root certificates:
// - DigiCert Global Root (dropbox.com)
// - DigiCert Global Root G2 (resources.download.minecraft.net)
// - ISRG Root X1 (catbox.moe)
// - ISRG Root X2 (123dmwm.com, garbage.loan)
// - Baltimore CyberTrust Root (old classicube.net)
// - USERTrust RSA (imgur.com)
// - Google Trust Services Root R4 (classicube.net)
// Generated using "brssl -ta [cert 1] [cert 2].." from BearSSL
static const unsigned char TA0_DN[] = {
0x30, 0x61, 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13,
0x02, 0x55, 0x53, 0x31, 0x15, 0x30, 0x13, 0x06, 0x03, 0x55, 0x04, 0x0A,
0x13, 0x0C, 0x44, 0x69, 0x67, 0x69, 0x43, 0x65, 0x72, 0x74, 0x20, 0x49,
0x6E, 0x63, 0x31, 0x19, 0x30, 0x17, 0x06, 0x03, 0x55, 0x04, 0x0B, 0x13,
0x10, 0x77, 0x77, 0x77, 0x2E, 0x64, 0x69, 0x67, 0x69, 0x63, 0x65, 0x72,
0x74, 0x2E, 0x63, 0x6F, 0x6D, 0x31, 0x20, 0x30, 0x1E, 0x06, 0x03, 0x55,
0x04, 0x03, 0x13, 0x17, 0x44, 0x69, 0x67, 0x69, 0x43, 0x65, 0x72, 0x74,
0x20, 0x47, 0x6C, 0x6F, 0x62, 0x61, 0x6C, 0x20, 0x52, 0x6F, 0x6F, 0x74,
0x20, 0x43, 0x41
};
static const unsigned char TA0_RSA_N[] = {
0xE2, 0x3B, 0xE1, 0x11, 0x72, 0xDE, 0xA8, 0xA4, 0xD3, 0xA3, 0x57, 0xAA,
0x50, 0xA2, 0x8F, 0x0B, 0x77, 0x90, 0xC9, 0xA2, 0xA5, 0xEE, 0x12, 0xCE,
0x96, 0x5B, 0x01, 0x09, 0x20, 0xCC, 0x01, 0x93, 0xA7, 0x4E, 0x30, 0xB7,
0x53, 0xF7, 0x43, 0xC4, 0x69, 0x00, 0x57, 0x9D, 0xE2, 0x8D, 0x22, 0xDD,
0x87, 0x06, 0x40, 0x00, 0x81, 0x09, 0xCE, 0xCE, 0x1B, 0x83, 0xBF, 0xDF,
0xCD, 0x3B, 0x71, 0x46, 0xE2, 0xD6, 0x66, 0xC7, 0x05, 0xB3, 0x76, 0x27,
0x16, 0x8F, 0x7B, 0x9E, 0x1E, 0x95, 0x7D, 0xEE, 0xB7, 0x48, 0xA3, 0x08,
0xDA, 0xD6, 0xAF, 0x7A, 0x0C, 0x39, 0x06, 0x65, 0x7F, 0x4A, 0x5D, 0x1F,
0xBC, 0x17, 0xF8, 0xAB, 0xBE, 0xEE, 0x28, 0xD7, 0x74, 0x7F, 0x7A, 0x78,
0x99, 0x59, 0x85, 0x68, 0x6E, 0x5C, 0x23, 0x32, 0x4B, 0xBF, 0x4E, 0xC0,
0xE8, 0x5A, 0x6D, 0xE3, 0x70, 0xBF, 0x77, 0x10, 0xBF, 0xFC, 0x01, 0xF6,
0x85, 0xD9, 0xA8, 0x44, 0x10, 0x58, 0x32, 0xA9, 0x75, 0x18, 0xD5, 0xD1,
0xA2, 0xBE, 0x47, 0xE2, 0x27, 0x6A, 0xF4, 0x9A, 0x33, 0xF8, 0x49, 0x08,
0x60, 0x8B, 0xD4, 0x5F, 0xB4, 0x3A, 0x84, 0xBF, 0xA1, 0xAA, 0x4A, 0x4C,
0x7D, 0x3E, 0xCF, 0x4F, 0x5F, 0x6C, 0x76, 0x5E, 0xA0, 0x4B, 0x37, 0x91,
0x9E, 0xDC, 0x22, 0xE6, 0x6D, 0xCE, 0x14, 0x1A, 0x8E, 0x6A, 0xCB, 0xFE,
0xCD, 0xB3, 0x14, 0x64, 0x17, 0xC7, 0x5B, 0x29, 0x9E, 0x32, 0xBF, 0xF2,
0xEE, 0xFA, 0xD3, 0x0B, 0x42, 0xD4, 0xAB, 0xB7, 0x41, 0x32, 0xDA, 0x0C,
0xD4, 0xEF, 0xF8, 0x81, 0xD5, 0xBB, 0x8D, 0x58, 0x3F, 0xB5, 0x1B, 0xE8,
0x49, 0x28, 0xA2, 0x70, 0xDA, 0x31, 0x04, 0xDD, 0xF7, 0xB2, 0x16, 0xF2,
0x4C, 0x0A, 0x4E, 0x07, 0xA8, 0xED, 0x4A, 0x3D, 0x5E, 0xB5, 0x7F, 0xA3,
0x90, 0xC3, 0xAF, 0x27
};
static const unsigned char TA0_RSA_E[] = {
0x01, 0x00, 0x01
};
static const unsigned char TA1_DN[] = {
0x30, 0x61, 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13,
0x02, 0x55, 0x53, 0x31, 0x15, 0x30, 0x13, 0x06, 0x03, 0x55, 0x04, 0x0A,
0x13, 0x0C, 0x44, 0x69, 0x67, 0x69, 0x43, 0x65, 0x72, 0x74, 0x20, 0x49,
0x6E, 0x63, 0x31, 0x19, 0x30, 0x17, 0x06, 0x03, 0x55, 0x04, 0x0B, 0x13,
0x10, 0x77, 0x77, 0x77, 0x2E, 0x64, 0x69, 0x67, 0x69, 0x63, 0x65, 0x72,
0x74, 0x2E, 0x63, 0x6F, 0x6D, 0x31, 0x20, 0x30, 0x1E, 0x06, 0x03, 0x55,
0x04, 0x03, 0x13, 0x17, 0x44, 0x69, 0x67, 0x69, 0x43, 0x65, 0x72, 0x74,
0x20, 0x47, 0x6C, 0x6F, 0x62, 0x61, 0x6C, 0x20, 0x52, 0x6F, 0x6F, 0x74,
0x20, 0x47, 0x32
};
static const unsigned char TA1_RSA_N[] = {
0xBB, 0x37, 0xCD, 0x34, 0xDC, 0x7B, 0x6B, 0xC9, 0xB2, 0x68, 0x90, 0xAD,
0x4A, 0x75, 0xFF, 0x46, 0xBA, 0x21, 0x0A, 0x08, 0x8D, 0xF5, 0x19, 0x54,
0xC9, 0xFB, 0x88, 0xDB, 0xF3, 0xAE, 0xF2, 0x3A, 0x89, 0x91, 0x3C, 0x7A,
0xE6, 0xAB, 0x06, 0x1A, 0x6B, 0xCF, 0xAC, 0x2D, 0xE8, 0x5E, 0x09, 0x24,
0x44, 0xBA, 0x62, 0x9A, 0x7E, 0xD6, 0xA3, 0xA8, 0x7E, 0xE0, 0x54, 0x75,
0x20, 0x05, 0xAC, 0x50, 0xB7, 0x9C, 0x63, 0x1A, 0x6C, 0x30, 0xDC, 0xDA,
0x1F, 0x19, 0xB1, 0xD7, 0x1E, 0xDE, 0xFD, 0xD7, 0xE0, 0xCB, 0x94, 0x83,
0x37, 0xAE, 0xEC, 0x1F, 0x43, 0x4E, 0xDD, 0x7B, 0x2C, 0xD2, 0xBD, 0x2E,
0xA5, 0x2F, 0xE4, 0xA9, 0xB8, 0xAD, 0x3A, 0xD4, 0x99, 0xA4, 0xB6, 0x25,
0xE9, 0x9B, 0x6B, 0x00, 0x60, 0x92, 0x60, 0xFF, 0x4F, 0x21, 0x49, 0x18,
0xF7, 0x67, 0x90, 0xAB, 0x61, 0x06, 0x9C, 0x8F, 0xF2, 0xBA, 0xE9, 0xB4,
0xE9, 0x92, 0x32, 0x6B, 0xB5, 0xF3, 0x57, 0xE8, 0x5D, 0x1B, 0xCD, 0x8C,
0x1D, 0xAB, 0x95, 0x04, 0x95, 0x49, 0xF3, 0x35, 0x2D, 0x96, 0xE3, 0x49,
0x6D, 0xDD, 0x77, 0xE3, 0xFB, 0x49, 0x4B, 0xB4, 0xAC, 0x55, 0x07, 0xA9,
0x8F, 0x95, 0xB3, 0xB4, 0x23, 0xBB, 0x4C, 0x6D, 0x45, 0xF0, 0xF6, 0xA9,
0xB2, 0x95, 0x30, 0xB4, 0xFD, 0x4C, 0x55, 0x8C, 0x27, 0x4A, 0x57, 0x14,
0x7C, 0x82, 0x9D, 0xCD, 0x73, 0x92, 0xD3, 0x16, 0x4A, 0x06, 0x0C, 0x8C,
0x50, 0xD1, 0x8F, 0x1E, 0x09, 0xBE, 0x17, 0xA1, 0xE6, 0x21, 0xCA, 0xFD,
0x83, 0xE5, 0x10, 0xBC, 0x83, 0xA5, 0x0A, 0xC4, 0x67, 0x28, 0xF6, 0x73,
0x14, 0x14, 0x3D, 0x46, 0x76, 0xC3, 0x87, 0x14, 0x89, 0x21, 0x34, 0x4D,
0xAF, 0x0F, 0x45, 0x0C, 0xA6, 0x49, 0xA1, 0xBA, 0xBB, 0x9C, 0xC5, 0xB1,
0x33, 0x83, 0x29, 0x85
};
static const unsigned char TA1_RSA_E[] = {
0x01, 0x00, 0x01
};
static const unsigned char TA2_DN[] = {
0x30, 0x4F, 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13,
0x02, 0x55, 0x53, 0x31, 0x29, 0x30, 0x27, 0x06, 0x03, 0x55, 0x04, 0x0A,
0x13, 0x20, 0x49, 0x6E, 0x74, 0x65, 0x72, 0x6E, 0x65, 0x74, 0x20, 0x53,
0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x20, 0x52, 0x65, 0x73, 0x65,
0x61, 0x72, 0x63, 0x68, 0x20, 0x47, 0x72, 0x6F, 0x75, 0x70, 0x31, 0x15,
0x30, 0x13, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x0C, 0x49, 0x53, 0x52,
0x47, 0x20, 0x52, 0x6F, 0x6F, 0x74, 0x20, 0x58, 0x31
};
static const unsigned char TA2_RSA_N[] = {
0xAD, 0xE8, 0x24, 0x73, 0xF4, 0x14, 0x37, 0xF3, 0x9B, 0x9E, 0x2B, 0x57,
0x28, 0x1C, 0x87, 0xBE, 0xDC, 0xB7, 0xDF, 0x38, 0x90, 0x8C, 0x6E, 0x3C,
0xE6, 0x57, 0xA0, 0x78, 0xF7, 0x75, 0xC2, 0xA2, 0xFE, 0xF5, 0x6A, 0x6E,
0xF6, 0x00, 0x4F, 0x28, 0xDB, 0xDE, 0x68, 0x86, 0x6C, 0x44, 0x93, 0xB6,
0xB1, 0x63, 0xFD, 0x14, 0x12, 0x6B, 0xBF, 0x1F, 0xD2, 0xEA, 0x31, 0x9B,
0x21, 0x7E, 0xD1, 0x33, 0x3C, 0xBA, 0x48, 0xF5, 0xDD, 0x79, 0xDF, 0xB3,
0xB8, 0xFF, 0x12, 0xF1, 0x21, 0x9A, 0x4B, 0xC1, 0x8A, 0x86, 0x71, 0x69,
0x4A, 0x66, 0x66, 0x6C, 0x8F, 0x7E, 0x3C, 0x70, 0xBF, 0xAD, 0x29, 0x22,
0x06, 0xF3, 0xE4, 0xC0, 0xE6, 0x80, 0xAE, 0xE2, 0x4B, 0x8F, 0xB7, 0x99,
0x7E, 0x94, 0x03, 0x9F, 0xD3, 0x47, 0x97, 0x7C, 0x99, 0x48, 0x23, 0x53,
0xE8, 0x38, 0xAE, 0x4F, 0x0A, 0x6F, 0x83, 0x2E, 0xD1, 0x49, 0x57, 0x8C,
0x80, 0x74, 0xB6, 0xDA, 0x2F, 0xD0, 0x38, 0x8D, 0x7B, 0x03, 0x70, 0x21,
0x1B, 0x75, 0xF2, 0x30, 0x3C, 0xFA, 0x8F, 0xAE, 0xDD, 0xDA, 0x63, 0xAB,
0xEB, 0x16, 0x4F, 0xC2, 0x8E, 0x11, 0x4B, 0x7E, 0xCF, 0x0B, 0xE8, 0xFF,
0xB5, 0x77, 0x2E, 0xF4, 0xB2, 0x7B, 0x4A, 0xE0, 0x4C, 0x12, 0x25, 0x0C,
0x70, 0x8D, 0x03, 0x29, 0xA0, 0xE1, 0x53, 0x24, 0xEC, 0x13, 0xD9, 0xEE,
0x19, 0xBF, 0x10, 0xB3, 0x4A, 0x8C, 0x3F, 0x89, 0xA3, 0x61, 0x51, 0xDE,
0xAC, 0x87, 0x07, 0x94, 0xF4, 0x63, 0x71, 0xEC, 0x2E, 0xE2, 0x6F, 0x5B,
0x98, 0x81, 0xE1, 0x89, 0x5C, 0x34, 0x79, 0x6C, 0x76, 0xEF, 0x3B, 0x90,
0x62, 0x79, 0xE6, 0xDB, 0xA4, 0x9A, 0x2F, 0x26, 0xC5, 0xD0, 0x10, 0xE1,
0x0E, 0xDE, 0xD9, 0x10, 0x8E, 0x16, 0xFB, 0xB7, 0xF7, 0xA8, 0xF7, 0xC7,
0xE5, 0x02, 0x07, 0x98, 0x8F, 0x36, 0x08, 0x95, 0xE7, 0xE2, 0x37, 0x96,
0x0D, 0x36, 0x75, 0x9E, 0xFB, 0x0E, 0x72, 0xB1, 0x1D, 0x9B, 0xBC, 0x03,
0xF9, 0x49, 0x05, 0xD8, 0x81, 0xDD, 0x05, 0xB4, 0x2A, 0xD6, 0x41, 0xE9,
0xAC, 0x01, 0x76, 0x95, 0x0A, 0x0F, 0xD8, 0xDF, 0xD5, 0xBD, 0x12, 0x1F,
0x35, 0x2F, 0x28, 0x17, 0x6C, 0xD2, 0x98, 0xC1, 0xA8, 0x09, 0x64, 0x77,
0x6E, 0x47, 0x37, 0xBA, 0xCE, 0xAC, 0x59, 0x5E, 0x68, 0x9D, 0x7F, 0x72,
0xD6, 0x89, 0xC5, 0x06, 0x41, 0x29, 0x3E, 0x59, 0x3E, 0xDD, 0x26, 0xF5,
0x24, 0xC9, 0x11, 0xA7, 0x5A, 0xA3, 0x4C, 0x40, 0x1F, 0x46, 0xA1, 0x99,
0xB5, 0xA7, 0x3A, 0x51, 0x6E, 0x86, 0x3B, 0x9E, 0x7D, 0x72, 0xA7, 0x12,
0x05, 0x78, 0x59, 0xED, 0x3E, 0x51, 0x78, 0x15, 0x0B, 0x03, 0x8F, 0x8D,
0xD0, 0x2F, 0x05, 0xB2, 0x3E, 0x7B, 0x4A, 0x1C, 0x4B, 0x73, 0x05, 0x12,
0xFC, 0xC6, 0xEA, 0xE0, 0x50, 0x13, 0x7C, 0x43, 0x93, 0x74, 0xB3, 0xCA,
0x74, 0xE7, 0x8E, 0x1F, 0x01, 0x08, 0xD0, 0x30, 0xD4, 0x5B, 0x71, 0x36,
0xB4, 0x07, 0xBA, 0xC1, 0x30, 0x30, 0x5C, 0x48, 0xB7, 0x82, 0x3B, 0x98,
0xA6, 0x7D, 0x60, 0x8A, 0xA2, 0xA3, 0x29, 0x82, 0xCC, 0xBA, 0xBD, 0x83,
0x04, 0x1B, 0xA2, 0x83, 0x03, 0x41, 0xA1, 0xD6, 0x05, 0xF1, 0x1B, 0xC2,
0xB6, 0xF0, 0xA8, 0x7C, 0x86, 0x3B, 0x46, 0xA8, 0x48, 0x2A, 0x88, 0xDC,
0x76, 0x9A, 0x76, 0xBF, 0x1F, 0x6A, 0xA5, 0x3D, 0x19, 0x8F, 0xEB, 0x38,
0xF3, 0x64, 0xDE, 0xC8, 0x2B, 0x0D, 0x0A, 0x28, 0xFF, 0xF7, 0xDB, 0xE2,
0x15, 0x42, 0xD4, 0x22, 0xD0, 0x27, 0x5D, 0xE1, 0x79, 0xFE, 0x18, 0xE7,
0x70, 0x88, 0xAD, 0x4E, 0xE6, 0xD9, 0x8B, 0x3A, 0xC6, 0xDD, 0x27, 0x51,
0x6E, 0xFF, 0xBC, 0x64, 0xF5, 0x33, 0x43, 0x4F
};
static const unsigned char TA2_RSA_E[] = {
0x01, 0x00, 0x01
};
static const unsigned char TA3_DN[] = {
0x30, 0x4F, 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13,
0x02, 0x55, 0x53, 0x31, 0x29, 0x30, 0x27, 0x06, 0x03, 0x55, 0x04, 0x0A,
0x13, 0x20, 0x49, 0x6E, 0x74, 0x65, 0x72, 0x6E, 0x65, 0x74, 0x20, 0x53,
0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x20, 0x52, 0x65, 0x73, 0x65,
0x61, 0x72, 0x63, 0x68, 0x20, 0x47, 0x72, 0x6F, 0x75, 0x70, 0x31, 0x15,
0x30, 0x13, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x0C, 0x49, 0x53, 0x52,
0x47, 0x20, 0x52, 0x6F, 0x6F, 0x74, 0x20, 0x58, 0x32
};
static const unsigned char TA3_EC_Q[] = {
0x04, 0xCD, 0x9B, 0xD5, 0x9F, 0x80, 0x83, 0x0A, 0xEC, 0x09, 0x4A, 0xF3,
0x16, 0x4A, 0x3E, 0x5C, 0xCF, 0x77, 0xAC, 0xDE, 0x67, 0x05, 0x0D, 0x1D,
0x07, 0xB6, 0xDC, 0x16, 0xFB, 0x5A, 0x8B, 0x14, 0xDB, 0xE2, 0x71, 0x60,
0xC4, 0xBA, 0x45, 0x95, 0x11, 0x89, 0x8E, 0xEA, 0x06, 0xDF, 0xF7, 0x2A,
0x16, 0x1C, 0xA4, 0xB9, 0xC5, 0xC5, 0x32, 0xE0, 0x03, 0xE0, 0x1E, 0x82,
0x18, 0x38, 0x8B, 0xD7, 0x45, 0xD8, 0x0A, 0x6A, 0x6E, 0xE6, 0x00, 0x77,
0xFB, 0x02, 0x51, 0x7D, 0x22, 0xD8, 0x0A, 0x6E, 0x9A, 0x5B, 0x77, 0xDF,
0xF0, 0xFA, 0x41, 0xEC, 0x39, 0xDC, 0x75, 0xCA, 0x68, 0x07, 0x0C, 0x1F,
0xEA
};
static const unsigned char TA4_DN[] = {
0x30, 0x5A, 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13,
0x02, 0x49, 0x45, 0x31, 0x12, 0x30, 0x10, 0x06, 0x03, 0x55, 0x04, 0x0A,
0x13, 0x09, 0x42, 0x61, 0x6C, 0x74, 0x69, 0x6D, 0x6F, 0x72, 0x65, 0x31,
0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x0B, 0x13, 0x0A, 0x43, 0x79,
0x62, 0x65, 0x72, 0x54, 0x72, 0x75, 0x73, 0x74, 0x31, 0x22, 0x30, 0x20,
0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x19, 0x42, 0x61, 0x6C, 0x74, 0x69,
0x6D, 0x6F, 0x72, 0x65, 0x20, 0x43, 0x79, 0x62, 0x65, 0x72, 0x54, 0x72,
0x75, 0x73, 0x74, 0x20, 0x52, 0x6F, 0x6F, 0x74
};
static const unsigned char TA4_RSA_N[] = {
0xA3, 0x04, 0xBB, 0x22, 0xAB, 0x98, 0x3D, 0x57, 0xE8, 0x26, 0x72, 0x9A,
0xB5, 0x79, 0xD4, 0x29, 0xE2, 0xE1, 0xE8, 0x95, 0x80, 0xB1, 0xB0, 0xE3,
0x5B, 0x8E, 0x2B, 0x29, 0x9A, 0x64, 0xDF, 0xA1, 0x5D, 0xED, 0xB0, 0x09,
0x05, 0x6D, 0xDB, 0x28, 0x2E, 0xCE, 0x62, 0xA2, 0x62, 0xFE, 0xB4, 0x88,
0xDA, 0x12, 0xEB, 0x38, 0xEB, 0x21, 0x9D, 0xC0, 0x41, 0x2B, 0x01, 0x52,
0x7B, 0x88, 0x77, 0xD3, 0x1C, 0x8F, 0xC7, 0xBA, 0xB9, 0x88, 0xB5, 0x6A,
0x09, 0xE7, 0x73, 0xE8, 0x11, 0x40, 0xA7, 0xD1, 0xCC, 0xCA, 0x62, 0x8D,
0x2D, 0xE5, 0x8F, 0x0B, 0xA6, 0x50, 0xD2, 0xA8, 0x50, 0xC3, 0x28, 0xEA,
0xF5, 0xAB, 0x25, 0x87, 0x8A, 0x9A, 0x96, 0x1C, 0xA9, 0x67, 0xB8, 0x3F,
0x0C, 0xD5, 0xF7, 0xF9, 0x52, 0x13, 0x2F, 0xC2, 0x1B, 0xD5, 0x70, 0x70,
0xF0, 0x8F, 0xC0, 0x12, 0xCA, 0x06, 0xCB, 0x9A, 0xE1, 0xD9, 0xCA, 0x33,
0x7A, 0x77, 0xD6, 0xF8, 0xEC, 0xB9, 0xF1, 0x68, 0x44, 0x42, 0x48, 0x13,
0xD2, 0xC0, 0xC2, 0xA4, 0xAE, 0x5E, 0x60, 0xFE, 0xB6, 0xA6, 0x05, 0xFC,
0xB4, 0xDD, 0x07, 0x59, 0x02, 0xD4, 0x59, 0x18, 0x98, 0x63, 0xF5, 0xA5,
0x63, 0xE0, 0x90, 0x0C, 0x7D, 0x5D, 0xB2, 0x06, 0x7A, 0xF3, 0x85, 0xEA,
0xEB, 0xD4, 0x03, 0xAE, 0x5E, 0x84, 0x3E, 0x5F, 0xFF, 0x15, 0xED, 0x69,
0xBC, 0xF9, 0x39, 0x36, 0x72, 0x75, 0xCF, 0x77, 0x52, 0x4D, 0xF3, 0xC9,
0x90, 0x2C, 0xB9, 0x3D, 0xE5, 0xC9, 0x23, 0x53, 0x3F, 0x1F, 0x24, 0x98,
0x21, 0x5C, 0x07, 0x99, 0x29, 0xBD, 0xC6, 0x3A, 0xEC, 0xE7, 0x6E, 0x86,
0x3A, 0x6B, 0x97, 0x74, 0x63, 0x33, 0xBD, 0x68, 0x18, 0x31, 0xF0, 0x78,
0x8D, 0x76, 0xBF, 0xFC, 0x9E, 0x8E, 0x5D, 0x2A, 0x86, 0xA7, 0x4D, 0x90,
0xDC, 0x27, 0x1A, 0x39
};
static const unsigned char TA4_RSA_E[] = {
0x01, 0x00, 0x01
};
static const unsigned char TA5_DN[] = {
0x30, 0x81, 0x88, 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06,
0x13, 0x02, 0x55, 0x53, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04,
0x08, 0x13, 0x0A, 0x4E, 0x65, 0x77, 0x20, 0x4A, 0x65, 0x72, 0x73, 0x65,
0x79, 0x31, 0x14, 0x30, 0x12, 0x06, 0x03, 0x55, 0x04, 0x07, 0x13, 0x0B,
0x4A, 0x65, 0x72, 0x73, 0x65, 0x79, 0x20, 0x43, 0x69, 0x74, 0x79, 0x31,
0x1E, 0x30, 0x1C, 0x06, 0x03, 0x55, 0x04, 0x0A, 0x13, 0x15, 0x54, 0x68,
0x65, 0x20, 0x55, 0x53, 0x45, 0x52, 0x54, 0x52, 0x55, 0x53, 0x54, 0x20,
0x4E, 0x65, 0x74, 0x77, 0x6F, 0x72, 0x6B, 0x31, 0x2E, 0x30, 0x2C, 0x06,
0x03, 0x55, 0x04, 0x03, 0x13, 0x25, 0x55, 0x53, 0x45, 0x52, 0x54, 0x72,
0x75, 0x73, 0x74, 0x20, 0x52, 0x53, 0x41, 0x20, 0x43, 0x65, 0x72, 0x74,
0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x41, 0x75,
0x74, 0x68, 0x6F, 0x72, 0x69, 0x74, 0x79
};
static const unsigned char TA5_RSA_N[] = {
0x80, 0x12, 0x65, 0x17, 0x36, 0x0E, 0xC3, 0xDB, 0x08, 0xB3, 0xD0, 0xAC,
0x57, 0x0D, 0x76, 0xED, 0xCD, 0x27, 0xD3, 0x4C, 0xAD, 0x50, 0x83, 0x61,
0xE2, 0xAA, 0x20, 0x4D, 0x09, 0x2D, 0x64, 0x09, 0xDC, 0xCE, 0x89, 0x9F,
0xCC, 0x3D, 0xA9, 0xEC, 0xF6, 0xCF, 0xC1, 0xDC, 0xF1, 0xD3, 0xB1, 0xD6,
0x7B, 0x37, 0x28, 0x11, 0x2B, 0x47, 0xDA, 0x39, 0xC6, 0xBC, 0x3A, 0x19,
0xB4, 0x5F, 0xA6, 0xBD, 0x7D, 0x9D, 0xA3, 0x63, 0x42, 0xB6, 0x76, 0xF2,
0xA9, 0x3B, 0x2B, 0x91, 0xF8, 0xE2, 0x6F, 0xD0, 0xEC, 0x16, 0x20, 0x90,
0x09, 0x3E, 0xE2, 0xE8, 0x74, 0xC9, 0x18, 0xB4, 0x91, 0xD4, 0x62, 0x64,
0xDB, 0x7F, 0xA3, 0x06, 0xF1, 0x88, 0x18, 0x6A, 0x90, 0x22, 0x3C, 0xBC,
0xFE, 0x13, 0xF0, 0x87, 0x14, 0x7B, 0xF6, 0xE4, 0x1F, 0x8E, 0xD4, 0xE4,
0x51, 0xC6, 0x11, 0x67, 0x46, 0x08, 0x51, 0xCB, 0x86, 0x14, 0x54, 0x3F,
0xBC, 0x33, 0xFE, 0x7E, 0x6C, 0x9C, 0xFF, 0x16, 0x9D, 0x18, 0xBD, 0x51,
0x8E, 0x35, 0xA6, 0xA7, 0x66, 0xC8, 0x72, 0x67, 0xDB, 0x21, 0x66, 0xB1,
0xD4, 0x9B, 0x78, 0x03, 0xC0, 0x50, 0x3A, 0xE8, 0xCC, 0xF0, 0xDC, 0xBC,
0x9E, 0x4C, 0xFE, 0xAF, 0x05, 0x96, 0x35, 0x1F, 0x57, 0x5A, 0xB7, 0xFF,
0xCE, 0xF9, 0x3D, 0xB7, 0x2C, 0xB6, 0xF6, 0x54, 0xDD, 0xC8, 0xE7, 0x12,
0x3A, 0x4D, 0xAE, 0x4C, 0x8A, 0xB7, 0x5C, 0x9A, 0xB4, 0xB7, 0x20, 0x3D,
0xCA, 0x7F, 0x22, 0x34, 0xAE, 0x7E, 0x3B, 0x68, 0x66, 0x01, 0x44, 0xE7,
0x01, 0x4E, 0x46, 0x53, 0x9B, 0x33, 0x60, 0xF7, 0x94, 0xBE, 0x53, 0x37,
0x90, 0x73, 0x43, 0xF3, 0x32, 0xC3, 0x53, 0xEF, 0xDB, 0xAA, 0xFE, 0x74,
0x4E, 0x69, 0xC7, 0x6B, 0x8C, 0x60, 0x93, 0xDE, 0xC4, 0xC7, 0x0C, 0xDF,
0xE1, 0x32, 0xAE, 0xCC, 0x93, 0x3B, 0x51, 0x78, 0x95, 0x67, 0x8B, 0xEE,
0x3D, 0x56, 0xFE, 0x0C, 0xD0, 0x69, 0x0F, 0x1B, 0x0F, 0xF3, 0x25, 0x26,
0x6B, 0x33, 0x6D, 0xF7, 0x6E, 0x47, 0xFA, 0x73, 0x43, 0xE5, 0x7E, 0x0E,
0xA5, 0x66, 0xB1, 0x29, 0x7C, 0x32, 0x84, 0x63, 0x55, 0x89, 0xC4, 0x0D,
0xC1, 0x93, 0x54, 0x30, 0x19, 0x13, 0xAC, 0xD3, 0x7D, 0x37, 0xA7, 0xEB,
0x5D, 0x3A, 0x6C, 0x35, 0x5C, 0xDB, 0x41, 0xD7, 0x12, 0xDA, 0xA9, 0x49,
0x0B, 0xDF, 0xD8, 0x80, 0x8A, 0x09, 0x93, 0x62, 0x8E, 0xB5, 0x66, 0xCF,
0x25, 0x88, 0xCD, 0x84, 0xB8, 0xB1, 0x3F, 0xA4, 0x39, 0x0F, 0xD9, 0x02,
0x9E, 0xEB, 0x12, 0x4C, 0x95, 0x7C, 0xF3, 0x6B, 0x05, 0xA9, 0x5E, 0x16,
0x83, 0xCC, 0xB8, 0x67, 0xE2, 0xE8, 0x13, 0x9D, 0xCC, 0x5B, 0x82, 0xD3,
0x4C, 0xB3, 0xED, 0x5B, 0xFF, 0xDE, 0xE5, 0x73, 0xAC, 0x23, 0x3B, 0x2D,
0x00, 0xBF, 0x35, 0x55, 0x74, 0x09, 0x49, 0xD8, 0x49, 0x58, 0x1A, 0x7F,
0x92, 0x36, 0xE6, 0x51, 0x92, 0x0E, 0xF3, 0x26, 0x7D, 0x1C, 0x4D, 0x17,
0xBC, 0xC9, 0xEC, 0x43, 0x26, 0xD0, 0xBF, 0x41, 0x5F, 0x40, 0xA9, 0x44,
0x44, 0xF4, 0x99, 0xE7, 0x57, 0x87, 0x9E, 0x50, 0x1F, 0x57, 0x54, 0xA8,
0x3E, 0xFD, 0x74, 0x63, 0x2F, 0xB1, 0x50, 0x65, 0x09, 0xE6, 0x58, 0x42,
0x2E, 0x43, 0x1A, 0x4C, 0xB4, 0xF0, 0x25, 0x47, 0x59, 0xFA, 0x04, 0x1E,
0x93, 0xD4, 0x26, 0x46, 0x4A, 0x50, 0x81, 0xB2, 0xDE, 0xBE, 0x78, 0xB7,
0xFC, 0x67, 0x15, 0xE1, 0xC9, 0x57, 0x84, 0x1E, 0x0F, 0x63, 0xD6, 0xE9,
0x62, 0xBA, 0xD6, 0x5F, 0x55, 0x2E, 0xEA, 0x5C, 0xC6, 0x28, 0x08, 0x04,
0x25, 0x39, 0xB8, 0x0E, 0x2B, 0xA9, 0xF2, 0x4C, 0x97, 0x1C, 0x07, 0x3F,
0x0D, 0x52, 0xF5, 0xED, 0xEF, 0x2F, 0x82, 0x0F
};
static const unsigned char TA5_RSA_E[] = {
0x01, 0x00, 0x01
};
static const unsigned char TA6_DN[] = {
0x30, 0x47, 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13,
0x02, 0x55, 0x53, 0x31, 0x22, 0x30, 0x20, 0x06, 0x03, 0x55, 0x04, 0x0A,
0x13, 0x19, 0x47, 0x6F, 0x6F, 0x67, 0x6C, 0x65, 0x20, 0x54, 0x72, 0x75,
0x73, 0x74, 0x20, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x20,
0x4C, 0x4C, 0x43, 0x31, 0x14, 0x30, 0x12, 0x06, 0x03, 0x55, 0x04, 0x03,
0x13, 0x0B, 0x47, 0x54, 0x53, 0x20, 0x52, 0x6F, 0x6F, 0x74, 0x20, 0x52,
0x34
};
static const unsigned char TA6_EC_Q[] = {
0x04, 0xF3, 0x74, 0x73, 0xA7, 0x68, 0x8B, 0x60, 0xAE, 0x43, 0xB8, 0x35,
0xC5, 0x81, 0x30, 0x7B, 0x4B, 0x49, 0x9D, 0xFB, 0xC1, 0x61, 0xCE, 0xE6,
0xDE, 0x46, 0xBD, 0x6B, 0xD5, 0x61, 0x18, 0x35, 0xAE, 0x40, 0xDD, 0x73,
0xF7, 0x89, 0x91, 0x30, 0x5A, 0xEB, 0x3C, 0xEE, 0x85, 0x7C, 0xA2, 0x40,
0x76, 0x3B, 0xA9, 0xC6, 0xB8, 0x47, 0xD8, 0x2A, 0xE7, 0x92, 0x91, 0x6A,
0x73, 0xE9, 0xB1, 0x72, 0x39, 0x9F, 0x29, 0x9F, 0xA2, 0x98, 0xD3, 0x5F,
0x5E, 0x58, 0x86, 0x65, 0x0F, 0xA1, 0x84, 0x65, 0x06, 0xD1, 0xDC, 0x8B,
0xC9, 0xC7, 0x73, 0xC8, 0x8C, 0x6A, 0x2F, 0xE5, 0xC4, 0xAB, 0xD1, 0x1D,
0x8A
};
static
#ifndef CC_BUILD_SYMBIAN
const
#endif
br_x509_trust_anchor TAs[7] = {
{
{ (unsigned char *)TA0_DN, sizeof TA0_DN },
BR_X509_TA_CA,
{
BR_KEYTYPE_RSA,
{ {
(unsigned char *)TA0_RSA_N, sizeof TA0_RSA_N,
(unsigned char *)TA0_RSA_E, sizeof TA0_RSA_E,
} }
}
},
{
{ (unsigned char *)TA1_DN, sizeof TA1_DN },
BR_X509_TA_CA,
{
BR_KEYTYPE_RSA,
{ {
(unsigned char *)TA1_RSA_N, sizeof TA1_RSA_N,
(unsigned char *)TA1_RSA_E, sizeof TA1_RSA_E,
} }
}
},
{
{ (unsigned char *)TA2_DN, sizeof TA2_DN },
BR_X509_TA_CA,
{
BR_KEYTYPE_RSA,
{ {
(unsigned char *)TA2_RSA_N, sizeof TA2_RSA_N,
(unsigned char *)TA2_RSA_E, sizeof TA2_RSA_E,
} }
}
},
{
{ (unsigned char *)TA3_DN, sizeof TA3_DN },
BR_X509_TA_CA,
{
#if defined CC_BUILD_SYMBIAN
BR_KEYTYPE_EC
/* set in SSL.c */
#else
BR_KEYTYPE_EC,
{ .ec = {
BR_EC_secp384r1,
(unsigned char *)TA3_EC_Q, sizeof TA3_EC_Q,
} }
#endif
}
},
{
{ (unsigned char *)TA4_DN, sizeof TA4_DN },
BR_X509_TA_CA,
{
BR_KEYTYPE_RSA,
{ {
(unsigned char *)TA4_RSA_N, sizeof TA4_RSA_N,
(unsigned char *)TA4_RSA_E, sizeof TA4_RSA_E,
} }
}
},
{
{ (unsigned char *)TA5_DN, sizeof TA5_DN },
BR_X509_TA_CA,
{
BR_KEYTYPE_RSA,
{ {
(unsigned char *)TA5_RSA_N, sizeof TA5_RSA_N,
(unsigned char *)TA5_RSA_E, sizeof TA5_RSA_E,
} }
}
},
{
{ (unsigned char *)TA6_DN, sizeof TA6_DN },
BR_X509_TA_CA,
{
#if defined CC_BUILD_SYMBIAN
BR_KEYTYPE_EC
/* set in SSL.c */
#else
BR_KEYTYPE_EC,
{ .ec = {
BR_EC_secp384r1,
(unsigned char *)TA6_EC_Q, sizeof TA6_EC_Q,
} }
#endif
}
}
};
#define TAs_NUM 7

BIN
misc/certs/isrg-root-x2.der Normal file

Binary file not shown.

BIN
misc/certs/isrgrootx1.der Normal file

Binary file not shown.

BIN
misc/certs/r4.crt Normal file

Binary file not shown.

96
misc/dreamcast/Makefile Normal file
View File

@@ -0,0 +1,96 @@
ifeq ($(strip $(KOS_BASE)),)
$(warning Please set KOS variables in your environment. For example:)
$(warning source /opt/toolchains/dc/kos/environ.sh)
$(error Failed to find KallistiOS installation)
endif
#---------------------------------------------------------------------------------
# Configurable options
#---------------------------------------------------------------------------------
# Directory where object files are placed
BUILD_DIR := build/dc
# List of directories containing source code
SOURCE_DIRS := src third_party/bearssl/src misc/dreamcast
# Name of the final output
TARGET := ClassiCube-dc
# Additional libraries to link against
LIBS = -lm -lppp -lkosfat
# List of directories containing more header files
INCLUDES = -Ithird_party/bearssl/inc
#---------------------------------------------------------------------------------
# Code generation
#---------------------------------------------------------------------------------
S_FILES := $(foreach dir,$(SOURCE_DIRS),$(wildcard $(dir)/*.S))
C_FILES := $(foreach dir,$(SOURCE_DIRS),$(wildcard $(dir)/*.c))
OBJS := $(addprefix $(BUILD_DIR)/, $(notdir $(C_FILES:%.c=%.o) $(S_FILES:%.S=%.o)))
CFLAGS := -g -DNDEBUG -O3 -fipa-pta -fno-pie -flto=auto -fomit-frame-pointer -fbuiltin -ffast-math -ffp-contract=fast -mfsrra -mfsca -pipe -fno-math-errno
LDFLAGS = -g
# Dependency tracking
DEPFLAGS = -MT $@ -MMD -MP -MF $(BUILD_DIR)/$*.d
DEPFILES := $(OBJS:%.o=%.d)
#---------------------------------------------------------------------------------
# Main targets
#---------------------------------------------------------------------------------
default: $(BUILD_DIR) $(TARGET).cdi
clean:
rm $(TARGET).cdi $(TARGET).iso $(TARGET).elf $(TARGET)-scr.bin $(TARGET).bin $(OBJS)
$(BUILD_DIR):
mkdir -p $(BUILD_DIR)
#---------------------------------------------------------------------------------
# Executable generation
#---------------------------------------------------------------------------------
$(TARGET).elf: $(OBJS)
kos-cc $(LDFLAGS) $^ -o $@ $(LIBS)
$(TARGET).bin: $(TARGET).elf
sh-elf-objcopy -R .stack -O binary $(TARGET).elf $(TARGET).bin
# https://dcemulation.org/phpBB/viewtopic.php?t=105269
$(TARGET)-scr.bin: $(TARGET).bin
$(KOS_BASE)/utils/scramble/scramble $(TARGET).bin $(TARGET)-scr.bin
$(TARGET).iso: $(TARGET)-scr.bin
mkdir -p ISO_FILES
cp $(TARGET)-scr.bin ISO_FILES/1ST_READ.BIN
mkdir -p ISO_FILES/audio
mkdir -p ISO_FILES/maps
mkdir -p ISO_FILES/texpacks
mkdir -p ISO_FILES/texturecache
cp misc/dreamcast/classicube.zip ISO_FILES/texpacks/default.zip
cp misc/dreamcast/IP.BIN IP.BIN
mkisofs -G IP.BIN -C 0,11702 -J -l -r -quiet -o $(TARGET).iso ISO_FILES
# genisoimage -V ClassiCube -G IP.BIN -joliet -rock -l -o $(TARGET).iso ISO_FILES
$(TARGET).cdi: $(TARGET).iso
cdi4dc $(TARGET).iso $(TARGET).cdi
#---------------------------------------------------------------------------------
# Object generation
#---------------------------------------------------------------------------------
$(BUILD_DIR)/%.o: src/%.c
kos-cc $(CFLAGS) $(INCLUDES) $(DEPFLAGS) -c $< -o $@
$(BUILD_DIR)/%.o: third_party/bearssl/src/%.c
kos-cc $(CFLAGS) $(INCLUDES) -c $< -o $@
$(BUILD_DIR)/%.o: misc/dreamcast/%.S
kos-cc $(DEPFLAGS) -c $< -o $@
#---------------------------------------------------------------------------------
# Dependency tracking
#---------------------------------------------------------------------------------
$(DEPFILES):
include $(wildcard $(DEPFILES))

196
misc/dreamcast/VertexClip.S Normal file
View File

@@ -0,0 +1,196 @@
! r1 = v1, CLOBBERS
! r2 = v2, CLOBBERS
! r3 = OUT, CLOBBERS
! r4 = TMP 1, preserved
! r5 = TMP 2, preserved
! r0 = CL0, CLOBBERS
! FR0 = 0
! FR1 = 0
! FR2 = A.1
! FR3 = B.1
! FR4 = 0
! FR5 = 0
! FR6 = A.2
! FR7 = B.2
! FR8 = 0
! FR9 = 0
! FR10 = invT
! FR11 = t
#define TM1 r0 // CLOBBERED, temp register 1
#define TM2 r4 // PRESERVED, temp register 2
#define CLO r5 // PRESERVED, output colour
#define IN1 r1 // CLOBBERED, input vertex 1
#define IN2 r2 // CLOBBERED, input vertex 2
#define OUT r3 // CLOBBERED, output vertex
#define CL1 r1 // CLOBBERED, input colour 1
#define CL2 r2 // CLOBBERED, input colour 2
! Calculates the near plane intersection point between two points:
! float t = fabsf(v1->z) / fabsf(v2->z - v1->z)
! float invt = 1.0f - t;
!
! out->x = invt * v1->x + t * v2->x;
! out->y = invt * v1->y + t * v2->y;
! out->z = 0.0f; // clipped against near plane anyways (I.e Z/W = 0 --> Z = 0)
!
! out->u = invt * v1->u + t * v2->u;
! out->v = invt * v1->v + t * v2->v;
! out->w = invt * v1->w + t * v2->w;
!
! out->b = invt * v1->b + t * v2->b;
! out->g = invt * v1->g + t * v2->g;
! out->r = invt * v1->r + t * v2->r;
! out->a = invt * v1->a + t * v2->a;
! To optimise these calculations, FIPR is used:
! FIPR = FVm.x*FVn.x + FVm.y*FVn.x + FVm.z*FVn.z + FVm.w*FVn.w --> FVn.w
! FIPR can be used to accomplish "vout->Q = invt * v1->Q + t * v2->Q" by:
! - assigning x/y components to 0 for both vectors
! - assigning t and invT to z/w of FVm vector
! - assigning v1 and v2 to z/w of FVn vector
! FIPR = 0*0 + 0*0 + t*v1->Q + invT*v2->Q --> FVn.w
! FIPR = t*v1->Q + invT*v2->Q --> FVn.w
.global _ClipLine
.align 4
_ClipLine:
mov.l r4,@-r15 ! LS, push(r4)
mov.l r5,@-r15 ! LS, push(r5)
mov IN1, TM1 ! MT, tmp = &v1
fldi0 fr4 ! LS, fr4 = 0
add #12, TM1 ! EX, tmp = &v1->z
fmov.s @TM1, fr2 ! LS, fr2 = v1->z
mov IN2, TM1 ! MT, tmp = &v2
fldi0 fr5 ! LS, fr5 = 0
add #12, TM1 ! EX, tmp = &v2->z
fmov.s @TM1,fr11 ! LS, fr11 = v2->z
fsub fr2,fr11 ! FE, fr11 = v2->z - v1->z
fldi0 fr8 ! LS, fr8 = 0
fmul fr11,fr11 ! FE, fr11 = (v2->z - v1->z) * (v2->z * v1->z)
fldi0 fr9 ! LS, fr9 = 0
fldi0 fr0 ! LS, fr0 = 0
fldi0 fr1 ! LS, fr1 = 0
fsrra fr11 ! FE, fr11 = 1 / abs(v2->z - v1->z)
fabs fr2 ! LS, fr2 = abs(v1->z)
fmul fr2,fr11 ! FE, fr11 = abs(v1->Z) / abs(v2->z - v1->z) --> t
add #4, IN1 ! EX, v1 += 4
fldi1 fr10 ! LS, fr10 = 1
add #4, IN2 ! EX, v2 += 4
add #4, OUT ! EX, OUT += 4
fsub fr11,fr10 ! FE, fr10 = 1.0 - t --> invT
fmov.s @IN1+, fr2 ! LS, A1 = v1->x, v1 += 4
fmov.s @IN2+, fr3 ! LS, B1 = v2->x, v2 += 4
fipr fv8, fv0 ! FE, LERP(A1, B1)
fmov.s @IN1+, fr6 ! LS, A2 = v1->y, v1 += 4
fmov.s @IN2+, fr7 ! LS, B2 = v2->y, v2 += 4
fmov.s fr3,@OUT ! LS, OUT->x = LERP
add #4, OUT ! EX, OUT += 4
fipr fv8, fv4 ! FE, LERP(A2, B2)
add #4, IN1 ! EX, v1 += 4
add #4, IN2 ! EX, v2 += 4
fmov.s fr7,@OUT ! LS, OUT->y = LERP
add #4, OUT ! EX, OUT += 4
fmov.s fr1,@OUT ! LS, OUT->z = 0
add #4, OUT ! EX, OUT += 4
fmov.s @IN1+, fr2 ! LS, A1 = v1->u, v1 += 4
fmov.s @IN2+, fr3 ! LS, B1 = v2->u, v2 += 4
fipr fv8, fv0 ! FE, LERP(A1, B1)
fmov.s @IN1+, fr6 ! LS, A2 = v1->v, v1 += 4
fmov.s @IN2+, fr7 ! LS, B2 = v2->v, v2 += 4
fmov.s fr3,@OUT ! LS, OUT->u = LERP
add #4, OUT ! EX, OUT += 4
fipr fv8, fv4 ! FE, LERP(A2, B2)
add #4, IN1 ! EX, v1 += 4
add #4, IN2 ! EX, v2 += 4
fmov.s @IN1,fr2 ! LS, A1 = v1->w
fmov.s @IN2,fr3 ! LS, B1 = v2->w
fmov.s fr7,@OUT ! LS, OUT->v = LERP
add #8, OUT ! EX, OUT += 8
fipr fv8, fv0 ! FE, LERP(A1, B1)
add #-4, IN1 ! EX, v1 -= 4
add #-4, IN2 ! EX, v2 -= 4
fmov.s fr3,@OUT ! LS, OUT->w = lerp
add #-4, OUT ! EX, OUT -= 4
mov.l @IN1,CL1 ! LS, ACOLOR = v1->bgra
mov.l @IN2,CL2 ! LS, BCOLOR = v2->bgra
! Bypass interpolation if unnecessary
cmp/eq CL1,CL2 ! MT, T = ACOLOR == BCOLOR
bt.s 1f ! BR, if (T) goto 1;
mov CL1,CLO ! MT, OUTCOLOR = ACOLOR (branch delay instruction)
! Interpolate B
extu.b CL1,TM1 ! EX, val = ACOLOR.b
lds TM1,fpul ! CO, FPUL = val
float fpul,fr2 ! EX, fr2 = float(FPUL)
extu.b CL2,TM1 ! EX, val = BCOLOR.b
lds TM1,fpul ! CO, FPUL = val
float fpul,fr3 ! EX, fr3 = float(FPUL)
fipr fv8, fv0 ! FE, LERP(A1, B1)
shlr8 CL1 ! EX, ACOLOR >>= 8
ftrc fr3,fpul ! FE, FPUL = int(lerp)
shlr8 CL2 ! EX, BCOLOR >>= 8
sts fpul,TM2 ! CO, tmp = FPUL
! Interpolate G
extu.b CL1,TM1 ! EX, val = ACOLOR.g
lds TM1,fpul ! CO, FPUL = val
float fpul,fr2 ! EX, fr2 = float(FPUL)
extu.b CL2,TM1 ! EX, val = BCOLOR.g
lds TM1,fpul ! CO, FPUL = val
float fpul,fr3 ! EX, fr3 = float(FPUL)
fipr fv8, fv0 ! FE, LERP(A1, B1)
shlr8 CL1 ! EX, ACOLOR >>= 8
ftrc fr3,fpul ! FE, FPUL = int(lerp)
extu.b TM2,TM2 ! EX, tmp = (uint8)tmp
mov TM2,CLO ! MT, OUTCOLOR.b = tmp
shlr8 CL2 ! EX, BCOLOR >>= 8
sts fpul,TM2 ! CO, tmp = FPUL
! Interpolate R
extu.b CL1,TM1 ! EX, val = ACOLOR.r
lds TM1,fpul ! CO, FPUL = val
float fpul,fr2 ! EX, fr2 = float(FPUL)
extu.b CL2,TM1 ! EX, val = BCOLOR.r
lds TM1,fpul ! CO, FPUL = val
float fpul,fr3 ! EX, fr3 = float(FPUL)
fipr fv8, fv0 ! FE, LERP(A1, B1)
shlr8 CL1 ! EX, ACOLOR >>= 8
ftrc fr3,fpul ! FE, FPUL = int(lerp)
extu.b TM2,TM2 ! EX, tmp = (uint8)tmp
shll8 TM2 ! EX, tmp <<= 8
or TM2,CLO ! EX, OUTCOLOR.g |= tmp
shlr8 CL2 ! EX, BCOLOR >>= 8
sts fpul,TM2 ! CO, tmp = FPUL
! Interpolate A
extu.b CL1,TM1 ! EX, val = ACOLOR.a
lds TM1,fpul ! CO, FPUL = val
float fpul,fr2 ! EX, fr2 = float(FPUL)
extu.b CL2,TM1 ! EX, val = BCOLOR.a
lds TM1,fpul ! CO, FPUL = val
float fpul,fr3 ! EX, fr3 = float(FPUL)
fipr fv8, fv0 ! FE, LERP(A1, B1)
ftrc fr3,fpul ! FE, FPUL = int(lerp)
extu.b TM2,TM2 ! EX, tmp = (uint8)tmp
shll16 TM2 ! EX, tmp <<= 16
or TM2,CLO ! EX, OUTCOLOR.r |= tmp
sts fpul,TM2 ! CO, tmp = FPUL
extu.b TM2,TM2 ! EX, tmp = (uint8)tmp
shll16 TM2 ! EX, tmp <<= 16
shll8 TM2 ! EX, tmp <<= 8
or TM2,CLO ! EX, OUTCOLOR.a |= tmp
1:
mov.l CLO,@OUT ! LS, OUT->color = OUTCOLOR
mov.l @r15+,r5 ! LS, pop(r5)
rts ! CO, return after executing instruction in delay slot
mov.l @r15+,r4 ! LS, pop(r4)
.size _ClipLine, .-_ClipLine
.type _ClipLine,%function

View File

@@ -0,0 +1,210 @@
! Calculates vertex as the near plane intersection point between two points:
! float t = fabsf(v1->z) / fabsf(v2->z - v1->z)
! float w = (1 - t) * v1->w + t * v2->w;
!
! out->c = type << 24
! out->x = ((1 - t) * v1->x + t * v2->x) * 1/w
! out->y = ((1 - t) * v1->y + t * v2->y) * 1/w
! out->w = 1/w
!
! out->u = (1 - t) * v1->u + t * v2->u;
! out->v = (1 - t) * v1->v + t * v2->v;
!
! out->b = (1 - t) * v1->b + t * v2->b;
! out->g = (1 - t) * v1->g + t * v2->g;
! out->r = (1 - t) * v1->r + t * v2->r;
! out->a = (1 - t) * v1->a + t * v2->a;
! Optimisations:
! - w always ends up being zNear
! - Calculations of (1 - t) * v1 + t * v2 can be rearranged to t * (v2 - v1) + v1
! - These rearranges calculations can then take advantage of FMAC
! Final calculation:
! out->c = type << 24
! out->x = ((v2->x - v1->x) + v1->x) * 1/zNear
! out->y = ((v2->y - v1->y) + v1->y) * 1/zNear
! out->w = 1/zNear
!
! out->u = (v2->u - v1->u) + v1->u;
! out->v = (v2->v - v1->v) + v1->v;
!
! out->b = (v2->b - v1->b) + v1->b;
! out->g = (v2->g - v1->g) + v1->g;
! out->r = (v2->r - v1->r) + v1->r;
! out->a = (v2->a - v1->a) + v1->a;
! INPUT ARGUMENTS
#define IN1 r4 // input vertex 1
#define IN2 r5 // input vertex 2
#define OUT r6 // output vertex
#define TYP r7 // type/flags for output vertex
#define TM1 r1 // temp register 1
#define TM2 r3 // temp register 2
#define CL1 r4 // input colour 1
#define CL2 r5 // input colour 2
#define CLO r7 // output colour
#define F_T fr0
#define F_W fr1
#define F_X1 fr2
#define F_X2 fr3
#define F_Y1 fr4
#define F_Y2 fr5
#define F_U1 fr6
#define F_U2 fr7
#define F_V1 fr8
#define F_V2 fr9
#define F_Z1 fr10
#define F_Z2 fr11
#define Ftmp fr11
.global _ClipEdge
.align 4
_ClipEdge:
fschg ! FE (swap to 32 bit FPU loads/stores)
! Start calculating interpolation factor
add #28, IN1 ! EX, IN1 = &v1->z
mov.l _NEAR_CLIP_W,TM1 ! LS, tmp = invW (1/zNear)
fmov.s @IN1, F_Z1 ! LS, Z1 = v1->z
add #28, IN2 ! EX, IN = &v2->z
fmov.s @IN2, F_Z2 ! LS, Z2 = v2->z
shll16 TYP ! EX, TYP <<= 16
fsub F_Z1, Ftmp ! FE, tmp = v2->z - v1->z
! Load W
lds TM1,fpul ! LS, FPUL = invW (1/zNear)
add #-24, IN1 ! EX, IN1 = &v1->x
fsts fpul,F_W ! LS, invW = FPUL
add #-24, IN2 ! EX, IN2 = &v2->x
! Finish calculating interpolation factor
shll8 TYP ! EX, TYP <<= 8
fmul Ftmp,Ftmp ! FE, tmp = (v2->z - v1->z) * (v2->z * v1->z)
mov.l TYP,@OUT ! LS, dst->cmd = TYPE
! Load components
fmov.s @IN1+, F_X1 ! LS, X1 = v1->x
fmov.s @IN2+, F_X2 ! LS, X2 = v2->x
fmov.s @IN1+, F_Y1 ! LS, Y1 = y1->x
fmov.s @IN2+, F_Y2 ! LS, Y2 = y2->x
fsrra Ftmp ! FE, tmp = 1 / abs(v2->z - v1->z)
add #4, IN1 ! EX, skip over W
fabs F_Z1 ! LS, z1 = abs(v1->z)
add #4, IN2 ! EX, skip over W
fmov.s @IN1+, F_U1 ! LS, U1 = v1->u
fmov.s @IN2+, F_U2 ! LS, U2 = v2->u
fmov.s @IN1+, F_V1 ! LS, V1 = v1->v
fmul F_Z1,Ftmp ! FE, tmp = abs(v1->Z) / abs(v2->z - v1->z)
fmov.s @IN2+, F_V2 ! LS, V2 = v2->v
! Interpolate vertices
fsub F_X1, F_X2 ! FE, X2 = X2 - X1
fsub F_Y1, F_Y2 ! FE, Y2 = Y2 - Y1
fsub F_U1, F_U2 ! FE, U2 = U2 - U1
fmov Ftmp, F_T ! LS, T = tmp
fsub F_V1, F_V2 ! FE, V2 = V2 - V1
fmac F_T,F_X2,F_X1 ! FE, X = T * (X2 - X1) + X1
fmac F_T,F_Y2,F_Y1 ! FE, Y = T * (Y2 - Y1) + Y1
fmac F_T,F_U2,F_U1 ! FE, U = T * (U2 - U1) + U1
fmac F_T,F_V2,F_V1 ! FE, V = T * (V2 - V1) + V1
! Adjust by w
fmul F_W, F_X1 ! FE, x = invW * x
fmul F_W, F_Y1 ! FE, x = invY * x
! Load colours and check if equal
mov.l @IN1,CL1 ! LS, ACOLOR = v1->bgra
mov.l @IN2,CL2 ! LS, BCOLOR = v2->bgra
cmp/eq CL1,CL2 ! MT, T = ACOLOR == BCOLOR
add #28, OUT ! EX, dst = &dst->padding
! Bypass RGBA interpolation if unnecessary
bt.s 1f ! BR, if (T) goto 1;
mov CL1,CLO ! MT, OUTCOLOR = ACOLOR (branch delay instruction)
! Interpolate B
extu.b CL1,TM1 ! EX, val = ACOLOR.b
lds TM1,fpul ! LS, FPUL = val
float fpul,F_Z1 ! FE, C1 = float(val)
extu.b CL2,TM1 ! EX, val = BCOLOR.b
lds TM1,fpul ! LS, FPUL = val
float fpul,F_Z2 ! FE, C2 = float(val)
fsub F_Z1, F_Z2 ! FE, C2 = C2 - C1
fmac F_T,F_Z2,F_Z1 ! FE, C = T * (C2 - C1) + C1
shlr8 CL1 ! EX, ACOLOR >>= 8
shlr8 CL2 ! EX, BCOLOR >>= 8
ftrc F_Z1,fpul ! FE, FPUL = int(C)
sts fpul,TM2 ! LS, tmp = FPUL
! Interpolate G
extu.b CL1,TM1 ! EX, val = ACOLOR.g
lds TM1,fpul ! LS, FPUL = val
float fpul,F_Z1 ! FE, C1 = float(val)
extu.b CL2,TM1 ! EX, val = BCOLOR.g
lds TM1,fpul ! LS, FPUL = val
float fpul,F_Z2 ! FE, C2 = float(val)
fsub F_Z1, F_Z2 ! FE, C2 = C2 - C1
fmac F_T,F_Z2,F_Z1 ! FE, C = T * (C2 - C1) + C1
shlr8 CL1 ! EX, ACOLOR >>= 8
extu.b TM2,TM2 ! EX, tmp = (uint8)tmp
mov TM2,CLO ! MT, OUTCOLOR.b = tmp
shlr8 CL2 ! EX, BCOLOR >>= 8
ftrc F_Z1,fpul ! FE, FPUL = int(C)
sts fpul,TM2 ! LS, tmp = FPUL
! Interpolate R
extu.b CL1,TM1 ! EX, val = ACOLOR.r
lds TM1,fpul ! LS, FPUL = val
float fpul,F_Z1 ! FE, C1 = float(val)
extu.b CL2,TM1 ! EX, val = BCOLOR.r
lds TM1,fpul ! LS, FPUL = val
float fpul,F_Z2 ! FE, C2 = float(val)
fsub F_Z1, F_Z2 ! FE, C2 = C2 - C1
fmac F_T,F_Z2,F_Z1 ! FE, C = T * (C2 - C1) + C1
shlr8 CL1 ! EX, ACOLOR >>= 8
extu.b TM2,TM2 ! EX, tmp = (uint8)tmp
shll8 TM2 ! EX, tmp <<= 8
or TM2,CLO ! EX, OUTCOLOR.g |= tmp
shlr8 CL2 ! EX, BCOLOR >>= 8
ftrc F_Z1,fpul ! FE, FPUL = int(C)
sts fpul,TM2 ! LS, tmp = FPUL
! Interpolate A
extu.b CL1,TM1 ! EX, val = ACOLOR.a
lds TM1,fpul ! LS, FPUL = val
float fpul,F_Z1 ! FE, C1 = float(val)
extu.b CL2,TM1 ! EX, val = BCOLOR.a
lds TM1,fpul ! LS, FPUL = val
float fpul,F_Z2 ! FE, C2 = float(val)
fsub F_Z1, F_Z2 ! FE, C2 = C2 - C1
fmac F_T,F_Z2,F_Z1 ! FE, C = T * (C2 - C1) + C1
extu.b TM2,TM2 ! EX, tmp = (uint8)tmp
shll16 TM2 ! EX, tmp <<= 16
or TM2,CLO ! EX, OUTCOLOR.r |= tmp
ftrc F_Z1,fpul ! FE, FPUL = int(C)
sts fpul,TM2 ! LS, tmp = FPUL
extu.b TM2,TM2 ! EX, tmp = (uint8)tmp
shll16 TM2 ! EX, tmp <<= 16
shll8 TM2 ! EX, tmp <<= 8
or TM2,CLO ! EX, OUTCOLOR.a |= tmp
1:
! Store output
mov.l CLO,@-OUT ! LS, dst->color = OUTCOLOR
fmov.s F_V1,@-OUT ! LS, dst->v = v
fmov.s F_U1,@-OUT ! LS, dst->u = u
fmov.s F_W ,@-OUT ! LS, dst->w = invW
fmov.s F_Y1,@-OUT ! LS, dst->y = y
fmov.s F_X1,@-OUT ! LS, dst->x = x
fschg ! FE (swap to 64 bit FPU loads/stores)
rts ! CO, return after executing instruction in delay slot
pref @OUT ! LS, trigger store queue flush
.size _ClipEdge, .-_ClipEdge
.type _ClipEdge, %function
.align 4
_NEAR_CLIP_W:
.float 0
.global _NEAR_CLIP_W

611
misc/dreamcast/VertexDraw.S Normal file
View File

@@ -0,0 +1,611 @@
! r8 = STORE_QUEUE
! r9 = num vertices left
! r10 = PVR_CMD_VERTEX
! r11 = PVR_CMD_VERTEX_EOL
! r12 = ClipLine function
! r13 = cur vertex
! r14 = next vertex (prefetch)
#define R_VTX r10
#define R_EOL r11
#define REG_CMD_VTX r10
#define REG_CMD_EOL r11
#define REG_CLIPFUNC r12
.align 4
! Pushes a vertex to the store queue
! CLOBBERS: r2
! INPUTS: R (vertex), r8 (SQ global)
! OUTPUTS: r8 altered
.macro PushVertex R
! memcpy(r8, \R, 32)
mov.l @(0,\R), r2
mov.l r2, @(0,r8)
mov.l @(4,\R), r2
mov.l r2, @(4,r8)
mov.l @(8,\R), r2
mov.l r2, @(8,r8)
mov.l @(12,\R),r2
mov.l r2,@(12,r8)
mov.l @(16,\R),r2
mov.l r2,@(16,r8)
mov.l @(20,\R),r2
mov.l r2,@(20,r8)
mov.l @(24,\R),r2
mov.l r2,@(24,r8)
mov.l @(28,\R),r2
mov.l r2,@(28,r8)
pref @r8 ! LS, Trigger SQ
add #32,r8 ! EX, SQ += 32
.endm
! Transforms then pushes a vertex to the store queue
! note: Vertices are assumed as pre viewport transformed already
! CLOBBERS: r2, fr0, fr4, fr5
! INPUTS: R (vertex), r8 (SQ global)
! OUTPUTS: R, r8 altered
.macro TransformVertex R
! INVERSE W CALCULATION
add #28, \R ! EX, SRC += 28
fmov.s @\R,fr0 ! LS, fr0 = v->w
fmul fr0,fr0 ! FE, fr0 = fr0 * fr0
add #-28, \R ! EX, SRC -= 28
mov.l @\R+, r2 ! LS, tmp = SRC->flags, SRC += 4
mov.l r2,@r8 ! LS, DST->flags = tmp
fsrra fr0 ! FE, invW = 1 / sqrt(SRC->W * SRC->W)
add #4, r8 ! EX, DST += 4
! COPY U,V
mov.l @(12,\R),r2 ! LS, tmp = SRC->u
mov.l r2,@(12,r8) ! LS, DST->u = tmp
mov.l @(16,\R),r2 ! LS, tmp = SRC->v
mov.l r2,@(16,r8) ! LS, DST->v = tmp
! TRANSFORM X
fmov.s @\R,fr4 ! LS, fr4 = SRC->x
fmul fr0,fr4 ! FE, fr4 = invW * SRC->x
mov.l @(20,\R),r2 ! LS, tmp = SRC->bgra
mov.l r2,@(20,r8) ! LS, SRC->bgra = tmp
add #4, \R ! EX, SRC += 4
fmov.s fr4,@r8 ! LS, DST->x = fr4
! TRANSFORM Y
fmov.s @\R,fr4 ! LS, fr4 = SRC->y
add #8, r8 ! EX, DST += 8
fmul fr0,fr4 ! FE, fr4 = invW * SRC->y
fmov.s fr0,@r8 ! LS, DST->z = invW
add #-4, r8 ! EX, DST -= 4
add #-8, \R ! EX, src -= 8 (back to start of vertex)
fmov.s fr4,@r8 ! LS, DST->y = fr4
add #-8,r8 ! EX, DST -= 8 (back to start of vertex)
pref @r8 ! LS, Trigger SQ
add #32,r8 ! EX, SQ += 32
.endm
#define REG_CLIP1 r1
#define REG_CLIP2 r2
#define REG_V0 r4
#define REG_V1 r5
#define REG_V2 r6
#define REG_V3 r7
! r3 also matches out parameter for ClipLine
#define REG_TMP r3
#define TMP_SET_A \
mov r15, REG_TMP
#define TMP_SET_B \
mov r15, REG_TMP; add #32, REG_TMP
_Case_0_0_0_1:
! v0
! / |
! / |
! .....A....B...
! / |
! v3--v2---v1
sts pr,r13
TMP_SET_A
mov REG_V3, REG_CLIP1
mov REG_V0, REG_CLIP2
jsr @REG_CLIPFUNC
mov.l REG_CMD_EOL, @REG_TMP
TMP_SET_B
mov REG_V0, REG_CLIP1
mov REG_V1, REG_CLIP2
jsr @REG_CLIPFUNC
mov.l REG_CMD_VTX, @REG_TMP
TransformVertex REG_V0
TMP_SET_B
TransformVertex REG_TMP
TMP_SET_A
TransformVertex REG_TMP
lds r13,pr
rts
nop
_Case_0_0_1_0:
! v1
! / |
! / |
! ....A.....B...
! / |
! v0--v3---v2
sts pr,r13
TMP_SET_A
mov REG_V0, REG_CLIP1
mov REG_V1, REG_CLIP2
jsr @REG_CLIPFUNC
mov.l REG_CMD_VTX, @REG_TMP
TMP_SET_B
mov REG_V1, REG_CLIP1
mov REG_V2, REG_CLIP2
jsr @REG_CLIPFUNC
mov.l REG_CMD_EOL, @REG_TMP
TMP_SET_A
TransformVertex REG_TMP
TransformVertex REG_V1
TMP_SET_B
TransformVertex REG_TMP
lds r13,pr
rts
nop
_Case_0_1_0_0:
! v2
! / |
! / |
! ....A.....B...
! / |
! v1--v0---v3
sts pr,r13
TMP_SET_A
mov REG_V1, REG_CLIP1
mov REG_V2, REG_CLIP2
jsr @REG_CLIPFUNC
mov.l REG_CMD_VTX, @REG_TMP
TMP_SET_B
mov REG_V2, REG_CLIP1
mov REG_V3, REG_CLIP2
jsr @REG_CLIPFUNC
mov.l REG_CMD_EOL, @REG_TMP
TMP_SET_A
TransformVertex REG_TMP
TransformVertex REG_V2
TMP_SET_B
TransformVertex REG_TMP
lds r13,pr
rts
nop
_Case_1_0_0_0:
! v3
! / |
! / |
! ....A.....B...
! / |
! v2--v1---v0
sts pr,r13
TMP_SET_A
mov REG_V2, REG_CLIP1
mov REG_V3, REG_CLIP2
jsr @REG_CLIPFUNC
mov.l REG_CMD_VTX, @REG_TMP
TMP_SET_B
mov REG_V3, REG_CLIP1
mov REG_V0, REG_CLIP2
jsr @REG_CLIPFUNC
mov.l REG_CMD_VTX, @REG_TMP
TMP_SET_B
TransformVertex REG_TMP
TMP_SET_A
TransformVertex REG_TMP
TransformVertex REG_V3
lds r13,pr
rts
nop
_Case_0_0_1_1:
! v0-----------v1
! \ |
! ....B..........A...
! \ |
! v3-----v2
sts pr,r13
TMP_SET_A
mov REG_V1, REG_CLIP1
mov REG_V2, REG_CLIP2
jsr @REG_CLIPFUNC
mov.l REG_CMD_VTX, @REG_TMP
TMP_SET_B
mov REG_V3, REG_CLIP1
mov REG_V0, REG_CLIP2
jsr @REG_CLIPFUNC
mov.l REG_CMD_EOL, @REG_TMP
TransformVertex REG_V1
TMP_SET_A
TransformVertex REG_TMP
TransformVertex REG_V0
TMP_SET_B
TransformVertex REG_TMP
lds r13,pr
rts
nop
_Case_1_0_0_1:
! v3-----------v0
! \ |
! ....B..........A...
! \ |
! v2-----v1
sts pr,r13
TMP_SET_A
mov REG_V0, REG_CLIP1
mov REG_V1, REG_CLIP2
jsr @REG_CLIPFUNC
mov.l REG_CMD_VTX, @REG_TMP
TMP_SET_B
mov REG_V2, REG_CLIP1
mov REG_V3, REG_CLIP2
jsr @REG_CLIPFUNC
mov.l REG_CMD_VTX, @REG_TMP
TMP_SET_A
TransformVertex REG_TMP
TMP_SET_B
TransformVertex REG_TMP
TransformVertex REG_V0
TransformVertex REG_V3
lds r13,pr
rts
nop
_Case_0_1_1_0:
! v1-----------v2
! \ |
! ....B..........A...
! \ |
! v0-----v3
sts pr,r13
TMP_SET_A
mov REG_V2, REG_CLIP1
mov REG_V3, REG_CLIP2
jsr @REG_CLIPFUNC
mov.l REG_CMD_EOL, @REG_TMP
TMP_SET_B
mov REG_V0, REG_CLIP1
mov REG_V1, REG_CLIP2
jsr @REG_CLIPFUNC
mov.l REG_CMD_VTX, @REG_TMP
TransformVertex REG_V1
TransformVertex REG_V2
TMP_SET_B
TransformVertex REG_TMP
TMP_SET_A
TransformVertex REG_TMP
lds r13,pr
rts
nop
_Case_1_1_0_0:
! v2-----------v3
! \ |
! ....B..........A...
! \ |
! v1-----v0
sts pr,r13
TMP_SET_A
mov REG_V3, REG_CLIP1
mov REG_V0, REG_CLIP2
jsr @REG_CLIPFUNC
mov.l REG_CMD_VTX, @REG_TMP
TMP_SET_B
mov REG_V1, REG_CLIP1
mov REG_V2, REG_CLIP2
jsr @REG_CLIPFUNC
mov.l REG_CMD_VTX, @REG_TMP
TMP_SET_B
TransformVertex REG_TMP
TransformVertex REG_V2
TMP_SET_A
TransformVertex REG_TMP
TransformVertex REG_V3
lds r13,pr
rts
nop
_Case_0_1_1_1:
! --v1--
! v0-- --v2
! \ |
! .....B.....A...
! \ |
! v3
! v1,v2,v0 v2,v0,A v0,A,B
sts pr,r13
TMP_SET_A
mov REG_V2, REG_CLIP1
mov REG_V3, REG_CLIP2
jsr @REG_CLIPFUNC
mov.l REG_CMD_VTX, @REG_TMP
TMP_SET_B
mov REG_V3, REG_CLIP1
mov REG_V0, REG_CLIP2
jsr @REG_CLIPFUNC
mov.l REG_CMD_EOL, @REG_TMP
TransformVertex REG_V1
TransformVertex REG_V2
TransformVertex REG_V0
TMP_SET_A
TransformVertex REG_TMP
TMP_SET_B
TransformVertex REG_TMP
lds r13,pr
rts
nop
_Case_1_0_1_1:
! --v0--
! v3-- --v1
! \ |
! .....B.....A...
! \ |
! v2
! v0,v1,v3 v1,v3,A v3,A,B
sts pr,r13
TMP_SET_A
mov REG_V1, REG_CLIP1
mov REG_V2, REG_CLIP2
jsr @REG_CLIPFUNC
mov.l REG_CMD_VTX, @REG_TMP
TMP_SET_B
mov REG_V2, REG_CLIP1
mov REG_V3, REG_CLIP2
jsr @REG_CLIPFUNC
mov.l REG_CMD_EOL, @REG_TMP
mov.l REG_CMD_VTX, @REG_V3
TransformVertex REG_V0
TransformVertex REG_V1
TransformVertex REG_V3
TMP_SET_A
TransformVertex REG_TMP
TMP_SET_B
TransformVertex REG_TMP
lds r13,pr
rts
nop
_Case_1_1_0_1:
! --v3--
! v2-- --v0
! \ |
! .....B.....A...
! \ |
! v1
! v3,v0,v2 v0,v2,A v2,A,B
sts pr,r13
TMP_SET_A
mov REG_V0, REG_CLIP1
mov REG_V1, REG_CLIP2
jsr @REG_CLIPFUNC
mov.l REG_CMD_VTX, @REG_TMP
TMP_SET_B
mov REG_V1, REG_CLIP1
mov REG_V2, REG_CLIP2
jsr @REG_CLIPFUNC
mov.l REG_CMD_EOL, @REG_TMP
mov.l REG_CMD_VTX, @REG_V3
TransformVertex REG_V3
TransformVertex REG_V0
TransformVertex REG_V2
TMP_SET_A
TransformVertex REG_TMP
TMP_SET_B
TransformVertex REG_TMP
lds r13,pr
rts
nop
_Case_1_1_1_0:
! --v2--
! v1-- --v3
! \ |
! .....B.....A...
! \ |
! v0
! v2,v3,v1 v3,v1,A v1,A,B
sts pr,r13
TMP_SET_A
mov REG_V3, REG_CLIP1
mov REG_V0, REG_CLIP2
jsr @REG_CLIPFUNC
mov.l REG_CMD_VTX, @REG_TMP
TMP_SET_B
mov REG_V0, REG_CLIP1
mov REG_V1, REG_CLIP2
jsr @REG_CLIPFUNC
mov.l REG_CMD_EOL, @REG_TMP
mov.l REG_CMD_VTX, @REG_V3
TransformVertex REG_V2
TransformVertex REG_V3
TransformVertex REG_V1
TMP_SET_A
TransformVertex REG_TMP
TMP_SET_B
TransformVertex REG_TMP
lds r13,pr
rts
nop
_Case_1_1_1_1:
! Triangle strip: {1,2,0} {2,0,3}
TransformVertex REG_V1
TransformVertex REG_V2
TransformVertex REG_V0
TransformVertex REG_V3
rts
nop
.global _ProcessVertexList
.align 4
_ProcessVertexList:
! STORE CPU REGISTERS
mov.l r8,@-r15
mov.l r9,@-r15
mov.l r10,@-r15
mov.l r11,@-r15
mov.l r12,@-r15
mov.l r13,@-r15
mov.l r14,@-r15
sts.l pr,@-r15
! REGISTER SETUP
mov r4,r14
mov r4,r13
mov.l .CLIPFUNC,r12
mov.l .PVR_EOL, r11
mov.l .PVR_VTX, r10
mov r5,r9
mov r6,r8
bra SUBMIT_LOOP
add #-64,r15
! Submits a PVR2 TA GPU command
DO_CMD:
PushVertex REG_V0
bra NEXT_ITER
nop
SUBMIT_LOOP:
mov.l @r13,r0 ! FLAGS = CUR->flags
add #32,r14 ! NEXT += sizeof(Vertex)
mov r0,r2 ! TYPE = FLAGS
and r11,r2 ! TYPE = FLAGS & 0xF000000 (reuse PVR_CMD_VERTEX_EOL as type mask)
! Check for PVR_CMD_VERTEX
cmp/eq r10,r2 ! T = r2 == PVR_CMD_VERTEX
bt.s NEXT_ITER ! if (T) goto NEXT_ITER
pref @r14 ! prefetch(NEXT) -- always executed
! Check for non PVR_CMD_VERTEX_EOL
cmp/eq r11,r2 ! T = r2 == PVR_CMD_VERTEX_EOL
bf.s DO_CMD ! if (!T) goto DO_CMD
! PVR_CMD_VERTEX_EOL case
extu.b r0,r1 ! EX, MASK = FLAGS & 0xFF (branch delay slot)
! Prepare and then jump to quad drawing function, based on quad clipflags
mova .CASES,r0 ! LS, r0 = CASES
mov r13,r7 ! MT, r7 = v3
shll2 r1 ! EX, MASK <<= 2
mov r13,r6 ! MT, r6 = v3
mov.l @(r0,r1),r2 ! LS, r1 = CASES[MASK]
mov r13,r5 ! MT, r5 = v3
add #-32,r6 ! EX, r6 = v3 - 1 (v2)
mov r13,r4 ! MT, r4 = v3
add #-64,r5 ! EX, r5 = v3 - 2 (v1)
jsr @r2 ! C0, jump CASES[MASK]
add #-96,r4 ! EX, r4 = v3 - 3 (v0) (branch delay slot)
NEXT_ITER:
dt r9 ! NUM--; T = NUM == 0
bf.s SUBMIT_LOOP
mov r14,r13 ! CUR = NEXT
add #64,r15
! RESTORE CPU REGISTERS
lds.l @r15+,pr
mov.l @r15+,r14
mov.l @r15+,r13
mov.l @r15+,r12
mov.l @r15+,r11
mov.l @r15+,r10
mov.l @r15+,r9
rts
mov.l @r15+,r8
.size _ProcessVertexList, .-_ProcessVertexList
.type _ProcessVertexList, %function
.align 4
.VP_1:
.long _vp
.PVR_VTX:
.long 0xE0000000
.PVR_EOL:
.long 0xF0000000
.CLIPFUNC:
.long _ClipLine
BUGGY_CASE:
rts
nop
! CASES table holds the functions to transfer a quad,
! based on the visibility clipflags of the 4 vertices
! e.g. CASES[15] = V0_VIS | V1_VIS | V2_VIS | V3_VIS (all 4 visible)
.CASES:
.long BUGGY_CASE ! Should never happen
.long _Case_0_0_0_1
.long _Case_0_0_1_0
.long _Case_0_0_1_1
.long _Case_0_1_0_0
.long BUGGY_CASE ! V0_VIS | V2_VIS, Should never happen
.long _Case_0_1_1_0
.long _Case_0_1_1_1
.long _Case_1_0_0_0
.long _Case_1_0_0_1
.long BUGGY_CASE ! V1_VIS | V3_VIS, Should never happen
.long _Case_1_0_1_1
.long _Case_1_1_0_0
.long _Case_1_1_0_1
.long _Case_1_1_1_0
.long _Case_1_1_1_1

View File

@@ -0,0 +1,230 @@
#define FLG r0 // clip flags
#define TMP r1 // temp
#define VTX r2 // PVR_CMD_VERTEX
#define EOS r3 // PVR_CMD_VERTEX_EOL
#define SRC r4 // src pointer ARG
#define DST r5 // dst pointer ARG
#define CNT r6 // quads count ARG
#define PFT r7 // prefetch address
#define ZERO fr0 // 0.0
#define F_U fr1 // vertex.u
#define F_V fr2 // vertex.v
#define F_C fr3 // vertex.colour
#define F_X fr4 // vertex.x
#define F_Y fr5 // vertex.y
#define F_Z fr6 // vertex.z
#define F_W fr7 // vertex.w
#define XYZW fv4 // vertex.xyzw
! =========================================================
! ========================= TRANSFORM SETUP ===============
! =========================================================
.macro TransformSetup
mov SRC, PFT ! MT, pft = src
add #-32, DST ! EX, dst -= sizeof(VERTEX)
mov #0xE0, VTX ! EX, VTX = 0x00 00 00 E0
pref @PFT ! LS, PREFETCH pft (first vertex)
shll16 VTX ! EX, VTX = 0x00 E0 00 00
shll8 VTX ! EX, VTX = 0xE0 00 00 00 (PVR_CMD_VERTEX)
mov #0xF0, EOS ! EX, EOS = 0x00 00 00 F0
shll16 EOS ! EX, EOS = 0x00 F0 00 00
shll8 EOS ! EX, EOS = 0xF0 00 00 00 (PVR_CMD_VERTEX_EOL)
fldi0 ZERO ! LS, fr0 = 0.0
.endm
.macro TransformEnd
add #32, DST ! EX, DST += sizeof(VERTEX)
rts ! CO, return after executing instruction in delay slot
mov DST, r0 ! MT, r0 = DST
.endm
! =========================================================
! ========================= VERTEX LOADING ================
! =========================================================
.macro LoadColouredVertex
! LOAD XYZ
fmov @SRC+, F_X ! LS, X = src->x
fmov @SRC+, F_Y ! LS, Y = src->y
fmov @SRC+, F_Z ! LS, Z = src->z
fldi1 F_W ! LS, W = 1.0
! PREPARE NEXT VERTEX
add #16, PFT ! EX, pft += VERTEX_STRIDE
pref @PFT ! LS, PREFETCH pft (next vertex)
add #64, DST ! EX, dst += 2 * sizeof(VERTEX)
! TRANSFORM VERTEX
ftrv xmtrx, XYZW ! FE, TRANSFORM(XYZW)
! LOAD ATTRIBUTES
fmov @SRC+, F_C ! LS, C = src->color
.endm
.macro LoadTexturedVertex
! LOAD XYZ
fmov @SRC+, F_X ! LS, X = src->x
fmov @SRC+, F_Y ! LS, Y = src->y
fmov @SRC+, F_Z ! LS, Z = src->z
fldi1 F_W ! LS, W = 1.0
! PREPARE NEXT VERTEX
add #24, PFT ! EX, pft += VERTEX_STRIDE
pref @PFT ! LS, PREFETCH pft (next vertex)
add #64, DST ! EX, dst += 2 * sizeof(VERTEX)
! TRANSFORM VERTEX
ftrv xmtrx, XYZW ! FE, TRANSFORM(XYZW)
! LOAD ATTRIBUTES
fmov @SRC+, F_C ! LS, C = src->color
fmov @SRC+, F_U ! LS, U = src->u
fmov @SRC+, F_V ! LS, V = src->v
.endm
! =========================================================
! ========================= VERTEX OUTPUT =================
! =========================================================
! To take advantage of SH4 dual instruction processing,
! clipflag calculation and vertex output are interleaved
.macro ProcessVertex1
fmov.s F_Z,@-DST ! LS, dst->z = Z
fmov.s F_C,@-DST ! LS, dst->c = C
fmov.s F_V,@-DST ! LS, dst->v = V
fcmp/gt ZERO, F_Z ! FE, T = Z > 0
fmov.s F_U,@-DST ! LS, dst->u = U
movt FLG ! EX, CLIPFLAGS = T
fmov.s F_W,@-DST ! LS, dst->w = W
fmov.s F_Y,@-DST ! LS, dst->y = Y
fmov.s F_X,@-DST ! LS, dst->x = X
mov.l VTX,@-DST ! LS, dst->flags = PVR_CMD_VERTEX
.endm
.macro ProcessVertex2
fmov.s F_Z,@-DST ! LS, dst->z = Z
fmov.s F_C,@-DST ! LS, dst->c = C
fmov.s F_V,@-DST ! LS, dst->v = V
fcmp/gt ZERO,F_Z ! FE, T = Z > 0
fmov.s F_U,@-DST ! LS, dst->u = U
movt TMP ! EX, tmp = T
fmov.s F_W,@-DST ! LS, dst->w = W
add TMP,TMP ! EX, tmp = tmp + tmp
fmov.s F_Y,@-DST ! LS, dst->y = Y
or TMP,FLG ! EX, CLIPFLAGS |= tmp (T << 1)
fmov.s F_X,@-DST ! LS, dst->x = X
mov.l VTX,@-DST ! LS, dst->flags = PVR_CMD_VERTEX
.endm
.macro ProcessVertex3
fmov.s F_Z,@-DST ! LS, dst->z = Z
fmov.s F_C,@-DST ! LS, dst->c = C
fmov.s F_V,@-DST ! LS, dst->v = V
fcmp/gt ZERO, F_Z ! FE, T = Z > 0
fmov.s F_U,@-DST ! LS, dst->u = U
movt TMP ! EX, tmp = T
fmov.s F_W,@-DST ! LS, dst->w = W
fmov.s F_Y,@-DST ! LS, dst->y = Y
shll2 TMP ! EX, tmp = tmp << 2
fmov.s F_X,@-DST ! LS, dst->x = X
or TMP,FLG ! EX, CLIPFLAGS |= tmp (T << 2)
mov.l VTX,@-DST ! LS, dst->flags = PVR_CMD_VERTEX
.endm
.macro ProcessVertex4
fmov.s F_Z,@-DST ! LS, dst->z = Z
or EOS,FLG ! EX, CLIPFLAGS |= PVR_CMD_VERTEX_EOL
fmov.s F_C,@-DST ! LS, dst->c = C
fmov.s F_V,@-DST ! LS, dst->v = V
fcmp/gt ZERO, F_Z ! FE, T = Z > 0
fmov.s F_U,@-DST ! LS, dst->u = U
movt TMP ! EX, tmp = T
fmov.s F_W,@-DST ! LS, dst->w = W
shll2 TMP ! EX, tmp = tmp << 2
fmov.s F_Y,@-DST ! LS, dst->y = Y
add TMP,TMP ! EX, tmp = (tmp << 2) + (tmp << 2) (T << 3)
fmov.s F_X,@-DST ! LS, dst->x = X
or TMP,FLG ! EX, CLIPFLAGS |= tmp (T << 3)
mov.l FLG,@-DST ! LS, dst->flags = PVR_CMD_VERTEX_EOL | CLIPFLAGS
.endm
! =========================================================
! ==================== TEXTURED VERTEX TRANSFORM ==========
! =========================================================
.global _DrawTexturedQuads
.align 4
_DrawTexturedQuads:
! Setup
TransformSetup
.T_TRANSFORM_QUAD:
LoadTexturedVertex
ProcessVertex1
LoadTexturedVertex
ProcessVertex2
LoadTexturedVertex
ProcessVertex3
LoadTexturedVertex
ProcessVertex4
! CLIPFLAGS TESTING
and #15,FLG
cmp/eq #0,FLG ! T = CLIPFLAGS == 0 (all points invisible)
bf/s .T_LOOP_END ! if !T goto LOOP_END
nop
! No points visible case
add #-128, DST ! DST -= 4 * sizeof(VERTEX), move back to prior quad, so that this invisible quad gets overwritten in next iteration
.T_LOOP_END:
dt CNT ! count--; T = count == 0
bf .T_TRANSFORM_QUAD ! if !T then goto T_TRANSFORM_QUAD
nop
TransformEnd
.size _DrawTexturedQuads, .-_DrawTexturedQuads
.type _DrawTexturedQuads, %function
! =========================================================
! ==================== COLOURED VERTEX TRANSFORM ==========
! =========================================================
.global _DrawColouredQuads
.align 4
_DrawColouredQuads:
! Setup
fldi0 F_U ! U = 0
fldi0 F_V ! V = 0
TransformSetup
.C_TRANSFORM_QUAD:
LoadColouredVertex
ProcessVertex1
LoadColouredVertex
ProcessVertex2
LoadColouredVertex
ProcessVertex3
LoadColouredVertex
ProcessVertex4
! CLIPFLAGS TESTING
and #15,FLG
cmp/eq #0,FLG ! T = CLIPFLAGS == 0 (all points invisible)
bf/s .C_LOOP_END ! if !T goto LOOP_END
nop
! No points visible case
add #-128, DST ! dst -= 4 * sizeof(VERTEX), move back to 1 vertex before start of quad
.C_LOOP_END:
dt CNT ! count--; T = count == 0
bf .C_TRANSFORM_QUAD ! if !T then goto TRANSFORM_QUAD
nop
TransformEnd
.size _DrawColouredQuads, .-_DrawColouredQuads
.type _DrawColouredQuads, %function

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

3
misc/dreamcast/ip.txt Normal file
View File

@@ -0,0 +1,3 @@
Version : V1.360
SW Maker Name : ClassiCube team
Game Title : ClassiCube

View File

@@ -0,0 +1,9 @@
The dreamcast build requires an initial bootstrap program (Initial Program) named IP.bin
To generate a custom IP.bin, compile https://github.com/Dreamcast-Projects/makeip
Then run: makeip ip.txt IP.BIN -l boot_logo.png
---
For more details about IP.bin, see https://mc.pp.se/dc/ip.bin.html

View File

@@ -0,0 +1,31 @@
=========================================================
======================== PROCESSOR INFO =================
=========================================================
The SH4 can dual issue (i.e. parallel execution) two instructions
as long as the groups of the two instructions are different:
* LS - most ALU and FPU register load/stores
* EX - most ALU arithmetic instructions
* MT - TST, CMP, NOP, MOV Rm,Rn (NOTE: Can execute in parallel with other MT)
* FE - most FPU arithmetic instructions
* CO - other instructions (NOTE: Cannot never execute in parallel)
The following general aspects of instructions are important to note per the SH4 manual:
* Issue rate: Interval between the issue of an instruction and that of the next instruction
* Latency: Interval between the issue of an instruction and the generation of its result (completion)
* Latency is also the interval between the execution of two instructions with an interdependent relationship.
(although different cases may either increase or decrease Latency)
=========================================================
======================== REGISTER USAGES ================
=========================================================
SH4 C ABI:
- R0 to R3 are return values (can be overwritten)
- R4 to R7 are input arguments (can be overwritten)
- R8 to R13 are non-volatile (must be restored at end)
- R14 is the frame pointer (must be restored at end)
- R15 is the stack pointer (must be restored at end)
- FR0 to FR3 are return values (can be overwritten)
- FR4 to FR11 are input arguments (can be overwritten)
- FR12 to FR13 are non-volatile (must be restored at end)

60
misc/ds/Makefile Normal file
View File

@@ -0,0 +1,60 @@
# SPDX-License-Identifier: CC0-1.0
#
# SPDX-FileContributor: Antonio Niño Díaz, 2023
export BLOCKSDS ?= /opt/wonderful/thirdparty/blocksds/core
export BLOCKSDSEXT ?= /opt/wonderful/thirdparty/blocksds/external
GAME_TITLE := ClassiCube
GAME_SUBTITLE := Built with BlocksDS
GAME_AUTHOR := ClassiCube team
GAME_ICON := misc/ds/icon.bmp
GAME_FULL_TITLE := $(GAME_TITLE);$(GAME_SUBTITLE);$(GAME_AUTHOR)
# DLDI and internal SD slot of DSi
# --------------------------------
# Root folder of the SD image
SDROOT := sdroot
# Name of the generated image it "DSi-1.sd" for no$gba in DSi mode
SDIMAGE := image.bin
# Build artfacts
# --------------
ifdef BUILD_DSI
BUILDDIR := build/dsi
ROM := ClassiCube-dsi.nds
else
BUILDDIR := build/nds
ROM := ClassiCube-nds.nds
endif
# Targets
# -------
.PHONY: all clean arm9 arm7 dldipatch sdimage
all: $(ROM)
clean:
$(MAKE) -f Makefile.arm9 clean --no-print-directory
$(MAKE) -f Makefile.arm7 clean --no-print-directory
$(RM) $(ROM) $(BUILDDIR) $(SDIMAGE)
arm9:
$(MAKE) -f misc/ds/Makefile.arm9 --no-print-directory
arm7:
$(MAKE) -f misc/ds/Makefile.arm7 --no-print-directory
$(ROM): arm9 arm7
$(BLOCKSDS)/tools/ndstool/ndstool -c $@ \
-7 $(BUILDDIR)/cc-arm7.elf -9 $(BUILDDIR)/cc-arm9.elf \
-b $(GAME_ICON) "$(GAME_FULL_TITLE)"
sdimage:
$(BLOCKSDS)/tools/mkfatimg/mkfatimg -t $(SDROOT) $(SDIMAGE)
dldipatch: $(ROM)
$(BLOCKSDS)/tools/dlditool/dlditool $(BLOCKSDS)/tools/dldi/r4tfv2.dldi $(ROM)

96
misc/ds/Makefile.arm7 Normal file
View File

@@ -0,0 +1,96 @@
# SPDX-License-Identifier: CC0-1.0
#
# SPDX-FileContributor: Antonio Niño Díaz, 2023
export BLOCKSDS ?= /opt/wonderful/thirdparty/blocksds/core
export BLOCKSDSEXT ?= /opt/wonderful/thirdparty/blocksds/external
export WONDERFUL_TOOLCHAIN ?= /opt/wonderful
ARM_NONE_EABI_PATH ?= $(WONDERFUL_TOOLCHAIN)/toolchain/gcc-arm-none-eabi/bin/
SOURCEDIRS := misc/ds
INCLUDEDIRS :=
DSIWIFI := third_party/dsiwifi
ifdef BUILD_DSI
SOURCEDIRS += $(DSIWIFI)/arm_iop/source $(DSIWIFI)/common/source $(DSIWIFI)/arm_iop/source/ath $(DSIWIFI)/arm_iop/source/crypto $(DSIWIFI)/arm_iop/source/ieee
INCLUDEDIRS += $(DSIWIFI)/arm_iop/source $(DSIWIFI)/arm_iop/include $(DSIWIFI)/common/source $(DSIWIFI)/include $(DSIWIFI)/include/lwip
BUILDDIR := build/dsi
LIBS := -lc -lnds7
LIBDIRS := $(BLOCKSDS)/libs/libnds
else
BUILDDIR := build/nds
LIBS := -lc -lnds7 -ldswifi7
LIBDIRS := $(BLOCKSDS)/libs/libnds $(BLOCKSDS)/libs/dswifi
endif
NAME := cc-arm7
ELF := $(BUILDDIR)/$(NAME).elf
MAP := $(BUILDDIR)/$(NAME).map
PREFIX := $(ARM_NONE_EABI_PATH)arm-none-eabi-
CC := $(PREFIX)gcc
CXX := $(PREFIX)g++
LD := $(CC)
DEFINES := -D__NDS__ -DARM7
ARCH := -mcpu=arm7tdmi -mtune=arm7tdmi
WARNFLAGS := -Wall
# Source files
# ------------
S_FILES := $(foreach dir,$(SOURCEDIRS),$(wildcard $(dir)/*.s))
C_FILES := $(foreach dir,$(SOURCEDIRS),$(wildcard $(dir)/*.c))
INCLUDEFLAGS := $(foreach path,$(INCLUDEDIRS),-I$(path)) \
$(foreach path,$(LIBDIRS),-I$(path)/include)
LIBDIRSFLAGS := $(foreach path,$(LIBDIRS),-L$(path)/lib)
ASFLAGS += -x assembler-with-cpp $(DEFINES) $(ARCH) \
-mthumb -mthumb-interwork $(INCLUDEFLAGS) \
-ffunction-sections -fdata-sections
CFLAGS += -std=gnu11 $(WARNFLAGS) $(DEFINES) $(ARCH) \
-mthumb -mthumb-interwork $(INCLUDEFLAGS) -O2 \
-ffunction-sections -fdata-sections \
-fomit-frame-pointer
LDFLAGS := -mthumb -mthumb-interwork $(LIBDIRSFLAGS) \
-Wl,-Map,$(MAP) -Wl,--gc-sections -nostdlib \
-T$(BLOCKSDS)/sys/crts/ds_arm7.ld \
-Wl,--no-warn-rwx-segments \
-Wl,--start-group $(LIBS) -lgcc -Wl,--end-group
# Intermediate build files
# ------------------------
OBJS := $(addprefix $(BUILDDIR)/, $(notdir $(C_FILES:%.c=%.o) $(S_FILES:%.s=%.o)))
DEPS := $(OBJS:.o=.d)
export VPATH := $(SOURCEDIRS)
# Targets
# -------
.PHONY: all clean
all: $(BUILDDIR) $(ELF)
$(BUILDDIR):
mkdir -p $(BUILDDIR)
$(ELF): $(OBJS)
$(LD) -o $@ $(OBJS) $(BLOCKSDS)/sys/crts/ds_arm7_crt0.o $(LDFLAGS)
clean:
rm $(ELF) $(MAP) $(OBJS)
# Rules
# -----
$(BUILDDIR)/%.o : %.s
$(CC) $(ASFLAGS) -MMD -MP -c -o $@ $<
$(BUILDDIR)/%.o : %.c
$(CC) $(CFLAGS) -MMD -MP -c -o $@ $<
# Include dependency files if they exist
# --------------------------------------
-include $(DEPS)

106
misc/ds/Makefile.arm9 Normal file
View File

@@ -0,0 +1,106 @@
# SPDX-License-Identifier: CC0-1.0
#
# SPDX-FileContributor: Antonio Niño Díaz, 2023
export BLOCKSDS ?= /opt/wonderful/thirdparty/blocksds/core
export BLOCKSDSEXT ?= /opt/wonderful/thirdparty/blocksds/external
export WONDERFUL_TOOLCHAIN ?= /opt/wonderful
ARM_NONE_EABI_PATH ?= $(WONDERFUL_TOOLCHAIN)/toolchain/gcc-arm-none-eabi/bin/
SOURCEDIRS := src
INCLUDEDIRS :=
DSIWIFI := third_party/dsiwifi
ifdef BUILD_DSI
SOURCEDIRS += $(DSIWIFI)/arm_host/source $(DSIWIFI)/common/source $(DSIWIFI)/arm_host/source/nds $(DSIWIFI)/arm_host/source/lwip $(DSIWIFI)/arm_host/source/lwip/ipv4 $(DSIWIFI)/arm_host/source/lwip/ipv6 $(DSIWIFI)/arm_host/source/lwip/netif $(DSIWIFI)/arm_host/source/lwip/netif/ppp $(DSIWIFI)/arm_host/source/lwip/api
INCLUDEDIRS += $(DSIWIFI)/arm_host/include $(DSIWIFI)/common/source $(DSIWIFI)/include $(DSIWIFI)/include/lwip
BUILDDIR := build/dsi
DEFINES := -DPLAT_NDS -DBUILD_DSI
LIBS := -lnds9 -lc
LIBDIRS := $(BLOCKSDS)/libs/libnds
else
BUILDDIR := build/nds
DEFINES := -DPLAT_NDS
LIBS := -ldswifi9 -lnds9 -lc
LIBDIRS := $(BLOCKSDS)/libs/dswifi $(BLOCKSDS)/libs/libnds
endif
NAME := cc-arm9
ELF := $(BUILDDIR)/$(NAME).elf
MAP := $(BUILDDIR)/$(NAME).map
# Tools
# -----
PREFIX := $(ARM_NONE_EABI_PATH)arm-none-eabi-
CC := $(PREFIX)gcc
CXX := $(PREFIX)g++
LD := $(PREFIX)gcc
# Source files
# ------------
S_FILES := $(foreach dir,$(SOURCEDIRS),$(wildcard $(dir)/*.s))
C_FILES := $(foreach dir,$(SOURCEDIRS),$(wildcard $(dir)/*.c))
# Compiler and linker flags
# -------------------------
ARCH := -mthumb -mcpu=arm946e-s+nofp
SPECS := $(BLOCKSDS)/sys/crts/ds_arm9.specs
WARNFLAGS := -Wall
INCLUDEFLAGS := $(foreach path,$(INCLUDEDIRS),-I$(path)) \
$(foreach path,$(LIBDIRS),-I$(path)/include)
LIBDIRSFLAGS := $(foreach path,$(LIBDIRS),-L$(path)/lib)
ASFLAGS += -x assembler-with-cpp $(DEFINES) $(INCLUDEFLAGS) \
$(ARCH) -ffunction-sections -fdata-sections \
-specs=$(SPECS)
CFLAGS += -std=gnu17 $(WARNFLAGS) $(DEFINES) $(INCLUDEFLAGS) \
$(ARCH) -O2 -ffunction-sections -fdata-sections \
-specs=$(SPECS) -Wstack-usage=10000
LDFLAGS := $(ARCH) $(LIBDIRSFLAGS) -Wl,-Map,$(MAP) $(DEFINES) \
-Wl,--start-group $(LIBS) -Wl,--end-group -specs=$(SPECS)
# Intermediate build files
# ------------------------
OBJS := $(addprefix $(BUILDDIR)/, $(notdir $(C_FILES:%.c=%.o) $(S_FILES:%.s=%.o)))
DEPS := $(OBJS:.o=.d)
export VPATH := $(SOURCEDIRS)
# Targets
# -------
.PHONY: all
all: $(BUILDDIR) $(ELF)
$(BUILDDIR):
mkdir -p $(BUILDDIR)
$(ELF): $(OBJS)
$(LD) -o $@ $(OBJS) $(LDFLAGS)
clean:
rm $(ELF) $(MAP) $(OBJS)
rm -rf $(BUILDDIR)
# Rules
# -----
$(BUILDDIR)/%.o : %.s
$(CC) $(ASFLAGS) -MMD -MP -c -o $@ $<
$(BUILDDIR)/%.o : %.c
$(CC) $(CFLAGS) -MMD -MP -c -o $@ $<
$(BUILDDIR)/%.arm.o : %.arm.c
$(CC) $(CFLAGS) -MMD -MP -marm -mlong-calls -c -o $@ $<
# Include dependency files if they exist
# --------------------------------------
-include $(DEPS)

BIN
misc/ds/icon.bmp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

54
misc/ds/main_arm7.c Normal file
View File

@@ -0,0 +1,54 @@
// SPDX-License-Identifier: Zlib
//
// Copyright (C) 2005 Michael Noland (joat)
// Copyright (C) 2005 Jason Rogers (Dovoto)
// Copyright (C) 2005-2015 Dave Murphy (WinterMute)
// Copyright (C) 2023 Antonio Niño Díaz
// Default ARM7 core
#include <dswifi7.h>
#include <nds.h>
volatile bool exit_loop = false;
static void power_button_callback(void) {
exit_loop = true;
}
static void vblank_handler(void) {
inputGetAndSend();
Wifi_Update();
}
int main(int argc, char *argv[]) {
enableSound();
readUserSettings();
ledBlink(0);
touchInit();
irqInit();
irqSet(IRQ_VBLANK, vblank_handler);
fifoInit();
installWifiFIFO();
installSoundFIFO();
installSystemFIFO();
setPowerButtonCB(power_button_callback);
initClockIRQTimer(3);
irqEnable(IRQ_VBLANK | IRQ_RTC);
while (!exit_loop)
{
const uint16_t key_mask = KEY_SELECT | KEY_START | KEY_L | KEY_R;
uint16_t keys_pressed = ~REG_KEYINPUT;
if ((keys_pressed & key_mask) == key_mask)
exit_loop = true;
swiWaitForVBlank();
}
return 0;
}

View File

@@ -0,0 +1,7 @@
#!/bin/sh
# Fallback Texture Pack and Audio
mkdir -p ${XDG_DATA_HOME}/ClassiCube/texpacks ${XDG_DATA_HOME}/ClassiCube/audio
test -f ${XDG_DATA_HOME}/ClassiCube/texpacks/classicube.zip || cp /app/share/classicube-texpack.zip ${XDG_DATA_HOME}/ClassiCube/texpacks/classicube.zip
test -f ${XDG_DATA_HOME}/ClassiCube/audio/classicube.zip || cp /app/share/classicube-audio.zip ${XDG_DATA_HOME}/ClassiCube/audio/classicube.zip
cd ${XDG_DATA_HOME}/ClassiCube && exec ClassiCube "$@"

View File

@@ -0,0 +1,136 @@
{
"id": "net.classicube.flatpak.client",
"runtime": "org.gnome.Platform",
"runtime-version": "48",
"sdk": "org.gnome.Sdk",
"command": "ClassiCubeLauncher",
"finish-args": [
"--socket=wayland",
"--socket=fallback-x11",
"--device=dri",
"--share=network",
"--share=ipc",
"--socket=pulseaudio"
],
"modules": [
{
"name": "SDL3",
"buildsystem": "cmake-ninja",
"builddir": true,
"sources": [
{
"type": "git",
"url": "https://github.com/libsdl-org/SDL.git",
"branch": "main"
}
],
"cleanup": [
"/bin/sdl3-config",
"/include",
"/lib/libSDL3.la",
"/lib/libSDL3main.a",
"/lib/libSDL3main.la",
"/lib/libSDL3_test.a",
"/lib/libSDL3_test.la",
"/lib/cmake",
"/share/aclocal",
"/lib/pkgconfig"
],
"modules": [
{
"name": "libdecor",
"buildsystem": "meson",
"config-opts": [
"-Ddemo=false"
],
"sources": [
{
"type": "git",
"url": "https://gitlab.freedesktop.org/libdecor/libdecor.git"
}
],
"cleanup": [
"/include",
"/lib/pkgconfig"
]
}
]
},
{
"name": "zenity-gtk3",
"buildsystem": "meson",
"build-commands": [
"mkdir -p ${FLATPAK_DEST}/share/icons/hicolor"
],
"sources": [
{
"type": "archive",
"url": "https://gitlab.gnome.org/GNOME/zenity/-/archive/3.44.4/zenity-3.44.4.tar.gz",
"sha256": "e7b334867d4e11053e6e52e5d51b7a983dc549f93cb3fda757e40309b16bc57b"
}
],
"post-install": [
"mv ${FLATPAK_DEST}/bin/zenity ${FLATPAK_DEST}/bin/zenity-gtk3"
]
},
{
"name": "zenity-gtk4",
"buildsystem": "meson",
"sources": [
{
"type": "archive",
"url": "https://gitlab.gnome.org/GNOME/zenity/-/archive/4.0.2/zenity-4.0.2.tar.gz",
"sha256": "fdbb74e882a6a56bb2f1a2381b81e08b06c627cc7e944edb71d107092c70dd80",
"x-checker-data": {
"type": "gnome",
"name": "zenity"
}
}
],
"post-install": [
"mv ${FLATPAK_DEST}/bin/zenity ${FLATPAK_DEST}/bin/zenity-gtk4"
]
},
{
"name": "ClassiCubeAssets",
"buildsystem": "simple",
"build-commands": [
"install -Dm644 classicube-texpack.zip ${FLATPAK_DEST}/share/classicube-texpack.zip",
"install -Dm644 classicube-audio.zip ${FLATPAK_DEST}/share/classicube-audio.zip"
],
"sources": [
{
"type": "file",
"dest-filename": "classicube-texpack.zip",
"url": "https://classicube.net/static/default.zip",
"sha256": "55eac12a9727d209b42694d07dfdca8d50349779ab77ffc11a31d2cb66b45635"
},
{
"type": "file",
"dest-filename": "classicube-audio.zip",
"url": "https://classicube.net/static/audio.zip",
"sha256": "13562a712d1cb1de3f36dd93a03245a377f201e7934d19c17de09202b410e04b"
}
]
},
{
"name": "ClassiCube",
"buildsystem": "simple",
"build-commands": [
"gcc -fno-math-errno src/*.c -o src/ClassiCube -rdynamic -lpthread -lGL -DCC_WIN_BACKEND=CC_WIN_BACKEND_SDL3 -DCC_GFX_BACKEND=CC_GFX_BACKEND_GL2 -DCC_BUILD_FLATPAK -L /app/lib -lSDL3",
"install -Dm755 src/ClassiCube -t ${FLATPAK_DEST}/bin",
"install -Dm755 misc/flatpak/ClassiCubeLauncher -t ${FLATPAK_DEST}/bin",
"install -Dm755 misc/flatpak/zenity-wrapper ${FLATPAK_DEST}/bin/zenity",
"install -Dm644 misc/flatpak/net.classicube.flatpak.client.svg ${FLATPAK_DEST}/share/icons/hicolor/scalable/apps/net.classicube.flatpak.client.svg",
"install -Dm644 misc/flatpak/net.classicube.flatpak.client.desktop ${FLATPAK_DEST}/share/applications/net.classicube.flatpak.client.desktop",
"install -Dm644 misc/flatpak/net.classicube.flatpak.client.metainfo.xml ${FLATPAK_DEST}/share/metainfo/net.classicube.flatpak.client.metainfo.xml"
],
"sources": [
{
"type": "git",
"url": "https://github.com/ClassiCube/ClassiCube.git"
}
]
}
]
}

View File

@@ -0,0 +1,56 @@
{
"id": "net.classicube.flatpak.client",
"runtime": "org.freedesktop.Platform",
"runtime-version": "24.08",
"sdk": "org.freedesktop.Sdk",
"command": "ClassiCubeLauncher",
"finish-args": [
"--socket=x11",
"--device=dri",
"--share=network",
"--share=ipc",
"--socket=pulseaudio"
],
"modules": [
{
"name": "ClassiCubeAssets",
"buildsystem": "simple",
"build-commands": [
"install -Dm644 classicube-texpack.zip ${FLATPAK_DEST}/share/classicube-texpack.zip",
"install -Dm644 classicube-audio.zip ${FLATPAK_DEST}/share/classicube-audio.zip"
],
"sources": [
{
"type": "file",
"dest-filename": "classicube-texpack.zip",
"url": "https://classicube.net/static/default.zip",
"sha256": "55eac12a9727d209b42694d07dfdca8d50349779ab77ffc11a31d2cb66b45635"
},
{
"type": "file",
"dest-filename": "classicube-audio.zip",
"url": "https://classicube.net/static/audio.zip",
"sha256": "13562a712d1cb1de3f36dd93a03245a377f201e7934d19c17de09202b410e04b"
}
]
},
{
"name": "ClassiCube",
"buildsystem": "simple",
"build-commands": [
"gcc -fno-math-errno src/*.c -o src/ClassiCube -O1 -DCC_BUILD_FLATPAK -DCC_GFX_BACKEND=CC_GFX_BACKEND_GL2 -rdynamic -lm -lpthread -lX11 -lXi -lGL -ldl",
"install -Dm755 src/ClassiCube -t ${FLATPAK_DEST}/bin",
"install -Dm755 misc/flatpak/ClassiCubeLauncher -t ${FLATPAK_DEST}/bin",
"install -Dm644 misc/flatpak/net.classicube.flatpak.client.svg ${FLATPAK_DEST}/share/icons/hicolor/scalable/apps/net.classicube.flatpak.client.svg",
"install -Dm644 misc/flatpak/net.classicube.flatpak.client.desktop ${FLATPAK_DEST}/share/applications/net.classicube.flatpak.client.desktop",
"install -Dm644 misc/flatpak/net.classicube.flatpak.client.metainfo.xml ${FLATPAK_DEST}/share/metainfo/net.classicube.flatpak.client.metainfo.xml"
],
"sources": [
{
"type": "git",
"url": "https://github.com/ClassiCube/ClassiCube.git"
}
]
}
]
}

View File

@@ -0,0 +1,10 @@
[Desktop Entry]
Name=ClassiCube
Exec=ClassiCubeLauncher
Comment=Sandbox building-block game
Type=Application
Icon=net.classicube.flatpak.client
Categories=Game;ActionGame;
Terminal=false
MimeType=x-scheme-handler/mc;
StartupWMClass=net.classicube.flatpak.client

View File

@@ -0,0 +1,133 @@
<?xml version='1.0' encoding='utf-8'?>
<component type="desktop-application">
<id>net.classicube.flatpak.client</id>
<name>ClassiCube</name>
<summary>Sandbox building-block game</summary>
<developer id="net.classicube">
<name>The ClassiCube Project</name>
</developer>
<metadata_license>CC0-1.0</metadata_license>
<project_license>BSD-3-Clause</project_license>
<description>
<p>ClassiCube brings you back to the days of 2009 where one block game ruled them all, it includes such features as:</p>
<ul>
<li>Loads of blocks and items to choose from</li>
<li>Chatting with other players</li>
<li>An extremely simple network protocol to tinker with</li>
<li>Hundreds of creative and inventive worlds to explore online</li>
<li>A growing community</li>
<li>Hundreds of hours of entertainment</li>
</ul>
</description>
<screenshots>
<screenshot type="default">
<caption>Classic mode features faithful classic gameplay</caption>
<image type="source">https://github.com/ClassiCube/ClassiCube/assets/6509348/eedee53f-f53e-456f-b51c-92c62079eee0</image>
</screenshot>
<screenshot>
<caption>Enhanced mode allows hacks like flying and noclipping, it also allows servers to provide many custom features</caption>
<image type="source">https://github.com/ClassiCube/ClassiCube/assets/6509348/b2fe0e2b-5d76-41ab-909f-048d0ad15f37</image>
</screenshot>
</screenshots>
<releases>
<release version="1.3.6" date="2023-08-28" type="stable">
<url>https://github.com/ClassiCube/ClassiCube/releases/tag/1.3.6</url>
</release>
<release version="1.3.5" date="2023-01-06" type="stable">
<url>https://github.com/ClassiCube/ClassiCube/releases/tag/1.3.5</url>
</release>
<release version="1.3.4" date="2022-11-01" type="stable">
<url>https://github.com/ClassiCube/ClassiCube/releases/tag/1.3.4</url>
</release>
<release version="1.3.3" date="2022-10-08" type="stable">
<url>https://github.com/ClassiCube/ClassiCube/releases/tag/1.3.3</url>
</release>
<release version="1.3.2" date="2022-05-26" type="stable">
<url>https://github.com/ClassiCube/ClassiCube/releases/tag/1.3.2</url>
</release>
<release version="1.3.1" date="2022-01-11" type="stable">
<url>https://github.com/ClassiCube/ClassiCube/releases/tag/1.3.1</url>
</release>
<release version="1.3.0" date="2022-01-04" type="stable">
<url>https://github.com/ClassiCube/ClassiCube/releases/tag/1.3.0</url>
</release>
<release version="1.2.9" date="2021-10-18" type="stable">
<url>https://github.com/ClassiCube/ClassiCube/releases/tag/1.2.9</url>
</release>
<release version="1.2.8" date="2021-09-18" type="stable">
<url>https://github.com/ClassiCube/ClassiCube/releases/tag/1.2.8</url>
</release>
<release version="1.2.7" date="2021-07-22" type="stable">
<url>https://github.com/ClassiCube/ClassiCube/releases/tag/1.2.7</url>
</release>
<release version="1.2.6" date="2021-07-02" type="stable">
<url>https://github.com/ClassiCube/ClassiCube/releases/tag/1.2.6</url>
</release>
<release version="1.2.5" date="2021-04-02" type="stable">
<url>https://github.com/ClassiCube/ClassiCube/releases/tag/1.2.5</url>
</release>
<release version="1.2.4" date="2021-01-23" type="stable">
<url>https://github.com/ClassiCube/ClassiCube/releases/tag/1.2.4</url>
</release>
<release version="1.2.3" date="2020-12-12" type="stable">
<url>https://github.com/ClassiCube/ClassiCube/releases/tag/1.2.3</url>
</release>
<release version="1.2.2" date="2020-12-11" type="stable">
<url>https://github.com/ClassiCube/ClassiCube/releases/tag/1.2.2</url>
</release>
<release version="1.2.1" date="2020-11-28" type="stable">
<url>https://github.com/ClassiCube/ClassiCube/releases/tag/1.2.1</url>
</release>
<release version="1.2.0" date="2020-10-01" type="stable">
<url>https://github.com/ClassiCube/ClassiCube/releases/tag/1.2.0</url>
</release>
<release version="1.1.9" date="2020-08-16" type="stable">
<url>https://github.com/ClassiCube/ClassiCube/releases/tag/1.1.9</url>
</release>
<release version="1.1.8" date="2020-08-05" type="stable">
<url>https://github.com/ClassiCube/ClassiCube/releases/tag/1.1.8</url>
</release>
<release version="1.1.7" date="2020-06-13" type="stable">
<url>https://github.com/ClassiCube/ClassiCube/releases/tag/1.1.7</url>
</release>
<release version="1.1.6" date="2020-05-07" type="stable">
<url>https://github.com/ClassiCube/ClassiCube/releases/tag/1.1.6</url>
</release>
<release version="1.1.5" date="2020-05-01" type="stable">
<url>https://github.com/ClassiCube/ClassiCube/releases/tag/1.1.5</url>
</release>
<release version="1.1.4" date="2020-04-21" type="stable">
<url>https://github.com/ClassiCube/ClassiCube/releases/tag/1.1.4</url>
</release>
<release version="1.1.3" date="2020-03-08" type="stable">
<url>https://github.com/ClassiCube/ClassiCube/releases/tag/1.1.3</url>
</release>
<release version="1.1.2" date="2020-01-26" type="stable">
<url>https://github.com/ClassiCube/ClassiCube/releases/tag/1.1.2</url>
</release>
<release version="1.1.1" date="2019-12-16" type="stable">
<url>https://github.com/ClassiCube/ClassiCube/releases/tag/1.1.1</url>
</release>
</releases>
<url type="homepage">https://www.classicube.net/</url>
<url type="bugtracker">https://github.com/ClassiCube/ClassiCube/issues</url>
<url type="donation">https://www.patreon.com/ClassiCube</url>
<url type="vcs-browser">https://github.com/ClassiCube/ClassiCube</url>
<categories>
<category>Game</category>
<category>AdventureGame</category>
<category>ActionGame</category>
</categories>
<recommends>
<control>pointing</control>
<control>keyboard</control>
</recommends>
<content_rating type="oars-1.1">
<content_attribute id="violence-cartoon">moderate</content_attribute>
<content_attribute id="social-chat">intense</content_attribute>
</content_rating>
<launchable type="desktop-id">net.classicube.flatpak.client.desktop</launchable>
<provides>
<binary>ClassiCube</binary>
</provides>
</component>

View File

@@ -0,0 +1,44 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="128"
height="127.99999"
viewBox="0 0 33.866667 33.866664"
version="1.1"
id="svg8"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/">
<defs
id="defs2" />
<metadata
id="metadata5">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
</cc:Work>
</rdf:RDF>
</metadata>
<g
id="layer1"
transform="translate(5.8338447,-13.20144)">
<g
id="g4741"
transform="matrix(0.12177585,0,0,0.12056875,-1.6325083,12.971524)">
<path
id="path4737"
d="M -5.8338447,207.40561 V 78.28894 L 106.61407,13.20144 218.79741,78.28894 V 207.40561 L 106.61407,272.4931 Z"
style="fill:#f6f6f6;stroke:#000000;stroke-width:8.0626;stroke-dasharray:none;stroke-opacity:1" />
<path
id="path179"
d="m 104.07502,141.52929 110.68965,-60.9215 1.62598,125.47985 -109.78346,61.73499 z m 20.61272,94.64566 c 8.561,-1.36503 22.58979,-6.90566 34.77207,-13.73314 8.44846,-4.73489 17.45957,-10.82064 25.81752,-17.43613 8.72093,-6.90281 17.22731,-15.21726 18.55921,-18.14047 0.26981,-0.59217 0.24879,-0.77358 -0.13391,-1.15568 -0.36305,-0.36248 -0.91552,-0.44887 -2.7589,-0.43139 -3.71393,0.0352 -9.27509,1.35366 -16.28846,3.86168 -2.01562,0.7208 -3.69686,1.27297 -3.73608,1.22704 -0.16881,-0.19764 3.44601,-29.37179 6.84564,-55.24912 1.21398,-9.24057 2.15592,-16.89033 2.09321,-16.99948 -0.19747,-0.34365 -6.05941,-0.21541 -8.74964,0.19141 -11.67357,1.7653 -26.1385,9.31897 -38.83406,20.27938 -3.00232,2.59198 -8.66363,8.37481 -10.38554,10.60847 l -1.13332,1.47013 1.06078,5.78494 c 1.66864,9.09991 3.21014,18.62874 5.55847,34.35994 1.6265,10.89577 2.70193,17.7159 2.81167,17.83099 0.23021,0.24143 9.15704,-3.22834 13.96159,-5.42672 4.01374,-1.83655 7.38001,-3.77497 13.6069,-7.83534 5.39432,-3.51748 6.57616,-4.09382 7.18285,-3.50281 1.32604,1.29178 -3.92898,6.46583 -11.75312,11.57204 -5.59387,3.65069 -11.90727,6.67998 -18.54423,8.8979 -3.61228,1.20714 -3.99351,1.40207 -6.48521,3.316 -7.13359,5.47947 -15.77323,13.5129 -18.33378,17.04736 -1.39429,1.92461 -1.60126,3.07547 -0.62376,3.46838 0.81553,0.3278 3.41645,0.32525 5.4901,-0.005 z"
style="fill:#cbcbcb;fill-opacity:1;stroke-width:0.264583" />
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.6 KiB

View File

@@ -0,0 +1,7 @@
#!/bin/bash
# Allow forcing GTK3/4 through $CC_DIALOG_FORCE_ZENITY_GTK{3,4}
if [[ -z "${CC_DIALOG_FORCE_ZENITY_GTK3}" && "${XDG_CURRENT_DESKTOP}" == "GNOME" || ! -z "${CC_DIALOG_FORCE_ZENITY_GTK4}" ]]; then
zenity-gtk4 "$@"
else
zenity-gtk3 "$@"
fi

88
misc/gba/Makefile Normal file
View File

@@ -0,0 +1,88 @@
ifeq ($(strip $(DEVKITPRO)),)
$(error "Please set DEVKITPRO in your environment. export DEVKITPRO=<path to>devkitPro)
endif
include $(DEVKITPRO)/devkitARM/gba_rules
#---------------------------------------------------------------------------------
# Configurable options
#---------------------------------------------------------------------------------
# Name of the final output
TARGET = ClassiCube-gba
# List of directories containing source code
SOURCE_DIRS = src src/gba
# Directory where object files are placed
BUILD_DIR = build/gba
GAME_TITLE = ClassiCube
GAME_CODE = 0000
MAKER_CODE = 00
#---------------------------------------------------------------------------------
# Code generation
#---------------------------------------------------------------------------------
S_FILES = $(foreach dir,$(SOURCE_DIRS),$(wildcard $(dir)/*.S))
C_FILES = $(foreach dir,$(SOURCE_DIRS),$(wildcard $(dir)/*.c))
OBJS = $(addprefix $(BUILD_DIR)/, $(notdir $(C_FILES:%.c=%.o) $(S_FILES:%.S=%.o)))
ARCH = -mthumb -mthumb-interwork
CFLAGS = -g -Wall -O2 -DPLAT_GBA -ffunction-sections -fdata-sections -mcpu=arm7tdmi -mtune=arm7tdmi $(ARCH)
ASFLAGS = -g $(ARCH)
LDFLAGS = -specs=gba.specs -g $(ARCH)
LIBS = -ltonc
LIBGBA := $(DEVKITPRO)/libgba
INCLUDES += $(foreach dir, $(LIBGBA), -I$(dir)/include)
LDFLAGS += $(foreach dir, $(LIBGBA), -L$(dir)/lib)
LIBTONC = $(DEVKITPRO)/libtonc
INCLUDES += $(foreach dir, $(LIBTONC), -I$(dir)/include)
LDFLAGS += $(foreach dir, $(LIBTONC), -L$(dir)/lib)
# Dependency tracking
DEPFLAGS = -MT $@ -MMD -MP -MF $(BUILD_DIR)/$*.d
DEPFILES := $(OBJS:%.o=%.d)
#---------------------------------------------------------------------------------
# Main targets
#---------------------------------------------------------------------------------
default: $(BUILD_DIR) $(TARGET).gba
clean:
rm $(TARGET).gba $(TARGET).elf $(OBJS)
$(BUILD_DIR):
mkdir -p $(BUILD_DIR)
#---------------------------------------------------------------------------------
# Executable generation
#---------------------------------------------------------------------------------
$(TARGET).elf: $(OBJS)
$(CC) $(LDFLAGS) $^ -o $@ $(LIBS)
$(TARGET).gba: $(TARGET).elf
$(OBJCOPY) -O binary $< $@
gbafix $@ -t$(GAME_TITLE) -c$(GAME_CODE) -m$(MAKER_CODE)
#---------------------------------------------------------------------------------
# Object generation
#---------------------------------------------------------------------------------
$(BUILD_DIR)/%.o: src/%.c
$(CC) $(CFLAGS) $(INCLUDES) $(DEPFLAGS) -c $< -o $@
$(BUILD_DIR)/%.o: src/gba/%.c
$(CC) $(CFLAGS) $(INCLUDES) $(DEPFLAGS) -c $< -o $@
#---------------------------------------------------------------------------------
# Dependency tracking
#---------------------------------------------------------------------------------
$(DEPFILES):
include $(wildcard $(DEPFILES))

89
misc/gc/Makefile Normal file
View File

@@ -0,0 +1,89 @@
ifeq ($(strip $(DEVKITPRO)),)
$(error "Please set DEVKITPRO in your environment. export DEVKITPRO=<path to>devkitPro)
endif
#---------------------------------------------------------------------------------
# Configurable options
#---------------------------------------------------------------------------------
# Name of the final output
TARGET = ClassiCube-gc
# List of directories containing source code
SOURCE_DIRS = src src/gcwii third_party/bearssl/src
# List of directories containing more header files
INCLUDES = -Ithird_party/bearssl/inc
# Directory where object files are placed
BUILD_DIR = build/gc
#---------------------------------------------------------------------------------
# Code generation
#---------------------------------------------------------------------------------
S_FILES = $(foreach dir,$(SOURCE_DIRS),$(wildcard $(dir)/*.S))
C_FILES = $(foreach dir,$(SOURCE_DIRS),$(wildcard $(dir)/*.c))
OBJS = $(addprefix $(BUILD_DIR)/, $(notdir $(C_FILES:%.c=%.o) $(S_FILES:%.S=%.o)))
MACHDEP = -DGEKKO -mogc -mcpu=750 -meabi -mhard-float
CFLAGS = -g -O2 -Wall $(MACHDEP) -I$(DEVKITPRO)/libogc/include
LDFLAGS = -g $(MACHDEP) -L$(DEVKITPRO)/libogc/lib/cube
# Additional libraries to link against
LIBS = -lasnd -lbba -lfat -logc -lm
# Dependency tracking
DEPFLAGS = -MT $@ -MMD -MP -MF $(BUILD_DIR)/$*.d
DEPFILES := $(OBJS:%.o=%.d)
#---------------------------------------------------------------------------------
# Compiler tools
#---------------------------------------------------------------------------------
PREFIX := $(DEVKITPRO)/devkitPPC/bin/powerpc-eabi-
PPC_AS := $(PREFIX)as
PPC_CC := $(PREFIX)gcc
PPC_CXX := $(PREFIX)g++
ELF2DOL := $(DEVKITPRO)/tools/bin/elf2dol
#---------------------------------------------------------------------------------
# Main targets
#---------------------------------------------------------------------------------
default: $(BUILD_DIR) $(TARGET).dol
clean:
rm $(TARGET).dol $(TARGET).elf $(OBJS)
$(BUILD_DIR):
mkdir -p $(BUILD_DIR)
#---------------------------------------------------------------------------------
# Executable generation
#---------------------------------------------------------------------------------
$(TARGET).elf: $(OBJS)
$(PPC_CC) $(LDFLAGS) $^ -o $@ $(LIBS)
$(TARGET).dol: $(TARGET).elf
$(ELF2DOL) $< $@
#---------------------------------------------------------------------------------
# Object generation
#---------------------------------------------------------------------------------
$(BUILD_DIR)/%.o: src/%.c
$(PPC_CC) $(CFLAGS) $(INCLUDES) $(DEPFLAGS) -c $< -o $@
$(BUILD_DIR)/%.o: src/gcwii/%.c
$(PPC_CC) $(CFLAGS) $(INCLUDES) $(DEPFLAGS) -c $< -o $@
$(BUILD_DIR)/%.o: third_party/bearssl/src/%.c
$(PPC_CC) $(CFLAGS) $(INCLUDES) -c $< -o $@
#---------------------------------------------------------------------------------
# Dependency tracking
#---------------------------------------------------------------------------------
$(DEPFILES):
include $(wildcard $(DEPFILES))

View File

@@ -0,0 +1,648 @@
// !$*UTF8*$!
{
archiveVersion = 1;
classes = {
};
objectVersion = 50;
objects = {
/* Begin PBXBuildFile section */
9A4D0C642BDD168800E1695D /* TouchUI.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A4D0C632BDD168800E1695D /* TouchUI.c */; };
9A57ECEE2BCD1408006A89F0 /* Audio_OpenAL.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A57ECED2BCD1408006A89F0 /* Audio_OpenAL.c */; };
9A62ADF5286D906F00E5E3DE /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 9A62ADF4286D906F00E5E3DE /* Assets.xcassets */; };
9A6C79652BFDDEF200676D27 /* FancyLighting.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A6C79642BFDDEF100676D27 /* FancyLighting.c */; };
9A6C79672BFDDF0700676D27 /* Queue.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A6C79662BFDDF0600676D27 /* Queue.c */; };
9A6C7DFA2C2F610C00676D27 /* LBackend_ios.m in Sources */ = {isa = PBXBuildFile; fileRef = 9A6C7DF92C2F610C00676D27 /* LBackend_ios.m */; };
9A6C7DFC2C41E93700676D27 /* InputHandler.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A6C7DFB2C41E93700676D27 /* InputHandler.c */; };
9A6C7DFE2C41E95D00676D27 /* MenuOptions.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A6C7DFD2C41E95C00676D27 /* MenuOptions.c */; };
9A6C7E002C41EED700676D27 /* Window_ios.m in Sources */ = {isa = PBXBuildFile; fileRef = 9A6C7DFF2C41EED700676D27 /* Window_ios.m */; };
9A7401D92B737D5C0040E575 /* Commands.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A7401D82B737D5B0040E575 /* Commands.c */; };
9A7401DB2B7384060040E575 /* SSL.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A7401DA2B7384060040E575 /* SSL.c */; };
9A89D4F227F802F600FF3F80 /* LWidgets.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A89D37827F802F500FF3F80 /* LWidgets.c */; };
9A89D4F327F802F600FF3F80 /* Graphics_GL2.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A89D37A27F802F500FF3F80 /* Graphics_GL2.c */; };
9A89D4F427F802F600FF3F80 /* Vorbis.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A89D37C27F802F500FF3F80 /* Vorbis.c */; };
9A89D4F527F802F600FF3F80 /* _ftsynth.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A89D37D27F802F500FF3F80 /* _ftsynth.c */; };
9A89D4F727F802F600FF3F80 /* Game.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A89D38027F802F500FF3F80 /* Game.c */; };
9A89D4F927F802F600FF3F80 /* Http_Worker.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A89D38227F802F500FF3F80 /* Http_Worker.c */; };
9A89D4FB27F802F600FF3F80 /* TexturePack.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A89D38427F802F500FF3F80 /* TexturePack.c */; };
9A89D4FD27F802F600FF3F80 /* ExtMath.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A89D38627F802F500FF3F80 /* ExtMath.c */; };
9A89D4FE27F802F600FF3F80 /* Inventory.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A89D38B27F802F500FF3F80 /* Inventory.c */; };
9A89D4FF27F802F600FF3F80 /* Gui.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A89D38C27F802F500FF3F80 /* Gui.c */; };
9A89D50027F802F600FF3F80 /* _truetype.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A89D38E27F802F500FF3F80 /* _truetype.c */; };
9A89D50127F802F600FF3F80 /* LBackend.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A89D38F27F802F500FF3F80 /* LBackend.c */; };
9A89D50227F802F600FF3F80 /* Block.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A89D39127F802F500FF3F80 /* Block.c */; };
9A89D50327F802F600FF3F80 /* Platform_Posix.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A89D39227F802F500FF3F80 /* Platform_Posix.c */; };
9A89D50427F802F600FF3F80 /* Model.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A89D39627F802F500FF3F80 /* Model.c */; };
9A89D50527F802F600FF3F80 /* LScreens.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A89D39827F802F500FF3F80 /* LScreens.c */; };
9A89D50627F802F600FF3F80 /* Builder.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A89D39927F802F500FF3F80 /* Builder.c */; };
9A89D50727F802F600FF3F80 /* Particle.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A89D39B27F802F500FF3F80 /* Particle.c */; };
9A89D50827F802F600FF3F80 /* PackedCol.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A89D39C27F802F500FF3F80 /* PackedCol.c */; };
9A89D54F27F802F600FF3F80 /* Deflate.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A89D47227F802F500FF3F80 /* Deflate.c */; };
9A89D55027F802F600FF3F80 /* Entity.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A89D47427F802F500FF3F80 /* Entity.c */; };
9A89D55127F802F600FF3F80 /* IsometricDrawer.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A89D47527F802F500FF3F80 /* IsometricDrawer.c */; };
9A89D55227F802F600FF3F80 /* Logger.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A89D47627F802F500FF3F80 /* Logger.c */; };
9A89D55327F802F600FF3F80 /* _psaux.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A89D47727F802F500FF3F80 /* _psaux.c */; };
9A89D55427F802F600FF3F80 /* Bitmap.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A89D47827F802F500FF3F80 /* Bitmap.c */; };
9A89D55527F802F600FF3F80 /* HeldBlockRenderer.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A89D47927F802F500FF3F80 /* HeldBlockRenderer.c */; };
9A89D55627F802F600FF3F80 /* EnvRenderer.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A89D47A27F802F500FF3F80 /* EnvRenderer.c */; };
9A89D55827F802F600FF3F80 /* Graphics_GL1.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A89D47E27F802F500FF3F80 /* Graphics_GL1.c */; };
9A89D55927F802F600FF3F80 /* interop_ios.m in Sources */ = {isa = PBXBuildFile; fileRef = 9A89D47F27F802F600FF3F80 /* interop_ios.m */; };
9A89D55B27F802F600FF3F80 /* _type1.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A89D48227F802F600FF3F80 /* _type1.c */; };
9A89D55C27F802F600FF3F80 /* Animations.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A89D48527F802F600FF3F80 /* Animations.c */; };
9A89D55D27F802F600FF3F80 /* _psmodule.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A89D48627F802F600FF3F80 /* _psmodule.c */; };
9A89D55E27F802F600FF3F80 /* World.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A89D48727F802F600FF3F80 /* World.c */; };
9A89D55F27F802F600FF3F80 /* _sfnt.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A89D48827F802F600FF3F80 /* _sfnt.c */; };
9A89D56027F802F600FF3F80 /* _ftbitmap.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A89D48A27F802F600FF3F80 /* _ftbitmap.c */; };
9A89D56127F802F600FF3F80 /* Menus.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A89D48B27F802F600FF3F80 /* Menus.c */; };
9A89D56227F802F600FF3F80 /* _ftbase.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A89D48C27F802F600FF3F80 /* _ftbase.c */; };
9A89D56327F802F600FF3F80 /* _autofit.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A89D48D27F802F600FF3F80 /* _autofit.c */; };
9A89D56427F802F600FF3F80 /* String.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A89D49227F802F600FF3F80 /* String.c */; };
9A89D56527F802F600FF3F80 /* Generator.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A89D49427F802F600FF3F80 /* Generator.c */; };
9A89D56627F802F600FF3F80 /* Drawer2D.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A89D49527F802F600FF3F80 /* Drawer2D.c */; };
9A89D56727F802F600FF3F80 /* Drawer.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A89D49827F802F600FF3F80 /* Drawer.c */; };
9A89D56827F802F600FF3F80 /* Lighting.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A89D49927F802F600FF3F80 /* Lighting.c */; };
9A89D56A27F802F600FF3F80 /* Physics.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A89D49B27F802F600FF3F80 /* Physics.c */; };
9A89D56B27F802F600FF3F80 /* Server.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A89D49E27F802F600FF3F80 /* Server.c */; };
9A89D56C27F802F600FF3F80 /* _ftinit.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A89D4A027F802F600FF3F80 /* _ftinit.c */; };
9A89D56F27F802F600FF3F80 /* Input.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A89D4A627F802F600FF3F80 /* Input.c */; };
9A89D57227F802F600FF3F80 /* Picking.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A89D4AA27F802F600FF3F80 /* Picking.c */; };
9A89D57327F802F600FF3F80 /* Utils.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A89D4AB27F802F600FF3F80 /* Utils.c */; };
9A89D57427F802F600FF3F80 /* MapRenderer.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A89D4AE27F802F600FF3F80 /* MapRenderer.c */; };
9A89D57527F802F600FF3F80 /* AxisLinesRenderer.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A89D4AF27F802F600FF3F80 /* AxisLinesRenderer.c */; };
9A89D57627F802F600FF3F80 /* _pshinter.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A89D4B127F802F600FF3F80 /* _pshinter.c */; };
9A89D57827F802F600FF3F80 /* Protocol.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A89D4B327F802F600FF3F80 /* Protocol.c */; };
9A89D57927F802F600FF3F80 /* Event.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A89D4B527F802F600FF3F80 /* Event.c */; };
9A89D57B27F802F600FF3F80 /* _ftglyph.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A89D4BB27F802F600FF3F80 /* _ftglyph.c */; };
9A89D57C27F802F600FF3F80 /* Chat.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A89D4BC27F802F600FF3F80 /* Chat.c */; };
9A89D57D27F802F600FF3F80 /* _smooth.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A89D4BD27F802F600FF3F80 /* _smooth.c */; };
9A89D57E27F802F600FF3F80 /* Resources.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A89D4BE27F802F600FF3F80 /* Resources.c */; };
9A89D57F27F802F600FF3F80 /* LWeb.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A89D4C427F802F600FF3F80 /* LWeb.c */; };
9A89D58027F802F600FF3F80 /* Formats.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A89D4C627F802F600FF3F80 /* Formats.c */; };
9A89D58127F802F600FF3F80 /* SelOutlineRenderer.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A89D4C927F802F600FF3F80 /* SelOutlineRenderer.c */; };
9A89D58327F802F600FF3F80 /* EntityComponents.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A89D4CC27F802F600FF3F80 /* EntityComponents.c */; };
9A89D58427F802F600FF3F80 /* Camera.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A89D4CF27F802F600FF3F80 /* Camera.c */; };
9A89D58627F802F600FF3F80 /* Screens.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A89D4D127F802F600FF3F80 /* Screens.c */; };
9A89D58727F802F600FF3F80 /* SelectionBox.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A89D4D227F802F600FF3F80 /* SelectionBox.c */; };
9A89D58927F802F600FF3F80 /* _cff.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A89D4DA27F802F600FF3F80 /* _cff.c */; };
9A89D58A27F802F600FF3F80 /* BlockPhysics.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A89D4DB27F802F600FF3F80 /* BlockPhysics.c */; };
9A89D58B27F802F600FF3F80 /* Launcher.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A89D4DD27F802F600FF3F80 /* Launcher.c */; };
9A89D58D27F802F600FF3F80 /* Options.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A89D4E327F802F600FF3F80 /* Options.c */; };
9A89D58E27F802F600FF3F80 /* Window_SDL2.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A89D4E427F802F600FF3F80 /* Window_SDL2.c */; };
9A89D58F27F802F600FF3F80 /* Audio.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A89D4E727F802F600FF3F80 /* Audio.c */; };
9A89D59027F802F600FF3F80 /* Stream.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A89D4E827F802F600FF3F80 /* Stream.c */; };
9A89D59127F802F600FF3F80 /* Vectors.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A89D4E927F802F600FF3F80 /* Vectors.c */; };
9A89D59427F802F600FF3F80 /* Widgets.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A89D4EE27F802F600FF3F80 /* Widgets.c */; };
9AC5433E2AE2649F0086C85F /* SystemFonts.c in Sources */ = {isa = PBXBuildFile; fileRef = 9AC5433D2AE2649E0086C85F /* SystemFonts.c */; };
9AC543402AE264AC0086C85F /* GameVersion.c in Sources */ = {isa = PBXBuildFile; fileRef = 9AC5433F2AE264AC0086C85F /* GameVersion.c */; };
9AC543422AE264B90086C85F /* EntityRenderers.c in Sources */ = {isa = PBXBuildFile; fileRef = 9AC543412AE264B90086C85F /* EntityRenderers.c */; };
/* End PBXBuildFile section */
/* Begin PBXFileReference section */
9A4D0C632BDD168800E1695D /* TouchUI.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = TouchUI.c; sourceTree = "<group>"; };
9A57ECED2BCD1408006A89F0 /* Audio_OpenAL.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = Audio_OpenAL.c; sourceTree = "<group>"; };
9A62ADF4286D906F00E5E3DE /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Assets.xcassets; path = ClassiCube/Assets.xcassets; sourceTree = "<group>"; };
9A6C79642BFDDEF100676D27 /* FancyLighting.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = FancyLighting.c; sourceTree = "<group>"; };
9A6C79662BFDDF0600676D27 /* Queue.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = Queue.c; sourceTree = "<group>"; };
9A6C7DF92C2F610C00676D27 /* LBackend_ios.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LBackend_ios.m; sourceTree = "<group>"; };
9A6C7DFB2C41E93700676D27 /* InputHandler.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = InputHandler.c; sourceTree = "<group>"; };
9A6C7DFD2C41E95C00676D27 /* MenuOptions.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = MenuOptions.c; sourceTree = "<group>"; };
9A6C7DFF2C41EED700676D27 /* Window_ios.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Window_ios.m; sourceTree = "<group>"; };
9A7401D82B737D5B0040E575 /* Commands.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = Commands.c; sourceTree = "<group>"; };
9A7401DA2B7384060040E575 /* SSL.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = SSL.c; sourceTree = "<group>"; };
9A89D35727F802B100FF3F80 /* ClassiCube.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = ClassiCube.app; sourceTree = BUILT_PRODUCTS_DIR; };
9A89D36827F802B400FF3F80 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
9A89D37827F802F500FF3F80 /* LWidgets.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = LWidgets.c; sourceTree = "<group>"; };
9A89D37A27F802F500FF3F80 /* Graphics_GL2.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = Graphics_GL2.c; sourceTree = "<group>"; };
9A89D37C27F802F500FF3F80 /* Vorbis.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = Vorbis.c; sourceTree = "<group>"; };
9A89D37D27F802F500FF3F80 /* _ftsynth.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = _ftsynth.c; sourceTree = "<group>"; };
9A89D38027F802F500FF3F80 /* Game.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = Game.c; sourceTree = "<group>"; };
9A89D38227F802F500FF3F80 /* Http_Worker.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = Http_Worker.c; sourceTree = "<group>"; };
9A89D38427F802F500FF3F80 /* TexturePack.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = TexturePack.c; sourceTree = "<group>"; };
9A89D38627F802F500FF3F80 /* ExtMath.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ExtMath.c; sourceTree = "<group>"; };
9A89D38B27F802F500FF3F80 /* Inventory.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = Inventory.c; sourceTree = "<group>"; };
9A89D38C27F802F500FF3F80 /* Gui.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = Gui.c; sourceTree = "<group>"; };
9A89D38E27F802F500FF3F80 /* _truetype.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = _truetype.c; sourceTree = "<group>"; };
9A89D38F27F802F500FF3F80 /* LBackend.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = LBackend.c; sourceTree = "<group>"; };
9A89D39127F802F500FF3F80 /* Block.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = Block.c; sourceTree = "<group>"; };
9A89D39227F802F500FF3F80 /* Platform_Posix.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = Platform_Posix.c; sourceTree = "<group>"; };
9A89D39627F802F500FF3F80 /* Model.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = Model.c; sourceTree = "<group>"; };
9A89D39827F802F500FF3F80 /* LScreens.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = LScreens.c; sourceTree = "<group>"; };
9A89D39927F802F500FF3F80 /* Builder.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = Builder.c; sourceTree = "<group>"; };
9A89D39B27F802F500FF3F80 /* Particle.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = Particle.c; sourceTree = "<group>"; };
9A89D39C27F802F500FF3F80 /* PackedCol.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = PackedCol.c; sourceTree = "<group>"; };
9A89D47227F802F500FF3F80 /* Deflate.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = Deflate.c; sourceTree = "<group>"; };
9A89D47427F802F500FF3F80 /* Entity.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = Entity.c; sourceTree = "<group>"; };
9A89D47527F802F500FF3F80 /* IsometricDrawer.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = IsometricDrawer.c; sourceTree = "<group>"; };
9A89D47627F802F500FF3F80 /* Logger.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = Logger.c; sourceTree = "<group>"; };
9A89D47727F802F500FF3F80 /* _psaux.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = _psaux.c; sourceTree = "<group>"; };
9A89D47827F802F500FF3F80 /* Bitmap.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = Bitmap.c; sourceTree = "<group>"; };
9A89D47927F802F500FF3F80 /* HeldBlockRenderer.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = HeldBlockRenderer.c; sourceTree = "<group>"; };
9A89D47A27F802F500FF3F80 /* EnvRenderer.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = EnvRenderer.c; sourceTree = "<group>"; };
9A89D47E27F802F500FF3F80 /* Graphics_GL1.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = Graphics_GL1.c; sourceTree = "<group>"; };
9A89D47F27F802F600FF3F80 /* interop_ios.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = interop_ios.m; sourceTree = "<group>"; };
9A89D48227F802F600FF3F80 /* _type1.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = _type1.c; sourceTree = "<group>"; };
9A89D48527F802F600FF3F80 /* Animations.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = Animations.c; sourceTree = "<group>"; };
9A89D48627F802F600FF3F80 /* _psmodule.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = _psmodule.c; sourceTree = "<group>"; };
9A89D48727F802F600FF3F80 /* World.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = World.c; sourceTree = "<group>"; };
9A89D48827F802F600FF3F80 /* _sfnt.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = _sfnt.c; sourceTree = "<group>"; };
9A89D48A27F802F600FF3F80 /* _ftbitmap.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = _ftbitmap.c; sourceTree = "<group>"; };
9A89D48B27F802F600FF3F80 /* Menus.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = Menus.c; sourceTree = "<group>"; };
9A89D48C27F802F600FF3F80 /* _ftbase.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = _ftbase.c; sourceTree = "<group>"; };
9A89D48D27F802F600FF3F80 /* _autofit.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = _autofit.c; sourceTree = "<group>"; };
9A89D49227F802F600FF3F80 /* String.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = String.c; sourceTree = "<group>"; };
9A89D49427F802F600FF3F80 /* Generator.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = Generator.c; sourceTree = "<group>"; };
9A89D49527F802F600FF3F80 /* Drawer2D.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = Drawer2D.c; sourceTree = "<group>"; };
9A89D49827F802F600FF3F80 /* Drawer.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = Drawer.c; sourceTree = "<group>"; };
9A89D49927F802F600FF3F80 /* Lighting.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = Lighting.c; sourceTree = "<group>"; };
9A89D49B27F802F600FF3F80 /* Physics.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = Physics.c; sourceTree = "<group>"; };
9A89D49E27F802F600FF3F80 /* Server.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = Server.c; sourceTree = "<group>"; };
9A89D4A027F802F600FF3F80 /* _ftinit.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = _ftinit.c; sourceTree = "<group>"; };
9A89D4A627F802F600FF3F80 /* Input.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = Input.c; sourceTree = "<group>"; };
9A89D4AA27F802F600FF3F80 /* Picking.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = Picking.c; sourceTree = "<group>"; };
9A89D4AB27F802F600FF3F80 /* Utils.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = Utils.c; sourceTree = "<group>"; };
9A89D4AE27F802F600FF3F80 /* MapRenderer.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = MapRenderer.c; sourceTree = "<group>"; };
9A89D4AF27F802F600FF3F80 /* AxisLinesRenderer.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = AxisLinesRenderer.c; sourceTree = "<group>"; };
9A89D4B127F802F600FF3F80 /* _pshinter.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = _pshinter.c; sourceTree = "<group>"; };
9A89D4B327F802F600FF3F80 /* Protocol.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = Protocol.c; sourceTree = "<group>"; };
9A89D4B527F802F600FF3F80 /* Event.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = Event.c; sourceTree = "<group>"; };
9A89D4BB27F802F600FF3F80 /* _ftglyph.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = _ftglyph.c; sourceTree = "<group>"; };
9A89D4BC27F802F600FF3F80 /* Chat.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = Chat.c; sourceTree = "<group>"; };
9A89D4BD27F802F600FF3F80 /* _smooth.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = _smooth.c; sourceTree = "<group>"; };
9A89D4BE27F802F600FF3F80 /* Resources.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = Resources.c; sourceTree = "<group>"; };
9A89D4C427F802F600FF3F80 /* LWeb.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = LWeb.c; sourceTree = "<group>"; };
9A89D4C627F802F600FF3F80 /* Formats.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = Formats.c; sourceTree = "<group>"; };
9A89D4C927F802F600FF3F80 /* SelOutlineRenderer.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = SelOutlineRenderer.c; sourceTree = "<group>"; };
9A89D4CC27F802F600FF3F80 /* EntityComponents.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = EntityComponents.c; sourceTree = "<group>"; };
9A89D4CF27F802F600FF3F80 /* Camera.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = Camera.c; sourceTree = "<group>"; };
9A89D4D127F802F600FF3F80 /* Screens.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = Screens.c; sourceTree = "<group>"; };
9A89D4D227F802F600FF3F80 /* SelectionBox.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = SelectionBox.c; sourceTree = "<group>"; };
9A89D4DA27F802F600FF3F80 /* _cff.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = _cff.c; sourceTree = "<group>"; };
9A89D4DB27F802F600FF3F80 /* BlockPhysics.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = BlockPhysics.c; sourceTree = "<group>"; };
9A89D4DD27F802F600FF3F80 /* Launcher.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = Launcher.c; sourceTree = "<group>"; };
9A89D4E327F802F600FF3F80 /* Options.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = Options.c; sourceTree = "<group>"; };
9A89D4E427F802F600FF3F80 /* Window_SDL2.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = Window_SDL2.c; sourceTree = "<group>"; };
9A89D4E727F802F600FF3F80 /* Audio.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = Audio.c; sourceTree = "<group>"; };
9A89D4E827F802F600FF3F80 /* Stream.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = Stream.c; sourceTree = "<group>"; };
9A89D4E927F802F600FF3F80 /* Vectors.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = Vectors.c; sourceTree = "<group>"; };
9A89D4EE27F802F600FF3F80 /* Widgets.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = Widgets.c; sourceTree = "<group>"; };
9AC5433D2AE2649E0086C85F /* SystemFonts.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = SystemFonts.c; sourceTree = "<group>"; };
9AC5433F2AE264AC0086C85F /* GameVersion.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = GameVersion.c; sourceTree = "<group>"; };
9AC543412AE264B90086C85F /* EntityRenderers.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = EntityRenderers.c; sourceTree = "<group>"; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
9A89D35427F802B100FF3F80 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */
9A89D34E27F802B100FF3F80 = {
isa = PBXGroup;
children = (
9A62ADF4286D906F00E5E3DE /* Assets.xcassets */,
9A89D36827F802B400FF3F80 /* Info.plist */,
9A89D37727F802F500FF3F80 /* src */,
9A89D35827F802B100FF3F80 /* Products */,
);
sourceTree = "<group>";
};
9A89D35827F802B100FF3F80 /* Products */ = {
isa = PBXGroup;
children = (
9A89D35727F802B100FF3F80 /* ClassiCube.app */,
);
name = Products;
sourceTree = "<group>";
};
9A89D37727F802F500FF3F80 /* src */ = {
isa = PBXGroup;
children = (
9A6C7DFF2C41EED700676D27 /* Window_ios.m */,
9A6C7DFD2C41E95C00676D27 /* MenuOptions.c */,
9A6C7DFB2C41E93700676D27 /* InputHandler.c */,
9A6C7DF92C2F610C00676D27 /* LBackend_ios.m */,
9A6C79662BFDDF0600676D27 /* Queue.c */,
9A6C79642BFDDEF100676D27 /* FancyLighting.c */,
9A4D0C632BDD168800E1695D /* TouchUI.c */,
9A57ECED2BCD1408006A89F0 /* Audio_OpenAL.c */,
9A7401DA2B7384060040E575 /* SSL.c */,
9A7401D82B737D5B0040E575 /* Commands.c */,
9AC543412AE264B90086C85F /* EntityRenderers.c */,
9AC5433F2AE264AC0086C85F /* GameVersion.c */,
9AC5433D2AE2649E0086C85F /* SystemFonts.c */,
9A89D48D27F802F600FF3F80 /* _autofit.c */,
9A89D4DA27F802F600FF3F80 /* _cff.c */,
9A89D48C27F802F600FF3F80 /* _ftbase.c */,
9A89D48A27F802F600FF3F80 /* _ftbitmap.c */,
9A89D4BB27F802F600FF3F80 /* _ftglyph.c */,
9A89D4A027F802F600FF3F80 /* _ftinit.c */,
9A89D37D27F802F500FF3F80 /* _ftsynth.c */,
9A89D47727F802F500FF3F80 /* _psaux.c */,
9A89D4B127F802F600FF3F80 /* _pshinter.c */,
9A89D48627F802F600FF3F80 /* _psmodule.c */,
9A89D48827F802F600FF3F80 /* _sfnt.c */,
9A89D4BD27F802F600FF3F80 /* _smooth.c */,
9A89D38E27F802F500FF3F80 /* _truetype.c */,
9A89D48227F802F600FF3F80 /* _type1.c */,
9A89D48527F802F600FF3F80 /* Animations.c */,
9A89D4E727F802F600FF3F80 /* Audio.c */,
9A89D4AF27F802F600FF3F80 /* AxisLinesRenderer.c */,
9A89D47827F802F500FF3F80 /* Bitmap.c */,
9A89D39127F802F500FF3F80 /* Block.c */,
9A89D4DB27F802F600FF3F80 /* BlockPhysics.c */,
9A89D39927F802F500FF3F80 /* Builder.c */,
9A89D4CF27F802F600FF3F80 /* Camera.c */,
9A89D4BC27F802F600FF3F80 /* Chat.c */,
9A89D47227F802F500FF3F80 /* Deflate.c */,
9A89D49827F802F600FF3F80 /* Drawer.c */,
9A89D49527F802F600FF3F80 /* Drawer2D.c */,
9A89D47427F802F500FF3F80 /* Entity.c */,
9A89D4CC27F802F600FF3F80 /* EntityComponents.c */,
9A89D47A27F802F500FF3F80 /* EnvRenderer.c */,
9A89D4B527F802F600FF3F80 /* Event.c */,
9A89D38627F802F500FF3F80 /* ExtMath.c */,
9A89D4C627F802F600FF3F80 /* Formats.c */,
9A89D38027F802F500FF3F80 /* Game.c */,
9A89D49427F802F600FF3F80 /* Generator.c */,
9A89D47E27F802F500FF3F80 /* Graphics_GL1.c */,
9A89D37A27F802F500FF3F80 /* Graphics_GL2.c */,
9A89D38C27F802F500FF3F80 /* Gui.c */,
9A89D47927F802F500FF3F80 /* HeldBlockRenderer.c */,
9A89D38227F802F500FF3F80 /* Http_Worker.c */,
9A89D4A627F802F600FF3F80 /* Input.c */,
9A89D38B27F802F500FF3F80 /* Inventory.c */,
9A89D47527F802F500FF3F80 /* IsometricDrawer.c */,
9A89D4DD27F802F600FF3F80 /* Launcher.c */,
9A89D38F27F802F500FF3F80 /* LBackend.c */,
9A89D49927F802F600FF3F80 /* Lighting.c */,
9A89D47627F802F500FF3F80 /* Logger.c */,
9A89D39827F802F500FF3F80 /* LScreens.c */,
9A89D4C427F802F600FF3F80 /* LWeb.c */,
9A89D37827F802F500FF3F80 /* LWidgets.c */,
9A89D4AE27F802F600FF3F80 /* MapRenderer.c */,
9A89D48B27F802F600FF3F80 /* Menus.c */,
9A89D39627F802F500FF3F80 /* Model.c */,
9A89D4E327F802F600FF3F80 /* Options.c */,
9A89D39C27F802F500FF3F80 /* PackedCol.c */,
9A89D39B27F802F500FF3F80 /* Particle.c */,
9A89D49B27F802F600FF3F80 /* Physics.c */,
9A89D4C927F802F600FF3F80 /* SelOutlineRenderer.c */,
9A89D4AA27F802F600FF3F80 /* Picking.c */,
9A89D39227F802F500FF3F80 /* Platform_Posix.c */,
9A89D4B327F802F600FF3F80 /* Protocol.c */,
9A89D4BE27F802F600FF3F80 /* Resources.c */,
9A89D4D127F802F600FF3F80 /* Screens.c */,
9A89D4D227F802F600FF3F80 /* SelectionBox.c */,
9A89D49E27F802F600FF3F80 /* Server.c */,
9A89D4E827F802F600FF3F80 /* Stream.c */,
9A89D49227F802F600FF3F80 /* String.c */,
9A89D38427F802F500FF3F80 /* TexturePack.c */,
9A89D4AB27F802F600FF3F80 /* Utils.c */,
9A89D4E927F802F600FF3F80 /* Vectors.c */,
9A89D37C27F802F500FF3F80 /* Vorbis.c */,
9A89D4EE27F802F600FF3F80 /* Widgets.c */,
9A89D4E427F802F600FF3F80 /* Window_SDL2.c */,
9A89D48727F802F600FF3F80 /* World.c */,
9A89D47F27F802F600FF3F80 /* interop_ios.m */,
);
name = src;
path = ../../src;
sourceTree = SOURCE_ROOT;
};
/* End PBXGroup section */
/* Begin PBXNativeTarget section */
9A89D35627F802B100FF3F80 /* ClassiCube */ = {
isa = PBXNativeTarget;
buildConfigurationList = 9A89D36D27F802B400FF3F80 /* Build configuration list for PBXNativeTarget "ClassiCube" */;
buildPhases = (
9A89D35327F802B100FF3F80 /* Sources */,
9A89D35427F802B100FF3F80 /* Frameworks */,
9A89D35527F802B100FF3F80 /* Resources */,
);
buildRules = (
);
dependencies = (
);
name = ClassiCube;
productName = CCIOS2;
productReference = 9A89D35727F802B100FF3F80 /* ClassiCube.app */;
productType = "com.apple.product-type.application";
};
/* End PBXNativeTarget section */
/* Begin PBXProject section */
9A89D34F27F802B100FF3F80 /* Project object */ = {
isa = PBXProject;
attributes = {
LastUpgradeCheck = 1010;
ORGANIZATIONNAME = ClassiCube;
TargetAttributes = {
9A89D35627F802B100FF3F80 = {
CreatedOnToolsVersion = 10.1;
};
};
};
buildConfigurationList = 9A89D35227F802B100FF3F80 /* Build configuration list for PBXProject "CCIOS" */;
compatibilityVersion = "Xcode 9.3";
developmentRegion = en;
hasScannedForEncodings = 0;
knownRegions = (
en,
Base,
);
mainGroup = 9A89D34E27F802B100FF3F80;
productRefGroup = 9A89D35827F802B100FF3F80 /* Products */;
projectDirPath = "";
projectRoot = "";
targets = (
9A89D35627F802B100FF3F80 /* ClassiCube */,
);
};
/* End PBXProject section */
/* Begin PBXResourcesBuildPhase section */
9A89D35527F802B100FF3F80 /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
9A62ADF5286D906F00E5E3DE /* Assets.xcassets in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXResourcesBuildPhase section */
/* Begin PBXSourcesBuildPhase section */
9A89D35327F802B100FF3F80 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
9A89D50727F802F600FF3F80 /* Particle.c in Sources */,
9A89D56C27F802F600FF3F80 /* _ftinit.c in Sources */,
9A89D58F27F802F600FF3F80 /* Audio.c in Sources */,
9A89D55227F802F600FF3F80 /* Logger.c in Sources */,
9A89D58E27F802F600FF3F80 /* Window_SDL2.c in Sources */,
9A89D4FF27F802F600FF3F80 /* Gui.c in Sources */,
9A89D55027F802F600FF3F80 /* Entity.c in Sources */,
9A89D58327F802F600FF3F80 /* EntityComponents.c in Sources */,
9A7401D92B737D5C0040E575 /* Commands.c in Sources */,
9A89D57327F802F600FF3F80 /* Utils.c in Sources */,
9A6C7DFE2C41E95D00676D27 /* MenuOptions.c in Sources */,
9A89D58427F802F600FF3F80 /* Camera.c in Sources */,
9A89D57C27F802F600FF3F80 /* Chat.c in Sources */,
9A89D50527F802F600FF3F80 /* LScreens.c in Sources */,
9A89D56727F802F600FF3F80 /* Drawer.c in Sources */,
9A89D4F327F802F600FF3F80 /* Graphics_GL2.c in Sources */,
9A89D55C27F802F600FF3F80 /* Animations.c in Sources */,
9A89D58D27F802F600FF3F80 /* Options.c in Sources */,
9A89D57927F802F600FF3F80 /* Event.c in Sources */,
9A89D55B27F802F600FF3F80 /* _type1.c in Sources */,
9A89D58127F802F600FF3F80 /* SelOutlineRenderer.c in Sources */,
9A89D56027F802F600FF3F80 /* _ftbitmap.c in Sources */,
9A89D50327F802F600FF3F80 /* Platform_Posix.c in Sources */,
9A89D58027F802F600FF3F80 /* Formats.c in Sources */,
9A89D4FB27F802F600FF3F80 /* TexturePack.c in Sources */,
9A89D50827F802F600FF3F80 /* PackedCol.c in Sources */,
9A89D50227F802F600FF3F80 /* Block.c in Sources */,
9A89D57227F802F600FF3F80 /* Picking.c in Sources */,
9A89D59127F802F600FF3F80 /* Vectors.c in Sources */,
9A89D58A27F802F600FF3F80 /* BlockPhysics.c in Sources */,
9A89D56127F802F600FF3F80 /* Menus.c in Sources */,
9A89D4F727F802F600FF3F80 /* Game.c in Sources */,
9A89D55627F802F600FF3F80 /* EnvRenderer.c in Sources */,
9A89D58927F802F600FF3F80 /* _cff.c in Sources */,
9A6C79672BFDDF0700676D27 /* Queue.c in Sources */,
9A89D4F227F802F600FF3F80 /* LWidgets.c in Sources */,
9A89D55327F802F600FF3F80 /* _psaux.c in Sources */,
9A89D50427F802F600FF3F80 /* Model.c in Sources */,
9A89D54F27F802F600FF3F80 /* Deflate.c in Sources */,
9A89D56327F802F600FF3F80 /* _autofit.c in Sources */,
9A89D55F27F802F600FF3F80 /* _sfnt.c in Sources */,
9A89D55527F802F600FF3F80 /* HeldBlockRenderer.c in Sources */,
9A89D4FD27F802F600FF3F80 /* ExtMath.c in Sources */,
9A57ECEE2BCD1408006A89F0 /* Audio_OpenAL.c in Sources */,
9A89D56427F802F600FF3F80 /* String.c in Sources */,
9A89D57D27F802F600FF3F80 /* _smooth.c in Sources */,
9AC543402AE264AC0086C85F /* GameVersion.c in Sources */,
9AC543422AE264B90086C85F /* EntityRenderers.c in Sources */,
9A89D50127F802F600FF3F80 /* LBackend.c in Sources */,
9A89D56827F802F600FF3F80 /* Lighting.c in Sources */,
9A89D57827F802F600FF3F80 /* Protocol.c in Sources */,
9A89D55427F802F600FF3F80 /* Bitmap.c in Sources */,
9A89D50627F802F600FF3F80 /* Builder.c in Sources */,
9A89D55127F802F600FF3F80 /* IsometricDrawer.c in Sources */,
9A89D57B27F802F600FF3F80 /* _ftglyph.c in Sources */,
9A89D55827F802F600FF3F80 /* Graphics_GL1.c in Sources */,
9A89D59427F802F600FF3F80 /* Widgets.c in Sources */,
9A89D55927F802F600FF3F80 /* interop_ios.m in Sources */,
9A7401DB2B7384060040E575 /* SSL.c in Sources */,
9A89D4F527F802F600FF3F80 /* _ftsynth.c in Sources */,
9A89D55D27F802F600FF3F80 /* _psmodule.c in Sources */,
9A89D56F27F802F600FF3F80 /* Input.c in Sources */,
9A89D57E27F802F600FF3F80 /* Resources.c in Sources */,
9A89D4F427F802F600FF3F80 /* Vorbis.c in Sources */,
9A89D56227F802F600FF3F80 /* _ftbase.c in Sources */,
9A89D56B27F802F600FF3F80 /* Server.c in Sources */,
9A89D50027F802F600FF3F80 /* _truetype.c in Sources */,
9A6C79652BFDDEF200676D27 /* FancyLighting.c in Sources */,
9A4D0C642BDD168800E1695D /* TouchUI.c in Sources */,
9AC5433E2AE2649F0086C85F /* SystemFonts.c in Sources */,
9A89D57F27F802F600FF3F80 /* LWeb.c in Sources */,
9A89D56627F802F600FF3F80 /* Drawer2D.c in Sources */,
9A89D57427F802F600FF3F80 /* MapRenderer.c in Sources */,
9A89D57627F802F600FF3F80 /* _pshinter.c in Sources */,
9A89D56A27F802F600FF3F80 /* Physics.c in Sources */,
9A6C7DFA2C2F610C00676D27 /* LBackend_ios.m in Sources */,
9A89D58727F802F600FF3F80 /* SelectionBox.c in Sources */,
9A89D4FE27F802F600FF3F80 /* Inventory.c in Sources */,
9A89D56527F802F600FF3F80 /* Generator.c in Sources */,
9A89D57527F802F600FF3F80 /* AxisLinesRenderer.c in Sources */,
9A6C7E002C41EED700676D27 /* Window_ios.m in Sources */,
9A89D55E27F802F600FF3F80 /* World.c in Sources */,
9A89D58627F802F600FF3F80 /* Screens.c in Sources */,
9A89D4F927F802F600FF3F80 /* Http_Worker.c in Sources */,
9A89D58B27F802F600FF3F80 /* Launcher.c in Sources */,
9A89D59027F802F600FF3F80 /* Stream.c in Sources */,
9A6C7DFC2C41E93700676D27 /* InputHandler.c in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXSourcesBuildPhase section */
/* Begin XCBuildConfiguration section */
9A89D36B27F802B400FF3F80 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_NONNULL = YES;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_ENABLE_OBJC_WEAK = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
CODE_SIGN_IDENTITY = "iPhone Developer";
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = dwarf;
ENABLE_STRICT_OBJC_MSGSEND = YES;
ENABLE_TESTABILITY = YES;
GCC_C_LANGUAGE_STANDARD = gnu11;
GCC_DYNAMIC_NO_PIC = NO;
GCC_NO_COMMON_BLOCKS = YES;
GCC_OPTIMIZATION_LEVEL = 0;
GCC_PREPROCESSOR_DEFINITIONS = (
"DEBUG=1",
"$(inherited)",
);
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 6.0;
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
MTL_FAST_MATH = YES;
ONLY_ACTIVE_ARCH = YES;
SDKROOT = iphoneos;
};
name = Debug;
};
9A89D36C27F802B400FF3F80 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_NONNULL = YES;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_ENABLE_OBJC_WEAK = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
CODE_SIGN_IDENTITY = "iPhone Developer";
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
ENABLE_NS_ASSERTIONS = NO;
ENABLE_STRICT_OBJC_MSGSEND = YES;
GCC_C_LANGUAGE_STANDARD = gnu11;
GCC_NO_COMMON_BLOCKS = YES;
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 6.0;
MTL_ENABLE_DEBUG_INFO = NO;
MTL_FAST_MATH = YES;
SDKROOT = iphoneos;
VALIDATE_PRODUCT = YES;
};
name = Release;
};
9A89D36E27F802B400FF3F80 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CODE_SIGN_STYLE = Automatic;
INFOPLIST_FILE = Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 6.0;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
);
PRODUCT_BUNDLE_IDENTIFIER = com.classicube.client.ios;
PRODUCT_NAME = "$(TARGET_NAME)";
TARGETED_DEVICE_FAMILY = "1,2";
};
name = Debug;
};
9A89D36F27F802B400FF3F80 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CODE_SIGN_STYLE = Automatic;
INFOPLIST_FILE = Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 6.0;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
);
PRODUCT_BUNDLE_IDENTIFIER = com.classicube.client.ios;
PRODUCT_NAME = "$(TARGET_NAME)";
TARGETED_DEVICE_FAMILY = "1,2";
};
name = Release;
};
/* End XCBuildConfiguration section */
/* Begin XCConfigurationList section */
9A89D35227F802B100FF3F80 /* Build configuration list for PBXProject "CCIOS" */ = {
isa = XCConfigurationList;
buildConfigurations = (
9A89D36B27F802B400FF3F80 /* Debug */,
9A89D36C27F802B400FF3F80 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
9A89D36D27F802B400FF3F80 /* Build configuration list for PBXNativeTarget "ClassiCube" */ = {
isa = XCConfigurationList;
buildConfigurations = (
9A89D36E27F802B400FF3F80 /* Debug */,
9A89D36F27F802B400FF3F80 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
/* End XCConfigurationList section */
};
rootObject = 9A89D34F27F802B100FF3F80 /* Project object */;
}

141
misc/ios/Info.plist Normal file
View File

@@ -0,0 +1,141 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDisplayName</key>
<string>ClassiCube</string>
<key>CFBundleExecutable</key>
<string>ClassiCube</string>
<key>CFBundleIdentifier</key>
<string>com.classicube.client.ios</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>ClassiCube</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleVersion</key>
<string>1</string>
<key>LSRequiresIPhoneOS</key>
<false/>
<key>NSPhotoLibraryAddUsageDescription</key>
<string>Saving screenshot</string>
<key>UILaunchStoryboardName</key>
<string>LaunchScreen</string>
<key>CFBundleIcons</key>
<dict>
<key>CFBundlePrimaryIcon</key>
<dict>
<key>CFBundleIconName</key>
<string>AppIcon</string>
<key>CFBundleIconFiles</key>
<array>
<string>AppIcon40x40</string>
<string>AppIcon60x60</string>
</array>
</dict>
</dict>
<key>CFBundleIcons~ipad</key>
<dict>
<key>CFBundlePrimaryIcon</key>
<dict>
<key>CFBundleIconName</key>
<string>AppIcon</string>
<key>CFBundleIconFiles</key>
<array>
<string>AppIcon40x40</string>
<string>AppIcon60x60</string>
<string>AppIcon76x76</string>
<string>AppIcon83.5x83.5</string>
</array>
</dict>
</dict>
<key>UISupportedInterfaceOrientations</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
<key>UISupportedInterfaceOrientations~ipad</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationPortraitUpsideDown</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
<key>UTImportedTypeDeclarations</key>
<array>
<dict>
<key>UTTypeIdentifier</key>
<string>com.classicube.client.ios-cw</string>
<key>UTTypeConformsTo</key>
<array>
<string>public.data</string>
</array>
<key>UTTypeDescription</key>
<string>ClassiCube map format</string>
<key>UTTypeTagSpecification</key>
<dict>
<key>public.filename-extension</key>
<array>
<string>cw</string>
</array>
</dict>
</dict>
<dict>
<key>UTTypeIdentifier</key>
<string>com.classicube.client.ios-dat</string>
<key>UTTypeConformsTo</key>
<array>
<string>public.data</string>
</array>
<key>UTTypeDescription</key>
<string>Classic map format</string>
<key>UTTypeTagSpecification</key>
<dict>
<key>public.filename-extension</key>
<array>
<string>dat</string>
<string>mine</string>
</array>
</dict>
</dict>
<dict>
<key>UTTypeIdentifier</key>
<string>com.classicube.client.ios-lvl</string>
<key>UTTypeConformsTo</key>
<array>
<string>public.data</string>
</array>
<key>UTTypeDescription</key>
<string>MCSharp map format</string>
<key>UTTypeTagSpecification</key>
<dict>
<key>public.filename-extension</key>
<array>
<string>lvl</string>
</array>
</dict>
</dict>
<dict>
<key>UTTypeIdentifier</key>
<string>com.classicube.client.ios-fcm</string>
<key>UTTypeConformsTo</key>
<array>
<string>public.data</string>
</array>
<key>UTTypeDescription</key>
<string>fCraft map format</string>
<key>UTTypeTagSpecification</key>
<dict>
<key>public.filename-extension</key>
<array>
<string>fcm</string>
</array>
</dict>
</dict>
</array>
</dict>
</plist>

View File

@@ -0,0 +1,43 @@
DESKTOP_FILE=ClassiCube.desktop
GAME_DIR=`pwd`
# remove existing ClassiCube desktop entry file
rm $DESKTOP_FILE
# download ClassiCube icon from github if necessary
if [ -f "CCicon.png" ]
then
echo "CCicon.png exists already. Skipping download."
else
echo "CCicon.png doesn't exist. Attempting to download it.."
wget "https://raw.githubusercontent.com/ClassiCube/classicube/master/misc/CCicon.png"
fi
# create ClassiCube desktop entry
echo 'Creating ClassiCube.desktop..'
cat >> $DESKTOP_FILE << EOF
[Desktop Entry]
Type=Application
Comment=Minecraft Classic inspired sandbox game
Name=ClassiCube
Exec=$GAME_DIR/ClassiCube
Icon=$GAME_DIR/CCicon.png
Path=$GAME_DIR
Terminal=false
Categories=Game;
Actions=singleplayer;resume;
[Desktop Action singleplayer]
Name=Start singleplayer
Exec=$GAME_DIR/ClassiCube --singleplayer
[Desktop Action resume]
Name=Resume last server
Exec=$GAME_DIR/ClassiCube --resume
EOF
chmod +x $DESKTOP_FILE
echo 'Installing ClassiCube.desktop..'
# install ClassiCube desktop entry into the system
sudo desktop-file-install --dir=/usr/share/applications ClassiCube.desktop
sudo update-desktop-database /usr/share/applications

70
misc/macOS/CCIcon_mac.h Normal file
View File

@@ -0,0 +1,70 @@
/* Generated using misc/macOS/mac_icon_gen.cs */
static const unsigned int CCIcon_Data[] = {
0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x39000000,0xB8000000,0xC0000000,0x40000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,
0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x39000000,0xB9000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xC0000000,0x40000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,
0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x39000000,0xB9000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xBF000000,0x40000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,
0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x39000000,0xB9000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF303030,0xFFAEAEAE,0xFFB5B5B5,0xFF373737,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xC0000000,0x40000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,
0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x39000000,0xB9000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF303030,0xFFAFAFAF,0xFFFDFDFD,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFB5B5B5,0xFF363636,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xC0000000,0x40000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,
0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x39000000,0xB8000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF303030,0xFFAFAFAF,0xFFFDFDFD,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFB5B5B5,0xFF373737,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xBF000000,0x40000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,
0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x39000000,0xB9000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF303030,0xFFAEAEAE,0xFFFDFDFD,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFB5B5B5,0xFF363636,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xBF000000,0x40000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,
0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x39000000,0xB8000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF303030,0xFFAFAFAF,0xFFFDFDFD,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFB5B5B5,0xFF373737,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xC0000000,0x40000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,
0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x39000000,0xB9000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF303030,0xFFAEAEAE,0xFFFDFDFD,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFB6B6B6,0xFF363636,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xBF000000,0x40000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,
0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x39000000,0xB8000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF313131,0xFFAEAEAE,0xFFFDFDFD,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFB5B5B5,0xFF373737,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xBF000000,0x40000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,
0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x39000000,0xB9000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF303030,0xFFAEAEAE,0xFFFDFDFD,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFB5B5B5,0xFF373737,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xC0000000,0x40000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,
0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x39000000,0xB9000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF313131,0xFFAEAEAE,0xFFFDFDFD,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFB5B5B5,0xFF373737,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xBF000000,0x40000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,
0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x39000000,0xB9000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF303030,0xFFAFAFAF,0xFFFDFDFD,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFB5B5B5,0xFF373737,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xBF000000,0x40000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,
0x00000000,0x00000000,0x00000000,0x00000000,0x39000000,0xB9000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF303030,0xFFAEAEAE,0xFFFDFDFD,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFB5B5B5,0xFF363636,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xBF000000,0x40000000,0x00000000,0x00000000,0x00000000,0x00000000,
0x00000000,0x00000000,0x00000000,0x96000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF303030,0xFFAFAFAF,0xFFFDFDFD,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFB5B5B5,0xFF373737,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0x9B000000,0x00000000,0x00000000,0x00000000,
0x00000000,0x00000000,0x00000000,0xBF000000,0xFF000000,0xFF000000,0xFF303030,0xFFAEAEAE,0xFFFDFDFD,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFB6B6B6,0xFF363636,0xFF000000,0xFF000000,0xBF000000,0x00000000,0x00000000,0x00000000,
0x00000000,0x00000000,0x00000000,0xBF000000,0xFF000000,0xFF080808,0xFFFDFDFD,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFF2F2F2,0xFFD2D2D2,0xFF060606,0xFF000000,0xBF000000,0x00000000,0x00000000,0x00000000,
0x00000000,0x00000000,0x00000000,0xBF000000,0xFF000000,0xFF090909,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFF2F2F2,0xFFD2D2D2,0xFFBEBEBE,0xFFBDBDBD,0xFF070707,0xFF000000,0xBF000000,0x00000000,0x00000000,0x00000000,
0x00000000,0x00000000,0x00000000,0xBF000000,0xFF000000,0xFF090909,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFF2F2F2,0xFFD2D2D2,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFF070707,0xFF000000,0xBF000000,0x00000000,0x00000000,0x00000000,
0x00000000,0x00000000,0x00000000,0xBF000000,0xFF000000,0xFF090909,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFF2F2F2,0xFFD2D2D2,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFF070707,0xFF000000,0xBF000000,0x00000000,0x00000000,0x00000000,
0x00000000,0x00000000,0x00000000,0xBF000000,0xFF000000,0xFF090909,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFF2F2F2,0xFFD2D2D2,0xFFBEBEBE,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFF070707,0xFF000000,0xBF000000,0x00000000,0x00000000,0x00000000,
0x00000000,0x00000000,0x00000000,0xBF000000,0xFF000000,0xFF090909,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFF2F2F2,0xFFD2D2D2,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFF070707,0xFF000000,0xBF000000,0x00000000,0x00000000,0x00000000,
0x00000000,0x00000000,0x00000000,0xBF000000,0xFF000000,0xFF090909,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFF2F2F2,0xFFD2D2D2,0xFFBEBEBE,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFF070707,0xFF000000,0xBF000000,0x00000000,0x00000000,0x00000000,
0x00000000,0x00000000,0x00000000,0xBF000000,0xFF000000,0xFF090909,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFF2F2F2,0xFFD2D2D2,0xFFBDBDBD,0xFFBDBDBD,0xFFBFBFBF,0xFFD6D6D6,0xFFEBEBEB,0xFFF6F6F6,0xFFF5F5F5,0xFFEAEAEA,0xFFCFCFCF,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFF070707,0xFF000000,0xBF000000,0x00000000,0x00000000,0x00000000,
0x00000000,0x00000000,0x00000000,0xBF000000,0xFF000000,0xFF090909,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFCFCFC,0xFFEDEDED,0xFFE4E4E4,0xFFE7E7E7,0xFFF2F2F2,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFF2F2F2,0xFFD2D2D2,0xFFBEBEBE,0xFFBDBDBD,0xFFBDBDBD,0xFFD4D4D4,0xFFF7F7F7,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFCFCFC,0xFFC2C2C2,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFF070707,0xFF000000,0xBF000000,0x00000000,0x00000000,0x00000000,
0x00000000,0x00000000,0x00000000,0xBF000000,0xFF000000,0xFF090909,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFE7E7E7,0xFFC3C3C3,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFC6C6C6,0xFFE1E1E1,0xFFFCFCFC,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFF2F2F2,0xFFD2D2D2,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFC0C0C0,0xFFE9E9E9,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFE1E1E1,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFF070707,0xFF000000,0xBF000000,0x00000000,0x00000000,0x00000000,
0x00000000,0x00000000,0x00000000,0xBF000000,0xFF000000,0xFF090909,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFE4E4E4,0xFFBEBEBE,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFC6C6C6,0xFFEFEFEF,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFF2F2F2,0xFFD2D2D2,0xFFBEBEBE,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFC2C2C2,0xFFF1F1F1,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFBFBFB,0xFFC3C3C3,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFF070707,0xFF000000,0xBF000000,0x00000000,0x00000000,0x00000000,
0x00000000,0x00000000,0x00000000,0xBF000000,0xFF000000,0xFF090909,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFF5F5F5,0xFFBFBFBF,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBFBFBF,0xFFE6E6E6,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFF2F2F2,0xFFD2D2D2,0xFFBEBEBE,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFC0C0C0,0xFFF1F1F1,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFE0E0E0,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFF070707,0xFF000000,0xBF000000,0x00000000,0x00000000,0x00000000,
0x00000000,0x00000000,0x00000000,0xBF000000,0xFF000000,0xFF090909,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFD6D6D6,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBEBEBE,0xFFE5E5E5,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFF2F2F2,0xFFD2D2D2,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFEAEAEA,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFF4F4F4,0xFFE8E8E8,0xFFF2F2F2,0xFFFAFAFA,0xFFC2C2C2,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFF070707,0xFF000000,0xBF000000,0x00000000,0x00000000,0x00000000,
0x00000000,0x00000000,0x00000000,0xBF000000,0xFF000000,0xFF090909,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFDFDFD,0xFFC1C1C1,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBEBEBE,0xFFEDEDED,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFBEBEBE,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFD9D9D9,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFF7F7F7,0xFFD0D0D0,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFC4C4C4,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFF070707,0xFF000000,0xBF000000,0x00000000,0x00000000,0x00000000,
0x00000000,0x00000000,0x00000000,0xBF000000,0xFF000000,0xFF090909,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFEEEEEE,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFC9C9C9,0xFFE0E0E0,0xFFE0E0E0,0xFFCDCDCD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFC3C3C3,0xFFF8F8F8,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFC6C6C6,0xFFFCFCFC,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFF4F4F4,0xFFC3C3C3,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFF070707,0xFF000000,0xBF000000,0x00000000,0x00000000,0x00000000,
0x00000000,0x00000000,0x00000000,0xBF000000,0xFF000000,0xFF090909,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFE3E3E3,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFCDCDCD,0xFFFCFCFC,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFE9E9E9,0xFFC1C1C1,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFD3D3D3,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFE9E9E9,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFBFBFB,0xFFC6C6C6,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFF070707,0xFF000000,0xBF000000,0x00000000,0x00000000,0x00000000,
0x00000000,0x00000000,0x00000000,0xBF000000,0xFF000000,0xFF090909,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFDCDCDC,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBEBEBE,0xFFF3F3F3,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFF0F0F0,0xFFC0C0C0,0xFFBDBDBD,0xFFBDBDBD,0xFFC4C4C4,0xFFFAFAFA,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFCACACA,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFD9D9D9,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFF070707,0xFF000000,0xBF000000,0x00000000,0x00000000,0x00000000,
0x00000000,0x00000000,0x00000000,0xBF000000,0xFF000000,0xFF090909,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFD7D7D7,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFC9C9C9,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFE7E7E7,0xFFBDBDBD,0xFFC5C5C5,0xFFF5F5F5,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFE7E7E7,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFF7F7F7,0xFFBEBEBE,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFF070707,0xFF000000,0xBF000000,0x00000000,0x00000000,0x00000000,
0x00000000,0x00000000,0x00000000,0xBF000000,0xFF000000,0xFF090909,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFD7D7D7,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFD8D8D8,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFDADADA,0xFFF6F6F6,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFC2C2C2,0xFFFCFCFC,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFDCDCDC,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFF070707,0xFF000000,0xBF000000,0x00000000,0x00000000,0x00000000,
0x00000000,0x00000000,0x00000000,0xBF000000,0xFF000000,0xFF090909,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFD8D8D8,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFDFDFDF,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFD7D7D7,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFC6C6C6,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFF070707,0xFF000000,0xBF000000,0x00000000,0x00000000,0x00000000,
0x00000000,0x00000000,0x00000000,0xBF000000,0xFF000000,0xFF090909,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFDDDDDD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFE1E1E1,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFEBEBEB,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFF6F6F6,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFF070707,0xFF000000,0xBF000000,0x00000000,0x00000000,0x00000000,
0x00000000,0x00000000,0x00000000,0xBF000000,0xFF000000,0xFF090909,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFE3E3E3,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFE0E0E0,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBFBFBF,0xFFFAFAFA,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFE9E9E9,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFF070707,0xFF000000,0xBF000000,0x00000000,0x00000000,0x00000000,
0x00000000,0x00000000,0x00000000,0xBF000000,0xFF000000,0xFF090909,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFECECEC,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFDDDDDD,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFC8C8C8,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFE1E1E1,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFF070707,0xFF000000,0xBF000000,0x00000000,0x00000000,0x00000000,
0x00000000,0x00000000,0x00000000,0xBF000000,0xFF000000,0xFF090909,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFF9F9F9,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFD5D5D5,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFD2D2D2,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFDDDDDD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFF070707,0xFF000000,0xBF000000,0x00000000,0x00000000,0x00000000,
0x00000000,0x00000000,0x00000000,0xBF000000,0xFF000000,0xFF090909,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFC7C7C7,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFC9C9C9,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFDCDCDC,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFDDDDDD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFF070707,0xFF000000,0xBF000000,0x00000000,0x00000000,0x00000000,
0x00000000,0x00000000,0x00000000,0xBF000000,0xFF000000,0xFF090909,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFDADADA,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBEBEBE,0xFFF9F9F9,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFE0E0E0,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFDEDEDE,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFC2C2C2,0xFFC2C2C2,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFF070707,0xFF000000,0xBF000000,0x00000000,0x00000000,0x00000000,
0x00000000,0x00000000,0x00000000,0xBF000000,0xFF000000,0xFF090909,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFF0F0F0,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFE6E6E6,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFE3E3E3,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFE4E4E4,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFE4E4E4,0xFFF3F3F3,0xFFC4C4C4,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFF070707,0xFF000000,0xBF000000,0x00000000,0x00000000,0x00000000,
0x00000000,0x00000000,0x00000000,0xBF000000,0xFF000000,0xFF090909,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFC8C8C8,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFCCCCCC,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFE3E3E3,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFF0F0F0,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFD1D1D1,0xFFFEFEFE,0xFFFEFEFE,0xFFF5F5F5,0xFFC6C6C6,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFF070707,0xFF000000,0xBF000000,0x00000000,0x00000000,0x00000000,
0x00000000,0x00000000,0x00000000,0xBF000000,0xFF000000,0xFF090909,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFE5E5E5,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFEBEBEB,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFE0E0E0,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFDFDFD,0xFFC5C5C5,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFCACACA,0xFFFAFAFA,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFD1D1D1,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFF070707,0xFF000000,0xBF000000,0x00000000,0x00000000,0x00000000,
0x00000000,0x00000000,0x00000000,0xBF000000,0xFF000000,0xFF090909,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFDFDFD,0xFFC6C6C6,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFC5C5C5,0xFFFAFAFA,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFDBDBDB,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFE7E7E7,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFD0D0D0,0xFFFAFAFA,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFECECEC,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFF070707,0xFF000000,0xBF000000,0x00000000,0x00000000,0x00000000,
0x00000000,0x00000000,0x00000000,0xBF000000,0xFF000000,0xFF090909,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFEBEBEB,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFCCCCCC,0xFFFAFAFA,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFD0D0D0,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFE9E9E9,0xFFD3D3D3,0xFFD6D6D6,0xFFECECEC,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFAFAFA,0xFFC5C5C5,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFF070707,0xFF000000,0xBF000000,0x00000000,0x00000000,0x00000000,
0x00000000,0x00000000,0x00000000,0xBF000000,0xFF000000,0xFF080808,0xFFFDFDFD,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFD4D4D4,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFC7C7C7,0xFFEEEEEE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFF0F0F0,0xFFFCFCFC,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFC3C3C3,0xFFFDFDFD,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFD2D2D2,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFF060606,0xFF000000,0xBF000000,0x00000000,0x00000000,0x00000000,
0x00000000,0x00000000,0x00000000,0xBF000000,0xFF000000,0xFF000000,0xFF303030,0xFFAEAEAE,0xFFFDFDFD,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFBFBFB,0xFFC8C8C8,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFC8C8C8,0xFFD3D3D3,0xFFCCCCCC,0xFFBEBEBE,0xFFE2E2E2,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFEEEEEE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFDADADA,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFF878787,0xFF282828,0xFF000000,0xFF000000,0xBF000000,0x00000000,0x00000000,0x00000000,
0x00000000,0x00000000,0x00000000,0x96000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF303030,0xFFAFAFAF,0xFFFDFDFD,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFF6F6F6,0xFFC4C4C4,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFC3C3C3,0xFFFCFCFC,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFD2D2D2,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFDFDFD,0xFFD9D9D9,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFF878787,0xFF292929,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0x9B000000,0x00000000,0x00000000,0x00000000,
0x00000000,0x00000000,0x00000000,0x00000000,0x39000000,0xB9000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF303030,0xFFAEAEAE,0xFFFDFDFD,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFF4F4F4,0xFFC6C6C6,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFE0E0E0,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFE9E9E9,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFF7F7F7,0xFFCECECE,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFF878787,0xFF282828,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xBF000000,0x40000000,0x00000000,0x00000000,0x00000000,0x00000000,
0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x39000000,0xB9000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF303030,0xFFAFAFAF,0xFFFDFDFD,0xFFFEFEFE,0xFFFEFEFE,0xFFF8F8F8,0xFFCECECE,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFC2C2C2,0xFFFAFAFA,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFC0C0C0,0xFFE7E7E7,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFF8F8F8,0xFFDDDDDD,0xFFC0C0C0,0xFFBDBDBD,0xFFBDBDBD,0xFF878787,0xFF292929,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xBF000000,0x40000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,
0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x39000000,0xB9000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF313131,0xFFAEAEAE,0xFFFDFDFD,0xFFFEFEFE,0xFFFEFEFE,0xFFE3E3E3,0xFFC3C3C3,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFE8E8E8,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFC9C9C9,0xFFDCDCDC,0xFFE1E1E1,0xFFDCDCDC,0xFFCFCFCF,0xFFBFBFBF,0xFFBDBDBD,0xFFBDBDBD,0xFF878787,0xFF292929,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xBF000000,0x40000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,
0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x39000000,0xB9000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF303030,0xFFAEAEAE,0xFFFDFDFD,0xFFFEFEFE,0xFFFBFBFB,0xFFE4E4E4,0xFFD0D0D0,0xFFC4C4C4,0xFFC3C3C3,0xFFCFCFCF,0xFFEBEBEB,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFF878787,0xFF292929,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xC0000000,0x40000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,
0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x39000000,0xB8000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF313131,0xFFAEAEAE,0xFFFDFDFD,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFF878787,0xFF292929,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xBF000000,0x40000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,
0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x39000000,0xB9000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF303030,0xFFAEAEAE,0xFFFDFDFD,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFF878787,0xFF282828,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xBF000000,0x40000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,
0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x39000000,0xB8000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF303030,0xFFAFAFAF,0xFFFDFDFD,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFF878787,0xFF292929,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xC0000000,0x40000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,
0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x39000000,0xB9000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF303030,0xFFAEAEAE,0xFFFDFDFD,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFF878787,0xFF282828,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xBF000000,0x40000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,
0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x39000000,0xB8000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF303030,0xFFAFAFAF,0xFFFDFDFD,0xFFFEFEFE,0xFFFEFEFE,0xFFFEFEFE,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFFBDBDBD,0xFF878787,0xFF292929,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xBF000000,0x40000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,
0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x39000000,0xB9000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF303030,0xFFAFAFAF,0xFFFDFDFD,0xFFFEFEFE,0xFFBDBDBD,0xFFBDBDBD,0xFF878787,0xFF292929,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xC0000000,0x40000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,
0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x39000000,0xB9000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF303030,0xFFAEAEAE,0xFF878787,0xFF292929,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xC0000000,0x40000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,
0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x39000000,0xB9000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xBF000000,0x40000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,
0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x39000000,0xB9000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xC0000000,0x40000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,
0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x39000000,0xB8000000,0xC0000000,0x40000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,
};
static const int CCIcon_Width = 64;
static const int CCIcon_Height = 64;

View File

@@ -0,0 +1,785 @@
// !$*UTF8*$!
{
archiveVersion = 1;
classes = {
};
objectVersion = 50;
objects = {
/* Begin PBXBuildFile section */
9A6C7C8D2C073E0C00676D27 /* Vectors.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A6C7BE92C073DEC00676D27 /* Vectors.c */; };
9A6C7C8E2C073E0C00676D27 /* _ftglyph.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A6C7BEB2C073DEC00676D27 /* _ftglyph.c */; };
9A6C7C8F2C073E0C00676D27 /* Input.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A6C7BF02C073DED00676D27 /* Input.c */; };
9A6C7C902C073E0C00676D27 /* Options.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A6C7BF12C073DED00676D27 /* Options.c */; };
9A6C7C912C073E0C00676D27 /* _ftbitmap.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A6C7BF22C073DED00676D27 /* _ftbitmap.c */; };
9A6C7C922C073E0C00676D27 /* _autofit.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A6C7BF52C073DED00676D27 /* _autofit.c */; };
9A6C7C932C073E0C00676D27 /* Menus.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A6C7BF82C073DED00676D27 /* Menus.c */; };
9A6C7C942C073E0C00676D27 /* LWeb.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A6C7BFA2C073DEE00676D27 /* LWeb.c */; };
9A6C7C952C073E0C00676D27 /* Generator.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A6C7BFB2C073DEE00676D27 /* Generator.c */; };
9A6C7C962C073E0C00676D27 /* Screens.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A6C7BFD2C073DEE00676D27 /* Screens.c */; };
9A6C7C972C073E0C00676D27 /* SSL.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A6C7BFE2C073DEE00676D27 /* SSL.c */; };
9A6C7C982C073E0C00676D27 /* LBackend_Android.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A6C7BFF2C073DEE00676D27 /* LBackend_Android.c */; };
9A6C7C992C073E0C00676D27 /* Window_SDL2.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A6C7C002C073DEE00676D27 /* Window_SDL2.c */; };
9A6C7C9A2C073E0C00676D27 /* Graphics_GL2.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A6C7C012C073DEE00676D27 /* Graphics_GL2.c */; };
9A6C7C9B2C073E0C00676D27 /* Lighting.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A6C7C022C073DEE00676D27 /* Lighting.c */; };
9A6C7C9C2C073E0C00676D27 /* EntityComponents.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A6C7C042C073DEF00676D27 /* EntityComponents.c */; };
9A6C7C9D2C073E0C00676D27 /* Game.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A6C7C052C073DEF00676D27 /* Game.c */; };
9A6C7C9E2C073E0C00676D27 /* Platform_Posix.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A6C7C072C073DEF00676D27 /* Platform_Posix.c */; };
9A6C7C9F2C073E0C00676D27 /* Utils.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A6C7C082C073DEF00676D27 /* Utils.c */; };
9A6C7CA02C073E0C00676D27 /* Resources.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A6C7C092C073DEF00676D27 /* Resources.c */; };
9A6C7CA12C073E0C00676D27 /* AudioBackend.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A6C7C0A2C073DF000676D27 /* AudioBackend.c */; };
9A6C7CA22C073E0C00676D27 /* Queue.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A6C7C0B2C073DF000676D27 /* Queue.c */; };
9A6C7CA32C073E0C00676D27 /* _smooth.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A6C7C0E2C073DF100676D27 /* _smooth.c */; };
9A6C7CA42C073E0C00676D27 /* _pshinter.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A6C7C102C073DF100676D27 /* _pshinter.c */; };
9A6C7CA52C073E0C00676D27 /* Drawer2D.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A6C7C112C073DF100676D27 /* Drawer2D.c */; };
9A6C7CA62C073E0C00676D27 /* World.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A6C7C132C073DF200676D27 /* World.c */; };
9A6C7CA72C073E0C00676D27 /* _psaux.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A6C7C152C073DF200676D27 /* _psaux.c */; };
9A6C7CA82C073E0C00676D27 /* Window_SDL3.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A6C7C162C073DF200676D27 /* Window_SDL3.c */; };
9A6C7CA92C073E0C00676D27 /* TexturePack.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A6C7C1A2C073DF300676D27 /* TexturePack.c */; };
9A6C7CAA2C073E0C00676D27 /* Block.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A6C7C1C2C073DF300676D27 /* Block.c */; };
9A6C7CAB2C073E0C00676D27 /* _ftbase.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A6C7C1E2C073DF300676D27 /* _ftbase.c */; };
9A6C7CAC2C073E0C00676D27 /* LWidgets.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A6C7C1F2C073DF400676D27 /* LWidgets.c */; };
9A6C7CAD2C073E0C00676D27 /* PackedCol.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A6C7C202C073DF400676D27 /* PackedCol.c */; };
9A6C7CAE2C073E0C00676D27 /* Physics.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A6C7C212C073DF400676D27 /* Physics.c */; };
9A6C7CAF2C073E0C00676D27 /* GameVersion.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A6C7C242C073DF500676D27 /* GameVersion.c */; };
9A6C7CB02C073E0C00676D27 /* Particle.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A6C7C252C073DF500676D27 /* Particle.c */; };
9A6C7CB12C073E0C00676D27 /* Graphics_SoftGPU.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A6C7C282C073DF500676D27 /* Graphics_SoftGPU.c */; };
9A6C7CB22C073E0C00676D27 /* MapRenderer.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A6C7C292C073DF500676D27 /* MapRenderer.c */; };
9A6C7CB32C073E0C00676D27 /* SelectionBox.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A6C7C2A2C073DF500676D27 /* SelectionBox.c */; };
9A6C7CB42C073E0C00676D27 /* Stream.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A6C7C2C2C073DF600676D27 /* Stream.c */; };
9A6C7CB52C073E0C00676D27 /* Formats.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A6C7C2D2C073DF600676D27 /* Formats.c */; };
9A6C7CB62C073E0C00676D27 /* Chat.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A6C7C2E2C073DF600676D27 /* Chat.c */; };
9A6C7CB72C073E0C00676D27 /* Graphics_GL1.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A6C7C2F2C073DF600676D27 /* Graphics_GL1.c */; };
9A6C7CB82C073E0C00676D27 /* Window_Terminal.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A6C7C302C073DF600676D27 /* Window_Terminal.c */; };
9A6C7CB92C073E0C00676D27 /* AxisLinesRenderer.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A6C7C342C073DF700676D27 /* AxisLinesRenderer.c */; };
9A6C7CBA2C073E0C00676D27 /* EnvRenderer.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A6C7C352C073DF700676D27 /* EnvRenderer.c */; };
9A6C7CBB2C073E0C00676D27 /* _ftsynth.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A6C7C382C073DF800676D27 /* _ftsynth.c */; };
9A6C7CBC2C073E0C00676D27 /* Logger.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A6C7C3C2C073DF800676D27 /* Logger.c */; };
9A6C7CBD2C073E0C00676D27 /* String.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A6C7C3E2C073DF900676D27 /* String.c */; };
9A6C7CBE2C073E0C00676D27 /* Protocol.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A6C7C3F2C073DF900676D27 /* Protocol.c */; };
9A6C7CBF2C073E0C00676D27 /* TouchUI.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A6C7C402C073DF900676D27 /* TouchUI.c */; };
9A6C7CC02C073E0C00676D27 /* _type1.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A6C7C412C073DF900676D27 /* _type1.c */; };
9A6C7CC12C073E0C00676D27 /* Event.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A6C7C452C073DFB00676D27 /* Event.c */; };
9A6C7CC22C073E0C00676D27 /* Launcher.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A6C7C462C073DFC00676D27 /* Launcher.c */; };
9A6C7CC32C073E0C00676D27 /* _sfnt.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A6C7C4A2C073DFD00676D27 /* _sfnt.c */; };
9A6C7CC42C073E0C00676D27 /* LScreens.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A6C7C4F2C073DFE00676D27 /* LScreens.c */; };
9A6C7CC52C073E0C00676D27 /* Commands.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A6C7C522C073DFF00676D27 /* Commands.c */; };
9A6C7CC62C073E0C00676D27 /* IsometricDrawer.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A6C7C552C073E0000676D27 /* IsometricDrawer.c */; };
9A6C7CC72C073E0C00676D27 /* HeldBlockRenderer.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A6C7C572C073E0000676D27 /* HeldBlockRenderer.c */; };
9A6C7CC82C073E0C00676D27 /* _psmodule.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A6C7C582C073E0100676D27 /* _psmodule.c */; };
9A6C7CC92C073E0C00676D27 /* Gui.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A6C7C5A2C073E0100676D27 /* Gui.c */; };
9A6C7CCA2C073E0C00676D27 /* _truetype.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A6C7C5B2C073E0200676D27 /* _truetype.c */; };
9A6C7CCB2C073E0C00676D27 /* Window_cocoa.m in Sources */ = {isa = PBXBuildFile; fileRef = 9A6C7C5E2C073E0200676D27 /* Window_cocoa.m */; };
9A6C7CCC2C073E0C00676D27 /* Vorbis.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A6C7C5F2C073E0200676D27 /* Vorbis.c */; };
9A6C7CCD2C073E0C00676D27 /* Inventory.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A6C7C602C073E0300676D27 /* Inventory.c */; };
9A6C7CCE2C073E0C00676D27 /* Animations.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A6C7C622C073E0300676D27 /* Animations.c */; };
9A6C7CCF2C073E0C00676D27 /* FancyLighting.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A6C7C632C073E0300676D27 /* FancyLighting.c */; };
9A6C7CD02C073E0C00676D27 /* Widgets.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A6C7C662C073E0400676D27 /* Widgets.c */; };
9A6C7CD12C073E0C00676D27 /* Picking.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A6C7C672C073E0400676D27 /* Picking.c */; };
9A6C7CD22C073E0C00676D27 /* _ftinit.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A6C7C682C073E0400676D27 /* _ftinit.c */; };
9A6C7CD32C073E0C00676D27 /* Http_Worker.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A6C7C6B2C073E0500676D27 /* Http_Worker.c */; };
9A6C7CD42C073E0C00676D27 /* ExtMath.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A6C7C6D2C073E0500676D27 /* ExtMath.c */; };
9A6C7CD52C073E0C00676D27 /* _cff.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A6C7C6F2C073E0600676D27 /* _cff.c */; };
9A6C7CD62C073E0C00676D27 /* Camera.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A6C7C702C073E0600676D27 /* Camera.c */; };
9A6C7CD72C073E0C00676D27 /* Drawer.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A6C7C712C073E0600676D27 /* Drawer.c */; };
9A6C7CD82C073E0C00676D27 /* Entity.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A6C7C722C073E0600676D27 /* Entity.c */; };
9A6C7CD92C073E0C00676D27 /* SystemFonts.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A6C7C742C073E0700676D27 /* SystemFonts.c */; };
9A6C7CDA2C073E0C00676D27 /* BlockPhysics.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A6C7C762C073E0700676D27 /* BlockPhysics.c */; };
9A6C7CDB2C073E0C00676D27 /* main.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A6C7C772C073E0700676D27 /* main.c */; };
9A6C7CDC2C073E0C00676D27 /* Model.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A6C7C792C073E0800676D27 /* Model.c */; };
9A6C7CDD2C073E0C00676D27 /* Graphics_Metal.m in Sources */ = {isa = PBXBuildFile; fileRef = 9A6C7C7A2C073E0800676D27 /* Graphics_Metal.m */; };
9A6C7CDE2C073E0C00676D27 /* SelOutlineRenderer.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A6C7C7D2C073E0800676D27 /* SelOutlineRenderer.c */; };
9A6C7CDF2C073E0C00676D27 /* EntityRenderers.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A6C7C7E2C073E0900676D27 /* EntityRenderers.c */; };
9A6C7CE02C073E0C00676D27 /* LBackend.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A6C7C802C073E0900676D27 /* LBackend.c */; };
9A6C7CE12C073E0C00676D27 /* Builder.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A6C7C812C073E0900676D27 /* Builder.c */; };
9A6C7CE22C073E0C00676D27 /* Server.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A6C7C832C073E0A00676D27 /* Server.c */; };
9A6C7CE32C073E0C00676D27 /* Audio.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A6C7C842C073E0A00676D27 /* Audio.c */; };
9A6C7CE42C073E0C00676D27 /* Deflate.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A6C7C852C073E0A00676D27 /* Deflate.c */; };
9A6C7CE52C073E0C00676D27 /* Bitmap.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A6C7C892C073E0B00676D27 /* Bitmap.c */; };
/* End PBXBuildFile section */
/* Begin PBXCopyFilesBuildPhase section */
9A6C796F2C073BFF00676D27 /* CopyFiles */ = {
isa = PBXCopyFilesBuildPhase;
buildActionMask = 2147483647;
dstPath = /usr/share/man/man1/;
dstSubfolderSpec = 0;
files = (
);
runOnlyForDeploymentPostprocessing = 1;
};
/* End PBXCopyFilesBuildPhase section */
/* Begin PBXFileReference section */
9A6C79712C073BFF00676D27 /* ClassiCube */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = ClassiCube; sourceTree = BUILT_PRODUCTS_DIR; };
9A6C7BE92C073DEC00676D27 /* Vectors.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = Vectors.c; path = "../../../../../../ClassiCube-master/src/Vectors.c"; sourceTree = "<group>"; };
9A6C7BEA2C073DEC00676D27 /* TexturePack.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TexturePack.h; path = "../../../../../../ClassiCube-master/src/TexturePack.h"; sourceTree = "<group>"; };
9A6C7BEB2C073DEC00676D27 /* _ftglyph.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = _ftglyph.c; path = "../../../../../../ClassiCube-master/src/_ftglyph.c"; sourceTree = "<group>"; };
9A6C7BEC2C073DED00676D27 /* Constants.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Constants.h; path = "../../../../../../ClassiCube-master/src/Constants.h"; sourceTree = "<group>"; };
9A6C7BED2C073DED00676D27 /* Stream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Stream.h; path = "../../../../../../ClassiCube-master/src/Stream.h"; sourceTree = "<group>"; };
9A6C7BEE2C073DED00676D27 /* VirtualKeyboard.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = VirtualKeyboard.h; path = "../../../../../../ClassiCube-master/src/VirtualKeyboard.h"; sourceTree = "<group>"; };
9A6C7BEF2C073DED00676D27 /* Commands.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Commands.h; path = "../../../../../../ClassiCube-master/src/Commands.h"; sourceTree = "<group>"; };
9A6C7BF02C073DED00676D27 /* Input.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = Input.c; path = "../../../../../../ClassiCube-master/src/Input.c"; sourceTree = "<group>"; };
9A6C7BF12C073DED00676D27 /* Options.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = Options.c; path = "../../../../../../ClassiCube-master/src/Options.c"; sourceTree = "<group>"; };
9A6C7BF22C073DED00676D27 /* _ftbitmap.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = _ftbitmap.c; path = "../../../../../../ClassiCube-master/src/_ftbitmap.c"; sourceTree = "<group>"; };
9A6C7BF32C073DED00676D27 /* EntityComponents.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = EntityComponents.h; path = "../../../../../../ClassiCube-master/src/EntityComponents.h"; sourceTree = "<group>"; };
9A6C7BF42C073DED00676D27 /* LWeb.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = LWeb.h; path = "../../../../../../ClassiCube-master/src/LWeb.h"; sourceTree = "<group>"; };
9A6C7BF52C073DED00676D27 /* _autofit.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = _autofit.c; path = "../../../../../../ClassiCube-master/src/_autofit.c"; sourceTree = "<group>"; };
9A6C7BF62C073DED00676D27 /* _PlatformConsole.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = _PlatformConsole.h; path = "../../../../../../ClassiCube-master/src/_PlatformConsole.h"; sourceTree = "<group>"; };
9A6C7BF72C073DED00676D27 /* Physics.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Physics.h; path = "../../../../../../ClassiCube-master/src/Physics.h"; sourceTree = "<group>"; };
9A6C7BF82C073DED00676D27 /* Menus.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = Menus.c; path = "../../../../../../ClassiCube-master/src/Menus.c"; sourceTree = "<group>"; };
9A6C7BF92C073DED00676D27 /* Platform.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Platform.h; path = "../../../../../../ClassiCube-master/src/Platform.h"; sourceTree = "<group>"; };
9A6C7BFA2C073DEE00676D27 /* LWeb.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = LWeb.c; path = "../../../../../../ClassiCube-master/src/LWeb.c"; sourceTree = "<group>"; };
9A6C7BFB2C073DEE00676D27 /* Generator.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = Generator.c; path = "../../../../../../ClassiCube-master/src/Generator.c"; sourceTree = "<group>"; };
9A6C7BFC2C073DEE00676D27 /* Particle.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Particle.h; path = "../../../../../../ClassiCube-master/src/Particle.h"; sourceTree = "<group>"; };
9A6C7BFD2C073DEE00676D27 /* Screens.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = Screens.c; path = "../../../../../../ClassiCube-master/src/Screens.c"; sourceTree = "<group>"; };
9A6C7BFE2C073DEE00676D27 /* SSL.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = SSL.c; path = "../../../../../../ClassiCube-master/src/SSL.c"; sourceTree = "<group>"; };
9A6C7BFF2C073DEE00676D27 /* LBackend_Android.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = LBackend_Android.c; path = "../../../../../../ClassiCube-master/src/LBackend_Android.c"; sourceTree = "<group>"; };
9A6C7C002C073DEE00676D27 /* Window_SDL2.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = Window_SDL2.c; path = "../../../../../../ClassiCube-master/src/Window_SDL2.c"; sourceTree = "<group>"; };
9A6C7C012C073DEE00676D27 /* Graphics_GL2.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = Graphics_GL2.c; path = "../../../../../../ClassiCube-master/src/Graphics_GL2.c"; sourceTree = "<group>"; };
9A6C7C022C073DEE00676D27 /* Lighting.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = Lighting.c; path = "../../../../../../ClassiCube-master/src/Lighting.c"; sourceTree = "<group>"; };
9A6C7C032C073DEF00676D27 /* Http.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Http.h; path = "../../../../../../ClassiCube-master/src/Http.h"; sourceTree = "<group>"; };
9A6C7C042C073DEF00676D27 /* EntityComponents.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = EntityComponents.c; path = "../../../../../../ClassiCube-master/src/EntityComponents.c"; sourceTree = "<group>"; };
9A6C7C052C073DEF00676D27 /* Game.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = Game.c; path = "../../../../../../ClassiCube-master/src/Game.c"; sourceTree = "<group>"; };
9A6C7C062C073DEF00676D27 /* Funcs.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Funcs.h; path = "../../../../../../ClassiCube-master/src/Funcs.h"; sourceTree = "<group>"; };
9A6C7C072C073DEF00676D27 /* Platform_Posix.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = Platform_Posix.c; path = "../../../../../../ClassiCube-master/src/Platform_Posix.c"; sourceTree = "<group>"; };
9A6C7C082C073DEF00676D27 /* Utils.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = Utils.c; path = "../../../../../../ClassiCube-master/src/Utils.c"; sourceTree = "<group>"; };
9A6C7C092C073DEF00676D27 /* Resources.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = Resources.c; path = "../../../../../../ClassiCube-master/src/Resources.c"; sourceTree = "<group>"; };
9A6C7C0A2C073DF000676D27 /* AudioBackend.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = AudioBackend.c; path = "../../../../../../ClassiCube-master/src/AudioBackend.c"; sourceTree = "<group>"; };
9A6C7C0B2C073DF000676D27 /* Queue.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = Queue.c; path = "../../../../../../ClassiCube-master/src/Queue.c"; sourceTree = "<group>"; };
9A6C7C0C2C073DF000676D27 /* PackedCol.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PackedCol.h; path = "../../../../../../ClassiCube-master/src/PackedCol.h"; sourceTree = "<group>"; };
9A6C7C0D2C073DF000676D27 /* Vectors.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Vectors.h; path = "../../../../../../ClassiCube-master/src/Vectors.h"; sourceTree = "<group>"; };
9A6C7C0E2C073DF100676D27 /* _smooth.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = _smooth.c; path = "../../../../../../ClassiCube-master/src/_smooth.c"; sourceTree = "<group>"; };
9A6C7C0F2C073DF100676D27 /* Vorbis.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Vorbis.h; path = "../../../../../../ClassiCube-master/src/Vorbis.h"; sourceTree = "<group>"; };
9A6C7C102C073DF100676D27 /* _pshinter.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = _pshinter.c; path = "../../../../../../ClassiCube-master/src/_pshinter.c"; sourceTree = "<group>"; };
9A6C7C112C073DF100676D27 /* Drawer2D.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = Drawer2D.c; path = "../../../../../../ClassiCube-master/src/Drawer2D.c"; sourceTree = "<group>"; };
9A6C7C122C073DF100676D27 /* Widgets.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Widgets.h; path = "../../../../../../ClassiCube-master/src/Widgets.h"; sourceTree = "<group>"; };
9A6C7C132C073DF200676D27 /* World.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = World.c; path = "../../../../../../ClassiCube-master/src/World.c"; sourceTree = "<group>"; };
9A6C7C142C073DF200676D27 /* Menus.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Menus.h; path = "../../../../../../ClassiCube-master/src/Menus.h"; sourceTree = "<group>"; };
9A6C7C152C073DF200676D27 /* _psaux.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = _psaux.c; path = "../../../../../../ClassiCube-master/src/_psaux.c"; sourceTree = "<group>"; };
9A6C7C162C073DF200676D27 /* Window_SDL3.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = Window_SDL3.c; path = "../../../../../../ClassiCube-master/src/Window_SDL3.c"; sourceTree = "<group>"; };
9A6C7C172C073DF200676D27 /* Lighting.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Lighting.h; path = "../../../../../../ClassiCube-master/src/Lighting.h"; sourceTree = "<group>"; };
9A6C7C182C073DF300676D27 /* Errors.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Errors.h; path = "../../../../../../ClassiCube-master/src/Errors.h"; sourceTree = "<group>"; };
9A6C7C192C073DF300676D27 /* SystemFonts.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SystemFonts.h; path = "../../../../../../ClassiCube-master/src/SystemFonts.h"; sourceTree = "<group>"; };
9A6C7C1A2C073DF300676D27 /* TexturePack.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = TexturePack.c; path = "../../../../../../ClassiCube-master/src/TexturePack.c"; sourceTree = "<group>"; };
9A6C7C1B2C073DF300676D27 /* Model.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Model.h; path = "../../../../../../ClassiCube-master/src/Model.h"; sourceTree = "<group>"; };
9A6C7C1C2C073DF300676D27 /* Block.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = Block.c; path = "../../../../../../ClassiCube-master/src/Block.c"; sourceTree = "<group>"; };
9A6C7C1D2C073DF300676D27 /* Bitmap.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Bitmap.h; path = "../../../../../../ClassiCube-master/src/Bitmap.h"; sourceTree = "<group>"; };
9A6C7C1E2C073DF300676D27 /* _ftbase.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = _ftbase.c; path = "../../../../../../ClassiCube-master/src/_ftbase.c"; sourceTree = "<group>"; };
9A6C7C1F2C073DF400676D27 /* LWidgets.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = LWidgets.c; path = "../../../../../../ClassiCube-master/src/LWidgets.c"; sourceTree = "<group>"; };
9A6C7C202C073DF400676D27 /* PackedCol.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = PackedCol.c; path = "../../../../../../ClassiCube-master/src/PackedCol.c"; sourceTree = "<group>"; };
9A6C7C212C073DF400676D27 /* Physics.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = Physics.c; path = "../../../../../../ClassiCube-master/src/Physics.c"; sourceTree = "<group>"; };
9A6C7C222C073DF400676D27 /* Animations.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Animations.h; path = "../../../../../../ClassiCube-master/src/Animations.h"; sourceTree = "<group>"; };
9A6C7C232C073DF400676D27 /* Protocol.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Protocol.h; path = "../../../../../../ClassiCube-master/src/Protocol.h"; sourceTree = "<group>"; };
9A6C7C242C073DF500676D27 /* GameVersion.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = GameVersion.c; path = "../../../../../../ClassiCube-master/src/GameVersion.c"; sourceTree = "<group>"; };
9A6C7C252C073DF500676D27 /* Particle.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = Particle.c; path = "../../../../../../ClassiCube-master/src/Particle.c"; sourceTree = "<group>"; };
9A6C7C262C073DF500676D27 /* EntityRenderers.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = EntityRenderers.h; path = "../../../../../../ClassiCube-master/src/EntityRenderers.h"; sourceTree = "<group>"; };
9A6C7C272C073DF500676D27 /* SelOutlineRenderer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SelOutlineRenderer.h; path = "../../../../../../ClassiCube-master/src/SelOutlineRenderer.h"; sourceTree = "<group>"; };
9A6C7C282C073DF500676D27 /* Graphics_SoftGPU.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = Graphics_SoftGPU.c; path = "../../../../../../ClassiCube-master/src/Graphics_SoftGPU.c"; sourceTree = "<group>"; };
9A6C7C292C073DF500676D27 /* MapRenderer.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = MapRenderer.c; path = "../../../../../../ClassiCube-master/src/MapRenderer.c"; sourceTree = "<group>"; };
9A6C7C2A2C073DF500676D27 /* SelectionBox.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = SelectionBox.c; path = "../../../../../../ClassiCube-master/src/SelectionBox.c"; sourceTree = "<group>"; };
9A6C7C2B2C073DF500676D27 /* Launcher.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Launcher.h; path = "../../../../../../ClassiCube-master/src/Launcher.h"; sourceTree = "<group>"; };
9A6C7C2C2C073DF600676D27 /* Stream.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = Stream.c; path = "../../../../../../ClassiCube-master/src/Stream.c"; sourceTree = "<group>"; };
9A6C7C2D2C073DF600676D27 /* Formats.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = Formats.c; path = "../../../../../../ClassiCube-master/src/Formats.c"; sourceTree = "<group>"; };
9A6C7C2E2C073DF600676D27 /* Chat.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = Chat.c; path = "../../../../../../ClassiCube-master/src/Chat.c"; sourceTree = "<group>"; };
9A6C7C2F2C073DF600676D27 /* Graphics_GL1.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = Graphics_GL1.c; path = "../../../../../../ClassiCube-master/src/Graphics_GL1.c"; sourceTree = "<group>"; };
9A6C7C302C073DF600676D27 /* Window_Terminal.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = Window_Terminal.c; path = "../../../../../../ClassiCube-master/src/Window_Terminal.c"; sourceTree = "<group>"; };
9A6C7C312C073DF700676D27 /* Event.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Event.h; path = "../../../../../../ClassiCube-master/src/Event.h"; sourceTree = "<group>"; };
9A6C7C322C073DF700676D27 /* String.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = String.h; path = "../../../../../../ClassiCube-master/src/String.h"; sourceTree = "<group>"; };
9A6C7C332C073DF700676D27 /* LScreens.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = LScreens.h; path = "../../../../../../ClassiCube-master/src/LScreens.h"; sourceTree = "<group>"; };
9A6C7C342C073DF700676D27 /* AxisLinesRenderer.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = AxisLinesRenderer.c; path = "../../../../../../ClassiCube-master/src/AxisLinesRenderer.c"; sourceTree = "<group>"; };
9A6C7C352C073DF700676D27 /* EnvRenderer.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = EnvRenderer.c; path = "../../../../../../ClassiCube-master/src/EnvRenderer.c"; sourceTree = "<group>"; };
9A6C7C362C073DF700676D27 /* _WindowBase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = _WindowBase.h; path = "../../../../../../ClassiCube-master/src/_WindowBase.h"; sourceTree = "<group>"; };
9A6C7C372C073DF700676D27 /* Input.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Input.h; path = "../../../../../../ClassiCube-master/src/Input.h"; sourceTree = "<group>"; };
9A6C7C382C073DF800676D27 /* _ftsynth.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = _ftsynth.c; path = "../../../../../../ClassiCube-master/src/_ftsynth.c"; sourceTree = "<group>"; };
9A6C7C392C073DF800676D27 /* IsometricDrawer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = IsometricDrawer.h; path = "../../../../../../ClassiCube-master/src/IsometricDrawer.h"; sourceTree = "<group>"; };
9A6C7C3A2C073DF800676D27 /* Formats.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Formats.h; path = "../../../../../../ClassiCube-master/src/Formats.h"; sourceTree = "<group>"; };
9A6C7C3B2C073DF800676D27 /* Deflate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Deflate.h; path = "../../../../../../ClassiCube-master/src/Deflate.h"; sourceTree = "<group>"; };
9A6C7C3C2C073DF800676D27 /* Logger.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = Logger.c; path = "../../../../../../ClassiCube-master/src/Logger.c"; sourceTree = "<group>"; };
9A6C7C3D2C073DF900676D27 /* Resources.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Resources.h; path = "../../../../../../ClassiCube-master/src/Resources.h"; sourceTree = "<group>"; };
9A6C7C3E2C073DF900676D27 /* String.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = String.c; path = "../../../../../../ClassiCube-master/src/String.c"; sourceTree = "<group>"; };
9A6C7C3F2C073DF900676D27 /* Protocol.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = Protocol.c; path = "../../../../../../ClassiCube-master/src/Protocol.c"; sourceTree = "<group>"; };
9A6C7C402C073DF900676D27 /* TouchUI.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = TouchUI.c; path = "../../../../../../ClassiCube-master/src/TouchUI.c"; sourceTree = "<group>"; };
9A6C7C412C073DF900676D27 /* _type1.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = _type1.c; path = "../../../../../../ClassiCube-master/src/_type1.c"; sourceTree = "<group>"; };
9A6C7C422C073DFA00676D27 /* BlockID.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = BlockID.h; path = "../../../../../../ClassiCube-master/src/BlockID.h"; sourceTree = "<group>"; };
9A6C7C432C073DFA00676D27 /* Gui.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Gui.h; path = "../../../../../../ClassiCube-master/src/Gui.h"; sourceTree = "<group>"; };
9A6C7C442C073DFB00676D27 /* Picking.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Picking.h; path = "../../../../../../ClassiCube-master/src/Picking.h"; sourceTree = "<group>"; };
9A6C7C452C073DFB00676D27 /* Event.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = Event.c; path = "../../../../../../ClassiCube-master/src/Event.c"; sourceTree = "<group>"; };
9A6C7C462C073DFC00676D27 /* Launcher.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = Launcher.c; path = "../../../../../../ClassiCube-master/src/Launcher.c"; sourceTree = "<group>"; };
9A6C7C472C073DFC00676D27 /* Camera.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Camera.h; path = "../../../../../../ClassiCube-master/src/Camera.h"; sourceTree = "<group>"; };
9A6C7C482C073DFC00676D27 /* Queue.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Queue.h; path = "../../../../../../ClassiCube-master/src/Queue.h"; sourceTree = "<group>"; };
9A6C7C492C073DFC00676D27 /* Screens.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Screens.h; path = "../../../../../../ClassiCube-master/src/Screens.h"; sourceTree = "<group>"; };
9A6C7C4A2C073DFD00676D27 /* _sfnt.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = _sfnt.c; path = "../../../../../../ClassiCube-master/src/_sfnt.c"; sourceTree = "<group>"; };
9A6C7C4B2C073DFD00676D27 /* ExtMath.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ExtMath.h; path = "../../../../../../ClassiCube-master/src/ExtMath.h"; sourceTree = "<group>"; };
9A6C7C4C2C073DFD00676D27 /* Options.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Options.h; path = "../../../../../../ClassiCube-master/src/Options.h"; sourceTree = "<group>"; };
9A6C7C4D2C073DFE00676D27 /* Entity.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Entity.h; path = "../../../../../../ClassiCube-master/src/Entity.h"; sourceTree = "<group>"; };
9A6C7C4E2C073DFE00676D27 /* Drawer2D.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Drawer2D.h; path = "../../../../../../ClassiCube-master/src/Drawer2D.h"; sourceTree = "<group>"; };
9A6C7C4F2C073DFE00676D27 /* LScreens.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = LScreens.c; path = "../../../../../../ClassiCube-master/src/LScreens.c"; sourceTree = "<group>"; };
9A6C7C502C073DFE00676D27 /* Server.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Server.h; path = "../../../../../../ClassiCube-master/src/Server.h"; sourceTree = "<group>"; };
9A6C7C512C073DFF00676D27 /* _HttpBase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = _HttpBase.h; path = "../../../../../../ClassiCube-master/src/_HttpBase.h"; sourceTree = "<group>"; };
9A6C7C522C073DFF00676D27 /* Commands.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = Commands.c; path = "../../../../../../ClassiCube-master/src/Commands.c"; sourceTree = "<group>"; };
9A6C7C532C073DFF00676D27 /* Core.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Core.h; path = "../../../../../../ClassiCube-master/src/Core.h"; sourceTree = "<group>"; };
9A6C7C542C073DFF00676D27 /* EnvRenderer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = EnvRenderer.h; path = "../../../../../../ClassiCube-master/src/EnvRenderer.h"; sourceTree = "<group>"; };
9A6C7C552C073E0000676D27 /* IsometricDrawer.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = IsometricDrawer.c; path = "../../../../../../ClassiCube-master/src/IsometricDrawer.c"; sourceTree = "<group>"; };
9A6C7C562C073E0000676D27 /* _GLShared.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = _GLShared.h; path = "../../../../../../ClassiCube-master/src/_GLShared.h"; sourceTree = "<group>"; };
9A6C7C572C073E0000676D27 /* HeldBlockRenderer.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = HeldBlockRenderer.c; path = "../../../../../../ClassiCube-master/src/HeldBlockRenderer.c"; sourceTree = "<group>"; };
9A6C7C582C073E0100676D27 /* _psmodule.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = _psmodule.c; path = "../../../../../../ClassiCube-master/src/_psmodule.c"; sourceTree = "<group>"; };
9A6C7C592C073E0100676D27 /* World.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = World.h; path = "../../../../../../ClassiCube-master/src/World.h"; sourceTree = "<group>"; };
9A6C7C5A2C073E0100676D27 /* Gui.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = Gui.c; path = "../../../../../../ClassiCube-master/src/Gui.c"; sourceTree = "<group>"; };
9A6C7C5B2C073E0200676D27 /* _truetype.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = _truetype.c; path = "../../../../../../ClassiCube-master/src/_truetype.c"; sourceTree = "<group>"; };
9A6C7C5C2C073E0200676D27 /* Generator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Generator.h; path = "../../../../../../ClassiCube-master/src/Generator.h"; sourceTree = "<group>"; };
9A6C7C5D2C073E0200676D27 /* Game.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Game.h; path = "../../../../../../ClassiCube-master/src/Game.h"; sourceTree = "<group>"; };
9A6C7C5E2C073E0200676D27 /* Window_cocoa.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = Window_cocoa.m; path = "../../../../../../ClassiCube-master/src/Window_cocoa.m"; sourceTree = "<group>"; };
9A6C7C5F2C073E0200676D27 /* Vorbis.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = Vorbis.c; path = "../../../../../../ClassiCube-master/src/Vorbis.c"; sourceTree = "<group>"; };
9A6C7C602C073E0300676D27 /* Inventory.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = Inventory.c; path = "../../../../../../ClassiCube-master/src/Inventory.c"; sourceTree = "<group>"; };
9A6C7C612C073E0300676D27 /* _PlatformBase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = _PlatformBase.h; path = "../../../../../../ClassiCube-master/src/_PlatformBase.h"; sourceTree = "<group>"; };
9A6C7C622C073E0300676D27 /* Animations.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = Animations.c; path = "../../../../../../ClassiCube-master/src/Animations.c"; sourceTree = "<group>"; };
9A6C7C632C073E0300676D27 /* FancyLighting.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = FancyLighting.c; path = "../../../../../../ClassiCube-master/src/FancyLighting.c"; sourceTree = "<group>"; };
9A6C7C642C073E0400676D27 /* Inventory.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Inventory.h; path = "../../../../../../ClassiCube-master/src/Inventory.h"; sourceTree = "<group>"; };
9A6C7C652C073E0400676D27 /* SSL.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SSL.h; path = "../../../../../../ClassiCube-master/src/SSL.h"; sourceTree = "<group>"; };
9A6C7C662C073E0400676D27 /* Widgets.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = Widgets.c; path = "../../../../../../ClassiCube-master/src/Widgets.c"; sourceTree = "<group>"; };
9A6C7C672C073E0400676D27 /* Picking.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = Picking.c; path = "../../../../../../ClassiCube-master/src/Picking.c"; sourceTree = "<group>"; };
9A6C7C682C073E0400676D27 /* _ftinit.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = _ftinit.c; path = "../../../../../../ClassiCube-master/src/_ftinit.c"; sourceTree = "<group>"; };
9A6C7C692C073E0400676D27 /* Window.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Window.h; path = "../../../../../../ClassiCube-master/src/Window.h"; sourceTree = "<group>"; };
9A6C7C6A2C073E0500676D27 /* LBackend.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = LBackend.h; path = "../../../../../../ClassiCube-master/src/LBackend.h"; sourceTree = "<group>"; };
9A6C7C6B2C073E0500676D27 /* Http_Worker.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = Http_Worker.c; path = "../../../../../../ClassiCube-master/src/Http_Worker.c"; sourceTree = "<group>"; };
9A6C7C6C2C073E0500676D27 /* AxisLinesRenderer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AxisLinesRenderer.h; path = "../../../../../../ClassiCube-master/src/AxisLinesRenderer.h"; sourceTree = "<group>"; };
9A6C7C6D2C073E0500676D27 /* ExtMath.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = ExtMath.c; path = "../../../../../../ClassiCube-master/src/ExtMath.c"; sourceTree = "<group>"; };
9A6C7C6E2C073E0600676D27 /* Block.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Block.h; path = "../../../../../../ClassiCube-master/src/Block.h"; sourceTree = "<group>"; };
9A6C7C6F2C073E0600676D27 /* _cff.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = _cff.c; path = "../../../../../../ClassiCube-master/src/_cff.c"; sourceTree = "<group>"; };
9A6C7C702C073E0600676D27 /* Camera.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = Camera.c; path = "../../../../../../ClassiCube-master/src/Camera.c"; sourceTree = "<group>"; };
9A6C7C712C073E0600676D27 /* Drawer.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = Drawer.c; path = "../../../../../../ClassiCube-master/src/Drawer.c"; sourceTree = "<group>"; };
9A6C7C722C073E0600676D27 /* Entity.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = Entity.c; path = "../../../../../../ClassiCube-master/src/Entity.c"; sourceTree = "<group>"; };
9A6C7C732C073E0700676D27 /* Audio.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Audio.h; path = "../../../../../../ClassiCube-master/src/Audio.h"; sourceTree = "<group>"; };
9A6C7C742C073E0700676D27 /* SystemFonts.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = SystemFonts.c; path = "../../../../../../ClassiCube-master/src/SystemFonts.c"; sourceTree = "<group>"; };
9A6C7C752C073E0700676D27 /* _GraphicsBase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = _GraphicsBase.h; path = "../../../../../../ClassiCube-master/src/_GraphicsBase.h"; sourceTree = "<group>"; };
9A6C7C762C073E0700676D27 /* BlockPhysics.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = BlockPhysics.c; path = "../../../../../../ClassiCube-master/src/BlockPhysics.c"; sourceTree = "<group>"; };
9A6C7C772C073E0700676D27 /* main.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = main.c; path = "../../../../../../ClassiCube-master/src/main.c"; sourceTree = "<group>"; };
9A6C7C782C073E0800676D27 /* Builder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Builder.h; path = "../../../../../../ClassiCube-master/src/Builder.h"; sourceTree = "<group>"; };
9A6C7C792C073E0800676D27 /* Model.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = Model.c; path = "../../../../../../ClassiCube-master/src/Model.c"; sourceTree = "<group>"; };
9A6C7C7A2C073E0800676D27 /* Graphics_Metal.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = Graphics_Metal.m; path = "../../../../../../ClassiCube-master/src/Graphics_Metal.m"; sourceTree = "<group>"; };
9A6C7C7B2C073E0800676D27 /* Logger.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Logger.h; path = "../../../../../../ClassiCube-master/src/Logger.h"; sourceTree = "<group>"; };
9A6C7C7C2C073E0800676D27 /* Utils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Utils.h; path = "../../../../../../ClassiCube-master/src/Utils.h"; sourceTree = "<group>"; };
9A6C7C7D2C073E0800676D27 /* SelOutlineRenderer.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = SelOutlineRenderer.c; path = "../../../../../../ClassiCube-master/src/SelOutlineRenderer.c"; sourceTree = "<group>"; };
9A6C7C7E2C073E0900676D27 /* EntityRenderers.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = EntityRenderers.c; path = "../../../../../../ClassiCube-master/src/EntityRenderers.c"; sourceTree = "<group>"; };
9A6C7C7F2C073E0900676D27 /* Graphics.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Graphics.h; path = "../../../../../../ClassiCube-master/src/Graphics.h"; sourceTree = "<group>"; };
9A6C7C802C073E0900676D27 /* LBackend.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = LBackend.c; path = "../../../../../../ClassiCube-master/src/LBackend.c"; sourceTree = "<group>"; };
9A6C7C812C073E0900676D27 /* Builder.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = Builder.c; path = "../../../../../../ClassiCube-master/src/Builder.c"; sourceTree = "<group>"; };
9A6C7C822C073E0900676D27 /* MapRenderer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MapRenderer.h; path = "../../../../../../ClassiCube-master/src/MapRenderer.h"; sourceTree = "<group>"; };
9A6C7C832C073E0A00676D27 /* Server.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = Server.c; path = "../../../../../../ClassiCube-master/src/Server.c"; sourceTree = "<group>"; };
9A6C7C842C073E0A00676D27 /* Audio.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = Audio.c; path = "../../../../../../ClassiCube-master/src/Audio.c"; sourceTree = "<group>"; };
9A6C7C852C073E0A00676D27 /* Deflate.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = Deflate.c; path = "../../../../../../ClassiCube-master/src/Deflate.c"; sourceTree = "<group>"; };
9A6C7C862C073E0A00676D27 /* Drawer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Drawer.h; path = "../../../../../../ClassiCube-master/src/Drawer.h"; sourceTree = "<group>"; };
9A6C7C872C073E0B00676D27 /* Chat.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Chat.h; path = "../../../../../../ClassiCube-master/src/Chat.h"; sourceTree = "<group>"; };
9A6C7C882C073E0B00676D27 /* BlockPhysics.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = BlockPhysics.h; path = "../../../../../../ClassiCube-master/src/BlockPhysics.h"; sourceTree = "<group>"; };
9A6C7C892C073E0B00676D27 /* Bitmap.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = Bitmap.c; path = "../../../../../../ClassiCube-master/src/Bitmap.c"; sourceTree = "<group>"; };
9A6C7C8A2C073E0B00676D27 /* LWidgets.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = LWidgets.h; path = "../../../../../../ClassiCube-master/src/LWidgets.h"; sourceTree = "<group>"; };
9A6C7C8B2C073E0C00676D27 /* HeldBlockRenderer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = HeldBlockRenderer.h; path = "../../../../../../ClassiCube-master/src/HeldBlockRenderer.h"; sourceTree = "<group>"; };
9A6C7C8C2C073E0C00676D27 /* SelectionBox.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SelectionBox.h; path = "../../../../../../ClassiCube-master/src/SelectionBox.h"; sourceTree = "<group>"; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
9A6C796E2C073BFF00676D27 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */
9A6C79682C073BFF00676D27 = {
isa = PBXGroup;
children = (
9A6C79732C073BFF00676D27 /* ClassiCube */,
9A6C79722C073BFF00676D27 /* Products */,
);
sourceTree = "<group>";
};
9A6C79722C073BFF00676D27 /* Products */ = {
isa = PBXGroup;
children = (
9A6C79712C073BFF00676D27 /* ClassiCube */,
);
name = Products;
sourceTree = "<group>";
};
9A6C79732C073BFF00676D27 /* ClassiCube */ = {
isa = PBXGroup;
children = (
9A6C7BF52C073DED00676D27 /* _autofit.c */,
9A6C7C6F2C073E0600676D27 /* _cff.c */,
9A6C7C1E2C073DF300676D27 /* _ftbase.c */,
9A6C7BF22C073DED00676D27 /* _ftbitmap.c */,
9A6C7BEB2C073DEC00676D27 /* _ftglyph.c */,
9A6C7C682C073E0400676D27 /* _ftinit.c */,
9A6C7C382C073DF800676D27 /* _ftsynth.c */,
9A6C7C562C073E0000676D27 /* _GLShared.h */,
9A6C7C752C073E0700676D27 /* _GraphicsBase.h */,
9A6C7C512C073DFF00676D27 /* _HttpBase.h */,
9A6C7C612C073E0300676D27 /* _PlatformBase.h */,
9A6C7BF62C073DED00676D27 /* _PlatformConsole.h */,
9A6C7C152C073DF200676D27 /* _psaux.c */,
9A6C7C102C073DF100676D27 /* _pshinter.c */,
9A6C7C582C073E0100676D27 /* _psmodule.c */,
9A6C7C4A2C073DFD00676D27 /* _sfnt.c */,
9A6C7C0E2C073DF100676D27 /* _smooth.c */,
9A6C7C5B2C073E0200676D27 /* _truetype.c */,
9A6C7C412C073DF900676D27 /* _type1.c */,
9A6C7C362C073DF700676D27 /* _WindowBase.h */,
9A6C7C622C073E0300676D27 /* Animations.c */,
9A6C7C222C073DF400676D27 /* Animations.h */,
9A6C7C842C073E0A00676D27 /* Audio.c */,
9A6C7C732C073E0700676D27 /* Audio.h */,
9A6C7C0A2C073DF000676D27 /* AudioBackend.c */,
9A6C7C342C073DF700676D27 /* AxisLinesRenderer.c */,
9A6C7C6C2C073E0500676D27 /* AxisLinesRenderer.h */,
9A6C7C892C073E0B00676D27 /* Bitmap.c */,
9A6C7C1D2C073DF300676D27 /* Bitmap.h */,
9A6C7C1C2C073DF300676D27 /* Block.c */,
9A6C7C6E2C073E0600676D27 /* Block.h */,
9A6C7C422C073DFA00676D27 /* BlockID.h */,
9A6C7C762C073E0700676D27 /* BlockPhysics.c */,
9A6C7C882C073E0B00676D27 /* BlockPhysics.h */,
9A6C7C812C073E0900676D27 /* Builder.c */,
9A6C7C782C073E0800676D27 /* Builder.h */,
9A6C7C702C073E0600676D27 /* Camera.c */,
9A6C7C472C073DFC00676D27 /* Camera.h */,
9A6C7C2E2C073DF600676D27 /* Chat.c */,
9A6C7C872C073E0B00676D27 /* Chat.h */,
9A6C7C522C073DFF00676D27 /* Commands.c */,
9A6C7BEF2C073DED00676D27 /* Commands.h */,
9A6C7BEC2C073DED00676D27 /* Constants.h */,
9A6C7C532C073DFF00676D27 /* Core.h */,
9A6C7C852C073E0A00676D27 /* Deflate.c */,
9A6C7C3B2C073DF800676D27 /* Deflate.h */,
9A6C7C712C073E0600676D27 /* Drawer.c */,
9A6C7C862C073E0A00676D27 /* Drawer.h */,
9A6C7C112C073DF100676D27 /* Drawer2D.c */,
9A6C7C4E2C073DFE00676D27 /* Drawer2D.h */,
9A6C7C722C073E0600676D27 /* Entity.c */,
9A6C7C4D2C073DFE00676D27 /* Entity.h */,
9A6C7C042C073DEF00676D27 /* EntityComponents.c */,
9A6C7BF32C073DED00676D27 /* EntityComponents.h */,
9A6C7C7E2C073E0900676D27 /* EntityRenderers.c */,
9A6C7C262C073DF500676D27 /* EntityRenderers.h */,
9A6C7C352C073DF700676D27 /* EnvRenderer.c */,
9A6C7C542C073DFF00676D27 /* EnvRenderer.h */,
9A6C7C182C073DF300676D27 /* Errors.h */,
9A6C7C452C073DFB00676D27 /* Event.c */,
9A6C7C312C073DF700676D27 /* Event.h */,
9A6C7C6D2C073E0500676D27 /* ExtMath.c */,
9A6C7C4B2C073DFD00676D27 /* ExtMath.h */,
9A6C7C632C073E0300676D27 /* FancyLighting.c */,
9A6C7C2D2C073DF600676D27 /* Formats.c */,
9A6C7C3A2C073DF800676D27 /* Formats.h */,
9A6C7C062C073DEF00676D27 /* Funcs.h */,
9A6C7C052C073DEF00676D27 /* Game.c */,
9A6C7C5D2C073E0200676D27 /* Game.h */,
9A6C7C242C073DF500676D27 /* GameVersion.c */,
9A6C7BFB2C073DEE00676D27 /* Generator.c */,
9A6C7C5C2C073E0200676D27 /* Generator.h */,
9A6C7C2F2C073DF600676D27 /* Graphics_GL1.c */,
9A6C7C012C073DEE00676D27 /* Graphics_GL2.c */,
9A6C7C7A2C073E0800676D27 /* Graphics_Metal.m */,
9A6C7C282C073DF500676D27 /* Graphics_SoftGPU.c */,
9A6C7C7F2C073E0900676D27 /* Graphics.h */,
9A6C7C5A2C073E0100676D27 /* Gui.c */,
9A6C7C432C073DFA00676D27 /* Gui.h */,
9A6C7C572C073E0000676D27 /* HeldBlockRenderer.c */,
9A6C7C8B2C073E0C00676D27 /* HeldBlockRenderer.h */,
9A6C7C6B2C073E0500676D27 /* Http_Worker.c */,
9A6C7C032C073DEF00676D27 /* Http.h */,
9A6C7BF02C073DED00676D27 /* Input.c */,
9A6C7C372C073DF700676D27 /* Input.h */,
9A6C7C5E2C073E0200676D27 /* Window_cocoa.m */,
9A6C7C602C073E0300676D27 /* Inventory.c */,
9A6C7C642C073E0400676D27 /* Inventory.h */,
9A6C7C552C073E0000676D27 /* IsometricDrawer.c */,
9A6C7C392C073DF800676D27 /* IsometricDrawer.h */,
9A6C7C462C073DFC00676D27 /* Launcher.c */,
9A6C7C2B2C073DF500676D27 /* Launcher.h */,
9A6C7BFF2C073DEE00676D27 /* LBackend_Android.c */,
9A6C7C802C073E0900676D27 /* LBackend.c */,
9A6C7C6A2C073E0500676D27 /* LBackend.h */,
9A6C7C022C073DEE00676D27 /* Lighting.c */,
9A6C7C172C073DF200676D27 /* Lighting.h */,
9A6C7C3C2C073DF800676D27 /* Logger.c */,
9A6C7C7B2C073E0800676D27 /* Logger.h */,
9A6C7C4F2C073DFE00676D27 /* LScreens.c */,
9A6C7C332C073DF700676D27 /* LScreens.h */,
9A6C7BFA2C073DEE00676D27 /* LWeb.c */,
9A6C7BF42C073DED00676D27 /* LWeb.h */,
9A6C7C1F2C073DF400676D27 /* LWidgets.c */,
9A6C7C8A2C073E0B00676D27 /* LWidgets.h */,
9A6C7C772C073E0700676D27 /* main.c */,
9A6C7C292C073DF500676D27 /* MapRenderer.c */,
9A6C7C822C073E0900676D27 /* MapRenderer.h */,
9A6C7BF82C073DED00676D27 /* Menus.c */,
9A6C7C142C073DF200676D27 /* Menus.h */,
9A6C7C792C073E0800676D27 /* Model.c */,
9A6C7C1B2C073DF300676D27 /* Model.h */,
9A6C7BF12C073DED00676D27 /* Options.c */,
9A6C7C4C2C073DFD00676D27 /* Options.h */,
9A6C7C202C073DF400676D27 /* PackedCol.c */,
9A6C7C0C2C073DF000676D27 /* PackedCol.h */,
9A6C7C252C073DF500676D27 /* Particle.c */,
9A6C7BFC2C073DEE00676D27 /* Particle.h */,
9A6C7C212C073DF400676D27 /* Physics.c */,
9A6C7BF72C073DED00676D27 /* Physics.h */,
9A6C7C672C073E0400676D27 /* Picking.c */,
9A6C7C442C073DFB00676D27 /* Picking.h */,
9A6C7C072C073DEF00676D27 /* Platform_Posix.c */,
9A6C7BF92C073DED00676D27 /* Platform.h */,
9A6C7C3F2C073DF900676D27 /* Protocol.c */,
9A6C7C232C073DF400676D27 /* Protocol.h */,
9A6C7C0B2C073DF000676D27 /* Queue.c */,
9A6C7C482C073DFC00676D27 /* Queue.h */,
9A6C7C092C073DEF00676D27 /* Resources.c */,
9A6C7C3D2C073DF900676D27 /* Resources.h */,
9A6C7BFD2C073DEE00676D27 /* Screens.c */,
9A6C7C492C073DFC00676D27 /* Screens.h */,
9A6C7C2A2C073DF500676D27 /* SelectionBox.c */,
9A6C7C8C2C073E0C00676D27 /* SelectionBox.h */,
9A6C7C7D2C073E0800676D27 /* SelOutlineRenderer.c */,
9A6C7C272C073DF500676D27 /* SelOutlineRenderer.h */,
9A6C7C832C073E0A00676D27 /* Server.c */,
9A6C7C502C073DFE00676D27 /* Server.h */,
9A6C7BFE2C073DEE00676D27 /* SSL.c */,
9A6C7C652C073E0400676D27 /* SSL.h */,
9A6C7C2C2C073DF600676D27 /* Stream.c */,
9A6C7BED2C073DED00676D27 /* Stream.h */,
9A6C7C3E2C073DF900676D27 /* String.c */,
9A6C7C322C073DF700676D27 /* String.h */,
9A6C7C742C073E0700676D27 /* SystemFonts.c */,
9A6C7C192C073DF300676D27 /* SystemFonts.h */,
9A6C7C1A2C073DF300676D27 /* TexturePack.c */,
9A6C7BEA2C073DEC00676D27 /* TexturePack.h */,
9A6C7C402C073DF900676D27 /* TouchUI.c */,
9A6C7C082C073DEF00676D27 /* Utils.c */,
9A6C7C7C2C073E0800676D27 /* Utils.h */,
9A6C7BE92C073DEC00676D27 /* Vectors.c */,
9A6C7C0D2C073DF000676D27 /* Vectors.h */,
9A6C7BEE2C073DED00676D27 /* VirtualKeyboard.h */,
9A6C7C5F2C073E0200676D27 /* Vorbis.c */,
9A6C7C0F2C073DF100676D27 /* Vorbis.h */,
9A6C7C662C073E0400676D27 /* Widgets.c */,
9A6C7C122C073DF100676D27 /* Widgets.h */,
9A6C7C002C073DEE00676D27 /* Window_SDL2.c */,
9A6C7C162C073DF200676D27 /* Window_SDL3.c */,
9A6C7C302C073DF600676D27 /* Window_Terminal.c */,
9A6C7C692C073E0400676D27 /* Window.h */,
9A6C7C132C073DF200676D27 /* World.c */,
9A6C7C592C073E0100676D27 /* World.h */,
);
path = ClassiCube;
sourceTree = "<group>";
};
/* End PBXGroup section */
/* Begin PBXNativeTarget section */
9A6C79702C073BFF00676D27 /* ClassiCube */ = {
isa = PBXNativeTarget;
buildConfigurationList = 9A6C79782C073BFF00676D27 /* Build configuration list for PBXNativeTarget "ClassiCube" */;
buildPhases = (
9A6C796D2C073BFF00676D27 /* Sources */,
9A6C796E2C073BFF00676D27 /* Frameworks */,
9A6C796F2C073BFF00676D27 /* CopyFiles */,
);
buildRules = (
);
dependencies = (
);
name = ClassiCube;
productName = ClassiCube;
productReference = 9A6C79712C073BFF00676D27 /* ClassiCube */;
productType = "com.apple.product-type.tool";
};
/* End PBXNativeTarget section */
/* Begin PBXProject section */
9A6C79692C073BFF00676D27 /* Project object */ = {
isa = PBXProject;
attributes = {
LastUpgradeCheck = 1010;
ORGANIZATIONNAME = ClassiCube;
TargetAttributes = {
9A6C79702C073BFF00676D27 = {
CreatedOnToolsVersion = 10.1;
};
};
};
buildConfigurationList = 9A6C796C2C073BFF00676D27 /* Build configuration list for PBXProject "ClassiCube" */;
compatibilityVersion = "Xcode 9.3";
developmentRegion = en;
hasScannedForEncodings = 0;
knownRegions = (
en,
);
mainGroup = 9A6C79682C073BFF00676D27;
productRefGroup = 9A6C79722C073BFF00676D27 /* Products */;
projectDirPath = "";
projectRoot = "";
targets = (
9A6C79702C073BFF00676D27 /* ClassiCube */,
);
};
/* End PBXProject section */
/* Begin PBXSourcesBuildPhase section */
9A6C796D2C073BFF00676D27 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
9A6C7CB92C073E0C00676D27 /* AxisLinesRenderer.c in Sources */,
9A6C7CAF2C073E0C00676D27 /* GameVersion.c in Sources */,
9A6C7C9E2C073E0C00676D27 /* Platform_Posix.c in Sources */,
9A6C7C9A2C073E0C00676D27 /* Graphics_GL2.c in Sources */,
9A6C7C972C073E0C00676D27 /* SSL.c in Sources */,
9A6C7CD42C073E0C00676D27 /* ExtMath.c in Sources */,
9A6C7CD52C073E0C00676D27 /* _cff.c in Sources */,
9A6C7CAA2C073E0C00676D27 /* Block.c in Sources */,
9A6C7CC12C073E0C00676D27 /* Event.c in Sources */,
9A6C7CDC2C073E0C00676D27 /* Model.c in Sources */,
9A6C7CC72C073E0C00676D27 /* HeldBlockRenderer.c in Sources */,
9A6C7CDB2C073E0C00676D27 /* main.c in Sources */,
9A6C7CDE2C073E0C00676D27 /* SelOutlineRenderer.c in Sources */,
9A6C7CB42C073E0C00676D27 /* Stream.c in Sources */,
9A6C7CE22C073E0C00676D27 /* Server.c in Sources */,
9A6C7C912C073E0C00676D27 /* _ftbitmap.c in Sources */,
9A6C7CC52C073E0C00676D27 /* Commands.c in Sources */,
9A6C7CD22C073E0C00676D27 /* _ftinit.c in Sources */,
9A6C7CD72C073E0C00676D27 /* Drawer.c in Sources */,
9A6C7CE12C073E0C00676D27 /* Builder.c in Sources */,
9A6C7CA92C073E0C00676D27 /* TexturePack.c in Sources */,
9A6C7C962C073E0C00676D27 /* Screens.c in Sources */,
9A6C7CB32C073E0C00676D27 /* SelectionBox.c in Sources */,
9A6C7CCC2C073E0C00676D27 /* Vorbis.c in Sources */,
9A6C7CDF2C073E0C00676D27 /* EntityRenderers.c in Sources */,
9A6C7CE02C073E0C00676D27 /* LBackend.c in Sources */,
9A6C7CDA2C073E0C00676D27 /* BlockPhysics.c in Sources */,
9A6C7CC92C073E0C00676D27 /* Gui.c in Sources */,
9A6C7CAB2C073E0C00676D27 /* _ftbase.c in Sources */,
9A6C7CB22C073E0C00676D27 /* MapRenderer.c in Sources */,
9A6C7C9B2C073E0C00676D27 /* Lighting.c in Sources */,
9A6C7C992C073E0C00676D27 /* Window_SDL2.c in Sources */,
9A6C7CBF2C073E0C00676D27 /* TouchUI.c in Sources */,
9A6C7CD32C073E0C00676D27 /* Http_Worker.c in Sources */,
9A6C7CD82C073E0C00676D27 /* Entity.c in Sources */,
9A6C7CA02C073E0C00676D27 /* Resources.c in Sources */,
9A6C7CA72C073E0C00676D27 /* _psaux.c in Sources */,
9A6C7CCB2C073E0C00676D27 /* Window_cocoa.m in Sources */,
9A6C7C9C2C073E0C00676D27 /* EntityComponents.c in Sources */,
9A6C7C982C073E0C00676D27 /* LBackend_Android.c in Sources */,
9A6C7CB02C073E0C00676D27 /* Particle.c in Sources */,
9A6C7C942C073E0C00676D27 /* LWeb.c in Sources */,
9A6C7C952C073E0C00676D27 /* Generator.c in Sources */,
9A6C7C932C073E0C00676D27 /* Menus.c in Sources */,
9A6C7CA22C073E0C00676D27 /* Queue.c in Sources */,
9A6C7CC42C073E0C00676D27 /* LScreens.c in Sources */,
9A6C7CD92C073E0C00676D27 /* SystemFonts.c in Sources */,
9A6C7CA82C073E0C00676D27 /* Window_SDL3.c in Sources */,
9A6C7CBE2C073E0C00676D27 /* Protocol.c in Sources */,
9A6C7CC02C073E0C00676D27 /* _type1.c in Sources */,
9A6C7CA12C073E0C00676D27 /* AudioBackend.c in Sources */,
9A6C7CDD2C073E0C00676D27 /* Graphics_Metal.m in Sources */,
9A6C7CBD2C073E0C00676D27 /* String.c in Sources */,
9A6C7C8F2C073E0C00676D27 /* Input.c in Sources */,
9A6C7CB52C073E0C00676D27 /* Formats.c in Sources */,
9A6C7CB72C073E0C00676D27 /* Graphics_GL1.c in Sources */,
9A6C7CA42C073E0C00676D27 /* _pshinter.c in Sources */,
9A6C7CBA2C073E0C00676D27 /* EnvRenderer.c in Sources */,
9A6C7C9F2C073E0C00676D27 /* Utils.c in Sources */,
9A6C7C922C073E0C00676D27 /* _autofit.c in Sources */,
9A6C7CCD2C073E0C00676D27 /* Inventory.c in Sources */,
9A6C7CB12C073E0C00676D27 /* Graphics_SoftGPU.c in Sources */,
9A6C7C9D2C073E0C00676D27 /* Game.c in Sources */,
9A6C7CC62C073E0C00676D27 /* IsometricDrawer.c in Sources */,
9A6C7CD12C073E0C00676D27 /* Picking.c in Sources */,
9A6C7CAE2C073E0C00676D27 /* Physics.c in Sources */,
9A6C7CA32C073E0C00676D27 /* _smooth.c in Sources */,
9A6C7C8E2C073E0C00676D27 /* _ftglyph.c in Sources */,
9A6C7CE52C073E0C00676D27 /* Bitmap.c in Sources */,
9A6C7CD62C073E0C00676D27 /* Camera.c in Sources */,
9A6C7CB62C073E0C00676D27 /* Chat.c in Sources */,
9A6C7CCE2C073E0C00676D27 /* Animations.c in Sources */,
9A6C7CE42C073E0C00676D27 /* Deflate.c in Sources */,
9A6C7CC82C073E0C00676D27 /* _psmodule.c in Sources */,
9A6C7CA62C073E0C00676D27 /* World.c in Sources */,
9A6C7CAD2C073E0C00676D27 /* PackedCol.c in Sources */,
9A6C7CBC2C073E0C00676D27 /* Logger.c in Sources */,
9A6C7C902C073E0C00676D27 /* Options.c in Sources */,
9A6C7CC32C073E0C00676D27 /* _sfnt.c in Sources */,
9A6C7CBB2C073E0C00676D27 /* _ftsynth.c in Sources */,
9A6C7C8D2C073E0C00676D27 /* Vectors.c in Sources */,
9A6C7CD02C073E0C00676D27 /* Widgets.c in Sources */,
9A6C7CB82C073E0C00676D27 /* Window_Terminal.c in Sources */,
9A6C7CE32C073E0C00676D27 /* Audio.c in Sources */,
9A6C7CAC2C073E0C00676D27 /* LWidgets.c in Sources */,
9A6C7CCF2C073E0C00676D27 /* FancyLighting.c in Sources */,
9A6C7CCA2C073E0C00676D27 /* _truetype.c in Sources */,
9A6C7CA52C073E0C00676D27 /* Drawer2D.c in Sources */,
9A6C7CC22C073E0C00676D27 /* Launcher.c in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXSourcesBuildPhase section */
/* Begin XCBuildConfiguration section */
9A6C79762C073BFF00676D27 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_NONNULL = YES;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_ENABLE_OBJC_WEAK = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
CODE_SIGN_IDENTITY = "-";
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = dwarf;
ENABLE_STRICT_OBJC_MSGSEND = YES;
ENABLE_TESTABILITY = YES;
GCC_C_LANGUAGE_STANDARD = gnu11;
GCC_DYNAMIC_NO_PIC = NO;
GCC_NO_COMMON_BLOCKS = YES;
GCC_OPTIMIZATION_LEVEL = 0;
GCC_PREPROCESSOR_DEFINITIONS = (
"DEBUG=1",
"$(inherited)",
);
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
MACOSX_DEPLOYMENT_TARGET = 10.13;
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
MTL_FAST_MATH = YES;
ONLY_ACTIVE_ARCH = YES;
SDKROOT = macosx;
};
name = Debug;
};
9A6C79772C073BFF00676D27 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_NONNULL = YES;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_ENABLE_OBJC_WEAK = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
CODE_SIGN_IDENTITY = "-";
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
ENABLE_NS_ASSERTIONS = NO;
ENABLE_STRICT_OBJC_MSGSEND = YES;
GCC_C_LANGUAGE_STANDARD = gnu11;
GCC_NO_COMMON_BLOCKS = YES;
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
MACOSX_DEPLOYMENT_TARGET = 10.13;
MTL_ENABLE_DEBUG_INFO = NO;
MTL_FAST_MATH = YES;
SDKROOT = macosx;
};
name = Release;
};
9A6C79792C073BFF00676D27 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
CLANG_ENABLE_OBJC_ARC = NO;
CODE_SIGN_STYLE = Automatic;
MACOSX_DEPLOYMENT_TARGET = 10.13;
PRODUCT_NAME = "$(TARGET_NAME)";
};
name = Debug;
};
9A6C797A2C073BFF00676D27 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
CLANG_ENABLE_OBJC_ARC = NO;
CODE_SIGN_STYLE = Automatic;
MACOSX_DEPLOYMENT_TARGET = 10.13;
PRODUCT_NAME = "$(TARGET_NAME)";
};
name = Release;
};
/* End XCBuildConfiguration section */
/* Begin XCConfigurationList section */
9A6C796C2C073BFF00676D27 /* Build configuration list for PBXProject "ClassiCube" */ = {
isa = XCConfigurationList;
buildConfigurations = (
9A6C79762C073BFF00676D27 /* Debug */,
9A6C79772C073BFF00676D27 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
9A6C79782C073BFF00676D27 /* Build configuration list for PBXNativeTarget "ClassiCube" */ = {
isa = XCConfigurationList;
buildConfigurations = (
9A6C79792C073BFF00676D27 /* Debug */,
9A6C797A2C073BFF00676D27 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
/* End XCConfigurationList section */
};
rootObject = 9A6C79692C073BFF00676D27 /* Project object */;
}

BIN
misc/macOS/appicon.icns Normal file

Binary file not shown.

20
misc/macOS/info.plist Normal file
View File

@@ -0,0 +1,20 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleExecutable</key>
<string>ClassiCube</string>
<key>CFBundleIconFile</key>
<string>appicon</string>
<key>CFBundleIdentifier</key>
<string>com.classicube.client.mac</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>ClassiCube</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleDisplayName</key>
<string>ClassiCube</string>
</dict>
</plist>

View File

@@ -0,0 +1,43 @@
using System.Drawing.Imaging;
using System.Drawing;
using System.IO;
namespace test
{
public static class Program
{
const string src = "CCicon.ico";
const string dst = "_CCIcon_mac.h";
static void DumpIcon(StreamWriter sw, int width, int height) {
using (Icon icon = new Icon(src, width, height)) {
using (Bitmap bmp = icon.ToBitmap()) {
for (int y = 0; y < bmp.Height; y++) {
for (int x = 0; x < bmp.Width; x++) {
Color c = bmp.GetPixel(x, y);
int r = c.R * c.A / 255;
int g = c.G * c.A / 255;
int b = c.B * c.A / 255;
int p = (r << 24) | (g << 16) | (b << 8) | c.A;
sw.Write("0x" + ((uint)p).ToString("X8") + ",");
}
sw.WriteLine();
}
}
}
}
public static void Main(string[] args) {
using (StreamWriter sw = new StreamWriter(dst)) {
sw.WriteLine("/* Generated using misc/macOS/mac_icon_gen.cs */");
sw.WriteLine("");
sw.WriteLine("static const unsigned int CCIcon_Data[] = {");
DumpIcon(sw, 64, 64);
sw.WriteLine("};");
sw.WriteLine("static const int CCIcon_Width = 64;");
sw.WriteLine("static const int CCIcon_Height = 64;");
}
}
}
}

23
misc/macclassic/68APPL.r Normal file
View File

@@ -0,0 +1,23 @@
#include "Processes.r"
#include "Retro68.r"
resource 'SIZE' (-1) {
reserved,
ignoreSuspendResumeEvents,
reserved,
cannotBackground,
needsActivateOnFGSwitch,
backgroundAndForeground,
dontGetFrontClicks,
ignoreChildDiedEvents,
is32BitCompatible,
notHighLevelEventAware,
onlyLocalHLEvents,
notStationeryAware,
dontUseTextEditServices,
reserved,
reserved,
reserved,
8192 * 1024, // preferred (maximum) memory size
2900 * 1024, // minimum memory size (enough to load launcher)
};

View File

@@ -0,0 +1,66 @@
# path to RETRO68
RETRO68=../Retro68-build/toolchain
PREFIX=$(RETRO68)/m68k-apple-macos
CC=$(RETRO68)/bin/m68k-apple-macos-gcc
CXX=$(RETRO68)/bin/m68k-apple-macos-g++
CFLAGS=-O1 -fno-math-errno
REZ=$(RETRO68)/bin/Rez
LDFLAGS=-lm
RINCLUDES=$(PREFIX)/RIncludes
REZFLAGS=-I$(RINCLUDES)
ifdef ARCH_68040
TARGET := ClassiCube-68040
BUILD_DIR := build/mac_68040
CFLAGS += -march=68040
else
TARGET := ClassiCube-68k
BUILD_DIR := build/mac_68k
CFLAGS += -DCC_BUILD_NOFPU -DCC_BUILD_TINYMEM
endif
SOURCE_DIR := src
C_SOURCES := $(wildcard $(SOURCE_DIR)/*.c)
C_OBJECTS := $(patsubst $(SOURCE_DIR)/%.c, $(BUILD_DIR)/%.o, $(C_SOURCES))
# Dependency tracking
DEPFLAGS = -MT $@ -MMD -MP -MF $(BUILD_DIR)/$*.d
DEPFILES := $(C_OBJECTS:%.o=%.d)
#---------------------------------------------------------------------------------
# main targets
#---------------------------------------------------------------------------------
default: $(BUILD_DIR) $(TARGET).bin
$(BUILD_DIR):
mkdir -p $(BUILD_DIR)
#---------------------------------------------------------------------------------
# executable generation
#---------------------------------------------------------------------------------
$(TARGET).bin $(TARGET).APPL $(TARGET).dsk: $(TARGET).code.bin
$(REZ) $(REZFLAGS) \
--copy "$(TARGET).code.bin" \
"misc/macclassic/68APPL.r" \
-t "APPL" -c "????" \
-o $(TARGET).bin --cc $(TARGET).APPL --cc $(TARGET).dsk
$(TARGET).code.bin: $(C_OBJECTS)
$(CC) $(C_OBJECTS) -o $@ $(LDFLAGS)
#---------------------------------------------------------------------------------
# object generation
#---------------------------------------------------------------------------------
$(C_OBJECTS): $(BUILD_DIR)/%.o : $(SOURCE_DIR)/%.c
$(CC) $(CFLAGS) $(DEPFLAGS) -c $< -o $@
# Dependency tracking
$(DEPFILES):
include $(wildcard $(DEPFILES))

View File

@@ -0,0 +1,65 @@
# path to RETRO68
RETRO68=../Retro68-build/toolchain
PREFIX=$(RETRO68)/powerpc-apple-macos
CC=$(RETRO68)/bin/powerpc-apple-macos-gcc
CXX=$(RETRO68)/bin/powerpc-apple-macos-g++
CFLAGS=-O1 -fno-math-errno
REZ=$(RETRO68)/bin/Rez
MakePEF=$(RETRO68)/bin/MakePEF
LDFLAGS=-lm
RINCLUDES=$(PREFIX)/RIncludes
REZFLAGS=-I$(RINCLUDES)
TARGET := ClassiCube-ppc
BUILD_DIR := build/mac_ppc
SOURCE_DIR := src
C_SOURCES := $(wildcard $(SOURCE_DIR)/*.c)
C_OBJECTS := $(patsubst $(SOURCE_DIR)/%.c, $(BUILD_DIR)/%.o, $(C_SOURCES))
# Dependency tracking
DEPFLAGS = -MT $@ -MMD -MP -MF $(BUILD_DIR)/$*.d
DEPFILES := $(C_OBJECTS:%.o=%.d)
#---------------------------------------------------------------------------------
# main targets
#---------------------------------------------------------------------------------
default: $(BUILD_DIR) $(TARGET).bin
$(BUILD_DIR):
mkdir -p $(BUILD_DIR)
#---------------------------------------------------------------------------------
# executable generation
#---------------------------------------------------------------------------------
$(TARGET).bin $(TARGET).APPL $(TARGET).dsk: $(TARGET).pef
$(REZ) $(REZFLAGS) \
"misc/macclassic/ppcAPPL.r" \
-t "APPL" -c "????" \
--data $(TARGET).pef \
-o $(TARGET).bin --cc $(TARGET).APPL --cc $(TARGET).dsk
$(TARGET).elf: $(C_OBJECTS)
$(CC) $(C_OBJECTS) -o $@ $(LDFLAGS)
$(TARGET).pef: $(TARGET).elf
$(MakePEF) $(TARGET).elf -o $(TARGET).pef
$(BUILD_DIR):
mkdir -p $(BUILD_DIR)
#---------------------------------------------------------------------------------
# object generation
#---------------------------------------------------------------------------------
$(C_OBJECTS): $(BUILD_DIR)/%.o : $(SOURCE_DIR)/%.c
$(CC) $(CFLAGS) $(DEPFLAGS) -c $< -o $@
# Dependency tracking
$(DEPFILES):
include $(wildcard $(DEPFILES))

32
misc/macclassic/ppcAPPL.r Normal file
View File

@@ -0,0 +1,32 @@
#include "Processes.r"
#include "CodeFragments.r"
resource 'cfrg' (0) {
{
kPowerPCCFragArch, kIsCompleteCFrag, kNoVersionNum, kNoVersionNum,
kDefaultStackSize, kNoAppSubFolder,
kApplicationCFrag, kDataForkCFragLocator, kZeroOffset, kCFragGoesToEOF,
"ClassiCube"
}
};
resource 'SIZE' (-1) {
reserved,
ignoreSuspendResumeEvents,
reserved,
cannotBackground,
needsActivateOnFGSwitch,
backgroundAndForeground,
dontGetFrontClicks,
ignoreChildDiedEvents,
is32BitCompatible,
notHighLevelEventAware,
onlyLocalHLEvents,
notStationeryAware,
dontUseTextEditServices,
reserved,
reserved,
reserved,
8192 * 1024, // preferred (maximum) memory size
8192 * 1024 // minimum memory size
};

33
misc/n64/Makefile Normal file
View File

@@ -0,0 +1,33 @@
BUILD_DIR = build-n64
SOURCE_DIR = misc/n64
N64_ROM_TITLE = "ClassiCube"
N64_ROM_RTC = true
TARGET = ClassiCube-n64
N64_MKDFS_ROOT = "misc/n64/files"
CFILES := $(notdir $(wildcard src/*.c))
OFILES := $(CFILES:.c=.o) rsp_gpu.o
OBJS := $(addprefix $(BUILD_DIR)/,$(OFILES))
CFLAGS := -Wno-error=missing-braces -Wno-error=strict-aliasing -Wno-error=incompatible-pointer-types
default: $(TARGET).z64
$(BUILD_DIR)/%.o: src/%.c
@mkdir -p $(dir $@)
@echo " [CC] $<"
$(CC) -c $(CFLAGS) -o $@ $<
include $(N64_INST)/include/n64.mk
$(TARGET).z64: N64_ROM_TITLE = "ClassiCube"
$(TARGET).z64: $(BUILD_DIR)/filesystem.dfs
$(BUILD_DIR)/filesystem.dfs: misc/n64/files/default.zip
$(BUILD_DIR)/ClassiCube-n64.elf: $(OBJS)
clean:
rm -rf $(BUILD_DIR) $(TARGET).z64
.PHONY: clean
-include $(wildcard $(BUILD_DIR)/*.d)

BIN
misc/n64/files/default.zip Normal file

Binary file not shown.

242
misc/n64/gpu.c Normal file
View File

@@ -0,0 +1,242 @@
#include "rspq.h"
#include "rdpq.h"
#include "rdpq_rect.h"
#include "rdpq_mode.h"
#include "rdpq_debug.h"
#include "display.h"
// This is a severely cutdown version of libdragon's OpenGL implementation
#define VTX_SHIFT 5
#define TEX_SHIFT 8
static uint32_t gpup_id;
//DEFINE_RSP_UCODE(rsp_gpu);
extern uint8_t _binary_build_n64_rsp_gpu_text_bin_start[];
extern uint8_t _binary_build_n64_rsp_gpu_data_bin_start[];
extern uint8_t _binary_build_n64_rsp_gpu_meta_bin_start[];
extern uint8_t _binary_build_n64_rsp_gpu_text_bin_end[0];
extern uint8_t _binary_build_n64_rsp_gpu_data_bin_end[0];
extern uint8_t _binary_build_n64_rsp_gpu_meta_bin_end[0];
static rsp_ucode_t rsp_gpu = (rsp_ucode_t){
.code = _binary_build_n64_rsp_gpu_text_bin_start,
.code_end = _binary_build_n64_rsp_gpu_text_bin_end,
.data = _binary_build_n64_rsp_gpu_data_bin_start,
.data_end = _binary_build_n64_rsp_gpu_data_bin_end,
.meta = _binary_build_n64_rsp_gpu_meta_bin_start,
.meta_end = _binary_build_n64_rsp_gpu_meta_bin_end,
.name = "rsp_gpu"
};
enum {
GPU_CMD_SET_BYTE = 0x0,
GPU_CMD_SET_SHORT = 0x1,
GPU_CMD_SET_WORD = 0x2,
GPU_CMD_SET_LONG = 0x3,
GPU_CMD_DRAW_QUAD = 0x4,
GPU_CMD_MATRIX_LOAD = 0x5,
GPU_CMD_PUSH_RDP = 0x6,
};
typedef struct {
int16_t mvp_matrix_i[4][4];
uint16_t mvp_matrix_f[4][4];
int16_t vp_scale[4];
int16_t vp_offset[4];
uint16_t tex_size[2];
uint16_t tex_offset[2];
uint16_t tri_cmd;
uint16_t tri_cull;
} __attribute__((aligned(8), packed)) gpu_state;
__attribute__((always_inline))
static inline void gpu_set_byte(uint32_t offset, uint8_t value)
{
rspq_write(gpup_id, GPU_CMD_SET_BYTE, offset, value);
}
__attribute__((always_inline))
static inline void gpu_set_short(uint32_t offset, uint16_t value)
{
rspq_write(gpup_id, GPU_CMD_SET_SHORT, offset, value);
}
__attribute__((always_inline))
static inline void gpu_set_word(uint32_t offset, uint32_t value)
{
rspq_write(gpup_id, GPU_CMD_SET_WORD, offset, value);
}
__attribute__((always_inline))
static inline void gpu_set_long(uint32_t offset, uint64_t value)
{
rspq_write(gpup_id, GPU_CMD_SET_LONG, offset, value >> 32, value & 0xFFFFFFFF);
}
#define RDP_CMD_SYNC_PIPE 0xE7000000
#define RDP_CMD_SET_BLEND_COLOR 0xF9000000
__attribute__((always_inline))
static inline void gpu_push_rdp(uint32_t a1, uint64_t a2)
{
rdpq_write(2, gpup_id, GPU_CMD_PUSH_RDP, 0, a1, a2);
}
static float gpu_vp_scale[3];
static float gpu_vp_offset[3];
static bool gpu_texturing;
static void* gpu_pointer;
static int gpu_stride;
#define GPU_ATTR_Z (1 << 8)
#define GPU_ATTR_TEX (1 << 9)
#define GPU_ATTR_SHADE (1 << 10)
#define GPU_ATTR_EDGE (1 << 11)
static bool gpu_attr_z, gpu_attr_tex;
static void gpuUpdateFormat(void)
{
uint16_t cmd = 0xC000 | GPU_ATTR_SHADE | GPU_ATTR_EDGE;
if (gpu_attr_z) cmd |= GPU_ATTR_Z;
if (gpu_attr_tex) cmd |= GPU_ATTR_TEX;
gpu_set_short(offsetof(gpu_state, tri_cmd), cmd);
}
static void gpuSetTexSize(uint16_t width, uint16_t height)
{
gpu_set_word(offsetof(gpu_state, tex_size[0]), (width << 16) | height);
}
static inline void write_shorts(rspq_write_t *w, const uint16_t *s, uint32_t count)
{
for (uint32_t i = 0; i < count; i += 2)
{
uint32_t packed = ((uint32_t)s[i] << 16) | (uint32_t)s[i+1];
rspq_write_arg(w, packed);
}
}
static inline void gpu_matrix_write(rspq_write_t* w, const float* m)
{
uint16_t integer[16];
uint16_t fraction[16];
for (uint32_t i = 0; i < 16; i++)
{
int32_t fixed = m[i] * (1<<16);
integer[i] = (uint16_t)((fixed & 0xFFFF0000) >> 16);
fraction[i] = (uint16_t)(fixed & 0x0000FFFF);
}
write_shorts(w, integer, 16);
write_shorts(w, fraction, 16);
}
static void gpuLoadMatrix(const float* m)
{
rspq_write_t w = rspq_write_begin(gpup_id, GPU_CMD_MATRIX_LOAD, 17);
rspq_write_arg(&w, 0); // padding
gpu_matrix_write(&w, m);
rspq_write_end(&w);
}
static inline void put_word(rspq_write_t* s, uint16_t v1, uint16_t v2)
{
rspq_write_arg(s, v2 | (v1 << 16));
}
static void upload_vertex(rspq_write_t* s, uint32_t index)
{
char* ptr = gpu_pointer + index * gpu_stride;
float* vtx = (float*)(ptr + 0);
put_word(s, vtx[0] * (1<<VTX_SHIFT),
vtx[1] * (1<<VTX_SHIFT));
put_word(s, vtx[2] * (1<<VTX_SHIFT),
1.0f * (1<<VTX_SHIFT));
uint32_t* col = (uint32_t*)(ptr + 12);
rspq_write_arg(s, *col);
if (gpu_texturing) {
float* tex = (float*)(ptr + 16);
put_word(s, tex[0] * (1<<TEX_SHIFT),
tex[1] * (1<<TEX_SHIFT));
} else {
put_word(s, 0,
0);
}
}
static void gpuDrawArrays(uint32_t first, uint32_t count)
{
for (uint32_t i = 0; i < count; i += 4)
{
rspq_write_t s = rspq_write_begin(gpup_id, GPU_CMD_DRAW_QUAD, 17);
rspq_write_arg(&s, 0); // padding
for (uint32_t j = 0; j < 4; j++)
{
upload_vertex(&s, first + i + j);
}
rspq_write_end(&s);
}
}
static void gpuDepthRange(float n, float f)
{
gpu_vp_scale[2] = (f - n) * 0.5f;
gpu_vp_offset[2] = n + (f - n) * 0.5f;
gpu_set_short(offsetof(gpu_state, vp_scale[2]), gpu_vp_scale[2] * 4);
gpu_set_short(offsetof(gpu_state, vp_offset[2]), gpu_vp_offset[2] * 4);
}
static void gpuViewport(int x, int y, int w, int h)
{
gpu_vp_scale[0] = w * 0.5f;
gpu_vp_scale[1] = h * -0.5f;
gpu_vp_offset[0] = x + w * 0.5f;
gpu_vp_offset[1] = y + h * 0.5f;
// Screen coordinates are s13.2
#define SCREEN_XY_SCALE 4.0f
#define SCREEN_Z_SCALE 32767.0f
// * 2.0f to compensate for RSP reciprocal missing 1 bit
uint16_t scale_x = gpu_vp_scale[0] * SCREEN_XY_SCALE * 2.0f;
uint16_t scale_y = gpu_vp_scale[1] * SCREEN_XY_SCALE * 2.0f;
uint16_t scale_z = gpu_vp_scale[2] * SCREEN_Z_SCALE * 2.0f;
uint16_t offset_x = gpu_vp_offset[0] * SCREEN_XY_SCALE;
uint16_t offset_y = gpu_vp_offset[1] * SCREEN_XY_SCALE;
uint16_t offset_z = gpu_vp_offset[2] * SCREEN_Z_SCALE;
gpu_set_long(
offsetof(gpu_state, vp_scale),
((uint64_t)scale_x << 48) | ((uint64_t)scale_y << 32) | ((uint64_t)scale_z << 16));
gpu_set_long(
offsetof(gpu_state, vp_offset),
((uint64_t)offset_x << 48) | ((uint64_t)offset_y << 32) | ((uint64_t)offset_z << 16));
}
static void gpuSetCullFace(bool enabled) {
// 1 = cull backfaces
// 2 = don't cull
gpu_set_short(offsetof(gpu_state, tri_cull), enabled ? 1 : 2);
}
static void gpu_init() {
gpup_id = rspq_overlay_register(&rsp_gpu);
gpuDepthRange(0, 1);
}
static void gpu_close() {
rspq_wait();
rspq_overlay_unregister(gpup_id);
}

531
misc/n64/rsp_gpu.S Normal file
View File

@@ -0,0 +1,531 @@
#include <rsp_queue.inc>
#include <rdpq_macros.h>
#define MATRIX_SIZE 64
#define GUARD_BAND_FACTOR 2
.data
RSPQ_BeginOverlayHeader
RSPQ_DefineCommand GPUCmd_SetByte, 8 # 0x0
RSPQ_DefineCommand GPUCmd_SetShort, 8 # 0x1
RSPQ_DefineCommand GPUCmd_SetWord, 8 # 0x2
RSPQ_DefineCommand GPUCmd_SetLong, 12 # 0x3
RSPQ_DefineCommand GPUCmd_DrawQuad, 68 # 0x4
RSPQ_DefineCommand GPUCmd_MatrixLoad, 68 # 0x5
RSPQ_DefineCommand GPUCmd_PushRDP, 12 # 0x6
RSPQ_EndOverlayHeader
.align 4
BANNER0: .ascii " RSP OpenGL T&L "
BANNER1: .ascii "Rasky & Snacchus"
RSPQ_BeginSavedState
GL_STATE:
# This is the GL state that is also used by the pipeline.
GL_MATRIX_MVP: .ds.b MATRIX_SIZE
GL_VIEWPORT_SCALE: .half 0,0,0,0
GL_VIEWPORT_OFFSET: .half 0,0,0,0
GL_STATE_TEX_SIZE: .half 0,0
GL_STATE_TEX_OFFSET: .half 0,0
GL_TRI_CMD: .half 0
GL_TRI_CULL: .half 0
RSPQ_EndSavedState
.align 4
CLIP_CODE_FACTORS: .half 1, 1, GUARD_BAND_FACTOR, GUARD_BAND_FACTOR
DRAW_TRI_RA: .word 0
#define SCREEN_VTX_CS_POSi 0 // X, Y, Z, W (all 32-bit)
#define SCREEN_VTX_CS_POSf 8 // X, Y, Z, W (all 32-bit)
#define SCREEN_VTX_X 16
#define SCREEN_VTX_Y 18
#define SCREEN_VTX_Z 20
#define SCREEN_VTX_CLIP_CODE 22
#define SCREEN_VTX_PADDING 23
#define SCREEN_VTX_RGBA 24
#define SCREEN_VTX_S_T 28 // 28 S, 30 T
#define SCREEN_VTX_W 32 // FIXME: this is duplicated in CS_POS
#define SCREEN_VTX_INVW 36 // 32-bit
#define SCREEN_VTX_SIZE 40
.bss
.align 3
#define VERTEX_CACHE_SIZE 4
//0-39 same as screenvtx
#define PRIM_VTX_TRCODE 40 // trivial-reject clipping flags (against -w/+w)
#define PRIM_VTX_SIZE 42
VERTEX_CACHE: .dcb.b PRIM_VTX_SIZE * VERTEX_CACHE_SIZE
.text
.func GPUCmd_SetByte
GPUCmd_SetByte:
jr ra
sb a1, %lo(GL_STATE)(a0)
.endfunc
.func GPUCmd_SetShort
GPUCmd_SetShort:
jr ra
sh a1, %lo(GL_STATE)(a0)
.endfunc
.func GPUCmd_SetWord
GPUCmd_SetWord:
jr ra
sw a1, %lo(GL_STATE) + 0(a0)
.endfunc
.func GPUCmd_SetLong
GPUCmd_SetLong:
sw a2, %lo(GL_STATE) + 4(a0)
jr ra
sw a1, %lo(GL_STATE) + 0(a0)
.endfunc
.func GPUCmd_PushRDP
GPUCmd_PushRDP:
# RDP command is expected in a0 and a1
move a0, a1
move a1, a2
jal_and_j RDPQ_Write8, RDPQ_Finalize
.endfunc
.func GPUCmd_MatrixLoad
GPUCmd_MatrixLoad:
#define src s6
#define dst s7
#define vrhs01_i $v02
#define vrhs01_f $v03
#define vrhs23_i $v04
#define vrhs23_f $v05
addi src, rspq_dmem_buf_ptr, %lo(RSPQ_DMEM_BUFFER) - 64
addi dst, zero, %lo(GL_MATRIX_MVP)
# Load the matrix from command parameters (misaligned)
lqv vrhs01_i, 0x00,src
lrv vrhs01_i, 0x10,src
lqv vrhs23_i, 0x10,src
lrv vrhs23_i, 0x20,src
lqv vrhs01_f, 0x20,src
lrv vrhs01_f, 0x30,src
lqv vrhs23_f, 0x30,src
lrv vrhs23_f, 0x40,src
sqv vrhs01_i, 0x00,dst
sqv vrhs23_i, 0x10,dst
sqv vrhs01_f, 0x20,dst
jr ra
sqv vrhs23_f, 0x30,dst
#undef src
#undef dst
.endfunc
.align 3
.func GPUCmd_DrawQuad
GPUCmd_DrawQuad:
#define vtx a0
#define mtx_ptr s0
#define src_ptr s4
#define vcount s3
#define v___ $v01
#define vmtx0_i $v16 // m00 m01 m02 m03
#define vmtx0_f $v17
#define vmtx1_i $v18 // m10 m11 m12 m13
#define vmtx1_f $v19
#define vmtx2_i $v20 // m20 m21 m22 m23
#define vmtx2_f $v21
#define vmtx3_i $v22 // m30 m31 m32 m03
#define vmtx3_f $v23
#define vpos $v24
#define vcol $v25
#define vtex $v26
#define vcspos_i $v28
#define vcspos_f $v29
#define x e0
#define y e1
#define z e2
#define w e3
addi src_ptr, rspq_dmem_buf_ptr, %lo(RSPQ_DMEM_BUFFER) - 64
li vtx, %lo(VERTEX_CACHE)
li vcount, 4
li mtx_ptr, %lo(GL_MATRIX_MVP)
ldv vmtx0_i.e0, 0x00,mtx_ptr
ldv vmtx1_i.e0, 0x08,mtx_ptr
ldv vmtx2_i.e0, 0x10,mtx_ptr
ldv vmtx3_i.e0, 0x18,mtx_ptr
ldv vmtx0_f.e0, 0x20,mtx_ptr
ldv vmtx1_f.e0, 0x28,mtx_ptr
ldv vmtx2_f.e0, 0x30,mtx_ptr
ldv vmtx3_f.e0, 0x38,mtx_ptr
upload_vertex:
ldv vpos, 0, src_ptr # Load X, Y, Z, W
llv vcol, 8, src_ptr # Load RGBA
llv vtex, 12, src_ptr # Load U, V
# matrix multiply
vmudn v___, vmtx0_f, vpos.h0
vmadh v___, vmtx0_i, vpos.h0
vmadn v___, vmtx1_f, vpos.h1
vmadh v___, vmtx1_i, vpos.h1
vmadn v___, vmtx2_f, vpos.h2
vmadh v___, vmtx2_i, vpos.h2
vmadn v___, vmtx3_f, vpos.h3
vmadh vcspos_i, vmtx3_i, vpos.h3
vmadn vcspos_f, vzero, vzero
slv vcol, SCREEN_VTX_RGBA, vtx
slv vtex, SCREEN_VTX_S_T, vtx
# 32-bit right shift by 5, to keep the clip space coordinates unscaled
vmudm vcspos_i, vcspos_i, vshift8.e4
vmadl vcspos_f, vcspos_f, vshift8.e4
addi vcount, -1
addi src_ptr, 16
sdv vcspos_i, SCREEN_VTX_CS_POSi,vtx
sdv vcspos_f, SCREEN_VTX_CS_POSf,vtx
# Calculate and store clipping flags against CS.W.
# These will be used for trivial rejections.
vch v___, vcspos_i, vcspos_i.w
vcl v___, vcspos_f, vcspos_f.w
cfc2 t0, COP2_CTRL_VCC
andi t0, 0x707 # Isolate X/Y/Z flags
# Compress flags to 8 bit
srl t1, t0, 5
andi t0, 0x7
or t0, t1
sb t0, PRIM_VTX_TRCODE(vtx)
bnez vcount, upload_vertex
addi vtx, PRIM_VTX_SIZE
# now do the actual drawing
li a1, %lo(VERTEX_CACHE) + 0*PRIM_VTX_SIZE
li a2, %lo(VERTEX_CACHE) + 1*PRIM_VTX_SIZE
jal GPUCmd_DrawTriangle
li a3, %lo(VERTEX_CACHE) + 2*PRIM_VTX_SIZE
li a1, %lo(VERTEX_CACHE) + 0*PRIM_VTX_SIZE
li a2, %lo(VERTEX_CACHE) + 2*PRIM_VTX_SIZE
jal GPUCmd_DrawTriangle
li a3, %lo(VERTEX_CACHE) + 3*PRIM_VTX_SIZE
j RSPQ_Loop
nop
#undef src_ptr
#undef vtx
#undef x
#undef y
#undef z
#undef w
#undef v___
#undef vmtx0_i
#undef vmtx0_f
#undef vmtx1_i
#undef vmtx1_f
#undef vmtx2_i
#undef vmtx2_f
#undef vmtx3_i
#undef vmtx3_f
#undef vpos
#undef vcspos_i
#undef vcspos_f
.endfunc
################################################################
# GL_CalcScreenSpace
#
# Args:
# s3 = Destination vertex address
# $v02 = Clip space position (fractional part)
# $v03 = Clip space position (integer part)
#
################################################################
.func GL_CalcScreenSpace
GL_CalcScreenSpace:
#define dst s3
#define vcspos_f $v02
#define vcspos_i $v03
#define vinvw_f $v23
#define vinvw_i $v24
#define vviewscale $v25
#define vviewoff $v26
#define vscreenpos_i $v27
#define vscreenpos_f $v28
#define v___ $v29
#define w e3
# Calculate 32-bit inverse W
# TODO: NR?
vrcph vinvw_i.w, vcspos_i.w
vrcpl vinvw_f.w, vcspos_f.w
vrcph vinvw_i.w, vzero.e0
# Calculate screenspace coords
li t0, %lo(GL_VIEWPORT_SCALE)
ldv vviewscale, 0,t0
ldv vviewoff, 8,t0
vmudl v___, vcspos_f, vinvw_f.w
vmadm v___, vcspos_i, vinvw_f.w
vmadn vscreenpos_f, vcspos_f, vinvw_i.w
vmadh vscreenpos_i, vcspos_i, vinvw_i.w
vmudn vscreenpos_f, vscreenpos_f, vviewscale
vmadh vscreenpos_i, vscreenpos_i, vviewscale
vadd vscreenpos_i, vviewoff
sdv vscreenpos_i, SCREEN_VTX_X ,dst
ssv vcspos_i.w, SCREEN_VTX_W+0 ,dst
ssv vcspos_f.w, SCREEN_VTX_W+2 ,dst
ssv vinvw_i.w, SCREEN_VTX_INVW+0,dst
ssv vinvw_f.w, SCREEN_VTX_INVW+2,dst
jr ra
sb zero, SCREEN_VTX_PADDING(dst)
#undef dst
#undef vcspos_f
#undef vcspos_i
#undef vinvw_f
#undef vinvw_i
#undef vviewscale
#undef vviewoff
#undef vscreenpos_i
#undef vscreenpos_f
#undef v___
#undef w
.endfunc
################################################################
# GL_CalcClipCodes
#
# Args:
# s3 = Destination vertex address
# $v02 = Clip space position (fractional part)
# $v03 = Clip space position (integer part)
#
################################################################
.func GL_CalcClipCodes
GL_CalcClipCodes:
#define dst s3
#define vcspos_f $v02
#define vcspos_i $v03
#define vguard_f $v27
#define vguard_i $v28
#define v___ $v29
#define w e3
li t0, %lo(CLIP_CODE_FACTORS)
ldv vguard_i, 0,t0
vmudn vguard_f, vcspos_f, vguard_i
vmadh vguard_i, vcspos_i, vguard_i
vch v___, vguard_i, vguard_i.w
vcl v___, vguard_f, vguard_f.w
cfc2 t0, COP2_CTRL_VCC
andi t0, 0x707
srl t1, t0, 5
andi t0, 0x7
or t0, t1
jr ra
sb t0, SCREEN_VTX_CLIP_CODE(dst)
#undef dst
#undef vcspos_i
#undef vcspos_f
#undef vguard_i
#undef vguard_f
#undef v___
#undef w
.endfunc
################################################################
# GL_TnL
#
# Args:
# s3 = address of the vertex in DMEM (usually within VERTEX_CACHE)
#
################################################################
.func GL_TnL
GL_TnL:
#define vtx s3
#define v___ $v01
#define vcspos_f $v02
#define vcspos_i $v03
#define vtexsize $v06
#define vtexoffset $v07
#define vst $v08
#define vst_i $v28
#define vst_f $v29
move ra2, ra
llv vst, SCREEN_VTX_S_T, vtx # S + T
li t0, %lo(GL_STATE_TEX_SIZE)
llv vtexsize, 0,t0
llv vtexoffset, 4,t0
# Scale texcoord by texsize and subtract offset (to correct for bilinear sampling if active)
#vmudn v___, vst, vtexsize
# vmadh vst, vtexoffset, K1
#vmudn v___, vst, vtexsize
#vmadh vst, vtexoffset, K1
#vmudl vst, vst, vtexsize
vmudh v___, vst, vtexsize
vsar vst_i, COP2_ACC_HI
vsar vst_f, COP2_ACC_MD
vmudl vst_f, vst_f, K8192
vmadm vst_i, vst_i, K8192
vmadn vst, vzero, vzero
#undef vst_i
#undef vst_f
lbu t0, PRIM_VTX_TRCODE(vtx)
slv vst, SCREEN_VTX_S_T, vtx
ldv vcspos_f, SCREEN_VTX_CS_POSf,vtx
ldv vcspos_i, SCREEN_VTX_CS_POSi,vtx
# Mark this vertex as having T&L applied
ori t0, 0x80
jal GL_CalcScreenSpace
sb t0, PRIM_VTX_TRCODE(vtx)
j GL_CalcClipCodes
move ra, ra2
#undef vcspos_f
#undef vcspos_i
#undef vtexsize
#undef vtexoffset
#undef vtx
#undef v___
#undef vrgba
#undef vst
#undef s
.endfunc
.func GPUCmd_DrawTriangle
GPUCmd_DrawTriangle:
#define vtx1 a1
#define vtx2 a2
#define vtx3 a3
#define trcode1 t6
#define trcode2 t7
#define trcode3 t8
sw ra, %lo(DRAW_TRI_RA) # TODO find a register for this
# Trivial reject: if all the vertices are out of the same plane (at least one),
# the triangle is out of the viewport.
# NOTE: This deliberately uses lb instead of lbu so the sign bit is extended.
# The MSB of each TR-code is a bit flag that is set if the vertex has already
# had T&L applied once.
lb trcode1, PRIM_VTX_TRCODE(vtx1)
lb trcode2, PRIM_VTX_TRCODE(vtx2)
lb trcode3, PRIM_VTX_TRCODE(vtx3)
and t0, trcode1, trcode2
and t0, trcode3
andi t0, 0x3F
bnez t0, JrRa
nop
# Perform T&L for each vertex if we haven't already
bgezal trcode1, GL_TnL
move s3, vtx1
bgezal trcode2, GL_TnL
move s3, vtx2
bgezal trcode3, GL_TnL
move s3, vtx3
lbu t0, SCREEN_VTX_CLIP_CODE(vtx1)
lbu t1, SCREEN_VTX_CLIP_CODE(vtx2)
lbu t2, SCREEN_VTX_CLIP_CODE(vtx3)
or t5, t0, t1
or t5, t2
move s1, zero
beqz t5, gl_draw_single_triangle
move s2, zero
jal GL_ClipTriangle
nop
beqz v1, gl_draw_triangle_end
addi s2, -6
lhu s5, 0(s1)
gl_draw_clipped_triangles_loop:
move vtx1, s5
lhu vtx2, 2(s1)
lhu vtx3, 4(s1)
gl_draw_single_triangle:
addi vtx1, SCREEN_VTX_X
addi vtx2, SCREEN_VTX_X
addi vtx3, SCREEN_VTX_X
lhu a0, %lo(GL_TRI_CMD)
lh v0, %lo(GL_TRI_CULL)
jal RDPQ_Triangle
li s3, %lo(RDPQ_CMD_STAGING)
jal RDPQ_Send
li s4, %lo(RDPQ_CMD_STAGING)
blt s1, s2, gl_draw_clipped_triangles_loop
addi s1, 2
gl_draw_triangle_end:
lw ra, %lo(DRAW_TRI_RA)
jr ra
nop
#undef vtx1
#undef vtx2
#undef vtx3
.endfunc
#include "rsp_gpu_clipping.inc"
#include <rsp_rdpq.inc>

View File

@@ -0,0 +1,380 @@
#define CLIPPING_PLANE_COUNT 6
#define CLIPPING_CACHE_SIZE 9
#define CLIPPING_PLANE_SIZE 8
.section .data.gl_clipping
.align 4
CLIP_PLANES:
.half 1, 0, 0, GUARD_BAND_FACTOR
.half 0, 1, 0, GUARD_BAND_FACTOR
.half 0, 0, 1, 1
.half 1, 0, 0, -GUARD_BAND_FACTOR
.half 0, 1, 0, -GUARD_BAND_FACTOR
.half 0, 0, 1, -1
.align 4
CACHE_OFFSETS: .half 2,4,6,8,10,12,14,16,18
.section .bss.gl_clipping
CLIP_CACHE: .dcb.b SCREEN_VTX_SIZE * CLIPPING_CACHE_SIZE
CLIP_CACHE_END:
CLIP_LISTS:
CLIP_LIST0: .dcb.w CLIPPING_CACHE_SIZE
CLIP_LIST1: .dcb.w CLIPPING_CACHE_SIZE
.section .text.gl_clipping
################################################################
# GL_ClipTriangle
# Clip a triangle against the view-frustum by using the Sutherland-Hodgman algorithm
# https://en.wikipedia.org/wiki/Sutherland%E2%80%93Hodgman_algorithm
# Args:
# a1-a3 = Vertices
# t5 = OR'd clip flags of the triangle's vertices
# Returns:
# s1 = Pointer to list of output vertices
# s2 = Pointer to end of list
################################################################
.func GL_ClipTriangle
GL_ClipTriangle:
#define out_count v1
#define clip_flags t5
#define plane_flag t6
#define in_count t7
#define in_end t8
#define in_list s0
#define out_list s1
#define plane s2
#define intersection s3
#define cur_ptr s4
#define prev_ptr s5
#define cur_vtx s6
#define prev_vtx s7
#define p0 k0
#define p1 k1
#define vtx1 a1
#define vtx2 a2
#define vtx3 a3
#define vplane $v01
#define vint_f $v02
#define vint_i $v03
#define vdot_i $v04
#define vdot_f $v05
#define vdiff_i $v06
#define vdiff_f $v07
#define va_i $v08
#define va_f $v09
#define vpos_i $v10
#define vpos_f $v11
#define vattr0 $v12
#define vattr1 $v13
#define voff0 $v14
#define voff1 $v15
#define vcache0 $v16
#define vcache1 $v17
#define v__ $v29
move ra2, ra
# Init in_list as empty
li in_list, %lo(CLIP_LIST0)
move in_count, zero
# Put three original vertices in the out_list
# (So after the initial swap they will be in the in_list)
li out_list, %lo(CLIP_LIST1)
sh vtx1, 0(out_list)
sh vtx2, 2(out_list)
sh vtx3, 4(out_list)
li out_count, 3*2
li plane, %lo(CLIP_PLANES)
li plane_flag, 1
# Load cache offsets
li t0, %lo(CACHE_OFFSETS)
vxor voff1, voff1
lqv voff0, 0,t0
lsv voff1, 16,t0
# Temporarily use the RDP staging area as a map of which cache slots are used
# Init to zero
li t0, %lo(RDPQ_CMD_STAGING)
sqv vzero, 0,t0
sqv vzero, 16,t0
# Iterate over the 6 clipping planes
gl_clip_plane_loop:
and t0, clip_flags, plane_flag
beqz t0, gl_clip_plane_loop_end
move t1, in_list
# Swap in and out lists
# If the out list is empty from the last iteration,
# the triangle has no visible points and we are done
beqz out_count, gl_clip_return
move in_list, out_list
move out_list, t1
move in_count, out_count
move out_count, zero
# Iterate over the egdes of the polygon in the input list
# The current edge is between cur_vtx and prev_vtx
move cur_ptr, in_list
add in_end, in_list, in_count
# Init the "previous" vertex to the last in the list for the wrap-around
addi prev_ptr, in_end, -2
gl_clip_edge_loop:
#define cur_flag t3
#define prev_flag t4
# Check which side of the plane the two vertices are on
lhu cur_vtx, 0(cur_ptr)
lhu prev_vtx, 0(prev_ptr)
lbu cur_flag, SCREEN_VTX_CLIP_CODE(cur_vtx)
lbu prev_flag, SCREEN_VTX_CLIP_CODE(prev_vtx)
and cur_flag, plane_flag
and prev_flag, plane_flag
# If they are on opposite sides, there is an intersection
xor t0, cur_flag, prev_flag
beqz t0, gl_clip_no_intersection
move p0, cur_vtx
# Swap the two points if necessary to make intersection calculation consistent
# This will make sure p0 is always inside and p1 is always outside
bnez prev_flag, gl_clip_no_swap
move p1, prev_vtx
xor p0, p0, p1
xor p1, p0, p1
xor p0, p0, p1
#undef prev_flag
gl_clip_no_swap:
# Calculate intersection of the line segment and the plane
li t0, %lo(RDPQ_CMD_STAGING)
lqv vcache0, 0,t0
lqv vcache1, 16,t0
# Repeat plane coefficients twice
ldv vplane.e0, 0,plane
ldv vplane.e4, 0,plane
# vpos: x0 y0 z0 w0 x1 y1 z1 w1
ldv vpos_i.e0, SCREEN_VTX_CS_POSi,p0
ldv vpos_f.e0, SCREEN_VTX_CS_POSf,p0
ldv vpos_i.e4, SCREEN_VTX_CS_POSi,p1
ldv vpos_f.e4, SCREEN_VTX_CS_POSf,p1
# vint: x1 y1 z1 w1
ldv vint_i.e0, SCREEN_VTX_CS_POSi,p1
ldv vint_f.e0, SCREEN_VTX_CS_POSf,p1
# vattr0: r0 g0 b0 a0 s0 t0
luv vattr0.e0, SCREEN_VTX_RGBA ,p0
llv vattr0.e4, SCREEN_VTX_S_T ,p0
# vattr1: r1 g1 b1 a1 s1 t1
luv vattr1.e0, SCREEN_VTX_RGBA ,p1
llv vattr1.e4, SCREEN_VTX_S_T ,p1
# Find first free slot in clip cache
# Add the values from the "used slots map" to the cache offsets
# After this, each lane will contain the offset of its corresponding cache slot,
# but only if the slot is not used. If it is used, it will contain some large value.
vaddc vcache0, voff0
vaddc vcache1, voff1
# Look for the smallest value, which will end up in vcache.e0
# Because used slots are marked as large values, they will never be found.
vlt vcache0, vcache0.q1
vlt vcache0, vcache0.h2
vlt vcache0, vcache0.e4
vlt vcache0, vcache1.e0
mfc2 t0, vcache0.e0
# Mark slot as used by storing some large value (careful of overflows!)
li t1, 0xFF
sh t1, %lo(RDPQ_CMD_STAGING)-2(t0)
# t0 is the index multiplied by 2
# intersection = t0 * 20 = t0 * 16 + t0 * 4
sll intersection, t0, 4
sll t1, t0, 2
add intersection, t1
# CAUTION: intersection might point to the same address as either p0 or p1,
# because one of them is the previous point, which could have been marked unused
# in the previous iteration. As long as we don't access p0 or p1 after writing to
# intersection, this is fine.
addi intersection, %lo(CLIP_CACHE) - SCREEN_VTX_SIZE
# Store the cache offset in unused memory (used later when finding the cache slot to mark as unused)
sb t0, SCREEN_VTX_PADDING(intersection)
# Compute dot products of both positions with the clip plane
# vdot.e0: d0 = dot(p0, plane)
# vdot.e4: d1 = dot(p1, plane)
vmudn vdot_f, vpos_f, vplane
vmadh vdot_i, vpos_i, vplane
vaddc vdot_f, vdot_f.q1
vadd vdot_i, vdot_i.q1
vaddc vdot_f, vdot_f.h2
vadd vdot_i, vdot_i.h2
# d0 - d1
vsubc vdiff_f, vdot_f, vdot_f.e4
vsub vdiff_i, vdot_i, vdot_i.e4
# 1 / (d0 - d1)
vrcph v__.e0, vdiff_i.e0
vrcpl va_f.e0, vdiff_f.e0
vrcph va_i.e0, vzero.e0
# a = d0 / (d0 - d1)
vmudl v__, va_f, vdot_f.e0
vmadm v__, va_i, vdot_f.e0
vmadn va_f, va_f, vdot_i.e0
# Prepare 0x7FFF in va_i.e0
vsubc va_i, vshift8, K1
# a = min(a, 1)
vge v__, va_f, vzero
vmrg va_f, va_f, va_i.e0
# Account for right shift introduced by vrcp
vmudn va_f, va_f, K2
# p1 - p0
vsubc vint_f, vpos_f
vsub vint_i, vpos_i
# attr1 - attr0
vsubc vattr1, vattr0
# Result of linear interpolation:
# p0 + a * (p1 - p0)
vmudl v__, vint_f, va_f.e0
vmadm v__, vint_i, va_f.e0
vmadn vint_f, vpos_f, K1
vmadh vint_i, vpos_i, K1
# a * (attr1 - attr0)
vmudm vattr1, vattr1, va_f.e0
# attr0 + a * (attr1 - attr0)
vaddc vattr0, vattr1
# Store results
sdv vint_i.e0, SCREEN_VTX_CS_POSi,intersection
sdv vint_f.e0, SCREEN_VTX_CS_POSf,intersection
suv vattr0.e0, SCREEN_VTX_RGBA ,intersection
jal GL_CalcClipCodes
slv vattr0.e4, SCREEN_VTX_S_T ,intersection
# Add intersection to the output list
add t0, out_list, out_count
sh intersection, 0(t0)
addi out_count, 2
gl_clip_no_intersection:
# If cur_vtx is inside, add it to the output list
bnez cur_flag, gl_clip_no_current
add t0, out_list, out_count
sh cur_vtx, 0(t0)
b gl_clip_edge_loop_end
addi out_count, 2
#undef cur_flag
gl_clip_no_current:
# Check if the vertex is stored in the clip cache
lbu t0, SCREEN_VTX_PADDING(cur_vtx)
beqz t0, gl_clip_edge_loop_end
# Reset the padding field to zero, so the screen space values won't be recalculated below
sb zero, SCREEN_VTX_PADDING(cur_vtx)
# If so, mark it as unused
sh zero, %lo(RDPQ_CMD_STAGING)-2(t0)
gl_clip_edge_loop_end:
# Advance to the next edge
addi cur_ptr, 2
blt cur_ptr, in_end, gl_clip_edge_loop
addi prev_ptr, cur_ptr, -2
gl_clip_plane_loop_end:
# Advance to the next clipping plane
sll plane_flag, 1
blt plane_flag, (1<<CLIPPING_PLANE_COUNT), gl_clip_plane_loop
addi plane, CLIPPING_PLANE_SIZE
#define cache_vtx s3
#define cache_end s5
# Calculate screen space values for new vertices (in the clip cache)
# TODO: maybe iterate over out_list instead
li cache_vtx, %lo(CLIP_CACHE)
li cache_end, %lo(CLIP_CACHE_END) - SCREEN_VTX_SIZE
gl_clip_finalize_loop:
lbu t0, SCREEN_VTX_PADDING(cache_vtx)
neg t0
# Only calculate screen space values if the vertex is actually used
ldv vint_i, SCREEN_VTX_CS_POSi,cache_vtx
bltzal t0, GL_CalcScreenSpace
ldv vint_f, SCREEN_VTX_CS_POSf,cache_vtx
blt cache_vtx, cache_end, gl_clip_finalize_loop
addi cache_vtx, SCREEN_VTX_SIZE
gl_clip_return:
# Done!
jr ra2
add s2, out_list, out_count
#undef cache_vtx
#undef cache_end
#undef clip_flags
#undef plane_flag
#undef in_count
#undef out_count
#undef in_end
#undef intersection
#undef in_list
#undef out_list
#undef plane
#undef cur_ptr
#undef prev_ptr
#undef cur_vtx
#undef prev_vtx
#undef p0
#undef p1
#undef vtx1
#undef vtx2
#undef vtx3
#undef vplane
#undef vpos_i
#undef vpos_f
#undef vdot_i
#undef vdot_f
#undef vdiff_i
#undef vdiff_f
#undef va_f
#undef vint_i
#undef vint_f
#undef vattr0
#undef vattr1
#undef v__
.endfunc

64
misc/opengl/GL1Funcs.h Normal file
View File

@@ -0,0 +1,64 @@
/* Raster state functions */
GL_FUNC(void, glAlphaFunc, (GLenum func, GLfloat ref))
GL_FUNC(void, glBlendFunc, (GLenum sfactor, GLenum dfactor))
GL_FUNC(void, glClearColor, (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha))
GL_FUNC(void, glColorMask, (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha))
GL_FUNC(void, glDepthFunc, (GLenum func))
GL_FUNC(void, glDepthMask, (GLboolean flag))
GL_FUNC(void, glDisable, (GLenum cap))
GL_FUNC(void, glDisableClientState, (GLenum array))
GL_FUNC(void, glEnable, (GLenum cap))
GL_FUNC(void, glEnableClientState, (GLenum array))
/* Fog functions */
GL_FUNC(void, glFogf, (GLenum pname, GLfloat param))
GL_FUNC(void, glFogfv, (GLenum pname, const GLfloat* params))
GL_FUNC(void, glFogi, (GLenum pname, GLint param))
GL_FUNC(void, glFogiv, (GLenum pname, const GLint* params))
/* Transform functions */
GL_FUNC(void, glLoadIdentity, (void))
GL_FUNC(void, glLoadMatrixf, (const GLfloat* m))
GL_FUNC(void, glMatrixMode, (GLenum mode))
GL_FUNC(void, glViewport, (GLint x, GLint y, GLsizei width, GLsizei height))
/* Draw functions */
GL_FUNC(void, glDrawArrays, (GLenum mode, GLint first, GLsizei count))
GL_FUNC(void, glDrawElements, (GLenum mode, GLsizei count, GLenum type, const GLvoid* indices))
GL_FUNC(void, glColorPointer, (GLint size, GLenum type, GLsizei stride, GLpointer pointer))
GL_FUNC(void, glTexCoordPointer, (GLint size, GLenum type, GLsizei stride, GLpointer pointer))
GL_FUNC(void, glVertexPointer, (GLint size, GLenum type, GLsizei stride, GLpointer pointer))
/* Misc functions */
GL_FUNC(void, glClear, (GLuint mask))
GL_FUNC(void, glHint, (GLenum target, GLenum mode))
GL_FUNC(void, glReadPixels, (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid* pixels))
GL_FUNC(void, glScissor, (GLint x, GLint y, GLsizei width, GLsizei height))
/* Texture functions */
GL_FUNC(void, glBindTexture, (GLenum target, GLuint texture))
GL_FUNC(void, glDeleteTextures, (GLsizei n, const GLuint* textures))
GL_FUNC(void, glGenTextures, (GLsizei n, GLuint* textures))
GL_FUNC(void, glTexImage2D, (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid* pixels))
GL_FUNC(void, glTexSubImage2D, (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid* pixels))
GL_FUNC(void, glTexParameteri, (GLenum target, GLenum pname, GLint param))
/* State get functions */
GL_FUNC(GLenum, glGetError, (void))
GL_FUNC(void, glGetFloatv, (GLenum pname, GLfloat* params))
GL_FUNC(void, glGetIntegerv, (GLenum pname, GLint* params))
GL_FUNC(const GLubyte*, glGetString, (GLenum name))
/* Legacy display list functions */
GL_FUNC(void, glCallList, (GLuint list))
GL_FUNC(void, glDeleteLists, (GLuint list, GLsizei range))
GL_FUNC(GLuint, glGenLists, (GLsizei range))
GL_FUNC(void, glNewList, (GLuint list, GLenum mode))
GL_FUNC(void, glEndList, (void))
/* Legacy vertex draw functions */
GL_FUNC(void, glBegin, (GLenum mode))
GL_FUNC(void, glEnd, (void))
GL_FUNC(void, glColor4ub, (GLubyte r, GLubyte g, GLubyte b, GLubyte a))
GL_FUNC(void, glTexCoord2f, (float u, float v))
GL_FUNC(void, glVertex3f, (float x, float y, float z))

64
misc/opengl/GL1Macros.h Normal file
View File

@@ -0,0 +1,64 @@
/* Raster state functions */
#define _glAlphaFunc glAlphaFunc
#define _glBlendFunc glBlendFunc
#define _glClearColor glClearColor
#define _glColorMask glColorMask
#define _glDepthFunc glDepthFunc
#define _glDepthMask glDepthMask
#define _glDisable glDisable
#define _glDisableClientState glDisableClientState
#define _glEnable glEnable
#define _glEnableClientState glEnableClientState
/* Fog functions */
#define _glFogf glFogf
#define _glFogfv glFogfv
#define _glFogi glFogi
#define _glFogiv glFogiv
/* Transform functions */
#define _glLoadIdentity glLoadIdentity
#define _glLoadMatrixf glLoadMatrixf
#define _glMatrixMode glMatrixMode
#define _glViewport glViewport
/* Draw functions */
#define _glDrawArrays glDrawArrays
#define _glDrawElements glDrawElements
#define _glColorPointer glColorPointer
#define _glTexCoordPointer glTexCoordPointer
#define _glVertexPointer glVertexPointer
/* Misc functions */
#define _glClear glClear
#define _glHint glHint
#define _glReadPixels glReadPixels
#define _glScissor glScissor
/* Texture functions */
#define _glBindTexture glBindTexture
#define _glDeleteTextures glDeleteTextures
#define _glGenTextures glGenTextures
#define _glTexImage2D glTexImage2D
#define _glTexSubImage2D glTexSubImage2D
#define _glTexParameteri glTexParameteri
/* State get functions */
#define _glGetError glGetError
#define _glGetFloatv glGetFloatv
#define _glGetIntegerv glGetIntegerv
#define _glGetString glGetString
/* Legacy display list functions */
#define _glCallList glCallList
#define _glDeleteLists glDeleteLists
#define _glGenLists glGenLists
#define _glNewList glNewList
#define _glEndList glEndList
/* Legacy vertex draw functions */
#define _glBegin glBegin
#define _glEnd glEnd
#define _glColor4ub glColor4ub
#define _glTexCoord2f glTexCoord2f
#define _glVertex3f glVertex3f

36
misc/opengl/GL2Funcs.h Normal file
View File

@@ -0,0 +1,36 @@
/* Buffer functions */
GL_FUNC(void, glBindBuffer, (GLenum target, GLuint buffer))
GL_FUNC(void, glDeleteBuffers, (GLsizei n, const GLuint* buffers))
GL_FUNC(void, glGenBuffers, (GLsizei n, GLuint *buffers))
GL_FUNC(void, glBufferData, (GLenum target, cc_uintptr size, const GLvoid* data, GLenum usage))
GL_FUNC(void, glBufferSubData, (GLenum target, cc_uintptr offset, cc_uintptr size, const GLvoid* data))
/* Shader functions */
GL_FUNC(GLuint, glCreateShader, (GLenum type))
GL_FUNC(void, glDeleteShader, (GLuint shader))
GL_FUNC(void, glGetShaderiv, (GLuint shader, GLenum pname, GLint* params))
GL_FUNC(void, glGetShaderInfoLog, (GLuint shader, GLsizei bufSize, GLsizei* length, char* infoLog))
GL_FUNC(void, glShaderSource, (GLuint shader, GLsizei count, const char* const* string, const GLint* length))
GL_FUNC(void, glAttachShader, (GLuint program, GLuint shader))
GL_FUNC(void, glBindAttribLocation, (GLuint program, GLuint index, const char* name))
GL_FUNC(void, glCompileShader, (GLuint shader))
GL_FUNC(void, glDetachShader, (GLuint program, GLuint shader))
GL_FUNC(void, glLinkProgram, (GLuint program))
/* Program functions */
GL_FUNC(GLuint, glCreateProgram, (void))
GL_FUNC(void, glDeleteProgram, (GLuint program))
GL_FUNC(void, glGetProgramiv, (GLuint program, GLenum pname, GLint* params))
GL_FUNC(void, glGetProgramInfoLog, (GLuint program, GLsizei bufSize, GLsizei* length, char* infoLog))
GL_FUNC(void, glUseProgram, (GLuint program))
GL_FUNC(void, glDisableVertexAttribArray, (GLuint index))
GL_FUNC(void, glEnableVertexAttribArray, (GLuint index))
GL_FUNC(void, glVertexAttribPointer, (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void* pointer))
GL_FUNC(GLint, glGetUniformLocation, (GLuint program, const char* name))
GL_FUNC(void, glUniform1f, (GLint location, GLfloat v0))
GL_FUNC(void, glUniform2f, (GLint location, GLfloat v0, GLfloat v1))
GL_FUNC(void, glUniform3f, (GLint location, GLfloat v0, GLfloat v1, GLfloat v2))
GL_FUNC(void, glUniformMatrix4fv, (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value))

108
misc/opengl/GLCommon.h Normal file
View File

@@ -0,0 +1,108 @@
#if defined CC_BUILD_WIN
/* Avoid pointless includes */
#define WIN32_LEAN_AND_MEAN
#define NOSERVICE
#define NOMCX
#define NOIME
#include <windows.h>
#define GLAPI WINGDIAPI
#elif defined CC_BUILD_SYMBIAN && !defined __WINSCW__
#define GLAPI IMPORT_C
#define APIENTRY
#else
#define GLAPI extern
#define APIENTRY
#endif
typedef unsigned int GLenum;
typedef unsigned char GLboolean;
typedef signed char GLbyte;
typedef int GLint;
typedef int GLsizei;
typedef unsigned char GLubyte;
typedef unsigned int GLuint;
typedef float GLfloat;
typedef void GLvoid;
/* NOTE: With the OpenGL 1.1 backend "pointer" arguments are actual pointers, */
/* but with VBOs they are just offsets instead */
#ifdef CC_BUILD_GL11
typedef const void* GLpointer;
#else
typedef cc_uintptr GLpointer;
#endif
#define GL_LEQUAL 0x0203
#define GL_GREATER 0x0204
#define GL_DEPTH_BUFFER_BIT 0x00000100
#define GL_COLOR_BUFFER_BIT 0x00004000
#define GL_LINES 0x0001
#define GL_TRIANGLES 0x0004
#define GL_QUADS 0x0007
#define GL_BLEND 0x0BE2
#define GL_SRC_ALPHA 0x0302
#define GL_ONE_MINUS_SRC_ALPHA 0x0303
#define GL_UNSIGNED_BYTE 0x1401
#define GL_UNSIGNED_SHORT 0x1403
#define GL_UNSIGNED_INT 0x1405
#define GL_FLOAT 0x1406
#define GL_RGBA 0x1908
#define GL_FOG 0x0B60
#define GL_FOG_DENSITY 0x0B62
#define GL_FOG_END 0x0B64
#define GL_FOG_MODE 0x0B65
#define GL_FOG_COLOR 0x0B66
#define GL_LINEAR 0x2601
#define GL_EXP 0x0800
#define GL_EXP2 0x0801
#define GL_CULL_FACE 0x0B44
#define GL_DEPTH_TEST 0x0B71
#define GL_MATRIX_MODE 0x0BA0
#define GL_VIEWPORT 0x0BA2
#define GL_ALPHA_TEST 0x0BC0
#define GL_SCISSOR_TEST 0x0C11
#define GL_MAX_TEXTURE_SIZE 0x0D33
#define GL_DEPTH_BITS 0x0D56
#define GL_PERSPECTIVE_CORRECTION_HINT 0x0C50
#define GL_FOG_HINT 0x0C54
#define GL_NICEST 0x1102
#define GL_COMPILE 0x1300
#define GL_MODELVIEW 0x1700
#define GL_PROJECTION 0x1701
#define GL_TEXTURE 0x1702
#define GL_VENDOR 0x1F00
#define GL_RENDERER 0x1F01
#define GL_VERSION 0x1F02
#define GL_EXTENSIONS 0x1F03
#define GL_TEXTURE_2D 0x0DE1
#define GL_NEAREST 0x2600
#define GL_NEAREST_MIPMAP_LINEAR 0x2702
#define GL_TEXTURE_MAG_FILTER 0x2800
#define GL_TEXTURE_MIN_FILTER 0x2801
#define GL_VERTEX_ARRAY 0x8074
#define GL_COLOR_ARRAY 0x8076
#define GL_TEXTURE_COORD_ARRAY 0x8078
/* Not present in gl.h on Windows (only up to OpenGL 1.1) */
#define GL_ARRAY_BUFFER 0x8892
#define GL_ELEMENT_ARRAY_BUFFER 0x8893
#define GL_STATIC_DRAW 0x88E4
#define GL_DYNAMIC_DRAW 0x88E8
#define GL_FRAGMENT_SHADER 0x8B30
#define GL_VERTEX_SHADER 0x8B31
#define GL_COMPILE_STATUS 0x8B81
#define GL_LINK_STATUS 0x8B82
#define GL_INFO_LOG_LENGTH 0x8B84

28
misc/os2/Makefile Normal file
View File

@@ -0,0 +1,28 @@
TARGET := ClassiCube
BUILD_DIR := build/os2
SOURCE_DIR := src
C_SOURCES := $(wildcard $(SOURCE_DIR)/*.c)
C_OBJECTS := $(patsubst $(SOURCE_DIR)/%.c, $(BUILD_DIR)/%.o, $(C_SOURCES))
OBJECTS := $(C_OBJECTS) $(BUILD_DIR)/$(TARGET).res misc/os2/classicube.def
#---------------------------------------------------------------------------------
# options for code generation
#---------------------------------------------------------------------------------
CC := gcc
CFLAGS := -pipe -Wno-attributes -fno-math-errno -O3 -g -mtune=pentium4 -msse2 -march=i686 -idirafter /@unixroot/usr/include/os2tk45 -DOS2
LDFLAGS := -Zhigh-mem -Zomf -Zargs-wild -Zargs-resp -Zlinker DISABLE -Zlinker 1121
LIBS := -lcx -lmmpm2 -lpthread /@unixroot/usr/local/lib/kai.a
$(TARGET).exe: $(BUILD_DIR) $(OBJECTS)
$(CC) $(LDFLAGS) -o $@ $(OBJECTS) $(LIBS)
$(BUILD_DIR):
mkdir -p $(BUILD_DIR)
$(BUILD_DIR)/%.o : $(SOURCE_DIR)/%.c
$(CC) $(CFLAGS) -c $< -o $@
$(BUILD_DIR)/$(TARGET).res: misc/os2/$(TARGET).rc misc/os2/$(TARGET).ico
wrc -r misc/os2/$(TARGET).rc -fo=$@

83
misc/ps1/Makefile Normal file
View File

@@ -0,0 +1,83 @@
ifeq ($(strip $(PSN00BSDK_ROOT)),)
$(warning Please set PSN00BSDK_ROOT path in your environment. For example:)
$(warning export PSN00BSDK_ROOT=/usr/local/lib/psn00bsdk)
$(error Failed to find PSN00BSDK installation path)
endif
#---------------------------------------------------------------------------------
# Configurable options
#---------------------------------------------------------------------------------
# Name of the final output
TARGET := ClassiCube-ps1
# List of directories containing source code
SOURCE_DIRS := src src/ps1
# Directory where object files are placed
BUILD_DIR := build/ps1
#---------------------------------------------------------------------------------
# Code generation
#---------------------------------------------------------------------------------
S_FILES := $(foreach dir,$(SOURCE_DIRS),$(wildcard $(dir)/*.S))
C_FILES := $(foreach dir,$(SOURCE_DIRS),$(wildcard $(dir)/*.c))
OBJS := $(addprefix $(BUILD_DIR)/, $(notdir $(C_FILES:%.c=%.o) $(S_FILES:%.S=%.o)))
CINCLUDES := -I$(PSN00BSDK_ROOT)/include/libpsn00b
CFLAGS := -DPLAT_PS1 -DPSN00BSDK=1 -g -Wa,--strip-local-absolute -ffreestanding -fno-builtin -nostdlib -fdata-sections -ffunction-sections -fsigned-char -fno-strict-overflow -msoft-float -march=r3000 -mtune=r3000 -mabi=32 -mno-mt -mno-llsc -Og -mdivide-breaks -G8 -fno-pic -mno-abicalls -mgpopt -mno-extern-sdata
# Dependency tracking
DEPFLAGS = -MT $@ -MMD -MP -MF $(BUILD_DIR)/$*.d
DEPFILES := $(OBJS:%.o=%.d)
# Additional libraries to link against
# libpsxgpu -> $(PSN00BSDK_ROOT)/lib/libpsn00b/debug/libpsxgpu_exe_gprel.a
PS1LIBS := libpsxgpu libpsxgte libpsxspu libpsxcd libpsxpress libpsxsio libpsxetc libpsxapi libsmd liblzp libc
PS1LIBS := $(addprefix $(PSN00BSDK_ROOT)/lib/libpsn00b/debug/, $(PS1LIBS))
PS1LIBS := $(addsuffix _exe_gprel.a, $(PS1LIBS))
LDFLAGS = -g -T$(PSN00BSDK_ROOT)/lib/libpsn00b/ldscripts/exe.ld -nostdlib -Wl,-gc-sections -G8 -static
LIBS = -lgcc $(PS1LIBS)
#---------------------------------------------------------------------------------
# main targets
#---------------------------------------------------------------------------------
default: $(BUILD_DIR) $(TARGET).bin
clean:
rm $(TARGET).bin $(TARGET).cue $(TARGET).exe $(BUILD_DIR)/$(TARGET).elf $(OBJS)
$(BUILD_DIR):
mkdir -p $(BUILD_DIR)
#---------------------------------------------------------------------------------
# executable generation
#---------------------------------------------------------------------------------
$(BUILD_DIR)/$(TARGET).elf: $(OBJS)
$(PSN00BSDK_ROOT)/bin/mipsel-none-elf-gcc $(LDFLAGS) $^ -o $@ $(LIBS)
$(TARGET).exe: $(BUILD_DIR)/$(TARGET).elf
$(PSN00BSDK_ROOT)/bin/elf2x -q $(BUILD_DIR)/$(TARGET).elf $(TARGET).exe
$(TARGET).bin: $(TARGET).exe
$(PSN00BSDK_ROOT)/bin/mkpsxiso -y -o $(TARGET).bin -c $(TARGET).cue misc/ps1/iso.xml
#---------------------------------------------------------------------------------
# object generation
#---------------------------------------------------------------------------------
$(BUILD_DIR)/%.o: src/%.c
$(PSN00BSDK_ROOT)/bin/mipsel-none-elf-gcc $(CFLAGS) $(CINCLUDES) $(DEPFLAGS) -c $< -o $@
$(BUILD_DIR)/%.o: src/ps1/%.c
$(PSN00BSDK_ROOT)/bin/mipsel-none-elf-gcc $(CFLAGS) $(CINCLUDES) $(DEPFLAGS) -c $< -o $@
#---------------------------------------------------------------------------------
# Dependency tracking
#---------------------------------------------------------------------------------
$(DEPFILES):
include $(wildcard $(DEPFILES))

138
misc/ps1/iso.xml Normal file
View File

@@ -0,0 +1,138 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
This file is used by mkpsxiso to build the CD image.
NOTE: all paths are relative to the misc/ps1 directory.
-->
<iso_project>
<track type="data">
<!--
The "volume", "volume_set", "publisher", "data_preparer" and
"copyright" strings below can be freely modified. The ISO9660
specification, however, imposes the following limitations:
- "volume" and "volume_set" must be 32 characters or less, and can
only contain uppercase letters, digits and underscores.
- "publisher" and "data_preparer" can be up to 128 characters long
and can additionally contain spaces and some special characters.
- "copyright" should be a path to a file on the disc, even one that
does not exist (but in practice it can be set to anything).
"system" and "application" must always be set to "PLAYSTATION" in
order for the disc to be recognized as valid.
-->
<identifiers
system ="PLAYSTATION"
volume ="CLASSICUBE_PS1"
volume_set ="CLASSICUBE_PS1"
publisher ="CLASSICUBE"
data_preparer ="PSN00BSDK"
application ="PLAYSTATION"
copyright ="README.TXT;1"
/>
<!--
You may optionally include a license file using the <license> tag.
Some consoles, particularly Japanese or PAL models with a modchip,
require the disc to contain valid license data and will refuse to
boot if it is missing. License files are usually not required on
US consoles or when booting via softmods or cheat cartridges.
License files are region-specific and are not distributed with
PSn00bSDK for obvious reasons, but can be dumped from an official
game using dumpsxiso or extracted from the Sony SDK.
-->
<!--<license file="${PROJECT_SOURCE_DIR}/license.dat" />-->
<!--
Files and directories can be added to the disc by placing <file>
and <dir> tags below. All file names are case-insensitive and must
be in 8.3 format, i.e. no more than 8 characters for the name and 3
for the optional extension. Directories cannot have extensions.
A boot configuration file (SYSTEM.CNF) or executable (PSX.EXE) must
be present in the root directory. Due to BIOS limitations the root
directory cannot hold more than 30 files or directories, and the
entire disc must contain 45 directories or less. Subdirectories can
contain any number of files.
-->
<directory_tree>
<file name="SYSTEM.CNF" type="data" source="system.cnf" />
<file name="CCUBEPS1.EXE" type="data" source="../../ClassiCube-ps1.exe" />
<dir name="audio">
<file name="DCLOTH1.SND" type="data" source="sounds/dig_cloth1.snd" />
<file name="DCLOTH2.SND" type="data" source="sounds/dig_cloth2.snd" />
<file name="DCLOTH3.SND" type="data" source="sounds/dig_cloth3.snd" />
<file name="DCLOTH4.SND" type="data" source="sounds/dig_cloth4.snd" />
<file name="DGLASS1.SND" type="data" source="sounds/dig_glass1.snd" />
<file name="DGLASS2.SND" type="data" source="sounds/dig_glass2.snd" />
<file name="DGLASS3.SND" type="data" source="sounds/dig_glass3.snd" />
<file name="DGRASS1.SND" type="data" source="sounds/dig_grass1.snd" />
<file name="DGRASS2.SND" type="data" source="sounds/dig_grass2.snd" />
<file name="DGRASS3.SND" type="data" source="sounds/dig_grass3.snd" />
<file name="DGRASS4.SND" type="data" source="sounds/dig_grass4.snd" />
<file name="DGRAVEL1.SND" type="data" source="sounds/dig_gravel1.snd" />
<file name="DGRAVEL2.SND" type="data" source="sounds/dig_gravel2.snd" />
<file name="DGRAVEL3.SND" type="data" source="sounds/dig_gravel3.snd" />
<file name="DGRAVEL4.SND" type="data" source="sounds/dig_gravel4.snd" />
<file name="DSAND1.SND" type="data" source="sounds/dig_sand1.snd" />
<file name="DSAND2.SND" type="data" source="sounds/dig_sand2.snd" />
<file name="DSAND3.SND" type="data" source="sounds/dig_sand3.snd" />
<file name="DSAND4.SND" type="data" source="sounds/dig_sand4.snd" />
<file name="DSNOW1.SND" type="data" source="sounds/dig_snow1.snd" />
<file name="DSNOW2.SND" type="data" source="sounds/dig_snow2.snd" />
<file name="DSNOW3.SND" type="data" source="sounds/dig_snow3.snd" />
<file name="DSNOW4.SND" type="data" source="sounds/dig_snow4.snd" />
<file name="DSTONE1.SND" type="data" source="sounds/dig_stone1.snd" />
<file name="DSTONE2.SND" type="data" source="sounds/dig_stone2.snd" />
<file name="DSTONE3.SND" type="data" source="sounds/dig_stone3.snd" />
<file name="DSTONE4.SND" type="data" source="sounds/dig_stone4.snd" />
<file name="DWOOD1.SND" type="data" source="sounds/dig_wood1.snd" />
<file name="DWOOD2.SND" type="data" source="sounds/dig_wood2.snd" />
<file name="DWOOD3.SND" type="data" source="sounds/dig_wood3.snd" />
<file name="DWOOD4.SND" type="data" source="sounds/dig_wood4.snd" />
<file name="SCLOTH1.SND" type="data" source="sounds/step_cloth1.snd" />
<file name="SCLOTH2.SND" type="data" source="sounds/step_cloth2.snd" />
<file name="SCLOTH3.SND" type="data" source="sounds/step_cloth3.snd" />
<file name="SCLOTH4.SND" type="data" source="sounds/step_cloth4.snd" />
<file name="SGRASS1.SND" type="data" source="sounds/step_grass1.snd" />
<file name="SGRASS2.SND" type="data" source="sounds/step_grass2.snd" />
<file name="SGRASS3.SND" type="data" source="sounds/step_grass3.snd" />
<file name="SGRASS4.SND" type="data" source="sounds/step_grass4.snd" />
<file name="SGRAVEL1.SND" type="data" source="sounds/step_gravel1.snd" />
<file name="SGRAVEL2.SND" type="data" source="sounds/step_gravel2.snd" />
<file name="SGRAVEL3.SND" type="data" source="sounds/step_gravel3.snd" />
<file name="SGRAVEL4.SND" type="data" source="sounds/step_gravel4.snd" />
<file name="SSAND1.SND" type="data" source="sounds/step_sand1.snd" />
<file name="SSAND2.SND" type="data" source="sounds/step_sand2.snd" />
<file name="SSAND3.SND" type="data" source="sounds/step_sand3.snd" />
<file name="SSAND4.SND" type="data" source="sounds/step_sand4.snd" />
<file name="SSNOW1.SND" type="data" source="sounds/step_snow1.snd" />
<file name="SSNOW2.SND" type="data" source="sounds/step_snow2.snd" />
<file name="SSNOW3.SND" type="data" source="sounds/step_snow3.snd" />
<file name="SSNOW4.SND" type="data" source="sounds/step_snow4.snd" />
<file name="SSTONE1.SND" type="data" source="sounds/step_stone1.snd" />
<file name="SSTONE2.SND" type="data" source="sounds/step_stone2.snd" />
<file name="SSTONE3.SND" type="data" source="sounds/step_stone3.snd" />
<file name="SSTONE4.SND" type="data" source="sounds/step_stone4.snd" />
<file name="SWOOD1.SND" type="data" source="sounds/step_wood1.snd" />
<file name="SWOOD2.SND" type="data" source="sounds/step_wood2.snd" />
<file name="SWOOD3.SND" type="data" source="sounds/step_wood3.snd" />
<file name="SWOOD4.SND" type="data" source="sounds/step_wood4.snd" />
</dir>
<dir name="texpacks">
<file name="default.zip" type="data" source="classicube.zip" />
</dir>
<dummy sectors="1024"/>
</directory_tree>
</track>
<!--
CD-DA tracks can be added to the CD image by using one or more <track>
tags. The source attribute must be a path to an audio file in WAV, FLAC
or MP3 format (using WAV or FLAC is highly recommended to preserve
audio quality if you have a lossless copy of the source track).
-->
<!--<track type="audio" source="${PROJECT_SOURCE_DIR}/track2.wav" />-->
</iso_project>

BIN
misc/ps1/sounds/audio.zip Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Some files were not shown because too many files have changed in this diff Show More