diff --git a/projects/snow/main.s b/projects/snow/main.s index 7a42fa5..364cb53 100644 --- a/projects/snow/main.s +++ b/projects/snow/main.s @@ -3,6 +3,9 @@ .text .equ NUM_FLAKES, 150 + .equ MAX_COLUMN, 80 + .equ MAX_LINE, 24 + .equ MAX_LINE_X2, 48 storm .req x27 @@ -34,7 +37,7 @@ main: stp x29, x30, [sp, -16]! // allocated memory will be // preserved in x27. ldr x2, [sp], 16 // Restore the allocation size. - mov w1, xzr // Fill with zero. + mov w1, wzr // Fill with zero. bl memset // x0 still had base address. 99: mov x0, storm @@ -54,9 +57,47 @@ bye: ldp x27, x28, [sp], 16 */ ResetFlake: stp x20, x30, [sp, -16]! + mov x20, x0 + + // Initialize Column --- 1 <= random value <= 80 + bl rand + mov x1, MAX_COLUMN + bl mod + add w1, w1, 1 + str w1, [x20, 4] + + // Initialize Line --- -(1 <= random value <= 48) + + bl rand + mov x1, MAX_LINE_X2 + bl mod + add w1, w1, 1 + neg w1, w1 + str w1, [x20] + ldp x20, x30, [sp], 16 ret +/* mod(a, b) - implements a % b - AARCH64 lacks a mod instruction. + A strange place to economize, but there you have it. + + a comes to us in x0 + b comes to us in x1 + + method: + * integer divide a by b + for example - 5 % 3 would need 5 // 3 yielding 1 + * multiply result by b + 1 * 3 is 3 + * subtract result from a + 5 - 3 is 2 and that's our return value. +*/ + +mod: sdiv x2, x0, x1 // x2 gets a // b + msub x0, x2, x1, x0 // x0 gets a - a // b * b + ret + + .data bad_malloc: .asciz "Allocation of flakes has failed"