home *** CD-ROM | disk | FTP | other *** search
/ The C Users' Group Library 1994 August / wc-cdrom-cusersgrouplibrary-1994-08.iso / listings / v_03_01 / 3n01059a < prev    next >
Text File  |  1991-10-15  |  3KB  |  120 lines

  1. ;
  2. ; redira.asm:
  3. ;
  4. ; Assembly language version of redir() function,
  5. ; to detect I/O redirection.
  6. ; To assemble with TASM:
  7. ;   tasm /mx redira
  8. ;
  9.  
  10.     NAME    redir
  11.  
  12. NEARCODE    EQU 01H ; near function
  13. SMALLDATA   EQU 01H ; tiny, small, or medium memory model
  14. MOLASSES    EQU 1   ; define for Microsoft C or Turbo C, else comment out
  15. ;USEPSP     EQU 1   ; use global _psp, comment out to use int 21h command 62h
  16.  
  17. IFDEF   TINY
  18.     IFNDEF  NEARCODE
  19.         NEARCODE    EQU 01H
  20.     ENDIF
  21.     IFNDEF  SMALLDATA
  22.         SMALLDATA   EQU 01H
  23.     ENDIF
  24. ENDIF
  25.  
  26. DGROUP  GROUP   _DATA
  27. _TEXT   SEGMENT PUBLIC BYTE 'CODE'
  28.         ASSUME  CS:_TEXT
  29.  
  30. IFDEF   MOLASSES        ; Microsoft C and Turbo C
  31. PUBLIC  _redir
  32.     IFDEF   NEARCODE    ; if near function
  33. _redir  PROC    NEAR    ; unsigned char _near redir (void);
  34.     ELSE                ; if far function
  35. _redir  PROC    FAR     ; unsigned char _far redir (void);
  36.     ENDIF
  37. ELSE                    ; WATCOM C
  38. PUBLIC  redir_
  39.     IFDEF   NEARCODE    ; if near function
  40. redir_  PROC    NEAR    ; unsigned char __near redir (void);
  41.     ELSE                ; if far function
  42. redir_  PROC    FAR     ; unsigned char __far redir (void);
  43.     ENDIF
  44. ENDIF
  45.  
  46.     PUSH    BX
  47.     PUSH    CX
  48.     PUSH    SI
  49.     PUSH    DI
  50.     PUSH    ES
  51.  
  52. IFNDEF  TINY            ; If not COM file
  53.     PUSH    DS
  54.     IFDEF USEPSP        
  55.         MOV AX, __PSP   ; Use global _psp variable
  56.         MOV DS,AX
  57.     ELSE
  58.         MOV AH,62H      ; Undocumented Get PSP Segment
  59.         INT 21H
  60.         MOV DS,BX       ; Put PSP Segment in DS
  61.     ENDIF
  62. ENDIF
  63.  
  64.     MOV SI,0034H        ; DS:SI points to pointer to File Handle Table
  65.  
  66.     LES DI, DWORD PTR DS:[SI]
  67.  
  68. ;   MOV DI,WORD PTR DS:[SI]         ; Load ES:DI
  69. ;   MOV ES,WORD PTR DS:[SI+02H]     ;  with address of File Handle Table
  70.  
  71. IFNDEF  SMALLDATA       ; If compact, large, or huge memory model
  72.     MOV AX,SEG DGROUP   ;  put segment of table of default values
  73.     MOV DS,AX           ;   into DS
  74. ELSE                    ; If tiny, small, or medium memory model
  75.     IFNDEF  TINY
  76.     POP DS              ; Pointed to DGROUP when PUSHed
  77.     ENDIF
  78. ENDIF
  79.  
  80.     MOV SI,OFFSET DGROUP:STDIN  ; pointer to default values in DS:SI
  81.     XOR AX,AX           ; Assume no redirection
  82.     MOV BX,01H          ; Set bit zero of handle_bit
  83.     MOV CX,0005H        ; There are five defaults
  84.  
  85. TOP:
  86.     CMPSB       ; Compare handles to defaults
  87.     JE  SHIFT   ; If equal, prepare for next compare
  88.     OR  AX,BX   ;  else set bit in return value
  89.  
  90. SHIFT:
  91.     SHL BX,1    ; Shift to set next bit of handle_bit
  92.     LOOP    TOP ; If not all standard devices checked, check next
  93.  
  94. IFNDEF  SMALLDATA   ; If compact, large, or huge memory model
  95.     POP DS
  96. ENDIF
  97.  
  98.     POP ES
  99.     POP DI
  100.     POP SI
  101.     POP CX
  102.     POP BX
  103.     RET
  104.  
  105. IFDEF MOLASSES      ;Microsoft C and Turbo C
  106. _redir  ENDP
  107. ELSE
  108. redir_  ENDP
  109. ENDIF
  110.  
  111. _TEXT   ENDS
  112. _DATA   SEGMENT BYTE PUBLIC 'DATA'
  113. STDIN   DB  01H ; CON:
  114. STDOUT  DB  01H ; CON:
  115. STDERR  DB  01H ; CON:
  116. AUXIO   DB  00H ; AUX:
  117. LSTOUT  DB  02H ; PRN:
  118. _DATA   ENDS
  119.     END
  120.