Bywater BASIC で動かすための改変例

このページの目的

N88-BASICのプログラムを Bywater BASIC で動かすための改変例です。

Linux上のBASICインタプリタで、 Bywater BASIC で動かすときのポイントを解説しましたが、特定のプログラムで必要になるものを上げたに過ぎないので、別のプログラムでは改変が必要な項目がたくさん出てくるはずです。どこまでなら改変なく動くかもよくわかりません。

かといって、全部を調べる気力も動機もありませんので、動かせたプログラムを掲載しておきます。

実は、昔2の64乗を整数で計算したことを思い出して、今のプログラム言語でもやってみようと思い立って始めたことなのですが、思わぬ展開になります。それは、大きな整数の計算に書く予定です。

N88-BASICの元プログラム

プログラムの冒頭にあるように、1988年にハノイの塔の移動手数を計算したプログラムを改変して、1990年に2の累乗を100まで求めるものです。1020のGOTOをなくすとハノイの塔のプログラムになります。

行番号があるためプログラムの挿入が難しかったので、このような作りでプログラム(サブルーチン)の再利用をすることはよくあることでした。

1000 'save "power2"    '90.11.20  power of 2
1010 'from "hanoi"     '88.07.10/hanoi idoukaisuu 2^X-1
1020  GOTO *POWER2
1030 '
1040 *HANOI    '------------------------------
1050 '
1060 DEFINT A-Z
1070 NMAX=100
1080 KTMX=30
1090 LPON=0
1100 LPBGN=1
1110 DV$= "LPT:"
1120 '
1130 OPEN DV$     FOR OUTPUT AS #1
1140 DIM A(KTMX),B(KTMX),I(KTMX)
1150 I(1)=1
1160 FOR N=1 TO NMAX
1170   IF N>=LPBGN THEN LPON=-1
1180   FOR K=1 TO KTMX
1190     B(K)=A(K)
1200   NEXT
1210   GOSUB *ADD      'a()=a()+b()
1220   FOR K=1 TO KTMX
1230     B(K)=I(K)     'a()=a()+ 1
1240   NEXT
1250   GOSUB *ADD
1260   GOSUB *PRT
1270   PRINT USING ":###" ;N
1280   IF LPON THEN PRINT #1, USING ":###" ;N
1290 NEXT
1300 END
1310 '
1320 '
1330 *PRT 'A()
1340  K=KTMX
1350  WHILE A(K)=0 AND K>1
1360     K=K-1
1370     PRINT " ";
1380     IF LPON THEN PRINT #1, " ";
1390  WEND
1400  FOR K=K TO 1 STEP -1
1410     PRINT MID$(STR$(A(K)),2);
1420     IF LPON THEN PRINT #1,MID$(STR$(A(K)),2);
1430  NEXT
1440 RETURN
1450 '
1460 *ADD 'i(A(),B(),KTMX) o(A())
1470 KURI=0
1480 FOR ADDI=1 TO KTMX
1490    A(ADDI)=A(ADDI)+B(ADDI)+KURI
1500    KURI=A(ADDI)\10
1510    A(ADDI)=A(ADDI) MOD 10
1520 NEXT
1522 IF KURI<>0 THEN PRINT "Over flow ":STOP
1530 RETURN
1550 '
2000 *POWER2   '------------------------------
2010 '
2020 DEFINT A-Z
2030 NMAX=100
2040 KTMX=31
2050 LPON=0
2060 LPBGN=20
2070 DV$= "LPT:"
2080 '
2090 OPEN DV$     FOR OUTPUT AS #1
2100 DIM A(KTMX),B(KTMX),I(KTMX)
2110 A(1)=1
2120 FOR N=1 TO NMAX
2130   IF N>=LPBGN THEN LPON=-1
2140   FOR K=1 TO KTMX
2150     B(K)=A(K)
2160   NEXT
2170   GOSUB *ADD      'a()=a()+b()
2180   GOSUB *PRT
2190   PRINT USING ":###" ;N
2200   IF LPON THEN PRINT #1, USING ":###" ;N
2210 NEXT
2220 END

Bywater BASIC 用改変後

HANOIは99まで、POWER2は100まで計算できます。

