FC 遊戲機的工作原理是怎樣的?

小時候那種插卡玩的遊戲機的工作原理 ?


扼要的寫一下顯示部分的技術原理,尤其是設計緣由和精妙之處,盡量使外行人也能看懂:

(一開始是預備知識,我至少假設讀者理解二進位,二進位位bit,位元組byte,十六進位表示等)
顯示的基本單元是像素(Pixel),我們看到的幾乎所有顯示器顯示的東西都是許多像素組成的,可以把它們想像成一個個小方格,整齊的排列在顯示器上:

比如這幅Lena局部經過放大後,可以看出每個像素就是顯示一個色彩的方塊。當今我們常見的顯示調色有256色,或者真彩(True color)24位色。 所謂256色就是一個位元組存儲256種顏色,而真彩色是三個通道從暗到明各256色,然後三原色組合在一起。我們需要3x8個二進位位來表示。三原色共3*8 bit

FC/NES的主要硬體包括一顆MOS Technology 6502晶元,以及被稱作PPU (Picture Processing Unit) 的圖形處理晶元RP2C02/RP2C07。PPU有2KB的外部RAM來存儲顯示圖像和其它輔助信息,256位元組的內部DRAM存儲sprite*,32位元組的內部SRAM存儲調色板*。

* Sprite,常譯作精靈。。。 指包含於場景中的二維圖像或動畫,NES里基本就是會動的各種角色了,比如Super Mario里瑪里奧自己,各種怪什麼的。
* 調色板 Palette , 通俗的講就是顏色編碼表。NES的Palette見下圖(中文維基上說48種彩色+5種灰階是錯的。。。只有4種灰階,整個右邊三列的色彩RGB表示都是 [0,0,0],編碼20和30的都是 [255,255,255]):


按照今天的顯示技術來看,FC的彩色技術簡直就是奇技淫巧大集合。只有2KB的顯存和2KB的主存,基本完全無可能裝下彩色圖像。

(NES PPU)

做一個簡單計算:

解析度256x240 = 61440,即畫面上有這麼多個像素點。(忽略NTSC系統損失的16行,PAL系統上是256x240)

我們如果只顯示黑白,即每個像素非黑即白,那麼單像素一個bit就可以了,這麼大的解析度下,一共需要1 * 61440 / 8 / 1024 = 7.5KB,要是直接這麼干黑白點都裝不下主機顯存,當時好點的電腦勉強差不多。
假設我們用現在非常普通的256色,即8個二進位位,一個位元組存儲,整個畫面61440 / 1024 = 60KB,這在FC時代是任何普通機器都不能直接做到的。

為了顯示彩色,當時的不同機器有各種技術手段,可以說八仙過海各顯神通。FC用的第一種手段叫做Color Cell,具體來說:

  1. 將整個圖像分割成許多8x8的小cell (或者叫tile)
  2. 每個cell內至多有4種顏色

這樣,每個像素只用2bit來存儲色彩,然後對一共 32x30 = 960 個cell再分配色彩編碼,指示有哪幾種顏色。


舉個栗子,我們熟悉的惡魔城 (Castlevania, 1986) 開場:(圖片來自[dustmop.io blog])

圖中最小的格子(所有明暗線分割出的)即一個cell或tile,四個tile組成一個block(僅亮線分割出的)。圖中一共用了10種顏色。你絕對找不出用了超過4種顏色的cell。

再看一個我頂我頂:

編碼後的cell表將存儲在顯存所謂name table區域中,剛才的惡魔城開場的區域編碼成形如下圖所示:

FC第二個高明的地方在於領先時代的滾屏技術,由於PPU內部有兩個(鏡像後是四個)name table來存儲cell表信息,我們可以一直預先存儲著超過顯示部分的內容,在玩家或者程序觸發滾屏操作後,通過向兩個寄存器PPUSCROLL和PPUCTRL寫相關信息,即可移動遊戲鏡頭。


在FC之前的主機,滾屏操作幾乎都要覆寫整塊屏幕,代價高昂。FC的出現同時使得動作、射擊型遊戲得到極大發展。

最後一個部分是遊戲中運動的Sprite,存儲於顯卡的特定內置存儲區域,通常單個大小為8x8或8x16,我們看到的主角們大都是多個Sprite拼到一起的,比如Mario實際上是4個Sprite拼出來的,只是在程序中保證不會散架。


