Commit graph

369 commits

Author SHA1 Message Date
Lephe
4288dc27d9
keyboard: add custom repeat filters for full repeat control
This change introduces a new getkey_repeat_filter() function that can be
used to individually accept, deny or delay repeat events for specific
keys and timings.
2020-08-05 11:50:32 +02:00
Lephe
a4d23ef7ad
libc: faster memset 2020-07-28 17:34:25 +02:00
Lephe
492f61f7b2
libc: faster memcpy for on-chip memory
An optimization suggested by TSWilliamson, which pushes not only RAM,
but also on-chip memory and the CPU pipeline to their limits.
2020-07-27 22:47:30 +02:00
Lephe
7b4eb078c4
move src/core to src/kernel 2020-07-26 11:49:33 +02:00
Lephe
d887423bbb
bopti: more performance improvement for SCSP cases
* Turn on GCC's -O3 for bopti files
* Remove the bopti_render_noclip() step
* Use rbox as early as possible to avoid moving memory around
* A lot of local grinding
2020-07-23 14:03:45 +02:00
Lephe
11dd04243f
bopti: performance improvements for SCSP cases
* Defined the single-column single-position (SCSP) situation where a
  single column of the input is blit on a single position of the VRAM.
  Provided optimized assembly and a specialized bopti_render_scsp()
  function.
* Improved the rendered by reducing the amount of computation and
  clarifying the semantics of the rbox.
* Separated rbox setup from clipping by making bopti_render_clip() a
  purely abstract superset of bopti_render_noclip().
2020-07-23 10:18:46 +02:00
Lephe
39664e9bd2
bopti: fix bouding bugs in bopti_render_noclip()
These errors ironically made the noclip version slower than its
counterpart.
2020-07-21 08:54:34 +02:00
Lephe
4cb1555708
kernel: add an add-in restart mechanism using gint_osmenu()
This new mechanism allows an add-in to be restarted after exiting by
just never exiting in the first place, calling gint_osmenu() instead.
This makes sure that we can relaunch the add-in immediately, which is
normally possible through an option in the OS though no OS-independent
method of setting it is currently known.

Because this is gint_osmenu(), known pitfalls apply. On all platforms,
it is necessary to prepare the first frame before leaving. On fx-CG 50,
the inevitable display border is also there.
2020-07-20 20:37:34 +02:00
Lephe
6c535bf7df
cpg: add spread spectrum control
Disables spread spectrum by default so that the frequency estimations of
the CPG driver (notably used by the timer driver and libprof) are more
accurate.
2020-07-20 17:10:47 +02:00
Lephe
bf21246f13
kernel: mask interrupts during callbacks on fx-CG Manager
The fx-CG Manager holds but ignores the CPUOPM.INTMU bit, which means
that we have to mask interrupts as on SH3.
2020-07-20 16:44:27 +02:00
Lephe
0622928f22
rtc: robust interrupt handling and SH3 compatibility
This commit changes the interrupt handler arrangement to support the PRI
interrupt on SH3 (a gap is needed between 0xaa0 and its helper).

It also introduces the use of the _gint_inth_callback function for the
callback, which provides dynamic TLB during the interrupt, and revealed
a bug about IMASK not being set automatically on SH3.

Finally, it sets the interrupt settings of the RTC more conservatively,
by wiping RCR1 and the carry, alarm and periodic interrupt flags during
initialization and context restoration.
2020-07-19 20:06:50 +02:00
Lephe
a06213ca11
kernel: mask interrupts during callbacks on SH3!
This change fixes very weird bugs first observed with the RTC, related
to IMASK not being updated when an interrupt occurs to avoid
re-interruption.

On SH4 there is a CPUOPM setting that automatically sets IMASK to the
level of the accepted interrupt, which is so exactly what every kernel
needs that I can't figure out why this isn't the only behavior.

Turns out on SH3 it's not even an option. This commit sets IMASK to 15
when accepting a callback on SH3. This most notably prevents the gray
engine from updating the screen so callbacks need to be made very short.
2020-07-19 20:02:50 +02:00
Lephe
e617ea63bf
keyboard: add keycode functions to identify F1..F6 and 0..9 2020-07-16 17:29:12 +02:00
Lephe
5cac2cf7fc
rtc: take input similar to timer_setup() in rtc_timer_start() 2020-07-16 17:27:56 +02:00
Lephe
e16f3acfa1
topti: support Unicode fonts
This change adds UTF-8 decoding to dtext() to fully use Unicode fonts
provided by fxconv.
2020-07-14 15:28:46 +02:00
Lephe
e3042755d2
topti: support Unicode in the data structures (WIP)
This change modifies the font_t type to replace the concept of charset
with a more generic list of non-overlapping Unicode blocks defined by a
starting code point and a size.

