UNIX FORTH for the VAX (part 3 of 8)

lwt1 at aplvax.UUCP lwt1 at aplvax.UUCP
Sat Jun 23 04:42:55 AEST 1984


Here is part 3 of 8 of the source for FORTH for the VAX.
Delete everything thru the "-- cut here --" line, and extract with 'sh':

	sh part1 part2 ... part7

where 'part?' are whatever you've named the files.  Note the copyright
notice at the end of README.  Please let us know how things go.  While
we can't support this software, we'll be posting bug fixes/upgrades to
net.sources as time permits.

Have fun!



						-John Hayes
						 Johns Hopkins University
						 Applied Physics Laboratory
						 ... seismo!umcp-cs!aplvax!lwt1

---------------------------------- cut here ----------------------------------
echo x - SYS:ASM
cat >SYS:ASM <<'!E!O!F'

( Copyright 1984 by the Johns Hopkins University/Applied Physics Lab	)
( Free non-commercial distribution is *encouraged*, provided that: 	)
(  									)
( 	1.  This copyright notice is included in any distribution, and 	)
( 	2.  You let us know that you're using it. 			)
(  									)
( Please notify: 							)
(  									)
( 	John Hayes 							)
( 	JHU/Applied Physics Lab 					)
( 	Johns Hopkins Road 						)
( 	Laurel, MD 20707 						)
( 	[301] 953-5000 x8086 						)
(  									)
( 	Usenet:  ... seismo!umcp-cs!aplvax!lwt1 			)
(  									)
(  									)
( Unix-FORTH was developed under NASA contract NAS5-27000 for the 	)
( Hopkins Ultraviolet Telescope, a March 1986 Space Shuttle mission.  	)
( We hope to take a peek at Halley's comet!				)
(  									)
( Written entirely by Wizard-In-Residence John R. Hayes. 		)
(  									)
( * Unix is a trademark of Bell Labs. 					)
(  									)

( VAX FORTH ASSEMBLY LANGUAGE NUCLEUS ) HEX
	0 ,			( ENTRY MASK )
JMP -1 *$			( JUMP TO STARTUP CODE: WILL BE BACKPATCHED )

LABEL	rsp0 0 , 0 ,		( INITIAL VALUE OF RETURN STACK POINTER )
LABEL 	in 0 ,			( >IN: INPUT PARSER )
LABEL	initvocab 0 ,		( INITIAL FORTH VOCABULARY )
LABEL 	dp 0 ,			( END OF DICTIONARY POINTER )

	400 RAMALLOT		( 256 BYTE PARAMETER STACK )
LABEL inbuf
	78 RAMALLOT		( 120 BYTE INPUT BUFFER )

( INDIRECT THREADED CODE INNER INTERPRETER )

PRIM (:)			( CALL: SHOULD NOT BE USED IN A COLON DEF. )
 MOVW IAR REG   SP -(
 MOVW 0 REG   IAR REG

LABEL NEXT			( NEXT )
 MOVZWL IAR )+   0 REG
 MOVZWL 0 )+   1 REG
 JMP 1 )

CODE (;)			( RETURN )
 MOVZWL SP )+   IAR REG
 MOVZWL IAR )+    0 REG		( NEXT CODE REPEATED FOR SPEED )
 MOVZWL 0 )+   1 REG
 JMP 1 )

( [VARIABLE], [CONSTANT], AND [DOES>] ARE RUN TIME WORDS AND SHOULD NOT BE )
( USED IN COLON DEFINITIONS.  POINTERS TO THEIR PFA'S SHOULD BE COMPILED   )
( BY A DEFINING WORD.  THIS IS AN ALTERNATIVE TO ;CODE USED IN SOME FORTH  )
( SYSTEMS.								   )

PRIM (VARIABLE)
 MOVW 0 REG   PSP -(
 JMP NEXT REL

PRIM (CONSTANT)
 MOVW 0 )   PSP -(
 JMP NEXT REL

PRIM (DOES>)
 MOVW IAR REG   SP -(
 MOVZWL 0 )+   IAR REG
 MOVW 0 REG   PSP -(
 JMP NEXT REL

( CONTROL FLOW PRIMITIVES )

CODE (LITERAL)
 MOVW IAR )+   PSP -(
 JMP NEXT REL

CODE BRANCH
 1 L: MOVZWL IAR )   IAR REG
 JMP NEXT REL

CODE ?BRANCH
 TSTW PSP )+
 BEQL 1 BACK
 ADDW2 2 W$   IAR REG
 JMP NEXT REL

CODE EXECUTE
 MOVZWL PSP )+   0 REG
 MOVZWL 0 )+   1 REG
 JMP 1 )

