.symbol
 fp 30
 sp 29
 retval 28
 rads 27
 Q 1100
 qq 1101
 nump 1102
 currentp 1103
 freelist 1104
 full 1105
 empty 1106
 cnt1 1107
.code 0
 mov fp #3500
 mov sp #3000
 jal rads main
 trap r0 #0
; fun newp pv 0
:newp
st r1 @1 fp
add fp fp #2
st rads @0 fp
mov r1 #16
trap r1 #19
mov retval r28
jmp L101
:L101
ld rads @0 fp
sub fp fp #2
ld r1 @1 fp
ret rads
; fun newStack pv 0
:newStack
st r1 @1 fp
add fp fp #2
st rads @0 fp
mov r1 #64
trap r1 #19
mov retval r28
jmp L102
:L102
ld rads @0 fp
sub fp fp #2
ld r1 @1 fp
ret rads
; fun newFrame pv 0
:newFrame
st r1 @1 fp
add fp fp #2
st rads @0 fp
mov r1 #64
trap r1 #19
mov retval r28
jmp L103
:L103
ld rads @0 fp
sub fp fp #2
ld r1 @1 fp
ret rads
; fun new pv 1
:new
; gnAsg :(#2 (call malloc 2 ))
; gnAsg :(#2 freelist )
; gnAsg :(freelist (vec #2 1 ))
; gnAsg :((vec #2 0 )#1 )
; gnAsg :((vec #2 1 )0 )
st r1 @1 fp
st r2 @2 fp
st r3 @3 fp
st r4 @4 fp
add fp fp #5
st rads @0 fp
pop sp r1
ld r3 freelist
eq r4 r3 #0
jf r4 L105
mov r3 #2
trap r3 #19
mov r2 r28
jmp L106
:L105
ld r2 freelist
mov r4 #1
ld r3 +r2 r4
st r3 freelist
:L106
mov r3 #0
st r1 +r2 r3
mov r3 #0
mov r4 #1
st r3 +r2 r4
mov retval r2
jmp L104
:L104
ld rads @0 fp
sub fp fp #5
ld r4 @4 fp
ld r3 @3 fp
ld r2 @2 fp
ld r1 @1 fp
ret rads
; fun appendL pv 2
:appendL
; gnAsg :((vec #1 0 )#2 )
; gnAsg :(#3 (vec #1 1 ))
; gnAsg :((vec #3 1 )#2 )
; gnAsg :((vec #1 1 )#2 )
; gnAsg :((vec #2 1 )(vec #1 0 ))
st r1 @1 fp
st r2 @2 fp
st r3 @3 fp
st r4 @4 fp
st r5 @5 fp
add fp fp #6
st rads @0 fp
pop sp r2
pop sp r1
mov r5 #0
ld r4 +r1 r5
eq r5 r4 #0
jf r5 L108
mov r4 #0
st r2 +r1 r4
jmp L109
:L108
mov r5 #1
ld r4 +r1 r5
mov r3 r4
mov r4 #1
st r2 +r3 r4
:L109
mov r4 #1
st r2 +r1 r4
mov r5 #0
ld r4 +r1 r5
mov r5 #1
st r4 +r2 r5
:L107
ld rads @0 fp
sub fp fp #6
ld r5 @5 fp
ld r4 @4 fp
ld r3 @3 fp
ld r2 @2 fp
ld r1 @1 fp
ret rads
; fun enqueue pv 2
:enqueue
st r1 @1 fp
st r2 @2 fp
add fp fp #3
st rads @0 fp
pop sp r2
pop sp r1
push sp r1
push sp r2
jal rads new
push sp r28
jal rads appendL
:L110
ld rads @0 fp
sub fp fp #3
ld r2 @2 fp
ld r1 @1 fp
ret rads
; fun dequeueQ pv 0
:dequeueQ
; gnAsg :(nump (- nump 1 ))
; gnAsg :(#1 currentp )
; gnAsg :((vec #1 3 )0 )
st r1 @1 fp
st r2 @2 fp
st r3 @3 fp
add fp fp #4
st rads @0 fp
ld r2 nump
sub r3 r2 #1
st r3 nump
ld r1 currentp
mov r2 #0
mov r3 #3
st r2 +r1 r3
:L111
ld rads @0 fp
sub fp fp #4
ld r3 @3 fp
ld r2 @2 fp
ld r1 @1 fp
ret rads
; fun createp pv 1
:createp
; gnAsg :(#2 (call newp ))
; gnAsg :((vec #2 0 )#1 )
; gnAsg :((vec #2 1 )(+ (call newStack )16 ))
; gnAsg :((vec #2 2 )(call newFrame ))
; gnAsg :((vec #2 3 )1 )
; gnAsg :(nump (+ nump 1 ))
st r1 @1 fp
st r2 @2 fp
st r3 @3 fp
st r4 @4 fp
add fp fp #5
st rads @0 fp
pop sp r1
jal rads newp
mov r2 r28
mov r3 #0
st r1 +r2 r3
jal rads newStack
add r3 r28 #16
mov r4 #1
st r3 +r2 r4
jal rads newFrame
mov r3 #2
st r28 +r2 r3
mov r3 #1
mov r4 #3
st r3 +r2 r4
ld r3 Q
push sp r3
push sp r2
jal rads enqueue
ld r3 nump
add r4 r3 #1
st r4 nump
mov retval r2
jmp L112
:L112
ld rads @0 fp
sub fp fp #5
ld r4 @4 fp
ld r3 @3 fp
ld r2 @2 fp
ld r1 @1 fp
ret rads
; fun nextQ pv 0
:nextQ
; gnAsg :(qq (vec qq 1 ))
st r1 @1 fp
st r2 @2 fp
st r3 @3 fp
add fp fp #4
st rads @0 fp
mov r2 #1
ld r3 qq
ld r1 +r3 r2
st r1 qq
mov r2 #0
ld r3 qq
ld r1 +r3 r2
mov retval r1
jmp L113
:L113
ld rads @0 fp
sub fp fp #4
ld r3 @3 fp
ld r2 @2 fp
ld r1 @1 fp
ret rads
; fun nextp pv 0
:nextp
; gnAsg :(#1 (call nextQ ))
; gnAsg :(#1 (call nextQ ))
st r1 @1 fp
st r2 @2 fp
st r3 @3 fp
add fp fp #4
st rads @0 fp
jal rads nextQ
mov r1 r28
jmp L115
:L116
jal rads nextQ
mov r1 r28
:L115
mov r3 #3
ld r2 +r1 r3
eq r3 r2 #0
jt r3 L116
mov retval r1
jmp L114
:L114
ld rads @0 fp
sub fp fp #4
ld r3 @3 fp
ld r2 @2 fp
ld r1 @1 fp
ret rads
; fun terminate pv 0
:terminate
add fp fp #1
st rads @0 fp
di #0
jal rads dequeueQ
int #0
:L117
ld rads @0 fp
sub fp fp #1
ret rads
; fun int0 pv 0
:int0
; gnAsg :(currentp (call nextp ))
di #0
trap sp #15
push sp rads
push sp retval
ld r1 currentp
st r31 @0 r1
st sp @1 r1
st fp @2 r1
ld r1 nump
eq r2 r1 #0
jf r2 L119
trap r0 #0
:L119
jal rads nextp
st r28 currentp
ld r1 currentp
ld r31 @0 r1
ld sp @1 r1
ld fp @2 r1
pop sp retval
pop sp rads
trap sp #16
:L118
reti
; fun boot pv 0
:boot
; gnAsg :(currentp (call newp ))
add fp fp #1
st rads @0 fp
jal rads newp
st r28 currentp
int #0
:L120
ld rads @0 fp
sub fp fp #1
ret rads
; fun free pv 1
:free
; gnAsg :((vec #1 1 )freelist )
; gnAsg :(freelist #1 )
st r1 @1 fp
st r2 @2 fp
st r3 @3 fp
add fp fp #4
st rads @0 fp
pop sp r1
ld r2 freelist
mov r3 #1
st r2 +r1 r3
st r1 freelist
:L121
ld rads @0 fp
sub fp fp #4
ld r3 @3 fp
ld r2 @2 fp
ld r1 @1 fp
ret rads
; fun dequeue pv 1
:dequeue
; gnAsg :(#2 (vec #1 0 ))
; gnAsg :(#3 (vec #1 1 ))
; gnAsg :((vec #1 0 )0 )
; gnAsg :((vec #1 1 )0 )
; gnAsg :(#4 (vec #2 1 ))
; gnAsg :((vec #1 0 )#4 )
; gnAsg :((vec #3 1 )#4 )
; gnAsg :(#5 (vec #2 0 ))
st r1 @1 fp
st r2 @2 fp
st r3 @3 fp
st r4 @4 fp
st r5 @5 fp
st r6 @6 fp
st r7 @7 fp
add fp fp #8
st rads @0 fp
pop sp r1
mov r7 #0
ld r6 +r1 r7
mov r2 r6
mov r7 #1
ld r6 +r1 r7
mov r3 r6
eq r6 r2 r3
jf r6 L123
mov r6 #0
mov r7 #0
st r6 +r1 r7
mov r6 #0
mov r7 #1
st r6 +r1 r7
jmp L124
:L123
mov r7 #1
ld r6 +r2 r7
mov r4 r6
mov r6 #0
st r4 +r1 r6
mov r6 #1
st r4 +r3 r6
:L124
mov r7 #0
ld r6 +r2 r7
mov r5 r6
push sp r2
jal rads free
mov retval r5
jmp L122
:L122
ld rads @0 fp
sub fp fp #8
ld r7 @7 fp
ld r6 @6 fp
ld r5 @5 fp
ld r4 @4 fp
ld r3 @3 fp
ld r2 @2 fp
ld r1 @1 fp
ret rads
; fun blockp pv 0
:blockp
st r1 @1 fp
add fp fp #2
st rads @0 fp
mov r1 #42
trap r1 #2
ld r1 currentp
trap r1 #1
jal rads dequeueQ
int #0
:L125
ld rads @0 fp
sub fp fp #2
ld r1 @1 fp
ret rads
; fun wakeup pv 1
:wakeup
; gnAsg :(nump (+ nump 1 ))
; gnAsg :((vec #1 3 )1 )
st r1 @1 fp
st r2 @2 fp
st r3 @3 fp
add fp fp #4
st rads @0 fp
pop sp r1
mov r2 #33
trap r2 #2
trap r1 #1
ld r2 nump
add r3 r2 #1
st r3 nump
mov r2 #1
mov r3 #3
st r2 +r1 r3
:L126
ld rads @0 fp
sub fp fp #4
ld r3 @3 fp
ld r2 @2 fp
ld r1 @1 fp
ret rads
; fun newsem pv 1
:newsem
; gnAsg :(#2 (call malloc 2 ))
; gnAsg :((vec #2 0 )#1 )
; gnAsg :((vec #2 1 )(call new 0 ))
st r1 @1 fp
st r2 @2 fp
st r3 @3 fp
add fp fp #4
st rads @0 fp
pop sp r1
mov r3 #2
trap r3 #19
mov r2 r28
mov r3 #0
st r1 +r2 r3
mov r3 #0
push sp r3
jal rads new
mov r3 #1
st r28 +r2 r3
mov retval r2
jmp L127
:L127
ld rads @0 fp
sub fp fp #4
ld r3 @3 fp
ld r2 @2 fp
ld r1 @1 fp
ret rads
; fun wait pv 1
:wait
; gnAsg :((vec #1 0 )(- (vec #1 0 )1 ))
st r1 @1 fp
st r2 @2 fp
st r3 @3 fp
add fp fp #4
st rads @0 fp
pop sp r1
di #0
mov r3 #0
ld r2 +r1 r3
sub r3 r2 #1
mov r2 #0
st r3 +r1 r2
mov r3 #0
ld r2 +r1 r3
lt r3 r2 #0
jf r3 L129
mov r3 #1
ld r2 +r1 r3
push sp r2
ld r2 currentp
push sp r2
jal rads enqueue
jal rads blockp
jmp L130
:L129
ei #0
:L130
:L128
ld rads @0 fp
sub fp fp #4
ld r3 @3 fp
ld r2 @2 fp
ld r1 @1 fp
ret rads
; fun signal pv 1
:signal
; gnAsg :((vec #1 0 )(+ (vec #1 0 )1 ))
; gnAsg :(#2 (call dequeue (vec #1 1 )))
st r1 @1 fp
st r2 @2 fp
st r3 @3 fp
st r4 @4 fp
add fp fp #5
st rads @0 fp
pop sp r1
di #0
mov r4 #0
ld r3 +r1 r4
add r4 r3 #1
mov r3 #0
st r4 +r1 r3
mov r4 #0
ld r3 +r1 r4
le r4 r3 #0
jf r4 L132
mov r4 #1
ld r3 +r1 r4
push sp r3
jal rads dequeue
mov r2 r28
push sp r2
jal rads wakeup
:L132
ei #0
:L131
ld rads @0 fp
sub fp fp #5
ld r4 @4 fp
ld r3 @3 fp
ld r2 @2 fp
ld r1 @1 fp
ret rads
; fun reader pv 0
:reader
st r1 @1 fp
add fp fp #2
st rads @0 fp
jmp L134
:L135
ld r1 full
push sp r1
jal rads wait
mov r1 #43
trap r1 #2
ld r1 cnt1
trap r1 #1
ld r1 empty
push sp r1
jal rads signal
:L134
mov r1 #1
jt r1 L135
:L133
ld rads @0 fp
sub fp fp #2
ld r1 @1 fp
ret rads
; fun writer pv 0
:writer
; gnAsg :(cnt1 0 )
; gnAsg :(cnt1 (+ cnt1 1 ))
st r1 @1 fp
st r2 @2 fp
add fp fp #3
st rads @0 fp
mov r1 #0
st r1 cnt1
jmp L137
:L138
ld r1 empty
push sp r1
jal rads wait
ld r1 cnt1
add r2 r1 #1
st r2 cnt1
ld r1 cnt1
trap r1 #1
ld r1 full
push sp r1
jal rads signal
:L137
mov r1 #1
jt r1 L138
:L136
ld rads @0 fp
sub fp fp #3
ld r2 @2 fp
ld r1 @1 fp
ret rads
; fun printqueue pv 0
:printqueue
; gnAsg :(#1 (vec Q 0 ))
; gnAsg :(#2 (vec Q 1 ))
; gnAsg :(#3 (vec #1 0 ))
; gnAsg :(#4 (vec #2 0 ))
st r1 @1 fp
st r2 @2 fp
st r3 @3 fp
st r4 @4 fp
st r5 @5 fp
st r6 @6 fp
st r7 @7 fp
add fp fp #8
st rads @0 fp
mov r6 #0
ld r7 Q
ld r5 +r7 r6
mov r1 r5
mov r6 #1
ld r7 Q
ld r5 +r7 r6
mov r2 r5
mov r6 #0
ld r5 +r1 r6
mov r3 r5
mov r6 #0
ld r5 +r2 r6
mov r4 r5
mov r5 #81
trap r5 #2
mov r5 #32
trap r5 #2
trap r3 #1
trap r4 #1
mov r5 #10
trap r5 #2
mov r5 #112
trap r5 #2
mov r5 #99
trap r5 #2
mov r5 #98
trap r5 #2
mov r5 #32
trap r5 #2
trap r3 #1
mov r6 #0
ld r5 +r3 r6
trap r5 #1
mov r5 #10
trap r5 #2
mov r5 #112
trap r5 #2
mov r5 #99
trap r5 #2
mov r5 #98
trap r5 #2
mov r5 #32
trap r5 #2
trap r4 #1
mov r6 #0
ld r5 +r4 r6
trap r5 #1
mov r5 #10
trap r5 #2
:L139
ld rads @0 fp
sub fp fp #8
ld r7 @7 fp
ld r6 @6 fp
ld r5 @5 fp
ld r4 @4 fp
ld r3 @3 fp
ld r2 @2 fp
ld r1 @1 fp
ret rads
; fun main pv 0
:main
; gnAsg :(nump 0 )
; gnAsg :(freelist 0 )
; gnAsg :(Q (call malloc 2 ))
; gnAsg :(#1 (call createp (& reader )))
; gnAsg :(#1 (call createp (& writer )))
; gnAsg :(qq (vec Q 0 ))
; gnAsg :(full (call newsem 0 ))
; gnAsg :(empty (call newsem 1 ))
st r1 @1 fp
st r2 @2 fp
st r3 @3 fp
st r4 @4 fp
add fp fp #5
st rads @0 fp
mov r1 #int0
st r1 1000
di #0
mov r2 #0
st r2 nump
mov r2 #0
st r2 freelist
mov r2 #2
trap r2 #19
st r28 Q
mov r2 #reader
push sp r2
jal rads createp
mov r1 r28
mov r2 #writer
push sp r2
jal rads createp
mov r1 r28
mov r3 #0
ld r4 Q
ld r2 +r4 r3
st r2 qq
jal rads printqueue
mov r2 #0
push sp r2
jal rads newsem
st r28 full
mov r2 #1
push sp r2
jal rads newsem
st r28 empty
mov r2 #300
trap r2 #13
jal rads boot
:L140
ld rads @0 fp
sub fp fp #5
ld r4 @4 fp
ld r3 @3 fp
ld r2 @2 fp
ld r1 @1 fp
ret rads
.data 200
.end
