楽天市場
[無料でホームページを作成] [通報・削除依頼]

PICで電大版TINYBASIC 準備編その1


最近のエンハンスミッドレンジのPICは内臓RAMの容量が飛躍的に増大しています。
RAMの容量が増大したことを生かすべく電大版TINYBASICをPIC16F18857に移植しました。
プログラムで使用可能な容量は本家の1/10から1/20ですが、それでも使い途がないわけではありません。
何より安く小さく作れます。またPEEK/POKE文を使用してPICの豊富なペリフェラルを操作することができます。
RAMの容量については今後のPICに期待します。

※注意)私のページで紹介する電大版TINYBASICはブルーバックスに掲載された版ではなく、bit誌にソース付きで
掲載された版です。bit誌の版とブルーバックスの版とでは変数の割付けアドレスが一部異なっています。

移植までの手順と考慮すべき点などについてまとめます。


試作したTINYBASIC基板(下) (上:USB-シリアル変換器、TINYBASIC基板に挿して使用)
構成 PIC16F18857+リセット回路+USB-シリアル変換器
使用部品 抵抗2本、ダイオード、プッシュSW、電解コンデンサ、パスコン
img_20180617-090326.jpg

実行例1 プログラムエリアのサイズ、乱数、剰余、四則演算
img_20180617-090711.jpg

実行例2   POWER OF N
img_20180617-090956.jpg


<準備編その1:6803評価ボードの製作>

PICにTINYBASICを移植し比較/デバッグするため、まず電大版TINYBASICが動作する環境を構築しました。
6803評価ボード
img_20180617-092516.jpg
回路図
img_20180617-092644.jpg

手元に6803がありましたので、6803の評価ボードを製作しました。
6803の場合、ROMにLILBUGを搭載することで、TINYBASIC作動中のレジスタ・メモリ値の確認が行えます。
回路を簡素化するため、アドレスデコードを行わず、A15の信号線でRAMとROMを切り替える仕様です。
($0000から$7FFFにRAM、$8000から$FFFFにROMを配置)
300milの62256を持ち合わせていなかったのでRAMは62256の倍の容量の62512を使用しました。
(62512のA15のピンをHレベルに固定し、容量の半分を使用しています。)

以上6803での環境は整いましたが、TINYBASICを走らせるにはいくつか工夫が必要でした。

6803評価ボードで電大版TINYBASICを作動させるための留意点
①6803は6800に比べて、使用できるゼロページRAMが少ない。
電大版TINYBASICは元々6800とMIKBUGの組み合わせで動作することを前提に
設計されており、かつMIKBUGは6800のゼロページRAMを使用しない仕様です。
このため電大版TINYBASICでは6800のゼロページRAM(256バイト)のうち230
バイト($1A-$FF)を使用していますが、6803ではゼロページRAMが229バイトしか
存在しません。($04,$05,$06,$07,$0F,$20-$FF)

②LILBUGはワークエリア/スタックとして6803のゼロページRAMを使用するため
電大版TINYBASICの使用するゼロページRAMと重なる。


③シリアル入出力方法の違い
電大版TINYBASICは元々MC6850を用いたシリアル入出力を前提に設計されており、
受信ステータスを直接MC6850から読み込んでいます。(送受信データのやりとりはMIKBUGのサブルーチンを介する。)
一方6803では,受信ステータスのチェックもLILBUGのサブルーチンを介して行うことができます。


<変更1>
以上①の点を踏まえて以下のようにソースを変更しました。(変更箇所は赤字で表示)
変数Vは$1Aから$04へ
変数Wは$1Cから$06へ
変数RAMENDはユーザRAMの上限値がストアされるが、その後は値の参照に使用されるだけなので廃止。
変数RAMENDのアドレスに変数RNDを配置

変更前
        ORG    $001A
V       RMB    2
W       RMB    2
RND     RMB    2
Z       RMB    2
LN      RMB    2

PRSTRT  RMB    2
PREND   RMB    2
RAMEND  RMB    2
SUBSP   RMB    2
FORSP   RMB    2



変更後
        ORG    $0004
V       RMB    2
W       RMB    2


        ORG    $0020
Z       RMB    2
LN      RMB    2

PRSTRT  RMB    2
PREND   RMB    2
;RAMEND RMB    2
RND     RMB    2

SUBSP   RMB    2
FORSP   RMB    2



変更前
MEMTST  INX
        LDAB     1,X
        STAA     1,X
        LDAA     1,X
        STAB     1,X
        CMPA     #$AA
        BEQ      MEMTST
        STX      RAMEND
NEW     BSR      INIT1

SIZE    LDAA     RAMEND+1
        LDAB     RAMEND
        SUBA     PREND+1
        SBCB     PREND
        RTS


ARRAY   JSR      FACT
        JSR      POP
        BITB     #$C0
        BNE      ERR11
        SEC
        ROLA
        ROLB
        ADDA     PREND+1
        ADCB     PREND
        CMPB     RAMEND
        BNE      L649
        CMPA     RAMEND+1
L649    BCC      ERR11
        CLC
        RTS



変更後
MEMTST  INX
        LDAB     1,X
        STAA     1,X
        LDAA     1,X
        STAB     1,X
        CMPA     #$AA
        BEQ      MEMTST
;       STX      RAMEND
NEW     BSR      INIT1

SIZE    LDAA     #$FF
        LDAB     #$7F
        SUBA     PREND+1
        SBCB     PREND
        RTS


ARRAY   JSR      FACT
        JSR      POP
        BITB     #$C0
        BNE      ERR11
        SEC
        ROLA
        ROLB
        ADDA     PREND+1
        ADCB     PREND
        CMPB     #$7F
        BNE      L649
        CMPA     #$FF
L649    BCC      ERR11
        CLC
        RTS



<変更2>
以上③の点を踏まえて以下のようにソースを変更しました。
LILBUGのCIDTAルーチンでは受信完了か否かをチェックして受信未完了ならCフラグをクリアして戻る。
受信完了なら受信データをAレジスタに書き込み戻る。次行でINサブルーチンに飛び、内部で再受信するので
再受信しないようIN+3のアドレスにサブルーチンコールする。

変更前
INEEE   EQU    $E1AC
OUTEEE  EQU    $E1D1
BRKCHK  EQU    $8004


変更後
INEEE   EQU    $F706 <--- LILBUGの1文字入力ルーチンINCHNPのアドレス
OUTEEE  EQU    $F709 <--- LILBUGの1文字出力ルーチンOUTCHのアドレス
BRKCHK  EQU    $F792 <--- LILBUGの1文字入力ルーチンCIDTAのアドレス


変更前
BREAK   PSHA
        LDAA     BRKCHK
        BMI      BR5
        BSR      IN
BR5     PULA
BR6     RTS


変更後
BREAK   PSHA
        JSR     BRKCHK
        BCC     BR5
        BSR     IN+3

BR5     PULA
BR6     RTS



②に関する変更は準備編その2で解説します。