Re-post (part 2 of 2) of SYS:ASM for PDP-11 Unix-FORTH
lwt1 at aplvax
lwt1 at aplvax
Thu Jun 14 01:49:57 AEST 1984
Here is a re-post (part 2 of 2) of the SYS:ASM file for PDP-11
unix-FORTH. The network mangled the original. Remove this header
to the ------ cut here ------ line. Since the SYS:ASM file has been
broken into two pieces, you will need to concatenate them:
cat SYS:ASM.1 SYS:ASM.2 >SYS:ASM
------------------------ cut here -----------------------------------
CODE (FIND) ( ADDR[NAME] ADDR[VOCAB] --- 0 <OR> NFA )
MOV PSP )+ 0 REG
BEQ 3 FWD ( EMPTY VOCABULARY? )
MOV PSP ) 3 REG ( POINTER TO NAME )
MOV 3 )+ 2 REG ( NAME LS )
MOV 3 ) 3 REG ( NAME MS )
1 L: MOV 0 ) 1 REG
BIC 200 $ 1 REG ( CLEAR IMMEDIATE BIT )
CMP 1 REG 2 REG ( COMPARE LS )
BNE 2 FWD
CMP 2 0 X( 3 REG ( COMPARE MS )
BEQ 4 FWD
2 L: MOV 4 0 X( 0 REG ( NEXT LINK )
BNE 1 BACK ( ZERO LINK? )
3 L: 4 L:
MOV 0 REG PSP )
NEXT
CODE WORD ( DEL --- ADDR )
MOV PSP ) 0 REG ( DELIMITER )
MOV in *$ 1 REG ( >IN )
ADD inbuf $ 1 REG ( R1 HAS ADDRESS OF NEXT BYTE IN STREAM )
MOV dp *$ 2 REG ( HERE )
MOV 2 REG PSP ) ( RETURN HERE, ADDRESS OF STRING )
1 L: CMP 0 REG 1 )+ BYTE ( SKIP DELIMITERS )
BEQ 1 BACK
DEC 1 REG ( BACK UP ONE )
MOV 1 REG 3 REG
2 L: CMP 0 REG 3 ) BYTE ( DELIMITER? )
BEQ 3 FWD
CMP 012 $ 3 ) BYTE ( NEWLINE? )
BEQ 4 FWD
INC 3 REG ( SKIP UNTIL END OF WORD )
BR 2 BACK
3 L: 4 L:
SUB 1 REG 3 REG ( R3 HAS LENGTH )
MOV 3 REG 2 )+ BYTE ( SAVE COUNT )
BEQ 6 FWD ( SKIP IF EOL, I.E. ZERO LENGTH )
5 L: MOV 1 )+ 2 )+ BYTE ( MOVE CHARACTERS TO HERE )
5 3 SOB
6 L: CMP 012 $ 1 ) BYTE ( IF NOT NEWLINE )
BEQ 7 FWD
INC 1 REG ( SKIP DELIMITER )
7 L: SUB inbuf $ 1 REG ( >IN IS OFFSET FROM START OF TIB )
MOV 1 REG in *$ ( UPDATE >IN SCANNER )
MOV 040 $ 2 )+ BYTE ( ADD BLANK TO END OF WORD
NEXT
( STACK PRIMITIVES )
CODE ! ( DATA ADDR --- )
MOV PSP )+ 0 REG
MOV PSP )+ 0 )
NEXT
CODE !SP ( ADDR --- ) ( SET ADDRESS OF STACK TOP. )
MOV PSP ) PSP REG
NEXT
CODE + ( N1 N2 --- N1+N2 )
ADD PSP )+ PSP )
NEXT
CODE +! ( DATA ADDR --- )
MOV PSP )+ 0 REG
ADD PSP )+ 0 )
NEXT
CODE - ( N1 N2 --- N1-N2 )
SUB PSP )+ PSP )
NEXT
CODE -1 ( --- -1 )
MOV -1 $ PSP -(
NEXT
CODE 0 ( --- 0 )
CLR PSP -(
NEXT
CODE 0< ( N --- T/F )
CLR 0 REG
TST PSP )
BPL 1 FWD
MOV -1 $ 0 REG
1 L: MOV 0 REG PSP )
NEXT
CODE 0= ( N --- T/F )
CLR 0 REG
TST PSP )
BNE 1 FWD
MOV -1 $ 0 REG
1 L: MOV 0 REG PSP )
NEXT
CODE 1 ( --- 1 )
MOV 1 $ PSP -(
NEXT
CODE 1+ ( N --- N+1 )
INC PSP )
NEXT
CODE 1- ( N --- N-1 )
DEC PSP )
NEXT
CODE 2 ( --- 2 )
MOV 2 $ PSP -(
NEXT
CODE 2+ ( N --- N+2 )
ADD 2 $ PSP )
NEXT
CODE 2- ( N --- N-2 )
SUB 2 $ PSP )
NEXT
CODE 2* ( N --- 2*N )
ASL PSP )
NEXT
CODE 2/ ( N --- N/2 )
ASR PSP )
NEXT
CODE < ( N1 N2 --- T/F )
CLR 0 REG
CMP PSP )+ PSP )
BLE 1 FWD
MOV -1 $ 0 REG
1 L: MOV 0 REG PSP )
NEXT
CODE = ( N1 N2 --- T/F )
CLR 0 REG
CMP PSP )+ PSP )
BNE 1 FWD
MOV -1 $ 0 REG
1 L: MOV 0 REG PSP )
NEXT
CODE > ( N1 N2 --- T/F )
CLR 0 REG
CMP PSP )+ PSP )
BGE 1 FWD
MOV -1 $ 0 REG
1 L: MOV 0 REG PSP )
NEXT
CODE >R ( N1 --- )
MOV PSP )+ SP -(
NEXT
CODE @ ( ADDR --- DATA )
MOV 0 PSP *X( PSP )
NEXT
CODE @SP ( --- ADDR ) ( RETURN STACK POINTER )
MOV PSP REG 0 REG
MOV 0 REG PSP -(
NEXT
CODE AND ( N1 N2 --- N1 & N2 )
MOV PSP )+ 0 REG
COM 0 REG
BIC 0 REG PSP )
NEXT
CODE C! ( BYTE ADDR --- )
MOV PSP )+ 0 REG
MOV PSP )+ 1 REG
MOV 1 REG 0 ) BYTE
NEXT
CODE C@ ( ADDR --- BYTE )
MOV 0 PSP *X( 0 REG BYTE
BIC 177400 $ 0 REG
MOV 0 REG PSP )
NEXT
CODE CMOVE ( SRC DEST UCOUNT --- )
MOV PSP )+ 2 REG
BEQ 2 FWD ( DO NOTHING IF LENGTH ZERO )
MOV PSP )+ 0 REG ( DESTINATION )
MOV PSP )+ 1 REG ( SOURCE )
1 L: MOV 1 )+ 0 )+ BYTE ( MOVE BYTE )
1 2 SOB
BR 3 FWD
2 L: ADD 4 $ PSP REG ( POP TWO STACK ARGS )
3 L: NEXT
CODE D+ ( D1L D1H D2L D2H --- [D1+D2]L [D1+D2]H )
MOV PSP )+ 0 REG
ADD PSP )+ 2 PSP X(
ADC PSP )
ADD 0 REG PSP )
NEXT
CODE D< ( D1L D1H D2L D2H --- T/F )
CLR 0 REG
CMP PSP )+ 2 PSP X(
BLT 2 FWD
BNE 1 FWD
CMP PSP ) 4 PSP X(
BLE 3 FWD
1 L: MOV -1 $ 0 REG
2 L: 3 L:
ADD 4 $ PSP REG
MOV 0 REG PSP )
NEXT
CODE DNEGATE ( D1L D1H --- [-D1]L [-D1]H )
COM PSP )
COM 2 PSP X(
ADD 1 $ 2 PSP X(
ADC PSP )
NEXT
CODE DROP ( N --- )
ADD 2 $ PSP REG
NEXT
CODE DUP ( N --- N N )
MOV PSP ) PSP -(
NEXT
CODE M* ( S1 S2 --- [S1*S2]L [S1*S2]H )
MOV PSP ) 0 REG
MUL 0 REG-ONLY 2 PSP X(
MOV 1 REG 2 PSP X( ( LOW RESULT )
MOV 0 REG PSP ) ( HIGH RESULT )
NEXT
CODE M/ ( SDL SDH DIVISOR --- SREM SQUOT )
MOV PSP )+ 2 REG ( R2 HAS DIVISOR )
MOV PSP ) 0 REG ( R0 HAS HIGH DIVIDEND )
MOV 2 PSP X( 1 REG ( R1 HAS LOW DIVIDEND )
MOV 2 REG 3 REG
EXOR 0 REG-ONLY 3 REG ( R3 HAS SIGN )
DIV 0 REG-ONLY 2 REG ( DIVIDE BY R2 )
TST 3 REG
BPL 1 FWD ( BRANCH IF SIGN IS NOT NEGATIVE )
TST 1 REG
BEQ 2 FWD ( BRANCH IF REMAINDER IS ZERO )
DEC 0 REG ( SUBTRACT ONE FROM QUOTIENT )
ADD 2 REG 1 REG ( ADD DIVISOR TO REMAINDER )
1 L: 2 L:
MOV 1 REG 2 PSP X( ( REMAINDER )
MOV 0 REG PSP ) ( QUOTIENT )
NEXT
CODE NEGATE ( N --- -N )
NEG PSP )
NEXT
CODE NOT ( N --- ONE'S_COMPLEMENT_N )
COM PSP )
NEXT
CODE OR ( N1 N2 --- N1 V N2 )
BIS PSP )+ PSP )
NEXT
CODE OVER ( N1 N2 --- N1 N2 N1 )
MOV 2 PSP X( PSP -(
NEXT
CODE R> ( --- N )
MOV SP )+ PSP -(
NEXT
CODE R@ ( --- N )
MOV SP ) PSP -(
NEXT
CODE RESET ( --- ) ( RESET RETURN STACK POINTER )
MOV rsp0 *$ SP REG
NEXT
CODE ROT ( N1 N2 N3 --- N2 N3 N1 )
MOV 4 PSP X( 0 REG
MOV 2 PSP X( 4 PSP X(
MOV PSP ) 2 PSP X(
MOV 0 REG PSP )
NEXT
CODE ROTATE ( WORD NBITS --- WORD' )
MOV PSP )+ 1 REG ( LOOP COUNTER )
BIC 177760 $ 1 REG ( MASK OFF ALL BUT LOWER FOUR BITS )
BEQ 3 FWD ( SKIP IF ZERO LENGTH ROTATE )
MOV PSP ) 0 REG
1 L: TST 0 REG ( TEST SIGN BIT; CLEAR CARRY )
BPL 2 FWD
SEC ( SET CARRY )
2 L: ROL 0 REG ( ROTATE )
1 1 SOB
MOV 0 REG PSP )
3 L: NEXT
CODE SWAP ( N1 N2 --- N2 N1 )
MOV 2 PSP X( 0 REG
MOV PSP ) 2 PSP X(
MOV 0 REG PSP )
NEXT
CODE UM* ( N1 N2 --- UL UH )
CLR 0 REG
MOV 20 $ 1 REG ( R1 := 16 )
MOV PSP ) 2 REG
MOV 2 PSP X( 3 REG ( MULTIPLIER )
ROR 3 REG ( GET LS BIT )
1 L: BCC 2 FWD
ADD 2 REG 0 REG ( ACCUMULATE )
2 L: ROR 0 REG ( SHIFT CARRY INTO R0 )
ROR 3 REG ( SHIFT INTO R3; GET CARRY BIT )
1 1 SOB
MOV 3 REG 2 PSP X( ( SAVE LS WORD )
MOV 0 REG PSP ) ( SAVE MS WORD )
NEXT
CODE UM/ ( DL DH DIVISOR --- REM QUOT )
MOV 20 $ 0 REG ( 16 BITS )
MOV PSP )+ 1 REG ( DIVISOR )
MOV PSP ) 2 REG ( MS WORD )
MOV 2 PSP X( 3 REG ( LS WORD )
1 L: ASL 3 REG
ROL 2 REG
CMP 1 REG 2 REG
BHI 2 FWD
SUB 1 REG 2 REG
INC 3 REG
2 L: 1 0 SOB
MOV 2 REG 2 PSP X( ( REMAINDER )
MOV 3 REG PSP ) ( QUOTIENT )
NEXT
CODE U< ( U1 U2 --- T/F )
CLR 0 REG
CMP PSP )+ PSP )
BLOS 1 FWD
MOV -1 $ 0 REG
1 L: MOV 0 REG PSP )
NEXT
CODE U> ( U1 U2 --- T/F )
CLR 0 REG
CMP PSP )+ PSP )
BHIS 1 FWD
MOV -1 $ 0 REG
1 L: MOV 0 REG PSP )
NEXT
CODE XOR ( N1 N2 --- N1xorN2 )
MOV PSP )+ 0 REG
EXOR 0 REG-ONLY PSP )
NEXT
More information about the Comp.sources.unix
mailing list