'FRAGGLE.BAS by Bill Buckels 1990
'Written in QuickBASIC Version 4.5
'produces and displays image fragments
'created from BASIC BSAVED MED RES CGA IMAGES
'Revised 2007 as a pure QuickBasic Program
'Removed PCX support because not written in QuickBasic
'Added resave back to BSaved Image
'Revised program structure for readability
'Increased error handling and added error messages
'Removed automatic naming from basename.
'Now using the .PUT extension when saving.
'Added 8 x 8 Block Based Fragments for C64 Style Saves
'Revised May 2008 to create silly things

DEFINT A-Z
'allocate memory for picture buffer
DIM PIC(8002)                              'picture buffer
'constants for keypress values
NUL$ = CHR$(0)
UP$ = NUL$ + CHR$(72)
DN$ = NUL$ + CHR$(80)
LT$ = NUL$ + CHR$(75)
RT$ = NUL$ + CHR$(77)
ESC$ = CHR$(27)
ENTER$ = CHR$(13)
'constants for keypress status
FLAG = 0
ZERO = 0
ONE =  1
TWO =  2
DONE = 3
ABORT = 0

ERRORLEVEL = 0
ON ERROR GOTO ERRORHANDLE

SCREEN 1

DO

 'bounds of the screen
 X1 = 0: X2 = 319: Y1 = 0: Y2 = 199

 GOSUB DRAWMENU 'Menu Routine
 GOSUB GETCHOICE

 IF ERRORLEVEL = 0 THEN
    SELECT CASE PICTYPE%
    CASE 1,5
        'if we have been asked to fraggle
        GOSUB VARFRAG
    CASE 2
        'if we're not fragging we're viewing so we stop and wait in that case
        KEYPRESS$ = INPUT$(1)

    CASE 3
        'make a menu chip
        GOSUB FIXEDFRAG
        CASE 6
                GOSUB SILLYFRAG

    CASE 4 'bsave fragment
        GOSUB RESAVE

    END SELECT
 END IF

 ABORT = ZERO
 ERRORLEVEL = 0
LOOP UNTIL PICNAME$ = "FINISHED"
END


DRAWMENU:

 CLS

 LINE (2,2)-(317,102),2,b
 LINE (0,0)-(319,102),1,b
 LOCATE 2,2
 PRINT " FRAGGLE(C)
 LOCATE 3,2
 PRINT " Copyright Bill Buckels 1990-2007"
 LOCATE 5,2
 PRINT "    1)   Fraggle a BSaved Image"
 LOCATE 6,2
 PRINT "    2)   Load an Image Fragment"
 LOCATE 7,2
 PRINT "    3)   Fraggle 88 x 52 from BSaved"
 LOCATE 8, 2
 PRINT "    4)   BSave a Fraggled Image"
 LOCATE 9, 2
 PRINT "    5)   Fraggle C64 Style from BSaved"
 LOCATE 10,2
 PRINT "    6)   Fraggle Silly Things"

 ' menu explanations

 LINE (2,104)-(317,197),1,b
 LINE (0,104)-(319,199),2,b
 LOCATE 15, 2
 PRINT " Summary of Fraggle Hot Keys:"
 LOCATE 17, 2
 PRINT " R      - Reverse Video"
 LOCATE 18, 2
 PRINT " L      - Adjust Length By 1 pixel"
 LOCATE 19, 2
 PRINT " W      - Adjust Width By 1 pixel"
 LOCATE 20, 2
 PRINT " ESC    - Abandon Operation"
 LOCATE 21, 2
 PRINT " ENTER  - 1st and 2nd corners"
 LOCATE 22, 2
 PRINT "          Save Fragment"
 LOCATE 23, 2
 PRINT " ARROWS - Change Clip Position";

 'get input
 LOCATE 12,2
 PRINT " Select from the above Menu options.";


RETURN


GETCHOICE:
  'menu input subroutine
  PICTYPE$ = INPUT$(1)
  PICTYPE% = VAL(PICTYPE$)
  SELECT CASE PICTYPE%
  CASE 1, 3, 5, 6
        CLS
    PRINT "Raw Load"
    FILES "*.BAS"
  CASE 2, 4
        CLS
    PRINT "Image Fragment Load"
        FILES "*.PUT"
  CASE ELSE
        END
  END SELECT

  LINE(0,180)- (319,195),0,BF
  LINE(0,180)- (319,195),2,B
  LINE(2,182)- (317,193),1,B
  LOCATE 24,2
  SELECT CASE PICTYPE%
  CASE 1, 3, 5, 6
    INPUT " PICTURE"; PICNAME$
  CASE 2, 4
    INPUT " FRAGMENT"; PICNAME$
  END SELECT

  IF PICNAME$ = "" THEN
    PICTYPE%=0
  ELSE
        CLS
        GOSUB LOADPIC
  END IF

