Old MC6800(Home) > 新しい基板 > MIKBUGプチ拡張
MIKBUG プチ拡張 (Old MC6800) 


 UV-EPROM (MBM2732A)今回は MIKBUG, TinyBASIC(電大版), VTL をまとめて焼いてみました 
目  次内  容更新日
[0] 始めにSBC6800 用の ROM の有効活用と MIKBUGプチ拡張について  2018/02/022018/04/26
[1] アセンブラの準備クロスアセンブラ(DOS版)  WinXP以前か MS-DOS Playerが必要
[2] ソフトの準備と変更MIKBUGの入力ルーチン変更、TinyBASICを起動する Tコマンド追加
[3] UV-EPROM の消去と書込消去は殺菌灯で十分  安価な書込み器を入手したのでライター製作は中止
   EEPROM の消去と書込消去も書込みも、書込み器で出来るので書き換えが速い!2018/04/09
   ROM容量別読込オフセット読込み時のオフセット値を勘違いしやすいので表にしてみました2018/04/09
[4] デバッグの方法RAMにロードするバージョンでデバッグし、ROMアドレスに ...
[5] 動作確認起動確認と簡単なテストプログラムの実行
[6] 今後の課題BASIC ソースの読込みには、フロー制御に期待






[0] 始めに     (以下、単に MIKBUG と記述している部分も MIKBUG互換モニタを指します)
SBC6800 ボードには ACIA をサポートする MIKBUG互換モニタが載せられます
ボードには 2732/2764/27128/27256 等の UV-EPROM を搭載できます
下図の様に $E000-$FFFF のアドレス空間にマッピングされているので 最大 8kByte まで使用できます
MIKBUG互換モニタを書込んだ ROM は、27256型(32kBの内8kBがマッピングされる)で提供されています

MIKBUG互換モニタが書き込まれている 27256型(32kB)の ROMは、(マッピングされる)8kByte の内
0.5kByte しか利用していませんので、残りの 7.5kByte を有効に使うことにします




まず手始めに、手持ちの 2732型(4kByte) ROMでどれだけ詰め込めるか検討してみます

結論としては、下表の様に欲張って MIKBUG互換モニタ+プチ拡張、TinyBASIC、VTL としました
2018/04/26
プログラム名開始番地終了番地容量(Byte)備考
MIKBUG互換モニタ$E000$E1DD478PIA ---> ACIA 版
  (MIKBUG)プチ拡張・・・$E1FF(512)オリジナルサイズ以下の範囲で拡張
FLCTSR(フロー制御SR)$E200$E29B156フロー制御サービスルーチン(割込)2018/04/26
Tiny BASIC(電大版)$E300$EB492,128(FLCTSR 追加により 開始番地変更)2018/04/26
VTL$EC00$EF1F800 
VECTOR$EFF8$EFFF8イメージは $FFF8-$FFFF

MIKBUG互換モニタの拡張内容(主な変更点は以下の2点です)

(1)Tiny BASIC を起動するコマンド「T」Tiny Basic を追加する
  Tiny BASIC(電大版)は、ワーク領域とコードが分離されていて ROM化するのに都合が良い事と
  サイズが約 2kByteと小さく、おまけで VTL も詰め込んでも 4kByteに収まります

  「T」コマンドは Tiny BASIC を起動する(コールドスタート・NEWを実行したのと同じ)
  「G」コマンドは Tiny BASIC に戻る(ホットスタート・MIKBUGに戻る前の BASICプログラムは残る)

  (注記) 以下の説明は、MIKBUG と アセンブラの知識がないと理解できないと思いますので飛ばして下さい
  Tiny BASIC の起動は、$1F48-$1F49 にスタート番地をセットして RTI とします(「G」コマンドと同じ)
  理由は、Tiny BASIC のスタート番地は典型的な 6800のプログラムの例に従い
  コールドスタートが $0100番地(JSR START)、ホットスタートが $0103番地(JMP CONTRL)となっています
  RTI でコールドスタートから実行を始めると、最初にホットスタート番地がスタック($1F48-$1F49)に積まれます
  MIKBUG に戻る時(TinyBASICの EXITコマンド)は、MIKBUG の START($E0D0) にジャンプしてくるので
  ホットスタート番地($0103)がスタック($1F48-$1F49)に残っています
  もう一度 TinyBASIC に戻るには、「G」コマンドでホットスタートに戻ることができます

 
(2)入力ルーチン(INEEE)の変更と拡張
  (a) エコーバックの ON/OFF設定($1F16 初期値:ON) を追加
  (b) 英小文字の大文字変換(ON/OFF設定 $1F15 初期値:ON) を追加
  (c) RDR内のデータ有無チェックルーチンの追加($E19F) (BASICのブレークチェック用)
  (d) 8bitデータ入力ルーチンの追加($E1A4) (Binaryデータの受信用)
  これらの追加コードのスペース確保のため、 MTAPE1、MCL の移動、
  呼ばれることのないサブルーチン(SAV)を廃止 などを行いました

  コールドスタート時の ACIA データバッファの空読み処理を簡易なものにしました
  汎用の UARTでも初期化時にバッファに残っているデータを空読みしておく必要がありますので
  ACIAでも同様に空読みしてバッファをクリアしておきます

  初期化時の文字化けに付いて、テストを続けている内に得た感触からの推定ですが(あくまでも推定です)
  CPUクロックのパルス幅が足りないために、アクセスタイムが十分に取れないため
  ACIAを アクセスした時、ACIAからのデータが安定しない内に CPUが読み込んでしまう
  その根拠は
  (a) CPUクロックが速い(クロックのパルス幅が狭い)ほど文字化けしやすい
  (b) ACIAの A(1.5MHz)版 の方が B(2MHz)版 よりも文字化けしやすい
  (c) CPUが冷えている状態で電源ONすると文字化けしやすい
  などです

  使っている部品の内、メモリのアクセスタイムは十分に速いので
  アクセスタイムが問題になるのは CPU と ACIA くらいです
  今の所、HD63B50P と PIC12F1822(80MHz版)でクロックパルス幅を確保して正常に動いています

  その他ターミナルソフト(Tera Term)側の問題もある様です
  Disconnect / New connection や、Clear buffer 等で文字化けが解消する場合があります


その他の ROM化項目

(1)フロー制御サービスルーチン
  ACIAからの入力をバッファに蓄える処理を 割込みを使ってバックグラウンドで実行します
  サービスルーチンなので、アプリケーションプログラムからサブルーチンコールして利用します
  サービスルーチンの詳しい内容は こちら

(2)VTL
  今回は、VTLも ROM化しておきますが、MIKBUGに VTLを起動するコマンドは追加しません
  理由は VTLには MIKBUGに戻る機能が無いので行きっぱなしになり、リセットしか MIKBUG に戻れない事と
  (個人的な理由として)TinyBASICが有れば、VTLは使う機会が少ないと思われるためです
  VTL を実行する時は $1F48-$1F49 にスタート番地 $EC00 をセットして「G」コマンドで起動します





[1] アセンブラの準備

クロスアセンブラ(DOS版)
クロスアセンブラが DOS用プログラムなので WinXP以前か MS-DOS Playerが必要です

ノートパッドで、以下の1行を入れたバッチファイルを作っておいて
これをコマンドプロンプト(いわゆる DOS窓)から実行します(DOS窓に ドラグ&ドロップする)

msdos X6801 /H MIKBUG.ASM,MIKBUG.HEX,MIKBUG.LST;

最初の msdos は MS-DOS Player を実行する
2番目の X6801 は MS-DOS Player に渡す 引数で クロスアセンブラの プログラム名
3番目以降は X6801 に渡す 引数で
  /H インテルヘキサフォーマットで出力する (/H 無しは モトローラ Sフォーマット)
  (ROMライターは インテルヘキサが必要)
  MIKBUG.ASM は アセンブルするソースファイル
  MIKBUG.HEX は 翻訳されたコード(ヘキサフォーマット)
  MIKBUG.LST は リスティングファイル
  ; は これ以降の引数はデフォルト値を指定(その他の出力ファイルは出さない)

なお、パスの設定は面倒なので(分かる方は設定して下さい)
C:\ 直下に C:\DOS フォルダを作って、以下の物を入れておきます
  MSDOS.EXE    MS-DOS Player
  X6801.EXE    クロスアセンブラ(DOS版)
  A6801.TXT    アセンブラに必要なファイル(6803, 6303等のニューモニック?)
  MIKBUG.ASM   アセンブルするソースファイル
  MIKBUG.BAT   直ぐ上で説明したバッチファイル

バッチファイルをコマンドプロンプト(DOS窓)に ドラグ&ドロップする前に
チェンジディレクトリ(CD C:\DOS)で、カレントディレクトリを変更しておきます





[2] ソフトの準備と変更
MIKBUG.ASM
sbc6800_datapack にあるオリジナルの MIKBUG.ASM にプチ拡張を施します
(1)入力ルーチン(INEEE)の変更と拡張
  (a) エコーバックの ON/OFF設定($1F16 初期値:ON) を追加
  (b) 英小文字の大文字変換(ON/OFF設定 $1F15 初期値:ON) を追加
  (c) 8bitデータ入力ルーチンの追加($E1A4)
  これらの追加コードのスペース確保のため、 MTAPE1、MCL の移動、
  呼ばれることのないサブルーチン(SAV)の廃止 などを行いました

