                                  .TITLE	GETARG	V03-01	INTERFACE MODULE FOR BASIC	DEC-11-LMUBA-A-LA

;BASIC KERNEL V03
;
;	THIS  SOFTWARE  IS  FURNISHED  UNDER  A  LICENSE  FOR USE ONLY
;	ON A SINGLE COMPUTER  SYSTEM  AND  MAY  BE  COPIED  ONLY  WITH
;	THE   INCLUSION   OF   THE   ABOVE   COPYRIGHT   NOTICE.  THIS
;	SOFTWARE, OR ANY OTHER COPIES THEREOF,  MAY  NOT  BE  PROVIDED
;	OR  OTHERWISE  MADE  AVAILABLE  TO ANY OTHER PERSON EXCEPT FOR 
;	USE ON SUCH SYSTEM AND TO ONE  WHO  AGREES  TO  THESE  LICENSE
;	TERMS.  TITLE  TO  AND  OWNERSHIP  OF  THE  SOFTWARE  SHALL AT
;	ALL TIMES REMAIN IN DIGITAL.
;
;	THE   INFORMATION  IN  THIS  DOCUMENT  IS  SUBJECT  TO  CHANGE
;	WITHOUT NOTICE AND SHOULD NOT BE CONSTRUED  AS  A  COMMITTMENT
;	BY DIGITAL EQUIPMENT CORPORATION.
;
;	DIGITAL  ASSUMES  NO RESPONSIBILITY FOR THE USE OR RELIABILITY
;	OF ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DIGITAL.
;
;COPYRIGHT (C) 1974, 1975
;BY DIGITAL EQUIPMENT CORPORATION
;146 MAIN STREET
;MAYNARD, MASSACHUSETTS  01754
;
; GETARG, STORE, SSTORE :  SUBROUTINES FOR
; LINKAGE OF ASSEMBLER SUBROUTINES TO BASIC
;
	.GLOBL	GETARG, STORE
	.GLOBL	EVAL, GETVAR, ERRARG, ERRSYN
	.GLOBL	.LPAR, .COMMA, .RPAR, .EOL
	.GLOBL	STOVAR, .SQUOT, .DQUOT
	.IFNDF	$NOSTR
	.GLOBL	SSTORE, STOSVAR
	.ENDC	;$NOSTR
	.CSECT	GET
;
;$NOSTR	=	1	;DELETE ';' TO ASSEMBLE FOR
;			;BASIC WITH NO STRINGS
R0=%0
R1=%1
R2=%2
R3=%3
R4=%4
R5=%5
SP=%6
PC=%7
NVAL=4
	.IFDF	$NOSTR
NVAL=3
	.ENDC	;$NOSTR
.TEXT=377
FAC1=40
FAC2=42
VARSAV=22
;-----------------------------------------------------------
; SUBROUTINE 'GETARG'	CALLED BY MOV  #TABLE,R0
;				  JSR  PC,GETARG
;				  .BYTE N1,N2,...,0
;				  .EVEN
;			WHERE TABLE IS THE ADDRESS OF A  
;			TABLE TO HOLD THE ARG REFERENCES.
;			N1,N2,ETC. INDICATE THE ARG TYPES:
;			1	INPUT NUMERIC EXPRESSION. 2
;				(THE EXPRESSION VALUE) ARE
;				STORED IN TABLE.
;			2	OUTPUT NUMERIC VARIABLE. 3 WORDS
;				ARE STORED IN TABLE.
;			STRING VERSION ONLY:
;			3	INPUT STRING EXPRESSION. NO WORDS
;				ARE STORED IN TABLE. THE STRING
;				POINTER IS ON THE STACK.
;			4	OUTPUT STRING VARIABLE. 3 WORDS
;				ARE STORED IN TABLE.
;			NO STRING VERSION:
;			3	INPUT STRING LITERAL. 2 WORDS
;				ARE STORED IN TABLE. WORD 1 CON-
;				TAINS THE START OF THE ASCII STRING.
;				WORD 2 CONTAINS THE LENGTH OF THE
;				STRING IN BYTES.
;			CHECKS THE SYNTAX OF THE CALLING
;			STATEMENT AND FINDS THE REQUESTED
;			ARGUMENT REFERENCES, STORING THEM
;			CONSECUTIVELY IN TABLE.
GETARG:	MOV	(SP)+,R3	;ADDR OF CALL IN R3
	MOVB	(R3)+,R2	;GET 1ST BYTE IN R2
	BLE	GETX		;NO ARGS, EXIT
	CMPB	(R1)+,#.LPAR	;CHECK STARTING '('
	BNE	GETERS		;NO, SYNTAX ERROR
	BR	GET2		;ENTER LOOP
GET1:	CMPB	(R1)+,#.COMMA	;CHECK ',' BETWEEN ARGS
	BNE	GETERS		;NO, SYNTAX ERROR
GET2:	CMP	R2,#NVAL	;CHECK VALID BYTE
	BHI	GETERA
	ASL	R2
	MOV	R0,R0S		;SAVE REGS
	MOV	R3,R3S
	MOV	BRTAB-2(R2),PC	;BRANCH TO ROUTINE
; NUMERIC EXPRESSION
NUMEXP:	JSR	PC,EVAL		;EVALUATE!
	BCS	GETERA		;STRING IS BAD
	MOV	R0S,R0		;RESTORE TABLE POINTER
	MOV	FAC1(R5),(R0)+
	MOV	FAC2(R5),(R0)+	;SAVE VALUE
	BR	NXTARG
