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

8052AH-BASIC SBC


  1. 8052AH-BASIC
  2.  8052-AH BASICをなかなか見つけられないでいたが偶然見つけた。
    マルツの特価半導体を眺めていたら特価現品限りで8052AHが出ていた。web上の画像はマーキングが消してあったので、P8052AH-BASICかどうかは判らなかったけど、まあ1つ買ってみるかと注文したらP8052AH-BASICだった。
    8052AH-BASIC バージョン1.1 (1991/11週か)
    じゃあSBCを作ってBASIC-52で遊んでみるかと

  3. 回路図
  4.  回路図はMCS BASIC-52に掲載されているRAMとEEPROMを使ったもの
    8052 BASIC SBC Schematic
     マニュアルは74LS138(3to8 Demultiplexer)を使っているが、74HCT139(Dual 2to4 Demultiplexer)を使うようにした。
    74HCT139を使うとA000h-BFFFhにEEPROMのイメージが見えるが、IOアドレスはC000h、D000h、E000h、F000hがI/Oアドレスとして使えるようになる。74LS138を使うと使えるのはC000h、E000hだ。
     MCS BASIC-52のマニュアルは方々で公開されていて検索すると簡単に見つかる。(IntelがPDSにしたらしい)

  5. 部品配置
  6.  主要な部品は、8052-AH(40pin DIP)、RAM 62256(28pin DIP)、EEPROM HN58V65(28pin DIP)、74HCT573(20pin DIP)、74HCT08(14pin DIP)、74HCT138(16pin DIP)なのでサンハヤトの ICB-293U に載りそうだ。

     ユニバーサル基板エディタ PasSを使ってICB-293Uに載せてみた。
    8052 BASIC SBC PasS
     アドレスラッチの74HCT573と74HCT08は8052-AHの下に配置してスペースを稼ぐ。

     以前は行き当たりばったりで配線していたのだが、PasS を知ってからは予め置いてみるようにしている。実際に配線し始めると変わることもよくあるのだが...

  7. 配線
  8.  表
    8052 BASIC SBC F

     裏
    8052 BASIC SBC R
    ポリウレタン線を使って裏面で配線している。

    手配線を減らすためにサンハヤトのシール基板 ICB-055 を使ってRAMとEEPROMを配線した。
    ICB-055
    この基板はちょっと高いのだがちょっと横着をした。

     RAMとEEPROMはピン配列がほぼ同じなので、この基板を使って配線すると大幅に配線作業が減る。 このシール基板は半分が600mil×5 でもう半分が300mil×8だ。今回は600milの部分2個分を切って使った。

     そして完成。

    8052 BASIC SBC R

  9. 起動
  10.  ターミナルを繋いで、スペースを押すとシリアルのスピードが自動検出されてオープニングメッセージが表示される。

    *MCS-51(tm) BASIC V1.1*   
    READY
    >
    

     九九の表を表示させるプログラムを動かしてみた

    8052 BASIC SBC R
    ちゃんと動いているようだ。

  11. プログラム
  12.  何はともあれメモリダンププログラムを書いてみた。久しぶりにBASICのプログラムを書くと違和感があるなあ。

    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
    

    LISTコマンドで表示したこのインデントには、なじめないなあ。

     お約束の8Queen問題
    8052 BASIC SBC R
     遅いなあ。インタプリタだから仕方ないけど。

     

    1      REM ################################
    
    
    2      REM 8Queen
    3      REM Nov. 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
    

     BASIC52ではNEXTをGO TOやRETURNで飛び越してはいけないらしい。ERROR: C-STACKの意味がわからずハマってしまった。

     プログラムはPC上のviで書いてターミナル経由でアップロードしている。
    1行入力して改行したときにBASIC52が1行分のプログラムを処理する時間が必要で、処理時間を考慮しないで次の行を送ると文字を落としてしまうので、ターミナル側で1行送信後ウエイトを入れる。TeraTermではシリアルポートの設定→送信遅延である。
    8052 BASIC SBC R
    長い行は処理時間が必要なので300msくらい必要である。

     行番号1と行番号2の間はわざと空けてある。
    NEWコマンド実行後最初の行の処理時間は更に長い。かといって、この時間に合わせてウエイトを入れるとアップロードが遅くてイライラするので、改行を2つ入れて処理時間を稼ぐとうまくいく。

  13. EEPROM書き込み
  14. RAMで動作しているプログラムはPROG、FPROGコマンドでEEPROMに保存しEEPROM上で実行することができる。 (トラブルはあったけど)
    8052 BASIC SBC R
    メモリダンププログラムをダウンロードしてROMに書いたところ。

     ROMに書かれたプログラムを一覧するプログラムを作ろうかと考えていたら、既に作っている人がいて、ここにあった。
    8052 BASIC SBC R
    プログラム番号、先頭アドレス、サイズ、先頭のREMを表示してくれる。

  15. つれづれ
  16.  8052-AH BASIC SBCを作ろうと思ったきっかけは、本棚から「 エレクトロニクスライフ 1990/8 」を引っ張り出してきたことだ。
     それまでBASICでプログラムを書いていてBASICで構造化(流行っていたなあ)なんてことを一生懸命考えていたが、1990頃はCでプログラムを書いていたので、どうやってZ80 SBCのプログラムをCで書くかを考えていた。
    そんなとき、「エレクトロニクスライフ」を読んだのだが、8052-AH BASICやEEPROMが結構高価だったので結局スルーしたと記憶している。

     電源ONで自分が書いたBASICが走るのは便利かもしれない。市販のボードもいくつもあった。 8052AH BASICやEEPROMが高いと思ったくらいだから、とても手が出る価格ではなかった。
     リアルタイム性を求めるならインタプリタでは厳しいのでアセンブラでプログラムを書く必要がある。 アセンブラでプログラム書くにしても1から書いてROM化するのは大変なので、BASIC-52ボードにEEPROMを積んで、アセンブラルーチンをEEPROMに置いてBASICからCALLする方が楽だ。

     というわけで、結構ニーズはあったのかと思う。


[Yoshiのブログ]

トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/577514/55870419

この記事へのトラックバック一覧です: 8052AH-BASIC SBC:

コメント

コメントを書く

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

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