Update TastyBasic

This commit is contained in:
dimitrit
2021-10-29 22:47:24 +01:00
parent 322c083531
commit df1a8df463
29 changed files with 3694 additions and 1908 deletions

View File

@@ -0,0 +1,86 @@
10 PRINT "BATNUM"
20 PRINT "CREATIVE COMPUTING MORRISTOWN, NEW JERSEY"
30 PRINT
110 PRINT "THIS PROGRAM IS A 'BATTLE OF NUMBERS' GAME, WHERE THE"
120 PRINT "COMPUTER IS YOUR OPPONENT."
130 PRINT
140 PRINT "THE GAME STARTS WITH AN ASSUMED PILE OF OBJECTS. YOU"
150 PRINT "AND YOUR OPPONENT ALTERNATELY REMOVE OBJECTS FROM THE PILE."
160 PRINT "WINNING IS DEFINED IN ADVANCE AS TAKING THE LAST OBJECT OR"
170 PRINT "NOT. YOU CAN ALSO SPECIFY SOME OTHER BEGINNING CONDITIONS."
180 PRINT "DON'T USE ZERO, HOWEVER, IN PLAYING THE GAME."
190 PRINT "ENTER A NEGATIVE NUMBER FOR NEW PILE SIZE TO STOP PLAYING."
200 PRINT
210 GOTO 330
220 FOR I=1 TO 10
230 PRINT
240 NEXT I
330 INPUT "ENTER PILE SIZE"N
340 IF N<0 GOTO 1080
350 IF N>=1 GOTO 390
360 GOTO 330
390 INPUT "ENTER WIN OPTION - 1 TO TAKE LAST, 2 TO AVOID LAST"M
410 IF M=1 GOTO 430
420 IF M#2 GOTO 390
430 INPUT "ENTER MIN PER TURN"A,"AND MAX"B
450 IF A>B GOTO 430
460 IF A<1 GOTO 430
490 INPUT "ENTER START OPTION - 1 COMPUTER FIRST, 2 YOU FIRST"S
500 PRINT
510 IF S=1 GOTO 530
520 IF S#2 GOTO 490
530 C=A+B
540 IF S=2 GOTO 570
550 GOSUB 600
560 IF W=1 GOTO 220
570 GOSUB 810
580 IF W=1 GOTO 220
590 GOTO 550
600 Q=N
610 IF M=1 GOTO 630
620 Q=Q-1
630 IF M=1 GOTO 680
640 IF N>A GOTO 720
650 W=1
660 PRINT "COMPUTER TAKES",N," AND LOSES."
670 RETURN
680 IF N>B GOTO 720
690 W=1
700 PRINT "COMPUTER TAKES",N," AND WINS."
710 RETURN
720 P=Q-C*(Q/C)
730 IF P>=A GOTO 750
740 P=A
750 IF P<=B GOTO 770
760 P=B
770 N=N-P
780 PRINT "COMPUTER TAKES",P," AND LEAVES",N
790 W=0
800 RETURN
810 PRINT
820 INPUT "YOUR MOVE"P
830 IF P#0 GOTO 880
840 PRINT "I TOLD YOU NOT TO USE ZERO! COMPUTER WINS BY FORFEIT."
850 W=1
860 RETURN
880 IF P>=A GOTO 910
890 IF P=N GOTO 960
900 GOTO 920
910 IF P<=B GOTO 940
920 PRINT "ILLEGAL MOVE, REENTER IT!"
930 GOTO 820
940 N=N-P
950 IF N#0 GOTO 1030
960 IF M=1 GOTO 1000
970 PRINT "TOUGH LUCK, YOU LOSE."
980 W=1
990 RETURN
1000 PRINT "CONGRATULATIONS, YOU WIN."
1010 W=1
1020 RETURN
1030 IF N>=0 GOTO 1060
1040 N=N+P
1050 GOTO 920
1060 W=0
1070 RETURN
1080 END

View File

@@ -0,0 +1,16 @@
10 INPUT "ADDRESS"A
20 FOR I=0 TO 15
30 P=A+I*16
40 PRINT $16,P,
50 FOR J=0 TO 15
60 PRINT " ",$8,PEEK(P+J),
70 NEXT J
80 PRINT
90 NEXT I
100 INPUT ""Q
110 IF Q<0 GOTO 160
120 A=A+256
130 IF Q=0 GOTO 20
140 A=Q
150 GOTO 20
160 END

