development/minimal-basic: Added (ECMA-55 Minimal BASIC compiler)

Signed-off-by: bedlam <dave@slackbuilds.org>

Signed-off-by: Willy Sudiarto Raharjo <willysr@slackbuilds.org>
This commit is contained in:
B. Watson 2023-04-28 10:41:23 +01:00 committed by Willy Sudiarto Raharjo
parent 86ce4f0549
commit 7f479b91f4
No known key found for this signature in database
GPG key ID: 3F617144D7238786
7 changed files with 494 additions and 0 deletions

View file

@ -0,0 +1,20 @@
minimal-basic (compiler for ECMA-55 Minimal BASIC)
This software is a compiler for 'Minimal BASIC' as specified by the
ECMA-55 standard. The target is AMD64/EM64T/x86-64 machines running a
modern Linux distribution.
The compiler is called ecma55, but it's normally called via wrapper
scripts called BASICC, BASICCS, or BASICCW. Man pages are included for
all of these commands.
There's sample code in /usr/share/minimal-basic, and quite a bit
of documentation in /usr/doc/minimal-basic-$VERSION, including a
copy of the language standard (ECMA-55.TXT) and a complete book
(Learn_BASIC.pdf).
Note: This will only compile on x86_64 because it's partly written in
x86_64 assembly. No way will it ever compile for 32-bit x86 (or any
ARM). Even if it would build on 32-bit, it would be a cross compiler:
it only generates x86_64 code, which would not be very useful on an
x86 system.

View file

@ -0,0 +1,117 @@
1 RANDOMIZE
5 PRINT TAB(33);"BAGELS"
10 PRINT TAB(15);"CREATIVE COMPUTING MORRISTOWN, NEW JERSEY"
12 PRINT TAB(10);"ECMA-55 PORT BY. B. WATSON, URCHLAY AT SLACKWARE.UK"
14 PRINT
16 PRINT
20 REM *** BAGELS NUMBER GUESSING GAME
22 REM *** ORIGINAL SOURCE UNKNOWN BUT SUSPECTED TO BE
25 REM *** LAWRENCE HALL OF SCIENCE, U.C. BERKELEY
29 REM A = ACTUAL ANSWER, G = USER'S GUESS
30 DIM A(3),G(3)
40 LET Y=0
50 PRINT
55 PRINT
60 PRINT
70 PRINT "WOULD YOU LIKE THE RULES (1=YES, 0=NO)";
80 INPUT N
90 IF N=0 THEN 150
100 PRINT
105 PRINT "I AM THINKING OF A THREE-DIGIT NUMBER. TRY TO GUESS"
110 PRINT "MY NUMBER AND I WILL GIVE YOU CLUES AS FOLLOWS:"
120 PRINT " PICO - ONE DIGIT CORRECT BUT IN THE WRONG POSITION"
130 PRINT " FERMI - ONE DIGIT CORRECT AND IN THE RIGHT POSITION"
140 PRINT " BAGELS - NO DIGITS CORRECT"
150 FOR I=1 TO 3
160 LET A(I)=INT(10*RND)
165 IF I-1=0 THEN 200
170 FOR J=1 TO I-1
180 IF A(I)=A(J) THEN 160
190 NEXT J
200 NEXT I
210 PRINT
215 PRINT "O.K. I HAVE A NUMBER IN MIND."
220 FOR I=1 TO 20
230 PRINT "GUESS #";I,
240 INPUT N
243 IF N>=1000 THEN 247
245 IF N<0 THEN 247
246 GOTO 250
247 GOSUB 630
248 GOTO 230
250 LET G(1)=INT(N/100)
260 LET G(2)=INT((N-G(1)*100)/10)
270 LET G(3)=N-(G(1)*100+G(2)*10)
290 REM UNCOMMENT NEXT LINE FOR DEBUGGING
300 REM GOSUB 800
320 LET F=0
322 IF G(1)<>G(2) THEN 330
325 LET F=1
330 IF G(2)<>G(3) THEN 340
335 LET F=1
340 IF G(3)<>G(1) THEN 345
342 LET F=1
345 IF F=0 THEN 350
347 GOSUB 650
349 GOTO 230
350 LET C=0
355 LET D=0
360 FOR J=1 TO 2
370 IF A(J)<>G(J+1) THEN 390
380 LET C=C+1
390 IF A(J+1)<>G(J) THEN 410
400 LET C=C+1
410 NEXT J
420 IF A(1)<>G(3) THEN 440
430 LET C=C+1
440 IF A(3)<>G(1) THEN 460
450 LET C=C+1
460 FOR J=1 TO 3
470 IF A(J)<>G(J) THEN 490
480 LET D=D+1
490 NEXT J
500 IF D=3 THEN 680
505 IF C=0 THEN 545
520 FOR J=1 TO C
530 PRINT "PICO ";
540 NEXT J
545 IF D=0 THEN 580
550 FOR J=1 TO D
560 PRINT "FERMI ";
570 NEXT J
580 IF C+D<>0 THEN 600
590 PRINT "BAGELS";
600 PRINT
605 NEXT I
610 PRINT "OH WELL."
612 PRINT "THAT'S TWENTY GUESSES. MY NUMBER WAS";100*A(1)+10*A(2)+A(3)
614 LET N=100*A(1)+10*A(2)+A(3)
615 IF N>=100 THEN 620
617 PRINT "0";
618 IF N>=10 THEN 620
619 PRINT "0";
620 PRINT N
622 GOTO 700
630 PRINT "TRY GUESSING A THREE-DIGIT NUMBER."
635 RETURN
650 PRINT "OH, I FORGOT TO TELL YOU THAT THE NUMBER I HAVE IN MIND"
660 PRINT "HAS NO TWO DIGITS THE SAME."
670 RETURN
680 PRINT "YOU GOT IT!!!"
685 PRINT
690 LET Y=Y+1
700 PRINT "PLAY AGAIN (1=YES, 0=NO)";
710 INPUT N
720 IF N<>0 THEN 150
730 IF Y=0 THEN 750
740 PRINT
745 PRINT "A";Y;"POINT BAGELS BUFF!!"
750 PRINT "HOPE YOU HAD FUN. BYE."
760 GOTO 999
799 REM CHEAT/DEBUG MODE. UNCOMMENT LINE 300 TO ACTIVATE THIS CODE
800 PRINT "GUESS","ANSWER"
805 FOR X=1 TO 3
810 PRINT G(X),A(X)
820 NEXT X
830 RETURN
999 END

