Commit graph

148 commits

Author SHA1 Message Date
Lephe
9eb723ee53
render: remove the GINT_NEED_VRAM macro
This macro used to protect the declaration of the [vram] variable of
gint. This variable was short to keep drawing functions short but could
clutter the namespace.

That being said, it's even better to just [#define vram gint_vram] if
you need. This change renames the variable to [gint_vram], exposes it
whenever <gint/display.h> is included, and removes the GINT_NEED_VRAM
macro altogether.
2019-10-27 08:14:42 +01:00
Lephe
95a3345326
keyboard: add keydown() in the model
This change adds a keydown() function that is synchronized with events,
ie. it returns the key state as seen by previously read events.

It also completely eliminates low-level repeat events, which are not
very meaningul as the keyboard scan frequency goes up (and would be
meaningless if KEYSC interrupts were used), and adapts getkey() by
giving it access to the current driver time through pollevent().
2019-09-28 19:25:01 +02:00
Lephe
86cd9b98d4
small improvements
* Update TOTO list
* Change the type of gint_vbr to comply with a new warning in GCC 9
* Add strcmp()
2019-09-19 15:59:38 +02:00
Lephe
a05d3416f0
std: support integer size formats (hh, h, l, ll) 2019-09-19 15:58:35 +02:00
Lephe
fc7aab6eba
dma: finalize dma_memset() and dma_memcpy()
Adds support for dma_memcpy(), and uses a proper ILRAM allocation scheme
(static linking here) for the temporary buffer in dma_memset().
2019-09-15 19:30:57 +02:00
Lephe
15558c8fb3
support data loading in ILRAM, XRAM and YRAM
This change adds support for three sections .ilram, .xram and .yram,
along with three macros GILRAM, GXRAM and GYRAM, that can be used to
statically load data to on-chip memory.
2019-09-15 19:29:47 +02:00
Lephe
bb77e4588d
dma: fix freezes when transferring to/from IL memory
The IL memory is unavailable when the processor goes to sleep, causing
any involved DMA transfer to stall. The dma_transfer_wait() normally
sleeps to save battery power, but this causes the whole system to freeze
and never wake up.

This change lets dma_transfer_wait() decide dynamically whether to sleep
or spinlock. There is no concrete improvement over dma_transfer_noint()
when using IL memory, but it makes dma_transfer() fully generic.

Obviously the same goes for X and Y memory.
2019-09-15 15:20:23 +02:00
Lephe
552b9b9a43
dma: only expose API on fxcg50
Currently there seems to be no DMA at all on fx9860g. Further
investigation would be required, because this would be the first major
difference between the SH7305's found in fx9860g and fxcg50 models.

An automated peripheral register discovery strategy might help, but
identifying discovered registers would be non trivial.

Also use the pruning ability of the Makefile to avoid troublesome
ifdef's in the code.
2019-09-15 10:20:37 +02:00
Lephe
5630814897
core: allow custom panics and exception catching
This change introduces two new mechanismes for executing user code when
an exception occurs.

* This first is the custom panic message, which usually displays "System
  ERROR". The function that performs this task can now be user-defined.
  It is also run in user mode because the exception handler rte's into
  it, allowing it to execute any kind of interrupt-inducing task. The
  behavior is undefined if this function raises an exception.

* The second is an exception-catching function, which (when set) is
  called every time an exception occurs, and is granted the chance of
  handling the exception to continue execution normally. It can be used
  in various ways, the most primitive of which is recording the
  exception and going back. It runs in interrupt mode and must not raise
  any kind of exception.
2019-09-13 08:10:30 +02:00
Lephe
9a4ae4c80a
minor new definitions 2019-09-13 08:08:22 +02:00
Lephe
4a8ba82fab
truly support custom toolchains (almost) 2019-09-12 18:19:23 +02:00
Lephe
ef0e5e32f8
render: add one-parameter dvline() and dhline()
Behave like Basic's Horizontal and Vertical commands. Internal dline()
optimizations are renamed gint_dhline() and gint_dvline().

Also supports ghline() and gvline() in the gray engine.

