2022年05月17日

初代機の回路違い

  初代機の回路違いについて


  現在、初代機は2台所有しているのですが、それ以外に基板だけのものを1枚持っています。
  これは以前に基板だけのものをオークションで落としたものなのですが...

  今回、RGBコンバータを設計するときに、この基板を動かそうとしたのですが、何かおかしい動作をします。

  結局、サブCPUが死んでたのですが、それ以外に電源投入で点灯するキーボード上のLEDが点灯しません。


  調べてみると、このLEDを点灯させる回路自体が違う事がわかりました。


  通常の基板(表)
220517_02_初代通常表.jpg

  通常の基板(裏)
220517_02_初代通常裏.jpg

  バージョン違いの基板(表)
220517_02_初代異ver表.jpg

  バージョン違いの基板(裏)
220517_02_初代異ver裏.jpg

  赤い矢印の部分が違います。回路図では以下の通り。



  通常の基板の回路図
220517_02_初代通常回路.png

  バージョン違いの基板の回路図
220517_02_初代異ver回路.png


  キーボードの X10 への電圧が、"0V"と"5V"で違っています。

  このバージョン違いの基板に刺さっていた、キーボードの回路はどうなっていたんでしょうか?

  0V が与えられないため、LEDを点けるのが難しいような気がします。


posted by えすび at 17:42| Comment(0) | P6解析:サブCPUと8255 | このブログの読者になる | 更新情報をチェックする

2018年11月08日

キー入力について

  P6のキー入力についてまとめておきます。


1.キー入力は、全てサブCPUが管理している。
  メインCPUからは、8255を通して通信を行ってデータを取得する事になります。
  また、サブCPUとの通信は、通常は割り込みを使用します。

  割り込みを使用しない方法も無くはないのですが、SR以降の挙動が変わるんじゃなかと思います。

  以降、割り込みを使っているという前提で記載します。


2.キー入力の種類は4種類ある。

 1)通常キー入力(割り込みベクタ0x02)
  キー入力があった時点にサブCPUから割り込みが発生し、値を返してきます。
  逆に、キー入力がないと、全く割り込みが発生しません。
  そのため、キーが押下された事はわかりますが、キーを離した事はわかりません。

  キーをずっと押下している場合は、サブCPU側でキーリピートの処理を行って、その都度割り込みが発生します。
  キーリピートの間隔などの変更などもできず、何故か機種によって間隔も違うようです。

  また、SHIFT/CTRL/GRPH/かな入力、ひらがな<->カタカナ切換(SHIFT+PAGE)もサブCPUの方で行っており、返ってくる値もそのコードになります。

  ややこしいんですが、CAPSを押した時の処理はサブCPUで行っておらず、CAPSは普通の特殊キーの一つになっています。


 2)特殊キー入力(割り込みベクタ0x14)
  これに該当するキーは以下の通りです。右に返ってくる値を併記します。

  グラフィックキー(GRPH+1〜9など):グラフィックコード(0x01〜0x1f)
  ファンクションキー(F1〜F5):0xf0〜0xf4
  SHIFT +F1〜F5       :0xf5〜0xf9
  STOP            :0xfa
  CAPSキー          :0xfb
  SHIFT+PAGE         :0xfc
  MODEキー          :0xfd
  かなキー          :0xfe


  動作としては、1)通常キー入力と同じです。
  押された時に、値を返してきて、ずっと押下している場合は、キーリピートされて、その都度割り込みが発生します。


 3)ゲームキー入力(割り込みベクタ0x16)
  1)2)とは違い、メインCPUからゲームキー調査のコマンドを発行します(サブCPUに対して0x06を出力)。
  しばらくすると、サブCPUから割り込みが発生して、ゲームキーの状態を返してきます。

  返ってくる値は以下の通り。

  bit7-0:[SPC] ["L"] [←] [→] [↓] [↑] [STOP] [SHIFT] の押下状態(押している時"1"、離している時"0")


  このゲームキー入力を使う事で、キーが押されているか、押されていないかがリアルタイムに分かります。
  逆にここで検出できる SPACE/カーソル/STOP/SHIFT 以外は、リアルタイムで押下されているかどうかがわかりません。


 4)CMT入出力時のSTOPキー入力(割り込みベクタ0x0e/0x10)
  押された時点でサブCPUから割り込みが発生します。値は返してきません。


3.サブCPUとの通信について

  BASICのROM内通信を使うのが一番手っ取り早いんですが、自前で全部作ると以下のようになります。
  (下記は、拙作Meltdown for p6mk2から、一部抜き出して変更したもの)



