EEPROMにプログラムが保存できない問題があるが、何はともあれメモリダンププログラム
データメモリをダンプしてみた
久しぶりにBASICでプログラムを書くと違和感がある。
LISTを表示したときのこのインデントはなじめないなあ。
100 REM
110 REM ############################### 120 REM dump memory 130 REM ############################### 140 STRING 11,5 : DIM ASCI(16) 150 REM INPUT "address: ",ADR 160 INPUT "length: ",L 170 REM == dump == 180 FOR I=ADR TO (ADR+L-1) 190 IF (I.AND.0FH)=0 THEN GOSUB 4000 200 C=XBY(I) 210 HH=C : GOSUB 2000 215 PRINT " ", 220 ASCI(I.AND.0FH)=C 230 IF C<20H.OR.7EH<C THEN ASCI(I.AND.0FH)=ASC(.) 240 NEXT I 320 GOSUB 3000 325 PRINT 330 INPUT "next:1 end:0 ?",ANS 340 IF ANS<>1 THEN STOP 350 ADR=ADR+L 360 FOR II=0 TO 15 370 ASCI(II)=0 380 NEXT II 390 GOTO 180 900 STOP 990 REM =================================== 1000 REM print 16bit data / HHHH:print data 1010 HH=INT(HHHH/256) : GOSUB 2000 1020 HH=HHHH-HH*256 : GOSUB 2000 1030 PRINT ": ", 1040 RETURN 2000 REM print 8bit data / HH: print data 2010 BB=INT(HH/16) 2020 PRINT CHR(30H+(BB>9)/65535*7+BB), 2030 BB=HH-BB*16 2040 PRINT CHR(30H+(BB>9)/65535*7+BB), 2050 RETURN 2990 REM =================================== 3000 REM print ascii data 3020 FOR II=0 TO 15 3030 PRINT CHR(ASCI(II)), 3040 NEXT II 3050 PRINT 3060 RETURN 4000 REM 4010 HHHH=I : GOSUB 3000 : GOTO 1000
|
行番号2020、2040nの PRINT CHR(30H+(BB>9)/65535*7+BB), をC風に書くと
putchar('0' + (BB>9)? BB+7: BB);
のような感じだ。丁寧に書くと
if (BB>9)
putchar('A'+(BB-10));
else
putchar('0'+BB);
BASIC-52のtrueは65535(FFFFh)ということを知った。
お約束の8Queen問題
BASIC-52はNEXTをGOTOやRETURNで飛び越してはいけないらしい。(ちょっとハマった。)
それにしても遅い!!インタプリタだからね。
プログラムはPC上のviで書いてターミナル(Traterm)を使って送信する。スクリーンエディタ無しでは生きていけないヘタレになってしまった。
1行入力後処理時間を取らないと文字を落としてしまうのでディレイを入れる。特に長い文は時間がかかるようだ。
1 REM ################################
2 REM 8Queen 3 REM Sep. 2012 / Yoshi 4 REM ################################ 10 REM init 20 TRUE=(0=0) 30 FALSE=(0=1) 40 N=0 : rem pattern 50 D=0 : rem debug level 60 FOR Y=1 TO 8 70 A(Y)=0 : REM init array 80 NEXT Y 100 REM 110 REM main routine 120 REM 130 S=1 140 FOR Y=1 TO 8 150 FOR X=S TO 8 160 YY=Y : XX=X : GOSUB 1000 : REM check 170 IF CHK=FALSE THEN GOTO 220 : REM end if 180 A(Y)=X 190 X=8 200 S=1 210 REM gosub 2000 220 REM end if 230 NEXT X 240 IF CHK=TRUE THEN GOTO 330 : REM end if 250 S=A(Y-1)+1 260 A(Y-1)=0 270 Y=Y-2 280 IF S<9 THEN GOTO 320 : REM end if 290 S=A(Y)+1 300 A(Y)=0 310 Y=Y-1 320 REM end if 330 REM end if 340 IF D>=1 THEN GOSUB 2000 350 NEXT Y 360 N=N+1 370 GOSUB 2000 390 REM 900 STOP 990 REM ===================================== 1000 REM check : pos(x,y) 1010 IF D>=2 THEN PRINT "(",X,",",Y,")" 1020 CHK=TRUE 1030 IF Y=1 THEN GOTO 1100 : REM end if 1040 FOR YY=1 TO Y-1 1050 IF A(Y-YY)=X THEN CHK=FALSE 1060 IF A(Y-YY)=X+YY THEN CHK=FALSE 1070 IF A(Y-YY)=X-YY THEN CHK=FALSE 1080 IF CHK=FALSE THEN YY=Y 1090 NEXT YY 1100 REM endif 1110 RETURN 1120 REM 1990 REM ====================================== 2000 REM print array 2010 PRINT "--",N,"--" 2020 IF D>=2 THEN PRINT "(",X,",",Y,")","S:",S 2030 FOR YY=1 TO 8 2040 FOR XX=1 TO 8 2050 IF A(YY)=XX THEN PRINT "|X", ELSE PRINT "| ", 2060 NEXT XX 2070 PRINT "|" 2080 NEXT YY 2090 RETURN 2100 REM
|
行番号1と2の間の改行はわざと入れてある。
NEW実行後、最初に行番号付きでプログラムを入力すると処理に時間がかかるので、行番号1と行番号2の間に改行を入れておくと、ターミナルからプログラムをDLしたときに、ちゃんと入力されるようになる。
« 才能を引き出すエレメントの法則 |
トップページ
| トラ技2012/11オマケ基板 »
« 才能を引き出すエレメントの法則 |
トップページ
| トラ技2012/11オマケ基板 »
コメント