const std = @import("std"); const DDRB = @as(*volatile u8, @ptrFromInt(0x24)); const PORTB = @as(*volatile u8, @ptrFromInt(0x25)); const DELAY = 100; pub export fn delay(n: u32) void { var i: u32 = 0; while (i < n) : (i += 1) { asm volatile ("nop" ::: "memory"); } } pub export fn blink(n: u32) void { var i: u32 = 0; DDRB.* = DDRB.* | (1 << 5); while (i < n) : (i += 1) { // Toggle PB5 PORTB.* ^= @as(u8, 1 << 5); delay(100_000); PORTB.* ^= @as(u8, 1 << 5); delay(200_000); } } pub export fn collatz(na: u32) u32 { var n: u32 = na; var c: u32 = 0; while (n > 1) : (c += 1) { if (n % 2 == 0) { n /= 2; } else { n = n + n + n + 1; } } return c; } pub export fn main() void { var i: u32 = 0; while (true) : (i += 1) { const c = collatz(i); blink(c); delay(500_000); } } pub export fn abort() void { // Set PB5 (pin 13) as output DDRB.* = DDRB.* | (1 << 5); while (true) { // Toggle PB5 PORTB.* ^= @as(u8, 1 << 5); // Simple delay var i: usize = 0; while (i < DELAY) : (i += 1) { asm volatile ("nop" ::: "memory"); } } }