; VALREC - RECORD ROUTINES FOR CLONE ; LAST EDIT: 11-SEP-80 ; ;- .NLIST .TITLE VALREC .LIST TTM .NLIST BEX .LIST ; .IDENT /V003/ ; ;+ ; ; THE MODULE VALREC CONTAINS THE FOLLOWING ENTRY POINTS: ; RECINT - RECORD AN INTEGER VALUE FOR CLONE ; RECSTR - RECORD A STRING VALUE FOR CLONE ; RECLOG - RECORD A LOGICAL VALUE FOR CLONE ; ; CALLING FORMAT: ; CALL RECXXX([NAME],VALUE) ; WHERE: NAME IS ZERO TERMINATED STRING OF <=6 NON-NULL CHARACTERS ; VALUE IS VALUE TO RECORD AS FOLLOWS: ; RECINT - 16 BIT INTEGER ; RECSTR - ZERO TERMINATED STRING ; RECLOG - LOGICAL VALUE 0=FALSE, ELSE TRUE ; ; RECORD IS A NON-OPERATION IF CLONE IS NOT CONNECTED. ; FOR A TASK RUNNING UNDER CLONE A RECORD REQUEST WILL ; CAUSE THE SPECIFIED VALUE TO BE ASSOCIATED WITH THE ; SPECIFIED NAME AND STORED WITHIN CLONE UNTIL RETRIEVED ; WITH A 'GET' REQUEST. ; ; ;- .PSECT VALCL1 ; ; ; ; DEFINE CLONE DATA MODES M.STR=1 M.NUM=2 M.BOO=3 ; VC.VAL=&177776 ; FORCE EVEN OFFSET ; RECINT::CALL VMAP CALL TEST ;ARE WE CONNECTED MOV #M.NUM,VC.VAL(R1);STORE MODE MOV @P2(R5),VC.VAL+2(R1);AND STORE VALUE BR CMN ; RECSTR::CALL VMAP CALL TEST MOV R1,R3 ;POINT TO VALUE BUFFER ADD #VC.VAL,R3 MOV #M.STR,(R3)+ ;STORE MODE MOV P2(R5),R2 ;GET STRING MOV #79.,R4 ;MAXIMUM LENGTH 1$: MOVB (R2)+,(R3)+ BEQ 2$ ;BREAK AT END SOB R4,1$ CLRB (R3) ;TRUNCATE STRING 2$: BR CMN ; RECLOG::CALL VMAP CALL TEST MOV #M.BOO,VC.VAL(R1);SET MODE MOV @P2(R5),VC.VAL+2(R1);AND VALUE ; ; CMN: MOV P1(R5),R2 ;COPY NAME MOV R1,R3 ADD #VC.NAM,R3 CMP R2,#-1 ;NAME MAY BE NULL BEQ 2$ ;IF SO TERMINATE STRING MOV #6,R4 1$: MOVB (R2)+,(R3)+ BEQ 3$ DEC R4 BGT 1$ 2$: CLRB (R3) 3$: MOV #FU.REC,R2 CALL CL1$ ;SEND MESSAGE RECDON: CALL VRSCTX ;RESTORE USER CONTEXT RETURN ; ; TEST - INTERNAL ROUTINE TO RETURN IF CLONE NOT CONNECTED ; RETURN ADDRESS IN CALLING ROUTINE MUST BE ON TOP OF STACK ; TEST: BIT #ST.CL1,VC.STA(R1);IS CLONE CONNECTED BEQ 1$ ;SKIP IF NOT RETURN ;RETURN NORMALY 1$: TST (SP)+ ;ELSE RETURN DIRECTLY BR RECDON ;TO USER ; .END