web-a2e 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.clangd +5 -0
- package/.mcp.json +12 -0
- package/CLAUDE.md +362 -0
- package/CMakeLists.txt +774 -0
- package/LICENSE +21 -0
- package/README.md +392 -0
- package/build-wasm/generated/roms.cpp +2447 -0
- package/docker-compose.staging.yml +9 -0
- package/docs/basic-rom-disassembly.md +6663 -0
- package/docs/softswitch-comparison.md +273 -0
- package/docs/thunderclock-debug.md +89 -0
- package/examples/cube.bas +72 -0
- package/examples/hello.s +55 -0
- package/examples/scroll.s +140 -0
- package/package.json +18 -0
- package/public/assets/apple-logo-old.png +0 -0
- package/public/assets/apple-logo.png +0 -0
- package/public/assets/drive-closed-light-on.png +0 -0
- package/public/assets/drive-closed.png +0 -0
- package/public/assets/drive-open-light-on.png +0 -0
- package/public/assets/drive-open.png +0 -0
- package/public/audio-worklet.js +82 -0
- package/public/disks/Apple DOS 3.3 January 1983.dsk +0 -0
- package/public/disks/ProDOS 2.4.3.po +0 -0
- package/public/disks/h32mb.2mg +0 -0
- package/public/disks/library.json +26 -0
- package/public/docs/llms/llm-assembler.txt +90 -0
- package/public/docs/llms/llm-basic-program.txt +256 -0
- package/public/docs/llms/llm-disk-drives.txt +72 -0
- package/public/docs/llms/llm-file-explorer.txt +50 -0
- package/public/docs/llms/llm-hard-drives.txt +80 -0
- package/public/docs/llms/llm-main.txt +51 -0
- package/public/docs/llms/llm-slot-configuration.txt +66 -0
- package/public/icons/icon-192.svg +4 -0
- package/public/icons/icon-512.svg +4 -0
- package/public/index.html +661 -0
- package/public/llms.txt +49 -0
- package/public/manifest.json +29 -0
- package/public/shaders/burnin.glsl +22 -0
- package/public/shaders/crt.glsl +706 -0
- package/public/shaders/edge.glsl +109 -0
- package/public/shaders/vertex.glsl +8 -0
- package/public/sw.js +186 -0
- package/roms/341-0027.bin +0 -0
- package/roms/341-0160-A-US-UK.bin +0 -0
- package/roms/341-0160-A.bin +0 -0
- package/roms/342-0273-A-US-UK.bin +0 -0
- package/roms/342-0349-B-C0-FF.bin +0 -0
- package/roms/Apple Mouse Interface Card ROM - 342-0270-C.bin +0 -0
- package/roms/Thunderclock Plus ROM.bin +0 -0
- package/scripts/generate_roms.sh +69 -0
- package/src/bindings/wasm_interface.cpp +1940 -0
- package/src/core/assembler/assembler.cpp +1239 -0
- package/src/core/assembler/assembler.hpp +115 -0
- package/src/core/audio/audio.cpp +160 -0
- package/src/core/audio/audio.hpp +81 -0
- package/src/core/basic/basic_detokenizer.cpp +436 -0
- package/src/core/basic/basic_detokenizer.hpp +41 -0
- package/src/core/basic/basic_tokenizer.cpp +286 -0
- package/src/core/basic/basic_tokenizer.hpp +26 -0
- package/src/core/basic/basic_tokens.hpp +295 -0
- package/src/core/cards/disk2_card.cpp +568 -0
- package/src/core/cards/disk2_card.hpp +316 -0
- package/src/core/cards/expansion_card.hpp +185 -0
- package/src/core/cards/mockingboard/ay8910.cpp +616 -0
- package/src/core/cards/mockingboard/ay8910.hpp +159 -0
- package/src/core/cards/mockingboard/via6522.cpp +530 -0
- package/src/core/cards/mockingboard/via6522.hpp +163 -0
- package/src/core/cards/mockingboard_card.cpp +312 -0
- package/src/core/cards/mockingboard_card.hpp +159 -0
- package/src/core/cards/mouse_card.cpp +654 -0
- package/src/core/cards/mouse_card.hpp +190 -0
- package/src/core/cards/smartport/block_device.cpp +202 -0
- package/src/core/cards/smartport/block_device.hpp +60 -0
- package/src/core/cards/smartport/smartport_card.cpp +603 -0
- package/src/core/cards/smartport/smartport_card.hpp +120 -0
- package/src/core/cards/thunderclock_card.cpp +237 -0
- package/src/core/cards/thunderclock_card.hpp +122 -0
- package/src/core/cpu/cpu6502.cpp +1609 -0
- package/src/core/cpu/cpu6502.hpp +203 -0
- package/src/core/debug/condition_evaluator.cpp +470 -0
- package/src/core/debug/condition_evaluator.hpp +87 -0
- package/src/core/disassembler/disassembler.cpp +552 -0
- package/src/core/disassembler/disassembler.hpp +171 -0
- package/src/core/disk-image/disk_image.hpp +267 -0
- package/src/core/disk-image/dsk_disk_image.cpp +827 -0
- package/src/core/disk-image/dsk_disk_image.hpp +204 -0
- package/src/core/disk-image/gcr_encoding.cpp +147 -0
- package/src/core/disk-image/gcr_encoding.hpp +78 -0
- package/src/core/disk-image/woz_disk_image.cpp +1049 -0
- package/src/core/disk-image/woz_disk_image.hpp +343 -0
- package/src/core/emulator.cpp +2126 -0
- package/src/core/emulator.hpp +434 -0
- package/src/core/filesystem/dos33.cpp +178 -0
- package/src/core/filesystem/dos33.hpp +66 -0
- package/src/core/filesystem/pascal.cpp +262 -0
- package/src/core/filesystem/pascal.hpp +87 -0
- package/src/core/filesystem/prodos.cpp +369 -0
- package/src/core/filesystem/prodos.hpp +119 -0
- package/src/core/input/keyboard.cpp +227 -0
- package/src/core/input/keyboard.hpp +111 -0
- package/src/core/mmu/mmu.cpp +1387 -0
- package/src/core/mmu/mmu.hpp +236 -0
- package/src/core/types.hpp +196 -0
- package/src/core/video/video.cpp +680 -0
- package/src/core/video/video.hpp +156 -0
- package/src/css/assembler-editor.css +1617 -0
- package/src/css/base.css +470 -0
- package/src/css/basic-debugger.css +791 -0
- package/src/css/basic-editor.css +792 -0
- package/src/css/controls.css +783 -0
- package/src/css/cpu-debugger.css +1413 -0
- package/src/css/debug-base.css +160 -0
- package/src/css/debug-windows.css +6455 -0
- package/src/css/disk-drives.css +406 -0
- package/src/css/documentation.css +392 -0
- package/src/css/file-explorer.css +867 -0
- package/src/css/hard-drive.css +180 -0
- package/src/css/layout.css +217 -0
- package/src/css/memory-windows.css +798 -0
- package/src/css/modals.css +510 -0
- package/src/css/monitor.css +425 -0
- package/src/css/release-notes.css +101 -0
- package/src/css/responsive.css +400 -0
- package/src/css/rule-builder.css +340 -0
- package/src/css/save-states.css +201 -0
- package/src/css/settings-windows.css +1231 -0
- package/src/css/window-switcher.css +150 -0
- package/src/js/agent/agent-manager.js +643 -0
- package/src/js/agent/agent-tools.js +293 -0
- package/src/js/agent/agent-version-tools.js +131 -0
- package/src/js/agent/assembler-tools.js +357 -0
- package/src/js/agent/basic-program-tools.js +894 -0
- package/src/js/agent/disk-tools.js +417 -0
- package/src/js/agent/file-explorer-tools.js +269 -0
- package/src/js/agent/index.js +13 -0
- package/src/js/agent/main-tools.js +222 -0
- package/src/js/agent/slot-tools.js +303 -0
- package/src/js/agent/smartport-tools.js +257 -0
- package/src/js/agent/window-tools.js +80 -0
- package/src/js/audio/audio-driver.js +417 -0
- package/src/js/audio/audio-worklet.js +85 -0
- package/src/js/audio/index.js +8 -0
- package/src/js/config/default-layout.js +34 -0
- package/src/js/config/version.js +8 -0
- package/src/js/data/apple2-rom-routines.js +577 -0
- package/src/js/debug/assembler-editor-window.js +2993 -0
- package/src/js/debug/basic-breakpoint-manager.js +529 -0
- package/src/js/debug/basic-program-parser.js +436 -0
- package/src/js/debug/basic-program-window.js +2594 -0
- package/src/js/debug/basic-variable-inspector.js +447 -0
- package/src/js/debug/breakpoint-manager.js +472 -0
- package/src/js/debug/cpu-debugger-window.js +2396 -0
- package/src/js/debug/index.js +22 -0
- package/src/js/debug/label-manager.js +238 -0
- package/src/js/debug/memory-browser-window.js +416 -0
- package/src/js/debug/memory-heat-map-window.js +481 -0
- package/src/js/debug/memory-map-window.js +206 -0
- package/src/js/debug/mockingboard-window.js +882 -0
- package/src/js/debug/mouse-card-window.js +355 -0
- package/src/js/debug/rule-builder-window.js +648 -0
- package/src/js/debug/soft-switch-window.js +458 -0
- package/src/js/debug/stack-viewer-window.js +221 -0
- package/src/js/debug/symbols.js +416 -0
- package/src/js/debug/trace-panel.js +291 -0
- package/src/js/debug/zero-page-watch-window.js +297 -0
- package/src/js/disk-manager/disk-drives-window.js +212 -0
- package/src/js/disk-manager/disk-operations.js +284 -0
- package/src/js/disk-manager/disk-persistence.js +301 -0
- package/src/js/disk-manager/disk-surface-renderer.js +388 -0
- package/src/js/disk-manager/drive-sounds.js +139 -0
- package/src/js/disk-manager/hard-drive-manager.js +481 -0
- package/src/js/disk-manager/hard-drive-persistence.js +187 -0
- package/src/js/disk-manager/hard-drive-window.js +57 -0
- package/src/js/disk-manager/index.js +890 -0
- package/src/js/display/display-settings-window.js +383 -0
- package/src/js/display/index.js +10 -0
- package/src/js/display/screen-window.js +342 -0
- package/src/js/display/webgl-renderer.js +705 -0
- package/src/js/file-explorer/disassembler.js +574 -0
- package/src/js/file-explorer/dos33.js +266 -0
- package/src/js/file-explorer/file-viewer.js +359 -0
- package/src/js/file-explorer/index.js +1261 -0
- package/src/js/file-explorer/prodos.js +549 -0
- package/src/js/file-explorer/utils.js +67 -0
- package/src/js/help/documentation-window.js +1096 -0
- package/src/js/help/index.js +10 -0
- package/src/js/help/release-notes-window.js +85 -0
- package/src/js/help/release-notes.js +612 -0
- package/src/js/input/gamepad-handler.js +176 -0
- package/src/js/input/index.js +12 -0
- package/src/js/input/input-handler.js +396 -0
- package/src/js/input/joystick-window.js +404 -0
- package/src/js/input/mouse-handler.js +99 -0
- package/src/js/input/text-selection.js +462 -0
- package/src/js/main.js +653 -0
- package/src/js/state/index.js +15 -0
- package/src/js/state/save-states-window.js +393 -0
- package/src/js/state/state-manager.js +409 -0
- package/src/js/state/state-persistence.js +218 -0
- package/src/js/ui/confirm.js +43 -0
- package/src/js/ui/disk-drive-positioner.js +347 -0
- package/src/js/ui/reminder-controller.js +129 -0
- package/src/js/ui/slot-configuration-window.js +560 -0
- package/src/js/ui/theme-manager.js +61 -0
- package/src/js/ui/toast.js +44 -0
- package/src/js/ui/ui-controller.js +897 -0
- package/src/js/ui/window-switcher.js +275 -0
- package/src/js/utils/basic-autocomplete.js +832 -0
- package/src/js/utils/basic-highlighting.js +473 -0
- package/src/js/utils/basic-tokenizer.js +153 -0
- package/src/js/utils/basic-tokens.js +117 -0
- package/src/js/utils/constants.js +28 -0
- package/src/js/utils/indexeddb-helper.js +225 -0
- package/src/js/utils/merlin-editor-support.js +905 -0
- package/src/js/utils/merlin-highlighting.js +551 -0
- package/src/js/utils/storage.js +125 -0
- package/src/js/utils/string-utils.js +19 -0
- package/src/js/utils/wasm-memory.js +54 -0
- package/src/js/windows/base-window.js +690 -0
- package/src/js/windows/index.js +9 -0
- package/src/js/windows/window-manager.js +375 -0
- package/tests/catch2/catch.hpp +17976 -0
- package/tests/common/basic_program_builder.cpp +119 -0
- package/tests/common/basic_program_builder.hpp +209 -0
- package/tests/common/disk_image_builder.cpp +444 -0
- package/tests/common/disk_image_builder.hpp +141 -0
- package/tests/common/test_helpers.hpp +118 -0
- package/tests/gcr/gcr-test.cpp +142 -0
- package/tests/integration/check-rom.js +70 -0
- package/tests/integration/compare-boot.js +239 -0
- package/tests/integration/crash-trace.js +102 -0
- package/tests/integration/disk-boot-test.js +264 -0
- package/tests/integration/memory-crash.js +108 -0
- package/tests/integration/nibble-read-test.js +249 -0
- package/tests/integration/phase-test.js +159 -0
- package/tests/integration/test_emulator.cpp +291 -0
- package/tests/integration/test_emulator_basic.cpp +91 -0
- package/tests/integration/test_emulator_debug.cpp +344 -0
- package/tests/integration/test_emulator_disk.cpp +153 -0
- package/tests/integration/test_emulator_state.cpp +163 -0
- package/tests/klaus/6502_functional_test.bin +0 -0
- package/tests/klaus/65C02_extended_opcodes_test.bin +0 -0
- package/tests/klaus/klaus_6502_test.cpp +184 -0
- package/tests/klaus/klaus_65c02_test.cpp +197 -0
- package/tests/thunderclock/thunderclock_mmu_test.cpp +304 -0
- package/tests/thunderclock/thunderclock_test.cpp +550 -0
- package/tests/unit/test_assembler.cpp +521 -0
- package/tests/unit/test_audio.cpp +196 -0
- package/tests/unit/test_ay8910.cpp +311 -0
- package/tests/unit/test_basic_detokenizer.cpp +265 -0
- package/tests/unit/test_basic_tokenizer.cpp +382 -0
- package/tests/unit/test_block_device.cpp +259 -0
- package/tests/unit/test_condition_evaluator.cpp +219 -0
- package/tests/unit/test_cpu6502.cpp +1301 -0
- package/tests/unit/test_cpu_addressing.cpp +361 -0
- package/tests/unit/test_cpu_cycle_counts.cpp +409 -0
- package/tests/unit/test_cpu_decimal.cpp +166 -0
- package/tests/unit/test_cpu_interrupts.cpp +285 -0
- package/tests/unit/test_disassembler.cpp +323 -0
- package/tests/unit/test_disk2_card.cpp +330 -0
- package/tests/unit/test_dos33.cpp +273 -0
- package/tests/unit/test_dsk_disk_image.cpp +315 -0
- package/tests/unit/test_expansion_card.cpp +178 -0
- package/tests/unit/test_gcr_encoding.cpp +232 -0
- package/tests/unit/test_keyboard.cpp +262 -0
- package/tests/unit/test_mmu.cpp +555 -0
- package/tests/unit/test_mmu_slots.cpp +323 -0
- package/tests/unit/test_mockingboard.cpp +352 -0
- package/tests/unit/test_mouse_card.cpp +386 -0
- package/tests/unit/test_pascal.cpp +248 -0
- package/tests/unit/test_prodos.cpp +259 -0
- package/tests/unit/test_smartport_card.cpp +321 -0
- package/tests/unit/test_thunderclock.cpp +354 -0
- package/tests/unit/test_via6522.cpp +323 -0
- package/tests/unit/test_video.cpp +319 -0
- package/tests/unit/test_woz_disk_image.cpp +257 -0
- package/vite.config.js +96 -0
- package/wiki/AI-Agent.md +372 -0
- package/wiki/Architecture-Overview.md +303 -0
- package/wiki/Audio-System.md +449 -0
- package/wiki/CPU-Emulation.md +477 -0
- package/wiki/Debugger.md +516 -0
- package/wiki/Disk-Drives.md +161 -0
- package/wiki/Disk-System-Internals.md +547 -0
- package/wiki/Display-Settings.md +88 -0
- package/wiki/Expansion-Slots.md +187 -0
- package/wiki/File-Explorer.md +259 -0
- package/wiki/Getting-Started.md +156 -0
- package/wiki/Home.md +69 -0
- package/wiki/Input-Devices.md +183 -0
- package/wiki/Keyboard-Shortcuts.md +158 -0
- package/wiki/Memory-System.md +364 -0
- package/wiki/Save-States.md +172 -0
- package/wiki/Video-Rendering.md +658 -0
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* video.hpp - Video output generation
|
|
3
|
+
*
|
|
4
|
+
* Written by
|
|
5
|
+
* Mike Daley <michael_daley@icloud.com>
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
#pragma once
|
|
9
|
+
|
|
10
|
+
#include "../mmu/mmu.hpp"
|
|
11
|
+
#include "../types.hpp"
|
|
12
|
+
#include <array>
|
|
13
|
+
#include <cstdint>
|
|
14
|
+
#include <functional>
|
|
15
|
+
|
|
16
|
+
namespace a2e {
|
|
17
|
+
|
|
18
|
+
class Video {
|
|
19
|
+
public:
|
|
20
|
+
using CycleCallback = std::function<uint64_t()>;
|
|
21
|
+
|
|
22
|
+
Video(MMU &mmu);
|
|
23
|
+
|
|
24
|
+
// Render a complete frame to the framebuffer
|
|
25
|
+
void renderFrame();
|
|
26
|
+
|
|
27
|
+
// Force a full frame render from current memory using current video switch
|
|
28
|
+
// state, independent of beam position or CPU cycle count. Useful for
|
|
29
|
+
// debugger screen refresh after stepping.
|
|
30
|
+
void forceRenderFrame();
|
|
31
|
+
|
|
32
|
+
// Progressive rendering: render all scanlines up to the current CPU cycle
|
|
33
|
+
void renderUpToCycle(uint64_t currentCycle);
|
|
34
|
+
|
|
35
|
+
// Get the framebuffer (RGBA, 560x384)
|
|
36
|
+
const uint8_t *getFramebuffer() const { return framebuffer_.data(); }
|
|
37
|
+
uint8_t *getFramebuffer() { return framebuffer_.data(); }
|
|
38
|
+
|
|
39
|
+
// Framebuffer size
|
|
40
|
+
static constexpr size_t getFramebufferSize() { return FRAMEBUFFER_SIZE; }
|
|
41
|
+
|
|
42
|
+
// Frame dirty flag
|
|
43
|
+
bool isFrameDirty() const { return frameDirty_; }
|
|
44
|
+
void clearFrameDirty() { frameDirty_ = false; }
|
|
45
|
+
void setFrameDirty() { frameDirty_ = true; }
|
|
46
|
+
|
|
47
|
+
// Display mode info
|
|
48
|
+
VideoMode getCurrentMode() const;
|
|
49
|
+
|
|
50
|
+
// Color settings
|
|
51
|
+
void setMonochrome(bool mono) { monochrome_ = mono; }
|
|
52
|
+
bool isMonochrome() const { return monochrome_; }
|
|
53
|
+
|
|
54
|
+
void setGreenPhosphor(bool green) { greenPhosphor_ = green; }
|
|
55
|
+
bool isGreenPhosphor() const { return greenPhosphor_; }
|
|
56
|
+
|
|
57
|
+
// UK character set (like the physical switch on UK Apple IIe)
|
|
58
|
+
void setUKCharacterSet(bool uk) { ukCharSet_ = uk; }
|
|
59
|
+
bool isUKCharacterSet() const { return ukCharSet_; }
|
|
60
|
+
|
|
61
|
+
// Cycle callback for determining current position within frame
|
|
62
|
+
void setCycleCallback(CycleCallback cb) { cycleCallback_ = std::move(cb); }
|
|
63
|
+
|
|
64
|
+
// Called by MMU callback when a video-relevant soft switch changes
|
|
65
|
+
void onVideoSwitchChanged();
|
|
66
|
+
|
|
67
|
+
// Called at frame boundaries to reset the change log and snapshot state
|
|
68
|
+
void beginNewFrame(uint64_t cycleStart);
|
|
69
|
+
|
|
70
|
+
private:
|
|
71
|
+
// Per-scanline segment rendering (column range within a single scanline)
|
|
72
|
+
// startCol/endCol are byte positions 0-40 (one per CPU cycle in visible area)
|
|
73
|
+
void renderText40Scanline(int scanline, int startCol, int endCol, const VideoSwitchState& vs);
|
|
74
|
+
void renderText80Scanline(int scanline, int startCol, int endCol, const VideoSwitchState& vs);
|
|
75
|
+
void renderLoResScanline(int scanline, int startCol, int endCol, const VideoSwitchState& vs);
|
|
76
|
+
void renderHiResScanline(int scanline, int startCol, int endCol, const VideoSwitchState& vs);
|
|
77
|
+
void renderDoubleLoResScanline(int scanline, int startCol, int endCol, const VideoSwitchState& vs);
|
|
78
|
+
void renderDoubleHiResScanline(int scanline, int startCol, int endCol, const VideoSwitchState& vs);
|
|
79
|
+
|
|
80
|
+
// Dispatch a scanline segment to the correct mode renderer, handling mixed mode
|
|
81
|
+
void renderScanlineSegment(int scanline, int startCol, int endCol, const VideoSwitchState& vs);
|
|
82
|
+
|
|
83
|
+
// Render a single scanline using the switch change log (progressive rendering)
|
|
84
|
+
void renderScanlineWithChanges(int scanline);
|
|
85
|
+
|
|
86
|
+
// Character rendering — single character row (1 ROM line → 2 framebuffer rows)
|
|
87
|
+
void renderCharacterLine(int col, int textRow, int charLine,
|
|
88
|
+
uint8_t ch, bool inverse, bool flash,
|
|
89
|
+
const VideoSwitchState& vs, bool is80col);
|
|
90
|
+
|
|
91
|
+
// Character ROM offset helper (shared between 40-col and 80-col paths)
|
|
92
|
+
struct CharROMInfo {
|
|
93
|
+
uint16_t romOffset;
|
|
94
|
+
bool needsXor;
|
|
95
|
+
bool inverse;
|
|
96
|
+
};
|
|
97
|
+
CharROMInfo getCharROMInfo(uint8_t ch, bool inverse, bool flash,
|
|
98
|
+
const VideoSwitchState& vs) const;
|
|
99
|
+
|
|
100
|
+
// Capture current video switch state from MMU
|
|
101
|
+
VideoSwitchState captureVideoState() const;
|
|
102
|
+
|
|
103
|
+
// Pixel helpers
|
|
104
|
+
void setPixel(int x, int y, uint32_t color);
|
|
105
|
+
|
|
106
|
+
// Color helpers
|
|
107
|
+
uint32_t getLoResColor(uint8_t colorIndex) const;
|
|
108
|
+
uint32_t getMonochromeColor(bool on) const;
|
|
109
|
+
|
|
110
|
+
// Text screen address calculation
|
|
111
|
+
uint16_t getTextAddress(int row, int col) const;
|
|
112
|
+
uint16_t getHiResAddress(int row, int col) const;
|
|
113
|
+
|
|
114
|
+
// Reference to MMU for memory access
|
|
115
|
+
MMU &mmu_;
|
|
116
|
+
|
|
117
|
+
// Framebuffer (RGBA, 560x384)
|
|
118
|
+
std::array<uint8_t, FRAMEBUFFER_SIZE> framebuffer_{};
|
|
119
|
+
|
|
120
|
+
// Frame state
|
|
121
|
+
bool frameDirty_ = true;
|
|
122
|
+
|
|
123
|
+
// Flash state (toggles every ~16 frames)
|
|
124
|
+
int flashCounter_ = 0;
|
|
125
|
+
bool flashState_ = false;
|
|
126
|
+
static constexpr int FLASH_RATE = 16;
|
|
127
|
+
|
|
128
|
+
// Display options
|
|
129
|
+
bool monochrome_ = false;
|
|
130
|
+
bool greenPhosphor_ = false;
|
|
131
|
+
bool ukCharSet_ = false; // UK character set switch
|
|
132
|
+
|
|
133
|
+
// Cycle callback for position calculation
|
|
134
|
+
CycleCallback cycleCallback_;
|
|
135
|
+
|
|
136
|
+
// Per-scanline rendering: frame start cycle and switch change log
|
|
137
|
+
uint64_t frameStartCycle_ = 0;
|
|
138
|
+
VideoSwitchState frameStartState_{};
|
|
139
|
+
|
|
140
|
+
static constexpr int MAX_SWITCH_CHANGES = 1024;
|
|
141
|
+
std::array<VideoSwitchChange, MAX_SWITCH_CHANGES> switchChanges_;
|
|
142
|
+
int switchChangeCount_ = 0;
|
|
143
|
+
|
|
144
|
+
// Progressive per-scanline rendering state
|
|
145
|
+
int lastRenderedScanline_ = -1; // -1 means no scanlines rendered yet this frame
|
|
146
|
+
int changeIdx_ = 0; // Current position in switch change log
|
|
147
|
+
VideoSwitchState currentRenderState_{}; // Current video state for progressive rendering
|
|
148
|
+
|
|
149
|
+
// Lookup tables
|
|
150
|
+
static constexpr std::array<int, 24> TEXT_ROW_OFFSETS = {
|
|
151
|
+
{0x000, 0x080, 0x100, 0x180, 0x200, 0x280, 0x300, 0x380,
|
|
152
|
+
0x028, 0x0A8, 0x128, 0x1A8, 0x228, 0x2A8, 0x328, 0x3A8,
|
|
153
|
+
0x050, 0x0D0, 0x150, 0x1D0, 0x250, 0x2D0, 0x350, 0x3D0}};
|
|
154
|
+
};
|
|
155
|
+
|
|
156
|
+
} // namespace a2e
|