Article View: net.lang.forth
Article #137Re: Speaking of Princeton
From: Tom Almy
Date: Fri, 21 Sep 1984 15:09
Date: Fri, 21 Sep 1984 15:09
46 lines
3007 bytes
3007 bytes
----------
I have "solved" all the problems presented in the Forth I run under UNIX
(it is Forth-79 which I implemented, written in assembly and Forth like the
fig Model).
Q1: How do I implement ?TERMINAL
A1: Some UNIX systems have an IOCTL call to tell if a key has been typed. Since
the system I run on doesn't, I use the signal facility to catch control-C's.
One control-C causes ?TERMINAL to return TRUE, while two in a row (before
KEY is executed) will cause execution to abort and return to the outer
interpreter loop. This works quite well.
Q2: How do I implement Eaker's Case without droping to assembly language?
A2: The originally published description was in high level. If you only have
a version showing a code word, (OF), then use this version of OF instead:
: OF 4 ?PAIRS COMPILE OVER COMPILE = COMPILE 0BRANCH
HERE 0 , COMPILE DROP 5 ; IMMEDIATE
All of the other words remain the same. You may have to alter this if
yours is not a standard fig-Forth system.
Q3: How do I save the Forth image for later execution?
A3: This is conceptually simple, but in practice the code must be tailored
for the system (each system I have has to do this with different code).
1. The origin table must be patched so that upon a cold start the initial
dictionary pointer, fence, etc., will be correct (so that the application
will appear present).
2. Creat a new file (I use "f.out" on unix). Write to it the file header
necessary for proper loading (this is system dependent). The header
contains the "magic number" and the sizes of the code data and bss
segments.
3. Write out the image.
4. Close the file.
I have successfully done this for V7 UNIX, our internal UNIX implementation
for a 68000 system here at Tektronix, CP/M 68k (which has executable files that
look suspiciously like UNIX), and CP/M 86.
Of course the major problem with my solutions for Q1 and Q3 is that you
have to be able to do UNIX system calls. If you don't have that ability then
you must add a CODE word to do it. Mine takes the call number and a pointer
to the argument structure as arguments, thus it can do any system call. I
add another layer to give functions which match section II of the UNIX manual.
Tom Almy
Tektronix Inc
(many hub systems)!tektronix!tekchips!toma
Technical Details
Message-ID:
<112@tekchips.UUCP>Path:
arc1-ca.pugleaf.net!utzoo!watmath!clyde!burl!ulysses!mhuxj!ihnp4!zehntel!hplabs!tektronix!tekchips!tomaReferences:
<3033@utah-cs.UUCP>, <128@cadovax.UUCP>Show Full Headers
Complete Article Headers
Relay-Version: version B 2.10 5/3/83; site utzoo.UUCP Posting-Version: version B 2.10.1 (Tek) 9/26/83; site tekchips.UUCP Path: arc1-ca.pugleaf.net!utzoo!watmath!clyde!burl!ulysses!mhuxj!ihnp4!zehntel!hplabs!tektronix!tekchips!toma From: toma@tekchips.UUCP (Tom Almy) Newsgroups: net.lang.forth Subject: Re: Speaking of Princeton Message-ID: <112@tekchips.UUCP> Date: Fri, 21-Sep-84 11:09:48 EDT Article-I.D.: tekchips.112 Posted: Fri Sep 21 11:09:48 1984 Date-Received: Wed, 26-Sep-84 02:21:08 EDT References: <3033@utah-cs.UUCP>, <128@cadovax.UUCP> Organization: Tektronix, Beaverton OR Lines: 47