It also takes advantage of the assembly feature of fxconv, introduced
for libimg long after the first version of topti, to support pointers in
the converted structure rather than having to tediously compute offsets
within a variable-size structure.
2020-07-14 12:11:12 +02:00
Lephe
77de9e7796
move private headers to subfolders of src/
This keeps the include/ folder clean.
2020-07-13 17:47:21 +02:00
Lephe
0eb58c39a3
gray: add the DGRAY_PUSH_ON/OFF and DGRAY_POP feature
DGRAY_PUSH_ON/OFF will push the current gray engine state to a stack
before transitioning to on/off mode. DGRAY_POP will later recover the
saved state and transition back to it.
2020-07-13 17:14:58 +02:00
Lephe
94fb300e72
gray: finalize the gray engine API
* Define dgray() to replace gray_start() and gray_stop()
* Introduce a mechanism to override the d*() functions rather than using
  another set of functions, namely g*(). Gray rendering should now be
  done with d*() (a compatibility macro for g*() is available until v2.1).
* Gray engine now reserves TMU0 at the start of the add-in to prevent
  surprises if timers are exhausted, so it nevers fails to start
* Replace other gray engine functions with dgray_*()
* More general rendering functions (in render/) to lessen the burden of
  porting them to the gray engine. As a consequence, dtext_opt(),
  dprint_opt() and drect_border() are now available in the gray engine,
  which was an omission from 230b796.
* Allow C_NONE in more functions, mainly on fx-CG 50
* Remove the now-unused dupdate_noint()
2020-07-13 13:49:07 +02:00
Lephe
411bbb9568
gray: use 923, 1742 as the default gray settings
Found by Kbd2.
2020-07-10 17:30:00 +02:00
Lephe
2751dcf045
remove the .gint.data section
Since both platforms now have their VBR and gint-specific data loaded
along the add-in's data, the .gint.data section is entirely unused.

The .gint.bss section is still used for uninitialized objects (it has
different semantics than .bss which is initially cleared) and the
.gint.data.sh3 and .gint.bss.sh3 sections that are dropped on the
SH4-only fx-CG 50 are also still used.
2020-07-10 16:36:05 +02:00
Lephe
ece65927f0
use less static RAM to improve SH3 support 2020-07-10 16:06:33 +02:00
Lephe
0aceb6f93e
kernel: compact VBR even more on SH3
This change moves interrupt handler from VBR + 0x640 to VBR + 0x200, in
the gap between the exception and TLB miss handlers.

This new scheme is not limited to VBR+0x200 .. VBR+0x400 as new large
block numbers can be used to jump over the TLB miss handler and the
interrupt handler entry points.
2020-07-10 13:07:12 +02:00
Lephe
2b1f408cb4
kernel: compact VBR scheme on SH3
I have recenty discovered that the so-called "rram" section used by gint
to store its VBR space and a couple memory structures gets overwritten
when returning to the main menu. It is thus necessary to get rid of it
and store that data somewhere else.

My current lead is to have it at the start of the static RAM by querying
its address in the TLB. However, the static RAM is very small on SH3
(8k) so the VBR must be made more compact.

This change elaborates the event code translation scheme used on SH3 to
emulate SH4 event codes. It is now used to translate the event codes to
a gint-specific VBR layout that leaves no gaps and thus reduces the size
of the VBR space. The gint_inthandler() method has to be modified for
every new SH3 interrupt to maintain this scheme.
2020-07-09 10:44:37 +02:00
Lephe
a99bffe7f4
iokbd keysc: space optimizations for SH3
* Reduce the keyboard queue size from 64 to 32, which is more than
  enough even for real-time games with multiple key presses.
