|
7 | 7 |
|
8 | 8 | Tiny8 is a minimal, easy-to-use library for working with compact data structures and simple in-memory storage patterns. It is designed for learning, experimentation, and small-scale projects where a lightweight dependency footprint is desirable. This documentation covers installation, examples, and the API to help you get started quickly. |
9 | 9 |
|
10 | | - |
| 10 | + |
11 | 11 |
|
12 | 12 | ## Installation |
13 | 13 |
|
@@ -59,66 +59,66 @@ bubblesort.asm: |
59 | 59 | ```asm |
60 | 60 | ; Bubble sort using RAM (addresses 100..131) - 32 elements |
61 | 61 | ; Purpose: fill RAM[100..131] with pseudo-random bytes and sort them |
62 | | -; Registers: |
63 | | -; R0 - base address (start = 100) |
64 | | -; R1 - index / loop counter for initialization |
65 | | -; R2 - PRNG state (seed) |
66 | | -; R3..R8 - temporary registers used in loops and swaps |
67 | | -; R9 - PRNG multiplier (kept aside to avoid clobber in MUL) |
| 62 | +; Registers (use R16..R31 for LDI immediates): |
| 63 | +; R16 - base address (start = 100) |
| 64 | +; R17 - index / loop counter for initialization |
| 65 | +; R18 - PRNG state (seed) |
| 66 | +; R19..R24 - temporary registers used in loops and swaps |
| 67 | +; R25 - PRNG multiplier (kept aside to avoid clobber in MUL) |
68 | 68 | ; |
69 | 69 | ; The code below is split into two phases: |
70 | 70 | ; 1) init_loop: generate and store 32 pseudo-random bytes at RAM[100..131] |
71 | 71 | ; 2) outer/inner loops: perform a simple bubble sort over those 32 bytes |
72 | 72 |
|
73 | 73 | ; initialize pointers and PRNG |
74 | | - ldi r0, 100 ; base address |
75 | | - ldi r1, 0 ; index = 0 |
76 | | - ldi r2, 123 ; PRNG seed |
77 | | - ldi r9, 75 ; PRNG multiplier (kept in r9 so mul doesn't clobber it) |
| 74 | + ldi r16, 100 ; base address |
| 75 | + ldi r17, 0 ; index = 0 |
| 76 | + ldi r18, 123 ; PRNG seed |
| 77 | + ldi r25, 75 ; PRNG multiplier (kept in r25 so mul doesn't clobber it) |
78 | 78 |
|
79 | 79 | init_loop: |
80 | 80 | ; PRNG step: r2 := lowbyte(r2 * 75), then tweak |
81 | | - mul r2, r9 ; r2 = low byte of (r2 * 75) |
82 | | - inc r2 ; small increment to avoid repeating patterns |
| 81 | + mul r18, r25 ; r18 = low byte of (r18 * 75) |
| 82 | + inc r18 ; small increment to avoid repeating patterns |
83 | 83 | ; store generated byte into memory at base + index |
84 | | - st r0, r2 ; RAM[base] = r2 |
85 | | - inc r0 ; advance base pointer |
86 | | - inc r1 ; increment index |
87 | | - ldi r7, 32 |
88 | | - cp r1, r7 |
| 84 | + st r16, r18 ; RAM[base] = r18 |
| 85 | + inc r16 ; advance base pointer |
| 86 | + inc r17 ; increment index |
| 87 | + ldi r23, 32 |
| 88 | + cp r17, r23 |
89 | 89 | brne init_loop |
90 | 90 |
|
91 | 91 | ; Bubble sort for 32 elements (perform passes until i == 31) |
92 | | - ldi r2, 0 ; i = 0 (outer loop counter) |
| 92 | + ldi r18, 0 ; i = 0 (outer loop counter) |
93 | 93 | outer_loop: |
94 | | - ldi r3, 0 ; j = 0 (inner loop counter) |
| 94 | + ldi r19, 0 ; j = 0 (inner loop counter) |
95 | 95 | inner_loop: |
96 | 96 | ; compute address of element A = base + j |
97 | | - ldi r4, 100 |
98 | | - add r4, r3 |
99 | | - ld r5, r4 ; r5 = A |
| 97 | + ldi r20, 100 |
| 98 | + add r20, r19 |
| 99 | + ld r21, r20 ; r21 = A |
100 | 100 | ; compute address of element B = base + j + 1 |
101 | | - ldi r6, 100 |
102 | | - add r6, r3 |
103 | | - ldi r7, 1 |
104 | | - add r6, r7 |
105 | | - ld r8, r6 ; r8 = B |
| 101 | + ldi r22, 100 |
| 102 | + add r22, r19 |
| 103 | + ldi r23, 1 |
| 104 | + add r22, r23 |
| 105 | + ld r24, r22 ; r24 = B |
106 | 106 | ; compare A and B (we'll swap if A > B) |
107 | | - cp r8, r5 ; sets carry if r8 < r5 (unsigned) |
108 | | - brcs no_swap ; branch if carry set => r8 < r5 => A > B? (keep original order) |
| 107 | + cp r24, r21 ; sets carry if r24 < r21 (unsigned) |
| 108 | + brcs no_swap ; branch if carry set => r24 < r21 => A > B? (keep original order) |
109 | 109 | ; swap A and B: store B into A's address, A into B's address |
110 | | - st r4, r8 |
111 | | - st r6, r5 |
| 110 | + st r20, r24 |
| 111 | + st r22, r21 |
112 | 112 | no_swap: |
113 | | - inc r3 |
114 | | - ldi r7, 31 |
115 | | - cp r3, r7 |
| 113 | + inc r19 |
| 114 | + ldi r23, 31 |
| 115 | + cp r19, r23 |
116 | 116 | breq end_inner |
117 | 117 | jmp inner_loop |
118 | 118 | end_inner: |
119 | | - inc r2 |
120 | | - ldi r7, 31 |
121 | | - cp r2, r7 |
| 119 | + inc r18 |
| 120 | + ldi r23, 31 |
| 121 | + cp r18, r23 |
122 | 122 | breq done |
123 | 123 | jmp outer_loop |
124 | 124 |
|
@@ -153,7 +153,7 @@ viz.animate_combined( |
153 | 153 | Example Output: |
154 | 154 |
|
155 | 155 | ```bash |
156 | | -[6, 10, 15, 23, 26, 34, 50, 54, 94, 102, 106, 127, 130, 135, 139, 142, 150, 155, 159, 167, 171, 186, 187, 190, 195, 210, 211, 227, 238, 239, 243, 247] |
| 156 | +[247, 243, 239, 238, 227, 211, 210, 195, 190, 187, 186, 171, 167, 159, 155, 150, 142, 139, 135, 130, 127, 106, 102, 94, 54, 50, 34, 26, 23, 15, 10, 6] |
157 | 157 | ``` |
158 | 158 |
|
159 | 159 | ## API Reference |
|
0 commit comments