Console Only Corner by Peter Walker
In the earliest days of computers, the clumsy valve based machines were often programmed to carry out lengthy mathematical tasks, such as calculating pi to hundreds of decimal places or finding prime numbers. Indeed, calculating prime numbers is a task which is still regularly used as a speed 'benchmark' between computers.
As we all know, the TI99/4A Basic is far from being fast, so I was interested to see how long it would take on our machine to display all prime numbers under 1000.
Now prime numbers are those that have no factor other than the number itself and 1. These are 2,3,5,7,11,13,17 .... The first program I tried is given below.
For each number between 2 and 1000, we divide it by each number less than the original number's square root. If any division results in an exact integer then it is not a prime. The program, written for Extended Basic, takes 2 min 53 secs to run.
100 FOR N=2 TO 1000
110 FOR J=2 TO SQR(N)
120 IF INT(N/J)*J=N THEN 150
130 NEXT J
140 PRINT N;
150 NEXT N
In an attempt to speed up this program, we might decide that it is a waste of time to try every number as a potential divisor: it is only necessary to try prime numbers as divisors. So, as primes are found, we create an array to store them and only choose divisors from this list. ` We would get a program like this..
100 DIM P(1000) :: P(1)=2 :: L,J,N,M,Q=1
110 !@P-
120 FOR N=2 TO 1000 :: M=SQR(N)
130 FOR J=1 TO L :: Q=P(J) :: IF Q>M THEN 160
140 IF INT(N/Q)*Q=N THEN 170
150 NEXT J
160 PRINT N; :: P(L+1)=N :: L=L+1
170 NEXT N
All very well, only snag is that this program takes 3 min 3 secs to run - so much for speeding up the routine. Even removing the FOR-NEXT loop in line 130 (since it is always exited via the IF at the end of the line) actually further slows down the program.
Do note though the calculation of the square root outside the FOR-NEXT loop in order to avoid repetitive calculation. What can we do to produce a faster program?
The answer is to go back to basics. Another traditional way of finding prime numbers is to write down all the numbers from 1 to 1000.
You then cross out all the multiples of 2, ie 4,6,8,10... Then cross out all the multiples of 3, ie 6,9,12,15..
4 will already be crossed out so can be ignored and is also thus shown as not being a prime.
When you have reached 1000, then the numbers not crossed out are the prime numbers. The program below achieves this.
The elements of the array P() are set to -1 (TRUE) if "crossed out" and primes can be displayed as we progress.
100 DIM P(1000) :: J,K=0
110 !@P-
120 FOR J=2 TO 999 :: IF P(J) THEN 140 ELSE PRINT J;
130 FOR K=J+J TO 1000 STEP J :: P(K)=-1 :: NEXT K
140 NEXT J
The good news is that this program runs in just 37.6 seconds. Indeed it gives the impression of being speed limited not by the loop calculations but by the inherent delay in displaying numbers on the screen itself.
The moral is clear: explore several methods of achieving your program's objectives and don't assume that elegance or obviousness results in greatest speed.
Can anyone beat 37.6 seconds? You might like to try converting this routine into console Basic. This takes 52.8 seconds - can this be improved?
Peter Walker
Converting Personal Record Keeping module data to Display Variable 80 disk files
Conversion Routines by Peter Walker and Stephen Shaw
As mentioned elsewhere, only one person responded to my request for good conversion programs. Stephen submitted a program written in "Enhanced Basic" (that resident in the Personal Record Keeping (PRK) and Stats modules) to convert a PRK data file into DV8O format.
I noted two small problems with the routine. Firstly using CALL B on an empty record does not cause the input variable to be set to "". Also the disk file CLOSE statement was omitted. I have therefore decided to publish a slightly improved version of the program, which also demonstrates the use of CALL A and CALL D routines.
It converts PRK data files to TI-Writer compatible DV8O fi1es for use in Mailing Lists. (refer to page 113 of the TI-Writer Reference Guide).
My thanks to Stephen; where are all the rest of you budding programmers?
Peter Walker
100 REM PRK TO TIW MAIL LIST CONVERSION
110 REM BY STEPHEN SHAW AND PETER WALKER
120 REM INSERT PRK MODULE
130 REM FIRST DO THIS IN IMMEDIATE MODE
140 REM CALL P(N) WHEN N>256*SECTORS IN PRK FILE
150 REM NEW
160 REM CALL FILES(1)
170 REM NEW
180 CALL CLEAR
190 CALL D(1,1,28,"PRK TO TIW MAIL LIST CONVERT")
200 CALL D(5,1,9,"PRK FILE:",7,1,10,"DV80 FILE:")
210 CALL A(5,12,15,F,A$)
220 CALL A(7,12,15,F,B$)
230 CALL D(9,1,16,"OPENING PRK FILE")
240 CALL L (A$, Y)
250 IF Y=0 THEN 650
260 CALL H(1,2,1,D)
270 CALL H(1,3,1,M)
280 CALL H(1,4,1,Y)
290 CALL D(9,1,28,"DATE:" /")
300 CALL D(9,6,2,D)
310 CALL D(9,9,2,M)
320 CALL D(9,12,4,Y)
330 CALL H(1,5,0,F)
340 CALL D(11, 1,28, "FIELDS:")
350 CALL D(11,8,4,F)
360 CALL H(1,6,0,R)
370 CALL D(11,14,13, "RECORDS :")
380 CALL D(11,22,4,R)
390 CALL D(13,1,28,"OPENING DV8O FILE")
400 OPEN #1:B$
410 FOR I=1 TO R
420 FOR T=1 TD F
430 CALL H(1,10,T,TP)
440 IF TP=1 THEN 520
450 CALL G(1,I,T,Z,RD)
460 CALL D(15,1,4,I, 15,5,4,T,15,10,4,RD)
470 L$=STR$(T)&" "&STR$(RD)
480 RD=0
490 CALL D(17,1,28,L$)
500 PRINT #1:L$
510 GOTO 600
520 CALL G(1, I,T,Z,RD$)
530 CALL D(15,1,4,I,15,5,24,T)
540 IF RD$="" THEN 560
550 CALL D(15,10,5,RD$)
560 L$=STR$ (T)&" "&RD$
570 RD$=""
590 CALL D(17,1,28,L$)
590 PRINT #1:L$
600 NEXT T
610 PRINT #1: "*"
620 NEXT I
630 CLOSE #1
640 STOP
650 CALL D(17,1,28,"ERROR CALL P(N)",19,1,28,"N WAS TOO SMALL")
Rambles by Stephen Shaw
BASIC
To find a SQUARE ROOT you would use SQR, eg PRINT SQR(4) produces 2
How about a CUBE root or higher?
If you type: PRINT 4*0.5 you will get 2, and similarly if you type PRINT INT(8*0.333333+.00001) you will get 3.
To find an N root you need to use the form ROOT=NUM*(1/N), remembering to take account of small inaccuracies in the math! (0.3333333 is not exactly one third)
============================
Compact data flags - Basic:
Speaking of binary math, one aspect of Basic not exactly covered in your manuals is the use of AND in a compacted data type situation...
Lets say we have a user group whose members have different items of equipment. Lets allocate powers of two to each item of equipment:
CONSOLE = 0 EX BAS = 2
32K = 4 SSSD DISK= 8
DSSD DISK=16 PIO =32
MODEM=64 and so on and so on.
Now add up the values of the items of equipment each member has, and obtain a total.
If I have console, exbas and modem the total is 0+2+64 = 66.
We can find out from that total - which occupies almost no memory - what a member has by use of the AND operator.
Thus:
100 INPUT "MEMBER TOTAL":TOTAL
110 IF TOTAL AND 2 THEN PRINT "MEMBER HAS EX BAS"
120 IF TOTAL AND 4 THEN PRINT "MEMBER HAS 32K"
and so on.
A little variant would be:
130 IF TOTAL AND NOT 32 THEN PRINT "MEMBER DOES NOT HAVE PIO"
Try it out!
If you are using a different computer / language you need to know that we are taking advantage of the TI's use of a bitwise AND operator. In some languages there is a separate operator for this purpose. You will need to check if other languages have the expected result using AND or if there is a different operator. In lower level languages the ampersand is a common bitwise AND operator eg SELECT A & B.
In modern parlance the total we obtain by adding up the values of what our member owns is called a "bitmask".
In sdlbasic we would use:
IF ANDBIT(TOTAL,TEST)>0 THEN
PRINTS("MEMBER HAS:"):PRINTS(EQ[TEST])
============================
MYARC EXTENDED BASIC difference - not so much a bug...
In TI Extended Basic if you type PRINT VAL("") you will receive an error.
In Myarc Extended Basic you will receive a 0 (zero).
When evaluating a string in TI XB you need to ensure that the string does not have a nul value.
TI Sort is a commercial program written by Dennis Faherty. Dennis is the father of Chris Faherty who wrote TI Artist Vn 1 when he was aged 14. We start with a quotation from Dennis:
TI SORT
"The actual sort algorithms were based on a QUICK SORT method described by C A R Hoare in a book titled 'Fundamentals of Data Structures' by Horowitz.
The file handling methodology is a variation of creating multiple sorted files and merging them into the final output. The variation is that a single fixed file is used with sections of this file representing the multiple files. With the limitation imposed by TI on the number of files to have open concurrently, this seemed like a reasonable variation.
It is also designed specifically for TI-BASE files, with other record types also being considered, to make it as generically useful as possible. It was obvious even before TI-BASE was first released that it would probably need a supplemental sort program for data bases of any large size, and I had planned TI-Sort at that time."
Sorting TI BASE files with TI SORT is indeed a very easy and simple doddle, you don't really need the manual.
The AID key is functional with help windows throughout, should you need them. Just one tiny niggle- when selecting the order of nesting, when sorting on more than one field, the order number is placed at screen left, and is not visible on my tv! Such screen echoing of input is not absolutely needed though. When sorting TI BASE data, TI SORT accesses the Structure file, and lists the fields for you to select from. And off it goes, making use of an intermediate file, rewriting the old file OR making a separate file it you prefer.
As with SORT1, use of a RAM disk makes life a lot easier, else use of different disk drives speeds things up- eg intermediate file on a different drive to the input/output files.
TI SORT can cope- subject to your media limitations!- with up to 32767 records.
ALL sizes of TI Base records are supported, but non-TI Base data is limited to 255 byte records or under.
MAXIMUM of 17 FIELDS PER RECORD.
Nested sorts up to eight deep.
TI Sort will load using the standard Extended Basic LOAD from drive one, or using LOAD AND RUN from drive one, or using machine code RUN memory image file from any drive.
On screen display of the sorting process is optional.
In addition to TI Base data TI SORT can handle the following other types of data-
in every case you must create a structure for the data similar to that a used by TI Base (and similarly by PRK).
This just means you have to tell the program how many fields are in each record, of what type, and how long they are. Structure files so created may be saved for later use either with the same data or with other identically structured data.
FIXED RECORDS- strictly speaking, only the actual fields you wish to sort on must be in fixed positions, but generally it is preferable if all data fields are of fixed length and position.
DELIMITED RECORDS- in which each field varies in length from record to record, and is merely separated from other fields by a special delimiter character, which can be any character you wish, so long as it is not included as part of a data item.
BASIC FILES- files created in a BASIC program, internal or display format. In this case embedded blanks may cause problems eg 'THE RED SKY' as it cannot tell the difference between embedded blanks and blanks between fields.
The program automatically (transparently) switches between three modes, depending on the amount of data- if it will all fit into available ram then 'scratch file' is not used, everything takes place in ram. For example 200 records of 80 bytes would be dealt with in ram.
After we run out of ram the use of sub files takes place, with a third mode available when you go over around 4000 records - but you really don't need to know all that at all!
If you only do a little sorting, there is SORT1 from the disk library, with only the barest documentation. Or their is this very friendly program specially written for TI Base, called TI SORT, which I recommend to you.
John Guion, designer of the Multi-Mod, and upgrades for TI RS232 and TI Disk Controller Cards, died age 22 in September 1989 in a car accident. He designed the P-Gram card, designed a 32k ram for the 16 bit bus, and helped improve the Horizon Ram Card. His active support for our machine will be missed.
Go to top of page
AN APPRECIATION
When the TI99/4 was first launched, there was very little support for it. Early owners enjoyed the support of the International TI99/4 Users Group in Bethany, Ohio, led by Charles LaFara. The first UK group of TI owners, TI Home, was among many beneficiaries of this group, and received a number of software items to start off a UK software library for the use of members.
The first software librarian for the Bethany group was Guy-Stefan Romano.
Later, as the Bethany group expanded to 100,000 members, the only possible operation was as a commercial group, and Guy left to continue library support on his own.
In 1981 Guy commenced the Amnion Helpline, a telephone advice service *FREE* for TI99/4(a) users, called AMNION HELPLINE.
Guy helped TI owners right from the start, and continued to do so until they chose not to seek his help any longer. He wrote recently that over a six month period he had had no requests for software and only a couple of phone calls.
I gather the Amnion Helpline was financed by an ancient Swiss company but as with all Swiss corporate matters, the details are foggy.
Despite his long term and outstanding contribution to the TI Scene, Guy is not mentioned in the excellent book 'The Orphan Chronicles', possibly due to his part in assisting with the book. There is a reference merely to 'one close former-IUG insider'.
UK disk owning members can find a file on the disk library catalogue called AMNION which contains selected items from Guys large collection of software.
Amnion disk library from whtech.com in pc99 emulator format.
Guy was born in France, with Ph.D's in Romance languages, Germanic languages, and fine arts, with a Masters in Chinese. He was fluent in 17 languages! He spent time teaching languages, and commenced work on a computer based translation machine in the 1950's
Guy knew England well. In employment he was an 'internationally known potter' and a ceramic chemist - he spent some years learning his trade in the Staffordshire potteries. He was also a graduate chef. Guy developed a unique high temperature stoneware for cooking, marketed as AMNION WARE, which I gather was used by Elizabeth David (did I get that name right?) and David Mellor. He also wrote some cookery books.
Guy died in August 1989 age 57. His love care and devotion to all TI99/4 and 4A owners will be missed, but his contribution will be remembered.
=========================
In August 1989, Terrie Masters of Los Angeles TI99/4a users group wrote:
The loss of Guy touches many of us quite deeply. Guy was rather an incredible man. His many and varied talents
boggled the mind.Guy was the generous genius behind Amnion and the Amnion
Hotline.
The large collection of disks and programs were of great interest
and help to the early members of our community. This extensive collection
resides in the libraries of many user groups. Many of the programs are
timely today.
I had the pleasure of visiting Guy at his home in San Francisco. We had
become friendly via phone and mail. He was exceptionally hospitable, opening
his home and heart to me.
Guy suffered from a debilitating bone disease, in addition to extreme light
sensitivity. He had been until quite recently house bound. A change in
medication gave him back some of his mobility. He actually made forays away
from home and wandered around the Price Club the day before he died. This
was rather wonderful for a man whose every day was spent in extreme pain.
=========================
It is always better when someone shows appreciation before you pass on - here is an excerpt from a 1985 copy of Chicago Times, the magazine of TI99/4a owners in Chicago:
Meet Dr. Guy-Stefan Romano by Jack Topham March 1985 Chicago TIUG Times newsletter, page 10
In far away San Fransisco lives a genius who knows all about the ti 994/a computer and wants to share what he knows and has with his friends.
Dr Guy-Stefan Romano operates Amnion Helpline whose purpose is to disseminate all the scoop on the 99 he has amassed over the years.
Guy not only can answer most any question you can ask but he also has a tremendous library of 99/4 programs which he makes available almost for the postage. Before I describe several programs that he has provided our library I'll share some facts about our friend.
First, he can be reached on work days at (415) 753-5581. The address is 116 Carl St., San Fransisco, CA 94117. Now I want to share some real incite into Dr Guy-Stefan Romano. He can help you in almost any language as well as the various 99 computer languages.
Now listen up! Guy speaks 5 languages better than English and 12 more as well as English!!!! He has a PHD in romance languages, one in fine arts, and one in German linguistics. Now toss in a Masters in Chinese for good luck. He is not obligated to any manufacturer or supplier and only wants to see TI 99/4a users helped with whats available.
=========================
Here is a recipe from Guy to remember him by...
...Here is a Hawaiian quick bread that is my downfall.
Eat this still slightly warm with scads and scads of butter (and put a black wreath on your bathroom scale). This recipe serves... never enough...
KONA BREAD.
Preheat oven to 350F (177C)
Cream together 1 cup of raw sugar (225 grm) and 1/2 cup of butter (110 grm). (Beat until fluffy).
Add: 2 eggs, 3/4 cup ripe bananas (near to 180 cc, 180ml on a measuring jug) (bananas should be almost to the point where you are contemplating throwing them away - black and rather mushy. Why? Because almost all of the starch is converted to fruit sugar by this time.).
Separately mix together 1 teaspoon baking soda, 2 teaspoons baking powder, 1 1/4 cups f1our (190gm).
(Baking soda is bicarbonate of soda; baking powder is bicarbonate of soda with an added ingredient -usually cream of tartar- which causes the leavening action).
Then gently fold into banana mix. DO NOT OVERMIX!
Pour into buttered loaf pan and bake about 45 mins. GORGE YOURSELF.
PS. To gild the banana, so to speak, you may add 1/2 cup chopped macadania nuts or pecans to this.
(Guy used American neasures! I have added metric using Delia Smith guide-sjs)
Hi resolution Plotting in Extended Basic
Added 2018: 11/82 listing by R Matthews.
The original program appeared in the February 1982 copy of TI-dings, hand written. This marked its first appearance on this web site.
EX BAS ONLY PLOTTING - HI RES - UNEXPANDED
This is for our 50% unexpanded owners, and will allow you to sample many of the graphic routines I have (and will) present which really call for bit-map graphics.
This routine allows you to plot in 'pseudo' high resolution- you may program as though you had bit map graphics, but in fact what we are doing is continually redefining characters, which means the full screen area is not available, and it is a little slower than other means used!
It is not possible to say when you will 'run out of ink' as TI Logo, which uses the same idea, so
aptly puts it.
The routine is written to prevent crashes if you do run out of ink, but in itself will not check that R and C are within the screen boundaries.
It is in Extended Basic and is by Gary Harding.
Where in the other programs we have:
CALL DOT(1,R,C)
you should use
CALL PLOT(R,C,S)
and for
CALL LINK("POINT",N,R,C)
you should use
CALL PLOT(R,C,S) etc etc.
Your program must commence:
1 CALL SCREEN(2) :: S=31 :: CALL HCHAR(1,1,S,768)
2 FOR T=1 TO 14 :: CALL COLOR(T,16,2) :: NEXT T
= = = =
YOUR GRAPHICS PROGRAM THEN FOLLOWS.
Ignore any initialisation for other graphics languages,
such as CALL LOADS and CALL LINKS or CALL GRAPHICS
= = = =
Now the subroutine which should be at the END of the program:
31010 SUB PLOT(R,C,S)
31020 Y=INT(R/8+0.875) :: X=INT(C/8+0.875)
31030 H$="0123456789ABCDEF"
31040 B=C-X*8 :: P=2*R-16*Y+16+(B<5)
31050 IF B>4 THEN B=B-4
31060 CALL GCHAR(Y,X,H)
31070 IF H>31 THEN 31100 ELSE IF S=143 THEN SUBEXIT
31080 S=S+1 :: D$=RPT$("0000",4) :: CALL CHAR(S,D$)
31090 CALL HCHAR(Y,X,S) :: H=S
:: GOTO 31110
31100 CALL CHARPAT(H,D$)
31110 N=(POS(H$,SEG$(D$,P,1)
,1)OR(2^(4-B))
31120 D=SEG$(D$,1,P-1)&SEG$(H
$,N+1,1)&SEG$(D$,P+1,16-P)
31130 CALL CHAR(H,D$) :: SUBEND
31140 ! ROUTINE BY GARY HARDIN6
31150 ! FROM TIDINGS OCTOBER 1982
32000 END
A note on line 31110- that is the word OR that you see. This bitwise "OR" effectively sets the bit in the relevant digit of the character definition hexstring corresponding to the pixel which it is required to plot. (Gary Harding).
Convert the numbers on each side of the OR to a binary number (made up of 1s and 0s. From Microsoft: "The bitwise OR operator performs a bitwise logical OR between the two expressions, taking each corresponding bit for both expressions. The bits in the result are set to 1 if either or both bits (for the current bit being resolved) in the input expressions have a value of 1; if neither bit in the input expressions is 1, the bit in the result is set to 0.". eg (1001 OR 0100)=1101 also (0010 OR 0010)=0010.
Note that in TI Basics the logical operators are "bitwise" in modern parlance. This does not apply to all other computer languages which may have special bitwise operators, or none at all.
New 2018: A listing by R Matthews from Your Computer magazine of November 1982. Mr Matthews died not long afterwards, much too young.
From Your Computer- Nov 1982:
60 REM R.MATHEWS
70 REM TX SOFTWARE
80 REM LINE PLOTTER (TI994A
EXTENDED BASIC)
85 REM ***********
100 CT=96
110 CALL CLEAR
120 READ RW,CL,RW1,CL1
130 CALL PLOT(RW,CL,RW1,CL1,
CT)
140 GOTO 140
150 DATA 2,20,12,65
160 END
170 REM ***********
180 SUB PLOT(RW,CL,RW1,CL1,C
T)
190 BIN(1),BIN(5)=8 :: BIN(2
),BIN(6)=4 :: BIN(3),BIN(7)=
2 :: BIN(4),BIN(8)=1
210 X1=RW1-RW :: Y1=CL1-CL :
: Z1=MAX(ABS(X1),ABS(Y1))::
G=RW :: H=CL
240 FOR I=1 TO Z1 :: G=G+X1/
Z1 :: H=H+Y1/Z1 :: RW=INT(G)
:: CL=INT(H)
250 CHRW=INT(RW/8.01+1):: CH
CL=INT(CL/8.01+1)
260 PIXRW=RW-((CHRW-1)*8)::
PIXCL=CL-((CHCL-1)*8)
270 CALL GCHAR(CHRW,CHCL,CH)
:: IF CH=32 THEN CH=CT :: CT
=CT+1 :: CALL CHAR(CH,"")
275 IF CT=144 THEN CT=96
280 CALL CHARPAT(CH,X$)
290 PS=INT(((PIXRW-1)*8+PIXC
L)/4.001)+1 :: CD=ASC(SEG$(X
$,PS,1))
300 IF CD<65 THEN DEC=CD-
48 ELSE DEC=CD-55
310 DEC=BIN(PIXCL)OR DEC
320 IF DEC>9 THEN CD=DEC+55
ELSE CD=DEC+48
330 X$=SEG$(X$,1,PS-1)&CHR$(
CD)&SEG$(X$,PS+1,16)
335 CALL CHAR(CH,X$):: CALL
HCHAR(CHRW,CHCL,CH):: NEXT I
340 SUBEND
350 REM ***********
Go to top of page
REPORT ON THIRD ALTERNATIVE MICRO SHOW. November 11th 1989
In a field a few miles from Stafford.
The first AMS was in Birmingham, the second in London. This third show was in the Staffordshire County Show Ground, in a rather isolated location some miles from Stafford, with remarkably little signposting, and no public transport!
The advertising for this event was as usual minimal, but even more so this time, as route directions/map were not given.
Given the location, the organisers decided that it was proper for the stand footage rate to be quadrupled over their show in the centre of London. As a result of both cost, and remote location, many exhibitors at London did not exhibit in Stafford- including TIUGUK. The TI99/4A was represented by the East Anglia group, and by Database (Frances Parrish). Poor Frances- after setting off at 4am from his deep South homebase, he gave up, packed up, and moved out at around 3pm, as trade was truly abysmal.
Our East Anglia friends booked one six foot table, and filled it with two expanded systems (you try it!!!), then got a second table - there was a lot of vacant space!- to display their spare modules, books and hardware for sale.
Naturally their table - stand number 1 (ONE) - was the focus for TI99/4A owners who had a good chat.
Elsewhere, the show was quite remarkable for the variety of produce available. For the first time I met up with - and purchased- toasted corn (USA), fried yellow peas (India) and fried Cassava crisps (Costa Rica). I also bought a cheap LW portable radio for 3.50, which sells for 5.99 in Manchester- the catch with this being the 2.5mm headphone socket- not the usual 3.5mm socket.
I COULD have purchased some second hand BETAMAX video recorders, an NTSC/PAL tv set, a LASER, some hankies, die cast cars, Christmas cards, biros, cuddly toys, a lovely solar driven music chip- like you get in greetings cards- think of it - whenever the sun shone, continuous music .... .
There was a good choice of portable cassette players, and much more besides! Even the usual offers of cheap disks and listing paper.
With stallholders generally cramped onto small tables in a huge hall with lots of spare room, I rather missed seeing which user groups had turned up apart from EAR. A most odd exhibition, which has moved on a long way from AMS1, which was organised by the Einstein users, who sought to join with other orphan computer user groups, to share a meeting which would otherwise be too expensive. The other user groups seem to have been rather pushed aside now, and I see that AMS4, Nov 90 in the same venue, is set to support also the PC - is it still an ALTERNATIVE Micro Show?
1 REM FREEFORM ART BY STEPHEN SHAW 1982 FOR MYARC XB NOV 1989
2 REM BASED ON WORK BY JEREMY RUSTON
3 REM
4 RANDOMIZE
5 XX=INT(RND*110+40) :: YY=INT(RND*110+40) :: LL=INT(RND*110+40) :: MM=INT(RND*110+40) :: UU=10-RND*20 :: VV=10-RND*20
6 PP=10-RND*20 :: QQ=10-RND*20
7 CALL GRAPHICS (3)
8 FOR K=1 TO 30
9 X2=XX :: Y2=YY :: X3=LL :: Y3=MM :: GOSUB 16
10 IF XX+UU>150 OR XX+UU<40 THEN UU=-UU
11 IF YY+VV>150 OR YY+VV<41 THEN VV=-VV
12 IF LL+PP>150 OR LL+PP<39 THEN PP=-PP
13 IF MM+QQ>148 OR MM+QQ<38 THEN QQ=-QQ
14 XX=XX+UU :: YY=YY+VV :: LL=LL+PP :: MM=MM+QQ :: NEXT K :: CALL WRITE(1,24,3, "SPACE FOR ANOTHER")
15 CALL KEY(0,A,B) :: IF A=32 THEN RUN ELSE 15
16 DX=X3-X2 :: DY=Y3-Y2 :: IF (DX=0)+(DY=0) THEN 20
17 IF ABS(DX)>ABS(DY) THEN 19
18 FOR LCV=Y2 TO Y3 STEP SGN
(DY) :: R=INT(.5+LCV) :: C=
INT(0.5+X2+DX/DY*(LCV-Y2)) :
: CALL DOT(R,C) :: NEXT LCV
:: RETURN
19 FOR LCV=X2 TO X3 STEP SGN
(DX) :: C=INT(0.5+LCV) :: R=
INT(0.5+Y2+DY/DX*(LCV-X2)) :
: CALL DOT(R,C) :: NEXT LCV
:: RETURN
20 IF (DX=0)-(DY=0) THEN 21 ELSE RETURN
21 IF DY=0 THEN 23
22 C=INT(0.5+X2) :: FOR LCV=Y2 TO Y3 STEP SGN(DY) :: R=INT(0.5+LCV) :: CALL DOT(R, C) :: NEXT LCV :: RETURN
23 R=INT(0.5+Y2) :: FOR LCV=X2 TO X3 STEP SGN(DX) :: C=INT(0.5+LCV) :: CALL DOT(R, C) :: NEXT LCV :: RETURN
24 STOP
25 SUB DOT(R,C) :: CALL POINT(1,R,C) :: SUBEND
26 END
Notes:
Line 16 IF (DX=0)+DY=0) THEN is the same as saying IF (DX=0) OR (DY=0)
Line 20 IF (DX=0)-(DY=0) will not transfer to 21 if DX and DY are either both zero, or both not zero. If either has a value other than zero, the transfer to 21 takes place. In modern parlance the minus is here a bitwise XOR operator. Another way to program this would be:
20 IF (DX=0) AND (DY=0) THEN
RETURN ELSE IF (DX<>0) AND (D
Y<>0) THEN RETURN
Go to top of page
1983 article on Speech by Guy-Stefan Romano
HELP! MY 'CALL SAY' DOESN'T
by Guy S. Romano
One of the most common calls we receive at Library Services has to deal with the Speech Synthesizer which in reality are not "problems" but rather a lack of understanding of just how the fantastic speech capabilities of the TI Computer work.
To clarify the point let draw some very broad and imprecise analogies.
Let us call the console the "brain" of the whole system. Then by extension the Speech Synthesizer can be called the larynx or "voicebox" of our computer.
Our own voice-boxes will not work alone; they need something to drive them to vibrate and create sound. So too with the Speech Synthesiser unit. It also requires something to cause it to create sound.
Back then when the 99/4A was the 99/4 and little existed for the computer, this "driver" was simple since no choice was possible. The force that made Speech possible was a Command Module called the Speech Editor.
With it one could use the Speech Synthesizer to create a very realistic sounding voice in programs and use speech in conjunction with ALL the other capabilities of the TI Computer. To the best of our knowledge, the 99/4A is still the only small computer that allows the combination of speech, graphics, and music all in the same program.
With the advent of the 99/4A other wonderful Command Modules came on the scene; Extended Basic and Terminal Emulator II among others. Texas Instruments gave us a great bargain in Extended Basic, they took all the speech capabilities of the old Speech Editor and incorporated them into the Extended Basic module.
Now we had two "drivers" for the Speech Synthesizer and they both worked the same way, but they still were limited to a rather small vocabulary. When TI came out with the Terminal Emulator II which was primarily designed for use with a modem for computer hookups by phone, they threw in another present, a different and
marvelous speech capability totally unlike what came before.
The TE II now allowed for UNLIMITED speech capability with none of the limitations or restrictions of Speech Editor or Extended Basic. Now "we" could say anything and even change intonation patterns and voice pitch.
TI, the forerunner of computer speech, gave us a really powerful and
versatile unit neatly contained in one little module for an almost ridiculously low price.
As is true, however, as in all other facets of life, with choices comes some inequity.
The speech functions of Speech Editor / Extended Basic and Terminal Emulator II are not compatible with one another and their functions cannot be used interchangeably from program to program. But this seeming inequity or incompatibility is only superficial since with a little work on our part, we can change a program written for Speech Editor to one for TE II quite easily.
The Speech Editor/ Extended Basic type of speech "driver" uses statements like CALL SPGET(...) (not often used) and
CALL SAY(XXX).
Nothing else is required except that you MUST use only the resident vocabulary.
Words may be made to seem more natural sounding by hooking words together with plus signs; ie. "HOW+ARE+YOU"
and then certain phrases were created that are in common usage and these were indicated by the use of the number sign, "#" as is "#TRY AGAIN#".
Terminal Emulator II functions as it if were opening a file (the same thing you do when you "SAVE" a program on cassette etc). As you can begin to see it is quite simple to convert "CALL SAY" to TE II.
Where the older format called CALL SAY("HOW+ARE+YOU"), TE II used the form of PRINT #1:"HOW ARE YOU"
Let us say that you have bought a program that needs the Speech Synthesizer but when you RUN it you get
a message that says BAD NAME IN XXXX (where XXXX is a line number).
If you immediately look at line XXXX it will probably have a "CALL SAY" in it. So here is what you do:
old program line: XXXX CALL SAY("THAT+IS+VERY+GOOD")
new line for TE II: XXXX PRINT #1:"THAT IS VERY GOOD"
What you are removing is the CALL SAY and the parenthesis plus any of the linkers (plus signs or #s) and replacing them.
With TE II you are using a file before your computer will recognise it. Therefore somewhere at the beginning of the program you must insert a line that reads:
XXX OPEN #1:"SPEECH", OUTPUT.
If you want to be more thorough you can then add a line at the end of the program which reads:
XXXX CLOSE #1
although this is not necessary. When you make these conversions keep in mind that you can now change the message in quotes to ANYTHING you want since there is no limit on the vocabulary with TE II.
"SAVE" this converted program on a new tape for use later.
OK you may say - but even though I have a Speech Synthesiser, I do not have a TE II and am not planning to.
Go through the program and look for lines with the "CALL SAY" or even the "PRINT #1" if the program is written for TE II.
Get into the EDIT mode (type the line number then press FCTN and X simultaneously). The cursor will be flashing over the first letter in the line (anything after the line number). Then type REM [space] and press ENTER. Now the computer looks at that line and it sees that REM and will ignore the line and go on to the next line.
Later when you get a TE II etc you can remove the REMs and make the necessary conversions and then take full advantage of the wonderful world of SPEECH that Texas Instruments has given us.
Have a nice chat with your computer.
This article first appeared in Enthusiast 99 Volume 1 Number 1 in May 1983.
Go to top of page
Graphics Programs
HENON MAPPING
Here is a fractal program for TRITON SUPER XB module owners...
Notes:
Line 260: You can experiment by setting A yourself from -4 to +4. Try making an animation with a sequence of pictures where the value of A is varied by 0.001 for an evolving distortion.
Lines 280-290: The full map is between the values of -0.1 and +0.8
Step 0.2 is about right for the TI99/4a, using a smaller step gives more detail but takes longer.
Line 320- Looping 500 times gives the correct inner detail for the TI99/4a, if using a higher resolution you will probably need more loops.
100 REM TRITON XB
110 REM BEFORE LOADING TYPE
120 REM CALL FILES(2)
130 REM NEW
140 REM CALL INIT
150 REM CALL DRAWNPLOT
160 REM CALL LINK("GCLEAR")
170 REM AND OFF YOU GO
180 REM
190 REM S SHAW 9/89
200 REM FROM FRACTAL REPORT
210 REM ISSUE 4
220 REM HENON MAPS
230 REM ANDY LUNNESS. BURY
250 RANDOMIZE
260 A=RND*4
270 COSA=COS(A) :: SINA=SIN(A)
280 FOR X=-0.1 TO 0.8 STEP 0.2
290 FOR Y=-0.1 TO 0.8. STEP 0.2
300 SX=X
310 SY=Y
320 FOR IT=1 T0 500
330 IF SX>500 OR SY>500 OR SX<-500 OR SY<-500 THEN IT=500 :: GOTO 400
340 XX=SX*COSA-(SY-SX*SX)*SI
NA
350 SY=SX*SINA+(SY-SX*SX)*CO
SA
360 SX=XX
370 PLTX=SX*90+91 :: PLTY=SY
*90+91
380 CALL LINK("MOVE",PLTX,PL
TY)
390 CALL LINK("DRAW",PLTX,PL
TY)
400 NEXT IT :: NEXT Y :: NE
XT X
410 CALL LINK("SHOW")
420 CALL LINK("GDUMP","PIO.C
R")
430 RUN
Using other languages to draw the image, replace lines 380 and 390 with something like:
380 CALL POINT(1,PLTX,PLTY)
RANDOM STARS
I am not entirely happy with this coding, which I am sure can be improved to give more acceptable images than at present, but this one is a start. It yields similar images to the
Rose program published a few issues ago.
Some of the images will be unduly simplistic, some will not be at all nice - the some with plots partly off screen will be horribly distorted due to the way our error trapping is working -
This code is in Myarc XB:
1 RANDOMIZE
2 ON ERROR 3 :: GOTO 100
3 ON ERROR 3 :: RETURN NEXT
100 REM STAR FRACTALS
110 REM L J VERSCHUEREN
120 REM FRACTAL REPORT 4
130 REM MYARC XB S SHAW 89
140 REM
150 CALL GRAPHICS (3)
150 N=INT(RND*8)+3 ! Number of points
160 R=0.5+RND*0.5
170 F=INT(RND*5)+1
180 CALL WRITE(1,4,4,STR$(F))
190 FOR Z=1 T0 INT(RND*8)+1
200 READ A
210 NEXT Z
220 DATA 0.25,0.5,0.75,1,2,3,4, 5
230 RESTORE
210 IF INT(N/2)=N/2 AND INT( A/2)<>A/2 THEN 180 !
211 ! this code avoids some poor images.
220 C=1
230 IF N/2-INT(N/2)=0 THEN IF A <>INT(A) THEN CALL GETC ELSE IF A/2-INT(A/2)<>0 THEN C=2
231 ! GETC is at the end of the program
240 A=A*PI/N :: K=N-1 ! On the TI
variable PI is prespecified
250 Y=RND*0.5-RND*0.5
260 REM S=SCALE
270 S=0.7
280 X=-0.5*S :: H=F-1
290 CALL POINT(0,X*48+127,Y*48+127)
300 CALL WRITE(1,24,4,"WAIT") :: F=0
310 T1=C*N*K^H-1 :: LP=MIN(T1,35) :: IF LP<12 THEN RUN
320 GOTO 800
330 CALL WRITE(1,24,4," ",4,3," ",5,3," ")
340 F,M,B,G,J=0 :: FOR I=0 TO C*N*K^H-1
350 M=I :: B=I*A :: G=0
360 IF M/K-INT(M/K)=0 AND G<H THEN G=G+1 :: M=M-K :: GOTO 360
370 J=H-G :: X=X+R^J*COS(B) :: Y=Y+R^J*SIN(B)
380 CALL DRAWTO (F,Y*MULT+CO,X*MULT+CO)
390 IF F=0 THEN F=1
400 NEXT I
410 FOR I=1 T0 600 :: NEXT I
420 RUN
430 C=A-INT(A):: IF C>0.5 THEN C=1-C
440 STOP
450 END
800 REM
810 FOR I=0 TO LP
820 CALL WRITE(1,5,5,STR$(I)) :: H=I :: B=I*A :: G=0
830 IF MK-INT(M/K)=0 AND G<H THEN G=G+1 :: M=M-K :: GOTO 830
840 J=H-G :: X=X+R^J*COS(B)
850 Y=Y+R^J*SIN(B)
860 MINX=MIN(MINX,X):: MAXX= MAX(MAXX,X):: MINY=MIN(MINX, Y):: MAXY=MAX(MAXY,Y)
870 DIFX=ABS(MAXX-MINX) :: DIFY=ABS(MAXY-MINY) :: SC=MAX(DIFX,DIFY) :: MULT=110/SC :: SC1=MAX(MAXX,MAXY) ::
SC2=MIN(MINX,MINY) :: CO=190/ABC(SC1-SC2)/1.3+20
880 NEXT I
890 X=A1 :: Y=A2
900 GOTO 330
1000 SUB GETC(A,C)
1010 C=A-INT(A) :: IF C>0.5 THEN C=1-C
1020 C=2/C
1030 SUBEND
1040 END
Go to top of page