View File

@@ -0,0 +1,25 @@
# Tasty Basic Files
## Introduction
The CP/M version of Tasty Basic allows programs to be saved to and loaded from disk. This
document describes the Tasty Basic `.TBA` file format.
## .TBA File format
Tasty Basic `.TBA` files are direct reflections of Tasty Basic programs as held in memory. Thus,
each line of code starts with a 16 bit, LSB first, line number and ends with a carriage return
character (0xD). An EOF marker (0x1A) indicates the end of the file. Any trailing NUL characters
(0x0) are ignored.
### Example
Following is an example Tasty Basic program:
```
10 PRINT "HELLO WORLD"
20 GOTO 10
```
And its `.TBA` file representation:
```
0A 00 50 52 49 4E 54 20 22 48 45 4C 4C 4F 20 57
4F 52 4C 44 22 0D 14 00 47 4F 54 4F 20 31 30 0D
1A 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
```

View File

@@ -0,0 +1,74 @@
10 PRINT "REVERSE"
30 PRINT "CREATIVE COMPUTING MORRISTOWN, NEW JERSEY"
100 PRINT "REVERSE -- A GAME OF SKILL"
140 REM *** N=NUMBER OF NUMBERS
150 N=9
160 INPUT "DO YOU WANT THE RULES (0=NO,1=YES)"A
180 IF A=0 GOTO 210
190 GOSUB 710
200 REM *** MAKE A RANDOM LIST @(1) TO @(N)
210 @(1)=RND(N-1)+1
220 FOR K=2 TO N
230 @(K)=RND(N)
240 FOR J=1 TO K-1
250 IF @(K)=@(J) GOTO 230
260 NEXT J
270 NEXT K
280 REM *** PRINT ORIGINAL LIST AND START GAME
290 PRINT
300 PRINT "HERE WE GO ... THE LIST IS:"
310 T=0
320 GOSUB 610
330 INPUT "HOW MANY SHALL I REVERSE"R
350 IF R=0 GOTO 520
360 IF R<=N GOTO 390
370 PRINT "OOPS! TOO MANY! I CAN REVERSE AT MOST ",#2,N
380 GOTO 330
390 T=T+1
400 REM *** REVERSE R NUMBERS AND PRINT NEW LIST
410 FOR K=1 TO R/2
420 Z=@(K)
430 @(K)=@(R-K+1)
440 @(R-K+1)=Z
450 NEXT K
460 GOSUB 610
470 REM *** CHECK FOR A WIN
480 FOR K=1 TO N
490 IF @(K)#K GOTO 330
500 NEXT K
510 PRINT "YOU WON IT IN",T," MOVES!!!"
520 PRINT
530 INPUT "TRY AGAIN (1=YES, 0=NO)"A
550 IF A=1 GOTO 210
560 PRINT
565 PRINT "O.K. HOPE YOU HAD FUN!!"
570 GOTO 999
600 REM *** SUBROUTINE TO PRINT LIST
610 PRINT
620 FOR K=1 TO N
630 PRINT #2,@(K),
640 NEXT K
650 PRINT
660 RETURN
700 REM *** SUBROUTINE TO PRINT THE RULES
710 PRINT "THIS IS THE GAME OF 'REVERSE'. TO WIN, ALL YOU HAVE"
720 PRINT "TO DO IS ARRANGE A LIST OF NUMBERS (1 THROUGH ",#2,N,")"
730 PRINT "IN NUMERICAL ORDER FROM LEFT TO RIGHT. TO MOVE, YOU"
740 PRINT "TELL ME HOW MANY NUMBERS (COUNTING FROM THE LEFT) TO"
750 PRINT "REVERSE. FOR EXAMPLE, IF THE CURRENT LIST IS:"
755 PRINT
760 PRINT " 2 3 4 5 1 6 7 8 9"
765 PRINT
770 PRINT "AND YOU REVERSE 4, THE RESULT WILL BE:"
775 PRINT
780 PRINT " 5 4 3 2 1 6 7 8 9"
785 PRINT
790 PRINT "NOW IF YOU REVERSE 5, YOU WIN!"
795 PRINT
800 PRINT " 1 2 3 4 5 6 7 8 9"
805 PRINT
810 PRINT "NO DOUBT YOU WILL LIKE THIS GAME, BUT"
820 PRINT "IF YOU WANT TO QUIT, REVERSE 0 (ZERO)."
830 PRINT
840 RETURN
999 END

