New MZ-1E30 SASI hard disk interface for MZ-2500:
- SASI.c/h: reusable SASI bus controller with full state machine
(BUS_FREE/SELECTION/COMMAND/DATA_IN/DATA_OUT/STATUS/MESSAGE phases)
- MZ1E30.c/h: board-level wrapper with ROM (ports A8/A9) and SASI (A4/A5)
- Sector-level I/O via ESP32 SD card IPC (no PSRAM allocation for 22MB images)
- Inline response polling in sasiReadStatus for Z80 tight-loop compatibility
- Supports READ(6), WRITE(6), SEEK(6), TEST_UNIT_READY, REQUEST_SENSE, INQUIRY
- 4 target disks, 256-byte blocks, SuperTurboZ Enhanced ROM compatible
Debug shell hook system:
- Generic driver-registered trace hooks (fdctrace, mmutrace, qdtrace)
- All machine drivers register machineName; FDC/QD interfaces register trace hooks
- Extensible for new machines without modifying dbgsh.c
Web GUI: IPL Reset button, MZ-1E30 interface with noLoadAddr ROM config
Config parser: always store ROM file in romConfig even with romAddrCount=0
(interfaces with port-based ROM access need the filename without loadaddr)
WD1773 XIP cache coherency fix: DMA disk loads bypass XIP cache, leaving
stale calloc zeros. xip_cache_clean_all + invalidate_all after DMA ensures
Core 1 sees fresh PSRAM data. Fixes intermittent ExtDSK misdetection as D88.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Virtual mode interrupt support:
- Gate array needs physical M1 bus cycles (fetchPhysicalMem in fetchOpcode)
for internal clocks (8253 timer, interrupt controller) to advance
- MZ2500 driver overrides cpu->_Z80.reti and cpu->_Z80.fetch with custom
handlers (MZ2500_retiHandler, MZ2500_fetchByte) — zero core changes
- Physical RETI bus sequence (ED 4D plant + M1 fetch) clears IC in_service
- One-shot INT suppression prevents premature interrupts during I=0x02 init
- Physical RETI cleanup at suppression boundary clears accumulated in_service
D88 native format handler (WD1773.c):
- Sparse/contiguous auto-detection for track mapping strategy
- Physical (C,H) → D88 index mapping built from sector headers (Balloon Fight)
- Index-based identity mapping for standard/H-swapped disks (Galaga, CP/M)
- d88PhysMap array with proper allocation/cleanup
Driver architecture cleanup:
- All MZ-2500 interrupt logic in MZ2500.c driver (not Z80CPU.c core)
- Custom RETI/fetchByte set directly on cpu->_Z80 function pointers
- Core Z80CPU.c unchanged from pre-MZ-2500 state for other machines
- Debug shell: psync command, intcount with /INT pin diagnostic
- MZ8BFI: MAX_DISK_DRIVES reduced to 2 for PSRAM heap
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
New drivers:
- MZ-1500 persona driver with MZ-700/MZ-1500 mode switch, PCG bank switching,
PSG stubs, physical I/O forwarding for virtual mode
- MZ-2200 persona driver (based on MZ-2000)
- MZ-1R23/MZ-1R24 Kanji ROM / Dictionary ROM board (B8h/B9h IDM)
- MZ-1R37 640KB EMM (ACh/ADh, no auto-increment, 20-bit addressing)
- PIO-3034 320KB EMM (configurable base, 19-bit, auto-increment)
- Celestite LAN/Memory composite board:
- W5100 TCP/IP via ESP32 WiFi (connect, send, recv, ping)
- Integrated MZ-1R12 32/64KB CMOS RAM with SD persistence
- Integrated MZ-1R37 640KB EMM with SD persistence
- UFM flash, unlock state machine, interrupt controller
Celestite networking (Phase 2):
- New IPC commands: NET_CFG, NET_SOCK, NET_SEND, NET_RECV, NET_PING
- ESP32 BSD socket handlers with non-blocking connect and recv
- Shared volatile struct for cross-core results (bypasses responseQueue)
- Inline IDM read check for socket status and recv data
- Z80 test programs: celestite_test.asm (17 tests), celestite_stress.asm (loop)
MZ-1500 virtual mode fixes:
- I/O writes forwarded to physical hardware (PSG, bank switching, PCG)
- E000-E7FF always stays physical during bank switching
- PCG bank (F000-FFFF) properly remapped to PHYSICAL when open
QDF format support:
- Japanese standard QD format auto-detected on load (81936 bytes)
- Hunt pattern changed to 00+16 (mark+sync) for inter-block gap handling
- Sync stripping handles long preambles (9+ bytes)
- MZQDTool updated with -j flag and format conversion
Other:
- Debug shell load command: len parameter now optional
- FSPI filename field: memcpy instead of strncpy for binary data
- Interface availability expanded across MZ-700/1500/80A/2000/2200
- Web GUI: param hints for Celestite, updated driver interface lists
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Added *.img to .gitignore (368MB RFS disk image now distributed
as a release asset instead of checked into git)
- Updated PSRAM frequency to 109MHz in default config
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>