First code, works well, but very fast timeline
This commit is contained in:
commit
4bbe531d08
|
|
@ -0,0 +1,9 @@
|
|||
all : flash
|
||||
|
||||
TARGET:=tama
|
||||
|
||||
TARGET_MCU?=CH32V003
|
||||
include ../ch32v003fun/ch32fun/ch32fun.mk
|
||||
|
||||
flash : cv_flash
|
||||
clean : cv_clean
|
||||
Binary file not shown.
|
|
@ -0,0 +1,41 @@
|
|||
#!/usr/bin/env bash
|
||||
# Build the Panagotchi firmware and flash it to the CH32V003 over single-wire
|
||||
# debug (WCH-LinkE on DIO/PD1).
|
||||
set -e
|
||||
|
||||
DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
cd "$DIR"
|
||||
|
||||
TARGET=tama
|
||||
|
||||
# Regenerate sprites.h from the editable art generator (if python3 is present).
|
||||
if command -v python3 >/dev/null 2>&1; then
|
||||
echo ">> Generating sprites.h..."
|
||||
python3 sprites_gen.py > sprites.h
|
||||
fi
|
||||
|
||||
# --- Toolchain (xpack riscv-none-elf-gcc, bundles a ch32fun-compatible newlib) ---
|
||||
XROOT="/home/superminaren/CH32V003/xpack-riscv-none-elf-gcc-14.2.0-3"
|
||||
export PATH="$XROOT/bin:$PATH"
|
||||
MAKEFLAGS_TC=(PREFIX=riscv-none-elf NEWLIB="$XROOT/riscv-none-elf/include")
|
||||
|
||||
MINICHLINK="$DIR/../ch32v003fun/minichlink/minichlink"
|
||||
|
||||
echo ">> Building..."
|
||||
make clean >/dev/null 2>&1 || true
|
||||
make "$TARGET.bin" "${MAKEFLAGS_TC[@]}"
|
||||
|
||||
echo ">> Flashing $TARGET.bin to CH32V003..."
|
||||
# minichlink auto-switches the WCH-LinkE from ARM to RISC-V mode on first run;
|
||||
# if that happens it asks for a re-attempt, so retry a few times.
|
||||
for i in 1 2 3; do
|
||||
if "$MINICHLINK" -w "$TARGET.bin" flash -b; then
|
||||
echo ">> Done. The Panagotchi should now be running on the OLED."
|
||||
exit 0
|
||||
fi
|
||||
echo ">> retry $i..."
|
||||
sleep 1
|
||||
done
|
||||
|
||||
echo ">> Flash failed after retries." >&2
|
||||
exit 1
|
||||
|
|
@ -0,0 +1,7 @@
|
|||
#ifndef _FUNCONFIG_H
|
||||
#define _FUNCONFIG_H
|
||||
|
||||
// Configuration overrides go here. Defaults in ch32fun/ch32fun.h are fine for blink.
|
||||
#define FUNCONF_USE_HSI 1 // internal 24 MHz RC oscillator (no external crystal needed)
|
||||
|
||||
#endif
|
||||
|
|
@ -0,0 +1,77 @@
|
|||
# CH32V003F4P6 — IR Remote / Badge Project Pinout
|
||||
|
||||
Last updated: 2026-06-18
|
||||
|
||||
## MCU
|
||||
|
||||
- **Part:** CH32V003F4P6
|
||||
- **Package:** TSSOP20
|
||||
- **Core:** QingKe RISC-V2A, 48 MHz
|
||||
- **VDD:** 3.3V nominal (2.7–3.6V tolerance), supplied via TLV61070A boost from CR2032
|
||||
- **Ports available:** PA1–PA2, PC0–PC7, PD0–PD7 (18 GPIOs total; PD7 shared with NRST)
|
||||
|
||||
## Pin Assignment
|
||||
|
||||
| Pin | Function | Notes |
|
||||
|------|------------------------|------------------------------------------------------------------------|
|
||||
| PA1 | Indicator LED | Activity/status LED. No documented alternate-function conflicts. |
|
||||
| PC0 | OK Button | Input, pull-up, active-low. Also TIM1 CH3 (default remap) — not used as PWM here, fine as plain GPIO. |
|
||||
| PC1 | OLED SDA | I2C1 |
|
||||
| PC2 | OLED SCL | I2C1 |
|
||||
| PC4 | IR Receiver VCC (switched) | GPIO output, drives power gate (high-side) for IR receiver module. Switch off when IR not in use to save current (~200–500 µA continuous draw when powered). |
|
||||
| PD1 | SWDIO | Reserved — debug/programming. Do not repurpose. |
|
||||
| PD2 | Buzzer (PWM tone) | TIM2-driven PWM, passive piezo. Confirmed working pattern on this chip; caution that heavy use can interfere with programming since PD1 (SWDIO) is adjacent/shared in function. |
|
||||
| PD3 | IR Receiver DATA | Input, pull-up. EXTI-capable — use falling-edge interrupt to catch IR bursts rather than polling. Note: TIM1 default-remap CH2 also lives here, unused as PWM in this design. |
|
||||
| PD4 | IR TX (PWM, 38 kHz carrier) | TIM1 CH1 (default remap). Drives transistor stage → IR333C-A LED, current-limited per design. |
|
||||
| PD5 | Right Button | Input, pull-up. Also candidate wake-from-sleep EXTI source. |
|
||||
| PD6 | Left Button | Input, pull-up. |
|
||||
| PD7 | NRST | Reserved (shared reset pad). Reconfigure deliberately only if using as deep-sleep wake source — confirm wake mode requirements before repurposing. |
|
||||
|
||||
### Free / unused pins
|
||||
|
||||
PA2, PC3, PC5, PC6, PC7, PD0
|
||||
|
||||
- PC3 was earlier considered for TLV61070A EN, but EN is wired per the power architecture below (see note).
|
||||
- PC5/PC7 carry TIM1 full-remap alternate functions (CH1/ETR, CH2) — keep in mind if a second PWM channel is needed later.
|
||||
- PA2 has no documented alternate-function entanglement found so far — good candidate for future expansion, similar to PA1.
|
||||
|
||||
## Power Architecture
|
||||
|
||||
- **Cell:** CR2032 coin cell
|
||||
- **Boost converter:** TLV61070A (synchronous boost, SOT-23-6, DBV)
|
||||
- VIN: direct from CR2032
|
||||
- VOUT: 3.3V, set via FB divider **R1 = 560 kΩ, R2 = 100 kΩ** (Vref ≈ 0.5V typical — confirm tolerance in datasheet if accuracy-critical)
|
||||
- EN: tie to VIN for always-on main MCU rail (no GPIO needed), OR to a GPIO if this specific converter instance needs to be software-gateable. **Confirm which role this converter instance plays in the final design** — if it's the main MCU supply, EN→VIN is correct; if it's a switchable secondary rail, EN needs a GPIO instead.
|
||||
- True load disconnect on EN-low (no body-diode leakage path), unlike most boost converters — useful if this rail ever needs clean shutdown.
|
||||
- Light-load power-save mode, ~20 µA Iq from VOUT.
|
||||
|
||||
- **OLED power gating:** No dedicated pin assigned in this pinout. The module has no always-on indicator LED, so the software `0xAE` display-off command may be sufficient on its own. Hardware gating was discussed as an option but not assigned a pin — confirm before layout freeze if hardware gating is still wanted for the OLED, separate from the IR receiver gating on PC4.
|
||||
|
||||
- **IR Receiver power gating:** PC4 drives the IR receiver module's VCC, switched off when not listening for IR, to avoid the ~200–500 µA continuous draw typical of TSOP-style demodulating receivers (exact figure for XL-IRM0038D not independently confirmed — estimated from sibling parts in the same family).
|
||||
|
||||
## Display
|
||||
|
||||
- **Module:** SSD1306, 128×64 (or 128×32 — confirm)
|
||||
- **Interface:** I2C1, SDA = PC1, SCL = PC2
|
||||
- **Power:** confirm whether gated or tied to main 3.3V rail (see Power Architecture note above)
|
||||
|
||||
## IR Subsystem
|
||||
|
||||
- **TX LED:** Everlight IR333C-A, 940 nm, 5mm through-hole (LCSC C5130)
|
||||
- Driven via PD4 (TIM1 CH1 PWM, 38 kHz carrier) through a transistor stage (reservoir capacitor topology / AC-coupled gate protection, per existing design pattern)
|
||||
- Current heavily limited per design intent — confirm final resistor/transistor values against IR333C-A datasheet forward voltage/current specs
|
||||
- **RX Module:** Xinglight XL-IRM0038D, 38 kHz, SIP-3 through-hole
|
||||
- VCC: PC4 (switched)
|
||||
- DATA (OUT): PD3, input pull-up, EXTI falling-edge
|
||||
- GND: common ground
|
||||
- **Pin order not independently verified in this conversation — confirm against XL-IRM0038D datasheet/silkscreen before finalizing layout (SIP-3 IR receiver modules vary in pin order between manufacturers).**
|
||||
|
||||
## Audio
|
||||
|
||||
- **Buzzer:** Passive piezo, PWM tone generation via PD2 (TIM2)
|
||||
|
||||
## Inputs
|
||||
|
||||
- 3x tactile buttons: PC0 (OK), PD5 (Right), PD6 (Left) — all input, internal or external pull-up, active-low, software debounce
|
||||
- One of these (suggest PD5) intended as deep-sleep wake-from-EXTI source — confirm in firmware before relying on it for wake behavior, and confirm sleep mode (standby vs. lighter retained-state sleep) since wake mechanism differs between modes on this chip.
|
||||
|
||||
|
|
@ -0,0 +1,443 @@
|
|||
// Auto-generated by sprites_gen.py -- do not edit by hand.
|
||||
#ifndef _SPRITES_H
|
||||
#define _SPRITES_H
|
||||
|
||||
#define PANA_W 32
|
||||
#define PANA_H 32
|
||||
#define ICON_W 16
|
||||
#define ICON_H 16
|
||||
|
||||
// pana_idle: 32x32
|
||||
static const unsigned char pana_idle[] = {
|
||||
0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00,
|
||||
0x01, 0x00, 0x00, 0x80,
|
||||
0x0f, 0xe0, 0x07, 0xf0,
|
||||
0x1f, 0xf0, 0x0f, 0xf8,
|
||||
0x1f, 0xf0, 0x0f, 0xf8,
|
||||
0x1f, 0xf0, 0x0f, 0xf8,
|
||||
0x3f, 0xf8, 0x9f, 0xfc,
|
||||
0x1f, 0xff, 0xff, 0xf8,
|
||||
0x1f, 0xff, 0xff, 0xf8,
|
||||
0x1f, 0xff, 0xff, 0xf8,
|
||||
0x0f, 0xff, 0xff, 0xf0,
|
||||
0x03, 0xff, 0xff, 0xe0,
|
||||
0x07, 0xff, 0xff, 0xf0,
|
||||
0x07, 0xef, 0xfb, 0xf0,
|
||||
0x0f, 0x83, 0xe0, 0xf8,
|
||||
0x0f, 0x93, 0xe4, 0xf8,
|
||||
0x0f, 0x11, 0xc4, 0x78,
|
||||
0x0f, 0x83, 0xe0, 0xf8,
|
||||
0x1f, 0x83, 0xe0, 0xfc,
|
||||
0x0f, 0xef, 0x7b, 0xf8,
|
||||
0x0f, 0xfc, 0x1f, 0xf8,
|
||||
0x0f, 0xff, 0x7f, 0xf8,
|
||||
0x0f, 0xff, 0xff, 0xf8,
|
||||
0x07, 0xf8, 0x0f, 0xf0,
|
||||
0x07, 0xff, 0xff, 0xf0,
|
||||
0x03, 0xff, 0xff, 0xe0,
|
||||
0x01, 0xff, 0xff, 0xc0,
|
||||
0x00, 0xff, 0xff, 0x80,
|
||||
0x00, 0x7f, 0xff, 0x00,
|
||||
0x00, 0x1f, 0xfc, 0x00,
|
||||
0x00, 0x00, 0x80, 0x00,
|
||||
};
|
||||
|
||||
// pana_blink: 32x32
|
||||
static const unsigned char pana_blink[] = {
|
||||
0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00,
|
||||
0x01, 0x00, 0x00, 0x80,
|
||||
0x0f, 0xe0, 0x07, 0xf0,
|
||||
0x1f, 0xf0, 0x0f, 0xf8,
|
||||
0x1f, 0xf0, 0x0f, 0xf8,
|
||||
0x1f, 0xf0, 0x0f, 0xf8,
|
||||
0x3f, 0xf8, 0x9f, 0xfc,
|
||||
0x1f, 0xff, 0xff, 0xf8,
|
||||
0x1f, 0xff, 0xff, 0xf8,
|
||||
0x1f, 0xff, 0xff, 0xf8,
|
||||
0x0f, 0xff, 0xff, 0xf0,
|
||||
0x03, 0xff, 0xff, 0xe0,
|
||||
0x07, 0xff, 0xff, 0xf0,
|
||||
0x07, 0xff, 0xff, 0xf0,
|
||||
0x0f, 0xff, 0xff, 0xf8,
|
||||
0x0f, 0xff, 0xff, 0xf8,
|
||||
0x0f, 0x01, 0xc0, 0x78,
|
||||
0x0f, 0xff, 0xff, 0xf8,
|
||||
0x1f, 0xff, 0xff, 0xfc,
|
||||
0x0f, 0xff, 0x7f, 0xf8,
|
||||
0x0f, 0xfc, 0x1f, 0xf8,
|
||||
0x0f, 0xff, 0x7f, 0xf8,
|
||||
0x0f, 0xff, 0xff, 0xf8,
|
||||
0x07, 0xf8, 0x0f, 0xf0,
|
||||
0x07, 0xff, 0xff, 0xf0,
|
||||
0x03, 0xff, 0xff, 0xe0,
|
||||
0x01, 0xff, 0xff, 0xc0,
|
||||
0x00, 0xff, 0xff, 0x80,
|
||||
0x00, 0x7f, 0xff, 0x00,
|
||||
0x00, 0x1f, 0xfc, 0x00,
|
||||
0x00, 0x00, 0x80, 0x00,
|
||||
};
|
||||
|
||||
// pana_happy: 32x32
|
||||
static const unsigned char pana_happy[] = {
|
||||
0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00,
|
||||
0x01, 0x00, 0x00, 0x80,
|
||||
0x0f, 0xe0, 0x07, 0xf0,
|
||||
0x1f, 0xf0, 0x0f, 0xf8,
|
||||
0x1f, 0xf0, 0x0f, 0xf8,
|
||||
0x1f, 0xf0, 0x0f, 0xf8,
|
||||
0x3f, 0xf8, 0x9f, 0xfc,
|
||||
0x1f, 0xff, 0xff, 0xf8,
|
||||
0x1f, 0xff, 0xff, 0xf8,
|
||||
0x1f, 0xff, 0xff, 0xf8,
|
||||
0x0f, 0xff, 0xff, 0xf0,
|
||||
0x03, 0xff, 0xff, 0xe0,
|
||||
0x07, 0xff, 0xff, 0xf0,
|
||||
0x07, 0xff, 0xff, 0xf0,
|
||||
0x0f, 0xff, 0xff, 0xf8,
|
||||
0x0f, 0xef, 0xfb, 0xf8,
|
||||
0x0f, 0xd7, 0xf5, 0xf8,
|
||||
0x0f, 0xff, 0xff, 0xf8,
|
||||
0x1f, 0xff, 0xff, 0xfc,
|
||||
0x0f, 0xff, 0xff, 0xf8,
|
||||
0x0f, 0xf8, 0x0f, 0xf8,
|
||||
0x0f, 0xfb, 0xef, 0xf8,
|
||||
0x0f, 0xf7, 0xf7, 0xf8,
|
||||
0x07, 0xfc, 0x1f, 0xf0,
|
||||
0x07, 0xff, 0xff, 0xf0,
|
||||
0x03, 0xff, 0xff, 0xe0,
|
||||
0x01, 0xff, 0xff, 0xc0,
|
||||
0x00, 0xff, 0xff, 0x80,
|
||||
0x00, 0x7f, 0xff, 0x00,
|
||||
0x00, 0x1f, 0xfc, 0x00,
|
||||
0x00, 0x00, 0x80, 0x00,
|
||||
};
|
||||
|
||||
// pana_sad: 32x32
|
||||
static const unsigned char pana_sad[] = {
|
||||
0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00,
|
||||
0x01, 0x00, 0x00, 0x80,
|
||||
0x0f, 0xe0, 0x07, 0xf0,
|
||||
0x1f, 0xf0, 0x0f, 0xf8,
|
||||
0x1f, 0xf0, 0x0f, 0xf8,
|
||||
0x1f, 0xf0, 0x0f, 0xf8,
|
||||
0x3f, 0xf8, 0x9f, 0xfc,
|
||||
0x1f, 0xff, 0xff, 0xf8,
|
||||
0x1f, 0xff, 0xff, 0xf8,
|
||||
0x1f, 0xff, 0xff, 0xf8,
|
||||
0x0f, 0xff, 0xff, 0xf0,
|
||||
0x03, 0xff, 0xff, 0xe0,
|
||||
0x07, 0xff, 0xff, 0xf0,
|
||||
0x07, 0xff, 0xff, 0xf0,
|
||||
0x0f, 0xef, 0xfb, 0xf8,
|
||||
0x0f, 0x83, 0xe0, 0xf8,
|
||||
0x0f, 0x93, 0xe4, 0xf8,
|
||||
0x0f, 0x11, 0xc4, 0x78,
|
||||
0x1f, 0x83, 0xe0, 0xfc,
|
||||
0x0f, 0x83, 0x60, 0xf8,
|
||||
0x0f, 0xec, 0x1b, 0xf8,
|
||||
0x0f, 0xff, 0x7f, 0xf8,
|
||||
0x0f, 0xfc, 0x1f, 0xf8,
|
||||
0x07, 0xf7, 0xf7, 0xf0,
|
||||
0x07, 0xfb, 0xef, 0xf0,
|
||||
0x03, 0xff, 0xff, 0xe0,
|
||||
0x01, 0xff, 0xff, 0xc0,
|
||||
0x00, 0xff, 0xff, 0x80,
|
||||
0x00, 0x7f, 0xff, 0x00,
|
||||
0x00, 0x1f, 0xfc, 0x00,
|
||||
0x00, 0x00, 0x80, 0x00,
|
||||
};
|
||||
|
||||
// pana_eat: 32x32
|
||||
static const unsigned char pana_eat[] = {
|
||||
0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00,
|
||||
0x01, 0x00, 0x00, 0x80,
|
||||
0x0f, 0xe0, 0x07, 0xf0,
|
||||
0x1f, 0xf0, 0x0f, 0xf8,
|
||||
0x1f, 0xf0, 0x0f, 0xf8,
|
||||
0x1f, 0xf0, 0x0f, 0xf8,
|
||||
0x3f, 0xf8, 0x9f, 0xfc,
|
||||
0x1f, 0xff, 0xff, 0xf8,
|
||||
0x1f, 0xff, 0xff, 0xf8,
|
||||
0x1f, 0xff, 0xff, 0xf8,
|
||||
0x0f, 0xff, 0xff, 0xf0,
|
||||
0x03, 0xff, 0xff, 0xe0,
|
||||
0x07, 0xef, 0xfb, 0xf0,
|
||||
0x07, 0x83, 0xe0, 0xf0,
|
||||
0x0f, 0x93, 0xe4, 0xf8,
|
||||
0x0f, 0x11, 0xc4, 0x78,
|
||||
0x0f, 0x83, 0xe0, 0xf8,
|
||||
0x0f, 0x83, 0xe0, 0xf8,
|
||||
0x1f, 0xef, 0xfb, 0xfc,
|
||||
0x0f, 0xff, 0x7f, 0xf8,
|
||||
0x0f, 0xfc, 0x1f, 0xf8,
|
||||
0x0f, 0xfc, 0x1f, 0xf8,
|
||||
0x0f, 0xf8, 0x0f, 0xf8,
|
||||
0x07, 0xfc, 0x1f, 0xf0,
|
||||
0x07, 0xfc, 0x1f, 0xf0,
|
||||
0x03, 0xff, 0x7f, 0xe0,
|
||||
0x01, 0xff, 0xff, 0xc0,
|
||||
0x00, 0xff, 0xff, 0x80,
|
||||
0x00, 0x7f, 0xff, 0x00,
|
||||
0x00, 0x1f, 0xfc, 0x00,
|
||||
0x00, 0x00, 0x80, 0x00,
|
||||
};
|
||||
|
||||
// pana_sleep: 32x32
|
||||
static const unsigned char pana_sleep[] = {
|
||||
0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00,
|
||||
0x01, 0x00, 0x00, 0x80,
|
||||
0x0f, 0xe0, 0x07, 0xf0,
|
||||
0x1f, 0xf0, 0x0f, 0xf8,
|
||||
0x1f, 0xf0, 0x0f, 0xf8,
|
||||
0x1f, 0xf0, 0x0f, 0xf8,
|
||||
0x3f, 0xf8, 0x9f, 0xfc,
|
||||
0x1f, 0xff, 0xff, 0xf8,
|
||||
0x1f, 0xff, 0xff, 0xf8,
|
||||
0x1f, 0xff, 0xff, 0xf8,
|
||||
0x0f, 0xff, 0xff, 0xf0,
|
||||
0x03, 0xff, 0xff, 0xe0,
|
||||
0x07, 0xff, 0xff, 0xf0,
|
||||
0x07, 0xff, 0xff, 0xf0,
|
||||
0x0f, 0xff, 0xff, 0xf8,
|
||||
0x0f, 0xff, 0xff, 0xf8,
|
||||
0x0f, 0xff, 0xff, 0xf8,
|
||||
0x0f, 0x01, 0xc0, 0x78,
|
||||
0x1f, 0xff, 0xff, 0xfc,
|
||||
0x0f, 0xff, 0xff, 0xf8,
|
||||
0x0f, 0xff, 0x7f, 0xf8,
|
||||
0x0f, 0xfc, 0x1f, 0xf8,
|
||||
0x0f, 0xff, 0x7f, 0xf8,
|
||||
0x07, 0xff, 0xff, 0xf0,
|
||||
0x07, 0xff, 0xff, 0xf0,
|
||||
0x03, 0xff, 0xff, 0xe0,
|
||||
0x01, 0xff, 0xff, 0xc0,
|
||||
0x00, 0xff, 0xff, 0x80,
|
||||
0x00, 0x7f, 0xff, 0x00,
|
||||
0x00, 0x1f, 0xfc, 0x00,
|
||||
0x00, 0x00, 0x80, 0x00,
|
||||
};
|
||||
|
||||
// pana_dead: 32x32
|
||||
static const unsigned char pana_dead[] = {
|
||||
0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00,
|
||||
0x01, 0x00, 0x00, 0x80,
|
||||
0x0f, 0xe0, 0x07, 0xf0,
|
||||
0x1f, 0xf0, 0x0f, 0xf8,
|
||||
0x1f, 0xf0, 0x0f, 0xf8,
|
||||
0x1f, 0xf0, 0x0f, 0xf8,
|
||||
0x3f, 0xf8, 0x9f, 0xfc,
|
||||
0x1f, 0xff, 0xff, 0xf8,
|
||||
0x1f, 0xff, 0xff, 0xf8,
|
||||
0x1f, 0xff, 0xff, 0xf8,
|
||||
0x0f, 0xff, 0xff, 0xf0,
|
||||
0x03, 0xff, 0xff, 0xe0,
|
||||
0x07, 0xff, 0xff, 0xf0,
|
||||
0x07, 0xff, 0xff, 0xf0,
|
||||
0x0f, 0xbb, 0xee, 0xf8,
|
||||
0x0f, 0xd7, 0xf5, 0xf8,
|
||||
0x0f, 0xef, 0xfb, 0xf8,
|
||||
0x0f, 0xd7, 0xf5, 0xf8,
|
||||
0x1f, 0xbb, 0xee, 0xfc,
|
||||
0x0f, 0xff, 0xff, 0xf8,
|
||||
0x0f, 0xff, 0xff, 0xf8,
|
||||
0x0f, 0xff, 0xff, 0xf8,
|
||||
0x0f, 0xf0, 0x07, 0xf8,
|
||||
0x07, 0xff, 0xff, 0xf0,
|
||||
0x07, 0xff, 0xff, 0xf0,
|
||||
0x03, 0xff, 0xff, 0xe0,
|
||||
0x01, 0xff, 0xff, 0xc0,
|
||||
0x00, 0xff, 0xff, 0x80,
|
||||
0x00, 0x7f, 0xff, 0x00,
|
||||
0x00, 0x1f, 0xfc, 0x00,
|
||||
0x00, 0x00, 0x80, 0x00,
|
||||
};
|
||||
|
||||
enum { EXP_IDLE, EXP_BLINK, EXP_HAPPY, EXP_SAD, EXP_EAT, EXP_SLEEP, EXP_DEAD, EXP_COUNT };
|
||||
static const unsigned char *const pana_frames[EXP_COUNT] = {
|
||||
pana_idle, pana_blink, pana_happy, pana_sad, pana_eat, pana_sleep, pana_dead,
|
||||
};
|
||||
|
||||
// spr_grave: 32x32
|
||||
static const unsigned char spr_grave[] = {
|
||||
0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0xff, 0xfc, 0x00,
|
||||
0x03, 0xff, 0xff, 0x00,
|
||||
0x07, 0xff, 0xff, 0x80,
|
||||
0x06, 0x1f, 0xe1, 0x80,
|
||||
0x06, 0x30, 0x31, 0x80,
|
||||
0x06, 0x30, 0x31, 0x80,
|
||||
0x06, 0x3f, 0xc3, 0x00,
|
||||
0x06, 0x33, 0x03, 0x00,
|
||||
0x06, 0x31, 0x83, 0x00,
|
||||
0x06, 0x30, 0xc3, 0x00,
|
||||
0x06, 0x00, 0x06, 0x00,
|
||||
0x06, 0x0f, 0x06, 0x00,
|
||||
0x07, 0xff, 0xff, 0x80,
|
||||
0x0f, 0xff, 0xff, 0xc0,
|
||||
0x1f, 0xff, 0xff, 0xe0,
|
||||
0x3f, 0xff, 0xff, 0xf0,
|
||||
0x7f, 0xff, 0xff, 0xf8,
|
||||
0xff, 0xff, 0xff, 0xfc,
|
||||
0xff, 0xff, 0xff, 0xfc,
|
||||
0x00, 0xf0, 0xf0, 0x00,
|
||||
0x03, 0xff, 0xf0, 0x00,
|
||||
0x0f, 0xff, 0xfc, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00,
|
||||
};
|
||||
|
||||
// spr_poop: 8x8
|
||||
static const unsigned char spr_poop[] = {
|
||||
0x00,
|
||||
0x18,
|
||||
0x3c,
|
||||
0x6c,
|
||||
0x7e,
|
||||
0xff,
|
||||
0xff,
|
||||
0x00,
|
||||
};
|
||||
|
||||
// icon_feed: 16x16
|
||||
static const unsigned char icon_feed[] = {
|
||||
0x00, 0x00,
|
||||
0x00, 0x00,
|
||||
0x00, 0xa0,
|
||||
0x01, 0x90,
|
||||
0x0f, 0xe0,
|
||||
0x1b, 0xf0,
|
||||
0x3b, 0xf8,
|
||||
0x31, 0xf8,
|
||||
0x3b, 0xf8,
|
||||
0x7b, 0xfc,
|
||||
0x3f, 0xf8,
|
||||
0x3f, 0xf8,
|
||||
0x3f, 0xf8,
|
||||
0x1f, 0xf0,
|
||||
0x0f, 0xe0,
|
||||
0x01, 0x00,
|
||||
};
|
||||
|
||||
// icon_play: 16x16
|
||||
static const unsigned char icon_play[] = {
|
||||
0x00, 0x00,
|
||||
0x00, 0x00,
|
||||
0x07, 0x70,
|
||||
0x00, 0x00,
|
||||
0x1f, 0x7c,
|
||||
0x3f, 0x7e,
|
||||
0x3f, 0x7e,
|
||||
0x3f, 0x7e,
|
||||
0x00, 0x00,
|
||||
0x3f, 0x7e,
|
||||
0x3f, 0x7e,
|
||||
0x3f, 0x7e,
|
||||
0x1f, 0x7c,
|
||||
0x00, 0x00,
|
||||
0x07, 0x70,
|
||||
0x00, 0x00,
|
||||
};
|
||||
|
||||
// icon_sleep: 16x16
|
||||
static const unsigned char icon_sleep[] = {
|
||||
0x00, 0x00,
|
||||
0x00, 0x00,
|
||||
0x00, 0x00,
|
||||
0x04, 0x00,
|
||||
0x0c, 0x00,
|
||||
0x1c, 0x00,
|
||||
0x18, 0x00,
|
||||
0x1c, 0x00,
|
||||
0x3c, 0x00,
|
||||
0x1c, 0x00,
|
||||
0x1e, 0x00,
|
||||
0x1f, 0x00,
|
||||
0x0f, 0xe8,
|
||||
0x07, 0xf0,
|
||||
0x00, 0x80,
|
||||
0x00, 0x00,
|
||||
};
|
||||
|
||||
// icon_clean: 16x16
|
||||
static const unsigned char icon_clean[] = {
|
||||
0x00, 0x00,
|
||||
0x00, 0x00,
|
||||
0x00, 0x80,
|
||||
0x00, 0x80,
|
||||
0x01, 0xc0,
|
||||
0x01, 0xc0,
|
||||
0x07, 0xf0,
|
||||
0x0d, 0xf8,
|
||||
0x0d, 0xf8,
|
||||
0x08, 0xf8,
|
||||
0x1d, 0xfc,
|
||||
0x0d, 0xf8,
|
||||
0x0f, 0xf8,
|
||||
0x0f, 0xf8,
|
||||
0x07, 0xf0,
|
||||
0x00, 0x80,
|
||||
};
|
||||
|
||||
// icon_heal: 16x16
|
||||
static const unsigned char icon_heal[] = {
|
||||
0x00, 0x00,
|
||||
0x00, 0x80,
|
||||
0x07, 0xf0,
|
||||
0x0f, 0xf8,
|
||||
0x1c, 0x3c,
|
||||
0x3c, 0x3e,
|
||||
0x30, 0x0e,
|
||||
0x30, 0x0e,
|
||||
0x70, 0x0f,
|
||||
0x30, 0x0e,
|
||||
0x3c, 0x3e,
|
||||
0x3c, 0x3e,
|
||||
0x1f, 0xfc,
|
||||
0x0f, 0xf8,
|
||||
0x07, 0xf0,
|
||||
0x00, 0x80,
|
||||
};
|
||||
|
||||
// icon_stats: 16x16
|
||||
static const unsigned char icon_stats[] = {
|
||||
0x00, 0x00,
|
||||
0x00, 0x00,
|
||||
0x00, 0x00,
|
||||
0x00, 0xc0,
|
||||
0x00, 0xc0,
|
||||
0x00, 0xc0,
|
||||
0x06, 0xc0,
|
||||
0x06, 0xc0,
|
||||
0x06, 0xd8,
|
||||
0x06, 0xd8,
|
||||
0x36, 0xd8,
|
||||
0x36, 0xd8,
|
||||
0x36, 0xd8,
|
||||
0x36, 0xd8,
|
||||
0x00, 0x00,
|
||||
0x00, 0x00,
|
||||
};
|
||||
|
||||
#define ICON_COUNT 6
|
||||
static const unsigned char *const menu_icons[ICON_COUNT] = {
|
||||
icon_feed, icon_play, icon_sleep, icon_clean, icon_heal, icon_stats,
|
||||
};
|
||||
static const char *const menu_labels[ICON_COUNT] = {
|
||||
"FEED", "PLAY", "SLEEP", "CLEAN", "HEAL", "STATS",
|
||||
};
|
||||
|
||||
#endif // _SPRITES_H
|
||||
|
|
@ -0,0 +1,312 @@
|
|||
#!/usr/bin/env python3
|
||||
"""
|
||||
sprites_gen.py -> generates sprites.h for the Panagotchi firmware.
|
||||
|
||||
All artwork is defined here as math/ASCII so it stays human-editable.
|
||||
Output is packed 1-bpp, row-major, MSB-first -- exactly the format
|
||||
ch32fun's ssd1306_drawImage() expects (width must be a multiple of 8).
|
||||
|
||||
Run: python3 sprites_gen.py > sprites.h
|
||||
"""
|
||||
|
||||
# ---------------------------------------------------------------- grid helpers
|
||||
def grid(w, h):
|
||||
return [[0] * w for _ in range(h)]
|
||||
|
||||
def px(g, x, y, v=1):
|
||||
if 0 <= y < len(g) and 0 <= x < len(g[0]):
|
||||
g[y][x] = v
|
||||
|
||||
def fill_ellipse(g, cx, cy, rx, ry, v=1):
|
||||
for y in range(len(g)):
|
||||
for x in range(len(g[0])):
|
||||
dx = (x - cx) / rx
|
||||
dy = (y - cy) / ry
|
||||
if dx * dx + dy * dy <= 1.0:
|
||||
g[y][x] = v
|
||||
|
||||
def hline(g, x0, x1, y, v=1):
|
||||
if x0 > x1:
|
||||
x0, x1 = x1, x0
|
||||
for x in range(x0, x1 + 1):
|
||||
px(g, x, y, v)
|
||||
|
||||
def vline(g, x, y0, y1, v=1):
|
||||
if y0 > y1:
|
||||
y0, y1 = y1, y0
|
||||
for y in range(y0, y1 + 1):
|
||||
px(g, x, y, v)
|
||||
|
||||
def from_art(art):
|
||||
"""art = list of strings, '#'/'X'/'1' -> 1, anything else -> 0.
|
||||
Rows are padded to a common width (rounded up to a multiple of 8)."""
|
||||
w = max(len(r) for r in art)
|
||||
w = (w + 7) // 8 * 8
|
||||
g = []
|
||||
for row in art:
|
||||
g.append([1 if c in "#X1" else 0 for c in row.ljust(w)])
|
||||
return g
|
||||
|
||||
def pack(g):
|
||||
"""Pack to bytes, MSB first, width padded to multiple of 8."""
|
||||
h = len(g)
|
||||
w = len(g[0])
|
||||
wbytes = (w + 7) // 8
|
||||
out = []
|
||||
for y in range(h):
|
||||
for b in range(wbytes):
|
||||
byte = 0
|
||||
for bit in range(8):
|
||||
x = b * 8 + bit
|
||||
if x < w and g[y][x]:
|
||||
byte |= 0x80 >> bit
|
||||
out.append(byte)
|
||||
return out
|
||||
|
||||
def emit(name, g):
|
||||
data = pack(g)
|
||||
w = len(g[0])
|
||||
wbytes = (w + 7) // 8
|
||||
print(f"// {name}: {w}x{len(g)}")
|
||||
print(f"static const unsigned char {name}[] = {{")
|
||||
for i in range(0, len(data), wbytes):
|
||||
row = data[i:i + wbytes]
|
||||
print(" " + ", ".join(f"0x{v:02x}" for v in row) + ",")
|
||||
print("};")
|
||||
print()
|
||||
|
||||
# ---------------------------------------------------------------- the panda
|
||||
# 32x32 base body: round head/body + two ears. Features carved per expression.
|
||||
def base_panda():
|
||||
g = grid(32, 32)
|
||||
fill_ellipse(g, 16, 19, 13, 12) # head/body
|
||||
fill_ellipse(g, 7, 7, 5, 5) # left ear
|
||||
fill_ellipse(g, 24, 7, 5, 5) # right ear
|
||||
return g
|
||||
|
||||
def carve_eye(g, cx, cy): # dark socket + lit pupil
|
||||
fill_ellipse(g, cx, cy, 3, 3, 0)
|
||||
px(g, cx, cy, 1)
|
||||
px(g, cx, cy - 1, 1)
|
||||
|
||||
def panda_idle():
|
||||
g = base_panda()
|
||||
carve_eye(g, 11, 17)
|
||||
carve_eye(g, 21, 17)
|
||||
fill_ellipse(g, 16, 21, 2, 1, 0) # nose
|
||||
hline(g, 13, 19, 24, 0) # gentle mouth
|
||||
return g
|
||||
|
||||
def panda_blink():
|
||||
g = base_panda()
|
||||
hline(g, 8, 14, 17, 0) # closed eyes
|
||||
hline(g, 18, 24, 17, 0)
|
||||
fill_ellipse(g, 16, 21, 2, 1, 0)
|
||||
hline(g, 13, 19, 24, 0)
|
||||
return g
|
||||
|
||||
def panda_happy():
|
||||
g = base_panda()
|
||||
# ^ ^ eyes
|
||||
px(g, 10, 17, 0); px(g, 11, 16, 0); px(g, 12, 17, 0)
|
||||
px(g, 20, 17, 0); px(g, 21, 16, 0); px(g, 22, 17, 0)
|
||||
# big smile
|
||||
for x in range(12, 21):
|
||||
y = 22 + (1 if x in (12, 20) else (2 if 14 <= x <= 18 else 0))
|
||||
px(g, x, y, 0)
|
||||
hline(g, 13, 19, 21, 0)
|
||||
return g
|
||||
|
||||
def panda_sad():
|
||||
g = base_panda()
|
||||
carve_eye(g, 11, 18)
|
||||
carve_eye(g, 21, 18)
|
||||
fill_ellipse(g, 16, 21, 2, 1, 0)
|
||||
# frown
|
||||
for x in range(12, 21):
|
||||
y = 25 - (1 if x in (12, 20) else (2 if 14 <= x <= 18 else 0))
|
||||
px(g, x, y, 0)
|
||||
px(g, 8, 22, 1) # tear (lit dot below eye)
|
||||
px(g, 8, 23, 1)
|
||||
return g
|
||||
|
||||
def panda_eat():
|
||||
g = base_panda()
|
||||
carve_eye(g, 11, 16)
|
||||
carve_eye(g, 21, 16)
|
||||
fill_ellipse(g, 16, 23, 3, 3, 0) # wide open mouth
|
||||
return g
|
||||
|
||||
def panda_sleep():
|
||||
g = base_panda()
|
||||
hline(g, 8, 14, 18, 0) # closed, relaxed
|
||||
hline(g, 18, 24, 18, 0)
|
||||
fill_ellipse(g, 16, 22, 2, 1, 0)
|
||||
return g
|
||||
|
||||
def panda_dead():
|
||||
g = base_panda()
|
||||
# X X eyes
|
||||
for d in range(-2, 3):
|
||||
px(g, 11 + d, 17 + d, 0); px(g, 11 + d, 17 - d, 0)
|
||||
px(g, 21 + d, 17 + d, 0); px(g, 21 + d, 17 - d, 0)
|
||||
hline(g, 12, 20, 23, 0) # flat mouth
|
||||
return g
|
||||
|
||||
# ---------------------------------------------------------------- props
|
||||
def grave():
|
||||
art = [
|
||||
" ",
|
||||
" ",
|
||||
" ############## ",
|
||||
" ################## ",
|
||||
" #################### ",
|
||||
" ## ######## ## ",
|
||||
" ## ## ## ## ",
|
||||
" ## ## ## ## ",
|
||||
" ## ######## ## ",
|
||||
" ## ## ## ## ",
|
||||
" ## ## ## ## ",
|
||||
" ## ## ## ## ",
|
||||
" ## ## ",
|
||||
" ## #### ## ",
|
||||
" #################### ",
|
||||
" ###################### ",
|
||||
" ######################## ",
|
||||
" ########################## ",
|
||||
" ############################ ",
|
||||
"############################## ",
|
||||
"############################## ",
|
||||
" #### #### ",
|
||||
" ############## ",
|
||||
" ################## ",
|
||||
" ",
|
||||
" ",
|
||||
" ",
|
||||
" ",
|
||||
" ",
|
||||
" ",
|
||||
" ",
|
||||
" ",
|
||||
]
|
||||
return from_art(art)
|
||||
|
||||
def poop():
|
||||
art = [
|
||||
" ",
|
||||
" ## ",
|
||||
" #### ",
|
||||
" ## ## ",
|
||||
" ###### ",
|
||||
"########",
|
||||
"########",
|
||||
" ",
|
||||
]
|
||||
return from_art(art)
|
||||
|
||||
# ---------------------------------------------------------------- 16x16 icons
|
||||
def icon_feed(): # apple
|
||||
g = grid(16, 16)
|
||||
fill_ellipse(g, 7, 9, 6, 6)
|
||||
vline(g, 8, 2, 4) # stem
|
||||
px(g, 10, 2); px(g, 11, 3) # leaf
|
||||
fill_ellipse(g, 5, 7, 1, 2, 0) # shine
|
||||
return g
|
||||
|
||||
def icon_play(): # ball
|
||||
g = grid(16, 16)
|
||||
fill_ellipse(g, 8, 8, 7, 7)
|
||||
hline(g, 1, 15, 8, 0)
|
||||
vline(g, 8, 1, 15, 0)
|
||||
for d in range(-5, 6):
|
||||
px(g, 8 + d, 3, 0); px(g, 8 + d, 13, 0)
|
||||
return g
|
||||
|
||||
def icon_sleep(): # moon
|
||||
g = grid(16, 16)
|
||||
fill_ellipse(g, 8, 8, 6, 6)
|
||||
fill_ellipse(g, 11, 6, 6, 6, 0) # crescent cut
|
||||
return g
|
||||
|
||||
def icon_clean(): # water drop
|
||||
g = grid(16, 16)
|
||||
fill_ellipse(g, 8, 10, 5, 5)
|
||||
for y in range(2, 10):
|
||||
half = (y - 2) // 2
|
||||
hline(g, 8 - half, 8 + half, y)
|
||||
fill_ellipse(g, 6, 9, 1, 2, 0)
|
||||
return g
|
||||
|
||||
def icon_heal(): # plus / cross
|
||||
g = grid(16, 16)
|
||||
fill_ellipse(g, 8, 8, 7, 7)
|
||||
for t in range(4, 12):
|
||||
hline(g, 6, 9, t, 0)
|
||||
vline(g, t, 6, 9, 0)
|
||||
return g
|
||||
|
||||
def icon_stats(): # bar chart
|
||||
g = grid(16, 16)
|
||||
for i, h in enumerate((4, 8, 11, 6)):
|
||||
x = 2 + i * 3
|
||||
for yy in range(14 - h, 14):
|
||||
hline(g, x, x + 1, yy)
|
||||
return g
|
||||
|
||||
# ---------------------------------------------------------------- main
|
||||
def main():
|
||||
print("// Auto-generated by sprites_gen.py -- do not edit by hand.")
|
||||
print("#ifndef _SPRITES_H")
|
||||
print("#define _SPRITES_H")
|
||||
print()
|
||||
print("#define PANA_W 32")
|
||||
print("#define PANA_H 32")
|
||||
print("#define ICON_W 16")
|
||||
print("#define ICON_H 16")
|
||||
print()
|
||||
|
||||
frames = [
|
||||
("pana_idle", panda_idle()),
|
||||
("pana_blink", panda_blink()),
|
||||
("pana_happy", panda_happy()),
|
||||
("pana_sad", panda_sad()),
|
||||
("pana_eat", panda_eat()),
|
||||
("pana_sleep", panda_sleep()),
|
||||
("pana_dead", panda_dead()),
|
||||
]
|
||||
for n, g in frames:
|
||||
emit(n, g)
|
||||
|
||||
# expression index enum (matches frames[] order)
|
||||
print("enum { EXP_IDLE, EXP_BLINK, EXP_HAPPY, EXP_SAD, EXP_EAT, EXP_SLEEP, EXP_DEAD, EXP_COUNT };")
|
||||
print("static const unsigned char *const pana_frames[EXP_COUNT] = {")
|
||||
print(" pana_idle, pana_blink, pana_happy, pana_sad, pana_eat, pana_sleep, pana_dead,")
|
||||
print("};")
|
||||
print()
|
||||
|
||||
emit("spr_grave", grave())
|
||||
emit("spr_poop", poop())
|
||||
|
||||
icons = [
|
||||
("icon_feed", icon_feed()),
|
||||
("icon_play", icon_play()),
|
||||
("icon_sleep", icon_sleep()),
|
||||
("icon_clean", icon_clean()),
|
||||
("icon_heal", icon_heal()),
|
||||
("icon_stats", icon_stats()),
|
||||
]
|
||||
for n, g in icons:
|
||||
emit(n, g)
|
||||
|
||||
print("#define ICON_COUNT 6")
|
||||
print("static const unsigned char *const menu_icons[ICON_COUNT] = {")
|
||||
print(" icon_feed, icon_play, icon_sleep, icon_clean, icon_heal, icon_stats,")
|
||||
print("};")
|
||||
print('static const char *const menu_labels[ICON_COUNT] = {')
|
||||
print(' "FEED", "PLAY", "SLEEP", "CLEAN", "HEAL", "STATS",')
|
||||
print("};")
|
||||
print()
|
||||
print("#endif // _SPRITES_H")
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
|
|
@ -0,0 +1,413 @@
|
|||
/*
|
||||
* PANAGOTCHI -- a Tamagotchi-style virtual pet for the CH32V003F4P6 badge.
|
||||
*
|
||||
* Hardware (see pinout.md):
|
||||
* PA1 indicator LED (active-high)
|
||||
* PC0 OK button (active-low, internal pull-up)
|
||||
* PD5 Right button (active-low, internal pull-up)
|
||||
* PD6 Left button (active-low, internal pull-up)
|
||||
* PC1/PC2 SSD1306 128x64 OLED over I2C1 (driven by ssd1306_i2c.h)
|
||||
* PD2 passive piezo buzzer (square-wave bit-bang tone)
|
||||
*
|
||||
* Controls: Left / Right move the menu cursor, OK activates the selected
|
||||
* action. On the stats / dead screens any button returns / restarts.
|
||||
*/
|
||||
|
||||
#include "ch32fun.h"
|
||||
#include <stdio.h>
|
||||
|
||||
#define SSD1306_128X64 // 128x64 panel (see pinout.md / OLED size)
|
||||
#include "ssd1306_i2c.h"
|
||||
#include "ssd1306.h"
|
||||
#include "sprites.h"
|
||||
|
||||
// ----------------------------------------------------------------- pins
|
||||
#define LED_PIN PA1
|
||||
#define BTN_OK PC0
|
||||
#define BTN_RIGHT PD5
|
||||
#define BTN_LEFT PD6
|
||||
#define BUZZER PD2
|
||||
|
||||
// ----------------------------------------------------------------- tuning
|
||||
#define FRAME_MS 60 // main loop period
|
||||
#define TICK_FRAMES 50 // stat update every ~3 s (50 * 60 ms)
|
||||
#define ANIM_FRAMES 12 // how long an action reaction is shown
|
||||
|
||||
// ----------------------------------------------------------------- state
|
||||
enum { SCR_MAIN, SCR_STATS, SCR_DEAD };
|
||||
|
||||
typedef struct {
|
||||
int8_t satiety; // 0..100 (fullness)
|
||||
int8_t happy; // 0..100
|
||||
int8_t energy; // 0..100
|
||||
int8_t hygiene; // 0..100
|
||||
int8_t health; // 0..100
|
||||
uint16_t age_min; // age in game-minutes (one per tick)
|
||||
uint8_t poop; // 0..3 piles on the floor
|
||||
uint8_t sleeping; // 1 while napping
|
||||
uint8_t alive;
|
||||
} Pet;
|
||||
|
||||
static Pet pet;
|
||||
static uint8_t screen;
|
||||
static uint8_t cursor; // selected menu icon 0..ICON_COUNT-1
|
||||
static uint8_t anim_exp; // expression forced during a reaction
|
||||
static uint8_t anim_timer; // frames remaining for the reaction
|
||||
static uint32_t frame; // free-running frame counter
|
||||
static uint16_t tick_acc; // frames since last stat tick
|
||||
|
||||
// menu icon order must match sprites.h menu_icons[] / menu_labels[]
|
||||
enum { ACT_FEED, ACT_PLAY, ACT_SLEEP, ACT_CLEAN, ACT_HEAL, ACT_STATS };
|
||||
|
||||
// ----------------------------------------------------------------- helpers
|
||||
static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); }
|
||||
|
||||
// short square-wave beep on the passive piezo (blocking, ms-scale only)
|
||||
static void beep(uint16_t freq, uint16_t ms)
|
||||
{
|
||||
if (freq == 0) { Delay_Ms(ms); return; }
|
||||
uint32_t half = 500000u / freq; // half-period in us
|
||||
uint32_t cycles = ((uint32_t)ms * 1000u) / (half * 2u);
|
||||
for (uint32_t i = 0; i < cycles; i++) {
|
||||
funDigitalWrite(BUZZER, FUN_HIGH);
|
||||
Delay_Us(half);
|
||||
funDigitalWrite(BUZZER, FUN_LOW);
|
||||
Delay_Us(half);
|
||||
}
|
||||
}
|
||||
|
||||
static void led_blink(void)
|
||||
{
|
||||
funDigitalWrite(LED_PIN, FUN_HIGH);
|
||||
Delay_Ms(30);
|
||||
funDigitalWrite(LED_PIN, FUN_LOW);
|
||||
}
|
||||
|
||||
static void pet_reset(void)
|
||||
{
|
||||
pet.satiety = 80;
|
||||
pet.happy = 80;
|
||||
pet.energy = 90;
|
||||
pet.hygiene = 100;
|
||||
pet.health = 100;
|
||||
pet.age_min = 0;
|
||||
pet.poop = 0;
|
||||
pet.sleeping = 0;
|
||||
pet.alive = 1;
|
||||
screen = SCR_MAIN;
|
||||
cursor = 0;
|
||||
}
|
||||
|
||||
// pick the expression frame to draw this instant
|
||||
static uint8_t current_expression(void)
|
||||
{
|
||||
if (!pet.alive) return EXP_DEAD;
|
||||
if (anim_timer) return anim_exp;
|
||||
if (pet.sleeping) return EXP_SLEEP;
|
||||
if (pet.health < 30 || pet.happy < 25 || pet.satiety < 20)
|
||||
return EXP_SAD;
|
||||
// idle, with an occasional blink
|
||||
if ((frame % 50) < 4) return EXP_BLINK;
|
||||
return EXP_IDLE;
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------- actions
|
||||
static void react(uint8_t exp) { anim_exp = exp; anim_timer = ANIM_FRAMES; }
|
||||
|
||||
static void do_action(uint8_t act)
|
||||
{
|
||||
switch (act) {
|
||||
case ACT_FEED:
|
||||
pet.satiety = clamp100(pet.satiety + 30);
|
||||
pet.hygiene = clamp100(pet.hygiene - 5);
|
||||
react(EXP_EAT);
|
||||
beep(880, 60); beep(1175, 80);
|
||||
led_blink();
|
||||
break;
|
||||
|
||||
case ACT_PLAY:
|
||||
if (pet.energy < 15) { beep(220, 120); break; } // too tired
|
||||
pet.happy = clamp100(pet.happy + 25);
|
||||
pet.energy = clamp100(pet.energy - 12);
|
||||
react(EXP_HAPPY);
|
||||
beep(988, 60); beep(1319, 60); beep(1568, 90);
|
||||
led_blink();
|
||||
break;
|
||||
|
||||
case ACT_SLEEP:
|
||||
pet.sleeping = !pet.sleeping;
|
||||
beep(pet.sleeping ? 440 : 660, 120);
|
||||
break;
|
||||
|
||||
case ACT_CLEAN:
|
||||
pet.poop = 0;
|
||||
pet.hygiene = 100;
|
||||
pet.happy = clamp100(pet.happy + 5);
|
||||
beep(1319, 50); beep(1047, 50);
|
||||
break;
|
||||
|
||||
case ACT_HEAL:
|
||||
pet.health = clamp100(pet.health + 35);
|
||||
beep(784, 60); beep(1047, 60); beep(1319, 90);
|
||||
led_blink();
|
||||
break;
|
||||
|
||||
case ACT_STATS:
|
||||
screen = SCR_STATS;
|
||||
beep(659, 40);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------- game tick
|
||||
static void game_tick(void)
|
||||
{
|
||||
pet.age_min++;
|
||||
|
||||
if (pet.sleeping) {
|
||||
pet.energy = clamp100(pet.energy + 10);
|
||||
// drift down slowly even while asleep
|
||||
pet.satiety = clamp100(pet.satiety - 1);
|
||||
if (pet.energy >= 100) pet.sleeping = 0; // wakes when rested
|
||||
} else {
|
||||
pet.satiety = clamp100(pet.satiety - 3);
|
||||
pet.energy = clamp100(pet.energy - 2);
|
||||
pet.happy = clamp100(pet.happy - 2);
|
||||
}
|
||||
|
||||
pet.hygiene = clamp100(pet.hygiene - 1);
|
||||
|
||||
// random-ish bowel movements (LFSR-free: derive from counters)
|
||||
if (!pet.sleeping && pet.poop < 3 &&
|
||||
((pet.age_min * 7u + frame) & 0x0F) == 0)
|
||||
pet.poop++;
|
||||
|
||||
// being dirty / full of poop saps happiness
|
||||
if (pet.poop) pet.happy = clamp100(pet.happy - pet.poop);
|
||||
if (pet.hygiene < 20) pet.happy = clamp100(pet.happy - 1);
|
||||
|
||||
// health responds to overall wellbeing
|
||||
int8_t lo = pet.satiety;
|
||||
if (pet.happy < lo) lo = pet.happy;
|
||||
if (pet.energy < lo) lo = pet.energy;
|
||||
if (pet.hygiene < lo) lo = pet.hygiene;
|
||||
if (lo < 15) pet.health = clamp100(pet.health - 5);
|
||||
else if (lo > 50) pet.health = clamp100(pet.health + 2);
|
||||
|
||||
if (pet.health <= 0) {
|
||||
pet.alive = 0;
|
||||
screen = SCR_DEAD;
|
||||
beep(330, 200); beep(247, 200); beep(165, 400);
|
||||
}
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------- drawing
|
||||
static void draw_center_str(int y, const char *s)
|
||||
{
|
||||
int len = 0;
|
||||
while (s[len]) len++;
|
||||
int x = (SSD1306_W - len * 8) / 2;
|
||||
if (x < 0) x = 0;
|
||||
ssd1306_drawstr(x, y, s, 1);
|
||||
}
|
||||
|
||||
static void draw_menu_bar(void)
|
||||
{
|
||||
// 6 icons across the bottom, selected one boxed
|
||||
for (uint8_t i = 0; i < ICON_COUNT; i++) {
|
||||
int x = i * 21 + 3;
|
||||
ssd1306_drawImage(x, 48, menu_icons[i], ICON_W, ICON_H, 0);
|
||||
if (i == cursor)
|
||||
ssd1306_drawRect(x - 2, 46, ICON_W + 3, ICON_H + 2, 1);
|
||||
}
|
||||
}
|
||||
|
||||
static void draw_main(void)
|
||||
{
|
||||
ssd1306_setbuf(0);
|
||||
|
||||
// top bar: action label, with a tiny low-health warning
|
||||
draw_center_str(0, menu_labels[cursor]);
|
||||
if (pet.alive && pet.health < 30 && (frame & 8))
|
||||
ssd1306_drawstr(0, 0, "!", 1);
|
||||
ssd1306_drawFastHLine(0, 10, SSD1306_W, 1);
|
||||
|
||||
// pet: gentle horizontal stroll + vertical bob (still while asleep)
|
||||
int px, py;
|
||||
if (pet.sleeping) {
|
||||
px = 48; py = 16;
|
||||
ssd1306_drawstr(px + PANA_W - 2, 14, "z", 1);
|
||||
ssd1306_drawstr(px + PANA_W + 4, 12, "Z", 1);
|
||||
} else {
|
||||
uint32_t t = frame % 80;
|
||||
px = (t < 40) ? 30 + t : 30 + (80 - t); // 30..70..30
|
||||
py = 14 + ((frame % 16) < 8 ? 0 : 1);
|
||||
}
|
||||
ssd1306_drawImage(px, py, pana_frames[current_expression()],
|
||||
PANA_W, PANA_H, 0);
|
||||
|
||||
// floor + poop piles
|
||||
ssd1306_drawFastHLine(0, 46, SSD1306_W, 1);
|
||||
for (uint8_t i = 0; i < pet.poop; i++)
|
||||
ssd1306_drawImage(8 + i * 12, 38, spr_poop, 8, 8, 0);
|
||||
|
||||
draw_menu_bar();
|
||||
ssd1306_refresh();
|
||||
}
|
||||
|
||||
static void draw_bar(int y, const char *label, int8_t val)
|
||||
{
|
||||
ssd1306_drawstr(0, y, label, 1);
|
||||
int bx = 48, bw = 76;
|
||||
ssd1306_drawRect(bx, y, bw, 7, 1);
|
||||
int fill = (val * (bw - 2)) / 100;
|
||||
if (fill > 0) ssd1306_fillRect(bx + 1, y + 1, fill, 5, 1);
|
||||
}
|
||||
|
||||
static void draw_stats(void)
|
||||
{
|
||||
ssd1306_setbuf(0);
|
||||
draw_center_str(0, "-- STATUS --");
|
||||
draw_bar(10, "FOOD", pet.satiety);
|
||||
draw_bar(19, "FUN ", pet.happy);
|
||||
draw_bar(28, "ENGY", pet.energy);
|
||||
draw_bar(37, "WASH", pet.hygiene);
|
||||
draw_bar(46, "HLTH", pet.health);
|
||||
|
||||
char line[17];
|
||||
snprintf(line, sizeof(line), "Age %u %s", pet.age_min,
|
||||
pet.sleeping ? "Zzz" : "");
|
||||
ssd1306_drawstr(0, 56, line, 1);
|
||||
ssd1306_refresh();
|
||||
}
|
||||
|
||||
static void draw_dead(void)
|
||||
{
|
||||
ssd1306_setbuf(0);
|
||||
ssd1306_drawImage(48, 8, spr_grave, 32, 32, 0);
|
||||
draw_center_str(44, "R.I.P.");
|
||||
char line[17];
|
||||
snprintf(line, sizeof(line), "lived %u min", pet.age_min);
|
||||
draw_center_str(52, line);
|
||||
ssd1306_refresh();
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------- input
|
||||
typedef struct { uint8_t ok, left, right; } Buttons;
|
||||
|
||||
static Buttons read_buttons(void)
|
||||
{
|
||||
// active-low: pressed reads 0
|
||||
Buttons b;
|
||||
b.ok = !funDigitalRead(BTN_OK);
|
||||
b.left = !funDigitalRead(BTN_LEFT);
|
||||
b.right = !funDigitalRead(BTN_RIGHT);
|
||||
return b;
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------- setup
|
||||
static void gpio_setup(void)
|
||||
{
|
||||
funGpioInitAll();
|
||||
|
||||
funPinMode(LED_PIN, GPIO_Speed_10MHz | GPIO_CNF_OUT_PP);
|
||||
funDigitalWrite(LED_PIN, FUN_LOW);
|
||||
|
||||
funPinMode(BUZZER, GPIO_Speed_10MHz | GPIO_CNF_OUT_PP);
|
||||
funDigitalWrite(BUZZER, FUN_LOW);
|
||||
|
||||
// buttons: input with internal pull-up (ODR high selects pull-up)
|
||||
funPinMode(BTN_OK, GPIO_CNF_IN_PUPD);
|
||||
funPinMode(BTN_LEFT, GPIO_CNF_IN_PUPD);
|
||||
funPinMode(BTN_RIGHT, GPIO_CNF_IN_PUPD);
|
||||
funDigitalWrite(BTN_OK, FUN_HIGH);
|
||||
funDigitalWrite(BTN_LEFT, FUN_HIGH);
|
||||
funDigitalWrite(BTN_RIGHT, FUN_HIGH);
|
||||
}
|
||||
|
||||
static void splash(void)
|
||||
{
|
||||
ssd1306_setbuf(0);
|
||||
draw_center_str(4, "PANAGOTCHI");
|
||||
ssd1306_drawImage(48, 16, pana_idle, PANA_W, PANA_H, 0);
|
||||
draw_center_str(52, "press any key");
|
||||
ssd1306_refresh();
|
||||
|
||||
beep(659, 80); beep(784, 80); beep(988, 120);
|
||||
|
||||
// wait until a button is pressed (or ~4 s timeout)
|
||||
for (int i = 0; i < 200; i++) {
|
||||
Buttons b = read_buttons();
|
||||
if (b.ok || b.left || b.right) break;
|
||||
Delay_Ms(20);
|
||||
}
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------- main
|
||||
int main(void)
|
||||
{
|
||||
SystemInit();
|
||||
gpio_setup();
|
||||
|
||||
Delay_Ms(120); // let the OLED rail settle
|
||||
if (ssd1306_i2c_init()) { // non-zero == failure
|
||||
// no display: fall back to a heartbeat blink so the board still shows life
|
||||
while (1) { led_blink(); Delay_Ms(700); }
|
||||
}
|
||||
ssd1306_init();
|
||||
|
||||
pet_reset();
|
||||
splash();
|
||||
|
||||
Buttons prev = {0, 0, 0};
|
||||
|
||||
while (1) {
|
||||
Buttons b = read_buttons();
|
||||
uint8_t ok_edge = b.ok && !prev.ok;
|
||||
uint8_t left_edge = b.left && !prev.left;
|
||||
uint8_t right_edge = b.right && !prev.right;
|
||||
prev = b;
|
||||
|
||||
switch (screen) {
|
||||
case SCR_MAIN:
|
||||
if (left_edge) {
|
||||
cursor = (cursor + ICON_COUNT - 1) % ICON_COUNT;
|
||||
beep(1047, 25);
|
||||
}
|
||||
if (right_edge) {
|
||||
cursor = (cursor + 1) % ICON_COUNT;
|
||||
beep(1047, 25);
|
||||
}
|
||||
if (ok_edge) do_action(cursor);
|
||||
draw_main();
|
||||
break;
|
||||
|
||||
case SCR_STATS:
|
||||
if (ok_edge || left_edge || right_edge) {
|
||||
screen = SCR_MAIN;
|
||||
beep(880, 30);
|
||||
}
|
||||
draw_stats();
|
||||
break;
|
||||
|
||||
case SCR_DEAD:
|
||||
if (ok_edge) { // start a new pet
|
||||
pet_reset();
|
||||
beep(659, 80); beep(988, 120);
|
||||
}
|
||||
draw_dead();
|
||||
break;
|
||||
}
|
||||
|
||||
if (anim_timer) anim_timer--;
|
||||
|
||||
// advance game time independent of which screen is showing
|
||||
if (pet.alive && ++tick_acc >= TICK_FRAMES) {
|
||||
tick_acc = 0;
|
||||
game_tick();
|
||||
}
|
||||
|
||||
frame++;
|
||||
Delay_Ms(FRAME_MS);
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,595 @@
|
|||
:100000006F00100400000000FE080000B2080000AD
|
||||
:1000100000000000000000000000000000000000E0
|
||||
:1000200000000000000000000000000000000000D0
|
||||
:10003000B208000000000000B2080000000000004C
|
||||
:10004000B2080000B2080000B2080000B2080000C8
|
||||
:10005000B2080000B2080000B2080000B2080000B8
|
||||
:10006000B2080000B2080000B2080000B2080000A8
|
||||
:10007000B2080000B2080000B2080000B208000098
|
||||
:10008000B2080000B2080000B2080000B208000088
|
||||
:10009000B2080000B2080000B20800000000000032
|
||||
:1000A000634E050263C305042E86AA857D5515C2DD
|
||||
:1000B00085466378B6006356C00006068606E36C84
|
||||
:1000C000B6FE014563E4C500918D558D858205829C
|
||||
:1000D000F5FA82808682C93F2E8582823305A04050
|
||||
:1000E0006347B000B305B040C1B7B305B0408682E6
|
||||
:1000F000653F3305A0408282868263C7050063495D
|
||||
:1001000005005D372E858282B305B040E35B05FEB6
|
||||
:100110003305A040513F3305B0408282000099C6AC
|
||||
:10012000014363D7B600B685054319A00143AE86E7
|
||||
:100130008D8EBA87B383E600B382F340634A5004DE
|
||||
:1001400093C7F6FFFD87FD8EBA9681473386F5404B
|
||||
:10015000B382F6006342C00493C7F5FFFD87FD8DAF
|
||||
:10016000B6953385E540630403026372B7029307D3
|
||||
:10017000A002A38FF5FE9386F5FF637AD700238F45
|
||||
:10018000F5FE9386E5FF6374D700A38EF5FE8280AB
|
||||
:100190008507A38FC7FE4DB73306F500034606005B
|
||||
:1001A00085072380C2005DB72A832E8501CE832276
|
||||
:1001B000060001475C426348A700238007004842CD
|
||||
:1001C0003305554082800C461442FD15AE96E386F9
|
||||
:1001D000D7FE9386170054C2B306E30083C6060019
|
||||
:1001E00005072380D700F9B7B70700E09387470FCB
|
||||
:1001F0009843137707086DFF372730781307870870
|
||||
:10020000B70600E098C39386460F7147A54571561F
|
||||
:100210009C4293F70708EDFF3353E5001373F30097
|
||||
:10022000B3B76500B307F04093F7770293870703EE
|
||||
:100230009A97A20793E757089CC27117E31AC7FC65
|
||||
:10024000828037F700E01C473E951C47898FE3CE3C
|
||||
:1002500007FE8280011106CE22CC26CA02C02A8364
|
||||
:100260006357050089E685473303A0403EC0058AF1
|
||||
:100270001304100619C213041004BA8459141A8501
|
||||
:100280003AC81AC22EC61AC4B135A5472243B24590
|
||||
:1002900042479376F50F63E1A7069386060393F62C
|
||||
:1002A000F60F938714002380D4001A853AC83EC6FF
|
||||
:1002B0002EC4DD3B9246A245B24742472A8363FBE8
|
||||
:1002C000B602824699C69306D0022380D700938750
|
||||
:1002D00024003385E7409356F501AA962380070052
|
||||
:1002E00085860146FD17634BD600F2406244D24436
|
||||
:1002F00005618280BE8461B7A29655B7B305C70079
|
||||
:1003000083C2070003C30500050623805500238030
|
||||
:100310006700C9BFB7170240984BB7062000558F3A
|
||||
:1003200098CB984BB706E0FFFD16758F98CBB75763
|
||||
:10033000004003D74740C166938606FC758F13675C
|
||||
:1003400087012392E74071770507239EE74003D793
|
||||
:100350000740136717002390E74003D70740136750
|
||||
:1003600007402390E74082809307F00763E7A702E6
|
||||
:100370009307F00363E3B70293D735009E07AA976C
|
||||
:10038000138581C23E959D89054783470500B315B6
|
||||
:10039000B70009C6CD8F2300F500828093C5F5FF15
|
||||
:1003A000ED8FD5BF311122C62E84AA8537A507004F
|
||||
:1003B0001305051206C826C4C53993175400818F4A
|
||||
:1003C0008A07A29713141500AA84A28513953700F3
|
||||
:1003D000E1392694931714002A873EC00144024550
|
||||
:1003E000B71401403AC291469384044094C8913DA9
|
||||
:1003F0000245B706040094C8A93512470504E31066
|
||||
:1004000087FEC2403244A24451018280611122C061
|
||||
:100410003714014006C213040480894737C502001F
|
||||
:100420001CC8130505F2313DB707020092401CC8F5
|
||||
:1004300002442101828037575A641307070523AE0F
|
||||
:10044000E1C09387C1C1130740062382E700054737
|
||||
:1004500023930700239407002385E700238C01C022
|
||||
:10046000A38B01C08280B71701408847938707405C
|
||||
:1004700098479C471345F5FF19831347F7FF95836A
|
||||
:1004800093C7F7FF058B05892207858B7111C2077A
|
||||
:10049000598D5D8D11018280011122CC26CA06CEB4
|
||||
:1004A0002A842E83B28483C204008504638D0204EF
|
||||
:1004B0000147939732008966938606BABA97B69732
|
||||
:1004C00083C60700814713D67600B305E3003305E2
|
||||
:1004D000F40016C836C63AC41AC23EC07135B246D8
|
||||
:1004E000824721468606850712432247C24293F679
|
||||
:1004F000F60FE39AC7FC0507E31DF7FA329493075A
|
||||
:100500008007E3D287FAF2406244D24405618280D8
|
||||
:100510002E860147B307E60083C7070099EBC14762
|
||||
:10052000998F8A0713C7F7FF7D87AA8533F5E70000
|
||||
:10053000A5B70507C5B71307F0076362A7049307BC
|
||||
:10054000F00363EEB70241119307F6FF22C406C61B
|
||||
:1005500026C2AA972A846375F70013060008098E3D
|
||||
:10056000B304C400228505462EC00504F53B824530
|
||||
:10057000E39A84FEB2402244924441018280828008
|
||||
:100580009307F00763CFA702411122C406C626C213
|
||||
:10059000B387C500130700042E846354F7003306A5
|
||||
:1005A000B740B304860063179400B24022449244DB
|
||||
:1005B00041018280A28505462AC07D33024505049B
|
||||
:1005C000DDB78280311126C4B284368606C822C6C1
|
||||
:1005D00036C22A842EC06D37124682451385F4FF39
|
||||
:1005E0002295793F824526862285B137824722852A
|
||||
:1005F00032449385F7FF9247C2402686A244BE95B7
|
||||
:10060000510115BF211122C826C62A84B2842E8624
|
||||
:10061000AA85014506CA4935130500039D46130600
|
||||
:10062000C004A28545371395340026950A05269502
|
||||
:1006300006059307300663DFA702930714009305AE
|
||||
:1006400040063EC0B13C82472A871904930617032F
|
||||
:10065000930410032685BE85054636C43AC23EC0C3
|
||||
:100660002133A246850482471247E395D4FE8507CD
|
||||
:10067000E39E87FCD2404244B24461018280130170
|
||||
:1006800081FDB387E50022D226D02AC832CA13D40E
|
||||
:1006900036003EC6814393F775000547B317F70050
|
||||
:1006A0003EC0D24781469E973ECC93D735009E07E9
|
||||
:1006B0003ECEE247939236000147B69783C70700C4
|
||||
:1006C0003EC2C247BE92F247B3845700B387E200EE
|
||||
:1006D0001306F0076364F604124593070008B3D7C6
|
||||
:1006E000E740E98F3386E400138581C232950343E6
|
||||
:1006F00001003EC4834705001346F3FF05077D8EC6
|
||||
:10070000A247B337F000B307F0403373F30033660A
|
||||
:1007100066002300C500A147E31AF7FA8506E31A2D
|
||||
:10072000D4F8B2478505A2936386B7009307000407
|
||||
:10073000E393F5F612548254130181028280B707C5
|
||||
:1007400000E083A7470F8280B70700E09387470F39
|
||||
:100750009843211106CA22C826C61377070C9306B0
|
||||
:10076000000C630BD70002C42E84DDED9C4389C7C7
|
||||
:1007700093F7070891E3E1370144D24022854244D0
|
||||
:10078000B24461018280B30794401D476353F70070
|
||||
:10079000BA87B7061000370700E085061307470F32
|
||||
:1007A000104393750608A5E111C62AC23EC0413F19
|
||||
:1007B0001245824734000D47B685634DF704A246C3
|
||||
:1007C000370700E00D46232CD70EB30695000147EE
|
||||
:1007D00083C2060005073383E500230053006385C9
|
||||
:1007E000E7008506E316C7FE13874700136707F87F
|
||||
:1007F0002304E100A246370700E0BE94232AD70E67
|
||||
:10080000E3C384F89DBFFD16C1FE1C4393E7070CAC
|
||||
:100810001CC39DB73386E4002A96034606000507ED
|
||||
:100820008506A38FC6FE51BF8144D9BF611122C086
|
||||
:1008300006C22E84113F924022850244210182800B
|
||||
:10084000970100209381C1BB1381414009651305C5
|
||||
:1008500005887310053097F6FFFF9386A67A93E616
|
||||
:100860003600739056301385C1C0938581020146CE
|
||||
:100870006356B50010C11105E34EB5FE1725000003
|
||||
:100880001305C5C8938541C01386C1C06388C500E0
|
||||
:10089000144194C111059105E39AC5FEB7F700E034
|
||||
:1008A000054798C385679387A7D97390173473005A
|
||||
:1008B0002030732510340D3A7325003035327325FE
|
||||
:1008C00030341D32732520340532B70700E093879A
|
||||
:1008D000470F9843137707086DFF0567130757A85D
|
||||
:1008E00098C3B70700E09387470F9843137707082B
|
||||
:1008F0006DFF37B7AAAA130737A898C301A0371707
|
||||
:1009000002401C47B7068000D58F1CC7AA8703C7C3
|
||||
:10091000070001E73385A74082808507CDBF13011B
|
||||
:1009200041FAA2CAA6C886CC2AC02EC23284B68496
|
||||
:1009300009E59307801A02C23EC002CA8347040039
|
||||
:1009400013071400A30FF10081EBE6405644524513
|
||||
:10095000C6441301C10582803AC6930650026380E3
|
||||
:10096000D7021246824785451305F1018297324727
|
||||
:1009700026C43A84D247A244AA973ECAC1B7834745
|
||||
:1009800014009306000313072400A30FF1003EC6D2
|
||||
:100990006393D7083A8481460147A54519A8931760
|
||||
:1009A0002700BA97860705043307F6008347F4FF4C
|
||||
:1009B0008546138607FD1375F60FE3F2A5FE99C26F
|
||||
:1009C000A30FF1003AC8E14663D3E60036C8130628
|
||||
:1009D000C00681466398C700834704008546050426
|
||||
:1009E000A30FF1000346F101930740066305F606E5
|
||||
:1009F00063E7C702930780056302F60A9307300690
|
||||
:100A00006300F60C39D21246824785451305F10181
|
||||
:100A1000829726C485B79306000236C6A5BF930702
|
||||
:100A20005007630AF602930780076309F6069307E7
|
||||
:100A30003007E31AF6FC9387440084403ACC3EC466
|
||||
:100A40002685E9356247AA856359E008C2463246E1
|
||||
:100A50003818268525A0938744003EC485CA13060E
|
||||
:100A6000B6F818109336160088400146A945EFF0F5
|
||||
:100A70006FFEC24632463818AA850810EFF02FEAFA
|
||||
:100A80001246AA85281882478297EDB5930750072A
|
||||
:100A900018108546E30AF6FC8146F9B7884013062C
|
||||
:100AA00086FA938744001810854613361600C14510
|
||||
:100AB0003EC4EFF02FFAC2463246AA85381875BFF9
|
||||
:100AC000938744003EC49C40C2463246A30FF100C7
|
||||
:100AD000381885451305F10155B71246268565B7C7
|
||||
:100AE000111132C62A8605652EC436C881453400E8
|
||||
:100AF0001305C58206C23ACA3ECC36C00D359240B7
|
||||
:100B00007101828089670A059387C7B8AA978C43C9
|
||||
:100B1000056571111305456806C0D937824011017A
|
||||
:100B20006FF04FFF71116167B757004006C01307A0
|
||||
:100B3000076A938707407D5683D68701898AE1C675
|
||||
:100B40007D17E31BC7FE014521A8E1679387176A5C
|
||||
:100B50008356470193F6060899E6FD17F5FB0D4508
|
||||
:100B60005537054589A88347050005052318F70073
|
||||
:100B7000E39DA5FCE16637570040370607009386E2
|
||||
:100B8000066A1307074013064608FD55035547013B
|
||||
:100B900083578701C207C98FF18F6387C700FD168E
|
||||
:100BA000E396B6FE11456DBF83570700014593E7F5
|
||||
:100BB00007202310F7008240110182803757004040
|
||||
:100BC000AA95130707406DB7930780072318F7000E
|
||||
:100BD0006166B7560040370707001306066A93861A
|
||||
:100BE0000640130727087D5383D2460183D7860129
|
||||
:100BF000C207B3E75700F98FE382E7FC7D16E315E0
|
||||
:100C000066FE0945B1BF03D70700E166370603005A
|
||||
:100C1000136707102390E700375700409386066A52
|
||||
:100C20001307074005067D53835247018357870109
|
||||
:100C3000C207B3E75700F18FE388C7F8FD16E395C5
|
||||
:100C400066FE054531BF130181FDA300A100894562
|
||||
:100C50000A8506D223000100F1359250130181026A
|
||||
:100C60008280311106C822C62AC02AC22EC49DC164
|
||||
:100C7000B337A000B307F0402A84B375F100130521
|
||||
:100C8000801A713901C4124582471D8DC240324419
|
||||
:100C90005101828001448145DDB7311136C43400F1
|
||||
:100CA00006C23AC63EC836C06D3F924051018280AE
|
||||
:100CB0002A96AA876393C70082802380B70085079E
|
||||
:100CC000D5BF130600408145138581C2D5B7814742
|
||||
:100CD0006313F60082803387F500834607003307ED
|
||||
:100CE000F50085072300D700E5B7797113051002D9
|
||||
:100CF00006D622D426D2813F0145B1371305F0072D
|
||||
:100D000099371305200281370145353F1D4513846E
|
||||
:100D100081C2153F9304044093070004A285130683
|
||||
:100D20000002130511002300F1005537930510024E
|
||||
:100D30000A8513040402FD33E31094FEB2502254DA
|
||||
:100D4000925445618280B7270240054798C3B71780
|
||||
:100D500002403707080123A207001307170898C3AA
|
||||
:100D600037079F0098C7984393166700E3DD06FE98
|
||||
:100D7000D843B7160240719B13672700D8C3214799
|
||||
:100D8000DC42B18BE39EE7FEB70700E023AC070E21
|
||||
:100D90001307000823AAE70E8280397106DE22DCE1
|
||||
:100DA00026DA5537B71402409C4C37140140FD76C3
|
||||
:100DB00093E757039CCC9307048098439386F60FE0
|
||||
:100DC000370600F11377F7F01367070198C3370769
|
||||
:100DD000020098CB9307044098437D1637050B001B
|
||||
:100DE000758F1367071098C33707040098CB184016
|
||||
:100DF000130505C8419B1367870018C09843718F7E
|
||||
:100E000037060008518F98C39843370610FF7D16A8
|
||||
:100E1000718F37068000518F98C3054718C8130794
|
||||
:100E2000000498CB1307000298CBEFF08FC1DC4C85
|
||||
:100E300037072000D98FDCCC9C4C7D779306F70FC9
|
||||
:100E400093E717019CCC1C400567130707D093F765
|
||||
:100E5000F7F01CC01C4093E7070D1CC01C40F58F29
|
||||
:100E60001CC01C40D98F1CC00964EFF0AFCA13042A
|
||||
:100E7000043A813D034504009307F00F6314F50025
|
||||
:100E8000AD3521A00504C13375D5EFF0CFDA153D9E
|
||||
:100E900085659385856B1145EFF08FE71307000299
|
||||
:100EA0000966BA861306C63BC14513050003EFF079
|
||||
:100EB0000FFD85659385456C13054003EFF04FE505
|
||||
:100EC0002D359305000513053029EFF0AFCD9305BF
|
||||
:100ED000000513050031EFF0EFCC930580071305F3
|
||||
:100EE000C03DEFF02FCC1304800CEFF0CFD7135799
|
||||
:100EF000850093570501A300E102498F2301F10208
|
||||
:100F0000D98F2300A10293F7F70F81EB75651305C5
|
||||
:100F1000054C7D14EFF0EFB269F8014781440144BC
|
||||
:100F20003AC0EFF04FD4935705011377F50F3AC24B
|
||||
:100F3000230FF10093F7F70F935685003EC69247B3
|
||||
:100F400013F7F60FA30ED1003AC4230EA1000247F7
|
||||
:100F5000814699C3933614002246814719C293B73C
|
||||
:100F60001400B245014699C11336170083C581C1EB
|
||||
:100F70009384C1C12EC0024585456301B5408945B2
|
||||
:100F80006304B54A631D051C95C303C571C199452A
|
||||
:100F900032CA150536C8EFF02F96A38BA1C0E545E0
|
||||
:100FA00013057041EFF00FC05246C24605C203C59B
|
||||
:100FB00071C1994536C80505EFF00F94A38BA1C008
|
||||
:100FC000E54513057041EFF0EFBDC246ADC683C7DE
|
||||
:100FD00071C1954663E1F60685668A079386467B6E
|
||||
:100FE000B6979C4382878387040013074006F9075E
|
||||
:100FF000635AF71ABA872380F400838734001307F3
|
||||
:101000004006ED176355F71ABA87A381F40011471C
|
||||
:101010002386E1C09305C003314713050037238BB6
|
||||
:10102000E1C0EFF02FB89305000513057049EFF00C
|
||||
:101030006FB7EFF0AFBD713183C771C101453EC8D5
|
||||
:1010400042478967938707470A07BA978C43EFF0AF
|
||||
:101050002FCC83C7A4003ECA8DC303874400F54745
|
||||
:1010600063CDE70083A701C1A18B81CB0566130681
|
||||
:10107000466D81450145EFF02FC2014422850546AA
|
||||
:10108000A945EFF06FAE050493070008E318F4FEDE
|
||||
:1010900003C494006307042405661306866DB945EE
|
||||
:1010A0001305E004EFF04FBF05661306C66DB145AA
|
||||
:1010B00013054005EFF04FBE13030003C142524732
|
||||
:1010C000994719C783C761C16386072483C7C1C015
|
||||
:1010D0000967130747458A07BA9790431307000229
|
||||
:1010E000BA8696851A85EFF08FD901442285054688
|
||||
:1010F0009305E002EFF04FA7050493070008E317FC
|
||||
:10110000F4FE83C7840002476366F7240144931703
|
||||
:101110002400338787000A07330387000967130712
|
||||
:10112000C743BA9790434147BA86130533009305E6
|
||||
:1011300000031AC0EFF0AFD442479377F40F024395
|
||||
:10114000631AF700C9464D469305E00213051300E4
|
||||
:10115000EFF04FC705049947E31BF4FA793683C7CC
|
||||
:1011600061C181C7FD17238BF1C083C7A40081CF64
|
||||
:1011700083D741C1930610038507C207C18363E784
|
||||
:10118000F630239AF1C083A701C137850500130506
|
||||
:1011900005E4850723A8F1C0EFF0AF8A3247A244E7
|
||||
:1011A0001244BDBB13C7F7FF7D87F98FA9B513C7DD
|
||||
:1011B000F7FF7D87F98F91BD03872400B94763C985
|
||||
:1011C000E700930580071305C00DEFF0AF9DA5B5AF
|
||||
:1011D0008387140093064006E50763D5F604B687B7
|
||||
:1011E000A380F400930747FF130740066353F700FB
|
||||
:1011F000BA872381F40009472386E1C09305C00321
|
||||
:1012000031471305C03D238BE1C0EFF0AF99930543
|
||||
:10121000C00313057052EFF0EF989305A005130576
|
||||
:10122000006231B593C6F7FFFD86F58F55BF03C544
|
||||
:10123000940093058007933715003335A0003305DC
|
||||
:10124000A0401375C50DA384F4001305851BB5BF1D
|
||||
:101250009386C1C1838714001307400623840400CA
|
||||
:10126000A381E40095076350F702BA879305200332
|
||||
:1012700013057052A380F600EFF0CF929305200380
|
||||
:101280001305704199B713C7F7FF7D87F98FF9BF31
|
||||
:101290008387440013074006938737026356F7029B
|
||||
:1012A000BA879305C003130500312382F400EFF0E1
|
||||
:1012B0006F8F9305C00313057041EFF0AF8E930558
|
||||
:1012C000A00513057052A5B313C7F7FF7D87F98FEB
|
||||
:1012D000C9BF8547238CF1C09305800213053029CF
|
||||
:1012E000EDB583A201C193050005168516CCEFE08C
|
||||
:1012F0007FDE93077002E2421303E50163F6A70065
|
||||
:101300009307E0063383A74093F28200B332500084
|
||||
:10131000B90275B39547E31D04DA83864400754727
|
||||
:101320008D47E357D7DA838614006147E352D7DA53
|
||||
:10133000838604004D47E35DD7D803A501C193051B
|
||||
:10134000200316CC1ACAEFE0FFD8E242524393378B
|
||||
:101350004500BDBB82472147139517003E950A05FE
|
||||
:10136000BA86138641C0930560023A95EFF02FB11B
|
||||
:101370008247850793F7F70F3EC061B3D58FD18FB2
|
||||
:1013800081CBF94513050037238C01C0EFF08F8125
|
||||
:10139000EFF03F9385659385056E0145EFF04F971C
|
||||
:1013A0000386040085659385056F2945EFF08FA5B9
|
||||
:1013B0000386140085659385856F4D45EFF08FA4F6
|
||||
:1013C000038624008565938505707145EFF08FA332
|
||||
:1013D0000386340085659385857013055002EFF010
|
||||
:1013E0006FA2038644008565938505711305E002AD
|
||||
:1013F000EFF04FA183C7940083D6640095C30567BF
|
||||
:101400001307476B056613068671C5450810EFF094
|
||||
:10141000DF881010930580030145EFF0EF873DBB97
|
||||
:1014200005671307076BF9BF99CEEFF0CF809305DF
|
||||
:10143000000513053029EFE0FFF69305800713053B
|
||||
:10144000C03DEFE03FF6EFF0DF87130700020966CB
|
||||
:10145000BA8613068648A14513050003EFF02FA2B4
|
||||
:101460008565938545721305C002EFF06F8A83D6B8
|
||||
:10147000640005661306C672C5450810EFF0FF81CB
|
||||
:101480000C1013054003EFF0AF88C9B903D3640013
|
||||
:1014900003C59400239A01C00503420313530301BB
|
||||
:1014A0002393640003870400838724009305400688
|
||||
:1014B000630105149386A70063D3D512AE86E206B6
|
||||
:1014C000E1862381D4007D1713064006635EE61093
|
||||
:1014D0003287620761872380E40013069005635713
|
||||
:1014E000F600A3840400930640060145838534007A
|
||||
:1014F000930740061386F5FF63DCC7143E86620639
|
||||
:101500006186A381C40015E103C58400894763EEA9
|
||||
:10151000A70093173300B387674003A301C19A97CD
|
||||
:10152000BD8B81E705052384A40003C5840019C988
|
||||
:1015300083871400898F130540066350F512AA872C
|
||||
:10154000A380F400D14763CCB700838714009305D0
|
||||
:101550004006FD1763D8F510AE87A380F40083C55D
|
||||
:101560001400AE87E205E1856353B600B287139697
|
||||
:10157000870161866353C700BA8713978701618724
|
||||
:1015800063D3E600B687139787016187B9468387DF
|
||||
:10159000440063CEE60CED1713074006635FF70CBB
|
||||
:1015A000BA872382F40083874400E34EF0BC0947E6
|
||||
:1015B0009305800C1305A014238CE1C0238504003F
|
||||
:1015C000EFE05FDE9305800C1305700FEFE09FDD09
|
||||
:1015D000930500191305500AEFE0DFDC6DB613C662
|
||||
:1015E000F6FF7D86F18EE1BD1346F7FF7D86718F94
|
||||
:1015F000CDB575170386140063DDE5022E876207FB
|
||||
:1016000061872380E400F9179306400663D8F60249
|
||||
:10161000B68793968701E1862381D40079169307D4
|
||||
:10162000400663D2C7023E869387C1C1A380C7002C
|
||||
:1016300075BD9346F7FFFD86758FD1B793C6F7FF4B
|
||||
:10164000FD86F58FF9B79347F6FFFD877D8EE9BFDD
|
||||
:101650009347F6FFFD877D8E5DB513C5F7FF7D854A
|
||||
:10166000E98FF9BD93C5F7FFFD85ED8FFDB59306B5
|
||||
:101670002003E3DAE6F2890705B713C7F7FF7D8792
|
||||
:10168000F98F05B7737364313330365F6932635F46
|
||||
:101690006572726F72202D2074696D656F7574208C
|
||||
:1016A00077616974696E6720666F722025730A0D11
|
||||
:1016B000000000005A7A7A0050414E41474F54438F
|
||||
:1016C00048490000707265737320616E79206B6504
|
||||
:1016D00079000000210000007A0000005A0000009C
|
||||
:1016E0002D2D20535441545553202D2D0000000022
|
||||
:1016F000464F4F440000000046554E2000000000B9
|
||||
:10170000454E475900000000574153480000000073
|
||||
:10171000484C544800000000416765202575202092
|
||||
:1017200025730000522E492E502E00006C697665FC
|
||||
:1017300064202575206D696E000000006E6F7420B6
|
||||
:1017400062757379000000006D6173746572206DBD
|
||||
:101750006F6465007472616E736D6974206D6F647F
|
||||
:1017600065000000747820656D70747900000000D9
|
||||
:101770007472616E736D697420636F6D706C6574E3
|
||||
:10178000650000004645454400000000504C4159AA
|
||||
:1017900000000000534C454550000000434C4541BB
|
||||
:1017A0004E0000004845414C000000005354415495
|
||||
:1017B00053000000E60F0000B81100002E120000D8
|
||||
:1017C0005012000090120000D21200000000000031
|
||||
:1017D000000000C000C000C006C006C006D806D881
|
||||
:1017E00036D836D836D836D8000000000000008041
|
||||
:1017F00007F00FF81C3C3C3E300E300E700F300EE0
|
||||
:101800003C3E3C3E1FFC0FF807F00080000000004B
|
||||
:101810000080008001C001C007F00DF80DF808F845
|
||||
:101820001DFC0DF80FF80FF807F000800000000015
|
||||
:10183000000004000C001C0018001C003C001C00F0
|
||||
:101840001E001F000FE807F00080000000000000ED
|
||||
:10185000077000001F7C3F7E3F7E3F7E00003F7E82
|
||||
:101860003F7E3F7E1F7C00000770000000000000EC
|
||||
:1018700000A001900FE01BF03BF831F83BF87BFC37
|
||||
:101880003FF83FF83FF81FF00FE0010000000000B4
|
||||
:1018900000000000010000800FE007F01FF00FF8CB
|
||||
:1018A0001FF00FF81FF00FF83FF89FFC1FFFFFF825
|
||||
:1018B0001FFFFFF81FFFFFF80FFFFFF003FFFFE020
|
||||
:1018C00007FFFFF007FFFFF00FBBEEF80FD7F5F8AB
|
||||
:1018D0000FEFFBF80FD7F5F81FBBEEFC0FFFFFF87B
|
||||
:1018E0000FFFFFF80FFFFFF80FF007F807FFFFF0FB
|
||||
:1018F00007FFFFF003FFFFE001FFFFC000FFFF80D5
|
||||
:10190000007FFF00001FFC000000800000000000BE
|
||||
:1019100000000000010000800FE007F01FF00FF84A
|
||||
:101920001FF00FF81FF00FF83FF89FFC1FFFFFF8A4
|
||||
:101930001FFFFFF81FFFFFF80FFFFFF003FFFFE09F
|
||||
:1019400007FFFFF007FFFFF00FFFFFF80FFFFFF8A3
|
||||
:101950000FFFFFF80F01C0781FFFFFFC0FFFFFF81C
|
||||
:101960000FFF7FF80FFC1FF80FFF7FF807FFFFF056
|
||||
:1019700007FFFFF003FFFFE001FFFFC000FFFF8054
|
||||
:10198000007FFF00001FFC0000008000000000003E
|
||||
:1019900000000000010000800FE007F01FF00FF8CA
|
||||
:1019A0001FF00FF81FF00FF83FF89FFC1FFFFFF824
|
||||
:1019B0001FFFFFF81FFFFFF80FFFFFF003FFFFE01F
|
||||
:1019C00007EFFBF00783E0F00F93E4F80F11C47802
|
||||
:1019D0000F83E0F80F83E0F81FEFFBFC0FFF7FF8A9
|
||||
:1019E0000FFC1FF80FFC1FF80FF80FF807FC1FF093
|
||||
:1019F00007FC1FF003FF7FE001FFFFC000FFFF8037
|
||||
:101A0000007FFF00001FFC000000800000000000BD
|
||||
:101A100000000000010000800FE007F01FF00FF849
|
||||
:101A20001FF00FF81FF00FF83FF89FFC1FFFFFF8A3
|
||||
:101A30001FFFFFF81FFFFFF80FFFFFF003FFFFE09E
|
||||
:101A400007FFFFF007FFFFF00FEFFBF80F83E0F851
|
||||
:101A50000F93E4F80F11C4781F83E0FC0F8360F844
|
||||
:101A60000FEC1BF80FFF7FF80FFC1FF807F7F7F0DC
|
||||
:101A700007FBEFF003FFFFE001FFFFC000FFFF8067
|
||||
:101A8000007FFF00001FFC0000008000000000003D
|
||||
:101A900000000000010000800FE007F01FF00FF8C9
|
||||
:101AA0001FF00FF81FF00FF83FF89FFC1FFFFFF823
|
||||
:101AB0001FFFFFF81FFFFFF80FFFFFF003FFFFE01E
|
||||
:101AC00007FFFFF007FFFFF00FFFFFF80FEFFBF836
|
||||
:101AD0000FD7F5F80FFFFFF81FFFFFFC0FFFFFF810
|
||||
:101AE0000FF80FF80FFBEFF80FF7F7F807FC1FF0F0
|
||||
:101AF00007FFFFF003FFFFE001FFFFC000FFFF80D3
|
||||
:101B0000007FFF00001FFC000000800000000000BC
|
||||
:101B100000000000010000800FE007F01FF00FF848
|
||||
:101B20001FF00FF81FF00FF83FF89FFC1FFFFFF8A2
|
||||
:101B30001FFFFFF81FFFFFF80FFFFFF003FFFFE09D
|
||||
:101B400007FFFFF007FFFFF00FFFFFF80FFFFFF8A1
|
||||
:101B50000F01C0780FFFFFF81FFFFFFC0FFF7FF89A
|
||||
:101B60000FFC1FF80FFF7FF80FFFFFF807F80FF0CB
|
||||
:101B700007FFFFF003FFFFE001FFFFC000FFFF8052
|
||||
:101B8000007FFF00001FFC00000080003C170000E9
|
||||
:101B90004817000054170000641700007017000079
|
||||
:101BA00000000000000000007E81A581BD99817EBB
|
||||
:101BB0007EFFDBFFC3E7FF7E6CFEFEFE7C3810007D
|
||||
:101BC00010387CFE7C381000387C38FEFED6103889
|
||||
:101BD00010387CFEFE7C10380000183C3C180000D9
|
||||
:101BE000FFFFE7C3C3E7FFFF003C664242663C00DD
|
||||
:101BF000FFC399BDBD99C3FF0F070F7DCCCCCC7837
|
||||
:101C00003C6666663C187E183F333F303070F0E02B
|
||||
:101C10007F637F636367E6C018DB3CE7E73CDB1864
|
||||
:101C200080E0F8FEF8E08000020E3EFE3E0E02006C
|
||||
:101C3000183C7E18187E3C1866666666660066006C
|
||||
:101C40007FDBDB7B1B1B1B003E613C66663C867CAE
|
||||
:101C5000000000007E7E7E00183C7E187E3C18FF4F
|
||||
:101C6000183C7E1818181800181818187E3C180010
|
||||
:101C700000180CFE0C180000003060FE6030000000
|
||||
:101C80000000C0C0C0FE0000002466FF6624000003
|
||||
:101C900000183C7EFFFF000000FFFF7E3C180000A4
|
||||
:101CA0000000000000000000183C3C18180018005C
|
||||
:101CB00066662400000000006C6CFE6CFE6C6C001C
|
||||
:101CC000183E603C067C180000C6CC183066C60082
|
||||
:101CD000386C3876DCCC7600181830000000000034
|
||||
:101CE0000C18303030180C0030180C0C0C18300068
|
||||
:101CF00000663CFF3C6600000018187E18180000C3
|
||||
:101D000000000000001818300000007E00000000F5
|
||||
:101D10000000000000181800060C183060C0800099
|
||||
:101D2000386CC6D6C66C38001838181818187E00DB
|
||||
:101D30007CC6061C3066FE007CC6063C06C67C00DF
|
||||
:101D40001C3C6CCCFE0C1E00FEC0C0FC06C67C0019
|
||||
:101D50003860C0FCC6C67C00FEC60C1830303000AF
|
||||
:101D60007CC6C67CC6C67C007CC6C67E060C7800D7
|
||||
:101D70000018180000181800001818000018183073
|
||||
:101D8000060C1830180C060000007E00007E0000D3
|
||||
:101D90006030180C183060007CC60C181800180051
|
||||
:101DA0007CC6DEDEDEC07800386CC6FEC6C6C60065
|
||||
:101DB000FC66667C6666FC003C66C0C0C0663C0093
|
||||
:101DC000F86C6666666CF800FE6268786862FE0011
|
||||
:101DD000FE6268786860F0003C66C0C0CE663A007B
|
||||
:101DE000C6C6C6FEC6C6C6003C18181818183C0061
|
||||
:101DF0001E0C0C0CCCCC7800E6666C786C66E600A9
|
||||
:101E0000F06060606266FE00C6EEFEFED6C6C600EA
|
||||
:101E1000C6E6F6DECEC6C6007CC6C6C6C6C67C0012
|
||||
:101E2000FC66667C6060F0007CC6C6C6C6CE7C0ED2
|
||||
:101E3000FC66667C6C66E6003C6630180C663C000E
|
||||
:101E40007E7E5A1818183C00C6C6C6C6C6C67C0098
|
||||
:101E5000C6C6C6C6C66C3800C6C6C6D6D6FE6C0098
|
||||
:101E6000C6C66C386CC6C6006666663C18183C0070
|
||||
:101E7000FEC68C183266FE003C30303030303C00FC
|
||||
:101E8000C06030180C0602003C0C0C0C0C0C3C0022
|
||||
:101E900010386CC60000000000000000000000FFC9
|
||||
:101EA00030180C00000000000000780C7CCC76009C
|
||||
:101EB000E0607C666666DC0000007CC6C0C67C0014
|
||||
:101EC0001C0C7CCCCCCC760000007CC6FEC07C0018
|
||||
:101ED0003C6660F86060F000000076CCCC7C0CF8CA
|
||||
:101EE000E0606C766666E6001800381818183C004A
|
||||
:101EF000060006060666663CE060666C786CE600E6
|
||||
:101F00003818181818183C000000ECFED6D6D60079
|
||||
:101F10000000DC666666660000007CC6C6C67C0003
|
||||
:101F20000000DC66667C60F0000076CCCC7C0C1E89
|
||||
:101F30000000DC766060F00000007EC07C06FC00E3
|
||||
:101F40003030FC3030361C000000CCCCCCCC7600DD
|
||||
:101F50000000C6C6C66C38000000C6D6D6FE6C00AF
|
||||
:101F60000000C66C386CC6000000C6C6C67E06FC03
|
||||
:101F700000007E4C18327E000E18187018180E00E3
|
||||
:101F800018181818181818007018180E181870005B
|
||||
:101F900076DC0000000000000010386CC6C6FE00B1
|
||||
:101FA0007CC6C0C0C67C0C78CC00CCCCCCCC760037
|
||||
:101FB0000C187CC6FEC07C007C82780C7CCC760041
|
||||
:101FC000C600780C7CCC76003018780C7CCC76007F
|
||||
:101FD0003030780C7CCC760000007EC0C07E0C389F
|
||||
:101FE0007C827CC6FEC07C00C6007CC6FEC07C0035
|
||||
:101FF00030187CC6FEC07C006600381818183C00FB
|
||||
:102000007C82381818183C003018003818183C002A
|
||||
:10201000C6386CC6FEC6C600386C7CC6FEC6C60096
|
||||
:102020001830FEC0F8C0FE0000007E187ED87E008A
|
||||
:102030003E6CCCFECCCCCE007C827CC6C6C67C007E
|
||||
:10204000C6007CC6C6C67C0030187CC6C6C67C00EE
|
||||
:10205000788400CCCCCC76006030CCCCCCCC760074
|
||||
:10206000C600C6C6C67E06FCC6386CC6C66C38003E
|
||||
:10207000C600C6C6C6C67C0018187EC0C07E18182A
|
||||
:10208000386C64F06066FC0066663C7E187E18184A
|
||||
:10209000F8CCCCFAC6CFC6C70E1B183C18D87000B7
|
||||
:1020A0001830780C7CCC76000C18003818183C00DE
|
||||
:1020B0000C187CC6C6C67C001830CCCCCCCC7600C4
|
||||
:1020C00076DC00DC6666660076DC00E6F6DECE00D6
|
||||
:1020D0003C6C6C3E007E0000386C6C38007C00006C
|
||||
:1020E0001800181830633E00000000FEC0C0000059
|
||||
:1020F000000000FE0606000063E66C7E3366CC0F2F
|
||||
:1021000063E66C7A366ADF06180018183C3C180043
|
||||
:10211000003366CC6633000000CC663366CC00002A
|
||||
:10212000228822882288228855AA55AA55AA55AA0B
|
||||
:1021300077DD77DD77DD77DD18181818181818188F
|
||||
:1021400018181818F81818181818F818F81818186F
|
||||
:1021500036363636F636363600000000FE3636366F
|
||||
:102160000000F818F81818183636F606F63636361F
|
||||
:1021700036363636363636360000FE06F636363613
|
||||
:102180003636F606FE00000036363636FE00000013
|
||||
:102190001818F818F800000000000000F8181818C7
|
||||
:1021A000181818181F00000018181818FF00000051
|
||||
:1021B00000000000FF181818181818181F18181811
|
||||
:1021C00000000000FF00000018181818FF18181869
|
||||
:1021D00018181F181F181818363636363736363680
|
||||
:1021E000363637303F00000000003F303736363695
|
||||
:1021F0003636F700FF0000000000FF00F7363636E5
|
||||
:1022000036363730373636360000FF00FF00000024
|
||||
:102210003636F700F73636361818FF00FF00000094
|
||||
:1022200036363636FF0000000000FF00FF18181891
|
||||
:1022300000000000FF363636363636363F000000E6
|
||||
:1022400018181F181F00000000001F181F1818186A
|
||||
:10225000000000003F36363636363636FF36363624
|
||||
:102260001818FF18FF18181818181818F800000088
|
||||
:10227000000000001F181818FFFFFFFFFFFFFFFFFF
|
||||
:1022800000000000FFFFFFFFF0F0F0F0F0F0F0F0D2
|
||||
:102290000F0F0F0F0F0F0F0FFFFFFFFF00000000CA
|
||||
:1022A000000076DCC8DC760078CCCCD8CCC6CC007C
|
||||
:1022B000FEC6C0C0C0C0C0000000FE6C6C6C6C00EC
|
||||
:1022C000FEC6603060C6FE0000007ED8D8D8700020
|
||||
:1022D0000000666666667CC00076DC181818180078
|
||||
:1022E0007E183C66663C187E386CC6FEC66C3800AC
|
||||
:1022F000386CC6C66C6CEE000E180C3E66663C0070
|
||||
:1023000000007EDBDB7E0000060C7EDBDB7E60C037
|
||||
:102310001E30607E60301E00007CC6C6C6C6C60089
|
||||
:1023200000FE00FE00FE000018187E1818007E0057
|
||||
:1023300030180C1830007E000C1830180C007E008D
|
||||
:102340000E1B1B18181818181818181818D8D87039
|
||||
:102350000018007E001800000076DC0076DC00002B
|
||||
:10236000386C6C38000000000000001818000000F5
|
||||
:1023700000000018000000000F0C0C0CEC6C3C1C62
|
||||
:102380006C36363636000000780C18307C000000C1
|
||||
:1023900000003C3C3C3C000000000000000000004D
|
||||
:1023A000AED580A83FD300408D142000A1C8DA121A
|
||||
:1023B000818FD9F1DB40A4A6AFFF00000000000030
|
||||
:1023C00000000000010000800FE007F01FF00FF890
|
||||
:1023D0001FF00FF81FF00FF83FF89FFC1FFFFFF8EA
|
||||
:1023E0001FFFFFF81FFFFFF80FFFFFF003FFFFE0E5
|
||||
:1023F00007FFFFF007EFFBF00F83E0F80F93E4F81F
|
||||
:102400000F11C4780F83E0F81F83E0FC0FEF7BF817
|
||||
:102410000FFC1FF80FFF7FF80FFFFFF807F80FF012
|
||||
:1024200007FFFFF003FFFFE001FFFFC000FFFF8099
|
||||
:10243000007FFF00001FFC00000080006C180000FF
|
||||
:102440004C1800002C1800000C180000EC170000BD
|
||||
:10245000CC170000BC2300000C1B00008C1A0000ED
|
||||
:102460000C1A00008C1900000C1900008C180000D8
|
||||
:10247000841700008C170000941700009C170000C0
|
||||
:10248000A4170000AC1700000000000000000000CE
|
||||
:1024900000FFFC0003FFFF0007FFFF80061FE18035
|
||||
:1024A0000630318006303180063FC300063303001A
|
||||
:1024B000063183000630C30006000600060F060042
|
||||
:1024C00007FFFF800FFFFFC01FFFFFE03FFFFFF090
|
||||
:1024D0007FFFFFF8FFFFFFFCFFFFFFFC00F0F000B5
|
||||
:1024E00003FFF0000FFFFC000000000000000000F0
|
||||
:1024F00000000000000000000000000000000000DC
|
||||
:082500000000000000000000D3
|
||||
:0825080000183C6C7EFFFF008F
|
||||
:00000001FF
|
||||
|
|
@ -0,0 +1,586 @@
|
|||
Archive member included to satisfy reference by file (symbol)
|
||||
|
||||
../ch32v003fun/ch32fun//../misc/libgcc.a(div.o)
|
||||
/tmp/ccuFqAhq.ltrans0.ltrans.o (__divsi3)
|
||||
|
||||
Discarded input sections
|
||||
|
||||
.text 0x00000000 0x0 /tmp/ccuFqAhq.ltrans0.ltrans.o
|
||||
.data 0x00000000 0x0 /tmp/ccuFqAhq.ltrans0.ltrans.o
|
||||
.bss 0x00000000 0x0 /tmp/ccuFqAhq.ltrans0.ltrans.o
|
||||
.text.vprintf 0x00000000 0x16 /tmp/ccuFqAhq.ltrans0.ltrans.o
|
||||
.text.sprintf 0x00000000 0x26 /tmp/ccuFqAhq.ltrans0.ltrans.o
|
||||
.text.strcpy 0x00000000 0x14 /tmp/ccuFqAhq.ltrans0.ltrans.o
|
||||
.text.strncpy 0x00000000 0x1c /tmp/ccuFqAhq.ltrans0.ltrans.o
|
||||
.text.strcmp 0x00000000 0x1a /tmp/ccuFqAhq.ltrans0.ltrans.o
|
||||
.text.strncmp 0x00000000 0x2e /tmp/ccuFqAhq.ltrans0.ltrans.o
|
||||
.text.strchr 0x00000000 0x16 /tmp/ccuFqAhq.ltrans0.ltrans.o
|
||||
.text.strrchr 0x00000000 0x3c /tmp/ccuFqAhq.ltrans0.ltrans.o
|
||||
.text.memcmp 0x00000000 0x20 /tmp/ccuFqAhq.ltrans0.ltrans.o
|
||||
.text.memmove 0x00000000 0x5e /tmp/ccuFqAhq.ltrans0.ltrans.o
|
||||
.text.memchr 0x00000000 0x1a /tmp/ccuFqAhq.ltrans0.ltrans.o
|
||||
.text.strnlen 0x00000000 0x2a /tmp/ccuFqAhq.ltrans0.ltrans.o
|
||||
.text.twoway_strstr
|
||||
0x00000000 0x232 /tmp/ccuFqAhq.ltrans0.ltrans.o
|
||||
.text.strstr 0x00000000 0x11c /tmp/ccuFqAhq.ltrans0.ltrans.o
|
||||
.rodata.puts.str1.4
|
||||
0x00000000 0x2 /tmp/ccuFqAhq.ltrans0.ltrans.o
|
||||
.text.puts 0x00000000 0x40 /tmp/ccuFqAhq.ltrans0.ltrans.o
|
||||
.text.setjmp 0x00000000 0x10 /tmp/ccuFqAhq.ltrans0.ltrans.o
|
||||
.text.longjmp 0x00000000 0x14 /tmp/ccuFqAhq.ltrans0.ltrans.o
|
||||
.text.putchar 0x00000000 0x68 /tmp/ccuFqAhq.ltrans0.ltrans.o
|
||||
.rodata.APBAHBPrescTable.lto_priv.0
|
||||
0x00000000 0x10 /tmp/ccuFqAhq.ltrans0.ltrans.o
|
||||
.rodata.ADCPrescTable.lto_priv.0
|
||||
0x00000000 0x14 /tmp/ccuFqAhq.ltrans0.ltrans.o
|
||||
.rodata.APBAHBPrescTable.lto_priv.1
|
||||
0x00000000 0x10 /tmp/ccuFqAhq.ltrans0.ltrans.o
|
||||
.rodata.ADCPrescTable.lto_priv.1
|
||||
0x00000000 0x14 /tmp/ccuFqAhq.ltrans0.ltrans.o
|
||||
.comment 0x00000000 0x35 /tmp/ccuFqAhq.ltrans0.ltrans.o
|
||||
.note.GNU-stack
|
||||
0x00000000 0x0 /tmp/ccuFqAhq.ltrans0.ltrans.o
|
||||
.comment 0x00000000 0x35 /tmp/cc6O5Yfp.debug.temp.o
|
||||
.note.GNU-stack
|
||||
0x00000000 0x0 /tmp/cc6O5Yfp.debug.temp.o
|
||||
.comment 0x00000000 0x35 /tmp/ccQWTvKu.debug.temp.o
|
||||
.note.GNU-stack
|
||||
0x00000000 0x0 /tmp/ccQWTvKu.debug.temp.o
|
||||
.data 0x00000000 0x0 ../ch32v003fun/ch32fun//../misc/libgcc.a(div.o)
|
||||
.bss 0x00000000 0x0 ../ch32v003fun/ch32fun//../misc/libgcc.a(div.o)
|
||||
|
||||
Memory Configuration
|
||||
|
||||
Name Origin Length Attributes
|
||||
FLASH 0x00000000 0x00004000 xr
|
||||
RAM 0x20000000 0x00000800 xrw
|
||||
*default* 0x00000000 0xffffffff
|
||||
|
||||
Linker script and memory map
|
||||
|
||||
LOAD /tmp/ccc3BNuu.o
|
||||
LOAD /tmp/ccuFqAhq.ltrans0.ltrans.o
|
||||
LOAD /tmp/cc6O5Yfp.debug.temp.o
|
||||
LOAD /tmp/ccQWTvKu.debug.temp.o
|
||||
LOAD /tmp/ccZbRLFZ.o
|
||||
LOAD ../ch32v003fun/ch32fun//../misc/libgcc.a
|
||||
LOAD ../ch32v003fun/ch32fun//../misc/libgcc.a
|
||||
|
||||
.init 0x00000000 0xa0
|
||||
0x00000000 _sinit = .
|
||||
0x00000000 . = ALIGN (0x4)
|
||||
*(SORT_NONE(.init))
|
||||
.init 0x00000000 0x9e /tmp/ccuFqAhq.ltrans0.ltrans.o
|
||||
0x00000000 InterruptVectorDefault
|
||||
0x00000000 InterruptVector
|
||||
0x000000a0 . = ALIGN (0x4)
|
||||
*fill* 0x0000009e 0x2
|
||||
0x000000a0 _einit = .
|
||||
|
||||
.text 0x000000a0 0x2468
|
||||
0x000000a0 . = ALIGN (0x4)
|
||||
*(.text)
|
||||
.text 0x000000a0 0x7e ../ch32v003fun/ch32fun//../misc/libgcc.a(div.o)
|
||||
0x000000a0 __divsi3
|
||||
0x000000a8 __hidden___udivsi3
|
||||
0x000000a8 __udivsi3
|
||||
0x000000d4 __umodsi3
|
||||
0x000000f8 __modsi3
|
||||
*(.text.*)
|
||||
.text.mini_pad
|
||||
0x0000011e 0x8a /tmp/ccuFqAhq.ltrans0.ltrans.o
|
||||
.text._puts 0x000001a8 0x40 /tmp/ccuFqAhq.ltrans0.ltrans.o
|
||||
.text.PrintHex
|
||||
0x000001e8 0x5a /tmp/ccuFqAhq.ltrans0.ltrans.o
|
||||
.text.DelaySysTick
|
||||
0x00000242 0x12 /tmp/ccuFqAhq.ltrans0.ltrans.o
|
||||
.text.mini_itoa.part.0
|
||||
0x00000254 0xc0 /tmp/ccuFqAhq.ltrans0.ltrans.o
|
||||
.text.ssd1306_i2c_setup
|
||||
0x00000314 0x54 /tmp/ccuFqAhq.ltrans0.ltrans.o
|
||||
.text.ssd1306_drawPixel
|
||||
0x00000368 0x3c /tmp/ccuFqAhq.ltrans0.ltrans.o
|
||||
.text.beep 0x000003a4 0x68 /tmp/ccuFqAhq.ltrans0.ltrans.o
|
||||
.text.led_blink
|
||||
0x0000040c 0x2a /tmp/ccuFqAhq.ltrans0.ltrans.o
|
||||
.text.pet_reset
|
||||
0x00000436 0x30 /tmp/ccuFqAhq.ltrans0.ltrans.o
|
||||
.text.read_buttons
|
||||
0x00000466 0x32 /tmp/ccuFqAhq.ltrans0.ltrans.o
|
||||
.text.ssd1306_drawstr.constprop.0
|
||||
0x00000498 0x78 /tmp/ccuFqAhq.ltrans0.ltrans.o
|
||||
.text.draw_center_str
|
||||
0x00000510 0x26 /tmp/ccuFqAhq.ltrans0.ltrans.o
|
||||
.text.ssd1306_drawFastHLine.constprop.0
|
||||
0x00000536 0x4a /tmp/ccuFqAhq.ltrans0.ltrans.o
|
||||
.text.ssd1306_drawFastVLine.constprop.0
|
||||
0x00000580 0x44 /tmp/ccuFqAhq.ltrans0.ltrans.o
|
||||
.text.ssd1306_drawRect.constprop.0
|
||||
0x000005c4 0x40 /tmp/ccuFqAhq.ltrans0.ltrans.o
|
||||
.text.draw_bar
|
||||
0x00000604 0x7a /tmp/ccuFqAhq.ltrans0.ltrans.o
|
||||
.text.ssd1306_drawImage.constprop.0
|
||||
0x0000067e 0xc0 /tmp/ccuFqAhq.ltrans0.ltrans.o
|
||||
.text.internal_handle_input.constprop.0
|
||||
0x0000073e 0xa /tmp/ccuFqAhq.ltrans0.ltrans.o
|
||||
.text._write.constprop.0
|
||||
0x00000748 0xe4 /tmp/ccuFqAhq.ltrans0.ltrans.o
|
||||
.text.__puts_uart
|
||||
0x0000082c 0x14 /tmp/ccuFqAhq.ltrans0.ltrans.o
|
||||
.text.handle_reset
|
||||
0x00000840 0x72 /tmp/ccuFqAhq.ltrans0.ltrans.o
|
||||
0x00000840 handle_reset
|
||||
.text.vector_handler
|
||||
0x000008b2 0x5a /tmp/ccuFqAhq.ltrans0.ltrans.o
|
||||
0x000008b2 OPCM_IRQHandler
|
||||
0x000008b2 EXTI2_IRQHandler
|
||||
0x000008b2 TIM8_TRG_COM_IRQHandler
|
||||
0x000008b2 TIM8_CC_IRQHandler
|
||||
0x000008b2 USART_WKUP_IRQHandler
|
||||
0x000008b2 UART8_IRQHandler
|
||||
0x000008b2 SPI4_IRQHandler
|
||||
0x000008b2 NFC_IRQHandler
|
||||
0x000008b2 DFSDM0_IRQHandler
|
||||
0x000008b2 TIM1_CC_IRQHandler
|
||||
0x000008b2 HardFault_Handler
|
||||
0x000008b2 TIM10_IRQHandler
|
||||
0x000008b2 GPIOB_IRQHandler
|
||||
0x000008b2 IPC_CH2_Handler
|
||||
0x000008b2 USBPD_IRQHandler
|
||||
0x000008b2 TIM6_IRQHandler
|
||||
0x000008b2 GPIOA_IRQHandler
|
||||
0x000008b2 SysTick_Handler
|
||||
0x000008b2 CAN3_RX1_IRQHandler
|
||||
0x000008b2 I3C_ER_IRQHandler
|
||||
0x000008b2 PVD_IRQHandler
|
||||
0x000008b2 SDIO_IRQHandler
|
||||
0x000008b2 TIM9_BRK_IRQHandler
|
||||
0x000008b2 DMA2_Channel8_IRQHandler
|
||||
0x000008b2 CAN2_RX1_IRQHandler
|
||||
0x000008b2 EXTI3_IRQHandler
|
||||
0x000008b2 HSEM_Handler
|
||||
0x000008b2 UART1_IRQHandler
|
||||
0x000008b2 USBHS_IRQHandler
|
||||
0x000008b2 LPTIM2_IRQHandler
|
||||
0x000008b2 DMA2_Channel9_IRQHandler
|
||||
0x000008b2 TIM10_CC_IRQHandler
|
||||
0x000008b2 EXTI25_16_IRQHandler
|
||||
0x000008b2 I2C3_ER_IRQHandler
|
||||
0x000008b2 USBFS_IRQHandler
|
||||
0x000008b2 UART0_IRQHandler
|
||||
0x000008b2 USART8_IRQHandler
|
||||
0x000008b2 EXTI0_IRQHandler
|
||||
0x000008b2 I2C2_EV_IRQHandler
|
||||
0x000008b2 TIM10_TRG_COM_IRQHandler
|
||||
0x000008b2 LPTIM_IRQHandler
|
||||
0x000008b2 CAN1_RX0_IRQHandler
|
||||
0x000008b2 CAN3_SCE_IRQHandler
|
||||
0x000008b2 CAN2_SCE_IRQHandler
|
||||
0x000008b2 ADC1_2_IRQHandler
|
||||
0x000008b2 BB_IRQHandler
|
||||
0x000008b2 Break_Point_Handler
|
||||
0x000008b2 IPC_CH0_Handler
|
||||
0x000008b2 TIM2_CC_IRQHandler
|
||||
0x000008b2 SPI1_IRQHandler
|
||||
0x000008b2 USART5_IRQHandler
|
||||
0x000008b2 TAMPER_IRQHandler
|
||||
0x000008b2 TMR0_IRQHandler
|
||||
0x000008b2 AWU_IRQHandler
|
||||
0x000008b2 EXTI7_0_IRQHandler
|
||||
0x000008b2 CAN2_RX0_IRQHandler
|
||||
0x000008b2 OSCWakeUp_IRQHandler
|
||||
0x000008b2 TIM8_UP_IRQHandler
|
||||
0x000008b2 Ecall_M_Mode_Handler
|
||||
0x000008b2 ECDC_IRQHandler
|
||||
0x000008b2 SDMMC_IRQHandler
|
||||
0x000008b2 USART7_IRQHandler
|
||||
0x000008b2 DMA2_Channel2_IRQHandler
|
||||
0x000008b2 DMA1_Channel4_IRQHandler
|
||||
0x000008b2 ADC1_IRQHandler
|
||||
0x000008b2 TIM2_BRK_IRQHandler
|
||||
0x000008b2 USART6_IRQHandler
|
||||
0x000008b2 CAN3_RX0_IRQHandler
|
||||
0x000008b2 HSADC_IRQHandler
|
||||
0x000008b2 TIM9_UP_IRQHandler
|
||||
0x000008b2 USART3_IRQHandler
|
||||
0x000008b2 RTC_IRQHandler
|
||||
0x000008b2 DMA1_Channel7_IRQHandler
|
||||
0x000008b2 LED_IRQHandler
|
||||
0x000008b2 CAN1_RX1_IRQHandler
|
||||
0x000008b2 DVP_IRQHandler
|
||||
0x000008b2 UART5_IRQHandler
|
||||
0x000008b2 USBSS_IRQHandler
|
||||
0x000008b2 SWPMI_IRQHandler
|
||||
0x000008b2 USBPDWakeUp_IRQHandler
|
||||
0x000008b2 EXTI15_8_IRQHandler
|
||||
0x000008b2 TIM4_IRQHandler
|
||||
0x000008b2 DMA2_Channel1_IRQHandler
|
||||
0x000008b2 SWPMI_WKUP_IRQHandler
|
||||
0x000008b2 USBPD_WKUP_IRQHandler
|
||||
0x000008b2 I2C1_EV_IRQHandler
|
||||
0x000008b2 USBSSWakeup_IRQHandler
|
||||
0x000008b2 UART2_IRQHandler
|
||||
0x000008b2 USART4_IRQHandler
|
||||
0x000008b2 PWMX_IRQHandler
|
||||
0x000008b2 DMA1_Channel6_IRQHandler
|
||||
0x000008b2 UART4_IRQHandler
|
||||
0x000008b2 DMA2_Channel4_IRQHandler
|
||||
0x000008b2 TIM3_IRQHandler
|
||||
0x000008b2 RCC_IRQHandler
|
||||
0x000008b2 TIM1_TRG_COM_IRQHandler
|
||||
0x000008b2 DMA1_Channel1_IRQHandler
|
||||
0x000008b2 DMA2_Channel7_IRQHandler
|
||||
0x000008b2 QSPI1_IRQHandler
|
||||
0x000008b2 EXTI15_10_IRQHandler
|
||||
0x000008b2 ADC_IRQHandler
|
||||
0x000008b2 IPC_CH3_Handler
|
||||
0x000008b2 DMA1_Channel8_IRQHandler
|
||||
0x000008b2 I3C_EV_IRQHandler
|
||||
0x000008b2 TMR2_IRQHandler
|
||||
0x000008b2 I3C_WKUP_IRQHandler
|
||||
0x000008b2 DefaultIRQHandler
|
||||
0x000008b2 TIM12_IRQHandler
|
||||
0x000008b2 TIM7_IRQHandler
|
||||
0x000008b2 CAN2_TX_IRQHandler
|
||||
0x000008b2 TIM5_IRQHandler
|
||||
0x000008b2 I2C3_EV_IRQHandler
|
||||
0x000008b2 USB_IRQHandler
|
||||
0x000008b2 EXTI9_5_IRQHandler
|
||||
0x000008b2 PIOC_IRQHandler
|
||||
0x000008b2 TIM9_IRQHandler
|
||||
0x000008b2 LTDC_IRQHandler
|
||||
0x000008b2 SAI_IRQHandler
|
||||
0x000008b2 SPI2_IRQHandler
|
||||
0x000008b2 OSC32KCal_IRQHandler
|
||||
0x000008b2 IPC_CH1_Handler
|
||||
0x000008b2 I2C_IRQHandler
|
||||
0x000008b2 LPTIM1_WKUP_IRQHandler
|
||||
0x000008b2 TIM10_BRK_IRQHandler
|
||||
0x000008b2 TIM9_CC_IRQHandler
|
||||
0x000008b2 CAN1_TX_IRQHandler
|
||||
0x000008b2 DMA2_Channel5_IRQHandler
|
||||
0x000008b2 USB2_IRQHandler
|
||||
0x000008b2 USBHSWakeUp_IRQHandler
|
||||
0x000008b2 DMA1_Channel5_IRQHandler
|
||||
0x000008b2 EXTI4_IRQHandler
|
||||
0x000008b2 USB_LP_CAN1_RX0_IRQHandler
|
||||
0x000008b2 QSPI2_IRQHandler
|
||||
0x000008b2 RNG_IRQHandler
|
||||
0x000008b2 USB_HP_CAN1_TX_IRQHandler
|
||||
0x000008b2 LLE_IRQHandler
|
||||
0x000008b2 CMPWakeUp_IRQHandler
|
||||
0x000008b2 DMA1_Channel3_IRQHandler
|
||||
0x000008b2 FSMC_IRQHandler
|
||||
0x000008b2 ETH_IRQHandler
|
||||
0x000008b2 TIM1_UP_IRQHandler
|
||||
0x000008b2 LPTIMWakeUp_IRQHandler
|
||||
0x000008b2 WWDG_IRQHandler
|
||||
0x000008b2 USBHSWakeup_IRQHandler
|
||||
0x000008b2 DMA2_Channel11_IRQHandler
|
||||
0x000008b2 WDOG_BAT_IRQHandler
|
||||
0x000008b2 Ecall_U_Mode_Handler
|
||||
0x000008b2 I2C4_EV_IRQHandler
|
||||
0x000008b2 CAN3_TX_IRQHandler
|
||||
0x000008b2 TMR3_IRQHandler
|
||||
0x000008b2 DMA2_Channel6_IRQHandler
|
||||
0x000008b2 TIM2_IRQHandler
|
||||
0x000008b2 SW_Handler
|
||||
0x000008b2 TIM1_BRK_IRQHandler
|
||||
0x000008b2 GPHA_IRQHandler
|
||||
0x000008b2 OPA_IRQHandler
|
||||
0x000008b2 DMA2_Channel10_IRQHandler
|
||||
0x000008b2 EXTI1_IRQHandler
|
||||
0x000008b2 SPI0_IRQHandler
|
||||
0x000008b2 USB2_HOST_IRQHandler
|
||||
0x000008b2 LPTIM2_WKUP_IRQHandler
|
||||
0x000008b2 RTCAlarm_IRQHandler
|
||||
0x000008b2 TIM11_IRQHandler
|
||||
0x000008b2 TIM10_UP_IRQHandler
|
||||
0x000008b2 TIM9_TRG_COM_IRQHandler
|
||||
0x000008b2 UART7_IRQHandler
|
||||
0x000008b2 USART2_IRQHandler
|
||||
0x000008b2 UART6_IRQHandler
|
||||
0x000008b2 UHSIF_IRQHandler
|
||||
0x000008b2 ETHWakeUp_IRQHandler
|
||||
0x000008b2 I2C2_ER_IRQHandler
|
||||
0x000008b2 DMA1_Channel2_IRQHandler
|
||||
0x000008b2 TIM8_BRK_IRQHandler
|
||||
0x000008b2 TIM2_TRG_IRQHandler
|
||||
0x000008b2 CAN1_SCE_IRQHandler
|
||||
0x000008b2 FLASH_IRQHandler
|
||||
0x000008b2 USBFSWakeUp_IRQHandler
|
||||
0x000008b2 USART1_IRQHandler
|
||||
0x000008b2 OTG_FS_IRQHandler
|
||||
0x000008b2 SPI3_IRQHandler
|
||||
0x000008b2 USBFS_WakeUp_IRQHandler
|
||||
0x000008b2 UART3_IRQHandler
|
||||
0x000008b2 I2C1_ER_IRQHandler
|
||||
0x000008b2 FMC_IRQHandler
|
||||
0x000008b2 USB2_DEVICE_IRQHandler
|
||||
0x000008b2 LPTIM1_IRQHandler
|
||||
0x000008b2 DFSDM1_IRQHandler
|
||||
0x000008b2 TMR1_IRQHandler
|
||||
0x000008b2 I2C4_ER_IRQHandler
|
||||
0x000008b2 SERDES_IRQHandler
|
||||
0x000008b2 USBSS_LINK_IRQHandler
|
||||
0x000008b2 USBWakeUp_IRQHandler
|
||||
0x000008b2 DMA2_Channel3_IRQHandler
|
||||
0x000008fe NMI_Handler
|
||||
0x000008fe NMI_RCC_CSS_IRQHandler
|
||||
.text.strlen 0x0000090c 0x12 /tmp/ccuFqAhq.ltrans0.ltrans.o
|
||||
0x0000090c strlen
|
||||
.text.mini_vpprintf
|
||||
0x0000091e 0x1c2 /tmp/ccuFqAhq.ltrans0.ltrans.o
|
||||
.text.printf 0x00000ae0 0x24 /tmp/ccuFqAhq.ltrans0.ltrans.o
|
||||
0x00000ae0 printf
|
||||
.text.ssd1306_i2c_error.isra.0
|
||||
0x00000b04 0x20 /tmp/ccuFqAhq.ltrans0.ltrans.o
|
||||
.text.ssd1306_i2c_send.constprop.0
|
||||
0x00000b24 0x122 /tmp/ccuFqAhq.ltrans0.ltrans.o
|
||||
.text.ssd1306_cmd
|
||||
0x00000c46 0x1c /tmp/ccuFqAhq.ltrans0.ltrans.o
|
||||
.text.mini_vsnprintf
|
||||
0x00000c62 0x38 /tmp/ccuFqAhq.ltrans0.ltrans.o
|
||||
.text.snprintf
|
||||
0x00000c9a 0x16 /tmp/ccuFqAhq.ltrans0.ltrans.o
|
||||
0x00000c9a snprintf
|
||||
.text.memset 0x00000cb0 0x12 /tmp/ccuFqAhq.ltrans0.ltrans.o
|
||||
0x00000cb0 memset
|
||||
.text.ssd1306_setbuf.constprop.0
|
||||
0x00000cc2 0xc /tmp/ccuFqAhq.ltrans0.ltrans.o
|
||||
.text.memcpy 0x00000cce 0x1c /tmp/ccuFqAhq.ltrans0.ltrans.o
|
||||
0x00000cce memcpy
|
||||
.text.ssd1306_refresh
|
||||
0x00000cea 0x5c /tmp/ccuFqAhq.ltrans0.ltrans.o
|
||||
.text.SystemInit
|
||||
0x00000d46 0x54 /tmp/ccuFqAhq.ltrans0.ltrans.o
|
||||
0x00000d46 SystemInit
|
||||
.text.startup.main
|
||||
0x00000d9a 0x8ea /tmp/ccuFqAhq.ltrans0.ltrans.o
|
||||
0x00000d9a main
|
||||
*(.rodata)
|
||||
*(.rodata*)
|
||||
*fill* 0x00001684 0x0
|
||||
.rodata.ssd1306_i2c_error.isra.0.str1.4
|
||||
0x00001684 0x12e /tmp/ccuFqAhq.ltrans0.ltrans.o
|
||||
0x2d (size before relaxing)
|
||||
.rodata.main.str1.4
|
||||
0x000017b2 0x89 /tmp/ccuFqAhq.ltrans0.ltrans.o
|
||||
*fill* 0x000017b2 0x2
|
||||
.rodata.main 0x000017b4 0x18 /tmp/ccuFqAhq.ltrans0.ltrans.o
|
||||
.rodata.icon_stats
|
||||
0x000017cc 0x20 /tmp/ccuFqAhq.ltrans0.ltrans.o
|
||||
.rodata.icon_heal
|
||||
0x000017ec 0x20 /tmp/ccuFqAhq.ltrans0.ltrans.o
|
||||
.rodata.icon_clean
|
||||
0x0000180c 0x20 /tmp/ccuFqAhq.ltrans0.ltrans.o
|
||||
.rodata.icon_sleep
|
||||
0x0000182c 0x20 /tmp/ccuFqAhq.ltrans0.ltrans.o
|
||||
.rodata.icon_play
|
||||
0x0000184c 0x20 /tmp/ccuFqAhq.ltrans0.ltrans.o
|
||||
.rodata.icon_feed
|
||||
0x0000186c 0x20 /tmp/ccuFqAhq.ltrans0.ltrans.o
|
||||
.rodata.pana_dead
|
||||
0x0000188c 0x80 /tmp/ccuFqAhq.ltrans0.ltrans.o
|
||||
.rodata.pana_sleep
|
||||
0x0000190c 0x80 /tmp/ccuFqAhq.ltrans0.ltrans.o
|
||||
.rodata.pana_eat
|
||||
0x0000198c 0x80 /tmp/ccuFqAhq.ltrans0.ltrans.o
|
||||
.rodata.pana_sad
|
||||
0x00001a0c 0x80 /tmp/ccuFqAhq.ltrans0.ltrans.o
|
||||
.rodata.pana_happy
|
||||
0x00001a8c 0x80 /tmp/ccuFqAhq.ltrans0.ltrans.o
|
||||
.rodata.pana_blink
|
||||
0x00001b0c 0x80 /tmp/ccuFqAhq.ltrans0.ltrans.o
|
||||
.rodata.str1.4
|
||||
0x00001b8c 0x76 /tmp/ccuFqAhq.ltrans0.ltrans.o
|
||||
.rodata.errstr
|
||||
0x00001b8c 0x14 /tmp/ccuFqAhq.ltrans0.ltrans.o
|
||||
.rodata.fontdata
|
||||
0x00001ba0 0x800 /tmp/ccuFqAhq.ltrans0.ltrans.o
|
||||
.rodata.ssd1306_init_array
|
||||
0x000023a0 0x1a /tmp/ccuFqAhq.ltrans0.ltrans.o
|
||||
*fill* 0x000023ba 0x2
|
||||
.rodata.pana_idle
|
||||
0x000023bc 0x80 /tmp/ccuFqAhq.ltrans0.ltrans.o
|
||||
.rodata.menu_icons
|
||||
0x0000243c 0x18 /tmp/ccuFqAhq.ltrans0.ltrans.o
|
||||
.rodata.pana_frames
|
||||
0x00002454 0x1c /tmp/ccuFqAhq.ltrans0.ltrans.o
|
||||
.rodata.menu_labels
|
||||
0x00002470 0x18 /tmp/ccuFqAhq.ltrans0.ltrans.o
|
||||
.rodata.spr_grave
|
||||
0x00002488 0x80 /tmp/ccuFqAhq.ltrans0.ltrans.o
|
||||
*(.gnu.linkonce.t.*)
|
||||
0x00002508 . = ALIGN (0x4)
|
||||
|
||||
.fini 0x00002508 0x0
|
||||
*(SORT_NONE(.fini))
|
||||
0x00002508 . = ALIGN (0x4)
|
||||
[!provide] PROVIDE (_etext = .)
|
||||
[!provide] PROVIDE (_eitcm = .)
|
||||
|
||||
.preinit_array 0x00002508 0x0
|
||||
[!provide] PROVIDE (__preinit_array_start = .)
|
||||
*(.preinit_array)
|
||||
[!provide] PROVIDE (__preinit_array_end = .)
|
||||
|
||||
.init_array 0x00002508 0x0
|
||||
0x00002508 PROVIDE (__init_array_start = .)
|
||||
*(SORT_BY_INIT_PRIORITY(.init_array.*) SORT_BY_INIT_PRIORITY(.ctors.*))
|
||||
*(.init_array EXCLUDE_FILE(*crtend?.o *crtend.o *crtbegin?.o *crtbegin.o) .ctors)
|
||||
0x00002508 PROVIDE (__init_array_end = .)
|
||||
|
||||
.fini_array 0x00002508 0x0
|
||||
[!provide] PROVIDE (__fini_array_start = .)
|
||||
*(SORT_BY_INIT_PRIORITY(.fini_array.*) SORT_BY_INIT_PRIORITY(.dtors.*))
|
||||
*(.fini_array EXCLUDE_FILE(*crtend?.o *crtend.o *crtbegin?.o *crtbegin.o) .dtors)
|
||||
[!provide] PROVIDE (__fini_array_end = .)
|
||||
|
||||
.ctors
|
||||
*crtbegin.o(.ctors)
|
||||
*crtbegin?.o(.ctors)
|
||||
*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)
|
||||
*(SORT_BY_NAME(.ctors.*))
|
||||
*(.ctors)
|
||||
|
||||
.dtors
|
||||
*crtbegin.o(.dtors)
|
||||
*crtbegin?.o(.dtors)
|
||||
*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)
|
||||
*(SORT_BY_NAME(.dtors.*))
|
||||
*(.dtors)
|
||||
|
||||
.dalign 0x20000000 0x0 load address 0x00002508
|
||||
0x20000000 . = ALIGN (0x4)
|
||||
0x20000000 PROVIDE (_data_vma = .)
|
||||
|
||||
.dlalign 0x00002508 0x0
|
||||
0x00002508 . = ALIGN (0x4)
|
||||
0x00002508 PROVIDE (_data_lma = .)
|
||||
|
||||
.data 0x20000000 0x8 load address 0x00002508
|
||||
0x20000000 . = ALIGN (0x4)
|
||||
0x200003fc __global_pointer$ = (. + 0x3fc)
|
||||
*(.gnu.linkonce.r.*)
|
||||
*(.data .data.*)
|
||||
*(.gnu.linkonce.d.*)
|
||||
0x20000000 . = ALIGN (0x8)
|
||||
*(.sdata .sdata.*)
|
||||
*(.sdata2*)
|
||||
*(.gnu.linkonce.s.*)
|
||||
0x20000000 . = ALIGN (0x8)
|
||||
*(.srodata.cst16)
|
||||
*(.srodata.cst8)
|
||||
*(.srodata.cst4)
|
||||
*(.srodata.cst2)
|
||||
*(.srodata .srodata.*)
|
||||
.srodata.spr_poop
|
||||
0x20000000 0x8 /tmp/ccuFqAhq.ltrans0.ltrans.o
|
||||
0x20000008 . = ALIGN (0x4)
|
||||
0x20000008 PROVIDE (_edata = .)
|
||||
|
||||
.rela.dyn 0x20000008 0x0 load address 0x00002510
|
||||
.rela.text.handle_reset
|
||||
0x20000008 0x0 /tmp/ccuFqAhq.ltrans0.ltrans.o
|
||||
|
||||
.bss 0x20000008 0x41c load address 0x00002510
|
||||
0x20000008 . = ALIGN (0x4)
|
||||
0x20000008 PROVIDE (_sbss = .)
|
||||
*(.sbss*)
|
||||
.sbss.anim_exp
|
||||
0x20000008 0x1 /tmp/ccuFqAhq.ltrans0.ltrans.o
|
||||
*fill* 0x20000009 0x3
|
||||
.sbss.frame 0x2000000c 0x4 /tmp/ccuFqAhq.ltrans0.ltrans.o
|
||||
.sbss.tick_acc
|
||||
0x20000010 0x2 /tmp/ccuFqAhq.ltrans0.ltrans.o
|
||||
.sbss.anim_timer
|
||||
0x20000012 0x1 /tmp/ccuFqAhq.ltrans0.ltrans.o
|
||||
.sbss.cursor 0x20000013 0x1 /tmp/ccuFqAhq.ltrans0.ltrans.o
|
||||
.sbss.screen 0x20000014 0x1 /tmp/ccuFqAhq.ltrans0.ltrans.o
|
||||
*(.gnu.linkonce.sb.*)
|
||||
*(.bss*)
|
||||
*fill* 0x20000015 0x3
|
||||
.bss.pet 0x20000018 0xc /tmp/ccuFqAhq.ltrans0.ltrans.o
|
||||
.bss.ssd1306_buffer
|
||||
0x20000024 0x400 /tmp/ccuFqAhq.ltrans0.ltrans.o
|
||||
*(.gnu.linkonce.b.*)
|
||||
*(COMMON*)
|
||||
0x20000424 . = ALIGN (0x4)
|
||||
0x20000424 PROVIDE (_ebss = .)
|
||||
[!provide] PROVIDE (_end = _ebss)
|
||||
[!provide] PROVIDE (end = .)
|
||||
0x20000800 PROVIDE (_eusrstack = (ORIGIN (RAM) + LENGTH (RAM)))
|
||||
|
||||
/DISCARD/
|
||||
*(.note .note.*)
|
||||
*(.eh_frame .eh_frame.*)
|
||||
*(.comment .comment.*)
|
||||
*(.ARM.extab* .gnu.linkonce.armextab.*)
|
||||
*(.ARM.exidx*)
|
||||
OUTPUT(tama.elf elf32-littleriscv)
|
||||
|
||||
.riscv.attributes
|
||||
0x00000000 0x25
|
||||
.riscv.attributes
|
||||
0x00000000 0x25 /tmp/ccuFqAhq.ltrans0.ltrans.o
|
||||
.riscv.attributes
|
||||
0x00000025 0x1f ../ch32v003fun/ch32fun//../misc/libgcc.a(div.o)
|
||||
|
||||
.debug_info 0x00000000 0x49c5
|
||||
.debug_info 0x00000000 0x25b8 /tmp/ccuFqAhq.ltrans0.ltrans.o
|
||||
.debug_info 0x000025b8 0x1159 /tmp/cc6O5Yfp.debug.temp.o
|
||||
0x000025b8 ch32fun.c.3da016ab
|
||||
.debug_info 0x00003711 0x1257 /tmp/ccQWTvKu.debug.temp.o
|
||||
0x00003711 tama.c.f19bf6d4
|
||||
.debug_info 0x00004968 0x5d ../ch32v003fun/ch32fun//../misc/libgcc.a(div.o)
|
||||
|
||||
.debug_abbrev 0x00000000 0x7c5
|
||||
.debug_abbrev 0x00000000 0x20c /tmp/ccuFqAhq.ltrans0.ltrans.o
|
||||
.debug_abbrev 0x0000020c 0x278 /tmp/cc6O5Yfp.debug.temp.o
|
||||
.debug_abbrev 0x00000484 0x319 /tmp/ccQWTvKu.debug.temp.o
|
||||
.debug_abbrev 0x0000079d 0x28 ../ch32v003fun/ch32fun//../misc/libgcc.a(div.o)
|
||||
|
||||
.debug_loclists
|
||||
0x00000000 0x20c5
|
||||
.debug_loclists
|
||||
0x00000000 0x20c5 /tmp/ccuFqAhq.ltrans0.ltrans.o
|
||||
|
||||
.debug_aranges 0x00000000 0x200
|
||||
.debug_aranges
|
||||
0x00000000 0x1e0 /tmp/ccuFqAhq.ltrans0.ltrans.o
|
||||
.debug_aranges
|
||||
0x000001e0 0x20 ../ch32v003fun/ch32fun//../misc/libgcc.a(div.o)
|
||||
|
||||
.debug_rnglists
|
||||
0x00000000 0x4a6
|
||||
.debug_rnglists
|
||||
0x00000000 0x4a6 /tmp/ccuFqAhq.ltrans0.ltrans.o
|
||||
|
||||
.debug_line 0x00000000 0x4835
|
||||
.debug_line 0x00000000 0x45f0 /tmp/ccuFqAhq.ltrans0.ltrans.o
|
||||
.debug_line 0x000045f0 0x76 /tmp/cc6O5Yfp.debug.temp.o
|
||||
.debug_line 0x00004666 0x7c /tmp/ccQWTvKu.debug.temp.o
|
||||
.debug_line 0x000046e2 0x153 ../ch32v003fun/ch32fun//../misc/libgcc.a(div.o)
|
||||
|
||||
.debug_str 0x00000000 0xf6f
|
||||
.debug_str 0x00000000 0xf6f /tmp/ccuFqAhq.ltrans0.ltrans.o
|
||||
0x1c2 (size before relaxing)
|
||||
.debug_str 0x00000f6f 0x751 /tmp/cc6O5Yfp.debug.temp.o
|
||||
.debug_str 0x00000f6f 0x994 /tmp/ccQWTvKu.debug.temp.o
|
||||
.debug_str 0x00000f6f 0xd9 ../ch32v003fun/ch32fun//../misc/libgcc.a(div.o)
|
||||
|
||||
.debug_line_str
|
||||
0x00000000 0x33f
|
||||
.debug_line_str
|
||||
0x00000000 0x33f /tmp/ccuFqAhq.ltrans0.ltrans.o
|
||||
0x157 (size before relaxing)
|
||||
.debug_line_str
|
||||
0x0000033f 0x246 /tmp/cc6O5Yfp.debug.temp.o
|
||||
.debug_line_str
|
||||
0x0000033f 0x1e5 /tmp/ccQWTvKu.debug.temp.o
|
||||
.debug_line_str
|
||||
0x0000033f 0x92 ../ch32v003fun/ch32fun//../misc/libgcc.a(div.o)
|
||||
|
||||
.debug_frame 0x00000000 0x5b0
|
||||
.debug_frame 0x00000000 0x5b0 /tmp/ccuFqAhq.ltrans0.ltrans.o
|
||||
Loading…
Reference in New Issue