home *** CD-ROM | disk | FTP | other *** search
/ Frostbyte's 1980s DOS Shareware Collection / floppyshareware.zip / floppyshareware / USCX / VM-SUPER.ARC / VM-SUPER.ASM next >
Assembly Source File  |  1988-10-29  |  33KB  |  1,618 lines

  1. ;
  2. ;
  3. ;   This code is from Appendix G of the book "80386 Technical Reference"
  4. ; by Edmond Strauss.  It is a foundation to build upon to put a 386 into
  5. ; virtual 8086 mode.  Because the 386 specific opcodes have been hardcoded
  6. ; it should compile with most MASMs.  I have left in most all the comments
  7. ; that were in the code except some unimplemented code that was commented
  8. ; out.  The program is run from DOS in real mode and gives back the
  9. ; familiar DOS prompt.
  10. ;
  11. ;
  12. CR         EQU    0DH
  13. LF        EQU    0AH
  14. EOS        EQU    0FFH
  15. DOS        EQU    21H
  16. OP_SIZE        EQU    66H
  17. P_SIZE        EQU    67H
  18. MOV_PBX_AX    EQU    89H    ;mov [bx+i8],ax
  19.  
  20. ; 80386 eflag bits
  21. VMFL        EQU    2H
  22. RFFL        EQU    1H
  23. NTFL        EQU    04000H
  24. IOPLFL        EQU    03000H
  25.  
  26. ; 8086 flag bits
  27. OFL        EQU    00800H
  28. DFL        EQU    00400H
  29. IFL        EQU    00200H
  30. TFL        EQU    00100H
  31. SFL        EQU    00080H
  32. ZFL        EQU    00040H
  33. AFL        EQU    00010H
  34. PFL        EQU    00004H
  35. CFL        EQU    00001H
  36. ;
  37. LDT_BIT        EQU    4
  38. NULL_ALIAS    EQU    00H
  39. GDT_ALIAS    EQU    08H
  40. LDT_ALIAS    EQU    0CH
  41. IDT_ALIAS    EQU    10H
  42. MON_TSS_SEL    EQU    18H
  43. TMP_TSS_SEL    EQU    20H
  44. MON_LDT_SEL    EQU    28H
  45. FLAT_SEL    EQU    30H
  46.  
  47. ; ldts
  48. MON_CODE_SEL    EQU    14H
  49. MON_DATA_SEL    EQU    1CH
  50. MON_STACK_SEL    EQU    24H
  51.  
  52.  
  53. DESC        STRUC
  54.     lim_0_15    DW    0    ; limit bits (0..15)
  55.     bas_0_15    DW    0    ; base bits (0..15)
  56.     bas_16_23    DB    0    ; base bits (16..23)
  57.     access        DB    0    ; access byte
  58.     gran        DB    0    ; granularity byte
  59.     bas_24_31    DB    0    ; base bits (24..31)
  60. DESC        ENDS
  61.  
  62. ; 386 GATE template
  63. ;
  64. GDESC    STRUC
  65.     off_0_15    DW    0    ; offset (0..15)
  66.     sel        DW    0    ; selector
  67.     dw_count    DB    0    ; 0-31 (upper 3 bits 0)
  68.     gaccess        DB    0    ;access byte
  69.     off_16_31    DW    0    ;offset (16..31)
  70. GDESC    ENDS
  71.  
  72. TSS_STRUCT    STRUC
  73.     tss_back    DD    ?
  74.     tss_stk0    DQ    ?
  75.     tss_stk1    DQ    ?
  76.     tss_stk2    DQ    ?
  77.     tss_cr3        DD    ?
  78.     tss_eip        DD    ?
  79.     tss_eflag    DD    ?
  80.     tss_eax        DD    ?
  81.     tss_ecx        DD    ?
  82.     tss_edx        DD    ?
  83.     tss_ebx        DD    ?
  84.     tss_esp        DD    ?
  85.     tss_ebp        DD    ?
  86.     tss_esi        DD    ?
  87.     tss_edi        DD    ?
  88.     tss_ES        DD    ?
  89.     tss_CS        DD    ?
  90.     tss_SS        DD    ?
  91.     tss_DS        DD    ?
  92.     tss_FS        DD    ?
  93.     tss_GS        DD    ?
  94.     tss_LDT        DD    ?
  95.     tss_dtb        DW    ?
  96.     tss_iobm_off    DW    ?
  97.     tss_iobitmap    DB    1    DUP(0FFH)
  98. TSS_STRUCT    ENDS
  99.  
  100. AFIRST        SEGMENT PARA
  101. AFIRST        ENDS
  102. TDATA        SEGMENT
  103. TDATA        ENDS
  104. MON_DATA    SEGMENT
  105. MON_DATA    ENDS
  106. MON_STACK    SEGMENT
  107. MON_STACK    ENDS
  108. MON_CODE    SEGMENT
  109. MON_CODE    ENDS
  110. VM_DATA        SEGMENT
  111. VM_DATA        ENDS
  112. VM_CODE        SEGMENT
  113. VM_CODE        ENDS
  114. ZLAST        SEGMENT PARA
  115. ZLAST        ENDS
  116. ;
  117.  
  118. AFIRST    SEGMENT PARA
  119. first_data    DW    ?
  120. AFIRST    ENDS
  121.  
  122.  
  123. TDATA    SEGMENT
  124. GDT_pword    LABEL    BYTE
  125.     DW    end_gdt-gdt
  126. b0    DW    gdt
  127.     DW    0
  128.  
  129. IDT_pword    LABEL    BYTE
  130.     DW    end_idt-idt
  131. b1    DW    idt
  132.     DW    0
  133.  
  134.  
  135. ;*   *   *   *   *   *   *   *   *   *   *   *******
  136. gdt    LABEL    BYTE
  137.  
  138.     ;null
  139.     DQ    0    ; null
  140.  
  141.     ; gdt alias
  142.     DW    end_gdt-gdt    ; limit bits(0..15)
  143. b2    DW    gdt    ; bas (0..15)
  144.     DB    0    ; bas (16..23)
  145.     DB    092h    ; access
  146.     DB    0    ; granularity
  147.     DB    0    ; bas (24..31)
  148.  
  149.     ; idt alias
  150.     DW    end_idt-idt    ; limit bits(0..15)
  151. b3    DW    idt    ; bas (0..15)
  152.     DB    0    ; bas (16..23)
  153.     DB    092h    ; access
  154.     DB    0    ; granularity
  155.     DB    0    ; bas (24..31)
  156.  
  157.     ; mon tss
  158.     DW    end_mon_tss-mon_tss    ; limit bits(0..15)
  159. b4    DW    mon_tss    ; bas (0..15)
  160.     DB    0    ; bas (16..23)
  161.     DB    089h    ; access
  162.     DB    0    ; granularity
  163.     DB    0    ; bas (24..31)
  164.  
  165.     ; tmp tss
  166.     DW    end_tmp_tss-tmp_tss    ; limit bits(0..15)
  167. b5    DW    tmp_tss    ; bas (0..15)
  168.     DB    0    ; bas (16..23)
  169.     DB    089h    ; access
  170.     DB    0    ; granularity
  171.     DB    0    ; bas (24..31)
  172.  
  173.     ; mon ldt
  174.     DW    end_mon_ldt-mon_ldt    ; limit bits(0..15)
  175. b6    DW    mon_ldt    ; bas (0..15)
  176.     DB    0    ; bas (16..23)
  177.     DB    082h    ; access
  178.     DB    0    ; granularity
  179.     DB    0    ; bas (24..31)
  180.  
  181.  
  182.     ; flat_des    DESC <0FFFFH,0,0,92h,0CFh,0>
  183.     DW    0FFFFH        ; limit bits(0..15)
  184.     DW    0    ; bas (0..15)
  185.     DB    0    ; bas (16..23)
  186.     DB    092h    ; access
  187.     DB    0CFh    ; granularity
  188.     DB    0    ; bas (24..31)
  189. end_gdt    LABEL    BYTE
  190.  
  191. ;*   *   *   *   *   *   *   *   *   *   *   *******
  192. ; dos +13
  193. ;
  194. idt    LABEL    BYTE
  195.     DQ    12+1 DUP(?)
  196. ; ex13        our_ex13_iv    LABEL    BYTE
  197.     DW    ex13_int
  198.     DW    MON_CODE_SEL    ; sel mon code
  199.     DB    0
  200.     DB    0EEh        ; - dpl=3 - 386 interrupt gate
  201.     DB    0
  202.     DB    0
  203.     DQ    256-13 DUP(?)
  204. end_idt    LABEL    BYTE
  205.  
  206.  
  207.  
  208. ;*   *   *   *   *   *   *   *   *   *   *   *******
  209. mon_ldt    LABEL    BYTE
  210.     ; null
  211.     DQ    0
  212.  
  213.     ; mon_ldt alias
  214.     DW    end_mon_ldt-mon_ldt    ; limit bits (0..15)
  215. b7    DW    mon_ldt    ; bas (0..15)
  216.     DB    0    ; bas (16..23)
  217.     DB    092h    ; access
  218.     DB    0    ; granularity
  219.     DB    0    ; bas (24..31)
  220.  
  221.     ; mon code
  222.     DW    end_mon_code    ; limit bits (0..15)
  223. bmc0    DW    0    ; bas (0..15)
  224.     DB    0    ; bas (16..23)
  225.     DB    09Ah    ; access
  226.     DB    0    ; granularity
  227.     DB    0    ; bas (24..31)
  228.  
  229.     ; mon data
  230.     DW    end_mon_data    ; limit bits (0..15)
  231. bmd1    DW    0    ; bas (0..15)
  232.     DB    0    ; bas (16..23)
  233.     DB    092h    ; access
  234.     DB    0    ; granularity
  235.     DB    0    ; bas (24..31)
  236.  
  237.     ; mon stack
  238.     DW    end_mon_stack    ; limit bits (0..15)
  239. bms2    DW    0    ; bas (0..15)
  240.     DB    0    ; bas (16..23)
  241.     DB    092h    ; access
  242.     DB    0    ; granularity
  243.     DB    0    ; bas (24..31)
  244. end_mon_ldt    LABEL    BYTE
  245.  
  246.  
  247. ;*   *   *   *   *   *   *   *   *   *   *   *******
  248. mon_tss    LABEL    BYTE
  249.     DD    0            ; mon_back
  250.     DW    mon_tos,0,MON_STACK_SEL,0    ; mon_stk0
  251.     DQ    0            ; mon_stk1
  252.     DQ    0            ; mon_stk2
  253.     DD    0            ; mon_cr3
  254.     DW    begin_mon,0        ; mon_eip
  255.     DW    0,0            ; mon_eflag IFL,0
  256.     DD    0            ; mon_eax
  257.     DD    0            ; mon_ecx
  258.     DD    0            ; mon_edx
  259.     DD    0            ; mon_ebx
  260.     DW    mon_tos,0        ; mon_esp
  261.     DD    0            ; mon_ebp
  262.     DD    0            ; mon_esi 
  263.     DD    0            ; mon_edi
  264.     DW    MON_DATA_SEL,0        ; mon_ES
  265.     DW    MON_CODE_SEL,0        ; mon_CS
  266.     DW    MON_STACK_SEL,0        ; mon_SS
  267.     DW    MON_DATA_SEL,0        ; mon_DS
  268.     DW    MON_DATA_SEL,0        ; mon_FS
  269.     DW    MON_DATA_SEL,0        ; mon_GS
  270.     DW    MON_LDT_SEL,0        ; mon_LDT
  271.     DW    0            ; mon_dtb
  272.     DW    $ +2 -mon_tss        ; mon_bm_off i/o bitmap (bm)
  273.     DB    401h /8 DUP(0)        ; the bm ;7/15 B0 chip
  274. end_mon_tss    LABEL    BYTE
  275.     DB    0FFh            ; end_bm
  276.  
  277.  
  278. ;*   *   *   *   *   *   *   *   *   *   *   *******
  279. tmp_tss    LABEL    BYTE
  280.     DD    0            ; _back
  281.     DW    mon_tos,0,MON_STACK_SEL,0    ; _stk0
  282.     DQ    0            ; _stk1
  283.     DQ    0            ; _stk2
  284.     DD    0            ; _cr3
  285.     DW    begin_mon,0        ; _eip
  286.     DW    IFL,0            ; _eflag
  287.     DD    0            ; _eax
  288.     DD    0            ; _ecx
  289.     DD    0            ; _edx
  290.     DD    0            ; _ebx
  291.     DW    mon_tos,0        ; _esp
  292.     DD    0            ; _ebp
  293.     DD    0            ; _esi 
  294.     DD    0            ; _edi
  295.     DW    MON_DATA_SEL,0        ; _ES
  296.     DW    MON_CODE_SEL,0        ; _CS
  297.     DW    MON_STACK_SEL,0        ; _SS
  298.     DW    MON_DATA_SEL,0        ; _DS
  299.     DW    MON_DATA_SEL,0        ; _FS
  300.     DW    MON_DATA_SEL,0        ; _GS
  301.     DW    MON_LDT_SEL,0        ; _LDT
  302.     DW    0            ; _dtb
  303.     DW    end_mon_tss +2        ; _bm_off
  304.     DB    0FFh            ; end_bm
  305. end_tmp_tss    LABEL    BYTE
  306.     DB    16 DUP(?)
  307.  
  308.  
  309. ;*   *   *   *   *   *   *   *   *   *   *   *******
  310. ; baseinit
  311. ;
  312.     DW    (end_base_table-base_table) /4
  313. base_table    LABEL    WORD
  314.     DW    b0
  315.     DW    TDATA
  316.     DW    b1
  317.     DW    TDATA
  318.     DW    b2
  319.     DW    TDATA
  320.     DW    b3
  321.     DW    TDATA
  322.     DW    b4
  323.     DW    TDATA
  324.     DW    b5
  325.     DW    TDATA
  326.     DW    b6
  327.     DW    TDATA
  328.     DW    b7
  329.     DW    TDATA
  330.     DW    bmc0
  331.     DW    MON_CODE
  332.     DW    bmd1
  333.     DW    MON_DATA
  334.     DW    bms2
  335.     DW    MON_STACK
  336. end_base_table    LABEL    WORD
  337. TDATA    ENDS
  338.  
  339.  
  340. ;*   *   *   *   *   *   *   *   *   *   *   *******
  341. MON_DATA    SEGMENT
  342. end_mon_data    LABEL    BYTE
  343. MON_DATA    ENDS
  344.  
  345.  
  346. ;*   *   *   *   *   *   *   *   *   *   *   *******
  347. MON_STACK    SEGMENT
  348.     DW    512 DUP(?)
  349. ; mon_tos    LABEL    DWORD
  350. mon_tos    DW    dos_ret,0
  351.     DW    VM_CODE,0
  352.     DW    IFL OR IOPLFL, VMFL
  353.     DW    vm_tos,0,VM_DATA,0
  354.     DW    VM_DATA,0,VM_DATA,0,VM_DATA,0,VM_DATA,0
  355. end_mon_stack    LABEL    BYTE
  356. MON_STACK    ENDS
  357.  
  358.  
  359. ;*   *   *   *   *   *   *   *   *   *   *   *******
  360. BEEP    MACRO
  361. LOCAL    self
  362.     in    al,61h
  363.     mov    ah,al
  364.     or    al,3
  365.     nop
  366.     nop
  367.     nop
  368.     nop
  369.     nop
  370.     nop
  371.     out    61h,al    ;beeper
  372.     mov    cx,1000h
  373. self:    loop    self
  374.     mov    al,ah
  375.     out    61h,al
  376. ENDM
  377.  
  378. PUTCH_VL    MACRO
  379. LOCAL    wait1
  380. LOCAL   wait2
  381. LOCAL   wait3
  382.     push    ES
  383.     mov    cx,0b800h
  384.     mov    ES,cx
  385.     mov    BYTE PTR ES:[0],al
  386.     mov    BYTE PTR ES:[2],' '
  387.     mov    BYTE PTR ES:[4],' '
  388.     mov    cx,0
  389. wait1:    loop    wait1
  390.     mov    cx,0
  391. wait2:    loop    wait2
  392.     mov    cx,0
  393. wait3:    loop    wait3
  394.     mov    BYTE PTR ES:[0],' '
  395.     pop    ES
  396. ENDM
  397.  
  398. PUTCH_PL    MACRO
  399. LOCAL    wait1
  400. LOCAL   wait2
  401. LOCAL   wait3
  402.     push    ES
  403.     mov    cx,FLAT_SEL
  404.     mov    ES,cx
  405.     cld
  406.     DB    OP_SIZE
  407.     mov    di,8000h
  408.     DW    00Bh
  409.     DB    P_SIZE
  410.     stosb
  411.     inc    di
  412.     mov    al,' '
  413.     DB    P_SIZE
  414.     stosb
  415.     inc    di
  416.     DB    P_SIZE
  417.     stosb
  418.     mov    cx,0
  419. wait1:    loop    wait1
  420.     mov    cx,0
  421. wait2:    loop    wait2
  422.     mov    cx,0
  423. wait3:    loop    wait3
  424.     DB    OP_SIZE
  425.     mov    di,8000h
  426.     DW    00Bh
  427.     DB    P_SIZE
  428.     stosb
  429.     inc    di
  430.     DB    P_SIZE
  431.     stosb
  432.     inc    di
  433.     DB    P_SIZE
  434.     stosb
  435.     pop    ES
  436. ENDM
  437.  
  438.  
  439.  
  440. ;*   *   *   *   *   *   *   *   *   *   *   *******
  441. MON_CODE    SEGMENT
  442. ASSUME    CS:MON_CODE, DS:nothing, ES:nothing
  443. ;
  444. ;    mv86 entry anf monitor
  445. ;
  446. ;    main entry
  447. ; CS        code segment
  448. ; DS,ES,SS    ps
  449. ;
  450. begin_mon:
  451.     BEEP
  452. end_entry:
  453.     DB    OP_SIZE
  454.     iret
  455.  
  456.  
  457. ;*   *   *   *   *   *   *   *   *   *   *   *******
  458. rf0:    push    bp
  459.     mov    bp,0
  460.     jmp    reflect
  461. SIZE_RF    EQU    $ -rf0
  462. rf1:    push    bp
  463.     mov    bp,1
  464.     jmp    exs_int
  465.  
  466. rf2:    push    bp
  467.     mov    bp,2
  468.     jmp    reflect
  469. rf3:    push    bp
  470.     mov    bp,3
  471.     jmp    reflect
  472. rf4:    push    bp
  473.     mov    bp,4
  474.     jmp    reflect
  475. rf5:    push    bp
  476.     mov    bp,5
  477.     jmp    reflect
  478. rf6:    push    bp
  479.     mov    bp,6
  480.     jmp    exs_int
  481. rf7:    push    bp
  482.     mov    bp,7
  483.     jmp    exs_int
  484. rf8:    push    bp
  485.     mov    bp,8
  486.     jmp    reflect
  487. rf9:    push    bp
  488.     mov    bp,9
  489.     jmp    reflect
  490. rf10:    push    bp
  491.     mov    bp,10
  492.     jmp    exs_int
  493. rf11:    push    bp
  494.     mov    bp,11
  495.     jmp    exs_int
  496. rf12:    push    bp
  497.     mov    bp,12
  498.     jmp    exs_int
  499. rf13:    push    bp
  500.     mov    bp,13
  501.     jmp    reflect
  502. rf14:    push    bp
  503.     mov    bp,14
  504.     jmp    reflect
  505. rf15:   push    bp
  506.           mov     bp,15
  507.           jmp     reflect
  508. rf16:     push    bp
  509.           mov     bp,16
  510.           jmp     reflect
  511. rf17:     push    bp
  512.           mov     bp,17
  513.           jmp     reflect
  514. rf18:     push    bp
  515.           mov     bp,18
  516.           jmp     reflect
  517. rf19:     push    bp
  518.           mov     bp,19
  519.           jmp     reflect
  520. rf20:     push    bp
  521.           mov     bp,20
  522.           jmp     reflect
  523. rf21:     push    bp
  524.           mov     bp,21
  525.           jmp     reflect
  526. rf22:     push    bp
  527.           mov     bp,22
  528.           jmp     reflect
  529. rf23:     push    bp
  530.           mov     bp,23
  531.           jmp     reflect
  532. rf24:     push    bp
  533.           mov     bp,24
  534.           jmp     reflect
  535. rf25:     push    bp
  536.           mov     bp,25
  537.           jmp     reflect
  538. rf26:     push    bp
  539.           mov     bp,26
  540.           jmp     reflect
  541. rf27:     push    bp
  542.           mov     bp,27
  543.           jmp     reflect
  544. rf28:     push    bp
  545.           mov     bp,28
  546.           jmp     reflect
  547. rf29:     push    bp
  548.           mov     bp,29
  549.           jmp     reflect
  550. rf30:     push    bp
  551.           mov     bp,30
  552.           jmp     reflect
  553. rf31:     push    bp
  554.           mov     bp,31
  555.           jmp     reflect
  556. rf32:     push    bp
  557.           mov     bp,32
  558.           jmp     reflect
  559. rf33:     push    bp
  560.           mov     bp,33
  561.           jmp     reflect
  562. rf34:     push    bp
  563.           mov     bp,34
  564.           jmp     reflect
  565. rf35:     push    bp
  566.           mov     bp,35
  567.           jmp     reflect
  568. rf36:     push    bp
  569.           mov     bp,36
  570.           jmp     reflect
  571. rf37:     push    bp
  572.           mov     bp,37
  573.           jmp     reflect
  574. rf38:     push    bp
  575.           mov     bp,38
  576.           jmp     reflect
  577. rf39:     push    bp
  578.           mov     bp,39
  579.           jmp     reflect
  580. rf40:     push    bp
  581.           mov     bp,40
  582.           jmp     reflect
  583. rf41:     push    bp
  584.           mov     bp,41
  585.           jmp     reflect
  586. rf42:     push    bp
  587.           mov     bp,42
  588.           jmp     reflect
  589. rf43:     push    bp
  590.           mov     bp,43
  591.           jmp     reflect
  592. rf44:     push    bp
  593.           mov     bp,44
  594.           jmp     reflect
  595. rf45:     push    bp
  596.           mov     bp,45
  597.           jmp     reflect
  598. rf46:     push    bp
  599.           mov     bp,46
  600.           jmp     reflect
  601. rf47:     push    bp
  602.           mov     bp,47
  603.           jmp     reflect
  604. rf48:     push    bp
  605.           mov     bp,48
  606.           jmp     reflect
  607. rf49:     push    bp
  608.           mov     bp,49
  609.           jmp     reflect
  610. rf50:     push    bp
  611.           mov     bp,50
  612.           jmp     reflect
  613. rf51:     push    bp
  614.           mov     bp,51
  615.           jmp     reflect
  616. rf52:     push    bp
  617.           mov     bp,52
  618.           jmp     reflect
  619. rf53:     push    bp
  620.           mov     bp,53
  621.           jmp     reflect
  622. rf54:     push    bp
  623.           mov     bp,54
  624.           jmp     reflect
  625. rf55:     push    bp
  626.           mov     bp,55
  627.           jmp     reflect
  628. rf56:     push    bp
  629.           mov     bp,56
  630.           jmp     reflect
  631. rf57:     push    bp
  632.           mov     bp,57
  633.           jmp     reflect
  634. rf58:     push    bp
  635.           mov     bp,58
  636.           jmp     reflect
  637. rf59:     push    bp
  638.           mov     bp,59
  639.           jmp     reflect
  640. rf60:     push    bp
  641.           mov     bp,60
  642.           jmp     reflect
  643. rf61:     push    bp
  644.           mov     bp,61
  645.           jmp     reflect
  646. rf62:     push    bp
  647.           mov     bp,62
  648.           jmp     reflect
  649. rf63:     push    bp
  650.           mov     bp,63
  651.           jmp     reflect
  652. rf64:     push    bp
  653.           mov     bp,64
  654.           jmp     reflect
  655. rf65:     push    bp
  656.           mov     bp,65
  657.           jmp     reflect
  658. rf66:     push    bp
  659.           mov     bp,66
  660.           jmp     reflect
  661. rf67:     push    bp
  662.           mov     bp,67
  663.           jmp     reflect
  664. rf68:     push    bp
  665.           mov     bp,68
  666.           jmp     reflect
  667. rf69:     push    bp
  668.           mov     bp,69
  669.           jmp     reflect
  670. rf70:     push    bp
  671.           mov     bp,70
  672.           jmp     reflect
  673. rf71:     push    bp
  674.           mov     bp,71
  675.           jmp     reflect
  676. rf72:     push    bp
  677.           mov     bp,72
  678.           jmp     reflect
  679. rf73:     push    bp
  680.           mov     bp,73
  681.           jmp     reflect
  682. rf74:     push    bp
  683.           mov     bp,74
  684.           jmp     reflect
  685. rf75:     push    bp
  686.           mov     bp,75
  687.           jmp     reflect
  688. rf76:     push    bp
  689.           mov     bp,76
  690.           jmp     reflect
  691. rf77:     push    bp
  692.           mov     bp,77
  693.           jmp     reflect
  694. rf78:     push    bp
  695.           mov     bp,78
  696.           jmp     reflect
  697. rf79:     push    bp
  698.           mov     bp,79
  699.           jmp     reflect
  700. rf80:     push    bp
  701.           mov     bp,80
  702.           jmp     reflect
  703. rf81:     push    bp
  704.           mov     bp,81
  705.           jmp     reflect
  706. rf82:     push    bp
  707.           mov     bp,82
  708.           jmp     reflect
  709. rf83:     push    bp
  710.           mov     bp,83
  711.           jmp     reflect
  712. rf84:     push    bp
  713.           mov     bp,84
  714.           jmp     reflect
  715. rf85:     push    bp
  716.           mov     bp,85
  717.           jmp     reflect
  718. rf86:     push    bp
  719.           mov     bp,86
  720.           jmp     reflect
  721. rf87:     push    bp
  722.           mov     bp,87
  723.           jmp     reflect
  724. rf88:     push    bp
  725.           mov     bp,88
  726.           jmp     reflect
  727. rf89:     push    bp
  728.           mov     bp,89
  729.           jmp     reflect
  730. rf90:     push    bp
  731.           mov     bp,90
  732.           jmp     reflect
  733. rf91:     push    bp
  734.           mov     bp,91
  735.           jmp     reflect
  736. rf92:     push    bp
  737.           mov     bp,92
  738.           jmp     reflect
  739. rf93:     push    bp
  740.           mov     bp,93
  741.           jmp     reflect
  742. rf94:     push    bp
  743.           mov     bp,94
  744.           jmp     reflect
  745. rf95:     push    bp
  746.           mov     bp,95
  747.           jmp     reflect
  748. rf96:     push    bp
  749.           mov     bp,96
  750.           jmp     reflect
  751. rf97:     push    bp
  752.           mov     bp,97
  753.           jmp     reflect
  754. rf98:     push    bp
  755.           mov     bp,98
  756.           jmp     reflect
  757. rf99:     push    bp
  758.           mov     bp,99
  759.           jmp     reflect
  760. rf100:     push    bp
  761.           mov     bp,100
  762.           jmp     reflect
  763. rf101:     push    bp
  764.           mov     bp,101
  765.           jmp     reflect
  766. rf102:     push    bp
  767.           mov     bp,102
  768.           jmp     reflect
  769. rf103:     push    bp
  770.           mov     bp,103
  771.           jmp     reflect
  772. rf104:     push    bp
  773.           mov     bp,104
  774.           jmp     reflect
  775. rf105:     push    bp
  776.           mov     bp,105
  777.           jmp     reflect
  778. rf106:     push    bp
  779.           mov     bp,106
  780.           jmp     reflect
  781. rf107:     push    bp
  782.           mov     bp,107
  783.           jmp     reflect
  784. rf108:     push    bp
  785.           mov     bp,108
  786.           jmp     reflect
  787. rf109:     push    bp
  788.           mov     bp,109
  789.           jmp     reflect
  790. rf110:     push    bp
  791.           mov     bp,110
  792.           jmp     reflect
  793. rf111:     push    bp
  794.           mov     bp,111
  795.           jmp     reflect
  796. rf112:     push    bp
  797.           mov     bp,112
  798.           jmp     reflect
  799. rf113:     push    bp
  800.           mov     bp,113
  801.           jmp     reflect
  802. rf114:     push    bp
  803.           mov     bp,114
  804.           jmp     reflect
  805. rf115:     push    bp
  806.           mov     bp,115
  807.           jmp     reflect
  808. rf116:     push    bp
  809.           mov     bp,116
  810.           jmp     reflect
  811. rf117:     push    bp
  812.           mov     bp,117
  813.           jmp     reflect
  814. rf118:     push    bp
  815.           mov     bp,118
  816.           jmp     reflect
  817. rf119:     push    bp
  818.           mov     bp,119
  819.           jmp     reflect
  820. rf120:     push    bp
  821.           mov     bp,120
  822.           jmp     reflect
  823. rf121:     push    bp
  824.           mov     bp,121
  825.           jmp     reflect
  826. rf122:     push    bp
  827.           mov     bp,122
  828.           jmp     reflect
  829. rf123:     push    bp
  830.           mov     bp,123
  831.           jmp     reflect
  832. rf124:     push    bp
  833.           mov     bp,124
  834.           jmp     reflect
  835. rf125:     push    bp
  836.           mov     bp,125
  837.           jmp     reflect
  838. rf126:     push    bp
  839.           mov     bp,126
  840.           jmp     reflect
  841. rf127:     push    bp
  842.           mov     bp,127
  843.           jmp     reflect
  844. rf128:     push    bp
  845.           mov     bp,128
  846.           jmp     reflect
  847. rf129:     push    bp
  848.           mov     bp,129
  849.           jmp     reflect
  850. rf130:     push    bp
  851.           mov     bp,130
  852.           jmp     reflect
  853. rf131:     push    bp
  854.           mov     bp,131
  855.           jmp     reflect
  856. rf132:     push    bp
  857.           mov     bp,132
  858.           jmp     reflect
  859. rf133:     push    bp
  860.           mov     bp,133
  861.           jmp     reflect
  862. rf134:     push    bp
  863.           mov     bp,134
  864.           jmp     reflect
  865. rf135:     push    bp
  866.           mov     bp,135
  867.           jmp     reflect
  868. rf136:     push    bp
  869.           mov     bp,136
  870.           jmp     reflect
  871. rf137:     push    bp
  872.           mov     bp,137
  873.           jmp     reflect
  874. rf138:     push    bp
  875.           mov     bp,138
  876.           jmp     reflect
  877. rf139:     push    bp
  878.           mov     bp,139
  879.           jmp     reflect
  880. rf140:     push    bp
  881.           mov     bp,140
  882.           jmp     reflect
  883. rf141:     push    bp
  884.           mov     bp,141
  885.           jmp     reflect
  886. rf142:     push    bp
  887.           mov     bp,142
  888.           jmp     reflect
  889. rf143:     push    bp
  890.           mov     bp,143
  891.           jmp     reflect
  892. rf144:     push    bp
  893.           mov     bp,144
  894.           jmp     reflect
  895. rf145:     push    bp
  896.           mov     bp,145
  897.           jmp     reflect
  898. rf146:     push    bp
  899.           mov     bp,146
  900.           jmp     reflect
  901. rf147:     push    bp
  902.           mov     bp,147
  903.           jmp     reflect
  904. rf148:     push    bp
  905.           mov     bp,148
  906.           jmp     reflect
  907. rf149:     push    bp
  908.           mov     bp,149
  909.           jmp     reflect
  910. rf150:     push    bp
  911.           mov     bp,150
  912.           jmp     reflect
  913. rf151:     push    bp
  914.           mov     bp,151
  915.           jmp     reflect
  916. rf152:     push    bp
  917.           mov     bp,152
  918.           jmp     reflect
  919. rf153:     push    bp
  920.           mov     bp,153
  921.           jmp     reflect
  922. rf154:     push    bp
  923.           mov     bp,154
  924.           jmp     reflect
  925. rf155:     push    bp
  926.           mov     bp,155
  927.           jmp     reflect
  928. rf156:     push    bp
  929.           mov     bp,156
  930.           jmp     reflect
  931. rf157:     push    bp
  932.           mov     bp,157
  933.           jmp     reflect
  934. rf158:     push    bp
  935.           mov     bp,158
  936.           jmp     reflect
  937. rf159:     push    bp
  938.           mov     bp,159
  939.           jmp     reflect
  940. rf160:     push    bp
  941.           mov     bp,160
  942.           jmp     reflect
  943. rf161:     push    bp
  944.           mov     bp,161
  945.           jmp     reflect
  946. rf162:     push    bp
  947.           mov     bp,162
  948.           jmp     reflect
  949. rf163:     push    bp
  950.           mov     bp,163
  951.           jmp     reflect
  952. rf164:     push    bp
  953.           mov     bp,164
  954.           jmp     reflect
  955. rf165:     push    bp
  956.           mov     bp,165
  957.           jmp     reflect
  958. rf166:     push    bp
  959.           mov     bp,166
  960.           jmp     reflect
  961. rf167:     push    bp
  962.           mov     bp,167
  963.           jmp     reflect
  964. rf168:     push    bp
  965.           mov     bp,168
  966.           jmp     reflect
  967. rf169:     push    bp
  968.           mov     bp,169
  969.           jmp     reflect
  970. rf170:     push    bp
  971.           mov     bp,170
  972.           jmp     reflect
  973. rf171:     push    bp
  974.           mov     bp,171
  975.           jmp     reflect
  976. rf172:     push    bp
  977.           mov     bp,172
  978.           jmp     reflect
  979. rf173:     push    bp
  980.           mov     bp,173
  981.           jmp     reflect
  982. rf174:     push    bp
  983.           mov     bp,174
  984.           jmp     reflect
  985. rf175:     push    bp
  986.           mov     bp,175
  987.           jmp     reflect
  988. rf176:     push    bp
  989.           mov     bp,176
  990.           jmp     reflect
  991. rf177:     push    bp
  992.           mov     bp,177
  993.           jmp     reflect
  994. rf178:     push    bp
  995.           mov     bp,178
  996.           jmp     reflect
  997. rf179:     push    bp
  998.           mov     bp,179
  999.           jmp     reflect
  1000. rf180:     push    bp
  1001.           mov     bp,180
  1002.           jmp     reflect
  1003. rf181:     push    bp
  1004.           mov     bp,181
  1005.           jmp     reflect
  1006. rf182:     push    bp
  1007.           mov     bp,182
  1008.           jmp     reflect
  1009. rf183:     push    bp
  1010.           mov     bp,183
  1011.           jmp     reflect
  1012. rf184:     push    bp
  1013.           mov     bp,184
  1014.           jmp     reflect
  1015. rf185:     push    bp
  1016.           mov     bp,185
  1017.           jmp     reflect
  1018. rf186:     push    bp
  1019.           mov     bp,186
  1020.           jmp     reflect
  1021. rf187:     push    bp
  1022.           mov     bp,187
  1023.           jmp     reflect
  1024. rf188:     push    bp
  1025.           mov     bp,188
  1026.           jmp     reflect
  1027. rf189:     push    bp
  1028.           mov     bp,189
  1029.           jmp     reflect
  1030. rf190:     push    bp
  1031.           mov     bp,190
  1032.           jmp     reflect
  1033. rf191:     push    bp
  1034.           mov     bp,191
  1035.           jmp     reflect
  1036. rf192:     push    bp
  1037.           mov     bp,192
  1038.           jmp     reflect
  1039. rf193:     push    bp
  1040.           mov     bp,193
  1041.           jmp     reflect
  1042. rf194:     push    bp
  1043.           mov     bp,194
  1044.           jmp     reflect
  1045. rf195:     push    bp
  1046.           mov     bp,195
  1047.           jmp     reflect
  1048. rf196:     push    bp
  1049.           mov     bp,196
  1050.           jmp     reflect
  1051. rf197:     push    bp
  1052.           mov     bp,197
  1053.           jmp     reflect
  1054. rf198:     push    bp
  1055.           mov     bp,198
  1056.           jmp     reflect
  1057. rf199:     push    bp
  1058.           mov     bp,199
  1059.           jmp     reflect
  1060. rf200:     push    bp
  1061.           mov     bp,200
  1062.           jmp     reflect
  1063. rf201:     push    bp
  1064.           mov     bp,201
  1065.           jmp     reflect
  1066. rf202:     push    bp
  1067.           mov     bp,202
  1068.           jmp     reflect
  1069. rf203:     push    bp
  1070.           mov     bp,203
  1071.           jmp     reflect
  1072. rf204:     push    bp
  1073.           mov     bp,204
  1074.           jmp     reflect
  1075. rf205:     push    bp
  1076.           mov     bp,205
  1077.           jmp     reflect
  1078. rf206:     push    bp
  1079.           mov     bp,206
  1080.           jmp     reflect
  1081. rf207:     push    bp
  1082.           mov     bp,207
  1083.           jmp     reflect
  1084. rf208:     push    bp
  1085.           mov     bp,208
  1086.           jmp     reflect
  1087. rf209:     push    bp
  1088.           mov     bp,209
  1089.           jmp     reflect
  1090. rf210:     push    bp
  1091.           mov     bp,210
  1092.           jmp     reflect
  1093. rf211:     push    bp
  1094.           mov     bp,211
  1095.           jmp     reflect
  1096. rf212:     push    bp
  1097.           mov     bp,212
  1098.           jmp     reflect
  1099. rf213:     push    bp
  1100.           mov     bp,213
  1101.           jmp     reflect
  1102. rf214:     push    bp
  1103.           mov     bp,214
  1104.           jmp     reflect
  1105. rf215:     push    bp
  1106.           mov     bp,215
  1107.           jmp     reflect
  1108. rf216:     push    bp
  1109.           mov     bp,216
  1110.           jmp     reflect
  1111. rf217:     push    bp
  1112.           mov     bp,217
  1113.           jmp     reflect
  1114. rf218:     push    bp
  1115.           mov     bp,218
  1116.           jmp     reflect
  1117. rf219:     push    bp
  1118.           mov     bp,219
  1119.           jmp     reflect
  1120. rf220:     push    bp
  1121.           mov     bp,220
  1122.           jmp     reflect
  1123. rf221:     push    bp
  1124.           mov     bp,221
  1125.           jmp     reflect
  1126. rf222:     push    bp
  1127.           mov     bp,222
  1128.           jmp     reflect
  1129. rf223:     push    bp
  1130.           mov     bp,223
  1131.           jmp     reflect
  1132. rf224:     push    bp
  1133.           mov     bp,224
  1134.           jmp     reflect
  1135. rf225:     push    bp
  1136.           mov     bp,225
  1137.           jmp     reflect
  1138. rf226:     push    bp
  1139.           mov     bp,226
  1140.           jmp     reflect
  1141. rf227:     push    bp
  1142.           mov     bp,227
  1143.           jmp     reflect
  1144. rf228:     push    bp
  1145.           mov     bp,228
  1146.           jmp     reflect
  1147. rf229:     push    bp
  1148.           mov     bp,229
  1149.           jmp     reflect
  1150. rf230:     push    bp
  1151.           mov     bp,230
  1152.           jmp     reflect
  1153. rf231:     push    bp
  1154.           mov     bp,231
  1155.           jmp     reflect
  1156. rf232:     push    bp
  1157.           mov     bp,232
  1158.           jmp     reflect
  1159. rf233:     push    bp
  1160.           mov     bp,233
  1161.           jmp     reflect
  1162. rf234:     push    bp
  1163.           mov     bp,234
  1164.           jmp     reflect
  1165. rf235:     push    bp
  1166.           mov     bp,235
  1167.           jmp     reflect
  1168. rf236:     push    bp
  1169.           mov     bp,236
  1170.           jmp     reflect
  1171. rf237:     push    bp
  1172.           mov     bp,237
  1173.           jmp     reflect
  1174. rf238:     push    bp
  1175.           mov     bp,238
  1176.           jmp     reflect
  1177. rf239:     push    bp
  1178.           mov     bp,239
  1179.           jmp     reflect
  1180. rf240:     push    bp
  1181.           mov     bp,240
  1182.           jmp     reflect
  1183. rf241:     push    bp
  1184.           mov     bp,241
  1185.           jmp     reflect
  1186. rf242:     push    bp
  1187.           mov     bp,242
  1188.           jmp     reflect
  1189. rf243:     push    bp
  1190.           mov     bp,243
  1191.           jmp     reflect
  1192. rf244:     push    bp
  1193.           mov     bp,244
  1194.           jmp     reflect
  1195. rf245:     push    bp
  1196.           mov     bp,245
  1197.           jmp     reflect
  1198. rf246:     push    bp
  1199.           mov     bp,246
  1200.           jmp     reflect
  1201. rf247:     push    bp
  1202.           mov     bp,247
  1203.           jmp     reflect
  1204. rf248:     push    bp
  1205.           mov     bp,248
  1206.           jmp     reflect
  1207. rf249:     push    bp
  1208.           mov     bp,249
  1209.           jmp     reflect
  1210. rf250:     push    bp
  1211.           mov     bp,250
  1212.           jmp     reflect
  1213. rf251:     push    bp
  1214.           mov     bp,251
  1215.           jmp     reflect
  1216. rf252:     push    bp
  1217.           mov     bp,252
  1218.           jmp     reflect
  1219. rf253:     push    bp
  1220.           mov     bp,253
  1221.           jmp     reflect
  1222. rf254:     push    bp
  1223.           mov     bp,254
  1224.           jmp     reflect
  1225. rf255:     push    bp
  1226.           mov     bp,255
  1227.           jmp     reflect
  1228.  
  1229. TRgs    EQU    WORD PTR [bp] +36
  1230. TRfs    EQU    WORD PTR [bp] +32
  1231. TRds    EQU    WORD PTR [bp] +28
  1232. TRes    EQU    WORD PTR [bp] +24
  1233. TRss    EQU    WORD PTR [bp] +20
  1234. TRsp    EQU    WORD PTR [bp] +16
  1235. TRflag    EQU    WORD PTR [bp] +12
  1236. TRcs    EQU    WORD PTR [bp] +8
  1237. TRip    EQU    WORD PTR [bp] +4
  1238. TRerr    EQU    WORD PTR [bp] +0
  1239.  
  1240. ;*   *   *   *   *   *   *   *   *   *   *   *******
  1241. ;
  1242. ; all we have to do here is modify
  1243. ; EIP to skip the faulting instruction,
  1244. ; then got back to the faulting instruction.
  1245. ;     ex sequence
  1246. ; switch stack to level in cs selector of gate.
  1247. ; push 86 style: gs,gs,ds,es (as 32 bit)
  1248. ; load segs with 0
  1249. ; push 86: ss,esp,eflag,cs,eip
  1250. ; load cs:eip from gate, and go.
  1251. ; all as 32 bit:
  1252. ;     gs    40
  1253. ;     fs    36
  1254. ;     ds    32
  1255. ;     es    28
  1256. ;     ss    24
  1257. ;     sp    20
  1258. ;     flag    16
  1259. ;     cs    12
  1260. ;     ip    8
  1261. ;     errcode    4
  1262. ;     bp
  1263. ;     bp    <SP
  1264. ;
  1265. ex13_int:
  1266. ; start    ;7/15/86
  1267. ;     mov    bp,0Dh
  1268. ;     jmp    exs_int
  1269. ; end
  1270.     add    sp,4    ;skip past error code!
  1271.     push    bp
  1272.     push    bp
  1273.     mov    bp,sp
  1274.     push    ax
  1275.     push    bx
  1276.     push    cx
  1277.     push    dx
  1278.     push    di
  1279.     push    si
  1280.     or    TRflag,IOPLFL
  1281.     mov    bx,FLAT_SEL
  1282.     mov    DS,bx
  1283.     DB    OP_SIZE
  1284.     xor    bx,bx
  1285.     mov    bx,TRCS
  1286.     DB    OP_SIZE
  1287.     shl    bx,1
  1288.     DB    OP_SIZE
  1289.     shl    bx,1
  1290.     DB    OP_SIZE
  1291.     shl    bx,1
  1292.     DB    OP_SIZE
  1293.     shl    bx,1
  1294.     DB    OP_SIZE
  1295.     add    bx,TRIP
  1296.     mov    al,'^'
  1297.     PUTCH_PL
  1298.     BEEP
  1299.     mov    cx,3000h
  1300. wait999: loop    wait999
  1301.     cmp    BYTE PTR [bx],0F4h    ;hlt
  1302.     jne    not_hlt
  1303. ;
  1304.     sti
  1305.     hlt
  1306.  
  1307.     pop    si
  1308.     pop    di
  1309.     pop    dx
  1310.     pop    cx
  1311.     pop    bx
  1312.     pop    ax
  1313.     pop    bp
  1314.     pop    bp
  1315.     DB    OP_SIZE
  1316.     iret
  1317. not_hlt:
  1318.     pop    si
  1319.     pop    di
  1320.     pop    dx
  1321.     pop    cx
  1322.     pop    bx
  1323.     pop    ax
  1324.     pop    bp
  1325.     pop    bp
  1326.     mov    ax,4C01h
  1327.     jmp    rf33
  1328.  
  1329.  
  1330. ;*   *   *   *   *   *   *   *   *   *   *   *******
  1331. ;       interrupt/exception reflectors
  1332. ;*   *   *   *   *   *   *   *   *   *   *   *******
  1333. ;
  1334. ;    build 86 handler fram
  1335. ;    change trap frame to 86 int frame
  1336. ;    ARGS  ax     int type
  1337. ;
  1338. ;*   *   *   *   *   *   *   *   *   *   *   *******
  1339. reflect:
  1340.     push    ax
  1341.     mov    ax,bp
  1342.     mov    bp,sp
  1343.     push    bx
  1344.     push    ax    ; save int type
  1345.     mov    ax,FLAT_SEL
  1346.     mov    DS,ax
  1347.     DB    OP_SIZE
  1348.     xor    ax,ax
  1349.     mov    ax,TRSP    ; change tos
  1350.     sub    ax,3*2
  1351.     mov    TRSP,ax
  1352.     DB    OP_SIZE
  1353.     xor    bx,bx
  1354.     mov    bx,TRSS
  1355.     ; shl    bx,4
  1356.     DB    OP_SIZE
  1357.     shl    bx,1
  1358.     DB    OP_SIZE
  1359.     shl    bx,1
  1360.     DB    OP_SIZE
  1361.     shl    bx,1
  1362.     DB    OP_SIZE
  1363.     shl    bx,1
  1364.     DB    OP_SIZE
  1365.     add    bx,ax
  1366.     mov    ax,TRIP
  1367.     ; mov    [bx] +0,ax
  1368.     DB    P_SIZE,MOV_PBX_AX,43h,0
  1369.     mov    ax,TRCS
  1370.     ; mov    [bx] +2,ax
  1371.     DB    P_SIZE,MOV_PBX_AX,43h,2
  1372.     mov    ax,TRflag
  1373.     ; mov    [bx] +4,ax
  1374.     DB    P_SIZE,MOV_PBX_AX,43h,4
  1375.     pop    bx
  1376.     shl    bx,1
  1377.     shl    bx,1
  1378.     mov    ax,[bx] +0
  1379.     mov    TRIP,ax
  1380.     mov    ax,[bx] +2
  1381.     mov    TRCS,ax
  1382.     or    TRFLAG +2,VMFL
  1383.     and    TRFLAG +0,NOT IFL
  1384.     pop    bx
  1385.     pop    ax
  1386.     pop    bp
  1387.     DB    OP_SIZE
  1388.     iret
  1389.  
  1390. ;*   *   *   *   *   *   *   *   *   *   *   *******
  1391. ; 1,6,7,8,a,b,c
  1392. ;
  1393. exs_int:
  1394.     mov    ax,bp
  1395.     add    al,30h
  1396.     cmp    al,3Ah
  1397.     jb    end_al
  1398.     add    al,7
  1399. end_al:
  1400.     PUTCH_PL
  1401.     BEEP
  1402.     DB    OP_SIZE
  1403.     xor    ax,ax
  1404.     ; mov    CR0,ax
  1405.     DB    00Fh,022h,0c0h
  1406.     jmp    flush0
  1407. flush0:    jmp    FAR PTR fflush
  1408. fflush    LABEL    FAR
  1409.     int    19h
  1410.     hlt
  1411.  
  1412.  
  1413. ;*   *   *   *   *   *   *   *   *   *   *   *******
  1414. ;
  1415. ; emulate to faulting opcode
  1416. ; ARGS  ds:si   opcode p
  1417. ; RET   ax      opcode size
  1418. ;
  1419. ; emulate    PROC    NEAR
  1420. ; emulate    ENDP
  1421. ;
  1422. end_mon_code    LABEL    BYTE
  1423. MON_CODE    ENDS
  1424.  
  1425.  
  1426. ;*   *   *   *   *   *   *   *   *   *   *   *******
  1427. VM_DATA SEGMENT
  1428.     DW    512 DUP(?)
  1429. vm_tos    LABEL    WORD
  1430. VM_DATA    ENDS
  1431.  
  1432.  
  1433. ;*   *   *   *   *   *   *   *   *   *   *   *******
  1434. VM_CODE    SEGMENT
  1435. ASSUME    CS:    vm_code, ds: tdata, es: NOTHING
  1436.  
  1437. ;*   *   *   *   *   *   *   *   *   *   *   *******
  1438. ;
  1439. ;    main vm code
  1440. ; from dos
  1441. ;
  1442. begin_vm:
  1443.     NOP
  1444.     NOP
  1445.     NOP
  1446.     NOP
  1447.     NOP
  1448.     NOP
  1449.     NOP
  1450.     NOP
  1451.     mov    ax,TDATA
  1452.     mov    DS,ax
  1453.     mov    ES,ax
  1454.     mov    ax,VM_DATA
  1455.     mov    SS,ax
  1456.     mov    sp,OFFSET vm_tos
  1457. ;
  1458. ;  setup tables
  1459. ;
  1460.     cld
  1461.     call    init_bases
  1462.     call    init_idt
  1463.     ; lidt    idt_pword
  1464.     DB    00Fh,001h,01Eh
  1465.     DW    idt_pword
  1466.     ; lgdt    gdt_pword
  1467.     DB    00Fh,001h,016h
  1468.     DW    gdt_pword
  1469.     mov    bx,TMP_TSS_SEL
  1470.     cli
  1471.     ; mov    ax,CR0
  1472.     DB    0Fh,20h,0C0h
  1473.     or    ax,1
  1474.     ; mov    CR0,ax
  1475.     DB    00Fh,022h,0C0h
  1476.     jmp    SHORT    flush
  1477. flush:                ; in protected mode level 0
  1478.     ; ltr    bx
  1479.     DB    00Fh,000h,0DBh
  1480.     ; sti            ; in task switch
  1481. ;
  1482. ; go virtual
  1483. ;
  1484.     jmp    CS:DWORD PTR vm_entry
  1485. vm_entry    LABEL DWORD
  1486.     DW    0,MON_TSS_SEL
  1487. ;
  1488. ; back to dos
  1489. ;
  1490. dos_ret:
  1491.     NOP
  1492. ;start    ;7/15/86
  1493.     mov    al,'!'
  1494.     PUTCH_VL
  1495.     cli
  1496.     BEEP
  1497.     sti
  1498.     mov    al,'@'
  1499.     PUTCH_VL
  1500.     mov    dx,ZLAST    ; dx   keep paragraph size
  1501.     sub    dx,AFIRST
  1502.     inc    dx
  1503.     mov    ax,3100h    ; al   return code
  1504.     int    DOS
  1505.      int    19h
  1506.     hlt
  1507.  
  1508.  
  1509. ;*   *   *   *   *   *   *   *   *   *   *   *******
  1510. ; turn all 16 bit offsets into 20 bit linear addresses
  1511. ;
  1512. init_bases    PROC    NEAR
  1513.     push    DS
  1514.     mov    ax,TDATA
  1515.     mov    DS,ax
  1516.     mov    si,OFFSET base_table
  1517.     mov    cx,base_table -2
  1518.     cld
  1519. base_fill:
  1520.     lodsw
  1521.     mov    bx,ax
  1522.     lodsw
  1523.     xor    dx,dx
  1524.     shl    ax,1
  1525.     rcl    dx,1
  1526.     shl    ax,1
  1527.     rcl    dx,1
  1528.     shl    ax,1
  1529.     rcl    dx,1
  1530.     shl    ax,1
  1531.     rcl    dx,1
  1532.     add    [bx],ax
  1533.     adc    [bx] +2,dl    ;6/27/86
  1534.     loop    base_fill
  1535.     pop    DS
  1536.     ret
  1537. init_bases    ENDP
  1538.  
  1539. ;*   *   *   *   *   *   *   *   *   *   *   *******
  1540. ;    DW    ex13_int
  1541. ;    DW    MON_CODE_SEL    ;sel mon code
  1542. ;    DB    0
  1543. ;    DB    0EEh    ; - dpl=3 - 386 int gate
  1544. ;    DB    0
  1545. ;    DB    0
  1546. ;
  1547. init_idt    PROC    NEAR
  1548.     push    DS
  1549.     push    ES
  1550.     mov    ax,TDATA
  1551.     mov    DS,ax        ;ds    tdata
  1552.     mov    ES,ax        ;es    ints
  1553.     mov    dx,OFFSET rf0
  1554.     mov    di,OFFSET idt
  1555.     mov    cx,256
  1556. idt_fill:
  1557.     mov    ax,dx
  1558.     add    dx,SIZE_RF
  1559.     add    di,8
  1560.     cmp    cx,256-13
  1561.     je    over_fill
  1562.     sub    di,8
  1563.     stosw
  1564.     mov    ax,MON_CODE_SEL
  1565.     stosw
  1566.     mov    ax,0EE00h
  1567.     stosw
  1568.     xor    ax,ax
  1569.     stosw
  1570. over_fill:
  1571.     loop    idt_fill
  1572.     pop    ES
  1573.     pop    DS
  1574.     ret
  1575. init_idt    ENDP
  1576.  
  1577.  
  1578. ;*   *   *   *   *   *   *   *   *   *   *   *******
  1579. ;    UTILITIES
  1580. ;*   *   *   *   *   *   *   *   *   *   *   *******
  1581. ; ARGS    ax    selector value
  1582. ; RET    ax    segment value
  1583. ;
  1584. sel2seg    PROC    NEAR
  1585.     push    DS
  1586.     push    bx
  1587.     mov    bx,GDT_ALIAS
  1588.     test    ax,4
  1589.     jz    have_table
  1590.     mov    bx,LDT_ALIAS
  1591. have_table:
  1592.     mov    DS,bx
  1593.     mov    bx,ax
  1594.     and    bx,NOT 7
  1595.     mov    ax,[bx] +2        ;get 16
  1596.     test    ax,3
  1597.     jz    ok_selector
  1598.     int    3
  1599. ok_selector:
  1600.     shr    ax,1
  1601.     shr    ax,1
  1602.     pop    bx
  1603.     pop    DS
  1604.     ret
  1605. sel2seg    ENDP
  1606.  
  1607. VM_CODE    ENDS
  1608.  
  1609. ZLAST    SEGMENT    PARA
  1610. last_data    DW    ?
  1611. ZLAST    ENDS
  1612.     
  1613.     END    begin_vm
  1614.  
  1615.