.title setioc ;+ ; integer function setioc(fd, key, value) ; ; filedes fd ; integer key, value ; ; returns (OK/ERR) ; ; this routine will set the particular characteristic ; specified by `key' to `value'. If successful, OK is returned ; as the function value, else ERR is returned. ; ; Currently, only the keys IOC_MODE, IOC_ECHO and IOC_TIMO are ; defined, only for terminal devices ;- ap=%5 fd=2 key=4 value=6 cooked=0 .psect $r.rod,con,ro,rel,lcl,d dtable: domode,doecho,dotimo limit=<.-dtable>/2 .psect $r.roi,con,ro,rel,lcl,i .enabl lsb setioc:: mov @fd(ap),r0 ; rat4 unit number call r$gfbk ; get RFDB address bcs 100$ ; c set => invalid unit bit #rf.clo,(r1) ; is unit open? bne 100$ ; NO, error bit #rf.tty,(r1) ; is this a terminal? beq 100$ ; NO mov @key(ap),r2 ; fetch key blt 100$ ; < 0 ==> invalid key cmp r2,#limit ; in range? bge 100$ ; NO clc ; clear c bit for multiply by 2 rol r2 ; have word offset add #dtable,r2 ; now have address of service routine jmp @(r2) ; go to service routine dotimo: clr r2 ; make it a 32-bit integer mov @value(ap),r3 ; get value from user beq 10$ ; 0 ==> no timeout dec r3 ; (n - 1) div #10.,r2 ; (n - 1) / 10 inc r2 ; (n - 1) / 10 + 1 10$: mov r2,r.timo(r1) ; save in timeout field br 50$ ; go finish up doecho: bic #rf.rne,(r1) ; assume read/echo cmp #no,@value(ap) ; turn off echo? bne 50$ ; NO, finish up bis #rf.rne,(r1) ; set read/noecho br 50$ ; finish up domode: cmp @fd(ap),#errout ; is this ERROUT? beq 100$ ; YES, cannot reset ERROUT bic #rf.raw,(r1) ; assume COOKED cmp #cooked,@value(ap) ; is mode == COOKED beq 50$ ; YES, done bis #rf.raw,(r1) ; set unit to raw mode br 50$ ; finish up 50$: mov #ok,r0 ; return(OK) br 110$ 100$: mov #err,r0 ; return(ERR) 110$: return .end