Linux 版 (精华区)

发信人: netiscpu (夜☆星光点点☆), 信区: Linux
标  题: ◇ 之五 -- 写 GAME 利器 - Watcom C/C++
发信站: 紫 丁 香 (Sun Nov 15 21:53:00 1998), 转信


寄信人: guest.bbs@hgluo.hust.edu.cn 
标  题: ◇ 之五 -- 写 GAME 利器 - Watcom C/C++
发信站: 华南理工大学 BBS木棉站
日  期: Thu Feb 20 14:30:28 1997

       战   斗   世   家   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 的
  ,若还有问题,老话一句 - " 拿信来砸我吧 !! "

预告:
     下篇将举出使用巨集的好处及注意事项!! 记得 " 收看 " ...
  < 巨集之评析 >

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

                  <<< 本文版权属於作者 >>>
     本文章可自由引用,拷贝,传阅,但需保持本文章之完整性,从标题
  到最後版权宣告,且不能用来做商业用途!!

     若有任何问题,或是错误之处,欢迎来信批评指教!! 谢谢!!




--
m;32m※ 转寄:.华南网木棉站 bbs.gznet.edu.cn.[FROM: mtlab.hit.edu.cn]
--

                              Enjoy Linux!
                          -----It's FREE!-----

※ 来源:.紫 丁 香 bbs.hit.edu.cn.[FROM: mtlab.hit.edu.cn]
[百宝箱] [返回首页] [上级目录] [根目录] [返回顶部] [刷新] [返回]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:207.073毫秒