注意, 每個handler 的位置都要不同, 所以最多需要256 個opcode 0cch (如果256 個
interrupt 都要對映回實際模式). 然後再攔截exception 3 (最好將 interrupt 3
也指向同一個handler), 然後從此handler 檢查被中斷的地方, 以便判斷原來發生的
中斷編號(因為中斷編號可以從return offset - int 3 array start offset 判斷
出來), 然後再用DPMI 去模擬中斷, 把該對映的暫存器都轉換好, 然後就ok 了。
以前在實際模式玩 IDT moving 也是這樣保持中斷對映的, 只是當時不必切換模式。
如果不是用DPMI 進保護模式, 那就更......簡單了吧, 準備好一個虛擬8086 machine,
在上面該用DPMI call real mode interrupt 的地方就切至此虛擬機器中, 然後返回,
OK.
===============================================================================
發信人: cmp@cis_nctu (), 信區: programming
標  題: Re: DOS4GW 等 DOS Extender 會配置 XMS 嗎?
發信站: 交大資科_BBS (May 10 21:23:28 1994)
轉信站: cis_nctu
> 注意, 每個handler 的位置都要不同, 所以最多需要256 個opcode 0cch (如果256 個
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^
> interrupt 都要對映回實際模式). 然後再攔截exception 3 (最好將 interrupt 3
> 也指向同一個handler), 然後從此handler 檢查被中斷的地方, 以便判斷原來發生的
> 中斷編號 (因為中斷編號可以從 return offset - int 3 array start offset 判斷
                                                ^^^^^^^^^^^^^^^^^^^^^^^
> 出來), 然後再用DPMI 去模擬中斷, 把該對映的暫存器都轉換好, 然後就ok 了。
這招如何判斷 int 編號的方法的確高明! 我以前都沒有想到過。這樣一來,
我的心中疑點終於解了! ( 我已想到不用 DPMI 的另一種方法 ) 多謝你的提醒,
我現在便去重寫我的 Dos Extender 看看!
===============================================================================
發信人: 
s8153119@summer.nchu (Alex Yu), 信區: programming
發信站: 交大資工 News Server (Sun May 15 12:04:17 1994)
In article , Kevin wrote:
>> No, 主要是 Tnyplay2.zip 中對 Watcom C/C++ 的 interface 錯誤造成的。
>> 弟一朋友經過些許修改, 已經使tnyplay2 正常動作了。
>> 它最大的失誤在於參數在 stack 中的 size 錯誤, 所有對 Watcom C/C++ 的界面參數
> 有哪些地方需要修改?
Remark 起來的地方是原來的程式:
;proc    MODPlayModule  Modfile:dword,Rate:word,Port:word,IRQ:byte,DRQ:byte
proc    MODPlayModule  Modfile:dword,Rate:dword,Port:dword,IRQ:dword,DRQ:dword
        mov     edi,           ; Load parameters from stack
        mov     eax,
        mov     edx,
        mov     ecx,
        mov     ,dx             ; save SB configuration parameters
        mov     ,cl
        mov     ecx,
        mov     ,cl
        mov     ,ax
;        mov     ax,
;        mov     dx,
;        mov     cl,
;        mov     ch,
;        mov     ,dx             ; save SB configuration parameters
;        mov     ,cl
;        mov     ,ch
;        mov     ,ax
======================================================================
= I'm Alex Yu.   我是余孟學。   To contact me, try:                  =
= E-mail: 
s8153119@summer.nchu.edu.tw, 
s48153119@vax9k.nchu.edu.tw   =
======================================================================
= Forgive me for response so late, for I pack all my e-mails & news  =
= home and followup/reply them offline.                              =
= 請原諒我超慢速的回覆速度, 因為我用uqwk 將news & e-mail 包回家回。  =
======================================================================
===============================================================================
發信人: saturn@cis_nctu (SEGA迷), 信區: programming
發信站: 交大資科_BBS (May  7 18:14:10 1994)
請問 cmp 大:
如何在 DOS/4GW 這 DOS Extender下攔截某個 INT,
我最近寫個程式需要攔截 INT 9,  然而我卻試不出來....
我的程式大概如下:
                  .386P
                  .MODEL FLAT, C
                  .DATA
                  public Key
         Key      DB ?
                  .CODE
         Newint9  PROC PUBLIC USES....
                  LOCAL OLDINT9:DWORD
                  mov AX, 3509h
                  int 21h
                  mov WORD PTR OLDINT9, BX   ; 不知傳回值是
                  mov AX, ES                 ; ES:BX or ES:EBX
                  mov WORD PTR OLDINT9+2, AX ;
                  jmp next
        ;====================================
        NewINT:
                     .
                     .
                     .
                  iret
        ;====================================
        next:
                  mov EDX, NewINT  ;================
                  push CS          ; 不知道要指向
                  pop DS           ; DS:DX or DS:EDX
                  mov AX, 2509h    ;
                  int 21h
                  mov EAX, OLDINT9 ;return the address of old int9
         Newint9  ENDP
                  END
         希望 cmp 大能為小弟解答一下, 或是其他高手會的也幫忙一下
                  謝謝:)
