br 1f / char in list, if none available branch to put / process to sleep / jsr r0,starlpt / try to output character / clr *$ps / set processor priority = 0 / rts r0 / return /1: / mov r1,-(sp) / place character on stack / jsr r0,sleep; 5 / put process to sleep / mov (sp)+,r1 / place character on stack / br lptoc getc: / get a character off character list mov (r0)+,r1 / put argument in getc call in r1 (char list id) jsr r0,get br 1f / empty char list return decb cc(r1) / decrement number of char in char list mov $-1,r1 / load minus 1 in r1 jsr r0,put / put char back on free list movb clist-2(r2),r1 / put char in r1 tst (r0)+ / bump r0 for non blank char list return 1: rts r0 putc: mov r1,-(sp) / save char on stack mov $-1,r1 / put free list list id in r1 jsr r0,get / take char off free list / clist slot taken / identified by r2 br 1f / branch when no chars in free list mov (r0)+,r1 / put putc call arg in r1 (i.e., list identifier) incb cc(r1) / increment character count for list (r1) jsr r0,put / put clist entry on list movb (sp),clist-2(r2) / put character in new entry 1: tst (r0)+ mov (sp)+,r1 rts r0 get: movb cf+1(r1),r2 / move current first char offset to r2 beq 2f / no characters in char list tst (r0)+ / bump r0, second return cmpb r2,cl+1(r1) / r2 equal to last char offset beq 1f / yes, (i.e., entire char list scanned), branch to 1f bic $!377,r2 / clear bits 8-15 in r2 asl r2 / multiply r2 by 2 to get offset in clist movb clist-1(r2),cf+1(r1) / move next char in list pointer to / first char offset ptr br 2f 1: clrb cf+1(r1) / clear first char clist offset clrb cl+1(r1) / clear last char clist offset bic $!377,r2 / zero top half of r2 asl r2 / multiply r2 by 2 2: rts r0