166 @ ftoc.rr6 167 @ Computers were originally created to do calculations. This calculates 168 @ degrees Celsius from degrees Fahrenheit using the formula C = (F-32)*5/9. 169 @ F is entered in the front panel switches and must be in range 32 to 63 170 @ because of the 6-bit limitation. The answer is shown in ac (r0). 171 172 0000 E0 ldi -32 @ r1 <- F-32 173 0001 6F add in 174 0002 71 sto r1 175 176 0003 C5 ldi 5 @ r2:r1 <- r1*5 177 @ Multiply routine. r2:r1 <- r1*ac 178 @ r2 179 @ +ac >> c >> r1 >> c 180 0004 72 mul: sto r2 @ r2 <- multiplicand 181 0005 C6 ldi 6 @ r3 <- loop counter 182 0006 73 sto r3 183 0007 20 clr ac @ ac:r1 <- r1*r2 184 0008 11 ror r1 @ rotate LSB into carry for scc test 185 0009 05 m10: scc @ skip if carry = 0 186 000a 6A add r2 @ else add r2 to ac if carry = 1 187 000b 10 ror ac @ rotate right 13 bits in carry:ac:r1 188 000c 11 ror r1 @ also sets carry for scc test 189 000d 2B dsz r3 @ loop for 6 places 190 000e A9 jmp m10 191 000f 72 sto r2 @ return product in r2:r1 192 193 0010 C9 ldi 9 @ ac <- r2:r1/9 194 @ Divide routine. ac <- r2:r1/ac; remainder in r2 195 @ r2 << c << r1 << c 196 @ -r3 197 0011 73 div: sto r3 @ r3 <- divisor 198 0012 C6 ldi 6 @ r4 <- loop counter 199 0013 74 sto r4 200 0014 19 rol r1 @ (carry-in doesn't matter) 201 0015 1A d10: rol r2 @ shift in quotient bit 202 0016 7A lod r2 @ make trial subtraction 203 0017 63 sub r3 204 0018 05 scc @ skip if r3 > r2 (it doesn't go) 205 0019 72 sto r2 @ else subtract r3 from r2 (it did go) 206 001a 19 rol r1 @ shift in carry bit 207 001b 2C dsz r4 @ loop for 6 bits 208 001c B5 jmp d10 209 001d 79 lod r1 @ return quotient in ac 210 211 001e 00 hlt 166 @ primes.rr6 167 @ Display the sequence of prime numbers: 2 3 5 7 11 13 ... 168 169 n = lr 170 d = r3 171 172 0000 C2 ldi 2 @ N:= 2 173 0001 76 sto n 174 175 0002 C1 p1: ldi 1 @ D:= 1 176 0003 73 sto d 177 0004 3B p2: inc d @ D++ 178 179 0005 7B lod d @ if D = N then 180 0006 66 sub n 181 0007 03 seq 182 0008 AB jmp p3 183 184 0009 7E lod n @ output N, a prime 185 000a 00 hlt 186 @ jmp p5 @ next N (rem will be 0) 187 188 000b 22 p3: clr r2 @ Q:= N/D 189 000c 7E lod n 190 000d 71 sto r1 191 192 @ r1:= r2:r1/r3; remainder in r2 193 @ r2 << c << r1 << c 194 @ -r3 195 000e C6 ldi 6 @ r4:= loop counter 196 000f 74 sto r4 197 0010 19 rol r1 @ shift (carry-in doesn't matter) 198 0011 1A p4: rol r2 @ shift in quotient bit 199 0012 7A lod r2 @ make trial subtraction 200 0013 63 sub r3 201 0014 05 scc @ skip if r3 > r2 (it doesn't go) 202 0015 72 sto r2 @ else subtract r3 from r2 (it did go) 203 0016 19 rol r1 @ shift in carry bit 204 0017 2C dsz r4 @ loop 205 0018 B1 jmp p4 206 207 0019 3A inc r2 @ if rem = 0 then 208 001a 2A dsz r2 209 001b A4 jmp p2 210 211 001c 3E p5: inc n @ next N 212 001d 03 seq 213 001e A2 jmp p1 214 001f 00 hlt 166 @ demo2.rr6 167 @ Display 3..2..1..H..E..L..L..O.. followed by Fibonacci sequence 168 @ 169 @ Bits in r4 correspond to these display segments: 170 @ 0 171 @ 5 1 172 @ C carry status bit 173 @ 4 2 174 @ 3 175 @ 176 0000 C1 ldi 1 177 0001 B5 jmp fib 178 179 0002 CF ldi 0b001111 @ 3 180 0003 06 sec 181 0004 9B jsr show 182 0005 DB ldi 0b011011 @ 2 183 0006 06 sec 184 0007 9B jsr show 185 0008 C6 ldi 0b000110 @ 1 186 0009 9B jsr show 187 000a F6 ldi 0b110110 @ display H 188 000b 06 sec 189 000c 9B jsr show 190 000d F9 ldi 0b111001 @ display E 191 000e 06 sec 192 000f 9B jsr show 193 0010 9A jsr showL @ display L (carry is clear) 194 0011 9A jsr showL @ display L (carry is clear) 195 0012 FF ldi 0b111111 @ display O (carry is clear) 196 0013 9B jsr show 197 198 @ Display Fibonacci sequence on ac LEDs: 1 1 2 3 5 8 13 21 34 55 199 @ r2 and r3 are initially 0 200 0014 C1 ldi 1 201 0015 6A fib: add r2 202 0016 72 sto r2 203 0017 6B add r3 204 0018 73 sto r3 205 0019 B5 jmp fib 206 207 001a F8 showL: ldi 0b111000 @ display L 208 001b 74 show: sto r4 @ display ac 209 210 001c C2 ldi 2 @ delay 211 001d 28 del10: dsz ac 212 001e BD jmp del10 213 214 001f 24 clr r4 @ blank display 215 0020 07 clc 216 0021 0E ret 166 @ towers.rr6 167 @ Towers of Hanoi Puzzle Solver using a non-recursive method 168 @ This version works for any number of disks. 169 @ 170 @ [Text(0, "How many disks? "); 171 @ N:= IntIn(0); 172 @ for I:= 1 to 1<> 171 172 173 0000 39 inc r1 @ 1 174 0001 3E f10: inc r6 @ 1, 2, 3 ... 175 0002 23 clr r3 176 0003 24 clr r4 177 178 0004 16 mul: ror r6 @ (carry is clear) 179 0005 04 scs 180 0006 B1 jmp mul20 181 0007 E0 ldi 040 182 0008 56 ior r6 183 0009 76 sto r6 184 185 000a 7B lod r3 @ double add 186 000b 69 add r1 187 000c 73 sto r3 188 000d 01 sac 189 000e 6C add r4 190 000f 6A add r2 191 0010 74 sto r4 192 mul20: 193 0011 19 rol r1 194 0012 1A rol r2 195 0013 C7 ldi 7 @ loop until low nibble = 0 196 0014 5E and r6 197 0015 03 seq 198 0016 A4 jmp mul 199 0017 7B lod r3 @ copy r2:r1 <- r4:r3 200 0018 71 sto r1 201 0019 7C lod r4 202 001a 72 sto r2 203 204 001b 16 ror r6 @ (carry is clear) 205 001c 16 ror r6 206 001d 16 ror r6 207 208 001e 00 hlt 209 001f A1 jmp f10 166 @ pyth.rr6 167 @ Pythagorean triples 168 @ Outputs the integer sides of a right triangle A, B, C. 169 @ Enter two coprime numbers, larger first, with one being even. 170 171 0000 C6 ldi 6 @ lod r7 @ M 172 0001 72 sto r2 173 0002 73 sto r3 174 0003 00 hlt 175 176 0004 C5 ldi 5 @ lod r7 @ N 177 0005 95 jsr mul1 @ r0:= r1*r2; r0:= N*M 178 0006 68 add r0 179 0007 00 hlt @ B:= 2*M*N 180 181 0008 7B lod r3 @ M 182 0009 94 jsr square 183 000a 73 sto r3 @ M^2 184 185 000b C5 ldi 5 @ lod r7 @ N 186 000c 94 jsr square 187 000d 74 sto r4 @ N^2 188 189 000e 6B add r3 190 000f 00 hlt @ C:= M^2 + N^2 191 192 0010 64 sub r4 193 0011 64 sub r4 194 0012 00 hlt @ A:= C - N^2 - N^2 = M^2 - N^2 195 0013 00 hlt 196 197 0014 72 square: sto r2 @ r0:= r0^2; r0:= r2*r1 198 0015 71 mul1: sto r1 @ r0:= r0*r2 199 0016 20 mul: clr r0 @ r0:= r1*r2 (r1 and r2 are altered) 200 0017 07 mul10: clc 201 0018 11 ror r1 @ <> 203 001a 6A add r2 204 001b 1A rol r2 205 001c 39 inc r1 @ loop until r1=0 206 001d 29 dsz r1 207 001e B7 jmp mul10 208 001f 0E ret