home *** CD-ROM | disk | FTP | other *** search
/ Current Shareware 1994 January / SHAR194.ISO / dos_util / v12n19.zip / DRVASM.ZIP / DRVINIT.ASM < prev    next >
Assembly Source File  |  1993-10-11  |  11KB  |  238 lines

  1. ;---------------------------------------------------------------    
  2. ;drvinit.asm - Supporting init routines for DRVLOAD Utility    |
  3. ;--------------------------------------------------------------|
  4. ;DRVLOAD Copyright (c) 1993                                    |
  5. ;                                                              |
  6. ;Rick Knoblaugh All rights reserved.                           |
  7. ;First Appeared in PC MAGAZINE, US Edition,                    |
  8. ;November 9, 1993                                              |
  9. ;--------------------------------------------------------------|
  10. ; 7/04/93                      Rick Knoblaugh                  |
  11. ;--------------------------------------------------------------|
  12. ;include files                                                 |
  13. ;---------------------------------------------------------------    
  14.                 include drvequ.inc
  15.                 include drvstruc.inc
  16.  
  17. code            segment public  'CODE'
  18.                 assume cs:code, ds:code, es:code
  19. ;--------------------------------------------------------------
  20. ;Externals                                                    |
  21. ;--------------------------------------------------------------
  22.  
  23.                 extrn   driver_file:byte, dos_ver:word
  24.                 extrn   driver_p_off:word, drv_stack_ptr:word
  25. ;--------------------------------------------------------------
  26. ;Publics                                                      |
  27. ;--------------------------------------------------------------
  28.                 public  get_driver, get_parms 
  29.                 public  check_driver, relocate
  30.                 public  look_win
  31.  
  32.  
  33. ;--------------------------------------------------------------
  34. ;check_driver - Use DOS find first file function to           |
  35. ;               determine if file exists and also get size.   |
  36. ;                                                             |
  37. ;             Enter:                                          |
  38. ;             driver_file=driver name from command line.      |
  39. ;                      ds=local data segment                  |
  40. ;             Exit:                                           |
  41. ;                   dx:ax=size of driver file                 |
  42. ;                      CY=set if error accessing driver       |
  43. ;                                                             |
  44. ;--------------------------------------------------------------
  45. check_driver    proc    near
  46.                 xor     cx, cx                  ;normal attributes
  47.                 mov     dx, offset driver_file  ;file spec
  48.                 mov     ah, DOS_FIND_FIRST 
  49.                 int     21h
  50.                 jnc     check_dr100             ;if found
  51.                 mov     cx, 1                   ;else try read only        
  52.                 mov     ah, DOS_FIND_FIRST 
  53.                 int     21h
  54.                 jc      check_dr999
  55. check_dr100:
  56.                 mov     bx, psp_cmd_len         ;default DTA area
  57.                 mov     dx, [bx].file_size.d_segment ;get high order portion
  58.                 mov     ax, [bx].file_size.d_offset
  59. check_dr999:
  60.                 ret
  61. check_driver    endp
  62.  
  63. ;--------------------------------------------------------------
  64. ;get_driver   - Attempt to retrieve device driver name from   |
  65. ;               command line.                                 |
  66. ;                                                             |
  67. ;             Enter:                                          |
  68. ;                      cx=number of bytes to search           |
  69. ;                   ds:si=ptr to string to search             |
  70. ;                      es=local data segment                  |
  71. ;             Exit:                                           |
  72. ;                      cx=bytes remaining in cmd line         |
  73. ;                      si=position just after parm            |
  74. ;             driver_file=driver name from command line.      |
  75. ;                      CY=set if no driver found              |
  76. ;            driver_p_off=first byte past driver name         |
  77. ;                                                             |
  78. ;--------------------------------------------------------------
  79. get_driver      proc    near
  80.                 call    skip_white_sp
  81.                 jcxz    get_drv_900
  82.                 mov     di, offset driver_file
  83. get_drv_100:
  84.                 cmp     byte ptr [si], ' '      ;hit the end?
  85.                 jbe     get_drv_800
  86.                 movsb                           ;move it into our area
  87.                 loop    get_drv_100
  88. get_drv_800:
  89.                 xor     al, al
  90.                 stosb                           ;terminate the string
  91.                 mov     cs:driver_p_off, di     ;save end of file name
  92.                 mov     al, LF                  ;default to no parms
  93.                 stosb
  94.                 ret                             ;ret with carry clear
  95. get_drv_900:
  96.                 stc                             ;indicate not found
  97.                 ret
  98. get_driver      endp
  99.  
  100. ;--------------------------------------------------------------
  101. ;get_parms    - Attempt to retrieve device driver parms       |
  102. ;               command line.                                 |
  103. ;                                                             |
  104. ;             Enter:                                          |
  105. ;                      cx=number of bytes remaining in cmd    |
  106. ;                         line                                |
  107. ;                   ds:si=ptr to string                       |
  108. ;                      es=local data segment                  |
  109. ;            driver_p_off=offset of parm hold buffer          |
  110. ;                                                             |
  111. ;             Exit:                                           |
  112. ;                                                             |
  113. ;            drv_cmd_line=driver parms from command line.     |
  114. ;                                                             |
  115. ;--------------------------------------------------------------
  116. get_parms       proc    near
  117.                 jcxz    get_parm_800
  118.                 call    skip_white_sp
  119.                 jcxz    get_parm_800
  120.                 inc     cx                      ;include the CR
  121.                 mov     di, cs:driver_p_off
  122.                 rep movsb
  123. get_parm_800:
  124.  
  125.                 ret
  126. get_parms       endp
  127.  
  128. ;--------------------------------------------------------------
  129. ;look_win  - Determine if we're running in DOS box under      |
  130. ;            Windows.                                         |
  131. ;                                                             |
  132. ;             Enter:                                          |
  133. ;                                                             |
  134. ;             Exit:                                           |
  135. ;                                                             |
  136. ;             CY set if Windows present.                      |
  137. ;                                                             |
  138. ;--------------------------------------------------------------
  139. look_win        proc    near
  140.                 mov     ax, 160ah               ;Windows 3.1 check
  141.                 int     2fh
  142.                 or      ax, ax
  143.                 jz      look_w999               ;found
  144. ;
  145. ;Not running under Windows 3.1.  Look for Windows 3.0
  146. ;
  147.  
  148.                 mov     ax, 1600h
  149.                 int     2fh
  150.                 test    al, 7fh
  151.                 jnz     look_w999               ;Windows 3.0 enhanced
  152.  
  153.                 mov     ax, 4680h
  154.                 int     2fh
  155.                 or      ax, ax
  156.                 jz      look_w999               ;Windows 3.0         
  157.                 
  158.  
  159.                 clc
  160.                 ret
  161. look_w999:
  162.                 stc   
  163.                 ret
  164. look_win        endp
  165.  
  166. ;--------------------------------------------------------------
  167. ;get_cmd_line - look for command line parameters              |
  168. ;                                                             |
  169. ;             Enter:                                          |
  170. ;                      cx=number of bytes to search           |
  171. ;                   ds:si=ptr to string to search             |
  172. ;                                                             |
  173. ;             Exit:                                           |
  174. ;                      cx=bytes remaining after switch        |
  175. ;                      si=position just after parm            |
  176. ;--------------------------------------------------------------
  177. get_cmd_line    proc    near
  178.                 jcxz    get_cmd_800
  179.                 call    skip_white_sp
  180. get_cmd_800:     
  181.                 ret
  182. get_cmd_line    endp
  183.  
  184. skip_white_sp   proc    near
  185.                 cmp     byte ptr [si], ' '
  186.                 je      skip_w200
  187.                 cmp     byte ptr [si], TAB
  188.                 jne     skip_w900
  189.  
  190. skip_w200:
  191.                 inc     si
  192.                 loop    skip_white_sp
  193. skip_w900:
  194.                 ret
  195. skip_white_sp   endp
  196.  
  197. ;--------------------------------------------------------------
  198. ;relocate - Move driver loader up to top of memory.  Change   |
  199. ;           segment registers and continue execution at       |
  200. ;           line after caller, but everything will now be     |
  201. ;           running at the new high memory location.          |
  202. ;                                                             |
  203. ;             Enter:                                          |
  204. ;                      ds=psp segment                         |
  205. ;                      bp=target segment                      |
  206. ;                      di=size in paragraphs                  |
  207. ;             Exit:                                           |
  208. ;          cs, ds, es, ss= new segment                        |
  209. ;                      sp= new stack ptr                      |
  210. ;--------------------------------------------------------------
  211. relocate        proc    near
  212.                 pop     ax                      ;return address
  213.                 mov     es, bp
  214.                 mov     cl, 3
  215.                 shl     di, cl
  216.                 mov     cx, di                  ;size in words
  217.                 xor     si, si
  218.                 xor     di, di
  219.                 rep     movsw
  220.                 cli
  221.                 mov     ss, bp                  ;change stack seg
  222.                 mov     sp, offset drv_stack_ptr
  223.                 sti
  224.                 push    bp                      ;segment
  225.                 push    ax                      ;offset
  226.                 mov     ds, bp
  227.                 mov     es, bp
  228.                 retf
  229.  
  230. relocate        endp
  231.  
  232.  
  233.  
  234. code            ends
  235.                 end
  236.  
  237.  
  238.