code:putc - ikarishinjieva/unixV6-code-analyze-chs GitHub Wiki
- 向字符缓存池写入一个字符
- 传入2个参数
- 参数1:一个字符
- 参数2:struct clist的地址
- 返回值
- 若成功写入,返回0
- 否则返回一个非零值
0967 _putc:
0968 mov 2(sp),r0
0969 mov 4(sp),r1
0970 mov PS,-(sp)
0971 mov r2,-(sp)
0972 mov r3,-(sp)
0973 bis $340,PS
0974 bic $100,PS / spl 5
0975 mov 4(r1),r2 / last ptr
0976 bne 1f
0977 mov _cfreelist,r2
- 判断clist.c-cl是否为空指针,若不是,跳到983行执行,否则继续
0978 beq 9f
- 从自由字符缓存队列取出位于队首的缓存,并将其指针赋给R2
0979 mov (r2),_cfreelist
- 若cfreelist为空指针,表明自由字符缓存队列为空,分配失败,跳转至1001行,否则继续
0980 clr (r2)
- cfreelist 指向 原先自由字符缓存队列中的第二个缓存
0981 mov r2,2(r1)+ / first ptr
- 新分配缓存的c_next 置为 NULL
- 同时 R2指向新分配缓存块的第一个字符存放的位置
0982 br 2f
0983 1:
- struct clist.c-cf 指向 新分配缓存的第一个字符
0984 bit $7,r2
0985 bne 2f
0986 mov _cfreelist,r3
0987 beq 9f
0988 mov (r3),_cfreelist
0989 mov r3,-10(r2)
- 986 - 998行类似于977 -979行,此处不再赘述
0990 mov r3,r2
0991 clr (r2)+
- 队尾缓存块的c_next → R3,R3 → R2
- 于是当前R2中存放的是新分配缓存块的首地址
0992 2:
- 新分配缓存的c_next 置为 NULL
- 同时 R2指向新分配缓存块的第一个字符存放的位置
0993 movb r0,(r2)+
0994 mov r2,4(r1)
0995 inc (r1) / count
0996 clr r0
- 将字符c写入I/O字符缓存队列的队尾
- 更新队尾指针
- struct clist.c-cc加1
0997 mov (sp)+,r3
- 0 → R0,用于返回0,表明字符写入缓存池成功
0998 mov (sp)+,r2
0999 mov (sp)+,PS
1000 rts pc
1001 9:
- 以下为缓存分配失败后的处理
1002 mov pc,r0
1003 mov (sp)+,r3
- 0 → R0,用于返回一个非0值,表明字符写入缓存池失败
1004 mov (sp)+,r2
1005 mov (sp)+,PS
1006 rts pc