CODE (DO)
 ADDW3 2 PSP X(   8000 W$   0 REG
 MOVW 0 REG   SP -(
 SUBW3 0 REG   PSP )+   SP -(
 ADDW2 2 W$   PSP REG
 JMP NEXT REL

CODE (LOOP)
 INCW SP )
 BVC 1 BACK
 ADDL2 4 L$   SP REG
 ADDW2 2 W$   IAR REG
 JMP NEXT REL

CODE (+LOOP)
 ADDW2 PSP )+   SP )
 BVC 1 BACK
 ADDL2 4 L$   SP REG
 ADDW2 2 W$   IAR REG
 JMP NEXT REL

CODE I
 ADDW3 SP )   2 SP X(   PSP -(
 JMP NEXT REL

CODE J
 ADDW3 4 SP X(   6 SP X(   PSP -(
 JMP NEXT REL

CODE (LEAVE)
 ADDL2 4 L$   SP REG
 MOVZWL IAR )   IAR REG
 JMP NEXT REL

( BASIC UNIX SYSTEM INTERFACE )

( LOW LEVEL SYSTEM CALLS )

LABEL _READ	0 ,		( ENTRY MASK )
 CHMK 3 W$
 BCC 1 FWD
 CLRL 0 REG
1 L: RET

LABEL _WRITE	0 ,		( ENTRY MASK )
 CHMK 4 W$
 BCC 1 FWD
 MNEGL 1 L$  0 REG
1 L: RET

LABEL _LSEEK	0 ,		( ENTRY MASK )
 CHMK 13 W$
 BCC 1 FWD
 CLRL 0 REG
1 L: RET

LABEL _CREAT	0 ,		( ENTRY MASK )
 CHMK 8 W$
 BCC 1 FWD
 MNEGL 1 L$   0 REG		( RETURN A -1 IF ERROR )
1 L: RET

LABEL _OPEN	0 ,		( ENTRY MASK )
 CHMK 5 W$
 BCC 1 FWD
 MNEGL 1 L$   0 REG		( RETURN -1 IF ERROR )
1 L: RET

LABEL _CLOSE	0 ,		( ENTRY MASK )
 CHMK 6 W$
 RET

LABEL _EXIT	0 , 		( ENTRY MASK )
 CHMK 1 W$			( SHOULD NEVER RETURN )
 HALT

LABEL _FORK	0 , 		( ENTRY MASK )
 CHMK 2 W$
 BGEQU 1 FWD
 MNEGL 1 L$   0 REG		( ERROR )
 RET
1 L: BLBC 1 REG   2 FWD
 CLRL 0 REG			( RETURN ZERO IF CHILD )
2 L: RET

LABEL _SIGNAL	0 ,		( ENTRY MASK )
 CHMK 30 W$
 BGEQU 1 FWD
 MNEGL 1 L$  0 REG		( ERROR )
1 L: RET

LABEL _WAIT	0 ,		( ENTRY MASK )
 CHMK 7 W$
 BGEQU 1 FWD
 MNEGL 1 L$   0 REG		( ERROR )
 RET
1 L: TSTL 4 AP X(
 BEQL 2 FWD
 MOVL 1 REG   4 AP *X(
2 L: RET

LABEL _EXECVE	0 ,		( ENTRY MASK )
 CHMK 3B W$
 HALT				( SHOULD NEVER BE EXECUTED )

EVEN				( INTERRUPT ROUTINES MUST START AT WORD ADDR )
LABEL vector 0 ,		( SIGINT INTERRUPT SERVICE ROUTINE )
 MOVZWL -1 W$   IAR REG		( MOVE ABORT TO IAR; WILL BE BACKPATCHED )
 PUSHAL vector *$		( PUSH ADDRESS OF INTERRUPT ROUTINE )
 PUSHL 2 L$			( SIGINT )
 CALLS 2 L$   _SIGNAL *$	( IGNORE INTERRUPTS )
 JMP NEXT REL 

( DATA AND CODE FOR SPAWNING OFF SUB-PROCESSES )
 LABEL STATUS 0 , 0 ,		( LONG WORD FOR RECEIVING STATUS FROM WAIT )
 LABEL NAME	622F , 6E69 , 632F , 6873 , 0 ,	( "/bin/csh" )
 LABEL 0ARG	7363 , 68 ,			( "csh" )
 LABEL 1ARG	632D , 0 ,			( "-c" )
 LABEL ARGV	0ARG , 0 , 1ARG , 0 , 0 , 0 ,	( ARGUMENT LIST )
		0 , 0 ,				( LIST TERMINATOR )

CODE SHELL			( --- )   ( SPAWN OFF INTERACTIVE SUB-SHELL )
 CLRL ARGV 4 + *$		( sh WITH NO ARGUMENTS )
0 L:				( SPAWN SUB-PROCESS; SYSTEM SHARES THIS CODE )
 CALLS 0 L$   _FORK *$		( FORK )
 TSTL 0 REG
 BNEQ 1 FWD			( BRANCH IF NOT THE CHILD PROCES )
 PUSHL rsp0 *$			( ENVIRONMENT POINTER )
 PUSHAL ARGV *$			( ADDRESS OF ARGUMENT ARRAY )
 PUSHAL NAME *$			( ADDRESS OF COMMAND NAME )
 CALLS 3 L$   _EXECVE *$	( EXEC CALL; SHOULD NOT RETURN )

1 L:
 PUSHL 1 L$			( SIG_IGN )
 PUSHL 2 L$			( SIGIGT )
 CALLS 2 L$   _SIGNAL *$	( DISABLE INTERRUPTS )
 MOVL 0 REG   2 REG		( SAVE OLD INTERRUPT ADDRESS )
 PUSHAL STATUS *$		( ADDRESS OF STATUS WORD )
 CALLS 1 L$   _WAIT *$		( WAIT )
 PUSHL 2 REG			( OLD INTERRUPT ADDRESS )
 PUSHL 2 L$			( SIGINT )
 CALLS 2 L$   _SIGNAL *$	( RESTORE OLD INTERRUPT STATE )
 JMP NEXT REL 

CODE SYSTEM			( ADDR[STRING] --- )   ( PASS NULL-TERMINATED )
				( STRING TO SHELL FOR EXECUTION.	      )
 MOVZWL 1ARG W$   ARGV 4 + *$	( MOVE POINTER TO "-c" TO ARGUMENT LIST )
 MOVZWL PSP )+   ARGV 8 + *$	( MOVE POINTER TO COMMAND STRING TO LIST )
 BRB 0 BACK			( BRANCH TO CODE TO SPAWN SUB-SHELL )

( 	I/O BUFFER AND CONTROL VARIABLES )

LABEL BLOCK	400 RAMALLOT	( 1024 BYTE INPUT BUFFER )
LABEL SIZE	0 ,		( SIZE OF BUFFER IN BYTES )
LABEL INDEX	0 ,		( CURRENT OFFSET INTO BLOCK )
LABEL FD	0 ,		( FILE DESCRIPTOR OF ASSOCIATED FILE )

( FILE POSITION TABLE : EACH SLOT HAS A 32 BIT FILE OFFSET.  FILE DES- )
( CRIPTOR IS OFFSET INTO TABLE.  THERE ARE 15 SLOTS.		       )

LABEL FILEPOS	0 , 0 ,
		0 , 0 ,
		0 , 0 ,
		0 , 0 ,
		0 , 0 ,
		0 , 0 ,
		0 , 0 ,
		0 , 0 ,
		0 , 0 ,
		0 , 0 ,
		0 , 0 ,
		0 , 0 ,
		0 , 0 ,
		0 , 0 ,
		0 , 0 ,

( SUBROUTINE GETC:  HANDLES ALL INPUT AND DOES BUFFERING  )
(	INPUT: FILE DESCRIPTOR IN R2			  )
(	OUTPUT: CHARACTER OR EOF IN R0			  )
( 	SIDE EFFECTS: R3 IS MODIFIED			  )

LABEL GETC
 CMPW 2 REG   FD REL
 BEQL 1 FWD			( SEEK IF NEW FD IS NOT SAME AS OLD FD )
 MOVW 2 REG   FD REL
 MOVW SIZE REL   INDEX REL	( INDICATE THAT BUFFER IS EMPTY )
 CLRL SP -(			( WHENCE IS START OF FILE )
 PUSHL 2 []   FILEPOS REL	( PUSH FILE POSITION )
 PUSHL 2 REG			( PUSH FILE DESCRITPTOR )
 CALLS 3 L$   _LSEEK REL	( SEEK )
1 L: MOVZWL INDEX REL   3 REG	( R3 HAS INDEX )
 CMPW 3 REG   SIZE REL
 BLSS 2 FWD			( READ FILE IF BUFFER IS EMPTY )
 PUSHL 400 L$			( PUSH BLOCK SIZE )
 PUSHL BLOCK L$			( PUSH ADDRESS OF BLOCK )
 PUSHL 2 REG			( PUSH FILE DESCRIPTOR )
 CALLS 3 L$   _READ REL		( READ )
 MOVW 0 REG   SIZE REL		( SAVE SIZE )
 CLRL 3 REG			( RESET INDEX )
2 L: CMPW 3 REG   SIZE REL
 BEQL 3 FWD			( BRANCH IF END OF FILE )
 INCL 2 []   FILEPOS REL	( UPDATE FILE POSITION )
 MOVZBL BLOCK 3 X(   0 REG	( RETURN CHARACTER )
 INCW 3 REG			( UPDATE INDEX )
 BRB 4 FWD
3 L: MNEGL 1 L$ 0 REG		( RETURN EOF: -1 )
4 L: MOVW 3 REG   INDEX REL	( SAVE INDEX )
 RSB

CODE FEXPECT			( FD ADDR COUNT --- ACTCOUNT )
 MOVZWL 2 PSP X(   4 REG	( BUFFER ADDRESS )
 MOVZWL PSP )+   5 REG		( COUNT )
 BEQL 3 FWD
1 L: MOVZWL 2 PSP X(   2 REG	( FILE DESCRIPTOR )
 JSB GETC REL			( GET NEXT CHARACTER )
 CMPW 0 REG   -1 W$
 BEQL 4 FWD			( LEAVE LOOP ON EOF )
 CMPB 0 REG    09 B$
 BNEQ 2 FWD
 MOVB 20 B$   0 REG		( CHANGE TABS TO BLANKS )
2 L: MOVB 0 REG   4 )+		( SAVE CHARACTER )
 CMPB 0 REG   0A B$
 BEQL 5 FWD			( LEAVE LOOP ON NEW LINE )
 SOBGTR 5 REG   1 BACK		( DECREMENT COUNT AND CONTINUE IF NON-ZERO )
3 L:  4 L:  5 L:
 SUBW2 PSP )+   4 REG		( COMPUTE ACTUAL NUMBER OF CHARACTERS READ )
 MOVW 4 REG   PSP )		( RETURN ACTUAL NUMBER )
 JMP NEXT REL

CODE READ			( FD ADDR COUNT --- ACTCOUNT )
 MOVZWL 2 PSP X(    4 REG	( BUFFER ADDRESS )
 MOVZWL PSP )+   5 REG		( COUNT )
 BEQL 3 FWD
1 L: MOVZWL 2 PSP X(   2 REG	( FILE DESCRIPTOR )
 JSB GETC REL			( GET NEXT CHARACTER )
 CMPW 0 REG   -1 W$
 BEQL 4 FWD			( LEAVE LOOP ON END OF FILE )
 MOVB 0 REG   4 )+		( SAVE CHARACTER )
 SOBGTR 5 REG    1 BACK 	( DECREMENT COUNT AND CONTINUE IF NON-ZERO )
3 L:  4 L:
 SUBW2 PSP )+   4 REG		( COMPUTE ACTUAL NUMBER OF CHARACTERS READ )
 MOVW 4 REG   PSP )		( RETURN ACTUAL COUNT )
 JMP NEXT REL

CODE WRITE			( ADDR COUNT FD --- ACTCOUNT )
 MOVZWL PSP )+   0 REG		( FILE DESCRIPTOR )
 MOVZWL PSP )+   SP -( 		( STACK COUNT )
 MOVZWL PSP )   SP -( 		( STACK ADDRESS )
 PUSHL 0 REG			( STACK FILE DESCRIPTOR )
 CALLS 3 L$   _WRITE REL	( WRITE )
 MOVW 0 REG PSP )		( RETURN ACTUAL COUNT )
 JMP NEXT REL

CODE SEEK			( FD OFFSETL OFFSETH --- )
 MOVW 2 PSP X(   PSP -(
 MOVL PSP )+   0 REG		( OFFSET )
 ADDW2 2 W$   PSP REG
 MOVZWL PSP )+   1 REG		( FILE DESCRIPTOR )
 CMPW 1 REG   FD REL
 BNEQ 1 FWD
 MOVW SIZE REL   INDEX REL	( IF SEEKING BUFFERED FILE, RESET BUFFER )
1 L: MOVL 0 REG   1 []  FILEPOS REL
				( SAVE NEW POSITION IN POSITION TABLE )
 CLRL SP -(			( WHENCE IS START OF FILE )
 PUSHL 0 REG			( OFFSET )
 PUSHL 1 REG			( FD )
 CALLS 3 W$   _LSEEK REL	( SEEK )
 JMP NEXT REL

CODE CREAT			( ADDR[STRING] PMODE --- FD )
 MOVZWL PSP )+   SP -(		( STACK PROTECTION MODE )
 MOVZWL PSP )   SP -(		( STACK ADDRESS OF FILE NAME STRING )
 CALLS 2 W$   _CREAT REL	( CREAT SYSTEM CALL )
 MOVW 0 REG   PSP )		( RETURN FILE DESCRIPTOR )
 BLSS 1 FWD			( SKIP IF CREATION FAILED )
 CLRL 0 [] FILEPOS REL		( SET FILE POSITION TO ZERO )
1 L: JMP NEXT REL

CODE OPEN			( ADDR[STRING] MODE --- FD )
 MOVZWL PSP )+   SP -(		( STACK MODE )
 MOVZWL PSP )   SP -(		( STACK ADDRESS OF FILE NAME )
 CALLS 2 W$   _OPEN REL		( OPEN )
 MOVW 0 REG   PSP )		( RETURN FILE DESCRIPTOR )
 BLSS 1 FWD			( SKIP IF OPEN FAILED )
 CLRL 0 []   FILEPOS REL	( RESET FILE POSITION )