* Pack the driver_event_t structure of the keyboard driver to make it 4
  bytes rather than 6 bytes. Combined with the previous item, this saves
  256 bytes off the BSS section (which is 3% of the SH3's static RAM).
* As part of a debugging attempt, updated the watchdog delay code in
  iokbd_delay() to make it usable in the current version of gint.
* Restored port registers more aggressively in iokbd_row().
2020-07-08 20:01:58 +02:00
Lephe
03715344a4
tmu: safer restore order
The previous setup made it possible for TCNT to underflow to an
uncontroller value of TCOR during the restore.
2020-07-08 19:49:09 +02:00
Lephe
e2886d2bd7
kernel: fix trying to set CPUOPM on SH3
Results in an Illegal Instruction no the ICBI that follows the value
change.
2020-07-04 15:16:39 +02:00
Lephe
9d1187b5b4
string: optimized memcpy, memcmp, memset; decent memmove
This change adds optimized versions of the core memory functions,
relying on 4-alignment, 2-alignment, and the SH4's unaligned move
instruction to (hopefully) attain good performance in all situations.
2020-07-04 15:05:28 +02:00
Lephe
7d63a1b536
r61524 render-cg: support Prizm and fx-CG Manager
This change adds a new HWCALC model, HWCALC_FXCG_MANAGER, which
identifies Casio's official fx-CG Manager software. Both the Prizm and,
to my surprise, the fx-CG Manager use the old RAM address of 88000000
(P1) and a8000000 (P2) instead of the new fx-CG 50 address of 8c000000
(P1) and ac000000 (P2).

The VRAM is hence adjusted at startup to move hardcoded pointers into
the proper space. Added to the kernel moving the VBR space dynamically
on the Prizm, this allows gint to be fully compatible with these
platforms.

The fx-CG Manager is detected by its product ID made of 0xff.

Also adds a proper interface to the R61524 driver, even though it's not
any more complete than previously, and fixes an oversight where the
HWURAM entry of the kernel data array was no longer computed since the
TLB management change.

As of now, the fx-CG Manager still has a bug regarding return-to-menu
since returning from the main menu doesn't work very well and often
loops. This has been seen occasionally on some Graph 90+E so it's
unlikely to be a platform-specific problem.
2020-07-02 15:48:19 +02:00
Lephe
ed30b2cb21
render-cg: allow VRAM in user stack
This is currently unused and has some artifacts in gintctl for reasons I
haven't understood yet. Will have to investigate later.
2020-07-02 15:47:11 +02:00
Lephe
dc83d5ee1f
timer: final iteration on the API
This commit minimally changes the signature of timer_setup() to greatly
simplify timer management, allowing to user to let the library choose
available timers dynamically depending on the settings.
2020-06-20 22:45:46 +02:00
Lephe
a91a0a483b
core: remove some useless hardware info 2020-06-20 19:23:50 +02:00
Lephe
4a0fc65c34
gray: add decent defaults for older fx9860g-like models
Gray quality is better on the Graph 35+E II, it still flickers a lot on
other models (as I remembered). There might be better settings out there
but I'm not sure we can reach the quality of the current Graph 35+E II
defaults. The Graph 75+E with which I tested might also be different
from other T6K11 such as the smaller Graph 35+E.
2020-06-20 19:16:42 +02:00
Lephe
1c7b1350b4
general cleanup of the kernel
* Removed .pretext sections since the TLB is now entirely dynamic; left
  only .text.entry for the start symbol.
* Reworked the main files of src/core to move the INTC to its own driver
  and let the kernel handle only VBR space and CPU (now: VBR & CPUOPM).
* Moved src/core/gint.c to src/core/kernel.c and centralized all driver
  loops that save or restore context for more robustness. This leaves
  the callbacks of cpu_setVBR() (formerly gint_setvbr()) pretty short.
* Coalesced gint_switch_out() and gint_switch_in() into a single
  function callback for cpu_setVBR().
* Added an abstraction of interrupt signals as an enumerated value so
  that drivers no longer hardcode the IPR and IMR numbers and bits,
  sometimes even with isSH3() due to differences in the SH7705.
* Changed the interrupt blocking method in cpu_setVBR() from SR.BL=1 to
  SR.IMASK=15 so that TLB misses are still handled. This removes the
  need for callback functions to be GMAPPED.
* Moved gint_osmenu() and its utilities to a new file src/core/osmenu.c.
2020-06-20 17:18:51 +02:00
Lephe
b7de559b78
some cleanup in src/core and in the repository 2020-06-20 11:41:13 +02:00
Lephe
de4881244e
core: remove bootlog
An unused logging mechanism that was never really fit for its task of
diagnosing boot issues. Disappears with cleanup...
2020-06-20 09:46:39 +02:00
Lephe
9cf2f9fe97
core tmu: improve reliability of interrupt handlers
This change includes three reliability improvements in handlers:

1. TMU handlers now actively check for the UNF flag to go low rather
   than expecting it to do so right away.
2. CPUOPM.INTMU is now set so that IMASK it updated at every interrupt
   (which is absolutely required for nested interrupts!).
3. gint_inth_callback() no longer performs transfers between user bank
   and kernel bank while in user bank, because this is when interrupts
   are enabled and thus likely to corrupt the kernel bank; rather, it
   now does it while in kernel bank with interrupts disabled.
2020-06-20 09:32:48 +02:00
Lephe
91fd2e5e6a
core: fix erroneous VBR address choice in gint_switch()
This one never worked even by accident, it just went untested for a
couple hours.
2020-06-18 22:12:08 +02:00
Lephe
bf2d407f1d
tmu: fix dreadful omission of timer ID in ETMU handler
This change fixes a never-should-have-worked problem where the ETMU
interrupt handler loses track of the timer ID before attempting to call
timer_stop(), resulting in complete nonsense.

And also a similar problem in timer_wait().
2020-06-18 20:20:55 +02:00
Lephe
230b796196
render: add alignment options to dtext_opt() and dprint_opt()
This change introduces two new functions dtext_opt() and dprint_opt()
that have both color and alignment options. The regular dtext() and
dprint() have been changed to always used bg=C_NONE which is what most
calls want.
2020-06-18 18:31:13 +02:00
Lephe
06345967fd
render: add a drect_border() function 2020-06-18 17:50:27 +02:00
Lephe
4a3c396284
fxcg50: remove rram region and fxcg20-friendly VBR address
This change removes the RRAM region which was inherited from the fx9860g
memory layout but no longer relevant on fxcg50. This removed one
occurrence of a hardcoded user stack address in the linker script, the
other being the VBR address. But since the VBR only contains
position-independent code that is manually "relocated" at startup, the
linker script needs not actually use its value, so this is not a true
dependency.

gint should now more or less be able to boot up on an fxcg20, except for
the hardcoded VRAM addresses which need to be moved to the fxcg20 system
stack.
2020-06-18 09:59:31 +02:00
Lephe
2fd4238d31
core: finalize TLB management in timer callbacks (STABLE)
This change enables interrupts within timer callbacks, making it
possible to load pages to MMU while handling a timer underflow. The call
to TLB_LoadPTEH() has been moved directly into the VBR handler to avoid
jumping to ILRAM for a short call on SH4.

The TMU and ETMU handlers have been changed to callback through a new
function gint_inth_callback() that saves the user bank and a few
registers, then invokes the callback with interrupts enabled and in user
bank; until now, callbacks were invoked with interrupts disabled and in
kernel bank. Note that IMASK is still set so a callback can only be
interrupted by a high-priority interrupt.

A timer_wait() function has also been added to simplify tests that
involve timers. Finally, the priority level of the TMU0 underflow
interrupt has been set to 13 (as per the comments) instead of 7.

This version is the first stable version that handles TLB misses
transparently for large add-ins. It is suitable for every gint
application.
2020-06-17 11:43:26 +02:00
Lephe
8148d89c88
core: backport TLB handling to fx9860g, fix return-to-menu (UNSTABLE)
This change ports the TLB management system to fx9860g through %003.
This raises the size limit for add-ins to about 500k.

Because SH3 fx9860g does not have ILRAM, the GMAPPED attribute has been
made to generate content to a .gint.mapped section which is sent to the
P1 RAM section historically dubbed "real ram" in which gint's data and
VBR are installed. (Now that I think about it, gint's data should try to
go to normal RAM instead to reduce pressure on this invasion.)

Return-to-menu was also fixed on both platforms by narrowing down the
need for code to remain mapped to the chance of running it with
interrupts disabled. The natural distribution of GMAPPED under this
criterion showed that _gint_setvbr had been left under TLB control;
moving it to the proper RAM area fixed gint switches.

Finally, an omission in the bound checks for mappable TEA addresses (TEA
>= 0x00300000) prevented the appearance of a non-interactible System
ERROR popup when some unmapped addresses are accessed.

This version still does not enable interrupts in timer callbacks,
exposing any application to a crash if a timer underflows while its
callback is not mapped. It is not suitable for any stable application!
2020-06-15 20:55:18 +02:00
Lephe
fbfcdd7664
render-fx: fix VRAM overflows in gint_dhline() and gint_dvline()
Similar to 610362f.
2020-06-15 13:45:50 +02:00
Lephe
d8886c7dbf
core: answer TLB misses and remove startup mapping (UNSTABLE)
This change adds a TLB miss handler that calls __TLB_LoadPTEH() and
removes the startu mapping of add-in pages in the explore() routine of
src/core/start.c.

Note that calling __TLB_LoadPTEH() manually might unexpectedly lead to a
TLB multihit problem as the requested page might be accidentally loaded
by a TLB miss in the code that loads it. A TLB multihit is a platform
reset, so this function should always be considered unsafe to call
(unless the calling code is in a combination of P1 space and ILRAM).

This change also moves a lot of functions out of the .pretext section,
notably topti, as this was designed to allow panic messages when the
add-in couldn't be mapped entirely. By contrast, a GMAPPED macro has
been defined to mark crucial kernel code and data that must remain
mapped at all times. This currently puts the data in ILRAM because
static RAM is not executable. An alternative will have to be found for
SH3-based fx9860g machines.

This version still does not allow TLB misses in timer callbacks and
breaks return-to-menu in a severe way! It is not suitable for any
stable application!
2020-06-14 18:22:20 +02:00
Lephe
4ad2110efc
core: accept large add-ins and setup TLB management (UNSTABLE)
This change modifies the fx-CG 50 linker script to allow add-ins up to
2M and no longer complains about add-ins that don't fit in the TLB.

It also exposes the __TLB_LoadPTEH() syscall (%003 on fx9860g, %00c on
fxcg50) that answers TLB misses. This syscall can be called manually
from an add-in to load some pages and seems to work without problem.

However, this version does not provide any automatic TLB management,
some key areas of the kernel are still under TLB and some user code
(such as timer callbacks) is not! This version is suitable only for
add-ins smaller than 220k!
2020-06-14 11:01:27 +02:00
Lephe
41294ec0a4
printf: fix %% doubling down as a format specifier
When parsing a %% format, the second % character was mistakenly not
skipped over after emitting a '%' output; this resulted in it being
treated as a format specifier. For instance,

  printf("%%d", 12);

would print "%12".
2020-06-14 08:15:00 +02:00
Lephe
610362f8c9
render-cg: fix potential VRAM overflow in gint_dhline()
A missing coordinate check in gint_dhline() would allow lines entirely
out of bounds of the screen to write pixels outside of their expected
range, often wrapping up to the next line, but possibly overflowing from
VRAM.
2020-06-13 20:41:13 +02:00
Lephe
caa4f675c9
bopti: deprecate image_t, renamed to bopti_image_t 2020-06-01 12:11:59 +02:00
Lephe
0498344349
periodic check of SH3 compatibility 2020-05-31 22:26:30 +02:00
Lephe
50cc536324
libc: add random number generation with TinyMT
TinyMT is licensed under its own terms. See src/std/tinymt/LICENSE.txt.
2020-05-31 17:03:14 +02:00
Lephe
5ff1662e61
bfile: solve stability issues on fx9860g and fxcg50
This commit improves the stability of gint_switch() in two ways:

1. Wait for hardware availability every time driver contexts are saved
   or reloaded; this solves crashes due to DMA use when gint takes
   control after a BFile call, since BFile_Create() (and possibly
   BFile_Write()) leave the DMA running after returning.

2. Remap the add-in after a switch, as apparently calling BFile
   functions causes some pages to be evicted. This is more noticeable on
   fxcg50 when the size of add-ins nears 220k.

Additionally, dma_transfer_wait() has been updated to not sleep() unless
it is certain that the conditions for wakeup are fulfilled, as this
would sometimes freeze.
2020-05-31 15:52:00 +02:00
Lephe
4036a583df
bfile: add BFile syscalls on fx-CG 50 (still unstable)
For some reason these syscalls tend to crash in a basic delete, create,
open, write, close workflow (after the write is finished). I'll look
into using the new gint/fxlib switch to use them safely.
2020-05-16 17:11:55 +02:00
Lephe
15dd4990dd
core: add return-to-menu on Graph 90+E (looks bad though)
This is a first version of gint_osmenu() on Graph 90+E. It works on the
same basis as the mono version, with the caveat that the automatic VRAM
display done by the system is terrible because of the reduced resolution
and status bar. Disabling any of this requires taking back control
earlier, which would make the whole GetKeyWait() method obsolete.

Tried the special key processing syscall, but it crashes upon return in
the add-in even before the fxlib code finishes. Maybe try later.
2020-05-16 12:14:13 +02:00
Lephe
e217309adf
render-cg: expose vram buffers with dgetvram() and dsetvram() 2020-05-10 23:03:02 +02:00
Lephe
d3c43c3ecd
dma: do not wait before initialization
Hangs if the add-in is started first on a fresh boot, probably because
the OS doesn't bother initializing all the channels of its hardware.
2020-05-10 23:00:42 +02:00
Lephe
85311a0b31
drivers: update the model, replacing unload() with wait()
The unload() function is not very relevant for drivers because hardware
state is managed by ctx_save() and ctx_restore() and software state is
managed by underlying drivers when there are dependencies.

For now, it's been replaced with a wait() function that allows drivers
to not be interrupted at any point. It is currently used by the DMA to
wait for ongoing transfers to finish before disabling interrupts (which
would prevent the transfer end from being detected) and switching in and
out of gint.
2020-05-10 16:36:21 +02:00
Lephe
4485e7f865
core, tmu: add gint_switch(), return to menu, and improve timer code
* Add the gint_switch() function which executes user-provided code from
  the system (CASIOWIN) context.
* Added interrupt masks to the core context (should have been there long
  ago).
* Added the gint_osmenu() function that switches out of gint to invoke
  GetKeyWait() and inject KEY_CTRL_MENU to trigger the main menu. This
  uses many CASIOWIN syscalls, but we don't care because gint is unloaded.
  Trickery is used to catch the key following the return in the add-in
  and/or display a new application frame before GetKeyWait() even finishes
  after coming back. This is only available on fx9860g for now.
* Removed any public syscall definition to clear up interfaces.
* Patched the DMA interruption problem in a weird way on fxcg50, a
  driver function will be used to do that properly eventually.
* Changed the driver model to save driver contexts in preallocated
  spaces instead of on the stack for overall less risk.
* Enabled return-to-menu with the MENU key on fx9860g in getkey().
* Changed the keyboard driver to emit releases before presses, as a
  return-to-menu acts as a press+release of different keys in a single
  driver frame, which confuses getkey().
* Fixed a really stupid bug in memcpy() that made the function really
  not work.

Improvements in the timer driver:

* Expose ETMU modules as SH7705_TMU and SH7305_TMU in <gint/mpu/tmu.h>.
* Remove the timer_t structures, using SH*_ETMU and SH*_TMU instead.
  Only interrupt gate entries are left hardcoded.
* Discovered that not only every write to the TCNT or TCR of an ETMU
  takes about 1/32k of a second (hinting at registers being powered by
  the same clock as the timer), but every write occuring while a previous
  write is pending is *lost*. This led to terrible bugs when switching
  ETMU contexts too fast in gint_switch().
* Removed an internal timer_address() function.
* Overall simplified the handling of timers and the initialization step.
2020-05-10 14:03:41 +02:00
Lephe
2cdf925f94
interrupts: save caller-saved registers in main handler
This is an obvious requirement for the interrupt routine, which was
forgotten and only surfaced when I used a timer callback started with
multiplications in an innocent add-in. r0..r7 are saved automatically,
which leaves pr, gbr, mach et macl susceptible to corruption by the
interrupt handler.
2020-05-06 20:45:35 +02:00
Lephe
61da7debc8
code review and display driver changes
t6k11: use the gint array for variant detection
r61524: use true triple buffering by default
display: define DWIDTH and DHEIGHT
display: add C_RGB(r,g,b) (0 ≤ r,g,b ≤ 31) [fxcg50]
2020-02-23 16:05:25 +01:00
Lephe
b6f545e63c
getkey: gracefully take command after other keyboard primitives 2020-02-20 21:09:39 +01:00
Lephe
d655aa934f
core: slightly better integration of BFile calls 2020-02-19 23:09:06 +01:00
Alice
32aef78600 core: add BFile_FindFirst, Next and Close syscalls
The return code -1 noted in the BFile_FindFirst or BFile_FindNext is
from test,  which mean it could be possibles that they are negative
error code from functions failing and not meaning that no file have been
found, to be sure, the value IML_FILEERR_ENUMERATEEND from filebios.h in
the fxlib need to be checked (and maybe defined in gint with a more
meaningful name for user interactivity)
2020-01-13 23:14:30 +01:00
Alice
07e2de981a core: add BFile_Size syscall 2020-01-13 15:44:04 +01:00
Lephe
3147045196
bopti-cg: add p8, p4, and fix alignment issues on r5g6b5 2019-11-15 13:31:44 +01:00
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
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
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
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
lephe
f8d69dd56a display: add a dupdate_noint() for exceptions handlers 2019-07-04 11:46:26 -04:00
lephe
11b40b445c render-cg: 8x9 font and proportional font rendering 2019-06-23 17:27:44 -04:00
lephe
0055199359 render: refactor to share functions, and basic text on fxcg50 2019-06-15 01:05:31 -04:00
lephe
81baa4c26a bopti: expose bopti functions and implement dimage() and dimage_opt() 2019-05-04 21:00:40 +02:00
lephe
9b24267488 topic: return to the 5x7 font as default
The 5x6 font is less readable than I hoped, so too bad.
2019-05-04 19:27:52 +02:00
lephe
19cdae4953 core: expose the syscall header
Will be used in time for BFile.
2019-05-04 14:59:13 +02:00
lephe
05f2e01b50 bootlog: make a copy for use in gintctl 2019-05-04 12:07:14 +02:00
lephe
37e07dabcc t6k11: quick-and-dirty support for Graph 35+E II 2019-05-03 17:12:41 +02:00
lephe
8e0d2eb783 fix: various omissions 2019-05-03 17:12:22 +02:00
lephe
f3c8964b84 render-cg: decently implement basic functions 2019-05-03 17:11:43 +02:00
lephe
04231ea5d6 dma: add a new driver to support r61524
Also add a power interface (without driving code) and switch toolchain
because the previous sh4eb-nofpu-elf toolchain was not completely
FPU-free.
2019-03-10 15:45:34 +01:00
lephe
f33cb3cf80 core: better bootlog API and implementation
* Now uses topti instead of fxlib for text (including MMU failure)
* Fit .pretext into 4k for everything before MMU succeeds
* A short version of sprintf() for dynamic messages
* Support a driver function, status(), to allow early driver debug
* Expose more useful platform information in <gint/mpu.h>
* Expose the first of a few CASIOWIN syscalls
2019-03-06 14:32:51 +01:00
lephe
417340ce91 topti: implement background color and text size
Also transition the bootlog from fxlib to topti.
2019-02-22 15:08:51 +01:00
lephe
3f7c0a04ad way too much, including bopti/topti, timers, and more. 2019-02-21 21:00:26 +01:00
lephe
298338f633 More timers, RTC, basic overclock-resistant keyboard, CPG, PFC, driver levels. 2018-08-19 17:11:37 +02:00
lephe
2f0e049c33 More interrupt system, exceptions, timers. 2018-08-01 20:41:36 +02:00
lephe
3b90b40dd7 Hybrid build system and runtime (no interrupts). t6k11 driver. Basic r61524 driver. 2018-04-19 13:24:26 +02:00
lephe
c50cbf6a9c Make room for an fx-cg50 compatible version. Enhanced build system. 2018-04-09 08:31:12 +02:00
lephe
79b78b5345 Hopefully the last adjustments before the first release. 2017-07-11 13:51:56 +02:00
lephe
34e42a03a6 Small Makefile adjustments, preparing fusion with fxSDK 2017-07-08 17:22:42 +02:00
lephe
f6133c26fc Startup logs instead of diagnostics, created .gint_bss, updated demo. 2017-07-05 21:38:12 +02:00
lephe
5e66efc560 Interrupt controller module description (WIP), task switch and return to menu. 2017-07-01 16:07:14 +02:00
lephe
cd6bd5a1a4 Untested INTC module in /include/modules/interrupts.h 2017-04-30 18:24:35 +02:00
lephe
a0f06fadd7 Interrupt Controller module draft, bopti bugfix. 2017-04-22 21:59:39 +02:00
lephe
3214f6b797 Almost ended quality review, and fixed tales-related vram overflows. 2017-04-19 19:57:31 +02:00
lephe
6c0ae34708 Added a text_length() function. 2017-04-17 13:39:28 +02:00
lephe
34588147d8 Erf. 2017-04-17 13:05:46 +02:00
lephe
b15d543e8d Just a hotfix for dimage()... fxSDK's a bit late... 2017-04-17 12:56:27 +02:00
lephe
57a7e1c2d4 More quality review, more registers saved at startup. 2017-04-13 21:59:13 +02:00
lephe
a6e312a39c Some quality review. Made keyboard time milliseconds. 2017-03-26 18:38:32 +02:00
lephe
31e2b453dd Redesigned timer module: got a possibly infinite amount of virtual timers. 2017-03-01 11:07:28 +01:00
lephe
7ab6170ca3 Key repeat events & Timer callbacks with arguments. Fixed sleep_us(). 2017-02-25 23:19:35 +01:00
lephe
d852bc3310 Huh... debug app for crashes & whole new interrupt system. Minor edits. 2017-02-25 19:02:07 +01:00
lephe
49df2a5fb4 Added a --extended-libc option and some headers to allow porting external programs. 2017-01-22 18:35:02 +01:00
lephe
93dca0ef6f Made INCOMPATIBLE changes to image rendering. Added inttypes.h and bakclight management in getkey(). 2017-01-20 21:11:00 +01:00
lephe
28f790bade Fixed some font formats. Minor changes in README, headers. 2017-01-01 17:41:16 +01:00
lephe
9a3433c52a Fixed left-side vram overflow with text, made install automatically along fxSDK. 2016-12-22 23:08:44 +01:00
lephe
2564096a13 Added natural delay/frequency settings for timers. 2016-12-22 19:47:05 +01:00
lephe
e6e0989436 Solved backlight issues and added backlight control to the API. 2016-12-22 18:36:39 +01:00
lephe
eedec2b124 Added a configure script with some options, made Makefile output pretty. Set up an event system (used by keyboard). 2016-11-05 22:00:23 +01:00
lephe
98fdbbc333 Proper RTC callback system. Moved keyboard to RTC (saves a timer). Reduced use of 7705.h / 7305.h. 2016-09-04 11:35:41 +02:00
lephe
d80de5683b Added clock frequency computations/measurements, and frequency-delay/timer expression. 2016-08-29 11:29:07 +02:00
lephe
0205c39f21 Fixed area functions (rectangles completely outside the screen). 2016-08-14 19:57:58 +02:00
lephe
58db663ae6 Some time manipulation. Added the targets to the .gitignore file. 2016-08-08 15:01:33 +02:00
lephe
1f223f807f Added an RTC test (clock), image part drawing and a few standard functions (stdlib, time). 2016-08-02 07:51:44 +02:00
lephe
c63d7b812e Added bitmap part rendering and text colors, proper gray text. Enhanced demo app (wip). 2016-07-28 18:12:07 +02:00
lephe
b2151886bc Added formatted printing for stdio: handles everything except doubles and %m. 2016-07-25 22:38:47 +02:00
lephe
7f174043a5 Reported TLB issues. Moved internal headers files, added rtc module and alloca. 2016-07-25 09:04:22 +02:00
lephe
34dd27d7a3 Major bopti update (one of the last, I hope). Added comparison with ML as fifth application (hidden). 2016-07-14 21:10:51 +02:00
lephe
d122624c56 Re-structured files. Minor name changes. No code changed in this falsely huge commit. 2016-07-06 11:28:51 +02:00
lephe
ab17532f67 Major update for bopti (gray, light still not tested). Reworked out gray engine. 2016-07-04 18:30:25 +02:00
lephe
aa0f4b7285 First gray tests. Added text module, 'tales'. 2016-05-20 22:04:15 +02:00
lephe
f27ba1129a Finished rewriting bopti, except for Checker. Removed .gitlab-ci.yml because of non-successful runner tests. 2016-05-07 12:10:47 +02:00
lephe
13aad50ab7 Began to re-write bopti. Bitmap tests changed. Added a continuous integration file. 2016-05-06 20:47:15 +02:00
lephe
e1a51dae21 Displayed keyboard state in test [1]. Implemented some API for user RTC interrupt management. 2016-05-05 22:33:15 +02:00
lephe
9725c2819a Moved the keyboard to timers. Minor changes in multigetkey() to avoid unwanted event repeats. Beginning of a test application. 2016-05-05 18:19:10 +02:00
lephe
0a7f22d4c1 Initial commit. Includes interrupt handler, drivers for keyboard and screen, and parts of the drawing library. 2016-05-05 11:49:05 +02:00