程式設計工作室 (program)   
一般區 精華區 休閒聊天 個人郵件 個人設定 重新登入

←回列表   ↑上一篇   ↓下一篇           

發信人:lgwlu@ms1.hinet.net (Lgw Lu)
日期:Thu, 11 Jul 1996 01:07:18 GMT
標題:C 講座 5
信群:tw.bbs.comp.language    看板:
代號:<4rvv7e$bos@netnews.hinet.net>
組織:DCI HiNet



       戰   鬥   世   家   C 語言講座                  #5

                                 作者: Lgw Lu
                                 E-Mail: lgwlu@ms1.hinet.net
---------------------------------------------------------------

                   < 寫 GAME 利器 - Watcom C/C++ >

前言:

     相信大家玩的很多遊戲,大部分都是用 Watcom C/C++ 所寫的, 我
  想最大原因因該是它附的一套授權的 32 bits DOS Extender DOS4GW
  ;DOS4GW 讓大家進入保護模式的 flat mode 中,可以享受到線性記憶
  體的方便,以下便介紹一些 Watcom C/C++ 寫作技巧.
  (P.S Runtime 版 DOS4GW 只支援到 32MB memory)

內文:

     首先,我先抱怨一下!! Watcom C/C++ DOS 下竟不附 IDE ,且在
  windows 下的 IDE 實在有夠..... 遜!! 附一套 VI 編輯器,也是...
  唉!! 我覺得它叫 SHELL 程式還比較好,叫 IDE 實在是............
  (P.S EDITER 外掛,MAKE ,DEBUG,.... 都是 Call 別的程式,它叫
   IDE ???? 且畫面 #@#$!)

     說了一堆離題的東東,現在切入正題!!以下 Watcom C/C++ 簡稱WC

     (1) 差異

             當你用 WC 32bits 時,首先要有一些 16bits 和 32bits
         資料型別不同的觀念,這樣才不會出錯.

         16 bits                     32 bits

         char      1 byte            char        1 byte
         wchar_t   2 bytes           wchar_t     2 bytes
         int       2 bytes           short int   2 bytes
         long      4 bytes           int         4 bytes
                                     long        4 bytes=>注意

         還有在 flat mode 因為是線性記憶體 So 指標都是 near,
         不要再設啥 far .
         (P.S 除非是切到 real mode 時用的 pointer)
         另外,因為線性記憶體,So pointer 位址表示是用 line 方式

         Ex: char *ptr=0xa0000;  // 直接定址,要再用 0xa0000000

         當你在 DOS4GW 下寫 ISR 時,它會幫你自動建一 real mode
         的 ISR ,So 不用擔心 ISR 寫法,照以前寫法就可.

         若你想 call real mode 的中斷處理程式時,一部份 DOS4GW
         在 flat mode 下都有相對應程式,如 int 33h ,int 10h ..
         但是像 int 21h,或是需要得到一 real mode DATA 時 ,
         DOS4GW Runtime 版有支援 DPMI 300h 的功能可供使用, 用
         法 on line HELP 已有!!

     (2) 組語

             雖然 WC 最佳化做的不錯,但還是有人希望能配合 ASM
         以發揮更大威力,在此提供數種方法.

         1. 編譯指令

             由於 WC 不支援線上組語,造成一些不便,So WC 在 10.0
             以後的版本可以用編譯指令來達到相同目的.
             (P.S. 9.5 版只能用來寫機械碼.........)

             附帶說明 WC 支援 register 及 stack 兩種方式傳遞參
             數,在以後的範例中我會指明是用哪種方式,記得一點 你
             安裝 WC 時最好兩種方式的 LIB 都裝上, 如此適用性會
             較佳!!

             /* REGISTER 方式 */

             void setvmode(int);    // 記得要宣告
             #pragma aux setvmode = \
                " int 0x10 " , \
                parm[eax] \
                ^^^^^^^^^^ 用 eax 傳參數

                若有回值用 value [ebx];  ==> 記得加 ;
                                  ^^^ 用你想用的

             這樣 WC 就會在程式這段加入機器碼,所以你宣告函式一
             定要在前一行,不然就找不到函式起始位址.

         2. WASM

             這套是 WC 附的,雖然功能不強,但寫 ASM 措措有餘!!

             /* REGISTER 方式 */

             .C 中

             extern "C" void _setvmode(int);

             #pragma aux _setvmode "*_" parm caller [eax];
             // 這行若不寫,在此例中也是可以,但不寫,
                參數傳遞順序是 eax edx ecx ebx ....
                且自己要加上底現在 函式名之後,此為 WC register
                傳遞格式.

             .ASM 中

              public _setvmode_

              ; 後面的 _ 是 WC 傳 register 參數時必須加的.

               .......
               ......
              _setvmode_  proc near
                          int 10h
                          ret
              _setvmode_  endp
              .....

              ; 在此只列出片段
              ; 當然任何 ASSMBER 都可用傳 STACK 方式,WASM 亦可


         3. MASM / TASM

            /* 用 STACK 方式 */

           .C 中

           // 同一般 C Call ASM 方法,在此不累述

           .ASM 中

           ;MASM                          ;TASM

           .386p                          ideal
                                          p386
           model   flat,c                 model flat,c

           .code                          codeseg

           public _setvmode               proc C _setvmode
                                              arg mode:dword
           ......
           ....                               public _setvmode
                                              uses  eax
           _setvmode  proc C
                      uses eax,mode:dword     mov  eax,mode
                                              int  10h
                      mov  eax,mode           ret
                      int  10h            endp
                      ret                  ......
           _setvmode  endp                  .....
           .....                           ....
           ...

     好了!! 小弟眼睛又開始酸了,暫時就寫到這,以後會再談到 WC 的
  ,若還有問題,老話一句 - " 拿信來砸我吧 !! "

預告:
     下篇將舉出使用巨集的好處及注意事項!! 記得 " 收看 " ...
  < 巨集之評析 >

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

                  <<< 本文版權屬於作者 >>>
     本文章可自由引用,拷貝,傳閱,但需保持本文章之完整性,從標題
  到最後版權宣告,且不能用來做商業用途!!

     若有任何問題,或是錯誤之處,歡迎來信批評指教!! 謝謝!!






←回列表   ↑上一篇   ↓下一篇