Sprite的顯示是覆蓋背景的,無論背景如何設置,在PPU進行Sprite探測後都會將對應位設置成Sprite的色彩。


最後,btw,基本上所有的FC/NES開發資料都能在NES dev和其附屬wiki上找到,只是沒有相關專業知識可能比較難啃。
國人的《任天堂遊戲編程探秘》一書總的來說還是比較詳細的,然而很多關鍵之處卻語焉不詳,且花了很多篇幅教怎麼寫代碼。對於外行來說還好,對於專業人士就基本無用了。更重要的是,這本書幾乎沒有講任何Rationale的東西,對於真正的學習是災難性的。


https://zh.wikipedia.org/wiki/FC%E6%B8%B8%E6%88%8F%E6%9C%BA

FC使用一顆理光製造的8位的2A03 NMOS處理器(基於6502中央處理器,但是缺乏BCD模式)[1],PAL制式機型運行頻率為1.773447MHz,NTSC制式機型運行頻率為1.7897725MHz,主內存和顯示內存為2KB。
FC使用理光開發的圖像控制器(PPU),有 2KB 的視頻內存,調色盤可顯示 48 色及 5 個灰階。一個畫面可顯示 64 個角色(sprites) ,角色格式為 8x8 或 8x16 個像素,一條掃描線最多顯示 8 個角色,雖然可以超過此限制,但是會造成角色閃爍。背景僅能顯示一個捲軸,畫面解析度為 256x240 ,但因為 NTSC 系統的限制,不能顯示頂部及底部的 8 條掃描線,所以解析度剩下 256x224。
從體系結構上來說,FC有一個偽聲音處理器(pseudo-Audiom Processing Unit,pAPU),在實際硬體中,這個處理器是集成在2A03 NMOS處理器中的[2]。pAPU內置了2個幾乎一樣(nearly-identical)的矩形波通道,1個三角波通道,1個雜訊通道和1個音頻採樣回放通道(DCM,增量調製方式)[2]。其中3個模擬聲道用於演奏樂音,1個雜音聲道表現特殊聲效(爆炸聲,槍炮聲等),音頻採樣回放通道則可以用來表現連續的背景音。
FC主機上有一個複位開關、1個電源開關、1個遊戲卡插槽、2個帶有十字方向鍵的2鍵手柄(遊戲控制器),主手柄上有「選擇」和「開始」按鈕。主機背面有電源介面、RF射頻輸出介面、視頻圖像輸出介面、音頻輸出介面。前面還有一個擴展埠,用於連接光線槍、附加連發手柄等外部設備。
FC遊戲通常以只讀內存形式存放於可插在主機插槽上的遊戲卡中,容量有LA系列24K,LB系列40K,LC系列48K,LD系列64K,LE系列80K,LF系列128K,LG系列160K,LH系列256K,特卡系列和多合一卡帶等。還有一些帶有電池用來保存遊戲進度。
1986年2月21日,任天堂還推出了一款FC磁碟機,可以在FC主機上通過轉換器使用專用的軟碟機來讀寫遊戲,軟盤容量為112KB。

----------------------------------------------------更新--------------------------------------------------------------------------
已經有好幾個答案比我的深刻多了,我也就是上班忙裡偷閒隨手從餵雞百科裡抄了一段,沒想到也能騙到贊,真感覺有些愧對大家,大家無視我的答案吧。勿噴,評論區有不友善的評論,已舉報。


http://nesdev.com/NESDoc.pdf
這個文檔里基本把原理都寫出來了。核心是CPU(Central Processing Unit)和PPU(Picture
Processing Unit),PPU的設計很精妙。

Github上有各種版本的NES模擬器源碼,通過這些代碼你可以更清晰的理解NES的運行過程:

  • go + OpenGL視頻 + PortAudio音頻 :fogleman/nes · GitHub
  • javascript + dynamicaudio音頻:bfirsh/jsnes · GitHub
  • Rust : pcwalton/sprocketnes · GitHub
  • C++ :Cephas1982/NES · GitHub (這個還沒做完)

FC 這個我還算比較熟悉,我自己寫過一個 FC 的模擬器,名為 ffnes,我放在 github 上了,有興趣的可以去看看:
rockcarry/ffnes · GitHub


