2024年12月14日 星期六

老工程師的技術生活(三十六) --- Bar 台逆向工程系列(二) 硬體篇

一開始我還是先強烈聲明一下:此一系列文章,純粹就是系統玩家的興趣,

不會牽涉到任何商業活動,也不鼓勵相關任何商業侵權行為,一方面我也

曾經表達過:這個東西有其時代的眼淚,就算你現在認真的投入,也不有

任何商業市場機會(包括生產備料成本競爭力,市場通路等)。更何況這個東西

在法律上也可能牽涉賭博刑責,所以大家就以平常心簡單的從基礎單晶片課程

技術來切磋研究就好。在這些前提下,我們都很樂意歡迎加入討論。

現在我們就先回到硬體相關設計來做一個初步的探討研究。硬體設計一般

來說:除非有重大的缺失需要不得不修改,否則,變動更改的機會不多,

尤其是牽涉到韌體相關的硬體部分,那就更難了,所以雖然我們手上的韌體與

實際上的機器上所下載韌體機械碼有所不同,但在硬體相關部分,我個人

覺得應該絕大多數都是一樣相通的,所以我才先回到討論硬體部分。

關於硬體的參考設計圖,我也有提供雲端分享點:點我

大家可以先自行下載,以下的硬體討論是基於上述的參考設計圖為主。


上圖是我所整理的系統架構圖,就是很基本的單晶片基礎應用的形式。

就是一般 I/O 加上一些相關韌體概念,頂多就是賭博數學上機率控制概念而已。

現在看這些設計好像沒甚麼了不起的,但你別忘了:他的初步設計至少已經

超過三十年前了啊。可能有些讀者都還沒出生。所以還是存著一股致敬的心意吧。

其中很多零件在市面上都比較難取得了,因為可能就連原來設計生產的公司都

已經不復存在了啊。所以我才說:生產備料很辛苦的啦。

至於為什麼上圖中可以看出各個周邊的零件所對應的韌體控制地址?那是同時參考

設計圖與韌體內容所得的:


首先我們先來看: 8279 的部分,它就一般鍵盤與顯示功能的專用 IC,是傳統利用

並列匯流排方式來與單晶片溝通的。其中 8279_CS 是由之前級解碼電路得到 0xB000。

因為8279 的控制內容有分成兩大類:資料交換與控制命令,所以就是 0xB000/0xB001。

鍵盤輸入最主要的就是操作鍵盤(共 26 組) 及LED 七段顯示器部分(包括下方八組、中間

一組及上方兩組:所剩押注餘額及中獎獎金,而這兩組四位數可以再拆成四組)。

鍵盤部分:有系統初始四個按鈕,及系統設定的八個DIP Switch 及使用者操作的14組按鈕。

就是下圖所示的:



然後我們可以看到:電路板上的接頭標示為 J(P)4 ,還跟電路圖上一致,所以我才說

硬體電路上可以修改的機會不多啦。


另外關於七段顯示器是利用 8279 的 OutA 及 OutB 來分別控制兩位數的七段顯示器的

十位數與個位數。所以電路圖上才標示成 LA/LB...(十位數)及RA/RB...(個位數)兩部分。

至於是哪一組七段顯示器?就是由SL0/SL1...解碼出 DISP1/DISP2/DISP3...。因為之前

有國外的朋友有參與留言,所以我還是把電路圖上的DISP1 中文說明簡單的翻譯一下。

我們可以先回到韌體看一下相關的硬體初始化內容:


我手上機器反組譯的內容:基本上是大致一樣的。也是先Timer 設定及 8279 初始化。

而 8279 的初始化內容:兩者是一致的。

所以8279 兩者的使用方式是完全一樣的。大家可以參考上圖中程式碼後方的註解說明。

----

接下來我們再來看關於 AY-3-8910 的使用:它主要就是拿來做為音源撥放功能,

及其他LED 跑燈用的,而這部分共有 24 顆跑馬燈及下方六顆燈及中央一顆燈。

詳細定義可以參考最上圖說明。不過,這一部分的單晶片解碼位置我還是有點

搞不太清楚。依照 AY-3-8910 的使用說明書來看,還真的搞不太懂原始設計道理?


兩顆 AY-3-8910 地址是解到 0x9000,這部分是沒問題的。但上圖綠色標示部分,

我怎麼看都沒辦法理解到為什麼一顆是 0x9000 ,另一顆是 0x9002 呢?

如果有哪位讀者可以協助解釋的,也歡迎再底下留言解答,謝謝!萬分感恩~🙏

為什麼我會知道一顆是 0x9000 ,另一顆是 0x9002 呢?是從韌體看到的:

機器與手上文稿內容 比照圖

 而AY-3-8910 的設定使用方式,機器與手上資料,兩者也是一樣的:

這裡還要補充說明一下:在這部份我發現資料文檔中的那個D51 所反組譯的內容還是

有點錯誤,所以大家在使用上還是要留意一下,我特別直接附上 Binary 檔案對比說明:


因為 8910 的初始化設定是透過 Table 方式直接依序地填入8910 的 Registers 的。

這個Table 在反組譯上,可能會造成誤判,這本來就是反組譯工具的一大難處。

過去很多人也是利用這招來作一些程式碼防護措施的...順便補充說明一下。

---

另外就是關於單晶片 8031 本身的 Timer 設定與使用方式。(這部分也屬於硬體)


首先我發現機器上面所使用的震盪器與電路圖上的有所差異的:

電路圖上標示的是:10.6875MHz,而機器上的是:10.7386MHz 。我猜是:

這兩者的震盪頻率都是很少見的規格,所以可能就是在零件市場上找個

接近規格的零件湊合著用吧。不過,韌體程式裡也沒有因此修正:


而這邊我也順便給大家看一下,其實 Timer 1 的中斷服務程式真的超簡單的:

就是重新設定單晶片 8051 的 Timer1 Counter 及 Toggle P3.4 I/O pin 而已。



---

其實,我發現這些前後不一致的韌體內容,雖然在硬體上還是有很多共用性,

在許多記憶體的使用定義上,也都大部分都是相通的,譬如上圖有個 8051內部

記憶體位址:0x5BH 內容,就是拿來送給 8279 的中央七段顯示器內容的

暫存記憶體。不過,真的還是要特別再強調一次:經由反組譯工具所組譯的

程式碼內容,可能還是會有一些誤解的結果。譬如:我們程式一開始的在那個

Timer Initialize 之前的那個先 Disable Interrupt:

反組譯是:lcall X1875 那段:(手上原始碼是 lcall 1089H):


這個是很簡單的程式碼,就只有三行指令,但反組譯工具的結果,

真的差很多,如果我們也把原始的 Binary 檔打開比對的話,其實是沒有錯的。

但反組譯工具的結果就是錯的!這一點真的要留意一下,還是要多方考證,

或是多參考幾組不同的反組譯工具的結果。

最後就是一些不是很可以理解的專用名詞:有知道的讀者也可以在底下留言

幫忙解釋一下:就是直接接到 8051 I/O 接腳上的名詞:

入表(P11_Output):?

出表(P12_Output):?

SSR(P13_Output):Relay for ?

入表檢查(P14_Input):?是要檢查甚麼?

出表檢查(P15_Input):?是要檢查甚麼?

HOPER SW(P16_Input):?這應該是投幣機的感應訊號吧?

洗分 SW(P17_Input):?是要檢查甚麼?

---------------------

關於這個東西,只要硬體的相關資料都是正確的話,其實你可以把整台 Bar 台

當作一台單晶片學習開發版的啦。韌體都是可以重新撰寫的,譬如利用我上一篇

ROM 模擬器(ROMTER) 來開發相關應用韌體。反正這台硬體平台還把原來的

ROM Size 改成 27C512: 整整有 64KBytes 可以讓你盡情發揮。我甚至還想

要不要改成高階的 C 語言來重寫。😁😂😃😄😅

---

不過,這都是一個前提下:有錢、又有閒啊

我一直強調:搞技術開發,你有興趣,誰也擋不了你,唯一能擋住你的因素,

就是現實的生活壓力:時間與金錢

就算是原始碼是 8051 的組合語言又怎樣?一星期看不懂。給你一個月,一個月

不夠,那給你半年、一年的...行不行?如果你只要喝水吸空氣可以過日子,

家裡有人幫你負擔水電瓦斯費(或房屋租金,乃至於各種貸款等)。專心搞技術,

看程式碼,學會看懂程式並予以改寫,當然都不是問題啊。只要有興趣:

還可以跟你打包票:不用花錢上課,買書研習,只要設定這個目標,保證你

不用多久就可以無師自通了,改天還可以自稱大師的開課收徒弟呢!

所以啦,有時候真的不用太羨慕我們這些人,我們以前也是如此過來的,

我們還懂得去找個可以領薪水上班的相關技術工作,還不至於為了這麼一點

興趣給自己或家裡給餓到了(或有所微詞或抱怨...😔😞)。

只是人生真的不是只有技術或興趣而已。你想學甚麼都不重要,年輕時也

不用擔心顧慮太多,但等你步入中年、面臨長江後浪推前浪時,很多

