| | | |
[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 | $E1DD | 478 | | PIA ---> ACIA 版 | |
(MIKBUG)プチ拡張 | ・・・ | $E1FF | (512 | ) | オリジナルサイズ以下の範囲で拡張 | |
FLCTSR(フロー制御SR) | $E200 | $E29B | 156 | | フロー制御サービスルーチン(割込) | 2018/04/26 |
Tiny BASIC(電大版) | $E300 | $EB49 | 2,128 | | (FLCTSR 追加により 開始番地変更) | 2018/04/26 |
VTL | $EC00 | $EF1F | 800 | | | |
VECTOR | $EFF8 | $EFFF | 8 | | イメージは $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」コマンドで起動します
|
| | | |
[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 | $E29B | 156 | | フロー制御サービスルーチン(割込) | |
Tiny BASIC(電大版) | TB2KD.ASM | $E300 | $EB49 | 2,128 | | (FLCTSR 追加により 開始番地変更) | |
VTL | VTL.ASM | $EC00 | $EF1F | 800 | | | |
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の種類により異なりますので、データシートでよく確認してください
|
|
| |
|