# Ee ey dee aie Bis ae ie

SRE Sacaae Se a

Bie ees peas

Sa SRE

ses 23

ag _.

3 By pauaaiet 7

7 co

ee es

Re coe

he fee ays

ES

s t BS

eS

are ce ace

cy

L

estes § Bae as

eB

ee

. : aL

eats Bs ox seats ee Cs BRekoRaRs e Ate 4 bt. | of : : . og . oo skal eapaeaeaene fy « ® : carga “8 ¥ SS SS | RS : ee : :

a

See

3 ee

RENIN“ Raa

FITTING THE BILL We examine a | number of products currently on the market 8? that are billed as ‘robots’ and see how well they conform to our definition of the term

A TOUCH OF CLASS The Touchmaster is a new graphics tablet that is designed to work 83 with most of the popular home machines.

We see how it compares with its rivals

Bs = sai

EDUCATED GUESS We conclude our look at TK! Solver by looking at its ability to solve equations from incomplete information through a series of ‘guesses’

oe

WHO D ND IT? Using the example ofa

murder mystery in which a list of suspects is 83? drawn up and analysed, we continue to examine the use of list processing in LOGO

RARER

NFORMATION STORAGE AND RETRIEVAL TO INKJETPRINTERA 8 weekly glossary of computing terms

PROGRAMMING PROJECTS

TAKING ORDERS Now that we have discussed methods of moving around the 876 adventure world, we can look at how the

program analyses instructions from the player

00000000

TSS BONES POET PTET Se ORO RO NETS

YTE THE DUST Our debugger program is now complete and this instalment also 8 concludes our series on 6809 machine code

OUTBOARD MOTOR We look at the

working principles of the stepper motors that B35 will be used to power the robot we are

building and construct the board to hold the

motor and accompanying parts

REFERENCE CARD We begin to list INSIDE extracts from the 6502 programmers’ BACK reference card | COVER

COVER PHOTOGRAPHY BY CHRIS STEVENS ROBOTS COURTESY OF ROBOTICS WORKSHOP

FITTING THE BILL

As we continue our series on the topic of robotics, we examine some of the products sold commercially under the name ‘robot’ to see if they fill the role expected of them, and if they fit our carefully constructed definition of the term.

Up to this point in the Robotics series, we have dealt primarily with theoretical considerations of robot design and operation. In practice, many of the concepts discussed have not _ been implemented, or are restricted by a lack of funding, intricate mechanical parts, and/or intelligent software. Existing robots, whether they are intended for home or industrial use, tend to fall short of what we have come to expect of robots over the years. Sensors exist to make a robot see, hear, or feel, but as yet the sensations the robot experiences have no meaning for it, and cannot be synthesised to stimulate the robot to original, non- programmed behaviour. Robbie the Robot and his other fictional counterparts are still a long way from reality.

Nevertheless, many products are now being

Spot The Robot

sold under the name ‘robot’. These range from

small toys for under £1 to vastly expensive R2D2

lookalikes and industrial robots. After examining the components of robot design and theory for several instalments, we must now consider what

constitutes a true robot. We must not be too

demanding, but we should be able to take what we know and apply it in a workable definition.

The first consideration, and one that eliminates many of the lower-priced ‘robot’ products, is movement: can the robot move about a space by itself? We cannot expect the robot to program itself, or to set a course of action without human guidance, but we can expect a robot, once set in motion, to be able to operate independently of continuous human control. Without this freedom of movement, an object cannot be considered a robot. : 7 |

Having passed the test of movement, our robot candidate must now be evaluated on the basis of

how the movement is effected. A small toy car can

be given a motor and batteries that keep it moving

in a straight line. Add bumpers to it, and the car

can turn away from obstacles such as walls and tables. Give the car a slightly unusual centre of

Our Robot

Powered and controlled from its parent computer, the robot is equipped with touch- and light- . Sensitive sensors

SS

Big Trak

LOGO-like distance and direction instructions can be programmed into this microprocessor-driven device through its keyboard

a =e =)

Bumper Car

This battery-powered toy will

run ina straight line until it hits

an object, in which case it will turn clockwise 90° and continue

STEVE CROSS

Amazing Tracks

The three devices are attempting to run a maze: the toy car simply blunders from wall to wall, Big Trak follows its human operator’s programmed instructions for running the maze, while our robot learns the maze through the interaction of its software and sensors. We can be sure that the robot will solve the maze eventually, no

matter what happens; Big Trak 3

will follow its program, so may solve the maze if the operator's directions are correct; the toy car could solve only ‘right- handed’ mazes, and then only by chance. !

When the car collides with Big Trak, the car is unaffected since its behaviour is purposeless; Big Trak, however, is diverted 90° off its course (shown in green) but continues to turn and travel as if it were still on track (Shown in red). Both devices react unintelligently to this unforeseen event where the © robot would treat it as just one more aspect of an unpredictable environment

THE HOME COMPUTER ADVANCED COURSE 821

2y

9009000 oO

\ e)

ROBOTICS, APPLICATION

EDUCATED GUESS

examination 0 TK!Solver an equation processing program for the Apple Il, IBM PC and compatibles, and the ACT Apricot with a closer look i i ilities.

As we explained in

spreadsheet series (see page 804), TK!Solver is a

‘next generation’ software package that takes the concept of the spreadsheet into the realm of higher mathematics and engineering. We have already shown that TK!Solver lets the user define variables with names and use these in complex mathematical equations. In this instalment, the last of our spreadsheet series, we look in detail at TK!’s unusual ability to iterate. This is a method where the program can solve for a variable by guessing at it. Ordinarily, when working with equations, one can determine the values of all the variables if enough information is given from the

outset. The program simply reduces the problem |

to a series of calculations. For example: A? + B = 2C0S Y

can easily be solved for any of the three variables if

the other two values are known. Faced with this

equation and given values for A and B TK!s

Direct calculations and output a value for Y.

- But there are occasions when the determination

_ ofavalue is not straightforward. One such case is a

redundant equation, which defines a variable in terms of itself. For example, consider:

D=(A+B)/(2*D)

within a model where A is the only known value. Other problems can occur as the result of an incomplete model, or a model with many interdependent variables and a limited amount of data. The concept of iteration is a difficult one, so

let’s look at a more practical example of iteration. Let’s reconsider the car journey model created

in the last part and add a few details to make it more applicable. As you will recall, the previous model was built around five values: distance, time, speed, fuel and mileage. It could calculate mileage, given speed and fuel consumption; distance from speed and time; and several other simple variations. What if we now want to determine how fast we should travel in order to complete a trip within a given budget?

To begin with, we must add several factors to our model. For instance, the model must take into account the power output of the vehicle, the internal friction of the engine and wind resistance,

824 THE HOME COMPUTER ADVANCED COURSE |

Solver would perform the required:

rae

all of which will have an effect on the vehicle’s mileage and speed. (We will assume that internal friction is constant.) We must also have an upper

