wip2
This commit is contained in:
parent
02febc7367
commit
850ed93367
|
@ -1,4 +1,5 @@
|
|||
build/
|
||||
build-*/
|
||||
build-ps1/
|
||||
build-i386/
|
||||
build-win9x/
|
||||
|
|
|
@ -49,7 +49,7 @@ process:
|
|||
mkdir build
|
||||
cd build
|
||||
cmake ..
|
||||
make -j$(nproc --all)
|
||||
cmake --build . -j$(nproc --all)
|
||||
```
|
||||
|
||||
#### Dependencies
|
||||
|
|
|
@ -6,7 +6,26 @@ add_custom_target(exe ALL elf2exe ${PROJECT_NAME}
|
|||
DEPENDS ${PROJECT_NAME})
|
||||
add_custom_target(iso ALL mkisofs -o ${PROJECT_NAME}.iso -V ${PROJECT_NAME}
|
||||
-sysid PLAYSTATION ${cdroot} DEPENDS exe)
|
||||
set(license $ENV{PSXSDK_PATH}/share/licenses/infoeur.dat)
|
||||
|
||||
set(license_prefix $ENV{PSXSDK_PATH}/share/licenses)
|
||||
|
||||
if(VIDEO_MODE STREQUAL "VMODE_PAL")
|
||||
set(region eur)
|
||||
elseif(VIDEO_MODE STREQUAL "VMODE_NTSC")
|
||||
set(ntsc_regions usa jap)
|
||||
|
||||
if(NOT NTSC_REGION IN_LIST ntsc_regions)
|
||||
message(FATAL_ERROR "Please define valid NTSC_REGION. Available options:\n"
|
||||
"${ntsc_regions}\n"
|
||||
"Run CMake again using one of the available options above e.g.:\n"
|
||||
"cmake .. [options] -DNTSC_REGION=US")
|
||||
endif()
|
||||
|
||||
set(region ${NTSC_REGION})
|
||||
endif()
|
||||
|
||||
set(license $ENV{PSXSDK_PATH}/share/licenses/info${region}.dat)
|
||||
|
||||
add_custom_target(bin_cue ALL mkpsxiso ${PROJECT_NAME}.iso ${PROJECT_NAME}.bin
|
||||
${license} -s DEPENDS iso)
|
||||
|
||||
|
|
|
@ -16,9 +16,8 @@ Since it is desirable to avoid messing with system-level libraries,
|
|||
when building for Win9x, `rts` will look for dependencies by inspecting
|
||||
the following environment variables:
|
||||
|
||||
- `SDL_PATH`
|
||||
- `SDLDIR`
|
||||
- `SDL_TTF_PATH`
|
||||
- `FREETYPE_PATH`
|
||||
- `SDL_MIXER_PATH`
|
||||
|
||||
Also, the directory containing the GNU toolchain binaries (which
|
||||
|
@ -73,17 +72,6 @@ cd mingwrt-3.15.2-mingw32/ && cp -r include/* ~/i386-mingw32/include/
|
|||
|
||||
[mingw-w32api-3.13](https://sourceforge.net/projects/mingw/files/OldFiles/w32api-3.13/w32api-3.13-mingw32-src.tar.gz)
|
||||
|
||||
## freetype (not required)
|
||||
Only `freetype-2.4.8` is known to work so far.
|
||||
|
||||
### Known issues
|
||||
- Apparently, out of source builds are not possible.
|
||||
|
||||
```sh
|
||||
cd freetype-2.4.8-src/ && ./configure --prefix=$HOME/freetype-2.4.8 \
|
||||
--host=i386-mingw32 --enable-shared=no CC=i386-mingw32-gcc
|
||||
```
|
||||
|
||||
## SDL
|
||||
`sdl-1.2.15` is the latest version supported version for the Win9x family
|
||||
of operating systems. In order to keep things easy, the script below
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
# Avoid C11 since it is not supported by the i386-mingw32 toolchain.
|
||||
set(cflags ${cflags} -Wall -g3 -ffunction-sections -fdata-sections -pedantic -std=c99)
|
||||
set(cflags ${cflags} -Wall -g3 -ffunction-sections -fdata-sections -pedantic)
|
||||
|
||||
set(components
|
||||
building
|
||||
|
@ -41,6 +41,8 @@ target_link_libraries(${PROJECT_NAME} PRIVATE system menu)
|
|||
foreach(c ${components})
|
||||
add_subdirectory("${c}")
|
||||
target_compile_options(${c} PUBLIC ${cflags})
|
||||
target_compile_features(${c} PUBLIC c_std_99)
|
||||
set_target_properties(${c} PROPERTIES C_STANDARD 99 C_EXTENSIONS OFF)
|
||||
endforeach()
|
||||
|
||||
foreach(i ${interfaces})
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
add_library(gui
|
||||
"src/bar.c"
|
||||
"src/button.c"
|
||||
"src/button_sprite.c"
|
||||
"src/button_type1.c"
|
||||
"src/checkbox.c"
|
||||
"src/container.c"
|
||||
|
|
|
@ -0,0 +1,29 @@
|
|||
#ifndef GUI_COMBO_BOX_H
|
||||
#define GUI_COMBO_BOX_H
|
||||
|
||||
#include <gui.h>
|
||||
#include <gui/button.h>
|
||||
#include <util.h>
|
||||
#include <stddef.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
|
||||
struct gui_combo_box
|
||||
{
|
||||
struct gui_common common;
|
||||
struct gui_button b;
|
||||
};
|
||||
|
||||
UTIL_STATIC_ASSERT(!offsetof(struct gui_combo_box, common),
|
||||
"unexpected offset for struct gui_combo_box");
|
||||
|
||||
void gui_combo_box_init(struct gui_combo_box *c, enum gui_button_type t);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* GUI_COMBO_BOX_H */
|
|
@ -14,7 +14,7 @@ static int render(const struct gui_common *const g)
|
|||
static int (*const f[])(const struct gui_button *) =
|
||||
{
|
||||
[GUI_BUTTON_TYPE_1] = gui_button_render_type1,
|
||||
/* [GUI_BUTTON_TYPE_SPRITE] = gui_button_render_sprite */
|
||||
[GUI_BUTTON_TYPE_SPRITE] = gui_button_render_sprite
|
||||
};
|
||||
|
||||
const struct gui_button *const b = (const struct gui_button *)g;
|
||||
|
@ -28,7 +28,7 @@ static void get_dim(const struct gui_common *const g,
|
|||
static void (*const f[])(const struct gui_button *, short *, short *) =
|
||||
{
|
||||
[GUI_BUTTON_TYPE_1] = gui_button_get_dim_type1,
|
||||
/* [GUI_BUTTON_TYPE_SPRITE] = gui_button_get_dim_sprite */
|
||||
[GUI_BUTTON_TYPE_SPRITE] = gui_button_get_dim_sprite
|
||||
};
|
||||
|
||||
const struct gui_button *const b = (const struct gui_button *)g;
|
||||
|
@ -81,7 +81,7 @@ void gui_button_init(struct gui_button *const b, const enum gui_button_type t)
|
|||
static void (*const f[])(struct gui_button *) =
|
||||
{
|
||||
[GUI_BUTTON_TYPE_1] = gui_button_init_type1,
|
||||
/* [GUI_BUTTON_TYPE_SPRITE] = gui_button_get_dim_sprite */
|
||||
[GUI_BUTTON_TYPE_SPRITE] = gui_button_get_dim_sprite
|
||||
};
|
||||
|
||||
f[b->type](b);
|
||||
|
|
|
@ -0,0 +1,31 @@
|
|||
#include <gui.h>
|
||||
#include <gui/button.h>
|
||||
#include <gui_private.h>
|
||||
#include <gui_button_private.h>
|
||||
#include <gfx.h>
|
||||
#include <stdio.h>
|
||||
|
||||
int gui_button_render_sprite(const struct gui_button *const b)
|
||||
{
|
||||
sprite_get_or_ret(s, -1);
|
||||
|
||||
if (sprite_clone(b->u.sprite.s, s))
|
||||
return -1;
|
||||
|
||||
gui_coords(&b->common, &s->x, &s->y);
|
||||
sprite_sort(s);
|
||||
return 0;
|
||||
}
|
||||
|
||||
void gui_button_get_dim_sprite(const struct gui_button *const b,
|
||||
short *const w, short *const h)
|
||||
{
|
||||
const struct sprite *const s = b->u.sprite.s;
|
||||
|
||||
*w = s->w;
|
||||
*h = s->h;
|
||||
}
|
||||
|
||||
void gui_button_init_sprite(struct gui_button *const b)
|
||||
{
|
||||
}
|
|
@ -0,0 +1,43 @@
|
|||
#include <gui/combo_box.h>
|
||||
#include <gui.h>
|
||||
#include <input.h>
|
||||
#include <peripheral.h>
|
||||
#include <camera.h>
|
||||
|
||||
static int update(struct gui_common *const g,
|
||||
const union peripheral *const p, const struct camera *const cam,
|
||||
struct input *const in)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
static int render(const struct gui_common *const g)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
static void on_pressed(void *const arg)
|
||||
{
|
||||
}
|
||||
|
||||
void gui_combo_box_init(struct gui_combo_box *const c,
|
||||
const enum gui_button_type t)
|
||||
{
|
||||
static const struct gui_common_cb cb =
|
||||
{
|
||||
.update = update,
|
||||
.render = render
|
||||
};
|
||||
|
||||
*c = (const struct gui_combo_box)
|
||||
{
|
||||
.common =
|
||||
{
|
||||
.cb = &cb
|
||||
}
|
||||
};
|
||||
|
||||
gui_button_init(&c->b, t);
|
||||
c->b.on_pressed = on_pressed;
|
||||
gui_add_child(&c->common, &c->b.common);
|
||||
}
|
|
@ -0,0 +1,19 @@
|
|||
#ifndef INPUT_PRIVATE_H
|
||||
#define INPUT_PRIVATE_H
|
||||
|
||||
#include <input.h>
|
||||
#include <stdbool.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
|
||||
bool input_vkeyboard_available(void);
|
||||
int input_vkeyboard_show(void);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* INPUT_PRIVATE_H */
|
|
@ -0,0 +1,13 @@
|
|||
#include <input.h>
|
||||
#include <input_private.h>
|
||||
#include <stdbool.h>
|
||||
|
||||
bool input_vkeyboard_available(void)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
int input_vkeyboard_show(void)
|
||||
{
|
||||
return -1;
|
||||
}
|
|
@ -7,6 +7,7 @@
|
|||
#include <stdbool.h>
|
||||
#include <stddef.h>
|
||||
#include <stdio.h>
|
||||
#include <stdint.h>
|
||||
|
||||
static struct net_host
|
||||
{
|
||||
|
@ -82,7 +83,7 @@ static int on_write(const void *const buf, size_t n, void *const arg)
|
|||
|
||||
EnterCriticalSection();
|
||||
|
||||
for (const char *b = buf; n; n--, b++)
|
||||
for (const uint8_t *b = buf; n; n--, b++)
|
||||
{
|
||||
struct net_host_fifo *const f = &h->out;
|
||||
size_t new = f->pending + 1;
|
||||
|
@ -115,7 +116,7 @@ static int on_read(void *const buf, const size_t n, void *const arg)
|
|||
|
||||
EnterCriticalSection();
|
||||
|
||||
for (char *b = buf; rem; rem--, b++)
|
||||
for (uint8_t *b = buf; rem; rem--, b++)
|
||||
{
|
||||
if (f->read == f->pending)
|
||||
goto end;
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
#include <net.h>
|
||||
#include <net_private.h>
|
||||
#include <windows.h>
|
||||
#include <ctype.h>
|
||||
#include <errno.h>
|
||||
#include <stddef.h>
|
||||
#include <stdio.h>
|
||||
|
@ -244,6 +245,22 @@ static int on_write(const void *const buf, const size_t n, void *const arg)
|
|||
__func__, GetLastError());
|
||||
goto failure;
|
||||
}
|
||||
|
||||
printf("%s: outgoing packet, buf: %p, n: %u: [", __func__, buf, (unsigned)n);
|
||||
|
||||
for (size_t i = 0; i < n; i++)
|
||||
{
|
||||
const char b = ((const char *)buf)[i];
|
||||
printf("%02hhx", b);
|
||||
|
||||
if (isprint((unsigned char)b))
|
||||
printf(" (%c)", b);
|
||||
|
||||
if (i + 1 < n)
|
||||
printf(", ");
|
||||
}
|
||||
|
||||
printf("]\n");
|
||||
}
|
||||
|
||||
return get_result(h, r);
|
||||
|
|
|
@ -79,7 +79,7 @@ static int read_header(struct packet_input *const in,
|
|||
|
||||
if (header >= MAX_PACKET_TYPES)
|
||||
{
|
||||
fprintf(stderr, "%s: invalid packet type %" PRIu8 "\n",
|
||||
fprintf(stderr, "%s: invalid packet type %#" PRIx8 "\n",
|
||||
__func__, header);
|
||||
return -1;
|
||||
}
|
||||
|
|
|
@ -17,21 +17,3 @@ add_library(sfx ${src})
|
|||
target_include_directories(sfx PUBLIC ${inc})
|
||||
target_include_directories(sfx PRIVATE ${privinc})
|
||||
target_link_libraries(sfx PUBLIC ${deps} PRIVATE ${privdeps})
|
||||
|
||||
if(PS1_BUILD)
|
||||
set(modes VMODE_PAL VMODE_NTSC)
|
||||
|
||||
if(VIDEO_MODE)
|
||||
if(NOT "${VIDEO_MODE}" IN_LIST modes)
|
||||
message(FATAL_ERROR "Invalid video mode ${VIDEO_MODE}. Available options:\n"
|
||||
"${modes}\n"
|
||||
"Run CMake again using one of the available video modes e.g.: cmake .. -DVIDEO_MODE=VMODE_PAL")
|
||||
endif()
|
||||
|
||||
target_compile_definitions(sfx PRIVATE VIDEO_MODE=${VIDEO_MODE})
|
||||
else()
|
||||
message(FATAL_ERROR "Please define video mode. Available options:\n"
|
||||
"${modes}\n"
|
||||
"Run CMake again using one of the available video modes e.g.: cmake .. -DVIDEO_MODE=VMODE_PAL")
|
||||
endif()
|
||||
endif()
|
||||
|
|
|
@ -74,12 +74,12 @@ int transport_pop(struct transport_handle *const h)
|
|||
if (!h->n_packets)
|
||||
return -1;
|
||||
|
||||
union transport_packet *const p = h->packets[h->n_packets - 1];
|
||||
union transport_packet *const p = h->packets[--h->n_packets];
|
||||
|
||||
if (--h->n_packets)
|
||||
if (h->n_packets)
|
||||
{
|
||||
if (!(h->packets = realloc(h->packets,
|
||||
(h->n_packets - 1) * sizeof *h->packets)))
|
||||
h->n_packets * sizeof *h->packets)))
|
||||
return -1;
|
||||
}
|
||||
else
|
||||
|
|
|
@ -34,7 +34,7 @@ int transport_disconnect(struct transport_handle *const h)
|
|||
int transport_send(struct transport_handle *const h,
|
||||
const void *const buf, size_t n)
|
||||
{
|
||||
const char *b = buf;
|
||||
const uint8_t *b = buf;
|
||||
|
||||
while (n)
|
||||
{
|
||||
|
@ -98,7 +98,7 @@ static int read_header(const struct transport_cfg *const cfg,
|
|||
|
||||
if (header >= MAX_TRANSPORT_PACKET_TYPES)
|
||||
{
|
||||
fprintf(stderr, "%s: invalid header %" PRIu8 "\n",
|
||||
fprintf(stderr, "%s: invalid header %#" PRIx8 "\n",
|
||||
__func__, header);
|
||||
return -1;
|
||||
}
|
||||
|
@ -239,7 +239,8 @@ static int read_checksum(const struct transport_cfg *const cfg,
|
|||
|
||||
if (checksum != expected)
|
||||
{
|
||||
fprintf(stderr, "%s: invalid checksum %#" PRIx8 ", expected %#" PRIx8,
|
||||
fprintf(stderr, "%s: invalid checksum %#" PRIx8
|
||||
", expected %#" PRIx8 "\n",
|
||||
__func__, checksum, expected);
|
||||
return -1;
|
||||
}
|
||||
|
@ -319,25 +320,15 @@ static void send_event(const struct transport_cfg *const cfg,
|
|||
}
|
||||
|
||||
static int remove_packet(struct transport_handle *const h,
|
||||
union transport_packet *const p)
|
||||
union transport_packet **const pp)
|
||||
{
|
||||
for (size_t i = 0; i < h->n_packets; i++)
|
||||
{
|
||||
union transport_packet **pp = &h->packets[i];
|
||||
size_t i = pp - h->packets;
|
||||
const size_t n = i + 1;
|
||||
|
||||
if (*pp == p)
|
||||
{
|
||||
if (i + 1 < h->n_packets)
|
||||
for (union transport_packet **pr = &h->packets[i + 1];
|
||||
pr - h->packets < h->n_packets;
|
||||
pp++, pr++)
|
||||
*pp = *pr;
|
||||
if (n < h->n_packets)
|
||||
memmove(pp, pp + 1, h->n_packets - n);
|
||||
|
||||
return transport_pop(h);
|
||||
}
|
||||
}
|
||||
|
||||
return -1;
|
||||
return transport_pop(h);
|
||||
}
|
||||
|
||||
static void get_event(const struct transport_cfg *const cfg,
|
||||
|
@ -367,13 +358,14 @@ static int process_ack(struct transport_handle *const h,
|
|||
{
|
||||
for (size_t i = 0; i < h->n_packets; i++)
|
||||
{
|
||||
union transport_packet *const p = h->packets[i];
|
||||
union transport_packet **const pp = &h->packets[i];
|
||||
const union transport_packet *const p = *pp;
|
||||
|
||||
if (p->common.ttl && a->checksum == calc_checksum(p))
|
||||
{
|
||||
get_event(&h->cfg, p, &h->input.ev);
|
||||
|
||||
if (remove_packet(h, p))
|
||||
if (remove_packet(h, pp))
|
||||
return -1;
|
||||
|
||||
break;
|
||||
|
|
|
@ -103,29 +103,25 @@ static void server_received(const struct transport_event *const ev,
|
|||
|
||||
static int loop(struct server *const s, struct client *const c)
|
||||
{
|
||||
if (transport_update(&s->h))
|
||||
return -1;
|
||||
|
||||
if (!freopen("client", "w+b", s->io.in))
|
||||
if (transport_update(&s->h)
|
||||
|| !freopen("client", "w+b", s->io.in))
|
||||
return -1;
|
||||
|
||||
rewind(s->io.out);
|
||||
|
||||
if (transport_update(&c->h))
|
||||
return -1;
|
||||
|
||||
if (!freopen("server", "w+b", c->io.in))
|
||||
if (transport_update(&c->h)
|
||||
|| !freopen("server", "w+b", c->io.in))
|
||||
return -1;
|
||||
|
||||
rewind(c->io.out);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int main(void)
|
||||
{
|
||||
int ret = EXIT_FAILURE;
|
||||
FILE *const cf = fopen("client", "w+b"), *sf = fopen("server", "w+b");
|
||||
FILE *const cf = fopen("client", "w+b"),
|
||||
*const sf = fopen("server", "w+b");
|
||||
|
||||
if (!cf)
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue