home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / magazine / qbnewsl / qbnws105 / filespec / filespec.bas
BASIC Source File  |  1990-12-01  |  2KB  |  80 lines

  1. ' FILESPEC.BAS by Ronny Ong, April 5, 1988 - 100% Public Domain
  2. ' Example of how to create FILESPEC.EXE:
  3. '   BC FILESPEC/O;
  4. '   LINK /E/NOE FILESPEC,,,QB.LIB;
  5.  
  6. '$INCLUDE: 'QB.BI'
  7.  
  8. DIM InRegs AS RegType, OutRegs AS RegType
  9. DIM EnvBlkSeg AS INTEGER, EnvBlkPtr AS INTEGER, Char AS INTEGER
  10. DIM Filespec AS STRING
  11.  
  12. ' The Program Segment Prefix is a 256-byte block which DOS
  13. ' creates below all normal transient programs loaded.  The PSP
  14. ' contains many important pieces of information about the
  15. ' transient program, including the location of its "environment
  16. ' block" in memory.
  17.  
  18. LET InRegs.AX = &H6200 ' Int 21H, Function 62H is Get PSP.
  19. CALL INTERRUPT(&H21, InRegs, OutRegs)
  20. DEF SEG = OutRegs.BX ' Select the segment containing the PSP.
  21.  
  22. ' Get the segment of the environment block, stored at offset 2CH
  23. ' in the PSP.
  24.  
  25. LET EnvBlkSeg = CVI(CHR$(PEEK(&H2C)) + CHR$(PEEK(&H2D)))
  26.  
  27. ' Now select the segment of the environment block itself.
  28. ' Environment blocks are always paragraph-aligned.  That is, they
  29. ' begin only on even 16-byte address boundaries.  Offset 0,
  30. ' therefore, is always the start of the block as long as the
  31. ' segment is set properly.
  32.  
  33. DEF SEG = EnvBlkSeg
  34.  
  35. ' Initialize a pointer to search forward sequentially through
  36. ' memory, looking for the double zero bytes which mark the end of
  37. ' the environment strings.
  38.  
  39. LET EnvBlkPtr = 0
  40.  
  41. DO
  42.   IF PEEK(EnvBlkPtr) = 0 THEN
  43.     IF PEEK(EnvBlkPtr + 1) = 0 THEN
  44.       EXIT DO
  45.     END IF
  46.   END IF
  47.   IF EnvBlkPtr = &H7FFF THEN ' Environment blocks are max of 32K.
  48.     PRINT "End of environment block not found!"
  49.     STOP
  50.   ELSE
  51.     LET EnvBlkPtr = EnvBlkPtr + 1
  52.   END IF
  53. LOOP
  54.  
  55. ' Skip over the double zeroes and the 2-byte word count which
  56. ' precedes the filespec.
  57.  
  58. LET EnvBlkPtr = EnvBlkPtr + 4
  59.  
  60. LET Filespec = "" ' Initialize filespec.
  61.  
  62. ' Assemble Filespec, ensuring that it does not get too long.
  63.  
  64. DO
  65.   LET Char = PEEK(EnvBlkPtr)
  66.   IF Char THEN
  67.     LET Filespec = Filespec + CHR$(Char)
  68.     LET EnvBlkPtr = EnvBlkPtr + 1
  69.   END IF
  70. LOOP WHILE Char > 0 AND LEN(Filespec) < 80
  71.  
  72. ' At this point, Filespec could be used in an OPEN statement to
  73. ' read/write the EXE file, but for this demonstration, it is
  74. ' simply displayed.
  75.  
  76. PRINT "This program was loaded as "; Filespec
  77.  
  78. DEF SEG ' Restore BASIC's default data segment.
  79. END
  80.