boundary for our budget, and the cost of the fuel

being consumed. | 7

We'll begin building the actual model by entering these equations in the Rule sheet, one equation to a line. These equations are read automatically into the Variable sheet: _

Building Equations

Because there are several variables, the screen is too small to hold all the information. To see all the variables displayed, we can show the Variable sheet in a window by itself. We do this by pressing the semi-colon key (;) to move the cursor into the variable window, and then type in W1. Now all the variables can be seen and we can begin entering values for them. _

DIRECT SOLVING

The model can be solved directly, if enough |

information is given at the start. For instance, enter the following values in the INPUT column:

Input Values For Direct Solver

IAN McKINNELL

~~

&

Then press ! to perform the calculation. TK! displays the message Direct Solver, and the unknown values appear in the OUTPUT column, as shown: ;

Direct Solver Results

This gives us a nice breakdown of all the information we want. But what if we want to use this model to solve a problem with less information given at the outset? Let’s consider a calculation where we have a maximum budget of £50 to spend on fuel for a 1,000 mile trip. We know the price of fuel (say £1.75 per gallon) so we can easily determine how much we can spend per mile. It might be more difficult, however, to determine what speed we need to travel in order to achieve the mileage needed to complete the trip within our budget.

We begin by blanking the values already entered. We do this by typing RVY (for Reset Variables Yes). Then we type in the information that we know: 1000 for distance, 50 for cost, and 1.75 for price. We use a value of 1/3 for internal friction (which TK! evaluates to 0.333333) and 0.0000095 for wind resistance. Press ! to calculate and the following values appear:

Incomplete Model

Note that no values have been generated for speed, time or power and speed is the specific value we need. If we shift the display from the Variable sheet to the Rule sheet, we will see that three of our equations remain unsatisfied (which is indicated by the * in the Status column):

Unsatisfied Equations

ITERATIVE SOLVER

Since we cannot solve the model using the Direct

Solver, we must try the Iterative Solver. This takes a starting value, input as a guess, and fits it into the equation. If the value is not correct, TK!Solver uses a series of successive approximations (like the game of ‘higher’ and ‘lower’) to pinpoint the exact value. |

The first thing we do is take the mileage value generated previously and move it into the Input column to give TK! one extra value to start with. We do this by typing | in the Status column next to mileage on the Variable sheet. Then we estimate a value for speed say 50 enter that number in the Input column, type G for guess in the Status column and press ! to calculate. TK! displays Iterative Solver at the top of the screen and counts off each approximation. On the fourth attempt, TK! arrives at the correct value for speed, time and power, as shown: |

Hterated Values

According to TK!Solver, an average speed of just over 47 miles per hour is needed to complete the trip within our budget. The closer a guess is to the actual value, the sooner TK! finds a solution. TK!Solver is available from Practicorp for the Apple II, IBM PC and compatible machines, and the ACT Apricot, for £195. Software Arts also publishes ‘Solver Packs’ at £95 each with predesigned models for specific applications.

THE HOME COMPUTER ADVANCED COURSE 825

~ TAKING ORDERS

Up to this point in our adventure game programming project, we have discussed methods of map making, formatting output and moving around the adventure world. In this instalment, we show how the program analyses and obeys instructions given to it by the player.

826 THE HOME COMPUTER ADVANCED COURSE

Adventures are usually constructed so that the »

player can move from location to location, picking up and dropping objects along the way. A set of commands allows the player to perform these simple tasks. The commands we have used are:

Variations on these may also be available, such as MOVE instead of GO, or GET instead of TAKE. Part of the fun of playing an adventure game is to determine what words the game will accept. For example, a player might try the command SWIM when in a dry location. If the program responds by telling the player that he cannot swim here, then the player could reasonably assume that there are locations where swimming is allowed. (Alternatively, the programmer might just want the player to think that!)

The number of commands accepted by a game varies according to the complexity of the game and the amount of effort the programmer has made to cover every eventuality. The most important thing for the designer to do is to make sure the program does not crash if a player tries to enter a command that is not catered for. A failsafe routine that prints ‘I don’t understand’ may be all that’s required, bearing in mind that some flexibility should be added so that players can enter commands in different ways. For example, it would be annoying for a program that accepts the command TAKE LAMP to respond to,the command TAKE THE LAMP with ‘I don’t understand’. Adding flexibility will be discussed at greater length later. For the moment, we need to look at the type of instructions that

might be given during the game, and devise a

routine that will break these down into a form that can be easily interpreted.

COMMAND SPLITTING

No matter what the instruction is, it is very likely that it will be phrased in the imperative such as, GO SOUTH TOWARDS THE RIVER or KILL THE ALIEN. The advantage of this sentence structure is that it is easy to break down: the verb always comes as the first word in the sentence, the object of the verb follows this, and finally there may be some form of qualification of the action. A first stage in the analysis of a command is to separate the verb from

the rest of the sentence. This task can be easily achieved by scanning through the sentence one character at a time, using MIDS, until a space is found. The part of the sentence that lies to the left of the space is the verb, and can be assigned to the variable VBS. The part of the sentence to the right can be assigned to a second variable, NNS. This subroutine is used in Haunted Forest to split the instruction assigned to the variable ISS:

256@ REM *xx**x SPLIT COMMAND S/R *2%«x%

25190 IF ISS="LIST”" OR IS%="END" THEN ¥VBS=1S$!:F =12RETURN P5515 IF IS#="LOOK" THEN V¥VBS=IS#$:iF=1:5RETURN

2520 F=8

P3538 LS=LENCISS>

. 2340 FOR C=i TO LS

25580 AS=MIDSCIS$,C,13

e568 IF AS<>" " THEN 2599

2578 VBS=LEFTSC(IS$,C-1):5F=1

2588 NNS=RIGHT#(IS$,LS-C)IC=LS

25969 NEXT C

e6baa :

261@ IF F=i1 THEN RETURN

2620 PRINT:PRINT"I NEED AT LEAST TWO WORDS”

2630 RETURN

Before the routine attempts to split up the sentence, it first checks to make sure that the command is not one of the three possible single- word instructions that is, LIST, LOOK or END. If it is a single-word command, then the complete instruction is assigned to VBS, and the routine is exited. If the command is not one of these, then the routine enters a FOR...NEXT loop and begins to scan for the first space. Two techniques used within this loop need special mention. Both relate to the fact that it is extremely bad programming style to perform a conditional jump out of a FOR...NEXT loop without passing through the NEXT statement. Instead, to signal the fact that some condition has been met in this particular case, that a space has been found a flag, F, is set to one. Secondly, when the first space has been found, it is a waste of time to continue scanning through the rest of the sentence.

The loop can be neatly terminated at this point by setting the loop counter, C, to its upper limit, LC. Consequently, when the program again reaches NEXT, it will pass on to the following instruction, rather than loop back to the FOR statement. Once the ioop has been correctly terminated, then the status of the flag, F, can be tested. A flag value of one indicates that the sentence consists of more than one word, and ail that remains to do at this stage 1s to return to the main loop. If the flag is not one, then the command has only one word and is not one of the single-word commands tested for earlier. In this case, a message stating that two words are required is printed before returning for another command. |

