From 6db14be79958bba1bba58e5763f9cf1f80d023c0 Mon Sep 17 00:00:00 2001 From: Luxferre Date: Mon, 26 Oct 2026 15:17:55 +0200 Subject: [PATCH] Add Gambatte GB/GBC emulator, Call/SMS anti-spam blocklist, and Lua/bc/dc/Yabasic --- .gitignore | 1 + AGENTS.md | 4 +- CHANGELOG.md | 19 + MANUAL.md | 30 +- README.md | 12 +- overlay/rootfs/home/user/Games/2048.gb | Bin 0 -> 32768 bytes overlay/rootfs/home/user/Games/adjustris.gb | Bin 0 -> 32768 bytes overlay/rootfs/home/user/Games/blastah.gb | Bin 0 -> 65536 bytes overlay/rootfs/home/user/Games/brickster.gbc | Bin 0 -> 32768 bytes overlay/rootfs/home/user/Games/geometrix.gbc | Bin 0 -> 32768 bytes overlay/rootfs/home/user/Games/ucity.gbc | Bin 0 -> 131072 bytes overlay/rootfs/usr/bin/gambatte | Bin 0 -> 239120 bytes overlay/rootfs/usr/bin/gbemu | 1 + overlay/rootfs/usr/bin/lua | 1 + overlay/rootfs/usr/bin/luac | 1 + overlay/rootfs/usr/bin/sxmo_modem.sh | 9 +- overlay/rootfs/usr/lib/dwm/plugins/calllog.so | Bin 83348 -> 103832 bytes overlay/rootfs/usr/lib/dwm/plugins/dmenu.so | Bin 75000 -> 75000 bytes overlay/rootfs/usr/lib/dwm/plugins/files.so | Bin 107908 -> 107908 bytes overlay/rootfs/usr/lib/dwm/plugins/sms.so | Bin 124292 -> 144772 bytes overlay/rootfs/usr/share/games/gb/2048.gb | Bin 0 -> 32768 bytes .../rootfs/usr/share/games/gb/adjustris.gb | Bin 0 -> 32768 bytes overlay/rootfs/usr/share/games/gb/blastah.gb | Bin 0 -> 65536 bytes .../rootfs/usr/share/games/gb/brickster.gbc | Bin 0 -> 32768 bytes .../rootfs/usr/share/games/gb/geometrix.gbc | Bin 0 -> 32768 bytes overlay/rootfs/usr/share/games/gb/ucity.gbc | Bin 0 -> 131072 bytes .../default_hooks/sxmo_hook_block_call.sh | 54 +- .../sxmo/default_hooks/sxmo_hook_games.sh | 1 + prebuilt/games/usr/bin/gambatte | Bin 0 -> 239120 bytes prebuilt/games/usr/bin/gbemu | 1 + .../sxmo-x11/usr/lib/dwm/plugins/calllog.so | Bin 83348 -> 103832 bytes .../sxmo-x11/usr/lib/dwm/plugins/dmenu.so | Bin 75000 -> 75000 bytes .../sxmo-x11/usr/lib/dwm/plugins/files.so | Bin 107908 -> 107908 bytes prebuilt/sxmo-x11/usr/lib/dwm/plugins/sms.so | Bin 124292 -> 144772 bytes scripts/build-games.sh | 32 +- scripts/configure-rootfs-from-scratch.sh | 9 + src/dwm-plugins/calllog_plugin.cpp | 821 ++++-- src/dwm-plugins/files_plugin.cpp | 13 + src/dwm-plugins/phone_data.h | 368 ++- src/dwm-plugins/sms_plugin.cpp | 351 ++- src/games/gambatte/common/gambatte-array.h | 39 + src/games/gambatte/common/uncopyable.h | 29 + src/games/gambatte/include/gambatte.h | 162 ++ src/games/gambatte/include/gambatte_log.h | 16 + src/games/gambatte/include/gbint.h | 62 + src/games/gambatte/include/inputgetter.h | 33 + src/games/gambatte/src/bootloader.cpp | 113 + src/games/gambatte/src/bootloader.h | 44 + src/games/gambatte/src/counterdef.h | 10 + src/games/gambatte/src/cpu.cpp | 2005 +++++++++++++ src/games/gambatte/src/cpu.h | 114 + src/games/gambatte/src/gambatte-memory.cpp | 1199 ++++++++ src/games/gambatte/src/gambatte-memory.h | 226 ++ src/games/gambatte/src/gambatte.cpp | 243 ++ src/games/gambatte/src/initstate.cpp | 1358 +++++++++ src/games/gambatte/src/initstate.h | 31 + src/games/gambatte/src/insertion_sort.h | 51 + src/games/gambatte/src/interrupter.cpp | 85 + src/games/gambatte/src/interrupter.h | 52 + src/games/gambatte/src/interruptrequester.cpp | 117 + src/games/gambatte/src/interruptrequester.h | 97 + src/games/gambatte/src/mem/cartridge.cpp | 1180 ++++++++ src/games/gambatte/src/mem/cartridge.h | 226 ++ .../gambatte/src/mem/cartridge_libretro.cpp | 93 + src/games/gambatte/src/mem/huc3.cpp | 189 ++ src/games/gambatte/src/mem/huc3.h | 79 + src/games/gambatte/src/mem/memptrs.cpp | 168 ++ src/games/gambatte/src/mem/memptrs.h | 159 ++ src/games/gambatte/src/mem/rtc.cpp | 170 ++ src/games/gambatte/src/mem/rtc.h | 104 + src/games/gambatte/src/minkeeper.h | 157 + src/games/gambatte/src/savestate.h | 229 ++ src/games/gambatte/src/serial_io.h | 35 + src/games/gambatte/src/sound.cpp | 206 ++ src/games/gambatte/src/sound.h | 95 + src/games/gambatte/src/sound/channel1.cpp | 262 ++ src/games/gambatte/src/sound/channel1.h | 92 + src/games/gambatte/src/sound/channel2.cpp | 160 ++ src/games/gambatte/src/sound/channel2.h | 66 + src/games/gambatte/src/sound/channel3.cpp | 211 ++ src/games/gambatte/src/sound/channel3.h | 105 + src/games/gambatte/src/sound/channel4.cpp | 261 ++ src/games/gambatte/src/sound/channel4.h | 99 + src/games/gambatte/src/sound/duty_unit.cpp | 158 ++ src/games/gambatte/src/sound/duty_unit.h | 72 + .../gambatte/src/sound/envelope_unit.cpp | 96 + src/games/gambatte/src/sound/envelope_unit.h | 53 + .../gambatte/src/sound/length_counter.cpp | 82 + src/games/gambatte/src/sound/length_counter.h | 46 + .../gambatte/src/sound/master_disabler.h | 36 + src/games/gambatte/src/sound/sound_unit.h | 45 + .../gambatte/src/sound/static_output_tester.h | 47 + src/games/gambatte/src/statesaver.cpp | 604 ++++ src/games/gambatte/src/statesaver.h | 49 + src/games/gambatte/src/tima.cpp | 169 ++ src/games/gambatte/src/tima.h | 66 + src/games/gambatte/src/video.cpp | 777 +++++ src/games/gambatte/src/video.h | 244 ++ src/games/gambatte/src/video/lcddef.h | 21 + src/games/gambatte/src/video/ly_counter.cpp | 68 + src/games/gambatte/src/video/ly_counter.h | 57 + src/games/gambatte/src/video/lyc_irq.cpp | 108 + src/games/gambatte/src/video/lyc_irq.h | 61 + src/games/gambatte/src/video/m0_irq.h | 63 + src/games/gambatte/src/video/next_m0_time.cpp | 6 + src/games/gambatte/src/video/next_m0_time.h | 19 + src/games/gambatte/src/video/ppu.cpp | 1771 ++++++++++++ src/games/gambatte/src/video/ppu.h | 199 ++ .../gambatte/src/video/sprite_mapper.cpp | 203 ++ src/games/gambatte/src/video/sprite_mapper.h | 122 + src/games/gambatte/src/video_libretro.cpp | 321 +++ src/games/gambatte_phone.cpp | 2516 +++++++++++++++++ src/sxmo-dmenu/dmenu.c | 4 + 113 files changed, 20006 insertions(+), 237 deletions(-) create mode 100644 overlay/rootfs/home/user/Games/2048.gb create mode 100644 overlay/rootfs/home/user/Games/adjustris.gb create mode 100644 overlay/rootfs/home/user/Games/blastah.gb create mode 100644 overlay/rootfs/home/user/Games/brickster.gbc create mode 100644 overlay/rootfs/home/user/Games/geometrix.gbc create mode 100644 overlay/rootfs/home/user/Games/ucity.gbc create mode 100755 overlay/rootfs/usr/bin/gambatte create mode 120000 overlay/rootfs/usr/bin/gbemu create mode 120000 overlay/rootfs/usr/bin/lua create mode 120000 overlay/rootfs/usr/bin/luac create mode 100644 overlay/rootfs/usr/share/games/gb/2048.gb create mode 100644 overlay/rootfs/usr/share/games/gb/adjustris.gb create mode 100644 overlay/rootfs/usr/share/games/gb/blastah.gb create mode 100644 overlay/rootfs/usr/share/games/gb/brickster.gbc create mode 100644 overlay/rootfs/usr/share/games/gb/geometrix.gbc create mode 100644 overlay/rootfs/usr/share/games/gb/ucity.gbc create mode 100755 prebuilt/games/usr/bin/gambatte create mode 120000 prebuilt/games/usr/bin/gbemu create mode 100644 src/games/gambatte/common/gambatte-array.h create mode 100644 src/games/gambatte/common/uncopyable.h create mode 100644 src/games/gambatte/include/gambatte.h create mode 100644 src/games/gambatte/include/gambatte_log.h create mode 100644 src/games/gambatte/include/gbint.h create mode 100644 src/games/gambatte/include/inputgetter.h create mode 100644 src/games/gambatte/src/bootloader.cpp create mode 100644 src/games/gambatte/src/bootloader.h create mode 100644 src/games/gambatte/src/counterdef.h create mode 100644 src/games/gambatte/src/cpu.cpp create mode 100644 src/games/gambatte/src/cpu.h create mode 100644 src/games/gambatte/src/gambatte-memory.cpp create mode 100644 src/games/gambatte/src/gambatte-memory.h create mode 100644 src/games/gambatte/src/gambatte.cpp create mode 100644 src/games/gambatte/src/initstate.cpp create mode 100644 src/games/gambatte/src/initstate.h create mode 100644 src/games/gambatte/src/insertion_sort.h create mode 100644 src/games/gambatte/src/interrupter.cpp create mode 100644 src/games/gambatte/src/interrupter.h create mode 100644 src/games/gambatte/src/interruptrequester.cpp create mode 100644 src/games/gambatte/src/interruptrequester.h create mode 100644 src/games/gambatte/src/mem/cartridge.cpp create mode 100644 src/games/gambatte/src/mem/cartridge.h create mode 100644 src/games/gambatte/src/mem/cartridge_libretro.cpp create mode 100644 src/games/gambatte/src/mem/huc3.cpp create mode 100644 src/games/gambatte/src/mem/huc3.h create mode 100644 src/games/gambatte/src/mem/memptrs.cpp create mode 100644 src/games/gambatte/src/mem/memptrs.h create mode 100644 src/games/gambatte/src/mem/rtc.cpp create mode 100644 src/games/gambatte/src/mem/rtc.h create mode 100644 src/games/gambatte/src/minkeeper.h create mode 100644 src/games/gambatte/src/savestate.h create mode 100644 src/games/gambatte/src/serial_io.h create mode 100644 src/games/gambatte/src/sound.cpp create mode 100644 src/games/gambatte/src/sound.h create mode 100644 src/games/gambatte/src/sound/channel1.cpp create mode 100644 src/games/gambatte/src/sound/channel1.h create mode 100644 src/games/gambatte/src/sound/channel2.cpp create mode 100644 src/games/gambatte/src/sound/channel2.h create mode 100644 src/games/gambatte/src/sound/channel3.cpp create mode 100644 src/games/gambatte/src/sound/channel3.h create mode 100644 src/games/gambatte/src/sound/channel4.cpp create mode 100644 src/games/gambatte/src/sound/channel4.h create mode 100644 src/games/gambatte/src/sound/duty_unit.cpp create mode 100644 src/games/gambatte/src/sound/duty_unit.h create mode 100644 src/games/gambatte/src/sound/envelope_unit.cpp create mode 100644 src/games/gambatte/src/sound/envelope_unit.h create mode 100644 src/games/gambatte/src/sound/length_counter.cpp create mode 100644 src/games/gambatte/src/sound/length_counter.h create mode 100644 src/games/gambatte/src/sound/master_disabler.h create mode 100644 src/games/gambatte/src/sound/sound_unit.h create mode 100644 src/games/gambatte/src/sound/static_output_tester.h create mode 100644 src/games/gambatte/src/statesaver.cpp create mode 100644 src/games/gambatte/src/statesaver.h create mode 100644 src/games/gambatte/src/tima.cpp create mode 100644 src/games/gambatte/src/tima.h create mode 100644 src/games/gambatte/src/video.cpp create mode 100644 src/games/gambatte/src/video.h create mode 100644 src/games/gambatte/src/video/lcddef.h create mode 100644 src/games/gambatte/src/video/ly_counter.cpp create mode 100644 src/games/gambatte/src/video/ly_counter.h create mode 100644 src/games/gambatte/src/video/lyc_irq.cpp create mode 100644 src/games/gambatte/src/video/lyc_irq.h create mode 100644 src/games/gambatte/src/video/m0_irq.h create mode 100644 src/games/gambatte/src/video/next_m0_time.cpp create mode 100644 src/games/gambatte/src/video/next_m0_time.h create mode 100644 src/games/gambatte/src/video/ppu.cpp create mode 100644 src/games/gambatte/src/video/ppu.h create mode 100644 src/games/gambatte/src/video/sprite_mapper.cpp create mode 100644 src/games/gambatte/src/video/sprite_mapper.h create mode 100644 src/games/gambatte/src/video_libretro.cpp create mode 100644 src/games/gambatte_phone.cpp diff --git a/.gitignore b/.gitignore index 1563980..5b79846 100644 --- a/.gitignore +++ b/.gitignore @@ -21,6 +21,7 @@ *.tar.gz *.tar.xz *.tar.zst +*.zip # Private SSH keys, credentials, and local agent configs /keys/phone_id_* diff --git a/AGENTS.md b/AGENTS.md index f807ff6..b65a019 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -16,7 +16,7 @@ It uses a pure **X11 (`Xlibre` + `sxmo-de-dwm`)** stack (no Wayland) optimized f - `src/xdrawer/`: Global phone controls overlay (`xdrawer.so` / `xdrawer`), toggled by pressing both softkeys simultaneously. - `src/sxmo-st/`: Patched `st` terminal with HarfBuzz OpenType ligatures (`Fira Code`), `XIM` (`fcitx5-t9`), and live `SIGUSR1` `.Xresources` reload. - `src/fcitx5-t9/`: 6-mode keypad input method (`abc`, `Abc`, `ABC`, `Sym`, `Ctl`, `123` + `*` long-press `Ctrl+` latch) with fixed bottom preedit bar (`Y=290, H=30`). -- `src/games/`: Standalone keypad-driven `240x320` X11 games (`snake.cpp` -> `/usr/bin/snake`, `tetris.cpp` -> `/usr/bin/tetris`) with built-in 5x7 bitmap fonts, `timerfd`-driven pacing, and offscreen `Pixmap` double buffering. +- `src/games/`: Standalone keypad-driven `240x320` X11 games and emulators (`snake.cpp` -> `/usr/bin/snake`, `tetris.cpp` -> `/usr/bin/tetris`, `gambatte_phone.cpp` + `gambatte/` -> `/usr/bin/gambatte` / `/usr/bin/gbemu`) with built-in 5x7 bitmap fonts, `timerfd`-driven pacing, and offscreen `Pixmap` double buffering. - `src/msm8905-cam/` & `src/leds-msm8905-torch/`: Out-of-tree Linux `6.12.1-msm8916` kernel modules for the rear `GC2395` camera (`/dev/video0`) and `SY7807` torch LED (`white:torch`) / WCD codec init / PM8909 `PON` shutdown. - `overlay/rootfs/`: System configuration overlay applied over the target rootfs (kept in sync with `prebuilt/`). - `prebuilt/`: Cross-compiled `armv7` binaries and kernel modules (`sxmo-x11`, `fcitx5-t9`, `xlibre`, `kernel-6.12.1-msm8916`, `bantam`, `games`). @@ -26,7 +26,7 @@ It uses a pure **X11 (`Xlibre` + `sxmo-de-dwm`)** stack (no Wayland) optimized f All cross-compilation scripts run inside rootless Docker (`alpine:3.24` `armv7` sysroot) and automatically update both `prebuilt/` and `overlay/rootfs/`: - `./scripts/build-sxmo-x11.sh` — Builds `st`, `dmenu.so`, `dwm`, `dwm-plugin`, `sxmo_vibrate`, and all C++ `.so` plugins (`xdrawer`, `dialer`, `calllog`, `callscreen`, `contacts`, `sms`, `files`, `camera`, `themes`, `modem`, `networks`, `ringtones`, `wallpapers`, `music`). - `./scripts/build-dmenu.sh` — Rebuilds only `dmenu.so`, `stest`, `dmenu_path`, and `dmenu_run`. -- `./scripts/build-games.sh` — Builds standalone X11 games in `src/games/` (`snake`, `tetris`). +- `./scripts/build-games.sh` — Builds standalone X11 games and emulators in `src/games/` (`snake`, `tetris`, `gambatte` / `gbemu`). - `./scripts/build-fcitx5-t9.sh` — Builds `src/fcitx5-t9` (`libt9.so` / `t9.so`). - `./scripts/build-kernel-audio.sh` — Builds `6.12.1-msm8916` QDSP6 audio, torch LED, camera `.ko` modules, and device `.dtb` files. - `./scripts/build-xlibre.sh` — Builds Xlibre `Xorg` and `libinput`/`fbdev` DDX drivers. diff --git a/CHANGELOG.md b/CHANGELOG.md index a2725e2..e9f8ab3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,25 @@ Release versions follow the `
` format (where `2026` is `a`, --- +## Build `a1026` — codename `argonaut` (2026-10-26) + +- **Download the recent images for your device from this link**: https://cloud.disroot.org/s/dB7bM7sRTScetDJ + +### New features and improvements +- **Anti-spam blocklist in Call Log (`xcalllog`) and SMS (`xsms`)**: + - Unified number blocklist (`~/.config/sxmo/block.tsv`) supporting exact numbers, 9-digit suffix matching across local/international formats, and prefix wildcards (`*`). + - Automatic rejection of incoming calls from blocked numbers via `sxmo_hook_block_call.sh`, logging blocked attempts into the `Spam` tab (`~/.local/share/sxmo/block/modemlog.tsv`) without ringing or missed-call alerts. + - Silent routing of incoming SMS messages from blocked senders into the `Spam` folder (`~/.local/share/sxmo/block`), with one-key thread blocking, unblocking, and restoration between `Inbox` and `Spam` in `xsms`. +- **Native Game Boy / Game Boy Color emulator (`gambatte` / `gbemu`)**: + - Full-featured C++ Game Boy / Game Boy Color emulator tailored for `240x320` non-touch displays, integrated into **System menu -> Games** and **File Manager (`xfiles`)** for `.gb` and `.gbc` files. + - Readjustable keypad controls persisted in `~/.config/sxmo/gambatte.cfg` with defaults `B = 8`, `Turbo B = 5`, `A = 9`, `Turbo A = 6`, `Directions = D-Pad`, `Start = 2`, `Select = 3`, `Palette = *`, and `Fast Forward = 0`. + - 10 built-in DMG color palettes, 4 screen scaling modes (`Fit 240x216` 1.5x area-interpolated, `1:1 160x144`, `Fill 240x246`, `Full 240x296`), 10 save-state slots (`.st0`–`.st9`), automatic battery SRAM/RTC persistence, seamless `Xdrawer` focus handoff, and direct low-latency `libasound` (`hw:0,0`) audio with hardware volume synchronization and analog-stage low-pass filtering. + - Preinstalled open-source / public-domain GB and GBC games in `/usr/share/games/gb/` and `~/Games/` (`2048.gb`, `adjustris.gb`, `blastah.gb`, `brickster.gbc`, `geometrix.gbc`, `ucity.gbc`). +- **Preinstalled scripting and calculation tools**: + - Added **Lua** (`lua5.5` and `lua5.4` with `/usr/bin/lua` and `/usr/bin/luac`), **GNU `bc` / `dc`**, and **Yabasic (`yabasic`)** to the default system image. + +--- + ## Build `a1025` — codename `argonaut` (2026-10-25) Initial public release of **Bananarchy Linux**, focused on complete hardware and daily-driver software support for the **Nokia 8110 4G (`nokia-argon`)**, along with initial build targets for the **Nokia 2720 Flip (`nokia-beatles`)**, **Nokia 800 Tough (`nokia-tough`)**, **Nokia 8000 4G (`nokia-sparkler`)**, and **Nokia 6300 4G (`nokia-leo`)**. diff --git a/MANUAL.md b/MANUAL.md index f79fe89..9cefbb9 100644 --- a/MANUAL.md +++ b/MANUAL.md @@ -34,7 +34,7 @@ This manual covers flashing, operating, and customizing **Bananarchy Linux** (`2 - **QDSP6 / Q6Voice audio and Dual-SIM modem**: loudspeaker, boosted (+6 dB) earpiece, internal MEMS and headset microphones, `ModemManager` + `q6voiced` call audio routing, and direct Qualcomm QMI UIM Dual-SIM slot switching, PIN/PUK management, and SIM phonebook access. - **Rear 2MP camera and torch LED**: `msm8905-cam` V4L2 driver (`/dev/video0` `800x600` `RGB3` for GalaxyCore `GC2395`) and `leds-msm8905-torch` (`white:torch` + PM8909 clean poweroff). 5. **Preinstalled developer and utility stack**: - - `gcc`/`g++`, `make`, `git`, GNU `coreutils`, `nano`, `ed`, `less`, `rlwrap`, `janet` + `jpm`, `bantam` coding agent, `perl` (`IO::Socket::SSL`), `tcl` (`tcllib`, `tcl-tls`, `sqlite-tcl`), `sqlite3`, `frotz`, `ffmpeg`, `mpv`, `imv`, and standalone `snake` and `tetris` X11 games. + - `gcc`/`g++`, `make`, `git`, GNU `coreutils`, GNU `bc`/`dc`, `nano`, `ed`, `less`, `rlwrap`, `lua` (`5.5` and `5.4`), `yabasic`, `janet` + `jpm`, `bantam` coding agent, `perl` (`IO::Socket::SSL`), `tcl` (`tcllib`, `tcl-tls`, `sqlite-tcl`), `sqlite3`, `frotz`, `ffmpeg`, `mpv`, `imv`, standalone `snake` and `tetris` X11 games, and the `gambatte` Game Boy / Game Boy Color emulator. --- @@ -138,9 +138,10 @@ All fifteen phone applications are compiled as shared-object plugins (`/usr/lib/ - Typing **`*#06#`** immediately opens the **Device IMEI (`*#06#`)** dialog showing `IMEI 1`, `IMEI 2`, and `IMEI SV`. - Typing any USSD code (`*...#` or `#...#`, such as `*100#`) switches the center softkey to **`SEND`**. Pressing **Call (green)** or **Center `OK`** runs the USSD session inside an interactive in-dialer modal with scrollable carrier output and multi-step reply support. -4. **Call history (`calllog.so` / `xcalllog`)**: +4. **Call history and anti-spam blocklist (`calllog.so` / `xcalllog`)**: - **Open**: press **Call (green)** on the empty desktop, or select **Call Log** from the System menu or Dialer. - - **Controls**: `Left`/`Right` switches between **`All`**, **`Missed`**, **`In`**, and **`Out`** tabs; `Up`/`Down` scrolls; **Call (green)** or **Center `OK`** dials the selected entry; **Left softkey (`Dialer`)** loads the number into the Dialer. + - **Controls**: `Left`/`Right` switches between **`All`**, **`Miss`**, **`In`**, **`Out`**, and **`Spam`** tabs; `Up`/`Down` scrolls; **Call (green)** or **Center `OK`** dials the selected entry. + - **Anti-spam blocklist (`~/.config/sxmo/block.tsv`)**: press **Left softkey (`Options`)** to **Block Number (Spam)** or **Unblock Number**, open **Blocklist (N)** to manage blocked numbers, **Block a Number...** (supports exact numbers, 9-digit suffix matching, or prefix wildcards ending with `*`), or **Clear Spam Log** (`~/.local/share/sxmo/block/modemlog.tsv`). Incoming calls from blocked numbers are automatically hung up and recorded in the `Spam` tab without triggering missed-call notifications. 5. **Incoming and active call screen (`callscreen.so` / `xcallscreen`)**: - **Automatic activation**: wakes the screen and opens automatically on incoming and outgoing calls. Pressing **Call (green)** during an active call reopens `xcallscreen` from anywhere. @@ -159,14 +160,16 @@ All fifteen phone applications are compiled as shared-object plugins (`/usr/lib/ - **Direct Dual-SIM QMI phonebook import and export**: select **Import from SIM** or **Export to SIM** in the **Options** menu (or **Copy to SIM** on an individual contact) to read or write `EF_ADN` SIM phonebook records directly over Qualcomm QMI UIM (`qrtr://0`) on either **SIM 1** or **SIM 2** — even on the inactive SIM slot. - **Built-in contact editor**: create or edit contacts directly on the keypad (`#` cycles input mode, `*` inserts space, hold `0` or press `Right` for `+`, or pick from recent unknown callers). -7. **SMS manager and composer (`sms.so` / `xsms`)**: +7. **SMS manager, composer, and spam filter (`sms.so` / `xsms`)**: - **Open**: select **Texts** from the System menu, or choose **Send SMS** / **Read Messages** from Contacts. - - **Conversations and thread view**: browse SMS threads and drafts with contact name resolution, unread indicators, and message bubbles (`Recv` and `Sent`). + - **Conversations, Inbox, and Spam Folder**: browse SMS threads and drafts with contact name resolution, unread indicators, and message bubbles (`Recv` and `Sent`). Press `Left`/`Right` in the thread list (or use **Left softkey (`Options`)**) to switch between **`Inbox`** (`~/.local/share/sxmo/modem`) and the **`Spam`** folder (`~/.local/share/sxmo/block`). + - **Anti-spam blocking**: press **Left softkey (`Options`)** on any thread or conversation to **Block Number (Spam)** (which adds the sender to `~/.config/sxmo/block.tsv` and moves their thread into the `Spam` folder), **Unblock & Restore** (which unblocks the sender and restores their thread to `Inbox`), **Manage Blocklist (N)**, or **Block a Number...**. Incoming texts from blocked numbers are silently routed into `~/.local/share/sxmo/block` without ringing or vibrating. - **Multi-tap composer**: pick a recipient from Contacts/Recents or type a number (hold `0` for `+`), compose messages with multi-tap keypad entry (`#` cycles input mode), monitor live character/segment counts (`0/160`), save drafts automatically, and send via **Call (green)**, **Center `OK`**, or **Left softkey**. 8. **File manager (`files.so` / `xfiles`)**: - **Open**: select **Files** from the System menu or press `Mod4+d`. - **Controls and viewers**: navigate directories with `Up`/`Down`/`Left`/`Right`/`Return`, filter with `0`–`9`, toggle dotfiles with `*`, and cycle sort order (**Name** / **Date** / **Size**) with `#`. + - **Game Boy / Game Boy Color ROM launching**: pressing `Return` on any `.gb` or `.gbc` file (or selecting **Play in Game Boy Emulator** from the **Left softkey (`Actions`)** menu) opens it directly in the **Gambatte (`gambatte`)** emulator. - **Image preview and wallpaper installation**: pressing `Return` on any image file (`.jpg`, `.png`, `.bmp`, `.gif`, `.webp`, `.ppm`, `.tif`, `.ico`, `.svg`) opens the built-in image viewer (`*` toggles full-screen preview; **Left softkey (`Set Wall`)** installs the image into `~/Pictures/Wallpapers/`, applies it via `feh`, and refreshes Conky). You can also select **Preview Image** or **Set as Wallpaper** directly from the **Left softkey (`Actions`)** menu. - **Audio playback and ringtone installation**: pressing `Return` on any audio or tracker module file opens it immediately in **Music (`xmusic`)**. From the **Left softkey (`Actions`)** menu on any audio/tracker file, select **Play in Music Player** to play it in `xmusic`, or **Set as Ringtone** to copy it to `~/Ringtones/` and set it as the active phone ringtone. - **File management actions**: the **Left softkey (`Actions`)** menu also provides **View Text**, **Edit in Nano**, **New Folder**, **New File**, **Rename**, **Copy**, **Cut / Move**, **Paste Here**, **Properties**, **Open Terminal Here**, and **Delete**. @@ -210,10 +213,23 @@ All fifteen phone applications are compiled as shared-object plugins (`/usr/lib/ - **`2:Queue`**: browse the active playlist queue, filter with `0`–`9`, press `Return` to jump to a track, `*` to remove a track, `#` to shuffle, or **Left softkey (`Actions`)** to set the selected track as ringtone or clear the queue. - **`3:Files`**: browse the filesystem (`~/Music`, `/usr/share/sxmo/music`, `/usr/share/sxmo/ringtones`, or any folder), press `Return` to play a file and load its folder into the queue, `*` to append a file or folder to the queue, or `#` to play the entire current folder. -#### 3.1.3 Standalone keypad games (`Snake` and `Tetris`) -Two classic X11 games (`/usr/bin/snake` and `/usr/bin/tetris`) are accessible from **System menu -> Games**: +#### 3.1.3 Standalone keypad games (`Snake`, `Tetris`) and Game Boy / Game Boy Color emulator (`Gambatte`) +Two classic X11 games (`/usr/bin/snake` and `/usr/bin/tetris`) and the full-featured **Gambatte (`gambatte` / `gbemu`)** Game Boy / Game Boy Color emulator are accessible from **System menu -> Games** (or by opening any `.gb` / `.gbc` file directly in **Files (`xfiles`)**): - **Snake (`snake`)**: steer with `2`/`8`/`4`/`6` or D-Pad; pause or restart with `5`/`Return`/`#`/`*`; quit with `Right softkey`/`BackSpace`/`Escape`. - **Tetris (`tetris`)**: move with `4`/`6` (`Left`/`Right`), rotate with `2` (`Up`), soft drop with `8` (`Down`), hard drop with `0`/`5`/`Return`, pause with `#`/`*`, and quit with `Right softkey`/`BackSpace`/`Escape`. +- **Game Boy / Game Boy Color emulator (`gambatte` / `gbemu`)**: + - **Launch**: open **Game Boy (Gambatte)** from **System menu -> Games**, open any `.gb` or `.gbc` file from **Files (`xfiles`)**, or run `gambatte [rom.gb|rom.gbc]`. When launched without a file argument, opens a built-in ROM browser scanning `/usr/share/games/gb`, `~/Games`, `~/ROMs`, `~/Downloads`, and user directories. + - **Default keypad controls** (fully readjustable via **Pause Menu -> Keypad Controls...** or **Left softkey (`Controls`)** in the ROM browser; persisted in `~/.config/sxmo/gambatte.cfg`): + - **B Button**: `8` + - **Turbo B**: `5` + - **A Button**: `9` + - **Turbo A**: `6` + - **Directions (`Up`/`Down`/`Left`/`Right`)**: `D-Pad` (`Up`, `Down`, `Left`, `Right`) + - **Start**: `2` + - **Select**: `3` + - **Palette Selection**: `*` (cycles through 10 built-in color palettes: `DMG Classic`, `Bananarchy Gold`, `GB Pocket Gray`, `GB Light Teal`, `GBC Blue/Red`, `Super Game Boy`, `Amber CRT`, `Mintberry`, `Virtual Boy`, `Inverted Dark`) + - **Fast Forward (2x)**: `0` (while held) + - **Quick Shortcuts (when unbound)**: `1` cycles screen scaling mode (`Fit 240x216` 1.5x area-interpolated, `1:1 160x144`, `Fill 240x246`, `Full 240x296`); `4` saves state to the active slot; `7` loads state from the active slot; `#`, `BackSpace`, `Escape`, or either softkey opens the **Gambatte Pause Menu** (Save/Load State across 10 slots `.st0`..`.st9`, Palette, Screen Scale, Audio toggle, Keypad Controls remapping, Load Another ROM, and Quit). Battery-backed SRAM (`.sav`) and RTC (`.rtc`) are saved automatically in `~/.local/share/sxmo/gambatte/saves/`. ### 3.2 Multi-mode `fcitx5-t9` keypad reference diff --git a/README.md b/README.md index a9b1ecc..370e93b 100644 --- a/README.md +++ b/README.md @@ -22,17 +22,17 @@ Instead of spawning slow shell scripts for everyday phone tasks, Bananarchy runs a suite of preloaded C/C++ plugins inside DWM that sleep at 0% CPU and open in `< 2 ms`: - **System and context menus (`dmenu`)**: instant full-screen 10-line vertical menus with live T9 filtering, built-in submenus, and hardware toggles. - **Global controls drawer (`xdrawer`)**: press **both softkeys together** from anywhere to adjust speaker, earpiece, and ringtone volume, ringer mode (`Ring+Vib` / `Vibrate` / `Silent` / `DND`), 3-level vibration intensity (`Light` / `Medium` / `Strong`), flashlight, sound and microphone mute, screen brightness, and keypad backlight. -- **Phone dialer (`xdialer`), call log (`xcalllog`), and call screen (`xcallscreen`)**: press any digit on the home screen to start dialing with live T9 contact matching, run interactive carrier USSD codes (`*100#`, etc.), or type `*#06#` to inspect both IMEIs. Incoming and active calls open a dedicated call screen with earpiece/speaker switching, microphone mute, DTMF keypad, and one-key normalized WAV call recording (`~/Recordings/rec_HHMMSS_.wav`). -- **Contacts (`xcontacts`) and SMS manager (`xsms`)**: full phonebook editor with direct Qualcomm QMI SIM card contact import and export across SIM 1 and SIM 2, paired with a threaded SMS conversation view and multi-tap message composer. +- **Phone dialer (`xdialer`), call log (`xcalllog`), and call screen (`xcallscreen`)**: press any digit on the home screen to start dialing with live T9 contact matching, run interactive carrier USSD codes (`*100#`, etc.), or type `*#06#` to inspect both IMEIs. Incoming and active calls open a dedicated call screen with earpiece/speaker switching, microphone mute, DTMF keypad, and one-key normalized WAV call recording (`~/Recordings/rec_HHMMSS_.wav`). The Call Log includes a 5-tab view (`All`, `Miss`, `In`, `Out`, `Spam`) with integrated anti-spam number blocking (`~/.config/sxmo/block.tsv`) that automatically hangs up blocked callers and logs them to the `Spam` tab without triggering missed-call notifications. +- **Contacts (`xcontacts`) and SMS manager (`xsms`)**: full phonebook editor with direct Qualcomm QMI SIM card contact import and export across SIM 1 and SIM 2, paired with a threaded SMS conversation view, multi-tap message composer, and built-in anti-spam blocklist / `Spam Folder` (`~/.local/share/sxmo/block`) with one-key thread blocking and restoration. - **Modem and Dual-SIM manager (`xmodem`)**: 4-tab cellular control center (`SIMs`, `Radio`, `AT`, `Log`) supporting physical SIM 1 / SIM 2 active slot switching, SIM PIN unlock and PUK unblock wizards, 2G/3G/4G radio mode selection, interactive USSD sessions, and a live AT command console. - **Networks and Bluetooth manager (`xnetworks`)**: 3-tab connectivity manager for Wi-Fi networks, WPA2 password entry, Wi-Fi hotspot, USB tethering, 4G/LTE mobile data (`wwan0`) and APN editing, and Bluetooth pairing. -- **File manager (`xfiles`), music and tracker player (`xmusic`), and camera (`xcamera`)**: keypad directory browser with built-in text and image viewers (plus one-click actions to play audio, preview images, set any image as wallpaper, or install any audio or tracker file as ringtone), a 3-tab music and chiptune tracker module player (`WAV`, `MP3`, `OGG`, `FLAC`, `Opus`, `MOD`, `XM`, `IT`, `S3M`, and more), and a live V4L2 camera viewfinder with digital zoom, flash/torch control, self-timer, and photo gallery. +- **File manager (`xfiles`), music and tracker player (`xmusic`), and camera (`xcamera`)**: keypad directory browser with built-in text and image viewers (plus one-click actions to launch `.gb`/`.gbc` ROMs in the Game Boy emulator, play audio, preview images, set any image as wallpaper, or install any audio or tracker file as ringtone), a 3-tab music and chiptune tracker module player (`WAV`, `MP3`, `OGG`, `FLAC`, `Opus`, `MOD`, `XM`, `IT`, `S3M`, and more), and a live V4L2 camera viewfinder with digital zoom, flash/torch control, self-timer, and photo gallery. - **Themes (`xthemes`), wallpapers (`xwallpapers`), and ringtones (`xringtones`)**: installable `.Xresources` color and font themes (`~/.xthemes/*.xth`, 20 preinstalled schemes) with live zero-restart reload across the entire UI and terminal, alongside dedicated managers for desktop wallpapers and call ringtones (supporting both standard audio and tracker modules) with 3-level vibration control. ### Input, terminal, and developer tools - **6-mode `fcitx5-t9` keypad input**: press `#` to cycle between `abc`, `Abc`, `ABC`, `Sym` (all 32 ASCII punctuation symbols), `Ctl` (`Ctrl` sequences, arrows, `PageUp`/`PageDown`, `F1`–`F12`), and `123` numeric modes with a fixed bottom candidate bar. - **First-class Linux terminal (`st`)**: patched with HarfBuzz OpenType ligatures (`Fira Code` as the default system and terminal font), XIM T9 input, and live theme reloading. -- **On-device development and AI**: preinstalled `gcc`/`g++`, `make`, `git`, GNU `coreutils`, `nano`, `ed`, `sqlite3`, `perl`, `tcl`, the [Janet](https://janet-lang.org/) language and `jpm`, the [Bantam](https://bantam.luxferre.top/) coding agent, `frotz` (interactive fiction), and standalone X11 keypad games (`Snake` and `Tetris`). +- **On-device development, scripting, and gaming**: preinstalled `gcc`/`g++`, `make`, `git`, GNU `coreutils`, GNU `bc`/`dc`, `nano`, `ed`, `sqlite3`, `lua` (`5.5` and `5.4`), `yabasic`, `perl`, `tcl`, the [Janet](https://janet-lang.org/) language and `jpm`, the [Bantam](https://bantam.luxferre.top/) coding agent, `frotz` (interactive fiction), standalone X11 keypad games (`Snake` and `Tetris`), and a full-featured Gambatte-based Game Boy / Game Boy Color emulator (`gambatte` / `gbemu`) with readjustable keypad controls (`B=8`, `Turbo B=5`, `A=9`, `Turbo A=6`, `D-pad`, `Start=2`, `Select=3`, `Palette=*`), 10 color palettes, save states, and File Manager `.gb`/`.gbc` integration. --- @@ -74,7 +74,7 @@ bananarchy/ │ ├── xf86-input-libinput/ # Xlibre xf86-input-libinput DDX driver │ ├── xf86-video-fbdev/ # Xlibre xf86-video-fbdev fallback DDX driver │ ├── fcitx5-t9/ # 6-mode fcitx5-t9 keypad input method -│ ├── games/ # Standalone keypad X11 games (snake.cpp, tetris.cpp) +│ ├── games/ # Standalone keypad X11 games and Gambatte GB/GBC emulator (snake, tetris, gambatte) │ ├── leds-msm8905-torch/ # Kernel driver for SY7807 torch LED, WCD codec init, and PON shutdown │ └── msm8905-cam/ # Kernel V4L2 driver for GC2395 2MP rear camera (/dev/video0) ├── overlay/rootfs/ # System configuration overlay applied over the target rootfs @@ -101,7 +101,7 @@ All components are pre-compiled in `prebuilt/` and `overlay/rootfs/`, and can be # Rebuild patched sxmo-st, sxmo-dmenu, sxmo-dwm, and all 14 C++ DWM plugins ./scripts/build-sxmo-x11.sh -# Rebuild standalone X11 games (snake, tetris) +# Rebuild standalone X11 games and emulators (snake, tetris, gambatte) ./scripts/build-games.sh # Rebuild multi-mode fcitx5-t9 input engine diff --git a/overlay/rootfs/home/user/Games/2048.gb b/overlay/rootfs/home/user/Games/2048.gb new file mode 100644 index 0000000000000000000000000000000000000000..e6d7d8745a6329839ff88c6b4b3e73fb5d08744a GIT binary patch literal 32768 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 literal 0 HcmV?d00001 diff --git a/overlay/rootfs/home/user/Games/blastah.gb b/overlay/rootfs/home/user/Games/blastah.gb new file mode 100644 index 0000000000000000000000000000000000000000..bf7d97a1101d3c531743de2bbf8b5caae4f01d49 GIT binary patch literal 65536 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 literal 0 HcmV?d00001 diff --git a/overlay/rootfs/home/user/Games/brickster.gbc b/overlay/rootfs/home/user/Games/brickster.gbc new file mode 100644 index 0000000000000000000000000000000000000000..42cbf0e092eff8816d735650e1956b7a6aaad4f2 GIT binary patch literal 32768 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 UDgr73Dgr73Dgr73mnZ`N4N{k?6aWAK literal 0 HcmV?d00001 diff --git a/overlay/rootfs/home/user/Games/geometrix.gbc b/overlay/rootfs/home/user/Games/geometrix.gbc new file mode 100644 index 0000000000000000000000000000000000000000..87b85c3b18cff9614e86ad98471c93e178811c4e GIT binary patch literal 32768 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

n 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 To5I_wkr#+lpISP$j=28|%{259 literal 0 HcmV?d00001 diff --git a/overlay/rootfs/usr/bin/gbemu b/overlay/rootfs/usr/bin/gbemu new file mode 120000 index 0000000..cdc10a9 --- /dev/null +++ b/overlay/rootfs/usr/bin/gbemu @@ -0,0 +1 @@ +gambatte \ No newline at end of file diff --git a/overlay/rootfs/usr/bin/lua b/overlay/rootfs/usr/bin/lua new file mode 120000 index 0000000..ce178e1 --- /dev/null +++ b/overlay/rootfs/usr/bin/lua @@ -0,0 +1 @@ +lua5.5 \ No newline at end of file diff --git a/overlay/rootfs/usr/bin/luac b/overlay/rootfs/usr/bin/luac new file mode 120000 index 0000000..4ab92c5 --- /dev/null +++ b/overlay/rootfs/usr/bin/luac @@ -0,0 +1 @@ +luac5.5 \ No newline at end of file diff --git a/overlay/rootfs/usr/bin/sxmo_modem.sh b/overlay/rootfs/usr/bin/sxmo_modem.sh index 9e506e7..fdfeb25 100755 --- a/overlay/rootfs/usr/bin/sxmo_modem.sh +++ b/overlay/rootfs/usr/bin/sxmo_modem.sh @@ -81,6 +81,11 @@ checkforfinishedcalls() { sxmo_notify_user.sh "Call with $CONTACT terminated" stderr "Finished call from $FINISHEDNUMBER" printf %b "$TIME\tcall_finished\t$FINISHEDNUMBER\n" >> "$SXMO_LOGDIR/modemlog.tsv" + elif [ -f "$XDG_RUNTIME_DIR/sxmo_calls/${FINISHEDCALLID}.blockedcall" ]; then + STATE=muted + mkdir -p "$SXMO_BLOCKDIR" + stderr "Blocked call finished from $FINISHEDNUMBER" + printf %b "$TIME\tcall_blocked\t$FINISHEDNUMBER\n" >> "$SXMO_BLOCKDIR/modemlog.tsv" elif [ -f "$XDG_RUNTIME_DIR/sxmo_calls/${FINISHEDCALLID}.mutedring" ]; then STATE=muted #this ring was muted up @@ -153,6 +158,8 @@ checkforincomingcalls() { TIME="$(date +%FT%H:%M:%S%z)" if sxmo_hook_block_call.sh "$INCOMINGNUMBER" 2>/dev/null; then stderr "BLOCKED call from number: $VOICECALLID" + mkdir -p "$SXMO_BLOCKDIR" + touch "$XDG_RUNTIME_DIR/sxmo_calls/${VOICECALLID}.blockedcall" sxmo_modemcall.sh mute "$VOICECALLID" printf %b "$TIME\tcall_ring\t$INCOMINGNUMBER\n" >> "$SXMO_BLOCKDIR/modemlog.tsv" else @@ -243,7 +250,7 @@ checkfornewtexts() { TIME="$(printf %s "$TEXTDATA" | jq -r .sms.properties.timestamp)" TIME="$(date +%FT%H:%M:%S%z -d "$TIME")" - if cut -f1 "$SXMO_BLOCKFILE" 2>/dev/null | grep -q "^$NUM$"; then + if sxmo_hook_block_call.sh "$NUM" 2>/dev/null; then mkdir -p "$SXMO_BLOCKDIR/$NUM" stderr "BLOCKED text from number: $NUM (TEXTID: $TEXTID)" sxmo_hook_smslog.sh "recv" "$NUM" "$NUM" "$TIME" "$TEXT" >> "$SXMO_BLOCKDIR/$NUM/sms.txt" diff --git a/overlay/rootfs/usr/lib/dwm/plugins/calllog.so b/overlay/rootfs/usr/lib/dwm/plugins/calllog.so index 025e74a4bc73a274a91b44283e5f2890172a4e0d..4a0afe63cd341ef258e10bddb4bb253e4af8493a 100755 GIT binary patch literal 103832 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�Z^XQ)GDvT<+0h}E48^?E>Ag?*nG~?VxQmZbeB&zm3rJjt4sY(kK0t{^;DYN z)h?IG=`*=Ke$#53%gJ$P&zUoCDfYy&3}30&;cye#N=qG8e$46KM_jUW9&QpLT2k$& zYv1Xlh2XpPogdR8r_bkrplfSCq-(VewAf?fSf&c6&+qZRPD{NGpU-4T%`FxnOa4iRR2M!fjiCE|1Tl zghk-4lBKGS$b4Frk{z1Ei5Hvs5G^LSqkB@*%~ zX>&vKd)%S)M!X#FHRPenR^{-jG4FXfooX~xEgeR||FyO|-B(?Lw##WG`=*o|7 zQ_5=<&e95QzsYY@KV_O}@}rHV&h$CoaHKr-Kq%hRHE=5lmrXq=+g61d;iga1OxWYi zd=^W(CBu?w$+BcyaxA$Pt0gbplAfNPk)D~Jm7blRlb)MyP0!1)WTaSNottgV&dagnq~~PhWaeb$Was4MA4xXnYmfH*||Bnxw+Qd zJgdc;Zq2Y}TC=R#)*NfD)oRVlgNk`bJ`bYv5G@ZR&XcLY!sp5CudHHzhGzR~mBm%A>T;*Mm}zNc&N2^&Re3$7=489M zw9@W!y7{#uu%@c4L_Rc_;#WK+J~P)m{t(WzH1=w3RgteSa-%LDVZ292!^XQ*%)wfG z1&0N=$Kz9NMzOED3TDrTuw<9Z9sz!{-LcxthK=zGPo+c6behWpf#wpY8wMC8uZG^o zL$qw=q9w(1mMmUAd(QI0g=`t{zN4H#DqJ|fc)=2w4doxpPQzPQ<}5dJUd*94FwO5< zt;s1`GM~$p!8u5j>@@mU}(b zcsvhq@o%i~qcBF*P;-6uj#1GIv2 zZr4hv#(t0gPtpK?;Rt_7JWb_J)9s(5BsP*imB{-0{As1tUZ2OSad3L~sWOt^0vmMI zbT84A36;eHht1CY6lC2WbtG<~$K&Vl5dV_Z4zJ7h`iOtF%Rdjj*8Tn^c38p?|3Y^a zdiMwXg`U!Cyl)|%f@(i3eyBds67SO_#Iwv{^J34_eQ`=kTn-*FJV@iw#68+_kIi?_ zUshh=b(U9vpvpzvR{MFVq50LaMV_>}ssOV~iJ8SY>d#1FL5{06+ z6_v;CTu)Vu#mm;`avh$;p-+bXT<6QHrtE^y$Tm zioFh)O;2g@NT;S)S@5u-Ev{4xZ1D@~*lEN9BV56Kew!D96}-w>`f7ERidU+GI)z>V z)kE|$r`zePQ0hPlvpapIHm}l`2Jd?yoX9?!3m9o%7wMr$I<7kiEB;#@)A=W)Y$HO2T8?g_^QM>-z zhvMj>LF^n&hm5##<50NR8AoTs!Eq_v-4{paBi2ht;%Iwh2GP~X6^L^@N+8bps8$GU zjuji?=wK|^dt$}a(R7E=ZKFlkXu3QaDBVbgKE@AOpGO-dP}(JNRHh>m=dD)8Xo=`p z3YX9BwTvGIfBOeH%>VR@V7H5ldU{I|`weuOqxVT-yMf--y^GY5ky-;a8aSPeoX#vg z#~YW}gz`BciIaLRnsz-MklUE20zC4W4yk?jcaMRuQGNwfzgTCcb1Zs565Y6sOj>-# zOo!#9vu3(0?+AmZ%_wTjbigRKKS6gQM4OqqBHwH`Q+Jf;Fw;Pk*l(uVXmQv~yGDy6 zW;!wYq=ev}N4lkRW~zI%LxyjEeEtP99ZJ~6p25dNvzay~C0$RW_9Rh@I7v*|@c4R; zxpln2`I&deF9zN>K|shMlNETw#7L;KYhoergOgTVG*idq#LH=Pda`JR(8&UnJCj+p zyHiA+nYJaT06&^6E}7|KvH(7qJOw-hDFZrq&Q2S@F^x{7Mg#9j6}u2Qm6>*!xwNo% zX-Y8gKG$9SXvr8WEYdX4QMCLdA*{W19GCal@gTn;S_NI#)k`> zT1jj+&{j#*=;@?RoYmv!vp60`>%tgs)FV=-UVyP%&xGrGX5VCBiv4S{&V{k8ePJxC zGmQ4?#Qrckt`oIkbXhQdCQN|m2EQ@&dS-0ZGvTP71LOaSvQA9mb|1%iG+B_EHGZp( zDyDbn(2(~@oif$yCc(2uhp_F;+Y-yX6S(YWij6X@5l3K1*lrw>+21WQf&Bji-UZ-o zot4aT6X!xuk=U%Gm&H|?HcLrRr&~I&)V_&jwmrgpPbb1IEEQ*EDiM2RYLa5l$#hn- z-jZRyB0F_-gEeZ^tK5#&kFT$afG>=B7yJ=F72CEUQ_(POaJ>-p*1 zBo%bX6g!uHlLT=ck~l5VdZj{?x}l4v5#A}xyFv^| z_!>5_ZIaj^(+)=4V7nw*$3?e?`FAVrB5j&z(@~?8)2c%ei<2@;zSyOscA4o%WyUw? zOb9*7tpvY$mAFcoO(+1RDCe$BC!{#^LXzl_xtI>gbeof*BIa$8IS-Vt#EWEn)Osl& zS~V*?DNJu0%XCu;BE2Fm$aFzkzEMYam|?w60PVy}1i}Q?dkphV$`WW4$RpYSstWj^ z6brmbj@>J(4Fq#w%>RA_^G8jBte1s9RJ_!#$ePAsGjkADkaX2ZF4KS!rX=yQ5k|gK z^cm@lUVv0Ebt$j^@POz6VhLXD&JwGn-b1>as}-)qQ!|G1B!qAyGH8LiFN}up_>iI z=Nu=2@|j+23TLJ2!fA&g;--eQphHi0l<@$J(jGnAg!60@#9$a5)YV9^CkHSp z3Zrv+4!*>CQIj8gr=uEOlEQX233+I5<#ruA1$E(LCFZd>O zkFvOkp`uQJvYBfEPd#{#&D8Q+e^!!yDe=@Y5^G4{$~>9?i!$Y0B3+clg+w|hL|;7B z>BVOWbU{D;9BXoZ9LwLDz%mafKyjQrg9;}SS-}mDF z`!pDX*JVn5ELZD540Q{!J%(!Zq9KO1=|y)m-O!IY9gP=a@tJ7aXj~2)uiw=eS|2Xn zilL@(u{DM|!o{U1w8c1tUJQ?@i=~bTmbNbY_w#EHy`Q=;A^r3VEoKrU;uE;3N?IMG2*sKH3wG(119LTvQ&!)m<9jRGROiny%G#` z0yb9$19t!|f3Nbn{7An}UvmS{G7Ozo2LsCiSFQ;L)&O?Bj{E{{|7I|-AF%FQNFQ+h zx1sAT@CG{_#3)tQ))rbc0z;As!7?=VW|4uNl0I<0c;U7fQH2+I5 zPyzpfreNSrz}EMIfrEgioxwmK;Ei3uz}(xxK*R1}U=QG)kHG&&_&dQ5n6+O`w+65i z{-U1-0~Z1N4kEvIP%fV!O~5rj3kIG6w4PG=?Z1Ow{}~Jney;jav_a@wWxO%uoxE*lqaGh{R;kw~2!VSVvf<%#U@o@j!>G5wZ&d*WgOImubxSztk zp$nH0pJxo%|A)Ilj}?iA0bhWbJUt+$S&8>0BtzaPK%N8vi8ekX5zm&SfC*Cy z#QVW`kCPD@0Him>vN%!eL2Dfqx7JJ)F0@fcfCV+M41Y1a#x<;B7#t{TDy> z87xhG?1=c#JuHKVZQx!T2)!GBRhSRE1%ZcQzs|yrb+Ijjn?GmHbW_S~R~7bGnbNb< zGSVzhX^>`H5W(iKl{iVlRRw5H5r)}DDO`>SiOU7c1^?R42wu{%=nRoJjaD9!%5+xL2<3bD^l3BhI&AGV5q%~Omp zY%^tk6{*5jg*5B}z<^6e+WGguRK=#XWPzvY}eUg$!a8Brn6&P&wT;o+#j$r0q68s7DIk` zvjXqEU_S0&*m3{Dy70q%+|T?S9P<^xaeu^)`zhw*eaa!eGTJpp_=dV4XeEcK);H#1!sRNTnrqSKaV%q{W-o)gmXTaZxwjh2_|SyD9+E}=Q?9P z?)%xLfG-rzkjv&ITu2^|SJ?SElJ+nkyI;YD_$VJ399D%!o{-$%g2HlHL_G7rC5>?1 wOaDA*ERWw4ejeoGFm}CgkW~esJXw&3>t{zE=HZ9oeQJ{fe8WnJ`Y*)yUy9%(wd%uvbD% zzsQAOqU4Nd_eI9+*zV467hQob^el{=t$=#|3g zw!_sA?r>a`l=c)x-$h=S7r9@;_;chPC&h=u)_TOVqV ze+dk(c%g9u@_C^Em6ZNE8vAzHk^xJc`ABlvyOiHUKJXbYTll!_kdKU4x1Hm-t-#9j z=ucoVkPNH=ZbPqxWY~l72;eG^0(=NW0WrWVU^c+g_X7pM4WI%z2;>9XfPKK3vmAFE zh$^){v3aE@@$+-AOn`nlneO+ARWL#U=g2L;rTifh z(1)iuF1{S3MvhyC@W@|a2Jv+W>wyD^Z-UGQwgKx-Vh}(k0^z617LS|HTg5>ada~@y zcn{uk{|R(l*M4yzcop9fRze8S`?7~-jV}x%5F^D%o?gX-d6kr*!4oC!M15*HBz!~TV7{BAV z7N7>W4wQd~F?9ohYrqBIBygl`;51K}WA(Qjmx_UO2=c~#47$3W9;a_f%=AMJw+hi8 zz)9db@DOMteO0IU+_Fom9vS})xfJcme@>o6f5EFrddzsG0cA1 z!R8X0a2JCF7;pej^=po+CR1Za`4)VI*XIwsGJs71tl#FiNa)4@!+@gw=y}M{y<~f= zBfpb;8@tN3YA?rK0hS+zEOU$N(26@{#Zw1UnF7zr## zk&NRC_yWO*4}fI(tr6xR2Lbo+@-rK9gdKrHh%ZH40M=~d)La@A+D}nupdXZMGCBfz z1-Jz`GXqGIBiw|_Z-rbAqyXm-A5e}FvlR~$h)4V&%Eh2^?zj*BB+?@s3RWXZduqPJz>#o2@j1F~Nk z$JGkL=+O~=R$436xLK;!D?90(2F^QN zHzc!Gs3JGt9m%|O$NTuhq% z8cyxa>GnajPg3Q9#OX$STr1>AnjDQ>#dL|E)CwCUU6#g5)TLzC3aceuDsu9=Q)qRf zq)8T8yzXJ9f9gm6obC@;h?3HlN@?m_S+zolq>L9$jNV);cuShu5^X&Sa*}jPNjDgk zw3c*}B;6?J1ZPw00wmo8=rodUq@=6;_eLj!2wnKchf_JoDWG0)<`uO< z#lrQ8;jUq0l*~i1T2h#}BN1 zzJ4mk3o1%O`j1G@F{isAJ==Hu3+d`(Af%WH{Xtj_0!GJ5W+Y7+RK$uY04u@F61r=J zxPO?*MY__Qu0eXpKhiUh?r%=7M!Le(7`5OkwZ=%-fMjnbT?NTnYO&nRNdTv7XiyO^ zw)Z$Vx{0PA2a@CUA-* zPNA7&56(U_XEivv5+}#Zk%5zK<}3s!RpO+m%_Ln5y53BR0x8kw#V7d)>GOti9zjLy zNr!ZQ@))CeV!ATq3A%o$X$BbI*-6#N8PYcuoOxOc@h#b~S(ZBJbgeJ~Z2bDL{<7_m z2e9#>J`S_?eR=m(ME13WV=A(dVtFl`cZ6;{UZ}2+pkn-bvyACVg^Fd&N4_Q}&O;%- z+kZbtmpcL0>y@d>=X40hQB8>H!Bl%IRBX5!=_cf<3`tl1F359F|INK*S5+$$D#-X0 zcXgrJ)CHKzm$L3OXPt+vIZg_dX`B~>lOb_7m^qQ)q?kE-z)6xg%gmera1zX%t>DBl zPB31pS!U8Okdz>q#>R&rg-C`1%^VwW{7K&r+|+i~th2W?^btGT|6>ch%AD>QCbg~! zrXCPR_4YtrGkR^*WW0dfT5qu*Ynpw~DD>9r3RNc!L|L~-v0NL)e)dxt>2>6}GK80U z+7pa(lHGD2VbyeWy8{M|zHAWUIMydEjgq()&nTG4rHI zoMba68=Pfk&I54N2@)yZOj-xhEHmj>kdzW9+{{S?C(z6}4UWIW@iud2gX3!EeAm@U zpLeq5aSi5dYl$saOY~ZSd)-Kbk)_L#^I+Y_-jjdBurAp27@9`*J_Zl49)V@zq=QpE z^2Od7g!F6X^i@c&_(!@7=_OM7%bj!)2t`sMh2}zZO&G{#Bhg(It#KT>oy_@YIG;?` zel%E}DCJ2o=lKzN;>>wmU^hzQD9xM_a6%k=$3tIm0wj*VnX?}ph1m}6tQDLjj=hg}mCaC8p6h5ZhWCdkyAb!JWyIMrs(C2*=FPNkVMADjw@-X1>+ zPI-{pVh`KMlz8<}F9E~X>(b0LaZSDSw@foD^-RU_c^PQX^!zgLCNOIq<7B3{$yEDy0V9+pTU%B$>zEJt>VOJ zr&}-0jI%(%kR=1xJE%iGP%EwL<$Kwb7vRMVbA%P+9h9a_M`mp!y4GC4w9Y4(f9+A7 zqbSJEfvw$kubI~F$wDXn1TB?&y*Q6wM}EEiIF)H0_e6SAps7bSBd~%=uQNzBX3{{A zZcC&pMiO87gWy~-b9#)J7e>5TP#)5Y&FQU3FO+N)m~CW(v(wCZ0FF9GB5gI3)`7Ia zO!^h16p52;<|Kl%%)WPBJ`GNS#ECa^W`i@!Z09>;M?Lngf$7TZx>{k1JzK$^(*x?B zPTGR(0dmutvWJYyIv!vYhrresY-1<(oJ)Zmof86$Wiz}@Yu34;W?<&;DaFG z3n#1}yuBv45s!g8>*2@1zyr2bKs->7verTFfXgxkQq6usfnsD1hGcPuM1bj)KnySom@8r4 z3t?t-KClpAc@_hau*Jel0o4m(7GEamrLbBgT}O*6fg6AZtxHQqi*Wo^hcN4jT;L4C zSAi~I*ao$Z=bMsABZUN2n~qzQ8PCHei+hzwia*zXJTY0U1XE-heMK ziFtCstq;+i=VSGl)<8Z4 z)GSa9+><10^&KDyEzo?2?kvO^2YMqLMz=|iBK19-qTun202U%GbsbJSA?E|jfVvM* z8Fcp*@U)QO$X5r+!UE6*bOY8K;NkbfbFc&S$TR@b3D^oFj*zZEF)|+kN`MNq{3^g& zwGV}|3S|L1fCE6zyQnx&gzya@4`5-I??)-`J&cVCn2AF1rG$GxwcE-&?JBDe9(wUBpr`HCddQ8fc(eY^ zkHl7G<9ellIlR0}t>p5?t0E;o6CRmnylRrT>17ixA8e%I8r}opu|Y*fx~Io-O#Mwb z9#c)dX+7H1n^-yDFj9Y1gmVij+NfmPakY_dhHs&tVxsE&dpq67rn%in!_X<)&l;%` z#|CQs6Lev=O{%hs4()NmR%LtROza3!r9x87gi@D`- zW>&wREU=Vdso4QQxS6&ev_LbBcE1gp_mp%cqmOVk4c@j+JZ-ea36(Qa`$p5z$)+re z)WL8HtygbSqNBw$t45O#lOm<*u^YkmZxI_EIzQIq8`Y9qV!&1mduSKaI%cG2;C0^i z``;cK&o;x28K@Js ze&IUxW%yOulhc(PF&Wx0nQhKC_^~|^BVlvmV%n}6X)=r@{ll2GWULLoZMbeXY|VPX zmQu8(lx(%Z!<%BZ6$4uVez9tF!epstk6TPNs}zmB2V?dwY+GtCnz4f!)5erltP;lL zE+&`KNJqe!Af0XKeS3T23^+~By_`YdJd!vyW{$cDq}yf^2huf(bj3`{1LvHX(*kF& zMB)^iIoaS8I`=-ln&&;#?~G+W94M{nbWg2s{-OB^FYb^GbRn7;s{iR|kh-{={&A6w zZx3xZ{p37$ea@y~c8Trzq+;Tw^BRl*6f?`&wA(e(?@<+HKQ;_+HDs!+OD$5*Vh9F` zn(Gaw?V4}zX~iVACs+8|wrkh3M;#@OhFI^GC=7<&<}A_M&dor#p0RDajWNJY>cj@! zio_v(9_qWP>hgv$ezc1Fd$8q975BwLaRLfZ4LE9`RxJUliD<-5azA^hdY0(BS67`l zjDpr#k_eR(Y>a7X7vp`T_{bKN^AJHW@b<2G&r@cvA| zD?E|;90pnlf78{6o!i;04H5fcU-Lwj$n-GM_OA4&tkE&(>n`b_0`7|FCK%`ziP5T5rOlyXi8gs%^p$R#-Mo*t zy1H)}Ug0Ee#3m(M%*L5lidTgZ0R}pIHaN>M z(hV9*adcTo^PuqhMhr#a9X1c@#nYKh;xsrOonGC94wcR*jC3q))Qn>1r`7MUaghez zCRE@mSe0hhFt945^NVw%6l(E!%s`KWblgm`0jWqNjZ?810;2%w`=m1*Bkh7ym^*>> zRmNIV`c9;0o70<+o+=fRBAt;KXcjoD&1Kxf(h$(8X1j!BOkeS%(v;i|W)O?d1U9eE z8fBVSmm{0fZ2BThPmxTAm`%?E$KTBP0h|$HU-^jxl}&=mCJyt-ZO%abai0*b8;3IG zqtdWjkP7VzW`znPS)u6afm8j$VTOSwApM#-{RGl0{*gWl=_Tg$Z;@Uk zl~HIeW0D%Ad^3rFlq->P%p`AcGR&Mza8e~sikagGPLkLn)}Z%{-Sol*bT`g+?$lv$ zd!;EW>oFBWZikF>VDEkxwt{MGU6BnV+>&kWjdU)|Pr(rnekDybjOD{vz-#DsJO+O$ z^EB+MMu>S85;G8aoy5FOlEx2t(~#Fj%HxAPaxo8QVyLMzG70vqKtXP*!a!t7M5ZQt zc9~?LceJK$TN#c%Yb0HzmK}|R>k6<4R@$3d)7fpLGhnU4-UAIfCt1^Cl0GhKj!T-q zpeYtLMRGiU*6M1g3Pe?bMEVaj`J!g0q`3-Bj;P6zG;IFQ7Bv}?<~TH|q9#?+9EK)Y z)U1{?2cTId9S|j|r4u3p4bkE`NvB9gnhVk_i4T(X-U#TZP>c)G4(M?-zSPC6F3R^j zpUJsDCp|e1>biz61^HyoFI2zl2h3wQBHE`4(L&62f$<%3_pUb0qTKUXfX>v z23EdpGRg{bgvad!I0L>YH~{$Z9eDppyMju~AQNEgjv6hjNJ7nlBM9$*3pGb~%OS6! zRo7SGavxGaK}MhpumJ`Eg($EC`Lw`eK#odepu$G*ncR*;v)c$yEbQrVL{CI6K~Eyi zdgT%FhM+w46#TG2AdrZ}agbWnGysx?ouC^AC;&%53!S|bwgRsP1zRC*Enxs8OSc2^ zP|!ZsT7)}LAts%XhlA|K<851k=ih|@OJD`rFoG1$KtWkRHn0=Dum|v8io(FJ0UiTY zz;)mTlPKsmWN+FdgzJGiKnv&q?8LY>DLe)CLRaAVha(V&g!zCb5zh;Sj9CT=6oJfe z0bspS0{IZ#SPaRK1ss7s1(KyP%m&h+3x}-2BZ677Vr=K#Re~o_7soB*E(j975i= zqS*?YlgZ99x@cV2l2`*(@9kMKlP#W!(jl)}DbR z)}W$^NHtLJp7~%3^w0&T!?!Q7btom2?)SZk~~t$)ueET?+yEOXWatuf~0 zuI?z&aFjW9XRFGb+T5)aQ>U3zvs)v~sSmru#MCfz>W8fnm{nPYtGXwNX_KThwLp_v zCn9k|EK9!B9W0)ttCeiSFkf!vH=L$V5CmMuk2a?jcKiLKty5aP z%@xY)?xs)97^vg(uqW6hTCpR9=k)e@?qY%(qjo6}59DG19>IHk0|P7%;Sz+$KpzMM z0RDhCa1O811;7#E4oo5fz#;Ari~)jyEkF*C2kZk1U~?br9RRWr-U1xJVCRF$^BwBJ z9Ss(H2kYc=`OQx1W>8@FpG-a@vAj2_CByk7(nEIJW{ZabvopPMo4bg7yVHvwM1I}r z&c95WcaGvO5r;3_htyz!wh7@p*zFfL(p_cSHZWG=iT(Ujkw6n#GfF)~$H^PdV_s_%yv~FnZ1W)C zUf-@XmVIiJtU#J;3$r1>sl>Y1Ezk?iY!kse>3}}$CVOYsiX>IXJJT+AyzRL=QmuDB z`ap0Up(4?FizY;Z%jsrf6LQ=!M6?|uYBoVrBxwRf4TUCO(u^ec^V}zBo7{15@|=2h zDzN=p9sIx5wtr?9Wm}YlV9wn)Rcy5*=NqQCJtELxGJcm2{|k9z*KmAUxpCL)ZmUJ# zp*X{0zrw>u6@aH8$E|RD6>Il?^7pQx?xD>V!-lD*-)EYxR+);if)Li>?2G9Z6Tkd7 zMvZ6NfuP=}5dXwLyA8?p0?mN^D>vav;}!{DJCURLuZ{k|m~nPe(u}sHo>$veyuT-s z(|wBm%EgYsf(STE<-9lFw7|DfLplw#jEvnqeaIA}1-_=bQe~0rgc5JJm`bi9|K9C` z@3Btp9zJJ7qaiB1jd!nTv*uIrl;WCLtzQyrJ>Z2}%cNQ-H*;gc=)j}R(Wai?+Q^<; zSf&;?TN|EY^F&7N@#^Dca7EaIyt-#Jf0AVGaUbm1$d0K5$~9W-bvnyJ@#MrFzqtL4 z=n2?R>kk|`AH~`lXcX{W$JrR$Hv2^O{#wE>5@?+^ysdd4%XgqTye+~#R)1?9t8)M} z$B@6LBMZ-|rildXb>ioe=)G=>j%y2JrWa+1gELKOdDs%vLt4%~9C9Z%PoY)Jq$P&! zvVWLl>FZ!J^qxSC;HmXtM~GOpn}!{b0(B&p_PVK4wf~Cw$!z~)(f%6Ae!SMHlv)3{ z=<-um>0)i=(-*7F8Yj>|lu~hDpovZApRN}z*ECy+CsKP)e<;RpH?#AoH>=p?;rr;~ z_fevysYPn#7#I%LvL4vqkfC~1$|}BETU5$UoP??sF@poR-0|o==De8-RA^0dxmNRZ zDa=i+XL%~MI7sajXsX!Q^FO>HHa6CfAXZ@~s_>|kRbT;fEHK?(qWUiEu?P)trp2~A z!j-`Go2GCuq5Is`S)XF7@o&Ha>n6fEIoO14#q|i*J8!IwiT}bH39zp-ySHJN0F(fE zfISxUxVfe|(+P85B(NH|8jm>>w(_y(vWM(~y&51Cab~+5u*MuKEWmc<+6vsIe1gdu z&?0;RIG%)E0*ow0*a`;6L0*OKAQt6oSfmdC`6zfka1Ocwh)+TKN5S7p`AM(TgEu-hk!~LJ3bSIVJD|U>yr?U0u&3ejfuq$5#egcTO@k_ z+XLBWj+|~mre@X9Vs|{A5OQ%p^&5nT6Rvx2^T;G_45wSQxt}|G@C6N-F6@g#_bm2d z!VQBWiA`32eKn-d6C($D;aN<&tY-}J04~!TtYq$$b z9x9%kU3nMwIO3^d$x&JXzXwUffxEndT>9n}nV=zdh5kX0HKnVLujCr}{t>F=Rdp@` zt%hcq^9bi}rYEoZi;5^9r7ACSk$=X6UegpZeFi56pAy*4i`4AHJ z?E?M?+5PRWE{Uy^lS=;Ptizve%H;gQb(Wbj5BnVfsgxEG^}*r%4)WE(&7-$<-GN`{ zdHRl!7|1TJoPY34YN%)H_fOAfxWcj4Rb|>Am+ z)(buK#AzI@6c};8_t6>dVhC=N*#$p)H@84K0pox@8F;?{d%!9R!yb38!VC;&AY=jF zH|W@nv>y3u0EHSCrtH@KLtr_e1TNrSy8}1|D6m7{56SMp#{m0qcX|$BcjX&^ebZqW zav`Jwaz6^}0p3!rK=V|Ll0{w%mD0bn$A|DqI=TDJuiyuUs!-4bXII~Uc zpQ_AQ!QR17u)M}kPFKb+sm5#_f`w@SZrjx0C=auqj5r-3F8vRTOY1u6By#zO8CE(C zO6ewcM;v8Mc=og=mHJz zC;TE*I(#C`2w)x3erzW1LL$m$$OYQbLvqS;2O1lARX6?feE-~^g`8zZkVYR5;?Iz` zj{kS?@^03r7LVRq;R5MdO6eP9!HM;Q6{4O}*KSi^Q#yn^IT0l9plz*W*hzoOy5|Bt zLt;-x*oI=Cs@5BR@WE^NF8T80DSjn+?Nk__LB2S(n_o&^F8^MA2Yy*0umi{jn5(@L z*a9R?!j>Cy93TgRC&Qmx3-=0`1&9tP+$`ffxbBeKfh1r#FbS{%THeD14HN?G6N06{ zET95gcBl8SjC3Qw4g!t=SwI{x1#kuSV2`c`cE+Pn$g9}DtAJv_4rqx*+A5Q0{CFjX zJ`f2M0L)vyHyfuRkVY&+zL47xw}FftkF^ZC4_9DKiANyk6*v))Qy}$Nb7CL^Am;*I zSZ^Kz3QSx}x=Q};3CmE8u9`cWci*Jct?Horu@`>nfo|2@P4J+J7X-HjywOcZZR{yOu~paEE=Qm|TG2aW?B%gD;Ju7kHU&YNlZ{euQB zC0!}oUk%$fWcS&!fx{ZDhB@9F^0$#w{>||n^i}f4Iro9ea+hd14$M2~g@yo>>`y*B z7v_KbbO$}uJZy<+^2xBV5_{OC9)og%ZS^q}YvyRK)D0*tG_B^(B{L7390~Za((S3g{k9=HdJ- zd<$opc;h>$b+hRsuh;PLRweFGJLq!KeBM1|U!z@V2c6Xzf7)^n?~dD#$v}Vn^@K;N z(j}>bYH=2r+aH*js@#BFBbzvM=R^FN#)V*qswQ4_MJRB1w2JfLbh(*B4t3Bp^7#d~ zK7*Q)-ZIkH$cYQDVJh!`(Q|ZhX9o=y|MVg*^S`SGm*&IxEf_E8C&O1^9duuVd{{=C zbv8GmgRUcsF1n4fZ)Dvv8($Tq_KOtv@Ui;)>lil;+={l?EGzd8svuuo9NPDg20k7t zc92}U=%9{A`oR0JiM%6xEmR8k6Y!!tXtGA8I`KWTYNcVnDJb7MW&>`JI%u&5)^W|# zL032ShO!zIs_+gOk54kA*?ydLfNz65m$7zg!aI1L^I&>5!lJZR!z}W8I;xLw>mtBO@8DR_m`EQDE0`e{BbiYp}?-c5kPJt*7CoWehbvW))_)F#VPzxZ#jA zq2z~(QC_~Heg*X5l3pQd5}^r{G)}}&;T0km^-AdFqP`uT8M8SV8a=+XUaxG&B*o^? z&p$znB#pL}%)jIvUW9A?bJo1aiSJnlFV~#K$Kzr8@kgH3d*eZ^)F=|at4~5`nIkz%H(R%7 zym~m&=FfMz6YUwpxwiK<`>5ho?eq}lS5B9-d9$j2qjleJ8?9y0s=oRBqz;;m9(g)nrwMdz$h@Q9Jc*F%6@3TG7mg!WfMgZayDP-=JJo zFV8>mLwH-yARp*+(Ev5Qj_$wazZwc8Pl8j(*}6fP;$G?4oYYSD zkwrhf$*(47e;P0AY9_j$LI-c}T=W!Q;|THC>Miel4PC*Jh^yoKTx-&-Y{zyw{c70I z<;~H8{3X-%M@VM>MmaxM#p4O=AirN7#mAA(t7B!|O=Qf^Qzp!9;@uUf>+B|(C}Wyr z{%Wc{%ycC!J@m=hU*K4^)6nKet9t0dvpQ~yyjR~nr zPu=Kh{Wot-O8dcqZilam`{YFSiA=*ynTki-@e-5QuT7X3*}7w9Uwq7bZz=Ej6TYH0 z(Dt5^y6xg#uo_c+#Z8v~Nb6gx*kOdzO3srbuR=47{Cw?gegYZ&i(8+%mcIGzw35vE z#Y>%Fm{ZS&&GPz9n2b{awp*+oi^@)hJjQf+JHP8GC^-p(qI0170C8Z!x$^94sTe8etZ{>W%#Zq%Uyp4R~t{umUAu z*9ug7VO2%CV>pi6_j$tIi@;hAoB<+H)5XwjTZp9!J#ak~nL#Xv0WC7kg>0FMO$B5= z_5|EdkJ(ndE-|XzM8E6)unGm^8&$}Yo{y8m(XR9 z)4#g&i^=_8{aj`>d6$_+(WXZ0QqI#Nne*^g4a5jKMcgX~4{m9GA7kS;fh%C+!xLj; zF_}?0mFLOFm9NSkYRSFIa7+a*zm1mBP7?E5D8Ge#`rDh>d^Y?R#vdR)H@x^P5_@Aj zhU=%lg_FxShRSLh$io{`ycT!ftxsO%T-pXH0jfZjs{UY#PyDJUnB%x}$%wsre<1 zPhY7`$%zOQm~7}t0TZ>v*c51n!Lq?C?h%PM!?kvy*&8fdKvIDI&V z#~k~ku+_essxB0XEIpPn@6!jxqPEJr>7)yVl3v$JVr~vo>v2!OR)Wtm_DTtN5Kphl zmts|jg;(WCv1_eSr>84P%!(vdP&Nv(ywFbjKF^iX%fWuN>fciA7-ErC|B_;d5L;8V zRf-iN_D0nfM=81w(Un!3rC1($esk!GZQ2c}x80I%`pfxrDP>b@KWF; zFn6bDQ^YowpgWJ9H|cCN$)YX=x*|y@)2tSCPS)LYzoeT_)VGFAj?uowN=xjfpNe`t zt!qsbxf_sQE$QyHCWyLZ=su8i_)FMZ4r&Ezqt-7zYAV}RJ13eCS+Bf=A=XXf&)d9) z8-a;%RN-zMhs=Y#rhsz`dG%Ge6L`bNNZ}~N3jtTa5lEej`4U(NTmf!iBb7W zFBkUo*dXqTaL0ID@Ilr=GTv>-D#(+NhkykI_{jq@piF~I29^T}06X!D0-TYy2kyx* z76$Gid=)qb_yf*B3XllQ0@jSfJtvuZ`{l6(;t`V)hv@D2T9>VHQB~ukWrq`2uy1Ox z9c-{WEyD-Hqi@=~^9ns3Nxr;2LA_7Rb@S%1nIk=hMe*+Of<*w^nd|AcR*Od^N$x5= zmA7z;yH6cw`l^ORv-I^!C#0WiefD%9bc0{e9cwk^&^AB8%e|q&Hj3Yos?^h!E&QHW zSM)sOE-IricLQuSgbOun8(e(W16#?bcY+3P2g|Y~;Cx2XZw)ff zcAPT&=gy*tO-+xItV{JYvRRSzHCpnxNufHgu?yGJCl`}v*qxB8B35KTFSLHWq5yJr zlVYVFe_Y+mx%H)_K80p!b?vG`l~|I~Q7kJFYv)ziG@x=2%NXTfo0 zxbd=S*KmwDJQ&4aCsQBXhmD~RC*Zti&ckncD?%TRc6V&T-WGc>naWc&2j@t7THlDj z?!RffcW|i_VgtzZ+JE7{rrfOcawu*b;mmnvDLqsinWLI1j+hOk|D!ql81lv=H}x~B zZymhf5@SgZr(m+!Rc}?HD>N_d_EpKD-Kv=t%{pp5#_}y~ZwGA`TZv1cB>ThVVh8E8 z8KU*j2G;&{nsRtKAytuZSVB}i^oT*O+FF{KG)`5H=XVBYj|*784Z=`dtYIDZjCQxO zjB?WduUDtVi&feAv~xw=h|??XC9zC-8pU22>9?0B127oMlkQ?L^xdncjtzGkWESgJ zR0%l>d8dWP;8i;?WYfskf4NNzYzzo9b@4-g97tkA#dd)n*o5Vm2Ar@}Z7z|kZ& zp|MZ}l=8VgDmLts2>r{=wqDEUTS$ZZBjWyeY*L8EGj(z)tLHtfTxl=xQzrRYRr#p; zVNyBQz^0aNjgLwJd9s1SZ>UE9l)IRS9VUC}7ecc4ojb9)L{Ag($*>(Bm<3)WK39e{ z{uwse{NDDb9^Pda9-ox)TgpCoa&bWL%OAYI?&YN`*1Y`Al6RLbNnyt;oY(t`8B5-M zTM_x*dWAPaq8`oqAEj)ZUNus^5jrnGXT@`ceR!@5@(QFi@Ca}MIBTBshEza?K!!sq zArm0uAX6a|Aa_D0L6$(KKvqI#LpDL~gv6g-bF+YXl1%8!zb-14L9tp&U=j&pg;-@+ zMOYUKGBY&t#Y={ljLZxH*?7r(jf@;q zL^ConR8kNvRJ>$lWaNuxMv6kFcsN|6BeTx|;rGlwoBgf-=ile^ux8eJX3b^Ko|!fK znDnDo`ca#qvrXtJkc5vS&pU5<&OPh%J2pRU_#&mTpy%3S4X=lsDRdDkdOrXAAA|%E zLi&&%^mV-1vwPjhwe9_mPPFjSwHjZil>Y1tBOVmoE~Kr_&sV2p`iW zjzh$cZW9ur*dD{FC(6RT%>4w;3s82nk{<$J!;#;jEaEC_Lt`5yWG~goFcL7YHea z><{S&3u%+-`P?+HU@EiuFfspHv z<-mHNxsebT$Ubz!h`E}FXA5_Z7$@{AK1)bG@HOD~6WRbdkN!IHxG=eJbMU9a)V<#j z;#5S4R7c1lq>q%s4e|j<=K)?n5;6{QGB6zo_?i$S;DWUDb>ZUC3xsZV$hV#;JU7Nm zuw8Hl6&3z5_I-`*@*5bF!Z*j?wGkH3=O(!cF@-B9HFXm-bm8=2qSrA(s;dbpJxWLs zWJ?wDxyS>%mGmK`*CTxnG7CrtqL9yloDEC{f`CCl0N?_21595M@&LFATmeo2M}R%R z79inE%&F~2qyZa%wZMwP-p_h#`e%HBCx(f%6!Q9A%-V;Yo#i<+YR0jCJ97wG1gr(N z0DFOBw1@s1A)@eGeJ7?7{Wj8Dc%43q{8;d!$x&kjyTX%EGqkn=pJV1y^PG|W(l4V6 zzaa-){R~eP$e>f^4hx9+6jS3@yfQ!u()Vu>VmU-e4R9NX1B^gx7Tq8gIC?$$8YU~! z(ZH(0X)kmN(}FVb*a1Ia1Yp^R`44a@0j+=ua6LjuJtbrg()Oho;k|H){0O@FMe4W> zxyx|w`U55q^<40Hisd784w`e2LEx35%IiQ0a0l8#XZP6O);H^=o7TvOl2U?Mx`5+T9BUc89a zdkDF>r|{U4Ls~Hc_F!PeMMBEnC8S~}`T}_cavkI`NIhf*ibjj<(BB!U}k)+}|h;UX&NR{+(`0(21 zxnH$TekDm)B~?zb`RJDzxA>o>u~X(Y6C0bvXA7#NQg>VZMqL}bT}%AJn+I&Jl8Wh# z*9QtYwC;5`A)R(#`@Dbnl$ot>^|{>gmL^&EofPb+@%m08L#w19cfn($u7iE^w4K?Q zt0WJ)d98Q1^=Va7`$2kaZ48{)yfLeH>}29oCB^1Fb23@iomNTn>3`mMS$yzbxBV`9 zTiV8!*V`T-enPWD+Fc2IS%A>&zNPzqC%x_NHnyOiTZApPnLK@$Z#aHMy4G6kQ@p3eB15^=w6xAhU$# zOPhld-w7hkKf=RU#kN$jiG^FLBp*c?BfEHJYn9}zXyz!iMW{%t=yZzC1f9v%+LMWj zPK$;=RCK|L&IP(#if*W)yZr83LDQOj-(4*xt`D5n?D_8TL;~p!YQC%BQ6=Rq+Nj%v zXByF7CFQJYW4k-6r0j`vO=)jdNe2T$a+5L8sX7b0*;FNExQ65sFFtz$!P*fJsOP+p z+$7kqz@Dhu-C$1$81oOicnX9#mCzG}7!WW!R&ggux{zF6O*U8&Dog69k|zJlO$O}2 zs@(v)&%f+xu)C=C3fLX2oe?EFr8gF~79^sQu7YHmVC`|UzqQ8}77LDHU`VbY_xCh7 zl?taqXQ%JcgX(&k9s-skJ_9&bTmE#P~4wbV8 zoD_wVsB$#mB&eK4;4D`-aiU6UZp6^5qzI5^`~UMvR>K}Xka&gU@+TeI@!kW><_XEV z&_@{hfz}mZOj{chQPQVJA~^GnHu77NvQ?AV=WLba1UCNq^D%X7)dutVA)ba?(nIh} zMCM>)IF=&G&YIiXNc^TXJL82igofnduOBa%tn<+Gf|)2+;X=GT!v>7n zut|6U$(w%iI94|Jqf;2Impt@sY%J=!JdBsxB#(2T-omb-O#T2t8EJ1YauvTh+^;AP zZ4pSBDycU}8N;lz$NIQ(VNX--0_=&3ll5xj_JR{XpzDz~VdaTaII${c8#vJ_=N>p> zghJA(q;(*Ls-&Ml3RXBlDklyc50!Hk92bS-ta9dnW2bVyY;R*v+xYgl3~RP&oONuQ z#i7>0t&-{&SlBoeG4v;1eE9f#@&O!ID%1*vX<=Sqm4RjDB!g2j^q-^E2lmsdeKqWP z|FUafKd9J8wy~E%*rQaEp;ppdkBO{0iEO{z6iqPf^!ay&2(k3dclwI6l`;`(nJXwW zSuNuRzhf0nu*%5?$ESbSeCPqrAcf<``RL%l$^7?g+_(^bbLPVP^evrxc?PR_Z zrmt`DtR&qpF|P6Va5P#JJ{O0hY0ZPTIO5=R!O;9+Fy4iwO~h}`J*=kvHexAT6XJoL zYK<@Xh&S81#(1HkShX?9ZL@Jci4IBDb+Y7hSW<2II(Mi^UKpL4UsqPfP!KR>Y445w zM4z`son4Lg0AKP3`EtjE@@kwzl61)^Y^=l3sueuj_6X}QL32)`qIPG#cel^C?%k85 zHufHR+U)bsb^IF2S38f^Ti0=K*ek|bNBx!$b~)vB2B}mf^#NaainZV~r?2NNe4Nyy~pSzj&O= z92A|4qMNm~GlD+QL1d<467l?k?_KO&bxPa;}CbT)A_qJ$(w2$07RPuZVBq>soUOT?dD8xhkWx^n`- z0kQ-6<@pG#5W|=dTHM}(@O~>UHxPOZMVbd*(TH8fB6i6H7K1krPI)kQ7`O^l0EbXn z3uF|06hm@c1cFfZYb7soWwl}`fxHHk0XG%g`bU~Oy$##}c$xda6$DB={Q$W7k2KFe zRP_H$Z$XE*0o#FW5fR?#L=4G#LJlH;;v*3OtV22#I1SuR#)SoB9IzY60YWz+E(Rj< zFe2|@IFWvkf-4!wZooy1WLJ6v^eI3Ra33R44Lkr^z>_w?+0G3J`A}dDuoj31Vt`m+ zz5@R2xNaU04a^4SD6(=L9u?9$ARPGrOHYP=x?*1e$?M1j;za!66)oi%fE$-9c`gTG zbhwSDc_VlO^MF%8K9GpfI-%&C-o*1qIvY3$98%;S$h`oU8NhBu@=lAp@Wi`S1+beAwk|&LPjP%cjjhOKFz}3ZQP_@%+G(nF zg?1RxwJtOwywwiwS{d{xBTcb#OvAf4mEhF7dnqgZSZOQPx#~?KwxX(Y)(~4X4a@Cd z4VQ2lnUbulSWW!GG^X!pq39_d!bL!s>Ey8ri6GVvGaWnjyF`Nd$?~=B+I*xatb!sgWTk`@+KuRTBlMbn4a&gM_yn_Bd6-q5addNSz17*tHk@0X__~N9V{&;^Dw;;-Vu;-N&gS!hFcinOO&fI**6NaWQAhTU(N9<6 zNef$G7^9ykA8z?_D~z+S*#^N2=}{rM7Ivi5c0|n$1jv)EBUK$_9VwhJVl6Bb4XGFu zlDkRAkKLk$eTW#MOre%4R15O~tr#>;van6yoDTZu_Ua6K4(vQou&~!*KdAV~RDEc` zNmqTm49>QH_%O4UrYccdKghbWTi7fNO4fM`i^lbUXsW>w#yTYG+L>>s3yvgNb+h;p zL#br8Qi++BBj^hsWPSP;=HK}lp8i;c6|Ax@g5{^O`giiZaM0vrowyeXmqFHf*}L7s zUO_7zP_2cHuCrc#q;9cE?2E8YTAixH-=5s&Q)i7r)+@G$I8R`}U*^xfI*<>0S6pFc zJSH!9vu;lo_In3T9D(W~Sk&REg_z}-{Ip8?0i?W1)~A;nXx-(^a!h_u<(vU$k6hIl zJr8lrY<3gz^wXQ!I2_)>o4-R~lsG9_N2t|L!X)_+7swAaoP*%lP4E)=rinQKXR-fs zHdJxuBs<#=XW{>F7AiX%t2lFlvmiLL`dSHJKC-V#O2dfa%ZNxfy!j3IvUB6-O6?>M z5hp$^+*ps6yk$lNd?r_GP-tP#!dbm?A7cpU8i@*UDpk%XaBeA_a+PxxoD!8Y1e{`p zQ>1cEH;Nc&mE;IgjzY>-Nr&NRk89WSYkS(sqR!c7S`hYI@8?7lIYDX!`Q&3}N$BHL z)5DV?c^%AjiBH^cV+T8O0jq+mb(U4*)HPeFB|=ngWy~xA)r7lR&#M+zipX)SJ)deV zwVU;J1vZK2F$Mi(jiJ_h3=2?B)y@<7soFWf@riLGf7TK5Y=~%#z+5=dutg4+Gtw}s zXB}H^VZ56swBdx^jYh*RtfPNz8zTBN2J0uFt)~oWpg+3NCre{Wn11RBnOk+E+kPGq ztdZmHit;nZQN=o2I!*6_;3XX<$rlw9Vv8Roa_ocBiSk zn!eSfmD2?J>tYkX5YY|PW^Tj`aBi|INRvofD2nfG)E;n?1AW^q+5>Y<4!A(@@ONyz zMF_>4Grmf4nZV-(Gb=%?=;Y7u+#KEvl}F%Q!vwv|^s+GLr^%0bf8#OA^~xoK!Oyxb znwfY6g{xhgxZ33{qJ9capc0_Y0^TKFWsiyU()M_`FEc zVHHS410I4_tkR}{c3Qcr$XBi^%%gYqK3?u}O~$p$G_t;F1BVRLaGLYfn>azzYF(vjWVAzs(ETaFSb|0>arU^GGX zI3M=qO0{un(~KfWF(6snKOLn1@0E?2Re%$&T(wwOa9alxFX6%qjnQWEYd+q*t98wo zupa&S8Omb;za4nWJS7}Y;L%yRS>pHgW|j|c+WuXut=I#Ec3=K=MS9UXC;0)%%npH8 z->-|-ij})sxpJxW?OHt2!MWA1YwdUlPANQbFV?D3U@unfw_wlzmwioLl_=$?gc1-k zl}h%gl`Mjjbd_@ooHT`#qH-d@S+8=k!HHKm%T>-eaAMUC?Xq;RdlzvTF&h^%w;y75 z`zGniYOoYT?t%>O$KU;SmWESND2m~)EkCYX*qd-4jO!W9azzslXWzh?hf-z*%DBj7 zTolGjDB~oTaZogKQ09}1RiZ>*+@$*x&yL^h@CqYP*n~R_{MA}3oPfgh&b&f{q6tP} z5fxTC^N&MjW-?k2YCEp`!G89cCG&^L?4n^|_nlxFHqG$Hd+Z{7oV8mlmZh$Q8Bsk#;XR^xCffEd0)~)Ija|f%x5RzwR ztqmP)Vlf_zG7@_`@IWxiQy`Q|--AOtd6>0|CKbhhzJQmj;VEu>ev!&Ucyx4jOFQ%I zw9F!&78>?JKT&J^1m`&tIMwvcS7x>xcRs16Q(s|a2ySPS%;eG`M1XsMV?gS9{7M4Y z0_;Y3n+XK0!7agRTybRMCIJ!VScJ84JhTOFA)34c7=SB42{0Lv>19Ye*r5|iDKgiA zav&GRV?Z8o6=7`5Duk-2WZPPNXofBaSd4Tm#I< zKpFrO8u|covZ7mxeC`@tXIzD{1h@k9hcXs8h4g8F%d2pF2r>)E0ZP$Jp3Vm1UbQ;q zl{p}8eg<#?JW$C{py)Mp4z_b>^kv9-@KuIReI1V0T z1m2L1sHhoe0W^RekcA5CQLq}Q0IqE3L+r$pqmJpjiKc>4hJ9s`VKU77oKxBOv)taj7Xb+X21fp0{mxc?U0*Q8gieLHos^;y+=tZABR)pmx-)-ct2uxT3BQQqLzj)}5uqH5dKGy%5p za}h_I+2f9J@@=@NDDR5}Jmqwrd@M|LW_~CO@@7 z#T^~2=Xu0YPiH*Bv9KGzE_li;7sw?)Oxh8E4-hM27AE1nzKO}S6zLSCEdYVB9Z~{J zzz)1hJAnsCU%?_$!WR-i0xW}sRO z4|e9$^?e5!Z4UHp)@rpk+Ss#Z4<5eJyL7HFhX(E$BJ85G_Uv~&Cf@$ zdwhjZI^bhZ;YB*(<6**My5wWe0UDgf972f~|7t~sdg>ip28LVM8+8B2qx#*)o?JGb zcsaHV3b)#EI-yk`k6&4jcxu}K$0yt3_+h|;pR<$~Xyg(9K38H}n$ilqkmKKjC6?3_ zfq*l106#cL>`J3k!Cd|mp#%@urZ;jQ621o`GVPGq!v=nU-~n{7`~~_P75Bb5J|0@q zJPSvS)BQtbFN&}1r_*>u=G&mK+u22M*Fatdjh?eYVC`Su4K+$^8+|A9m0=69$2*5~jc?2&GxM<|)JW_I z{FmIoAxz7^w5QOv%ol|N^!feny_UnW^@a_8l{BTz%zmev_Rkow)MA6*F_o0tWVpby zrO{eLEB$@Hzj(jSCX0{S*|b8JgbV(gX z1|CJz;S(3|rK^oCvPkS=<9WHw{GGM7+P*HlrJ*-3SK1KXGRE=4#gJ5VXP`GaT|9 z4o_3dc~!QUxI6z<6}M-is;PG*<{>vZ>;#pY%*?wXC0w}3w?nk=!2z!xGQJ=6y;{q= zaxHt5T2hTJ1-y=TbH97cyL8i7_V}Nj;*U#Wi%`eqyAs=8f8p^)*}n!4n%_qqIJ-g4 zTj+-ehxCp$@G_xIT5<7%`ilz%+ zy&|{&ZF8*b?;P#@iQ9m|Xr;AmH?Vfyu%=__v!8g1*Z+(C>jUfey`4x`q~oWDkPEPH znXp&oy^sA1SPn!1BY^guSo45toRQ|wv#xy)|AT!J>sTmoEe87?d@P4O4l)Ap1MHFK zzO}$DoF>{A;;6A_B@R>X;cNqZjWj=Eq+!v`gOd?R--P21klusMb}eua6)ysI zKz9d?wS#>eP!8L%=TQNW0n{MR;Sh_J9eEdkmrnv3=Z!((XdIe>ayToRh01W;D2Br| zNY4i9u`<`s#W57=O32&v<3q3ZPQgn|nip<1tR9%>iRZAG_WYCuhGKkiDZ6!OJQ+cn zS8uiVT((vp7-FvnP9=z|q+adb&P)vJgcJvfV=F z7>Han6xa8U%X?;d%afZs3s)=w@=pw_u)^GO4VKr;bSiu{pzp+5!O!M~b7uB*^7o*3 z`DCo5fu9ZOE-^cUnf*@^66-J&tX}Tw0fQKCU;h zymZnFIqt$?dN(IT^Gp-%^F^Ytn7;qTLg5yD^ubB_jKkU1gp*Eo1ISz9uxG8mC^%W9u@A=8M*H`9(`(NKbt$5%Xx`?T=-*dn8s~y zz4L)Iy(Tcs^!ryflY~IA_0EY-R(F!czwurHP5~K!Jun^U!1vzzB{;)E-UN~W1HK8{L9T)< z1+r%#ID=daxdzgR3M1gt8E8kEf5r_09^hN!U?3G(m59?n-~)K>#Gg1ILQ!;s?1S@e z3J?xd(9L`SLTGRm6 zEU*m609T7{qwbD0mN3=_Z_J4ed@h^_v%PG_&PGR`94>68ubljkaE@L$`Kl01z4QGY zM&e2GQV{__C zq*zU=|QNZ0um}xIQd6wDE z)d|5i&Ew2(#r`Oj^?Og68H~}P(+Xz^)943=$;>S$6DL`NOCEq`0`mYr;OcxVu#k5U^_&Jy0o#Fjz(l|WXhsxN z0-OLc0S93D8`uG&kZ=MzaJ;?_90Yg}84uLpm>don7lRcY={~@29HS+G-wB+Xi^i@- z!?B%=fV2a4Azcq}-H|z1%pvsv4`df0&o40aWAO4pURgO3XL4*aG0)+Q4rvD&4%r_v z1>4CXAOZ*gJg{QDN1s2}w^s=cqrL7muO4-Bg1(hC(znjN;+#@{TPnqMPO8cAnDbG= zqm}v8(}(9GgfVpZ`FEx*!j^Iw!G3>80!&AGVU*yp5WgR5KJ#JzFEK0iZt;$kpPgG- zUfujzwny*PlJ&_t&7q3bt!y-XbiS~+uCCkQ{&xoaWg)u1h|tP5(xb(my;l{vMQZWw zxRpJu4Mv0J(YwWAL3hr!vhs#iSS|RHREcfv98eO6kwm9AK*k1RBp`>zQT>Iu)egq+ zLYw^_aA0S2D%8p;jnRO^z0V;2IkJ_t*XASVqU21qiO4xAxyD-l-ASwDYUFybW_&A?aJ83hufZ>?TG^Fa?clT) zyKTg$m1WW|FS!q!SjUHAJ-)jq+E15H*K+o*(`AS(cw^IX@Nr-gi+4tUduYdJoStIJma5y@)E#9ObnH8Tj8Uw8t(g1>bsF z*-Zm#!-tkuw!5w?m0Rnf4{y~77{*BMpASfMtv18M8MJeT@K!+}UfjTE-&(rw@{ngc zYR4X3>%}LC@mDQOUCW`FS2F2VR6lnf>1qfSlJyq^2&2U3EgzX zZNNdJ&EOui;x1y@XuNrLkS{)AMfBvAAwm}YAO4oprYi&8kHPchmJ6E+ehQGLyZN}4 z-LJKY*9Pt@m)HU7``xox*jIk{4qsTmTaADJ^jt~E$W#Lv8D^Su5}%s4^3>d8_1aQzb&N()N*`A0WeXT%d$)4-qoe1k8(B392x(XFo0 zW}f*fyrr{`KlESIrjmieINIa;34tz6{Oe(u>C+Pv5Z^sv!AO(l^t4Dh z7eHVCet;wYq&44`$iFA_ryqUaPq;$A{Qf_}Zrc6o7>!pWoqTm_-_va`Ken*8felFlgB643!WZm+xmKqEEDQAK_W9A=epaCo$S&19}%!TVapq;S9h{S=YNoM zi)q6ToXG?`wa`y~^cA<5pRegzXV+sz%{9awC4juPj>7KckF5_f zBLv&tIBcWial{*oEe^-L(YVQ63K;_&Mi|ko!48M?dZf9{0l1EJdJAw62#Cej3%LO3 z2!u~Pc0$N#5&JJsqy}JH!@@lnvSvDtZIJzeMW{R!6+4Aufd?jI|F%p)MN_foJd5j4 zAbTa5J0rMaqVh^7RyAJ3NT^8~S0K-eLLu!F^q#pun zfUAJk20zw={9$Qlr~ONWhW#|nKfU4jY8&0>ShPyzJEteCe_b4o;+Mzsbzp~9TVto! z`bumDJ^GWIZ-*R`jo&hJMtBRs?NK_uIrrXuQ(9xo-?4>~A9=zuXzfpKcz12fJcVs^ zSXtn-b@hIQ*145aXIDVHZ4!u=pT0Nd)jc!+DZp*1!uJKE#{N%v{x~?RR|$4wfO;!-P`$ z_H|z&mmau2Mi>FxLXE~q1O7MJcU#+UH3_R-yfkgy+3yR{)Vjjeq|T;iHo8AZ{x0`~ zJ)rOZ?^#hYWS)N#$uHqBS&{x*N!J_v3jR{kH3qx0GiUUxXjJm|u?~x-OUGx<5LU)hUS7QYg%MQhRX%_6vHV) zM!{Vroo9$E_+3dKF$5RE;DE^(b~=J~Icg1AP!;W=lrA^7acD8Z9gQrWMAy>Rg>#XbU-H(?tpvc33(jeMG+*zbe=Liq|SiUg@eQ{dS!G64utgv&Mf(te(=|k`n zeZ$JlGOm~VosY+HN-00ukRa>ULzfGk$esEb*2qd1yAF0pA*LAPBVGJLFS+33bZJ}% z+pXvmjLUcfp!u(&u{XrYrBmQiRCL4;E9(-Vdt26-SZh;^tV@J$^@Ro228&FO7K^6E zC#`LsZhSsc2;Hdr7IV0R#axJa5lhentf7!;kPi^UlzAXzfb0XfVChLx(tBROq7B3Y zOM#Mk_yz`f1kwr86*9^l>nGOVwLlUe^2{pWU^G^Hpc~R1WAVKS;5$PNa34qk5&(N} zCPG%YVhu!GGaKn~kga2^>)<@3YZrBPRv;gb^cBcCkol0Dmkl`xatq{!F=P>0gTzvx z3_%YMcqRj*0Y6|c;0&yQtp>4h!C6QDdu!yVtMUbu z4j1N6Sb~9Xz7gePA~nb3R`OrP;9ObjbXJ3(@eaS?>?wGd*lb#RYdnq`p1%$h^P6m{ z^W#1BCKk|0JbruJe^!8gKxB+$6TDI95^rJ;n*M&=8@j&#&{Z^9OE@(?!eVi_)-giZ zov1Uhj7A~rg_WK6$)$`4Y#;#NlJ{V+1CZuhEiMb>LEZy-6PQcS{(5OZ5mL=(-p#kw z_tM)?AGEPQ+LK5>yzT2*-4wTkc)RLH;V6NYH)Ssoyok4;{~5OfyuT;tueU>bp9ae| zKlnmg{Li%-?eRsXbDihmTZ)KU7M8Ekh%q^`&C$=D#9o>r8AGK2@!y zy(|0&9&XsIPbkn%wbd_>v?Kj-gcQa)gqYY0`a;DLVLCliF=WX33zd??NWZJhep4cYO;vm0~?;U;#2zWV!1p4pB43NDzPf&=5o zhzI4%;>W~QJvOloP5i_lk1f6T`$xiZ`o^6BZV&5!t<~79TsgNn+M!%Z_i$*l@#?#J zH+rO}pWRu8k1e)$-_rDHq)B%J#P$YZYRip#wLRDC^)KpAJ}$!P{@M-V^CjFLGTxR* zMw&hn13tJea1}nJW9>YYh5<1;?$_c6+a?xV_so6)zl=4pq=sJm`L9UPtOnxcsdqwZ zGzQwlJQ{1``y9`W_d`JJBJE`%I6^r@Y8p)pmwc(N5SU!D19!T z!(tqjV{cfWou<$}w!Q6(RRfuBkCMGU^e6P00DDMK>k6fU?Lf@(k5lr-GWtcFQ z)>e)Zu2Q#qzMe70B6O&@Ay^qN7lhdyStBtQacD}VOYRL5n(2S<-NpOx>izM!ruyXm z7eWwywraTNhZ7mZ#W+4Tfl1_OFyc5U${)&t9|?3tn+at z-dl8DdP1Mq&yr{BVfs?_^TK?3wAy{4iMbm39?s?p{GTP_t$~*Bz80BJm>5l;eCfELkS+j8^pD|i>#$?lmKiros zs!PF1lh3nbLDs`!Jr0)qFqv5pe8y3~HD9aO$}7qdgN;78K*;dd^Y>_%Q8?fd=c2d4 z8<{Y3WdS*}H9sxBr@lwLKrx1OLZ*%K7JWire=tg1Z17H;RKQzH>a;p%Ntiq_uv@vm z-X3e!gIc~~`PBOBJs>M<3H~lOm>!c$c{ow?wjF`wYYVT%gnvkDqj$p7vB4WFWN2_a z`5QrnaNx<~#$n*_|8PMub#t0gaEQ1RIX!AHDIECc=NjQy;e|(+o+&(S(hc3$+*3#s zH=(b-KteZx_;eRY3ZxEl2V@*%CS)39E@U=j5#(ja639x(a!3iX64KdDAO^@_NE762 zNG)t@Ae|x8Afd#^zzS@4B1NU-PthUyYkEPT2U3`yipt#+KXW?{oAJ#@m`uMd&w?9s<>9ii-E$ p_Ywx%CO*O*v`_FByzO@&$??#4-w1D**5LodwC0=Vy@fA@{|CjSeXIZg diff --git a/overlay/rootfs/usr/lib/dwm/plugins/files.so b/overlay/rootfs/usr/lib/dwm/plugins/files.so index 50e881396fa646059a8f9407fdf8501bbc5d8772..7cf957f1cb8901d6c4d4f4031855ad1148b575a1 100755 GIT binary patch delta 40092 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 M*||F((WCT#0p5H^djJ3c delta 39998 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 N?%MMYKA?^C{{VY$EGYm0 diff --git a/overlay/rootfs/usr/lib/dwm/plugins/sms.so b/overlay/rootfs/usr/lib/dwm/plugins/sms.so index 32916dcfbca8a67b3f663e2493f30a17ad627d3f..853edae9b53074b996905152caf4001c0ba42720 100755 GIT binary patch literal 144772 zcmeFa33wD$);E5uJ4Zh)zII z#=$Wppdmp;Kn;r;6h=@GM$thB_!5mXE+7%mq_c;uTC)9rr@A_+G~g)nzR&-i=li0! z `roO{o5&pr26@rSTEJjZd&_NQik%yt!on{xtGj5#pJAm+oI@ywff(ete1cc_>x zZBsKw$pQH(*~;7M6h^BUB}cm9VSTQfpklh|*7UU#V^@&yzw{g}vh@>HZ2djfk$XeT%X30-2d=RU|P!bW~E zAg<=KKW#SrTgX8CgOJ+W+a+`=2 z3s`}lX19ZCJ!8>qP|`7vP;RQHHf!COe$061d$@9IJfeNZ-{HEz!ykgBK;HTYb5&n2I)HqW9$sz_cBi49MTW+^##D6km``k zNcBjKNKHue*NoJP)P{5wNkpPQixsfzfbBBgAwvRP^n)Q$Bia5Ofjc2-kX(>lk=&8` zBY7YVLK=)j@m&H2CoaQTzJ1-BGUVpZ&*)z2#d6 z&AP6QuKxUiEgO8!r0gC$es=8l6Cc#gSvUXw)s_c`Ja2rssh>}M7n?9`yTcQI`;eP_ zL$CC&8D8|_IQ@~6)qhI=+~xig z!)N6Eux|LKs{C=LkdJ;!;;vQIx-ZzWVRY^C@3!+N#|n?0TKIp`A8tzZe)sy-ISKu~ zxln(4`78}fWc*VeTpLWdp{qbjO8xy~L{=gpx z3=NHKJ6n}s^V*uX)As#oczu_kt!UPsf5&OxhSyonx;fs@RNT4!#iNJvo=P46mwD{+ zfdgf$SG{4%@s2pVXII$4;MX?}{Wk0Sf2Qm{Qncy$W$D`eo5TO)eA2tVt72{J=}+EG z+c*Eh#PJ)hE?NAB+v1P&PGlbPx}$5$iB}JXy|dbX%=Fa23LCGLFfYk^rDiTxB!ny# z*@*Z_sn5?R)*H-SamT za!L6c#`Vqrxs`P3=0N#I(EuLJGsH#_%zUO2w*wX0j->#2(N zseXUE@%le@*B`->+Wsj2+xOV6tn{t58^1fo^nI@K@4cq}zG&B$FYw=!@t6Oo zy?+k1T`@-GAL`$GP0#PJqj!Mab$`3|9wkw}wH{O|c@-b&bPxBJ}{p_v}+13ApoqRYC=v)3}yY{OT?GgQZ?C2S2 zH~vrB)n7HXZ~epV^draa`O|je`zO2lzqPA>g+g9v{4I9R-R$&rhTZsNx%Z`So!xku zdml^Vd&o|I%AI>NQ2Whx_U5#mJYBG(C(&-aKU36C<9)^MT5mW0+wA)Lh+TUkIkxg2 z(U)nb-&^d*S23Q{{=;_T^@4&Ps?Wi$Ki}EevuEu3H)^6x3;>mPw7VXt7(Z(NzwG#- zwW}{#K`+&}(QbU!&A?6hkLs(n>;HGQhk#UmpWXO1+KulKyZ!|#@>Bh9j_s|G>YHKL z-XnJW=(MXZ$!>ntj_F%pj9vaCcJuoZyZ&d{@yA3&$$x|v+4b*Lt?j9GJeus3^Y}eTuM?zx(a@YR8Xf?8=X@%fHR8KL_l_f3979^>*_1m0kYBcI}CF{7tp% z|M6b-Nc!-qo%|*c)8s#rpL^}bC&sS6CHDGfM^8UH`QC2VzY@Fp7uXsH^g#;r!dmYs zjy(z7m$|Xs;BVD@j=d#c8&Lno=Q*|tbkXw>0gQdMpJP54ce=h9i0k(`b`p9_*L8Pc zow}Q2XCP;E{fLgSh<7-)O}-8o1s`x7$DWq!pE{Ybu_rk8viyACNGwa&ax7ea{s$Mv z3}KvP$Em(SkmraLj^)bvUxU6+3E>#25j~GU{>^%h-6vlQ=-(gFzYzI)3H0knw7*Ec zeh>54*jSEzE??h!H)Egd<(Nk9?;tp6ZFsJe+v~oAu>+v5T+Xi>%vk;tz4gC?`8hF> zV|8-*>!A0WRE|Z<<+s6pO)zl`RZ8?;1^vrsa%_}5p6{T&jlbtumi+u6M7^We|b_fVf)z6}dd{>uG*5&bPk{3#3djb?+{SE$eY zE+@q;sQz6L`X}-^7A*JI-;Q5{Ag>QcVtnQHw_v;@Fy1DazE7tj-f{usE6dv{JAV8g z^l|aM^c7+}S3ktDB)NRY-JrLkSN{Ht>r-!W3?eA?-x2co>M@S3g&iS!?}xr``7lIe!7*1K=MXOY|Uk$v%TUvyER2;v&BhHS$!V@|FiJNAKDrpydOY+{nhV10J;C-KR7iBv(N$+!|36*a^! z%}z`=poyiKxNj@n=kB7pQ8Bqwl5_L33=zp;!6}*Xj~P=88DYsRe$m{R+^M-jwjnVk zFev_kcq@wPvvT4y3@Z%T@!88W!d9T>L_=bdF@AZ*W5$e>_~fjt_^j*zmTpK-PS0XF zx!EQ|hPAe7@t`#?ARr(xDKW>G9FJ$ljAaqYF}VQ&$wFdwd~SB4F*gT<#3bS;EI@~5 zvkh6M#AHKQYHD;;a_Y@n(^=~em~5?gsnKLeTE6sV6^BhpHf81*h-~U#Kwx})ZyB_y z53oI&YRXJbG#RWnq%lqcV>05C6LXUVkU^tvp#EB~7sW0_b-#iDG%RJE(lZ8z#PnNH zi*}af<;7;FvTmLP6@@-iLb zk_>sxHH0llg{TmRgN>Ov#A3s&KpSVLTSp!bZYm)`q>^FL;O0$O6c8UKOU|!g^{gIY z`Za@Z2DsW4J5M#63s^wKEw3NOlJ zEYCtFlF5J30_BQD{Xy38%UlZmh3wvR5ak+wbzVii#@|ryzsPH|OvV)B3Jj!mEPksM z3Wih}vLQh*L8t)(Fg>1(Vdi7;rp#q9V}|VP%xv)O_Nt$jZOAcXuR!g$SDu7EF$ZHmi6o%6JS<<6&uG zAz)Bsoi^qqnzDpMmYca8^k&~?ce9q~2vF$cG@7Gi1}pd*pi4^3z<=4vLjLqz!H{l< z%{HcoEr@~!{Z`J0F=I|n7A7Ae74zh8Ek8A9c@lKQCO4QxWw{}Pow+nV8>Y|@zcf7; zj9W=BIWsks(8xdHd8COI(V{G9(8EWgC(+)3cUCkPO+z z6^0Z(J2QP2<`AptzIiEG=K2iY^qx9x6S}hOl#I;B9>}?|&VV3LxL|n($tz|ngN<_1 z?ZjksC+DW!jW#WZW564iW-7ZY8w6#$fq|&snp>Y}NYBiOHm3ZGA_3ElIm!|mgkrZhAj42w$VCgDaS2f+M~-2+4(V4en#@l>}4yY=`|oeM*5#E&CE_?kHO`nF2e`O0Wjnl zl1*7wz~T*g@Xk|~X9eC+tqyJJjfp0-8kTN#Hk2e!gKL`}1Kq#P;jr&TP)25Uy5!+U z3s@BV8`b`Hp`jTjeL0!;9w*#xjCHx0vD5X&WpLham$KYUQ|4pVNkKV|0n;IovobT_ zZ06>WPAc`~22&#CegGa*`kc&V|2lV|Tya=NZg&37%t%1r9I`vthrR&0j?m1^w16pw zjGX1!pb^e;uHN|XaR2s=Hhh5ev=rlw`Z^Uu8A@~VzaE(>wyfyHFOPVjG)qO~WX8g1 z-Y)awmMEm)3ZRAJ_5(Hg(#S7i?i z2uPc0GRYO(U?PGsh&EyTm*W^LjbluDPB<*GA)8i4x7pX|r0AF_@iEimiJ;pMqo7+) z{Q;Pu(=%5XKqi)NOLK3NLbg1^WXwpjAF%1DHdcx^+)Ni0PkWYCQ(%@1c|j!8n9Z}~ z2!(VLzIigWpmbz&@)1`_w>q*ncrMc=)tH0O%S~JFecID{FvVJOvG@%DmYa#SFdVjc zxYEY-EK@{kSlEi_ z(YsZtX;P^e%oL^@ikYnIa1x4NY%?M`^S87a2tO5Zh&hSb%M78Jrj#4nB_3crZW-md zwHp%~AFGRx#gaR0UQDn}qI-u@u|CIe-XerzjU?GvdV7U?INq}W=#32g%a(OF@iPNW znTaX?t`b?b`-TYCG-FP@6iJXnTyh+%Cl--uf~mtIwzmtv7=OAQFH>5Q=HwWcWxznh z1legofE;E(e1g;fzqbe?$gJxbeOoZ$7Z?4qzaP6$DOSI&MT+pm#{Qe-`?TLX*8fUe zsBN?iBNCpNBji%-H$q9tuZ)}`3>1`=Xv~g?qN!j?JOxytLSd+?*J|nFV+{x`9KQ~AK0TMnpW@bE09HugP#Y#`m5!5y_9$^B#VQJ!W6C#APoK1AX-!7<1?*Fhn)e0o^o$yn!^?#rySyxb4N(#I4ovrd~{UI0zih6H{W}sT%Hpb+U$d+LZhkql=P~$32*_EITm? z3$Ub2Dc<~G2G(Q`A#RcR7^2N4#EGoRG<5}pJTv?D^ay$b^-)OUe@ksWHm#?&K8)+L z?2vSqCP5pIu`Ofk(XT1h)7HPQN3bQ<@le{4>G2WRG0Mf>#J{j2({5!&rrp|#NRMuA zMNr)>tq56?|8^_#AJ}`F(iN=<$qx^#nE5 zIw?)NsbK%N)!ZZeHk$hehjehl9za|#ahc&)tJzJ<{Bk?JYnNZ!%FRm1ZD2|F?`!gZ zynA3>r7nn>Mly*J36LC$_@w+?M4h8n*tY+Et6ajJ#vWp32Bxs($+;0$E3yLd)*Hg$ z0YO<5iHljjbg40qqJY1oMz>u2kiXYA)}UAeT4O5|1Aibfi(F|;$;%N4q%#63@tEvx zZ%Uhny&BoOgZB0D{OB4MzDGKcl@v5AY;M$pCX7N%R6PCNvQSz|IlveZqkoFrtW{GSYfblKSE_y$v&}+J}z-U0Bu8=Rv6~u5X|js zCnh&}k27EjYy&pcvvEp63R6LM0(8qWjM$xs&&nkSGhW^Yr6)lt^13JmtE^l@1U4PQ z!lL;VE95nvZReC?NXdc}CBPOu4*sO$EKjas13vN9O2r|Jtl|qHqcoXW!I=7b#$%#3+*2t;ixEqeyJYYTVCLP1G2I>^bW;+i9 zLVkUq>ZXw+>dUXFg2wu$k*nWO{#JseqnP8&Z8=xhWIvvaYb z%4Zu4_CgvEVBP4Dw$>4IPsI5EMLp3|7aDUAK}wH?4;5_<3De0mS?H$5r?a@F*vd0y zW@FDJGnuTieDrK7BHRe2=OkwvvvQ4@891SsnJ!1k`<_mtQ*QRTZ(RxcK!?z*oeRa0 z5!+F;-kXv$)kB!n?YLQ)S@|;|de$>)y+_uhIJfe=-DBC-{bq&8{L1CeRBJ#aj2sba zoesl+s989Y*VA5(-2>u>V(I_e8`4*cpt{q<3eUsq*cw%QhMR`^xv9Cl+$-!WK~LvxMp0hQ`S+Ni+;8|K8$7R%Y9x z{?<;^EuAuo`Af1%v4EQjk~KY}Wr z@5vqzHt!~M*<}jo$@G7xH46-Y+hBEE@Un-r>dnAeD>@W57Xlz_ay;FmO%rSE?1s2m zuYg;9NUI^}!yDzs7WS!^8%-&6)Q(QYV5?FppvnK*6|l~u zWeMIukvFR5;)wUMjOAFft5jVCe7eB+0BIk7%*U-G$gGO-i*KiBUm@evrk|9?9kGoKEWSp8@m;(suM-t^ELur|xgpH1(q z+?uf~6uWP~y{K&)CMf4I3fd}#x37&MQOTWd$e?}yc;nKDxSVW=6pp#$MWcvF3C+mN zjYotQ!Kiqg^vGSFg`6g1ngQFhVUWMT0NkZBTD?(hBOM};On7cUu{VdUGZ|D$2gBn919kGhSA&cYVTBg`Z;&R4 zQp^I1Im8CiFkuJ+aE>uC&G0`m0RPK64^>)V)g|;BZ;E7PX8m8%ZDr4IqR+i^&Hp}K zrek3gQl_OmLFo)EA#n&ZE=V-y81S0j>^^5I5R{0>zzZ3CX7X|bB&1C85sMte@}yTJ zr69{33B?&9<5DBuR>TqHr3eJMVR7?7RL?>F zSs*RfU^~MhMMPkz!toXY8o|sf#qwF4HCwbX4|`y?tJ$+`@e=D(IV?o4E+Xn^jT%vQ zYZONcBH>bgUyzLDjc-pPu*>42Y0NT~vADT-yE1GAPCBr-IXLXSJPVtCIr-^qX>vxc ziQ#Y)UV^->?F_}sHmJdV31-Zh36tM*PT3a0i%PaTeVp=GdVH4jCJJ6l#d&sAg-{~t zCY%_&pSvP}-ss9PVxtH{8c#+Z-pziC*%w$ZG#tI{NSHRu6yK^${ z*7e-%a|Zz|dKySi;{pN*pGtU6Zc4Jhf6wKzWW4fAR{``e`R;VQ^Kn;VcKV8G)|<0u z&5ECVH{Q^;{&DP={-ZB&{wMwSKTGegul?8O{7)L)Uq>sxJ%In}@s7WTEMpIj%f}ZF zRIJ~BS#Qv{Zt==L3z8vyyMV4|$S_2PdKrexaE=V4Wf&{NI2kUHVS)@(WGKkcB*QEj z=E^WnhO1;)Aj7pXTra~7GAxwgCK;BDwyQzr8Z7kl}tA9+cr>86K12 zaT%VF;Yk@*%CK67U(4`}3~OX~QHFIgY?NWE46n%0BEt?DGJKnX=yi~xMuzS(^pN2Y z8IF{pj||7i&`*Xs83xHPScWrX7$QTx48vtOM~2ZdjFsUM879auMTU7YERZ1!vG!vX zu2t_cwwB=IjBUMN#fIWr7261Y&)80a_y$cmL3}%7FF||*qkCn^ zFPPwJd@GpXCVV59pos6`5gd%~*$_MkdhS)RVfgmRL4x?^#bJW@mdP=K(7odX@hy}S z1UY;+h9JJdQArT}t|mAd-)A9+Z)uz%cmebf#J5>45`@Oq5xfK69U+KsYP1r>w_dIg zd>`K(B#3W=bP(*1k9*7jgwi_@?7%mP399j(9fJ6#hX+A?J7fsKPR2Y5e#6*Eg81f^ z55Z=9Q<&g!#{38lWo#0`VT|brLNJ2}eui(J5X84qW)S>>u@HjzHj19$myCrI#J8m8 z5X3i6q6v;cOr;y$K(<`%~&2m zcYJ4y;QwK)fZ!*PGlCcK-EM+f#x@Wf!&o7~dd4;p#5ZJ02;w7HTM7E&drSmdAddvU zg*+0(w^jBM{1oy?a02*G5Z{D3ND$xpIZW^_@Sot__BEJ?VB;MK z;$vPKg7@Ql)C9Z0e}b35e}W<4Kf#&cKS4))e~2JHS~P~B9{eX52L2P|!GD6Y!GD6` z;6K3#@Sk8L_)pLR{uBHh{3jR%{u7)7{uA`TcYp|v!S}cbJ^=m`oD2RF{1E&n=)y69 zU^Mtoa6I@=a6b4?Z~^#FFb3ZXCU_M5Cm0L<6MPW-C%6#&C-@NfPcRPrC-^YKh~Q%IpCCTCT~6>A_)l;N_)qZn;6K4fz<+}A;6K3x@Sk8J_)o9~{3nH)4_j&m%)F6{{a69`fzLr!A$U5jK@KNYL!Smoh!EErKU=H|CFc{3rM|_)qW; z(0_sj;6K4@_|QMWHQ+zNr@()LYr%hl>%f14XTg7hPlNvip8@{~R)PNn*Mt8A{|NpQ zd=~sC_$Tn6;6QxGh~Nh3Kf&j~e}aDo{|P=1{u7+Yv4aE)!GD4q!GD4$z<+{8;6K45 z;6K4)@Sot{!GD6A!GD7I*!vlRhroY=LpXMk;0w@yf-i#q1WUkwf?L3Ug80~&g&;mC z-$Aex{Kxz>tPK1o_!Ia~a4Yyv@Fnn{pc(p4&>7#qBKR`+Pw*A+pWrs|pWv(DKf&$b zKfxW~Kf#^gKf#}&{{->TwHX9o1OExW4*nB-1N;4plz zir{0IOH45tDio9{*KQ# zoFDS@;U8_dy8?Gm;2oCUJXaKWqXNIEz|Sb~Y6X5$fge}khZXpK1-@5-?^NJh75F9v zzCnSnRp6@>c&-9BDex2pzC?k?D)2c9T(7`qDDWT!K1qR(QQ#vL_z(r|uD~4>c!#JM ze+AyCz%MHBGYY&~fuB_1#})Wt1-@T_?^WPC75G*KzDa>^P~dA7_$mdStH4bPJVk*o zQQ)x(e2xOwEASZ#JV=30Qs840_(%mlM1i|2a0dn6aZNG)3cOK)UsT{{6nM1)KdHcv zEAYb#e7^$UtH5_E@U04blLFtMz}G79RSG;;ftwU~iUMDvz+)Bo90jgd;4>6>kOH5i zz{e=?kqUf>0(V#74hp>Es$%>Vc%uTpsKC!C@M;BqQh^^=;D;6Xeg(c)f$vn{TNU^w z1-?OnuT|iy6nL%zH!1KG1-?Xq$13nS3S6(iXDIL>1wKiEk5S+w75ESZ?ykTc6nMuK z#rP}mMg@LRfuB*})e8Ki0za<64=eEf3Vg2u->Ja2D)3Ff^JaI}+UBtJif081JWqjV zDR4o7Cn)eZ;L3XE*jSbp}>O__#_2BMuCr1;6oI+ zy8?Gm;2mv>@mJuD3jCr1Kcm2_75GU7eq4bcR^a;;_+ACRQ-N<);F}cq1_i!Wfv-~F zxeDB*z*7|X5(OTsz~?A%y#k*BJotbE-|vC`QBUX_;xv=h3Eg6IvqM`j>lQaPxJ3Ez zbT`B@^4=qL!6Dt^%SXD!h4tN{dsAaAJ38YOzQ5~$wGWb0xO0?qWS;(U{ZpYU_3BE; zs4wHx`#fi3{cv<)72+F6t@v2<5aiW_yF^h=Z?A6#I7e~~JGclB`!bV|e&xQ&_c=v4hv)05{QKr3b()af=;M7T zcSVhL5%M0^c^q)( zw}uYneR;p5Ui_L0-+f$hx45W@D`SUhyi^rLqsM`@6%M?HS8wbVkJTp$Y&0wM;nii` zVsxVeazqMic@OYviACe)#=8h>DiXrfZ5sFfl^eoFR3108L8Zd0!uEvdcRdrfBrxAa z392lrc|(}1{4{~zp5Uo?vNd#A<$`_OM2DlUd8#aRCDC-k%#|$?e1xO~HhOg|^Ys*L z^(62$wHp45T1j5`Zt=Zt$2L#Sq0JMLvJbcpxDNOp;Nif-fxiYk0eAxNSAgdM&jY>% zcp>mY;KkjWEfu=2%oDk_fSWD*bYEHa`>X}rYr5x!FT8~J zi+Z{uPv4L4zhyZ8ahxANpwwG%ES}fO)b3lm#iflNWz7HXvs+Yt=;b}l>d^!}o0-;+ zci64ob;_)s+$|O~1PTsYJcNmSznA9Kuh*t~P3IjN4DQ@rCyu7@J5_8`x45#Ye`LR? zmHIE^yadOxMIllPRZbO0>RMO(@$*`{1G+`mW+v5N*L1qJTijpIj?VoYu?xuC#m_hf znrHu!Uo8~zck&x5o=tb)7evgv^33x2QS(~8H2M10aet5V7ThG-X9*(&wLsdis6JWn z5-#9ci)*GmW#$C7xm%2_-ywWyDfda1pLB~n$(i;C@OzNpA}|3t4Qw+go7yd2GbbBI z2o5itGPAgEEDkz#@i!KxLmymJ#ZKDoMjvCh_+WRkF@UEwUvEk_ev9!Z{CGpMQM225 zmnZ6T-qJ1B*C!dB%LbyZkK0<+rz{QyZ1cAk2Oo9AmpSU9Z!OGcv4^VYyj0_)o*JJ- zjsKKu+=?1qce_Y6x}e67>Sfwcmv5?%k!@ZjxRj|k%@96rt5>Tq_L^>&NR2%9Zt~cx zs@!SppXnCyj|d!n7UN6fESx|L6>>E`yu4z3REaN11{?ixoWOevt*<-} z$#~ry1UiY{6MuuvJPjIYT{HZ}r{C(Z=3#$_85dS}6C`Kk9Pamu4>d zL2A2jY(hhDMOW1<`|GM5!SE<}&lH{dQ840(H}9y;d{-l|bizHV{F4ShD< z(B~BSjFL9U}MH2mKAP_IdW2ifD^( z!dZ*owh#Ah;n(w%h2i{Ju8QzaXx z<5iNTv57xdJ}jUQjOLc}m|K|N#VXs=al8#9J9o48exG*p_6%u~P5u|{?Y?DuGlh-& zXf9FLbcvf<5{3Euv;sGs^Y!5uFHyH1Qy2JOs_YVwZD=f?-2PF1t2Y^?BYty_;JvuQ2|>RxVfl02RJpqD zWBmI!NZVFQ`Z?2q_r%Pxo*#zVUT9uDf+WC^*JeXD)Y=4Um#<3_=3VQ``P;SboHDPM zL+|)Hke|u>Ab&!$^2tk~?q5&jr%O*3H2d&0hf(>t<}UH`7Bwj85-&BWB-q>(iS|R0 zS~12?RcQD-Fh*n_Vw-15G*~I%;NNHyxVb^UbLK0}T=G*D z?)=N}z2;jS?$z-j`0W;p+8x?Pa!zd{q2(Le9~U-Rf_#D}KaJnV6C|tlyjtL|y*K~w zm%d93y;KzXdV^Y1${)KF;XALsPR+HeFBgaAS91Q7j(+FKO)d`gJ35#T_Eoj3Tansn z{$LFn$I(1jNUergG&(=n#D}C-9i>+1x1&v6EWa>p9pL?y+)J))?k<>7G~;U05-tc0 z2|EPGwlVCunJd{NjpJI2dqG{|55_H_+REfqb7ESOHZ?);PYMsCny40arFB#z&A~yz zQ(g~sX$y84T&WfO&};X5g@j}wDy*__WFut5zz03b?SWm z(#V&M&&KKaL4vb1Lw1QCO~RqX$OKt4o#pv3q;+3`MzUKpe{qGXU7XL%pYL?-5`$Z` zLXzMuoW<MN`rB4b_3`Bz_q6m zk6-c*Sl!MZtwz~-^(Wnr4L{cKYRH`Wm{s4ywtvUGJ?Avk$NG)7?lv#aRIv4&6H(M8^6*ONI_tYiW&^<{RK zxa8<`A>>lbjCUJ2*L*=};JEW)kG3)Hvv1j!2!T!bq!RwZ7Ot4nb&1znSQ*;(fd5=} z&%3OI?6%Me>hMwZK>{ltrsvAusbwYP?|=4Am#AymA;4b@^h#J*J4o=-53+ERTqk-S z^_l2?l+!Zp-4iuOXSH%_=Kn_3?%MwPO|@NONK?&+97};tkS`Gq_~cQmt?&>3V}*az zFg{POe*0s1w$75Jh0mp9f@cC(4o)<06FB%Oc|UU{2cgI6Eu^(xb@|^6{3WO zL+6EoLQH~NmPDBjp49xs;2yiz6BPL;sI;1d!3l$VydfL+hgP}3o=_VV^)*r(ywt{b zQX5@jUCTdeYlHw;2hX}H^y2$QcC-Thpgu$bp0fyJk*2KFlcv9Ub=DJK#`(Q{&az~k z6FkYkN<9hYEwGc#P3J7(LxbV9k;ioRn^xa)KpB>Hi^-p6;OG`mb_|A*OW z5asf0IcKRJ!ue9$gMgn5T3#M!QCFO^oCwksy211EO>k@TQNb_r!F`=`v1W2|LYH{4 z`KdjQ#h%no!#T^gpjEp)czW(qd#qx#vCelE1boz)ccI?5*y9b`};tN`w;8+&czs!uW;U? z9Nm9lT|uM!C#=J|us*SlZKdT}gmq+tT736#JUnTX{KP`z_H7g8{JM$iuWnM6bcu87 zRa-b;s(a=2|Jvg&jm_4kx_v)IXmFRtH>ueT`M#}p+oA#uUE-qVnh2HrEVh|ALU*H^ z&)_cQkCb>fq>1yTc@}f)b!zS9CP&ng(d6;2+beYaPQ6N=hXb2WN4Uagp|X=uACoxj z*Zg?|=j$xp^=)o5Qkn4PPa~YAHawekxc;dZ&u5GvqPCH?prx{rqQ|VcjcPNX{g0r?Jw2!iNxE}P41vM7qv{4oRR~8Dr)>pn5b;sz(^=u;p zk3Vnd5`7y3O=^r$$h8s&?-4U$%LXURhmC*5IZhaS{<$Tv;wK@|u@(q$MG(HoV zBU{P8%Jx3Jsvoozp3L*icP4)V7Pm|Ma}(AWxI3C#eUM=;(uU?eeo!BT!J@cu*Tw7Q>G1A$th8L>FNfaEbTU&eOh}G`? z1Mmg>n{N{f0GH$J4c0EUcqFagXdSmS7yriD6Ie3?K8d{F=HTDVLn=aAkF*kLWH!#- zyw9_^p2iT#J;7WI|elRB;Gr>X7ClO+s3lg)@i;kss+I{@ptVUFStu{#on! z=OVtUcrG$u|J>YX<7Np@>IVrilHZYb=#P=l$i0f`@i~qZJSeSNop}woQ&Yb>LQ_r} zeW|g(G&4YVx|FtyVj^U_b`;R)ZKzYd&GE#yN4x0y=?1E0ZNo~$bzF)y<IStzTP6L%(RL4gRLmulrp?+3WKzUo-tf(q8H+o{i0?a78 zqUovCdX&~vf885s1T+nEYc-H8ulg&JWL>YLXI=I5?0Ws=9+|d{{hiQ}>veZW`r7g2 za@9mgTBrDIi$uND!ngI~dSu#G{v2d_j=57j-HZ`8Z>zmCa)4b;r>nfBnwGX4sy$fy zZLMdIRNLw}QZ+=%5!=#;e`}L`iHm^MNUQP?`_4z~8?tpXxsLk_{_Q%XmFYOM1bFQL zWE^-kV1K}eBI7_!>wzs;w|Wc1CI3S$c;_+y{K{E^1AG#dzq)EQJSOJ9s)}Y?haP|T zm^m^$a<3JPa{gfe7&;niJT^n$8cHN6RLI~#|V=5kSf!H&boqjXZO#T1zz*skeT%{kCMkcv!UkE!B>CCA1iX|6=d!^c_y{9L?}`c)Y_r>2$JOgt8&U5N)8?E&OR0HVT2K?vc!^4P?X z*1ZKB_=CCBJe_w!zjt&xmom(C{n~Vz=Pbdn7z4Po7SD?Q@M}W&B8*^QT|db#cuejO zyRfg|$%p~IA@DIe#W~IWN^RDp%&RnvU8*Qpz(34W%l9=ekDy%e8sTFRjiWjcYu?o* zmbBBA&K!ceCt>{_T$e1&x>n*_;7PrH82c21%C*L`@R7bmjCaVML9jOoX3ui3JyJ}# zcn!+MnNtu?JY~r%=-0MN!?fW(tt~YghvIPDrTO@wC}-Y*AG8az?&R56^^zU}yVE0T_(Rg;cj{0%3j(BvUZW3lgAM-f;epENGmiqRg^yF~e)X2N-xHl1!bhtU7 z$12&ldKp%w*<4fW-(#0-PkyQzFWHLwn#M(X+tv1Um9O+n*VHMhT8O4Kb$_jOsi8iv zLNtQ3lVTENsfg}uiSDerw`(0snBUb(Ywy}>sb|fwi=UgfBNlq`U5?ctk(|3izDs~- zrQzQ^M*5-xdtaDezugDfM=D1;FW}#E1^g87K;&OQBdy1`N*2gllKWY(Hmvp2f=I!M zXA@cL=>iu)UGBJN4X*}=v+A(2euim>zd5Wpf8=wPCAy*ILpOJdSDJ?@Wb75pet$2x z2XU&Qn0efrdY@rlM2%Z8+YH4V+9`H54l5zqB;S}KT;7N+QCTY2+Q{*wzhx&-VZH>beGx7cc17>1t zuZkK6lyr*a%|r3Kv)Ki|V;YrxD5@JEt&ImtJ=##`QsTCUVqR|2_1ZdhiKBGwC|$3r zi;j$vrO8{iES^;(r8tPXykDEUYbRodfwe?aTuU^18r!0eyx*>b2c$U`d&2ie2HQQk zRCTW;nHL*6#lJL7@9{ltZJn>0B0aBe2$CYLv|DC-R$Zl&o_*RtBkbAY0vd+39ENV( zY1hh8SvM*gdgp0dE&F8M*xo>WxYqo&Vy3p`c}1S73md$8qOG=P8>@y%RIF+E9y(D6 zxhH)HeiZV)jAMcD9q)S^?~@>1dJDecQs@StJK$dcTk&u7ZUFogFbi-u;2glG0d;_> zfYyjX`V+GRXWnt6hCgS~3@N7HG5Pv)7KfB)Jzm5}(y^<;tCJHAG|zSlzA{KulzWT8zBuSt=GE^+?P_0sCMQ{3M&44$Xc zW|}#9#1=54HdEfXW{vLzth&0ywX1F zdqCEkoKVKId3EjIu=B}W?tb%foO?0$iMS7=25oGM)9g8A9Y7@v!m8OnIB_nvABL~TLd z9)+EvQ^U5X-|dP<8|1$-Z9~#Ji%#dEO-s6G&%ok6Nw5=5Z|w2oHN_+NEf~Mg8^iHC zRf>ZY7L*(NwPm?5-%)!$1JC|w(fA-1r=u9jhJvrm4j&KX6T&tf#R&AD*UI%jjOeK5 z=v-hQN>~Da%!?ILeZh^iW2^mu@Fzigd8$fUpI!4|CCO#u5nncDax<>J4vS2@J~SkD%(kp$Qpz;ahU77!~jc* zG}m{Eo0|Kzt#{>knrFsYNOER0#Sv9al)u8v`OcS0eE)MM^ikE6uE6djfCBCo?(}tak1>rD_a9hw);v}9 zm035q6#L-oLuaEnh!MSeEvq5k4f!-NTO=AAoXx zd{UXJ_=MJ>n9gvpX`@hbD@s<6?G%d|v>Co>I8(8C5%&GPe6gA<<|$WTQd)m)jj>aF zrt6$#Cu+Zd+V2#8GFDqc3gLI7ew2ELp`N4DaiuY+WCxECTykoyx^f7ZQRy-`s8W$VyDQ=+O%rR$ZZ(cifT(x zA-hY}>bv@!<;<{ry%W~=Q$a^0&t7~ObVQ>M+zYDWgP>(3sBrJXx<#^qs)n?Y+*pq(MOX#_-!v>-TA#T89K|o$y>M4B_@eJ3i*mkxNqMLE zef>iGo~efw#CmF5v@>=x{rC>?dJFRlZ9TcV+Oku(SeUi1+ET9j(#*6khOTH(tN(iG zk*EAH8YGouzb**Xmc2gIQ}3R>Iy{Jxd$4uvDYI%}r#Pt&G3#;XEH&6a=&N@nt9M{^ zE$QAoNb#Xw8TFNAG^x%e@Afjf1gmqB(St*8CZk1`Uy{*fog@ps@cxz{&Ym~aCZ|6d zm!%=Li?T{t=#kQUNJ=A67FG`B^e9IXXp^Bhl$+N&r2jqG;kHTm*Wle$lB4_FQPv-2 zeaDU-*D3nov<>Ow$nh@17a5*HhuDnWCaY$DEo&n;C3>v8mTm43e`>jaU7iub4&e*S zRv*g!j~3+B(w#vV!G9uG^qV;0G}T?Z3)GFQtG1MQ_`%EC8B`_BY_6NT#1xBf+DR?+ zs(5}Gqzh6WLzGQRN*g3;)tL^A#Sm+sel(5}#+xt;bxVD6v+vU?NjIoZf0gF3gXVLV z5WBLK*0MK@M^Vps?2yWqqO4|!Rf;>s1KsB=YzRqlr}%bvmpt$8?w-{n!{?<^1!j`r zRc4amm1dIa73M8J*-KD|7}_(geI=+vya!|GobywJQhxN3jq4P%LHn(3+-y()`GGB& zVg4s5v|2fmo=!S9c5~^um!xN+M7uBatw7SL;!v)2+*8$-wH~vtotySa_)wgF3?7%K z|NFI;ha4xk6dpY4I9l`Kt8I>MM|oJyRro-=nPm(Ay$OT#4#No8$Te~6aDsX46p+i8Z| zUuToDG@K^!7pyrc&q!@j8d>l1_6uq8VI#1&dQ$CvG%4NJRAY1~ZZN8g_ZS)Morjbc zzE=CSySdi))?loB+}b#|aZ|s*4E029FOOR#E75^{Ceoa3f{&y*4D*FQ56NEGf!(2A z&Dkkw&OMa3M|1Afl7(f+-yzmFEsIFntxffS)hy(#^NPOE34KpP-(i(EPeP1ZO*&L3uESslJNiPw3*(B9&oK417y6q3Uj`Ek5CBavA`SjA#q&4koRr%3*^%wH} z`0}HlHEbWzDSC8GjiBASPVpXdBqHfzCUIQN;C9)9xFrT0eZFWv8Z?9u>L z6wi$gt(mjS>dQ?6%u7c67KwbcYNX%4&(Ikx{b-2XlH6>zTx*RhYl=K~yx z#E?30eQ62Sl*ls`$piSc#fSwX{TbJ19>yL!L6k2JeXCtvF!R#Vb+g>2^Y30=`G>!@ zCa;SLn|UdDU2+)L=HT4)HRjC%tSk^u+wf}2p64uuuTJNa5dG^AgPM~{?$SnL1k_m_ z;+ck|vQR$xMc8kP^R|9%7T0Lx3Bd{xlGLKZuO4x8vMH`59pZg0Zup(i(htAEEf>-t z69ME`{kiT!+FA2`I4{~E?rpx1HstN0yQkwMDbwDI-T4l&vgthXj?&zVz5M%2=~Sn> z=)O`FR>0kX4n@otlIwRql{97Wb>GZnVYske@DOO{|4Xx%miN2fw>Iv`T(CR3$h8E1%b*VNon{VnFI_udqI=a-@JB|FOwjBd!jt{4B_FZ^ zb4W*W*&^uj5Vr{Eda$JHG>6Zn9^FgxUBu5M4I$0iOtQJEKJ*p(cx85o8i~45ihhwN z$=z2k_p7VHzMQRJjqs-CwcerV*K#U3!&Xw)h}DZHQLat%O{eHHXonv;vXCsaCun~d z78<0Dm&a5*NC-I!@KwCG>O+#GZ zMK=1TZIk@JDENP*tJ2zQdQzGf{6AQ~ZqjS)u&mQ&EZ7xYzDS4$1+JiAP!n0V0h$ql z&2u~n4h^O@f_+Wa(nq?JGoWoN-h)T;)0%7EIMEk_6Mf0^T4%US9jI=1y5`dE)JoRx zoMrD6M_yBiH(rWyPfbxT_hMUqkK%Kd!YPmI2NX}NNh-@oaBR~!`Qz6^Z79|8DO>iy zf_~nZR_fU1r%v7C*yh9hlRCs>jW1b_1a1~bU9pV?}3u&~s*dacGduPq5(i~CRa3O8@F3;UGL%1b)LK2SEd%o;mHf-v+ zyAK{6H*Qa8@(X{slK-}*bndm5MEA1O*P0W{yh1Pe`VJ~C^PuyQ$AFV3c?Ei*JS91U zPDx%KEKxY5Y0#FWve}-qqMb38PbN5HTn85FctdH*mJcwdJ{VJHX-u6lruSk@he>1l z4ED@4WiO%j4_9km-op=kg=SKxHV;R?nhz2t8}CiLET9}akkFpsgz}$S+_yb#@z@re z6p*?FdlpyLy_-5c>4T)4)C%G8r1H=gP#@K)t_(180UhG*#u-y*OnEnqwf?wn#x&5z zmj3*_^TC97h1r06LQhs*5+>jbWjju(eRdPyZvkQzh zoonkr^tUvUjb2i|QV*}7&gm68GtnXbv-5=rIwyv84t9eULOM@((*28A`*+|hhRt6g zsU=xlD9K_h?)Ph3;^O&MgygYMj5d&;4Eb0A*+ma^4`F`s?LUG}zU$OQ3*o=isZ~Y3 zCWk_m55~SfS(5iUslB)A$)@hD-(iAXhR$<~W`t>at=39cI*Ct{7`>sI7= zk8@FKrQb|F)-EYfOf1rU+C4_)m3tf%^kGzp`wS zX!KZjLGrnr%gVy$wVsyOPgp%=V)c}1T|2q94FP3T?sA7yiEG<9*A7H@-oLu;53Kdr zTIbRoCN7XT;#?Gg7_4g?_IMt`x%!3pzRZKz>qOdw^iC}HcNXBgf=HhtWzT~zj^rB6 zvFm{S=fWRH>YW>{F`IUrSGUcLeOKJ=;u>kiea=$pO+J?`u4r9zcZdgnVa?qkK4)EX zqc3X^FDUd@uDUzK(p#;%5wqzKGf@`v%fpzDAe~8AeXrMz8#}Kx*lm>H2pj7-&hfr# zoC>w+l?$xqyP*%BrF`2F*YXhF4LvWowL6Ie>9j2@;TNWMaY)N~p;fV_=8Cminp4^4 zcG0~B_37|FMT4{ZR-6_m`TB5mk_j=t0&VKN)-kR%Ms6ytfhlf!24~jQ_;t{+&8lKo z$fyHkbVvu)5z5yfwtJ^un>IrD6f$vds=BxxZ-v3%*zus=7rkR0U3a~LNMJ!K#ZaEq z2SEAGfz82McM(6ImtzEdBEzr*SnDo%3w|V`Q-wa^*QO_aeC-0K<87mE zwPuls79O840jtlI`gSp+nRZ}0#4LDo6(h*wrCC(Jo8$WxdEkBu>g*6#){!T-0+ELk zTCz?Q;|hZw>1{sFeMxDfBp)ZW9c?2<5Bb*?!y zba`~~1j!ehQx^pk@DWzELUJ7tI!B^hQHg5q{ox*PTk*#V=ZH5uEvDbl*B3^+s?y#J^p)S)s*Y z50zPCIO^hslzW@1n0!NP3yEW|1ZGpmVz)AfVps6b1^m;LamCJMtave`udor(*$=*e^t8iQzqR(wZL-(C zh)V2V6om32a)c03S45ROg?2FztD$+VBi*gue2p#kI-?n@9t}9-2k)CAwN#=)D&dI| z-s7$L&)M=%v*mvTtNW2Y6gwX%RQoy<(H@4kkdy{qt0@odV04J%uH)T>!{<}4{iw}Y zg!f9F-^WTDdjL3rb2KT#_BKq2tQ+3&pSiYnoT)iyIX29y1<`fU&;nOU3x2?wv>m(u z-J(D0*)}X`&oYxIbj7Nb?w#bP_$u~Y6rRd7@>I@A<^R#V!&v4!I?dO|MX=F*K9%TJ zfo`k*eE#$Ho*CRmoz)L%$BFk|pTb>=fh57FXcs5q{>^-fcC4<>r}>U0Phy~uEO`>@ zqNJWkh>9X1V<|e=A^usS@M-k$>knWbhDvKm$ae_hbU)JC9nxEZ_3yk^Pj@MrBkwR- zd-@3ZWHYkR(^RRRB#h%)IqKhAJ`d&nc+atsScf7$1lijUNtPnrQzoJ89I31xW#`C| ze`{Gi+Fm5JJ;YVnHt9hLwS3Pol)ek47rxmpjzM{kp?*B=*^mu(FM}-#q|-gESjk$3 zu%t5?il5*-Yu-P^?utX|v2>sYaZ|9I>O zfgZd$@P0PlZ)z8Z;eAt=_cdkCZF!E~`vz^%fU<+l14{>&X^IBx-SN)N?+&@WwE4#* zlgpMavFb4CWk0<49Qi>~TDSPb2W0Pb{D3lgJG4V|?fAy*K8Sj{s)>4Loehi@k1a&) z>E?yfIpPj6L85*IR`l&+cGKfOR-2us_@yfbR5S-2LTPxpvE{30^<7Q!Du2bNlYS{#+ZyziHuQt zquFfwUclx1o!bp2GV{Fi{ZV(R8b5&^R zk5*d(urp2Z&|+trvdfnVr`gIqN7VXwQgz#oY^if1O01IUlBppnH->51 znjOW8CV1}2VK1=m^`Ewiyu__iasPzn6^64qV4g1H#`es!#s*) zT}+rqy^a;Bv*MkxWv#I?iD9kwpNc!rwAC4qQHhWZ)+r zdmE}N?Leso_v%94FsMA9mFC^YNySN=8uUR-&sH&3&lG>bW8lX=7khZnE!Q5t3%c3P zJv{ZuU($axdkFZgvYrupw)(mMYxSMULoEwL8aUY7SVgs3VHn~Va>hurlbq{mB~g=J(bDhoOFbnA$N^*#7Sdv zhQ^2zuCBx$LXCZZ{dd?4%!W(`+^b0-DJY>l57Q^|%UB!PH z+;%tx3%vxmV{jk9*%M(8bvn)p;NtLIg?AYo@gfxGJofq+WZ+Yv6|6GokH=2v;@-0U zPrSX>LmzqEL+?|hU~2=qxQ*bLt`BscEk5A>j8pNx5AcwCaE{hDb6Q$F zy12W&_OQ}TLtXPztc=egLQ4m>=_#giJ82ke@ESuMkP&rGpGt0*6|FFhM>c< z>@4w0A8{u^)$d}h{g-=m;&6>m5HK27l}zXH=dfc$*duN^zOD#glkjzEu$oOMqPCof zwmgf!4cIYUvUbynF7Bm=b>?J0YO`e)YSEPznk|!EdvE5MckLgQQx5x(yKb;|0i{1^ zB`)YcYMuM@W+QsZVCQVD<$qb@oRvS*fe(*z&|LjWk8dS>X}>`E(`-GL@21(n^20~m z7iZC15Z>qRZ9Wulk9(iCKAy_77%^Wh)y75;U(LWy<+dN$dvDH=N8G_r{~Gj&`{>hu z;JNqHetITY(i-cw@b1DRkRBs^DZGRdC!r_i;{UpW&iZbBP7+3O_s;_A0nDVHy9}%% zVY+rUFndOkSd*F)?OD}*xzT1|Cv?bsnY`Q%;PXp}k)rOt7kIZzDeYNCt# z7k1pV+WNI*Ko8}Nr5=6?`^zq_0=xAEiYJm1tFUvvDD2k#!zN*+<&*@Xlme}sKq)^I zQtmV>8?e(vtsZe%r*HHA_?nCM@Wp$Y@q7L(Mv1|*lbefuIE}O?qwI={>UQGP4tN^W zdz8)m9DQmK)<$THD|o{u3@~_EI7jH>-ULpng>!^1?v2MEqtzt{J%)JBwnZQM6_$z~ zJmUU|@O*?r;{UXP{Txs~5TJew|1E;Q5;f2f1S9RSl#pKN;)X(cp^FPJ)7+vkQ$O`L z)7;_*oGlsw_v~*aW`-I%IbYN$0b#LEg|*gVPJ+x|7uSZFB@{6fPsOOO?c|b${ns56 zF52f7Vn2X%PUD2%=4CQm7D{>r;q?f=@>KYBLzVGoA;zcJePfLWZ4|V*iRyB~ zM0KeYa;ZT2gGm3uQ|YS=1;%Yc`XUqIqQFGB$Vcq;h`sEo*dH0Pj8>z~NafB(oJEKe z^HiL_8rBH#)(Yjx6v~q!lqb!!8J0jCLg)&lRwDI-r=*dl+B1*N5n{|k35VeLc1yG4b#yEf^ZqBq)2tC zSE_53CxsZF&{zv44eF=iUaUMI#5jZ)mk~qPE5?b+T|$if=1syo2dC|w+)l(VM*O+G z;ulqJXs`)2dmC}yMx0T-;%uv2CBRBUjAe-7(JRIuD;EkemLNu4Xs1gWwp%WAs(n=@ zD}*Nr*kc9kB_OUMw7FN@7c13}Z?zc}4ODV0~bm zH;$aXN4?@~)8(X!UZLL}DHB2~o2VpZP1Ng3h4LJ1`YdUGulOgAfKbnsrMkzj0X$`|~zn|28Acbm$SKIjGQgCptp9^Uf?tkq2o_ht*V&^CRP zl-(=lACD{)%DJRTpR}=8sP@S7LTFOc801f7W19vYCp^Uqb(zw1#i(l7eD6;}teB?v zlTv%ZV2=zJLc^Q3BqjF>efG$}d(1OG)c(`>qj5}wx`D92x@l9=%e`WT91#g{q)qFR z=JpEhf28g1pM`L{?Tw@vy}~6&?%bvFH`rc9O*(|S)Pr--$=$LQ0^1)Ne-`ro(e_%8 zj?0r#aJS;(-G;kV?=NjuV`M{_0IS;eQjcwpCvm^4I3k1|vo&B}V3;Oi!r?;TEK{Kq z5(m44Q*hP*=L6UD9Atpvan2BneF4Ig5N`rp0>UnlL-L1n_<7(x1};0>DW|j&?*zDkaE>hOQ{cA2t$+)I zlfvE6Vc!Cm40r5V=s)7!^d9nnD}&nzw-7EG&L7V7F3JYC7cLVn7OwLh$SJ{9z`Y6= z4L1<(>f6}cz-@=ifSV212ky?MZk?HN?|^c`zK>@P=2SQ7u70o`g86VbS!Byz)CH}X z^QWt!JIBge{~A7n9&1ho!AKtm7&n4@yb^s#^J}*8$NHO*k>C(LW04q z@8Yg^Yyt;c0l%${4D>oevZA!1M?DJ})h5m4wU=?mv5ogpU*?r~hvFTBcP!q^@Ybkz z@Gq#t%1H-$vPPteN}yVjor4$4`{Z55$;iv)*Vg!#^~HCP`jzs5yX37eh+|^$%84j(C%4ih5$vpC zeVp3A#jS5#%O|=G+L6a6!(!IbWpdy%BP-&Fx&r#6t(U#hH4$v&T6yanQHmx8mZn6i z9sC^isB%$Wq(;TU7Rdfit`B6lCe@1d#A{k-xQ@CJ_i0oXX_Uy@FK?KET$N^}c5Wgl zJghQx!a77a?9mX#KP>!**v1KE8kcZu4b`D6OZ6TTd9ar7Za1s6mLz@ZQeLdg!*1Lw zq{yITy@Cs#7qh#CQGE($_H)#8N~MK_yL7F%h>293!}+%)W$qGz>g##;-4Q z1@=I{^txvZ^owV(#24!1f*O~W&O~10AAujlNKi7V;V0h1m&$q#nkAiFj_EqTNXe)! zoBc)9di^u^7-y7DWU~94@L6wf_YDqXI14xTyCd+!8~>gcRDN|%zpDm0>$PzMonS&iX6;`+h8F*GCE3^~Yg-Xss(PK|*P8M%~FRvAW~A&{~-E zSJ&Kmyhr=2M(0@|ZyzVoCo$Kyr+`d#S15C9)+E-=_o<@WL6J6rB*jQ87sBfNF((ruVCs`H!SiZ z>Tll%IJMy3b9`O7GHK~k^?AKE85%wv(Ek^O5Pq{wI~x?N_t+%112T*f_A{eG(0=RW zye#$iDAy~nr-Id=g>wDULhXOSLX@N0f?mLozLgaHTqE?4OR!=X&G@?fVg($4=kPq9o*Wc@jcqa-E9+T=mhuT ze~cZ_^y=iI%$*IRXAYaSA>rFagSE%?i{r4Lme^`X&g{>QoZ$@{4OH*qrXu4W<44A@ z9*y~KXxD2yxFya0_2-Qjjh)ba9@=BWvOC6CwE+U|8iiF!95@P{TrBLSR2sFgtFaD_ zbSK52HT+o6j0u?2p{vxb!$dkwq{k%KU;HC@T5o}Vj7GXYz-BL;JsM~0<3W4yErpvh zO2qs=X)W51EN{FIT_#C|8#EM2&xdM8^GLWhn02e{UR#CPKx#N_ z^?-a-CuBolx%T<9@vj)3&gDR_Tnc*SlG7`ft*%^{VsW8op#O2|r*B)zv~;#CDbNSt zL~R~U|C0mzkwnxFX2~?*tM&0X;#{dLzr3l^cxecK{Xpq7mH|Dz!_zen46gMi4YAFg z+`FcijZ~MyT7!}Dx@@GpV$7aB_7u9)hzvBQI&ku-Tj%T>9HZ*{i0)uIO`YM*T;~+k{&-sqFFg4CK}`4d?>!X_ABuI(jk*jeq03l zl$%|i2745m+q`--xJ%DDcV5GKX0KUWl!CT1>34#2GQ_Xq2T1OVRF`aC-U+Zeb;;)K zy&*x#l4aLRus(GO)~NdBb#iUcu(}(hz-a{0e(R%tN8=zP-NkwFL^m%$-yZbeR1S$` zMnz{=(k!dCDmWaH3Xn$&?!ZdXnd8AAv5IocLJr+IKFO&&cgpcJa(p|;ncvAr6LIR_ z$$c-ZGqwx4Z8JF`E(?+f5UI@n2_nJU1$faec<;O5l?(8a1$Y`4JpUl+e+4fU@EQZ1 zM~55X@z72v7rm#0K8lS7N8ll$bMCAC{Z?6>F3 z9VBV5n#VGEFS6huOrrH{2d9QU?kGI=Ka%;)02IS3aVe zuN2Cd+&lx{n&vn>m$|SI6X2!#&poOi^jJ0|6ami4hY_ie21$YBiUe~@@LvLsw}-qp z$MP?+q)Xfu*Orkz&2fEPVSEAX@x`?T;E$I;XF^gKAJ;Y@dyXS!dUczZ@b^ac?;KV5 zdqep1%7!+D3fdHsBE)={mDpA_?t;UjDvZZ^K@!)-XZ;i;$#pMv%VAV9XfEu)DpL6ezqbOoI91%sV98soyz zg^r2PXU57;z|l2WAMM}_O@yQGp!v|jeIwYb1J`V@_kYn-uu6OY-jcvw1|5Ci>?2JN z3IB%#*axtmhsLAgw=IAALD_$7`M9QjDkg-<>xY&vjd8YowCzdDFGsEN6;!JZSZi{& z{L3BAmOuVbWE`31R}r47sO;c2TAjUKtB|Ok(f)c?@)oRHch7+|C(Yc4X-Pi9X z3IS@QR*AlpKkz@zP&C@TFf(;>Z*&PGUXWFD`;Fvn2WM~e>*<%XC%Bc;jAVj6b#Lrn z2H}h)cAz)T8qw<@#YVG{oOh12RYG}&3grp1d6#x@3Y#0A18sxux~Ucic{Yetg+a0g zw_s@lddq@x+H4-l4%olxevdm`1}?@^Dd#Odp7@Qia@oY(Gki7!@0 z71&E)UP6pfh>`JBj3%tceP9`-0~P=&-ZsSZK)i&f;#mzpVg1#?tw(qxc)X!ch2J!M zZ6qjK0m@3mx`J5DQ?V`^J`rLq6k^STErkx;Oc96YY(ZaNj9qpI$0Bu3Xp3t{)m@h| zoMTW9F+$pC#K{abJ{70HuvI8!7(y3?);|^c7sDR`ffS| zZ}iywdII0=Xj_956FEW-JFV0b+pW|R+pJDZY_Zn#?9!j4G*$l4KsXQ$HyN>}_Zs4Q zQp=heiCPU@TVFF?3vd9Q~9{3LW@Wf&mP`84RO z0Hqpyo(}GF?14M5!=n>t=NLI<$?VyuKS@8hQr6G_o<8C7ppbsQWmVG9UUhY=Y!l{< zT+8yLfxSWqv7Dakr|#x5j%}2y|xQ zbnq|2I~MOxQ(>nJE)#ApTm)Q`7B)ZOD&W?_v2Y=9Qn>n6uwMpu5H1Za3eF#{WhLqa zR|%H`mjU+zTm&51cDnL9(!h}&r)0PUIKupwX6j`Z%wat?Wu9Pu#1Vg?bxsL!j+ux3 zoAw=WL@cz<0rTL0)4sAJ_i@Sq>MuaZG57m7?Q5_2*Ig=u&g}JX+V@_?)w`w?XZv2l z`w(0<+zPmhTI{-~`A7avyX6>Jx|n=@iS6UqsMP@Of$cO94YUiCMMsDjnU#h3gN%(5fgsa z;DpI@UN&WLIAZx(I$$qXt0jJq860EK28%O9YT>!H%{*5Dw;HFE1>>Ezw*qmFkTbkr z#ij&t9`PEsjrYn?vZ8#l*jOm=8alWYmK3f2vnpz{Z&sWIXb2nl)2abFPBogGU2fc&YMTobp`3dK}gUc{)3SwY8 zGF`hdh)zHHXYUJ;w?=zJYWqGzX(d*%CoCstGHvQC(KAd-L>BW*T+8pX=Ci9H@x+L4 zyd-Zu>k-Vx0rC=IXF0(%{^(-#h7Rtmc@t#$W*g+Kjh+*+^WtHFL8RXZJB!3E3CY5p zNm^Ni^e6Dj)#S4@i_T<7_j4k?7~g57(wyly!|C7_n8-F2m4~oA+axWNw-;@ki|>X` zMlUNOEryX<3N{!%b?|wSmEhj04(^}$R*z#~MTX}rC>@W}e`x{F-No*g$L=5Y+PR;b zsq8nJ2{+f9e|_%oo;~{L&7^<2X3!^nU`ZCweTh{H4@*`m?e|IILOt#uaGpg>wJVQy zpGE{2v*Vv9UemGgb7JUf^o^i4A?#93cCk#`DV+%V4HY^)&IMF!=cBcxIfPZ>eGfN! z77}jbP^Tjg7r^2zwH@`0CfMa>A}1O=im42|RVkc3b#P%1l1q6msd>gpiJk#Yf(%FI zU>}hEUV@~UPoUEdnpr$dWPjWZUt-gp)NuBrR3299MX->~lhqr&I=VRCRJ#C>ZZy*g zR*}vN7~3o49B*?$J|`(=O8gD`!TD4=xucNO!0OPXV&~)jGC_7j7?-gob@bojEwvIz zBudayB$3zwYoi{3scd$`b7*s7gMOK6?GFuPrJLG!AkJ18wNmr3W)h@zF^=h8piGta ziw3gC&O=)=9sTM(dv@grwA>i=B*EaKEo2+aKykmzM;X5XSPmkHEwFKec?D)mtwC4g)ky(GrcUs7Ql; z-9)(D*hIKo-z36wT~kz2#8bU?umS#!RGaUN^sIF~DgR|n%R zLE#5uEmo`OS3;~RA>^l3Ce^3WC*&Y)8U(Ra0jW)7M`Ck#B7VIe4aMn=`A zOqS;@%yAzHDRYgod?sI#Kd)gzGH5XztwUsZ*M~zUR^vP`cy$oyF5K+laIavEu?+US zgK*9b=bX<6VLn$r+rPpyckmI&$Bo#O;3mxL{?GbgUY7~;`fg!f=ea&M$?jn2)Bpp` z>DrU0CBV@gSRBL*fU{v!7-YL#QdGNp=6NgT`9Z=wPxC9)|5LL_&9uCqErBf!vPW)H9M2Hhas($mi}=Lk^`qHw1=BeapQQu?N5oIpJyKs`p6MG4g7ET~6xn4Wb< zjpeyg7w!05pdF-%%flkj)3n2=`@KLr@^#~SXvb-Rc2KL&HWTew3))es8>^iT+Oge5 zJJ2J+W4h#;;nRd!FTqAM<9~H;x@bm)Kr>=J$33ALBClOINd?t-OQ0I50@b+q8>(^3 zGgzPraRST$8;yOQJJ7TWTnXU9_Sci71wqu{cUhzd@!Zj=&pa!v?RFfP~1K%tWYU`E7fF?WxT!9+soYcTW8Ece- z8r<@v9mk|Wb}mab&9Eu8Gh8R}Jh#H8oo@@ohVgRBT*t5zD_mXNmUEfsSK#;EZ zS?7bXI9I@e-Ap)e2slujlNLWsoeeQdm4_-eC{Y|n0IhDJ5GXv%@nZq3G8z^DVSH` zB&6zN!ape3d!S&1t0eQA0tK5|`E7%=$QRo1!R$q79w=DY1CP`rMx*&A&nR!2MJJ`X z?s*3q0@th7wl{d;7C&bWTPO#mm;Qi8sflL?vmAG;89q9d_LqhaX1Vw9y#+dJ`R1NS zp$sEIz@c$2dlK#!qfC#xI&|Q(!iqmep4CJDQiYOTf|h-`ynHzic?23w0ft3biSyjp zM>Lj#U1KTY5w&idl~Tr9eIUiagm?vWTv)S6{hs}eBWv!VUX@;ZMzS^hjALq8qVkR8 zp|u>P{n1sYpN+x@^9k>vkq+x1qpaw~@<>fT?L6%%Va3x2JANKqFv1bFugvPDm!h2r zPwoQ!OM^ZF`V~&-u@-`i0H{ACfI%xQvy!H{s9^VK4FMHwgG?;i*g_D0FxG=c`Ifoo z>7hj^%`+Iums;qmg@w~%>V;bGG*LOW{))=(c2U{A zpt1^q%5u;sBY5u$WxF9jxF$TmGp-Qc2IH%sn@iw`#ty}MKlade*o~qy`D$OtYQZUn zVShLjduHgqZ+QtaXajJ!8(dyeKCnmB_D?u>&x-H97wuS)y*S> z4Gf%~xcqxod&nyFG9)r>TXlyM;|yd=7`rj6o9iA~%r*FS-XqJyLU8vzvOK53xAPuZ z>>}{(yhoPj7U0`?k8IU=%=^{>yhm(R^h;)`=p|k{N{YV$ynAc{{-t;i;AOFg6BC3G zS?symceSVD-N3c1isoT|@euZ%leN*_&||fs$4`TLc?N9ab7er5xyjUy|=rSo1S**lkegLQroSHLT?cN1_|I zjkO$C*36vqK;NQ%I0iNq_<7*Hz-><2;_73&(Z}4_3pms7FRa>dk6wR9>$#p8=>tnM zgCVu?zmFp6q@6t!?^fHdehYtssfs=n?_)^UD%LaMj@t0lV6-&H`7}v+na`p4w%Rpx zzwFjyiHdUxtgox3!keid98M((f?3*Gr`M#8)RHCQZI4FOA5NvaG8_gGtfEV?URY)+ zPxUNw$B84&kv!*%n}*%lu!K|8?&~?|RY`e~_n~;cRw&u?e~+JB>kis<%Crc$IAKal zHK*cybh?KYr@3nb17Wws&uP;G`=gtp$s}{(tw~6l?!s$-S8sf)c7V_q-607@Jpp6I zBvOwwtWL$;iQU!o}bs&Q{>svuc%(LfUG4UoAL$}gmwfpkeo_X~XAJT4Oa zhyujH?6zxse#0X&LCx)M! z$4)wq6@sr4_h1WDSMPE9W2+Za-IodfrS=5NvZd_DtXm0b$<^@w`>USA-G*2JMyU27 zr#%=qC*sdcbC&+{@v7&ZgtXOy3$s5%JC8kpd_vfW<0G}SKIXW#CXdr)R;iH3z1s4` zWo#Xw*8#e&Wp1`q{~GI)_cHG>`3%;WaoIk3D6QruBwqXEeVmHBkvB+iGl$asOuT&0 z7TzPLA=NLJX$i~r%TuNK=cyo7732N)RCidTRi4V$InZAWr<|sa7TKZ%w@;*)v z$UBg6$?S7_@E&RFT<;}`%F16dw(v1IL-)W|Sk}8lxj8ATYxtaFWalC@_rU6~+yiSanH7VF=Sf?2qV4e{yBdLb+MHk3kX4h2T(Y$} z3eOy6ROu!2(7}<2S%8>i=VA-5%Tc3;9LQ25Mu9RacPu0~PQhjlS+XC=9)XqYe7e`1 z&(GPx-%(%VPa#b~&cwVL^Mvh~yFI|g?07;ErTFfqh>!Ru6p_bwH$`m2cQ-|BDU|9jAr5X?r&+TaW!I5S zDs@&L{TGf3vDeR6$rYM_4!dtwqDxFV&vpT*A)bCsTH`BX@AUgwWAGQWtl z$Ye_MKRW+hKctzBG%-S&aA;2|kcMd~(4EHfrY-;}eEiDN%Tp*to-QC)ffOr{Vy-in z4BVxS6mJ=hBmOm=67l`~BHoC6oe5uSQ05Lr?6(nH>x91=Ho_76CBtHjG`%hiu@!!0 ztIJn1;V&9ObHX42osZZ$kx+v*b>@huZSkVQD8u{lYYktRhenOk|A6-W0=8$@pNz;E zh4>XY>cbQ}PFN{S=0D@>eSJz{om}-d{+MqGf5-O=jGI64CwwOse!-u@c$PH|Z6F-( z)H!j8`%?9EL*Q%1_v5F!a-keV`cb73c{RqxiHQbhNy|ZVbB=|TmK%>l?$24*$k&JN zQI@`MJRLvX;KWvWisHk7(sW~Cyt~1P@yKL}-VZsjh8C!LV!+NBN-9M; zwwvWe;o3BiG;xkk!Q}?`yd^jd}15i5JR+U5uj(7 zMTKs9WrGMli-i?SGVXtNYgmiF7=$k~H$hf+Z4i}pq4~#qH2c63I(#_XV*J@X%!J33 zn6Z?{WQE?Xk0&ny)&Iu>anb$&q9{Y^M0!~sQH=NO#tO`p$GppA#l%J6aD%}?+(}y% z>0MV9i!Zkj_ zQndw(WJUALV^kb>4&i6-%8JAV^zTgbKk)k+`>9|1mE$z!%FR=~((gmubD+R0EX+Bg zznP%Dw`O+p+7jOhV&&~;H+b#>-)W#5tUGPiY!Gx4AZ)VRg1ubZkCm zm{VDin$4IYzXA^cwrkhs7i`qVC2rEBK~i=PB#k+6Nd1m7!3B^c$1cGduBHB$Ud}ayRLwUV2KFm-N zh*iy-Skv?$$=>l*vm{}6qBFbgLhCT`JlrL{y6Y5rZ`^%dmaIKyg>XJC4rU$T*Z&Q3 zhmy{#MYJlOV)|P=S4(ZN5_U*QS1{AX$-3CH2WridK*~Q+;Cez^Fgmjo93$K^lMOqS zJogpk%VtNv&=1#A? zIhG{>GORUy&M_)4;lALw76tfvQgz=_;$#G~GFXstdn7BMn{9T*`~NDQC~G(PBh=Pv zR-d4+glEQau=^-)@3Wpxv1mk3V~en-c@}o+F>~TB#Sp>2 z#X61M4}Y>>&q2ofBiN>5TE5loFU&3#1vF1% z4W=X*N@pCL8ehm7_`P{gcY@HM< z{~bI|ZP{5`FYU*$q{4Hmj%n-(K>9*}w9F#(U;LMv-Ssht6`2b6sKVmF{%b% z{il0kmp~SrIh>9vPXE(96#C_#t0eozvi}rzB}CgDID6QHUCAbm2>n@!A(zQGqDR!M)Y=e8a|>Z@W%ou!rDp zK!4GJ`{xOUOn@O4U@(>!8>mlDFn@QCIHfe=9h|ahdqc1`yEIw5rCbEvk|<+;K6BK^ zt+68Syee2ZWiVrg;Us1IVR^g9#`%!;p3nP_n#*q6HJ?`mQLo@|$7G#(o3BSgR(!NU zG*J{oR;K&$qNyLZdWz-HCK5#yoXdhmk*xUpwO;yfPs{Z?^N^yySDsf9wN9tmiD7>M z!xiSa@GHgs@$;y~MhWVoXnw;eMa*e4(Q>dX&2x+Sd*B!`k@sr})=hBeI4%cwv2)x9 zW~$YdX2Lzs6E@bFDTk(}CpXM>k8!cVfz$CiqXTE3 z*NmY_0WPZ59o}54gm#AmcG`v|^?xetU&0Mq4z9%((4!U7o$h<#1}z6pRSp^d*Lci$ z0{m&TzxkB$6Woi*8=Gc0_jMVbkgs@N#4wK;<^z1I#gOZG#4yDS_)pWJ_W`Hr#9efF zC*a)_4_OgL-m(x%}K%g1G@htsHk=>s6IoeX(xv6KJcg%kJ#!daD*2VqTfo=E9+k?HbM zr_BBVjOKZ`X;ZE;BgY5avt4yIX<%CVZ?$G*(3!c4-5hDnNMRM0Y1z?BYlegE{oiWM zP~Z5i)(qwb^KZ3gFgKWcYt3-54pC>8LThH(Q(7~a8G7aN$n6*tRjeIKK z7DK%NcWrZcQpi(bcMMmBuocZAJ@-p?L%n9W1U`*}Ti6`bqxaJt_9Y}kDZd%b1AC;A zy2Gjrr9#-GX5SuJr0%dXLlN|!-^LiGHRW0f)|6AhgNDn7TLCu%j&z=V;p|f&{{;ta z)d;vr&hh>+_<~Yatd(Q52McRV*o}(pbN#kS(h@m!_WGSz)DJ&CeKp+|L8n$J#6i?R z>KHJh0fS^WgL_su9ohA(RkSXj)4`>GDtd!#72VDvu3ubBtxl%uulbje{H|tIYhj-Y zzSX*vRBAoQmt-GERi+Nf9DtjQKYmz)cuY%)Zn{ zjJWTjbW>q1dpcPiRu#ohwZC=rVn$4`E+bHz&62h3?-voi?q-Scyqa}ms1$mzf6k^m zvo0~iMK&gnNoS~r30dMd7}!gnuW=9Y&Xl00bB%AF6h%sFtJ9qrx|Q`&IykAv1JOe+ zHUBF;5Zu1>PWn?fDN&}!obn;o@v1=W$FLTR)!_Z5p8YkWjf@cH2doXzgc%LyK7MiO zkfnN{H0lJ%_23HzJ{XK$iQ<70H)ok2^f!92cH?y1p_k#Ay*d!{)IjLaFfD7cu-0sx zDR7`qJ)8krX}39Z{^fy+ZYtI|8nS5~jLHKhS}QN4Wd;v8>Ic5>8Q?-ZZqVTyZw%N~ z_y(;UAYrWtEXA5^E>VHju1Rd*VWO}5A5o1i+hPFylI^<&32AvD@6@b#(ys$#NN;7G z*H(oL0rxlqR#e5X|F%RiPaBvMSh{!-tzK^M{>)6k^5UtC2k2jYgAY|Y=iaGVH=q^H z1P_L0ZGTNkPY!?lRSuhk90nnW1>R3`7?3kS$e|k246_G4DSd8NVA*1v-oA!B;~wob zc9(h5uOM#uKOq*NjKnkkx^tkOYDGP|6MMHt+^RJIR;O_C0crbs*-U8VqrXB@*#Uj~ zMR-QpVtZ=f^Q-(O{hv6}*n;%qjyv=GYbQZlffWtLhHXHDv%hq9p)W=Gp&$A*p#O!$ zHS|47C5vIJ5HA3F)znV9rXYQwFzT8b=??ShIBkv_7+Cr`>`j7B055dg%R}xbp;d1+ z4nP|JMoM|z8dx^qFrCm17s9?1!mczr`_q}Ok8w}IP~;?ob)uF5f#4GL#p(^~udezx z0uMX5pvMH|RHK8dw&IrO6g3;Nnr=M4fIF;#A;^o#LU2p72JPQieh>DPAZ7T0OUm%c zJoPtSeX4Vw;yLe69o(1JzoND@mZ=Bl9JvTRLmg&1(ldmO|IV#|lrdnyQ8#TMRxjw) z;GpDnii9=GUpu?|@Dy0%c5o|&dL}n!+~Y7#RT;2;7!{y-{oW1U7q*)FYc%(!rw%zB zh?@_x*g)9nc5wNPA2rk6mq?YggNi%kiM4JlaZwl2O@(_V4@_5EuN)=V6B$J_*0d!`_kA z;4xVeIo0t~1<{&m>LmlHzF%4?=S#>fD74*0U%T`A8k9NO(ml#ffi^g2Yo_JA4lU-I z8H73e{x`0f;cLtccddu&&77*o?h#|4h0Afo9Iloisl%m=AW}b;4B|x}k0| z5KPY_-lfon&IxBpr&qN58^za)=Aq3#wffgH=??CK^#(sf$pizAx}QddxiItY^i=P| zp1VBJ7K62-90#nu(Y|Ar;Rdf}M1^Qwlk)Tp*p#4k;3fm{_$g!>#>>mXyv|w%K<42L z@UYQBeT&XacS0}B!NpjqCqyI97^N>eh;7GiXd z3yqT)_68rPd@@op03(4R9Eb=9Y9>TfK%+)x^}Sm*(-S;oGs~j^AD5F~p*u|*X3k){F|<&?5S5)1VC}Rxz*qfu7`g@70S8Y1(~O%M2=~`4 z8yi;rs*ZX52_yMm7UHE@(ii1h*1pR`t;fw$7ZFv;!Mi-O11#xcxJxG`}1Cqg&jKEqr`7`g3j z46`5xc6;!SfeV8(!A{Oy#Cf*`u;4;q2cZG}IdB2vkq7J?{0vtOR|K~JZVcQPg2oc| zxzkIq?(M_UUN=zdyji`SW1HjJrUkpR)omW4Irgh-mD+Y_2}*}nx82m8PMXa2KdKDg zm=J?Lb)`v+{;0&)Cy;t>hg|as?CaaHW6)}8OufvPlhysP4EUjgHLwKG-z&3hW&lvXA8l zvyUn~6g(Wyfhd^>clo*1$2qFh?VvTHSZ@Qk_c_G1V{`$i8TE-Ul+sqqs7RVwjXF96 zE#``J@nMm2TE{Ri2js-TCl^o03@a_NWr<)cQXH>RH&7vIXjvTgsvDowJc z9X6+#@C}9%SngRWn*olc^jZn5k8EyvEV=0!k}i$t(4v@XAAdA)raSa4Nw?F%tv1D+TnDL>($ulAOOW>H z1>+Amn-9?XXqIXGGqq{BH~DdST978*h;5dA^ic(D3^O6(!-T&TX0hHq$1^X4^=Ney zwZn#yxY%7EU_1&~@=~%H?jF+4^=X!4HPpq$J`#3-rXj|5&d@l*C{pbd_I*=eXV8J0 zM1qqBJyp{_hIZWMB(%OMpl4im1`Bb`JYWvMpvHfPa3D!!`>l>MK z`Qx19@^g%(xfX`W#@o`!FqdFsg*-r1HUQ*N8RZPt4U8xvF?z73gzV2rjJe#=z!L&*hj{4v9TuZGpE zX<;J##5H_Ngxt{>?7d6wu)`XFJ)(whoHXtJ(5>rd<+1A_ZC}4@Q^I=*9SNR!ZuMmK z7&&^MNYvbTiI33Dv22$T2Y_iQ)sarAg9}BQS`9OW@1Z8;$<&!-s~p@xQ_JyHu5UlY ziEH`04$#CW;wRsbMvq*~j1;w8&DPA6x4)P&SfGRjfL8QyxB%Dx0@GBXFMlB1bpB@@ouu`z^%f*Tr?otvJrQMnMeD2``*6aH zY1lEebCyPeAJoi*1{Ab|Cpr+%fw0cm&iR42(apc8LyIgS8FNW|%js+-D@WUX*68~_ zM$uoFU>*^*%*iHPCmBO#;TD|&CYZ_Hln{^E@u2Nvqj#~Ja>%S??WP1Khvvc}+XZ&K zF+jj>JJ|x&GvPOD1GEHTk;XT31le*%{|SM68*{Q6{f%fsoDKb}fnjFjt%M7QyM{g} zgWq1fo9(z;rHPv?T?UcZO6^#uod9njX^-OkwnHE`_12D-V>yko!{Gq?>L88 zMESIHTP*!>s@;xT3BGzftdG2XOo}hs>muyiv}3Q%go|3XW^D^$g5{2FaqW=Up*8fz z1dM=D82L?*@o{XKCRWmjr!OX?FTTHNWboW+t>Le@$=j|hk+B5l4_O9&%iOu42He(y zo~Ci@lGGEpqL?wC{O!&fpx+TnG0&H1vb~<&N^95u zZR^L$+b<@6)%FJ7pF&RJ12YnBG@?W?-X&roBoNZDt5BOU&mB*6J?+iL4=+nO%QRqhy-g8y&v ze-mM8QCidpK5vx6_Y7LZB6rMAL0d=Pwq?8ze?9!ZL0e1F8i<#k4*yN?D?^`1VS>MU z{Mrln+m4=)f)-TbJMA)mHcsB2iho~bddKagZM?x(?x;$^cf@6$$M=;K8W(cMb=Ui@ z^WDD2_5Z;2_IT47&)@lOU+aqZhAaG*>uqwq?XK`l*T0V|y~6blb-k~oTsDt)o1I4` zSd8c06b;U}*QBh#_k$EIo*r+`gU?#Tdv?QR{;o13kIvG!=|-ZjZf$Ib&8Ew|32iQG zyv#Q;*M)Be-z~21PU~gf?)tVv@9CN^YR)htS3>LI7Hsq-8)nxt=R!h47;-^DL5xD7 zU%*~E%!QaS4!|~QHt?wREqGdS2B2B$IQfFw_o+G zyj`3U4V)D~hBpV+AJ4uXnj?3t7+1p=W7hg=q5p2VBVS#^AA1SCBsvf=qsI^3BX6%r zso@X4j?>^(A&6fw0izNl;WJGn;!FK%__K(AX?%D-<_ZyRPfSG5j2`kKsJtg+n*Jbf zZ(lVW@=B#hb4nAnyN1trN#0)e`q(`f^?-VQ<(PcT8Hw`t))lIb+uLV;C~yBFMU5K_ z=Aw+>r3^#+8c>4$fOKtD1pX>hM&PE2b$^hzHNHFnvA|e6OR-L}Xc41SW$0=_xGPwr&&ZRDGQd_O>$GeW&~M{0)don7=SYO!tw zMs+C0E=suVb&cLaWQEY;p*CarioU`v@}0)WFpi;3_UURv(XEs*IMm zXQRjXt{AX43@z!kcZcl*wByb|!b^>98*sAy%qrl-XJ3tN3ox?vCjKn)cHOEPn+{mX z?xLPE1O4W0;N;y+)MIwo)&nCOmr_5$C|NKCq3eK+wXY$)jcv8Q#MY8tVr$!ko?BLD6JA*{yXpM^}lhaaM_~Y3cK* z$u!i=vIq22GJ5aOBI_Q1;A$S~ykL_VC+k{ZD(y^-Z3S?&@@9=q1KcEc?Xb-TCSF*2 zZ%=qhNI}DHV@^czgo5cM|H{3S|4REoKa(8!NiRr`o-OTXcrJUz|bI#k` zH=eik+4vQGo84YIZ}x!m-hJNO_oX_UDYDLHnOtJK8(Cs&m|SC<5?N!5o4mso0~}9+ zf4z5!?M~o3%b#P6zh|@V#3TUwi@YXN&0Xv*lj_{#Sti zPRduv;cuF1_|iJ$E0p6al;cmD-I@~34$J~Rz+s=jv!=exlH$IXicJz`3*55ezE_t1 z>i<>zzfv4n@+8J<@Ch%jL^`a##zhv6De}h3a=|!SUuKL8DUi2)IWH35TgDA7RN-Ab zPNJbbnRn(6{>$-_ z%QcKD81Ho0N0_FG)r;0rSua8k7f^k6;yVeqeT*&{tQnynRzP+AdH1LiW%2FZLkowO zjMvwgf0F$GiTcMA>UQ1SJybJ5A5}26@Y#|<#hW3QgY_KBH{`=xyRU!9jJTFRt)p++ zd7CtSZn2K{s2-sS+NUo3GvYBLp4WI5DE2}AxB8iau;MtJ&;qxCBMPSB>pZ@;phQgY zL`{}vCR=B_pYwtyy0$~A&yAFPDEsfGFhF=i;hQcos zeruP?lKtVQgkK2!GT^s*DO)tYAZ&ST@kLuG{KJ+e?ya+F5t4=&`y=aY2PXS3pS#?* zXjTD6=*v5kvG43BUM_DBO1@|dM~aB019mOS1x_OBY{iJbcXAz8B6V1ap#G7lKmH5g zUxfET?>gHd^a&66d*MGH{(JB~`)wW826dqFb)fPkpu;7g!zG}i15UV!R@{GG1+100}-x1ngGuir9el zFCfkI&B{VIa7x3G>kaT}&9%hSbPE{?-ilA09p|rjPm?=B@%^ZAKmop{JpwO+dWt(^-2 zpC#`837qaT(4Mt(cdVX*W%Oo)O6vm*|1PU9p7XLKc(!GWBY&x-vU%n7Wmn=(D#BTu zd5&Y%1~+yFG}-<<#s}83MV^==JqH-3wN;Ir*2b!UaZfnthAGa?NSx#N{LLq^3ZU;Z z6DeYZJHrk+(|aSmH>E!vIj!w^O7BhS=~l51Tn9877pPX?bDuGkUKA zI*XoZ@fPL8{}FQ3y0(FvnUPy-=N8Rz1irZ&P)g!`VEvO(y*o^NUf= z&}nUlC6ps#1vA0N5o=nDNJM$jn;FTpByINBU;{k9oycNTP4)rJiYmZVmmD3&q(yDn~7LE zZR*nm&8v}Gb4$nk2Ko~>dW=5`nVYgK=)4N}e7Etu(GJV-o_ffDvQ8Ps9a-aGUww-H z_voVvSZ%2g`Xm!UQs@#_uY8yVSrMFc$F>o$dZ28f-M1HJVq;#{Mm-J!F&Uq?m zb+Skk&fe!1HH(JE-Jg*qik29xfBDIsX?4$D8{}qivwkVNzwIXezkyuM?1|2K_dWZn zBUD>?2W~uz)U{=0clWgo`0DO!jb>+G%e9Q4F_Bmi?`-N7m8@mkVXfeAu$DbS zKSVqF_z2wVTBx0gIcjZVRDqpKwua#Osx=(XW!6AE7g@*PxzHMk=R9jXo)@eU1^2lL z&BO5hrRiDnF^$Hv+B6E!vnKGQeDA})H_k+u`&@MM5LY?+q8w_JLv1B(XFE3vTKqFm zo^X_>wRVV5o*_NuiGcLIkH!ujmfUd=v9lXP0euTNRB8q}q&V$z#K10x9a1{ic?BbH zf6e8q6nwn|zBg9>^Pkx8z<9F`Mh~4a-#4A?5$%Gtb~|S$zxMelIjQ8=4_1rpuwp^+ z6!U!{+d0L4x_lQb7umUb+$eYQjIaLxW9@C=qN>vP@q1?m7+^pIUl2%#0Sy_nQOQU# zalji4Zlak>X6^Xe_>z&eMXsBJ+HRQ@LgoNksO92I3YMj1;hMRe+yGEMirn^n|!@lX?0z@sj*QrFKeSmdNIZ@(~eRbs}pru3m-n_U- z;OiayEcf(FjgJ%0)?|PW;-+cBD0y?97y8i|lRI1YrPM<6qwM>Ox!{8|KGzzj)&0Kq zr=&#=N!Z)Je7)w6J|^s`?}HN5g2y`egC2d;wg5LdF+%=LM(w=@byK{7ooJb>0XH4^ zY-AmyN~uXMk18XY-mo8Ib8J=Hn$8pZLwuxpf41owUv&9>=)#-`XHv@xI(Ro`ugRU- z{i${Io*{+~ct%RC%NUL)TKz{4qtn{R;8|@4>=v<;BF${tom>*mWFgnC!$`6-86FFr z(b8EhIHc|0KQkjIciQ$P)_&%bL?#%D>{4lhUW$7@^o|bLHIQb^H%HZ_jT={ew~vwD zRek@(;9NjDjfud<&LdaSrqxP*`Fdr%NT;>hhUO$L6IvTogUPKwGNP9JeKcGgSC^d3 zszJ+XS3tK{(k@uRZ$b7-T zO7}n}Es;1S_-q13`9I)SuPhADQwYBX&)XNPF-MfVA6y}IK+hj5B-|xm1D&;Lw-ZM_ zA1FkuKwN-$cJo^iIC|Mv$Xl<4@lRa&&_&5qHJ! zHAe{$-vQz~NPhp{%sw6bG#a}4^%k_=@$DV3 zzee92YzfyMYTIALwk3(P^B~(kYdp^XDz7(K2ZQ&VaxVM1gD>~2`#BL@^a;&YlJ({+O{{Gfwh=(+PEmD77P7o%$iVl>Z&e_qr3(=W|Hue~bv8gzXt zMvJwK+DkmodY!&v{?!}&@DHY6dJ*N~%#8miY?aT%Z^j$GZu+HJ!mkgI7K2}FI^*`< zvJLm6pp84ZGivXoTKG22ym2XP?*pW3uZONZ^L-oxovd1I^Q9|$3ezCb*N~1D8kT;PA;G$F0!M{qF0>(b4Sc|kVRQ?iw_A;e|GXkPh)5#m#iT_;X z%WjO>Msv(j=NCAQQRJNqv`#!1IIDiTppzecV=Pv-iYcA^Kd%I#7q@pnD@#)s_sfrZ z(zi;){B%FYh4@9d`x)~Ptr|%idF7s|+qg^b&8SPtFnk|}drR|J4f#v% zPzabPb1d%p+zgyM;ej3J%!uuzI1*J)mIny#U;-SR`abj zx9(pgO}JD;J?H-bZQdyS+9bA~@jkwmzG|m$hC~Ye=RFlOCt|(np9?)`skhSjI&*U@ zFn|e;1!_rfEKpi-EJW>DAz+>`{_ktam?0Ee4x{tg0O7m?)+p(l#^RfPITC8mE#2+u zGzRNoya55rq4p?*_S_=qx=T_6_E$N_1k zNgR;7mR<-xAn?C-%=ziSP?D$kXH{)RO);=ma_t6x^8MjnqlEB6Hc=+zlT3uzi~s2K=IQEA#A*4ulH%BEcgAvNOhh+vmz5aiW3d++KE}9Q$wS% z5@+jQ;)!OTPX76;9B~7Ir*!h;!Eb1E&c&XU_)e*t`tLj_c}I6khxKSF(|qKAXzO;A zi9s7(*Me;hwKWGfs>mxyo_DiRgZVbKqTV+~`u#zb{iTp(3b&l@=rk{glnBS zgy}gA!pc$@t+N^?Z3Bm$7vvq_vn;D={W%EHUxb+4`5F8JPd*$>9n_uLhScoC0v{6i z_UMND$t%vi;6Mw4bToC_oHl{42s_N7$Om5;2aa;@^8%d}Zqv01Z4uyOkx!m5CT&AI zq`?~0hUkLQp&js#802JkT)xguQTOb|Gn8tLxlVKjm;Rv2jb46i+$ zdbbHRrR zYhv3GpA`4kv-aoK(k&3`%|PHf|3Ne1U1cFkCYjD|V=k?YFsc)dj5g6Njy0VR>{q9D z@DqUj$Ri0Rb*g0+Zo>s`@E6}#qgO_|ir}9$1M}mR!$kM2dd;Pb{lT~S8fZmKE2c5`QWS5FE!bS>EOv*1ER0WHoO{PTD_?K?li*RDIPtD$xB z?WSmh1n*_X&CyD|QmMo%m6SH$tBr<6^4(}jRC7A?tG->VK|k!bX=}fQv>N^T-rI%` zgxhhDs&FLDuh!pY&R9XVENJ(!8y=-FH@F&>lPwHN8TkmM>~Li)BYPS`8SGj*ptIDl zB+M7Iv^o-dmJYtsrS7)0N)`kD1R+-w0Z+})*bMAeFy#zvW>$3cv}|!$JuVd|Dm>YlzGRq z-TJ(BBRsY-%@6$p`i}_jf66dVBFs5~ISgR{?$VNunw%@UyXEQo~-$6?=9sFnbUC5Hfu@3%Y{0>^0>EJ)SwizCd)+6M6_>+$1e!^%V{Ymi_UIQ~c zbPKP8A9)>ndsg1i!KdSwhKq&Uhv!tuv!S}yD%N8-{71TW- zH_6nu#hx{n>rT061DJvHXtItse>PDmmk^XkV86P^w$~n zu)Uljon=eH8`gBrJpepPU(nuZK4A-s2PU%;xeN0Me|qai?c*C&4_@?}~2M|V6-`EteGRtdD3JNTlj^4&Ol!00cy z8jD{V{F;1~sfiFMV!~Axzw}7E{pvQ1(j?PgF=|s_u|sN3fz1!dK|$ zSW}$v949;AY@zR z+?qB&_JrXPK^otKd$h0~kGoEBxa&mJ`6liPJf}@IqzU(98Lz#9@vW8_x$WBLu~Po2 zLbjJAHEeZws}i@*6RyLGp|_m+g_|-uI%}a&!p-9)WDM%l36|}Cbp9)JI z%Eaa@F3-EwIP1q3FiNg~ddjm>p+P?@@I=;j!wx-B`wnA4;E5ELD+sIx9hD!A@NJdC z!a`&H5{#h~lQshLAKAXA8j^7mq|e$u@4~!Ufw@_!OI3n3ss_|BSEykjYS5#GcZ3=u zd^xOgnMsSWl)DCYpcwDZ#l>q%LagD6)3ok6370Aj;eMALIRZjvsOL%uSpfz~+Md97b6&Rrcv_YCJ zKyM=6k(Ii5{$e__+P-4P;^*Ej2n-NlQvjQI6kaIt?g0T=E^%VAy)`SaI%f6c2;X|l zt&p@!@tm@z^Zo-bK$_DNmpi~uR_6}k9)jhlxyZTso*kg>6y%&j&LVU0>qFm;FHVW( z*28wy3c%dNt7<;@E?`Ol6NQ|c->g~$?ueY{t$)-0Rmka0*RMLMbp7%RWDBa1@b?5t zPVP)NK&|av)`+s@SxUovvI>Q=t5a^YQQ1`}o7ku9Qj|^1Qm&X!cB)V|C1tTt@2x0X z*r)6)lr79sE}Kslt59}YZh}zOzn{LbcN^|PS$$Uhk_%)*3uPCk{LseM&{`n-iljy^ zaEjZm#O;;~oFemz6lpYf4!Tvrg-5wUU=Tu9%WJp&kEuBjdqzS9M6-niVqi3wzlt{x~4N@f22+>uFcZK`|J|S zaKXluA8S9R*#N#kYk+dt)+o~Hf;0EsYl$~-)9EfJECqrONSXAAR%nmwH4j4i2#I!{ znaw_mQ-a~#QSF-!S(v_Ma&n|k&K%IfeiM_?d>eQK6W8xHW{aXAv4y=&)|^)UJgoXL z=JQ8B3&?O+@#Fh$(~TC}#)@sb8@7fd)VjYiswFt>>3{`RrjBa-46x8D=KTCx2lG1F zh5Ft)iDO#t<6yDqOqlP+gh7EQ;5G?u>$L1l*{eO+GVVc@I@Wxv`Yp@ofh|+TT_0M5IVyFX#b;IMqWZLlW}{ALMA1YpqEH1HWqE<0PjpNJt_Wvm zVS{8Eg7ZW8uKkE%wh4Zjz+0!7fWNSP&v7j9H(0=*67Rd<+)^aL*)mBx{rnzxUehZ* zo_F95M7AZoj>Vo_S`qfTWTLFPpE~BP=*^7(A4XQ4Z+XA`#XvUvd?;Yg`SV#gCxutP z^~KTfo#w}>8O!x=kXAzKd07fcE!MJu{-y+Bj3i)0U{=Kqi3ZF?F~ZYE*ysq8MyOYs zW$Gkz#9k(y=BWrF?-@^-ZkdRQ!D7#le{Ut1NPSbmsE?X6xWBYY%hS|9TJpPZs4uc#>6z_9sS?CgVpa>2wcT>Z zoe6A0L4Q>kY!@X<^6irRC^o7fAs_xnG!gjz5f(Q6RV%gi1q)y~Fo=X}I|I$(R0kV2AGx>Bgz~cG-Y73u?=w+FHzP`ZB8&Js{g1-QefXx@EP} zx|piy$|UYciXS(5Wp&XtqpZKblgT=0o@pJzFI zhg}1^?>U9Aoq%z77<-VoqDbA-1sh8H8wS_Tpt~#*zeQ0bQ7H<8WASU7A3Glf#vqMH zKgMAj!afA;HQY1l!kQmJ{{hzh2*)}i(h#)K1yKd-I^@zBSB&1Z9db#s#MmKc2y=<~ zv=5l5%SG>Nup5|INZymnq16%eoDAxN{680#)qqL$?Pe)v>{VT|I;oGzj~N%OEF<_3dGU#}mj58Eq+{)!1QC;MS3!-v#WIJDBDI;E3=y7dRS=@F{EuefmDb97lKwzn?^CYzp29 z+the+d7i&GO~#$)}(nr0~@<+W9Vd2$LY0~Nui!>M)8*O^T z(i-q-Tm2%kwoKTURu*xsNT2SFjr5cKro~f)oF{Gi#dKQc=gVxcL2ArU)i0jz%~gEb z5pnBCPGUklRnir4UD3t3Wt$~kVP1BdqAQFk^bfo56Tf5Nn_aO#z1hXIJ`kA~NmRt- z|KZAWUa|+K=!#Z_RleCJk!ZMl`^Y4SKJHz@idY3`KC(;lR8%e7745^X{z%;tS-U3k z%`SG6)*hivyH#tS5f2|fRS{k6WqB9t4|^T&P(|0IrA45B@J>FqEBYzC{{mpGGb7QD z8DwE@id~}B+J7G}eLc2ng5vT)MVF*Xfqq2E_&2+x2{WNLbBE%ANTQHYs(gD?T0hu! zeL@OtxoBw1C9|*Nu1FNH>yy--4y-Su(eRIsh|!9!*m3f%*z2fc9i9tspk_I|Xh#F5 z5x@ic_Xi@2(0)l)vScOdW%D(u`S!U9C$Ou-SW1v~$$vtvhNz>#tc&8LkdGt<38GIj8M!k#o%?$Q% zus=@(>QUG1_7j0O;HfMEeOiLw4NQMwmGG!HQaarm9x1IZfNvaCn!I{Y8b)daMlnWg zbd-EJ#xNUR{YD$p90!iUEQ3W}L6)-}GAKW!L-oD9{rLHN`uJ1uURZ7p1260hgqb9% ze%!FlYnoRqBYz61@G;X6UJFhG3shlM(eUl1sE#>+nOrj?C3;H+C#~}HFWD3|uxt4^ z>{>o9t$iS=T6@g9_*Y(>lxg5Tw*xf&3}Wd0;40$L~~SVB~b1dqZ=i1 z)&3&3hJha^(AZd~1}|P`rT<27Ch9vtTLCha2kuvJUL#=b_whE&ajIeee_ZcPnt&o-6iY`MV4= z8=(v#2Y2r09KxM@1YBogS`m`=;Vv-Z>w6hy7o{P-Pd6Li>pi64?kn0vt2kg<3R@Zd zgg)-wkl7Tu6OP%5(zr{^@UF0~ET_3xAGwfNvSBwiQYC;g%&R_KQ-!n$Uf z?FVagVdOsQ8Lz7l_$9h}?H$M-5jNni)+~ha2tyG{_b?2H@Za(8=ksq6{wMrL{Kx%I z_zwgAr6T@iBL4lZ|EKu3!(w7j{9myBFZfsW!hgzt#6R>|fd4)1zm5Nt|APMs0{%C) z-^9Ph^(kyf5dMe0%`ll*%S7S%w2xulMR*ONrGa5iBItGV(5tkEX~XDGHY^gxeO!~Y zT*f_qgi+4v_OrUEduQ;9aj~#3m{rtISouA6J(cT+wr{nuTqNS#x~3OJ3OQ9a=>ZlN z9{l|9F3OqEPUUjia|De)A7%pS(9-YO>dC6%yM6Gy&Q!7{AM}G5SWTUFZa7J#*x?N| zv;4fbJxr(v`@KgcfFTh8Gs%ZEgCT%!cUwxmS*JF1% zxpVb_RBkxhJ*Sigz17WTbi4KJ}~-WrVQG(^zm(O z8D}{1YwLoKfO88zBG%;#_A1ds*Pz#oFFA=D{SovgZmuapdkoeR zjWvZ2H}RR~Jk&?;ibsqdn_kIzbi+7LaZTf@0y=RaItxk(e6YXDWDGFJoNd>IJYk3S zgn8Z@#v#I*jP{F?*m+5IK`~xy+1m)v5 zx=xB^E5x$iNwHm#!kdN)?P97kxqP8*ce!?m<;RKTAL?$KH$Yz!j<%&j zI+4#YuVmtRgloT5S_97DU{fi7jzc2EvmKJrYxo5RD6Q1_kd<1q)xA-yT_)B(+7l*x z`TH2X$AtR7b%mLNcnUZx#L}*=AWjp}cG~an6-pj+0ZS^v=tX!d_hJ7}n0nW>95Ml{ z0$e3{+V6Ty_i!JKm0*PLcMyJA*tO0_KT_N7aT~<9y(_-06*D09;1j~zHlSV5paiCv zEkRs0IOmEG+eC;@Y0d=10|G=D+6PQ+fu!aY>JuMdDYSE;i~4fDD-q`l#8Ic|?&{OR z{h%(hgG$}wnyR~_Pp;Senw9eMT$8)4lZHma1#_iP>sZ&F-L^?Xd8f^51XdzI{@DDO06oCvvO0xdv96Kb>&s9*jpm00&dazy5XxM2z9+;1=bJ)$r*pgT>~&7E z<_f=@&LO(6KJR+bJkk0CYbD{7n=sg8v_ElMg^$DB!k-y{t*ip%cKM4&hg!I*RGVALvj* z;AVoX_<7C}kQvwZkQRrxLPiT|v5zlt8Qx~I3#MMOFvA-hGIy?9?Dv`8;m3Z{}&`sA5`-4>}s@IzoJC?A%Bg7RF6ekSUee~o-Z`7U1?^q2;z6IwE^NISld==TluLdVoh zWqoY4qPd@HkD+?1qUE7kYQrZ1S)()%UC%-f_X5`QL7!vNO(X$k(vpN3^DevEAg!@t z?*)2wVD^JghQJ}TNg~0G$$WhbS{05~fvdr4Rj9TFxJJ4h7$(-H5^H<+8m&{lw4b#O!S47I;s0@XM8kY%AKYyXIaF^fIQ#K-$~|bm zX%9J+OS`RfTO;fR5zl!7Ym_pC`d#2Ni0?vrEaG@PD-haXN9a?8;8~955Juv!@Kx^) z;VWOjk4b!_dKqSHj$LLTy!sQ#j79PQjY(d|>_X>GtJ{4W)~x#v5*}0xd|4{(WnS zDpo^c$wYl+3;SeRD`X02QMp-oOER5fzh<0o*l#EfM8qxC?|^)P&e88$yGze;O8p7= zq9C0y+-$CISaKR(n{YP<&vb^p2tJC!<5f#XF3l89&Tn0tI=_A%yl&OgsXjqKSBUZP zhq_3c2f9M|eE`4p_^rq9-CeKXoby?Pu)6%IkDhxxWx73IE{A4dWS88}R!2f^8tstC zB-IZTJiOw;6-?Cx?tq|UFrjJ43grrEHE60`S|{O{Bdd}lyTW-UGujam_CO$ldEq;< zIErtTRBBT=_@}G>izQW*!3;OgH^@1BuZH86>UY8~i&DSA%G8m^vG}#x9=a!9ewORP z645JCef^S3oNn92uTJDL@wI;y;9^l@&$D3gAQ$}Hq8&@=Ji1-i6AOF07!xsZ4jjZl9ZC=N_6}Y=-d}=7{G1N1|BOL#JYE4{aEA?^?{G`Z_6$irO zaNeriVZaHhl6rb_MR7pRoIu_peI$A|tn3W#M&0ab#@oMw;Jb{U3B7$LphOKy0d{x= z_4v>8A|c}?I1S(w!U)NcLOVpzvN#SnMf{FsX978Z%MsurDz-0BE?Bf664XI(g@7X; zVMHyA_jLj8dBDZTs~$NMC;?oF0OvENE~;PnGq!*R0ZtD%@)JgMw-_UGhWRr*?^tmr zU;vCkfceI_eX(-!qQ!S{VP&#f8gcJypU3|Qj5Dd@UymF8*NlINgQjBTYC3xeL_6fN z(}9KcpHH0$y(t~1YEsrHS9qa2Lw@TbnbpwLl6Hk(igtuY8vO^14+O#)oODYcfX`=Y ziCjA0u%?rPR>d=B!geBe6W@gCVrwHbXU_K0aq_}<%zU(3k8|yX%4cUOSL_l-TJUSA z27^+$c&h;UULQz_^TKk%;AeqpfUIBss0c~8BghhE{lY~8>7C2Q zi;&b?1ev2$F31ufEBZiw>bS6kM#*P^6nf{9Yi&dq!SO+mN@e}Lj<&|Bi_N{MVxNPk zA{=lszyV{-iMB-UaVuaDE+V{uunU3XvXOI7+c}J8@(oBQ^cee>XK<0wqww)BTxMz_ z1@7{f%Pf8oZ>hK}!7t)0t1oW@MdWeR&p!CQOzxIw-YU-BBP=6@y))In9saxq)PH6D zBeOb{y`Aj}Z)Cf|nnuGC?=xMa+T`3xga(8S2+I*#5MKCM_F7^aaaQo1BL}QrzTNr8 zPr{uw)a2ln;BvjQ*noB2bf<6_QC*WDw|VIk>to_C{B zkf*=Az>tm;(Trx;+uYkPqYgLWWYVy`VVt!3ffhDnoFxtC|0$XWxbV$P`rP|s4usd$ zb77{hY|&5PG$D^|h3-K1R;}jibGGO);SYYG#Y!@aR+2HbxIK-PWOSWkvosK93^Pd| zyiIMjD4=U_@l3QS&+qCVC}ya9)XviTMam; zTWa$1nv*Ztl2S}WED zZ5@1l)^FfT^&jx167UuOAMmx_Q3f0kzODi<1_V8Da~kpW?-*tk;;(BN=1YWKczzDy zZ@LE1srL|_`h}=C-w?0f+RP|fPSLVmSN|(Iwt|kmAJPe?)IfSWGSyeGy+S9KU%4Wq z$&8R`%r-tZNR0E3| zR$F?*b1ta>T?XhVK(7UKbRXz1x}i(^Kxeol0`yEk#{l|SK*#ohe&J7{ci-LzTJB;6 z=&^u~Q{Q(c)zH5WZ1HM>Wz2O)V&LtJNmW#>3uMR9ciWwe06V}*x6BNjyc#=N`)F%Z zpugrVz_eMvc%I@9KlsIM? zSQMrjD3AgsmnLWBZ@XI{kq9f9_BdmDe8R>A#P zw7THO;(4WiDu^_U+=M+F`-85w^oL@JPcD=A%A@~OAgw+ND>t(0@9{sZnr>u8n4z7n zC<3QYI%qwA!zeZ3ym+GrXYXWHm+`h4Y3I&(FBtp16>}hFvxnc|39syzv6jp8_p8Xk zj2w;``58xeT})-a>M`6*&cnC3V`|`OQ5AC_w)*o~lGGSbmZCkUDYjOY%52Kv!eCX) zi`ynRso9aRpGg}~J@7!nmKiB824-nAoTLie+BTs3Ok5)BFnEomx8%V|#enWHLATag zj1ACYppyp=>_p_D#7s{QXhDmC@h4PF5uit47LD_2Yp*{ZGf z*^u&Mq|BwZG~6JK5D#o}Ct$UuN&XzOD3BMYj<_a@5IA`XC`M!gE2xfwDw#Cs5rKz!w2xFdzwj^}oSDg+JE z5)o!@fQ;yCti2EpBG{j2m{$;=LR^OUKd-wyxP91j-R0p=i_gJzmj^y#d#}5&g1jDD zce$}9Q{u}ix_WcUdf@86$t}J7j_bj7s+Zq(J+w|eDb_Zpi#TLi`>)rji=l@QBVsuu zL5rmk;3kOK?Z357_3)p%1C}6uuU6rV1fhKso~ywdk-h`*96ZlL7>(yR1n|cE!JJNK z;&jE&<9sxRn_{39SWwnGrb%j$anS`hqtBh7hJ^v;6hSUb=L4Zut+YfEg{{ji!ukr{ z06g&V5O;)DC39PHieg3mYY!|-lz(u0k%W__kv_HuC-(WUth2x%xn&c_POR0Y{cAL2 zk8+_r`UZ6R56c2Wr252}2?i!jUG^t^LYZ8Jl!?%!Y4AWxA&+ChSI1wWr&AtQ*=QYx z8qUG%L99w$R_}|IhM{CQc0eBf88>;l@bbg15Py8vv%sK3x`qpz_&~CUUxB*DAU96P zZSb^MC&FV~W|=}&u1_q(w@f@?^^m=c=8w!l{F)Fuf!{WSQ)1YNxL7w0y;gRpR#?Xl z5oY#$!vja|)^TEQ4iP!iA1q0YWglW*M(Z2gd4e7QcpvltV$j3CyAo?6EwuRt(osuJ zA|J>_EiouN8>5scJ@-ns$i?af-2pE@?n;7bpr9)dLsYk4+ge`uI&H7UquL#GUg>M(cB>Oc7DjAv21j(w*3@uF9 z6Y}sEJoS&te3*`fG^3E#;!*aJ64S`&EhYBwCq2ET#KawYONlYJdwNTWJ^UW{Xo>q! ze#ir#VayTvhaMh!A;bStFI{e z)mIdH3bWtT{%E<~FubYBkiivU^xuWKp$z(%a29hx<^_(`DFnYDaYI+rO+@GwffF zPaSq<9pr>E**^GPlb$J#UZD21u-PP+XGW;?soVDIZBn7Io&H^hrCtE4c^=UYlMk%4;9b#RUB%xx)Z#NCy;$N$kG1qi+v4moz9*tt zt`u18xba|7sleN3qkV-)vER7GG)&+~!>}6k@N)NHVQn}>c#^pLV{IkHdnoS;^dMq{ zvZNb}F#t^pl627>84vGt-L2D#95i&ZY7}lS1@Bfdm5fSidYtQzcdm9EvL5yI>nA-k zxMsI@hh?u7F>a`X%AHd1yTeXu_q))s@W97A;kVH_rrY~fsO~Iqw?=!LRo%T03g!4M zw+d^WyKJr25#8Fhq1>M=Dj`>6qng(`Z=RurN_=hc@SXOgZmtAI7*Y62`T{)^l9nRqZe8pKh%Er=r)JjD%P$gIdu*vfd*a)Is`2hrVCJAM5XJN5V_ zXsgqR`Ze9r8n?5ZaxX%=I=xT(y`Y`hpu6F}L3gR3J2z~PDZ5uHA?o?Yk|N|S_PlTX zPju&oPv!qacWy}2iS9o7G)Q+BU%-6@tWAz#FXBAOFgk=Rgm{E$f5!gg6YN(Iw;+y3 zd=&Ae)gijOXBo{U8qnPl(A|;$E8XSvq9CHXLXqy=@ch)1?)q2!O{6&c0;# z5}HqL0o}PF0SMAv^0loZ-8};h0h&+PNO1IPM0-S49d4$Z{xI7Pyh(%E_9%e{qf|tB zGzTYeL~%?j&9-^agrvFn7;HEY<-OE{^4u-mV@aU5B7xo#MS45lev{tZ(1yH8Z$xRK z`RSA}KP~zdz4e}-R$+c}^T*sbscq-gc_OvJ8>B#OwO4yn+hNfAO=>%6?@4WY?7gXN zhrK7YZM7G7ukb_TZv1ajTUI+!8ymSwpt+|6ntP%L&DB_TfadB2%9#(1cdRIEL^*S9 zL^*SWd1bau^BXf3jbWOx`ch4B#&Yv*uKz|k(5OWHnYLlwp2b7o@wLUxZ^aHEbl)$O z9-Oh*v;8#2$zn7R#t&l5XU2a z7x8NdEl)$1hxjPszVp@pLO0ano)plVZr*YIC%S2H^@Iw|S3$a|#q30Vu%;_SHy5yv z57EsNT{r1Q@*n8N)E+I+P4xe-bmNA;c2BxF<^2CnH|egMbQ94PqMN1oUYez@U+GOZ zDVPIp(#;@SPr8Y<^`@I}TTi-SZ2ueGU}kauuXN+a4o_-w!*`m%0X)&*10Q*a^S$r+ zZMu2i_21}5=lpMUGXZNzH}-hHO*af~SN$it8S4DcbQ9;?X^qABC%Vag7Vo?L-d#t+aKSf?G@y>59RxmG*AMbEi$0*ZaEc)vJ!w=Gq? zU2MQjt50mqe7#=DWv-M!ron7xRQ@2u3CPpuMRuCByA;q`wE?)~$Y%6wVUXx-XIlXg`>nEA)0Y!y4kjr~7c8(yr0 zKEHfiULa+nn;+n&x6s|jl#hTnSx@+wU%^B7zE<7~9vD4PH^=H-S^_UWsA74&GRmk)@X!Kxac!-;EmpRGM?sI||%#RgnOr@0us<5Z&Z25GNMR#>2&3 zr83-(Q?Tz9$8KU$1Euo4U)kdNlLqVP-TkW8!HY($`kX6nV#Fpn_dEyR1DS4U)9ou} zQt8CCtMtvlJ8@E!uH_nvzk+v*ui)JxbKxg}#<;H1QbVmFLmyUI0z2>FRhcCj_|90| z+?Veq*afId0!^q94PUubfJ;yQ$~9E|l}kBMy-;51hW+Wy#l!aW#}2ZqG^R>EZW%Oc z9rK?h&(3Mf=4bBRJ6};vvsngr?{0X0dfJUM$%ZA2YDiVm-WQ?ClPGvx+id*CCi}QQ zr=R)?cE3z4RyVP)OqDm^gZNd%dhS>fQ%QJQ=!|MjG|d>AKQ~I9*c_u?VqsO3u7kyC zCevq0+)XDY>jRWl>yp(rER{ggqt??ms23_=yBs#*aQoH`i^g(OG~^7+^lsS14Z~e( zwf^3KA~(WhFM%F5O1pWPOVRp};MWo|%&y-T(-(A=)^W4ZBeh&=LpV>f+Unfou0-UI)@tea1FQJM-j1VZNtq0t;` zM!JLQjqhSQc(j)|V5iQ_x3q)fI-bIsybAP5JaQxAs;6+?hdAjOoC~gDU>GS# zyD5kj2y%qQ;3;{CH3&)sJ<48q0(uDVLk|IA1wzAP#5=>eXANJ8a=mnEt6+(I9xUj& z`CTr(AnOZB`p^%q97y`m|1M_K&z5np`Ii_?xsMs1XV6ktP`*ZWW@xA%!+i>*UvLE_ zc^Y$XnI(2HuHG_BH^1D~TiWNw&5+(QOE*8q)mvr>uIgG1Y2QD4Nc+GWgw{}7%z_+I z5!6%_+PfWcOY9F^iGb?p1(ns~8-j4ZZgtYHS{?VRR?C0Y>g#>(r@L`4;Mc8oVw{kS zGT1M_B{y~R-#JO%>ZUtjkhk{jh0lc=G>6tT7QkOO3$6z0XkV{oYZ6Jv#4IIEb0w2? z#hhVKA@3eXBkXnLMN)e3y}|DuXzq*m*M9W{uQ)ZppuHCcHwf>)iT7L0^^ZW$RFDX# zLZ8{quX5_4y__qg{3!5~GG{Ap^9QXr2FISk*>~(c*|OfSwMl-vv{hvo&aG@3!0j*`#Ldu$-kxU|%jFo{{91d)+my#-dM!By?ovej zm;Qb$$Dq#=9gI>639`IbYOG_qflh(k{BaxeY801Ym?%hn{~8Fx`Tfu6Z-OCv3jH$I zHcB}K$5zF+Foqc^x+bPN3T0h5!+<4(v2*max=@u%%GlcAZ<0K+yTQjCl%J@dky5K? zGF@iUOJqi#w}_<#Ir0XsNcUnR?ziMIsW>^;lf-RRK?PS(Jfa|c(=IKYyG09fc9OV3 zo*XyN`~oLwW#PYOAnuO5DcmFCTf*w5r{qs1O~Z)VE!wP>2WLULUAIdczC{{{Xbi8h zS>z)}wb0o->CM8LlLqgM3)@==%|vH z#7QwT9|td%)SR@2nIi9`y0wW^dt_Qc=?v0$&igE&h>KqZ?Nbet_Iw~t`8;%jKDA;^ zA&ugsdTPZ7R+_^u*>2w8484^#yKr*ohBoQ6LqVQ?68F|i5U}>j@5jX&`g0R;PC2po z1)Nh#_niwAR)%5ir^GF&ptT$~@4TTwZ-wm#cWjq(QfR!ucSj9dP1N15oah^FsfH-&3znrKks1|a648)RY6&1e6r=GRbj z0%~S5EtVqA(li+mm?dtcVy}dibGuAvNzmqwoBxY_T9az&1ZssegH!8&L@VC4ePE3! zA}bSae#4DJRu^o)GtGnW?KHQYd>eb_M=)pMc5Dn6yEUzdc_nQcV_01y1hqmPkv7dSBV*jEETx_MRlL%hj2u_rS!NU?_-*&jd5sW>p`3`BhXq|hT9W{g>N;U z4=j{L9C)T6?5*n^A_patgMLH4Q+nRq61KJfKYNkI!TF`O@$~MtnnGw zfV#A%BJ5ie=f(6N#PnF#S=`}cU@51RT~!d? zfU)2@Bc{w1Q?5F{5mWSHN~iN{F=e5cVt1YrQw(Ct1?LxH%5pKK#rY30rA$mQJ5Lld zu)hL3J?wFzWz<_IoX5m+D(fw92Qdwoz-H>Q86VCGo6cHTY(b-mUT%pU}0e$;Ows9 zCKn&@NGnV6r1D7XcKV_uv6-gkoeQbnB+uh*Yqf3vqTd5NkF-gl-8P0BhVS{(HEj2A z#3Nk8Mao=qnVuOBv@a;jhJg0UUCs>lZ6;J!d^{T@0Q>Jm><}_U#B?Bb-Gzh45XEnDW0w_y{3@K+mTU z;vg%zj+kIG@OuyfgOG=iiI9kJ4??c^JR33PX;Gfiry=MN3K2Mj0x_mCGsQ3qF~Ob2 zUV~sla8#c1$`IxtP+iLrmLeDs<|F749zx&_;H+;Y<^u#h!d?5Jlc*#Kr5~-&v85zH4yG>mF~4K-mnGZGf!?p`1nXOd5mi8d^Ytjfple9!+Zm?N#=`VPX`86x?szETVQ}@=aJKRqGo)m^1_mlpxHT-qPZq z-!3O+KdH3(bU)f<+%U=9BMK&och+sOts-jJ%f zMJVgCC=F6Uaxo8kR2QG?epr7ecLFWTL+zuT)V>(*W()UQb{cl+$LZBgrOW0ST>MaH zQ6N=MZ=0xp)4CINOX}X#BTWO(3Qa`;b;%3d=hpXp#_93@8m-IfgHxr&#UFR7;A=`7 zNSwS0Ho0nXmaghkDh8#-J6wFNL#a#dlb4B6(rS0{r`vM`Zg|#}*sWz8(oAy!{(|cS za8DR@;ryR^>aa5i0Y9GItC|qRX+Vr{gkyZsxI4TTy2N`xX9y~U>$|}}5NPZ%!{IXu zcS4Qns|!ZCWG|c#lrOY4?kJUU&lJS?K8=buEE1%GSpQ`EOY`^k-<-%rR>{Z4Rw*`p z1>eBZ>TRyr7q+?L>hMMzd`4xDLf0_QZa69 zHOZ>-tG{yPL{Gp9=1Ci0Jh=fLtl~RL_h_Rb2b4>*tG7co{PvY~9l4uHk4Fygdy^{Z z=EMGqsDep*BOqsV!&lCv8o4SLHzAU^Y*6ql=u~9y##+!hwsrt)tu2F}U~1*Ef`0`H z9vie*t!Hk7*DhnyzLdRe^~5!_b~|X?61Y`45;g#w{1uPXKoYXVg8U^3-Z1zbdB-?X zSjkH4XrGi({~7n9rQU1ORCT$TQBA-O-wFACqwmJ#b=(T*57L@%^nrEStSuSMQrwMW zG$!sa^gpupN~+TgjQ_mxFuZf*d5;^Dai8ljtlGjex)G~hXfVh4jB*Jq2xInwMSs#Z z8IAR_i+>0ABBFh)gygToD(aF_4gJ(vTUduAn(Al#J76C+&-;pT!(7y;yptOxScr}B znIa`MG()}7tG1Wm_fDosYdS;wBEao7!U_YE0bLiF8FxmZx8~wk3%>DGLRyQMw$iDD z6$X+ckzB^bFLjQsBU}Y>%iOl6^Y;h-qFWki$i#n(mfxcUdz~Vyq*&E~+-dBp;WJF`|%$Mv9A1hmXc^A>G9r?6Mkp z?F_to>?ZlxWd&h1QWHjC9Q;XF=U0J3?Td8}_G!nxmWLZZbjn_!eI)s#T#h%#wUTw5 z$(@t%`<7M-?6SmE7oini2QZ?HsT*CD1-q{IqlXJUNYP}~%&^`p^+S(RT5bqRWm73* zR_#Em!ZZcX1`pMyaNYwbaD3eBcJasT^qn8sX|%~alXT`BY8qG5$}d%_8;#6!E+J)!#EwIo4KiuIM9#**Gno3+XA^Y3_UPOFq6=FK;AUS6iLM{TyI_0oaFb%PB7tV~{gzqGT#R##B z7$zNo!|!QxgZ%8RUxxqLI(@qLnR_EE+X_>w%M03y*A#qQnuhx+I|Z2plXgobtNh9~ zY}{8i)wrRR%*ZijOJHN3oJ+1QNrg8Y@V$ld7@r|>yCHEOTb;Z|`bx@MY49T-XC&Le zkZDvB^@LXqQ$=jXd{H&M(>Ru?8mw~iMtA9v3`1d4nqin)W`QMZjU0R;tHQ~@m#WM4Q`>1a_Z+s-IE-)WCGKEu=m|s3Bck%nLDh;Gr7Nna~b~*eB zQ~9&kGYnavF?e+mDC(H~5%93}uwORSqQu@a(sT=WS&D5>abC9+{sg4(e=ANEr0_fS zSQ7)r$$#$NS-iM`B=eNk(q3O&A1R4B=5=OPPc)kEdHMnpG=N7!H-EPvoERMjP z-Ru1yjWNJKQOYJr=qs(8iZM>2CZK+@V5nf9D;}`va%n71Xa?lkfmF?d`!s3Gc(yy&;RT4AumBlw0U@V$bzSTPNtf z@ePJ~2Z3mQ+CtDgLg*}m=%3CrhzHExiG9a{;Q2@B+`~T)=Of#LwC-v=7HClp!+M0I zG;`BqaX-7IVii_1v$Br`T8+oxZSqgsXdkgmp!{Qjvt{ROPp6%;J;lZ}od{ekk>kIU ziNt?zTonFyDx>iqSKU)hswjN#Y|r_CLPm5;7FvjI|G74JM{51r@o&-h4ZeO=kaxM@ zHyh`g!0PEMxc7ov0vc1)ZYTewdmU1pIO8QxNfDNFwv4nBHVxV^2=UmoLKTymffLoL zKRF?XI`8`Yi}S88zCZ8!a_@Q9S0A(${f^=n&bv<4op=3n*?E`wPv>2h;`6SrA1J>3 z^5@d(8GEq8+9RvFuOY1Rew00>M!AV77maes+RHC*2(Nx{Pu}I1m!cdbXY(55mD)?G z5U%ai+|-kK(9BbteKxHBLU)lM9UIcnHtq zJ(0Cz&^qv5$14G|urB$e;xz0W$NX~Y=^9;JY8osb7eeyjmf-V)IhXPvm%lef})t#JHfIkNK z5G<_(Ps0v#T^{Ki zd%#|I1i$!%0Q+hW*u}kI>jB#c*qJ?GTSeGi0_@fvu!X%~*8=t(z!vm?JubpNC&2FL z0h`$ib|GL719p55*f&Jjr2=e28B?jnE|B_3A;3Ohp54kct5hn6LP|;slbD#uz}6I# zk&(fS9zB{#N=jmiCnhtnM8)Lf<(JcaFJn;|5bxQ^P!UA0zyp zZ0=+}fKFHWXE&IFf&ymo;>FBkUyf!jy!9ZXdZvxZon~c@*9ZC4D|)O`5cXjIz5!t) z!da|AUPG9VFap62ezqTBCBk?F8dFY4hE4~Z8dkMFU{+Q)Wk9~~gk9qCCMW-fBLd^n z$(vm$!Q6>oC9v)1gmvfB0k0-h_Bnh#(!{dwqpVjbJ3%O0j%HoEi(1w>#HXxLZ70OOS*^6;cAF0vRinIMPakigpc|?%yZN^Mg z{_}<9)I+6CoX;sW9KkqwiQ^}$mb+K%z2i<$&EuiIJc_3c-B0h}sj~ZNKb~Igeu9MH zm#y7T^?2IR{ba&ZL-$jaQ_{8)tr_z(@drBncS4HyXtz&_P|IU6$Bl4M?jV;zx3JH5 zc`Z)ny;JNHy75Q2=a<^uI|1*c^AxI3wciG>~3ovp?97(pRm4brJ3NYbGq*C zK9HZ74+)T`oJBgaS4MK15afI2zX^HAocX#t`{eC5*9dtBos)E9`{dP`Ul8)%aNg0a zV;QRRMf0D9yjO8!Af#m(%A4G|=D-Re_c^Cpm(r)!$(>~f{vhO*JJY-EYTbmLcc4Vb zUFsa#eedsP?#u&IgxopK!QC>8o4NT1###-quR!Yp!vm0c&H)|O!bSzcN`%=66A<93 z9GBB!53vR|%MkVR&Z|YS4eKU7EqGanDKfkmm)f&gb zuKzKlZGl%K_O`6%8$;MT)^S^)O*WWIgdc_oo@j6^EDVHm$^zKFi^ut2*zGf%xOM*d zRFyg0mngfBgRVz-Z0rAF?%m^}I zGd52fL0|w4F`lGRVmxZRq%j7;<3Y_hC43?6x_E2 z-4-8?d))k4Gj4hc@{Pa_u=Rr5=Xo!@7+WmleF``JaMF9JJHNt;Ia9ySp_O{E`!6*; zp7N=U#eVA2lqsT`@Li*5LMu z90OTi$(Vh!98y!zVK4LOBCOth_Zd`gEGr7gRAb-GKL|a7TxH`jV?z;qUe#}frJ!%( zCb5d>$|P+-7;KzkmAv6V{_8h_piv5L`us)+-amE>O19R|``YFo_+vJ_fLZe7X;oo+qKA1qQR)j8Tq?``S)lZ9fN?LKH(Z>&hZMH>#bHQ6}EE0J;tbR;4=p*YxRzPAv`6=u_a`Y1W$-slnkK)kp8cn*!;L zs-^>C#d;xA(d1scBDIc%6`CQXj~;Hw}hrbb^6E;mBI0bEY`9i6!AgxIGFkn{-d{ZsGrW+Ru@C+_nL(N@yf6~;*qCqcK9z$(;O0B3=iZd zA?>(rwK%^z3IAdCSlH`qvC(axe@>-a<}@FG@0}rk4pI}W0KI$$jGRqW;{HGQu6nPb zi|$8D#ocnLxUmoSqb2@!UW|_~8z z4)C#nmm?dKUjTe8Y7&H6MdBF}`P+e!3^!N;UkAP)Qo>z9fDZw@CUR%;Qox5qh8j~b z2f&vCezI>Wus0=#Zcri4;fo_EgrvgjHoA$j27Vz>8;Y zXcv+4u?@F$DmP4PO!XSr;1$&gJF|f*)~ZLFp$5jpKj5~gU*VRz{Ky%&t-%3X&F3w2 z_vKs>yWjgNV)G+si`bpsLd1CFI9T8kY+tXU>20KhM2_~P^dP0ya!n84TkrYeu18wQ zs)fck8*`Np<|>m-!fjTc*x2|HDRkqSmzb^Swj_ts?*`FBF7&v)umvC*S|M}_*;e>< zC&|<1!0i_|Edv;l-&-2f2FJ-ivyJO@&bP^8RHWI+HtxYu;c%L64vq@KF_aQC>_=ouGjVqB0tGPt2lk8z>KxR|pLa;+E_ zDc0^H%(15w*mBp9+e~0Q!_wQI=~SPhT};z=nr_! zTSSwfKfne7Ruj2DIU2A*g8uvgDI=9f)}#_O{!DoXtwed71y#8zZ?6@5e9E+G4Uk{b z)MGnw!g?S{P*oaAh);Ys`L`E{is;4`hx4j~sD$W-VwW7}1@!CjBpcs4pMf+^ z`;qF-tB`EcKrP;&metm;ZMYFUjxN>429XgYh-! zlIgU+1GfW}$Cgjq2hLLNHMTPho}QV@cc#&hXZ%C*z6<+}ZjN%zzSpw9c%kU~%l7vy zp{w28q|?6N(!GW#;=KKj@MNmkT0V{TO57BX1Pahd4(xA8P3ZmKKcDh*|NFT6-%hQX z-lxF)o(A2b1J?i2?rc04+;m{)^Oohdr; z{%y^R#}2HKW<2k)iPv19K9WKm&i7$W`L{J}(#;D;jsInn@^G>WJ7Hnf(Rzi8&xB>O zveHlopR1Q_QXthR6n+oJE5FO3J=nh$)u2X6efx{muyd`V)xGM2}@WXOibPtl@k^Ev9k>a+wtL0-phx)l1lD^e%p6k&=^ zd1y3bMx!pEb$ERPQZ#aKYf!y%m-k!D#V1Sk&=k774}m^euXBuRI6|=qjdDSY?n7S} zbciUh*E!4;)ZpHC3x)>5;cV+0F3!~kh}gkCZ?RKIcLF(_&G4p3eznNX&H)YZWSoWx zE`M}rh4;8;jSzf6Cf@!U*#tUpM*S`5dL8h9k%s@};Pehycx#7lS{lSsb|T%;Yw5EP z-?+5hEk9M@{AnV7|8I7)4rfpAKewAjeQx~kcC%DFx7{q-yZ2|i*RQp6`K_6>(Bg3J?cH*W(vI|A zwcy@Wq#W%1(Bg%9gfp}Pyng)&w@}`~tpyn6y+6Qy#o^r5OPJ=~pZjd^OBCocv;8J| z43<_O)Z&aVt;@-8(UyO8^I$Q*inVq6ox`D6TdUn`>kRwEAn8Yq>&&ggp>>eXj*Fe^ z$Pdn>Xa*!rU8+sW)@5g7Z3qQ4lYX@XL6|-(o2+gFJMMEB#MKSCCau%J`ISvvW&A0x5bkCyg$q&w= zBw1n3ROqI?fjLvBezX(z@@VZANMi1J`*`v>%$XscIWx)n(F1d4g7wc9sR_6Iiq*eY z=Wb&rEOcr0kJTVn|E%$kHg;lpN~6KO`d=S18!a`~DmA@mk?PlnL?IT0SgqxX{ws0b z%;C(&`Xusc(Lc|q_35zh(J1whf;g;va3Q3-yR7(8sjKePc)*M*H2ddejGU9(H9bdY3%H-jO zb_-!e%D%+;9f$L<<4apa*za+wO4gr6=uOvg`Ag`H-$qI;!e9B^n=vu`EmesSkN z0;KvuY414hL1g_UHG|UL;3}wtq&*kCDY17Gw6ftTcFgorQzIyMagEPF2hom~cAx<( z6s%5KK8KHpUQkgT=%NF%TRSAIosiucAd5}J3grZ3w`#0V>Pk{w&5)Z+VuhlrK@2O6 zYG5?rxd9j^V8~dZ>;Z-W(q1(%wgAJ36$#0OSH;lQ93 zQ9dNna3PV(fF4{CjgJi7b_xDXCy>5a)xcXq@o z-u&%AJ44^1<_%&c<&BlpPO*}*!)DOSGlG>^E!myfeafa?Lh>DrQwfx^04eK`5*xV; z(vcl!7_$(YA4#&39Wp~SVjINT%MKsLKlIQljihF~GrG?Q5)*Iv8a~#c)oAh^=pL5YL-U&RvWp4EH<0AwOu)ngCR1w8Z!FoG{8VSqn*I55!Ict% z2@LE4PcZ@}6EH?eE(|W+njG8NP#Rj;Tv+d_hJo7X!eyn)3v&vgCt$LElglX6S(W9` z4l?)~v^)3SzzLNR`z%+B22*y4ltY%~#e*r^Mapr@)sn%KT9NVx%kt8}l=ULz>=6HW z9Or@q_tfbN=dqo>`hvNgu=98^CE56CHiPBkpe5!Xjj9$r)(th2kcfLF>Gv{#~Yc+;Bm566(Fu6hkL& z(_5K;u^qGYUE6VC8A+U7B`hPq6qb>#LzaLsr5vGE7)T zhIlL^aUMum78JoU64IZo)DWfrNLWVNA@ftcePJ0nSaWz7Ld}mFW*R3SyHZqSwBt+! z>>$hOeKCdxODjrOG#wGPkzsDz$fRw0(pz_2_{4&HqK0fBe``4jdr6-^j~co|XYk8M zUvM}htN}wi1B2^WKjvuTS zC*b!8>B8RmUiB|z0Z=^+^FhIjDd5;rn>dlQNvsa!&RG4!r@kD{P}{?&zR>ozhfg3n z-~-m}Z;Utn+Q9cb)kZ$jG>}~E@W{sp!j+ScXhp0VC$}L#TQ#_;i)JjZf5`e_??58) zu{*nN#uz_>KHycCrkymwF)4p78}6|z9AEQS*T=E&=jyR7oK)ksE!5!+pE(}Z3@7zx z*AyAqB-St0Og7TmW*DrDT5E9ICu|Aq&OMIVAzu2`#-#qBnn|!LJfVf0)GQ;X=jMo3 ztk*?NPxZ-0+O;OzBFO*NmqJ+on3`ha`Vg`fwAK83@UQ`xFBykVC2XZb;SKAja(1h* zM#8;oOKO@{gjFoouYw;kI;}MtR*KXbbq|$VWtDcro?k<=Yp<282gz>orb*fz)2hZ< zodY>DTF=^8Yb{y?_kpxSV#6~Q&-nJRJTI)dw_0cGqadMfhJV%NMi#;PAFEL`O@Q6q zXyX&DGY!gmyK}?M=`AzxhBtqR_fY(M;+x{Eyy?$2seU(Rxd}D7#=%o$Y5H-XZo|#) zBD%-o6Wqv0cLnS#@~N}K;v=`1ZmIYLr?lzbfN{lkct7Qhi;Zb9iwzoB=M6aP|1le@ zA3M&&zGPHSR{lkc-5A^$^N$DLZpRrgx!B8X^@ugM-Ps4Pc4`qHhgCQA#n0_ev;k`| zHtqqtNxSp%O-19FR)67%?+ttrC;=z^A9*O{ENE(wmdKK_t8HKUUeB6j)6l-oWfR61 z4r?MpBJ*%;Tx09Do{Lk+@f?YqFJ5_t0Zh2|mw-1~P zug1CXZ()V?uECB|5zm6R;x6Gm`j$#Sxl?!C_|3eWmTo#19)&NBj4_nXI|i$?3V}yw z%fTCNtQPl=65km7>gO*E11}&R%ceek`*2&PKAX^l&`Qp{_XIo%boa2(*{~k5 z;|vH{>&b=#h6MNmv%`-a;^kq+9X%3mO}0B*9K}X9`IXzxw&^V#=jZIsaBT08?bS<1 zGxgdo%qpIe`ucz=OHKQ6TTD8vJ0Ss3S#@E?LhM@Do!780jc>&{WJm*!SwnW5gY`}W zzq{;Ebol`G9M;u#`2T;HlFs)%Oi3R;Fy`#eQ}6+5#|;3~{s(V-WWj%%9hO^}@OvBN zvEba~vEcj!9>>QC3r@T9V;i-@jvGJQaSqn#B)Bu{J#G0CHeMKQH};BW^^LbIyRnwE zCGi1mi0H&Y60 zRd#C>Rz9rXyN32KpQ%}-FE(ISk}hQ7#txK!!VxZJ1F|QzNj`YsRPcx+*R$q;Nj(} znu-T_c@%j0`rca)@$zFuO7QaX-in8Kc~r3%QuBLnmC$`cpI}#(?t?j2qCx8N-ilJX zE$9=M0jUNSRcd!;_NsR8a#hRojJO|0-Vien{x&zn*>T6)($qchi3J|-aQEu4PU+wH z-pTNnpz#^B%0+H((6l!AACPc%Q{5P(zYuJ9_TqelG4@w2*)FBd?Hz;G$$xca$Br{l z8rk96aT=i*obaBN&Qs(ISa-U{fpes>uTY9VovJ{KjC1d*?gK~6^^`y*+MTiRY+-|( z2MfmWKYC__eM2+CmKs&Vu z+nnm;kR=HHr7h4UJv|?xOKpp*>Dk$Kr6*H=!2&B=?`80nVu$X7P8bv)i)e+vLLpUL zf&X{~D8}EO`K}UtEdlxgtezb2^{8-nupJ(Nqo7IgYa=_c7=yYAeyL;Z&hfo5ST$4{ zdHuUab^W-WLF#o(S1i{%ayIH;b;-KoyjO7tha>-0SEjDG@Kxw*>4vhD*4CW#*2#I9t*!Y>TfKHq zE+p#G^x_n|4x04IBR^P(a{+doJ6fhsMjr>mx-SjSQN5G&aV<93HpU%VfcVsZ#Nq!r z`)Xr+>m*}bOC01J4bJArMF*$UCqMpy_nVLCwL3%fnohae<}B&sF3IP&@GkJR%{wdZ zP!@3gLAAgS0|3q($mEyS+q~4}KJ}QngbbF0~V9S!Dm_?<$OVoAcKv_vHOH^98XAa%xnM1oTJUMrY zm_u#OiG4O_-wnuG*0DW@Ek`U=JfI*8%U7rb>Vqo#oLl!>fB#EIqxv` zu?Qv;Fuo&JlimO@@w%4$10~y%%R58YwB|T}E&XfEzo)4t-?<;7q!Y z;7tS;i@I&e^T->wj5yL7F&$!W zTDr^Ju?WQWTc|GXcqrn>ps&EJFkXVidrGXheb}O0(WKHuxyt;WHlNDrQ9KihOmStDboGFu5vSx5tVY<&$hkG?+o?U=Eb*N`Uaz?!qRk%44? zvA=-q-Fs?MpjAtO7Ba<^zk&~x<37FS(k#Fbehl!_d z3CuLoIs$VGFwq|@%jPF=RlwB=-1WeffvbxoyX~{CEi&Qn1AaX4b-<4WezU-D0KP`x ze`$hlQs7Sn{zTvh0lyje%>sWD@MYi!0Y3!z9Rj}{_zHn5ytUvvpJ=VxKjOEq3pBj+5*DFDS= z1x^=mw7@ZTZb1u80!DmbXz?YN6&O~55mVEg8rUL!*O9o> zB?atsDaKuL@u;)560DFrK(X%y)VfZMgB5(#*S3g2Kr1nFyc=;Qt_Bt#!;X@*0ebPs za{ZrE!#`N0k2pp>&A|EQ<5t2}NR2G~r#t_^JV|_L_T6}J#>+QeNq^ZRA50yR5Bf|| zLO(@q)L;rTo&}|!wLKYzmYFZ>e`BF9I%5hePQog%3pq2w&bq=)yDii5%?0 z(qqCV=B%}l7I_eRhrh>Dz5>M8S*1y_{pJmF4jEjqlqGoo{}m zye7Bc)hyBwHv$KOO!D7gO_LuPq#sw1Ti~X5qV#P&ZhRl$OPw~S5!fN1D{v0fm`ad+ zFZVonTcORl6fpB6n@hV3DL>P9^DoNKBcG#;c9d~Kl%etM`~^%bU}6CSPKGb1a^ihA z{^C8Mj$F{&$AI_@5OUEczsL`Cbg#bT>O%f?5AB^UT?Pa7x`*=KQpxhkgU2v2w$zzOBZXVLF-^d0!yuI{uQ@84I6X-@o zEBn5q8f)H(euA?^e3eFalae=}Y*^KvPt|~;F}gNpW7PbYEkgOMK1J`Q)1C|2*dzHb zP-?LLc~I$ceZsLB#%$=@S-s8ay1|+>?;UXXfKo4Al^}uHuwu?gP3j*oefKw-Wj5E0 zGi13=gzPuw;MpFs&p=}jhnP`<1S{M2$Q0L!64k&Jr5|*c&}YNrSr+zQNC!mt=9&XJ zS=e(4UHvVd4T)jmPFfk`0N*9<8;z<7%ge$J%>Lp$ zJWYuQ^635F;r&|#z6toXCBTKXdvi&as~nsbGo6z4-xB!uO#AY)TqPl)YyO6(F=U+J zvp0ZWF6wUteo2W6_V9k?a%q+;Ti_dke^}r@Q!}nG%as+fzcdHW%#eMB^!|gu&ldQZ zz|R8y9^f~ZWx0|BzDfBK?mcDwPu1*OmE}qdp_%b-2*rocm}B8Dbf#c;huSY5_=&)8 z0X})#%ECS=eL;hAt|;Lv6V@00S+4OYqd`9F+KI4?QW{W7DoP0#rN}5{e2HKANS7ut z3;Q`EU0xw0vAa`?b0$a8o;>j^=FeK!v7y~R*3U5mbqwoxN;Pl>cCMs%Mm*$|+x+Nm z)O@Q6y&gHvkW0NDx!-{PP8_Y*SSared(;sYN6A7oshZw;XvhI^DfJ*w^S~+}1D*IcqxIbTmjs zpdaLP;f7N!I7><7zWi?L-^kDc^ejpnVfk(H)3*b#msAq@F#m{yeP2mrb4hppW{mst zko!FZc@5mG_7{*cAZsJ#;@muf+>-c-fP4**Cw>9x3&<0ZvN6{{kR2ga0&*JOKHkG2 z2RYmwE2U9SQ`-@Ac!(_O`Vz|B^NVu30KF%&xu`pbAe$47qTF+U%=!i7c|c}G%B8u5 z1eqQ3u7JD%$i!bjo&;oKWOG^fDuPT3dA~>6gZ&Zk65=A`zyW&ilMKJnejfK_U4F-V z$i5`XGhZn##E99-=1hP+d@X!T5nsDzWNfxkp_kq(f5zLWH2VMESHCTJW4m{!WXAoX z;5ONI2CYm-%%0@$FZkDj*Si;ZEdu-?l#_<4!2dk=pvO)xPzikas_KMVcTD zYm!rcmlJsO+Z>XL{ol$fX7Cl@Z{A-VXx>lz?%o0QEG#|stV?GaHek@?<&k9kxhvcB zZ3*lDooSRA_w|}X$+}kiC?FRBGOZ38CGT(ZNk0DERbH1@%K95kA?E$1W6h7j?+)E& zjD2^Pq4{;psj!JIBq`bEy!Q|6F)3h6!j$F!wD4`jb&x4^Oi@pBXD{Muh^H}0#IOH@ zcK=~tCP54E53KL}!}Zvw^XG>kNBl#H6OT6M#eXOo{PFw(H@%O-^E}Ehun>ek`bS8^ zzv2C9sk9o2U50!1vVS1YWNd_`3hed z2Ycj}Fb^F(alw6$2H8er>#fc$H=``DIZ=>az>1q{X2Nb_Ijkt+5nGQve!Ym#g_V~T z9*m@>#Uj2C(vj7<8gT<=N`Ko1&=JwoC7ksl>bTJE6TD5Ys(bf)SJ_`(NgDiu=w!UN zF++GTOZu+42G-cK0`#!L{&n@fxN*Aa%&q5YqVPpFr{f+A#|al`dT3?6$ojP_s2#JkCLSIvR86=M zd)=RHL5GxGmvAn2Lu_H`g4AfwP1Xz1LN?rnsd?`pZn9?KH@O0x$SjCa^{U>yQJ>&+xvlewDfccL&}yDVqL*okq=MU442g zX%<=k*Cw4A+Cw?oyuSz|ry&adzGQEyDLpl=9=k!NZ;M#}A5C%Q(ADwgP_j_L9##;j z+~vI}b$UJaicERM7(b@ZUHx@5`z2!h%yN$(tl4~9mZuK;e#`o&P*yy~&F3!7KGwg@ zl#H>HVxEI{8I^xX#=5ctBL-*IcfN$)IaYx+W!hWm=CHz_M@&BMhEMatXn`NY_^7$N zK(F@(#|#%^W;x>SF{2b?WYIkuFEh{*&muH9TAsQ0^JvjwEIfUWH^kvN^PaLH5zp!O z;`PaR#-KCagW9<5qsYr=dt&r6NfhE zNxQB=A$FXiMZC?vA+}X7S%_vTLTG%rZYY~xLwtG2GI%kuI{OhX6LI$#up*v?U5n)* zO8B?1;-svyX*zUegYhefkF|I;W$Q5}XL`X)%TLbI`>LjIgK2Dpe68O3YL5~(MM`F( z#{)mQDfFj1C&dcH=4|{C&TYR^VL!#{RNQQXHg6$9_xld@{MFSDdDIGdl=gHohSnv8 z8y5;rPqZA39h`Wa_nC#g#FW;rT_JT7j(XLnw`%HjIG=M0_h3ttrNm(aN8rsN#pm&( zquWNjv!qLB9?=+W2E8?XZVOlzSO2x`QCMKkuR9KYK6PW9d30mEd3wDXxsMhlBKI-m z=GUDRK+v4 znypv-$fK;z+wftgLzw|#hm-eQP@)gC;OthMVbnIgWmyb<2fLB>!}@9ZS^CG(+V^d$ zrdEeixnc4v&g`SD164}!q(nu1D^3nb_3zRC;4FPE>3;yEwo?FW5|iuJ&ymey0Q451}I-Z#RDo6P@lWDV>CzCgds0e zHv#|W>!il`iMqqEl&)wE^ zO64J%$r_@WB%+!B1ebb%X7Yz-iraXHH=V-{LM-|*-jlW;Y2P9(1Zg@?T7!V&7!7nItrh-j zhd0fDZ&r%a=-7gIsD&sb0CS?d?3a<&gL3AhoHS2b71BQG@e+8%=}Hifv8Y9S2IBdM zhd`f8<<3TY1>(^nt`+ethqlRI;A`uNhs{U)hrbiP7TnefD@JWo_ur|WT2aqL#6SJJ zm3)|gFduRS$rrbCX&rtYwk+2@wk*SiEz7kbTNcURZOihykV2!$mWAX%;c0mvd@oz+ z20&rENxM+v)=7=$2V4r18OB*W{wWew9xWtTijK>rN~8<$Bs1wL-r?2evJ=D_IH4mhswX z{BQBzlnna>SQRVvw68IIGBdMVr?KA&FI+XOF|azcB3+*cOBIDnY4UGnqUH%VWFy@{ zMfNXN_}-}WSibmd{P*A(x7AA>tX_OjBCK9oVD*AEXbpqy%eyu62JK!9b&h-RxjmRno%om(#{WkgWdF!_?8|M$v3*z137W6VR?zI2lA6!NuHSjNm@3Mbu4Ru z4Gf^-O=n&6@yx_CA5SBG)uymQnjzWlDJ@p`pVSIJc?Q2v;8kN_U`j3O{rr);5%37oAh4TK?1$nXb0&)s_O#Z19=!_ z_WeZon{VLk7v759qj#IYlM-P^Lw@@|MLTE1js_HWqq_+60#br>#A9KlT?eYWky{MT zk5nB}$&N;i)Ppy=OTg)onugRgwy(qsse5kZmf{2;QVmEouyLhUrx~{jW7UHFBXDA| z_o@`K!8IF=rkC;ERJ+gMNsH@Zj;Ww0vO2#IdFAk}X?2qCS*vqHAN2uwJwOlNU=3E> z^f_7B%MdM+z0B#h<{^8T*N3ExJ0`2s7yC(=b?q~a4e8QD_A)I)_A>i>V1viTioI|; z;Y5^l_eQ)i2r0@=vO==LHzX)f*zEjgCt2}W;hXfdML|2|uRViv4~o&zq|3)hXao*7O|h4AN_Cw($tGzYrc2kY~?up_s+N>XR-lL#rgP~&u1-ne0w5{$?4W*H#b2m+Qj&-SG0zqiZ)*Z$u5{@opr zI!Q`gV7m)0Yjq~{s_{P#D?+O?wl^C&x?Xx??G5Vjh+gWu@LuZi@x9bGp}3_1vwU#z zyBO20Gc}*XUaRAY410-se%Gg|FFSmFPvAxo$p_rp=eG_YAFm&It=Eq}ugb6p!MBiZ zKqB3M)oCTY0Kz(iyGbX2a2mqbXl;+M0pZICS0h}Fa3{ib2-hKe9(say9jyN)*!#<* z|9jJQO!sS?13re(aUD(rNTe6XDF9vg*DLe|A!}IiSg#*d{a!eotZ^_&<4`It*dq2^ zv_-ss8@m3#r2hMbi!P4a=Xl*;Qq!^aT&|BkMm7=IF6?09fzYCfxVBTATFU(;Gz#g|R1kyIxJ+I$Qap&yOcQ zkYrdtIDAy3W%a7bcKJa6p;6R9w(CVq?T<6l3OZ?cp$2<3U9i?YljidAhn;8FKI0(+ zVOeX^aFXRLa#k6jk@oc}Zz+O~DA16KHLovOZqg3gTQwgcEp+vy)e*Ubb)lv?XI!o& z2bySLgyXCqEUbYM4~%Mokq->t!2QLCiVq7N^vN1IZ(rW3JZPKg9VM4wZ%r7Pz(^Gs zI$#6_hOU{kCPHYPe^=9-Kd!)%k6l)JM=5jy0>cQ50D*DO^bykbmmVsG#~ajYdyQPU zuW(f%_FU;5WtVJY1%?S2UzzAT&H-a=AnBLCgl3ucUJ0+Xrg;@w_0JlNlE~tTK7wy+T+TC*Pz)#U$<$s1wtKFY=XfL@=uvZb@ z30<}P4K71+MFxnBO_M?62*Rn`+TVdIrYUvzoI|Hn| zNi$!^3N2K|S(97eJXps48y#WYWi4g)Rj*|=mrVn%1Gw%!BV3c*yedLq?)wF17cg^6 z!%J5ezLq7I{@CNjB>FJu4;RXXw?v({`~vG7y|1LD#Ga4$mHf$rMRaJ;M-(*YzYnZc zoe$UX2)(H|ym)mU-c-C3IK8MNQ9It0C+BSgPR1{A%=Dh3mLhu&-cyw0!J#pQ_vAL` zWCO>qGuPkDP;C2S_7Cl2 zj4z0Fz$50Q@6Lj|8_wYLQzcG4jp&d+@sB;K{875^3t8Zx|8kB(g%+|pArL80CSF{eR&u#UqH{vX6DSViu zwT`Oa@V8+2G6|_yHeq&9=N8HJVMQr6Me4iB6Uwz_)?Z&E*B>Yft=Be9%)y+Y9tT}Z zLC(Z_?1o2ASodzS4`5!ZnOGlI9A59!bTAiliTVlT`bYmg_ub@Lmo78%EpNcQRufr& zpkzwDchf{ze;CwH0%lZnK|aBxWq$7ZxXueur8Uv@VWqLq$s8=e?4ynWR7mvS3kb>p zsIGPmpqA9c*B>ZLfNln}l6K;%8PI?hteOSb&^XAqnWV*dss?e$J4yI|L=I@$c_VzA zV)sb%Gv?q%>_s=H)$ep2Za(2^(QQqBde>Rk_RLyWUFJKkps3ef!TVmnk+O~T8=>b3 zfu6^=QMr4rS<(2qt32~_TkwRy#sy}%k>-g7H4Dt4jhSX`Bj252Rsv!RAmj-n8net3 z1w?F3mN~p}so4j4&6!Kgyzz6}#0kS1mzyISNvANTX1RGv;|jAk(j(VCZ}tORN2b9X z-AFnGWsSic+n8(iLT>b%Ip*QW?aVAR$2TrVuESJlPG~fmHI1s>tIYm@iT{0xc@|)- znN+(!n@Y?{jiu&yT%A!Pn}QnFqMg*cKex@A_DIv~H!8M`sa~_|b;xV*Ul{$m>*79y z7h2%=tE9nSXc9`X=C?Ylt%VK4McgRjcLSGRpVmj;3 zevu&=S|@rmAK@Zbw#pvON2rJgS%W>A(-0B&$NM@GrJ3q_MN@D+EJ&jFB>S3Qx&2a` zqCtutr?^ovT`zdn6NMLEga=`T@F2_q9|ibCM@^5?6OMBfLGxJ= zvJmMy$C)02$VNEA@jDStLwLLcmgq>2M|iAbZI5bqMTmccSG~nK%Hh@YgvG0VnO@U0 z9Qp-|(+??r7H?>5@f0Z>K9KM9kS4;rX_!d42fsbvAjPMN?;asiZXxBP9$$=FJ?wf2mz_r+Z~0V1W#KDz0R9t&(jdltHR)T{+U7M(p@Up==$Up=q8{l%0~bi-oH zr`Z9pLdp>w%7RsqPDqtrKfu@gA=Td4mTk$=(Dm&%MMKvbTd!?|f8t%fZO4-nT2wgw z9;D-M_%y`>;w@7=MpFW4HK|3rD-aMfM43K-(&=W^1vEh_G0iduHYS-z;SxXpT|t0( zTEMt{FQwEy3YZ#GiaDrJkI^~5Wz?>*fJqfFkD?rdF1_xtrgfd^=CO_QF*+BugzOp* zhcNXQ zG+?B#abLp+EsdFQ{eQU5=+=*U$5kEmZ>|q@;M5_nyVgfVHC^=g#hPzreRS)jH(qzO z_kU{!Plh#d{~nXVyx+*pLgOSUcd^hd*mq&kJw@8q&&t2K36u|rB0gWkKyVsLA+e@h|l@aX(N1FxA56#JR|>-WPVkSqp=111wNqgr}O zXm@mE-AkQeYet$!)rZ0!kn9B?0fZ3{AuWZav@051SKfJ`G}s(czaN%>WGy%b5GFu` zw)B+IZm3*W&;FO z?5@_5T_8?2pMWe1z8prjf{;yh@4&m+BzSQ+B~Pt?0)4vqC!AS0WN~i%Nr7Gsay&kC z2l$}G_~eCX+%QTzuGFg&ZBo-pi}Xg2h{-mxER;ll2P3@J6CR1M$rJWNc$+7zLHI3C zSb^|w(U&dQBhN%1(%RE6oiXY6?1TTXN=fC7M7K zp6680Gr;qNDXD;a#PbaFJRkQw<2+A)&vU%z8R2>2A^x6xvb>_8q%0>NvC1`-EH|gJ zC~swDRYg(hssuT&tQ5huc~wParE+0K*&4ZYZApn-R4JF1RmtmeN{R^YA)JJq^74XG zN@nW{@~X-z5)xKEyRxDnr=+ATZ{<+t;+%B_`Epg6yttsWN)BIBmS3<&E-Nf7DJm_P z1l+~XE*4qi5PlN++sf)SWh(_#B}zw4r$BRwzo~00E2ical}`OX08Ci+gyY9$iUIn+OLo-wDQQp=`RttoexU0GIG zRb24m%F4CnXtGM!@lGfy$p!f6yz0^7ty!ml;+E8ke{=vK;)I?qbX(j9(=9v zpL(-qFT1&^nJq5QStC!ClhH861!%En-B>6Y_r8=37E&p{SWqS6IaPVa0^}ku*Nrm- z!{!$hR!v=0w8~hOATNHQ2$1x;xuv;f)gn(`?5=)-oKa4_SvmOPlA=m#h?_OF?B=V# z$FGAeD0qSD%QDcBRF^p=WtH?Tb4m(wD)3xXkhf08Q*<4k&qqbaK-I#YpPf8MJacmM z+;R7FL4mui=j4>;6_hZRf`2znZ{hbETT&`M1>Y1Y&nqY>m$QtZm3+3WpfXYhU_n*E zU=mA|pJ%_4X8~^`lh;(PqK0~~or+53DmOOngQG5zGv-k%yiieuQgQ|x3-vEAc@enD zIj{}E-_6%x^;(u7Qy534Sk{Z>1%tqHcox171iAh2OQI>!M-2t9VUo^`bG|CH*1eS5Xayv zSW{kw51>B(xnBhazH-4@m|{{lvDx|gGWybuD`y(ZN(+W^Q%kD~DlnP}RxYcMLDGdq z)pB^jlvPvY$x-n-UBo0DGh@0ZXMj>7@C!?jQ;Jp!n(85Hh9`}Air;*#gJ|IAt_9PZ4YopK#E4HWt9Vf^M4hS-@l=t$Py~S70*tdY zW#Am>1<+$zX<<>t8qn_V1kHNJ58`ctc4YvpE2yZH@j6;05aIyq`(aosKlm_(Xvd(e|Px@@1q8{*3w~ z=&mCmC`{=?AAtA-a7eJ$d@A2PI1@y?3Or#=LFrn;!Fz|gsidr|oYJatib@Ekq-+%< zhVUSKHSzCqG4+Ug68wUUOtvU>e#Y#Sm04-2&!$pZR>m{W%txp?zar-a42j7|6QAxL ziVu7nWAh4LEYHb*GQXl|T|ud!#0P67uMu5SA((qXeh~;lF2V>}RgnWSlEH6{@?y+T zm^XAXTnk7(>rh#-dnyt}ZT_M$a{+Wi(y0^50Zc z(!5`_c3nKhU#Na@{R})k^%tL9onMqwQcxkn?jZ8>K)`6I!8Y+k-RYHi6$J&QZrs5R z_5fBF7L^ouT2ch*U3occ3Mz60ggc0|Dq{g=G?C^GB2CQ2?t(;+a7zoSUMQ<59_*aK zD6&{J2^3Y}K%UH@DCNC?`j_XFW2lM(e~!|7)9Sh2AltGC^Ls z5<@}`f5BLU84&Da!uqw7jErmjqxyGY0k0*+*d{1?`& zEH7ERs;G1&rA;X;Dg>FZspS=Ac~d9kPt9ACPcjeX0rW{XDDv|Q)=ed0i(rT9G<6E* z{hSgZ@F0Cq_5sY|>}NAp&dFGiHG58$elAfx6ZJxpe(p0X#ivZ20s<&3S|#L}sYAq2 zRk_ZCKR@Fcsy}^C%IvJ!ZY;cqWUHy7m)-w~)&v&vJTxK!}p0E+r0&(D}M&t1ER z>yk_2j41MFII79uyG8y#dzU){a2ZRop2?WI;2HTznGyZF$sV#J^2*j$tttcgA^6~! zctED4k>nOA=giN5stSGKVNOE+d!P?R`V>qQ;1g8d1E2iQ>Nhwvz_arTfRZogRLO)l z6c2^I7erHj_Z=wfx#baA@rx_I4;C|y)kRCH8KRBY6=sJN)< zQSnhTqIJlEjBK8dTe~`jA^=QQPZNQ#Y~HxHf>tmwCU60r_G4d#YM$M$Hm0O#!ZWhi<=%7 zA2(yVZhF-8=;<-jW2aA>9yfjZ^!VvB;&t&+@zL=y@v-sK;^X3{<34~HGf>4Dc>N3% zJp*VnkVM}cDTBvhtjWok^AL8+ARbv+HWtt%8zC6X0x%((FTi%Dl!|afAton1WDJz! zPX9Rp-7|$^$YK#iplkgvVINM600Su?n8n}+L*+f32$;O$RTX7xA=bIym%HlOoFX9) zyJ_G70D3P37EA{Zz!&}ukNTCCRjesol~-0$R^g_tDU}5!4;0~k2hx&P5g!n_9`K*x z|F?GlUOxmsSUii!$;$&d%@Hpf`aX9eqO7uNO5WOv%CZU%1ikNpstkQ^GNgUVqq^sM zDl^y?X_%9VN206;QHOB#Wn~aB2m2~_RR(7GlAITZ@@JP+rDCRiFrJYQfo!mRA#)Ga zJ$IFe>&x=if&&l2B(JT)jN%!qQ!vUOsL3GAVk}wmuu>e1C$G)TEh(5Q`tjkkjI~5S zgK1f1IbvPpju);Q}iIJxohbPrRsszptu04?q%U8- zAS!z0GxIZ&XU|``a>2@|`7GyK(zj8GBIQyw?rzCBY!T}!3?OL{+ zf2PHI>>5@l`F-fk-j@9LdeiH6dP~O@%aO8E$#UZYRdJWMv{lVFYNfMk4%{BK=4~z8<#ka)3lCo#X6O!QbHqV-O~6yob6QjZB??<3VvHD)hansK2s7* zzY-|B_(TA@%kxEf?X5x7KK==}k#=0c-&e3}3c&Rnkau)EQSQ+a>c1DI(&d1y<|n<_c8TBiqN zgl$nJ;-ry^cP?P}R7l+da#_N5s<~+iYlekE7Ag~ncJu;wI;i2-apYYCux<_iFq7S* z;9hUuoXJjkLyLG?8+86Tc1z1YevWPT;Rv_+aBK&ED8gU(@b{l%SA6*C=h$^0zWq67 z_Qkrj$CvjlWgCZ~sODk3b17@^(?hxI$G=&|-X4AupK`~apU7tB06??{@Lkz#dmw_l z0(sj~b~=#X$!6yQ`R#0WX(Ye3fYmU}u83YYFQP;v1K; z+R+;j-W$yCE@7vG*CTvs3_rD;-5*0RTSNHXOx75}_hhnzA$(&dvxZ>pa_KSNp27Ma z<2}onc`U!aoShy!7U8>NdF>Lm|8ahP3F~>B@62Yd$NAB9lzl_yRMn7Gh%ui%7*JS$oNN&zzy^+mmpSmf$D}yyp;ooGiBUAYC40dh`p!ZDW z{fk-WRNl9kU7yO&EoRNSBT{z;>yF~vv)TP9-m#qRiRLGlv-hKU%W~EeJq6)!Vj?j- zW7nTq#_ZGh`-|DmIK1y<96z#zby0B3^sF6A*uCi-MK#CsgJ_F*3SW!oZ!c#q5pJBp z_bg}aGbsJz8T_-Q?8*#&ekr>?gP&Z=_9UQ~QwiL8M7wv)63ZH1iot# z>zv6?En`<_@)OHg-%Nfjo1I7m;Kf9~YZ<#o!N#X}FX-zj1kXLiPov&X@oUSO{VBfr zdA5C4KH6+g(rLx5Y_>Or`si>9-@KHaLU<`Vm%4&udu|-kkEio1OW23${PGg^MLNH< zgxS;SW!vZRtJ&<}JPMzi$1i5H+w){pbUqb!aXxQf%B=JG2^2G*A79GuKRXd!zKF;N ze_hXGTt~ZkOPQXx`LGrIzLss^ceTtc@n#=(LgM$dtVhASw3rFP!Topf5DN1)2@$)B zG7hVGn^rpI#jk1E4h`Sp&5moLk-O2GioBxb-)Pw#EkT-m(1?3{sC+bt_*;QGw7;Vz z-r^SmddTDl!4#E3kCH@rZI4slfTEfB4mjTR0M-GvIs)7WKzlJGj9>>9yf2V-6OZpx z@Gk<{9R+U*WXFjoy|3h(1KBxnrjc%DyBBQsQFf5?BagCf;!k~??|78m;oLrobr5U9 zd}aQ1%igl^^H=|g;n(rLJI*38`Yxvbstk#=f9>sQg^F5>3HJa+I z-u(U}@F2xqqnTNYgb%g+&S-X3%Wscnb}c_Knz^*Ga3$iyca3K6`|w*q>@Ky;W?z0O zi0$y@?Lq7kUF6v1%kMqLtiJrpW9$U+tuw>;-bdKS!}y8ESgjut>cG8%!N~ZjV0M)f zdi?mFVAkiyFOOu0ha=(YaDH(l>l@C$7|HGr=jM^@vOki${rUT2ncbf^j%AI+@D2v> zu18o~06+Z*dz;uE-nI$%B?osu&5fVdR=V=e1d@cmkLPr-NiupLT{yF<}Sm$d8> z`bx{L@bQ2=r{cS`tXt)G3RvodHZ42hMJaU}j@*+Pg1@NYJG|KzP@9&Wq4ox`0R(?k zmr03-k@y$B^ckJLn4mMi@nv@vyx*67f!Wj#Q+;@Y zAI;Ny{g_!b5xFKcKj=p^ad{Z)RrCGB*ljg`+YgcsxBIY@UX*gpE52(O+vUxHyWgAO zA^RN0dod7vSv&p@!~8|?m$d|Mg-qnjPWkXHsE-c^ZY_277C%B|iP`9bqnz4vjGpGG z?I3N=E-4m(a3Pj(2C)I3I#R$vj`~R&6#+fa5sC6nDc+WPlx({IVg1jcJyJw_Y|!(w zzHC7>-h4!gJm*VN#3^5PQo&CktnfqnR!-qPoOk$Qv;?2@rGawUhxMpdT=QY))P2%% zUm|{F9Q3Bru6U0}N{5zM21Y%?Aa)89ZQt>s^3A?7-ep8R+K-C5W{ySPM1EPth~dxT zZECgvfu($}7o=o}wtS-(+br=ONG1}*gU=*>Ud`?i$!)>VSFsZc%;6A0%xVZZ;A+02 z>`-clHx-3f6c~LF+eWZXB^HmTG15n%!7%u?s`#amY^RF1V?d}NQecel7|AZFxqSrN zN~7ECH5N<-1Km1;-KB)h8f||d+oK6ZnVQh^BbZ&oTSl@w8jdg|l!GJLX7u_<*68hr zloQ^g>PE61T1=2%Xo>rvO)x0ys5SQcgrn?>KD==l>+#v4gx&J+@tXr^#2yc1Cx-Kb zzU;H%94S|a2b~CHJNzkp#6Jkmhy1zKpN21Fr2tCBknIg*rvkVgY)*tf3*gp3b~%7w z4P<>H=f3G?_Tf$D0?>ct*GptTz*sNnuFOpJif%hhIawl3&bZca=d% zuT?EV$~P+cn@qM#y#e87FMd9gwR!Q=nXE&@Pi3+r-p8emOxC02Co@ULJBZ?j?NDsV zWEaQ1uiBi+u0D}eo5}WvlhAY|ocCw2`{DN$$hbe*_lpenc4QXH-SQ;W0NOT% zUnN;34lo<1CY{S*pG~c!lDcAp-p^nS)9xw}*)xNmTfo|8aD?w5ypWj^_}PW*QbHWU z=9&ECg>27Eel?Swm`S-G&KwU&`%GWF?cU6T5+W^6`R>hN9Z&I{kVc;3%^9pqq}+Qd zxE3PQERNjkvvyEj?t6%Kl7r2>e85-GAkf<{0>OfTZ!~I*Aythcn+^OuYP2 z>hniv%&q4~IJ>3XD0OlyIRrZEB$z{DE*?&(DF>x?i8uqwK0$f!1QNbXtTaAor;-^H zjw{*w(kZD!!RnNuh@7A)cMHL``V;Kq^sZTay8`Q$a|)WMF?bXd2b~~+t@wX{)dBX% z(-WxN(L{pjyjua01P0#g1*DeM7HE&R0-4b^iuat1`dja>K7bryo>X0H8ZLFy409T_!Y1-6+fxQ zNI)gBMI8i>*9Mntmq_@c{!Bu8EA{73QozWa(qW0UQ^r||BZxnl@D6E2d(211QhrvV z&`to(#d)8aT~~3yZ6smtGc^URYC=K( zXAZT^fBQ`*{#SeFA6sWt#_{vsd+zP+y}f0@P6rkoOBrR3rec9Q26SU6;(!IloTQAl zDbSK`tE0?e2=8Syq>ec&HnW;#)@3oJ)U}d^%%vgCoCr%Zo3W5tNz<5RRMN~k%P6DX z*U$HT@5>N1;SV*@^dwKe=Q;0lp7ZlP=Q+=PPb#^dOH_V|{`dCHcFHj|c2~q~v9J0A z(;hK9uw^2qN7ep2{||X{<7k?sr_c96EGu7j$eQhrCP{~5+hek3v%EuCM^V!sZ6f}% zwaA=MLud_xJ7Y@VZp#HdRTazj#k5Hd#dI(qV1JC*^D(SwJ85OU5FgY$8;vP?E@lzu z;Ei}cHcZT%y!%3(DwcKmy0-he&c)2xh&^RZThtz~rqw=0d{4|GgG+%UW6UCW)=$6~ z{Ws~k9X)*uuv6L}aPBKz!V6-jo9Y)klhnl3-jQsuc>=F7_BGYQkQa57iYiG&<0ByGo#NEl8@BMCE| zXOAV!Y@XelFsJ0&;5Tl+E``!nR7}c}btfIO$C)?am{Cpl3coDg_4X^B;;kg?!Uba; zcFIVP)oJFPC?+%Mx%J*6|N1S9o&Ns5r_p&Y9ft?#yklGQHBEn<(58*A=xF3}yg|pK zc7LAfVyYy}zStsCMsUyMn{#nHlQ5lmNm}!~Dta`bRze4s>Se}!O%5K9{9gCaeR)y{M$7C;#DOS$rSDjMZ6_t$8EOI?3cNRH9uZx#uYuAXAc*eBRbq2^)33h^0CCu z<=Y*FrY%WyU(%kT2t~2=FrLSg85S+VldCnae7|hrO7gF>qmFsg(dT@ohG(y@#;yv+ z=*A7#pTR@u*q3|@muWgptK!;Y=rvAA7->V%jDzFxm6+U*qj5bxt$Ldxznr+{&y`;$ z;eLB8#<^=47bYfij2UTPi)4ry<`TNc#L7o#)@*Izv45tAWpJ=f! zckqJT=OkBSGuCX?QndsBfE=}UEXvD=VT?lpoxz#?(npbf%3>8T`TC>fb@r4)b=dHD zCk{F4LH^%?^7Q$8W1;H2#_nQoi2MCMamRdq+OO zgyresgi@yc_|ANtb&n*K@`ogq2S+c`C-O$SzXp&3Y6<-%W+=ImTB zoHi%&?NN>+`MaFmY4dDKGa6sbWZJxxvhSqLt0~)BV6r$Z(xy`<)WNh$Z!cWP->}-a zuBdlmt`EP3{|FC^qc*bi98Q^uh&_Z`DXN1chwKw6v){HmGyXyUc*^$=r?j6OOKDNy zH-x?Mi+Oq|o*YY=w!9Klj3(@nlrx+!bvRi%Q)X|{BGaLR)ypX*z2RmxuuO+cNJLDlyy77+c)zZ?0qcj)=zkD(?04o33j6oT;7v)kAU63 z%(~0Zcy9Y4>H$^{(I4R8Z?bOppFDTL(X9I#SUwz-+x96MUcJ_9Dpxh6!2|V@~kzUnYY+;50XB6 z6=MRnTunOTGr5GefjgIa?ke!qHIh$eD#|>!27cAGfu2cF%Cuk+k# zu<3fwEqd2;kK7Q*58p(e!dKja3|L*o*nzDp(DUNOnfg_p`y~9xZPXte_^Rhlfp6Wx z^PeX&C96F*an5s_?+o-!gQf7ZIllUC>J2{(D!ua_&ust`>lhob@*A`bY^X+GkCQ2R zAkecPEPjvn)&~4kJ$(V+{19^8PUZ;M3_tU*>XFRMJi=Up?`$9sIJ=QLgOi(>%V5nn zJ$K#=b=XQDfCb;CPU5%INAJTw>w&o*nCpSL9+>Na|KT2}<-4_fXzh8&bi9vi3~Yj0pjK$7@UOTu zz`+^E)FU&97q%DvAT$IGLnokdXabssW}$))9J2r_g({#`&>E;3`frz~A$oFI#H`@n z&ePBf&*TP;dRnLmDuzm+rBDU599jjfhI9^4yARU-pXvkhkA>QlV-lqCzYF~*lHbEm zNWx#_@K-tfZ4Q5*!*_Bx0~R3vM4d5da6aW-0+xR%Vm=FUPBMI=V=CZ_bNstmZ*wJu z=%b^PTvn8CbODThN1cC@F)2`oXMP+q-8V*zYB!RH-vQKJM%{1Z%ML%@@O5MKJ5v?H zp90mM%X9dF=WSM7vf%B=@zJ5rPl0FF;(!6~;`t{HZHz@2T50bb&Go_D9Qgm91L6Dr zAH}MOzvh1B)?1e?EM3vm%-x=aU%0O9+OqPib7)qSQv?2wNnN9H788x#aLo!6Pv)&i zIQfxetRQl+Epp~NpNTGTE{zmBiyXt<6z({+)Ych35O3j*=BCHX>K<=ws=ubO-uPTY zE%%|z>Yv#3*b^HADgFNHfx8#FJGoOK%HE!a*W|?l<>6+4}Mjmah zuWhL{Wh?Hvvy5bwA4D7Lx0$ks8XkOji*9H5IUlUuvV{-){hVQ3x&4B+@bCO6tac+8 zxXK>cOaX!7IzD3OR?IbBaqV%Ug~U~!bO{y6?%z?Doc2sn70N<=lGEO)JJ`C*z7oH_k=gMwEG%dI7@dPpu@EBU17!yq|P6BNqTY%)eP@QhM| zpt>n+fkL?=Yz@&rD|cH?PVHTYj88HYav{{0ftNnXRoRG7tukP8A#BHU@W?f92ajA9 z@u`bW37Zni?GEI8ef3vFj3|62m0`S#cp;>Im912M^*_oWlHuK6zY==*8Ta2SsPZKXNrp6_=udT zq8G~}etweu5N7!uob;;P1ab-FWDkZRlp7;KBsQm;G*&+rb=puB~T%GY|HV^r>XA`VJ1|_ObZ6`P!30-2d=FDf_W>ehDFTK9b z`MwWLk3V~+eNBk}g%so+L{cNUBC!;%v=qd{kGqZ!V-AkbdMpZmR^f&$k5W~spK7Or zVhv+)%ro_vM+BRw(!@PA-kq^=>`!jdN)N`Z^oZMX$9=BO3TlCe19N9C>0_88kvaH2 z=z$h-pzWz(V2y%PrLi!-HDOFUVJNHh2;xqR@bsf5P;&K^NGGLh0-qtBLi!x(G?MM_jD&mv_@(V8;6IW6h4dBDd8CU-^+@#BfOHAzJG#K% zWh-D!fNe+}(zQu~S0qT_dl~)%a5GYu?4AX9H&PE$FWm>r6i7-WMy zgfv*X9wI>xz@ZXuEy>t0T$5hW-w42wNTZ}{>s`jYrE4F++hlqEAG_S&>Nrl*`sm>0 z|7!ThHyhnoJTc|zncf$^Jh8iav**m8G;wD>ePGkt33tp&_fCX{NXPc z9&Q_?Zs}onPT%VA$G^YNO*!(-iys`fq)or$he;!c?AX1_`H9Oz7Jk^#x;ppZ$-INF z46YxQ^Qp`I-#j&HeO<}K?640mr*hZo8r|n@T05?B=~v$-7+>6~J2_!aQN*DC&Uv`) zhuO)4p160%;eUPGa!OadWz{}SVqN(k+D9#oY?{01V8!?^;vYHCa=K&iyry>_n7s0} zhd%!MlFEb6bq*f+@;Bb)_1h;XKU&;<#xi;G(Py7Ey>u#fvAgBU+bf=G9bxhrxA4%q z%vImToScxs7y5V{@IN>G!Q?@AP3-o*BY>GAA6_=};>VVme>nbZqx%!b&$p$Vexa_U z{r-vcva>d@62W2 zzx{UAisgUJF7%1IuxrO$KCSx25$E!ctXu!Wk{r$c4N-q~KIzlaQ?okZ)JJb+?R)Us zNq4OMVbQ|Bx-I;$_(a}8@7sDdop|*?bxI;llF z!Tr~iKhCbb!|bkq6el=q9V-8+ojhK$qc68}R9-XET9Dv=1*rT28GX9G+wS?B?AjY-rw=Ra=>Ne^ejDxD_nO`Hqjvml zu+xXv?c^P6cU@>l?>jqvIAo`vx7+nkJDxaU{UiSFwQJ94JAN;>qpzhwBK;BnZnt~h z#c{S=E5Dz&<7c@Y{jcrlC(HDM=v(aaQ|$P^(T+dGaG-2|RR4ZEe*I+21f={=?Z!*F zojuF5d)`4i{rSvJKN{@H!)5LJBYr!|%F}g}9sjr6^_To8+aI-eCwxBJA6+lC8*i`L z@%OllpY*)9?D+LpS^J3IXgm2Hv$K~fJAK+}cl{^3>(zGpCdk@D&)aUtuLtb%H`wv# zPt#CI`lJ4gk&Qp1*J{fIr0dOg@-o@+x7x0McgxBXeYG7wnnv_LfanjklShLcy$9^( z(|vaQxzDcr$9D9S?fSn!ra$!jSE-TGA6;*>>)(8}E!WDA&+VS~w4J_qX$F@6(P!ZG zG&}uq_Uq55rhIDm{5^K#f98<>^3>i1cKSEoZu}M7@#D{S?X9%CUT8PoUG3Vt-mX1G zcI_Q%r+=^5@%tV-dHmU~{`+>%|Fd0xw%GB1o*lhE*y&raUHxNr&)cOQ$j|Y1&p+Ou zEslr3+S!Z8?D%ugZoV93M=#lK{2A@q^EbQpyl&UOEq45$Cu<*7T|0`g9g{is1aM#G z#@>W{_c?HEk91v!LVpb9*mB5)@;xVG45V_*3v#3D@4OlNLlDQFmdX#lo3WBdIEGtd z{xj&`3^QY8()CA}zuxc!J?Xj(<8?Hgu!&Or2T|T2Fm|7G?J)-HR}fnuT_44K%aXm8zB#ww)phw!`-ENW*<`E4k_bPUHfOZ0CCKf|#&PL!_4 z3}fs?JfGx1{96Nl9@KMetWNjIiyH?8g#vmVx1@1EG`XM`c3DDPxj9sr(z@UpVAlEM1>K{i$f5O@A)j z#n_(=95bO`MDKg7$DX0SAgNQ2FEI(S9tN>ZShu9{RBl!aF0$ zi-z|fw{aB2!T5A%pQ1en(H<|UzRnN&jPeQ6^FlD*!Z&j)RB8{3v1qJUt@T}46#B;@ z(2*?F&jf$}pypVy^!zH6f4I?Fp4#`+6zKZ~jvbfE2c!I-AYWVi-i5yZF_>deF|j|t zhdurd`eM@ulbt+&9{~P5&M~#rzc}#cjRKCHm7YJ^PF^bL&m$P`WLBs>L%hJhyP*G4 z`DJ$UD!mQmr}mGZx1k@8Am~#owciid(Ory{O4n~dpZ}G?v18J8@*UtW2Ge$lelO(l z+`}9@A>|K-ez`owu~tcchCtqoMrxeDn`MZ0|*k-)Qh7O1d5ceZO-!>Pz&q zd>Q-kK91E&`s(vL@Ml^7^=Qe zvm`^Vp@=1A0I;O!ga?w+^#%GRhQcC!LBazwv-5KG2`Q=BdTZW|bCS}EQ;0xHw&5`p zlu<~^C`ifC;}IEoxNoaH;O>GsvGGMy(~3&+_0egOA?bNZj~deTxshosX~CTMqG?5Z zfj%WYC^+eXBr6K?`GrZj`epipq=Kcnk;_0iMW2#tNLrfvs3A8!DJ?%gDZe1F|F$9B zuq-Dpo#p6r(sJ@yVNpT0KG#ZqdJ-C692giFl$ug#NJ~PVA$Li1T6|GpU>cuNkW^HV zVkjy^%i>e;6B!tQb`oq^YWo$kRCB8DH_e5iyP1ps4ofO7n%);=~D_K zMPX58q@t7}scs(^v?3S!rGh%SOY$xF&kDal(}lvJoMN-EM97hQiBL$Qdz{9@8m1Z~q7Ug28A)XK@*Yjf&RYTlr7tMRD}dr6^A^ZYFVGk23zmWUt<@*irQ~C%q|@NJMIxdN zO*a(g+pJ!EQBXi%FZH=gigMgcEPGrd~w0vp-d9OG>rTzhd-Q?A>uClCqlNR9=8{Uo z_UUacr-7f6hVB&Jnp#imAH4R=6!{gGy%Y|G&XAEO=a*z|rC`(^bsLgv6Uc`)~ zL@lftCR3L9AZ5quOL9_Zq8~WMg5a%&7nbCvg%>PYCORL1N%7+UEF-TVi#-ZYle&!Q zxDY^JtWV3%w*r==FNT+%zBE7RIBsR{9Q+T+{&pKj(@)M)vi*I&w;hiIit-X>Xbnr?v)^jVit@7a9<|OJ14KUq z8aXpB7p_ZDA&p77x?g8X0;%)^@F#O-=Pmi=(m@j8$lRiWk{g+kz=0(sXLmsR0wo#| zd3jlZQ}wxpOAF9OxL!qC!~aD3w{FqlAmn7F8?GO(LE>x^U6_{u`*y2xN=nMflBWFY zbW~iQiTXJ+B|H0;pJ1n4(?#<%7ZZJf)z}n@<_i{ymX%2hepT_vz`(5V>}-j^b)z{% zrZ0;rTc>nzxd<;TLc4&5tUNN7f}!_ z`sSU!DW4D}2+mJ26hz0;0Gpabfh4dc5~TVyF(4^kpN;ixU||u;hv*+!nvxCOj26om z1@mZth|h@+PlDQFVv+oL$|0qs3@oCw`izvN*;sIsv!9+sxwfo0xB+^s#OYpAeqOdA ztwhWUoZjC*TeNF-YGCB-)BvQwNc{DS;s2P?7mkw;#z6VpYvb0<3s@BsYx`+QNqMj; z2<#w4iiLU6jfPv~Jd~88cv9(Tafn66PfLo6jh~W)g;A1iCPbJ3F+%HAQUN*48FV3; z_3MI*(+!15Vl2!Weas^dOKM6^B%YiHLzpkcUEz7@i-~@g-7Q#Vx(O5YDHWn*z}ecZHV7&UnXw>B^_ z5HTKQ>iut_)@OG5s14AB0gjw#49HU2lm-EBTaSKCEt@9kAGwj{SdD1v&pH16wi=o= zRh;w&J~ulrCH;RobBl^01+V+!w0YU^o}e%NHu-0R&bJcn5~Edxg@z@$@Hygxr77JO zC;i#zoo%r$n|Y*&Ee%0fT456Lt;(39=`4lyXUz(9&D5i+T z&l#ti`&4NCz{Qr#1-C9PDPH$LN^dw9pw>DW!N6=Yv#HPcElRIg2 zjk%=H&qGn%!rz?O`Ptw?d~6c_k4#F-wyg%Nckuh4)Dhb4jGvu^|EVjH@iBy2|Njr| zM!*gFF(7#M|D{@i*|)w#w+_hxOUVJ=YhWOS%(Iv2=V0Uh)<-AJ9agt7a4KvAHv9^( z$0)ATY1=elX|4g0)TI0(a@~@o4IRn}PM4N2=~xgI>7x-Kjf{-bEn8-rk*q|f(Got5 z7Z+*RuEk-69GpKW(p%lw{*@J6fRuc3Px{tIeczZy6Q@~+`3zdSQM}+LOExNIvlPIo z?2T7!H(#((&W+b=Nx!^Y6RoeI7|wf$=<&b+_ANATOgE4YSLEtp9j(hl1XmHc)8`-% z4PAqmPJt3}4>C0+Jt?K2Af*Jwu_Gz&)e*}fI5;`7GTB%WAVb{zF3^h^q_%S3QZ}{_ z|G@4Og|7;ubBpqOoy>>)P#UnY?Owp$XaBxl%d5_6=aY<-T~uXmiL zleQzqABi9m&3>3n5z#~B3a4AZr5he9kuC6W?nd0_mlk-_ljhx=4e)5;vWtNht8)wb zSW)&%AuXk_NE{GQfxZ(qIPdU)^@xpl^2ZkD=1z7(U6k+d1SD@G1D`{Y$HBc+=3Y6g{K9 zhKWo_oSBzj5)MVQ9<}H{c_GFO<;O-IEwFBM{dS)bM-c{`q5@~=SO?lQ6NgLs9$82& zlVy;Ae*42@`<|jpDqGq7c4DHlM}Y&_JUR@9sBK=FbSxq|1`a3XMK06k&$UL8<+>R- z1?AIegH^P4Hh)mu+LpB>r0*owuNXi#Tx$L%3gQqPFob_|bqMAE)>m|tj}C@OUdWAC z&o>SL-AtFr{gLUCOmPRO)s2?dzmDX{G z?xxXsiqMPEd1+05qwrmSJOn2)VVD9$hfppBS&6{@5;xJZ{=$6$nO~=41N^>$TiIyX z+#9sZu25iKp?`;&`OlMaP#|U+Yg`_uoW-S6E)EyaDF{*Ntb0^RbdO@%R?QG+x}RC; zO-)^D$WEuDBeZplou})@XurU3A|_dZJ`rKPFf|FS6i;$uO+mgd4pK|I3UhFtaY^n{ zEDVaFJ7_T-CP~6kn*yBrDTt06pep_3G0tq(6dN8iM5mBp#E=U}!qf8d3$ciK2$bm5 zmPjrdenL=Epy;#p?GalI8E(rrY$7A)XJc@HtPYV4GPk1lEjsVyP+MD0PFZ0dwrKwM zdN4I98hrS7bs;{Q_F=955>AoM&!w~0T0NZdypmaT%J$~WUMAa*`0Z6~n-al=k5aHr zZf*t+YZ71441F$bttJ^Vq7w@XAZDDl#2NPJ7!l3QD@sCS4MBt?>{Jyk%}2>>LzW&p zV3E*?pg`QE!v+1(M+5EC(jpGELTtGy;x2%=g=<~kOqts7A9c~<>K4{&@qKQI43t^@Ku++eiG%-{d_BjrYR*3Qg|=RD~+7%hPaipQzM z8#(lwh`7(Z6homN2mWUb*!{(#Fgh29admlVOR*pn3rU;7g$S;QZ^ek~+}R?E;}M1o z171+U@v{spwOAUDS36j~Az#n18>r98FDgMj!f}`nhMgtS>mPlGIA@}PMS9zAv$!IK z0g1v1R6GQ;lo%UjiPmCqhGOg~*sf;Hw5?aIxzfsD50?G}d z+{C~@!lw~lSd^aT@85U1Bn@wQ(N!R2rrn)`^S*bb6yz+MZoN5c=FFriclW);&EZ|c zpZkx#Rra6r-~VoFe?9eIU-CbPw>NHSJKo>KE1Kfp{D~!adsV@PPPbmuclYpmD@%|d zy@yKIizJvV!E_1o63muhz66UTSS-Qi5-gSAY6-59;93cmNpQUcDFVgo|j;~1TRUjNrJ5sG)eHP1kDn( zNRZ*ZS$dv>1XU7rm!O9PhfB~)f@378mf&~^`bluI1Op@(EWuC-hDlH>!6*sFNiacz zi4t5S!DI=hOOTgfwgmGfSR}#a5-gSAY6(_IaEk<4y_FA}ajkd@-=HD*IKCBgkz*t9 z9`Y7~U*bMNyuVyc5brtfCaA`DAqnEW?)?Pue*OW1crW@eLA)=0j37QDc%0yLeE)#p z49J;aDBe{ksKxg!3C?BgEWr$XFOlF9d@qq;F20pWa2aDw1XtkOHU!r*W+I4pqOTIf zw+ze#4}jiR92<%E&d(CW`{3sZ!W!2T#QW=)2;##9O$41lk09QSHW9>o)>jFl|7L>t zz@dd8-j`>i@cnII-A&9}QCaA#Czev1o1w12*In2g%ZU3>tO^h3dD!Os{=CW!A2q!T>F7*Eg#-%=xp_to@Kv z_y0=?Lhh>xj$>>M!7KPy2|;{opp2k~vGoK$!M8XF);c6TwN)CxZC?LM_3&Ab*1R-ojae zzk}Ea20)((;=2Nu2>t`|Cy4Jpv=Zd-Z3}|IkUv4p^k#yv(-wkh@0 zLjD9JA%B88$e-XW$e&;o8^=lsJ_z{}oCo<6jEDRQCP4lK=R^JkAAHa4xB&7exDfIuh!2X^5Ih3;6I=xO6TAj{LhuieKf%S2Kfxr(pI|cNPcQ}YCwLa} zCzuNP6Z{79CzuBL6T~-eE)h(J{0ZU%FRcXi82mYxE_*kl%U>@X8Fdy`@iA8|!KIKt!ABu~g2j+O!4k-y;A4|d>-;A_yXilunh7i_#)&_@I%O-;5x{kU^(PZ z@MFlI;0DN_;6ccrpd0Kz!HpRI1pfm06Rg1aC%6gnC)fk|6EtG{6T}B>ECeedf6Ol< zt1$ivZif5`z6ALb?1uaaz6|*jd=zW_zvVx5FZgPBls@lPw)Wb zPf!j2_ic9cND~*951Zvsf7f>o^{;$4xc-HDmFfNO(n~qUK7OIW>(jLj>88Wq+3-a& zJVA!fmf>0%9xB6wW%y(nK3;~8k>SH-xVsE@knmAxo2A#0%9xB6w zW%y(nK3;~8k>SH-xVsE@kl~gd8UJN?s|>#+!_Uj`Gcx?73_mWz56kfVGJLlT-!8*9 z%kcFwe60*$EyI_~@FE$WEyL4g_#zpeAj4zFUTGm*Jab_<9+>R)(*Z;mc)skqpn4 z;psAbkql3e;j?A9R)&Yl@L(A}S%#07;bUa@a2f6{!yRO}#UkUs3~!a;mt^>P8Gc5F zpOoRpW%ywkzF&s#mf_oF_+}ZtUWTug;j3l%av5GE!?R_0x(r_=!xLoqY#FYV;h{1- zScXrQ;p1ia7#TiXhPwkVp4Ht*^AOp3Cd)H-^~=B{!<%Gyy$nAq!)t-d=^nScJ|HVw zBg3m@_!b#nA;ZgL_!=2rD#MFqc)kqhWq7g-Pn6+tGCWF#hsp2|86F_R{baaWhI`3y z4;ikK;S9K(XIFpf=YOjVza+!Y%kVQY{G<#&F2fJY@clA;w+!Dd!#B(D^)h^|3|}q7 zm&@=X8J;b}(`EP~8J-}+XUlM{3=fsz!7_ZZ3?DDU$H?&EGTdE;JIHX$kNrHqD#Kf4 z_$3*BUWT8M;U{JIaT$JChVPf*yJh%x8NOMDub1I#W%z0tzFdYE$?$9$o-V@|$?yaj zK3j%sWq7Cz50>GRW%zg*K1PNQm*MU*+(Cw0%rgGV@KzaqNrs=7;b&y{N#G%GJLm>I zFgW&)T4SPWiZZ!ZXli%p3}L;(0i#Q-T1R)o%wz67(i9TbE7Tn66`pSC6~?x;HnO9w zMI8OpD{MHDQB*8$|aUc z`gs3qh;s~Q+{Q(F*w;CX@`sSJQO5!F2giE6{kV4UY@g!g+HD61#eSQp+2D^y*cB7H`!?y;=%( zFSCPs6aQ?)klHbPxNfZO%szdVpRQLp)cQh%M%Px$CI;vfHAk9E&#*~9);`St%Z#s> zmiG#}Hm-{KU8=L?PSn{jkGI`*n%;VeD_iLyQ%!adT&Jy@xJ=unI-msFJkvoJ{J^T3wE=5%f7Fgbi|%U)jCJ^7Wx=tI zIA%;_`SR z-ttP`l+1h=BrEcXgKHyQrQBrQ)?_bP&gO`bwe$9IlN^q^7Ax|VwZ!|`&0N(2Ud^W_ zvvDgDn6DRaqm!(wZ&c|%ZxqKNc>Hd!W2YDA(CGz^>;oPEJOKDE;8DP%fWHPj8F(`A zSAZ7-F9yB|cp30A;N`s=%ryaDG*9AI6EyD+*kInLJ}zDZ;yUCA^;;FNvPPZkrhCw= z@_#nMwYGxyP2Q56$TQy$(f8zJ?*i)W0-h^pFLFV!4ow%D*|7FT=tsDd&M&G$=NJ2Q zO|f>6Zt$j2x(^fmbVDkAc*pX&CZ=@X+$+=?J*t@h-4`|~NT=7fDaR4aY-1Wfox@J$ zj?bEvQy|-xAl_k<2R}(S=%u+WYcx6DGjt9{y*qc;iKFSd?FzQOS2)=^IA&1nW7^Y+ z-n?Vgf-vz3bxx!cEBthGO}&A=!lE`N(!ZzeR3kLGg&p0K&$086wHA=Z;h%IX_;tG5 zb!%&$&2iApi=KP+nWYcL&NX?fO0=el|48)V-Nd%fNF{*SNNbA<4E%j^&>`=-!oP!Nf8c!E0*PSyn^+FHDx(1QrUxAN9Yo;*WF3q) zl;PPVYaWp77war@o;Jrpx2h&Y_k{LOx-!%_-!TO?Y_({^z87tn18f)@YPDfyk`42Z z{XX$@GZ#0XY)aXL>($F8)Dk9B~>`(9?r%3#S}H{vcA0_|>SfowgZOezJH z>lNN?wzp-gjrO)|xpc=`BiJH7xpG2sLmbnjC396FI#`hBB$=7QnI^UQY!8jDXi|NK1T*>baaCY*n9AK4IPeXlUQDTRMKtnFk1)UXTGx86jI=|Iz9@`}N=KbdL;Q4s zp!s~eqG|$vuF25>&MuFPM zj_}bW5lsOkrQ|SYYLa_}{pkJNYdwX3zt&sGRW9_dj2Lq^P^U)u%k8OsIaS^-MYx}x zq?;k;oNdQ^TVpyx?S7}ZR|siRq9r}T6YUBSKGyydz7>51iF_Xi-Q(J02GtZzvP0*1 zWkrOtHYJmT#oO4D%sX_ti+8@^>CV~~q8Qh#*3mqF2;XP-_?i04uB)Fd)(=4aD9pMU zxFR}_fsP@TG;9!BvZiK9G~{l4N?D@KhaO&_MZ+Gn#Dw{NXD(}NzFstg>I;H=GW@Y~J+7fPV%ba0v83!xF zTfR<7F*X`A>u-Pr~%fH4L z{EGQ_%{JB-p8>@k5i4|e)}Au6IOh8atmNODS;*948UcRI$NbZsBK84z=qT~B7$v5Gr&Vqa##Pd+e%54#c{`j(M%E#Y}1$2CMg(#g0_&aq9= zJiGIwTG+cyTseoa8`jLK@N5svr&ag7#VW`*Sk!~o;j5sYJS!im<*MFnWEC{;fAS_| z*|d$v{1N1x{7|DO@2&MTbCX>sc^y?xazDyxnC9+Ds-rVaoRazfwQgtQVD0+G9$`;= z0A#g4)2hoAfTwT`$<1}v)i!f!t7_bJFGqORK4^BhH$WGL-(KOTE{D!BoKxo*SgWgD zkMqG(9#0l6)C)>pd+no?lUG{9Bd(+t{NP=wJ9cH6?=BCnOZk0y#3Qww|Ky`zd2v(9 zBm9mI(*^q~x|AlQE@)0OGdilq>9{g_(#!`{oerS>k@zGPo|FL2zu)yx?Lj_H_o~qqK4p6oSE(?%DWM$`-jjI1iR1Cj*2nOncJML$`I?L7^%I?R z&irHAi{`b{Ft0v!Iew-d?3J!iPqNVQdm~{)GeY^H? z{>;={I>o?zy^}ARLndA{2TZg2JA?Yh(7P)JiyjY+p^Ij(k=*Vt&G?|dM*HIs*AlH- zcf8HP?Rc9Lk_ySyjX}f0yDyrrj&Od%4>NJEa8Gxb&H&zD>mdz)tb?r7vW~a-)6FcX zGU8~hmGX%Z3Jpxi;F)e+EoA zA77GaJuK2X5BuFCoNKrC@xXAWU!?U%&{{9idQ_q{MWpqPNNayPYqV0!A8wVa@@M5b zAM|Dqx5;&mh2)wC8Mufv*NQZsmD=Yw{FnK57w9=i?Yl#2-?!bQB^e^E^!D#bOEi@c z8c|EGMLYjupOu#OXe;-6x~x(?BvQOjqBBn;N^tSOfw6;fZY9$U_Zlf{{ZO3B%YFDPM zu18qVO1Wp+4#m7;musrM&`9+^7VCe|_GZjq>`Gj$Jt;naf7|YuGP}IG+V{oUuZy*} zx4jngj9rOiwQq>EH@3YJQ)-v@X6-9t?KNWU)op)?DYh%|YVGr4?PYB*#ynz|S6*8x z*5<|98EwzT@OC9u*5-+|6WdnDq}b)%f3;|DvRFS#tgmZZ9+P-onbf^=L<-Z|mc~4I zU2go|`$YvDtkjuk05i4+{#l47P`S4O?pU8Hce zH8CdOy4<0AyDy9K7bV=#8W(fNb!B?@7%z+RZ;gq${kmM!p7SDw<06F*S|egcURUPp zJ)epc-fX=$X2^B9|Gnouk-~P7!j{%4F;3T&IkIQR<#(1?=lldf)9*O;InqX?wMeN* ziAZ-NjYqn6H_o^qeSmZTDGcc`q-*&1Q(BP-wj<>ty^nMs(ln$?Y54bIkhUU~BBdim zAWcMaKx#sa>|>;zNKYg2NLr+cND8D&DX5RM73m42WTa4}i)MZT($vSaC!G)fH*sDK(V5{NCmS!Cqeg^aF6$8z+wOjY(~*2O^=8Wa>;gWJuZ&<< z9$!g$SErSl&yryJn=4SBxR}H5uvtvrTH>F<4df z2qisVHamF|R@{2gd}cW3OV2I}_ME#G9fPPGDYCpGQ|IG3xY zq$T$V_qDFtK-)lng?^? zy1~^a;0r`y7C!;s-~@bw6KyVT-NNRMi)QusgVkv)MVxD*`90BR?a@(>br~6VWp4U&w7Y&I+43tk-K3= zMMXE(;fhV1FV+9F`@eR%i)B^DrhS*ARk%z1{lMr}(IYHwa@(X3C49(OAFYt`_8Une zRJ+D_9(SqyPLcZ4Eu61)ef4rT^~Tlc2rB1VJl=A9g|4SHDWvt+I^(HmSFBa3?pn}e zqJ-BNKaJ*moyEH=jhzOnv)TA@w6pk(Vq*ZVW13VIkhM}nvR0BjoU5#IjuD?Wrpc+w zrNVm0yM^MCN+~YsQ00pIRte5&ajyDZwQ5QhsJJWrMOq(;vh_2%gG1&Hr>bdUKD4u$ zs61G$to#W2&=Ti>=UK~6Zc(6r8(WI9)Vglr^A6@0X1ZAVR+d-3DQi$w1XeQI+P}o! zHtumPdy$Rn5ki}x9nC@6N{olFYZVSYqrxsT+h*is;)5%r{(j0xPN>p}hq$+<*m6PhLH^=fm%vHPA-? zC$GM@p>Mn;I^6 z3+I3pG_l4RF=m6(oP4hJVjX2Lq)_*6lyMtpD6Y+0^EyCOam@%1Su7C{b@&wEWNIghu!DT7 zIu)cduW3cJs+vah?3TgO%&^uXw_OwiCEK;Fl(;vtU9p$bk=#lwq!Cw|h>EG{F~o6Q z%2n0Rnf(G3ovz$JG3s1*smi%^-NO4FE}I6%df1g$OQZ4pZlS#mannvV(`|~2f7q43 zmL|c%P7M2XVuw_VaYs%qj{lh0JCnc14qX;TuY2=tp!9W{E_Ni!&^>5W$IRHk z>dwTOv31SdxJk+LFr(~1^ZY$d4ZnkM$?w5{C5I`Fc+TUgxMEnI8g(s+BH z=VL2zs?JBGbglJZu9!hkm6b0LQqFcRM?g9amTKxxVcw9FDTYJymX=2aY?s;fBJ5$qTKhK#=ypT z@!i6r_A|{6K|`^x&@CKl(-;Vv+cnsI@y@@e&sQBKX?t?rHk24m`X1ITyz_nmhX`15 z7PrtRqUDR!RHKvPE3bKokj)EUI9g{^aEOfsly*70f5Oa&itP>yZ;5||B4Xjj`bUQS z@J%6E{&6v|p@ENShwM^f4kj<4zV$-0;z62oAs@()?9%Jt{cuUnw$_ZU8;$6t3#5Ct z=^Ngqx>vZp#|0V~*YRj0!Py<|ee$x^;h-~%+q#7h+RozN0i{^|aq#~k;P(NZc!*=` zk@6AkyfbP|&7H9$b;a5b!GC9w|7V)jxJi(#Y=hLiEf(S)oxS4@(}}r+2nU<eZ`%m124?bjYOGaZKJAi@)xnAw$g54T{|M7rD2fTNqC20CUfbx ze3;I=m`w^Zoh#*_SKY#?_8B@?$ZJ-&TP4#BEg#ewrh3jC1xq)C!wz+g=Pr-(Fx@)P zh-w=u+B1(SgJI7umTrh1;u{9vs9Si%`~$TqHxwwA&^ zJlY5!??*L164HwLky;$q9;O@A>80uxtn2@99jA^$B)D5x-=?aBPNzY0r(9@u`rE25 zh4S-J9~ieqL?IeH8_{5QWmwDk{ZyGE9G3-`5;sUEwF=7TZiE79s{?djORR#ru+O&#?r z-*OE`#7x{_8b_379f`5dItSgz9q>Y?%tAzyZ06!0Z>yv@-~s6?6Ck31{{kNG>>C`u+`Jz zagF4F^t2D`GVW&rUNqO-fi&H^M*Kmv%!PfH`SF7n%@xQmLq6>h7fRzL+|>EZQgOUQ z!ft#II*)Oy&_uonR!eZ_+wlFU!q&6Z9NFOo^{Tze9;^*?4QkJ z6_pXHqiZ6 zE6QotnN976pPy#%;oYG_j+59G?-duDJWbC#?{l23_yc!I<-~{*>>DVJpExfkeJ{-? z%UZVK2};a2CJoU8rFg|gf3!0nE4}QIA-Xfo&Z|nar{UwAF|XOuBi#9uzA9Qb4`W$b zo?eCW4=KRq-YHmpYI+2PS=0cmeuGhWTV{!NEdQP1jCpb?d=S)}YZ~t!ft@#Hxt}h* zN>P47<6v!n=vYm+@NF-iHvyxsbz9EXOzdKBSb&{jZ(q!(iK7}ajh!SlW`CMqt0v+4%AX*cJzHl2A$KaKu$3u}yvF?v@U6Y;y! zh+ejwF_*S^=Mb+udA-9!CX8I7npP*dMUy}2gepV8Fk#kwsm z+w!b2Z_YIBsc-UTUAs8rAJ;k_4w>k}kI;P?^_h8mnd6vyWHld@$N@Yo6FSa zvSB5g8u$qs;;(J&n>3$cALjMWVJe)0ARTSeWHuN`qc)g}1Dw~<%>T(VshMt@RO_P1 z<3`UO)Tt^-znv>=BX_ul!#NY8)Gdtbi2_%aw`|Qkslf;=&%&JO&r_bFoXU;SG-T2U z9Mpq|(I7IwADjRs};E(3$6dWdDag&(^SO*FZbZq0M+ToCO-D6H?PUa|{pLkz}JfM|KFHfyZdbF7pR51MNl>w>wwCCg49 zx`n-{Ew>BlHmfzm8$4fwy72#+x8?f4yJV(Q&wLAv^XE*ls}=Ztezg+6>sCJ$U82?G z>E0N+!A}QIqw^J)gFkF}a>r5Kl_hC&O`OZeS2EI8b-8G^AD!FMT=I!=+vskgpf_6F zk?6+BlG%ux4T2xuEd+LJ@=jxC@Ia@_knk(ntHZB6oF8@Nm6Xq}yz4O&d$1hGO^CQM zWZ9tlw|;o+$-kL0R=pJwex+d5pCcSQ9UQlGDL+vDE8Z>5zvC=7b>1#E(GyhTH{Pjx z&K#FA=!fdZKQl+|tHg5>o91CJI|5uC+di*qo-TgF;`xbh4BAANA-8F~)Uxd@i}!Fi zUx+6@1{-eKqCs1-m0d1Bq9yKV+Y@NlSnZYjeUDukqKFmeLvCDPJv$nPxtr#CHJ}>r zl{(#qy=lBBwjOCat{=m^{wdPkz$@l(Y&M`5(x-Sg@=Y)J10!$`X)~_4UbP5c zccfR`rHRpn>y-Hxcvb0D_fY-{%vfgCmatvU;FJZ?9+G%V6Gg6?nur^hnmn;OZfF{W z->;j7;`e-0S{8IHkhE3Zl9qL$ISePZx`l^uf7H&AbiT@*xa9+kR15Z5Q?o|m)K+*U zovBi;3#(Khs?i(dux_j`M!?ooal|E9w&tc`1hCSrya!LKm($JOn%YPe&T(4c+kcC( zsCM_}H8@K~w)7HaE-rMuhGA@5gf;DS&pJPmj}vbCZpCR>Yl~1M*1X-dzvj18^B!Bx zH{0=Vr{qwdo^DRf!>*za#;~SDOMQK!hiGx8<`uKx$%UJauGogQj^-P(AAki_yC}=_2WP%H^kbL$zppp5AJV|*pvIBq@MVqCsf+j8?uj^)u&+@ zEW%*1Zk3D+VqZdSb!WG0@<_WqD`2-hyAgpPN}Q>6MZDPlp(`$$^S%503e3x6F!zPj zbPI2E(`-D~G~A8m<1o>NoJGIpi2i{)`n9?%1aheF*p^F{huWwZ(8e;gcb)~SW|Grb zm;T<7hr!Kgk$Shk?fROw-fa=<-X`PBQmT8Ot?t)t7tIGoTW2%0p$4r-529fI=AiX> zs(TDpVaoD2vGrudTB!A*o@o69vGt`L^mOG7+MQ}`w@gcTdiFi^?3K{3M6uliYueha zwYFQ<=Oul8rn)Q9ZioJMOI#lhu3xd}tHQ`Ks}`W$4~p$hu(dm69oqfLPsH`{;5vCe zWP#yDm6G*6u!5}bC`fd-7wsB!3;)0#_I9rT5&sDIW-r>w=oXGz?$rh1%piG1T_Qb8 zdjP2Z)b5AhYweyD7U639ApDxzhvK)r-5I|v?Y+X1_Xf^nUc3coQEgtzcf@w$6AQ zN&H?XaBebs3Vn952v4_f&D)4fNM{&5BV=oqwYK@kZ*wr(p4LTjrX{7X8&yuaYwyPY zXU4kRo!RRyG!Gu9DqCFbvO#rpsP3#eSlunOb!F^Y zyhA0<+y68#uC@rL+K}Iw$dPXSMEtut8?yvj)RC5@z)B3`!H9naOT;cA|3Y&%W)6!G z(w3Ixy>s-A5jX|RG;WAafn%+A^KMnnFO8fw@$LghCr;cIq2KuA)kpRsnxUCvS1}`}ni;18cTbod zl2zdKu(AN%lFE!tC(Nn5{FIF>UyH&fkKP1x}}lZ)H2WmwP4qfJkTu| z$^JOqIAH?gZ6kMe%QgeXFZ;Nk+h?S=YhV zv8kYOGfjoDxfttc3*PeBW~lOgHPct^!aJ;^wXhGLnh9&7RKV(v6~|_@**AOUmA^i6 z>e`W^Av&6wtGvJRPS*R*pA-?IgMPE+Sih~rim&~ z-t9%lNm%>%y06=cwa-Eyx5}@iHBaf4h*fFXsj!A@3r@=St$7ZJYaV7A`;>dt=jP;N zyRgcfmpjaa+5TuMI5M{7`V|nZd}w`Q5k|J)J%#|{`Nu2wN2g*9pver;xvo=na!x*c zg8{oX*rPdtb+xOw0&>|ja0R5QU>hyM7Oaacg2kAbg_D*_*MpgmaK;Wqd|>k|i0o|5 zEER2~zKU(M#tCR$Kyd;wGzM((Ywg!^k5y zp<57hN55|txv>Zn#9o&g`M%W;MQy%=qytbd0yBlL>IQL}kg;gJGwR|bXckU_##)5M zh>eu0>BJ_YJ+4-btnzS!b&0C~Jlld@<_1KY`d6`Bxkf`#ESmL#n>AMdF$*;C21Kxn zOPA_LAJ_;^r8K&@TgQp3=Db;ztlW4Wc8SsK`npBN`q+{nqNAj>!`Pb?`$LiYx z-~Q&UK8IB|dA+Hb+Zx@gg0On<(>a#ARXLQqVpep)tf-<$*<10tF6`X*2*clR$a2NI z6;lteqZPxkH!zH2laQY9F!R%1|86BDnVS2tDs3o|BzeP5##t+CcbFqs)OiiYg5=W4`vW z+Ppz#Tja?iM5ET<-k+<3?~>JD&mwg7Qay_xAi8&4tY;BAd;9C%g?g{O-;e`;;6eBg zDK>lO10RCy-C3NUDU<3gFwVnznO3$IVG~y97QqwmMpVBC|K3MD>3RV1O&_w#<3+0s z{dR-J#Y&%iCR+qhW|!|JF0K>f1itVeTJfv^JWC!qvIv!Sk%AZD4T)BL291+Ku^p$H zeY0#9dvWzZi@gj~&)>uOvUT((;o|C{(3l3CMWXgk!-?ACSeuk+;rF$0xDo0ce z!?_Gs4c^^*kKQ&TtL%!IQ02Wf8~-x-cW0WNrf$uoITGuuQnHs9R$Vl=jwUa5uF1<4 z9(T_`S=54;ximxG;{jfNW+9&VfnSHQa!5lQn0((*SS*Y1Pq8L^Tbae8+Ruu9Db?O1 z)^=s2k!C%j0v4?P$-6t(gh=d>eyNOsRK92)FV4a9!24*OGi1ax*7>&!C#}V@p)_mM z8%P?~S%abipP4<5!J~J_>;lX8g}E#lZ+9J2bt>Ey8!`JGvj|$t$Cq5IoGZuWe(nw5 zFHOb6?@N2pgZa_uP?d3=y)%woiC(Fy+7x;0$`dPHt3uVPmspo$z)YUq1@C_4Bpo-^ zeS^!o3y51fzvNth5T3H4(?KyzyQMRfIn>6PLneRe)o}Nf3+|Q98=j5uKIdK$I?=Tf z=-Tp-zsq1-!zjbU)nLFvN5L5z%`1;AjE+{=HJPVB%bp zpUSDrW!m%gt~%AG=OV@&oogEGdM=Nd{)*j6>pH1R@Wr~mf5rSY$#KpPYRPXjQ zek%`u@R$c8BL1F-5s~mZ>Z<#OuLEC*W{OUQ7(s=)OX$HW)k}^bE#|A%Y0X4h(5J5{a@<=-P3`W7OSgHaN^$Lt*sIX}|{xm}GDz4%EO zZREvw2`__+)r(i)-j~fP$h}K=s3Rp;)#>S;nl-m&?PL|=m)~U0ZGmQrGUS_Fs%U)@ z8|nX*Z?0RXgR(*!I&B!QDleqgs2lvNk2Ywk@P_bcymgeuvq|?~P1{R-RDo{}u7hhU z^9ZIiHe_vYr2e>eex>XZ*0gPC6#1H)&`3IhcaV;{zU=&xd#w|E_by>|hZEjL3!T;_ zly>&GRVrW zt%3K2pD@={J9rD`ExZE*&Tl8#-{+y}!Vcp_bNvXizvM;IP73X!^av^M(Tr`H*d?ey zVPL%6>M3#?y9CxoYw^u}Yw<3@gta)6`6cih#JG2tuo>?Ne}3qqxfnY$%FEj_=Uz<| zWgXnKEz>IN>eg+UR$05_-i79QqO6nKw`F?m7`@ZFUK?EwKDUjoazY$5TCvXmlqYLYQ zYt)Wnc~4v&x2GW!XD2{w{qR8*RC|91t^aH5tfe{{FPfK&Zvt2ZUrSn^)heDZ#e6!v zL`&9hRNviGxSNQ(WUJl#qAV66>Zcwd_9(53O0;vnJJ{KKKQr~f9xUWTC!IgaG@Eo` z-#g&UDs!Pdlz)6j5nHa)QPm@8jwq(~2-^=^?Y~Vt*MPmFzL_hO=AQf?iSsAh&Z4e$ z-lDppsQWnT`ss#GpmkxO80+erwWdZfo45=?jOXuUUqfG`BJPq zRjgaq)+=b=dr#!T!S@aU1~$^Krt!4-Fnsn}moA*pu#UU_F?W*2+zc9X>Bha$*N?dB zgS$Y(_tH*rM*#Bg+9C1Ivr7a0c<;5YnNUYud?5J z3Gi|wH=#$^`yTBWj4#`yYrI6d8h}$rUBcuxvL%z+NRubFku4eD=8Ru;+Y5c~N!a%I z2iJB9K{)^0C3xaJg*DPi23xMFt_$z~kHyJ_EK?D%-)L%V#p%p0;p5gNF==-B z`)jv1KGXOoG5?*`m5tQ%H(N(+8iuy)Y;(cy?p76kt6N<+JHPZ=#E4pTrURlUbk^xr zy!+WDRJ3iuyPqE7opFeebP3P5g$6e_p2rDLSB&OewQiMOx;pPJL|PS(3g&S34rwRD-VorI_}1b9;63N ztb0;p0Waa~YcjWc^b6m!oS8)Lq^ zF88B7`^DT7#`>7AugiUB&uf?8xx7&x?I2KDaLb$vwGZ?Umw_N{tDZe`<`r9DDiLW!>c?G4I%wfAVVL zo&z}hgSn~c(B*KkW`=S4Wol(APV#qQ{l70}hh44vug>0c@8zaO&E?CYp3OGyh}rW0 zIC~SYrmn4T{G1Gs5CX_xDWDAjEt47*TNGL`z!9RiT8q6@ZEu_-TIE{bUaH({KyPau zdJ!A~5vN)U4xo0@YKv7nS!t8rw%4IlYn70YK%gP#04o3AK1r~(@B9A0@5}S-oIMX~ z@4fckYp=ETAL2}?PvrA^5;&*6pp>?~n(cpxIjlas#cpZm^BT^_j^|@5+O}&p z{vmcy{oUInwx@P)XiEPO!}f}%@DFLfKKcKH$IBwf!hC z4&P%3ZEimOej9<>UK@ehF5Bz@d8qrf+<5dA9uApk$7Wl;X5s_6PISF;RLAF4V*8UO z?GK@aN1x+Em)j-}@VVd5efCieANqpr@3(vTo|$EPQZxJyxlBI#7#~k#dwf75>V7V1 zM<3-wGi;+Z5B(u+;?YPxG{yE=%NKlaCD;-MG=JRBCE}=vj~8i+9gv5*AL@6s`_>oW zS0{JRhwvpbP;+3Ogc%Cc4xaW`S>PIcx4{&`WWYqhaFBDl3UdZ#H;f)e2a^gD3gZHg z`wuYnFy$~SVKgu)FwbjVK#Pc!u$cLG!Nz04TF|O^9<@H!-kP8j*7dQU-VqwaJkP2a zJgb=bwnUwd>BY&V*+E4Y>dtnAP?b7R4PJ&uorgY98yJDH$wA2~wb(5Q1(j<}8O+`n zq5s8$`InPCDs0-NqRtGD9)P99XM^qcGRW8uJ|OFl)2OW|^`QE)`O)LGkgq3Wf4L3% zU6^;((@hVSp#4J$1%D{vsXvs!cuSym396*g;l~vyBg0lmS{GKU1C?jS>?qKA=0y)8 zcN10}t)$cAY`?rD)COn+H8St$ka~IfB<29Z$yZ8^I%saTkQ~3a^sp-R>rMJP zAAH}03%BZ6pT;Ah-8<#Je71*=n{p~kvmyU-GPRe@?RZPwWB#j-NMRFRZpvAw7uU)f zc{E62SwkYo@$CkKPNbr>P~_`|77ak9E~XuEA?%&AO77Y zF`qIQDK{YHFT5`(-FlCIB>YR@{~t3+bKP`vMc84&y_+4dZ^d-L^#|zY8T5>}O(^|S zj-M$3^;>QiqkeTcoEh~Fqm(4pEaWhqfdZt`K6Z7huVyEp?|{^eYA3aN*G$I3vep9p z>slYz0fNF#9Vl8WqoZ&O5qd2|q9grV zUo)ZC3o>-4b+v6`Iy!n2vq^o{c~1WyPE=mkCJJ~uXV&G~oF_~Q+|y!>u@WsvL>m&$ zn6Rs0SHV65_FUL=VV?@S7IrP{4D7|Q7sH+jdpYdo^vP7LGFC#JIyr78CrYW!nQ0Z# zB2JPK!TD!o!w&x36cOy_&7>YvbHpg0jEo8G`*M2B>AKn3YqXE+{%#>XwAMAUfxv#P zYf{4_mPtJK|5j5=%c1OFdsJXRJQ z?FFTxnLD7TVhxZkL`~ZXmq0ID;wWW^R3Md5VtU#p5N0~FOMkG6gu*OBhoPiFCVH!k z*#@mba0Pt^9t#?$LhyJ&6Uk>*Q5tFc#r8!y@}1EB+Y$zQOPK0F{;^cTJX1iH(2Tst zgk`OOWPJ#BplQrI+RuRVKSM9~vIoHr14#sM@AtBU?LR|;sFxky(d-b&;+6n2y;iLQ zr@H^ioUM$gI(D~m)Uvz#mJp2hC-Xlw z>%A}^<;Am^&NjV@VA|K3t%{5w!!~drZBjRL8*Vh?6ib)CW4=PcXGF z0vGUWU?NtQehZ{c6s%XWkh&8sobqREf@Nt&l6x9o^4;{3Pcr@r>{eh3Yy=Ywh zZ&t-#_GUX|VxE0Z{U_6dCH&C-U>##AWkUe%@_%gbd6j zU%v)n#_h&AxtINiBVb@I`9huMUdTa1Hz4K>nM-!a=;7Xzaw`e%{aNtVpY`zGXVqXX zi5P)Sj(HT#&!aG%I9Y!AdaKa+$cPDxN`%9XuUkeqBq`?yrSoy?7N)(WCS@zjXtO@wy;PyM7qK`mX`%PMWkLNapZVQz>FTXkeNRj&1`m27Q- z6m&1N#gXwu8wItZN-~Ce*%{E0h`V^5Oe>5F)4pZda$H!5`4v{B4m7PREKyQR!KdCQ z92ALB0zR}QbgWYMFyx5BwEsfwHk!^aMQq$GY%palOO2%f0e^;Q%K3KzfkZR7mB1@d zDoht8PjvsS;d*PB^L1(g)l40yGN_l{f&L+L=2Ft~Oy`Z#*rii+Q;tUf?wcXr4bx7w==reqfXonWj>TjR3_V+jJJGun zEfk;g4Nywrdebarg<`@3?)k)M>Fm_Pg)fa=eR=wB@8U*3O zkEk7?BUHke-U&=Z9l7@yahKF(7GxlR!|fp!A$owc@nUHf(GdcOQQ$s2uRE!Hs5YXW zhuW_fBWLI$$|GvOEa+wR_Q9Y(pTtd$=8lSte%z__;^w`r#h25n-{f?X&uLJt99$pw z^9n8x=JT3GWD!uuC-^#E?1?x;Zf7T>mRIi_9;li6H~GE(ztn7uy%<{fdfBdfq(-*3 z)l1eC&HxpjatPa8Vam%C!^)?u^ z+&;)iUFTMbMnmGQmo2xFvX8V8Y+c(nw*_NDxxNK-R`Atlc=_t@&!8!#+9jSDbccQO z^!a78_}czUPgh0&_Py*Ekn@NSj{q&dmpu!K{$L)Cy=?zI+8DxfN%|zYqM^Br>bhD= z%Eb)v(;|BI-aefd+#uEw7-EKO?PGUxbQRenS8~1? zaR9d=*e}`0y!hJo+U-7e1@|W54~F(G{p|^m42jZ~+|F9^P+bJL>-?Aq@S60pcWj@x zWGxv~7Ysi=6U_T{*><$_EKxI_-aFGa*cf-5)c=4j#CW@f0IGm9*$F zKF%0hq2|vImq} zR&`(8iLN;fxsdsn{Go&=8;0?D+ak8$L;roUi^i{lPGaTO_m`upuDLOzW zZN=M5_-?S`%^Vo)P^tIfR|{i+*+}f*-Cqx*g?SQ20ki)W-o^nR|5cceVQOI#;I{!^ z3BE*r&-M#NJ&Esdn1ir?s`(5xCQ|=oKM}-;bmD>iL=P+IATreckah4#Q7d#ktkxkK zdbaDD{*)%232RWquEvc+4{o?TIz4)zKT-jAS;q;!)sJ=PbY!Kx+jAIvGyS6};D?8` z-&=)Y0Y!)MqO@Yno?f;E@=ux0uk@>QE0%~-GP_2U61`{Q48gYG6zO6AdjCqQ>qkAE zlIi?TZ{Wm=EnK`}S01I5Y?A{UM9u7Fx89Q<8jVv0cm;ao7(XU{)L&}--YQcqS&IEF zZZ?Vh?G;}B7PHs-y)`f{A)cHf2BT&)q=LjZGTkRtJ?t0ZP`~tPI*X2unq)IUXQE(0XJT|Dkrh|B z(Sj?~x0KrU%u12bBOfj-y7tidw!K+jMylI>S$P2`9`yN`#HIG7?~YY>QUZxCtS(MF zPus)3@1PQ1G1YKd)oj09+~A46s{yWF=j<0=lO`<-EBdo$#sed8m07pUw=yYCPv?83 z5W8X0D`WnfUdbEil^C>lqHA134s?u>ej_~<+M4#xDx5WIu|7l2>E2V8@2&n}QMy3w z9Bp`!4mX;D{=>{V_$6vsY(7y0awvtAbd}wk9s{35-J_ky7aehZ&ha7dxKKfuEp>t4)x* z56}TyfWChkDmq+hew7f-2Vil^aje(Rd-wb?z{l1lN7fKEC9CCZ-7(KgTI zlJwws5Rr2y<*e0@#~uLVr-MppGm-s34|}Xb@y-%nO1y_X)Zsk7*lRz4IGNxJL2iN* z>h!Ck)WqkgMB4dmsWwmUHpD5w?e$8w0X_P|oy6zJy6|jk7%5wFEazo!>=Kit$`_Z! z{KOkmjUA2LU7!l+6a-)g+8bbi3p@F{J;b*MCqYs(XZy1`yMN3eQF#BWe6f`israz5#hJmAk+>=joUeb?8?1D7U{-*5CW4V*CtHYeNll;%N zQ}IKwCppvp5dJ@G55WKXztN-7j2`i5x1QvD`!xk>9RB=A_K;0P;-Bp7Xy?BPbOJOM zuSfnV8S(Xl#b+3 zpbaT{6zf6=#*Y9d19v-1--vSsdOd!n2pRgt%&R~4s$G5eaqI8hY z>iU_YZomY=uZNAdKV2eS0Qv&vXlDvPSfs50^yMM&-)(< z!Uzx&y;A2vMd^Xu0hK^I1N0k|RII!^7T9bCcuR`oS7&1eB=xW-9F$V-4vZBjdf3%= zVxyG7u&=UH_}8>yE{Npa+Y9{|(&Ig^nYi`Sr^lNhA&hbq;y#fJyn^9z&_h(M+f(>& zPF1cbmtar4t`E8>!{yz{^QHXQ0j&!@foRQfkk!?Rxo2dQAV zV)qX`2iuKBxm`lPvoKBEokh;!;4@f85623(7;v>s?kXND@7_J{^R5@i%Daw$58zBj zPFKNL;-=xckU_<5;m&425+egMGAm3gcVEaNbsDXG2E7<>JFXcGJ*>p12P-T2qV6w^ z);X2K_!tTO%G;zm7RGhqf#{!xm@uHYq_`A@z?~3GI?`BP{oWR8Drto1s z;CeLX$-8&XkJOTRJOlKEnqC8Z9@mn7+u6GVb9{q}*thoXaV(#*$FXAeu-(CNUqF)v zu;$o3ju)50e~l0@zwTJxcHOa}kCZBRzl;7@{uSKU5LP%whZe!-#l!GDjUKT9(~L!5 zr(Sm~+XR0j{4S!eMHm~1w{$7|*TC-(#>7}E_VfO~JO$TAjD#%opaOQtQk=<@yCdNa zp|X0eYc_DE5P5g@eAtt|;J6UEJ3oue3wbv)pZ~g-dED+|?{~d7JkJ}x%j;k3{T6t? z3q0TM$@4w=lz9C&c)#1c;TmuF5wCxK))&@s;>b!;gQqLyC|`#E;;bP2ug?mFf8P95 z*lQ8*@mId!ZYlCB$;{iJPsCVFviCp|;0vx5eSWO%3(ihm=Iw`IcY5syV0U@#yW1{v z-$A+r;7?p+y3G9up1*mfsgO@qDwPy5F)=YzWMm}XCseD zQWBMxmPU;kF`P;p@d!0;SP0eJ+)VZN_fu6>Rn*^RQoMbl$wi&s0NnXyKb4)GO)Xlq zi2CcLk<`tj&r`~Ov``sSE!1Pck;i_-I=#2Qe;fAJ|9~lhSq?n$ULyh~yNp(g zD=u>`g%JNvg#iC{1&#k33JU+1ftk*=l0Jt{!8UpK&BX~jA^C*Slp4{*%>l--Q>q>}cUR19;#6=QTYN8@iXXnciCd5_@7}y{OnDQx3;8SviLY$pw5js$s`;@M z^6ta)l;Bs*ULfzfz)afN#OaZ?4rNaLIk}>VTNW?xeq-Kv#F&a0-!Y@n*RReWi+Yu7 z(-FG}v3D&_flUXSaq+O8>l@S1u7f#}?egxu3v;&1yMD}R;x;3+dhrv;rvNqnY*8js z6r+uoCTAnw{)JD%oxf@X>?amBaqAZ-dafUu2-gO1)#m2QyU#CFqa~TJy}J-$7e^uA z1DTJY9yQt_}qoCUE1W>zlPbG zu&0Te9v)kT(2Y%825Pr&-e~wGgvVDkaVe{C-x8j(XF^qsp~-spp+~BQ*Yt0lh>-C7 zCTnj9R-yb!RqC21$F5CHj@`z=Xjj?-a7BrlxJaZGVfE2#d$xCPmFyW`!|rsWC1nfe zqfJj#$-CFjAG5p3VL066s0NpnA{=8P6JZy#jW|P~CVLh)IktV(+j^z}CjGm!Jyg-wp~wkAhKU()tEM&5O6vb^ivNI9#$ChdcUaMQF9G@~4Vn)h(5s6(g!6jlWh*t&TB_sp_b(R7$H; zjawXg*%n7xw6)x}wXNb8jIy(DHd!4T$Jab<99exGG8Z>0emrEa%rz!dwN|QjD~&-F z&D*bRy}Bbzd-+g?F|;B~+w5>IZFY36X?EB*H9Ojk&5qW?%?{h?X2-3snjJ0InjJUV znjJU$nj9rdn;idG)8r`L)Z|!=8~0U*n;b8nZgLcT)#O-tt;w;ht;w;xFQ^**9-`#i ztV3H1*Q8cYHJ+=8td8AtzG6mo{_gK9(yBkL{GlSdI@kE0iumelJI#>y9=qq?6;D=w zz2o!B^xZOJQ^gb2pHzN#_}d-wuD6(PD!$yAV;EK=tNd#F5N5RTB4$?Px@2v#ad^$8 z%Cm=qDub$}M$>k{J>m4^>CBpsnbEmggs$RJ4PLx%A z+!{=s(H_D7GkbQo3aQO7!QbEv_&Cllfpzf5$|@uwufxO`MA|V`DuWC=kHE0_Y9YSy zVPqeY5jMPf?CvmaiZQ1rSn~*cmW7Sge(DfS8Ewp}$=p4DPpURWD`%eAJyjdHGDiDk zRlG4n8>pq3R4qL`TPs?*g?lS|jy7K#zA~*k$1qr%y&J8HPSsA|or!ykRISAD$nKbx zsYRlqvBnXGq}{S=;y*_lv$Af-p^9Wa_DBP{Cv39T`ybsNSCg>kK>6XFllCM6%e?j1 z*s9v?Z*Nsr9ob69>cM?J#PF_Gq@A#9v_UaX!8ALL$eJDX(df;9W=AdThoZB2`vKSw zMtilsN8e-T^fWs{r!+glXRE6-cBwJCnjKT&erk5JBNB0=qDR%#0Nyo#H*(NO_sqaZ z%0&##>>T7+1FTR3tkCR8MeN6-CmNotO4mNU2QMQdG{rdCkT@5mO@Ze6*=aS8&I{a? z34cG#v1jH+%oWXTb`&Q!J65L;H4dwO2l^}e=hrxN$gvRnpzBG^j#UVK8KY#wlp5e5 z>`s%hJ56tP6v2Nb{MRSf02g7m3jYB3FN6Pb`0Hggz%J(2nUr(sPc0HD!*#O=XTCKNFU^Y$dj`c18v z)b&v)i8HD)qcXShnM!%rs%NHG0Bh}%S1A|{caWekzWjlDmg)4ACm8?ENYR>XS>-8| zC#?*<5r`X?qEa#FX2#NdE;3M7#j%&#^`{1ds;}yg92c2duU47zx$qQWQmYv;GNOu~ zLYkJcxGFJdMhPf^!};85Ce$6VG7+cDZ6O>qvEw@k6b;ywko$*i&^`9lUE)J>&A&oFi>N=S?sf&pNbfqx3&5mr$&6(!@_@(=?47i2Q zLyA;m4MGok(#w!uM$(^3p42s&q?eKOB*ybd-{?ut$Erd4DWK;h^0lU%on<4S)tKCG z=GkO)x%zLA+tqiSDx(r#H8ao!82!?A33247)wAkp(@0J8WM`TLQo3sK$CW3 z;I3&dY943^0#U3&$FWbfX+g2@`Ebx)eUJU6QEptP)_1+QF3<>Bj|6?!Lf8smqpxvn zF6bSRNZD?uv&2zkeKHn1r*6hP%f;+ISB%@Ic6P7XKTx@c-a_bbL>kz^{gp zEyc*zg0{NWwZER6Q@%V-PAKo-|CS!B?zn#=(LmxMmwycltZ z_;KtaM^4N9LedlEeE#FPO)c}6P{|Wr8<0|)PAeV-Y_|>mPXTTz)BW+nQ}N?u9+$r} zlas`#Fq)^fs|ZwMG4HL%Iw`60nyhM~l4H->)`9nj!~0nT<2=+XGswE1o-c0`l2Is? zaoM{#_J$)jC!jeGv39hpPLbS(I!GU<+|9*Z6vqyBNX9kb##vnoPAMLqdgv-dEW5;r z_bnMR?Y!^jNBo{DBTf$q*8cGhl&&Oujphtx0gP`kM~UH!qOqeUg)Ju zKR(JB6-`6RomTcH)i(AjlR%9riJ;??wQ}P!Ed_b4PpyK~Kx2KQAT}1eu%U+!zn z;YO=yg}Ch#VGwhuQ5uPm#|pFrFO|2_Los=D058OH_Y^yQe|mbI?r2H(6J-Y@~$l0Lr^ z3)!hT5(@gwIkpUK#(i@AFe54FVL)MJ>o8-&Ft`XWuj~m@W_Mq{6hq>&2%z!isouEUYC-q6D?`2Gx>{We4O0~@o*dFz zwWkuRX+TeWdz3Lcnoh>pkL$%a?~S`@dCn%2O?3Gk-E_+nTY>T@r=V;I;61}INEfEv z*GbdIdrLd>plj`yyB_$gbv;wRz%tD(Svd`Fq>=SzJLc;zdQvknxM3C^A>1&l=sY@s zmeM~{UxMQ(<{>I>2*E1ANnzR^wi&YKf&Oq0BCx&J8hX1DcsA*bZ$I&@75j!gu zu5+!>AtQw@nOpeE@V$ZW)0IQPn@d*K1%Rr~{4{TW0rn@5;_P4__N(K3*smTp0|fiE z*dkNkRzG8s@+lakxC$!L{|lyO+13sZM7}qXk-q(|8RI2)umJqXuVk~3m!uND@a|Y* zy*rlWR?=oqO)gq}b<=w5X7H|W+iXWH1W)Ymt+hlNSoY=i?{9PLomTtpNVJ%1{pGfb zzn_@sYB)^dz0s>eEEhB!y?vU4j2I>`(m_;$S`wky)98oAS1ck&(8AZ*M$83JdocRZ+;({ z(+Bd)Ih`9VYD)3oXbOPUdKqvg}wRiqwWgOF}BZ)??iYEL=OmXcPz+4;0U z2#u;#>5O#jJi6+jSykxVwtf}mX@3aHKY}!#_GrE3Q%>UNfr9uj_}j4mBV!fVuU`c` zw=GnSb{KkzFUMZ6l2+9KN*y11as?DisV?_GzEK1Dc6;-soK&fDDbZEHf_}Xhx=Lu~ z+6kgt{$Hg@*e_f>gmnU?mhh$i2|5+X&4Q;6Ourg?+ijr;9n{Ot^wy#bW2pqS`3GN{ zXHlEl4J@b4#if3I}Lhn2ruM)`GC>Yz{%v5GWVYjjWz}uqO{=O#9MRBhol#`qz5Js zy)4*2gNsu|Wrs|D8%x1B>VG%?LYyTak9GgYvTwX z-Y<3IYlzkeGKQ~(5N$uSYE_GpKmu*1oZsljSD%cXXaEfQ1ki`{<-LA({OSAq;`4RS zMIrr5NE!AeuODc9O)}Q7f=Kj))ibM}2ecYajjj&Enz)udR7a}vS1-+27^NDf55Nll}bx)v_ z^B7xUcp>vPMv*Xht?QTiv}(dHN#?>sD09gv0_9O=GPcMb?YKUTtUO3@2`Ol#D5#4A z{6}HDQ_kV&1r_}jKLesm6(iQV^6G{|eQQru>_o`CEVd5kZ9Qxwe_~*v`!O|dEF_9Kc3CgW-f0i%{#l!2 zBzoB+wa;nkShCLlo69oB;HBf|hb~nwokZ%p>cdBIBjlNh8}1H+-7^o%?*4WjZsmwS zi&rE_T$cT?qo4irhmWAm@rJM>7B|fVG8=oP#%Ffs;*Gs4&>wT~Ypm-+$Ut7CsBMs? ztjD=w<5%G0fni_!s&VU2x$Yb`je6`nZYu;$q8*5rW`bRBlZ6C;C-wgJ zn@D}y^09^7M6zr(cotZkimqFFk<*VBDN>fVle{*!Uxwcm%S)F3;!9ZHZnAuXv_HVl zlV?f$8Oytt0;GSry&BwYEW5IOhvl$0bXj}3#RgY0PPUQ9t8~&RmVKdPEOOSi56AzU z_IUiyYA3shXWPf%KfgU4|Hs;6@juU|#Q#riBk})ZTLS*8Z5u6wzn*0?@Iu5J7>AK= z53hlQDVkg~nQHXBfzGkxdVFu7bL=SCJ#V0MY$EKQH_$mY4tCEQ=o~wwhiF1x50m!M zFB+Qp#luxL?M)AtdM!09S{KW6sdMZ@0j=tZ zf=f%&yz9lDe5?Q9ZOA)3Bg$|LI%M^#=-r!d9O%^gy#buutk37P8I~n;=U%Y-#gQAz z)uq{-E-;(ZmSl4a=7>5|h2o+ch56R-Py^zh)F0@~?D+Qk7v@Hg~}VYbc*mjg)CfsY1$Bq+CGCd@&#T zNDS%)rURXke7ZA87n!km`Ogb4SR?s#Nl2$ax=5spLAnxB;);B$0O_7IZAN`h=;L%P zD=t`vg#NOaN|<2E<|Ki`wU9fSQ<5Pr+6MlIe4Ov24AHyuInn0z9MtjTjA0TQ)r_b! z+&}a<%XZl%r=WQeXh+{=)N7aER4UB3MxlhY;9CS7g`3plO&6@xJ&@-jkl5i$ZH zGKA!kH1i3Zry@ir+=DjO={3jcBvGTRSXe{@N4#v!=N6=Bm+YVW&-{GUCCc*q@I?qu zP0=pfzkq}T?hk}Ni}0x_Hwu;WN%-`@haL!L5FV3q<3;5n60Qi$d?5TWgo{$NEA}rY z;gZ0~76G`@ShlWTQU@w2#j*$bgJ4s^wg*?x{*Wre{OYG+)55mBzXqc;%J3RSZ457G z8Ur~~meo7L4TE|2VBTHq2r`85?hxKxx4_~EzHgh>S$dY zKQk$(t(5945$TzI>enHi_)DqiFgYPZYdK!b>Sx35)j{v$<m~H6~z-*4B1(?k&^x=~^A5zOghu>g+ z&XZSfSavo1wR8;p|EnK!U9mT33%5ZL*_gs)I(O;wf8K;q(u>(soDvI8$b4>9%0AtG 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 diff --git a/overlay/rootfs/usr/share/games/gb/2048.gb b/overlay/rootfs/usr/share/games/gb/2048.gb new file mode 100644 index 0000000000000000000000000000000000000000..e6d7d8745a6329839ff88c6b4b3e73fb5d08744a GIT binary patch literal 32768 zcmeHN4|r77mA`M^WF~)x%uIrGpdm98u#Bme0jUNZ-bAns+A40#7Pr=gss-IzL7|eA zkQvC@P(RkxKUJ}`0YQU)-!?&8JBTI|f+VxakkapSKdr_*M1$K^@EZ1t^_A^%adhZ>B{r#`*ICyZ)&36>O+uQ&8j;4bLE|%uI z7gSud<|YT0>#?xwuLqF{!o_f7{hH3r`uAUY`EBLlW>;>wMre^Awu#|`y09O@|1LTe zSP)K#$B%UkznYuqn>Q`!EPK>oIJT+mCuJX_vRc^mck~})ARnTR&T;JiWCoeh$`ylR zvm=`6I9p4d~-X;pw(T%RB+>Ez5DlLI+;C-!^vFto6$_9m!o;Gpo$wxrEKi zal995ak4{(UEz&l$jO4jtwKv#LG^w|G^9l2sN^VQGE=fJchKB(X_aId-5%+& z$+gH44@vodW~}AUY}KDxWk@}?a>L&joedXR**1X*)Sj1PMdp@M z8}GvKB7OJ^q6}yPV|TL_`H`?uA1)QcO(M-_oRV>3JdZn39nQ2ezv>(T?Xn+`Rk()09GPXR#I)Pd#ti7i`mKe6eI^shv6<&azpv&;QaK*9GNYzVM>2 z%%wi}y!jU|`06E>RxG^ia?c{kOMO|T&X*J_uUNd~%CCJrOGVA9rB_}3jc;Ca?Xv6s z;alHcK0%ol|M5F3uK%a+-tfH}f7-Au-O2uW<*M)Bbn`7gSiR=fOy{K5ZU6Ga+kbS& z+I4r{wSGfJ`Qy7cR@eMwQ|;zV*N3(ITejB!>pe+r;FX`-#tK=WLjQAYvs;);_>Qh9XSQXjqB#nj?iyfw2TpSR9)7gsRr?*L6MEBYe-t1Akx)E_$@s&01Z zYZCdd)cj}uGWY2m+tABa#;`L7J1g>euaHx0d++6rW1$&6mkyebyi+!V*TtdmSB>hw z&`aSwV@<=6Rr5Q-GmN1b%Zg`Ig_jxA|7g#W;jbB;H+5j} z*a$I3izWLYwrKHWAJj*SDf^&4T3p!&^=12_HuYuuqBiwq`=U1WW&27k+|Rc^CkrY2 zdM-U;T3g=Zb1a~0E>-1Jov%FA>?lnQ$>l?=q%cusq)OKkl7!Gy_Ab7%2uyjZ!Rg4G z##T-*m-p7mPdFblTBinuN?`=I7=bb6$!1r+Rh@FBO|-IZ=d|D#i)Zw-H@kl1>6xPf zUkzsT_*@pHx!F}vrR-g)Jh5UrJ__)KpirM$3@-^5me(=GG4zt~TgdB3+7y#bA==DE zqq!@lqi*bUgHuP>E)??X$4h-WkK-<$&~%T-9R8w=Sr}CrWsWD7g&= z>y@`ST_l7gog8pJ59KTBRu*rX|C5b)BaneK)sSbcm|!uRTPO#bgHG0Mu#_hXx^o;+ zNoWp*Xal!C2hR8V!Z#YF4IAG+X2>aY;e^sdWi@3p%8FacYL4VC%W({0NKc1C21`#H zMt>&sveVy9l|5!*L13?h<`dq!BQ+7F@%%=-c zC-27g)5-SZA$eE$-h%FMZGMZqM}AKJefXJt)c;1+qt|=Z77C@TuGv*orR=_EEjG#n zuFI6&D>gr{)>Jbnx^mUF?e!YuR5FpYb?aK?@q5l!%#4(aDgd2P|*9Qyzp1@dt-Sm z6#iKP&JOp&fa?Nvrpe(>9Um^O-R2P13^@r(0CZ<>D zrwKOQG@Zdx$S~0IW`|(Pap`Oy)HHYFfN-tosZ#r6c>TY87rsNa%KPPKa3#^Yz;~AL zFGR|%z(mhX{sQI73$HbXFT)oix=R*1&p;h*pm+n)kgzLHY4*s?3BBVDw8&4Ql57`atT^(nd?i4)EjqY_^<3Js^6+Ru&x*sbf}UlE1yfJeVS~x`m})}f z`Ad!7VdAegr^Dyd<68+NbdJFmyfp;*0ES8dcHV9R_L*_>&Z#hUX!gLBW9zq*w_Mn9 zY9GAV^Rv3#QIdmR$3W0~(TMYnpjY7fTsXDx0{AcKE60MLdG^m3Kbd=j8IYVE)7j*h zm_f!;ZDre@t(~z{Tj$dLY_Vp?K>Fl$D6$uCBo1uC7+HZK*xc9zQ2V(P%Umq8BQ%5|sTx=4ULz%SYL_`+ei0$Mh!2 z8GEAuLgJj~&zOiA7%>O4(O|aY%Wp8~$A8T4XX~(J=2u%2^EZ`BC2Hm>e`FKmg<2nN z|7r7Y^0%i!jAgHxiE;u&AueW+u~b{YqQ)UR*!!gcPrMXctVte?K;&TUn5VsZG?KAY zTNCX^%|mDlp13sN9kP#@hm=vY1y6hJSZp-Xr+k!su-%8@W`LJ}lAN)R;sQ{we^Wa9 zcK^hDC(38bzirEl_3ibk{Cx@_62ovO2kVzGD(F7}!PoIj^KY(?6L@Q4{z)seP236V z5MZNVK!_zt`qd4#k};V>^|K5s3Ztv zBbqs=r-|7XpgWyuCuJlxrzCNI#u4b z?mCBlmVQ>TL!Ez#cb2^#G0RRiX`m-vt-d;MUD5a1Dg;Kq)cxQp{R#aEizC-fa>jCr zmwbIb@;@BtZauW0Vo~$0bUQ5mV)mflqRP4wX3HODBa7Xs{6+hcCK0pgXd~`$^$^hB zVX5@`eQ0GtV7?BE?tb>*y;g^9v4`Yh^O8ofZ%HGb&r$wC>l2QZlzfyU$nt z2crAOo*mism%VSL^551^ne0sFZ*0(AJRgg0s~Y!|#zo%EzRkWI^WJxN$uGoSh-LCG zDcRQFflqt2VD6{i9BgPz$>%zMsOY+)t!$uZDF6LC?^8Fc9c#`9#A`cNtMa33W`pO1 zW1s{dX$A(<8Bm;4k*6|1I08#}Lhh?IT;^zB^U>)jNI$h`U$s zNXoBX1xPmyBKlN%YeUCMX#)VNEDK&h>qUxM|Eb>ISKUfv3v=hIq+Isy&^2 zJa~p~hq`}5ixCFWup8XTQKT=7lBI`c;r^vA^akh;5GRxK_wy*Yp0@@{Ptu$fU24Qy z{lCV5`f6ilUZdCUv(>t55S!h;3ZLC;wyR34WhMvZ;1Dw#hm1o(=z?D8gRY^pUTq98 zXvF^BG$!a{3?dLqYkL!u^oi<3EYXWc5Rcl4dNZ>dy=Jd%kusPTtkxEDN7s$58tpjQd9uEXu%*-AF)q3&iz~>^PJZ9*gh*V8jMERX zp(8245qxmgjr+7_rOa+Z7|aH@!dT_-%UyI4xi8K#gCCx@j?&u zbG(70l5ZMWdVm1F0M)`KT;u67PX8v{fcP%l3}d(wc}eR>QCt8o!+HG3vX8|Q$)`Gc zPd%o%K9PvUK0CYV{D z0|S<`#V<(|9mPjwvVS%IRQ+N4(o*tLk^D_{{3tyZyPfLs{eK@4J{Qgc0q;7x9kC>} zJ|?kW`(F>La*)~W$z7A{y{yrHQXW-Cl+<|qwTZ=8l>Xj;*uoZhHrK{u@t7({*ofF= z9I!XpRawMemy^33A5XnLgf}gzC`Zyp3#mwvK z$nO|>mSwWrB#v=Jg(>7WMIIKzfst$aNadWvzg{=X>4rl>k9@45KZ`-Vw4v_hzl`XQNTuV4q9h4j}ME= zW*d4W4ibrp`EL>l>&2A+%$4ioGf>V-*7c_t@R^hbWo%AM$ezz`4`#_H})=nfVjOQiM?(P`(Q-D0%|v z{fGc!7hKO}9cFbm`riOkLB<{(Vh^&v7;73&cnFpwOWSxpmB{pZ_y)#zXIlR>=2niQ zQscvL0o(@fa9NM}^x`*A0ls6B{*&_U0$1|-+{gK*_%6rUFGG*((4QXB09PU&;r<<1 zUkFbjTwJE{NBMd=%4LdSI_GOgTK*NvGm$M?F)}hk*O;&hr_%^@I%h; zRa~YxeuHqq!(5(;vXf&bm&wO%e7#n2c{#4lGuwiHsnGpe<3wjx)GxyGI zJA=)M9j4-lfQ;H`fq<7MzXPZ!!zd{gB$No;5tWNNCrV-Tj(92pEkBaC);=dq!l0k` zx$pgTKRG8oXYIAuUTf{|-h1sINjY*S;o$GTd-c4UPm7*V75u|nm&IxwIk_h8lAgO5 zgcM^paaZ)*VDP_d^8atSo~g`xU(K6$*hDh5|3cbH7BP`DYvGeii238gkDdPHlM~)O zd*(m%nECIAKl#|ZX3y^1h05x?r#CcCt83uy{o!pTCFoBs(J;4@?O$&_7kXE7`QHc$ zy~2bnHosIMcST5XPJ}78M>NI75pD7R5*Vq1{cC8GIkZv3kGV6{F)nl@CzO-Jei_=Q z3-ue=&sZt+2W{wgdiJAGi7u3BV2>)ggbmVUzcfLrlJ1sP3sI>{5P8zg{O{XDeKa-6)eS9{_Z=4nG)^lI+q)TA!!f->5UC&(+@|%S` zp6fDXTXRWszO%W^Y9jf1uAk>t3nT2p4XW5k5EIg*wSH-xU$O|FOBH}nG*mu3^j?cm`-7oyUg)vh(4p)QJ3PdWlvg<;PLAc;d63;QU{b3L)c5LJYbQxh}_UPOs-KuvJRt2zzeqBZy2V1#^te+T~-?DO_W0 z-$e*lb3ikJdQ?c2Lb_BFx-^a-VY7-+CIgH5r5B}D&~U|H`T}3B4ScySfRz&-A?=3clWPbZ^AyMcskx@C5QadHiK@z!v z`8aEpH$(|}n^W3m;!brJ>A8@JTxWu8l&TvF{9PXLj z*~^)!h!8r^L|gAG=-^K?6&hgj=-890V>n#Cy9$`w5gS0iQwPwVvDUm!L)QL2K8ub5 z#CI;ivEb*)QHGeY4H#*gU-E;yK5$zjZIQNOjW$Z#VGtvxp;z>wWqRz#=V9y$58H(n zyWeg{VhIoeXAjD2A&ThAq_x4&4@b%?Ae8X(v+x`#{}G+p9hKq$`%X< z`HVY5)#Gq%$s3%JG#oA)5Wl31vPhKsn_y&5g=~hymeP?3b8>c0q*b@@X&# zZo1@cvqPh8izGn%P;F6>qX@1t?y{ac=dhB4*XdiqP<>kHs)2%yBQ6#y!Taq{sgZ!( zy%3~-7113!Ym69+-I287-$v38^%#S~Y`eVr0MmPua+kU6f)<-+w!QU02GY<_!Xx%p zN>)%(<%@}^!l6f!^|Jtmqt zoxrgSWKUAF7Xn8Q**Yu(&O({Z2Si9*(@j@Kn8QCaVYfNF({Bs|m|iAm*+0lzk@Wi6=jGK%X#kQWGYZopL1Vah za?p_920dES+6-aze9WEmw41vCM=qi{G$}KpJv2EJI{S>wi1E-vnUS59m$YWtY6sGkZ9!FAh@8T0g79hHqwXmREzN8$s!e9@93>n)M&FnV-txC&VARug&cCw%HqwfseGLCk_tls8gUGE!gTJK&~ z*BkA`9UTh=fK1mEc>03 zzh_~FybYq+p@kXeL*?dvC@9cc`ysUK=Coy!Kh$pmDZwahhh|sQVmd834J?1mm22oB zSFGeHPu`ce*=zS7ACU`j&E8j}y#3N^24W^7askG4`8B8XS_{OHtXAlM|D|hz=jZZk z5yBY+4NMD6^*!O{IgcFc?&C+%Nk`B57k%)4?LFt{dPd$ggJ0zXMQM&mgu6V98|b6N zqA@cbA2U1G5xL4;zGad0+T+se`9(#ra_iflo_~w{TCM!LE6>JiGctcPin}z7yV!jU zybZyU1=cf{p>j|yr7D0YOl`QlkayK8M!{mskV!o^09AEJ+iLeKbNT_XHa62AcYv6w z@4*FDJ;^WQu7G_<-w((_Ttc?w95ZpB_VM|#1!aJm#^4UxHaVot4wyW5I3(yO&?<^c z@~+-mE(@`z4L9UuI2;aQXJ?9sLw_6v{qZgsXLrLm`w5J*`=EPMc__%98zSXbuRD0y zV{wTc(iVBAv=utyQ2AHmJn@Z=FbYg7eQy&%vs;*ChLK+-jj4 zLPcqmfx0OfPV9uO7)}y$pib$B-ZjD6GTtGBeLdY-{O3okqX=~CT3BRXkvBn9w#!@W z@>YA}Ea?6)2%s^8$x=hG0;n)y;wS+b&;gcfcNZ6~aP0^1K`pAhrH?N34WoXXGg8l8 zGI8fsNffMA6z9X{u5s3JEOE>{3Ywp8{LTkqN!C&XO>d@?w5zBH;)$O7MzvoH4GSJP z;-SWYk){trjUYCM_1vlJE{|UhFtaSztn-qVbcyTE?_J)>>q2jggw0gw#O-_zeU7G2 z1AVge=}`H&lGl&r*>06^bTbTc1Xv`)0;^cs?U#1?rI(~Pq&H!?zXuj7@Zp(GD@O#2 zA*UI@yv%3OWOgiR>a>m^6-boor0dx(_K!zR~V*}+q^1aeo-)}BLe%&fN6jm6zX2Hlm*aavUGAIU4{#RWp$xkn| zc62cYx&i6yVlpYAU!@Y&s~8jI%wNSAkqG^Q#gC1J`6Md9o-s%_+DuS>1A5ub%KTP* z0}OpL41GO+)X3hzZ`ZLo{CyhM#2+MV8b6h=S{^o-dlpx_cxY(-SXwv>x`BbXAlV|l zA-@Ug?t(6%a3ISHoxwS_)E;mDJe;xkSTB$_MlxWjUM6j9f#%<%I5a9zCn|y71xgIy z{Tf(MqY>yeOTM_wxke9VS*s0NINA=wvJR`eY0$z#!AJG8C+a3><)Rm$XHQz*e1+UX*v&LQ#l$uuh>2sM;<2 zO@@r2Na!z8O7-z?M91>k0XQ7-gWYgtJevXw1UC2@TK0}C7yqF0GLxb!! z>u;QTM&-eDGb)cxJ$E2|M;={$-;MO$d306&Fwzg_(G_=l9$l}u=Rw2@o=@07s!L9- zv>MjfiF{lUf9Yq>oX15VH!LA*ow6V`O6#Bq&AphIi#yU&el~obw+wAlaUEF(gBRDw zxQ;A?b=PDe4994=0oKC?n6==x6nDLubX!XI&0#zl!zj=nl)BhU@OJ_JzJb59D2>~V z`-ed#e?xc5hdYp7Ka6fYb|8IZ7_I!^FuL71IgDb!4?_&lIPN{rk?T6K5?slFCSt?T zW;7HDuSk=Fxcq=Q`ZWV%RvQV>84HcX7h-J@kqr@TDQp&{4Xh1Ccfk^niFF4qJxO#| znY4?$02`MRDET@_Mu#N-nk4ypne;k$m`W<$1I+XJw2N`Cqa%scW<7=Y&FGnOI;>@*#~g9E+qTiCbe9K#bEST}EiA?3P6 z-hm-*q$f9UumER3xg6=gzCFsN_jf}SQx_ZFz&Qk+yRF$aM%R>?h>Ufy=N41G;C3uiwjzz z-xq-OTF0|1$2g@eZ7zAsk6KqgVTVol--DR@nUdQc%NyftS95u?&zeDW`eJQ9due8V z8`w@_z~NVKv^jXbZ~yU-7=<=v4m~&m4##hX2s9Zs^7oC9U&JUG+BuxfmRFr-z?wev z_;6MmI(@^j?r{GJIG%uM2aMp%ZcTqtIg_S?HI2`CQC@f8ht2G9Siz8Dryq{?HaL~F z0E!pU-KBL&C!;LVf-xf9t8j2FfF%}so7ojV@XDJO%A1?n4p_rmpNRFXbunUJjQA`@ zXw+3C?r%6fKemuHp}S&%HAiuGtru4vaAv!_(?DROpHZs+AVbGqbivLO4nvMYglL67 zemiFSo!^z;^F{u-^AL3>2zsfi|MH0oqV%vsdIWm_kpJwE7SPV%3pjem;JvM=uy^<^ z^do=!`=G!{M236JX-n^&wL-R%LXOJaE_n?MzalDoeZ`hGY!5i#V~wzNXElC%Z+6M) zATZPEx*pCdFB%NW+6umK0K>`}?79N5nHmzX!VvnuS^7a4=})n3I3(0VcA%&>T>O2O zxcECSSDw~J7;XR#Y68+kp}35@8hl~?!Wp{{=9_wMwngB3Aw~mN#8^Re_{|qgBMid? z7#&jZry*KVqb49j6VPHpgF+1P>4wB0p^qmtK0`dgM6yMqhcc=@qVqx28d47>HF{76 z95ldaecHra#;3z12&lPwDoh;!$9)D&YM>mxh|d_yrQ*J{Ayru3m#*eQ0Vv_iz@(}f z%4X7B#Sr9XCFU|d6DFx4co3hN3JRMXa^NHz(r{X6e9qVngiCf&tEsMQM5=+C zR98Exp~^L_rh%)PhU^B8UQ}XgT}@RDCaY@d8*8RT4RN)ZAM$WoqU0hMMZBP^|{8p|NsWW21|! za@9B1)laWcxS(qaI1c=uOs{KQJ-Z%|=89@7@2Q#KnhDNS z*UXKnnoCv9;uYZaRn}K?0Nu2iuKF6TW=ca1 zG!^$i%wK5Vnu+z;cVd@POKu{dj~%P7zV<;SYtEcGl*sYi0DaFb%zDUO>8^8E!doCj zu>JG62OfOj!8W^NoM2P)$IpJyeUFmg=KR^b$L}h)mycJ{?s2mgxa(%mb&nsFX)&ns z^={rhQ^{{Bx&L8z{o_^cI#ph=H@-046qm1a+mrGW^a-{FXaPKgC-_JGt#eOElCN~v z$NZ=Mfwjl0em1Yo8T02i6W#R*_UnH$v2Duz54XTC6R5uW$0rZzqxDhkjYB*D2Rq&h z9!k2+-ZtTdo3U^Flw#9;3MB#o5UtY;H zjSmQZQH+4`3sNdWDIb3-<>SwI84S;QWmcd}kyMDjfL;sXH!ehcfeKMfNXJRVi@0Sa zN3Tu3eSzegY$DT>{xCUxdUR8C`ld~w0zJP8YM*Vni6VrapMu(_$)_knXa#M?5HM;? z`uub&T>0rHy-{=WjK@RpL*VH-dB*FVFk$p)AU&f;Pnh8KwzWl`h`cTN=q;f(&|n;C zzHtARfsdM+xHCO(ojKVy&pFR|vhA%iXL?#nK3?>x`?t3zrgeON(>*!`=`mS??pz4tBXvzU&0dfqw-ch6h#{I|StC*=1)Zc;wz zNXYl}c;Qy{uZQ<~xbcbVPr|EbeGfcOuE%umxg{&Z9Ub8n!M_~Av}dWeZ+-XrcJC{m z9W=ed>sjBvzT4~ZETL)7#vO~-u3h}xQpMk|J!h75?`~gpX2nIS{|wX)4MH7hx(8~9 z?ypCWlA;)nMnQm?7F93$S6iMfZ_&R3wTO_?Y{<=yzvqo^Yjciv z!gJne)DXL9T!;BDb~#y)qVX0vER11DJE=CXhB_6!G5KrX3^Bs@sf1`DeixG8lF#9n zeM@~UOS-{^a-#tH(L!ugZ=x+N=}9OLUTQ5ys2^i7mYWxq%90ci$>m>$ z1Azo7DKH=}DlIe{As!~MNkEjPfhJu4C>NsSBuzs#52*YInNJ=fbB1n}t-iG69Jz}W zGU!RU=A!0ZjbIySlED$M+tdbj3ynrAIfz!G)F{GSWBoh4TS-Jmb=j`J%)*yC^N)_x9aly`qy0LsaInxt8+XhktM-{E{XEzCx zR%mM@!5(QNF`V#?*Ok(8z*(EL=1Hs}6;j&}5rKYb!?6)i5qUEk;zq(9w>+ofA*d&9 ze~25gagR|zRFu-^xp4Gf$_s31S?Vn%jW!zP60~F7i}fh-g+)Yk8s4!Z5CE*p`XISycL9OME=5al!U<+E)joU%Le%OQ}R67RX^qOVdC} zX?9Bq-lec#h+ie7DJiWXMngOosYr5?6dGDe#+S5$9@N!RGEgGV2_zuY#3dJKNlwyu zoydwb(fDn);B7D)%CE8i=R{$kzt)-!wydF`Mm~KyS>TEUk;;Ozg3>Al=I9lSP+IL6 zZ8Z8Jyphk44lUeI!f6lm=PPf*lOvIVNF)libeFr$W?EOX0c$)s_)F;P@f&9Fe&|2y zB?UhHxT`DC0@M%n+X@Q{Etyn5Vyx(omsB7080Wnzv9ph4*n;fxmR42`HE*(ihq3Wc@#9h z(CG#Ci!XJFtHjl7MBj63*S-Aj>;Jd-%7%^Un>LGEwr=xp-?8&m@wL}?y^*n56f@u4 zoh6EY+G7&`Y<}x)D7tNLAiH~Ck0`#g{{ULpCR*M-C9PB&3pV5OIS`+sTvc=lA({9lK z-#xXR7Fi>F52JotLg*bXc`Cd>D|a!G5m8=$-~=%fz4uAvo>;9(-*;((v5c zkWS#04&NK=(zFI9&0wU32t6ewcwFq72IYz2Iu}Vd;g!MYV;AUG4s5cGR6zrpj`J$v zMETyDWF9?nzJ`Y<&S*5TES@#Tc$pB)&E_oakWWzWz`l1596WURy`%r}{s$lZ=f|H) zpApjCv;W;-Z|KOeza0PY#K}+o8vdNbJWYI;-c?pnHF479d!|mCK4a$n56qeS&_B(8 z_>l#_c=WNy7A~Z*ZQ;Vl9((i`3m$oR{y#l5cg_R%&zv!R+SGd{PnuX&QFd499k-X< z>L|Xkh$|SGe?wkQw#Ag0o@UhRwD1*#5?SCdU!&FOjcMtbCQEis-VOO93%H^iiygO? z+?DFjjo zq!36UkU}7ZKnj5r0x1Mi2&525A&^2Kg+K~{6apy(QV66FNFk6yAca5*ffNEM1X2j3 i5J(}ALLh}e3V{>?DFjjoq!36UkU}7ZKnj6G1pW_(dGbjB literal 0 HcmV?d00001 diff --git a/overlay/rootfs/usr/share/games/gb/blastah.gb b/overlay/rootfs/usr/share/games/gb/blastah.gb new file mode 100644 index 0000000000000000000000000000000000000000..bf7d97a1101d3c531743de2bbf8b5caae4f01d49 GIT binary patch literal 65536 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 literal 0 HcmV?d00001 diff --git a/overlay/rootfs/usr/share/games/gb/brickster.gbc b/overlay/rootfs/usr/share/games/gb/brickster.gbc new file mode 100644 index 0000000000000000000000000000000000000000..42cbf0e092eff8816d735650e1956b7a6aaad4f2 GIT binary patch literal 32768 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 UDgr73Dgr73Dgr73mnZ`N4N{k?6aWAK literal 0 HcmV?d00001 diff --git a/overlay/rootfs/usr/share/games/gb/geometrix.gbc b/overlay/rootfs/usr/share/games/gb/geometrix.gbc new file mode 100644 index 0000000000000000000000000000000000000000..87b85c3b18cff9614e86ad98471c93e178811c4e GIT binary patch literal 32768 zcmeG^3tSY{-e(`|f+Db>vVgKPi{(ZosHJwp0r5fBO{}!%*VU{nvs>O?;8kIfd{x(H zniL9}O7HF7``N=sfa@|&IAU48(?R3WS_lFPEAD>(|I7|MENFJWoA>v9KhA+U|MP#J z|C~8<_RO5&JW~3}TXI)f+PAAj&MNv7c9_Z-TSfn!HO3H9MgNmEMqs&>HTJ~vbJnP# zZESP=^yeMlSA0|2PpkbSf=6sBu}@U(`(^s{y}d|J&5I1)=Iuiv^qU=w&bh?_&Tn!sJ)9dI z3~_G2>bnkZ5aCY_RZ)`noQUIJQgg0%9YuR=z~I{KC?6>0vfj=jhii+k-sXJI;o9UV z`g*m7-r#T*Io71P-gB%;7j;6*;uvCvKLu@JSy=iY6uvb(q6V*P^vff^z zMnR-HNQ#QJ3Ua$*QC1`eD9BU2(hJKduWp@81)pWzUaBaqSJ0=LIYpx`(_oPDs#Z2w zRxO6AEI55odxKTJ21~@=>4VxE3`Ds_UcD&W-e4fhie)lLw>KEbQFZ^8iVL9 z00vU3TLFgxYDxuX&6C zA|Fx%f%<`u8Yojga3EC$)Q@~rl}!Ceq^g1Xp^vJTsUJExxZpl^xISi!q#?usLtzSk zdjMZQiSK)ln^+9czFuy%CCII@#JRPW>p8w8-c9xZ`h*vK5YXSk1ZgTg=oy}nnKoTuM#iaA%KrfBmx~+@AOFdu*Bea(M@*SI zWomJWFJpb+2%|}_7X)L=kNsRam+q3rm$Ck1KVyp^5P}-wk`fZrXQ344^jQgsaY-nR zEkg~vlbV9hg`gDXb0JN^yOShokH_lq+3g5f#apJzT1Tu4i!1;7DVnF(EM_5%m<8pna<~r6i@KaBAVy{fYY% zYmK$Wrr@Sv)N@HA*@q#%OC7R(E2OS;`0S%?v@4y1DN_>?BaJi~%hU4}F6`wD&ffmf4FFR0i+>X-N zFw}6ny}a?4hGx)$`ImVTg3}lrMh&Ptbz;3?Y`7@ zsm;~uYHe<8ZahCL$bfKeX<0ZImLE3Z4?P_aksjc5H6qck|Q>=w0`-R&2rWRM* zCAZs??J3TllAK_Q4DG28fcczS6`<*phWg+V^R=sJQ^G zK@Ar*vNUoi6ZSa&dYd94Jz0^kUUP*M>XCB2r(>4!!EI7jm=Hl3pO`FVg-H>V@n|3Y zmG#MW*&5bSp{x(@cyk^kL?vs z?5}{Ti1Xu=aQm7XTk9HKPKhYt_Ft-N-P+o;^_;WObs5?5cXmp5{1*Sb4(>mK-u+%S zemp8{-FoWik&=?%&xRD}qm}!A_)RvhL3imkag8E?_a;nmf6Ci=%wvCedKTn|r+e&B z%ky~p^-H>C?h|dh+g@$^F=>D=dunj`%;U+*I##pO4xFuhVv>j6I6Q0mq-WdqzIWJD z;7>P2y*wv-boS_%=a`~AtzgZ5tOge0z^)>r&eqVN_6#!{QBOhra<4{_>XUD`4;=3G z7Z+X1m9@3&7j>GVAV)AmnCs_0G53!xds^0tOMUh2@}d_z?P6QJF#6Y#UR-*zGJ7_9 zmpyyl=s9UwS%kcK@0~Yb1Wlwj>4CspGLcx|_p-*SPJz`?A=`Ry3UGKdZ>sNvx@m6j zi9LuXTbA==pB;%}f<^!;@|_h+6TzQdu=44OW$8HfGg#-~Hw`dq_`k%tqFFbgf`L#( z>G+KPe4CL^7|c2Qv%E>ysJa7I9_ddUu-+7Rlf-`z;Emk1Xe#)eTZR%ioT~8z&0V>Ae7J>LYVMo zRd2#SGNg(QCQ*|ft!x-c{bEST_mQ>?Rgy&ACRmP5H%ztDL1A6Wqjs{E{)>T$6t!Pg z1u%__=#q)wlfY*g`5|h)M>Ibyntv>se><8Fh~cNi*qm{!)66;KPGT=t0*nsGm1+a)Em}D9aa3GA=Sxc zi4S0DDodPFSvtr3S6sKuEKeS3o>LZxwNX-yNwHeffm{}3o~@u`HOb47BpQo?g{_eQ z6_ubV(UQ&Vm$>>dZW9&B7Ys$G=L;z=iiI9Qvt=e>Eayc-TdrkrJ2d_mXCSMSyIU%&m=EyhPV8)w|vse!xzQy^P@xyR1kFkeqbYtgYyss z>!ncH6@@GK64pjv$3mQF3tS>*Mq_4@oHwyHIv$XyKwSc$MB%WmDxq&+|4G#t*I}^GQJY(uNln=);bc0wc^wtW| z-!$l+=^&D2l{Aa$&Aq6f>47X$zr~_wf`%}8Lo(pv!iX8gUY+FbL8+M_tf`>Kf98lU z+Joo0g;8;E`gMU)2Pm?%U>`VV4xs8JybZuM>?ANeG2-|og6DBm!;3*hnE)R`bR;uJ zdX!R~Y}RJNg813s+3p~!hVzn{z~z1nzlaP~oN8g2;S&da-oXSlN0$#=sMbWp{i`L6 zcH6Plg$~e4Z!7_ohFH==gRYs&)aI(FkyupzXEBCE64fwr*R+1(==*1M)ogEfHQ5Yq znnfS~eW2H5ul_cO4QDv-fYSmNvu=eu*RYi6I#qZ?-0xU{)@Jt?&F(|9@kN#%t{ApF zxjeZVEMK!KxN*Ke=U@W)j3K3W=tz+26GspS&jHim*#pgSkIHOh-NP?o% zCd`^0?(P2ju>0GbeObf7GPr`6Kx~FN4G#U%|4?KxenIv5k_vbAWs`u1fo4IDF{*FG z=KWu1i;IhhfZ*+nmD&!mVRX$^-@}8hxCesZ*nbKhBezk#w^Igh2r6scj4C4t@;4Ec zaox=Sax@_DJ4_H%j^2kOC36RMJhd$x&&V*EvpFMKy3S!}@#uo8LISgjsJ@Kq3rk>C zRMs$3X;j%Vs_01evy95PUeu||r~vAyD-tHGdnCbKy9|Oy*SjhtEDJBk^5i0_pP#sd z_bEAuO7_vI4wMW>$s#J$PX=uLglv^yi>qyIA@a<|@R>tL;M$3fNN-UG-SV3Y7~$}(N_&-g+6Ss& zvfNP#%$Q6pBOpr(2&>Gf6Q9ij<4iTqfyLP`=Q6=>iJr_>XYN{Nr}N#l92^1MilF#A zCK#VDTP=U&hs9aaBsh?t5(o1H;|QzTfY_UWjj!uZ$FR3jJz-wz$1(}Y^XMXKJkDH2F;oP4hsN;BjQo=^;1T?) zigm`Y#(}PW5D4%!24}hwGfs1RiNCzWY3SZ++DI6}xe6W7IX(t<{F%j+2=_3B!o5sC z;Xe3*Hi;Q1Ovay2j2-Y)M?A1|Eo98ybZY+KQzhTL823WlRUGJP`GeJ^SHUQ<(DU;L zo3EaGWB%aOtLNU8KX}^JbDzo|Jpbys)$0atyn1f)y1~1yo;!8j;8R!4J#|JaJ#C#q zy(>B*<14By?wS?!{B;KNwYR!)ogwwwTivzJFzwn~J+;m-|JqwsuQzPG_Eyd74ZE(r z)ztNdQ`g?=wDktH{hD2|& z;GJ>s`cpmJr}5sd+7p|^zc#d;3h!JMSsHk1a3kImaluiUl#eM9Zfrc=c)EtIVJj*s zu%64_wteiAk3Kr~$=kN)vWSrqkShubha{_Tsz_=PMQB? zMFq>+?WOio)?UG$tiUJ2l4VJU-JX}%+FDcN@!-G5gLW|?gmpXU%zZacOj2Ef^YV~_ zQYrG;`Olo3#zv&)<`xv>=KAP%JJ!*L zq_4EJwY9NPvLNe2oiZKaoE)V*(sFX}DCy73ll0~0%JLW+Sze+cw?xm$DJWR92stGG zeRV1RXs@7P#R^#-B_(T;J-c1T(QlXL7C){$<9gr%?UJ6}0D4GpJHv+S~EQv1-u*4ENeh*~M~ z%V%4TKX@oc82v}O#G9A5Hm_ti)}+geh*v-tDkuZkgkQT*j+ zyX?CiW$YgA>+&6lD&D@A-&e8!n{N+%_x-^`hmRaRcKnAECxyyWr+=(M^0wmYn%bY7 zXMX;r?reR-xyGjE^A}oLT^HdMA`g&D4^s5uguY}-R2Da-FLC{ubrOo6$-+DSQBhIx z&K!j1IkVZhPAmLsp2@<@+xZ+j+xcf$7UokEZO(bDGmCZ3Wu0?a=liVl1D5ePSF=p0 zb3RMwvW&qD%Z1`!2E7PYRn7PgG87DnvoQ8&JV!*13gs7O~Fv zr2PN{_5u)LfDK+QG6>;9gwR{)D?|!LAxelAVuXG|e|Qav5@^9J#EF{+RL*Bu4*oyi zV-p5&;2Zoze})wX2-gYMbKn~1LK;1nbv?(9)6V(=e~LlN`QhWZVZ=rkfKM4C>CNa` zhD>q2&wg$Rg8K~ouz4ReYmU*lz3+h=cL=qIGfuc{TKCU_N1E~j)MLfKAtO9eA6aB`yK7eNh zHV8A|Ko|wZb0+%%28#CJ8f{v<*OfqH0Du-%d;s;c>;^}F$v$`e$a?K3H!TD(gL8h# za(@+{SG02CIyJ6hSBi*c4w@jYa3cUe|GBL2h)h`VOADZyIhv5Mk%_9H8-C@mKZu)B zJ_jBJWenjGlHfQu;i-8E&&P4v083DaCwO^co3)5zJRxK_7fZljO}~Vs@=S{^Ju@LG ztsnozki+Gp_oU5ENJ`JdH?*CLJ?ZeIhSWn&s17Y3o(4Y|#TsI~*iW5HJRnjC?^r|k zAve5V8L?Y@I&WFp)kdgklD*pbVl@^CmiS>}(jTH!pHgkzqgw$lTif6PS^cQ;bVQ1UH=yUd)fdElC5>Fww3#mmw8UmJc_TdxU4=g_&Lcaj?ut-*}6` z>VfB(oG^~DjHE7cOo`pr~5qZ#6QFD-ZOgp>sw5khvx;2xX$$Gcjawsn#bNA(Q8SMe#br;LcKk)E+uo= zrSS1X&aa<0{`kk~z0ZwFnZAGK?!?cB+`hql-n?R6t9X3Gedo-_O_eu zE9b&vhrYBvxas@v3clO)P}Z##L(ENkD-JBb`Hln2UamgUKfbEu!i||Zi^haZnMl5S z>~CMq3FxE0edv6Xan{PCPfXhP_XW(1J}u*((XM$h{7*oAs9$UV8bJ zjLg}8oik_dym|OeU{7;otg2<%P+m~ms!s}J9EZU)1R0&^-qsH^uXkM zCr-F){J7DhnA>j~HZ<|(_<;lH*cfA<@X+8OorYX;U1(~kJ5yVA>g4ew2M_G$zh)h~ zig#}NeCt0x{p7>-OZ!BH5eC3;~-^zPCe|_P`%|-8j_{pdL*!ualoyEHx?AQGM0|$>BKY6OE z_Do$v(*@V1|Lgw$Z_nT6LtN#Kw_h0?yzRu)n6EXf>MOss|M%uKi!x_Cd{@%Vv7wiK zKKAvO@4dBf_R|lHyLCW>`h@%VwzuD3l(BfxllM;=5*Gd;fA*L1!f@vJwjDqk66UG< zVej@2@)l=IpFC!$+0ee-Lta~*z2n4LPu=k^Umi_|5kuVADUaNhaQlO%(B;-y6UkGL z-**$qCpy(k6{m_*XQ<26;hOt3?`V!{`f4X=bG2KwRa!&9?E#MmED881U|+y50i8b* za8OsHyP(tQd+TZa&HCH)WAy3zhxF6*Gxaa(=je0wuj!ZT-_ozsZ`2p*KhpnQ|CxT9 z{wsZ{ez$&)zFfag|Be1T{XzW^{W1Ly`jdKkc?x_$K>T_D=bDd?S$jvzzt)3{I)p8% z2u{QeD9@lm%AbdQ_V~-vxrjCXF|9fge^onQXW?Zx{`yqoAF8vRYgnEdHQTuiHvcbY zMakYB_$1k|4mgm7WenHrtYC00Vuf(mGFFIiEobp_2Jrq23u_Wz?K(PYB&>nJHxyu> zZf{os{G@knga^F6T^%gKn!rZ!QF5;icx@7o#=?4 zCZ+yYYDQ|~SUES3)s5>tPOdeMtu{De2}i}H(QDWVapK#4Iry?)4z7v7at&BVH^q3W zuRflO74dvSjOUA^#dzjP4zGZCuJnti$OrKR+4gwKvaUB+p|5K(D@3|hu!7OG5`!7V zxwc5b95{L;tR~rnNC;+>s}O_vt{BV?=AcFIdV~44(hUgayBN%Olt}pI0R}T?v?7=r zM!!FL_h?`6ItA10d{qi&Ugu!K!WURaH^pFTuMo_bj-7J}Ya9tZ^7t5dh4dEallhXL zt00DNN->0Zg*yKRafTl31ojZQKC65<$k~Kw*J@aM`WySj?x|xSM$tAQ#E6mE-e03Fs=o;iliVfA2Slx>m=!ZP{g`6V4ydNf$rcF z1bUM<(Cd`GLZCNcpw}yrHo!rkonsV%?lCre?9J_cwsCByK#y@QkOH0GInWzev<|LH zfeyU-K)=Qs;~~&rjDY1AcGX?EZ40q&sDZO_utX@Xz>4dG9{>uL6zMD$Ka3#O zo&)k+mV?Df{-#m<+*F<$%?}w1>$35m#X%OX<9NrYqTL^k;=@N5?Y@}GXN)P@ecKp* z!`PzT%f@zE;31x@oK$bl${`-&al^J#DZ5p~Bh#>y=-IGsRm#~`XN)qzn!G!)YjM5?}6>LD})Ut$tA=S85$WH z0o!Sp=oe_(G-$s~vp};%-%}p}l*mxxNiNw?vO?G|>;cKz`sYpQ$tRNwvWv5mVLNWN z=X}e#wu^18?n~}A*nEpybhAClu*tR{`($!@^7AIdwZXRDR`1#w21CBa%aW84*U3L zORW3rl7$&Y|$pS|d|qoSpwNzonbKa%vI!rsG4a$S~}^&36MK)&kqnVNF;V8xnc z8`fiRir7On2TspyoYAmgcAMC~HnL#$jE0$w2TmWVDPkd-WW)M3%MMnQvuA3mPTMNd zmrW@sFcm{=akF=Gb2ua=?M%uuKAe}Dv)R5GHXPN6{bnchAvt4Ds_`7F*=(23om_$& z9TGOd{~XG7v3YP%3Ls9_+r@nNQnGtujQ05qJ-t1O`Fw1qWTAI>HzZ zIBigH4;>~f0{TStCZwmnM^AOn9vY3Nry33+eZ_A($m)K*{I>d>lN@gP$+<)3-ATy4 z250pJa-#Nv)7dDaPqbAxlS6gq>RM$CA-L(*ALpaCLkH@9{spwbW?lF!#TC-N3(lYF z;1$oSNHuPu&K0a9l?V}YRA8z;`bDR51yoiC0a)G?ibPnzuBM<2)<0H)CA_S|DyCWWOS5LxOR!AA zQsPA|BN??ut|~bs*lNve!8R$AyhTvnSSW8Ols6c5*ieWY4&{x8imiokL)GBN(;O3V zgP`~_X#hQG9Bk-&=?>h`XBIc~!FDu4=qK*RC+OlPwjXg58@*}5Rd0y<5n0_sIoyB9 zpPvAa<#FTQn|FG*^<8P>UfW$=GTDUDLMrUuW5S%%@get9tn+DUqaGif4v%}EWT8>; z0<1^%^90yrcad2Ld(_}%*%D?E?y!StmPV`5s^Fl3N?0OAB_^g)5098;%(N^wil0-1 zSHt7t%x2Ct9lpgkoh@-a#kxI|xYtet_H1B~7SaJLPB~pqi)EJhxY&Vvko0tYx-=X8 z(*xg&8ov>@=Vh90X55DtXwEEC0}StnPlqSqPs79Or&+g_iV&NF8cb!_I-X4AM4ro8 z6LrVMWrDkLs4|WtREo8P*-FRd87Ptwg<1S_J&8`zB@=@t04<2w3H!|8Woa#JdwCL` zlWRvp+z=6H=?Mt<{FOEdFdTnoBHwEw$3K{EIQ}f7lip8ne`O3j#gzBvXC zgETj4!ld*G3-}C_lm@gHJ}s04dW#N~-vft3X2$_-@;zOSRpPiRZDxj1Z|A*TGRXrP|M+D7 zzWc>3$2gMV2zK2h9Kmp-trf;D_;4Px8rF^m1nh?#7N3K=PDGa3&T)kb38037CeRlhu_g{Tr(A%|DbaLTp-;{=uJB7r zFABj{^ZZGYsjx!B&8)%{cNP0Zr7!0ZdO%)t6}&73-r+k^u-`QPfyydAWpX8qTu}{4 zuvhb>%zC4j^^VK4a#i2so-iGW{>q|F>}d>$xiNrhw0%@k8`8>xoKLV-ust+wk+oTp3#8Ln!x+}6qo=WkDQsyb zd`~etW=MeXd?iRmN0_BQV{l~yjKt{rM@B9G)g+G3xSw-9!9MSO+XL=>QLe{XXmym- zw4E6S9f5a1nBL$G6Ap&O?Lwg*fA93vZajHAAhTX!qgCP%*Gw48`;B$8k8( z@(Yf`onGISE(tvD`(b~@cPCHy5S^j+3Grtq>fMLj7piMJ^C0H1tEH}X2lpdj~yZxVOYLQ+Sk%f0(=#*uOc=-!3VEPScv$A65a>DtzVDq%5dS&Uj%D&XY`jl^e2sqohvBtFdwP#Nu| zirB3B)o8C)G;EEc39A*bQv1I(+N%|=Qohr;`d7VHo(`p_%N1TLmH%7422ZIw^xmyB4XX2}>jH)RLue8Bt^@UQq}VvK+zX z{@@D4t`M;ba1~-#iC6`wU{HVxy$Wj}FQzw8(;K2DFQ&a%ny>;sVlO$TkW}bXfC_^O zP~n^cR4{a5el>cux`RhuaCyC?Rwb;$XksiVqOhR=719c9*I?JY3alI*g}99Bf=ec? zPFM}0lp3XIp8{NitzILxT7m5v?3!1B^_c~zV<=^kU%Ae-0xo~;x|QlwH3ZU|)&dsp z7%SB)Hp0(1vesilf>Xq95@S*n1Q%9SIjVj`db757;M=r<>z zVB$gD@q0$(s&sc82xSq)Ky!7d-z*@j?J#(~0hgyV%F5*5toJty$d=m2jqx((vL(c9 zQ3TvII*g9L+3;@`ko{2zzLBs5Le}xd(cTc59~kg*xGdL|sj`+Uas7J8;HIz&Je6*i zvdS(-?<=FOOud3y#l22>6Obho1N_yYezQO)wZ9&+eAAmILTMnDwUBewcUKFRG|riauWol&_n?MG567YR%A^ZWF`LJ+sIw1Txy6R|hhiQ*|=SIELeig{JeZ5h} zyw%_=FI@Y;A>_8b;K7w@R2w(zCi7P<%6=XP%Gc5WdMmj1bYN;_~pp6xfDKNn7f30(7V0>hD`~UC$_xtYIbI#d&ueJ7G zd+oK~`|Poen?C*lO6iYq<7MMtfA}u5FdSyB`UlH!M$xlYeZivWMo6vtM~fm9-3 zKYageQ3%zwmMgLImRYNgRhk=XzCjxDG^t3`IBmU2-@bBUinOuWMw#W(!{JP6?u+2z2ozg8rxS^=$9tZKALWa?TXH&WIy+GbDGYR0JAZCX>A zk;2dGB4tyVqd(7^_hkU_6RsdR#GeEZnOwPX6A3)~<vF}l~~I-&RYhPs=BjOmJzJKsI?qf@>SgjJVegfN|1bAi+n!jeyvS^z~ ztnmq?{`qlj#$ub629goBo&;hQb{~{bk*<*>rw>X<>dxLJI9)NmJSk&PLUOvTq;JH5 zk%BG#|Jz<31$XNJAq)`^ArTQVkq{}75g!svnV`LtgPZp4cWI1_)JV{oNr^reu9cd(;WDq0CCTl@0*OB#P z1IZ;D$tIFdwvZRdi{vHpGI@o(O16>$NCv|Q7$GBK#EgWIGBU=831;L>2ouVLFC6mfCX>S4&pg1)X67(+nMasMna7xU%zS16vyfTNJi$E4 ztYDsERx(dBX-qnk!5EorW-XJ$tYg+Q8<<>XBeRLgXSOgeFfTGMF)uT(Ft0LOnF7cR zMj#Lf1tNi1AQ4CfGJ%gESRfaK2toy6f-Zt^L4-gdh!m&KVJIq?`INn{j~)#4+nIY>`VIY!;rhn#~^-Isroe-Ehm7JLK+@aOtF4ECM*D4juU-Cgb$j(;6&4uDaTV5JWUvZP$ZT}Wj?-s{sDnO!SayMurA>dipZ|ry7%a*RH>t) zV|w-Oqv;#lum6C7gW?7c89FR}_=u6C?iiggMyva)7u22q(#yG#+Q&OLQTsTXR=Fct zt1L>Y4S(bQh1e{?6OKZL?tdLp4@sK9!K$NmosMEvfb$vf%BLs8_5+6cS(;U> z5)5acO-OKTr0VCXmf27zO)J(iCJ4#JTq$upOB=zZeufSMx@6~OTC8ElKpz-FIvkc7 zP9mLKX{xh;rbIelrAf8y&Ji^nD9MeQTw+hQ*0O)|sWC&(JK6aHV8001-~$j0pItdZ z%OJDGDk+c_dvQjAvoUVYs5fWSo3r>EI2-f3jE(uzeB}XO0g#v^=N5W0gp=EI9=UA- zxox8AJa4%@$IIXu*a&mjlBRAwvio!;@ zxjCcIz>jfr)+smO4CU6rnMZE!?7S_;#@sGn>?QwVQ`zW#YwC2VefwtC=~8SG5om{; z9A`){sKWBD%d`S`MpTTbW9IkmtJQxrKPw~@hmJL%61RaJtrgmryGhO>NpH#GhZoH( znOl*dgkR3G%)`g$b2xQMmp~)Y61j-jv;uh;v911~&ZIha6I9#H{5b3#*Fhi&4`T|l zxD=#ZPk22T!}$Dc(5(aExV52lZV|M#mXl;-iQWgUnb8l|AX86b zNGnh%)+$ySTxoU*w8SJK)~X(y^MFdE73@v2R(0=iGU)8m;S`}WtivhWo21?*k1a0W zuMtH@E3PI+-_x5^LCKZ|*O)6^0+oDKcFJmF>Z%XxOd3InEk^M@FLhUl1_m%CHf!w! zD?4N`d*5I)`{-cyz2PGC~CmVJOT?!03*UsuZJU$#L>V;-J(isRqeGhHFH9Q3>Rq`h5!3$=~n1Huw}tDC6y4P zjAv6(ZZi@l-biRX%sdP?QZigmm_$9HiF$@4=_yH45oVf-&}k}$Ojl7D%+8t`JnMe> ztVtoW?hBnYrOT|4@L63WX89@}oE7=-tgfqOb^CT!cS6E2qj^d5!t@qHg$YHR0r_!_ zZ#m?{O^}acZry-<8Z+$%UpwIPxphs*7cmcSKyH8_Zi3vb9vu>UPjt}%jSzD99tmMT z4hH=J4VoKLX%ubm8jbnv!9P>yi$?Ix%?LJu4SC-#3Sf} z0JfyA%1`0c@%G7V@r-deF(xwlB%+_jsHVfr1aZ6oY-9wFyR$OASR>He)bEFaih$*S z2GpYLbZFLPk6;-WzDQ&o>^{6y&2c%@20iZ${ukvnlnp$b*hcfZC% zps25GobPy0&gZ?Un3`5w#p@^>WVV4eOpBWBHZgY;Z z7MD8*T3vB*QY~@ZVO0bsIpeHGSNcet54*$ayu(_o3gtjrgMFgbXrH2$+V51zIjA-W zya?}Q<4_guX+WpWn&doa*?V=rU5^AdkN-i-)m`94!HbKWHH2}50q6x32vr0liFXjJ zeF%?U;uvLhjJB#Nt$5yzU1A>#1(W@n!4T|II6M=uH_BQ934rjmdcdd%0}OQ#kRk0+ zn{zazT$0D;54|kOhi3_d>JE?(rCAAUiAClx`>lG%9u!o1%s{KhM3@94MsD6f86Tmlz zL9NNE74i*R**g`OxFleGZ~4WmY@pgjG!ZUF(-Uf!1eZ{wc8N3^msk_0R}5e`g|n66 zZ0`s~6k2zLvkyfmBHUK+^>-u4A^_*2uT6fhwOPRa*C60i;)??vwPY*1XQ+++KGqdp z4mBk}r+7hoBUB=h9|>2hIK&6jmM&P7KrS{nlj#pRvw+Pt)?}x_%5EGck)fYjgLoHZ z5}BNOh?3`JEJ}!vk0as+)|5|FBh55K}Or;L(D01#cGoP#}6u60Z%B4bl)t?{a`;XT!3tXaP>X;8)>uN6Yj2j`o# zPNeAyv{2%~txmAU1FTai5J9Ht1_&;h2V>X`7{MA5V8A4<4dQhku|N#!@d}ts9<7i_ z<$o^#Hf#^hTa~^DL^pfIO0*HEHPk-V*kX-Dr1jmex|&{GuJz5YDc1O6ixVEtRt+^n zF8ElHxXL-u0^L6K^NPsG*qNy{5?_#`ZL4CZ;yuLyg+&2*GH2-%Pt04gh=3KY)Tc66 zxUKgr&B!A6FUm-JYUNW;EKNt>d*-cNnlbMQqSZU{DLl4Ns4`xl+F-|v6g&Ca{`*HV z>5gY8_FT0CImc#%|u+kwT3b2N_81YEId^+;!K^jB1xk(ms~X37$&jf;#KlL8@e zz0Nze7|j&GWyo=#ad-Z4=;hvle+A)TSgEX}D~8S4acBX3UB~m(kw@8M3fn4RU^OyO z6X|W22>8kZ79He-Q6JN@=ZB)*NYuwBfgO|Nflc*--4AxIpNjN+m8L#6TT9rtMrj#* z2=F1qhX@~Hd`R#ig-0ura$_D}6e(nv*RY3CZ=}QiU^E7zbxV)WAbv3B&Z5I%9mAZ? zJn{^|uzQH3FObjgj=O+?cx0e+@BqWXYX@D|Gr$dM-0^pgvaXBXqavNr2&4kxjs*{WB6ctB9D1@61qJV*TWS~p84E^vgp(^g*mH-NC0zcOEMb z3h486uPrN!X47of_J({kvu6`R4fSIP(Gqn_ch*GMQ9ZQ2j=ol?H#AnQ%rVI7h_kXu zJ#5Z?R;U{eiyQ;2&ibYmN{h9h5k}-GYH}REL3MleMHck6Kc-^po;~x{G|sgJ?hy|c_xY+7z}9<#Vec@h+vV-}|cywb5m zN*EXb{bLpka%?be;GH{Gpi^&iS^*2GRsGa9OIDrGB~%4S1nQ5TV)w(em*Wcydb<)d zf??2gwOPQc++ySWg0A)J45_d43+SK7Ae3?p#aRxnP>Do6=`nCgr0S8A;mxj(R77@w zw$8d1R00uWM9xp){@hYr&aNbitL(EQbwkxb_AnO{yj|)m1JE`MM>UfJbx`=8Kj_$9p zKPh1#AXELu?(AI!q2)}#&(G#tV-i!rfm zL9_UV#9kCP6ZuCL7(vN>UV{YrUMCC~VqsVQfTg0(vfjchdEVBfbd;=0)H_}wJUni` z2R}2UH8dS1?(Jh^Q=_0e&p5VN`I$%v3r36TK5MigS0rK3qxTw3{sIj=LT?7*3J_>> z6Ds`(RQ3}4c>6f*TDxAtfWERrV?Z(3PovoA(IpTY6hyv^u$ma>7LdpA`}c*DH*&p zJmP$e%tHtRv*{0U3&fF;@=Gz1atVoqxyESQ^?<}^*!OgUuUtkV?}<)~&bkreM{u+k z4f9TkHv)r6q!L_ZI<3(#D z`(ZD~v(|LSb5`i>9I%u)K7o6%)iK2C7zz^w>fu;(+z@eWQfz8$N^COj;lecy?7_`l z41*JP!X412u>JsjKIG1wf^ktAk1=kUT@%n{c)H(R!@v2z!R|05iysmB@TIccJHI#kQt$Bao)L1i0Do-uOJy z3lPyVqL+eHVFd~GBl}KJr42@$&iXP3QK^3}gS14#*wZ1jfNhO~v1B>~(A4}~wj%mT zM?+bLqrMDAFTeCIaZsSJI9z3p_A*C5i=)3qOC1pwZIDA`QHw2Fc~mZ%G_{XK+Yl9{ zRYk!Ix|IPIEXQg&_lk;gs4b2tiz6DT`&b+ri=(f_5o>`Nt==$&)eG*J5__;+ZV$1C z+QaPO_6WPe9%=7t?`H3A?_uw0SJ~C}D0{Rv%^m{<@uxBy-22K)>@hZA3|h;d%Iq=r zUiRKL;LGMjnA%n5Y$!_jUk1 zKL|l+0SYH$S>_a2=F1z)B%;`m&l;R7Nl zF3-(Pighz0Q;5N;VPeIqpFB+1*!W;>NkA>oLl#HI{v!!=5T`~rD{4Bc$1L-R@PuLm|L!>tQrRk7L`@waoGZ9dOMaa{tWN# z8Q_rvxI{p>+?25hmOpGz14D{2E|?;IXaIEFa1JmDQr(&asZNJA3vDQCjt5H4pHZ)Q zg7Zf}7!QyzHbUSRZfuav9H<}CPCFkR`2Q29WeHgz#prY;5N zm@uDnL~@RRM>t1U&hhX==+N7exQTWssjM{=14_SwiZNmdq^`0t8K%=RK-2v>Pi}po zvJp!n=jK)z!0oldzzOafB{#pHRA*1uh}dWQadF7gRX$KZy)hC3hAw)!E3DkrrQF3F z$%%y?Wf&@@mV5#@>Vqm#Wm!&ar41%`?|{kO;V`*7#3j)TbV)U_Fn`$F<)?{q`NITo zfTpV}P!sM7(uBBtHG!^Rjjzi`BXNboYL}Ef)Rz-XNVy*Bsk^O?yR2Nbhcy|s_p+() zw!&UuSjY_l@34x8(W(Y(bV(Yb2C*ml*qnF4P+EPDHQwY*wk~r{wa)+e$ol?2+Jn>W z@(g>(8hdEwRUpQo4nt2zm0?$>+oLcL^!m=`Jd7g`2*k3!zr+~0oITlJD|Xxiv*yWG z$5b2`-UWK%g``zV^nuIOkBC{*A7DySZzDL#Be#L1C0v~0B8*c6+-Z?L?SPvz$Rp1b zdXRrNDUy6X?y&3A3$5`Yt7Ea%vBc_l9Fo5iCyztai(qzHK3oLd^Q$5lYCsi@cnFmN zba5wC=7BEepbS7C?}RcQ=;Itz0MI3!P=N=!1iF+Gwc&m!1d6M$E4kHq-ctPKhJoyl z3>2%9iQvyZ(I0YB54}cQJUJ{8sS_RrZ|Fikv4DSnhiHmla8Two_OkKaN8mik`4-&^ z3EHdr2}V*j=GZ_O>cITAJqcqg=O-*7js^Bb>V-6Lafw8hmiGPk-Zu~G4Po3dtcY888EP-P7V;E3Wi!hQ;& zSoPa*%|)?ogs$uJeWF5de53&gV&C2;Bs5yAY64dvk%%)o+)z3CmxP3R48-UeO^nc0 zH46g8T#x~(=1NFRGl90-`v)(-C6MRnK|9k##@ zn+R>t%tFtc5Lg)FJL<5#8m?e`gy16#A5-zc<8*@K(2s*GM_We_OXF6=rN`xRW@+5o zxL4qQHtzMfE#N~)5xidk_bYKlac_ZpVcgQVN5RbnL1xAM-!oiWq7um$#@SrmMvC?F z)Hs`ZR~+tP!Icb~I?38KG^+ELW|PCL%+W#cM4PQ)qHB;!?Ou*-(APCx4Yup?ZP&w4 zNIM$_Ln-!&p7qKG{Z(0Ayi zm#@lCt|F0Z>g);26hB*&JnW`NwVD;@QY1ncL#$$T!zbL$CJw>Yx5UxK>Ikj_z>U&szL(G3-Ewin_$4s z9=OcPsNXg~{lK|!4yFfG`(3Tj5m#6NHnIZ-Jh#30z7`+IMilUTZZA{n2%3Kjiika2{q42 zPvYl)LikAu*zS70hi%5Z756ThfB(F+yH=*%KQC*>sueRQdhEtNz)5nC)d35IcV zRV@yr!wI*!3A#N@n3~~6ELn9*TpUe|kIZ5}8Vy9<7XndDWpuYyAF6EZi=)-rc=qkl zsNl)!on?|>*aHMrHZ%#&56i#%b341=+rq~hU~I3fO&<@ufN51`(7<7!W}lRJ0#(6_@R@+F((CK;yIE zy?&XNJUc%NM!(;H*Dwy&@B#0eo`&9+(Z3Uw_k^*?P8f?EQ+#NxO#*9;`Ph|O(1#jW zXGk7-eK!c|PS_E*RTAc@h)beig7nv#S_y&mdZ9?sq7BQh7zC47Fl~pm1Z-^Uth8Z5 zQ1J^j@J8KtBxs(e{=rrU8mF1iI6>!W93&AY^PKlXjmWoX&RNzmj#*ZdHVmH52XM{l z0V~w5*#sO(T4R0`Y+Fl%;+JA|+;3$@j&!$9xYvgp-HyA{$`v59n%~eD9qk^jgDQ-u zykY#DJ}xEW&eSSc#Z$wW14fJH%3|1K2E(Xf|AoUSGuSH8hT{>Ka@l2nS9{#P+rG!9 zmD-m#>{`~ad;XKrE26bQZ(areHTGRR;N4{nd*%e~px=HA@S+Oc?4fE^_$0Wk&Q+Cz5^`W+=_py7@}cTP zrA%U$y;n}{v8U!ZI&TIt`348zvFMPEhE@Y8o&&y3#u5Aq*d`Q^l|&{g~b&360r!z zBA^Y#`8OCS?4;m+3%-Cgd^~eXUqWE!q1$NIItn{VQy<`RcHEs6dQ~9vFp)xO8w$0(L3z%L#Kh)+P zpx}myZyfb7F78_U5!2a@t8qVX2&D|+zMhn)%ut7K- z+Sw#rK;cRj_73EIRz}9AJX{8=Rk$gc^Xj`Ya^^K2vAl;v8*?92=!vNh-Z^OW{mP(xp@M7&A-uK1|RANwQAp6PVM1-3UsOe!DzIW1d|r>ujl;*HNKC4WgMEbo7FbYaRpS)H>kJNs zg;kBsaLA$l4zX}_AzoNKU7(i_(80QpGr(e(JAEwn5U1Q?4|RrEaJJLt>|=pNo!|YaYlM`p%sAt7@M=Jw`U3XCD_yh$8p0l z=-77+{qdf0GsitKu5O~oT%6c4QJUy+!CUTt1u+J8i6|`hM04xQ*-?=8Y+Pi5^)HAW z+2kZCxP3|bc1SXiljQvIoFu#P?1q9Q!>*AehXs-ZI=3V}bk0DFJ>2PQu}3&VEp~-7 z48<5}b82`ob{jti7UoLq5zv{9bVi{VdvRjCCMrlvFSi)Gd$Ryy?1f_N;q6%hejvt` z)th$pH#l(lZ+4RW5~kn(cwd83@8 zEf_nn%F9`H`*QZTC}Kg*yC;I2)pbg>k*h+o9KpPheYn~Iki;AktW`MuEq1jt*ut+@ zz^*}FQtwP00}I5Sr4XC?z(lXKeFN#LxpmrPm^KUnc1yxyE4Pr%t+e(BFIb#a6ASLp z<6I48C9uM6gJoW}|5*0vaqMT~*a=H#lSfoPXkGfDG|H&BkL-tymO) z|Gbs3$%mgn2`4=XE^XB*vD@EQo}37KAfoSyp2_aV`I31!$x_+9V#Se96T>Q=Jn~5* zJ9s3{n-~-XCOB0~A7BhH1&}~}pfS)CNP_f1#voG=`IlcRkicw^K@mv74suX|BxZvwia;86 zkcSE+G8<%41X8hsTvQ;L*&v%DkdB>e+^~WBCoep<>91V>q5mt=W1#u_YuA71|C0Qm zxc#N;-<+QOMgITI>4E*fl>h%?dW`KNY=&y%fLw_R>d_38CQ{ZiQdg$Hnj`059xI6jf!@th$ zl^%p6`))qC*L7}mcEUMVr`zpx!#%DW-|p}|;r!0q9WIa~zIQ0-!feL1DN=gFYHIF zWw+0*snZ>v9aXVJ^Q$eTBtNNSOR`q~$r14*TGb~}{@ zM;_JN!p%L+)~fNVdM7PNT(-3LT@}4z=j~l4*WVqPRcVHA&c{_veW2upl#&-y&DQjs z!}`>WwTJa7aI&MS&$VYQI&-YBL&R4bydh4YrD+P8wqe6aftIAf2b@~{LDg$;7ThPQ z7i{4*J!`lKCvg$p?TPTAn@6a^2vvVNLKPRGii@zZXCoKkWG+Io29C7J#U#$Td5pmr zWALAjG5DaWAPgj|+F}cD>Dj`?IHfa2jBxJFBa~r;vOgW6j7y@7OJaM^b}qs@J0gVm zjK33~2;&p|>G(tkRj-GE+NfTHJ6hSdHSKUax{H*nP>ayF`C* z!DlaA0f6sgpnSm>&FRmiq;E=wQgFFq$ST-zF!=pJhnZyDb(^F%5}yfo!?8@gN!MjQ z6`2~*K%$UTOwb4h(lzjj_ae+!A{&7Ay#{wyMj`j+4!*%ud#ljY(Buw}ke% zCA9mkpfwdED8fS z8b1mb;qJ2?6h5CpovECUI&*Bka|bQ{{P27z$6m4v_`L6;Tgoorma;?WEo6t_-L65$4O^7kMfcUSa{C zUtV%ciDAC~eno)Le_v%@achZvyBH;QdNF(h5y(JOs9sK&cYT6u{F>Npi`Zj}QN{p( z*1S%a0GrIh(z=MDYdgYg>eY+O)>Cj&)Y;*0qlH*7UJ#{#>?vE~}Ww-tib~dyM^J9@?Lt z&uSO3Pd?875!OTtno*XqmNA@-ci;S3qQ2V_m8MR{$G!NNhL0KeNWlkmzp=LfA1}gj z5x#I#L~lsQIK^!C&EQq=S?p?8Pn9nOF-&z&^f1K~2xpjT0@(B&a3#R+1>b?-8w;Ti zQ^kNy)d5!ldYQpxiCps$9O_OLYWK%P zzb*BAOmx>=_=bu9jtJn)8g3K;2aM#O6gnQTIPZmU?t^fqK{(TI3@2gP?SwPS;+z5D z%!F`KAe{Se3}@YKh4Y{VK96#?!J%nT{X5&a_eG}w1|?8*oecLbcM7@pai@rTpH6oS zu#~8W@dpp7M{#fU82&Yue@*0HURg$tELsj{fWSk5j}Umkck6EkSFxuxaL9{BXJy+* zo6~cb^kdI@L1!RY+2HqIPX9YEk4HKBas75;XtF&Lx+#?_(I4~Q!QE(>FK#RO(xq6U=`|ech!#2T}rr_xuV5yUp%Uzuy zUjzx#lueKJ_Li#G*NsR`B3y!qmOv|Y?^=nSGOTj4HOWSEX zjiijr<)+UD+HCq9Eucko&(%^p7+Tsvzp$_+s6D79sD-vbSa3qB+j!_pO{HJ$F>w@* zmuacvW&YVg&vUSb_N8(#TR48Q@#&8L`OAeZul`!nvJc`cbfuA%3-$f(~|T}x~0x6w}eLN2wCa!CDq zwCM64I8mtxIdRiN+Cg4oS_SvVR9tc;6`tVZ;XjYAYs>YR=Ddc&??1anevMSEtI^ez z&cUa$F{q`_IVt9VhyGdm0(}<_n%$la>Gp@(A1-TRP~zN_WG9UCrWFm`MUf=Ssyxo=+Zyn-e)g$d~7fM z>G$XxZ%Xgh7+!BY+S4IFhPJ1*(`}Ht=itrhAg12KKbP8US8n@jj*n?+L*Z4I-;X?9ksln&*7k`SO)rNZ(Z0^hN`g0Z;xhw2?NJJW%pL${wU& z#+gp}(LDMF@UWM@@7mW~+ECh5+Vok2clxtAjb-R_O`m-M+^4mtU7LR>KPUre&hF&j zSbDtT2MGu{v*J1aeQo;d3IM;fuE1k>S10}a0>E#dU*Ivkt5bfi?Dm}2bxj-V^Q%i; zo9PC+jx+A`8?sx)O)d5BSI;ROYcSKX?$mV3KezoE*QWMooZH%7cfQ>Aq4P6{zYwJ2 zkzb9jF|`rymO(9Wx2K}+wt!6C`q#RS8h_jD%64V9<+SCrY(Ue7^+`wk7^5LuXI9n} zK7mHrs6#Du(<2ocUUF@Pyvv*3U`8Va-Iul-+Id$eJ*Pj$)^%tuKY#i8nnFJHp7=Y{ zOPOkQwHi5~YV`H!PbV!>-;DlL-`z9n<@IukwOC&|5#F8jd9H0uhbWYp=8~3DkR8?@ zuXxF?k$zME8U1-gyYfmQ%I*r(9t%6=N4L@g^mWkit&kF|iP3O%fT#RI*n z>0r)$;}w4)P!>Q42jOX?&wzQJdwTK@a*Ec_IbhxgTMwwmX3&@ExsLQ_(_C8UD*dkX zLSbXx)x4&>)?CQHPW{aW>J~$LxAqGyxh-ieO)X77j%J&H8;|^;-N|jv1D$ypjUCFK z3FY94AL?#{8FIXl-isy(N~6@P{-THIj&`Vbo8WGR`wHCP*Ga#IuCHDR^)B3{aM!~P z^6#iWQSV&2G^ZJP$h-VpLt!&&Z-@RVYmPN4YjmhTExN{`tgs#5Uit%Vrwc-8F0_}r zO2LM92&serYzpPZP@@F>b88>e;*gro^c#@}y1qS^g8Z&L|8rq=>6uRcK~tdInM-Rx zj*X>_hL-yFLev8fJ=C5Q?q5nBV19ACywVR^kF{noXZE>WUi3L_d2NL*$ieo~8lb)m zH6U;gIq23Ov#wFsVt^bhZO;YjV^D(v_vViHvHmhb9r!o8qmh>!w(y<#KbTIgFQ_l5 zejoTZL&;HNOXfun@i!F0#5=@&p|pNK&4>Ie^5P%j$KC^$UTOQjb~>5%f*kBS1 z2I+Yl$4^K6hHQ_Sf8fENS3j3lP(QfLUH%yO2uLFJ4^k-ObOr;zJmCFINEny3rG7^> zCTLt%LIRxVP8C!E7udlik@yEHdX7w3v*sAxaKS%NKYPNw3G*_uGPCflhYlZ{2~P=~ z_13u0;7ulEK7CJO*36|dmnLRCeb0nUg(4;)ApviEDikW!)aCn|AI%)7?VkL<{RSV%TBUm4)TD1_4GlD<% zwpJY$`179rt9d``!f|)jTH$abb4`D(%$S5We}DKBC2jCRE0CMDVt8)_&km1Xx2DX^ zRXbPXcW~w`SBy#s{bV@UQ^ZZ1GU5JLVqGzs0adkZ@64LY#w$r$VScST+U43jYm0Y zL_HM>K~I^pi}j=^POJ^iNiBh6*ND0cgv*GkuCRME8!IdH0`rzA$;!+mxZ91GYD&QStzIVZ6S91!U{>>7YT69Bmd1QPtmfe7x;0vJs{^n>1uT<;ONitWq9IDB+RyVwHnjl$eHL42hTqHKo;A@ zz*c6#*<xxB9IK{Q)QXiZ(_NlM+1G;@2rm9ukrWS#=!YYdK>%$ zTSLYTC8g>L9C)*ZG$veu3YrTAvwHgJD#rIARs z1_moc@XW_Ubf7H3KTu>RbElM70~0`zlQ&R8%Q-rd1lDBzRIvoobavoPL!_nxs&||3mn~ ze?Unfg9HkZmMAo}>YaM7vWQK(hx=E)tU6`NjsvTpm%g2l!voyrE@|E5Ida5B^C-pu#2#T@m$@n&POuzU$+HF(TzuIC?MGe!pGQFtuoJgRuc) zlHmiyg!m+AQjl+eSji}Td-M&I1m#~ew&`8L^^=<(X&1CBpw-X=l1LFu6A$FmyQoN+ zs8eUDT`|=!))&z@sybbC++-J-;QJz?0!-f?cLx%wP)IsnWeOwC)CD3TjZD(Bm5FdG)EElQZ-9;5hM4>-DN+mSz*rcY%FOP(_49+ws zek70?C7JG*E?p2Y7rfXZamNJhgsQ3$UIZUGJ!Kqe>VLea{h6m`D~}I)GGMlH>Y#?8 zkr2X*LMcNE(8QQcXIeLDs~FDQy-zk%mz8F&Z#F_=iLAF&a#|qEy}= z;bRYpoziBsaePxzD<1;MCZCag+?~z&WRq>=eK6Yq0@xh9fD`}*xclf=CI*tn0*6dX zH@?|?-@|J&Us&?OlC_!M@9j&T_j3QbdgLLKQT)-R1^A>gGqp9@nxKR0enSwQsfRiQ`UY8G z@Z#Pe5aPQAqoX2 zY>uACA+~UTaVuyi9mo$Ev+T zra?RMiyTARRGgK21O>^ifj2jM+&q0ykO!Z4!(ZCD={;}{J|8Azlsh~R{Pvdc(M87v3jIG0qGevkr~BtBbXi|yV%emmHPXKh4qh_F#X+i>rTA8j?x+Z5<~n~ z_VN$w-(4*Br*vEP?w5CN+x_x6b2e~?IO|UAS--xDzs2xJ9#U!W+2FIJjkE=yeeq7Q zw6(qOw0>gH(zR`E>#N>fmwRg0#{8;XMW!lB0S~mvZ-+2t7hz^lYI*6?b-z7(Hm0pj zCOdxIZl@Ql2hV)`@svHQHZ@(|MlYZyf5l!r)o{#2e>h`uUA}zb!q~r)3xAtPEgt$vm1YdR!D#RCsUirMPQJ1hk2m+4s*{Ml0_0imq|y%ekRzm zCDchrhb}X@eycFiuYSIG>MIt*0)5OT7skD1oX^xuKF&!Sq|YtiHRIiB z&py!x9xhk4E~)g4bazC2#pG8%zLVW`ad!o~dDHGaw)%>9F72U4ex|88w|w74FqFue zc+>rS)VZj0n7?R(8hoz$fqDPfrmtGpxwNOe;<;xo z?knHdoa>(VGg2CLuKRgUh*uCG6S@@KmV;^p-pO4qj^iDb~gV0f|pX5IPB?r%5a zjhv_tL>-JeC}?F`RQs0@2TYsLts z^}iF&s1GA8Eq;D?-|gdf_hkM?e)Z{{2KiNw=`^P|dUK1|Jhw9l*);>W4)F2u3-D=a zogr86o-sCiw>u<*-k{P!b4>Vt*yS@ ze9y$9ffBm51pe{jBfo_aRsAkS7~z6MX6IzLu1AA3VD=ttIMaY3oay&%?3sRN2YjnJ zJ>X2g>OmE{L(uv#GjS_!fFL_g zx(MwtOr;s=VS_z$Z~8ui5k=!-sL(YZIv0<-7(%nMv)%!dz3SstpJi>rUQgDhtOHr^ zXJyabHg`)_Hscb~MAsB&_^+|w&-{GXS}rbZ?F3R$kW49`H?IID;_1^gicWxaNRK;> zMz>FF+0+twa_z3Q-nTBwfOrM-<`FUjE;k+L#+1~Ksa?}j(70vJ9FPxONP8;hy>;g{ zev;p`v;K=2P+3sAi_9RqNR?@q5otKLV7GK;&>khyVBH!qe|78S%V%1ldgZRur%k2? zn9@awNrhwLM~*}~N~>w4E<)FntIN=R5DM>#%jeJM`@*4Hovz3)!e|73a_1Uk#{`#xx zvu$}a)D_h>f#zKacBrTU>G(8YieT>4j48l0qzLOTw6>l)@%7iokMm)Cce?tx(a6ox zX6KO^zHg^Mj}$KK!y1ixlioDejK{VN9g5G@t7-15ey*DK&z;uaDxk;1r3Ocs3>COU zZHi_W6rJ&(=dKI%3Gnp|5J{C(M|Y%-EzL1Vsb6a-^kp%1FbE+6xJQmmOjN7kp9q4n zrwDaueo@iqCZ$p;4)p!6Vfz;>KmGRdsVbAH2(B0Mr@|E%$IF=3(ZjgT)6TY@fgrb1 z1=qdS(PpqySesYSU@&b|33j~Z(??){WiI`&`ph-7SHXp}K~TP%X*p*@+6LMkXhU70 zt|o6}aDx^VIT@o$_DQ(~2T2FIUO?>LkJ9;IIE-vQbO;ie|8)!dr|KW>Yzp(G6Q!n8S zPB zrzV#f(ks+4m%^%Ii&FKa*#gOeWOaAR5;IHbK{}gj}0`sr35v z8%@$L?)vgv6`Tcbt+KLKqF;xvih%R~dI1vH4x!iYr7f!%b;b z_O7*6>vnCd%HPG&rwB{LsXnE0gN~=iQX&@n`E-%@Q_mQ?8%P-11#XOjf!gAFdOqH_ zWmAKTRM>xm{+4cP>W772ZU1ol*M%Q!M|vUjYY!?j2K{*Kf#j3hKiH1-QMWz|1MUY~ipGNw=?%ve* z3s2;}o9lhgfK`!{?-w0j_SH;>0VwZPzOVG$xKvyP_@{C^)2{~{Py2%X-!7Lxl$#FBMY8{S(_>59BPGkE#LtNW=v{GfcsmO}V|Q?;RF-O2TPHlRIT z9UB!N6RU}j)9J7l!nSILba%kCF16=D(85#e-dpd@&%#&!G1;4+Grit=(3>CBk3he! zp~IsWjX#yMhtrR~ErG5er?0EkHM6V1V5T#cnGLw8YcT9u`|ZZk!f#*xu<*NAKY9J+ zi@S14qbWU=*y;>&_G=Av4RWH+Y+YagC7K8nV+|*BQ0qG7>SY6`U(*8H>k)l7RF*B#XixZSEx>qDF(e$L< z#OJZO&^i6WkWpQDoo{Xy3Z;@DU)1--<4&#Jl|$+F`L8X0`o&c*zOv%A6;HniGb*s| zE(RI!Z_wYhi065G@bLZminNzJc=)F6EkWM;j`LfFt+YW8^Y#fOgZv6?wM0-|EJ%j0 z;Y=pfkCB5GB%jWEI}dM^PY_i$>*`lkF03E$*w&;!YX3v1}rtpNE1GL*47=W<$d8}r7~&!|W52sr}=`sBeJIY72Z_BgDZV@u&} z2-U*umlo!~v}O$PalqqneSCc%_g@yo<5D_PfOSGcL(iUSt_7?qb#4FQjr4RZZ`itd z%9mC=4Ocmdzp(@U)*2c0Z08^p4wP=8TMSDLH%K2!~sJ&YM@!4^S}qHsFp6*n0wWJ?I#^raGhk39$3N9HbP> zFJHQNjdKaw+5`fna)|E9)L#pEGilP2CEvOx!?q6Ipzr0v%iCcuV-YTBpzq_9o}rV0 z8tN{d|ISi@F?g!KIZ%ps?>Gf@PoPha(9wP32Si3TLb;ejca$1*C&#_J4(mR=u+|zi zC?mNgPc9!ibVgbMx49HIm|pL0$@3WKjOEi}#2HG{&Vk6}s0P=#u_->vkC49n(qw9E zJbxaQgpU*3Cb*>7n_Ilt&yVlV@#$$Qgq>@z;x16WKES60R(+5}N2AZTw)(X$ZmobP zVC2Gh&y#zFT%Z^SXJEb%##@&|&!3Ox48&gqV+9zqAwL*Bk46ZNCC<|?XxaFjoY2rq zmntee{mW*0y1Ka@K%Y}fEA)7AJ1kVQ+z9l*0g5$E=?>V$vqLvWSE|F1jV59emQDDg z{MhMgh8YF(*U)$ULQ{`}kd&m|n=fA$3UhMCmmyEh_07lHAX?Ck8e|7?Mq+H)S>w=+ zIOEH3wCLdnxi_1?{_5+m%Rc|Y0wV<4P+D#%rwzIWUAckRKh#0~K2}~`Nx!E*RG)_T zdHMt5fe7`~r29z+At4@ILdXX{jYcu=K^iW0yO4g23pWwh=Q!}(HL z*a~x%l+G?x+Q09ixL`EsOka#_2okns=D=1dqtT!>kN>n;O6SoFkh(LVA21m}6RvlA zbm2eme@_WegQK5NG7qPLvT&~zRGLBx`c4gP!ou(^P>DMF)pp_hVV1J<^8D8e{J;I* z66$oR+%rWzu*_$LdPteilO^imWj<-@JK%vJsX7sCCF*<1e1>xrhQkT!Dd1Js>oI^= zq#OyF3!6ylgh^aL30!zW_$sC;CEW~vG!>&2u5|~}5yx}r9fi-wm+^V z8McPNhauXp4#KDI@JF%YjAD&X0DkTCquy*|mj{J)H){o)h&odDq!%-oIJLIy|FHKa z@KF@$|8VzYW-^)F7lb2WCIK8+F2UhY7{VD;PB{WX2xm?RBj!JElDq_`$(|axzQI~(-+9QbRi>_Gx1}iW_V}G-blgn^b%|sL(H=64pRi> zg4xg!F^#q?-YMq_Wl6dz2wOF{Gr&F|5#+|4$jfx*zzQ$l;OXs}wT~Vrt(cbSSzvgh zguWe-c>;mDNwnex20a91>{z(}NRZy*03No>fs$BNQCY{r6?Qe2`m0gc3QPev7)|Vs zroldEQx9G9c+c>YU45j9!=k2;6g=N7F^)WF8(fH3x3vw&me>Yc|H4q4r7#q0vxm$; z2w66#ZF#1|XN4{Z4btom#XPqyf@6$e7z2ROSHXz54aN|TF_K{n1V*@mG2}KFk8+Gr z3}X;5`Y9NXHjYu^F9a9@4FOa9!vn$tF)_mv*2dPU(74L+T%TxL*FxiJI3gGH#(v43 zS-tH6U0k8DHM}rLy&L~LS#4~c75HwA!;fI_BMNOSQEhBp6!?c4habt{M;6*xlG@lF zRN&2x!;fO{qp+VkDmTmB!iCeR6lb$^ls-TwmCxlL>!{GCQ!RpO7?LK3q53ZW*oO)> zE190fQk$8FG7Ajl()bym#Rby@g0c7S;s&wcrV7%c*ho)I_8B~ZlzS^AnFeJs$d1Y*~vC#IH2MbkKUDS0O10A|OfjA_SEviV&l-(C2f!)DOt zep&(h+zGg=gM!c?si7X{V^`r04Fl|nr`D>1gko%&erUmo9?^DR3szD-6Vq&XM(3BP z>DwOZC6q>(M32%D^cP8g(fG>*snc0lN$Fw{O5mpL2kkoCR50XG;^E?^*JwT6yH-}b1gRG<=D(u<}7^Qr0!A{q+YbI%lBiVN^Gvh(KcOi97MEwjtKFKudmwx8%pQ4yi@Vu|p(ftoNkO2SQJw3_%Bi9O*9XHqK`qR`Wz- zEV2o0`Yhb2O|SFF@~}>u4r*xAL8ES)4*Jxls|DgoZMr{mQ2YF09B-c|#!>rxswRUY zk)%0DQf#|+3+)=T!kP%%6NMu(%AP31!c$Ggd%U?$F2v?-pFe^^fl$^+a}Lx{f*jKuyk)CqUmdu;O`K&pdh2}7pHHWPd5Yl)fox(BF8OCg2#3>jlx4}r|7#R#B z2^jGTM(S-a(l|yY!3bMi#@E3yeesV_xGJB~8U9V$*(2j9dg^w$ZHl zjJAzut!Mqld_HSD=NH;o^22OnWatTvLZ>t6^g0LmqtM2Z9cCLR zLr-iJI+Hn!)%c<^rS|ivlw(1HTv^;87VZzQ)y?7zTB>($Wxn-LY+=^fVKH@ z5Xvw$`6&0S;G)TIp2(a02NFPu3onYA`0ry1Og@mJJsfTSc)F>AbQEwsHmEnOyKU0GxvV>yo}6&?s+JaFec;NU#qaN?0F^B4;r zPjViqg+vxSSoTKI9)Mg{<2a9r3J(M@9=LNJaBv=QIPpl6d5i;(iJV7TA&~_SRw$y- z#K=4%Igd#S4+JnCxN{zGa2{|t@t7y`hy;&GoX5OEBHKK%MA{T5vD}wtB%%x;mySzA z<9L@#cj|KKPF*hD)%-5wn4#VBK1SC8`%JEu;C)K3w*b9fuyHZEy};s&jtZeWjJ!zC z&Bivm>I$LsV;F6zefspc)5D45Edy$UzB}&pZ~^vMYJ)BxcX}v?37Og;dxbFgqL@)| z^phm&+R<%mEJ9&k5{3gBi%1T#jG!Wi4h|P`_`snihXD=^Il|%4lEVszD;xzuZ$$*{ zxR^<>g1VG?s1mb9(W)hVJq_-h9p+ z$BR+_$B$Wry#|Bj^m_)E;Gh26e--_%-rJeaZ zQGv<*2D~F+$l~)yu0>eX>xXCs>^=>)5!j0Q^G8aIX$NiF&@FYeZRCB_3#^Y?hdydG z>!T8r5z=^HyPe@Z!|}E-y!F6)O2K>PHh3>Fyk|MyR)+U9@YX1J&)x=a2g7@g*PEGVj1s+{U(mby0XzTFm;W25(9)uukfQ zLfdwZ#uD7dwopN{HjcK1p=~L&y~NR2dfV6*DQG#3qitnqTMKPFI2ucC8(X%5wxn^i z7a7`%)RVp-zdo&)OXa%G>k~>hb)_i1=~Ue7ygs3{QeTP^uDm|YNa20yg5<&#b6F`d zahVyZ>#I(p9(6&Xy&rni#dMQrgC7iF~JzAW8u)*9D0cYjR1l!VG;La5jU{6J&!pocAhMD@M4ib zE)|$OSrp*KI3Wkfi}=8ck>kXgb1C@So-Zsgc%n(R>$)(?f1S-JH|Od0w{3C`2OESF zo8~;F{LXSunW=a!gOFhzRF^))AW=b%z6YlH>;?cH06>f|M{YYDf z!VQtm>=x`fa$LGG6T6AW%|0d#bw;FkO3h|UUWwB9l#(u_9pt%1P*rLwHw%K>WPivUD)_D>-!%e0ciRC;^j#`}MF_jOGgolYmkVy-rLyMv)ottAfx68KVp zzb#YEfqM&uf!=kBqUgSoCCG|^4HSUK>u$G}2x{$3L3C$qmk1i7Be=aNXs(O8TONqK zR{TZKS5>&@5f4GTjL78@xz&R9x|^ol!|j$;a3vbQXe&6GRV;oWF6hgxf{J;2leQ#@ zMu5KuXfG8s+6qEpNrI#(s%iuhjv8qdb;||U;3`4ToOipmLV?8#qW5 z-@8UacDu<*ioqXQMWO8~IkipNf`r@6+DreiD8745TqUT*D`N1+fDK*E^C_qWqK8FF zf(s^#@IgTk9~Z^9e`S)@5eY&#Y8BNXBzcyJ%Y~MKK=S`d5CSd>f*&r=3a?-EUkZMx zCX^+N%cnqUPDm`Bxk6Jya^~dsCsF+9Je3m{Kk&;D+;mkxiS0m2_+b^vCPxS{;>qLJ z+DreSC?2?kOaULT%Mmoz5-LSXltu{rr&VwQt&m|h@K$0-{9%drvNUm!YYWGv$=u~WjiGm3_1PP zg7?4=u&%CL7$S;arikKG%LpOYDvI-f<&E6Y$B5#pouWAL6f4eZ#EFWM9yo)Mm+HUM zlMXq0c7`Z!&IEeOCaV}UKTy0SUUn19fxhWkQ5=6(K%qpEAi{wkEEjacMe)-NQCz+b z7_+wkW2y-l|7t0o%M!(5ZCmB_i`z}4)a|BKcz~tS<pY3wIf^*_SY$-06k4vu30Z=jOVG1$Q1%ZW{KhkO3*Y>+>$7Y8#jyMj7wjlwxYKhQXdlSu+$%eF3l;cG4 zxnxmX1JO;sv{Z0G5p`WDuqup#VmyVaf;*a@93hZOBCl0c8Y#k5V-5zbq`sWh1H_^RDMx6A z(oF>yos>I?_SY&D#+xdj^tYmvy@yVL(g9@Dd*HD~pNUKZOx6#fL#Bojc&Z!d%Z60v zKp7rM8h3WN()5br6(k!7sAA|ORrZ^!1)&5mqmUC69jo92qP(s_kVv%3z6@U*k;igR zZxw`3fiM*Hm<2UEA4ZN>7iNgBhc)BkJJaw#q7aP|Jo2@D+3> zsA<%)4q9Ih!X_Jr4nDa;&{Zn9dMjF`<-^21R9hyZhFz)|7i<(5f21o%@C{iHxYQ}) zHYf-bQ-gql>Pl@m5q?^ZK~t1@eR*5g8*Un^9M!m2+cm%Fzg@|ri?&f;j$HCaS!&8< zu|b^ur1-7{>m&;MiTekMucJom8C}W;eL4DA5<(M}wr9kJkBhshche6R-xx0zph}~b zQvXPUE(~hCF=h!uEIKa}Q(ZJwL5TE^6<*c$oBD4dZPtzQUJU&>+B*Ud1bE0M@zIdw ztD6G+Ck>V?_Su8#Dv#dK2{AClfK{K&TpN;yUd`u+;d?HjTJbhTi3H0!rO*a2fe0aa zVsW7-h+orIyHtIy zsuXR|9zvO$4q;+ia&lH?Qd+7xDZ`wZmZqPbG;4Oa5S<>An3xn-*K5VppQ$+%$5VlSsRd&keQw~FD*GKLk_O>s3jX0GcPGK zCOKS~9G8@knwgZ5nZeScPfA^Y=Y)83YF1owLQJ}TUfRNhbo0FAnAA)Vye)WQRtBV2 z4|=FMF)2L(gfq+;nK9`gtItSFNmw{LAw3~n7^?6vGah=zg8|Qui8sgSQxcLh<5}{f z6XIs4rX{D%qGYC8GW9X>3u02^5X*$rw5(aP^_gkr*sP@Fcys3Lm`r3BG2oyI#Jse5 zS;;XhXEW3E&cHQUl9-g5lrbA|Oi!2>lTEpnjV#ggi~~vYyo9uQ$qD9|^aOn-(iLw; zh6ALRpf}U;L`+J8`N;(d=~#3ph6jar44)b<$j8F)P2q2ae;)ozxUnC3jp#SK-}C(r z_xrV9^Zq^hD^P#j|9>HY@c&pUR2o;E-re299oCIpHLBmnN3C=B^6?L7(zIz%)22-V z{C&LKb?SR1p>lQi_HWv}Wr!g(EUa}{Sg0YSW%H)~-tMmV5(|~i)30fZR-tW7?K^bp z+__8V&Ye26H?;|E)uO4Nr|xbPL|0G$py1H9?K?gAQ1_k>Kk`WLM;>{&XZMF5?9{$( zXmF6frz`rE+aGFo-=@J~rj8Gqd-d+yf8d~qh#?UXg9i5R+q;+f!H%Y|;HJLrcaVdt zS73`!Q^#&Sd-oeO95+jP&{QQj?PsVy8_WKYCb1c(1PQ!&>+^Bp?F4b%%!@8SvPs$f)UYvs310 zE?k_mBzI}CNDQTBPDT0)Y#!fAgsAhom^0R1sU5D`nc$rqP3K+%hK`Mnott6J zTmSslov-iO^X~f}>_2eu!2S>3e|OKW*LQAxetn)bV{UBp*r5Y@b#BwbwrQ3@#nYp?k_5lj(vIJtFOO0@#Qh8q-g)%xBk3i z^M;ky^rRURM@97RY6|wpdjlOR&!Di5J^K%foSHaqao*FLcfRrVzK@Q4`sLT(oH~2% z`*UYcee?B~pC0*W-`j8O-28Oj;(3WvBZu|x*)c3gj)1FQu&JA6$mpoJl!eRJ=kIvq zoezpW`QqfM?=N1ueC6tu%a<;Gf9m8HpA>!Y&Ko=O*Dqg~5*Iakh^3n;*pExVy=iF2 zo&$!DpPrPlWX<#2|NQm`#nSO_&i#1h`pwE)Rktc{Ucd6=xo?h3#UH%==k3q0S(1@7 zef;nNJv)Xr#d`+c_`O@SeX#eC(Uap+v-37?EqH5Rk#yp_3qSu_iA9|3uvh;2^M&tD zNJabJD%iR)FFQ4E^5`MGA8gygo63OBzg2s4zoC)SW@qHC&EL6e??;~;|L%t?Hx+Cm zVZV9hhwqMm^3mR1JM-7(X3U-zIkca-eJdtGM88w7K_e%|rYy?a_~PsD>_76wHy5r{ zaMm^d6<02N^Tm<<@4Wuv#=J!-u@grQ>eY!QK;_lE4Wd6LI$?g!noT=*y;t<<$#Xy7 ztU**9H-A2N^3$UCcJ17>CTD&^^cW-}mpz&#GdZ_Q?k<*egm#yDYuxEeCm#2RG z)j9Hi|KSs6CNIo;X4@O@ek6VU zJxnP!JSwkz|F!hdyKiiJCU0T#%n8H$cW)o!?<(j53>|t7962dAb@A%wckFt<_}DiW zuQy~58D78m&9UP5ckOt7_2SgnNh1gL>|hAc3Hm0XogN-EDk^?n&YJvJ-u&Rmm!~c@ zOg%;C=A~0#9{J$SSMt~7%!`j2HR$0^p-uFHd(*Jak3@`y_?E2Q{OX?lM^Bu++*tIn zq~r406G!*&d3E#JB@p1~h(|hyp#&-TiRroPUMP6`Kl2tb6=Gnc)Q?* zb-C$@HTWJut-B!mrp(G%x_--R?;QN(>+i3U!H$MU)z$C6{^a00uWebsG-K8jWMG%p zK_2(bUy1*}oBsQi|NZ9w{g%J`E&umh|B!+ARsZk1{kh-vj}mY{?XPgZ?f?DuKak*k z^?&F9@2~$A?z8{L7t#A0e+c(E{=r9)`x}4ZThINC|L~3G{>GoeeU5)I47$JZw}9D= z`x^gaC~|-AA2b%azxN-c;r`yg5QY1D{{sQx{@y={f^c8&zl?%#kMG|X9Tx5BxeHDh zqO(pIA}fSct>7h82$L7=xp2_XwfK15Z4$>sbrPn~UT$<{E}J7p3?#K9T|{#$?VIR_ z-4Z=4;qMs^1*k3IdkufPD3)A=_SxL9Wa1+I)Qa{uIu5P#3RU~}4Xv{G8Co2x$HJmH zJ-2kQ$wi77bBt}h_&M8p@yJCL?G>kNQzMuHVY<{83YMOBKa(3#&$fs6)G_Q&u^Ssv zSxYNhqFMR=U@F95Fc^)-&`^8=Aw$q@+O%ogw(SECJYX`J+O=!f zzJ2>Y{pn9wl+v+d$4;H_nWJ-;E?pjc@WHNKyLRi=4MrRBjj((7?mc?+=-IPpuU@?# zei)xJ9)UUSK7IOFESA1~`-X>y_v_cMfB*gi1`L2%q(OrQ4IVr=0^ci!40-g?M<09a zvBw{OeCW`j!-fqTK79Cy5hGw`Wz?uqPdxF&Xnd0xGX@rQ#*G^n85uc#{P+nICOrA% zlM^RSoHS`tR8-XD$&;h;-C@dKCw^yxEZ%$PZIW=u>>Y;0^?TwHv7d_qD( zVq)T~S+i!(o}HAGG-uA7xpU_xCnu+*q@<>%rlqCLn>TO%{Q2qW=@}UrnVFecSy>Af zELga3;i5&0va_?Xq8#R}a&mH(ELoD9o4a)B(q+q*EnmJIiivr7c`H}0T(xS|>eZ{C zdg`e)Yu2n?yLR2Wb?eu!hlRrp8#Zj*xbc~1o_Y4!XPxAyGW^Y+_szw^#JfBW0t-hKDozyJO3 zd-v{r@4fflfB*e``}TeC!3Q6H_~HKj`wtvAaF7;n9{T8`j|vM5i;9Yhi;F-0_~XNe z55txdtTY`xdbG5(^pj6MktFHUPe1((c9_UG&#^DQz;e%jeEH><$B!RBapJ^RUw!rU z*I%DJdGeqC{O7;^^{;Qf`R3bizy0pJ?@paMb^7$_GiT16J$v@txpUut|NZ&%=Pz8i z@WT&3z^vkrKmJ%&R(9#qrJsKK>F1w+zI^%el`B`SUcGwl+O=PP`Q`fc>%ac`>x~;X z%FD}d-n>~+QBhf0X|vg|ezvNrs=B(`Zl|{^s>`Uf=kXE3_n@PhZ(pHVSmtuJC1u^4 z;!6;6NQPb2#S1!|_UbOK#sg#Bh6ky<9A_-9r{^Yzg;MAgz7!sBi&=chF9;6 zutNVH2{)-5;o*%)LW%i3QmiKeMp21Wz56{Z#5!+W5H1i#rJa`j>(KPtX=h#Zx56wcqXtfT7ivR;p_5}SIFlOOM%H;gVT z>-R)hVRw&&sjNHEy}z>Fm8`XfKyrZ}NYHt5eAtKdqhya#H3 zwCm2zkW=$@n+$S-xJ@Rp2I+sdU0*xRS)h$|X!lk+|DSKyOQ=rc1>Trayc=(oXy*Br zu`tcxO8egq4stt>6;zT>?=$@gbS?n1t)bbU3UsBjJwhbuz<66~@rA3UJtAyr#n{`v z$D3X=BzM)qvU$bEG;9^)@-;)5?ytzWy_Fqb9}-DM%+? zArFA(u~6MDQ3K^Trgl%dULK_M#mJC?7?i*`DWHBfX^*`KcArX>wIuB)iB zLv@cxGlCi@dO<%hhbgjhI?(%4*%>~ASt+=3UT)Au))ENlK*JxAP}#Rbxt|e$5+Sib zik=~KMk7aX2M|jXk0`M9#i1%@O*UEV`q1+8J| zkIKSA;n0`sup~nZg;*+9z;afPwc=ABGF$wG6wRxkc#1#`6ny1E1w0UP1s2C8f*<7$Db!LaC0qmnl2l|xQImsDv?~O6zO>^e5>JYV#EWI81|S(yfs zz+=7&1xytD*HIvYK;AJLRunlbP+@|C>NOP?e`GG{Ujr1io8T!zEYB&w5J}M;nwS7Z zmXnG%pf?aX$Rv-6kg{1IvIry9Sv6D6MnYxgU_jcVq{~X$%YcFKAbLTEwJ&%=wE2pX z)vRPa!&F1{Nqa{S~g_bMyR)N5Eb)h{BS!pRp(B{-=CleE}0(~n3Ue5GX z0Rcpwdn`6segNtWR;l=Tf-4FQXo}##auDkCh?V9f;t9y*T!)xS3M;oci>Y1Or!-DFir)60{hEt#HwQi6mj|2Q}8Tpb2mr1)o4#;X+Fz+GDlLS*2pguOacQvm3;$O zD_$b_2F`;DKP`=DiKQ+75WT4pRT_Af4%Q##3BoO_=-ZT5ve43qE?CuaR&>)KlFq!B z%bf+98i!R3Xyvq;Lw`c7MqEh%M4r}!Z4v|*tLSHV2+Jad3j(cD`3e}Ci@X^?idd>p z_=i;pUUpfOw2H&^M@oK8ud|f3D{{tD4nUh9>GJd+gc#G}8oDpQqKOodM`I-PZ`hz8ukWTpCt4DT`*-<%k}WDaKUJNy>_|COf}s?-@aA|;LB#@xI=OMqq1LV-G{ucX1U-&^&G8%3)+sF22Gd` z7BAEKC9GrG0IY*QqM9HLpe|m)LLC}Dv35wPUMUF37@s$>UTF#n!zzk@6`-+9gQ_3Y z>Irx`TXsdQCQHI1U~Hy^O0-}J`RlU>7?2Cq9dO_cU7mo|UevHcavG!?lK0tW6WHn> zT2tpqNVL8X%JkIEt)w2FmdQOW=mL?m`aM`$fR;sWE71Ghq)=*HAWC`Yhxn=Nt!!37 z>-rT-qLn&E$}3zt^gS2{VEl#g8nv$8A{IDOzT8BRD+LiX#93}NP=cs@l~Y>SuoI*d zN~EFP*fBXFIUz37Y@VE)hX3Do^zUWHB#wO4qK=J8HTNGda8RvJBd!7WfjjU%a0lH7 zuAGdCv_fG(_rZ;%%527T+aJe&K?02mzfsTOL!+Xj#*BDkq}e<&D(cCoMuBeQIU&uQ zK}%dx5>nFAvu^_g@A!mF)S`s=aC7u*EK#}b5r?V~n_!NM$;!a`iP+mxj4{W@q@b9^ zo1>l_Z%#|U9l$Xsh1^gGX@(&h}fHWe* z)~dL7gsn~SUIX@=%_wVCYzZj~qkVEii={*9(jyrq9Hzfu!m>W@A5q6AC`>z`jz?J534MJas2H3F z+a_k|c(*g>2M(i{Oo?w^VDhU=EX+Ts?2NBLXm-BBv;Bzn5$y?3%6sTo1zsYgz1=Q) zmHfxz2iZKDuGNDJivb?Tq%)=^BU9#KO&T47QmF(Ujj#stsVj=QPhsal^sjY!?3H;a zgq?Yy2$2=C5fQe}i`H{8*EMLsXOp3d0_c{R!5PLi0 z!99`IJ@)Et?q745&BK#pGBP;eRC&Frc|=U6j7y`}0gp%YH=9RgrN$Fn4J!N^JBDHD zWu`eYCN-Xj0{Q{mq7rBYES8qWBs1>hH#{vRB_TbIc`0yXQsc8S(1#P4;@1e1(O8FT zmY3ny&}#&aFW^mJF}VZ1Kf2uijs&O$*lyCIO^W8N)Hstjn!XF;?Bfht-+7CqsO}|D z^~!hKZJbyfnr@7uKdzB@o;JA;g7-rPRoFwY_~-%UL>(a5Gn<|G1{HF|#d6>HO%}oU zco3RU-_Au9g7jEtt-eA)&#`io^w(~_uWynvf^6C71r`;Luq`g8AoP%09fK)lFr(lr zO;YfFBtNifKQ0;(Xdg32`uO27Q5SDj2n#~9LTRpsP%AXRxTw*(RJejy=X}B$Rzx@> zihzSQg-F~J@(6}JiXo5wt;lm2@>qr(`CF0K5wdMbu~d536n@4)=iLja_hwMNs4sDD zadWa7Yb)>2CQ^gQdjr;bTb7&-*NW(Hq*05dtVPmWi_qEZM!~A-Z=_L+Y|-ciF7sZX zL~C5AePzD(aJqocf!!8q&u8EVcf(~kvJYmu@ZG`bg0s%EbC|PRh7+;+?%%m+_jqP( z18dJ{{hO=xceu8L23`0{&8~3V@AWzeSh}XjSAX2;GTi$mh9XUL;iI>xb>Om-+W|K& zyTes0*x|-yw~I)$#?^rfFs_0FZd`zI1&pi14!4~?_NcKZx2OY*4s>)5hgxUH9WXkF z9d5foD@fS|Q$}w16yydtH`sM>v*W_1Z*C4;cDqV1K(!yV^q{4$##M!9!J*cJCU&_} z>#H5`bHL9IKU~;!SYK_2AK_L57ni*nxVWmS1 z_;|qI1O6UJmxo|?^#ENDqzluiYEQs;V*1gu8dnwEfb|5dr`-WRTvZNCw*nUO@+2I@ z#k0x|ziQy(vg4}8RaFh#D!^3TDV)wl!)o^c^Aut;ql;$;o^e&<5`fF`^}w$mABDey zukddSAM_gFd!U_Zcsa<=;o;)IMdAO>v)ze?o#@y>2bUd}Li0ZlCAfGi3T*zm}lW6|uVf5%98eR_abLg=pB@g>|p6yOF>_o>7dbsSk zh$qqf&%<~Iz%U>#JvOCr!}Z@jNUg<1jqU|T&B{g0<6usLW?Z0}u(5W+L78tQ2-q}o ztH5Lho4k={Ci7?}gyy~$I517Hlfn^^hFvZjGc87wKTKr+6I0;tCz9fdKzqQmi6qLK z^=$qeGxlVt46v93rKuvOri2t>2C1AIo`R|iBD_M-F|84r;Kwu~nx$irvKO6M*?u6!%}E zc~Z>$9px$mh-^2Bm7cK(gkajFfd708ohoA{y84Aq%^&|NIW3yIg6a`CPAx$ zrsYs-WLsla!41kCjF%qMlKwf{MKSdfO_tJB?|SjWUYTbZFDOM|E^xJ=C$$l8QCDUB z(V8QAEyO(b+?#AR9a-_URTP_Ez+VT6)fbi#O9Xeq0T1!YL$}g^ls8orcU^f1Q`F5I z;tyqj_s5^c^Z=$?i5nGDW>-}fmH2>oeiiUipb_xmC1sZVTi_Y+r)dpkf&(0HmEb|V z5J9(!cH%kACwt9?X21)VXwsUd-hTm-JN`Tk9g#i~3M&T7g-*ZfV4;OglMI$xISftkTe%4ov-GIn#5FxBkL@blvt}JdcyE%lbOh% zcX5?oO6QhG<0*BUb3|PX%V0zwsxVXxc~hklJz;&c$y8)f(Zev%$x0uYAEng22_{on z{;tJ1n{<+b#ilmIl~PbI704Dh2ijn@iL#cZVg(EdE*08hMthZPn-iJw)g{c*=YZ&! zG-DqaB8va00!96os86I@sdlYcS)NID0|kz1<0fodtqiZaHJ^a{}a$* zwb0OaL`taCsat;|wyU0H6}D;8y_ji~H+w?N3JXd1 zPlvt+#usH8=uQEUpB{_g^cn(;ysYv<%0jFI`GqrP)nl- zNCIkvG-RS&W;I}w;6vpAs-iR~i|^nuEe9>BFF}cUO^mB?BSVA0$)m zoEbqRk+eOb+5^!+Wthy8lg15E1XCniWq*-Wbr4J`f)=zK^c<;7fd=(aOkbN|7zJp$ z5eyQ>SRf~eBNTf`5r>q&mSOA+;xauNX5op&gdso@Y_QEVsh0}=Hhc;rSSmLxVqnDV zeWI@;%}I&`Dj}0Nc#}d9QUh_z8o4z=$Y9E4KA>X!n5>{uOmfn2)i8pQtL#pSIhtK! zPSpk>6#eJPd%fb#HP2X`$)^A&V8o24jzW2&S<+;UB+`T53!Umvtwo@9ygqm2Iv-jVO~Z>6p7g3z$8ik!6httfQhA!6;WzV?}C} zp$35?n#_nWX&=*Io?8t@pGB1sQAH7>(JN`Rk-cP+2P<{Z>>|1>JG}VFnVP3j=&8@5 za|PIXuII`I*pv`d4va;PkY!({4XmzYofRONrXRH8ctlyn#Be+kz1mOZWS3q8969IZ zxU+H!tMa73P0HLPQ(?9!{vAfep)=}=p8q{q>}5!RC9OZfgCXS#%~?ipoVgfFkdEa# zQGAuGQA5KLk)YlM4Gnf7V7ZFE2lP`hexUvu0~Ub74mDb6w4GES(SQK98B-UB*yu|a z884^4_7z8=sN?%zoC=Uf6E$@9KlVFIG~Z$*F_8_Apk0sK*A`XECj}O z&yT|k0EQSa_e(D+7;Qq~nKeGh6riyrKu=d}{i6Zk=f*Se*yS@3X;#p4g$HFmNC!CC}lJGBRD;L)2EswHw9ODTW@MPt#kt=L0+X)Tz# zi&^Q@Q5Oi>ok7d}9>Jqgkl{^$-$quN-No3I;~)fPLY$EFK%z)e^T+kr(Xygb6+J`6 z^ZM!=sGqRaj1bL9sy0?y;y|Nyru)oZGw~|SQ-e2mU6sDI_%DoCZ@|d-zz;BJAyC+z zrW#C%Mm0sYLR}KIhp-qkR0&u(cJ0H^F6b%{zp}TiqB@LTjB~+imEcLhBr&RL)YiD_ z@FoK;FCn4yvK;cURTP?`W5#|KvUOxv;OJ>H2_y$?F4jR%L&^$D$Wbdy22s)F7wwio z%_?ilnBFj8VFnrnw&|xJ?29(b4cUr{Oj2c?4=Gmy3R`SIerQJVx?hDAJ94TJEo$dQ z9R?N%$9p&b900}a0F*bh5Fo_c`mdYB;V4qr8GDsJf1V?SU7iBK9SWh{_#&Y1wKh59;oaHS5k#PDd!$ky| zSl`2$QbNF!Ej%HbRNc{wQWe$!PJr$=WTp^A$pH|PB37Zuxy>?)R&oeGLzH@Z6$W;U z0A$VTIoeMbs=$0D1IFCE)Sx8dV+rCvN(GxKN|@aU_7Me z;NfDOgJv0Tt>9f1 zhsPrit^LQY&Ft(AtXfLkMd;4l>Zh+heEsnH&x)Ls`{F6e$$e@B#T@6(Ep{Bp=CNCB z-GAs%jhqyD-Eyrx7eI#fD4Zk zuCUuu^-b?h8GCVdxjGl;6qtuOeHu1sa9FL1-1vP86}`pIGN$w#I>e!sf9LRA0&qC{ z)OGjm+p1MvpSn+X#^!VAbusEb-3@=;+I4GP$v6`oT5m6$9v-mCDO*y>ONrt$E@4vpimW00fxHsOys5*!m9kK$|`f0bjE<0*$8XXD{z2>;Zv z)bV}&aFUZ!I{5wfkQ$P&v}*!1dpaZd@gcqs0;P>Yx1o*QcMQQR4!7C+_&LGTSw z+~C_paf5G=;s#iA#SOkK6*u^XC~ojIC~oi#Rovj)T5*GKTjmBL_?i?q__kNv;M+lQ zgKsCr4Zd9zH_*E(Zt#6baf5Gn#SOka6*u@k%-jF~-`e|!cC4z9J z&krrB3jb}~W9PdLE>&-wUFMd z;aMV;JW#T`EWB9Cn=0Ly4xJ@2qqp>_D7`pUn%cWoJ*nGNDSWCV%&>){{9k0Ha<_In zcKjreo-;_N*50XRo&I1lpqF8HF?eTRXk~9@>T;o(y_uFyyzkLLJNBfQy6w+ zQJPJh5OlmK;UupL?FaJh%$zl}#*T_;=my#LSD3HxvzZ`m>+Kr;Fq z!x|A`|3|A6ro>ajkzG3H=<0;hba*fW9~Z26w7~oi41#f+oBimoooy~Ipa7v&z(BG$nu+?r^yy#LSXiTiNTX5}?P zpPpEoz0(tsz0(tU_I`d8E|$HjFMx9|C~tFv` zr?h-7r^Rs;E|wPYi_a6aLXcLg4pNc6cJ@Wl?qbs0H70kg((wo{v4mKIbe8tkAQww_ zYXruD7hJ3nSWuJLAKKt0FqMlv2JE+PRa9KRe);kbKb$`O_1B+&{xR8xb#>M2y}bhh zTC@laZQs6Y*WMTHw)cw2hE8c`YXmf+OM6`Kw%P-Fsw@FmZDagLVza@ zb=6U)OgcnLjea;77JJSc&(CN!+*lmbZ15S%o@7eRT(YxEc5ROVi`neu=6IZNn~spH zuE`U-z3=Esgwni!Lvf`uh~1QcuOf5-jf|358( z27-6;__xY4Z4HMN%a%;J6cfGFgoSJ`KQqc@QZg&-X0~A*+bzzFrB&RF05$?t3Zzps z?#EfD+{@+9sod9;-P$rqUbk7Zbw3gLPv_$w^tlA^m4!yBD(socmQlG_#1h*>cy(0m zE+HQuQ&&r1*@MM4GZu*Y;X_N;VvDA%Te0uj6lq`gAlb)9i7+=aS0Rzb+wcgs+27XxEipU)V zF}{Gbd(8sUrm0v!`lnQU*dd4`_&Q^Iu$Zl!6?yXMD0J8OqAJPWk-i{cVN0Eh z3Tl17#-0^8y8reAdaS4u{QB+Kjbr>C^y<@4o`1s~`~P{|!=(kx9WP9?dED(%-2)8K z=olave$UH8g9*|`ED#Y!2kCzwIHaSFRT(%-_M1Vsqg3N0{r{Av?|!6k}vE|s%`Be=$tPTo`1_V z9p&V|b{=lpWox^2s*#VC913*DyPdsd(h`j zmk+}4bam7_0{&Z9cksH~h06bbdfegVVOSQ7G1W7q#to$10m&R4vnZj)tVN%J{U7K9 z=&0di6dd*1-{^#x zj!HTsTuRq(vjL4+(_*5E;Fw2s}~J=WUpv7JPEQ9p#SuT zg9rY2&ypoTGc@eTDEpuY)_K}ln!wP&$@X}q+E=u@tS<)4B}LNcK&eX;X>72R+fA!7 zK9>fYGbMJ>5GV&+?uuFJzQqJEt6Pa(W$>5&6evXm6Mikc3oQPqjDhoj%mPGX>uk6I zC-n+0!RN!4N-*~#AfmG+kWtkbnkzmL!3yN=vV%p^=?6=~OKdFq&80v0M^qK2(t8F( z83X^1iYUH*Qkwxhl*K}Nh()%k^vi%o5nK$-6+Y6|0R;wkt!VUIL{aY2gyP#=3L97h z@NQGPqi9M$k`s~D7(Aq*HKB+fWE*1psHniCmX>rZkf6}rZ)=aQU^?He137GU}|SDi;Ho?VthSr$W-GDrqvkF&uWyK z*5GbDT13{9Bx6vC-PO?BR#;SUqi9LTYX_auCW6s~Ofa%LOl}btt+C0JM!D(?KDAiL z#?m54Qfl430A`!gx@t9&fQ*Mt6@$q~y5vz{&}voWB_+0EFZ)&#zMeA}d@=~fg9{7o z*9y77%Js=s#{EUZQ;i3T2B)yk3P&#fBxU+k2m^;%G{%&nh?L~gl^&%V=8FN0sKFG5 zaxj1uU41vL*4UM@NsB3WV@etjV6%y0#W=c2fVdOW%#9;5HoRqWqeS=^^g*sH76yE) zKv6NMr8w^rDlWEH=#xhWg)dCLywV=5G71bj#tt7h5avrcjM^)N%O5+Yn0yozComN& z2+%ZXM2-eUjw}%*M=3>-7K??!pra^S5k)DJ>i^Y&_VutNRvG|HVpRch;t}00u-523ZT=8d-|QopV@Hj2)72$43EUbs~9ajA>-= z3ip{=bk`c&&*1lUGjSIu2*|dB$&?E&#_MC?W$T1i&D2($<{Z*~ECDAr^xEL;HItw? zzQ4E$+7!mu#&F8(DFhtmGUhJEZ`oaKT*mJ8VsHBpQqb-$`>-g;EZuqtMtIN^=wJbC z_z*h-U%%05N&UQ$$cxTx$% z5nB7t@P`J;_Hj|cCoPT0kPnM&rQjOMDqxW9DBNzgPw?*|eF=IW6`^GfQq32FzGgVx zjHJVHs#D3RwDg3GOkq?~LUOz?4Ysw?1t)`8LaiYzq1OJDFakz4lan%LC&UX;X)*Bv z1{g`H!o;+N81h6Wr6y!B?_OjE3;qPs3--NgLz#bFF9I?TV-_+wIpx6#uhxr=k47ZS z%j|`iWB9|Jqti0xC1EN>n4A)moNS&LlRj4%mNbhyV3jOBDJw;o95*{HEm>e@x@7m1 z)T9Lo=^3zHCX9!IM0xW+c=J>_A2&Xcj+rcEY>fvm6^{<)=Scbf=-`p^Nv=l+kGsP; zX>i=&)WO+Mfmkq9NaOxxKpMeqe&ya|A z4bH9+_jW!UQG51_sDBQN_^s#oh{n(8h}ttY;!fwBi27$*1V1w)?tCtdxbwL-f}i;j zcRpWuQHG-ewkUO8ALw=t#WC%Yy54rRC$dKRX96Ds^ zkWoXX4f%K9$BijNnl*!sxb~`oBQ8Oe)+I}q=dF5b?fMPRJhy4{mKV40c=^@W{`{9+ zZ|-^LUF=l)K~CZ`Wt`U{np!m`#Xh`@)FhxsYsKF zMTwM?;BbKtJ;PsYG#num?ttF>(@!5bud>~d4=tG`ElUD_5(XUd=0zfD)^qB z!GXQnEsCmMR{3M{s537eI)qJsan#_m1n=GZ8qQt&-#GARcK&|&lu~TT9PH*s*UFX8 zKHC`ooSfy$v12e|zw5xZZEM%o%8&3#a*t*%gWxsQ^N{z+Fm+KI|D{$s*Dj%RTh6u| z_E;l-f)v|{V?|%lchMqj{M>HPphb(wlgod_3akNHf8bS|#Qx<2JGZUhwrRx*MSf?_ zR5q)0tDcFI*te-Ju5_zxcIFJ>Qyr{(EMDBDZ%``_Z!Oj(@H$#I90s6sQ`iP96KM7Xyw8xgGOcZN^0P%2N8o*C?=%|cYm8^7*1)Mu zeh4fudGslZEJje}NCXi_(d3T+yQj&cw^PXO5{&1^<5SLrVoN~TlbHDQHaZ-opIY`J z4Nqfg95=k+yx&Q~pEP(CO^*HN0F4v&YSzzznT1XQ;2RMH>#I z!WL#on7e5;LLb4`Dj3CKSdCyjHWF_c#l7%-0e>p`bHShS+DP~u6iV7+U-5cJ+tv-g z54OIepS&prZmk=m*N_~1h7KD(V&teNMw`tsv2pPUiLkia=rLyOxXAGno}6elC(W6g zoRXS0uTe1bq^QZ!Q>IRvZZ^+P&&bSLuy9f1a5H8q{@IHaS7UeDQ)6(%kVnnt#~wGE zEvBBgvE)B_UX1*mmr)ssw}{4$Mm~Su*C)}4h6H09dj0SDP|HY%)1sj|O&AZopKyg- zW9_3eSA~ZH&+km(yVeUD-?b0qf||rae9bFcP*k{MoGq)Uw8x4FTV~Ol#<63U&9Mki z#b%e_vA5mNAnq>9ERsUU!2)ez;5c~FCIc#quj2bN`DOuBOQ2a!pjk4gM)8$Fxq9t%qI~WtRQiL33hyucCna=fD>}|N%kSj z>~Er&d1bL`eGcS&qMS)L^={FfBy3!1cQtqz0AE;FfIS#IBD28X~#Hj zT3*CAO8E37AL2yD=kc6T3qi)`;WM3lN{kDOxbDyb_W6{I&x4W%0JJFV`Z&o7MqqrT zPuZfPCPK6^si;|Z!5F`(u0T%0(sPkrf8>S~IPMz2dIOq3=hlOqdvZ6@i$G)$1dkkM zc@1UXq$1eAla4&X%@0dY^g>UtV;uSye6hQe#e0BljihcU8{$-q(Jv}0Io`x9`U%EK zMWA_1>jy{kf+L~+8bd|N4>)K5LwDYFlR<1ca&x!gAb;nB!%)F=?&xXhD2M9SEv(zQ z9}fRe^vNfmC=fJ+RNUFwjvPmh{l%;6>6|i!p4h1XI2t^2pW1M8<=pYH9>InrotWl2 z@^SKiB3g*2Z8-Dc;?F-g_{pD{XYJqh>*uahdJlj0*=OXNd$`xWK{KPG2F>iXFZXaQ z9D+aFwypM=WLx{hT{M8=_+!WRo8I?8F5}1{75G!1eRlY8Vd0^|Lx&4LJACRhk~-(i zX%rUb=T}xzUh@1TzH~So9I6mBb9eF_CJch-2Za#U;ln&9`7@_??%Zdex56GCO5Y>ys(g-i35i}bf~iO`gP8M;E5iOLoL6Y9A|vO z&B>vEPM=C9J@GO{xFj2eJ`bx6&&k=g4MSoaJpQ%MT>c#Y>8BNZ!sOgIzrsQu*B^f1 z@vD@NTKJ6{F)q#B2nrNG;=~WmFK>%A?-}csXSU#=@Rj*FE1%BE2ed+;Ty${yO4^79 z!E@PA_@TmUl_Xzs^M49Ibcp0jQswgCHMv&41kDdlpS%C{FG?5T_h!c{ujJ(X>tFOt z;e|NpUi(~2FDK{PwR7hVA6~bPr;lP-S$XIXq;`nlmE2bH2Qg$hMDeF^4vW{z{DVdG z%u`6Yf>rl8&YY8^&pyk|5MU*Wh_ zWvi+U!9WEhZSZqGF-O-U0YfEe<0JHftj2PE(b!=sUXZ!2vvJbo->B{kie>SjC~rt) z95eZb^h&R5y`fW3Zfw_6dhL;0CAJkb^XP_|$2t7~O8N$Fm>zzU_FJMMGKEYWz#d%i zpf!Gz%pTP2A&_PnNw0xIhVTb1d&uMuuIynqf6%dqwWRA&f;mmX=}B{$C3Za?T#XAj zQ+M{DAIL&H*n@urd+@}A%IJsh3Bd7UAxl|Exb$F8P*dcG?UhzwdlgJ{n!NZY7aEu^ zhd~B>IeBapzML?net1AT#Tf1=eXfMGOXdmWJ|RseXNe>R+g3TEOT%od9g(H5R)DWS zEtf<}Uxa8)Uah4cLijfwt#mmU7;IyXI(Wi z!@k_$-t7q_C&<&{<>W1$nYJ78tz9V}GF|#`nr%70?p%`a#R!`^@wM@dy~p3yFO2P* zWFF9~R=djiyUK0xZW{pYu6Xkk*k$Rq5Ii6XTOp;Tn8(M=yEEYAxP;W0^dwp)cgJIR zI%Y8&Dzx1Z=Z=BccyVZIW?E`e+Jq5}0{-uPrTD)|F)N{L-!8%8fccV(H}Kxcwk1lA z!H$FELKU7c9##0FJ6zWyS!Krisjpix-<1$m>O0cIfw~LyA$}gf0Boy^L5(zGNM(a* z8AU+ND6n?tID=b8xs}80E-Bii&L5b+G~brQm*rH%G{Xv;X^AE9kc3#L4+gZWT?0RS zW@r-&@7{Lxk+LLOSCUKyHRcvezOf}d2wy@P1{ss(r9yLSmJ0dC;&s1GEG-qn=K>$o z2#`gC?IV2=!@p0=K_fOSj@oS>X<6IL z`_;Q0(Eoq}EYlXL0aX+<#wR3a#-}Z0+O;)-HIAXFNhwS<;%Eg`q zDQ*8Z?ZN*Z*OxY(*(B!Y}D#K7~|1s z1Ym>8xZ>=~BHN%cClPvgixQ=e&|sm};2X}x@(t(IrWPPpUh9EvBSAa-ivr0&X)yr5^M67*xZju(wqNWJLEvbuv#*bP|=#a|= zP{kZ7H=jX4wb%GD_i@<_A5s{D&R|O;;@-^&l}@BGn^yd7pcQ{F%#t@!mFuBERhMcc z=A>#jvD_K=8=EJ2OSRo)G1N%OQoz`%-U#mHSx6#J9#Y}UQh><&@`x7~mCb}Ou=iT5 z(~#}uL|ZK6e3>s3w9UkJd&Nb2O`Zh?y;fB8LhoXHsLq>*+TAChX;9MuA9t)RYH;ZM zT7;T9bneo*gDJFypRQiG+BewrV6VOdBZfo_?Az->Q!p$yIUR06ZMs^9jEtNVJtcZl zy# ze(URd-rs+4|NDDh-@4v9H+pEVHZWKQgP*}&BPJ$UH|%(8f61{EU!OQuvj43e8>~qa zBf17tGW|@J(Qymc?|7%^i&GabU%h{!1rZnVXOt+UiE9vm_`HE-)%MJF!& zYR5~M{nra8ir(6qmpXaKgDup8duXqbv5PjozW<9074j=u#f2~SzrJx%?8siB?t+i0 zZ)DQ4Eqh8%{aW(|_v@*WJzJI~MfNrM2mu`iPD)+9GcSDnJIetqz@^%+x!bP2jE z{@wWBE&g{)|J~$wH~HT+|Af2bzi_wmBiyC@!QAeh%P)+a-nsmv6y3T0P%*t@{iA~1 zX#KtDu)rS5f)hT`StooVvCLX4cwxXhdBL6w2MwKzkMEvV+Pf8gxpNkN{CVt{s5tDe zOh@LjIpVb0ZrKGUT|{$h7nQ}~ckED04~yYFLs5X*V%Tfgi@xC^c7~W6mP{<9pIR{+ zE0Wo#Le>6#L#yn4h8D-_(I-nOrGv3G^0ee*EiK{u44(&B!rwO>fpHW{!R-&4&Q#_t zYwmR{N2yd~I!djs2_=;*p9Y6PIW#p#U?T?)tie{08r+@74_bCOzw!Qm?R^V;6jhdY zRlo9rkPZPln3(DggaSwLK_EbALO>dP5I~$@t3;jIpx9Afk{85)il7dotE2*wq z=bm%#xu>db-8$#obCJGW*@kZ0Ps=f+q^1&|+1N&6qsFLgnw1SJsLGq7`5l*`t(l-~X=zzT!l!!1U^8J;(TkK#!JeQrAJaq6zU_Clxc0ktvA;d8 zy{?z=*W!9b{cFLQ^4D(O``ycaUt+(nu;2acmpdv){pl;HK>n%W z_Uo~LF6aBl$wrhqM9!YUIr5^r`z9Or4w>`PkU6gmnX`YW915Etj_KD2uXJ02SGl8C z{sj}SlQ^=@Z{zP|x&>!jGY({Y zjl82N&!sq0W~8L1d|>#%kcyN8kfSL&*cH0D*EuKm7+1&r5`T3_IRWX$RA8Pzq1~se z)0ctbDE?AY$_#b-eYz7`6Y{o={Q1anBfre<$lig!j_fb9#{sf!B-TaZvnJ$?7YnDD z%L=Z`zb?P5V2W8R%p0FI0bUd6gS{I>tvBR3jvL+g!%Two9&hTKZEJkI>g2wPllyJ; zPu^Si3AfU_QA}@__6XjM$hWl_d`=(SqFvS>hZo^ z_@Da!masE`H%a-mes>@MeZq;j`=$S=09wh zR5hux?vP-vKP=??Cp}O#X-nmC%zLR|Pku#{tv6saak+le@P^j}ZJFO=9LwdJ-mCA~ zSJ$&Y;QPMB?@OD0a-Z$w{(a&tKFjpj>WGJ?zUHp)>ku~V+S*=!03s)5F*!iq}{hu=;adIO;OzEVK*=+`%MdfR)u>O2j79UTcI?Y+O_I6}Ai>@&Uh_I8KM zM?pFi-wob8jTcOJ1EZt5@Um88no*RrrqD>tuz3y*DP*tZ&)I94g;E1vW{+WZlhg8_ z`d|N+@Ow{Pd1b?r3U`2p34y@k)3HK7<()6++fV3B!~A)pgdRUG_@Ax3zq73axUs0- zt%UM9p&X<5uF=uoMvA#4g8A<7W76B%2u)YrVNrv?b~HYD*JNPFt>Fl6js}VXx2i!c z=Xk)ElI5$Pi3mErfavdS6LaM26Lq8dMl^)UUuWd6HVmmrTDof8s#;80I=B8>)#bz{ zRENVNg0EObYNT<^o3}jh;6qy@%J^*!$KCw}wfZ~yUk z{}he))YH#A`}>{G?TUsu|IqUM?mew-fXymqb7_jl?S0|JmtOwkEA7#E`}V*3+Usw; z`Ogei3B^3>IB@XL;kW+u_B&B{u{_7NXQ;F5N-JusH&PR;uDi9W^aA`0qlan#0qF@* zWn_l8C{RiaEQ}lj3nTv>U^a!Xl}h42>2YITjqp(g@=Fgt`Ds#@4-U{Kn z2Ftqd%yXVLmT`t+1-3eO^>@K~M0$MqVG8j$=jmL-EH&?Al=g13E%P`qpySbvK4H>~ zhM%zced_#~rfHa%Zmwr)DBqtpk?M&TQ_LIOQ^IE&c2*od%MwR@Wq88(_*Lfjo5&XF z%WT3Mzt&B3&7v+?>-Hc9*Uy@mt**}PiB|Odwc$r7dXxb!T)f#IG{`W<)w=Oh?~Ygc z{Hh5i#mQllEYv&Z4~WfnsV+*%v!y9m7g6%SaLU(^agtU-L+JU0e^|K+YK#7ZF^4bc ztUtAxOX;U0^4qZ*3IVhPcrARw_hXTuNFF=Y^r!Y8#)>7N;DE2f;!ZUv=nx9x`V%uo z&?7NUbOS>?>9f#@tyy(vJ?jxEG)2OVnQ@S#xG9s9@)FGXi_vex6j_13HKL~;GWY|l zBT=^$=}KAu%J3px={OY_=}IH6;^Wk=GzzA6rBN`oD~*DwU1=0d?MfrC2+t8%aTE{? z5An=T7y|xx1V^)=c85_w6_yeKMqm*}{|+#lQrk);ful`HucUA`t+*{!$Tb;_oPex34~$DcTJI2eiXZ;`#75bxO{v*HUN8RCW?y_Rm%^fYL9!?|X14VX- z)((O5IP*Y$L{`fSVg}}DKT3*vKrp2{qV~qz{_N9+9Mpf@Jd6YTy{BdgU&vD~62{1b z+S|;yiFTThjc&y6Ano_FbK6m+?`S!>F(5MkhckS`FY`^A8+;_v^`R}Wr_#)pc8}TF zVI43uBaVN&By>vVPP3&m3^4CjQ$<}WQcI`we5W+7OB&xLwRTBuUFN-!O!0^`@rZ|S z=1{DW+YKvl5QR4H4w^fq&ASP1=`?O3IHh-Y8g+ZZ>7p*-?J}me5)P`_)*766MB3g;l^LD*kYbfJ??xknn|Grf1h;gWmCB5}JIzXE z#-c8>T$yH%)Y2K$?m?4+5AH#$f+?+N64CDMGRu{1Yn8+!!R@WoGT+gweIw@kPR{p) zgpw3|mqP39@vap0i*Le-w@TF8mn<-F-bzvMir!rBSnowc9xKGGxICMfs=z$vg)aK; znp80#((~PObz@)itN4I2n$4Y449yU*_p(C05Hx)_7c!=Y!P$|!8p+bW`ym96dAdse zd<^;XjNH;0A#Y*imQIkjF!Gj8^DLEmd{=bkY}bl-K~tes0-AsjJmbU<1O@NdyU>KcR)!g$KKq_c`Y89w0YNiWTgZGiO84X z$O|?(;d^g>@J4sv2)F=ok5mGm0LxfJ>_MPGI5))O+%UMDrSUjR2jeV>$5|4M;|}1~ zjmUJQdEyb0>E5tZ{GF!1oY2k1O-^#%OOg?fkX*$h9{H6_uU&a7zVy;dl~?kO)$5Aq zUTZ5azVfOmH?O~MdTBVa6JgSOb`iq+ve)_T_pDh{?O=XD%4?s!hkw*hqL^8U;uSBy zhfL=8#aQ^4)>hwF69WO42)R%U!+f;IP$K7mo2wC);XF8AQQf#|u-nsegrF#1zG_{= zko4*sU)9-;zwl{nkQTpQ)U=XF1XJ>o#~&+!2|t#Q=xp)CDV3he*Nm{cf!N(Cv7*^u6NW{uSKkUxB=D;?Q4Ti2n2vZ;JadY?yRjVUVnGu zY6)ZMO}7;fmbwTR&6}~ZxeIHi% zf)%iHkP^Efr0ou6ce8juKsvA1*O%?u57!GD1B9t=d*9W8Igi#t%$R&d_^Huu8-Ny?D=jMfT-B62n4#nP7 z9{h>Jh?nBUd3xbne`mwyP}${xRH_gtd~u$S^PJ&?(bz0wRH+b5eiUQd9@Z8&^u}k= zHE8mXMI9d~1BuKgp4hTv$#>v`izqjfb-k9gHpF+kPkcYh_rDhRbG2B<2S>hkR6ZRw zwOFGEM{R9>KW7-21m*LA628tBpMcGtW%YA!3))eptU?@eOlfq;H)#s>WZ0Oewg0kd)pxv%&;T`WuU3WVHe1K#6vNiLZE~vhE361DK$?R{MRQFE+j7 zH@)Q_Btc|?rq&||aCv;lO%C8PWcK6aL%?GYKGa45T+WvN-ywjD)46BQp+in5h5Xpu zyrp?pbIazpH%9`%Y~Q|QiP_Ba6f&k45&J$j<{tl6k4Px|e_;TO+YtbRLjVju9Pole z01PbxU}(bUny3I6w^0C$UxWi-aB2Vy1;Voc7Tj3v_V@ z0$u!q0$uzv66oSFtT>237aR@((?C-@U%JcV)FZTsck^oJAk1;0P$IA zu*Dw`Mp!2tEJ?SHIe57qL&?1Z)(;N~=~nIliznJPV7=iWQrrPC-MZ|cFq|?{+kNhl zzK<{UkR!u`WXr-kvi_RNMtfzj4R6Ma+<}J0Hdwt4<|(%z*WZbhUrq(wfyI0e?|UN) z-gl#fQ}mAgf1UmSR$LpHL%6}cC?ORD#T1y6YH2?tUL=pt@J@#dK`AriH*96241X`i zW-K3rvxNEWhef=WFG-kZoy{@}6K1k;58nASxCxuen?gB420SE|-PG$RaEx<7uyp`S z(iBeIh~S=^uu#f?^uhoS-xA=ZgU%FuVSv^dK6H7e`?kAyGv_;!MR}cC@15c&G`>(O zf%*M7tweXA_wo!3D4tu6Mj~6Tte1H*d<j3$7WTPnt9m4z0!gy0hoE){LpT?1` zk2kx@I@?)ELn?MLFvJqIr%ZZi(ErUt+**xrMe;X%kmkK#q!IKdbkK`qu>0@f!7j2Z6K7-Oi_HANnHUCxmJNfE zU6nYyoodcgYYw1h1AmN@?@c|tE##3lFv69~7@tOCpnl|s>zDI;2(ut# z^hRS46Be0?`mDy#F=2Q^2%&BL0X|2q2rfWu&<{Lfh44Nd0uKxUix?uTo;WP9h0+*X zz$3N@uXhMMV(wyvImjm+Pbz1=Bbz3fP;-nEV#A^>Y1h;z$_ zOIMOG^}dRgEW#N$OYMK2EX9v2mf~h)Jx7pjT&jx3Y{<==j+OQ_GZ=4^jn$hYbmx=% z5tY1ICfyRv2N*$7{lEW-`JXC9t8IT+hCCOS@p2sG-xWxP+HkP6Hz5=fhGm@?*25-` z#1<}wDw2-|)1}$Wq(|oa;S8T>IQn^>l|;fzkhzZ=uJFQ;S)BviA3;Oc_@7z9s^x zlhe#|nYyuW3webjhYR2M{!|szIsYVN2KCOjgj6_4z=09-De2fAp@S`fbMl;kAU@O! z^IVpZ+lRgx_B5-8&NVnOa<8}z+@!u#s7v<23-_lbIon#$eSe(_8!rT4PIHre?+Ukcu@io)Qh^hmtCHXhKIxV&at05% zB(oEtv?ZTK&)Wf~TUncHWK7YNp79})YbV^O`V761b-yIz5 zln%PgXxA}nm)YRNgjZDFo*lf{No(E}II-MaP;g>(yWmAm=}C9c?350=OIpYwX$A*%w@EPru$? zw!p4gU@u=_&su0tU1&Eg)qBTbky~AprLheS(-9P9^q!^quIG=_9!&l zh}I5AYtztLJzC3q>aYgE*hGZWL~W=9r58Z;cTtEJ$KWlJohbx-r?UKQR>8H;=o@>7 zX##OFh@4%AH~V_daJ9tqBU62!|BU$kKfj>YNdWq)v3K~PfMdUT>>z_!QU>J6kQ@fe zVK7;PhP4*0Q0~N5*~DNGuT>h0k?N8YC*o^-JObI9(SrO?wwR0IWA0i@lVPgGq?uYogjnAAy^Mb#7gt#%%_6+o>1ikw1<>b# z-V}55XA_lGc%>H3u9PZ^3~W20a%gr-o82fa%3;>l*CCE!O%6>enTK^4o840cP2rR~ z?lxT}-#wEd`%7>gCP4m$$Ky1oj22F^vUhE3*t@n*c8?XGCh`8ptarm{z?|ZqbZ>Q9 zu-RP|-0ZIOJw8L);tpN>5$1TpBj0YHV_!PUzT9fRX10B7nSJqed-hEGf*JPoQhV7n zyJnibe40J0#GYDWH0CXFaog@D;81CBBF6kSW zbjBt1yQFVjQqU!RN2^PG<+2`?zQzoXepm2su8O9IZS{TpJ_|c)3ie$YJQ)wP1W&~S zuMB<}53~foalNZS#i7)Wb{wo&ay)znku9d-lmnHZu_8|7}To!&9mlizZDg}?B zEFrHQM_xCO7CcQQoJI*y65z<6WMruKwcQXCKoj1i+FQ=>O`%)^fmg^Q;K^EIhqq*E%3_5bbVPzj* z)lksKS6WjZw^>6vy_k{$#}|v~45mZPaK2hu?|iMQ(X!TKE`RDcO)GC6opo`R>hk+t zp)OxIRmW#>X|_>9UoZNuif9CDrsX>zQ2r?4gohYJpR1>1y8(m4qw=J-$gf`bEBc8m z?MpASFQ06`=5qVkE9{FW*|UFUUvP;%{Zf0G#jdf~%Psb-B716)-BiSJMML!y&1ye! zTWjdH?m?pkxdRB%XhH5IJcIfId62>S0(l@3)fY6QFPIwJ7Z9j8wl7dYk-k7BL|<^@ zs`Kj$n(?&Wh6bE-Byd4bd~^7TZ>A^yp;bdZ@y!XIc&w`v9w z06g)Oog@D;7}O?gsN_dLRE(7joQKpyZ)AlBBPEv_cn=Q{&tHta0K0&_2zv?kg`8G< zBlZ>8SK@p%j%zr*t^slScOd;+POsm|>9lX+yo=Loy8-(U>ur99{cBF6(eXN6Ds~fg znvzw5eLD6T*k@wSX({$H?DMcM;I-Q8u-}M%1@@J|S&f~dpRdKf4mj(v*J0m?y%{(U zV*eHP-(lYcoW0mz!2Tlkmw@v!_I=o2$9@1fZ((<1e;@mY!1)yWF`lB8ns0GT`gv6g zg39X4j6CnbRH$K?5|wKFVSu7Mc#K+1dHPEPOE)CaCo3FxII0~R91V^p#}>y{$0Lp% zj^8+b=Xl2PoP*<994|UvalGny({af0w!`jN<+#VO*3pU_+PWO?I^J`<@Ay~82aZ2G zK5=~N=yOPpFC1Sw&NzaOkV8{rs7bHMtjVq!T{E`k;u=d$QO%^9%WAHynOZZW##&Qe zGr#7Vnng8BYkpo6udDFMU(~Vg?%yT?4sbiz*D=@sv7G(eh*IMj8S)rI$Y7t(_#&pS z<)L$WWSXtq2<59rQ7Z{KG*{Q53A<*eT3aM!Ilv3d47#sz45MmcRAhI+ zS1PZVF-8g3!3@wQ%!dgBAEQ?OkTBDF>@YrsK0PcJl?fA}v_1~QM(@1q>-%P7pw)3N z=25MjIB}VxHZ~bZ33Mc4`gqZkla~oMW0c!B;)B!&s=|pal?|`;bqH6Jf;u!x(E3d? zVEZ9!LpoWOo}-XvgPkbCU(p(<3$jH$-W(<^UL8!KKV0}dy`w3lU`LR1w{=%u%#o>s znj;$W8V(DmJydf_2Q?O-oav!_fqh)2lS?@?*u(M(OxBvu$~=Qwr*dS?zChzgyY#(F z`oSfIToUXroLl1ElEy7*-IC5N>D`jSEv2}nRQiUc&wp$8VIkAX9TL)l-@8ghEvT(4 zRL}qe4Y;fys-Pbj=m(dzM+Jo#DCDyC#)CeM2OWzCnFxeyp9V=16P(++Q^n#Lh<95d z(=e+V2GY2#Z>k_I18LpXE)}F>Af21S7QA=sdc5-C*^hQJLl@K&TCGX%trhu^Fk1bs z9>S@EbQ&R^2FQn=TUw!Hqr5QPQY=|VP6@I70W?sU7@T6&+A1ndqM}a0wH-qfWShJ; z>MWkUFWd<<-bWAS1NYIh%sQzAeH1z=4ed%NA+t#<%F+6E zahx(+ScKOCS@Y8v8d0LLW|n#<8#Now-k;ev5Q|rD2(xI}KrBw$Kr9NoOuH-`CxF#w zO!%S1E+x^TBveQ|&iO#pa&{{Ps*pq_@BDAYknpVO*)T)TD(vr65-J2@W19+yM^UrX zL_E%U6tmN$$VVktg{VT5a#TP(ikhV+;&IMh47-1>(Q$$xD9E^f*ewM>{LP^tsW}Q@ z@G(+|lG9>pq3a+h=kdpQng~R#P;I3`ujVL#!N*7;O3pK;XU@(F6N|u@ji**h8GK}% zsaJ!sr827~6r$biHc-x#V=H4!Ia7`i79uGn@4Sz6*PV6y!`ToZ3#$8?6n3YaKN}Y$ zla_=sNyK!7fk-M5-dSPilnC7OH7l=d<>ZC{(~6PZbYQ%Q<)7yKqQe z|6UomM+E9jSnK3URe{7eP2oz-Q2>LFY8gs~Dij4U_!vi_0@TV>h(fF8D1gDo3#Jf+ zT^2#U)Pu|Vspkpr-Guim_2p65e3=4Uu$1mtlmJM+;8#Ze}_Yr`BGSy#`Yku}^N8`?y8vf&^1;86o$deAt@`gdkfiJKu4zwqwn$kRZYv)NjgwkLEEd;xASXZhp{1`_`4KHgYJc z=~C0Wkjlm`b<`z1-=zF;q@iVIX?_BVkvA+!zOIg~^{sp&#a!!3@+D}%Rn!_ZnHpU0 zOJlBn0lWGdmZvcpl`H&hdAu5kUD}m%>C*ng-0-D6RZf?7$y~a$YC{yg6WzE`x+nVl zB;^knzWeTb?o@A0e80xpp6i5bWh?V62zolK%*D`ETmjqu;0ZdinVIw*>K!{7DL#`Q z&6&otFH_US42dGvKuMvorWpS`_w1jAx$~%nW9Efh7@SKj)Xbw6vKC-*&lONx!POko zmmAiw_}bJKwo(Lw6u&+b(E~H;C=nxC7HFl9n55$>iMF~$AdgoMcm!|i)(9<|TK+Q&S%$la)2 z;+(P*&xw-^*pE34fZKut?^xiLh=z9QsLM14 zimg&4`bWsfGi2PaS;;4|e3|n-hAf23$9#mNGlNI5<{S)sewUkEGCrxImy@8gVp52e z@9nhcfN%hzz1U5UyPw@{%AGd&E`ypQa&d}>R3VVIh%^5%6IC^YW>hpKg+E^TR^CZ9WO{&iQncoSQ*e2MX=!ng*u*G-%DMe~Fi<^87{~h=_8w_Z$pO zvJpd~EzA&aBZks!%3VupA2l+4{F6sopBzQAbBXs}Arqc98hGhJ4TLTum+67vR*tSa zmGnNN`S_kctR;SuG4h1M$Xdoo17oBPb)>;ZE|gx9Z5j@ZB|8yI^d>yBFqL|cR~kyk zj6_k?!QG6sjiJ>?35qkU=wh%Ahwji55|PTJ6j6l4qd^|pN}Jo4x1du7=!Gwphn1^Z zUthf@;j_w~9A^if97Lu#_me}I(NE4@3rNOm7AP{NMShpBU$=_ss^s2))v%WyYJ^ER zcMXIYUBd^ghEG@xq**2HYe6Y)k6FTGa#YVGe;)4&crzh$YChDl3Ix&80m+$nJxFf5 z3q(*Dik_%pSX5-_WHKp%qy&-@NJ=0nfusbI5=crQDS@N}k`hQtASr>Q1dQ1dQ1d/dev/null | grep -q "^$INCOMINGNUMBER$" +[ -z "$INCOMINGNUMBER" ] && exit 1 +[ ! -f "$BLOCKFILE" ] && exit 1 + +norm_phone() { + printf '%s' "$1" | tr -cd '0-9+*#' +} + +suffix_key() { + digits="$(printf '%s' "$1" | tr -cd '0-9')" + len="${#digits}" + if [ "$len" -ge 9 ]; then + printf '%s' "$digits" | tail -c 9 + else + printf '%s' "$digits" + fi +} + +IN_NORM="$(norm_phone "$INCOMINGNUMBER")" +[ -z "$IN_NORM" ] && exit 1 +IN_SFX="$(suffix_key "$IN_NORM")" + +while IFS="$(printf '\t')" read -r pat _rest || [ -n "$pat" ]; do + [ -z "$pat" ] && continue + PAT_NORM="$(norm_phone "$pat")" + [ -z "$PAT_NORM" ] && continue + + if [ "$PAT_NORM" = "$IN_NORM" ]; then + exit 0 + fi + + case "$PAT_NORM" in + *\*) + PREFIX="${PAT_NORM%\*}" + if [ -n "$PREFIX" ]; then + case "$IN_NORM" in + "$PREFIX"*) exit 0 ;; + esac + fi + ;; + esac + + PAT_SFX="$(suffix_key "$PAT_NORM")" + if [ "${#IN_SFX}" -ge 7 ] && [ "$PAT_SFX" = "$IN_SFX" ]; then + exit 0 + fi +done < "$BLOCKFILE" + +exit 1 diff --git a/overlay/rootfs/usr/share/sxmo/default_hooks/sxmo_hook_games.sh b/overlay/rootfs/usr/share/sxmo/default_hooks/sxmo_hook_games.sh index d61c744..b1489b0 100755 --- a/overlay/rootfs/usr/share/sxmo/default_hooks/sxmo_hook_games.sh +++ b/overlay/rootfs/usr/share/sxmo/default_hooks/sxmo_hook_games.sh @@ -33,3 +33,4 @@ write_line_app() { write_line_app snake "$icon_gam Snake" "snake" write_line_app tetris "$icon_gam Tetris" "tetris" +write_line_app gambatte "$icon_gam Game Boy (Gambatte)" "gambatte" diff --git a/prebuilt/games/usr/bin/gambatte b/prebuilt/games/usr/bin/gambatte new file mode 100755 index 0000000000000000000000000000000000000000..c6e4b12eaf5ca61851a8f6292205af626d73db0f GIT binary patch literal 239120 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

n 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 To5I_wkr#+lpISP$j=28|%{259 literal 0 HcmV?d00001 diff --git a/prebuilt/games/usr/bin/gbemu b/prebuilt/games/usr/bin/gbemu new file mode 120000 index 0000000..cdc10a9 --- /dev/null +++ b/prebuilt/games/usr/bin/gbemu @@ -0,0 +1 @@ +gambatte \ No newline at end of file diff --git a/prebuilt/sxmo-x11/usr/lib/dwm/plugins/calllog.so b/prebuilt/sxmo-x11/usr/lib/dwm/plugins/calllog.so index 025e74a4bc73a274a91b44283e5f2890172a4e0d..4a0afe63cd341ef258e10bddb4bb253e4af8493a 100755 GIT binary patch literal 103832 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�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 diff --git a/prebuilt/sxmo-x11/usr/lib/dwm/plugins/files.so b/prebuilt/sxmo-x11/usr/lib/dwm/plugins/files.so index 50e881396fa646059a8f9407fdf8501bbc5d8772..7cf957f1cb8901d6c4d4f4031855ad1148b575a1 100755 GIT binary patch delta 40092 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 M*||F((WCT#0p5H^djJ3c delta 39998 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 N?%MMYKA?^C{{VY$EGYm0 diff --git a/prebuilt/sxmo-x11/usr/lib/dwm/plugins/sms.so b/prebuilt/sxmo-x11/usr/lib/dwm/plugins/sms.so index 32916dcfbca8a67b3f663e2493f30a17ad627d3f..853edae9b53074b996905152caf4001c0ba42720 100755 GIT binary patch literal 144772 zcmeFa33wD$);E5uJ4Zh)zII z#=$Wppdmp;Kn;r;6h=@GM$thB_!5mXE+7%mq_c;uTC)9rr@A_+G~g)nzR&-i=li0! z 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%0AtG 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 diff --git a/scripts/build-games.sh b/scripts/build-games.sh index d6d9d0a..6d35207 100755 --- a/scripts/build-games.sh +++ b/scripts/build-games.sh @@ -30,7 +30,7 @@ EOF binutils-armv7 \ pkgconf >/dev/null - echo "[2/4] Preparing armv7 sysroot (X11)..." + echo "[2/4] Preparing armv7 sysroot (X11 + ALSA)..." SYSROOT="/tmp/armv7-sysroot" mkdir -p "$SYSROOT/etc/apk/keys" cp /etc/apk/repositories "$SYSROOT/etc/apk/repositories" @@ -39,7 +39,8 @@ EOF alpine-baselayout \ musl-dev \ linux-headers \ - libx11-dev >/dev/null + libx11-dev \ + alsa-lib-dev >/dev/null export PKG_CONFIG_SYSROOT_DIR="$SYSROOT" export PKG_CONFIG_LIBDIR="$SYSROOT/usr/lib/pkgconfig:$SYSROOT/usr/share/pkgconfig" @@ -50,14 +51,35 @@ EOF mkdir -p /bananarchy/prebuilt/games/usr/bin - echo "[3/4] Compiling Snake and Tetris..." + echo "[3/4] Compiling Snake, Tetris, and Gambatte (Game Boy / Game Boy Color)..." $CXX $OPT_CFLAGS -std=c++17 -Wall -Wextra \ /bananarchy/src/games/snake.cpp $(pkgconf --libs x11) \ -o /bananarchy/prebuilt/games/usr/bin/snake $CXX $OPT_CFLAGS -std=c++17 -Wall -Wextra \ /bananarchy/src/games/tetris.cpp $(pkgconf --libs x11) \ -o /bananarchy/prebuilt/games/usr/bin/tetris - $STRIP --strip-unneeded /bananarchy/prebuilt/games/usr/bin/snake /bananarchy/prebuilt/games/usr/bin/tetris + + GAMBATTE_DIR="/bananarchy/src/games/gambatte" + $CXX $OPT_CFLAGS -std=c++17 -DHAVE_STDINT_H -D__LIBRETRO__ \ + $(pkgconf --cflags alsa) \ + -I"$GAMBATTE_DIR" \ + -I"$GAMBATTE_DIR/common" \ + -I"$GAMBATTE_DIR/include" \ + -I"$GAMBATTE_DIR/src" \ + "$GAMBATTE_DIR"/src/*.cpp \ + "$GAMBATTE_DIR"/src/mem/*.cpp \ + "$GAMBATTE_DIR"/src/sound/*.cpp \ + "$GAMBATTE_DIR"/src/video/*.cpp \ + /bananarchy/src/games/gambatte_phone.cpp \ + $(pkgconf --libs x11 alsa) -lpthread -lm \ + -o /bananarchy/prebuilt/games/usr/bin/gambatte + + ln -sf gambatte /bananarchy/prebuilt/games/usr/bin/gbemu + + $STRIP --strip-unneeded \ + /bananarchy/prebuilt/games/usr/bin/snake \ + /bananarchy/prebuilt/games/usr/bin/tetris \ + /bananarchy/prebuilt/games/usr/bin/gambatte echo "[4/4] Installing into overlay and (optional) target rootfs..." mkdir -p /bananarchy/overlay/rootfs/usr/bin @@ -70,5 +92,5 @@ EOF /bananarchy/prebuilt/games \ /bananarchy/overlay/rootfs/usr/bin \ /bananarchy/src/games - ls -lh /bananarchy/prebuilt/games/usr/bin/snake /bananarchy/prebuilt/games/usr/bin/tetris + ls -lh /bananarchy/prebuilt/games/usr/bin/snake /bananarchy/prebuilt/games/usr/bin/tetris /bananarchy/prebuilt/games/usr/bin/gambatte ' diff --git a/scripts/configure-rootfs-from-scratch.sh b/scripts/configure-rootfs-from-scratch.sh index 2be8a06..0b7a91a 100755 --- a/scripts/configure-rootfs-from-scratch.sh +++ b/scripts/configure-rootfs-from-scratch.sh @@ -64,6 +64,7 @@ configure_common_rootfs() { musl-dev \ make \ coreutils \ + bc \ ed \ rlwrap \ less \ @@ -72,6 +73,11 @@ configure_common_rootfs() { janet \ janet-dev \ jpm \ + lua5.4 \ + lua5.4-dev \ + lua5.5 \ + lua5.5-dev \ + yabasic \ perl \ perl-io-socket-ssl \ tcl \ @@ -87,6 +93,9 @@ configure_common_rootfs() { i2c-tools \ v4l-utils + ln -sf lua5.5 "$ROOTFS/usr/bin/lua" + ln -sf luac5.5 "$ROOTFS/usr/bin/luac" + echo " -> Installing busybox and busybox-extras symlinks..." for applet in $(/bin/busybox --list-full); do target="$ROOTFS/$applet" diff --git a/src/dwm-plugins/calllog_plugin.cpp b/src/dwm-plugins/calllog_plugin.cpp index 0494380..fa2c01b 100644 --- a/src/dwm-plugins/calllog_plugin.cpp +++ b/src/dwm-plugins/calllog_plugin.cpp @@ -1,5 +1,5 @@ // SPDX-License-Identifier: GPL-2.0-only -// CallLog DWM Plugin - Preloaded resident X11 call log viewer & dialer launcher (240x320) +// CallLog DWM Plugin - Preloaded resident X11 call log viewer, anti-spam blocklist & dialer launcher (240x320) #include #include @@ -37,6 +37,20 @@ void handleSignal(int) { gRunning = 0; } +enum class ViewMode { + Log = 0, + Options = 1, + Blocklist = 2, + AddBlock = 3, +}; + +struct OptionEntry { + int id; + std::string icon; + std::string label; + bool danger = false; +}; + int calllog_run_main(int argc, char** argv) { gRunning = 1; bool isPreload = false; @@ -116,13 +130,29 @@ int calllog_run_main(int argc, char** argv) { XftColor& colRed = theme.colRed; ContactBook book; + BlockList blockList; std::vector allLogs; + std::vector blockedLogs; std::vector filtered; FileStamp contactsStamp; FileStamp logStamp; + FileStamp blockFileStamp; + FileStamp blockLogStamp; - int filterTab = 0; // 0 = All, 1 = Missed, 2 = In, 3 = Out + constexpr int kNumTabs = 5; + const char* kTabLabels[kNumTabs] = {"All", "Miss", "In", "Out", "Spam"}; + + ViewMode mode = ViewMode::Log; + int filterTab = 0; // 0 = All, 1 = Missed, 2 = In, 3 = Out, 4 = Spam/Blocked int selected = 0; + int optionSelected = 0; + int blockSelected = 0; + std::vector options; + std::string addBlockInput; + + std::string toastMsg; + int64_t toastUntilMs = 0; + bool visible = false; int64_t openStartMs = 0; int64_t startupIgnoreUntilMs = 0; @@ -130,13 +160,32 @@ int calllog_run_main(int argc, char** argv) { int softkeyPending = 0; int64_t softkeyDeadlineMs = 0; + auto showToast = [&](const std::string& msg) { + toastMsg = msg; + toastUntilMs = nowMs() + 1800; + }; + auto applyFilter = [&]() { filtered.clear(); - for (const auto& item : allLogs) { - if (filterTab == 1 && item.direction != CallDirection::Missed) continue; - if (filterTab == 2 && item.direction != CallDirection::Incoming) continue; - if (filterTab == 3 && item.direction != CallDirection::Outgoing) continue; - filtered.push_back(item); + if (filterTab == 4) { + for (auto item : blockedLogs) { + item.isBlockedNumber = blockList.isBlocked(item.number); + filtered.push_back(item); + } + for (auto item : allLogs) { + if (blockList.isBlocked(item.number)) { + item.isBlockedNumber = true; + filtered.push_back(item); + } + } + } else { + for (auto item : allLogs) { + if (filterTab == 1 && item.direction != CallDirection::Missed) continue; + if (filterTab == 2 && item.direction != CallDirection::Incoming) continue; + if (filterTab == 3 && item.direction != CallDirection::Outgoing) continue; + item.isBlockedNumber = blockList.isBlocked(item.number); + filtered.push_back(item); + } } if (selected >= static_cast(filtered.size())) { selected = std::max(0, static_cast(filtered.size()) - 1); @@ -144,21 +193,60 @@ int calllog_run_main(int argc, char** argv) { }; bool logsLoadedOnce = false; - auto reloadLogsIfNeeded = [&]() -> bool { + auto reloadLogsIfNeeded = [&](bool force = false) -> bool { bool cChanged = contactsStamp.checkAndUpdate(getContactsFilePath()); bool lChanged = logStamp.checkAndUpdate(getModemLogFilePath()); - if (cChanged || lChanged || !logsLoadedOnce) { + bool bChanged = blockFileStamp.checkAndUpdate(getBlockFilePath()); + bool blChanged = blockLogStamp.checkAndUpdate(getBlockedModemLogFilePath()); + if (force || cChanged || lChanged || bChanged || blChanged || !logsLoadedOnce) { logsLoadedOnce = true; book.load(); + blockList.load(); allLogs = loadCallLog(book); + blockedLogs = loadBlockedCallLog(book); applyFilter(); + if (blockSelected >= static_cast(blockList.entries().size())) { + blockSelected = std::max(0, static_cast(blockList.entries().size()) - 1); + } return true; } return false; }; - reloadLogsIfNeeded(); - applyFilter(); + reloadLogsIfNeeded(true); + + auto buildOptions = [&]() { + options.clear(); + bool hasSel = (!filtered.empty() && selected >= 0 && + selected < static_cast(filtered.size())); + if (hasSel) { + const CallLogItem& item = filtered[selected]; + bool isBlk = blockList.isBlocked(item.number); + options.push_back({1, kIconPhone, "Call Number", false}); + options.push_back({2, kIconPhoneLog, "Open in Dialer", false}); + options.push_back({3, kIconSms, "Send SMS", false}); + if (isBlk) { + options.push_back({4, kIconCheck, "Unblock Number", false}); + } else { + options.push_back({4, kIconBan, "Block Number (Spam)", true}); + } + options.push_back({5, kIconUser, "Contacts", false}); + } else { + options.push_back({2, kIconPhoneLog, "Open Dialer", false}); + } + std::string blkCount = + "Blocklist (" + std::to_string(blockList.entries().size()) + ")"; + options.push_back({6, kIconShield, blkCount, false}); + options.push_back({7, kIconPlus, "Block a Number...", false}); + if (filterTab == 4) { + if (!blockedLogs.empty()) { + options.push_back({8, kIconTrash, "Clear Spam Log", true}); + } + } else if (!allLogs.empty()) { + options.push_back({9, kIconTrash, "Clear Call Log", true}); + } + optionSelected = 0; + }; auto drawPango = [&](PangoLayout* layout, XftColor* color, int x, int y, int h, const std::string& text, int maxW = -1) { @@ -191,8 +279,6 @@ int calllog_run_main(int argc, char** argv) { constexpr int kListH = kWinHeight - kHeaderH - kSoftbarH; constexpr int kVisibleRows = 5; - const char* kTabLabels[4] = {"All", "Missed", "In", "Out"}; - auto render = [&]() { XSetForeground(dpy, gc, theme.spec.bgMain); XFillRectangle(dpy, pix, gc, 0, 0, kWinWidth, kWinHeight); @@ -200,108 +286,270 @@ int calllog_run_main(int argc, char** argv) { XSetForeground(dpy, gc, theme.spec.bgHeader); XFillRectangle(dpy, pix, gc, 0, 0, kWinWidth, kHeaderH); - for (int t = 0; t < 4; ++t) { - int tx = (t * kWinWidth) / 4; - int tw = ((t + 1) * kWinWidth) / 4 - tx; - bool active = (t == filterTab); - if (active) { - XSetForeground(dpy, gc, theme.spec.selBg); - XFillRectangle(dpy, pix, gc, tx, 0, tw, kHeaderH - 2); - XSetForeground(dpy, gc, theme.spec.accent); - XFillRectangle(dpy, pix, gc, tx, kHeaderH - 3, tw, 3); - } - std::string lbl(kTabLabels[t]); - int lw = pangoWidth(layoutSmall, lbl); - drawPango(layoutSmall, active ? &colWhite : &colMuted, - tx + (tw - lw) / 2, 0, kHeaderH - 2, lbl); - } + std::string softLeft = "Options"; + std::string softCenter = "CALL"; + std::string softRight = "Close"; - XSetForeground(dpy, gc, theme.spec.border); - XFillRectangle(dpy, pix, gc, 0, kHeaderH - 1, kWinWidth, 1); - - if (filtered.empty()) { - drawPango(layoutIcon, &colMuted, 112, kListY + 60, 24, kIconPhoneLog); - drawPango(layoutMain, &colMuted, 52, kListY + 90, 28, "No call history", 160); - drawPango(layoutSmall, &colMuted, 24, kListY + 120, 20, - "Press 0-9 or Left Softkey to dial", 200); - } else { - int total = static_cast(filtered.size()); - int scrollOffset = 0; - if (selected >= kVisibleRows) { - scrollOffset = selected - kVisibleRows + 1; - } - if (scrollOffset > std::max(0, total - kVisibleRows)) { - scrollOffset = std::max(0, total - kVisibleRows); - } - - for (int i = 0; i < kVisibleRows; ++i) { - int idx = scrollOffset + i; - if (idx >= total) { - break; + if (mode == ViewMode::Log) { + for (int t = 0; t < kNumTabs; ++t) { + int tx = (t * kWinWidth) / kNumTabs; + int tw = ((t + 1) * kWinWidth) / kNumTabs - tx; + bool active = (t == filterTab); + if (active) { + XSetForeground(dpy, gc, theme.spec.selBg); + XFillRectangle(dpy, pix, gc, tx, 0, tw, kHeaderH - 2); + XSetForeground(dpy, gc, (t == 4) ? theme.spec.danger : theme.spec.accent); + XFillRectangle(dpy, pix, gc, tx, kHeaderH - 3, tw, 3); } - int ry = kListY + (i * kListH) / kVisibleRows; - int nextRy = kListY + ((i + 1) * kListH) / kVisibleRows; - int rowH = nextRy - ry; - bool isSel = (idx == selected); + std::string lbl(kTabLabels[t]); + int lw = pangoWidth(layoutSmall, lbl); + XftColor* tabCol = active ? ((t == 4) ? &colRed : &colWhite) : &colMuted; + drawPango(layoutSmall, tabCol, tx + (tw - lw) / 2, 0, kHeaderH - 2, lbl); + } - XSetForeground(dpy, gc, - isSel ? theme.spec.selBg : ((i % 2 == 0) ? theme.spec.bgAltEven : theme.spec.bgAltOdd)); + XSetForeground(dpy, gc, theme.spec.border); + XFillRectangle(dpy, pix, gc, 0, kHeaderH - 1, kWinWidth, 1); + + if (filtered.empty()) { + drawPango(layoutIcon, &colMuted, 112, kListY + 54, 24, + (filterTab == 4) ? kIconShield : kIconPhoneLog); + std::string emptyTitle = + (filterTab == 4) ? "No blocked calls" : "No call history"; + int etw = pangoWidth(layoutMain, emptyTitle); + drawPango(layoutMain, &colMuted, std::max(8, (kWinWidth - etw) / 2), + kListY + 84, 26, emptyTitle, 224); + std::string emptySub = + (filterTab == 4) + ? ("Blocklist: " + std::to_string(blockList.entries().size()) + + " number(s)") + : "Press 0-9 to dial or Options"; + int esw = pangoWidth(layoutSmall, emptySub); + drawPango(layoutSmall, &colMuted, std::max(8, (kWinWidth - esw) / 2), + kListY + 114, 20, emptySub, 224); + } else { + int total = static_cast(filtered.size()); + int scrollOffset = 0; + if (selected >= kVisibleRows) { + scrollOffset = selected - kVisibleRows + 1; + } + if (scrollOffset > std::max(0, total - kVisibleRows)) { + scrollOffset = std::max(0, total - kVisibleRows); + } + + for (int i = 0; i < kVisibleRows; ++i) { + int idx = scrollOffset + i; + if (idx >= total) { + break; + } + int ry = kListY + (i * kListH) / kVisibleRows; + int nextRy = kListY + ((i + 1) * kListH) / kVisibleRows; + int rowH = nextRy - ry; + bool isSel = (idx == selected); + + XSetForeground( + dpy, gc, + isSel ? theme.spec.selBg + : ((i % 2 == 0) ? theme.spec.bgAltEven : theme.spec.bgAltOdd)); + XFillRectangle(dpy, pix, gc, 0, ry, kWinWidth, rowH); + + if (isSel) { + XSetForeground(dpy, gc, theme.spec.accent); + XFillRectangle(dpy, pix, gc, 0, ry, 4, rowH); + } + + const CallLogItem& item = filtered[idx]; + const char* dirIcon = kIconInCall; + XftColor* dirCol = &colGreen; + const char* dirName = "In"; + if (item.direction == CallDirection::Blocked) { + dirIcon = kIconBan; + dirCol = &colRed; + dirName = "Blocked"; + } else if (item.direction == CallDirection::Outgoing) { + dirIcon = kIconOutCall; + dirCol = &colBlue; + dirName = "Out"; + } else if (item.direction == CallDirection::Missed) { + dirIcon = kIconMissedCall; + dirCol = &colRed; + dirName = "Missed"; + } + + drawPango(layoutIcon, dirCol, 8, ry, rowH, dirIcon); + + std::string rightBadge = formatDuration(item.durationSec); + XftColor* badgeCol = isSel ? &colYellow : &colGreen; + if (item.isBlockedNumber) { + rightBadge = "BLK"; + badgeCol = &colRed; + } + int durW = 0; + if (!rightBadge.empty()) { + durW = pangoWidth(layoutSmall, rightBadge); + drawPango(layoutSmall, badgeCol, kWinWidth - durW - 6, ry + 3, 22, + rightBadge); + } + + std::string primary = + item.contactName.empty() ? item.number : item.contactName; + XftColor* priCol = + ((item.direction == CallDirection::Missed || + item.direction == CallDirection::Blocked || + item.isBlockedNumber) && + !isSel) + ? &colRed + : (isSel ? &colWhite : &colLight); + int priMaxW = (durW > 0) ? (kWinWidth - 36 - durW - 6) : 200; + drawPango(layoutMain, priCol, 30, ry + 3, 22, primary, priMaxW); + + int timeW = pangoWidth(layoutSmall, item.displayTime); + drawPango(layoutSmall, isSel ? &colWhite : &colMuted, + kWinWidth - timeW - 6, ry + 24, 19, item.displayTime); + + std::string secondary = + !item.contactName.empty() ? item.number : std::string(dirName); + int secMaxW = std::max(60, kWinWidth - 36 - timeW - 8); + drawPango(layoutSmall, isSel ? &colYellow : &colMuted, 30, ry + 24, + 19, secondary, secMaxW); + } + + if (total > kVisibleRows) { + int sbH = std::max(16, (kListH * kVisibleRows) / total); + int sbY = kListY + + ((kListH - sbH) * scrollOffset) / (total - kVisibleRows); + XSetForeground(dpy, gc, theme.spec.divider); + XFillRectangle(dpy, pix, gc, kWinWidth - 3, sbY, 3, sbH); + } + } + } else if (mode == ViewMode::Options) { + drawPango(layoutIcon, &colYellow, 8, 0, kHeaderH, kIconList); + drawPango(layoutMain, &colWhite, 28, 0, kHeaderH, "Call Log Options", 200); + XSetForeground(dpy, gc, theme.spec.border); + XFillRectangle(dpy, pix, gc, 0, kHeaderH - 1, kWinWidth, 1); + + constexpr int kOptVis = 6; + int total = static_cast(options.size()); + int scrollOffset = 0; + if (optionSelected >= kOptVis) { + scrollOffset = optionSelected - kOptVis + 1; + } + int rowH = kListH / kOptVis; + for (int i = 0; i < kOptVis; ++i) { + int idx = scrollOffset + i; + if (idx >= total) break; + int ry = kListY + i * rowH; + bool isSel = (idx == optionSelected); + XSetForeground( + dpy, gc, + isSel ? theme.spec.selBg + : ((i % 2 == 0) ? theme.spec.bgAltEven : theme.spec.bgAltOdd)); XFillRectangle(dpy, pix, gc, 0, ry, kWinWidth, rowH); - if (isSel) { - XSetForeground(dpy, gc, theme.spec.accent); + XSetForeground(dpy, gc, + options[idx].danger ? theme.spec.danger : theme.spec.accent); XFillRectangle(dpy, pix, gc, 0, ry, 4, rowH); } - - const CallLogItem& item = filtered[idx]; - const char* dirIcon = kIconInCall; - XftColor* dirCol = &colGreen; - const char* dirName = "In"; - if (item.direction == CallDirection::Outgoing) { - dirIcon = kIconOutCall; - dirCol = &colBlue; - dirName = "Out"; - } else if (item.direction == CallDirection::Missed) { - dirIcon = kIconMissedCall; - dirCol = &colRed; - dirName = "Missed"; - } - - drawPango(layoutIcon, dirCol, 8, ry, rowH, dirIcon); - - std::string dur = formatDuration(item.durationSec); - int durW = 0; - if (!dur.empty()) { - durW = pangoWidth(layoutSmall, dur); - drawPango(layoutSmall, isSel ? &colYellow : &colGreen, - kWinWidth - durW - 6, ry + 3, 22, dur); - } - - std::string primary = item.contactName.empty() ? item.number : item.contactName; - XftColor* priCol = (item.direction == CallDirection::Missed && !isSel) - ? &colRed - : (isSel ? &colWhite : &colLight); - int priMaxW = (durW > 0) ? (kWinWidth - 36 - durW - 6) : 200; - drawPango(layoutMain, priCol, 30, ry + 3, 22, primary, priMaxW); - - int timeW = pangoWidth(layoutSmall, item.displayTime); - drawPango(layoutSmall, isSel ? &colWhite : &colMuted, - kWinWidth - timeW - 6, ry + 24, 19, item.displayTime); - - std::string secondary = - !item.contactName.empty() ? item.number : std::string(dirName); - int secMaxW = std::max(60, kWinWidth - 36 - timeW - 8); - drawPango(layoutSmall, isSel ? &colYellow : &colMuted, 30, ry + 24, 19, - secondary, secMaxW); + XftColor* icCol = options[idx].danger + ? &colRed + : (isSel ? &colYellow : &colBlue); + XftColor* txCol = options[idx].danger + ? &colRed + : (isSel ? &colWhite : &colLight); + drawPango(layoutIcon, icCol, 10, ry, rowH, options[idx].icon); + drawPango(layoutMain, txCol, 34, ry, rowH, options[idx].label, + kWinWidth - 42); } + softLeft = "Select"; + softCenter = "OK"; + softRight = "Back"; + } else if (mode == ViewMode::Blocklist) { + drawPango(layoutIcon, &colRed, 8, 0, kHeaderH, kIconBan); + std::string hdr = + "Blocklist (" + std::to_string(blockList.entries().size()) + ")"; + drawPango(layoutMain, &colWhite, 28, 0, kHeaderH, hdr, 204); + XSetForeground(dpy, gc, theme.spec.border); + XFillRectangle(dpy, pix, gc, 0, kHeaderH - 1, kWinWidth, 1); - if (total > kVisibleRows) { - int sbH = std::max(16, (kListH * kVisibleRows) / total); - int sbY = kListY + - ((kListH - sbH) * scrollOffset) / (total - kVisibleRows); - XSetForeground(dpy, gc, theme.spec.divider); - XFillRectangle(dpy, pix, gc, kWinWidth - 3, sbY, 3, sbH); + const auto& entries = blockList.entries(); + if (entries.empty()) { + drawPango(layoutIcon, &colMuted, 112, kListY + 54, 24, kIconShield); + drawPango(layoutMain, &colMuted, 44, kListY + 84, 26, + "Blocklist is empty", 180); + drawPango(layoutSmall, &colMuted, 22, kListY + 114, 20, + "Left Softkey: Block a Number", 204); + } else { + int total = static_cast(entries.size()); + int scrollOffset = 0; + if (blockSelected >= kVisibleRows) { + scrollOffset = blockSelected - kVisibleRows + 1; + } + for (int i = 0; i < kVisibleRows; ++i) { + int idx = scrollOffset + i; + if (idx >= total) break; + int ry = kListY + (i * kListH) / kVisibleRows; + int nextRy = kListY + ((i + 1) * kListH) / kVisibleRows; + int rowH = nextRy - ry; + bool isSel = (idx == blockSelected); + XSetForeground( + dpy, gc, + isSel ? theme.spec.selBg + : ((i % 2 == 0) ? theme.spec.bgAltEven : theme.spec.bgAltOdd)); + XFillRectangle(dpy, pix, gc, 0, ry, kWinWidth, rowH); + if (isSel) { + XSetForeground(dpy, gc, theme.spec.danger); + XFillRectangle(dpy, pix, gc, 0, ry, 4, rowH); + } + const auto& e = entries[idx]; + std::string cname = book.resolveName(e.number); + std::string topLine = cname.empty() ? e.number : cname; + std::string subLine = + cname.empty() ? e.label : (e.number + " (" + e.label + ")"); + drawPango(layoutIcon, &colRed, 8, ry, rowH, kIconBan); + drawPango(layoutMain, isSel ? &colWhite : &colLight, 30, ry + 3, 22, + topLine, kWinWidth - 38); + drawPango(layoutSmall, isSel ? &colYellow : &colMuted, 30, ry + 24, + 19, subLine, kWinWidth - 38); + } } + softLeft = "Add New"; + softCenter = entries.empty() ? "" : "Unblock"; + softRight = "Back"; + } else if (mode == ViewMode::AddBlock) { + drawPango(layoutIcon, &colRed, 8, 0, kHeaderH, kIconBan); + drawPango(layoutMain, &colWhite, 28, 0, kHeaderH, "Block Phone Number", 204); + XSetForeground(dpy, gc, theme.spec.border); + XFillRectangle(dpy, pix, gc, 0, kHeaderH - 1, kWinWidth, 1); + + drawPango(layoutSmall, &colMuted, 12, kListY + 18, 20, + "Enter number or prefix (e.g. +1800*):", kWinWidth - 24); + XSetForeground(dpy, gc, theme.spec.bgAltOdd); + XFillRectangle(dpy, pix, gc, 12, kListY + 44, kWinWidth - 24, 34); + XSetForeground(dpy, gc, theme.spec.accent); + XDrawRectangle(dpy, pix, gc, 12, kListY + 44, kWinWidth - 25, 33); + + std::string disp = addBlockInput + "_"; + drawPango(layoutMain, &colWhite, 18, kListY + 47, 28, disp, kWinWidth - 36); + drawPango(layoutSmall, &colMuted, 12, kListY + 90, 20, + "0-9 / * / #: Digits #: + prefix", kWinWidth - 24); + drawPango(layoutSmall, &colMuted, 12, kListY + 112, 20, + "Left/Down: Backspace", kWinWidth - 24); + + softLeft = "Block"; + softCenter = "SAVE"; + softRight = "Cancel"; + } + + if (!toastMsg.empty() && nowMs() < toastUntilMs) { + int tw = std::min(kWinWidth - 16, pangoWidth(layoutSmall, toastMsg) + 20); + int tx = (kWinWidth - tw) / 2; + int ty = kWinHeight - kSoftbarH - 28; + XSetForeground(dpy, gc, theme.spec.selBg); + XFillRectangle(dpy, pix, gc, tx, ty, tw, 24); + XSetForeground(dpy, gc, theme.spec.accent); + XDrawRectangle(dpy, pix, gc, tx, ty, tw - 1, 23); + int textW = pangoWidth(layoutSmall, toastMsg); + drawPango(layoutSmall, &colYellow, tx + (tw - textW) / 2, ty + 2, 20, + toastMsg, tw - 8); } int sbY = kWinHeight - kSoftbarH; @@ -310,15 +558,21 @@ int calllog_run_main(int argc, char** argv) { XSetForeground(dpy, gc, theme.spec.border); XFillRectangle(dpy, pix, gc, 0, sbY, kWinWidth, 1); - drawPango(layoutMain, &colLight, 6, sbY + 1, kSoftbarH - 1, "Dialer"); - std::string centerLabel = "CALL"; - int cw = pangoWidth(layoutMain, centerLabel); - drawPango(layoutMain, filtered.empty() ? &colMuted : &colGreen, - (kWinWidth - cw) / 2, sbY + 1, kSoftbarH - 1, centerLabel); - std::string rightLabel = "Close"; - int rw = pangoWidth(layoutMain, rightLabel); + drawPango(layoutMain, &colLight, 6, sbY + 1, kSoftbarH - 1, softLeft); + if (!softCenter.empty()) { + int cw = pangoWidth(layoutMain, softCenter); + XftColor* cCol = &colGreen; + if (mode == ViewMode::Log && filtered.empty()) { + cCol = &colMuted; + } else if (mode == ViewMode::Blocklist) { + cCol = &colRed; + } + drawPango(layoutMain, cCol, (kWinWidth - cw) / 2, sbY + 1, kSoftbarH - 1, + softCenter); + } + int rw = pangoWidth(layoutMain, softRight); drawPango(layoutMain, &colLight, kWinWidth - rw - 6, sbY + 1, - kSoftbarH - 1, rightLabel); + kSoftbarH - 1, softRight); if (visible) { XCopyArea(dpy, pix, win, gc, 0, 0, kWinWidth, kWinHeight, 0, 0); @@ -326,9 +580,124 @@ int calllog_run_main(int argc, char** argv) { } }; + auto executeOption = [&](int optId) { + bool hasSel = (!filtered.empty() && selected >= 0 && + selected < static_cast(filtered.size())); + std::string selNum = hasSel ? filtered[selected].number : ""; + std::string selName = hasSel ? filtered[selected].contactName : ""; + + switch (optId) { + case 1: { // Call Number + if (!selNum.empty()) { + mode = ViewMode::Log; + writeSoftkeySuppress(nowMs() + 350); + XUngrabKeyboard(dpy, CurrentTime); + XUnmapWindow(dpy, win); + XFlush(dpy); + ::unlink(activePidPath.c_str()); + visible = false; + placePhoneCall(selNum); + } + break; + } + case 2: { // Open in Dialer + mode = ViewMode::Log; + XUngrabKeyboard(dpy, CurrentTime); + XUnmapWindow(dpy, win); + XFlush(dpy); + ::unlink(activePidPath.c_str()); + visible = false; + if (!sendPluginCommand("dialer", + selNum.empty() ? "OPEN" : ("OPEN " + selNum))) { + if (selNum.empty()) { + runAsyncArgv("xdialer"); + } else { + runAsyncArgv("xdialer", selNum.c_str()); + } + } + break; + } + case 3: { // Send SMS + if (!selNum.empty()) { + mode = ViewMode::Log; + XUngrabKeyboard(dpy, CurrentTime); + XUnmapWindow(dpy, win); + XFlush(dpy); + ::unlink(activePidPath.c_str()); + visible = false; + if (!sendPluginCommand("sms", "OPEN " + selNum)) { + runAsyncArgv("xsms", selNum.c_str()); + } + } + break; + } + case 4: { // Block / Unblock Number + if (!selNum.empty()) { + if (blockList.isBlocked(selNum)) { + blockList.unblockNumber(selNum); + showToast("Unblocked " + selNum); + } else { + blockList.blockNumber(selNum, selName.empty() ? "Call Log" : selName); + showToast("Blocked " + selNum); + } + reloadLogsIfNeeded(true); + } + mode = ViewMode::Log; + render(); + break; + } + case 5: { // Contacts + mode = ViewMode::Log; + XUngrabKeyboard(dpy, CurrentTime); + XUnmapWindow(dpy, win); + XFlush(dpy); + ::unlink(activePidPath.c_str()); + visible = false; + if (!sendPluginCommand("contacts", "OPEN")) { + runAsyncArgv("xcontacts"); + } + break; + } + case 6: { // Manage Blocklist + blockList.load(); + blockSelected = 0; + mode = ViewMode::Blocklist; + render(); + break; + } + case 7: { // Block a Number... + addBlockInput = selNum; + mode = ViewMode::AddBlock; + render(); + break; + } + case 8: { // Clear Spam Log + clearCallLogFile(getBlockedModemLogFilePath()); + reloadLogsIfNeeded(true); + showToast("Cleared blocked call log"); + mode = ViewMode::Log; + render(); + break; + } + case 9: { // Clear Call Log + clearCallLogFile(getModemLogFilePath()); + reloadLogsIfNeeded(true); + showToast("Cleared call history"); + mode = ViewMode::Log; + render(); + break; + } + default: + mode = ViewMode::Log; + render(); + break; + } + }; + // Pre-warm Pango/FreeType/Xrender glyph caches into offscreen Pixmap at startup drawPango(layoutIcon, &colGreen, 0, 0, 20, - std::string(kIconInCall) + kIconOutCall + kIconMissedCall + kIconPhoneLog); + std::string(kIconInCall) + kIconOutCall + kIconMissedCall + + kIconPhoneLog + kIconBan + kIconShield); render(); XSync(dpy, False); @@ -344,6 +713,7 @@ int calllog_run_main(int argc, char** argv) { initialSoftkeysReleased = (querySoftkeysDown(dpy) == 0); softkeyPending = 0; softkeyDeadlineMs = 0; + mode = ViewMode::Log; visible = true; XMapRaised(dpy, win); if (!themeChanged) { @@ -392,7 +762,8 @@ int calllog_run_main(int argc, char** argv) { visible = false; softkeyPending = 0; softkeyDeadlineMs = 0; - if (filterTab != 0 || selected != 0) { + if (mode != ViewMode::Log || filterTab != 0 || selected != 0) { + mode = ViewMode::Log; filterTab = 0; selected = 0; applyFilter(); @@ -422,6 +793,11 @@ int calllog_run_main(int argc, char** argv) { } } + if (visible && !toastMsg.empty() && nowMs() >= toastUntilMs) { + toastMsg.clear(); + render(); + } + if (visible && !initialSoftkeysReleased && querySoftkeysDown(dpy) == 0) { initialSoftkeysReleased = true; } @@ -485,6 +861,128 @@ int calllog_run_main(int argc, char** argv) { continue; } + if (mode == ViewMode::AddBlock) { + char dialCh = mapDialKey(sym, ev.xkey.keycode, ev.xkey.state); + if (dialCh == '#') { + if (addBlockInput.empty()) { + addBlockInput.push_back('+'); + } else { + addBlockInput.push_back('#'); + } + render(); + continue; + } else if (dialCh != '\0') { + addBlockInput.push_back(dialCh); + render(); + continue; + } + if (sym == XK_BackSpace || sym == XK_Left || sym == XK_Down) { + if (!addBlockInput.empty()) { + addBlockInput.pop_back(); + render(); + } + continue; + } else if (sym == XK_Escape) { + mode = ViewMode::Blocklist; + render(); + continue; + } else if (sym == XK_Return || sym == XK_KP_Enter) { + std::string num = trimStr(addBlockInput); + if (!normalizePhone(num).empty()) { + blockList.blockNumber(num, "Manual"); + reloadLogsIfNeeded(true); + showToast("Blocked " + num); + } + mode = ViewMode::Blocklist; + render(); + continue; + } + continue; + } + + if (mode == ViewMode::Options) { + switch (sym) { + case XK_Escape: + case XK_BackSpace: + case XK_Left: + mode = ViewMode::Log; + render(); + break; + case XK_Up: + case XK_KP_Up: + case XK_k: + if (!options.empty()) { + optionSelected = + (optionSelected + static_cast(options.size()) - 1) % + static_cast(options.size()); + render(); + } + break; + case XK_Down: + case XK_KP_Down: + case XK_j: + if (!options.empty()) { + optionSelected = + (optionSelected + 1) % static_cast(options.size()); + render(); + } + break; + case XK_Return: + case XK_KP_Enter: + if (!options.empty() && optionSelected >= 0 && + optionSelected < static_cast(options.size())) { + executeOption(options[optionSelected].id); + } + break; + default: + break; + } + continue; + } + + if (mode == ViewMode::Blocklist) { + switch (sym) { + case XK_Escape: + case XK_BackSpace: + case XK_Left: + mode = ViewMode::Log; + render(); + break; + case XK_Up: + case XK_KP_Up: + case XK_k: + if (!blockList.entries().empty()) { + int n = static_cast(blockList.entries().size()); + blockSelected = (blockSelected + n - 1) % n; + render(); + } + break; + case XK_Down: + case XK_KP_Down: + case XK_j: + if (!blockList.entries().empty()) { + int n = static_cast(blockList.entries().size()); + blockSelected = (blockSelected + 1) % n; + render(); + } + break; + case XK_Return: + case XK_KP_Enter: + if (!blockList.entries().empty() && blockSelected >= 0 && + blockSelected < static_cast(blockList.entries().size())) { + std::string num = blockList.entries()[blockSelected].number; + blockList.unblockNumber(num); + reloadLogsIfNeeded(true); + showToast("Unblocked " + num); + render(); + } + break; + default: + break; + } + continue; + } + char dialCh = mapDialKey(sym, ev.xkey.keycode, ev.xkey.state); if (dialCh != '\0') { std::string arg(1, dialCh); @@ -505,7 +1003,7 @@ int calllog_run_main(int argc, char** argv) { case XK_Left: case XK_KP_Left: case XK_h: - filterTab = (filterTab + 3) % 4; + filterTab = (filterTab + kNumTabs - 1) % kNumTabs; selected = 0; applyFilter(); render(); @@ -513,7 +1011,7 @@ int calllog_run_main(int argc, char** argv) { case XK_Right: case XK_KP_Right: case XK_l: - filterTab = (filterTab + 1) % 4; + filterTab = (filterTab + 1) % kNumTabs; selected = 0; applyFilter(); render(); @@ -549,9 +1047,16 @@ int calllog_run_main(int argc, char** argv) { hideWindow(true); placePhoneCall(num); } else if (filtered.empty()) { - hideWindow(false); - if (!sendPluginCommand("dialer", "OPEN")) { - runAsyncArgv("xdialer"); + if (filterTab == 4) { + blockList.load(); + blockSelected = 0; + mode = ViewMode::Blocklist; + render(); + } else { + hideWindow(false); + if (!sendPluginCommand("dialer", "OPEN")) { + runAsyncArgv("xdialer"); + } } } break; @@ -572,22 +1077,40 @@ int calllog_run_main(int argc, char** argv) { runAsyncArgv("xdrawer"); } } else if (comb == 1) { - std::string arg; - if (!filtered.empty() && selected >= 0 && - selected < static_cast(filtered.size())) { - arg = filtered[selected].number; - } - hideWindow(false); - if (!sendPluginCommand("dialer", arg.empty() ? "OPEN" : ("OPEN " + arg))) { - if (arg.empty()) { - runAsyncArgv("xdialer"); - } else { - runAsyncArgv("xdialer", arg.c_str()); + if (mode == ViewMode::Log) { + buildOptions(); + mode = ViewMode::Options; + render(); + } else if (mode == ViewMode::Options) { + if (!options.empty() && optionSelected >= 0 && + optionSelected < static_cast(options.size())) { + executeOption(options[optionSelected].id); } + } else if (mode == ViewMode::Blocklist) { + addBlockInput.clear(); + mode = ViewMode::AddBlock; + render(); + } else if (mode == ViewMode::AddBlock) { + std::string num = trimStr(addBlockInput); + if (!normalizePhone(num).empty()) { + blockList.blockNumber(num, "Manual"); + reloadLogsIfNeeded(true); + showToast("Blocked " + num); + } + mode = ViewMode::Blocklist; + render(); } } else if (comb == 2) { - writeSoftkeySuppress(nowMs() + 350); - hideWindow(true); + if (mode == ViewMode::AddBlock) { + mode = ViewMode::Blocklist; + render(); + } else if (mode == ViewMode::Options || mode == ViewMode::Blocklist) { + mode = ViewMode::Log; + render(); + } else { + writeSoftkeySuppress(nowMs() + 350); + hideWindow(true); + } } } @@ -653,46 +1176,24 @@ int calllog_on_global_key(const DwmHostApi* host, KeySym keysym, } return 1; } - } - return 0; -} - -int calllog_on_idle_key(const DwmHostApi* host, KeySym keysym, - unsigned int keycode, unsigned int state) { - if (!host || !host->is_idle_desktop || !host->is_idle_desktop() || state != 0) { - return 0; - } - if (keysym == XF86XK_Phone || keysym == XF86XK_PickupPhone || keycode == 177) { - if (isCallRingingFast()) { - if (!sendPluginCommand("callscreen", "ACCEPT")) { - runAsyncArgv("xcallscreen", "accept"); - } - return 1; - } - if (isCallActiveOrRingingFast()) { - if (!sendPluginCommand("callscreen", "OPEN")) { - runAsyncArgv("xcallscreen"); - } - return 1; - } - if (host->spawn_plugin) { - host->spawn_plugin("calllog", nullptr); + if (!sendPluginCommand("calllog", "OPEN")) { + runAsyncArgv("xcalllog"); } return 1; } return 0; } -} // namespace +} // namespace extern "C" __attribute__((visibility("default"))) const DwmPlugin dwm_plugin_entry = { DWM_PLUGIN_API_VERSION, "calllog", - "Keypad-driven call log viewer & dialer launcher (opens on idle Call key)", + "Preloaded resident X11 call log viewer, anti-spam blocklist & dialer launcher", calllog_plugin_init, nullptr, nullptr, - calllog_on_idle_key, + nullptr, calllog_on_global_key, calllog_run_main }; diff --git a/src/dwm-plugins/files_plugin.cpp b/src/dwm-plugins/files_plugin.cpp index 74f6b1e..c35f12c 100644 --- a/src/dwm-plugins/files_plugin.cpp +++ b/src/dwm-plugins/files_plugin.cpp @@ -118,6 +118,10 @@ bool isMediaExt(const std::string& ext) { ext == "avi"; } +bool isGameBoyExt(const std::string& ext) { + return ext == "gb" || ext == "gbc"; +} + bool isLikelyTextFile(const std::string& path, off_t size) { if (size == 0) return true; if (size > 256 * 1024) return false; @@ -612,6 +616,8 @@ int runFilesApp(int argc, char** argv) { } else if (isAudioExt(ext)) { actionsList.push_back({1, kIconMusic, "Play in Music Player"}); actionsList.push_back({15, kIconBell, "Set as Ringtone"}); + } else if (isGameBoyExt(ext)) { + actionsList.push_back({1, kIconGamepad, "Play in Game Boy Emulator"}); } else { actionsList.push_back({1, kIconEye, "Open / View"}); } @@ -689,6 +695,10 @@ int runFilesApp(int argc, char** argv) { } else if (isAudioExt(ext)) { openInMusicPlayer(item.fullPath); return; + } else if (isGameBoyExt(ext)) { + hideWindow(); + runAsyncArgv("gambatte", item.fullPath.c_str()); + return; } else if (isMediaExt(ext)) { hideWindow(); runAsyncArgv("sxmo_open.sh", item.fullPath.c_str()); @@ -832,6 +842,9 @@ int runFilesApp(int argc, char** argv) { } else if (isMediaExt(ext)) { ic = kIconMusic; icCol = &colBlue; + } else if (isGameBoyExt(ext)) { + ic = kIconGamepad; + icCol = &colYellow; } else if (it.isExec || ext == "sh") { ic = kIconTerm; icCol = &colOrange; diff --git a/src/dwm-plugins/phone_data.h b/src/dwm-plugins/phone_data.h index c2af4f6..19f76cb 100644 --- a/src/dwm-plugins/phone_data.h +++ b/src/dwm-plugins/phone_data.h @@ -93,6 +93,9 @@ constexpr const char* kIconToggleOff = "\xef\x88\x84"; // U+F204 toggle off constexpr const char* kIconKey = "\xef\x82\x84"; // U+F084 key / PIN constexpr const char* kIconSim = "\xf3\xb0\x99\x95"; // U+F0655 nf-md-sim constexpr const char* kIconBell = "\xef\x83\xb3"; // U+F0F3 bell / ringtone +constexpr const char* kIconBan = "\xef\x81\x9e"; // U+F05E ban / block +constexpr const char* kIconShield = "\xef\x84\xb2"; // U+F132 shield / anti-spam +constexpr const char* kIconGamepad = "\xef\x84\x9b"; // U+F11B gamepad / emulator inline int64_t nowMs() { struct timespec ts {}; @@ -947,10 +950,247 @@ class ContactBook { std::unordered_map suffixMap_; }; +inline std::string getBlockFilePath() { + const char* env = std::getenv("SXMO_BLOCKFILE"); + if (env && env[0]) { + return env; + } + const char* xdg = std::getenv("XDG_CONFIG_HOME"); + if (xdg && xdg[0]) { + return std::string(xdg) + "/sxmo/block.tsv"; + } + const char* home = std::getenv("HOME"); + return std::string(home && home[0] ? home : "/home/user") + + "/.config/sxmo/block.tsv"; +} + +inline std::string getBlockDirPath() { + const char* env = std::getenv("SXMO_BLOCKDIR"); + if (env && env[0]) { + return env; + } + const char* xdg = std::getenv("XDG_DATA_HOME"); + if (xdg && xdg[0]) { + return std::string(xdg) + "/sxmo/block"; + } + const char* home = std::getenv("HOME"); + return std::string(home && home[0] ? home : "/home/user") + + "/.local/share/sxmo/block"; +} + +inline std::string getBlockedModemLogFilePath() { + return getBlockDirPath() + "/modemlog.tsv"; +} + +struct BlockEntry { + std::string number; + std::string normNumber; + std::string label; +}; + +class BlockList { + public: + void load() { + entries_.clear(); + exactSet_.clear(); + suffixSet_.clear(); + + std::ifstream bf(getBlockFilePath()); + std::string line; + while (std::getline(bf, line)) { + if (!line.empty() && line.back() == '\r') { + line.pop_back(); + } + if (line.empty()) { + continue; + } + size_t tab = line.find('\t'); + std::string num = trimStr(tab == std::string::npos ? line : line.substr(0, tab)); + std::string lbl = tab == std::string::npos ? "" : trimStr(line.substr(tab + 1)); + std::string norm = normalizePhone(num); + if (norm.empty()) { + continue; + } + BlockEntry e; + e.number = num; + e.normNumber = norm; + e.label = lbl.empty() ? "Blocked" : lbl; + entries_.push_back(e); + exactSet_.insert(norm); + std::string sfx = phoneSuffixKey(norm); + if (sfx.size() >= 7) { + suffixSet_.insert(sfx); + } + } + } + + bool isBlocked(const std::string& rawNumber) const { + std::string norm = normalizePhone(rawNumber); + if (norm.empty()) { + return false; + } + if (exactSet_.count(norm) > 0) { + return true; + } + std::string sfx = phoneSuffixKey(norm); + if (sfx.size() >= 7 && suffixSet_.count(sfx) > 0) { + return true; + } + for (const auto& e : entries_) { + if (!e.normNumber.empty() && e.normNumber.back() == '*' && + e.normNumber.size() > 1) { + std::string prefix = e.normNumber.substr(0, e.normNumber.size() - 1); + if (norm.rfind(prefix, 0) == 0) { + return true; + } + } + } + return false; + } + + bool blockNumber(const std::string& rawNumber, + const std::string& labelRaw = "") { + std::string num = trimStr(rawNumber); + std::string norm = normalizePhone(num); + if (norm.empty()) { + return false; + } + if (num.find('\t') != std::string::npos || + num.find('\n') != std::string::npos) { + num = norm; + } + std::string label = trimStr(labelRaw); + for (char& ch : label) { + if (ch == '\t' || ch == '\r' || ch == '\n') { + ch = ' '; + } + } + if (label.empty()) { + label = "Blocked"; + } + + std::string path = getBlockFilePath(); + ContactBook::ensureParentDir(path); + + std::vector> rows; + { + std::ifstream in(path); + std::string line; + while (std::getline(in, line)) { + if (!line.empty() && line.back() == '\r') { + line.pop_back(); + } + if (line.empty()) continue; + size_t tab = line.find('\t'); + std::string rNum = trimStr(tab == std::string::npos ? line : line.substr(0, tab)); + std::string rLbl = tab == std::string::npos ? "Blocked" : trimStr(line.substr(tab + 1)); + if (!normalizePhone(rNum).empty()) { + rows.push_back({rNum, rLbl.empty() ? "Blocked" : rLbl}); + } + } + } + + std::string sfx = phoneSuffixKey(norm); + bool updated = false; + for (auto& r : rows) { + std::string rNorm = normalizePhone(r.first); + std::string rSfx = phoneSuffixKey(rNorm); + if (rNorm == norm || (sfx.size() >= 7 && rSfx == sfx)) { + r.first = num; + if (!labelRaw.empty()) { + r.second = label; + } + updated = true; + break; + } + } + if (!updated) { + rows.push_back({num, label}); + } + + std::ofstream out(path, std::ios::trunc); + if (!out.is_open()) { + return false; + } + for (const auto& r : rows) { + out << r.first << "\t" << r.second << "\n"; + } + out.close(); + load(); + return true; + } + + bool unblockNumber(const std::string& rawNumber) { + std::string norm = normalizePhone(rawNumber); + if (norm.empty()) { + return false; + } + std::string sfx = phoneSuffixKey(norm); + std::string path = getBlockFilePath(); + std::vector> rows; + bool removed = false; + { + std::ifstream in(path); + std::string line; + while (std::getline(in, line)) { + if (!line.empty() && line.back() == '\r') { + line.pop_back(); + } + if (line.empty()) continue; + size_t tab = line.find('\t'); + std::string rNum = trimStr(tab == std::string::npos ? line : line.substr(0, tab)); + std::string rLbl = tab == std::string::npos ? "Blocked" : trimStr(line.substr(tab + 1)); + std::string rNorm = normalizePhone(rNum); + if (rNorm.empty()) continue; + std::string rSfx = phoneSuffixKey(rNorm); + if (rNorm == norm || (sfx.size() >= 7 && rSfx == sfx)) { + removed = true; + continue; + } + rows.push_back({rNum, rLbl.empty() ? "Blocked" : rLbl}); + } + } + if (!removed) { + return false; + } + ContactBook::ensureParentDir(path); + std::ofstream out(path, std::ios::trunc); + if (!out.is_open()) { + return false; + } + for (const auto& r : rows) { + out << r.first << "\t" << r.second << "\n"; + } + out.close(); + load(); + return true; + } + + bool clearAll() { + std::string path = getBlockFilePath(); + ContactBook::ensureParentDir(path); + std::ofstream out(path, std::ios::trunc); + if (!out.is_open()) { + return false; + } + out.close(); + load(); + return true; + } + + const std::vector& entries() const { return entries_; } + + private: + std::vector entries_; + std::unordered_set exactSet_; + std::unordered_set suffixSet_; +}; + enum class CallDirection { Incoming = 0, Outgoing = 1, Missed = 2, + Blocked = 3, }; struct CallLogItem { @@ -959,6 +1199,7 @@ struct CallLogItem { std::string contactName; std::string displayTime; int durationSec = 0; + bool isBlockedNumber = false; }; inline time_t parseIsoTime(const std::string& iso) { @@ -999,8 +1240,10 @@ inline std::string formatDuration(int sec) { return buf; } -inline std::vector loadCallLog(const ContactBook& book) { - std::ifstream lf(getModemLogFilePath()); +inline std::vector loadCallLogFromFile(const ContactBook& book, + const std::string& logPath, + bool forceBlockedDir = false) { + std::ifstream lf(logPath); std::string line; struct ActiveSession { @@ -1022,7 +1265,7 @@ inline std::vector loadCallLog(const ContactBook& book) { return; } CallLogItem item; - item.direction = cur.dir; + item.direction = forceBlockedDir ? CallDirection::Blocked : cur.dir; item.number = cur.number; item.contactName = book.resolveName(cur.number); item.displayTime = formatShortTime(cur.startTimeStr); @@ -1053,10 +1296,24 @@ inline std::vector loadCallLog(const ContactBook& book) { time_t epoch = parseIsoTime(ts); - if (evt == "call_ring") { + if (evt == "call_blocked") { + if (cur.active && normalizePhone(cur.number) == normalizePhone(num)) { + cur.dir = CallDirection::Blocked; + flushSession(); + } else { + flushSession(); + CallLogItem item; + item.direction = CallDirection::Blocked; + item.number = num; + item.contactName = book.resolveName(num); + item.displayTime = formatShortTime(ts); + item.durationSec = 0; + history.push_back(item); + } + } else if (evt == "call_ring") { flushSession(); cur.active = true; - cur.dir = CallDirection::Missed; + cur.dir = forceBlockedDir ? CallDirection::Blocked : CallDirection::Missed; cur.number = num; cur.startTimeStr = ts; cur.startEpoch = epoch; @@ -1088,12 +1345,12 @@ inline std::vector loadCallLog(const ContactBook& book) { } } else if (evt == "call_missed") { if (cur.active && normalizePhone(cur.number) == normalizePhone(num)) { - cur.dir = CallDirection::Missed; + cur.dir = forceBlockedDir ? CallDirection::Blocked : CallDirection::Missed; flushSession(); } else { flushSession(); CallLogItem item; - item.direction = CallDirection::Missed; + item.direction = forceBlockedDir ? CallDirection::Blocked : CallDirection::Missed; item.number = num; item.contactName = book.resolveName(num); item.displayTime = formatShortTime(ts); @@ -1105,10 +1362,10 @@ inline std::vector loadCallLog(const ContactBook& book) { if (cur.active && normalizePhone(cur.number) == normalizePhone(num)) { if (evt == "call_discard" && !cur.answered && cur.dir != CallDirection::Outgoing) { - cur.dir = CallDirection::Missed; + cur.dir = forceBlockedDir ? CallDirection::Blocked : CallDirection::Missed; } CallLogItem item; - item.direction = cur.dir; + item.direction = forceBlockedDir ? CallDirection::Blocked : cur.dir; item.number = cur.number; item.contactName = book.resolveName(cur.number); item.displayTime = formatShortTime(cur.startTimeStr); @@ -1126,6 +1383,44 @@ inline std::vector loadCallLog(const ContactBook& book) { return history; } +inline std::vector loadCallLog(const ContactBook& book) { + return loadCallLogFromFile(book, getModemLogFilePath(), false); +} + +inline std::vector loadBlockedCallLog(const ContactBook& book) { + return loadCallLogFromFile(book, getBlockedModemLogFilePath(), true); +} + +inline bool clearCallLogFile(const std::string& logPath) { + std::ifstream in(logPath); + if (!in.is_open()) { + return true; + } + std::vector keep; + std::string line; + while (std::getline(in, line)) { + if (line.empty()) continue; + size_t t1 = line.find('\t'); + if (t1 == std::string::npos) continue; + size_t t2 = line.find('\t', t1 + 1); + if (t2 == std::string::npos) continue; + std::string evt = trimStr(line.substr(t1 + 1, t2 - t1 - 1)); + if (evt.rfind("call_", 0) == 0 || evt == "ring_muted") { + continue; + } + keep.push_back(line); + } + in.close(); + std::ofstream out(logPath, std::ios::trunc); + if (!out.is_open()) { + return false; + } + for (const auto& l : keep) { + out << l << "\n"; + } + return true; +} + inline void placePhoneCall(const std::string& rawNumber) { std::string num = normalizePhone(rawNumber); if (num.empty()) { @@ -1285,6 +1580,7 @@ struct SmsThread { time_t lastEpoch = 0; bool lastIncoming = true; bool hasDraft = false; + bool isBlocked = false; int messageCount = 0; }; @@ -1319,9 +1615,12 @@ inline bool parseSmsHeaderLine(const std::string& line, return false; } -inline std::vector loadSmsThreadMessages(const std::string& number) { +inline std::vector loadSmsThreadMessages( + const std::string& number, + const std::string& customBaseDir = "") { std::vector msgs; - std::string path = getModemLogDirPath() + "/" + number + "/sms.txt"; + std::string baseDir = customBaseDir.empty() ? getModemLogDirPath() : customBaseDir; + std::string path = baseDir + "/" + number + "/sms.txt"; std::ifstream in(path); if (!in.is_open()) { return msgs; @@ -1424,11 +1723,13 @@ inline void removeSmsDraft(const std::string& number) { ::unlink(path.c_str()); } -inline bool deleteSmsThread(const std::string& number) { +inline bool deleteSmsThread(const std::string& number, + const std::string& customBaseDir = "") { if (number.empty()) { return false; } - std::string dir = getModemLogDirPath() + "/" + number; + std::string baseDir = customBaseDir.empty() ? getModemLogDirPath() : customBaseDir; + std::string dir = baseDir + "/" + number; std::string smsPath = dir + "/sms.txt"; std::string draftPath = dir + "/draft.txt"; ::unlink(smsPath.c_str()); @@ -1437,9 +1738,42 @@ inline bool deleteSmsThread(const std::string& number) { return true; } -inline std::vector loadSmsThreads(const ContactBook& book) { +inline bool moveSmsThreadBetweenDirs(const std::string& number, + const std::string& fromBaseDir, + const std::string& toBaseDir) { + if (number.empty()) { + return false; + } + std::string srcPath = fromBaseDir + "/" + number + "/sms.txt"; + std::ifstream in(srcPath); + if (!in.is_open()) { + return false; + } + std::ostringstream ss; + ss << in.rdbuf(); + in.close(); + std::string content = ss.str(); + if (content.empty()) { + return false; + } + std::string dstPath = toBaseDir + "/" + number + "/sms.txt"; + ContactBook::ensureParentDir(dstPath); + std::ofstream out(dstPath, std::ios::app); + if (!out.is_open()) { + return false; + } + out << content; + out.close(); + deleteSmsThread(number, fromBaseDir); + return true; +} + +inline std::vector loadSmsThreads( + const ContactBook& book, + const std::string& customBaseDir = "") { std::vector threads; - std::string baseDir = getModemLogDirPath(); + bool isSpamDir = !customBaseDir.empty(); + std::string baseDir = isSpamDir ? customBaseDir : getModemLogDirPath(); DIR* d = ::opendir(baseDir.c_str()); if (!d) { return threads; @@ -1459,13 +1793,13 @@ inline std::vector loadSmsThreads(const ContactBook& book) { std::string smsPath = subDir + "/sms.txt"; std::string draftPath = subDir + "/draft.txt"; bool hasSms = (::access(smsPath.c_str(), R_OK) == 0); - std::string draft = loadSmsDraft(name); + std::string draft = isSpamDir ? "" : loadSmsDraft(name); bool hasDraft = !draft.empty(); if (!hasSms && !hasDraft) { continue; } - auto msgs = loadSmsThreadMessages(name); + auto msgs = loadSmsThreadMessages(name, baseDir); if (msgs.empty() && !hasDraft) { continue; } diff --git a/src/dwm-plugins/sms_plugin.cpp b/src/dwm-plugins/sms_plugin.cpp index 5ae648c..f19a267 100644 --- a/src/dwm-plugins/sms_plugin.cpp +++ b/src/dwm-plugins/sms_plugin.cpp @@ -28,6 +28,8 @@ enum class ViewMode { PickContact = 3, Options = 4, ConfirmDelete = 5, + Blocklist = 6, + AddBlock = 7, }; enum class TextCaseMode { @@ -171,6 +173,9 @@ int runSmsApp(int argc, char** argv) { auto& colRed = pt.colRed; ContactBook book; + BlockList blockList; + std::vector inboxThreads; + std::vector spamThreads; std::vector allThreads; std::vector filteredThreads; std::vector threadMessages; @@ -178,7 +183,10 @@ int runSmsApp(int argc, char** argv) { FileStamp contactsStamp; FileStamp modemLogStamp; + FileStamp blockFileStamp; + FileStamp blockLogStamp; bool loadedOnce = false; + bool viewingSpamFolder = false; ViewMode mode = ViewMode::Threads; ViewMode prevMode = ViewMode::Threads; @@ -188,6 +196,8 @@ int runSmsApp(int argc, char** argv) { int selectedOption = 0; int selectedPicker = 0; int confirmSelected = 0; + int blockSelected = 0; + std::string addBlockInput; std::string activeNumber; std::string composeRecipient; @@ -216,10 +226,15 @@ int runSmsApp(int argc, char** argv) { int id; std::string icon; std::string label; + bool danger = false; }; std::vector optionsList; auto updateFilter = [&]() { + allThreads = viewingSpamFolder ? spamThreads : inboxThreads; + for (auto& t : allThreads) { + t.isBlocked = viewingSpamFolder || blockList.isBlocked(t.number); + } filteredThreads.clear(); if (searchQuery.empty()) { filteredThreads = allThreads; @@ -247,13 +262,22 @@ int runSmsApp(int argc, char** argv) { auto reloadAllData = [&](bool force = false) { bool cChanged = contactsStamp.checkAndUpdate(getContactsFilePath()); bool lChanged = modemLogStamp.checkAndUpdate(getModemLogFilePath()); - if (force || cChanged || lChanged || !loadedOnce) { + bool bChanged = blockFileStamp.checkAndUpdate(getBlockFilePath()); + bool blChanged = blockLogStamp.checkAndUpdate(getBlockedModemLogFilePath()); + if (force || cChanged || lChanged || bChanged || blChanged || !loadedOnce) { loadedOnce = true; book.load(); - allThreads = loadSmsThreads(book); + blockList.load(); + inboxThreads = loadSmsThreads(book, getModemLogDirPath()); + spamThreads = loadSmsThreads(book, getBlockDirPath()); updateFilter(); + if (blockSelected >= static_cast(blockList.entries().size())) { + blockSelected = std::max(0, static_cast(blockList.entries().size()) - 1); + } if (!activeNumber.empty()) { - threadMessages = loadSmsThreadMessages(activeNumber); + std::string curBase = + viewingSpamFolder ? getBlockDirPath() : getModemLogDirPath(); + threadMessages = loadSmsThreadMessages(activeNumber, curBase); if (selectedMsg >= static_cast(threadMessages.size())) { selectedMsg = std::max(0, static_cast(threadMessages.size()) - 1); @@ -266,7 +290,9 @@ int runSmsApp(int argc, char** argv) { auto openThreadView = [&](const std::string& num) { activeNumber = trimStr(num); - threadMessages = loadSmsThreadMessages(activeNumber); + std::string curBase = + viewingSpamFolder ? getBlockDirPath() : getModemLogDirPath(); + threadMessages = loadSmsThreadMessages(activeNumber, curBase); selectedMsg = std::max(0, static_cast(threadMessages.size()) - 1); mode = ViewMode::ThreadView; }; @@ -289,22 +315,55 @@ int runSmsApp(int argc, char** argv) { auto buildOptions = [&]() { optionsList.clear(); if (mode == ViewMode::Threads) { - optionsList.push_back({1, kIconPlus, "New Message"}); + optionsList.push_back({1, kIconPlus, "New Message", false}); if (!filteredThreads.empty()) { - optionsList.push_back({2, kIconEye, "Open Conversation"}); - optionsList.push_back({3, kIconSend, "Reply to Selected"}); - optionsList.push_back({4, kIconPhone, "Call Contact"}); - optionsList.push_back({5, kIconUser, "Open in Contacts"}); - optionsList.push_back({6, kIconTrash, "Delete Conversation"}); + const auto& selTh = filteredThreads[selectedThread]; + bool isBlk = blockList.isBlocked(selTh.number); + optionsList.push_back({2, kIconEye, "Open Conversation", false}); + optionsList.push_back({3, kIconSend, "Reply to Selected", false}); + optionsList.push_back({4, kIconPhone, "Call Contact", false}); + if (isBlk || viewingSpamFolder) { + optionsList.push_back({8, kIconCheck, "Unblock & Restore", false}); + } else { + optionsList.push_back({8, kIconBan, "Block Number (Spam)", true}); + } + optionsList.push_back({5, kIconUser, "Open in Contacts", false}); + optionsList.push_back({6, kIconTrash, "Delete Conversation", true}); } + if (viewingSpamFolder) { + optionsList.push_back( + {9, kIconSms, + "Switch to Inbox (" + std::to_string(inboxThreads.size()) + ")", + false}); + } else { + optionsList.push_back( + {9, kIconShield, + "Spam Folder (" + std::to_string(spamThreads.size()) + ")", + false}); + } + optionsList.push_back( + {10, kIconBan, + "Manage Blocklist (" + std::to_string(blockList.entries().size()) + ")", + false}); + optionsList.push_back({11, kIconPlus, "Block a Number...", false}); } else if (mode == ViewMode::ThreadView) { - optionsList.push_back({3, kIconSend, "Reply / Compose"}); - optionsList.push_back({4, kIconPhone, "Call Contact"}); + bool isBlk = blockList.isBlocked(activeNumber); + optionsList.push_back({3, kIconSend, "Reply / Compose", false}); + optionsList.push_back({4, kIconPhone, "Call Contact", false}); if (!threadMessages.empty()) { - optionsList.push_back({7, kIconCopy, "Forward Selected Msg"}); + optionsList.push_back({7, kIconCopy, "Forward Selected Msg", false}); } - optionsList.push_back({5, kIconUser, "Save / View Contact"}); - optionsList.push_back({6, kIconTrash, "Delete Conversation"}); + if (isBlk || viewingSpamFolder) { + optionsList.push_back({8, kIconCheck, "Unblock & Restore", false}); + } else { + optionsList.push_back({8, kIconBan, "Block Number (Spam)", true}); + } + optionsList.push_back({5, kIconUser, "Save / View Contact", false}); + optionsList.push_back({6, kIconTrash, "Delete Conversation", true}); + optionsList.push_back( + {10, kIconBan, + "Manage Blocklist (" + std::to_string(blockList.entries().size()) + ")", + false}); } selectedOption = 0; }; @@ -462,9 +521,13 @@ int runSmsApp(int argc, char** argv) { XDrawLine(dpy, pix, gc, 0, 37, kWinWidth, 37); if (searchQuery.empty()) { - drawPango(layoutIcon, &colYellow, 8, 2, 34, kIconSms); - drawPango(layoutMain, &colWhite, 30, 2, 34, "Messages", 145); - std::string cnt = "[" + std::to_string(allThreads.size()) + "]"; + drawPango(layoutIcon, viewingSpamFolder ? &colRed : &colYellow, 8, 2, + 34, viewingSpamFolder ? kIconBan : kIconSms); + std::string hdrTitle = + viewingSpamFolder ? "Spam / Blocked" : "Messages"; + drawPango(layoutMain, viewingSpamFolder ? &colRed : &colWhite, 30, 2, + 34, hdrTitle, 145); + std::string cnt = "< [" + std::to_string(allThreads.size()) + "] >"; pango_layout_set_width(layoutSmall, -1); pango_layout_set_text(layoutSmall, cnt.c_str(), static_cast(cnt.size())); @@ -489,9 +552,15 @@ int runSmsApp(int argc, char** argv) { if (filteredThreads.empty()) { drawPango(layoutMain, &colMuted, 16, 110, 24, - searchQuery.empty() ? "No messages yet" : "No matches", 208); + searchQuery.empty() + ? (viewingSpamFolder ? "No blocked messages" + : "No messages yet") + : "No matches", + 208); drawPango(layoutSmall, &colBlue, 16, 138, 20, - "Press Left Softkey for New SMS", 208); + viewingSpamFolder ? "Left/Right: Switch to Inbox" + : "Left Softkey: Options / Blocklist", + 208); } else { int scroll = 0; if (selectedThread >= visibleRows) { @@ -515,17 +584,22 @@ int runSmsApp(int argc, char** argv) { XFillRectangle(dpy, pix, gc, 0, ry, kWinWidth, rowH - 1); } - const char* ic = th.hasDraft - ? kIconEdit - : (th.lastIncoming ? kIconInCall : kIconOutCall); - XftColor* icCol = th.hasDraft - ? &colYellow - : (th.lastIncoming ? &colGreen : &colBlue); + const char* ic = + th.isBlocked + ? kIconBan + : (th.hasDraft ? kIconEdit + : (th.lastIncoming ? kIconInCall : kIconOutCall)); + XftColor* icCol = + th.isBlocked + ? &colRed + : (th.hasDraft ? &colYellow + : (th.lastIncoming ? &colGreen : &colBlue)); drawPango(layoutIcon, icCol, 6, ry + 1, 20, ic); std::string title = th.contactName.empty() ? th.number : th.contactName; - drawPango(layoutMain, &colWhite, 26, ry + 1, 20, title, 128); + drawPango(layoutMain, th.isBlocked ? &colRed : &colWhite, 26, ry + 1, + 20, title, 128); if (!th.lastDisplayTime.empty()) { pango_layout_set_width(layoutSmall, -1); @@ -807,18 +881,89 @@ int runSmsApp(int argc, char** argv) { const int listY = 38; const int rowH = 36; - for (size_t i = 0; i < optionsList.size(); ++i) { - int ry = listY + static_cast(i) * rowH; - bool isSel = (static_cast(i) == selectedOption); + const int visRows = 6; + int scroll = 0; + if (selectedOption >= visRows) { + scroll = selectedOption - visRows + 1; + } + for (int i = 0; i < visRows; ++i) { + int idx = scroll + i; + if (idx >= static_cast(optionsList.size())) break; + int ry = listY + i * rowH; + bool isSel = (idx == selectedOption); XSetForeground(dpy, gc, isSel ? pt.spec.selBg : pt.spec.bgMain); XFillRectangle(dpy, pix, gc, 0, ry, kWinWidth, rowH - 1); - drawPango(layoutIcon, isSel ? &colYellow : &colBlue, 10, ry, rowH, - optionsList[i].icon); - drawPango(layoutMain, &colWhite, 34, ry, rowH, optionsList[i].label, - 198); + XftColor* icCol = + optionsList[idx].danger ? &colRed : (isSel ? &colYellow : &colBlue); + XftColor* txCol = optionsList[idx].danger ? &colRed : &colWhite; + drawPango(layoutIcon, icCol, 10, ry, rowH, optionsList[idx].icon); + drawPango(layoutMain, txCol, 34, ry, rowH, optionsList[idx].label, 198); } drawSoftkeyBar("Select", "Select", "Back"); + } else if (mode == ViewMode::Blocklist) { + XSetForeground(dpy, gc, pt.spec.bgHeader); + XFillRectangle(dpy, pix, gc, 0, 0, kWinWidth, 34); + drawPango(layoutIcon, &colRed, 8, 0, 34, kIconBan); + std::string hdr = + "Blocklist (" + std::to_string(blockList.entries().size()) + ")"; + drawPango(layoutMain, &colWhite, 30, 0, 34, hdr, 200); + + const auto& entries = blockList.entries(); + if (entries.empty()) { + drawPango(layoutIcon, &colMuted, 112, 94, 24, kIconShield); + drawPango(layoutMain, &colMuted, 44, 124, 24, "Blocklist is empty", + 180); + drawPango(layoutSmall, &colBlue, 22, 152, 20, + "Left Softkey: Block a Number", 204); + } else { + const int listY = 36; + const int rowH = 38; + const int visRows = 6; + int scroll = 0; + if (blockSelected >= visRows) { + scroll = blockSelected - visRows + 1; + } + for (int i = 0; i < visRows; ++i) { + int idx = scroll + i; + if (idx >= static_cast(entries.size())) break; + const auto& e = entries[idx]; + int ry = listY + i * rowH; + bool isSel = (idx == blockSelected); + XSetForeground(dpy, gc, isSel ? pt.spec.selBg : pt.spec.bgMain); + XFillRectangle(dpy, pix, gc, 0, ry, kWinWidth, rowH - 1); + std::string cname = book.resolveName(e.number); + std::string topLine = cname.empty() ? e.number : cname; + std::string subLine = + cname.empty() ? e.label : (e.number + " (" + e.label + ")"); + drawPango(layoutIcon, &colRed, 8, ry + 1, 20, kIconBan); + drawPango(layoutMain, &colWhite, 28, ry + 1, 20, topLine, 204); + drawPango(layoutSmall, isSel ? &colLight : &colMuted, 28, ry + 20, 16, + subLine, 204); + } + } + drawSoftkeyBar("Add New", entries.empty() ? "" : "Unblock", "Back"); + + } else if (mode == ViewMode::AddBlock) { + XSetForeground(dpy, gc, pt.spec.bgHeader); + XFillRectangle(dpy, pix, gc, 0, 0, kWinWidth, 34); + drawPango(layoutIcon, &colRed, 8, 0, 34, kIconBan); + drawPango(layoutMain, &colWhite, 30, 0, 34, "Block Phone Number", 200); + + drawPango(layoutSmall, &colMuted, 12, 54, 20, + "Enter number or prefix (e.g. +1800*):", 216); + XSetForeground(dpy, gc, pt.spec.bgInputFocus); + XFillRectangle(dpy, pix, gc, 12, 80, kWinWidth - 24, 34); + XSetForeground(dpy, gc, pt.spec.accentAlt); + XDrawRectangle(dpy, pix, gc, 12, 80, kWinWidth - 25, 33); + std::string disp = addBlockInput + "|"; + drawPango(layoutMain, &colWhite, 18, 83, 28, disp, kWinWidth - 36); + drawPango(layoutSmall, &colMuted, 12, 124, 20, + "0-9 / * / #: Digits #: + prefix", 216); + drawPango(layoutSmall, &colMuted, 12, 146, 20, + "BackSpace/Left: Delete digit", 216); + drawSoftkeyBar("Block", "Save", "Cancel"); + } else if (mode == ViewMode::ConfirmDelete) { XSetForeground(dpy, gc, pt.spec.bgHeader); XFillRectangle(dpy, pix, gc, 0, 0, kWinWidth, 36); @@ -997,6 +1142,49 @@ int runSmsApp(int argc, char** argv) { } else if (optId == 7 && !threadMessages.empty()) { std::string body = threadMessages[selectedMsg].text; openComposeView("", body); + } else if (optId == 8) { + std::string target = (prevMode == ViewMode::ThreadView) + ? activeNumber + : (!filteredThreads.empty() + ? filteredThreads[selectedThread].number + : ""); + if (!target.empty()) { + if (blockList.isBlocked(target) || viewingSpamFolder) { + blockList.unblockNumber(target); + moveSmsThreadBetweenDirs(target, getBlockDirPath(), + getModemLogDirPath()); + std::lock_guard lk(sendMutex); + statusBanner = "Unblocked & restored " + target; + statusBannerUntilMs = nowMs() + 2000; + } else { + std::string cname = book.resolveName(target); + blockList.blockNumber(target, cname.empty() ? "SMS Spam" : cname); + moveSmsThreadBetweenDirs(target, getModemLogDirPath(), + getBlockDirPath()); + std::lock_guard lk(sendMutex); + statusBanner = "Blocked " + target; + statusBannerUntilMs = nowMs() + 2000; + } + reloadAllData(true); + } + mode = ViewMode::Threads; + } else if (optId == 9) { + viewingSpamFolder = !viewingSpamFolder; + selectedThread = 0; + reloadAllData(true); + mode = ViewMode::Threads; + } else if (optId == 10) { + blockList.load(); + blockSelected = 0; + mode = ViewMode::Blocklist; + } else if (optId == 11) { + std::string target = (prevMode == ViewMode::ThreadView) + ? activeNumber + : (!filteredThreads.empty() + ? filteredThreads[selectedThread].number + : ""); + addBlockInput = target; + mode = ViewMode::AddBlock; } }; @@ -1010,6 +1198,10 @@ int runSmsApp(int argc, char** argv) { if (!searchQuery.empty()) { popUtf8Char(searchQuery); updateFilter(); + } else if (viewingSpamFolder) { + viewingSpamFolder = false; + selectedThread = 0; + updateFilter(); } else { hideWindow(); return; @@ -1066,10 +1258,40 @@ int runSmsApp(int argc, char** argv) { } else { mode = prevMode; } + } else if (mode == ViewMode::Blocklist) { + if (isLeft) { + addBlockInput.clear(); + mode = ViewMode::AddBlock; + } else { + reloadAllData(true); + mode = prevMode; + } + } else if (mode == ViewMode::AddBlock) { + if (isLeft) { + std::string num = trimStr(addBlockInput); + if (!normalizePhone(num).empty()) { + blockList.blockNumber(num, "SMS Blocklist"); + moveSmsThreadBetweenDirs(num, getModemLogDirPath(), + getBlockDirPath()); + reloadAllData(true); + std::lock_guard lk(sendMutex); + statusBanner = "Blocked " + num; + statusBannerUntilMs = nowMs() + 2000; + } + mode = ViewMode::Blocklist; + } else { + if (!addBlockInput.empty()) { + popUtf8Char(addBlockInput); + } else { + mode = ViewMode::Blocklist; + } + } } else if (mode == ViewMode::ConfirmDelete) { if (isLeft) { if (confirmSelected == 1) { - deleteSmsThread(activeNumber); + deleteSmsThread(activeNumber, viewingSpamFolder + ? getBlockDirPath() + : getModemLogDirPath()); reloadAllData(true); mode = ViewMode::Threads; } else { @@ -1189,7 +1411,13 @@ int runSmsApp(int argc, char** argv) { } if (mode == ViewMode::Threads) { - if (sym == XK_Up || sym == XK_KP_Up) { + if (sym == XK_Left || sym == XK_KP_Left || sym == XK_Right || + sym == XK_KP_Right) { + viewingSpamFolder = !viewingSpamFolder; + selectedThread = 0; + updateFilter(); + drawUI(); + } else if (sym == XK_Up || sym == XK_KP_Up) { if (!filteredThreads.empty()) { selectedThread = (selectedThread - 1 + static_cast(filteredThreads.size())) % @@ -1346,6 +1574,57 @@ int runSmsApp(int argc, char** argv) { } else if (sym == XK_Return || sym == XK_KP_Enter) { handleSoftkeyAction(true); } + } else if (mode == ViewMode::Blocklist) { + if (sym == XK_Up || sym == XK_KP_Up) { + if (!blockList.entries().empty()) { + int n = static_cast(blockList.entries().size()); + blockSelected = (blockSelected + n - 1) % n; + drawUI(); + } + } else if (sym == XK_Down || sym == XK_KP_Down) { + if (!blockList.entries().empty()) { + int n = static_cast(blockList.entries().size()); + blockSelected = (blockSelected + 1) % n; + drawUI(); + } + } else if (sym == XK_Return || sym == XK_KP_Enter) { + if (!blockList.entries().empty() && blockSelected >= 0 && + blockSelected < static_cast(blockList.entries().size())) { + std::string num = blockList.entries()[blockSelected].number; + blockList.unblockNumber(num); + moveSmsThreadBetweenDirs(num, getBlockDirPath(), + getModemLogDirPath()); + reloadAllData(true); + { + std::lock_guard lk(sendMutex); + statusBanner = "Unblocked " + num; + statusBannerUntilMs = nowMs() + 1800; + } + drawUI(); + } + } + } else if (mode == ViewMode::AddBlock) { + if (sym == XK_Left || sym == XK_KP_Left) { + if (!addBlockInput.empty()) { + popUtf8Char(addBlockInput); + drawUI(); + } + } else if (sym == XK_Return || sym == XK_KP_Enter) { + handleSoftkeyAction(true); + } else { + char d = mapDialKey(sym, kc, ev.xkey.state); + if (d == '#') { + if (addBlockInput.empty()) { + addBlockInput.push_back('+'); + } else { + addBlockInput.push_back('#'); + } + drawUI(); + } else if (d != '\0') { + addBlockInput.push_back(d); + drawUI(); + } + } } else if (mode == ViewMode::ConfirmDelete) { if (sym == XK_Up || sym == XK_Down || sym == XK_KP_Up || sym == XK_KP_Down) { diff --git a/src/games/gambatte/common/gambatte-array.h b/src/games/gambatte/common/gambatte-array.h new file mode 100644 index 0000000..629198e --- /dev/null +++ b/src/games/gambatte/common/gambatte-array.h @@ -0,0 +1,39 @@ +/*************************************************************************** + * Copyright (C) 2008 by Sindre Aamås * + * aamas@stud.ntnu.no * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License version 2 as * + * published by the Free Software Foundation. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License version 2 for more details. * + * * + * You should have received a copy of the GNU General Public License * + * version 2 along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ +#ifndef ARRAY_H +#define ARRAY_H + +#include +#include "uncopyable.h" + +template +class Array : Uncopyable { + T *a; + std::size_t sz; + +public: + explicit Array(const std::size_t size = 0) : a(size ? new T[size] : 0), sz(size) {} + ~Array() { delete []a; } + void reset(const std::size_t size = 0) { delete []a; a = size ? new T[size] : 0; sz = size; } + std::size_t size() const { return sz; } + T * get() const { return a; } + operator T*() const { return a; } +}; + +#endif diff --git a/src/games/gambatte/common/uncopyable.h b/src/games/gambatte/common/uncopyable.h new file mode 100644 index 0000000..71d77fe --- /dev/null +++ b/src/games/gambatte/common/uncopyable.h @@ -0,0 +1,29 @@ +/*************************************************************************** + * Copyright (C) 2009 by Sindre Aamås * + * aamas@stud.ntnu.no * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License version 2 as * + * published by the Free Software Foundation. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License version 2 for more details. * + * * + * You should have received a copy of the GNU General Public License * + * version 2 along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ +#ifndef UNCOPYABLE_H +#define UNCOPYABLE_H + +class Uncopyable { + Uncopyable(const Uncopyable&); + Uncopyable& operator=(const Uncopyable&); +public: + Uncopyable() {} +}; + +#endif diff --git a/src/games/gambatte/include/gambatte.h b/src/games/gambatte/include/gambatte.h new file mode 100644 index 0000000..7e5c43b --- /dev/null +++ b/src/games/gambatte/include/gambatte.h @@ -0,0 +1,162 @@ +/*************************************************************************** + * Copyright (C) 2007 by Sindre Aamås * + * aamas@stud.ntnu.no * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License version 2 as * + * published by the Free Software Foundation. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License version 2 for more details. * + * * + * You should have received a copy of the GNU General Public License * + * version 2 along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ +#ifndef GAMBATTE_H +#define GAMBATTE_H + +#include "inputgetter.h" +#ifdef HAVE_NETWORK +#include "serial_io.h" +#endif +#include "gbint.h" +#include +#include + +namespace gambatte { +#if defined(VIDEO_RGB565) || defined(VIDEO_ABGR1555) +typedef uint16_t video_pixel_t; +#else +typedef uint_least32_t video_pixel_t; +#endif +enum { BG_PALETTE = 0, SP1_PALETTE = 1, SP2_PALETTE = 2 }; + +class GB { +public: + GB(); + ~GB(); + + enum LoadFlag { + FORCE_DMG = 1, /**< Treat the ROM as not having CGB support regardless of what its header advertises. */ + GBA_CGB = 2, /**< Use GBA intial CPU register values when in CGB mode. */ + MULTICART_COMPAT = 4, /**< Use heuristics to detect and support some multicart MBCs disguised as MBC1. */ + FORCE_CGB = 8 + }; + + int load(const void *romdata, unsigned size, unsigned flags = 0); + + /** Emulates until at least 'samples' stereo sound samples are produced in the supplied buffer, + * or until a video frame has been drawn. + * + * There are 35112 stereo sound samples in a video frame. + * May run for uptil 2064 stereo samples too long. + * EDIT: Due to internal emulator bugs, may in fact run for + * an arbitrary number of samples... + * A stereo sample consists of two native endian 2s complement 16-bit PCM samples, + * with the left sample preceding the right one. Usually casting soundBuf to/from + * short* is OK and recommended. The reason for not using a short* in the interface + * is to avoid implementation-defined behaviour without compromising performance. + * + * Returns early when a new video frame has finished drawing in the video buffer, + * such that the caller may update the video output before the frame is overwritten. + * The return value indicates whether a new video frame has been drawn, and the + * exact time (in number of samples) at which it was drawn. + * + * @param videoBuf 160x144 RGB32 (native endian) video frame buffer or 0 + * @param pitch distance in number of pixels (not bytes) from the start of one line to the next in videoBuf. + * @param soundBuf buffer with space >= samples + 2064 + * @param soundBufSize actual size of soundBuf buffer + * @param samples in: number of stereo samples to produce, out: actual number of samples produced + * @return sample number at which the video frame was produced. -1 means no frame was produced. + */ + long runFor(gambatte::video_pixel_t *videoBuf, int pitch, + gambatte::uint_least32_t *soundBuf, std::size_t soundBufSize, unsigned &samples); + + /** Reset to initial state. + * Equivalent to reloading a ROM image, or turning a Game Boy Color off and on again. + */ + void reset(); + + /** @param palNum 0 <= palNum < 3. One of BG_PALETTE, SP1_PALETTE and SP2_PALETTE. + * @param colorNum 0 <= colorNum < 4 + */ + void setDmgPaletteColor(unsigned palNum, unsigned colorNum, unsigned rgb32); + + /** Sets the callback used for getting input state. */ + void setInputGetter(InputGetter *getInput); + + /** Sets the callback used for getting the bootloader data. */ + void setBootloaderGetter(bool (*getter)(void *userdata, bool isgbc, uint8_t *data, uint32_t buf_size)); + +#ifdef HAVE_NETWORK + /** Sets the callback used for transferring serial data. */ + void setSerialIO(SerialIO *serial_io); +#endif + + /** Sets the directory used for storing save data. The default is the same directory as the ROM Image file. */ + void setSaveDir(const std::string &sdir); + + void *savedata_ptr(); + unsigned savedata_size(); + void *rtcdata_ptr(); + unsigned rtcdata_size(); + + /** Returns true if the currently loaded ROM image is treated as having CGB support. */ + bool isCgb() const; + + /** Returns true if a ROM image is loaded. */ + bool isLoaded() const; + + void saveState(void *data); + /* Load a savestate previously produced by saveState. The size + * parameter must match the buffer length so the parser can + * reject malformed states without reading past the end of the + * buffer. Returns true on success. */ + bool loadState(const void *data, size_t size); + size_t stateSize() const; + + void setColorCorrection(bool enable); + void setColorCorrectionMode(unsigned colorCorrectionMode); + void setColorCorrectionBrightness(float colorCorrectionBrightness); + void setDarkFilterLevel(unsigned darkFilterLevel); + video_pixel_t gbcToRgb32(const unsigned bgr15); + + /** Set Game Genie codes to apply to currently loaded ROM image. Cleared on ROM load. + * @param codes Game Genie codes in format HHH-HHH-HHH;HHH-HHH-HHH;... where H is [0-9]|[A-F] + */ + void setGameGenie(const std::string &codes); + + /** Set Game Shark codes to apply to currently loaded ROM image. Cleared on ROM load. + * @param codes Game Shark codes in format 01HHHHHH;01HHHHHH;... where H is [0-9]|[A-F] + */ + void setGameShark(const std::string &codes); + + void clearCheats(); + +#ifdef __LIBRETRO__ + void *vram_ptr() const; + void *rambank0_ptr() const; + void *rambank1_ptr() const; + void *rambank2_ptr() const; + void *bankedram_ptr() const; + void *rombank0_ptr() const; + void *rombank1_ptr() const; + void *zeropage_ptr() const; + void *oamram_ptr() const; +#endif + +private: + struct Priv; + Priv *const p_; + + void loadState(const std::string &filepath, bool osdMessage); + GB(const GB &); + GB & operator=(const GB &); +}; +} + +#endif diff --git a/src/games/gambatte/include/gambatte_log.h b/src/games/gambatte/include/gambatte_log.h new file mode 100644 index 0000000..c575baa --- /dev/null +++ b/src/games/gambatte/include/gambatte_log.h @@ -0,0 +1,16 @@ +#ifndef GAMBATTE_LOG_H +#define GAMBATTE_LOG_H + +enum retro_log_level { + RETRO_LOG_DEBUG = 0, + RETRO_LOG_INFO, + RETRO_LOG_WARN, + RETRO_LOG_ERROR +}; + +static inline void gambatte_log(enum retro_log_level level, const char *format, ...) { + (void)level; + (void)format; +} + +#endif diff --git a/src/games/gambatte/include/gbint.h b/src/games/gambatte/include/gbint.h new file mode 100644 index 0000000..134e801 --- /dev/null +++ b/src/games/gambatte/include/gbint.h @@ -0,0 +1,62 @@ +/*************************************************************************** + * Copyright (C) 2007 by Sindre Aamås * + * aamas@stud.ntnu.no * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License version 2 as * + * published by the Free Software Foundation. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License version 2 for more details. * + * * + * You should have received a copy of the GNU General Public License * + * version 2 along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ +#ifndef GAMBATTE_INT_H +#define GAMBATTE_INT_H + +#ifdef HAVE_CSTDINT + +#include + +namespace gambatte { +using std::uint_least32_t; +using std::uint_least16_t; +} + +#elif defined(HAVE_STDINT_H) + +#include + +namespace gambatte { +using ::uint_least32_t; +using ::uint_least16_t; +} + +#else + +namespace gambatte { +#ifdef CHAR_LEAST_32 +typedef unsigned char uint_least32_t; +#elif defined(SHORT_LEAST_32) +typedef unsigned short uint_least32_t; +#elif defined(INT_LEAST_32) +typedef unsigned uint_least32_t; +#else +typedef unsigned long uint_least32_t; +#endif + +#ifdef CHAR_LEAST_16 +typedef unsigned char uint_least16_t; +#else +typedef unsigned short uint_least16_t; +#endif +} + +#endif + +#endif diff --git a/src/games/gambatte/include/inputgetter.h b/src/games/gambatte/include/inputgetter.h new file mode 100644 index 0000000..d280de1 --- /dev/null +++ b/src/games/gambatte/include/inputgetter.h @@ -0,0 +1,33 @@ +/*************************************************************************** + * Copyright (C) 2007 by Sindre Aamås * + * aamas@stud.ntnu.no * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License version 2 as * + * published by the Free Software Foundation. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License version 2 for more details. * + * * + * You should have received a copy of the GNU General Public License * + * version 2 along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ +#ifndef GAMBATTE_INPUTGETTER_H +#define GAMBATTE_INPUTGETTER_H + +namespace gambatte { +class InputGetter { +public: + enum { A = 0x01, B = 0x02, SELECT = 0x04, START = 0x08, RIGHT = 0x10, LEFT = 0x20, UP = 0x40, DOWN = 0x80 }; + virtual ~InputGetter() {}; + + /** @return A|B|SELECT|START|RIGHT|LEFT|UP|DOWN if those buttons are pressed. */ + virtual unsigned operator()() = 0; +}; +} + +#endif diff --git a/src/games/gambatte/src/bootloader.cpp b/src/games/gambatte/src/bootloader.cpp new file mode 100644 index 0000000..da9abc2 --- /dev/null +++ b/src/games/gambatte/src/bootloader.cpp @@ -0,0 +1,113 @@ +#include +#include +#include + +#include "bootloader.h" + +namespace gambatte { + +Bootloader::Bootloader() + : addrspace_start(NULL) + , bootloadersize(0) + , has_called_FF50(false) + , get_raw_bootloader_data(NULL) + , using_bootloader(false) +{ + /* bootromswapspace and rombackup are intentionally left + * uninitialized for performance (0x900 bytes each); they + * are written before any read in load(). All scalar members + * are now initialized so observers (e.g. choosebank() called + * before a successful load) cannot read garbage. */ +} + +void Bootloader::patch_gbc_to_gba_mode() { + /*moves one jump over another and puts ld b,0x01 into the original position*/ + uint16_t patchloc = 0xF2; + uint8_t patch[0x7] = {0xCD,0xD0,0x05/*<-call systemsetup*/,0x06,0x01/*<-ld b,0x1*/,0x00/*<-nop*/,0x00/*<-nop*/}; + std::memcpy(bootromswapspace + patchloc, patch, 0x7); +} + +void Bootloader::load(bool isgbc, bool isgba) { + if (get_raw_bootloader_data == NULL) { + using_bootloader = false; + return; + } + + //the gba only uses the gbc bios + if (isgba) + isgbc = true; + + bool bootloaderavail = get_raw_bootloader_data((void*)this, isgbc, bootromswapspace, 0x900/*buf_size*/); + if (!bootloaderavail) { + using_bootloader = false; + return; + } + + if (isgbc) + bootloadersize = 0x900; + else + bootloadersize = 0x100; + + if (isgba)//patch bootloader to fake gba mode + patch_gbc_to_gba_mode(); + + //backup rom segment that is shared with bootloader + std::memcpy(rombackup, (uint8_t*)addrspace_start, bootloadersize); + + //put back cartridge data in a 256 byte window of the bios that is not mapped(GBC only) + if (isgbc) + std::memcpy(bootromswapspace + 0x100, rombackup + 0x100, 0x100); + + //put bootloader in main memory + std::memcpy((uint8_t*)addrspace_start, bootromswapspace, bootloadersize); + + using_bootloader = true; +} + +void Bootloader::reset() { + bootloadersize = 0; + has_called_FF50 = false; + addrspace_start = NULL; + using_bootloader = false; +} + +void Bootloader::set_bootloader_getter(bool (*getter)(void* userdata, bool isgbc, uint8_t* data, uint32_t buf_size)) { + get_raw_bootloader_data = getter; +} + +void Bootloader::set_address_space_start(void* start) { + addrspace_start = start; +} + +void Bootloader::choosebank(bool inbootloader) { + //inbootloader = (state.mem.ioamhram.get()[0x150] != 0xFF);//do not uncomment this is just for reference + if (using_bootloader) { + + //switching from game to bootloader with savestate + if (inbootloader && has_called_FF50) + uncall_FF50(); + + //switching from bootloader to game with savestate + else if (!inbootloader && !has_called_FF50) + call_FF50(); + + //switching from game to game or bootloader to bootloader needs no changes + + } +} + +void Bootloader::call_FF50() { + if (!has_called_FF50 && using_bootloader) { + //put rom back in main memory when bootloader has finished + std::memcpy((uint8_t*)addrspace_start, rombackup, bootloadersize); + has_called_FF50 = true; + } +} + +//this is a developer function only,a real gameboy can never undo calling 0xFF50,this function is for savestate functionality +void Bootloader::uncall_FF50() { + std::memcpy((uint8_t*)addrspace_start, bootromswapspace, bootloadersize); + has_called_FF50 = false; +} + +} diff --git a/src/games/gambatte/src/bootloader.h b/src/games/gambatte/src/bootloader.h new file mode 100644 index 0000000..4a66d59 --- /dev/null +++ b/src/games/gambatte/src/bootloader.h @@ -0,0 +1,44 @@ +#ifndef BOOTLOADER_H +#define BOOTLOADER_H + +#include +#include + +namespace gambatte { + +class Bootloader { + +private: + uint8_t bootromswapspace[0x900]; + uint8_t rombackup[0x900]; + void* addrspace_start; + unsigned int bootloadersize; + bool has_called_FF50; + + //Set this to NULL or return false if you want to ignore bootloaders completely + //(initial value is NULL and so the bootloader is disabled by default) + bool (*get_raw_bootloader_data)(void* userdata, bool isgbc, uint8_t* data, uint32_t buf_size); + + void patch_gbc_to_gba_mode(); + void uncall_FF50(); + +public: + bool using_bootloader; + + Bootloader(); + void load(bool isgbc,bool isgba); + void reset(); + + void set_bootloader_getter(bool (*getter)(void* userdata, bool isgbc, uint8_t* data, uint32_t buf_size)); + + void set_address_space_start(void* start); + + void choosebank(bool inbootloader); + + void call_FF50(); +}; + +} + +#endif + diff --git a/src/games/gambatte/src/counterdef.h b/src/games/gambatte/src/counterdef.h new file mode 100644 index 0000000..c48b80c --- /dev/null +++ b/src/games/gambatte/src/counterdef.h @@ -0,0 +1,10 @@ +#ifndef COUNTERDEF_H +#define COUNTERDEF_H + +namespace gambatte { + +enum { disabled_time = 0xfffffffful }; + +} + +#endif diff --git a/src/games/gambatte/src/cpu.cpp b/src/games/gambatte/src/cpu.cpp new file mode 100644 index 0000000..0fb6199 --- /dev/null +++ b/src/games/gambatte/src/cpu.cpp @@ -0,0 +1,2005 @@ +// +// Copyright (C) 2007 by sinamas +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License version 2 as +// published by the Free Software Foundation. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License version 2 for more details. +// +// You should have received a copy of the GNU General Public License +// version 2 along with this program; if not, write to the +// Free Software Foundation, Inc., +// 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +// + +#include "cpu.h" +#include "gambatte-memory.h" +#include "savestate.h" + +namespace gambatte { + +CPU::CPU() +: mem_(Interrupter(sp, pc_)) +/* Subtlety: members are initialized in DECLARATION order, not + * the order they appear in this initializer list. mem_ is + * declared first in the class body, so it is constructed + * BEFORE sp and pc_ are assigned their values below. The + * Interrupter passed to mem_ captures sp and pc_ by reference + * and never reads through them at construction time, so this + * is well-defined today, but a future reorder of the data + * members in cpu.h could silently introduce UB. Keep mem_ + * declared first, before sp/pc_, for this to remain safe. */ +, cycleCounter_(0) +, pc_(0x100) +, sp(0xFFFE) +, hf1(0xF) +, hf2(0xF) +, zf(0) +, cf(0x100) +, a_(0x01) +, b(0x00) +, c(0x13) +, d(0x00) +, e(0xD8) +, h(0x01) +, l(0x4D) +, skip_(false) +{ +} + +long CPU::runFor(unsigned long const cycles) { + process(cycles); + + long const csb = mem_.cyclesSinceBlit(cycleCounter_); + + if (cycleCounter_ & 0x80000000) + cycleCounter_ = mem_.resetCounters(cycleCounter_); + + return csb; +} + +enum { hf2_hcf = 0x200, hf2_subf = 0x400, hf2_incf = 0x800 }; + +static unsigned updateHf2FromHf1(unsigned const hf1, unsigned hf2) { + unsigned lhs = hf1 & 0xF; + unsigned rhs = (hf2 & 0xF) + (hf2 >> 8 & 1); + if (hf2 & hf2_incf) { + lhs = rhs; + rhs = 1; + } + + unsigned res = (hf2 & hf2_subf) + ? lhs - rhs + : (lhs + rhs) << 5; + + hf2 |= res & hf2_hcf; + return hf2; +} + +static inline unsigned toF(unsigned hf2, unsigned cf, unsigned zf) { + return ((hf2 & (hf2_subf | hf2_hcf)) | (cf & 0x100)) >> 4 + | ((zf & 0xFF) ? 0 : 0x80); +} + +static inline unsigned zfFromF(unsigned f) { return ~f & 0x80; } +static inline unsigned hf2FromF(unsigned f) { return f << 4 & (hf2_subf | hf2_hcf); } +static inline unsigned cfFromF(unsigned f) { return f << 4 & 0x100; } + +void CPU::setStatePtrs(SaveState &state) { + mem_.setStatePtrs(state); +} + +void CPU::saveState(SaveState &state) { + cycleCounter_ = mem_.saveState(state, cycleCounter_); + hf2 = updateHf2FromHf1(hf1, hf2); + + state.cpu.cycleCounter = cycleCounter_; + state.cpu.pc = pc_; + state.cpu.sp = sp; + state.cpu.a = a_; + state.cpu.b = b; + state.cpu.c = c; + state.cpu.d = d; + state.cpu.e = e; + state.cpu.f = toF(hf2, cf, zf); + state.cpu.h = h; + state.cpu.l = l; + state.cpu.skip = skip_; +} + +void CPU::loadState(SaveState const &state) { + mem_.loadState(state); + + cycleCounter_ = state.cpu.cycleCounter; + pc_ = state.cpu.pc & 0xFFFF; + sp = state.cpu.sp & 0xFFFF; + a_ = state.cpu.a & 0xFF; + b = state.cpu.b & 0xFF; + c = state.cpu.c & 0xFF; + d = state.cpu.d & 0xFF; + e = state.cpu.e & 0xFF; + zf = zfFromF(state.cpu.f); + hf2 = hf2FromF(state.cpu.f); + cf = cfFromF(state.cpu.f); + h = state.cpu.h & 0xFF; + l = state.cpu.l & 0xFF; + skip_ = state.cpu.skip; +} + +// The main reasons for the use of macros is to more conveniently be able to tweak +// which variables are local and which are not, combined with the fact that at the +// time they were written GCC had a tendency to not be able to keep hot variables +// in regs if you took an address/reference in an inline function. + +#define bc() ( b << 8 | c ) +#define de() ( d << 8 | e ) +#define hl() ( h << 8 | l ) + +#define READ(dest, addr) do { (dest) = mem_.read(addr, cycleCounter); cycleCounter += 4; } while (0) +#define PC_READ(dest) do { (dest) = mem_.read(pc, cycleCounter); pc = (pc + 1) & 0xFFFF; cycleCounter += 4; } while (0) +#define FF_READ(dest, addr) do { (dest) = mem_.ff_read(addr, cycleCounter); cycleCounter += 4; } while (0) + +#define WRITE(addr, data) do { mem_.write(addr, data, cycleCounter); cycleCounter += 4; } while (0) +#define FF_WRITE(addr, data) do { mem_.ff_write(addr, data, cycleCounter); cycleCounter += 4; } while (0) + +#define PC_MOD(data) do { pc = data; cycleCounter += 4; } while (0) + +#define PUSH(r1, r2) do { \ + sp = (sp - 1) & 0xFFFF; \ + WRITE(sp, (r1)); \ + sp = (sp - 1) & 0xFFFF; \ + WRITE(sp, (r2)); \ +} while (0) + +// CB OPCODES (Shifts, rotates and bits): +// swap r (8 cycles): +// Swap upper and lower nibbles of 8-bit register, reset flags, check zero flag: +#define swap_r(r) do { \ + cf = hf2 = 0; \ + zf = (r); \ + (r) = (zf << 4 | zf >> 4) & 0xFF; \ +} while (0) + +// rlc r (8 cycles): +// Rotate 8-bit register left, store old bit7 in CF. Reset SF and HCF, Check ZF: +#define rlc_r(r) do { \ + cf = (r) << 1; \ + zf = cf | cf >> 8; \ + (r) = zf & 0xFF; \ + hf2 = 0; \ +} while (0) + +// rl r (8 cycles): +// Rotate 8-bit register left through CF, store old bit7 in CF, old CF value becomes bit0. Reset SF and HCF, Check ZF: +#define rl_r(r) do { \ + unsigned const oldcf = cf >> 8 & 1; \ + cf = (r) << 1; \ + zf = cf | oldcf; \ + (r) = zf & 0xFF; \ + hf2 = 0; \ +} while (0) + +// rrc r (8 cycles): +// Rotate 8-bit register right, store old bit0 in CF. Reset SF and HCF, Check ZF: +#define rrc_r(r) do { \ + zf = (r); \ + cf = zf << 8; \ + (r) = (zf | cf) >> 1 & 0xFF; \ + hf2 = 0; \ +} while (0) + +// rr r (8 cycles): +// Rotate 8-bit register right through CF, store old bit0 in CF, old CF value becomes bit7. Reset SF and HCF, Check ZF: +#define rr_r(r) do { \ + unsigned const oldcf = cf & 0x100; \ + cf = (r) << 8; \ + (r) = zf = ((r) | oldcf) >> 1; \ + hf2 = 0; \ +} while (0) + +// sla r (8 cycles): +// Shift 8-bit register left, store old bit7 in CF. Reset SF and HCF, Check ZF: +#define sla_r(r) do { \ + zf = cf = (r) << 1; \ + (r) = zf & 0xFF; \ + hf2 = 0; \ +} while (0) + +// sra r (8 cycles): +// Shift 8-bit register right, store old bit0 in CF. bit7=old bit7. Reset SF and HCF, Check ZF: +#define sra_r(r) do { \ + cf = (r) << 8; \ + zf = (r) >> 1; \ + (r) = zf | ((r) & 0x80); \ + hf2 = 0; \ +} while (0) + +// srl r (8 cycles): +// Shift 8-bit register right, store old bit0 in CF. Reset SF and HCF, Check ZF: +#define srl_r(r) do { \ + zf = (r); \ + cf = (r) << 8; \ + zf >>= 1; \ + (r) = zf; \ + hf2 = 0; \ +} while (0) + +// bit n,r (8 cycles): +// bit n,(hl) (12 cycles): +// Test bitn in 8-bit value, check ZF, unset SF, set HCF: +#define bitn_u8(bitmask, u8) do { \ + zf = (u8) & (bitmask); \ + hf2 = hf2_hcf; \ +} while (0) + +#define bit0_u8(u8) bitn_u8(0x01, (u8)) +#define bit1_u8(u8) bitn_u8(0x02, (u8)) +#define bit2_u8(u8) bitn_u8(0x04, (u8)) +#define bit3_u8(u8) bitn_u8(0x08, (u8)) +#define bit4_u8(u8) bitn_u8(0x10, (u8)) +#define bit5_u8(u8) bitn_u8(0x20, (u8)) +#define bit6_u8(u8) bitn_u8(0x40, (u8)) +#define bit7_u8(u8) bitn_u8(0x80, (u8)) + +// set n,r (8 cycles): +// Set bitn of 8-bit register: +#define set0_r(r) ( (r) |= 0x01 ) +#define set1_r(r) ( (r) |= 0x02 ) +#define set2_r(r) ( (r) |= 0x04 ) +#define set3_r(r) ( (r) |= 0x08 ) +#define set4_r(r) ( (r) |= 0x10 ) +#define set5_r(r) ( (r) |= 0x20 ) +#define set6_r(r) ( (r) |= 0x40 ) +#define set7_r(r) ( (r) |= 0x80 ) + +// set n,(hl) (16 cycles): +// Set bitn of value at address stored in HL: +#define setn_mem_hl(n) do { \ + unsigned const hl = hl(); \ + unsigned val; \ + READ(val, hl); \ + val |= 1 << (n); \ + WRITE(hl, val); \ +} while (0) + +// res n,r (8 cycles): +// Unset bitn of 8-bit register: +#define res0_r(r) ( (r) &= 0xFE ) +#define res1_r(r) ( (r) &= 0xFD ) +#define res2_r(r) ( (r) &= 0xFB ) +#define res3_r(r) ( (r) &= 0xF7 ) +#define res4_r(r) ( (r) &= 0xEF ) +#define res5_r(r) ( (r) &= 0xDF ) +#define res6_r(r) ( (r) &= 0xBF ) +#define res7_r(r) ( (r) &= 0x7F ) + +// res n,(hl) (16 cycles): +// Unset bitn of value at address stored in HL: +#define resn_mem_hl(n) do { \ + unsigned const hl = hl(); \ + unsigned val; \ + READ(val, hl); \ + val &= ~(1 << (n)); \ + WRITE(hl, val); \ +} while (0) + + +// 16-BIT LOADS: +// ld rr,nn (12 cycles) +// set rr to 16-bit value of next 2 bytes in memory +#define ld_rr_nn(r1, r2) do { \ + PC_READ(r2); \ + PC_READ(r1); \ +} while (0) + +// push rr (16 cycles): +// Push value of register pair onto stack: +#define push_rr(r1, r2) do { \ + PUSH(r1, r2); \ + cycleCounter += 4; \ +} while (0) + +// pop rr (12 cycles): +// Pop two bytes off stack into register pair: +#define pop_rr(r1, r2) do { \ + READ(r2, sp); \ + sp = (sp + 1) & 0xFFFF; \ + READ(r1, sp); \ + sp = (sp + 1) & 0xFFFF; \ +} while (0) + +// 8-BIT ALU: +// add a,r (4 cycles): +// add a,(addr) (8 cycles): +// Add 8-bit value to A, check flags: +#define add_a_u8(u8) do { \ + hf1 = a; \ + hf2 = u8; \ + zf = cf = a + hf2; \ + a = zf & 0xFF; \ +} while (0) + +// adc a,r (4 cycles): +// adc a,(addr) (8 cycles): +// Add 8-bit value+CF to A, check flags: +#define adc_a_u8(u8) do { \ + hf1 = a; \ + hf2 = (cf & 0x100) | (u8); \ + zf = cf = (cf >> 8 & 1) + (u8) + a; \ + a = zf & 0xFF; \ +} while (0) + +// sub a,r (4 cycles): +// sub a,(addr) (8 cycles): +// Subtract 8-bit value from A, check flags: +#define sub_a_u8(u8) do { \ + hf1 = a; \ + hf2 = u8; \ + zf = cf = a - hf2; \ + a = zf & 0xFF; \ + hf2 |= hf2_subf; \ +} while (0) + +// sbc a,r (4 cycles): +// sbc a,(addr) (8 cycles): +// Subtract CF and 8-bit value from A, check flags: +#define sbc_a_u8(u8) do { \ + hf1 = a; \ + hf2 = hf2_subf | (cf & 0x100) | (u8); \ + zf = cf = a - ((cf >> 8) & 1) - (u8); \ + a = zf & 0xFF; \ +} while (0) + +// and a,r (4 cycles): +// and a,(addr) (8 cycles): +// bitwise and 8-bit value into A, check flags: +#define and_a_u8(u8) do { \ + hf2 = hf2_hcf; \ + cf = 0; \ + a &= (u8); \ + zf = a; \ +} while (0) + +// or a,r (4 cycles): +// or a,(hl) (8 cycles): +// bitwise or 8-bit value into A, check flags: +#define or_a_u8(u8) do { \ + cf = hf2 = 0; \ + a |= (u8); \ + zf = a; \ +} while (0) + +// xor a,r (4 cycles): +// xor a,(hl) (8 cycles): +// bitwise xor 8-bit value into A, check flags: +#define xor_a_u8(u8) do { \ + cf = hf2 = 0; \ + a ^= (u8); \ + zf = a; \ +} while (0) + +// cp a,r (4 cycles): +// cp a,(addr) (8 cycles): +// Compare (subtract without storing result) 8-bit value to A, check flags: +#define cp_a_u8(u8) do { \ + hf1 = a; \ + hf2 = u8; \ + zf = cf = a - hf2; \ + hf2 |= hf2_subf; \ +} while (0) + +// inc r (4 cycles): +// Increment value of 8-bit register, check flags except CF: +#define inc_r(r) do { \ + hf2 = (r) | hf2_incf; \ + zf = (r) + 1; \ + (r) = zf & 0xFF; \ +} while (0) + +// dec r (4 cycles): +// Decrement value of 8-bit register, check flags except CF: +#define dec_r(r) do { \ + hf2 = (r) | hf2_incf | hf2_subf; \ + zf = (r) - 1; \ + (r) = zf & 0xFF; \ +} while (0) + +// 16-BIT ARITHMETIC +// add hl,rr (8 cycles): +// add 16-bit register to HL, check flags except ZF: +#define add_hl_rr(rh, rl) do { \ + cf = l + (rl); \ + l = cf & 0xFF; \ + hf1 = h; \ + hf2 = (cf & 0x100) | (rh); \ + cf = h + (cf >> 8) + (rh); \ + h = cf & 0xFF; \ + cycleCounter += 4; \ +} while (0) + +// inc rr (8 cycles): +// Increment 16-bit register: +#define inc_rr(rh, rl) do { \ + unsigned const lowinc = (rl) + 1; \ + (rl) = lowinc & 0xFF; \ + (rh) = ((rh) + (lowinc >> 8)) & 0xFF; \ + cycleCounter += 4; \ +} while (0) + +// dec rr (8 cycles): +// Decrement 16-bit register: +#define dec_rr(rh, rl) do { \ + unsigned const lowdec = (rl) - 1; \ + (rl) = lowdec & 0xFF; \ + (rh) = ((rh) - (lowdec >> 8 & 1)) & 0xFF; \ + cycleCounter += 4; \ +} while (0) + +#define sp_plus_n(sumout) do { \ + unsigned disp; \ + PC_READ(disp); \ + disp = (disp ^ 0x80) - 0x80; \ +\ + unsigned const res = sp + disp; \ + cf = sp ^ disp ^ res; \ + hf2 = cf << 5 & hf2_hcf; \ + zf = 1; \ + cycleCounter += 4; \ + (sumout) = res & 0xFFFF; \ +} while (0) + +// JUMPS: +// jp nn (16 cycles): +// Jump to address stored in the next two bytes in memory: +#define jp_nn() do { \ + unsigned imm0, imm1; \ + PC_READ(imm0); \ + PC_READ(imm1); \ + PC_MOD(imm1 << 8 | imm0); \ +} while (0) + +// jr disp (12 cycles): +// Jump to value of next (signed) byte in memory+current address: +#define jr_disp() do { \ + unsigned disp; \ + PC_READ(disp); \ + disp = (disp ^ 0x80) - 0x80; \ + PC_MOD((pc + disp) & 0xFFFF); \ +} while (0) + +// CALLS, RESTARTS AND RETURNS: +// call nn (24 cycles): +// Jump to 16-bit immediate operand and push return address onto stack: +#define call_nn() do { \ + unsigned const npc = (pc + 2) & 0xFFFF; \ + jp_nn(); \ + PUSH(npc >> 8, npc & 0xFF); \ +} while (0) + +// rst n (16 Cycles): +// Push present address onto stack, jump to address n (one of 00h,08h,10h,18h,20h,28h,30h,38h): +#define rst_n(n) do { \ + PUSH(pc >> 8, pc & 0xFF); \ + PC_MOD(n); \ +} while (0) + +// ret (16 cycles): +// Pop two bytes from the stack and jump to that address: +#define ret() do { \ + unsigned low, high; \ + pop_rr(high, low); \ + PC_MOD(high << 8 | low); \ +} while (0) + +void CPU::process(unsigned long const cycles) { + mem_.setEndtime(cycleCounter_, cycles); + mem_.updateInput(); + + unsigned char a = a_; + unsigned long cycleCounter = cycleCounter_; + + while (mem_.isActive()) { + unsigned short pc = pc_; + +#ifdef HAVE_NETWORK + mem_.checkSerial(cycleCounter); +#endif + + if (mem_.halted()) { + if (cycleCounter < mem_.nextEventTime()) { + unsigned long cycles = mem_.nextEventTime() - cycleCounter; + cycleCounter += cycles + (-cycles & 3); + } + } else while (cycleCounter < mem_.nextEventTime()) { + unsigned char opcode; + + PC_READ(opcode); + + if (skip_) { + pc = (pc - 1) & 0xFFFF; + skip_ = false; + } + + switch (opcode) { + case 0x00: + break; + case 0x01: + ld_rr_nn(b, c); + break; + case 0x02: + WRITE(bc(), a); + break; + case 0x03: + inc_rr(b, c); + break; + case 0x04: + inc_r(b); + break; + case 0x05: + dec_r(b); + break; + case 0x06: + PC_READ(b); + break; + + // rlca (4 cycles): + // Rotate 8-bit register A left, store old bit7 in CF. Reset SF, HCF, ZF: + case 0x07: + cf = a << 1; + a = (cf | cf >> 8) & 0xFF; + hf2 = 0; + zf = 1; + break; + + // ld (nn),SP (20 cycles): + // Put value of SP into address given by next 2 bytes in memory: + case 0x08: + { + unsigned imml, immh; + PC_READ(imml); + PC_READ(immh); + + unsigned const addr = immh << 8 | imml; + WRITE(addr, sp & 0xFF); + WRITE((addr + 1) & 0xFFFF, sp >> 8); + } + + break; + + case 0x09: + add_hl_rr(b, c); + break; + case 0x0A: + READ(a, bc()); + break; + case 0x0B: + dec_rr(b, c); + break; + case 0x0C: + inc_r(c); + break; + case 0x0D: + dec_r(c); + break; + case 0x0E: + PC_READ(c); + break; + + // rrca (4 cycles): + // Rotate 8-bit register A right, store old bit0 in CF. Reset SF, HCF, ZF: + case 0x0F: + cf = a << 8 | a; + a = cf >> 1 & 0xFF; + hf2 = 0; + zf = 1; + break; + + // stop (4 cycles): + // Halt CPU and LCD display until button pressed: + case 0x10: + pc = (pc + 1) & 0xFFFF; + + cycleCounter = mem_.stop(cycleCounter); + + if (cycleCounter < mem_.nextEventTime()) { + unsigned long cycles = mem_.nextEventTime() - cycleCounter; + cycleCounter += cycles + (-cycles & 3); + } + + break; + + case 0x11: + ld_rr_nn(d, e); + break; + case 0x12: + WRITE(de(), a); + break; + case 0x13: + inc_rr(d, e); + break; + case 0x14: + inc_r(d); + break; + case 0x15: + dec_r(d); + break; + case 0x16: + PC_READ(d); + break; + + // rla (4 cycles): + // Rotate 8-bit register A left through CF, store old bit7 in CF, + // old CF value becomes bit0. Reset SF, HCF, ZF: + case 0x17: + { + unsigned oldcf = cf >> 8 & 1; + cf = a << 1; + a = (cf | oldcf) & 0xFF; + } + + hf2 = 0; + zf = 1; + break; + + case 0x18: + jr_disp(); + break; + case 0x19: + add_hl_rr(d, e); + break; + case 0x1A: + READ(a, de()); + break; + case 0x1B: + dec_rr(d, e); + break; + case 0x1C: + inc_r(e); + break; + case 0x1D: + dec_r(e); + break; + case 0x1E: + PC_READ(e); + break; + + // rra (4 cycles): + // Rotate 8-bit register A right through CF, store old bit0 in CF, + // old CF value becomes bit7. Reset SF, HCF, ZF: + case 0x1F: + { + unsigned oldcf = cf & 0x100; + cf = a << 8; + a = (a | oldcf) >> 1; + } + + hf2 = 0; + zf = 1; + break; + + // jr nz,disp (12;8 cycles): + // Jump to value of next (signed) byte in memory+current address if ZF is unset: + case 0x20: + if (zf & 0xFF) { + jr_disp(); + } else { + PC_MOD((pc + 1) & 0xFFFF); + } + + break; + + case 0x21: ld_rr_nn(h, l); break; + + // ldi (hl),a (8 cycles): + // Put A into memory address in hl. Increment HL: + case 0x22: + { + unsigned addr = hl(); + WRITE(addr, a); + + addr = (addr + 1) & 0xFFFF; + l = addr; + h = addr >> 8; + } + + break; + + case 0x23: + inc_rr(h, l); + break; + case 0x24: + inc_r(h); + break; + case 0x25: + dec_r(h); + break; + case 0x26: + PC_READ(h); + break; + + // daa (4 cycles): + // Adjust register A to correctly represent a BCD. Check ZF, HF and CF: + case 0x27: + hf2 = updateHf2FromHf1(hf1, hf2); + + { + unsigned correction = (cf & 0x100) ? 0x60 : 0x00; + + if (hf2 & hf2_hcf) + correction |= 0x06; + + if (!(hf2 &= hf2_subf)) { + if ((a & 0x0F) > 0x09) + correction |= 0x06; + if (a > 0x99) + correction |= 0x60; + + a += correction; + } else + a -= correction; + + cf = correction << 2 & 0x100; + zf = a; + a &= 0xFF; + } + + break; + + // jr z,disp (12;8 cycles): + // Jump to value of next (signed) byte in memory+current address if ZF is set: + case 0x28: + if (zf & 0xFF) { + PC_MOD((pc + 1) & 0xFFFF); + } else { + jr_disp(); + } + + break; + + case 0x29: + add_hl_rr(h, l); + break; + + // ldi a,(hl) (8 cycles): + // Put value at address in hl into A. Increment HL: + case 0x2A: + { + unsigned addr = hl(); + READ(a, addr); + + addr = (addr + 1) & 0xFFFF; + l = addr; + h = addr >> 8; + } + + break; + + case 0x2B: + dec_rr(h, l); + break; + case 0x2C: + inc_r(l); + break; + case 0x2D: + dec_r(l); + break; + case 0x2E: + PC_READ(l); + break; + + // cpl (4 cycles): + // Complement register A. (Flip all bits), set SF and HCF: + case 0x2F: + hf2 = hf2_subf | hf2_hcf; + a ^= 0xFF; + break; + + // jr nc,disp (12;8 cycles): + // Jump to value of next (signed) byte in memory+current address if CF is unset: + case 0x30: + if (cf & 0x100) { + PC_MOD((pc + 1) & 0xFFFF); + } else { + jr_disp(); + } + + break; + + // ld sp,nn (12 cycles) + // set sp to 16-bit value of next 2 bytes in memory + case 0x31: + { + unsigned imml, immh; + PC_READ(imml); + PC_READ(immh); + + sp = immh << 8 | imml; + } + + break; + + // ldd (hl),a (8 cycles): + // Put A into memory address in hl. Decrement HL: + case 0x32: + { + unsigned addr = hl(); + WRITE(addr, a); + + addr = (addr - 1) & 0xFFFF; + l = addr; + h = addr >> 8; + } + + break; + + case 0x33: + sp = (sp + 1) & 0xFFFF; + cycleCounter += 4; + break; + + // inc (hl) (12 cycles): + // Increment value at address in hl, check flags except CF: + case 0x34: + { + unsigned const addr = hl(); + READ(hf2, addr); + zf = hf2 + 1; + WRITE(addr, zf & 0xFF); + hf2 |= hf2_incf; + } + + break; + + // dec (hl) (12 cycles): + // Decrement value at address in hl, check flags except CF: + case 0x35: + { + unsigned const addr = hl(); + READ(hf2, addr); + zf = hf2 - 1; + WRITE(addr, zf & 0xFF); + hf2 |= hf2_incf | hf2_subf; + } + + break; + + // ld (hl),n (12 cycles): + // set memory at address in hl to value of next byte in memory: + case 0x36: + { + unsigned imm; + PC_READ(imm); + WRITE(hl(), imm); + } + + break; + + // scf (4 cycles): + // Set CF. Unset SF and HCF: + case 0x37: + cf = 0x100; + hf2 = 0; + break; + + // jr c,disp (12;8 cycles): + // Jump to value of next (signed) byte in memory+current address if CF is set: + case 0x38: + if (cf & 0x100) { + jr_disp(); + } else { + PC_MOD((pc + 1) & 0xFFFF); + } + + break; + + // add hl,sp (8 cycles): + // add SP to HL, check flags except ZF: + case 0x39: + cf = l + sp; + l = cf & 0xFF; + hf1 = h; + hf2 = ((cf ^ sp) & 0x100) | sp >> 8; + cf >>= 8; + cf += h; + h = cf & 0xFF; + cycleCounter += 4; + break; + + // ldd a,(hl) (8 cycles): + // Put value at address in hl into A. Decrement HL: + case 0x3A: + { + unsigned addr = hl(); + a = mem_.read(addr, cycleCounter); + cycleCounter += 4; + + addr = (addr - 1) & 0xFFFF; + l = addr; + h = addr >> 8; + } + + break; + + case 0x3B: + sp = (sp - 1) & 0xFFFF; + cycleCounter += 4; + break; + + case 0x3C: + inc_r(a); + break; + case 0x3D: + dec_r(a); + break; + case 0x3E: + PC_READ(a); + break; + + // ccf (4 cycles): + // Complement CF (unset if set vv.) Unset SF and HCF. + case 0x3F: + cf ^= 0x100; + hf2 = 0; + break; + + case 0x40: /*b = b;*/ break; + case 0x41: b = c; break; + case 0x42: b = d; break; + case 0x43: b = e; break; + case 0x44: b = h; break; + case 0x45: b = l; break; + case 0x46: READ(b, hl()); break; + case 0x47: b = a; break; + + case 0x48: c = b; break; + case 0x49: /*c = c;*/ break; + case 0x4A: c = d; break; + case 0x4B: c = e; break; + case 0x4C: c = h; break; + case 0x4D: c = l; break; + case 0x4E: READ(c, hl()); break; + case 0x4F: c = a; break; + + case 0x50: d = b; break; + case 0x51: d = c; break; + case 0x52: /*d = d;*/ break; + case 0x53: d = e; break; + case 0x54: d = h; break; + case 0x55: d = l; break; + case 0x56: READ(d, hl()); break; + case 0x57: d = a; break; + + case 0x58: e = b; break; + case 0x59: e = c; break; + case 0x5A: e = d; break; + case 0x5B: /*e = e;*/ break; + case 0x5C: e = h; break; + case 0x5D: e = l; break; + case 0x5E: READ(e, hl()); break; + case 0x5F: e = a; break; + + case 0x60: h = b; break; + case 0x61: h = c; break; + case 0x62: h = d; break; + case 0x63: h = e; break; + case 0x64: /*h = h;*/ break; + case 0x65: h = l; break; + case 0x66: READ(h, hl()); break; + case 0x67: h = a; break; + + case 0x68: l = b; break; + case 0x69: l = c; break; + case 0x6A: l = d; break; + case 0x6B: l = e; break; + case 0x6C: l = h; break; + case 0x6D: /*l = l;*/ break; + case 0x6E: READ(l, hl()); break; + case 0x6F: l = a; break; + + case 0x70: WRITE(hl(), b); break; + case 0x71: WRITE(hl(), c); break; + case 0x72: WRITE(hl(), d); break; + case 0x73: WRITE(hl(), e); break; + case 0x74: WRITE(hl(), h); break; + case 0x75: WRITE(hl(), l); break; + + // halt (4 cycles): + case 0x76: + if (!mem_.ime() + && ( mem_.ff_read(0x0F, cycleCounter) + & mem_.ff_read(0xFF, cycleCounter) & 0x1F)) { + if (mem_.isCgb()) + cycleCounter += 4; + else + skip_ = true; + } else { + mem_.halt(); + + if (cycleCounter < mem_.nextEventTime()) { + unsigned long cycles = mem_.nextEventTime() - cycleCounter; + cycleCounter += cycles + (-cycles & 3); + } + } + + break; + + case 0x77: WRITE(hl(), a); break; + case 0x78: a = b; break; + case 0x79: a = c; break; + case 0x7A: a = d; break; + case 0x7B: a = e; break; + case 0x7C: a = h; break; + case 0x7D: a = l; break; + case 0x7E: READ(a, hl()); break; + case 0x7F: /*a = a;*/ break; + + case 0x80: add_a_u8(b); break; + case 0x81: add_a_u8(c); break; + case 0x82: add_a_u8(d); break; + case 0x83: add_a_u8(e); break; + case 0x84: add_a_u8(h); break; + case 0x85: add_a_u8(l); break; + case 0x86: { unsigned data; READ(data, hl()); add_a_u8(data); } break; + case 0x87: add_a_u8(a); break; + + case 0x88: adc_a_u8(b); break; + case 0x89: adc_a_u8(c); break; + case 0x8A: adc_a_u8(d); break; + case 0x8B: adc_a_u8(e); break; + case 0x8C: adc_a_u8(h); break; + case 0x8D: adc_a_u8(l); break; + case 0x8E: { unsigned data; READ(data, hl()); adc_a_u8(data); } break; + case 0x8F: adc_a_u8(a); break; + + case 0x90: sub_a_u8(b); break; + case 0x91: sub_a_u8(c); break; + case 0x92: sub_a_u8(d); break; + case 0x93: sub_a_u8(e); break; + case 0x94: sub_a_u8(h); break; + case 0x95: sub_a_u8(l); break; + case 0x96: { unsigned data; READ(data, hl()); sub_a_u8(data); } break; + + // A-A is always 0: + case 0x97: + hf2 = hf2_subf; + cf = zf = a = 0; + break; + + case 0x98: sbc_a_u8(b); break; + case 0x99: sbc_a_u8(c); break; + case 0x9A: sbc_a_u8(d); break; + case 0x9B: sbc_a_u8(e); break; + case 0x9C: sbc_a_u8(h); break; + case 0x9D: sbc_a_u8(l); break; + case 0x9E: { unsigned data; READ(data, hl()); sbc_a_u8(data); } break; + case 0x9F: sbc_a_u8(a); break; + + case 0xA0: and_a_u8(b); break; + case 0xA1: and_a_u8(c); break; + case 0xA2: and_a_u8(d); break; + case 0xA3: and_a_u8(e); break; + case 0xA4: and_a_u8(h); break; + case 0xA5: and_a_u8(l); break; + case 0xA6: { unsigned data; READ(data, hl()); and_a_u8(data); } break; + + // A&A will always be A: + case 0xA7: + zf = a; + cf = 0; + hf2 = hf2_hcf; + break; + + case 0xA8: xor_a_u8(b); break; + case 0xA9: xor_a_u8(c); break; + case 0xAA: xor_a_u8(d); break; + case 0xAB: xor_a_u8(e); break; + case 0xAC: xor_a_u8(h); break; + case 0xAD: xor_a_u8(l); break; + case 0xAE: { unsigned data; READ(data, hl()); xor_a_u8(data); } break; + + // A^A will always be 0: + case 0xAF: cf = hf2 = zf = a = 0; break; + + case 0xB0: or_a_u8(b); break; + case 0xB1: or_a_u8(c); break; + case 0xB2: or_a_u8(d); break; + case 0xB3: or_a_u8(e); break; + case 0xB4: or_a_u8(h); break; + case 0xB5: or_a_u8(l); break; + case 0xB6: { unsigned data; READ(data, hl()); or_a_u8(data); } break; + + // A|A will always be A: + case 0xB7: + zf = a; + hf2 = cf = 0; + break; + + case 0xB8: cp_a_u8(b); break; + case 0xB9: cp_a_u8(c); break; + case 0xBA: cp_a_u8(d); break; + case 0xBB: cp_a_u8(e); break; + case 0xBC: cp_a_u8(h); break; + case 0xBD: cp_a_u8(l); break; + case 0xBE: { unsigned data; READ(data, hl()); cp_a_u8(data); } break; + + // A always equals A: + case 0xBF: + cf = zf = 0; + hf2 = hf2_subf; + break; + + // ret nz (20;8 cycles): + // Pop two bytes from the stack and jump to that address, if ZF is unset: + case 0xC0: + cycleCounter += 4; + + if (zf & 0xFF) + ret(); + + break; + + case 0xC1: + pop_rr(b, c); + break; + + // jp nz,nn (16;12 cycles): + // Jump to address stored in next two bytes in memory if ZF is unset: + case 0xC2: + if (zf & 0xFF) { + jp_nn(); + } else { + PC_MOD((pc + 2) & 0xFFFF); + cycleCounter += 4; + } + + break; + + case 0xC3: + jp_nn(); + break; + + // call nz,nn (24;12 cycles): + // Push address of next instruction onto stack and then jump to + // address stored in next two bytes in memory, if ZF is unset: + case 0xC4: + if (zf & 0xFF) { + call_nn(); + } else { + PC_MOD((pc + 2) & 0xFFFF); + cycleCounter += 4; + } + + break; + + case 0xC5: + push_rr(b, c); + break; + case 0xC6: + { + unsigned data; + PC_READ(data); + add_a_u8(data); + } + + break; + + case 0xC7: + rst_n(0x00); + break; + + // ret z (20;8 cycles): + // Pop two bytes from the stack and jump to that address, if ZF is set: + case 0xC8: + cycleCounter += 4; + + if (!(zf & 0xFF)) + ret(); + + break; + + // ret (16 cycles): + // Pop two bytes from the stack and jump to that address: + case 0xC9: + ret(); + break; + + // jp z,nn (16;12 cycles): + // Jump to address stored in next two bytes in memory if ZF is set: + case 0xCA: + if (zf & 0xFF) { + PC_MOD((pc + 2) & 0xFFFF); + cycleCounter += 4; + } else { + jp_nn(); + } + + break; + + + // CB OPCODES (Shifts, rotates and bits): + case 0xCB: + PC_READ(opcode); + + switch (opcode) { + case 0x00: rlc_r(b); break; + case 0x01: rlc_r(c); break; + case 0x02: rlc_r(d); break; + case 0x03: rlc_r(e); break; + case 0x04: rlc_r(h); break; + case 0x05: rlc_r(l); break; + + // rlc (hl) (16 cycles): + // Rotate 8-bit value stored at address in HL left, store old bit7 in CF. + // Reset SF and HCF. Check ZF: + case 0x06: + { + unsigned const addr = hl(); + READ(cf, addr); + cf <<= 1; + zf = cf | (cf >> 8); + WRITE(addr, zf & 0xFF); + hf2 = 0; + } + + break; + + case 0x07: rlc_r(a); break; + + case 0x08: rrc_r(b); break; + case 0x09: rrc_r(c); break; + case 0x0A: rrc_r(d); break; + case 0x0B: rrc_r(e); break; + case 0x0C: rrc_r(h); break; + case 0x0D: rrc_r(l); break; + + // rrc (hl) (16 cycles): + // Rotate 8-bit value stored at address in HL right, store old bit0 in CF. + // Reset SF and HCF. Check ZF: + case 0x0E: + { + unsigned const addr = hl(); + READ(zf, addr); + cf = zf << 8; + WRITE(addr, (zf | cf) >> 1 & 0xFF); + hf2 = 0; + } + + break; + + case 0x0F: rrc_r(a); break; + + case 0x10: rl_r(b); break; + case 0x11: rl_r(c); break; + case 0x12: rl_r(d); break; + case 0x13: rl_r(e); break; + case 0x14: rl_r(h); break; + case 0x15: rl_r(l); break; + + // rl (hl) (16 cycles): + // Rotate 8-bit value stored at address in HL left thorugh CF, + // store old bit7 in CF, old CF value becoms bit0. Reset SF and HCF. Check ZF: + case 0x16: + { + unsigned const addr = hl(); + unsigned const oldcf = cf >> 8 & 1; + READ(cf, addr); + cf <<= 1; + zf = cf | oldcf; + WRITE(addr, zf & 0xFF); + hf2 = 0; + } + break; + + case 0x17: rl_r(a); break; + + case 0x18: rr_r(b); break; + case 0x19: rr_r(c); break; + case 0x1A: rr_r(d); break; + case 0x1B: rr_r(e); break; + case 0x1C: rr_r(h); break; + case 0x1D: rr_r(l); break; + + // rr (hl) (16 cycles): + // Rotate 8-bit value stored at address in HL right thorugh CF, + // store old bit0 in CF, old CF value becoms bit7. Reset SF and HCF. Check ZF: + case 0x1E: + { + unsigned const addr = hl(); + READ(zf, addr); + + unsigned const oldcf = cf & 0x100; + cf = zf << 8; + zf = (zf | oldcf) >> 1; + WRITE(addr, zf); + hf2 = 0; + } + + break; + + case 0x1F: rr_r(a); break; + + case 0x20: sla_r(b); break; + case 0x21: sla_r(c); break; + case 0x22: sla_r(d); break; + case 0x23: sla_r(e); break; + case 0x24: sla_r(h); break; + case 0x25: sla_r(l); break; + + // sla (hl) (16 cycles): + // Shift 8-bit value stored at address in HL left, store old bit7 in CF. + // Reset SF and HCF. Check ZF: + case 0x26: + { + unsigned const addr = hl(); + READ(cf, addr); + cf <<= 1; + zf = cf; + WRITE(addr, zf & 0xFF); + hf2 = 0; + } + + break; + + case 0x27: sla_r(a); break; + + case 0x28: sra_r(b); break; + case 0x29: sra_r(c); break; + case 0x2A: sra_r(d); break; + case 0x2B: sra_r(e); break; + case 0x2C: sra_r(h); break; + case 0x2D: sra_r(l); break; + + // sra (hl) (16 cycles): + // Shift 8-bit value stored at address in HL right, store old bit0 in CF, + // bit7=old bit7. Reset SF and HCF. Check ZF: + case 0x2E: + { + unsigned const addr = hl(); + READ(cf, addr); + zf = cf >> 1; + WRITE(addr, zf | (cf & 0x80)); + cf <<= 8; + hf2 = 0; + } + + break; + + case 0x2F: sra_r(a); break; + + case 0x30: swap_r(b); break; + case 0x31: swap_r(c); break; + case 0x32: swap_r(d); break; + case 0x33: swap_r(e); break; + case 0x34: swap_r(h); break; + case 0x35: swap_r(l); break; + + // swap (hl) (16 cycles): + // Swap upper and lower nibbles of 8-bit value stored at address in HL, + // reset flags, check zero flag: + case 0x36: + { + unsigned const addr = hl(); + READ(zf, addr); + WRITE(addr, (zf << 4 | zf >> 4) & 0xFF); + cf = hf2 = 0; + } + + break; + + case 0x37: swap_r(a); break; + + case 0x38: srl_r(b); break; + case 0x39: srl_r(c); break; + case 0x3A: srl_r(d); break; + case 0x3B: srl_r(e); break; + case 0x3C: srl_r(h); break; + case 0x3D: srl_r(l); break; + + // srl (hl) (16 cycles): + // Shift 8-bit value stored at address in HL right, + // store old bit0 in CF. Reset SF and HCF. Check ZF: + case 0x3E: + { + unsigned const addr = hl(); + READ(cf, addr); + zf = cf >> 1; + WRITE(addr, zf); + cf <<= 8; + hf2 = 0; + } + + break; + + case 0x3F: srl_r(a); break; + + case 0x40: bit0_u8(b); break; + case 0x41: bit0_u8(c); break; + case 0x42: bit0_u8(d); break; + case 0x43: bit0_u8(e); break; + case 0x44: bit0_u8(h); break; + case 0x45: bit0_u8(l); break; + case 0x46: { unsigned data; READ(data, hl()); bit0_u8(data); } break; + case 0x47: bit0_u8(a); break; + + case 0x48: bit1_u8(b); break; + case 0x49: bit1_u8(c); break; + case 0x4A: bit1_u8(d); break; + case 0x4B: bit1_u8(e); break; + case 0x4C: bit1_u8(h); break; + case 0x4D: bit1_u8(l); break; + case 0x4E: { unsigned data; READ(data, hl()); bit1_u8(data); } break; + case 0x4F: bit1_u8(a); break; + + case 0x50: bit2_u8(b); break; + case 0x51: bit2_u8(c); break; + case 0x52: bit2_u8(d); break; + case 0x53: bit2_u8(e); break; + case 0x54: bit2_u8(h); break; + case 0x55: bit2_u8(l); break; + case 0x56: { unsigned data; READ(data, hl()); bit2_u8(data); } break; + case 0x57: bit2_u8(a); break; + + case 0x58: bit3_u8(b); break; + case 0x59: bit3_u8(c); break; + case 0x5A: bit3_u8(d); break; + case 0x5B: bit3_u8(e); break; + case 0x5C: bit3_u8(h); break; + case 0x5D: bit3_u8(l); break; + case 0x5E: { unsigned data; READ(data, hl()); bit3_u8(data); } break; + case 0x5F: bit3_u8(a); break; + + case 0x60: bit4_u8(b); break; + case 0x61: bit4_u8(c); break; + case 0x62: bit4_u8(d); break; + case 0x63: bit4_u8(e); break; + case 0x64: bit4_u8(h); break; + case 0x65: bit4_u8(l); break; + case 0x66: { unsigned data; READ(data, hl()); bit4_u8(data); } break; + case 0x67: bit4_u8(a); break; + + case 0x68: bit5_u8(b); break; + case 0x69: bit5_u8(c); break; + case 0x6A: bit5_u8(d); break; + case 0x6B: bit5_u8(e); break; + case 0x6C: bit5_u8(h); break; + case 0x6D: bit5_u8(l); break; + case 0x6E: { unsigned data; READ(data, hl()); bit5_u8(data); } break; + case 0x6F: bit5_u8(a); break; + + case 0x70: bit6_u8(b); break; + case 0x71: bit6_u8(c); break; + case 0x72: bit6_u8(d); break; + case 0x73: bit6_u8(e); break; + case 0x74: bit6_u8(h); break; + case 0x75: bit6_u8(l); break; + case 0x76: { unsigned data; READ(data, hl()); bit6_u8(data); } break; + case 0x77: bit6_u8(a); break; + + case 0x78: bit7_u8(b); break; + case 0x79: bit7_u8(c); break; + case 0x7A: bit7_u8(d); break; + case 0x7B: bit7_u8(e); break; + case 0x7C: bit7_u8(h); break; + case 0x7D: bit7_u8(l); break; + case 0x7E: { unsigned data; READ(data, hl()); bit7_u8(data); } break; + case 0x7F: bit7_u8(a); break; + + case 0x80: res0_r(b); break; + case 0x81: res0_r(c); break; + case 0x82: res0_r(d); break; + case 0x83: res0_r(e); break; + case 0x84: res0_r(h); break; + case 0x85: res0_r(l); break; + case 0x86: resn_mem_hl(0); break; + case 0x87: res0_r(a); break; + + case 0x88: res1_r(b); break; + case 0x89: res1_r(c); break; + case 0x8A: res1_r(d); break; + case 0x8B: res1_r(e); break; + case 0x8C: res1_r(h); break; + case 0x8D: res1_r(l); break; + case 0x8E: resn_mem_hl(1); break; + case 0x8F: res1_r(a); break; + + case 0x90: res2_r(b); break; + case 0x91: res2_r(c); break; + case 0x92: res2_r(d); break; + case 0x93: res2_r(e); break; + case 0x94: res2_r(h); break; + case 0x95: res2_r(l); break; + case 0x96: resn_mem_hl(2); break; + case 0x97: res2_r(a); break; + + case 0x98: res3_r(b); break; + case 0x99: res3_r(c); break; + case 0x9A: res3_r(d); break; + case 0x9B: res3_r(e); break; + case 0x9C: res3_r(h); break; + case 0x9D: res3_r(l); break; + case 0x9E: resn_mem_hl(3); break; + case 0x9F: res3_r(a); break; + + case 0xA0: res4_r(b); break; + case 0xA1: res4_r(c); break; + case 0xA2: res4_r(d); break; + case 0xA3: res4_r(e); break; + case 0xA4: res4_r(h); break; + case 0xA5: res4_r(l); break; + case 0xA6: resn_mem_hl(4); break; + case 0xA7: res4_r(a); break; + + case 0xA8: res5_r(b); break; + case 0xA9: res5_r(c); break; + case 0xAA: res5_r(d); break; + case 0xAB: res5_r(e); break; + case 0xAC: res5_r(h); break; + case 0xAD: res5_r(l); break; + case 0xAE: resn_mem_hl(5); break; + case 0xAF: res5_r(a); break; + + case 0xB0: res6_r(b); break; + case 0xB1: res6_r(c); break; + case 0xB2: res6_r(d); break; + case 0xB3: res6_r(e); break; + case 0xB4: res6_r(h); break; + case 0xB5: res6_r(l); break; + case 0xB6: resn_mem_hl(6); break; + case 0xB7: res6_r(a); break; + + case 0xB8: res7_r(b); break; + case 0xB9: res7_r(c); break; + case 0xBA: res7_r(d); break; + case 0xBB: res7_r(e); break; + case 0xBC: res7_r(h); break; + case 0xBD: res7_r(l); break; + case 0xBE: resn_mem_hl(7); break; + case 0xBF: res7_r(a); break; + + case 0xC0: set0_r(b); break; + case 0xC1: set0_r(c); break; + case 0xC2: set0_r(d); break; + case 0xC3: set0_r(e); break; + case 0xC4: set0_r(h); break; + case 0xC5: set0_r(l); break; + case 0xC6: setn_mem_hl(0); break; + case 0xC7: set0_r(a); break; + + case 0xC8: set1_r(b); break; + case 0xC9: set1_r(c); break; + case 0xCA: set1_r(d); break; + case 0xCB: set1_r(e); break; + case 0xCC: set1_r(h); break; + case 0xCD: set1_r(l); break; + case 0xCE: setn_mem_hl(1); break; + case 0xCF: set1_r(a); break; + + case 0xD0: set2_r(b); break; + case 0xD1: set2_r(c); break; + case 0xD2: set2_r(d); break; + case 0xD3: set2_r(e); break; + case 0xD4: set2_r(h); break; + case 0xD5: set2_r(l); break; + case 0xD6: setn_mem_hl(2); break; + case 0xD7: set2_r(a); break; + + case 0xD8: set3_r(b); break; + case 0xD9: set3_r(c); break; + case 0xDA: set3_r(d); break; + case 0xDB: set3_r(e); break; + case 0xDC: set3_r(h); break; + case 0xDD: set3_r(l); break; + case 0xDE: setn_mem_hl(3); break; + case 0xDF: set3_r(a); break; + + case 0xE0: set4_r(b); break; + case 0xE1: set4_r(c); break; + case 0xE2: set4_r(d); break; + case 0xE3: set4_r(e); break; + case 0xE4: set4_r(h); break; + case 0xE5: set4_r(l); break; + case 0xE6: setn_mem_hl(4); break; + case 0xE7: set4_r(a); break; + + case 0xE8: set5_r(b); break; + case 0xE9: set5_r(c); break; + case 0xEA: set5_r(d); break; + case 0xEB: set5_r(e); break; + case 0xEC: set5_r(h); break; + case 0xED: set5_r(l); break; + case 0xEE: setn_mem_hl(5); break; + case 0xEF: set5_r(a); break; + + case 0xF0: set6_r(b); break; + case 0xF1: set6_r(c); break; + case 0xF2: set6_r(d); break; + case 0xF3: set6_r(e); break; + case 0xF4: set6_r(h); break; + case 0xF5: set6_r(l); break; + case 0xF6: setn_mem_hl(6); break; + case 0xF7: set6_r(a); break; + + case 0xF8: set7_r(b); break; + case 0xF9: set7_r(c); break; + case 0xFA: set7_r(d); break; + case 0xFB: set7_r(e); break; + case 0xFC: set7_r(h); break; + case 0xFD: set7_r(l); break; + case 0xFE: setn_mem_hl(7); break; + case 0xFF: set7_r(a); break; + } + + break; + + + // call z,nn (24;12 cycles): + // Push address of next instruction onto stack and then jump to + // address stored in next two bytes in memory, if ZF is set: + case 0xCC: + if (zf & 0xFF) { + PC_MOD((pc + 2) & 0xFFFF); + cycleCounter += 4; + } else { + call_nn(); + } + + break; + + case 0xCD: + call_nn(); + break; + + case 0xCE: + { + unsigned data; + PC_READ(data); + adc_a_u8(data); + } + + break; + + case 0xCF: + rst_n(0x08); + break; + + // ret nc (20;8 cycles): + // Pop two bytes from the stack and jump to that address, if CF is unset: + case 0xD0: + cycleCounter += 4; + + if (!(cf & 0x100)) + ret(); + + break; + + case 0xD1: + pop_rr(d, e); + break; + + // jp nc,nn (16;12 cycles): + // Jump to address stored in next two bytes in memory if CF is unset: + case 0xD2: + if (cf & 0x100) { + PC_MOD((pc + 2) & 0xFFFF); + cycleCounter += 4; + } else { + jp_nn(); + } + + break; + + case 0xD3: // not specified. should freeze. + break; + + // call nc,nn (24;12 cycles): + // Push address of next instruction onto stack and then jump to + // address stored in next two bytes in memory, if CF is unset: + case 0xD4: + if (cf & 0x100) { + PC_MOD((pc + 2) & 0xFFFF); + cycleCounter += 4; + } else { + call_nn(); + } + + break; + + case 0xD5: + push_rr(d, e); + break; + + case 0xD6: + { + unsigned data; + PC_READ(data); + sub_a_u8(data); + } + + break; + + case 0xD7: + rst_n(0x10); + break; + + // ret c (20;8 cycles): + // Pop two bytes from the stack and jump to that address, if CF is set: + case 0xD8: + cycleCounter += 4; + + if (cf & 0x100) + ret(); + + break; + + // reti (16 cycles): + // Pop two bytes from the stack and jump to that address, then enable interrupts: + case 0xD9: + { + unsigned sl, sh; + pop_rr(sh, sl); + mem_.ei(cycleCounter); + PC_MOD(sh << 8 | sl); + } + + break; + + // jp c,nn (16;12 cycles): + // Jump to address stored in next two bytes in memory if CF is set: + case 0xDA: + if (cf & 0x100) { + jp_nn(); + } else { + PC_MOD((pc + 2) & 0xFFFF); + cycleCounter += 4; + } + + break; + + case 0xDB: // not specified. should freeze. + break; + + // call z,nn (24;12 cycles): + // Push address of next instruction onto stack and then jump to + // address stored in next two bytes in memory, if CF is set: + case 0xDC: + if (cf & 0x100) { + call_nn(); + } else { + PC_MOD((pc + 2) & 0xFFFF); + cycleCounter += 4; + } + + break; + + case 0xDE: + { + unsigned data; + PC_READ(data); + sbc_a_u8(data); + } + + break; + + case 0xDF: + rst_n(0x18); + break; + + // ld ($FF00+n),a (12 cycles): + // Put value in A into address (0xFF00 + next byte in memory): + case 0xE0: + { + unsigned imm; + PC_READ(imm); + FF_WRITE(imm, a); + } + + break; + + case 0xE1: + pop_rr(h, l); + break; + + // ld ($FF00+C),a (8 ycles): + // Put A into address (0xFF00 + register C): + case 0xE2: + FF_WRITE(c, a); + break; + + case 0xE3: // not specified. should freeze. + break; + case 0xE4: // not specified. should freeze. + break; + + case 0xE5: + push_rr(h, l); + break; + + case 0xE6: + { + unsigned data; + PC_READ(data); + and_a_u8(data); + } + + break; + + case 0xE7: + rst_n(0x20); + break; + + // add sp,n (16 cycles): + // Add next (signed) byte in memory to SP, reset ZF and SF, check HCF and CF: + case 0xE8: + sp_plus_n(sp); + cycleCounter += 4; + break; + + // jp hl (4 cycles): + // Jump to address in hl: + case 0xE9: + pc = hl(); + break; + + // ld (nn),a (16 cycles): + // set memory at address given by the next 2 bytes to value in A: + // Incrementing PC before call, because of possible interrupt. + case 0xEA: + { + unsigned imml, immh; + PC_READ(imml); + PC_READ(immh); + WRITE(immh << 8 | imml, a); + } + + break; + + case 0xEB: // not specified. should freeze. + break; + case 0xEC: // not specified. should freeze. + break; + case 0xED: // not specified. should freeze. + break; + + case 0xEE: + { + unsigned data; + PC_READ(data); + xor_a_u8(data); + } + + break; + + case 0xEF: + rst_n(0x28); + break; + + // ld a,($FF00+n) (12 cycles): + // Put value at address (0xFF00 + next byte in memory) into A: + case 0xF0: + { + unsigned imm; + PC_READ(imm); + FF_READ(a, imm); + } + + break; + + case 0xF1: + { + unsigned F; + pop_rr(a, F); + zf = zfFromF(F); + hf2 = hf2FromF(F); + cf = cfFromF(F); + } + + break; + + // ld a,($FF00+C) (8 cycles): + // Put value at address (0xFF00 + register C) into A: + case 0xF2: + FF_READ(a, c); + break; + + // di (4 cycles): + case 0xF3: + mem_.di(); + break; + + case 0xF4: // not specified. should freeze. + break; + + case 0xF5: + hf2 = updateHf2FromHf1(hf1, hf2); + + { + unsigned F = toF(hf2, cf, zf); + push_rr(a, F); + } + + break; + + case 0xF6: + { + unsigned data; + PC_READ(data); + or_a_u8(data); + } + + break; + + case 0xF7: + rst_n(0x30); + break; + + // ldhl sp,n (12 cycles): + // Put (sp+next (signed) byte in memory) into hl (unsets ZF and SF, may enable HF and CF): + case 0xF8: + { + unsigned sum; + sp_plus_n(sum); + l = sum & 0xFF; + h = sum >> 8; + } + + break; + + // ld sp,hl (8 cycles): + // Put value in HL into SP + case 0xF9: + sp = hl(); + cycleCounter += 4; + break; + + // ld a,(nn) (16 cycles): + // set A to value in memory at address given by the 2 next bytes. + case 0xFA: + { + unsigned imml, immh; + PC_READ(imml); + PC_READ(immh); + + READ(a, immh << 8 | imml); + } + + break; + + // ei (4 cycles): + // Enable Interrupts after next instruction: + case 0xFB: + mem_.ei(cycleCounter); + break; + + case 0xFC: // not specified. should freeze. + break; + case 0xFD: // not specified. should freeze + break; + case 0xFE: + { + unsigned data; + PC_READ(data); + + cp_a_u8(data); + } + + break; + + case 0xFF: + rst_n(0x38); + break; + } + } + + pc_ = pc; + cycleCounter = mem_.event(cycleCounter); + } + + a_ = a; + cycleCounter_ = cycleCounter; +} + +} diff --git a/src/games/gambatte/src/cpu.h b/src/games/gambatte/src/cpu.h new file mode 100644 index 0000000..76c29de --- /dev/null +++ b/src/games/gambatte/src/cpu.h @@ -0,0 +1,114 @@ +// +// Copyright (C) 2007 by sinamas +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License version 2 as +// published by the Free Software Foundation. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License version 2 for more details. +// +// You should have received a copy of the GNU General Public License +// version 2 along with this program; if not, write to the +// Free Software Foundation, Inc., +// 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +// + +#ifndef CPU_H +#define CPU_H + +#include "gambatte.h" +#include "gambatte-memory.h" +#include "savestate.h" + +namespace gambatte { + +#ifdef HAVE_NETWORK +class SerialIO; +#endif + +class CPU { +public: + CPU(); + long runFor(unsigned long cycles); + void setStatePtrs(SaveState &state); + void saveState(SaveState &state); + void loadState(SaveState const &state); +#if 0 + void loadSavedata() { mem_.loadSavedata(); } + void saveSavedata() { mem_.saveSavedata(); } +#endif + +#ifdef __LIBRETRO__ + void *savedata_ptr() { return mem_.savedata_ptr(); } + unsigned savedata_size() { return mem_.savedata_size(); } + void *rtcdata_ptr() { return mem_.rtcdata_ptr(); } + unsigned rtcdata_size() { return mem_.rtcdata_size(); } + void clearCheats() { mem_.clearCheats(); } + void *vram_ptr() const { return mem_.vram_ptr(); } + void *rambank0_ptr() const { return mem_.rambank0_ptr(); } + void *rambank1_ptr() const { return mem_.rambank1_ptr(); } + void *rambank2_ptr() const { return mem_.rambank2_ptr(); } + void *bankedram_ptr() const { return mem_.bankedram_ptr(); } + void *rombank0_ptr() const { return mem_.rombank0_ptr(); } + void *rombank1_ptr() const { return mem_.rombank1_ptr(); } + void *zeropage_ptr() const { return mem_.zeropage_ptr(); } + void *oamram_ptr() const { return mem_.oamram_ptr(); } +#endif + + void setVideoBuffer(video_pixel_t *videoBuf, std::ptrdiff_t pitch) { + mem_.setVideoBuffer(videoBuf, pitch); + } + + void setInputGetter(InputGetter *getInput) { + mem_.setInputGetter(getInput); + } +#ifdef HAVE_NETWORK + void setSerialIO(SerialIO *serial_io) { + mem_.setSerialIO(serial_io); + } +#endif + + void setSaveDir(std::string const &sdir) { + mem_.setSaveDir(sdir); + } + + std::string const saveBasePath() const { + return mem_.saveBasePath(); + } + + int load(const void *romdata, unsigned int romsize, unsigned int forceModel, bool multicartCompat) { + return mem_.loadROM(romdata, romsize, forceModel, multicartCompat); + } + +#if 0 + bool loaded() const { return mem_.loaded(); } +#endif + void setSoundBuffer(uint_least32_t *buf, std::size_t size) { mem_.setSoundBuffer(buf, size); } + std::size_t fillSoundBuffer() { return mem_.fillSoundBuffer(cycleCounter_); } + bool isCgb() const { return mem_.isCgb(); } + + void setDmgPaletteColor(int palNum, int colorNum, unsigned long rgb32) { + mem_.setDmgPaletteColor(palNum, colorNum, rgb32); + } + + void setGameGenie(std::string const &codes) { mem_.setGameGenie(codes); } + void setGameShark(std::string const &codes) { mem_.setGameShark(codes); } + + Memory mem_; +private: + unsigned long cycleCounter_; + unsigned short pc_; + unsigned short sp; + unsigned hf1, hf2, zf, cf; + unsigned char a_, b, c, d, e, /*f,*/ h, l; + bool skip_; + + void process(unsigned long cycles); +}; + +} + +#endif diff --git a/src/games/gambatte/src/gambatte-memory.cpp b/src/games/gambatte/src/gambatte-memory.cpp new file mode 100644 index 0000000..c8790fc --- /dev/null +++ b/src/games/gambatte/src/gambatte-memory.cpp @@ -0,0 +1,1199 @@ +// +// Copyright (C) 2007 by sinamas +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License version 2 as +// published by the Free Software Foundation. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License version 2 for more details. +// +// You should have received a copy of the GNU General Public License +// version 2 along with this program; if not, write to the +// Free Software Foundation, Inc., +// 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +// + +#include "gambatte-memory.h" +#include "inputgetter.h" +#include "savestate.h" +#include "sound.h" +#include "video.h" +#include "bootloader.h" +#include + +namespace gambatte { + +Memory::Memory(Interrupter const &interrupter) : +#ifdef HAVE_NETWORK + serialize_value_(0xFF) +, serialize_is_fastcgb_(false), +#endif + getInput_(0) +#ifdef HAVE_NETWORK +, serial_io_(0) +#endif +, divLastUpdate_(0) +, lastOamDmaUpdate_(disabled_time) +, lcd_(ioamhram_, 0, VideoInterruptRequester(intreq_)) +, interrupter_(interrupter) +, dmaSource_(0) +, dmaDestination_(0) +, oamDmaPos_(0xFE) +, serialCnt_(0) +, blanklcd_(false) +, sachenLockCounter_(0) +{ + intreq_.setEventTime(144 * 456ul); + intreq_.setEventTime(0); +} + +void Memory::setStatePtrs(SaveState &state) { + state.mem.ioamhram.set(ioamhram_, sizeof ioamhram_); + + cart_.setStatePtrs(state); + lcd_.setStatePtrs(state); + psg_.setStatePtrs(state); +} + +unsigned long Memory::saveState(SaveState &state, unsigned long cc) { + cc = resetCounters(cc); + nontrivial_ff_read(0x05, cc); + nontrivial_ff_read(0x0F, cc); + nontrivial_ff_read(0x26, cc); + + state.mem.divLastUpdate = divLastUpdate_; + state.mem.nextSerialtime = intreq_.eventTime(intevent_serial); + state.mem.unhaltTime = intreq_.eventTime(intevent_unhalt); + state.mem.lastOamDmaUpdate = lastOamDmaUpdate_; + state.mem.dmaSource = dmaSource_; + state.mem.dmaDestination = dmaDestination_; + state.mem.oamDmaPos = oamDmaPos_; +#ifdef HAVE_NETWORK + state.mem.serialize_value = serialize_value_; + state.mem.serialize_is_fastcgb = serialize_is_fastcgb_; +#endif + + intreq_.saveState(state); + cart_.saveState(state); + tima_.saveState(state); + lcd_.saveState(state); + psg_.saveState(state); + + return cc; +} + +static int serialCntFrom(unsigned long cyclesUntilDone, bool cgbFast) { + return cgbFast ? (cyclesUntilDone + 0xF) >> 4 : (cyclesUntilDone + 0x1FF) >> 9; +} + +void Memory::loadState(SaveState const &state) { + psg_.loadState(state); + lcd_.loadState(state, state.mem.oamDmaPos < 0xA0 ? cart_.rdisabledRam() : ioamhram_); + tima_.loadState(state, TimaInterruptRequester(intreq_)); + cart_.loadState(state); + intreq_.loadState(state); + + divLastUpdate_ = state.mem.divLastUpdate; + intreq_.setEventTime(state.mem.nextSerialtime > state.cpu.cycleCounter + ? state.mem.nextSerialtime + : state.cpu.cycleCounter); + intreq_.setEventTime(state.mem.unhaltTime); + lastOamDmaUpdate_ = state.mem.lastOamDmaUpdate; + dmaSource_ = state.mem.dmaSource; + dmaDestination_ = state.mem.dmaDestination; + oamDmaPos_ = state.mem.oamDmaPos; +#ifdef HAVE_NETWORK + serialize_value_ = state.mem.serialize_value; + serialize_is_fastcgb_ = state.mem.serialize_is_fastcgb; +#endif + serialCnt_ = intreq_.eventTime(intevent_serial) != disabled_time + ? serialCntFrom(intreq_.eventTime(intevent_serial) - state.cpu.cycleCounter, +#ifdef HAVE_NETWORK + serialize_is_fastcgb_ +#else + ioamhram_[0x102] & isCgb() * 2 +#endif + ) + : 8; + + cart_.setVrambank(ioamhram_[0x14F] & isCgb()); + cart_.setOamDmaSrc(oam_dma_src_off); + cart_.setWrambank(isCgb() && (ioamhram_[0x170] & 0x07) ? ioamhram_[0x170] & 0x07 : 1); + + if (lastOamDmaUpdate_ != disabled_time) { + oamDmaInitSetup(); + + unsigned oamEventPos = oamDmaPos_ < 0xA0 ? 0xA0 : 0x100; + intreq_.setEventTime( + lastOamDmaUpdate_ + (oamEventPos - oamDmaPos_) * 4); + } + + intreq_.setEventTime((ioamhram_[0x140] & lcdc_en) + ? lcd_.nextMode1IrqTime() + : state.cpu.cycleCounter); + blanklcd_ = false; + + if (!isCgb()) + std::memset(cart_.vramdata() + 0x2000, 0, 0x2000); +} + +void Memory::setEndtime(unsigned long cc, unsigned long inc) { + unsigned is_doublespeed = (unsigned)isDoubleSpeed(); + if (intreq_.eventTime(intevent_blit) <= cc) + intreq_.setEventTime(intreq_.eventTime(intevent_blit) + + (70224 << is_doublespeed)); + + intreq_.setEventTime(cc + (inc << is_doublespeed)); +} + +#ifdef HAVE_NETWORK +void Memory::startSerialTransfer(unsigned long cc, unsigned char data, bool fastCgb) +{ + // If serial interrupt is enabled + serialCnt_ = 8; + + serialize_value_ = data; + serialize_is_fastcgb_ = fastCgb; + intreq_.setEventTime(serialize_is_fastcgb_ + ? (cc & ~0x07ul) + 0x010 * 8 + : (cc & ~0xFFul) + 0x200 * 8); +} + +void Memory::checkSerial(unsigned long const cc) { + // Periodically checks if serial data is received + if ((serial_io_ != 0) && + ((ioamhram_[0x102] & 0x80) == 0x80) && + (intreq_.eventTime(intevent_serial) == disabled_time)) { + unsigned char data; + bool fastCgb; + if (serial_io_->check(ioamhram_[0x101], data, fastCgb)) { + startSerialTransfer(cc, data, fastCgb); + } + } +} +#endif + +void Memory::updateSerial(unsigned long const cc) { + if (intreq_.eventTime(intevent_serial) != disabled_time) { + if (intreq_.eventTime(intevent_serial) <= cc) { +#ifdef HAVE_NETWORK + bool fire = ((ioamhram_[0x102] & 0x80) == 0x80); + ioamhram_[0x101] = ((ioamhram_[0x101] << serialCnt_) | + (serialize_value_ >> (8 - serialCnt_))) & 0xFF; +#else + ioamhram_[0x101] = (((ioamhram_[0x101] + 1) << serialCnt_) - 1) & 0xFF; +#endif + + ioamhram_[0x102] &= 0x7F; + intreq_.setEventTime(disabled_time); +#ifdef HAVE_NETWORK + if (fire) + intreq_.flagIrq(8); +#else + intreq_.flagIrq(8); +#endif + } else { + int const targetCnt = serialCntFrom(intreq_.eventTime(intevent_serial) - cc, +#ifdef HAVE_NETWORK + serialize_is_fastcgb_); + ioamhram_[0x101] = ((ioamhram_[0x101] << (serialCnt_ - targetCnt)) | + (serialize_value_ >> (8 - (serialCnt_ - targetCnt)))) & 0xFF; +#else + ioamhram_[0x102] & isCgb() * 2); + ioamhram_[0x101] = (((ioamhram_[0x101] + 1) << (serialCnt_ - targetCnt)) - 1) & 0xFF; +#endif + serialCnt_ = targetCnt; + } + } + +#ifdef HAVE_NETWORK + checkSerial(cc); +#endif +} + +void Memory::updateTimaIrq(unsigned long cc) { + while (intreq_.eventTime(intevent_tima) <= cc) + tima_.doIrqEvent(TimaInterruptRequester(intreq_)); +} + +void Memory::updateIrqs(unsigned long cc) { + updateSerial(cc); + updateTimaIrq(cc); + lcd_.update(cc); +} + +unsigned long Memory::event(unsigned long cc) { + if (lastOamDmaUpdate_ != disabled_time) + updateOamDma(cc); + + switch (intreq_.minEventId()) { + case intevent_unhalt: + intreq_.unhalt(); + intreq_.setEventTime(disabled_time); + break; + case intevent_end: + intreq_.setEventTime(disabled_time - 1); + + while (cc >= intreq_.minEventTime() + && intreq_.eventTime(intevent_end) != disabled_time) { + cc = event(cc); + } + + intreq_.setEventTime(disabled_time); + + break; + case intevent_blit: + { + bool const lcden = ioamhram_[0x140] & lcdc_en; + unsigned long blitTime = intreq_.eventTime(intevent_blit); + unsigned is_doublespeed = (unsigned)isDoubleSpeed(); + + if (lcden | blanklcd_) + { + lcd_.updateScreen(blanklcd_, cc); + intreq_.setEventTime(disabled_time); + intreq_.setEventTime(disabled_time); + + while (cc >= intreq_.minEventTime()) + cc = event(cc); + } + else + blitTime += 70224 << is_doublespeed; + + blanklcd_ = lcden ^ 1; + intreq_.setEventTime(blitTime); + } + break; + case intevent_serial: + updateSerial(cc); + break; + case intevent_oam: + intreq_.setEventTime(lastOamDmaUpdate_ == disabled_time + ? static_cast(disabled_time) + : intreq_.eventTime(intevent_oam) + 0xA0 * 4); + break; + case intevent_dma: + { + unsigned const doubleSpeed = (unsigned const)isDoubleSpeed(); + unsigned dmaSrc = dmaSource_; + unsigned dmaDest = dmaDestination_; + unsigned dmaLength = ((ioamhram_[0x155] & 0x7F) + 0x1) * 0x10; + unsigned length = hdmaReqFlagged(intreq_) ? 0x10 : dmaLength; + + ackDmaReq(intreq_); + + if ((static_cast(dmaDest) + length) & 0x10000) { + length = 0x10000 - dmaDest; + ioamhram_[0x155] |= 0x80; + } + + dmaLength -= length; + + if (!(ioamhram_[0x140] & lcdc_en)) + dmaLength = 0; + + { + unsigned long lOamDmaUpdate = lastOamDmaUpdate_; + lastOamDmaUpdate_ = disabled_time; + + while (length--) { + unsigned const src = dmaSrc++ & 0xFFFF; + unsigned const data = (src & 0xE000) == 0x8000 || src > 0xFDFF + ? 0xFF + : read(src, cc); + + cc += 2 << doubleSpeed; + + if (cc - 3 > lOamDmaUpdate) { + oamDmaPos_ = (oamDmaPos_ + 1) & 0xFF; + lOamDmaUpdate += 4; + + if (oamDmaPos_ < 0xA0) { + if (oamDmaPos_ == 0) + startOamDma(lOamDmaUpdate - 1); + + ioamhram_[src & 0xFF] = data; + } else if (oamDmaPos_ == 0xA0) { + endOamDma(lOamDmaUpdate - 1); + lOamDmaUpdate = disabled_time; + } + } + + nontrivial_write(0x8000 | (dmaDest++ & 0x1FFF), data, cc); + } + + lastOamDmaUpdate_ = lOamDmaUpdate; + } + + cc += 4; + + dmaSource_ = dmaSrc; + dmaDestination_ = dmaDest; + ioamhram_[0x155] = ((dmaLength / 0x10 - 0x1) & 0xFF) | (ioamhram_[0x155] & 0x80); + + if ((ioamhram_[0x155] & 0x80) && lcd_.hdmaIsEnabled()) { + if (lastOamDmaUpdate_ != disabled_time) + updateOamDma(cc); + + lcd_.disableHdma(cc); + } + } + + break; + case intevent_tima: + tima_.doIrqEvent(TimaInterruptRequester(intreq_)); + break; + case intevent_video: + lcd_.update(cc); + break; + case intevent_interrupts: + if (halted()) { + if (isCgb()) + cc += 4; + + intreq_.unhalt(); + intreq_.setEventTime(disabled_time); + } + + if (ime()) { + unsigned const pendingIrqs = intreq_.pendingIrqs(); + unsigned const n = pendingIrqs & -pendingIrqs; + unsigned address; + if (n <= 4) { + static unsigned char const lut[] = { 0x40, 0x48, 0x48, 0x50 }; + address = lut[n-1]; + } else + address = 0x50 + n; + + intreq_.ackIrq(n); + cc = interrupter_.interrupt(address, cc, *this); + } + + break; + } + + return cc; +} + +unsigned long Memory::stop(unsigned long cc) { + unsigned is_doublespeed = (unsigned)isDoubleSpeed(); + cc += 4 + 4 * is_doublespeed; + + if (ioamhram_[0x14D] & isCgb()) + { + psg_.generateSamples(cc, is_doublespeed); + lcd_.speedChange(cc); + ioamhram_[0x14D] ^= 0x81; + intreq_.setEventTime((ioamhram_[0x140] & lcdc_en) + ? lcd_.nextMode1IrqTime() + : cc + (70224 << is_doublespeed)); + + if (intreq_.eventTime(intevent_end) > cc) + intreq_.setEventTime(cc + + ( (bool)is_doublespeed + ? (intreq_.eventTime(intevent_end) - cc) << 1 + : (intreq_.eventTime(intevent_end) - cc) >> 1)); + } + + intreq_.halt(); + intreq_.setEventTime(cc + 0x20000 + is_doublespeed * 8); + return cc; +} + +static void decCycles(unsigned long &counter, unsigned long dec) { + if (counter != disabled_time) + counter -= dec; +} + +void Memory::decEventCycles(IntEventId eventId, unsigned long dec) { + if (intreq_.eventTime(eventId) != disabled_time) + intreq_.setEventTime(eventId, intreq_.eventTime(eventId) - dec); +} + +unsigned long Memory::resetCounters(unsigned long cc) { + if (lastOamDmaUpdate_ != disabled_time) + updateOamDma(cc); + + updateIrqs(cc); + + { + unsigned long divinc = (cc - divLastUpdate_) >> 8; + ioamhram_[0x104] = (ioamhram_[0x104] + divinc) & 0xFF; + divLastUpdate_ += divinc << 8; + } + + unsigned long const dec = cc < 0x10000 + ? 0 + : (cc & ~0x7FFFul) - 0x8000; + decCycles(divLastUpdate_, dec); + decCycles(lastOamDmaUpdate_, dec); + decEventCycles(intevent_serial, dec); + decEventCycles(intevent_oam, dec); + decEventCycles(intevent_blit, dec); + decEventCycles(intevent_end, dec); + decEventCycles(intevent_unhalt, dec); + + unsigned long const oldCC = cc; + cc -= dec; + intreq_.resetCc(oldCC, cc); + tima_.resetCc(oldCC, cc, TimaInterruptRequester(intreq_)); + lcd_.resetCc(oldCC, cc); + psg_.resetCounter(cc, oldCC, isDoubleSpeed()); + return cc; +} + +void Memory::updateInput() { + unsigned state = 0xF; + + if ((ioamhram_[0x100] & 0x30) != 0x30 && getInput_) { + unsigned input = (*getInput_)(); + unsigned dpad_state = ~input >> 4; + unsigned button_state = ~input; + if (!(ioamhram_[0x100] & 0x10)) + state &= dpad_state; + if (!(ioamhram_[0x100] & 0x20)) + state &= button_state; + } + + if (state != 0xF && (ioamhram_[0x100] & 0xF) == 0xF) + intreq_.flagIrq(0x10); + + ioamhram_[0x100] = (ioamhram_[0x100] & -0x10u) | state; +} + +void Memory::updateOamDma(unsigned long const cc) { + unsigned char const *const oamDmaSrc = oamDmaSrcPtr(); + unsigned cycles = (cc - lastOamDmaUpdate_) >> 2; + + while (cycles--) { + oamDmaPos_ = (oamDmaPos_ + 1) & 0xFF; + lastOamDmaUpdate_ += 4; + + if (oamDmaPos_ < 0xA0) { + if (oamDmaPos_ == 0) + startOamDma(lastOamDmaUpdate_ - 1); + + if (oamDmaSrc) ioamhram_[oamDmaPos_] = oamDmaSrc[oamDmaPos_]; + else if (cart_.isHuC3()) ioamhram_[oamDmaPos_] = cart_.HuC3Read(oamDmaPos_, cc); + else ioamhram_[oamDmaPos_] = cart_.rtcRead(); + + } else if (oamDmaPos_ == 0xA0) { + endOamDma(lastOamDmaUpdate_ - 1); + lastOamDmaUpdate_ = disabled_time; + break; + } + } +} + +void Memory::oamDmaInitSetup() { + if (ioamhram_[0x146] < 0xA0) { + cart_.setOamDmaSrc(ioamhram_[0x146] < 0x80 ? oam_dma_src_rom : oam_dma_src_vram); + } else if (ioamhram_[0x146] < 0xFE - isCgb() * 0x1E) { + cart_.setOamDmaSrc(ioamhram_[0x146] < 0xC0 ? oam_dma_src_sram : oam_dma_src_wram); + } else + cart_.setOamDmaSrc(oam_dma_src_invalid); +} + +static unsigned char const * oamDmaSrcZero() { + static unsigned char zeroMem[0xA0]; + return zeroMem; +} + +unsigned char const * Memory::oamDmaSrcPtr() const { + switch (cart_.oamDmaSrc()) { + case oam_dma_src_rom: + return cart_.romdata(ioamhram_[0x146] >> 6) + (ioamhram_[0x146] << 8); + case oam_dma_src_sram: + return cart_.rsrambankptr() ? cart_.rsrambankptr() + (ioamhram_[0x146] << 8) : 0; + case oam_dma_src_vram: + return cart_.vrambankptr() + (ioamhram_[0x146] << 8); + case oam_dma_src_wram: + return cart_.wramdata(ioamhram_[0x146] >> 4 & 1) + (ioamhram_[0x146] << 8 & 0xFFF); + case oam_dma_src_invalid: + case oam_dma_src_off: + break; + } + + return ioamhram_[0x146] == 0xFF && !isCgb() ? oamDmaSrcZero() : cart_.rdisabledRam(); +} + +void Memory::startOamDma(unsigned long cc) { + lcd_.oamChange(cart_.rdisabledRam(), cc); +} + +void Memory::endOamDma(unsigned long cc) { + oamDmaPos_ = 0xFE; + cart_.setOamDmaSrc(oam_dma_src_off); + lcd_.oamChange(ioamhram_, cc); +} + +unsigned Memory::nontrivial_ff_read(unsigned const p, unsigned long const cc) { + if (lastOamDmaUpdate_ != disabled_time) + updateOamDma(cc); + + switch (p) { + case 0x00: + updateInput(); + break; + case 0x01: + case 0x02: + updateSerial(cc); + break; + case 0x04: + { + unsigned long divcycles = (cc - divLastUpdate_) >> 8; + ioamhram_[0x104] = (ioamhram_[0x104] + divcycles) & 0xFF; + divLastUpdate_ += divcycles << 8; + } + + break; + case 0x05: + ioamhram_[0x105] = tima_.tima(cc); + break; + case 0x0F: + updateIrqs(cc); + ioamhram_[0x10F] = intreq_.ifreg(); + break; + case 0x26: + if (ioamhram_[0x126] & 0x80) { + psg_.generateSamples(cc, isDoubleSpeed()); + ioamhram_[0x126] = 0xF0 | psg_.getStatus(); + } else + ioamhram_[0x126] = 0x70; + + break; + case 0x30: + case 0x31: + case 0x32: + case 0x33: + case 0x34: + case 0x35: + case 0x36: + case 0x37: + case 0x38: + case 0x39: + case 0x3A: + case 0x3B: + case 0x3C: + case 0x3D: + case 0x3E: + case 0x3F: + psg_.generateSamples(cc, isDoubleSpeed()); + return psg_.waveRamRead(p & 0xF); + case 0x41: + return ioamhram_[0x141] | lcd_.getStat(ioamhram_[0x145], cc); + case 0x44: + return lcd_.getLyReg(cc); + case 0x69: + return lcd_.cgbBgColorRead(ioamhram_[0x168] & 0x3F, cc); + case 0x6B: + return lcd_.cgbSpColorRead(ioamhram_[0x16A] & 0x3F, cc); + default: + break; + } + + return ioamhram_[p + 0x100]; +} + +static bool isInOamDmaConflictArea(OamDmaSrc const oamDmaSrc, unsigned const p, bool const cgb) { + struct Area { unsigned short areaUpper, exceptAreaLower, exceptAreaWidth, pad; }; + + static Area const cgbAreas[] = { + { 0xC000, 0x8000, 0x2000, 0 }, + { 0xC000, 0x8000, 0x2000, 0 }, + { 0xA000, 0x0000, 0x8000, 0 }, + { 0xFE00, 0x0000, 0xC000, 0 }, + { 0xC000, 0x8000, 0x2000, 0 }, + { 0x0000, 0x0000, 0x0000, 0 } + }; + + static Area const dmgAreas[] = { + { 0xFE00, 0x8000, 0x2000, 0 }, + { 0xFE00, 0x8000, 0x2000, 0 }, + { 0xA000, 0x0000, 0x8000, 0 }, + { 0xFE00, 0x8000, 0x2000, 0 }, + { 0xFE00, 0x8000, 0x2000, 0 }, + { 0x0000, 0x0000, 0x0000, 0 } + }; + + Area const *a = cgb ? cgbAreas : dmgAreas; + return p < a[oamDmaSrc].areaUpper + && p - a[oamDmaSrc].exceptAreaLower >= a[oamDmaSrc].exceptAreaWidth; +} + +unsigned Memory::nontrivial_read(unsigned const p, unsigned long const cc) { + if (p < 0xFF80) { + if (lastOamDmaUpdate_ != disabled_time) { + updateOamDma(cc); + + if (isInOamDmaConflictArea(cart_.oamDmaSrc(), p, isCgb()) && oamDmaPos_ < 0xA0) + return ioamhram_[oamDmaPos_]; + } + + if (p < 0xC000) { + if (p < 0x8000) + return cart_.romdata(p >> 14)[p]; + + if (p < 0xA000) { + if (!lcd_.vramAccessible(cc)) + return 0xFF; + + return cart_.vrambankptr()[p]; + } + + if (cart_.rsrambankptr()) + return cart_.rsrambankptr()[p]; + + if (cart_.isHuC3()) + return cart_.HuC3Read(p, cc); + + return cart_.rtcRead(); + } + + if (p < 0xFE00) + return cart_.wramdata(p >> 12 & 1)[p & 0xFFF]; + + long const ffp = long(p) - 0xFF00; + if (ffp >= 0) + return nontrivial_ff_read(ffp, cc); + + if (!lcd_.oamReadable(cc) || oamDmaPos_ < 0xA0) + return 0xFF; + } + + return ioamhram_[p - 0xFE00]; +} + +void Memory::nontrivial_ff_write(unsigned const p, unsigned data, unsigned long const cc) { + if (lastOamDmaUpdate_ != disabled_time) + updateOamDma(cc); + + switch (p & 0xFF) { + case 0x00: + if ((data ^ ioamhram_[0x100]) & 0x30) { + ioamhram_[0x100] = (ioamhram_[0x100] & ~0x30u) | (data & 0x30); + updateInput(); + } + + return; + case 0x01: + updateSerial(cc); + break; + case 0x02: + updateSerial(cc); + serialCnt_ = 8; + +#ifdef HAVE_NETWORK + if ((data & 0x81) == 0x81) + { + unsigned char receivedByte = 0xFF; + if (serial_io_ != 0) + receivedByte = serial_io_->send(ioamhram_[0x101], (data & isCgb() * 2)); + startSerialTransfer(cc, receivedByte, (data & isCgb() * 2)); + } +#else + if ((data & 0x81) == 0x81) + { + intreq_.setEventTime((data & isCgb() * 2) + ? (cc & ~0x07ul) + 0x010 * 8 + : (cc & ~0xFFul) + 0x200 * 8); + } + else + intreq_.setEventTime(disabled_time); +#endif + + data |= 0x7E - isCgb() * 2; + break; + case 0x04: + ioamhram_[0x104] = 0; + divLastUpdate_ = cc; + return; + case 0x05: + tima_.setTima(data, cc, TimaInterruptRequester(intreq_)); + break; + case 0x06: + tima_.setTma(data, cc, TimaInterruptRequester(intreq_)); + break; + case 0x07: + data |= 0xF8; + tima_.setTac(data, cc, TimaInterruptRequester(intreq_)); + break; + case 0x0F: + updateIrqs(cc); + intreq_.setIfreg(0xE0 | data); + return; + case 0x10: + if (!psg_.isEnabled()) + return; + + psg_.generateSamples(cc, isDoubleSpeed()); + psg_.setNr10(data); + data |= 0x80; + break; + case 0x11: + if (!psg_.isEnabled()) { + if (isCgb()) + return; + + data &= 0x3F; + } + + psg_.generateSamples(cc, isDoubleSpeed()); + psg_.setNr11(data); + data |= 0x3F; + break; + case 0x12: + if (!psg_.isEnabled()) + return; + + psg_.generateSamples(cc, isDoubleSpeed()); + psg_.setNr12(data); + break; + case 0x13: + if (!psg_.isEnabled()) + return; + + psg_.generateSamples(cc, isDoubleSpeed()); + psg_.setNr13(data); + return; + case 0x14: + if (!psg_.isEnabled()) + return; + + psg_.generateSamples(cc, isDoubleSpeed()); + psg_.setNr14(data); + data |= 0xBF; + break; + case 0x16: + if (!psg_.isEnabled()) { + if (isCgb()) + return; + + data &= 0x3F; + } + + psg_.generateSamples(cc, isDoubleSpeed()); + psg_.setNr21(data); + data |= 0x3F; + break; + case 0x17: + if (!psg_.isEnabled()) + return; + + psg_.generateSamples(cc, isDoubleSpeed()); + psg_.setNr22(data); + break; + case 0x18: + if (!psg_.isEnabled()) + return; + + psg_.generateSamples(cc, isDoubleSpeed()); + psg_.setNr23(data); + return; + case 0x19: + if (!psg_.isEnabled()) + return; + + psg_.generateSamples(cc, isDoubleSpeed()); + psg_.setNr24(data); + data |= 0xBF; + break; + case 0x1A: + if (!psg_.isEnabled()) + return; + + psg_.generateSamples(cc, isDoubleSpeed()); + psg_.setNr30(data); + data |= 0x7F; + break; + case 0x1B: + if (!psg_.isEnabled() && isCgb()) + return; + + psg_.generateSamples(cc, isDoubleSpeed()); + psg_.setNr31(data); + return; + case 0x1C: + if (!psg_.isEnabled()) + return; + + psg_.generateSamples(cc, isDoubleSpeed()); + psg_.setNr32(data); + data |= 0x9F; + break; + case 0x1D: + if (!psg_.isEnabled()) + return; + + psg_.generateSamples(cc, isDoubleSpeed()); + psg_.setNr33(data); + return; + case 0x1E: + if (!psg_.isEnabled()) + return; + + psg_.generateSamples(cc, isDoubleSpeed()); + psg_.setNr34(data); + data |= 0xBF; + break; + case 0x20: + if (!psg_.isEnabled() && isCgb()) + return; + + psg_.generateSamples(cc, isDoubleSpeed()); + psg_.setNr41(data); + return; + case 0x21: + if (!psg_.isEnabled()) + return; + + psg_.generateSamples(cc, isDoubleSpeed()); + psg_.setNr42(data); + break; + case 0x22: + if (!psg_.isEnabled()) + return; + + psg_.generateSamples(cc, isDoubleSpeed()); + psg_.setNr43(data); + break; + case 0x23: + if (!psg_.isEnabled()) + return; + + psg_.generateSamples(cc, isDoubleSpeed()); + psg_.setNr44(data); + data |= 0xBF; + break; + case 0x24: + if (!psg_.isEnabled()) + return; + + psg_.generateSamples(cc, isDoubleSpeed()); + psg_.setSoVolume(data); + break; + case 0x25: + if (!psg_.isEnabled()) + return; + + psg_.generateSamples(cc, isDoubleSpeed()); + psg_.mapSo(data); + break; + case 0x26: + if ((ioamhram_[0x126] ^ data) & 0x80) { + psg_.generateSamples(cc, isDoubleSpeed()); + + if (!(data & 0x80)) { + for (unsigned i = 0x10; i < 0x26; ++i) + ff_write(i, 0, cc); + + psg_.setEnabled(false); + } else { + psg_.reset(); + psg_.setEnabled(true); + } + } + + data = (data & 0x80) | (ioamhram_[0x126] & 0x7F); + break; + case 0x30: + case 0x31: + case 0x32: + case 0x33: + case 0x34: + case 0x35: + case 0x36: + case 0x37: + case 0x38: + case 0x39: + case 0x3A: + case 0x3B: + case 0x3C: + case 0x3D: + case 0x3E: + case 0x3F: + psg_.generateSamples(cc, isDoubleSpeed()); + psg_.waveRamWrite(p & 0xF, data); + break; + case 0x40: + if (ioamhram_[0x140] != data) + { + unsigned is_doublespeed = (unsigned)isDoubleSpeed(); + if ((ioamhram_[0x140] ^ data) & lcdc_en) + { + unsigned const lyc = lcd_.getStat(ioamhram_[0x145], cc) + & lcdstat_lycflag; + bool const hdmaEnabled = lcd_.hdmaIsEnabled(); + + lcd_.lcdcChange(data, cc); + ioamhram_[0x144] = 0; + ioamhram_[0x141] &= 0xF8; + + if (data & lcdc_en) + { + intreq_.setEventTime(blanklcd_ + ? lcd_.nextMode1IrqTime() + : lcd_.nextMode1IrqTime() + + (70224 << is_doublespeed)); + } + else + { + ioamhram_[0x141] |= lyc; + intreq_.setEventTime( + cc + (456 * 4 << is_doublespeed)); + + if (hdmaEnabled) + flagHdmaReq(intreq_); + } + } + else + lcd_.lcdcChange(data, cc); + + ioamhram_[0x140] = data; + } + return; + case 0x41: + lcd_.lcdstatChange(data, cc); + data = (ioamhram_[0x141] & 0x87) | (data & 0x78); + break; + case 0x42: + lcd_.scyChange(data, cc); + break; + case 0x43: + lcd_.scxChange(data, cc); + break; + case 0x45: + lcd_.lycRegChange(data, cc); + break; + case 0x46: + if (lastOamDmaUpdate_ != disabled_time) + endOamDma(cc); + + lastOamDmaUpdate_ = cc; + intreq_.setEventTime(cc + 8); + ioamhram_[0x146] = data; + oamDmaInitSetup(); + return; + case 0x47: + + if (!isCgb() || (ioamhram_[0x14C] == 0x04))//allow in gbc gb mode + lcd_.dmgBgPaletteChange(data, cc); + + break; + case 0x48: + + if (!isCgb() || (ioamhram_[0x14C] == 0x04))//allow in gbc gb mode + lcd_.dmgSpPalette1Change(data, cc); + + break; + case 0x49: + + if (!isCgb() || (ioamhram_[0x14C] == 0x04))//allow in gbc gb mode + lcd_.dmgSpPalette2Change(data, cc); + + break; + case 0x4A: + lcd_.wyChange(data, cc); + break; + case 0x4B: + lcd_.wxChange(data, cc); + break; + case 0x4C://switch to classic gb mode from gbc mode or lock system to gbc mode + if ((ioamhram_[0x14C] != 0x04)/*gb mode*/ && (ioamhram_[0x14C] != 0x80)/*gbc mode*/) { + //mode has not been set yet, set the mode if data is valid + if (data == 0x04) { + ioamhram_[0x14C] = 0x04;//0x04 is gbc gb mode, lock register and switch mode to gb emulation mode + lcd_.swapToDMG(); + } + else if (data == 0x80) + ioamhram_[0x14C] = 0x80;//0x80 is gbc mode, no special operations needed, just lock this register + + //any other write to this register is invalid and will just be ignored + } + return; + case 0x4D: + if (isCgb()) + ioamhram_[0x14D] = (ioamhram_[0x14D] & ~1u) | (data & 1); + + return; + case 0x4F: + if (isCgb()) { + cart_.setVrambank(data & 1); + ioamhram_[0x14F] = 0xFE | data; + } + + return; + case 0x50://for bootloader, swap bootloader with rom + bootloader.call_FF50(); + /* Some unlicensed mappers (currently Sachen MMC1) need to + * leave a "locked" boot-time state when control transfers + * from the bootstrap to the cartridge. Notify the cartridge + * after the bootloader has finished its own restore so the + * mapper's overlay sits on top of the original cart bytes. */ + cart_.onBootloaderFinished(); + ioamhram_[0x150] = 0xFF; + return; + case 0x51: + dmaSource_ = data << 8 | (dmaSource_ & 0xFF); + return; + case 0x52: + dmaSource_ = (dmaSource_ & 0xFF00) | (data & 0xF0); + return; + case 0x53: + dmaDestination_ = data << 8 | (dmaDestination_ & 0xFF); + return; + case 0x54: + dmaDestination_ = (dmaDestination_ & 0xFF00) | (data & 0xF0); + return; + case 0x55: + if (isCgb()) { + ioamhram_[0x155] = data & 0x7F; + + if (lcd_.hdmaIsEnabled()) { + if (!(data & 0x80)) { + ioamhram_[0x155] |= 0x80; + lcd_.disableHdma(cc); + } + } else { + if (data & 0x80) { + if (ioamhram_[0x140] & lcdc_en) { + lcd_.enableHdma(cc); + } else + flagHdmaReq(intreq_); + } else + flagGdmaReq(intreq_); + } + } + + return; + case 0x56: + if (isCgb()) + ioamhram_[0x156] = data | 0x3E; + + return; + case 0x68: + if (isCgb()) + ioamhram_[0x168] = data | 0x40; + + return; + case 0x69: + if (isCgb()) { + unsigned index = ioamhram_[0x168] & 0x3F; + lcd_.cgbBgColorChange(index, data, cc); + ioamhram_[0x168] = (ioamhram_[0x168] & ~0x3F) + | ((index + (ioamhram_[0x168] >> 7)) & 0x3F); + } + + return; + case 0x6A: + if (isCgb()) + ioamhram_[0x16A] = data | 0x40; + + return; + case 0x6B: + if (isCgb()) { + unsigned index = ioamhram_[0x16A] & 0x3F; + lcd_.cgbSpColorChange(index, data, cc); + ioamhram_[0x16A] = (ioamhram_[0x16A] & ~0x3F) + | ((index + (ioamhram_[0x16A] >> 7)) & 0x3F); + } + + return; + case 0x6C: + if (isCgb()) + ioamhram_[0x16C] = data | 0xFE; + + return; + case 0x70: + if (isCgb()) { + cart_.setWrambank((data & 0x07) ? data & 0x07 : 1); + ioamhram_[0x170] = data | 0xF8; + } + + return; + case 0x72: + case 0x73: + case 0x74: + if (isCgb()) + break; + + return; + case 0x75: + if (isCgb()) + ioamhram_[0x175] = data | 0x8F; + + return; + case 0xFF: + intreq_.setIereg(data); + break; + default: + return; + } + + ioamhram_[p + 0x100] = data; +} + +void Memory::nontrivial_write(unsigned const p, unsigned const data, unsigned long const cc) { + if (lastOamDmaUpdate_ != disabled_time) { + updateOamDma(cc); + + if (isInOamDmaConflictArea(cart_.oamDmaSrc(), p, isCgb()) && oamDmaPos_ < 0xA0) { + ioamhram_[oamDmaPos_] = data; + return; + } + } + + if (p < 0xFE00) { + if (p < 0xA000) { + if (p < 0x8000) { + cart_.mbcWrite(p, data); + } else if (lcd_.vramAccessible(cc)) { + lcd_.vramChange(cc); + cart_.vrambankptr()[p] = data; + } + } else if (p < 0xC000) { + if (cart_.wsrambankptr()) + cart_.wsrambankptr()[p] = data; + else if (cart_.isHuC3()) + cart_.HuC3Write(p, data); + else + cart_.rtcWrite(data); + } else + cart_.wramdata(p >> 12 & 1)[p & 0xFFF] = data; + } else if (p - 0xFF80u >= 0x7Fu) { + long const ffp = long(p) - 0xFF00; + if (ffp < 0) { + if (lcd_.oamWritable(cc) && oamDmaPos_ >= 0xA0 && (p < 0xFEA0 || isCgb())) { + lcd_.oamChange(cc); + ioamhram_[p - 0xFE00] = data; + } + } else + nontrivial_ff_write(ffp, data, cc); + } else + ioamhram_[p - 0xFE00] = data; +} + +std::size_t Memory::fillSoundBuffer(unsigned long cc) { + psg_.generateSamples(cc, isDoubleSpeed()); + return psg_.fillBuffer(); +} + +int Memory::loadROM(const void *romdata, unsigned int romsize, unsigned int forceModel, const bool multicartCompat) +{ + if (const int fail = cart_.loadROM(romdata, romsize, forceModel, multicartCompat)) + return fail; + psg_.init(cart_.isCgb()); + lcd_.reset(ioamhram_, cart_.vramdata(), cart_.isCgb()); + interrupter_.clearCheats(); + /* Clear the Sachen lock counter on every new cart load; the + * pointer is set later by sachenLockSetup() once the MBC has + * been constructed and the bootloader (if any) has been + * installed. */ + sachenLockCounter_ = 0; + return 0; +} + +} diff --git a/src/games/gambatte/src/gambatte-memory.h b/src/games/gambatte/src/gambatte-memory.h new file mode 100644 index 0000000..d82ca85 --- /dev/null +++ b/src/games/gambatte/src/gambatte-memory.h @@ -0,0 +1,226 @@ +// +// Copyright (C) 2007 by sinamas +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License version 2 as +// published by the Free Software Foundation. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License version 2 for more details. +// +// You should have received a copy of the GNU General Public License +// version 2 along with this program; if not, write to the +// Free Software Foundation, Inc., +// 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +// + +#ifndef MEMORY_H +#define MEMORY_H + +#include "mem/cartridge.h" +#include "interrupter.h" +#include "bootloader.h" +#include "sound.h" +#include "tima.h" +#include "video.h" + +namespace gambatte { + +class InputGetter; +#ifdef HAVE_NETWORK +class SerialIO; +#endif + +class Memory { +public: + Bootloader bootloader; + + explicit Memory(Interrupter const &interrupter); + bool loaded() const { return cart_.loaded(); } + void setStatePtrs(SaveState &state); + unsigned long saveState(SaveState &state, unsigned long cc); + void loadState(SaveState const &state); +#ifdef __LIBRETRO__ + void *savedata_ptr() { return cart_.savedata_ptr(); } + unsigned savedata_size() { return cart_.savedata_size(); } + void *rtcdata_ptr() { return cart_.rtcdata_ptr(); } + unsigned rtcdata_size() { return cart_.rtcdata_size(); } + void display_setColorCorrection(bool enable) { lcd_.setColorCorrection(enable); } + void display_setColorCorrectionMode(unsigned colorCorrectionMode) { lcd_.setColorCorrectionMode(colorCorrectionMode); } + void display_setColorCorrectionBrightness(float colorCorrectionBrightness) { lcd_.setColorCorrectionBrightness(colorCorrectionBrightness); } + void display_setDarkFilterLevel(unsigned darkFilterLevel) { lcd_.setDarkFilterLevel(darkFilterLevel); } + video_pixel_t display_gbcToRgb32(const unsigned bgr15) { return lcd_.gbcToRgb32(bgr15); } + void clearCheats() { cart_.clearCheats(); interrupter_.clearCheats(); } + void *vram_ptr() const { return cart_.vramdata(); } + void *rambank0_ptr() const { return cart_.wramdata(0); } + void *rambank1_ptr() const { return cart_.wramdata(0) + 0x1000; } + void *rambank2_ptr() const { return cart_.wramdata(0) + 0x2000; } + void *bankedram_ptr() const { return cart_.wramdata(1); } + void *rombank0_ptr() const { return cart_.romdata(0); } + void *rombank1_ptr() const { return cart_.romdata(0) + 0x4000; } + void *zeropage_ptr() const { return (void*)(ioamhram_ + 0x0180); } + void *oamram_ptr() const { return (void*)ioamhram_; } +#else + void loadSavedata() { cart_.loadSavedata(); } + void saveSavedata() { cart_.saveSavedata(); } +#endif + std::string const saveBasePath() const { return cart_.saveBasePath(); } + + unsigned long stop(unsigned long cycleCounter); + bool isCgb() const { return lcd_.isCgb(); } + bool ime() const { return intreq_.ime(); } + bool halted() const { return intreq_.halted(); } + unsigned long nextEventTime() const { return intreq_.minEventTime(); } + bool isActive() const { return intreq_.eventTime(intevent_end) != disabled_time; } + + long cyclesSinceBlit(unsigned long cc) const + { + if (cc < intreq_.eventTime(intevent_blit)) + return -1; + unsigned is_doublespeed = (unsigned)isDoubleSpeed(); + return (cc - intreq_.eventTime(intevent_blit)) >> is_doublespeed; + } + + void halt() { intreq_.halt(); } + void ei(unsigned long cycleCounter) { if (!ime()) { intreq_.ei(cycleCounter); } } + void di() { intreq_.di(); } + + unsigned ff_read(unsigned p, unsigned long cc) { + return p < 0x80 ? nontrivial_ff_read(p, cc) : ioamhram_[p + 0x100]; + } + + unsigned read(unsigned p, unsigned long cc) { + /* Sachen MMC1 carts need to count CPU reads of 0x0100..0x01FF + * so the mapper can leave its boot-time locked state + * between the bootstrap's logo-display pass (48 cart + * reads of 0x0104..0x0133) and its logo-verify pass + * (another 48 reads of the same range). The counter + * pointer is null for every other cartridge, so the + * branch below is a single predictable null-check on + * the hot path. The unlock fires AFTER the 48th locked + * read has returned its byte, so the display pass sees a + * full Sachen-logo sequence and the very next read + * (first byte of the verify pass) sees the unlocked + * Nintendo bytes. */ + const unsigned char *const rm = cart_.rmem(p >> 12); + const unsigned value = rm ? rm[p] : nontrivial_read(p, cc); + if (sachenLockCounter_ && (p & 0xFF00) == 0x0100) { + if (*sachenLockCounter_ < 48) { + if (++*sachenLockCounter_ == 48) + cart_.onSachenUnlock(); + } + } + return value; + } + + void write(unsigned p, unsigned data, unsigned long cc) { + if (cart_.wmem(p >> 12)) { + cart_.wmem(p >> 12)[p] = data; + } else + nontrivial_write(p, data, cc); + } + + void ff_write(unsigned p, unsigned data, unsigned long cc) { + if (p - 0x80u < 0x7Fu) { + ioamhram_[p + 0x100] = data; + } else + nontrivial_ff_write(p, data, cc); + } +#ifdef HAVE_NETWORK + void startSerialTransfer(unsigned long cycleCounter, unsigned char data, bool fastCgb); +#endif + + unsigned long event(unsigned long cycleCounter); + unsigned long resetCounters(unsigned long cycleCounter); + void setSaveDir(std::string const &dir) { cart_.setSaveDir(dir); } + void setInputGetter(InputGetter *getInput) { getInput_ = getInput; } +#ifdef HAVE_NETWORK + void setSerialIO(SerialIO* serial_io) { serial_io_ = serial_io; } +#endif + void setEndtime(unsigned long cc, unsigned long inc); + void setSoundBuffer(uint_least32_t *buf, std::size_t size) { psg_.setBuffer(buf, size); } + std::size_t fillSoundBuffer(unsigned long cc); + + void setVideoBuffer(video_pixel_t *videoBuf, std::ptrdiff_t pitch) { + lcd_.setVideoBuffer(videoBuf, pitch); + } + + void setDmgPaletteColor(int palNum, int colorNum, unsigned long rgb32) { + lcd_.setDmgPaletteColor(palNum, colorNum, rgb32); + } + + void setGameGenie(std::string const &codes) { cart_.setGameGenie(codes); } + void setGameShark(std::string const &codes) { interrupter_.setGameShark(codes); } +#ifdef HAVE_NETWORK + void checkSerial(unsigned long cc); +#endif + void updateInput(); + + int loadROM(const void *romdata, unsigned int romsize, unsigned int forceModel, const bool multicartCompat); + + /* Forwarders for unlicensed-mapper hooks. Currently only Sachen + * MMC1 carts use them; for every other cartridge type these are + * no-ops and isSachen() returns false. Called by + * GB::Priv::full_init after the bootloader has been installed + * (or skipped). */ + bool isSachen() const { return cart_.isSachen(); } + void sachenLockSetup(bool bootloaderUsed) { + cart_.sachenLockSetup(bootloaderUsed); + /* Pick up the MBC's lock-counter address now that the cart + * has decided whether to enter the locked state. For a + * Sachen cart, sachenLockCounterPtr() returns a real + * address; for any other cart it returns null and the read + * fast path stays in single-branch territory. */ + sachenLockCounter_ = cart_.sachenLockCounterPtr(); + } + void onSachenUnlock() { cart_.onSachenUnlock(); } + +private: + Cartridge cart_; + unsigned char ioamhram_[0x200]; + /* Pointer to the Sachen MBC's read counter, or null for any + * non-Sachen cart. When non-null, Memory::read bumps it on + * every CPU read of 0x0100..0x01FF and signals the cart on + * the 48th such read so the mapper can leave its locked + * state between the bootstrap's display and verify passes. */ + unsigned char *sachenLockCounter_; +#ifdef HAVE_NETWORK + unsigned char serialize_value_; + bool serialize_is_fastcgb_; + SerialIO *serial_io_; +#endif + InputGetter *getInput_; + unsigned long divLastUpdate_; + unsigned long lastOamDmaUpdate_; + InterruptRequester intreq_; + Tima tima_; + LCD lcd_; + PSG psg_; + Interrupter interrupter_; + unsigned short dmaSource_; + unsigned short dmaDestination_; + unsigned char oamDmaPos_; + unsigned char serialCnt_; + bool blanklcd_; + + void decEventCycles(IntEventId eventId, unsigned long dec); + void oamDmaInitSetup(); + void updateOamDma(unsigned long cycleCounter); + void startOamDma(unsigned long cycleCounter); + void endOamDma(unsigned long cycleCounter); + unsigned char const * oamDmaSrcPtr() const; + unsigned nontrivial_ff_read(unsigned p, unsigned long cycleCounter); + unsigned nontrivial_read(unsigned p, unsigned long cycleCounter); + void nontrivial_ff_write(unsigned p, unsigned data, unsigned long cycleCounter); + void nontrivial_write(unsigned p, unsigned data, unsigned long cycleCounter); + void updateSerial(unsigned long cc); + void updateTimaIrq(unsigned long cc); + void updateIrqs(unsigned long cc); + bool isDoubleSpeed() const { return lcd_.isDoubleSpeed(); } +}; + +} + +#endif diff --git a/src/games/gambatte/src/gambatte.cpp b/src/games/gambatte/src/gambatte.cpp new file mode 100644 index 0000000..5e1f952 --- /dev/null +++ b/src/games/gambatte/src/gambatte.cpp @@ -0,0 +1,243 @@ +/*************************************************************************** + * Copyright (C) 2007 by Sindre Aamås * + * aamas@stud.ntnu.no * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License version 2 as * + * published by the Free Software Foundation. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License version 2 for more details. * + * * + * You should have received a copy of the GNU General Public License * + * version 2 along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ +#include "gambatte.h" +#include "cpu.h" +#include "savestate.h" +#include "statesaver.h" +#include "initstate.h" +#include "bootloader.h" +#include +#include + +namespace gambatte { +struct GB::Priv { + CPU cpu; + int stateNo; + bool gbaCgbMode; + + Priv() : stateNo(1), gbaCgbMode(false) {} + + void full_init(bool clearSram = true); +}; + +GB::GB() : p_(new Priv) {} + +GB::~GB() { + delete p_; +} + +long GB::runFor(gambatte::video_pixel_t *const videoBuf, const int pitch, + gambatte::uint_least32_t *const soundBuf, std::size_t soundBufSize, unsigned &samples) { + + p_->cpu.setVideoBuffer(videoBuf, pitch); + p_->cpu.setSoundBuffer(soundBuf, soundBufSize); + const long cyclesSinceBlit = p_->cpu.runFor(samples * 2); + samples = p_->cpu.fillSoundBuffer(); + + return cyclesSinceBlit < 0 ? cyclesSinceBlit : static_cast(samples) - (cyclesSinceBlit >> 1); +} + +void GB::Priv::full_init(bool const clearSram) { + SaveState state; + + cpu.setStatePtrs(state); + setInitState(state, cpu.isCgb(), gbaCgbMode, clearSram); + + cpu.mem_.bootloader.reset(); + cpu.mem_.bootloader.set_address_space_start((void*)cpu.rombank0_ptr()); + cpu.mem_.bootloader.load(cpu.isCgb(), gbaCgbMode); + + if (cpu.mem_.bootloader.using_bootloader) { + uint8_t *ioamhram = (uint8_t*)state.mem.ioamhram.get(); + uint8_t serialctrl = (cpu.isCgb() || gbaCgbMode) ? 0x7C : 0x7E; + state.cpu.pc = 0x0000; + // the hw registers must be zeroed out to prevent the logo from being garbled + std::memset((void*)(ioamhram + 0x100), 0x00, 0x100); + //init values taken from SameBoy + ioamhram[0x100] = 0xCF;//joypad initial value + ioamhram[0x102] = serialctrl;//serialctrl + ioamhram[0x148] = 0xFC;//object palette 0 + ioamhram[0x149] = 0xFC;//object palette 1 + } + + cpu.loadState(state); + + /* Sachen MMC1 carts need their lock-state overlay installed + * (or their VRAM logo injected) AFTER the generic state + * restore has finished, so the MBC's loadState handler can't + * tear down the overlay based on the default-initialized + * SaveState fields. For every non-Sachen cart this is a + * no-op; for Sachen carts it also wires the read-count + * unlock trigger into the Memory hot path. */ + cpu.mem_.sachenLockSetup(cpu.mem_.bootloader.using_bootloader); +} + +void GB::reset() { + /* Battery-backed SRAM and RTC must persist across a soft reset + * (matching real-hardware behavior; the cart battery keeps + * volatile SRAM alive while the console is power-cycled). */ + p_->full_init(false); +} + +void GB::setInputGetter(InputGetter *getInput) { + p_->cpu.setInputGetter(getInput); +} + +void GB::setBootloaderGetter(bool (*getter)(void* userdata, bool isgbc, uint8_t* data, uint32_t max_size)) { + p_->cpu.mem_.bootloader.set_bootloader_getter(getter); +} + +#ifdef HAVE_NETWORK +void GB::setSerialIO(SerialIO *serial_io) { + p_->cpu.setSerialIO(serial_io); +} +#endif + +void *GB::savedata_ptr() { return p_->cpu.savedata_ptr(); } +unsigned GB::savedata_size() { return p_->cpu.savedata_size(); } +void *GB::rtcdata_ptr() { return p_->cpu.rtcdata_ptr(); } +unsigned GB::rtcdata_size() { return p_->cpu.rtcdata_size(); } + +int GB::load(const void *romdata, unsigned romsize, const unsigned flags) { + const int failed = p_->cpu.load(romdata, romsize, flags & (FORCE_DMG | FORCE_CGB), flags & MULTICART_COMPAT); + + if (!failed) { + p_->gbaCgbMode = flags & GBA_CGB; + p_->full_init(); + p_->stateNo = 1; + } + + return failed; +} + +bool GB::isCgb() const { + return p_->cpu.isCgb(); +} + +bool GB::isLoaded() const { + /* Previously this unconditionally returned true. The + * underlying Cartridge::loaded() reports whether an MBC has + * been instantiated, which is a faithful "is a ROM loaded" + * signal, so route through to it. */ + return p_->cpu.mem_.loaded(); +} + +void GB::setDmgPaletteColor(unsigned palNum, unsigned colorNum, unsigned rgb32) { + p_->cpu.setDmgPaletteColor(palNum, colorNum, rgb32); +} + +bool GB::loadState(const void *data, size_t size) { + SaveState state; + p_->cpu.setStatePtrs(state); + + if (StateSaver::loadState(state, data, size)) { + p_->cpu.loadState(state); + p_->cpu.mem_.bootloader.choosebank(state.mem.ioamhram.get()[0x150] != 0xFF); + return true; + } + return false; +} + +void GB::saveState(void *data) { + SaveState state; + p_->cpu.setStatePtrs(state); + p_->cpu.saveState(state); + StateSaver::saveState(state, data); +} + +size_t GB::stateSize() const { + SaveState state; + p_->cpu.setStatePtrs(state); + p_->cpu.saveState(state); + return StateSaver::stateSize(state); +} + +void GB::setColorCorrection(bool enable) { + p_->cpu.mem_.display_setColorCorrection(enable); +} + +void GB::setColorCorrectionMode(unsigned colorCorrectionMode) { + p_->cpu.mem_.display_setColorCorrectionMode(colorCorrectionMode); +} + +void GB::setColorCorrectionBrightness(float colorCorrectionBrightness) { + p_->cpu.mem_.display_setColorCorrectionBrightness(colorCorrectionBrightness); +} + +void GB::setDarkFilterLevel(unsigned darkFilterLevel) { + p_->cpu.mem_.display_setDarkFilterLevel(darkFilterLevel); +} + +video_pixel_t GB::gbcToRgb32(const unsigned bgr15) { + return p_->cpu.mem_.display_gbcToRgb32(bgr15); +} + + +void GB::setGameGenie(const std::string &codes) { + p_->cpu.setGameGenie(codes); +} + +void GB::setGameShark(const std::string &codes) { + p_->cpu.setGameShark(codes); +} + +void GB::clearCheats() { + p_->cpu.clearCheats(); +} + +#ifdef __LIBRETRO__ +void *GB::vram_ptr() const { + return p_->cpu.vram_ptr(); +} + +void *GB::rambank0_ptr() const { + return p_->cpu.rambank0_ptr(); +} + +void *GB::rambank1_ptr() const { + return p_->cpu.rambank1_ptr(); +} + +void *GB::rambank2_ptr() const { + return p_->cpu.rambank2_ptr(); +} + +void *GB::bankedram_ptr() const { + return p_->cpu.bankedram_ptr(); +} + +void *GB::rombank0_ptr() const { + return p_->cpu.rombank0_ptr(); +} + +void *GB::rombank1_ptr() const { + return p_->cpu.rombank1_ptr(); +} + +void *GB::zeropage_ptr() const { + return p_->cpu.zeropage_ptr(); +} + +void *GB::oamram_ptr() const { + return p_->cpu.oamram_ptr(); +} +#endif + +} + diff --git a/src/games/gambatte/src/initstate.cpp b/src/games/gambatte/src/initstate.cpp new file mode 100644 index 0000000..21c6ddf --- /dev/null +++ b/src/games/gambatte/src/initstate.cpp @@ -0,0 +1,1358 @@ +// +// Copyright (C) 2008 by sinamas +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License version 2 as +// published by the Free Software Foundation. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License version 2 for more details. +// +// You should have received a copy of the GNU General Public License +// version 2 along with this program; if not, write to the +// Free Software Foundation, Inc., +// 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +// + +#include "initstate.h" +#include "counterdef.h" +#include "savestate.h" +#include "sound/sound_unit.h" +#include +#include +#include + +namespace { + +static void setInitialCgbWram(unsigned char wram[]) { + static struct { unsigned short addr; unsigned char val; } const cgbWramDumpDiff[] = { + { 0x0083, 0x7F }, { 0x008B, 0x10 }, { 0x00C0, 0x7F }, { 0x00E1, 0x7F }, + { 0x00E2, 0x7F }, { 0x00EA, 0x10 }, { 0x010A, 0x40 }, { 0x0179, 0x01 }, + { 0x01AF, 0x01 }, { 0x0201, 0xFB }, { 0x0254, 0xF7 }, { 0x0264, 0x7F }, + { 0x02D1, 0xBF }, { 0x02D2, 0xFB }, { 0x0301, 0xF7 }, { 0x0313, 0xF7 }, + { 0x0315, 0x7F }, { 0x0325, 0x7F }, { 0x0339, 0x04 }, { 0x0354, 0x7F }, + { 0x0375, 0xFD }, { 0x0391, 0xFB }, { 0x03AC, 0x40 }, { 0x03C5, 0xFB }, + { 0x03FB, 0x20 }, { 0x0412, 0xF7 }, { 0x0422, 0xF7 }, { 0x04B1, 0xFB }, + { 0x04B5, 0x7F }, { 0x04C6, 0x7F }, { 0x04D0, 0xFB }, { 0x04D2, 0xDF }, + { 0x0504, 0x7F }, { 0x051C, 0x01 }, { 0x0523, 0xFD }, { 0x0532, 0xF7 }, + { 0x0535, 0xF7 }, { 0x0606, 0x7F }, { 0x0690, 0xF7 }, { 0x0697, 0xFB }, + { 0x0698, 0x02 }, { 0x06B5, 0x7F }, { 0x06E4, 0x7F }, { 0x06F1, 0xDF }, + { 0x06F9, 0x04 }, { 0x0730, 0xFD }, { 0x0783, 0xFB }, { 0x07B5, 0x7F }, + { 0x07B6, 0xF7 }, { 0x080E, 0xF7 }, { 0x081C, 0xF7 }, { 0x0849, 0xBF }, + { 0x0859, 0xF7 }, { 0x085E, 0x7F }, { 0x085F, 0x7F }, { 0x0869, 0x7F }, + { 0x086D, 0x7F }, { 0x086E, 0x7F }, { 0x0879, 0xBF }, { 0x087C, 0xFB }, + { 0x0889, 0xBB }, { 0x089A, 0xF7 }, { 0x089D, 0xD7 }, { 0x089E, 0x9F }, + { 0x08A9, 0x7F }, { 0x08AA, 0xFB }, { 0x08AC, 0x7F }, { 0x08AF, 0xF7 }, + { 0x08BB, 0xDF }, { 0x08D8, 0xFB }, { 0x08DB, 0x7F }, { 0x08DC, 0xBF }, + { 0x08E8, 0xF7 }, { 0x08FB, 0x7D }, { 0x08FC, 0x7F }, { 0x08FD, 0xFD }, + { 0x090A, 0xFB }, { 0x091C, 0xF7 }, { 0x091E, 0xDF }, { 0x0929, 0xF7 }, + { 0x092B, 0xF7 }, { 0x092C, 0xF7 }, { 0x092D, 0xFB }, { 0x094B, 0xF7 }, + { 0x094D, 0x7F }, { 0x095B, 0x7B }, { 0x0969, 0xF7 }, { 0x097C, 0x7F }, + { 0x097E, 0xF7 }, { 0x09DC, 0x5F }, { 0x09EB, 0xFD }, { 0x09EE, 0xDF }, + { 0x09EF, 0x7F }, { 0x09FB, 0xBF }, { 0x09FE, 0xF7 }, { 0x0A0A, 0xF7 }, + { 0x0A0E, 0xBF }, { 0x0A0F, 0x7F }, { 0x0A1A, 0xBF }, { 0x0A1C, 0x3F }, + { 0x0A2A, 0xFD }, { 0x0A2E, 0xF7 }, { 0x0A3C, 0xDF }, { 0x0A3E, 0xF7 }, + { 0x0A4B, 0xFB }, { 0x0A4F, 0xDF }, { 0x0A5C, 0xF7 }, { 0x0A6E, 0xF7 }, + { 0x0A7E, 0xB7 }, { 0x0A7F, 0xF7 }, { 0x0A81, 0x01 }, { 0x0A8D, 0xDF }, + { 0x0A9F, 0x7F }, { 0x0AAB, 0xFD }, { 0x0AAC, 0xFB }, { 0x0ABE, 0xBF }, + { 0x0AC9, 0xFB }, { 0x0ACF, 0xF7 }, { 0x0ADC, 0xF5 }, { 0x0ADD, 0xBF }, + { 0x0AEA, 0x7B }, { 0x0AEB, 0x7F }, { 0x0AF8, 0xFB }, { 0x0AFB, 0xDF }, + { 0x0B0D, 0x7F }, { 0x0B2E, 0xFD }, { 0x0B39, 0xF7 }, { 0x0B48, 0xBF }, + { 0x0B5D, 0x7F }, { 0x0B6B, 0x7F }, { 0x0B6D, 0xFB }, { 0x0B76, 0x10 }, + { 0x0B8B, 0x7F }, { 0x0B8C, 0xF5 }, { 0x0B8D, 0xDF }, { 0x0B9F, 0xBF }, + { 0x0BB9, 0xDF }, { 0x0BBF, 0x7F }, { 0x0BCE, 0xF7 }, { 0x0BDF, 0x7F }, + { 0x0BE9, 0x7F }, { 0x0BEE, 0xF7 }, { 0x0BF9, 0x7F }, { 0x0BFE, 0xB7 }, + { 0x0C09, 0xFD }, { 0x0C0C, 0xFD }, { 0x0C0D, 0xFD }, { 0x0C0F, 0xFB }, + { 0x0C18, 0xDB }, { 0x0C1A, 0xF7 }, { 0x0C1B, 0xBF }, { 0x0C1E, 0xF7 }, + { 0x0C29, 0x7F }, { 0x0C2D, 0xFD }, { 0x0C3F, 0x77 }, { 0x0C5B, 0xF7 }, + { 0x0C5E, 0xBF }, { 0x0C6B, 0x7F }, { 0x0C78, 0x7F }, { 0x0C79, 0xF7 }, + { 0x0C7D, 0xF7 }, { 0x0C8F, 0x77 }, { 0x0C9A, 0xF7 }, { 0x0CBB, 0xDB }, + { 0x0CBC, 0xF9 }, { 0x0CCE, 0x7F }, { 0x0CD8, 0xDF }, { 0x0CF8, 0x7F }, + { 0x0CFE, 0xFB }, { 0x0CFF, 0x7F }, { 0x0D09, 0xDB }, { 0x0D1C, 0xDF }, + { 0x0D1F, 0xF7 }, { 0x0D29, 0x7F }, { 0x0D2E, 0x7B }, { 0x0D39, 0x77 }, + { 0x0D3A, 0xFB }, { 0x0D3B, 0x7F }, { 0x0D3C, 0xDF }, { 0x0D3E, 0xFB }, + { 0x0D59, 0x7F }, { 0x0D5E, 0xDF }, { 0x0D6E, 0xFD }, { 0x0D78, 0xF7 }, + { 0x0D79, 0xFB }, { 0x0D7A, 0x7F }, { 0x0D8B, 0xFB }, { 0x0D8F, 0xBF }, + { 0x0D9B, 0xF7 }, { 0x0DBA, 0xBF }, { 0x0DBF, 0xD7 }, { 0x0DC9, 0x7F }, + { 0x0DCA, 0xF7 }, { 0x0DD8, 0xFB }, { 0x0DD9, 0xFB }, { 0x0DDA, 0xFD }, + { 0x0DDB, 0xF7 }, { 0x0DDD, 0xF7 }, { 0x0DDE, 0xF7 }, { 0x0DFB, 0xFB }, + { 0x0DFD, 0x7F }, { 0x0E08, 0xFB }, { 0x0E09, 0xFB }, { 0x0E18, 0xFB }, + { 0x0E29, 0xB7 }, { 0x0E2B, 0xFB }, { 0x0E3D, 0xF7 }, { 0x0E43, 0x20 }, + { 0x0E48, 0xF7 }, { 0x0E4D, 0xF7 }, { 0x0E5F, 0xF7 }, { 0x0E69, 0x7F }, + { 0x0E6B, 0xFB }, { 0x0E7E, 0x7B }, { 0x0E89, 0x7F }, { 0x0E8B, 0xFB }, + { 0x0E8D, 0xF7 }, { 0x0E99, 0xBF }, { 0x0E9B, 0xF7 }, { 0x0E9D, 0xF7 }, + { 0x0E9F, 0xF7 }, { 0x0EAB, 0xDF }, { 0x0EAF, 0xF7 }, { 0x0EB9, 0xDF }, + { 0x0EBD, 0x7F }, { 0x0EBE, 0xFB }, { 0x0ECB, 0xDF }, { 0x0ECE, 0xF7 }, + { 0x0ECF, 0x7F }, { 0x0EDF, 0xDF }, { 0x0EEB, 0xFD }, { 0x0EF8, 0xD7 }, + { 0x0EFC, 0x77 }, { 0x0EFD, 0xDF }, { 0x0EFF, 0x7F }, { 0x0F08, 0xF7 }, + { 0x0F0D, 0xDF }, { 0x0F1E, 0x7F }, { 0x0F2C, 0xDF }, { 0x0F2D, 0xF7 }, + { 0x0F2E, 0xFB }, { 0x0F2F, 0x7F }, { 0x0F38, 0xFB }, { 0x0F3B, 0xDF }, + { 0x0F43, 0x10 }, { 0x0F4B, 0x57 }, { 0x0F4C, 0x7F }, { 0x0F5F, 0xD7 }, + { 0x0F78, 0xBF }, { 0x0F8F, 0xBB }, { 0x0F9F, 0xF7 }, { 0x0FAB, 0xFD }, + { 0x0FAF, 0xF7 }, { 0x0FB8, 0xFB }, { 0x0FBE, 0x7F }, { 0x0FD9, 0xB3 }, + { 0x0FDD, 0xFB }, { 0x0FDF, 0x7F }, { 0x0FF2, 0xF7 }, { 0x0FFC, 0xF7 }, + { 0x10B0, 0xF7 }, { 0x10E0, 0xFD }, { 0x112B, 0x40 }, { 0x1150, 0xDF }, + { 0x1184, 0xBF }, { 0x1188, 0x01 }, { 0x11C1, 0x7F }, { 0x11E4, 0x7F }, + { 0x11F1, 0x7F }, { 0x1211, 0xF7 }, { 0x1214, 0xFD }, { 0x1215, 0xF7 }, + { 0x1244, 0xFB }, { 0x125B, 0x20 }, { 0x126C, 0x04 }, { 0x1272, 0xFD }, + { 0x12C1, 0xDF }, { 0x12DB, 0x10 }, { 0x12F0, 0x7F }, { 0x1364, 0xF7 }, + { 0x13F2, 0xFB }, { 0x1413, 0xDF }, { 0x1430, 0xF7 }, { 0x1436, 0xF7 }, + { 0x1450, 0x7F }, { 0x1470, 0xF7 }, { 0x1472, 0x7F }, { 0x14B4, 0xDF }, + { 0x14B6, 0xFB }, { 0x1516, 0xF7 }, { 0x151B, 0x01 }, { 0x1565, 0x7F }, + { 0x1597, 0xBF }, { 0x15A6, 0x7F }, { 0x15B0, 0x7F }, { 0x15C5, 0xBF }, + { 0x15D5, 0xFB }, { 0x15F2, 0xFD }, { 0x15FC, 0x04 }, { 0x161A, 0x10 }, + { 0x1689, 0x20 }, { 0x16A7, 0xFB }, { 0x170A, 0x02 }, { 0x1732, 0xFD }, + { 0x1744, 0x7F }, { 0x1759, 0x01 }, { 0x1761, 0xF7 }, { 0x1774, 0xF7 }, + { 0x1795, 0xFD }, { 0x179B, 0x10 }, { 0x17C4, 0xF7 }, { 0x1808, 0xDF }, + { 0x180B, 0xDF }, { 0x180F, 0x77 }, { 0x181D, 0x7F }, { 0x181F, 0xF7 }, + { 0x182C, 0x7F }, { 0x183F, 0x7F }, { 0x184A, 0x7F }, { 0x184D, 0x7F }, + { 0x184E, 0xF7 }, { 0x1859, 0x7F }, { 0x185F, 0x7F }, { 0x1864, 0x01 }, + { 0x1868, 0x3F }, { 0x186E, 0x9F }, { 0x186F, 0xF7 }, { 0x187A, 0xFB }, + { 0x188F, 0xBF }, { 0x189D, 0x7F }, { 0x189E, 0xFB }, { 0x18AA, 0xDF }, + { 0x18BE, 0x7F }, { 0x18CF, 0x7F }, { 0x18DB, 0x77 }, { 0x18DC, 0xDF }, + { 0x18E8, 0x77 }, { 0x18E9, 0x7F }, { 0x18FB, 0xF7 }, { 0x18FE, 0xF7 }, + { 0x191E, 0x7F }, { 0x191F, 0x7F }, { 0x1929, 0xBF }, { 0x192D, 0xDF }, + { 0x194C, 0xFB }, { 0x194E, 0xDF }, { 0x195B, 0x7F }, { 0x1968, 0xBF }, + { 0x196A, 0xF7 }, { 0x197F, 0xF7 }, { 0x198B, 0x7F }, { 0x198E, 0x7F }, + { 0x199B, 0xFB }, { 0x19A8, 0xDF }, { 0x19AA, 0xB7 }, { 0x19AB, 0x77 }, + { 0x19AD, 0xFD }, { 0x19B8, 0xBF }, { 0x19BE, 0xFD }, { 0x19BF, 0xDF }, + { 0x19DC, 0x7F }, { 0x19DF, 0x7D }, { 0x19EA, 0xDF }, { 0x19EC, 0xDF }, + { 0x19EF, 0x7F }, { 0x19FB, 0xFB }, { 0x19FC, 0xF7 }, { 0x19FD, 0xBF }, + { 0x19FF, 0xFE }, { 0x1A08, 0xDF }, { 0x1A0B, 0xF7 }, { 0x1A0D, 0x7F }, + { 0x1A0F, 0x7F }, { 0x1A1A, 0xBF }, { 0x1A1D, 0xBF }, { 0x1A1F, 0x7F }, + { 0x1A29, 0xFD }, { 0x1A2A, 0xFD }, { 0x1A2F, 0xF7 }, { 0x1A3E, 0x7F }, + { 0x1A49, 0xFD }, { 0x1A4A, 0xBB }, { 0x1A4C, 0xF7 }, { 0x1A4F, 0x7F }, + { 0x1A68, 0xF7 }, { 0x1A6D, 0xBF }, { 0x1A78, 0xBF }, { 0x1A7D, 0x7F }, + { 0x1A7E, 0xF7 }, { 0x1A9B, 0xF7 }, { 0x1A9C, 0xBF }, { 0x1A9D, 0xF7 }, + { 0x1A9F, 0x7F }, { 0x1AAA, 0x7F }, { 0x1ABF, 0xBF }, { 0x1ACA, 0xBF }, + { 0x1ACF, 0xF7 }, { 0x1ADA, 0xF7 }, { 0x1AEA, 0xFD }, { 0x1AFF, 0xFD }, + { 0x1B0B, 0xF7 }, { 0x1B19, 0x7F }, { 0x1B1D, 0xF7 }, { 0x1B1E, 0xF7 }, + { 0x1B29, 0xDF }, { 0x1B3B, 0xFB }, { 0x1B3C, 0xF7 }, { 0x1B4D, 0xFB }, + { 0x1B4F, 0xF7 }, { 0x1B6D, 0x7F }, { 0x1B6E, 0xF7 }, { 0x1B78, 0xF7 }, + { 0x1B9B, 0x7F }, { 0x1B9E, 0xDF }, { 0x1B9F, 0x7F }, { 0x1BAB, 0xBF }, + { 0x1BAF, 0xFD }, { 0x1BB8, 0xFB }, { 0x1BBA, 0xF7 }, { 0x1BBF, 0xF7 }, + { 0x1BCD, 0xDF }, { 0x1BDA, 0xDF }, { 0x1BDE, 0x77 }, { 0x1BF8, 0xBF }, + { 0x1BFC, 0xFD }, { 0x1BFD, 0xFB }, { 0x1BFE, 0xF7 }, { 0x1C0C, 0xF7 }, + { 0x1C0E, 0x7F }, { 0x1C1A, 0x7F }, { 0x1C1C, 0xFB }, { 0x1C2E, 0xFB }, + { 0x1C3E, 0xFD }, { 0x1C4D, 0x7F }, { 0x1C4F, 0xF7 }, { 0x1C5F, 0x7F }, + { 0x1C6A, 0xFD }, { 0x1C6E, 0xFB }, { 0x1C89, 0xFB }, { 0x1C8B, 0xFD }, + { 0x1C8E, 0xFD }, { 0x1C9A, 0xFB }, { 0x1C9C, 0x7F }, { 0x1CA8, 0xBF }, + { 0x1CA9, 0xBF }, { 0x1CAE, 0xBF }, { 0x1CB9, 0xF7 }, { 0x1CBA, 0x7F }, + { 0x1CBD, 0xDF }, { 0x1CCF, 0xF7 }, { 0x1D0C, 0xFB }, { 0x1D0F, 0x7F }, + { 0x1D18, 0xBF }, { 0x1D1F, 0xF7 }, { 0x1D28, 0xDF }, { 0x1D29, 0xF7 }, + { 0x1D2F, 0xF7 }, { 0x1D48, 0xD7 }, { 0x1D4A, 0xF7 }, { 0x1D59, 0xF7 }, + { 0x1D63, 0x40 }, { 0x1D6A, 0xF7 }, { 0x1D6C, 0xBF }, { 0x1D6E, 0xF7 }, + { 0x1D7D, 0xBF }, { 0x1D8E, 0xB7 }, { 0x1D9B, 0xFB }, { 0x1D9E, 0xFD }, + { 0x1DAD, 0x7F }, { 0x1DAF, 0x7F }, { 0x1DC8, 0xF7 }, { 0x1DCA, 0xBF }, + { 0x1DCF, 0xFB }, { 0x1DDB, 0xF7 }, { 0x1DDE, 0xBF }, { 0x1DE9, 0xBF }, + { 0x1E0F, 0xFD }, { 0x1E1B, 0xFD }, { 0x1E2B, 0xDF }, { 0x1E2D, 0x7F }, + { 0x1E39, 0xFB }, { 0x1E3A, 0x04 }, { 0x1E3D, 0xDF }, { 0x1E48, 0x5F }, + { 0x1E4D, 0x7F }, { 0x1E5E, 0x7F }, { 0x1E6B, 0x7F }, { 0x1E6F, 0x3F }, + { 0x1E7B, 0xFB }, { 0x1E7E, 0xF7 }, { 0x1E89, 0x7F }, { 0x1E8C, 0x7B }, + { 0x1E8F, 0xF7 }, { 0x1E99, 0xF7 }, { 0x1E9C, 0xF7 }, { 0x1E9F, 0xFB }, + { 0x1EA8, 0xFD }, { 0x1EAC, 0x7F }, { 0x1EAD, 0xF7 }, { 0x1EBF, 0xF7 }, + { 0x1ECF, 0x7F }, { 0x1EDC, 0xDF }, { 0x1EDD, 0xFD }, { 0x1EDE, 0x77 }, + { 0x1EDF, 0xF7 }, { 0x1EEE, 0xF5 }, { 0x1EEF, 0xF7 }, { 0x1EFB, 0xF3 }, + { 0x1F08, 0x7F }, { 0x1F09, 0xF7 }, { 0x1F0C, 0x7F }, { 0x1F19, 0xFB }, + { 0x1F1E, 0xFD }, { 0x1F2A, 0x02 }, { 0x1F38, 0xF7 }, { 0x1F4B, 0xDF }, + { 0x1F4F, 0xBF }, { 0x1F5C, 0xFD }, { 0x1F5D, 0xDF }, { 0x1F5F, 0x7F }, + { 0x1F78, 0xFB }, { 0x1F7A, 0x01 }, { 0x1F85, 0x01 }, { 0x1F88, 0x7F }, + { 0x1F89, 0xDF }, { 0x1F8B, 0xF7 }, { 0x1F9E, 0xFD }, { 0x1F9F, 0x7F }, + { 0x1FA8, 0xFB }, { 0x1FAC, 0xDF }, { 0x1FAE, 0xF7 }, { 0x1FAF, 0xDF }, + { 0x1FBB, 0xBF }, { 0x1FBE, 0xFB }, { 0x1FCB, 0x7F }, { 0x1FCE, 0x7F }, + { 0x1FD9, 0xF7 }, { 0x1FDE, 0xFB }, { 0x1FDF, 0x7F }, { 0x1FEB, 0x7F }, + { 0x1FF8, 0x7F }, { 0x1FFB, 0xDF }, { 0x1FFC, 0x7F }, { 0x1FFD, 0x7F }, + { 0x1FFE, 0xF7 }, { 0x2008, 0x1C }, { 0x200B, 0x03 }, { 0x2840, 0xFF }, + { 0x2841, 0x7F }, { 0x2842, 0xFF }, { 0x2843, 0x7F }, { 0x2844, 0xFF }, + { 0x2845, 0x7F }, { 0x2846, 0xFF }, { 0x2847, 0x7F }, { 0x2848, 0xFF }, + { 0x2849, 0x7F }, { 0x284A, 0xFF }, { 0x284B, 0x7F }, { 0x284C, 0xFF }, + { 0x284D, 0x7F }, { 0x284E, 0xFF }, { 0x284F, 0x7F }, { 0x2850, 0xFF }, + { 0x2851, 0x7F }, { 0x2852, 0xFF }, { 0x2853, 0x7F }, { 0x2854, 0xFF }, + { 0x2855, 0x7F }, { 0x2856, 0xFF }, { 0x2857, 0x7F }, { 0x2858, 0xFF }, + { 0x2859, 0x7F }, { 0x285A, 0xFF }, { 0x285B, 0x7F }, { 0x285C, 0xFF }, + { 0x285D, 0x7F }, { 0x285E, 0xFF }, { 0x285F, 0x7F }, { 0x2860, 0xFF }, + { 0x2861, 0x7F }, { 0x2862, 0xFF }, { 0x2863, 0x7F }, { 0x2864, 0xFF }, + { 0x2865, 0x7F }, { 0x2866, 0xFF }, { 0x2867, 0x7F }, { 0x2868, 0xFF }, + { 0x2869, 0x7F }, { 0x286A, 0xFF }, { 0x286B, 0x7F }, { 0x286C, 0xFF }, + { 0x286D, 0x7F }, { 0x286E, 0xFF }, { 0x286F, 0x7F }, { 0x2870, 0xFF }, + { 0x2871, 0x7F }, { 0x2872, 0xFF }, { 0x2873, 0x7F }, { 0x2874, 0xFF }, + { 0x2875, 0x7F }, { 0x2876, 0xFF }, { 0x2877, 0x7F }, { 0x2878, 0xFF }, + { 0x2879, 0x7F }, { 0x287A, 0xFF }, { 0x287B, 0x7F }, { 0x287C, 0xFF }, + { 0x287D, 0x7F }, { 0x287E, 0xFF }, { 0x287F, 0x7F }, { 0x2900, 0x80 }, + { 0x2901, 0x80 }, { 0x2902, 0x40 }, { 0x2903, 0x88 }, { 0x2904, 0x88 }, + { 0x2905, 0x68 }, { 0x2906, 0xDE }, { 0x2907, 0xDE }, { 0x2908, 0x70 }, + { 0x2909, 0xDE }, { 0x290A, 0xDE }, { 0x290B, 0x78 }, { 0x290C, 0x20 }, + { 0x290D, 0x20 }, { 0x290E, 0x38 }, { 0x290F, 0x20 }, { 0x2910, 0x20 }, + { 0x2911, 0x90 }, { 0x2912, 0x20 }, { 0x2913, 0x20 }, { 0x2914, 0xA0 }, + { 0x2915, 0xE0 }, { 0x2916, 0xE0 }, { 0x2917, 0xC0 }, { 0x2918, 0x98 }, + { 0x2919, 0x98 }, { 0x291A, 0x48 }, { 0x291B, 0x80 }, { 0x291C, 0x80 }, + { 0x291D, 0x50 }, { 0x291E, 0x1E }, { 0x291F, 0x1E }, { 0x2920, 0x58 }, + { 0x2921, 0x20 }, { 0x2922, 0x20 }, { 0x2923, 0xE0 }, { 0x2924, 0x88 }, + { 0x2925, 0x88 }, { 0x2926, 0x10 }, { 0x2927, 0x20 }, { 0x2928, 0x20 }, + { 0x2929, 0x10 }, { 0x292A, 0x20 }, { 0x292B, 0x20 }, { 0x292C, 0x18 }, + { 0x292D, 0xE0 }, { 0x292E, 0xE0 }, { 0x2930, 0x18 }, { 0x2931, 0x18 }, + { 0x2932, 0x20 }, { 0x2933, 0xA8 }, { 0x2934, 0xA8 }, { 0x2935, 0x20 }, + { 0x2936, 0x18 }, { 0x2937, 0x18 }, { 0x2939, 0x20 }, { 0x293A, 0x20 }, + { 0x293B, 0xD8 }, { 0x293C, 0xC8 }, { 0x293D, 0xC8 }, { 0x293E, 0xE0 }, + { 0x2941, 0x40 }, { 0x2942, 0x28 }, { 0x2943, 0x28 }, { 0x2944, 0x28 }, + { 0x2945, 0x18 }, { 0x2946, 0x18 }, { 0x2947, 0x60 }, { 0x2948, 0x20 }, + { 0x2949, 0x20 }, { 0x294A, 0xE0 }, { 0x294D, 0x08 }, { 0x294E, 0xE0 }, + { 0x294F, 0xE0 }, { 0x2950, 0x30 }, { 0x2951, 0xD0 }, { 0x2952, 0xD0 }, + { 0x2953, 0xD0 }, { 0x2954, 0x20 }, { 0x2955, 0x20 }, { 0x2956, 0xE8 }, + { 0x2957, 0xFF }, { 0x2958, 0xFF }, { 0x2959, 0xBF }, { 0x2A00, 0xFF }, + { 0x2A01, 0x7F }, { 0x2A02, 0xDF }, { 0x2A03, 0x01 }, { 0x2A04, 0x12 }, + { 0x2A05, 0x01 }, { 0x2A08, 0xFF }, { 0x2A09, 0x7F }, { 0x2A0A, 0xDF }, + { 0x2A0B, 0x01 }, { 0x2A0C, 0x12 }, { 0x2A0D, 0x01 }, { 0x2A10, 0xFF }, + { 0x2A11, 0x7F }, { 0x2A12, 0xB5 }, { 0x2A13, 0x42 }, { 0x2A14, 0xC8 }, + { 0x2A15, 0x3D }, { 0x2A18, 0x1F }, { 0x2A19, 0x23 }, { 0x2A1A, 0x5F }, + { 0x2A1B, 0x03 }, { 0x2A1C, 0xF2 }, { 0x2A1E, 0x09 }, { 0x2A20, 0x1F }, + { 0x2A21, 0x23 }, { 0x2A22, 0x5F }, { 0x2A23, 0x03 }, { 0x2A24, 0xF2 }, + { 0x2A26, 0x09 }, { 0x2A28, 0xFF }, { 0x2A29, 0x4F }, { 0x2A2A, 0xD2 }, + { 0x2A2B, 0x7E }, { 0x2A2C, 0x4C }, { 0x2A2D, 0x3A }, { 0x2A2E, 0xE0 }, + { 0x2A2F, 0x1C }, { 0x2A30, 0xFF }, { 0x2A31, 0x7F }, { 0x2A32, 0xFF }, + { 0x2A33, 0x7F }, { 0x2A34, 0x8C }, { 0x2A35, 0x7E }, { 0x2A37, 0x7C }, + { 0x2A38, 0xFF }, { 0x2A39, 0x7F }, { 0x2A3A, 0xFF }, { 0x2A3B, 0x7F }, + { 0x2A3C, 0x8C }, { 0x2A3D, 0x7E }, { 0x2A3F, 0x7C }, { 0x2A40, 0xED }, + { 0x2A41, 0x03 }, { 0x2A42, 0xFF }, { 0x2A43, 0x7F }, { 0x2A44, 0x5F }, + { 0x2A45, 0x25 }, { 0x2A48, 0xFF }, { 0x2A49, 0x7F }, { 0x2A4A, 0xFF }, + { 0x2A4B, 0x7F }, { 0x2A4C, 0x8C }, { 0x2A4D, 0x7E }, { 0x2A4F, 0x7C }, + { 0x2A50, 0xFF }, { 0x2A51, 0x7F }, { 0x2A52, 0xFF }, { 0x2A53, 0x7F }, + { 0x2A54, 0x8C }, { 0x2A55, 0x7E }, { 0x2A57, 0x7C }, { 0x2A58, 0x6A }, + { 0x2A59, 0x03 }, { 0x2A5A, 0x1F }, { 0x2A5B, 0x02 }, { 0x2A5C, 0xFF }, + { 0x2A5D, 0x03 }, { 0x2A5E, 0xFF }, { 0x2A5F, 0x7F }, { 0x2A60, 0xFF }, + { 0x2A61, 0x7F }, { 0x2A62, 0x1F }, { 0x2A63, 0x42 }, { 0x2A64, 0xF2 }, + { 0x2A65, 0x1C }, { 0x2A68, 0xFF }, { 0x2A69, 0x7F }, { 0x2A6A, 0x1F }, + { 0x2A6B, 0x42 }, { 0x2A6C, 0xF2 }, { 0x2A6D, 0x1C }, { 0x2A70, 0xFF }, + { 0x2A71, 0x7F }, { 0x2A72, 0xEF }, { 0x2A73, 0x03 }, { 0x2A74, 0xD6 }, + { 0x2A75, 0x01 }, { 0x2A78, 0xFF }, { 0x2A79, 0x7F }, { 0x2A7A, 0x1F }, + { 0x2A7B, 0x42 }, { 0x2A7C, 0xF2 }, { 0x2A7D, 0x1C }, { 0x2A80, 0xFF }, + { 0x2A81, 0x7F }, { 0x2A82, 0x1F }, { 0x2A83, 0x42 }, { 0x2A84, 0xF2 }, + { 0x2A85, 0x1C }, { 0x2A88, 0xFF }, { 0x2A89, 0x7F }, { 0x2A8A, 0xEA }, + { 0x2A8B, 0x03 }, { 0x2A8C, 0x1F }, { 0x2A8D, 0x01 }, { 0x2A90, 0xFF }, + { 0x2A91, 0x7F }, { 0x2A92, 0x1F }, { 0x2A93, 0x42 }, { 0x2A94, 0xF2 }, + { 0x2A95, 0x1C }, { 0x2A98, 0xFF }, { 0x2A99, 0x7F }, { 0x2A9A, 0x1F }, + { 0x2A9B, 0x42 }, { 0x2A9C, 0xF2 }, { 0x2A9D, 0x1C }, { 0x2AA0, 0xFF }, + { 0x2AA1, 0x7F }, { 0x2AA2, 0x7F }, { 0x2AA3, 0x02 }, { 0x2AA4, 0x1F }, + { 0x2AA8, 0xFF }, { 0x2AA9, 0x7F }, { 0x2AAA, 0x8C }, { 0x2AAB, 0x7E }, + { 0x2AAD, 0x7C }, { 0x2AB0, 0xFF }, { 0x2AB1, 0x7F }, { 0x2AB2, 0x8C }, + { 0x2AB3, 0x7E }, { 0x2AB5, 0x7C }, { 0x2AB8, 0xFF }, { 0x2AB9, 0x7F }, + { 0x2ABA, 0xFF }, { 0x2ABB, 0x03 }, { 0x2ABC, 0x1F }, { 0x2AC0, 0x9F }, + { 0x2AC1, 0x29 }, { 0x2AC2, 0x1A }, { 0x2AC4, 0x0C }, { 0x2AC8, 0x9F }, + { 0x2AC9, 0x29 }, { 0x2ACA, 0x1A }, { 0x2ACC, 0x0C }, { 0x2AD0, 0x74 }, + { 0x2AD1, 0x7E }, { 0x2AD2, 0xFF }, { 0x2AD3, 0x03 }, { 0x2AD4, 0x80 }, + { 0x2AD5, 0x01 }, { 0x2AD8, 0xFF }, { 0x2AD9, 0x7F }, { 0x2ADA, 0xDF }, + { 0x2ADB, 0x01 }, { 0x2ADC, 0x12 }, { 0x2ADD, 0x01 }, { 0x2AE0, 0xFF }, + { 0x2AE1, 0x7F }, { 0x2AE2, 0xDF }, { 0x2AE3, 0x01 }, { 0x2AE4, 0x12 }, + { 0x2AE5, 0x01 }, { 0x2AE8, 0xFF }, { 0x2AE9, 0x67 }, { 0x2AEA, 0xAC }, + { 0x2AEB, 0x77 }, { 0x2AEC, 0x13 }, { 0x2AED, 0x1A }, { 0x2AEE, 0x6B }, + { 0x2AEF, 0x2D }, { 0x2AF2, 0xFF }, { 0x2AF3, 0x7F }, { 0x2AF4, 0x1F }, + { 0x2AF5, 0x42 }, { 0x2AF6, 0xF2 }, { 0x2AF7, 0x1C }, { 0x2AFA, 0xFF }, + { 0x2AFB, 0x7F }, { 0x2AFC, 0x1F }, { 0x2AFD, 0x42 }, { 0x2AFE, 0xF2 }, + { 0x2AFF, 0x1C }, { 0x2B00, 0xD6 }, { 0x2B01, 0x7E }, { 0x2B02, 0xFF }, + { 0x2B03, 0x4B }, { 0x2B04, 0x75 }, { 0x2B05, 0x21 }, { 0x2B08, 0xFF }, + { 0x2B09, 0x7F }, { 0x2B0A, 0x1F }, { 0x2B0B, 0x42 }, { 0x2B0C, 0xF2 }, + { 0x2B0D, 0x1C }, { 0x2B10, 0xFF }, { 0x2B11, 0x7F }, { 0x2B12, 0x1F }, + { 0x2B13, 0x42 }, { 0x2B14, 0xF2 }, { 0x2B15, 0x1C }, { 0x2B18, 0xFF }, + { 0x2B19, 0x7F }, { 0x2B1A, 0x8C }, { 0x2B1B, 0x7E }, { 0x2B1D, 0x7C }, + { 0x2B20, 0x1F }, { 0x2B21, 0x23 }, { 0x2B22, 0x5F }, { 0x2B23, 0x03 }, + { 0x2B24, 0xF2 }, { 0x2B26, 0x09 }, { 0x2B28, 0x1F }, { 0x2B29, 0x23 }, + { 0x2B2A, 0x5F }, { 0x2B2B, 0x03 }, { 0x2B2C, 0xF2 }, { 0x2B2E, 0x09 }, + { 0x2B30, 0xFF }, { 0x2B31, 0x7F }, { 0x2B32, 0x31 }, { 0x2B33, 0x6E }, + { 0x2B34, 0x4A }, { 0x2B35, 0x45 }, { 0x2B38, 0xFF }, { 0x2B39, 0x7F }, + { 0x2B3A, 0x1F }, { 0x2B3B, 0x42 }, { 0x2B3C, 0xF2 }, { 0x2B3D, 0x1C }, + { 0x2B40, 0xFF }, { 0x2B41, 0x7F }, { 0x2B42, 0x1F }, { 0x2B43, 0x42 }, + { 0x2B44, 0xF2 }, { 0x2B45, 0x1C }, { 0x2B48, 0xFF }, { 0x2B49, 0x7F }, + { 0x2B4A, 0x31 }, { 0x2B4B, 0x6E }, { 0x2B4C, 0x4A }, { 0x2B4D, 0x45 }, + { 0x2B50, 0xFF }, { 0x2B51, 0x7F }, { 0x2B52, 0x1F }, { 0x2B53, 0x42 }, + { 0x2B54, 0xF2 }, { 0x2B55, 0x1C }, { 0x2B58, 0xFF }, { 0x2B59, 0x7F }, + { 0x2B5A, 0x1F }, { 0x2B5B, 0x42 }, { 0x2B5C, 0xF2 }, { 0x2B5D, 0x1C }, + { 0x2B60, 0xFF }, { 0x2B61, 0x7F }, { 0x2B62, 0xEF }, { 0x2B63, 0x1B }, + { 0x2B65, 0x02 }, { 0x2B68, 0xFF }, { 0x2B69, 0x7F }, { 0x2B6A, 0x8C }, + { 0x2B6B, 0x7E }, { 0x2B6D, 0x7C }, { 0x2B70, 0xFF }, { 0x2B71, 0x7F }, + { 0x2B72, 0x8C }, { 0x2B73, 0x7E }, { 0x2B75, 0x7C }, { 0x2B78, 0xFF }, + { 0x2B79, 0x7F }, { 0x2B7A, 0xBF }, { 0x2B7B, 0x32 }, { 0x2B7C, 0xD0 }, + { 0x2B80, 0xFF }, { 0x2B81, 0x7F }, { 0x2B82, 0xEF }, { 0x2B83, 0x1B }, + { 0x2B85, 0x02 }, { 0x2B88, 0xFF }, { 0x2B89, 0x7F }, { 0x2B8A, 0xEF }, + { 0x2B8B, 0x1B }, { 0x2B8D, 0x02 }, { 0x2B90, 0xFF }, { 0x2B91, 0x7F }, + { 0x2B92, 0x1F }, { 0x2B93, 0x42 }, { 0x2B94, 0xF2 }, { 0x2B95, 0x1C }, + { 0x2B98, 0xFF }, { 0x2B99, 0x7F }, { 0x2B9A, 0xE0 }, { 0x2B9B, 0x03 }, + { 0x2B9C, 0x06 }, { 0x2B9D, 0x02 }, { 0x2B9E, 0x20 }, { 0x2B9F, 0x01 }, + { 0x2BA0, 0xFF }, { 0x2BA1, 0x7F }, { 0x2BA2, 0xE0 }, { 0x2BA3, 0x03 }, + { 0x2BA4, 0x06 }, { 0x2BA5, 0x02 }, { 0x2BA6, 0x20 }, { 0x2BA7, 0x01 }, + { 0x2BA8, 0xFF }, { 0x2BA9, 0x7F }, { 0x2BAA, 0x1F }, { 0x2BAB, 0x42 }, + { 0x2BAC, 0xF2 }, { 0x2BAD, 0x1C }, { 0x2BB0, 0xFF }, { 0x2BB1, 0x7F }, + { 0x2BB2, 0xEF }, { 0x2BB3, 0x1B }, { 0x2BB5, 0x02 }, { 0x2BB8, 0xFF }, + { 0x2BB9, 0x7F }, { 0x2BBA, 0xEF }, { 0x2BBB, 0x1B }, { 0x2BBD, 0x02 }, + { 0x2BC0, 0xFF }, { 0x2BC1, 0x7F }, { 0x2BC2, 0xBF }, { 0x2BC3, 0x32 }, + { 0x2BC4, 0xD0 }, { 0x2BC8, 0xFF }, { 0x2BC9, 0x7F }, { 0x2BCA, 0x1F }, + { 0x2BCB, 0x42 }, { 0x2BCC, 0xF2 }, { 0x2BCD, 0x1C }, { 0x2BD0, 0xFF }, + { 0x2BD1, 0x7F }, { 0x2BD2, 0x1F }, { 0x2BD3, 0x42 }, { 0x2BD4, 0xF2 }, + { 0x2BD5, 0x1C }, { 0x2BDB, 0x42 }, { 0x2BDC, 0x7F }, { 0x2BDD, 0x03 }, + { 0x2BDE, 0xFF }, { 0x2BDF, 0x7F }, { 0x2BE0, 0xFF }, { 0x2BE1, 0x03 }, + { 0x2BE2, 0x1F }, { 0x2BE4, 0x0C }, { 0x2BE8, 0xFF }, { 0x2BE9, 0x03 }, + { 0x2BEA, 0x1F }, { 0x2BEC, 0x0C }, { 0x2BF0, 0xFF }, { 0x2BF1, 0x7F }, + { 0x2BF2, 0x8C }, { 0x2BF3, 0x7E }, { 0x2BF5, 0x7C }, { 0x2BF8, 0xFF }, + { 0x2BF9, 0x7F }, { 0x2BFA, 0xBF }, { 0x2BFB, 0x32 }, { 0x2BFC, 0xD0 }, + { 0x2C00, 0xFF }, { 0x2C01, 0x7F }, { 0x2C02, 0xBF }, { 0x2C03, 0x32 }, + { 0x2C04, 0xD0 }, { 0x2C08, 0xFF }, { 0x2C09, 0x7F }, { 0x2C0A, 0xB5 }, + { 0x2C0B, 0x42 }, { 0x2C0C, 0xC8 }, { 0x2C0D, 0x3D }, { 0x2C10, 0xFF }, + { 0x2C11, 0x7F }, { 0x2C12, 0x94 }, { 0x2C13, 0x52 }, { 0x2C14, 0x4A }, + { 0x2C15, 0x29 }, { 0x2C18, 0xFF }, { 0x2C19, 0x7F }, { 0x2C1A, 0x94 }, + { 0x2C1B, 0x52 }, { 0x2C1C, 0x4A }, { 0x2C1D, 0x29 }, { 0x2C20, 0xFF }, + { 0x2C21, 0x7F }, { 0x2C22, 0x94 }, { 0x2C23, 0x52 }, { 0x2C24, 0x4A }, + { 0x2C25, 0x29 }, { 0x2C28, 0xFF }, { 0x2C29, 0x7F }, { 0x2C2A, 0xEF }, + { 0x2C2B, 0x1B }, { 0x2C2D, 0x02 }, { 0x2C30, 0xFF }, { 0x2C31, 0x7F }, + { 0x2C32, 0xEF }, { 0x2C33, 0x1B }, { 0x2C35, 0x02 }, { 0x2C38, 0xFF }, + { 0x2C39, 0x53 }, { 0x2C3A, 0x5F }, { 0x2C3B, 0x4A }, { 0x2C3C, 0x52 }, + { 0x2C3D, 0x7E }, { 0x2C40, 0xFF }, { 0x2C41, 0x7F }, { 0x2C42, 0x1F }, + { 0x2C43, 0x42 }, { 0x2C44, 0xF2 }, { 0x2C45, 0x1C }, { 0x2C48, 0xFF }, + { 0x2C49, 0x7F }, { 0x2C4A, 0x1F }, { 0x2C4B, 0x42 }, { 0x2C4C, 0xF2 }, + { 0x2C4D, 0x1C }, { 0x2C50, 0xFF }, { 0x2C51, 0x7F }, { 0x2C52, 0x8C }, + { 0x2C53, 0x7E }, { 0x2C55, 0x7C }, { 0x2C58, 0xFF }, { 0x2C59, 0x7F }, + { 0x2C5A, 0xBF }, { 0x2C5B, 0x32 }, { 0x2C5C, 0xD0 }, { 0x2C60, 0xFF }, + { 0x2C61, 0x7F }, { 0x2C62, 0xBF }, { 0x2C63, 0x32 }, { 0x2C64, 0xD0 }, + { 0x2C68, 0x9F }, { 0x2C69, 0x63 }, { 0x2C6A, 0x79 }, { 0x2C6B, 0x42 }, + { 0x2C6C, 0xB0 }, { 0x2C6D, 0x15 }, { 0x2C6E, 0xCB }, { 0x2C6F, 0x04 }, + { 0x2C70, 0xFF }, { 0x2C71, 0x7F }, { 0x2C72, 0x8C }, { 0x2C73, 0x7E }, + { 0x2C75, 0x7C }, { 0x2C78, 0xFF }, { 0x2C79, 0x7F }, { 0x2C7A, 0x8C }, + { 0x2C7B, 0x7E }, { 0x2C7D, 0x7C }, { 0x2C80, 0xFF }, { 0x2C81, 0x7F }, + { 0x2C82, 0xFF }, { 0x2C83, 0x03 }, { 0x2C84, 0x2F }, { 0x2C85, 0x01 }, + { 0x2C88, 0xFF }, { 0x2C89, 0x7F }, { 0x2C8A, 0x3F }, { 0x2C8B, 0x03 }, + { 0x2C8C, 0x93 }, { 0x2C8D, 0x01 }, { 0x2C90, 0xFF }, { 0x2C91, 0x7F }, + { 0x2C92, 0x3F }, { 0x2C93, 0x03 }, { 0x2C94, 0x93 }, { 0x2C95, 0x01 }, + { 0x2C98, 0xFF }, { 0x2C99, 0x7F }, { 0x2C9A, 0x3F }, { 0x2C9B, 0x03 }, + { 0x2C9C, 0x93 }, { 0x2C9D, 0x01 }, { 0x2CA0, 0xFF }, { 0x2CA1, 0x7F }, + { 0x2CA2, 0x1F }, { 0x2CA3, 0x42 }, { 0x2CA4, 0xF2 }, { 0x2CA5, 0x1C }, + { 0x2CA8, 0xFF }, { 0x2CA9, 0x7F }, { 0x2CAA, 0x1F }, { 0x2CAB, 0x42 }, + { 0x2CAC, 0xF2 }, { 0x2CAD, 0x1C }, { 0x2CB0, 0xFF }, { 0x2CB1, 0x7F }, + { 0x2CB2, 0xEF }, { 0x2CB3, 0x1B }, { 0x2CB4, 0x80 }, { 0x2CB5, 0x61 }, + { 0x2CB8, 0x20 }, { 0x2CB9, 0x21 }, { 0x2CBA, 0x22 }, { 0x2CBB, 0x80 }, + { 0x2CBC, 0x81 }, { 0x2CBD, 0x82 }, { 0x2CBE, 0x10 }, { 0x2CBF, 0x11 }, + { 0x2CC0, 0x20 }, { 0x2CC1, 0x21 }, { 0x2CC2, 0x22 }, { 0x2CC3, 0x80 }, + { 0x2CC4, 0x81 }, { 0x2CC5, 0x82 }, { 0x2CC6, 0x10 }, { 0x2CC7, 0x11 }, + { 0x2CC9, 0xFF }, { 0x2CCA, 0x7F }, { 0x2CCB, 0xFF }, { 0x2CCC, 0x03 }, + { 0x2CCD, 0x1F }, { 0x2CD0, 0xFF }, { 0x2CD1, 0x7F }, { 0x2CD2, 0xBF }, + { 0x2CD3, 0x32 }, { 0x2CD4, 0xD0 }, { 0x2CD8, 0xFF }, { 0x2CD9, 0x7F }, + { 0x2CDA, 0xBF }, { 0x2CDB, 0x32 }, { 0x2CDC, 0xD0 }, { 0x2CE0, 0xFF }, + { 0x2CE1, 0x7F }, { 0x2CE2, 0xBF }, { 0x2CE3, 0x32 }, { 0x2CE4, 0xD0 }, + { 0x2CE8, 0xFF }, { 0x2CE9, 0x7F }, { 0x2CEA, 0xBF }, { 0x2CEB, 0x32 }, + { 0x2CEC, 0xD0 }, { 0x2CF0, 0xFF }, { 0x2CF1, 0x7F }, { 0x2CF2, 0xBF }, + { 0x2CF3, 0x32 }, { 0x2CF4, 0xD0 }, { 0x2CF8, 0xFF }, { 0x2CF9, 0x7F }, + { 0x2CFA, 0xBF }, { 0x2CFB, 0x32 }, { 0x2CFC, 0xD0 }, { 0x307F, 0x40 }, + { 0x30E9, 0x02 }, { 0x30F4, 0xBF }, { 0x3107, 0xF7 }, { 0x3180, 0x3F }, + { 0x31BB, 0x10 }, { 0x31F4, 0xDF }, { 0x3212, 0x7F }, { 0x3225, 0x7F }, + { 0x326A, 0x01 }, { 0x32B0, 0x7F }, { 0x32B5, 0xF7 }, { 0x32F0, 0xFD }, + { 0x32F6, 0x7F }, { 0x3300, 0x7F }, { 0x3311, 0xF7 }, { 0x3331, 0xDF }, + { 0x3354, 0xF7 }, { 0x3397, 0xBF }, { 0x33BC, 0x04 }, { 0x3437, 0xDF }, + { 0x34D1, 0x7F }, { 0x34E1, 0xDF }, { 0x3510, 0xBF }, { 0x3547, 0x7F }, + { 0x3573, 0xF7 }, { 0x3586, 0xDF }, { 0x35A5, 0xBF }, { 0x35B0, 0xF7 }, + { 0x35D7, 0xF7 }, { 0x3601, 0xDF }, { 0x3607, 0xBD }, { 0x3634, 0xF7 }, + { 0x3690, 0xF7 }, { 0x369A, 0x04 }, { 0x36C8, 0x10 }, { 0x36D2, 0xF7 }, + { 0x36E3, 0xBF }, { 0x3705, 0xFD }, { 0x371C, 0x40 }, { 0x371D, 0x01 }, + { 0x371F, 0x04 }, { 0x372E, 0x40 }, { 0x3731, 0xDF }, { 0x3768, 0x01 }, + { 0x3780, 0xBF }, { 0x37A7, 0x7F }, { 0x37CD, 0x01 }, { 0x37F6, 0xF7 }, + { 0x3808, 0x7F }, { 0x380C, 0xBF }, { 0x3834, 0x02 }, { 0x383A, 0xBF }, + { 0x384D, 0xBF }, { 0x385A, 0x7F }, { 0x385D, 0x7F }, { 0x386B, 0xBF }, + { 0x387B, 0xFB }, { 0x387C, 0xFD }, { 0x3889, 0xBF }, { 0x388A, 0x7F }, + { 0x38A8, 0xF7 }, { 0x38AA, 0x7F }, { 0x38AE, 0xBF }, { 0x38BC, 0x7F }, + { 0x38EC, 0xDF }, { 0x38FB, 0xF7 }, { 0x38FC, 0xFD }, { 0x390B, 0xBF }, + { 0x392B, 0x7F }, { 0x392D, 0xBF }, { 0x393D, 0xFB }, { 0x3958, 0xFD }, + { 0x395F, 0xF7 }, { 0x396F, 0x7F }, { 0x3979, 0xDF }, { 0x397F, 0x7F }, + { 0x3989, 0xF3 }, { 0x398F, 0x7F }, { 0x3998, 0xBF }, { 0x399E, 0xF7 }, + { 0x399F, 0xFB }, { 0x39AC, 0xF7 }, { 0x39AD, 0xDF }, { 0x39AE, 0xF7 }, + { 0x39AF, 0xF7 }, { 0x39BA, 0xF7 }, { 0x39BB, 0xF7 }, { 0x39BE, 0xFB }, + { 0x39BF, 0x7F }, { 0x39C8, 0xFB }, { 0x39CC, 0xF7 }, { 0x39D9, 0x7F }, + { 0x39DE, 0x7F }, { 0x39DF, 0x7F }, { 0x39EA, 0xF7 }, { 0x39FD, 0xBF }, + { 0x39FE, 0xF7 }, { 0x3A09, 0x7F }, { 0x3A18, 0xBF }, { 0x3A1B, 0xBF }, + { 0x3A1D, 0xF7 }, { 0x3A2B, 0xBF }, { 0x3A2C, 0xF7 }, { 0x3A2F, 0x7F }, + { 0x3A3E, 0xDF }, { 0x3A4E, 0x7F }, { 0x3A4F, 0x7F }, { 0x3A5D, 0x7F }, + { 0x3A6D, 0xDF }, { 0x3A6E, 0xDF }, { 0x3A8B, 0xF7 }, { 0x3A99, 0xBF }, + { 0x3A9D, 0x7F }, { 0x3A9E, 0xF7 }, { 0x3AAB, 0xF7 }, { 0x3AAC, 0xDF }, + { 0x3AAE, 0xF7 }, { 0x3ACD, 0xD7 }, { 0x3ACE, 0xF7 }, { 0x3AD8, 0x7F }, + { 0x3AE9, 0xFD }, { 0x3AEB, 0x3F }, { 0x3AFB, 0xF7 }, { 0x3B1C, 0xF5 }, + { 0x3B2B, 0xF7 }, { 0x3B2C, 0x9F }, { 0x3B2D, 0xBF }, { 0x3B3C, 0xDB }, + { 0x3B3D, 0xF7 }, { 0x3B3E, 0x7F }, { 0x3B3F, 0xFB }, { 0x3B48, 0xFB }, + { 0x3B4B, 0x7F }, { 0x3B4C, 0xF7 }, { 0x3B5A, 0x7F }, { 0x3B6A, 0x7F }, + { 0x3B6B, 0xBF }, { 0x3B7B, 0xFB }, { 0x3B7D, 0x7F }, { 0x3B7F, 0xBF }, + { 0x3B8D, 0xFB }, { 0x3B8F, 0x5F }, { 0x3B98, 0x7F }, { 0x3B9A, 0x7F }, + { 0x3B9E, 0xFD }, { 0x3BAB, 0xFD }, { 0x3BAC, 0xDF }, { 0x3BAF, 0xF7 }, + { 0x3BB2, 0x02 }, { 0x3BBB, 0x7F }, { 0x3BCE, 0xFD }, { 0x3BDB, 0xBF }, + { 0x3C18, 0x7F }, { 0x3C1F, 0x7F }, { 0x3C2B, 0xF7 }, { 0x3C39, 0xFD }, + { 0x3C4A, 0x77 }, { 0x3C4C, 0x7F }, { 0x3C59, 0xBF }, { 0x3C5F, 0xFB }, + { 0x3C68, 0x7F }, { 0x3C69, 0xDF }, { 0x3C6A, 0xBB }, { 0x3C6F, 0x7F }, + { 0x3C79, 0xF7 }, { 0x3C8B, 0xDF }, { 0x3C9A, 0x5F }, { 0x3CA9, 0x7F }, + { 0x3CAF, 0xBF }, { 0x3CB8, 0xBF }, { 0x3CB9, 0x7F }, { 0x3CBA, 0x7F }, + { 0x3CBB, 0x7F }, { 0x3CBC, 0xBF }, { 0x3CBF, 0xDD }, { 0x3CC8, 0xDF }, + { 0x3CCF, 0x7F }, { 0x3CDD, 0xF7 }, { 0x3CDE, 0x77 }, { 0x3CE8, 0xF7 }, + { 0x3CEB, 0xDF }, { 0x3CEF, 0xFB }, { 0x3CF0, 0x01 }, { 0x3CF9, 0x7F }, + { 0x3CFB, 0xF7 }, { 0x3D19, 0xF7 }, { 0x3D2A, 0xFB }, { 0x3D2F, 0x7F }, + { 0x3D3B, 0xDD }, { 0x3D3F, 0xFB }, { 0x3D48, 0xBF }, { 0x3D5B, 0xF7 }, + { 0x3D6F, 0xBF }, { 0x3D7D, 0xFB }, { 0x3D8A, 0x7F }, { 0x3D8C, 0xFB }, + { 0x3D96, 0x40 }, { 0x3D9F, 0x7F }, { 0x3DAA, 0xF7 }, { 0x3DAD, 0xF7 }, + { 0x3DAF, 0x77 }, { 0x3DB8, 0x7F }, { 0x3DBC, 0xBF }, { 0x3DBD, 0xDF }, + { 0x3DC9, 0xF7 }, { 0x3DEF, 0xDF }, { 0x3DFA, 0xDF }, { 0x3DFD, 0xFD }, + { 0x3DFE, 0xFB }, { 0x3E18, 0xFB }, { 0x3E1F, 0xF7 }, { 0x3E2D, 0xDF }, + { 0x3E2F, 0xFB }, { 0x3E3D, 0x7F }, { 0x3E3F, 0xFB }, { 0x3E48, 0xF5 }, + { 0x3E49, 0xFD }, { 0x3E5C, 0xFB }, { 0x3E5F, 0x5F }, { 0x3E6D, 0xBF }, + { 0x3E6F, 0x7F }, { 0x3E7C, 0xFD }, { 0x3E7E, 0x7F }, { 0x3E88, 0xFD }, + { 0x3E9E, 0xFD }, { 0x3EAE, 0x7F }, { 0x3EBC, 0xDF }, { 0x3ECD, 0x77 }, + { 0x3EED, 0xF7 }, { 0x3EFB, 0x7F }, { 0x3F08, 0xF7 }, { 0x3F0F, 0xFD }, + { 0x3F1D, 0xBF }, { 0x3F1E, 0x9F }, { 0x3F29, 0xFB }, { 0x3F2E, 0x7F }, + { 0x3F39, 0xDF }, { 0x3F3F, 0xDF }, { 0x3F48, 0xDF }, { 0x3F4E, 0xFB }, + { 0x3F69, 0xFD }, { 0x3F7C, 0xFD }, { 0x3F7E, 0x3F }, { 0x3F89, 0xF7 }, + { 0x3F9B, 0xF7 }, { 0x3F9E, 0xF7 }, { 0x3FAE, 0x7F }, { 0x3FB2, 0xDF }, + { 0x3FBC, 0xF7 }, { 0x3FD9, 0xBD }, { 0x3FDB, 0xD7 }, { 0x3FDE, 0x7F }, + { 0x3FEE, 0x7F }, { 0x3FEF, 0x7F }, { 0x3FFE, 0x7B }, { 0x4045, 0x7F }, + { 0x408C, 0x20 }, { 0x40A7, 0xFD }, { 0x40B3, 0xD7 }, { 0x40D1, 0x7F }, + { 0x40E0, 0x77 }, { 0x40FE, 0x40 }, { 0x4103, 0x7F }, { 0x4130, 0xBF }, + { 0x413D, 0x10 }, { 0x4152, 0xF7 }, { 0x4159, 0x01 }, { 0x417D, 0x02 }, + { 0x41A5, 0xDF }, { 0x41A7, 0x7F }, { 0x4218, 0x40 }, { 0x421F, 0x02 }, + { 0x4222, 0xF7 }, { 0x4286, 0xF7 }, { 0x42E3, 0x9F }, { 0x4303, 0xFB }, + { 0x434E, 0x04 }, { 0x43BA, 0x01 }, { 0x4408, 0x01 }, { 0x4413, 0xF7 }, + { 0x442E, 0x20 }, { 0x443B, 0x01 }, { 0x44C7, 0x7F }, { 0x44E0, 0x7F }, + { 0x44E7, 0xF7 }, { 0x4523, 0xF7 }, { 0x4534, 0x7F }, { 0x4546, 0x7F }, + { 0x4579, 0x10 }, { 0x458A, 0x01 }, { 0x4594, 0xFB }, { 0x459A, 0x02 }, + { 0x45B4, 0xF7 }, { 0x45B6, 0xFD }, { 0x45C5, 0x7F }, { 0x45D5, 0x7F }, + { 0x45F0, 0xF7 }, { 0x4613, 0xFB }, { 0x4638, 0x01 }, { 0x4678, 0x01 }, + { 0x4694, 0xBF }, { 0x46A0, 0xF7 }, { 0x46CE, 0x01 }, { 0x46D6, 0xBF }, + { 0x46F4, 0xF7 }, { 0x46F5, 0xDF }, { 0x4710, 0x7F }, { 0x4727, 0x7F }, + { 0x472B, 0x04 }, { 0x4730, 0xBF }, { 0x4736, 0x7F }, { 0x4762, 0xF7 }, + { 0x476C, 0x04 }, { 0x477B, 0x04 }, { 0x47D5, 0xFB }, { 0x47E4, 0xBF }, + { 0x47F0, 0xDF }, { 0x4809, 0x7F }, { 0x480D, 0x7F }, { 0x481E, 0xDF }, + { 0x4828, 0x7F }, { 0x482E, 0xFD }, { 0x4838, 0xFD }, { 0x483D, 0x7F }, + { 0x483F, 0xFB }, { 0x484B, 0xFD }, { 0x484D, 0x7F }, { 0x485E, 0xFD }, + { 0x486F, 0xBF }, { 0x4878, 0xDF }, { 0x4888, 0xFB }, { 0x4889, 0xF7 }, + { 0x488D, 0x7F }, { 0x48A9, 0x7F }, { 0x48AC, 0xDF }, { 0x48AE, 0x7F }, + { 0x48B4, 0x01 }, { 0x48BC, 0xF7 }, { 0x48BD, 0xBB }, { 0x48BE, 0xF7 }, + { 0x48C8, 0xFB }, { 0x48CB, 0xDF }, { 0x48CC, 0x7F }, { 0x48ED, 0xFB }, + { 0x48EE, 0x7F }, { 0x48F0, 0x10 }, { 0x490B, 0xB7 }, { 0x4929, 0x7F }, + { 0x492E, 0xBF }, { 0x4930, 0x01 }, { 0x493D, 0xDF }, { 0x4948, 0xFB }, + { 0x494A, 0x7F }, { 0x494E, 0xFB }, { 0x496E, 0x5F }, { 0x496F, 0xDF }, + { 0x4979, 0xF7 }, { 0x498E, 0xDF }, { 0x499A, 0xFB }, { 0x499D, 0xF7 }, + { 0x499F, 0xF7 }, { 0x49A9, 0xBF }, { 0x49AA, 0x7F }, { 0x49BD, 0xF7 }, + { 0x49BE, 0xFD }, { 0x49C9, 0xBF }, { 0x49DE, 0x7F }, { 0x49EB, 0xFD }, + { 0x49EE, 0x7F }, { 0x4A1B, 0xF7 }, { 0x4A1D, 0x77 }, { 0x4A1E, 0x7F }, + { 0x4A1F, 0xBF }, { 0x4A2B, 0xDF }, { 0x4A30, 0x40 }, { 0x4A3F, 0xF3 }, + { 0x4A4F, 0xFB }, { 0x4A58, 0xF7 }, { 0x4A69, 0xF7 }, { 0x4A6B, 0xF7 }, + { 0x4A6E, 0xF7 }, { 0x4A7E, 0xFD }, { 0x4A8F, 0x7F }, { 0x4A99, 0x7F }, + { 0x4A9A, 0xF7 }, { 0x4A9D, 0x7F }, { 0x4A9E, 0xFB }, { 0x4AAE, 0xFD }, + { 0x4AB9, 0x7F }, { 0x4ABC, 0x7F }, { 0x4ABD, 0xF7 }, { 0x4ACB, 0xBF }, + { 0x4ACE, 0xF7 }, { 0x4ACF, 0xDF }, { 0x4ADC, 0xF7 }, { 0x4ADE, 0xFB }, + { 0x4AEE, 0xBF }, { 0x4AFF, 0x7F }, { 0x4B1B, 0xFB }, { 0x4B1E, 0xF3 }, + { 0x4B28, 0xF7 }, { 0x4B3A, 0xF7 }, { 0x4B3B, 0x5D }, { 0x4B3D, 0xFB }, + { 0x4B3F, 0x3F }, { 0x4B4D, 0xBF }, { 0x4B4E, 0xF7 }, { 0x4B5F, 0x7F }, + { 0x4B6E, 0xFB }, { 0x4B8A, 0xDF }, { 0x4B8F, 0x7F }, { 0x4B90, 0x10 }, + { 0x4B9B, 0xDD }, { 0x4B9F, 0x7F }, { 0x4BA9, 0x7F }, { 0x4BAC, 0xBF }, + { 0x4BB9, 0xFD }, { 0x4BC8, 0xFB }, { 0x4BCA, 0xFB }, { 0x4BCB, 0xDB }, + { 0x4BCD, 0x77 }, { 0x4BDB, 0xFD }, { 0x4BDC, 0xF7 }, { 0x4BDF, 0x7F }, + { 0x4BE9, 0x7F }, { 0x4BF9, 0xF7 }, { 0x4BFA, 0xFB }, { 0x4BFB, 0xBF }, + { 0x4BFD, 0x77 }, { 0x4BFE, 0xF9 }, { 0x4C0A, 0x7F }, { 0x4C0F, 0xBF }, + { 0x4C18, 0xFD }, { 0x4C19, 0xBF }, { 0x4C1B, 0xF7 }, { 0x4C1C, 0x7F }, + { 0x4C1E, 0x7F }, { 0x4C1F, 0x7F }, { 0x4C38, 0xF7 }, { 0x4C3D, 0xF7 }, + { 0x4C48, 0xDF }, { 0x4C4A, 0xF7 }, { 0x4C4D, 0xDF }, { 0x4C5D, 0xF7 }, + { 0x4C68, 0x7F }, { 0x4C6B, 0x7F }, { 0x4C6F, 0x7F }, { 0x4C7F, 0x7F }, + { 0x4C81, 0x40 }, { 0x4C88, 0xFB }, { 0x4C99, 0xF7 }, { 0x4C9C, 0x7F }, + { 0x4C9D, 0x7F }, { 0x4CAE, 0x7F }, { 0x4CAF, 0x7F }, { 0x4CBA, 0xBF }, + { 0x4CBB, 0x7F }, { 0x4CBC, 0xFB }, { 0x4CBF, 0xF7 }, { 0x4CCA, 0xBF }, + { 0x4CCB, 0xBF }, { 0x4CCF, 0xBF }, { 0x4CDA, 0xF3 }, { 0x4CDB, 0xBF }, + { 0x4CE8, 0xFD }, { 0x4CEB, 0xFB }, { 0x4CED, 0xDF }, { 0x4D08, 0xBF }, + { 0x4D0A, 0x77 }, { 0x4D19, 0xFB }, { 0x4D1C, 0xFB }, { 0x4D1F, 0xBF }, + { 0x4D2F, 0x7D }, { 0x4D39, 0xBF }, { 0x4D3A, 0xDF }, { 0x4D3B, 0x77 }, + { 0x4D5A, 0xBF }, { 0x4D5B, 0x77 }, { 0x4D5E, 0xF7 }, { 0x4D7A, 0xB7 }, + { 0x4D7B, 0xF7 }, { 0x4D7C, 0x7F }, { 0x4D7F, 0x7F }, { 0x4D8D, 0xDF }, + { 0x4D8F, 0xF7 }, { 0x4D9F, 0x7F }, { 0x4DBD, 0x7F }, { 0x4DCC, 0xBF }, + { 0x4DCF, 0x7F }, { 0x4DD8, 0xFD }, { 0x4DDB, 0x7F }, { 0x4DE5, 0x04 }, + { 0x4DFA, 0xBF }, { 0x4E0B, 0xDF }, { 0x4E0C, 0x7F }, { 0x4E19, 0xFD }, + { 0x4E1B, 0xF7 }, { 0x4E1F, 0xFB }, { 0x4E4F, 0x7F }, { 0x4E69, 0x7F }, + { 0x4E6F, 0xFD }, { 0x4E7B, 0xFB }, { 0x4E7F, 0xBF }, { 0x4E89, 0xF7 }, + { 0x4E98, 0xFB }, { 0x4E9E, 0x7F }, { 0x4EA8, 0xF7 }, { 0x4EA9, 0xFD }, + { 0x4EBB, 0xD7 }, { 0x4EC8, 0xBF }, { 0x4EE0, 0x40 }, { 0x4EEC, 0xF7 }, + { 0x4EFB, 0xFB }, { 0x4EFC, 0x7F }, { 0x4EFF, 0xFD }, { 0x4F0C, 0x7F }, + { 0x4F0D, 0xFB }, { 0x4F1D, 0xFB }, { 0x4F28, 0xBF }, { 0x4F3D, 0xBF }, + { 0x4F4D, 0xDF }, { 0x4F4F, 0xFB }, { 0x4F5C, 0xF7 }, { 0x4F5E, 0xF7 }, + { 0x4F6F, 0xFD }, { 0x4F78, 0xF7 }, { 0x4F7B, 0xF7 }, { 0x4F7D, 0x7F }, + { 0x4F85, 0x10 }, { 0x4F99, 0xFD }, { 0x4F9D, 0x7F }, { 0x4F9F, 0x7F }, + { 0x4FAB, 0xFB }, { 0x4FAC, 0x7F }, { 0x4FAD, 0x7D }, { 0x4FAF, 0xFD }, + { 0x4FBD, 0xF7 }, { 0x4FC8, 0x7D }, { 0x4FD9, 0x9F }, { 0x4FDE, 0x7F }, + { 0x4FE9, 0x7F }, { 0x4FED, 0xFD }, { 0x4FEE, 0xFD }, { 0x4FF9, 0xF7 }, + { 0x4FFC, 0xBF }, { 0x4FFF, 0x7F }, { 0x5008, 0x01 }, { 0x5063, 0xBF }, + { 0x5086, 0xBF }, { 0x509A, 0x04 }, { 0x50B1, 0xF7 }, { 0x50DC, 0x04 }, + { 0x5131, 0x7F }, { 0x514E, 0x20 }, { 0x515A, 0x10 }, { 0x517B, 0x01 }, + { 0x518F, 0x01 }, { 0x51A2, 0xBF }, { 0x51D1, 0x7F }, { 0x5201, 0xFB }, + { 0x5212, 0xF7 }, { 0x5219, 0x04 }, { 0x5232, 0xF7 }, { 0x5242, 0x7F }, + { 0x531B, 0x01 }, { 0x5347, 0x7F }, { 0x5367, 0x7F }, { 0x5372, 0xF7 }, + { 0x5384, 0xFD }, { 0x53B4, 0xFB }, { 0x53D0, 0xF7 }, { 0x5410, 0xFB }, + { 0x5442, 0xFD }, { 0x5455, 0x7F }, { 0x5456, 0xBF }, { 0x5462, 0x7F }, + { 0x5490, 0xBF }, { 0x5524, 0xFB }, { 0x5542, 0xF7 }, { 0x5562, 0xDF }, + { 0x5575, 0xF7 }, { 0x5581, 0xDF }, { 0x5582, 0xBF }, { 0x55D7, 0x7F }, + { 0x55F6, 0xF7 }, { 0x5612, 0xDF }, { 0x5613, 0x7F }, { 0x5627, 0xFB }, + { 0x5644, 0x7F }, { 0x56FA, 0x02 }, { 0x5725, 0xF7 }, { 0x5734, 0xFD }, + { 0x5739, 0x02 }, { 0x57E9, 0x20 }, { 0x580A, 0xFB }, { 0x580D, 0x7F }, + { 0x5819, 0x7F }, { 0x581E, 0xFD }, { 0x582F, 0xF7 }, { 0x584D, 0xBF }, + { 0x584F, 0xFB }, { 0x5859, 0xF7 }, { 0x586D, 0xBF }, { 0x587C, 0xDF }, + { 0x587E, 0xF7 }, { 0x5889, 0xFD }, { 0x5898, 0xBF }, { 0x589C, 0xF7 }, + { 0x58AA, 0xBF }, { 0x58CB, 0xDF }, { 0x58EE, 0xF7 }, { 0x58FF, 0x7F }, + { 0x590E, 0xFB }, { 0x5918, 0xBF }, { 0x5929, 0x7F }, { 0x592A, 0xBF }, + { 0x592B, 0xFD }, { 0x593A, 0xBF }, { 0x593E, 0x7F }, { 0x5949, 0x7F }, + { 0x595B, 0x7F }, { 0x5979, 0x7F }, { 0x597D, 0x7F }, { 0x5988, 0x7F }, + { 0x5989, 0xBF }, { 0x598B, 0x7F }, { 0x5998, 0xBF }, { 0x599F, 0xFD }, + { 0x59A8, 0xDF }, { 0x59AE, 0xFD }, { 0x59B8, 0x7F }, { 0x59CA, 0xFB }, + { 0x59CE, 0x7F }, { 0x59CF, 0xFB }, { 0x59DD, 0xBF }, { 0x59EA, 0xFB }, + { 0x59EB, 0x7F }, { 0x59F8, 0xF7 }, { 0x59F9, 0xFD }, { 0x59FA, 0xF7 }, + { 0x5A0F, 0xDF }, { 0x5A1A, 0xF7 }, { 0x5A1D, 0x7F }, { 0x5A1F, 0xBF }, + { 0x5A2E, 0xF7 }, { 0x5A3F, 0x7F }, { 0x5A59, 0xDF }, { 0x5A5A, 0xB7 }, + { 0x5A5F, 0x7F }, { 0x5A6D, 0xF7 }, { 0x5A7C, 0xDF }, { 0x5A8F, 0x7F }, + { 0x5A98, 0x7B }, { 0x5AAA, 0x7F }, { 0x5AAF, 0x7F }, { 0x5ABC, 0x7F }, + { 0x5ABD, 0xFD }, { 0x5ACD, 0xDF }, { 0x5AD9, 0xBF }, { 0x5ADF, 0x7F }, + { 0x5AE8, 0x7F }, { 0x5AEA, 0xF7 }, { 0x5AED, 0xF7 }, { 0x5AFE, 0xF7 }, + { 0x5AFF, 0x5F }, { 0x5B09, 0xFB }, { 0x5B0A, 0xFB }, { 0x5B0E, 0xBF }, + { 0x5B0F, 0x7B }, { 0x5B28, 0xFD }, { 0x5B2B, 0xFB }, { 0x5B2E, 0xBF }, + { 0x5B2F, 0xFB }, { 0x5B3D, 0xF7 }, { 0x5B3F, 0xF7 }, { 0x5B49, 0x7F }, + { 0x5B4E, 0xF7 }, { 0x5B5E, 0xF7 }, { 0x5B6B, 0x7F }, { 0x5B6C, 0xBF }, + { 0x5B6F, 0x7F }, { 0x5B79, 0x7F }, { 0x5B7E, 0x5F }, { 0x5B8E, 0xDF }, + { 0x5B99, 0xF3 }, { 0x5B9F, 0xD7 }, { 0x5BA8, 0xBF }, { 0x5BAA, 0xBF }, + { 0x5BAC, 0xF7 }, { 0x5BAD, 0x77 }, { 0x5BBA, 0x7F }, { 0x5BBE, 0xF7 }, + { 0x5BCA, 0xBF }, { 0x5BCF, 0x5F }, { 0x5BD2, 0x40 }, { 0x5BDB, 0xF7 }, + { 0x5BEA, 0xF7 }, { 0x5BEB, 0xF7 }, { 0x5BFB, 0xBB }, { 0x5BFD, 0xF7 }, + { 0x5C0E, 0x7F }, { 0x5C0F, 0xDF }, { 0x5C1A, 0xF7 }, { 0x5C28, 0x7F }, + { 0x5C2B, 0xF7 }, { 0x5C3D, 0xDF }, { 0x5C3E, 0xFB }, { 0x5C4A, 0xDF }, + { 0x5C4C, 0xDF }, { 0x5C4D, 0xFD }, { 0x5C5C, 0x7F }, { 0x5C6D, 0x7F }, + { 0x5C7F, 0x7F }, { 0x5C85, 0x01 }, { 0x5C8A, 0xFD }, { 0x5C8B, 0x7F }, + { 0x5C9B, 0xBF }, { 0x5C9F, 0x7F }, { 0x5CAE, 0x7F }, { 0x5CAF, 0x7F }, + { 0x5CB9, 0xFB }, { 0x5CCE, 0xFD }, { 0x5CD3, 0x04 }, { 0x5CD6, 0x01 }, + { 0x5CDF, 0xFD }, { 0x5CEB, 0x7F }, { 0x5CF9, 0xBF }, { 0x5D0B, 0xBF }, + { 0x5D1D, 0xFD }, { 0x5D1E, 0x7F }, { 0x5D2B, 0xFD }, { 0x5D2C, 0xFD }, + { 0x5D2D, 0x7F }, { 0x5D2F, 0xBF }, { 0x5D3A, 0x7F }, { 0x5D3B, 0xF7 }, + { 0x5D4B, 0xFB }, { 0x5D4D, 0xFB }, { 0x5D4F, 0xF7 }, { 0x5D5A, 0xFD }, + { 0x5D5B, 0xDF }, { 0x5D5C, 0x7F }, { 0x5D5E, 0xBF }, { 0x5D69, 0xFB }, + { 0x5D6B, 0xB7 }, { 0x5D6D, 0xBF }, { 0x5D70, 0x02 }, { 0x5D78, 0xF7 }, + { 0x5D7F, 0xFB }, { 0x5D8A, 0xDF }, { 0x5D8F, 0xFD }, { 0x5D99, 0xBF }, + { 0x5D9E, 0xDF }, { 0x5DAC, 0xFB }, { 0x5DCB, 0x7F }, { 0x5DCD, 0xBF }, + { 0x5DDB, 0xD7 }, { 0x5DDE, 0x7F }, { 0x5DE9, 0x7F }, { 0x5DEA, 0xFB }, + { 0x5DFF, 0x7F }, { 0x5E19, 0xF7 }, { 0x5E1F, 0xFB }, { 0x5E28, 0xBF }, + { 0x5E2D, 0xDF }, { 0x5E3D, 0x7F }, { 0x5E49, 0x7F }, { 0x5E4E, 0xFB }, + { 0x5E5C, 0xBF }, { 0x5E68, 0xFD }, { 0x5E6C, 0xDF }, { 0x5E6D, 0xDF }, + { 0x5E79, 0xDF }, { 0x5E7D, 0x7F }, { 0x5E99, 0x7F }, { 0x5EAF, 0xBF }, + { 0x5EBC, 0xDF }, { 0x5EC8, 0xBF }, { 0x5ECC, 0xF7 }, { 0x5ED2, 0xBF }, + { 0x5EF9, 0xF7 }, { 0x5EFE, 0xDF }, { 0x5F08, 0xF7 }, { 0x5F0F, 0xF7 }, + { 0x5F18, 0xFD }, { 0x5F19, 0x7F }, { 0x5F1B, 0xFD }, { 0x5F3F, 0x7F }, + { 0x5F4C, 0xFD }, { 0x5F4E, 0xF7 }, { 0x5F5C, 0x7F }, { 0x5F5D, 0xF7 }, + { 0x5F5E, 0x7F }, { 0x5F69, 0xFB }, { 0x5F6C, 0xFD }, { 0x5F6F, 0xDF }, + { 0x5F92, 0xF7 }, { 0x5FAD, 0x7F }, { 0x5FAE, 0xF7 }, { 0x5FCD, 0xF7 }, + { 0x5FCF, 0xBF }, { 0x5FDC, 0xF7 }, { 0x5FDE, 0x7F }, { 0x5FDF, 0x7F }, + { 0x5FEB, 0x7F }, { 0x5FED, 0xDF }, { 0x5FF8, 0xDF }, { 0x600C, 0x20 }, + { 0x6041, 0xBF }, { 0x6045, 0x7F }, { 0x6062, 0xF7 }, { 0x6077, 0xBF }, + { 0x60A0, 0xDF }, { 0x60C1, 0x7F }, { 0x60C7, 0xFD }, { 0x60CB, 0x40 }, + { 0x60E8, 0x01 }, { 0x6118, 0x02 }, { 0x613C, 0x01 }, { 0x6143, 0xF7 }, + { 0x614A, 0x40 }, { 0x615B, 0x10 }, { 0x616F, 0x01 }, { 0x617C, 0x01 }, + { 0x6190, 0xDF }, { 0x6196, 0xF7 }, { 0x61A6, 0x7F }, { 0x61D6, 0xF7 }, + { 0x61F8, 0x04 }, { 0x61FA, 0x10 }, { 0x6201, 0x7F }, { 0x62A7, 0xBF }, + { 0x62D4, 0x7F }, { 0x6322, 0xF7 }, { 0x6361, 0xFB }, { 0x6363, 0x7F }, + { 0x6374, 0xF7 }, { 0x6392, 0x7F }, { 0x639F, 0x01 }, { 0x63A0, 0xF7 }, + { 0x63A1, 0x7F }, { 0x63D9, 0x20 }, { 0x63E8, 0x01 }, { 0x6406, 0x7F }, + { 0x6424, 0x7F }, { 0x6437, 0x7F }, { 0x643B, 0x01 }, { 0x64B1, 0xFB }, + { 0x6514, 0xF7 }, { 0x6536, 0xFD }, { 0x6546, 0x7F }, { 0x6578, 0x01 }, + { 0x6582, 0x7F }, { 0x65A3, 0xFB }, { 0x65B9, 0x01 }, { 0x65C9, 0x01 }, + { 0x65E0, 0xF7 }, { 0x6612, 0xDF }, { 0x6632, 0xF7 }, { 0x6636, 0x7F }, + { 0x6651, 0xF7 }, { 0x6666, 0xF7 }, { 0x6675, 0x7F }, { 0x6684, 0x7F }, + { 0x6687, 0x7F }, { 0x66E9, 0x40 }, { 0x6706, 0xFD }, { 0x6713, 0xDF }, + { 0x6758, 0x11 }, { 0x6773, 0xF7 }, { 0x6776, 0xBF }, { 0x67F0, 0x7F }, + { 0x682B, 0xFB }, { 0x682C, 0xFB }, { 0x683E, 0xF5 }, { 0x683F, 0x7F }, + { 0x6849, 0xF7 }, { 0x685C, 0xF5 }, { 0x686C, 0x7F }, { 0x686D, 0xF7 }, + { 0x686E, 0x7F }, { 0x687E, 0xDF }, { 0x6889, 0x7F }, { 0x688E, 0xBF }, + { 0x688F, 0x7F }, { 0x689B, 0xF7 }, { 0x689C, 0xF7 }, { 0x689E, 0x7F }, + { 0x68CB, 0xBF }, { 0x68E9, 0x7F }, { 0x68EA, 0xDF }, { 0x68EB, 0x7F }, + { 0x68EF, 0xF7 }, { 0x690B, 0xF7 }, { 0x6918, 0xBF }, { 0x691D, 0xF7 }, + { 0x6929, 0x7F }, { 0x6938, 0x7F }, { 0x693A, 0x3F }, { 0x693E, 0x3F }, + { 0x6949, 0xF7 }, { 0x694C, 0x7F }, { 0x694D, 0xDF }, { 0x694E, 0x77 }, + { 0x695A, 0xFD }, { 0x697B, 0x7F }, { 0x697E, 0x7F }, { 0x6989, 0x7F }, + { 0x698A, 0x7F }, { 0x698E, 0xF7 }, { 0x698F, 0xF7 }, { 0x699B, 0xDF }, + { 0x699E, 0x5F }, { 0x699F, 0xDF }, { 0x69AD, 0x7F }, { 0x69C9, 0xF7 }, + { 0x69D9, 0xF7 }, { 0x69DC, 0xF7 }, { 0x69F9, 0xBF }, { 0x69FA, 0xF7 }, + { 0x69FC, 0x7F }, { 0x6A09, 0xF7 }, { 0x6A1B, 0x7F }, { 0x6A2A, 0xF7 }, + { 0x6A2D, 0xFD }, { 0x6A3C, 0xFD }, { 0x6A3D, 0x7F }, { 0x6A3F, 0x7F }, + { 0x6A5A, 0xBF }, { 0x6A6C, 0xFB }, { 0x6A6F, 0xFD }, { 0x6A7A, 0xF7 }, + { 0x6A7B, 0x7B }, { 0x6A89, 0x7F }, { 0x6A9F, 0x7F }, { 0x6AAB, 0xDF }, + { 0x6AB8, 0xF7 }, { 0x6ABE, 0xFD }, { 0x6AC8, 0xFD }, { 0x6ACB, 0x7F }, + { 0x6ACF, 0xD7 }, { 0x6ADC, 0xFD }, { 0x6AEA, 0xBF }, { 0x6AEB, 0xF7 }, + { 0x6AF8, 0xFB }, { 0x6AFD, 0xBF }, { 0x6B1A, 0x7F }, { 0x6B1F, 0x7F }, + { 0x6B2D, 0xFD }, { 0x6B2E, 0xD7 }, { 0x6B3E, 0xDF }, { 0x6B4B, 0xF7 }, + { 0x6B4D, 0xFB }, { 0x6B4F, 0xBF }, { 0x6B5E, 0x7B }, { 0x6B5F, 0x7F }, + { 0x6B6C, 0xFB }, { 0x6B6F, 0xDF }, { 0x6B88, 0xDD }, { 0x6B8A, 0xFB }, + { 0x6B8B, 0x77 }, { 0x6BA8, 0x7F }, { 0x6BAA, 0xF7 }, { 0x6BCA, 0xFB }, + { 0x6BCB, 0xF7 }, { 0x6BDB, 0xDF }, { 0x6BDC, 0xBF }, { 0x6BDD, 0x77 }, + { 0x6BDF, 0xFD }, { 0x6BE8, 0x7F }, { 0x6BE9, 0xF7 }, { 0x6BED, 0x7F }, + { 0x6BF8, 0xFD }, { 0x6BF9, 0xF5 }, { 0x6BFA, 0xF7 }, { 0x6BFD, 0xF5 }, + { 0x6BFE, 0xF7 }, { 0x6BFF, 0xBF }, { 0x6C09, 0xFB }, { 0x6C0F, 0x7F }, + { 0x6C29, 0xD7 }, { 0x6C2F, 0x7F }, { 0x6C3A, 0xDF }, { 0x6C3E, 0xF7 }, + { 0x6C4E, 0xBF }, { 0x6C5E, 0x7F }, { 0x6C5F, 0xDF }, { 0x6C79, 0xDF }, + { 0x6C7A, 0x7F }, { 0x6C7E, 0xBF }, { 0x6C8B, 0x7F }, { 0x6C8D, 0xDF }, + { 0x6C99, 0xFD }, { 0x6C9A, 0xBF }, { 0x6C9E, 0x7F }, { 0x6CA9, 0x7F }, + { 0x6CAA, 0xF7 }, { 0x6CAC, 0xFB }, { 0x6CAD, 0x7F }, { 0x6CAF, 0xF7 }, + { 0x6CC9, 0xFB }, { 0x6CDC, 0xFD }, { 0x6CEC, 0xDF }, { 0x6CEF, 0xBF }, + { 0x6CFB, 0x7F }, { 0x6D1D, 0xFD }, { 0x6D1F, 0xDF }, { 0x6D2B, 0xD9 }, + { 0x6D3B, 0x7F }, { 0x6D3C, 0xB7 }, { 0x6D4D, 0xBF }, { 0x6D58, 0x7F }, + { 0x6D5C, 0x7F }, { 0x6D6D, 0xFD }, { 0x6D7E, 0x7F }, { 0x6D89, 0xBF }, + { 0x6D9B, 0x7F }, { 0x6D9F, 0xF7 }, { 0x6DB9, 0x7F }, { 0x6DBF, 0xFB }, + { 0x6DE9, 0x7F }, { 0x6DEA, 0xF7 }, { 0x6DEC, 0xBF }, { 0x6DFB, 0x7F }, + { 0x6E09, 0x7F }, { 0x6E0F, 0x7F }, { 0x6E10, 0x01 }, { 0x6E12, 0xDF }, + { 0x6E1E, 0xFB }, { 0x6E28, 0xF7 }, { 0x6E2E, 0xFB }, { 0x6E4E, 0x7F }, + { 0x6E72, 0x7F }, { 0x6E79, 0x7F }, { 0x6E7E, 0x9F }, { 0x6E88, 0x7F }, + { 0x6E8E, 0xF7 }, { 0x6E9E, 0xBF }, { 0x6EAC, 0xFD }, { 0x6EAD, 0xF7 }, + { 0x6EAF, 0x7F }, { 0x6EB9, 0xFB }, { 0x6EBE, 0x7F }, { 0x6EC9, 0x7F }, + { 0x6EE8, 0xF7 }, { 0x6EE9, 0x77 }, { 0x6EEB, 0xF7 }, { 0x6EEC, 0x7F }, + { 0x6F04, 0x04 }, { 0x6F0C, 0x7F }, { 0x6F0E, 0x7F }, { 0x6F18, 0xDF }, + { 0x6F1F, 0x7F }, { 0x6F2B, 0xFB }, { 0x6F2E, 0xFD }, { 0x6F3C, 0xF7 }, + { 0x6F3F, 0x7F }, { 0x6F4D, 0xFB }, { 0x6F59, 0x77 }, { 0x6F5E, 0x7F }, + { 0x6F6B, 0xFB }, { 0x6F6E, 0x9F }, { 0x6F9F, 0x7F }, { 0x6FAD, 0xB7 }, + { 0x6FBF, 0xF7 }, { 0x6FC8, 0xDF }, { 0x6FCD, 0x3F }, { 0x6FCE, 0xBB }, + { 0x6FDC, 0x7F }, { 0x6FDD, 0xDF }, { 0x6FEF, 0xF7 }, { 0x6FFB, 0xFB }, + { 0x6FFD, 0x77 }, { 0x701E, 0x10 }, { 0x7047, 0x7F }, { 0x7076, 0xF7 }, + { 0x707C, 0x10 }, { 0x70D5, 0xFD }, { 0x70F4, 0xDF }, { 0x710C, 0x04 }, + { 0x711A, 0x01 }, { 0x714E, 0x06 }, { 0x716F, 0x01 }, { 0x71A3, 0xDF }, + { 0x71B0, 0xFD }, { 0x71DE, 0x10 }, { 0x7206, 0xBF }, { 0x720C, 0x40 }, + { 0x7223, 0xFB }, { 0x726C, 0x04 }, { 0x7272, 0xF7 }, { 0x72A5, 0xBF }, + { 0x72C0, 0xF7 }, { 0x72DE, 0x01 }, { 0x72F8, 0x04 }, { 0x7302, 0xDF }, + { 0x7313, 0x7F }, { 0x7332, 0xF7 }, { 0x7372, 0xF7 }, { 0x73EB, 0x40 }, + { 0x7410, 0xDF }, { 0x7423, 0xF7 }, { 0x7432, 0xF7 }, { 0x7433, 0xF7 }, + { 0x744A, 0x01 }, { 0x748B, 0x01 }, { 0x7490, 0xF7 }, { 0x749A, 0x01 }, + { 0x7526, 0xFB }, { 0x7536, 0x7F }, { 0x7540, 0x7F }, { 0x7557, 0x7F }, + { 0x757F, 0x04 }, { 0x7584, 0x7F }, { 0x75B8, 0x01 }, { 0x75C2, 0xF7 }, + { 0x75C6, 0x7F }, { 0x75D5, 0xB7 }, { 0x75F8, 0x01 }, { 0x7607, 0xDF }, + { 0x764F, 0x02 }, { 0x7694, 0x7F }, { 0x7697, 0xFD }, { 0x76CC, 0x10 }, + { 0x76D0, 0xF7 }, { 0x76E0, 0xF7 }, { 0x7702, 0xF7 }, { 0x7721, 0x7F }, + { 0x7752, 0xFB }, { 0x77B6, 0xFB }, { 0x77B8, 0x01 }, { 0x77C2, 0xF7 }, + { 0x77D2, 0xF7 }, { 0x77D3, 0x7F }, { 0x77E3, 0xFD }, { 0x780B, 0x7F }, + { 0x780F, 0x3F }, { 0x7818, 0xF7 }, { 0x7834, 0x01 }, { 0x784C, 0x7F }, + { 0x784F, 0x5F }, { 0x785B, 0x7F }, { 0x7878, 0x7F }, { 0x7888, 0x7F }, + { 0x7889, 0xFB }, { 0x788A, 0xFB }, { 0x788B, 0xF7 }, { 0x78B9, 0x7F }, + { 0x78CB, 0xDF }, { 0x78CD, 0x7F }, { 0x78DA, 0xF7 }, { 0x78EA, 0xF7 }, + { 0x78FB, 0xFB }, { 0x790B, 0x7F }, { 0x790C, 0xF7 }, { 0x790D, 0xDF }, + { 0x790E, 0xFB }, { 0x790F, 0xFD }, { 0x791A, 0x7F }, { 0x791D, 0xBF }, + { 0x793B, 0xF7 }, { 0x793F, 0x7F }, { 0x7949, 0xFD }, { 0x794F, 0xFB }, + { 0x795C, 0x7F }, { 0x7960, 0x01 }, { 0x7968, 0xBF }, { 0x7969, 0xFD }, + { 0x7978, 0x7F }, { 0x797D, 0xF7 }, { 0x798D, 0xFE }, { 0x798E, 0xBF }, + { 0x79A9, 0x7F }, { 0x79AD, 0xF7 }, { 0x79BB, 0xFD }, { 0x79C8, 0xF7 }, + { 0x79C9, 0x7F }, { 0x79DB, 0x7F }, { 0x79DE, 0x7F }, { 0x79E9, 0xFB }, + { 0x79F8, 0xB7 }, { 0x79FB, 0xBF }, { 0x79FF, 0xBF }, { 0x7A0C, 0xF3 }, + { 0x7A0F, 0xDD }, { 0x7A18, 0x7F }, { 0x7A38, 0x7F }, { 0x7A39, 0x7F }, + { 0x7A49, 0xBF }, { 0x7A4B, 0x77 }, { 0x7A4C, 0x7F }, { 0x7A51, 0x40 }, + { 0x7A6D, 0xFD }, { 0x7A6F, 0x7F }, { 0x7A8E, 0x7F }, { 0x7AAF, 0xDF }, + { 0x7ABB, 0x7F }, { 0x7ACE, 0xBF }, { 0x7ADC, 0xDF }, { 0x7ADF, 0xB7 }, + { 0x7AEE, 0xF7 }, { 0x7AEF, 0xFB }, { 0x7AF8, 0xF7 }, { 0x7AFB, 0x7F }, + { 0x7AFE, 0xFB }, { 0x7B0F, 0xDF }, { 0x7B19, 0xFD }, { 0x7B1F, 0xFD }, + { 0x7B29, 0xF5 }, { 0x7B2D, 0x7F }, { 0x7B2F, 0xF7 }, { 0x7B38, 0x7F }, + { 0x7B3C, 0xFB }, { 0x7B3D, 0xFD }, { 0x7B4A, 0xF7 }, { 0x7B4B, 0xF7 }, + { 0x7B5A, 0x7F }, { 0x7B5E, 0x7F }, { 0x7B5F, 0xBF }, { 0x7B6D, 0xBF }, + { 0x7B6F, 0x33 }, { 0x7B7A, 0xF7 }, { 0x7B7B, 0xFB }, { 0x7B7F, 0x7F }, + { 0x7B8E, 0x7F }, { 0x7B95, 0x04 }, { 0x7B99, 0xF7 }, { 0x7BA9, 0x7F }, + { 0x7BB8, 0x7F }, { 0x7BB9, 0xFD }, { 0x7BCE, 0x7F }, { 0x7BCF, 0x7F }, + { 0x7BD8, 0xD7 }, { 0x7BDA, 0x7F }, { 0x7BDC, 0x7F }, { 0x7BDE, 0xF7 }, + { 0x7BE9, 0xFB }, { 0x7BF8, 0x9F }, { 0x7BFA, 0xBF }, { 0x7BFB, 0xDF }, + { 0x7BFE, 0xF7 }, { 0x7BFF, 0x77 }, { 0x7C08, 0x7F }, { 0x7C0A, 0xDF }, + { 0x7C1A, 0x7F }, { 0x7C1C, 0xF7 }, { 0x7C2E, 0x7F }, { 0x7C2F, 0x7F }, + { 0x7C3E, 0xF7 }, { 0x7C48, 0xF7 }, { 0x7C59, 0x7F }, { 0x7C5C, 0xF7 }, + { 0x7C7B, 0xF7 }, { 0x7C7F, 0xFB }, { 0x7CB9, 0xDF }, { 0x7CBF, 0x7F }, + { 0x7CD9, 0x7F }, { 0x7CDA, 0x7F }, { 0x7CDD, 0x7F }, { 0x7CFD, 0xDF }, + { 0x7D08, 0xFD }, { 0x7D1D, 0xF7 }, { 0x7D2D, 0xD7 }, { 0x7D2F, 0x7F }, + { 0x7D3B, 0xBF }, { 0x7D4A, 0xDF }, { 0x7D4D, 0xF7 }, { 0x7D4E, 0x7F }, + { 0x7D5A, 0x7F }, { 0x7D5B, 0xDF }, { 0x7D5F, 0xDF }, { 0x7D6A, 0xBF }, + { 0x7D6C, 0xFB }, { 0x7D6E, 0xF9 }, { 0x7D78, 0xF7 }, { 0x7D7D, 0xDF }, + { 0x7D7E, 0x7F }, { 0x7D8D, 0xF7 }, { 0x7D8E, 0xF7 }, { 0x7D8F, 0x5F }, + { 0x7D98, 0x77 }, { 0x7D9A, 0xF7 }, { 0x7D9D, 0xDF }, { 0x7D9E, 0xFB }, + { 0x7DB8, 0xF7 }, { 0x7DB9, 0xF7 }, { 0x7DBB, 0xDF }, { 0x7DBC, 0xDF }, + { 0x7DBF, 0xDF }, { 0x7DCC, 0xBF }, { 0x7DD9, 0xF7 }, { 0x7DEA, 0xDF }, + { 0x7DEC, 0xFD }, { 0x7DEE, 0xDD }, { 0x7DF9, 0xF7 }, { 0x7DFD, 0x7F }, + { 0x7E02, 0xFD }, { 0x7E0B, 0xFD }, { 0x7E18, 0xF7 }, { 0x7E1B, 0xFB }, + { 0x7E1D, 0x7F }, { 0x7E48, 0xFB }, { 0x7E4A, 0x01 }, { 0x7E6C, 0xDF }, + { 0x7E6F, 0xF7 }, { 0x7E8E, 0xFD }, { 0x7EDD, 0x7F }, { 0x7EEA, 0x20 }, + { 0x7EEB, 0xBF }, { 0x7EEF, 0xEF }, { 0x7EFD, 0x77 }, { 0x7EFE, 0x7F }, + { 0x7EFF, 0xDF }, { 0x7F28, 0xF7 }, { 0x7F2C, 0xF7 }, { 0x7F2E, 0x7B }, + { 0x7F2F, 0xF7 }, { 0x7F36, 0x10 }, { 0x7F3D, 0xFD }, { 0x7F49, 0x7F }, + { 0x7F58, 0x7B }, { 0x7F5E, 0xDF }, { 0x7F68, 0xF7 }, { 0x7F6C, 0xF7 }, + { 0x7F7B, 0xF9 }, { 0x7F7E, 0xDF }, { 0x7F8D, 0xDF }, { 0x7F92, 0xF7 }, + { 0x7F98, 0xF7 }, { 0x7F9C, 0x7F }, { 0x7FA9, 0xB9 }, { 0x7FAB, 0x7B }, + { 0x7FBC, 0x7F }, { 0x7FBF, 0xF7 }, { 0x7FC9, 0x7F }, { 0x7FCB, 0x7F }, + { 0x7FCD, 0xBF }, { 0x7FCE, 0x7F }, { 0x7FCF, 0xFB }, { 0x7FDB, 0xF7 }, + { 0x7FDF, 0x7F }, { 0x7FE8, 0xDF }, { 0x7FEC, 0xFB }, { 0x7FF2, 0xF7 } + }; + + for (unsigned addr = 0x0000; addr < 0x0800; addr += 0x10) { + std::memset(wram + addr + 0x00, 0xFF, 0x08); + std::memset(wram + addr + 0x08, 0x00, 0x08); + } + + for (unsigned addr = 0x0800; addr < 0x1000; addr += 0x10) { + std::memset(wram + addr + 0x00, 0x00, 0x08); + std::memset(wram + addr + 0x08, 0xFF, 0x08); + } + + for (unsigned addr = 0x0E00; addr < 0x1000; addr += 0x10) { + wram[addr + 0x02] = 0xFF; + wram[addr + 0x0A] = 0x00; + } + + for (unsigned addr = 0x1000; addr < 0x8000; addr += 0x1000) { + if (0x2000 != addr) + std::memcpy(wram + addr, wram, 0x1000); + } + + std::memset(wram + 0x2000, 0, 0x1000); + + for (std::size_t i = 0; i < sizeof cgbWramDumpDiff / sizeof cgbWramDumpDiff[0]; ++i) + wram[cgbWramDumpDiff[i].addr] = cgbWramDumpDiff[i].val; +} + +static void setInitialDmgWram(unsigned char wram[]) { + static struct { unsigned short addr; unsigned char val; } const dmgWramDumpDiff[] = { + { 0x0000, 0x08 }, { 0x0004, 0x08 }, { 0x0008, 0x4D }, { 0x000A, 0x80 }, + { 0x0010, 0x02 }, { 0x0018, 0x04 }, { 0x0020, 0x10 }, { 0x0028, 0x05 }, + { 0x002C, 0x08 }, { 0x0038, 0x21 }, { 0x003A, 0x40 }, { 0x0060, 0x02 }, + { 0x0066, 0x03 }, { 0x0068, 0x40 }, { 0x0072, 0x80 }, { 0x0074, 0x40 }, + { 0x0076, 0x80 }, { 0x007C, 0x80 }, { 0x007E, 0x20 }, { 0x0080, 0x0C }, + { 0x0088, 0x08 }, { 0x008C, 0x02 }, { 0x008E, 0x04 }, { 0x0092, 0x01 }, + { 0x0098, 0x02 }, { 0x00A2, 0x08 }, { 0x00A8, 0x02 }, { 0x00AC, 0x15 }, + { 0x00B0, 0x02 }, { 0x00B2, 0x80 }, { 0x00B6, 0x80 }, { 0x00B8, 0x06 }, + { 0x00BA, 0x01 }, { 0x00BC, 0x08 }, { 0x00C4, 0x04 }, { 0x00C8, 0x02 }, + { 0x00CC, 0x01 }, { 0x00D0, 0x85 }, { 0x00D8, 0x81 }, { 0x00DC, 0x01 }, + { 0x00DE, 0x01 }, { 0x00E0, 0x01 }, { 0x00E6, 0x08 }, { 0x00E8, 0x44 }, + { 0x00EC, 0x44 }, { 0x00F0, 0x40 }, { 0x00F4, 0x20 }, { 0x00FA, 0x04 }, + { 0x00FC, 0x12 }, { 0x00FE, 0x01 }, { 0x0103, 0x7F }, { 0x0107, 0xFD }, + { 0x0113, 0xFB }, { 0x0119, 0xBF }, { 0x011B, 0xEF }, { 0x011D, 0xFB }, + { 0x0121, 0xFB }, { 0x0133, 0xF7 }, { 0x0135, 0x6F }, { 0x0137, 0xBD }, + { 0x013F, 0xF6 }, { 0x0145, 0xF7 }, { 0x0149, 0xDF }, { 0x014D, 0xFA }, + { 0x014F, 0xFE }, { 0x0151, 0xFD }, { 0x0161, 0xFD }, { 0x0165, 0xBF }, + { 0x0171, 0xFD }, { 0x0173, 0xEF }, { 0x0177, 0xFE }, { 0x0179, 0x7F }, + { 0x0185, 0xF7 }, { 0x0189, 0xEF }, { 0x0199, 0xF7 }, { 0x01AB, 0xEF }, + { 0x01B1, 0x7F }, { 0x01B3, 0xEF }, { 0x01B5, 0xBF }, { 0x01C1, 0xFB }, + { 0x01C9, 0xFB }, { 0x01CB, 0xEF }, { 0x01CF, 0xBF }, { 0x01D5, 0x7F }, + { 0x01E1, 0xDD }, { 0x01E7, 0xF7 }, { 0x01F5, 0xFE }, { 0x0218, 0x01 }, + { 0x0220, 0x08 }, { 0x0226, 0x08 }, { 0x022C, 0x20 }, { 0x0230, 0x50 }, + { 0x0238, 0x01 }, { 0x0246, 0x02 }, { 0x0256, 0x10 }, { 0x0258, 0x40 }, + { 0x0260, 0x70 }, { 0x0264, 0x04 }, { 0x0268, 0x28 }, { 0x0278, 0x02 }, + { 0x0284, 0x10 }, { 0x0298, 0x20 }, { 0x029A, 0x10 }, { 0x02A0, 0x44 }, + { 0x02AE, 0x20 }, { 0x02B2, 0x20 }, { 0x02C0, 0x28 }, { 0x02CA, 0x64 }, + { 0x02D0, 0x20 }, { 0x02E0, 0x80 }, { 0x02E8, 0x02 }, { 0x02EA, 0x02 }, + { 0x02EE, 0x08 }, { 0x02F0, 0x0C }, { 0x02F2, 0x02 }, { 0x0305, 0xDF }, + { 0x0307, 0xFE }, { 0x0309, 0xFD }, { 0x030F, 0xBF }, { 0x0311, 0xFB }, + { 0x0325, 0xDF }, { 0x0329, 0xFD }, { 0x0335, 0xFD }, { 0x033B, 0xF7 }, + { 0x0345, 0xFB }, { 0x0347, 0xFD }, { 0x034B, 0xEF }, { 0x0353, 0xF9 }, + { 0x035B, 0xBF }, { 0x035D, 0xBF }, { 0x0361, 0xF5 }, { 0x0369, 0xBF }, + { 0x0375, 0xFD }, { 0x0381, 0xEF }, { 0x0383, 0xDF }, { 0x038D, 0xF7 }, + { 0x0391, 0xF7 }, { 0x039B, 0xFE }, { 0x03A9, 0xDF }, { 0x03B3, 0xFB }, + { 0x03C1, 0xFE }, { 0x03CD, 0xFB }, { 0x03DB, 0xFB }, { 0x03DD, 0x7F }, + { 0x03E1, 0x7F }, { 0x03ED, 0xFD }, { 0x03F3, 0xFD }, { 0x03FD, 0xFB }, + { 0x0406, 0x20 }, { 0x040E, 0x04 }, { 0x0412, 0x05 }, { 0x041C, 0x08 }, + { 0x0420, 0x10 }, { 0x0422, 0x40 }, { 0x0428, 0x40 }, { 0x042A, 0x08 }, + { 0x0430, 0x32 }, { 0x0434, 0x02 }, { 0x0438, 0x80 }, { 0x043A, 0x01 }, + { 0x044A, 0x02 }, { 0x0452, 0x50 }, { 0x0458, 0x01 }, { 0x0470, 0x14 }, + { 0x0478, 0xA0 }, { 0x047A, 0x01 }, { 0x048E, 0x01 }, { 0x0490, 0x04 }, + { 0x0492, 0x10 }, { 0x0496, 0x50 }, { 0x0498, 0x02 }, { 0x049E, 0x0C }, + { 0x04A2, 0x40 }, { 0x04A6, 0x01 }, { 0x04A8, 0xC0 }, { 0x04B0, 0x02 }, + { 0x04BE, 0x20 }, { 0x04C2, 0x01 }, { 0x04C8, 0x01 }, { 0x04CC, 0x01 }, + { 0x04D0, 0x01 }, { 0x04D2, 0x20 }, { 0x04DE, 0x01 }, { 0x04E0, 0x0C }, + { 0x04E2, 0x18 }, { 0x04EA, 0x08 }, { 0x04EE, 0x01 }, { 0x04F2, 0x90 }, + { 0x04F8, 0x20 }, { 0x04FA, 0x81 }, { 0x04FC, 0x40 }, { 0x0505, 0xF7 }, + { 0x0509, 0xFE }, { 0x0511, 0xCD }, { 0x0517, 0xF3 }, { 0x0525, 0xF7 }, + { 0x052B, 0xF7 }, { 0x052D, 0x7F }, { 0x052F, 0xBF }, { 0x0531, 0xEF }, + { 0x0533, 0xBF }, { 0x0545, 0xFB }, { 0x055D, 0xF7 }, { 0x0583, 0xFE }, + { 0x0593, 0xFE }, { 0x05AB, 0xEF }, { 0x05B1, 0xDF }, { 0x05BD, 0x6F }, + { 0x05CB, 0xBF }, { 0x05CD, 0xFB }, { 0x05CF, 0xFB }, { 0x05D3, 0xFB }, + { 0x05FB, 0xD5 }, { 0x05FD, 0xF7 }, { 0x0600, 0x82 }, { 0x0606, 0x04 }, + { 0x0618, 0x28 }, { 0x0630, 0x40 }, { 0x0638, 0x08 }, { 0x0640, 0x20 }, + { 0x0654, 0x40 }, { 0x0658, 0x22 }, { 0x065C, 0x84 }, { 0x0664, 0x06 }, + { 0x066E, 0x10 }, { 0x0672, 0x01 }, { 0x0678, 0x04 }, { 0x0680, 0x10 }, + { 0x0686, 0x80 }, { 0x068A, 0x42 }, { 0x0690, 0x12 }, { 0x06A8, 0x11 }, + { 0x06B0, 0x40 }, { 0x06CE, 0x08 }, { 0x06D8, 0x10 }, { 0x06DC, 0x81 }, + { 0x06E2, 0x06 }, { 0x06F0, 0x04 }, { 0x0713, 0xF9 }, { 0x0715, 0xBF }, + { 0x071B, 0xDF }, { 0x071D, 0xFD }, { 0x0725, 0xFD }, { 0x0745, 0xEF }, + { 0x0749, 0xFA }, { 0x0753, 0xBF }, { 0x075B, 0xBF }, { 0x075F, 0xFD }, + { 0x0763, 0xDF }, { 0x0771, 0xDF }, { 0x078F, 0xF7 }, { 0x0799, 0xFD }, + { 0x07A5, 0xEF }, { 0x07D3, 0x7F }, { 0x07DD, 0xBF }, { 0x07E3, 0xFD }, + { 0x07E5, 0xF6 }, { 0x07EB, 0xFD }, { 0x07FB, 0xBF }, { 0x0803, 0xBF }, + { 0x080F, 0xED }, { 0x0811, 0xBF }, { 0x0813, 0xF7 }, { 0x081B, 0x7F }, + { 0x0827, 0xFA }, { 0x0829, 0x7F }, { 0x082F, 0xEF }, { 0x0833, 0xEF }, + { 0x083F, 0xEF }, { 0x0841, 0xDF }, { 0x0843, 0xFE }, { 0x084D, 0xFB }, + { 0x0877, 0xBF }, { 0x087F, 0xFB }, { 0x088D, 0xFE }, { 0x088F, 0x7F }, + { 0x089F, 0xEF }, { 0x08A5, 0xBF }, { 0x08A9, 0xEF }, { 0x08AB, 0xFD }, + { 0x08B1, 0xEF }, { 0x08B5, 0xEF }, { 0x08BF, 0xDF }, { 0x08C7, 0xDF }, + { 0x08CF, 0xFB }, { 0x08DD, 0xFE }, { 0x08DF, 0xF7 }, { 0x08E3, 0x5A }, + { 0x08E7, 0xBF }, { 0x08EB, 0xFB }, { 0x08ED, 0xF9 }, { 0x08EF, 0xFB }, + { 0x08F7, 0x9F }, { 0x08FF, 0xDF }, { 0x0914, 0x94 }, { 0x0916, 0x11 }, + { 0x0918, 0x21 }, { 0x091C, 0x01 }, { 0x0922, 0x40 }, { 0x0926, 0x08 }, + { 0x092C, 0x04 }, { 0x0934, 0x10 }, { 0x0938, 0x02 }, { 0x093A, 0x08 }, + { 0x096A, 0x02 }, { 0x0986, 0x10 }, { 0x0988, 0x20 }, { 0x09A2, 0x03 }, + { 0x09AA, 0x02 }, { 0x09B2, 0x08 }, { 0x09B8, 0x08 }, { 0x09BE, 0x10 }, + { 0x09C2, 0x02 }, { 0x09CA, 0x40 }, { 0x09D4, 0x40 }, { 0x09E2, 0x01 }, + { 0x09E8, 0x10 }, { 0x09EC, 0x40 }, { 0x0A01, 0xEF }, { 0x0A07, 0x6F }, + { 0x0A17, 0xD7 }, { 0x0A27, 0xFE }, { 0x0A2D, 0xFB }, { 0x0A2F, 0xBF }, + { 0x0A33, 0xEF }, { 0x0A37, 0xFE }, { 0x0A5F, 0xFA }, { 0x0A67, 0xFB }, + { 0x0A8D, 0xDF }, { 0x0A8F, 0xFD }, { 0x0A91, 0xEF }, { 0x0A97, 0xFD }, + { 0x0A9F, 0xFC }, { 0x0AA7, 0xEF }, { 0x0AAD, 0xEF }, { 0x0AB1, 0xBF }, + { 0x0ABF, 0x7F }, { 0x0AD9, 0xDF }, { 0x0AF7, 0xFE }, { 0x0AFF, 0xBE }, + { 0x0B14, 0x10 }, { 0x0B24, 0x08 }, { 0x0B2C, 0x02 }, { 0x0B44, 0x08 }, + { 0x0B46, 0x01 }, { 0x0B4E, 0x80 }, { 0x0B52, 0x10 }, { 0x0B54, 0x80 }, + { 0x0B6A, 0x04 }, { 0x0B72, 0x08 }, { 0x0B88, 0x20 }, { 0x0BB6, 0x20 }, + { 0x0BC2, 0x04 }, { 0x0BCE, 0x10 }, { 0x0BD8, 0x08 }, { 0x0BEC, 0x40 }, + { 0x0C0F, 0xFE }, { 0x0C11, 0xBF }, { 0x0C17, 0xB7 }, { 0x0C19, 0x7F }, + { 0x0C23, 0xFB }, { 0x0C27, 0xFE }, { 0x0C2D, 0xDF }, { 0x0C2F, 0xBB }, + { 0x0C37, 0xEF }, { 0x0C3F, 0xBD }, { 0x0C49, 0xFD }, { 0x0C4F, 0xF7 }, + { 0x0C5F, 0xBF }, { 0x0C61, 0xDF }, { 0x0C67, 0x37 }, { 0x0C6B, 0xDF }, + { 0x0C73, 0xF7 }, { 0x0C7D, 0x7F }, { 0x0C87, 0xDC }, { 0x0C89, 0xDF }, + { 0x0C8B, 0xFD }, { 0x0C91, 0xEF }, { 0x0CA3, 0xFB }, { 0x0CA5, 0xFB }, + { 0x0CB7, 0xF6 }, { 0x0CBF, 0x3F }, { 0x0CC5, 0xFB }, { 0x0CC7, 0x7F }, + { 0x0CD1, 0x7F }, { 0x0CD5, 0x7F }, { 0x0CD7, 0xEF }, { 0x0CD9, 0x7F }, + { 0x0CE5, 0xBF }, { 0x0CF5, 0x7F }, { 0x0CFB, 0x7F }, { 0x0CFF, 0xFE }, + { 0x0D02, 0x01 }, { 0x0D0A, 0x11 }, { 0x0D0C, 0x80 }, { 0x0D0E, 0x08 }, + { 0x0D12, 0x40 }, { 0x0D16, 0x0B }, { 0x0D1E, 0x08 }, { 0x0D22, 0x01 }, + { 0x0D26, 0x04 }, { 0x0D28, 0x04 }, { 0x0D2A, 0x01 }, { 0x0D2E, 0x02 }, + { 0x0D32, 0x10 }, { 0x0D44, 0x11 }, { 0x0D4E, 0x04 }, { 0x0D52, 0x80 }, + { 0x0D5A, 0x40 }, { 0x0D5E, 0x04 }, { 0x0D72, 0x01 }, { 0x0D76, 0x02 }, + { 0x0D7A, 0x04 }, { 0x0D7C, 0x80 }, { 0x0D82, 0x80 }, { 0x0D84, 0x04 }, + { 0x0D90, 0x04 }, { 0x0DA0, 0x01 }, { 0x0DA4, 0x02 }, { 0x0DB0, 0x04 }, + { 0x0DB4, 0x04 }, { 0x0DB6, 0x10 }, { 0x0DBC, 0x08 }, { 0x0DC2, 0x08 }, + { 0x0DD0, 0x28 }, { 0x0DD2, 0x10 }, { 0x0DD6, 0x10 }, { 0x0DE2, 0x08 }, + { 0x0E17, 0xFE }, { 0x0E19, 0xDF }, { 0x0E2B, 0xEF }, { 0x0E2F, 0xFD }, + { 0x0E37, 0xF3 }, { 0x0E39, 0xDF }, { 0x0E3F, 0xDF }, { 0x0E4F, 0xFE }, + { 0x0E53, 0xFB }, { 0x0E5B, 0xEF }, { 0x0E5D, 0xF7 }, { 0x0E5F, 0xFD }, + { 0x0E71, 0xFB }, { 0x0E77, 0xFD }, { 0x0E7B, 0xFB }, { 0x0E7F, 0xFD }, + { 0x0E85, 0x7F }, { 0x0E8B, 0xFD }, { 0x0E9B, 0x7B }, { 0x0EA7, 0xFE }, + { 0x0EBB, 0xFB }, { 0x0ED7, 0x77 }, { 0x0EE1, 0xDF }, { 0x0EE3, 0xF7 }, + { 0x0EEF, 0xFE }, { 0x0EFB, 0xFE }, { 0x0EFF, 0xF7 }, { 0x0F02, 0x10 }, + { 0x0F06, 0x20 }, { 0x0F0A, 0x02 }, { 0x0F1C, 0x10 }, { 0x0F32, 0x08 }, + { 0x0F54, 0x10 }, { 0x0F84, 0x10 }, { 0x0F92, 0x40 }, { 0x0FA6, 0x08 }, + { 0x0FAA, 0x02 }, { 0x0FB6, 0x40 }, { 0x0FCE, 0x0A }, { 0x0FD2, 0x10 }, + { 0x0FD4, 0x10 }, { 0x0FE0, 0x04 }, { 0x0FF0, 0x04 }, { 0x1000, 0x80 }, + { 0x1004, 0x08 }, { 0x1008, 0x09 }, { 0x1010, 0x02 }, { 0x1012, 0x20 }, + { 0x1020, 0x05 }, { 0x1024, 0x01 }, { 0x1026, 0x10 }, { 0x102A, 0x02 }, + { 0x1032, 0x40 }, { 0x1034, 0x08 }, { 0x1036, 0x03 }, { 0x1038, 0x01 }, + { 0x103E, 0x40 }, { 0x1040, 0x40 }, { 0x1042, 0x12 }, { 0x1046, 0x02 }, + { 0x1050, 0x22 }, { 0x1056, 0x80 }, { 0x1058, 0x10 }, { 0x105E, 0x40 }, + { 0x1066, 0x04 }, { 0x1068, 0x02 }, { 0x106C, 0x60 }, { 0x1070, 0x80 }, + { 0x1076, 0x40 }, { 0x1078, 0x66 }, { 0x107C, 0x02 }, { 0x1080, 0x40 }, + { 0x1088, 0x01 }, { 0x108A, 0x80 }, { 0x108E, 0x10 }, { 0x1090, 0x31 }, + { 0x1092, 0x20 }, { 0x1098, 0x11 }, { 0x109A, 0x80 }, { 0x10A0, 0x05 }, + { 0x10A4, 0x01 }, { 0x10A6, 0x81 }, { 0x10A8, 0x01 }, { 0x10AA, 0x01 }, + { 0x10B0, 0x40 }, { 0x10B4, 0x40 }, { 0x10B6, 0x20 }, { 0x10B8, 0x03 }, + { 0x10BC, 0x88 }, { 0x10BE, 0x02 }, { 0x10C0, 0x30 }, { 0x10C4, 0x42 }, + { 0x10C6, 0x10 }, { 0x10C8, 0x01 }, { 0x10D4, 0x40 }, { 0x10D8, 0x80 }, + { 0x10DE, 0x10 }, { 0x10E0, 0x10 }, { 0x10E2, 0x10 }, { 0x10E4, 0x01 }, + { 0x10E8, 0x26 }, { 0x10EE, 0x10 }, { 0x10F0, 0x80 }, { 0x10F6, 0x40 }, + { 0x10F8, 0x01 }, { 0x10FA, 0x20 }, { 0x10FC, 0x04 }, { 0x10FE, 0x80 }, + { 0x1101, 0xFD }, { 0x1113, 0x7F }, { 0x1115, 0xEF }, { 0x1117, 0xFB }, + { 0x1121, 0x7F }, { 0x1139, 0xF7 }, { 0x1141, 0xFD }, { 0x1153, 0xFD }, + { 0x1159, 0xF5 }, { 0x115F, 0x7F }, { 0x116D, 0xF7 }, { 0x1171, 0x7E }, + { 0x1179, 0xDF }, { 0x117B, 0xFB }, { 0x117F, 0xDF }, { 0x1189, 0x7F }, + { 0x1195, 0xDF }, { 0x119D, 0xDF }, { 0x119F, 0xD7 }, { 0x11A7, 0xF9 }, + { 0x11AB, 0xAF }, { 0x11AD, 0xBF }, { 0x11B9, 0xDF }, { 0x11BB, 0xBF }, + { 0x11C5, 0xF9 }, { 0x11CF, 0x7F }, { 0x11D5, 0x7F }, { 0x11DF, 0xEF }, + { 0x11E1, 0xFE }, { 0x11E7, 0xDF }, { 0x11E9, 0xF7 }, { 0x11ED, 0xFB }, + { 0x1208, 0x01 }, { 0x1218, 0x16 }, { 0x1230, 0x04 }, { 0x1242, 0x0C }, + { 0x1246, 0x80 }, { 0x1260, 0x01 }, { 0x1276, 0x10 }, { 0x1278, 0x10 }, + { 0x1280, 0x04 }, { 0x1284, 0x44 }, { 0x1286, 0x01 }, { 0x128A, 0x02 }, + { 0x1290, 0x80 }, { 0x12A0, 0x02 }, { 0x12A8, 0x50 }, { 0x12B0, 0x08 }, + { 0x12B2, 0x40 }, { 0x12B4, 0x10 }, { 0x12B6, 0x02 }, { 0x12B8, 0x04 }, + { 0x12C0, 0x04 }, { 0x12CC, 0x20 }, { 0x12D0, 0x42 }, { 0x12D8, 0x10 }, + { 0x12DA, 0x10 }, { 0x12E4, 0x08 }, { 0x12F0, 0x40 }, { 0x12F2, 0x40 }, + { 0x12F8, 0x42 }, { 0x12FC, 0x80 }, { 0x12FE, 0x40 }, { 0x1301, 0xFD }, + { 0x1307, 0x7F }, { 0x1309, 0x3F }, { 0x1325, 0xDF }, { 0x132F, 0xFB }, + { 0x134D, 0x7F }, { 0x1351, 0xDB }, { 0x1353, 0xE7 }, { 0x1357, 0xEF }, + { 0x1363, 0xF7 }, { 0x136D, 0xF7 }, { 0x136F, 0xF7 }, { 0x1389, 0x7F }, + { 0x138B, 0xFE }, { 0x138D, 0x7F }, { 0x139B, 0xEB }, { 0x13A1, 0xEF }, + { 0x13BB, 0xEF }, { 0x13C7, 0x7F }, { 0x13D5, 0xF7 }, { 0x13EB, 0xFD }, + { 0x13F5, 0xDF }, { 0x13F7, 0xFE }, { 0x1400, 0x11 }, { 0x1408, 0x90 }, + { 0x140E, 0x20 }, { 0x1414, 0x10 }, { 0x1416, 0x01 }, { 0x1418, 0x10 }, + { 0x1420, 0x20 }, { 0x1428, 0x0C }, { 0x142C, 0x11 }, { 0x1430, 0x01 }, + { 0x1434, 0x20 }, { 0x1438, 0x10 }, { 0x143A, 0x02 }, { 0x143E, 0x10 }, + { 0x1440, 0xA1 }, { 0x144A, 0x20 }, { 0x144C, 0x80 }, { 0x1450, 0x12 }, + { 0x1452, 0x80 }, { 0x1458, 0x80 }, { 0x145A, 0x41 }, { 0x145C, 0x02 }, + { 0x1460, 0x12 }, { 0x1466, 0x82 }, { 0x1468, 0x18 }, { 0x1470, 0x08 }, + { 0x1472, 0x24 }, { 0x147C, 0x20 }, { 0x147E, 0x81 }, { 0x1484, 0x10 }, + { 0x1488, 0x04 }, { 0x1490, 0x04 }, { 0x1492, 0x08 }, { 0x1498, 0x60 }, + { 0x149C, 0x02 }, { 0x14A0, 0x80 }, { 0x14A2, 0x51 }, { 0x14A8, 0x04 }, + { 0x14AC, 0x02 }, { 0x14B0, 0x01 }, { 0x14B8, 0x10 }, { 0x14BA, 0x80 }, + { 0x14BE, 0x14 }, { 0x14C0, 0x02 }, { 0x14C4, 0x80 }, { 0x14C8, 0x8C }, + { 0x14CA, 0x0C }, { 0x14D2, 0x80 }, { 0x14D8, 0x08 }, { 0x14DC, 0x80 }, + { 0x14E8, 0x90 }, { 0x14EA, 0x09 }, { 0x14F0, 0x04 }, { 0x14F4, 0x04 }, + { 0x14F8, 0x44 }, { 0x14FA, 0x02 }, { 0x14FC, 0x40 }, { 0x14FE, 0x08 }, + { 0x1505, 0xFE }, { 0x150D, 0xF7 }, { 0x1513, 0xDF }, { 0x151B, 0xEF }, + { 0x151F, 0xDF }, { 0x1527, 0x7F }, { 0x152B, 0xBB }, { 0x152D, 0xFE }, + { 0x152F, 0xFD }, { 0x1531, 0xDF }, { 0x1539, 0xBF }, { 0x153B, 0xFE }, + { 0x1541, 0xDF }, { 0x1547, 0xBF }, { 0x154B, 0x7F }, { 0x156B, 0x7F }, + { 0x157D, 0xBF }, { 0x1585, 0xFE }, { 0x1587, 0xEF }, { 0x1591, 0xDF }, + { 0x1593, 0xEF }, { 0x1597, 0xFB }, { 0x1599, 0xF7 }, { 0x159B, 0xBF }, + { 0x15A3, 0xD5 }, { 0x15A5, 0xBF }, { 0x15B3, 0xEB }, { 0x15B5, 0xFE }, + { 0x15C3, 0xF7 }, { 0x15C5, 0xEF }, { 0x15C9, 0xFD }, { 0x15D1, 0xFE }, + { 0x15D7, 0xFE }, { 0x15D9, 0xEF }, { 0x15DD, 0xFB }, { 0x15E1, 0x7B }, + { 0x15E3, 0xBF }, { 0x15E9, 0xFD }, { 0x15F5, 0x7F }, { 0x15FB, 0xEF }, + { 0x1600, 0x20 }, { 0x160A, 0x10 }, { 0x161E, 0x04 }, { 0x1620, 0x02 }, + { 0x1630, 0x04 }, { 0x1636, 0x40 }, { 0x1640, 0x2C }, { 0x1646, 0x20 }, + { 0x1654, 0x20 }, { 0x1656, 0x18 }, { 0x1658, 0x4A }, { 0x165A, 0x20 }, + { 0x165C, 0x80 }, { 0x1664, 0x08 }, { 0x1668, 0x02 }, { 0x1670, 0x48 }, + { 0x167A, 0x20 }, { 0x1680, 0x10 }, { 0x1682, 0x08 }, { 0x1684, 0x40 }, + { 0x168C, 0x01 }, { 0x1698, 0x21 }, { 0x169E, 0x40 }, { 0x16A0, 0x03 }, + { 0x16A2, 0x40 }, { 0x16A4, 0x01 }, { 0x16A6, 0x01 }, { 0x16B6, 0x10 }, + { 0x16B8, 0x80 }, { 0x16BA, 0x02 }, { 0x16BC, 0x01 }, { 0x16D0, 0x04 }, + { 0x16D2, 0x02 }, { 0x16D8, 0x81 }, { 0x16E8, 0x03 }, { 0x16EE, 0x80 }, + { 0x16F8, 0xA4 }, { 0x1703, 0xFE }, { 0x172B, 0xEF }, { 0x172D, 0xBF }, + { 0x173B, 0xDF }, { 0x1745, 0x3D }, { 0x1749, 0xFB }, { 0x174B, 0xDF }, + { 0x1753, 0xDF }, { 0x1759, 0xFD }, { 0x1763, 0xEF }, { 0x1765, 0xBF }, + { 0x1775, 0xBF }, { 0x177D, 0xDF }, { 0x1781, 0xFE }, { 0x1789, 0xEF }, + { 0x178B, 0xFE }, { 0x1791, 0xEF }, { 0x1793, 0xDF }, { 0x1795, 0xEF }, + { 0x179B, 0xFE }, { 0x17A7, 0xFB }, { 0x17AD, 0xFE }, { 0x17B3, 0xFB }, + { 0x17B5, 0xFA }, { 0x17B9, 0xFB }, { 0x17C3, 0xFB }, { 0x17DB, 0xFB }, + { 0x17EB, 0xBF }, { 0x17F3, 0xFB }, { 0x1803, 0xBD }, { 0x1813, 0xBF }, + { 0x181B, 0x7E }, { 0x1827, 0xFD }, { 0x1833, 0xFE }, { 0x1837, 0xDB }, + { 0x1839, 0xF7 }, { 0x1845, 0xDF }, { 0x184B, 0xFD }, { 0x1853, 0xDF }, + { 0x1867, 0xFD }, { 0x186F, 0xF7 }, { 0x1879, 0xDF }, { 0x187D, 0xEF }, + { 0x1889, 0xFB }, { 0x188F, 0x9F }, { 0x1893, 0xDF }, { 0x1897, 0xFD }, + { 0x189B, 0x7F }, { 0x18A9, 0xFD }, { 0x18AF, 0xFB }, { 0x18B5, 0xBF }, + { 0x18B7, 0x2F }, { 0x18BD, 0xFE }, { 0x18BF, 0xFB }, { 0x18CD, 0xBF }, + { 0x18D3, 0xF5 }, { 0x18D5, 0x7F }, { 0x18D7, 0xFD }, { 0x18E1, 0xFD }, + { 0x18E3, 0xEF }, { 0x18E5, 0x7F }, { 0x18EB, 0xFE }, { 0x18EF, 0xDF }, + { 0x18F3, 0xEF }, { 0x18F7, 0xEF }, { 0x18FB, 0x7B }, { 0x18FD, 0xDF }, + { 0x18FF, 0xDF }, { 0x190A, 0x40 }, { 0x1910, 0x20 }, { 0x1916, 0x04 }, + { 0x1920, 0x01 }, { 0x1924, 0x02 }, { 0x1926, 0x02 }, { 0x1936, 0x40 }, + { 0x1946, 0x04 }, { 0x195A, 0x10 }, { 0x195C, 0x40 }, { 0x1968, 0x20 }, + { 0x197C, 0x08 }, { 0x1988, 0x08 }, { 0x1994, 0x20 }, { 0x1996, 0x20 }, + { 0x199A, 0x12 }, { 0x19BA, 0x08 }, { 0x19C4, 0x01 }, { 0x19CC, 0x04 }, + { 0x19D4, 0x04 }, { 0x19DA, 0x80 }, { 0x19DC, 0x40 }, { 0x19E2, 0x02 }, + { 0x19EE, 0x80 }, { 0x19F4, 0x02 }, { 0x19F6, 0x90 }, { 0x19FC, 0x02 }, + { 0x19FE, 0x1A }, { 0x1A11, 0xDF }, { 0x1A1F, 0xEE }, { 0x1A25, 0xFB }, + { 0x1A27, 0xF7 }, { 0x1A2D, 0xF5 }, { 0x1A2F, 0xFA }, { 0x1A3B, 0xEF }, + { 0x1A3F, 0xFB }, { 0x1A4B, 0xDF }, { 0x1A6F, 0xFB }, { 0x1A77, 0xF7 }, + { 0x1A81, 0xE7 }, { 0x1A8F, 0xE7 }, { 0x1A93, 0xDF }, { 0x1A9F, 0xDF }, + { 0x1AAD, 0xEF }, { 0x1AC7, 0xF7 }, { 0x1AD5, 0xFE }, { 0x1ADF, 0xFB }, + { 0x1AE3, 0xBF }, { 0x1AED, 0xF7 }, { 0x1AF1, 0xFE }, { 0x1AF9, 0xFD }, + { 0x1B1A, 0x02 }, { 0x1B26, 0x10 }, { 0x1B6C, 0x02 }, { 0x1B84, 0x04 }, + { 0x1B88, 0x40 }, { 0x1BA0, 0x08 }, { 0x1BAE, 0x08 }, { 0x1BBC, 0x02 }, + { 0x1BF4, 0x04 }, { 0x1C07, 0xDF }, { 0x1C0B, 0x7F }, { 0x1C0F, 0xDF }, + { 0x1C13, 0xBF }, { 0x1C1B, 0xFB }, { 0x1C1F, 0xEF }, { 0x1C27, 0xBD }, + { 0x1C2F, 0x77 }, { 0x1C3D, 0xEF }, { 0x1C3F, 0xF7 }, { 0x1C41, 0xF7 }, + { 0x1C43, 0xFE }, { 0x1C45, 0xDF }, { 0x1C47, 0xFE }, { 0x1C4F, 0xEF }, + { 0x1C53, 0xF3 }, { 0x1C5D, 0xDF }, { 0x1C5F, 0xBB }, { 0x1C61, 0xFB }, + { 0x1C67, 0xFE }, { 0x1C69, 0xFD }, { 0x1C6B, 0xFE }, { 0x1C73, 0xFB }, + { 0x1C7B, 0xFE }, { 0x1C7D, 0xEF }, { 0x1C83, 0xEF }, { 0x1C87, 0x3F }, + { 0x1C8B, 0xEF }, { 0x1C8F, 0xD9 }, { 0x1C97, 0xEF }, { 0x1C9B, 0xEF }, + { 0x1C9F, 0xF7 }, { 0x1CA3, 0xFD }, { 0x1CA7, 0xBF }, { 0x1CA9, 0xF7 }, + { 0x1CAB, 0xFB }, { 0x1CAD, 0xFD }, { 0x1CB1, 0x7F }, { 0x1CB3, 0xBB }, + { 0x1CB9, 0xFD }, { 0x1CBB, 0xFB }, { 0x1CC7, 0xF6 }, { 0x1CCF, 0xBF }, + { 0x1CD3, 0xEB }, { 0x1CE1, 0xBF }, { 0x1CF1, 0xFD }, { 0x1CF5, 0x7F }, + { 0x1CF7, 0xEF }, { 0x1CFD, 0xDF }, { 0x1CFF, 0xFD }, { 0x1D02, 0x04 }, + { 0x1D06, 0x40 }, { 0x1D08, 0x92 }, { 0x1D10, 0x04 }, { 0x1D1A, 0x02 }, + { 0x1D1C, 0x08 }, { 0x1D24, 0x08 }, { 0x1D30, 0x01 }, { 0x1D34, 0x04 }, + { 0x1D3A, 0x22 }, { 0x1D3E, 0x04 }, { 0x1D56, 0x10 }, { 0x1D5A, 0x02 }, + { 0x1D7E, 0x40 }, { 0x1D8E, 0x01 }, { 0x1D90, 0x20 }, { 0x1D9A, 0x10 }, + { 0x1DA0, 0x04 }, { 0x1DA4, 0x02 }, { 0x1DAC, 0x21 }, { 0x1DBE, 0x20 }, + { 0x1DC2, 0x20 }, { 0x1DD6, 0x40 }, { 0x1DD8, 0x08 }, { 0x1DF2, 0x01 }, + { 0x1DFE, 0x80 }, { 0x1E01, 0xEF }, { 0x1E05, 0xEF }, { 0x1E1D, 0xDF }, + { 0x1E27, 0xDD }, { 0x1E2F, 0x7F }, { 0x1E33, 0xF5 }, { 0x1E37, 0xFB }, + { 0x1E3F, 0xF7 }, { 0x1E4B, 0xDF }, { 0x1E5F, 0x7F }, { 0x1E71, 0xEB }, + { 0x1E7F, 0xBF }, { 0x1E8F, 0xDF }, { 0x1E97, 0xBF }, { 0x1E9B, 0xEF }, + { 0x1E9F, 0xF7 }, { 0x1EA7, 0xFD }, { 0x1EB3, 0xFB }, { 0x1EB7, 0x7F }, + { 0x1EC5, 0x7F }, { 0x1EDF, 0x7F }, { 0x1EE9, 0xF7 }, { 0x1EF3, 0xFD }, + { 0x1F02, 0x10 }, { 0x1F04, 0x05 }, { 0x1F20, 0x04 }, { 0x1F24, 0x10 }, + { 0x1F3A, 0x80 }, { 0x1F44, 0x04 }, { 0x1F46, 0x04 }, { 0x1F4E, 0x40 }, + { 0x1F50, 0x01 }, { 0x1F54, 0x03 }, { 0x1F60, 0x03 }, { 0x1F72, 0x01 }, + { 0x1F76, 0x04 }, { 0x1F7A, 0x02 }, { 0x1F86, 0x80 }, { 0x1F8C, 0x02 }, + { 0x1FA2, 0x40 }, { 0x1FB6, 0x80 }, { 0x1FC6, 0x10 }, { 0x1FCC, 0x20 }, + { 0x1FD2, 0x20 }, { 0x1FD8, 0x04 }, { 0x1FDC, 0x10 }, { 0x1FDE, 0x04 } + }; + + for (unsigned addr = 0x0000; addr < 0x0800; addr += 0x200) { + std::memset(wram + addr , 0x00, 0x100); + std::memset(wram + addr + 0x100, 0xFF, 0x100); + } + + for (unsigned addr = 0x0800; addr < 0x1000; addr += 0x200) { + std::memset(wram + addr , 0xFF, 0x100); + std::memset(wram + addr + 0x100, 0x00, 0x100); + } + + std::memcpy(wram + 0x1000, wram, 0x1000); + + for (std::size_t i = 0; i < sizeof dmgWramDumpDiff / sizeof dmgWramDumpDiff[0]; ++i) + wram[dmgWramDumpDiff[i].addr] = dmgWramDumpDiff[i].val; +} + +static void setInitialVram(unsigned char vram[], bool const cgb) { + static unsigned char const even_numbered_8010_to_81a0_dump[] = { + 0xF0, 0xF0, 0xFC, 0xFC, 0xFC, 0xFC, 0xF3, 0xF3, + 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, + 0xF0, 0xF0, 0xF0, 0xF0, 0x00, 0x00, 0xF3, 0xF3, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCF, 0xCF, + 0x00, 0x00, 0x0F, 0x0F, 0x3F, 0x3F, 0x0F, 0x0F, + 0x00, 0x00, 0x00, 0x00, 0xC0, 0xC0, 0x0F, 0x0F, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0xF0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF3, 0xF3, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xC0, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0xFF, 0xFF, + 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC3, 0xC3, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0xFC, + 0xF3, 0xF3, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, + 0x3C, 0x3C, 0xFC, 0xFC, 0xFC, 0xFC, 0x3C, 0x3C, + 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, + 0xF3, 0xF3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, + 0xCF, 0xCF, 0xCF, 0xCF, 0xCF, 0xCF, 0xCF, 0xCF, + 0x3C, 0x3C, 0x3F, 0x3F, 0x3C, 0x3C, 0x0F, 0x0F, + 0x3C, 0x3C, 0xFC, 0xFC, 0x00, 0x00, 0xFC, 0xFC, + 0xFC, 0xFC, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, + 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF0, 0xF0, + 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xFF, 0xFF, + 0xCF, 0xCF, 0xCF, 0xCF, 0xCF, 0xCF, 0xC3, 0xC3, + 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0xFC, 0xFC, + 0x3C, 0x42, 0xB9, 0xA5, 0xB9, 0xA5, 0x42, 0x3C + }; + + std::memset(vram, 0, 0x4000); + + for (std::size_t i = 0; i < sizeof even_numbered_8010_to_81a0_dump; ++i) { + vram[0x0010 + i * 2] = even_numbered_8010_to_81a0_dump[i]; + } + + if (!cgb) { + unsigned i = 1; + + for (unsigned addr = 0x1904; addr < 0x1910; ++addr) + vram[addr] = i++; + + vram[0x1910] = 0x19; + + for (unsigned addr = 0x1924; addr < 0x1930; ++addr) + vram[addr] = i++; + } +} + +static void setInitialCgbIoamhram(unsigned char ioamhram[]) { + static unsigned char const feaxDump[0x60] = { + 0x08, 0x01, 0xEF, 0xDE, 0x06, 0x4A, 0xCD, 0xBD, + 0x08, 0x01, 0xEF, 0xDE, 0x06, 0x4A, 0xCD, 0xBD, + 0x08, 0x01, 0xEF, 0xDE, 0x06, 0x4A, 0xCD, 0xBD, + 0x08, 0x01, 0xEF, 0xDE, 0x06, 0x4A, 0xCD, 0xBD, + 0x00, 0x90, 0xF7, 0x7F, 0xC0, 0xB1, 0xBC, 0xFB, + 0x00, 0x90, 0xF7, 0x7F, 0xC0, 0xB1, 0xBC, 0xFB, + 0x00, 0x90, 0xF7, 0x7F, 0xC0, 0xB1, 0xBC, 0xFB, + 0x00, 0x90, 0xF7, 0x7F, 0xC0, 0xB1, 0xBC, 0xFB, + 0x24, 0x13, 0xFD, 0x3A, 0x10, 0x10, 0xAD, 0x45, + 0x24, 0x13, 0xFD, 0x3A, 0x10, 0x10, 0xAD, 0x45, + 0x24, 0x13, 0xFD, 0x3A, 0x10, 0x10, 0xAD, 0x45, + 0x24, 0x13, 0xFD, 0x3A, 0x10, 0x10, 0xAD, 0x45 + }; + + static unsigned char const ffxxDump[0x100] = { + 0xCF, 0x00, 0x7C, 0xFF, 0x44, 0x00, 0x00, 0xF8, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE1, + 0x80, 0xBF, 0xF3, 0xFF, 0xBF, 0xFF, 0x3F, 0x00, + 0xFF, 0xBF, 0x7F, 0xFF, 0x9F, 0xFF, 0xBF, 0xFF, + 0xFF, 0x00, 0x00, 0xBF, 0x77, 0xF3, 0xF1, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, + 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, + 0x00, 0x00, 0x00, 0x00, 0xFF, 0x7E, 0xFF, 0xFE, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3E, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xC0, 0xFF, 0xC1, 0x00, 0xFE, 0xFF, 0xFF, 0xFF, + 0xF8, 0xFF, 0x00, 0x00, 0x00, 0x8F, 0x00, 0x00, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xCE, 0xED, 0x66, 0x66, 0xCC, 0x0D, 0x00, 0x0B, + 0x03, 0x73, 0x00, 0x83, 0x00, 0x0C, 0x00, 0x0D, + 0x00, 0x08, 0x11, 0x1F, 0x88, 0x89, 0x00, 0x0E, + 0xDC, 0xCC, 0x6E, 0xE6, 0xDD, 0xDD, 0xD9, 0x99, + 0xBB, 0xBB, 0x67, 0x63, 0x6E, 0x0E, 0xEC, 0xCC, + 0xDD, 0xDC, 0x99, 0x9F, 0xBB, 0xB9, 0x33, 0x3E, + 0x45, 0xEC, 0x42, 0xFA, 0x08, 0xB7, 0x07, 0x5D, + 0x01, 0xF5, 0xC0, 0xFF, 0x08, 0xFC, 0x00, 0xE5, + 0x0B, 0xF8, 0xC2, 0xCA, 0xF4, 0xF9, 0x0D, 0x7F, + 0x44, 0x6D, 0x19, 0xFE, 0x46, 0x97, 0x33, 0x5E, + 0x08, 0xFF, 0xD1, 0xFF, 0xC6, 0x8B, 0x24, 0x74, + 0x12, 0xFC, 0x00, 0x9F, 0x94, 0xB7, 0x06, 0xD5, + 0x40, 0x7A, 0x20, 0x9E, 0x04, 0x5F, 0x41, 0x2F, + 0x3D, 0x77, 0x36, 0x75, 0x81, 0x8A, 0x70, 0x3A, + 0x98, 0xD1, 0x71, 0x02, 0x4D, 0x01, 0xC1, 0xFF, + 0x0D, 0x00, 0xD3, 0x05, 0xF9, 0x00, 0x0B, 0x00 + }; + + std::memset(ioamhram, 0x00, 0x0A0); + std::memcpy(ioamhram + 0x0A0, feaxDump, sizeof feaxDump); + std::memcpy(ioamhram + 0x100, ffxxDump, sizeof ffxxDump); +} + +static void setInitialDmgIoamhram(unsigned char ioamhram[]) { + static unsigned char const oamDump[0xA0] = { + 0xBB, 0xD8, 0xC4, 0x04, 0xCD, 0xAC, 0xA1, 0xC7, + 0x7D, 0x85, 0x15, 0xF0, 0xAD, 0x19, 0x11, 0x6A, + 0xBA, 0xC7, 0x76, 0xF8, 0x5C, 0xA0, 0x67, 0x0A, + 0x7B, 0x75, 0x56, 0x3B, 0x65, 0x5C, 0x4D, 0xA3, + 0x00, 0x05, 0xD7, 0xC9, 0x1B, 0xCA, 0x11, 0x6D, + 0x38, 0xE7, 0x13, 0x2A, 0xB1, 0x10, 0x72, 0x4D, + 0xA7, 0x47, 0x13, 0x89, 0x7C, 0x62, 0x5F, 0x90, + 0x64, 0x2E, 0xD3, 0xEF, 0xAB, 0x01, 0x15, 0x85, + 0xE8, 0x2A, 0x6E, 0x4A, 0x1F, 0xBE, 0x49, 0xB1, + 0xE6, 0x0F, 0x93, 0xE2, 0xB6, 0x87, 0x5D, 0x35, + 0xD8, 0xD4, 0x4A, 0x45, 0xCA, 0xB3, 0x33, 0x74, + 0x18, 0xC1, 0x16, 0xFB, 0x8F, 0xA4, 0x8E, 0x70, + 0xCD, 0xB4, 0x4A, 0xDC, 0xE6, 0x34, 0x32, 0x41, + 0xF9, 0x84, 0x6A, 0x99, 0xEC, 0x92, 0xF1, 0x8B, + 0x5D, 0xA5, 0x09, 0xCF, 0x3A, 0x93, 0xBC, 0xE0, + 0x15, 0x19, 0xE4, 0xB6, 0x9A, 0x04, 0x3B, 0xC1, + 0x96, 0xB7, 0x56, 0x85, 0x6A, 0xAA, 0x1E, 0x2A, + 0x80, 0xEE, 0xE7, 0x46, 0x76, 0x8B, 0x0D, 0xBA, + 0x24, 0x40, 0x42, 0x05, 0x0E, 0x04, 0x20, 0xA6, + 0x5E, 0xC1, 0x97, 0x7E, 0x44, 0x05, 0x01, 0xA9 + }; + + static unsigned char const ffxxDump[0x100] = { + 0xCF, 0x00, 0x7E, 0xFF, 0xD3, 0x00, 0x00, 0xF8, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE1, + 0x80, 0xBF, 0xF3, 0xFF, 0xBF, 0xFF, 0x3F, 0x00, + 0xFF, 0xBF, 0x7F, 0xFF, 0x9F, 0xFF, 0xBF, 0xFF, + 0xFF, 0x00, 0x00, 0xBF, 0x77, 0xF3, 0xF1, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0x71, 0x72, 0xD5, 0x91, 0x58, 0xBB, 0x2A, 0xFA, + 0xCF, 0x3C, 0x54, 0x75, 0x48, 0xCF, 0x8F, 0xD9, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFC, + 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0x2B, 0x0B, 0x64, 0x2F, 0xAF, 0x15, 0x60, 0x6D, + 0x61, 0x4E, 0xAC, 0x45, 0x0F, 0xDA, 0x92, 0xF3, + 0x83, 0x38, 0xE4, 0x4E, 0xA7, 0x6C, 0x38, 0x58, + 0xBE, 0xEA, 0xE5, 0x81, 0xB4, 0xCB, 0xBF, 0x7B, + 0x59, 0xAD, 0x50, 0x13, 0x5E, 0xF6, 0xB3, 0xC1, + 0xDC, 0xDF, 0x9E, 0x68, 0xD7, 0x59, 0x26, 0xF3, + 0x62, 0x54, 0xF8, 0x36, 0xB7, 0x78, 0x6A, 0x22, + 0xA7, 0xDD, 0x88, 0x15, 0xCA, 0x96, 0x39, 0xD3, + 0xE6, 0x55, 0x6E, 0xEA, 0x90, 0x76, 0xB8, 0xFF, + 0x50, 0xCD, 0xB5, 0x1B, 0x1F, 0xA5, 0x4D, 0x2E, + 0xB4, 0x09, 0x47, 0x8A, 0xC4, 0x5A, 0x8C, 0x4E, + 0xE7, 0x29, 0x50, 0x88, 0xA8, 0x66, 0x85, 0x4B, + 0xAA, 0x38, 0xE7, 0x6B, 0x45, 0x3E, 0x30, 0x37, + 0xBA, 0xC5, 0x31, 0xF2, 0x71, 0xB4, 0xCF, 0x29, + 0xBC, 0x7F, 0x7E, 0xD0, 0xC7, 0xC3, 0xBD, 0xCF, + 0x59, 0xEA, 0x39, 0x01, 0x2E, 0x00, 0x69, 0x00 + }; + + std::memcpy(ioamhram , oamDump, sizeof oamDump); + std::memset(ioamhram + 0x0A0, 0x00, 0x060); + std::memcpy(ioamhram + 0x100, ffxxDump, sizeof ffxxDump); +} + +} // anon namespace + +void gambatte::setInitState(SaveState &state, bool const cgb, bool const gbaCgbMode, bool const clearSram) { + static unsigned char const cgbObjpDump[0x40] = { + 0x00, 0x00, 0xF2, 0xAB, + 0x61, 0xC2, 0xD9, 0xBA, + 0x88, 0x6E, 0xDD, 0x63, + 0x28, 0x27, 0xFB, 0x9F, + 0x35, 0x42, 0xD6, 0xD4, + 0x50, 0x48, 0x57, 0x5E, + 0x23, 0x3E, 0x3D, 0xCA, + 0x71, 0x21, 0x37, 0xC0, + 0xC6, 0xB3, 0xFB, 0xF9, + 0x08, 0x00, 0x8D, 0x29, + 0xA3, 0x20, 0xDB, 0x87, + 0x62, 0x05, 0x5D, 0xD4, + 0x0E, 0x08, 0xFE, 0xAF, + 0x20, 0x02, 0xD7, 0xFF, + 0x07, 0x6A, 0x55, 0xEC, + 0x83, 0x40, 0x0B, 0x77 + }; + + state.cpu.cycleCounter = cgb ? 0x102A0 : 0x102A0 + 0x8D2C; + state.cpu.pc = 0x100; + state.cpu.sp = 0xFFFE; + state.cpu.a = cgb * 0x10 | 0x01; + state.cpu.b = cgb & gbaCgbMode; + state.cpu.c = 0x13; + state.cpu.d = 0x00; + state.cpu.e = 0xD8; + state.cpu.f = 0xB0; + state.cpu.h = 0x01; + state.cpu.l = 0x4D; + state.cpu.skip = false; + + /* On a real Game Boy, battery-backed cartridge RAM survives a + * reset (the battery keeps the SRAM contents alive while the + * console is powered down). Only fill SRAM with 0xFF on the + * very first init (i.e. when the cart is freshly loaded); + * leave it untouched on subsequent resets. */ + if (clearSram) + std::memset(state.mem.sram.ptr, 0xFF, state.mem.sram.size()); + + setInitialVram(state.mem.vram.ptr, cgb); + + if (cgb) { + setInitialCgbWram(state.mem.wram.ptr); + setInitialCgbIoamhram(state.mem.ioamhram.ptr); + } else { + setInitialDmgWram(state.mem.wram.ptr); + setInitialDmgIoamhram(state.mem.ioamhram.ptr); + } + + state.mem.ioamhram.ptr[0x104] = 0x1C; + state.mem.ioamhram.ptr[0x140] = 0x91; + state.mem.ioamhram.ptr[0x144] = 0x00; + + state.mem.divLastUpdate = 0; + state.mem.timaLastUpdate = 0; + state.mem.tmatime = disabled_time; + state.mem.nextSerialtime = disabled_time; + state.mem.lastOamDmaUpdate = disabled_time; + state.mem.unhaltTime = disabled_time; + state.mem.minIntTime = 0; + state.mem.rombank = 1; + state.mem.dmaSource = 0; + state.mem.dmaDestination = 0; + state.mem.rambank = 0; + state.mem.oamDmaPos = 0xFE; +#ifdef HAVE_NETWORK + state.mem.serialize_value = 0xFF; + state.mem.serialize_is_fastcgb = false; +#endif + state.mem.IME = false; + state.mem.halted = false; + state.mem.enableRam = false; + state.mem.rambankMode = false; + state.mem.hdmaTransfer = false; + /* Sachen MMC1 outer-bank mask register; harmless default for non-Sachen carts. */ + state.mem.sachenOuterMask = 0; + /* Sachen MMC1 lock-progress counter; harmless default for non-Sachen carts. */ + state.mem.sachenLockCount = 0; + + + for (int i = 0x00; i < 0x40; i += 0x02) { + state.ppu.bgpData.ptr[i ] = 0xFF; + state.ppu.bgpData.ptr[i + 1] = 0x7F; + } + + //set initial gbc gb mode bg palette + for (int i = 0; i < 8; i += 2) { + state.ppu.dmgPalette[i ] = 0xFF; + state.ppu.dmgPalette[i + 1] = 0x7F; + } + //set initial gbc gb mode sprite palette + std::memcpy(state.ppu.dmgPalette + 8, cgbObjpDump, 8 * 2); + + std::memcpy(state.ppu.objpData.ptr, cgbObjpDump, sizeof cgbObjpDump); + + if (!cgb) { + state.ppu.bgpData.ptr[0] = state.mem.ioamhram.get()[0x147]; + state.ppu.objpData.ptr[0] = state.mem.ioamhram.get()[0x148]; + state.ppu.objpData.ptr[1] = state.mem.ioamhram.get()[0x149]; + } + + for (int pos = 0; pos < 80; ++pos) + state.ppu.oamReaderBuf.ptr[pos] = state.mem.ioamhram.ptr[(pos * 2 & ~3) | (pos & 1)]; + + std::fill_n(state.ppu.oamReaderSzbuf.ptr, 40, false); + std::memset(state.ppu.spAttribList, 0, sizeof state.ppu.spAttribList); + std::memset(state.ppu.spByte0List, 0, sizeof state.ppu.spByte0List); + std::memset(state.ppu.spByte1List, 0, sizeof state.ppu.spByte1List); + state.ppu.videoCycles = cgb ? 144*456ul + 164 : 153*456ul + 396; + state.ppu.enableDisplayM0Time = state.cpu.cycleCounter; + state.ppu.winYPos = 0xFF; + state.ppu.xpos = 0; + state.ppu.endx = 0; + state.ppu.reg0 = 0; + state.ppu.reg1 = 0; + state.ppu.tileword = 0; + state.ppu.ntileword = 0; + state.ppu.attrib = 0; + state.ppu.nattrib = 0; + state.ppu.state = 0; + state.ppu.nextSprite = 0; + state.ppu.currentSprite = 0; + state.ppu.lyc = state.mem.ioamhram.get()[0x145]; + state.ppu.m0lyc = state.mem.ioamhram.get()[0x145]; + state.ppu.weMaster = false; + state.ppu.winDrawState = 0; + state.ppu.wscx = 0; + state.ppu.lastM0Time = 1234; + state.ppu.nextM0Irq = 0; + state.ppu.oldWy = state.mem.ioamhram.get()[0x14A]; + state.ppu.pendingLcdstatIrq = false; + + // spu.cycleCounter >> 12 & 7 represents the frame sequencer position. + state.spu.cycleCounter = (cgb ? 0x1E00 : 0x2400) | (state.cpu.cycleCounter >> 1 & 0x1FF); + + state.spu.ch1.sweep.counter = SoundUnit::counter_disabled; + state.spu.ch1.sweep.shadow = 0; + state.spu.ch1.sweep.nr0 = 0; + state.spu.ch1.sweep.negging = false; + if (cgb) { + state.spu.ch1.duty.nextPosUpdate = (state.spu.cycleCounter & ~1ul) + 37 * 2; + state.spu.ch1.duty.pos = 6; + state.spu.ch1.duty.high = true; + } else { + state.spu.ch1.duty.nextPosUpdate = (state.spu.cycleCounter & ~1ul) + 69 * 2; + state.spu.ch1.duty.pos = 3; + state.spu.ch1.duty.high = false; + } + state.spu.ch1.duty.nr3 = 0xC1; + state.spu.ch1.env.counter = SoundUnit::counter_disabled; + state.spu.ch1.env.volume = 0; + state.spu.ch1.lcounter.counter = SoundUnit::counter_disabled; + state.spu.ch1.lcounter.lengthCounter = 0x40; + state.spu.ch1.nr4 = 0x07; + state.spu.ch1.master = true; + + state.spu.ch2.duty.nextPosUpdate = SoundUnit::counter_disabled; + state.spu.ch2.duty.nr3 = 0; + state.spu.ch2.duty.pos = 0; + state.spu.ch2.duty.high = false; + state.spu.ch2.env.counter = SoundUnit::counter_disabled; + state.spu.ch2.env.volume = 0; + state.spu.ch2.lcounter.counter = SoundUnit::counter_disabled; + state.spu.ch2.lcounter.lengthCounter = 0x40; + state.spu.ch2.nr4 = 0; + state.spu.ch2.master = false; + + std::memcpy(state.spu.ch3.waveRam.ptr, state.mem.ioamhram.get() + 0x130, 0x10); + state.spu.ch3.lcounter.counter = SoundUnit::counter_disabled; + state.spu.ch3.lcounter.lengthCounter = 0x100; + state.spu.ch3.waveCounter = SoundUnit::counter_disabled; + state.spu.ch3.lastReadTime = SoundUnit::counter_disabled; + state.spu.ch3.nr3 = 0; + state.spu.ch3.nr4 = 0; + state.spu.ch3.wavePos = 0; + state.spu.ch3.sampleBuf = 0; + state.spu.ch3.master = false; + + state.spu.ch4.lfsr.counter = state.spu.cycleCounter + 4; + state.spu.ch4.lfsr.reg = 0xFF; + state.spu.ch4.env.counter = SoundUnit::counter_disabled; + state.spu.ch4.env.volume = 0; + state.spu.ch4.lcounter.counter = SoundUnit::counter_disabled; + state.spu.ch4.lcounter.lengthCounter = 0x40; + state.spu.ch4.nr4 = 0; + state.spu.ch4.master = false; + + state.rtc.baseTime = std::time(0); + state.rtc.haltTime = state.rtc.baseTime; + state.rtc.dataDh = 0; + state.rtc.dataDl = 0; + state.rtc.dataH = 0; + state.rtc.dataM = 0; + state.rtc.dataS = 0; + state.rtc.lastLatchData = false; + + state.huc3.baseTime = std::time(0); + state.huc3.haltTime = state.huc3.baseTime; + state.huc3.dataTime = 0; + state.huc3.writingTime = 0; + state.huc3.irBaseCycle = 0; + state.huc3.halted = false; + state.huc3.shift = 0; + state.huc3.ramValue = 1; + state.huc3.modeflag = 2; // huc3_none + state.huc3.irReceivingPulse = false; +} diff --git a/src/games/gambatte/src/initstate.h b/src/games/gambatte/src/initstate.h new file mode 100644 index 0000000..2bf3ef7 --- /dev/null +++ b/src/games/gambatte/src/initstate.h @@ -0,0 +1,31 @@ +/*************************************************************************** + * Copyright (C) 2008 by Sindre Aam�s * + * aamas@stud.ntnu.no * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License version 2 as * + * published by the Free Software Foundation. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License version 2 for more details. * + * * + * You should have received a copy of the GNU General Public License * + * version 2 along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ +#ifndef INITSTATE_H +#define INITSTATE_H + +namespace gambatte { +/* clearSram defaults to true to preserve the historical behavior + * for callers that load a fresh cart (uninitialized SRAM should + * read as 0xFF). Pass false from a soft-reset path so battery- + * backed cartridge RAM survives the reset, matching real + * hardware behavior. */ +void setInitState(struct SaveState &state, bool cgb, bool gbaCgbMode, bool clearSram = true); +} + +#endif diff --git a/src/games/gambatte/src/insertion_sort.h b/src/games/gambatte/src/insertion_sort.h new file mode 100644 index 0000000..939ba07 --- /dev/null +++ b/src/games/gambatte/src/insertion_sort.h @@ -0,0 +1,51 @@ +/*************************************************************************** + * Copyright (C) 2007 by Sindre Aamås * + * aamas@stud.ntnu.no * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License version 2 as * + * published by the Free Software Foundation. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License version 2 for more details. * + * * + * You should have received a copy of the GNU General Public License * + * version 2 along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ + +#ifndef INSERTION_SORT_H +#define INSERTION_SORT_H + +#include + +template +void insertionSort(T *const start, T *const end, Less less) { + if (start >= end) + return; + + T *a = start; + + while (++a < end) { + const T e = *a; + + T *b = a; + + while (b != start && less(e, *(b - 1))) { + *b = *(b - 1); + b = b - 1; + } + + *b = e; + } +} + +template +inline void insertionSort(T *const start, T *const end) { + insertionSort(start, end, std::less()); +} + +#endif /*INSERTION_SORT_H*/ diff --git a/src/games/gambatte/src/interrupter.cpp b/src/games/gambatte/src/interrupter.cpp new file mode 100644 index 0000000..d04b004 --- /dev/null +++ b/src/games/gambatte/src/interrupter.cpp @@ -0,0 +1,85 @@ +// +// Copyright (C) 2007 by sinamas +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License version 2 as +// published by the Free Software Foundation. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License version 2 for more details. +// +// You should have received a copy of the GNU General Public License +// version 2 along with this program; if not, write to the +// Free Software Foundation, Inc., +// 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +// + +#include "interrupter.h" +#include "gambatte-memory.h" + +namespace gambatte { + +Interrupter::Interrupter(unsigned short &sp, unsigned short &pc) +: sp_(sp) +, pc_(pc) +{ +} + +unsigned long Interrupter::interrupt(unsigned const address, unsigned long cc, Memory &memory) { + cc += 8; + sp_ = (sp_ - 1) & 0xFFFF; + memory.write(sp_, pc_ >> 8, cc); + cc += 4; + sp_ = (sp_ - 1) & 0xFFFF; + memory.write(sp_, pc_ & 0xFF, cc); + pc_ = address; + cc += 8; + + if (address == 0x40 && !gsCodes_.empty()) + applyVblankCheats(cc, memory); + + return cc; +} + +static int asHex(char c) { + /* Accept both uppercase and lowercase A-F. The previous + * implementation produced silently-wrong values for + * lowercase letters, leading to no-op cheats when users + * typed codes in lowercase. */ + if (c >= 'a' && c <= 'f') return c - 'a' + 0xA; + if (c >= 'A' && c <= 'F') return c - 'A' + 0xA; + return c - '0'; +} + +void Interrupter::setGameShark(std::string const &codes) { + std::string code; + + for (std::size_t pos = 0; pos < codes.length(); pos += code.length() + 1) { + code = codes.substr(pos, codes.find(';', pos) - pos); + if (code.length() >= 8) { + GsCode gs; + gs.type = asHex(code[0]) << 4 | asHex(code[1]); + gs.value = (asHex(code[2]) << 4 | asHex(code[3])) & 0xFF; + gs.address = ( asHex(code[4]) << 4 + | asHex(code[5]) + | asHex(code[6]) << 12 + | asHex(code[7]) << 8) & 0xFFFF; + gsCodes_.push_back(gs); + } + } +} + +void Interrupter::clearCheats() { + gsCodes_.clear(); +} + +void Interrupter::applyVblankCheats(unsigned long const cc, Memory &memory) { + for (std::size_t i = 0, size = gsCodes_.size(); i < size; ++i) { + if (gsCodes_[i].type == 0x01) + memory.write(gsCodes_[i].address, gsCodes_[i].value, cc); + } +} + +} diff --git a/src/games/gambatte/src/interrupter.h b/src/games/gambatte/src/interrupter.h new file mode 100644 index 0000000..2a5eda6 --- /dev/null +++ b/src/games/gambatte/src/interrupter.h @@ -0,0 +1,52 @@ +// +// Copyright (C) 2007 by sinamas +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License version 2 as +// published by the Free Software Foundation. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License version 2 for more details. +// +// You should have received a copy of the GNU General Public License +// version 2 along with this program; if not, write to the +// Free Software Foundation, Inc., +// 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +// + +#ifndef INTERRUPTER_H +#define INTERRUPTER_H + +#include +#include + +namespace gambatte { + +struct GsCode { + unsigned short address; + unsigned char value; + unsigned char type; +}; + +class Memory; + +class Interrupter { +public: + Interrupter(unsigned short &sp, unsigned short &pc); + unsigned long interrupt(unsigned address, unsigned long cycleCounter, Memory &memory); + void setGameShark(std::string const &codes); + void clearCheats(); + +private: + unsigned short &sp_; + unsigned short &pc_; + std::vector gsCodes_; + + void applyVblankCheats(unsigned long cc, Memory &mem); +}; + +} + +#endif diff --git a/src/games/gambatte/src/interruptrequester.cpp b/src/games/gambatte/src/interruptrequester.cpp new file mode 100644 index 0000000..d7de5bb --- /dev/null +++ b/src/games/gambatte/src/interruptrequester.cpp @@ -0,0 +1,117 @@ +// +// Copyright (C) 2010 by sinamas +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License version 2 as +// published by the Free Software Foundation. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License version 2 for more details. +// +// You should have received a copy of the GNU General Public License +// version 2 along with this program; if not, write to the +// Free Software Foundation, Inc., +// 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +// + +#include "interruptrequester.h" +#include "savestate.h" + +namespace gambatte { + +InterruptRequester::InterruptRequester() +: eventTimes_(disabled_time) +, minIntTime_(0) +, ifreg_(0) +, iereg_(0) +{ +} + +void InterruptRequester::saveState(SaveState &state) const { + state.mem.minIntTime = minIntTime_; + state.mem.IME = ime(); + state.mem.halted = halted(); +} + +void InterruptRequester::loadState(SaveState const &state) { + minIntTime_ = state.mem.minIntTime; + ifreg_ = state.mem.ioamhram.get()[0x10F]; + iereg_ = state.mem.ioamhram.get()[0x1FF] & 0x1F; + intFlags_.set(state.mem.IME, state.mem.halted); + + eventTimes_.setValue(intFlags_.imeOrHalted() && pendingIrqs() + ? minIntTime_ + : static_cast(disabled_time)); +} + +void InterruptRequester::resetCc(unsigned long oldCc, unsigned long newCc) { + minIntTime_ = minIntTime_ < oldCc ? 0 : minIntTime_ - (oldCc - newCc); + + if (eventTimes_.value(intevent_interrupts) != disabled_time) + eventTimes_.setValue(minIntTime_); +} + +void InterruptRequester::ei(unsigned long cc) { + intFlags_.setIme(); + minIntTime_ = cc + 1; + + if (pendingIrqs()) + eventTimes_.setValue(minIntTime_); +} + +void InterruptRequester::di() { + intFlags_.unsetIme(); + + if (!intFlags_.imeOrHalted()) + eventTimes_.setValue(disabled_time); +} + +void InterruptRequester::halt() { + intFlags_.setHalted(); + + if (pendingIrqs()) + eventTimes_.setValue(minIntTime_); +} + +void InterruptRequester::unhalt() { + intFlags_.unsetHalted(); + + if (!intFlags_.imeOrHalted()) + eventTimes_.setValue(disabled_time); +} + +void InterruptRequester::flagIrq(unsigned bit) { + ifreg_ |= bit; + + if (intFlags_.imeOrHalted() && pendingIrqs()) + eventTimes_.setValue(minIntTime_); +} + +void InterruptRequester::ackIrq(unsigned bit) { + ifreg_ ^= bit; + di(); +} + +void InterruptRequester::setIereg(unsigned iereg) { + iereg_ = iereg & 0x1F; + + if (intFlags_.imeOrHalted()) { + eventTimes_.setValue(pendingIrqs() + ? minIntTime_ + : static_cast(disabled_time)); + } +} + +void InterruptRequester::setIfreg(unsigned ifreg) { + ifreg_ = ifreg; + + if (intFlags_.imeOrHalted()) { + eventTimes_.setValue(pendingIrqs() + ? minIntTime_ + : static_cast(disabled_time)); + } +} + +} diff --git a/src/games/gambatte/src/interruptrequester.h b/src/games/gambatte/src/interruptrequester.h new file mode 100644 index 0000000..c1b8413 --- /dev/null +++ b/src/games/gambatte/src/interruptrequester.h @@ -0,0 +1,97 @@ +// +// Copyright (C) 2010 by sinamas +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License version 2 as +// published by the Free Software Foundation. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License version 2 for more details. +// +// You should have received a copy of the GNU General Public License +// version 2 along with this program; if not, write to the +// Free Software Foundation, Inc., +// 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +// + +#ifndef INTERRUPT_REQUESTER_H +#define INTERRUPT_REQUESTER_H + +#include "counterdef.h" +#include "minkeeper.h" + +namespace gambatte { + +struct SaveState; + +enum IntEventId { intevent_unhalt, + intevent_end, + intevent_blit, + intevent_serial, + intevent_oam, + intevent_dma, + intevent_tima, + intevent_video, + intevent_interrupts, intevent_last = intevent_interrupts }; + +class InterruptRequester { +public: + InterruptRequester(); + void saveState(SaveState &) const; + void loadState(SaveState const &); + void resetCc(unsigned long oldCc, unsigned long newCc); + unsigned ifreg() const { return ifreg_; } + unsigned pendingIrqs() const { return ifreg_ & iereg_; } + bool ime() const { return intFlags_.ime(); } + bool halted() const { return intFlags_.halted(); } + void ei(unsigned long cc); + void di(); + void halt(); + void unhalt(); + void flagIrq(unsigned bit); + void ackIrq(unsigned bit); + void setIereg(unsigned iereg); + void setIfreg(unsigned ifreg); + + IntEventId minEventId() const { return static_cast(eventTimes_.min()); } + unsigned long minEventTime() const { return eventTimes_.minValue(); } + template void setEventTime(unsigned long value) { eventTimes_.setValue(value); } + void setEventTime(IntEventId id, unsigned long value) { eventTimes_.setValue(id, value); } + unsigned long eventTime(IntEventId id) const { return eventTimes_.value(id); } + +private: + class IntFlags { + public: + IntFlags() : flags_(0) {} + bool ime() const { return flags_ & flag_ime; } + bool halted() const { return flags_ & flag_halted; } + bool imeOrHalted() const { return flags_; } + void setIme() { flags_ |= flag_ime; } + void unsetIme() { flags_ &= ~flag_ime; } + void setHalted() { flags_ |= flag_halted; } + void unsetHalted() { flags_ &= ~flag_halted; } + void set(bool ime, bool halted) { flags_ = halted * flag_halted + ime * flag_ime; } + + private: + unsigned char flags_; + enum { flag_ime = 1, flag_halted = 2 }; + }; + + MinKeeper eventTimes_; + unsigned long minIntTime_; + unsigned ifreg_; + unsigned iereg_; + IntFlags intFlags_; +}; + +inline void flagHdmaReq(InterruptRequester &intreq) { intreq.setEventTime(0); } +inline void flagGdmaReq(InterruptRequester &intreq) { intreq.setEventTime(1); } +inline void ackDmaReq(InterruptRequester &intreq) { intreq.setEventTime(disabled_time); } +inline bool hdmaReqFlagged(InterruptRequester const &intreq) { return intreq.eventTime(intevent_dma) == 0; } +inline bool gdmaReqFlagged(InterruptRequester const &intreq) { return intreq.eventTime(intevent_dma) == 1; } + +} + +#endif diff --git a/src/games/gambatte/src/mem/cartridge.cpp b/src/games/gambatte/src/mem/cartridge.cpp new file mode 100644 index 0000000..eca046e --- /dev/null +++ b/src/games/gambatte/src/mem/cartridge.cpp @@ -0,0 +1,1180 @@ +/*************************************************************************** + * Copyright (C) 2007-2010 by Sindre Aamås * + * aamas@stud.ntnu.no * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License version 2 as * + * published by the Free Software Foundation. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License version 2 for more details. * + * * + * You should have received a copy of the GNU General Public License * + * version 2 along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ +#include "cartridge.h" +#include "../savestate.h" +#include +#include +#include +#include "gambatte_log.h" + +extern void cartridge_set_rumble(unsigned active); + +namespace gambatte +{ + + static unsigned toMulti64Rombank(const unsigned rombank) + { + return (rombank >> 1 & 0x30) | (rombank & 0xF); + } + + static inline unsigned rambanks(MemPtrs const &memptrs) + { + return (memptrs.rambankdataend() - memptrs.rambankdata()) / 0x2000; + } + + static inline unsigned rombanks(MemPtrs const &memptrs) + { + return (memptrs.romdataend() - memptrs.romdata() ) / 0x4000; + } + + class DefaultMbc : public Mbc { + public: + virtual bool isAddressWithinAreaRombankCanBeMappedTo(unsigned addr, unsigned bank) const { + return (addr< 0x4000) == (bank == 0); + } + }; + class Mbc0 : public DefaultMbc { + MemPtrs &memptrs; + bool enableRam; + public: + explicit Mbc0(MemPtrs &memptrs) + : memptrs(memptrs), + enableRam(false) + { + } + virtual void romWrite(const unsigned P, const unsigned data) { + if (P < 0x2000) { + enableRam = (data & 0xF) == 0xA; + memptrs.setRambank(enableRam ? MemPtrs::READ_EN | MemPtrs::WRITE_EN : 0, 0); + } + } + virtual void saveState(SaveState::Mem &ss) const { + ss.enableRam = enableRam; + } + virtual void loadState(const SaveState::Mem &ss) { + enableRam = ss.enableRam; + memptrs.setRambank(enableRam ? MemPtrs::READ_EN | MemPtrs::WRITE_EN : 0, 0); + } + }; + + class Mbc1 : public DefaultMbc { + MemPtrs &memptrs; + unsigned char rombank; + unsigned char rambank; + bool enableRam; + bool rambankMode; + static unsigned adjustedRombank(unsigned bank) { return (bank & 0x1F) ? bank : bank | 1; } + void setRambank() const { memptrs.setRambank(enableRam ? MemPtrs::READ_EN | MemPtrs::WRITE_EN : 0, rambank & (rambanks(memptrs) - 1)); } + void setRombank() const { memptrs.setRombank(adjustedRombank(rombank) & (rombanks(memptrs) - 1)); } + public: + explicit Mbc1(MemPtrs &memptrs) + : memptrs(memptrs), + rombank(1), + rambank(0), + enableRam(false), + rambankMode(false) + { + } + virtual void romWrite(const unsigned P, const unsigned data) { + switch (P >> 13 & 3) { + case 0: + enableRam = (data & 0xF) == 0xA; + setRambank(); + break; + case 1: + rombank = rambankMode ? data & 0x1F : (rombank & 0x60) | (data & 0x1F); + setRombank(); + break; + case 2: + if (rambankMode) { + rambank = data & 3; + setRambank(); + } else { + rombank = (data << 5 & 0x60) | (rombank & 0x1F); + setRombank(); + } + break; + case 3: + // Pretty sure this should take effect immediately, but I have a policy not to change old behavior + // unless I have something (eg. a verified test or a game) that justifies it. + rambankMode = data & 1; + break; + } + } + virtual void saveState(SaveState::Mem &ss) const { + ss.rombank = rombank; + ss.rambank = rambank; + ss.enableRam = enableRam; + ss.rambankMode = rambankMode; + } + virtual void loadState(const SaveState::Mem &ss) { + rombank = ss.rombank; + rambank = ss.rambank; + enableRam = ss.enableRam; + rambankMode = ss.rambankMode; + setRambank(); + setRombank(); + } + }; + class Mbc1Multi64 : public Mbc { + MemPtrs &memptrs; + unsigned char rombank; + bool enableRam; + bool rombank0Mode; + static unsigned adjustedRombank(unsigned bank) { return (bank & 0x1F) ? bank : bank | 1; } + void setRombank() const { + if (rombank0Mode) { + const unsigned rb = toMulti64Rombank(rombank); + memptrs.setRombank0(rb & 0x30); + memptrs.setRombank(adjustedRombank(rb)); + } else { + memptrs.setRombank0(0); + memptrs.setRombank(adjustedRombank(rombank) & (rombanks(memptrs) - 1)); + } + } + public: + explicit Mbc1Multi64(MemPtrs &memptrs) + : memptrs(memptrs), + rombank(1), + enableRam(false), + rombank0Mode(false) + { + } + virtual void romWrite(const unsigned P, const unsigned data) { + switch (P >> 13 & 3) { + case 0: + enableRam = (data & 0xF) == 0xA; + memptrs.setRambank(enableRam ? MemPtrs::READ_EN | MemPtrs::WRITE_EN : 0, 0); + break; + case 1: + rombank = (rombank & 0x60) | (data & 0x1F); + memptrs.setRombank(rombank0Mode + ? adjustedRombank(toMulti64Rombank(rombank)) + : adjustedRombank(rombank) & (rombanks(memptrs) - 1)); + break; + case 2: + rombank = (data << 5 & 0x60) | (rombank & 0x1F); + setRombank(); + break; + case 3: + rombank0Mode = data & 1; + setRombank(); + break; + } + } + virtual void saveState(SaveState::Mem &ss) const { + ss.rombank = rombank; + ss.enableRam = enableRam; + ss.rambankMode = rombank0Mode; + } + virtual void loadState(const SaveState::Mem &ss) { + rombank = ss.rombank; + enableRam = ss.enableRam; + rombank0Mode = ss.rambankMode; + memptrs.setRambank(enableRam ? MemPtrs::READ_EN | MemPtrs::WRITE_EN : 0, 0); + setRombank(); + } + virtual bool isAddressWithinAreaRombankCanBeMappedTo(unsigned addr, unsigned bank) const { + return (addr < 0x4000) == ((bank & 0xF) == 0); + } + }; + /* ---------------------------------------------------------------- * + * Sachen MMC1 * + * ---------------------------------------------------------------- * + * Unlicensed Game Boy mapper used by Sachen multi-cart releases * + * such as "4 in 1 (Europe) (4B-001)" -- the cartridge that * + * prompted this implementation (libretro/gambatte-libretro #190). * + * * + * Reference: https://wiki.tauwasser.eu/view/Sachen_MMC1 * + * Original implementation by NewRisingSun in hhugboy 1.3.0 * + * (MbcUnlSachenMMC1.cpp / .h, released under CC0 and GPL-2). * + * See also mGBA 0.10 which ports the same logic. * + * * + * Salient hardware quirks that this implementation reproduces: * + * * + * 1. Header scramble. While the CPU bus address satisfies * + * A8 = 1 and A15..A9 = 0 (i.e. 0x0100..0x01FF), * + * the mapper performs the bit permutation * + * RA0 <- A6 , RA1 <- A4 , RA4 <- A1 , RA6 <- A0 * + * when fetching from the attached ROM. The permutation is an * + * involution -- doing it twice yields the original address -- * + * and it is used to obscure each game's header in the ROM * + * image. We undo it at load time by *pre-descrambling* the * + * 0x100..0x1FF window of every 16 KiB bank in place. This * + * keeps the hot read path (a single pointer indirection in * + * MemPtrs) free of any per-access conditional. The only * + * visible side effect is that addresses 0x4100..0x41FF of any * + * bank that ends up mapped at the 0x4000..0x7FFF window will * + * now read descrambled bytes too, but no real Sachen game ever * + * touches its own header through that window. * + * * + * 2. Lock / unlock state. After reset the mapper is "locked": * + * every cartridge read in 0x0000..0x7FFF has its A7 forced * + * high, so the bootstrap ROM that compares logo bytes against * + * 0x0104..0x0133 actually sees the bytes stored at * + * 0x0184..0x01B3 of the active ROM bank. That second region * + * holds the Sachen logo (descrambled at load), which means * + * the boot ROM passes its Nintendo-logo check while the cart * + * still displays Sachen branding. On real hardware the * + * mapper unlocks after 49 high->low transitions of A15; in * + * gambatte we cannot observe A15 from outside the CPU core, * + * so we approximate by unlocking on the 0xFF50 write that * + * hands control from the bootstrap to the cartridge. This is * + * functionally correct for every known Sachen cart because * + * the boot ROM is the only thing that ever exercises the * + * lock state. When gambatte is configured to run without any * + * bootstrap (the common case for libretro builds) the lock * + * is dropped at load time and the Sachen logo tiles are * + * written directly into VRAM so the game's own copy-protection * + * check still finds them. * + * * + * 3. Banking. Three internal registers control which physical ROM * + * banks appear at 0x0000..0x3FFF (the "base" window) and * + * 0x4000..0x7FFF (the "switch" window): * + * * + * base bank : 0x0000..0x1FFF writes -- gated * + * ROM bank : 0x2000..0x3FFF writes * + * ROM bank mask : 0x4000..0x5FFF writes -- gated * + * * + * The map-enable gate consults bits 4 and 5 of the current * + * ROM-bank value: writes to the base and mask registers only * + * take effect when both bits are set (rom_bank & 0x30 == * + * 0x30). The mapping formula is * + * * + * base : (base & mask) | 0 * + * switch: (base & mask) | (rom_bank & ~mask) * + * * + * and the ROM-bank register is zero-adjusted (a write of 0 * + * stores 1) so the base window can never alias the switch. * + * * + * The mapper has no SRAM and no battery; the savestate fields * + * reused below (rombank, rambank, enableRam) carry rom_bank, * + * outerBank, and the lock flag respectively. outerMask and the * + * lock-progress counter get their own dedicated fields * + * (SaveState::Mem::sachenOuterMask, ::sachenLockCount); the * + * latter is needed so a savestate captured mid-bootstrap * + * resumes with the exact read-count progress and the verify * + * pass still unlocks at the right point. * + * ---------------------------------------------------------------- */ + + /* Apply the Sachen MMC1 address bit permutation to a 16-bit + * address. Bits 0,1,4,6 are swapped pairwise (A0<->A6, A1<->A4); + * all other bits pass through unchanged. The transform is its + * own inverse. */ + static inline unsigned sachenScramble(unsigned addr) { + return (addr & ~0x53u) + | ((addr >> 6) & 0x01u) + | ((addr >> 3) & 0x02u) + | ((addr << 3) & 0x10u) + | ((addr << 6) & 0x40u); + } + + class Mbc1Sachen : public Mbc { + MemPtrs &memptrs; + unsigned char rom_bank; + unsigned char outerBank; + unsigned char outerMask; + bool locked; + /* CPU reads of 0x0100..0x01FF observed by Memory::read while + * the cart is in its locked boot state. The DMG bootstrap's + * display pass performs exactly 48 such reads (cart 0x0104.. + * 0x0133); when this counter hits 48 the mapper unlocks so + * the bootstrap's later verify pass sees the unscrambled + * Nintendo-logo bytes and proceeds to FF50. The counter + * itself lives here so a single byte address can be shared + * with Memory at setup time; the public lockCounterPtr() + * returns it. */ + unsigned char lockCount; + /* Original (unlocked) bytes at offsets 0x100..0x1FF of physical + * bank 0, captured after descrambling. The lock overlay writes + * a permuted view derived from this back into the same ROM + * region; on unlock we copy these bytes back to restore the + * descrambled header. */ + unsigned char unlockedBank0Header[0x100]; + + unsigned rombankMask() const { + /* Physical ROM banks present in the loaded image, expressed + * as a mask suitable for clamping a bank index. The pow2ceil + * call in loadROM guarantees rombanks() is a power of two. */ + return rombanks(memptrs) - 1; + } + + void applyBanks() const { + const unsigned mask = rombankMask(); + memptrs.setRombank0((outerBank & outerMask) & mask); + memptrs.setRombank(((outerBank & outerMask) | (rom_bank & ~outerMask)) & mask); + } + + public: + explicit Mbc1Sachen(MemPtrs &memptrs) + : memptrs(memptrs), + rom_bank(1), + outerBank(0), + outerMask(0), + locked(true), + lockCount(0) + { + /* Capture the descrambled header bytes that loadROM has + * already written to physical bank 0. These are what reads + * at 0x0100..0x01FF will see once we drop the lock. */ + std::memcpy(unlockedBank0Header, + memptrs.romdata() + 0x100, + sizeof unlockedBank0Header); + } + + /* Write a "locked" view of the header to physical bank 0's + * 0x100..0x1FF window. While locked, every read in + * 0x0000..0x7FFF has its A7 forced high, so a read of logical + * 0x104 returns the byte at logical 0x184, etc. We achieve the + * same effect statically by mirroring the upper 128 bytes of + * the descrambled header into the lower 128 bytes. The upper + * 128 bytes (already at offsets 0x180..0x1FF) need no change + * because A7 is already set there. */ + void installLockOverlay() { + unsigned char *const dst = memptrs.romdata() + 0x100; + for (unsigned i = 0; i < 0x80; ++i) + dst[i] = unlockedBank0Header[i | 0x80]; + /* The upper half is already correct; rewrite it for clarity + * so a partial load (savestate, soft reset) cannot leave + * the buffer in an inconsistent state. */ + for (unsigned i = 0x80; i < 0x100; ++i) + dst[i] = unlockedBank0Header[i]; + locked = true; + lockCount = 0; + } + + void removeLockOverlay() { + std::memcpy(memptrs.romdata() + 0x100, + unlockedBank0Header, + sizeof unlockedBank0Header); + locked = false; + } + + virtual unsigned char *lockCounterPtr() { return &lockCount; } + virtual void unlock() { + if (locked) + removeLockOverlay(); + } + + virtual void romWrite(const unsigned P, const unsigned data) { + switch (P >> 13) { + case 0: /* 0x0000..0x1FFF -- base ROM bank, gated */ + if ((rom_bank & 0x30) == 0x30) + outerBank = data; + break; + case 1: /* 0x2000..0x3FFF -- ROM bank (zero-adjusted) */ + rom_bank = data ? data : 1; + break; + case 2: /* 0x4000..0x5FFF -- ROM bank mask, gated */ + if ((rom_bank & 0x30) == 0x30) + outerMask = data; + break; + default: + /* 0x6000..0x7FFF and any unmapped range -- ignored. */ + return; + } + applyBanks(); + } + + /* No FF50 hook required: the lock state now drops on the + * 48th cart read in 0x0100..0x01FF, which the DMG bootstrap + * reaches at the end of its logo display pass, well before + * the verify pass that needs the unlocked bytes. */ + + /* The Sachen MMC1 has no on-cart SRAM; the area + * 0xA000..0xBFFF reads back open-bus and writes there have no + * effect. Returning false here keeps Game Genie cheat + * application limited to the lower 32 KiB. */ + virtual bool isAddressWithinAreaRombankCanBeMappedTo(unsigned addr, unsigned bank) const { + (void)bank; + return addr < 0x8000; + } + + virtual void saveState(SaveState::Mem &ss) const { + ss.rombank = rom_bank; + ss.rambank = outerBank; + ss.enableRam = locked; + ss.sachenOuterMask = outerMask; + ss.sachenLockCount = lockCount; + } + virtual void loadState(const SaveState::Mem &ss) { + rom_bank = ss.rombank ? ss.rombank : 1; + outerBank = ss.rambank; + outerMask = ss.sachenOuterMask; + const bool wasLocked = locked; + const bool wantLocked = ss.enableRam; + /* Synchronize the in-ROM lock overlay with the restored + * state. A savestate captured mid-boot (locked=true) will + * re-install the overlay; one captured post-boot + * (locked=false) will leave the descrambled bytes in + * place. The lock-progress counter is preserved across + * saves so a mid-bootstrap save restores at exactly the + * same read count and the verify pass unlocks at the + * right moment. installLockOverlay() resets lockCount to + * zero, so any preserved value must be restored + * afterwards. */ + if (wantLocked && !wasLocked) { + installLockOverlay(); + lockCount = ss.sachenLockCount; + } else if (!wantLocked && wasLocked) { + removeLockOverlay(); + } else if (wantLocked) { + lockCount = ss.sachenLockCount; + } + applyBanks(); + } + }; + + class Mbc2 : public DefaultMbc { + MemPtrs &memptrs; + unsigned char rombank; + bool enableRam; + public: + explicit Mbc2(MemPtrs &memptrs) + : memptrs(memptrs), + rombank(1), + enableRam(false) + { + } + virtual void romWrite(const unsigned P, const unsigned data) { + switch (P & 0x6100) { + case 0x0000: + enableRam = (data & 0xF) == 0xA; + memptrs.setRambank(enableRam ? MemPtrs::READ_EN | MemPtrs::WRITE_EN : 0, 0); + break; + case 0x2100: + rombank = data & 0xF; + memptrs.setRombank(rombank & (rombanks(memptrs) - 1)); + break; + } + } + virtual void saveState(SaveState::Mem &ss) const { + ss.rombank = rombank; + ss.enableRam = enableRam; + } + virtual void loadState(const SaveState::Mem &ss) { + rombank = ss.rombank; + enableRam = ss.enableRam; + memptrs.setRambank(enableRam ? MemPtrs::READ_EN | MemPtrs::WRITE_EN : 0, 0); + memptrs.setRombank(rombank & (rombanks(memptrs) - 1)); + } + }; + class Mbc3 : public DefaultMbc { + MemPtrs &memptrs; + Rtc *const rtc; + unsigned char rombank; + unsigned char rambank; + bool enableRam; + void setRambank() const { + unsigned flags = enableRam ? MemPtrs::READ_EN | MemPtrs::WRITE_EN : 0; + if (rtc) { + rtc->set(enableRam, rambank); + if (rtc->getActive()) + flags |= MemPtrs::RTC_EN; + } + memptrs.setRambank(flags, rambank & (rambanks(memptrs) - 1)); + } + public: + Mbc3(MemPtrs &memptrs, Rtc *const rtc) + : memptrs(memptrs), + rtc(rtc), + rombank(1), + rambank(0), + enableRam(false) + { + } + virtual void romWrite(const unsigned P, const unsigned data) { + switch (P >> 13 & 3) { + case 0: + enableRam = (data & 0xF) == 0xA; + setRambank(); + break; + case 1: + rombank = data & 0x7F; + setRombank(); + break; + case 2: + rambank = data; + setRambank(); + break; + case 3: + if (rtc) + rtc->latch(data); + break; + } + } + virtual void saveState(SaveState::Mem &ss) const { + ss.rombank = rombank; + ss.rambank = rambank; + ss.enableRam = enableRam; + } + virtual void loadState(const SaveState::Mem &ss) { + rombank = ss.rombank; + rambank = ss.rambank; + enableRam = ss.enableRam; + setRambank(); + setRombank(); + } + + void setRombank() const { + memptrs.setRombank(std::max(rombank & (rombanks(memptrs) - 1), 1u)); + } + }; + class HuC1 : public DefaultMbc { + MemPtrs &memptrs; + unsigned char rombank; + unsigned char rambank; + bool enableRam; + bool rambankMode; + void setRambank() const { + memptrs.setRambank(enableRam ? MemPtrs::READ_EN | MemPtrs::WRITE_EN : MemPtrs::READ_EN, + rambankMode ? rambank & (rambanks(memptrs) - 1) : 0); + } + void setRombank() const { memptrs.setRombank((rambankMode ? rombank : rambank << 6 | rombank) & (rombanks(memptrs) - 1)); } + public: + explicit HuC1(MemPtrs &memptrs) + : memptrs(memptrs), + rombank(1), + rambank(0), + enableRam(false), + rambankMode(false) + { + } + virtual void romWrite(const unsigned P, const unsigned data) { + switch (P >> 13 & 3) { + case 0: + enableRam = (data & 0xF) == 0xA; + setRambank(); + break; + case 1: + rombank = data & 0x3F; + setRombank(); + break; + case 2: + rambank = data & 3; + rambankMode ? setRambank() : setRombank(); + break; + case 3: + rambankMode = data & 1; + setRambank(); + setRombank(); + break; + } + } + virtual void saveState(SaveState::Mem &ss) const { + ss.rombank = rombank; + ss.rambank = rambank; + ss.enableRam = enableRam; + ss.rambankMode = rambankMode; + } + virtual void loadState(const SaveState::Mem &ss) { + rombank = ss.rombank; + rambank = ss.rambank; + enableRam = ss.enableRam; + rambankMode = ss.rambankMode; + setRambank(); + setRombank(); + } + }; + class HuC3 : public DefaultMbc { + MemPtrs &memptrs_; + HuC3Chip *const huc3_; + unsigned char rombank_; + unsigned char rambank_; + unsigned char ramflag_; + void setRambank() const { + huc3_->setRamflag(ramflag_); + unsigned flags; + if(ramflag_ >= 0x0B && ramflag_ < 0x0F) { + // System registers mode + flags = MemPtrs::READ_EN | MemPtrs::WRITE_EN | MemPtrs::RTC_EN; + } + else if(ramflag_ == 0x0A || ramflag_ > 0x0D) { + // Read/write mode + flags = MemPtrs::READ_EN | MemPtrs::WRITE_EN; + } + else { + // Read-only mode ?? + flags = MemPtrs::READ_EN; + } + memptrs_.setRambank(flags, rambank_ & (rambanks(memptrs_) - 1)); + } + void setRombank() const { memptrs_.setRombank(std::max(rombank_ & (rombanks(memptrs_) - 1), 1u)); } + public: + explicit HuC3(MemPtrs &memptrs, HuC3Chip *const huc3) + : memptrs_(memptrs), + huc3_(huc3), + rombank_(1), + rambank_(0), + ramflag_(0) + { + } + virtual void romWrite(unsigned const p, unsigned const data) { + switch (p >> 13 & 3) { + case 0: + ramflag_ = data; + //gambatte_log(RETRO_LOG_DEBUG, " set ramflag to %02X\n", data); + setRambank(); + break; + case 1: + //gambatte_log(RETRO_LOG_DEBUG, " set rombank to %02X\n", data); + rombank_ = data; + setRombank(); + break; + case 2: + //gambatte_log(RETRO_LOG_DEBUG, " set rambank to %02X\n", data); + rambank_ = data; + setRambank(); + break; + case 3: + // GEST: "programs will write 1 here" + break; + } + } + virtual void saveState(SaveState::Mem &ss) const { + ss.rombank = rombank_; + ss.rambank = rambank_; + ss.HuC3RAMflag = ramflag_; + } + virtual void loadState(SaveState::Mem const &ss) { + rombank_ = ss.rombank; + rambank_ = ss.rambank; + ramflag_ = ss.HuC3RAMflag; + setRambank(); + setRombank(); + } + }; + class Mbc5 : public DefaultMbc { + MemPtrs &memptrs; + unsigned short rombank; + unsigned char rambank; + bool enableRam; + bool hasRumble; + static unsigned adjustedRombank(const unsigned bank) { return bank; } + void setRambank() const { + memptrs.setRambank(enableRam ? MemPtrs::READ_EN | MemPtrs::WRITE_EN : 0, + rambank & (rambanks(memptrs) - 1)); + } + void setRombank() const { memptrs.setRombank(adjustedRombank(rombank) & (rombanks(memptrs) - 1));} + public: + explicit Mbc5(MemPtrs &memptrs, bool rumble) + : memptrs(memptrs), + rombank(1), + rambank(0), + enableRam(false), + hasRumble(rumble) + { + } + virtual void romWrite(const unsigned P, const unsigned data) { + switch (P >> 12 & 0x7) { + case 0x0: + case 0x1: + enableRam = (data & 0xF) == 0xA; + setRambank(); + break; + case 0x2: + case 0x3: + rombank = P < 0x3000 ? (rombank & 0x100) | data + : (data << 8 & 0x100) | (rombank & 0xFF); + setRombank(); + break; + case 0x4: + case 0x5: + if(hasRumble && ((P >> 12 & 0x7) == 4)) + { + cartridge_set_rumble((data >> 3) & 1); + rambank = (data & ~8) & 0x0f; + } + else + { + rambank = data & 0x0f; + } + setRambank(); + break; + default: + break; + } + } + virtual void saveState(SaveState::Mem &ss) const { + ss.rombank = rombank; + ss.rambank = rambank; + ss.enableRam = enableRam; + } + virtual void loadState(const SaveState::Mem &ss) { + rombank = ss.rombank; + rambank = ss.rambank; + enableRam = ss.enableRam; + setRambank(); + setRombank(); + } + }; + + static bool hasRtc(unsigned headerByte0x147) + { + switch (headerByte0x147) + { + case 0xFE: // huc3 + case 0x0F: + case 0x10: + return true; + default: + return false; + } + } + + void Cartridge::setStatePtrs(SaveState &state) + { + state.mem.vram.set(memptrs_.vramdata(), memptrs_.vramdataend() - memptrs_.vramdata()); + state.mem.sram.set(memptrs_.rambankdata(), memptrs_.rambankdataend() - memptrs_.rambankdata()); + state.mem.wram.set(memptrs_.wramdata(0), memptrs_.wramdataend() - memptrs_.wramdata(0)); + } + + void Cartridge::saveState(SaveState &state) const + { + mbc->saveState(state.mem); + rtc_.saveState(state); + huc3_.saveState(state); + } + + void Cartridge::loadState(const SaveState &state) + { + huc3_.loadState(state); + rtc_.loadState(state); + mbc->loadState(state.mem); + } + + /* Note: a previous helper named enforce8bit() iterated every + * ROM byte masking with 0xFF, but its enclosing condition + * if (static_cast(0x100)) + * is always false (0x100 truncated to unsigned char is 0), so + * the body was dead code in every build. Removed. */ + + static unsigned pow2ceil(unsigned n) + { + --n; + n |= n >> 1; + n |= n >> 2; + n |= n >> 4; + n |= n >> 8; + ++n; + + return n; + } + + /* Sum the bytes that the bootstrap logo check would actually + * fetch from a locked Sachen MMC1 cartridge across logical + * addresses 0x0104..0x0133. While locked, the mapper forces A7 + * high, so reads of logical 0x104..0x133 are routed to + * logical 0x184..0x1B3; the address scrambler then permutes + * bits 0,1,4,6 of each address before indexing the ROM. The + * resulting byte stream from a genuine Sachen MMC1 dump always + * sums to one of two magic constants (SACHEN_LOGO_SUM_A/B), + * which is what detectSachenMmc1() compares against. + * + * Implementation note: the address bit permutation is its own + * inverse, so applying sachenScramble to 0x184+i yields the + * physical ROM offset that the mapper would supply when the + * CPU reads logical 0x104+i in the locked state. */ + static unsigned sachenScrambledLogoSum(const uint8_t *rom) { + unsigned sum = 0; + for (unsigned i = 0; i < 0x30; ++i) + sum += rom[sachenScramble(0x184 + i)]; + return sum; + } + + /* Magic checksums of the two Sachen logo variants that NewRisingSun + * identified by scanning known dumps. The 5446 value is the + * unscrambled Nintendo-logo byte sum, used here only as a negative + * filter -- if the cart already contains a plain Nintendo logo at + * 0x0104 it is not a Sachen cart no matter what else looks odd. */ + enum { + NINTENDO_LOGO_SUM = 5446, + SACHEN_LOGO_SUM_A = 5542, + SACHEN_LOGO_SUM_B = 7484 + }; + + static bool detectSachenMmc1(const uint8_t *rom, unsigned romsize) { + if (romsize < 0x200) + return false; + + unsigned plainSum = 0; + for (unsigned i = 0; i < 0x30; ++i) + plainSum += rom[0x104 + i]; + if (plainSum == NINTENDO_LOGO_SUM) + return false; /* legitimate Nintendo logo present -> not Sachen */ + + /* Only the variant whose scrambled logo lives at offset 0x184 + * corresponds to a Sachen *MMC1* dump (the 0x104 variant is + * MMC2, which this implementation does not handle). */ + if (romsize < 0x1B4) + return false; + const unsigned sum184 = sachenScrambledLogoSum(rom); + return sum184 == SACHEN_LOGO_SUM_A || sum184 == SACHEN_LOGO_SUM_B; + } + + /* Read one byte from the cartridge image as it would appear at + * logical CPU address `logicalAddr` once the Sachen MMC1 scramble + * has been undone. `logicalAddr` must lie in 0x0100..0x01FF. */ + static inline uint8_t sachenReadUnscrambled(const uint8_t *rom, + unsigned logicalAddr) { + return rom[sachenScramble(logicalAddr)]; + } + + int Cartridge::loadROM(const void *data, unsigned int romsize, unsigned int forceModel, const bool multiCartCompat) + { + const uint8_t *romdata = (uint8_t*)data; + if (romsize < 0x4000 || !romdata) + return -1; + + unsigned rambanks = 1; + unsigned rombanks = 2; + bool cgb = false; + enum Cartridgetype { PLAIN, MBC1, MBC2, MBC3, MBC5, HUC1, HUC3, SACHEN_MMC1 } type = PLAIN; + bool rumble = false; + + isSachen_ = detectSachenMmc1(romdata, romsize); + + { + unsigned char header[0x150]; + /* For a Sachen cart the bytes at offsets 0x0100..0x014F in + * the raw ROM image are scrambled. Run them through the + * descrambler before the header switch so the cartridge + * type, RAM size and CGB-flag bytes read as the publisher + * intended. The pre-0x0100 region is untouched -- that is + * the entry vector area and is not subject to scramble. */ + if (isSachen_) { + std::memcpy(header, romdata, 0x100); + for (unsigned i = 0x100; i < 0x150; ++i) + header[i] = sachenReadUnscrambled(romdata, i); + } else { + std::memcpy(header, romdata, 0x150); + } + + if (isSachen_) { + /* Sachen MMC1 carts have no SRAM, no battery, and are + * always DMG. Skip the normal header dispatch -- the + * descrambled byte at 0x0147 carries an unlicensed code + * that no legitimate switch case would accept anyway. */ + gambatte_log(RETRO_LOG_INFO, "Sachen MMC1 ROM loaded.\n"); + type = SACHEN_MMC1; + } else + switch (header[0x0147]) + { + case 0x00: gambatte_log(RETRO_LOG_INFO, "Plain ROM loaded.\n"); type = PLAIN; break; + case 0x01: gambatte_log(RETRO_LOG_INFO, "MBC1 ROM loaded.\n"); type = MBC1; break; + case 0x02: gambatte_log(RETRO_LOG_INFO, "MBC1 ROM+RAM loaded.\n"); type = MBC1; break; + case 0x03: gambatte_log(RETRO_LOG_INFO, "MBC1 ROM+RAM+BATTERY loaded.\n"); type = MBC1; break; + case 0x05: gambatte_log(RETRO_LOG_INFO, "MBC2 ROM loaded.\n"); type = MBC2; break; + case 0x06: gambatte_log(RETRO_LOG_INFO, "MBC2 ROM+BATTERY loaded.\n"); type = MBC2; break; + case 0x08: gambatte_log(RETRO_LOG_INFO, "Plain ROM with additional RAM loaded.\n"); type = MBC2; break; + case 0x09: gambatte_log(RETRO_LOG_INFO, "Plain ROM with additional RAM and Battery loaded.\n"); type = MBC2;break; + case 0x0B: gambatte_log(RETRO_LOG_INFO, "MM01 ROM not supported.\n"); return -1; + case 0x0C: gambatte_log(RETRO_LOG_INFO, "MM01 ROM not supported.\n"); return -1; + case 0x0D: gambatte_log(RETRO_LOG_INFO, "MM01 ROM not supported.\n"); return -1; + case 0x0F: gambatte_log(RETRO_LOG_INFO, "MBC3 ROM+TIMER+BATTERY loaded.\n"); type = MBC3; break; + case 0x10: gambatte_log(RETRO_LOG_INFO, "MBC3 ROM+TIMER+RAM+BATTERY loaded.\n"); type = MBC3; break; + case 0x11: gambatte_log(RETRO_LOG_INFO, "MBC3 ROM loaded.\n"); type = MBC3; break; + case 0x12: gambatte_log(RETRO_LOG_INFO, "MBC3 ROM+RAM loaded.\n"); type = MBC3; break; + case 0x13: gambatte_log(RETRO_LOG_INFO, "MBC3 ROM+RAM+BATTERY loaded.\n"); type = MBC3; break; + case 0x15: gambatte_log(RETRO_LOG_INFO, "MBC4 ROM not supported.\n"); return -1; + case 0x16: gambatte_log(RETRO_LOG_INFO, "MBC4 ROM not supported.\n"); return -1; + case 0x17: gambatte_log(RETRO_LOG_INFO, "MBC4 ROM not supported.\n"); return -1; + case 0x19: gambatte_log(RETRO_LOG_INFO, "MBC5 ROM loaded.\n"); type = MBC5; break; + case 0x1A: gambatte_log(RETRO_LOG_INFO, "MBC5 ROM+RAM loaded.\n"); type = MBC5; break; + case 0x1B: gambatte_log(RETRO_LOG_INFO, "MBC5 ROM+RAM+BATTERY loaded.\n"); type = MBC5; break; + case 0x1C: gambatte_log(RETRO_LOG_INFO, "MBC5+RUMBLE ROM loaded.\n"); type = MBC5; rumble = true; break; + case 0x1D: gambatte_log(RETRO_LOG_INFO, "MBC5+RUMBLE+RAM ROM loaded.\n"); type = MBC5; rumble = true; break; + case 0x1E: gambatte_log(RETRO_LOG_INFO, "MBC5+RUMBLE+RAM+BATTERY ROM loaded.\n"); type = MBC5; rumble = true; break; + case 0x20: gambatte_log(RETRO_LOG_INFO, "MBC6 ROM not supported.\n"); return -1; + case 0x22: gambatte_log(RETRO_LOG_INFO, "MBC7 ROM not supported.\n"); return -1; + case 0xEA: type = MBC1; break; // Hack to accept 0xEA as a MBC1 (Sonic 3D Blast 5) + case 0xFC: gambatte_log(RETRO_LOG_INFO, "Pocket Camera ROM not supported.\n"); return -1; + case 0xFD: gambatte_log(RETRO_LOG_INFO, "Bandai TAMA5 ROM not supported.\n"); return -1; + case 0xFE: gambatte_log(RETRO_LOG_INFO, "HuC3 ROM+RAM+BATTERY loaded.\n"); type = HUC3; break; + case 0xFF: gambatte_log(RETRO_LOG_INFO, "HuC1 ROM+BATTERY loaded.\n"); type = HUC1; break; + default: gambatte_log(RETRO_LOG_INFO, "Wrong data-format, corrupt or unsupported ROM.\n"); return -1; + } + + switch (header[0x0149]) + { + case 0x00: /*std::puts("No RAM");*/ rambanks = type == MBC2; break; + case 0x01: /*std::puts("2kB RAM");*/ /*rambankrom=1; break;*/ + case 0x02: /*std::puts("8kB RAM");*/ + rambanks = 1; + break; + case 0x03: /*std::puts("32kB RAM");*/ + rambanks = 4; + break; + case 0x04: /*std::puts("128kB RAM");*/ + rambanks = 16; + break; + case 0x05: /*std::puts("undocumented kB RAM");*/ + rambanks = 16; + break; + default: /*std::puts("Wrong data-format, corrupt or unsupported ROM loaded.");*/ + rambanks = 16; + break; + } + + /* Sachen MMC1 has no SRAM regardless of what the descrambled + * header byte at 0x0149 claims; override to avoid allocating + * useless save memory. */ + if (type == SACHEN_MMC1) + rambanks = 0; + + switch(forceModel){ + case 1://FORCE_DMG + cgb = false; + break; + case 8://FORCE_CGB + cgb = true; + break; + case 0://dont force anything + cgb = header[0x0143] >> 7; + } + + /* Sachen cartridges are mono-only DMG units; if a user + * forces CGB mode keep the request, but never auto-detect + * CGB from the (scrambled-then-unscrambled) flag byte. */ + if (type == SACHEN_MMC1 && forceModel == 0) + cgb = false; + } + + gambatte_log(RETRO_LOG_INFO, "rambanks: %u\n", rambanks); + + rombanks = pow2ceil(romsize / 0x4000); + gambatte_log(RETRO_LOG_INFO, "rombanks: %u\n", static_cast(romsize / 0x4000)); + + ggUndoList_.clear(); + mbc.reset(); + memptrs_.reset(rombanks, rambanks, cgb ? 8 : 2); + rtc_.set(false, 0); + huc3_.set(false); + + memcpy(memptrs_.romdata(), romdata, ((romsize / 0x4000) * 0x4000ul) * sizeof(unsigned char)); + std::memset(memptrs_.romdata() + (romsize / 0x4000) * 0x4000ul, 0xFF, (rombanks - romsize / 0x4000) * 0x4000ul); + + /* Pre-descramble every 16 KiB bank's 0x100..0x1FF window so the + * scrambled header region reads correctly through the normal + * MemPtrs fast path. The bit permutation is its own inverse, so + * a 256-byte in-place pass that swaps each pair of permuted + * offsets exactly once does the job; we iterate over the + * lexicographically smaller half and skip the fixed points to + * avoid double-swapping. */ + if (type == SACHEN_MMC1) { + const unsigned filledBanks = romsize / 0x4000; + for (unsigned bank = 0; bank < filledBanks; ++bank) { + unsigned char *const window = memptrs_.romdata() + bank * 0x4000ul + 0x100; + for (unsigned i = 0; i < 0x100; ++i) { + const unsigned j = sachenScramble(0x100 + i) - 0x100; + if (j > i) { + const unsigned char tmp = window[i]; + window[i] = window[j]; + window[j] = tmp; + } + } + } + } + + switch (type) + { + case PLAIN: mbc.reset(new Mbc0(memptrs_)); break; + case MBC1: + if (!rambanks && rombanks == 64 && multiCartCompat) { + /*std::puts("Multi-ROM \"MBC1\" presumed");*/ + mbc.reset(new Mbc1Multi64(memptrs_)); + } else + mbc.reset(new Mbc1(memptrs_)); + break; + case MBC2: mbc.reset(new Mbc2(memptrs_)); break; + case MBC3: mbc.reset(new Mbc3(memptrs_, hasRtc(memptrs_.romdata()[0x147]) ? &rtc_ : 0)); break; + case MBC5: mbc.reset(new Mbc5(memptrs_, rumble)); break; + case HUC1: mbc.reset(new HuC1(memptrs_)); break; + case HUC3: + huc3_.set(true); + mbc.reset(new HuC3(memptrs_, &huc3_)); + break; + case SACHEN_MMC1: + mbc.reset(new Mbc1Sachen(memptrs_)); + break; + } + + return 0; + } + + static int asHex(const char c) + { + /* Accept both uppercase and lowercase A-F (the previous + * implementation silently produced wrong values for + * lowercase letters). */ + if (c >= 'a' && c <= 'f') return c - 'a' + 0xA; + if (c >= 'A' && c <= 'F') return c - 'A' + 0xA; + return c - '0'; + } + + void Cartridge::applyGameGenie(const std::string &code) + { + if (6 < code.length()) + { + const unsigned val = (asHex(code[0]) << 4 | asHex(code[1])) & 0xFF; + const unsigned addr = (asHex(code[2]) << 8 | asHex(code[4]) << 4 | asHex(code[5]) | (asHex(code[6]) ^ 0xF) << 12) & 0x7FFF; + unsigned cmp = 0xFFFF; + + if (10 < code.length()) + { + cmp = (asHex(code[8]) << 4 | asHex(code[10])) ^ 0xFF; + cmp = ((cmp >> 2 | cmp << 6) ^ 0x45) & 0xFF; + } + + for (unsigned bank = 0; bank < static_cast(memptrs_.romdataend() - memptrs_.romdata()) / 0x4000; ++bank) + { + if (mbc->isAddressWithinAreaRombankCanBeMappedTo(addr, bank) + && (cmp > 0xFF || memptrs_.romdata()[bank * 0x4000ul + (addr & 0x3FFF)] == cmp)) + { + ggUndoList_.push_back(AddrData(bank * 0x4000ul + (addr & 0x3FFF), memptrs_.romdata()[bank * 0x4000ul + (addr & 0x3FFF)])); + memptrs_.romdata()[bank * 0x4000ul + (addr & 0x3FFF)] = val; + } + } + } + } + + void Cartridge::setGameGenie(const std::string &codes) + { +#if 0 + if (loaded()) +#endif + { + std::string code; + for (std::size_t pos = 0; pos < codes.length() + && (code = codes.substr(pos, codes.find(';', pos) - pos), true); pos += code.length() + 1) + applyGameGenie(code); + } + } + + void Cartridge::clearCheats() + { + for (std::vector::reverse_iterator it = ggUndoList_.rbegin(), end = ggUndoList_.rend(); it != end; ++it) + { + if (memptrs_.romdata() + it->addr < memptrs_.romdataend()) + memptrs_.romdata()[it->addr] = it->data; + } + + ggUndoList_.clear(); + } + + /* Inject the Sachen logo into VRAM so the cartridge's + * self-protection check finds it even when running without a + * Game Boy boot ROM. The expansion below replicates the boot + * ROM's logic: every source byte represents 8 horizontal pixels, + * each pixel doubling vertically and horizontally into a 2x2 tile + * block. The boot ROM writes interleaved planes 0 and 1 to + * 0x8010..0x81... for the Nintendo logo; we do the same with the + * Sachen logo bytes that the mapper would have presented through + * the lock overlay. + * + * `srcBank0` must point at the descrambled physical bank 0 (i.e. + * memptrs_.romdata() right after loadROM has descrambled the + * 0x100..0x1FF window). The 48 logo bytes live at offsets + * 0x184..0x1B3 of that bank -- this is the "lock-view" of + * 0x104..0x133, since A7|=1 maps the latter to the former. + * + * Logic ported from NewRisingSun's hhugboy MbcUnlSachenMMC1.cpp, + * CC0-licensed. */ + static void injectSachenVramLogo(unsigned char *vram, + const unsigned char *srcBank0) { + /* setInitialVram() in initstate.cpp pre-populates VRAM with the + * Nintendo logo tile data plus a trailing trademark-R tile so + * that boot-ROM-less DMG runs display a plausible power-on + * screen. For a Sachen cart we must replace the logo bytes + * with the Sachen-logo expansion, and also blank out the R + * tile that sits just after the logo region (offsets + * 0x190..0x1A7) so the Sachen logo does not get a stray + * Nintendo trademark drawn next to it. */ + std::memset(vram + 0x190, 0, 0x1A8 - 0x190); + + for (unsigned i = 0; i < 0x30; ++i) { + const unsigned char logoByte = srcBank0[0x184 + i]; + const unsigned char b1 = + ((logoByte >> 0) & 0x80) | ((logoByte >> 1) & 0x40) + | ((logoByte >> 1) & 0x20) | ((logoByte >> 2) & 0x10) + | ((logoByte >> 2) & 0x08) | ((logoByte >> 3) & 0x04) + | ((logoByte >> 3) & 0x02) | ((logoByte >> 4) & 0x01); + const unsigned char b2 = + ((logoByte << 4) & 0x80) | ((logoByte << 3) & 0x40) + | ((logoByte << 3) & 0x20) | ((logoByte << 2) & 0x10) + | ((logoByte << 2) & 0x08) | ((logoByte << 1) & 0x04) + | ((logoByte << 1) & 0x02) | ((logoByte << 0) & 0x01); + /* Boot-ROM logo tile data starts at VRAM offset 0x10 (i.e. + * logical 0x8010). Each source byte occupies 8 destination + * bytes: planes 0 and 1 of two adjacent 2-row tile pairs. */ + const unsigned base = 0x10 + i * 8; + vram[base + 0] = b1; + vram[base + 2] = b1; + vram[base + 4] = b2; + vram[base + 6] = b2; + vram[base + 1] = 0; + vram[base + 3] = 0; + vram[base + 5] = 0; + vram[base + 7] = 0; + } + } + + void Cartridge::sachenLockSetup(bool bootloaderUsed) + { + if (!isSachen_ || !mbc.get()) + return; + + Mbc1Sachen *const sachen = static_cast(mbc.get()); + + if (bootloaderUsed) { + /* The bootstrap is going to scan the logo at 0x0104..0x0133 + * during its display pass; present the locked view so VRAM + * receives the Sachen-logo expansion. The mapper will then + * unlock after the 48th cart read in 0x0100..0x01FF (the + * count is bumped by Memory::read and lands precisely at + * the end of the bootstrap's display pass), so the verify + * pass that immediately follows sees the unscrambled + * Nintendo-logo bytes and proceeds to FF50. */ + sachen->installLockOverlay(); + } else { + /* No bootstrap is going to run. The cartridge itself will + * verify the logo in VRAM as a self-test, so we inject the + * Sachen logo there directly and drop straight into the + * unlocked state. The descrambled header is already in + * place from loadROM(). */ + injectSachenVramLogo(memptrs_.vramdata(), memptrs_.romdata()); + sachen->unlock(); + } + } + + /* Memory wires its read-count-and-trigger machinery to these two + * methods; both indirect through the loaded MBC so non-Sachen + * carts return null/no-op and Memory's hot read path stays a + * single null-check branch. */ + unsigned char *Cartridge::sachenLockCounterPtr() { + return mbc.get() ? mbc->lockCounterPtr() : 0; + } + + void Cartridge::onSachenUnlock() { + if (mbc.get()) + mbc->unlock(); + } + +} + diff --git a/src/games/gambatte/src/mem/cartridge.h b/src/games/gambatte/src/mem/cartridge.h new file mode 100644 index 0000000..528b271 --- /dev/null +++ b/src/games/gambatte/src/mem/cartridge.h @@ -0,0 +1,226 @@ +/*************************************************************************** + * Copyright (C) 2007-2010 by Sindre Aamås * + * aamas@stud.ntnu.no * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License version 2 as * + * published by the Free Software Foundation. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License version 2 for more details. * + * * + * You should have received a copy of the GNU General Public License * + * version 2 along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ +#ifndef CARTRIDGE_H +#define CARTRIDGE_H + +#include "memptrs.h" +#include "rtc.h" +#include "huc3.h" +#include "savestate.h" +#include +#include +#include + +namespace gambatte +{ + class Mbc + { + public: + virtual ~Mbc() {} + virtual void romWrite(unsigned P, unsigned data) {}; + virtual void saveState(SaveState::Mem &ss) const {}; + virtual void loadState(const SaveState::Mem &ss) {}; + virtual bool isAddressWithinAreaRombankCanBeMappedTo(unsigned address, unsigned rombank) const = 0; + /* Called once when the boot ROM hands control to the cartridge + * (write of 1 to 0xFF50). No MBC currently implements this -- + * the Sachen MMC1 now unlocks on read-count, not on FF50 -- + * but the hook is kept for any future MBC that needs to + * sync with end-of-bootstrap. Default is a no-op so every + * other MBC is unaffected. */ + virtual void bootloaderFinished() {} + /* Sachen MMC1 only: pointer to the mapper's lock-progress + * counter (a single unsigned char shared with Memory) and + * the unlock entry point. Default null/no-op for every + * other MBC. */ + virtual unsigned char *lockCounterPtr() { return 0; } + virtual void unlock() {} + }; + + class Cartridge + { + public: + Cartridge() : isSachen_(false) {} + void setStatePtrs(SaveState &); + void saveState(SaveState &) const; + void loadState(const SaveState &); + + bool loaded() const { return mbc.get(); } + + const unsigned char * rmem(unsigned area) const + { + return memptrs_.rmem(area); + } + + unsigned char * wmem(unsigned area) const + { + return memptrs_.wmem(area); + } + + unsigned char * vramdata() const + { + return memptrs_.vramdata(); + } + + unsigned char * romdata(unsigned area) const + { + return memptrs_.romdata(area); + } + + unsigned char * wramdata(unsigned area) const + { + return memptrs_.wramdata(area); + } + + const unsigned char * rdisabledRam() const + { + return memptrs_.rdisabledRam(); + } + + const unsigned char * rsrambankptr() const + { + return memptrs_.rsrambankptr(); + } + + unsigned char * wsrambankptr() const + { + return memptrs_.wsrambankptr(); + } + + unsigned char * vrambankptr() const + { + return memptrs_.vrambankptr(); + } + + OamDmaSrc oamDmaSrc() const + { + return memptrs_.oamDmaSrc(); + } + + void setVrambank(unsigned bank) + { + memptrs_.setVrambank(bank); + } + + void setWrambank(unsigned bank) + { + memptrs_.setWrambank(bank); + } + void setOamDmaSrc(OamDmaSrc oamDmaSrc) + { + memptrs_.setOamDmaSrc(oamDmaSrc); + } + + void mbcWrite(unsigned addr, unsigned data) { mbc->romWrite(addr, data); } + + bool isCgb() const + { + return gambatte::isCgb(memptrs_); + } + + void rtcWrite(unsigned data) + { + rtc_.write(data); + } + + unsigned char rtcRead() const + { + return *rtc_.getActive(); + } + + const std::string saveBasePath() const; + void setSaveDir(const std::string &dir); + int loadROM(const void *romdata, unsigned int romsize, unsigned int forceModel, bool multicartCompat); + void setGameGenie(const std::string &codes); + void clearCheats(); + + bool isHuC3() const { return huc3_.isHuC3(); } + unsigned char HuC3Read(unsigned p, unsigned long const cc) { return huc3_.read(p, cc); } + void HuC3Write(unsigned p, unsigned data) { huc3_.write(p, data); } + + /* Sachen MMC1 (unlicensed mapper used by Sachen 4-in-1 etc.): + * the cartridge header is bit-scrambled and a "locked" boot + * state requires hooks outside the normal MBC write path. + * isSachen() returns true for Sachen MMC1 carts. + * sachenLockSetup(haveBoot) is called once after the bootloader + * has been installed (or skipped) to + * overlay the locked header bytes + * when the bootstrap will run, or to + * inject the Sachen logo into VRAM + * when running without a bootstrap. + * sachenLockCounterPtr() returns a pointer to the mapper's + * "cart reads in 0x0100..0x01FF" + * counter, or null for non-Sachen + * carts. Memory::read bumps it and + * calls onSachenUnlock() when the + * bootstrap finishes its logo + * display pass. + * onSachenUnlock() drops the locked state mid-boot + * so the bootstrap's verify pass + * sees the unscrambled Nintendo + * logo bytes and succeeds. + * onBootloaderFinished() is a no-op for the new Sachen + * implementation (lock now drops + * on read-count, not on 0xFF50) + * but is kept for any future MBC + * that needs the hook. + * For every non-Sachen cart these functions are no-ops. */ + bool isSachen() const { return isSachen_; } + void sachenLockSetup(bool bootloaderUsed); + unsigned char *sachenLockCounterPtr(); + void onSachenUnlock(); + void onBootloaderFinished() { if (mbc.get()) mbc->bootloaderFinished(); } + + void *savedata_ptr(); + unsigned savedata_size(); + + // Not endian-safe at all, but hey. + void *rtcdata_ptr(); + unsigned rtcdata_size(); + + private: + struct AddrData + { + unsigned long addr; + unsigned char data; + AddrData(unsigned long addr, unsigned data) : addr(addr), data(data) + { + } + }; + MemPtrs memptrs_; + Rtc rtc_; + HuC3Chip huc3_; + /* True only when the loaded ROM was identified as a Sachen + * MMC1 unlicensed cart via the scrambled-logo checksum check + * in loadROM. Used to route bootloader/VRAM hooks. */ + bool isSachen_; + +#if __cplusplus >= 201103L + std::unique_ptr mbc; +#else + std::auto_ptr mbc; +#endif + + std::vector ggUndoList_; + + void applyGameGenie(const std::string &code); + }; + +} + +#endif diff --git a/src/games/gambatte/src/mem/cartridge_libretro.cpp b/src/games/gambatte/src/mem/cartridge_libretro.cpp new file mode 100644 index 0000000..4869416 --- /dev/null +++ b/src/games/gambatte/src/mem/cartridge_libretro.cpp @@ -0,0 +1,93 @@ +#include "cartridge.h" +#include "../savestate.h" +#include +#include + + +namespace gambatte +{ + static bool hasBattery(unsigned char headerByte0x147) + { + switch (headerByte0x147) + { + case 0x03: + case 0x06: + case 0x09: + case 0x0F: + case 0x10: + case 0x13: + case 0x1B: + case 0x1E: + case 0xFE: + case 0xFF: + return true; + default: + return false; + } + } + + static bool hasRtc(unsigned headerByte0x147) + { + switch (headerByte0x147) + { + case 0xFE: // huc3 + case 0x0F: + case 0x10: + return true; + default: + return false; + } + } + + void *Cartridge::savedata_ptr() + { + /* Sachen MMC1 carts have no SRAM, and the byte at 0x0147 is + * the descrambled cartridge type which has no Nintendo + * meaning anyway -- skip the hasBattery() check entirely so + * we never hand the frontend a bogus save pointer. */ + if (isSachen_) + return 0; + // Check ROM header for battery. + if (hasBattery(memptrs_.romdata()[0x147])) + return memptrs_.rambankdata(); + return 0; + } + + unsigned Cartridge::savedata_size() + { + if (isSachen_) + return 0; + if (hasBattery(memptrs_.romdata()[0x147])) + return memptrs_.rambankdataend() - memptrs_.rambankdata(); + return 0; + } + + void *Cartridge::rtcdata_ptr() + { + if (isSachen_) + return 0; + if (hasRtc(memptrs_.romdata()[0x147])) { + if (isHuC3()) { + return &huc3_.getBaseTime(); + } else { + return &rtc_.getBaseTime(); + } + } + return 0; + } + + unsigned Cartridge::rtcdata_size() + { + if (isSachen_) + return 0; + if (hasRtc(memptrs_.romdata()[0x147])) { + if (isHuC3()) { + return sizeof(huc3_.getBaseTime()); + } else { + return sizeof(rtc_.getBaseTime()); + } + } + return 0; + } + +} diff --git a/src/games/gambatte/src/mem/huc3.cpp b/src/games/gambatte/src/mem/huc3.cpp new file mode 100644 index 0000000..74e4224 --- /dev/null +++ b/src/games/gambatte/src/mem/huc3.cpp @@ -0,0 +1,189 @@ +// +// Copyright (C) 2007 by sinamas +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License version 2 as +// published by the Free Software Foundation. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License version 2 for more details. +// +// You should have received a copy of the GNU General Public License +// version 2 along with this program; if not, write to the +// Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. +// + +#include "huc3.h" +#include "../savestate.h" +#include "gambatte_log.h" + +namespace gambatte { + +HuC3Chip::HuC3Chip() +: baseTime_(0) +, haltTime_(0) +, dataTime_(0) +, writingTime_(0) +, ramValue_(0) +, shift_(0) +, ramflag_(0) +, modeflag_(HUC3_NONE) +, irBaseCycle_(0) +, enabled_(false) +, halted_(false) +, irReceivingPulse_(false) +{ +} + +void HuC3Chip::doLatch() { + uint64_t tmp = (halted_ ? haltTime_ : std::time(0)) - baseTime_; + + unsigned minute = (tmp / 60) % 1440; + unsigned day = (tmp / 86400) & 0xFFF; + dataTime_ = (day << 12) | minute; +} + +void HuC3Chip::saveState(SaveState &state) const { + state.huc3.baseTime = baseTime_; + state.huc3.haltTime = haltTime_; + state.huc3.dataTime = dataTime_; + state.huc3.writingTime = writingTime_; + state.huc3.ramValue = ramValue_; + state.huc3.shift = shift_; + state.huc3.halted = halted_; + state.huc3.modeflag = modeflag_; + state.huc3.irBaseCycle = irBaseCycle_; + state.huc3.irReceivingPulse = irReceivingPulse_; +} + +void HuC3Chip::loadState(SaveState const &state) { + baseTime_ = state.huc3.baseTime; + haltTime_ = state.huc3.haltTime; + dataTime_ = state.huc3.dataTime; + ramValue_ = state.huc3.ramValue; + shift_ = state.huc3.shift; + halted_ = state.huc3.halted; + modeflag_ = state.huc3.modeflag; + writingTime_ = state.huc3.writingTime; + irBaseCycle_ = state.huc3.irBaseCycle; + irReceivingPulse_ = state.huc3.irReceivingPulse; +} + +unsigned char HuC3Chip::read(unsigned p, unsigned long const cc) { + // should only reach here with ramflag = 0B-0E + if(ramflag_ == 0x0E) { + // INFRARED + if(!irReceivingPulse_) { + irReceivingPulse_ = true; + irBaseCycle_ = cc; + } + unsigned long cyclesSinceStart = cc - irBaseCycle_; + unsigned char modulation = (cyclesSinceStart/105) & 1; // 4194304 Hz CPU, 40000 Hz remote signal + unsigned long timeUs = cyclesSinceStart*36/151; // actually *1000000/4194304 + // sony protocol + if(timeUs < 10000) { + // initialization allowance + return 0; + } + else if(timeUs < 10000 + 2400) { + // initial mark + return modulation; + } + else if(timeUs < 10000 + 2400 + 600) { + // initial space + return 0; + } + else { + // send data + timeUs -= 13000; + // write 20 bits (any 20 seem to do) + unsigned int data = 0xFFFFF; + for(unsigned long mask = 1UL << (20-1); mask; mask >>= 1) { + unsigned int markTime = (data & mask) ? 1200 : 600; + if(timeUs < markTime) { return modulation; } + timeUs -= markTime; + if(timeUs < 600) { return 0; } + timeUs -= 600; + } + + return 0; + } + } + if(ramflag_ < 0x0B || ramflag_ > 0x0D) { + gambatte_log(RETRO_LOG_ERROR, " error, hit huc3 read with ramflag=%02X\n", ramflag_); + return 0xFF; + } + if(ramflag_ == 0x0D) return 1; + else return ramValue_; +} + +void HuC3Chip::write(unsigned p, unsigned data) { + // as above + if(ramflag_ == 0x0B) { + // command + switch(data & 0xF0) { + case 0x10: + // read time + doLatch(); + if(modeflag_ == HUC3_READ) { + ramValue_ = (dataTime_ >> shift_) & 0x0F; + shift_ += 4; + if(shift_ > 24) shift_ = 0; + } + break; + case 0x30: + // write time + if(modeflag_ == HUC3_WRITE) { + if(shift_ == 0) writingTime_ = 0; + if(shift_ < 24) { + writingTime_ |= (data & 0x0F) << shift_; + shift_ += 4; + if(shift_ == 24) { + updateTime(); + modeflag_ = HUC3_READ; + } + } + } + break; + case 0x40: + // some kind of mode shift + switch(data & 0x0F) { + case 0x0: + // shift reset? + shift_ = 0; + break; + case 0x3: + // write time? + modeflag_ = HUC3_WRITE; + shift_ = 0; + break; + case 0x7: + modeflag_ = HUC3_READ; + shift_ = 0; + break; + // others are unimplemented so far + } + break; + case 0x50: + // ??? + break; + case 0x60: + modeflag_ = HUC3_READ; // ??? + break; + } + } + // do nothing for 0C/0D yet +} + +void HuC3Chip::updateTime() { + unsigned minute = (writingTime_ & 0xFFF) % 1440; + unsigned day = (writingTime_ & 0xFFF000) >> 12; + baseTime_ = std::time(0) - minute*60 - day*86400; + haltTime_ = baseTime_; + +} + +} diff --git a/src/games/gambatte/src/mem/huc3.h b/src/games/gambatte/src/mem/huc3.h new file mode 100644 index 0000000..3fd1f39 --- /dev/null +++ b/src/games/gambatte/src/mem/huc3.h @@ -0,0 +1,79 @@ +// +// Copyright (C) 2007 by sinamas +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License version 2 as +// published by the Free Software Foundation. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License version 2 for more details. +// +// You should have received a copy of the GNU General Public License +// version 2 along with this program; if not, write to the +// Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. +// + +#ifndef HuC3Chip_H +#define HuC3Chip_H + +enum +{ + HUC3_READ = 0, + HUC3_WRITE = 1, + HUC3_NONE = 2 +}; + +#include +#include + +namespace gambatte { + +struct SaveState; + +class HuC3Chip { +public: + HuC3Chip(); + uint64_t baseTime() const { return baseTime_; } + void setBaseTime(uint64_t baseTime) { baseTime_ = baseTime; } + + uint64_t& getBaseTime() + { + return baseTime_; + } + + void saveState(SaveState &state) const; + void loadState(SaveState const &state); + void setRamflag(unsigned char ramflag) { ramflag_ = ramflag; irReceivingPulse_ = false; } + bool isHuC3() const { return enabled_; } + + void set(bool enabled) { + enabled_ = enabled; + } + + unsigned char read(unsigned p, unsigned long const cc); + void write(unsigned p, unsigned data); + +private: + uint64_t baseTime_; + uint64_t haltTime_; + unsigned dataTime_; + unsigned writingTime_; + unsigned char ramValue_; + unsigned char shift_; + unsigned char ramflag_; + unsigned char modeflag_; + unsigned long irBaseCycle_; + bool enabled_; + bool halted_; + bool irReceivingPulse_; + + void doLatch(); + void updateTime(); +}; + +} + +#endif diff --git a/src/games/gambatte/src/mem/memptrs.cpp b/src/games/gambatte/src/mem/memptrs.cpp new file mode 100644 index 0000000..25d2778 --- /dev/null +++ b/src/games/gambatte/src/mem/memptrs.cpp @@ -0,0 +1,168 @@ +/*************************************************************************** + * Copyright (C) 2007-2010 by Sindre Aamås * + * aamas@stud.ntnu.no * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License version 2 as * + * published by the Free Software Foundation. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License version 2 for more details. * + * * + * You should have received a copy of the GNU General Public License * + * version 2 along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ +#include "memptrs.h" +#include +#include + +namespace gambatte +{ + + MemPtrs::MemPtrs() + : rmem_() + , wmem_() + , romdata_() + , wramdata_() + , vrambankptr_(0) + , rsrambankptr_(0) + , wsrambankptr_(0) + ,memchunk_(0) + , rambankdata_(0) + , wramdataend_(0) + , oamDmaSrc_(oam_dma_src_off) + { + } + + MemPtrs::~MemPtrs() + { + delete []memchunk_; + } + + void MemPtrs::reset(const unsigned rombanks, const unsigned rambanks, const unsigned wrambanks) + { + delete []memchunk_; + memchunk_ = new unsigned char[ + 0x4000 + + rombanks * 0x4000ul + 0x4000 + + rambanks * 0x2000ul + + wrambanks * 0x1000ul + + 0x4000]; + + romdata_[0] = romdata(); + rambankdata_ = romdata_[0] + rombanks * 0x4000ul + 0x4000; + wramdata_[0] = rambankdata_ + rambanks * 0x2000ul; + wramdataend_ = wramdata_[0] + wrambanks * 0x1000ul; + + std::memset(rdisabledRamw(), 0xFF, 0x2000); + + oamDmaSrc_ = oam_dma_src_off; + rmem_[0x3] = rmem_[0x2] = rmem_[0x1] = rmem_[0x0] = romdata_[0]; + rmem_[0xC] = wmem_[0xC] = wramdata_[0] - 0xC000; + rmem_[0xE] = wmem_[0xE] = wramdata_[0] - 0xE000; + + setRombank(1); + setRambank(0, 0); + setVrambank(0); + setWrambank(1); + } + + void MemPtrs::setRombank0(const unsigned bank) + { + romdata_[0] = romdata() + bank * 0x4000ul; + rmem_[0x3] = rmem_[0x2] = rmem_[0x1] = rmem_[0x0] = romdata_[0]; + disconnectOamDmaAreas(); + } + + void MemPtrs::setRombank(const unsigned bank) + { + romdata_[1] = romdata() + bank * 0x4000ul - 0x4000; + rmem_[0x7] = rmem_[0x6] = rmem_[0x5] = rmem_[0x4] = romdata_[1]; + disconnectOamDmaAreas(); + } + + void MemPtrs::setRambank(const unsigned flags, const unsigned rambank) + { + unsigned char *const srambankptr = (flags & RTC_EN) + ? 0 + : (rambankdata() != rambankdataend() + ? rambankdata_ + rambank * 0x2000ul - 0xA000 : wdisabledRam() - 0xA000); + + rsrambankptr_ = (flags & READ_EN) && srambankptr != wdisabledRam() - 0xA000 ? srambankptr : rdisabledRamw() - 0xA000; + wsrambankptr_ = (flags & WRITE_EN) ? srambankptr : wdisabledRam() - 0xA000; + rmem_[0xB] = rmem_[0xA] = rsrambankptr_; + wmem_[0xB] = wmem_[0xA] = wsrambankptr_; + disconnectOamDmaAreas(); + } + + void MemPtrs::setWrambank(const unsigned bank) + { + wramdata_[1] = wramdata_[0] + ((bank & 0x07) ? (bank & 0x07) : 1) * 0x1000; + rmem_[0xD] = wmem_[0xD] = wramdata_[1] - 0xD000; + disconnectOamDmaAreas(); + } + + void MemPtrs::setOamDmaSrc(const OamDmaSrc oamDmaSrc) + { + rmem_[0x3] = rmem_[0x2] = rmem_[0x1] = rmem_[0x0] = romdata_[0]; + rmem_[0x7] = rmem_[0x6] = rmem_[0x5] = rmem_[0x4] = romdata_[1]; + rmem_[0xB] = rmem_[0xA] = rsrambankptr_; + wmem_[0xB] = wmem_[0xA] = wsrambankptr_; + rmem_[0xC] = wmem_[0xC] = wramdata_[0] - 0xC000; + rmem_[0xD] = wmem_[0xD] = wramdata_[1] - 0xD000; + rmem_[0xE] = wmem_[0xE] = wramdata_[0] - 0xE000; + + oamDmaSrc_ = oamDmaSrc; + disconnectOamDmaAreas(); + } + + void MemPtrs::disconnectOamDmaAreas() + { + if (isCgb(*this)) + { + switch (oamDmaSrc_) + { + case oam_dma_src_rom: // fall through + case oam_dma_src_sram: + case oam_dma_src_invalid: + std::fill(rmem_, rmem_ + 8, static_cast(0)); + rmem_[0xB] = rmem_[0xA] = 0; + wmem_[0xB] = wmem_[0xA] = 0; + break; + case oam_dma_src_vram: + break; + case oam_dma_src_wram: + rmem_[0xE] = rmem_[0xD] = rmem_[0xC] = 0; + wmem_[0xE] = wmem_[0xD] = wmem_[0xC] = 0; + break; + case oam_dma_src_off: + break; + } + } + else + { + switch (oamDmaSrc_) + { + case oam_dma_src_rom: // fall through + case oam_dma_src_sram: + case oam_dma_src_wram: + case oam_dma_src_invalid: + std::fill(rmem_, rmem_ + 8, static_cast(0)); + rmem_[0xB] = rmem_[0xA] = 0; + wmem_[0xB] = wmem_[0xA] = 0; + rmem_[0xE] = rmem_[0xD] = rmem_[0xC] = 0; + wmem_[0xE] = wmem_[0xD] = wmem_[0xC] = 0; + break; + case oam_dma_src_vram: + break; + case oam_dma_src_off: + break; + } + } + } + +} diff --git a/src/games/gambatte/src/mem/memptrs.h b/src/games/gambatte/src/mem/memptrs.h new file mode 100644 index 0000000..e10a18c --- /dev/null +++ b/src/games/gambatte/src/mem/memptrs.h @@ -0,0 +1,159 @@ +/*************************************************************************** + * Copyright (C) 2007-2010 by Sindre Aamås * + * aamas@stud.ntnu.no * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License version 2 as * + * published by the Free Software Foundation. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License version 2 for more details. * + * * + * You should have received a copy of the GNU General Public License * + * version 2 along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ +#ifndef MEMPTRS_H +#define MEMPTRS_H + +namespace gambatte +{ + + enum OamDmaSrc { oam_dma_src_rom, + oam_dma_src_sram, + oam_dma_src_vram, + oam_dma_src_wram, + oam_dma_src_invalid, + oam_dma_src_off, }; + + class MemPtrs + { + public: + enum RamFlag + { + READ_EN = 1, + WRITE_EN = 2, + RTC_EN = 4 + }; + + MemPtrs(); + ~MemPtrs(); + void reset(unsigned rombanks, unsigned rambanks, unsigned wrambanks); + + const unsigned char * rmem(unsigned area) const + { + return rmem_[area]; + } + + unsigned char * wmem(unsigned area) const + { + return wmem_[area]; + } + + unsigned char * vramdata() const + { + return rambankdata_ - 0x4000; + } + + unsigned char * vramdataend() const + { + return rambankdata_; + } + + unsigned char * romdata() const + { + return memchunk_ + 0x4000; + } + + unsigned char * romdata(unsigned area) const + { + return romdata_[area]; + } + + unsigned char * romdataend() const + { + return rambankdata_ - 0x4000; + } + + unsigned char * wramdata(unsigned area) const + { + return wramdata_[area]; + } + + unsigned char * wramdataend() const + { + return wramdataend_; + } + + unsigned char * rambankdata() const + { + return rambankdata_; + } + + unsigned char * rambankdataend() const + { + return wramdata_[0]; + } + + const unsigned char * rdisabledRam() const + { + return rdisabledRamw(); + } + + const unsigned char * rsrambankptr() const + { + return rsrambankptr_; + } + + unsigned char * wsrambankptr() const + { + return wsrambankptr_; + } + + unsigned char * vrambankptr() const + { + return vrambankptr_; + } + + OamDmaSrc oamDmaSrc() const + { + return oamDmaSrc_; + } + + void setRombank0(unsigned bank); + void setRombank(unsigned bank); + void setRambank(unsigned ramFlags, unsigned rambank); + void setVrambank(unsigned bank) { vrambankptr_ = vramdata() + bank * 0x2000ul - 0x8000; } + void setWrambank(unsigned bank); + void setOamDmaSrc(OamDmaSrc oamDmaSrc); + + private: + unsigned char *romdata_[2]; + unsigned char *wramdata_[2]; + const unsigned char *rmem_[0x10]; + unsigned char *wmem_[0x10]; + unsigned char *vrambankptr_; + unsigned char *rsrambankptr_; + unsigned char *wsrambankptr_; + unsigned char *memchunk_; + unsigned char *rambankdata_; + unsigned char *wramdataend_; + OamDmaSrc oamDmaSrc_; + MemPtrs(const MemPtrs &); + MemPtrs & operator=(const MemPtrs &); + void disconnectOamDmaAreas(); + unsigned char * rdisabledRamw() const { return wramdataend_ ; } + unsigned char * wdisabledRam() const { return wramdataend_ + 0x2000; } + }; + + inline bool isCgb(const MemPtrs &memptrs) + { + return memptrs.wramdataend() - memptrs.wramdata(0) == 0x8000; + } + +} + +#endif diff --git a/src/games/gambatte/src/mem/rtc.cpp b/src/games/gambatte/src/mem/rtc.cpp new file mode 100644 index 0000000..765300b --- /dev/null +++ b/src/games/gambatte/src/mem/rtc.cpp @@ -0,0 +1,170 @@ +/*************************************************************************** + * Copyright (C) 2007 by Sindre Aamås * + * aamas@stud.ntnu.no * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License version 2 as * + * published by the Free Software Foundation. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License version 2 for more details. * + * * + * You should have received a copy of the GNU General Public License * + * version 2 along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ +#include "rtc.h" +#include "../savestate.h" + +namespace gambatte +{ + + Rtc::Rtc() + : activeData_(NULL), + activeSet_(NULL), + baseTime_(0), + haltTime_(0), + index_(5), + dataDh_(0), + dataDl_(0), + dataH_(0), + dataM_(0), + dataS_(0), + enabled_(false), + lastLatchData_(false) + { + } + + void Rtc::doLatch() + { + uint64_t tmp = ((dataDh_ & 0x40) ? haltTime_ : std::time(0)) - baseTime_; + + while (tmp > 0x1FF * 86400) + { + baseTime_ += 0x1FF * 86400; + tmp -= 0x1FF * 86400; + dataDh_ |= 0x80; + } + + dataDl_ = (tmp / 86400) & 0xFF; + dataDh_ &= 0xFE; + dataDh_ |= ((tmp / 86400) & 0x100) >> 8; + tmp %= 86400; + + dataH_ = tmp / 3600; + tmp %= 3600; + + dataM_ = tmp / 60; + tmp %= 60; + + dataS_ = tmp; + } + + void Rtc::doSwapActive() + { + if (!enabled_ || index_ > 4) + { + activeData_ = NULL; + activeSet_ = NULL; + } + else switch (index_) + { + case 0x00: + activeData_ = &dataS_; + activeSet_ = &Rtc::setS; + break; + case 0x01: + activeData_ = &dataM_; + activeSet_ = &Rtc::setM; + break; + case 0x02: + activeData_ = &dataH_; + activeSet_ = &Rtc::setH; + break; + case 0x03: + activeData_ = &dataDl_; + activeSet_ = &Rtc::setDl; + break; + case 0x04: + activeData_ = &dataDh_; + activeSet_ = &Rtc::setDh; + break; + } + } + + void Rtc::saveState(SaveState &state) const + { + state.rtc.baseTime = baseTime_; + state.rtc.haltTime = haltTime_; + state.rtc.dataDh = dataDh_; + state.rtc.dataDl = dataDl_; + state.rtc.dataH = dataH_; + state.rtc.dataM = dataM_; + state.rtc.dataS = dataS_; + state.rtc.lastLatchData = lastLatchData_; + } + + void Rtc::loadState(const SaveState &state) + { + baseTime_ = state.rtc.baseTime; + haltTime_ = state.rtc.haltTime; + dataDh_ = state.rtc.dataDh; + dataDl_ = state.rtc.dataDl; + dataH_ = state.rtc.dataH; + dataM_ = state.rtc.dataM; + dataS_ = state.rtc.dataS; + lastLatchData_ = state.rtc.lastLatchData; + + doSwapActive(); + } + + void Rtc::setDh(const unsigned new_dh) + { + const uint64_t unixtime = (dataDh_ & 0x40) ? haltTime_ : std::time(0); + const uint64_t old_highdays = ((unixtime - baseTime_) / 86400) & 0x100; + baseTime_ += old_highdays * 86400; + baseTime_ -= ((new_dh & 0x1) << 8) * 86400; + + if ((dataDh_ ^ new_dh) & 0x40) + { + if (new_dh & 0x40) + haltTime_ = std::time(0); + else + baseTime_ += std::time(0) - haltTime_; + } + } + + void Rtc::setDl(const unsigned new_lowdays) + { + const uint64_t unixtime = (dataDh_ & 0x40) ? haltTime_ : std::time(0); + const uint64_t old_lowdays = ((unixtime - baseTime_) / 86400) & 0xFF; + baseTime_ += old_lowdays * 86400; + baseTime_ -= new_lowdays * 86400; + } + + void Rtc::setH(const unsigned new_hours) + { + const uint64_t unixtime = (dataDh_ & 0x40) ? haltTime_ : std::time(0); + const uint64_t old_hours = ((unixtime - baseTime_) / 3600) % 24; + baseTime_ += old_hours * 3600; + baseTime_ -= new_hours * 3600; + } + + void Rtc::setM(const unsigned new_minutes) + { + const uint64_t unixtime = (dataDh_ & 0x40) ? haltTime_ : std::time(0); + const uint64_t old_minutes = ((unixtime - baseTime_) / 60) % 60; + baseTime_ += old_minutes * 60; + baseTime_ -= new_minutes * 60; + } + + void Rtc::setS(const unsigned new_seconds) + { + const uint64_t unixtime = (dataDh_ & 0x40) ? haltTime_ : std::time(0); + baseTime_ += (unixtime - baseTime_) % 60; + baseTime_ -= new_seconds; + } +} diff --git a/src/games/gambatte/src/mem/rtc.h b/src/games/gambatte/src/mem/rtc.h new file mode 100644 index 0000000..6dc8f57 --- /dev/null +++ b/src/games/gambatte/src/mem/rtc.h @@ -0,0 +1,104 @@ +/*************************************************************************** + * Copyright (C) 2007 by Sindre Aamås * + * aamas@stud.ntnu.no * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License version 2 as * + * published by the Free Software Foundation. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License version 2 for more details. * + * * + * You should have received a copy of the GNU General Public License * + * version 2 along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ +#ifndef RTC_H +#define RTC_H + +#include +#include + +namespace gambatte +{ + + struct SaveState; + + class Rtc + { + public: + Rtc(); + + const unsigned char* getActive() const + { + return activeData_; + } + + uint64_t& getBaseTime() + { + return baseTime_; + } + + void setBaseTime(const uint64_t baseTime) + { + baseTime_ = baseTime; + } + + void latch(const unsigned data) + { + if (!lastLatchData_ && data == 1) + doLatch(); + + lastLatchData_ = data; + } + + void saveState(SaveState &state) const; + void loadState(const SaveState &state); + + void set(const bool enabled, unsigned bank) + { + bank &= 0xF; + bank -= 8; + + this->enabled_ = enabled; + this->index_ = bank; + + doSwapActive(); + } + + void write(const unsigned data) + { + (this->*activeSet_)(data); + *activeData_ = data; + } + + private: + unsigned char *activeData_; + void (Rtc::*activeSet_)(unsigned); + uint64_t baseTime_; + uint64_t haltTime_; + unsigned char index_; + unsigned char dataDh_; + unsigned char dataDl_; + unsigned char dataH_; + unsigned char dataM_; + unsigned char dataS_; + bool enabled_; + bool lastLatchData_; + + void doLatch(); + void doSwapActive(); + void setDh(unsigned new_dh); + void setDl(unsigned new_lowdays); + void setH(unsigned new_hours); + void setM(unsigned new_minutes); + void setS(unsigned new_seconds); + + }; + +} + +#endif diff --git a/src/games/gambatte/src/minkeeper.h b/src/games/gambatte/src/minkeeper.h new file mode 100644 index 0000000..6f18f68 --- /dev/null +++ b/src/games/gambatte/src/minkeeper.h @@ -0,0 +1,157 @@ +/*************************************************************************** + * Copyright (C) 2009 by Sindre Aamås * + * aamas@stud.ntnu.no * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License version 2 as * + * published by the Free Software Foundation. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License version 2 for more details. * + * * + * You should have received a copy of the GNU General Public License * + * version 2 along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * +***************************************************************************/ +#ifndef MINKEEPER_H +#define MINKEEPER_H + +#include + +namespace MinKeeperUtil +{ +template struct CeiledLog2 { enum { RESULT = 1 + CeiledLog2<(n + 1) / 2>::RESULT }; }; +template<> struct CeiledLog2<1> { enum { RESULT = 0 }; }; + +template struct RoundedDiv2n { enum { RESULT = RoundedDiv2n<(v + 1) / 2, n - 1>::RESULT }; }; +template struct RoundedDiv2n { enum { RESULT = v }; }; + +template class T, int n> struct Sum { enum { RESULT = T::RESULT + Sum::RESULT }; }; +template class T> struct Sum { enum { RESULT = 0 }; }; +} + +// Keeps track of minimum value identified by id as values change. +// Higher ids prioritized (as min value) if values are equal. Can easily be reversed by swapping < for <=. +// Higher ids can be faster to change when the number of ids isn't a power of 2. +// Thus the ones that change more frequently should have higher ids if priority allows it. +template +class MinKeeper +{ + enum { LEVELS = MinKeeperUtil::CeiledLog2::RESULT }; + template struct Num { enum { RESULT = MinKeeperUtil::RoundedDiv2n::RESULT }; }; + template struct Sum { enum { RESULT = MinKeeperUtil::Sum::RESULT }; }; + + template + struct UpdateValue { + enum { P = Sum::RESULT + id }; + enum { C0 = Sum::RESULT + id * 2 }; + + static void updateValue(MinKeeper *const s) + { + // GCC 4.3 generates better code with the ternary operator on i386. + s->a[P] = (id * 2 + 1 == Num::RESULT || s->values[s->a[C0]] < s->values[s->a[C0 + 1]]) ? s->a[C0] : s->a[C0 + 1]; + + UpdateValue::updateValue(s); + } + }; + + template + struct UpdateValue + { + static void updateValue(MinKeeper *const s) + { + s->minValue_ = s->values[s->a[0]]; + } + }; + + template struct FillLut { + static void fillLut(MinKeeper *const s) + { + s->updateValueLut[id] = updateValue; + FillLut::fillLut(s); + } + }; + + template struct FillLut<-1,dummy> { + static void fillLut(MinKeeper *const) + { + } + }; + + + unsigned long values[ids]; + unsigned long minValue_; + void (*updateValueLut[Num::RESULT])(MinKeeper*const); + int a[Sum::RESULT]; + + template static void updateValue(MinKeeper *const s); + + public: + MinKeeper(unsigned long initValue = 0xFFFFFFFF); + + int min() const { return a[0]; } + unsigned long minValue() const { return minValue_; } + + template + void setValue(const unsigned long cnt) + { + values[id] = cnt; + updateValue(this); + } + + void setValue(const int id, const unsigned long cnt) + { + values[id] = cnt; + updateValueLut[id >> 1](this); + } + + unsigned long value(const int id) const { return values[id]; } +}; + +template +MinKeeper::MinKeeper(const unsigned long initValue) +{ + std::fill(values, values + ids, initValue); + + for (int i = 0; i < Num::RESULT; ++i) + { + a[Sum::RESULT + i] = (i * 2 + 1 == ids || values[i * 2] < values[i * 2 + 1]) ? i * 2 : i * 2 + 1; + } + + int n = Num::RESULT; + int off = Sum::RESULT; + + while (off) + { + const int pn = (n + 1) >> 1; + const int poff = off - pn; + + for (int i = 0; i < pn; ++i) + { + a[poff + i] = (i * 2 + 1 == n || + values[a[off + i * 2]] < values[a[off + i * 2 + 1]]) ? + a[off + i * 2] : a[off + i * 2 + 1]; + } + + off = poff; + n = pn; + } + + minValue_ = values[a[0]]; + + FillLut::RESULT-1,0>::fillLut(this); +} + +template +template +void MinKeeper::updateValue(MinKeeper *const s) +{ + s->a[Sum::RESULT + id] = (id * 2 + 1 == ids || s->values[id * 2] < s->values[id * 2 + 1]) ? id * 2 : id * 2 + 1; + + UpdateValue::updateValue(s); +} + +#endif diff --git a/src/games/gambatte/src/savestate.h b/src/games/gambatte/src/savestate.h new file mode 100644 index 0000000..0fe51b4 --- /dev/null +++ b/src/games/gambatte/src/savestate.h @@ -0,0 +1,229 @@ +// +// Copyright (C) 2008 by sinamas +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License version 2 as +// published by the Free Software Foundation. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License version 2 for more details. +// +// You should have received a copy of the GNU General Public License +// version 2 along with this program; if not, write to the +// Free Software Foundation, Inc., +// 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +// + +#ifndef SAVESTATE_H +#define SAVESTATE_H + +#include +#include + +namespace gambatte { + +class SaverList; + +struct SaveState { + template + class Ptr { + public: + Ptr() : ptr(0), size_(0) {} + T* get() const { return ptr; } + std::size_t size() const { return size_; } + void set(T *p, std::size_t size) { ptr = p; size_ = size; } + + friend class SaverList; + friend void setInitState(SaveState &, bool, bool, bool); + + private: + T *ptr; + std::size_t size_; + }; + + struct CPU { + unsigned long cycleCounter; + unsigned short pc; + unsigned short sp; + unsigned char a; + unsigned char b; + unsigned char c; + unsigned char d; + unsigned char e; + unsigned char f; + unsigned char h; + unsigned char l; + bool skip; + } cpu; + + struct Mem { + Ptr vram; + Ptr sram; + Ptr wram; + Ptr ioamhram; + unsigned long divLastUpdate; + unsigned long timaLastUpdate; + unsigned long tmatime; + unsigned long nextSerialtime; + unsigned long lastOamDmaUpdate; + unsigned long minIntTime; + unsigned long unhaltTime; + unsigned short rombank; + unsigned short dmaSource; + unsigned short dmaDestination; + unsigned char rambank; + unsigned char oamDmaPos; + unsigned char HuC3RAMflag; + unsigned char sachenOuterMask; + /* Sachen MMC1: count of CPU reads of 0x0100..0x01FF observed + * while the cartridge is in its boot-time locked state. + * Preserved so a savestate captured mid-bootstrap restores + * the cart to exactly the right point in its 48-reads-to- + * unlock sequence; without it, a mid-boot save would resume + * with count=0 and unlock 48 reads too late, breaking the + * bootstrap's verify pass. Unused (and zero) for every + * non-Sachen cartridge. */ + unsigned char sachenLockCount; +#ifdef HAVE_NETWORK + unsigned char serialize_value; + bool serialize_is_fastcgb; +#endif + bool IME; + bool halted; + bool enableRam; + bool rambankMode; + bool hdmaTransfer; + } mem; + + struct PPU { + Ptr bgpData; + Ptr objpData; + //SpriteMapper::OamReader + Ptr oamReaderBuf; + Ptr oamReaderSzbuf; + unsigned char dmgPalette[8 * 3]; + + unsigned long videoCycles; + unsigned long enableDisplayM0Time; + unsigned short lastM0Time; + unsigned short nextM0Irq; + unsigned short tileword; + unsigned short ntileword; + unsigned char spAttribList[10]; + unsigned char spByte0List[10]; + unsigned char spByte1List[10]; + unsigned char winYPos; + unsigned char xpos; + unsigned char endx; + unsigned char reg0; + unsigned char reg1; + unsigned char attrib; + unsigned char nattrib; + unsigned char state; + unsigned char nextSprite; + unsigned char currentSprite; + unsigned char lyc; + unsigned char m0lyc; + unsigned char oldWy; + unsigned char winDrawState; + unsigned char wscx; + bool weMaster; + bool pendingLcdstatIrq; + } ppu; + + struct SPU { + struct Duty { + unsigned long nextPosUpdate; + unsigned char nr3; + unsigned char pos; + bool high; + }; + + struct Env { + unsigned long counter; + unsigned char volume; + }; + + struct LCounter { + unsigned long counter; + unsigned short lengthCounter; + }; + + struct { + struct { + unsigned long counter; + unsigned short shadow; + unsigned char nr0; + bool negging; + } sweep; + Duty duty; + Env env; + LCounter lcounter; + unsigned char nr4; + bool master; + } ch1; + + struct { + Duty duty; + Env env; + LCounter lcounter; + unsigned char nr4; + bool master; + } ch2; + + struct { + Ptr waveRam; + LCounter lcounter; + unsigned long waveCounter; + unsigned long lastReadTime; + unsigned char nr3; + unsigned char nr4; + unsigned char wavePos; + unsigned char sampleBuf; + bool master; + } ch3; + + struct { + struct { + unsigned long counter; + unsigned short reg; + } lfsr; + Env env; + LCounter lcounter; + unsigned char nr4; + bool master; + } ch4; + + unsigned long cycleCounter; + } spu; + + struct RTC { + unsigned long baseTime; + unsigned long haltTime; + unsigned char dataDh; + unsigned char dataDl; + unsigned char dataH; + unsigned char dataM; + unsigned char dataS; + bool lastLatchData; + } rtc; + + struct HuC3 { + unsigned long baseTime; + unsigned long haltTime; + unsigned long dataTime; + unsigned long writingTime; + unsigned long irBaseCycle; + bool halted; + unsigned char shift; + unsigned char ramValue; + unsigned char modeflag; + bool irReceivingPulse; + } huc3; +}; + +} + +#endif diff --git a/src/games/gambatte/src/serial_io.h b/src/games/gambatte/src/serial_io.h new file mode 100644 index 0000000..ad94255 --- /dev/null +++ b/src/games/gambatte/src/serial_io.h @@ -0,0 +1,35 @@ +// +// Copyright (C) 2007 by sinamas +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License version 2 as +// published by the Free Software Foundation. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License version 2 for more details. +// +// You should have received a copy of the GNU General Public License +// version 2 along with this program; if not, write to the +// Free Software Foundation, Inc., +// 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +// + +#ifndef SERIAL_IO_H +#define SERIAL_IO_H + +namespace gambatte { + +class SerialIO +{ + public: + virtual ~SerialIO() {}; + + virtual bool check(unsigned char out, unsigned char& in, bool& fastCgb) = 0; + virtual unsigned char send(unsigned char data, bool fastCgb) = 0; +}; + +} + +#endif diff --git a/src/games/gambatte/src/sound.cpp b/src/games/gambatte/src/sound.cpp new file mode 100644 index 0000000..ecd6832 --- /dev/null +++ b/src/games/gambatte/src/sound.cpp @@ -0,0 +1,206 @@ +/*************************************************************************** + * Copyright (C) 2007 by Sindre Aamås * + * aamas@stud.ntnu.no * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License version 2 as * + * published by the Free Software Foundation. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License version 2 for more details. * + * * + * You should have received a copy of the GNU General Public License * + * version 2 along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ +#include "sound.h" +#include "savestate.h" +#include +#include + +/* + Frame Sequencer + + Step Length Ctr Vol Env Sweep + - - - - - - - - - - - - - - - - - - - - + 0 Clock - Clock +S 1 - Clock - + 2 Clock - - + 3 - - - + 4 Clock - Clock + 5 - - - + 6 Clock - - + 7 - - - + - - - - - - - - - - - - - - - - - - - - + Rate 256 Hz 64 Hz 128 Hz + +S) start step on sound power on. +*/ + +namespace gambatte +{ + + PSG::PSG() + : buffer_(0) + , bufferSize_(0) + , bufferPos_(0) + , lastUpdate_(0) + , soVol_(0) + , rsum_(0x8000) // initialize to 0x8000 to prevent borrows from high word, xor away later + , enabled_(false) + { + } + + void PSG::init(const bool cgb) + { + ch1_.init(cgb); + ch3_.init(cgb); + } + + void PSG::reset() + { + ch1_.reset(); + ch2_.reset(); + ch3_.reset(); + ch4_.reset(); + } + + void PSG::setStatePtrs(SaveState &state) + { + ch3_.setStatePtrs(state); + } + + void PSG::saveState(SaveState &state) + { + ch1_.saveState(state); + ch2_.saveState(state); + ch3_.saveState(state); + ch4_.saveState(state); + } + + void PSG::loadState(const SaveState &state) + { + ch1_.loadState(state); + ch2_.loadState(state); + ch3_.loadState(state); + ch4_.loadState(state); + + lastUpdate_ = state.cpu.cycleCounter; + setSoVolume(state.mem.ioamhram.get()[0x124]); + mapSo(state.mem.ioamhram.get()[0x125]); + enabled_ = state.mem.ioamhram.get()[0x126] >> 7 & 1; + } + + void PSG::accumulateChannels(const unsigned long cycles) + { + uint_least32_t *const buf = buffer_ + bufferPos_; + std::memset(buf, 0, cycles * sizeof(uint_least32_t)); + ch1_.update(buf, soVol_, cycles); + ch2_.update(buf, soVol_, cycles); + ch3_.update(buf, soVol_, cycles); + ch4_.update(buf, soVol_, cycles); + } + + void PSG::generateSamples(unsigned long const cycleCounter, bool const doubleSpeed) + { + unsigned long cycles = (cycleCounter - lastUpdate_) >> (1 + doubleSpeed); + + if (cycles + bufferPos_ > bufferSize_) + cycles = (bufferSize_ > bufferPos_) ? (bufferSize_ - bufferPos_) : 0; + + lastUpdate_ += cycles << (1 + doubleSpeed); + + if (cycles) + accumulateChannels(cycles); + + bufferPos_ += cycles; + } + + void PSG::resetCounter(unsigned long newCc, unsigned long oldCc, bool doubleSpeed) + { + generateSamples(oldCc, doubleSpeed); + lastUpdate_ = newCc - (oldCc - lastUpdate_); + } + + size_t PSG::fillBuffer() + { + uint_least32_t sum = rsum_; + uint_least32_t *b = buffer_; + unsigned n = bufferPos_; + + if (unsigned n2 = n >> 3) + { + n -= n2 << 3; + + do + { + sum += b[0]; + b[0] = sum ^ 0x8000; + sum += b[1]; + b[1] = sum ^ 0x8000; + sum += b[2]; + b[2] = sum ^ 0x8000; + sum += b[3]; + b[3] = sum ^ 0x8000; + sum += b[4]; + b[4] = sum ^ 0x8000; + sum += b[5]; + b[5] = sum ^ 0x8000; + sum += b[6]; + b[6] = sum ^ 0x8000; + sum += b[7]; + b[7] = sum ^ 0x8000; + + b += 8; + } while (--n2); + } + + while (n--) + { + sum += *b; + /* xor away the initial rsum value of 0x8000 (which prevents + * borrows from the high word) from the low word */ + *b++ = sum ^ 0x8000; + } + + rsum_ = sum; + + return bufferPos_; + } + +#ifdef WORDS_BIGENDIAN + static const unsigned long so1Mul = 0x00000001; + static const unsigned long so2Mul = 0x00010000; +#else + static const unsigned long so1Mul = 0x00010000; + static const unsigned long so2Mul = 0x00000001; +#endif + + void PSG::setSoVolume(const unsigned nr50) + { + soVol_ = (((nr50 & 0x7) + 1) * so1Mul + + ((nr50 >> 4 & 0x7) + 1) * so2Mul) * 64; + } + + void PSG::mapSo(const unsigned nr51) + { + const unsigned long tmp = nr51 * so1Mul + (nr51 >> 4) * so2Mul; + + ch1_.setSo((tmp & 0x00010001) * 0xFFFF); + ch2_.setSo((tmp >> 1 & 0x00010001) * 0xFFFF); + ch3_.setSo((tmp >> 2 & 0x00010001) * 0xFFFF); + ch4_.setSo((tmp >> 3 & 0x00010001) * 0xFFFF); + } + + unsigned PSG::getStatus() const + { + return ch1_.isActive() + | ch2_.isActive() << 1 + | ch3_.isActive() << 2 + | ch4_.isActive() << 3; + } + +} diff --git a/src/games/gambatte/src/sound.h b/src/games/gambatte/src/sound.h new file mode 100644 index 0000000..1046011 --- /dev/null +++ b/src/games/gambatte/src/sound.h @@ -0,0 +1,95 @@ +// +// Copyright (C) 2007 by sinamas +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License version 2 as +// published by the Free Software Foundation. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License version 2 for more details. +// +// You should have received a copy of the GNU General Public License +// version 2 along with this program; if not, write to the +// Free Software Foundation, Inc., +// 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +// + +#ifndef SOUND_H +#define SOUND_H + +#include +#include + +#include "sound/channel1.h" +#include "sound/channel2.h" +#include "sound/channel3.h" +#include "sound/channel4.h" + +namespace gambatte { + +class PSG { +public: + PSG(); + void init(bool cgb); + void reset(); + void setStatePtrs(SaveState &state); + void saveState(SaveState &state); + void loadState(SaveState const &state); + + void generateSamples(unsigned long cycleCounter, bool doubleSpeed); + void resetCounter(unsigned long newCc, unsigned long oldCc, bool doubleSpeed); + std::size_t fillBuffer(); + void setBuffer(uint_least32_t *buf, std::size_t size) { buffer_ = buf; bufferSize_ = size; bufferPos_ = 0; } + + bool isEnabled() const { return enabled_; } + void setEnabled(bool value) { enabled_ = value; } + + void setNr10(unsigned data) { ch1_.setNr0(data); } + void setNr11(unsigned data) { ch1_.setNr1(data); } + void setNr12(unsigned data) { ch1_.setNr2(data); } + void setNr13(unsigned data) { ch1_.setNr3(data); } + void setNr14(unsigned data) { ch1_.setNr4(data); } + + void setNr21(unsigned data) { ch2_.setNr1(data); } + void setNr22(unsigned data) { ch2_.setNr2(data); } + void setNr23(unsigned data) { ch2_.setNr3(data); } + void setNr24(unsigned data) { ch2_.setNr4(data); } + + void setNr30(unsigned data) { ch3_.setNr0(data); } + void setNr31(unsigned data) { ch3_.setNr1(data); } + void setNr32(unsigned data) { ch3_.setNr2(data); } + void setNr33(unsigned data) { ch3_.setNr3(data); } + void setNr34(unsigned data) { ch3_.setNr4(data); } + unsigned waveRamRead(unsigned index) const { return ch3_.waveRamRead(index); } + void waveRamWrite(unsigned index, unsigned data) { ch3_.waveRamWrite(index, data); } + + void setNr41(unsigned data) { ch4_.setNr1(data); } + void setNr42(unsigned data) { ch4_.setNr2(data); } + void setNr43(unsigned data) { ch4_.setNr3(data); } + void setNr44(unsigned data) { ch4_.setNr4(data); } + + void setSoVolume(unsigned nr50); + void mapSo(unsigned nr51); + unsigned getStatus() const; + +private: + Channel1 ch1_; + Channel2 ch2_; + Channel3 ch3_; + Channel4 ch4_; + uint_least32_t *buffer_; + std::size_t bufferSize_; + std::size_t bufferPos_; + unsigned long lastUpdate_; + unsigned long soVol_; + uint_least32_t rsum_; + bool enabled_; + + void accumulateChannels(unsigned long cycles); +}; + +} + +#endif diff --git a/src/games/gambatte/src/sound/channel1.cpp b/src/games/gambatte/src/sound/channel1.cpp new file mode 100644 index 0000000..f0970b2 --- /dev/null +++ b/src/games/gambatte/src/sound/channel1.cpp @@ -0,0 +1,262 @@ +// +// Copyright (C) 2007 by sinamas +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License version 2 as +// published by the Free Software Foundation. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License version 2 for more details. +// +// You should have received a copy of the GNU General Public License +// version 2 along with this program; if not, write to the +// Free Software Foundation, Inc., +// 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +// + +#include "channel1.h" +#include "../savestate.h" +#include + +namespace gambatte { + +Channel1::SweepUnit::SweepUnit(MasterDisabler &disabler, DutyUnit &dutyUnit) +: disableMaster_(disabler) +, dutyUnit_(dutyUnit) +, shadow_(0) +, nr0_(0) +, negging_(false) +, cgb_(false) +{ +} + +unsigned Channel1::SweepUnit::calcFreq() { + unsigned freq = shadow_ >> (nr0_ & 0x07); + + if (nr0_ & 0x08) { + freq = shadow_ - freq; + negging_ = true; + } else + freq = shadow_ + freq; + + if (freq & 2048) + disableMaster_(); + + return freq; +} + +void Channel1::SweepUnit::event() { + unsigned long const period = nr0_ >> 4 & 0x07; + + if (period) { + unsigned const freq = calcFreq(); + + if (!(freq & 2048) && (nr0_ & 0x07)) { + shadow_ = freq; + dutyUnit_.setFreq(freq, counter_); + calcFreq(); + } + + counter_ += period << 14; + } else + counter_ += 8ul << 14; +} + +void Channel1::SweepUnit::nr0Change(unsigned newNr0) { + if (negging_ && !(newNr0 & 0x08)) + disableMaster_(); + + nr0_ = newNr0; +} + +void Channel1::SweepUnit::nr4Init(unsigned long const cc) { + negging_ = false; + shadow_ = dutyUnit_.freq(); + + unsigned const period = nr0_ >> 4 & 0x07; + unsigned const shift = nr0_ & 0x07; + + if (period | shift) + counter_ = ((((cc + 2 + cgb_ * 2) >> 14) + (period ? period : 8)) << 14) + 2; + else + counter_ = counter_disabled; + + if (shift) + calcFreq(); +} + +void Channel1::SweepUnit::reset() { + counter_ = counter_disabled; +} + +void Channel1::SweepUnit::saveState(SaveState &state) const { + state.spu.ch1.sweep.counter = counter_; + state.spu.ch1.sweep.shadow = shadow_; + state.spu.ch1.sweep.nr0 = nr0_; + state.spu.ch1.sweep.negging = negging_; +} + +void Channel1::SweepUnit::loadState(SaveState const &state) { + counter_ = std::max(state.spu.ch1.sweep.counter, state.spu.cycleCounter); + shadow_ = state.spu.ch1.sweep.shadow; + nr0_ = state.spu.ch1.sweep.nr0; + negging_ = state.spu.ch1.sweep.negging; +} + +Channel1::Channel1() +: staticOutputTest_(*this, dutyUnit_) +, disableMaster_(master_, dutyUnit_) +, lengthCounter_(disableMaster_, 0x3F) +, envelopeUnit_(staticOutputTest_) +, sweepUnit_(disableMaster_, dutyUnit_) +, nextEventUnit_(0) +, cycleCounter_(0) +, soMask_(0) +, prevOut_(0) +, nr4_(0) +, master_(false) +{ + setEvent(); +} + +void Channel1::setEvent() { + nextEventUnit_ = &sweepUnit_; + if (envelopeUnit_.counter() < nextEventUnit_->counter()) + nextEventUnit_ = &envelopeUnit_; + if (lengthCounter_.counter() < nextEventUnit_->counter()) + nextEventUnit_ = &lengthCounter_; +} + +void Channel1::setNr0(unsigned data) { + sweepUnit_.nr0Change(data); + setEvent(); +} + +void Channel1::setNr1(unsigned data) { + lengthCounter_.nr1Change(data, nr4_, cycleCounter_); + dutyUnit_.nr1Change(data, cycleCounter_); + setEvent(); +} + +void Channel1::setNr2(unsigned data) { + if (envelopeUnit_.nr2Change(data)) + disableMaster_(); + else + staticOutputTest_(cycleCounter_); + + setEvent(); +} + +void Channel1::setNr3(unsigned data) { + dutyUnit_.nr3Change(data, cycleCounter_); + setEvent(); +} + +void Channel1::setNr4(unsigned const data) { + lengthCounter_.nr4Change(nr4_, data, cycleCounter_); + nr4_ = data; + dutyUnit_.nr4Change(data, cycleCounter_); + + if (data & 0x80) { // init-bit + nr4_ &= 0x7F; + master_ = !envelopeUnit_.nr4Init(cycleCounter_); + sweepUnit_.nr4Init(cycleCounter_); + staticOutputTest_(cycleCounter_); + } + + setEvent(); +} + +void Channel1::setSo(unsigned long soMask) { + soMask_ = soMask; + staticOutputTest_(cycleCounter_); + setEvent(); +} + +void Channel1::reset() { + // cycleCounter >> 12 & 7 represents the frame sequencer position. + cycleCounter_ &= 0xFFF; + cycleCounter_ += ~(cycleCounter_ + 2) << 1 & 0x1000; + + dutyUnit_.reset(); + envelopeUnit_.reset(); + sweepUnit_.reset(); + setEvent(); +} + +void Channel1::init(bool cgb) { + sweepUnit_.init(cgb); +} + +void Channel1::saveState(SaveState &state) { + sweepUnit_.saveState(state); + dutyUnit_.saveState(state.spu.ch1.duty, cycleCounter_); + envelopeUnit_.saveState(state.spu.ch1.env); + lengthCounter_.saveState(state.spu.ch1.lcounter); + + state.spu.cycleCounter = cycleCounter_; + state.spu.ch1.nr4 = nr4_; + state.spu.ch1.master = master_; +} + +void Channel1::loadState(SaveState const &state) { + sweepUnit_.loadState(state); + dutyUnit_.loadState(state.spu.ch1.duty, state.mem.ioamhram.get()[0x111], + state.spu.ch1.nr4, state.spu.cycleCounter); + envelopeUnit_.loadState(state.spu.ch1.env, state.mem.ioamhram.get()[0x112], + state.spu.cycleCounter); + lengthCounter_.loadState(state.spu.ch1.lcounter, state.spu.cycleCounter); + + cycleCounter_ = state.spu.cycleCounter; + nr4_ = state.spu.ch1.nr4; + master_ = state.spu.ch1.master; +} + +void Channel1::update(uint_least32_t *buf, unsigned long const soBaseVol, unsigned long cycles) { + unsigned long const outBase = envelopeUnit_.dacIsOn() ? soBaseVol & soMask_ : 0; + unsigned long const outLow = outBase * (0 - 15ul); + unsigned long const endCycles = cycleCounter_ + cycles; + + for (;;) { + unsigned long const outHigh = master_ + ? outBase * (envelopeUnit_.getVolume() * 2 - 15ul) + : outLow; + unsigned long const nextMajorEvent = std::min(nextEventUnit_->counter(), endCycles); + unsigned long out = dutyUnit_.isHighState() ? outHigh : outLow; + + while (dutyUnit_.counter() <= nextMajorEvent) { + *buf = out - prevOut_; + prevOut_ = out; + buf += dutyUnit_.counter() - cycleCounter_; + cycleCounter_ = dutyUnit_.counter(); + + dutyUnit_.event(); + out = dutyUnit_.isHighState() ? outHigh : outLow; + } + + if (cycleCounter_ < nextMajorEvent) { + *buf = out - prevOut_; + prevOut_ = out; + buf += nextMajorEvent - cycleCounter_; + cycleCounter_ = nextMajorEvent; + } + + if (nextEventUnit_->counter() == nextMajorEvent) { + nextEventUnit_->event(); + setEvent(); + } else + break; + } + + if (cycleCounter_ >= SoundUnit::counter_max) { + dutyUnit_.resetCounters(cycleCounter_); + lengthCounter_.resetCounters(cycleCounter_); + envelopeUnit_.resetCounters(cycleCounter_); + sweepUnit_.resetCounters(cycleCounter_); + cycleCounter_ -= SoundUnit::counter_max; + } +} + +} diff --git a/src/games/gambatte/src/sound/channel1.h b/src/games/gambatte/src/sound/channel1.h new file mode 100644 index 0000000..bb54b13 --- /dev/null +++ b/src/games/gambatte/src/sound/channel1.h @@ -0,0 +1,92 @@ +// +// Copyright (C) 2007 by sinamas +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License version 2 as +// published by the Free Software Foundation. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License version 2 for more details. +// +// You should have received a copy of the GNU General Public License +// version 2 along with this program; if not, write to the +// Free Software Foundation, Inc., +// 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +// + +#ifndef SOUND_CHANNEL1_H +#define SOUND_CHANNEL1_H + +#include "duty_unit.h" +#include "envelope_unit.h" +#include "gbint.h" +#include "length_counter.h" +#include "master_disabler.h" +#include "static_output_tester.h" + +namespace gambatte { + +struct SaveState; + +class Channel1 { +public: + Channel1(); + void setNr0(unsigned data); + void setNr1(unsigned data); + void setNr2(unsigned data); + void setNr3(unsigned data); + void setNr4(unsigned data); + void setSo(unsigned long soMask); + bool isActive() const { return master_; } + void update(uint_least32_t *buf, unsigned long soBaseVol, unsigned long cycles); + void reset(); + void init(bool cgb); + void saveState(SaveState &state); + void loadState(SaveState const &state); + +private: + class SweepUnit : public SoundUnit { + public: + SweepUnit(MasterDisabler &disabler, DutyUnit &dutyUnit); + virtual void event(); + void nr0Change(unsigned newNr0); + void nr4Init(unsigned long cycleCounter); + void reset(); + void init(bool cgb) { cgb_ = cgb; } + void saveState(SaveState &state) const; + void loadState(SaveState const &state); + + private: + MasterDisabler &disableMaster_; + DutyUnit &dutyUnit_; + unsigned short shadow_; + unsigned char nr0_; + bool negging_; + bool cgb_; + + unsigned calcFreq(); + }; + + friend class StaticOutputTester; + + StaticOutputTester staticOutputTest_; + DutyMasterDisabler disableMaster_; + LengthCounter lengthCounter_; + DutyUnit dutyUnit_; + EnvelopeUnit envelopeUnit_; + SweepUnit sweepUnit_; + SoundUnit *nextEventUnit_; + unsigned long cycleCounter_; + unsigned long soMask_; + unsigned long prevOut_; + unsigned char nr4_; + bool master_; + + void setEvent(); +}; + +} + +#endif diff --git a/src/games/gambatte/src/sound/channel2.cpp b/src/games/gambatte/src/sound/channel2.cpp new file mode 100644 index 0000000..f894e89 --- /dev/null +++ b/src/games/gambatte/src/sound/channel2.cpp @@ -0,0 +1,160 @@ +// +// Copyright (C) 2007 by sinamas +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License version 2 as +// published by the Free Software Foundation. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License version 2 for more details. +// +// You should have received a copy of the GNU General Public License +// version 2 along with this program; if not, write to the +// Free Software Foundation, Inc., +// 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +// + +#include "channel2.h" +#include "../savestate.h" +#include + +namespace gambatte { + +Channel2::Channel2() +: staticOutputTest_(*this, dutyUnit_) +, disableMaster_(master_, dutyUnit_) +, lengthCounter_(disableMaster_, 0x3F) +, envelopeUnit_(staticOutputTest_) +, cycleCounter_(0) +, soMask_(0) +, prevOut_(0) +, nr4_(0) +, master_(false) +{ + setEvent(); +} + +void Channel2::setEvent() { + nextEventUnit = &envelopeUnit_; + if (lengthCounter_.counter() < nextEventUnit->counter()) + nextEventUnit = &lengthCounter_; +} + +void Channel2::setNr1(unsigned data) { + lengthCounter_.nr1Change(data, nr4_, cycleCounter_); + dutyUnit_.nr1Change(data, cycleCounter_); + setEvent(); +} + +void Channel2::setNr2(unsigned data) { + if (envelopeUnit_.nr2Change(data)) + disableMaster_(); + else + staticOutputTest_(cycleCounter_); + + setEvent(); +} + +void Channel2::setNr3(unsigned data) { + dutyUnit_.nr3Change(data, cycleCounter_); + setEvent(); +} + +void Channel2::setNr4(unsigned const data) { + lengthCounter_.nr4Change(nr4_, data, cycleCounter_); + nr4_ = data; + + if (data & 0x80) { // init-bit + nr4_ &= 0x7F; + master_ = !envelopeUnit_.nr4Init(cycleCounter_); + staticOutputTest_(cycleCounter_); + } + + dutyUnit_.nr4Change(data, cycleCounter_); + setEvent(); +} + +void Channel2::setSo(unsigned long soMask) { + soMask_ = soMask; + staticOutputTest_(cycleCounter_); + setEvent(); +} + +void Channel2::reset() { + // cycleCounter >> 12 & 7 represents the frame sequencer position. + cycleCounter_ &= 0xFFF; + cycleCounter_ += ~(cycleCounter_ + 2) << 1 & 0x1000; + + dutyUnit_.reset(); + envelopeUnit_.reset(); + setEvent(); +} + +void Channel2::saveState(SaveState &state) { + dutyUnit_.saveState(state.spu.ch2.duty, cycleCounter_); + envelopeUnit_.saveState(state.spu.ch2.env); + lengthCounter_.saveState(state.spu.ch2.lcounter); + + state.spu.ch2.nr4 = nr4_; + state.spu.ch2.master = master_; +} + +void Channel2::loadState(SaveState const &state) { + dutyUnit_.loadState(state.spu.ch2.duty, state.mem.ioamhram.get()[0x116], + state.spu.ch2.nr4, state.spu.cycleCounter); + envelopeUnit_.loadState(state.spu.ch2.env, state.mem.ioamhram.get()[0x117], + state.spu.cycleCounter); + lengthCounter_.loadState(state.spu.ch2.lcounter, state.spu.cycleCounter); + + cycleCounter_ = state.spu.cycleCounter; + nr4_ = state.spu.ch2.nr4; + master_ = state.spu.ch2.master; +} + +void Channel2::update(uint_least32_t *buf, unsigned long const soBaseVol, unsigned long cycles) { + unsigned long const outBase = envelopeUnit_.dacIsOn() ? soBaseVol & soMask_ : 0; + unsigned long const outLow = outBase * (0 - 15ul); + unsigned long const endCycles = cycleCounter_ + cycles; + + for (;;) { + unsigned long const outHigh = master_ + ? outBase * (envelopeUnit_.getVolume() * 2 - 15ul) + : outLow; + unsigned long const nextMajorEvent = std::min(nextEventUnit->counter(), endCycles); + unsigned long out = dutyUnit_.isHighState() ? outHigh : outLow; + + while (dutyUnit_.counter() <= nextMajorEvent) { + *buf += out - prevOut_; + prevOut_ = out; + buf += dutyUnit_.counter() - cycleCounter_; + cycleCounter_ = dutyUnit_.counter(); + + dutyUnit_.event(); + out = dutyUnit_.isHighState() ? outHigh : outLow; + } + + if (cycleCounter_ < nextMajorEvent) { + *buf += out - prevOut_; + prevOut_ = out; + buf += nextMajorEvent - cycleCounter_; + cycleCounter_ = nextMajorEvent; + } + + if (nextEventUnit->counter() == nextMajorEvent) { + nextEventUnit->event(); + setEvent(); + } else + break; + } + + if (cycleCounter_ >= SoundUnit::counter_max) { + dutyUnit_.resetCounters(cycleCounter_); + lengthCounter_.resetCounters(cycleCounter_); + envelopeUnit_.resetCounters(cycleCounter_); + cycleCounter_ -= SoundUnit::counter_max; + } +} + +} diff --git a/src/games/gambatte/src/sound/channel2.h b/src/games/gambatte/src/sound/channel2.h new file mode 100644 index 0000000..49503a7 --- /dev/null +++ b/src/games/gambatte/src/sound/channel2.h @@ -0,0 +1,66 @@ +// +// Copyright (C) 2007 by sinamas +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License version 2 as +// published by the Free Software Foundation. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License version 2 for more details. +// +// You should have received a copy of the GNU General Public License +// version 2 along with this program; if not, write to the +// Free Software Foundation, Inc., +// 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +// + +#ifndef SOUND_CHANNEL2_H +#define SOUND_CHANNEL2_H + +#include "duty_unit.h" +#include "envelope_unit.h" +#include "gbint.h" +#include "length_counter.h" +#include "static_output_tester.h" + +namespace gambatte { + +struct SaveState; + +class Channel2 { +public: + Channel2(); + void setNr1(unsigned data); + void setNr2(unsigned data); + void setNr3(unsigned data); + void setNr4(unsigned data); + void setSo(unsigned long soMask); + bool isActive() const { return master_; } + void update(uint_least32_t *buf, unsigned long soBaseVol, unsigned long cycles); + void reset(); + void saveState(SaveState &state); + void loadState(SaveState const &state); + +private: + friend class StaticOutputTester; + + StaticOutputTester staticOutputTest_; + DutyMasterDisabler disableMaster_; + LengthCounter lengthCounter_; + DutyUnit dutyUnit_; + EnvelopeUnit envelopeUnit_; + SoundUnit *nextEventUnit; + unsigned long cycleCounter_; + unsigned long soMask_; + unsigned long prevOut_; + unsigned char nr4_; + bool master_; + + void setEvent(); +}; + +} + +#endif diff --git a/src/games/gambatte/src/sound/channel3.cpp b/src/games/gambatte/src/sound/channel3.cpp new file mode 100644 index 0000000..4797482 --- /dev/null +++ b/src/games/gambatte/src/sound/channel3.cpp @@ -0,0 +1,211 @@ +// +// Copyright (C) 2007 by sinamas +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License version 2 as +// published by the Free Software Foundation. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License version 2 for more details. +// +// You should have received a copy of the GNU General Public License +// version 2 along with this program; if not, write to the +// Free Software Foundation, Inc., +// 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +// + +#include "channel3.h" +#include "../savestate.h" +#include +#include + +static inline unsigned toPeriod(unsigned nr3, unsigned nr4) { + return 0x800 - ((nr4 << 8 & 0x700) | nr3); +} + +namespace gambatte { + +Channel3::Channel3() +: disableMaster_(master_, waveCounter_) +, lengthCounter_(disableMaster_, 0xFF) +, cycleCounter_(0) +, soMask_(0) +, prevOut_(0) +, waveCounter_(SoundUnit::counter_disabled) +, lastReadTime_(0) +, nr0_(0) +, nr3_(0) +, nr4_(0) +, wavePos_(0) +, rshift_(4) +, sampleBuf_(0) +, master_(false) +, cgb_(false) +{ +} + +void Channel3::setNr0(unsigned data) { + nr0_ = data & 0x80; + + if (!(data & 0x80)) + disableMaster_(); +} + +void Channel3::setNr2(unsigned data) { + rshift_ = (data >> 5 & 3U) - 1; + if (rshift_ > 3) + rshift_ = 4; +} + +void Channel3::setNr4(unsigned const data) { + lengthCounter_.nr4Change(nr4_, data, cycleCounter_); + nr4_ = data & 0x7F; + + if (data & nr0_/* & 0x80*/) { + if (!cgb_ && waveCounter_ == cycleCounter_ + 1) { + unsigned const pos = ((wavePos_ + 1) & 0x1F) >> 1; + + if (pos < 4) + waveRam_[0] = waveRam_[pos]; + else + std::memcpy(waveRam_, waveRam_ + (pos & ~3), 4); + } + + master_ = true; + wavePos_ = 0; + lastReadTime_ = waveCounter_ = cycleCounter_ + toPeriod(nr3_, data) + 3; + } +} + +void Channel3::setSo(unsigned long soMask) { + soMask_ = soMask; +} + +void Channel3::reset() { + // cycleCounter >> 12 & 7 represents the frame sequencer position. + cycleCounter_ &= 0xFFF; + cycleCounter_ += ~(cycleCounter_ + 2) << 1 & 0x1000; + + sampleBuf_ = 0; +} + +void Channel3::init(bool cgb) { + cgb_ = cgb; +} + +void Channel3::setStatePtrs(SaveState &state) { + state.spu.ch3.waveRam.set(waveRam_, sizeof waveRam_); +} + +void Channel3::saveState(SaveState &state) const { + lengthCounter_.saveState(state.spu.ch3.lcounter); + + state.spu.ch3.waveCounter = waveCounter_; + state.spu.ch3.lastReadTime = lastReadTime_; + state.spu.ch3.nr3 = nr3_; + state.spu.ch3.nr4 = nr4_; + state.spu.ch3.wavePos = wavePos_; + state.spu.ch3.sampleBuf = sampleBuf_; + state.spu.ch3.master = master_; +} + +void Channel3::loadState(SaveState const &state) { + lengthCounter_.loadState(state.spu.ch3.lcounter, state.spu.cycleCounter); + + cycleCounter_ = state.spu.cycleCounter; + waveCounter_ = std::max(state.spu.ch3.waveCounter, state.spu.cycleCounter); + lastReadTime_ = state.spu.ch3.lastReadTime; + nr3_ = state.spu.ch3.nr3; + nr4_ = state.spu.ch3.nr4; + wavePos_ = state.spu.ch3.wavePos & 0x1F; + sampleBuf_ = state.spu.ch3.sampleBuf; + master_ = state.spu.ch3.master; + + nr0_ = state.mem.ioamhram.get()[0x11A] & 0x80; + setNr2(state.mem.ioamhram.get()[0x11C]); +} + +void Channel3::updateWaveCounter(unsigned long const cc) { + if (cc >= waveCounter_) { + unsigned const period = toPeriod(nr3_, nr4_); + unsigned long const periods = (cc - waveCounter_) / period; + + lastReadTime_ = waveCounter_ + periods * period; + waveCounter_ = lastReadTime_ + period; + + wavePos_ += periods + 1; + wavePos_ &= 0x1F; + + sampleBuf_ = waveRam_[wavePos_ >> 1]; + } +} + +void Channel3::update(uint_least32_t *buf, unsigned long const soBaseVol, unsigned long cycles) { + unsigned long const outBase = nr0_/* & 0x80*/ ? soBaseVol & soMask_ : 0; + + if (outBase && rshift_ != 4) { + unsigned long const endCycles = cycleCounter_ + cycles; + + for (;;) { + unsigned long const nextMajorEvent = + std::min(lengthCounter_.counter(), endCycles); + unsigned long out = master_ + ? ((sampleBuf_ >> (~wavePos_ << 2 & 4) & 0xF) >> rshift_) * 2 - 15ul + : 0 - 15ul; + out *= outBase; + + while (waveCounter_ <= nextMajorEvent) { + *buf += out - prevOut_; + prevOut_ = out; + buf += waveCounter_ - cycleCounter_; + cycleCounter_ = waveCounter_; + + lastReadTime_ = waveCounter_; + waveCounter_ += toPeriod(nr3_, nr4_); + ++wavePos_; + wavePos_ &= 0x1F; + sampleBuf_ = waveRam_[wavePos_ >> 1]; + out = ((sampleBuf_ >> (~wavePos_ << 2 & 4) & 0xF) >> rshift_) * 2 - 15ul; + out *= outBase; + } + + if (cycleCounter_ < nextMajorEvent) { + *buf += out - prevOut_; + prevOut_ = out; + buf += nextMajorEvent - cycleCounter_; + cycleCounter_ = nextMajorEvent; + } + + if (lengthCounter_.counter() == nextMajorEvent) { + lengthCounter_.event(); + } else + break; + } + } else { + unsigned long const out = outBase * (0 - 15ul); + *buf += out - prevOut_; + prevOut_ = out; + cycleCounter_ += cycles; + + while (lengthCounter_.counter() <= cycleCounter_) { + updateWaveCounter(lengthCounter_.counter()); + lengthCounter_.event(); + } + + updateWaveCounter(cycleCounter_); + } + + if (cycleCounter_ >= SoundUnit::counter_max) { + lengthCounter_.resetCounters(cycleCounter_); + + if (waveCounter_ != SoundUnit::counter_disabled) + waveCounter_ -= SoundUnit::counter_max; + + lastReadTime_ -= SoundUnit::counter_max; + cycleCounter_ -= SoundUnit::counter_max; + } +} + +} diff --git a/src/games/gambatte/src/sound/channel3.h b/src/games/gambatte/src/sound/channel3.h new file mode 100644 index 0000000..d6f444f --- /dev/null +++ b/src/games/gambatte/src/sound/channel3.h @@ -0,0 +1,105 @@ +// +// Copyright (C) 2007 by sinamas +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License version 2 as +// published by the Free Software Foundation. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License version 2 for more details. +// +// You should have received a copy of the GNU General Public License +// version 2 along with this program; if not, write to the +// Free Software Foundation, Inc., +// 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +// + +#ifndef SOUND_CHANNEL3_H +#define SOUND_CHANNEL3_H + +#include "gbint.h" +#include "length_counter.h" +#include "master_disabler.h" + +namespace gambatte { + +struct SaveState; + +class Channel3 { +public: + Channel3(); + bool isActive() const { return master_; } + void reset(); + void init(bool cgb); + void setStatePtrs(SaveState &state); + void saveState(SaveState &state) const; + void loadState(const SaveState &state); + void setNr0(unsigned data); + void setNr1(unsigned data) { lengthCounter_.nr1Change(data, nr4_, cycleCounter_); } + void setNr2(unsigned data); + void setNr3(unsigned data) { nr3_ = data; } + void setNr4(unsigned data); + void setSo(unsigned long soMask); + void update(uint_least32_t *buf, unsigned long soBaseVol, unsigned long cycles); + + unsigned waveRamRead(unsigned index) const { + if (master_) { + if (!cgb_ && cycleCounter_ != lastReadTime_) + return 0xFF; + + index = wavePos_ >> 1; + } + + return waveRam_[index]; + } + + void waveRamWrite(unsigned index, unsigned data) { + if (master_) { + if (!cgb_ && cycleCounter_ != lastReadTime_) + return; + + index = wavePos_ >> 1; + } + + waveRam_[index] = data; + } + +private: + class Ch3MasterDisabler : public MasterDisabler { + public: + Ch3MasterDisabler(bool &m, unsigned long &wC) : MasterDisabler(m), waveCounter_(wC) {} + + virtual void operator()() { + MasterDisabler::operator()(); + waveCounter_ = SoundUnit::counter_disabled; + } + + private: + unsigned long &waveCounter_; + }; + + unsigned char waveRam_[0x10]; + Ch3MasterDisabler disableMaster_; + LengthCounter lengthCounter_; + unsigned long cycleCounter_; + unsigned long soMask_; + unsigned long prevOut_; + unsigned long waveCounter_; + unsigned long lastReadTime_; + unsigned char nr0_; + unsigned char nr3_; + unsigned char nr4_; + unsigned char wavePos_; + unsigned char rshift_; + unsigned char sampleBuf_; + bool master_; + bool cgb_; + + void updateWaveCounter(unsigned long cc); +}; + +} + +#endif diff --git a/src/games/gambatte/src/sound/channel4.cpp b/src/games/gambatte/src/sound/channel4.cpp new file mode 100644 index 0000000..0fb15ac --- /dev/null +++ b/src/games/gambatte/src/sound/channel4.cpp @@ -0,0 +1,261 @@ +// +// Copyright (C) 2007 by sinamas +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License version 2 as +// published by the Free Software Foundation. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License version 2 for more details. +// +// You should have received a copy of the GNU General Public License +// version 2 along with this program; if not, write to the +// Free Software Foundation, Inc., +// 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +// + +#include "channel4.h" +#include "../savestate.h" +#include + +static unsigned long toPeriod(unsigned const nr3) { + unsigned s = (nr3 >> 4) + 3; + unsigned r = nr3 & 7; + + if (!r) { + r = 1; + --s; + } + + return r << s; +} + +namespace gambatte { + +Channel4::Lfsr::Lfsr() +: backupCounter_(counter_disabled) +, reg_(0x7FFF) +, nr3_(0) +, master_(false) +{ +} + +void Channel4::Lfsr::updateBackupCounter(unsigned long const cc) { + if (backupCounter_ <= cc) { + unsigned long const period = toPeriod(nr3_); + unsigned long periods = (cc - backupCounter_) / period + 1; + backupCounter_ += periods * period; + + if (master_ && nr3_ < 0xE0) { + if (nr3_ & 8) { + while (periods > 6) { + unsigned const xored = (reg_ << 1 ^ reg_) & 0x7E; + reg_ = (reg_ >> 6 & ~0x7E) | xored | xored << 8; + periods -= 6; + } + + unsigned const xored = ((reg_ ^ reg_ >> 1) << (7 - periods)) & 0x7F; + reg_ = (reg_ >> periods & ~(0x80 - (0x80 >> periods))) | xored | xored << 8; + } else { + while (periods > 15) { + reg_ = reg_ ^ reg_ >> 1; + periods -= 15; + } + + reg_ = reg_ >> periods | (((reg_ ^ reg_ >> 1) << (15 - periods)) & 0x7FFF); + } + } + } +} + +void Channel4::Lfsr::reviveCounter(unsigned long cc) { + updateBackupCounter(cc); + counter_ = backupCounter_; +} + +inline void Channel4::Lfsr::event() { + if (nr3_ < 0xE0) { + unsigned const shifted = reg_ >> 1; + unsigned const xored = (reg_ ^ shifted) & 1; + reg_ = shifted | xored << 14; + + if (nr3_ & 8) + reg_ = (reg_ & ~0x40) | xored << 6; + } + + counter_ += toPeriod(nr3_); + backupCounter_ = counter_; +} + +void Channel4::Lfsr::nr3Change(unsigned newNr3, unsigned long cc) { + updateBackupCounter(cc); + nr3_ = newNr3; + counter_ = cc; +} + +void Channel4::Lfsr::nr4Init(unsigned long cc) { + disableMaster(); + updateBackupCounter(cc); + master_ = true; + backupCounter_ += 4; + counter_ = backupCounter_; +} + +void Channel4::Lfsr::reset(unsigned long cc) { + nr3_ = 0; + disableMaster(); + backupCounter_ = cc + toPeriod(nr3_); +} + +void Channel4::Lfsr::resetCounters(unsigned long oldCc) { + updateBackupCounter(oldCc); + backupCounter_ -= counter_max; + SoundUnit::resetCounters(oldCc); +} + +void Channel4::Lfsr::saveState(SaveState &state, unsigned long cc) { + updateBackupCounter(cc); + state.spu.ch4.lfsr.counter = backupCounter_; + state.spu.ch4.lfsr.reg = reg_; +} + +void Channel4::Lfsr::loadState(SaveState const &state) { + counter_ = backupCounter_ = std::max(state.spu.ch4.lfsr.counter, state.spu.cycleCounter); + reg_ = state.spu.ch4.lfsr.reg; + master_ = state.spu.ch4.master; + nr3_ = state.mem.ioamhram.get()[0x122]; +} + +Channel4::Channel4() +: staticOutputTest_(*this, lfsr_) +, disableMaster_(master_, lfsr_) +, lengthCounter_(disableMaster_, 0x3F) +, envelopeUnit_(staticOutputTest_) +, nextEventUnit_(0) +, cycleCounter_(0) +, soMask_(0) +, prevOut_(0) +, nr4_(0) +, master_(false) +{ + setEvent(); +} + +void Channel4::setEvent() { + nextEventUnit_ = &envelopeUnit_; + if (lengthCounter_.counter() < nextEventUnit_->counter()) + nextEventUnit_ = &lengthCounter_; +} + +void Channel4::setNr1(unsigned data) { + lengthCounter_.nr1Change(data, nr4_, cycleCounter_); + setEvent(); +} + +void Channel4::setNr2(unsigned data) { + if (envelopeUnit_.nr2Change(data)) + disableMaster_(); + else + staticOutputTest_(cycleCounter_); + + setEvent(); +} + +void Channel4::setNr4(unsigned const data) { + lengthCounter_.nr4Change(nr4_, data, cycleCounter_); + nr4_ = data; + + if (data & 0x80) { // init-bit + nr4_ &= 0x7F; + master_ = !envelopeUnit_.nr4Init(cycleCounter_); + + if (master_) + lfsr_.nr4Init(cycleCounter_); + + staticOutputTest_(cycleCounter_); + } + + setEvent(); +} + +void Channel4::setSo(unsigned long soMask) { + soMask_ = soMask; + staticOutputTest_(cycleCounter_); + setEvent(); +} + +void Channel4::reset() { + // cycleCounter >> 12 & 7 represents the frame sequencer position. + cycleCounter_ &= 0xFFF; + cycleCounter_ += ~(cycleCounter_ + 2) << 1 & 0x1000; + + lfsr_.reset(cycleCounter_); + envelopeUnit_.reset(); + setEvent(); +} + +void Channel4::saveState(SaveState &state) { + lfsr_.saveState(state, cycleCounter_); + envelopeUnit_.saveState(state.spu.ch4.env); + lengthCounter_.saveState(state.spu.ch4.lcounter); + + state.spu.ch4.nr4 = nr4_; + state.spu.ch4.master = master_; +} + +void Channel4::loadState(SaveState const &state) { + lfsr_.loadState(state); + envelopeUnit_.loadState(state.spu.ch4.env, state.mem.ioamhram.get()[0x121], + state.spu.cycleCounter); + lengthCounter_.loadState(state.spu.ch4.lcounter, state.spu.cycleCounter); + + cycleCounter_ = state.spu.cycleCounter; + nr4_ = state.spu.ch4.nr4; + master_ = state.spu.ch4.master; +} + +void Channel4::update(uint_least32_t *buf, unsigned long const soBaseVol, unsigned long cycles) { + unsigned long const outBase = envelopeUnit_.dacIsOn() ? soBaseVol & soMask_ : 0; + unsigned long const outLow = outBase * (0 - 15ul); + unsigned long const endCycles = cycleCounter_ + cycles; + + for (;;) { + unsigned long const outHigh = outBase * (envelopeUnit_.getVolume() * 2 - 15ul); + unsigned long const nextMajorEvent = std::min(nextEventUnit_->counter(), endCycles); + unsigned long out = lfsr_.isHighState() ? outHigh : outLow; + + while (lfsr_.counter() <= nextMajorEvent) { + *buf += out - prevOut_; + prevOut_ = out; + buf += lfsr_.counter() - cycleCounter_; + cycleCounter_ = lfsr_.counter(); + + lfsr_.event(); + out = lfsr_.isHighState() ? outHigh : outLow; + } + + if (cycleCounter_ < nextMajorEvent) { + *buf += out - prevOut_; + prevOut_ = out; + buf += nextMajorEvent - cycleCounter_; + cycleCounter_ = nextMajorEvent; + } + + if (nextEventUnit_->counter() == nextMajorEvent) { + nextEventUnit_->event(); + setEvent(); + } else + break; + } + + if (cycleCounter_ >= SoundUnit::counter_max) { + lengthCounter_.resetCounters(cycleCounter_); + lfsr_.resetCounters(cycleCounter_); + envelopeUnit_.resetCounters(cycleCounter_); + cycleCounter_ -= SoundUnit::counter_max; + } +} + +} diff --git a/src/games/gambatte/src/sound/channel4.h b/src/games/gambatte/src/sound/channel4.h new file mode 100644 index 0000000..9ec5cde --- /dev/null +++ b/src/games/gambatte/src/sound/channel4.h @@ -0,0 +1,99 @@ +// +// Copyright (C) 2007 by sinamas +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License version 2 as +// published by the Free Software Foundation. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License version 2 for more details. +// +// You should have received a copy of the GNU General Public License +// version 2 along with this program; if not, write to the +// Free Software Foundation, Inc., +// 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +// + +#ifndef SOUND_CHANNEL4_H +#define SOUND_CHANNEL4_H + +#include "envelope_unit.h" +#include "gbint.h" +#include "length_counter.h" +#include "master_disabler.h" +#include "static_output_tester.h" + +namespace gambatte { + +struct SaveState; + +class Channel4 { +public: + Channel4(); + void setNr1(unsigned data); + void setNr2(unsigned data); + void setNr3(unsigned data) { lfsr_.nr3Change(data, cycleCounter_); } + void setNr4(unsigned data); + void setSo(unsigned long soMask); + bool isActive() const { return master_; } + void update(uint_least32_t *buf, unsigned long soBaseVol, unsigned long cycles); + void reset(); + void saveState(SaveState &state); + void loadState(SaveState const &state); + +private: + class Lfsr : public SoundUnit { + public: + Lfsr(); + virtual void event(); + virtual void resetCounters(unsigned long oldCc); + bool isHighState() const { return ~reg_ & 1; } + void nr3Change(unsigned newNr3, unsigned long cc); + void nr4Init(unsigned long cc); + void reset(unsigned long cc); + void saveState(SaveState &state, unsigned long cc); + void loadState(SaveState const &state); + void disableMaster() { killCounter(); master_ = false; reg_ = 0x7FFF; } + void killCounter() { counter_ = counter_disabled; } + void reviveCounter(unsigned long cc); + + private: + unsigned long backupCounter_; + unsigned short reg_; + unsigned char nr3_; + bool master_; + + void updateBackupCounter(unsigned long cc); + }; + + class Ch4MasterDisabler : public MasterDisabler { + public: + Ch4MasterDisabler(bool &m, Lfsr &lfsr) : MasterDisabler(m), lfsr_(lfsr) {} + virtual void operator()() { MasterDisabler::operator()(); lfsr_.disableMaster(); } + + private: + Lfsr &lfsr_; + }; + + friend class StaticOutputTester; + + StaticOutputTester staticOutputTest_; + Ch4MasterDisabler disableMaster_; + LengthCounter lengthCounter_; + EnvelopeUnit envelopeUnit_; + Lfsr lfsr_; + SoundUnit *nextEventUnit_; + unsigned long cycleCounter_; + unsigned long soMask_; + unsigned long prevOut_; + unsigned char nr4_; + bool master_; + + void setEvent(); +}; + +} + +#endif diff --git a/src/games/gambatte/src/sound/duty_unit.cpp b/src/games/gambatte/src/sound/duty_unit.cpp new file mode 100644 index 0000000..7626628 --- /dev/null +++ b/src/games/gambatte/src/sound/duty_unit.cpp @@ -0,0 +1,158 @@ +// +// Copyright (C) 2007 by sinamas +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License version 2 as +// published by the Free Software Foundation. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License version 2 for more details. +// +// You should have received a copy of the GNU General Public License +// version 2 along with this program; if not, write to the +// Free Software Foundation, Inc., +// 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +// + +#include "duty_unit.h" +#include + +static inline bool toOutState(unsigned duty, unsigned pos) { + return 0x7EE18180 >> (duty * 8 + pos) & 1; +} + +static inline unsigned toPeriod(unsigned freq) { + return (2048 - freq) * 2; +} + +namespace gambatte { + +DutyUnit::DutyUnit() +: nextPosUpdate_(counter_disabled) +, period_(4096) +, pos_(0) +, duty_(0) +, inc_(0) +, high_(false) +, enableEvents_(true) +{ +} + +void DutyUnit::updatePos(unsigned long const cc) { + if (cc >= nextPosUpdate_) { + unsigned long const inc = (cc - nextPosUpdate_) / period_ + 1; + nextPosUpdate_ += period_ * inc; + pos_ += inc; + pos_ &= 7; + high_ = toOutState(duty_, pos_); + } +} + +void DutyUnit::setCounter() { + static unsigned char const nextStateDistance[4 * 8] = { + 7, 6, 5, 4, 3, 2, 1, 1, + 1, 6, 5, 4, 3, 2, 1, 2, + 1, 4, 3, 2, 1, 4, 3, 2, + 1, 6, 5, 4, 3, 2, 1, 2 + }; + + if (enableEvents_ && nextPosUpdate_ != counter_disabled) { + unsigned const npos = (pos_ + 1) & 7; + counter_ = nextPosUpdate_; + inc_ = nextStateDistance[duty_ * 8 + npos]; + if (toOutState(duty_, npos) == high_) { + counter_ += period_ * inc_; + inc_ = nextStateDistance[duty_ * 8 + ((npos + inc_) & 7)]; + } + } else + counter_ = counter_disabled; +} + +void DutyUnit::setFreq(unsigned newFreq, unsigned long cc) { + updatePos(cc); + period_ = toPeriod(newFreq); + setCounter(); +} + +void DutyUnit::event() { + static unsigned char const inc[] = { + 1, 7, + 2, 6, + 4, 4, + 6, 2, + }; + + high_ ^= true; + counter_ += inc_ * period_; + inc_ = inc[duty_ * 2 + high_]; +} + +void DutyUnit::nr1Change(unsigned newNr1, unsigned long cc) { + updatePos(cc); + duty_ = newNr1 >> 6; + setCounter(); +} + +void DutyUnit::nr3Change(unsigned newNr3, unsigned long cc) { + setFreq((freq() & 0x700) | newNr3, cc); +} + +void DutyUnit::nr4Change(unsigned const newNr4, unsigned long const cc) { + setFreq((newNr4 << 8 & 0x700) | (freq() & 0xFF), cc); + + if (newNr4 & 0x80) { + nextPosUpdate_ = (cc & ~1ul) + period_ + 4; + setCounter(); + } +} + +void DutyUnit::reset() { + pos_ = 0; + high_ = false; + nextPosUpdate_ = counter_disabled; + setCounter(); +} + +void DutyUnit::saveState(SaveState::SPU::Duty &dstate, unsigned long const cc) { + updatePos(cc); + setCounter(); + dstate.nextPosUpdate = nextPosUpdate_; + dstate.nr3 = freq() & 0xFF; + dstate.pos = pos_; + dstate.high = high_; +} + +void DutyUnit::loadState(SaveState::SPU::Duty const &dstate, + unsigned const nr1, unsigned const nr4, unsigned long const cc) { + nextPosUpdate_ = std::max(dstate.nextPosUpdate, cc); + pos_ = dstate.pos & 7; + high_ = dstate.high; + duty_ = nr1 >> 6; + period_ = toPeriod((nr4 << 8 & 0x700) | dstate.nr3); + enableEvents_ = true; + setCounter(); +} + +void DutyUnit::resetCounters(unsigned long const oldCc) { + if (nextPosUpdate_ == counter_disabled) + return; + + updatePos(oldCc); + nextPosUpdate_ -= counter_max; + setCounter(); +} + +void DutyUnit::killCounter() { + enableEvents_ = false; + setCounter(); +} + +void DutyUnit::reviveCounter(unsigned long const cc) { + updatePos(cc); + enableEvents_ = true; + setCounter(); +} + +} diff --git a/src/games/gambatte/src/sound/duty_unit.h b/src/games/gambatte/src/sound/duty_unit.h new file mode 100644 index 0000000..23acd1c --- /dev/null +++ b/src/games/gambatte/src/sound/duty_unit.h @@ -0,0 +1,72 @@ +// +// Copyright (C) 2007 by sinamas +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License version 2 as +// published by the Free Software Foundation. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License version 2 for more details. +// +// You should have received a copy of the GNU General Public License +// version 2 along with this program; if not, write to the +// Free Software Foundation, Inc., +// 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +// + +#ifndef DUTY_UNIT_H +#define DUTY_UNIT_H + +#include "sound_unit.h" +#include "master_disabler.h" +#include "../savestate.h" + +namespace gambatte { + +class DutyUnit : public SoundUnit { +public: + DutyUnit(); + virtual void event(); + virtual void resetCounters(unsigned long oldCc); + bool isHighState() const { return high_; } + void nr1Change(unsigned newNr1, unsigned long cc); + void nr3Change(unsigned newNr3, unsigned long cc); + void nr4Change(unsigned newNr4, unsigned long cc); + void reset(); + void saveState(SaveState::SPU::Duty &dstate, unsigned long cc); + void loadState(SaveState::SPU::Duty const &dstate, unsigned nr1, unsigned nr4, unsigned long cc); + void killCounter(); + void reviveCounter(unsigned long cc); + + //intended for use by SweepUnit only. + unsigned freq() const { return 2048 - (period_ >> 1); } + void setFreq(unsigned newFreq, unsigned long cc); + +private: + unsigned long nextPosUpdate_; + unsigned short period_; + unsigned char pos_; + unsigned char duty_; + unsigned char inc_; + bool high_; + bool enableEvents_; + + void setCounter(); + void setDuty(unsigned nr1); + void updatePos(unsigned long cc); +}; + +class DutyMasterDisabler : public MasterDisabler { +public: + DutyMasterDisabler(bool &m, DutyUnit &dutyUnit) : MasterDisabler(m), dutyUnit_(dutyUnit) {} + virtual void operator()() { MasterDisabler::operator()(); dutyUnit_.killCounter(); } + +private: + DutyUnit &dutyUnit_; +}; + +} + +#endif diff --git a/src/games/gambatte/src/sound/envelope_unit.cpp b/src/games/gambatte/src/sound/envelope_unit.cpp new file mode 100644 index 0000000..c115dd3 --- /dev/null +++ b/src/games/gambatte/src/sound/envelope_unit.cpp @@ -0,0 +1,96 @@ +// +// Copyright (C) 2007 by sinamas +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License version 2 as +// published by the Free Software Foundation. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License version 2 for more details. +// +// You should have received a copy of the GNU General Public License +// version 2 along with this program; if not, write to the +// Free Software Foundation, Inc., +// 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +// + +#include "envelope_unit.h" +#include + +namespace gambatte { + +EnvelopeUnit::VolOnOffEvent EnvelopeUnit::nullEvent_; + +EnvelopeUnit::EnvelopeUnit(VolOnOffEvent &volOnOffEvent) +: volOnOffEvent_(volOnOffEvent) +, nr2_(0) +, volume_(0) +{ +} + +void EnvelopeUnit::reset() { + counter_ = counter_disabled; +} + +void EnvelopeUnit::saveState(SaveState::SPU::Env &estate) const { + estate.counter = counter_; + estate.volume = volume_; +} + +void EnvelopeUnit::loadState(SaveState::SPU::Env const &estate, unsigned nr2, unsigned long cc) { + counter_ = std::max(estate.counter, cc); + volume_ = estate.volume; + nr2_ = nr2; +} + +void EnvelopeUnit::event() { + unsigned long const period = nr2_ & 7; + + if (period) { + unsigned newVol = volume_; + if (nr2_ & 8) + ++newVol; + else + --newVol; + + if (newVol < 0x10U) { + volume_ = newVol; + if (volume_ < 2) + volOnOffEvent_(counter_); + + counter_ += period << 15; + } else + counter_ = counter_disabled; + } else + counter_ += 8ul << 15; +} + +bool EnvelopeUnit::nr2Change(unsigned const newNr2) { + if (!(nr2_ & 7) && counter_ != counter_disabled) + ++volume_; + else if (!(nr2_ & 8)) + volume_ += 2; + + if ((nr2_ ^ newNr2) & 8) + volume_ = 0x10 - volume_; + + volume_ &= 0xF; + nr2_ = newNr2; + return !(newNr2 & 0xF8); +} + +bool EnvelopeUnit::nr4Init(unsigned long const cc) { + unsigned long period = (nr2_ & 7) ? nr2_ & 7 : 8; + + if (((cc + 2) & 0x7000) == 0x0000) + ++period; + + counter_ = cc - ((cc - 0x1000) & 0x7FFF) + period * 0x8000; + + volume_ = nr2_ >> 4; + return !(nr2_ & 0xF8); +} + +} diff --git a/src/games/gambatte/src/sound/envelope_unit.h b/src/games/gambatte/src/sound/envelope_unit.h new file mode 100644 index 0000000..95e8b34 --- /dev/null +++ b/src/games/gambatte/src/sound/envelope_unit.h @@ -0,0 +1,53 @@ +// +// Copyright (C) 2007 by sinamas +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License version 2 as +// published by the Free Software Foundation. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License version 2 for more details. +// +// You should have received a copy of the GNU General Public License +// version 2 along with this program; if not, write to the +// Free Software Foundation, Inc., +// 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +// + +#ifndef ENVELOPE_UNIT_H +#define ENVELOPE_UNIT_H + +#include "sound_unit.h" +#include "../savestate.h" + +namespace gambatte { + +class EnvelopeUnit : public SoundUnit { +public: + struct VolOnOffEvent { + virtual ~VolOnOffEvent() {} + virtual void operator()(unsigned long /*cc*/) {} + }; + + explicit EnvelopeUnit(VolOnOffEvent &volOnOffEvent = nullEvent_); + void event(); + bool dacIsOn() const { return nr2_ & 0xF8; } + unsigned getVolume() const { return volume_; } + bool nr2Change(unsigned newNr2); + bool nr4Init(unsigned long cycleCounter); + void reset(); + void saveState(SaveState::SPU::Env &estate) const; + void loadState(SaveState::SPU::Env const &estate, unsigned nr2, unsigned long cc); + +private: + static VolOnOffEvent nullEvent_; + VolOnOffEvent &volOnOffEvent_; + unsigned char nr2_; + unsigned char volume_; +}; + +} + +#endif diff --git a/src/games/gambatte/src/sound/length_counter.cpp b/src/games/gambatte/src/sound/length_counter.cpp new file mode 100644 index 0000000..9d03a57 --- /dev/null +++ b/src/games/gambatte/src/sound/length_counter.cpp @@ -0,0 +1,82 @@ +// +// Copyright (C) 2007 by sinamas +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License version 2 as +// published by the Free Software Foundation. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License version 2 for more details. +// +// You should have received a copy of the GNU General Public License +// version 2 along with this program; if not, write to the +// Free Software Foundation, Inc., +// 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +// + +#include "length_counter.h" +#include "master_disabler.h" +#include + +namespace gambatte { + +LengthCounter::LengthCounter(MasterDisabler &disabler, unsigned const mask) +: disableMaster_(disabler) +, lengthCounter_(0) +, lengthMask_(mask) +{ + nr1Change(0, 0, 0); +} + +void LengthCounter::event() { + counter_ = counter_disabled; + lengthCounter_ = 0; + disableMaster_(); +} + +void LengthCounter::nr1Change(unsigned const newNr1, unsigned const nr4, unsigned long const cc) { + lengthCounter_ = (~newNr1 & lengthMask_) + 1; + counter_ = (nr4 & 0x40) + ? ((cc >> 13) + lengthCounter_) << 13 + : static_cast(counter_disabled); +} + +void LengthCounter::nr4Change(unsigned const oldNr4, unsigned const newNr4, unsigned long const cc) { + if (counter_ != counter_disabled) + lengthCounter_ = (counter_ >> 13) - (cc >> 13); + + { + unsigned dec = 0; + + if (newNr4 & 0x40) { + dec = ~cc >> 12 & 1; + + if (!(oldNr4 & 0x40) && lengthCounter_) { + if (!(lengthCounter_ -= dec)) + disableMaster_(); + } + } + + if ((newNr4 & 0x80) && !lengthCounter_) + lengthCounter_ = lengthMask_ + 1 - dec; + } + + if ((newNr4 & 0x40) && lengthCounter_) + counter_ = ((cc >> 13) + lengthCounter_) << 13; + else + counter_ = counter_disabled; +} + +void LengthCounter::saveState(SaveState::SPU::LCounter &lstate) const { + lstate.counter = counter_; + lstate.lengthCounter = lengthCounter_; +} + +void LengthCounter::loadState(SaveState::SPU::LCounter const &lstate, unsigned long const cc) { + counter_ = std::max(lstate.counter, cc); + lengthCounter_ = lstate.lengthCounter; +} + +} diff --git a/src/games/gambatte/src/sound/length_counter.h b/src/games/gambatte/src/sound/length_counter.h new file mode 100644 index 0000000..d3efe53 --- /dev/null +++ b/src/games/gambatte/src/sound/length_counter.h @@ -0,0 +1,46 @@ +// +// Copyright (C) 2007 by sinamas +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License version 2 as +// published by the Free Software Foundation. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License version 2 for more details. +// +// You should have received a copy of the GNU General Public License +// version 2 along with this program; if not, write to the +// Free Software Foundation, Inc., +// 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +// + +#ifndef LENGTH_COUNTER_H +#define LENGTH_COUNTER_H + +#include "sound_unit.h" +#include "../savestate.h" + +namespace gambatte { + +class MasterDisabler; + +class LengthCounter : public SoundUnit { +public: + LengthCounter(MasterDisabler &disabler, unsigned lengthMask); + virtual void event(); + void nr1Change(unsigned newNr1, unsigned nr4, unsigned long cc); + void nr4Change(unsigned oldNr4, unsigned newNr4, unsigned long cc); + void saveState(SaveState::SPU::LCounter &lstate) const; + void loadState(SaveState::SPU::LCounter const &lstate, unsigned long cc); + +private: + MasterDisabler &disableMaster_; + unsigned short lengthCounter_; + unsigned char const lengthMask_; +}; + +} + +#endif diff --git a/src/games/gambatte/src/sound/master_disabler.h b/src/games/gambatte/src/sound/master_disabler.h new file mode 100644 index 0000000..111e7ae --- /dev/null +++ b/src/games/gambatte/src/sound/master_disabler.h @@ -0,0 +1,36 @@ +// +// Copyright (C) 2007 by sinamas +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License version 2 as +// published by the Free Software Foundation. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License version 2 for more details. +// +// You should have received a copy of the GNU General Public License +// version 2 along with this program; if not, write to the +// Free Software Foundation, Inc., +// 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +// + +#ifndef MASTER_DISABLER_H +#define MASTER_DISABLER_H + +namespace gambatte { + +class MasterDisabler { +public: + explicit MasterDisabler(bool &master) : master_(master) {} + virtual ~MasterDisabler() {} + virtual void operator()() { master_ = false; } + +private: + bool &master_; +}; + +} + +#endif diff --git a/src/games/gambatte/src/sound/sound_unit.h b/src/games/gambatte/src/sound/sound_unit.h new file mode 100644 index 0000000..96c6c82 --- /dev/null +++ b/src/games/gambatte/src/sound/sound_unit.h @@ -0,0 +1,45 @@ +// +// Copyright (C) 2007 by sinamas +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License version 2 as +// published by the Free Software Foundation. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License version 2 for more details. +// +// You should have received a copy of the GNU General Public License +// version 2 along with this program; if not, write to the +// Free Software Foundation, Inc., +// 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +// + +#ifndef SOUND_UNIT_H +#define SOUND_UNIT_H + +namespace gambatte { + +class SoundUnit { +public: + enum { counter_max = 0x80000000u, counter_disabled = 0xFFFFFFFFu }; + + virtual ~SoundUnit() {} + virtual void event() = 0; + + virtual void resetCounters(unsigned long /*oldCc*/) { + if (counter_ != counter_disabled) + counter_ -= counter_max; + } + + unsigned long counter() const { return counter_; } + +protected: + SoundUnit() : counter_(counter_disabled) {} + unsigned long counter_; +}; + +} + +#endif diff --git a/src/games/gambatte/src/sound/static_output_tester.h b/src/games/gambatte/src/sound/static_output_tester.h new file mode 100644 index 0000000..0faefc3 --- /dev/null +++ b/src/games/gambatte/src/sound/static_output_tester.h @@ -0,0 +1,47 @@ +// +// Copyright (C) 2007 by sinamas +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License version 2 as +// published by the Free Software Foundation. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License version 2 for more details. +// +// You should have received a copy of the GNU General Public License +// version 2 along with this program; if not, write to the +// Free Software Foundation, Inc., +// 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +// + +#ifndef STATIC_OUTPUT_TESTER_H +#define STATIC_OUTPUT_TESTER_H + +#include "envelope_unit.h" + +namespace gambatte { + +template +class StaticOutputTester : public EnvelopeUnit::VolOnOffEvent { +public: + StaticOutputTester(Channel const &ch, Unit &unit) : ch_(ch), unit_(unit) {} + void operator()(unsigned long cc); + +private: + Channel const &ch_; + Unit &unit_; +}; + +template +void StaticOutputTester::operator()(unsigned long cc) { + if (ch_.soMask_ && ch_.master_ && ch_.envelopeUnit_.getVolume()) + unit_.reviveCounter(cc); + else + unit_.killCounter(); +} + +} + +#endif diff --git a/src/games/gambatte/src/statesaver.cpp b/src/games/gambatte/src/statesaver.cpp new file mode 100644 index 0000000..4614222 --- /dev/null +++ b/src/games/gambatte/src/statesaver.cpp @@ -0,0 +1,604 @@ +/*************************************************************************** + * Copyright (C) 2008 by Sindre Aamås * + * aamas@stud.ntnu.no * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License version 2 as * + * published by the Free Software Foundation. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License version 2 for more details. * + * * + * You should have received a copy of the GNU General Public License * + * version 2 along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ +#include "statesaver.h" +#include "savestate.h" +#include "gambatte-array.h" +#include +#include +#include +#include + +class omemstream +{ + public: + omemstream(void *data) : wr_ptr(static_cast(data)), has_written(0) {} + + void put(uint8_t data) + { + if (wr_ptr) + *wr_ptr++ = data; + has_written++; + } + + void write(const void *data, size_t size) + { + if (wr_ptr) + { + std::memcpy(wr_ptr, data, size); + wr_ptr += size; + } + + has_written += size; + } + + size_t size() const { return has_written; } + bool fail() const { return false; } + bool good() const { return true; } + + private: + uint8_t *wr_ptr; + size_t has_written; +}; + +class imemstream +{ + public: + imemstream(const void *data, size_t size) + : rd_ptr(static_cast(data)) + , rd_end(static_cast(data) + size) + , has_read(0) + , failed_(false) + {} + + uint8_t get() + { + /* On underflow return 0 and latch failure. Callers + * cannot ignore failure in a way that would dereference + * the read pointer because rd_ptr is never advanced past + * rd_end. Previously this function unconditionally + * dereferenced and incremented rd_ptr, allowing a + * malformed savestate to read arbitrary memory past the + * buffer end. */ + if (rd_ptr >= rd_end) { + failed_ = true; + return 0; + } + uint8_t ret = *rd_ptr++; + has_read++; + return ret; + } + + void read(void *data, size_t size) + { + size_t avail = (size_t)(rd_end - rd_ptr); + size_t n = size < avail ? size : avail; + if (n) + std::memcpy(data, rd_ptr, n); + /* Pad the tail with zeroes if the buffer is short, to + * keep caller-visible behavior deterministic when a + * truncated state is fed in. */ + if (n < size) { + std::memset(static_cast(data) + n, 0, size - n); + failed_ = true; + } + rd_ptr += n; + has_read += size; + } + + void ignore(size_t len = 1) + { + size_t avail = (size_t)(rd_end - rd_ptr); + size_t n = len < avail ? len : avail; + if (n < len) + failed_ = true; + rd_ptr += n; + has_read += len; + } + + void getline(char *data, size_t size, char delim = '\n') + { + size_t count = 0; + while ((count < size - 1) && (rd_ptr < rd_end) && (*rd_ptr != delim)) + { + *data++ = *rd_ptr++; + has_read++; + count++; + } + + if (rd_ptr < rd_end) { + rd_ptr++; + has_read++; + } else { + failed_ = true; + } + *data = '\0'; + } + + bool fail() const { return failed_; } + bool good() const { return !failed_ && rd_ptr < rd_end; } + + private: + const uint8_t *rd_ptr; + const uint8_t *rd_end; + size_t has_read; + bool failed_; +}; + + +namespace { + +using namespace gambatte; + +enum AsciiChar { + NUL, SOH, STX, ETX, EOT, ENQ, ACK, BEL, BS, TAB, LF, VT, FF, CR, SO, SI, + DLE, DC1, DC2, DC3, DC4, NAK, SYN, ETB, CAN, EM, SUB, ESC, FS, GS, RS, US, + SP, XCL, QOT, HSH, DLR, PRC, AMP, APO, LPA, RPA, AST, PLU, COM, HYP, STP, DIV, + NO0, NO1, NO2, NO3, NO4, NO5, NO6, NO7, NO8, NO9, CLN, SCL, LT, EQL, GT, QTN, + AT, A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, + P, Q, R, S, T, U, V, W, X, Y, Z, LBX, BSL, RBX, CAT, UND, + ACN, a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, + p, q, r, s, t, u, v, w, x, y, z, LBR, BAR, RBR, TLD, DEL +}; + +struct Saver { + const char *label; + void (*save)(omemstream &file, const SaveState &state); + void (*load)(imemstream &file, SaveState &state); + unsigned char labelsize; +}; + +static inline bool operator<(const Saver &l, const Saver &r) { + return std::strcmp(l.label, r.label) < 0; +} + +static void put24(omemstream &file, const unsigned long data) { + file.put(data >> 16 & 0xFF); + file.put(data >> 8 & 0xFF); + file.put(data & 0xFF); +} + +static void put32(omemstream &file, const unsigned long data) { + file.put(data >> 24 & 0xFF); + file.put(data >> 16 & 0xFF); + file.put(data >> 8 & 0xFF); + file.put(data & 0xFF); +} + +static void write(omemstream &file, const unsigned char data) { + static const char inf[] = { 0x00, 0x00, 0x01 }; + + file.write(inf, sizeof(inf)); + file.put(data & 0xFF); +} + +static void write(omemstream &file, const unsigned short data) { + static const char inf[] = { 0x00, 0x00, 0x02 }; + + file.write(inf, sizeof(inf)); + file.put(data >> 8 & 0xFF); + file.put(data & 0xFF); +} + +static void write(omemstream &file, const unsigned long data) { + static const char inf[] = { 0x00, 0x00, 0x04 }; + + file.write(inf, sizeof(inf)); + put32(file, data); +} + +static inline void write(omemstream &file, const bool data) { + write(file, static_cast(data)); +} + +static void write(omemstream &file, const unsigned char *data, const unsigned long sz) { + put24(file, sz); + file.write(reinterpret_cast(data), sz); +} + +static void write(omemstream &file, const bool *data, const unsigned long sz) { + put24(file, sz); + + for (unsigned long i = 0; i < sz; ++i) + file.put(data[i]); +} + +static unsigned long get24(imemstream &file) { + unsigned long tmp = file.get() & 0xFF; + + tmp = tmp << 8 | (file.get() & 0xFF); + + return tmp << 8 | (file.get() & 0xFF); +} + +static unsigned long read(imemstream &file) { + unsigned long size = get24(file); + + if (size > 4) { + file.ignore(size - 4); + size = 4; + } + + unsigned long out = 0; + + switch (size) { + case 4: out = (out | (file.get() & 0xFF)) << 8; + case 3: out = (out | (file.get() & 0xFF)) << 8; + case 2: out = (out | (file.get() & 0xFF)) << 8; + case 1: out = out | (file.get() & 0xFF); + } + + return out; +} + +static inline void read(imemstream &file, unsigned char &data) { + data = read(file) & 0xFF; +} + +static inline void read(imemstream &file, unsigned short &data) { + data = read(file) & 0xFFFF; +} + +static inline void read(imemstream &file, unsigned long &data) { + data = read(file); +} + +static inline void read(imemstream &file, bool &data) { + data = read(file); +} + +static void read(imemstream &file, unsigned char *data, unsigned long sz) { + const unsigned long size = get24(file); + + if (size < sz) + sz = size; + + file.read(reinterpret_cast(data), sz); + file.ignore(size - sz); + + /* Previous code had: + * if (static_cast(0x100)) + * for (...) data[i] &= 0xFF; + * The condition is always false (0x100 truncated to + * unsigned char is 0), so the masking loop was dead. + * Removed. unsigned char already holds 0..0xFF by definition. */ +} + +static void read(imemstream &file, bool *data, unsigned long sz) { + const unsigned long size = get24(file); + + if (size < sz) + sz = size; + + for (unsigned long i = 0; i < sz; ++i) + data[i] = file.get(); + + file.ignore(size - sz); +} + +} // anon namespace + +namespace gambatte { + +class SaverList { +public: + typedef std::vector list_t; + typedef list_t::const_iterator const_iterator; + +private: + list_t list; + unsigned char maxLabelsize_; + +public: + SaverList(); + const_iterator begin() const { return list.begin(); } + const_iterator end() const { return list.end(); } + unsigned char maxLabelsize() const { return maxLabelsize_; } +}; + +static void pushSaver(SaverList::list_t &list, const char *label, + void (*save)(omemstream &file, const SaveState &state), + void (*load)(imemstream &file, SaveState &state), unsigned char labelsize) { + const Saver saver = { label, save, load, labelsize }; + list.push_back(saver); +} + +SaverList::SaverList() { +#define ADD(arg) do { \ + struct Func { \ + static void save(omemstream &file, const SaveState &state) { write(file, state.arg); } \ + static void load(imemstream &file, SaveState &state) { read(file, state.arg); } \ + }; \ + \ + pushSaver(list, label, Func::save, Func::load, sizeof label); \ +} while (0) + +#define ADDPTR(arg) do { \ + struct Func { \ + static void save(omemstream &file, const SaveState &state) { write(file, state.arg.get(), state.arg.size()); } \ + static void load(imemstream &file, SaveState &state) { read(file, state.arg.ptr, state.arg.size()); } \ + }; \ + \ + pushSaver(list, label, Func::save, Func::load, sizeof label); \ +} while (0) + +#define ADDARRAY(arg) do { \ + struct Func { \ + static void save(omemstream &file, const SaveState &state) { write(file, state.arg, sizeof(state.arg)); } \ + static void load(imemstream &file, SaveState &state) { read(file, state.arg, sizeof(state.arg)); } \ + }; \ + \ + pushSaver(list, label, Func::save, Func::load, sizeof label); \ +} while (0) + + { static const char label[] = { c,c, NUL }; ADD(cpu.cycleCounter); } + { static const char label[] = { p,c, NUL }; ADD(cpu.pc); } + { static const char label[] = { s,p, NUL }; ADD(cpu.sp); } + { static const char label[] = { a, NUL }; ADD(cpu.a); } + { static const char label[] = { b, NUL }; ADD(cpu.b); } + { static const char label[] = { c, NUL }; ADD(cpu.c); } + { static const char label[] = { d, NUL }; ADD(cpu.d); } + { static const char label[] = { e, NUL }; ADD(cpu.e); } + { static const char label[] = { f, NUL }; ADD(cpu.f); } + { static const char label[] = { h, NUL }; ADD(cpu.h); } + { static const char label[] = { l, NUL }; ADD(cpu.l); } + { static const char label[] = { s,k,i,p, NUL }; ADD(cpu.skip); } + { static const char label[] = { h,a,l,t, NUL }; ADD(mem.halted); } + { static const char label[] = { v,r,a,m, NUL }; ADDPTR(mem.vram); } + { static const char label[] = { s,r,a,m, NUL }; ADDPTR(mem.sram); } + { static const char label[] = { w,r,a,m, NUL }; ADDPTR(mem.wram); } + { static const char label[] = { h,r,a,m, NUL }; ADDPTR(mem.ioamhram); } + { static const char label[] = { l,d,i,v,u,p, NUL }; ADD(mem.divLastUpdate); } + { static const char label[] = { l,t,i,m,a,u,p, NUL }; ADD(mem.timaLastUpdate); } + { static const char label[] = { t,m,a,t,i,m,e, NUL }; ADD(mem.tmatime); } + { static const char label[] = { s,e,r,i,a,l,t, NUL }; ADD(mem.nextSerialtime); } + { static const char label[] = { l,o,d,m,a,u,p, NUL }; ADD(mem.lastOamDmaUpdate); } + { static const char label[] = { m,i,n,i,n,t,t, NUL }; ADD(mem.minIntTime); } + { static const char label[] = { u,n,h,a,l,t,t, NUL }; ADD(mem.unhaltTime); } + { static const char label[] = { r,o,m,b,a,n,k, NUL }; ADD(mem.rombank); } + { static const char label[] = { d,m,a,s,r,c, NUL }; ADD(mem.dmaSource); } + { static const char label[] = { d,m,a,d,s,t, NUL }; ADD(mem.dmaDestination); } + { static const char label[] = { r,a,m,b,a,n,k, NUL }; ADD(mem.rambank); } + { static const char label[] = { o,d,m,a,p,o,s, NUL }; ADD(mem.oamDmaPos); } +#ifdef HAVE_NETWORK + { static const char label[] = { n,e,t,s,v, NUL }; ADD(mem.serialize_value); } + { static const char label[] = { n,e,t,s,f,c, NUL }; ADD(mem.serialize_is_fastcgb); } +#endif + { static const char label[] = { i,m,e, NUL }; ADD(mem.IME); } + { static const char label[] = { s,r,a,m,o,n, NUL }; ADD(mem.enableRam); } + { static const char label[] = { r,a,m,b,m,o,d, NUL }; ADD(mem.rambankMode); } + { static const char label[] = { h,d,m,a, NUL }; ADD(mem.hdmaTransfer); } + { static const char label[] = { h,u,c,NO3,r,a,m, NUL }; ADD(mem.HuC3RAMflag); } + { static const char label[] = { s,c,h,n,o,m,k, NUL }; ADD(mem.sachenOuterMask); } + { static const char label[] = { s,c,h,n,l,c,t, NUL }; ADD(mem.sachenLockCount); } + { static const char label[] = { b,g,p, NUL }; ADDPTR(ppu.bgpData); } + { static const char label[] = { o,b,j,p, NUL }; ADDPTR(ppu.objpData); } + { static const char label[] = { s,p,o,s,b,u,f, NUL }; ADDPTR(ppu.oamReaderBuf); } + { static const char label[] = { s,p,s,z,b,u,f, NUL }; ADDPTR(ppu.oamReaderSzbuf); } + { static const char label[] = { d,m,g,p,a,l, NUL }; ADDARRAY(ppu.dmgPalette); } + { static const char label[] = { s,p,a,t,t,r, NUL }; ADDARRAY(ppu.spAttribList); } + { static const char label[] = { s,p,b,y,t,e,NO0, NUL }; ADDARRAY(ppu.spByte0List); } + { static const char label[] = { s,p,b,y,t,e,NO1, NUL }; ADDARRAY(ppu.spByte1List); } + { static const char label[] = { v,c,y,c,l,e,s, NUL }; ADD(ppu.videoCycles); } + { static const char label[] = { e,d,M,NO0,t,i,m, NUL }; ADD(ppu.enableDisplayM0Time); } + { static const char label[] = { m,NO0,t,i,m,e, NUL }; ADD(ppu.lastM0Time); } + { static const char label[] = { n,m,NO0,i,r,q, NUL }; ADD(ppu.nextM0Irq); } + { static const char label[] = { b,g,t,w, NUL }; ADD(ppu.tileword); } + { static const char label[] = { b,g,n,t,w, NUL }; ADD(ppu.ntileword); } + { static const char label[] = { w,i,n,y,p,o,s, NUL }; ADD(ppu.winYPos); } + { static const char label[] = { x,p,o,s, NUL }; ADD(ppu.xpos); } + { static const char label[] = { e,n,d,x, NUL }; ADD(ppu.endx); } + { static const char label[] = { p,p,u,r,NO0, NUL }; ADD(ppu.reg0); } + { static const char label[] = { p,p,u,r,NO1, NUL }; ADD(ppu.reg1); } + { static const char label[] = { b,g,a,t,r,b, NUL }; ADD(ppu.attrib); } + { static const char label[] = { b,g,n,a,t,r,b, NUL }; ADD(ppu.nattrib); } + { static const char label[] = { p,p,u,s,t,a,t, NUL }; ADD(ppu.state); } + { static const char label[] = { n,s,p,r,i,t,e, NUL }; ADD(ppu.nextSprite); } + { static const char label[] = { c,s,p,r,i,t,e, NUL }; ADD(ppu.currentSprite); } + { static const char label[] = { l,y,c, NUL }; ADD(ppu.lyc); } + { static const char label[] = { m,NO0,l,y,c, NUL }; ADD(ppu.m0lyc); } + { static const char label[] = { o,l,d,w,y, NUL }; ADD(ppu.oldWy); } + { static const char label[] = { w,i,n,d,r,a,w, NUL }; ADD(ppu.winDrawState); } + { static const char label[] = { w,s,c,x, NUL }; ADD(ppu.wscx); } + { static const char label[] = { w,e,m,a,s,t,r, NUL }; ADD(ppu.weMaster); } + { static const char label[] = { l,c,d,s,i,r,q, NUL }; ADD(ppu.pendingLcdstatIrq); } + { static const char label[] = { s,p,u,c,n,t,r, NUL }; ADD(spu.cycleCounter); } + { static const char label[] = { s,w,p,c,n,t,r, NUL }; ADD(spu.ch1.sweep.counter); } + { static const char label[] = { s,w,p,s,h,d,w, NUL }; ADD(spu.ch1.sweep.shadow); } + { static const char label[] = { s,w,p,n,e,g, NUL }; ADD(spu.ch1.sweep.negging); } + { static const char label[] = { d,u,t,NO1,c,t,r, NUL }; ADD(spu.ch1.duty.nextPosUpdate); } + { static const char label[] = { d,u,t,NO1,p,o,s, NUL }; ADD(spu.ch1.duty.pos); } + { static char const label[] = { d,u,t,NO1,h,i, NUL }; ADD(spu.ch1.duty.high); } + { static const char label[] = { e,n,v,NO1,c,t,r, NUL }; ADD(spu.ch1.env.counter); } + { static const char label[] = { e,n,v,NO1,v,o,l, NUL }; ADD(spu.ch1.env.volume); } + { static const char label[] = { l,e,n,NO1,c,t,r, NUL }; ADD(spu.ch1.lcounter.counter); } + { static const char label[] = { l,e,n,NO1,v,a,l, NUL }; ADD(spu.ch1.lcounter.lengthCounter); } + { static const char label[] = { n,r,NO1,NO0, NUL }; ADD(spu.ch1.sweep.nr0); } + { static const char label[] = { n,r,NO1,NO3, NUL }; ADD(spu.ch1.duty.nr3); } + { static const char label[] = { n,r,NO1,NO4, NUL }; ADD(spu.ch1.nr4); } + { static const char label[] = { c,NO1,m,a,s,t,r, NUL }; ADD(spu.ch1.master); } + { static const char label[] = { d,u,t,NO2,c,t,r, NUL }; ADD(spu.ch2.duty.nextPosUpdate); } + { static const char label[] = { d,u,t,NO2,p,o,s, NUL }; ADD(spu.ch2.duty.pos); } + { static char const label[] = { d,u,t,NO2,h,i, NUL }; ADD(spu.ch2.duty.high); } + { static const char label[] = { e,n,v,NO2,c,t,r, NUL }; ADD(spu.ch2.env.counter); } + { static const char label[] = { e,n,v,NO2,v,o,l, NUL }; ADD(spu.ch2.env.volume); } + { static const char label[] = { l,e,n,NO2,c,t,r, NUL }; ADD(spu.ch2.lcounter.counter); } + { static const char label[] = { l,e,n,NO2,v,a,l, NUL }; ADD(spu.ch2.lcounter.lengthCounter); } + { static const char label[] = { n,r,NO2,NO3, NUL }; ADD(spu.ch2.duty.nr3); } + { static const char label[] = { n,r,NO2,NO4, NUL }; ADD(spu.ch2.nr4); } + { static const char label[] = { c,NO2,m,a,s,t,r, NUL }; ADD(spu.ch2.master); } + { static const char label[] = { w,a,v,e,r,a,m, NUL }; ADDPTR(spu.ch3.waveRam); } + { static const char label[] = { l,e,n,NO3,c,t,r, NUL }; ADD(spu.ch3.lcounter.counter); } + { static const char label[] = { l,e,n,NO3,v,a,l, NUL }; ADD(spu.ch3.lcounter.lengthCounter); } + { static const char label[] = { w,a,v,e,c,t,r, NUL }; ADD(spu.ch3.waveCounter); } + { static const char label[] = { l,w,a,v,r,d,t, NUL }; ADD(spu.ch3.lastReadTime); } + { static const char label[] = { w,a,v,e,p,o,s, NUL }; ADD(spu.ch3.wavePos); } + { static const char label[] = { w,a,v,s,m,p,l, NUL }; ADD(spu.ch3.sampleBuf); } + { static const char label[] = { n,r,NO3,NO3, NUL }; ADD(spu.ch3.nr3); } + { static const char label[] = { n,r,NO3,NO4, NUL }; ADD(spu.ch3.nr4); } + { static const char label[] = { c,NO3,m,a,s,t,r, NUL }; ADD(spu.ch3.master); } + { static const char label[] = { l,f,s,r,c,t,r, NUL }; ADD(spu.ch4.lfsr.counter); } + { static const char label[] = { l,f,s,r,r,e,g, NUL }; ADD(spu.ch4.lfsr.reg); } + { static const char label[] = { e,n,v,NO4,c,t,r, NUL }; ADD(spu.ch4.env.counter); } + { static const char label[] = { e,n,v,NO4,v,o,l, NUL }; ADD(spu.ch4.env.volume); } + { static const char label[] = { l,e,n,NO4,c,t,r, NUL }; ADD(spu.ch4.lcounter.counter); } + { static const char label[] = { l,e,n,NO4,v,a,l, NUL }; ADD(spu.ch4.lcounter.lengthCounter); } + { static const char label[] = { n,r,NO4,NO4, NUL }; ADD(spu.ch4.nr4); } + { static const char label[] = { c,NO4,m,a,s,t,r, NUL }; ADD(spu.ch4.master); } + { static const char label[] = { r,t,c,b,a,s,e, NUL }; ADD(rtc.baseTime); } + { static const char label[] = { r,t,c,h,a,l,t, NUL }; ADD(rtc.haltTime); } + { static const char label[] = { r,t,c,d,h, NUL }; ADD(rtc.dataDh); } + { static const char label[] = { r,t,c,d,l, NUL }; ADD(rtc.dataDl); } + { static const char label[] = { r,t,c,h, NUL }; ADD(rtc.dataH); } + { static const char label[] = { r,t,c,m, NUL }; ADD(rtc.dataM); } + { static const char label[] = { r,t,c,s, NUL }; ADD(rtc.dataS); } + { static const char label[] = { r,t,c,l,l,d, NUL }; ADD(rtc.lastLatchData); } + { static char const label[] = { h,NO3,b,a,s,e,t, NUL }; ADD(huc3.baseTime); } + { static const char label[] = { h,NO3,h,a,l,t,t, NUL }; ADD(huc3.haltTime); } + { static const char label[] = { h,NO3,d,a,t,a,t, NUL }; ADD(huc3.dataTime); } + { static const char label[] = { h,NO3,w,r,i,t,t, NUL }; ADD(huc3.writingTime); } + { static const char label[] = { h,NO3,h,a,l,t, NUL }; ADD(huc3.halted); } + { static const char label[] = { h,NO3,s,h,f,t, NUL }; ADD(huc3.shift); } + { static const char label[] = { h,NO3,r,v, NUL }; ADD(huc3.ramValue); } + { static const char label[] = { h,NO3,m,f, NUL }; ADD(huc3.modeflag); } + { static const char label[] = { h,NO3,i,r,c,y, NUL }; ADD(huc3.irBaseCycle); } + { static const char label[] = { h,NO3,i,r,a,c, NUL }; ADD(huc3.irReceivingPulse); } + +#undef ADD +#undef ADDPTR +#undef ADDARRAY + + list.resize(list.size()); + std::sort(list.begin(), list.end()); + + maxLabelsize_ = 0; + + for (std::size_t i = 0; i < list.size(); ++i) { + if (list[i].labelsize > maxLabelsize_) + maxLabelsize_ = list[i].labelsize; + } +} + +} + +namespace { + +static void writeSnapShot(omemstream &file) { + put24(file, 0); +} + +/* Function-local static to make the construction lifetime + * explicit. The previous translation-unit-scope static was + * constructed at library load (before main / before any libretro + * entry point) which made its construction order against other + * library-load work implementation-defined. The list itself is + * read-only after construction so concurrent reads are safe. */ +static const SaverList &saver_list(void) { + static SaverList instance; + return instance; +} + +} // anon namespace + +namespace gambatte { + +void StateSaver::saveState(const SaveState &state, void *data) { + omemstream file(data); + + if (file.fail()) + return; + + { static const char ver[] = { 0, 1 }; file.write(ver, sizeof(ver)); } + + writeSnapShot(file); + + const SaverList &list = saver_list(); + for (SaverList::const_iterator it = list.begin(); it != list.end(); ++it) { + file.write(it->label, it->labelsize); + (*it->save)(file, state); + } +} + +bool StateSaver::loadState(SaveState &state, const void *data, size_t size) { + /* The bounds-checked imemstream needs the buffer end so it + * can stop at it. Previously this constructor only took a + * pointer; a malformed savestate could claim a 24-bit chunk + * size of 0xFFFFFF (16 MB) and the parser would happily skip + * past the end and read arbitrary memory. */ + imemstream file(data, size); + + if (file.fail() || file.get() != 0) + return false; + + file.ignore(); + file.ignore(get24(file)); + + const SaverList &list = saver_list(); + const Array labelbuf(list.maxLabelsize()); + const Saver labelbufSaver = { labelbuf, 0, 0, list.maxLabelsize() }; + + SaverList::const_iterator done = list.begin(); + + while (file.good() && done != list.end()) { + file.getline(labelbuf, list.maxLabelsize(), NUL); + + SaverList::const_iterator it = done; + + if (std::strcmp(labelbuf, it->label)) { + it = std::lower_bound(it + 1, list.end(), labelbufSaver); + + if (it == list.end() || std::strcmp(labelbuf, it->label)) { + file.ignore(get24(file)); + continue; + } + } else + ++done; + + (*it->load)(file, state); + } + + state.cpu.cycleCounter &= 0x7FFFFFFF; + state.spu.cycleCounter &= 0x7FFFFFFF; + + /* If the parser tripped its failure latch the data was + * malformed; reject the load so the caller doesn't end up + * with a half-applied state. */ + return !file.fail(); +} + +size_t StateSaver::stateSize(const SaveState &state) { + omemstream file(0); + + if (file.fail()) + return 0; + + { static const char ver[] = { 0, 1 }; file.write(ver, sizeof(ver)); } + + writeSnapShot(file); + + const SaverList &list = saver_list(); + for (SaverList::const_iterator it = list.begin(); it != list.end(); ++it) { + file.write(it->label, it->labelsize); + (*it->save)(file, state); + } + + return file.size(); +} + +} + diff --git a/src/games/gambatte/src/statesaver.h b/src/games/gambatte/src/statesaver.h new file mode 100644 index 0000000..8d41a28 --- /dev/null +++ b/src/games/gambatte/src/statesaver.h @@ -0,0 +1,49 @@ +/*************************************************************************** + * Copyright (C) 2008 by Sindre Aamås * + * aamas@stud.ntnu.no * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License version 2 as * + * published by the Free Software Foundation. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License version 2 for more details. * + * * + * You should have received a copy of the GNU General Public License * + * version 2 along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ +#ifndef STATESAVER_H +#define STATESAVER_H + +#include "gbint.h" +#include +#include + +namespace gambatte { + +struct SaveState; + +class StateSaver { + StateSaver(); + +public: + enum { SS_SHIFT = 2 }; + enum { SS_DIV = 1 << 2 }; + enum { SS_WIDTH = 160 >> SS_SHIFT }; + enum { SS_HEIGHT = 144 >> SS_SHIFT }; + + static void saveState(const SaveState &state, void *data); + /* size is the size of the input buffer in bytes. The parser + * uses it to bound every read so a malformed savestate cannot + * cause an OOB read past the end of the buffer. */ + static bool loadState(SaveState &state, const void *data, size_t size); + static size_t stateSize(const SaveState &state); +}; + +} + +#endif diff --git a/src/games/gambatte/src/tima.cpp b/src/games/gambatte/src/tima.cpp new file mode 100644 index 0000000..e17f9e7 --- /dev/null +++ b/src/games/gambatte/src/tima.cpp @@ -0,0 +1,169 @@ +// +// Copyright (C) 2007 by sinamas +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License version 2 as +// published by the Free Software Foundation. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License version 2 for more details. +// +// You should have received a copy of the GNU General Public License +// version 2 along with this program; if not, write to the +// Free Software Foundation, Inc., +// 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +// + +#include "tima.h" +#include "savestate.h" + +static unsigned char const timaClock[4] = { 10, 4, 6, 8 }; + +namespace gambatte { + +Tima::Tima() +: lastUpdate_(0) +, tmatime_(disabled_time) +, tima_(0) +, tma_(0) +, tac_(0) +{ +} + +void Tima::saveState(SaveState &state) const { + state.mem.timaLastUpdate = lastUpdate_; + state.mem.tmatime = tmatime_; +} + +void Tima::loadState(SaveState const &state, TimaInterruptRequester timaIrq) { + lastUpdate_ = state.mem.timaLastUpdate; + tmatime_ = state.mem.tmatime; + tima_ = state.mem.ioamhram.get()[0x105]; + tma_ = state.mem.ioamhram.get()[0x106]; + tac_ = state.mem.ioamhram.get()[0x107]; + + unsigned long nextIrqEventTime = disabled_time; + if (tac_ & 4) { + nextIrqEventTime = tmatime_ != disabled_time && tmatime_ > state.cpu.cycleCounter + ? tmatime_ + : lastUpdate_ + ((256u - tima_) << timaClock[tac_ & 3]) + 3; + } + + timaIrq.setNextIrqEventTime(nextIrqEventTime); +} + +void Tima::resetCc(unsigned long const oldCc, unsigned long const newCc, TimaInterruptRequester timaIrq) { + if (tac_ & 0x04) { + updateIrq(oldCc, timaIrq); + updateTima(oldCc); + + unsigned long const dec = oldCc - newCc; + lastUpdate_ -= dec; + timaIrq.setNextIrqEventTime(timaIrq.nextIrqEventTime() - dec); + + if (tmatime_ != disabled_time) + tmatime_ -= dec; + } +} + +void Tima::updateTima(unsigned long const cc) { + unsigned long const ticks = (cc - lastUpdate_) >> timaClock[tac_ & 3]; + lastUpdate_ += ticks << timaClock[tac_ & 3]; + + if (cc >= tmatime_) { + if (cc >= tmatime_ + 4) + tmatime_ = disabled_time; + + tima_ = tma_; + } + + unsigned long tmp = tima_ + ticks; + while (tmp > 0x100) + tmp -= 0x100 - tma_; + + if (tmp == 0x100) { + tmp = 0; + tmatime_ = lastUpdate_ + 3; + + if (cc >= tmatime_) { + if (cc >= tmatime_ + 4) + tmatime_ = disabled_time; + + tmp = tma_; + } + } + + tima_ = tmp; +} + +void Tima::setTima(unsigned const data, unsigned long const cc, TimaInterruptRequester timaIrq) { + if (tac_ & 0x04) { + updateIrq(cc, timaIrq); + updateTima(cc); + + if (tmatime_ - cc < 4) + tmatime_ = disabled_time; + + timaIrq.setNextIrqEventTime(lastUpdate_ + ((256u - data) << timaClock[tac_ & 3]) + 3); + } + + tima_ = data; +} + +void Tima::setTma(unsigned const data, unsigned long const cc, TimaInterruptRequester timaIrq) { + if (tac_ & 0x04) { + updateIrq(cc, timaIrq); + updateTima(cc); + } + + tma_ = data; +} + +void Tima::setTac(unsigned const data, unsigned long const cc, TimaInterruptRequester timaIrq) { + if (tac_ ^ data) { + unsigned long nextIrqEventTime = timaIrq.nextIrqEventTime(); + + if (tac_ & 0x04) { + updateIrq(cc, timaIrq); + updateTima(cc); + + lastUpdate_ -= (1u << (timaClock[tac_ & 3] - 1)) + 3; + tmatime_ -= (1u << (timaClock[tac_ & 3] - 1)) + 3; + nextIrqEventTime -= (1u << (timaClock[tac_ & 3] - 1)) + 3; + + if (cc >= nextIrqEventTime) + timaIrq.flagIrq(); + + updateTima(cc); + + tmatime_ = disabled_time; + nextIrqEventTime = disabled_time; + } + + if (data & 4) { + lastUpdate_ = (cc >> timaClock[data & 3]) << timaClock[data & 3]; + nextIrqEventTime = lastUpdate_ + ((256u - tima_) << timaClock[data & 3]) + 3; + } + + timaIrq.setNextIrqEventTime(nextIrqEventTime); + } + + tac_ = data; +} + +unsigned Tima::tima(unsigned long cc) { + if (tac_ & 0x04) + updateTima(cc); + + return tima_; +} + +void Tima::doIrqEvent(TimaInterruptRequester timaIrq) { + timaIrq.flagIrq(); + timaIrq.setNextIrqEventTime(timaIrq.nextIrqEventTime() + + ((256u - tma_) << timaClock[tac_ & 3])); +} + +} diff --git a/src/games/gambatte/src/tima.h b/src/games/gambatte/src/tima.h new file mode 100644 index 0000000..9897252 --- /dev/null +++ b/src/games/gambatte/src/tima.h @@ -0,0 +1,66 @@ +// +// Copyright (C) 2007 by sinamas +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License version 2 as +// published by the Free Software Foundation. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License version 2 for more details. +// +// You should have received a copy of the GNU General Public License +// version 2 along with this program; if not, write to the +// Free Software Foundation, Inc., +// 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +// + +#ifndef TIMA_H +#define TIMA_H + +#include "interruptrequester.h" + +namespace gambatte { + +class TimaInterruptRequester { +public: + explicit TimaInterruptRequester(InterruptRequester &intreq) : intreq_(intreq) {} + void flagIrq() const { intreq_.flagIrq(4); } + unsigned long nextIrqEventTime() const { return intreq_.eventTime(intevent_tima); } + void setNextIrqEventTime(unsigned long time) const { intreq_.setEventTime(time); } + +private: + InterruptRequester &intreq_; +}; + +class Tima { +public: + Tima(); + void saveState(SaveState &) const; + void loadState(const SaveState &, TimaInterruptRequester timaIrq); + void resetCc(unsigned long oldCc, unsigned long newCc, TimaInterruptRequester timaIrq); + void setTima(unsigned tima, unsigned long cc, TimaInterruptRequester timaIrq); + void setTma(unsigned tma, unsigned long cc, TimaInterruptRequester timaIrq); + void setTac(unsigned tac, unsigned long cc, TimaInterruptRequester timaIrq); + unsigned tima(unsigned long cc); + void doIrqEvent(TimaInterruptRequester timaIrq); + +private: + unsigned long lastUpdate_; + unsigned long tmatime_; + unsigned char tima_; + unsigned char tma_; + unsigned char tac_; + + void updateIrq(unsigned long const cc, TimaInterruptRequester timaIrq) { + while (cc >= timaIrq.nextIrqEventTime()) + doIrqEvent(timaIrq); + } + + void updateTima(unsigned long cc); +}; + +} + +#endif diff --git a/src/games/gambatte/src/video.cpp b/src/games/gambatte/src/video.cpp new file mode 100644 index 0000000..012d8d1 --- /dev/null +++ b/src/games/gambatte/src/video.cpp @@ -0,0 +1,777 @@ +/*************************************************************************** + * Copyright (C) 2007 by Sindre Aamås * + * aamas@stud.ntnu.no * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License version 2 as * + * published by the Free Software Foundation. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License version 2 for more details. * + * * + * You should have received a copy of the GNU General Public License * + * version 2 along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ +#include "video.h" +#include "savestate.h" +#include +#include +#include + +namespace gambatte +{ + +void LCD::reset(const unsigned char *const oamram, unsigned char const *vram, const bool cgb) +{ + ppu_.reset(oamram, vram, cgb); + lycIrq_.setCgb(cgb); + refreshPalettes(); +} + +static unsigned long mode2IrqSchedule(const unsigned statReg, const LyCounter &lyCounter, const unsigned long cycleCounter) +{ + if (!(statReg & 0x20)) + return disabled_time; + + unsigned next = lyCounter.time() - cycleCounter; + + if (lyCounter.ly() >= 143 || (lyCounter.ly() == 142 && next <= 4) || (statReg & 0x08)) + next += (153u - lyCounter.ly()) * lyCounter.lineTime(); + else + { + if (next <= 4) + next += lyCounter.lineTime(); + + next -= 4; + } + + return cycleCounter + next; +} + +static inline unsigned long m0IrqTimeFromXpos166Time( + const unsigned long xpos166Time, const bool cgb, const bool ds) +{ + return xpos166Time + cgb - ds; +} + +static inline unsigned long hdmaTimeFromM0Time( + const unsigned long m0Time, const bool ds) +{ + return m0Time + 1 - ds; +} + +static unsigned long nextHdmaTime(const unsigned long lastM0Time, + const unsigned long nextM0Time, const unsigned long cycleCounter, const bool ds) +{ + return cycleCounter < hdmaTimeFromM0Time(lastM0Time, ds) + ? hdmaTimeFromM0Time(lastM0Time, ds) + : hdmaTimeFromM0Time(nextM0Time, ds); +} + +void LCD::setStatePtrs(SaveState &state) +{ + state.ppu.bgpData.set( bgpData_, sizeof bgpData_); + state.ppu.objpData.set(objpData_, sizeof objpData_); + ppu_.setStatePtrs(state); +} + +void LCD::saveState(SaveState &state) const +{ + state.mem.hdmaTransfer = hdmaIsEnabled(); + state.ppu.nextM0Irq = eventTimes_(MODE0_IRQ) - ppu_.now(); + state.ppu.pendingLcdstatIrq = eventTimes_(ONESHOT_LCDSTATIRQ) != disabled_time; + + if (isCgb()) + std::memcpy(state.ppu.dmgPalette, dmgColorsGBC_, 8 * 3); + + + lycIrq_.saveState(state); + m0Irq_.saveState(state); + ppu_.saveState(state); +} + +void LCD::loadState(const SaveState &state, const unsigned char *const oamram) +{ + statReg_ = state.mem.ioamhram.get()[0x141]; + m2IrqStatReg_ = statReg_; + m1IrqStatReg_ = statReg_; + + ppu_.loadState(state, oamram); + lycIrq_.loadState(state); + m0Irq_.loadState(state); + + if (ppu_.lcdc() & 0x80) + { + nextM0Time_.predictNextM0Time(ppu_); + lycIrq_.reschedule(ppu_.lyCounter(), ppu_.now()); + + eventTimes_.setm(state.ppu.pendingLcdstatIrq + ? ppu_.now() + 1 : static_cast(disabled_time)); + eventTimes_.setm(state.ppu.oldWy != state.mem.ioamhram.get()[0x14A] + ? ppu_.now() + 1 : static_cast(disabled_time)); + eventTimes_.set(ppu_.lyCounter().time()); + eventTimes_.setm(SpriteMapper::schedule(ppu_.lyCounter(), ppu_.now())); + eventTimes_.setm(lycIrq_.time()); + eventTimes_.setm(ppu_.lyCounter().nextFrameCycle(144 * 456, ppu_.now())); + eventTimes_.setm(mode2IrqSchedule(statReg_, ppu_.lyCounter(), ppu_.now())); + eventTimes_.setm((statReg_ & 0x08) ? ppu_.now() + state.ppu.nextM0Irq : static_cast(disabled_time)); + eventTimes_.setm(state.mem.hdmaTransfer + ? nextHdmaTime(ppu_.lastM0Time(), nextM0Time_.predictedNextM0Time(), ppu_.now(), isDoubleSpeed()) + : static_cast(disabled_time)); + } + else + { + for (int i = 0; i < NUM_MEM_EVENTS; ++i) + eventTimes_.set(static_cast(i), disabled_time); + } + + if (isCgb()) + std::memcpy(dmgColorsGBC_, state.ppu.dmgPalette, 8 * 3); + + refreshPalettes(); +} + +void LCD::refreshPalettes() +{ + if (ppu_.cgb() && !ppu_.inDmgMode()) + { + for (unsigned i = 0; i < 8 * 8; i += 2) + { + ppu_.bgPalette()[i >> 1] = gbcToRgb32( bgpData_[i] | bgpData_[i + 1] << 8); + ppu_.spPalette()[i >> 1] = gbcToRgb32(objpData_[i] | objpData_[i + 1] << 8); + } + /* CGB mode: rebuild all 8 BG palette expansions, the CGB + * renderer's hot do-while indexes [nattrib & 7] per tile. */ + for (unsigned p = 0; p < 8; ++p) + ppu_.refreshBgPaletteExpansion(p); + } + else + { + if (ppu_.inDmgMode()) + { + for (unsigned i = 0; i < 8 * 3; i += 2) + dmgColorsRgb32_[i >> 1] = gbcToRgb32( dmgColorsGBC_[i] | dmgColorsGBC_[i + 1] << 8); + } + setDmgPalette(ppu_.bgPalette() , dmgColorsRgb32_ , bgpData_[0]); + setDmgPalette(ppu_.spPalette() , dmgColorsRgb32_ + 4, objpData_[0]); + setDmgPalette(ppu_.spPalette() + 4, dmgColorsRgb32_ + 8, objpData_[1]); + /* DMG mode: only palette 0 is used by doFullTilesUnrolledDmg. + * Rebuild slot 0; slots 1..7 are unused but stay zero-init. */ + ppu_.refreshBgPaletteExpansion(0); + } +} + +void LCD::resetCc(const unsigned long oldCc, const unsigned long newCc) +{ + update(oldCc); + ppu_.resetCc(oldCc, newCc); + + if (ppu_.lcdc() & 0x80) + { + const unsigned long dec = oldCc - newCc; + + nextM0Time_.invalidatePredictedNextM0Time(); + lycIrq_.reschedule(ppu_.lyCounter(), newCc); + + for (int i = 0; i < NUM_MEM_EVENTS; ++i) + { + if (eventTimes_(static_cast(i)) != disabled_time) + eventTimes_.set(static_cast(i), eventTimes_(static_cast(i)) - dec); + } + + eventTimes_.set(ppu_.lyCounter().time()); + } +} + +void LCD::speedChange(const unsigned long cycleCounter) +{ + update(cycleCounter); + ppu_.speedChange(cycleCounter); + + if (ppu_.lcdc() & 0x80) + { + nextM0Time_.predictNextM0Time(ppu_); + lycIrq_.reschedule(ppu_.lyCounter(), cycleCounter); + + eventTimes_.set(ppu_.lyCounter().time()); + eventTimes_.setm(SpriteMapper::schedule(ppu_.lyCounter(), cycleCounter)); + eventTimes_.setm(lycIrq_.time()); + eventTimes_.setm(ppu_.lyCounter().nextFrameCycle(144 * 456, cycleCounter)); + eventTimes_.setm(mode2IrqSchedule(statReg_, ppu_.lyCounter(), cycleCounter)); + + if (eventTimes_(MODE0_IRQ) != disabled_time && eventTimes_(MODE0_IRQ) - cycleCounter > 1) + eventTimes_.setm(m0IrqTimeFromXpos166Time(ppu_.predictedNextXposTime(166), ppu_.cgb(), isDoubleSpeed())); + + if (hdmaIsEnabled() && eventTimes_(HDMA_REQ) - cycleCounter > 1) + { + eventTimes_.setm(nextHdmaTime(ppu_.lastM0Time(), + nextM0Time_.predictedNextM0Time(), cycleCounter, isDoubleSpeed())); + } + } +} + +static inline unsigned long m0TimeOfCurrentLine(const unsigned long nextLyTime, + const unsigned long lastM0Time, const unsigned long nextM0Time) +{ + return nextM0Time < nextLyTime ? nextM0Time : lastM0Time; +} + +unsigned long LCD::m0TimeOfCurrentLine(const unsigned long cc) +{ + if (cc >= nextM0Time_.predictedNextM0Time()) + { + update(cc); + nextM0Time_.predictNextM0Time(ppu_); + } + + return gambatte::m0TimeOfCurrentLine(ppu_.lyCounter().time(), ppu_.lastM0Time(), nextM0Time_.predictedNextM0Time()); +} + +static bool isHdmaPeriod(const LyCounter &lyCounter, + const unsigned long m0TimeOfCurrentLy, const unsigned long cycleCounter) +{ + const unsigned timeToNextLy = lyCounter.time() - cycleCounter; + + return /*(ppu_.lcdc & 0x80) && */lyCounter.ly() < 144 && timeToNextLy > 4 + && cycleCounter >= hdmaTimeFromM0Time(m0TimeOfCurrentLy, lyCounter.isDoubleSpeed()); +} + +void LCD::enableHdma(const unsigned long cycleCounter) +{ + if (cycleCounter >= nextM0Time_.predictedNextM0Time()) + { + update(cycleCounter); + nextM0Time_.predictNextM0Time(ppu_); + } + else if (cycleCounter >= eventTimes_.nextEventTime()) + update(cycleCounter); + + if (isHdmaPeriod(ppu_.lyCounter(), + gambatte::m0TimeOfCurrentLine(ppu_.lyCounter().time(), + ppu_.lastM0Time(), nextM0Time_.predictedNextM0Time()), cycleCounter)) + eventTimes_.flagHdmaReq(); + + eventTimes_.setm(nextHdmaTime(ppu_.lastM0Time(), nextM0Time_.predictedNextM0Time(), cycleCounter, isDoubleSpeed())); +} + +void LCD::disableHdma(const unsigned long cycleCounter) +{ + if (cycleCounter >= eventTimes_.nextEventTime()) + update(cycleCounter); + + eventTimes_.setm(disabled_time); +} + +bool LCD::vramAccessible(const unsigned long cc) +{ + if (cc >= eventTimes_.nextEventTime()) + update(cc); + + return !(ppu_.lcdc() & 0x80) || ppu_.lyCounter().ly() >= 144 + || ppu_.lyCounter().lineCycles(cc) < 80U + || cc + isDoubleSpeed() - ppu_.cgb() + 2 >= m0TimeOfCurrentLine(cc); +} + +bool LCD::cgbpAccessible(const unsigned long cc) +{ + if (cc >= eventTimes_.nextEventTime()) + update(cc); + + return !(ppu_.lcdc() & 0x80) || ppu_.lyCounter().ly() >= 144 + || ppu_.lyCounter().lineCycles(cc) < 80U + isDoubleSpeed() + || cc >= m0TimeOfCurrentLine(cc) + 3 - isDoubleSpeed(); +} + +void LCD::doCgbBgColorChange(unsigned index, const unsigned data, const unsigned long cc) +{ + if (cgbpAccessible(cc)) + { + update(cc); + doCgbColorChange(bgpData_, ppu_.bgPalette(), index, data); + /* CGB BCPD writes one 16-bit colour entry at a time + * (palette[index >> 1] in doCgbColorChange). Each CGB palette + * has 4 entries x 2 bytes = 8 bytes, so the affected palette + * is (index >> 1) >> 2 = index >> 3. Only that slot needs + * its expansion rebuilt. */ + ppu_.refreshBgPaletteExpansion(index >> 3); + } +} + +void LCD::doCgbSpColorChange(unsigned index, const unsigned data, const unsigned long cc) +{ + if (cgbpAccessible(cc)) + { + update(cc); + doCgbColorChange(objpData_, ppu_.spPalette(), index, data); + } +} + +bool LCD::oamReadable(const unsigned long cc) +{ + if (!(ppu_.lcdc() & 0x80) || ppu_.inactivePeriodAfterDisplayEnable(cc)) + return true; + + if (cc >= eventTimes_.nextEventTime()) + update(cc); + + if (ppu_.lyCounter().lineCycles(cc) + 4 - ppu_.lyCounter().isDoubleSpeed() * 3u >= 456) + return ppu_.lyCounter().ly() >= 144-1 && ppu_.lyCounter().ly() != 153; + + return ppu_.lyCounter().ly() >= 144 || cc + isDoubleSpeed() - ppu_.cgb() + 2 >= m0TimeOfCurrentLine(cc); +} + +bool LCD::oamWritable(const unsigned long cc) +{ + if (!(ppu_.lcdc() & 0x80) || ppu_.inactivePeriodAfterDisplayEnable(cc)) + return true; + + if (cc >= eventTimes_.nextEventTime()) + update(cc); + + if (ppu_.lyCounter().lineCycles(cc) + 3 + ppu_.cgb() - ppu_.lyCounter().isDoubleSpeed() * 2u >= 456) + return ppu_.lyCounter().ly() >= 144-1 && ppu_.lyCounter().ly() != 153; + + return ppu_.lyCounter().ly() >= 144 || cc + isDoubleSpeed() - ppu_.cgb() + 2 >= m0TimeOfCurrentLine(cc); +} + +void LCD::mode3CyclesChange() +{ + nextM0Time_.invalidatePredictedNextM0Time(); + + if (eventTimes_(MODE0_IRQ) != disabled_time + && eventTimes_(MODE0_IRQ) > m0IrqTimeFromXpos166Time(ppu_.now(), ppu_.cgb(), isDoubleSpeed())) { + eventTimes_.setm(m0IrqTimeFromXpos166Time(ppu_.predictedNextXposTime(166), ppu_.cgb(), isDoubleSpeed())); + } + + if (eventTimes_(HDMA_REQ) != disabled_time + && eventTimes_(HDMA_REQ) > hdmaTimeFromM0Time(ppu_.lastM0Time(), isDoubleSpeed())) { + nextM0Time_.predictNextM0Time(ppu_); + eventTimes_.setm(hdmaTimeFromM0Time(nextM0Time_.predictedNextM0Time(), isDoubleSpeed())); + } +} + +void LCD::wxChange(const unsigned newValue, const unsigned long cycleCounter) +{ + update(cycleCounter + isDoubleSpeed() + 1); + ppu_.setWx(newValue); + mode3CyclesChange(); +} + +void LCD::wyChange(const unsigned newValue, const unsigned long cc) +{ + update(cc + 1); + ppu_.setWy(newValue); + // mode3CyclesChange(); // should be safe to wait until after wy2 delay, because no mode3 events are close to when wy1 is read. + + // wy2 is a delayed version of wy. really just slowness of ly == wy comparison. + if (ppu_.cgb() && (ppu_.lcdc() & 0x80)) { + eventTimes_.setm(cc + 5); + } else { + update(cc + 2); + ppu_.updateWy2(); + mode3CyclesChange(); + } +} + +void LCD::scxChange(const unsigned newScx, const unsigned long cycleCounter) { + update(cycleCounter + ppu_.cgb() + isDoubleSpeed()); + ppu_.setScx(newScx); + mode3CyclesChange(); +} + +void LCD::scyChange(const unsigned newValue, const unsigned long cycleCounter) { + update(cycleCounter + ppu_.cgb() + isDoubleSpeed()); + ppu_.setScy(newValue); +} + +void LCD::oamChange(const unsigned long cc) { + if (ppu_.lcdc() & 0x80) { + update(cc); + ppu_.oamChange(cc); + eventTimes_.setm(SpriteMapper::schedule(ppu_.lyCounter(), cc)); + } +} + +void LCD::oamChange(const unsigned char *const oamram, const unsigned long cc) { + update(cc); + ppu_.oamChange(oamram, cc); + + if (ppu_.lcdc() & 0x80) + eventTimes_.setm(SpriteMapper::schedule(ppu_.lyCounter(), cc)); +} + +void LCD::lcdcChange(const unsigned data, const unsigned long cc) { + const unsigned oldLcdc = ppu_.lcdc(); + update(cc); + + if ((oldLcdc ^ data) & 0x80) + { + ppu_.setLcdc(data, cc); + + if (data & 0x80) { + lycIrq_.lcdReset(); + m0Irq_.lcdReset(statReg_, lycIrq_.lycReg()); + + if (lycIrq_.lycReg() == 0 && (statReg_ & 0x40)) + eventTimes_.flagIrq(2); + + nextM0Time_.predictNextM0Time(ppu_); + lycIrq_.reschedule(ppu_.lyCounter(), cc); + + eventTimes_.set(ppu_.lyCounter().time()); + eventTimes_.setm(SpriteMapper::schedule(ppu_.lyCounter(), cc)); + eventTimes_.setm(lycIrq_.time()); + eventTimes_.setm(ppu_.lyCounter().nextFrameCycle(144 * 456, cc)); + eventTimes_.setm(mode2IrqSchedule(statReg_, ppu_.lyCounter(), cc)); + + if (statReg_ & 0x08) + eventTimes_.setm(m0IrqTimeFromXpos166Time(ppu_.predictedNextXposTime(166), ppu_.cgb(), isDoubleSpeed())); + + if (hdmaIsEnabled()) + eventTimes_.setm(nextHdmaTime(ppu_.lastM0Time(), + nextM0Time_.predictedNextM0Time(), cc, isDoubleSpeed())); + } + else + { + for (int i = 0; i < NUM_MEM_EVENTS; ++i) + eventTimes_.set(static_cast(i), disabled_time); + } + } + else if (data & 0x80) + { + if (ppu_.cgb()) + { + ppu_.setLcdc((oldLcdc & ~0x14) | (data & 0x14), cc); + + if ((oldLcdc ^ data) & 0x04) + eventTimes_.setm(SpriteMapper::schedule(ppu_.lyCounter(), cc)); + + update(cc + isDoubleSpeed() + 1); + ppu_.setLcdc(data, cc + isDoubleSpeed() + 1); + + if ((oldLcdc ^ data) & 0x20) + mode3CyclesChange(); + } + else + { + ppu_.setLcdc(data, cc); + + if ((oldLcdc ^ data) & 0x04) + eventTimes_.setm(SpriteMapper::schedule(ppu_.lyCounter(), cc)); + + if ((oldLcdc ^ data) & 0x22) + mode3CyclesChange(); + } + } + else + ppu_.setLcdc(data, cc); +} + +namespace { + struct LyCnt { + unsigned ly; int timeToNextLy; + LyCnt(unsigned ly, int timeToNextLy) : ly(ly), timeToNextLy(timeToNextLy) {} + }; + + static LyCnt const getLycCmpLy(LyCounter const &lyCounter, unsigned long cc) { + unsigned ly = lyCounter.ly(); + int timeToNextLy = lyCounter.time() - cc; + + if (ly == 153) + { + unsigned is_doublespeed = (unsigned)lyCounter.isDoubleSpeed(); + if (timeToNextLy - (448 << is_doublespeed) > 0) + timeToNextLy -= (448 << is_doublespeed); + else + { + ly = 0; + timeToNextLy += lyCounter.lineTime(); + } + } + return LyCnt(ly, timeToNextLy); + } +} + +void LCD::lcdstatChange(const unsigned data, const unsigned long cc) +{ + if (cc >= eventTimes_.nextEventTime()) + update(cc); + + const unsigned old = statReg_; + statReg_ = data; + lycIrq_.statRegChange(data, ppu_.lyCounter(), cc); + + if (ppu_.lcdc() & 0x80) + { + int const timeToNextLy = ppu_.lyCounter().time() - cc; + LyCnt const lycCmp = getLycCmpLy(ppu_.lyCounter(), cc); + + if (!ppu_.cgb()) + { + if (ppu_.lyCounter().ly() < 144) + { + if (cc + 1 < m0TimeOfCurrentLine(cc)) + { + if (lycCmp.ly == lycIrq_.lycReg() && !(old & 0x40)) + eventTimes_.flagIrq(2); + } + else + { + if (!(old & 0x08) && !(lycCmp.ly == lycIrq_.lycReg() && (old & 0x40))) + eventTimes_.flagIrq(2); + } + } + else + { + if (!(old & 0x10) && !(lycCmp.ly == lycIrq_.lycReg() && (old & 0x40))) + eventTimes_.flagIrq(2); + } + } + else if (data & ~old & 0x78) + { + bool const lycperiod = lycCmp.ly == lycIrq_.lycReg() && lycCmp.timeToNextLy > 4 - isDoubleSpeed() * 4; + + if (!(lycperiod && (old & 0x40))) + { + if (ppu_.lyCounter().ly() < 144) + { + if (cc + isDoubleSpeed() * 2 < m0TimeOfCurrentLine(cc) || timeToNextLy <= 4) + { + if (lycperiod && (data & 0x40)) + eventTimes_.flagIrq(2); + } + else if (!(old & 0x08)) + { + if ((data & 0x08) || (lycperiod && (data & 0x40))) + eventTimes_.flagIrq(2); + } + } + else if (!(old & 0x10)) + { + if ((data & 0x10) && (ppu_.lyCounter().ly() < 153 || timeToNextLy > 4 - isDoubleSpeed() * 4)) + { + eventTimes_.flagIrq(2); + } + else if (lycperiod && (data & 0x40)) + eventTimes_.flagIrq(2); + } + } + + if ((data & 0x28) == 0x20 && !(old & 0x20) + && ((timeToNextLy <= 4 && ppu_.lyCounter().ly() < 143) + || (timeToNextLy == 456*2 && ppu_.lyCounter().ly() < 144))) + { + eventTimes_.flagIrq(2); + } + } + + if ((data & 0x08) && eventTimes_(MODE0_IRQ) == disabled_time) + { + update(cc); + eventTimes_.setm(m0IrqTimeFromXpos166Time(ppu_.predictedNextXposTime(166), ppu_.cgb(), isDoubleSpeed())); + } + + eventTimes_.setm(mode2IrqSchedule(data, ppu_.lyCounter(), cc)); + eventTimes_.setm(lycIrq_.time()); + } + + m2IrqStatReg_ = eventTimes_(MODE2_IRQ) - cc > (ppu_.cgb() - isDoubleSpeed()) * 4U + ? data : (m2IrqStatReg_ & 0x10) | (statReg_ & ~0x10); + m1IrqStatReg_ = eventTimes_(MODE1_IRQ) - cc > (ppu_.cgb() - isDoubleSpeed()) * 4U + ? data : (m1IrqStatReg_ & 0x08) | (statReg_ & ~0x08); + + m0Irq_.statRegChange(data, eventTimes_(MODE0_IRQ), cc, ppu_.cgb()); +} + +void LCD::lycRegChange(const unsigned data, const unsigned long cc) +{ + unsigned const old = lycIrq_.lycReg(); + + if (data == old) + return; + + if (cc >= eventTimes_.nextEventTime()) + update(cc); + + m0Irq_.lycRegChange(data, eventTimes_(MODE0_IRQ), cc, isDoubleSpeed(), ppu_.cgb()); + lycIrq_.lycRegChange(data, ppu_.lyCounter(), cc); + + if (!(ppu_.lcdc() & 0x80)) + return; + + eventTimes_.setm(lycIrq_.time()); + + int const timeToNextLy = ppu_.lyCounter().time() - cc; + unsigned is_doublespeed = (unsigned)isDoubleSpeed(); + + if ((statReg_ & 0x40) && data < 154 + && (ppu_.lyCounter().ly() < 144 + ? !(statReg_ & 0x08) || cc < m0TimeOfCurrentLine(cc) || timeToNextLy <= 4 << ppu_.cgb() + : !(statReg_ & 0x10) || (ppu_.lyCounter().ly() == 153 && timeToNextLy <= 4 && ppu_.cgb() && !(bool)is_doublespeed))) + { + LyCnt lycCmp = getLycCmpLy(ppu_.lyCounter(), cc); + + if (lycCmp.timeToNextLy <= 4 << ppu_.cgb()) + { + lycCmp.ly = old != lycCmp.ly || (lycCmp.timeToNextLy <= 4 && ppu_.cgb() && !(bool)is_doublespeed) + ? (lycCmp.ly == 153 ? 0 : lycCmp.ly + 1) + : 0xFF; // simultaneous ly/lyc inc. lyc flag never goes low -> no trigger. + } + + if (data == lycCmp.ly) + { + if (ppu_.cgb() && !(bool)is_doublespeed) + eventTimes_.setm(cc + 5); + else + eventTimes_.flagIrq(2); + } + } +} + +unsigned LCD::getStat(const unsigned lycReg, const unsigned long cc) +{ + unsigned stat = 0; + + if (ppu_.lcdc() & 0x80) + { + if (cc >= eventTimes_.nextEventTime()) + update(cc); + + int const timeToNextLy = ppu_.lyCounter().time() - cc; + unsigned is_doublespeed = (unsigned)isDoubleSpeed(); + + if (ppu_.lyCounter().ly() > 143) + { + if (ppu_.lyCounter().ly() < 153 || timeToNextLy > 4 - is_doublespeed * 4) + stat = 1; + } + else + { + unsigned const lineCycles = 456 - (timeToNextLy >> is_doublespeed); + + if (lineCycles < 80) + { + if (!ppu_.inactivePeriodAfterDisplayEnable(cc)) + stat = 2; + } + else if (cc + is_doublespeed - ppu_.cgb() + 2 < m0TimeOfCurrentLine(cc)) + stat = 3; + } + + LyCnt const lycCmp = getLycCmpLy(ppu_.lyCounter(), cc); + + if (lycReg == lycCmp.ly && lycCmp.timeToNextLy > 4 - is_doublespeed * 4) + stat |= 4; + } + + return stat; +} + +inline void LCD::doMode2IrqEvent() +{ + const unsigned ly = eventTimes_(LY_COUNT) - eventTimes_(MODE2_IRQ) < 8 + ? (ppu_.lyCounter().ly() == 153 ? 0 : ppu_.lyCounter().ly() + 1) + : ppu_.lyCounter().ly(); + + if ((ly != 0 || !(m2IrqStatReg_ & 0x10)) && + (!(m2IrqStatReg_ & 0x40) || (lycIrq_.lycReg() != 0 ? ly != (lycIrq_.lycReg() + 1U) : ly > 1))) + eventTimes_.flagIrq(2); + + m2IrqStatReg_ = statReg_; + + if (!(statReg_ & 0x08)) + { + unsigned long nextTime = eventTimes_(MODE2_IRQ) + ppu_.lyCounter().lineTime(); + + if (ly == 0) + nextTime -= 4; + else if (ly == 143) + nextTime += ppu_.lyCounter().lineTime() * 10 + 4; + + eventTimes_.setm(nextTime); + } + else + eventTimes_.setm(eventTimes_(MODE2_IRQ) + (70224 << (unsigned)isDoubleSpeed())); +} + +inline void LCD::event() +{ + switch (eventTimes_.nextEvent()) + { + case MEM_EVENT: + switch (eventTimes_.nextMemEvent()) + { + case MODE1_IRQ: + eventTimes_.flagIrq((m1IrqStatReg_ & 0x18) == 0x10 ? 3 : 1); + m1IrqStatReg_ = statReg_; + eventTimes_.setm(eventTimes_(MODE1_IRQ) + (70224 << (unsigned)isDoubleSpeed())); + break; + + case LYC_IRQ: + { + unsigned char ifreg = 0; + lycIrq_.doEvent(&ifreg, ppu_.lyCounter()); + eventTimes_.flagIrq(ifreg); + eventTimes_.setm(lycIrq_.time()); + } + break; + case SPRITE_MAP: + eventTimes_.setm(ppu_.doSpriteMapEvent(eventTimes_(SPRITE_MAP))); + mode3CyclesChange(); + break; + case HDMA_REQ: + eventTimes_.flagHdmaReq(); + nextM0Time_.predictNextM0Time(ppu_); + eventTimes_.setm(hdmaTimeFromM0Time(nextM0Time_.predictedNextM0Time(), isDoubleSpeed())); + break; + case MODE2_IRQ: + doMode2IrqEvent(); + break; + case MODE0_IRQ: + { + unsigned char ifreg = 0; + m0Irq_.doEvent(&ifreg, ppu_.lyCounter().ly(), statReg_, lycIrq_.lycReg()); + eventTimes_.flagIrq(ifreg); + } + + eventTimes_.setm((statReg_ & 0x08) + ? m0IrqTimeFromXpos166Time(ppu_.predictedNextXposTime(166), ppu_.cgb(), isDoubleSpeed()) + : static_cast(disabled_time)); + break; + case ONESHOT_LCDSTATIRQ: + eventTimes_.flagIrq(2); + eventTimes_.setm(disabled_time); + break; + case ONESHOT_UPDATEWY2: + ppu_.updateWy2(); + mode3CyclesChange(); + eventTimes_.setm(disabled_time); + break; + } + break; + case LY_COUNT: + ppu_.doLyCountEvent(); + eventTimes_.set(ppu_.lyCounter().time()); + break; + } +} + +void LCD::update(const unsigned long cycleCounter) +{ + if (!(ppu_.lcdc() & 0x80)) + return; + + while (cycleCounter >= eventTimes_.nextEventTime()) + { + ppu_.update(eventTimes_.nextEventTime()); + event(); + } + + ppu_.update(cycleCounter); +} + +} diff --git a/src/games/gambatte/src/video.h b/src/games/gambatte/src/video.h new file mode 100644 index 0000000..0be2ad9 --- /dev/null +++ b/src/games/gambatte/src/video.h @@ -0,0 +1,244 @@ +/*************************************************************************** + * Copyright (C) 2007 by Sindre Aamås * + * aamas@stud.ntnu.no * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License version 2 as * + * published by the Free Software Foundation. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License version 2 for more details. * + * * + * You should have received a copy of the GNU General Public License * + * version 2 along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ +#ifndef VIDEO_H +#define VIDEO_H + +#include "interruptrequester.h" +#include "video/lyc_irq.h" +#include "video/m0_irq.h" +#include "video/next_m0_time.h" +#include "video/ppu.h" +#include + +namespace gambatte { + +class VideoInterruptRequester +{ + public: + explicit VideoInterruptRequester(InterruptRequester &intreq) : intreq_(intreq) {} + void flagHdmaReq() const { gambatte::flagHdmaReq(intreq_); } + void flagIrq(const unsigned bit) const { intreq_.flagIrq(bit); } + void setNextEventTime(const unsigned long time) const { intreq_.setEventTime(time); } + + private: + InterruptRequester &intreq_; +}; + +class LCD +{ + public: + LCD(const unsigned char *oamram, const unsigned char *vram_in, VideoInterruptRequester memEventRequester); + void reset(const unsigned char *oamram, unsigned char const *vram, bool cgb); + void setStatePtrs(SaveState &state); + void saveState(SaveState &state) const; + void loadState(const SaveState &state, const unsigned char *oamram); + void setDmgPaletteColor(unsigned palNum, unsigned colorNum, video_pixel_t rgb32); + void setVideoBuffer(video_pixel_t *videoBuf, int pitch); + void setDmgMode(bool mode) { ppu_.setDmgMode(mode); } + + void swapToDMG() { + ppu_.setDmgMode(true); + refreshPalettes(); + } + + void dmgBgPaletteChange(const unsigned data, const unsigned long cycleCounter) { + update(cycleCounter); + bgpData_[0] = data; + setDmgPalette(ppu_.bgPalette(), dmgColorsRgb32_, data); + ppu_.refreshBgPaletteExpansion(0); + } + + void dmgSpPalette1Change(const unsigned data, const unsigned long cycleCounter) { + update(cycleCounter); + objpData_[0] = data; + setDmgPalette(ppu_.spPalette(), dmgColorsRgb32_ + 4, data); + } + + void dmgSpPalette2Change(const unsigned data, const unsigned long cycleCounter) { + update(cycleCounter); + objpData_[1] = data; + setDmgPalette(ppu_.spPalette() + 4, dmgColorsRgb32_ + 8, data); + } + + void cgbBgColorChange(unsigned index, const unsigned data, const unsigned long cycleCounter) { + if (bgpData_[index] != data) { + doCgbBgColorChange(index, data, cycleCounter); + if(index < 8) + doCgbColorChange(dmgColorsGBC_, dmgColorsRgb32_, index, data); + } + } + + void cgbSpColorChange(unsigned index, const unsigned data, const unsigned long cycleCounter) { + if (objpData_[index] != data) { + doCgbSpColorChange(index, data, cycleCounter); + if(index < 8 * 2/*dmg has 2 sprite banks*/) + doCgbColorChange(dmgColorsGBC_ + 8, dmgColorsRgb32_ + 4, index, data); + } + } + + unsigned cgbBgColorRead(const unsigned index, const unsigned long cycleCounter) { + return (ppu_.cgb() & cgbpAccessible(cycleCounter)) ? bgpData_[index] : 0xFF; + } + + unsigned cgbSpColorRead(const unsigned index, const unsigned long cycleCounter) { + return (ppu_.cgb() & cgbpAccessible(cycleCounter)) ? objpData_[index] : 0xFF; + } + + void updateScreen(bool blanklcd, unsigned long cc); + void resetCc(unsigned long oldCC, unsigned long newCc); + void speedChange(unsigned long cycleCounter); + bool vramAccessible(unsigned long cycleCounter); + bool oamReadable(unsigned long cycleCounter); + bool oamWritable(unsigned long cycleCounter); + void wxChange(unsigned newValue, unsigned long cycleCounter); + void wyChange(unsigned newValue, unsigned long cycleCounter); + void oamChange(unsigned long cycleCounter); + void oamChange(const unsigned char *oamram, unsigned long cycleCounter); + void scxChange(unsigned newScx, unsigned long cycleCounter); + void scyChange(unsigned newValue, unsigned long cycleCounter); + + void vramChange(const unsigned long cycleCounter) { update(cycleCounter); } + + unsigned getStat(unsigned lycReg, unsigned long cycleCounter); + + unsigned getLyReg(const unsigned long cycleCounter) { + unsigned lyReg = 0; + + if (ppu_.lcdc() & 0x80) { + if (cycleCounter >= ppu_.lyCounter().time()) + update(cycleCounter); + + lyReg = ppu_.lyCounter().ly(); + + if (lyReg == 153) { + if (isDoubleSpeed()) { + if (ppu_.lyCounter().time() - cycleCounter <= 456 * 2 - 8) + lyReg = 0; + } else + lyReg = 0; + } else if (ppu_.lyCounter().time() - cycleCounter <= 4) + ++lyReg; + } + + return lyReg; + } + + unsigned long nextMode1IrqTime() const { return eventTimes_(MODE1_IRQ); } + + void lcdcChange(unsigned data, unsigned long cycleCounter); + void lcdstatChange(unsigned data, unsigned long cycleCounter); + void lycRegChange(unsigned data, unsigned long cycleCounter); + + void enableHdma(unsigned long cycleCounter); + void disableHdma(unsigned long cycleCounter); + bool hdmaIsEnabled() const { return eventTimes_(HDMA_REQ) != disabled_time; } + + void update(unsigned long cycleCounter); + + bool isCgb() const { return ppu_.cgb(); } + bool isDoubleSpeed() const { return ppu_.lyCounter().isDoubleSpeed(); } + + void setColorCorrection(bool colorCorrection); + void setColorCorrectionMode(unsigned colorCorrectionMode); + void setColorCorrectionBrightness(float colorCorrectionBrightness); + void setDarkFilterLevel(unsigned darkFilterLevel); + video_pixel_t gbcToRgb32(const unsigned bgr15); + private: + enum Event { MEM_EVENT, LY_COUNT }; enum { NUM_EVENTS = LY_COUNT + 1 }; + enum MemEvent { ONESHOT_LCDSTATIRQ, ONESHOT_UPDATEWY2, MODE1_IRQ, LYC_IRQ, SPRITE_MAP, + HDMA_REQ, MODE2_IRQ, MODE0_IRQ }; enum { NUM_MEM_EVENTS = MODE0_IRQ + 1 }; + + class EventTimes + { + public: + explicit EventTimes(const VideoInterruptRequester memEventRequester) : memEventRequester_(memEventRequester) {} + + Event nextEvent() const { return static_cast(eventMin_.min()); } + unsigned long nextEventTime() const { return eventMin_.minValue(); } + unsigned long operator()(const Event e) const { return eventMin_.value(e); } + template void set(const unsigned long time) { eventMin_.setValue(time); } + void set(const Event e, const unsigned long time) { eventMin_.setValue(e, time); } + + MemEvent nextMemEvent() const { return static_cast(memEventMin_.min()); } + unsigned long nextMemEventTime() const { return memEventMin_.minValue(); } + unsigned long operator()(const MemEvent e) const { return memEventMin_.value(e); } + template void setm(const unsigned long time) { memEventMin_.setValue(time); setMemEvent(); } + void set(const MemEvent e, const unsigned long time) { memEventMin_.setValue(e, time); setMemEvent(); } + + void flagIrq(const unsigned bit) { memEventRequester_.flagIrq(bit); } + void flagHdmaReq() { memEventRequester_.flagHdmaReq(); } + + private: + MinKeeper eventMin_; + MinKeeper memEventMin_; + VideoInterruptRequester memEventRequester_; + + void setMemEvent() { + const unsigned long nmet = nextMemEventTime(); + eventMin_.setValue(nmet); + memEventRequester_.setNextEventTime(nmet); + } + + }; + + PPU ppu_; + video_pixel_t dmgColorsRgb32_[3 * 4]; + unsigned char dmgColorsGBC_[3 * 8]; + unsigned char bgpData_[8 * 8]; + unsigned char objpData_[8 * 8]; + + EventTimes eventTimes_; + M0Irq m0Irq_; + LycIrq lycIrq_; + NextM0Time nextM0Time_; + + unsigned char statReg_; + unsigned char m2IrqStatReg_; + unsigned char m1IrqStatReg_; + + static void setDmgPalette(video_pixel_t *palette, const video_pixel_t *dmgColors, unsigned data); + void setDmgPaletteColor(unsigned index, video_pixel_t rgb32); + + void setDBuffer(); + void refreshPalettes(); + + void doMode2IrqEvent(); + void event(); + + unsigned long m0TimeOfCurrentLine(unsigned long cc); + bool cgbpAccessible(unsigned long cycleCounter); + + void mode3CyclesChange(); + void doCgbBgColorChange(unsigned index, unsigned data, unsigned long cycleCounter); + void doCgbSpColorChange(unsigned index, unsigned data, unsigned long cycleCounter); + + bool colorCorrection; + unsigned colorCorrectionMode; + float colorCorrectionBrightness; + unsigned darkFilterLevel; + void doCgbColorChange(unsigned char *const pdata, + video_pixel_t *const palette, unsigned index, const unsigned data); + + void darkenRgb(float &r, float &g, float &b); + +}; + +} + +#endif diff --git a/src/games/gambatte/src/video/lcddef.h b/src/games/gambatte/src/video/lcddef.h new file mode 100644 index 0000000..5fbf375 --- /dev/null +++ b/src/games/gambatte/src/video/lcddef.h @@ -0,0 +1,21 @@ +#ifndef LCDDEF_H +#define LCDDEF_H + +namespace gambatte { + +enum { lcdc_bgen = 0x01, + lcdc_objen = 0x02, + lcdc_obj2x = 0x04, + lcdc_tdsel = 0x10, + lcdc_we = 0x20, + lcdc_en = 0x80 }; + +enum { lcdstat_lycflag = 0x04, + lcdstat_m0irqen = 0x08, + lcdstat_m1irqen = 0x10, + lcdstat_m2irqen = 0x20, + lcdstat_lycirqen = 0x40 }; + +} + +#endif diff --git a/src/games/gambatte/src/video/ly_counter.cpp b/src/games/gambatte/src/video/ly_counter.cpp new file mode 100644 index 0000000..514d4ce --- /dev/null +++ b/src/games/gambatte/src/video/ly_counter.cpp @@ -0,0 +1,68 @@ +// +// Copyright (C) 2007 by sinamas +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License version 2 as +// published by the Free Software Foundation. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License version 2 for more details. +// +// You should have received a copy of the GNU General Public License +// version 2 along with this program; if not, write to the +// Free Software Foundation, Inc., +// 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +// + +#include "ly_counter.h" +#include "../savestate.h" + +namespace gambatte { + +LyCounter::LyCounter() +: time_(0) +, lineTime_(0) +, ly_(0) +, ds_(false) +{ + setDoubleSpeed(false); + reset(0, 0); +} + +void LyCounter::doEvent() { + ++ly_; + if (ly_ == 154) + ly_ = 0; + + time_ = time_ + lineTime_; +} + +unsigned long LyCounter::nextLineCycle(unsigned const lineCycle, unsigned long const cc) const { + unsigned long tmp = time_ + (lineCycle << (unsigned)ds_); + if (tmp - cc > lineTime_) + tmp -= lineTime_; + + return tmp; +} + +unsigned long LyCounter::nextFrameCycle(unsigned long const frameCycle, unsigned long const cc) const { + unsigned long tmp = time_ + (((153U - ly()) * 456U + frameCycle) << (unsigned)ds_); + if (tmp - cc > 70224U << (unsigned)ds_) + tmp -= 70224U << (unsigned)ds_; + + return tmp; +} + +void LyCounter::reset(unsigned long videoCycles, unsigned long lastUpdate) { + ly_ = videoCycles / 456; + time_ = lastUpdate + ((456 - (videoCycles - ly_ * 456ul)) << (unsigned)isDoubleSpeed()); +} + +void LyCounter::setDoubleSpeed(bool ds) { + ds_ = ds; + lineTime_ = 456U << (unsigned)ds; +} + +} diff --git a/src/games/gambatte/src/video/ly_counter.h b/src/games/gambatte/src/video/ly_counter.h new file mode 100644 index 0000000..b006815 --- /dev/null +++ b/src/games/gambatte/src/video/ly_counter.h @@ -0,0 +1,57 @@ +// +// Copyright (C) 2007 by sinamas +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License version 2 as +// published by the Free Software Foundation. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License version 2 for more details. +// +// You should have received a copy of the GNU General Public License +// version 2 along with this program; if not, write to the +// Free Software Foundation, Inc., +// 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +// + +#ifndef LY_COUNTER_H +#define LY_COUNTER_H + +namespace gambatte { + +struct SaveState; + +class LyCounter { +public: + LyCounter(); + void doEvent(); + bool isDoubleSpeed() const { return ds_; } + + unsigned long frameCycles(unsigned long cc) const { + return ly_ * 456ul + lineCycles(cc); + } + + unsigned lineCycles(unsigned long cc) const { + return 456u - ((time_ - cc) >> (unsigned)isDoubleSpeed()); + } + + unsigned lineTime() const { return lineTime_; } + unsigned ly() const { return ly_; } + unsigned long nextLineCycle(unsigned lineCycle, unsigned long cycleCounter) const; + unsigned long nextFrameCycle(unsigned long frameCycle, unsigned long cycleCounter) const; + void reset(unsigned long videoCycles, unsigned long lastUpdate); + void setDoubleSpeed(bool ds); + unsigned long time() const { return time_; } + +private: + unsigned long time_; + unsigned short lineTime_; + unsigned char ly_; + bool ds_; +}; + +} + +#endif diff --git a/src/games/gambatte/src/video/lyc_irq.cpp b/src/games/gambatte/src/video/lyc_irq.cpp new file mode 100644 index 0000000..3f04537 --- /dev/null +++ b/src/games/gambatte/src/video/lyc_irq.cpp @@ -0,0 +1,108 @@ +// +// Copyright (C) 2007 by sinamas +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License version 2 as +// published by the Free Software Foundation. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License version 2 for more details. +// +// You should have received a copy of the GNU General Public License +// version 2 along with this program; if not, write to the +// Free Software Foundation, Inc., +// 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +// + +#include "lyc_irq.h" +#include "counterdef.h" +#include "lcddef.h" +#include "ly_counter.h" +#include "savestate.h" +#include + +namespace gambatte { + +LycIrq::LycIrq() +: time_(disabled_time) +, lycRegSrc_(0) +, statRegSrc_(0) +, lycReg_(0) +, statReg_(0) +, cgb_(false) +{ +} + +static unsigned long schedule(unsigned statReg, + unsigned lycReg, LyCounter const &lyCounter, unsigned long cc) { + return (statReg & lcdstat_lycirqen) && lycReg < 154 + ? lyCounter.nextFrameCycle(lycReg ? lycReg * 456 : 153 * 456 + 8, cc) + : static_cast(disabled_time); +} + +void LycIrq::regChange(unsigned const statReg, + unsigned const lycReg, LyCounter const &lyCounter, unsigned long const cc) { + unsigned long const timeSrc = schedule(statReg, lycReg, lyCounter, cc); + statRegSrc_ = statReg; + lycRegSrc_ = lycReg; + time_ = std::min(time_, timeSrc); + + if (cgb_) { + if (time_ - cc > 8 || (timeSrc != time_ && time_ - cc > 4U - lyCounter.isDoubleSpeed() * 4U)) + lycReg_ = lycReg; + + if (time_ - cc > 4U - lyCounter.isDoubleSpeed() * 4U) + statReg_ = statReg; + } else { + if (time_ - cc > 4 || timeSrc != time_) + lycReg_ = lycReg; + + if (time_ - cc > 4 || lycReg_ != 0) + statReg_ = statReg; + + statReg_ = (statReg_ & lcdstat_lycirqen) | (statReg & ~lcdstat_lycirqen); + } +} + +static bool lycIrqBlockedByM2OrM1StatIrq(unsigned ly, unsigned statreg) { + return ly - 1u < 144u - 1u + ? statreg & lcdstat_m2irqen + : statreg & lcdstat_m1irqen; +} + +void LycIrq::doEvent(unsigned char *const ifreg, LyCounter const &lyCounter) { + if ((statReg_ | statRegSrc_) & lcdstat_lycirqen) { + unsigned cmpLy = lyCounter.time() - time_ < lyCounter.lineTime() ? 0 : lyCounter.ly(); + if (lycReg_ == cmpLy && !lycIrqBlockedByM2OrM1StatIrq(lycReg_, statReg_)) + *ifreg |= 2; + } + + lycReg_ = lycRegSrc_; + statReg_ = statRegSrc_; + time_ = schedule(statReg_, lycReg_, lyCounter, time_); +} + +void LycIrq::loadState(SaveState const &state) { + lycRegSrc_ = state.mem.ioamhram.get()[0x145]; + statRegSrc_ = state.mem.ioamhram.get()[0x141]; + lycReg_ = state.ppu.lyc; + statReg_ = statRegSrc_; +} + +void LycIrq::saveState(SaveState &state) const { + state.ppu.lyc = lycReg_; +} + +void LycIrq::reschedule(LyCounter const &lyCounter, unsigned long cc) { + time_ = std::min(schedule(statReg_ , lycReg_ , lyCounter, cc), + schedule(statRegSrc_, lycRegSrc_, lyCounter, cc)); +} + +void LycIrq::lcdReset() { + statReg_ = statRegSrc_; + lycReg_ = lycRegSrc_; +} + +} diff --git a/src/games/gambatte/src/video/lyc_irq.h b/src/games/gambatte/src/video/lyc_irq.h new file mode 100644 index 0000000..78850ac --- /dev/null +++ b/src/games/gambatte/src/video/lyc_irq.h @@ -0,0 +1,61 @@ +// +// Copyright (C) 2007 by sinamas +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License version 2 as +// published by the Free Software Foundation. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License version 2 for more details. +// +// You should have received a copy of the GNU General Public License +// version 2 along with this program; if not, write to the +// Free Software Foundation, Inc., +// 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +// + +#ifndef VIDEO_LYC_IRQ_H +#define VIDEO_LYC_IRQ_H + +namespace gambatte { + +struct SaveState; +class LyCounter; + +class LycIrq { +public: + LycIrq(); + void doEvent(unsigned char *ifreg, LyCounter const &lyCounter); + unsigned lycReg() const { return lycRegSrc_; } + void loadState(SaveState const &state); + void saveState(SaveState &state) const; + unsigned long time() const { return time_; } + void setCgb(bool cgb) { cgb_ = cgb; } + void lcdReset(); + void reschedule(LyCounter const &lyCounter, unsigned long cc); + + void statRegChange(unsigned statReg, LyCounter const &lyCounter, unsigned long cc) { + regChange(statReg, lycRegSrc_, lyCounter, cc); + } + + void lycRegChange(unsigned lycReg, LyCounter const &lyCounter, unsigned long cc) { + regChange(statRegSrc_, lycReg, lyCounter, cc); + } + +private: + unsigned long time_; + unsigned char lycRegSrc_; + unsigned char statRegSrc_; + unsigned char lycReg_; + unsigned char statReg_; + bool cgb_; + + void regChange(unsigned statReg, unsigned lycReg, + LyCounter const &lyCounter, unsigned long cc); +}; + +} + +#endif diff --git a/src/games/gambatte/src/video/m0_irq.h b/src/games/gambatte/src/video/m0_irq.h new file mode 100644 index 0000000..f07f62f --- /dev/null +++ b/src/games/gambatte/src/video/m0_irq.h @@ -0,0 +1,63 @@ +#ifndef M0_IRQ_H +#define M0_IRQ_H + +#include "lcddef.h" +#include "../savestate.h" + +namespace gambatte { + +class M0Irq { +public: + M0Irq() + : statReg_(0) + , lycReg_(0) + { + } + + void lcdReset(unsigned statReg, unsigned lycReg) { + statReg_ = statReg; + lycReg_ = lycReg; + } + + void statRegChange(unsigned statReg, + unsigned long nextM0IrqTime, unsigned long cc, bool cgb) { + if (nextM0IrqTime - cc > cgb * 2U) + statReg_ = statReg; + } + + void lycRegChange(unsigned lycReg, + unsigned long nextM0IrqTime, unsigned long cc, + bool ds, bool cgb) { + if (nextM0IrqTime - cc > cgb * 5 + 1U - ds) + lycReg_ = lycReg; + } + + void doEvent(unsigned char *ifreg, unsigned ly, unsigned statReg, unsigned lycReg) { + if (((statReg_ | statReg) & lcdstat_m0irqen) + && (!(statReg_ & lcdstat_lycirqen) || ly != lycReg_)) { + *ifreg |= 2; + } + + statReg_ = statReg; + lycReg_ = lycReg; + } + + void saveState(SaveState &state) const { + state.ppu.m0lyc = lycReg_; + } + + void loadState(SaveState const &state) { + lycReg_ = state.ppu.m0lyc; + statReg_ = state.mem.ioamhram.get()[0x141]; + } + + unsigned statReg() const { return statReg_; } + +private: + unsigned char statReg_; + unsigned char lycReg_; +}; + +} + +#endif diff --git a/src/games/gambatte/src/video/next_m0_time.cpp b/src/games/gambatte/src/video/next_m0_time.cpp new file mode 100644 index 0000000..bf382c3 --- /dev/null +++ b/src/games/gambatte/src/video/next_m0_time.cpp @@ -0,0 +1,6 @@ +#include "next_m0_time.h" +#include "ppu.h" + +void gambatte::NextM0Time::predictNextM0Time(PPU const &ppu) { + predictedNextM0Time_ = ppu.predictedNextXposTime(167); +} diff --git a/src/games/gambatte/src/video/next_m0_time.h b/src/games/gambatte/src/video/next_m0_time.h new file mode 100644 index 0000000..5cea59d --- /dev/null +++ b/src/games/gambatte/src/video/next_m0_time.h @@ -0,0 +1,19 @@ +#ifndef NEXT_M0_TIME_H_ +#define NEXT_M0_TIME_H_ + +namespace gambatte { + +class NextM0Time { +public: + NextM0Time() : predictedNextM0Time_(0) {} + void predictNextM0Time(class PPU const &v); + void invalidatePredictedNextM0Time() { predictedNextM0Time_ = 0; } + unsigned predictedNextM0Time() const { return predictedNextM0Time_; } + +private: + unsigned predictedNextM0Time_; +}; + +} + +#endif diff --git a/src/games/gambatte/src/video/ppu.cpp b/src/games/gambatte/src/video/ppu.cpp new file mode 100644 index 0000000..9144954 --- /dev/null +++ b/src/games/gambatte/src/video/ppu.cpp @@ -0,0 +1,1771 @@ +// +// Copyright (C) 2010 by sinamas +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License version 2 as +// published by the Free Software Foundation. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License version 2 for more details. +// +// You should have received a copy of the GNU General Public License +// version 2 along with this program; if not, write to the +// Free Software Foundation, Inc., +// 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +// + +#include "ppu.h" +#include "savestate.h" +#include +#include +#include + +namespace { + +using namespace gambatte; + +#define PREP(u8) (((u8) << 7 & 0x80) | ((u8) << 5 & 0x40) | ((u8) << 3 & 0x20) | ((u8) << 1 & 0x10) \ + | ((u8) >> 1 & 0x08) | ((u8) >> 3 & 0x04) | ((u8) >> 5 & 0x02) | ((u8) >> 7 & 0x01)) + +#define EXPAND(u8) ((PREP(u8) << 7 & 0x4000) | (PREP(u8) << 6 & 0x1000) \ + | (PREP(u8) << 5 & 0x0400) | (PREP(u8) << 4 & 0x0100) \ + | (PREP(u8) << 3 & 0x0040) | (PREP(u8) << 2 & 0x0010) \ + | (PREP(u8) << 1 & 0x0004) | (PREP(u8) & 0x0001)) + +#define EXPAND_ROW(n) EXPAND((n)|0x0), EXPAND((n)|0x1), EXPAND((n)|0x2), EXPAND((n)|0x3), \ + EXPAND((n)|0x4), EXPAND((n)|0x5), EXPAND((n)|0x6), EXPAND((n)|0x7), \ + EXPAND((n)|0x8), EXPAND((n)|0x9), EXPAND((n)|0xA), EXPAND((n)|0xB), \ + EXPAND((n)|0xC), EXPAND((n)|0xD), EXPAND((n)|0xE), EXPAND((n)|0xF) + +#define EXPAND_TABLE EXPAND_ROW(0x00), EXPAND_ROW(0x10), EXPAND_ROW(0x20), EXPAND_ROW(0x30), \ + EXPAND_ROW(0x40), EXPAND_ROW(0x50), EXPAND_ROW(0x60), EXPAND_ROW(0x70), \ + EXPAND_ROW(0x80), EXPAND_ROW(0x90), EXPAND_ROW(0xA0), EXPAND_ROW(0xB0), \ + EXPAND_ROW(0xC0), EXPAND_ROW(0xD0), EXPAND_ROW(0xE0), EXPAND_ROW(0xF0) + +static unsigned short const expand_lut[0x200] = { + EXPAND_TABLE, + +#undef PREP +#define PREP(u8) (u8) + + EXPAND_TABLE +}; + +#undef EXPAND_TABLE +#undef EXPAND_ROW +#undef EXPAND +#undef PREP + +#define DECLARE_FUNC(n, id) \ + enum { ID##n = id }; \ + static void f##n (PPUPriv &); \ + static unsigned predictCyclesUntilXpos_f##n (PPUPriv const &, int targetxpos, unsigned cycles); \ + static PPUState const f##n##_ = { f##n, predictCyclesUntilXpos_f##n, ID##n } + +namespace M2_Ly0 { DECLARE_FUNC(0, 0); } +namespace M2_LyNon0 { DECLARE_FUNC(0, 0); DECLARE_FUNC(1, 0); } +namespace M3Start { DECLARE_FUNC(0, 0); DECLARE_FUNC(1, 0); } +namespace M3Loop { +namespace Tile { + DECLARE_FUNC(0, 0x80); + DECLARE_FUNC(1, 0x81); + DECLARE_FUNC(2, 0x82); + DECLARE_FUNC(3, 0x83); + DECLARE_FUNC(4, 0x84); + DECLARE_FUNC(5, 0x85); +} +namespace LoadSprites { + DECLARE_FUNC(0, 0x88); + DECLARE_FUNC(1, 0x89); + DECLARE_FUNC(2, 0x8A); + DECLARE_FUNC(3, 0x8B); + DECLARE_FUNC(4, 0x8C); + DECLARE_FUNC(5, 0x8D); +} +namespace StartWindowDraw { + DECLARE_FUNC(0, 0x90); + DECLARE_FUNC(1, 0x91); + DECLARE_FUNC(2, 0x92); + DECLARE_FUNC(3, 0x93); + DECLARE_FUNC(4, 0x94); + DECLARE_FUNC(5, 0x95); +} +} // namespace M3Loop + +#undef DECLARE_FUNC + +enum { win_draw_start = 1, win_draw_started = 2 }; +enum { m2_ds_offset = 3 }; +enum { max_m3start_cycles = 80 }; +enum { attr_yflip = 0x40, attr_bgpriority = 0x80 }; + +static inline int lcdcEn( PPUPriv const &p) { return p.lcdc & lcdc_en; } +static inline int lcdcWinEn(PPUPriv const &p) { return p.lcdc & lcdc_we; } +static inline int lcdcObj2x(PPUPriv const &p) { return p.lcdc & lcdc_obj2x; } +static inline int lcdcObjEn(PPUPriv const &p) { return p.lcdc & lcdc_objen; } +static inline int lcdcBgEn( PPUPriv const &p) { return p.lcdc & lcdc_bgen; } + +static inline int weMasterCheckPriorToLyIncLineCycle(bool cgb) { return 450 - cgb; } +static inline int weMasterCheckAfterLyIncLineCycle(bool cgb) { return 454 - cgb; } +static inline int m3StartLineCycle(bool /*cgb*/) { return 83; } + +static inline void nextCall(int const cycles, PPUState const &state, PPUPriv &p) { + int const c = p.cycles - cycles; + if (c >= 0) { + p.cycles = c; + return state.f(p); + } + + p.cycles = c; + p.nextCallPtr = &state; +} + +namespace M2_Ly0 { + static void f0(PPUPriv &p) { + p.weMaster = lcdcWinEn(p) && 0 == p.wy; + p.winYPos = 0xFF; + nextCall(m3StartLineCycle(p.cgb), M3Start::f0_, p); + } +} + +namespace M2_LyNon0 { + static void f0(PPUPriv &p) { + p.weMaster |= lcdcWinEn(p) && p.lyCounter.ly() == p.wy; + nextCall( weMasterCheckAfterLyIncLineCycle(p.cgb) + - weMasterCheckPriorToLyIncLineCycle(p.cgb), f1_, p); + } + + static void f1(PPUPriv &p) { + p.weMaster |= lcdcWinEn(p) && p.lyCounter.ly() + 1 == p.wy; + nextCall(456 - weMasterCheckAfterLyIncLineCycle(p.cgb) + m3StartLineCycle(p.cgb), + M3Start::f0_, p); + } +} + +static int loadTileDataByte0(PPUPriv const &p) { + unsigned const yoffset = (p.winDrawState & win_draw_started) + ? p.winYPos + : p.scy + p.lyCounter.ly(); + + return p.vram[0x1000 + (p.nattrib << 10 & 0x2000) + - ((p.reg1 * 32 | p.lcdc << 8) & 0x1000) + + p.reg1 * 16 + + ((-(p.nattrib >> 6 & 1) ^ yoffset) & 7) * 2]; +} + +static int loadTileDataByte1(PPUPriv const &p) { + unsigned const yoffset = (p.winDrawState & win_draw_started) + ? p.winYPos + : p.scy + p.lyCounter.ly(); + + return p.vram[0x1000 + (p.nattrib << 10 & 0x2000) + - ((p.reg1 * 32 | p.lcdc << 8) & 0x1000) + + p.reg1 * 16 + + ((-(p.nattrib >> 6 & 1) ^ yoffset) & 7) * 2 + 1]; +} + +namespace M3Start { + static void f0(PPUPriv &p) { + p.xpos = 0; + + if ((p.winDrawState & win_draw_start) && lcdcWinEn(p)) { + p.winDrawState = win_draw_started; + p.wscx = 8 + (p.scx & 7); + ++p.winYPos; + } else + p.winDrawState = 0; + + p.nextCallPtr = &f1_; + f1(p); + } + + static void f1(PPUPriv &p) { + while (p.xpos < max_m3start_cycles) { + if ((p.xpos & 7) == (p.scx & 7)) + break; + + switch (p.xpos & 7) { + case 0: + if (p.winDrawState & win_draw_started) { + p.reg1 = p.vram[(p.lcdc << 4 & 0x400) + (p.winYPos & 0xF8) * 4 + + (p.wscx >> 3 & 0x1F) + 0x1800]; + p.nattrib = p.vram[(p.lcdc << 4 & 0x400) + (p.winYPos & 0xF8) * 4 + + (p.wscx >> 3 & 0x1F) + 0x3800]; + } else { + p.reg1 = p.vram[((p.lcdc << 7 | p.scx >> 3) & 0x41F) + + ((p.scy + p.lyCounter.ly()) & 0xF8) * 4 + 0x1800]; + p.nattrib = p.vram[((p.lcdc << 7 | p.scx >> 3) & 0x41F) + + ((p.scy + p.lyCounter.ly()) & 0xF8) * 4 + 0x3800]; + } + + break; + case 2: + p.reg0 = loadTileDataByte0(p); + break; + case 4: + { + int const r1 = loadTileDataByte1(p); + p.ntileword = (expand_lut + (p.nattrib << 3 & 0x100))[p.reg0] + + (expand_lut + (p.nattrib << 3 & 0x100))[r1 ] * 2; + } + + break; + } + + ++p.xpos; + + if (--p.cycles < 0) + return; + } + + { + unsigned const ly = p.lyCounter.ly(); + unsigned const numSprites = p.spriteMapper.numSprites(ly); + unsigned char const *const sprites = p.spriteMapper.sprites(ly); + + for (unsigned i = 0; i < numSprites; ++i) { + unsigned pos = sprites[i]; + unsigned spy = p.spriteMapper.posbuf()[pos ]; + unsigned spx = p.spriteMapper.posbuf()[pos+1]; + + p.spriteList[i].spx = spx; + p.spriteList[i].line = ly + 16u - spy; + p.spriteList[i].oampos = pos * 2; + p.spwordList[i] = 0; + } + + p.spriteList[numSprites].spx = 0xFF; + p.nextSprite = 0; + } + + p.xpos = 0; + p.endx = 8 - (p.scx & 7); + + static PPUState const *const flut[8] = { + &M3Loop::Tile::f0_, + &M3Loop::Tile::f1_, + &M3Loop::Tile::f2_, + &M3Loop::Tile::f3_, + &M3Loop::Tile::f4_, + &M3Loop::Tile::f5_, + &M3Loop::Tile::f5_, + &M3Loop::Tile::f5_ + }; + + nextCall(1-p.cgb, *flut[p.scx & 7], p); + } +} + +namespace M3Loop { + +static void doFullTilesUnrolledDmg(PPUPriv &p, int const xend, video_pixel_t *const dbufline, + unsigned char const *const tileMapLine, unsigned const tileline, unsigned tileMapXpos) { + unsigned const tileIndexSign = ~p.lcdc << 3 & 0x80; + unsigned char const *const tileDataLine = p.vram + tileIndexSign * 32 + tileline * 2; + int xpos = p.xpos; + + do { + int nextSprite = p.nextSprite; + + if (int(p.spriteList[nextSprite].spx) < xpos + 8) { + int cycles = p.cycles - 8; + + if (lcdcObjEn(p)) { + cycles -= std::max(11 - (int(p.spriteList[nextSprite].spx) - xpos), 6); + + for (unsigned i = nextSprite + 1; int(p.spriteList[i].spx) < xpos + 8; ++i) + cycles -= 6; + + if (cycles < 0) + break; + + p.cycles = cycles; + + do { + unsigned char const *const oam = p.spriteMapper.oamram(); + unsigned reg0, reg1 = oam[p.spriteList[nextSprite].oampos + 2] * 16; + unsigned const attrib = oam[p.spriteList[nextSprite].oampos + 3]; + unsigned const spline = ( (attrib & attr_yflip) + ? p.spriteList[nextSprite].line ^ 15 + : p.spriteList[nextSprite].line ) * 2; + + reg0 = p.vram[(lcdcObj2x(p) ? (reg1 & ~16) | spline : reg1 | (spline & ~16)) ]; + reg1 = p.vram[(lcdcObj2x(p) ? (reg1 & ~16) | spline : reg1 | (spline & ~16)) + 1]; + + p.spwordList[nextSprite] = expand_lut[reg0 + (attrib << 3 & 0x100)] + + expand_lut[reg1 + (attrib << 3 & 0x100)] * 2; + p.spriteList[nextSprite].attrib = attrib; + ++nextSprite; + } while (int(p.spriteList[nextSprite].spx) < xpos + 8); + } else { + if (cycles < 0) + break; + + p.cycles = cycles; + + do { + ++nextSprite; + } while (int(p.spriteList[nextSprite].spx) < xpos + 8); + } + + p.nextSprite = nextSprite; + } else if (nextSprite-1 < 0 || int(p.spriteList[nextSprite-1].spx) <= xpos - 8) { + if (!(p.cycles & ~7)) + break; + + int n = (( xend + 7 < int(p.spriteList[nextSprite].spx) + ? xend + 7 : int(p.spriteList[nextSprite].spx)) - xpos) & ~7; + n = (p.cycles & ~7) < n ? p.cycles & ~7 : n; + p.cycles -= n; + + unsigned ntileword = p.ntileword; + video_pixel_t * dst = dbufline + xpos - 8; + video_pixel_t *const dstend = dst + n; + xpos += n; + + if (!lcdcBgEn(p)) { + do { *dst++ = p.bgPalette[0]; } while (dst != dstend); + tileMapXpos += n >> 3; + + unsigned const tno = tileMapLine[(tileMapXpos - 1) & 0x1F]; + ntileword = expand_lut[(tileDataLine + tno * 16 - (tno & tileIndexSign) * 32)[0]] + + expand_lut[(tileDataLine + tno * 16 - (tno & tileIndexSign) * 32)[1]] * 2; + } else do { + /* DMG fast path: a precomputed expansion of + * bgPalette[0..3] (slot 0 of bgPaletteExpanded) + * turns the 8-dependent-load gather (gcc 13 -O3 + * refuses to vectorise -- SSE2 has no u32 gather, + * so the missed log shows + * "no vectype for stmt: _ = bgPalette[_];" at every + * call site) into two 16-byte memcpys. The + * expansion is rebuilt by LCD on every BG palette + * write via refreshBgPaletteExpansion(0). */ + { + unsigned const lo = ntileword & 0xFF; + unsigned const hi = ntileword >> 8; + std::memcpy(&dst[0], p.bgPaletteExpanded[0][lo], 4 * sizeof(video_pixel_t)); + std::memcpy(&dst[4], p.bgPaletteExpanded[0][hi], 4 * sizeof(video_pixel_t)); + } + dst += 8; + + unsigned const tno = tileMapLine[tileMapXpos & 0x1F]; + tileMapXpos = (tileMapXpos & 0x1F) + 1; + ntileword = expand_lut[(tileDataLine + tno * 16 - (tno & tileIndexSign) * 32)[0]] + + expand_lut[(tileDataLine + tno * 16 - (tno & tileIndexSign) * 32)[1]] * 2; + } while (dst != dstend); + + p.ntileword = ntileword; + continue; + } else { + int cycles = p.cycles - 8; + if (cycles < 0) + break; + + p.cycles = cycles; + } + + { + video_pixel_t *const dst = dbufline + (xpos - 8); + unsigned const tileword = -(p.lcdc & 1U) & p.ntileword; + + dst[0] = p.bgPalette[ tileword & 0x0003 ]; + dst[1] = p.bgPalette[(tileword & 0x000C) >> 2]; + dst[2] = p.bgPalette[(tileword & 0x0030) >> 4]; + dst[3] = p.bgPalette[(tileword & 0x00C0) >> 6]; + dst[4] = p.bgPalette[(tileword & 0x0300) >> 8]; + dst[5] = p.bgPalette[(tileword & 0x0C00) >> 10]; + dst[6] = p.bgPalette[(tileword & 0x3000) >> 12]; + dst[7] = p.bgPalette[ tileword >> 14]; + + int i = nextSprite - 1; + + if (!lcdcObjEn(p)) { + do { + int pos = int(p.spriteList[i].spx) - xpos; + p.spwordList[i] >>= pos * 2 >= 0 ? 16 - pos * 2 : 16 + pos * 2; + --i; + } while (i >= 0 && int(p.spriteList[i].spx) > xpos - 8); + } else { + do { + int n; + int pos = int(p.spriteList[i].spx) - xpos; + if (pos < 0) { + n = pos + 8; + pos = 0; + } else + n = 8 - pos; + + unsigned const attrib = p.spriteList[i].attrib; + unsigned spword = p.spwordList[i]; + video_pixel_t const *const spPalette = p.spPalette + (attrib >> 2 & 4); + video_pixel_t *d = dst + pos; + + if (!(attrib & attr_bgpriority)) { + switch (n) { + case 8: if (spword >> 14 ) { d[7] = spPalette[spword >> 14 ]; } + case 7: if (spword >> 12 & 3) { d[6] = spPalette[spword >> 12 & 3]; } + case 6: if (spword >> 10 & 3) { d[5] = spPalette[spword >> 10 & 3]; } + case 5: if (spword >> 8 & 3) { d[4] = spPalette[spword >> 8 & 3]; } + case 4: if (spword >> 6 & 3) { d[3] = spPalette[spword >> 6 & 3]; } + case 3: if (spword >> 4 & 3) { d[2] = spPalette[spword >> 4 & 3]; } + case 2: if (spword >> 2 & 3) { d[1] = spPalette[spword >> 2 & 3]; } + case 1: if (spword & 3) { d[0] = spPalette[spword & 3]; } + } + + spword >>= n * 2; + + /*do { + if (spword & 3) + dst[pos] = spPalette[spword & 3]; + + spword >>= 2; + ++pos; + } while (--n);*/ + } else { + unsigned tw = tileword >> pos * 2; + d += n; + n = -n; + + do + { + if (spword & 3) + { + d[n] = (tw & 3) + ? p.bgPalette[ tw & 3] + : spPalette[spword & 3]; + } + + spword >>= 2; + tw >>= 2; + } while (++n); + } + + p.spwordList[i] = spword; + --i; + } while (i >= 0 && int(p.spriteList[i].spx) > xpos - 8); + } + } + + unsigned const tno = tileMapLine[tileMapXpos & 0x1F]; + tileMapXpos = (tileMapXpos & 0x1F) + 1; + p.ntileword = expand_lut[(tileDataLine + tno * 16 - (tno & tileIndexSign) * 32)[0]] + + expand_lut[(tileDataLine + tno * 16 - (tno & tileIndexSign) * 32)[1]] * 2; + + xpos = xpos + 8; + } while (xpos < xend); + + p.xpos = xpos; +} + +static void doFullTilesUnrolledCgb(PPUPriv &p, int const xend, video_pixel_t *const dbufline, + unsigned char const *const tileMapLine, unsigned const tileline, unsigned tileMapXpos) { + int xpos = p.xpos; + unsigned char const *const vram = p.vram; + unsigned const tdoffset = tileline * 2 + (~p.lcdc & 0x10) * 0x100; + + do { + int nextSprite = p.nextSprite; + + if (int(p.spriteList[nextSprite].spx) < xpos + 8) { + int cycles = p.cycles - 8; + cycles -= std::max(11 - (int(p.spriteList[nextSprite].spx) - xpos), 6); + + for (unsigned i = nextSprite + 1; int(p.spriteList[i].spx) < xpos + 8; ++i) + cycles -= 6; + + if (cycles < 0) + break; + + p.cycles = cycles; + + do { + unsigned char const *const oam = p.spriteMapper.oamram(); + unsigned reg0, reg1 = oam[p.spriteList[nextSprite].oampos + 2] * 16; + unsigned const attrib = oam[p.spriteList[nextSprite].oampos + 3]; + unsigned const spline = ( (attrib & attr_yflip) + ? p.spriteList[nextSprite].line ^ 15 + : p.spriteList[nextSprite].line ) * 2; + + reg0 = vram[(attrib << 10 & 0x2000) + + (lcdcObj2x(p) ? (reg1 & ~16) | spline : reg1 | (spline & ~16)) ]; + reg1 = vram[(attrib << 10 & 0x2000) + + (lcdcObj2x(p) ? (reg1 & ~16) | spline : reg1 | (spline & ~16)) + 1]; + + p.spwordList[nextSprite] = expand_lut[reg0 + (attrib << 3 & 0x100)] + + expand_lut[reg1 + (attrib << 3 & 0x100)] * 2; + p.spriteList[nextSprite].attrib = attrib; + ++nextSprite; + } while (int(p.spriteList[nextSprite].spx) < xpos + 8); + + p.nextSprite = nextSprite; + } else if (nextSprite-1 < 0 || int(p.spriteList[nextSprite-1].spx) <= xpos - 8) { + if (!(p.cycles & ~7)) + break; + + int n = (( xend + 7 < int(p.spriteList[nextSprite].spx) + ? xend + 7 : int(p.spriteList[nextSprite].spx)) - xpos) & ~7; + n = (p.cycles & ~7) < n ? p.cycles & ~7 : n; + p.cycles -= n; + + unsigned ntileword = p.ntileword; + unsigned nattrib = p.nattrib; + video_pixel_t * dst = dbufline + xpos - 8; + video_pixel_t *const dstend = dst + n; + xpos += n; + + do { + /* CGB fast path: same precomputed expansion as the + * DMG path above, but the per-tile palette is + * selected by the attribute byte's low 3 bits. + * Each frame typically activates only a few + * palettes, so the hot working set stays well + * inside L1 even though the full table is 32 KiB + * (u32 build). */ + { + unsigned const lo = ntileword & 0xFF; + unsigned const hi = ntileword >> 8; + std::memcpy(&dst[0], p.bgPaletteExpanded[nattrib & 7][lo], 4 * sizeof(video_pixel_t)); + std::memcpy(&dst[4], p.bgPaletteExpanded[nattrib & 7][hi], 4 * sizeof(video_pixel_t)); + } + dst += 8; + + unsigned const tno = tileMapLine[ tileMapXpos & 0x1F ]; + nattrib = tileMapLine[(tileMapXpos & 0x1F) + 0x2000]; + tileMapXpos = (tileMapXpos & 0x1F) + 1; + + unsigned const tdo = (tdoffset & ~(tno << 5)); + unsigned char const *const td = vram + tno * 16 + + ((nattrib & attr_yflip) ? tdo ^ 14 : tdo) + + (nattrib << 10 & 0x2000); + unsigned short const *const explut = expand_lut + (nattrib << 3 & 0x100); + ntileword = explut[td[0]] + explut[td[1]] * 2; + } while (dst != dstend); + + p.ntileword = ntileword; + p.nattrib = nattrib; + continue; + } else { + int cycles = p.cycles - 8; + + if (cycles < 0) + break; + + p.cycles = cycles; + } + + { + video_pixel_t *const dst = dbufline + (xpos - 8); + unsigned const tileword = p.ntileword; + unsigned const attrib = p.nattrib; + video_pixel_t const *const bgPalette = p.bgPalette + (attrib & 7) * 4; + + dst[0] = bgPalette[ tileword & 0x0003 ]; + dst[1] = bgPalette[(tileword & 0x000C) >> 2]; + dst[2] = bgPalette[(tileword & 0x0030) >> 4]; + dst[3] = bgPalette[(tileword & 0x00C0) >> 6]; + dst[4] = bgPalette[(tileword & 0x0300) >> 8]; + dst[5] = bgPalette[(tileword & 0x0C00) >> 10]; + dst[6] = bgPalette[(tileword & 0x3000) >> 12]; + dst[7] = bgPalette[ tileword >> 14]; + + int i = nextSprite - 1; + + if (!lcdcObjEn(p)) { + do { + int pos = int(p.spriteList[i].spx) - xpos; + p.spwordList[i] >>= pos * 2 >= 0 ? 16 - pos * 2 : 16 + pos * 2; + --i; + } while (i >= 0 && int(p.spriteList[i].spx) > xpos - 8); + } else { + unsigned char idtab[8] = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF }; + unsigned const bgprioritymask = p.lcdc << 7; + + do { + int n; + int pos = int(p.spriteList[i].spx) - xpos; + + if (pos < 0) { + n = pos + 8; + pos = 0; + } else + n = 8 - pos; + + unsigned char const id = p.spriteList[i].oampos; + unsigned const sattrib = p.spriteList[i].attrib; + unsigned spword = p.spwordList[i]; + video_pixel_t const * spPalette; + if(p.dmgMode)//support gb games in gbc mode + spPalette = p.spPalette + (sattrib >> 2 & 4); + else + spPalette = p.spPalette + (sattrib & 7) * 4; + + if (!((attrib | sattrib) & bgprioritymask)) { + unsigned char *const idt = idtab + pos; + video_pixel_t *const d = dst + pos; + + switch (n) { + case 8: if ((spword >> 14 ) && id < idt[7]) { + idt[7] = id; + d[7] = spPalette[spword >> 14 ]; + } + case 7: if ((spword >> 12 & 3) && id < idt[6]) { + idt[6] = id; + d[6] = spPalette[spword >> 12 & 3]; + } + case 6: if ((spword >> 10 & 3) && id < idt[5]) { + idt[5] = id; + d[5] = spPalette[spword >> 10 & 3]; + } + case 5: if ((spword >> 8 & 3) && id < idt[4]) { + idt[4] = id; + d[4] = spPalette[spword >> 8 & 3]; + } + case 4: if ((spword >> 6 & 3) && id < idt[3]) { + idt[3] = id; + d[3] = spPalette[spword >> 6 & 3]; + } + case 3: if ((spword >> 4 & 3) && id < idt[2]) { + idt[2] = id; + d[2] = spPalette[spword >> 4 & 3]; + } + case 2: if ((spword >> 2 & 3) && id < idt[1]) { + idt[1] = id; + d[1] = spPalette[spword >> 2 & 3]; + } + case 1: if ((spword & 3) && id < idt[0]) { + idt[0] = id; + d[0] = spPalette[spword & 3]; + } + } + + spword >>= n * 2; + + /*do { + if ((spword & 3) && id < idtab[pos]) { + idtab[pos] = id; + dst[pos] = spPalette[spword & 3]; + } + + spword >>= 2; + ++pos; + } while (--n);*/ + } else { + unsigned tw = tileword >> pos * 2; + + do { + if ((spword & 3) && id < idtab[pos]) { + idtab[pos] = id; + dst[pos] = (tw & 3) + ? bgPalette[ tw & 3] + : spPalette[spword & 3]; + } + + spword >>= 2; + tw >>= 2; + ++pos; + } while (--n); + } + + p.spwordList[i] = spword; + --i; + } while (i >= 0 && int(p.spriteList[i].spx) > xpos - 8); + } + } + + { + unsigned const tno = tileMapLine[ tileMapXpos & 0x1F ]; + unsigned const nattrib = tileMapLine[(tileMapXpos & 0x1F) + 0x2000]; + tileMapXpos = (tileMapXpos & 0x1F) + 1; + + unsigned const tdo = tdoffset & ~(tno << 5); + unsigned char const *const td = vram + tno * 16 + + ((nattrib & attr_yflip) ? tdo ^ 14 : tdo) + + (nattrib << 10 & 0x2000); + unsigned short const *const explut = expand_lut + (nattrib << 3 & 0x100); + p.ntileword = explut[td[0]] + explut[td[1]] * 2; + p.nattrib = nattrib; + } + + xpos = xpos + 8; + } while (xpos < xend); + + p.xpos = xpos; +} + +static void doFullTilesUnrolled(PPUPriv &p) { + int xpos = p.xpos; + int const xend = static_cast(p.wx) < xpos || p.wx >= 168 + ? 161 + : static_cast(p.wx) - 7; + if (xpos >= xend) + return; + + video_pixel_t *const dbufline = p.framebuf.fbline(); + unsigned char const *tileMapLine; + unsigned tileline; + unsigned tileMapXpos; + + if (p.winDrawState & win_draw_started) { + tileMapLine = p.vram + (p.lcdc << 4 & 0x400) + + (p.winYPos & 0xF8) * 4 + 0x1800; + tileMapXpos = (xpos + p.wscx) >> 3; + tileline = p.winYPos & 7; + } else { + tileMapLine = p.vram + (p.lcdc << 7 & 0x400) + + ((p.scy + p.lyCounter.ly()) & 0xF8) * 4 + 0x1800; + tileMapXpos = (p.scx + xpos + 1 - p.cgb) >> 3; + tileline = (p.scy + p.lyCounter.ly()) & 7; + } + + if (xpos < 8) { + video_pixel_t prebuf[16]; + + if (p.cgb) { + doFullTilesUnrolledCgb(p, xend < 8 ? xend : 8, prebuf + (8 - xpos), + tileMapLine, tileline, tileMapXpos); + } else { + doFullTilesUnrolledDmg(p, xend < 8 ? xend : 8, prebuf + (8 - xpos), + tileMapLine, tileline, tileMapXpos); + } + + int const newxpos = p.xpos; + + if (newxpos > 8) { + std::memcpy(dbufline, prebuf + (8 - xpos), (newxpos - 8) * sizeof *dbufline); + } else if (newxpos < 8) + return; + + if (newxpos >= xend) + return; + + tileMapXpos += (newxpos - xpos) >> 3; + } + + if (p.cgb) { + doFullTilesUnrolledCgb(p, xend, dbufline, tileMapLine, tileline, tileMapXpos); + } else + doFullTilesUnrolledDmg(p, xend, dbufline, tileMapLine, tileline, tileMapXpos); +} + +static void plotPixel(PPUPriv &p) { + int const xpos = p.xpos; + unsigned const tileword = p.tileword; + video_pixel_t *const fbline = p.framebuf.fbline(); + + if (static_cast(p.wx) == xpos + && (p.weMaster || (p.wy2 == p.lyCounter.ly() && lcdcWinEn(p))) + && xpos < 167) { + if (p.winDrawState == 0 && lcdcWinEn(p)) { + p.winDrawState = win_draw_start | win_draw_started; + ++p.winYPos; + } else if (!p.cgb && (p.winDrawState == 0 || xpos == 166)) + p.winDrawState |= win_draw_start; + } + + unsigned const twdata = tileword & ((p.lcdc & 1) | p.cgb) * 3; + video_pixel_t pixel = p.bgPalette[twdata + (p.attrib & 7) * 4]; + int i = static_cast(p.nextSprite) - 1; + + if (i >= 0 && int(p.spriteList[i].spx) > xpos - 8) { + unsigned spdata = 0; + unsigned attrib = 0; + + if (p.cgb) { + unsigned minId = 0xFF; + + do { + if ((p.spwordList[i] & 3) && p.spriteList[i].oampos < minId) { + spdata = p.spwordList[i] & 3; + attrib = p.spriteList[i].attrib; + minId = p.spriteList[i].oampos; + } + + p.spwordList[i] >>= 2; + --i; + } while (i >= 0 && int(p.spriteList[i].spx) > xpos - 8); + + if (spdata && lcdcObjEn(p) + && (!((attrib | p.attrib) & attr_bgpriority) || !twdata || !lcdcBgEn(p))) { + if(p.dmgMode)//support gb games in gbc mode + pixel = p.spPalette[(attrib >> 2 & 4) + spdata]; + else + pixel = p.spPalette[(attrib & 7) * 4 + spdata]; + } + } else { + do { + if (p.spwordList[i] & 3) { + spdata = p.spwordList[i] & 3; + attrib = p.spriteList[i].attrib; + } + + p.spwordList[i] >>= 2; + --i; + } while (i >= 0 && int(p.spriteList[i].spx) > xpos - 8); + + if (spdata && lcdcObjEn(p) && (!(attrib & attr_bgpriority) || !twdata)) + pixel = p.spPalette[(attrib >> 2 & 4) + spdata]; + } + } + + if (xpos - 8 >= 0) + fbline[xpos - 8] = pixel; + + p.xpos = xpos + 1; + p.tileword = tileword >> 2; +} + +static void plotPixelIfNoSprite(PPUPriv &p) { + if (p.spriteList[p.nextSprite].spx == p.xpos) { + if (!(lcdcObjEn(p) | p.cgb)) { + do { + ++p.nextSprite; + } while (p.spriteList[p.nextSprite].spx == p.xpos); + + plotPixel(p); + } + } else + plotPixel(p); +} + +static unsigned long nextM2Time(PPUPriv const &p) +{ + unsigned is_doublespeed = (unsigned)p.lyCounter.isDoubleSpeed(); + unsigned long nextm2 = (bool)is_doublespeed + ? p.lyCounter.time() + (weMasterCheckPriorToLyIncLineCycle(true ) + m2_ds_offset) * 2 - 456 * 2 + : p.lyCounter.time() + weMasterCheckPriorToLyIncLineCycle(p.cgb) - 456 ; + if (p.lyCounter.ly() == 143) + nextm2 += (456 * 10 + 456 - weMasterCheckPriorToLyIncLineCycle(p.cgb)) << is_doublespeed; + + return nextm2; +} + +static void xpos168(PPUPriv &p) { + unsigned is_doublespeed = (unsigned)p.lyCounter.isDoubleSpeed(); + p.lastM0Time = p.now - (p.cycles << is_doublespeed); + + unsigned long const nextm2 = nextM2Time(p); + + p.cycles = p.now >= nextm2 + ? long((p.now - nextm2) >> is_doublespeed) + : -long((nextm2 - p.now) >> is_doublespeed); + + nextCall(0, p.lyCounter.ly() == 143 ? M2_Ly0::f0_ : M2_LyNon0::f0_, p); +} + +static bool handleWinDrawStartReq(PPUPriv const &p, int const xpos, unsigned char &winDrawState) { + bool const startWinDraw = (xpos < 167 || p.cgb) + && (winDrawState &= win_draw_started); + if (!lcdcWinEn(p)) + winDrawState &= ~win_draw_started; + + return startWinDraw; +} + +static bool handleWinDrawStartReq(PPUPriv &p) { + return handleWinDrawStartReq(p, p.xpos, p.winDrawState); +} + +namespace StartWindowDraw { + static void inc(PPUState const &nextf, PPUPriv &p) { + if (!lcdcWinEn(p) && p.cgb) { + plotPixelIfNoSprite(p); + + if (p.xpos == p.endx) { + if (p.xpos < 168) { + nextCall(1, Tile::f0_, p); + } else + xpos168(p); + + return; + } + } + + nextCall(1, nextf, p); + } + + static void f0(PPUPriv &p) { + if (p.xpos == p.endx) { + p.tileword = p.ntileword; + p.attrib = p.nattrib; + p.endx = p.xpos < 160 ? p.xpos + 8 : 168; + } + + p.wscx = 8 - p.xpos; + + if (p.winDrawState & win_draw_started) { + p.reg1 = p.vram[(p.lcdc << 4 & 0x400) + + (p.winYPos & 0xF8) * 4 + 0x1800]; + p.nattrib = p.vram[(p.lcdc << 4 & 0x400) + + (p.winYPos & 0xF8) * 4 + 0x3800]; + } else { + p.reg1 = p.vram[(p.lcdc << 7 & 0x400) + + ((p.scy + p.lyCounter.ly()) & 0xF8) * 4 + 0x1800]; + p.nattrib = p.vram[(p.lcdc << 7 & 0x400) + + ((p.scy + p.lyCounter.ly()) & 0xF8) * 4 + 0x3800]; + } + + inc(f1_, p); + } + + static void f1(PPUPriv &p) { + inc(f2_, p); + } + + static void f2(PPUPriv &p) { + p.reg0 = loadTileDataByte0(p); + inc(f3_, p); + } + + static void f3(PPUPriv &p) { + inc(f4_, p); + } + + static void f4(PPUPriv &p) { + int const r1 = loadTileDataByte1(p); + + p.ntileword = (expand_lut + (p.nattrib << 3 & 0x100))[p.reg0] + + (expand_lut + (p.nattrib << 3 & 0x100))[r1 ] * 2; + + inc(f5_, p); + } + + static void f5(PPUPriv &p) { + inc(Tile::f0_, p); + } +} + +namespace LoadSprites { + static void inc(PPUState const &nextf, PPUPriv &p) { + plotPixelIfNoSprite(p); + + if (p.xpos == p.endx) { + if (p.xpos < 168) { + nextCall(1, Tile::f0_, p); + } else + xpos168(p); + } else + nextCall(1, nextf, p); + } + + static void f0(PPUPriv &p) { + p.reg1 = p.spriteMapper.oamram()[p.spriteList[p.currentSprite].oampos + 2]; + nextCall(1, f1_, p); + } + + static void f1(PPUPriv &p) { + if ((p.winDrawState & win_draw_start) && handleWinDrawStartReq(p)) + return StartWindowDraw::f0(p); + + p.spriteList[p.currentSprite].attrib = + p.spriteMapper.oamram()[p.spriteList[p.currentSprite].oampos + 3]; + inc(f2_, p); + } + + static void f2(PPUPriv &p) { + if ((p.winDrawState & win_draw_start) && handleWinDrawStartReq(p)) + return StartWindowDraw::f0(p); + + unsigned const spline = + ( (p.spriteList[p.currentSprite].attrib & attr_yflip) + ? p.spriteList[p.currentSprite].line ^ 15 + : p.spriteList[p.currentSprite].line ) * 2; + p.reg0 = p.vram[(p.spriteList[p.currentSprite].attrib << 10 & p.cgb * 0x2000) + + (lcdcObj2x(p) ? (p.reg1 * 16 & ~16) | spline : p.reg1 * 16 | (spline & ~16))]; + inc(f3_, p); + } + + static void f3(PPUPriv &p) { + if ((p.winDrawState & win_draw_start) && handleWinDrawStartReq(p)) + return StartWindowDraw::f0(p); + + inc(f4_, p); + } + + static void f4(PPUPriv &p) { + if ((p.winDrawState & win_draw_start) && handleWinDrawStartReq(p)) + return StartWindowDraw::f0(p); + + unsigned const spline = + ( (p.spriteList[p.currentSprite].attrib & attr_yflip) + ? p.spriteList[p.currentSprite].line ^ 15 + : p.spriteList[p.currentSprite].line ) * 2; + p.reg1 = p.vram[(p.spriteList[p.currentSprite].attrib << 10 & p.cgb * 0x2000) + + (lcdcObj2x(p) ? (p.reg1 * 16 & ~16) | spline : p.reg1 * 16 | (spline & ~16)) + 1]; + inc(f5_, p); + } + + static void f5(PPUPriv &p) { + if ((p.winDrawState & win_draw_start) && handleWinDrawStartReq(p)) + return StartWindowDraw::f0(p); + + plotPixelIfNoSprite(p); + + unsigned entry = p.currentSprite; + + if (entry == p.nextSprite) { + ++p.nextSprite; + } else { + entry = p.nextSprite - 1; + p.spriteList[entry] = p.spriteList[p.currentSprite]; + } + + p.spwordList[entry] = expand_lut[p.reg0 + (p.spriteList[entry].attrib << 3 & 0x100)] + + expand_lut[p.reg1 + (p.spriteList[entry].attrib << 3 & 0x100)] * 2; + p.spriteList[entry].spx = p.xpos; + + if (p.xpos == p.endx) { + if (p.xpos < 168) { + nextCall(1, Tile::f0_, p); + } else + xpos168(p); + } else { + p.nextCallPtr = &Tile::f5_; + nextCall(1, Tile::f5_, p); + } + } +} + +namespace Tile { + static void inc(PPUState const &nextf, PPUPriv &p) { + plotPixelIfNoSprite(p); + + if (p.xpos == 168) { + xpos168(p); + } else + nextCall(1, nextf, p); + } + + static void f0(PPUPriv &p) { + if ((p.winDrawState & win_draw_start) && handleWinDrawStartReq(p)) + return StartWindowDraw::f0(p); + + doFullTilesUnrolled(p); + + if (p.xpos == 168) { + ++p.cycles; + return xpos168(p); + } + + p.tileword = p.ntileword; + p.attrib = p.nattrib; + p.endx = p.xpos < 160 ? p.xpos + 8 : 168; + + if (p.winDrawState & win_draw_started) { + p.reg1 = p.vram[(p.lcdc << 4 & 0x400) + + (p.winYPos & 0xF8) * 4 + + ((p.xpos + p.wscx) >> 3 & 0x1F) + 0x1800]; + p.nattrib = p.vram[(p.lcdc << 4 & 0x400) + + (p.winYPos & 0xF8) * 4 + + ((p.xpos + p.wscx) >> 3 & 0x1F) + 0x3800]; + } else { + p.reg1 = p.vram[((p.lcdc << 7 | (p.scx + p.xpos + 1 - p.cgb) >> 3) & 0x41F) + + ((p.scy + p.lyCounter.ly()) & 0xF8) * 4 + 0x1800]; + p.nattrib = p.vram[((p.lcdc << 7 | (p.scx + p.xpos + 1 - p.cgb) >> 3) & 0x41F) + + ((p.scy + p.lyCounter.ly()) & 0xF8) * 4 + 0x3800]; + } + + inc(f1_, p); + } + + static void f1(PPUPriv &p) { + if ((p.winDrawState & win_draw_start) && handleWinDrawStartReq(p)) + return StartWindowDraw::f0(p); + + inc(f2_, p); + } + + static void f2(PPUPriv &p) { + if ((p.winDrawState & win_draw_start) && handleWinDrawStartReq(p)) + return StartWindowDraw::f0(p); + + p.reg0 = loadTileDataByte0(p); + inc(f3_, p); + } + + static void f3(PPUPriv &p) { + if ((p.winDrawState & win_draw_start) && handleWinDrawStartReq(p)) + return StartWindowDraw::f0(p); + + inc(f4_, p); + } + + static void f4(PPUPriv &p) { + if ((p.winDrawState & win_draw_start) && handleWinDrawStartReq(p)) + return StartWindowDraw::f0(p); + + int const r1 = loadTileDataByte1(p); + + p.ntileword = (expand_lut + (p.nattrib << 3 & 0x100))[p.reg0] + + (expand_lut + (p.nattrib << 3 & 0x100))[r1 ] * 2; + + plotPixelIfNoSprite(p); + + if (p.xpos == 168) { + xpos168(p); + } else + nextCall(1, f5_, p); + } + + static void f5(PPUPriv &p) { + int endx = p.endx; + p.nextCallPtr = &f5_; + + do { + if ((p.winDrawState & win_draw_start) && handleWinDrawStartReq(p)) + return StartWindowDraw::f0(p); + + if (p.spriteList[p.nextSprite].spx == p.xpos) { + if (lcdcObjEn(p) | p.cgb) { + p.currentSprite = p.nextSprite; + return LoadSprites::f0(p); + } + + do { + ++p.nextSprite; + } while (p.spriteList[p.nextSprite].spx == p.xpos); + } + + plotPixel(p); + + if (p.xpos == endx) { + if (endx < 168) { + nextCall(1, f0_, p); + } else + xpos168(p); + + return; + } + } while (--p.cycles >= 0); + } +} + +} // namespace M3Loop + +namespace M2_Ly0 { + static unsigned predictCyclesUntilXpos_f0(PPUPriv const &p, unsigned winDrawState, + int targetxpos, unsigned cycles); +} + +namespace M2_LyNon0 { + static unsigned predictCyclesUntilXpos_f0(PPUPriv const &p, unsigned winDrawState, + int targetxpos, unsigned cycles); +} + +namespace M3Loop { + +static unsigned predictCyclesUntilXposNextLine( + PPUPriv const &p, unsigned winDrawState, int const targetx) { + if (p.wx == 166 && !p.cgb && p.xpos < 167 + && (p.weMaster || (p.wy2 == p.lyCounter.ly() && lcdcWinEn(p)))) { + winDrawState = win_draw_start | (lcdcWinEn(p) ? win_draw_started : 0); + } + + unsigned is_doublespeed = (unsigned)p.lyCounter.isDoubleSpeed(); + unsigned const cycles = (nextM2Time(p) - p.now) >> is_doublespeed; + + return p.lyCounter.ly() == 143 + ? M2_Ly0::predictCyclesUntilXpos_f0(p, winDrawState, targetx, cycles) + : M2_LyNon0::predictCyclesUntilXpos_f0(p, winDrawState, targetx, cycles); +} + +namespace StartWindowDraw { + static unsigned predictCyclesUntilXpos_fn(PPUPriv const &p, int xpos, + int endx, unsigned ly, unsigned nextSprite, bool weMaster, + unsigned winDrawState, int fno, int targetx, unsigned cycles); +} + +namespace Tile { + static unsigned char const * addSpriteCycles(unsigned char const *nextSprite, + unsigned char const *spriteEnd, unsigned char const *const spxOf, + unsigned const maxSpx, unsigned const firstTileXpos, + unsigned prevSpriteTileNo, unsigned *const cyclesAccumulator) { + unsigned sum = 0; + + while (nextSprite < spriteEnd && spxOf[*nextSprite] <= maxSpx) { + unsigned cycles = 6; + unsigned const distanceFromTileStart = (spxOf[*nextSprite] - firstTileXpos) & 7; + unsigned const tileNo = (spxOf[*nextSprite] - firstTileXpos) & ~7; + + if (distanceFromTileStart < 5 && tileNo != prevSpriteTileNo) + cycles = 11 - distanceFromTileStart; + + prevSpriteTileNo = tileNo; + sum += cycles; + ++nextSprite; + } + + *cyclesAccumulator += sum; + + return nextSprite; + } + + static unsigned predictCyclesUntilXpos_fn(PPUPriv const &p, int const xpos, + int const endx, unsigned const ly, unsigned const nextSprite, + bool const weMaster, unsigned char winDrawState, int const fno, + int const targetx, unsigned cycles) { + if ((winDrawState & win_draw_start) + && handleWinDrawStartReq(p, xpos, winDrawState)) { + return StartWindowDraw::predictCyclesUntilXpos_fn(p, xpos, endx, + ly, nextSprite, weMaster, winDrawState, 0, targetx, cycles); + } + + if (xpos > targetx) + return predictCyclesUntilXposNextLine(p, winDrawState, targetx); + + enum { NO_TILE_NUMBER = 1 }; // low bit set, so it will never be equal to an actual tile number. + + int nwx = 0xFF; + cycles += targetx - xpos; + + if (p.wx - unsigned(xpos) < targetx - unsigned(xpos) + && lcdcWinEn(p) && (weMaster || p.wy2 == ly) + && !(winDrawState & win_draw_started) + && (p.cgb || p.wx != 166)) { + nwx = p.wx; + cycles += 6; + } + + if (lcdcObjEn(p) | p.cgb) { + unsigned char const *sprite = p.spriteMapper.sprites(ly); + unsigned char const *const spriteEnd = sprite + p.spriteMapper.numSprites(ly); + sprite += nextSprite; + + if (sprite < spriteEnd) { + int const spx = p.spriteMapper.posbuf()[*sprite + 1]; + unsigned firstTileXpos = endx & 7u; // ok even if endx is capped at 168, + // because fno will be used. + unsigned prevSpriteTileNo = (xpos - firstTileXpos) & ~7; // this tile. all sprites on this + // tile will now add 6 cycles. + // except this one + if (fno + spx - xpos < 5 && spx <= nwx) { + cycles += 11 - (fno + spx - xpos); + sprite += 1; + } + + if (nwx < targetx) { + sprite = addSpriteCycles(sprite, spriteEnd, p.spriteMapper.posbuf() + 1, + nwx, firstTileXpos, prevSpriteTileNo, &cycles); + firstTileXpos = nwx + 1; + prevSpriteTileNo = NO_TILE_NUMBER; + } + + addSpriteCycles(sprite, spriteEnd, p.spriteMapper.posbuf() + 1, + targetx, firstTileXpos, prevSpriteTileNo, &cycles); + } + } + + return cycles; + } + + static unsigned predictCyclesUntilXpos_fn(PPUPriv const &p, + int endx, int fno, int targetx, unsigned cycles) { + return predictCyclesUntilXpos_fn(p, p.xpos, endx, p.lyCounter.ly(), + p.nextSprite, p.weMaster, p.winDrawState, fno, targetx, cycles); + } + + static unsigned predictCyclesUntilXpos_f0(PPUPriv const &p, int targetx, unsigned cycles) { + return predictCyclesUntilXpos_fn(p, p.xpos < 160 ? p.xpos + 8 : 168, 0, targetx, cycles); + } + static unsigned predictCyclesUntilXpos_f1(PPUPriv const &p, int targetx, unsigned cycles) { + return predictCyclesUntilXpos_fn(p, p.endx, 1, targetx, cycles); + } + static unsigned predictCyclesUntilXpos_f2(PPUPriv const &p, int targetx, unsigned cycles) { + return predictCyclesUntilXpos_fn(p, p.endx, 2, targetx, cycles); + } + static unsigned predictCyclesUntilXpos_f3(PPUPriv const &p, int targetx, unsigned cycles) { + return predictCyclesUntilXpos_fn(p, p.endx, 3, targetx, cycles); + } + static unsigned predictCyclesUntilXpos_f4(PPUPriv const &p, int targetx, unsigned cycles) { + return predictCyclesUntilXpos_fn(p, p.endx, 4, targetx, cycles); + } + static unsigned predictCyclesUntilXpos_f5(PPUPriv const &p, int targetx, unsigned cycles) { + return predictCyclesUntilXpos_fn(p, p.endx, 5, targetx, cycles); + } +} + +namespace StartWindowDraw { + static unsigned predictCyclesUntilXpos_fn(PPUPriv const &p, int xpos, + int const endx, unsigned const ly, unsigned const nextSprite, bool const weMaster, + unsigned const winDrawState, int const fno, int const targetx, unsigned cycles) { + if (xpos > targetx) + return predictCyclesUntilXposNextLine(p, winDrawState, targetx); + + unsigned cinc = 6 - fno; + + if (!lcdcWinEn(p) && p.cgb) { + unsigned xinc = std::min(cinc, std::min(endx, targetx + 1) - xpos); + + if ((lcdcObjEn(p) | p.cgb) && p.spriteList[nextSprite].spx < xpos + xinc) { + xpos = p.spriteList[nextSprite].spx; + } else { + cinc = xinc; + xpos += xinc; + } + } + + cycles += cinc; + + if (xpos <= targetx) { + return Tile::predictCyclesUntilXpos_fn(p, xpos, xpos < 160 ? xpos + 8 : 168, + ly, nextSprite, weMaster, winDrawState, 0, targetx, cycles); + } + + return cycles - 1; + } + + static unsigned predictCyclesUntilXpos_fn(PPUPriv const &p, + int endx, int fno, int targetx, unsigned cycles) { + return predictCyclesUntilXpos_fn(p, p.xpos, endx, p.lyCounter.ly(), + p.nextSprite, p.weMaster, p.winDrawState, fno, targetx, cycles); + } + + static unsigned predictCyclesUntilXpos_f0(PPUPriv const &p, int targetx, unsigned cycles) { + int endx = p.xpos == p.endx + ? (p.xpos < 160 ? p.xpos + 8 : 168) + : p.endx; + return predictCyclesUntilXpos_fn(p, endx, 0, targetx, cycles); + } + static unsigned predictCyclesUntilXpos_f1(PPUPriv const &p, int targetx, unsigned cycles) { + return predictCyclesUntilXpos_fn(p, p.endx, 1, targetx, cycles); + } + static unsigned predictCyclesUntilXpos_f2(PPUPriv const &p, int targetx, unsigned cycles) { + return predictCyclesUntilXpos_fn(p, p.endx, 2, targetx, cycles); + } + static unsigned predictCyclesUntilXpos_f3(PPUPriv const &p, int targetx, unsigned cycles) { + return predictCyclesUntilXpos_fn(p, p.endx, 3, targetx, cycles); + } + static unsigned predictCyclesUntilXpos_f4(PPUPriv const &p, int targetx, unsigned cycles) { + return predictCyclesUntilXpos_fn(p, p.endx, 4, targetx, cycles); + } + static unsigned predictCyclesUntilXpos_f5(PPUPriv const &p, int targetx, unsigned cycles) { + return predictCyclesUntilXpos_fn(p, p.endx, 5, targetx, cycles); + } +} + +namespace LoadSprites { + static unsigned predictCyclesUntilXpos_fn(PPUPriv const &p, + int const fno, int const targetx, unsigned cycles) + { + unsigned nextSprite = p.nextSprite; + if (lcdcObjEn(p) | p.cgb) + { + cycles += 6 - fno; + nextSprite += 1; + } + + return Tile::predictCyclesUntilXpos_fn(p, p.xpos, p.endx, p.lyCounter.ly(), + nextSprite, p.weMaster, p.winDrawState, 5, targetx, cycles); + } + + static unsigned predictCyclesUntilXpos_f0(PPUPriv const &p, int targetx, unsigned cycles) { + return predictCyclesUntilXpos_fn(p, 0, targetx, cycles); + } + static unsigned predictCyclesUntilXpos_f1(PPUPriv const &p, int targetx, unsigned cycles) { + return predictCyclesUntilXpos_fn(p, 1, targetx, cycles); + } + static unsigned predictCyclesUntilXpos_f2(PPUPriv const &p, int targetx, unsigned cycles) { + return predictCyclesUntilXpos_fn(p, 2, targetx, cycles); + } + static unsigned predictCyclesUntilXpos_f3(PPUPriv const &p, int targetx, unsigned cycles) { + return predictCyclesUntilXpos_fn(p, 3, targetx, cycles); + } + static unsigned predictCyclesUntilXpos_f4(PPUPriv const &p, int targetx, unsigned cycles) { + return predictCyclesUntilXpos_fn(p, 4, targetx, cycles); + } + static unsigned predictCyclesUntilXpos_f5(PPUPriv const &p, int targetx, unsigned cycles) { + return predictCyclesUntilXpos_fn(p, 5, targetx, cycles); + } +} + +} // namespace M3Loop + +namespace M3Start { + static unsigned predictCyclesUntilXpos_f1(PPUPriv const &p, unsigned xpos, unsigned ly, + bool weMaster, unsigned winDrawState, int targetx, unsigned cycles) { + cycles += std::min(unsigned(p.scx - xpos) & 7, max_m3start_cycles - xpos) + 1 - p.cgb; + return M3Loop::Tile::predictCyclesUntilXpos_fn(p, 0, 8 - (p.scx & 7), ly, 0, + weMaster, winDrawState, std::min(p.scx & 7, 5), targetx, cycles); + } + + static unsigned predictCyclesUntilXpos_f0(PPUPriv const &p, unsigned ly, + bool weMaster, unsigned winDrawState, int targetx, unsigned cycles) { + winDrawState = (winDrawState & win_draw_start) && lcdcWinEn(p) ? win_draw_started : 0; + return predictCyclesUntilXpos_f1(p, 0, ly, weMaster, winDrawState, targetx, cycles); + } + + static unsigned predictCyclesUntilXpos_f0(PPUPriv const &p, int targetx, unsigned cycles) { + unsigned ly = p.lyCounter.ly() + (p.lyCounter.time() - p.now < 16); + return predictCyclesUntilXpos_f0(p, ly, p.weMaster, p.winDrawState, targetx, cycles); + } + + static unsigned predictCyclesUntilXpos_f1(PPUPriv const &p, int targetx, unsigned cycles) { + return predictCyclesUntilXpos_f1(p, p.xpos, p.lyCounter.ly(), p.weMaster, + p.winDrawState, targetx, cycles); + } +} + +namespace M2_Ly0 { + static unsigned predictCyclesUntilXpos_f0(PPUPriv const &p, + unsigned winDrawState, int targetx, unsigned cycles) { + bool weMaster = lcdcWinEn(p) && 0 == p.wy; + unsigned ly = 0; + + return M3Start::predictCyclesUntilXpos_f0(p, ly, weMaster, + winDrawState, targetx, cycles + m3StartLineCycle(p.cgb)); + + } + + static unsigned predictCyclesUntilXpos_f0(PPUPriv const &p, int targetx, unsigned cycles) { + return predictCyclesUntilXpos_f0(p, p.winDrawState, targetx, cycles); + } +} + +namespace M2_LyNon0 { + static unsigned predictCyclesUntilXpos_f1(PPUPriv const &p, bool weMaster, + unsigned winDrawState, int targetx, unsigned cycles) { + unsigned ly = p.lyCounter.ly() + 1; + weMaster |= lcdcWinEn(p) && ly == p.wy; + + return M3Start::predictCyclesUntilXpos_f0(p, ly, weMaster, winDrawState, targetx, + cycles + 456 - weMasterCheckAfterLyIncLineCycle(p.cgb) + m3StartLineCycle(p.cgb)); + } + + static unsigned predictCyclesUntilXpos_f1(PPUPriv const &p, int targetx, unsigned cycles) { + return predictCyclesUntilXpos_f1(p, p.weMaster, p.winDrawState, targetx, cycles); + } + + static unsigned predictCyclesUntilXpos_f0(PPUPriv const &p, + unsigned winDrawState, int targetx, unsigned cycles) { + bool weMaster = p.weMaster || (lcdcWinEn(p) && p.lyCounter.ly() == p.wy); + + return predictCyclesUntilXpos_f1(p, weMaster, winDrawState, targetx, + cycles + weMasterCheckAfterLyIncLineCycle(p.cgb) + - weMasterCheckPriorToLyIncLineCycle(p.cgb)); + } + + static unsigned predictCyclesUntilXpos_f0(PPUPriv const &p, int targetx, unsigned cycles) { + return predictCyclesUntilXpos_f0(p, p.winDrawState, targetx, cycles); + } +} + +} // anon namespace + +namespace gambatte { + +PPUPriv::PPUPriv(NextM0Time &nextM0Time, unsigned char const *const oamram, unsigned char const *const vram) +: nextSprite(0) +, currentSprite(0xFF) +, vram(vram) +, nextCallPtr(&M2_Ly0::f0_) +, now(0) +, lastM0Time(0) +, cycles(-4396) +, tileword(0) +, ntileword(0) +, spriteMapper(nextM0Time, lyCounter, oamram) +, lcdc(0) +, scy(0) +, scx(0) +, wy(0) +, wy2(0) +, wx(0) +, winDrawState(0) +, wscx(0) +, winYPos(0) +, reg0(0) +, reg1(0) +, attrib(0) +, nattrib(0) +, xpos(0) +, endx(0) +, cgb(false) +, dmgMode(false) +, weMaster(false) +{ + std::memset(spriteList, 0, sizeof spriteList); + std::memset(spwordList, 0, sizeof spwordList); + /* The expansion will be properly filled by LCD::refreshPalettes() + * via PPU::refreshBgPaletteExpansion() before the first frame is + * rendered, but zero it to keep the struct deterministic at + * construction (saves don't carry derived state). */ + std::memset(bgPaletteExpanded, 0, sizeof bgPaletteExpanded); +} + +static void saveSpriteList(PPUPriv const &p, SaveState &ss) { + for (unsigned i = 0; i < 10; ++i) { + ss.ppu.spAttribList[i] = p.spriteList[i].attrib; + ss.ppu.spByte0List[i] = p.spwordList[i] & 0xFF; + ss.ppu.spByte1List[i] = p.spwordList[i] >> 8; + } + + ss.ppu.nextSprite = p.nextSprite; + ss.ppu.currentSprite = p.currentSprite; +} + +void PPU::saveState(SaveState &ss) const { + p_.spriteMapper.saveState(ss); + ss.ppu.videoCycles = lcdcEn(p_) ? p_.lyCounter.frameCycles(p_.now) : 0; + ss.ppu.xpos = p_.xpos; + ss.ppu.endx = p_.endx; + ss.ppu.reg0 = p_.reg0; + ss.ppu.reg1 = p_.reg1; + ss.ppu.tileword = p_.tileword; + ss.ppu.ntileword = p_.ntileword; + ss.ppu.attrib = p_.attrib; + ss.ppu.nattrib = p_.nattrib; + ss.ppu.winDrawState = p_.winDrawState; + ss.ppu.winYPos = p_.winYPos; + ss.ppu.oldWy = p_.wy2; + ss.ppu.wscx = p_.wscx; + ss.ppu.weMaster = p_.weMaster; + saveSpriteList(p_, ss); + ss.ppu.state = p_.nextCallPtr->id; + ss.ppu.lastM0Time = p_.now - p_.lastM0Time; +} + +namespace { + +template +struct BSearch { + static std::size_t upperBound(T const a[], K e) { + if (e < a[start + len / 2]) + return BSearch::upperBound(a, e); + + return BSearch::upperBound(a, e); + } +}; + +template +struct BSearch { + static std::size_t upperBound(T const [], K ) { + return start; + } +}; + +template +std::size_t upperBound(T const a[], K e) { + return BSearch::upperBound(a, e); +} + +struct CycleState { + PPUState const *state; + long cycle; + operator long() const { return cycle; } +}; + +static PPUState const * decodeM3LoopState(unsigned state) { + switch (state) { + case M3Loop::Tile::ID0: return &M3Loop::Tile::f0_; + case M3Loop::Tile::ID1: return &M3Loop::Tile::f1_; + case M3Loop::Tile::ID2: return &M3Loop::Tile::f2_; + case M3Loop::Tile::ID3: return &M3Loop::Tile::f3_; + case M3Loop::Tile::ID4: return &M3Loop::Tile::f4_; + case M3Loop::Tile::ID5: return &M3Loop::Tile::f5_; + + case M3Loop::LoadSprites::ID0: return &M3Loop::LoadSprites::f0_; + case M3Loop::LoadSprites::ID1: return &M3Loop::LoadSprites::f1_; + case M3Loop::LoadSprites::ID2: return &M3Loop::LoadSprites::f2_; + case M3Loop::LoadSprites::ID3: return &M3Loop::LoadSprites::f3_; + case M3Loop::LoadSprites::ID4: return &M3Loop::LoadSprites::f4_; + case M3Loop::LoadSprites::ID5: return &M3Loop::LoadSprites::f5_; + + case M3Loop::StartWindowDraw::ID0: return &M3Loop::StartWindowDraw::f0_; + case M3Loop::StartWindowDraw::ID1: return &M3Loop::StartWindowDraw::f1_; + case M3Loop::StartWindowDraw::ID2: return &M3Loop::StartWindowDraw::f2_; + case M3Loop::StartWindowDraw::ID3: return &M3Loop::StartWindowDraw::f3_; + case M3Loop::StartWindowDraw::ID4: return &M3Loop::StartWindowDraw::f4_; + case M3Loop::StartWindowDraw::ID5: return &M3Loop::StartWindowDraw::f5_; + } + + return 0; +} + +static long cyclesUntilM0Upperbound(PPUPriv const &p) { + long cycles = 168 - p.xpos + 6; + for (unsigned i = p.nextSprite; i < 10 && p.spriteList[i].spx < 168; ++i) + cycles += 11; + + return cycles; +} + +static void loadSpriteList(PPUPriv &p, SaveState const &ss) { + if (ss.ppu.videoCycles < 144 * 456UL && ss.ppu.xpos < 168) { + unsigned const ly = ss.ppu.videoCycles / 456; + unsigned const numSprites = p.spriteMapper.numSprites(ly); + unsigned char const *const sprites = p.spriteMapper.sprites(ly); + + for (unsigned i = 0; i < numSprites; ++i) { + unsigned pos = sprites[i]; + unsigned spy = p.spriteMapper.posbuf()[pos ]; + unsigned spx = p.spriteMapper.posbuf()[pos+1]; + + p.spriteList[i].spx = spx; + p.spriteList[i].line = ly + 16u - spy; + p.spriteList[i].oampos = pos * 2; + p.spriteList[i].attrib = ss.ppu.spAttribList[i] & 0xFF; + p.spwordList[i] = (ss.ppu.spByte1List[i] * 0x100 + ss.ppu.spByte0List[i]) & 0xFFFF; + } + + p.spriteList[numSprites].spx = 0xFF; + p.nextSprite = std::min(ss.ppu.nextSprite, numSprites); + + while (p.spriteList[p.nextSprite].spx < ss.ppu.xpos) + ++p.nextSprite; + + p.currentSprite = std::min(p.nextSprite, ss.ppu.currentSprite); + } +} + +} + +void PPU::loadState(SaveState const &ss, unsigned char const *const oamram) { + PPUState const * + const m3loopState = decodeM3LoopState(ss.ppu.state); + long const videoCycles = std::min(ss.ppu.videoCycles, 70223UL); + bool const ds = p_.cgb & ss.mem.ioamhram.get()[0x14D] >> 7; + long const vcycs = videoCycles - ds * m2_ds_offset < 0 + ? videoCycles - ds * m2_ds_offset + 70224 + : videoCycles - ds * m2_ds_offset; + long const lineCycles = static_cast(vcycs) % 456; + + p_.now = ss.cpu.cycleCounter; + p_.lcdc = ss.mem.ioamhram.get()[0x140]; + p_.lyCounter.setDoubleSpeed(ds); + p_.lyCounter.reset(std::min(ss.ppu.videoCycles, 70223ul), ss.cpu.cycleCounter); + p_.spriteMapper.loadState(ss, oamram); + p_.winYPos = ss.ppu.winYPos; + p_.scy = ss.mem.ioamhram.get()[0x142]; + p_.scx = ss.mem.ioamhram.get()[0x143]; + p_.wy = ss.mem.ioamhram.get()[0x14A]; + p_.wy2 = ss.ppu.oldWy; + p_.wx = ss.mem.ioamhram.get()[0x14B]; + p_.dmgMode = (ss.mem.ioamhram.get()[0x14C] == 0x04); + p_.xpos = std::min(ss.ppu.xpos, 168); + p_.endx = (p_.xpos & ~7) + (ss.ppu.endx & 7); + p_.endx = std::min(p_.endx <= p_.xpos ? p_.endx + 8 : p_.endx, 168); + p_.reg0 = ss.ppu.reg0 & 0xFF; + p_.reg1 = ss.ppu.reg1 & 0xFF; + p_.tileword = ss.ppu.tileword & 0xFFFF; + p_.ntileword = ss.ppu.ntileword & 0xFFFF; + p_.attrib = ss.ppu.attrib & 0xFF; + p_.nattrib = ss.ppu.nattrib & 0xFF; + p_.wscx = ss.ppu.wscx; + p_.weMaster = ss.ppu.weMaster; + p_.winDrawState = ss.ppu.winDrawState & (win_draw_start | win_draw_started); + p_.lastM0Time = p_.now - ss.ppu.lastM0Time; + loadSpriteList(p_, ss); + + if (m3loopState && videoCycles < 144 * 456L && p_.xpos < 168 + && lineCycles + cyclesUntilM0Upperbound(p_) < weMasterCheckPriorToLyIncLineCycle(p_.cgb)) { + p_.nextCallPtr = m3loopState; + p_.cycles = -1; + } else if (vcycs < 143 * 456L + static_cast(m3StartLineCycle(p_.cgb)) + max_m3start_cycles) { + CycleState const lineCycleStates[] = { + { &M3Start::f0_, m3StartLineCycle(p_.cgb) }, + { &M3Start::f1_, m3StartLineCycle(p_.cgb) + max_m3start_cycles }, + { &M2_LyNon0::f0_, weMasterCheckPriorToLyIncLineCycle(p_.cgb) }, + { &M2_LyNon0::f1_, weMasterCheckAfterLyIncLineCycle(p_.cgb) }, + { &M3Start::f0_, m3StartLineCycle(p_.cgb) + 456 } + }; + + std::size_t const pos = + upperBound(lineCycleStates, lineCycles); + + p_.cycles = lineCycles - lineCycleStates[pos].cycle; + p_.nextCallPtr = lineCycleStates[pos].state; + + if (&M3Start::f1_ == lineCycleStates[pos].state) { + p_.xpos = lineCycles - m3StartLineCycle(p_.cgb) + 1; + p_.cycles = -1; + } + } else { + p_.cycles = vcycs - 70224; + p_.nextCallPtr = &M2_Ly0::f0_; + } +} + +void PPU::reset(unsigned char const *oamram, unsigned char const *vram, bool cgb) { + p_.vram = vram; + p_.cgb = cgb; + p_.spriteMapper.reset(oamram, cgb); +} + +void PPU::resetCc(unsigned long const oldCc, unsigned long const newCc) { + unsigned long const dec = oldCc - newCc; + unsigned long const videoCycles = lcdcEn(p_) ? p_.lyCounter.frameCycles(p_.now) : 0; + + p_.now -= dec; + p_.lastM0Time = p_.lastM0Time ? p_.lastM0Time - dec : p_.lastM0Time; + p_.lyCounter.reset(videoCycles, p_.now); + p_.spriteMapper.resetCycleCounter(oldCc, newCc); +} + +void PPU::speedChange(unsigned long const cycleCounter) +{ + unsigned is_doublespeed = (unsigned)p_.lyCounter.isDoubleSpeed(); + unsigned long const videoCycles = lcdcEn(p_) ? p_.lyCounter.frameCycles(p_.now) : 0; + + p_.spriteMapper.preSpeedChange(cycleCounter); + p_.lyCounter.setDoubleSpeed(!(bool)is_doublespeed); + p_.lyCounter.reset(videoCycles, p_.now); + p_.spriteMapper.postSpeedChange(cycleCounter); + + if (&M2_Ly0::f0_ == p_.nextCallPtr || &M2_LyNon0::f0_ == p_.nextCallPtr) { + if ((bool)is_doublespeed) + p_.cycles -= m2_ds_offset; + else + p_.cycles += m2_ds_offset; + } +} + +unsigned long PPU::predictedNextXposTime(unsigned xpos) const { + return p_.now + + (p_.nextCallPtr->predictCyclesUntilXpos_f(p_, xpos, -p_.cycles) << (unsigned)p_.lyCounter.isDoubleSpeed()); +} + +void PPU::setLcdc(unsigned const lcdc, unsigned long const cc) { + if ((p_.lcdc ^ lcdc) & lcdc & lcdc_en) { + p_.now = cc; + p_.lastM0Time = 0; + p_.lyCounter.reset(0, p_.now); + p_.spriteMapper.enableDisplay(cc); + p_.weMaster = (lcdc & lcdc_we) && 0 == p_.wy; + p_.winDrawState = 0; + p_.nextCallPtr = &M3Start::f0_; + p_.cycles = -int(m3StartLineCycle(p_.cgb) + m2_ds_offset * p_.lyCounter.isDoubleSpeed()); + } else if ((p_.lcdc ^ lcdc) & lcdc_we) { + if (!(lcdc & lcdc_we)) { + if (p_.winDrawState == win_draw_started || p_.xpos == 168) + p_.winDrawState &= ~win_draw_started; + } else if (p_.winDrawState == win_draw_start) { + p_.winDrawState |= win_draw_started; + ++p_.winYPos; + } + } + + if ((p_.lcdc ^ lcdc) & lcdc_obj2x) { + if (p_.lcdc & lcdc & lcdc_en) + p_.spriteMapper.oamChange(cc); + + p_.spriteMapper.setLargeSpritesSource(lcdc & lcdc_obj2x); + } + + p_.lcdc = lcdc; +} + +void PPU::update(unsigned long const cc) { + unsigned is_doublespeed = (unsigned)p_.lyCounter.isDoubleSpeed(); + int const cycles = (cc - p_.now) >> is_doublespeed; + + p_.now += cycles << is_doublespeed; + p_.cycles += cycles; + + if (p_.cycles >= 0) { + p_.framebuf.setFbline(p_.lyCounter.ly()); + p_.nextCallPtr->f(p_); + } +} + +} diff --git a/src/games/gambatte/src/video/ppu.h b/src/games/gambatte/src/video/ppu.h new file mode 100644 index 0000000..714fdcd --- /dev/null +++ b/src/games/gambatte/src/video/ppu.h @@ -0,0 +1,199 @@ +// +// Copyright (C) 2010 by sinamas +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License version 2 as +// published by the Free Software Foundation. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License version 2 for more details. +// +// You should have received a copy of the GNU General Public License +// version 2 along with this program; if not, write to the +// Free Software Foundation, Inc., +// 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +// + +#ifndef PPU_H +#define PPU_H + +#include "lcddef.h" +#include "ly_counter.h" +#include "sprite_mapper.h" +#include "gbint.h" +#include "gambatte.h" +#include + +namespace gambatte { + +class PPUFrameBuf { +public: + PPUFrameBuf() : buf_(0), fbline_(nullfbline()), pitch_(0) {} + video_pixel_t * fb() const { return buf_; } + video_pixel_t * fbline() const { return fbline_; } + std::ptrdiff_t pitch() const { return pitch_; } + void setBuf(video_pixel_t *buf, std::ptrdiff_t pitch) { buf_ = buf; pitch_ = pitch; fbline_ = nullfbline(); } + void setFbline(unsigned ly) { fbline_ = buf_ ? buf_ + std::ptrdiff_t(ly) * pitch_ : nullfbline(); } + +private: + video_pixel_t *buf_; + video_pixel_t *fbline_; + std::ptrdiff_t pitch_; + + /* Shared 160-pixel scratch used as a destination when no real + * framebuf is attached. With DUAL_MODE compiled in, both PPU + * instances would write to this same buffer; the libretro + * core is single-threaded so there is no data race, but it is + * shared mutable state and nothing in the current code path + * actually reads it back. Make it a non-static member of + * PPUFrameBuf if DUAL_MODE is ever revived as a real feature. */ + static video_pixel_t * nullfbline() { static video_pixel_t nullfbline_[160]; return nullfbline_; } +}; + +struct PPUPriv; + +struct PPUState { + void (*f)(PPUPriv &v); + unsigned (*predictCyclesUntilXpos_f)(PPUPriv const &v, int targetxpos, unsigned cycles); + unsigned char id; +}; + +struct PPUPriv { + video_pixel_t bgPalette[8 * 4]; + video_pixel_t spPalette[8 * 4]; + /* Precomputed BG palette expansion. + * + * Indexed by [palette_id][byte][lane]: each byte of ntileword + * packs four 2-bit palette indices (lanes 0..3 in byte order), + * so each bgPaletteExpanded[p][byte] holds the four resolved + * colours for that nibble of the tile word. Both the DMG and + * CGB renderers issue two 16-byte loads + two 16-byte stores + * per 8-pixel tile instead of eight dependent scalar loads from + * bgPalette. + * + * DMG mode uses only palette 0. CGB mode picks palette + * (nattrib & 7) per tile. The table is rebuilt only when a BG + * palette changes: BGP / refresh / doCgbBgColorChange paths. + * + * Size: 8 * 256 * 4 * sizeof(video_pixel_t). For the default + * libretro u32 build that's 32 KiB; for the VIDEO_RGB565 / + * VIDEO_ABGR1555 u16 builds it's 16 KiB. Modern x86 L1d is + * 32-48 KiB and Cortex-A7/A53/A72 L1d is 32 KiB, so the worst + * case fits. In practice each frame uses only a few palettes + * actively, so the hot working set is much smaller than the + * full table. */ + video_pixel_t bgPaletteExpanded[8][256][4]; + struct Sprite { unsigned char spx, oampos, line, attrib; } spriteList[11]; + unsigned short spwordList[11]; + unsigned char nextSprite; + unsigned char currentSprite; + + unsigned char const *vram; + PPUState const *nextCallPtr; + + unsigned long now; + unsigned long lastM0Time; + long cycles; + + unsigned tileword; + unsigned ntileword; + + SpriteMapper spriteMapper; + LyCounter lyCounter; + PPUFrameBuf framebuf; + + unsigned char lcdc; + unsigned char scy; + unsigned char scx; + unsigned char wy; + unsigned char wy2; + unsigned char wx; + unsigned char winDrawState; + unsigned char wscx; + unsigned char winYPos; + unsigned char reg0; + unsigned char reg1; + unsigned char attrib; + unsigned char nattrib; + unsigned char xpos; + unsigned char endx; + + bool cgb; + bool dmgMode; + bool weMaster; + + PPUPriv(NextM0Time &nextM0Time, unsigned char const *oamram, unsigned char const *vram); +}; + +class PPU { +public: + PPU(NextM0Time &nextM0Time, unsigned char const *oamram, unsigned char const *vram) + : p_(nextM0Time, oamram, vram) + { + } + + video_pixel_t * bgPalette() { return p_.bgPalette; } + + /* Recompute bgPaletteExpanded[palette_id] from the current + * bgPalette[palette_id*4 .. palette_id*4+3]. DMG mode uses + * palette 0 only. Called by the LCD on every BG palette write + * (BGP register, CGB BCPD register, refresh / savestate paths). + * Idempotent and side-effect-free. */ + void refreshBgPaletteExpansion(unsigned const palette_id) + { + video_pixel_t const *const pal = p_.bgPalette + palette_id * 4; + video_pixel_t const c0 = pal[0]; + video_pixel_t const c1 = pal[1]; + video_pixel_t const c2 = pal[2]; + video_pixel_t const c3 = pal[3]; + video_pixel_t const cs[4] = { c0, c1, c2, c3 }; + for (int b = 0; b < 256; ++b) { + p_.bgPaletteExpanded[palette_id][b][0] = cs[ b & 3]; + p_.bgPaletteExpanded[palette_id][b][1] = cs[(b >> 2) & 3]; + p_.bgPaletteExpanded[palette_id][b][2] = cs[(b >> 4) & 3]; + p_.bgPaletteExpanded[palette_id][b][3] = cs[ b >> 6 ]; + } + } + bool cgb() const { return p_.cgb; } + void setDmgMode(bool mode) { p_.dmgMode = mode; } + bool inDmgMode() const { return p_.dmgMode; } + void doLyCountEvent() { p_.lyCounter.doEvent(); } + unsigned long doSpriteMapEvent(unsigned long time) { return p_.spriteMapper.doEvent(time); } + PPUFrameBuf const & frameBuf() const { return p_.framebuf; } + + bool inactivePeriodAfterDisplayEnable(unsigned long cc) const { + return p_.spriteMapper.inactivePeriodAfterDisplayEnable(cc); + } + + unsigned long lastM0Time() const { return p_.lastM0Time; } + unsigned lcdc() const { return p_.lcdc; } + void loadState(SaveState const &state, unsigned char const *oamram); + LyCounter const & lyCounter() const { return p_.lyCounter; } + unsigned long now() const { return p_.now; } + void oamChange(unsigned long cc) { p_.spriteMapper.oamChange(cc); } + void oamChange(unsigned char const *oamram, unsigned long cc) { p_.spriteMapper.oamChange(oamram, cc); } + unsigned long predictedNextXposTime(unsigned xpos) const; + void reset(unsigned char const *oamram, unsigned char const *vram, bool cgb); + void resetCc(unsigned long oldCc, unsigned long newCc); + void saveState(SaveState &ss) const; + void setFrameBuf(video_pixel_t *buf, std::ptrdiff_t pitch) { p_.framebuf.setBuf(buf, pitch); } + void setLcdc(unsigned lcdc, unsigned long cc); + void setScx(unsigned scx) { p_.scx = scx; } + void setScy(unsigned scy) { p_.scy = scy; } + void setStatePtrs(SaveState &ss) { p_.spriteMapper.setStatePtrs(ss); } + void setWx(unsigned wx) { p_.wx = wx; } + void setWy(unsigned wy) { p_.wy = wy; } + void updateWy2() { p_.wy2 = p_.wy; } + void speedChange(unsigned long cycleCounter); + video_pixel_t * spPalette() { return p_.spPalette; } + void update(unsigned long cc); + +private: + PPUPriv p_; +}; + +} + +#endif diff --git a/src/games/gambatte/src/video/sprite_mapper.cpp b/src/games/gambatte/src/video/sprite_mapper.cpp new file mode 100644 index 0000000..dcaa42c --- /dev/null +++ b/src/games/gambatte/src/video/sprite_mapper.cpp @@ -0,0 +1,203 @@ +// +// Copyright (C) 2007 by sinamas +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License version 2 as +// published by the Free Software Foundation. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License version 2 for more details. +// +// You should have received a copy of the GNU General Public License +// version 2 along with this program; if not, write to the +// Free Software Foundation, Inc., +// 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +// + +#include "sprite_mapper.h" +#include "counterdef.h" +#include "next_m0_time.h" +#include "../insertion_sort.h" +#include +#include + +namespace { + +class SpxLess { +public: + explicit SpxLess(unsigned char const *spxlut) : spxlut_(spxlut) {} + + bool operator()(unsigned char lhs, unsigned char rhs) const { + return spxlut_[lhs] < spxlut_[rhs]; + } + +private: + unsigned char const *const spxlut_; +}; + +} + +namespace gambatte { + +SpriteMapper::OamReader::OamReader(LyCounter const &lyCounter, unsigned char const *oamram) +: lyCounter_(lyCounter) +, oamram_(oamram) +, cgb_(false) +{ + reset(oamram, false); +} + +void SpriteMapper::OamReader::reset(unsigned char const *const oamram, bool const cgb) { + oamram_ = oamram; + cgb_ = cgb; + setLargeSpritesSrc(false); + lu_ = 0; + lastChange_ = 0xFF; + std::fill(szbuf_, szbuf_ + 40, largeSpritesSrc_); + + unsigned pos = 0; + unsigned distance = 80; + while (distance--) { + buf_[pos] = oamram[((pos * 2) & ~3) | (pos & 1)]; + ++pos; + } +} + +static unsigned toPosCycles(unsigned long const cc, LyCounter const &lyCounter) { + unsigned lc = lyCounter.lineCycles(cc) + 3 - lyCounter.isDoubleSpeed() * 3u; + if (lc >= 456) + lc -= 456; + + return lc; +} + +void SpriteMapper::OamReader::update(unsigned long const cc) { + if (cc > lu_) { + if (changed()) { + unsigned const lulc = toPosCycles(lu_, lyCounter_); + unsigned pos = std::min(lulc, 80u); + unsigned distance = 80; + unsigned is_doublespeed = (unsigned)lyCounter_.isDoubleSpeed(); + + if ((cc - lu_) >> is_doublespeed < 456) + { + unsigned cclc = toPosCycles(cc, lyCounter_); + distance = std::min(cclc, 80u) - pos + (cclc < lulc ? 80 : 0); + } + + { + unsigned targetDistance = + lastChange_ - pos + (lastChange_ <= pos ? 80 : 0); + if (targetDistance <= distance) { + distance = targetDistance; + lastChange_ = 0xFF; + } + } + + while (distance--) { + if (!(pos & 1)) { + if (pos == 80) + pos = 0; + + if (cgb_) + szbuf_[pos >> 1] = largeSpritesSrc_; + + buf_[pos ] = oamram_[pos * 2 ]; + buf_[pos + 1] = oamram_[pos * 2 + 1]; + } else + szbuf_[pos >> 1] = (szbuf_[pos >> 1] & cgb_) | largeSpritesSrc_; + + ++pos; + } + } + + lu_ = cc; + } +} + +void SpriteMapper::OamReader::change(unsigned long cc) { + update(cc); + lastChange_ = std::min(toPosCycles(lu_, lyCounter_), 80u); +} + +void SpriteMapper::OamReader::setStatePtrs(SaveState &state) { + state.ppu.oamReaderBuf.set(buf_, sizeof buf_); + state.ppu.oamReaderSzbuf.set(szbuf_, sizeof szbuf_ / sizeof *szbuf_); +} + +void SpriteMapper::OamReader::loadState(SaveState const &ss, unsigned char const *const oamram) { + oamram_ = oamram; + largeSpritesSrc_ = ss.mem.ioamhram.get()[0x140] >> 2 & 1; + lu_ = ss.ppu.enableDisplayM0Time; + change(lu_); +} + +void SpriteMapper::OamReader::enableDisplay(unsigned long cc) +{ + std::memset(buf_, 0x00, sizeof buf_); + std::fill(szbuf_, szbuf_ + 40, false); + unsigned is_doublespeed = (unsigned)lyCounter_.isDoubleSpeed(); + lu_ = cc + (80 << is_doublespeed); + lastChange_ = 80; +} + +SpriteMapper::SpriteMapper(NextM0Time &nextM0Time, + LyCounter const &lyCounter, + unsigned char const *oamram) +: nextM0Time_(nextM0Time) +, oamReader_(lyCounter, oamram) +{ + clearMap(); +} + +void SpriteMapper::reset(unsigned char const *oamram, bool cgb) { + oamReader_.reset(oamram, cgb); + clearMap(); +} + +void SpriteMapper::clearMap() { + std::memset(num_, need_sorting_mask, sizeof num_); +} + +void SpriteMapper::mapSprites() { + clearMap(); + + for (unsigned i = 0x00; i < 0x50; i += 2) { + int const spriteHeight = 8 << (unsigned)largeSprites(i >> 1); + unsigned const bottomPos = posbuf()[i] - (17u - spriteHeight); + + if (bottomPos < 143u + spriteHeight) { + unsigned const startly = std::max(int(bottomPos) + 1 - spriteHeight, 0); + unsigned char *map = spritemap_ + startly * 10; + unsigned char *n = num_ + startly; + unsigned char *const nend = num_ + std::min(bottomPos, 143u) + 1; + + do { + if (*n < need_sorting_mask + 10) + map[(*n)++ - need_sorting_mask] = i; + + map += 10; + } while (++n != nend); + } + } + + nextM0Time_.invalidatePredictedNextM0Time(); +} + +void SpriteMapper::sortLine(unsigned const ly) const { + num_[ly] &= ~need_sorting_mask; + insertionSort(spritemap_ + ly * 10, spritemap_ + ly * 10 + num_[ly], + SpxLess(posbuf() + 1)); +} + +unsigned long SpriteMapper::doEvent(unsigned long const time) { + oamReader_.update(time); + mapSprites(); + return oamReader_.changed() + ? time + oamReader_.lineTime() + : static_cast(disabled_time); +} + +} diff --git a/src/games/gambatte/src/video/sprite_mapper.h b/src/games/gambatte/src/video/sprite_mapper.h new file mode 100644 index 0000000..cc7d287 --- /dev/null +++ b/src/games/gambatte/src/video/sprite_mapper.h @@ -0,0 +1,122 @@ +// +// Copyright (C) 2007 by sinamas +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License version 2 as +// published by the Free Software Foundation. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License version 2 for more details. +// +// You should have received a copy of the GNU General Public License +// version 2 along with this program; if not, write to the +// Free Software Foundation, Inc., +// 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +// + +#ifndef SPRITE_MAPPER_H +#define SPRITE_MAPPER_H + +#include "ly_counter.h" +#include "../savestate.h" + +namespace gambatte { + +class NextM0Time; + +class SpriteMapper { +public: + SpriteMapper(NextM0Time &nextM0Time, + LyCounter const &lyCounter, + unsigned char const *oamram); + void reset(unsigned char const *oamram, bool cgb); + unsigned long doEvent(unsigned long time); + bool largeSprites(unsigned spNo) const { return oamReader_.largeSprites(spNo); } + unsigned numSprites(unsigned ly) const { return num_[ly] & ~need_sorting_mask; } + void oamChange(unsigned long cc) { oamReader_.change(cc); } + void oamChange(unsigned char const *oamram, unsigned long cc) { oamReader_.change(oamram, cc); } + unsigned char const * oamram() const { return oamReader_.oam(); } + unsigned char const * posbuf() const { return oamReader_.spritePosBuf(); } + void preSpeedChange(unsigned long cc) { oamReader_.update(cc); } + void postSpeedChange(unsigned long cc) { oamReader_.change(cc); } + + void resetCycleCounter(unsigned long oldCc, unsigned long newCc) { + oamReader_.update(oldCc); + oamReader_.resetCycleCounter(oldCc, newCc); + } + + void setLargeSpritesSource(bool src) { oamReader_.setLargeSpritesSrc(src); } + + unsigned char const * sprites(unsigned ly) const { + if (num_[ly] & need_sorting_mask) + sortLine(ly); + + return spritemap_ + ly * 10; + } + + void setStatePtrs(SaveState &state) { oamReader_.setStatePtrs(state); } + void enableDisplay(unsigned long cc) { oamReader_.enableDisplay(cc); } + void saveState(SaveState &state) const { oamReader_.saveState(state); } + + void loadState(SaveState const &state, unsigned char const *oamram) { + oamReader_.loadState(state, oamram); + mapSprites(); + } + + bool inactivePeriodAfterDisplayEnable(unsigned long cc) const { + return oamReader_.inactivePeriodAfterDisplayEnable(cc); + } + + static unsigned long schedule(LyCounter const &lyCounter, unsigned long cc) { + return lyCounter.nextLineCycle(80, cc); + } + +private: + class OamReader { + public: + OamReader(LyCounter const &lyCounter, unsigned char const *oamram); + void reset(unsigned char const *oamram, bool cgb); + void change(unsigned long cc); + void change(unsigned char const *oamram, unsigned long cc) { change(cc); oamram_ = oamram; } + bool changed() const { return lastChange_ != 0xFF; } + bool largeSprites(unsigned spNo) const { return szbuf_[spNo]; } + unsigned char const * oam() const { return oamram_; } + void resetCycleCounter(unsigned long oldCc, unsigned long newCc) { lu_ -= oldCc - newCc; } + void setLargeSpritesSrc(bool src) { largeSpritesSrc_ = src; } + void update(unsigned long cc); + unsigned char const * spritePosBuf() const { return buf_; } + void setStatePtrs(SaveState &state); + void enableDisplay(unsigned long cc); + void saveState(SaveState &state) const { state.ppu.enableDisplayM0Time = lu_; } + void loadState(SaveState const &ss, unsigned char const *oamram); + bool inactivePeriodAfterDisplayEnable(unsigned long cc) const { return cc < lu_; } + unsigned lineTime() const { return lyCounter_.lineTime(); } + + private: + unsigned char buf_[80]; + bool szbuf_[40]; + LyCounter const &lyCounter_; + unsigned char const *oamram_; + unsigned long lu_; + unsigned char lastChange_; + bool largeSpritesSrc_; + bool cgb_; + }; + + enum { need_sorting_mask = 0x80 }; + + mutable unsigned char spritemap_[144 * 10]; + mutable unsigned char num_[144]; + NextM0Time &nextM0Time_; + OamReader oamReader_; + + void clearMap(); + void mapSprites(); + void sortLine(unsigned ly) const; +}; + +} + +#endif diff --git a/src/games/gambatte/src/video_libretro.cpp b/src/games/gambatte/src/video_libretro.cpp new file mode 100644 index 0000000..00285e3 --- /dev/null +++ b/src/games/gambatte/src/video_libretro.cpp @@ -0,0 +1,321 @@ +/*************************************************************************** + * Copyright (C) 2007 by Sindre Aamås * + * aamas@stud.ntnu.no * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License version 2 as * + * published by the Free Software Foundation. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License version 2 for more details. * + * * + * You should have received a copy of the GNU General Public License * + * version 2 along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ +#include "video.h" +#include "savestate.h" +#include +#include +#include + +/* GBC colour correction factors */ +#define GBC_CC_LUM 0.94f +#define GBC_CC_R 0.82f +#define GBC_CC_G 0.665f +#define GBC_CC_B 0.73f +#define GBC_CC_RG 0.125f +#define GBC_CC_RB 0.195f +#define GBC_CC_GR 0.24f +#define GBC_CC_GB 0.075f +#define GBC_CC_BR -0.06f +#define GBC_CC_BG 0.21f + +namespace gambatte +{ + void LCD::setDmgPaletteColor(const unsigned index, const video_pixel_t rgb32) + { + dmgColorsRgb32_[index] = rgb32; + } + + void LCD::setDmgPalette(video_pixel_t *const palette, const video_pixel_t *const dmgColors, const unsigned data) + { + palette[0] = dmgColors[data & 3]; + palette[1] = dmgColors[data >> 2 & 3]; + palette[2] = dmgColors[data >> 4 & 3]; + palette[3] = dmgColors[data >> 6 & 3]; + } + + void LCD::setColorCorrection(bool colorCorrection_) + { + colorCorrection = colorCorrection_; + refreshPalettes(); + } + + void LCD::setColorCorrectionMode(unsigned colorCorrectionMode_) + { + // Note: We only have two modes, so could make 'colorCorrectionMode' + // a bool... but may want to add other modes in the future + // (e.g. a special GBA colour correction mode for when the GBA + // flag is set in Shantae/Zelda: Oracle/etc.) + colorCorrectionMode = colorCorrectionMode_; + refreshPalettes(); + } + + void LCD::setColorCorrectionBrightness(float colorCorrectionBrightness_) + { + colorCorrectionBrightness = colorCorrectionBrightness_; + refreshPalettes(); + } + + void LCD::setDarkFilterLevel(unsigned darkFilterLevel_) + { + darkFilterLevel = darkFilterLevel_; + refreshPalettes(); + } + + LCD::LCD(const unsigned char *const oamram, const unsigned char *const vram, const VideoInterruptRequester memEventRequester) : + ppu_(nextM0Time_, oamram, vram), + eventTimes_(memEventRequester), + statReg_(0), + m2IrqStatReg_(0), + m1IrqStatReg_(0), + /* Color-correction defaults must be initialized BEFORE the + * constructor body runs, because setColorCorrection(true) + * below calls refreshPalettes() -> gbcToRgb32(), which + * reads colorCorrectionMode/colorCorrectionBrightness/ + * darkFilterLevel. Previously these members were left + * uninitialized at this point and gbcToRgb32 invoked UB + * during construction. The values get overwritten by + * check_variables() once core options are read, but the + * construction-time UB still fires under UBSan. */ + colorCorrection(true), + colorCorrectionMode(0), + colorCorrectionBrightness(0.5f), + darkFilterLevel(0) + { + std::memset( bgpData_, 0, sizeof bgpData_); + std::memset(objpData_, 0, sizeof objpData_); + /* dmgColorsGBC_ is consumed by refreshPalettes() in the + * CGB-running-DMG-game path; if uninitialized it would + * produce garbage colours until the game wrote a palette. */ + std::memset(dmgColorsGBC_, 0, sizeof dmgColorsGBC_); + + for (std::size_t i = 0; i < sizeof(dmgColorsRgb32_) / sizeof(dmgColorsRgb32_[0]); ++i) + { +#ifdef VIDEO_RGB565 + uint16_t dmgColors[4]={0xFFFF, //11111 111111 11111 + 0xAD55, //10101 101010 10101 + 0x52AA, //01010 010101 01010 + 0x0000};//00000 000000 00000 + setDmgPaletteColor(i, dmgColors[i&3]); +#elif defined(VIDEO_ABGR1555) + uint16_t dmgColors[4]={0xEFFF, //11111 111111 11111 + 0x56B5, //10101 10101 10101 + 0x294A, //01010 01010 01010 + 0x0000};//00000 000000 00000 + setDmgPaletteColor(i, dmgColors[i&3]); +#else + setDmgPaletteColor(i, (3 - (i & 3)) * 85 * 0x010101); +#endif + } + + reset(oamram, vram, false); + /* PPUFrameBuf is default-constructed with NULL buffer and + * pitch 0; the frontend will call setVideoBuffer with the + * real buffer via cpu.setVideoBuffer once retro_run begins, + * so the previous setVideoBuffer(0, 160) here was a no-op + * with a confusing pitch. */ + + setColorCorrection(true); + } + + void LCD::doCgbColorChange(unsigned char *const pdata, + video_pixel_t *const palette, unsigned index, const unsigned data) + { + pdata[index] = data; + index >>= 1; + palette[index] = gbcToRgb32(pdata[index << 1] | pdata[(index << 1) + 1] << 8); + } + + void LCD::setVideoBuffer(video_pixel_t *const videoBuf, const int pitch) + { + ppu_.setFrameBuf(videoBuf, pitch); + } + + static void clear(video_pixel_t *buf, const unsigned long color, const int dpitch) + { + unsigned lines = 144; + + while (lines--) + { + std::fill_n(buf, 160, color); + buf += dpitch; + } + } + + void LCD::setDmgPaletteColor(const unsigned palNum, const unsigned colorNum, const video_pixel_t rgb32) + { + if (palNum > 2 || colorNum > 3) + return; + + setDmgPaletteColor(palNum * 4 | colorNum, rgb32); + refreshPalettes(); + } + + void LCD::updateScreen(const bool blanklcd, const unsigned long cycleCounter) + { + update(cycleCounter); + + if (blanklcd && ppu_.frameBuf().fb()) + { + const video_pixel_t color = ppu_.cgb() ? gbcToRgb32(0xFFFF) : dmgColorsRgb32_[0]; + clear(ppu_.frameBuf().fb(), color, ppu_.frameBuf().pitch()); + } + } + + // RGB range: [0,1] + void LCD::darkenRgb(float &r, float &g, float &b) + { + // Note: This is *very* approximate... + // - Should be done in linear colour space. It isn't. + // - Should alter brightness by performing an RGB->HSL->RGB + // conversion. We just do simple linear scaling instead. + // Basically, this is intended for use on devices that are + // too weak to run shaders (i.e. why would you want a 'dark filter' + // if your device supports proper LCD shaders?). We therefore + // cut corners for the sake of performance... + // + // Constants + // > Luminosity factors: photometric/digital ITU BT.709 + static const float lumaR = 0.2126f; + static const float lumaG = 0.7152f; + static const float lumaB = 0.0722f; + // Calculate luminosity + float luma = (lumaR * r) + (lumaG * g) + (lumaB * b); + // Get 'darkness' scaling factor + // > User set 'dark filter' level scaled by current luminosity + // (i.e. lighter colours affected more than darker colours) + float darkFactor = 1.0f - ((static_cast(darkFilterLevel) * 0.01f) * luma); + darkFactor = darkFactor < 0.0f ? 0.0f : darkFactor; + // Perform scaling... + r = r * darkFactor; + g = g * darkFactor; + b = b * darkFactor; + } + + video_pixel_t LCD::gbcToRgb32(const unsigned bgr15) + { + const unsigned r = bgr15 & 0x1F; + const unsigned g = bgr15 >> 5 & 0x1F; + const unsigned b = bgr15 >> 10 & 0x1F; + + unsigned rFinal = 0; + unsigned gFinal = 0; + unsigned bFinal = 0; + + // Constants + // (Don't know whether floating-point rounding modes can be changed + // dynamically at run time, so can't rely on constant folding of + // inline [float / float] expressions - just play it safe...) + static const float rgbMax = 31.0; + static const float rgbMaxInv = 1.0 / rgbMax; + + bool isDark = false; + + if (colorCorrection) + { + if (colorCorrectionMode == 1) + { + // Use fast (inaccurate) Gambatte default method + rFinal = ((r * 13) + (g * 2) + b) >> 4; + gFinal = ((g * 3) + b) >> 2; + bFinal = ((r * 3) + (g * 2) + (b * 11)) >> 4; + } + else + { + // Use Pokefan531's "gold standard" GBC colour correction + // (https://forums.libretro.com/t/real-gba-and-ds-phat-colors/1540/190) + // NB: The results produced by this implementation are ever so slightly + // different from the output of the gbc-colour shader. This is due to the + // fact that we have to tolerate rounding errors here that are simply not + // an issue when tweaking the final image with a post-processing shader. + // *However:* the difference is so tiny small that 99.9% of users will + // never notice, and the result is still 100x better than the 'fast' + // colour correction method. + // + // Constants + static const float targetGamma = 2.2; + static const float displayGammaInv = 1.0 / targetGamma; + // Perform gamma expansion + float adjustedGamma = targetGamma - colorCorrectionBrightness; + float rFloat = std::pow(static_cast(r) * rgbMaxInv, adjustedGamma); + float gFloat = std::pow(static_cast(g) * rgbMaxInv, adjustedGamma); + float bFloat = std::pow(static_cast(b) * rgbMaxInv, adjustedGamma); + // Perform colour mangling + float rCorrect = GBC_CC_LUM * ((GBC_CC_R * rFloat) + (GBC_CC_GR * gFloat) + (GBC_CC_BR * bFloat)); + float gCorrect = GBC_CC_LUM * ((GBC_CC_RG * rFloat) + (GBC_CC_G * gFloat) + (GBC_CC_BG * bFloat)); + float bCorrect = GBC_CC_LUM * ((GBC_CC_RB * rFloat) + (GBC_CC_GB * gFloat) + (GBC_CC_B * bFloat)); + // Range check... + rCorrect = rCorrect > 0.0f ? rCorrect : 0.0f; + gCorrect = gCorrect > 0.0f ? gCorrect : 0.0f; + bCorrect = bCorrect > 0.0f ? bCorrect : 0.0f; + // Perform gamma compression + rCorrect = std::pow(rCorrect, displayGammaInv); + gCorrect = std::pow(gCorrect, displayGammaInv); + bCorrect = std::pow(bCorrect, displayGammaInv); + // Range check... + rCorrect = rCorrect > 1.0f ? 1.0f : rCorrect; + gCorrect = gCorrect > 1.0f ? 1.0f : gCorrect; + bCorrect = bCorrect > 1.0f ? 1.0f : bCorrect; + // Perform image darkening, if required + if (darkFilterLevel > 0) + { + darkenRgb(rCorrect, gCorrect, bCorrect); + isDark = true; + } + // Convert back to 5bit unsigned + rFinal = static_cast((rCorrect * rgbMax) + 0.5) & 0x1F; + gFinal = static_cast((gCorrect * rgbMax) + 0.5) & 0x1F; + bFinal = static_cast((bCorrect * rgbMax) + 0.5) & 0x1F; + } + } + else + { + rFinal = r; + gFinal = g; + bFinal = b; + } + + // Perform image darkening, if required and we haven't + // already done it during colour correction + if (darkFilterLevel > 0 && !isDark) + { + // Convert colour range from [0,0x1F] to [0,1] + float rDark = static_cast(rFinal) * rgbMaxInv; + float gDark = static_cast(gFinal) * rgbMaxInv; + float bDark = static_cast(bFinal) * rgbMaxInv; + // Perform image darkening + darkenRgb(rDark, gDark, bDark); + // Convert back to 5bit unsigned + rFinal = static_cast((rDark * rgbMax) + 0.5) & 0x1F; + gFinal = static_cast((gDark * rgbMax) + 0.5) & 0x1F; + bFinal = static_cast((bDark * rgbMax) + 0.5) & 0x1F; + } + +#ifdef VIDEO_RGB565 + return rFinal << 11 | gFinal << 6 | bFinal; +#elif defined(VIDEO_ABGR1555) + return bFinal << 10 | gFinal << 5 | rFinal; +#else + const unsigned r8 = (rFinal * 255 + 15) / 31; + const unsigned g8 = (gFinal * 255 + 15) / 31; + const unsigned b8 = (bFinal * 255 + 15) / 31; + return (r8 << 16) | (g8 << 8) | b8; +#endif + } + +} diff --git a/src/games/gambatte_phone.cpp b/src/games/gambatte_phone.cpp new file mode 100644 index 0000000..527c71d --- /dev/null +++ b/src/games/gambatte_phone.cpp @@ -0,0 +1,2516 @@ +// SPDX-License-Identifier: GPL-2.0-only +// Bananarchy Gambatte Game Boy / Game Boy Color Emulator for 240x320 T9 Keypad Phones + +#include +#include +#include +#include +#include +#ifndef _EVDEVK +#define _EVDEVK(_v) (0x10081000 + (_v)) +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "gambatte.h" + +namespace { + +std::string trimStr(const std::string& s) { + size_t b = 0; + while (b < s.size() && std::isspace(static_cast(s[b]))) ++b; + size_t e = s.size(); + while (e > b && std::isspace(static_cast(s[e - 1]))) --e; + if (e >= b + 2 && + ((s[b] == '"' && s[e - 1] == '"') || (s[b] == '\'' && s[e - 1] == '\''))) { + return s.substr(b + 1, e - b - 2); + } + return s.substr(b, e - b); +} + +int hexNibble(char c) { + if (c >= '0' && c <= '9') return c - '0'; + if (c >= 'a' && c <= 'f') return 10 + (c - 'a'); + if (c >= 'A' && c <= 'F') return 10 + (c - 'A'); + return -1; +} + +bool parseHexRgb(const std::string& raw, unsigned long* outRgb) { + std::string s = trimStr(raw); + if (s.rfind("0x", 0) == 0 || s.rfind("0X", 0) == 0) { + s = "#" + s.substr(2); + } + if (s.size() == 7 && s[0] == '#') { + unsigned long v = 0; + for (int i = 1; i < 7; ++i) { + int n = hexNibble(s[i]); + if (n < 0) return false; + v = (v << 4) | static_cast(n); + } + *outRgb = v; + return true; + } + return false; +} + +struct ThemeSpec { + unsigned long bgMain = 0x222222; + unsigned long bgHeader = 0x1c1c1c; + unsigned long bgFooter = 0x181818; + unsigned long selBg = 0x005577; + unsigned long border = 0x444444; + unsigned long fgMain = 0xdddddd; + unsigned long fgMuted = 0x999999; + unsigned long accent = 0xf4d03f; + unsigned long success = 0x2ecc71; + unsigned long info = 0x5dade2; + unsigned long danger = 0xe74c3c; +}; + +ThemeSpec loadThemeSpec(Display* dpy, int screen) { + ThemeSpec t; + auto applyContent = [&](const std::string& content) { + std::istringstream ss(content); + std::string line; + while (std::getline(ss, line)) { + std::string tr = trimStr(line); + if (tr.empty() || tr[0] == '!' || tr[0] == '#') continue; + size_t colon = tr.find(':'); + if (colon == std::string::npos) continue; + std::string k = trimStr(tr.substr(0, colon)); + std::string v = trimStr(tr.substr(colon + 1)); + unsigned long rgb = 0; + if (!parseHexRgb(v, &rgb)) continue; + if (k == "theme.bgMain" || k == "*background") t.bgMain = rgb; + else if (k == "theme.bgHeader" || k == "dmenu.background") t.bgHeader = rgb; + else if (k == "theme.bgFooter") t.bgFooter = rgb; + else if (k == "theme.selBg" || k == "dmenu.selbackground") t.selBg = rgb; + else if (k == "theme.border" || k == "dwm.normbordercolor") t.border = rgb; + else if (k == "theme.fgMain" || k == "*foreground") t.fgMain = rgb; + else if (k == "theme.fgMuted") t.fgMuted = rgb; + else if (k == "theme.accent" || k == "*accentColor") t.accent = rgb; + else if (k == "theme.success") t.success = rgb; + else if (k == "theme.info") t.info = rgb; + else if (k == "theme.danger") t.danger = rgb; + } + }; + + if (dpy) { + Atom actualType = None; + int actualFormat = 0; + unsigned long nitems = 0, bytesAfter = 0; + unsigned char* prop = nullptr; + if (XGetWindowProperty(dpy, RootWindow(dpy, screen), XA_RESOURCE_MANAGER, + 0L, 65536L, False, XA_STRING, &actualType, + &actualFormat, &nitems, &bytesAfter, + &prop) == Success && prop) { + if (actualType == XA_STRING && actualFormat == 8 && nitems > 0) { + applyContent(std::string(reinterpret_cast(prop), nitems)); + } + XFree(prop); + } + } + const char* h = std::getenv("HOME"); + std::string xres = std::string((h && h[0]) ? h : "/home/user") + "/.Xresources"; + std::ifstream in(xres); + if (in.is_open()) { + std::ostringstream ss; + ss << in.rdbuf(); + applyContent(ss.str()); + } + return t; +} + +constexpr int kWinX = 0; +constexpr int kWinY = 24; +constexpr int kWinW = 240; +constexpr int kWinH = 296; +constexpr int kGbW = 160; +constexpr int kGbH = 144; + +volatile sig_atomic_t gRunning = 1; +volatile sig_atomic_t gReloadTheme = 0; + +void onSignal(int sig) { + if (sig == SIGUSR1) { + gReloadTheme = 1; + } else { + gRunning = 0; + } +} + +int64_t nowMs() { + struct timespec ts {}; + clock_gettime(CLOCK_MONOTONIC, &ts); + return static_cast(ts.tv_sec) * 1000 + ts.tv_nsec / 1000000; +} + +void ensureDir(const std::string& path) { + std::string cur; + for (size_t i = 0; i < path.size(); ++i) { + cur.push_back(path[i]); + if (path[i] == '/' && cur.size() > 1) { + ::mkdir(cur.c_str(), 0755); + } + } + ::mkdir(path.c_str(), 0755); +} + +std::string getHomeDir() { + const char* h = std::getenv("HOME"); + return (h && h[0]) ? h : "/home/user"; +} + +std::string getConfigPath() { + const char* xdg = std::getenv("XDG_CONFIG_HOME"); + std::string base = (xdg && xdg[0]) ? xdg : (getHomeDir() + "/.config"); + return base + "/sxmo/gambatte.cfg"; +} + +std::string getSaveDir() { + const char* xdg = std::getenv("XDG_DATA_HOME"); + std::string base = (xdg && xdg[0]) ? xdg : (getHomeDir() + "/.local/share"); + return base + "/sxmo/gambatte/saves"; +} + +std::string getStateDir() { + const char* xdg = std::getenv("XDG_DATA_HOME"); + std::string base = (xdg && xdg[0]) ? xdg : (getHomeDir() + "/.local/share"); + return base + "/sxmo/gambatte/states"; +} + +std::string stripExtAndDir(const std::string& fullPath) { + size_t sl = fullPath.rfind('/'); + std::string name = (sl == std::string::npos) ? fullPath : fullPath.substr(sl + 1); + size_t dot = name.rfind('.'); + if (dot != std::string::npos && dot > 0) { + name = name.substr(0, dot); + } + return name; +} + +std::string getExtLower(const std::string& name) { + size_t dot = name.rfind('.'); + if (dot == std::string::npos || dot + 1 >= name.size()) { + return ""; + } + std::string ext = name.substr(dot + 1); + for (char& c : ext) { + c = static_cast(std::tolower(static_cast(c))); + } + return ext; +} + +bool isGbRomExt(const std::string& name) { + std::string ext = getExtLower(name); + return ext == "gb" || ext == "gbc"; +} + +int querySoftkeysDown(Display* d) { + char km[32]; + if (!XQueryKeymap(d, km)) { + return 0; + } + int mask = 0; + if (km[135 / 8] & (1 << (135 % 8))) mask |= 1; + if (km[166 / 8] & (1 << (166 % 8))) mask |= 2; + return mask; +} + +void writeSoftkeySuppress(int64_t untilMs) { + int fd = ::open("/tmp/sxmo_softkey_suppress", + O_WRONLY | O_CREAT | O_TRUNC | O_CLOEXEC, 0644); + if (fd >= 0) { + char buf[32]; + int len = std::snprintf(buf, sizeof(buf), "%lld\n", + static_cast(untilMs)); + (void)::write(fd, buf, len); + ::close(fd); + } +} + +void toggleXDrawer() { + int fd = ::open("/tmp/dwm_plugin_xdrawer.fifo", + O_WRONLY | O_NONBLOCK | O_CLOEXEC); + if (fd >= 0) { + (void)::write(fd, "TOGGLE\n", 7); + ::close(fd); + return; + } + pid_t pid = ::fork(); + if (pid == 0) { + if (::fork() == 0) { + ::setsid(); + execlp("xdrawer", "xdrawer", static_cast(nullptr)); + _exit(0); + } + _exit(0); + } else if (pid > 0) { + int st = 0; + (void)::waitpid(pid, &st, 0); + } +} + +bool isPidAliveFile(const std::string& path) { + int fd = ::open(path.c_str(), O_RDONLY | O_CLOEXEC); + if (fd < 0) return false; + char buf[64]; + ssize_t n = ::read(fd, buf, sizeof(buf) - 1); + ::close(fd); + if (n <= 0) return false; + buf[n] = '\0'; + int pid = std::atoi(buf); + return (pid > 0 && ::kill(pid, 0) == 0); +} + +bool isExternalOverlayActive() { + if (::access("/tmp/dwm_plugin_dmenu.active", F_OK) == 0) { + return true; + } + static const char* kOverlayPids[] = { + "xdrawer.pid", + "xcallscreen.pid", + "xdialer.pid", + "xcalllog.pid", + "xcontacts.pid", + "xsms.pid", + "xfiles.pid", + "xcamera.pid", + "xthemes.pid", + "xmodem.pid", + "xnetworks.pid", + "xringtones.pid", + "xwallpapers.pid", + "xmusic.pid", + }; + char uidDir[64]; + std::snprintf(uidDir, sizeof(uidDir), "/run/user/%u", + static_cast(::getuid())); + const char* envRdir = std::getenv("XDG_RUNTIME_DIR"); + for (const char* pf : kOverlayPids) { + if (envRdir && envRdir[0] && + isPidAliveFile(std::string(envRdir) + "/" + pf)) { + return true; + } + if (isPidAliveFile(std::string(uidDir) + "/" + pf)) { + return true; + } + if (isPidAliveFile(std::string("/tmp/") + pf)) { + return true; + } + } + return false; +} + +// 5x7 crisp bitmap font +void glyphRows(char ch, uint8_t out[7]) { + std::memset(out, 0, 7); + unsigned char uc = static_cast(ch); + if (uc >= 'a' && uc <= 'z') { + uc = static_cast(uc - 'a' + 'A'); + } + switch (uc) { + case '0': { uint8_t r[7] = {0x0E,0x11,0x13,0x15,0x19,0x11,0x0E}; std::memcpy(out,r,7); break; } + case '1': { uint8_t r[7] = {0x04,0x0C,0x04,0x04,0x04,0x04,0x0E}; std::memcpy(out,r,7); break; } + case '2': { uint8_t r[7] = {0x0E,0x11,0x01,0x02,0x04,0x08,0x1F}; std::memcpy(out,r,7); break; } + case '3': { uint8_t r[7] = {0x1F,0x02,0x04,0x02,0x01,0x11,0x0E}; std::memcpy(out,r,7); break; } + case '4': { uint8_t r[7] = {0x02,0x06,0x0A,0x12,0x1F,0x02,0x02}; std::memcpy(out,r,7); break; } + case '5': { uint8_t r[7] = {0x1F,0x10,0x1E,0x01,0x01,0x11,0x0E}; std::memcpy(out,r,7); break; } + case '6': { uint8_t r[7] = {0x06,0x08,0x10,0x1E,0x11,0x11,0x0E}; std::memcpy(out,r,7); break; } + case '7': { uint8_t r[7] = {0x1F,0x01,0x02,0x04,0x08,0x08,0x08}; std::memcpy(out,r,7); break; } + case '8': { uint8_t r[7] = {0x0E,0x11,0x11,0x0E,0x11,0x11,0x0E}; std::memcpy(out,r,7); break; } + case '9': { uint8_t r[7] = {0x0E,0x11,0x11,0x0F,0x01,0x02,0x0C}; std::memcpy(out,r,7); break; } + case 'A': { uint8_t r[7] = {0x0E,0x11,0x11,0x1F,0x11,0x11,0x11}; std::memcpy(out,r,7); break; } + case 'B': { uint8_t r[7] = {0x1E,0x11,0x11,0x1E,0x11,0x11,0x1E}; std::memcpy(out,r,7); break; } + case 'C': { uint8_t r[7] = {0x0E,0x11,0x10,0x10,0x10,0x11,0x0E}; std::memcpy(out,r,7); break; } + case 'D': { uint8_t r[7] = {0x1C,0x12,0x11,0x11,0x11,0x12,0x1C}; std::memcpy(out,r,7); break; } + case 'E': { uint8_t r[7] = {0x1F,0x10,0x10,0x1E,0x10,0x10,0x1F}; std::memcpy(out,r,7); break; } + case 'F': { uint8_t r[7] = {0x1F,0x10,0x10,0x1E,0x10,0x10,0x10}; std::memcpy(out,r,7); break; } + case 'G': { uint8_t r[7] = {0x0E,0x11,0x10,0x17,0x11,0x11,0x0F}; std::memcpy(out,r,7); break; } + case 'H': { uint8_t r[7] = {0x11,0x11,0x11,0x1F,0x11,0x11,0x11}; std::memcpy(out,r,7); break; } + case 'I': { uint8_t r[7] = {0x0E,0x04,0x04,0x04,0x04,0x04,0x0E}; std::memcpy(out,r,7); break; } + case 'J': { uint8_t r[7] = {0x07,0x02,0x02,0x02,0x02,0x12,0x0C}; std::memcpy(out,r,7); break; } + case 'K': { uint8_t r[7] = {0x11,0x12,0x14,0x18,0x14,0x12,0x11}; std::memcpy(out,r,7); break; } + case 'L': { uint8_t r[7] = {0x10,0x10,0x10,0x10,0x10,0x10,0x1F}; std::memcpy(out,r,7); break; } + case 'M': { uint8_t r[7] = {0x11,0x1B,0x15,0x15,0x11,0x11,0x11}; std::memcpy(out,r,7); break; } + case 'N': { uint8_t r[7] = {0x11,0x11,0x19,0x15,0x13,0x11,0x11}; std::memcpy(out,r,7); break; } + case 'O': { uint8_t r[7] = {0x0E,0x11,0x11,0x11,0x11,0x11,0x0E}; std::memcpy(out,r,7); break; } + case 'P': { uint8_t r[7] = {0x1E,0x11,0x11,0x1E,0x10,0x10,0x10}; std::memcpy(out,r,7); break; } + case 'Q': { uint8_t r[7] = {0x0E,0x11,0x11,0x11,0x15,0x12,0x0D}; std::memcpy(out,r,7); break; } + case 'R': { uint8_t r[7] = {0x1E,0x11,0x11,0x1E,0x14,0x12,0x11}; std::memcpy(out,r,7); break; } + case 'S': { uint8_t r[7] = {0x0F,0x10,0x10,0x0E,0x01,0x01,0x1E}; std::memcpy(out,r,7); break; } + case 'T': { uint8_t r[7] = {0x1F,0x04,0x04,0x04,0x04,0x04,0x04}; std::memcpy(out,r,7); break; } + case 'U': { uint8_t r[7] = {0x11,0x11,0x11,0x11,0x11,0x11,0x0E}; std::memcpy(out,r,7); break; } + case 'V': { uint8_t r[7] = {0x11,0x11,0x11,0x11,0x11,0x0A,0x04}; std::memcpy(out,r,7); break; } + case 'W': { uint8_t r[7] = {0x11,0x11,0x11,0x15,0x15,0x1B,0x11}; std::memcpy(out,r,7); break; } + case 'X': { uint8_t r[7] = {0x11,0x11,0x0A,0x04,0x0A,0x11,0x11}; std::memcpy(out,r,7); break; } + case 'Y': { uint8_t r[7] = {0x11,0x11,0x0A,0x04,0x04,0x04,0x04}; std::memcpy(out,r,7); break; } + case 'Z': { uint8_t r[7] = {0x1F,0x01,0x02,0x04,0x08,0x10,0x1F}; std::memcpy(out,r,7); break; } + case ':': { uint8_t r[7] = {0x00,0x0C,0x0C,0x00,0x0C,0x0C,0x00}; std::memcpy(out,r,7); break; } + case '-': { uint8_t r[7] = {0x00,0x00,0x00,0x1F,0x00,0x00,0x00}; std::memcpy(out,r,7); break; } + case '+': { uint8_t r[7] = {0x00,0x04,0x04,0x1F,0x04,0x04,0x00}; std::memcpy(out,r,7); break; } + case '/': { uint8_t r[7] = {0x01,0x02,0x02,0x04,0x08,0x08,0x10}; std::memcpy(out,r,7); break; } + case '.': { uint8_t r[7] = {0x00,0x00,0x00,0x00,0x00,0x0C,0x0C}; std::memcpy(out,r,7); break; } + case ',': { uint8_t r[7] = {0x00,0x00,0x00,0x00,0x06,0x04,0x08}; std::memcpy(out,r,7); break; } + case '!': { uint8_t r[7] = {0x04,0x04,0x04,0x04,0x04,0x00,0x04}; std::memcpy(out,r,7); break; } + case '?': { uint8_t r[7] = {0x0E,0x11,0x01,0x02,0x04,0x00,0x04}; std::memcpy(out,r,7); break; } + case '*': { uint8_t r[7] = {0x00,0x15,0x0E,0x1F,0x0E,0x15,0x00}; std::memcpy(out,r,7); break; } + case '#': { uint8_t r[7] = {0x0A,0x1F,0x0A,0x0A,0x1F,0x0A,0x00}; std::memcpy(out,r,7); break; } + case '(': + case '[': { uint8_t r[7] = {0x06,0x08,0x08,0x08,0x08,0x08,0x06}; std::memcpy(out,r,7); break; } + case ')': + case ']': { uint8_t r[7] = {0x0C,0x02,0x02,0x02,0x02,0x02,0x0C}; std::memcpy(out,r,7); break; } + case '<': { uint8_t r[7] = {0x02,0x04,0x08,0x10,0x08,0x04,0x02}; std::memcpy(out,r,7); break; } + case '>': { uint8_t r[7] = {0x08,0x04,0x02,0x01,0x02,0x04,0x08}; std::memcpy(out,r,7); break; } + case '_': { uint8_t r[7] = {0x00,0x00,0x00,0x00,0x00,0x00,0x1F}; std::memcpy(out,r,7); break; } + default: break; + } +} + +void drawText(Display* dpy, Pixmap pix, GC gc, int x, int y, + const char* text, int scale, unsigned long color, + int maxChars = 999) { + XRectangle rects[512]; + int nrects = 0; + int cx = x; + int count = 0; + for (const char* p = text; *p && count < maxChars; ++p, ++count) { + uint8_t rows[7]; + glyphRows(*p, rows); + for (int r = 0; r < 7; ++r) { + uint8_t bits = rows[r]; + if (!bits) continue; + int c = 0; + while (c < 5) { + if (bits & (1 << (4 - c))) { + int start = c; + while (c < 5 && (bits & (1 << (4 - c)))) ++c; + if (nrects < static_cast(sizeof(rects) / sizeof(rects[0]))) { + rects[nrects].x = static_cast(cx + start * scale); + rects[nrects].y = static_cast(y + r * scale); + rects[nrects].width = + static_cast((c - start) * scale); + rects[nrects].height = static_cast(scale); + ++nrects; + } + } else { + ++c; + } + } + } + cx += 6 * scale; + } + if (nrects > 0) { + XSetForeground(dpy, gc, color); + XFillRectangles(dpy, pix, gc, rects, nrects); + } +} + +int textPixelWidth(const char* text, int scale) { + int len = static_cast(std::strlen(text)); + if (len <= 0) return 0; + return len * 6 * scale - scale; +} + +void drawCenteredText(Display* dpy, Pixmap pix, GC gc, int y, + const char* text, int scale, unsigned long color) { + int w = textPixelWidth(text, scale); + int x = (kWinW - w) / 2; + drawText(dpy, pix, gc, x, y, text, scale, color); +} + +// Configurable Key Action IDs +enum KeyAction { + ACT_B = 0, + ACT_TURBO_B, + ACT_A, + ACT_TURBO_A, + ACT_UP, + ACT_DOWN, + ACT_LEFT, + ACT_RIGHT, + ACT_START, + ACT_SELECT, + ACT_PALETTE, + ACT_FAST_FWD, + ACT_COUNT +}; + +const char* kActionNames[ACT_COUNT] = { + "B Button", + "Turbo B", + "A Button", + "Turbo A", + "D-Pad Up", + "D-Pad Down", + "D-Pad Left", + "D-Pad Right", + "Start", + "Select", + "Palette (*)", + "Fast Fwd" +}; + +const char* kActionCfgKeys[ACT_COUNT] = { + "key_b", + "key_turbo_b", + "key_a", + "key_turbo_a", + "key_up", + "key_down", + "key_left", + "key_right", + "key_start", + "key_select", + "key_palette", + "key_fast_fwd" +}; + +// Canonical token for any X11 key event on the T9 keypad +std::string keyEventToToken(KeySym sym, unsigned int keycode) { + if (keycode == 63 || keycode == 530 || sym == XK_asterisk || + sym == XK_KP_Multiply || static_cast(sym) == 0x1008ffaa) { + return "*"; + } + if (keycode == 106 || keycode == 531 || sym == XK_numbersign || + sym == XK_KP_Divide || static_cast(sym) == 0x1008ffab) { + return "#"; + } + if (sym >= XK_0 && sym <= XK_9) { + return std::string(1, static_cast('0' + (sym - XK_0))); + } + if (sym >= XK_KP_0 && sym <= XK_KP_9) { + return std::string(1, static_cast('0' + (sym - XK_KP_0))); + } + if (keycode >= 10 && keycode <= 18) { + return std::string(1, static_cast('1' + (keycode - 10))); + } + if (keycode == 19) { + return "0"; + } + switch (sym) { + case XK_Up: + case XK_KP_Up: + return "Up"; + case XK_Down: + case XK_KP_Down: + return "Down"; + case XK_Left: + case XK_KP_Left: + return "Left"; + case XK_Right: + case XK_KP_Right: + return "Right"; + case XK_Return: + case XK_KP_Enter: + return "OK"; + case XF86XK_Phone: + case XF86XK_PickupPhone: + return "Call"; + default: + break; + } + if (keycode == 177) { + return "Call"; + } + const char* ks = XKeysymToString(sym); + if (ks && ks[0]) { + return ks; + } + return ""; +} + +struct EmulatorConfig { + std::string bindings[ACT_COUNT]; + int paletteIdx = 0; + int scaleMode = 0; // 0 = Fit 240x216, 1 = 1:1 160x144, 2 = Stretch 240x244, 3 = Full 240x296 + bool audioEnabled = true; + int stateSlot = 0; + std::string lastDir; + + void resetControlsToDefault() { + // Requested defaults: + // B is 8, Turbo B is 5, A is 9, Turbo A is 6, + // D-pad for directions, 2 for start, 3 for select, * for palette selection + bindings[ACT_B] = "8"; + bindings[ACT_TURBO_B] = "5"; + bindings[ACT_A] = "9"; + bindings[ACT_TURBO_A] = "6"; + bindings[ACT_UP] = "Up"; + bindings[ACT_DOWN] = "Down"; + bindings[ACT_LEFT] = "Left"; + bindings[ACT_RIGHT] = "Right"; + bindings[ACT_START] = "2"; + bindings[ACT_SELECT] = "3"; + bindings[ACT_PALETTE] = "*"; + bindings[ACT_FAST_FWD] = "0"; + } + + EmulatorConfig() { + resetControlsToDefault(); + lastDir = getHomeDir(); + } + + void load() { + std::ifstream in(getConfigPath()); + if (!in.is_open()) { + return; + } + std::string line; + while (std::getline(in, line)) { + if (line.empty() || line[0] == '#') continue; + size_t eq = line.find('='); + if (eq == std::string::npos) continue; + std::string k = line.substr(0, eq); + std::string v = line.substr(eq + 1); + if (k == "palette") { + paletteIdx = std::clamp(std::atoi(v.c_str()), 0, 9); + } else if (k == "scale_mode") { + scaleMode = std::clamp(std::atoi(v.c_str()), 0, 3); + } else if (k == "audio") { + audioEnabled = (std::atoi(v.c_str()) != 0); + } else if (k == "state_slot") { + stateSlot = std::clamp(std::atoi(v.c_str()), 0, 9); + } else if (k == "last_dir" && !v.empty()) { + lastDir = v; + } else { + for (int i = 0; i < ACT_COUNT; ++i) { + if (k == kActionCfgKeys[i] && !v.empty()) { + bindings[i] = v; + } + } + } + } + } + + void save() const { + std::string path = getConfigPath(); + size_t sl = path.rfind('/'); + if (sl != std::string::npos) { + ensureDir(path.substr(0, sl)); + } + std::ofstream out(path, std::ios::trunc); + if (!out.is_open()) return; + out << "palette=" << paletteIdx << "\n"; + out << "scale_mode=" << scaleMode << "\n"; + out << "audio=" << (audioEnabled ? 1 : 0) << "\n"; + out << "state_slot=" << stateSlot << "\n"; + out << "last_dir=" << lastDir << "\n"; + for (int i = 0; i < ACT_COUNT; ++i) { + out << kActionCfgKeys[i] << "=" << bindings[i] << "\n"; + } + } +}; + +struct ColorPalette { + const char* name; + uint32_t bg[4]; + uint32_t sp1[4]; + uint32_t sp2[4]; +}; + +constexpr int kNumPalettes = 10; +const ColorPalette kPalettes[kNumPalettes] = { + { + "DMG Classic", + {0x9BBC0F, 0x8BAC0F, 0x306230, 0x0F380F}, + {0x9BBC0F, 0x8BAC0F, 0x306230, 0x0F380F}, + {0x9BBC0F, 0x8BAC0F, 0x306230, 0x0F380F}, + }, + { + "Bananarchy Gold", + {0xFFF3B0, 0xF5C518, 0x9E6B00, 0x1A1812}, + {0xFFFFFF, 0xFF9F1C, 0xC84B31, 0x1A1812}, + {0xFFF3B0, 0x5BC0BE, 0x1C7293, 0x1A1812}, + }, + { + "GB Pocket Gray", + {0xE0E0D8, 0xA0A098, 0x585850, 0x181814}, + {0xE0E0D8, 0xA0A098, 0x585850, 0x181814}, + {0xE0E0D8, 0xA0A098, 0x585850, 0x181814}, + }, + { + "GB Light Teal", + {0xC8FAF0, 0x5CD6C8, 0x1E8278, 0x062E2A}, + {0xC8FAF0, 0x5CD6C8, 0x1E8278, 0x062E2A}, + {0xC8FAF0, 0x5CD6C8, 0x1E8278, 0x062E2A}, + }, + { + "GBC Blue/Red", + {0xFFFFFF, 0x7BFF31, 0x0063C5, 0x000000}, + {0xFFFFFF, 0xFF8484, 0x943A3A, 0x000000}, + {0xFFFFFF, 0xFFB542, 0x845200, 0x000000}, + }, + { + "Super Game Boy", + {0xF7E7C6, 0xD68E49, 0xA63725, 0x331E50}, + {0xF7E7C6, 0xE86A33, 0x8B1E3F, 0x1B0E24}, + {0xF7E7C6, 0x68B0AB, 0x2E5266, 0x1B0E24}, + }, + { + "Amber CRT", + {0xFFD866, 0xF29E02, 0x994E00, 0x1F0D00}, + {0xFFD866, 0xF29E02, 0x994E00, 0x1F0D00}, + {0xFFD866, 0xF29E02, 0x994E00, 0x1F0D00}, + }, + { + "Mintberry", + {0xE8F8E8, 0x70D6B8, 0x4A6FA5, 0x1D1E2C}, + {0xFFE6F2, 0xFF70A6, 0xA32658, 0x1D1E2C}, + {0xE8F8E8, 0xFFD166, 0x8A5A00, 0x1D1E2C}, + }, + { + "Virtual Boy", + {0xFF3838, 0xB80000, 0x600000, 0x0A0000}, + {0xFF6060, 0xD00000, 0x700000, 0x0A0000}, + {0xFF3838, 0xB80000, 0x600000, 0x0A0000}, + }, + { + "Inverted Dark", + {0x14181D, 0x465466, 0x98A8B8, 0xF0F6FC}, + {0x14181D, 0x52796F, 0x84A98C, 0xCAD2C5}, + {0x14181D, 0x7F5539, 0xD4A373, 0xFAEDCD}, + }, +}; + +class PhoneInputGetter : public gambatte::InputGetter { + public: + unsigned state = 0; + unsigned operator()() override { + return state; + } +}; + +// Direct ALSA PCM audio engine (48000 Hz stereo S16_LE via libasound) +// with Gambatte's 64-tap Convoluted Cosine + DC-blocking High-Pass resampler, +// low-latency hardware ringbuffer (< 25 ms), and live speaker_vol scaling. +class PcmAudioOut { + public: + void start() { + refreshVolume(true); + if (threadRunning_.load(std::memory_order_relaxed)) return; + stop(); + resetFilterState(); + + const char* xdgRun = std::getenv("XDG_RUNTIME_DIR"); + if (!xdgRun || !xdgRun[0]) { + char runBuf[64]; + std::snprintf(runBuf, sizeof(runBuf), "/run/user/%u", + static_cast(::getuid())); + ::setenv("XDG_RUNTIME_DIR", runBuf, 0); + } + + std::memset(ring_, 0, sizeof(ring_)); + readPos_.store(0, std::memory_order_relaxed); + // Seed 512 frames (2 periods = 10.67 ms) of silence so the feeder thread + // always stays >= 1 period ahead of DMA period boundaries. + writePos_.store(512, std::memory_order_release); + threadRunning_.store(true, std::memory_order_release); + worker_ = std::thread(&PcmAudioOut::audioThreadMain, this); + } + + void stop() { + if (threadRunning_.exchange(false, std::memory_order_acq_rel)) { + if (worker_.joinable()) { + worker_.join(); + } + } else if (worker_.joinable()) { + worker_.join(); + } + } + + bool isOpen() const { + return threadRunning_.load(std::memory_order_relaxed); + } + + int speakerVolPct() const { + return speakerPct_; + } + + bool isSystemMuted() const { + return sysMuted_; + } + + void refreshVolumeIfNeeded(int64_t tNow) { + if (tNow - lastVolCheckMs_ < 500) return; + lastVolCheckMs_ = tNow; + const char* xdg = std::getenv("XDG_CONFIG_HOME"); + std::string path = + ((xdg && xdg[0]) ? (std::string(xdg) + "/sxmo") + : (getHomeDir() + "/.config/sxmo")) + + "/speaker_vol"; + struct stat st {}; + if (::stat(path.c_str(), &st) == 0 && + st.st_mtim.tv_sec != lastVolMtime_) { + lastVolMtime_ = st.st_mtim.tv_sec; + refreshVolume(false); + } + } + + void refreshVolume(bool syncHw) { + lastVolCheckMs_ = nowMs(); + + const char* xdg = std::getenv("XDG_CONFIG_HOME"); + std::string cfgDir = + (xdg && xdg[0]) ? (std::string(xdg) + "/sxmo") + : (getHomeDir() + "/.config/sxmo"); + + int pct = -1; + { + std::string volPath = cfgDir + "/speaker_vol"; + struct stat st {}; + if (::stat(volPath.c_str(), &st) == 0) { + lastVolMtime_ = st.st_mtim.tv_sec; + } + std::ifstream ifs(volPath); + if (ifs) { + ifs >> pct; + } + } + + bool spkSwitch = true; + long rx3Cur = 84; + snd_ctl_t* ctl = nullptr; + if (snd_ctl_open(&ctl, "hw:0", 0) == 0 && ctl) { + spkSwitch = readCtlBool(ctl, "SPK DAC Switch", true); + rx3Cur = readCtlInt(ctl, "RX3 Digital Volume", 84); + if (pct < 0 || pct > 100) { + if (rx3Cur <= 0) { + pct = 0; + } else if (rx3Cur >= 84) { + pct = 100; + } else { + pct = std::clamp( + static_cast(((rx3Cur - 60) * 100) / 32), 5, 100); + } + } + pct = std::clamp((pct / 5) * 5, 0, 100); + // Map 1..100% to RX3 Digital Volume 56..84 (84 = 0.0 dB unity gain on + // WCD9302) so the hardware codec never applies +8 dB digital overdrive. + long targetRx3 = + (pct <= 0) ? 0 : (56 + ((pct * 28 + 50) / 100)); + if (spkSwitch && ((syncHw && rx3Cur != targetRx3) || rx3Cur > 84)) { + writeCtlInt(ctl, "RX3 Digital Volume", targetRx3); + } + snd_ctl_close(ctl); + } else { + if (pct < 0 || pct > 100) pct = 75; + pct = std::clamp((pct / 5) * 5, 0, 100); + } + + speakerPct_ = pct; + sysMuted_ = !spkSwitch || (pct <= 0); + if (sysMuted_) { + volScale_ = 0; + } else { + volScale_ = std::max(1, (pct * pct * 20 + 5000) / 10000); + } + } + + void adjustSpeakerVol(int deltaPct) { + refreshVolume(false); + int nextPct = std::clamp(((speakerPct_ + deltaPct) / 5) * 5, 0, 100); + const char* xdg = std::getenv("XDG_CONFIG_HOME"); + std::string cfgDir = + (xdg && xdg[0]) ? (std::string(xdg) + "/sxmo") + : (getHomeDir() + "/.config/sxmo"); + ensureDir(cfgDir); + { + std::ofstream ofs(cfgDir + "/speaker_vol", std::ios::trunc); + if (ofs) ofs << nextPct << "\n"; + } + snd_ctl_t* ctl = nullptr; + if (snd_ctl_open(&ctl, "hw:0", 0) == 0 && ctl) { + long targetRx3 = + (nextPct <= 0) ? 0 : (56 + ((nextPct * 28 + 50) / 100)); + if (nextPct > 0) { + writeCtlBool(ctl, "SPK DAC Switch", true); + } + writeCtlInt(ctl, "RX3 Digital Volume", targetRx3); + snd_ctl_close(ctl); + } + refreshVolume(false); + } + + void resetFilterState() { + accumSamples_ = 0; + currentL_ = 0; + currentR_ = 0; + nextL_ = 0; + nextR_ = 0; + prevSmplL_ = 0; + prevSmplR_ = 0; + highpassL_ = 0; + highpassR_ = 0; + prevOutL_ = 0; + prevOutR_ = 0; + lpf1L_ = 0; + lpf1R_ = 0; + lpf2L_ = 0; + lpf2R_ = 0; + resamplePos_ = 0; + } + + // Convolve 2097152 Hz Gambatte stereo samples to 65536 Hz (64-tap cosine + highpass), + // then linearly interpolate 65536 Hz -> 48000 Hz and push to lock-free ringbuffer. + void writeGbSamples(const gambatte::uint_least32_t* src, unsigned count) { + if (!threadRunning_.load(std::memory_order_relaxed) || count == 0) return; + + static const int16_t kCcKernel[32] = { + 0x0800, 0x07fb, 0x07eb, 0x07d3, 0x07b3, 0x0787, 0x0753, 0x0717, + 0x06d3, 0x068b, 0x063b, 0x05e2, 0x0586, 0x052a, 0x04c6, 0x0466, + 0x0402, 0x0399, 0x0339, 0x02d5, 0x0279, 0x021d, 0x01c4, 0x0174, + 0x012c, 0x00e8, 0x00ac, 0x0078, 0x004c, 0x002c, 0x0014, 0x0004 + }; + static const int16_t kCcKernelR[32] = { + 0x0000, 0x0004, 0x0014, 0x002c, 0x004c, 0x0078, 0x00ac, 0x00e8, + 0x012c, 0x0174, 0x01c4, 0x021d, 0x0279, 0x02d5, 0x0339, 0x0399, + 0x0402, 0x0466, 0x04c6, 0x052a, 0x0586, 0x05e2, 0x063b, 0x068b, + 0x06d3, 0x0717, 0x0753, 0x0787, 0x07b3, 0x07d3, 0x07eb, 0x07fb + }; + + int16_t outBuf[1024 * 2]; + size_t outFrames = 0; + const int32_t vscale = volScale_.load(std::memory_order_relaxed); + + auto flushOutBuf = [&]() { + if (outFrames == 0) return; + + uint32_t rp = readPos_.load(std::memory_order_acquire); + uint32_t wp = writePos_.load(std::memory_order_relaxed); + uint32_t queued = wp - rp; + + // Cap software ringbuffer backlog at 1536 frames (6 periods) so normal + // 1x sub-slices never drop a single sample, while fast-forward or clock + // drift is cleanly bounded. + size_t startIdx = 0; + if (queued + outFrames > 1536) { + size_t maxPush = (queued < 1536) ? static_cast(1536 - queued) : 0; + if (maxPush == 0) { + outFrames = 0; + return; + } + if (outFrames > maxPush) { + startIdx = outFrames - maxPush; + } + } + + for (size_t i = startIdx; i < outFrames; ++i) { + uint32_t dst = wp & kRingMask; + ring_[dst * 2] = outBuf[i * 2]; + ring_[dst * 2 + 1] = outBuf[i * 2 + 1]; + ++wp; + } + writePos_.store(wp, std::memory_order_release); + outFrames = 0; + }; + + for (unsigned i = 0; i < count; ++i) { + uint32_t s = src[i]; + int32_t inL = static_cast(s & 0xFFFFu); + int32_t inR = static_cast((s >> 16) & 0xFFFFu); + + currentL_ += inL * kCcKernel[accumSamples_]; + currentR_ += inR * kCcKernel[accumSamples_]; + nextL_ += inL * kCcKernelR[accumSamples_]; + nextR_ += inR * kCcKernelR[accumSamples_]; + + if (++accumSamples_ == 32) { + accumSamples_ = 0; + + // Keep intermediate high-pass state in 32-bit signed integers so + // square-wave edges (+-61440 delta) never wrap around 16-bit int16_t! + int32_t sampleL = currentL_ >> 16; + int32_t tmpL = highpassL_ + ((sampleL - prevSmplL_) << 8); + highpassL_ = tmpL - (tmpL >> 7); + prevSmplL_ = sampleL; + int32_t outL = (highpassL_ + 128) >> 8; + + int32_t sampleR = currentR_ >> 16; + int32_t tmpR = highpassR_ + ((sampleR - prevSmplR_) << 8); + highpassR_ = tmpR - (tmpR >> 7); + prevSmplR_ = sampleR; + int32_t outR = (highpassR_ + 128) >> 8; + + currentL_ = nextL_; + currentR_ = nextR_; + nextL_ = 0; + nextR_ = 0; + + // 48000 / 65536 = 375 / 512 in lowest terms (avoids 32-bit overflow). + while (resamplePos_ < 375) { + int32_t interpL = + prevOutL_ + ((outL - prevOutL_) * resamplePos_) / 375; + int32_t interpR = + prevOutR_ + ((outR - prevOutR_) * resamplePos_) / 375; + + // 2-stage 1-pole low-pass filter (alpha = 3/8, fc ~ 2.3 kHz -3dB) + // modeling the Game Boy's analog output stage to roll off harsh + // 3.5-16 kHz square-wave harmonics on the phone micro-speaker. + lpf1L_ += ((interpL - lpf1L_) * 3) >> 3; + lpf2L_ += ((lpf1L_ - lpf2L_) * 3) >> 3; + lpf1R_ += ((interpR - lpf1R_) * 3) >> 3; + lpf2R_ += ((lpf1R_ - lpf2R_) * 3) >> 3; + + int32_t scaledL = (lpf2L_ * vscale) >> 8; + int32_t scaledR = (lpf2R_ * vscale) >> 8; + outBuf[outFrames * 2] = + static_cast(std::clamp(scaledL, -32768, 32767)); + outBuf[outFrames * 2 + 1] = + static_cast(std::clamp(scaledR, -32768, 32767)); + ++outFrames; + if (outFrames == 256) { + flushOutBuf(); + } + resamplePos_ += 512; + } + resamplePos_ -= 375; + prevOutL_ = outL; + prevOutR_ = outR; + } + } + flushOutBuf(); + } + + ~PcmAudioOut() { + stop(); + } + + private: + void audioThreadMain() { + snd_pcm_t* h = nullptr; + const char* devs[] = {"hw:0,0", "default", "plughw:0,0"}; + for (const char* dev : devs) { + if (snd_pcm_open(&h, dev, SND_PCM_STREAM_PLAYBACK, 0) >= 0) { + if (configureLowLatency(h)) { + break; + } + snd_pcm_close(h); + h = nullptr; + } + } + if (!h) { + for (const char* dev : devs) { + if (snd_pcm_open(&h, dev, SND_PCM_STREAM_PLAYBACK, 0) >= 0) { + if (snd_pcm_set_params(h, SND_PCM_FORMAT_S16_LE, + SND_PCM_ACCESS_RW_INTERLEAVED, 2, 48000, 1, + 25000) >= 0) { + break; + } + snd_pcm_close(h); + h = nullptr; + } + } + } + if (!h) { + threadRunning_.store(false, std::memory_order_release); + return; + } + + snd_pcm_prepare(h); + int16_t chunk[256 * 2]; + int16_t lastL = 0; + int16_t lastR = 0; + + while (threadRunning_.load(std::memory_order_acquire)) { + uint32_t rp = readPos_.load(std::memory_order_relaxed); + uint32_t wp = writePos_.load(std::memory_order_acquire); + uint32_t avail = wp - rp; + + if (avail >= 256) { + for (uint32_t i = 0; i < 256; ++i) { + uint32_t src = (rp + i) & kRingMask; + lastL = ring_[src * 2]; + lastR = ring_[src * 2 + 1]; + chunk[i * 2] = lastL; + chunk[i * 2 + 1] = lastR; + } + readPos_.store(rp + 256, std::memory_order_release); + } else { + snd_pcm_state_t st = snd_pcm_state(h); + snd_pcm_sframes_t pcmAvail = snd_pcm_avail_update(h); + if (st == SND_PCM_STATE_XRUN || pcmAvail < 0) { + snd_pcm_prepare(h); + st = snd_pcm_state(h); + pcmAvail = snd_pcm_avail_update(h); + } + snd_pcm_sframes_t hwQueued = + (pcmAvail >= 0 && pcmAvail <= 1024) ? (1024 - pcmAvail) : 0; + + if (st != SND_PCM_STATE_RUNNING || hwQueued >= 512) { + // ALSA still has >= 512 frames (>= 2 periods = 10.67 ms) in DMA; + // wait briefly for the emulator to push the next 4.18 ms slice. + ::usleep(500); + continue; + } + + // Hardware DMA is down to its final 256-frame period and ringbuffer has + // < 256 frames: keep the partial frames in ring_ so they accumulate to + // >= 256 on the next slice, and write one 256-frame smooth decay period + // to keep appl_ptr period-aligned and prevent an XRUN. + for (uint32_t i = 0; i < 256; ++i) { + lastL -= lastL >> 4; + lastR -= lastR >> 4; + chunk[i * 2] = lastL; + chunk[i * 2 + 1] = lastR; + } + } + + snd_pcm_sframes_t written = 0; + while (written < 256 && threadRunning_.load(std::memory_order_relaxed)) { + snd_pcm_sframes_t w = + snd_pcm_writei(h, chunk + written * 2, 256 - written); + if (w > 0) { + written += w; + } else if (w == -EAGAIN) { + snd_pcm_wait(h, 4); + } else if (w < 0) { + if (snd_pcm_recover(h, static_cast(w), 1) < 0) { + snd_pcm_prepare(h); + } + break; + } + } + } + + snd_pcm_drop(h); + snd_pcm_close(h); + } + + static bool configureLowLatency(snd_pcm_t* h) { + snd_pcm_hw_params_t* hw = nullptr; + snd_pcm_hw_params_alloca(&hw); + if (snd_pcm_hw_params_any(h, hw) < 0) return false; + if (snd_pcm_hw_params_set_access(h, hw, SND_PCM_ACCESS_RW_INTERLEAVED) < 0) { + return false; + } + if (snd_pcm_hw_params_set_format(h, hw, SND_PCM_FORMAT_S16_LE) < 0) { + return false; + } + if (snd_pcm_hw_params_set_channels(h, hw, 2) < 0) return false; + unsigned int rate = 48000; + if (snd_pcm_hw_params_set_rate_near(h, hw, &rate, nullptr) < 0 || + rate != 48000) { + return false; + } + snd_pcm_uframes_t periodSize = 256; + snd_pcm_hw_params_set_period_size_near(h, hw, &periodSize, nullptr); + snd_pcm_uframes_t bufferSize = 1024; // 4 periods of 256 frames (21.3 ms) + snd_pcm_hw_params_set_buffer_size_near(h, hw, &bufferSize); + if (snd_pcm_hw_params(h, hw) < 0) return false; + + snd_pcm_sw_params_t* sw = nullptr; + snd_pcm_sw_params_alloca(&sw); + if (snd_pcm_sw_params_current(h, sw) == 0) { + snd_pcm_sw_params_set_start_threshold(h, sw, 512); + snd_pcm_sw_params_set_avail_min(h, sw, 256); + snd_pcm_sw_params(h, sw); + } + return true; + } + + static long readCtlInt(snd_ctl_t* ctl, const char* name, long fallback) { + snd_ctl_elem_id_t* id = nullptr; + snd_ctl_elem_value_t* val = nullptr; + snd_ctl_elem_id_alloca(&id); + snd_ctl_elem_value_alloca(&val); + snd_ctl_elem_id_set_interface(id, SND_CTL_ELEM_IFACE_MIXER); + snd_ctl_elem_id_set_name(id, name); + snd_ctl_elem_value_set_id(val, id); + if (snd_ctl_elem_read(ctl, val) < 0) return fallback; + return snd_ctl_elem_value_get_integer(val, 0); + } + + static void writeCtlInt(snd_ctl_t* ctl, const char* name, long v) { + snd_ctl_elem_id_t* id = nullptr; + snd_ctl_elem_value_t* val = nullptr; + snd_ctl_elem_id_alloca(&id); + snd_ctl_elem_value_alloca(&val); + snd_ctl_elem_id_set_interface(id, SND_CTL_ELEM_IFACE_MIXER); + snd_ctl_elem_id_set_name(id, name); + snd_ctl_elem_value_set_id(val, id); + snd_ctl_elem_value_set_integer(val, 0, v); + (void)snd_ctl_elem_write(ctl, val); + } + + static bool readCtlBool(snd_ctl_t* ctl, const char* name, bool fallback) { + snd_ctl_elem_id_t* id = nullptr; + snd_ctl_elem_value_t* val = nullptr; + snd_ctl_elem_id_alloca(&id); + snd_ctl_elem_value_alloca(&val); + snd_ctl_elem_id_set_interface(id, SND_CTL_ELEM_IFACE_MIXER); + snd_ctl_elem_id_set_name(id, name); + snd_ctl_elem_value_set_id(val, id); + if (snd_ctl_elem_read(ctl, val) < 0) return fallback; + return snd_ctl_elem_value_get_boolean(val, 0) != 0; + } + + static void writeCtlBool(snd_ctl_t* ctl, const char* name, bool v) { + snd_ctl_elem_id_t* id = nullptr; + snd_ctl_elem_value_t* val = nullptr; + snd_ctl_elem_id_alloca(&id); + snd_ctl_elem_value_alloca(&val); + snd_ctl_elem_id_set_interface(id, SND_CTL_ELEM_IFACE_MIXER); + snd_ctl_elem_id_set_name(id, name); + snd_ctl_elem_value_set_id(val, id); + snd_ctl_elem_value_set_boolean(val, 0, v ? 1 : 0); + (void)snd_ctl_elem_write(ctl, val); + } + + static constexpr uint32_t kRingFrames = 4096; + static constexpr uint32_t kRingMask = kRingFrames - 1; + int16_t ring_[kRingFrames * 2] = {0}; + std::atomic writePos_{0}; + std::atomic readPos_{0}; + std::atomic threadRunning_{false}; + std::thread worker_; + int speakerPct_ = 75; + bool sysMuted_ = false; + std::atomic volScale_{21}; + int64_t lastVolCheckMs_ = 0; + time_t lastVolMtime_ = 0; + unsigned accumSamples_ = 0; + int32_t currentL_ = 0; + int32_t currentR_ = 0; + int32_t nextL_ = 0; + int32_t nextR_ = 0; + int32_t prevSmplL_ = 0; + int32_t prevSmplR_ = 0; + int32_t highpassL_ = 0; + int32_t highpassR_ = 0; + int32_t prevOutL_ = 0; + int32_t prevOutR_ = 0; + int32_t lpf1L_ = 0; + int32_t lpf1R_ = 0; + int32_t lpf2L_ = 0; + int32_t lpf2R_ = 0; + int32_t resamplePos_ = 0; +}; + +// Blend two 0x00RRGGBB pixels 50/50 in a single bitwise operation +inline uint32_t blend50(uint32_t a, uint32_t b) { + return ((a & 0xFEFEFEu) >> 1) + ((b & 0xFEFEFEu) >> 1) + (a & b & 0x010101u); +} + +// Fast 1.5x (160x144 -> 240x216) area-interpolated scaler +void scale160x144To240x216(const gambatte::video_pixel_t* src, int srcPitch, + uint32_t* dst, int dstStride) { + uint32_t row0[240]; + uint32_t row1[240]; + + auto scaleRowHoriz = [](const gambatte::video_pixel_t* srow, uint32_t* drow) { + int dx = 0; + for (int sx = 0; sx < 160; sx += 2) { + uint32_t p0 = static_cast(srow[sx]); + uint32_t p1 = static_cast(srow[sx + 1]); + drow[dx] = p0; + drow[dx + 1] = blend50(p0, p1); + drow[dx + 2] = p1; + dx += 3; + } + }; + + int dy = 0; + for (int sy = 0; sy < 144; sy += 2) { + scaleRowHoriz(src + sy * srcPitch, row0); + scaleRowHoriz(src + (sy + 1) * srcPitch, row1); + + uint32_t* d0 = dst + dy * dstStride; + uint32_t* d1 = dst + (dy + 1) * dstStride; + uint32_t* d2 = dst + (dy + 2) * dstStride; + std::memcpy(d0, row0, 240 * sizeof(uint32_t)); + for (int x = 0; x < 240; ++x) { + d1[x] = blend50(row0[x], row1[x]); + } + std::memcpy(d2, row1, 240 * sizeof(uint32_t)); + dy += 3; + } +} + +void scale160x144ToArbitrary(const gambatte::video_pixel_t* src, int srcPitch, + uint32_t* dst, int dstStride, int outW, int outH) { + uint32_t row0[240]; + for (int y = 0; y < outH; ++y) { + int sy = (y * kGbH) / outH; + const gambatte::video_pixel_t* srow = src + sy * srcPitch; + int dx = 0; + for (int sx = 0; sx < 160; sx += 2) { + uint32_t p0 = static_cast(srow[sx]); + uint32_t p1 = static_cast(srow[sx + 1]); + row0[dx] = p0; + row0[dx + 1] = blend50(p0, p1); + row0[dx + 2] = p1; + dx += 3; + } + std::memcpy(dst + y * dstStride, row0, outW * sizeof(uint32_t)); + } +} + +struct RomEntry { + std::string name; + std::string fullPath; + bool isDir = false; + bool isParent = false; +}; + +} // namespace + +void cartridge_set_rumble(unsigned active) { + static unsigned lastActive = 0; + if (active == lastActive) return; + lastActive = active; + int fd = ::open("/sys/class/leds/vibrator/brightness", + O_WRONLY | O_NONBLOCK | O_CLOEXEC); + if (fd >= 0) { + (void)::write(fd, active ? "180\n" : "0\n", active ? 4 : 2); + ::close(fd); + } +} + +int main(int argc, char** argv) { + struct sigaction sa {}; + sa.sa_handler = onSignal; + sigemptyset(&sa.sa_mask); + sigaction(SIGTERM, &sa, nullptr); + sigaction(SIGINT, &sa, nullptr); + sigaction(SIGUSR1, &sa, nullptr); + signal(SIGPIPE, SIG_IGN); + + Display* dpy = XOpenDisplay(nullptr); + if (!dpy) { + std::fprintf(stderr, "gambatte: cannot open X11 display\n"); + return 1; + } + + int screen = DefaultScreen(dpy); + Window root = RootWindow(dpy, screen); + Visual* visual = DefaultVisual(dpy, screen); + int depth = DefaultDepth(dpy, screen); + + ThemeSpec tspec = loadThemeSpec(dpy, screen); + + XSetWindowAttributes swa {}; + swa.override_redirect = True; + swa.background_pixel = tspec.bgMain; + swa.border_pixel = tspec.border; + swa.event_mask = ExposureMask | KeyPressMask | KeyReleaseMask | + StructureNotifyMask | FocusChangeMask | VisibilityChangeMask; + + Window win = XCreateWindow( + dpy, root, kWinX, kWinY, kWinW, kWinH, 0, depth, InputOutput, visual, + CWOverrideRedirect | CWBackPixel | CWBorderPixel | CWEventMask, &swa); + + XClassHint ch {}; + char resName[] = "gambatte"; + char resClass[] = "Gambatte"; + ch.res_name = resName; + ch.res_class = resClass; + XSetClassHint(dpy, win, &ch); + XStoreName(dpy, win, "Game Boy (Gambatte)"); + + Atom wmDelete = XInternAtom(dpy, "WM_DELETE_WINDOW", False); + XSetWMProtocols(dpy, win, &wmDelete, 1); + + Pixmap pix = XCreatePixmap(dpy, win, kWinW, kWinH, depth); + GC gc = XCreateGC(dpy, pix, 0, nullptr); + XSetGraphicsExposures(dpy, gc, False); + + // Offscreen XImage for scaled Game Boy video (up to 240x296) + std::vector scaledPixels(kWinW * kWinH, 0); + XImage* ximg = XCreateImage( + dpy, visual, depth, ZPixmap, 0, + reinterpret_cast(scaledPixels.data()), kWinW, kWinH, 32, + kWinW * sizeof(uint32_t)); + + bool keyboardGrabbed = false; + XMapRaised(dpy, win); + XSetInputFocus(dpy, win, RevertToPointerRoot, CurrentTime); + for (int i = 0; i < 30; ++i) { + if (XGrabKeyboard(dpy, win, True, GrabModeAsync, GrabModeAsync, + CurrentTime) == GrabSuccess) { + keyboardGrabbed = true; + break; + } + ::usleep(5000); + } + XFlush(dpy); + + EmulatorConfig cfg; + cfg.load(); + + gambatte::GB gb; + PhoneInputGetter inputGetter; + gb.setInputGetter(&inputGetter); + + PcmAudioOut audioOut; + audioOut.refreshVolume(true); + + std::vector gbFrame(kGbW * kGbH, 0); + std::vector postFrame(kGbW * kGbH, 0); + std::vector soundBuf(35112 + 4096, 0); + + std::string currentRomPath; + std::string currentRomBase; + std::string currentRomTitle; + bool romLoaded = false; + + std::string toastText; + int64_t toastUntilMs = 0; + auto showToast = [&](const std::string& msg, int durationMs = 1500) { + toastText = msg; + toastUntilMs = nowMs() + durationMs; + }; + + auto applyDmgPalette = [&]() { + const ColorPalette& pal = kPalettes[cfg.paletteIdx % kNumPalettes]; + for (unsigned c = 0; c < 4; ++c) { + gb.setDmgPaletteColor(0, c, pal.bg[c]); + gb.setDmgPaletteColor(1, c, pal.sp1[c]); + gb.setDmgPaletteColor(2, c, pal.sp2[c]); + } + }; + + auto saveBatterySram = [&]() { + if (!romLoaded || currentRomBase.empty()) return; + unsigned sz = gb.savedata_size(); + void* ptr = gb.savedata_ptr(); + if (sz > 0 && ptr) { + ensureDir(getSaveDir()); + std::string savPath = getSaveDir() + "/" + currentRomBase + ".sav"; + std::ofstream out(savPath, std::ios::binary | std::ios::trunc); + if (out.is_open()) { + out.write(static_cast(ptr), sz); + } + } + unsigned rsz = gb.rtcdata_size(); + void* rptr = gb.rtcdata_ptr(); + if (rsz > 0 && rptr) { + ensureDir(getSaveDir()); + std::string rtcPath = getSaveDir() + "/" + currentRomBase + ".rtc"; + std::ofstream out(rtcPath, std::ios::binary | std::ios::trunc); + if (out.is_open()) { + out.write(static_cast(rptr), rsz); + } + } + }; + + auto loadBatterySram = [&]() { + if (!romLoaded || currentRomBase.empty()) return; + unsigned sz = gb.savedata_size(); + void* ptr = gb.savedata_ptr(); + if (sz > 0 && ptr) { + std::string savPath = getSaveDir() + "/" + currentRomBase + ".sav"; + std::ifstream in(savPath, std::ios::binary); + if (in.is_open()) { + in.read(static_cast(ptr), sz); + } + } + unsigned rsz = gb.rtcdata_size(); + void* rptr = gb.rtcdata_ptr(); + if (rsz > 0 && rptr) { + std::string rtcPath = getSaveDir() + "/" + currentRomBase + ".rtc"; + std::ifstream in(rtcPath, std::ios::binary); + if (in.is_open()) { + in.read(static_cast(rptr), rsz); + } + } + }; + + auto saveEmulatorState = [&](int slot) -> bool { + if (!romLoaded || currentRomBase.empty()) return false; + size_t stSize = gb.stateSize(); + if (stSize == 0) return false; + std::vector buf(stSize); + gb.saveState(buf.data()); + ensureDir(getStateDir()); + std::string stPath = + getStateDir() + "/" + currentRomBase + ".st" + std::to_string(slot); + std::ofstream out(stPath, std::ios::binary | std::ios::trunc); + if (!out.is_open()) return false; + out.write(reinterpret_cast(buf.data()), + static_cast(buf.size())); + return out.good(); + }; + + auto loadEmulatorState = [&](int slot) -> bool { + if (!romLoaded || currentRomBase.empty()) return false; + std::string stPath = + getStateDir() + "/" + currentRomBase + ".st" + std::to_string(slot); + std::ifstream in(stPath, std::ios::binary | std::ios::ate); + if (!in.is_open()) return false; + std::streamsize sz = in.tellg(); + if (sz <= 0) return false; + in.seekg(0, std::ios::beg); + std::vector buf(static_cast(sz)); + if (!in.read(reinterpret_cast(buf.data()), sz)) return false; + return gb.loadState(buf.data(), buf.size()); + }; + + auto loadRomFile = [&](const std::string& path) -> bool { + std::ifstream in(path, std::ios::binary | std::ios::ate); + if (!in.is_open()) { + showToast("Failed to open ROM"); + return false; + } + std::streamsize sz = in.tellg(); + if (sz <= 0 || sz > 16 * 1024 * 1024) { + showToast("Invalid ROM size"); + return false; + } + in.seekg(0, std::ios::beg); + std::vector romBytes(static_cast(sz)); + if (!in.read(reinterpret_cast(romBytes.data()), sz)) { + showToast("Failed to read ROM"); + return false; + } + + if (romLoaded) { + saveBatterySram(); + } + + if (gb.load(romBytes.data(), static_cast(romBytes.size()), 0) != 0) { + showToast("Unsupported ROM format"); + return false; + } + + currentRomPath = path; + currentRomBase = stripExtAndDir(path); + currentRomTitle = currentRomBase; + if (currentRomTitle.size() > 18) { + currentRomTitle = currentRomTitle.substr(0, 18); + } + size_t sl = path.rfind('/'); + if (sl != std::string::npos && sl > 0) { + cfg.lastDir = path.substr(0, sl); + cfg.save(); + } + + romLoaded = true; + applyDmgPalette(); + loadBatterySram(); + return true; + }; + + enum class UiState { + Playing = 0, + PauseMenu = 1, + ControlsMenu = 2, + WaitingForKey = 3, + RomBrowser = 4, + }; + + UiState uiState = UiState::RomBrowser; + int pauseMenuSel = 0; + int controlsSel = 0; + int romBrowserSel = 0; + std::string browseDir = cfg.lastDir; + std::vector browserEntries; + + auto populateRomBrowser = [&](const std::string& dirPath) { + browserEntries.clear(); + browseDir = dirPath; + + // 1. Quick-scan common ROM directories at top if browsing home dir + auto scanQuickDir = [&](const std::string& dpath, const std::string& tag) { + DIR* d = ::opendir(dpath.c_str()); + if (!d) return; + std::vector found; + struct dirent* ent; + while ((ent = ::readdir(d)) != nullptr) { + std::string nm = ent->d_name; + if (nm.empty() || nm[0] == '.') continue; + if (isGbRomExt(nm)) { + bool dup = false; + for (const auto& existing : browserEntries) { + size_t sl = existing.fullPath.rfind('/'); + std::string base = (sl == std::string::npos) + ? existing.fullPath + : existing.fullPath.substr(sl + 1); + if (base == nm) { + dup = true; + break; + } + } + if (dup) continue; + RomEntry re; + re.name = tag.empty() ? nm : (tag + "/" + nm); + re.fullPath = dpath + "/" + nm; + re.isDir = false; + found.push_back(re); + } + } + ::closedir(d); + std::sort(found.begin(), found.end(), + [](const RomEntry& a, const RomEntry& b) { + return a.name < b.name; + }); + browserEntries.insert(browserEntries.end(), found.begin(), found.end()); + }; + + if (dirPath != "/") { + size_t sl = dirPath.rfind('/'); + std::string parent = (sl == 0 || sl == std::string::npos) + ? "/" + : dirPath.substr(0, sl); + RomEntry up; + up.name = ".. (Parent Folder)"; + up.fullPath = parent; + up.isDir = true; + up.isParent = true; + browserEntries.push_back(up); + } + + if (dirPath == getHomeDir()) { + scanQuickDir("/usr/share/games/gb", "BuiltIn"); + scanQuickDir(getHomeDir() + "/Games", "Games"); + scanQuickDir(getHomeDir() + "/ROMs", "ROMs"); + scanQuickDir(getHomeDir() + "/Downloads", "Downloads"); + } + + DIR* d = ::opendir(dirPath.c_str()); + if (d) { + std::vector dirs; + std::vector roms; + struct dirent* ent; + while ((ent = ::readdir(d)) != nullptr) { + std::string nm = ent->d_name; + if (nm.empty() || nm[0] == '.') continue; + std::string full = + (dirPath == "/") ? ("/" + nm) : (dirPath + "/" + nm); + struct stat st {}; + if (::stat(full.c_str(), &st) != 0) continue; + if (S_ISDIR(st.st_mode)) { + RomEntry re; + re.name = "[" + nm + "]"; + re.fullPath = full; + re.isDir = true; + dirs.push_back(re); + } else if (isGbRomExt(nm)) { + RomEntry re; + re.name = nm; + re.fullPath = full; + re.isDir = false; + roms.push_back(re); + } + } + ::closedir(d); + std::sort(dirs.begin(), dirs.end(), + [](const RomEntry& a, const RomEntry& b) { + return a.name < b.name; + }); + std::sort(roms.begin(), roms.end(), + [](const RomEntry& a, const RomEntry& b) { + return a.name < b.name; + }); + browserEntries.insert(browserEntries.end(), roms.begin(), roms.end()); + browserEntries.insert(browserEntries.end(), dirs.begin(), dirs.end()); + } + romBrowserSel = 0; + }; + + if (argc >= 2 && argv[1] && argv[1][0] != '-') { + if (loadRomFile(argv[1])) { + uiState = UiState::Playing; + } else { + populateRomBrowser(cfg.lastDir); + uiState = UiState::RomBrowser; + } + } else { + populateRomBrowser(cfg.lastDir); + uiState = UiState::RomBrowser; + } + + // Active key hold states for each action + bool actionDown[ACT_COUNT] = {false}; + uint64_t frameCount = 0; + int64_t lastSramFlushMs = nowMs(); + + int softkeyPending = 0; + int64_t softkeyDeadlineMs = 0; + int lastSoftkeyMask = 0; + int64_t lastSoftkeyMs = 0; + + auto cyclePalette = [&](int delta) { + cfg.paletteIdx = (cfg.paletteIdx + kNumPalettes + delta) % kNumPalettes; + applyDmgPalette(); + cfg.save(); + std::string pMsg = std::string("Palette: ") + kPalettes[cfg.paletteIdx].name; + showToast(pMsg, 1400); + }; + + bool toastWasVisible = false; + + auto renderScreen = [&](bool fullRedraw = true) { + bool toastActive = (!toastText.empty() && nowMs() < toastUntilMs); + if (!toastActive && toastWasVisible) { + fullRedraw = true; + } + toastWasVisible = toastActive; + + if (!fullRedraw && uiState == UiState::Playing && !toastActive) { + const gambatte::video_pixel_t* srcFb = gbFrame.data(); + if (gb.isCgb() && cfg.paletteIdx > 0) { + const ColorPalette& pal = kPalettes[cfg.paletteIdx % kNumPalettes]; + for (int i = 0; i < kGbW * kGbH; ++i) { + uint32_t px = static_cast(gbFrame[i]); + unsigned r = (px >> 16) & 0xFFu; + unsigned g = (px >> 8) & 0xFFu; + unsigned b = px & 0xFFu; + unsigned luma = (r * 77u + g * 150u + b * 29u) >> 8; + unsigned shade = 3u - (luma >> 6); + postFrame[i] = pal.bg[shade & 3u]; + } + srcFb = postFrame.data(); + } + if (cfg.scaleMode == 3) { + scale160x144ToArbitrary(srcFb, kGbW, scaledPixels.data(), kWinW, + kWinW, kWinH); + XPutImage(dpy, win, gc, ximg, 0, 0, 0, 0, kWinW, kWinH); + } else if (cfg.scaleMode == 0) { + scale160x144To240x216(srcFb, kGbW, scaledPixels.data(), kWinW); + XPutImage(dpy, win, gc, ximg, 0, 0, 0, 39, 240, 216); + } else if (cfg.scaleMode == 1) { + for (int y = 0; y < kGbH; ++y) { + for (int x = 0; x < kGbW; ++x) { + scaledPixels[y * kWinW + x] = + static_cast(srcFb[y * kGbW + x]); + } + } + XPutImage(dpy, win, gc, ximg, 0, 0, 40, 75, kGbW, kGbH); + } else { + scale160x144ToArbitrary(srcFb, kGbW, scaledPixels.data(), kWinW, + 240, 246); + XPutImage(dpy, win, gc, ximg, 0, 0, 0, 24, 240, 246); + } + XFlush(dpy); + return; + } + + unsigned long colBg = tspec.bgMain; + unsigned long colHeader = tspec.bgHeader; + unsigned long colFooter = tspec.bgFooter; + unsigned long colSel = tspec.selBg; + unsigned long colBorder = tspec.border; + unsigned long colWhite = tspec.fgMain; + unsigned long colMuted = tspec.fgMuted; + unsigned long colYellow = tspec.accent; + unsigned long colGreen = tspec.success; + unsigned long colBlue = tspec.info; + unsigned long colRed = tspec.danger; + + XSetForeground(dpy, gc, colBg); + XFillRectangle(dpy, pix, gc, 0, 0, kWinW, kWinH); + + if (uiState == UiState::Playing) { + // Optional palette tint for CGB games when paletteIdx > 0 so '*' always works! + const gambatte::video_pixel_t* srcFb = gbFrame.data(); + if (gb.isCgb() && cfg.paletteIdx > 0) { + const ColorPalette& pal = kPalettes[cfg.paletteIdx % kNumPalettes]; + for (int i = 0; i < kGbW * kGbH; ++i) { + uint32_t px = static_cast(gbFrame[i]); + unsigned r = (px >> 16) & 0xFFu; + unsigned g = (px >> 8) & 0xFFu; + unsigned b = px & 0xFFu; + unsigned luma = (r * 77u + g * 150u + b * 29u) >> 8; + unsigned shade = 3u - (luma >> 6); + postFrame[i] = pal.bg[shade & 3u]; + } + srcFb = postFrame.data(); + } + + if (cfg.scaleMode == 3) { + // Full 240x296 edge-to-edge + scale160x144ToArbitrary(srcFb, kGbW, scaledPixels.data(), kWinW, + kWinW, kWinH); + XPutImage(dpy, pix, gc, ximg, 0, 0, 0, 0, kWinW, kWinH); + } else { + // Top HUD bar (24px) + XSetForeground(dpy, gc, colHeader); + XFillRectangle(dpy, pix, gc, 0, 0, kWinW, 24); + XSetForeground(dpy, gc, colBorder); + XDrawLine(dpy, pix, gc, 0, 23, kWinW, 23); + + drawText(dpy, pix, gc, 6, 8, + gb.isCgb() ? "GBC" : "GB", 1, + gb.isCgb() ? colGreen : colYellow); + drawText(dpy, pix, gc, 32, 8, currentRomTitle.c_str(), 1, colWhite, 22); + + char slotTag[16]; + std::snprintf(slotTag, sizeof(slotTag), "S:%d", cfg.stateSlot); + drawText(dpy, pix, gc, kWinW - 24, 8, slotTag, 1, colBlue); + + if (cfg.scaleMode == 0) { + // 1.5x Fit (240x216) centered between Y=24 and Y=270 + scale160x144To240x216(srcFb, kGbW, scaledPixels.data(), kWinW); + XPutImage(dpy, pix, gc, ximg, 0, 0, 0, 39, 240, 216); + } else if (cfg.scaleMode == 1) { + // 1:1 Pixel Perfect (160x144) centered at (40, 75) + XSetForeground(dpy, gc, colBorder); + XDrawRectangle(dpy, pix, gc, 38, 73, kGbW + 3, kGbH + 3); + for (int y = 0; y < kGbH; ++y) { + for (int x = 0; x < kGbW; ++x) { + scaledPixels[y * kWinW + x] = + static_cast(srcFb[y * kGbW + x]); + } + } + XPutImage(dpy, pix, gc, ximg, 0, 0, 40, 75, kGbW, kGbH); + } else { + // Stretch (240x246) filling Y=24..270 + scale160x144ToArbitrary(srcFb, kGbW, scaledPixels.data(), kWinW, + 240, 246); + XPutImage(dpy, pix, gc, ximg, 0, 0, 0, 24, 240, 246); + } + + // Bottom Softkey Bar (26px) + int sbY = kWinH - 26; + XSetForeground(dpy, gc, colFooter); + XFillRectangle(dpy, pix, gc, 0, sbY, kWinW, 26); + XSetForeground(dpy, gc, colBorder); + XDrawLine(dpy, pix, gc, 0, sbY, kWinW, sbY); + + drawText(dpy, pix, gc, 6, sbY + 9, "Menu", 1, colBlue); + std::string hint = + "B:" + cfg.bindings[ACT_B] + " A:" + cfg.bindings[ACT_A] + + " *:" + kPalettes[cfg.paletteIdx].name; + drawText(dpy, pix, gc, 42, sbY + 9, hint.c_str(), 1, colMuted, 24); + drawText(dpy, pix, gc, kWinW - 30, sbY + 9, "Pause", 1, colWhite); + } + } else if (uiState == UiState::PauseMenu) { + XSetForeground(dpy, gc, colHeader); + XFillRectangle(dpy, pix, gc, 0, 0, kWinW, 30); + XSetForeground(dpy, gc, colBorder); + XDrawLine(dpy, pix, gc, 0, 29, kWinW, 29); + drawCenteredText(dpy, pix, gc, 8, "GAMBATTE MENU", 2, colYellow); + + const char* scaleLabels[4] = { + "Fit 240x216", + "1:1 160x144", + "Fill 240x246", + "Full 240x296" + }; + std::string audioLabel = "Audio: OFF"; + if (cfg.audioEnabled) { + if (audioOut.isSystemMuted()) { + audioLabel = "Audio: < MUTED (0%) >"; + } else { + audioLabel = "Audio: < ON (" + + std::to_string(audioOut.speakerVolPct()) + "%) >"; + } + } + std::string items[10] = { + "Resume Game", + "Save State [Slot " + std::to_string(cfg.stateSlot) + "]", + "Load State [Slot " + std::to_string(cfg.stateSlot) + "]", + "State Slot: < " + std::to_string(cfg.stateSlot) + " >", + std::string("Palette: < ") + kPalettes[cfg.paletteIdx].name + " >", + std::string("Screen: < ") + scaleLabels[cfg.scaleMode] + " >", + audioLabel, + "Keypad Controls...", + "Load Another ROM...", + "Reset / Quit Emulator" + }; + + constexpr int kVis = 8; + int scroll = 0; + if (pauseMenuSel >= kVis) scroll = pauseMenuSel - kVis + 1; + for (int i = 0; i < kVis; ++i) { + int idx = scroll + i; + if (idx >= 10) break; + int ry = 34 + i * 29; + bool isSel = (idx == pauseMenuSel); + if (isSel) { + XSetForeground(dpy, gc, colSel); + XFillRectangle(dpy, pix, gc, 4, ry, kWinW - 8, 27); + XSetForeground(dpy, gc, colYellow); + XFillRectangle(dpy, pix, gc, 4, ry, 3, 27); + } + drawText(dpy, pix, gc, 12, ry + 10, items[idx].c_str(), 1, + isSel ? colYellow : colWhite, 36); + } + + int sbY = kWinH - 26; + XSetForeground(dpy, gc, colFooter); + XFillRectangle(dpy, pix, gc, 0, sbY, kWinW, 26); + drawText(dpy, pix, gc, 6, sbY + 9, "Select", 1, colBlue); + drawCenteredText(dpy, pix, gc, sbY + 9, "OK", 1, colGreen); + drawText(dpy, pix, gc, kWinW - 42, sbY + 9, "Resume", 1, colWhite); + } else if (uiState == UiState::ControlsMenu || + uiState == UiState::WaitingForKey) { + XSetForeground(dpy, gc, colHeader); + XFillRectangle(dpy, pix, gc, 0, 0, kWinW, 30); + XSetForeground(dpy, gc, colBorder); + XDrawLine(dpy, pix, gc, 0, 29, kWinW, 29); + drawCenteredText(dpy, pix, gc, 8, "KEYPAD CONTROLS", 2, colYellow); + + int totalRows = ACT_COUNT + 1; // +1 for "Reset to Defaults" + constexpr int kVis = 8; + int scroll = 0; + if (controlsSel >= kVis) scroll = controlsSel - kVis + 1; + + for (int i = 0; i < kVis; ++i) { + int idx = scroll + i; + if (idx >= totalRows) break; + int ry = 34 + i * 29; + bool isSel = (idx == controlsSel); + if (isSel) { + XSetForeground(dpy, gc, colSel); + XFillRectangle(dpy, pix, gc, 4, ry, kWinW - 8, 27); + XSetForeground(dpy, gc, colYellow); + XFillRectangle(dpy, pix, gc, 4, ry, 3, 27); + } + if (idx < ACT_COUNT) { + drawText(dpy, pix, gc, 12, ry + 10, kActionNames[idx], 1, + isSel ? colWhite : colMuted, 20); + std::string val = "[" + cfg.bindings[idx] + "]"; + if (isSel && uiState == UiState::WaitingForKey) { + val = "[PRESS KEY...]"; + } + int vw = textPixelWidth(val.c_str(), 1); + drawText(dpy, pix, gc, kWinW - vw - 12, ry + 10, val.c_str(), 1, + isSel ? colYellow : colGreen); + } else { + drawText(dpy, pix, gc, 12, ry + 10, + "Reset Controls to Default", 1, + isSel ? colRed : colYellow); + } + } + + int sbY = kWinH - 26; + XSetForeground(dpy, gc, colFooter); + XFillRectangle(dpy, pix, gc, 0, sbY, kWinW, 26); + drawText(dpy, pix, gc, 6, sbY + 9, "Remap", 1, colBlue); + drawCenteredText(dpy, pix, gc, sbY + 9, "CHANGE", 1, colGreen); + drawText(dpy, pix, gc, kWinW - 30, sbY + 9, "Back", 1, colWhite); + } else if (uiState == UiState::RomBrowser) { + XSetForeground(dpy, gc, colHeader); + XFillRectangle(dpy, pix, gc, 0, 0, kWinW, 30); + XSetForeground(dpy, gc, colBorder); + XDrawLine(dpy, pix, gc, 0, 29, kWinW, 29); + drawCenteredText(dpy, pix, gc, 8, "SELECT GB/GBC ROM", 2, colYellow); + + if (browserEntries.empty()) { + drawCenteredText(dpy, pix, gc, 120, "NO .GB / .GBC FILES", 1, colMuted); + } else { + constexpr int kVis = 8; + int total = static_cast(browserEntries.size()); + int scroll = 0; + if (romBrowserSel >= kVis) scroll = romBrowserSel - kVis + 1; + for (int i = 0; i < kVis; ++i) { + int idx = scroll + i; + if (idx >= total) break; + int ry = 34 + i * 29; + bool isSel = (idx == romBrowserSel); + if (isSel) { + XSetForeground(dpy, gc, colSel); + XFillRectangle(dpy, pix, gc, 4, ry, kWinW - 8, 27); + XSetForeground(dpy, gc, colYellow); + XFillRectangle(dpy, pix, gc, 4, ry, 3, 27); + } + const auto& re = browserEntries[idx]; + unsigned long c = re.isDir ? colBlue : (isSel ? colYellow : colWhite); + drawText(dpy, pix, gc, 12, ry + 10, re.name.c_str(), 1, c, 36); + } + } + + int sbY = kWinH - 26; + XSetForeground(dpy, gc, colFooter); + XFillRectangle(dpy, pix, gc, 0, sbY, kWinW, 26); + drawText(dpy, pix, gc, 6, sbY + 9, "Controls", 1, colBlue); + drawCenteredText(dpy, pix, gc, sbY + 9, "OPEN", 1, colGreen); + drawText(dpy, pix, gc, kWinW - 30, sbY + 9, + romLoaded ? "Back" : "Quit", 1, colWhite); + } + + // Toast notification overlay + if (!toastText.empty() && nowMs() < toastUntilMs) { + int tw = std::min(kWinW - 16, textPixelWidth(toastText.c_str(), 1) + 16); + int tx = (kWinW - tw) / 2; + int ty = kWinH - 52; + XSetForeground(dpy, gc, colSel); + XFillRectangle(dpy, pix, gc, tx, ty, tw, 20); + XSetForeground(dpy, gc, colYellow); + XDrawRectangle(dpy, pix, gc, tx, ty, tw - 1, 19); + drawCenteredText(dpy, pix, gc, ty + 6, toastText.c_str(), 1, colYellow); + } + + XCopyArea(dpy, pix, win, gc, 0, 0, kWinW, kWinH, 0, 0); + XFlush(dpy); + }; + + int64_t overlayCooldownUntilMs = 0; + int64_t softkeyIgnoreUntilMs = 0; + + auto unfocusWindow = [&](bool forXDrawerToggle) { + std::memset(actionDown, 0, sizeof(actionDown)); + inputGetter.state = 0; + audioOut.stop(); + if (uiState == UiState::Playing && romLoaded) { + saveBatterySram(); + pauseMenuSel = 0; + uiState = UiState::PauseMenu; + renderScreen(); + } + if (keyboardGrabbed) { + XUngrabKeyboard(dpy, CurrentTime); + keyboardGrabbed = false; + } + XSetInputFocus(dpy, PointerRoot, RevertToPointerRoot, CurrentTime); + XLowerWindow(dpy, win); + XSync(dpy, False); + if (forXDrawerToggle) { + int64_t tNow = nowMs(); + writeSoftkeySuppress(tNow + 500); + overlayCooldownUntilMs = tNow + 500; + toggleXDrawer(); + } + }; + + auto refocusWindow = [&]() { + audioOut.refreshVolume(true); + XMapRaised(dpy, win); + XSetInputFocus(dpy, win, RevertToPointerRoot, CurrentTime); + for (int i = 0; i < 30; ++i) { + if (XGrabKeyboard(dpy, win, True, GrabModeAsync, GrabModeAsync, + CurrentTime) == GrabSuccess) { + keyboardGrabbed = true; + break; + } + ::usleep(4000); + } + XFlush(dpy); + softkeyPending = 0; + softkeyDeadlineMs = 0; + lastSoftkeyMask = 0; + lastSoftkeyMs = 0; + softkeyIgnoreUntilMs = nowMs() + 350; + renderScreen(); + }; + + auto handlePauseMenuExec = [&]() { + switch (pauseMenuSel) { + case 0: // Resume + uiState = UiState::Playing; + break; + case 1: // Save State + if (saveEmulatorState(cfg.stateSlot)) { + showToast("Saved Slot " + std::to_string(cfg.stateSlot)); + } else { + showToast("Save State failed"); + } + uiState = UiState::Playing; + break; + case 2: // Load State + if (loadEmulatorState(cfg.stateSlot)) { + showToast("Loaded Slot " + std::to_string(cfg.stateSlot)); + } else { + showToast("Empty Slot " + std::to_string(cfg.stateSlot)); + } + uiState = UiState::Playing; + break; + case 3: // Cycle State Slot + cfg.stateSlot = (cfg.stateSlot + 1) % 10; + cfg.save(); + break; + case 4: // Cycle Palette + cyclePalette(1); + break; + case 5: // Cycle Screen Scale + cfg.scaleMode = (cfg.scaleMode + 1) % 4; + cfg.save(); + break; + case 6: // Toggle Audio + cfg.audioEnabled = !cfg.audioEnabled; + if (cfg.audioEnabled) { + audioOut.refreshVolume(true); + } else { + audioOut.stop(); + } + cfg.save(); + break; + case 7: // Keypad Controls + controlsSel = 0; + uiState = UiState::ControlsMenu; + break; + case 8: // Load Another ROM + populateRomBrowser(cfg.lastDir); + uiState = UiState::RomBrowser; + break; + case 9: // Quit Emulator + saveBatterySram(); + gRunning = 0; + break; + } + }; + + // Sub-frame pacing timerfd: 4 slices per GB frame (~238.91 Hz = 4,185,676 ns, + // 8,778 GB samples = ~201 48-kHz samples per slice) so the ALSA ringbuffer + // is fed every 4.18 ms (faster than the 5.33 ms hardware period). + int tfd = timerfd_create(CLOCK_MONOTONIC, TFD_NONBLOCK | TFD_CLOEXEC); + struct itimerspec its {}; + its.it_interval.tv_sec = 0; + its.it_interval.tv_nsec = 4185676L; + its.it_value = its.it_interval; + if (tfd >= 0) { + timerfd_settime(tfd, 0, &its, nullptr); + } + uint32_t subSliceCount = 0; + uint32_t samplesSinceRender = 0; + + renderScreen(); + + int xfd = ConnectionNumber(dpy); + int64_t lastExtCheckMs = 0; + + while (gRunning) { + int64_t tLoop = nowMs(); + + // Yield focus if xdrawer or another system overlay opened externally, + // and reclaim focus automatically when it closes. + if (!keyboardGrabbed || (tLoop - lastExtCheckMs >= 100)) { + lastExtCheckMs = tLoop; + bool extActive = isExternalOverlayActive(); + if (extActive && keyboardGrabbed) { + unfocusWindow(false); + } else if (!extActive && !keyboardGrabbed && + tLoop >= overlayCooldownUntilMs) { + refocusWindow(); + } + } + + if (gReloadTheme) { + gReloadTheme = 0; + tspec = loadThemeSpec(dpy, screen); + if (keyboardGrabbed) renderScreen(); + } + + while (XPending(dpy) > 0) { + XEvent ev; + XNextEvent(dpy, &ev); + + if (ev.type == ClientMessage) { + if (static_cast(ev.xclient.data.l[0]) == wmDelete) { + gRunning = 0; + } + } else if (ev.type == Expose && ev.xexpose.count == 0) { + if (keyboardGrabbed && !isExternalOverlayActive()) { + renderScreen(); + } + } else if (ev.type == VisibilityNotify && + ev.xvisibility.state != VisibilityUnobscured) { + if (isExternalOverlayActive() || nowMs() < overlayCooldownUntilMs) { + if (keyboardGrabbed) unfocusWindow(false); + } + } else if (ev.type == FocusOut) { + std::memset(actionDown, 0, sizeof(actionDown)); + inputGetter.state = 0; + if (isExternalOverlayActive() && keyboardGrabbed) { + unfocusWindow(false); + } + } else if (ev.type == KeyPress || ev.type == KeyRelease) { + if (!keyboardGrabbed) continue; + bool isPress = (ev.type == KeyPress); + // Filter out X11 key auto-repeat on KeyRelease so held buttons stay smooth + if (!isPress && XEventsQueued(dpy, QueuedAfterReading)) { + XEvent nev; + XPeekEvent(dpy, &nev); + if (nev.type == KeyPress && nev.xkey.time == ev.xkey.time && + nev.xkey.keycode == ev.xkey.keycode) { + XNextEvent(dpy, &nev); + continue; + } + } + + unsigned int kc = ev.xkey.keycode; + KeySym sym = XLookupKeysym(&ev.xkey, 0); + + if (isPress && (sym == XF86XK_AudioLowerVolume || + sym == XF86XK_AudioRaiseVolume)) { + audioOut.adjustSpeakerVol( + (sym == XF86XK_AudioRaiseVolume) ? +5 : -5); + showToast("Volume: " + std::to_string(audioOut.speakerVolPct()) + + "%"); + renderScreen(); + continue; + } + + bool isLeftSoft = + (kc == 135 || sym == XK_Menu || sym == XF86XK_KbdLcdMenu1 || + sym == _EVDEVK(0x246) || sym == XK_F1); + bool isRightSoft = + (kc == 166 || sym == XF86XK_Back || sym == XF86XK_KbdLcdMenu2 || + sym == _EVDEVK(0x247) || sym == XK_F2); + + if (isLeftSoft || isRightSoft) { + if (!isPress) continue; + int64_t tSk = nowMs(); + if (tSk < softkeyIgnoreUntilMs) continue; + int which = isLeftSoft ? 1 : 2; + int comb = softkeyPending | which | querySoftkeysDown(dpy); + if (lastSoftkeyMask != 0 && (tSk - lastSoftkeyMs) <= 320) { + comb |= lastSoftkeyMask; + } + if (comb == 3) { + softkeyPending = 0; + softkeyDeadlineMs = 0; + lastSoftkeyMask = 0; + lastSoftkeyMs = 0; + unfocusWindow(true); + continue; + } + softkeyPending = which; + lastSoftkeyMask = which; + lastSoftkeyMs = tSk; + softkeyDeadlineMs = tSk + 45; + continue; + } + + std::string tok = keyEventToToken(sym, kc); + + if (uiState == UiState::WaitingForKey) { + if (isPress) { + if (sym == XK_Escape || sym == XK_BackSpace) { + uiState = UiState::ControlsMenu; + } else if (!tok.empty() && tok != "OK" && controlsSel >= 0 && + controlsSel < ACT_COUNT) { + std::string oldKey = cfg.bindings[controlsSel]; + for (int i = 0; i < ACT_COUNT; ++i) { + if (i != controlsSel && cfg.bindings[i] == tok) { + cfg.bindings[i] = oldKey; + } + } + cfg.bindings[controlsSel] = tok; + cfg.save(); + showToast(std::string(kActionNames[controlsSel]) + " -> " + tok); + uiState = UiState::ControlsMenu; + } + renderScreen(); + } + continue; + } + + if (uiState == UiState::Playing) { + if (isPress && (sym == XK_Escape || sym == XK_BackSpace || tok == "#")) { + saveBatterySram(); + audioOut.stop(); + pauseMenuSel = 0; + uiState = UiState::PauseMenu; + renderScreen(); + continue; + } + // Check Palette key on press + if (isPress && tok == cfg.bindings[ACT_PALETTE]) { + cyclePalette(1); + renderScreen(true); + continue; + } + // Quick scale toggle ('1' if not bound to an action) + bool usedByAction = false; + for (int i = 0; i < ACT_COUNT; ++i) { + if (tok == cfg.bindings[i]) { + actionDown[i] = isPress; + usedByAction = true; + } + } + if (isPress && !usedByAction) { + if (tok == "1") { + cfg.scaleMode = (cfg.scaleMode + 1) % 4; + cfg.save(); + showToast("Screen Mode Changed"); + renderScreen(true); + } else if (tok == "4") { + if (saveEmulatorState(cfg.stateSlot)) { + showToast("Saved Slot " + std::to_string(cfg.stateSlot)); + renderScreen(true); + } + } else if (tok == "7") { + if (loadEmulatorState(cfg.stateSlot)) { + showToast("Loaded Slot " + std::to_string(cfg.stateSlot)); + renderScreen(true); + } + } + } + } else if (isPress && uiState == UiState::PauseMenu) { + if (sym == XK_Escape || sym == XK_BackSpace) { + uiState = UiState::Playing; + } else if (sym == XK_Up || sym == XK_KP_Up) { + pauseMenuSel = (pauseMenuSel + 9) % 10; + } else if (sym == XK_Down || sym == XK_KP_Down) { + pauseMenuSel = (pauseMenuSel + 1) % 10; + } else if (sym == XK_Left || sym == XK_KP_Left) { + if (pauseMenuSel == 3) { + cfg.stateSlot = (cfg.stateSlot + 9) % 10; + cfg.save(); + } else if (pauseMenuSel == 4) { + cyclePalette(-1); + } else if (pauseMenuSel == 5) { + cfg.scaleMode = (cfg.scaleMode + 3) % 4; + cfg.save(); + } else if (pauseMenuSel == 6) { + cfg.audioEnabled = true; + cfg.save(); + audioOut.adjustSpeakerVol(-5); + } + } else if (sym == XK_Right || sym == XK_KP_Right) { + if (pauseMenuSel == 3) { + cfg.stateSlot = (cfg.stateSlot + 1) % 10; + cfg.save(); + } else if (pauseMenuSel == 4) { + cyclePalette(1); + } else if (pauseMenuSel == 5) { + cfg.scaleMode = (cfg.scaleMode + 1) % 4; + cfg.save(); + } else if (pauseMenuSel == 6) { + cfg.audioEnabled = true; + cfg.save(); + audioOut.adjustSpeakerVol(+5); + } + } else if (sym == XK_Return || sym == XK_KP_Enter) { + handlePauseMenuExec(); + } else if (tok == cfg.bindings[ACT_PALETTE]) { + cyclePalette(1); + } + renderScreen(); + } else if (isPress && uiState == UiState::ControlsMenu) { + int totalRows = ACT_COUNT + 1; + if (sym == XK_Escape || sym == XK_BackSpace || sym == XK_Left) { + uiState = romLoaded ? UiState::PauseMenu : UiState::RomBrowser; + } else if (sym == XK_Up || sym == XK_KP_Up) { + controlsSel = (controlsSel + totalRows - 1) % totalRows; + } else if (sym == XK_Down || sym == XK_KP_Down) { + controlsSel = (controlsSel + 1) % totalRows; + } else if (sym == XK_Return || sym == XK_KP_Enter) { + if (controlsSel < ACT_COUNT) { + uiState = UiState::WaitingForKey; + } else { + cfg.resetControlsToDefault(); + cfg.save(); + showToast("Reset Controls to Default"); + } + } + renderScreen(); + } else if (isPress && uiState == UiState::RomBrowser) { + if (sym == XK_Escape || sym == XK_BackSpace) { + if (romLoaded) { + uiState = UiState::PauseMenu; + renderScreen(); + } else { + gRunning = 0; + } + } else if (sym == XK_Up || sym == XK_KP_Up) { + if (!browserEntries.empty()) { + int n = static_cast(browserEntries.size()); + romBrowserSel = (romBrowserSel + n - 1) % n; + renderScreen(); + } + } else if (sym == XK_Down || sym == XK_KP_Down) { + if (!browserEntries.empty()) { + int n = static_cast(browserEntries.size()); + romBrowserSel = (romBrowserSel + 1) % n; + renderScreen(); + } + } else if (sym == XK_Return || sym == XK_KP_Enter) { + if (!browserEntries.empty() && romBrowserSel >= 0 && + romBrowserSel < static_cast(browserEntries.size())) { + RomEntry chosen = browserEntries[romBrowserSel]; + if (chosen.isDir) { + populateRomBrowser(chosen.fullPath); + } else if (loadRomFile(chosen.fullPath)) { + uiState = UiState::Playing; + } + renderScreen(); + } + } + } + } + } + + if (keyboardGrabbed && softkeyPending != 0 && nowMs() >= softkeyDeadlineMs) { + int comb = softkeyPending | querySoftkeysDown(dpy); + softkeyPending = 0; + softkeyDeadlineMs = 0; + if (comb == 3) { + unfocusWindow(true); + } else if (comb == 1) { // Left Softkey + if (uiState == UiState::Playing) { + saveBatterySram(); + audioOut.stop(); + pauseMenuSel = 0; + uiState = UiState::PauseMenu; + } else if (uiState == UiState::PauseMenu) { + handlePauseMenuExec(); + } else if (uiState == UiState::ControlsMenu) { + if (controlsSel < ACT_COUNT) { + uiState = UiState::WaitingForKey; + } else { + cfg.resetControlsToDefault(); + cfg.save(); + showToast("Reset Controls to Default"); + } + } else if (uiState == UiState::RomBrowser) { + controlsSel = 0; + uiState = UiState::ControlsMenu; + } + renderScreen(); + } else if (comb == 2) { // Right Softkey + if (uiState == UiState::Playing) { + saveBatterySram(); + audioOut.stop(); + pauseMenuSel = 0; + uiState = UiState::PauseMenu; + renderScreen(); + } else if (uiState == UiState::PauseMenu) { + uiState = UiState::Playing; + renderScreen(); + } else if (uiState == UiState::WaitingForKey) { + uiState = UiState::ControlsMenu; + renderScreen(); + } else if (uiState == UiState::ControlsMenu) { + uiState = romLoaded ? UiState::PauseMenu : UiState::RomBrowser; + renderScreen(); + } else if (uiState == UiState::RomBrowser) { + if (romLoaded) { + uiState = UiState::PauseMenu; + renderScreen(); + } else { + gRunning = 0; + } + } + } + } + + if (keyboardGrabbed && uiState == UiState::Playing && romLoaded) { + bool justStartedAudio = false; + if (cfg.audioEnabled) { + if (!audioOut.isOpen()) { + audioOut.start(); + if (tfd >= 0) { + uint64_t drainExp = 0; + (void)::read(tfd, &drainExp, sizeof(drainExp)); + timerfd_settime(tfd, 0, &its, nullptr); + } + justStartedAudio = true; + } else { + audioOut.refreshVolumeIfNeeded(nowMs()); + } + } else if (audioOut.isOpen()) { + audioOut.stop(); + } + + uint64_t exp = 0; + if (justStartedAudio) { + exp = 4; // 1 full video frame (4 * 8778 = 35112 GB samples) + } else { + struct pollfd pfds[2] = { + {xfd, POLLIN, 0}, + {tfd, POLLIN, 0} + }; + int pr = ::poll(pfds, (tfd >= 0) ? 2 : 1, 6); + exp = (tfd < 0) ? 1 : 0; + if (pr > 0 && tfd >= 0 && (pfds[1].revents & POLLIN)) { + (void)::read(tfd, &exp, sizeof(exp)); + } + } + + if (exp > 0) { + int catchup = static_cast(std::min(exp, 12)); + int slicesToRun = actionDown[ACT_FAST_FWD] ? (catchup * 2) : catchup; + for (int s = 0; s < slicesToRun; ++s) { + ++subSliceCount; + bool turboPulse = (((subSliceCount >> 2) & 2u) == 0); + unsigned pad = 0; + if (actionDown[ACT_A] || (actionDown[ACT_TURBO_A] && turboPulse)) { + pad |= gambatte::InputGetter::A; + } + if (actionDown[ACT_B] || (actionDown[ACT_TURBO_B] && turboPulse)) { + pad |= gambatte::InputGetter::B; + } + if (actionDown[ACT_START]) pad |= gambatte::InputGetter::START; + if (actionDown[ACT_SELECT]) pad |= gambatte::InputGetter::SELECT; + if (actionDown[ACT_UP]) pad |= gambatte::InputGetter::UP; + if (actionDown[ACT_DOWN]) pad |= gambatte::InputGetter::DOWN; + if (actionDown[ACT_LEFT]) pad |= gambatte::InputGetter::LEFT; + if (actionDown[ACT_RIGHT]) pad |= gambatte::InputGetter::RIGHT; + inputGetter.state = pad; + + bool writeAudio = + cfg.audioEnabled && (!actionDown[ACT_FAST_FWD] || (s & 1) == 0); + + // 35112 / 4 = 8778 GB samples per 4.185 ms slice. + // Loop until all 8778 samples of the slice are produced even if + // gb.runFor returns early at a VBlank boundary. + unsigned remaining = 8778; + while (remaining > 0) { + unsigned chunk = remaining; + long blit = gb.runFor(gbFrame.data(), kGbW, soundBuf.data(), + soundBuf.size(), chunk); + if (writeAudio && chunk > 0) { + audioOut.writeGbSamples(soundBuf.data(), chunk); + } + samplesSinceRender += chunk; + if (blit >= 0) { + ++frameCount; + samplesSinceRender = 0; + if ((frameCount & 1u) == 0) { + renderScreen(false); + } + } else if (samplesSinceRender >= 70224) { + ++frameCount; + samplesSinceRender = 0; + renderScreen(false); + } + if (chunk == 0 || chunk >= remaining) { + break; + } + remaining -= chunk; + } + } + + if (nowMs() - lastSramFlushMs >= 5000) { + saveBatterySram(); + lastSramFlushMs = nowMs(); + } + } + } else { + if (audioOut.isOpen()) { + audioOut.stop(); + } + struct pollfd pfd {xfd, POLLIN, 0}; + ::poll(&pfd, 1, 40); + } + } + + saveBatterySram(); + audioOut.stop(); + writeSoftkeySuppress(nowMs() + 350); + + if (tfd >= 0) ::close(tfd); + ximg->data = nullptr; + XDestroyImage(ximg); + XUngrabKeyboard(dpy, CurrentTime); + XFreeGC(dpy, gc); + XFreePixmap(dpy, pix); + XDestroyWindow(dpy, win); + XCloseDisplay(dpy); + return 0; +} diff --git a/src/sxmo-dmenu/dmenu.c b/src/sxmo-dmenu/dmenu.c index 6777445..73c75de 100644 --- a/src/sxmo-dmenu/dmenu.c +++ b/src/sxmo-dmenu/dmenu.c @@ -2357,6 +2357,10 @@ open_builtin_menu(const char *menu_name, int keep_idx) snprintf(label, sizeof(label), "%s Tetris", ICON_GAM); add_menu_item(label, "tetris", 0); } + if (access("/usr/bin/gambatte", X_OK) == 0) { + snprintf(label, sizeof(label), "%s Game Boy (Gambatte)", ICON_GAM); + add_menu_item(label, "gambatte", 0); + } const char *rdir = getenv("XDG_RUNTIME_DIR"); char gcache[256]; snprintf(gcache, sizeof(gcache), "%s/sxmo_games.cache", (rdir && rdir[0]) ? rdir : "/run/user/10000");