/ u7 -- unix canon: mov r5,r1 / move tty buffer address to r1 add $10.,r1 / add 10 to get start of data mov r1,4(r5) / canp = 10(r5) / move buffer addr + 10 to 3rd / word in buffer (char. pointer) clr 2(r5) / ncan / clear 2nd word in buffer, 0 char. count 1: jsr r0,*(r0) / jump to arg get char off Q of characters, sleep / if none jsr r0,cesc; 100 / test for @ (kill line) br canon / character was @ so start over jsr r0,cesc; 43 / test for # (erase last char. typed) br 1b / character was #, go back cmp r1,$4 / is char eot? beq 1f / yes, reset and return movb r1,*4(r5) / no, move char to address in 3rd word of buffer / (char. pointer) inc 2(r5) / increment 2nd word (char. count) inc 4(r5) / increment 3rd word (char. pointer) cmp r1,$'\n / is char = newline beq 1f / yes, 1f cmp 2(r5),$120. / is byte count greater than or equal to 120 bhis 1f / yes, 1f br 1b / no, get another char off the Q 1: / get here if line is full, a new line has been received or an eot / has been received mov r5,r1 / move buffer address to r1 add $10.,r1 / add 10 mov r1,4(r5) / canp = 10(r5) / reset char pointer tst (r0)+ / skip over argument rts r0 / return cesc: / test for erase or kill char cmp r1,(r0)+ / char in r1 = erase or kill character? bne 1f / no, skip return tst 2(r5) / yes, is char. count = 0 beq 2f / yes, don't skip return dec 2(r5) / no, decrement char count dec 4(r5) / decrement character pointer cmpb *4(r5),$'\\/ was previous character a "\" bne 2f / no, don't skip 1: tst (r0)+ / yes, skip 2: rts r0 / return ttych: / get characters from Q of characters inputted to tty mov $240,*$ps / set processor priority to 5 jsr r0,getc; 0 / takes char. off clist and puts it in r1 br 1f / list is empty, go to sleep clr *$ps / clear process priority rts r0 / return 1: / list is empty