.title getarg ;+ ; integer function getarg(narg, buf, size) ;- ap=%5 narg=2 buf=4 size=6 ; ; .psect $r.roi,con,ro,rel,lcl,i .enabl lsb getarg:: mov #eof,r0 ; assume invalid number clrb @buf(ap) ; initialize user buffer to null str mov @narg(ap),r1 ; get argument number blt 10$ ; return(EOF) if < 0 cmp r1,r$argc ; see if too large bge 10$ ; YES, return (EOF) clc ; multiply by 2 for word offset rol r1 ; into argv mov r$argv(r1),r1 ; address of nth arg string mov buf(ap),r2 ; address of destination buffer mov @size(ap),r0 ; size of target buffer beq 10$ ; if size is 0, done 1$: movb (r1)+,(r2)+ ; copy next character beq 2$ ; just copied EOS - done sob r0,1$ ; decrement bytes left and try again clrb -(r2) ; write EOS into last position inc r0 ; one less than max 2$: mov r0,r1 ; subtrahend in r1 mov @size(ap),r0 ; minuend in r0 sub r1,r0 ; number of characters in arg 10$: return .end