View file

@ -0,0 +1,160 @@
5 RANDOMIZE
10 PRINT TAB(32);"HAMURABI"
20 PRINT TAB(15);"CREATIVE COMPUTING MORRISTOWN, NEW JERSEY"
30 PRINT
40 PRINT TAB(11);"ECMA-55 PORT BY B. WATSON, URCHLAY AT SLACKWARE.UK"
50 PRINT
80 PRINT "TRY YOUR HAND AT GOVERNING ANCIENT SUMERIA"
90 PRINT "FOR A TEN-YEAR TERM OF OFFICE."
92 PRINT
95 LET D1=0
97 LET P1=0
100 LET Z=0
102 LET P=95
104 LET S=2800
106 LET H=3000
107 LET E=H-S
110 LET Y=3
120 LET A=H/Y
130 LET I=5
140 LET Q=1
210 LET D=0
215 PRINT
216 PRINT
217 PRINT "HAMURABI: I BEG TO REPORT TO YOU,"
218 LET Z=Z+1
220 PRINT "IN YEAR";Z;",";D;"PEOPLE STARVED,";I;"CAME TO THE CITY,"
225 LET P=P+I
227 IF Q>0 THEN 230
228 LET P=INT(P/2)
229 PRINT "A HORRIBLE PLAGUE STRUCK! HALF THE PEOPLE DIED."
230 PRINT "POPULATION IS NOW";P
232 PRINT "THE CITY NOW OWNS";A;"ACRES."
235 PRINT "YOU HARVESTED";Y;"BUSHELS PER ACRE."
250 PRINT "THE RATS ATE";E;"BUSHELS."
260 PRINT "YOU NOW HAVE";S;"BUSHELS IN STORE."
261 PRINT
270 IF Z=11 THEN 860
310 LET C=INT(10*RND)
311 LET Y=C+17
312 PRINT "LAND IS TRADING AT";Y;"BUSHELS PER ACRE."
320 PRINT "HOW MANY ACRES DO YOU WISH TO BUY";
321 INPUT Q
322 IF Q<0 THEN 850
323 IF Y*Q<=S THEN 330
324 GOSUB 710
325 GOTO 320
330 IF Q=0 THEN 340
331 LET A=A+Q
332 LET S=S-Y*Q
333 LET C=0
334 GOTO 400
340 PRINT "HOW MANY ACRES DO YOU WISH TO SELL";
341 INPUT Q
343 IF Q<0 THEN 850
345 IF Q<A THEN 360
347 GOSUB 720
350 GOTO 340
360 LET A=A-Q
370 LET S=S+Y*Q
380 LET C=0
400 PRINT
410 PRINT "HOW MANY BUSHELS DO YOU WISH TO FEED YOUR PEOPLE";
411 INPUT Q
412 IF Q<0 THEN 850
418 REM *** TRYING TO USE MORE GRAIN THAN IS IN SILOS?
420 IF Q<=S THEN 430
421 GOSUB 710
422 GOTO 410
430 LET S=S-Q
433 LET C=1
435 PRINT
440 PRINT "HOW MANY ACRES DO YOU WISH TO PLANT WITH SEED";
442 INPUT D
443 IF D=0 THEN 511
444 IF D<0 THEN 850
445 REM *** TRYING TO PLANT MORE ACRES THAN YOU OWN?
446 IF D<=A THEN 450
447 GOSUB 720
448 GOTO 440
449 REM *** ENOUGH GRAIN FOR SEED?
450 IF INT(D/2)<=S THEN 455
452 GOSUB 710
453 GOTO 440
454 REM *** ENOUGH PEOPLE TO TEND THE CROPS?
455 IF D<10*P THEN 510
460 PRINT "BUT YOU HAVE ONLY";P;"PEOPLE TO TEND THE FIELDS! NOW THEN,"
470 GOTO 440
510 LET S=S-INT(D/2)
511 GOSUB 800
512 REM *** A BOUNTIFUL HARVEST!
515 LET Y=C
518 LET H=D*Y
520 LET E=0
521 GOSUB 800
522 IF INT(C/2)<>C/2 THEN 530
523 REM *** RATS ARE RUNNING WILD!!
525 LET E=INT(S/C)
530 LET S=S-E+H
531 GOSUB 800
532 REM *** LET'S HAVE SOME BABIES
533 LET I=INT(C*(20*A+S)/P/100+1)
539 REM *** HOW MANY PEOPLE HAD FULL TUMMIES?
540 LET C=INT(Q/20)
541 REM *** HORROS, A 15% CHANCE OF PLAGUE
542 LET Q=INT(10*(2*RND-.3))
550 IF P<C THEN 210
551 REM *** STARVE ENOUGH FOR IMPEACHMENT?
552 LET D=P-C
553 IF D>.45*P THEN 560
555 LET P1=((Z-1)*P1+D*100/P)/Z
556 LET P=C
557 LET D1=D1+D
558 GOTO 215
560 PRINT
562 PRINT "YOU STARVED";D;"PEOPLE IN ONE YEAR!!!"
565 PRINT "DUE TO THIS EXTREME MISMANAGEMENT YOU HAVE NOT ONLY"
566 PRINT "BEEN IMPEACHED AND THROWN OUT OF OFFICE BUT YOU HAVE"
567 PRINT "ALSO BEEN DECLARED NATIONAL FINK!!!!"
569 GOTO 990
710 PRINT "HAMURABI: THINK AGAIN. YOU HAVE ONLY"
711 PRINT S;"BUSHELS OF GRAIN. NOW THEN,"
712 RETURN
720 PRINT "HAMURABI: THINK AGAIN. YOU OWN ONLY";A;"ACRES. NOW THEN,"
730 RETURN
800 LET C=INT(RND*5)+1
801 RETURN
850 PRINT
852 PRINT "HAMURABI: I CANNOT DO WHAT YOU WISH."
855 PRINT "GET YOURSELF ANOTHER STEWARD!!!!!"
857 GOTO 990
860 PRINT "IN YOUR 10-YEAR TERM OF OFFICE,";P1;"PERCENT OF THE"
862 PRINT "POPULATION STARVED PER YEAR ON THE AVERAGE, I.E. A TOTAL OF"
865 PRINT D1;"PEOPLE DIED!!"
867 LET L=A/P
870 PRINT "YOU STARTED WITH 10 ACRES PER PERSON AND ENDED WITH"
875 PRINT L;"ACRES PER PERSON."
877 PRINT
880 IF P1>33 THEN 565
885 IF L<7 THEN 565
890 IF P1>10 THEN 940
892 IF L<9 THEN 940
895 IF P1>3 THEN 960
896 IF L<10 THEN 960
900 PRINT "A FANTASTIC PERFORMANCE!!! CHARLEMANGE, DISRAELI, AND"
905 PRINT "JEFFERSON COMBINED COULD NOT HAVE DONE BETTER!"
910 GOTO 990
940 PRINT "YOUR HEAVY-HANDED PERFORMANCE SMACKS OF NERO AND IVAN IV."
945 PRINT "THE PEOPLE (REMAINING) FIND YOU AN UNPLEASANT RULER, AND,"
950 PRINT "FRANKLY, HATE YOUR GUTS!!"
955 GOTO 990
960 PRINT "YOUR PERFORMANCE COULD HAVE BEEN SOMEWHAT BETTER, BUT"
965 PRINT "REALLY WASN'T TOO BAD AT ALL. ";INT(P*.8*RND);"PEOPLE"
970 PRINT "WOULD DEARLY LIKE TO SEE YOU ASSASSINATED BUT WE ALL HAVE"
975 PRINT "OUR TRIVIAL PROBLEMS."
989 REM BAS55 HAS NO CHR$() FUNCTION, NO WAY TO RING A BELL.
990 REM 990 PRINT: FOR N=1 TO 10: PRINT CHR$(7);: NEXT N
991 PRINT
995 PRINT "SO LONG FOR NOW."
997 PRINT
999 END