Optimization cases here are amost negligible due to limiting RAM access
frequencies and the very limited amount of work accomplished in the
functions. Code maintainability is prioritized by using dline().
2019-09-07 11:26:11 +02:00
Lephe
61e68d01bb
expose more platform-agnostic code
May be useful later on for libraries such as libprof.
2019-09-06 12:16:31 +02:00
lephe
b9cba1d00a
style, formatting, font 2019-09-03 22:29:04 +02:00
lephe
e1aca8d89b
exc: add exception handlers, use them in the DMA
This change introduces exception handlers that default to a fatal error
with an on-screen description of the exception and some debugging
information.

It also adds the dprint() function as a definitely-needed helper and
removes bootlog_unmapped() by using the exception handler for the fatal
error display. (Also printf() is now required in all gint add-ins; this
is sad, but space is not as much of a constraint as debugging.)

Finally, the exception handler is used to handle an interrupt which is
an exception in practice, the DMA address error. On fx-CG 50, additional
DMA-related information is displayed on the screen. This is left out on
fx-9860G as there is not enough space.
2019-09-03 22:15:00 +02:00
lephe
6d54a5fe0a dma: add exception handler and dma_memset() 2019-08-27 21:18:44 +02:00
lephe
652637d475 bopti: add support for r5g6b5 and r5g6b5a on fxcg50
This commit introduces bopti for fxcg50 with the first basic 16-bit
formats. The performance is rather slow, especially for large images,
and will need refinements and/or overclock to be really efficient in
full-screen real-time applications.
2019-08-27 21:04:07 +02:00
lephe
62a49a543e topti: spacing bug fix on fxcg50
Fixes a bug where spaces were not being rendered.
2019-08-27 21:02:28 +02:00
lephe
b3cbb0a43f dma: add support for all six channels (merges #1) 2019-08-08 11:21:10 +02:00
lephe
ab0fa06a1d bopti: fix bug in non-zero stride renders
Forgot to take into account the number of layers in the input
stride. Anything after the first line would be pretty much
garbage.
2019-08-06 16:17:25 +02:00
lephe
2e17b77e56 bopti: first fxcg50 version with r5g6b5 and r5g6b5a
This commit introduces bopti for fx-CG 50. Currently the only
interfaces are the bopti_render_{clip,noclip} functions, and the
only supported formats are r5g6b5 and r5g6b5a.

The algorithm for r5g6b5 is optimized to perform longword accesses
using movua.l, whereas the algorithm for r5g6b5a uses plain word
accesses because transparency checks feel more difficult than one
more loop iteration.

These algorithms are still slow for large surfaces and struggle to
keep up 25 FPS in full-screen, so possible improvements with the
DMA should definitely be tested before restorting to overclock.
2019-08-04 13:59:35 +02:00
lephe
64dbe6021d some formatting and comment updates 2019-08-04 13:59:17 +02:00
Antoine
8cbd5be038 Ajout de la fonction srtcat et modification du 0 de la police de la Graph 90+E 2019-07-31 04:24:42 -04:00
lephe
62ae7e19d4 gray: considerably improve gray visuals 2019-07-29 12:17:25 -04:00
lephe
27f773ff7c bopti: account for layer count in initial offset 2019-07-29 08:58:58 -04:00
lephe
1cf5bf514a bopti: add gray support for all four profiles
This change finally introduces gray image rendering with bopti. This
is the final iteration of bopti v2 and certainly the fastest so far.
All four profiles are supported, without change to the format.
2019-07-27 19:51:53 -04:00
lephe
1906329552 topti: fix C_LIGHTEN and C_DARKEN
Light and dark were erroneously swapped in my documentation's
formulae, but not in the way operands were cancelled when x=0,
leading to strange results.
2019-07-27 19:49:39 -04:00
lephe
144ff90e37 gray: add gpixel() and gline()
Optimized cases for gline() rely on grect() instead of reimplementing
the mechanics of the fully-optimized drawing to save some space.
2019-07-27 19:48:36 -04:00
lephe
d7c33b12a5 topti: return previously-configured font in dfont() 2019-07-27 19:47:04 -04:00
lephe
ae4f7af172 gray: add engine, basic drawing and text
This revision includes the base gray engine with sensible starting
defaults, gclear() and grect(), as well as gtext().
2019-07-20 12:31:46 -04:00
lephe
705854da39 getkey: exclude other keys during a repetition
When a key is being held and repeated, ignore other key presses
until it is released. Without this, new keys would take priority.

This is the desired behavior because pressing other keys by
accident, especially on the directional pad, is common. Besdeis
this is the system's behavior.
2019-07-18 15:20:34 -04:00
lephe
1697998a9c tmu: improve code style and clear masks
Apparently there are some situations where the interrupt masks for
TMU0 are set in the system. They should obviously be cleared.
2019-07-18 15:19:29 -04:00
lephe
c80debacd7 keyboard stdio: some fixes 2019-07-17 19:29:12 -04:00
lephe
1685813078 libc: fix a pointer overflow in kprint
When the size of the input buffer is not specified, the default was
INT_MAX; however this will cause the pointer value to overflow in many
situations, causing kprint_flush() to flush prematurely and write NUL
bytes at inappropriate places.

This commit changes the default size to 65535. Morale: never use
sprintf() or vsprintf()...
2019-07-16 19:13:26 -04:00
lephe
ff2db385a8 TODO update and miscellaneous style 2019-07-16 18:34:10 -04:00
lephe
8dbdd32adb keyboard: finalize getkey() 2019-07-16 18:23:21 -04:00
lephe
2d7a6f154e libc: implement a compliant formatted printer
This is based on a port of kprint, which supports standard formats and
options, except for:

* Large parameters (ll)
* Floating-point types (%e, %E, %f, %F, %g, %G, %a, %A)
2019-07-16 16:14:13 -04:00
lephe
31ade70c42 tmu: export definitions, clean stop, expose address
This commit introduces three timer driver changes:

* Export the definitions of the timer structures to a detailed header at
  <gint/mpu/tmu.h>, and re-use them in the driver.
  This integration is still limited as the driver keeps its own address
  definitions and event codes.

* Clean the timer stop routine that is used in the interrupt handler. Up
  until now the interrupt handler would only stop TSTR, which is not
  enough to cleanly leave the timer (need TCOR=TCNT=-1) and is not even
  sound with respect to gint's semantics as UNIE stays enabled so the
  timer is not made available again.

  The interrupt handler now calls into C code when the timer stop
  condition is met (callback returns non-zero) to keep this clean. This
  unsurprisingly solves problems that occurred in certain situations
  when a timer was used repeatedly.

* Expose timer addresses using a timer_address() function, compensating
  for the lack of address definitions in <gint/mpu/tmu.h>. This
  interface is likely to evolve in the future to better integrate the
  address in the MPU headers and move them out of the driver.
2019-07-16 15:39:38 -04:00
lephe
7e09e37938 libc: implement malloc() etc. through syscalls
Currently only used by libprof itself.
2019-07-16 15:39:33 -04:00
lephe
24fbeab55b core: provide MPU type on unknown platforms
This makes it possible to write application code without specifying the
target machine, which is especially useful for libraries. The first user
of this system is libprof.
2019-07-16 15:39:33 -04:00
lephe
d9c32b2b05 libc: split standard headers properly
Since Memallox's newlib port is currently unstable, gint has to
provide some standard functions on its own. Instead of a single
<gint/std.h> header, this commit makes a gint/std directory containing
headers under standard names.
2019-07-16 15:38:18 -04:00
lephe
bbe51f9a34 r61524: stay compatible with sh3eb-elf 2019-07-13 11:45:21 -04:00
lephe
be415fb4b3 rename 'clock' module 'cpg' and move sleep_us() to tmu 2019-07-06 16:51:31 -04:00
lephe
3c7a8891d0 render: rename dimage_opt() into dsubimage() 2019-07-06 16:49:59 -04:00
lephe
eece35566e core: add BFile syscalls 2019-07-04 12:15:13 -04:00
lephe
3d362bb0bf defs: remove useless definitions 2019-07-04 12:15:00 -04:00
lephe
5a575a278f render: use shorter color names 2019-07-04 12:14:31 -04:00
lephe
bfbbc440fd bootlog: fill with spaces, not NULs 2019-07-04 12:13:31 -04:00
lephe
3324d58afa core: add a hardware detection interface 2019-07-04 12:11:43 -04:00
lephe
7798f276ae render-cg: make the 8x9 font the default 2019-07-04 11:49:15 -04:00