;
; 割り込み関連
;
org $8400

INT_TABLE:
dw INTDT0 ; 0x00
dw INTKEYIN ; 0x02(通常キー入力)
dw INTDT0 ; 0x04(RS-232C)
dw INTTIMER ; 0x06(TIMER)
dw INTDT1 ; 0x08(CMT READ)
dw INTDT0 ; 0x0A
dw INTDT0 ; 0x0C
dw INTDT0 ; 0x0E(CMT使用時STOP入力)
dw INTDT0 ; 0x10(CMT使用時STOP入力)
dw INTDT0 ; 0x12(CMT ERROR)
dw INTKEYIN2 ; 0x14(特殊キー入力)
dw INTGAMEKEY ; 0x16(ゲームキー入力)


;
; サブCPUから1バイトデータを受信する
;
; RET:Areg=受信データ
;
GETSUBCPU:
ld a,$0c
out ($93),a
.wait:
in a,($92)
and $20
jr z,.wait
ld a,$0d
out ($93),a
in a,($90)
ret

;
; サブCPUへ1バイトデータを送信する
;
; Areg=送信データ
;
SETSUBCPU:
push af
ld a,$08
out ($93),a
.wait:
in a,($92)
and $80
jr z,.wait
ld a,$09
out ($93),a
pop af
out ($90),a
ret

;
; 割り込み終端(データ1バイト受信+何もしない)
;
INTDT1:
push af
call GETSUBCPU
pop af
;
; 割り込み終端(何もしない)
;
INTDT0:
ei
ret

;
; キー入力割り込み
; 通常キーは、ASCIIコード
;
INTKEYIN:
push af
call GETSUBCPU
ld (KEYDATA),a
pop af
ei
ret

;
; キー入力割り込み
; GRAPH+キーの場合は、そのASCIIコード
; ファンクションキーの場合は、0xf0〜0xf9
; STOPキーの場合は、0xfa
; CAPSキーの場合は、0xfb
; MODEキーの場合は、0xfd
;
INTKEYIN2:
push af
call GETSUBCPU
ld (KEYDATA2),a
pop af
ei
ret

;
; タイマ割り込み
;
INTTIMER:
push af

ld a,(TIMERCNT)
inc a
and $03
ld (TIMERCNT),a
jr nz,.next1

ld a,$06
call SETSUBCPU ; ゲームキー呼び出し

.next1:
pop hl←不要でした
	pop	af
ei
ret

;
; ゲームキー割り込み
;
INTGAMEKEY:
push af
push bc

call GETSUBCPU

;
; サブCPUからのゲームキーをJOYSTICKの並びに変更する
; SPC "0" 左右下上 STOP SFT
; ↓
; "0" STOP SFT SPC 右左下上

ld b,a
xor a
bit 2,b
jr z,.lp1
or $01
.lp1: bit 3,b
jr z,.lp2
or $02
.lp2: bit 5,b
jr z,.lp3
or $04
.lp3: bit 4,b
jr z,.lp4
or $08
.lp4: bit 7,b
jr z,.lp5
or $10
.lp5: bit 0,b
jr z,.lp6
or $20
.lp6: bit 1,b
jr z,.lp7
or $40
.lp7:
ld b,a

;
; ジョイスティックポートにアクセスする
;
ld a,$0f
out ($a0),a
ld a,$c0
out ($a1),a
ld a,$0e
out ($a0),a
in a,($a2)
cpl
and $3f
;
; Areg:"0" "0" TRG2 TRG1 右左下上

or b
ld (GAMEDATA),a

pop bc
pop af
ei
ret



posted by えすび at 23:54| Comment(0) | P6解析:サブCPUと8255 | このブログの読者になる | 更新情報をチェックする

2014年11月16日

66SRのキーボードについて(3)

  フォーマットが分かったので、ハードウエアで実現してみました。


  動くかどうかのテスト用なので、Arduino を使います。

  回路図とスケッチは次の通りです。

141116_01_66SR_key_Arduino.PNG


有線通信のスケッチ