1 L: JMP NEXT REL

CODE CLOSE			( FD --- )
 MOVZWL PSP )+   SP -(		( STACK FILE DESCRIPTOR )
 CALLS 1 W$   _CLOSE REL	( CLOSE )
 JMP NEXT REL

CODE TERMINATE			( --- )
 CLRL SP -(			( RETURN GOOD STATUS )
 CALLS 1 W$   _EXIT REL		( EXIT )
 JMP NEXT REL				( SHOULD NEVER BE EXECUTED )

( HIGH LEVEL UTILITIES WRITTEN IN ASSEMBLY LANGUAGE FOR SPEED )

CODE (FIND)			( ADDR[WORD] ADDR[VOCAB] --- 0 <OR> NFA )
 MOVZWL PSP )+   0 REG
 BEQL 3 FWD
 MOVZWL PSP )   1 REG
 MOVL 1 )   2 REG
1 L: BICL3 80 L$   0 )   3 REG
 CMPL 2 REG   3 REG
 BNEQ 2 FWD
 CMPW 4 1 X(   4 0 X(
 BEQL 4 FWD
2 L: MOVZWL 6 0 X(   0 REG
 BNEQ 1 BACK
3 L:
4 L: MOVW 0 REG  PSP )
 JMP NEXT REL

CODE WORD			( DEL --- ADDR )
 CLRL 1 REG
 ADDW3 inbuf W$   in REL   1 REG
 SKPC PSP )   100 W$   1 )
 MOVZWL PSP )   0 REG
 MOVZWL dp REL   2 REG
 MOVW 2 REG   PSP )
 MOVL 1 REG   3 REG
