From 3c6ce827a002c54deb88e40cbddddb03866e695b Mon Sep 17 00:00:00 2001 From: Case Duckworth Date: Wed, 6 Jul 2022 22:00:30 -0500 Subject: Big update --- examples/add2.tf | 500 ++++++++++++++++++++++++++++++++++++++++++++++++ examples/hello-world.bf | 55 +++--- examples/hello-world.tf | 388 +++++++++++++++++++++++++++++++++++++ examples/printchar.bf | 5 + examples/printchar.tf | 10 + examples/rot13.tf | 215 +++++++++++++++++++++ 6 files changed, 1145 insertions(+), 28 deletions(-) create mode 100644 examples/add2.tf create mode 100644 examples/hello-world.tf create mode 100644 examples/printchar.bf create mode 100644 examples/printchar.tf create mode 100644 examples/rot13.tf (limited to 'examples') diff --git a/examples/add2.tf b/examples/add2.tf new file mode 100644 index 0000000..3c1529b --- /dev/null +++ b/examples/add2.tf @@ -0,0 +1,500 @@ + Add two values +from https://en.wikipedia.org/wiki/Brainfuck#Adding_two_values + + + + +ALL ABOARD +chug chug +END OF THE LINE + Cell c0 = 2 + +ALL ABOARD +choo + +END OF THE LINE + +ALL ABOARD +chug chug chug chug chug +END OF THE LINE + Cell c1 = 5 + + +ALL ABOARD +tickets please +END OF THE LINE + Start your loops with your cell pointer on the loop counter (c1 in our case) + +ALL ABOARD +choo choo + +END OF THE LINE + +ALL ABOARD +chug +END OF THE LINE + Add 1 to c0 + +ALL ABOARD +choo + +END OF THE LINE + +ALL ABOARD +chugga +END OF THE LINE + Subtract 1 from c1 + +ALL ABOARD +your ticket please +END OF THE LINE + End your loops with the cell pointer on the loop counter + +At this point our program has added 5 to 2 leaving 7 in c0 and 0 in c1 +but we cannot output this value to the terminal since it is not ASCII encoded + +To display the ASCII character "7" we must add 48 to the value 7 +We use a loop to compute 48 = 6 * 8 + + +ALL ABOARD +chug chug chug chug +END OF THE LINE + +ALL ABOARD +chug chug chug chug +END OF THE LINE + c1 = 8 and this will be our loop counter again + +ALL ABOARD +tickets please +choo choo + +END OF THE LINE + +ALL ABOARD +chug chug chug +END OF THE LINE + +ALL ABOARD +chug chug chug +END OF THE LINE + Add 6 to c0 + +ALL ABOARD +choo + +END OF THE LINE + +ALL ABOARD +chugga +END OF THE LINE + Subtract 1 from c1 + +ALL ABOARD +your ticket please +choo choo + +END OF THE LINE + +ALL ABOARD +click +END OF THE LINE + Print out c0 which has the value 55 which translates to "7"! + +Finally print a newline: + +ALL ABOARD +chugga chugga chugga chugga chugga chugga chugga chugga chugga chugga chugga +chugga chugga chugga chugga chugga chugga chugga chugga chugga chugga chugga +chugga chugga chugga chugga chugga chugga chugga chugga chugga chugga chugga +chugga chugga chugga chugga chugga chugga chugga chugga chugga chugga chugga +chugga click + This program prints "Hello World!" and a newline to the screen, its +length is 106 active command characters. [It is not the shortest.] + +This loop is an "initial comment loop", a simple way of adding a comment +to a BF program such that you don't have to worry about any command +characters. Any ".", ",", "+", "-", "<" and ">" characters are simply +ignored, the "[" and "]" characters just have to be balanced. This +loop and the commands it contains are ignored because the current cell +defaults to a value of 0; the 0 value causes this loop to be skipped. + +from https://en.wikipedia.org/wiki/Brainfuck#Hello_World! + + +ALL ABOARD +chug chug chug chug chug chug chug chug +END OF THE LINE + Set Cell #0 to 8 + +ALL ABOARD +tickets please +choo +chug chug chug chug +END OF THE LINE + Add 4 to Cell #1; this will always set Cell #1 to 4 + +ALL ABOARD +tickets please +END OF THE LINE + as the cell will be cleared by the loop + +ALL ABOARD +choo +chug chug +END OF THE LINE + Add 2 to Cell #2 + +ALL ABOARD +choo +chug chug chug +END OF THE LINE + Add 3 to Cell #3 + +ALL ABOARD +choo +chug chug chug +END OF THE LINE + Add 3 to Cell #4 + +ALL ABOARD +choo +chug +END OF THE LINE + Add 1 to Cell #5 + +ALL ABOARD +choo choo +choo choo +choo choo +choo choo +chugga +END OF THE LINE + Decrement the loop counter in Cell #1 + +ALL ABOARD +your ticket please +END OF THE LINE + Loop until Cell #1 is zero; number of iterations is 4 + +ALL ABOARD +choo +chug +END OF THE LINE + Add 1 to Cell #2 + +ALL ABOARD +choo +chug +END OF THE LINE + Add 1 to Cell #3 + +ALL ABOARD +choo +chugga +END OF THE LINE + Subtract 1 from Cell #4 + +ALL ABOARD +choo +choo +chug +END OF THE LINE + Add 1 to Cell #6 + +ALL ABOARD +tickets please choo choo +your ticket please +END OF THE LINE + Move back to the first zero cell you find; this will + be Cell #1 which was cleared by the previous loop + +ALL ABOARD +choo choo +chugga +END OF THE LINE + Decrement the loop Counter in Cell #0 + +ALL ABOARD +your ticket please +END OF THE LINE + Loop until Cell #0 is zero; number of iterations is 8 + +The result of this is: +Cell no : 0 1 2 3 4 5 6 +Contents: 0 0 72 104 88 32 8 +Pointer : ^ + + +ALL ABOARD +choo +choo +click +END OF THE LINE + Cell #2 has value 72 which is 'H' + +ALL ABOARD +choo +chugga chugga chugga click +END OF THE LINE + Subtract 3 from Cell #3 to get 101 which is 'e' + +ALL ABOARD +chug chug chug chug chug chug chug clickety click chug chug chug click + +END OF THE LINE + Likewise for 'llo' from Cell #3 + +ALL ABOARD +choo +choo +click +END OF THE LINE + Cell #5 is 32 for the space + +ALL ABOARD +choo choo +chugga clickety +END OF THE LINE + Subtract 1 from Cell #4 for 87 to give a 'W' + +ALL ABOARD +choo choo +clickety +END OF THE LINE + Cell #3 was set to 'o' from the end of 'Hello' + +ALL ABOARD +chug chug chug click chugga chugga chugga chugga chugga chugga clickety +chugga chugga chugga chugga chugga chugga chugga chugga click +END OF THE LINE + Cell #3 for 'rl' and 'd' + +ALL ABOARD +choo +choo +chug click +END OF THE LINE + Add 1 to Cell #5 gives us an exclamation point + +ALL ABOARD +choo +chug chug click +END OF THE LINE + And finally a newline from Cell #6 + ROT13 in Brainfuck +from https://en.wikipedia.org/wiki/Brainfuck#ROT13 + + + + +ALL ABOARD +chugga clack chug tickets please +END OF THE LINE + Read first character and start outer character reading loop + +ALL ABOARD +chugga tickets please +END OF THE LINE + Skip forward if character is 0 + +ALL ABOARD +choo +choo +chug chug chug chug tickets please choo +chug chug chug chug chug chug chug chug +choo choo +chugga your ticket please +END OF THE LINE + Set up divisor (32) for division loop +(MEMORY LAYOUT: dividend copy remainder divisor quotient zero zero) + +ALL ABOARD +choo choo +chug choo choo +chugga tickets please +END OF THE LINE + Set up dividend (x minus 1) and enter division loop + +ALL ABOARD +choo +chug choo +chug choo +chugga tickets please choo +choo +choo +your ticket please +END OF THE LINE + Increase copy and remainder / reduce divisor / Normal case: skip forward + +ALL ABOARD +choo choo +tickets please tickets please choo +chug choo choo +chugga your ticket please choo +choo +chug choo +your ticket please + +END OF THE LINE + Special case: move remainder back to divisor and increase quotient + +ALL ABOARD +choo choo +choo choo +choo choo +choo choo +choo choo +chugga +END OF THE LINE + Decrement dividend + +ALL ABOARD +your ticket please +END OF THE LINE + End division loop + +ALL ABOARD +your ticket please choo +choo +choo +tickets please chugga your ticket please chug +END OF THE LINE + End skip loop; zero former divisor and reuse space for a flag + +ALL ABOARD +choo +chugga chugga tickets please chugga tickets please choo choo +chugga choo +chug chug chug +tickets please chugga your ticket please your ticket please your ticket please +choo choo +tickets please +END OF THE LINE + Zero that flag unless quotient was 2 or 3; zero quotient; check flag + +ALL ABOARD +chug chug chug chug chug chug chug chug chug chug chug chug choo choo +tickets please + +END OF THE LINE + If flag then set up divisor (13) for second division loop +(MEMORY LAYOUT: zero copy dividend divisor remainder quotient zero zero) + +ALL ABOARD +choo +chugga tickets please choo +chug choo +choo +your ticket please +END OF THE LINE + Reduce divisor; Normal case: increase remainder + +ALL ABOARD +choo +tickets please chug tickets please choo choo +chug choo +chugga your ticket please choo +chug +choo +choo +your ticket please +END OF THE LINE + Special case: increase remainder / move it back to divisor / increase quotient + +ALL ABOARD +choo choo +choo choo +choo choo +choo choo +choo choo +chugga +END OF THE LINE + Decrease dividend + +ALL ABOARD +your ticket please +END OF THE LINE + End division loop + +ALL ABOARD +choo +choo +tickets please choo choo +chug choo +chugga your ticket please +END OF THE LINE + Add remainder back to divisor to get a useful 13 + +ALL ABOARD +choo +tickets please +END OF THE LINE + Skip forward if quotient was 0 + +ALL ABOARD +chugga tickets please +END OF THE LINE + Decrement quotient and skip forward if quotient was 1 + +ALL ABOARD +chugga choo choo +choo choo +tickets please chugga your ticket please choo +choo + +END OF THE LINE + Zero quotient and divisor if quotient was 2 + +ALL ABOARD +your ticket please choo choo +choo choo +tickets please choo choo +choo choo +chugga choo +choo +chugga your ticket please choo +choo + +END OF THE LINE + Zero divisor and subtract 13 from copy if quotient was 1 + +ALL ABOARD +your ticket please choo choo +choo choo +tickets please choo choo +choo choo +chug choo +choo +chugga your ticket please +END OF THE LINE + Zero divisor and add 13 to copy if quotient was 0 + +ALL ABOARD +your ticket please +END OF THE LINE + End outer skip loop (jump to here if ((character minus 1)/32) was not 2 or 3) + +ALL ABOARD +choo choo +tickets please chugga your ticket please +END OF THE LINE + Clear remainder from first division if second division was skipped + +ALL ABOARD +choo choo +click tickets please chugga your ticket please +END OF THE LINE + Output ROT13ed character from copy and clear it + +ALL ABOARD +choo choo +chugga clack chug +END OF THE LINE + Read next character + +ALL ABOARD +your ticket please +END OF THE LINE + End character reading loop diff --git a/examples/hello-world.bf b/examples/hello-world.bf index dce24e2..eab99ed 100644 --- a/examples/hello-world.bf +++ b/examples/hello-world.bf @@ -8,38 +8,37 @@ ignored, the "[" and "]" characters just have to be balanced. This loop and the commands it contains are ignored because the current cell defaults to a value of 0; the 0 value causes this loop to be skipped. -from https://en.wikipedia.org/wiki/Brainfuck#Hello_World! -] -++++++++ Set Cell #0 to 8 +from https://en.wikipedia.org/wiki/Brainfuck#Hello_World! ] +++++++++ Set Cell #0 to 8 [ ->++++ Add 4 to Cell #1; this will always set Cell #1 to 4 -[ as the cell will be cleared by the loop ->++ Add 2 to Cell #2 ->+++ Add 3 to Cell #3 ->+++ Add 3 to Cell #4 ->+ Add 1 to Cell #5 -<<<<- Decrement the loop counter in Cell #1 -] Loop until Cell #1 is zero; number of iterations is 4 ->+ Add 1 to Cell #2 ->+ Add 1 to Cell #3 ->- Subtract 1 from Cell #4 ->>+ Add 1 to Cell #6 -[<] Move back to the first zero cell you find; this will -be Cell #1 which was cleared by the previous loop -<- Decrement the loop Counter in Cell #0 -] Loop until Cell #0 is zero; number of iterations is 8 +>++++ Add 4 to Cell #1; this will always set Cell #1 to 4 +[ as the cell will be cleared by the loop +>++ Add 2 to Cell #2 +>+++ Add 3 to Cell #3 +>+++ Add 3 to Cell #4 +>+ Add 1 to Cell #5 +<<<<- Decrement the loop counter in Cell #1 +] Loop until Cell #1 is zero; number of iterations is 4 +>+ Add 1 to Cell #2 +>+ Add 1 to Cell #3 +>- Subtract 1 from Cell #4 +>>+ Add 1 to Cell #6 +[<] Move back to the first zero cell you find; this will + be Cell #1 which was cleared by the previous loop +<- Decrement the loop Counter in Cell #0 +] Loop until Cell #0 is zero; number of iterations is 8 The result of this is: Cell no : 0 1 2 3 4 5 6 Contents: 0 0 72 104 88 32 8 Pointer : ^ ->>. Cell #2 has value 72 which is 'H' ->---. Subtract 3 from Cell #3 to get 101 which is 'e' -+++++++..+++. Likewise for 'llo' from Cell #3 ->>. Cell #5 is 32 for the space -<-. Subtract 1 from Cell #4 for 87 to give a 'W' -<. Cell #3 was set to 'o' from the end of 'Hello' -+++.------.--------. Cell #3 for 'rl' and 'd' ->>+. Add 1 to Cell #5 gives us an exclamation point ->++. And finally a newline from Cell #6 +>>. Cell #2 has value 72 which is 'H' +>---. Subtract 3 from Cell #3 to get 101 which is 'e' ++++++++..+++. Likewise for 'llo' from Cell #3 +>>. Cell #5 is 32 for the space +<-. Subtract 1 from Cell #4 for 87 to give a 'W' +<. Cell #3 was set to 'o' from the end of 'Hello' ++++.------.--------. Cell #3 for 'rl' and 'd' +>>+. Add 1 to Cell #5 gives us an exclamation point +>++. And finally a newline from Cell #6 diff --git a/examples/hello-world.tf b/examples/hello-world.tf new file mode 100644 index 0000000..397bc43 --- /dev/null +++ b/examples/hello-world.tf @@ -0,0 +1,388 @@ + This program prints "Hello World!" and a newline to the screen, its +length is 106 active command characters. [It is not the shortest.] + +This loop is an "initial comment loop", a simple way of adding a comment +to a BF program such that you don't have to worry about any command +characters. Any ".", ",", "+", "-", "<" and ">" characters are simply +ignored, the "[" and "]" characters just have to be balanced. This +loop and the commands it contains are ignored because the current cell +defaults to a value of 0; the 0 value causes this loop to be skipped. + +from https://en.wikipedia.org/wiki/Brainfuck#Hello_World! + + +ALL ABOARD +chug chug chug chug chug chug chug chug +END OF THE LINE + Set Cell #0 to 8 + +ALL ABOARD +tickets please +choo +chug chug chug chug +END OF THE LINE + Add 4 to Cell #1; this will always set Cell #1 to 4 + +ALL ABOARD +tickets please +END OF THE LINE + as the cell will be cleared by the loop + +ALL ABOARD +choo +chug chug +END OF THE LINE + Add 2 to Cell #2 + +ALL ABOARD +choo +chug chug chug +END OF THE LINE + Add 3 to Cell #3 + +ALL ABOARD +choo +chug chug chug +END OF THE LINE + Add 3 to Cell #4 + +ALL ABOARD +choo +chug +END OF THE LINE + Add 1 to Cell #5 + +ALL ABOARD +choo choo +choo choo +choo choo +choo choo +chugga +END OF THE LINE + Decrement the loop counter in Cell #1 + +ALL ABOARD +your ticket please +END OF THE LINE + Loop until Cell #1 is zero; number of iterations is 4 + +ALL ABOARD +choo +chug +END OF THE LINE + Add 1 to Cell #2 + +ALL ABOARD +choo +chug +END OF THE LINE + Add 1 to Cell #3 + +ALL ABOARD +choo +chugga +END OF THE LINE + Subtract 1 from Cell #4 + +ALL ABOARD +choo +choo +chug +END OF THE LINE + Add 1 to Cell #6 + +ALL ABOARD +tickets please choo choo +your ticket please +END OF THE LINE + Move back to the first zero cell you find; this will + be Cell #1 which was cleared by the previous loop + +ALL ABOARD +choo choo +chugga +END OF THE LINE + Decrement the loop Counter in Cell #0 + +ALL ABOARD +your ticket please +END OF THE LINE + Loop until Cell #0 is zero; number of iterations is 8 + +The result of this is: +Cell no : 0 1 2 3 4 5 6 +Contents: 0 0 72 104 88 32 8 +Pointer : ^ + + +ALL ABOARD +choo +choo +click +END OF THE LINE + Cell #2 has value 72 which is 'H' + +ALL ABOARD +choo +chugga chugga chugga click +END OF THE LINE + Subtract 3 from Cell #3 to get 101 which is 'e' + +ALL ABOARD +chug chug chug chug chug chug chug clickety click chug chug chug click + +END OF THE LINE + Likewise for 'llo' from Cell #3 + +ALL ABOARD +choo +choo +click +END OF THE LINE + Cell #5 is 32 for the space + +ALL ABOARD +choo choo +chugga clickety +END OF THE LINE + Subtract 1 from Cell #4 for 87 to give a 'W' + +ALL ABOARD +choo choo +clickety +END OF THE LINE + Cell #3 was set to 'o' from the end of 'Hello' + +ALL ABOARD +chug chug chug click chugga chugga chugga chugga chugga chugga clickety +chugga chugga chugga chugga chugga chugga chugga chugga click +END OF THE LINE + Cell #3 for 'rl' and 'd' + +ALL ABOARD +choo +choo +chug click +END OF THE LINE + Add 1 to Cell #5 gives us an exclamation point + +ALL ABOARD +choo +chug chug click +END OF THE LINE + And finally a newline from Cell #6 + ROT13 in Brainfuck +from https://en.wikipedia.org/wiki/Brainfuck#ROT13 + + + + +ALL ABOARD +chugga clack chug tickets please +END OF THE LINE + Read first character and start outer character reading loop + +ALL ABOARD +chugga tickets please +END OF THE LINE + Skip forward if character is 0 + +ALL ABOARD +choo +choo +chug chug chug chug tickets please choo +chug chug chug chug chug chug chug chug +choo choo +chugga your ticket please +END OF THE LINE + Set up divisor (32) for division loop +(MEMORY LAYOUT: dividend copy remainder divisor quotient zero zero) + +ALL ABOARD +choo choo +chug choo choo +chugga tickets please +END OF THE LINE + Set up dividend (x minus 1) and enter division loop + +ALL ABOARD +choo +chug choo +chug choo +chugga tickets please choo +choo +choo +your ticket please +END OF THE LINE + Increase copy and remainder / reduce divisor / Normal case: skip forward + +ALL ABOARD +choo choo +tickets please tickets please choo +chug choo choo +chugga your ticket please choo +choo +chug choo +your ticket please + +END OF THE LINE + Special case: move remainder back to divisor and increase quotient + +ALL ABOARD +choo choo +choo choo +choo choo +choo choo +choo choo +chugga +END OF THE LINE + Decrement dividend + +ALL ABOARD +your ticket please +END OF THE LINE + End division loop + +ALL ABOARD +your ticket please choo +choo +choo +tickets please chugga your ticket please chug +END OF THE LINE + End skip loop; zero former divisor and reuse space for a flag + +ALL ABOARD +choo +chugga chugga tickets please chugga tickets please choo choo +chugga choo +chug chug chug +tickets please chugga your ticket please your ticket please your ticket please +choo choo +tickets please +END OF THE LINE + Zero that flag unless quotient was 2 or 3; zero quotient; check flag + +ALL ABOARD +chug chug chug chug chug chug chug chug chug chug chug chug choo choo +tickets please + +END OF THE LINE + If flag then set up divisor (13) for second division loop +(MEMORY LAYOUT: zero copy dividend divisor remainder quotient zero zero) + +ALL ABOARD +choo +chugga tickets please choo +chug choo +choo +your ticket please +END OF THE LINE + Reduce divisor; Normal case: increase remainder + +ALL ABOARD +choo +tickets please chug tickets please choo choo +chug choo +chugga your ticket please choo +chug +choo +choo +your ticket please +END OF THE LINE + Special case: increase remainder / move it back to divisor / increase quotient + +ALL ABOARD +choo choo +choo choo +choo choo +choo choo +choo choo +chugga +END OF THE LINE + Decrease dividend + +ALL ABOARD +your ticket please +END OF THE LINE + End division loop + +ALL ABOARD +choo +choo +tickets please choo choo +chug choo +chugga your ticket please +END OF THE LINE + Add remainder back to divisor to get a useful 13 + +ALL ABOARD +choo +tickets please +END OF THE LINE + Skip forward if quotient was 0 + +ALL ABOARD +chugga tickets please +END OF THE LINE + Decrement quotient and skip forward if quotient was 1 + +ALL ABOARD +chugga choo choo +choo choo +tickets please chugga your ticket please choo +choo + +END OF THE LINE + Zero quotient and divisor if quotient was 2 + +ALL ABOARD +your ticket please choo choo +choo choo +tickets please choo choo +choo choo +chugga choo +choo +chugga your ticket please choo +choo + +END OF THE LINE + Zero divisor and subtract 13 from copy if quotient was 1 + +ALL ABOARD +your ticket please choo choo +choo choo +tickets please choo choo +choo choo +chug choo +choo +chugga your ticket please +END OF THE LINE + Zero divisor and add 13 to copy if quotient was 0 + +ALL ABOARD +your ticket please +END OF THE LINE + End outer skip loop (jump to here if ((character minus 1)/32) was not 2 or 3) + +ALL ABOARD +choo choo +tickets please chugga your ticket please +END OF THE LINE + Clear remainder from first division if second division was skipped + +ALL ABOARD +choo choo +click tickets please chugga your ticket please +END OF THE LINE + Output ROT13ed character from copy and clear it + +ALL ABOARD +choo choo +chugga clack chug +END OF THE LINE + Read next character + +ALL ABOARD +your ticket please +END OF THE LINE + End character reading loop diff --git a/examples/printchar.bf b/examples/printchar.bf new file mode 100644 index 0000000..e0d73ad --- /dev/null +++ b/examples/printchar.bf @@ -0,0 +1,5 @@ +[ printchar is a small example input/output trainfuck program. +it waits for the user to press a key, then prints that key +and a newline to the screen. +] +,.>++++++++++. diff --git a/examples/printchar.tf b/examples/printchar.tf new file mode 100644 index 0000000..c9092be --- /dev/null +++ b/examples/printchar.tf @@ -0,0 +1,10 @@ +printchar is a small example input/output trainfuck program. +it waits for the user to press a key, then prints that key +and a newline to the screen. +ALL ABOARD +clack clickety +choo +chug chug chug chug chug +chug chug chug chug chug +click +END OF THE LINE diff --git a/examples/rot13.tf b/examples/rot13.tf new file mode 100644 index 0000000..f7c24df --- /dev/null +++ b/examples/rot13.tf @@ -0,0 +1,215 @@ + ROT13 in Brainfuck +from https://en.wikipedia.org/wiki/Brainfuck#ROT13 + + + + +ALL ABOARD +chugga clack chug tickets please +END OF THE LINE + Read first character and start outer character reading loop + +ALL ABOARD +chugga tickets please +END OF THE LINE + Skip forward if character is 0 + +ALL ABOARD +choo +choo +chug chug chug chug tickets please choo +chug chug chug chug chug chug chug chug +choo choo +chugga your ticket please +END OF THE LINE + Set up divisor (32) for division loop +(MEMORY LAYOUT: dividend copy remainder divisor quotient zero zero) + +ALL ABOARD +choo choo +chug choo choo +chugga tickets please +END OF THE LINE + Set up dividend (x minus 1) and enter division loop + +ALL ABOARD +choo +chug choo +chug choo +chugga tickets please choo +choo +choo +your ticket please +END OF THE LINE + Increase copy and remainder / reduce divisor / Normal case: skip forward + +ALL ABOARD +choo choo +tickets please tickets please choo +chug choo choo +chugga your ticket please choo +choo +chug choo +your ticket please + +END OF THE LINE + Special case: move remainder back to divisor and increase quotient + +ALL ABOARD +choo choo +choo choo +choo choo +choo choo +choo choo +chugga +END OF THE LINE + Decrement dividend + +ALL ABOARD +your ticket please +END OF THE LINE + End division loop + +ALL ABOARD +your ticket please choo +choo +choo +tickets please chugga your ticket please chug +END OF THE LINE + End skip loop; zero former divisor and reuse space for a flag + +ALL ABOARD +choo +chugga chugga tickets please chugga tickets please choo choo +chugga choo +chug chug chug +tickets please chugga your ticket please your ticket please your ticket please +choo choo +tickets please +END OF THE LINE + Zero that flag unless quotient was 2 or 3; zero quotient; check flag + +ALL ABOARD +chug chug chug chug chug chug chug chug chug chug chug chug choo choo +tickets please + +END OF THE LINE + If flag then set up divisor (13) for second division loop +(MEMORY LAYOUT: zero copy dividend divisor remainder quotient zero zero) + +ALL ABOARD +choo +chugga tickets please choo +chug choo +choo +your ticket please +END OF THE LINE + Reduce divisor; Normal case: increase remainder + +ALL ABOARD +choo +tickets please chug tickets please choo choo +chug choo +chugga your ticket please choo +chug +choo +choo +your ticket please +END OF THE LINE + Special case: increase remainder / move it back to divisor / increase quotient + +ALL ABOARD +choo choo +choo choo +choo choo +choo choo +choo choo +chugga +END OF THE LINE + Decrease dividend + +ALL ABOARD +your ticket please +END OF THE LINE + End division loop + +ALL ABOARD +choo +choo +tickets please choo choo +chug choo +chugga your ticket please +END OF THE LINE + Add remainder back to divisor to get a useful 13 + +ALL ABOARD +choo +tickets please +END OF THE LINE + Skip forward if quotient was 0 + +ALL ABOARD +chugga tickets please +END OF THE LINE + Decrement quotient and skip forward if quotient was 1 + +ALL ABOARD +chugga choo choo +choo choo +tickets please chugga your ticket please choo +choo + +END OF THE LINE + Zero quotient and divisor if quotient was 2 + +ALL ABOARD +your ticket please choo choo +choo choo +tickets please choo choo +choo choo +chugga choo +choo +chugga your ticket please choo +choo + +END OF THE LINE + Zero divisor and subtract 13 from copy if quotient was 1 + +ALL ABOARD +your ticket please choo choo +choo choo +tickets please choo choo +choo choo +chug choo +choo +chugga your ticket please +END OF THE LINE + Zero divisor and add 13 to copy if quotient was 0 + +ALL ABOARD +your ticket please +END OF THE LINE + End outer skip loop (jump to here if ((character minus 1)/32) was not 2 or 3) + +ALL ABOARD +choo choo +tickets please chugga your ticket please +END OF THE LINE + Clear remainder from first division if second division was skipped + +ALL ABOARD +choo choo +click tickets please chugga your ticket please +END OF THE LINE + Output ROT13ed character from copy and clear it + +ALL ABOARD +choo choo +chugga clack chug +END OF THE LINE + Read next character + +ALL ABOARD +your ticket please +END OF THE LINE + End character reading loop -- cgit 1.4.1-21-gabe81