1 /*******************************************************************
2 ** s y s d e p . c
3 ** Forth Inspired Command Language
4 ** Author: John Sadler (john_sadler@alum.mit.edu)
5 ** Created: 16 Oct 1997
6 ** Implementations of FICL external interface functions...
7 **
8 *******************************************************************/
9
10 /* $FreeBSD$ */
11
12 #ifdef TESTMAIN
13 #include <stdio.h>
14 #include <stdlib.h>
15 #else
16 #include <stand.h>
17 #ifdef __i386__
18 #include <machine/cpufunc.h>
19 #endif
20 #endif
21 #include "ficl.h"
22
23 /*
24 ******************* FreeBSD P O R T B E G I N S H E R E ******************** Michael Smith
25 */
26
27 #if PORTABLE_LONGMULDIV == 0
ficlLongMul(FICL_UNS x,FICL_UNS y)28 DPUNS ficlLongMul(FICL_UNS x, FICL_UNS y)
29 {
30 DPUNS q;
31 uint64_t qx;
32
33 qx = (uint64_t)x * (uint64_t) y;
34
35 q.hi = (uint32_t)( qx >> 32 );
36 q.lo = (uint32_t)( qx & 0xFFFFFFFFL);
37
38 return q;
39 }
40
ficlLongDiv(DPUNS q,FICL_UNS y)41 UNSQR ficlLongDiv(DPUNS q, FICL_UNS y)
42 {
43 UNSQR result;
44 uint64_t qx, qh;
45
46 qh = q.hi;
47 qx = (qh << 32) | q.lo;
48
49 result.quot = qx / y;
50 result.rem = qx % y;
51
52 return result;
53 }
54 #endif
55
ficlTextOut(FICL_VM * pVM,char * msg,int fNewline)56 void ficlTextOut(FICL_VM *pVM, char *msg, int fNewline)
57 {
58 IGNORE(pVM);
59
60 while(*msg != 0)
61 putchar((unsigned char)*(msg++));
62 if (fNewline)
63 putchar('\n');
64
65 return;
66 }
67
ficlMalloc(size_t size)68 void *ficlMalloc (size_t size)
69 {
70 return malloc(size);
71 }
72
ficlRealloc(void * p,size_t size)73 void *ficlRealloc (void *p, size_t size)
74 {
75 return realloc(p, size);
76 }
77
ficlFree(void * p)78 void ficlFree (void *p)
79 {
80 free(p);
81 }
82
83 #ifndef TESTMAIN
84 /*
85 * outb ( port# c -- )
86 * Store a byte to I/O port number port#
87 */
88 void
ficlOutb(FICL_VM * pVM)89 ficlOutb(FICL_VM *pVM)
90 {
91 u_char c;
92 uint32_t port;
93
94 port=stackPopUNS(pVM->pStack);
95 c=(u_char)stackPopINT(pVM->pStack);
96 outb(port,c);
97 }
98
99 /*
100 * inb ( port# -- c )
101 * Fetch a byte from I/O port number port#
102 */
103 void
ficlInb(FICL_VM * pVM)104 ficlInb(FICL_VM *pVM)
105 {
106 u_char c;
107 uint32_t port;
108
109 port=stackPopUNS(pVM->pStack);
110 c=inb(port);
111 stackPushINT(pVM->pStack,c);
112 }
113
114 /*
115 * Glue function to add the appropriate forth words to access x86 special cpu
116 * functionality.
117 */
ficlCompileCpufunc(FICL_SYSTEM * pSys)118 static void ficlCompileCpufunc(FICL_SYSTEM *pSys)
119 {
120 FICL_DICT *dp = pSys->dp;
121 assert (dp);
122
123 dictAppendWord(dp, "outb", ficlOutb, FW_DEFAULT);
124 dictAppendWord(dp, "inb", ficlInb, FW_DEFAULT);
125 }
126
127 FICL_COMPILE_SET(ficlCompileCpufunc);
128
129 #endif
130
131 /*
132 ** Stub function for dictionary access control - does nothing
133 ** by default, user can redefine to guarantee exclusive dict
134 ** access to a single thread for updates. All dict update code
135 ** is guaranteed to be bracketed as follows:
136 ** ficlLockDictionary(TRUE);
137 ** <code that updates dictionary>
138 ** ficlLockDictionary(FALSE);
139 **
140 ** Returns zero if successful, nonzero if unable to acquire lock
141 ** befor timeout (optional - could also block forever)
142 */
143 #if FICL_MULTITHREAD
ficlLockDictionary(short fLock)144 int ficlLockDictionary(short fLock)
145 {
146 IGNORE(fLock);
147 return 0;
148 }
149 #endif /* FICL_MULTITHREAD */
150