gint/src/core/syscalls.S
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

182 lines
3 KiB
ArmAsm

/*
** gint:core:syscalls - calls to CASIOWIN
**
** This file can be seen as a list of everywhere gint relies on the
** underlying OS. Although I wish to make gint free-standing, there are
** still a few hard questions, namely:
** * MMU management, because doing it wrong might break the calculator.
** * Dynamic allocation, because we can't trash the system heap.
** * File system, because it's a mess and we might ruin the ROM.
*/
.section .pretext
/* Dynamic allocation */
.global _malloc
.global _free
.global _calloc
.global _realloc
/* Bfile driver */
.global _BFile_Remove
.global _BFile_Create
.global _BFile_Open
.global _BFile_Close
.global _BFile_Size
.global _BFile_Write
.global _BFile_Read
.global _BFile_FindFirst
.global _BFile_FindNext
.global _BFile_FindClose
/* Return to menu */
.global ___Timer_Install
.global ___Timer_Start
.global ___Timer_Stop
.global ___Timer_Deinstall
.global ___PutKeyCode
.global ___GetKeyWait
.global ___ClearKeyBuffer
.global ___GetVRAMAddress
.global ___ConfigureStatusArea
#define syscall_(id, syscall_table) \
mov.l syscall_table, r2 ;\
mov.l 1f, r0 ;\
jmp @r2 ;\
nop ;\
.align 4 ;\
1: .long id
#define syscall(id) syscall_(id, syscall_table)
#ifdef FX9860G
/* Dynamic allocation */
_malloc:
syscall(0x0acd)
_free:
syscall(0x0acc)
_calloc:
syscall(0x0e6b)
_realloc:
syscall(0x0e6d)
/* BFile driver */
_BFile_Remove:
syscall(0x0439)
_BFile_Create:
syscall(0x0434)
_BFile_Open:
syscall(0x042c)
_BFile_Close:
syscall(0x042d)
_BFile_Size:
syscall(0x042f)
_BFile_Write:
syscall(0x0435)
_BFile_Read:
syscall(0x0432)
_BFile_FindFirst:
syscall(0x043b)
_BFile_FindNext:
syscall(0x043c)
_BFile_FindClose:
syscall(0x043d)
/* Return to menu */
___Timer_Install:
syscall(0x118)
___Timer_Start:
syscall(0x11a)
___Timer_Stop:
syscall(0x11b)
___Timer_Deinstall:
syscall(0x119)
___PutKeyCode:
syscall(0x248)
___GetKeyWait:
syscall(0x247)
___ClearKeyBuffer:
syscall(0x241)
___GetVRAMAddress:
syscall(0x135)
syscall_table:
.long 0x80010070
#endif /* FX9860G */
#ifdef FXCG50
/* Dynamic allocation */
.section .pretext
_malloc:
syscall(0x1f44)
_free:
syscall(0x1f42)
_calloc:
syscall(0x1f40)
_realloc:
syscall(0x1f46)
/* BFile driver */
_BFile_Remove:
mov #0, r5
syscall(0x1db4)
_BFile_Create:
syscall(0x1dae)
_BFile_Open:
mov #0, r6
syscall(0x1da3)
_BFile_Close:
syscall(0x1da4)
_BFile_Size:
syscall(0x1da6)
_BFile_Write:
syscall(0x1daf)
_BFile_Read:
syscall(0x1dac)
_BFile_FindFirst:
syscall(0x1db7)
_BFile_FindNext:
syscall(0x1db9)
_BFile_FindClose:
syscall(0x1dba)
/* Return to menu */
___Timer_Install:
syscall(0x8d9)
___Timer_Start:
syscall(0x8db)
___Timer_Stop:
syscall(0x8dc)
___Timer_Deinstall:
syscall(0x8da)
___PutKeyCode:
syscall(0x12c6)
___GetKeyWait:
syscall(0x12bf)
___ClearKeyBuffer:
syscall(0x12c7)
___GetVRAMAddress:
syscall(0x1e6)
___ConfigureStatusArea:
syscall(0x2b7)
.global ___SpecialMatrixCodeProcessing
___SpecialMatrixCodeProcessing:
syscall(0x1e60)
syscall_table:
.long 0x80020070
#endif /* FXCG50 */