NES Graphics – Part 1
http://www.dustmop.io/blog/2015/04/28/nes-graphics-part-1/
NES Graphics – Part 2
http://www.dustmop.io/blog/2015/06/08/nes-graphics-part-2/?utm_campaign=Contact+SNS+For+More+Referrerutm_medium=twitterutm_source=snsanalytics
NES Graphics – Part 3
http://www.dustmop.io/blog/2015/12/18/nes-graphics-part-3/


你不如寫個FC連接電腦網路成為控制啞巴終端軟體實際


與電腦的區別。

沒有外存(硬碟,光碟機等),只有內存,遊戲卡就是內存,只不過是只讀的。同期的電腦其實也一樣是插遊戲卡的,外存只有磁帶機。磁碟還沒普及呢。

有專門的2D顯卡。家用電腦到3D時代以前都可以認為是無顯卡的,2D顯卡專業渲染用的多。


家用遊戲機也是計算機的一種,要理解FC,首先要理解計算機的體系結構。

按照馮·諾依曼的定義,計算機必須有存儲器、控制器、運算器,用以完成算術運算和邏輯運算;必須有輸入和輸出設備,用於進行人機通信。這種模塊劃分是抽象的概念的
而日常使用的電腦主要由CPU、顯卡、音效卡、內存、硬碟、主板、滑鼠、音響等配件組成。
值得注意的是,後者與前者並不是簡單的對應關係,雖然說CPU主要承擔了控制器與運算器的工作,但是CPU中同樣也有存儲數據的緩存。同樣,哪怕是滑鼠這樣的輸入設備,其也有內置的晶元用以處理電信號。也就是說,馮·諾伊曼結構的各個模塊劃分是邏輯上的理想化結果,事實上這些模塊在很多地方都是互相交融層層嵌套的,計算機的每個配件都可以視為某種更低層次的「計算機」。

有了對計算機體系的基本概念之後,再看看看FC的具體參數吧。
FC使用基於MOS Technology 6502核心,由Ricoh生產的8位微處理器。
其自帶的RAM大小為2KB,遊戲卡帶提供的RAM大小從8KB(Galaxian,小蜜蜂)到1MB(Metal Slader Glory)之間浮動。
圖像處理器(Picture Processing Unit)由Ricoh開發,顯存為2MB。調色板支持48色,6度灰階。解析度為256 × 240。
聲音方面,支持5個聲道,其中2個為方波,1個三角波,1個雜訊發生器(碰撞聲等),最後一個負責播放低音質樣本。
在某些卡帶中包含擴展的晶元,可以增加聲道或是增強數據處理能力。比如Konami VRC6,Konami VRC7,Sunsoft 5B,Namco 163以及任天堂自家的Nintendo FDS wave generator,Nintendo Memory Management Controller 5。

而FC還有各式各樣的配件,比如手柄、光槍、Family BASIC(以及配套的鍵盤)、Famicom 3D System、Famicom Modem、FC磁碟機。
值得一提的是FC磁碟機,可以使FC支持軟盤這種媒介,同時擁有RAM與額外的音頻晶元。軟盤除了存儲遊戲內容之外,還可以保存遊戲進度,這在當時是史無前例的。軟盤不僅價格更低,而且支持多次擦寫,玩家在玩膩了某款遊戲後可以去經銷商那裡對軟盤寫入其他遊戲。

通過上面的介紹可以看到,FC的本體包含了基本的處理器、控制器。手柄與光槍是FC的輸入部分。卡帶與軟盤扮演的則是存儲器的角色。至於輸出模塊,自然就是家裡的電視機了(不同型號的FC的視頻輸出格式不太一樣,原始的HVC-001隻輸出RF信號,美版與歐版FC則新增了RCA信號)。但正如本文開頭所說,即便是用來存儲遊戲數據的卡帶與軟盤,其中也會包含一些輔助性的功能晶元用以擴展主機性能,增強遊戲體驗。

(部分資料翻譯自英文維基)


學習了,如果我有這技術,我也想自己製作自己喜歡的遊戲


mark收藏下


推薦閱讀:

手機里刪除的照片都去哪了?
如何畫出優雅的pcb?
如何用電線傳輸高頻信號?
自我修復的晶元的原理是什麼?

TAG:遊戲 | 電子 | 紅白機FamilyComputer,FC | 懷舊遊戲 | 懷舊經典遊戲 |