Problem with VAX FORTH under 4.2 BSD

Mitch Bradley wmb at sun.uucp
Thu Jun 28 06:28:27 AEST 1984


There are 2 problems with the Johns Hopkins VAX FORTH under
4.2 BSD.

The first problem is the identifier INDEX, which should be INDX.  This
problem and its solution has already been mentioned in a previous
submission to net.lang.forth (not by me).

The other, more difficult problem is the change in "signal" which
occurred somewhere between 4.1 and 4.2.  Signal used to be a system
call, but in 4.2, the system call is "sigvec", and "signal" is provided
as a library routine which calls "sigvec".

Here's are diff listings which show you what to do to fix the source
code to make it run under 4.2:

In METAASM:


124c124
< C CONSTANT AP
---
> C CONSTANT AP           D CONSTANT FP




In SYS:ASM:



183,186c183,186
< LABEL _SIGNAL	0 ,		( ENTRY MASK )
<  CHMK 30 W$
<  BGEQU 1 FWD
<  MNEGL 1 L$  0 REG		( ERROR )
---
> LABEL _SIGVEC 0 ,		( 4.2 signal mechanism )
>  CHMK  6C W$			( system call to sysvec )
>  BGEQU 1 FWD			( okay if >= )
>  MNEGL 1 L$  0 REG		( return -1 if failure )
188a189,203
> LABEL _SIGNAL 0 ,
>  SUBL2 18 L$ SP REG		( alloc stack space for argument blocks )
>  MOVL   8 AP X(  -18 FP X(	( copy function address to arg block )
>  CLRL -10 FP X(			( clear the old mask word )
>  MOVL -10 FP X(  -14 FP X(	( and the new mask word )
>  PUSHAL  -C FP X(		( address of old-vector arg block )
>  PUSHAL -18 FP X(		( address of new-vector arg block )
>  PUSHL    4 AP X(		( Signal number )
>  CALLS   3 L$  _SIGVEC *$	( Call the sigvec routine )
>  TSTL    0 REG			( Check for success )
>  BGEQU   1 FWD			( Okay if >= )
>  RET				( Not okay, sigvec already returned -1 )
> 1 L: MOVL -C FP X(  0 REG	( Return the old function address )
>  RET
> 
208,209c223,226
<  CALLS 2 L$   _SIGNAL *$	( IGNORE INTERRUPTS )
<  JMP NEXT REL 
---
>  CALLS 2 L$   _SIGNAL *$	( RESTORE INTERRUPT VECTOR )
>  RET     ( was JMP NEXT REL for 4.1, but that doesn't re-enable interrupts )
>          ( This way re-enables interrupts, but looping code words can't )
>          ( be interrupted )



The code for the new version of signal was adapted from the 4.2 library
routine.

One caveat:

The routine which catches the keyboard interrupt signal used to
do a  "JMP NEXT".  This worked fine the first time, but subsequent
keyboard interrupts would be ignored.  The reason is that when a
signal handling routine is called, that signal is blocked until
the handler returns.  If the handler exits by doing a JMP NEXT,
it doesn't really return, so the signal remains blocked.  The fix
implemented in the code above just does a return.  This has the side
effect that it is not possible to interrupt looping code words, but
looping colon definitions may still be interrupted.  The full blown
solution is to have the handler modify the "saved pc" entry in the
structure passed to the handler, but this was more trouble than I
was willing to go to.  In any case, a looping code word can still
be interrupted with a STOP or QUIT signal instead of an INTERRUPT.

Personally, I'm going to be using the Princeton VAX forth (recently
posted).  It's a lot more complete, uses 32-bit stacks, and is
3 times faster on the "sieve" benchmark.

Mitch Bradley



More information about the Comp.unix.wizards mailing list