This version of Tiny Basic is a port by Paul Akterstam for the D-X Designs' Z180-based P112 Single Board Computer of Sherry Bros. Tiny Basic V3.1, itself a port for CP/M of Li-Chen Wang's Palo Alto 8080 TINY BASIC, V1.0, dated 10 June 1976. Additions have been made (see below) from Don McKenzie's Z8TBASIC, V2.0, also based on the Sherry Bros. version, and from Gordon Brandly's TBI68K, V1.2, a version of Tiny Basic for the Motorola 68000.
Added are alternatives to Tiny Basic's PRINT (?) and REM ('), the 8-bit logical operators AND, OR, XOR, SHIFT LEFT and SHIFT RIGHT (from Z8TBASIC), and the PRINT command modifier '$' for printing control characters (from TBI68K). USR functions to access the P112 real time clock (RTC) and a programmable delay have also been added. Note: Hal's ROM4b for the P112 or newer is required in order to use the USR functions for the real time clock. The 'not equal to' operator # has been replaced with <>.
This guide is based on Li-Chen Wang's original Tiny Basic documentation. P112 Tiny Basic is contributed to the P112 software pool under the GNU License.
This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
3.1 NUMBERS
In Tiny Basic, all numbers are decimal integers within the range of -32767 to 32767. In order to represent the full range of numbers between 0 and 0FFFFH the properties of two's complement arithmetic should be understood. For example, in order to PEEK at memory location 0FFFFH, the parameter -1 should be used as the PEEK function argument.
3.2 VARIABLES
There are 26 scalar variables denoted by the letters A through Z. The only array variable is denoted by '@(I)'. Its dimension is limited by the size of the Tiny Basic program. See the description of the FRE function.
3.3 FUNCTIONS
There are five functions in Tiny Basic:
ABS(X) Returns the absolute value of the variable X. INP(X) Returns data read from input port X. (0<=X<=255) PEEK(X) Returns the contents of memory location X. (-32767<=X<=32767) RND(X) Returns a random number between 1 and X (inclusive). FRE Returns the number of bytes left unused by the program. USR(X[,Y]) Calls the machine language subroutine at location X. Optional parameter Y is passed in the HL register and the value of the function is returned in the HL register. All other registers must be preserved.
3.4 ARITHMETIC, COMPARISON AND LOGICAL OPERATORS
The following operators are supported:
/ integer divide (fractional results not returned) * integer multiply - subtract + add > compare if greater than < compare if less than = compare if equal to <> compare if not equal to >= compare if greater than or equal to <= compare if less than or equal to a 8-bit logical AND o 8-bit logical OR x 8-bit logical XOR l 8-bit logical SHIFT LEFT r 8-bit logical SHIFT RIGHT
The +, -, *, and / operations return a value within the range -32767..32767. (-32768 is also allowed in some cases.) All compare operations result in a 1 if the comparison is true and a 0 if it is false.
NOTE: multiple assignment statements are not supported, i.e. LET A=B=0 is interpreted by Tiny Basic as meaning 'set A to the result of comparing B with 0'.
3.5 EXPRESSIONS
Expressions are formed with numbers, variables, and functions with arithmetic and compare operators between them. + and - signs can also be used at the beginning of an expression. The value of an expression is evaluated from left to right, except that the * and / operators are always given precedence, with + and -, and then the compare operators following, in that order. Parentheses can be used to alter the order of evaluation in the standard algebraic sense.
3.6 STATEMENTS
A Tiny Basic statement consists of a statement number between 1 and 32767 followed by one or more commands (see COMMANDS below). More than one statement may be placed on a line, but each must be separated from the last by a colon. Exceptions are statements containing GOTO, GOSUB, RETURN, and STOP which must be the last statements on a line.
3.7 PROGRAM
A Tiny Basic program consists of one or more statements. When the direct command (see DIRECT COMMANDS below) RUN is issued, the statement with the lowest statement number is executed first, then the one with the next lowest statement number, etc. The GOTO, GOSUB, STOP, and RETURN commands can alter this normal sequence. Within any statement the execution takes place from left to right. The IF command can cause remaining commands within the same statement to be skipped.
3.8 ABBREVIATIONS AND BLANKS
Tiny Basic statements and commands may use blanks freely, except that numbers, command key words, and function names may not have embedded blanks. All Tiny Basic command key words and function names may be abbreviated by following the abbreviation with a period. For example, PR., PRI., and PRIN. all stand for PRINT. The word LET in the LET command may be omitted. Additionally, a question mark (?) and an apostrophe (') can be used in place of the PRINT and REM commands respectively.
3.9 ERROR MESSAGES
There are only three error messages in Tiny Basic. When an error is encountered the error message itself is printed, followed by the statement causing the program error with a question mark (?) inserted at the point where the error is detected. Control is then passed to the Tiny Basic monitor. A synopsis of the three error conditions follow.
3.9.1 SYNTAX ERROR
SYNTAX ERROR 210 P?TINT "THIS"A SYNTAX ERROR indicates that Tiny Basic did not understand the statement or command. In the example above, the command PRINT was mistyped on statement number 210.
3.9.2 OUT OF RANGE
OUT OF RANGE 260 LET A=32000+5000?An OUT OF RANGE error indicates that Tiny Basic understands but cannot execute the statement or command. In the example above, the sum of the numbers exceeds 32767.
3.9.3 OUT OF MEMORY
An OUT OF MEMORY error indicates that Tiny Basic cannot execute the statement or command due to insufficient memory. To free more memory, replace as many as possible of the Tiny Basic program commands with acceptable abbreviations and remove REM statements.
3.10 STATEMENT COMMANDS
Tiny Basic statement commands are listed below with examples. Remember that commands can be concatenated with colons. In order to store any given statement, you must precede that statement with a statement number between 1 and 32767. Statement numbers are NOT shown in the examples.
3.10.1 LET
LET A=234-5*6:A=A/2:X=A-100:@(X+9)=A-1The LET command assigns the value of an expression to the specified variable. In the example above, the variable A assumes the value of the expression '234-5*6', or 204. Then the variable A assumes the value 102. Next, the variable X is set to the value of the expression 'A-100', or 2. The last command assigns the value 101 to the array variable @(11). The LET portion of the LET command is optional; i.e. the following examples are valid:
A=10 C=5*3/5:C=C*53.10.2 REM or (')
REM ANYTHING CAN BE WRITTEN AFTER "REM" 'THIS STATEMENT IS ALSO IGNORED
Tiny Basic ignores the REM command. It is used by experienced programmers to comment BASIC programs. A program comment is used by programmers to remind them of the logic of a program section. All good programs are invariably commented. Note that an apostrophe (') can be used in place of the REM command.
3.10.3 PRINT or (?)
PRINT will cause a carriage-return (CR) and a line-feed (LF) on the output device. Note that a question mark (?) can be used in place of the PRINT command.
PRINT A*3+1,"ABC"this can also be written as
? A*3+1,"ABC"This form of the PRINT command will print the value of the expression A*3+1 on the output device, followed by the string ABC on the same line. Note that single (') or double quotes (") may be used to denote character strings, but that pairs must be matched.
PRINT A*3+1,"ABC",This form of the PRINT command will produce the same results as the previous example except that the trailing comma at the end of the statement inhibits the normal CR-LF. This allows other PRINT commands to print on the same line.
PRINT A,B,#3,C,D,E,#10,F,GThis form of the PRINT command demonstrates format control. The format character # is used to indicate the number of leading spaces to be printed before a number. The default number is 6. Once the # format is invoked it is active for the remainder of the statement unless overridden by a subsequent format specifier, as in the example.
PRINT $27,'[2J'This form of the PRINT command demonstrates the use of $ to print control characters. In this case $27 will print an ESC character to the screen followed by [2J which is the ANSI escape sequence to clear the screen. Note that the control character must be in decimal.
3.10.4 INPUT
INPUT A,BThe INPUT statement is used to acquire input data during program execution. In the example above, Tiny Basic will print A: and wait for a number to be typed at the console terminal. Next, Tiny Basic will print B: and wait for another number to be typed at the console terminal. In this example the variables A and B will assume the values of the appropriate input values. The INPUT statement will accept expressions as well as numbers as input.
INPUT 'WHAT IS THE WEIGHT'A,"AND SIZE"BIn this example Tiny Basic will print the string WHAT IS THE WEIGHT: and wait for operator input. Next, the string AND SIZE: will be printed on the same line and Tiny Basic will again wait for operator input.
3.10.5 IF
IF A<B LET X=3:PRINT 'THIS STRING'The IF command works with the comparison operators (enumerated above) to check the validity of the specified comparison condition. In this example, if the comparison A<B is true, then the balance of the commands in the statement are executed. However, if the comparison tests false, then the balance of the commands in the statement are NOT executed and control passes to the next executable statement.
IF A<B GOTO 100This example illustrates a common use of the IF command and the GOTO (see below) command. If the comparison tests true control is passed to statement number 100, otherwise execution passes to next executable statement.
3.10.6 GOTO
GOTO 120This statement is used to modify the normal sequence of execution of Tiny Basic statements. In this example, control is passed unconditionally to statement number 120.
GOTO A*10+BThis form of the GOTO is called a 'computed GOTO'. In this case, control is passed to the statement number represented by the expression that follows GOTO.
3.10.7 GOSUB ... RETURN
GOSUB 120The GOSUB command is used to invoke a subroutine at the specified statement number (120 in the example). Control is passed to statement number 120 and execution continues. A RETURN command is used, within the subroutine, to cause Tiny Basic to pass control to the statement that immediately follows the GOSUB command that caused the subroutine to execute. GOSUB commands can be nested, limited by the size of the stack space (see below).
GOSUB A*10+BIn this example, the subroutine at the statement number equal to the value of the expression is executed. This form of the statement will cause a different subroutine to be executed depending upon the value of the expression that follows GOSUB.
3.10.8 FOR ... NEXT
FOR X=1 TO 10 PRINT 'HELLO' NEXT XThe FOR command is used to set up execution loops. In the Tiny Basic program segment above the statement PRINT 'HELLO' is executed 10 times since it is placed between the FOR statement and the NEXT statement. The NEXT X statement has the effect of incrementing X by one and passing control to the FOR statement. If the new value of X is still less than or equal to 10, the Tiny Basic statements between FOR and NEXT are executed again. This process repeats until X is incremented past the loop termination value (10 in the example above).
FOR X=1 TO 10 STEP 2 PRINT 'HELLO' NEXT XSTEP In the above variant of the FOR command the loop increment has been changed from 1 (the default) to 2 by means of the STEP clause. In this case, the program fragment would only print HELLO five times if executed. FOR commands can be nested, that is, one FOR loop can contain other FOR loops provided that the loop variables (the variable X in the examples) are different. If a new FOR command with the same loop variable as that of an old FOR command is encountered, the old FOR will be terminated.
3.10.9 STOP This command stops the execution of a Tiny Basic program and passes control to the Tiny Basic monitor.
3.10.10 PEEK
PEEK(I)The PEEK command returns the byte read from memory location I. I must be in the range -32767 to 32767. The returned value is in the range 0 to 255.
Note that decimal values of I from 0 to 32767 correspond to the hexadecimal values of 0 to 7FFF. The values of I from -32767 to -1 correspond to the hexadecimal values 8001 to 0FFFF.
PEEK(8192) reads the byte at memory location 2000H.
3.10.11 POKE
POKE I,J[,K,L]The POKE command writes data J in memory location I, then optionally writes data L in memory location K. All variables may be expressions. I must be in the range -32767 to 32767 and J in the range 0 to 255.
POKE -20480,255 writes the byte 0FFH to memory location 0B000H.
3.10.12 INP
INP(I)The INP command returns the byte read from port I where I is in the range 0 to 255.
X=INP(140) returns a byte from the P112 parallel data port 8CH in X.
X=(INP(141)a 32) uses masking to return the value of bit 5 in X by ANDing 32 with the byte returned from P112 parallel status port 8DH. (X will equal 0 or 32)
X=((INP(141)r 5)a 1) returns the value of bit 5 as 0 or 1 by SHIFTing the byte returned from P112 parallel status port 8DH right 5 times then ANDing with 1.
3.10.13 OUT
OUT I,J[,K,L]
The OUT command sends a byte or integer expression J to port I then optionally sends byte L to port K. This may be repeated as many times as necessary. All parameters are integer expressions .
OUT 140,1 sets bit 0 (D0) 'high' on the P112 parallel data port 8CH.
3.10.14 WAIT
WAIT I,J[,K]
The WAIT command causes Tiny Basic execution to pause and wait for a specified value at an input port. The value at port I is read, exclusive OR'd with the value of the expression J, and the result is AND'd with the value of expression K. If the final result is non-zero, execution continues with the next statement. If K is omitted, it is assumed to be 0. I, J and K are all integer expressions in the range 0 to 255.
WAIT 141,32 causes program execution to pause until bit 5 (PPR END) of the P112 parallel status port 8DH goes 'high'.
WAIT 141,32,255 causes program execution to pause until bit 5 (PPR END) of the P112 parallel status port 8DH goes 'low'.
3.10.15 USR
USR(I[,J])
The USR function (not a command) calls a machine language subroutine at decimal address I. If the address is not within 0..32767 (0..7FFFH), the address can be calculated as follows: decimal_address-65536. This gives valid addresses in the range -32767 to -1 (8001H..FFFFH). Note that the address 32768 (the same as -32768 or 8000H) will give an OUT OF RANGE error. If the optional parameter J is used, its value is passed in register HL. The value of the function should be returned in register HL. Note that the called machine language routine must execute a RET instruction.
A=USR(-20480,1) calls the machine language subroutine at location 0B000H, passing to it, in the HL register, the value 1. The value of the function is then returned, through the HL register, to the integer variable A.
3.10.15.1 Available USR subroutines in ROM (P112 TINY BASIC V1.0):
USR(12292) | GETIME - Fetches 8 packed-BCD bytes from the P112 RTC by pointing HL to the P112 timAry buffer space at 0FF2AH then calling the P112 RdClk subroutine at 2245H. Note that there is no return value. Use prior to executing RDTIME. Requires the ROMV4b ROM or newer. |
USR(12295,N) | RDTIME - Get selected time data from the timAry buffer. The
parameter N is an integer from 0 to 6 used as an offset into the buffer. The
packed-BCD in the buffer is converted to a hexadecimal number then returned
as a decimal integer. Execute GETIME before using RDTIME to get the current
time. Requires the ROMV4b ROM or newer.
OFFSET RETURNS ------ ------- '0' Seconds '1' Minutes '2' Hours (in 24-hour format) '3' Date '4' Month '5' Day-of-the-Week (1=Sunday) '6' Year (last 2 digits) Y2K Note: The year is accurate over the range 1978-2076. For details, see Hal Bower's P112 ROMV4b source code. |
USR(12298) | PRTIME - Prints a date/time string on screen using the P112 ROMV4b subroutine RTime. Note that there is no return value. Requires the ROMV4b ROM or newer. |
USR(12301,L) | DELAY - Wait for a time determined by the integer passed in L. L=1 gives approx. 1 sec delay (at 16MHz). Note that there is no return value. |
Direct commands are those commands that can be invoked only by the operator when Tiny Basic is in command mode (i.e. in response to the '>' prompt). All statement commands (those listed above) can be invoked while in command mode. Recall that a statement consists of a statement number followed by one or more commands. If the statement number is missing, or if it is 0, the command will be executed immediately after typing the terminating CR. The following commands can be used as direct commands; they CANNOT be used as part of a Tiny Basic statement.
3.11.1 RUN
The RUN command causes execution of the stored Tiny Basic program. Execution will start at the lowest numbered statement and continue until there are either no more statements to execute or a STOP command is found. Execution of a Tiny Basic program can also be terminated by typing control-C at the console. This passes control back to the Tiny Basic command mode.
3.11.2 LIST
The LIST command is used to display the current Tiny Basic program on the operator's console. The statements will be listed in numerical order. If LIST is followed by a line number (e.g. LIST 200) the listing will start with that line number and continue until the last statement is reached or until terminated by typing a control-C.
3.11.3 NEW
The NEW command deletes the current program from Tiny Basic's memory.
3.11.4 SYSTEM
The SYSTEM command terminates Tiny Basic, passing control back to the P112 debugger.
3.12 CONTROL COMMANDS
Ctrl-C Typing a Control-C while a Tiny Basic program is running will cause the program to terminate. Control is then passed back to the command mode and 'OK' is written on the console along with a new prompt '>'.
P112 Tiny Basic is located in the P112 ROM from 3000H to 39E8H. It is initiated (COLD START) from the P112 debugger. Tiny Basic will sign-on, announce 'OK' and then prompt '>' awaiting operator interaction.
4.1 STARTING TINY BASIC FROM THE DEBUGGER (COLD START)
=G 3000 <cr> P112 TINY BASIC V1.0 (ROM), 18 FEB '99 OK >4.2 EXITING TINY BASIC
The SYSTEM command is used to terminate Tiny Basic and pass control back to the P112 debugger.
>SYSTEM <cr> Break at 3996 =4.3 WARM-STARTING TINY BASIC
To go back to Tiny Basic, retaining a previous program intact in memory, execute a 'warm start' from the P112 debugger.
=G 3002 <cr> OK >4.4 LOADING TINY BASIC PROGRAMS
Although Tiny Basic programs can be written and edited directly on the Tiny Basic console, it is much easier to prepare programs with an external text editor. These programs can then be uploaded to P112 Tiny Basic using ASCII file transfer from a terminal program or, if using Windows, by using copy-and-paste to paste the program text into the P112 Tiny Basic terminal window.
' ? LET RETURN * a LIST RND + ABS NEW RUN - FOR NEXT STEP / FRE o STOP < GOSUB OUT SYSTEM <= GOTO PEEK TO <> IF POKE USR = INP PRINT WAIT > INPUT r x >= l REM
6.1 PROGRAM 1
10 REM **************************** 20 REM *** PLAY THE HI/LOW GAME *** 30 REM **************************** 40 N = RND(100):C =0 50 INPUT "GUESS A NUMBER?", G 60 C = C+1 70 IF G=N GOTO 110 80 IF G>N PRINT "LOWER" 90 IF G<N PRINT "HIGHER" 100 GOTO 50 110 PRINT "YOU GUESSED IT IN", C, " TRIES!"6.2 PROGRAM 2
10 'Demo of P112 Tiny BASIC logical operators 20 'PA 30 ' 100 INPUT A,B 110 PRINT 120 IF (A=0) a (B=0) PRINT 'Both A and B equal 0' 130 IF (A=1) o (A=3) PRINT 'A equals 1 or 3' 140 IF A a B PRINT 'Neither A nor B equals 0' 150 IF A o B PRINT "A and B don't equal 0" 160 IF A x B PRINT "A doesn't equal B" 170 ? 180 GOTO 100Sample output from Program 2
>RUN A:1 B:5 A equals 1 or 3 Neither A nor B equals 0 A and B don't equal 0 A doesn't equal B A:3 B:0 A equals 1 or 3 A and B don't equal 0 A doesn't equal B A:8 B:8 Neither A nor B equals 0 A and B don't equal 0 A:0 B:0 Both A and B equal 0 A: OK >6.3 PROGRAM 3
10 '------------------------------------------ 20 'WAIT FOR P112 PORT 8DH (PARA STATUS PORT) 30 'BIT 5 (PPR END) TO GO HIGH PA 990109 40 '------------------------------------------ 50 ?'WAITING FOR PORT 141, BIT5 TO GO HI...' 60 WAIT 141,32 70 ?'THE PORT IS NOW HIGH' 90 GOTO 506.4 PROGRAM 4
10 '------------------------------------------ 20 'WAIT FOR P112 PORT 8DH (PARA STATUS PORT) 30 'BIT 5 (PPR END) TO GO LOW 35 'AN EXAMPLE OF 'WAIT I,J,K'. NOTE THAT THIS 37 'GIVES THE OPPOSITE RESULT OF WAIT 141,32 38 'WHERE K=0 BY DEFAULT PA 990110 40 '------------------------------------------ 50 ?'WAITING FOR PORT 141, BIT5 TO GO LOW...' 60 WAIT 141,32,255 65 ? 70 ?'THE PORT IS NOW LOW' 80 GOSUB 500 90 GOTO 50 500 FOR X=1 TO 20000:NEXT X:RETURN6.5 PROGRAM 5
10 '**************************************************** 20 'Print the date/time string from the P112 V4b ROM 25 'If you use a different version of the ROM, you'll 30 'have to change the call address in lines 5100 and 35 '5110. 40 ' PA 990131 50 '**************************************************** 60 'Subroutine - Load USR routine at address 0C000H 70 GOSUB 5000 80 '**************************************************** 90 ?'Executing the P112 subroutine RTime... ' 100 A=USR(-16384) 130 STOP 4990 '**************************************************** 5000 'Machine code subroutine 5010 A=-16384 :'START ADDRESS 0C000H 5020 POKE A,245 :'PUSH AF 5030 POKE A+1,197 :'PUSH BC 5040 POKE A+2,213 :'PUSH DE 5090 POKE A+3,205 :'CALL 20BBH 5100 POKE A+4,187 :' 5110 POKE A+5,32 :' 5130 POKE A+6,209 :'POP DE 5140 POKE A+7,193 :'POP BC 5150 POKE A+8,241 :'POP AF 5160 POKE A+9,201 :'RET 5170 RETURNSample output from Program 5
>RUN Executing the P112 subroutine RTime... Sunday, 15 October 2000 19:24:19 OK >6.6 PROGRAM 6
10 '***************************************************** 20 'Demo of USR & POKE. Blink LED on P112 para data port. 30 'LED connected to pin 2 (D0) and, via 2K7 resistor, 40 'to pin 18 (GND). PA 990115 50 '***************************************************** 60 'Subroutine - Load USR routine at address 0B000H 70 GOSUB 1000 80 '***************************************************** 90 ?'Turning LED ON ... ', 100 A=USR(-20480,1) 110 GOSUB 500 120 ?'then OFF', 130 A=USR(-20480,0) 140 GOSUB 500 150 ? 160 GOTO 90 480 '***************************************************** 490 'Subroutine - Delay ~1 sec 500 FOR X=1 TO 10000:NEXT X:RETURN 510 '***************************************************** 1000 'Machine code subroutine 1010 A=-20480 :'START ADDRESS 0B000H 1020 POKE A,245 :'PUSH AF 1030 POKE A+1,197 :'PUSH BC 1040 POKE A+2,1 :'LD BC,8CH 1050 POKE A+3,140 :' 1060 POKE A+4,0 :' 1070 POKE A+5,237 :'OUT (C),L 1080 POKE A+6,105 :' 1090 POKE A+7,193 :'POP BC 1100 POKE A+8,241 :'POP AF 1110 POKE A+9,201 :'RET 1120 RETURN6.7 PROGRAM 7
10 '------------------------------- 20 'Terminal control demo. 30 'Clears screen, then prints 'HI' 40 'in the center of the screen at 50 'row 12, column 40. 60 'Requires ANSI or VT100 terminal 70 '------------------------------- 100 ?$27,'[2J' :'CLS 110 PRINT $27,'[12;40H','HI'6.8 PROGRAM 8
10 '------------------------------------------- 20 'Demo of logical shift left. 'Running lights' 30 'with LEDs on D0-D7 of the parallel port 8CH 40 'PA 990209 50 '------------------------------------------- 100 A=1 110 ?#4,A,: IF A=128 ? 120 OUT 140,A: X=USR(12301,1) 130 A=A l 1: GOTO 1106.9 PROGRAM 9
10 '-------------------------- 20 'Using the PRINT modifier $ 30 'All values in decimal 40 '-------------------------- 100 'Ring the terminal bell 110 PRINT $7 120 ' 130 'Clear screen (actually form feed) 140 PRINT $12 150 ' 160 'Print the character set from 128 to 255 170 I=0 180 FOR X=128 TO 255 190 PRINT #6,X,"=",$X, 200 I=I+1: IF I=8 PRINT: I=0 210 NEXT X 220 PRINT 230 ' 240 'Using special characters for printing units 250 PRINT #1,"The temperature is ",83,$176,"C" 260 PRINT #1,"The capacitor has a value of 47 ",$177,2,$181,"F"6.10 PROGRAM 10
10 'Basic Control System 990413A (for P112 Tiny Basic V1.0 in ROM) PA 20 'Activates a 4-unit wireless remote control interfaced to the P112 30 'parallel port (port 140). The program uses a time schedule and the 40 'real time clock to turn appliances connected to the mains on and off. 50 'Uses ANSI screen codes and Hal's ROM4b RTC subroutines. 60 ' 100 ' Initialize display 110 GOSUB 30000 :'Clear screen then draw dotted lines 120 GOSUB 25000 :'Display text and data 130 ' 500 '--------------------------Time Schedules--------------------------------- 510 ' Unit A Weekdays 520 @(1)=06:@(2)=00: @(3)=08:@(4)=30: @(5)=18:@(6)=00: @(7)=22:@(8)=45 530 ' Unit A Weekends 540 @(9)=07:@(10)=00: @(11)=08:@(12)=30: @(13)=18:@(14)=00: @(15)=22:@(16)=45 550 ' 560 ' Unit B Weekdays 570 @(17)=99:@(18)=99: @(19)=99:@(20)=99: @(21)=99:@(22)=99: @(23)=99:@(24)=99 580 ' Unit B Weekends 590 @(25)=99:@(26)=99: @(27)=99:@(28)=99: @(29)=99:@(30)=99: @(31)=99:@(32)=99 600 ' 610 ' Unit C Weekdays 620 @(33)=99:@(34)=99: @(35)=99:@(36)=99: @(37)=99:@(38)=99: @(39)=99:@(40)=99 630 ' Unit C Weekends 640 @(41)=99:@(42)=99: @(43)=99:@(44)=99: @(45)=99:@(46)=99: @(47)=99:@(48)=99 650 ' 660 ' Unit D Weekdays 670 @(49)=99:@(50)=99: @(51)=99:@(52)=99: @(53)=99:@(54)=99: @(55)=99:@(56)=99 680 ' Unit D Weekends 690 @(57)=99:@(58)=99: @(59)=99:@(60)=99: @(61)=99:@(62)=99: @(63)=99:@(64)=99 700 ' 710 ' 6300 '--------------------------Main Loop------------------------------- 6310 G=M :'Set old minute equal to current minute 6320 X=USR(12301,5) :'Delay to poll RTC every 5 seconds 6330 GOSUB 20000 :'Read RTC and set variables (including M) to current time 6340 ?$27,'[23;29H',: X=USR(12298): 'Print date/time string 7000 ' 7010 ' If G<>M then minutes has been incremented: check if a remote control 7020 ' needs to be activated. 7030 ' 7040 IF G=M GOTO 6300 7050 ' 7500 '-----Check clock against time schedule for activating remote control----- 7510 '[Unit A] 7520 IF (W>1)a(W<7)a(H=@(1))a(M=@(2)) GOSUB 18010 :'Weekday, UNIT A ON 7530 IF (W>1)a(W<7)a(H=@(3))a(M=@(4)) GOSUB 18030 :'Weekday, UNIT A OFF 7540 IF (W>1)a(W<7)a(H=@(5))a(M=@(6)) GOSUB 18010 :'Weekday, UNIT A ON 7550 IF (W>1)a(W<7)a(H=@(7))a(M=@(8)) GOSUB 18030 :'Weekday, UNIT A OFF 7560 IF ((W=1)o(W=7))a(H=@(9))a(M=@(10)) GOSUB 18010 :'Sat/Sun, UNIT A ON 7570 IF ((W=1)o(W=7))a(H=@(11))a(M=@(12)) GOSUB 18030 :'Sat/Sun, UNIT A OFF 7580 IF ((W=1)o(W=7))a(H=@(13))a(M=@(14)) GOSUB 18010 :'Sat/Sun, UNIT A ON 7590 IF ((W=1)o(W=7))a(H=@(15))a(M=@(16)) GOSUB 18030 :'Sat/Sun, UNIT A OFF 7600 ' 7610 '[Unit B] 7620 IF (W>1)a(W<7)a(H=@(17))a(M=@(18)) GOSUB 18050 :'Weekday, UNIT B ON 7630 IF (W>1)a(W<7)a(H=@(19))a(M=@(20)) GOSUB 18070 :'Weekday, UNIT B OFF 7640 IF (W>1)a(W<7)a(H=@(21))a(M=@(22)) GOSUB 18050 :'Weekday, UNIT B ON 7650 IF (W>1)a(W<7)a(H=@(23))a(M=@(24)) GOSUB 18070 :'Weekday, UNIT B OFF 7660 IF ((W=1)o(W=7))a(H=@(25))a(M=@(26)) GOSUB 18050 :'Sat/Sun, UNIT B ON 7670 IF ((W=1)o(W=7))a(H=@(27))a(M=@(28)) GOSUB 18070 :'Sat/Sun, UNIT B OFF 7680 IF ((W=1)o(W=7))a(H=@(29))a(M=@(30)) GOSUB 18050 :'Sat/Sun, UNIT B ON 7690 IF ((W=1)o(W=7))a(H=@(31))a(M=@(32)) GOSUB 18070 :'Sat/Sun, UNIT B OFF 7700 ' 7710 '[Unit C] 7720 IF (W>1)a(W<7)a(H=@(33))a(M=@(34)) GOSUB 18090 :'Weekday, UNIT C ON 7730 IF (W>1)a(W<7)a(H=@(35))a(M=@(36)) GOSUB 18110 :'Weekday, UNIT C OFF 7740 IF (W>1)a(W<7)a(H=@(37))a(M=@(38)) GOSUB 18090 :'Weekday, UNIT C ON 7750 IF (W>1)a(W<7)a(H=@(39))a(M=@(40)) GOSUB 18110 :'Weekday, UNIT C OFF 7760 IF ((W=1)o(W=7))a(H=@(41))a(M=@(42)) GOSUB 18090 :'Sat/Sun, UNIT C ON 7770 IF ((W=1)o(W=7))a(H=@(43))a(M=@(44)) GOSUB 18110 :'Sat/Sun, UNIT C OFF 7780 IF ((W=1)o(W=7))a(H=@(45))a(M=@(46)) GOSUB 18090 :'Sat/Sun, UNIT C ON 7790 IF ((W=1)o(W=7))a(H=@(47))a(M=@(48)) GOSUB 18110 :'Sat/Sun, UNIT C OFF 7800 ' 7810 '[Unit D] 7820 IF (W>1)a(W<7)a(H=@(49))a(M=@(50)) GOSUB 18130 :'Weekday, UNIT D ON 7830 IF (W>1)a(W<7)a(H=@(51))a(M=@(52)) GOSUB 18150 :'Weekday, UNIT D OFF 7840 IF (W>1)a(W<7)a(H=@(53))a(M=@(54)) GOSUB 18130 :'Weekday, UNIT D ON 7850 IF (W>1)a(W<7)a(H=@(55))a(M=@(56)) GOSUB 18150 :'Weekday, UNIT D OFF 7860 IF ((W=1)o(W=7))a(H=@(57))a(M=@(58)) GOSUB 18130 :'Sat/Sun, UNIT D ON 7870 IF ((W=1)o(W=7))a(H=@(59))a(M=@(60)) GOSUB 18150 :'Sat/Sun, UNIT D OFF 7880 IF ((W=1)o(W=7))a(H=@(61))a(M=@(62)) GOSUB 18130 :'Sat/Sun, UNIT D ON 7890 IF ((W=1)o(W=7))a(H=@(63))a(M=@(64)) GOSUB 18150 :'Sat/Sun, UNIT D OFF 7900 ' 10000 GOSUB 30000 :'Clear screen then draw dotted lines 10100 GOSUB 25000 :'Display text and data 17000 G=M :'Set old minute equal to current minute and loop back 17010 GOTO 6330 17020 ' 17030 '------------------------Subroutines start here---------------------- 17040 ' 18000 '-----Choose Button and Activate----- 18010 'Turn Unit A ON 18020 B=1:GOSUB 19000:RETURN 18030 'Turn Unit A OFF 18040 B=2:GOSUB 19000:RETURN 18050 'Turn Unit B ON 18060 B=4:GOSUB 19000:RETURN 18070 'Turn Unit B OFF 18080 B=8:GOSUB 19000:RETURN 18090 'Turn Unit C ON 18100 B=16:GOSUB 19000:RETURN 18110 'Turn Unit C OFF 18120 B=32:GOSUB 19000:RETURN 18130 'Turn Unit D ON 18140 B=64:GOSUB 19000:RETURN 18150 'Turn Unit D OFF 18160 B=128:GOSUB 19000:RETURN 18170 ' 19000 '-----Press Button(1 sec)----- 19010 OUT 140,B 19020 X=USR(12301,1) 19030 OUT 140,0 19040 IF B=1 @(129)=1 19050 IF B=2 @(129)=0 19060 IF B=4 @(130)=1 19070 IF B=8 @(130)=0 19080 IF B=16 @(131)=1 19090 IF B=32 @(131)=0 19100 IF B=64 @(132)=1 19110 IF B=128 @(132)=0 19120 RETURN 19130 ' 20000 '-----Get Time----- 20010 X=USR(12292) :'Get current time 20020 M=USR(12295,1) :'Minutes 20030 H=USR(12295,2) :'Hours 20040 D=USR(12295,3) :'Date 20050 O=USR(12295,4) :'Month 20060 W=USR(12295,5) :'Day-Of-Week 20070 RETURN 20080 ' 25000 '----------------------Display text and data------------------------ 25010 '-----Remote control locations----- 25020 ?$27,'[16;10H',:?'Hallway lamp' 25030 ?$27,'[17;10H',:?'' 25040 ?$27,'[18;10H',:?'' 25050 ?$27,'[19;10H',:?'' 25060 ' 26010 ?$27,'[2;28H',:?'P112 BASIC CONTROL SYSTEM' 26020 ?$27,'[4;26H',:?'Weekdays' 26030 ?$27,'[4;60H',:?'Weekends' 26040 ?$27,'[6;3H',:?'UNIT STATUS ON OFF ON OFF' 26050 ?$27,'[6;52H',:?'ON OFF ON OFF' 26060 ?$27,'[8;5H',:?'A' 26070 ?$27,'[9;5H',:?'B' 26080 ?$27,'[10;5H',:?'C' 26090 ?$27,'[11;5H',:?'D' 26100 ?$27,'[8;16H',:?#1,@(1),':',@(2) :?$27,'[8;23H',:?#1,@(3),':',@(4) 26110 ?$27,'[8;32H',:?#1,@(5),':',@(6) :?$27,'[8;39H',:?#1,@(7),':',@(8) 26120 ?$27,'[8;50H',:?#1,@(9),':',@(10) :?$27,'[8;57H',:?#1,@(11),':',@(12) 26130 ?$27,'[8;66H',:?#1,@(13),':',@(14) :?$27,'[8;73H',:?#1,@(15),':',@(16) 26140 ' 26150 ?$27,'[9;16H',:?#1,@(17),':',@(18) :?$27,'[9;23H',:?#1,@(19),':',@(20) 26160 ?$27,'[9;32H',:?#1,@(21),':',@(22) :?$27,'[9;39H',:?#1,@(23),':',@(24) 26170 ?$27,'[9;50H',:?#1,@(25),':',@(26) :?$27,'[9;57H',:?#1,@(27),':',@(28) 26180 ?$27,'[9;66H',:?#1,@(29),':',@(30) :?$27,'[9;73H',:?#1,@(31),':',@(32) 26190 ' 26200 ?$27,'[10;16H',:?#1,@(33),':',@(34) :?$27,'[10;23H',:?#1,@(35),':',@(36) 26210 ?$27,'[10;32H',:?#1,@(37),':',@(38) :?$27,'[10;39H',:?#1,@(39),':',@(40) 26220 ?$27,'[10;50H',:?#1,@(41),':',@(42) :?$27,'[10;57H',:?#1,@(43),':',@(44) 26230 ?$27,'[10;66H',:?#1,@(45),':',@(46) :?$27,'[10;73H',:?#1,@(47),':',@(48) 26240 ' 26250 ?$27,'[11;16H',:?#1,@(49),':',@(50) :?$27,'[11;23H',:?#1,@(51),':',@(52) 26260 ?$27,'[11;32H',:?#1,@(53),':',@(54) :?$27,'[11;39H',:?#1,@(55),':',@(56) 26270 ?$27,'[11;50H',:?#1,@(57),':',@(58) :?$27,'[11;57H',:?#1,@(59),':',@(60) 26280 ?$27,'[11;66H',:?#1,@(61),':',@(62) :?$27,'[11;73H',:?#1,@(63),':',@(64) 26290 ' 26300 ?$27,'[14;3H',:?'UNIT LOCATION' 26310 ?$27,'[16;5H',:?'A' 26320 ?$27,'[17;5H',:?'B' 26330 ?$27,'[18;5H',:?'C' 26340 ?$27,'[19;5H',:?'D' 26350 IF @(129)=1 ?$27,'[8;10H',:?'ON' 26360 IF @(129)=0 ?$27,'[8;10H',:?'OFF' 26370 IF @(130)=1 ?$27,'[9;10H',:?'ON' 26380 IF @(130)=0 ?$27,'[9;10H',:?'OFF' 26390 IF @(131)=1 ?$27,'[10;10H',:?'ON' 26400 IF @(131)=0 ?$27,'[10;10H',:?'OFF' 26410 IF @(132)=1 ?$27,'[11;10H',:?'ON' 26420 IF @(132)=0 ?$27,'[11;10H',:?'OFF' 26550 ?$27,'[22;3H',:?'DST: TIMER OFFSET:' 26560 IF S=1 ?$27,'[22;8H',:?'ON' 26570 IF S=0 ?$27,'[22;8H',:?'OFF' 26580 ?$27,'[22;29H',:?#1,F 26590 ?$27,'[23;3H',:?'CURRENT DATE AND TIME:' 26600 RETURN 26610 ' 30000 'Clear screen then draw dotted lines 30010 ?$27,'[2J' :'CLS 30020 ?$27,'[1;1H',:F.I=1TO80:?'-',:N.I :'TL 30030 ?$27,'[5;1H',:F.I=1TO80:?'-',:N.I 30040 ?$27,'[13;1H',:F.I=1TO80:?'-',:N.I 30050 ?$27,'[21;1H',:F.I=1TO80:?'-',:N.I 30060 ?$27,'[25;1H',:F.I=1TO80:?'-',:N.I :'BL 30070 RETURNSample output from Program 10
-------------------------------------------------------------------------------- P112 BASIC CONTROL SYSTEM Weekdays Weekends -------------------------------------------------------------------------------- UNIT STATUS ON OFF ON OFF ON OFF ON OFF A ON 6:0 8:30 18:0 22:45 7:0 8:30 18:0 22:45 B OFF 99:99 99:99 99:99 99:99 99:99 99:99 99:99 99:99 C OFF 99:99 99:99 99:99 99:99 99:99 99:99 99:99 99:99 D OFF 99:99 99:99 99:99 99:99 99:99 99:99 99:99 99:99 -------------------------------------------------------------------------------- UNIT LOCATION A Hallway Lamp B C D -------------------------------------------------------------------------------- DST: OFF TIMER OFFSET: 0 CURRENT DATE AND TIME: Wednesday, 4 October 2000 18:33:53 --------------------------------------------------------------------------------