NORMAL COMMANDS

For the main part of the program, the player will simply move from location to location and pick up or drop objects that may be found. Therefore, for the majority of locations, the commands GO, TAKE, DROP, LIST, LOOK, END and their variants are sufficient to allow the player to do this. Only in unusual circumstances will the player wish to use other more specialised commands. For example, there is little point in using the command KILL if

there is nothing present to kill. We can, however, devise a program structure where, on the majority of occasions, only the six commands associated

- with movement and objects are tested for. When

the player enters a new location, the program can test to see if it is one that has been designated ‘special’ in some way. If this is the case, then any new command requirements can be dealt with bya specific command subroutine for that particular location. Therefore, the main calling loop to our program should do the following:

1) Describe the location and list the exits.

2) Determine whether the location is ‘special’. 3) Ask for a command and, if the location is not special, scan the list of normal commands.

There must also be a facility in the main loop to distinguish between a command that causes a move to a new location and one that does not. In the first case, the loop needs to go back to the beginning of the loop to describe the new location | and decide whether or not it is special.-In the second case, it is necessary only to loop back to ask for a new command. The simplest way to implement this is to use a ‘move flag’, MF, which is normally set to zero. If a command involves movement then this flag is set to one. The status of MF can be tested at the end of the main loop and the appropriate jump made. Add the following lines to Haunted Forest:

27@ GOSUBESOO=REM SPLIT INSTRUCTION

275 IF F=0 THEN 260:REM INVALID INSTRUCTION, 2386 GOSUB3S@08:REM NORMAL COMMANDS

296 IF VF=@ THENPRINT:PRINT"I DONT UNDERSTAND” 30@ IF MF=1 THEN 246:REM NEW LOCATION

3160 IF MF=-@ THEN 266:REM NEW INSTRUCTION

3000 REM *x** NORMAL COMMANDS S/R «**%

3010 VF=8:REM VERB FLAG

3020 IF VBS="GO" OR VBS="MOVE" THENVF=1:!GOSUB3500

3039 IF VB$="TAKE" OR VBS="PICK"THEN VF=1:GOSUB3790

3040 IF VBS="DROP" OR VBS="PUT"THEN VF=1:GOSUB3900

3050 IF VB$="LIST" OR VBS="INVENTORY"THEN VF=1:G0S UB4 100

3055 IF VB$="LOOK" THEN VF=1:MF=1:RETURN

3068 IF VB$="END" OR VBS="FINISH" THEN VF=1:GOSUB4 178 2

3078 RETURN |

In the first routine, another flag, VF, is used to indicate whether or not the verb has been understood and obeyed. Only when the verb has

been isolated is VF set.-to one. We can insert a failsafe ‘I don’t understand’ statement in the main

loop by testing the status of VF. If VF remains zero

then the verb in the command has not been recognised by the analysis routine, and the statement is displayed.

In the next instalment of the project, we will deal with subroutines for picking up, dropping and listing objects. For now, we can add a short END command subroutine to our group of normal commands:

4176 REM x*xex*x END GAME SYR **%x

4180 PRINT:PRINT"ARE YOU SURE (Y/N) 7"

4196 GET ASI IF AS<C>"Y" AND AS<>"N" THEN 4198 $2698 IF AS="N" THEN RETURN

94216 END

The LOOK command is also straightforward. To redescribe the current position, we simply need to set the ‘move flag’, MF, to one and return to the main program loop. Setting MF will cause the main

-THE HOME COMPUTER ADVANCED COURSE 827

\

RETURN

THEN NN@=hie! 1=LN

THEN NNS=LH: IT =LN

C=1

THEN NEXT I +1 ="EAST" ="WEST"

LEN (NN?) # C=

We Sap he

Cd: CR WS OR LE

I

ion words sought until a match is

LN

1 TQ LN I Cc

="NORTH"

= = F *

a

direct = "SOUTH"

NN#+"

MIDS CNN&

=

s

645 FOR I 3656 IF MIDS CNNS

3630 REM *x*x** SEARCH FOR OIRECTION S/R ERE 3655 WS

the four found 3646 NNS& 36660 IF WS 3665 IF We 3678 NEXT I 3675 RETURN

3

g ts. t

ca S is no ocati if, ions

changed by the LOOK command, the same! Th the player has performed a series of

will

its exi e on after , the has

act

g, thus d on of the current location

iable

command is useful

1S ADDING FLEXIBILITY

cribe a location an

ed

es that des the value of the location v.

routin al descripti

be describ moved off the screen

origin

program to loop back to the be

the As

/

ooo00000 0

90000000 is

ect we developed a

e proj

To add th e we need

instalment of th

In the last

ew routine to the imply to add the

isn

ne

routin

tt

movement rou

the player

different forms of the

g movement commands,

issuin

e

When

S

>)

ent

ORTH following line

same movem

may type in

ins

, MOVEN

GO NORTH

b

ample

on. For ex

tructi

a D = Sos oO ~~ ) O& OW ry ase o : OR rf peweed n- zy er o Ltd - £€x5 » Pas « 20O¢ no eae oe eo fa SO tS ce e to o Sa ie = oe w bo © & f #Ss to 3 8 © ean iD) it) NM. 2 2 ae o £20 a esa B hes in Awe Vs a aS ¢") 2 8°32 oor oH = 3 pEeuS Se Bp Soeas & on =o G A m= SELLE 4 eae CS Oom'™ 6 om Og bad Send q SBaes aoe on SD Cpe 5s OobEeES a & o) 3 = a2) of 60. ie ie Bae > 5 ZeGas © ° = Shee Fagan? bon Bogs ep 0 O Zea § SS hee

OH og BCDO DOW Sepgecagse SO, 5 ¢ Sues Se a25 Ra 05 shOos S2EE Se aea* 3 ho ZBESoenwERUH= oO Sige. gs S2P85 2595 5 oO sSa2o- mae Oy hos o B Oe a op OP 4S e&O 8 asses & 55 = 9 8 - BZ Soh sey 8s wSegseeaes Beene an © @ DY & Men) roe) bed Bey > AS 4?) ae we 2 on ooger= ae ee oe OO. oOG5 3 0 2 zs ce & 5 See bE LD SsReea0naqgzc OE Of omg ORS 29 SELES LS6SZsSS Onna soo yo a “meee ss oa DO O'S oR? RS. ar > = 2S aD) ou N oD Sh 3 Oo eS ga or eR. e BSR et ES a 2 cSSU EE F]asP ro gd os SHEER Y Spesa” se Sm ag k US ES -vses Syeeagros ) Ro S Ssvosevts eaegag” : 23 hg oe FE Sore SES > N 5) * ai end Peo bees Roe Sis d 0 D) = Fp) ove) EEERoMvE =S=Sov gE os ates B= -=yc RPeaeees 22

