sysdep.c revision 332154
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: stable/11/stand/ficl/i386/sysdep.c 332154 2018-04-06 21:37:25Z kevans $ */
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
28DPUNS 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
41UNSQR 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
56void  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
68void *ficlMalloc (size_t size)
69{
70    return malloc(size);
71}
72
73void *ficlRealloc (void *p, size_t size)
74{
75    return realloc(p, size);
76}
77
78void  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 */
88void
89ficlOutb(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 */
103void
104ficlInb(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 */
118static 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
127FICL_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
144int ficlLockDictionary(short fLock)
145{
146	IGNORE(fLock);
147	return 0;
148}
149#endif /* FICL_MULTITHREAD */
150