» 您尚未登录:请 登录 | 注册 | 标签 | 帮助 | 小黑屋 |


 18 12
发新话题
打印

[其他] 今天搜32X,刷到一个外国玩家的帖子,想到一个问题,SS为何不兼容MD?

posted by wap, platform: 小米
引用:
原帖由 @KainX  于 2025-11-9 13:23 发表
MCD跟NEOGEO不是一个赛道的,MCD主打播片和活动块变形这两个在当时很时髦的特性,而NEOGEO主要还是爆发色/活动块数量这种基础性能。

同屏512色是利用MD的一个系统漏洞来实现direct color,这个需要很高的算力同步视频信号,仅靠MD本体目前只能显示静止画面,加上MCD大概能做文字AVG一类的游戏。

民间高手给MCD的super scaler打补丁主要是给游戏提速,当年官方的此类游戏运行速度明显不符合MCD的主CPU+图形协处理器应有的表现。
sega真拉夸,官方不如民间同人_(:з」∠)_


TOP

引用:
原帖由 KainX 于 2025-11-9 13:23 发表

MCD跟NEOGEO不是一个赛道的,MCD主打播片和活动块变形这两个在当时很时髦的特性,而NEOGEO主要还是爆发色/活动块数量这种基础性能。

同屏512色是利用MD的一个系统漏洞来实现direct color,这个需要很高的算力同 ...
https://forums.sonicretro.org/th ... sega-genesis.42942/

大约五年前,Digital Foundry联系我,问我能否想到一些特别的方法来测试当时全新推出的Analogue Mega SG的精度。他们希望我能推荐一些只有极其精准的硬件/模拟器才能复现的演示。我当然推荐了Titan,但我也主动提出为他们编写一个演示,展示一种更为冷门的技巧:Blast Processing。即使是Titan也无法实现Blast Processing,而且极少有模拟器能够重现这种效果。任何能够演示Blast Processing的硬件,其精度自然都非常高。一提到“Blast Processing”这个词,Eurogamer就兴奋不已,于是他们给了我几周时间来编写演示,并撰写一篇说明文章,解释它的工作原理和背后的历史。

现在,本文并非要讨论“Blast Processing”这个术语本身,这个营销术语是如何从特定的Direct Color DMA技巧演变为电视广告的,在演示编写之前就已经有据可查了。这才是人们广泛讨论的部分。更重要的是它的工作原理,尤其是它为什么有效,以及最近发生了哪些变化。于是我开始研究,并与 Nemesis、ChillyWilly 和 Oerg866 交流,最终获得了足够详细的理解,得以制作视频。

然而,五年过去了,我仍然不断看到有人说 DF Retro 视频中描述的内容“只是 DMA”,“每台主机都能做到”,“SNES 可以用 HDMA 实现”,“Amiga 可以用 HAM 实现”。这类评论令人恼火,因为它们印证了那句老话:一知半解是危险的。就此而言,这些说法是对 Sega Genesis 独有的技巧以及它与 SNES 上的 HDMA 等技术区别的严重误解。

部分原因可能在于我为 DF Retro 录制的旁白。DF Retro 的负责人 Jon 和我最初是通过电话以轻松聊天的方式完成配音的。问题是,视频原定上传的那天晚上,Jon联系我说他只录到了他的声音,没录到我这边的通话内容。当时是我这边的凌晨五点,我已经连续两天没睡,一直在为df视频做最后的润色,而视频必须在两小时内上传。他的解决办法是让我听他那边的通话录音,然后对着麦克风再模仿一遍我的回答,以此来重现对话。极度的疲惫加上这个过程本身就很不顺畅,导致我说的很多话都像是在胡言乱语。

所以,为了澄清这个误解,我决定重新阐述一下我学到的东西,并解释一下Blast Processing和其他提到的DMA之间的区别。

首先,需要明确的是,Blast Processing 的诀窍在于预先准备一屏像素数据,以便与电视的实时扫描输出同步进行 DMA 传输。世嘉 Genesis 使用同一总线来读取和写入调色板,因此,如果电视接口在读取颜色 RAM 的同时进行写入操作(就像在实时扫描期间那样),就可以动态地改变写入的颜色,完全绕过传统的调色板概念。通过将调色板的持续变化与像素写入屏幕同步进行 DMA 传输,就可以独立控制每个像素的颜色(或者更准确地说,是 DMA 访问槽的颜色,因为 DMA 访问槽比单个像素略大)。

