第二十章 破解6502密碼(下)
在完成了基礎(chǔ)步驟之后,王秋陽所編撰的6502同顯最大發(fā)色數(shù)的謎底,也水到渠成。和同色號(hào)發(fā)色一樣,漸近色號(hào)也能夠通過相同的原理完成同屏發(fā)色。
比如死機(jī)的花屏顏色,現(xiàn)在已經(jīng)排除了黑階,灰階兩種色號(hào)。如果再人為的制造花屏,電腦會(huì)自動(dòng)尋找剩下的顏色,比如藍(lán)屏,紅屏都很正常。
接下來,就是使用漸近色號(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á)人“周哥”完成的。王秋陽曾經(jīng)用它Hack過好幾款游戲,記憶尤深,如今也能把它很明晰的描述了出來。
首先,
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
接下來,新色號(hào)再次指定入棧條件
Inftosuf04:
cmp #12;“’“
bne inftosuf #12’
jsr ch_join ;遇“’”時(shí)直接入棧’
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á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)簽作為基地址。
通過代碼:
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)無法使用。而實(shí)際上,在排選的過程中,可以通過釋放灰階00和10兩個(gè)色號(hào),將被鎖死的色號(hào)由兩個(gè)相同灰階色號(hào)中的30取替,就像最開始釋放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ì)此無話可說?!睓M井俊平放下了日志本,感覺好像看了一場(chǎng)大片一樣。他整個(gè)人都有些虛脫,但又有一種難言的滿足感。
“二十四色!能夠真正運(yùn)用于游戲中的,可以達(dá)到同顯二十四色?黑科技,黑科技,貨真價(jià)實(shí)的Hack!”
“這是真的,數(shù)據(jù)是不會(huì)騙人的,我要見見這個(gè)人。如果他能夠改良一款游戲,我和上村先生將有理由說服社長(zhǎng),把目光重新轉(zhuǎn)移到主機(jī)之上!”
橫井俊平坐了起來,拿起了電話,撥通了冬野美紀(jì)的公寓:“喂,美紀(jì)醬?是我,橫井叔叔。我,想見見這位寫匯編的人?!?p> 冬野美紀(jì)也并不意外:“您知道不是我寫的?”
橫井俊平笑了笑:“你別生氣,如果是,橫井叔叔倒會(huì)驚訝了。告訴我,這個(gè)人在哪兒?”
冬野美紀(jì)說道:“您昨天還請(qǐng)他吃過飯呢?!?p> “什么?真的是他!”
……
九月九日,星期三。
“您好橫井先生,沒有想到又能有幸受到您的邀請(qǐng)?!?p> 這天放學(xué),冬野美紀(jì)再次將王秋陽約了出來。不過這一回并沒有帶上胖子和夏雨詩,因?yàn)檫@是比較正式的會(huì)面,發(fā)出邀請(qǐng)的正是橫井俊平。
王秋陽的劇本很成功。不光是匯編寫得好,一步步將橫井俊平勾搭了出來。同時(shí)他也把握住了身邊的機(jī)會(huì),以冬野美紀(jì)同學(xué)的身份,蹭過一頓飯。
果然,兩人見面沒有那么生分的感覺,橫井俊平也不再為王秋陽只是一個(gè)普通大學(xué)生感到不必要的震撼了。他掏出了那本日志,微笑著放在了王秋陽的手上。
“年輕人,你真的把我吸引住了。沒有想到中國(guó)的留學(xué)生中,竟然還有這樣的人物,只是你的手段有些不夠漂亮。其實(shí)你直接向任天堂投稿,我也會(huì)采納你的提案。”
王秋陽實(shí)話實(shí)說:“橫井先生請(qǐng)見諒,因?yàn)槲业降资峭鈬?guó)人,如果突然涉及到FC的匯編,恐怕會(huì)引起不必要的麻煩。所以才會(huì)出此下策?!?p> 橫井俊平聽了,也明白了王秋陽的意思:“你說得也有道理。美紀(jì)啊,你真是認(rèn)識(shí)了一位了不起的年輕人呢!”
冬野美紀(jì)的臉色又是微微發(fā)紅,不過目光中頗有些驕傲的神采。
橫井俊平說道:“現(xiàn)在剛剛放課,想來你們也餓了吧?我們先去吃飯,然后橫井叔叔想和王君好好討論一下FC的發(fā)展!王君,你想吃點(diǎn)什么?”
王秋陽撓了撓頭,說道:“老是蹭飯,怪讓人不好意思的。橫井先生,如果您不介意,我想吃那個(gè)行嗎?”
現(xiàn)在亰都還在“黃金周”,大小街道比平時(shí)更要熱鬧許多。二人順著王秋陽的手指望去,見街邊有一個(gè)手推式的面包鋪。
“密瓜包?”橫井俊平有些哭笑不得。中國(guó)的男孩喜歡吃甜食嗎?
王秋陽也有些不好意思,只說道:“在中國(guó)的時(shí)候就特別想嘗一嘗日夲的密瓜包了,可惜一直沒有機(jī)會(huì)。如今來了這里,又囊中羞澀……”
“行,就吃它吧。你要幾個(gè)?”
“六個(gè)!”