RETURN


LOADPIC:
  ' picture loader subroutine
  SELECT CASE PICTYPE%

  CASE 1, 3, 5, 6  'Raw Data
      SEGMENT = &HB800              'Use Screen Segment
      OFFSET = &H0
      DEF SEG = SEGMENT
      BLOAD PICNAME$, OFFSET        'Bload the Picture

  CASE 2, 4
      'load image fragments
      SEGMENT = VARSEG(PIC(0))
      OFFSET = VARPTR(PIC(0))

      DEF SEG = SEGMENT
      BLOAD PICNAME$, OFFSET
      XTAB = INT((640 - PIC(0)) / 4)   'center horizontally
      PUT (XTAB, 0), PIC, PSET         'put picture

  END SELECT
  DEF SEG  'Go back to original segment

  IF ERRORLEVEL > 0 THEN
      CLS
      LINE (0,0)-(319,24),0,BF
      LINE (0,0)-(319,24),1,B
      LOCATE 2,2
      PRINT PICNAME$ + " NOT loaded. Press a key..."
      A$ = INPUT$(1)
  END IF

RETURN


VARFRAG:
  ' subroutine for saving variable size image fragments
  ' backup the picture
  GET (X1, Y1)-(X2, Y2), PIC
  'and do an elastic box with a DOTTED line in two colors
  LINE (X1, Y1)-(X2, Y2), 2, B, &HAAAA
  LINE (X1, Y1)-(X2, Y2), 3, B, &H5555

  IF PICTYPE% = 5 THEN
       INCR% = 8
  ELSE
       INCR% = 4
  END IF


  ENTER% = 1 'FRAG PART ONE- SET THE TOP LEFT CORNER
  FLAG = 0
  WHILE FLAG = 0
    KEYPRESS$ = INKEY$
    SELECT CASE KEYPRESS$
    CASE "R", "r" 'reverse video
    PUT (0,0),PIC,PRESET
    GET (0,0)-(319,199), PIC
    PUT (0,0),PIC,PSET
    FLAG=ONE
    CASE "L", "l" 'fine tuning
        IF INCR% = 4 THEN
      IF ENTER% = 1 THEN ' TOP LEFT CORNER
          IF NOT Y1 = 0 THEN
         Y1 = Y1 - 1
         PUT (0, 0), PIC, PSET
         FLAG = ONE
          END IF
      ELSE  ' BOTTOM RIGHT CORNER
          IF Y2 > (Y1 + 4) THEN
         Y2 = Y2 - 1
         PUT (0, 0), PIC, PSET
         FLAG = ONE
          END IF
      END IF
    END IF
    CASE "W", "w"
        IF INCR% = 4 THEN
      IF ENTER% = 1 THEN ' TOP LEFT CORNER
          IF NOT X1 = 0 THEN
         X1 = X1 - 1
         PUT (0, 0), PIC, PSET
         FLAG = ONE
          END IF
      ELSE  ' BOTTOM RIGHT CORNER
          IF X2 > (X1 + 4) THEN
         X2 = X2 - 1
         PUT (0, 0), PIC, PSET
         FLAG = ONE
          END IF
      END IF
    END IF
    CASE UP$ 'up arrow
    IF ENTER% = 1 THEN ' TOP LEFT CORNER
          IF NOT Y1 = 0 THEN
         Y1 = Y1 - INCR%
         PUT (0, 0), PIC, PSET
         FLAG = ONE
          END IF
    ELSE  ' BOTTOM RIGHT CORNER
          IF Y2 > (Y1 + INCR%) THEN
         Y2 = Y2 - INCR%
         PUT (0, 0), PIC, PSET
         FLAG = ONE
          END IF
    END IF
    CASE DN$ 'down arrow
    IF ENTER% = 1 THEN ' TOP LEFT CORNER
          IF NOT Y1 > Y2 - INCR% THEN
         Y1 = Y1 + INCR%
         PUT (0, 0), PIC, PSET
         FLAG = ONE
          END IF
    ELSE  ' BOTTOM RIGHT CORNER
          IF NOT Y2 = 199 THEN
         Y2 = Y2 + INCR%
         PUT (0, 0), PIC, PSET
         FLAG = ONE
          END IF
    END IF
    CASE LT$ 'left arrow
    IF ENTER% = 1 THEN ' TOP LEFT CORNER
          IF NOT X1 = 0 THEN
         X1 = X1 - INCR%
         PUT (0, 0), PIC, PSET
         FLAG = ONE
          END IF
    ELSE  ' BOTTOM RIGHT CORNER
          IF X2 > (X1 + INCR%) THEN
         X2 = X2 - INCR%
         PUT (0, 0), PIC, PSET
         FLAG = ONE
          END IF
    END IF
    CASE RT$ 'right arrow
    IF ENTER% = 1 THEN ' TOP LEFT CORNER
          IF NOT X1 > X2 - INCR% THEN
         X1 = X1 + INCR%
         PUT (0, 0), PIC, PSET
         FLAG = ONE
          END IF
    ELSE  ' BOTTOM RIGHT CORNER
          IF NOT X2 = 319 THEN
         X2 = X2 + INCR%
         PUT (0, 0), PIC, PSET
         FLAG = ONE
          END IF
    END IF
    CASE ESC$
    ABORT = TWO
    FLAG = DONE
    CASE ENTER$
    ENTER% = ENTER% + 1 'FRAG PART TWO - SET THE BOTTOM RIGHT CORNER
    IF ENTER% > 2 THEN FLAG = DONE
    END SELECT
    IF FLAG = ONE THEN
    'change the position of the elastic box
    'based on the last arrow or positional keypress
    LINE (X1, Y1)-(X2, Y2), 2, B, &HAAAA
    LINE (X1, Y1)-(X2, Y2), 3, B, &H5555
    FLAG = 0
    END IF
  WEND

  IF ABORT = ZERO THEN
      GOSUB SAVEFRAG 'SAVE IF ESCAPE WAS NOT PRESSED
  END IF

