vs-sr-dev/vis-fileviewer
GitHub: vs-sr-dev/vis-fileviewer
一个用于查看和播放1992年Tandy/Memorex VIS光盘内容的轻量级媒体文件查看器。
Stars: 0 | Forks: 0
# VIS 文件查看器
一个轻量级的 **媒体文件查看器**,用于 **Tandy/Memorex 视频信息系统 (VIS)** —
一个运行在 Intel 80286 @ 12 MHz 上的 1992 年多媒体控制台,运行 Microsoft Modular Windows 3.1,
配备 Yamaha YMF262 (OPL3) FM 合成器 + R-2R DAC 和 Mitsumi 1× CD-ROM。
它是一个单一的 Win16 NE 可执行文件,可以捆绑为任何 VIS CD/ISO 的外壳。在启动时,
它会列出光盘上的媒体文件,并呈现一个手控导航的浏览器。
选择一个文件将使用 VIS 的 **原生** Modular Windows 功能播放/显示它——无持久性(VIS 仅限 CD:没有硬盘,无法保存)。
| 媒体 | 格式 | 如何渲染 |
|---|---|---|
| 📷 照片 | `.BMP` / `.DIB` (8 位,≤ 320×200) | GDI `StretchDIBits` + 实现的 256 色调色板 |
| 🔊 音频 | `.WAV` (PCM→DAC),`.MID` / `.RMI` (→ OPL3 FM) | MCI `waveaudio` / `sequencer` |
| 🎬 视频 | `.FLC` / `.FLI` (Autodesk FLIC) | DISPDIB DVA,直接解码到视频 RAM (A000) |
## 为什么是 FLC 而不是 AVI?
VIS 教育娱乐标题充满了全动作视频——但检查零售光盘
(*美国总统图鉴*,*圣经土地*,*健身伙伴*)显示 **没有单个 AVI 文件**:他们的视频是 **Autodesk FLC/FLIC 动画** 和 **RLE/DIB 序列** 通过 `DisplayDib` 擦除。ROM 的 `mciavi.drv` 是残余的——通过 MCI 打开 AVI 返回 `MMSYSERR_NODRIVER`(错误 6)。因此,此查看器实现了一个从头开始的 FLC 播放器,这就是 VIS 视频实际上是如何工作的。
## 值得注意的 VIS 问题
- **MCI 连接**——音频需要 `SYSTEM.INI` 中的 `[mci]` + `[drivers] wave/midi=vwavmidi.drv` 部分,或者 `mciSendString open` 返回错误 306 (`MCIERR_DEVICE_NOT_INSTALLED`)。
- **MIDI 基础模式**——VIS 合成器启动时只响应通道 13–16;通过嵌入 GM-System-On SysEx (`F0 7E 7F 09 01 F7`) 作为第一个事件播放通用 MIDI 文件(见 [tools/prep_midi.py](tools/prep_midi.py))。
- **视频性能**——三个独立的上限,所有针对全帧视频进行操作:
GDI 太慢(`DIB_RGB_COLORS` ≈ 1 fps,`DIB_PAL_COLORS` ≈ 5 fps)→ 使用 **DISPDIB DVA
直接写入 A000**;`GetTickCount`/`WM_TIMER` 被量化到 ~55 ms → 直接从 **PIT** 调速帧(MAME-VIS 上的 ~596 kHz);每像素解码是真正的限制→在 A000 上解码并使用 `rep stos`/`movs` (`_fmemset`/`_fmemcpy`) 填充 RLE 运行。
- **256 色渲染**——`[tvvga]`(小写)`resolution=320x200x8`;`StretchDIBits`,不是 `SetDIBitsToDevice`;自下而上的 DIB;为免费 236 种颜色实现调色板。
- **手控器**——`IMPORT hcGetCursorPos HC.HCGETCURSORPOS` 对于 `WM_KEYDOWN` 路由是强制性的;从计时器中轮询它;抑制原生光标。
## 布局
```
src/ viewer.c (the app) + build_viewer.bat + link_viewer.lnk + mkiso_viewer.py
tools/ prep_image.py (any image → VIS 8-bit BMP), prep_midi.py (SMF → VIS MID)
reverse/ flc_encode.py (test-FLC generator), inspect_real_disc.py (disc recon)
cd_root/ VIS-bootable CD staging: AUTOEXEC, SYSTEM.INI, CONTROL.TAT + test media
```
## 构建 & 运行
需要 [Open Watcom V2](https://github.com/open-watcom/open-watcom-v2)(Win16 目标),
Python 与 `pycdlib`(+ `Pillow` 用于工具),以及 [MAME](https://www.mamedev.org/) 与
`vis` 驱动程序和一个 VIS BIOS 转储(`vis.zip`,**不包括**——提供你自己的)。
```
# 编译 Win16 NE 并将其存入 cd_root
cmd /c src\build_viewer.bat # override WATCOM to point at your Open Watcom
# 掌握 VIS 可引导 ISO
python src\mkiso_viewer.py # cd_root/* -> build/viewer.iso
# 在 MAME 中运行(在 rompath 上 BIOS vis.zip)
mame -rompath . vis -cdrom build/viewer.iso -window -nomax -skip_gameinfo
```
### 添加您自己的媒体
```
python tools/prep_image.py path/to/photo.jpg NAME # -> cd_root/NAME.BMP (8-bit, ≤320×200)
python tools/prep_midi.py path/to/song.mid NAME # -> cd_root/NAME.MID (GM-On injected)
# 然后重新运行 mkiso_viewer.py
```
8.3 大写文件名;BMP 必须保持在 ~65 KB(≈ 320×200 位)以下。
## 致谢
基于来自兄弟项目 **vis-wolf3d** 的 VIS 反向工程基础(工具链,CONTROL.TAT,DISPDIB/`__A000H`,PIT 定时,调色板/渲染问题)。VIS
BIOS 和 Modular Windows 是其各自所有者的财产,并且在此处不重新分发。
## 许可证
MIT © 2026 Samuele Voltan — see [LICENSE](LICENSE).
标签:80286, Autodesk FLC, BMP图片, CD-ROM, DAC, FLC视频, GDI, MCI, MIDI, MIDI合成器, Mitsumi CD-ROM, Modular Windows, NE可执行文件, R-2R DAC, Tandy/Memorex VIS, WAV音频, Win16, Yamaha YMF262, 历史软件, 图像处理, 多媒体内容, 多媒体平台, 多媒体应用, 多媒体开发, 多媒体技术, 多媒体播放, 多媒体格式转换, 多媒体系统, 多媒体解决方案, 多媒体软件, 媒体文件查看器, 客户端加密, 数据管道, 系统兼容性, 系统配置, 视频性能优化, 视频播放, 计算机历史, 软件兼容性测试, 软件工具, 软件工程, 软件维护, 软件调试, 轻量级软件, 音频播放