put:
        asr    r2 / divide r2 by 2; r2 is offset in clist
        mov    r2,-(sp) / save r2 on stack
        movb   cl+1(r1),r2 / move offset of last char in list (r1) into r2
        beq    1f / offset = 0 then go to 1f (i.e., start a new list)
        bic    $!377,r2 / zero top half of r2
        asl    r2 / multiply offset by 2, r2 now has offset in clist
        movb   (sp),clist-1(r2) / link new list entry to current last
                                / entry in list (r1)
        br     2f
1:
        movb   (sp),cf+1(r1) / put new list entry offset into first char
                             / offset of list (r1)
2:
        mov    (sp)+,r2 / pop stack into r2; offset of new list
                        / entry in r2
        movb   r2,cl+1(r1) / make new list entry the last entry in list
                           / (r1)
        asl    r2 / multiply r2 by 2; r2 has clist offset for new
                  / list entry
        rts    r0

iopen: / open file whose i-number is in r1
        tst    r1 / write or read access?
        blt    2f / write, go to 2f
        jsr    r0,access; 2 / get inode into core with read access
        cmp    r1,$40. / is it a special file
        bgt    3f / no. 3f
        mov    r1,-(sp) / yes, figure out
        asl    r1
        jmp    *1f-2(r1) / which one and transfer to it
1:
        otty   / tty
        oppt   / ppt
        sret   / mem
        sret    / rf0
        sret   / rk0
        sret   / tap0
        sret   / tap1
        sret   / tap2
        sret   / tap3
        sret   / tap4
        sret   / tap5
        sret   / tap6
        sret   / tap7
        ocvt   / tty0
        ocvt   / tty1
        ocvt   / tty2
        ocvt   / tty3
        ocvt   / tty4
        ocvt   / tty5
        ocvt   / tty6
        ocvt   / tty7
        error / crd

