100 REM 99-GSS Ver 25.A 101 REM Written by Michael Gibson 102 REM Lic with GPL3 103 REM For TI-99 with 32K exp and Ext BASIC 105 REM CORE DEF 110 CALL CLEAR 120 call char(95,"FF0000FF000000FF") 125 call char(124,"8080808080808080") 129 REM 30 Rows by 20 Columns 130 DIM MODEL(30,20),ROW$(30),COL$(20) 140 DIM OPLIST$(8) 141 DIM CALC(15,4) 142 LET COL$(1)=" ":: LET ROW$(1)=" " :: REM blank first lines 143 LET MAXROW=30 :: REM 30 Rows by 20 Columns 144 LET MAXCOL=20 :: REM 30 Rows by 20 Columns 145 LET NLD=14 :: REM Number of Lines to Display 146 LET MAXCALC=15 :: LET CSVS=0 150 REM INITIALIZE 151 CALL CLEAR:: PRINT "Initializing GSS please wait" 152 DATA 8,+,-,*,/,%,%+,%-,%D 153 RESTORE 152 :: READ NOPR :: FOR I=1 TO NOPR :: READ OPLIST$(I):: NEXT I 154 FOR I=0 TO MAXROW-1 :: ROW$(I)="R"&STR$(I):: NEXT I 155 FOR I=0 TO MAXCOL-1 :: COL$(I)="C"&STR$(I):: NEXT I 156 ROW$(MAXROW) = "COL TOTAL" :: COL$(MAXCOL) = "ROW TOTAL" 157 FOR I=0 TO MAXROW :: FOR J=0 TO MAXCOL :: MODEL(I,J)=0 :: NEXT J :: NEXT I 158 FOR I=0 TO MAXCALC :: FOR J=0 TO 4 :: CALC(I,J)=0 :: NEXT J :: NEXT I 160 REM MAIN MENU 162 CALL CLEAR 163 PRINT "_____________________" 165 PRINT "| 99-GSS Main Menu |" 167 PRINT "_____________________" 168 PRINT "| |" 170 PRINT "|1 Define the model |" 180 PRINT "|2 Run the model |" 190 PRINT "|3 Load model & data |" 200 PRINT "|4 Save model & data |" 205 PRINT "|5 Save data to CSV |" 207 PRINT "| |" 210 PRINT "|0 Exit 99-GSS |" 211 PRINT "| |" 212 print "_____________________" 215 FOR I=1 TO 3::PRINT " "::NEXT I 220 ACCEPT VALIDATE("012345"):FCODE 250 IF FCODE=0 THEN 270 260 ON FCODE GOSUB 310,1400,2860,2950,4000::GOTO 162 270 CALL CLEAR::END 300 REM Start SUB Tasks 310 REM DEFINE MODEL 320 CALL CLEAR 330 PRINT "___________________________" 340 PRINT "|1 Give row names |" 350 PRINT "|2 Give column names |" 360 PRINT "|3 State calculation rules |" 370 PRINT "| |" 380 PRINT "|0 To return to Main Menu |" 390 PRINT "| |" 400 print "___________________________ " 410 REM Validate input 420 ACCEPT VALIDATE("0123"):FCODE 440 IF FCODE=0 THEN 460 450 ON FCODE GOSUB 470,580,690 :: GOTO 380 460 RETURN 470 REM ROW NAME 480 Call clear::DISPLAY AT(1,8):"Give Row Names" 490 DISPLAY AT(5,1):"ROW name? Type END when done" 491 DISPLAY AT(8,1):"-[ ]" 492 DISPLAY AT(23,1):"Hit ENTER to use information shown." 500 FOR I=0 TO MAXROW-1 510 DISPLAY AT(3,l):"Row ";I;" of ";MAXROW 520 DISPLAY AT(8,3)SIZE(-10):ROW$(I) 521 ACCEPT AT(8,3)SIZE(-10):NAME$ 522 IF NAME$="" THEN 521 540 IF NAME$="END" OR NAME$="end" THEN 570 550 ROW$(I)=NAME$ 560 NEXT I 570 RETURN 580 REM COL NAME 590 call clear::DISPLAY AT(1,8):"Give Column Names" 600 DISPLAY AT(5,1):"COL name? Type END when done" 601 DISPLAY AT(8,1):"-[ ]" 603 DISPLAY AT(23,1):"Hit ENTER to use information shown." 610 FOR I=0 TO MAXCOL-1 620 DISPLAY AT(3,l):"Column ";I;" of ";MAXCOL 630 DISPLAY AT(8,3)SIZE(-10):COL$(I) 631 ACCEPT AT(8,3)SIZE(-10):NAME$ 632 IF NAME$="" THEN 631 650 IF NAME$="END" OR NAME$="end" THEN 680 660 COL$(I)=NAME$ 670 NEXT I 680 RETURN 690 REM CALCULATION RULES 695 CALL CLEAR 700 DISPLAY AT(1,2):"Calculation Rules - Names must be set" 710 DISPLAY AT(7,l):"Row(R) or Col(C) or Quit(Q)?" 720 DISPLAY AT(8,3):"->" 730 DISPLAY AT(10,1):"1st row/column name R)estart" 740 DISPLAY AT(11,3):"->" 750 DISPLAY AT(13,1):"Calculation:" 760 DISPLAY AT(14,3):"->" 770 DISPLAY AT(16,1):"2nd row/column name" 780 DISPLAY AT(17,3):"->" 790 DISPLAY AT(19,1):"Answer row/column name" 800 DISPLAY AT(20,3):"->" 810 DISPLAY AT(23,1):"Calculations can be:" 820 DISPLAY AT(24,1):"+ - * / % %+ %- %D" 830 FOR K=0 TO MAXCALC 840 DISPLAY AT(4,1):"Step ";K;" of ";MAXCALC 850 IF CALC(K,0)=2 THEN 900 860 T$="R"::T1$=ROW$(CALC(K,1))::T2$=OPLIST$(CALC(K,2)) 870 T3$=ROW$(CALC(K,3)):: T4$=R0W$(CALC(K,4)) 880 GOTO 910 890 T$ = "C" :: T1$=COL$(CALC(K,1)) :: T2$=OPLIST$(CALC(K,2)) 900 T3$=COL$(CALC(K,3)):: T4$=C0L$(CALC(K,4) ) 910 DISPLAY AT(8,5)SIZE(1):T$ 920 DISPLAY AT(11,5)SIZE(10):T1$ 930 DISPLAY AT(14,5)SIZE(2):T2$ 940 DISPLAY AT(17,5)SIZE(10):T3$ 950 DISPLAY AT(20,5)SIZE(10):T4$ 960 ACCEPT AT(8,5)SIZE(-1)VALIDATE("RCQ")BEEP:T$ :: IF T$="" THEN 960 ELSE IF T$="Q" THEN 1140 970 IF T$="R" THEN CALC(K,0)=1 ELSE CALC(K,0)=2 980 ACCEPT AT(11,5)SIZE(-10)BEEP:NAME$ :: IF NAME$="R" THEN 690:: IF NAME$="" THEN 980 990 IF T$="R" THEN GOSUB 1250 ELSE GOSUB 1300 1000 IF N=-1 THEN 980 1010 CALC(K,1)=N 1020 ACCEPT AT(14,5)SIZE(-2)VALIDATE("+-*/%D")BEEP:NAME$ :: IF NAME$="" THEN 1020 1030 GOSUB 1350 :: IF N=-1 THEN 1020 1040 CALC(K,2)=N 1050 ACCEPT AT(17,5)SIZE(-10)BEEP:NAME$ :: IF NAME$="" THEN 1050 1060 IF T$="R" THEN GOSUB 1250 ELSE GOSUB 1300 1070 IF N=-1 THEN 1050 1080 CALC(K,3)=N 1090 ACCEPT AT(20,5)SIZE(-10)BEEP:NAME$ :: IF NAME$="" THEN 1090 1100 IF T$="R" THEN GOSUB 1250 ELSE GOSUB 1300 1110 IF N=-1 THEN 1090 1120 CALC(K,4)=N 1130 NEXT K :: GOTO 1150 1140 FOR J=0 TO 4 :: CALC(K,J)=0 :: NEXT J 1150 RETURN 1250 REM ROW # 1260 FOR I=0 TO MAXROW-1 1270 IF NAME$=ROW$(I)THEN N=I :: GOTO 1290 1280 NEXT I :: N=-1 1290 RETURN 1300 REM COL # 1310 FOR I=0 TO MAXCOL-1 1320 IF NAME$=COL$(I)THEN N=I :: GOTO 1340 1330 NEXT I :: N=-1 1340 RETURN 1350 REM OPERATOR # 1360 FOR I=1 TO NOPR 1370 IF NAME$=OPLIST$(I)THEN N=I :: GOTO 1390 1380 NEXT I :: N=-1 1390 RETURN 1400 REM RUN MODEL 1410 CALL CLEAR 1411 PRINT "_______________________" 1415 PRINT "1 Review or change data" 1420 PRINT "2 Do the calculations" 1430 PRINT "3 Print the results" 1440 PRINT "4 Save data for plotting" 1450 PRINT " "::PRINT "0 To return"::print " " 1460 ACCEPT VALIDATE("01234"):FCODE 1470 IF FCODE=0 THEN 1490 1480 ON FCODE GOSUB 1500,1840,2160,2570 :: GOTO 1450 1490 RETURN 1500 REM DISPLAY values and/or CHANGE 1505 CALL CLEAR 1510 DISPLAY AT(1,4):"Review or Chanqe Data" 1520 IMAGE "######.## ######.##" 1530 DISPLAY AT(22,1):"S,D Scroll columns" 1540 DISPLAY AT(23,1):"E,X Scroll rows" 1550 DISPLAY AT(24,1):"C Change data Q Quit view" 1560 RWB,CW=0 1570 REM WINDOW 1580 RW=RWB :: CT=CW+1 :: IF CT>MAXCOL THEN CT=1 1590 DISPLAY AT(3,9)SIZE(9):COL$(CW) 1600 DISPLAY AT(3,20)SIZE(9):COL$(CT) 1610 FOR I=5 TO 5+NLD-1 1620 DISPLAY AT(I,1)SIZE(7):ROW$(RW) 1630 DISPLAY AT(I,9):USING 1520:MODEL(RW,CW),MODEL(RW,CT) 1640 RW=RW+1 :: IF RW>MAXROW THEN 1660 1650 NEXT I 1660 FOR K=I+1 TO 19 :: DISPLAY AT(K,1):" " :: NEXT K 1670 REM POLL KBD 1680 CALL SOUND(100,440,4) 1690 CALL KEY(0,R,S):: IF S<>1 THEN 1690 ELSE R$=CHR$(R) 1700 IF R$="S" THEN CW=CW-1 :: IF CW<0 THEN CW=MAXCOL 1710 IF R$="D" THEN CW=CW+1 :: IF CW>MAXCOL THEN CW=0 1720 IF R$="E" THEN RWB=RWB-NLD :: IF RWB<0 THEN RWB=0 1730 IF R$="X" THEN RWB=RWB+NLD :: IF RWB>MAXROW THEN RWB=0 1740 IF R$="Q" THEN 1830 1750 IF R$<>"C" THEN 1570 1760 REM Input new values 1770 RW=RWB 1780 FOR I=5 TO 5+NLD-1 1790 ACCEPT AT(I,9)SIZE(9)VALIDATE(NUMERIC):N 1800 MODEL(RW,CW)=N 1810 RW=RW+1 :: IF RW>MAXROW THEN 1670 1820 NEXT I :: GOTO 1570 1830 RETURN 1840 REM DO CALC 1850 FOR I=0 TO MAXCALC 1860 IF CALC(I,0)=0 THEN 1950 1870 DISPLAY AT(24,1):"Working. Step ";I 1880 IF CALC(I,0)=2 THEN 1920 1890 R1=CALC(I,1)::N=CALC(I,2)::R2=CALC(I,3)::R3=CALC(I,4) 1900 FOR K=0 TO MAXCOL-1 :: C1,C2,C3=K :: GOSUB 2040 :: NEXT K 1910 GOTO 1940 1920 C1=CALC(I,1):: N=CALC(I,2):: C2=CALC(I,3 ):: C3=CALC(I,4) 1930 FOR K=0 TO MAXROW-1 :: R1,R2,R3=K :: GOSUB 2040 :: NEXT K 1940 NEXT I 1950 DISPLAY AT(24,1):"Row and column totals." 1960 FOR I=0 TO MAXROW :: T=0 :: FOR J=0 TO MAXCOL-1 1970 T=T+MODEL(I,J):: NEXT J 1980 MODEL(I,MAXCOL)=T :: NEXT I 1990 FOR I=0 TO MAXCOL :: T=0 :: FOR J=0 TO MAXROW-1 2000 T=T+MODEL(J,1):: NEXT J 2010 MODEL(MAXROW,I)=T :: NEXT I 2020 DISPLAY AT(24,1):" " 2030 RETURN 2040 REM CALC 2050 ON N GOTO 2060,2070,2080,2090,2110,2120,2130,2140 2060 MODEL(R3,C3)=MODEL(R1,C1)+MODEL(R2,C2):: RETURN 2070 MODEL(R3,C3)=M0DEL(R1,C1)-M0DEL(R2,C2):: RETURN 2080 MODEL(R3,C3)=MODEL(R1,C1)*MODEL(R2,C2):: RETURN 2090 IF MODEL(R2,C2)<>0 THEN MODEL(R3,C3)=MODEL(R1,C1)/MODEL(R2,C2) 2100 RETURN 2105 REM CALC2 2110 MODEL(R3,C3)=MODEL(R1,C1)*MODEL(R2,C2)/100 ::RETURN 2120 MODEL(R3,C3)=MODEL(R1,C1)+(MODEL(R1,C1)*MODEL(R2,C2)/100):: RETURN 2130 MODEL(R3,C3)=M0DEL(R1,C1)-(MODEL(R1,C1)*MODEL(R2,C2)/100):: RETURN 2140 IF MODEL(R1,C1)<>0 THEN MODEL(R3,C3)=((MODEL(R2,C2)-M0DEL(R1,C1))/MODEL(R1,C1))*100 2150 RETURN 2160 REM PRINT 2165 CALL CLEAR 2170 DISPLAY AT(1,6):"PRINT the Results" 2180 DISPLAY AT(4,1):"Starting column 0-";MAXCOL 2190 DISPLAY AT(5,1):"Ending column{ }0-";MAXCOL 2200 DISPLAY AT(6,1):"Starting row{ }0-";MAXROW 2210 DISPLAY AT(7,1):"Ending row{ }0-";MAXROW 2220 DISPLAY AT(10,1):"Digits before decimal" 2230 DISPLAY AT(11,1):"Digits after decimal" 2240 DISPLAY AT(12,1):"(14 digits max.)" 2250 DISPLAY AT(15,1):"Spaces between columns" 2260 DISPLAY AT(21,1):"O.K. to PRINT (Y or N)?" 2270 ACCEPT AT(4,26)SIZE(-3)VALIDATE(DIGIT)BEEP:C1 2280 ACCEPT AT(5,26)SIZE(-3)VALIDATE(DIGIT)BEEP:C2 2290 IF C<0 OR C1>MAXCOL OR C2<0 OR C2>MAXCOL OR C2MAXROW OR R2<0 OR R2>MAXROW OR R214 THEN 2330 2360 F$=RPT$("#",D1):: IF D2>0 THEN F$=F$&"."&RPT$("#" D2) 2370 ACCEPT AT(15,26)SIZE(-3)VALIDATE(DIGIT)BEEP:SP 2380 IF SP>30 THEN 2370 2390 L=LEN(F$) 2400 PW=10+SP+(C2-C1+1)*(L+SP): : FW=L+SP 2410 DISPLAY AT(18,1):"PRINT width is ";PW 2420 ACCEPT AT(21,28)SIZE(-1)VALIDATE("YN")BEEP:R$:: IF R$="" THEN 2420 ELSE IF R$="N" THEN 2270 2430 REM * OPEN PRINTER * 2440 OPEN #1:"RS232.BA=1200",DISPLAY,OUTPUT,VARIABLE PW 2450 K=0 :: FOR C=C1 TO C2 2460 PRINT #1:TAB(10+SP+K*FW);COL$(C);:: K=K+1 2470 NEXT C 2480 PRINT #1 :: PRINT #1 2490 FOR R=R1 TO R2 :: PRINT #l:ROW$(R);:: K=0 2500 FOR C=C1 TO C2 2510 PRINT #1:TAB(10+SP+K*FW); 2520 PRINT #1,USING F$:MODEL(R,C);::K=K+1 2530 NEXT C :: PRINT #1 :: NEXT R 2540 PRINT #1 :: PRINT #1 2550 CLOSE #1 2560 RETURN 2570 REM SAVE FOR PLOT 2575 CALL CLEAR 2580 DISPLAY AT(1,4):"Save Data for Plotting" 2590 DISPLAY AT(4,1):"Plot rows(R) or columns(C)" 2600 DISPLAY AT(7,1):"X-axis (horizontal)" 2610 DISPLAY AT(9,7):"number" 2620 DISPLAY AT(12,1): "Y-axis (vertical)" 2630 DISPLAY AT(14,7): "number" 2640 DISPLAY AT(22,1):"Row number range 0-";MAXROW 2650 DISPLAY AT(23,1):"Col number range )-";MAXCOL 2660 ACCEPT AT(4,28)SIZE(1)VALIDATE("RC")BEEP:T$ :: IF T$="" THEN 2660 2670 IF T$="R" THEN Tl$="Row" ELSE Tl$="Col" 2680 DISPLAY AT(9,3)SIZE(3):Tl$ :: DISPLAY AT(14,3)SIZE(3):T1$ 2690 ACCEPT AT(9,27 )SIZE(-2)VALIDATE(NUMERIC)BEEP:Dl :: IF D1<0 THEN 2690 2700 IF T$="R" AND D1>MAXR0W THEN 2690 2710 IF T$="C" AND D1>MAXC0L THEN 2690 2720 ACCEPT AT(14,27 )SIZE(-2)VALIDATE(NUMERIC)BEEP:D2 :: IF D2<0 THEN 2720 2730 IF T$="R" AND D2>MAXR0W THEN 2720 2740 IF T$="C" AND D2>MAXC0L THEN 2720 2750 RL=64::GOSUB 3190::IF FCODE=0 THEN 2850 2760 IF FCODE<0 THEN 2850 2770 IF T$="C" THEN 2810 2780 FOR I=1 TO MAXCOL 2790 PRINT #2:M0DEL(D1,I);M0DEL(D2,I) 2800 NEXT I :: GOTO 2840 2810 FOR I=0 TO MAXROW 2820 PRINT #2:M0DEL(I,D1);M0DEL(I,D2) 2830 NEXT I 2840 PRINT #2:-1;-1 :: CLOSE #2 2850 RETURN 2860 REM LOAD 2870 RL=192::GOSUB 3040:: IF FCODE=0 THEN 2940 2880 INPUT #2:MAXROW,MAXCOL,MAXCALC 2890 FOR I=0 TO 10 :: INPUT #2:ROW$(I),:: NEXT I 2900 FOR I=0 TO 10 :: INPUT #2:COL$(I),:: NEXT I 2910 FOR I=0 TO MAXCALC :: FOR J=0 TO 4 :: INPUT #2:CALC(I,J),:: NEXT J :: NEXT I 2920 FOR I=0 TO MAXROW :: FOR J=0 TO MAXCOL :: INPUT #2:MODEL(I,J),:: NEXT J :: NEXT I 2930 CLOSE #2 2940 RETURN 2950 REM SAVE 2955 REM TODO - finish CSV write 2960 RL=192::GOSUB 3190:: IF FCODE=0 THEN 3030 2970 PRINT #2:MAXROW;MAXCOL;MAXCALC 2980 FOR I=0 TO 10 :: PRINT #2:ROW$(I);:: NEXT I :: PRINT #2 2990 FOR I=0 TO 10 :: PRINT #2:COL$(I);:: NEXT I :: PRINT #2 3000 FOR I=0 TO MAXCALC :: FOR J=0 TO 4 :: PRINT #2:CALC(I,J);:: NEXT J :: PRINT #2 :: NEXT I 3010 FOR I=0 TO MAXROW :: FOR J=0 TO MAXCOL :: PRINT #2:MODEL(I,J);:: NEXT J :: PRINT #2 :: NEXT I 3020 CLOSE #2 3030 RETURN 3040 REM Load 3050 CALL CLEAR 3051 PRINT "Load From:" 3052 PRINT "____________________" 3060 PRINT "|1 Cassette 1 CS1 |" 3070 PRINT "|2 Disc |" 3080 PRINT "|3 Other |" 3090 PRINT "| |" 3091 PRINT "|0 To return |" 3092 print "| |" 3093 PRINT "____________________" 3100 ACCEPT VALIDATE("0123"):FCODE 3110 IF FCODE=0 THEN 3180 3120 IF FCODE=1 THEN 3170 3130 DISPLAY AT(15,1):"Type device.filename" 3140 ACCEPT AT(17,1)SIZE(-28)VALIDATE(UALPHA,DIGIT,".")BEEP:NAME$ :: IF NAME$="" THEN 3140 3150 OPEN #2:NAME$,INTERNAL,INPUT ,VARIABLE RL 3160 GOTO 3180 3170 OPEN "CS1",INTERNAL,INPUT ,FIXED RL 3180 RETURN 3190 REM Save 3195 CALL CLEAR 3196 PRINT "Save to:" 3197 PRINT "____________________" 3200 PRINT "|1 Cassette 1 CS1 |" 3210 PRINT "|2 Cassette 2 CS2 |" 3220 PRINT "|3 Disc |" 3230 PRINT "|4 Other |" 3240 PRINT "| |" 3241 PRINT "|0 To return |" 3242 print "| |" 3245 PRINT "____________________" 3250 ACCEPT VALIDATE("01234"):FCODE 3260 IF FCODE=0 THEN 3340 3270 IF FCODE=1 OR FCODE=2 THEN 3320 3280 DISPLAY AT(15,1):"Type device, filename" 3290 ACCEPT AT(17,1)SIZE(-28)VALIDATE(UALPHA,DIGIT,".")BEEP:NAME$ :: IF NAME$="" THEN 3290 3300 OPEN #2:NAME$,INTERNAL,OUTPUT,VARIABLE RL 3310 GOTO 3340 3320 IF FCODE=1 THEN NAME$="CS1" ELSE NAME$="CS2" 3330 OPEN #2:NAME$,INTERNAL,OUTPUT,FIXED RL 3340 RETURN 4000 REM Set CSV Saves 4005 CALL CLEAR 4010 CSVS=1 4015 PRINT "________________________" 4020 PRINT "CSV Saves turned on!" 4030 PRINT "0 TO Return to Main Menu" 4040 ACCEPT VALIDATE("0"):FCODE 4050 RETURN