人気ブログランキング | 話題のタグを見る

体重と今日食べたもの

k1segawa.exblog.jp

ダイエット

ブログトップ

ポケコン PC-G850V(E200,G800のZ80系ポケコン)で電子回路工作 (3/8)

BASICにパラレルポートコマンド(OPEN"PIO:",PIOSET,PIOPUT)が無いZ80系ポケコンの事を考えて、11ピンを直接I/Oアクセスするように変更。PEEK、POKEではメモリしか触れずI/Oには届かないので、OUT命令を持つZ80マシン語で簡単なユーザ関数を作る。POKE COM様のZ80命令一覧より、

【Z80系ポケコン共通マシン語プログラム】
LD A,n          ・・・・・・  3E n            7     2    A←n
OUT (n),A ・・・・・・ D3 n 11 2 (n)←A
RET ・・・・・・ C9 10 1 PC←(SP)+
【SC62015/61860(ESR-L/H)系ポケコンの場合】
たった5バイトなので、シャープ独自のCPU E500系にも簡単に直せるはず、と思ったらメモリマップドI/Oなのかな?(魔法使いの森様青木充さんの「ポケコン裏技大辞典」より)。だったらPOKEで直接書き換えられるのか。だから元々0ページにI/Oがあるのね。
11ピンのI/Oのアドレスは、秋日和様の「ぽけこんのほん1」によると全機種共通らしいので、マシン語プログラムさえ合わせれば動く、っていうかPOKE文で済む。

【I/Oマップ】
60H・・・11ピンをパラレルポートとして準備(=1:シリアルは2)
61H・・・ピンの入出力を決める(オール出力=0)
62H・・・ピンへの出力データ(ピン4,5,6,..の順でビット0,1,2...)

【BASIC+Z80マシン語プログラム】
1:' マシン語書込み
2:POKE &H100,&H3E,0,&HD3,0,&HC9:GOTO 10
4:' マシン語サブルーチン
5:*PIO POKE &H101,V,&HD3,Z:CALL &H100:RETURN
6:' メイン
10:’ OPEN "PIO:":PIOSET 0
15:Z=&H60:V=1:GOSUB *PIO:Z=&H61:V=0:GOSUB *PIO
20:READ A
30:IF A=99 THEN RESTORE 70:GOTO 20
40:’ PIOPUT A
45:Z=&H62:V=A:GOSUB*PIO
50:WAIT 3:PRINT
60:GOTO 20
70:DATA 7,5,7,5,7,5,7,5,7,5,7,5,7,5,7,5,0,99

【マシン語領域確保】
方法は手動だが、各ポケコンごとに違うのかな?
G850Vでは以下の通り。
*MON
*USER01FF
(100H-1FFH確保)

デフォルトなのでいらないかもしれない。間違えないように打込めばRUNで実行。

【解説】
2:マシン語を100Hから5バイト書込み。
5:サブルーチンPIO。ポート番号と値をメモリに書込み(命令の自己書換え)して、マシン語コール。
10:元のBASIC文(REMなので特にいらないがGOTOで飛んでくるので)
15:OUT 60H,1とOUT 61H,0になるよう値を設定。サブルーチン呼出し。
20:READ文
30:99なら再読み込み
40:元のBASIC文
45:OUT 62H,Aになるよう値を設定。サブルーチン呼出し。
(以下同じ)

【もうちょっと詳しく】
2は、LD A,n:アキュムレータAという計算用レジスタに値nをロード(代入)。OUT (n),A:nで示されるI/OアドレスにAの値を書込む。RET:BASICというか呼出し元に戻る。
5は、マシン語の呼出しサブルーチン。(Zがアドレス、Vが値。POKE文1個で済ますよう&HD3は冗長です)
10以降は+5した行がBASICとマシン語の対応となっている。
前のプログラムに2,5,15,45を追加して10,40がREMになっただけで全く同じ。
REM文と入替えてもそのままで動くようにした。

WAIT行を削除しても、本体がBASICなので早くはならないけど、これでE200やG800系の人も同じソースで実行できる。アキュムレータAはBASICレベルで保証しないと動かないほどアレでないので、PUSHもいらないみたい。
E500系のマシン語を作ってBASICで書き換える部分(5行目)を調整すればE500系でも共通になるかな、と思ったらメモリマップドI/Oなら直接書き換えればいいのか。2、5は要らず、15:POKE &H60,1,0 45:POKE &H62,Aで良さそう。(PC-14系やUI-6系もE5系)

【以下メモ・・・(従来インターフェースとの差)】
ここまで考えてやるなら、BASICのPRINT#でSIO出力を使ってその代りピンアサインは固定でやってもいいかもしれないが、通信パラメータを決めとかないと文字化けしてしまうし、設定によってはDR、CTSのピンに何らかの結線で信号を回してやらないといけないから、前提が増えてしまう?それにMAX 入力=3、出力=3。G850になってパラレルコマンドがサポートされ、BASICからでも8ピン使えるが、PRINT#やプリンタ出力にLLPRINTとかにすればE200やE500、G8系でも共通だからね。入出力も3口あればシリアル―パラレル変換ICかませばいい。マシン語で速度が必要になった時シリアルの速度がネックになったかもしれないが、ポケコンでそこまでシビアなタイミングを要求せず、マイコンやコントローラにやらせていたのでしょう。解析が進みパラレルポートとしてアクセスするとE5系はPOKE文一つでI/Oアクセス出来そうだが、Z80系はマシン語が必要だし、何よりCPU毎に変更が必要。ハード屋さんならソフトをシンプルにし、ソフト屋さんならハードの見通しをすっきりさせたいと思う。ハード屋さんはインターフェースをシリアルで使って制限はハードで工夫し、ソフト屋さんはパラレルを直接出せた方が簡単と思ってしまうのかも。もちろんハード勉強中なのでシリパラで行きますが。
Commented by kaoaru at 2019-10-23 13:08 x
E500はZ80ではないのでマシンコードが違います
Commented by k1segawa at 2020-04-14 03:06
コメントありがとうございます。そうでした。2行目のマシン語ルーチンと、CALL、POKEはE500でも元々使えたので、5行目のインプット値引き渡しはいいとして、15行目のマシン語呼び出し処理はPOKEする場所を変えないといけませんね。
by k1segawa | 2015-03-08 15:26 | ポケコン | Comments(2)

by k1segawa