From: quzar <qu...@us...> - 2025-01-29 15:18:25
|
This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "A pseudo Operating System for the Dreamcast.". The branch, master has been updated via 80a54c601e71dfeb44ec764583815ac353580205 (commit) via 924ee07a9b9a4883a86b2b1f9200c0b53768a721 (commit) via 5bcea1f24f90c2de7bd3152aa430ebc538a5ce2e (commit) via 6f43940bc18cf0da2eb8a39d41a7984580cd7ac3 (commit) via 07da40a626c400f23b7b9e96dd52693876827480 (commit) via ec0850fd1e4056954c31a20742b26520db5f7b5c (commit) via fe6463c8c8bb5c5dba0f5c13609881877cb4d1ff (commit) via 1cbb414fb78a0bbee8db333e1fb1afe496d99a01 (commit) via 2277c213500bad618d88a5676289cbaca7c8158f (commit) via b6a39e2005d009f8af9446b5683f02667471dfc9 (commit) via f329407dd8045ae8f7a44c3b85eba0721c9a1199 (commit) via 851cf99ddf406938f227ece95c746422b3da2b53 (commit) via 285beb0c3e43ffebde707577ec73ba8424456209 (commit) via fab82ab2d6ae640df0fa32f322288ba15f3d2c55 (commit) via c753c2ba39b5930cfd80663dc904b9fac5aab82a (commit) via 73d0c44d36863ad991c6a66ab4f6a28bd916548c (commit) via 54cd45891861e2dbd839882749baa1f8d9fc1a73 (commit) via 8c52e0be5a8989fb9045255dd1767b0e7f0f7396 (commit) via cd3fdc18c58576e55582ae7f72327e8412de7de5 (commit) via 1529f3fb66a833098c6f10a669ce1b3c01228785 (commit) via 6505375f04621494fbec1fa2e5db4b685a9802f8 (commit) via dd22cc133cb42d3e6cec8cfa4d6190416c119110 (commit) via 0e03833bbe86e805c27b754aff84e4f5e8fde6c3 (commit) via 8426c784cd9f959d8249c5271590e79588f9a5d9 (commit) via a04a29480bc58ffc5905908e6643b9c540d86b36 (commit) via 727c400883b17634f98c4b42207dc8e7f5ca5def (commit) via 7917b346319aa159b10199f77aa091a37e364e20 (commit) via 9688eeefaf568fd3eb8675086c98ee5a5f3e6d6a (commit) via 65e1c505c19a14800da044bab9d3f8a1be3aafaa (commit) via ee00f1a816c947061b8600249b3f466899c11971 (commit) via 23f1cf94a02d5f2b46d8231d475bbee2f0afd483 (commit) via 5d6c022ee979460bd3377f3dc3f0b707f9f4283f (commit) via fe5e812eb272c5643aae8bacd34a13722b94919b (commit) via e8797cca5979b28acbd8da09ca9d3e5fa51fa99f (commit) via b0690ea9fc7b4f389817f0e2f9300c80768b9792 (commit) via 0ee1ae75d6fe8afac6672a3323d21818f2af1d7d (commit) via f0876d4e99485674d91876beea22712fb67dc1ad (commit) via 5b66194b6f1b2a908686a3228b4b83861b2d7482 (commit) via a2c06d1349210237d0a6ffc0d065c2cfa8cf491a (commit) via c620d7c060ff691073fd8eb124be1ccaea35218d (commit) via 03b51ef77bd15aea74d54a03ab09b8a6e043db79 (commit) via 272f3351e2505e4eabcd1d1185e3bd78a94ece17 (commit) via 1fc850b9a3ee2ca0d10b33eae084dfbd6fd30e89 (commit) via 0df44582196029ae2975fbac29577c6166b0796a (commit) via e76e4ffec53d87c1360f2d89b5ad52b52b9dae63 (commit) via 6f46b379338f915fe71e3e79c55a13dde504fa15 (commit) via 2f90256c39d4c698fe1238775c65a0abb57a008c (commit) via 7c3d087100ba3ea4e34f8bb413ee061c492acf6a (commit) via 8e880352b8e2b1bdfe52504c1f7060a195ecf477 (commit) via 66d96f91a5f254e4407d0dde25256be00ff48da4 (commit) via 4169aa2c7b232fdacaaadb4b085476a57b273b3a (commit) via 67fb082e9f1b27fdb18d3b53a193a5bd91a38b3d (commit) via fc5d711ca3797ea5d8c259fa5136dbe59715ab5e (commit) via d1c9414b50ca7e38639d34e8148c9bd2a04b1e75 (commit) via c639750b0951531b8d338db8b5f1b74d7885e767 (commit) from 06b0843665d5a7afa45bf7d679dccf675ec0e453 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 80a54c601e71dfeb44ec764583815ac353580205 Merge: 924ee07a fe6463c8 Author: Donald Haase <qu...@ya...> Date: Tue Jan 28 22:43:46 2025 -0500 Merge pull request #925 from pcercuei/pvr-dma-next-list pvr: random cleanups and IRQ race fix in dma_next_list() commit 924ee07a9b9a4883a86b2b1f9200c0b53768a721 Merge: 6f43940b 5bcea1f2 Author: Donald Haase <qu...@ya...> Date: Tue Jan 28 22:32:36 2025 -0500 Merge pull request #930 from darcagn/flag_revert Revert PR #887: environ.sh: Disable -fno-builtin, enable -ffast-math commit 5bcea1f24f90c2de7bd3152aa430ebc538a5ce2e Author: darc <da...@pr...> Date: Tue Jan 28 21:26:36 2025 -0600 Revert PR #887: environ.sh: Disable -fno-builtin, enable -ffast-math commit 6f43940bc18cf0da2eb8a39d41a7984580cd7ac3 Merge: 07da40a6 ec0850fd Author: Donald Haase <qu...@ya...> Date: Mon Jan 27 22:47:31 2025 -0500 Merge pull request #927 from KallistiOS/highlander_raytris Remove duplicated copy of the raytris example. commit 07da40a626c400f23b7b9e96dd52693876827480 Merge: f329407d 73d0c44d Author: Donald Haase <qu...@ya...> Date: Mon Jan 27 22:47:15 2025 -0500 Merge pull request #920 from KallistiOS/y1_fix Fix type clash in vmu example. commit ec0850fd1e4056954c31a20742b26520db5f7b5c Author: QuzarDC <qu...@co...> Date: Mon Jan 27 20:42:26 2025 -0500 Remove duplicated copy of the example. commit fe6463c8c8bb5c5dba0f5c13609881877cb4d1ff Author: Paul Cercueil <pa...@cr...> Date: Mon Jan 27 17:22:13 2025 +0100 pvr: Fix pvr_dma_transfer overriding callback data of ongoing transfer The pvr_dma_transfer() would override the callback data, stored in global variables, before even checking that no transfer was ongoing. Address that by moving the place where the variables are set after the DMA available check. And while we're at it, disable interrupts to avoid races between parallel calls of pvr_dma_transfer(). Signed-off-by: Paul Cercueil <pa...@cr...> commit 1cbb414fb78a0bbee8db333e1fb1afe496d99a01 Author: Paul Cercueil <pa...@cr...> Date: Mon Jan 27 16:25:55 2025 +0100 pvr: Fix dma_next_list() racing with itself The very first call to dma_next_list() does not run in an interrupt context, nor does it run with the IRQs disabled. As soon as pvr_dma_load_ta() is called, it is therefore possible to have dma_next_list() re-entered from within the DMA complete interrupt handler. This is fine, as long as we make sure that the function does not do anything after this point that could race with the interrupt handler. One possible race was with the DMA complete interrupt firing before the "pvr_state.lists_dmaed" was updated, in which case the interrupt handler wouldn't get the updated value, or when the interrupt was firing in the middle of updating the "pvr_state.lists_dmaed". Signed-off-by: Paul Cercueil <pa...@cr...> commit 2277c213500bad618d88a5676289cbaca7c8158f Author: Paul Cercueil <pa...@cr...> Date: Mon Jan 27 16:21:59 2025 +0100 pvr: Simplify dma_next_list() Move the initialization of "b" before the loop. Remove commented DBG() macros. Replace the loop break by a "return" since nothing else will be executed after that. This means that the "did" variable can be dropped. Signed-off-by: Paul Cercueil <pa...@cr...> commit b6a39e2005d009f8af9446b5683f02667471dfc9 Author: Paul Cercueil <pa...@cr...> Date: Mon Jan 27 16:14:36 2025 +0100 pvr: Use BIT() macro where it makes sense Use the BIT() macro instead of the expanded version, to make it more obvious that we're manipulating individual bits. Signed-off-by: Paul Cercueil <pa...@cr...> commit f329407dd8045ae8f7a44c3b85eba0721c9a1199 Merge: 851cf99d 6505375f Author: Donald Haase <qu...@ya...> Date: Mon Jan 27 10:10:02 2025 -0500 Merge pull request #918 from KallistiOS/falco/cont_btns_callback_thread_attrib Added thread attribs to cont_btn_callback worker. commit 851cf99ddf406938f227ece95c746422b3da2b53 Merge: 285beb0c dd22cc13 Author: Donald Haase <qu...@ya...> Date: Mon Jan 27 10:09:25 2025 -0500 Merge pull request #916 from KallistiOS/falco/AUTHORS_update_2025 Updated AUTHORS with year 2025 for Falco Girgis. commit 285beb0c3e43ffebde707577ec73ba8424456209 Author: Falco Girgis <gyr...@gm...> Date: Mon Jan 27 09:08:35 2025 -0600 Added support for more queries to sysconf(). (#924) sysconf() is an incredibly useful POSIX utility which gets used by a LOT more software than I think we realize. I just noticed that our upcoming SDL2 port is using it to properly return a bunch of HW queries like available RAM. I did notice, however, that we didn't support querying for cache configuration and a few other things, so I added them. commit fab82ab2d6ae640df0fa32f322288ba15f3d2c55 Author: Falco Girgis <gyr...@gm...> Date: Mon Jan 27 09:07:52 2025 -0600 Added PantherDC to Controller Capability Typelist (#917) So now you can easily query for whether a controller supports all of the inputs supported by the PantherDC controller. commit c753c2ba39b5930cfd80663dc904b9fac5aab82a Author: Cole Hall <col...@gm...> Date: Sun Jan 26 23:03:54 2025 +0000 Add raytris raylib example (#921) * Add raylib Tetris example by Niisoks commit 73d0c44d36863ad991c6a66ab4f6a28bd916548c Author: QuzarDC <qu...@co...> Date: Sun Jan 26 07:36:46 2025 -0500 Fix type clash in vmu example. A strange side-effect from #870 . Now math.h is being included via kos.h which caused the static y1 in vmu.c to clash with the defined `double y1(double)` function from math.h. Corrected this by both restricting the headers being included and renaming the variable. Not quite sure how this doesn't cause problems elsewhere... commit 54cd45891861e2dbd839882749baa1f8d9fc1a73 Merge: cd3fdc18 8c52e0be Author: Donald Haase <qu...@ya...> Date: Sun Jan 26 06:49:41 2025 -0500 Merge pull request #905 from pcercuei/dmac-doc doc: CHANGELOG: Add entry about DMAC API commit 8c52e0be5a8989fb9045255dd1767b0e7f0f7396 Merge: c620d7c0 cd3fdc18 Author: Donald Haase <qu...@ya...> Date: Sun Jan 26 06:48:40 2025 -0500 Merge branch 'master' into dmac-doc commit cd3fdc18c58576e55582ae7f72327e8412de7de5 Merge: 0e03833b 1529f3fb Author: Donald Haase <qu...@ya...> Date: Sat Jan 25 22:41:31 2025 -0500 Merge pull request #919 from darcagn/alignas_fix Revert alignas change in irq.h to fix toolchain building commit 1529f3fb66a833098c6f10a669ce1b3c01228785 Author: darc <da...@pr...> Date: Sat Jan 25 21:22:20 2025 -0600 Revert alignas change to fix toolchain commit 6505375f04621494fbec1fa2e5db4b685a9802f8 Author: Falco Girgis <gyr...@gm...> Date: Sat Jan 25 18:52:56 2025 -0600 Added thread attribs to cont_btn_callback worker. 1) When using the cont_btn_callback() mechanism, a new thread is created, which is left unnamed. This looks kind of janky and confusing when seen in the thread listing when dumping thread info or after an exception. - Added a default label to the worker thread to identify it 2) By far, the most commonly implemented callback with this mechanism tends to be some absolutely trivial logic like a simple call to exit(0). Because of this, games which are low on RAM are typically paying an exuberantly high amount of memory overhead just to call one function with a default stack size of 32KB for the worker. - Added a default stack size of 8KB, which can be overridden at compile-time, consistently with how other default thread sizes can be overwritten. commit dd22cc133cb42d3e6cec8cfa4d6190416c119110 Author: Falco Girgis <gyr...@gm...> Date: Sat Jan 25 17:50:14 2025 -0600 Updated AUTHORS with year 2025 for Falco Girgis. commit 0e03833bbe86e805c27b754aff84e4f5e8fde6c3 Merge: a04a2948 8426c784 Author: Donald Haase <qu...@ya...> Date: Sat Jan 25 17:57:22 2025 -0500 Merge pull request #914 from KallistiOS/falco/irq.c_build_fix Fixed build issue in irq.c. commit 8426c784cd9f959d8249c5271590e79588f9a5d9 Author: Falco Girgis <gyr...@gm...> Date: Sat Jan 25 16:54:51 2025 -0600 Fixed build issue in irq.c. irq_get_handler() was changed from returning a single function pointer to the old handler to return a function pointer/userdata pair with the new API, but this return statement hadn't been updated. - Updated to return a pair of NULL pointers for the callback struct. commit a04a29480bc58ffc5905908e6643b9c540d86b36 Merge: 727c4008 ee00f1a8 Author: Donald Haase <qu...@ya...> Date: Sat Jan 25 17:18:33 2025 -0500 Merge pull request #910 from darcagn/15bump Update GCC 15.0.0-dev profile name to GCC 15.0.1-dev commit 727c400883b17634f98c4b42207dc8e7f5ca5def Merge: 7917b346 23f1cf94 Author: Donald Haase <qu...@ya...> Date: Sat Jan 25 17:17:15 2025 -0500 Merge pull request #891 from pcercuei/mmu-init-basic mmu: Add support for creating static memory maps commit 7917b346319aa159b10199f77aa091a37e364e20 Merge: 9688eeef 7c3d0871 Author: Donald Haase <qu...@ya...> Date: Sat Jan 25 17:15:28 2025 -0500 Merge pull request #883 from KallistiOS/irq_cleanup_3 IRQ Cleanup Part 3 commit 9688eeefaf568fd3eb8675086c98ee5a5f3e6d6a Merge: 65e1c505 c639750b Author: Donald Haase <qu...@ya...> Date: Sat Jan 25 17:14:38 2025 -0500 Merge pull request #870 from pcercuei/drop-vec3f Drop vec3f ASM commit 65e1c505c19a14800da044bab9d3f8a1be3aafaa Merge: 03b51ef7 67fb082e Author: Donald Haase <qu...@ya...> Date: Sat Jan 25 17:13:56 2025 -0500 Merge pull request #887 from pcercuei/environ.sh environ.sh: Disable -fno-builtin, enable -ffast-math commit ee00f1a816c947061b8600249b3f466899c11971 Author: darc <da...@pr...> Date: Fri Jan 24 12:39:42 2025 -0600 Update GCC 15.0.0-dev profile name to GCC 15.0.1-dev commit 23f1cf94a02d5f2b46d8231d475bbee2f0afd483 Author: Paul Cercueil <pa...@cr...> Date: Wed Jan 22 14:45:40 2025 +0100 doc: CHANGELOG: Add basic MMU functionality Signed-off-by: Paul Cercueil <pa...@cr...> commit 5d6c022ee979460bd3377f3dc3f0b707f9f4283f Author: Paul Cercueil <pa...@cr...> Date: Tue Jan 21 01:10:20 2025 +0100 mmu: Add mmu_shutdown_basic() This function can be used to turn off MMU support after it was initialized with mmu_shutdown_basic(). Signed-off-by: Paul Cercueil <pa...@cr...> commit fe5e812eb272c5643aae8bacd34a13722b94919b Author: Paul Cercueil <pa...@cr...> Date: Fri Jan 10 17:45:58 2025 +0100 mmu: Add mmu_page_map_static() This function reserves one TLB entry to create a static mapping from a virtual memory address to a physical memory address. Static mappings are never flushed out of the TLB, and are sometimes useful when the whole MMU function is not necesary. Static memory mappings can also use different page sizes. Signed-off-by: Paul Cercueil <pa...@cr...> commit e8797cca5979b28acbd8da09ca9d3e5fa51fa99f Author: Paul Cercueil <pa...@cr...> Date: Fri Jan 10 18:10:54 2025 +0100 mmu: Add mmu_init_basic() This function can be used to initialize the MMU with the bare minimum. This is useful for applications that just need to create a few static mappings, without needing the whole dynamic mapping mechanism. Signed-off-by: Paul Cercueil <pa...@cr...> commit b0690ea9fc7b4f389817f0e2f9300c80768b9792 Author: Paul Cercueil <pa...@cr...> Date: Fri Jan 10 17:55:23 2025 +0100 mmu: Replace macros with enums and update mmu_page_map() Introduce the page_prot and page_cache enums, and update the mmu_page_map() function to use these types (as well as bools). Signed-off-by: Paul Cercueil <pa...@cr...> commit 0ee1ae75d6fe8afac6672a3323d21818f2af1d7d Author: Paul Cercueil <pa...@cr...> Date: Fri Jan 10 17:49:41 2025 +0100 mmu: Use standard stdint.h types s/uint32/uint32_t/ s/uint8/uint8_t/ No functional change intended. Signed-off-by: Paul Cercueil <pa...@cr...> commit f0876d4e99485674d91876beea22712fb67dc1ad Author: Paul Cercueil <pa...@cr...> Date: Fri Jan 10 17:47:03 2025 +0100 mmu: Move bit definitions to mmu.c, use regfield macros The bit definitions don't really belong into the public API. mmu.c now uses the GENMASK() and REGFIELD_GET() macros from <kos/regfield.h>. Signed-off-by: Paul Cercueil <pa...@cr...> commit 5b66194b6f1b2a908686a3228b4b83861b2d7482 Author: Paul Cercueil <pa...@cr...> Date: Fri Jan 10 17:20:15 2025 +0100 mmu: Factorize code Factorize code by reusing mmu_ldtlb_quick() inside mmu_ldtlb(), and using the BUILD_* macros inside their corresponding SET_* macros. Signed-off-by: Paul Cercueil <pa...@cr...> commit a2c06d1349210237d0a6ffc0d065c2cfa8cf491a Author: Paul Cercueil <pa...@cr...> Date: Mon Sep 23 22:04:38 2024 +0200 mmu: Make mmu_init() void-typed They would always return 0; so they might just as well not return any value. Signed-off-by: Paul Cercueil <pa...@cr...> commit c620d7c060ff691073fd8eb124be1ccaea35218d Author: Paul Cercueil <pa...@cr...> Date: Tue Jan 21 01:04:49 2025 +0100 doc: CHANGELOG: Add entry about DMAC API I forgot to add it in my PR. Also add a proper header to the dmac.c file. Signed-off-by: Paul Cercueil <pa...@cr...> commit 03b51ef77bd15aea74d54a03ab09b8a6e043db79 Merge: 272f3351 1fc850b9 Author: Lawrence Sebald <ljs...@us...> Date: Tue Jan 21 23:05:47 2025 -0500 Merge pull request #906 from KallistiOS/readdir_null_deref Test for NULL response from readdir. commit 272f3351e2505e4eabcd1d1185e3bd78a94ece17 Merge: 06b08436 0df44582 Author: Lawrence Sebald <ljs...@us...> Date: Tue Jan 21 23:04:29 2025 -0500 Merge pull request #834 from darcagn/m4-single-as-default Make m4-single the default floating-point precision ABI commit 1fc850b9a3ee2ca0d10b33eae084dfbd6fd30e89 Author: QuzarDC <qu...@co...> Date: Tue Jan 21 16:18:27 2025 -0500 Test for NULL response from readdir. Prevents null derefs on empty dirs. commit 0df44582196029ae2975fbac29577c6166b0796a Author: darc <da...@pr...> Date: Tue Jan 21 15:17:28 2025 -0600 Adjust loadable/Makefile.prefab to respect KOS_SH4_PRECISION environment variable commit e76e4ffec53d87c1360f2d89b5ad52b52b9dae63 Author: darc <da...@pr...> Date: Tue Jan 21 14:18:30 2025 -0600 Update CHANGELOG.md and RELNOTES.md for m4-single ABI change commit 6f46b379338f915fe71e3e79c55a13dde504fa15 Author: darc <da...@pr...> Date: Tue Nov 19 18:12:30 2024 -0600 Fallback to m4-single-only if GCC is not built with m4-single support commit 2f90256c39d4c698fe1238775c65a0abb57a008c Author: darc <da...@pr...> Date: Mon Oct 14 17:40:45 2024 -0500 Make m4-single the default floating-point precision ABI commit 7c3d087100ba3ea4e34f8bb413ee061c492acf6a Author: QuzarDC <qu...@co...> Date: Sat Jan 18 17:35:29 2025 -0500 Make irq_cb_t a public type and return it in handler accessors. This now allows for chaining of handlers by retrieving the full handler/userdata set. That way when you install your own you can choose to call the previous one within it. commit 8e880352b8e2b1bdfe52504c1f7060a195ecf477 Author: QuzarDC <qu...@co...> Date: Sat Jan 18 03:54:52 2025 -0500 Clear Timer Interrupts in the default handler. Split from #618 . The existing behavior meant that aside from within an installed general handler, the TMU underflow bit would always be cleared prior to calling its assigned handler. It didn't really make sense as the actual handler would then not be able to use this info. Instead, like for TMU0, handlers are installed to all 3 which just perform this timer clear. Each of the replacement handlers used internally already also clear as well. This might impact 3rd party handlers if they presumed that the timer will have always been cleared first. Also some whitespace cleanup. commit 66d96f91a5f254e4407d0dde25256be00ff48da4 Author: QuzarDC <qu...@co...> Date: Sat Jan 18 03:49:32 2025 -0500 Cleanups of comments and switch to C11 alignas. Split from #618 commit 4169aa2c7b232fdacaaadb4b085476a57b273b3a Author: QuzarDC <qu...@co...> Date: Sat Jan 18 03:42:59 2025 -0500 Expose and document irq_get_sr() from entry.s commit 67fb082e9f1b27fdb18d3b53a193a5bd91a38b3d Author: Paul Cercueil <pa...@cr...> Date: Wed Jan 8 13:26:44 2025 +0100 environ.sh: Enable fast-math by default We recommend -ffast-math everywhere, and everyone seems to be using it. Those who don't, probably don't need the full IEEE compliance and just forgot to add the flag. Note that the previous comment suggested that FSQRT was not used without fast-math, but this was wrong. GCC will still emit that instruction in a "fast path" when it knows it can use it, or a call to the C sqrtf() otherwise. Signed-off-by: Paul Cercueil <pa...@cr...> commit fc5d711ca3797ea5d8c259fa5136dbe59715ab5e Author: Paul Cercueil <pa...@cr...> Date: Wed Jan 8 13:21:50 2025 +0100 environ.sh: Disable -fno-builtin I do not see any valid reason to have it enabled by default. It also most likely prevents GCC from generating better code. Signed-off-by: Paul Cercueil <pa...@cr...> commit d1c9414b50ca7e38639d34e8148c9bd2a04b1e75 Author: Paul Cercueil <pa...@cr...> Date: Wed Jan 8 13:14:25 2025 +0100 environ.sh: Enable -mfsrra -mfsca unconditionally The FSRRA and FSCA instructions will not be used by GCC unless -ffast-math is enabled. Therefore we can move them to the environ_dreamcast.sh script, and leave the -ffast-math option in the main environ.sh script. Signed-off-by: Paul Cercueil <pa...@cr...> commit c639750b0951531b8d338db8b5f1b74d7885e767 Author: Paul Cercueil <pa...@cr...> Date: Wed Dec 18 14:54:46 2024 +0100 Drop vec3f ASM Use the vec3f_t type defined by the header, and replace all inline ASM with C code. Apart from the "fipr" instruction, which we already have macros for, there is absolutely no reason to have these algorithms in ASM. Not only it is unnecessary, it is also harmful as the C compiler cannot re-organize those instructions as it sees fit. Signed-off-by: Paul Cercueil <pa...@cr...> ----------------------------------------------------------------------- Summary of changes: AUTHORS | 2 +- doc/CHANGELOG.md | 4 + doc/RELNOTES.md | 44 +- doc/environ.sh.sample | 27 +- environ_dreamcast.sh | 12 +- examples/dreamcast/libdream/vmu/vmu.c | 18 +- examples/dreamcast/raylib/raytris/Makefile | 30 ++ examples/dreamcast/raylib/raytris/README.md | 34 ++ .../raylib/raytris/romdisk/assets/sound/bgm.adpcm | Bin 0 -> 3395744 bytes .../raylib/raytris/romdisk/assets/sound/clear.wav | Bin 0 -> 68270 bytes .../raylib/raytris/romdisk/assets/sound/rotate.wav | Bin 0 -> 29352 bytes .../dreamcast/raylib/raytris/src/blocks/block.cpp | 67 +++ .../dreamcast/raylib/raytris/src/blocks/block.h | 33 ++ .../dreamcast/raylib/raytris/src/blocks/blocks.cpp | 104 +++++ .../dreamcast/raylib/raytris/src/colors/colors.cpp | 21 + .../dreamcast/raylib/raytris/src/colors/colors.h | 21 + .../raylib/raytris/src/constants/constants.h | 33 ++ .../raylib/raytris/src/constants/vmuIcons.cpp | 285 ++++++++++++ .../raylib/raytris/src/constants/vmuIcons.h | 15 + .../dreamcast/raylib/raytris/src/game/game.cpp | 349 ++++++++++++++ examples/dreamcast/raylib/raytris/src/game/game.h | 57 +++ .../dreamcast/raylib/raytris/src/grid/grid.cpp | 102 +++++ examples/dreamcast/raylib/raytris/src/grid/grid.h | 29 ++ .../raylib/raytris/src/position/position.cpp | 11 + .../raylib/raytris/src/position/position.h | 13 + examples/dreamcast/raylib/raytris/src/raytris.cpp | 94 ++++ .../raylib/raytris/src/sound/soundManager.cpp | 24 + .../raylib/raytris/src/sound/soundManager.h | 22 + examples/dreamcast/raylib/raytris/src/system/cd.h | 37 ++ .../raylib/raytris/src/vmu/vmuManager.cpp | 22 + .../dreamcast/raylib/raytris/src/vmu/vmuManager.h | 16 + examples/dreamcast/readme.md | 4 +- kernel/arch/dreamcast/hardware/dmac.c | 6 + kernel/arch/dreamcast/hardware/maple/controller.c | 13 +- kernel/arch/dreamcast/hardware/pvr/pvr_buffers.c | 12 +- kernel/arch/dreamcast/hardware/pvr/pvr_dma.c | 8 +- kernel/arch/dreamcast/hardware/pvr/pvr_irq.c | 58 +-- kernel/arch/dreamcast/hardware/pvr/pvr_misc.c | 5 +- kernel/arch/dreamcast/hardware/pvr/pvr_scene.c | 15 +- kernel/arch/dreamcast/include/arch/irq.h | 80 +++- kernel/arch/dreamcast/include/arch/mmu.h | 143 ++++-- .../arch/dreamcast/include/dc/maple/controller.h | 10 +- kernel/arch/dreamcast/include/dc/vec3f.h | 509 +++++++-------------- kernel/arch/dreamcast/kernel/irq.c | 51 +-- kernel/arch/dreamcast/kernel/mmu.c | 156 ++++--- kernel/fs/fs.c | 6 +- kernel/libc/posix/sysconf.c | 38 +- loadable/Makefile.prefab | 4 +- utils/dc-chain/Makefile.default.cfg | 34 +- utils/dc-chain/README.md | 2 +- utils/dc-chain/docker/README.md | 2 +- .../{gcc-15.0.0-kos.diff => gcc-15.0.1-kos.diff} | 48 +- ...profile.15.0.0-dev.mk => profile.15.0.1-dev.mk} | 4 +- 53 files changed, 2093 insertions(+), 641 deletions(-) create mode 100644 examples/dreamcast/raylib/raytris/Makefile create mode 100644 examples/dreamcast/raylib/raytris/README.md create mode 100644 examples/dreamcast/raylib/raytris/romdisk/assets/sound/bgm.adpcm create mode 100644 examples/dreamcast/raylib/raytris/romdisk/assets/sound/clear.wav create mode 100644 examples/dreamcast/raylib/raytris/romdisk/assets/sound/rotate.wav create mode 100644 examples/dreamcast/raylib/raytris/src/blocks/block.cpp create mode 100644 examples/dreamcast/raylib/raytris/src/blocks/block.h create mode 100644 examples/dreamcast/raylib/raytris/src/blocks/blocks.cpp create mode 100644 examples/dreamcast/raylib/raytris/src/colors/colors.cpp create mode 100644 examples/dreamcast/raylib/raytris/src/colors/colors.h create mode 100644 examples/dreamcast/raylib/raytris/src/constants/constants.h create mode 100644 examples/dreamcast/raylib/raytris/src/constants/vmuIcons.cpp create mode 100644 examples/dreamcast/raylib/raytris/src/constants/vmuIcons.h create mode 100644 examples/dreamcast/raylib/raytris/src/game/game.cpp create mode 100644 examples/dreamcast/raylib/raytris/src/game/game.h create mode 100644 examples/dreamcast/raylib/raytris/src/grid/grid.cpp create mode 100644 examples/dreamcast/raylib/raytris/src/grid/grid.h create mode 100644 examples/dreamcast/raylib/raytris/src/position/position.cpp create mode 100644 examples/dreamcast/raylib/raytris/src/position/position.h create mode 100644 examples/dreamcast/raylib/raytris/src/raytris.cpp create mode 100644 examples/dreamcast/raylib/raytris/src/sound/soundManager.cpp create mode 100644 examples/dreamcast/raylib/raytris/src/sound/soundManager.h create mode 100644 examples/dreamcast/raylib/raytris/src/system/cd.h create mode 100644 examples/dreamcast/raylib/raytris/src/vmu/vmuManager.cpp create mode 100644 examples/dreamcast/raylib/raytris/src/vmu/vmuManager.h rename utils/dc-chain/patches/{gcc-15.0.0-kos.diff => gcc-15.0.1-kos.diff} (74%) rename utils/dc-chain/profiles/{profile.15.0.0-dev.mk => profile.15.0.1-dev.mk} (98%) diff --git a/AUTHORS b/AUTHORS index f476c351..333e288c 100644 --- a/AUTHORS +++ b/AUTHORS @@ -43,7 +43,7 @@ Joe Fenton: 2016 Stefan Galowicz: 2016, 2017 Luke Benstead: 2020, 2021, 2022, 2023 Eric Fradella: 2023, 2024, 2025 -Falco Girgis: 2023, 2024 +Falco Girgis: 2023, 2024, 2025 Ruslan Rostovtsev: 2014, 2016, 2023, 2024 Colton Pawielski: 2023 Andy Barajas: 2023, 2024 diff --git a/doc/CHANGELOG.md b/doc/CHANGELOG.md index 3f7bccac..d297fd41 100644 --- a/doc/CHANGELOG.md +++ b/doc/CHANGELOG.md @@ -13,6 +13,10 @@ Platform-specific changes are prefixed with the platform name, otherwise the cha - **Dreamcast**: Cleaned up, documented, and enhanced BIOS font API [FG] - Rework PVR hybrid mode + IRQ handling [PC] - **Dreamcast**: Add support and update toolchain profiles for Newlib 4.5.0, Binutils 2.43.1, and GDB 15.2 [EF] +- **Dreamcast**: Make m4-single the default floating-point ABI [EF] +- **Dreamcast**: Add DMAC API [PC] +- **Dreamcast**: Add basic MMU functionality [PC] +- **Dreamcast**: Added Raytris raylib example by Niisoks [FG] ## KallistiOS version 2.1.1 - Added pvrtex utility by TapamN to utils [Daniel Fairchild == DF] diff --git a/doc/RELNOTES.md b/doc/RELNOTES.md index 91ffbab3..8ad24c69 100644 --- a/doc/RELNOTES.md +++ b/doc/RELNOTES.md @@ -2,6 +2,44 @@ KallistiOS ##version## Copyright (C) 2002, 2003 Megan Potter Copyright (C) 2012-2019 Lawrence Sebald Copyright (C) 2024 Donald Haase +Copyright (C) 2025 Eric Fradella + +RELEASE NOTES for 2.2.0 +----------------------- +A significant change has been made regarding the default floating-point ABI used +by KallistiOS. In previous KOS releases, and even in commercial games released +during the Dreamcast's lifetime, the `m4-single-only` floating-point ABI was +used. With the `m4-single-only` ABI, the SH4 CPU is always in single-precision +mode and all uses of 64-bit `double` values are truncated to 32-bit `float` +values by the compiler, allowing the compiler to use twice the number of +floating-point registers at the expense of precision. Going forward, KOS now +uses the `m4-single` floating-point ABI by default. With the `m4-single` ABI, +the SH4 CPU is in single-precision mode upon function entry, but the compiler +can change the mode and use true 64-bit `double` values within functions. For +most projects, there are no implications from this change other than gaining +the ability to use 64-bit `double` values. There are, however, two possibilities +for negative effects: + +- In older projects using `double` values (which were actually being truncated + to 32-bit `float` values upon compilation anyway), the code should be changed + to explicitly use `float` values instead. If not changed, fewer floating-point + registers may be available to the compiler, in exchange for a needless bonus + doubling of floating-point precision. + +- The order of floating-point register names is changed. When using + `m4-single-only`, register names are ordered fr4, fr5, fr6, fr7, etc., but in + `m4-single`, register names are ordered fr5, fr4, fr7, fr6, etc. In order to + account for this difference and still have inline assembly functions using + floating-point registers work properly regardless of the ABI used, the + KOS_FPARG(n) macro has been provided in `arch/args.h`. + +Despite the change to `m4-single` by default, KOS is still committed to full +support for `m4-single-only` in addition to offering new support for +`m4-single`. This is selectable using the `KOS_SH4_PRECISION` environment +variable within environ.sh. It is highly recommended to compile KOS, all +kos-ports, and all libraries with the same uniform setting as your projects. +Other ABIs, such as `m4` or `m4-nofpu`, are not supported at this time. + RELEASE NOTES for 2.1.1 ----------------------- @@ -23,9 +61,9 @@ RELEASE NOTES for 2.1.0 # What's New in Version 2.1.0 -KOS v2.1.0 has been a long time in the making. As such, it seemed prudent to -provide an overview of the new functionality since v2.0.0 in 2013. We intend -to have more frequent versioned releases moving forward, so this kind of +KOS v2.1.0 has been a long time in the making. As such, it seemed prudent to +provide an overview of the new functionality since v2.0.0 in 2013. We intend +to have more frequent versioned releases moving forward, so this kind of information should be easily seen in the changelog. # Core Functionality diff --git a/doc/environ.sh.sample b/doc/environ.sh.sample index 14db9945..eb846c4a 100644 --- a/doc/environ.sh.sample +++ b/doc/environ.sh.sample @@ -181,21 +181,24 @@ export KOS_CFLAGS="${KOS_CFLAGS} -fno-builtin" # however, they do so at the price of accuracy and are not IEEE compliant. # NOTE: Enabling this option will also override -fno-builtin! # -#export KOS_CFLAGS="${KOS_CFLAGS} -fbuiltin -ffast-math -ffp-contract=fast -mfsrra -mfsca" +#export KOS_CFLAGS="${KOS_CFLAGS} -fbuiltin -ffast-math -ffp-contract=fast" -# SH4 Floating Point Arithmetic Precision +# SH4 Floating-Point Arithmetic Precision # -# KallistiOS only officially supports the single-precision-only floating-point -# arithmetic mode (-m4-single-only), but double precision, single default -# (-m4-single) or double precision default (-m4) modes can be enabled here by -# adjusting KOS_SH4_PRECISION. -# WARNING: Adjusting this setting has a high likelihood of breaking KallistiOS, -# kos-ports, and existing codebases which assume -m4-single-only. -# Do not touch this setting unless you know what you are doing! -# NOTE: Altering this setting also requires your toolchain to have been built -# with support for these modes, which is not the case by default! +# KallistiOS supports both the single-precision-default ABI (m4-single) and the +# single-precision-only ABI (m4-single-only). When using m4-single, the SH4 will +# be in single-precision mode upon function entry but will switch to double- +# precision mode if 64-bit doubles are used. When using m4-single-only, the SH4 +# will always be in single-precision mode and 64-bit doubles will be truncated to +# 32-bit floats. Historically, m4-single-only was used in both official and +# homebrew Dreamcast software, but m4-single is the default as of KOS 2.2.0 to +# increase compatibility with newer libraries which require 64-bit doubles. # -export KOS_SH4_PRECISION="-m4-single-only" +# WARNING: When adjusting this setting, make sure all software, including +# kos-ports and linked external libraries, are rebuilt using the same +# floating-point precision ABI setting! +# +export KOS_SH4_PRECISION="-m4-single" # Use LRA (Local Register Allocator) Pass # diff --git a/environ_dreamcast.sh b/environ_dreamcast.sh index 2ae5ccb3..f5adfe5a 100644 --- a/environ_dreamcast.sh +++ b/environ_dreamcast.sh @@ -11,12 +11,18 @@ if ! expr ":$PATH:" : ".*:${DC_TOOLS_BASE}:.*" > /dev/null ; then export PATH="${PATH}:${DC_TOOLS_BASE}" fi -# Default the SH4 floating point precision if it isn't already set. +# Default the SH4 floating-point precision if it isn't already set. +# m4-single is used if supported by the current toolchain, otherwise +# m4-single-only is used as a fallback option. if [ -z "${KOS_SH4_PRECISION}" ] ; then - export KOS_SH4_PRECISION="-m4-single-only" + if echo 'int main(){}' | ${KOS_CC} -x c -c -o /dev/null - -m4-single 2>/dev/null; then + export KOS_SH4_PRECISION="-m4-single" + else + export KOS_SH4_PRECISION="-m4-single-only" + fi fi -export KOS_CFLAGS="${KOS_CFLAGS} ${KOS_SH4_PRECISION} -ml -ffunction-sections -fdata-sections -matomic-model=soft-imask -ftls-model=local-exec" +export KOS_CFLAGS="${KOS_CFLAGS} ${KOS_SH4_PRECISION} -ml -mfsrra -mfsca -ffunction-sections -fdata-sections -matomic-model=soft-imask -ftls-model=local-exec" export KOS_AFLAGS="${KOS_AFLAGS} -little" if [ x${KOS_SUBARCH} = xnaomi ]; then diff --git a/examples/dreamcast/libdream/vmu/vmu.c b/examples/dreamcast/libdream/vmu/vmu.c index 3ec198cb..02d5d69a 100644 --- a/examples/dreamcast/libdream/vmu/vmu.c +++ b/examples/dreamcast/libdream/vmu/vmu.c @@ -4,16 +4,22 @@ /* Thanks to Marcus Comstedt for this VMU format info. */ -#include <kos.h> +#include <stdio.h> +#include <string.h> + +#include <dc/biosfont.h> +#include <dc/video.h> + +#include <dc/maple/vmu.h> /* Draws one file entry, along with its "description" in the boot rom file manager. */ -static int y1 = 20 + 36; +static int off1 = 20 + 36; void draw_one(maple_device_t *addr, char *fn, uint16 hdrblock) { - bfont_draw_str(vram_s + y1 * 640 + 10, 640, 0, "File "); - bfont_draw_str(vram_s + y1 * 640 + 10 + 5 * 12, 640, 0, fn); + bfont_draw_str(vram_s + off1 * 640 + 10, 640, 0, "File "); + bfont_draw_str(vram_s + off1 * 640 + 10 + 5 * 12, 640, 0, fn); if(hdrblock) { uint8 buf[1024]; @@ -24,11 +30,11 @@ void draw_one(maple_device_t *addr, char *fn, uint16 hdrblock) { } buf[0x10 + 32] = 0; - bfont_draw_str(vram_s + y1 * 640 + 10 + (6 + strlen(fn)) * 12, 640, 0, + bfont_draw_str(vram_s + off1 * 640 + 10 + (6 + strlen(fn)) * 12, 640, 0, (char *)(buf + 0x10)); } - y1 += 24; + off1 += 24; } /* We only do the monochrome one here to avoid having to diff --git a/examples/dreamcast/raylib/raytris/Makefile b/examples/dreamcast/raylib/raytris/Makefile new file mode 100644 index 00000000..b7362805 --- /dev/null +++ b/examples/dreamcast/raylib/raytris/Makefile @@ -0,0 +1,30 @@ +# +# Raytris +# Copyright (C) 2024 Cole Hall +# + +TARGET = raytris.elf +OBJS = src/raytris.o romdisk.o src/grid/grid.o src/colors/colors.o src/position/position.o src/blocks/block.o src/constants/vmuIcons.o src/game/game.o src/sound/soundManager.o src/vmu/vmuManager.o +KOS_ROMDISK_DIR = romdisk + +KOS_CFLAGS += -I${KOS_PORTS}/include/raylib + +all: rm-elf $(TARGET) + +include $(KOS_BASE)/Makefile.rules + +clean: rm-elf + -rm -f $(OBJS) + +rm-elf: + -rm -f $(TARGET) romdisk.* + +$(TARGET): $(OBJS) + kos-c++ -o $(TARGET) $(OBJS) -lraylib -lGL -lwav + +run: $(TARGET) + $(KOS_LOADER) $(TARGET) + +dist: $(TARGET) + -rm -f $(OBJS) romdisk.img + $(KOS_STRIP) $(TARGET) \ No newline at end of file diff --git a/examples/dreamcast/raylib/raytris/README.md b/examples/dreamcast/raylib/raytris/README.md new file mode 100644 index 00000000..9bb379cb --- /dev/null +++ b/examples/dreamcast/raylib/raytris/README.md @@ -0,0 +1,34 @@ +# Raytris +A simple legally distinct block stacking puzzle game using raylib and kallistios that runs on the sega dreamcast. + +Anyone is free to do whatever they want with the code in this project. + +## Purpose of this Repository +This is a block stacking puzzle game created using raylib following [this tutorial](https://www.youtube.com/watch?v=wVYKG_ch4yM) by youtuber "[Programming With Nick](https://www.youtube.com/@programmingwithnick)". I wanted to create a game for the sega dreamcast and get it running on actual hardware, but don't actually have any real experience with dreamcast homebrew development or C/C++ development, so this repository is going to show my whole learning process. + +I have decided to continue past the tutorial in order to further develop my skills and make a nicer Raytris experience. You can see this [here](https://github.com/Niisoks/Tetris-RayLib4DC). If you are here _just_ to see what the tutorial looks like on kallistios, [please check the branch titled "TutorialCompletion"](https://github.com/Niisoks/Tetris-RayLib4DC/tree/TutorialCompletion). + +## Tools and references used +- [KallistiOS (KOS)](https://github.com/KallistiOS/KallistiOS) + - [Simulant Discord Server](https://discord.gg/NtBGReCtBT) +- [raylib4Dreamcast](https://github.com/raylib4Consoles/raylib4Dreamcast) + - [raylib](https://github.com/raysan5/raylib) + - [raylib examples](https://www.raylib.com/examples.html) +- [Dreamcast Wiki](https://dreamcast.wiki/Dreamcast.wiki) + +## Assets Used +### Music +- [Block Party Shuffle](https://suno.com/) by [BBHoodsta] + +### Sound effects +- [Sound effects](https://www.zapsplat.com/) + +## Thanks and credits +- Everyone who made and maintain kos +- Everyone who helped port raylib to kos +- Raysan5 for making raylib +- Falco Girgis for pointing me to the right people when i needed help +- Ian Michael for explaining what/why i should use certain audio +- BBHoodsta for showing me where the audio examples are +- Programming with nick for making a nice and easy to follow tutorials +- Everyone else who helped me who i forgot about diff --git a/examples/dreamcast/raylib/raytris/romdisk/assets/sound/bgm.adpcm b/examples/dreamcast/raylib/raytris/romdisk/assets/sound/bgm.adpcm new file mode 100644 index 00000000..dc17bfb7 Binary files /dev/null and b/examples/dreamcast/raylib/raytris/romdisk/assets/sound/bgm.adpcm differ diff --git a/examples/dreamcast/raylib/raytris/romdisk/assets/sound/clear.wav b/examples/dreamcast/raylib/raytris/romdisk/assets/sound/clear.wav new file mode 100644 index 00000000..b94bafc1 Binary files /dev/null and b/examples/dreamcast/raylib/raytris/romdisk/assets/sound/clear.wav differ diff --git a/examples/dreamcast/raylib/raytris/romdisk/assets/sound/rotate.wav b/examples/dreamcast/raylib/raytris/romdisk/assets/sound/rotate.wav new file mode 100644 index 00000000..2b1a64e1 Binary files /dev/null and b/examples/dreamcast/raylib/raytris/romdisk/assets/sound/rotate.wav differ diff --git a/examples/dreamcast/raylib/raytris/src/blocks/block.cpp b/examples/dreamcast/raylib/raytris/src/blocks/block.cpp new file mode 100644 index 00000000..ae987855 --- /dev/null +++ b/examples/dreamcast/raylib/raytris/src/blocks/block.cpp @@ -0,0 +1,67 @@ +/* KallistiOS ##version## + examples/dreamcast/raylib/raytris/src/blocks/block.cpp + Copyright (C) 2024 Cole Hall +*/ + +#include "block.h" +#include "../constants/constants.h" +#include "../constants/vmuIcons.h" + +Block::Block(){ + cellSize = Constants::cellSize; + rotationState = 0; + colors = GetCellColors(); + rowOffset = 0; + columnOffset = 0; + vmuIcon = vmuNULL; +} + +void Block::Draw(int offsetX, int offsetY){ + std::vector<Position> tiles = GetCellPositions(); + for(Position item: tiles){ + DrawRectangle( + item.column * cellSize + offsetX, + item.row * cellSize + offsetY, + cellSize - 1, + cellSize -1, + colors[id] + ); + } +} + +void Block::Move(int rows, int columns){ + rowOffset += rows; + columnOffset += columns; +} + +void Block::Reset(){ + rowOffset = 0; + columnOffset = (Constants::numCols / 2) - 1; +} + +std::vector<Position> Block::GetCellPositions(){ + std::vector<Position> tiles = cells[rotationState]; + std::vector<Position> movedTiles; + for(Position item: tiles){ + Position newPos = Position(item.row + rowOffset, item.column + columnOffset); + movedTiles.push_back(newPos); + } + + return movedTiles; +} + +// Rotate clockwise +void Block::Rotate(){ + rotationState ++; + if(rotationState == static_cast<int>(cells.size())){ + rotationState = 0; + } +} + +// Rotate counter clockwise +void Block::UndoRotation(){ + rotationState --; + if(rotationState == -1){ + rotationState = cells.size() -1; + } +} \ No newline at end of file diff --git a/examples/dreamcast/raylib/raytris/src/blocks/block.h b/examples/dreamcast/raylib/raytris/src/blocks/block.h new file mode 100644 index 00000000..45378ea8 --- /dev/null +++ b/examples/dreamcast/raylib/raytris/src/blocks/block.h @@ -0,0 +1,33 @@ +/* KallistiOS ##version## + examples/dreamcast/raylib/raytris/src/blocks/block.h + Copyright (C) 2024 Cole Hall +*/ + +#pragma once + +#include <vector> +#include <map> +#include "../position/position.h" +#include "../colors/colors.h" + +class Block{ + + public: + Block(); + void Draw(int offsetX, int offsetY); + void Move(int rows, int columns); + void Reset(); + std::vector<Position> GetCellPositions(); + void Rotate(); + void UndoRotation(); + int id; + std::map<int, std::vector<Position>> cells; + const char* vmuIcon; + + private: + int cellSize; + int rotationState; + std::vector<Color> colors; + int rowOffset; + int columnOffset; +}; \ No newline at end of file diff --git a/examples/dreamcast/raylib/raytris/src/blocks/blocks.cpp b/examples/dreamcast/raylib/raytris/src/blocks/blocks.cpp new file mode 100644 index 00000000..f1d7c40e --- /dev/null +++ b/examples/dreamcast/raylib/raytris/src/blocks/blocks.cpp @@ -0,0 +1,104 @@ +/* KallistiOS ##version## + examples/dreamcast/raylib/tetris/src/blocks/blocks.cpp + Copyright (C) 2024 Cole Hall +*/ + +#include "block.h" +#include "../position/position.h" +#include "../constants/vmuIcons.h" + +class LBlock : public Block{ + public: + LBlock(){ + id = 1; + vmuIcon = vmuL; + cells[0] = {Position(0, 2), Position(1, 0), Position(1, 1), Position(1, 2)}; + cells[1] = {Position(0, 1), Position(1, 1), Position(2, 1), Position(2, 2)}; + cells[2] = {Position(1, 0), Position(1, 1), Position(1, 2), Position(2, 0)}; + cells[3] = {Position(0, 0), Position(0, 1), Position(1, 1), Position(2, 1)}; + Move(0, 3); ...<truncated>... hooks/post-receive -- A pseudo Operating System for the Dreamcast. |