2 #include <aros/debug.h>
3 #include <exec/types.h>
4 #include <exec/memory.h>
5 #include <proto/exec.h>
9 #include "ks13wrapper.h"
15 #include <hardware/intbits.h>
24 #define SERDATR_TBE (1 << 13) /* Tx Buffer Empty */
25 #define SERDAT_STP8 (1 << 8)
26 #define SERDAT_DB8(x) ((x) & 0xff)
30 /* Must use DOSBase, CDTV extended ROM 2.x includes v37 SysBase replacement */
31 #define ISKS20 (DOSBase->dl_lib.lib_Version >= 37)
33 #define MIN_STACKSIZE 8000
35 static struct DosLibrary
*DOSBase
= (APTR
)-1;
36 static struct Library
*IntuitionBase
= (APTR
)-1;
37 struct ExecBase
*SysBase
= (APTR
)-1;
39 #define wrapper_init() do { \
40 DOSBase = (struct DosLibrary *)OpenLibrary ("dos.library", MIN_LIB_VERSION); \
41 IntuitionBase = OpenLibrary ("intuition.library", MIN_LIB_VERSION); \
42 if (!DOSBase || !IntuitionBase) \
43 Alert(AT_DeadEnd | AG_OpenLib); \
46 #define wrapper_free() do { \
47 CloseLibrary(DOSBase); \
48 CloseLibrary(IntuitionBase); \
51 AROS_UFP2(void, StackSwap
,
52 AROS_UFPA(struct StackSwapStruct
*, stack
, A0
),
53 AROS_UFPA(struct ExecBase
*, SysBase
, A6
));
55 LONG
wrapper_stackswap(LONG (*func
)(struct ExecBase
*), struct ExecBase
*sysBase
)
60 struct StackSwapStruct
*stack
;
67 stacksize
= (UBYTE
*)tc
->tc_SPUpper
- (UBYTE
*)tc
->tc_SPLower
;
68 if (stacksize
>= MIN_STACKSIZE
) {
74 stack
= AllocMem(sizeof(struct StackSwapStruct
) + MIN_STACKSIZE
, MEMF_CLEAR
| MEMF_PUBLIC
);
77 Alert(AT_DeadEnd
| AG_NoMemory
);
81 stack
->stk_Lower
= stackptr
;
82 stack
->stk_Upper
= (APTR
)((IPTR
)stack
->stk_Lower
+ MIN_STACKSIZE
);
83 stack
->stk_Pointer
= (APTR
)stack
->stk_Upper
;
87 AROS_LCA(struct StackSwapStruct
*, stack
, A0
),
88 struct ExecBase
*, SysBase
, 122, );
91 AROS_LCA(struct StackSwapStruct
*, stack
, A0
),
92 struct ExecBase
*, SysBase
, 122, );
94 AROS_UFC2(void, StackSwap
,
95 AROS_UFCA(struct StackSwapStruct
*, stack
, A0
),
96 AROS_UFCA(struct ExecBase
*, SysBase
, A6
));
98 AROS_UFC2(void, StackSwap
,
99 AROS_UFCA(struct StackSwapStruct
*, stack
, A0
),
100 AROS_UFCA(struct ExecBase
*, SysBase
, A6
));
103 FreeMem(stack
, sizeof(struct StackSwapStruct
) + MIN_STACKSIZE
);
109 #if KS13WRAPPER_DEBUG
111 static inline void reg_w(ULONG reg
, UWORD val
)
113 volatile UWORD
*r
= (void *)(0xdff000 + reg
);
117 static inline UWORD
reg_r(ULONG reg
)
119 volatile UWORD
*r
= (void *)(0xdff000 + reg
);
123 static void DebugPutChar(register int chr
)
128 while ((reg_r(SERDATR
) & SERDATR_TBE
) == 0);
129 reg_w(INTREQ
, INTF_TBE
);
131 /* Output a char to the debug UART */
132 reg_w(SERDAT
, SERDAT_STP8
| SERDAT_DB8(chr
));
134 void DebugPutStr(register const char *buff
)
136 for (; *buff
!= 0; buff
++)
139 void DebugPutDec(const char *what
, ULONG val
)
150 for (i
= 1000000000; i
> 0; i
/= 10) {
160 DebugPutChar("0123456789"[num
]);
165 void DebugPutHex(const char *what
, ULONG val
)
170 for (i
= 0; i
< 8; i
++) {
171 DebugPutChar("0123456789abcdef"[(val
>> (28 - (i
* 4))) & 0xf]);
175 void DebugPutHexVal(ULONG val
)
178 for (i
= 0; i
< 8; i
++) {
179 DebugPutChar("0123456789abcdef"[(val
>> (28 - (i
* 4))) & 0xf]);
186 APTR
AllocVec(ULONG size
, ULONG flags
)
190 mem
= AllocMem(size
+ sizeof(ULONG
), flags
);
197 void FreeVec(APTR mem
)
206 APTR
CreateIORequest(struct MsgPort
*ioReplyPort
, ULONG size
)
208 struct IORequest
*ret
=NULL
;
209 if(ioReplyPort
==NULL
)
211 ret
=(struct IORequest
*)AllocMem(size
,MEMF_PUBLIC
|MEMF_CLEAR
);
214 ret
->io_Message
.mn_ReplyPort
=ioReplyPort
;
215 ret
->io_Message
.mn_Length
=size
;
220 void DeleteIORequest(APTR iorequest
)
222 if(iorequest
!= NULL
)
223 FreeMem(iorequest
, ((struct Message
*)iorequest
)->mn_Length
);
226 struct MsgPort
*CreateMsgPort(void)
229 ret
=(struct MsgPort
*)AllocMem(sizeof(struct MsgPort
),MEMF_PUBLIC
|MEMF_CLEAR
);
236 ret
->mp_Flags
= PA_SIGNAL
;
237 ret
->mp_Node
.ln_Type
= NT_MSGPORT
;
238 NEWLIST(&ret
->mp_MsgList
);
240 ret
->mp_SigTask
=SysBase
->ThisTask
;
243 FreeMem(ret
,sizeof(struct MsgPort
));
248 void DeleteMsgPort(struct MsgPort
*port
)
252 FreeSignal(port
->mp_SigBit
);
253 FreeMem(port
,sizeof(struct MsgPort
));
257 BOOL
MatchPatternNoCase(CONST_STRPTR pat
, CONST_STRPTR str
)
260 return AROS_LVO_CALL2(BOOL
,
261 AROS_LCA(CONST_STRPTR
, pat
, D1
),
262 AROS_LCA(CONST_STRPTR
, str
, D2
),
263 struct DosLibrary
*, DOSBase
, 162, );
264 /* Used by ACTION_EXAMINE_ALL which is 2.0+ only packet */
268 STRPTR
FilePart(CONST_STRPTR path
)
275 i
= path
+ strlen (path
) -1;
276 while ((*i
!= ':') && (*i
!= '/') && (i
!= path
))
278 if ((*i
== ':')) i
++;
279 if ((*i
== '/')) i
++;
285 STRPTR
PathPart(CONST_STRPTR path
)
300 else if (*ptr
== ':')
309 static BOOL
CMPBSTR(BSTR s1
, BSTR s2
)
311 UBYTE
*ss1
= BADDR(s1
);
312 UBYTE
*ss2
= BADDR(s2
);
313 return memcmp(ss1
, ss2
, ss1
[0] + 1);
315 static struct DosList
*getdoslist(struct ExecBase
*SysBase
)
319 di
= BADDR(DOSBase
->dl_Root
->rn_Info
);
321 return (struct DosList
*)&di
->di_DevInfo
;
323 static void freedoslist(struct ExecBase
*SysBase
)
328 struct DosList
*MakeDosEntry(CONST_STRPTR name
, LONG type
)
335 return AROS_LVO_CALL2(struct DosList
*,
336 AROS_LCA(CONST_STRPTR
, name
, D1
),
337 AROS_LCA(LONG
, type
, D2
),
338 struct DosLibrary
*, DOSBase
, 116, );
341 dl
= (struct DosList
*)AllocVec(sizeof(struct DosList
),
342 MEMF_PUBLIC
| MEMF_CLEAR
);
346 /* Binary compatibility for BCPL string.
347 * First byte is the length then comes the string.
348 * For ease of use a zero is put at the end so it can be used as a
351 s2
= (STRPTR
)AllocVec(len
+2, MEMF_PUBLIC
| MEMF_CLEAR
);
352 dl
->dol_Name
= MKBADDR(s2
);
354 *s2
++ = (UBYTE
)(len
> 255 ? 255 : len
);
366 LONG
RemDosEntry(struct DosList
*dlist
)
371 return AROS_LVO_CALL1(LONG
,
372 AROS_LCA(struct DosList
*, dlist
, D1
),
373 struct DosLibrary
*, DOSBase
, 112, );
378 dl
= getdoslist(SysBase
);
382 struct DosList
*dl2
= BADDR(dl
->dol_Next
);
386 dl
->dol_Next
= dlist
->dol_Next
;
393 freedoslist(SysBase
);
398 void FreeDosEntry(struct DosList
*dlist
)
402 AROS_LCA(struct DosList
*, dlist
, D1
),
403 struct DosLibrary
*, DOSBase
, 117, );
408 FreeVec(BADDR(dlist
->dol_Name
));
412 LONG
AddDosEntry(struct DosList
*dlist
)
414 LONG success
= DOSTRUE
;
418 return AROS_LVO_CALL1(LONG
,
419 AROS_LCA(struct DosList
*, dlist
, D1
),
420 struct DosLibrary
*, DOSBase
, 113, );
425 D(bug("[AddDosEntry] Adding '%b' type %d from addr %x Task '%s'\n",
426 dlist
->dol_Name
, dlist
->dol_Type
, dlist
,
427 FindTask(NULL
)->tc_Node
.ln_Name
));
429 dl
= getdoslist(SysBase
);
431 if(dlist
->dol_Type
!= DLT_VOLUME
)
435 dl
= BADDR(dl
->dol_Next
);
440 if(dl
->dol_Type
!= DLT_VOLUME
&& !CMPBSTR(dl
->dol_Name
, dlist
->dol_Name
))
442 D(bug("[AddDosEntry] Name clash for %08lx->dol_Name: %b and %08lx->dol_Name %b\n", dl
, dl
->dol_Name
, dlist
, dlist
->dol_Name
));
451 struct DosInfo
*dinf
= BADDR(DOSBase
->dl_Root
->rn_Info
);
453 dlist
->dol_Next
= dinf
->di_DevInfo
;
454 dinf
->di_DevInfo
= MKBADDR(dlist
);
457 freedoslist(SysBase
);
462 IPTR
CallHookPkt(struct Hook
*hook
, APTR object
, APTR paramPacket
)
464 return CALLHOOKPKT(hook
, object
, paramPacket
);
467 BOOL
ErrorReport(LONG code
, LONG type
, IPTR arg1
, struct MsgPort
*device
)
470 return AROS_LVO_CALL4(BOOL
,
471 AROS_LCA(LONG
, code
, D1
),
472 AROS_LCA(LONG
, type
, D2
),
473 AROS_LCA(IPTR
, arg1
, D3
),
474 AROS_LCA(struct MsgPort
*, device
, D4
),
475 struct DosLibrary
*, DOSBase
, 80, );
480 LONG
EasyRequestArgs(struct Window
*window
, struct EasyStruct
*easyStruct
, ULONG
*IDCMP_ptr
, APTR argList
)
483 return AROS_LVO_CALL4(LONG
,
484 AROS_LCA(struct Window
*, window
, A0
),
485 AROS_LCA(struct EasyStruct
*, easyStruct
, A1
),
486 AROS_LCA(ULONG
*, IDCMP_ptr
, A2
),
487 AROS_LCA(APTR
, argList
, A3
),
488 APTR
, IntuitionBase
, 98, );
492 struct Window
*BuildEasyRequestArgs(struct Window
*RefWindow
, struct EasyStruct
*easyStruct
, ULONG IDCMP
, APTR Args
)
495 return AROS_LVO_CALL4(struct Window
*,
496 AROS_LCA(struct Window
*, RefWindow
, A0
),
497 AROS_LCA(struct EasyStruct
*, easyStruct
, A1
),
498 AROS_LCA(ULONG
, IDCMP
, D0
),
499 AROS_LCA(APTR
, Args
, A3
),
500 APTR
, IntuitionBase
, 99, );
504 LONG
SysReqHandler(struct Window
*window
, ULONG
*IDCMPFlagsPtr
, BOOL WaitInput
)
507 return AROS_LVO_CALL3(LONG
,
508 AROS_LCA(struct Window
*, window
, A0
),
509 AROS_LCA(ULONG
*, IDCMPFlagsPtr
, A1
),
510 AROS_LCA(BOOL
, WaitInput
, D0
),
511 APTR
, IntuitionBase
, 100, );
517 #include <exec/types.h>
518 #include <exec/memory.h>
519 #include <proto/exec.h>
521 #ifdef KS13COMPATIBLE
523 APTR
AllocVec(ULONG size
, ULONG flags
)
527 mem
= AllocMem(size
+ sizeof(ULONG
), flags
);
530 ((ULONG
*)mem
)[0] = size
;
531 mem
+= sizeof(ULONG
);
534 void FreeVec(APTR mem
)
538 mem
-= sizeof(ULONG
);
539 FreeMem(mem
, ((ULONG
*)mem
)[0]);
542 APTR
CreateIORequest(struct MsgPort
*ioReplyPort
, ULONG size
)
544 struct IORequest
*ret
=NULL
;
545 if(ioReplyPort
==NULL
)
547 ret
=(struct IORequest
*)AllocMem(size
,MEMF_PUBLIC
|MEMF_CLEAR
);
550 ret
->io_Message
.mn_ReplyPort
=ioReplyPort
;
551 ret
->io_Message
.mn_Length
=size
;
556 void DeleteIORequest(APTR iorequest
)
558 if(iorequest
!= NULL
)
559 /* Just free the memory */
560 FreeMem(iorequest
, ((struct Message
*)iorequest
)->mn_Length
);
563 struct MsgPort
*CreateMsgPort(void)
566 ret
=(struct MsgPort
*)AllocMem(sizeof(struct MsgPort
),MEMF_PUBLIC
|MEMF_CLEAR
);
573 ret
->mp_Flags
= PA_SIGNAL
;
574 ret
->mp_Node
.ln_Type
= NT_MSGPORT
;
575 NEWLIST(&ret
->mp_MsgList
);
577 ret
->mp_SigTask
=SysBase
->ThisTask
;
580 FreeMem(ret
,sizeof(struct MsgPort
));
585 void DeleteMsgPort(struct MsgPort
*port
)
589 FreeSignal(port
->mp_SigBit
);
590 FreeMem(port
,sizeof(struct MsgPort
));