(2) 「T」コマンドの追加
  Tiny BASIC の起動は、$1F48-$1F49 にスタート番地をセットして RTI とします (G コマンドと同じ)

TB2KD.ASM (ソースが無いと簡単にはメモリロケーションを変えられません)
アセンブラソースは、bit誌 1978年8月(Vol.10,No.8) P52-P57 に掲載されたものです
打ち込むのが大変なので、OCRソフトでテキストに落としました
雑誌の少ないページに詰め込むために縮小版で掲載されたもので、拡大やコントラスト処理など工夫しましたが、
変換率が悪くて、かなり修正しています(解像度が悪くオリジナルを見ても判読が困難な部分が有ります)
使っている活字の関係で Oと0、 1とIとl、 BとEと8と3 等が誤変換されました

ACIA版 MIKBUG互換モニタ 対応への修正箇所
(1) BREAK ルーチン 直接 PIAの DATAレジスタをチェック ---> ACIAの ACIACSをチェックに変更

(2) 実装メモリを確認するためのメモリの読み書きテスト部分が MIKBUGのワークエリアを
   壊してしまいますので読み書きテストをやめて、BASIC ソースの格納エリアを直接設定します
   開始番地(RAMSSS EQU $0100)と、最終番地(RAMEEE EQU $1EFF)を設定した

(3) テレタイプの CR/LF時に必要なパディングキャラクタ($FF)を外す
   文字列の最後のターミネータ($00)の位置を変えるだけです

(4) コード部分を ORG $E300 とします2018/04/26

(5) MIKBUG互換モニタ用にスタックの設定を変更します(2箇所)
    STACK  $1F47 ($A047)、  SUBSTK $1F80 ($A080)

なお (1)〜(3)の変更は、オリジナルのコード配置が変わらない様にしておいた方が無難でしょう
メモリが足りなければ、最終番地の後に飛ばして追加、余れば NOPで埋めておきます

VTL.ASM
sbc6800_datapack にあるオリジナルの VTL.ASM に変更を施します
(1) RESET ENTRY 以降をコメントアウトしておきます(MIKBUG から起動する前提なので不要)
(2) コード部分を ORG $EC00 とします



それぞれアセンブルして、出来た ヘキサファイルをマージしておきます
これを、 ROMライターで読み込んで ROMに書き込みます

プログラム名 開始終了容量備考
MIKBUG互換モニタMIKBUG.ASM$E000・・・(494)PIA版 ---> ACIA版
  (MIKBUG)プチ拡張 ・・・$E1FF(512)オリジナルサイズ以下の範囲で拡張
FLCTSR(フロー制御SR)FLCTSR.ASM$E200$E29B156フロー制御サービスルーチン(割込)
Tiny BASIC(電大版)TB2KD.ASM$E300$EB492,128(FLCTSR 追加により 開始番地変更)
VTLVTL.ASM$EC00$EF1F800 
ROMデータ(2764以上用)ROM.HEX$E000$FFFF(4,096)2764、27128、27256、27512
データパック(MIKTBV.ZIP) ダウンロードページソース & ROMデータ2018/05/01

ROM.HEX には、$EFF8-$EFFF と $FFF8-$FFFF の 2行のベクタデータが入っています
2732に 書込む場合は最終行の ベクタデータ($FFF8-$FFFF) を削除します






[3] UV-EPROM の消去と書込
Eraser(消去器) 殺菌灯ですROM Writer(書込み器) 中華の安物です
UV-EPROM の消去には 殺菌灯を使います(2千円位の予算でおつりが来ます)
4W型殺菌灯 と 4W型照明器具 ホームセンターで買えますが、無ければ Amazon等で調達します

ROM ライターに取り付けて消去時間を測ってみましたが、意外に早く消えます
写真の様に殺菌灯に ROMのガラス窓側を向けて接触する様においています

手元の 2732A は、約30秒位から消え始めて約35秒でブランクチェックをパスしました
実際には、その 2〜3倍位の時間、紫外線を当てれば良いでしょう

この照明器具は樹脂製なので、樹脂の劣化を防ぐためと、紫外線を有効に ROM に当てるため
反射用にアルミ箔を殺菌灯管の背中側に設置しました
当然ですが、紫外線が直接目に当たらない様に、点灯中はカバーをかけておきます
紫外線によるオゾンの発生(オゾン臭)がありますので、気になる方は換気をして下さい


UV-EPROM の書込みには中華製の安物のライター TL866CS を使います(4千円位の予算でおつりが来ます)
[2018/06/12 記] 2018/01 頃は 4千円を切っていましたが、最近は 4千円を少し超えている様です
         TL866CS 以外にも TL866A 、TL866II Plus なども出ている様です

昔はライターが高価でしたが、最近は安いライターが手に入るので、自分で作る意欲が無くなりました
特に難しい操作は無く、読み込むときのファイルのスタートアドレスの指定を間違えない様にする位です
マージしたインテルHEXファイルを開く読込時のオフセット値を指定する