1 L: CMPB 0 REG   3 )
 BEQL 2 FWD
 CMPB 0A B$   3 )
 BEQL 3 FWD
 INCW 3 REG
 BRB 1 BACK
2 L:
3 L: SUBW2 1 REG   3 REG
 MOVB 3 REG   2 )+
 BEQL 5 FWD
4 L: MOVB 1 )+   2 )+
 SOBGTR 3 REG   4 BACK
5 L: CMPB 0A B$   1 )
 BEQL 6 FWD
 INCW 1 REG
6 L: SUBW3   inbuf W$   1 REG   in REL
 MOVB 20 B$   2 )
 JMP NEXT REL

( STACK PRIMITIVES )

CODE !
 MOVZWL PSP )+   0 REG
 MOVW PSP )+   0 )
 JMP NEXT REL

CODE !SP
 MOVZWL PSP )   PSP REG
 JMP NEXT REL

CODE +
 ADDW2 PSP )+   PSP )
 JMP NEXT REL

CODE +!
 MOVZWL PSP )+   0 REG
 ADDW2 PSP )+   0 )
 JMP NEXT REL

CODE -
 SUBW2 PSP )+   PSP )
 JMP NEXT REL

CODE -1
 MNEGW 1 W$   PSP -(
 JMP NEXT REL

CODE 0
 CLRW PSP -(
 JMP NEXT REL

CODE 0<
 CLRW 0 REG
 TSTW PSP )
 BGEQ 1 FWD
 MNEGW 1 W$   0 REG
1 L: MOVW 0 REG   PSP )
 JMP NEXT REL