赤外線通信のスケッチ



  ハードウエアについての注意点です。

 ・赤外線通信の回路

  赤外線LEDは汎用なら特に何でもいいと思います。今回は共立電子で、L53F3BTというのを購入しました。

  制限抵抗は、330オームにしていますが、これで12mA程度流れる計算です。


  電源電圧 = 5V、順方向電圧降下 = 1.2V(L53F3BTのカタログより)なので、(5-1.2) / 330 = 0.0115 A

  制限抵抗を小さくすると、発光が強くなって赤外線が飛ばせる距離が伸びますが、Arduino の絶対最大出力が40mAなので、あまり大電流を流さないようにして下さい。


 ・有線通信の回路

  コネクタの番号が分かり難いので、Arduinoに接続する前に確認して下さい。66SRの電源を入れた時に、1ピンと2ピンの間に5Vの電位差が出るので、これを確認するといいと思います。

  後は回路図の通り、2ピンと4ピンをGNDに、3ピンを33オームの抵抗を解して接続します。

  スケッチをArduinoに書き込む時は、66SRと接続しない状態でするようにして下さい。



  送信するキーデータですが、Arduino を接続しているパソコンからシリアル通信で送信します。

  パソコンからのデータが0xFF以外は、制御コード = 0b000 として、キーデータを66SRに送信します。
  パソコンからのデータが0xFFの時は、その次のデータを制御コードとし、さらにその次のデータをキーデータとして送信します。


  とりあえずいつもの「あくのりっち」を使った場合について説明します。

http://www.vector.co.jp/soft/win95/prog/se089304.html


 1)回路を組み立てます。
 2)Arduino IDE でArduino にスケッチを書き込みます。
 3)Arduino IDE を終了させます。
 4)あくのりっちを起動します。
 5)「シリアルデバイスを開く」を選び、Arduino IDEで指定したCOMポートと同じものを選択します。
 6)画面下のボーレート設定を1200bpsにします。

  これで通信が可能になっているはずです。

 7)66SRの電源を入れます。BASICを選ぶ画面になるまで待ちます。

 8)F5 を押すために、Arduino にデータを送信します。あくのりっちの「編集」−「BINARYモード」を選び、下の入力部分に、FF、01、F4、を入力します。

 9)N66SR-BASICが起動されれば成功です。


 ・わかっている問題

  パソコン→Arduino→66SRにデータを送信する時に、パソコン→Arduinoの転送よりも、Arduino→66SRのデータ速度が遅いです。そのため、大量にデータを送信した場合、例えばファイル転送した場合などは、Arduinoでデータ溢れが発生します。

  通常はフロー制御を行って、パソコンからくる送信データを抑制するのですが、それがどうもうまくいきません。

  Arduinoのハードウエアは、フロー制御の信号が接続されていないので、Xon/Xoffのソフトウエア制御になります。
  パソコン側でXon/Xoffを受信した時に、送信を抑制/再開のフロー制御をすればいいだけだと思うのですが...このフロー制御は、Arduinoのドライバが行うのか、あくのりっちが行うのか、それともさらに上位のソフトが行うのか、よくわかりません。


  通常の人間がキー入力するような速度なら、特に問題はありません。





posted by えすび at 12:20| Comment(0) | P6解析:サブCPUと8255 | このブログの読者になる | 更新情報をチェックする

2014年11月15日

66SRのキーボードについて(2)

 続きです。


3.データの物理フォーマットについて

 赤外線通信も有線通信も、論理フォーマットは同じですが、物理フォーマットは違います。

 まず、有線通信のフォーマットです。

141115_02_66SR_keywire.png


 ヘッダ1、2は、このままの波形がそれぞれのデータの先頭に送信されます。ヘッダ2のパターンは、"1"のパターンと同一のようです。

 制御データ、キーデータは、それぞれLSBから送信されます。"0"と"1"は、両方とも"H"、"L"のパターンが出力されますが、"H"の長さが違います("L"の長さは同じです)。

 一つの送信データ(ヘッダ+24ビットデータ)を送信してから、次のデータが送信されるまでの最小間隔は、4657us(実測値)です。



 次に赤外線通信のフォーマットです。

141115_02_66SR_keyIR.PNG


 この波形は、サブCPUの出力のため、実際の赤外線LEDが光っているのは、波形が"L"の間になります。
 また、波形で塗りつぶしている"L"の部分は、38KHzの周波数のキャリアがあります。

 後の送信データに関しては、有線通信と同様です。ただし、長さが違う事と、"L"を出力するときは、38KHzのキャリアがあるという事です。特に"L"の出力をする時は、38KHzが16クロック分出力されています。

 一つの送信データを送信してから、次のデータが送信されるまでの最小間隔は、5173us(実測値)です。


