4e43890fce
Пройденная игра доходила до таблицы рекордов и умирала: программа
исчезала, машина следом вставала намертво (di;halt на 0x0000) либо уходила
в reset. Одинаково из Flex Navigator и из голого DSS.
КОРЕНЬ. pop_ui.h объявлял группу pop_text_*_mapped БЕЗ __banked. Пока
pop_hof.c лежал в банке 9 рядом с pop_ui.c, прямой call был верен; после
переноса pop_hof/pop_config/pop_pal в банк 10 тот же call стал уходить в
пустой хвост чужого банка. Процессор полз по 0xFF до 0x0000, где ловушка
DSS ставит B=0x27 и сворачивает процесс — подмена страниц W1/W2/W3,
которую было видно на трупе, оказалась уборкой, а не причиной.
Точную инструкцию (call $E503 = _pop_text_map банка 9) дала трассировка
MAME на узком участке: trace включалась брейкпоинтом на входе в
pop_hof_show и выключалась на процедуре завершения процесса DSS (0x1E56).
ЧТО СДЕЛАНО
* pop_ui.h/.c — группа text_*_mapped помечена __banked.
* toolchain/check_bank_calls.py — две проверки банкового кода:
1) прямой call в чужой банк (доказательна, ВАЛИТ сборку — проверено
намеренной поломкой);
2) указатель на данные своего банка, отданный в чужой (эвристика по
форме кода, только предупреждает).
Встроена в app.mk, запускается сразу после линковки.
* pop_hof.c — курсор ввода строится на стеке: литерал "_" лежал в _BANK10
и после пометки __banked уезжал из-под ног чужому банку, заливая экран
знаками вопроса.
* libc: kbd_raw_keypad_as_ext() — kbd_raw_sync переносит голые коды
нумпада в EXT-половину карты. Лечит залипание стрелок (потерянный
префикс E0 сажал make в PLAIN как код нумпада, и снять его было нечем),
заодно нумпад стал управлением: 7/8/9, 4/6, 2 и 5 = вниз.
* pop_pace.c — цикл ожидания луча зовёт тот же idle-хук, что и
gfx_wait_vsync: без этого F10 в геймплее не работал вовсе.
* pop_hof.c — Esc в таблице рекордов отменяет запись (расхождение с
оригиналом записано в docs/impl_diff.md).
* Экран версии показывается только через Menu/Settings/About: стартовый
показ и Ctrl+V убраны, мёртвый код снят.
* sprpop_cold.c — pop_start_level зовёт pop_hp_invalidate: после Ctrl+A с
выросшим за уровень максимумом полоса HP моргала между страницами.
Разбор всех четырёх багов — в applications/PoP/roomtest/BUGS_CLOSED.md
(FINAL-BANKCALL, FINAL-HOF-GARBAGE, KBD-ARROW-PHANTOM, F10-GAMEPLAY),
правило про банки — в applications/SprPoP/CLAUDE.md.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
78 lines
2.6 KiB
Plaintext
78 lines
2.6 KiB
Plaintext
* Left: turn or run left
|
|
* Right: turn or run right
|
|
* Up: jump or climb up
|
|
* Down: crouch or climb down
|
|
* Down+Left/Right: hop
|
|
* Shift: pick up things
|
|
* Shift+Left/Right: careful step
|
|
* Home or Up+Left: jump left
|
|
* Page Up or Up+Right: jump right
|
|
* Up while running: running jump
|
|
* Shift while falling: grab onto ledge
|
|
|
|
* Left/Right: walk (advance or retreat)
|
|
* Shift: strike (attack)
|
|
* Up: block (defend)
|
|
* Down: put sword away; press Shift to draw your sword again.
|
|
|
|
===
|
|
|
|
* Esc: Pause game.
|
|
* Space: Show how much time is left.
|
|
* Ctrl+A: Restart level.
|
|
|
|
* Ctrl+R: Return to intro.
|
|
* Ctrl+S: Sound on/off.
|
|
* Ctrl+M: Music on/off.
|
|
* Ctrl+Q / F10: Quit game.
|
|
|
|
* F6: Quicksave: Save the exact state of the game.
|
|
* F9: Quickload: Load what the last quicksave saved.
|
|
* F12: Save a screenshot to the screenshots folder (optional - можно пока не делать).
|
|
* Backspace: Display the in-game menu. (Esc will also display the menu by default, but you can turn that off.)
|
|
|
|
* Shift+L: Go to next level.
|
|
* -: Decrease remaining time by one minute. (Both the main row and the keypad.)
|
|
* +: Increase remaining time by one minute. (Both the main row and the keypad.)
|
|
* R: Resurrect kid.
|
|
* K: Kill guard.
|
|
* Shift+I: Flip the screen upside down.
|
|
* Shift+W: Slow falling.
|
|
* Shift+S: Restore a lost hit-point. (Like a small red potion.)
|
|
* Shift+T: Give more hit-points. (Like a big red potion.)
|
|
|
|
===
|
|
|
|
* H: Look at the room to the left.
|
|
* J: Look at the room to the right.
|
|
* U: Look at the room above.
|
|
* N: Look at the room below.
|
|
* Ctrl+B: Go back to the room where the prince is. (Undo H,J,U,N.)
|
|
|
|
===
|
|
|
|
* [: Shift kid 1 pixel to the left.
|
|
* ]: Shift kid 1 pixel to the right.
|
|
* T: Toggle display of timer (remaining minutes:seconds).
|
|
|
|
===
|
|
|
|
Sprinter-specific debug keys (not in the original; all under Ctrl so that no
|
|
plain letter is taken away from the layout above):
|
|
|
|
* Ctrl+I: Immortality, cycling off -> combat only -> combat and minor damage.
|
|
* Ctrl+P: Speed mode.
|
|
* Ctrl+F: Freeze / unfreeze the frame (was 1 and 2).
|
|
* Ctrl+D: Debug bar (level/room/... in the top border) on/off. Same switch
|
|
as the Settings screen has; the shortcut does not write POP.CFG,
|
|
saving stays with Settings.
|
|
(The per-phase colour profiling of the border is a different thing
|
|
and stays a build option: make PROF=1.)
|
|
* Ctrl++ / Ctrl+-: Teleport to the next / previous room by number (ROOMNAV).
|
|
The plain +/- belong to the timer, as in the original; the debug
|
|
walk moved onto the same keys under Ctrl so muscle memory keeps.
|
|
|
|
Note: Ctrl+B is deliberately NOT used here — the layout above reserves it for
|
|
"go back to the room where the prince is".
|
|
|