parent
c8d01b6151
commit
af52270a29
@ -0,0 +1,44 @@ |
||||
( |
||||
; using a coroutine as a generator |
||||
|
||||
(spawn r15 fibo) |
||||
|
||||
(ld r0 20) |
||||
(:next) |
||||
|
||||
(ld r1 @r15) ; Read a yielded value |
||||
(call printnum r1) |
||||
(lds @cout ", ") |
||||
|
||||
(dec r0) |
||||
(j.nz :next) |
||||
(ld @cout '\n') |
||||
(halt) |
||||
|
||||
(proc fibo |
||||
(ld r0 0) |
||||
(ld r1 1) |
||||
(:x) |
||||
(yield r1) |
||||
(add r2 r0 r1) |
||||
(ld r0 r1) |
||||
(ld r1 r2) |
||||
(j :x) |
||||
) |
||||
|
||||
(proc printnum num |
||||
(mkbf r15) |
||||
(ld r1 num) |
||||
(tst r1 (<0? (mul r1 -1))) |
||||
(:next) |
||||
(mod r0 r1 10) |
||||
(add r0 '0') |
||||
(bfrpush @r15 r0) |
||||
(div r1 10 (z? |
||||
(tst num (<0? (bfrpush @r15 '-'))) |
||||
(lds @cout @r15) |
||||
(del @r15) |
||||
(ret))) |
||||
(j :next) |
||||
) |
||||
) |
@ -1,24 +1,41 @@ |
||||
( |
||||
; This is an example implementation of itoa using a buffer of characters |
||||
(ld r0 -123456789) |
||||
|
||||
|
||||
(mkbf r1) |
||||
(call itoa r1 r0) |
||||
|
||||
|
||||
; print it |
||||
(:pn) (bfrpop @cout @r1 (em? (ld @cout '\n') (halt))) (j :pn) |
||||
(halt) |
||||
|
||||
(proc itoa buf num |
||||
|
||||
(proc itoa buf num |
||||
(ld r1 num) |
||||
(tst r1 (<0? (mul r1 -1))) |
||||
(:next) |
||||
(mod r0 r1 10) |
||||
(add r0 '0') |
||||
(bfrpush @buf r0) |
||||
(div r1 10 (z? |
||||
(div r1 10 (z? |
||||
(tst num (<0? (bfrpush @buf '-'))) |
||||
(ret))) |
||||
(j :next) |
||||
) |
||||
|
||||
; other version that prints it |
||||
(proc printnum num |
||||
(mkbf r15) |
||||
(ld r1 num) |
||||
(tst r1 (<0? (mul r1 -1))) |
||||
(:next) |
||||
(mod r0 r1 10) |
||||
(add r0 '0') |
||||
(bfrpush @r15 r0) |
||||
(div r1 10 (z? |
||||
(tst num (<0? (bfrpush @r15 '-'))) |
||||
(lds @cout @r15) |
||||
(del @r15) |
||||
(ret))) |
||||
(j :next) |
||||
) |
||||
) |
||||
|
Loading…
Reference in new issue