home *** CD-ROM | disk | FTP | other *** search
/ Virtual Reality Zone / VRZONE.ISO / mac / PC / PCGLOVE / GLOVE / OBJGLV.ZIP / SRC / DEMO4B / DRV256 / VDRINTE.ASM < prev    next >
Assembly Source File  |  1992-10-08  |  4KB  |  217 lines

  1.  
  2.     TITLE    DRIVER - Interface to BIN loadable drivers.
  3.     NAME    VGALINE
  4.  
  5.     COMMENT    $
  6.  
  7.         Written and (c) by Dave Stampe 20/8/92
  8.         Not for commercial use, so get permission
  9.         before marketing code using this stuff!
  10.         For private PD use only.
  11.  
  12.         This code supports both non-reentrant and
  13.         reentrant functions.  Only vsync(), set_vpage(),
  14.         and VGA_select() are reentrant (may be called from
  15.         an interrupt routine) and must be written in assembler
  16.         with .MODEL TINY FARSTACK or in C (tiny model, DS != SS) with
  17.         NO C LIBRARY CALLS.
  18.  
  19.         All other routines may be written in tiny C and use library calls.
  20.  
  21.         $
  22.  
  23.  
  24.  
  25.         .MODEL large
  26.         .CODE
  27.  
  28.         .386
  29.  
  30. public    _screen_data     ; the C callable stubs
  31. public    _vsync
  32. public    _setup_hdwe
  33. public    _reset_hdwe
  34. public    _clr_page
  35. public    _copy_page
  36. public    _copy_block
  37. public    _clr_block
  38. public    _fastpoly
  39. public    _m_fastpoly
  40. public    _set_gmode
  41. public    _set_drawpage
  42. public    _exit_gmode
  43. public    _set_vpage
  44. public    _clipline
  45. public    _set_clip_rect
  46. public    _printxyr
  47. public    _erase_cursor
  48. public    _draw_cursor
  49. public    _vgaline
  50. public    _vgapoint
  51. public    _load_DAC_colors
  52. public    _read_DAC_colors
  53. public    _VGA_select
  54. public    _vd_spare_1
  55. public    _vd_spare_2
  56. public    _vd_spare_3
  57. public    _vd_spare_4
  58. public    _vd_spare_5
  59. public    _vd_spare_6
  60. public    _vd_spare_7
  61. public    _vd_spare_8
  62.  
  63. _screen_data:
  64.     mov    ax,18
  65.     jmp    nonreentrant
  66. _vsync:
  67.     mov    ax,20
  68.     jmp    reentrant
  69. _setup_hdwe:
  70.     mov    ax,22
  71.     jmp    nonreentrant
  72. _reset_hdwe:
  73.     mov    ax,24
  74.     jmp    nonreentrant
  75. _clr_page:
  76.     mov    ax,26
  77.     jmp    nonreentrant
  78. _copy_page:
  79.     mov    ax,28
  80.     jmp    nonreentrant
  81. _clr_block:
  82.     mov    ax,30
  83.     jmp    nonreentrant
  84. _copy_block:
  85.     mov    ax,32
  86.     jmp    nonreentrant
  87. _fastpoly:
  88.     mov    ax,34
  89.     jmp    nonreentrant
  90. _m_fastpoly:
  91.     mov    ax,36
  92.     jmp    nonreentrant
  93. _set_gmode:
  94.     mov    ax,38
  95.     jmp    nonreentrant
  96. _exit_gmode:
  97.     mov    ax,40
  98.     jmp    nonreentrant
  99. _set_drawpage:
  100.     mov    ax,42
  101.     jmp    nonreentrant
  102. _set_vpage:
  103.     mov    ax,44
  104.     jmp    reentrant
  105. _vgaline:
  106.     mov    ax,46
  107.     jmp    nonreentrant
  108. _vgapoint:
  109.     mov    ax,48
  110.     jmp    nonreentrant
  111. _set_clip_rect:
  112.     mov    ax,50
  113.     jmp    nonreentrant
  114. _clipline:
  115.     mov    ax,52
  116.     jmp    nonreentrant
  117. _printxyr:
  118.     mov    ax,54
  119.     jmp    nonreentrant
  120. _draw_cursor:
  121.     mov    ax,56
  122.     jmp    nonreentrant
  123. _erase_cursor:
  124.     mov    ax,58
  125.     jmp    nonreentrant
  126. _load_DAC_colors:
  127.     mov    ax,60
  128.     jmp    nonreentrant
  129. _read_DAC_colors:
  130.     mov    ax,62
  131.     jmp    nonreentrant
  132. _VGA_select:
  133.     mov    ax,64
  134.     jmp    reentrant
  135. _vd_spare_1:
  136.     mov    ax,66
  137.     jmp    nonreentrant
  138. _vd_spare_2:
  139.     mov    ax,68
  140.     jmp    nonreentrant
  141. _vd_spare_3:
  142.     mov    ax,70
  143.     jmp    nonreentrant
  144. _vd_spare_4:
  145.     mov    ax,72
  146.     jmp    nonreentrant
  147. _vd_spare_5:
  148.     mov    ax,74
  149.     jmp    nonreentrant
  150. _vd_spare_6:
  151.     mov    ax,76
  152.     jmp    nonreentrant
  153. _vd_spare_7:
  154.     mov    ax,78
  155.     jmp    nonreentrant
  156. _vd_spare_8:
  157.     mov    ax,80
  158.     jmp    nonreentrant
  159.  
  160. extrn _v_driver_pointer
  161.  
  162. nonreentrant:
  163.     push    bp
  164.     push    ds
  165.     mov      bp,sp
  166.     mov      dx,ss                  ; save stack seg
  167.     mov      es,dx
  168.     lds   bx,DWORD PTR _v_driver_pointer  ; get routine address
  169.     push    ds                     ; new stack seg
  170.     pop      ss                     ; all int's disabled till next instr..
  171.     mov      sp,2000                ; stack internal to driver
  172.     push    dx                     ; push old stack seg (bp=old stack ptr)
  173.     push    DWORD PTR es:[bp+24]   ; up to 20 bytes of arguments
  174.     push    DWORD PTR es:[bp+20]   ; copy adds 1 uS, but needed
  175.     push    DWORD PTR es:[bp+16]   ; to keep ints from crashing
  176.     push    DWORD PTR es:[bp+12]
  177.     push    DWORD PTR es:[bp+8]
  178.     push    cs                            ; push default return
  179.     push    offset nrtnh
  180.     push    ds
  181.     add   bx,ax                           ; push as call address
  182.     push    ds:[bx]
  183.     retf                                ; "call"
  184.  
  185. nrtnh:
  186.     add    sp,20
  187.     pop    ss                              ; restore stack
  188.     mov    sp,bp
  189.     pop    ds
  190.     pop    bp
  191.     retf                                ; exit
  192.  
  193. reentrant:
  194.     push    bp
  195.     push    ds
  196.     mov    bp,sp
  197.     push    DWORD PTR ss:[bp+24]   ; up to 20 bytes of arguments
  198.     push    DWORD PTR ss:[bp+20]   ; copy adds 1 uS, but needed
  199.     push    DWORD PTR ss:[bp+16]   ; to keep ints from crashing
  200.     push    DWORD PTR ss:[bp+12]
  201.     push    DWORD PTR ss:[bp+8]
  202.     push    cs                              ; push default return
  203.     push    offset rtnh
  204.     lds    bx,DWORD PTR _v_driver_pointer  ; get routine address
  205.     push    ds
  206.     add    bx,ax                           ; push as call address
  207.     push    ds:[bx]
  208.     retf                                    ; "call"
  209.  
  210. rtnh:    mov    sp,bp
  211.     pop    ds
  212.     pop    bp
  213.     retf                                    ; exit
  214.  
  215.  
  216.     end
  217.