Skip to content

Commit

Permalink
Update draft PR with latest changes
Browse files Browse the repository at this point in the history
  • Loading branch information
bryce-carson committed Oct 1, 2024
1 parent 9d6e3a4 commit 8b97c7c
Show file tree
Hide file tree
Showing 6 changed files with 596 additions and 271 deletions.
94 changes: 55 additions & 39 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ include(cmake/version.cmake)
project(TIC-80 VERSION ${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_REVISION} LANGUAGES C CXX)

if(APPLE)
set(CMAKE_OSX_DEPLOYMENT_TARGET "10.15" CACHE STRING "Minimum OS X deployment version")
set(CMAKE_OSX_DEPLOYMENT_TARGET "10.15" CACHE STRING "Minimum OS X deployment version")
endif()

message("Building for target: ${CMAKE_SYSTEM_NAME}")
Expand All @@ -15,9 +15,9 @@ message("VERSION_HASH: ${VERSION_HASH}")
configure_file("${PROJECT_SOURCE_DIR}/version.h.in" "${CMAKE_CURRENT_BINARY_DIR}/version.h")

if(ANDROID OR EMSCRIPTEN OR N3DS OR BAREMETALPI)
set(BUILD_STATIC_DEFAULT ON)
set(BUILD_STATIC_DEFAULT ON)
else()
set(BUILD_STATIC_DEFAULT OFF)
set(BUILD_STATIC_DEFAULT OFF)
endif()

set(BUILD_PLAYER_DEFAULT OFF)
Expand All @@ -38,23 +38,30 @@ option(BUILD_TOUCH_INPUT "Build with touch input support" ${BUILD_TOUCH_INPUT_DE
option(BUILD_NO_OPTIMIZATION "Build without optimizations for debugging" OFF)
option(BUILD_ASAN_DEBUG "Build with AddressSanitizer" OFF)
option(BUILD_WITH_ZLIB "Build with zlib linked" ON)
option(EBUG "Debug" OFF)
option(TIC80_TARGET "Target binary suffix")

if(EBUG)
set(CMAKE_BUILD_TYPE Debug)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g -ggdb -O0")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -ggdb -O0")
endif()

if(NOT TIC80_TARGET)
set(TIC80_TARGET tic80)
set(TIC80_TARGET tic80)
endif()

if(NOT BUILD_SDL)
set(BUILD_SDLGPU OFF)
set(BUILD_SDLGPU OFF)
endif()

add_library(runtime INTERFACE)

if(BUILD_STATIC)
set(TIC_RUNTIME STATIC)
target_compile_definitions(runtime INTERFACE TIC_RUNTIME_STATIC)
set(TIC_RUNTIME STATIC)
target_compile_definitions(runtime INTERFACE TIC_RUNTIME_STATIC)
else()
set(TIC_RUNTIME SHARED)
set(TIC_RUNTIME SHARED)
endif()

target_compile_definitions(runtime INTERFACE BUILD_DEPRECATED)
Expand All @@ -65,33 +72,33 @@ message("BUILD_TOUCH_INPUT: ${BUILD_TOUCH_INPUT}")
message("BUILD_WITH_ALL: ${BUILD_WITH_ALL}")

if (N3DS)
set(BUILD_SDL OFF)
set(BUILD_SDL OFF)
endif()

if (BAREMETALPI)
set(BUILD_SDL OFF)
set(BUILD_SDL OFF)
endif()

if(UNIX AND NOT APPLE AND NOT EMSCRIPTEN AND NOT ANDROID AND NOT N3DS)
set(LINUX TRUE)
set(LINUX TRUE)

if(CMAKE_HOST_SYSTEM_NAME STREQUAL "FreeBSD")
set(FREEBSD TRUE)
endif()
if(CMAKE_HOST_SYSTEM_NAME STREQUAL "FreeBSD")
set(FREEBSD TRUE)
endif()
endif()

if (BUILD_NO_OPTIMIZATION)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g -O0")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -O0")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g -O0")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -O0")
endif()

if (BUILD_ASAN_DEBUG)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=address -fno-omit-frame-pointer")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=address -fno-omit-frame-pointer")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=address -fno-omit-frame-pointer")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=address -fno-omit-frame-pointer")

