summaryrefslogtreecommitdiff
path: root/support/qfig/src/qfig.bas
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
committerNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
commite0c6872cf40896c7be36b11dcc744620f10adf1d (patch)
tree60335e10d2f4354b0674ec22d7b53f0f8abee672 /support/qfig/src/qfig.bas
Initial commit
Diffstat (limited to 'support/qfig/src/qfig.bas')
-rw-r--r--support/qfig/src/qfig.bas1124
1 files changed, 1124 insertions, 0 deletions
diff --git a/support/qfig/src/qfig.bas b/support/qfig/src/qfig.bas
new file mode 100644
index 0000000000..281f2d5f38
--- /dev/null
+++ b/support/qfig/src/qfig.bas
@@ -0,0 +1,1124 @@
+'****************************************************************************
+' qfig.bas <-- bfig.bas <-- motivated by "xfig" on X-*indow of UN*X
+' 2/21/1993 T.Iwakuma (bear@hashi1.civil.tohoku.ac.jp)
+'****************************************************************************
+' "mouse.obj" and "graph.obj" must be "link"ed and "lib"ed to make
+' "qfig.lib" as well as "qfig.qlb".
+' interpreter must be activated as "qb /lqfig"
+'****************************************************************************
+'$INCLUDE: 'QB.BI'
+'$DYNAMIC
+'$INCLUDE: 'MOUSE.BI'
+'$INCLUDE: 'QFIG.BI'
+'****************************************************************************
+qfigtitle$ = "qfig Ver.1.1a (3/24/1997)"
+'qfigtitle1$ = "modified for J-3100/IBM compatible PCs"
+qfigtitle2$ = "by: William Ofosu-Amaah"
+'qfigtitle3$ = "from: qfig NEC Ver.0.9c+1 (3/20/1993)"
+'qfigtitle4$ = "by: Mr T.Iwakuma (bear@hashi1.tohoku.ac.jp)"
+qfigtitle5$ = "(XI6W-OFSA@asahi-net.or.jp)"
+'****************************************************************************
+'
+IF INSTR(COMMAND$, "/?") <> 0 THEN
+ whelp
+ END
+END IF
+
+Preparation
+' key call
+ON KEY(1) GOSUB f.1
+ON KEY(2) GOSUB f.2
+ON KEY(3) GOSUB f.3
+ON KEY(4) GOSUB f.4
+ON KEY(5) GOSUB f.5
+ON KEY(6) GOSUB f.6
+ON KEY(7) GOSUB f.7
+ON KEY(8) GOSUB f.8
+ON KEY(9) GOSUB f.9
+ON KEY(10) GOSUB f.10
+ON KEY(15) GOSUB fnctn: KEY 15, CHR$(&H0) + CHR$(&H1) 'ESC
+ON KEY(16) GOSUB redraw: KEY 16, CHR$(&H4) + CHR$(&H13) 'CTRL+R
+ON KEY(17) GOSUB Help: KEY 17, CHR$(&H4) + CHR$(&H23) 'CTRL+H
+ON KEY(19) GOSUB quit: KEY 19, CHR$(&H4) + CHR$(&H10) 'CTRL+Q
+ON KEY(20) GOSUB clreset: KEY 20, CHR$(&H4) + CHR$(&H1F) 'CTRL+S
+ON KEY(22) GOSUB stext: KEY 22, CHR$(&H4) + CHR$(&H14)'CTRL+T
+ON KEY(24) GOSUB widewindow: KEY 24, CHR$(&H4) + CHR$(&H11) 'CTRL+W
+KeySwitch 1
+KEY(8) ON: KEY(9) ON: KEY(10) ON: KEY(17) ON: KEY(19) ON
+KEY OFF
+ON ERROR GOTO somethingwrong
+' mouse activation
+IF MouseReady% THEN '<=== when Mouse is used
+ MouseInit '|
+ MouseMode 1 '|
+ MouseHide '|
+ MouseBorder pymin%, pxmin%, pymax%, pxmax% '|
+ MouseLocate py%, px% '|
+ mouswitch% = -1 '|
+END IF '<=== when Mouse is used
+
+SCREEN scrtype%
+GOSUB title
+VIEW SCREEN (0, 0)-(windowx%(0), windowy%(0))
+WINDOW SCREEN (0, 0)-(windowx%(0), windowy%(0))
+CL.R.edraw 0, 0
+SetInst -1
+
+' Main infinite LOOP
+DO
+ pxold% = px%: pyold% = py%
+ keyin% = KeyIsTyped%
+ IF ((keyin% > 4) AND (job% = 0)) THEN
+ ON keyin% - 4 GOSUB rollup, rolldown, leftmost, rightmost
+ END IF
+ IF keyin% = 2 OR keyin% = 3 THEN
+ qx% = INT(CSNG(px% - pxo%) / wndwxy(wndwfctr%) + .9)
+ qy% = INT(CSNG(py% - pyo%) / wndwxy(wndwfctr%) + .9)
+ IF qy% > windowy%(0) - 48 THEN
+ IF qx% < 15 THEN
+ IF py% >= pymax% - 4 THEN GOSUB rolldown
+ ELSEIF qx% < 295 THEN
+ i% = INT((CSNG(qx%) + 41!) / 56!)
+ IF qx% < 56 * i% + 8 THEN
+ GOSUB setbymouse
+ ON i% GOSUB f.1, f.2, f.3, f.4, f.5
+ END IF
+ ELSEIF qx% > 366 THEN
+ i% = INT((CSNG(qx%) - 31!) / 56!)
+ IF qx% < 56 * i% + 80 THEN
+ GOSUB setbymouse
+ ON i% - 5 GOSUB f.6, f.7, f.8, f.9, f.10
+ END IF
+ END IF
+ ELSEIF py% <= pymin% + 4 THEN
+ IF px% <= pxmin% + 4 THEN
+ dwndwfctr% = 1
+ GOSUB widewindowbymouse
+ ELSEIF px% >= pxmax% - 4 THEN
+ dwndwfctr% = -1
+ GOSUB widewindowbymouse
+ ELSE
+ GOSUB rollup
+ END IF
+ ELSEIF px% <= pxmin% + 4 THEN
+ GOSUB leftmost
+ ELSEIF px% >= pxmax% - 4 THEN
+ GOSUB rightmost
+ END IF
+ END IF
+ CursorDisplay pxold%, pyold%
+ CursorDisplay px%, py%
+LOOP
+' show or not show text
+stext:
+KeySwitch 0
+IF wtext% = 0 THEN
+ wtext% = 1
+ELSE
+ wtext% = 0
+END IF
+CL.R.edraw 0, 0
+KeySwitch 1
+RETURN
+' command by mouse
+setbymouse:
+IF py% - pyo% < windowy%(wndwfctr%) - INT(32! * wndwxy(wndwfctr%) + .9) THEN
+ func% = 0: func1% = 0: GOSUB fnctn1 'Top Line of Function row
+ELSEIF py% - pyo% < windowy%(wndwfctr%) - INT(16! * wndwxy(wndwfctr%) + .9) THEN
+ func% = 1: func1% = 1: GOSUB fnctn1 'Middle Line
+ELSE
+ func% = 2: func1% = 1: GOSUB fnctn1 'Bottom Line
+END IF
+
+RETURN
+' clear and reset
+clreset:
+LOCATE 12, 30: PRINT " Are you sure (Y/N) " '; CHR$(7);
+DO: a$ = KeyIsTouched$
+LOOP UNTIL a$ = CHR$(CR) OR (a$ <> "" AND INSTR("YyNn", a$) <> 0)
+IF UCASE$(a$) = "Y" THEN
+ nobj% = 0
+ CL.R.edraw 0, 0: SetInst -1
+ELSE
+ GOSUB redraw
+END IF
+ RETURN
+' ending
+quit:
+QUIT0
+RETURN
+'
+quit1:
+IF mouswitch% THEN MouseHide: MouseInit '<=== when Mouse is used
+KeySwitch 0: KEY(8) OFF: KEY(9) OFF: KEY(10) OFF: KEY(17) OFF: KEY(19) OFF
+RETURN
+'
+title:
+deg = 3.14 / 180
+IF ega% = 0 THEN
+ cf% = 12
+ cb% = 15
+ cs% = 1
+ cline% = 1
+ ytext% = 16
+ELSE
+ cf% = 4
+ cb% = 7
+ cs% = 0
+ cline% = 1
+ ytext% = 18
+END IF
+'cl% and cb% should never be the same'
+xlogo% = 50
+
+PAINT (xlogo% + 135, 100), cb%
+CIRCLE (xlogo% + 205, 100), 50, cline%, , , 1
+CIRCLE (xlogo% + 215, 105), 50, cline%, 70 * deg, 236 * deg, 1
+CIRCLE (xlogo% + 212, 103), 67, cline%, 250 * deg, 80 * deg, 1
+CIRCLE (xlogo% + 200, 100), 67, cline%, , , 1
+PAINT (xlogo% + 135, 100), cf%, cline%
+PAINT (xlogo% + 156, 100), cs%, cline%
+PAINT (xlogo% + 278, 103), cs%, cline%
+LINE (xlogo% + 205, 150)-(xlogo% + 240, 180), 2
+LINE (xlogo% + 190, 166)-(xlogo% + 240, 200), 2
+LINE (xlogo% + 240, 180)-(xlogo% + 290, 170), 2
+LINE (xlogo% + 240, 200)-(xlogo% + 290, 170), 2
+LINE (xlogo% + 205, 150)-(xlogo% + 190, 166), 2
+PAINT (xlogo% + 240, 198), cf%, 2
+LINE (xlogo% + 205, 150)-(xlogo% + 190, 166), cf%
+LINE (xlogo% + 205, 150)-(xlogo% + 240, 180), cline%
+LINE (xlogo% + 190, 166)-(xlogo% + 240, 200), cline%
+LINE (xlogo% + 240, 180)-(xlogo% + 290, 170), cline%
+LINE (xlogo% + 240, 200)-(xlogo% + 290, 170), cline%
+LINE -STEP(3, 8), cline%
+LINE -STEP(-50, 30), cline%
+LINE -STEP(-30, -25), cline%
+PAINT (xlogo% + 290, 172), cs%, cline%
+CIRCLE (xlogo% + 193, 165), 20, cline%, 48 * deg, 113 * deg, 1
+PAINT (xlogo% + 193, 147), cf%, cline%
+CIRCLE (xlogo% + 205, 100), 50, cf%, 250 * deg, 270 * deg, 1
+LINE (xlogo% + 280, 160)-(xlogo% + 285, 130), cline%
+LINE -STEP(-5, 0), cline%
+LINE -STEP(2, -8), cline%
+LINE -STEP(40, 0), cline%
+LINE -STEP(-3, 8), cline%
+LINE -STEP(-20, 0), cline%
+LINE -STEP(-1, 7), cline%
+LINE -STEP(15, 0), cline%
+LINE -STEP(-2, 6), cline%
+LINE -STEP(-13, 0), cline%
+LINE -STEP(-3, 17), cline%
+LINE -STEP(-14, 0), cline%
+PAINT (xlogo% + 282, 159), cf%, cline%
+LINE (xlogo% + 326, 160)-(xlogo% + 331, 122), cline%
+LINE -STEP(10, 0), cline%
+LINE -STEP(-5, 38), cline%
+LINE -STEP(-10, 0), cline%
+PAINT (xlogo% + 328, 158), cf%, cline%
+CIRCLE (xlogo% + 367, 140), 17, cline%, 36 * deg, 160 * deg, 1
+CIRCLE (xlogo% + 368, 138), 8, cline%, 25 * deg, 160 * deg, 1
+LINE (xlogo% + 350, 135)-(xlogo% + 348, 149), cline%
+LINE (xlogo% + 361, 135)-(xlogo% + 357, 147), cline%
+LINE (xlogo% + 375, 135)-(xlogo% + 382, 135), cline%
+LINE -STEP(-1, -4), cline%
+CIRCLE (xlogo% + 365, 143), 17, cline%, 200 * deg, 335 * deg, 1
+CIRCLE (xlogo% + 366, 144), 8, cline%, 200 * deg, 335 * deg, 1
+LINE (xlogo% + 373, 146)-(xlogo% + 367, 146), cline%
+LINE -STEP(2, -4), cline%
+LINE -STEP(20, 0), cline%
+LINE -STEP(-2, 4), cline%
+LINE -STEP(-6, 0), cline%
+LINE -STEP(0, 3), cline%
+PAINT (xlogo% + 377, 133), cf%, cline%
+
+PSET (xlogo% + 120, 210), cline%
+LINE -STEP(58, 0), cline%
+PSET (xlogo% + 120, 210), cline%
+LINE -STEP(12, 11), cline%
+LINE -STEP(-12, 11), cline%
+LINE -STEP(55, 0), cline%
+CIRCLE (xlogo% + 178, 213), 3, cline%, 270 * deg, 90 * deg, 1
+CIRCLE (xlogo% + 178, 219), 3, cline%, 90 * deg, 270 * deg, 1
+LINE (xlogo% + 181, 213)-(xlogo% + 181, 224), cline%
+LINE (xlogo% + 175, 219)-(xlogo% + 175, 250), cline%
+CIRCLE (xlogo% + 250, 0), 234, cline%, 252 * deg, 288 * deg, 1
+PAINT (xlogo% + 126, 214), cf%, cline%
+PAINT (xlogo% + 176, 219), cf%, cline%
+PSET (xlogo% + 320, 210), cline%
+LINE -STEP(60, 0), cline%
+PSET (xlogo% + 380, 210), cline%
+LINE -STEP(-12, 11), cline%
+LINE -STEP(12, 11), cline%
+LINE -STEP(-57, 0), cline%
+CIRCLE (xlogo% + 320, 219), 3, cline%, 270 * deg, 90 * deg, 1
+CIRCLE (xlogo% + 320, 213), 3, cline%, 90 * deg, 270 * deg, 1
+LINE (xlogo% + 317, 213)-(xlogo% + 317, 225), cline%
+LINE (xlogo% + 323, 219)-(xlogo% + 323, 250), cline%
+CIRCLE (xlogo% + 250, 0), 260, cline%, 253.5 * deg, 286.4 * deg, 1
+PAINT (xlogo% + 321, 219), cf%, cline%
+PAINT (xlogo% + 320, 226), cf%, cline%
+PAINT (xlogo% + 376, 212), cf%, cline%
+s$ = "Version 1.1a"
+DIM inRegs AS RegType, outRegs AS RegType
+LOCATE ytext%, 27 + INT(xlogo% / 8)
+inRegs.bx = &H80 + (cf%)
+FOR i = 1 TO LEN(s$)
+ inRegs.ax = &HE00 + ASC(MID$(s$, i, 1))
+ CALL INTERRUPT(&H10, inRegs, outRegs)
+NEXT i
+SLEEP 1
+CLS 0: RETURN
+
+' alternative functions
+fnctn:
+func% = (func% + 1) MOD 3
+fnctn1:
+LOCATE line2%, 2: PRINT " "; : COLOR 7
+LOCATE line1%, 2: PRINT " "; : COLOR 7
+LOCATE line1% + 1, 2: PRINT " "; : COLOR 7
+LOCATE line2% + func%, 2: COLOR 6: PRINT "@"; : RETURN
+'LOCATE line2% + func1%, 2: PRINT " "; : COLOR 7: RETURN
+
+'fnctn: SWAP func%, func1%
+'LOCATE line2% + func%, 2: COLOR 6: PRINT "@";
+'LOCATE line2% + func1%, 2: PRINT " "; : COLOR 7: RETURN
+
+' need help?
+Help: Help.Me: RETURN
+' redraw
+redraw: CL.R.edraw 0, 0: RETURN
+' grouping
+'grouping: G.Group: GOTO f.end
+' rollup/down screen
+rollup:
+IF pymin% - vscroll% < 0 THEN RETURN
+ipy% = -vscroll%: GOTO updown
+rolldown:
+IF pymax% + vscroll% > REGIONYMAX THEN RETURN
+ipy% = vscroll%
+updown:
+pyo% = pyo% + ipy%: py% = py% + ipy%
+row% = row% + ipy%: pyold% = pyold% + ipy%
+pymin% = pyo% + INT(margin% * wndwxy(wndwfctr%) + .9)
+pymax% = pyo% + windowy%(wndwfctr%) - INT(margin% * wndwxy(wndwfctr%) + .9)
+pymax2% = pyo% + windowy%(wndwfctr%) - INT(margin% * wndwxy(wndwfctr%) + .9) - texth% * 3 * INT(wndwxy(wndwfctr%) + .9) - 21
+GOTO rst.scrn
+' move left/right screen
+leftmost:
+IF pxmin% - hscroll% < 0 THEN RETURN
+ipx% = -hscroll%: GOTO leftright
+rightmost:
+IF pxmax% + hscroll% > REGIONXMAX THEN RETURN
+ipx% = hscroll%
+leftright:
+pxo% = pxo% + ipx%: px% = px% + ipx%
+col% = col% + ipx%: pxold% = pxold% + ipx%
+pxmin% = pxo% + INT(margin% * wndwxy(wndwfctr%) + .9)
+pxmax% = pxo% + windowx%(wndwfctr%) - INT(margin% * wndwxy(wndwfctr%) + .9)
+' reset screen
+rst.scrn:
+IF mouswitch% THEN '<=== when Mouse is used
+ MouseBorder pymin%, pxmin%, pymax%, pxmax% '|
+END IF '<=== when Mouse is used
+WINDOW SCREEN (pxo%, pyo%)-(pxo% + windowx%(wndwfctr%), pyo% + windowy%(wndwfctr%))
+CL.R.edraw 0, 0
+RETURN
+' widen window by mouse
+widewindowbymouse:
+wndwfctr% = wndwfctr% + dwndwfctr%
+IF wndwfctr% > UBOUND(wndwxy) THEN wndwfctr% = 0
+IF wndwfctr% < LBOUND(wndwxy) THEN wndwfctr% = UBOUND(wndwxy)
+GOTO windowide
+' widen window
+widewindow:
+KeySwitch 0
+KEY(17) OFF: KEY(19) OFF 'Also disable Help, Quit
+CLS 0
+PRINT "Reduction rate:"
+FOR i% = 0 TO 3: PRINT TAB(4); i%; " : "; INT(1000 / wndwxy(i%)) / 10;
+PRINT TAB(16); "%": NEXT i%
+PRINT "Select one [0-3]"
+DO: a$ = INKEY$: LOOP UNTIL a$ <> "" AND INSTR("0123", a$) <> 0
+wndwfctr% = VAL(a$)
+windowide:
+pxmin% = pxo% + INT(margin% * wndwxy(wndwfctr%) + .9)
+pxmax% = pxo% + windowx%(wndwfctr%) - INT(margin% * wndwxy(wndwfctr%) + .9)
+pymin% = pyo% + INT(margin% * wndwxy(wndwfctr%) + .9)
+pymax% = pyo% + windowy%(wndwfctr%) - INT(margin% * wndwxy(wndwfctr%) + .9)
+pymax2% = pyo% + windowy%(wndwfctr%) - INT(margin% * wndwxy(wndwfctr%) + .9) - texth% * 3 * INT(wndwxy(wndwfctr%) + .9) - 21
+IF px% > pxmax% OR px% < pxmin% THEN
+ IF px% > pxmax% THEN
+ px% = INT(CSNG(pxmax%) / 4!) * 4
+ ELSE
+ px% = INT(CSNG(pxmin%) / 4! + .9) * 4
+ END IF
+ pxold% = px%: col% = px%
+END IF
+IF py% > pymax% OR py% < pymin% THEN
+ IF py% > pymax% THEN
+ py% = INT(CSNG(pymax% - INT(48! * wndwxy(wndwfctr%))) / 4!) * 4
+ ELSE
+ py% = INT(CSNG(pymin%) / 4! + .9) * 4
+ END IF
+ pyold% = py%: row% = py%
+END IF
+KEY(17) ON: KEY(19) ON 'Renable Help, Quit
+KeySwitch 1
+GOTO rst.scrn
+' straight lines / move
+f.1:
+seljob% = 1
+KEY(1) OFF
+IF kswitch% = 1 AND func% = 0 THEN
+ linesel% = 0
+ G.Curve 1, 0
+ELSEIF kswitch% = 1 AND func% = 1 THEN
+ linesel% = 1
+ MoveObj 0
+ELSE
+ FillPattern
+ COLOR 10
+ LOCATE line1% + 1, 7: PRINT fill%;
+ LOCATE line1% + 1, 3: PRINT "Fil-P";
+ COLOR 7
+ IF inbox% = 1 THEN
+ IF fill% <> 0 THEN
+ LINE (sxg%, syg%)-(px%, py%), 2, B
+ PAINT ((sxg% + px%) / 2, (syg% + py%) / 2), 0, 2
+ END IF
+ LINE (sxg%, syg%)-(px%, py%), 0, BF
+ LINE (sxg%, syg%)-(px%, py%), 0, BF
+ IF fill% = 0 THEN
+ LINE (sxg%, syg%)-(px%, py%), 7, B
+ ELSE
+ LINE (sxg%, syg%)-(px%, py%), 2, B
+ PAINT ((sxg% + px%) / 2, (syg% + py%) / 2), tlp$(fill%), 2
+ END IF
+ ELSEIF inbox% = 2 THEN
+ obj%(nobj%, 6) = fill%
+ LINE (INT(xx(nobj%, 0)), INT(yy(nobj%, 0)))-(INT(xx(nobj%, 1)), INT(yy(nobj%, 1))), 0, BF
+ D.Lines INT(xx(nobj%, 0)), INT(yy(nobj%, 0)), INT(xx(nobj%, 1)), INT(yy(nobj%, 1)), 7, 2, obj%(nobj%, 4), 0, obj%(nobj%, 6), 0
+ END IF
+END IF
+seljob% = 0
+KEY(1) ON
+GOTO f.end
+' curves / copy
+f.2:
+KEY(2) OFF
+IF kswitch% = 1 AND func% = 0 THEN
+ seljob% = 2
+ linesel% = 0
+ G.Curve 2, 0
+ seljob% = 0
+ELSEIF kswitch% = 1 AND func% = 1 THEN
+ seljob% = 2
+ linesel% = 1
+ MoveObj 1
+ seljob% = 0
+ELSE
+ chartype% = chartype% + 1: IF chartype% > UBOUND(chartype$) THEN chartype% = 0
+ COLOR 10: LOCATE line1% + 1, 10: PRINT chartype$(chartype%); : COLOR 7
+END IF
+KEY(2) ON
+GOTO f.end
+' circle+ellipse/ symmetric copy
+f.3:
+KEY(3) OFF
+IF kswitch% = 1 AND func% = 0 THEN
+ seljob% = 3
+ linesel% = 0
+ G.Crcl.Ellps
+ seljob% = 0
+ELSEIF kswitch% = 1 AND func% = 1 THEN
+ seljob% = 3
+ linesel% = 1
+ CopySymm
+ seljob% = 0
+ELSE 'Just added
+ SELECT CASE charpt%
+ CASE 10
+ charpt% = 12
+ CASE 12
+ charpt% = 10
+ END SELECT
+ COLOR 10: LOCATE line1% + 1, 17: PRINT charpt%;
+ LOCATE line1% + 1, 20: PRINT "pt."; : COLOR 7
+END IF
+KEY(3) ON
+GOTO f.end
+' arc/ rotate
+f.4:
+seljob% = 4
+IF func% = 0 THEN
+ linesel% = 0
+ G.Arc
+ELSEIF func% = 1 THEN
+ linesel% = 1
+ Rotate
+ELSE
+ COLOR 7
+ GOSUB widewindow
+END IF
+seljob% = 0
+GOTO f.end
+' box/ edit
+f.5:
+seljob% = 5
+IF func% = 0 THEN
+ linesel% = 0
+ G.Box
+ELSEIF func% = 1 THEN
+ linesel% = 1
+ EditObject
+ELSE
+ GOSUB stext
+ SELECT CASE wtext%
+ CASE 0
+ COLOR 3: LOCATE line1% + 1, 31: PRINT "T_Hide"; : COLOR 7
+ CASE 1
+ COLOR 3: LOCATE line1% + 1, 31: PRINT "T_Show"; : COLOR 7
+ END SELECT
+END IF
+seljob% = 0
+GOTO f.end
+' polygon/ cut
+f.6:
+seljob% = 6
+IF func% = 0 THEN
+ linesel% = 0
+ G.Curve 1, 1
+ELSEIF func% = 1 THEN
+ linesel% = 1
+ DispCut
+ELSE
+ CL.R.edraw 0, 0
+END IF
+seljob% = 0
+GOTO f.end
+' closed curve/ kill
+f.7:
+seljob% = 7
+IF func% = 0 THEN
+ linesel% = 0
+ G.Curve 2, 1
+ELSEIF func% = 1 THEN
+ linesel% = 1
+ KillObject
+ELSE
+ COLOR 7
+ GOSUB clreset
+END IF
+seljob% = 0
+GOTO f.end
+' arrow/ line type
+f.8:
+IF kswitch% = 1 AND func% = 0 THEN
+ seljob% = 8
+ KEY(8) OFF
+ linesel% = 0
+ G.Arrows
+ seljob% = 0
+ KEY(8) ON
+ GOTO f.end
+ELSE
+ ltype% = ltype% + 1: IF ltype% > UBOUND(ltp$) THEN ltype% = 0
+ kky$(18) = ltp$(ltype%)
+ COLOR 10: LOCATE line1%, 61: PRINT kky$(18); : COLOR 7
+ RETURN
+END IF
+' strings/ thickness
+f.9:
+IF kswitch% = 1 AND func% = 0 THEN
+ seljob% = 9
+ KEY(9) OFF
+ linesel% = 0
+ G.Char
+ seljob% = 0
+ KEY(9) ON
+ GOTO f.end
+ELSE
+ thick% = thick% + 1: IF thick% > UBOUND(lth$) THEN thick% = 0
+ kky$(19) = lth$(thick%)
+ COLOR 10: LOCATE line1%, 68: PRINT kky$(19); : COLOR 7
+ RETURN
+END IF
+' file operations/ pitch
+f.10:
+IF kswitch% = 1 AND func% = 0 THEN
+ IO.File
+ GOTO f.end
+ELSE
+ SELECT CASE s%
+
+ CASE 1
+ s% = 4
+ kky$(20) = "Pitch4"
+ CASE 4
+ s% = 8
+ kky$(20) = "Pitch8"
+ CASE 8
+ s% = 1
+ kky$(20) = "Pitch1"
+ END SELECT
+
+ COLOR 10: LOCATE line1%, 75: PRINT kky$(20); : COLOR 7
+ RETURN
+END IF
+'
+f.end: pxold% = px%: pyold% = py%
+RETURN
+
+somethingwrong:
+CLOSE : OPEN "$panic$.qfg" FOR OUTPUT AS #1
+wrong% = 1
+CLS 0
+IO.Save 3: CLOSE
+wrong% = 0
+COLOR 14: PRINT : PRINT
+PRINT TAB(10); CHR$(7); "Ummm... Something wrong happened..."; CHR$(7)
+COLOR 7: PRINT : PRINT TAB(10); "Error code is #"; ERR
+SELECT CASE ERR
+ CASE 7
+ PRINT : PRINT TAB(10); "Out of memory. Free some more conventional memory"
+ CASE 9
+ PRINT : PRINT TAB(10); "A subscript is out of range"
+ CASE 52
+ PRINT : PRINT TAB(10); "Illegal DOS filename"
+ CASE 64
+ PRINT : PRINT TAB(10); "Illegal DOS filename"
+
+END SELECT
+PRINT : PRINT TAB(10); "Objects are saved into '$panic$.qfg'"
+PRINT : PRINT
+SLEEP 3
+GOSUB quit1: KEY ON: END
+
+' data
+DATA 88,00,00,00,88,00,00,00
+DATA CC,00,33,00,CC,00,33,00,CC,33,CC,33,CC,33,CC,33
+'--------------------------------------------------------------------------
+tex.pitch:
+'set by \wd and \ht of \box of each character; 7/24/1992
+' roman 10pt
+DATA 333,278,500,833,500,833,778,250,389,389,500,778,167,778,278,500
+DATA 500,500,500,500,500,500,500,500,500,500,278,278,778,778,778,472
+DATA 778,750,708,722,764,681,653,785,750,386,514,778,625,917,750,778
+DATA 681,778,736,556,722,750,750,1028,750,750,611,278,333,278,525,360
+DATA 333,500,556,444,556,444,292,500,556,278,306,528,278,833,556,525
+DATA 556,528,392,394,389,556,528,722,528,528,444,500,278,500,525
+' bold 10pt
+DATA 383,350,603,958,575,958,894,301,447,447,575,894,192,778,319,575
+DATA 575,575,575,575,575,575,575,575,575,575,319,319,778,894,778,543
+DATA 894,869,818,831,882,756,724,904,900,465,594,901,692,1092,900,864
+DATA 786,864,862,639,800,885,869,1189,869,869,703,319,383,319,525,414
+DATA 383,559,639,511,639,527,335,575,639,319,351,607,319,958,639,604
+DATA 639,607,474,454,447,639,607,831,607,607,511,500,278,500,525
+' italic 10pt
+DATA 358,307,514,818,500,818,767,257,409,409,511,767,170,778,307,511
+DATA 511,511,511,511,511,511,511,511,511,511,307,307,778,767,778,511
+DATA 767,743,704,716,755,678,653,774,743,386,525,769,627,897,743,767
+DATA 678,767,729,562,716,743,743,999,743,743,613,307,358,307,525,368
+DATA 358,511,460,414,511,414,307,460,511,307,307,460,302,818,562,465
+DATA 511,460,422,409,332,537,460,664,464,486,409,500,278,500,525
+' bold-italic 10pt
+DATA 414,386,621,944,548,944,886,310,473,473,591,886,197,852,356,591
+DATA 591,591,591,591,591,591,591,591,591,591,356,356,852,886,852,591
+DATA 886,866,817,827,876,757,727,895,896,472,611,895,698,1073,896,855
+DATA 787,855,859,650,796,881,866,1160,866,866,709,356,414,356,575,426
+DATA 414,591,532,479,591,479,378,532,591,356,356,532,350,944,650,538
+DATA 591,532,502,487,385,621,532,768,561,562,491,548,304,548,575
+'
+
+REM $STATIC
+SUB Chr.Input (aci$)
+' ----- character input -----
+' allow to use left/right arrows, back space and delete
+' presumably all other char's are visible and no longer than 2 lines
+aci$ = RTRIM$(aci$)
+lciold% = POS(0): mciold% = CSRLIN: cci% = LEN(aci$) + 1
+LOCATE mciold%, lciold%, 1, 14, 15
+DO
+ LOCATE mciold%, lciold%: PRINT SPACE$(LEN(aci$) + 4);
+ length% = LEN(aci$)
+ LOCATE mciold%, lciold%: PRINT aci$;
+' LOCATE , , 1, 0, 7
+ mci% = mciold%
+ kci% = lciold% - 1
+ IF cci% = length% + 1 THEN kci% = kci% + 1
+ FOR ici% = 1 TO cci%
+ kkci% = LEN(MID$(aci$, ici%, 1))
+ IF kkci% = 2 AND kci% = 79 THEN kci% = kci% + 1
+ kci% = kci% + kkci%
+ NEXT ici%
+ IF kci% > 80 THEN kci% = kci% - 80: mci% = mci% + 1
+ IF cci% <> length% + 1 AND LEN(MID$(aci$, cci%, 1)) = 2 THEN kci% = kci% - 1
+ LOCATE mci%, kci%
+ DO: cci$ = INKEY$: LOOP WHILE cci$ = ""
+
+ SELECT CASE cci$
+ CASE CHR$(&H8) ' back-space
+ IF cci% <> 1 THEN
+ aci$ = MID$(aci$, 1, cci% - 2) + MID$(aci$, cci%)
+ cci% = cci% - 1
+ END IF
+ CASE CHR$(&H0) + CHR$(&H4B)' left-arrow
+ IF cci% <> 1 THEN
+ cci% = cci% - 1
+ END IF
+ CASE CHR$(&H0) + CHR$(&H53)' delete
+ IF length% > 0 THEN
+ aci$ = MID$(aci$, 1, cci% - 1) + MID$(aci$, cci% + 1)
+ END IF
+ CASE CHR$(&H0) + CHR$(&H4D)' right-arrow
+ IF cci% < length% + 1 THEN
+ cci% = cci% + 1
+ END IF
+ CASE IS >= CHR$(&H20) ' visible characters
+ IF (length% < nodemax% - 1) THEN
+ aci$ = MID$(aci$, 1, cci% - 1) + cci$ + MID$(aci$, cci%)
+ cci% = cci% + 1
+ END IF
+ END SELECT
+toolong:
+LOOP UNTIL cci$ = CHR$(&HD)
+LOCATE , , 0, 0, 15
+'
+END SUB
+
+SUB CursorDisplay (ppxx%, ppyy%)
+' cursor mark on and off
+xyshift% = INT(5! * wndwxy(wndwfctr%))
+PUT (ppxx% - xyshift%, ppyy% - xyshift%), curs%, XOR
+IF mouswitch% THEN MouseLocate ppyy%, ppxx% '<=== when Mouse is used
+aa = ppxx% * .25: bb = ppyy% * .25
+ad = aa - INT(aa) + .001: bd = bb - INT(bb) + .001
+aa = INT(aa): bb = INT(bb)
+a$ = "<" + RIGHT$(" " + STR$(aa), 3) + ":"
+a$ = a$ + RIGHT$(" " + STR$(bb), 3) + ">"
+b$ = "(" + MID$(STR$(ad), 2, 3) + ":" + MID$(STR$(bd), 2, 3) + ")"
+COLOR 7
+LOCATE line2%, 38: PRINT a$;
+LOCATE line1%, 38: PRINT b$;
+PUT (ppxx% - 2, 3 + pyo%), markx%, XOR
+PUT (3 + pxo%, ppyy% - 2), marky%, XOR
+'
+END SUB
+
+SUB CursorMotion (keyin%)
+' cursor motion with cursor mark on and off
+pxold% = px%: pyold% = py%
+keyin% = KeyIsTyped%
+IF job% <> 0 AND pyold% > pymax2% THEN
+pyold% = pymax2%
+CursorDisplay pxold%, pyold%
+END IF
+CursorDisplay pxold%, pyold%
+CursorDisplay px%, py%
+'
+END SUB
+
+SUB KeyDisplay
+' function-key instruction displayed
+COLOR 3
+FOR i% = 1 TO 5: LOCATE line2%, i% * 7 - 4: PRINT kky$(i%);
+LOCATE line1%, i% * 7 - 4: PRINT kky$(i% + 10); : NEXT i%
+SELECT CASE wtext%
+ CASE 0
+ LOCATE line1% + 1, 31: PRINT "T_Hide";
+ CASE 1
+ LOCATE line1% + 1, 31: PRINT "T_Show";
+END SELECT
+
+LOCATE line1% + 1, 24: PRINT " Zoom";
+LOCATE line1% + 1, 47: PRINT "Redraw";
+LOCATE line1% + 1, 55: PRINT "Reset";
+
+
+COLOR 14: LOCATE line1% + 1, 64: PRINT "[CTRL+h=HELP]";
+'COLOR 12: LOCATE line1% + 1, 64: PRINT "[QFIG ver. 1.1a]";
+
+COLOR 10
+LOCATE line1% + 1, 7: PRINT fill%;
+LOCATE line1% + 1, 3: PRINT "Fil-P";
+LOCATE line1% + 1, 10: PRINT chartype$(chartype%);
+LOCATE line1% + 1, 17: PRINT charpt%;
+LOCATE line1% + 1, 20: PRINT "pt."; : COLOR 3
+
+
+FOR i% = 6 TO 7: LOCATE line2%, 5 + i% * 7: PRINT kky$(i%);
+LOCATE line1%, 5 + i% * 7: PRINT kky$(i% + 10); : NEXT i%
+FOR i% = 8 TO 10: COLOR 3: LOCATE line2%, 5 + i% * 7: PRINT kky$(i%);
+COLOR 10: LOCATE line1%, 5 + i% * 7: PRINT kky$(i% + 10); : NEXT i%: COLOR 7
+LOCATE line2% + func%, 2: COLOR 6: PRINT "@"; : COLOR 7
+
+COLOR 6
+LOCATE line3%, 20: PRINT "L-but(SPC)|R-but(RET)";
+'LOCATE line3%, 19: PRINT "L-but=SPC/y|R-but=RET/n";
+LOCATE line3%, 60: PRINT "L+R (DEL)"; : COLOR 7
+
+CursorDisplay px%, py%
+'
+END SUB
+
+FUNCTION KeyIsTouched$
+'
+IF mouswitch% THEN MousePoll row%, col%, lbut%, rbut% '<=== when Mouse is used
+KeyIsTouched$ = INKEY$
+'
+END FUNCTION
+
+FUNCTION KeyIsTyped%
+' which key has been typed so far
+' 1:motion 2:space or left button
+' 3:return or right button 4:delete or both button (sensitive)
+keyin% = 0
+DO
+ DO
+ IF Help% = 1 AND mouswitch% <> 0 THEN
+ keyin% = 1: Help% = 0
+ EXIT DO
+ END IF
+ q$ = KeyIsTouched$
+ LOOP UNTIL q$ <> "" OR row% <> py% OR col% <> px% OR lbut% <> 0 OR rbut% <> 0
+ SELECT CASE q$
+ CASE CHR$(&H0) + CHR$(UP)
+ IF py% - s% >= pymin% THEN py% = py% - s%: keyin% = 1
+ CASE CHR$(&H0) + CHR$(DOWN)
+ IF py% + s% <= pymax% THEN py% = py% + s%: keyin% = 1
+ CASE CHR$(&H0) + CHR$(LEFT)
+ IF px% - s% >= pxmin% THEN px% = px% - s%: keyin% = 1
+ CASE CHR$(&H0) + CHR$(RIGHT)
+ IF px% + s% <= pxmax% THEN px% = px% + s%: keyin% = 1
+ CASE CHR$(SP)
+ keyin% = 2
+ CASE CHR$(CR)
+ keyin% = 3
+ CASE CHR$(&H0) + CHR$(DEL)
+ keyin% = 4
+ CASE CHR$(&H0) + CHR$(&H49) 'CTRL + PGUP
+ keyin% = 5
+ CASE CHR$(&H0) + CHR$(&H51) 'CTRL + PGDN
+ keyin% = 6
+ CASE CHR$(&H0) + CHR$(&H73) 'CTRL + LEFT
+ keyin% = 7
+ CASE CHR$(&H0) + CHR$(&H74) 'CTRL + RIGHT
+ keyin% = 8
+ CASE ""
+ IF mouswitch% THEN
+ IF lbut% <> 0 THEN
+ keyin% = 2
+ DO
+ MousePoll row%, col%, lbut%, rbut% '<=== when Mouse is used
+ LOOP UNTIL lbut% = 0 OR rbut% <> 0
+ IF rbut% <> 0 THEN keyin% = 4
+ END IF
+ IF rbut% <> 0 THEN
+ keyin% = 3
+ DO
+ MousePoll row%, col%, lbut%, rbut% '<=== when Mouse is used
+ LOOP UNTIL rbut% = 0 OR lbut% <> 0
+ IF lbut% <> 0 THEN keyin% = 4
+ END IF
+ IF row% - py% THEN
+ IF row% > pymax% THEN row% = pymax%
+ IF row% < pymin% THEN row% = pymin%
+ py% = row%
+ IF keyin% = 0 THEN keyin% = 1
+ END IF
+ IF col% - px% THEN
+ IF col% > pxmax% THEN col% = pxmax%
+ IF col% < pxmin% THEN col% = pxmin%
+ px% = col%
+ IF keyin% = 0 THEN keyin% = 1
+ END IF
+ IF keyin% = 4 THEN
+ DO
+ MousePoll row%, col%, lbut%, rbut% '<=== when Mouse is used
+ LOOP UNTIL rbut% = 0 AND lbut% = 0
+ END IF
+ END IF
+ END SELECT
+ IF (job% <> 0) AND py% > pymax2% THEN py% = pymax2%
+ IF (py% + texth% - 5) > pymax2% AND job% = 5 THEN py% = pymax2% - texth% + 5
+IF Help% = 1 THEN keyin% = 1
+IF ((keyin% > 4) AND (job% <> 0) AND (keyin% <> 9)) THEN keyin% = 0
+LOOP UNTIL keyin% <> 0
+KeyIsTyped% = keyin%
+Help% = 0
+'
+END FUNCTION
+
+SUB KeySwitch (ksw%)
+' key on/off switch
+kswitch% = ksw% '<-- global definition ?
+IF kswitch% = 1 THEN
+ KEY(1) ON: KEY(2) ON: KEY(3) ON: KEY(4) ON: KEY(5) ON: KEY(6) ON
+ KEY(7) ON: KEY(15) ON: KEY(16) ON: KEY(18) ON
+ KEY(20) ON: KEY(21) ON: KEY(22) ON: KEY(23) ON: KEY(24) ON
+ELSE
+' KEY(3) OFF:
+ KEY(4) OFF: KEY(5) OFF: KEY(6) OFF
+ KEY(7) OFF: KEY(15) OFF: KEY(16) OFF: KEY(18) OFF
+ KEY(20) OFF: KEY(21) OFF: KEY(22) OFF: KEY(23) OFF: KEY(24) OFF
+END IF
+'
+END SUB
+
+SUB Preparation
+' preparations
+ltp%(0) = &HFFFF: ltp%(1) = &H8888: ltp%(2) = &HC3C3: ltp%(3) = &HA0A0
+ltp$(0) = " Solid": ltp$(1) = "Dotted"
+ltp$(2) = " Dash ": ltp$(3) = "D-Dash"
+
+lth$(0) = " Thin ": lth$(1) = "Thick1": lth$(2) = "Thick2"
+
+FOR i% = 1 TO 3: tlp$(i%) = ""
+FOR j% = 1 TO 8: READ tt$: tt = VAL("&H" + tt$)
+FOR k% = 1 TO 4: tlp$(i%) = tlp$(i%) + CHR$(tt): NEXT k%, j%, i%
+
+nocheat% = 0: IF INSTR(COMMAND$, "/NC") <> 0 THEN nocheat% = 1
+
+nofile% = 1: IF INSTR(COMMAND$, "/F") <> 0 THEN nofile% = 0
+
+'nofile% = 0
+wspec% = 0: IF INSTR(COMMAND$, "/S") <> 0 THEN wspec% = 1
+
+ega% = 0: IF INSTR(COMMAND$, "/E") <> 0 THEN ega% = 1
+'chartype$(0) = "Roman ": chartype$(1) = "Bold "
+'chartype$(2) = "Italic ": chartype$(3) = "Bold Italic "
+
+chartype$(0) = " Roman": chartype$(1) = " Bold "
+chartype$(2) = "Italic": chartype$(3) = "Bld-It"
+
+'original KEEP
+
+chartex$(0, 0) = "\xpt\rm ": chartex$(0, 1) = "\xpt\bf "
+chartex$(0, 2) = "\xpt\it ": chartex$(0, 3) = "\xpt\FonttenBI "
+chartex$(1, 0) = "\xiipt\rm ": chartex$(1, 1) = "\xiipt\bf "
+chartex$(1, 2) = "\xiipt\it ": chartex$(1, 3) = "\xiipt\FonttwlBI "
+charjtex$(0, 0) = "\tendm ": charjtex$(0, 1) = "\tendg "
+charjtex$(1, 0) = "\twelvedm ": charjtex$(1, 1) = "\twelvedg "
+
+'original end
+
+chartype% = 0: charpt% = 12
+chattr%(0, 0) = 7: chattr%(0, 1) = 0
+chattr%(1, 0) = 11: chattr%(1, 1) = 6
+chattr%(2, 0) = 7: chattr%(2, 1) = 11
+chattr%(3, 0) = 11: chattr%(3, 1) = 10
+
+' set by \wd \ht of \hbox at 10pt; 7/24/1992
+jpitch% = 915: jheight(0) = .77088: jheight(1) = .77088
+' set by \ht of height of "A" in each font at 10pt; 7/24/1992
+eheight(0) = .68333: eheight(1) = .68611
+eheight(2) = .68333: eheight(3) = .68611
+'
+RESTORE tex.pitch
+FOR i% = 0 TO 94: READ epitch%(0, i%): NEXT i%
+FOR i% = 0 TO 94: READ epitch%(1, i%): NEXT i%
+FOR i% = 0 TO 94: READ epitch%(2, i%): NEXT i%
+FOR i% = 0 TO 94: READ epitch%(3, i%): NEXT i%
+' scriptsize up/down motion in dot (* point * 0.25 mm)
+scrpt(0) = 0!: scrpt(1) = .5: scrpt(2) = -.2
+
+Ins(0).L = SPACE$(15): Ins(0).R = SPACE$(15): Ins(0).D = SPACE$(15)
+Ins(1).L = " mid-pts set": Ins(1).R = "last pt. set ": Ins(1).D = "cancel"
+Ins(2).L = "circle cnt/rads": Ins(2).R = "ellps diag.pts.": Ins(2).D = "cancel"
+Ins(3).L = " end points": Ins(3).R = "on the arc ": Ins(3).D = "cancel"
+Ins(4).L = " diagonal pts.": Ins(4).R = " diagonal pts. ": Ins(4).D = "cancel"
+Ins(5).L = " position": Ins(5).R = " position": Ins(5).D = "cancel"
+Ins(6).L = " <--- / --->": Ins(6).R = "<-----> ": Ins(6).D = "cancel"
+Ins(7).L = " object select": Ins(7).R = " region select": Ins(7).D = "cancel"
+Ins(8).L = " object select": Ins(8).R = " region select ": Ins(8).D = "cancel"
+Ins(9).L = " displace node": Ins(9).R = "cut node ": Ins(9).D = "cancel"
+Ins(10).L = " object select": Ins(10).R = " region select ": Ins(10).D = "cancel"
+Ins(11).L = "wrt hrzntl axis": Ins(11).R = "wrt vrtcl axius": Ins(11).D = "cancel"
+Ins(12).L = " rotate": Ins(12).R = "set(angle/obj) ": Ins(12).D = "cancel"
+Ins(13).L = " object select": Ins(13).R = " region select": Ins(13).D = "cancel"
+
+s% = 4: s1% = 1: px% = 320: py% = 200: mouswitch% = 0
+pxo% = 0: pyo% = 0: inbox% = 0
+func% = 0: func1% = 1: job% = 0: seljob% = 0: Help% = 0
+nobj% = 0: ltype% = 0: thick% = 0: fill% = 0
+xmin% = REGIONXMAX: xmax% = 0: ymin% = REGIONYMAX: ymax% = 0
+pi = 4! * ATN(1!): group% = 1: margin% = 7
+
+wndwfctr% = 0
+wndwxy(0) = 1!: wndwxy(1) = 1.3125: wndwxy(2) = 1.8: wndwxy(3) = 2.2
+IF ega% = 0 THEN
+ windowx%(0) = 639: windowy%(0) = 479: texth% = 16
+ scrtype% = 12: line1% = 29: line2% = 28: line3% = 27
+ELSE
+ windowx%(0) = 639: windowy%(0) = 349: texth% = 14
+ scrtype% = 9: line1% = 24: line2% = 23: line3% = 22
+END IF
+FOR i% = 1 TO 3: windowx%(i%) = INT(CSNG(windowx%(0) + 1) * wndwxy(i%) - 1)
+windowy%(i%) = INT(CSNG(windowy%(0) + 1) * wndwxy(i%) - 1): NEXT i%
+pxmin% = margin%: pxmax% = windowx%(0) - margin%
+pymin% = margin%: pymax% = windowy%(0) - margin%
+pymax2% = windowy%(0) - texth% * 4 - 5 - margin%
+winpy% = windowy%(0) - texth% * 4 - margin%
+' cursor marks
+SCREEN scrtype%
+LINE (320, 195)-STEP(0, 10): LINE (315, 200)-STEP(10, 0)
+GET (315, 195)-(325, 205), curs%: CLS
+LINE (318, 195)-(322, 195): LINE (317, 196)-(323, 196)
+LINE (317, 196)-(317, 197): LINE (323, 196)-(323, 197)
+LINE (318, 196)-(318, 198): LINE (322, 196)-(322, 198)
+LINE (320, 197)-(320, 200): LINE (319, 198)-(319, 200)
+LINE (321, 198)-(321, 200)
+LINE (315, 200)-(316, 200): LINE (324, 200)-(325, 200)
+LINE (317, 201)-(318, 201): LINE (322, 201)-(323, 201)
+LINE (318, 202)-(322, 202)
+LINE (315, 204)-(316, 204): LINE (324, 204)-(325, 204)
+LINE (317, 203)-(318, 203): LINE (322, 203)-(323, 203)
+GET (315, 195)-(325, 205), curs1%: CLS 'cursor mark for KILL
+CIRCLE (323, 197), 2: CIRCLE (323, 203), 2
+LINE (315, 196)-(323, 201): LINE (315, 204)-(323, 199)
+LINE (316, 196)-(324, 201): LINE (316, 204)-(324, 199)
+GET (315, 195)-(325, 205), curs2%: CLS 'cursor mark for CUT
+
+CIRCLE (3, 3), 3, 10: GET (0, 0)-(6, 6), mark%: CLS
+LINE (0, 0)-(6, 6), 10, BF: CIRCLE (3, 3), 3, 0
+GET (0, 0)-(6, 6), markg%: CLS
+
+LINE (2, 0)-(4, 4), 6: LINE -(0, 4), 6: LINE -(2, 0), 6: PAINT (2, 3), 6
+GET (0, 0)-(4, 4), markx%: CLS
+LINE (0, 2)-(4, 0), 6: LINE -(4, 4), 6: LINE -(0, 2), 6: PAINT (3, 2), 6
+GET (0, 0)-(4, 4), marky%: CLS
+
+kky$(1) = " Line ": kky$(2) = " Curve": kky$(3) = "CrcEll"
+kky$(4) = " Arc ": kky$(5) = " Box ": kky$(6) = " Poly "
+kky$(7) = "Cl-Crv": kky$(8) = " Arrow"
+kky$(9) = "String": kky$(10) = " File "
+kky$(11) = " Move ": kky$(12) = " Copy ": kky$(13) = "Sym.cp"
+kky$(14) = "Rotate": kky$(15) = " Edit ": kky$(16) = "DspCut"
+kky$(17) = " Kill ": kky$(18) = " Solid"
+kky$(19) = " Thin ": kky$(20) = "Pitch4"
+kky$(21) = " 12pt.": kky$(21) = "Roman "
+altpitch$ = "Pitch1"
+
+IF nofile% = 1 THEN mpath% = 0: GOTO inputusersettings
+' input user-definable data settings
+path0$ = ".;" + ENVIRON$("PATH")
+DO
+ mpath% = INSTR(path0$, ";")
+ IF mpath% = 0 THEN
+ path$ = path0$
+ path0$ = ""
+ ELSE
+ path$ = LEFT$(path0$, mpath% - 1)
+ path0$ = MID$(path0$, mpath% + 1)
+ END IF
+ IF path$ <> "" AND RIGHT$(path$, 1) <> "\" THEN path$ = path$ + "\"
+ ifile$ = path$ + "qfig_set.dat"
+ OPEN ifile$ FOR RANDOM AS #1
+ IF LOF(1) = 0 THEN
+ CLOSE #1
+ KILL ifile$
+ ELSE
+ mpath% = -1
+ EXIT DO
+ END IF
+LOOP UNTIL mpath% = 0
+
+inputusersettings:
+IF mpath% = 0 THEN
+' default
+ arrowhead = 8! 'arrow = arrowhead + darrowhead * obj%(n%, 4)
+ darrowhead = 1.5
+ arrowdirect = pi / 9! 'arrow is directed to \pm arrowdirect
+ arcarrowd = pi / 30! 'correction of inward direction on the arc
+ dpattern$(1) = "6pt, 3pt" 'dashpattern on PiCTeX
+ dpattern$(2) = "10pt, 3pt, 2pt, 3pt"
+ dpattern$(3) = "10pt, 3pt, 2pt, 3pt, 2pt, 3pt"
+ filler%(0) = 0 'filler color on N-Graph
+ filler%(1) = 2
+ filler%(2) = 6
+ filler%(3) = 1
+ eepicpattern$(1) = "\dottedline{3}"
+ eepicpattern$(2) = "\dashline[50]{10}"
+ eepicpattern$(3) = "\dashline[50]{10}[2]"
+ tpicshade$(1) = "[0.1]"
+ tpicshade$(2) = "[0.4]"
+ tpicshade$(3) = "[0.7]"
+ hscroll% = 200
+ vscroll% = 120
+ interpolcurve% = 10
+ interpolang% = 36 '5 degree
+ELSE
+ CLOSE #1
+ OPEN ifile$ FOR INPUT AS #1
+ arrowhead = VAL(Usetdata$)
+ darrowhead = VAL(Usetdata$)
+ arrowdirect = pi / VAL(Usetdata$)
+ arcarrowd = pi / VAL(Usetdata$)
+ dpattern$(1) = Usetdata$
+ dpattern$(2) = Usetdata$
+ dpattern$(3) = Usetdata$
+ filler%(0) = VAL(Usetdata$)
+ filler%(1) = VAL(Usetdata$)
+ filler%(2) = VAL(Usetdata$)
+ filler%(3) = VAL(Usetdata$)
+ eepicpattern$(1) = Usetdata$
+ eepicpattern$(2) = Usetdata$
+ eepicpattern$(3) = Usetdata$
+ tpicshade$(1) = Usetdata$
+ tpicshade$(2) = Usetdata$
+ tpicshade$(3) = Usetdata$
+ hscroll% = VAL(Usetdata$)
+ IF hscroll% <= 0 OR hscroll% > 200 THEN hscroll% = 200
+ vscroll% = VAL(Usetdata$)
+ IF vscroll% <= 0 OR vscroll% > 120 THEN vscroll% = 120
+ interpolcurve% = VAL(Usetdata$)
+ interpolang% = 180! / CSNG(VAL(Usetdata$))
+
+ chartex$(0, 0) = Usetdata$ + " "
+ chartex$(0, 1) = Usetdata$ + " "
+ chartex$(0, 2) = Usetdata$ + " "
+ chartex$(0, 3) = Usetdata$ + " "
+ chartex$(1, 0) = Usetdata$ + " "
+ chartex$(1, 1) = Usetdata$ + " "
+ chartex$(1, 2) = Usetdata$ + " "
+ chartex$(1, 3) = Usetdata$ + " "
+
+ CLOSE #1
+END IF
+'
+tpicshade% = 1
+'
+iomessages$(1) = "Load picture data from file [.qfg]"
+iomessages$(2) = "Merge picture data from file [.qfg]"
+iomessages$(3) = "Save this picture into file [.qfg] only"
+iomessages$(4) = "Save picture in [.qfg] & 'PiCTeX' code in [.tex]"
+iomessages$(5) = "Save picture in [.qfg] & 'eepic' code in [.tex]"
+iomessages$(6) = "Save picture in [.qfg] & 'eepicemu' code in [.tex]"
+iomessages$(7) = "Quit (Exit Program)"
+'
+END SUB
+
+SUB SetInst (ninstr%)
+' set instruction of left/right buttons (space/return)
+COLOR 7
+IF ninstr% > 0 THEN SWAP Ins(0), Ins(ninstr%)
+LOCATE line3%, 4: PRINT Ins(0).L; : LOCATE line3%, 42: PRINT Ins(0).R;
+LOCATE line3%, 70: PRINT Ins(0).D;
+'
+END SUB
+
+FUNCTION Usetdata$
+' get a line and strip comment
+DO
+LINE INPUT #1, a$
+a$ = LEFT$(a$, INSTR(a$, ";") - 1)
+LOOP UNTIL a$ <> ""
+i% = INSTR(a$, CHR$(9))
+DO UNTIL i% = 0
+ a$ = LEFT$(a$, i% - 1)
+ i% = INSTR(a$, CHR$(9))
+LOOP
+Usetdata$ = LTRIM$(RTRIM$(a$))
+'
+END FUNCTION
+