N88-BASICのプログラムを Bywater BASIC で動かすための改変例です。
Linux上のBASICインタプリタで、 Bywater BASIC で動かすときのポイントを解説しましたが、特定のプログラムで必要になるものを上げたに過ぎないので、別のプログラムでは改変が必要な項目がたくさん出てくるはずです。どこまでなら改変なく動くかもよくわかりません。
かといって、全部を調べる気力も動機もありませんので、動かせたプログラムを掲載しておきます。
実は、昔2の64乗を整数で計算したことを思い出して、今のプログラム言語でもやってみようと思い立って始めたことなのですが、思わぬ展開になります。それは、大きな整数の計算に書く予定です。
プログラムの冒頭にあるように、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
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