那么,这与 SNES 的 DMA 有何不同呢?首先,SNES 在实时扫描期间的 DMA 传输方式不同。在世嘉Genesis主机上,它会在显示工作期间按要求写入CRAM,这样就能正确更新调色板中的目标条目(这就是为什么像索尼克这样的游戏在帧间调色板切换时会出现CRAM点的原因)。然而,在SNES主机上,由于PPU的工作方式,在显示工作期间写入CRAM无法正常工作。数据会写入PPU当前正在读取的位置,从而破坏调色板。换句话说,SNES的DMA在扫描期间无法正确选择单个调色板条目,因此在扫描期间对CRAM进行DMA写入在SNES上不起作用,而在世嘉Genesis上则可以。

那么HDMA呢?顾名思义,HDMA在HBLANK期间工作,而不是在扫描期间。这就是“HDMA”中的“H”的含义。Blast Processing需要在扫描期间进行DMA写入。

所以,简而言之,SNES无法按照描述进行Blast Processing。

那么Amiga的HAM呢?首先,这甚至都不是DMA,而是Denise图形芯片的一种特殊模式,它使用自定义像素格式来显示更多颜色,但其工作原理完全不同。Blast Processing可以在任何给定像素的活动扫描期间任意选择要显示的颜色,而HAM则不能。HAM的名称解释了它的功能:它会保存并修改一定范围内的像素。这是因为在Amiga上,总线空间不足以同时以所需的位深度更改像素的红、蓝、绿三个子通道。因此,HAM会保留前一个像素的三个RGB子通道属性中的两个,从而利用总线的全部宽度来更改单个子通道。图形数据中的每个字节不再映射到平面上的8个像素,而是在HAM模式下,每个字节提供6位数据来更改像素的单个子通道,其中2位是模式选择,用于确定要保留前一个像素的哪两个子通道。所以使用HAM时,你不是直接绘制像素,而是绘制RGB子通道。你不能随意地从一种颜色过渡到另一种颜色。你需要将一种颜色混合到另一种颜色,跨越多个像素,同时独立地改变每个子通道。

所以,Amiga 的 HAM 也不是在进行 blast processing(高速处理)。

现在,很多人在讨论这个话题时都会提到 Traveler's Tale 的 John Burton 的 Gamehut,这不无道理,因为他确实在我们制作视频的几年前就制作过一个关于他如何探索这项技术的视频。Burton 并非这项技术的发明者,但众所周知,SoA(美国世嘉)显然知道这项技术。我可以确认 Iguana 和 Dave Perry 的团队也知道这项技术,而且有证据表明日本世嘉也知道。然而,所有这些机构都犯了一个错误,那就是他们缺乏同步方法。世嘉 Genesis 无法自动将 DMA 的启动时间与电视机的激活扫描时间同步,而且不同版本的世嘉 Genesis/Mega Drive 之间存在非常细微的时序差异。这意味着手动调整 DMA 以使其在激活扫描开始时启动可能对某些型号的 Genesis 有效,但对其他型号则无效。 Burton 的解决方案是一种校准方法,用于在游戏前确定 Sega Genesis 的时序,但他认为这种方法不够优雅。这就是我们视频后半部分的内容——Oerg866 设计了一系列看似随机的操作,这些操作可以在所有官方 Sega Genesis 型号上可靠地执行 DMA(直接内存访问)操作,尤其是在活动扫描开始时。Oerg866 本人甚至不知道这一系列操作码为何如此可靠,是 Nemesis 深入研究并发现了其中的原理。

对于不了解的人来说,同步到活动扫描的算法如下:

代码(文本):
        /* 等待 VBlank 开始 */
1:
        btst #3,1(a3)
        beq.b 1b                     

        /* 等待垂直消隐结束 -- 同步误差范围大约为 12 像素 */
2:
        btst #3,1(a3)
        bne.b 2b                     

        /* 通过向 FIFO 缓冲区填充数据来设置扫描线模式 -- 同步误差范围缩小到大约 1-2 个像素 */
        move.w d0,(a2)
        move.w d0,(a2)
        move.w d0,(a2)
        move.w d0,(a2)
        move.w d0,(a2)
        move.w d0,(a2)
        move.w d0,(a2)
        move.w d0,(a2)
        move.w d0,(a2)
        move.w d0,(a2)
        move.w d0,(a2)
        move.w d0,(a2)
        move.w d0,(a2)

        /* 调整 DRAM 刷新周期 -- 刷新周期为 2 个像素,会占用同步错误范围 */
        不
        不
        不
        不

        /* 处理爆炸! */
        move.l #0x934094ad,(a3) /* DMALEN LO/HI = 0xAD40 (198*224) */
        move.l #0x95729603,(a3) /* DMA SRC LO/MID */
        move.l #0x97008114,(a3) /* DMA SRC HI/MODE,关闭显示 */
        move.l #0xC0000080,(a3) /* dest = 写入 cram => 开始 DMA */
      
