[ Go to Stephen's Entry Page ]
contact - please use subject="pc99 page" to avoid spam trap!
This web page contains the text of articles for owners of the TI-99/4a from Issue 31 of TI*MES. It is of use to users of the TI-99/4a emulators.
Items from TI*MES Issue 31, Winter 1990-1991
RAMBLES FROM TI*MES ISSUE 31 - WINTER 1990-1991
Which Extended Basic?
I have been asked to write some summary type comments on the various XB's (Extended Basics)
Firstly, all versions of XB are based on TI XB, and are merely enhancements to it. All versions other than TI seem to have added some form of bit-map graphics- where you can draw in hi resolution
The original- Version 100
TI VERSION 100 is very rare, being the first, and contains a number of bugs, the more serious (for TI) being the incredible ease with which a non-expanded owner can remove the proprietorial PROTECTION feature which you can have with XB! which prevents programs being saved or listed.
Version 100 also worked on the basis that you always had 28 sprites in action, and was consequently rather slow unless (being expanded) you told it otherwise with a CALL LOAD.
The common one - Version 110
TI VERSION 110 is the more common version and forms the standard for which almost all XB programs are written. The most serious omission being the lack of bit map graphics.
Then came MECHATRONICS XB from Germany, a heavy module which tended to get a little hot. It had a very powerful but extremely complicated set up for bit map graphics, which, like TI Logo, was NOT bit map graphics but only redefined characters, consequently you could quickly run out ink.
Next on the scene was MYARC XB which has been around in a number of versions, the latest and definitive version being Vn 2.12 - this has the disadvantage of REQUIRING the Myarc 512k ram card, as the Ex Bas itself resides in RAM. This does allow for some increase in speed. The Myarc XB has good true bit map graphics, variable screen windowing with both 32 and 40 column text modes.
Myarc XB is in the form of a module which contains a loader plus ram, a disk, and a chip for the ram card.
Added extras include integer and real variables- with integer variables processing a little faster than real ones. You may set a default disk drive and subsequently omit "DSK1" when using OLD and SAVE or RUN. Because more VDP is available, Myarc XB can load AND run those very long TI Basic programs that will NOT load in TI XB, AND the TI Basic extra character sets ARE available in Myarc XB.
CALL CHAR is available from 0 to 255! and you may have 32 sprites. There is a full range of bit map graphics commands- draw, drawto, circle, point, rectangle, fill, write, dcolor, and uniquely you can determine if a pixel is on or off.
You may RUN many program format machine code programs directly.
DF8O files written for TI XB may require you to use a utility program to reset VDP registers, or may not function at all.
Myarc XB allows you to run many memory image files which otherwise would require a SuperCart (EdAs with 8k ram) as the Myarc module contains ram in the correct location.
Myarc has several unique abilities but does require the Myarc ram card- which is pretty handy anyway!
Triton Extended Basic
The latest version was TRITON SUPER EXTENDED BASIC which amalgamated a number of TI XB mods prepared for Gram device owners. Thus you have such useful new commands as CALL CHIMES, CALL ALOCK, CALL ALL, a very useful CALL CAT, CALL CLOCK (runs slow in the UK), GOSUB and GOTO with variables, but perhaps its most important features would be the enhanced editing features, which allow you to move, copy, delete or resequence PORTIONS of an XB program quite rapidly- a major use of my module- and also it has included on ROM a commercial machine code bit map graphics program called DRAW N PLOT.
This one allows you to plot bit map graphics, but only off screen- only when completed can you SHOW them, although there is a cursor on screen when you SHOW which allows direct editing.
Graphics can be saved and printed and the format is compatible with TI ARTIST.
There is a major conflict in use of VDP between the graphics and an XB program and hang ups may be frequent, especially if you PRINT the pic. Triton XB requires 32k ram for the graphics feature. There is a graphics program available (CLASS) for Triton XB.
[ My favourite Triton capability is CALL CAT to catalogue a disk drive directly from the command line. You can also skip the XB auto-load by holding down enter.]
The Missing Link
With all this talk of graphics it is worth adding that the program THE MISSING LINK will work with all versions except Myarc to add true bit map mode graphics., with plotting in or out of windows.
It does not bat an eye if you draw a line to a point off screen, and can dump a screen to printer at any time. Picture files on disk are compatible with TI Artist. TML is incompatible with the CLOCK command ot Triton XB.
TML is now my language of first choice for graphics, but suffers in not being able to tell me if a pixel is on or off.
The Missing Link is available from this websites download page for TI-99/4a emulator use.
Go to top of page
Got a Disk Drive? Suggested programs
NEW DISK DRIVE OWNER?
The world is your oyster, with many programs available at very low cost which compare well with PC programs costing LOTS more.
THE standard graphics program is TI ARTIST at about US$25, wel] supported with many disks of graphics, compatible with Triton XB, The Missing Link, RLE and so on.
THE MISSING LINK is well worth having especially if you have any interest in Bit Map Graphics. It too is US$25 and a demo disk is available from the Group Disk Library.
The Missing Link is available from this websites download page for TI-99/4a emulator use.
TI BASE is THE database for the TI, a fully featured database at US$25 which would cost lots more for any other computer. It is very close to dBase II. You can use it very simply or get stuck into its command language, macros, and so on. NOT easy, if you want something easy stick to the limited format PERSONAL RECORD KEEPING module!
The only significant word processor is TI Writer, which is a line orientated text processor with mail merge capability. It has been much enhanced in the form of FUNLWEB, available from the disk library, which includes also the TI Assembler plus a disk manager including sector editor. If you have a disk drive you must get Funlweb, and print out all the docs. You may not use all its features! but they are there.
Funlweb provides one "environment" for operating in- another is BOOT (disk library) which gives you an easy to configure menu for your disk, as well as the ability to catalogue and print from the menu screen.
All disk owners should have MCOPY (disk library) which will organise your disks in a more efficient manner, making disks with more than 16 files operate more quickly and with less wear and tear
Perhape a quick list of the programs I have on my main two utility disks may help- remember I have a strong interest in graphics!
In addition to the usual Funlweb package I have
T-SHELL, an XB utility which gives you disk catalog and file read functions in the background while you are programming in XB.
SQUEEZER a graphics utility which makes 4 tiny TI Artist pics from one full screen one., with different density levels for you to pick the best.
ARCHIVER- packs and unpacks backup disks for more storage on less disks. Must unpack to use!
UNBASHER- makes sense of XB programs with multistatement lines taken to excess, helps to unbug them!
VDP- allows you to use those early TI Basic programs which use Character Sets 15 and 16, in ExBas.
EXTRACTOR- allows you to quickly take out a part of an XB program for use elsewhere (Triton XB can also be used instead!)
RLE- graphics display and print program, TI Artist compatible.
ARTDISK and PHOTO from Harry Brashear (commercial) to print TI Artist pics.
TEXTLOADER allows you to take a program in DV80 text format and load it directly into the computer, no editing required.
MCPIX and PIXPRO are commercial graphics programs that enable you to see and print pics in McF1ix format.
Graphics: Truchet Tiles
How to describe this graphics program? We are if you like preparing a
potato (or lino) cut pattern composed of two quarter circles. These
can be printed in two possible ways, one being a 90 degree rotation of the other. The computer program places them randomly to produce
some interesting patterns. The program given uses RND to select numbers between 0 and 1, which are then converted to 0 and 1 values.
There are two fairly obvious shapes created- circles and dumbbells (two circles connected by a thin lobe).
IF our RND truly is random, we may expect that if we count the total number of tiles then there will be one eightieth that number of dumbbells, and a trifle over one twentieth that number of stand alone circles.
Instead of using RND we could say PEEK into memory locations and convert the values we find to binary (011100 etc) and use those 1's and 0's to produce a quite different pattern! Or try various uses of RND eg RESULT=(RND+RND/2) or RESULT=RND*RND and so on.
From Clifford Pickover "Computers, Pattern, Chaos, and Beauty".
100 ! TRUCHET TILE GENERATION from Pickover p.333
Truchet you ask? (OK you don't ask...). This idea dates back to 1704!
110 ! for XB+TML
120 ! S SHAW OCT 1990
130 ! easily converted to any other pixel graphic language or utility.
170 DX,DY=12 :: R=DX/2
180 JUMP= 180/DX :: OLDDATA=0
190 P1,P0=0.50000 ! 50/50
210 FOR J=1 TO 100*100
230 IF OLDDATA=0 THEN IF RESULT<P0 THEN D=0 ELSE D=1
240 IF OLDDATA=1 THEN IF RESULT<P1 THEN D=1 ELSE D=0
250 IF D=1 THEN GOSUB 340
260 IF D=0 THEN GOSUB 510 ! DOWN
280 IF (J/JUMP)=INT(J/JUMP) THEN YOFF=YOFF+DY :: XOFF=0
290 IF YOFF>200 THEN GOTO 290
310 NEXT J
340 CALL LINK ("PRINT",180,20,"UP")
350 IF OLDDATA=0 THEN XOFF=XOFF+DX
360 FOR I=90 TO 180 STEP 10
390 IF I=90 THEN OLDX=X :: OLDY=Y ELSE CALL LINK("LINE",OLDX,OLDY,X,Y) :: OLDX=X :: OLDY=Y
400 NEXT I
430 XC=XOFF-DX :: YC=YOFF+DY
440 FOR I=270 TO 360 STEP 10
470 IF I=90 THEN OLDX=X :: OLDY=Y ELSE CALL LINK("LINE",OLDX,OLDY,X,Y) :: OLDX=X :: OLDY=Y
480 NEXT I
510 CALL LINK("PRINT",180,20,"DOWN")
520 IF OLDDATA=1 THEN XOFF=XOFF-DX
530 FOR I=0 TO 90 STEP 10
560 IF I=0 THEN OLDX=X :: OLDY=Y ELSE CALL LINK("LINE",OLDX,OLDY,X,Y):: OLDX=X :: OLDY=Y
570 NEXT I
590 XC=XOFF+DX :: YC=YOFF+DY
600 FOR I=180 TD 270 STEP 10
630 IF I=180 THEN OLDX=X :: OLDY=Y ELSE CALL LINK("LINE",OLDX,OLDY,X,Y):: OLDX=X :: OLDY=Y
640 NEXT I
It is Fun to save this as TI ARTIST pics and then use the FILL to prove that this is a two colour pattern only. Also, by its nature, you can always align one printout with another, top or bottom or sides, to make your own very unique wallpaper, gift wrap, book covering etc.
The pattern is also suitable for an all-over fabric print and can be used with either very strongly contrasting colours or with two close shades oF the same colour for a more subtle effect.
Go to top of page
Hardware Modification - Load Interrupt Switch.
Hardware: Load Interrupt
I now have some information on a program many of you have which can use it!
At any time you can by means of a hardware switch tell the computer to stop what it is doing and go to a specific memory location and run the program it finds there. This has been used for example for dumping screen displays to printer, although it is also done (better) using a software interrupt, whereby the computer runs the main program and keeps taking time off to say scan the keyboard for a command key- effectively doing two things at once.
TI have provided us with a program which can use a load interrupt switch, although they did not tell us about it! It is the DEBUG program that comes with editor assembler, and this is how you utilise it...
Insert the Editor Assembler module, and have the disk with DEBUG on it in drive one. Choose TI Basic and type in and run this program:
100 CALL INIT
109 REM SEE NOTES BELOW RE LINE 110
110 CALL LOAD(8228,96,0)
120 CALL LOAD("DSK1.DEBUG")
130 CALL LOAD(-4,131,224,112,190)
140 CALL LOAD(8228,160,0)
150 PRINT "PRESS Q THEN (ENTER)"
160 CALL LINK("DEBUG")
This loads DEBUG.
Enter BYE and select an option of Editor Aseembler- eg LOAD AND RUN.
While the LOAD AND RUN (D/F 80) program you have selected is running- say a game! - press your load interrupt switch and you will be in DEBUG and can have a look around!
For the technically minded, pressing the switch causes the computer to do a BLWP to >FFFC where >FFFC contains the WS pointer and >FFFE contains the Program Counter. Line 130 above puts the addresses into these locations.
Now, ifyou have DEBUG in memory, then load a program, where is
debug going to be? Hmmm? The listing above places DEBUG out of the
way into ram area >6000 - which you need to provide! Either by
modifying an editor assembler module by adding 8k ram or by use of a
SUPER SPACE module or similar. Or omit lines 110 and 140, use only
relocatable code, and hope there are no clashee... Line 110 resets
FFAH (First Free Address in High Memory) to >6000 while line 140
chanqe5 it back to >A000
OK... that switch! You need to connect a simple switch between two tracks on the right hand port - using a speech synth is best as you don't then need to take the console apart.
First, just a simple switch, which due to what is called switch bounce, may send multiple signals to the CPU causing a crash (a good switch will work OK around 60% of the time!) then a slightly improved circuit.
Looking at the edge of the card, at the upper right of the console, pin 13 (LOAD) is the seventh pin from the left, on the bottom. This is one end of your switch. Inside the speech synth you will find that on the SAME side there are four tracks connected- 11,12, 13 and 14 from the left - this is the other end of your switch. For improved operation connect a 0.1mF bypass capacitor across the switch and a 2.2k resistor in series with it.
As ever, any hardware modifications are at YOUR risk!!
New Scientist 6th October 1990 reported that the manufacturer of a word processor which has a spell checker - WordPerfect - sent them a newsletter with these words: IMNAGES; SIMILARE; DESIGNE.
Puzzle - write a program to solve it.
Puzzle- write a program
Make a circle of fifty apples say, and to make life easier let's say one of them is at the 12 O'clock position which we shall call position ONE for reference purposes!
Starting at position one and counting clockwise, remove every tenth apple, continuing to count and remove until only TWO apples are left. What are there positions?
Suppose we have 49 apples to start with, and do the same thing... what are the final two positions?
Write a program to determine the answers to these two questions. Now try a generic program which allows you to input any number of apples and will yield the final two positions.
Now - take a dozen different inputs to your generic program and see if you can determine any pattern which would allow you to speed up your program- so it doesn't actually have to go round and round removing the apples! IS there a pattern? If you find one, write it into a program and test it against the first program with another dozen different number of apples!
submitted program follows in a bit...
Puzzle 2. A journey of 300 miles is undertaken in a car rented at $3 per hour plus fuel at $2 per gallon. What is the best (eg cheapest) speed? To be totally unreal, assume fuel consumption is 30 miles per litre at 30mph, 20 mpl at 60mph and 15mpl 75mph. eg an increase in speed of 3mph means one litre lasts 1 mile less.
Solve with a computer program.
Puzzle One - if you start at position 1 and the frst you remove is number ten, what are the numbers of the last two left?
100 ! JOHN SEAGER
110 OPTION BASE 1 :: DIM ARRAY(100)
120 CALL CLEAR :: INPUT “NUMBER OF ITEMS 3>100:": TOTAL :: IF (TOTAL>2)+(TOTAL<101)<>-2 THEN 120
130 FOR I=1 TO TOTAL :: ARRAY(I)=I :: NEXT I
160 MISS=MISS+1 :: NEWPOS=NEWPOS+1 :: OLDPOS=OLDPOS+1
170 IF OLDPOS>TOTAL THEN TOTAL-NEWPOS-1 :: OLDPOS,NEWPOS=1
180 IF TOTAL=2 THEN 210
190 IF MISS<10 THEN 150
200 OLDPOS=OLDPOS+1 :: MISS=1 :: GOTO 170
210 PRINT " ":"REMAINING: ":ARRAY(1),ARRAY(2)
Economic motoring puzzle- submitted program:
100 REM TI*MES COMPETITION
110 REM ISSUE 30 P53
120 REM PETER HUTCHINSON
180 FOR SP=1 TO 117
240 IF TOTAL==CHEAP THEN 270
270 NEXT SP
280 PRINT "CHEAPEST SPEED IS "
290 PRINT STR$(SPEED);&" MPL AT A COST OF "
300 PRINT "$ "&STR$(CHEAP)
Go to top of page
[This next piece - it is worth mentioning that it is unlikely that a single interview took place, and more likely that the book content quoted was put together from letters, or phone calls over a period of time. We will never know. It is an unfortunate journalistic habit to create "interviews" without disclosure. Nevertheless the content is interesting and as printed in the book, worth commenting on.]
User Group History (or not)
Remember 1983? Back when TIHOME was extinguished just before TI pulled the plug, leaving TI owners
in the UK with nothing to fall back on? I was interested in reading a review of US computer magazines
by Bill Gaskill to see that amidst the likes of Compute!, Enthusiast 99, 99'er Magazine, and The Smart
Programmer, there was TIdings - apart from the rather glossy IUG magazine, the only user group
publication to be listed. How nice I thought.
Now I have a copy of Free Software for your TI-99/4A published sometime in 1984 by Enrich Div/Ohaus in the USA.
This now very out of date book lists the IUG - which produced its last magazine in June 1984 - as
having 80,000 members (!!) - all TI owners - and gives the late Guy-Stefan Romano's San Francisco
address as that of the IUG Library. Of much more interest to us is the entry for the UK. The last issue of TIHOME was dated May 1983. There is an interview with Paul Dicks, indicating a membership
of 2,000. The article makes remarkable reading for those of us in from the start and is quite interesting history for you newer owners!
TIHOME - "Tidings from the British Isles"
Officer: Paul Dicks, president.
Newsletter: Tidings, six times yearly
Bringing TI to England
Paul Dicks founded TIHOME "because I was the only person I knew who owned a TI." Although there are
now twenty to thirty thousand TI owners in the British Isles, Paul's group is "virtually the only resource that TI owners have in England."
TI users face several obstacles, Paul explains. "Although the price of the TI home computer is reasonable, the British government encourages the BBC Acorn and won't give schools subsidies to purchase TI-99/4 computers. Also, the price of peripherals is almost prohibitive - we're really working on trying to improve this situation. At this time, there are probably only 12 disk drive owners in the entire British Isles!
[ I got my first disk drive in autumn, 1981. - SS.]
Third-party software is just beginning to appear.
[ Stainless Software commenced in 1982. I was selling software by Not Polyoptics, PS Software, Norton Software, Pewterware, Oak Tree Systems, FFF Software, Kuhl Software, Maple Leaf Microware - all advertised in Tidings- 5-page ad in May 83 issue! - and there were also ads in there by UK houses Lantern Software and Apex Software. - SS.]
but it's still difficult to even get a copy of 99'er Magazine from any source other than our service."
[ This "service" was never mentioned in Tidings - first I have heard of it! - SS.]
To help British TI users, Paul founded a by-mail support group that offers services and helps TI owners contact others in their area to form local users' groups.
Software and support
TIHOME offers members a resource for public domain software, some computer supplies, publications,
local contacts, and technical information. The software is cataloged by application, including games, graphics and demos, education, business, and utilities. Some of the offerings have a special flavor - such as "English Tennis."
The catalog indicates what peripherals are necessary and how much memory the program uses. Members
can order programs for one pound per program, or contribute a program and receive four for free.
TIHOME publishes a 100-page magazine six times yearly, which members receive as part of their annual
dues. The magazine offers editorials, comments, and advertisements by members; detailed software and
book reviews; and in-depth tutorials and program listings. A recent issue features Line Drawing Routine as part of a discussion on TI hi-res graphics, reviews of TI-Writer and game software, "Beginner's Basic," tutorials on Logo and Assembly Language, comments on computer shows and other activities, an in-depth article on concepting and programming adventure games, and reports from local user groups all over the British Isles.
"The TI-99/4 is still the best-made computer in its price range, even in England," Paul comments. Despite the obstacles, true British pluck has paid off. TIHOME's membership went up from 180 to 2,000 in a year, and it's still growing.
[In April 1982 there were 180 members in TIHOME. In August 1990, there were 158
members in the Texas Instruments TI-99/4A User Group UK. - SS.]
Me again now- no more quotes from the book. By the time the book was published TIHOME had been dead for at least 7 months! The comment on membership would place the interview at around April 1983 - about the time of the very last issue of Tidings. Only the last two issues ran to 102 pages. The Line Drawing Routine mentioned as being in a "recent issue" actually appeared in the last one, May 1983. A curious interview, especially in regard to its unfortunate timing!
Editor Assembler note
Editor Assembler and Cassette
We have previously advised of the difficulty of using the Editor Assembler module which insists that if you wish to use LIST DEVICE as PIO you must put a full stop after it.
Mike Poskitt has reminded me that if you wish to RUN PROGRAM and type CS1 to load a memory image machine code program then also you must add a full stop at the end, to enable multi-file programs to be loaded (some memory image format machine code programs may be on three, four, five or more files!).
And it is appropriate to remind you that if you have a cassette recorder, extended basic, and 32k ram, but no disk system., you can obtain a number of machine code games ON TAPE from our cassette librarian, and if the demand is there, more can be made available. It is possible to load maybe 70% of machine code programs from Cassette, including about 90% of games.
Go to top of page
Basic Programming - variables.
Nice bit of code here for you to look at. Let's suppose we have CAT=6 and DOG=9, how do we change those around? We could set up a, temporary variable like this:
10 CAT=6 :: DOG=9
But we can save a little variable storage space and produce more interesting code like this...
20 PET=CAT :: CAT=DOG :: DOG=PET
30 PRINT CAT;DOG
10 CAT=6 :: DOG=9
Try it- it works! And saving variable names is of great value if you are programming for THE MISSING LINK, which only has limited VDP space for variable storage.
20 CAT=CAT+DOG :: DOG=CAT-DOG :: CAT=CAT-DOG
30 PRINT CAT;DOG
Purely in the interests of science, ExBas programmers can tackle this another way, but it is slower:
10 CAT=6 :: DOG=9
SEE PAGES 42 TO 44 OF YOUR EXBAS MANUAL and note that this use of XOR will only work if both variables are less than 32767!
20 CAT=CAT XOR DOG :: DOG=CAT XOR DOG :: CAT=CAT XOR DOG
30 PRINT CAT:DOG
HUNCHBACK HAVOC. TI BASIC. Lantern Software.
This game comes from Lantern Software, a UK publisher of good quality games. In this one you move your man around the screen firstly putting out fires- you may need to unlock some doors, and can only carry EITHER a key OR a fire
extinguisher! Once all the fires are out, some gems appear for you to collect and then beat a hasty retreat to screen right before time runs out. You start with 300 time units. For increased game speed this is updated only once in each screen., when you have put all the fires out.
The various screens include handy things like lifts to go up and down in, and even speedy little cars! Graphics are good and game play is excellent.
No aliens to zap here. Just a good race game in which you must plan your moves carefully for a fast exit. The fires and gems are randomly placed so each play will offer a different challenge.
This is a game I still play from time to time, and I can readily recommend it to you. Disk owners will have problems moving it to disk due to its length!
This is a quote from the HCW review by "CE" who gave it four stars out of five “A very attractive presentation in which you collect jewels hidden in a nuclear powered castle. Guide Egor through the castle unlocking doors and tackling fires or other hazards in order to turn on the reactor which makes the jewels visible.
"There is a very short time limit betore the reactor explodes ending the game. The main difficulty is Egor cannot carry both key and the fire extinguisher so he must scuttle back and forth.
"Four screens show different parts of the castle. Hazards cone in six forms including electrical faults and gas leaks, dealt with in a similar fashion to fires. This does not add more difficulty but introduces some graphic variety. Since time is very limited I found it impossible to progress beyond screen four [well done, I haven't seen screen four yet! ss], so I cheated by increasing the tme limit so as to view all 24 screens- the same four repeated for six types of hazards. Play might become repetitive IF you get that far- not a problem for me though .... a well designed game with excellent graphics".
Hang Glider Pilot
HANG GLIDER PILOT. Extended Basic.
From the Canadian software house MAPLE LEAF MICROWARE
Formerly sold by Stainless Software in the UK, this excellent game was reviewed in Home Computing Weekly, a now departed UK magazine which reviewed software and printed listings. It earned the maximum award of five stars.
An interesting change to the usual flight simulators, you here are in charge of a hang glider, which you guide around an on-screen map. There is a sea to provide off-shore breezes, hills to bump into, forests to crash land into... you can steer and control rate of ascent/descent.
From a mountain top launch you have three aims in 1ife: 1. to stay alive- to land somewhere in one piece! 2. To stay in the air as long as possible. 3. To land in a small target area marked on screen. I have yet to master the last one, although I have managed to come quite close to it!
This is not an especially fast game, although quite fast enough as the mountain or the ground looms ever closer. Definitely challenging, and very well put together with lots of on screen information, including a rising and setting sun for time of day. The eagle shows you where there are thermals for gaining height!
The following description is from the UNISOURCE catalogue of 1984, a good resource of what was available:
"A hang gliding game and trainer... in which time and distance flown must be maximised and concluded with a safe precision landing. Use ridge lift generated by a morning coastal sea breeze (which becomes a land breeze in the evening) and thermals during mid-day. Wind and thermal strengths build and subside in a realistic manner. Various sized clouds and a soaring eagle help in locating the strongest thermals. Very realistic flight characteristics including stalling behaviour and flying and landing techniques."
Go to top of page
Airline AIRLINE Extended Basic. An ADVENTURE INTERNATIONAL game- best known as Scott Adams! who wrote the databases for the Adventure Module.
This unusual game of strategy is quite different and well worth getting hold of while you can! Never widely available- it was released after the pull-out. It is a sort of trading game in which you operate a fleet of aircraft around the States, represented by a grid of squares on screen. Each landing point has certain trading characteristics which are to be taken into account, and each type of plane you can operate has its own costs and benefits.
Hard to describe without repeating the docs, but it is a game of strategy OK? The computer plays fairly well and you will need to think to beat it. Not a shoot em up! Not a flight simulator! I play this one, what more do you want!
REVIEW: TI BASE UTILITIES: COMMAND FILE EDITOR and EVENTS CALENDAR by WILLIAM GASKILL 2310 Cypress Ct, GRAND JUNCTION, Co, USA, 81506
TI Base Utilities
I received these as a surprise! - on disk, together with issue V1N5 of THE TI-BASE USER, a newsletter on TI Base published by Bill, for a mere US$22 per year to UK subscribers (payable in US funds). You may well feel that the $22 is worth it for these utilities alone. Seeing how Bill puts his command files together is a real education, and may inspire you to bigger and better things with your copy of Tl BASE (commercial database published by Inscebot and also available from Texements).
There is already a utility to merge two command files together- the on board editor only allows a limited length command file, even though TI Base can in fact handle longer. As the 40 column editor allows the use of inverse characters, not available in DV80 command files, the MERGE utility allowed you to prepare several short files and then stick them together for use!
Having stuck them together how to amend them though! Too long to load into the on board 40 column editor!!!! CFE to the rescue, a well-featured editor especially to amend those merged files- though it will not allow insertion of reverse video characters, it will not delete them either!
The CFE utility is in EXTENDED BASIC and uses a 40 column machine code utility by Brad Snyder. There are the usual editing facilities, including disk catalogue, save, load, insert/delete line [ a little slow those two! ], insert/ delete character etc. You can dip back to XB command mode then type RUN again, should that be necessary though you will need to reload your text. Very nicely written and very useful.
EVENTS CALENDAR is intended as a demonstration of using TI Base and the command files are well eorth printing and examinging. It is also a simple but effective diary system, with three fields- date (MM/DD/YY), day (MON), and event (65 chars).
You can check to see if anything is listed against the date you entered when TI Base was loaded, or against any data, or day, and there is a FIND utility for the EVENT field. which can find HOLIDAY if you search for OLI!
There is also a QUERY EDITOR which is worth a close look as it is something you may wish to copy in your own creations.
If you have TI base, the newsletter (with these utilities) has to be an essential purchase. and if you do not have TI
REVIEW- REMIND ME.
JP SOFTWARE. US$15.00 plus p&p
My personal life is so complex that my appointments for the year easily fit onto a single sheet of paper, but if I ever needed to keep a diary, this program is one I night consider, certainly if I did not have TI Base and Events Calendar!
The basis of the program is as follows: You select a month/year and that month is displayed on screen in usual calendar format.
You may move around to select a specific day, and check to see what is listed for the day, or edit the entry for the day, which is virtually a full screen of data.
You may print out the entries for any day or series of days within the displayed month- print outs are in two columns of 40 characters.
And there is a splendid FIND routine which operates quite quickly. Let's say you wanted to find every day in the month with the word LUNCH in the data. Type in the word and if LUNCH appears anywhere in the data for a day, a tick will appear in the calender box. and you can move the cursor to the box and check the full date.
If the date has any data there is a blob in the box, empty boxes have no data.
A fairly simple utility- useful utilities generally are simple!- and if you need computer assistance to keep track of yourself, this one is well worth lookinq at.
REVIEW- BOOK- COMPUTERS, PATTERN, CHAOS AND BEAUTY Computers, Pattern, Chaos and Beauty
Clifford A Pickover. Hardback. 391 pages.
PUBLISHER: ALLAN SUTTON PUBLISHING. Around 25.00
Not a cheap book this, but a thoroughly splendid read for anyone interested in the odd graphics programs I have offered from time to time in TI*MES, including some in this issue from this book.
The 27 pages of references are really useful, especially the details of the very many newsletters and magazines you can look to for more graphics experimentation.
Although you are invited to write to the author for a free copy of his magazine. his address is omitted- it is suggested you write to his US publisher, but THEIR address is also omitted- anyone interested. contact me. Addresses ARE given for other publications- so many!
(Clifford did write back to me to say he had ceased publishing his magazine, anyway!)
There are 17 chapters. and sub headings include:
Bach, Beethoven, The Beatles;
Cartoon Faces in Education;
FM Synthesis of Speech;
image Processing of the Shroud of Turin
Is there a double smoothly undulating integer?
Wild Monopodial Tendril Plant Growth;
A note on oculatory packing ....
Yes there are long words in there! but used with skill and even itfyou failed math and cannot follow the equations. there is much of general interest.
The "recipes" for programs are very very basic program descriptions, quite adequate to work up into graphics programs you can play with. And there are some beautiful illustrations, in mono and colour (and an address for poster versions!- one appeared in a Daily Telegraph supplement in August).
This IS a serious book, one worth looking at again and again, which raises all sorts of questions and ideas of a computer related type. If you are not afraid to wet your feet, it is a good book to start with in exploring serious and semi-serious graphics, and maybe to explore the possibilities of computers a little more.
My copy contained an error in Pseudocode 10.1 on page 153
It says: theta=theta+angle(i) but
should read: theta=theta+angle(j)
Recommended for the adventurous!
Go to top of page
SOFTWARE REVIEW- ROCK RUNNER by Eric LaFortune Rock Runner
Distributed by Asgard Software
Disk US$12.95 plus post and packing US$3 air mail
REQUIRES| Disk drive, 32k ram. EDITOR ASSEMBLER MODULE (no other module works!)
This bit is written by Asgard:
"You are about to experience one of the most remarkable arcade qames ever written for the TI99/4A computer, and certainly the best new game for the TI in years. Not only is Rock Runner a qreat game, it is also a technical feat that pushes the 4a to the limits. Written on a cassette system with the minimemory module, Rock Runner utilizes a graphics mode never before seen in any other TI-99/4A or Geneve program- game or otherwise.
Dubbed "half bitmap" this new Graphics mode mixes the color capabilities of bit map mode with the speed and flexibility of pattern mode graphics to allow an unprecedented anount of full colour animated graphics!
Combine this with excellent sounds. beautiful animation, and fantastic action, and you get a game that puts to shame anything on the Atari, Nintendo. Commodore or anything on any other home computer. Rock Runner is a herculean effort, a stunning introduction to the work of this young author."
This next bit is written by Mike Poskitt: WOW!
Superlatives aside this IS indeed a very enjoyable game.
The object of Rock Runner is to move your character around the playing area usinq joystick 1 or 2, picking up a specific number of diamonds to enable you to move to the next level. The playing area scrolls in four directions and the total area is about nine times the visible screen area.
As the character moves he digs a tunnel through which various monsters (from level two upwards) can persue him. His progress is also impeded by rocks which may fall on him if he tunnels beneath them. In later levels other obstacles are encountered (such as expanding acid pools) and you need to drop bombs and lay traps to destroy monsters which will then turn into the diamonds needed to progress to subsequent levels.
If this isnt enough to keep the adrenaline flowing, you are also fighting against a time factor.
There are 15 levels and you may start at any level, which saves the boredom of repeating easier levels at future attempts.
The accompanying instruction leaflet is more than adequate and even offers advice on strategy.
All in all this is an excellent machine code game
EXTENDED BASIC TUTORIAL (c) by Tony McGovern of Funnelweb Software PART TWO.
Extended Basic Tutorial
This article is a revised version of one which originally appeared in the newsletter of the Australian group TISHUG.
III. SUBPROGRAM PARAMETER LISTS
In this chapter we are going to go into the details of writing subprograms. Most of the fiddly detail here concerns the construction of the parameter lists attached to CALL and SUB statements, and some of the little traps you can fa11 into.
Any information can be transmitted from the CALLing program to the CALLed subprogram via the parameter list, and anything not transmitted this way remains private for each program, with the exception of the DATA pool which is equally accessible to all.
If something is mentioned in the parameter list then it is a two-way channel unless special precautions, provided for in XB, are taken. In that case the CALLing program can inform the subprogram of the value of a variable, but not allow the CALLed program to change the value of the variable as it exists in the CALLing program.
Arrays however, numeric or string, can't be protected from the fol1ies of subprograms once their existence has been made known to the subprogram through the parameter list.
Let's for starters take a very simple but useful example, where a program needs to invoke a delay at various points. Now some BASICs (and TI LOGO have a built-in function called WAIT. XB doesn't have this command so you have to program it. It can be done by a couple of CALL SOUNDS or with a FOR-NEXT loop.
Let's use an empty loop to generate the delay, about 4 millisec each time around the loop, and place the loop in a subprogram.
230 CALL DELAY(200) ...etc
This is easier to follow when editing your program than using a GOSUB.
670 CALL DELAY(200/D) ...etc
990 CALL DELAY(T) ...etc
3000 SUB DELAY(A):: FOR I=1 TO A :: NEXT I ::SUBEND
[ sjs- you GOTO a line, GOSUB to a sub routine, and CALL a sub program ]
GOSUBing or GOTOing out of a subprogram is verboten.
Using a sub program is less messy than writing the delay loop every time. The example shows several different CALLs to DELAY. The first supplies a number, and when DELAY is CALLed, the corresponding variable in the SUB list, A, is set to 200.
This is a particular example of the kind of from LINE 670 where the expression 200/D is first evaluated before being passed to DELAY to be assigned to A. Variable D might for instance represent the level oi difficulty in a game.
The CALL from line 990 invokes a numeric variable T, and A in the subprogram is set to the value of T in the CALLing program at the time when the CALL is executed.
Nothing untoward happens to T in this example, as the DELAY subprogram does nothing to change A.
Now it may not matter in this instance if T did not retain its value after the subprogram CALL. Suppose instead the delay was to be called out in seconds.
Then a subprogram on the same lines DELAYSEC might go :
230 CALL DELAYSEC(2) ...etc
Now after DELAYSEC has been executed with the CALL from 990, T will have value 250 times its value before the CALL.
990 CALL DELAYSEC(T) ...etc
4000 SUB DELAYSEC(A):: A=A*250
4010 FOR I= 1 TO A :: NEXT I :: SUBEND
This won't be a bother if you don't use T again for its previous value. If the CALLing program specifies a numeric constant as in line 230, or a numeric expression, the change in A in the subprogram has no effect on the main program.
Suppose you can't tolerate T being changed in line 990 (and this kind of thing can be a source of program bugs). You will find that XB allows for forcing T to be treated as though it were an expression, thus isolating T from alteration by the subprogram, if T is enclosed in brackets in the CALL (not SUB) list. Suppose DELAYSEC is called from this line:
970 CALL DELAYSEC((T))
If this CALL in line 970 is followed by the CALL from line 990, T not having been altered in the meanwhile, the same delay will be obtained, but if the order of CALLs were reversed the second delay would be 250 times the first.
In the language of XB this is known as "passing by value" as distinctfrom "passing by reference". This can only be done for single variables or particular array elements, which behave like simple variables in CALL lists.
Whole arrays cannot be passed by value, but only by reference. Expressions and constants can only be passed by value, and its hard to see what else could be done with them.
In the example as written,a different variable name was used in the SUB, but it wouldn't make any difference if T had been used in the sub list instead of A.
Now let's complicate things a little by flashing up a message on the bottom line of the screen during the delay interval.
200 CALL MESSAGE(300," YOUR TURN NOW") ...etc
The SUB parameter list now contains a numeric variable and a string variable in that order. Any CALL to this subprogram must supply a numeric value or numeric variable reference, and a string value or string variable reference, in precisely the same order as they occur in the SUB list. In the little program segment above, line 200 passes constants by value and line 270 passes variable references. There is no reason why one cannot be by value and one by reference if so desired.
270 CALL MESSAGE)T,A$) ...etc
3000 SUB MESSAGE(A,A$):: DISPLAY AT(24,1):A$
3010 FOR I=1 TO A :: NEXT I :: DISPLAY AT(24,1): ""
This process can he extended to any number of entries in the parameter list, provided the corresponding entries in the SUB and CALL lists match up entry by entry, numeric for numeric, string for string. The XB manual does not say so explicitly, but it appears that there is no limit apart from the usual line length problems, on the number of entries in the list. This is the only apparent difference between the parameter list in XB subprograms and the argument lists for CALL LINK("xxxxxx", , ... ) to machine code routines in XB, and Minimemory and E/A Basics.
One little freedom associated with built-in subprograms is not available with user defined subprograms. Some built-ins, such as CALL SPRITE permit a variable number of items in the CALLing list. Parameter lists in user defined subprograms must match exactly the list established by the SUB list or an error "INCORRECT ARGUMENT LIST in ..." will be issued. To compensate for this inflexibi1ity user defined CALLs allow whole arrays, numeric or string, to be passed to a subprogam. Complete arrays may be passed by reference only. Individual array elements may be used as if they were simple variables and may be protected from alteration by bracketing in the CALL list.
An array is indicated in the parameter list by the presence of brackets around the array index positions. Only the presence of each index need be indicated as in A( ).
MATCH( , , ) indicates a three-dimensional array MATCH previously dimensioned as such, explicitly or implicitly.
Don't leave spaces in the list. If the subprogram needs to know the dimensions of the array these must be passed separately (or as predetermined elements of the array). TI Basics are weaker than some others in that they do not permit implicit operations on an array as a whole, a very annoying deficiency.
Arrays may be DIMensioned within subprograms. This will introduce a new array name to the program, and an array or variable name from the SUB parameter list can't be used or an error message will result. In the following code the main program passes, among other things, an array SC to subprogram BOARD (perhaps a scoreboard writing routine in a game).
100 DIM SC(2,5) :: ...etc
BOARD generates internally an array AY( ) which is passed to another subprogram REF (maybe this resolves ties) along with SC( , ), which BOARD knows as S( , ), and REF in its turn as B( , ) -- the same name could have used in all places. There is however no way that the main program or any subprogram whose chain of CALLs doesn't come from BOARD can know about the array AY( ). This would hold equally well for any variable or array, string or numeric, first defined within BOARD and whose value has not been communicated back to the CALLing program via some other variable mentioned in BOARD's parameter list.
450 CALL BOARD(P, A$( ),SC(,))
4000 SUB BOARD(P, A$( ),S(,)) :: DIM AY(5) :: ... ETC
:: CALL REF(P,AY( ),S(,)))
5000 SUB REF(V,A( ),B(,)):: ...etc
By following this line of reasoning you can see that there is no way for a subprogram whose chain of CALLs does not come through BOARD to know about array AY( ). The only way around this is for AY( ) to be DIMensioned in the main program (even if this is its only appearance there) and the message passed down all necessary CALL-SUB chains.
This idea of DIMensioning an array only within a subprogram is particularly useful if the array is to READ its values from DATA statements and to be used in the subprogram. This could be done again from any other subprogram needing the same data., without having to pass its name up and down CALL-SUB chains. Remember that DATA statements act as a common pool from which all subprograms can READ. If the array values are the results of computations then these values must be passed through the CALL parameter lists.
For completeness note that , although the XB manual has nothing to say about it, IMAGE statements for formatting PRINT output are accessible from any part of a program in the same way as DATA statements and not confined to the subprograms in which they occur as are DEF entries.
It is not necessary to have any parameters in the list at all. Subprograms used this way can be very helpful in breaking up a long program into more manageable hunks for ease of editing. We shall also see in later chapters that there can be other benefits as well.
One more XB statement for subprograms remains, the SUBEXIT. This is not strictly necessary as it is always possible to write SUBEND on a separate line and to GOTO that line if a condition calling for an abrupt exit is satisfied. Like a lot of the little luxuries of life however, it is very nice to have and makes programs much easier to read and edit. It does not replace SUBEND which is a signal to the XB pre-scan to mark the end of a subprogram. SUBEXIT merely provides a gracious and obvious exit from a subprogram (awkward in some Pascals for instance). The next chapter will demonstrate typical examples of its use.
Note inserted by Stephen: Please do read these articles very carefu11y. Tony is an excellent ExBas programmer, and these notes should be of assistance to every ExBas owner. Tony wrote this as a result of what he considered to the the appalling quality of some ExBas programs he has seen! Now back to Tony....
IV. USEFUL SUBPROGRAM EXAMPLES
In the previous chapter we used as an example a DELAY subprogram which could, with a little refinement, be used to substitute for the WAIT command available in some other languages. You can extend this idea to build up for yourself a library of handy-dandy subprograms which you can use in programs to provide your own extension of the collection of subprograms that XB offers.
For our first example let's take one of the more frustrating things that TI did in choosing the set of built-in subprograms. If you have minimemory or E/A you know that the keyscan routine, KSCAN, returns keyboard and joystick information simultaneously, while XB forces you to make separate subprogram CALLs, KEY and JOYST, to dig it out. Since these GPL routines are slow it is difficult to write a fast paced game in XB that treats keyboard and joysticks on an equal footing as is done by many cartridge games.
On the other hand in games where planning and not arcade reaction is of the essence there is no reason why the p1ayer(s) should be forced to make a once-and-for-all choice and not be able to use either at any stage of the game.
The subprogrammers approach to this problem, once he realised that it can be done (and we have commercial XB games where the writers haven't) is to write the game using joysticks, but replacing JOYST by a user defined sub-program JOY which returns the same values as JOYST even when keys are used.
The first step in telling whether keys or joysticks are being used is to check the keys., and if none have been pressed then to check the joysticks. If a key has been pressed then its return, K, has to be processed so that the direction pads embedded in the keyboard split-scan return the corresponding JOYST value. A subprogram along the lines of the one used in TEX-BOUNCE does just this.
900 SUB JOY(PL,X,Y) :: CALL KEY(PL,K,ST) :: IF ST=0 THEN CALL JOYST(PL,X,Y) :: SUBEXIT
PL is the player (left or right joystick or side of the split keyboard) number and is unaltered by the procedure.
910 X=4*( (K=4 OR K=2 OR K=15)-(K=6 OR K=3 OR K=14 ))
920 Y=4*( (K=15 OR K=14 OR K=0) - (K=4 OR K=5 OR K=6 ) )
The simple-minded approach for converting K to (X,Y) values by using the XB logic operators (one of the more annoying omissions from console Basic) seems to work as well as any. The subproqam as written checks the keys first but balances this out by putting the processing load on the key return.
This is as good a time as any to sharpen your own skills by working out alternative versions of this procedure, and also by writing one for mocking up a substitute CALL KEY routine to return direction pad values even if a joystick is used.
[ TEX BOUNCE aka TXB is available from our Disk Library! and for
download from this site for TI-99/4a emulators.]
Go to top of page
Tips taken from XB 16 by Jim Swedlow, User Group of Orange County, California, ROM.
Extended Basic Tips
ASC AND SEG$
A common coding for determining the ASCII value of the first character of a string is:
This can be simplified by omitting the SEG$ function:
ASC always returns the ASCII value of the first character of the string. You will get an error if A$ is a null string (if A$="").
Suppose you want to lop off the first four characters off a string You might do this:
Our 4A's, however, do not compare the third value in the SEG$ function (the length of the new string) to the length of the old string. Therefore, this works just as well:
use 255 as that is the maximum length of a string variable.
If the length of A$ is less than 5 - even if it is zero - the new A$ will be a null string (but NO error).
One way to ask for a menu selection is to ask the user to input the first letter of his/her choice. Suppose that the options were
IF your user inputs a null, the POS Function will return a value of 1 and control will transfer to the first line in the GOTO list. If this is a problem, do it this way:
[C]hange, [P]rint, or [Q]uit. You might do this:
190 ACCEPT AT(10,10)SIZE(-1)
IF A$="C" THEN 230 ELSE
IF A$="P" THEN 340 ELSE
IF A$="Q" THEN 980 ELSE 190
A simpler way would be to use POS
190 ACCEPT AT(10,10)SIZE(-1)
ON POS("CPQ",A$,A) GOTO 230,340,960
190 ACCEPT AT(10,10)SIZE(-1) VALIDATE("CPQ"):A$ ::
IF A$="" THE N 190 ELSE ON POS("CPQ",A$,1) GOTO 230,340,960
(Source: a Tigerclub program)
DIM's and SUBPROGRAMS
Will this program work?
10 DIM A(5)
20 CALL SETUP(A( ))
30 SUB SETUP(B( ))
40 FOR I=1 TO 10
60 NEXT I
Answer: It will crash in line 50 when I=6. Once A has been DIMensioned in line 10, the process of calling SETUP in line 30 transfers the DIMension to B within SETUP. In essence, there has been a DIM B(5) inside SETUP.
Note that a STOP is not needed at the end of line 20. Your 4A will not execute a SUBPROGRAM unless it is CALLed.
The Missing Link is available from this websites download page for TI-99/4a emulator use.
1 ! XB + THE MISSING LINK
2 ! Stephen Shaw August 90
4 ! from COMPUTERS PATTERN CHAOS AND BEAUTY 1990 by Clifford A Pickover
6 ! Produces patterns from a sequence of turtle like
variables- repeats of
length/angle/number of times
7 ! Random values below will
often go off screen as no
scaling is used. Plan and
fill variable arrays with
your own values!
100 CALL LINK ("CLEAR")
120 RANDOMIZE :: SETS=INT(RND*5+1) :: CALL LINK ( "CLEAR")
:: CALL LINK("PRINT",180,50,STR$ (SETS) )
130 REM LENGTH ARRAY
140 DIM L(10)
150 FOR I=1 TO SETS
170 NEXT I
180 REM ANGLE ARRAY
190 DIM A(10)
200 FOR I=1 TO SETS
210 ANG=RND*36O :: IF ANG<12
OR ANG>35O THEN 210 ELSE IF
(ANG>160)AND(ANG<210) THEN 210
230 NEXT I
240 REM REPEAT ARRAY
250 DIM R(10)
260 FOR I=1 TO SETS
290 NEXT I
300 OLDX , X=90 : : OLDY,Y=110
310 THETA=0 :: LL=O
320 FOR I=1 TO CT*1.3333
340 FOR J=1 TO SETS
360 FOR K=1 TO R(J)
370 CALL LINK("PRINT",2,3,STR$(I)&":"&STR$(J)&":"&STR$(K))
380 LL=LL+1 ! # OF VERTICES
400 THETA=THETA+A (J) :: IF THETA>=2*PI THEN THETA=THETA-2*PI ! 360 IN RADIANS
420 Y=L(J)*COS (THETA)+Y
430 CALL LINK("LINE",OLDX,OLDY,X,Y):: OLDX=X :: OLDY=Y
440 NEXT K
450 NEXT J
460 NEXT I
470 CALL LINK ("PRINT",180,30,"ANY KEY FOR ANOTHER" )
480 CALL KEY(5,N,B):: IF B<1 THEN 480 ELSE RANDOMIZE :: GOTO 100
1 ! XB + THE MISSING LINK
2 ! STEPHEN SHAW AUG 1990
4 ! How random is a sequence
of numbers? This program
uses the RND Function but
can take any list of values,
6 ! From Computers Pattern
Chaos and Beauty 1990 by C A
8 ! If series is by chance
pattern should stay on
screen, preferably with in
central circle (ova1!)
110 SEED=INT (RND*256) :: RANDOMIZE SEED
120 CALL LINK("PRINT",3,200,STR$ (SEED) )
130 CALL LINK("BOX",1,1,192,240) :: CALL LINK("CIRCLE",96,120,35)
140 X,OLDX=96 :: Y,OLDY=120
150 CALL LINK("PIXEL",X,Y)
170 C=INT (RND*8)
180 ON C+1 GOSUB 230,240,250,
190 CALL LINK("LINE",OLDX,OLDY,X,Y) :: OLDX=X :: OLDY=Y
200 GOTO 170
230 X=X-3 :: Y=Y+3 :: RETURN
240 Y=Y+3 :: RETURN
250 X=X+3 :: Y=Y+3 :: RETURN
260 X=X-3 :: RETURN
270 X=X+3 :: RETURN
290 X=X-3 :: Y=Y-3 :: RETURN
290 Y=Y-3 :: RETURN
300 X=X+3 :: Y=Y-3 :: RETURN
[2014- alternative coding to the gosubs and returns in lines 180 and 230-310:
Change 170 to
170 C=INT (RND*8) +1 then
180 X=X+(C=1)*-3 :: X=X+(C=2)*-3 :: X=X+(C=3)*-3 :: X=X+(C=4)*3 :: X=X+(C=5)*3 :: X=X+(C=6)*3
185 Y=Y+(C=2)*3 :: Y=Y+(C=3)*-3 :: Y=Y+(C=5)*3 :: Y=Y+(C=6)*-3 :: Y=Y+(C=7)*3 ::Y=Y+(C=8)*-3
and delete 230-310.
Experimentation with the visualisation:
Our understanding of randomness is weak. What we are really doing here is visualising the distribution in a chain of data. The initial code shows us the TI99/4a's random number generator at work. We can then modify this code to illustrate a totally non-random sequence as follows:
after making the changes immediately above, now make the following change
which causes the value of C to move repeatedly from 1 to 8 in sequence, not at all random.
(In TI Basic and ExBas a logic true is -1, so we have to put a minus in front of (C<8). In basics where true=plus 1, we would not use the negative here).
The order given is deliberate. You can experiment with differing orders of C by placing the values in a dataset and reading it to an array. Insert the following amended code:
50 DIM AR(10)
60 FOR I=1 TO 8 :: READ J :: AR(I)=J :: NEXT I
70 DATA 1,4,2,7,3,6,5,8,0
170 FOR I=1 TO 8 :: C=AR(I)
195 NEXT I
We can then go a little farther to see what our initial random coding looks like if we throw a spanner in the works and make say every 20th choice a fixed number - something like this (amendment to the main listing):
170 SP=INT(RND*22):: C=INT (RND*8)+1 :: IF SP=20 THEN C=7
See how the plot changes? Try different values of C from 1 TO 8. If the graphic remains in the circle the numbers could be more random or absolutely not random, but if there is a bias towards (or away from) one value, we can see it quite quickly.]
Go to top of page
A bifurcation plot - with similarities to the affine plots we have given
in earlier issues- it is slow! It is based on a code in Clifford Pickovers recent book reviewed elsewhere in this issue.
100 ! BIFURCATION PLOT
GENERATOR - PICKOVER
110 CALL LINK("CLEAR"):: RANDOMIZE
120 MN=56 :: MX=74
121 ! FULL-ISH PIC WOULD BE MN 0 TO MX 125
122 ! CHAOS RULES FROM 59 UP
123 ! MAKES CHAOS FARTHER AWAY
124 ! HIGHER VALUE INCREASES CHAOS
130 BETA=5 ! LOW VALUE 3
140 RS=180 :: PLOT RESOLUTION
150 X0=1.95 ! START VALUE FOR Xt [t=0]
160 N=90 ! ITERATION COUNT
USE HIGHER FOR MORE CHAOS
MORE PATIENCE NEEDED
170 RSC=RS/ (MX-MN) :: CS=48
180 FOR LA=MN TO MX STEP (MX-MN)/RS
190 CALL LINK("PRINT",1,120,STR$ (LA) )
210 FOR I=1 TO N+10
230 IF I<11 THEN 250
240 CALL LINK("PIXEL",(LA-MN)*RSC+11,X*CS)
250 NEXT I
260 NEXT LA
270 CALL LINK ( "PRINT",1,1,"MN"):: CALL LINK("PRINT",1,18,SEG$(STR$(MN),1,3))
280 CALL LINK("PRINT",1,48,"MX") :: CALL LINK("PRINT",1,75,SEG$(STR$(MX),1,3) )
290 CALL LINK("PRINT",1,110 "B") :: CALL LINK ( "PRINT",1,120,SEG$(STR$(BETA),1,3 ))
300 CALL LINK ("PRINT",1,160,"X0") :: CALL LINK ("PRINT",1,180,SEG$(STR$(X0),1,4) )
310 CALL KEY(5,A,B) :: IF B<1 THEN 310
320 MN=RND*150 :: MX=MN+RND*100 :: BETA=3+RND*3 :: X0=RND*3+0.01 :: CALL LINK("CLEAR") :: GOTO 160
Egg Tile Generator
An earlier program printed patterns of circles using a simple modulus method of deciding if a pixel was on or not. The following program can produce much more complex patterns but again uses a modulus decision making method. The second simpler form uses variable values which produce a very regular pleasing pattern. This program is to experiment with. Instead of using SIN(X)+SIN(Y) try other formulae! And let me have any good patterns - formulae and variable values.
By all means set R higher, it just takes longer! And you can plot "to the right" or "to the bottom" by using say FOR I=50 TO R+50 and then when LINKing to PIXEL instead of I use I-49 for the plot.
I especially like the patterns when B1=-5, B2=-10, G=66, A=9, and M=2.
What happens to a pattern when you halve or double the value of G and leave other variables unchanged?
To see how amending G or M varies the pattern, try say putting in a new line:
205 A=INT(I/12)+2 or
Have fun, experiment, and share your discoveries!
If you don't have the Missing Link (commercial) program, these programs are easily adopted for ANY program that allows BIT MAP (PIXEL) plotting! The Missing Link is available from this websites download page for TI-99/4a emulator use.
95 ! PATTERN MAKING PROGRAM IN TI XB REQUIRES THE MISSING LINK.
Can be re - written for other bit map languages/utilities.
96 ! from egg tile generator page 242 of Computers Chaos Pattern
and Beauty by Clifford A Pickover.
97 ! for ti by S Shaw 1990
109 ! R= number of pixels down and across of pic.
118 ! must use INT function for M.
119 ! b1,b2=phase shift of sine wave, minor adjustments
120 B1=INT (RND*5)+6*-1
130 B2=INT (RND*9)+12*-1
139 ! g= frequency of sine wave, main pattern determinator.
140 G=INT (RND*240)+60
149 ! a=degree of disorder, low a=good order
150 A=INT (RND*6)+4
159 ! m=modulus, degree of pattern density- m low=more pixels on. Also affects pattern.
160 M=INT (RND*2)+2
170 CALL LINK("PRINT",20,160,STR$(B1)) :: CALL LINK("PRINT",40, 160,STR$(B2)):: CALL LINK("PRINT",60,160,STR$(G))
180 CALL LINK("PRINT",80,160,STR$(A) ) :: CALL LINK("PRINT" ,100,160,STR$(M))
200 FOR I=1 TO R :: FOR J=1 TO R
220 Y=B2+ (G*J)
230 Z=A*(SIN(X) +SIN(Y))
240 C=INT (Z)
250 IF C/M=INT(C/M) THEN CALL LINK("PIXEL",I+10,J+10)
260 NEXT J :: NEXT I
270 CALL LINK ( "PRINT", 172,20,"ANY KEY ")
280 CALL KEY(5,Z,X):: IF X<1 THEN 280
290 GOTO 100
= = = = = = = = =
Or in a much simpler form
100 REM EGG TILES
200 FOR I=1 TO R :: FOR J=1 TO R
220 Y=B2+ (G*J)
250 IF C/M=INT(C/M) THEN CALL LINK("PIXEL",I+10,J+10)
260 NEXT J :: NEXT I
270 CALL LINK("PRINT",172,20, "ANY KEY ")
280 CALL KEY(5,Z,X) :: IF X<1 THEN 280
290 GOTO 100
Go to top of page
Well yes, this IS a graphics program, but it is NOT a Fractal program, not even a chaotic program! (Shock, horror!).
Randomised cartoon faces
What this program does is draw a face! The facial features are set by ten parameters.
The program is written in XB for use with The Missing Link but it can easilky be modified for use with other graphics programs that allow pixel addressing. The image is small enough to be used with the TI BASIC listing given in an earlier issue.
Notice how much work the computer is doing to draw a smiling or frowning mouth!
100 ! PICKOVER B3 P327 FACES
120 FOR I=1 TO 10
130 P(I)=5+INT(RND*6)-INT(RND*6):: CALL LINK("PRINT",I*10+40,120,STR$(P(I)))
140 NEXT I
150 CALL HEAD(P(1))
160 CALL EYE(P(2),P(7),P(8))
170 CALL PUPIL(P(3),P(7))
180 CALL EYEBROW(P(4) )
190 CALL NOSE(P(5))
260 CALL MOUTH(P(9),P(6),P(10))
210 CALL LINK("DUMP") ! TO PRINTER
220 FOR I=1 TO 500 :: NEXT I :: CALL LINK( "CLEAR") :: RUN
400 SUB HEAD (P1 )
404 DEF CD(X)=COS(X/180*PI )
407 DEF SD(X)=SIN(X/180*PI)
410 EX,EY=0 :: R=30
420 IF P1>5 THEN EX=(P1-5)*2 ELSE IF P1<5 THEN EY=ABS((P1-5)*2)
430 FOR T=1 TO 360
460 IF T=1 THEN CALL LINK("PIXEL",Z-Y,X)
470 IF T<>1 THEN CALL LINK("LINE",Z-OY,OX,Z-Y,X)
480 OX=X :: OY=Y
490 NEXT T
510 SUB EYE (P2,P7,P8)
514 DEF CD(X)=COS(X/180*PI)
517 DEF SD(X)=SIN(X/I80*PI)
520 EX , EY=0 :: R=5
530 IF P2>5 THEN EX=(P2-5)*2 ELSE IF P2<5 THEN EY=ABS((P2-5)*2)
560 FOR T=1 TO 360
590 IF T=1 THEN CALL LINK("PIXEL",Z-Y,X)
600 IF T<>1 THEN CALL LINK("LINE",Z-OY,OX,Z-Y,X)
610 OX=X :: OY=Y
620 NEXT T
630 FOR T=1 TO 360
660 IF T=1 THEN CALL LINK("PIXEL",Z-Y,X)
670 IF T<>1 THEN CALL LINK("LINE",Z-OY,OX,Z-Y,X)
680 OX=X :: OY=Y
685 NEXT T
700 SUB PUPIL (P3,P7)
710 PS=P3/5 :: IF PS=0 THEN PS=0.1
720 FOR K=PS TO 0 STEP -0.2
730 CALL LINK("CIRCLE",Z-60,
40-P7,K):: CALL LINK("CIRCLE",Z-60,60+P7,K) :: NEXT
800 SUB EYEBROW(P4)
840 CALL LINK("PIXEL",Z-Y1,35)
850 CALL LINK("LINE",Z-Y1,35,Z-Y2,45) 860 CALL LINK("PIXEL",Z-Y2,55,Z-Y1,65)
870 CALL LINK("LINE",Z-Y2,55,Z-Y1,65)
900 SUB NOSE(P5)
920 CALL LINK("PIXEL",Z-55,50)
930 CALL LINK("LINE",Z-55,50,Z-45-P5,46)
940 CALL LINK("LINE",Z-45-P5,46,Z-45-95,54)
950 CALL LINK("LINE",Z-45-P5,54,Z-55,50)
1000 SUB MOUTH (P9,P6,P10)
1020 X1=40-P9 :: Y1=35
1030 X2=60+P9 :: Y2=35
1070 FOR K=1 TO 2
1080 IF K=2 THEN Y3=Y3+P10/2
1090 OX=X1 :: OY=Y1
1130 C= (X1^2*(X2*Y3-X3*Y2)+X1*( X3^2*Y2-X2^2*Y3)+Y1*(X2^2*X3-X3^2*X2))/D
1150 FOR I=X1 TO X2
1160 X=I :: Y=A*I^2+BB*I+C :: CALL LINK("LINE",Z-OY,OX,Z-Y,X) :: OX=X :: OY=Y :: NEXT I
1170 NEXT K
1180 FOR K=1 TO 400 :: NEXT K
While these are all presented ready to run with Extended Basic plus the disk utility THE MISSING LINK ($25 + $8 post from Texaments) the programs can be readily converted for use with any other utility that allows bit map graphics such as Triton XB, Myarc XB or the disk utility JBM103 (from disk library). Connett Circles
If you don't have the Missing Link (commercial) program, these programs are easily adopted for ANY program that allows BIT MAP (PIXEL) plotting!
The Missing Link is available from this websites download page for TI-99/4a emulator use as is also jbm103.
This program although one of the smaller ones, produces some most interesting results. I have used a multiplier of 1.2, but at some stages it pays to take it a little more slowly. In effect you are backing away from a wall which is covered with circles, and as you back away, there is a repetitive effect to the patterns. The circular patterns are technically known as aliases, as the computer is not really plotting circles at all ....
1 ! XB + THE MISSING LINK
100 REM CIRCLES
110 REM JE CONNETT/PWH MOON
/S SHAW 1990
120 SIDE=20 ! 10>2000 value
140 CALL LINK("CLEAR")
150 FOR I=1 TO 150 :: FOR J=1 TO 150
160 X=I*SIDE/150 :: Y=J*SIDE/150 :: C=INT(X*X+Y*Y) :: D=C/2 :: IF D-INT(D)>0.1 THEN 180
170 CALL LINK ("PIXEL",I+20,J+20)
180 NEXT J :: NEXT I
188 ! next bit just stores
pictures omit if required
190 PIC=PIC+1 :: A$="DSK2."&STR$(PIC)
200 CALL LINK("SAVEP",A$)
203 ! let's look from a little farther away...
210 SIDE=SIDE*1.2 :: GOTO 140
Go to top of page
Random Dot Moire Patterns Random Rotation
This category of image was brought to light by Leon Glass in 1969, whilst studying visual perception. We take a random set of dots, then slightly enlarge the image, place it over the first, and rotate slightly. With a small rotation we see a spiral, but there really isn't one. With a larger rotation the perception is lost.
The coding is based upon page 45 of Clifford A Pickover's 1990 book "Computers Patterns Chaos and Beauty".
The following program first produces a random dot pattern on the screen and then first enlarges it AND rotates it slightly, and then just rotates it. See what effect these minor manipulations have. There are possibilities for some interesting animations here!
1 ! XB + THE MISSING LINK Stephen Shaw Aug 1990
2 ! from COMPUTERS PATTERN CHAOS AND BEAUTY by Clifford A Pickover
100 REM RANDOM DOT PATTERNS MOIRE DOT PATTERN
110 REM AFTER PICKOVER
120 SEED=4 :: RANDOMIZE SEED
130 ! ANGLE OF ROTATION IN DEGREES:
140 AN=2 :: AN=AN*PI / 180
150 ! SIZE OF PLOT IN PIXELS
160 SZ=140 :: MD=SZ/2
170 FOR I=1 TO 3000
180 RANDX=RND*SZ :: RANDY=RND*SZ
190 CALL LINK("PIXEL",RANDX+5,RANDY+5)
240 CALL LINK("PIXEL",RANDX+5,RANDY+5)
250 NEXT I
270 CALL LINK("PRINT",180,20,"ANY KEY FOR NEXT")
280 CALL KEY(5,A,B) :: IF B<1 THEN 280 ELSE CALL LINK("CLEAR")
300 ! different pattern
310 ! this time we have no
enlargement, just rotation
320 SEED=4 :: RANDOMIZE SEED
330 ! ANGLE OF ROTATION IN DEGREES:
340 AN=2 :: AN=AN*PI/180
350 ! SIZE OF PLOT IN PIXELS
360 SZ=140 :: MD=SZ/2
370 FOR I=1 TO 3000
380 RANDX=RND*SZ :: RANDY=RND*SZ
390 CALL LINK("PIXEL",RANDX+5,RANDY+5)
410 RANDXX=1.00*((RANDX-MD)* COS(AN)+(RANDY-MD)*SIN(AN))+MD
420 RANDY= 1.00*((RANDY-MD)*COS(AN)-(RANDX-MD)*SIN(AN))+MD
440 CALL LINK("PIXEL",RANDX+5,RANDY+5)
450 NEXT I
470 CALL LINK("PRINT",180,20,"ANY KEY TO END")
480 CALL KEY(5,A,B):: IF B<1 THEN 480 ELSE STOP
Based upon After Feigenbaum Fractal Report Number 10. - total 320 subscribers. (Volume 2 no 10 First published August 1990. published by Reeves Telecommunications Laboratories. Publisher John de Rivaz placed the available text freely available online on Geocities). Issue 10 is the one with the front cover autograph by Arthur C Clarke.
The next program is based on work by M Feigenbaum in 1979 and produces some interesting pictures, depending on the limits you set when the program starts. Sometimes looking VERY closely (maximum magnification) will produce an interesting result, at other times it pays to stand back a little. Towards the right of the overall plot is chaos, on which can be found some overlying non-chaotic detail.
The number of "invisible" plots can be varied- failing to plot the first few dots concentrates the display on certain features. Reducing the invisible range will produce a little more detail- if you wish to look at all dots (invisible=0) then try using the 16 colour mode and using a different plot colour for the first 14 plots say- or use all the colours at different plotting stages in the inner loop. More detail will be seen! Have fun! This program is a true fractal as the same shapes keep reappearing.
Try Left = 2.5, Right = 2.8, Top = 1.4, Bottom = 0.9, Invisible = 50, Visible = 50.
1 ! XB+ THE MISSING LINK STEPHEN SHAW AUG 1990
3 ! FEIGENBAUM DIAGRAM Becker & Dorfler / Leon Heller :-
FRACTAL REPORT #10 AUG 1990
100 CALL LINK("CLEAR")
110 CALL LINK("PRINT",1,25,"VERTICAL AXIS FROM: TO:"):: CALL LINK("PRINT",21,25,"HORIZONTAL AXIS FROM: TO:)
120 A1$="1.140" :: A2$="1.171" :: A3$="2.530" :: A4$="2.586" :: CALL LINK("INPUT",1,104,BOTTOM,7,A1$)
130 CALL LINK("INPUT",11,147
,TOP,7,A2$) :: CALL LINK("INPUT",31,103,LEFT,7,A3$)
:: CALL LINK("INPUT",31,147,RIGHT,7, A4$) :: CALL LINK("CLEAR")
140 IF RIGHT-LEFT<0.0000001 THEN LEFT=LEFT+RIGHT :: RIGHT=LEFT-RIGHT :: LEFT=LEFT-RIGHT
150 IF TOP-BOTTOM<0.0000001 THEN TOP=TOP+BOTTOM :: BOTTOM =TOP-BOTTOM :: TOP=TOP-BOTTOM
160 IF (TOP=BOTTOM) OR (LEFT=RIGHT) THEN 100
170 CALL LINK("LINE",1,1,1,240) :: CALL LINK("LINE",1,240,192,240) :: CALL LINK("LINE",192,20,192,1) :: CALL LINK("LINE",192,1,1,1)
180 WIDE=240 :: DEEP=190
190 CALL LINK("PRINT",3,12," <"&STR$(LEFT)&" BTM="&STR$(BOTTOM)) :: CALL LINK("PRINT ",2,170,">"&STR$(RIGHT))
200 CALL LINK ( "PRINT",180,20,"TOP="&STR$(TOP))
210 VISIBLE=50 :: INVISIBLE 50
240 FOR RANGE=1 TO WIDE
270 FOR I=0 TO INVISIBLE :: P=P+K*P*(1-P) :: NEXT I
280 FOR I=0 TO VISIBLE
300 COL=(K-LEFT)*WIDE/(RIGHT -LEFT)
310 CALL LINK("PIXEL",ROW,COL)
330 NEXT I
340 NEXT RANGE
350 GOTO 350
Go to top of page
TI Book front page |
TI Resources Page
| PC99 Review
| PC99 Programs