ed as N for NORTH.

would be accept

828 THE HOME COMPUTER ADVANCED COURSE

sa

INFORMATION STORAGE AND RETRIEVAL

Information storage and retrieval’ is the term used for the accessing and retrieval of information from a magnetic medium such as disk, tape or in older systems cards or punched tape. This information may be in the form of files, programs, data or graphics. It is necessary to use a storage medium that will not only retain the information when the power is switched off, but also allow the computer to read the information back in at some other time. This means that a computer must have, or be attached to, an interface that can read and write the data. Thus information storage and retrieval has come to mean not only the process of reading and writing information, but also the

techniques involved in such a process.

INFORMATION TECHNOLOGY

In one sense, information technology has been around for thousands of years: hieroglyphics, the abacus, the quill pen and the printing press are all examples. In the last decade or so, following the development of microelectronics and_ the subsequent dramatic fall in the price of such circuitry, information technology (IT) has come to mean the electronic storage, transmission and processing of information specifically with reference to computers, video and pager es As such, IT has already had a profound effect on much of the world’s population, and most major organisations are now dependent on computers. An enormous amount of effort and resources is currently being put into information technology. The world now depends for its communications on satellites, such as COMSAT, while other satellites constantly monitor every inch of the world’s surface.

INFORMATION THEORY

Information theory (developed by Claude Shannon at Bell Laboratories, New Jersey, in 1948) is the area of computing that investigates the transmission of data. It involves the examination of newly-arrived data and whether it tells us something new that is, the extent to which it reduces the uncertaintyin the information system. Thus, information theory consists of the study of the nature of the information and its speed of arrival. In its simplest form, this restricts information theory to the rate at which new information arrives, and from which channel or source.

However, in a wider sense, information theory can include such areas as coding theory. This discipline covers the translation of data from one form to another, and how this can be accomplished efficiently without any loss of the information being transmitted.

INITIALISATION

Primarily, initialisation is the process performed by the computer’s ROM-based operating system when the machine is switched on. This involves

default values being placed in the registers and various addresses in memory. Typically, during initialisation, a microcomputer will set the stack pointer, clear the decimal mode and initialise the various input/output devices. This initialisation will also set the top and bottom of memory pointers and the zero page. Finally, initialisation includes the setting up of the initial screen display and the screen editor variables.

Initialisation has a second meaning: the

formatting of disks. This takes the form of writing

the track that will contain the disk directory. The information written on this track is the disk’s title, the block availability map (BAM) and a list of markers for each track on the disk.

Initialisation can also be performed by programmer. If a program is to be properly structured, variables should have initial values assigned to them at the beginning of a program. This is often termed the ‘initialisation procedure:

INK JET PRINTER

An ink jet printer forms characters by squirting droplets of ink from a nozzle at the piece of paper.

Although these printers were developed in the

1960s, it was not until the mid-1970s that their use became widespread.

There are two types of ink jet printer. The pulsed jet printer consists of either one or a number of nozzles, which fire several droplets to produce a single dot on the paper. By arranging these dots in patterns, characters can be built up in much the same way as a dot matrix printer forms its type. If a number of nozzles are fitted to the print head, then the user has the possibilty of multicolour or higher resolution printing.

The other type of ink jet printer is known as the continuous stream printer. As its name suggests, this printer shoots a continuous jet of ink at the paper. The droplets in the stream are electrically charged as they leave the nozzle, and then pass between charged electrodes, which alter the direction of the ink stream. The droplets of ink are directed to a precise position, and the character is drawn in much the same way as a pen stroke.

STEVECROSS

A Drop In Quality

Ink is fired at the paper through a nozzle that breaks the stream into separate droplets. These are electrically charged, which enables the metal deflector plates to direct them into character patterns on the paper the electron beam ina cathode ray tube is moved around the screen in exactly the same way

THE HOME COMPUTER ADVANCED COURSE 829

IAN McKINNELL |

~ ATOUCH OF CLASS

} The Touchmaster Pad

The sheet provided with the software simply slots into the drawing area. By pressing the appropriate command on the right-hand side of the overlay and moving the pencil, stylus or finger to the drawing area the command will be executed on the screen

830 THE HOME COMPUTER ADVANCED COURSE

as aids in the construction of graphics displays. The Touchmaster graphics tablet is unique in that it may be used with most of today’s popular home computers and, so the manufacturer claims, can also be used as a simplified replacement keyboard.

Today’s best-selling computers all support high- resolution graphics displays. However, unless

ready-written graphics software is available, much

time and effort is required to create such displays

and many features are not fully utilised. A ‘sketch’

program is not sufficient because the user will often wish to copy an existing image into the computer instead of simply drawing freehand. Several digitisers have been marketed for this purpose, but these have mostly been designed for use with specific machines, such as the BBC Micro or ZX Spectrum. The Touchmaster graphics

Many different devices have been marketed |

tablet is designed to work with a wide range of home machines (some of which will require a suitable interface or cable). This device is also being promoted as a replacement keyboard, but the simplicity of its design means that such use is restricted to selection between a number of menu options or for simple.games control. A computer

keyboard 1s still required for data entry, as well as

for loading the Touchmaster software itself.

The Touchmaster is fitted in a neat grey case measuring 350 by 330 by 35mm. The back of this is slightly raised, forming a convenient angle for drawing. A plug-in transformer is supplied, with a single red LED indicating when power is on; however, no on/off switch is fitted. To allow the tablet to be used with a wide range of home machines, both serial and parallel interface sockets are fitted to the rear panel, together with a socket not mentioned in the manuals for a foot switch. In fact, the manuals are barely adequate: the hardware manual gives instructions on the connection of the tablet and provides a number of simple BAsic programs for reading co- ordinates, but is insufficiently detailed.

The tablet relies on the membrane technology that was developed on the ZX81 and Spectrum keyboards, and provides a 256 by 256 pixel resolution. The upper layer is separated from the lower resistive film by an insulating mesh, and pressure on the upper layer forces it to make contact with the film. The tablet contains a microprocessor that scans the top film in one direction while scanning the lower layer in another, and the co-ordinate of the ‘contact point’ is then sent over both serial and parallel interfaces. The serial interface is used to connect the tablet to the BBC Micro, while the parallel interface is required for use with the Commodore 64, Vic-20, Spectrum and Dragon. The ‘Touchmaster’s resolution is less than that provided by many hi-res screen displays, so BBC Micro owners, for example, will be unable to resolve to a single pixel in Mode 0.

MULTIPAINT PROGRAM

A drawing program called Multipaint is supplied with the ‘Touchmaster. This provides a demonstration of the facilities provided, but is hardly a comprehensive graphics aid. A plastic template gives a menu of the facilities available, with the selected option displayed in a ‘status’ window at the bottom of the screen. Five different brush types may be used; each of these can be any width from two to 32 pixels, in steps of two pixels. The window also shows the current drawing mode Dots, Points or Freehand and the selected

