aboutsummaryrefslogtreecommitdiff
path: root/libgloss/m68k/atari/atari-traps.c
diff options
context:
space:
mode:
Diffstat (limited to 'libgloss/m68k/atari/atari-traps.c')
-rw-r--r--libgloss/m68k/atari/atari-traps.c311
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;
+}