CODE 0=
 CLRW 0 REG
 TSTW PSP )
 BNEQ 1 FWD
 MNEGW 1 W$   0 REG
1 L: MOVW 0 REG   PSP )
 JMP NEXT REL

CODE 1
 MOVW 1 W$   PSP -(
 JMP NEXT REL

CODE 1+
 INCW PSP )
 JMP NEXT REL

CODE 1-
 DECW PSP )
 JMP NEXT REL

CODE 2
 MOVW 2 W$   PSP -(
 JMP NEXT REL

CODE 2+
 ADDW2 2 W$   PSP )
 JMP NEXT REL

CODE 2-
 SUBW2 2 W$   PSP )
 JMP NEXT REL

CODE 2*
 MOVW PSP )   0 REG
 ASHL 1 B$   0 REG   0 REG
 MOVW 0 REG   PSP )
 JMP NEXT REL

CODE 2/
 CVTWL PSP )   0 REG
 ASHL -1 B$   0 REG   0 REG
 MOVW 0 REG   PSP )
 JMP NEXT REL

CODE <
 CLRW 0 REG
 CMPW PSP )+   PSP )
 BLEQ 1 FWD
 MNEGW 1 W$   0 REG
1 L: MOVW 0 REG    PSP )
 JMP NEXT REL

