; VALPBS - PUT A STRING (BACK) IN VAL BUFFER ; LAST EDIT: 11-SEP-80 ; ;- .NLIST .LIST TTM .NLIST BEX .TITLE VALPBS .LIST ; ; ;+ ; ; ROUTINE TO PUSH A STRING INTO THE VAL BUFFER ; THE STRING IS THEN AT THE HEAD OF THE TYPEAHEAD BUFFER. ; ; CALL VALBPS([STR,[L]]) ; WHERE: STR IS TEXT STRING ; L IS STRING LENGTH ; IF L IS ABSENT A ZERO BYTE TERMINATES. ; ; IF STR IS NOT SUPPLIED THE STRING IS READ DIRECTLY FROM ; THE CURRENT OUTS BUFFER THUS: ; ; CALL OUT('###.###',A); CALL VALPBS ; ; PUSHES THE VALUE OF A INTO THE INPUT BUFFER. ; THE NEXT VAL CALL WILL THEN READ A. ; THIS PROVIDES AN INTERESTING MEANS OF PERFORMING INTER-TASK ; COMMUNICATION AS THE NEXT CALL MAY NOT BE IN THE SAME TASK. ; ; IF THE BUFFER IS TOO FULL TO ACCOMODATE THE STRING IT WILL BE ; TRUNCATED AT THE FIRST SPACE. ; ; ;- ; ; THIS MODULE SHOULD BE ASSEMBLED PRECEDED BY VALMFD.MAC ; ; .PSECT VALIO ; SPACE=40 ; RDOFF$ ; VALPBS::MOV R0,-(SP) MOV R1,-(SP) MOV R2,-(SP) MOV R3,-(SP) TSTB (R5) ;ANY ARGUMENTS ? BGT 1$ ;IF SO GO GET THEM MOV OUTIMP+16,BUFP ;PICK UP BUFFER POINTER FROM OUTS BR 2$ ;AND GO FIND LENGTH 1$: MOV P1(R5),BUFP ;SAVE BUFFER POINTER CMPB (R5),#2 ;LENGTH SPECIFIED ? BLT 2$ ;IF NOT ZEARCH FOR ZERO BYTE MOV @P2(R5),L ;ELSE SAVE LENGTH BR 10$ ;ON TO NEXT STAGE ; 2$: MOV BUFP,R0 ;START OF BUFFER CLR L 3$: TSTB (R0)+ ;END OF STRING ? BEQ 10$ ;BREAK IF SO INC L BR 3$ ; 10$: CALL VMAP ;MAP ONTO VAL REGION MOV RD.KP(R0),R2 ;GET CHARACTER POINTER SUB RD.IA(R0),R2 ;GET BUFFER OFFSET CMP R2,L ;ENOUGH SPACE AVAILABLE ? BEQ 30$ ;YES ITS DEAD EASY BGT 20$ ;HERE WE JUST HAVE TO COMPRESS THE BUFFER ; HERE WE HAVE TO EXPAND BUFFER MOV RD.KP(R0),R2 ;GET START OF ACTIVE BUFFER 11$: TSTB (R2)+ ;AND FIND END BNE 11$ DEC R2 SUB RD.KP(R0),R2 ;GET LENGTH OF BUFFER IN USE MOV R2,R3 ;GET TOTAL LENGTH REQUIRED ADD L,R3 SUB #80.,R3 ;AND COMPARE WITH BUFFER LENGTH BLE 14$ ;OK THERES ENOUGH ROOM SUB R3,R2 ;TRUNCATE BUFFER ADD RD.KP(R0),R2 ;AND POINT TO NEW END 12$: CMPB (R2),#SPACE ;AND SCAN BACKWARDS FOR SPACE BEQ 13$ CMP R2,RD.KP(R0) ;BEGINNING OF BUFFER BEQ 13$ DEC R2 BR 12$ 13$: CLRB (R2) ;INSERT NEW TERMINATION ; ; HERE WE SHIFT UP THE CURRENT BUFFER 14$: MOV RD.KP(R0),R2 SUB RD.IA(R0),R2 MOV L,R3 SUB R2,R3 MOV RD.KP(R0),R2 15$: TSTB (R2)+ BNE 15$ ADD R2,R3 16$: MOVB -(R2),-(R3) CMP R2,RD.KP(R0) BHI 16$ BR 30$ ; ; HERE WE SHIFT THE BUFFER DOWN TO OUR STRING 20$: SUB L,R2 ;GET THE SIZE OF THE SHIFT MOV RD.KP(R0),R3 ;POINT TO CURRENT BUFFER SUB R2,R3 ;OFFSET LENGTH MOV RD.KP(R0),R2 ;GET BACK POINTER 21$: MOVB (R2)+,(R3)+ ;COPY CHAR BNE 21$ ; ; NOW JUST COPY STRING TO BUFFER 30$: MOV BUFP,R2 MOV RD.IA(R0),R3 31$: MOVB (R2)+,(R3)+ DEC L BGT 31$ MOV RD.IA(R0),RD.KP(R0) ;RESET POINTER CALL VRSCTX MOV (SP)+,R3 MOV (SP)+,R2 MOV (SP)+,R1 MOV (SP)+,R0 RETURN ; ; L: .WORD 0 ;LENGTH OF STRING BUFP: .WORD 0 ;AND ITS ADDRESS ; .END