RETURN



FIXEDFRAG:
  ' subroutine for saving 88 x 52 fixed size image fragments
  ' or 24 x 21 Double C4 Sprite
  ' backup the picture
  GET (X1, Y1)-(X2, Y2), PIC
  ' use a printshop compatible image size
  ' 88 x 52
  X1=0 : X2=87 : Y1 = 0 : Y2=51


  'and do an elastic box with a DOTTED line
  'in two colors to show-up regardless
  LINE (X1, Y1)-(X2, Y2), 2, B, &HAAAA
  LINE (X1, Y1)-(X2, Y2), 3, B, &H5555

  FLAG = 0

  WHILE FLAG = 0
    KEYPRESS$ = INKEY$

    SELECT CASE KEYPRESS$
    CASE "R", "r"  'reverse video
        PUT (0,0),PIC,PRESET
        GET (0,0)-(319,199), PIC
        PUT (0,0),PIC,PSET
        FLAG=ONE
    CASE UP$
              IF NOT Y1 = 0 THEN
        Y1 = Y1 - 4
        Y2 = Y2 - 4
        PUT (0, 0), PIC, PSET
        FLAG = ONE
              END IF
    CASE DN$  'down arrow
              IF NOT (Y2+4)>199 THEN
        Y2 = Y2 + 4
        Y1 = Y1 + 4
        PUT (0, 0), PIC, PSET
        FLAG = ONE
              END IF
    CASE LT$  'left arrow
              IF NOT X1 = 0 THEN
        X1 = X1 - 4
        X2 = X2 - 4
        PUT (0, 0), PIC, PSET
        FLAG = ONE
              END IF
    CASE RT$  'right arrow
              IF NOT (X2+4)>319 THEN
        X1 = X1 + 4
        X2 = X2 + 4
        PUT (0, 0), PIC, PSET
        FLAG = ONE
              END IF
    CASE ESC$
        ABORT = TWO
        FLAG = DONE
    CASE ENTER$
        FLAG = DONE
    END SELECT

    IF FLAG = ONE THEN
    'change the position of the elastic box
    'based on the last arrow or positional keypress
    LINE (X1, Y1)-(X2, Y2), 2, B, &HAAAA
    LINE (X1, Y1)-(X2, Y2), 3, B, &H5555
    FLAG = 0
    END IF
  WEND

  IF ABORT = ZERO THEN
    GOSUB SAVEFRAG 'SAVE IF ESCAPE WAS NOT PRESSED
  END IF

RETURN

SILLYFRAG:

  GET (X1, Y1)-(X2, Y2), PIC
  X1=14 : X2=209: Y1 = 8 : Y2=71
  SUFFIX$ = "1"

  'and do an elastic box with a DOTTED line
  'in two colors to show-up regardless
  LINE (X1, Y1)-(X2, Y2), 2, B, &HAAAA
  LINE (X1, Y1)-(X2, Y2), 3, B, &H5555

  FLAG = 0

  WHILE FLAG = 0
    KEYPRESS$ = INKEY$
    SELECT CASE KEYPRESS$
    CASE ESC$
        ABORT = TWO
        FLAG = DONE
    CASE ENTER$
        FLAG = DONE
    END SELECT
  WEND

  IF ABORT = ZERO THEN
    GOSUB SAVEFRAG 'SAVE IF ESCAPE WAS NOT PRESSED
    GOSUB LOADPIC
    GET (0, 0)-(319, 199), PIC
    SUFFIX$ = "2"
    Y1 = 72 : Y2=141
    GOSUB SAVEFRAG
    GOSUB LOADPIC
    GET (0, 0)-(319, 199), PIC
    SUFFIX$ = "3"
    Y1 = 142: Y2=199
    GOSUB SAVEFRAG
  END IF