CODE =
 CLRW 0 REG
 CMPW PSP )+   PSP )
 BNEQ 1 FWD
 MNEGW 1 W$   0 REG
1 L: MOVW 0 REG   PSP )
 JMP NEXT REL

CODE >
 CLRW 0 REG
 CMPW PSP )+   PSP )
 BGEQ 1 FWD
 MNEGW 1 W$   0 REG
1 L: MOVW 0 REG   PSP )
 JMP NEXT REL

CODE >R
 MOVW PSP )+   SP -(
 JMP NEXT REL

CODE @
 MOVZWL PSP )   0 REG
 MOVW 0 )   PSP )
 JMP NEXT REL

CODE @SP
 MOVW PSP REG   0 REG
 MOVW 0 REG   PSP -(
 JMP NEXT REL

CODE AND
 MCOMW PSP )+   0 REG
 BICW2 0 REG   PSP )
 JMP NEXT REL

CODE C!
 MOVZWL PSP )+   0 REG
 MOVB PSP )+   0 )
 INCW PSP REG
 JMP NEXT REL

CODE C@
 MOVZWL PSP )   0 REG
 MOVBWZ  0 )   PSP )
 JMP NEXT REL

CODE CMOVE
 MOVZWL PSP )+  2 REG
 BEQL 2 FWD
 MOVZWL PSP )   0 REG
 MOVZWL 2 PSP X(   1 REG
1 L: MOVB 1 )+   0 )+
 SOBGTR 2 REG   1 BACK
2 L: ADDW2 4 W$   PSP REG
JMP NEXT REL

