home *** CD-ROM | disk | FTP | other *** search
/ PC World 2002 February / PCWorld_2002-02_cd.bin / Software / Vyzkuste / ranish / SOURCES.ZIP / CONIO.ASM < prev    next >
Assembly Source File  |  1998-01-28  |  12KB  |  867 lines

  1. .MODEL LARGE
  2. .DATA
  3.  
  4. PUBLIC    _ScreenWidth
  5. PUBLIC    _ScreenHeight
  6. PUBLIC    _MouseInstalled
  7.  
  8. _ScreenArea    EQU DWord Ptr _ScreenOffset
  9. _ScreenOffset    DW   ?    ; 0000h
  10. _ScreenSegment    DW   ?    ; B800h
  11. _ScreenWidth    DB   ?    ;  80
  12. _ScreenHeight    DB   ?    ;  25
  13. _ScreenLength    DW   ?    ; 80*25
  14. _MouseInstalled    DW   ?    ; 0 or 1
  15. _LastKeyShifts    DW   ?    ;
  16. _LastMousePosX    DW   ?  ;
  17. _LastMousePosY    DW   ?  ;
  18. _LastMouseBtns    DW   ?    ;
  19. OriginalTimer1    DW   ?    ;
  20. OriginalTimer2    DW   ?    ;
  21.  
  22. .CODE
  23. LOCALS
  24.  
  25. PUBLIC    _conio_init
  26. PUBLIC    _conio_exit
  27. PUBLIC    _show_mouse
  28. PUBLIC    _hide_mouse
  29. PUBLIC    _move_mouse
  30. PUBLIC    _cursor_size
  31. PUBLIC    _move_cursor
  32. PUBLIC    _get_event
  33. PUBLIC    _write_char
  34. PUBLIC    _write_string
  35. PUBLIC    _load_window
  36. PUBLIC    _save_window
  37. PUBLIC    _clear_window
  38. PUBLIC    _scroll_window
  39. PUBLIC    _border_window
  40.  
  41.  
  42. Show_Mouse    MACRO
  43.         cmp    _MouseInstalled, 1
  44.         jne    @@nomouse1
  45.         mov    ax, 0001h
  46.         int    33h
  47.     @@nomouse1:
  48.         ENDM
  49.  
  50.  
  51. Hide_Mouse    MACRO
  52.         cmp    _MouseInstalled, 1
  53.         jne    @@nomouse2
  54.         mov    ax, 0002h
  55.         int    33h
  56.     @@nomouse2:
  57.         ENDM
  58.  
  59.  
  60. ;----------------------------------------------------------------
  61.  
  62.  
  63. _conio_init    PROC
  64.         push    bp
  65.         mov    bp, sp
  66.         push    es
  67.         push    si
  68.         push    di
  69.  
  70.         mov    ah,0Fh        ; Check current video mode
  71.         int    10h
  72.  
  73.         cmp    al,07h
  74.         je    @@Mono
  75.         cmp    al,03h
  76.         je    @@Color
  77.     @@Reset:
  78.         mov    ax,03        ; If unknown set Color 80x25
  79.         int    10h
  80.     @@Color:  
  81.         mov    _ScreenSegment, 0B800h
  82.         jmp    @@skip1
  83.     @@Mono:
  84.         mov    _ScreenSegment, 0B000h
  85.     @@skip1:
  86.         push    ds
  87.         mov    ax, 0
  88.         mov    ds, ax
  89.         mov    bx, 484h
  90.         mov    al, [bx]
  91.         pop    ds
  92.         inc    al
  93.         mov    _ScreenHeight, al
  94.         mov    ah,0Fh
  95.         int    10h
  96.         mov    _ScreenWidth, ah
  97.         mov    al, _ScreenHeight
  98.         mov    ah, _ScreenWidth
  99.         mul    ah
  100.         mov    _ScreenLength, ax
  101.         mov    _ScreenOffset, 0h
  102.         
  103.         mov    ax,0000h    ; Check for a mouse
  104.         int    33h
  105.         cmp    ax, 0h
  106.         je    @@No_Mouse
  107.         cmp    ax, 3h
  108.         je    @@_Mouse
  109.         cmp    ax, 2h
  110.         je    @@_Mouse
  111.         cmp    ax, 0FFFFh
  112.         mov    ax, 2h
  113.         je    @@_Mouse
  114.         mov    ax, 1h
  115.     @@_Mouse:
  116.         mov    _MouseInstalled, 1
  117.         mov    ax, 0003h    ; Reset mouse
  118.         int    33h
  119.         mov    _LastMousePosX, cx
  120.         mov    _LastMousePosY, dx
  121.         mov    _LastMouseBtns, bx
  122.         jmp    @@skip2
  123.     @@No_Mouse:
  124.         mov    _MouseInstalled, 0
  125.     @@skip2:    
  126.         mov    ah, 12h        ; Get keyboard status
  127.         int    16h
  128.         mov    _LastKeyShifts, ax
  129.         
  130.         pop    di
  131.         pop    si
  132.         pop    es
  133.         pop    bp
  134.         retf
  135. _conio_init    ENDP
  136.  
  137.  
  138. _conio_exit    PROC
  139.         retf
  140. _conio_exit    ENDP
  141.  
  142.  
  143. ;----------------------------------------------------------------
  144.  
  145.  
  146. _show_mouse    PROC
  147.         Show_Mouse
  148.         retf
  149. _show_mouse    ENDP
  150.  
  151.  
  152.  
  153. _hide_mouse    PROC
  154.         Hide_Mouse
  155.         retf
  156. _hide_mouse    ENDP
  157.  
  158.  
  159.  
  160. _move_mouse    PROC
  161.  
  162.     Y    EQU    [bp+08h]
  163.     X    EQU    [bp+06h]
  164.  
  165.         push    bp
  166.         mov    bp, sp
  167.         mov    ax, 0004h
  168.         mov    cx, X
  169.         mov    dx, Y 
  170.  
  171.         dec    cx
  172.         shl    cx, 1
  173.         shl    cx, 1
  174.         shl    cx, 1
  175.  
  176.         dec    dx
  177.         shl    dx, 1
  178.         shl    dx, 1
  179.         shl    dx, 1
  180.  
  181.         int    33h
  182.         pop    bp
  183.         retf
  184. _move_mouse  ENDP
  185.  
  186.  
  187. ;----------------------------------------------------------------
  188.  
  189.  
  190. _move_cursor    PROC
  191.  
  192.     Y    EQU    [bp+08h]
  193.     X    EQU    [bp+06h]
  194.  
  195.         push    bp
  196.         mov    bp, sp
  197.         mov    ah, 02
  198.         mov    bh, 00
  199.         mov    dl, X
  200.         mov    dh, Y
  201.         sub    dx, 0101h
  202.         int    10h
  203.         pop    bp
  204.         retf
  205. _move_cursor    ENDP
  206.  
  207.  
  208. _cursor_size    PROC
  209.  
  210.       Bottom    EQU    [bp+08h]
  211.     Top    EQU    [bp+06h]
  212.  
  213.         push    bp
  214.         mov    bp, sp
  215.         mov    ah, 01
  216.         mov    cl, Top
  217.         mov    ch, Bottom
  218.         and    cx, 1F1Fh
  219.         int    10h
  220.         pop    bp
  221.         retf
  222.  
  223. _cursor_size    ENDP
  224.  
  225.  
  226. ;----------------------------------------------------------------
  227.  
  228.  
  229. _write_char    PROC
  230.  
  231.     C    EQU    [bp+0Ch]
  232.     Y    EQU    [bp+0Ah]
  233.     X    EQU    [bp+08h]
  234.     Attribute    EQU    [bp+06h]
  235.  
  236.         Hide_Mouse
  237.  
  238.         push    bp
  239.         mov    bp, sp
  240.         push    ds
  241.         push    di
  242.         push    si
  243.         sub    ax, ax
  244.         mov    bx, ax
  245.         mov    cx, bx
  246.         mov    dx, cx
  247.     
  248.         mov    dl, _ScreenWidth
  249.         mov    al, Y
  250.         mov    bl, X     
  251.         dec    al
  252.         dec    bl     
  253.         mul    dl
  254.         add    ax, bx
  255.         shl    ax, 1
  256.         les    di, _ScreenArea
  257.         add    di, ax
  258.  
  259.         mov    al, C
  260.         mov    ah, Attribute
  261.         stosw
  262.  
  263.         pop    si
  264.         pop    di
  265.         pop    ds
  266.         pop    bp
  267.  
  268.         Show_Mouse
  269.         retf
  270. _write_char    ENDP
  271.  
  272.  
  273.  
  274. _write_string    PROC
  275.  
  276.     S    EQU    [bp+0Ch]
  277.     Y    EQU    [bp+0Ah]
  278.     X    EQU    [bp+08h]
  279.     Attribute    EQU    [bp+06h]
  280.  
  281.         Hide_Mouse
  282.  
  283.         push    bp
  284.         mov    bp, sp
  285.         push    ds
  286.         push    di
  287.         push    si
  288.         sub    ax, ax
  289.         mov    bx, ax
  290.         mov    cx, bx
  291.         mov    dx, cx
  292.     
  293.         mov    dl, _ScreenWidth
  294.         mov    al, Y
  295.         mov    bl, X     
  296.         dec    al
  297.         dec    bl     
  298.         mul    dl
  299.         add    ax, bx
  300.         shl    ax, 1
  301.         les    di, _ScreenArea
  302.         lds    si, S
  303.         add    di, ax
  304.  
  305.         mov    ah, Attribute
  306.         jmp    @@first
  307.     @@next:
  308.         stosw
  309.     @@first:
  310.         lodsb
  311.         cmp    al, 0
  312.         jne    @@next
  313.         
  314.         pop    si
  315.         pop    di
  316.         pop    ds
  317.         pop    bp
  318.  
  319.         Show_Mouse
  320.         retf
  321. _write_string    ENDP
  322.  
  323.  
  324. ;----------------------------------------------------------------
  325.  
  326.  
  327. _save_window    PROC
  328.  
  329.    Destination    EQU    [bp+0Eh]
  330.     H    EQU    [bp+0Ch]
  331.     W    EQU    [bp+0Ah]
  332.     Y    EQU    [bp+08h]
  333.     X    EQU    [bp+06h]
  334.  
  335.         Hide_Mouse
  336.  
  337.         push    bp
  338.         mov    bp, sp
  339.         push    ds
  340.         push    di
  341.         push    si
  342.         sub    ax, ax
  343.         mov    bx, ax
  344.         mov    cx, bx
  345.         mov    dx, cx
  346.     
  347.         mov    dl, _ScreenWidth
  348.         mov    al, Y
  349.         mov    bl, X     
  350.         dec    al
  351.         dec    bl     
  352.         mul    dl
  353.         add    ax, bx
  354.         shl    ax, 1
  355.         les    di, Destination
  356.         lds    si, _ScreenArea
  357.         add    si, ax
  358.         mov    bl, W
  359.         mov    bh, H
  360.         sub    dl, bl
  361.         shl    dx, 1
  362.     @@next_row:
  363.         mov    cl, bl
  364.         rep
  365.          movsw
  366.         add    si, dx
  367.         dec    bh
  368.         jne    @@next_row
  369.  
  370.         pop    si
  371.         pop    di
  372.         pop    ds
  373.         pop    bp
  374.  
  375.         Show_Mouse
  376.         retf
  377. _save_window    ENDP
  378.  
  379.  
  380.  
  381. _load_window    PROC
  382.  
  383.      Source    EQU    [bp+0Eh]
  384.     H    EQU    [bp+0Ch]
  385.     W    EQU    [bp+0Ah]
  386.     Y    EQU    [bp+08h]
  387.     X    EQU    [bp+06h]
  388.  
  389.         Hide_Mouse
  390.  
  391.         push    bp
  392.         mov    bp, sp
  393.         push    ds
  394.         push    di
  395.         push    si
  396.         sub    ax, ax
  397.         mov    bx, ax
  398.         mov    cx, bx
  399.         mov    dx, cx
  400.     
  401.         mov    dl, _ScreenWidth
  402.         mov    al, Y
  403.         mov    bl, X     
  404.         dec    al
  405.         dec    bl     
  406.         mul    dl
  407.         add    ax, bx
  408.         shl    ax, 1
  409.         les    di, _ScreenArea
  410.         lds    si, Source
  411.         add    di, ax
  412.  
  413.         mov    bl, W
  414.         mov    bh, H
  415.         sub    dl, bl
  416.         shl    dx, 1
  417.         
  418.     @@next_row:
  419.         mov    cl, bl
  420.         rep
  421.          movsw
  422.         add    di, dx
  423.         dec    bh
  424.         jne    @@next_row
  425.                 
  426.         pop    si
  427.         pop    di
  428.         pop    ds
  429.         pop    bp
  430.  
  431.         Show_Mouse
  432.         retf
  433. _load_window ENDP
  434.  
  435.  
  436. ;----------------------------------------------------------------
  437.  
  438.  
  439. _clear_window    PROC
  440.  
  441.     H    EQU    [bp+0Eh]
  442.     W    EQU    [bp+0Ch]
  443.     Y    EQU    [bp+0Ah]
  444.     X    EQU    [bp+08h]
  445.     Attribute    EQU    [bp+06h]
  446.  
  447.         Hide_Mouse
  448.  
  449.         push    bp
  450.         mov    bp, sp
  451.         push    ds
  452.         push    di
  453.         push    si
  454.         sub    ax, ax
  455.         mov    bx, ax
  456.         mov    cx, bx
  457.         mov    dx, cx
  458.     
  459.         mov    dl, _ScreenWidth
  460.         mov    al, Y
  461.         mov    bl, X     
  462.         dec    al
  463.         dec    bl     
  464.         mul    dl
  465.         add    ax, bx
  466.         shl    ax, 1
  467.         les    di, _ScreenArea
  468.         add    di, ax
  469.  
  470.         mov    bl, W
  471.         mov    bh, H
  472.         sub    dl, bl
  473.         shl    dx, 1
  474.         
  475.         mov    ah, Attribute
  476.         mov    al, ' '
  477.  
  478.     @@next_row:
  479.         mov    cl, bl
  480.         rep
  481.         stosw
  482.         add    di, dx
  483.         dec    bh
  484.         jne    @@next_row
  485.                 
  486.         pop    si
  487.         pop    di
  488.         pop    ds
  489.         pop    bp
  490.  
  491.         Show_Mouse
  492.         retf
  493. _clear_window    ENDP
  494.  
  495.  
  496.  
  497. _scroll_window    PROC
  498.  
  499.        Len    EQU    [bp+10h]
  500.     H    EQU    [bp+0Eh]
  501.     W    EQU    [bp+0Ch]
  502.     Y    EQU    [bp+0Ah]
  503.     X    EQU    [bp+08h]
  504.     Attribute    EQU    [bp+06h]
  505.  
  506.         Hide_Mouse
  507.  
  508.         push    bp
  509.         mov    bp, sp
  510.         push    ds
  511.         push    di
  512.         push    si
  513.         sub    ax, ax
  514.         mov    bx, ax
  515.         mov    cx, bx
  516.         mov    dx, cx
  517.     
  518.         mov    dl, _ScreenWidth
  519.         les    di, _ScreenArea
  520.         lds    si, _ScreenArea
  521.         mov    cl, dl
  522.         sub    dl, W
  523.         shl    dx, 1
  524.     
  525.         mov    al, Len
  526.         imul    cl
  527.         shl    ax, 1
  528.         add    si, ax
  529.         or    ax, ax
  530.     
  531.         mov    al, Y
  532.         mov    ah, X
  533.         mov    bl, H
  534.         mov    bh, W
  535.         jns    @@n12
  536.  
  537.         std
  538.         neg    Byte Ptr Len
  539.         neg    dx
  540.         add    ax, bx
  541.         sub    ax, 0101h
  542.     @@n12:
  543.         sub    ax, 0101h
  544.         xchg    ah, cl
  545.         mul    ah
  546.         add    ax, cx
  547.         shl    ax, 1
  548.         add    si, ax
  549.         add    di, ax
  550.         sub    bl, Len
  551.     
  552.     @@next_row:
  553.         mov    cl, bh
  554.         rep
  555.           movsw
  556.         add    di, dx
  557.         add    si, dx
  558.         dec    bl
  559.         jne    @@next_row
  560.  
  561.         mov    bl, Len
  562.         mov    ah, Attribute
  563.         mov    al, ' '
  564.  
  565.     @@clr_row:
  566.         mov    cl, bh
  567.         rep
  568.           stosw
  569.         add    di, dx
  570.         dec    bl
  571.         jne        @@clr_row
  572.  
  573.         cld
  574.  
  575.         pop    si
  576.         pop    di
  577.         pop    ds
  578.         pop    bp
  579.  
  580.         Show_Mouse
  581.         retf
  582. _scroll_window    ENDP
  583.  
  584.  
  585.  
  586. _border_window    PROC
  587.  
  588.       Border    EQU    [bp+10h]
  589.      H    EQU    [bp+0Eh]
  590.      W    EQU    [bp+0Ch]
  591.      Y    EQU    [bp+0Ah]
  592.      X    EQU    [bp+08h]
  593.      Attribute    EQU    [bp+06h]
  594.  
  595.         Hide_Mouse
  596.  
  597.         push    bp
  598.         mov    bp, sp
  599.         push    ds
  600.         push    di
  601.         push    si
  602.         sub    ax, ax
  603.         mov    bx, ax
  604.         mov    cx, bx
  605.         mov    dx, cx
  606.     
  607.         mov    dl, _ScreenWidth
  608.         mov    al, Y
  609.         mov    bl, X     
  610.         dec    al
  611.         dec    bl     
  612.         mul    dl
  613.         add    ax, bx
  614.         shl    ax, 1
  615.         les    di, _ScreenArea
  616.         lds    si, Border
  617.         add    di, ax
  618.  
  619.         mov    bl, W
  620.         mov    bh, H
  621.         sub    dl, bl
  622.         shl    dx, 1
  623.         sub    bx, 0202h
  624.         
  625.         mov    ah, Attribute
  626.  
  627.         lodsb            ; Upper row
  628.         stosw
  629.         mov    cl, bl
  630.         lodsb
  631.         rep
  632.           stosw
  633.         lodsb
  634.         stosw
  635.         add    di, dx
  636.         cmp    bh, 00
  637.         je    @@NoMiddleRows
  638.     
  639.     @@next_row:
  640.         lodsb            ; All rows in the middle
  641.         stosw
  642.         mov    cl, bl
  643.         lodsb
  644.         cmp    al, 00
  645.         je    @@NoFill
  646.         rep
  647.           stosw
  648.         jmp    @@FillDone
  649.     @@NoFill:
  650.         add    di, cx
  651.         add    di, cx
  652.     @@FillDone:
  653.         lodsb
  654.         stosw
  655.         add    di, dx
  656.         sub    si, 03
  657.         dec    bh
  658.         jne    @@next_row
  659.  
  660.  @@NoMiddleRows:
  661.         add    si, 03        ; Bottom row
  662.         lodsb
  663.         stosw
  664.         mov    cl, bl
  665.         lodsb
  666.         rep
  667.           stosw
  668.         lodsb
  669.         stosw
  670.  
  671.         pop    si
  672.         pop    di
  673.         pop    ds
  674.         pop    bp
  675.  
  676.         Show_Mouse
  677.         retf
  678. _border_window    ENDP
  679.  
  680.  
  681. ;----------------------------------------------------------------
  682.  
  683.  
  684. _get_event    PROC
  685.  
  686.   flags        EQU    Word Ptr [bp+0Ah]
  687.   event        EQU    [bp+06h]
  688.  
  689.  ev_type    EQU    Word Ptr es:[si]
  690.  
  691.  key        EQU    Word Ptr es:[si+2]
  692.  scan        EQU    Word Ptr es:[si+4]
  693.  shift        EQU    Word Ptr es:[si+6]
  694.  shiftX        EQU    Word Ptr es:[si+8]
  695.  
  696.  x        EQU    Word Ptr es:[si+10]
  697.  y        EQU    Word Ptr es:[si+12]
  698.  left        EQU    Word Ptr es:[si+14]
  699.  right        EQU    Word Ptr es:[si+16]
  700.  middle        EQU    Word Ptr es:[si+18]
  701.  
  702.  timer1        EQU    Word Ptr es:[si+20]
  703.  timer2        EQU    Word Ptr es:[si+22]
  704.  
  705.  EV_KEY        EQU     1
  706.  EV_SHIFT    EQU     2
  707.  EV_MOUSE    EQU     4
  708.  EV_TIMER    EQU     8
  709.  EV_NONBLOCK    EQU    16
  710.  
  711.         push    bp
  712.         mov    bp, sp
  713.         push    ds
  714.         push    es
  715.         push    si
  716.         push    di
  717.         les    si, event
  718.         sub    ax, ax
  719.         mov    ev_type, ax
  720.         mov    key, ax
  721.         mov    scan, ax
  722.  
  723.         test    flags, EV_TIMER
  724.         jz    @@main_loop
  725.         mov    ah, 0h
  726.         int    1Ah
  727.         mov    OriginalTimer1, dx
  728.         mov    OriginalTimer2, cx
  729.  
  730.     @@main_loop:
  731.         test    flags, EV_KEY
  732.         jz    @@test_shifts
  733.  
  734.         mov    ah, 11h            ; Check for a key
  735.         int    16h
  736.         jz    @@test_shifts
  737.  
  738.         or    ev_type, EV_KEY        ; Key was pressed
  739.         mov    ah, 10h
  740.         int    16h
  741.         mov    scan, ax
  742.         cmp    al, 0E0h        ; Is it an extended key
  743.         jne    @@normal_key
  744.         cmp    ah, 0
  745.         je    @@normal_key
  746.         mov    al, 0
  747.     @@normal_key:
  748.         mov    ah, 0
  749.         mov    key, ax
  750.         jmp    @@break_out
  751.  
  752.     @@test_shifts:
  753.         test    flags, EV_SHIFT
  754.         jz    @@test_mouse
  755.  
  756.         mov    ah, 12h            ; Check if shifts changed
  757.         int    16h
  758.         cmp    ax, _LastKeyShifts
  759.         jz    @@test_mouse
  760.  
  761.         or    ev_type, EV_SHIFT
  762.         mov    bx, _LastKeyShifts
  763.         xor    bx, ax
  764.         mov    shift, ax
  765.         mov    shiftX, bx
  766.         mov    _LastKeyShifts, ax
  767.         jmp    @@break_out2
  768.  
  769.     @@test_mouse:
  770.         test    flags, EV_MOUSE
  771.         jz    @@test_time
  772.         cmp    _MouseInstalled, 1
  773.         jne    @@test_time
  774.  
  775.         mov    ax, 0003h        ; Check mouse status
  776.         int    33h
  777.         cmp    bx, _LastMouseBtns
  778.         jne    @@mouse
  779.         cmp    cx, _LastMousePosX
  780.         jne    @@mouse
  781.         cmp    dx, _LastMousePosY
  782.         je    @@test_time
  783.     @@mouse:
  784.         or    ev_type, EV_MOUSE
  785.  
  786.         mov    _LastMouseBtns, bx
  787.         mov    _LastMousePosX, cx
  788.         mov    _LastMousePosY, dx
  789.         jmp    @@break_out
  790.     @@test_time:
  791.         test    flags, EV_TIMER
  792.         jz    @@loop_tail
  793.  
  794.         mov    ah, 0h            ; Check timer
  795.         int    1Ah
  796.         sub    dx, OriginalTimer1
  797.         sbb    cx, OriginalTimer2
  798.         cmp    cx, timer2
  799.         jb    @@loop_tail
  800.         cmp    dx, timer1
  801.         jb    @@loop_tail
  802.         or    ev_type, EV_TIMER
  803.         jmp    @@break_out
  804.     @@loop_tail:
  805.         test    flags, EV_NONBLOCK
  806.         jnz    @@break_out
  807.         jmp    @@main_loop
  808.  
  809.     @@break_out:
  810.         mov    ah, 12h        ; Updayte shift status
  811.         int    16h
  812.         mov    shift, ax
  813.         mov    bx, _LastKeyShifts
  814.         xor    bx, ax
  815.         mov    shiftX, bx
  816.  
  817.     @@break_out2:
  818.             cmp    _MouseInstalled, 1
  819.             jne    @@end
  820.  
  821.         mov    ax, 0003h    ; Update mouse status
  822.         int    33h
  823.  
  824.         shr    cx, 1
  825.         shr    cx, 1
  826.         shr    cx, 1
  827.         inc    cx
  828.         mov    x, cx
  829.         shr    dx, 1
  830.         shr    dx, 1
  831.         shr    dx, 1
  832.         inc    dx
  833.         mov    y, dx
  834.  
  835.         test    bx, 0001h
  836.         jne    @@left
  837.         mov    word ptr left, 0h
  838.         jmp    @@leftE
  839.     @@left:
  840.         mov    word ptr left, 1h
  841.     @@leftE:
  842.         test    bx, 0002h
  843.         jne    @@right
  844.         mov    word ptr right, 0h
  845.         jmp    @@rightE
  846.     @@right:
  847.         mov    word ptr right, 1h
  848.     @@rightE:
  849.         test    bx, 0004h
  850.         jne    @@middle
  851.         mov    word ptr middle, 0h
  852.         jmp    @@middleE
  853.     @@middle:
  854.         mov    word ptr middle, 1h
  855.     @@middleE:
  856.  
  857.     @@end:
  858.         pop    di
  859.         pop    si
  860.         pop    es
  861.         pop    ds
  862.         pop    bp
  863.         retf
  864. _get_event    ENDP
  865.  
  866. END
  867.