home *** CD-ROM | disk | FTP | other *** search
/ Virtual Reality Zone / VRZONE.ISO / mac / PC / PCGLOVE / GLOVE / OBJGLV.ZIP / SRC / DEMO4B / INT / VDRINTE.ASM < prev   
Assembly Source File  |  1992-11-08  |  5KB  |  220 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. ;public    _v_driver_pointer
  63.  
  64. _screen_data:
  65.     mov    ax,18
  66.     jmp    nonreentrant
  67. _vsync:
  68.     mov    ax,20
  69.     jmp    reentrant
  70. _setup_hdwe:
  71.     mov    ax,22
  72.     jmp    nonreentrant
  73. _reset_hdwe:
  74.     mov    ax,24
  75.     jmp    nonreentrant
  76. _clr_page:
  77.     mov    ax,26
  78.     jmp    nonreentrant
  79. _copy_page:
  80.     mov    ax,28
  81.     jmp    nonreentrant
  82. _clr_block:
  83.     mov    ax,30
  84.     jmp    nonreentrant
  85. _copy_block:
  86.     mov    ax,32
  87.     jmp    nonreentrant
  88. _fastpoly:
  89.     mov    ax,34
  90.     jmp    nonreentrant
  91. _m_fastpoly:
  92.     mov    ax,36
  93.     jmp    nonreentrant
  94. _set_gmode:
  95.     mov    ax,38
  96.     jmp    nonreentrant
  97. _exit_gmode:
  98.     mov    ax,40
  99.     jmp    nonreentrant
  100. _set_drawpage:
  101.     mov    ax,42
  102.     jmp    nonreentrant
  103. _set_vpage:
  104.     mov    ax,44
  105.     jmp    reentrant
  106. _vgaline:
  107.     mov    ax,46
  108.     jmp    nonreentrant
  109. _vgapoint:
  110.     mov    ax,48
  111.     jmp    nonreentrant
  112. _set_clip_rect:
  113.     mov    ax,50
  114.     jmp    nonreentrant
  115. _clipline:
  116.     mov    ax,52
  117.     jmp    nonreentrant
  118. _printxyr:
  119.     mov    ax,54
  120.     jmp    nonreentrant
  121. _draw_cursor:
  122.     mov    ax,56
  123.     jmp    nonreentrant
  124. _erase_cursor:
  125.     mov    ax,58
  126.     jmp    nonreentrant
  127. _load_DAC_colors:
  128.     mov    ax,60
  129.     jmp    nonreentrant
  130. _read_DAC_colors:
  131.     mov    ax,62
  132.     jmp    nonreentrant
  133. _VGA_select:
  134.     mov    ax,64
  135.     jmp    reentrant
  136. _vd_spare_1:
  137.     mov    ax,66
  138.     jmp    nonreentrant
  139. _vd_spare_2:
  140.     mov    ax,68
  141.     jmp    nonreentrant
  142. _vd_spare_3:
  143.     mov    ax,70
  144.     jmp    nonreentrant
  145. _vd_spare_4:
  146.     mov    ax,72
  147.     jmp    nonreentrant
  148. _vd_spare_5:
  149.     mov    ax,74
  150.     jmp    nonreentrant
  151. _vd_spare_6:
  152.     mov    ax,76
  153.     jmp    nonreentrant
  154. _vd_spare_7:
  155.     mov    ax,78
  156.     jmp    nonreentrant
  157. _vd_spare_8:
  158.     mov    ax,80
  159.     jmp    nonreentrant
  160.  
  161. extrn    _v_driver_pointer
  162. ;_v_driver_pointer    dw    0
  163. ;    dw    0
  164.  
  165. nonreentrant:
  166.     push    bp
  167.     push    ds
  168.     mov      bp,sp
  169.     mov      dx,ss                  ; save stack seg
  170.     mov      es,dx
  171.     lds   bx,DWORD PTR _v_driver_pointer  ; get routine address
  172.     push    ds                     ; new stack seg
  173.     pop      ss                     ; all int's disabled till next instr..
  174.     mov      sp,2000                ; stack internal to driver
  175.     push    dx                     ; push old stack seg (bp=old stack ptr)
  176.     push    DWORD PTR es:[bp+24]   ; up to 20 bytes of arguments
  177.     push    DWORD PTR es:[bp+20]   ; copy adds 1 uS, but needed
  178.     push    DWORD PTR es:[bp+16]   ; to keep ints from crashing
  179.     push    DWORD PTR es:[bp+12]
  180.     push    DWORD PTR es:[bp+8]
  181.     push    cs                            ; push default return
  182.     push    offset nrtnh
  183.     push    ds
  184.     add   bx,ax                           ; push as call address
  185.     push    ds:[bx]
  186.     retf                                ; "call"
  187.  
  188. nrtnh:
  189.     add    sp,20
  190.     pop    ss                              ; restore stack
  191.     mov    sp,bp
  192.     pop    ds
  193.     pop    bp
  194.     retf                                ; exit
  195.  
  196. reentrant:
  197.     push    bp
  198.     push    ds
  199.     mov    bp,sp
  200.     push    DWORD PTR ss:[bp+24]   ; up to 20 bytes of arguments
  201.     push    DWORD PTR ss:[bp+20]   ; copy adds 1 uS, but needed
  202.     push    DWORD PTR ss:[bp+16]   ; to keep ints from crashing
  203.     push    DWORD PTR ss:[bp+12]
  204.     push    DWORD PTR ss:[bp+8]
  205.     push    cs                              ; push default return
  206.     push    offset rtnh
  207.     lds    bx,DWORD PTR _v_driver_pointer  ; get routine address
  208.     push    ds
  209.     add    bx,ax                           ; push as call address
  210.     push    ds:[bx]
  211.     retf                                    ; "call"
  212.  
  213. rtnh:    mov    sp,bp
  214.     pop    ds
  215.     pop    bp
  216.     retf                                    ; exit
  217.  
  218.  
  219.     end
  220.