View file

@ -0,0 +1,42 @@
1 REM PI CALCULATOR, B. WATSON, URCHLAY AT SLACKWARE.UK
3 REM PORTED FROM PYTHON3, FROM "LEARNPYTHON" PROJECT ON GITHUB
5 REM THE PYTHON VERSION IS MIT-LICENSED.
10 PRINT "CALCULATE HOW MANY DIGITS OF PI";
20 INPUT P
25 LET P=INT(P)
30 IF P>=1 THEN 60
40 PRINT "PLEASE ENTER A POSITIVE NUMBER."
50 GOTO 10
60 IF P<20 THEN 100
70 PRINT "WARNING: PROGRAM ONLY ACCURATE TO 20 DIGITS OR SO."
100 LET Q=1
110 LET R=0
120 LET T=1
130 LET K=1
140 LET N=3
150 LET L=3
160 LET C=0
200 IF (4*Q+R-T)>=(N*T) THEN 300
210 PRINT N;
215 IF C>0 THEN 220
217 PRINT ".";
220 LET C=C+1
230 IF C=P THEN 500
240 LET R1=10*(R-N*T)
250 LET N=INT((10*(3*Q+R))/T)-10*N
260 LET Q=Q*10
270 LET R=R1
280 GOTO 200
300 LET R1=(2*Q+R)*L
310 LET N1=INT((Q*(7*K)+2+(R*L))/(T*L))
320 LET Q=Q*K
330 LET T=T*L
340 LET L=L+2
350 LET K=K+1
360 LET N=N1
370 LET R=R1
380 GOTO 200
500 PRINT
510 REM THE PRINT ABOVE IS NEEDED TO MAKE MINIMALBASIC FLUSH ITS
520 REM OUTPUT BUFFER. OTHERWISE WE GET NO OUTPUT!
9999 END

