home *** CD-ROM | disk | FTP | other *** search
/ DOS/V Power Report 1997 October / VPR9710A.ISO / BENCH / DJ1SRC_K / 112M3 / DPMISIM.ASM < prev    next >
Assembly Source File  |  1997-05-01  |  5KB  |  290 lines

  1. ; This is file DPMISIM.ASM
  2. ;
  3. ; Copyright (C) 1993 DJ Delorie, 24 Kirsten Ave, Rochester NH 03867-2954
  4. ;
  5. ; This file is distributed under the terms listed in the document
  6. ; "copying.dj", available from DJ Delorie at the address above.
  7. ; A copy of "copying.dj" should accompany this file; if not, a copy
  8. ; should be available from where this file was obtained.  This file
  9. ; may not be distributed without a verbatim copy of "copying.dj".
  10. ;
  11. ; This file is distributed WITHOUT ANY WARRANTY; without even the implied
  12. ; warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  13. ;
  14. ; 97/05/01 Kimio Itoh(kitoh@nn.iij4u.or.jp) modified
  15. ; for reduce binary size and for dead code elimination.
  16.  
  17.     title    dpmisim
  18.     .386p
  19.  
  20.     include    segdefs.inc
  21.     include tss.inc
  22.     include gdt.inc
  23.     include idt.inc
  24.  
  25. ;------------------------------------------------------------------------
  26.  
  27.     start_data16
  28.  
  29.     extrn    _r_tss:tss_s
  30.     extrn    _arena_cs:word
  31.     extrn    _arena_ds:word
  32.     extrn    _core_selector:word
  33.     extrn    _tss_ptr:word
  34.     extrn    _ARENA:dword
  35.  
  36.     public    _dpmisim_regs
  37. _dpmisim_regs    label    dword
  38. ds_edi    dd    ?
  39. ds_esi    dd    ?
  40. ds_ebp    dd    ?
  41. ds_res    dd    ?
  42. ds_ebx    dd    ?
  43. ds_edx    dd    ?
  44. ds_ecx    dd    ?
  45. ds_eax    dd    ?
  46. ds_flg    dw    ?
  47. ds_es    dw    ?
  48. ds_ds    dw    ?
  49. ds_fs    dw    ?
  50. ds_gs    dw    ?
  51. ds_ip    dw    ?
  52. ds_cs    dw    ?
  53. ds_sp    dw    ?
  54. ds_ss    dw    ?
  55.  
  56.     public    _dpmisim_rmcb
  57. _dpmisim_rmcb    dd    32 dup(?)
  58.  
  59.     dd    128 dup (?)
  60. rmcb_temp_stack32    label    dword
  61.     dd    offset rmcb_task_switch
  62.     dw    g_rcode
  63.  
  64.     dw    128 dup (?)
  65. rmcb_temp_stack16    label    word
  66.  
  67.     end_data16
  68.  
  69. ;------------------------------------------------------------------------
  70.  
  71.     start_code16
  72.  
  73.     extrn    _memput:near
  74.     extrn    _memget:near
  75.     extrn    _go_til_stop:near
  76.  
  77. ds_savesp    dw    ?
  78. ds_savess    dw    ?
  79. ds_tmpds    dw    ?
  80.  
  81.     public    _dpmisim
  82. _dpmisim:
  83.  
  84.     pusha
  85.     push    es
  86.  
  87.     mov    cs:[ds_savesp], sp
  88.     mov    cs:[ds_savess], ss
  89.  
  90.     mov    ax,ds_flg
  91.     and    ax,0fcffh
  92.     push    ax
  93.     popf
  94.  
  95.     mov    edi, ds_edi
  96.     mov    esi, ds_esi
  97.     mov    ebp, ds_ebp
  98.     mov    ebx, ds_ebx
  99.     mov    edx, ds_edx
  100.     mov    ecx, ds_ecx
  101.     mov    eax, ds_eax
  102.     mov    es, ds_es
  103.     mov    fs, ds_fs
  104.     mov    gs, ds_gs
  105.     mov    ss, ds_ss
  106.     mov    sp, ds_sp
  107.  
  108.     push    cs
  109.     push    offset dpmisim_return
  110.     push    ds_cs
  111.     push    ds_ip
  112.     mov    ds, ds_ds
  113.     retf    ; actually a far call in disguise
  114. dpmisim_return:
  115.  
  116.     mov    cs:[ds_tmpds], ds
  117.     push    DGROUP
  118.     pop    ds
  119.     pushf
  120.     pop    ds_flg
  121.  
  122.     mov    ds_edi, edi
  123.     mov    ds_esi, esi
  124.     mov    ds_ebp, ebp
  125.     mov    ds_ebx, ebx
  126.     mov    ds_edx, edx
  127.     mov    ds_ecx, ecx
  128.     mov    ds_eax, eax
  129.     mov    ds_es, es
  130.     mov    ds_fs, fs
  131.     mov    ds_gs, gs
  132.     mov    ds_ss, ss
  133.     mov    ds_sp, sp
  134.     
  135.     mov    ax, cs:[ds_tmpds]
  136.     mov    ds_ds, ax
  137.  
  138.     mov    ss, cs:[ds_savess]
  139.     mov    sp, cs:[ds_savesp]
  140.  
  141.     pop    es
  142.     popa
  143.     ret
  144.  
  145. rmcb_number    db    ?
  146.  
  147. rmcb    macro    n
  148.     mov    cs:[rmcb_number],n
  149.     jmp    short rmcb_common
  150.     endm
  151.  
  152.     public    _dpmisim_rmcb0
  153. _dpmisim_rmcb0:
  154.     rmcb    0
  155.     public    _dpmisim_rmcb1
  156. _dpmisim_rmcb1:
  157.     x=1
  158.     rept 15
  159.      rmcb x
  160.      x=x+1
  161.     endm
  162.  
  163. rmcb_common:
  164.     mov    cs:[ds_tmpds], ds
  165.     push    DGROUP
  166.     pop    ds
  167.     pushf
  168.     pop    ds_flg
  169.  
  170.     mov    ds_edi, edi        ; save registers
  171.     mov    ds_esi, esi
  172.     mov    ds_ebp, ebp
  173.     mov    ds_ebx, ebx
  174.     mov    ds_edx, edx
  175.     mov    ds_ecx, ecx
  176.     mov    ds_eax, eax
  177.     mov    ds_es, es
  178.     mov    ds_fs, fs
  179.     mov    ds_gs, gs
  180.     mov    ds_ss, ss
  181.     mov    ds_sp, sp
  182.  
  183.     mov    ax,cs:[ds_tmpds]
  184.     mov    ds_ds, ax        ; move DS to proper location
  185.  
  186.     mov    ax,ds            ; set up our local stack
  187.     mov    ss,ax
  188.     mov    sp, offset rmcb_temp_stack16
  189.  
  190.     push    ds
  191.     pop    es
  192.     
  193.     mov    bl, cs:[rmcb_number]
  194.     mov    bh,0
  195.     shl    bx,3
  196.  
  197.     push    bx
  198.     push    50            ; copy the registers to protected memory
  199.     push    ds
  200.     push    offset _dpmisim_regs
  201.     mov    eax,_dpmisim_rmcb[bx+4]
  202.     add    eax,_ARENA
  203.     push    eax
  204.     call    _memput
  205.     add    sp,10
  206.     pop    bx
  207.  
  208.     mov    ax, _arena_cs        ; cs:eip for function to call
  209.     mov    _r_tss.tss_cs, ax
  210.     mov    eax, _dpmisim_rmcb[bx]
  211.     mov    _r_tss.tss_eip, eax
  212.  
  213.     mov    ax, _arena_ds        ; es:edi for pointer to registers
  214.     mov    _r_tss.tss_es, ax
  215.     mov    eax, _dpmisim_rmcb[bx+4]
  216.     mov    _r_tss.tss_edi, eax
  217.  
  218.     mov    ax, _core_selector    ; ds:esi for pointer to caller stack
  219.     mov    _r_tss.tss_ds, ax
  220.     mov    eax,0
  221.     mov    ax,ds_ss
  222.     shl    eax,4
  223.     mov    ebx,0
  224.     mov    bx,ds_sp
  225.     add    eax,ebx
  226.     mov    _r_tss.tss_esi, eax
  227.  
  228.     mov    ax, _core_selector    ; ss:esp for pointer to temp stack
  229.     mov    _r_tss.tss_ss, ax
  230.     mov    eax,0
  231.     mov    ax,ds
  232.     shl    eax,4
  233.     mov    ebx,0
  234.     mov    bx,offset rmcb_temp_stack32
  235.     add    eax,ebx
  236.     and    eax,0fffffffch
  237.     mov    _r_tss.tss_esp, eax
  238.  
  239.     push    _tss_ptr
  240.     mov    ax,offset _r_tss
  241.     mov    _tss_ptr,ax
  242.  
  243.     call    _go_til_stop
  244.     
  245.     pop    _tss_ptr
  246.  
  247.     mov    bl, cs:[rmcb_number]
  248.     mov    bh,0
  249.     shl    bx,3
  250.  
  251.     push    bx    
  252.     push    50            ; copy the registers from protected memory
  253.     push    ds
  254.     push    offset _dpmisim_regs
  255.     mov    eax,_dpmisim_rmcb[bx+4]
  256.     add    eax,_ARENA
  257.     push    eax
  258.     call    _memget
  259.     add    sp,10
  260.     pop    bx
  261.  
  262.     mov    ss,ds_ss
  263.     mov    sp,ds_sp
  264.  
  265.     mov    edi, ds_edi
  266.     mov    esi, ds_esi
  267.     mov    ebp, ds_ebp
  268.     mov    ebx, ds_ebx
  269.     mov    edx, ds_edx
  270.     mov    ecx, ds_ecx
  271.     mov    eax, ds_eax
  272.     mov    es, ds_es
  273.     mov    fs, ds_fs
  274.     mov    gs, ds_gs
  275.  
  276.     push    ds_flg
  277.     push    ds_cs
  278.     push    ds_ip
  279.     mov    ds, ds_ds
  280.     iret            ; jmp to wherever the regs said to
  281.  
  282. rmcb_task_switch:
  283.     jmpt    g_ctss
  284.  
  285.     end_code16
  286.  
  287. ;------------------------------------------------------------------------
  288.  
  289.     end
  290.