diff options
Diffstat (limited to 'libgloss/m68k/atari/atari-traps.c')
-rw-r--r-- | libgloss/m68k/atari/atari-traps.c | 311 |
1 files changed, 311 insertions, 0 deletions
diff --git a/libgloss/m68k/atari/atari-traps.c b/libgloss/m68k/atari/atari-traps.c new file mode 100644 index 0000000..c387ff1 --- /dev/null +++ b/libgloss/m68k/atari/atari-traps.c @@ -0,0 +1,311 @@ +/* + Copyright (C) 2025 Mikael Hildenborg + SPDX-License-Identifier: BSD-2-Clause +*/ + +#include "atari-traps.h" + +// Store stack pointer in a3, that by Atari documentation will be left untouched by the trap call. +#define TRAP_BEGIN "move.l %%a7, %%a3\n\t" +// Make trap call and then restore the stack pointer from the stored value in a3 +#define TRAP_FUNC(num, func) "move.w #" #func ", %%a7@-\n\ttrap #" #num "\n\tmove.l %%a3, %%a7\n\t" +// Registers d1,d2 and a0, a1, a2 may be affected by trap #1 calls. Register a3 is used to store/restore a7 +#define CLOBBER_REG "d1", "d2", "a0", "a1", "a2", "a3" + +unsigned int trap1_e(unsigned short bios_drive) +{ + register unsigned int bios_mounted_drives asm ("d0") = 0; + __asm__ volatile ( + TRAP_BEGIN + "move.w %1, %%a7@-\n\t" + TRAP_FUNC(1, 0xe) + : "=r" (bios_mounted_drives) + : "r" (bios_drive) + : CLOBBER_REG); + return bios_mounted_drives; +} + +unsigned short trap1_19(void) +{ + register unsigned short bios_drive asm ("d0") = 0; + __asm__ volatile ( + TRAP_BEGIN + TRAP_FUNC(1, 0x19) + : "=r" (bios_drive) + : + : CLOBBER_REG); + return bios_drive; +} + +unsigned short trap1_2a(void) +{ + register unsigned short date asm ("d0") = 0; + __asm__ volatile ( + TRAP_BEGIN + TRAP_FUNC(1, 0x2a) + : "=r" (date) + : + : CLOBBER_REG); + return date; +} + +int trap1_2b(unsigned short date) +{ + register int result asm ("d0") = -1; + __asm__ volatile ( + TRAP_BEGIN + "move.w %1, %%a7@-\n\t" + TRAP_FUNC(1, 0x2b) + : "=r" (result) + :"r" (date) + : CLOBBER_REG); + return result; +} + +unsigned short trap1_2c(void) +{ + register unsigned short time asm ("d0") = 0; + __asm__ volatile ( + TRAP_BEGIN + TRAP_FUNC(1, 0x2c) + : "=r" (time) + : + : CLOBBER_REG); + return time; +} + +int trap1_2d(unsigned short time) +{ + register int result asm ("d0") = -1; + __asm__ volatile ( + TRAP_BEGIN + "move.w %1, %%a7@-\n\t" + TRAP_FUNC(1, 0x2d) + : "=r" (result) + :"r" (time) + : CLOBBER_REG); + return result; +} + + +struct DTA* trap1_2f(unsigned short bios_handle) +{ + register struct DTA* result asm ("d0") = (struct DTA*)-1; + __asm__ volatile ( + TRAP_BEGIN + "move.w %1, %%a7@-\n\t" + TRAP_FUNC(1, 0x2f) + : "=r" (result) + : "r" (bios_handle) + : CLOBBER_REG); + return result; +} + + +int trap1_39(const char* bios_path) +{ + register int result asm ("d0") = -1; + __asm__ volatile ( + TRAP_BEGIN + "move.l %1, %%a7@-\n\t" + TRAP_FUNC(1, 0x39) + : "=r" (result) + : "r" (bios_path) + : CLOBBER_REG); + return result; +} + +int trap1_3a(const char* bios_path) +{ + register int result asm ("d0") = -1; + __asm__ volatile ( + TRAP_BEGIN + "move.l %1, %%a7@-\n\t" + TRAP_FUNC(1, 0x3a) + : "=r" (result) + : "r" (bios_path) + : CLOBBER_REG); + return result; +} + +int trap1_3b(const char* bios_path) +{ + register int result asm ("d0") = -1; + __asm__ volatile ( + TRAP_BEGIN + "move.l %1, %%a7@-\n\t" + TRAP_FUNC(1, 0x3b) + : "=r" (result) + : "r" (bios_path) + : CLOBBER_REG); + return result; +} + +int trap1_3c(const char* bios_path, unsigned short bios_attrib) +{ + register int bios_handle asm ("d0") = -1; + __asm__ volatile ( + TRAP_BEGIN + "move.w %2, %%a7@-\n\t" + "move.l %1, %%a7@-\n\t" + TRAP_FUNC(1, 0x3c) + : "=r" (bios_handle) + : "r" (bios_path), "r" (bios_attrib) + : CLOBBER_REG); + return bios_handle; +} + +int trap1_3d(const char* bios_path, unsigned short bios_mode) +{ + register int bios_handle asm ("d0") = -1; + __asm__ volatile ( + TRAP_BEGIN + "move.w %2, %%a7@-\n\t" + "move.l %1, %%a7@-\n\t" + TRAP_FUNC(1, 0x3d) + : "=r" (bios_handle) + : "r" (bios_path), "r" (bios_mode) + : CLOBBER_REG); + return bios_handle; +} + +int trap1_3e(unsigned short bios_handle) +{ + register int result asm ("d0") = -1; + __asm__ volatile ( + TRAP_BEGIN + "move.w %1, %%a7@-\n\t" + TRAP_FUNC(1, 0x3e) + : "=r" (result) + : "r" (bios_handle) + : CLOBBER_REG); + return result; +} + +int trap1_3f(unsigned short bios_handle, int length, void* buf) +{ + register int result asm ("d0") = -1; + __asm__ volatile ( + TRAP_BEGIN + "move.l %3, %%a7@-\n\t" + "move.l %2, %%a7@-\n\t" + "move.w %1, %%a7@-\n\t" + TRAP_FUNC(1, 0x3f) + : "=r" (result) + : "r" (bios_handle), "r" (length), "r" (buf) + : CLOBBER_REG); + return result; +} + +int trap1_40(unsigned short bios_handle, int length, const void* buf) +{ + register int result asm ("d0") = -1; + __asm__ volatile ( + TRAP_BEGIN + "move.l %3, %%a7@-\n\t" + "move.l %2, %%a7@-\n\t" + "move.w %1, %%a7@-\n\t" + TRAP_FUNC(1, 0x40) + : "=r" (result) + : "r" (bios_handle), "r" (length), "r" (buf) + : CLOBBER_REG); + return result; +} + +int trap1_41(const char* bios_path) +{ + register int result asm ("d0") = -1; + __asm__ volatile ( + TRAP_BEGIN + "move.l %1, %%a7@-\n\t" + TRAP_FUNC(1, 0x41) + : "=r" (result) + : "r" (bios_path) + : CLOBBER_REG); + return result; +} + +int trap1_42(unsigned int file_position, unsigned short bios_handle, unsigned short bios_mode) +{ + register int new_position asm ("d0") = -1; + __asm__ volatile ( + TRAP_BEGIN + "move.w %3, %%a7@-\n\t" + "move.w %2, %%a7@-\n\t" + "move.l %1, %%a7@-\n\t" + TRAP_FUNC(1, 0x42) + : "=r" (new_position) + : "r" (file_position), "r" (bios_handle), "r" (bios_mode) + : CLOBBER_REG); + return new_position; +} + +int trap1_47(char* buf, unsigned short bios_drive) +{ + register int result asm ("d0") = -1; + __asm__ volatile ( + TRAP_BEGIN + "move.w %2, %%a7@-\n\t" + "move.l %1, %%a7@-\n\t" + TRAP_FUNC(1, 0x47) + : "=r" (result) + : "r" (buf), "r" (bios_drive) + : CLOBBER_REG); + return result; +} + +int trap1_4b(unsigned short mode, const char* file_name, const char* cmdline, const char* envstring) +{ + register int result asm ("d0") = -1; + __asm__ volatile ( + TRAP_BEGIN + "move.l %4, %%a7@-\n\t" + "move.l %3, %%a7@-\n\t" + "move.l %2, %%a7@-\n\t" + "move.w %1, %%a7@-\n\t" + TRAP_FUNC(1, 0x4b) + : "=r" (result) + : "r" (mode), "r" (file_name), "r" (cmdline), "r" (envstring) + : CLOBBER_REG); + return result; +} + +int trap1_56(const char* oldname, const char* newname) +{ + register int result asm ("d0") = -1; + __asm__ volatile ( + TRAP_BEGIN + "move.l %2, %%a7@-\n\t" + "move.l %1, %%a7@-\n\t" + "move.w #0, %%a7@-\n\t" + TRAP_FUNC(1, 0x56) + : "=r" (result) + : "r" (oldname), "r" (newname) + : CLOBBER_REG); + return result; +} + +unsigned int trap14_11(void) +{ + register unsigned int result asm ("d0") = -1; + __asm__ volatile ( + TRAP_BEGIN + TRAP_FUNC(14, 0x11) + : "=r" (result) + : + : CLOBBER_REG); + return result; +} + +int trap14_26(int (*callback)(void)) +{ + register int callback_return asm ("d0") = -1; + __asm__ volatile ( + TRAP_BEGIN + "move.l %1, %%a7@-\n\t" + TRAP_FUNC(14, 0x26) + : "=r" (callback_return) + : "r" (callback) + : CLOBBER_REG); + return callback_return; +} |