Go to file
charlotteones 8bc92ed513 1 2026-07-21 00:24:28 +02:00
__pycache__ Current state 2026-07-01 00:07:44 +02:00
Blink copy.png 1 2026-07-21 00:24:28 +02:00
Makefile First code, works well, but very fast timeline 2026-06-18 11:44:07 +02:00
OPTIMIZATION.md Current state 2026-07-01 00:07:44 +02:00
README.md 1 2026-07-21 00:24:28 +02:00
custom_blink.png 1 2026-07-21 00:24:28 +02:00
custom_dead.png 1 2026-07-21 00:24:28 +02:00
custom_eat.png 1 2026-07-21 00:24:28 +02:00
custom_happy.png 1 2026-07-21 00:24:28 +02:00
custom_idle.png 1 2026-07-21 00:24:28 +02:00
custom_sad.png 1 2026-07-21 00:24:28 +02:00
custom_sleep.png 1 2026-07-21 00:24:28 +02:00
flash.sh Current state 2026-07-01 00:07:44 +02:00
funconfig.h Current state 2026-07-01 00:07:44 +02:00
pinout.md First code, works well, but very fast timeline 2026-06-18 11:44:07 +02:00
sprites.h 1 2026-07-21 00:24:28 +02:00
sprites_gen.py 1 2026-07-21 00:24:28 +02:00
tama.bin New compile file 2026-07-18 14:09:06 +02:00
tama.c 1 2026-07-21 00:24:28 +02:00
tama.elf New compile file 2026-07-18 14:09:06 +02:00
tama.hex New compile file 2026-07-18 14:09:06 +02:00
tama.lst New compile file 2026-07-18 14:09:06 +02:00
tama.map New compile file 2026-07-18 14:09:06 +02:00
tama_ext.bin First code, works well, but very fast timeline 2026-06-18 11:44:07 +02:00

README.md

Panagotchi

A Tamagotchi-style virtual pet for the CH32V003F4P6 badge — a hacker-themed creature that evolves from procuserroot, then either ascends to Claude or degrades into a glitch depending on how well you tend to it.

Fits in ~12 KB of the 16 KB flash budget.

Hardware

Pin Function
PA1 Indicator LED
PC0 OK button
PC1/PC2 SSD1306 128×64 OLED (I2C1)
PD2 Passive piezo buzzer
PD5 Right button
PD6 Left button

Powered by a CR2032 coin cell via a TLV61070A boost converter to 3.3V. See pinout.md for the full pin assignment and power architecture.

Gameplay

Controls: Left / Right move the menu cursor. OK activates the selected action.

Menu actions:

Icon Action Effect
Apple FEED +30 satiety, 5 hygiene
Ball PLAY +25 happy, 12 energy (requires energy ≥ 15)
Moon SLEEP Toggle nap; restores energy
Drop CLEAN Reset hygiene to 100, remove poop piles
Cross HEAL +35 health
Chart STATS Show stat bars + XP readout
Gear SETTINGS Screen timeout, brightness, sound

Stats decay on a ~15-second tick. Health responds to overall wellbeing — if any need drops below 15 it bleeds down; if all are above 50 it recovers. Let health reach 0 and the pet dies with a SEGFAULT (11).

Evolution (XP thresholds: 45 / 120 / 240):

proc  →  user  →  root  →  Claude (well-kept) / glitch (neglected)

Each stage gains a visual accessory: shades at user, a gaming headset and mic boom at root.

Species (chosen on the welcome screen):

  • Panko — the panda; full 7-expression animation set
  • Shell — a friendly CRT terminal with a > _ prompt mouth
  • Tmux — a split-pane terminal with a status bar

Building

Requires ch32v003fun checked out as a sibling directory.

# Generate sprites from source art
python3 sprites_gen.py > sprites.h

# Build and flash
make

Flash via the minichlink or wch-link programmer. The Makefile targets cv_flash / cv_clean from ch32fun.

Check real flash usage with:

riscv-none-elf-size tama.elf

Power saving

The OLED is the biggest power draw. When the screen-off timeout fires, the display is blanked and the MCU enters WFI light-sleep. Two wake sources:

  • Button press (EXTI falling edge on PC0/PD5/PD6) — lights the screen back up
  • TIM2 overflow (~once per game tick) — runs a background stat update and low-need chirp, without waking the display

SRAM and all pet state survive WFI; only the CPU clock is gated.

Brightness and screen-off timeout are adjustable in the settings menu.

Files

File Purpose
tama.c Main firmware: game logic, rendering, input, low-power
sprites_gen.py Python sprite generator — edit art here
sprites.h Auto-generated 1-bpp sprite data (do not edit)
funconfig.h ch32fun config overrides (disables printf backends)
pinout.md Full pin assignment and power architecture notes
OPTIMIZATION.md Flash size backlog and optimization notes