フォト
無料ブログはココログ

MyList

« 才能を引き出すエレメントの法則 | トップページ | トラ技2012/11オマケ基板 »

2012年11月 3日 (土)

8052BASIC(5)

EEPROMにプログラムが保存できない問題があるが、何はともあれメモリダンププログラム
Hexdump

データメモリをダンプしてみた

 久しぶりに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問題

8queenb52

 BASIC-52はNEXTをGOTOやRETURNで飛び越してはいけないらしい。(ちょっとハマった。)
それにしても遅い!!インタプリタだからね。

 プログラムはPC上のviで書いてターミナル(Traterm)を使って送信する。スクリーンエディタ無しでは生きていけないヘタレになってしまった。
8queenb52_load

 1行入力後処理時間を取らないと文字を落としてしまうのでディレイを入れる。特に長い文は時間がかかるようだ。
8queenb52_load_delay

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オマケ基板 »

8031/8052 SBC」カテゴリの記事

プログラミング」カテゴリの記事

コメント

コメントを書く

コメントは記事投稿者が公開するまで表示されません。

(ウェブ上には掲載しません)

トラックバック


この記事へのトラックバック一覧です: 8052BASIC(5):

« 才能を引き出すエレメントの法則 | トップページ | トラ技2012/11オマケ基板 »