780ebb4b00
this will allow us to manage bloat in the loader by using a bytecoded HLL rather than lots of C code. It also offers an opportunity for vendors or others with special applications to significantly customise the boot process without having to commit to a divergent code branch. This early commit is to allow others to experiment with the most effective mechanisms for integrating FICL with the loader as it currently stands. Ficl is distributed with the following license conditions: "Ficl is freeware. Use it in any way that you like, with the understanding that the code is not supported." All source files contain authorship attributions. Obtained from: John Sadler (john_sadler@alum.mit.edu)
91 lines
1.8 KiB
C
91 lines
1.8 KiB
C
/*******************************************************************
|
|
** s y s d e p . c
|
|
** Forth Inspired Command Language
|
|
** Author: John Sadler (john_sadler@alum.mit.edu)
|
|
** Created: 16 Oct 1997
|
|
** Implementations of FICL external interface functions...
|
|
**
|
|
** (simple) port to Linux, Skip Carter 26 March 1998
|
|
**
|
|
*******************************************************************/
|
|
|
|
#include <stdlib.h>
|
|
#include <stdio.h>
|
|
|
|
#include "ficl.h"
|
|
|
|
/*
|
|
******************* FreeBSD P O R T B E G I N S H E R E ******************** Michael Smith
|
|
*/
|
|
|
|
UNS64 ficlLongMul(UNS32 x, UNS32 y)
|
|
{
|
|
UNS64 q;
|
|
u_int64_t qx;
|
|
|
|
qx = (u_int64_t)x * (u_int64_t) y;
|
|
|
|
q.hi = (u_int32_t)( qx >> 32 );
|
|
q.lo = (u_int32_t)( qx & 0xFFFFFFFFL);
|
|
|
|
return q;
|
|
}
|
|
|
|
UNSQR ficlLongDiv(UNS64 q, UNS32 y)
|
|
{
|
|
UNSQR result;
|
|
u_int64_t qx, qh;
|
|
|
|
qh = q.hi;
|
|
qx = (qh << 32) | q.lo;
|
|
|
|
result.quot = qx / y;
|
|
result.rem = qx % y;
|
|
|
|
return result;
|
|
}
|
|
|
|
void ficlTextOut(FICL_VM *pVM, char *msg, int fNewline)
|
|
{
|
|
IGNORE(pVM);
|
|
|
|
while(*msg != 0)
|
|
putchar(*(msg++));
|
|
if (fNewline)
|
|
putchar('\n');
|
|
|
|
return;
|
|
}
|
|
|
|
void *ficlMalloc (size_t size)
|
|
{
|
|
return malloc(size);
|
|
}
|
|
|
|
void ficlFree (void *p)
|
|
{
|
|
free(p);
|
|
}
|
|
|
|
/*
|
|
** Stub function for dictionary access control - does nothing
|
|
** by default, user can redefine to guarantee exclusive dict
|
|
** access to a single thread for updates. All dict update code
|
|
** is guaranteed to be bracketed as follows:
|
|
** ficlLockDictionary(TRUE);
|
|
** <code that updates dictionary>
|
|
** ficlLockDictionary(FALSE);
|
|
**
|
|
** Returns zero if successful, nonzero if unable to acquire lock
|
|
** befor timeout (optional - could also block forever)
|
|
*/
|
|
#if FICL_MULTITHREAD
|
|
int ficlLockDictionary(short fLock)
|
|
{
|
|
IGNORE(fLock);
|
|
return 0;
|
|
}
|
|
#endif /* FICL_MULTITHREAD */
|
|
|
|
|