; *****************************************************RELOG.SBR ; ; RELOG - Log into another account from in BASIC ; - Returns account you were logged into ; - (Useful in getting around BASIC's error 23 -Protection voilation) ; ; BY DAVE PARKER, SNOWMASS VILLAGE, CO 81615, 303-923-4263 ; ; USAGE XCALL RELOG,RELOG$,DERR ; (RELOG$ Sends acocunt you want to log into) ; (RELOG$ Returns account you were logged into) ; (DERR Returns 1 if error occured) ; ; NOTE: This procedure doesn't change the disk you are logged into, ; just the account. I usually use this call in pairs surrounding ; a write statement to another account. Since RELOG returns the ; account you were logged into, you just need to call it again. ; RANDOM FILES MUST BE OPENED AS 'RANDOM'FORCED' DGP ; ;EXAMPLE: MAP1 TESTREC,X,512 ; REM --->CURRENT LOG IS [100,1] ; OPEN #1,"TEST.DAT[101,1]",RANDOM'FORCED,512,R1 ; R1=0 ; RELOG$="[101,1]" ; REM --->SWITCH ACCOUNTS SO YOU WON'T GET ERROR 23 ; XCALL RELOG,RELOG$ ; REM --->YOU ARE NOW LOGGED INTO [101,1] ; WRITE #1,TESTREC ; XCALL RELOG,RELOG$ ; REM --->YOU ARE BACK IN [100,1] ; ; ;Edit History: ; 1.0 24-Feb-86 created. /DGP ; ; ;Program version number VMAJOR=1 VMINOR=0 OBJNAM RELOG.SBR SEARCH SYS SEARCH SYSSYM ; INDEXES FOR MEMORY USAGE AFTER A4 PPN.W=0 ; WORKSPACE OLD PPN PPM.W=1 ; WORKSPACE OLD PPN WOR.W=2 ; WORKSPACE FOR CONVERTING NEW PPN START: PHDR -1,0,PH$REE!PH$REU ; program header MOVW @A3,D1 ; TWO ARGUMENTS PASSED CMPW D1,#2. JNE GETOUT MOV #1.,16(A3) ; MOVE ERROR FLAG INTO SECOND ARG MOVW 2(A3),D1 ; ONLY STRING ALLOWED CMPW D1,#2. JNE GETOUT MOV 10(A3),D1 ; CHECK STRING LENGTH AT LEAST 9 BYTES CMP D1,#9. JLO GETOUT JOBIDX LEA A0,JOBUSR(A6) MOVW @A0,PPN.W(A4) ; HOLD OLD PPN FOR LATER MOV 4(A3),A1 ; A1 POINTS TO INPUT VARIBLE LEA A0,WOR.W(A4) ; A0 POINTS TO FREE MEMORY WORKSPACE LOOP1: MOVB (A1)+,D1 ; MOVE NEXT WORD OF VARIABLE IN D1 CMP D1,#133 ; SEE IF OPEN BRACKET BEQ LOOP1 ; IGNORE IF IT CMP D1,#0. ; SEE IF BLANK JEQ GETOUT ; OOPS IF IT IS CMP D1,#135 ; SEE IF CLOSING BRACKET JEQ GETOUT ; OOPS IF IT IS MOVB D1,(A0)+ CMP D1,#54 ; IS IT A COMMA BNE LOOP1 ; GET NEXT IF IT IS NOT ; WRITE PROJECT NUMBER TO JOBIDX LEA A2,WOR.W(A4) GTOCT ; D1 NOW HOLDS NEW PROJECT # JMI GETOUT JOBIDX A0 LEA A2,JOBUSR(A0) ; A2 POINTS AT CURRENT PPR MOVB D1,1(A2) LEA A0,WOR.W(A4) LOOP2: MOVB (A1)+,D1 ; MOVE NEXT WORD OF VARIABLE IN D1 CMP D1,#0. ; SEE IF BLANK JEQ GETOUT ; OOPS IF IT IS MOVB D1,(A0)+ CMP D1,#135 ; SEE IF CLOSING BRACKET BNE LOOP2 ; LOOP IF IT IS NOT LEA A2,WOR.W(A4) GTOCT ; D1 NOW HOLDS PRGMR # JMI GETOUT JOBIDX A0 LEA A2,JOBUSR(A0) ; A2 POINTS AT CURRENT PPN MOVB D1,@A2 ; WE ARE NOW LOGGED INTO NEW ACCT ; WRITE OLD LOG INTO RELOG$ MOV 4(A3),A2 ; A0 POINTS TO VARIABLE TO FILL UP MOVB #91.,(A2)+ ; WRITE BEGINNING BRACKET MOVB PPM.W(A4),D1 ; MOVE PPM TO D1 OCVT 0,OT$MEM ; STORE IT IN RELOG$ MOVB #44.,(A2)+ ; WRITE THE COMMA MOVB PPN.W(A4),D1 ; D1 HOLD OLD PPN OCVT 0,OT$MEM ; STORE IT IN RELOG$ MOVB #93.,(A2)+ ; WRITE CLOSING BRACKET MOVB #0.,(A2)+ ; WRITE ZERO BYTE CLR 16(A3) GETOUT: RTN EXIT END .