The QBasic / QB64 Discussion Forum      Other Subforums, Links and Downloads
 
Respond to this messageReturn to Index
Original Message
  • The I-Man's Interrupt routine and algorithm with a skin and simple scrolling ability.
    • Teams (I-Man/Pete) (Login The-Universe)
      Admin
      Posted Sep 15, 2007 1:04 AM

      Just a raw project that I ran out of time on and only tested in one directory. I'll be happy to fix any problems if you let me know about them. Basically this is the inturrupt routine Ildurest created and posted on the main forum with a few simple bells and whistles added to give the user the start of an actual scrolling file explorer tool.

      CAUTION: This program will erase and replace:

      myFiles.tmp
      myDirs.tmp
      myCombs.tmp


       

      IMPORTANT: This routine requires QB45 and up.

      -------------------------------------------------------------------------------

      DECLARE SUB Main ()
      DECLARE SUB Skin ()
      TYPE RegType
      AX AS INTEGER
      BX AS INTEGER
      CX AS INTEGER
      DX AS INTEGER
      BP AS INTEGER
      SI AS INTEGER
      DI AS INTEGER
      FLAGS AS INTEGER
      END TYPE

      TYPE DTABuffer
      Reserved AS STRING * 21
      Attr AS STRING * 1
      Time AS INTEGER
      Date AS INTEGER
      Size AS LONG
      Name1 AS STRING * 13
      END TYPE

      SCREEN 0, 0, 0, 0
      LOCATE , , 0
      CHDIR "c:\qb45"
      DIM SHARED R AS RegType, R2 AS RegType
      DIM SHARED DTA AS DTABuffer
      DIM SHARED Filespec AS STRING * 13

      CALL Skin
      CALL Main

      SUB Main
      REDIM tab1(4)
      tab1(1) = 5
      tab1(2) = 46
      tab1(3) = 54
      tab1(4) = 67
      DirID$ = " [Folder]"
      CONST alen% = 71: REM tab1(4) + 10 - tab1(1)
      DIM Entry AS STRING * alen

      R.AX = &H1A00
      R.DX = VARPTR(DTA)
      CALL INTERRUPT(&H21, R, R2)
      Filespec = "*.*"
      R.AX = &H4E00
      R.CX = 1 + 2 + 4 + 16 + 32
      R.DX = VARPTR(Filespec)
      CALL INTERRUPT(&H21, R, R)

      COLOR 4, 0
      LOCATE 3, tab1(1)
      PRINT "<File Name>";
      LOCATE , tab1(2) - 5
      PRINT "<Size>";
      LOCATE , tab1(3) + 2
      PRINT "<Date>";
      LOCATE , tab1(4) + 2
      PRINT "<Time>"
      COLOR 7, 0
      VP1% = 4: VP2% = 22
      PCOPY 0, 1: SCREEN 0, 0, 1, 0
      VIEW PRINT VP1% TO VP2%
      ff1% = FREEFILE: OPEN "myfiles.tmp" FOR OUTPUT AS ff1%: CLOSE #ff1%
      ff1% = FREEFILE: OPEN "myfiles.tmp" FOR RANDOM AS ff1% LEN = alen
      ff2% = FREEFILE: OPEN "myDirs.tmp" FOR OUTPUT AS ff2%: CLOSE #ff2%
      ff2% = FREEFILE: OPEN "myDirs.tmp" FOR RANDOM AS ff2% LEN = alen

      DO
      GOSUB GetDTA
      IF (R.AX AND 255) <> 0 AND task% = 0 THEN IF task% = 0 THEN task% = 1

      IF FileName$ <> "" OR task% = 1 THEN
      IF task% = 0 THEN GOSUB StoreDTA ELSE GOSUB PrintDTA
        IF task% = 1 THEN
          IF CSRLIN = VP2% THEN
            IF Combine% = 1 THEN PCOPY 1, 0: SCREEN 0, 0, 0, 0: VIEW PRINT VP1% TO VP2%: Combine% = -2
            DO
              DO
              Key$ = INKEY$
              IF Key$ = CHR$(27) THEN COLOR 15, 1: SYSTEM
              IF Key$ = CHR$(0) + "H" OR Key$ = CHR$(0) + "P" THEN EXIT DO
              LOOP
              SELECT CASE Key$
              CASE CHR$(0) + "H": GOSUB ScrollUp
              CASE CHR$(0) + "P": GOSUB Start
              END SELECT
            LOOP
          END IF
        END IF
      END IF

      Start:
      IF task% = 0 THEN
      R.AX = &H4F00
      R.CX = 1 + 2 + 4 + 16 + 32
      CALL INTERRUPT(&H21, R, R)
      ELSE
        IF CSRLIN = VP2% AND ii% <> noe% THEN
        PRINT
        LOCATE VP2%, 1: COLOR 4, 0: PRINT CHR$(179); : LOCATE , 80: PRINT CHR$(179); : LOCATE VP2%, 1: COLOR 7, 0
        ELSE
        IF ii% <> noe% THEN PRINT
        END IF
      END IF

      DirectoryName$ = "": FileName$ = ""
      LOOP
      SYSTEM

      GetDTA:
      IF ASC(DTA.Attr) AND 16 THEN
      DirectoryName$ = DTA.Name1
        IF MID$(DirectoryName$, 1, 2) <> "." + CHR$(0) AND MID$(DirectoryName$, 1, 3) <> ".." + CHR$(0) THEN
        FileName$ = DTA.Name1
        IF INSTR(FileName$, CHR$(0)) <> 0 THEN FileName$ = MID$(FileName$, 1, INSTR(FileName$, CHR$(0)) - 1)
        FileName$ = FileName$ + DirID$
        ELSE
        FileName$ = ""
        END IF
      ELSE
      FileName$ = DTA.Name1 + SPACE$(LEN(DirID$))
      END IF

      FileSize = DTA.Size / 1000
      IF FileSize <> 0 AND FileSize < 1 THEN FileSize = 1
      FileSize$ = LTRIM$(STR$(CINT(FileSize)))
      FileYear$ = LTRIM$(STR$((DTA.Date AND &HFE00) \ 512 + 1980))
      FileMonth$ = LTRIM$(STR$((DTA.Date AND 480) \ 32))
      IF LEN(FileMonth$) = 1 THEN FileMonth$ = " " + FileMonth$
      FileDay$ = LTRIM$(STR$((DTA.Date AND 31)))
      IF LEN(FileDay$) = 1 THEN FileDay$ = "0" + FileDay$
      FileHours$ = LTRIM$(STR$((PEEK(VARPTR(DTA.Time) + 1) AND &HF8) \ 8))
      IF VAL(FileHours$) > 12 THEN FileHours$ = LTRIM$(STR$(VAL(FileHours$) - 12)): AMPM$ = "pm" ELSE AMPM$ = "am"
      IF LEN(FileHours$) = 1 THEN FileHours$ = " " + FileHours$
      FileMinutes$ = LTRIM$(STR$((DTA.Time AND &H7E0) \ &H20))
      IF LEN(FileMinutes$) = 1 THEN FileMinutes$ = "0" + FileMinutes$
      FileSeconds$ = LTRIM$(STR$((DTA.Time AND &H1F) * 2))
      IF LEN(FileSeconds$) = 1 THEN FileSeconds$ = "0" + FileSeconds$
      TimeStamp$ = FileHours$ + ":" + FileMinutes$ + ":" + FileSeconds$ + AMPM$
      DateStamp$ = FileMonth$ + "-" + FileDay$ + "-" + FileYear$
      RETURN

      StoreDTA:
      noe% = noe% + 1
      MID$(Entry$, 1, LEN(FileName$)) = FileName$
      MID$(Entry$, tab1(2) - LEN(FileSize$) - tab1(1)) = FileSize$ + " KB"
      MID$(Entry$, tab1(3) - tab1(1)) = DateStamp$
      MID$(Entry$, tab1(4) - tab1(1)) = TimeStamp$
      SELECT CASE LEN(DirectoryName$)
      CASE 0: SFD% = SFD% + 1: PUT #ff1%, SFD%, Entry
      CASE ELSE: SDD% = SDD% + 1: PUT #ff2%, SDD%, Entry
      END SELECT
      DirectoryName$ = "": Entry = ""
      RETURN

      CombineFiles:
      CLOSE #ff1%, ff2%
      ff1% = FREEFILE: OPEN "myfiles.tmp" FOR RANDOM AS ff1% LEN = alen
      ff2% = FREEFILE: OPEN "myDirs.tmp" FOR RANDOM AS ff2% LEN = alen
      ff3% = FREEFILE: OPEN "myCombs.tmp" FOR OUTPUT AS ff3%: CLOSE ff3%
      ff3% = FREEFILE: OPEN "myCombs.tmp" FOR RANDOM AS ff3% LEN = alen
      ii% = 0
      DO UNTIL EOF(ff2%)
      ii% = ii% + 1
      GET #ff2%, ii%, Entry
      PUT #ff3%, ii%, Entry
      LOOP
      jj% = 0
      DO UNTIL EOF(ff1%)
      jj% = jj% + 1
      GET #ff1%, jj%, Entry
      PUT #ff3%, ii%, Entry
      ii% = ii% + 1
      LOOP
      CLOSE ff1%, ff2%, ff3%
      KILL "myfiles.tmp"
      KILL "myDirs.tmp"
      NAME "myCombs.tmp" AS "myfiles.tmp"
      ff1% = FREEFILE: OPEN "myfiles.tmp" FOR RANDOM AS ff1% LEN = alen
      ii% = 0
      RETURN

      PrintDTA:
      IF Combine% = 0 THEN GOSUB CombineFiles: Combine% = 1
      IF ii% = noe% THEN RETURN
      ii% = ii% + 1
      GET #ff1%, ii%, Entry
      LOCATE , tab1(1): PRINT Entry;
      RETURN

      ScrollUp:
      IF ii% <= VP2% - VP1% + 1 THEN RETURN
      ii% = ii% - (VP2% - VP1% + 1)
      LOCATE VP1%
      FOR i% = 1 TO (VP2% - VP1% + 1)
      GET #ff1%, ii%, Entry
      LOCATE , tab1(1): PRINT Entry;
      IF CSRLIN <> VP2% THEN PRINT : ii% = ii% + 1
      NEXT
      LOCATE VP2%, 1
      RETURN

      END SUB

      SUB Skin
      COLOR 14, 1
      LOCATE 1, 1: PRINT SPACE$(80);
      LOCATE 24, 1: PRINT STRING$(80, 196);
      LOCATE 2, 1: PRINT STRING$(80, 196);
      LOCATE 1, 1
      COLOR 11, 1
      PZ$ = "QBasic File Explorer": LOCATE , 41 - LEN(PZ$) \ 2: PRINT PZ$;

      COLOR 4, 0: LOCATE 3, 1
      PRINT CHR$(218); STRING$(78, CHR$(196)); CHR$(191);
      LOCATE 23, 1
      PRINT CHR$(192); STRING$(78, CHR$(196)); CHR$(217);
      LOCATE 4, 1
      FOR i = 1 TO 19
      LOCATE , 1: PRINT CHR$(179); : LOCATE , 80: PRINT CHR$(179)
      NEXT i

      COLOR 11, 1: LOCATE 25, 1: PRINT SPACE$(80);
      PZ$ = "PRESS THE UP AND DOWN ARROW KEYS TO SCROLL LIST OR PRESS THE ESC KEY TO QUIT"
      COLOR 11, 1
      LOCATE 25, 41 - LEN(PZ$) \ 2: PRINT PZ$;
      COLOR 7, 0
      END SUB

      --------------------------------------------------------

      Pete

       

    Login Status
  • You are not logged in
    • Login
      Password
       

      Optional
      Provides additional benefits such as notifications, signatures, and user authentication.


      Create Account
    Your Name
    Your Email
    (Optional)
    Message Title
    Message Text
    Options Also send responses to my email address
          


    Newbies usually go to www.qbasic.com and click on The QBasic Forum
    Forum regulars have their own ways, which include The QBasic Community Forums