posted by えすび at 16:58| Comment(0) | P6解析:サブCPUと8255 | このブログの読者になる | 更新情報をチェックする

66SRのキーボードについて(1)

 最近話題の66SRのキーボードに関してです。
 MORIYAさんの所にも情報がありますが、再調査してまとめてみました。


1.データのやりとりの方法について

 66SRとキーボードは離れているため、キーボードの情報を赤外線通信、もしくは有線通信でデータを送信しています。キーボードから66SRへ、一方的にデータを送信しています。

 赤外線通信か、有線通信のどちらかしか行われていませんが、その選択方法は以下の通りです。

 ・66SR本体とキーボードが、付属のケーブルで接続されていたら、有線通信
 ・それ以外は、赤外線通信


 実際の回路での電気的な選択方法は次の通りです。
 (回路図を修正しました)

141115_01_66SR_keysch.PNG


 ケーブルで66SR本体とキーボードが接続された時、キーボード側の2ピン4ピンが"H"になり、その結果をサブCPU3が検知して、送信回路を赤外線通信から有線通信に切り替えます。
 また、66SR側の3ピン4ピンが"L"になり、その結果をサブCPU2が検知して、受信回路を有線通信の方に切り替えます。

 実際の送信データは、4ピンを使ってキーボードから66SRに送信されます。キーボードの2ピンから66SR本体の3ピンに向かって送信されます。


2.データのフォーマットについて

 赤外線通信も有線通信も、論理的に同じフォーマットを使って送信されています。
 ただし、実際の物理的なフォーマットは違います(後述します)。

 1回のデータ送信は、3ビットの制御データ(CT[2:0])+8ビットのキーデータ(DT[7:0])の11ビットのデータを送信します。

 論理フォーマットは以下の通りです。(LSB先送りに注意)

141115_01_66SR_keyformat.PNG


 キーを一度押すと、押したキーのコード(制御データ+キーデータ)が送信されます。押しっぱなしにすると、そのキーコードが連続して送信されます。キーボード側でオートリピートが実現されています。

 キーを離した時には、キーコードが送信されません。


 キーコード一覧です。

141115_01_66SR_keycode.jpg


 前の3桁の数字は3ビットの制御コード(CT[2:0])、後ろの2桁の数字がキーデータ(DT[7:0]・HEX表記)です。その後ろにキーデータを文字に変換しています。

 例えば、000:30(0) の場合は、制御コードが0b000で、キーデータが0x30、アスキーコードが"0"になります。

 「なし」は、他のキーを押していない場合に送信されるデータです。
 「SHIFT」は、SHIFTキーを押しながら、キーを押した時に送信されるデータです。「CTRL」「GRAPH」も同様です。
 「TV」は、キーボード上部の「PC/テレビ」のボタンを押し込んでから、キーを押した時に送信されるデータです。空欄があるのは、それ以外のキーはデータが送信されないためです。

 キーに「SHIFT」「CTRL」「GRAPH」がありませんが、このキーは単体ではデータを送信しないためです。

 「CAPS」「かな」キーを押した状態でも、送信されるキーコードは変わりません。ひらがな/カタカナの変換は本体側のサブCPUが行っているようです。



 また、キーコードとは別に、ゲームキー用のデータが送信されます。

 ゲームキーとは、STOP、SPACE、SHIFT、カーソル上下左右の7つのキーの事です。

 これらのキーは、他のキーとは違い、押している状態か、離している状態かが分かります。他のキーは、押された事しか分かりません。


 ゲームキー用の送信データは次の通りです。

 制御コード(CT[2:0]) = 0b010
 キーデータ(DT[7:0]) = 押されているキーの情報

 キーデータのそれぞれのビットは以下の通りです。

 DT[7]:SPACE
 DT[6]:"0"固定
 DT[5]:←
 DT[4]:→
 DT[3]:↓
 DT[2]:↑
 DT[1]:STOP
 DT[0]:SHIFT


 押されているキー"1"、押されていないキー"0"に出力され、複数のゲームキーが押された時は、その分のビットが"1"になります。全部のゲームキーが押された場合、0xBFになります。


 内部処理は、ゲームキー用の監視をポーリングで監視しているようです。一定間隔でゲームキーが押されている/押されていないの状態を調べているようです。

 その際に、以前の状態と違う場合に、ゲームキー用の送信データとして送信します。通常は、ゲームキーが押された時、もしくは離された時に送信されます。


 ゲームキー用の送信は、上記の通常のキーコードとは独立して行われます。そのため、STOP、SPACE、カーソルキーが押された時は、ゲームキー用の送信、キーコードの送信の両方が送信されます。

 例えば、何も押されていない時に、SPACEキーを押した場合は、

 0b010:0x80 (ゲームキー用の送信)
 0b000:0x20 (キーコードの送信)

 の2つのデータが送信されます。

 また、通常はゲームキー用の送信が先のようですが、逆になることもあります。


 次に続きます。