xR | _ ;

re

foreground and background colours. Colours may be changed by pressing the required option on the menu until the desired choice appears in the status window. : 2

Once the correct colours and brush types have been selected, further options are avilable for the creation of boxes, circles, polygons and ‘rubber- banded’ lines. A stylus is supplied with the package, but finger pressure may be used instead. The Touchmaster, with its larger tablet area, does not suffer from the same restrictions as the Koala-

pad (see page 629): pressure from a finger may be translated into a precise co-ordinate rather than a mere approximation, so electronic finger-painting is a real possibility!

Unfortunately, Multipaint offers no more than rudimentary features. A FILL option is marked on the template and documented in the manuals, but on the Spectrum version at least this does not appear to operate in the expected manner. Neither is there any facility for magnification or editing, which means that colours may not be changed. On the Spectrum, where it is often easier to draw in black and white before adding colour, this is a decided disadvantage.

As a piece of hardware the Touchmaster tablet appears to have a lot going for it compared with rivals like the Grafpad and the Koala-pad. It is : robustly built and offers a full A4-sized drawing area that can be connected to most of the more popular home computers. One § significant advantage is that if you decide to upgrade or change your machine in the future, all that is required is a new interface plus the appropriate software, of course.

It is a disappointment that the documentation and software supplied should be so poor

-compared with the standard of the tablet itself. Touchmaster is bringing out a range of software designed specifically for use with this tablet; |

_ although the real proof of success will come if | independent software houses decide to support it. !

THE HOME COMPUTER ADVANCED COURSE 831

WHO DUNNIT? ©

Our s series s of investigations into the u use e of LOoGO’s list processing facilities continues with a look at how to set up a simple database. We use the example of a murder investigation, in which a list of suspects is created and then analysed to ascertain who | the murderer v was. |

community in the Ozark Mountains. eatich has been viciously attacked with an axe and killed. We know that Matthew and Joshua both own axes, James and Ebenezer own guns, and cousin Jane has a knife. Matthew and James both had blood on their hands when they were questioned by the local sheriff.

Our LoGo database of information about this crime will consist of a list of facts each of which consists of a relation, together with one or more nouns. When represented in LOGO, one fact is [OWNS MATTHEW AXE] or, in English, ‘Matthew owns an axe’. To represent the fact that James had blood on his hands, we use [BLOODY JAMES].

We begin our investigation with an emply database:

TOSETUP | MAKE “DATABASE [] END

We then add facts to our database as we discover them (providing they are not already in the database). For example, we would input ADD [OWNS JANE KNIFE] using the following ADD _ procedure:

TO ADD :FACT IF NOT MEMBER? :FACT :DATABASE THEN MAKE “DATABASE FPUT :FACT :DATABASE END |

The database will eventually fill up:

[[BLOODY MATTHEW][BLOODY JAMES][KILLED ZACHARIAH AXE] [OWNS MATTHEW AXE] [OWNS JOSHUA AXE] [OWNS JAMES GUN] [OWNS EBENEZER GUN] [OWNS JANE KNIFE]]

To print out the database use SHOW. This can be followed by either “ALL, in which case the whole database will be printed, or by the name of a relation, in which case only the facts for that relation are printed. So, SHOW “OWNS will show us who owns what. TO SHOW :S IF :S = “ALL THEN LIST.ALL :DATABASE LIST.REL :S :DATABASE END

832 THE HOME COMPUTER ADVANCED COURSE

TO LIST.ALL :LIST IF EMPTY? :LIST THEN STOP PRINT FIRST :LIST LIST.ALL BUTFIRST : LIST END | TO LIST.REL :S :LIST IF EMPTY? :LIST THEN STOP | IF :S = FIRST FIRST :LIST THEN PRINT FIRST “LIST LIST.REL :S BUTFIRST :LIST END

Now we must devise ways of querying the database. The simplest kind of query we might make of our database is to check whether a fact is known to be true. This we do with a procedure called DOES, which checks whether a fact is in the database. For example, DOES [OWNS JANE KNIFE] should give the answer YES.

TO DOES :FACT IF MEMBER? :FACT :DATABASE PRINT “YES ELSE PRINT “NO END

It would be much more useful for our investigation

into this terrible murder if we could ask questions

such as “Who owns an axe?’. The way we will deal with this is to use ‘variables’. Any word whose first character is ? will be assumed to be a variable. We can then paraphrase the question as: __

WHICH [OWNS ?SOMEONE AXE]

The reply to this will be a list of all possible values of the variable ?SOMEONE that are consistent with the information in the database.

[?SOMEONE MATTHEW] [?SOMEONE JOSHUA] NO (MORE) ANSWERS

We can have multiple variables. For example: WHICH [KILLED ?MAN ?IMPLEMENT}]

will give the answer:

~ [?MAN ZACHARIAH] [?IMPLEMENT AXE] ~ NO (MORE) ANSWERS

_ Let’s consider the procedures that enable this

analysis of the database, individually. WHICH passes the job over to FIND, indicating DATABASE as the source of facts.

TO WHICH :QUERY FIND :QUERY :DATABASE PRINT [NO (MORE) ANSWERS] END

FIND sets up two global variables, VARS and ANS: VARS is used to hold each possible set of values of the variables in the question, and these are collected together in the list ANS.

TO FIND :QUERIES :DATA MAKE “VARS [] MAKE “ANS [] COMPARE :QUERY :DATA PRINTL :ANS

END

COMPARE looks at each fact in the database in turn. If there is a match then the new set of values in VARS are added to ANS before setting VARS back to the empty list. COMPARE then continues working through the DATABASE to see if there are any other possible matches.

TO COMPARE :QUERY :DATA | IF EMPTY? :DATA THEN STOP IF MATCH? :QUERY FIRST :DATA THEN MAKE “ANS FPUT :VARS :ANS MAKE “VARS [] COMPARE :QUERY BUTFIRST :DATA END

To see what MATCH? does, consider the case where the inputs are [OWNS ?SOMEONE AXE] and [OWNS

JOSHUA AXE] in response to which MATCH? outputs -

TRUE and sets VARS to [?SOMEONE JOSHUA]. If the inputs are [OWNS ?SOMEONE AXE] and [KILLED ZACHARIAH AXE], then MATCH? outputs FALSE.

The real difficulties arise, however, if there is more than one variable involved. VALUE? is used to check if the variable has already been assigned a value for that fact in the database.

We have used here an alternative notation for conditionals in Loco. TEST evaluates a condition. If the result is true then the actions following IFTRUE will be performed, otherwise the actions following IFFALSE will be carried out.

