; *****************************************************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)