プログラムの内容を読む方に、作成者の事情を説明します。

・LPT1:はプリンタです。今時印刷してもしょうがないので、ファイルに書き出すようにしましたが、その結果印刷できるかのご報告はできません。

・変数LPONは必要のない印刷をスキップするためのものです。また、プログラムが間違いなく動くようになってから印刷するという役割も兼ねています。

・画面表示のprintの方はプログラムの進捗を表すためにprint #1 と二重に書かれています。

・配列名がA,BなのはCPUのレジスタをイメージしています。Iは一です。

次はN88-BASICの事情です。

・true,falseという変数の型はありません。しかし、条件判断ではfalse=0となっているようなので、0,-1でプログラムしています。

・配列は1から始まります。DIM A(20)のとき添字は1〜20です。作成時に初期値として0が入ります。これを当てにしています。

・配列に要素数を問う関数はありません。変数をつかって確保して変数の値で要素数を知ります。

・MID$(STR$(A(K)),2);は数値をprintすると正負記号のため1桁確保されるので1桁の正数を書くにはこのようにする他ありません。MID$関数は終了位置を省略すると最後までになります。

・変数は全部グローバルです。

rem 2018.09.11 bwbasic
1000 rem save "power2"    '90.11.20  power of 2
1010 rem from "hanoi"     '88.07.10/hanoi idoukaisuu 2^X-1
1020 rem GOTO POWER2

1040 HANOI:   REM ------------------------------
1050 rem
1060 rem DEFINT A-Z
1070 NMAX=100
1080 KTMX=30
1090 LPON=0
1100 LPBGN=1
1110 DV$= "bwhan.txt"
1120 rem
1130 OPEN DV$  FOR OUTPUT AS #1
1140 DIM A(KTMX), B(KTMX), I(KTMX)
1150 I(1)=1
1160 FOR N=1 TO NMAX
1170   IF N>=LPBGN THEN LPON=-1
1180   FOR K=1 TO KTMX
1190     B(K)=A(K)
1200   NEXT
1210   GOSUB ADD      rem a()=a()+b()
1220   FOR K=1 TO KTMX
1230     B(K)=I(K)     rem a()=a()+ 1
1240   NEXT
1250   GOSUB ADD
1260   GOSUB PRT
1270   PRINT USING ":###" ;N
1280   IF LPON THEN PRINT #1, USING ":###" ;N
1290 NEXT
1292 close #1
1300 END

1330 PRT:  rem A()
1340  K=KTMX
1350  WHILE A(K)=0 AND K>1
1360     K=K-1
1370     PRINT " ";
1380     IF LPON THEN PRINT #1, " ";
1390  WEND
1400  FOR K=K TO 1 STEP -1
1410     PRINT MID$(STR$(A(K)),2);
1420     IF LPON THEN PRINT #1,MID$(STR$(A(K)),2);
1430  NEXT
1440 RETURN

1460 ADD: rem i(A(),B(),KTMX) o(A())
1470 KURI=0
1480 FOR ADDI=1 TO KTMX
1490    A(ADDI)=A(ADDI)+B(ADDI)+KURI
1500    KURI=int(A(ADDI)/10)
1510    A(ADDI)=A(ADDI) MOD 10
1520 NEXT
1522 IF KURI<>0 THEN PRINT "Over flow ";KURI :STOP
1530 RETURN

2000 POWER2:
2020 rem DEFINT A-Z
2030 NMAX=100
2040 KTMX=31
2050 LPON=0
2060 LPBGN=20
2070 DV$= "bwpw2.txt"
2090 OPEN DV$     FOR OUTPUT AS #1
2100 DIM A(KTMX),B(KTMX),I(KTMX)
2110 A(1)=1
2120 FOR N=1 TO NMAX
2130   IF N>=LPBGN THEN LPON=-1
2140   FOR K=1 TO KTMX
2150     B(K)=A(K)
2160   NEXT
2170   GOSUB ADD   rem a()=a()+b()
2180   GOSUB PRT
2190   PRINT USING ":###" ;N
2200   IF LPON THEN PRINT #1, USING ":###" ;N
2210 NEXT
2220 system