<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-5462403775530306599</id><updated>2011-10-05T18:54:21.415-07:00</updated><category term='網際網路'/><category term='mingw'/><category term='Ubuntu'/><category term='10.10'/><category term='mame'/><category term='emulator'/><category term='Linux'/><category term='programming'/><title type='text'>程式設計師手札</title><subtitle type='html'>紀錄身為程式設計師的工作，以及生活的點點滴滴</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://shunyuan-chou.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5462403775530306599/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://shunyuan-chou.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>shunyuan</name><uri>http://www.blogger.com/profile/01707982560051207896</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>14</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-5462403775530306599.post-4025158104218788268</id><published>2011-10-05T18:54:00.000-07:00</published><updated>2011-10-05T18:54:21.463-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='網際網路'/><title type='text'>可惡的 LiveHealthClub 垃圾郵件</title><content type='html'>今天我收到一位朋友一封來自 LiveHealthClub 的邀請，點了一下後，在沒有通知我及取得我的許可下，存取我的聯絡人，然後從 LiveHealCulb 以我的名義寄邀請給我所有的朋友，馬上所有我 gmail 的朋友都收到邀請了。&lt;br /&gt;&lt;br /&gt;結果有好幾位朋友，馬上寫 e-mail 來問我，到底我的邀請（其實不是我的邀請），是什麼性質的網站？&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-qN05oAKwBVo/To0IJGHVqUI/AAAAAAAACTY/-SLTz2oPj9o/s1600/spam_email.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="288" src="http://3.bp.blogspot.com/-qN05oAKwBVo/To0IJGHVqUI/AAAAAAAACTY/-SLTz2oPj9o/s640/spam_email.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;這個垃圾郵件，最可惡的地方，是不管你點&lt;b&gt;&lt;span style="font-size: large;"&gt; YES&lt;/span&gt;&lt;/b&gt; 或是&lt;span style="font-size: large;"&gt;&lt;b&gt; NO&lt;/b&gt;&lt;/span&gt;，都會在不通知你的情況下，寄信給你的所有的朋友。&lt;br /&gt;&lt;br /&gt;到目前為止，gmail 尚未把從 LiveHealthClub 所寄出的信，當成垃圾郵件過濾掉，所以你如果收到類似的信，千萬不要點上面的按鈕，幫忙回報為垃圾郵件，然後刪除掉。&lt;br /&gt;&lt;br /&gt;現在想要靠網際網路賺錢的人，真的是想錢想瘋了，依我的標準，這封垃圾信，算是含有木馬的電子郵件了。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5462403775530306599-4025158104218788268?l=shunyuan-chou.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shunyuan-chou.blogspot.com/feeds/4025158104218788268/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://shunyuan-chou.blogspot.com/2011/10/livehealthclub.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5462403775530306599/posts/default/4025158104218788268'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5462403775530306599/posts/default/4025158104218788268'/><link rel='alternate' type='text/html' href='http://shunyuan-chou.blogspot.com/2011/10/livehealthclub.html' title='可惡的 LiveHealthClub 垃圾郵件'/><author><name>shunyuan</name><uri>http://www.blogger.com/profile/01707982560051207896</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-qN05oAKwBVo/To0IJGHVqUI/AAAAAAAACTY/-SLTz2oPj9o/s72-c/spam_email.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5462403775530306599.post-1969653061061482222</id><published>2011-06-10T13:55:00.000-07:00</published><updated>2011-06-10T13:55:54.686-07:00</updated><title type='text'>新北市新建的捷運路線，未來的遠景可期，施工小細節沒注意，卻讓新北市亂糟糟</title><content type='html'>新北市現在同時有很多條捷運路線正在動工，&lt;a href="http://www.dorts.gov.tw/np.asp?ctNode=15458&amp;amp;mp=115001"&gt;施工中的捷運路線&lt;/a&gt;，未來會有更多的捷運線動工，&lt;a href="http://www.dorts.gov.tw/np.asp?ctNode=15490&amp;amp;mp=115001"&gt;計畫中的捷運三環三線&lt;/a&gt;&lt;span id="goog_1279949153"&gt;&lt;/span&gt;&lt;span id="goog_1279949154"&gt;&lt;/span&gt;&lt;a href="http://www.blogger.com/"&gt;&lt;/a&gt;。&lt;br /&gt;&lt;br /&gt;因為新捷運線會帶來人潮及錢潮，在動工的捷運線附近，常常可以見到有新的高樓大廈也在動工，所以捷運路線上可以看到許多的大型工地，及伴隨而來的工程車，例如水泥車、砂石車、鋼筋的拖吊車。&lt;br /&gt;&lt;br /&gt;這些大型的車輛，在馬路上行駛的速度常常很快，而且有些馬路是小馬路，甚至是小巷道（例如永和的道路），讓駕駛汽車的人緊張，騎機車的人很緊張，騎腳踏車的人非常緊張，尤其在紅綠燈及十字路口。&lt;br /&gt;&lt;br /&gt;我在想，如果萬一發生意外，造成任何人的傷亡，其後果恐怕不是賠償或是吃官司做牢，可以彌補的。因為生命的價值，遠超過金錢，不管是有錢人的生命，或是沒有錢人的生命。&lt;br /&gt;&lt;br /&gt;如果政府及施工單位，如果多一點人性的關懷，不要效率及金錢掛帥，想要一下子就把所以的捷運路線，及附近的大樓一下子全蓋好，那麼情況會改善很多。&lt;br /&gt;&lt;br /&gt;畢竟，如果捷運跟大樓都蓋好了，如果少了一個人搭，或是一個人住，那也是蠻大的遺憾。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5462403775530306599-1969653061061482222?l=shunyuan-chou.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shunyuan-chou.blogspot.com/feeds/1969653061061482222/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://shunyuan-chou.blogspot.com/2011/06/blog-post.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5462403775530306599/posts/default/1969653061061482222'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5462403775530306599/posts/default/1969653061061482222'/><link rel='alternate' type='text/html' href='http://shunyuan-chou.blogspot.com/2011/06/blog-post.html' title='新北市新建的捷運路線，未來的遠景可期，施工小細節沒注意，卻讓新北市亂糟糟'/><author><name>shunyuan</name><uri>http://www.blogger.com/profile/01707982560051207896</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5462403775530306599.post-4269041832278830017</id><published>2011-04-14T01:15:00.000-07:00</published><updated>2011-04-14T01:15:08.144-07:00</updated><title type='text'>蔡藍欽-這個世界</title><content type='html'>詞/曲：蔡藍欽&lt;br /&gt;&lt;br /&gt;在這個世界&lt;br /&gt;有一點希望&lt;br /&gt;有一點失望&lt;br /&gt;我時常這么想&lt;br /&gt;&lt;br /&gt;在這個世界&lt;br /&gt;有一點歡樂&lt;br /&gt;有一點悲傷&lt;br /&gt;誰也無法逃開&lt;br /&gt;&lt;br /&gt;我們的世界&lt;br /&gt;并不像你說的真有那么壞&lt;br /&gt;你又何必感慨&lt;br /&gt;用你的關懷和所有的愛&lt;br /&gt;為這個世界&lt;br /&gt;添一些美麗色彩&lt;br /&gt;&lt;br /&gt;在這個世界&lt;br /&gt;有一點希望&lt;br /&gt;有一點失望&lt;br /&gt;我時常這么想&lt;br /&gt;&lt;br /&gt;在這個世界&lt;br /&gt;有一點歡樂&lt;br /&gt;有一點悲傷&lt;br /&gt;誰也無法逃開&lt;br /&gt;&lt;br /&gt;我們的世界&lt;br /&gt;并不像你說的真有那么壞&lt;br /&gt;你又何必感慨&lt;br /&gt;用你的關懷和所有的愛&lt;br /&gt;為這個世界&lt;br /&gt;添一些美麗色彩&lt;br /&gt;&lt;br /&gt;我們的世界&lt;br /&gt;并不像你說的真有那么壞&lt;br /&gt;你又何必感慨&lt;br /&gt;用你的關懷和所有的愛&lt;br /&gt;為這個世界&lt;br /&gt;添一些美麗色彩&lt;br /&gt;&lt;br /&gt;我們的世界&lt;br /&gt;并不像你說的真有那么壞&lt;br /&gt;你又何必感慨&lt;br /&gt;用你的關懷和所有的愛&lt;br /&gt;為這個世界&lt;br /&gt;添一些美麗色彩&lt;br /&gt;&lt;br /&gt;我們的世界&lt;br /&gt;并不像你說的真有那么壞&lt;br /&gt;你又何必感慨&lt;br /&gt;用你的關懷和所有的愛&lt;br /&gt;為這個世界&lt;br /&gt;添一些美麗色彩&lt;br /&gt;&lt;br /&gt;想聽歌點這裡：&lt;a href="http://www.youtube.com/watch?v=DMNkFILe1cY"&gt;蔡藍欽-這個世界&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5462403775530306599-4269041832278830017?l=shunyuan-chou.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shunyuan-chou.blogspot.com/feeds/4269041832278830017/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://shunyuan-chou.blogspot.com/2011/04/blog-post.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5462403775530306599/posts/default/4269041832278830017'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5462403775530306599/posts/default/4269041832278830017'/><link rel='alternate' type='text/html' href='http://shunyuan-chou.blogspot.com/2011/04/blog-post.html' title='蔡藍欽-這個世界'/><author><name>shunyuan</name><uri>http://www.blogger.com/profile/01707982560051207896</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5462403775530306599.post-6270760622295577530</id><published>2010-11-03T01:05:00.000-07:00</published><updated>2010-11-03T01:07:33.577-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><category scheme='http://www.blogger.com/atom/ns#' term='10.10'/><category scheme='http://www.blogger.com/atom/ns#' term='Ubuntu'/><title type='text'>升級到 Ubuntu 10.10</title><content type='html'>我透過 Ubuntu 的 Update Manager 從 Ubuntu 10.4 升級到 Ubuntu 10.10&lt;br /&gt;&lt;br /&gt;過程大概描述如下：&lt;br /&gt;&lt;br /&gt;(1) 執行 Update Manager 安裝所有的更新&lt;br /&gt;&lt;br /&gt;(2)調整 Update Manager 的設定，勾選 pre-released updates&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_AYhsIQZj9qQ/TNETqKBF6aI/AAAAAAAACLg/FmM8odPp-sE/s1600/settings.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="400" src="http://1.bp.blogspot.com/_AYhsIQZj9qQ/TNETqKBF6aI/AAAAAAAACLg/FmM8odPp-sE/s400/settings.png" width="377" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;(3) 再檢查更新一次，就會發現 Ubuntu 10.10 Upgrade 等著被安裝&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;(4) 更新下載及安裝有 1600 多個檔案，所以要花好幾個小時。&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;(5) 升級到 Ubuntu 10.10 之後，會發現 iBus + 新酷音 無法正常使用，這個是已經被回報的 bug&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;(6) 解決中文輸入法的辦法，是改用 SCIM 取代 iBus&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;(7) 使用 snaptic package manager 安裝 scim，別忘了選 scim-chewing 酷音輸入法&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_AYhsIQZj9qQ/TNEV7Q1cUdI/AAAAAAAACLk/3duNKrjems8/s1600/snaptic.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="221" src="http://4.bp.blogspot.com/_AYhsIQZj9qQ/TNEV7Q1cUdI/AAAAAAAACLk/3duNKrjems8/s400/snaptic.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;(8) 在 Language Support 中啟用 scim&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_AYhsIQZj9qQ/TNEXANw2lLI/AAAAAAAACLo/f_VSwiRnHFs/s1600/language.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="342" src="http://1.bp.blogspot.com/_AYhsIQZj9qQ/TNEXANw2lLI/AAAAAAAACLo/f_VSwiRnHFs/s400/language.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;(9) 最後用 Computer janitor 移除掉沒有用的套件，包括先前的Ubuntu 10.4 的 boot image。&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;目前為止使用上沒發生什麼問題，又另外安裝了 Chrome Dev Channel 及 Acrobat Reader 9.4&amp;nbsp;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5462403775530306599-6270760622295577530?l=shunyuan-chou.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shunyuan-chou.blogspot.com/feeds/6270760622295577530/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://shunyuan-chou.blogspot.com/2010/11/ubuntu-1010.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5462403775530306599/posts/default/6270760622295577530'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5462403775530306599/posts/default/6270760622295577530'/><link rel='alternate' type='text/html' href='http://shunyuan-chou.blogspot.com/2010/11/ubuntu-1010.html' title='升級到 Ubuntu 10.10'/><author><name>shunyuan</name><uri>http://www.blogger.com/profile/01707982560051207896</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_AYhsIQZj9qQ/TNETqKBF6aI/AAAAAAAACLg/FmM8odPp-sE/s72-c/settings.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5462403775530306599.post-4934189548060335539</id><published>2010-05-09T20:48:00.000-07:00</published><updated>2010-05-10T05:47:56.303-07:00</updated><title type='text'>Objective-C 2.0 筆記 (0) 概論</title><content type='html'>想要學 Objective-C 在 iPhone 及 Mac 上開發軟體，看以下 Apple 官方的資料，一定是一頭霧水。&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', verdana, sans-serif; font-size: 13px; line-height: 22px;"&gt;&lt;span class="Apple-style-span" style="color: blue;"&gt;(1)&amp;nbsp;&lt;/span&gt;&lt;a href="http://developer.apple.com/iphone/library/documentation/Cocoa/Conceptual/ObjectiveC/Introduction/introObjectiveC.html" style="border-bottom-color: red; border-bottom-style: dashed; border-bottom-width: 1px; text-decoration: none;"&gt;&lt;span class="Apple-style-span" style="color: blue;"&gt;The Objective-C 2.0 Programming Language&lt;/span&gt;&lt;/a&gt;&lt;span class="Apple-style-span" style="color: blue;"&gt;&lt;br /&gt;(2)&amp;nbsp;&lt;/span&gt;&lt;a href="http://developer.apple.com/iphone/library/documentation/Cocoa/Conceptual/ObjCRuntimeGuide/Introduction/Introduction.html" style="text-decoration: none;"&gt;&lt;span class="Apple-style-span" style="color: blue;"&gt;Objective-C 2.0 Runtime Programming Guide&lt;/span&gt;&lt;/a&gt;&lt;span class="Apple-style-span" style="color: blue;"&gt;&lt;br /&gt;(3)&amp;nbsp;&lt;/span&gt;&lt;a href="http://developer.apple.com/iphone/library/documentation/Cocoa/Reference/ObjCRuntimeRef/Reference/reference.html" style="text-decoration: none;"&gt;&lt;span class="Apple-style-span" style="color: blue;"&gt;Objective-C 2.0 Runtime Reference&lt;/span&gt;&lt;/a&gt;&lt;span class="Apple-style-span" style="color: blue;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', verdana, sans-serif; font-size: 13px; line-height: 22px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', verdana, sans-serif; font-size: 13px; line-height: 22px;"&gt;理由很簡單，這些資料是參考 (reference)，而非教學(tutorial)，是假設你已經懂得程式設計，然後告訴你 ：&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', verdana, sans-serif; font-size: 13px; line-height: 22px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', verdana, sans-serif; font-size: 13px; line-height: 22px;"&gt;&lt;span class="Apple-style-span" style="color: blue;"&gt;(1) Objective-C 跟 C 語言的差異 (new feature for C)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', verdana, sans-serif; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px; line-height: 22px;"&gt;&lt;span class="Apple-style-span" style="color: blue;"&gt;(2) Objective-C 的執行環境 (Objective-C runtime)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', verdana, sans-serif; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px; line-height: 22px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', verdana, sans-serif; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px; line-height: 22px;"&gt;便假定你可以開始跟 iPhone 的程式師一樣，可以開始寫程式了，如果遇到問題，就參考 Apple Getting Start 的說明文見，然後自己就可以搞定。&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', verdana, sans-serif; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px; line-height: 22px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', verdana, sans-serif; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px; line-height: 22px;"&gt;事實上，那是理想的情況，真正看完 The Objective-C 2.0 Programming Language，你還是一頭霧水。因為連最簡單的 Hello World!，你也不知道該怎麼寫。更別說那些看起來跟 C 或 C++ 差異非常大的 Objective-C 語法，說實話看起來有點真的有點像天書（傻笑～）。&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', verdana, sans-serif; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px; line-height: 22px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', verdana, sans-serif; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px; line-height: 22px;"&gt;所以我建議參考下面兩本書，來入門熟悉 Objective-C，&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', verdana, sans-serif; font-size: 13px; line-height: 22px;"&gt;Cocoa Touch 及如何開發 iPhone 程式：&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', verdana, sans-serif; font-size: 13px; line-height: 22px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', verdana, sans-serif; font-size: 13px; line-height: 22px;"&gt;&lt;span class="Apple-style-span" style="color: blue;"&gt;(1) Programming in Objective-C 2.0, 2nd Edition&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="color: blue; font-family: 'Trebuchet MS', verdana, sans-serif; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px; line-height: 22px;"&gt;Introduction&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="color: blue; font-family: 'Trebuchet MS', verdana, sans-serif; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px; line-height: 22px;"&gt;Programming in Objective-C&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="color: blue; font-family: 'Trebuchet MS', verdana, sans-serif; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px; line-height: 22px;"&gt;Classes, Objects and Methods&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="color: blue; font-family: 'Trebuchet MS', verdana, sans-serif; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px; line-height: 22px;"&gt;Data Types and Expressions&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="color: blue; font-family: 'Trebuchet MS', verdana, sans-serif; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px; line-height: 22px;"&gt;Programming Looping&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="color: blue; font-family: 'Trebuchet MS', verdana, sans-serif; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px; line-height: 22px;"&gt;Making Decisions&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="color: blue; font-family: 'Trebuchet MS', verdana, sans-serif; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px; line-height: 22px;"&gt;More on Classes&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="color: blue; font-family: 'Trebuchet MS', verdana, sans-serif; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px; line-height: 22px;"&gt;Inheritance&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="color: blue; font-family: 'Trebuchet MS', verdana, sans-serif; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px; line-height: 22px;"&gt;Polymorphism, Dynamic Typing, and Dynamic Binding&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="color: blue; font-family: 'Trebuchet MS', verdana, sans-serif; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px; line-height: 22px;"&gt;More on Variables and Data Types&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="color: blue; font-family: 'Trebuchet MS', verdana, sans-serif; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px; line-height: 22px;"&gt;Categories and Protocols&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="color: blue; font-family: 'Trebuchet MS', verdana, sans-serif; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px; line-height: 22px;"&gt;The Preprocessors&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="color: blue; font-family: 'Trebuchet MS', verdana, sans-serif; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px; line-height: 22px;"&gt;Underlying C Language Features&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="color: blue; font-family: 'Trebuchet MS', verdana, sans-serif; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px; line-height: 22px;"&gt;Introductions to The Foundation Framework&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="color: blue; font-family: 'Trebuchet MS', verdana, sans-serif; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px; line-height: 22px;"&gt;Numbers, Strings, and Collections&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="color: blue; font-family: 'Trebuchet MS', verdana, sans-serif; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px; line-height: 22px;"&gt;Working with Files&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="color: blue; font-family: 'Trebuchet MS', verdana, sans-serif; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px; line-height: 22px;"&gt;Memory Management&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="color: blue; font-family: 'Trebuchet MS', verdana, sans-serif; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px; line-height: 22px;"&gt;Copying Objects&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="color: blue; font-family: 'Trebuchet MS', verdana, sans-serif; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px; line-height: 22px;"&gt;Archiving&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="color: blue; font-family: 'Trebuchet MS', verdana, sans-serif; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px; line-height: 22px;"&gt;Introduction to Cocoa&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="color: blue; font-family: 'Trebuchet MS', verdana, sans-serif; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px; line-height: 22px;"&gt;Writing iPhone Application&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', verdana, sans-serif; font-size: 13px; line-height: 22px;"&gt;&lt;span class="Apple-style-span" style="color: blue;"&gt;(2) iPhone For Programmers An App-Driven Approach&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="color: blue; font-family: 'Trebuchet MS', verdana, sans-serif; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px; line-height: 22px;"&gt;Introduction to iPhone App Development&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="color: blue; font-family: 'Trebuchet MS', verdana, sans-serif; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px; line-height: 22px;"&gt;iPhone App Store and App Business Issues&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="color: blue; font-family: 'Trebuchet MS', verdana, sans-serif; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px; line-height: 22px;"&gt;Welcome App&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="color: blue; font-family: 'Trebuchet MS', verdana, sans-serif; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px; line-height: 22px;"&gt;Tip Calculator Application&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="color: blue; font-family: 'Trebuchet MS', verdana, sans-serif; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px; line-height: 22px;"&gt;Favorite Twitter Search Application&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="color: blue; font-family: 'Trebuchet MS', verdana, sans-serif; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px; line-height: 22px;"&gt;Flag Quiz Game Application&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="color: blue; font-family: 'Trebuchet MS', verdana, sans-serif; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px; line-height: 22px;"&gt;Spot-On Game Application&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="color: blue; font-family: 'Trebuchet MS', verdana, sans-serif; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px; line-height: 22px;"&gt;Cannon Game Application&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="color: blue; font-family: 'Trebuchet MS', verdana, sans-serif; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px; line-height: 22px;"&gt;Painter Application&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="color: blue; font-family: 'Trebuchet MS', verdana, sans-serif; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px; line-height: 22px;"&gt;Address Book Application&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="color: blue; font-family: 'Trebuchet MS', verdana, sans-serif; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px; line-height: 22px;"&gt;Rute Tracker App&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="color: blue; font-family: 'Trebuchet MS', verdana, sans-serif; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px; line-height: 22px;"&gt;Slideshow App&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="color: blue; font-family: 'Trebuchet MS', verdana, sans-serif; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px; line-height: 22px;"&gt;Enhanced Slide App&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="color: blue; font-family: 'Trebuchet MS', verdana, sans-serif; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px; line-height: 22px;"&gt;Voice Recorder App&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="color: blue; font-family: 'Trebuchet MS', verdana, sans-serif; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px; line-height: 22px;"&gt;Enhanced Address Book App&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="color: blue; font-family: 'Trebuchet MS', verdana, sans-serif; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px; line-height: 22px;"&gt;Twitter Discount Airfares App&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', verdana, sans-serif; font-size: 13px; line-height: 22px;"&gt;建議這兩本書，除了內容不錯外，最主要還是因為都是以應用為導向，讓你ㄧ邊實作，一邊學習。當然只有這兩本是不夠的，因為其中關於設計模式(design pattern)，也是點到為止。所以參考 Apple 官方的文件，是免不了的。&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', verdana, sans-serif; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px; line-height: 22px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', verdana, sans-serif; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px; line-height: 22px;"&gt;Programming in Objective-C 2.0, 2nd Edition 這本書，在第二章就讓你自己用 Objective-C 寫你的 Hello World! 程式，然後依序介紹 Objective-C 的語法元素，Objective-C 就不在是那麼遙不可及。Objective-C 語法是一定要搞得很清楚的，這是基本功。&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', verdana, sans-serif; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px; line-height: 22px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', verdana, sans-serif; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px; line-height: 22px;"&gt;iPhone For Programmers An App-Driven Approach &amp;nbsp;這本書，則是針對如何應用 Foundation 及 Cocoa Framework，逐一用例子，加以示範及說明。這比看資料，然後自己去想如何使用容易多了，畢竟寫書的人，一定是有經驗，可以讓你少跑些冤妄路。&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', verdana, sans-serif; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px; line-height: 22px;"&gt;後面的筆記，就是根據讀這兩本書的內容，摘要而寫的。&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', verdana, sans-serif; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px; line-height: 22px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', verdana, sans-serif; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px; line-height: 22px;"&gt;&lt;b&gt;未完待續，期待下一篇吧 .........&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5462403775530306599-4934189548060335539?l=shunyuan-chou.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shunyuan-chou.blogspot.com/feeds/4934189548060335539/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://shunyuan-chou.blogspot.com/2010/05/objective-c-20-0.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5462403775530306599/posts/default/4934189548060335539'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5462403775530306599/posts/default/4934189548060335539'/><link rel='alternate' type='text/html' href='http://shunyuan-chou.blogspot.com/2010/05/objective-c-20-0.html' title='Objective-C 2.0 筆記 (0) 概論'/><author><name>shunyuan</name><uri>http://www.blogger.com/profile/01707982560051207896</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5462403775530306599.post-477223160881345556</id><published>2010-05-02T08:40:00.000-07:00</published><updated>2010-05-03T03:12:25.701-07:00</updated><title type='text'>iPhone 程式設計入門（7) Cocoa Touch 摘要</title><content type='html'>(1) Cocoa Toch Frameworks&lt;br /&gt;&lt;br /&gt;Foundation&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Object wrappers&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;Strings, collections&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;Various system services (file I/O and network)&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Subset of Foundation on Mac&lt;/li&gt;&lt;/ul&gt;UIKit&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Event handling&lt;/li&gt;&lt;li&gt;Graphics and windowing&lt;/li&gt;&lt;li&gt;Text and web management&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;(2) Foundation&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Strings&lt;br /&gt;&lt;span class="Apple-style-span" style="background-color: #cccccc;"&gt;NSString *myString = @"This is a string";&lt;br /&gt;&lt;br /&gt;NSString *myString = [NSString stringWithFormat:@"%d techTalks", 24];&lt;br /&gt;&lt;br /&gt;NSString *pathString = @"Library/Caches/Images/dataCache.txt";&lt;br /&gt;NSArrary *pathComments = [pathString pathComments];&lt;br /&gt;NSString *fileName = [pathString lastPathComponent];&lt;br /&gt;&lt;br /&gt;NSString *fileContents = [NSString stringWithContentOfFile:pathString];&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Arrays&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Mutable&lt;br /&gt;&lt;span class="Apple-style-span" style="background-color: #cccccc;"&gt;NSMutableArray *arr = [NSMutableArray array];&lt;br /&gt;[arr addObject:@"randomString"];&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Immutable&lt;br /&gt;&lt;span class="Apple-style-span" style="background-color: #cccccc;"&gt;NSArray *arr = [NSArray arrayWithObjects:@"foo", @"bar", @"moof", nil];&lt;br /&gt;NSString *complexString = [arr componentsJoinedByString:@"--"];&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Dictionary&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Mutable&lt;br /&gt;&lt;span class="Apple-style-span" style="background-color: #cccccc;"&gt;NSMutableDictionary *md = [NSMutableDictionary dictionaryWithCapacity:5];&lt;br /&gt;[md setObject:@"randomValue" forKey:@"randomKey"];&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Immutable&lt;br /&gt;&lt;span class="Apple-style-span" style="background-color: #cccccc;"&gt;NSDictionary *dict = [NSDictionary dictionaryWithObjectAndKeys:&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;@"valueOne", @"keyOne", @"valueTwo", @"keyTwo", nil];&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;File I/O&lt;/li&gt;&lt;ul&gt;&lt;li&gt;NSFileManager class&lt;br /&gt;&lt;span class="Apple-style-span" style="background-color: #cccccc;"&gt;NSFileManager *fm = [NSFileManager defaultManager];&lt;br /&gt;if ([fm isWritableFileAtPath: path]) {&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;[fm createFileAtPath: [path stringByAppendingPathComponent:@"foo.bar"]&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; contents:@"foo"&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;attributes:nil ];&lt;br /&gt;}&lt;/span&gt;&lt;/li&gt;&lt;li&gt;tmp directory -- Cleared, not backed up&lt;/li&gt;&lt;li&gt;Library/Caches -- Saved, not backed up&lt;/li&gt;&lt;li&gt;Everything else -- Backed up&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;NSLog&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="background-color: #cccccc;"&gt;NSLog(@"Simple debug statement");&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="background-color: #cccccc;"&gt;NSLog(@"There are %d North American Tech Talk", numberOfNATechTalks);&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="background-color: #cccccc;"&gt;NSLog(@"Got an array: %@", myArray);&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="background-color: #cccccc;"&gt;NSLog(@"Got an dictionary: %@", myDictionary);&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;div&gt;(3) Foundation Bundles -- a special kind of folder&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="background-color: #cccccc;"&gt;Executable&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="background-color: #cccccc;"&gt;User Interface (nib) files&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="background-color: #cccccc;"&gt;Metadata&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="background-color: #cccccc;"&gt;Resources&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Access via NSBundle class&lt;/li&gt;&lt;li&gt;Easy accesses to static resources&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Images&lt;/li&gt;&lt;li&gt;Sounds&lt;/li&gt;&lt;li&gt;Default data&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Read-only&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Codesigning requires static bundle&lt;/li&gt;&lt;li&gt;Write new data to sandbox&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Accessing resources&lt;br /&gt;&lt;span class="Apple-style-span" style="background-color: #cccccc;"&gt;// Get an image from the main app bundle&lt;br /&gt;NSBundle *appBundle = [NSBundle mainBoundle];&lt;br /&gt;&lt;br /&gt;NSString *imagePath = [appBundle pathForResource:@"logo" ofType:@"png"];&lt;br /&gt;UIImage *logoImg = [[UIImage alloc] initWithContentsOfFile: imagePath];&lt;br /&gt;&lt;br /&gt;// Load a default SQLite DB if no user data exists&lt;br /&gt;NSString *defaultDB = [appBoundle pathForResource:@"db" ofType:@"sql"];&lt;br /&gt;if (sqlite3_open([defaultDB UTF8String], &amp;amp;database) == SQLITE_OK) {&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; // fetch data from default db&lt;br /&gt;}&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;(4) Foundation -- Networking&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Standard sockets programming&amp;nbsp;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;CFNetwork, CFSocket&lt;/li&gt;&lt;li&gt;POSIX&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;NSURLConnection&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Asynchronous request loading&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;NSXML&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Basic parser&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Bonjour Networking&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Zero-configuration discovery&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Bonjour discovery&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;(5) UIKit -- The UIKit Library,&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Buttons and Controls&lt;/li&gt;&lt;li&gt;Image Views&lt;/li&gt;&lt;li&gt;Web Views (put Safari inside your application)&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;(6) Application Design Patterns&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Model-View-Controller&lt;/li&gt;&lt;li&gt;Foundation is for Model&lt;/li&gt;&lt;li&gt;UIKit is for View&lt;/li&gt;&lt;li&gt;iPhone SDK has ViewController class for Controller&lt;/li&gt;&lt;li&gt;MVC is the umbrella design pattern&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;(7) Application Design Patterns - Target-Action&lt;/div&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_AYhsIQZj9qQ/S922nwVo6bI/AAAAAAAAAjA/U1xVxam9Hl4/s1600/Screen+shot+2010-05-03+at+1.29.03+AM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_AYhsIQZj9qQ/S922nwVo6bI/AAAAAAAAAjA/U1xVxam9Hl4/s320/Screen+shot+2010-05-03+at+1.29.03+AM.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;(8)&amp;nbsp;Application Design Patterns -&amp;nbsp;Notification&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Notification Center&lt;/li&gt;&lt;li&gt;Observer / Controller&lt;/li&gt;&lt;li&gt;Notifications -- Registering an observer&lt;br /&gt;&lt;span class="Apple-style-span" style="background-color: #cccccc;"&gt;MPMoviePlayerController *mpc;&lt;br /&gt;NSURL *url = [NSURL urlWithString:@"http://foo.com/movie.mov"];&lt;br /&gt;mpc = [[MPMoviePlayerController alloc] initWithContentURL:url];&lt;br /&gt;&lt;br /&gt;// Register for device notifications&lt;br /&gt;[[NSNotificationCenter defaultCenter] addObserver:self&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; selector:@selector(movieLoaded:)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; name: MPMoviePlayerContentPreloadDidFinishNotification&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; object:mpc];&lt;br /&gt;&lt;br /&gt;// Get preload notification and react accordingly&lt;br /&gt;- (void) movLoaded: (NSNotification *) notif {&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;[(MPMoviePlayerController *)[notif object] play];&lt;br /&gt;}&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;(9) Application Design Patterns - Delegation&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;The Application Life Cycle&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Application launch&lt;/li&gt;&lt;ul&gt;&lt;li&gt;UIApplication&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Main nib&lt;/li&gt;&lt;li&gt;Main window&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Application delegate&lt;/li&gt;&lt;ul&gt;&lt;li&gt;UI config&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;li&gt;The Application Delegate&amp;nbsp;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Your first (and last) chance to act&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Custom class written by you&lt;/li&gt;&lt;li&gt;Conforms to UIApplicationDelegate protocol&lt;/li&gt;&lt;li&gt;Hooked up in interface Builder&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Two key methods&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="background-color: #cccccc;"&gt;- (void) applicationDidFinishLaunching:(UIApplication*) app&lt;/span&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Load initial UI, prepare saved state&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="background-color: #cccccc;"&gt;- (void) applicationWillTerminate:(UIApplication*) app&lt;/span&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Save state and data &amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;li&gt;Delegate Design Pattern&amp;nbsp;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Customization &amp;nbsp;without subclassing&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Fine-tune default behavior&lt;/li&gt;&lt;li&gt;Respond to user actions&lt;/li&gt;&lt;li&gt;Separate controller from view&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;div&gt;(10) iPhone Design Patterns&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Model-View-Controller&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Target-Action&lt;/li&gt;&lt;ul&gt;&lt;li&gt;what reacts, and how&lt;/li&gt;&lt;li&gt;dynamic object and selector&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Notification&lt;/li&gt;&lt;ul&gt;&lt;li&gt;information while app is running&lt;/li&gt;&lt;li&gt;Asynchronous delivery&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Delegation&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Direct control over view behavior&lt;/li&gt;&lt;li&gt;Synchronous delivery and response&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;div&gt;(11) iPhone Development&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Get to know Cocoa Touch&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Understand the Objective-C runtime&lt;/li&gt;&lt;li&gt;Explore Fundation and UIKit&lt;/li&gt;&lt;li&gt;Embrace design pattern&lt;/li&gt;&lt;li&gt;Look at example nib file&lt;/li&gt;&lt;li&gt;Use NSLog&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;Stay tuned ..........&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5462403775530306599-477223160881345556?l=shunyuan-chou.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shunyuan-chou.blogspot.com/feeds/477223160881345556/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://shunyuan-chou.blogspot.com/2010/05/iphone-6-cocoa-touch.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5462403775530306599/posts/default/477223160881345556'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5462403775530306599/posts/default/477223160881345556'/><link rel='alternate' type='text/html' href='http://shunyuan-chou.blogspot.com/2010/05/iphone-6-cocoa-touch.html' title='iPhone 程式設計入門（7) Cocoa Touch 摘要'/><author><name>shunyuan</name><uri>http://www.blogger.com/profile/01707982560051207896</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_AYhsIQZj9qQ/S922nwVo6bI/AAAAAAAAAjA/U1xVxam9Hl4/s72-c/Screen+shot+2010-05-03+at+1.29.03+AM.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5462403775530306599.post-8743192592332019924</id><published>2010-02-25T05:23:00.000-08:00</published><updated>2010-02-25T22:40:14.873-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='emulator'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>模擬器學習日記 (8) - 模擬器原理</title><content type='html'>&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: 15px; line-height: 22px;"&gt;早期在 PC 上寫模擬器的牛人，Marat Fayzullin 是其中之一。1997 年，他就已經開發出 fMSX 模擬器，並且以這篇文章&amp;nbsp;&lt;a href="http://fms.komkon.org/EMUL8/HOWTO.html" target="_blank"&gt;how to write a computer emulator&lt;/a&gt;&amp;nbsp;分享他的知識。中文翻譯的網頁已經不存在了，可惜。&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-size: 15px; line-height: 22px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-size: 15px; line-height: 22px;"&gt;下面是閱讀後的整理：&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-size: 15px; line-height: 22px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-size: 15px; line-height: 22px;"&gt;&lt;b&gt;綱要：&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: 15px; line-height: 22px;"&gt;什麼可以被模擬？&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: 15px; line-height: 22px;"&gt;什麼是 emulation，它跟 simulation 有什麼不同？&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: 15px; line-height: 22px;"&gt;模擬有專利的硬體，是合法的嗎？&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: 15px; line-height: 22px;"&gt;什麼是直譯式的模擬器，跟編譯式的模擬器有何不同？&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: 15px; line-height: 22px;"&gt;我想寫一個模擬器，我該從何開始？&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: 15px; line-height: 22px;"&gt;我該用哪一種程式語言？&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: 15px; line-height: 22px;"&gt;我從哪裡可以得到想模擬的硬體的資訊？&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-size: 15px; line-height: 22px;"&gt;&lt;b&gt;實做：&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: 15px; line-height: 22px;"&gt;如何模擬一個 CPU？&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: 15px; line-height: 22px;"&gt;如何存取被模擬的記憶體？&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: 15px; line-height: 22px;"&gt;週期性的運作有哪些？&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-size: 15px; line-height: 22px;"&gt;&lt;b&gt;程式技巧：&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: 15px; line-height: 22px;"&gt;如何最佳化 C 程式碼？&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: 15px; line-height: 22px;"&gt;什麼是高低字節順序？&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: 15px; line-height: 22px;"&gt;如何讓程式具可移植性？&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: 15px; line-height: 22px;"&gt;為何我要模組化我的程式？&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-size: 15px; line-height: 22px;"&gt;-------------------------------------------------------------------------&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-size: 15px; line-height: 22px;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, Geneva; font-size: medium; line-height: normal;"&gt;&lt;a href="http://www.blogger.com/" name="LABA" style="font-family: Arial, Helvetica, Geneva;"&gt;&lt;/a&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: 15px; line-height: 22px;"&gt;&lt;b&gt;什麼可以被模擬？&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-size: 15px; line-height: 22px;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, Geneva; font-size: medium; line-height: normal;"&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: 15px; line-height: 22px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-size: 15px; line-height: 22px;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, Geneva; font-size: medium; line-height: normal;"&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: 15px; line-height: 22px;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-size: 15px; line-height: 22px;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, Geneva; font-size: medium; line-height: normal;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-size: 15px; line-height: 22px;"&gt;基本上，任何東西有微處理器在裡面，就可模擬。當然，只有那些可以跑程式裝置，我們才有興趣模擬。包括：&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-size: 15px; line-height: 22px;"&gt;電腦&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-size: 15px; line-height: 22px;"&gt;計算機&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-size: 15px; line-height: 22px;"&gt;遊樂器&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-size: 15px; line-height: 22px;"&gt;大型電動&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-size: 15px; line-height: 22px;"&gt;其他......&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-size: 15px; line-height: 22px;"&gt;必須特別註明，你可以模擬任何電腦系統，即是事非常複雜的系統（譬如&amp;nbsp;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, Geneva; font-size: medium; line-height: normal;"&gt;Amiga 電腦），但是執行效率可能很低。&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-size: 15px; line-height: 22px;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, Geneva; font-size: medium; line-height: normal;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial; font-size: 14px; line-height: 25px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-size: 15px; line-height: 22px;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, Geneva; font-size: medium; line-height: normal;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial; font-size: 14px; line-height: 25px;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-size: 15px; line-height: 22px;"&gt;-------------------------------------------------------------------------&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-size: 15px; line-height: 22px;"&gt;&lt;b&gt;什麼是 Emulation，它跟 Simulation 有什麼不同？&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-size: 15px; line-height: 22px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-size: 15px; line-height: 22px;"&gt;Emulation 模擬裝置內部的硬體，Simulation 是模擬裝置內部的功能。舉例來說，一個程式模擬小精靈大型電動的硬體，然後執行小精靈的 ROM，就是個 emulator。一個小精靈的 PC 遊戲，就是個 simulator。&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-size: 15px; line-height: 22px;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial; font-size: 14px; line-height: 25px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-size: 15px; line-height: 22px;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial; font-size: 14px; line-height: 25px;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-size: 15px; line-height: 22px;"&gt;-------------------------------------------------------------------------&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-size: 15px; line-height: 22px;"&gt;&lt;b&gt;模擬有專利的硬體，是合法的嗎？&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-size: 15px; line-height: 22px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-size: 15px; line-height: 22px;"&gt;這是個灰色地帶，只要你不是透過不合法的管道，拿到硬體的資訊，就應該不違法。但是很清楚知道，跟模擬器一起散佈有著作權的系統 ROM（例如 BIOS），是違法的。&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-size: 15px; line-height: 22px;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial; font-size: 14px; line-height: 25px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-size: 15px; line-height: 22px;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial; font-size: 14px; line-height: 25px;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-size: 15px; line-height: 22px;"&gt;-------------------------------------------------------------------------&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-size: 15px; line-height: 22px;"&gt;&lt;b&gt;什麼是直譯式的模擬器，跟編譯式的模擬器有何不同？&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-size: 15px; line-height: 22px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-size: 15px; line-height: 22px;"&gt;模擬器有三種設計的方式，這些設計也可以混用，來達到最好的效果。&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-size: 15px; line-height: 22px;"&gt;&lt;b&gt;直譯式&lt;/b&gt;&lt;br /&gt;模擬器一個位元又一個位元的，從記憶體讀取代碼，然後解碼，執行對應的暫存器、記憶體、輸出入的命令。通用的演算法如下：&lt;br /&gt;while (CPUIsRunning)&lt;br /&gt;{&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;/span&gt;Fetch OpCode&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;/span&gt;Interpret OpCode&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;這種設計的好處是，容易除錯，容易移植，容易同步（你只需要計算過了多少 CPU 週期，然後讓你模擬的其他部份，跟 CPU 同步）。&lt;br /&gt;&lt;br /&gt;這種設計明顯的弱點，就是執行效率很差。執行直譯會花很多 CPU 時間，你會需要很快的電腦，才能有不錯的執行速度。&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-size: 15px; line-height: 22px;"&gt;&lt;b&gt;靜態編譯式&lt;/b&gt;&lt;br /&gt;這種技術，就是把一支你要模擬的系統的代碼，編譯成你的電腦的的組合語言。編譯的結果，通常是一支你的電腦的普通執行檔，不需要額外的工具就可以執行。靜態編譯，聽起來很美好，但通常不可行。例如，你就無法靜態編譯會自我修改的代碼，因為這種代碼只有執行時，才會知道內容是什麼。為瞭解決上述的問題，或許需要混用直譯器，或是動態編譯編譯器。&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-size: 15px; line-height: 22px;"&gt;&lt;b&gt;動態編譯式&lt;/b&gt;&lt;br /&gt;動態編譯基本上跟靜態編譯一樣，但動態編譯發生在程式執行時。動態編譯是在執行到 CALL 或 JUMP 時才編譯，取代一開始就編譯一整個程式。為了增加執行效率，這種技術常常結合靜態編譯。你可以讀，動態編譯式麥金塔模擬器的作者 Ardi，的這&lt;u&gt;篇動態編譯白皮書&lt;/u&gt;學到更多&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-size: 15px; line-height: 22px;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial; font-size: 14px; line-height: 25px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-size: 15px; line-height: 22px;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial; font-size: 14px; line-height: 25px;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-size: 15px; line-height: 22px;"&gt;-------------------------------------------------------------------------&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-size: 15px; line-height: 22px;"&gt;&lt;b&gt;我想寫一個模擬器，我該從何開始？&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-size: 15px; line-height: 22px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-size: 15px; line-height: 22px;"&gt;想要寫一個模擬器，你必須懂程式設計，以及數位電子。如果懂得組合語言，會更好。&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-size: 15px; line-height: 22px;"&gt;選一種程式語言&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-size: 15px; line-height: 22px;"&gt;找到所有被模擬硬體的所有資訊&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-size: 15px; line-height: 22px;"&gt;寫 CPU 模擬，或是選用一個現成的 CPU 模擬程式&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-size: 15px; line-height: 22px;"&gt;寫個粗略的其他周邊硬體的模擬，至少要一部分&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-size: 15px; line-height: 22px;"&gt;在這個時候，寫個內建除錯器，讓你可以暫停模擬，檢查程式執行的結果。你也會需要一個被模擬 CPU 的組合語言反組譯器。如果找不到現成的，就自己寫一個。&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-size: 15px; line-height: 22px;"&gt;試著用你的模擬器執行程式&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-size: 15px; line-height: 22px;"&gt;用除錯程式跟反組譯器，看看程式到底在幹麼，然後根據此修改你的模擬器&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-size: 15px; line-height: 22px;"&gt;-------------------------------------------------------------------------&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-size: 15px; line-height: 22px;"&gt;&lt;b&gt;我該用哪一種程式語言？&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;最常被用到是 C 跟組合語言，各有優缺點。&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;組合 語言&lt;/b&gt;&lt;br /&gt;+ 通用，可以產生速度快的程式碼&lt;br /&gt;+ 可以直接使用暫存器，來映射被模擬的暫存器&lt;br /&gt;+ 很多組合語言指令，可以對應到被模擬的組合語言指令&lt;br /&gt;- 程式是不可移植的，換句話說，你的模擬器，不能在別種 CPU 上跑&lt;br /&gt;- 很難除錯跟維護&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;C 語言&lt;/b&gt;&lt;br /&gt;+ 可移植性，所以可以在不同的作業系統上跑&lt;br /&gt;+ 相對容易除錯跟維護&lt;br /&gt;+ 對硬體的不同假設，可以很快的測試&lt;br /&gt;- 通常 C 語言的程式比組合語言的程式慢&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;要寫模擬器，對所選擇的語言，瞭解得很透徹，是絕對必要的。因為模擬器的程式很複雜，你要最佳化你的模擬器，讓它跑得越快越好。電腦模擬器程式，絕對不是你越來學習程式語言的專案。&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-size: 15px; line-height: 22px;"&gt;-------------------------------------------------------------------------&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-size: 15px; line-height: 22px;"&gt;我從哪裡可以得到想模擬的硬體的資訊？&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-size: 15px; line-height: 22px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-size: 15px; line-height: 22px;"&gt;下列地方，你會想去看一看：&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-size: 15px; line-height: 22px;"&gt;&lt;br /&gt;&lt;b&gt;網路新聞群組&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, Geneva; font-size: medium; line-height: normal;"&gt;&lt;b&gt;comp.emulators.misc&lt;br /&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;這個新聞群組，討論模擬器一般的問題。許多模擬器作者會訂閱，雖然裡面雜音很多。如果要貼問題到這個新聞群組，記得先看 c.e.m FAQ 常見問題。&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, Geneva; font-size: medium; line-height: normal;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;comp.emulators.game-consoles&lt;br /&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;跟&amp;nbsp;comp.emulators.misc 一樣，不過這個新聞群組，專攻電視遊樂器的模擬器。如果要貼問題到這個新聞群組，記得先看 c.e.m FAQ 常見問題。&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, Geneva; font-size: medium; line-height: normal;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;comp.sys./emulated-system/&lt;br /&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;comp.sys.* 新聞群組階層，專攻特定的電腦系統。你閱讀這些新聞群組，可以得到有用的技術資料。典型的例子：&lt;br /&gt;&lt;br /&gt;com.sys.msx &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; MSX / MSX2 / &amp;nbsp;MSX2+ / TurboR 電腦&lt;br /&gt;comp.sys.sinclair &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Sinclair ZX80/ZX81/ZXSpectrum/QL&lt;br /&gt;comp.sys.apple2 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Apple ][&lt;br /&gt;&lt;br /&gt;如果要發問題到這個新聞群組，記得先看 FAQ&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, Geneva;"&gt;&lt;span class="Apple-style-span" style="font-size: medium; line-height: normal;"&gt;&lt;b&gt;alt.folklore.computers&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, Geneva;"&gt;&lt;span class="Apple-style-span" style="font-size: medium; line-height: normal;"&gt;&lt;b&gt;rec.games.video.classic&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;FTP&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, Geneva; font-size: medium; line-height: normal;"&gt;&amp;nbsp;&lt;a href="ftp://x2ftp.oulu.fi/" style="color: #004000; font-family: Arial, Helvetica, Geneva;" target="_blank"&gt;Console and Game Programming&amp;nbsp;&lt;/a&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, Geneva; font-size: medium; line-height: normal;"&gt;&amp;nbsp;&lt;a href="ftp://ftp.spies.com/" style="color: #004000; font-family: Arial, Helvetica, Geneva;" target="_blank"&gt;Arcade Videogame Hardware&amp;nbsp;&lt;/a&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, Geneva; font-size: medium; line-height: normal;"&gt;&amp;nbsp;&lt;a href="ftp://ftp.komkon.org/pub/EMUL8/" style="color: #004000; font-family: Arial, Helvetica, Geneva;" target="_blank"&gt;Computer History and Emulation&amp;nbsp;&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;WWW&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, Geneva; font-size: medium; line-height: normal;"&gt;&lt;a href="http://www.komkon.org/fms/" style="color: #004000; font-family: Arial, Helvetica, Geneva;" target="_blank"&gt;Marat Fayzullin Homepage&lt;/a&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, Geneva; font-size: medium; line-height: normal;"&gt;&lt;a href="http://valhalla.ph.tn.tudelft.nl/emul8/arcade.html" style="color: #004000; font-family: Arial, Helvetica, Geneva;" target="_blank"&gt;Arcade Emulation Programming Repository&amp;nbsp;&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, Geneva; font-size: medium; line-height: normal;"&gt;&lt;a href="http://www.classicgaming.com/EPR/" style="color: #004000; font-family: Arial, Helvetica, Geneva;" target="_blank"&gt;Emulation Programmer's Resource&amp;nbsp;&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-size: 15px; line-height: 22px;"&gt;-------------------------------------------------------------------------&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: 15px; line-height: 22px;"&gt;&lt;b&gt;如何模擬一個 CPU？&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: 15px; line-height: 22px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: 15px; line-height: 22px;"&gt;首先，如果你需要模擬一個標準的 Z80 或 6502 CPU，你可以使用&amp;nbsp;Marat Fayzullin 所寫的&amp;nbsp;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, Geneva; font-size: medium; line-height: normal;"&gt;&lt;a href="http://www.komkon.org/fms/EMUL8/" style="color: #004000; font-family: Arial, Helvetica, Geneva;" target="_blank"&gt;CPU 模擬器&lt;/a&gt;&amp;nbsp;當然有些限制。&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: 15px; line-height: 22px;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, Geneva; font-size: medium; line-height: normal;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: 15px; line-height: 22px;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, Geneva; font-size: medium; line-height: normal;"&gt;對那些想要自己寫 CPU 模擬核心，或是對其中的運作原理感性趣的人，我提供一個用 C 寫的範例架構如下，在真正的實做，你或許會考慮略過其中部份，或添加新的部份。&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: 15px; line-height: 22px;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, Geneva; font-size: medium; line-height: normal;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: 15px; line-height: 22px;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, Geneva; font-size: medium; line-height: normal;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: 15px; line-height: 22px;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, Geneva; font-size: medium; line-height: normal;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;div&gt;Counter=InterruptPeriod;&lt;/div&gt;&lt;div&gt;PC=InitialPC;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;for(;;)&lt;/div&gt;&lt;div&gt;{&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;OpCode=Memory[PC++];&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;Counter-=Cycles[OpCode];&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;switch(OpCode)&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;{&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;case OpCode1:&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;case OpCode2:&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;...&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;if(Counter&amp;lt;=0)&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;{&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;/* Check for interrupts and do other */&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;/* cyclic tasks here &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; */&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;...&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;Counter+=InterruptPeriod;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;if(ExitRequired) break;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;&lt;div&gt;}&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, Geneva; font-size: medium; line-height: normal;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;首先我們指定 CPU 週期記數器 (Counter)，以及指令位址記數器 (PC)&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: navy; font-family: Arial, Helvetica, Geneva;"&gt;&lt;span class="Apple-style-span" style="font-size: medium; line-height: normal;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: navy; font-family: Arial, Helvetica, Geneva;"&gt;&lt;span class="Apple-style-span" style="font-size: medium; line-height: normal;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;Counter=InterruptPeriod;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;PC=InitialPC;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;Counter&amp;nbsp;紀錄了到下一次系統中斷髮生，還剩多少個 CPU 週期。注意當 Counter 過其實，系統中斷不必然發生。你可以利用他來處理其事情：像是時鐘同步，更新螢幕的掃瞄線等。等等，我們會討論這些。PC 則紀錄了CPU 會從那個記憶體位址，讀取下次的執行的指令。&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;在我們給這些設定初始值之後，然後開始進入主迴圈：&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;div&gt;for(;;)&lt;/div&gt;&lt;div&gt;{&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;主迴圈也可以寫成這樣：&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;while(CPUIsRunning)&lt;/div&gt;&lt;div&gt;{&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;CPUIsRunning 是個布林值，這樣寫有個好處，你可以在任何時候，設&amp;nbsp;CPUIsRunning＝0，來終止主迴圈。然而在每個迴圈檢查這個變數，會花不少的 CPU，而我們應該儘量減少花費 CPU。同時，不要寫成下面這樣子：&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;while(1)&lt;/div&gt;&lt;div&gt;{&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;因為這樣寫，編譯器產生代碼，去檢查 1 為 "真" 或 "假"，你不會希望在主迴圈的每個迴圈，都去執行這多餘的動作。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;現在我們在主迴圈內，第一件事，就是去讀下一個執行碼，然後修改程式位址記數器。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;OpCode=Memory[PC++];&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;注意，這是最簡易的方式，來模擬讀取記憶體，但並非永遠可行。更通用的方式，來存取記憶體，稍後會提到。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;在提取操作碼後，會從 CPU 週期計數器，扣掉這個指令所需的週期數。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Counter-=Cycles[OpCode];&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Cycles[] 表內放的是每個操作碼，所需要的週期數。要特別注意，有些指令（例如條件式跳躍，或是呼叫副程式），需要的週期數，是跟操作後面緊接的參數而變動。這個可以在執行指令碼時調整。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;現在該是解譯操作碼，然後跟著執行的時候了：&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;switch(OpCode)&lt;/div&gt;&lt;div&gt;{&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;有一個錯誤的觀念，認為 switch 敘述事沒有效率的，因為會被編譯成 if () ...... else if () ........ 敘述。這只有在 case 數量很少的 switch 敘述，才會被這樣編譯。當有 100 到 200 個 case 的時候，switch 敘述通常會被翻譯成 jump 表格，jump 表格，其實蠻有效率的。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;有其他兩種替代方案，可以用來解譯操作碼。第一種方法，是建一個函式表，然後呼叫對應的函式。這種方式，比用 switch() 沒效率，因為呼叫函式，有額外的開銷。第二種方式，是建一個位址的表格，然後使用 goto 敘述。這種方式，稍比用 switch() 有效率一點，但這種方式，只適合用在編譯器支援未預定位址表格。其他的編譯器，不會允許你這樣定義表格。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;在成功解譯並執行一個操作碼後，這時候該去檢查有沒有任何系統中斷髮生。這時候，你也可以執行任何需要跟系統時鐘同步的工作。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;if(Counter&amp;lt;=0)&lt;/div&gt;&lt;div&gt;{ &amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;/* Check for interrupts and do other hardware emulation here */&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;...&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;Counter+=InterruptPeriod;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;if(ExitRequired) break;&lt;/div&gt;&lt;div&gt;}&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;有關週期性的工作，後面會提到。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;注意，我們並非直接指定&amp;nbsp;Counter=InterruptPeriod，而是執行&amp;nbsp;Counter+=InterruptPeriod，這樣會讓週期的計算更精確，因為有時候，Counter 會變成負數。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;同時，注意這&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;if(ExitRequired) break;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;這個敘述如果在每個迴圈都執行，成本太高，所以只有在中斷髮生時才檢查。這樣就可以在&amp;nbsp;ExitRequired=1 時，停止模擬，但又不會花太大的成本。&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: 15px; line-height: 22px;"&gt;-------------------------------------------------------------------------&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: 15px; line-height: 22px;"&gt;如何存取被模擬的記憶體？&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: 15px; line-height: 22px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-size: 15px; line-height: 22px;"&gt;模擬記憶體存取最簡單的方式，就是把它當成一個攤平的位元組或字元組陣列。如此，存取記憶體，就是一件微不足道的事情：&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-size: 15px; line-height: 22px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-size: 15px; line-height: 22px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-size: 15px; line-height: 22px;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;Data=Memory[Address1]; /* Read from Address1 */&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;Memory[Address2]=Data; /* Write to Address2 &amp;nbsp;*/&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;這種簡易的作法，並非永遠可行，原因如下：&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;分頁式的記憶體&lt;/b&gt;&lt;br /&gt;記憶體空間，可能被切成小塊，變成可以切換的頁，就是所謂的 banks。例如常見的，小記憶體位址空間（&amp;nbsp;64 KB），所使用的擴充記憶體。&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;映射的記憶體&lt;/b&gt;&lt;br /&gt;這塊記憶體空間，可以用數個不同的位址來存取。例如你寫資料到位址 $4000，然後你在位址$6000，及位址 $8000，你也可以讀到。&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;ROM 的讀取保護&lt;/b&gt;&lt;br /&gt;有些存到卡夾的軟體（例如 MSX 的遊戲），就算你寫到 ROM，回傳成功，事實上 ROM 上的資料也不會改變。這麼做，是為了做軟體保護。為了讓這樣的軟體，可以在你的模擬器運行，你需要把 ROM 設成唯讀。&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;記憶體映射到 I/O&lt;br /&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;系統可能有 I/O 裝置，映射到記憶體位址。存取這樣的記憶體位址，會產生特殊效果，所以必須被追蹤。&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;要成功處理上述問題，我們引進幾個函式：&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;Data=ReadMemory(Address1); &amp;nbsp;/* Read from Address1 */&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;WriteMemory(Address2,Data); /* Write to Address2 &amp;nbsp;*/&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;所有特殊的處理，包括記憶體分頁，記憶體映射，I/O 的處理，等等，都在函式內處理。&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;ReadMemory() 跟 WriteMemory() 對模擬器造成很大的 CPU 負擔，因為它們執行的非常頻繁。因此&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;這些函式必須寫得越有效率越好。這裡有一個存取分頁式記憶體的例子：&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;static inline byte ReadMemory(register word Address)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;&amp;nbsp;&amp;nbsp;return(MemoryPage[Address&amp;gt;&amp;gt;13][Address&amp;amp;0x1FFF]);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;static inline void WriteMemory(register word Address,register byte Value)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;&amp;nbsp;&amp;nbsp;MemoryPage[Address&amp;gt;&amp;gt;13][Address&amp;amp;0x1FFF]=Value;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;注意&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;那個 inline 關鍵字，它會指示編譯器，直接把這些函式碼，直接插入程式中，以取代函式呼叫。如果你的編譯器，不支援 inline 或是 _inline，試著改把這些函式，宣告成 static，有些編譯器（例如 Watcom C）最佳化時，會把短的函式，變成 inline 函式。&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;同時要記住，通常&amp;nbsp;ReadMemory() 的呼叫次數，是&amp;nbsp;WriteMemory() 的好幾倍。所以儘量把程式碼放到&amp;nbsp;WriteMemory()，讓&amp;nbsp;ReadMemory() 保持簡單。&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;&lt;b&gt;關於記憶體映射的一個小註記：&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;之前說過，被映射的記憶體，寫入一個位址，可以在其他位址讀取。這個功能，可以實做在&amp;nbsp;ReadMemory()，但是通常我們不這樣做，因為&amp;nbsp;ReadMemory() 比&amp;nbsp;WriteMemory() 更頻繁被呼叫。更有效率的方式，是實做記憶體映射到&amp;nbsp;&lt;span class="Apple-style-span" style="font-family: monospace;"&gt;WriteMemory()函式。&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;&lt;span class="Apple-style-span" style="font-family: monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial; font-size: 14px; font-weight: normal; line-height: 25px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial; font-size: 14px; font-weight: normal; line-height: 25px;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-size: 15px; line-height: 22px;"&gt;-------------------------------------------------------------------------&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-size: 15px; line-height: 22px;"&gt;週期性的運作有哪些？&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-size: 15px; line-height: 22px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-size: 15px; line-height: 22px;"&gt;週期性的運作，是被模擬的機器，固定一段時間，就會執行的工作，例如：&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-size: 15px; line-height: 22px;"&gt;螢幕更新&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-size: 15px; line-height: 22px;"&gt;VBlank 跟 HBlank 系統中斷&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-size: 15px; line-height: 22px;"&gt;更新時鐘&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-size: 15px; line-height: 22px;"&gt;更新聲音參數&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-size: 15px; line-height: 22px;"&gt;更新鍵盤跟搖桿狀態&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-size: 15px; line-height: 22px;"&gt;其他&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-size: 15px; line-height: 22px;"&gt;為了要模擬這樣的運作，你要替它們綁上固定的週期。例如 CPU 假設以 2.5 MHz，並且以 50 Hz 更新顯示（PAL 系統），所以 VBlank 系統中斷，就會每 5000 CPU 週期，發生一次。&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-size: 15px; line-height: 22px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-size: 15px; line-height: 22px;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;2500000/50 = 50000 CPU cycles&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-size: 15px; line-height: 22px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-size: 15px; line-height: 22px;"&gt;現在，假設整個螢幕是（包含 VBlank）是 256 條掃瞄線，實際上只有 212 條顯示（44 條在 VBlank），我們得到一條掃瞄線 195 個 CPU 週期，更新一次。&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-size: 15px; line-height: 22px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-size: 15px; line-height: 22px;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; 50000/256 ~= 195 CPU cyles&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-size: 15px; line-height: 22px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-size: 15px; line-height: 22px;"&gt;然後，我們應該產生一個 VBlank 系統中斷，然後在 VBlank 期間不做任何事情。&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-size: 15px; line-height: 22px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-size: 15px; line-height: 22px;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; (256-212)*50000/256 = 44*50000/256 ~= 8594 CPU cycles&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-size: 15px; line-height: 22px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-size: 15px; line-height: 22px;"&gt;小心計算每個週期性運作所需的 CPU 週期，然後使用他們的最大公約數，作為中斷檢查的週期，然後綁定給每個週期性運作。&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-size: 15px; line-height: 22px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-size: 15px; line-height: 22px;"&gt;-------------------------------------------------------------------------&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-size: 15px; line-height: 22px;"&gt;如何最佳化 C 程式碼？&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-size: 15px; line-height: 22px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-size: 15px; line-height: 22px;"&gt;首先，很多執行效率的增進，只要選對編譯器的編譯選項，就有了。根據我的經驗，下面的編譯選項，可以給你的最佳的執行速度：&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-size: 15px; line-height: 22px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-size: 15px; line-height: 22px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-size: 15px; line-height: 22px;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;div&gt;Watcom C++ &amp;nbsp; &amp;nbsp; &amp;nbsp;-oneatx -zp4 -5r -fp3&lt;/div&gt;&lt;div&gt;GNU C++ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; -O3 -fomit-frame-pointer&lt;/div&gt;&lt;div&gt;Borland C++&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;如果你發現，這三個編譯器，更好的最佳化參數，或是其他的編譯器的最佳化參數，請讓我知道。&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;一些關於把迴圈攤平的筆記&lt;/b&gt;&lt;br /&gt;雖然說，把迴圈攤平的這個最佳化選項，看起來是有用的。這個選項，會把短的迴圈，攤平成線性的敘述。但我的經驗告訴我，開啟這個選項，執行效率並不會提升太大，反而在某些情況下，程式反而會出現異常。&lt;br /&gt;&lt;br /&gt;最佳化 C 程式碼，比選擇編譯器選項，還難搞。跟執行你的程式的 CPU 有很大關係。有一些通用的規則，可以適用在所有 CPU。但別把它們當成真理。&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;使用分析程式&lt;/b&gt;&lt;br /&gt;用分析工具來執行你的程式（第一個就想到 GPROF），或許可以發現你從沒懷疑的神奇事情。你會發現毫不起眼的程式，頻繁的被執行，拖慢整個程式。最佳化這些程式碼，或是用組合語言改寫，可以讓你的程式執行效率飛耀。&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;不要用 C++&lt;/b&gt;&lt;br /&gt;不要用任何非用 C++ 不可的架構。C++ 跟純 C 比起來，額外的開銷比較大。&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;整數的型別&lt;/b&gt;&lt;br /&gt;儘量用你的 CPU 支持的整數型別。舉例 int 對比 short 或 long，這會減少編譯器產生不同整數行別的轉換。&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;暫存器配置&lt;br /&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;儘量減少在程式區塊配置太多變數，並且宣告他們為 register （大部分的編譯器已經會自動把變數變成 register）。特別是有很多通用暫存器的 CPU （PowerPC）這個優勢，就比有專屬暫存器（Intel 8086）來的強。&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;攤平小迴圈&lt;/b&gt;&lt;br /&gt;如果你剛好有小迴圈會執行好幾次，把小迴圈攤平成線性執行的程式，是好主意。對照前面提到的編譯器自動攤平選項。&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;算術移位 vs. 乘除法&lt;/b&gt;&lt;br /&gt;儘量用算術移位，如果你乘或除一個數是 2 的 n 次方（J/128==J&amp;gt;&amp;gt;7），算術移位在大多數的 CPU 都比較快。另外用位元的 &amp;amp; 來求餘數（J%128==J&amp;amp;0x7F）。&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-size: 15px; line-height: 22px;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial; font-size: 14px; line-height: 25px;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: medium;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-size: 15px; line-height: 22px;"&gt;-------------------------------------------------------------------------&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-size: 15px; line-height: 22px;"&gt;&lt;b&gt;什麼是高低字節順序？&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-size: 15px; line-height: 22px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-size: 15px; line-height: 22px;"&gt;所有的 CPU 通常都根據它們如何儲存資料到記憶體，分為幾個等級。除了非常特殊的種類，絕大多數的 CPU 分成兩個等級：&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-size: 15px; line-height: 22px;"&gt;High-endian CPU 先存放 higher byte of word。例如，在這樣的 CPU 你存放 0x12345678，記憶體的內容會長像這樣：&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;0 &amp;nbsp;1 &amp;nbsp;2 &amp;nbsp;3&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; +--+--+--+--+&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; |12|34|56|78|&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; +--+--+--+--+&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-size: 15px; line-height: 22px;"&gt;Low-endian CPU 先存放 lower byte of word。上述了例子，記憶體內容會看起來完全不一樣。&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: 15px; line-height: 22px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-size: 15px; line-height: 22px;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 0 &amp;nbsp;1 &amp;nbsp;2 &amp;nbsp;3&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; +--+--+--+--+&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; |78|56|34|12|&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; +--+--+--+--+&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-size: 15px; line-height: 22px;"&gt;典型 High-endian 的 CPU 有 6809，摩羅托拉 680x0 系列，PowerPC，及昇陽的 SPARC。Low-Endian 的 CPU 有 6502，及其後代 65816，及 zilog Z80，絕大多數 Intel CPU （8086，8088），DEC alpha 等。&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-size: 15px; line-height: 22px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-size: 15px; line-height: 22px;"&gt;當我們寫模擬器時，必須注意到，你模擬的 CPU，及執行你的模擬器的 CPU 的高低字節。舉例，我們想要模擬 low-endian 的 Z80，Z80 會先存 lower byte of word。如果你用的也是 low-endian 的 CPU，例如 intel 8006，那麼完全不需要特別處理。但是如果你用的是 high-endian 的 CPU，例如 PowerPC，這時候，要存放 16 bit 的 Z80 資料到記憶體，就會有問題。如果你的程式，必須兩種高低字節順序的 CPU 都能跑，問題就更複雜了。&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-size: 15px; line-height: 22px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-size: 15px; line-height: 22px;"&gt;一種解節高低字節順序的作法如下：&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-size: 15px; line-height: 22px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-size: 15px; line-height: 22px;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;div&gt;typedef union&lt;/div&gt;&lt;div&gt;{&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;short W; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;/* Word access */&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;struct &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;/* Byte access... */&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;{&lt;/div&gt;&lt;div&gt;#ifdef LOW_ENDIAN&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;byte l,h; &amp;nbsp; &amp;nbsp; /* ...in low-endian architecture */&lt;/div&gt;&lt;div&gt;#else&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;byte h,l; &amp;nbsp; &amp;nbsp; /* ...in high-endian architecture */&lt;/div&gt;&lt;div&gt;#endif&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;} B;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;} word; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;可以看到，可以用 w 存取整個字節。而每次如果你需要存取個別 byte，用 B.l 及 B.w，來對應高低位元組。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;如果你的程式，要在跨平台編譯，在程式開始執行前，你也許會想要測試，是否編譯有設定正確的 endian 旗標。這裡有如何測試的程式碼。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;int *T;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;T=(int *)"\01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0";&lt;/div&gt;&lt;div&gt;if(*T==1) printf("This machine is high-endian.\n");&lt;/div&gt;&lt;div&gt;else &amp;nbsp; &amp;nbsp; &amp;nbsp;printf("This machine is low-endian.\n");&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-size: 15px; line-height: 22px;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial; font-size: 14px; line-height: 25px;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-size: 15px; line-height: 22px;"&gt;-------------------------------------------------------------------------&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-size: 15px; line-height: 22px;"&gt;&lt;b&gt;如何讓程式具可移植性？&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-size: 15px; line-height: 22px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-size: 15px; line-height: 22px;"&gt;尚未撰寫。&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-size: 15px; line-height: 22px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-size: 15px; line-height: 22px;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial; font-size: 14px; line-height: 25px;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-size: 15px; line-height: 22px;"&gt;-------------------------------------------------------------------------&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-size: 15px; line-height: 22px;"&gt;&lt;b&gt;為何我要模組化我的程式？&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-size: 15px; line-height: 22px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-size: 15px; line-height: 22px;"&gt;大多數的電腦系統，是由幾塊比較大的晶片所組成，各自執行一部分的系統功能。有 CPU，顯示控制器，聲音產生器，及其他。有些晶片，有自己的記憶體，及周邊的硬體。&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-size: 15px; line-height: 22px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-size: 15px; line-height: 22px;"&gt;一個典型的模擬器，應該重現原有的系統設計，並實做每個子系統的功能，在不同的模組。這樣做，首先除錯會比較容易，因為問題會被獨立在各自的模組裡。其次模組化，可以讓你在別的模擬器，重複使用你的模組。電腦的硬體，其實標準化成度很高，你可以在不同型號的電腦，發現相同的 CPU，相同的顯示控制器。為某個晶片，模組化寫一次模擬的程式，會比你每次都重寫來的容易。&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-size: 15px; line-height: 22px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-size: 15px; line-height: 22px;"&gt;翻譯&lt;/span&gt;&lt;/span&gt;完畢&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5462403775530306599-8743192592332019924?l=shunyuan-chou.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shunyuan-chou.blogspot.com/feeds/8743192592332019924/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://shunyuan-chou.blogspot.com/2010/02/8.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5462403775530306599/posts/default/8743192592332019924'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5462403775530306599/posts/default/8743192592332019924'/><link rel='alternate' type='text/html' href='http://shunyuan-chou.blogspot.com/2010/02/8.html' title='模擬器學習日記 (8) - 模擬器原理'/><author><name>shunyuan</name><uri>http://www.blogger.com/profile/01707982560051207896</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5462403775530306599.post-6387835673200996561</id><published>2010-02-18T00:03:00.000-08:00</published><updated>2010-02-18T01:13:09.046-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mingw'/><category scheme='http://www.blogger.com/atom/ns#' term='mame'/><category scheme='http://www.blogger.com/atom/ns#' term='emulator'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>模擬器學習日記 (7) - 用MinGW 下，編譯 MAME plus</title><content type='html'>&lt;span class="Apple-style-span" style="font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-size: 14px; line-height: 25px;"&gt;在開始編譯 MAME plus 之前，先要把常用的命令，加到 /etc/profile：&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #0000f0;"&gt;alias vi=vim&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #0000f0;"&gt;alias ll='ls -lA --color=y'&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #0000f0;"&gt;alias mame_patch='patch -p0 -E'&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;用 MSYS （shell），又一個好處，是你可以把你常用的命令，取個容易記住的名字，這樣有些複雜的命令參數，你只要搞清楚一次，然後就可以忘記了，作法有兩個，一個是&amp;nbsp;&lt;span class="Apple-style-span" style="color: #0000f0;"&gt;alias&lt;/span&gt;，另外一個就是建&amp;nbsp;&lt;span class="Apple-style-span" style="color: #0000f0;"&gt;shell script&lt;/span&gt;。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #0000f0;"&gt;ll='ls -lA --color=y'&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;這個命令，就是以寬格式，列出所有的檔案，並根據檔案類別，給不同的顏色&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #0000f0;"&gt;mame_patch='patch -p0 -E'&lt;/span&gt;&amp;nbsp;&amp;nbsp; 這個命令，就是安裝 MAME diff 時，所需要的參數，我永遠都記不得。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;img height="254" src="http://x.ppxclub.com/attachment/201002/18/104200_1266474009197t.png" width="640" /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;言歸正傳，開始來編譯 MAME plus。首先下載最新的程式碼，到官網&amp;nbsp;&lt;a href="http://mameicons.free.fr/mame32p/" target="_blank"&gt;http://mameicons.free.fr/mame32p/&lt;/a&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;img height="640" src="http://x.ppxclub.com/attachment/201002/18/104200_12664740144GmS.png" width="578" /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;假設你下載的檔案存到&amp;nbsp;&lt;span class="Apple-style-span" style="color: #0000f0;"&gt;c:\temp\mameplus_src-0.136u3r4593-20100215.7z.zip，&lt;/span&gt;問題又來了，這次壓縮檔是 .7z 這種壓縮格式。到 7-Zip 官網&amp;nbsp;&lt;a href="http://www.7-zip.org/download.html" target="_blank"&gt;http://www.7-zip.org/download.html&lt;/a&gt;&amp;nbsp;下載命令列版的 7za.exe。&lt;/div&gt;&lt;div&gt;&lt;img height="286" src="http://x.ppxclub.com/attachment/201002/18/104200_1266475913zVkN.png" width="640" /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;假設你下載的檔案存到&amp;nbsp;&lt;span class="Apple-style-span" style="color: #0000f0;"&gt;c:\temp\7za465.zip&lt;/span&gt;，用下面的命令來安裝到你的 MSYS 下，現在萬事具備，可以開始來安裝 MAME plus 的原始碼了。&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #0000f0;"&gt;unzip /c/temp/7za465.zip -d /bin&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #0000f0;"&gt;rm /c/temp/7za465.zip&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;第一個要注意到的是 MAME plus 原始碼的發布形式，MAME plus 因為發佈的內容，除了程式以外，還包括了 UI 或用到的圖示、圖檔、等等。所以不是以 diff 的形式，而是以檔案的形式發佈。換句話說，就是你先安裝到 MAME 0.163u3，然後你再把 MAME plus 發佈的檔案蓋上去。這樣有一件事，就必須注意了，如果你是把 MAME plus 蓋到 MAME 0.163u3 上，當 MAME 出 0.163u4，你就不能直接用 patch 安裝 0.163u4 diff 了。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;所以，比較合理的作法，有一個目錄，專門放 MAME 官方的原始碼，當要編譯 MAME plus 時，先把 MAME 官方的原始碼，拷貝到 MAME plus 的目錄，然後在覆蓋 MAME plus 的原始檔。這也是我打算採用的作法。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;先清掉之前編譯 MAME 產生的檔案&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #0000f0;"&gt;cd /home/mame0136&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #0000f0;"&gt;make clean&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;清掉 MAME plus 如果有的話，並建立一個 mameplus 目錄&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #0000f0;"&gt;cd /home&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #0000f0;"&gt;rm mameplus -rf&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #0000f0;"&gt;mkdir makeplus&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #0000f0;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;拷貝 mame0136 的所有檔案到 mameplus 目錄&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #0000f0;"&gt;cp mame0136/* mameplus/ -rf&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #0000f0;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;安裝 MAME plus 原始碼&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #0000f0;"&gt;cd /home/mameplus&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #0000f0;"&gt;mv /c/temp/mameplus_src-0.136u3r4593-20100215.7z.zip &amp;nbsp;&lt;/span&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;&lt;span class="Apple-style-span" style="color: #0000f0;"&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #0000f0;"&gt;7za x -y&amp;nbsp;mameplus_src-0.136u3r4593-20100215.7z.zip&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #0000f0;"&gt;rm&amp;nbsp;mameplus_src-0.136u3r4593-20100215.7z.zip&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;編譯 MAME plus&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #0000f0;"&gt;make&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #0000f0;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;編譯過程，會出現下面的錯誤訊息：&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #f00000;"&gt;make: *** No rule to make target `src/emu/font/uismall.png', needed by `obj/windows/mamep/emu/uismall11.bdc'.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #f00000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;檢查了一下，發現需要安裝字型，&lt;span class="Apple-style-span" style="color: #444444; font-family: Verdana, 'Lucida Grande', Arial, Helvetica, sans-serif;"&gt;到官網&amp;nbsp;&lt;a href="http://x.ppxclub.com/link.php?url=http://mameicons.free.fr%2Fmame32p%2F" style="color: #3b5998; text-decoration: underline; word-break: break-all; word-wrap: break-word;" target="_blank"&gt;http://mameicons.free.fr/mame32p/&lt;/a&gt;&amp;nbsp;下載。&lt;/span&gt;&lt;/div&gt;&lt;div&gt;假設下載檔案在&amp;nbsp;&lt;span class="Apple-style-span" style="color: #0000f0;"&gt;c:\temp\mameplus_src_font-20070928.7z.zip&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #0000f0;"&gt;mv /c/temp/mameplus_src_font-20070928.7z.zip &amp;nbsp;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;.&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #0000f0;"&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #0000f0;"&gt;7za x -y&amp;nbsp;mameplus_src_font-20070928.7z.zip&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #0000f0;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;然後繼續編譯 MAME plus&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #0000f0;"&gt;make&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #0000f0;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;這樣就可以編譯出 MAME plus。&lt;/div&gt;&lt;div&gt;------------------------------------------------------------------------------------&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;b&gt;後記&lt;/b&gt;：如果有邊譯過 MAME plus 的人，或許會問，哪有那麼囉嗦？&lt;/div&gt;&lt;div&gt;------------------------------------------------------------------------------------&lt;/div&gt;&lt;/div&gt;&lt;div&gt;很多人都應該下載過 MAME plus 的原始檔，然後按照裡面的 compile.htm 的說明，編譯過 MAME plus，沒有那麼囉嗦，為什麼？最主要的目的，在於搞清楚這些流程，包括如何安裝原始碼，如何安裝工具，然後在建立一個可以開發程式的環境。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;在 Linux 的環境下，可以達到目的的方式有很多，命令列的方式，有一個好處，每一行執行的命令，都可以寫到一個 shell script，日後有變動，稍加修改 shell script，然後就可以自動執行了。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;如果需要透過 Windows UI 工具，這意謂需要手動，舉例用 7-zip 或是 WinRAR 解開壓縮檔，用檔案總管，拷貝檔案從一個目錄到另一個目錄，等等。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;當然可以寫 DOS 批次檔，但是 DOS 批次檔比不上 shell script 彈性大。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;下次找一些關於模擬器的原理的資料來研究。&lt;/div&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5462403775530306599-6387835673200996561?l=shunyuan-chou.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shunyuan-chou.blogspot.com/feeds/6387835673200996561/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://shunyuan-chou.blogspot.com/2010/02/7-mingw-mame-plus.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5462403775530306599/posts/default/6387835673200996561'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5462403775530306599/posts/default/6387835673200996561'/><link rel='alternate' type='text/html' href='http://shunyuan-chou.blogspot.com/2010/02/7-mingw-mame-plus.html' title='模擬器學習日記 (7) - 用MinGW 下，編譯 MAME plus'/><author><name>shunyuan</name><uri>http://www.blogger.com/profile/01707982560051207896</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5462403775530306599.post-9058629944133049059</id><published>2010-02-17T10:02:00.000-08:00</published><updated>2010-07-12T21:06:33.343-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mingw'/><category scheme='http://www.blogger.com/atom/ns#' term='mame'/><category scheme='http://www.blogger.com/atom/ns#' term='emulator'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>模擬器學習日記 (6) - 用MinGW 下，編譯 MAME 及 MAME 更新</title><content type='html'>&lt;span class="Apple-style-span" style="font-size: 14px; line-height: 25px;"&gt;&lt;b&gt;首先從簡單的開始，編譯正式版的 MAME，&lt;/b&gt;目前的版本 0.136，從 MAME 官網下載原始碼。&lt;/span&gt;&lt;br /&gt;&lt;div&gt;&lt;img height="245" src="http://x.ppxclub.com/attachment/201002/17/104200_1266400171bRsn.png" width="400" /&gt;&lt;/div&gt;&lt;div&gt;網址在這裡：&lt;a href="http://mamedev.org/release.html" target="_blank"&gt;http://mamedev.org/release.html&lt;/a&gt;&lt;/div&gt;&lt;div&gt;假設你下載的檔案存在 c:\temp\mame0136s.exe 用下面的命令，安裝 source code 到 /home 下，且：&lt;/div&gt;&lt;div&gt;&lt;div&gt;&amp;nbsp;&lt;span class="Apple-style-span" style="color: #0000f0;"&gt;cd /home&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #0000f0;"&gt;&amp;nbsp;mkdir mame0136&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #0000f0;"&gt;&amp;nbsp;cd mame0136&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #0000f0;"&gt;&amp;nbsp;mv /c/temp/mame0136s.exe&amp;nbsp;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;.&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #0000f0;"&gt;&amp;nbsp;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;&lt;b&gt;.&lt;/b&gt;&lt;/span&gt;/mame0136s.exe&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;然後會出現原始檔安裝路徑的視窗，選 Extract。習慣上為每一個版本的 MAME 建一個目錄。&lt;/div&gt;&lt;div&gt;&lt;img height="181" src="http://x.ppxclub.com/attachment/201002/17/104200_1266400967Z0U7.png" width="400" /&gt;&lt;/div&gt;&lt;div&gt;最後執行命令，將 mame0136s.exe 移出，這個已經不需需要了。&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;span class="Apple-style-span" style="color: #0000f0;"&gt;rm ./mame0136s.exe&lt;/span&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;工作目錄下，內容會像這樣。&lt;/div&gt;&lt;div&gt;&lt;img height="105" src="http://x.ppxclub.com/attachment/201002/17/104200_1266404656arsK.jpg" width="400" /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;好戲上場了，這是侯我們可以來編譯 MAME。執行下面的命令：&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #0000f0;"&gt;make&lt;/span&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;然後你應該就會看到像下面的畫面，MAME 是個大專案，所以編譯要好一會。&lt;/div&gt;&lt;div&gt;&lt;img height="290" src="http://x.ppxclub.com/attachment/201002/17/104200_1266404970DtCe.png" width="400" /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;編譯完成後，工作目錄下，會有這些檔案：&lt;/div&gt;&lt;div&gt;&lt;img height="236" src="http://x.ppxclub.com/attachment/201002/17/104200_1266407320gmZK.png" width="400" /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;接著，我們想跟目前開發中的 MAME 同步。&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;MAME 官方，在這個網址，以 diff 的形式發佈程式更新。&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;網址：&lt;a href="http://mamedev.org/updates.html" target="_blank"&gt;http://mamedev.org/updates.html&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;img height="236" src="http://x.ppxclub.com/attachment/201002/17/104200_12664078879695.png" width="400" /&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;什麼是 diff？聽起來很神氣。diff 就是用工具軟體，將兩個版本間，有差異的部份，用大家講好的格式，存下來。用 diff 的好處是，只要存兩個版本不同的那些行（包括新增、修改、刪除），所以檔案非常小。大家可以看到，MAME 原始檔，壓縮後還有快 15 MB，可是不同版本中的差異，只有幾百 KB。&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;下載 0136u1_diff.zip，0136u2_diff.zip，0136u3_diff.zip，然後用 patch 命令，來 更新 MAME 的原始碼。 &amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; line-height: 15px;"&gt;&lt;span class="Apple-style-span" style="color: #0000f0;"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;patch -p0 -E &amp;lt;&lt;/span&gt;&lt;/span&gt;&lt;i style="margin: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-indent: 0px;"&gt;&lt;span class="Apple-style-span" style="color: #0000f0;"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;diffname.diff&lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #0000f0; font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: medium; line-height: 15px;"&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="color: black; font-family: Arial; font-size: 14px; font-style: normal; line-height: 25px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #0000f0; font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: medium; line-height: 15px;"&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="color: black; font-family: Arial; font-size: 14px; font-style: normal; line-height: 25px;"&gt;關於 patch 的參數的一些說明，執行命令&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Arial; font-size: 14px; font-style: normal; line-height: 25px;"&gt;patch --help | less&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: black; font-family: Arial; font-size: 14px; font-style: normal; line-height: 25px;"&gt;會出現下面的畫面，參數很多，不過我們關心的是&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Arial; font-size: 14px; font-style: normal; line-height: 25px;"&gt;&amp;nbsp;-p0&lt;/span&gt;&lt;span class="Apple-style-span" style="color: black; font-family: Arial; font-size: 14px; font-style: normal; line-height: 25px;"&gt;&amp;nbsp;跟&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Arial; font-size: 14px; font-style: normal; line-height: 25px;"&gt;-E&lt;/span&gt;&lt;span class="Apple-style-span" style="color: black; font-family: Arial; font-size: 14px; font-style: normal; line-height: 25px;"&gt;，這兩個參數，意思說，不要跳過任何一層的目錄，如果 patch 之後，內容是空的，就移除這個檔案。&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;img height="276" src="http://x.ppxclub.com/attachment/201002/17/104200_1266412655gDL6.png" width="400" /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;如果你的目錄結構，跟 MAME 官方一樣（當然是，從官方下載的不是嗎？），就依樣畫葫蘆了。假設你下載的檔案都是存在 c:\temp\0136u1_diff.zip, c:\temp\0136u2_diff.zip, c:\temp\0136u3_diff.zip，執行下面的命令，來安裝這三個 diff 檔。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #0000f0;"&gt;cd /home/mame0136&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #0000f0;"&gt;mv /c/tem/0136u1_diff.zip&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: #0000f0;"&gt;&amp;nbsp;.&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #0000f0;"&gt;mv /c/tem/0136u2_diff.zip &amp;nbsp;&lt;/span&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;&lt;span class="Apple-style-span" style="color: #0000f0;"&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #0000f0;"&gt;mv /c/tem/0136u3_diff.zip &amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: #0000f0;"&gt;.&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;現在遇到問題了，沒有工具解開 zip 檔，Linux 是用 unzip，用 Google 找了別人編譯好的的 MinGW 的 unzip.exe：&lt;/div&gt;&lt;div&gt;完整版：&lt;a href="http://suanyuan.myweb.hinet.net/mingw32-unzip-5.52-3.zip" target="_blank"&gt;http://suanyuan.myweb.hinet.net/mingw32-unzip-5.52-3.zip&lt;/a&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;單獨版：&lt;a href="http://suanyuan.myweb.hinet.net/unzip.exe" target="_blank"&gt;http://suanyuan.myweb.hinet.net/unzip.exe&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;假設你已經有&amp;nbsp;&lt;span class="Apple-style-span" style="color: #0000f0;"&gt;c:\temp\unzip.exe&lt;/span&gt;&amp;nbsp;接下來就要來安裝 MAME 的 diff 了，順序很重要。用以下的命令來安裝：&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #0000f0;"&gt;cp /c/temp/unzip.exe &amp;nbsp;/bin/unzip.exe&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #0000f0;"&gt;cd /home/mame0136&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #0000f0;"&gt;unzip 01036u1_diff.zip&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #0000f0;"&gt;unzip 01036u2_diff.zip&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #0000f0;"&gt;unzip 01036u3_diff.zip&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;解出&amp;nbsp;&lt;span class="Apple-style-span" style="color: #0000f0;"&gt;0136u1.diff,&amp;nbsp;0136u2.diff,&amp;nbsp;0136u3.diff&amp;nbsp;&lt;/span&gt;三個檔，然後執行 patch 命令如下：&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;span class="Apple-style-span" style="color: #0000f0;"&gt;patch -p0 -E &amp;lt; 0136u1.diff&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #0000f0;"&gt;&amp;nbsp;patch -p0 -E &amp;lt; 0136u2.diff&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #0000f0;"&gt;&amp;nbsp;patch -p0 -E &amp;lt; 0136u3.diff&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #0000f0;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;你會看到每個 diff 都修改很多檔案，所以 patch 也要跑一下子。patch 成功後，可以把 diff 檔，都刪除。&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #0000f0;"&gt;rm &amp;nbsp;*.diff &amp;nbsp; -f&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #0000f0;"&gt;rm 0136u* &amp;nbsp;-f&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;然後我們重新編譯 MAME，命令如下：&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #0000f0;"&gt;make clean&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #0000f0;"&gt;make&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #0000f0;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;今天因為摸索如何解決 unzip 的問題耽誤了不少時間，不過最後還是把 MAME 更新到 0.106u3。下次來編譯 MAME plus。&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5462403775530306599-9058629944133049059?l=shunyuan-chou.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shunyuan-chou.blogspot.com/feeds/9058629944133049059/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://shunyuan-chou.blogspot.com/2010/02/6-mingw-mame-mame.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5462403775530306599/posts/default/9058629944133049059'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5462403775530306599/posts/default/9058629944133049059'/><link rel='alternate' type='text/html' href='http://shunyuan-chou.blogspot.com/2010/02/6-mingw-mame-mame.html' title='模擬器學習日記 (6) - 用MinGW 下，編譯 MAME 及 MAME 更新'/><author><name>shunyuan</name><uri>http://www.blogger.com/profile/01707982560051207896</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5462403775530306599.post-1597843154360112275</id><published>2010-02-17T09:55:00.001-08:00</published><updated>2010-02-17T09:55:36.185-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mingw'/><category scheme='http://www.blogger.com/atom/ns#' term='mame'/><category scheme='http://www.blogger.com/atom/ns#' term='emulator'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>模擬器學習日記 (5) - MinGW 下，用的文字編輯器</title><content type='html'>&lt;span class="Apple-style-span" style="font-size: 14px; line-height: 25px;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;div&gt;有幾個選擇：&lt;/div&gt;&lt;div&gt;(1) 直接從檔案總管，用編輯器編輯你想要修改的檔案。&lt;/div&gt;&lt;div&gt;(2) 從 MSYS 的環境下，用 shell script 或是 batch file 把檔案傳名傳給 Windows 下的文字編輯器，例如 Notepad++。&lt;/div&gt;&lt;div&gt;(3) 另外就是選擇， MSYS (shell)文字模式，可以支援的編輯器，例如 vi，joe，.....。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;第一個作法，基本上不需要安裝任何程式。&lt;/div&gt;&lt;div&gt;第二個作法，也可行，但是在 MSYS 下的檔名，跟 Windows 下的檔名是不一樣，這個有點 tricky&lt;/div&gt;&lt;div&gt;第三個作法，用 Linux 文字模式常用的編輯器，像是 vi 或是 joe 的 MinGW 版。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;另外，安裝完後 MSYS，有個文件 c:\msys\1.0\doc\msys\readme.rtf 很有參考價值，之前提到的路徑映射，就是從這的檔案得知的（不然你以為我那麼聰明，無師自通？），這個檔案也說明了要如何從 MSYS 終呼叫 Windows 的編輯器，及如何傳檔名給 Window 的編輯器。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;b&gt;第一種作法，如下：&lt;/b&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;什麼也不用做。&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;第二種作法，如下：&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;將下面的 shell script 存到 c:\temp 目錄下，檔名就叫 edit（在這裡下載&amp;nbsp;&lt;span class="Apple-style-span" style="color: #0000f0;"&gt;&lt;a href="http://suanyuan.myweb.hinet.net/edit" target="_blank"&gt;http://suanyuan.myweb.hinet.net/edit&lt;/a&gt;&lt;/span&gt;&amp;nbsp;）&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #0000f0;"&gt;#!/bin/sh&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #0000f0;"&gt;#--------------------------------------------&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #0000f0;"&gt;# shell script to invoke notepad++&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #0000f0;"&gt;#--------------------------------------------&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #0000f0;"&gt;/c/Program\ Files/Notepad++/notepad++.exe "$@"&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;執行 MSYS，執行下面命令，建立&amp;nbsp;&lt;span class="Apple-style-span" style="color: #0000f0;"&gt;/usr/local/bin&lt;/span&gt;&amp;nbsp;目錄&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #0000f0;"&gt;mkdir &amp;nbsp;/usr/local/bin&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;然後考 edit script 到 /usr/local/bin 下&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #0000f0;"&gt;cp &amp;nbsp;/c/temp/edit &amp;nbsp;/usr/local/bin/&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;然後你只要打&amp;nbsp;&lt;span class="Apple-style-span" style="color: #0000f0;"&gt;edit&amp;nbsp;&lt;/span&gt;就會開啟 Notepad++&lt;span class="Apple-style-span" style="color: #0000f0;"&gt;&amp;nbsp;，&lt;/span&gt;這個作法有一個缺點，當你從 MinGW shell 執行 edit，一直要到你編輯結束，控制權才會回到 MinGW，換言之，你不能同時做兩件以上的事，這個非常不方便，我試著在命令前加&lt;span class="Apple-style-span" style="color: #0000f0;"&gt;start&lt;/span&gt;&amp;nbsp;，結果就會出錯，說找不到 notepad++，看來是個 bug，解決的方法，把&amp;nbsp;&lt;span class="Apple-style-span" style="color: #0000f0;"&gt;'/c/Program\ Files/Notepad++'&amp;nbsp;&lt;/span&gt;加到 path 環境變數，以後要執行&lt;span class="Apple-style-span" style="color: #0000f0;"&gt;&amp;nbsp;notepad++&amp;nbsp;&lt;/span&gt;就直接&lt;span class="Apple-style-span" style="color: #0000f0;"&gt;&amp;nbsp;start notepad++.exe&amp;nbsp;&lt;span class="Apple-style-span" style="color: black;"&gt;：&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #0000f0;"&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #0000f0;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;第三種方法，如下：&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #0000f0;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;Google 找了一下，有被 port 到 MinGW 的文字編輯器，目前只有 vim，所以用它吧。&lt;/div&gt;&lt;div&gt;下載：&lt;a href="http://sourceforge.net/projects/mingw/files/MSYS%20vim/vim-7.2-1/vim-7.2-1-msys-1.0.11-bin.tar.lzma/download" target="_blank"&gt;http://sourceforge.net/projects/mingw/files/MSYS%20vim/vim-7.2-1/vim-7.2-1-msys-1.0.11-bin.tar.lzma/download&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;假設你的檔案是下載到&lt;span class="Apple-style-span" style="color: #0000f0;"&gt;&amp;nbsp;c:/temp/vim-7.2-1-msys-1.0.11-bin.tar.lzma.tar&lt;/span&gt;&amp;nbsp;執行以下命令將 vim 解到 MSYS 的根目錄下。&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #0000f0;"&gt;cd /&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #0000f0;"&gt;mov /c/temp/vim-7.2-1-msys-1.0.11-bin.tar.lzma.tar /&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #0000f0;"&gt;tar -x --lzma -f vim-7.2-1-msys-1.0.11-bin.tar.lzma.tar&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #0000f0;"&gt;rm -f&amp;nbsp;vim-7.2-1-msys-1.0.11-bin.tar.lzma.tar&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #0000f0;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;然後呢？不會用 vim 是吧？執行&lt;span class="Apple-style-span" style="color: #0000f0;"&gt;&amp;nbsp;vimtutor&amp;nbsp;&lt;/span&gt;就會教你上手。有沒有搞錯，在 Windows 下執行 vim？沒搞錯，學會 vim 基本上，所有 Linux 機器 default 都會裝 vim，所以你一旦上手，以後就算只能用 telnet 或 ssh 連線，連上 Linux 機器，要在上面編輯設定，也難不倒。有沒有，又感覺牛了一點？&lt;/div&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;這裡有一個中文的 vim 教學，鳥哥的私房菜&amp;nbsp;&lt;a href="http://linux.vbird.org/linux_basic/0310vi.php" target="_blank"&gt;http://linux.vbird.org/linux_basic/0310vi.php&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;不過學習模擬器，重點還是在模擬器，如果真的 vim 覺得很不習慣，那就用 notepad++。&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;下次來編譯 MAME，測試看看是不是萬事齊備了，可以編譯最複雜的模擬器（MAME 的大神，真是太厲害了）。&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5462403775530306599-1597843154360112275?l=shunyuan-chou.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shunyuan-chou.blogspot.com/feeds/1597843154360112275/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://shunyuan-chou.blogspot.com/2010/02/5-mingw.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5462403775530306599/posts/default/1597843154360112275'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5462403775530306599/posts/default/1597843154360112275'/><link rel='alternate' type='text/html' href='http://shunyuan-chou.blogspot.com/2010/02/5-mingw.html' title='模擬器學習日記 (5) - MinGW 下，用的文字編輯器'/><author><name>shunyuan</name><uri>http://www.blogger.com/profile/01707982560051207896</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5462403775530306599.post-7187434392862865660</id><published>2010-02-17T09:54:00.000-08:00</published><updated>2010-02-17T10:13:21.190-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mingw'/><category scheme='http://www.blogger.com/atom/ns#' term='mame'/><category scheme='http://www.blogger.com/atom/ns#' term='emulator'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>模擬器學習日記 (4) - 設定 MSYS 使用 MAME MinGW package</title><content type='html'>&lt;span class="Apple-style-span" style="font-size: 14px; line-height: 25px;"&gt;上 MAME 官網&amp;nbsp;&lt;a href="http://mamedev.org/tools/" target="_blank"&gt;http://mamedev.org/tools/&lt;/a&gt;，看了一下編譯所需套件（我的電腦是 Vista 32）：&lt;/span&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;img height="547" src="http://x.ppxclub.com/attachment/201002/14/104200_1266141230uAl7.png" width="640" /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;下載在這裡：&lt;span class="Apple-style-span" style="color: #0000f0;"&gt;&lt;u&gt;http://aarongiles.com/mirror/tools/mingw-mame-w32-20100102.exe&lt;/u&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;下載了套件 mingw-mame-win32-20100102 (win32)，然後勇敢的執行，安裝時，指定你的 MinGW 目錄&lt;/div&gt;&lt;div&gt;&lt;img src="http://x.ppxclub.com/attachment/201002/14/104200_126614193244Dq.png" /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;要注意到 MAME 版的 MinGW 執行檔的路徑，跟 MinGW default 的路徑不一樣喔&lt;/div&gt;&lt;div&gt;MAME 的 MinGW 的路徑是&amp;nbsp;&lt;span class="Apple-style-span" style="color: #0000f0;"&gt;c:\MinGW\mingw64-w32\bin&lt;/span&gt;&lt;/div&gt;&lt;div&gt;官方的 MinGW 的路徑&amp;nbsp;&lt;span class="Apple-style-span" style="color: #0000f0;"&gt;c:\MinGW\bin&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;原因我猜 MinGW current 的版版太舊了，還是 2008 的版本，沒有考慮到 x64 作業系統。這個差異，我們應該可以在 MSYS 的設定檔中搞定（通常改變一下設定檔，你就可以切換 MinGW 的版本），如果是用 command line，就沒那麼貼心。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;讓我們來把 MSYS 設定的比較好用吧。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;(1) 先改變 MSYS 的視窗大小，default 80x25 有點太小，把它改成 120x54，執行你桌面上的 MSYS 捷徑，你會看到標題為 MINGW32 的視窗，然後在視窗標題左上角，按右鍵，選預設值，然後設定如下圖。這樣你的 MinGW shell 視窗，就會有 120x54 這麼大，然後會保留 1200 行的內容。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;img src="http://x.ppxclub.com/attachment/201002/16/104200_1266314936fim6.png" /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;(2) MSYS 是在 Windows 下，模擬 Linux shell 環境，而在 Linux 的環境下，所有的系統資源，都被當成檔案，MSYS 自動幫我們產生了以下的路徑映射：&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #0000f0;"&gt;c:/msys/1.0 &amp;nbsp;--&amp;gt; /&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #0000f0;"&gt;c:/ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; --&amp;gt; /c/&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #0000f0;"&gt;d:/ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; --&amp;gt; /d/&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #0000f0;"&gt;.....&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #0000f0;"&gt;z:/ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; --&amp;gt; /z/&lt;/span&gt;&lt;/div&gt;&lt;div&gt;另外還有一個檔案&amp;nbsp;&lt;span class="Apple-style-span" style="color: #0000f0;"&gt;c:\msys\1.0\etc\fstab&amp;nbsp;&lt;/span&gt;映射了 mingw 的路徑。如果日後你有需要，可以添加自己的路徑。&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #0000f0;"&gt;c:/mingw &amp;nbsp; &amp;nbsp; &amp;nbsp; --&amp;gt; /mingw&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;(3) 因為我們安裝了 MAME 版本的 MinGW 套件，所以路徑應該跟內定的不一樣。可以看到 MSYS 加上了&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: #f00000;"&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;. &amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: #f00000;"&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;/usr/local/bin&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: #f00000;"&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;/mingw/bin&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: #f00000;"&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;/bin&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: #f00000;"&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;&lt;img height="298" src="http://x.ppxclub.com/attachment/201002/16/104200_12663154241PA1.png" width="640" /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;這四個目錄，在 "PATH" 這個環境變數之前，需要改的是&amp;nbsp;&lt;span class="Apple-style-span" style="color: #0000f0;"&gt;/mingw/bin&lt;/span&gt;&amp;nbsp;這個路徑。改在哪裡呢？MSYS 執行後，會自動執行&amp;nbsp;&lt;span class="Apple-style-span" style="color: #0000f0;"&gt;/etc/profile&lt;/span&gt;&amp;nbsp;這個 shell script，所以改&amp;nbsp;&lt;span class="Apple-style-span" style="color: #0000f0;"&gt;c:\msys\1.0\etc\profile&lt;/span&gt;&amp;nbsp;這個檔。所以就把&amp;nbsp;&lt;span class="Apple-style-span" style="color: #0000f0;"&gt;/mingw/bin&lt;/span&gt;&amp;nbsp;路徑改成&amp;nbsp;&lt;span class="Apple-style-span" style="color: #0000f0;"&gt;/mingw/mingw64-win32/bin&amp;nbsp;&lt;/span&gt;如下圖&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;&lt;img height="491" src="http://x.ppxclub.com/attachment/201002/16/104200_1266317705127n.png" width="640" /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;改完存檔，然後重新啟動 MSYS。下命令 g++ --version，應該看到 g++ 的版本已經是最新的了。&lt;/div&gt;&lt;div&gt;&lt;img height="302" src="http://x.ppxclub.com/attachment/201002/16/104200_12663182316XoN.png" width="640" /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;這篇看起來很複雜，其實照著改只是幾個動作而已。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;不過不知道有沒人想到要問，為何這麼大費周章？不是加個路徑到系統環境變數 "PATH"，就好了嗎，幹麼這麼大費周章？看起來也很複雜？&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;理由：&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;(1) 想辦法讓使用環境，跟我在 Linux 上的使用環境接近，這樣到時候，我要在 Linux 上編譯，只要修改很小的地方。你總不會想說先開發在 Windows 上，然後哪天你的模擬器夠嗆，出來個牛人幫你 port 到 Linux 上，使用 MSYS 可以在變動幅度最小的情況下，使用相同的工具，make，sed，grep ....讓你的程式可以在 Linux 跑&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;(2) Linux shell 真的太方便了，alias history pushd popd ...... 還有 shell script 可以讓你要重複的動作，自動化。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;這篇太長了，下次我們再來談如何設定文字編輯器。&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5462403775530306599-7187434392862865660?l=shunyuan-chou.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shunyuan-chou.blogspot.com/feeds/7187434392862865660/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://shunyuan-chou.blogspot.com/2010/02/4-msys-mame-mingw-package.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5462403775530306599/posts/default/7187434392862865660'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5462403775530306599/posts/default/7187434392862865660'/><link rel='alternate' type='text/html' href='http://shunyuan-chou.blogspot.com/2010/02/4-msys-mame-mingw-package.html' title='模擬器學習日記 (4) - 設定 MSYS 使用 MAME MinGW package'/><author><name>shunyuan</name><uri>http://www.blogger.com/profile/01707982560051207896</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5462403775530306599.post-5271648846644744980</id><published>2010-02-17T09:51:00.001-08:00</published><updated>2010-07-12T21:07:15.393-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mingw'/><category scheme='http://www.blogger.com/atom/ns#' term='mame'/><category scheme='http://www.blogger.com/atom/ns#' term='emulator'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>模擬器學習日記 (3) - 三種使用 MinGW 的方式，選擇 MSYS</title><content type='html'>&lt;span class="Apple-style-span" style="font-size: 14px; line-height: 25px;"&gt;這次，談談 MinGW 的編譯環境。&lt;/span&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;上一次，我們是透過改變 cmd 的搜尋路徑，&lt;span class="Apple-style-span" style="color: #0000f0;"&gt;set path=c:\MinGW\bin;%path%&amp;nbsp;&lt;/span&gt;讓 Windows 作業系統，可以找到 gcc 編譯器。可是這樣不太方便，另外一個問題，是用 notepad 來編輯程式，這可不太方便。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;所以這次，我們談談如何設定一環境，讓開發程式，變得簡單一點。有哪些選擇呢？&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;(1) 改 Windows 使用者環境變數 ＋ Notepad++&lt;/b&gt;&lt;/div&gt;&lt;div&gt;用系統管理員的權限，把 c:\MinGW\bin 加到系統環境變數，這樣無論你在哪一個目錄，你都可以執行 gcc。另外編輯程式，改成用 Notepad++。這樣的設定，對於自己編譯 MAME 應該就夠了。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Notepad++ 在這裡下載：&lt;a href="http://notepad-plus.sourceforge.net/tw/site.htm" target="_blank"&gt;http://notepad-plus.sourceforge.net/tw/site.htm&lt;/a&gt;，這是一個免費而強大的文字編輯器，作者是台灣人，所以介面支援簡繁體中文。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;img height="223" src="http://x.ppxclub.com/attachment/201002/14/104200_12661199921F7r.png" width="400" /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #393939; font-family: Verdana, sans-serif; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 12px; line-height: 20px;"&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Times New Roman';"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;(2) codeblocks&lt;/span&gt;&lt;/b&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;另外網路上很多人用的是的是 codeblocks，這是一個跨平台，支援多種編譯器 gcc 及 vc 及其他，的整合環境。編輯，編譯，除錯都在一起。看起來很優，但是我想事情從簡單開始，有興趣的人，不妨試看看。另外有一件事要先提醒，codeblocks 是有自己的專案檔（XML格式），如何讓沒有使用 codeblocks 的人也能編譯你的專案？&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;下載：&lt;a href="http://www.codeblocks.org/downloads" target="_blank"&gt;http://www.codeblocks.org/downloads&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;img height="315" src="http://x.ppxclub.com/attachment/201002/14/104200_1266123591ed0d.png" width="400" /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;(2) MinGW 官方，推薦的是 MSYS&lt;/b&gt;&lt;span class="Apple-style-span" style="color: #393939; font-family: Verdana, sans-serif; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 12px; line-height: 20px;"&gt;&lt;b&gt;&amp;nbsp;-&amp;nbsp;&lt;/b&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Times New Roman';"&gt;&lt;b&gt;Minimal SYStem, is a Bourne Shell for Window&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #393939; font-family: 'Times New Roman';"&gt;&lt;span class="Apple-style-span" style="font-size: large; line-height: 20px;"&gt;&lt;span class="Apple-style-span" style="color: black; font-family: Arial; font-size: 14px; line-height: 25px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #393939; font-family: 'Times New Roman';"&gt;&lt;span class="Apple-style-span" style="font-size: large; line-height: 20px;"&gt;&lt;span class="Apple-style-span" style="color: black; font-family: Arial; font-size: 14px; line-height: 25px;"&gt;什麼是 MSYS，簡單講，就是把 Linux 下的文字模式，命令列環境，包括強大的 shell ，搬到 Windows 上來。如果你有在 Linux 上使用過 bash，你就會知道這個有多方便。&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #393939; font-family: 'Times New Roman';"&gt;&lt;span class="Apple-style-span" style="font-size: large; line-height: 20px;"&gt;&lt;span class="Apple-style-span" style="color: black; font-family: Arial; font-size: 14px; line-height: 25px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;MSYS 的下載在這裡：http://downloads.sourceforge.net/mingw/MSYS-1.0.11.exe&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;也是一樣勇敢的給它執行下去，建議不要更改內定的安裝路徑&amp;nbsp;&lt;span class="Apple-style-span" style="color: #0000f0;"&gt;c:\msys\1.0&amp;nbsp;&lt;/span&gt;。安裝的最後一個步驟，會讓 MSYS 可以連結到你的 MinGW，這個步驟叫 post install （安裝後的行動）：&lt;/div&gt;&lt;div&gt;(1) 要不要執行 post install，勇敢的回答&amp;nbsp;&lt;span class="Apple-style-span" style="color: #0000f0;"&gt;y&lt;/span&gt;，&lt;/div&gt;&lt;div&gt;(2) 是否已經裝了 MinGW，回答&lt;span class="Apple-style-span" style="color: #0000f0;"&gt;&amp;nbsp;y&lt;/span&gt;&lt;/div&gt;&lt;div&gt;(3) MingW 的路徑，回答&amp;nbsp;&lt;span class="Apple-style-span" style="color: #0000f0;"&gt;c:/MinGW&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;img height="316" src="http://x.ppxclub.com/attachment/201002/14/104200_1266125256NnEq.png" width="400" /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;安裝完，你的桌面多一個 MSYS 的圖示，執行後畫面如下圖，有很多 Linux 上常用的命令都已經在了。不過我發現 gcc 的版本是 3.4.5 是乎有點老（不是說老的不好，而是有的模擬器需要新版本 gcc才能編譯）&lt;/div&gt;&lt;div&gt;&lt;img height="317" src="http://x.ppxclub.com/attachment/201002/14/104200_12661257703BVC.png" width="400" /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #393939; font-family: Verdana, sans-serif; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: large; line-height: 20px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Times New Roman';"&gt;總之，我們已經把 MSYS 安裝好了。你可以試看看，下 help，看有哪些內建命令可以用。看起來有點複雜，是不是開始有一點點覺得 "牛" 了呢？&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #393939; font-family: Verdana, sans-serif; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: large; line-height: 20px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Times New Roman';"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #393939; font-family: Verdana, sans-serif; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: large; line-height: 20px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Times New Roman';"&gt;這篇已經太長了，下一篇，我們再來看看，是不是需要更新 gcc，及選一個文字編輯器。&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #393939; font-family: Verdana, sans-serif; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: large; line-height: 20px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Times New Roman';"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5462403775530306599-5271648846644744980?l=shunyuan-chou.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shunyuan-chou.blogspot.com/feeds/5271648846644744980/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://shunyuan-chou.blogspot.com/2010/02/3-mingw-msys.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5462403775530306599/posts/default/5271648846644744980'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5462403775530306599/posts/default/5271648846644744980'/><link rel='alternate' type='text/html' href='http://shunyuan-chou.blogspot.com/2010/02/3-mingw-msys.html' title='模擬器學習日記 (3) - 三種使用 MinGW 的方式，選擇 MSYS'/><author><name>shunyuan</name><uri>http://www.blogger.com/profile/01707982560051207896</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5462403775530306599.post-958189847070591160</id><published>2010-02-17T09:50:00.000-08:00</published><updated>2010-07-12T21:07:50.293-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mingw'/><category scheme='http://www.blogger.com/atom/ns#' term='mame'/><category scheme='http://www.blogger.com/atom/ns#' term='emulator'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>模擬器學習日記 (2) - 安裝 MinGW 這個 Windows 版的 GNU 編譯器</title><content type='html'>&lt;span class="Apple-style-span" style="font-size: 14px; line-height: 25px;"&gt;慚愧，過了一個半月，沒有半點進展。&lt;/span&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Verdana;"&gt;工欲善其事，必先利其器。今天新來把開發工具搞定，選用&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="line-height: 26px;"&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana;"&gt;MinGW - Minimalist GNU for Windows，這個 GNU 開發工具的 Windows 迷你版。&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="line-height: 26px;"&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="line-height: 26px;"&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana;"&gt;(1) 下載 MinGW 從這裡&amp;nbsp;&lt;span class="Apple-style-span" style="font-family: Arial; line-height: 25px;"&gt;&lt;a href="http://sourceforge.net/projects/mingw/files/" target="_blank"&gt;http://sourceforge.net/projects/mingw/files/&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: large; line-height: 26px;"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana;"&gt;&lt;img height="225" src="http://x.ppxclub.com/attachment/201002/13/104200_1266079174nKbU.png" width="400" /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: large; line-height: 26px;"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: large; line-height: 26px;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial; font-size: 14px; line-height: 25px;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: large; line-height: 26px;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial; font-size: 14px; line-height: 25px;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: large; line-height: 26px;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial; font-size: 14px; line-height: 25px;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small; line-height: 26px;"&gt;(2) 目前的版本是 MinGW-5.1.6，給它勇敢的執行下去。這可是高科技，線上下載安裝。安裝中有個選項，是 download（只有下載不安裝） 或是 download and install（下載並安裝），選下載並安裝。&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Verdana;"&gt;&lt;span class="Apple-style-span" style="line-height: 26px;"&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small; line-height: 26px;"&gt;(3) 中間還會有個選項，問你是要安裝 previous （上一版），current（目前版本），candidate（也就是所謂測試版），選目前版本。&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Verdana;"&gt;&lt;span class="Apple-style-span" style="line-height: 26px;"&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small; line-height: 26px;"&gt;(4) 接下來的選項有點複雜，問你要安裝哪幾種編譯器，default 只有 base，建議連 g++，跟 MinGW Make 也都裝。g++ 就是 gnu c++ 編譯器。MinGW Make 幫你處理一些 Linux 跟 Windows 上，一些 Make 工具的微小差異。不知道我在說什麼沒關係，因為我也不是很清楚，老實的告訴你。&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Verdana;"&gt;&lt;span class="Apple-style-span" style="line-height: 26px;"&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small; line-height: 26px;"&gt;(5) 接下來這個重要，要安裝到哪裡，建議不要改，就 c:\MinGW。別擔心你的 C: 槽會暴掉，跟微軟的則學不太一樣，GNU 的工具都是小而美，幾十 MB 就搞定，不像微軟，動不動就上 GB。&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Verdana;"&gt;&lt;span class="Apple-style-span" style="line-height: 26px;"&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small; line-height: 26px;"&gt;(6) 然後你就會看到神奇的事情發生，MinGW 安裝程式，開始下載，檔案都很小，一下子就下載並安裝好了。&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Verdana;"&gt;&lt;span class="Apple-style-span" style="line-height: 26px;"&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small; line-height: 26px;"&gt;(7) 你在你的程式群組，應該會看到一個新的 MinGW 群組。裡面有到 MinGW 官網的連結，MinGW 更新，跟 MinGW 移除。神奇！&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Verdana;"&gt;&lt;span class="Apple-style-span" style="line-height: 26px;"&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small; line-height: 26px;"&gt;(8) 當然要試看看，編譯器是不是好了。編譯一個程式試看看。&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Verdana;"&gt;&lt;span class="Apple-style-span" style="line-height: 26px;"&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Verdana;"&gt;&lt;span class="Apple-style-span" style="line-height: 26px;"&gt;&lt;span style="font-size: small;"&gt;先確定你有 c:\study 目錄，沒有用&amp;nbsp;&lt;span class="Apple-style-span" style="color: #0000f0;"&gt;mkdir c:\study&lt;/span&gt;&amp;nbsp;自己建（故意叫 study，裝聰明;-p），把下面標藍色的程式，用 notepad 存成&amp;nbsp;&lt;span class="Apple-style-span" style="color: #0000f0;"&gt;c:\study\test.c&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Verdana;"&gt;&lt;span class="Apple-style-span" style="line-height: 26px;"&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Verdana;"&gt;&lt;span class="Apple-style-span" style="line-height: 26px;"&gt;&lt;span class="Apple-style-span" style="color: #0000f0;"&gt;&lt;span style="font-size: small;"&gt;#include &lt;stdio.h&gt;&lt;/stdio.h&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Verdana;"&gt;&lt;span class="Apple-style-span" style="line-height: 26px;"&gt;&lt;span class="Apple-style-span" style="color: #0000f0; font-size: small;"&gt;int main(int argc, char *argv[])&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Verdana;"&gt;&lt;span class="Apple-style-span" style="line-height: 26px;"&gt;&lt;span class="Apple-style-span" style="color: #0000f0; font-size: small;"&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Verdana;"&gt;&lt;span class="Apple-style-span" style="line-height: 26px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span" style="color: #0000f0;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: #0000f0; font-size: small;"&gt;printf("Hello World!\n");&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Verdana;"&gt;&lt;span class="Apple-style-span" style="line-height: 26px;"&gt;&lt;span class="Apple-style-span" style="color: #0000f0; font-size: small;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Verdana;"&gt;&lt;span class="Apple-style-span" style="line-height: 26px;"&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small; line-height: 26px;"&gt;接著，開一個命令視窗（cmd），跟著在 cmd 下標藍色的命令&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Verdana;"&gt;&lt;span class="Apple-style-span" style="line-height: 26px;"&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Verdana;"&gt;&lt;span class="Apple-style-span" style="line-height: 26px;"&gt;&lt;span class="Apple-style-span" style="color: #0000f0; font-size: small;"&gt;set path=c:\MinGW\bin;%path%&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Verdana;"&gt;&lt;span class="Apple-style-span" style="line-height: 26px;"&gt;&lt;span class="Apple-style-span" style="color: #0000f0; font-size: small;"&gt;c:&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Verdana;"&gt;&lt;span class="Apple-style-span" style="line-height: 26px;"&gt;&lt;span class="Apple-style-span" style="color: #0000f0; font-size: small;"&gt;cd \study&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Verdana;"&gt;&lt;span class="Apple-style-span" style="line-height: 26px;"&gt;&lt;span class="Apple-style-span" style="color: #0000f0; font-size: small;"&gt;gcc -o test.exe test.c&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Verdana;"&gt;&lt;span class="Apple-style-span" style="line-height: 26px;"&gt;&lt;span class="Apple-style-span" style="color: #0000f0; font-size: small;"&gt;test.exe&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Verdana;"&gt;&lt;span class="Apple-style-span" style="line-height: 26px;"&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small; line-height: 26px;"&gt;你應該會看到&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Verdana;"&gt;&lt;span class="Apple-style-span" style="line-height: 26px;"&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Verdana;"&gt;&lt;span class="Apple-style-span" style="line-height: 26px;"&gt;&lt;span class="Apple-style-span" style="color: #0000f0; font-size: small;"&gt;Hello World!&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Verdana;"&gt;&lt;span class="Apple-style-span" style="line-height: 26px;"&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small; line-height: 26px;"&gt;(9) 慶賀一下，我們也會用 MinGW 寫程式了。&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Verdana;"&gt;&lt;span class="Apple-style-span" style="line-height: 26px;"&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small; line-height: 26px;"&gt;下次，我將會研究一下，用 MinGW 開發程式，可以用的整合環境。沒人真的只用 notepad 寫程式啦。&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5462403775530306599-958189847070591160?l=shunyuan-chou.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shunyuan-chou.blogspot.com/feeds/958189847070591160/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://shunyuan-chou.blogspot.com/2010/02/2-mingw-windows-gnu.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5462403775530306599/posts/default/958189847070591160'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5462403775530306599/posts/default/958189847070591160'/><link rel='alternate' type='text/html' href='http://shunyuan-chou.blogspot.com/2010/02/2-mingw-windows-gnu.html' title='模擬器學習日記 (2) - 安裝 MinGW 這個 Windows 版的 GNU 編譯器'/><author><name>shunyuan</name><uri>http://www.blogger.com/profile/01707982560051207896</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5462403775530306599.post-847792190451186500</id><published>2010-01-01T10:27:00.001-08:00</published><updated>2010-02-17T10:00:09.154-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mingw'/><category scheme='http://www.blogger.com/atom/ns#' term='mame'/><category scheme='http://www.blogger.com/atom/ns#' term='emulator'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>模擬器學習日記 (1)</title><content type='html'>&lt;b&gt;模擬器學習日記 (1) - 我是新手入門，開始有系統的，學習模擬器的撰寫&lt;/b&gt;&lt;br /&gt;以前有些亂改模擬器的經驗（其實也不算是經驗，因為是亂入）。&lt;br /&gt;經過了一些工作經驗及磨練，發現最好的學習方法就是實做，即便是一個實做一個最簡單的模擬器，也比亂入及亂改有的沒的要來的腳踏實地。    &lt;br /&gt;所以呢，為了興趣（興趣很重要，喜歡寫程式，喜歡模擬器），打算利用週六、日的時間，開始學習並實做一個簡單的模擬器，就像是 MAME 的大神說的，先拿一個最簡單的入手，先瞭解運做的原理。&lt;br /&gt;一開始會是一個非常簡單、非常原始的東西，然後會整理我的資料，寫在部落格里，只是做個紀錄，沒特別用意，不算是教學（因為我程度還不到那裡），也不會管看的人，看了會有什麼想法。&lt;br /&gt;&lt;u&gt;另外這是做興趣的，沒有 schedule，也沒有截止日期，看我想做到哪裡就做到哪裡。&lt;/u&gt;&lt;br /&gt;這篇算是給自己的開宗明義。下一篇，試看看能不能要模擬的 target machine （目標機器聽起來很怪），定出來。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5462403775530306599-847792190451186500?l=shunyuan-chou.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shunyuan-chou.blogspot.com/feeds/847792190451186500/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://shunyuan-chou.blogspot.com/2010/01/1.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5462403775530306599/posts/default/847792190451186500'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5462403775530306599/posts/default/847792190451186500'/><link rel='alternate' type='text/html' href='http://shunyuan-chou.blogspot.com/2010/01/1.html' title='模擬器學習日記 (1)'/><author><name>shunyuan</name><uri>http://www.blogger.com/profile/01707982560051207896</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