View File

@@ -0,0 +1,30 @@
100 REM -- ADJUST USR FUNCTION POINTER
110 POKE 5118,6
120 POKE 5119,20
200 REM -- RTC BUFFER AT 5120-5125
210 FOR I=0 TO 14
220 READ A
230 POKE 5126+I,A
240 NEXT I
250 DATA 6,32,123,178,40,1,4,33,0,20,207,17,0,0,201
300 INPUT "GET OR SET TIME (GET=0,SET=1)"P
310 IF P=0 GOTO 400
320 A=5120:INPUT "YEAR"Q:GOSUB 500
330 A=5121:INPUT "MONTH"Q:GOSUB 500
340 A=5122:INPUT "DAY"Q:GOSUB 500
350 A=5123:INPUT "HOURS"Q:GOSUB 500
360 A=5124:INPUT "MINS"Q:GOSUB 500
370 A=5125:INPUT "SECS"Q:GOSUB 500
400 Q=USR(P)
410 PRINT $8,PEEK(5120),"-",
420 PRINT $8,PEEK(5121),"-",
430 PRINT $8,PEEK(5122)," ",
440 PRINT $8,PEEK(5123),":",
450 PRINT $8,PEEK(5124),":",
460 PRINT $8,PEEK(5125)
470 GOTO 300
500 T=Q/10
510 U=Q-10*T
520 B=T*16+U
530 POKE A,B
540 RETURN

View File