--------------------------------------------------------------------------------            今天很無聊.
            明天母親節, 可是我沒回去看媽媽,
            我真是不孝子..........
                                                         【SEGA 迷】
===============================================================================
發信人: cmp@cis_nctu (), 信區: programming
標  題: Re: DOS4GW 等 DOS Extender 會配置 XMS 嗎?
發信站: 交大資科_BBS (May  9 19:22:54 1994)
轉信站: cis_nctu
Saturn 兄: 如果你已經進入保護模式, 那麼你用 DOS 的設定中斷向量功能是沒用的!
看傳回的暫存器長度及定址方式就知道 (DS:DX ==> seg:offset 的定址方式, 怎樣
定址也只能定在 1 Mega 以內, 而保護模式的程式碼卻早已被丟至 1 Mega 以外了!)
要解決此一問題, 如果你是用 Watcom C/C++ 的 話, 不妨使用 _dos_setvect() 及
_dos_getvect() 看看! 我到現在都是這麼用的, 也都沒有問題。
 (包括將用組語寫成的 ISR 這樣設定向量也行)
 ┌──────────────────────────────────┐
 │  看到女朋友被搶走:吃醋,不怎麼酷;喝醬油非常酷,但是不能喝。  │
 │    (要不要看我喝﹖)                                           │
 └──────────────────────────────────┘
===============================================================================
發信人: 
alexfish.bbs@bbs.nchu (Alex Yu), 信區: programming
發信站: 中興大學天樞資訊網 (Tue May 10 10:16:09 1994)
DOS4GW 提供32-bit 長度的int 21h 服務, 包括讀寫檔案和 get/set interrupt vector.
有一個給 Watcom C/C++ 用的 MOD player source code (檔名 'tnyplay2.zip', 本來
我是在 wuarchive 拿到的, 可是剛剛在 ftp.edu.tw /PC/wuarchive/games/programming
裡和底下的 watcom 目錄中沒看到它的影子) 裡面設定 IRQ handler 就類似
  mov  ax,250fh
  mov  edx,offset irq_handler
  int  21h
===============================================================================
發信人: cmp@cis_nctu (), 信區: programming
發信站: 交大資科_BBS (May  9 20:01:26 1994)
說起抓 DOOM 的圖案並 "發現" 它是 320x200x256c 4 pages 模式的緣由,
可要從抓 Pinball 的圖案開始說起。那時我一看到 Pinball 順暢的畫面捲動,
及比 320x200 較高的解析度, 我就認為這程式是用 mode X 顯示的。
於是我就寫了 for DOS 的專門抓 mode X 的抓圖程式, 的確蠻成功的。 後來
在玩 DOOM 時突發奇想, 想用這抓圖程式抓 DOOM, 結果竟然成功! 除了發現
DOOM 是 4 pages 顯示以外, 我還發現我抓下來的整整 256K bytes memory
中, 除了正在顯示於螢幕的 64K bytes 圖型之外, 還有兩個 64KB 圖形, 其中
一張是上一張顯示過的畫面, 而另外一張是下一張將要顯示於螢幕上的圖形
 (因為它還沒 render 完畢) ; 並從這張圖形得知, DOOM 的 render 方式是
先 render 牆壁再 render  地面及天花板, 且由遠而近地 render....。
 ┌──────────────────────────────────┐
 │  看到女朋友被搶走:吃醋,不怎麼酷;喝醬油非常酷,但是不能喝。  │
 │    (要不要看我喝﹖)                                           │
 └──────────────────────────────────┘
===============================================================================