/* CPU 暂停,直到 Blast 处理完成 */
基本思路是等待垂直消隐(VBlank)信号结束,因为垂直消隐是世嘉Genesis主机少数几种能够产生的同步信号之一。我们可以确定垂直消隐的开始和结束时间,并将其作为起始点。需要注意的是,不同版本的世嘉Genesis主机的时序有所不同,因此这个时间点并不精确,可能会有微秒级的误差。Nemesis声称这种方法可以产生大约12像素的误差范围,这意味着我们的DMA操作可以在0到12像素的范围内任意启动。接下来的代码每次在寄存器之间移动16位数据,这种操作会通过大量数据涌入FIFO队列来消耗一定的时间。这样做是为了将下一个操作的起始时间调整到扫描线的起始位置。同样,在不同的版本中,扫描线起始时间也会有几微秒的误差。这会将DMA的起始像素范围缩小到0到2像素之间,这意味着如果我们触发DMA,它会随机从我们预期位置的0、1或2像素处开始(根据世嘉Genesis的版本而定)。

这就是世嘉Genesis硬件的特殊配置发挥作用的地方。Genesis使用一种称为动态随机存取存储器(DRAM)的RAM,而不是静态随机存取存储器(SRAM),以节省成本。从功能上看,两者类似,它们都使用触发器电路存储电流来表示二进制的1。在这种触发器单元中,有电流表示1,没有电流表示0(从最基本的意义上讲)。SRAM可以无限期地保持其电荷,但DRAM会随着时间的推移而老化。随着DRAM老化,触发器电路中的电流会丢失,因此1会变成0。为了避免这种情况,DRAM触发器电路需要每隔一段时间就注入一小股电流进行“补充”。此时,整个系统会短暂停止,以便DRAM刷新,然后继续运行。这种刷新过程称为DRAM刷新。

我说整台机器停止运行,指的是所有操作,包括DMA。因此,在这段时间内,DMA突发写入操作将不会执行,而是会被缓冲,直到DRAM刷新完成。这就是整个技巧的关键所在。恰好在活动扫描输出的开始附近,屏幕左侧(超出电视显示边缘)存在一个DRAM刷新周期。这个DRAM刷新周期需要几微秒才能完成,相当于一个2像素的窗口,足以使DMA暂停。而这正是同步显示的关键所在——通过使用4个NOP指令,你可以让Genesis暂停足够长的时间,使DMA的开始时间恰好落在这个刷新周期内。由于2像素的刷新周期宽度等于不同型号Sega Genesis主机之间最大的微秒级差异,因此这种时间差实际上被忽略了。无论DMA时序偏差多少,哪怕是0、1或2个像素,它都会被暂停,直到DRAM刷新周期结束(即2个像素之后),此时DMA才会开始。如果我们的DMA起始位置与我们预想的偏差2个像素,那么在DRAM刷新周期结束后,偏差将变为0个像素。如果DMA偏差1个像素,那么在DRAM刷新周期结束后,偏差也将变为0个像素。同样地,如果DMA偏差为0个像素,那么在DRAM刷新周期结束后,偏差仍然为0个像素。这意味着,无论Sega Genesis是什么型号,DMA总是在扫描线上的同一时刻开始,即DRAM刷新周期结束后的第一个像素。

这就是秘诀所在。这就是Sega of America、Traveller's Tales、Iguana以及其他无数试图实现这一技巧的厂商所忽略的。这就是Oerg866发现的,也是Nemesis阐明的。这个技巧——将DMA可靠地同步到活动扫描的开始——是世嘉Genesis独有的,它是通过滥用机器上最底层的硬件实现的。这个技巧的每一个细节都与世嘉Genesis的硬件以及具体的配置密切相关。其他系统无法实现Blast Processing,Blast Processing也不仅仅是DMA。

(虽然,私底下,Amiga 也能用 Copper 实现同样的效果,在 Amiga 圈子里,这个技巧被称为 ChunkyCopper。Amiga 这么做的原因和 Sega Genesis 完全不同,而且与 Genesis 不同的是,Amiga 的这项功能是由一个辅助协处理器处理的,它可以执行 DMA 操作而不会阻塞 68000 主控。所以,与 Genesis 不同,Amiga 的游戏实际上都带有“极速处理”功能。《Gloom》就是最好的例子,不过关于 Amiga 的详细解释以后再说。)

希望这能让大家对极速处理有更清晰的了解,以后我就不会再看到“这只是 DMA 而已”之类的帖子了。感谢 Nemesis、Chilly Willy 和 Oerg866 的帮助!
最后编辑日期:2024年6月19日

…………………………………………………………………………………………
挺有意思的。
原来SEGA-CD理论上通过这样的技巧能破限。
只是没有厂家干这个事,都去做FMV游戏了。



TOP

引用:
原帖由 小粉粉 于 2025-11-9 18:58 发表

90年代早期欧美很流行FMV的游戏,所以卡林斯基要求在美国推广MD-CD以FMV游戏为主,MD-CD在美国首发捆绑的游戏就是FMV游戏。
那东西的问题是没有反复玩的价值吧?

如果当年MD能用到现在的彩色显示技术,至少同屏512色,做点好看的RPG才是正道。

那个TITANS 512C能让本体直接上512色的样子。

SEGA-CD如果用BLAST PRCESSING似乎是能突破512色的限制。
……………………………………………………………………………………………………………………………………………………………………………………

非常有趣。能否利用这个功能在游戏画面的上半部分显示图像,同时保持下半部分正常显示?你的示例中显示被禁用了,但这真的有必要吗?能否在游戏过程中重新启用显示?
是的,可以!首先,这种 Blast Processing 技巧存在一个局限性:世嘉 Genesis 的资源有限,无法存储通过 DMA 传输到屏幕的全屏图像。因此,使用 DirectColor DMA 通常最多只能填充屏幕的 2/3,这就是为什么像这样的演示会显示不全的原因:
限制点在于 Genesis 的内存容量。所以,你永远无法真正实现全屏的 Blast Processing 演示。不过,还有很多需要注意的地方。正如你所指出的,在 DMA 传输结束之前,显示器就会关闭,因此任何精灵、图块或任何实际的世嘉 Genesis 元素都无法覆盖 Blast Processing 区域。即使你可以绘制精灵,它的工作方式也是通过创建压缩伪影来实现的,而这些伪影最终也会覆盖在这些元素之上。所以,你可以把它想象成一个最顶层的不可变图层。然而,在 BP 区域下方,一旦显示屏重新打开,您就可以使用普通的图块、精灵以及所有其他元素。这是一个使用此方法制作的非常简单的类似 Snatcher 的点状文字冒险游戏的演示:
Blast Processing 的主要问题在于 CPU 会在大约三分之二的帧时间内处于停顿状态,这严重限制了你能做的事情。在达到垂直消隐 (VBLANK) 之前,你实际上只能访问大约 40 条扫描线,因此你的 CPU 窗口非常小,实际上只够运行像上面提到的冒险游戏那样的操作。
但是,如果你有第二个可以并行处理的 68K 处理器,比如 Sega CD,那么你就可以做更多有趣的事情。Chilly Willy 用 Sega CD 上的 Blast Processing 制作了一个 Wolfenstein 克隆游戏的演示:
不过,这种方法还有更多限制。Blast Processing 窗口的工作内存只有 128KB,所以分辨率只有原来的一半。Sega Genesis 常用的垂直缩放方法也行不通,因为它不是用平面绘制的。但这表明,确实可以通过这种方式实现完全可玩的 Blast Processing 游戏。
需要注意的是:我这么说并不是要吹捧 Blast Processing。在大多数情况下,它只是个没什么用的小技巧。除了高度限制和 CPU 资源消耗之外,它还会产生可见的伪影,因为在活动扫描期间也会发生 DRAM 刷新。每次刷新发生时,你会看到一个像素重影,因为 DMA 暂停了,但电视扫描线仍在继续。最终,屏幕上会出现 5 条细细的双像素伪影带。你可以进行一些调整,比如精确计算源图像中哪些像素会被复制,然后将它们混合在一起以弥补双倍像素的问题,但即便如此,它仍然会或多或少地显现出来,具体取决于图像本身。还有更好的方法可以从世嘉主机中获取更多颜色,例如 Titans 512c 模式,它会在每条扫描线处更改调色板,而不是像传统 DMA 访问槽那样逐个更改。所有这些讨论的唯一目的就是揭开世嘉历史上最臭名昭著的部分之一的神秘面纱,并消除人们在谈论这些内容时产生的许多困惑。
在标准的世嘉 Genesis 主机上,你可以降低 BP 源图像的高度,从而获得更多用于计算的扫描线。或许,只写入屏幕的前三分之一和底部三分之二(对于标准的世嘉 Genesis 输出来说)的方法就足以提供足够的计算空间。


TOP

 18 12
发新话题
     
官方公众号及微博