📄 00000005.htm
字号:
<HTML><HEAD> <TITLE>BBS水木清华站∶精华区</TITLE></HEAD><BODY><CENTER><H1>BBS水木清华站∶精华区</H1></CENTER> <BR> <BR> 战 斗 世 家 C 语言讲座 #5 <BR> <BR> 作者: Lgw Lu <BR> E-Mail: <A HREF="mailto:lgwlu@ms1.hinet.net">lgwlu@ms1.hinet.net</A> <BR>--------------------------------------------------------------- <BR> <BR> < 写 GAME 利器 - Watcom C/C++ > <BR> <BR>前言: <BR> <BR> 相信大家玩的很多游戏,大部分都是用 Watcom C/C++ 所写的,我 <BR> 想最大原因因该是它附的一套授权的 32 bits DOS Extender DOS4GW; <BR> DOS4GW 让大家进入保护模式的 flat mode 中,可以享受到线性记忆 <BR> 体的方便,以下便介绍一些 Watcom C/C++ 写作技巧。 <BR> (P.S Runtime 版 DOS4GW 只支援到 32MB memory) <BR> <BR>内文: <BR> <BR> 首先,我先抱怨一下!! Watcom C/C++ DOS 下竟不附 IDE,且在 <BR> windows 下的 IDE 实在有够..... 逊!! 附一套 VI 编辑器,也是... <BR> 唉!! 我觉得它叫 SHELL 程式还比较好,叫 IDE 实在是............ <BR> (P.S EDITER 外挂,MAKE,DEBUG,.... 都是 Call 别的程式,它叫 <BR> IDE ???? 且画面 #@#$!) <BR> <BR> 说了一堆离题的东东,现在切入正题!!以下 Watcom C/C++ 简称WC <BR> <BR> (1) 差异 <BR> <BR> 当你用 WC 32bits 时,首先要有一些 16bits 和 32bits <BR> 资料型别不同的观念,这样才不会出错. <BR> <BR> 16 bits 32 bits <BR> <BR> char 1 byte char 1 byte <BR> wchar_t 2 bytes wchar_t 2 bytes <BR> int 2 bytes short int 2 bytes <BR> long 4 bytes int 4 bytes <BR> long 4 bytes=>注意 <BR> <BR> 还有在 flat mode 因为是线性记忆体 So 指标都是 near, <BR> 不要再设啥 far。 <BR> (P.S 除非是切到 real mode 时用的 pointer) <BR> 另外,因为线性记忆体,So pointer 位址表示是用 line 方式 <BR> <BR> Ex: char *ptr=0xa0000; // 直接定址,要再用 0xa0000000 <BR> <BR> 当你在 DOS4GW 下写 ISR 时,它会帮你自动建一 real mode <BR> 的 ISR,So 不用担心 ISR 写法,照以前写法就可. <BR> <BR> 若你想 call real mode 的中断处理程式时,一部份 DOS4GW <BR> 在 flat mode 下都有相对应程式,如 int 33h,int 10h... <BR> 但是像 int 21h,或是需要得到一 real mode DATA 时, <BR> DOS4GW Runtime 版有支援 DPMI 300h 的功能可供使用,用 <BR> 法 on line HELP 已有!! <BR> <BR> (2) 组语 <BR> <BR> 虽然 WC 最佳化做的不错,但还是有人希望能配合 ASM <BR> 以发挥更大威力,在此提供数种方法. <BR> <BR> 1. 编译指令 <BR> <BR> 由於 WC 不支援线上组语,造成一些不便,So WC 在 10.0 <BR> 以後的版本可以用编译指令来达到相同目的。 <BR> (P.S. 9.5 版只能用来写机械码.........) <BR> <BR> 附带说明 WC 支援 register 及 stack 两种方式传递参 <BR> 数,在以後的□例中我会指明是用哪种方式,记得一点 你 <BR> 安装 WC 时最好两种方式的 LIB 都装上, 如此适用性会 <BR> 较佳!! <BR> <BR> /* REGISTER 方式 */ <BR> <BR> void setvmode(int); // 记得要宣告 <BR> #pragma aux setvmode = \ <BR> " int 0x10 " , \ <BR> parm[eax] \ <BR> ^^^^^^^^^^ 用 eax 传参数 <BR> <BR> 若有回值用 value [ebx]; ==> 记得加 ; <BR> ^^^ 用你想用的 <BR> <BR> 这样 WC 就会在程式这段加入机器码,所以你宣告函式一 <BR> 定要在前一行,不然就找不到函式起始位址. <BR>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -