第二十章 破解6502密碼(下)
在完成了基礎(chǔ)步驟之后,王秋陽(yáng)所編撰的6502同顯最大發(fā)色數(shù)的謎底,也水到渠成。和同色號(hào)發(fā)色一樣,漸近色號(hào)也能夠通過(guò)相同的原理完成同屏發(fā)色。
比如死機(jī)的花屏顏色,現(xiàn)在已經(jīng)排除了黑階,灰階兩種色號(hào)。如果再人為的制造花屏,電腦會(huì)自動(dòng)尋找剩下的顏色,比如藍(lán)屏,紅屏都很正常。
接下來(lái),就是使用漸近色號(hào),取代原本電腦默認(rèn)的花屏色號(hào)。比如用02色號(hào)深藍(lán)取代12號(hào)湛藍(lán),又比如用07號(hào)深紅取代05號(hào)正紅。
只要在重新Hack游戲的時(shí)候,把五十二種色號(hào)全部排選一遍,最后在理論上就能夠使用任何一個(gè)色號(hào)。這就是6502同顯六十四色號(hào)的原理。
這套匯編理論,也是二十一世紀(jì)的百度達(dá)人“周哥”完成的。王秋陽(yáng)曾經(jīng)用它Hack過(guò)好幾款游戲,記憶尤深,如今也能把它很明晰的描述了出來(lái)。
首先,
ch_join:;色號(hào)(02)進(jìn)棧
inc p_stack
bne ch_join02
inc p_stack
ch_join02:
ldy #$00
sta (p_stack),y
rts
然后,留存進(jìn)棧數(shù)據(jù),到達(dá)另一個(gè)棧,也就是臨時(shí)貯存器’
get_stack03:;色號(hào)出棧到(02’)
ldy #$00
lda (p_stack),y
ldy p_stack
dey
sty p_stack
cpy #$ff
bne get_stack
dec p_stack
rts
接下來(lái),新色號(hào)再次指定入棧條件
Inftosuf04:
cmp #12;“’“
bne inftosuf #12’
jsr ch_join ;遇“’”時(shí)直接入?!?p> jmp inftosuf02 ;返回02循環(huán)
最后,得出棧頂算符優(yōu)先級(jí)別,在(top_lev)中
ldy #$00
sty top_lev
lda (p_stack),y
cmp #12;“(“
beq stack_lev06 ;把棧中的“(”設(shè)為0級(jí)
cmp #$00
beq stack_lev06
ldx #$ff
如此一來(lái),電腦原本顯示藍(lán)屏的色號(hào),就由12替換成02,都是藍(lán)屏。
湛藍(lán)的色號(hào)是12。
假設(shè)X等于3
lda $2002, x;
從內(nèi)存地址($2002+3)處載入數(shù)據(jù),即從$2005處;
假設(shè)Y等于2
lda $2000, y;
從內(nèi)存地址$2002處載入數(shù)據(jù)
其中:load和store指令可以采用一個(gè)標(biāo)簽作為基地址。
通過(guò)代碼:
somelabel:.incbin “our.pal“;顯示一個(gè)pal文件,
標(biāo)簽即為它的首地址lda somelabel, x;
從標(biāo)簽表示的地址+X處向12載入一個(gè)值y.
于是色號(hào)02被鎖死,但貢獻(xiàn)出12這個(gè)色號(hào)可以任意使用。
再重復(fù)一遍這個(gè)步驟,把12色號(hào)鎖死,用22色號(hào)代替。這個(gè)時(shí)候02色號(hào)將獲得釋放,它和22色號(hào)將能夠達(dá)到同顯,于是發(fā)色數(shù)又增加了一款!
在理論上,6502的五十二款色號(hào),將有一個(gè)將永遠(yuǎn)無(wú)法使用。而實(shí)際上,在排選的過(guò)程中,可以通過(guò)釋放灰階00和10兩個(gè)色號(hào),將被鎖死的色號(hào)由兩個(gè)相同灰階色號(hào)中的30取替,就像最開(kāi)始釋放02的時(shí)候一樣。
這個(gè)時(shí)候,再進(jìn)行第二遍排選。
6502的黑色色號(hào)有十一款之多,分別是0D至3D,0E至3E,1F至3F。由此可以相繼貢獻(xiàn)出十款被鎖死,從而取替出十種可使用的彩色色號(hào)。
最后6502鎖定了一款灰階和十款黑色,單片機(jī)除了顯示最初不占用內(nèi)存,也就是肉眼判定為黑色(0D),白色(灰階20)兩款色號(hào)之外,還能使用剩余彩色中的任意二十二款色號(hào)。
這就是FC現(xiàn)在能夠達(dá)到的最頂尖的機(jī)能。
“好吧,我對(duì)此無(wú)話可說(shuō)?!睓M井俊平放下了日志本,感覺(jué)好像看了一場(chǎng)大片一樣。他整個(gè)人都有些虛脫,但又有一種難言的滿足感。
“二十四色!能夠真正運(yùn)用于游戲中的,可以達(dá)到同顯二十四色?黑科技,黑科技,貨真價(jià)實(shí)的Hack!”
“這是真的,數(shù)據(jù)是不會(huì)騙人的,我要見(jiàn)見(jiàn)這個(gè)人。如果他能夠改良一款游戲,我和上村先生將有理由說(shuō)服社長(zhǎng),把目光重新轉(zhuǎn)移到主機(jī)之上!”
橫井俊平坐了起來(lái),拿起了電話,撥通了冬野美紀(jì)的公寓:“喂,美紀(jì)醬?是我,橫井叔叔。我,想見(jiàn)見(jiàn)這位寫(xiě)匯編的人?!?p> 冬野美紀(jì)也并不意外:“您知道不是我寫(xiě)的?”
橫井俊平笑了笑:“你別生氣,如果是,橫井叔叔倒會(huì)驚訝了。告訴我,這個(gè)人在哪兒?”
冬野美紀(jì)說(shuō)道:“您昨天還請(qǐng)他吃過(guò)飯呢。”
“什么?真的是他!”
……
九月九日,星期三。
“您好橫井先生,沒(méi)有想到又能有幸受到您的邀請(qǐng)?!?p> 這天放學(xué),冬野美紀(jì)再次將王秋陽(yáng)約了出來(lái)。不過(guò)這一回并沒(méi)有帶上胖子和夏雨詩(shī),因?yàn)檫@是比較正式的會(huì)面,發(fā)出邀請(qǐng)的正是橫井俊平。
王秋陽(yáng)的劇本很成功。不光是匯編寫(xiě)得好,一步步將橫井俊平勾搭了出來(lái)。同時(shí)他也把握住了身邊的機(jī)會(huì),以冬野美紀(jì)同學(xué)的身份,蹭過(guò)一頓飯。
果然,兩人見(jiàn)面沒(méi)有那么生分的感覺(jué),橫井俊平也不再為王秋陽(yáng)只是一個(gè)普通大學(xué)生感到不必要的震撼了。他掏出了那本日志,微笑著放在了王秋陽(yáng)的手上。
“年輕人,你真的把我吸引住了。沒(méi)有想到中國(guó)的留學(xué)生中,竟然還有這樣的人物,只是你的手段有些不夠漂亮。其實(shí)你直接向任天堂投稿,我也會(huì)采納你的提案?!?p> 王秋陽(yáng)實(shí)話實(shí)說(shuō):“橫井先生請(qǐng)見(jiàn)諒,因?yàn)槲业降资峭鈬?guó)人,如果突然涉及到FC的匯編,恐怕會(huì)引起不必要的麻煩。所以才會(huì)出此下策?!?p> 橫井俊平聽(tīng)了,也明白了王秋陽(yáng)的意思:“你說(shuō)得也有道理。美紀(jì)啊,你真是認(rèn)識(shí)了一位了不起的年輕人呢!”
冬野美紀(jì)的臉色又是微微發(fā)紅,不過(guò)目光中頗有些驕傲的神采。
橫井俊平說(shuō)道:“現(xiàn)在剛剛放課,想來(lái)你們也餓了吧?我們先去吃飯,然后橫井叔叔想和王君好好討論一下FC的發(fā)展!王君,你想吃點(diǎn)什么?”
王秋陽(yáng)撓了撓頭,說(shuō)道:“老是蹭飯,怪讓人不好意思的。橫井先生,如果您不介意,我想吃那個(gè)行嗎?”
現(xiàn)在亰都還在“黃金周”,大小街道比平時(shí)更要熱鬧許多。二人順著王秋陽(yáng)的手指望去,見(jiàn)街邊有一個(gè)手推式的面包鋪。
“密瓜包?”橫井俊平有些哭笑不得。中國(guó)的男孩喜歡吃甜食嗎?
王秋陽(yáng)也有些不好意思,只說(shuō)道:“在中國(guó)的時(shí)候就特別想嘗一嘗日夲的密瓜包了,可惜一直沒(méi)有機(jī)會(huì)。如今來(lái)了這里,又囊中羞澀……”
“行,就吃它吧。你要幾個(gè)?”
“六個(gè)!”