'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
|