posted by えすび at 14:06| Comment(10) | P6解析:サブCPUと8255 | このブログの読者になる | 更新情報をチェックする

2012年06月16日

8255と8049の設計(16)

 SWORD(S-OS)の GRAPH+カーソルキーが受け付けない問題について。

 そういえば、キー入力に関しては大体の想像で作ったので、ちゃんと調べることにしました。


 調べるのは、キーを押した時に、SUB-CPU から何の値が返ってくるか、どの割り込みが発生するか、です。

 キーを押すパターンは、結構あります。

 1)英数字モードで、普通に押す
 2)英数字モードで、SHIFTを押しながら
 3)英数字モードで、CTRLを押しながら
 4)英数字モードで、GRAPHを押しながら
 5)平仮名モードで、普通に押す
 6)平仮名モードで、SHIFTを押しながら
 7)平仮名モードで、CTRLを押しながら
 8)平仮名モードで、GRAPHを押しながら
 9)片仮名モードで、普通に押す
 10)片仮名モードで、SHIFTを押しながら
 11)片仮名モードで、CTRLを押しながら
 12)片仮名モードで、GRAPHを押しながら

 ...かなりあります。


 調べ方は、BASIC のキー割り込みのフックを書き換えて、SUB-CPU からの情報を出力するプログラムを作りました。


 プログラムは、これです。

keycheck.p6



 PC-6601 で実行した結果です(どの割り込みが発生かは調べていない)。
 PC-6001 では、多少結果が違うと思います(かなキー押下時には、割り込みが発生しない)。

PC6601_key.xls



 今の実装と違うところが何箇所かありますが、一番大きく違うのは、0を返すという事です。
 今の実装では0を返す状態の時は、割り込みを発生しないようになっていました。

 今回の問題はこれが原因っぽいんですが、ちょっと疑問が。


 それは、GRAPH + ↑、GRAPH + ↓ とも、値は0しか返って来ないということです。
 実機でSWORD(S-OS)を動かしてみましたが、ちゃんとGRAPH + ↑ と GRAPH + ↓ を区別できていました。

 GRAPH キー入力割り込みが発生した時に、その値が0だったらゲームキー調査をする、というプロセスを踏んでいるのかも知れません。



posted by えすび at 22:12| Comment(0) | P6解析:サブCPUと8255 | このブログの読者になる | 更新情報をチェックする

2012年02月12日

8255と8049の設計(12)

 いい加減ほったからかしにしていた、CMT セーブに取り掛かりました。

 とりあえず8049 の方を作って、データがちゃんと出るかをモニタすると...暴走する。


 いろいろ調べた所、原因が BASIC の ROM ルーチンでした。

1AEDH CMT SAVEのREADYチェック
1AED LD B,00H
1AEF LD A,08H
1AF1 OUT (093H),A
1AF3 IN A,(093H)
1AF5 BIT 3,A
1AF7 JR Z,01AFFH
1AF9 IN A,(093H)
1AFB RLCA

 ポート0x93 から入力していますが、0x92から入力の間違いです...

 似たようなルーチン(0x0E8F:8049へ1バイト出力)もあるんですが、こちらは ポート0x92 から入力しています。


 8255 のマニュアルにも、"Illigal Operation" と書いていますが、たまたま動いているみたいですねー。




posted by えすび at 19:49| Comment(0) | P6解析:サブCPUと8255 | このブログの読者になる | 更新情報をチェックする

2012年01月12日

