464 lines
14 KiB
Groff
464 lines
14 KiB
Groff
|
||
The Language of Robots
|
||
|
||
The Source Code
|
||
Robot programs are written in source code and then translated by the
|
||
assembler into robot-understandable object code. Source code is composed
|
||
of comments, labels, and instructions.
|
||
|
||
1. Comments:
|
||
Comments are used for documenting the source code. Comments can appear
|
||
anywhere in the program as long as they are preceded by a semi-colon.
|
||
|
||
] A TO B ;This stores a in b
|
||
|
||
This is an example of a comment on the same line as an instruction.
|
||
|
||
2. Labels:
|
||
A label is a reference point used to identify sections within a program.
|
||
Labels are used in instructions to change the order of execution of the
|
||
program.
|
||
|
||
A label is composed of a group of 2 or more alpha-numeric characters
|
||
immediately following a RETURN symbol (]). A label must start with an
|
||
alpha character (A to Z) and must be less than 32 characters long. A
|
||
label can not be the same as any of the register names or command
|
||
words.
|
||
|
||
3. Instructions
|
||
Instructions are used to control the robot's micro-computer brain.
|
||
Instructions may contain register names, command words and numbers
|
||
(-1024 to +1024)
|
||
|
||
|
||
Command words: a) 'TO' stores a value in a register
|
||
|
||
b) 'IF' compares two values and alters program flow. use these
|
||
conditions:
|
||
= equal
|
||
# not equal
|
||
< less than
|
||
> greater than
|
||
|
||
c) 'GOTO' jumps to a label in the prog.
|
||
|
||
d) 'GOSUB' calls a subroutine
|
||
|
||
e) 'ENDSUB' returns from a subroutine
|
||
|
||
f) math operators
|
||
+ adds two values
|
||
- subtracts two values
|
||
* multiplies two values
|
||
/ divides two values
|
||
|
||
|
||
Restrictions:
|
||
|
||
a) no parentheses allowed
|
||
|
||
b) use only integer numbers between +1024 and -1024
|
||
|
||
c) you must use a condition sign when using an 'IF'
|
||
|
||
d) you may store negative NUMBERS in a register, but you can't store
|
||
negative REGISTERS in a register.
|
||
|
||
e) all math operations are done from left to right
|
||
|
||
|
||
The TO command
|
||
|
||
The TO command is used to store a value in a register.
|
||
|
||
] 240 TO A
|
||
|
||
This example line of source code causes the computer to load the
|
||
accumulator with a value of 240 and the store it in the A register.
|
||
|
||
|
||
] B TO A
|
||
|
||
This example causes the computer to load the accumulator with the
|
||
contents of the B register and then store it in the A register.
|
||
|
||
|
||
] 0 TO SPEEDX TO SPEEDY
|
||
|
||
This example causes the computer to load the accumulator with 0 and
|
||
store it first in the SPEEDX and register and then in the SPEEDY
|
||
register. This could be used to stop a robot's movement.
|
||
|
||
|
||
NOTE: Negative numbers can be stored as in the following example:
|
||
|
||
] -240 TO SPEEDX
|
||
|
||
But, you CANNOT store the negative of a register in that manner. For
|
||
example:
|
||
|
||
] -B TO A
|
||
|
||
Will NOT store the negative of B in A. To store a negative of a register
|
||
subtract the register from zero. For example:
|
||
|
||
] 0 -B TO A
|
||
|
||
Arithmetic commands (+ - * /)
|
||
|
||
Arithmetic operations can be performed on a value stored in the
|
||
accumulator. Whenever the program encounters one of the arithmetic signs
|
||
it performs the calculation using the contents of the accumulator and
|
||
the value that follows. It then stores the results of the calculation in
|
||
the accumulator.
|
||
|
||
] 240 + 100 TO A
|
||
|
||
This example loads 240 into the accumulator, adds 100 to it, and stores
|
||
the result (340) in the A register.
|
||
|
||
The IF command
|
||
|
||
The IF command is used to compare a value with the contents of a
|
||
register. It can test to see if a register is less than (<), greater
|
||
than (>), equal to (=), or not equal to (#) a value. If the comparison
|
||
is true the computer executes the next TO, GOTO, GOSUB or ENDSUB
|
||
command. If the comparison is false the computer skips the next TO,
|
||
GOTO, GOSUB or ENDSUB commands.
|
||
|
||
The GOTO command
|
||
|
||
A GOTO command causes the program to change it's sequence of execution
|
||
by going to a designated label and continuing its execution from there.
|
||
A GOTO instruction must always be followed by a label.
|
||
|
||
The GOSUB command
|
||
|
||
Another way to change the execution sequence is to use a GOSUB command.
|
||
A GOSUB instruction is similar to a GOTO command. GOSUB must always be
|
||
followed by a label. GOSUB will cause the program to go to the
|
||
designated label and continue the execution until it reaches an ENDSUB.
|
||
When it encounters the ENDSUB, the program will then return to the next
|
||
instruction after the GOSUB.
|
||
|
||
Caution:
|
||
|
||
Some illegal statements will be translated by the assembler, but then
|
||
will do odd things when executed.
|
||
|
||
|
||
Programming a Robot
|
||
|
||
In order to make a robot perform, you must construct a program using the
|
||
RobotWar language and your own strategy. This chapter gives examples of
|
||
how instructions can be constructed, suing registers. numbers, and
|
||
commands, and how those instructions can be labeled and sequenced to
|
||
create program routines.
|
||
|
||
Movement
|
||
|
||
Moving about the battlefield is an action a robot performs. To start a
|
||
robot moving, store a value in the speedx or speedy register.
|
||
|
||
] 20 to speedx
|
||
|
||
] 250 to speedy
|
||
|
||
would start the robot moving down and to the right. However, the robot
|
||
would continue to move in those directions, and would eventually hit a
|
||
wall. Therefore, you must stop it at some point, by storing a zero in
|
||
the speedx and speedy registers.
|
||
|
||
] 0 to speedx
|
||
|
||
|
||
A robot can only accelerate or brake at 40 decimeters/second. Even
|
||
though 120 is entered into speedx register, it takes 3 seconds of
|
||
acceleration to obtain that speed. Conversely, if your robot is
|
||
travelling at 120 decimeters/sec it takes 3 seconds to stop the robot,
|
||
after storing 0 in the speedx register.
|
||
|
||
A movement routine can be established, by incorporating the starting and
|
||
stopping procedures into a test loop.
|
||
|
||
] 256 TO SPEEDX
|
||
|
||
]MOVER1
|
||
|
||
] IF X > 230 GOTO STOP
|
||
|
||
]STOP
|
||
|
||
] 0 TO SPEEDX
|
||
|
||
Moves the robot to the right until it's X position is tested to be
|
||
greater than 230 and then it stops.
|
||
|
||
Monitoring Damage
|
||
|
||
Monitoring damage is vital to a robot's survival. When a robot detects a
|
||
hit, it usually moves to avoid being repeatedly hit by the enemy. By
|
||
using the DAMAGE register, a damage detection routine can be
|
||
established. This routine is usually nested inside another routine's
|
||
loop so that the robot can be checking for damage while it is performing
|
||
some other action.
|
||
|
||
] DAMAGE TO D
|
||
|
||
Saves current damage in register D.
|
||
|
||
]DAM1
|
||
|
||
] IF DAMAGE # D GOTO MOVE
|
||
|
||
|
||
When any damage is incurred, the DAMAGE register will change, but
|
||
register D will not. Therefor, any difference between the two registers
|
||
will indicate that the robot has been hit. In this example any
|
||
difference will cause the program to go to the label MOVE.
|
||
|
||
Scanning
|
||
|
||
Another important action a robot performs is scanning. When a robot
|
||
scans it is using it's radar beams to detect the location of other
|
||
robots and walls. To emit a radar beam, store a number, between 0 and
|
||
359 in the RADAR register.
|
||
|
||
] 90 TO RADAR
|
||
|
||
Will send a radar beam in the 90-degree direction, and when the beam
|
||
returns, it's value will be stored in the RADAR register. A routine to
|
||
determine if the robot has spotted another robot is:
|
||
|
||
]LOOK
|
||
|
||
] AIM + 5 TO AIM
|
||
|
||
] AIM TO RADAR
|
||
|
||
] IF RADAR < 0 GOTO SHOOT
|
||
|
||
] GOTO LOOK
|
||
|
||
When the program executes this routine, it first encounters the label
|
||
LOOK and goes on to the next instruction. This instruction (AIM + 5 TO
|
||
AIM) increments the angle in which the gun is aimed, five degrees. The
|
||
next instruction (AIM TO RADAR) aligns the angle of the radar to the
|
||
angle of the gun, emits a radar beam in that direction, and then stores
|
||
the results of that beam in the RADAR register.
|
||
|
||
The next instruction (IF RADAR < O GOTO SHOOT) analyzes the results of
|
||
the radar's findings. If the RADAR register contains a positive number,
|
||
there are no robots in that direction and the comparison will be false.
|
||
Since the comparison is false, the next command will be ignored and the
|
||
program will go on to the next command (GOTO LOOK). This command will
|
||
cause the program to go to the label LOOK. This completes the loop and
|
||
the scan routine will continue until a robot is found.
|
||
|
||
If the RADAR register contains a negative number, After the beam
|
||
returns, the comparison (IF RADAR < 0) will be true. Therefor, the next
|
||
command (GOTO SHOOT) will be executed. In this case the program sequence
|
||
would branch to the instruction following the label SHOOT.
|
||
|
||
Shooting
|
||
|
||
|
||
It is usual procedure to execute a shooting routine when an enemy is
|
||
spotted.
|
||
|
||
]SHOOT
|
||
|
||
] 0 - RADAR TO SHOT
|
||
|
||
] GOTO LOOK
|
||
|
||
Is an example of a simple shoot routine. Since a robot has been spotted
|
||
by radar, a negative number is presently stored in the RADAR register.
|
||
The enemy robot is that number (ignoring the negative sign) of meters
|
||
away. In order to obtain a positive number of the distance, the program
|
||
subtracts RADAR from 0. This new positive number is then stored in the
|
||
SHOT register. Storing the number in the SHOT register causes the gun to
|
||
fire a shell that has been set to explode at that distance, in the
|
||
direction indicated by the contents of the AIM register.
|
||
|
||
Random Number Generation
|
||
|
||
|
||
The RANDOM register is used to generate random numbers. A few examples
|
||
of random number routines are:
|
||
|
||
] 100 TO RANDOM
|
||
|
||
] RANDOM TO A
|
||
|
||
This routine stores 100 in the RANDOM register, which sets the limit for
|
||
the generator. The generator then returns a random number from 0 to 99
|
||
and stores it in the RANDOM register. That value is then stored in A by
|
||
the TO command. From then on each time the contents of the RANDOM
|
||
register is stored in a register, the generator will return a different
|
||
number. The limit of the generator will only change when a new value is
|
||
stored in the RANDOM register by using the TO command.
|
||
|
||
] B + 1 - A TO RANDOM
|
||
|
||
] RANDOM + A TO C
|
||
|
||
This routine stores a random number between A and B into the C
|
||
register.
|
||
|
||
A Sample robot in source code
|
||
|
||
;SAMPLE ROBOT 'RANDOM'
|
||
|
||
] 250 TO RANDOM ;INITIALIZE RANDOM -- 250
|
||
MAXIMUM
|
||
]
|
||
]START
|
||
] DAMAGE TO D ;SAVE CURRENT DAMAGE
|
||
]
|
||
]SCAN
|
||
] IF DAMAGE # D GOTO MOVE ;TEST -- MOVE IF HURT
|
||
] AIM+17 TO AIM ;CHANGE AIM IF OK
|
||
]
|
||
]SPOT
|
||
] AIM TO RADAR ;LINE RADAR WITH LAUNCHER
|
||
] IF RADAR>0 GOTO SCAN ;CONTINUE SCAN IF NO ROBOT
|
||
] 0-RADAR TO SHOT ;CONVERT RADAR READING TO
|
||
]DISTANCE AND FIRE
|
||
] GOTO SPOT ;CHECK IF ROBOT STILL THERE
|
||
]
|
||
]MOVE
|
||
] RANDOM TO H
|
||
] RANDOM TO V ;PICK RANDOM PLACE TO GO
|
||
]
|
||
]MOVEX
|
||
] H-X*100 TO SPEEDX ;TRAVEL TO NEW X POSITION
|
||
] IF H-X>10 GOTO MOVEX ;TEST X POSITION
|
||
] IF H-X<-10 GOTO MOVEX ;TEST X POSITION
|
||
] 0 TO SPEEDX ;STOP HORIZONTAL MOVEMENT
|
||
]
|
||
]MOVEY
|
||
] V-Y*100 TO SPEEDY ;TRAVEL TO NEW Y POSITION
|
||
] IF V-Y>10 GOTO MOVEY ;TEST Y POSITION
|
||
] IF V-Y<-10 GOTO MOVEY ;TEST Y POSITION
|
||
] 0 TO SPEEDY ;STOP VERTICAL MOVEMENT
|
||
] GOTO START ;START SCANNING AGAIN
|
||
]
|
||
|
||
Writing and Editing Source Code
|
||
|
||
Robot programs are entered into the computer using a text editor.
|
||
|
||
The text editor may be entered by selecting option 3 from the Main Menu,
|
||
or by selecting option 6 from the Assembler menu.
|
||
|
||
Text-Editor Procedure
|
||
|
||
When you first enter the text editor, you will see a blank screen with
|
||
some numbers at the bottom and a flashing square at the top. The numbers
|
||
at the bottom show the length of the text, and the file name under which
|
||
it is stored. The flashing square is called the cursor, and is the
|
||
computer equivalent of a pen for writing characters. As you use the
|
||
text-editor you will be operating in two modes; the add mode and the
|
||
cursor mode. The add mode is used to delete text at the cursor, move the
|
||
cursor around in the text, adjust the position of the text on the
|
||
screen, load source code files from the catalog, and save source code
|
||
files to the catalog.
|
||
|
||
The blank screen indicates that the current text-editor file is empty.
|
||
At this point there are two available options. One option is to begin
|
||
writing a new source code, and the other option is to edit a robot that
|
||
has already been stored.
|
||
|
||
|
||
Ctrl-A to enter the add mode. The letter "A" will appear in the lower
|
||
RIGHT corner of the screen. You can now create a new source code file.
|
||
|
||
Esc Esc exits you from the add mode.
|
||
|
||
Ctrl-S to save the file on the disk. The word "SAVE" will appear on the
|
||
left side of the screen. To save the new robot program you just created
|
||
you must give it a name. The name can be no longer than 7 characters and
|
||
must not be the same as any other robot on the disk.
|
||
|
||
Ctrl-L loads a file from the disk. The word "LOAD" will appear on the
|
||
left side of the screen.
|
||
|
||
Cursor Mode
|
||
|
||
|
||
You are now ready to perform the second available option when the
|
||
text-editor has been loaded, which is editing the source code file. When
|
||
editing source code you will use the cursor mode to delete text at the
|
||
cursor, move the cursor around in the text, adjust the position of the
|
||
text on the screen, load source code files, and save source code files.
|
||
These functions are described below:
|
||
|
||
1. Cursor Movement
|
||
|
||
The cursor can be moved to any location in the file by using the five
|
||
keys on the right side of the keyboard.
|
||
|
||
A) The RETURN key moves the cursor up one line
|
||
|
||
B) The left and right arrow keys.
|
||
|
||
C) The slash (/) key moves the cursor down one line.
|
||
|
||
To move the cursor all the way in any direction on the screen, press the
|
||
Esc key and then the direction key.
|
||
|
||
Once you have positioned the cursor where you want it, there are several
|
||
options. Either exit to the add mode, and write some text or stay in the
|
||
cursor mode and use a cursor function.
|
||
|
||
NNN
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|