RETURN

SAVEFRAG:
  'subroutine for saving an image fragment
  'blot the screen one last time
  'give the file name from the a .PUT extension
  PUT (0, 0), PIC, PSET
  GET (X1, Y1)-(X2, Y2), PIC
  LINE (0,0)-(319,24),0,BF
  LINE (0,0)-(319,24),1,B
  LOCATE 2,2
  IF PICTYPE% = 6 THEN
        NEWPIC$ = PICNAME$
        PRINT "FRAGMENT NAME"; NEWPIC$
  ELSE
    INPUT "FRAGMENT NAME"; NEWPIC$
    IF NEWPIC$ = "" THEN RETURN
  END IF

  FRAG$ = NEWPIC$
  NEWPIC$ = ""

  A$ = ""
  A% = 1
  'parse until the period
  WHILE NOT A$ = "."
    IF A% < LEN(FRAG$)+1 THEN
      A$ = MID$(FRAG$, A%, 1)
    ELSE
      A$ = "."
    END IF
    IF PICTYPE% = 6 AND A$ = "." THEN
       NEWPIC$ = NEWPIC$ + SUFFIX$
    END IF
    NEWPIC$ = NEWPIC$ + A$
    A% = A% + 1
  WEND
  NEWPIC$ = NEWPIC$ + "PUT"
  'put the window into an array
  'then point to the array
  'and save it to disk

  SEGMENT = VARSEG(PIC(0))
  OFFSET = VARPTR(PIC(0))
  DEF SEG = SEGMENT
  'find the width and the height
  'and calculate the length of the array
  'raster lines break on byte boundaries
  'the array header is two words in length
  WIDE = INT((((X2 - X1) * 2) + 7) / 8)
  HIGH = (Y2 - Y1)+1
  PICSIZE = 4 + (WIDE * HIGH) +1
  BSAVE NEWPIC$, OFFSET, PICSIZE
  DEF SEG

  CLS
  LINE (0,0)-(319,24),0,BF
  LINE (0,0)-(319,24),1,B
  LOCATE 2,2
  IF ERRORLEVEL = 0 THEN
    PRINT NEWPIC$ + " saved. Press a key..."
  ELSE
    PRINT NEWPIC$ + " NOT saved. Press a key..."
  END IF
  A$ = INPUT$(1)

RETURN

RESAVE:
  'subroutine for saving a Bsaved Image
  'from an image fragment
  GET (X1, Y1)-(X2, Y2), PIC
  LINE (0,0)-(319,24),0,BF
  LINE (0,0)-(319,24),1,B
  LOCATE 2,2
  INPUT "NEW NAME"; NEWPIC$
  IF NEWPIC$ = "" THEN RETURN

  FRAG$ = NEWPIC$
  NEWPIC$ = ""

  A$ = ""
  A% = 1
  'parse until the period
  WHILE NOT A$ = "."
    IF A% < LEN(FRAG$)+1 THEN
      A$ = MID$(FRAG$, A%, 1)
    ELSE
      A$ = "."
    END IF
    NEWPIC$ = NEWPIC$ + A$
    A% = A% + 1
  WEND
  NEWPIC$ = NEWPIC$ + "BAS"

  'restore the screen
  'and save it to disk
  PUT (0, 0), PIC, PSET
  SEGMENT = &HB800              'Use Screen Segment
  OFFSET = &H0
  DEF SEG = SEGMENT
  PICSIZE = 16384
  BSAVE NEWPIC$, OFFSET, PICSIZE
  DEF SEG

  CLS
  LINE (0,0)-(319,24),0,BF
  LINE (0,0)-(319,24),1,B
  LOCATE 2,2
  IF ERRORLEVEL = 0 THEN
    PRINT NEWPIC$ + " saved. Press a key..."
  ELSE
    PRINT NEWPIC$ + " NOT saved. Press a key..."
  END IF
  A$ = INPUT$(1)

RETURN

ERRORHANDLE:
     BEEP
     ERRORLEVEL = 1
     RESUME NEXT

<< Back to Apple II Graphics

<< Back to Apple Oldies


© Copyright Bill Buckels 2010
All Rights Reserved.