.title getioc ;+ ; subroutine getioc(fd, key, value) ; ; filedes fd ; integer key, value ; ; this routine will retrieve the particular characteristic ; specified by `key' into the variable `value'. ; ; Currently, the only valid keys are IOC_MODE, IOC_ECHO and IOC_TIMO ; which are legal only for terminals ; ; If an invalid file descriptor is passed, or if an invalid key is ; passed, then the value COOKED is returned. ;- ap=%5 fd=2 key=4 value=6 cooked=0 raw=1 .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 getioc:: mov #cooked,r3 ; assume really bad situation mov @fd(ap),r0 ; ratfor 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 mov @key(ap),r2 ; fetch key blt 110$ ; < 0 ==> invalid key cmp r2,#limit ; in range? bge 110$ ; NO clc ; clear c bit for multiply by 2 rol r2 ; have word offset br 111$ ; branch to common code 110$: clr r2 ; assume IOC_MODE 111$: add #dtable,r2 ; now have address of service routine jmp @(r2) ; go to service routine dotimo: mov r.timo(r1),r3 ; fetch timeout value mul #10.,r3 ; multiply by 10 br 100$ ; go finish up doecho: mov #yes,r3 ; assume echo bit #rf.rne,(r1) ; read/noecho? beq 100$ ; NO mov #no,r3 ; noecho br 100$ ; finish up domode: mov #cooked,r3 ; assume COOKED io bit #rf.raw,(r1) ; is it RAW? beq 100$ ; NO mov #raw,r3 ; set it to RAW br 100$ ; finish up 100$: mov r3,@value(ap) ; return value to user return .end