TO MATCH? :QUERY :FACT IF ALLOF EMPTY? ‘QUERY EMPTY? :FACT THEN OUTPUT “TRUE ; TEST FIRST FIRST :QUERY = “? IFTRUE IF NOT VALUE? FIRST :QUERY FIRST “FACT :VARS THEN OUTPUT “FALSE [FFALSE IF NOT ( FIRST :QUERY = FIRST :FACT ) _ THEN OUTPUT “FALSE OUTPUT MATCH? BUTFIRST :QUERY BUTFIRST “FACT se END

To see how VALUE? works, let’s first consider the case where the inputs are ?/MPLEMENT, AXE, and [?MAN ZACHARIAH]. VALUE? tries to ascertain whether the variable ?IMPLEMENT could have the value AXE. There are _ three possibilities:

~?IMPLEMENT already has a value, which is not AXE,

and VALUE? outputs FALSE; ?IMPLEMENT already has the value AXE, and VALUE outputs TRUE; or ?IMPLEMENT does not have a value, so it is given the value AXE, and this information is added to VARS and TRUE is output.

TO VALUE? :NAME :VALUE :VLIST IF EMPTY? :VLIST THEN MAKE “VARS LPUT LIST “NAME :VALUE :VARS OUTPUT “TRUE TEST :NAME = FIRST FIRST :VLIST IFTRUE IF :VALUE = LAST FIRST :VLIST THEN OUTPUT “TRUE ELSE OUTPUT “FALSE OUTPUT VALUE? :NAME :VALUE BUTFIRST “VLIST | END

_ PRINTL simply arranges for the components of ANS

to be printed out below each other.

TO PRINTL :LIST IF EMPTY? :LIST STOP | PRINT FIRST :LIST PRINTL BUTFIRST :LIST END

MORE COMPLEX ENQUIRIES

Our investigation will not go far, however, unless .

we can ask more complex questions, such as “What implement killed Zachariah, and who owns such an implement?’ In Loco, this reads:

WHICH [[KILLED ZACHARIAH ?IMPLEMENT]| [OWNS ?SUSPECT ?IMPLEMENT]]

WHICH now takes a list of queries as input and the values found will be those that make all of the queries true. If you then wish to ask a single query with this new form of WHICH the syntax we use is:

WHICH [[OWNS ?ANY KNIFE]]

We need make only minor alterations to these procedures:

TO WHICH :QUERIES FIND :QUERIES :DATABASE PRINT [NO (MORE) ANSWERS] . END

TO FIND :QUERIES :DATA _ MAKE “VARS [] MAKE “ANS [] COMPARE :QUERIES :DATA PRINTL :ANS END

COMPARE now has a rather difficult job to do. Let’s take [[KILLED ZACHARIAH ?IMPLEMENT][OWNS 2SUSPECT ?IMPLEMENT]] as an example input.

_ COMPARE goes through the database, one fact at a

time, to find a match for the first query, and ends up matching ?IMPLEMENT with AXE. The routine then considers the second query ([OWNS 2SUSPECT ?IMPLEMENT]), starting again from the beginning of the database. A match is found for the second condition, with the value of ?IMPLEMENT as AXE and ?SUSPECT as MATTHEW. There are no more queries, so this is a possible solution. |

But we have not finished yet; there may be other values that satisfy the second query, while keeping ?IMPLEMENT as AXE. So COMPARE now proceeds

_ through the database from the point it left off, and indeed finds a second solution with ?SUSPECT as

JOSHUA. Of course, the procedure does not stop there, but continues searching the DATABASE. ‘This time it reaches the end without finding any new matching values.

It is possible, however, that there is another solution to the first query other than ?IMPLEMENT as AXE so we must go back to the point where we found that match in the database and carry on from there. This process is called backtracking. In this case, there are in fact no other solutions. :

THE HOME COMPUTER ADVANCED COURSE 833

In order not to lose track of where it is up to in its assignment of variables, COMPARE puts the present values on a stack before MATCH? is used (since

MATCH? may alter these assignments), and then recovers these values afterwards. Here is the full procedure:

TO COMPARE :QUERIES :DATA | IF EMPTY? :QUERIES THEN MAKE “ANS FPUT ‘VARS :ANS STOP IF EMPTY? :DATA THEN STOP PUSH :VARS TEST MATCH? FIRST :QUERIES FIRST :DATA IFTRUE COMPARE BUTFIRST :QUERIES ‘DATABASE PULL “VARS COMPARE :QUERIES BUTFIRST : DATA 7h. END

In COMPARE we use a stack to keep track of the value of VARS, instead of using a temporary variable, because COMPARE could call itself between the time we want to save the values and the time we want to restore them. Therefore, any such temporary variable could be overwritten by

834 THE HOME COMPUTER ADVANCED COURSE

the next call and the original values lost. ‘The stack prevents this from happening.

PUSH puts a value on ‘top’ of the stack, first creating the variable STACK if it does not already exist.

TO PUSH :DATA

IF NOT THING? :STACK THEN MAKE “STACK (] MAKE “STACK FPUT :DATA :STACK END

PULL takes an item from the stack, and assigns it as the value of a variable.

TO PULL :‘NAME MAKE :NAME FIRST :STACK MAKE “STACK BUTFIRST :STACK END

~ What we have then are the rudiments of a ‘logic

programming’ language. That is a language in which we simply add facts and rules to a database and then query that database by means of logical descriptions of the data we require. The best

_example to date of a logic programming language

iS PROLOG but that’s another story!

DAVID HIGHAM

See CuGE

ee

i Senseo

A special type of electric motor called a ‘stepper’ motor is used to power the Workshop. robot. Stepper motors are favoured for computer control because they use logic signals to control their speed and rotation through discrete steps and are thus ideally suited to digital control.

HES

2 aE GaU a uuu e inne stan ese anaemia RAR eR Ra i

The construction of a stepper motor is very different from that of a normal motor. To

understand the principles of operation we shall

consider how a simplified stepper motor works. In our example (see the diagram headed ‘One Step At A Time’) there are two set of windings (‘a’ and ‘b’) on the stator and two pairs of electromagnetic poles on the rotor. In the motors that are used in the Workshop robot there are more stator windings and more rotor poles than our example shows. 3

The only problem with this convenient form of motor control is that the motor consumes as much current when stationary as it does when in motion. In addition, it cannot be rotated at high speed the different coils cannot energise and de-energise quickly .enough. However neither of these problems is significant in our robot application.

Our simplified motor is capable of turning in steps of 45° only. Additionally, the direction of rotation cannot be controlled. The motors used in the robot, however, have four sets of coils that are energised in pairs, and the rotor also has many more coils than our example shows. This means that the direction of rotation may be controlled and that the step angle is reduced to 7.5°. To

achieve this accurate stepwise rotation, the four

coils must be energised in a particular and

complicated sequence as follows:

Stator Coils Energising Sequence Table Step Coil A ColB . CoilC Coil D

1 on off. on. off 2 off ON on off a off on One on 4 on off off on o on. off on Olt, sete

This sequence of energisation could be provided by software, using four bits of the user port to control the four coils. However, this requires some complicated programming and Basic could certainly not produce these control sequences quickly enough. A simpler method is to use a chip that has been specially designed for the control of stepper motors the SAA 1027. This contains the output drivers and all the logic circuits to energise the coils in the correct order to drive a stepper motor.

To rotate the motor through one step, a single pulse from the user port is required, with a further signal line being needed to determine the direction of rotation. The chip contains input stages to detect the changes in the three inputs: a pulse to rotate the motor one more step, areset input, anda direction input that reverses the stator coils energising sequence. The inputs are fed into a bi- directional counter circuit to produce the correct output sequence to the stator coils.

Finally, the chip also contains a power output driver stage that can handle up to 5|00mW. The inclusion of this stage means that the motor can be

THE HOME COMPUTER ADVANCED COURSE 835

=)

