home *** CD-ROM | disk | FTP | other *** search
/ High Voltage Shareware / high1.zip / high1 / DIR2 / 4DEMS.ZIP / RESEMS.ASM < prev    next >
Assembly Source File  |  1993-11-13  |  7KB  |  225 lines

  1. COMMENT ~
  2. /*-------------------------------------------------------------------------+
  3. | Module: RESEMS.ASM                                                       |
  4. | Project: TOOLS                                                           |
  5. | Author: Paul A. Penrose                                                  |
  6. |         (c) 1992, 4D Interactive Systems, Inc.  All rights reserved.     |
  7. | Start Date: 25 Nov 92                                                    |
  8. | Last Revised: 25 Nov 92                                                  |
  9. | Purpose:                                                                 |
  10. |   This is a TSR that will hook into the EMS driver interrupt and limit   |
  11. |   the amount of free pages available.                                    |
  12. +-------------------------------------------------------------------------*/ ~
  13.  
  14. IDEAL
  15.  
  16. MODEL SMALL
  17.  
  18. CODESEG
  19.  
  20. old_header      DB 64 DUP(?)
  21. old_offset      DW ?
  22. old_segment     DW ?
  23. ems_function    DB ?
  24. signature1      DW ?
  25. signature2      DW ?
  26. reserved_pages  DW ?
  27.  
  28. PROC    new_isr
  29. ;
  30. ; Pass on request after saving the function type
  31. ;
  32.         cmp  ah,80H
  33.         jnz  new_isr_010
  34.         or   al,al                      ;is it an installation check?
  35.         jnz  new_isr_001
  36.         mov  ah,al
  37.         jmp  new_isr_ret
  38. new_isr_001:
  39.         cmp  al,01                      ;Is it a request to change the
  40.         jne  new_isr_002                ;  number of reserved pages?
  41.         mov  [cs:reserved_pages],bx
  42.         xor  ah,ah
  43.         jmp  new_isr_ret
  44. new_isr_002:
  45.         mov  ah,8Fh                     ;return subfunction unknown error
  46.         jmp  new_isr_ret
  47. new_isr_010:
  48.         mov  [cs:ems_function],ah
  49.         mov  [cs:signature1],bx         ;save possible signature bytes
  50.         mov  [cs:signature2],dx
  51.         pushf
  52.         call [dword ptr cs:old_offset]  ;call the old ISR
  53.         cmp  [cs:ems_function],42h      ;was it a check for unallocated pages?
  54.         jnz  new_isr_ret
  55.         cmp  [cs:signature1],4444h      ;if both signatures are "DD" then
  56.         jne  new_isr_res                ;  we report the true size
  57.         cmp  [cs:signature2],4444h
  58.         je   new_isr_ret   
  59. new_isr_res:
  60.         sub  bx,[cs:reserved_pages]     ;Reduce by # of reserved pages
  61.         jnc  new_isr_ret
  62.         xor  bx,bx
  63. new_isr_ret:
  64.         iret
  65. ENDP
  66.  
  67. PROC    main
  68.         push cs                 ;Operate out of CS entirely
  69.         pop  ds
  70.         mov  dx,offset title_msg
  71.         mov  cx,66
  72.         mov  ah,40h
  73.         mov  bx,1               ;stdout
  74.         int  21h                ;write error message to stdout
  75. ;
  76. ; First check to see if there is an EMS driver loaded and ready
  77. ;
  78.         mov  ax,3D00H           ;Open file, read only
  79.         mov  dx,offset ASCII_device_name
  80.         int  21H
  81.         jnc  j001
  82.         jmp  no_driver          ;If not found, report no driver
  83. j001:   mov  bx,ax
  84.         push bx
  85.         mov  ax,4400H           ;Get device info
  86.         int  21H
  87.         pop  bx
  88.         jnc  j002
  89.         jmp  no_driver2
  90. j002:   test dx,0080H           ;Is it a device?
  91.         jnz  j003
  92.         jmp  no_driver2
  93. j003:   push bx
  94.         mov  ax,4407H           ;Is the device ready?
  95.         int  21H
  96.         pop  bx
  97.         or   al,al
  98.         jnz  j004
  99.         jmp  no_driver2
  100. j004:   mov  ax,3E00H           ;Close the driver
  101.         int  21H
  102. ;
  103. ; Check for a number of pages parameter on the command line
  104. ;
  105.         mov  si,80H             ;Point to command tail
  106.         mov  cl,[es:si]         ;check the length
  107.         or   cl,cl
  108.         jnz  convert
  109.         mov  dx,offset no_parm_msg
  110.         mov  cx,31
  111.         jmp  error
  112. ;
  113. ; Convert number from ASCII to binary form
  114. ;
  115. convert:
  116.         cmp  cl,5
  117.         jb   convert_cont
  118. convert_err:
  119.         mov  dx,offset bad_number_msg
  120.         mov  cx,36
  121.         jmp  error
  122. convert_cont:
  123.         mov  ax,0               ;Start accumulator with 0
  124.         xor  ch,ch
  125.         dec  cx                 ;skip first blank
  126.         inc  si
  127. convert_next:
  128.         mov  dx,10              ;Shift partial result by decimal digit
  129.         mul  dx
  130.         mov  bx,ax
  131.         inc  si                 ;Get next char
  132.         mov  al,[es:si]
  133.         sub  al,'0'             ;Convert to binary
  134.         jc   convert_err
  135.         cmp  al,9
  136.         ja   convert_err
  137.         xor  ah,0
  138.         add  ax,bx              ;Add to partial result
  139.         loop convert_next
  140.         mov  [reserved_pages],ax
  141. ;
  142. ; Check to see if we're already installed
  143. ;
  144.         mov  ax,8000h
  145.         int  67h
  146.         or   ah,ah
  147.         jnz  j010
  148.         mov  ax,8001h
  149.         mov  bx,[reserved_pages]     ;change number of pages
  150.         int  67h
  151.         mov  dx,offset changed_msg
  152.         mov  cx,35
  153.         mov  ah,40h
  154.         mov  bx,1               ;stdout
  155.         int  21h                ;write error message to stdout
  156.         mov  ax,4C00H           ;Return to DOS
  157.         int  21H
  158. ;
  159. ; Write out installation message
  160. ;
  161. j010:   mov  dx,offset loaded_msg
  162.         mov  cx,29
  163.         mov  ah,40h
  164.         mov  bx,1               ;stdout
  165.         int  21h                ;write error message to stdout
  166. ;
  167. ; Now hook into the 67H interrupt
  168. ;
  169.         push es
  170.         mov  ax,3567h           ;First get the old ISR address
  171.         int  21h
  172.         mov  ax,es
  173.         mov  [old_segment],ax
  174.         mov  [old_offset],bx
  175.         push ds                 ;Copy the header from the old driver
  176.         pop  es
  177.         mov  ds,ax
  178.         mov  si,0
  179.         mov  di,0
  180.         mov  cx,32
  181.         rep  movsw
  182.         push es                 ;restore DS
  183.         pop  ds
  184.         mov  dx,offset new_isr  ;Now put the address of our new isr into
  185.         mov  ax,2567h           ;  the 67h vector
  186.         int  21h
  187.         pop  ax                 ;get old PSP seg
  188.         mov  dx,cs
  189.         sub  dx,ax              ;dx=number of paragraphs from start of psp to
  190.         mov  ax,offset main     ;  start of code segment
  191.         mov  cl,4
  192.         shr  ax,cl
  193.         add  dx,ax              ;add length of isr code (in paragraphs)
  194.         inc  dx                 ;round up
  195.         mov  ax,3100h
  196.         int  21h                ;Terminate and Stay Resident
  197.         
  198. no_driver2:
  199.         mov  ax,3E00H           ;Close the driver
  200.         int  21H
  201. no_driver:
  202.         mov  dx,offset no_driver_msg
  203.         mov  cx,22
  204. error:
  205.         mov  ah,40h
  206.         mov  bx,1               ;stdout
  207.         int  21h                ;write error message to stdout
  208.         mov  ax,4C01H           ;Return to DOS with error 01
  209.         int  21H
  210. ENDP
  211.  
  212. ASCII_device_name       DB  'EMMXXXX0', 0
  213. no_driver_msg           DB  'No EMS driver found.',0dh,0ah
  214. no_parm_msg             DB  'Usage is:',0dh,0ah,'  RESEMS num_pages',0dh,0ah
  215. loaded_msg              DB  'Resident portion installed.',0dh,0ah
  216. changed_msg             DB  'Number of reserved pages changed.',0dh,0ah
  217. bad_number_msg          DB  'Illegal number of pages specified.',0dh,0ah
  218. title_msg               DB  'RESEMS Ver 1.1',0dh,0ah
  219. copyright_msg           DB  '(c) Copyright 1992, 4D Interactive Systems, Inc.',0dh,0ah
  220.  
  221. ;SMALLSTACK
  222. STACK 256
  223.  
  224. END main        
  225.