@@ -0,0 +1,117 @@
2 PRINT "TIC-TAC-TOE"
4 PRINT "CREATIVE COMPUTING MORRISTOWN, NEW JERSEY"
6 PRINT
8 PRINT "THE BOARD IS NUMBERED:"
10 PRINT " 1 2 3"
12 PRINT " 4 5 6"
14 PRINT " 7 8 9"
16 PRINT
20 FOR I=1 TO 9:@(I)=0:NEXT I
50 INPUT"DO YOU WANT 'X' OR 'O' (X=1,O=0)"C
55 IF C=1 GOTO 475
60 P=0,Q=1
100 G=-1,H=1:IF @(5)#0 GOTO 103
102 @(5)=-1:GOTO 195
103 IF @(5)#1 GOTO 106
104 IF @(1)#0 GOTO 110
105 @(1)=-1:GOTO 195
106 IF (@(2)=1)*(@(1)=0) GOTO 181
107 IF (@(4)=1)*(@(1)=0) GOTO 181
108 IF (@(6)=1)*(@(9)=0) GOTO 189
109 IF (@(8)=1)*(@(9)=0) GOTO 189
110 IF G=1 GOTO 112
111 GOTO 118
112 J=3*(M-1)/3+1
113 IF J=M LET K=1
114 IF J+1=M LET K=2
115 IF J+2=M LET K=3
116 GOTO 120
118 FOR J=1 TO 7 STEP 3:FOR K=1 TO 3
120 IF @(J)#G GOTO 130
122 IF @(J+2)#G GOTO 135
126 IF @(J+1)#0 GOTO 150
128 @(J+1)=-1:GOTO 195
130 IF @(J)=H GOTO 150
131 IF @(J+2)#G GOTO 150
132 IF @(J+1)#G GOTO 150
133 @(J)=-1:GOTO 195
135 IF @(J+2)#0 GOTO 150
136 IF @(J+1)#G GOTO 150
138 @(J+2)=-1:GOTO 195
150 IF @(K)#G GOTO 160
152 IF @(K+6)#G GOTO 165
156 IF @(K+3)#0 GOTO 170
158 @(K+3)=-1:GOTO 195
160 IF @(K)=H GOTO 170
161 IF @(K+6)#G GOTO 170
162 IF @(K+3)#G GOTO 170
163 @(K)=-1:GOTO 195
165 IF @(K+6)#0 GOTO 170
166 IF @(K+3)#G GOTO 170
168 @(K+6)=-1:GOTO 195
170 GOTO 450
171 IF (@(3)=G)*(@(7)=0) GOTO 187
172 IF (@(9)=G)*(@(1)=0) GOTO 181
173 IF (@(7)=G)*(@(3)=0) GOTO 183
174 IF (@(9)=0)*(@(1)=G) GOTO 189
175 IF G=-1 LET G=1,H=-1:GOTO 110
176 IF (@(9)=1)*(@(3)=0) GOTO 182
177 FOR I=2 TO 9:IF @(I)#0 GOTO 179
178 @(I)=-1:GOTO 195
179 NEXT I
181 @(1)=-1:GOTO 195
182 IF @(1)=1 GOTO 177
183 @(3)=-1:GOTO 195
187 @(7)=-1:GOTO 195
189 @(9)=-1
195 PRINT"THE COMPUTER MOVES TO..."
202 GOSUB 1000
205 GOTO 500
450 IF G=1 GOTO 465
455 IF (J=7)*(K=3) GOTO 465
460 NEXT K:NEXT J
465 IF @(5)=G GOTO 171
467 GOTO 175
475 P=1,Q=0
500 INPUT"WHERE DO YOU MOVE"M
502 IF M=0 PRINT"THANKS FOR THE GAME.":GOTO 2000
503 IF M>9 GOTO 506
505 IF @(M)=0 GOTO 510
506 PRINT"THAT SQUARE IS OCCUPIED.":GOTO 500
510 G=1,@(M)=1
520 GOSUB 1000
530 GOTO 100
1000 FOR I=1 TO 9:PRINT" ",:IF @(I)#-1 GOTO 1014
1011 IF Q=1 PRINT "X ",
1012 IF Q=0 PRINT "O ",
1013 GOTO 1020
1014 IF @(I)#0 GOTO 1016
1015 PRINT" ",:GOTO 1020
1016 IF P=1 PRINT "X ",
1017 IF P=0 PRINT "O ",
1020 IF (I#3)*(I#6) GOTO 1050
1030 PRINT"":PRINT"---+---+---"
1040 GOTO 1080
1050 IF I=9 GOTO 1080
1060 PRINT"!",
1080 NEXT I:PRINT
1095 FOR I=1 TO 7 STEP 3
1100 IF @(I)#@(I+1) GOTO 1115
1105 IF @(I)#@(I+2) GOTO 1115
1110 IF @(I)=-1 GOTO 1350
1112 IF @(I)=1 GOTO 1200
1115 NEXT I:FOR I=1 TO 3:IF @(I)#@(I+3) GOTO 1150
1130 IF @(I)#@(I+6) GOTO 1150
1135 IF @(I)=-1 GOTO 1350
1137 IF @(I)=1 GOTO 1200
1150 NEXT I:FOR I=1 TO 9:IF @(I)=0 GOTO 1155
1152 NEXT I:GOTO 1400
1155 IF @(5)#G GOTO 1170
1160 IF (@(1)=G)*(@(9)=G) GOTO 1180
1165 IF (@(3)=G)*(@(7)=G) GOTO 1180
1170 RETURN
1180 IF G=-1 GOTO 1350
1200 PRINT"YOU BEAT ME!! GOOD GAME.":GOTO 2000
1350 PRINT"I WIN, TURKEY!!!":GOTO 2000
1400 PRINT"IT'S A DRAW. THANK YOU."
2000 END

View File

@@ -0,0 +1,48 @@
; -----------------------------------------------------------------------------
; Copyright 2021 Dimitri Theulings
;
; This file is part of Tasty Basic.
;
; Tasty Basic 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 3 of the License, or
; (at your option) any later version.
;
; Tasty Basic 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 Tasty Basic. If not, see <https://www.gnu.org/licenses/>.
; -----------------------------------------------------------------------------
; Tasty Basic is derived from earlier works by Li-Chen Wang, Peter Rauskolb,
; and Doug Gabbard. Refer to the source code repository for details
; <https://github.com/dimitrit/tastybasic/>.
; -----------------------------------------------------------------------------
#IFDEF CPM
.ORG $0C00 ; ie. 3072 dec
#ELSE
.ORG $1400 ; ie. 5120 dec
#ENDIF
LD B,0
LD A,D
CALL COUNT
LD A,E
CALL COUNT
LD E,B
LD D,0
RET
COUNT:
OR A
RET Z
BIT 0,A
JR Z,NEXT
INC B
NEXT:
SRL A
JR COUNT
.END

Binary file not shown.

Binary file not shown.