The Driving Force Although the logic of the Stepper motor driving chips is complex, the principles of operation are easily understood. In order to turn the rotor the Stator coils must be energised ‘ina certain sequence. A bi- directional counter moves through this sequence a stage at a time in response to a pulse signal. The sequence can also be stepped through in the Opposite direction if the direction line input is changed, causing the rotor to turn in the opposite direction. A third input allows the rotor to be reset to its position at the beginning of the sequence, If required

connected directly to the chip without the need for external power transistors. :

The complexity of the stepper motor driver chip means that the rest of the circuit needed for the robot control is very simple indeed. Each motor requires one of these chips, to which the motor is connected. Unfortunately, the driver chips operate at a voltage of about 12 volts, while your computer user port operates at five volts. That is, a logic zero is zero volts (or thereabouts) and a one is five volts. The driver chip inputs require zero volts for a zero input and between 7.5 and 12 volts for a one. To interface the user port to the driver chips we therefore also need a special two-voltage buffer chip with the inputs operating on one voltage and the outputs on another. This is the 40109 chip that is also needed in the circuit.

pecasoaoasente ss Risnnokusisn Rae URS Be EOC Dan uoaninn re ausnagay eenrensuyist &

pase Bas 8. aenneaaee onc

a

Repeat ess a

os EA

eats aaa vogan:

oe

ee 3h SSRN e ae SRR REREAD DORON Se Baee aa AAR RU RAARa aS Beane sofa an 3 : pasa

Bes e Dlvoguunvanaae 5 Rei s ae

ee fe oo mee Te ne PER

a

Baas CRS B

eae akan

re

Riss ie ee

Be peas PERS Ah: a

ie

Rare

cua

oR

Bay BRS On eS

y :

Bees NaRono

ie

ro

eh

eae RRaou one

Be

Past eid

Renee

ies Paonia aa

i

IER She

3 =

soe

Riis Rae

ae

ee

eae Se

Bie one

Es

eee Bes

eee penne

ao

a

5

spat hee SaaS

Soy

Sih

ges

Scr

me

SENOS

KEVIN JONES

LIZ DIXON

MOTOR 1

MOTOR 2

O4F CAPACITOR D C

| SAA 1027 CAPACITOR DRIVER CHIP

EARTH

SAA 1027 DRIVER CHIP

D3 D2

27092 RESISTOR 100Q RESISTOR ;

a.

8. * ee ® D1 | ° * 40109 BUFFER CHIP | . z | e ® DO | * i +9V 2 * @ @ +12V GoD EAE A B WIRELINKS DILSOCKET 10002 RESISTOR 2709 RESISTOR 40109 Gu, sD EvlE AB TRACK BREAKS BUFFER CHIP | e%evel ®t: es * C2) ouel 2] , onsteKenie a 12) +5V | DO D1 D2 D3 | SAA 1027 DRIVER CHIP | EARTH

SAA 1027 pu DRIVER CHIP

| TRACK BREAK

KEVIN JONES

The Circuit Diagram

The circuitry required to drive the two stepper motors is Straightforward, two SAA 1027 driver chips being used to provide the correct coil energising Sequence to each motor. As the driver chips operate at 12v and user port signals from your micro are only ov, an additional buffer chip is used to isolate the 12v circuitry from the computer and translate the low voltage user port signals into the higher voltage signals needed by the driver chips. In the next instalment we shall show how the circuit board connects to the motors and D plug and how to make the correct connections with the computer’s user port

| THE HOME COMPUTER ADVANCED COURSE 837