View file

@ -0,0 +1,126 @@
#!/bin/bash
# Slackware build script for minimal-basic
# Written by B. Watson (urchlay@slackware.uk)
# Licensed under the WTFPL. See http://www.wtfpl.net/txt/copying/ for details.
# Notes:
# Abandon all hope, ye who attempt to build this on non-x86_64
# platforms. The ecma55 binary gets linked with a bunch of x86_64
# object files in a directory named AMD64 (which ought to be a clue),
# which are built from x86_64 assembly source (not C). Nothing you do
# (hacking up the Makefile, etc) will let you link x86_64 objects with
# non-x86_64 ones. Seriously. Do not email me asking for help with it.
# Building on multilib should be possible, but I haven't tested it.
# If you do, you can only build an x86_64 binary. See above.
# There's a Makefile.clang, but it won't work on Slackware 15.0's
# clang 13.x because it's too *new*. That's a rare situation in
# Slackware...
# There's also a Makefile.tcc, which actually does work with the
# tcc in our repo (20220221_308d8d1), but I see no advantage to
# building with tcc. And no, using tcc won't get around the "only
# builds on x86_64" rule, either.
cd $(dirname $0) ; CWD=$(pwd)
PRGNAM=minimal-basic
SRCNAM=MinimalBASIC
VERSION=${VERSION:-2.40}
BUILD=${BUILD:-1}
TAG=${TAG:-_SBo}
PKGTYPE=${PKGTYPE:-tgz}
if [ -z "$ARCH" ]; then
case "$( uname -m )" in
i?86) ARCH=i586 ;;
arm*) ARCH=arm ;;
*) ARCH=$( uname -m ) ;;
esac
fi
if [ ! -z "${PRINT_PACKAGE_NAME}" ]; then
echo "$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.$PKGTYPE"
exit 0
fi
TMP=${TMP:-/tmp/SBo}
PKG=$TMP/package-$PRGNAM
OUTPUT=${OUTPUT:-/tmp}
if [ "$ARCH" = "x86_64" ]; then
SLKCFLAGS="-O2 -fPIC"
else
cat <<EOF
**************************************************
* Unsupported ARCH: $ARCH
* MinimalBASIC only builds on x86_64, by design.
**************************************************
EOF
exit 1
fi
set -e
rm -rf $PKG
mkdir -p $TMP $PKG $OUTPUT
cd $TMP
rm -rf $SRCNAM-$VERSION
tar xvf $CWD/$SRCNAM-$VERSION.tar.xz
cd $SRCNAM-$VERSION
chown -R root:root .
find -L . -perm /111 -a \! -perm 755 -a -exec chmod 755 {} \+ -o \
\! -perm /111 -a \! -perm 644 -a -exec chmod 644 {} \+
runmake() {
make -f Makefile.gcc \
OPT="$SLKCFLAGS" \
PIE=1 \
LTO=1 \
DESTDIR=$PKG \
BINDIR=/usr/bin \
MANDIR=/usr/man/man1 \
"$@"
}
runmake
strip ecma55
runmake install
# Sample code, including my own ports of Hamurabi and Bagels. They
# came from http://vintage-basic.net/games.html (and before that, from
# the book "101 BASIC Computer Games" by David Ahl, and before Ahl
# collected them in his book, other people wrote them, but the mists
# of time have obscured the details).
# I modified them slightly to make them ECMA-55 compatible. They also
# work in bas55, and may show up in a future release of it.
# PI.BAS is my own BASIC port of pi.py from https://github.com/MrBlaise/learnpython/
EXTRA=$PKG/usr/share/$PRGNAM/examples
mkdir -p $EXTRA
cp -a CSCLASSICS $PKG/usr/share/$PRGNAM
install -m0644 -o root -g root $CWD/examples/*.BAS $EXTRA
# *Lots* of documentation.
PKGDOC=$PKG/usr/doc/$PRGNAM-$VERSION
mkdir -p $PKGDOC
cp -a COPYING ChangeLog CC0-1.0-Universal NEWS \
README TESTING THANKS TODO GNU_FDL \
*.pdf *.txt *.TXT *.dot BOOK/*.pdf \
$PKGDOC
cat $CWD/$PRGNAM.SlackBuild > $PKGDOC/$PRGNAM.SlackBuild
mkdir -p $PKG/install
cat $CWD/slack-desc > $PKG/install/slack-desc
cd $PKG
/sbin/makepkg -l y -c n $OUTPUT/$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.$PKGTYPE

View file

@ -0,0 +1,10 @@
PRGNAM="minimal-basic"
VERSION="2.40"
HOMEPAGE="https://buraphakit.sourceforge.io/BASIC.shtml"
DOWNLOAD="UNSUPPORTED"
MD5SUM=""
DOWNLOAD_x86_64="https://downloads.sourceforge.net/project/buraphakit/ECMA55%20Minimal%20BASIC/MinimalBASIC-2.40.tar.xz"
MD5SUM_x86_64="0276e6edcc70a6c343a9adb467df845b"
REQUIRES=""
MAINTAINER="B. Watson"
EMAIL="urchlay@slackware.uk"

View file

@ -0,0 +1,19 @@
# HOW TO EDIT THIS FILE:
# The "handy ruler" below makes it easier to edit a package description.
# Line up the first '|' above the ':' following the base package name, and
# the '|' on the right side marks the last column you can put a character in.
# You must make exactly 11 lines for the formatting to be correct. It's also
# customary to leave one space after the ':' except on otherwise blank lines.
|-----handy-ruler------------------------------------------------------|
minimal-basic: minimal-basic (compiler for ECMA-55 Minimal BASIC)
minimal-basic:
minimal-basic: This software is a compiler for 'Minimal BASIC' as specified by the
minimal-basic: ECMA-55 standard. The target is AMD64/EM64T/x86-64 machines running a
minimal-basic: modern Linux distribution.
minimal-basic:
minimal-basic:
minimal-basic:
minimal-basic:
minimal-basic:
minimal-basic: