1
0
mirror of https://github.com/DoctorWkt/unix-jun72.git synced 2026-01-11 23:53:34 +00:00
2008-04-26 00:04:36 +00:00

58 lines
2.2 KiB
Plaintext

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