8255と8049の設計(12)

 8049 の動作に関して、mk2の分を含めて変更しました。


 ・8049 からの読み出しと8049 が返す値

 1)キー割り込み@ (CMT使用時にSTOP が押された時)
  返す値は1バイト。CSAVE時にSTOPが押された時は、0x0E。CLOAD時にSTOPが押された時は、0x10。

 2)キー割り込みA (グラフィックキー、ファンクションキー、STOPキーが押された時)(mk2は、CAPS、SHIFT+PAGE、MODE、かな、が押された時も)
  返す値は2バイト。0x14 + キーコード

  キーコードは、グラフィックキーならそのASCIIコード、ファンクションキーなら、0xF0〜0xF9、STOPキーなら、0x03 0xfa
  加えてmk2は、CAPSキー:0xFB、SHIFT+PAGE:0xFC、MODEキー:0xFD、かなキー:0xFE

 3)キー割り込みB (一般のキーが押された時)
  返す値は2バイト。0x02 + キーのASCIIコード

 4)ゲーム用キー割り込み
  返す値は2バイト。0x16 + キーコード

  キーコードは1バイトで、bit7-0 が [SPC] ["L"] [←] [→] [↓] [↑] [STOP] {SHIFT] となる。bit6 は L 固定。

 5)CMT リード割り込み(1バイト受信)
  返す値は2バイト。0x08 + 受信データ

 6)CMT リードエラー割り込み
  返す値は1バイト。0x12

 7)RS-232C 割り込み(RxRDY受信)
  返す値は1バイト。0x04

 1)〜3)は、キー入力がトリガ。5)6)はCMT からのデータ入力がトリガ。7)は、RxRDY がトリガ。
 4)は、コマンド 0x06 に対する返答(下記参照)。



 ・8049 へ出力する値

 1)ゲーム用キーの調査
  出力する値は1バイト。0x06

  結果は、割り込みで返してくる。

 2)RS-232C 用初期設定(?)
  出力する値は1バイト。0x0C

 3)CMT 入力用初期設定(?)
  出力する値は1バイト。0x2C

 4)CMT 入力OPEN宣言
  出力する値は2バイト。1200ボーは、0x1E + 0x19。600ボーは、0x1D + 0x19。

 5)CMT 入力CLOSE宣言
  出力する値は1バイト。0x1A

 6)CMT 出力用初期設定(?)
  出力する値は1バイト。0x2C

 7)CMT 出力OPEN宣言
  出力する値は2バイト。1200ボーは、0x3E + 0x39。600ボーは、0x3D + 0x39。

 8)CMT 出力CLOSE宣言
  出力する値は1バイト。0x3A

 9)CMT 1バイト出力
  出力する値は2バイト。0x38 + 送信データ

 10) キーボードの状態の変更
  出力する値は1バイト。かなモードにするには、0x04。ひらがなとカタカナの切り替えは、0x05。



posted by えすび at 17:41| Comment(0) | P6解析:サブCPUと8255 | このブログの読者になる | 更新情報をチェックする

2011年10月16日

8255と8049の設計(7)

 8255と8049 の設計(6) で、

>> 一連の処理をしている間は、8255(Z80) から入力されるコマンドは、受信しても廃棄します。
>> また、同時に発生した場合は、番号が小さい物から実行します。

 これはまずくて、

 1)CMT LOAD
 2)CMT SAVE

 以外の処理をしている間は、コマンドを待たせておく必要がありました。


 4)キーボードポーリング
 5)RxRDYポーリング

 は、トリガが8049 の内部のタイミングで発生するため、Z80 からゲーム用キー調査のコマンドを受信した時は、この
 コマンドに対応して値を返す必要があるためです。


 ほとんど回路を変更していないのに、「How Many Pages?」が出ない事があったので、上記の問題がわかりました。


posted by えすび at 20:14| Comment(0) | P6解析:サブCPUと8255 | このブログの読者になる | 更新情報をチェックする

2011年10月15日