ここでは $E000 番地のプログラムを ROM の
$0000 番地に書込む様にロードする
書込みデータをライターのバッファにセットしたら、後は書込みを実行します
書込み時の電圧設定は、ROMの種類により異なりますので、データシートでよく確認してください


[3-2] EEPROM の消去と書込 (目次下の画像でガラス窓が無いパッケージのもの)
通販サイトで EEPROM(W27C512-45Z ) と UV-EPROM(AM27C256-150D) を購入してみました
同時に注文しましたので両者の価格差と、到着までの日数は、発送方法によると思われます
注文後、業者の発送までにどちらも 6〜7日かかっているので、郵送の日数は 8〜21日くらいです

タイプ型番容量数量価格単価納期 備考 (配送方法)
UV-EPROMAM27C256-150D32kB10個944円95円14日 China Post Registered Air Mail
E-EPROMW27C512-45Z64kB5個321円64円28日 China Post Ordinary Small Packet Plus

EEPROM(電気消去型) の良い所は、文字通り電気的に消去できるので、ライターだけで消去・書込みできる点です
UV-EPROM(紫外線消去型)では消去時間は約40秒(以上)ですが、EEPROMでは数秒で消去されます
今回入手したものは 64kByteなので、読込時のオフセット値は 0x0000です(設定画面のデフォルト値のまま)




[3-3] ROM容量別の読込オフセット (ROMのアドレスを $E000-$FFFFに後ろ寄せで配置した場合です)
プログラム(MIKBUG他)のアドレス:$E000-$FFFF の場合、 ROM容量毎の読込時のオフセット値は、以下の通りです

 タイプ容量 読込オフセト ROM内番地 ベクタアドレス 備 考
2716型2kB  0xE000 $0000-$07FF $7FF8-$7FFF ベクタは $FFF8-$FFFF にも現れる
2732型4kB  0xE000 $0000-$0FFF $EFF8-$EFFF ベクタは $FFF8-$FFFF にも現れる
2764型8kB  0xE000 $0000-$1FFF $FFF8-$FFFF
27128型16kB  0xC000 $2000-$3FFF $FFF8-$FFFF ROM内番地 $0000-$1FFF は無効
27256型32kB  0x8000 $6000-$7FFF $FFF8-$FFFF ROM内番地 $0000-$5FFF は無効
27512型64kB  0x0000 $E000-$FFFF $FFF8-$FFFF ROM内番地 $0000-$DFFF は無効

ROM内番地:  ライターで読み込んだ後、この番地に読み込めているか確認する
ベクタアドレス:プログラムをアセンブルする時、ベクタアドレスをこの番地に設定する(2732型以下は要注意




[4] デバッグの方法 【書きかけの項目】
不具合が有った場合、ROMではデバッグ出来ないので RAM上にロードするバージョンを作成します
この場合、 ROM上の $E000-$E1FF を RAM上に変更してアセンブル(モトローラ Sフォーマットで)します
ロード番地を変えるのは、コードの先頭の ORG $E000 を変えます(例えば ORG $1D00)
新しい MIKBUGをデバッグする場合は、ワークエリアの場所も変えておきます(例えば VAR EQU $1F80)
動作確認できたら、ROMのアドレスに戻してアセンブルします(ライタ用にインテルヘキサで)




[5] 動作確認 【書きかけの項目】
TinyBASIC 電大版 の実行時のターミナル画面
TinyBASIC を ROM 化した効果として、BASIC ソースの格納エリアが 7678 Byte に広がりました

VTL の実行時のターミナル画面






[6] 今後の課題
ターミナルに対するフロー制御

MIKBUG ではターミナルとの通信を 38400bps にしても、ロードコマンドでデータを取りこぼす事は有りませんが
TinyBASIC では、1行入力毎に BASIC のプログラムの処理に時間がかかり、データを取りこぼします

実験の結果 Traminal delay に 0 msec/char 50 msec/line の設定が、両者の妥協点です
MIKBUG でのロードコマンドの速度もそれほど遅くならず、TinyBASIC でのデータの取りこぼしも有りません
ターミナルディレイ 50 msec/line の設定ドラグ&ドロップで Send file している様子
Traminal delay 50 msec/line の設定では、MIKBUG でのロードコマンドで、やや時間がかかってしまいます
MIKBUG と TinyBASIC で毎回、設定を変えるのはとても面倒です
これを防ぎ、最も効率よくデータを送受信するには、フロー制御が不可欠です
せっかく ACIA を使って、RTS CTS を接続しているのですから、フロー制御に挑戦してみたいと思います


フロー制御サービスルーチンを作ってみた ... 詳しくは こちら 追記:2018/04/25








inserted by FC2 system