home *** CD-ROM | disk | FTP | other *** search
/ Internet MPEG Audio Archive / IMAA.mdf / util / dos / l3v100n / rsx / source / adosx32.asm next >
Assembly Source File  |  1994-01-19  |  7KB  |  239 lines

  1. ;
  2. ; ADOSX32.ASM (c) Rainer Schnitker 92,93
  3. ;
  4. ; Entry point for protected mode int 0x21
  5. ;
  6.  
  7.     INCLUDE REGS386.INC
  8.         INCLUDE TRANS.INC
  9.  
  10.         .386p
  11.  
  12. DGROUP group _DATA
  13.  
  14.         extrn _int21:near               ; C-function int21 handler
  15.         extrn _load_ds:near             ; load 16bit extender ds
  16.         extrn _clearregs:near           ; clear high bits from 32bit regs
  17.     extrn _realdos:near        ; call real-mode int 0x21
  18.     extrn _check_signals:near    ; check if signals raised
  19.     extrn _myexcep13:near        ; exception hander
  20.  
  21. _DATA segment word public 'DATA' use16
  22.         extrn _stackp16:DWORD           ; esp value for 16bit extender stack
  23.         extrn _npz:PROCESS              ; pointer to running process
  24.     extrn _regf:REG386        ; regs for exceptions
  25.     extrn _cs16real: word        ; RM cs segment
  26.     extrn _ds16real: word        ; RM ds segment
  27.     extrn _real_mode_stack: word    ; RM stack pointer
  28.     td TRANS  <>            ; translation struct for dos
  29. _DATA ends
  30.  
  31. _TEXT segment byte public 'CODE' use16
  32.         assume cs:_TEXT,ds:DGROUP
  33.  
  34.  
  35.  
  36. ; **************************************
  37. ; Entry point for int 0x21
  38. ; - test default bit from code segment ( 32 or 16 bit )
  39. ; - we handle only 32bit-calls
  40. ; - all 16bit calls (from our extender) passed to real mode
  41. ;   only segment registers are changed
  42. ;
  43.  
  44. public _doscall
  45. _doscall proc far            ; INT 0x21 handler entry
  46.     push    eax
  47.     lar    eax, [esp + 8]        ; load cs access rights
  48.     test    eax, 0400000h        ; test default code size
  49.     pop    eax
  50.  
  51.     jnz    short int32bit        ; ok, 32bit user int
  52.     cmp    ah, 04Ch        ; test extender exit
  53.                     ; required for more than one instance
  54.     jne    short int16bit        ; 16bit DOS call from extender
  55.  
  56.                     ; jmp to orginal handler (DPMI-host)
  57.         db 066h         ; 32bit
  58.     db 0EAh     ; JMP
  59. public _int21voff            ; label for writing in code
  60. _int21voff:
  61.     dd 2        ; offset
  62. public _int21vsel            ; label for writing in code
  63. _int21vsel:
  64.     dd 1        ; selector
  65.  
  66.  
  67.  
  68. ; **************************************
  69. ; all 16bit calls assume that this call is equal to a real mode call
  70. ; where the segment registers are equal to programs segments
  71. ;
  72. ; stack: 0=eip 4=cs 8=eflags
  73.  
  74. int16bit:
  75.     mov    word ptr td.T_EAX, ax           ; save registers
  76.     mov    word ptr td.T_EBX, bx
  77.     mov    word ptr td.T_ECX, cx
  78.     mov    word ptr td.T_EDX, dx
  79.     mov    word ptr td.T_ESI, si
  80.     mov    word ptr td.T_EDI, di
  81.     mov    word ptr td.T_EBP, bp
  82.     mov    ax, _cs16real            ; set RM segments
  83.     mov    word ptr td.T_CS, ax
  84.     mov    ax, _ds16real
  85.     mov    word ptr td.T_DS, ax
  86.     mov    word ptr td.T_ES, ax
  87.     mov    word ptr td.T_SS, ax
  88.     mov    ax, _real_mode_stack        ; stack for int
  89.     mov    word ptr td.T_sp, ax
  90.  
  91.     push    ds                ; DPMI call now
  92.     pop    es
  93.     mov    cx, 0                ; no stack words
  94.     mov    bh, 0                ; flags
  95.     mov    bl, 21h             ; interrupt no
  96.     xor    edi, edi            ;
  97.     mov    di, offset DGROUP:td        ; es:edi translation
  98.     mov    ax, 0300h
  99.     int    31h                ; simulate real-mode int
  100.  
  101.     movzx    ebp, sp
  102.     mov    ax, word ptr td.T_FLAGS     ; trans -> registers
  103.     mov    word ptr [bp+8], ax
  104.     mov    ax, word ptr td.T_EAX
  105.     mov    bx, word ptr td.T_EBX
  106.     mov    cx, word ptr td.T_ECX
  107.     mov    dx, word ptr td.T_EDX
  108.     mov    si, word ptr td.T_ESI
  109.     mov    di, word ptr td.T_EDI
  110.     mov    bp, word ptr td.T_EBP
  111.         iretd
  112.  
  113.  
  114. ; **************************************
  115. ; here is the 32bit handler
  116. ; save all registers, check signals, restore all registers
  117.  
  118. int32bit:      ; stack: 0=eip 4=cs 8=eflags
  119.  
  120.     push    esi
  121.     call    _load_ds            ; load 16 bit extender ds
  122.     xor    esi, esi
  123.     mov    si, word ptr DGROUP:_npz    ; load process ptr
  124.     pop    dword ptr [si].r_esi        ; save ESI
  125.  
  126.     mov    [si].r_eax, eax         ; EAX
  127.     mov    [si].r_ebx, ebx         ; EBX
  128.     mov    [si].r_ecx, ecx         ; ECX
  129.     mov    [si].r_edx, edx         ; EDX
  130.     mov    [si].r_edi, edi         ; EDI
  131.     mov    [si].r_ebp, ebp         ; EBP
  132.     mov    word ptr [si].r_ds, es        ; DS
  133.     mov    word ptr [si].r_es, es        ; ES    !assume(es=ds)
  134.     mov    word ptr [si].r_ss, ss        ; SS
  135.     mov    word ptr [si].r_fs, fs        ; FS
  136.     mov    word ptr [si].r_gs, gs        ; GS
  137.     mov    [si].r_esp, esp         ; ESP
  138.     mov    [si].r_esporg, esp        ; ESP before int
  139.     add    [si].r_esporg, dword ptr 12    ;
  140.  
  141.     mov    ebp, esp            ; others regs are on user stack
  142.     mov    eax, [ebp]            ; EIP
  143.     mov    [si].r_eip, eax
  144.     mov    eax, [ebp+4]            ; CS
  145.     mov    [si].r_cs, eax
  146.     mov    eax, [ebp+8]            ; EFLAGS
  147.     mov    [si].r_eflags, eax
  148.  
  149.     mov    ax, ds                ; make ss=ds=es
  150.     mov    es, ax                ; load 16bit es
  151.     mov    ss, ax                ; load 16bit ss
  152.     mov    esp, _stackp16            ; load 16bit sp
  153.  
  154.     sub    esp, 3000    ; int stack under exception/signal stack
  155.  
  156.     call    _clearregs    ; clear high bits for our 16bit prg
  157.  
  158.     call    _int21        ; call C-prg handler for int21h
  159.  
  160. public _back_from_syscall
  161. _back_from_syscall:
  162.     call    _check_signals
  163.  
  164.     mov    si, word ptr DGROUP:_npz    ; load process ptr
  165.     mov    ebx, [si].r_ebx         ; restore old regs
  166.     mov    ecx, [si].r_ecx
  167.     mov    edx, [si].r_edx
  168.     mov    edi, [si].r_edi
  169.     mov    ebp, [si].r_ebp
  170.     mov    ss , word ptr [si].r_ss     ; change ss first
  171.     mov    esp, [si].r_esp         ; restore ss:esp
  172.     mov    es , word ptr [si].r_es
  173.     mov    fs , word ptr [si].r_fs
  174.     mov    gs , word ptr [si].r_gs
  175.  
  176.     mov    eax, [si].r_eflags        ; other regs are on user stack
  177.     mov    [esp+8], eax
  178.     mov    eax, [si].r_cs
  179.     mov    [esp+4], eax
  180.     mov    eax, [si].r_eip
  181.     mov    [esp], eax
  182.     mov    eax, [si].r_eax         ; eax
  183.  
  184.     push    dword ptr [si].r_esi        ; restore esi
  185.     pop    esi
  186.  
  187.     push    es
  188.     pop    ds                ; last segment restore
  189.         iretd
  190. _doscall endp
  191.  
  192.  
  193. public _debug_entry
  194. _debug_entry proc far
  195.     push    ds
  196.     call    _load_ds
  197.  
  198.     mov    dword ptr DGROUP:_regf.REG_EAX, eax
  199.     mov    dword ptr DGROUP:_regf.REG_EBX, ebx
  200.     mov    dword ptr DGROUP:_regf.REG_ECX, ecx
  201.     mov    dword ptr DGROUP:_regf.REG_EDX, edx
  202.     mov    dword ptr DGROUP:_regf.REG_EBP, ebp
  203.     mov    dword ptr DGROUP:_regf.REG_EDI, edi
  204.     mov    dword ptr DGROUP:_regf.REG_ESI, esi
  205.     mov    word ptr DGROUP:_regf.REG_ES , es
  206.     mov    word ptr DGROUP:_regf.REG_SS , ss
  207.     mov    word ptr DGROUP:_regf.REG_FS , fs
  208.     mov    word ptr DGROUP:_regf.REG_GS , gs
  209.     pop    ax
  210.     mov    word ptr DGROUP:_regf.REG_DS, ax
  211.  
  212.     mov    dword ptr DGROUP:_regf.REG_ESP, esp
  213.     mov    dword ptr DGROUP:_regf.REG_ESPORG, esp
  214.     add    dword ptr DGROUP:_regf.REG_ESPORG, 12
  215.     mov    word ptr DGROUP:_regf.REG_FAULTNO, 3
  216.  
  217.     mov    ebp, esp            ; others regs are on user stack
  218.     mov    eax, [ebp]            ; EIP
  219.     mov    dword ptr DGROUP:_regf.REG_EIP, eax
  220.     mov    eax, [ebp+4]            ; CS
  221.     mov    dword ptr DGROUP:_regf.REG_CS, eax
  222.     mov    eax, [ebp+8]            ; EFLAGS
  223.     mov    dword ptr DGROUP:_regf.REG_EFLAGS, eax
  224.  
  225.     mov    ax, ds                ; make ss=ds=es
  226.         mov     es, ax                          ; load 16bit es
  227.     mov    ss, ax                ; load 16bit ss
  228.     mov    esp, _stackp16            ; load 16bit sp
  229.  
  230.     call    _clearregs
  231.     call    _myexcep13
  232.  
  233.     jmp    _back_from_syscall
  234. _debug_entry endp
  235.  
  236. _TEXT    ends
  237.  
  238.     end
  239.