8255と8049の設計(6)

 8049 の動作について、調べた結果、以下のようで動きそうです(文章に書くと分かりづらいですね)。


 1)CMT LOAD

 1−1)0x1E 受信(1200baud) または 0x1D 受信(600baud)
 1−2)0x19 受信
 1−3)ポートP1 bit4 に L を出力(入力セレクタの切り換え)
 1−4)ポートP2 bit3 のデータ(受信)を解析
 1−5)エラーがあれば、0x12 送信 + ポートP1 bit7 に L を出力して終了(割り込み発生)。
 1−6)1バイトまとまったら、0x08 送信 + ポートP1 bit7 を L を出力(割り込み発生)、その後、受信データを出力。
 1−7)1−4)〜1−6)の間に、STOP キーの状態をポーリングする。キーの調査の方法は、3−2)のキー調査と同じ。
 1−8)STOP キーが押されてたら、0x10 送信 + ポートP1 bit7 に L を出力して終了(割り込み発生)。
 1−9)0x1A 受信したら、終了。
 1−10)1−4)に戻る。


 2)CMT SAVE

 2−1)0x3E 受信(1200baud) または 0x3D 受信(600baud)
 2−2)0x39 受信
 2−3)0x38 受信したら、次の受信データを待つ(これがCMT に送信するデータ)
 2−4)2−3)のデータをテープデータにして、ポートP1 bit5 に出力する。
 2−5)2−3)〜2−5)の間に、STOP キーの状態をポーリングする。キーの調査の方法は、3−2)のキー調査と同じ。
 2−6)STOP キーが押されてたら、0x0E 送信 + ポートP1 bit7 に L を出力して終了(割り込み発生)。
 2−7)0x1A 受信したら、終了。
 2−8)2−3)に戻る。


 3)ゲーム用キー調査

 3−1)0x06 受信
 3−2)キーの調査を行う。ポートP1 bit4 に H を出力し、ポートP1 bit3-0 に"0000"〜"1001" を出力する。
 3−3)ポートP2 bit7-0 の値で、どのキーが押されたかを判断する。
 3−4)ゲーム用キーが押されているビットだけ1を立てて、出力データを作る。
 3−5)0x16 送信 + ポートP1 bit7 を L を出力(割り込み発生)、その後、3−4)のデータを出力。
 3−6)終了。


 4)キーボードポーリング

 4−1)ポーリングにより、タイマが満了したら、4−2)以下を行う。
 4−2)キーの調査を行う。キーの調査の方法は、3−2)のキー調査と同じ。
 4−3)押されたキーの状態により、出力データを作る。
 4−4)グラフィックキー、ファンクションキー、STOP の場合は、4−5)、それ以外は、4−6)に。
 4−5)0x14 送信 + ポートP1 bit7 を L を出力(割り込み発生)、その後、4−3)のデータを出力して終了。
 4−6)0x02 送信 + ポートP1 bit7 を L を出力(割り込み発生)、その後、4−3)のデータを出力して終了。


 5)RxRDYポーリング

 5−1)ポーリングにより、タイマが満了したら、5−2)以下を行う。
 5−2)RxRDY の状態の調査を行う。ポートP1 bit4 に L を出力する。ポートP2 bit3 に RxRDY が入力される。
 5−3)RxRDY が H → L になった時、以下を実行する。それ以外の場合は終了。
 5−4)0x04 送信 + ポートP1 bit7 を L を出力(割り込み発生)して終了。



 一連の処理をしている間は、8255(Z80) から入力されるコマンドは、受信しても廃棄します。
 また、同時に発生した場合は、番号が小さい物から実行します。

 ポーリングは、とりあえず 500μs にしておきます。


posted by えすび at 14:59| Comment(0) | P6解析:サブCPUと8255 | このブログの読者になる | 更新情報をチェックする

2011年10月13日

8255と8049の設計(3)

 PC-6001関係で唯一捨てなかった PC-Teckknow6001 を、何気なく読んでいると、I/Oポートの所に手書きで書いていました。

 OUT &H90,4 かな
 OUT &H90,5 カナ<->かな

 PC-6001mkII を使っていた時に書いたと思われますが、PC-6001 にも同様の事で動くと思います。

 ので、8049 へ出力する値に追加しておきます。

 10) キーボードの状態の変更
  出力する値は1バイト。かなモードにするには、0x04。ひらがなとカタカナの切り替えは、0x05。


 キーボードの初期化もあるはずですね。0x0C 辺りがそうかも知れません。



posted by えすび at 20:11| Comment(4) | P6解析:サブCPUと8255 | このブログの読者になる | 更新情報をチェックする

2011年10月12日

