Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

WATCOM C & DOS4GW

0 views
Skip to first unread message

ł·¤H

unread,
Jul 1, 1996, 3:00:00 AM7/1/96
to

有個問題請教各位:
在DOS下的中斷呼叫中有些需要位址址表,
如底下改變調色盤的函式
void LoadPalette(char* palette)
{
union REGS r;
struct SREGS sr;

r.x.dx = FP_OFF(palette);
sr.es = FP_SEG(palette);

r.x.ax=0x1012;
r.x.bx=0;
r.x.cx=256;
int86x(0x10,&r,&r,&sr);
}

中是分別以FP_OFF和FP_SEG取得offset跟segment

但是在DOS4GW下這樣做是乎會有問題,要怎樣修改?
是要特定配置一塊真實模式下的記憶體再傳入嗎?
請有經驗的人麻煩指點一下,已經困擾很久了(而且資料真的很少)。

【我是雪人≡雪人是我】

平凡人

unread,
Jul 1, 1996, 3:00:00 AM7/1/96
to

rjc...@netra.wow.net.tw (雪人) wrote:

> r.x.ax=0x1012;
> r.x.bx=0;
> r.x.cx=256;
> int86x(0x10,&r,&r,&sr);
>}

>中是分別以FP_OFF和FP_SEG取得offset跟segment

是有問題,Watcom\C中的int86x及int386x似乎有些毛病,我曾經以之呼叫DPMI函式,會出現GP錯誤訊息
,但改以組合語言呼叫中段的副程式,卻很正常,所以上面的程式用組合語言寫成函式,再由C來呼叫
會比較好。

有問題再POST或Email給我。Email: roge...@ms9.hinet.net

寫程式是會上癮的,不信!!
試試看就知道了


Art Tsay

unread,
Jul 2, 1996, 3:00:00 AM7/2/96
to

roge...@ms9.hinet.net (平凡人) wrote:

>rjc...@netra.wow.net.tw (雪人) wrote:

>> r.x.ax=0x1012;
>> r.x.bx=0;
>> r.x.cx=256;
>> int86x(0x10,&r,&r,&sr);
>>}

>>中是分別以FP_OFF和FP_SEG取得offset跟segment

>有問題再POST或Email給我。Email: roge...@ms9.hinet.net

1. Watcom 的 int86x/int386x 沒有問題, 我一直在使用, 不過呢, 對於記憶體位址的定
義, 要有技巧.

2. 你所使用的 FP_OFF(), FP_SEG() 在 DOS4GW 模式下需重定義, 因為在 dos4gw 下
是 flat mode address, 使用原 fp_off(), fp_seg() 將自 ds 及 ip 取得位址,
但此時的 ds 是 selector, 不是 segment, 所以, 怎麼能傳給 int86x() 使用呢?
它要的是 segment of conventional memory, 而你給的是 memory selector, 對嗎?

所以,
#define FP_OFFSET(x) x & 0xffff
#define FP_SEGMEN(x) x > 4 & 0xffff
(我不敢肯定, 因為 library 已好久沒有改了, 可能生疏了.)

至於為什麼使用組語就會正常, 我不知道, 可能使用到正確的memory 了吧, 敝人不使
用組語, 無法深究.

3. watcom, dos4gw 的資料坊間似乎是比較少, 但不要忘了 watcom 有 infobase. 個人
覺得不買原版的人沒法子使用 watcom, 買原版的人則得更重視它所附的文件, 畢竟
也只有這些資料可看了. 其實我不喜歡 watcom 的手冊, 看起來有11本, 八公斤重,
可是呢, 重點都有提到, 卻沒有深入, 而且例子不夠. 你既然是寫 game, 不妨到
rec.game.programmer 看看, 那邊的人大多數都是使用 watcom 的.


Art Tsay 850702


平凡人

unread,
Jul 3, 1996, 3:00:00 AM7/3/96
to

roge...@ms9.hinet.net (平凡人) wrote:

>rjc...@netra.wow.net.tw (雪人) wrote:

>>有個問題請教各位:
>>在DOS下的中斷呼叫中有些需要位址址表,
>>如底下改變調色盤的函式
>>void LoadPalette(char* palette)
>>{
>> union REGS r;
>> struct SREGS sr;

>> r.x.dx = FP_OFF(palette);
>> sr.es = FP_SEG(palette);

>> r.x.ax=0x1012;
>> r.x.bx=0;
>> r.x.cx=256;
>> int86x(0x10,&r,&r,&sr);
>>}

>>中是分別以FP_OFF和FP_SEG取得offset跟segment

>>但是在DOS4GW下這樣做是乎會有問題,要怎樣修改?
>>是要特定配置一塊真實模式下的記憶體再傳入嗎?
>>請有經驗的人麻煩指點一下,已經困擾很久了(而且資料真的很少)。

>是有問題,Watcom\C中的int86x及int386x似乎有些毛病,我曾經以之呼叫DPMI函式,會出現GP錯誤訊息
>,但改以組合語言呼叫中段的副程式,卻很正常,所以上面的程式用組合語言寫成函式,再由C來呼叫
>會比較好。

抱歉,有一點補充,int 86x() 和 int386x()的問題是Watcom C/C++
10.0的問題,後來Watcom有出更新版本10.0a,修正了這個錯誤。

----- 小石子 -----


Wen-Jei Lee

unread,
Jul 3, 1996, 3:00:00 AM7/3/96
to

In article <31d75810...@news.wow.net.tw>,

rjc...@netra.wow.net.tw (雪人) wrote:
>有個問題請教各位:
>在DOS下的中斷呼叫中有些需要位址址表,
>如底下改變調色盤的函式
>void LoadPalette(char* palette)
>{
> union REGS r;
> struct SREGS sr;
>
> r.x.dx = FP_OFF(palette);
> sr.es = FP_SEG(palette);
>
> r.x.ax=0x1012;
> r.x.bx=0;
> r.x.cx=256;
> int86x(0x10,&r,&r,&sr);
>}
>
>中是分別以FP_OFF和FP_SEG取得offset跟segment
>
>但是在DOS4GW下這樣做是乎會有問題,要怎樣修改?
>是要特定配置一塊真實模式下的記憶體再傳入嗎?
>請有經驗的人麻煩指點一下,已經困擾很久了(而且資料真的很少)。
>
> 【我是雪人≡雪人是我】


whelp pguide -> "How do I simulate a real-mode interrupt with DOS/4GW" 和
"DOS/4GW : Interrupt 31H DPMI functions - DOS memory management services"

0 new messages