.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