; ICFGS.MAC -- CHARACTER GET/PUT ROUTINES ; AUTHOR: S. F. HEFFNER ; DATE WRITTEN: 5/2/76 ; DATE REVISED: 12/28/76,7/06/77 FOR ASCII USE ; .NLIST TOC ;TBL OF CONTENTS NOT WANTED ; .TITLE ICFGS .SBTTL CHARACTER GET/PUT ROUTINES ; ;***NOTE--THE FOLLOWING ROUTINES (ICHGS THRU ICSPC) ARE NOT ;***REENTRANT AND CAN'T BE, SINCE GNXCH/PNXCH DEPEND UPON ;***ICHGS ETC. TO SET UP AND STORE ARGUMENTS ACROSS CALLS. ; ;***ALSO, GNXCH AND PNXCH DON'T PRESERVE REGS! ; ; .MCALL SUBR,RTN .MCALL MINIT,PUSH,POP .MCALL CALL ; .GLOBL ICPG,IVECG,IPE,ICPP,IVECP;WS IN UCOM ; MINIT ; ; ICHGS--INITIALIZE CHAR GET SCAN ; GNXCH--GET NEXT CHAR ; ICFGS--ICHGS W/SPECIFIED MAX LENGTH ; ICSGC--ICHGS+GNXCH ; ; ICHPS--INITIALIZE CHAR PUT SCAN ; PNXCH--PUT NEXT CHAR ; ICSPC--ICHPS+PNXCH ; ; CALL ICHGS(VEC,IICP,ICP) ; CALL GNXCH(CHAR) ; CALL ICFGS(IPE,VEC,IICP,ICP) ; CALL ICSGC(VEC,IICP,ICP,CHAR) ; CALL ICHPS(VEC,IICP,ICP) ; CALL PNXCH(CHAR) ; CALL ICSPC(VEC,IICP,ICP,CHAR) ; WHERE: ; VEC = INTEGER*2 VECTOR ; IICP = INITIAL CHAR POSITION ; ICP = CHAR POSITION ; IPE = MAX NO. OF CHARS ; CHAR = INTEGER*2 VAR FOR CHAR ; CHW = 1 ;"CHAR WANTED" FLAG ; SUBR ICFGS,4 MOV @(R5)+,IPE ;GET MAX LGTH CLR R0 ;NO GNXCH WANTED BR CEPG1 ; SUBR ICSGC,4 MOV #CHW,R0 ;GNXCH WANTED BR CEPG ; SUBR ICHGS,3 CLR R0 ;NO GNXCH WANTED CEPG: MOV #77777,IPE ;NO MAX LGTH SPECD CEPG1: MOV (R5)+,IVECG ;SAVE VECTOR ADDR MOV @(R5)+,R2 ;GET INITL PTR VALUE MOV (R5)+,R1 ;GET PTR ADDR MOV R1,ICPG ;SAVE IT MOV R2,(R1) ;INIT PTR BIT R0,#CHW ;GNXCH WANTED? BEQ ICRTN ;IF NOT CALL GNXCH,<(R5)> ;YES, GET A CHAR ICRTN: RTN ;RTN TO CALLER ; ;*********************** ;*** SUBROUTINE GNXCH ;*********************** GNXCH:: MOV (R5)+,R0 ;NO. OF ARGS MOV (R5)+,R0 ;GET RSLT ADDR MOV ICPG,R3 ;GET PTR ADDR CMP (R3),IPE ;CK AGNST MAX LGTH BGT SZCH MOV IVECG,R1 ;GET VECTOR ADDR ADD (R3),R1 ;ADD PTR VAL DEC R1 ;CNTING FROM 0, NOT 1 MOVB (R1),(R0)+ ; TO CALLER CLRB (R0) ;ZERO LEFT BYTE INC (R3) ;UPDT PTR GNRTN: RTS PC ;BACK TO CALLER ; SZCH: CLR (R0) ;RTN NULL CHAR BR GNRTN ;BACK TO CALLER ; SUBR ICSPC,4 MOV #CHW,R0 ;PNXCH WANTED BR CEPP ; SUBR ICHPS,3 CLR R0 ;NO PNXCH WANTED CEPP: MOV (R5)+,IVECP ;SAVE VECTOR ADDR MOV @(R5)+,R2 ;GET INITL PTR VAL MOV (R5)+,R1 ;GET PTR ADDR MOV R1,ICPP ;SAVE IT MOV R2,(R1) ;INIT PTR BIT R0,#CHW ;PNXCH WANTED? BEQ IPRTN ;IF NOT CALL PNXCH,<(R5)> ;YES, PUT A CHAR IPRTN: RTN ;BACK TO CALLER ; ;*********************** ;*** SUBROUTINE PNXCH ;*********************** PNXCH:: MOV (R5)+,R0 ;NO. OF ARGS MOV (R5)+,R0 ;GET CHAR ADDR MOV ICPP,R3 ;GET PTR ADDR MOV IVECP,R1 ;GET VECTOR ADDR ADD (R3),R1 ;ADD PTR VAL DEC R1 ;CNTG FROM 0, NOT 1 MOVB (R0),(R1) ;INSERT CHAR INTO VEC INC (R3) ;UPDT PTR RTS PC ;BACK TO CALLER ; .PSECT ICHCOM,RW,GBL,D,OVR ICPG:: .WORD 0 IVECG:: .WORD 0 IPE:: .WORD 0 ICPP:: .WORD 0 IVECP:: .WORD 0 .END