if (LINUX AND CMAKE_CXX_COMPILER_ID MATCHES "Clang")
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -shared-libasan")
endif()
if (LINUX AND CMAKE_CXX_COMPILER_ID MATCHES "Clang")
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -shared-libasan")
endif()
endif()

set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
Expand All @@ -103,44 +110,50 @@ endif()

if(MSVC)

add_definitions("/D\"_CRT_SECURE_NO_WARNINGS\"")
add_definitions("/D\"_CRT_NONSTDC_NO_DEPRECATE\"")
add_definitions("/D\"_CRT_SECURE_NO_WARNINGS\"")
add_definitions("/D\"_CRT_NONSTDC_NO_DEPRECATE\"")

foreach( OUTPUTCONFIG ${CMAKE_CONFIGURATION_TYPES} )
string( TOUPPER ${OUTPUTCONFIG} OUTPUTCONFIG )
set( CMAKE_ARCHIVE_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${CMAKE_BINARY_DIR}/lib )
set( CMAKE_LIBRARY_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${CMAKE_BINARY_DIR}/lib )
set( CMAKE_RUNTIME_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${CMAKE_BINARY_DIR}/bin )
foreach( OUTPUTCONFIG ${CMAKE_CONFIGURATION_TYPES} )
string( TOUPPER ${OUTPUTCONFIG} OUTPUTCONFIG )
set( CMAKE_ARCHIVE_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${CMAKE_BINARY_DIR}/lib )
set( CMAKE_LIBRARY_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${CMAKE_BINARY_DIR}/lib )
set( CMAKE_RUNTIME_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${CMAKE_BINARY_DIR}/bin )

# use static runtime
# !TODO: use set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>") from cmake 3.15 instead
if(CMAKE_C_FLAGS_${OUTPUTCONFIG} MATCHES "/MD")
string(REGEX REPLACE "/MD" "/MT" CMAKE_C_FLAGS_${OUTPUTCONFIG} "${CMAKE_C_FLAGS_${OUTPUTCONFIG}}")
endif()
# use static runtime
# !TODO: use set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>") from cmake 3.15 instead
if(CMAKE_C_FLAGS_${OUTPUTCONFIG} MATCHES "/MD")
string(REGEX REPLACE "/MD" "/MT" CMAKE_C_FLAGS_${OUTPUTCONFIG} "${CMAKE_C_FLAGS_${OUTPUTCONFIG}}")
endif()

if(CMAKE_CXX_FLAGS_${OUTPUTCONFIG} MATCHES "/MD")
string(REGEX REPLACE "/MD" "/MT" CMAKE_CXX_FLAGS_${OUTPUTCONFIG} "${CMAKE_CXX_FLAGS_${OUTPUTCONFIG}}")
endif()
endforeach()
if(CMAKE_CXX_FLAGS_${OUTPUTCONFIG} MATCHES "/MD")
string(REGEX REPLACE "/MD" "/MT" CMAKE_CXX_FLAGS_${OUTPUTCONFIG} "${CMAKE_CXX_FLAGS_${OUTPUTCONFIG}}")
endif()
endforeach()

else()

set(CMAKE_C_STANDARD 11)
set(CMAKE_C_STANDARD 11)
endif()

if(RPI)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=gnu11")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=gnu11")
endif()

set(THIRDPARTY_DIR ${CMAKE_SOURCE_DIR}/vendor)
# TODO: use this variable (containing a path) to get a list of all demos that
# need to be converted using tools. It is simplest to always build the tools and
# rebuild all the demos, then letting CMake itself decide if these are
# up-to-date afterwards.
set(DEMO_CARTS_IN ${CMAKE_SOURCE_DIR}/demos)

# Tools and utilities used in some cases
include(cmake/gif.cmake)
include(cmake/blipbuf.cmake)
include(cmake/zlib.cmake)
include(cmake/zip.cmake)
include(cmake/tools.cmake)

# Languages
include(cmake/lua.cmake)
include(cmake/moon.cmake)
include(cmake/fennel.cmake)
Expand All @@ -154,15 +167,18 @@ include(cmake/quickjs.cmake)
include(cmake/janet.cmake)
include(cmake/r.cmake)