8255と8049の設計(2)

 8049 への書き込み、読み出しはいつ行われるのか、P60-BASIC から調べてみました。


 ・8049 からの読み出しと8049 が返す値

 1)キー割り込み@ (CMT使用時にSTOP が押された時)
  返す値は1バイト。0x0E or 0x10

 2)キー割り込みA (グラフィックキー、ファンクションキー、STOPキーが押された時)
  返す値は2バイト。0x14 + キーコード

  キーコードは、グラフィックキーならそのASCIIコード、ファンクションキーなら、F0H〜F9H、STOPキーなら、03H

 3)キー割り込みB (一般のキーが押された時)
  返す値は2バイト。0x02 + キーのASCIIコード

 4)ゲーム用キー割り込み
  返す値は2バイト。0x16 + キーコード

  キーコードは1バイトで、bit7-0 が [SPC] ["L"] [←] [→] [↓] [↑] [STOP] {SHIFT] となる。bit6 は L 固定。

 5)CMT リード割り込み(1バイト受信)
  返す値は2バイト。0x08 + 受信データ

 6)CMT リードエラー割り込み
  返す値は1バイト。0x12

 7)RS-232C 割り込み(RxRDY受信)
  返す値は1バイト。0x04

 1)〜3)は、キー入力がトリガ。5)6)はCMT からのデータ入力がトリガ。7)は、RxRDY がトリガ。
 4)は、コマンド 0x06 に対する返答(下記参照)。



 ・8049 へ出力する値

 1)ゲーム用キーの調査
  出力する値は1バイト。0x06

  結果は、割り込みで返してくる。

 2)RS-232C 用初期設定(?)
  出力する値は1バイト。0x0C

 3)CMT 入力用初期設定(?)
  出力する値は1バイト。0x2C

 4)CMT 入力OPEN宣言
  出力する値は2バイト。1200ボーは、0x1E + 0x19。600ボーは、0x1D + 0x19。

 5)CMT 入力CLOSE宣言
  出力する値は1バイト。0x1A

 6)CMT 出力用初期設定(?)
  出力する値は1バイト。0x34

 7)CMT 出力OPEN宣言
  出力する値は2バイト。1200ボーは、0x3E + 0x39。600ボーは、0x3D + 0x39。

 8)CMT 出力CLOSE宣言
  出力する値は1バイト。0x3A

 9)CMT 1バイト出力
  出力する値は2バイト。0x38 + 送信データ


 かなキーのLED に関しては、8049 で閉じているようで、P60-BASIC内には制御コマンドがありませんでした。


posted by えすび at 19:19| Comment(0) | P6解析:サブCPUと8255 | このブログの読者になる | 更新情報をチェックする

8255と8049の設計(1)

 ペリフェラルの8255 とサブCPU の8049 に取り掛かりました。

 8255 は単純かと思ったら、MODE2 を使っていたので、結構面倒です。

 PC-6001では、グループA(PA7-0、PC7-3)は、MODE2 で使用。グループB(PB7-0、PC2-0)は、MODE0 で使用しています。

 8255 は他にMODE1 というモードもあるのですが、使わない(というか周りのハードの状況で使えない)ため実装はせずに、PC-6001 に特化したモードにします。

 よって、モード変更のコマンドは無視します。

 MODE0 の実装は簡単なので、特に問題はありませんでした。

 MODE2 の方は、8049 とのやり取りをするため、かなりややこしいです。

 以下に動作をまとめます。


 ・Z80 => 8255 => 8049 にデータを出力する時

 1)Z80 から、I/O アドレス 0x90 にデータを書き込む。8255 は書き込まれた値をラッチして、ポートAに出力する。
 2)8255 のOBFN が H → L になる。この信号は、8049 のINTN(割り込み入力)につながっている。
 3)8049 は割り込みを受けて、OBFN が L になった事を知る。
 4)8049 は、8049 の RDN を H → L → H とする。同時に、8255 のポートAから出力されている信号を読み込む。
 5)8049 の RDN は、8255 の ACKN とつながっている。ACKN が L になった事により、OBFN が L → H となる。
 6)読み出し完了。

 P60-BASIC の ROM ルーチンでは、この一連の処理の前に、以前の読み出しが完了しているかのチェックも行っています。


 ・8049 => 8255 => Z80 にデータを出力する時

 1)8049 は、8049 の T0(8255 の IBF)が L になっていて、書き込みが出来ることを確認する。
 2)8049 は、8049 の WRN(8255 のSTBN)を H → L → H とする。この時、ポートAに対して、書き込むデータを出力する。
 3)8255 は、STBN が L の時の値をポートAにラッチする。また、IBF を H にして、データが書き込まれた事を示す。
 4)Z80 は、IBF が H の時に、I/O アドレス 0x90 (ポートA)からデータを読み出す。
 5)8255 は、IBF を L にして、データが読み込まれた事を示す。
 6)読み出し完了。

 P60-BASIC の ROM ルーチンでは、この一連の処理の前に、以前の書き込みが完了しているかのチェックも行っています。


 ちなみに割り込みの後では、8255 の CSN、A(1:0) をすべてLにして、M1N = L、IORQN = L の時に、RDN = L となるようにして、データの読み出し(割り込みベクタの下位8ビット)を読み出しています。


posted by えすび at 19:18| Comment(0) | P6解析:サブCPUと8255 | このブログの読者になる | 更新情報をチェックする