CODE D+
 MOVW 2 PSP X(   PSP -(
 MOVW 8 PSP X(   4 PSP X(
 ADDL2 PSP )+   PSP )
 MOVW PSP )+   2 PSP X(
 JMP NEXT REL

CODE DNEGATE
 MOVW 2 PSP X(   PSP -(
 MNEGL PSP )  PSP )
 MOVW PSP )+   2 PSP X(
 JMP NEXT REL

CODE D<
 MOVW 2 PSP X(   PSP -(
 MOVW 8 PSP X(   4 PSP X(
 CLRW 0 REG
 CMPL PSP )+   PSP )+
 BLEQ 1 FWD
 MNEGW 1 W$   0 REG
1 L: MOVW 0 REG   PSP )
 JMP NEXT REL

CODE DROP
 ADDW2 2 W$   PSP REG
 JMP NEXT REL

CODE DUP
 MOVW PSP )   PSP -(
 JMP NEXT REL

CODE M*				( S1 S3 --- [S1*S2]L [S1*S2]H )
 CVTWL PSP )+   0 REG
 CVTWL PSP )   1 REG
 MULL3 0 REG   1 REG   PSP -(
 MOVW PSP )+   2 PSP X(
 JMP NEXT REL

CODE M/				( SDL SDH DIV --- REM QUOT )
 CVTWL PSP )   0 REG		( DIVISOR IS IN R0 )
 MOVW 4 PSP X(   PSP )
 CLRL 2 REG
 MOVL PSP )+   1 REG
 BGEQ 1 FWD
 DECL 2 REG			( SIGNED QUADWORD DIVIDEND IS IN R1,R2 )
1 L: XORL3 2 REG   0 REG   3 REG	( SIGN IS IN R3 )
 EDIV 0 REG   1 REG   4 REG   5 REG
 TSTL 3 REG
 BGEQ 2 FWD			( BRANCH IF SIGN IS NOT NEGATIVE )
 TSTL 5 REG
 BEQL 3 FWD			( BRANCH IF REMAINDER IS ZERO )
 DECL 4 REG			( SUBTRACT ONE FROM QUOTIENT )
 ADDL2 0 REG   5 REG		( ADD DIVISOR TO REMAINDER )
2 L:  3 L:
 MOVW 5 REG   PSP )		( REMAINDER )
 MOVW 4 REG   PSP -(		( QUOTIENT )
 JMP NEXT REL

CODE NEGATE
 MNEGW PSP )   PSP )
 JMP NEXT REL

CODE NOT
 MCOMW PSP )   PSP )
 JMP NEXT REL

CODE OR
 BISW2 PSP )+   PSP )
 JMP NEXT REL

CODE OVER
 MOVW 2 PSP X(   PSP -(
 JMP NEXT REL

CODE R>
 MOVW SP )+   PSP -(
 JMP NEXT REL

CODE R@
 MOVW SP )   PSP -(
 JMP NEXT REL

CODE RESET
 MOVL rsp0 REL   SP REG
 JMP NEXT REL

CODE ROT
 MOVW 4 PSP X(   0 REG
 MOVW 2 PSP X(   4 PSP X(
 MOVW PSP )   2 PSP X(
 MOVW 0 REG   PSP )
 JMP NEXT REL

CODE ROTATE
 BICW3 FFF0 W$   PSP )   0 REG
 MOVW 2 PSP X(   PSP )
 MOVL PSP )   1 REG
 ADDW2 2 W$   PSP REG
 ROTL 0 REG   1 REG   1 REG
 MOVW 1 REG   PSP )
 JMP NEXT REL

CODE SWAP
 MOVW 2 PSP X(   0 REG
 MOVW PSP )   2 PSP X(
 MOVW 0 REG   PSP )
 JMP NEXT REL

CODE U<
 CLRW 0 REG
 CMPW PSP )+   PSP )
 BLEQU 1 FWD
 MNEGW 1 W$   0 REG
1 L: MOVW 0 REG   PSP )
 JMP NEXT REL

CODE U>
 CLRW 0 REG
 CMPW PSP )+   PSP )
 BGEQU 1 FWD
 MNEGW 1 W$   0 REG
 1 L: MOVW 0 REG   PSP )
 JMP NEXT REL

CODE UM*
 MOVZWL PSP )+   0 REG
 MOVZWL PSP )   1 REG
 MULL2 1 REG   0 REG
 MOVL 0 REG   PSP -(
 MOVW PSP )+   2 PSP X(
 JMP NEXT REL

CODE UM/
 MOVZWL PSP )   2 REG
 MOVW 4 PSP X(   PSP )
 MOVL PSP )+   3 REG
 CLRL 4 REG
 EDIV 2 REG   3 REG   0 REG   1 REG
 MOVW 1 REG   PSP )
 MOVW 0 REG   PSP -(
 JMP NEXT REL

CODE XOR
 XORW2 PSP )+   PSP )
 JMP NEXT REL

!E!O!F



More information about the Comp.sources.unix mailing list