原本簡單的事情就變得複雜了啊。原本單純的技術開發,看在我們這些

資深工程師的眼裡,又成了另一種人生的面相。最近無意間看到電影

"黃飛鴻"(第一集)中的那位讓梁寬拜倒的關振東師傅,一生就只求武功

蓋世(技術),想打遍天下高手在武界闖出名號,片尾時候,當沙河幫鼓譟

嚴師傅秀兩手時,在旁的梁寬受不了那個帶有嘲諷的鼓譟歡呼聲而驚醒良知

是啊~我們學好一身技術好手藝之後,以為大家都鼓譟的大聲稱你:老師、

大師或師傅時,你是不是也迷失了一些你原先應有的人生態度呢?

真的就只有一身過人的武藝或技術才能服人嗎?為自己贏得人生亮點嗎?

這時候,你有沒有想到:其實在其他有些人眼裡(包括另一位德高望重的高手

或是老闆、企業家裡),他們可以也是用一種表面尊重,私底下卻是一樣的

鼓譟嘲諷的心態看待你啊?當然你也可以不用管這些世俗的眼光或評論,

但現實的還是你自己家人的感受...

下次要花錢出手報名技術課程時,真的要好好想想:你的目標或學習的

KPI 值是在哪吧。這是我自己以前年輕不懂時,也會常犯的錯誤觀念!

分享給大家。

至於這一系列的後續,有空整理後,會不定時的再推出...

"不定時" ? 因為肯定沒錢,但有沒有閒?再說吧。😌😊😋

-----------------------------

整理一下之前的相關文章:

1.一份神秘禮物的開箱文(10/15/2015)

2.一份神秘禮物的開箱文 (補續篇)--- 談早年電玩機(01/01/2016)

3.老工程師的技術生活(三十三) --- 一篇文章的後續(Bar 台簡易解析)(09/01/2024)

4.老工程師的技術生活(三十六) --- Bar 台逆向工程系列(一)

8 則留言:

  1. 沒想到老闆對玩娃娃及都來興趣了, 恭喜閒跟錢都具備

    回覆刪除
    回覆
    1. 澄清一下:
      1. 現在的我不是老闆,我也是領薪水的打工仔而已。
      2. 所以沒有很閒,領薪水該做的事,還是得做啊。
      3. 錢(薪水)也不多~甚至薪水還"遠遠"比不上兒子的薪水,
      所以在家裡有空時,都是乖乖地做自己喜歡想做的東西與事。
      4. 如果對電子遊戲機(譬如娃娃機)有興趣的話,真的可以考慮
      去找個類似的企業上班(譬如中部的飛X力,因為去參觀過一次)。
      但現在年紀大了,找個簡單一點事做就可以了。
      甚麼是簡單一點的事?就是不用學太多、太複雜而自己
      不熟的技術的產品。譬如單晶片韌體或USB 的相關系統
      應用程式(裝置端與PC端等),這些東西就夠我餬口了。
      5. 很多很好玩的東西,並不代表他就是一個好產品或好生意,
      純粹玩玩寫個部落格文章,大家都輕鬆自在一點,也可以幫
      自己的技術人生留下一些雪泥鴻爪罷了。
      大家就當茶餘飯後休閒小品看看就好。

      還是謝謝你的留言。

      刪除
  2. Regarding the address decoding of the two AY-3-8910 chips, I believe there are some mistakes on the schematics where pin A8 the left-hand side 8910 chip should be NC or pulled up. Right-hand side !A9 being grounded is ok. So when A1 = 0 (0x9000), left chip is selected and when A1 = 1 (0x9002), right side chip is selected.

    回覆刪除
    回覆
    1. Sorry, 用中打太慢...

      刪除
    2. 感謝你的提醒與留言。
      我直接去檢查我手上那台 Bar 台的電路。
      的確左邊那個 8910 (U16) 的 A8 (pin25) 是直接接 5V ,
      而非如文中所示的接在 GND 上。👌👍👍😊😋
      這樣子就完全符合韌體的定義了。
      ----
      所以其他讀者如果也有留意到這則留言的話,
      也請麻煩自行修正更新一下。
      還是非常謝謝熱心的讀者的提點。Thank you !!

      刪除
  3. may can convert raw notes to midi but required to script python converter. im gonna to do myself

    回覆刪除
    回覆
    1. demo but only for cye and based machine with hex 63 loop hex 62 stop etc. https://youtu.be/0fE-pmBAKRA

      刪除
    2. Thank you very much for your reply, but I'm sorry, I don't know Python, let alone GPT or Deepseek, so I can't understand these contents at all. Maybe if time permits, I can give it a try.

      刪除