; STRING EXPRESSION
STREXP:
	.IFNDF	$NOSTR
	JSR	PC,EVAL		;EVALUATE!
	BCC	GETERA		;NUMERIC IS BAD
	MOV	R0S,R0		;RESTORE TABLE POINTER
	BR	NXTARG
	.ENDC	;$NOSTR
	.IFDF	$NOSTR
	MOVB	(R1)+,-(SP)	;LOOK FOR STRING LITERAL
	CMPB	(SP),#.SQUOT	;CHECK QUOTE CHAR.
	BEQ	STR1
	CMPB	(SP),#.DQUOT
	BNE	GETERS
STR1:	CMPB	(R1)+,#.TEXT	;CHECK .TEXT TOKEN NEXT
	BNE	GETERS
	MOV	R0S,R0		;RESTORE TABLE POINTER
	MOV	R1,(R0)+	;SAVE STRING ADDRESS IN TABLE
	CLR	R2		;NOW FIND LENGTH
STR2:	TSTB	(R1)+		;END OF STRING IS BYTE 00
	BEQ	STR3
	INC	R2		;COUNT
	BR	STR2
STR3:	MOV	R2,(R0)+	;SAVE LENGTH IN TABLE
	CMPB	(SP)+,(R1)+	;CHECK MATCHING CLOSE QUOTE
	BNE	GETERS
	BR	NXTARG
	.ENDC	;$NOSTR
; NUMERIC TARGET VARIABLE
NUMVAR:	CLR	-(SP)		;REMEMBER IT'S NUMERIC
	.IFNDF	$NOSTR
	BR	VAR1
; STRING TARGET VARIABLE
STRVAR:	MOV	R2,-(SP)	;REMEMBER IT'S STRING
	.ENDC	;$NOSTR
VAR1:	MOVB	(R1)+,R2	;GET SYMTAB REF IN R2
	BMI	GETERS
	SWAB	R2
	BISB	(R1)+,R2
	ADD	(R5),R2
	JSR	PC,GETVAR	;ADDRESS VARIABLE
	MOV	R0S,R0		;RESTORE TABLE POINTER
	MOV	R5,R2		;ADDRESS VARSAV
	ADD	#VARSAV,R2
	MOV	(R2),R3		;SAVE A COPY
	MOV	(R2)+,(R0)+	;MOVE 3 WORDS INTO TABLE
	MOV	(R2)+,(R0)+
	MOV	(R2),(R0)+
	TST	(SP)+		;STRING OR NUM
	BNE	VAR2
	CMP	(R3),#-1	;NUMERIC, CHECK TYPE AGREES
	BEQ	GETERA
	BR	NXTARG
VAR2:	CMP	(R3),#-1
	BNE	GETERA
; GO TO NEXT ARGUMENT
NXTARG:	MOV	R3S,R3
	MOVB	(R3)+,R2	;GET NEXT BYTE IN R2
	BGT	GET1		;LOOP TILL BYTE IS 0
	CMPB	(R1)+,#.RPAR	;CHECK CLOSING ')'
	BNE	GETERS
GETX:	CMPB	(R1)+,#.EOL	;AND END-LINE TOKEN
	BNE	GETERS
	INC	R3		;MAKE SURE R3 IS EVEN
	ASR	R3
	ASL	R3
	JMP	(R3)
R0S:	.WORD	0
R3S:	.WORD	0
GETERA:	JMP	ERRARG
GETERS:	JMP	ERRSYN
BRTAB:	.WORD	NUMEXP
	.WORD	NUMVAR
	.WORD	STREXP
	.IFNDF	$NOSTR
	.WORD	STRVAR
	.ENDC	;$NOSTR
;---------------------------------------------------------
; SUBROUTINE 'STORE'	CALLED BY JSR PC,STORE
;			R0 POINTS TO 3-WORD ARG REFERENCE
;			SET UP BY GETVAR
;			SAVES THE VALUE OF THE FAC
;			IN THE SPECIFIED NUMERIC VARIABLE
STORE:	MOV	R5,R2		;ADDRESS VARSAV
	ADD	#VARSAV,R2
	MOV	(R0)+,(R2)+	;MOVE FROM TABLE TO USER AREA
	MOV	(R0)+,(R2)+
	MOV	(R0),(R2)
	JSR	PC,STOVAR	;STORE IT
	RTS	PC
;
	.IFNDF	$NOSTR
;----------------------------------------------------------
; SUBROUTINE 'SSTORE'	CALLED BY JSR PC,SSTORE
;			R0 POINTS TO 3-WORD ARG REFERENCE
;			SET UP BY GETVAR
;			STRING POINTER IS AT THE TOP OF STK
;			SAVES THE STRING AT TOP OF STK
;			IN THE SPECIFIED STRING VARIABLE
SSTORE:	MOV	R5,R2
	ADD	#VARSAV,R2	;ADDRESS VARSAV
	MOV	(R0)+,(R2)+	;MOVE FROM TBL TO USER AREA
	MOV	(R0)+,(R2)+
	MOV	(R0),(R2)
	MOV	(SP),R3		;SWITCH RETURN & STRING PTR
	MOV	2(SP),(SP)
	MOV	R3,2(SP)
	JSR	PC,STOSVAR	;STORE STRING
	RTS	PC		;RETURN
	.ENDC	;$NOSTR
	.END
                                                                                                                                                                                                        