SS-BLOGの2025年3月末でのサービス終了に伴い
本ブログは https://piclabo.seesaa.net へ移行します |
ポケコン(G850)用拡張ボード(EborsyEEP)でCP/M(その10)エスケープシーケンス対応 [ポケコン]
今回開発した PC-G850V(以降ポケコンと記す)で CP/M を動かすことが出来る増設メモリボード(EborsyEEP)をBOOTHで頒布した際の反応等からフルキーを実装した手のひらサイズの Z80 コンピュータであるポケコンの魅力を改めて痛感しました。
しかし、現状のままでは CP/M は動くものの結局はパソコンに接続しないと使い辛い状況であると言わざるを得ません。
ポケコン単体では使い辛いと感じる主要な原因の一つとして「手軽に使えるエディタが無い」ということがあると思います。OS を CUI ベースで使うとなると最低限、スクリーンエディタが必要ですよね。
そこで次の改善を行うことにしました。
上記の対応でポケコン単体での CP/M の使い勝手がかなり改善されたのではないかと思います。実際に実装した機能について以下に簡単にまとめます。
参考として Turbo Pascal 3.0 の TINST でのスクリーン設定例を貼っておきます。一度設定した項目は対応無しに戻せないようなので、最初に「None of above」を選択して必要な項目のみ設定しました。下記は一度設定後に設定内容確認のために設定画面を開いた際の画面です。Highlight command は LCD 表示で見易いように逆に設定しています。
上記の説明に対応した評価版の GOCPM.HEX 及び SKE.COM を下記のリンクからダウンロードできます。
Twitter(X)に投稿した動画付きメッセージを貼っておきます。
展開先のアドレスはディフォルトでは GAME言語のソース格納領域のディフォルト値である 0x8e00 に展開します。/Aオプションで展開先のメモリアドレスを指定できます。
ディフォルトのアドレスに展開した場合、GAMEインタープリタがコールドスタートした時点でソースの先頭が 0xff に書き換えられるので下に示す操作例のようにおまじないが必要です。
展開先アドレスを指定した場合は次のような操作になります。
下記からダウンロードできます。
指定したファイル名に拡張子が無い場合、.GAM に自動設定するようにしました。
また、同類ソフトのセーブコマンドである gsave も作成しました。GAME インタープリタを終了(>=0 実行)した後に gsave FileName を実行することでメモリ上の GAME ソースをファイルにセーブできます。
下記から gload と gsave をダウンロードできます。
下記からダウンロードできます。
[TOP] [ 前へ ] 連載記事一覧 [ 次へ ]
しかし、現状のままでは CP/M は動くものの結局はパソコンに接続しないと使い辛い状況であると言わざるを得ません。
ポケコン単体では使い辛いと感じる主要な原因の一つとして「手軽に使えるエディタが無い」ということがあると思います。OS を CUI ベースで使うとなると最低限、スクリーンエディタが必要ですよね。
そこで次の改善を行うことにしました。
- エスケープシーケンス対応
現状の仮想スクリーン(80x25)ではスクリーンエディタを動かせないのでエスケープシーケンスに対応することにします。「ポケコン(G850)用拡張ボード(EborsyEEP)でCP/M(その3)CP/M起動」の記事でも少し書きましたが、現状の仮想スクリーンの機能はスクリーンエディタの仮想的なスクリーンと競合してしまい、相性が 悪いのでエディタの方を LCD 画面サイズに対応するようにしました。
- ポケコン用スクリーンエディタの準備
今回実装したエスケープシーケンスを使えば、Turbo Pascal の柔軟にカスタマイズできるエディタも使えるのですが、タブ表示に対応していなかったり、エディタ以外の機能は使わないようなユースケースも想定し、自作のエディタである SKED もポケコン対応することにしました。
- コントロールコードの入力対応
スクリーンエディタを使うためにはキーボードからコントロールコードを入力できることが必要です。
上記の対応でポケコン単体での CP/M の使い勝手がかなり改善されたのではないかと思います。実際に実装した機能について以下に簡単にまとめます。
- エスケープシーケンス機能
下記の最小限の機能を実装しました。
No. function character code memo 1 move cursor Esc[(y+1);(x+1)H move cursor to (x,y) position 2 clear screen Esc[2J cursor doesn't move to home 3 erase line Esc[0J erase line from cursor to end of line 4 delete line Esc[K delete cursor line 5 set reverse Esc[7m set character attribute to reverse 6 reset reverse Esc[0m set character attribute to normal 7 scroll up Esc[S scroll up all lines on screen 8 scroll down Esc[T scroll down all lines on screen
尚、現状ではカーソル位置の文字がカーソルで上書きされて表示されない状態ですがプライオリティを下げて対応予定です。
★追記 2023/11/05
対処した GOCPM の評価版を公開しました。
- スクリーンエディタ
CP/M に対応した自作スクリーンエディタである sked をポケコンの LCD 画面に対応しました。名前も入力し易いように ske に短縮します。
SHIFT J でヘルプが表示されます(LCD 画面範囲より大きいサイズなのでカーソルキーを操作して見てください)。
参考として TeraTerm での sked のヘルプ表示画面が下図になります。
sked for CP/M-80 の操作コマンド
- コントロールコード入力機能
shift キーをコントロールキーとして扱い、記号の入力は全て「2ndF」キーを使用して入力することにしました。ESC は「SHIFT TAB」で、DEL は「SHIFT BS」で入力できます。
また、下記の記号の入力を追加しました。
- ^ : 2ndF 4
- ~ : 2ndF 5
参考として Turbo Pascal 3.0 の TINST でのスクリーン設定例を貼っておきます。一度設定した項目は対応無しに戻せないようなので、最初に「None of above」を選択して必要な項目のみ設定しました。下記は一度設定後に設定内容確認のために設定画面を開いた際の画面です。Highlight command は LCD 表示で見易いように逆に設定しています。
Turbo Pascal 3.0 の tinst での設定例 |
![]() |
上記の説明に対応した評価版の GOCPM.HEX 及び SKE.COM を下記のリンクからダウンロードできます。
Twitter(X)に投稿した動画付きメッセージを貼っておきます。
ポケコン(PC-G850V)でCP/Mを動かせる増設メモリボードでLCD表示をエスケープシーケンスに対応しました
— skyriver (@wcinp) October 27, 2023
自作エディタもLCD上で動作します(skedをskeと名称短縮)
柔軟に設定可能なTurboPascalのエディタも使えます
評価版を下記urlからダウンロード可能ですhttps://t.co/TE6UdWwntD#EborsyEEP pic.twitter.com/nkx1WGmYg3
★追記 2023/10/28
パソコンを端末にして使っている時は GAME 言語のソースをコピペできましたが、ポケコンを単独で使用する時はソースをコピペできなくなるので困ってしまいます(GAME 言語の使用頻度は結構多めです^^)
そこで GAME 言語のソースファイルをメモリ上に展開するツールを作ってみました。ソース修正時はエディタが使えるので GAME 言語のエディタよりも便利です。
パソコンを端末にして使っている時は GAME 言語のソースをコピペできましたが、ポケコンを単独で使用する時はソースをコピペできなくなるので困ってしまいます(GAME 言語の使用頻度は結構多めです^^)
そこで GAME 言語のソースファイルをメモリ上に展開するツールを作ってみました。ソース修正時はエディタが使えるので GAME 言語のエディタよりも便利です。
展開先のアドレスはディフォルトでは GAME言語のソース格納領域のディフォルト値である 0x8e00 に展開します。/Aオプションで展開先のメモリアドレスを指定できます。
ディフォルトのアドレスに展開した場合、GAMEインタープリタがコールドスタートした時点でソースの先頭が 0xff に書き換えられるので下に示す操作例のようにおまじないが必要です。
D>GLOAD load GAME source into TPA Ver0.01 2023/10/28 by skyriver usage; : gload [/axxxx] FileName xxxx : load; address(defalut:8E00) D>GLOAD SAMPLE.GAM SAMOLE.GAM 8E00-8E23 D>GAMEC GAME80 for CP/M-80(compiler 0200-1B38) Ver0.03 *READY :A== A:0)=0 == *READY : |
---|
展開先アドレスを指定した場合は次のような操作になります。
D>GLOAD /A4000 SAMPLE.GAM SAMOLE.GAM 4000-4023 D>GAMEC GAME80 for CP/M-80(compiler 0200-1B38) Ver0.03 *READY :=$4000 == *READY : |
---|
下記からダウンロードできます。
★追記 2023/10/29
上記の GLOAD コマンドはロード時間がアッと言うまでパソコンを端末にしている時でさえ使いたくなりますね(コピペする場合はウェイト時間の設定変更等、少々面倒だった)
上記の GLOAD コマンドはロード時間がアッと言うまでパソコンを端末にしている時でさえ使いたくなりますね(コピペする場合はウェイト時間の設定変更等、少々面倒だった)
指定したファイル名に拡張子が無い場合、.GAM に自動設定するようにしました。
また、同類ソフトのセーブコマンドである gsave も作成しました。GAME インタープリタを終了(>=0 実行)した後に gsave FileName を実行することでメモリ上の GAME ソースをファイルにセーブできます。
下記から gload と gsave をダウンロードできます。
★追記 2023/10/30
GLOAD 実行後のおまじないが面倒なので GAMEC を起動する際に何かしらのアーギュメントを付けた場合、ホットスタートで起動するように GAMEC.COM を変更しました。
GLOAD 実行後のおまじないが面倒なので GAMEC を起動する際に何かしらのアーギュメントを付けた場合、ホットスタートで起動するように GAMEC.COM を変更しました。
下記からダウンロードできます。
GameOnCpm80_20231030_004.zip- ※2023/11/01変更 キーセンスの間引き処理廃止
GAME言語のソース表示中にスペースキーで一時停止できない問題があり、GOCPMの5926Hを 3FH⇒07H に変更することで一時停止できるようになります。
GameOnCpm80_20231101_004a.zip
★追記 2023/11/02
CP/M-80 用 GAME インタープリタ&コンパイラの GAMEC.COM にソースファイルのロード(¥<FileName)/セーブ(¥>FileName)機能を実装しました。
ポケコン(PC-G850V)のCP/Mでもソースのロード/セーブがメチャ楽になりました^^
「3チップ構成Pic24CPMマイコン(その7)GAMEコンパイラ」の記事からダウンロードできます。
CP/M-80 用 GAME インタープリタ&コンパイラの GAMEC.COM にソースファイルのロード(¥<FileName)/セーブ(¥>FileName)機能を実装しました。
ポケコン(PC-G850V)のCP/Mでもソースのロード/セーブがメチャ楽になりました^^
「3チップ構成Pic24CPMマイコン(その7)GAMEコンパイラ」の記事からダウンロードできます。
★追記 2023/11/06
キー入力せずに放置すると10分程度でスペースコードが入力されてしまう問題に対処
原因は ROM 内キー入力処理(0BCFDH)でリセット直後に単独で実行し同問題が再現
キー入力は 0BE53H を使用するように変更し、カーソルブリンク機能も追加
キー入力せずに放置すると10分程度でスペースコードが入力されてしまう問題に対処
原因は ROM 内キー入力処理(0BCFDH)でリセット直後に単独で実行し同問題が再現
キー入力は 0BE53H を使用するように変更し、カーソルブリンク機能も追加
★追記 2023/11/12
BOOTH でダウンロードできる EborsyEEP_V103.zip では上記のアップデートを全て反映しています。
BOOTH でダウンロードできる EborsyEEP_V103.zip では上記のアップデートを全て反映しています。
[TOP] [ 前へ ] 連載記事一覧 [ 次へ ]
リアルタイムモニタ(ZealMon)の製作(その2)セマフォの実装 [Z80]
前回の記事でライトウェイトである程度高速なリアルタイムモニタ/リアルタイムOS(以降、モニタと記す)の製作について書きましたが、今回はこれにセマフォ管理機能を追加したので記録して置きたいと思います。
前回の記事でも書いたように今回制作したモニタの特徴の一つとしてタスクの状態の情報をTCB(タスクコントロールブロック)には持たずにキューで管理することでTCBの更新箇所を最小限にするというのがあります。今回追加するセマフォ機能もこのコンセプトを継承します。
セマフォは Wikipedia にも書いてあるようにカウンティングセマフォとバイナリセマフォがあります。今回は汎用性の高いカウンティングセマフォを実装することにします。
セマフォ管理データは一つのセマフォに付き2バイトで初期値を管理対象のリソース数とします。
セマフォの操作は次のようにしました。
実装はメチャ簡単そうですね。それでは実際にセマフォ機能を使ったデモを作ってみましょう(デモ作りの方が遥かに大変でした)。
今回のデモは前回と同様にネット上で公開されているブラウザで動作するMSX環境のMSXPenを使ってGAME言語インタープリタを同時に二つ動かしてみます。
以前CP/Mに移植したGAME言語のインタープリタ&コンパイラをGAMECとして公開しましたが、今回はコンカレントなGAME言語インタープリタなのでCGAMEですw
画面表示制御は高速化のためVDPを直に制御しています。TEXT2(80字モード)の画面での実行を前提にしているので実行前に mode 80 のコマンドで80文字モードにしています。
「コントロールA」の操作でキー所有のタスクが変わります。キーの所有管理は上記のセマフォで行っています。
今回作成したデモソフトを下記のリンクからダウンロードできます。
Twitter(X)に投稿した動画付きメッセージを貼っておきます。
★追記 2023/10/15
上記の動画の動作について若干補足します。
[TOP] [ 前へ ] 連載記事一覧 [ 次へ ]
前回の記事でも書いたように今回制作したモニタの特徴の一つとしてタスクの状態の情報をTCB(タスクコントロールブロック)には持たずにキューで管理することでTCBの更新箇所を最小限にするというのがあります。今回追加するセマフォ機能もこのコンセプトを継承します。
セマフォは Wikipedia にも書いてあるようにカウンティングセマフォとバイナリセマフォがあります。今回は汎用性の高いカウンティングセマフォを実装することにします。
セマフォ管理データは一つのセマフォに付き2バイトで初期値を管理対象のリソース数とします。
セマフォ管理データの構造 |
![]() |
セマフォの操作は次のようにしました。
- セマフォの獲得(P操作)
セマフォ管理データの上位バイトがゼロ※1で下位バイトが1以上の場合は使用可能なリソースが残っていることを示し、リソース確保のためにこの値をディクリメントします。
上記以外の場合はセマフォ管理データを待ちキューとして使い、セマフォを要求したタスクのTCBをリンクに追加し、ウェイト状態として扱います。
※1 TCBの上位アドレスは零ではない前提を利用した管理方法です
- セマフォの解放(V操作)
セマフォ管理データのキューにTCBがある場合(上位バイトがゼロではない場合)は末尾のTCBをキューから外してレディーキューに追加します。セマフォのキューが空になった時はポインタが NULL(=ゼロ)になるのでカウントデータとしてシームレスに使用できます。
セマフォのキューにTCBが無い場合はセマフォー管理データをカウンタとして使用し、インクリメントします。
実装はメチャ簡単そうですね。それでは実際にセマフォ機能を使ったデモを作ってみましょう(デモ作りの方が遥かに大変でした)。
今回のデモは前回と同様にネット上で公開されているブラウザで動作するMSX環境のMSXPenを使ってGAME言語インタープリタを同時に二つ動かしてみます。
以前CP/Mに移植したGAME言語のインタープリタ&コンパイラをGAMECとして公開しましたが、今回はコンカレントなGAME言語インタープリタなのでCGAMEですw
画面表示制御は高速化のためVDPを直に制御しています。TEXT2(80字モード)の画面での実行を前提にしているので実行前に mode 80 のコマンドで80文字モードにしています。
「コントロールA」の操作でキー所有のタスクが変わります。キーの所有管理は上記のセマフォで行っています。
コンカレントGAMEインタープリタ動作中の様子 |
![]() |
今回作成したデモソフトを下記のリンクからダウンロードできます。
Twitter(X)に投稿した動画付きメッセージを貼っておきます。
先日作成のZ80用リアルタイムモニタにセマフォを追加しました
— skyriver (@wcinp) October 13, 2023
前回同様MSXPen上で動くデモを作成しました
GAME言語を二つ同時に動かしてみました^^
CPUが一つなので片方の表示を止めるともう一方が速くなります
詳細は下記URLを参照https://t.co/GkkczEnVIk#RealTimeMonitor #ZealMon #Z80 #MSXPen https://t.co/9pZGOttzus pic.twitter.com/JzJugqqfyq
★追記 2023/10/15
上記の動画の動作について若干補足します。
- 連続表示中にキー資源の所有を失うと少し速くなる理由
連続表示中にも常にキーセンスをしていてキー資源を所有している場合は BIOS のキーセンス処理をコールしますが、キー資源を所有していない場合は実際のキーセンス処置を呼ばずにキー入力無しと判断するようにしているためです(つまりキーセンス処理が軽くなるので速くなる)。
- 連続表示中にもう一方のタスクがキー入力状態になると表示が速くなる理由
キー入力処理ではキーセンス後、キー入力が無い場合、タイマー待ち状態になり、タイムアウト後に再度キーセンスをコールする処理を繰り返しています。このためタスクは多くの時間タイマー待ち状態で止まっていて CPU 資源を殆ど消費しないためです。
[TOP] [ 前へ ] 連載記事一覧 [ 次へ ]
リアルタイムモニタ(ZealMon)の製作 [Z80]
Twitter(X)のタイムラインで Z80 のスタックを使ったタスク管理の話題(スタック上にタスクアドレスを並べて順次呼び出すもの)を見てリアルタイムモニタ(リアルタイムOS)を作ってみたくなりました。
リアルタイムOSに関してはネット上にも多くの情報があり、例えばここや "リアルタイム処理の基礎知識" 等に簡潔にまとめられています。
とは言ってもあまり本格的なものではなく、ライトウェイトである程度高速なものを作りたいと思います。今回作成した Z80 用のリアルタイムモニタ(以降、ZealMon と記す)の特徴を列挙すると
イベント管理、セマフォ、タスク間のメッセージ管理などの機能はまだありませんが、タイマー管理と同様にすることで追加実装は割合楽だと思います。
タスクコントロールブロック(TCB)の構造は下記のようにしました。
最近動かしている手持ちの Z80 ボードではタイマー割込みを自由に設定できるものが無かったのでネット上で公開されている MSX のエミュレータである MSXPen で試すことにしました。
周期割込みとして MSX の垂直帰線割り込み(1/60秒周期)を使用します。割込みモードは mode1(RST 38H 実行) です。
リアルタイムモニタが動作中の時は割込みでタスク切替が発生しているのでディバッガでブレークしてもディバッガ自身がブレークしたタスクと同じタスクの扱いになり、他のタスクが文字表示等のシステムコールをしている場合、リエントラントにコールすることになるので直ぐにハングしてしまいます。
結局ディバッガはあまり役に立たずに机上ディバッグ(若しくは割込み機能を停止した上のでブレーク確認)がメインになります。仕事であればICEが使えるのですが、個人としてはそんな高価なものは持っていません。
下図は MSXPen でデモプログラムを実行した際の画面です。
表示が競合し易くなるように1文字表示毎にタイマーウェイトを入れています。
下図はディスパッチが最初に実行される直前とタスク3が実行開始した時点でのワークエリアのダンプ表示です。割込みの影響を無くすため、フックした新たな割込み処理の先頭をリターンコードに書き換えています。
画面中央のダンプ情報からディスパッチ前はタスク1~3がプライオリティ 0 のレディキューにつながっているのが判ります。タスク0は前述のアイドルタスクでプライオリティ3のレディキューにつながっています。下側のダンプはタスク3実行開始時のメモリで実行タスク番号が3でタイマーウェイトキューにタスク1とタスク2が繋がっています。
まだ最適化はしていませんが、ソースも貼っておきます。無いとは思いますが今後、Z80 でリアルタイム制御したい場合に役に立つかもしれませんw
Twitter(X)に投稿した動画付きメッセージを貼っておきます。
本確認で実施した割込み試験プログラムのリストを下記に示します。割込みが入った場合、リターンアドレスとコール元のコードを保存するようにしました。
★追記 2023/10/06
上記の様にシステムコール内で割込み許可していることが判ったので、システムコール時は割込みは許可状態のままにしてタスクをディスパッチしない様にしてみました(システムコール毎のタイマーウェイトを無くし、ラウンドロビンコールを追加)。
その結果、下図のように表示が競合する場合には互いに1文字ずつ表示するようになりました。割込み処理の空振りが無いのでタイマー管理も正確になったはずです。
MSX-DOS 上で GAME 言語を使って BIOS 内の EI(0FBH)を検索した結果を貼っておきます。38H の割込みのエントリーが 0DDA9H なので割込み処理も含まれているのでしょうが結構あるものですね。
ざっと見た感じ、最後の二つは相対ジャンプのオフセット値ですが、他は EI 命令のコードのようですね。
[TOP] [ 前へ ] 連載記事一覧 [ 次へ ]
リアルタイムOSに関してはネット上にも多くの情報があり、例えばここや "リアルタイム処理の基礎知識" 等に簡潔にまとめられています。
とは言ってもあまり本格的なものではなく、ライトウェイトである程度高速なものを作りたいと思います。今回作成した Z80 用のリアルタイムモニタ(以降、ZealMon と記す)の特徴を列挙すると
- 実装機能は必要最小限
- 実行中のタスクの中断(プリエンプト)可能
- タイマーウェイト機能
- プライオリティは4レベル(拡張は容易)
- ラウンドロビンタスク切替え要求機能
- ライトウェイト
モニタ本体のコードは約 300 バイト
- タスクの状態遷移はキューで管理
TCB(タスクコントロールブロック)内にタスク状態情報を持たず状態書換え処理を省略し軽量化
- アイドルタスクの実装省略
最低プライオリティでウェイト状態にならないタスクを持ついことで、レディ状態のタスクが無い時に実行するアイドルタスクの実装を省きました。番兵的な発想ですね。
イベント管理、セマフォ、タスク間のメッセージ管理などの機能はまだありませんが、タイマー管理と同様にすることで追加実装は割合楽だと思います。
タスクコントロールブロック(TCB)の構造は下記のようにしました。
name | offset | bytes | mearn |
---|---|---|---|
TcList | 0 | 2 | address for TCB link |
TcTskNo | 2 | 1 | high nibble:priority(0:highest) low nibble:task No. |
TcTim | 3 | 1 | timer count |
TcEvCnt | 4 | 1 | how many waiting event except timer |
TcSP | 5 | 2 | stack pointer save area |
TcStat | 7 | 1 | task status !! not used !! |
最近動かしている手持ちの Z80 ボードではタイマー割込みを自由に設定できるものが無かったのでネット上で公開されている MSX のエミュレータである MSXPen で試すことにしました。
周期割込みとして MSX の垂直帰線割り込み(1/60秒周期)を使用します。割込みモードは mode1(RST 38H 実行) です。
リアルタイムモニタが動作中の時は割込みでタスク切替が発生しているのでディバッガでブレークしてもディバッガ自身がブレークしたタスクと同じタスクの扱いになり、他のタスクが文字表示等のシステムコールをしている場合、リエントラントにコールすることになるので直ぐにハングしてしまいます。
結局ディバッガはあまり役に立たずに机上ディバッグ(若しくは割込み機能を停止した上のでブレーク確認)がメインになります。仕事であればICEが使えるのですが、個人としてはそんな高価なものは持っていません。
MSXPen 上では動作が中々安定せず悩みましたが、割込み禁止(DI)中でも割込みが入るらしく、DI と共に 38H をリターンコードに書き換えるようにしたら安定して動作するようになりました。※1
※1)原因判明(2023/10/05 の追記部分を参照)下図は MSXPen でデモプログラムを実行した際の画面です。
表示が競合し易くなるように1文字表示毎にタイマーウェイトを入れています。
MSXPen でデモプログラム実行時の様子 |
![]() |
下図はディスパッチが最初に実行される直前とタスク3が実行開始した時点でのワークエリアのダンプ表示です。割込みの影響を無くすため、フックした新たな割込み処理の先頭をリターンコードに書き換えています。
画面中央のダンプ情報からディスパッチ前はタスク1~3がプライオリティ 0 のレディキューにつながっているのが判ります。タスク0は前述のアイドルタスクでプライオリティ3のレディキューにつながっています。下側のダンプはタスク3実行開始時のメモリで実行タスク番号が3でタイマーウェイトキューにタスク1とタスク2が繋がっています。
ZealMon 実行時のメモリ状態 |
![]() |
まだ最適化はしていませんが、ソースも貼っておきます。無いとは思いますが今後、Z80 でリアルタイム制御したい場合に役に立つかもしれませんw
リアルタイムモニタ(ZealMon)とデモのソース(Z80アセンブラ) |
|
Twitter(X)に投稿した動画付きメッセージを貼っておきます。
タイムラインでZ80のスタックを使ったタスク管理の話題を見かけリアルタイムモニタを作ってみたくなりました
— skyriver (@wcinp) October 3, 2023
必要最小限の機能の実装ですがデモをMSXPenで動かしてみました
詳細は下記urlを参照して下さいhttps://t.co/mB0lGvejzS#ZealMon #Z80 #RealTimeMonitor pic.twitter.com/1gC0Ji3ZHg
★追記 2023/10/05
上記の DI 中に割込みが入っている現象の原因が判りました。
下記の割込みテストプログラムで確認した結果が下の画面です。繰り返し行っても同様の結果でした。BIOS の1文字表示処理の ROM 内のコードで EI を実施しているため、割込みが入っているようです。
上記の DI 中に割込みが入っている現象の原因が判りました。
下記の割込みテストプログラムで確認した結果が下の画面です。繰り返し行っても同様の結果でした。BIOS の1文字表示処理の ROM 内のコードで EI を実施しているため、割込みが入っているようです。
割込み試験実施結果 |
![]() |
本確認で実施した割込み試験プログラムのリストを下記に示します。割込みが入った場合、リターンアドレスとコール元のコードを保存するようにしました。
割込み試験プログラムのソース(Z80アセンブラ) |
|
★追記 2023/10/06
上記の様にシステムコール内で割込み許可していることが判ったので、システムコール時は割込みは許可状態のままにしてタスクをディスパッチしない様にしてみました(システムコール毎のタイマーウェイトを無くし、ラウンドロビンコールを追加)。
その結果、下図のように表示が競合する場合には互いに1文字ずつ表示するようになりました。割込み処理の空振りが無いのでタイマー管理も正確になったはずです。
割込み対処後のデモ画面例 |
![]() |
MSX-DOS 上で GAME 言語を使って BIOS 内の EI(0FBH)を検索した結果を貼っておきます。38H の割込みのエントリーが 0DDA9H なので割込み処理も含まれているのでしょうが結構あるものですね。
ざっと見た感じ、最後の二つは相対ジャンプのオフセット値ですが、他は EI 命令のコードのようですね。
MSX-DOS BIOS 内の 0FBH コードのサーチ結果 |
![]() |
[TOP] [ 前へ ] 連載記事一覧 [ 次へ ]
電子メモパッドのペン作成 [3D_printer]
思い付いたことを直ぐにメモできるように普段から手元にメモ用紙を置くようにしています。数か月前にダイソーで電子メモパッド(以降、メモパッドと記す)を見つけたので購入してみました。細かい文字は書き辛いですが中々便利でメモ用紙の消費が少なくなりました。
先程、このメモパッドのペンが行方不明になり部屋の中の何処かにあるはずなのに中々見つかりません。
探している時は「そういえばペンを本体に繋げるように穴が開いていたなぁ」と思いましたが、いざ見つかってみると紐が邪魔になりそうで繋ぐ気にはなれません。
そこで例え紛失しても困らないように3Dプリンタで作ってみました。そのまま似せて作るのもなんなのでちょっとアレンジしてみました。
このメモパッドは 500 円で電気的に消去できます(部分的な消去や書換えは不可)。
下の写真の上側が今回作成したペンです。手で持つ部分が六角なので手に馴染みます。こんなものがすぐ作れるなんて便利な世の中になったものです。
DesignSpakMechanical で作成していますが、二つのパーツが結合エラーになる状態で STL ファイル化したためか読込み時にエラーが出るかもしれませんが私の環境では出力できました。
下記からSTLファイルをダウンロードできます。商用利用以外であれば使用可能とします。
[改版履歴]
★Ver0.03 20223/10/01
STLファイルを修正し、読込み時にエラーが出なくなった
★Ver0.05 2023/10/05
若干変更(サポート材最小化にも対応)
先程、このメモパッドのペンが行方不明になり部屋の中の何処かにあるはずなのに中々見つかりません。
探している時は「そういえばペンを本体に繋げるように穴が開いていたなぁ」と思いましたが、いざ見つかってみると紐が邪魔になりそうで繋ぐ気にはなれません。
そこで例え紛失しても困らないように3Dプリンタで作ってみました。そのまま似せて作るのもなんなのでちょっとアレンジしてみました。
メモパッド用のペン(CAD画面) |
![]() |
このメモパッドは 500 円で電気的に消去できます(部分的な消去や書換えは不可)。
メモパッドとペンたち |
![]() |
下の写真の上側が今回作成したペンです。手で持つ部分が六角なので手に馴染みます。こんなものがすぐ作れるなんて便利な世の中になったものです。
メモパッドとペンたち |
![]() |
下記からSTLファイルをダウンロードできます。商用利用以外であれば使用可能とします。
[改版履歴]
★Ver0.03 20223/10/01
STLファイルを修正し、読込み時にエラーが出なくなった
★Ver0.05 2023/10/05
若干変更(サポート材最小化にも対応)