# Core and editors
include(cmake/core.cmake)
include(cmake/wave.cmake)
include(cmake/argparse.cmake)
include(cmake/naett.cmake)
include(cmake/png.cmake)
include(cmake/studio.cmake)

# Graphics libraries
include(cmake/sdl.cmake)
include(cmake/libretro.cmake)
include(cmake/n3ds.cmake)

# Installation, obviously.
include(cmake/install.cmake)
27 changes: 27 additions & 0 deletions cmake/renv.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
if(NOT DEFINED ENV{R_HOME} AND DEFINED PREFIX)
set(R_HOME "${PREFIX}/lib64/R")
endif()

if(NOT DEFINED ENV{LD_LIBRARY_PATH} AND NOT LD_LIBRARY_PATH)
set(LD_LIBRARY_PATH "/usr/include/R:${R_HOME}/lib:${PREFIX}/lib/jvm/jre/lib/server")
else()
# Add these entries to the this *PATH variable
set(LD_LIBRARY_PATH "${LD_LIBRARY_PATH}:${PREFIX}/lib64/R/lib:${PREFIX}/lib/jvm/jre/lib/server")
endif()

if(NOT DEFINED ENV{R_SHARE_DIR} AND DEFINED ENV{PREFIX})
set(R_SHARE_DIR "${PREFIX}/share/R")
else()
set(R_SHARE_DIR ENV{R_SHARE_DIR})
endif()

if(NOT DEFINED ENV{R_DOC_DIR} AND DEFINED ENV{PREFIX})
set(R_DOC_DIR "${PREFIX}/share/doc/R")
else()
set(R_DOC_DIR ENV{R_DOC_DIR})
endif()

if(DEFINED ENV{PREFIX} OR DEFINED PREFIX)
set(R_SRC "${R_HOME}/lib")
list(APPEND R_SRC "${PREFIX}/lib/jvm/jre/lib/server" R_SHARE_DIR R_DOC_DIR)
endif()
91 changes: 91 additions & 0 deletions demos/bunny/rbenchmark.r
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
## title: Bunnymark in Python
## author: Bryce Carson
## desc: Benchmarking tool to see how many bunnies can fly around the screen, using R
## input: gamepad
## script: r
## version: 0.0.1

screenWidth <- 240
screenHeight <- 136
toolbarHeight <- 6
t <- 0

new_bunny <- function() {
velocityRUnif <- \() runif(1, -100.0, 100.0) / 60.0
xV <- velocityRUnif()
yV <- velocityRUnif()

newBunny <-
structure(sqrt(xV^2 + yV^2),
width = 26,
height = 32,
x = sample(0:(screenWidth - width), 1),
y = sample(0:(screenHeight - height), 1),
speed_x = xV,
speed_y = yV,
sprite = 1,
class = "Bunny"
)
newBunny
}

draw_bunny <- function(bunny) {
## stopifnot(is(bunny, "Bunny"))
with(attributes(bunny),
t80.spr(sprite, x, y, 1, 1, 0, 0, 4, 4))
}

update_bunny <- function(bunny) {
## stopifnot(is(bunny, "Bunny"))
attr(bunny, "x") <- attr(bunny, "x") + attr(bunny, "speed_x")
attr(bunny, "y") <- attr(bunny, "y") + attr(bunny, "speed_y")

if (attr(bunny, "x") + attr(bunny, "width") > screenWidth) {
attr(bunny, "x") <- screenWidth - attr(bunny, "width")
attr(bunny, "speed_x") <- attr(bunny, "speed_x") * -1
}

if (attr(bunny, "y") + attr(bunny, "height") > screenHeight) {
attr(bunny, "y") <- screenHeight - attr(bunny, "height")
attr(bunny, "speed_y") <- attr(bunny, "speed_y") * -1
}

if (attr(bunny, "x") < 0) {
attr(bunny, "x") <- 0
attr(bunny, "speed_x") <- attr(bunny, "speed_x") * -1.0
}

if (attr(bunny, "y") < toolbarHeight) {
attr(bunny, "y") <- toolbarHeight
attr(bunny, "speed_y") <- attr(bunny, "speed_y") * -1.0
}
}