H { |

WUT ia MIGANN

SEU mee Rees me

BYTE THE DUST

to its conclusion with this instalment. We tie up all the loose ends of our debugging program, provide an overall view of the flow of command within it, and finally code the

SHES ERS Se Sa EE

The first task of the main module is to set up th interrupt mechanism, which allows us to set breakpoints in the program being debugged. These transfer control to the debugger and allow us to inspect the contents of the registers and memory locations. We must then obtain the starting address of the program being debugged so that control can be passed to it using the S$ command. The rest of the main routine involves getting commands from the keyboard and executing them; control is transferred to the program being debugged by the S and G commands and returned to the debugger by the SWI instructions inserted at the breakpoints. Two stages of initialisation for this module were

- coded in the last instalment (see page 817). The _ entry point for interrupts comes immediately after

the call to this subroutine. The first instruction here is to save the stack pointer, S so that it can be used to reference the values from the registers saved on the stack by the SWI. The next stage is command interpretation. We have already developed subroutines to perform all the commands, so the problem here is to select the subroutine appropriate to the command entered.

It is possible to code this as a set of nested IF statements, but we will use the fact that the Get-

~ Command routine returns an offset into a table of

command characters to perform these calls using a jump table. This is not perhaps the most efficient method in this instance, but it is a useful technique that is worth looking at. It involves setting up a table of addresses for each of the subroutines that actually carry out a command.

The JMP instruction, unlike the branch instructions, can use any of the normal addressing modes, including indexed and indirect. If we load

-X with the base address of the table and use the

offset in B (doubled because this will be a table of 16-bit addresses, unlike the table of eight-bit command letters), then the command:

JMP [B,X]

will transfer control to the appropriate subroutine. The BSR call is made to the address of this jump instruction. As we need to set up this table in advance, it is necessary to have another stage of initialisation to carry out this operation.

PROCESS SET-UP-JUMP-TABLE Data: Jump-Table is a table of eight 16-bit addresses CMDB, CMDU, etc. are the start addresses for the Subroutines

Process:

For each subroutine

Get start address

Save start address in Jump-Table Endfor

We must now consider what is to happen at the end of the run, when the quit command (Q) is issued, although there is, in fact, very little that needs doing. It makes sense to leave both the debugger and the program intact so that they can be re-entered if necessary. |

The stack should be in the same situation when we exit as it was when we started. One solution would be to use a separate stack for our program by setting S to a new value and then restoring the old value. This is often a useful technique, but in our situation it may be difficult finding unused space in memory, with the debugger sitting on top of another program. Another solution is simply to increment S by the appropriate amount to lose anything that we have left there, but this is also difficult because we do not know whether or not an interrupt has occurred and the amounts on the stack will be different. The simplest solution is to save the initial value of S and restore it as the last operation of the program.

The interrupt mechanism, as set up in the initialisation procedure, stores three bytes at the address given in the SWI vector at SFFFA; we must restore this or strange results may occur if the operating system uses SWI for its own purposes. What we clearly need is a further stage of initialisation where we save these values to be restored in our quit routine.

PROCESS SAVE-VALUES

Data: : | Saved is the five bytes to store the saved values Stack-Pointer is the current value of S, plus two SWI-Vector is found at SFFFA

Process: Save Stack-Pointer in Saved Get SWl-Vector Save three bytes at SWl-Vector in Saved

The quit routine (command Q) must simply reverse this process and transfer control back to the operating system. This can be done in a number of ways: the SWI instruction itself can be used, after its vector has been reset, or a jump can be made to a known entry point in the operating

system. A jump via the reset vector that resides at Reset-Vector is at SFFFE SFFFE is guaranteed to return control to the

- | Process: 7 3 Program Flow a u Id start. SPCR RSE usa x jee Restore three bytes from Saved at SWI-Vector These Res rueaen -Po; correspond to the debugger PROCESS QUIT eee ee program modules. They are Data: pee gery | placed in the order in which they Saved is the five bytes to store the saved values We are now ready to code the main module. The Winnthoalatene abe Stack-Pointer is the current value of S, plus two design has altered slightly from when we first ¢oloured blue indicate separate SWI-Vector is at SFFFA sketched it out, but it remains essentially the same. __ routines being called Main Module | Set-Up-Jump-Table Set-Up Interrupt Command Module

ARNRALERS

OLS E

Command G

THE HOME COMPUTER ADVANCED COURSE 839

LIZ DIXON

jz, Subroutine, WY redefining register usage. This is not really

THE MAIN MODULE

Data: Prompt for command entry is ASCII character ‘> Command-Offset into table of command characters and Jump-Table Process: Save-Values Set-Up-Jump- Table Set-Up-Interrupt Get Start-Address _ Repeat Display Prompt —Get-Command Do-Command Indefinitely

That completes our debugger program. At the moment it is rather fragmented, but that is a consequence of modular construction. At this point we can optimise the code if we wish by looking for short cuts. For example, you may find that you have had to move a lot of values around to make sure that they are in the right registers for a so you might make savings by

advisable unless memory space is very restricted. We have defined the same data areas in a number of different places, as they are required. ‘There are two ways in which you might handle data areas in the complete program: you can retain the data with the module that uses it, which is theoretically

the best option; or you can define all the data

together at the start of the program, which has real advantages if you ever want to use a disassembler (or even a debugger) on the program. _

The debugger should be loaded into any spare memory not occupied or used by the program to be debugged. It is entered by making ajump to the DEBUG entry point, so it is necessary to know this address before you start.

In the later part of this 6809 machine code series, we have tried to show the best way in which programs are developed, illustrated with a variety of techniques. Therefore, the design of our debugger program is not necessarily the most efficient way to do this particular job. If you have followed everything, however, then you should have a fairly comprehensive understanding of Assembly language programming in general, and 6809 Assembly in particular.

Set-Up- Jump-Table ADDD- #2 se care of the STABLE Space for 8 two-byte STD X++ Save it addresses LDY SFFFA Get Interrupt vector address SETUPJ LEAY JTABLE,PCR _ Base address of table in Y LDA Y+ Get first byte to be saved LEAX CMDB,PCR Start address of CMDB STA X ‘cae subroutine : SIX ,Y++ Store it in table Cl oa LEAX CMDU,PCR Start address of CMDU ae a ao subroutine RTS STX ++ Store it in table Command Q Ss eS CMDQ —LEAX ~—SAVED,PCR —_Address of Saved STX Y++ Store it in table LDY SFFFA SWI-Vector LEAX CMDS,PCR Start address of CMDS LDA 2,X First of three bytes subroutine STA Yt Restored STX Y++ Store it in table LDD 3,X -Other two bytes LEAX CMDG,PCR Start address of CMDG STD iv Restored subroutine LDS iX Saved Stack-Pointer STX ay Store it in table JMP [SFFFE] Indirect jump via reset vector LEAX CMDR,PCR a ies of CMDR Main Module STIX Y++ Store it in table PROMPT ~ FCB >. LEAX CMDM,PCR__ Start address of CMDM STACKP RMB 2 Stack-Pointer for Display- : subroutine Registers STX tt Storeitintable = DEBUG BSR SAVEIT © Save-Values : LEAX CMDQ,PCR Start address of CMDQ BSR SETUPJ Set-Up-Jump-Table | subroutine BSR INIT Set-Up-Interrupt and Get STX ++ Store it in table Start-Address This is the actual jump to the subroutine. We assume that X ENTRY STS STACKP,PCR _ Save Stack-Pointer contains the address of JTABLE and B the offset LEAX JTABLE,PCR DOCMD JMP [B,X] REPT02 LDA PROMPT,PCR _ Get prompt and BSR OUTCH display it Save-Values BSR GETCOM Get Command SAVED RMB 5 Five bytes to be saved © LSLB | Double offset for 16-bit table SAVEIT LEAX SAVED,PCR Get address to save in BSR DOCMD Obey Command TFR S,D Move S to D BRA REPT02 Next Command

840 THE HOME COMPUTER ADVANCED COURSE

Here, courtesy of Oric Products International, we publish the first instalment of the 6502 programmers’ reference card

DESCRIPTION IMPLIED | IMMED | PAGE ae

ADD WITH CARRY 69 | 65 LOGICAL AND : 25 ARITHMETIC SHIFT LEFT 06 BRANCH ON CARRY CLEAR

BRANCH ONCARRY SET

we ae Bont RELATIVE ADDRESS | ADDRESS

6D 2D

BRANCH IF EQUAL TO ZERO

COMPARE BITS WITH ~ ACCUMULATOR

BRANCH ON MINUS BRANCH ON NOT EQUAL TO ZERO BRANCH ON PLUS

BREAK

BRANCH ON OVERFLOW CLEAR BRANCH ON OVERFLOW SET CLEAR CARRY

CLEAR DECIMAL

i

COs ACS CO | C4

C6 fee

CLEAR INTERRUPT MASK CLEAR OVERFLOW FLAG

| COMPARE TO ACCUMULATOR | COMPARE TO REG-X / COMPARE TO REG-Y¥3 DECREMENT MEMORY DECREMENT REG-X DECREMENT REG-Y EXCLUSIVE OR ACCUMULATOR INCREMENT MEMORY INCREMENT REG-X X ‘t

INCREMENT REG-Y Y JUMP TO ADDRESS PC

2 ED SLD

S xx ca

KA Re OR KO ee

a i oi & q f i NE Be i & é ae s ae e rene or rs : : 4 i ni 2 ce

3 fs F S -

; escent es ¥ ?

aku, F

F ¢ A " ss Fe pa

\ribemeanonenenaia

es a