.title getch ;+ ; c = getch(c, int) ; ; gets the next character on ratfor unit int ; ; returns it in variable c and as value of the function ; ; if error occurs or EOF on the file, the value EOF is returned ;- ap=%5 c=2 int=4 ; ; .mcall qiow$s,get$ ; ; .psect $r.roi,con,ro,rel,lcl,i .enabl lsb getch:: mov @int(ap),r0 ; get ratfor unit number == lun call r$gfbk ; get RFDB address in r1 bcs 100$ ; c set => invalid unit number bit #rf.clo,(r1) ; is the file open? bne 100$ ; NO bit #rf.raw,(r1) ; rawmode terminal? beq 10$ ; NO qiow$s #io.rne!tf.ral,@int(ap),r$ioef,,,, movb @c(ap),r0 ; return character bic #177600,r0 ; mask to 7 bits movb r0,@c(ap) ; return in variable return 10$: bit #rf.mod,(r1) ; inputmode? bne 20$ ; YES cmpb #rdwr$r,r.acc(r1) ; READWRITE unit? bne 100$ ; NO, error clr r.byte(r1) ; no bytes left in record bis #rf.mod,(r1) ; set to inputmode 20$: call r$cget ; get next character in r0 bcc 110$ ; c clear => success 100$: mov #eof,r0 ; return(EOF) 110$: movb r0,@c(ap) ; return character to user return .page .sbttl r$cget - get next cooked character into r0 ;+ ; this routine is called by getch and getlin ; ; inputs: ; r1 RFDB address ; ; outputs: ; r0 next character ; c bit set if error or end-of-file ; c bit clear if OK ; r2 is mangled ;- r$cget:: tst r.byte(r1) ; any bytes left in record? bgt 30$ ; YES mov r.buf0(r1),r2 ; buffer address in r2 mov r.fdb(r1),r0 ; address of FDB in r0 get$ ,r2,#511. ; get next record bcs 40$ ; c set => error or end-of-file mov r2,r.bufp(r1) ; save address in RFDB mov f.nrbd(r0),r0 ; number of bytes read bit #rf.ctl,(r1) ; LIST or FORT carriage control? beq 25$ ; NO add r0,r2 ; address of first free byte in buffer movb #newlin,(r2) ; place NEWLINE at end of buffer inc r0 ; increase count 25$: mov r0,r.byte(r1) ; number of bytes in record 30$: movb @r.bufp(r1),r0 ; character to return dec r.byte(r1) ; decrement no of bytes left inc r.bufp(r1) ; bump pointer clc ; c clear => OK 40$: return .end