## FIXME: this removes the attributes. S3 classes need to define special
## methods and generics to work with various primitive classes and generics
## like list. Consider data.frame, which is a list, but which does not lose
## its attributes when you make a list of data.frames.
bunnies <- list(new_bunny())

## <TILES>
## 001:11111100111110dd111110dc111110dc111110dc111110dc111110dd111110dd
## 002:00011110ddd0110dccd0110dccd0110dccd0110dccd0110dcddd00dddddddddd
## 003:00001111dddd0111cccd0111cccd0111cccd0111cccd0111dcdd0111dddd0111
## 004:1111111111111111111111111111111111111111111111111111111111111111
## 017:111110dd111110dd111110dd111110dd10000ddd1eeeeddd1eeeeedd10000eed
## 018:d0ddddddd0ddddddddddddddddd0000dddddccddddddccdddddddddddddddddd
## 019:0ddd01110ddd0111dddd0111dddd0111ddddd000ddddddddddddddddddddd000
## 020:1111111111111111111111111111111101111111d0111111d011111101111111
## 033:111110ee111110ee111110ee111110ee111110ee111110ee111110ee111110ee
## 034:dddcccccddccccccddccccccddccccccddccccccdddcccccdddddddddddddddd
## 035:dddd0111cddd0111cddd0111cddd0111cddd0111dddd0111dddd0111dddd0111
## 036:1111111111111111111111111111111111111111111111111111111111111111
## 049:111110ee111110ee111110ee111110ee111110ee111110ee111110ee11111100
## 050:dddeeeeeddeeeeeed00000000111111101111111011111110111111111111111
## 051:eddd0111eedd01110eed011110ee011110ee011110ee011110ee011111001111
## 052:1111111111111111111111111111111111111111111111111111111111111111
## </TILES>

## <PALETTE>
## 000:1a1c2c5d275db13e53ef7d57ffcd75a7f07038b76425717929366f3b5dc941a6f673eff7f4f4f494b0c2566c86333c57
## </PALETTE>
25 changes: 17 additions & 8 deletions src/api/r.c
Original file line number Diff line number Diff line change
Expand Up @@ -39,18 +39,22 @@ void evalR(tic_mem *memory, const char *code) {
SEXP result = Rf_eval(Rf_mkString(code), R_GlobalEnv);
}

#define killer \
tic_core *core; \
if ((core = (((tic_core *) tic))->currentVM) != NULL) { \
Rf_endEmbeddedR(0); \
core->currentVM = NULL; \
#define killer \
tic_core *core; \
if ((core = (((tic_core *) tic))->currentVM) != NULL) { \
Rf_endEmbeddedR(0); \
core->currentVM = NULL; \
}

tic_core *getTICCore(tic_mem* tic, const char* code);

static bool initR(tic_mem *tic, const char *code) {
killer;

#define dbgmsg initR##__LINE__
fprintf(stderr, "%s\n", dbgmsg);
#undef dbgmsg

int tries = 1;
core = getTICCore(tic, code);

Expand Down Expand Up @@ -194,15 +198,20 @@ static const u8 MarkRom[] =
#include "../build/assets/rmark.tic.dat"
};

/* DEFAULT visibility*/
/* EXPORT_SCRIPT -> RScriptConfig if static, else ScriptConfig */
TIC_EXPORT const tic_script EXPORT_SCRIPT(R) =
{
/* The first five members of the struct have the sum total following
* size. */
/* sizeof(u8) + 3 * sizeof(char *) */
.id = 42,
/* R's id is determined by counting up from 10, beginning with Lua, all of
the other languages TIC-80 supports. Python was the 10th langauge supported,
with .id 20. */
.id = 21,
.name = "r",
.fileExtension = ".r",
.projectComment = "##",
.projectComment = "#",
{
.init = initR,
.close = closeR,
Expand All @@ -226,7 +235,7 @@ TIC_EXPORT const tic_script EXPORT_SCRIPT(R) =
.blockCommentEnd = NULL,
.blockCommentStart2 = NULL,
.blockCommentEnd2 = NULL,
.singleComment = "##",
.singleComment = "#",
.blockStringStart = "\"",
.blockStringEnd = "\"",
.stdStringStartEnd = "\"",
Expand Down
Loading

0 comments on commit 8b97c7c

Please sign in to comment.