2014年12月30日火曜日

プリント基板到着

先日、ユニクラフト(http://unicraft-jp.com)にお願いした基板が届いた。
注文したのが12/14だったので年明けを覚悟していたが、思っていたよりも早く届いてよかった。。

漢字ROM PAC2、JOY PAC2と一緒に並べてみる。

こちらは部品面。シルク文字も綺麗に入っている。
JOY PAC2の上に置いてみたが、大きさも大丈夫。

半田面の仕上がりも、とても綺麗

取り付ける部品を並べてみた。

明日から、少しずつ取り付けてみよう。。

2014年12月14日日曜日

プリント基板作成

以前作成したPAC2コンボカード
プリント基板を作ってみようと思う。

調べてみたら、ユニクラフト(http://unicraft-jp.com)が安くて評判がよさそう。
製造依頼には拡張ガーバー(RS-274X)が必要なので、以前作成したEagleの回路図から作ってみる

回路図からプリント基板図を作成すると、部品が左側に配置される。
基板サイズは、PAC2スロットに収まるように、横100mm×縦65mmにする

部品配置してワイヤーを引くと交差が多い配置になってしまったので、AVR周りを中心に配線を見直し
あとEagleの場合、デザインルール指定してチェックできるので、以下パターンでチェックしてみる。
最小パターン幅0.18mm、最小ランド間距離0.2mm、スルーホール最小サイズ0.3mm

エラーがでたところは配置を見直しながら修正、出来たのが以下の基板図
間隔は狭いが、ぎりぎり収まった。

RS-274Xデータを作成するため、EagleのCAMジョブから必要なファイルをエクスポートする。

「excellon.com」から、ドリルデータもエクスポートする

PCBEを起動して、「ファイル」→「ガーバー入力」でEagleで作成したRS-274Xファイルをインポート
Eagleが作成したデータは少数4桁なので、ドリルデータも含めて4桁を指定する。

インポートした後、シルク文字や部品レジストの微調整を行って、できたのが下の基板図。

ファイル名を以下のように指定、「拡張出力」にチェックしてRS-274Xファイルにエクスポート。
作成されたRS-274XファイルをZIP圧縮して、見積もり・製造依頼してみる。

初めての基板作成でミスもあると思うし、年末で時間がかかると思われるが、進捗があれば追って報告したいと思う。

2014年11月29日土曜日

Z80 Collection

先日、秋葉原に行った際に、うわさのガチャを発見

400円だったので、記念に1回やってみた。
選んだのは「ぜっぱちこれくしょん」

日立製が出てきた。


今のところ、使い道は無い。。

2014年10月5日日曜日

Space Shooter

I/O 1983年1月号に掲載されていた、初代パソピア用のSpace Shooter

いわゆるアレです。

エミュでは色がおかしかったので、実機での画面。
かなりいいです。
名古屋撃ちもできるとのこと。

動画は、こちら

先日作った128KB RAM PAC2に入っているので、起動はやいです。

2014年9月22日月曜日

PiPo Ver.6.2B

以前紹介した98

中はAT互換機なので、起動時に「プッ」しか鳴らない。
せっかく98ガワを使っているので、やはり「ピポッ」と鳴らしたい。

前々から気になっていたPiPoをようやく購入
Ver.6.2Bだった。
スポンジとPC側と接続するケーブルも付属。

半田で組み立て。

98のスピーカー横に取り付け。
そのままだとショートするので、間にスポンジを挟んで鉄板に固定

あと、PiPoとは関係ないが、この98、最近FD読み取りに失敗することが多くなった。
せっかく蓋を開けたので、一緒に交換しておく。
NEC FD1231T。同じ型番で98用もあるようだが、Compaq用のシールもありAT互換機用

FDDも交換完了。
PiPoは、この写真で左側にある。

唯一残念なのは、このマザーボード(P5N-D)の場合、電源ONから「ピッ」がなるまで10秒以上かかってしまうため、PiPo側のスルー時間を最大まで調整しても、間に合わない。。
「ピポッ」のあと、「ピッ」もなってしまう。。

動画はこちら


2014年8月3日日曜日

PAC2コンボカード

RAM PAC2から始まったパソピア用PAC2コンボカードは、これで一旦終了

主な機能は、以下のようになった
・128KB (64KB x 2) RAM PAC2
・SDカード (FAT対応)
・Joystickアダプタ
・漢字ROM PAC2

特徴は、不揮発メモリ(MRAM)を使ったので、純正RAM PAC2と異なり電池不要。
また、PAC拡張ユニットなしで1スロットに集約できたのも特徴

スロットの切り替えは、PAC拡張ユニットの命令がそのまま利用可能
スロット番号機能備考初代パソピアでの利用
1JoystickアダプタMSXタイプジョイスティックOUT &H1B,1
2漢字ROM PAC2
OUT &H1B,2
364KB RAM PAC2 #2 (ドライブ6)MRAM (不揮発メモリ)OUT &H1B,3
464KB RAM PAC2 #1 (ドライブ5)MRAM (不揮発メモリ)OUT &H1B,4 (デフォルト)
74KB RAM PAC2 #3 ※SRAMOUT &H1B,7

※スロット7は、SRAMのため電源OFF時にクリアされる
・SDカードアクセス時に、バッファとして使うため、メモリ内容は変更される
・フォーマットすると、4KBのRAM PAC2として利用可能
・T-BASIC7の場合、SLOT命令でドライブ切替え可能
 「SLOT 7」:ドライブ5は、4KB RAM PAC2 #3
 「SLOT 4」:ドライブ5は、64KB RAM PAC2 #1

T-BASIC7で利用する場合、特別な変更は必要ないが、
初代パソピアで利用する場合は、SLOT命令が使えないので、OUT命令で切替えが必要

SDカードの読み書きは、SLOT7のバッファを通してコマンドで制御する
戻り値もSLOT7のバッファに書き込まれる
機能コマンドパラメータ戻り値備考
MRAMのメモリ内容を
SDカードのファイルへセーブ
sv [slot] [file name][slot] : セーブ元
 5 : RAMPAC1: SLOT4: デフォルト装置番号5
 6 : RAMPAC2: SLOT3: デフォルト装置番号6
 7 : BUFFER: SLOT7
[file name] : SDカードセーブ先ファイル名
 "/"から始まった場合、絶対パス
Ok : セーブが成功した場合
(エラー文字列) : エラーが発生した場合
事前に、SDカードにファイルが存在する必要がある
ファイル名は、半角英数8.3形式
書き込み後も、タイムスタンプは更新されない
SDカードのファイルをロードld [slot] [file name][slot] : ロード先
 0 : SDカードの漢字ROMファイルをAVRに保存
 5 : RAMPAC1: SLOT4: デフォルト装置番号5
 6 : RAMPAC2: SLOT3: デフォルト装置番号6
 7 : BUFFER: SLOT7
[file name] : SDカードロード元ファイル名
 "/"から始まった場合、絶対パス
Ok : セーブが成功した場合
(エラー文字列) : エラーが発生した場合
漢字ROMは、ファイル読み込み後にフラッシュと
EEPROMに保存する
フォルダとファイルの
リストを表示
ls [path][path] : 読込元のSDカードのパスとファイル名(ファイル名 or フォルダ名)の一覧
(エラー文字列) : エラーが発生した場合
フォルダの場合は名称の最後に"/"が付く
カレントディレクトリの変更cd [path][path] : パス名(フォルダ名) : カレントフォルダ
(エラー文字列) : エラーが発生した場合
電源OFFされるまで、パスは保持される

64KBのRAM PAC2は、純正のフォーマッタでは対応できていない様子
純正フォーマッタを使わずに、フォーマット済みイメージのバイナリファイルを用意して、ld命令で各ドライブにマウントすれば64KBフルに使えるようになる。

Eagleで回路図を作ってみた。

結局、基板は2枚に。

この配線をもう一度作るのは、かなり厳しい。。
プリント基板が作れるとよいのだが。

2014年8月2日土曜日

漢字ROM組込み

ここまできたら、漢字ROMにも対応してみる。

ATmega1284Pは、128KBのフラッシュメモリ、4KBのEEPROM、16KBのSRAMを持っている。
パソピアの漢字ROMは128KBなので、漢字ROMも内蔵できるようにしてみる。

SDカードから漢字ROMを読み込んで、フラッシュメモリに書き込めるようにブートローダに対応する。
プチFatFsに対応したためプログラムサイズは8KB近くになった。
ブートローダ領域は、ATmega1284P最大の4096ワード(8KB)にセットする。
LockとFuseビットは、以下のように

Lock Bit
11111111
|||||||+-- LB1
||||||+--- LB2
|||||+---- BLB01
||||+----- BLB02
|||+------ BLB11
||+------- BLB12
++-------- -

0xFF
1 (非プログラム) LB1~0=11:フラッシュとEEPROMメモリに対する一般保護用施錠ビット:施錠しない
1 (非プログラム)
1 (非プログラム) BLB02~01=11:フラッシュメモリの応用領域に対する一般保護用施錠ビット:施錠しない
1 (非プログラム)
1 (非プログラム) BLB12~11=11:フラッシュメモリのブートローダー領域に対する一般保護用施錠ビット:施錠しない
1 (非プログラム)
1 (非プログラム)
Extended
11111100
|||||||+-- BODLEVEL0
||||||+--- BODLEVEL1
|||||+---- BODLEVEL2
+++++----- -

0xFC
0 (プログラム) 低電圧検出(BOD)リセットの制御と検出電圧選択 111:無し,110:1.8V,101:2.7V,100:4.3V
0 (プログラム) BODLEVEL2~0=100:低電圧検出(4.3V)リセット
1 (非プログラム)
1 (非プログラム)
High
11011000
|||||||+-- BOOTRST
||||||+--- BOOTSZ0
|||||+---- BOOTSZ1
||||+----- EESAVE
|||+------ WDTON
||+------- SPIEN
|+-------- JTAGEN
+--------- OCDEN

0xD8
0 (プログラム) ブートローダーを使用。
0 (プログラム) BOOTSZ1~0=00:ブートローダ領域=4096、ページ数=32、ブートリセットアドレス=$F000
0 (プログラム)
1 (非プログラム) 消去でEEPROMを 1:消去, 0:保持
1 (非プログラム) WDTはWDTCSR(ウォッチドックタイマ制御レジスタ)で許可
0 (プログラム)   シリアルプログラミング許可
1 (非プログラム) 1:JTAG禁止, 0:JTAG許可
1 (非プログラム) JTAGデバッグを 1:無効, 0:有効
Low
11110111
|||||||+-- CKSEL0
||||||+--- CKSEL1
|||||+---- CKSEL2
||||+----- CKSEL3
|||+------ SUT0
||+------- SUT1
|+-------- CKOUT
+--------- CKDIV8

0xF7
1 (非プログラム) CKSEL0=1,SUT1~0=11:外部クリスタル発振子、低速上昇電源
1 (非プログラム) CKSEL3~1=011:外部クロック 0.4~20MHz
1 (非プログラム)
0 (プログラム)
1 (非プログラム)
1 (非プログラム)
1 (非プログラム) システムクロック出力許可 (1:不許可)
1 (非プログラム) システムクロック8分周選択はしない

これで128KBのフラッシュメモリは、漢字ROM用の応用プログラム領域120KB+プログラム用のブートローダー領域8KBに分割された。
このままだと漢字ROM領域が8KB不足するので、EEPROM 4KBに圧縮して保存する。
一番圧縮がかかりやすい0x6000~0x7FFFの領域をEEPROMに保存することにする。
EEPROMに圧縮して保存されたデータは、AVR起動時に解凍されて8KBのSRAM領域に展開される

パソピアから漢字データの要求があった場合、アドレスが0x6000~0x7FFFならSRAMから、それ以外はフラッシュ領域からデータを読み込むようにする

漢字ROM PAC2の場合、I/Oポートは以下
I/Oポート
アドレス
リード/ライト内容CAD1CAD0
18hライト漢字ROM PAC2下位アドレス8ビット LowLow
19hライト漢字ROM PAC2中位アドレス8ビット LowHigh
1Ahライト漢字ROM PAC2上位アドレス1ビット HighLow
18h-1Bhリード漢字ROM PAC2リードデータ8ビット --
上位・中位・下位の合計17ビットで128KBのアドレスを指定した後、18h~1Bhのどれかで8ビットデータをリードする。

続いて、漢字ROMをATmega1284Pへ書き込み。

漢字ROMの吸出しは、昔のブログを参照
使用するROMは、初代パソピア用(PA7246)、パソピア7用(PA7247)、どちらでもOK。
ラベルのシールは異なるが、ROMデータは同じっぽい。

SDカードに吸い出した漢字ROMのデータを書き込んでおき、以下の命令でフラッシュROMとEEPROMへ書き込みできるようにした
ld 0 [file name] : SDカードの漢字ROMファイルをAVRへロード
 [file name] : SDカード漢字ROMファイル名
  "/"から始まった場合、絶対パス
 [戻り値]
  Ok : ロードが成功した場合
  (エラー文字列) : エラーが発生した場合

テストプログラムを作って、パソピア7で動作確認
問題なさそう。

初代パソピア用(PA7246)は、ROM BASIC Ver1.1用のサブルーチンがテープで付属している

初代パソピア(Ver1.1)でも、サブルーチンを使って漢字表示できた

表示スピードは、やはりパソピア7の方が速い

2014年7月26日土曜日

Joystickアダプタ

次は、ジョイスティックアダプタをつけてみる。

SDカードスロットと一緒に、別基板に配置。
SDカードスロットはピン向きが逆になったので、クロスして配線。
あと本体側との接続ピンと干渉したため、基板をちょっとカット。

合体させると、このように。
上下がぶつからないように、コネクタの長さを調整してネジ止め。

ジョイスティックアダプタの場合、I/Oポートは以下
I/Oポート
アドレス
リード/ライト内容CAD1CAD0
19hリードジョイスティックアダプタ入力ポートALowHigh
1Ahリードジョイスティックアダプタ入力ポートBHighLow

リードするデータ内容は、デフォルト0xFFで、各ボタンが押されると、以下のビットがLowになる。
bit7bit6bit5bit4bit3bit2bit1bit0
--トリガーBトリガーA右ボタン左ボタン下ボタン上ボタン

初代パソピアに装着して、ジョイスティックを接続する

ジョイスティックのテストプログラム
100 OUT &H1B,1
110 A=PEEK(0):IF A=195 GOTO 130
120 PRINT HEX$(INP(&H1A));" ";HEX$(INP(&H19)):GOTO 120
130 PRINT STICK(1);STRIG(1);"(";HEX$(INP(&H1A));") ";
140 PRINT STICK(2);STRIG(2);"(";HEX$(INP(&H19));")":GOTO 130

パソピア7に装着して、テストプログラムを走らせる

STICK命令とSTRIG命令は、両方とも動いている。
STRIG命令は、トリガーAのみ有効だが、IN命令で読み込むとトリガーBのビットも生きていることがわかる

2014年7月25日金曜日

SDカード対応

DO夢で32GBのSDカードを購入。
2,000円以下で32GBが買えるとは、良い時代になった。。

MRAMが64KB×2なので、より大容量のデータが扱えるようにSDカード対応を考える。
使ったのは秋月のSDカードスロットDIP化モジュール
10kΩのプルアップ抵抗と3.3Vレギュレータが付いているので便利

電源はMRAMを使うときに用意した3.3Vをそのまま使うことにする。
AVRの近くにソケットを用意して、SDカードスロットDIP化モジュールを接続できるようにしておく

SDカードの読み書きは、ぷちFatFsを使わせてもらう
ディレクトリの操作(_USE_DIR)と、ファイル書き込み(_USE_WRITE)を有効にしたので、バイナリサイズが大きくなってしまった。。

SDカードのファイル内容をMRAMに保存したり、MRAMのデータをSDカードに書き込めるようにする。
ATmega1284のSRAMは16KBあるので、4KBをバッファエリアとしてSDカードの読み書きを高速化する。
バッファ領域はスロット7に割り当て(OUT &H1B, 7)、PASOPIA側からコマンドを入力できるようにする。

コマンドは、以下の4種類を用意
sv [slot] [file name] : MRAMのメモリ内容をSDカードのファイルへセーブ
 [slot] : コピー元
  5 : RAMPAC1: SLOT4: デフォルト装置番号5
  6 : RAMPAC2: SLOT3: デフォルト装置番号6
  7 : BUFFER: SLOT7
 [file name] : SDカードコピー先ファイル名
  "/"から始まった場合、絶対パス
 [戻り値]
  Ok : セーブが成功した場合
  (エラー文字列) : エラーが発生した場合
ld [slot] [file name] : SDカードのファイルをMRAMへロード
 [slot] : コピー先
  5 : RAMPAC1: SLOT4: デフォルト装置番号5
  6 : RAMPAC2: SLOT3: デフォルト装置番号6
  7 : BUFFER: SLOT7
 [file name] : SDカードコピー元ファイル名
  "/"から始まった場合、絶対パス
 [戻り値]
  Ok : ロードが成功した場合
  (エラー文字列) : エラーが発生した場合
ls [path] : フォルダとファイルのリストを表示
 [path] : 読込元のSDカードのパスとファイル名
 [戻り値]
  (ファイル名 or フォルダ名)の一覧 : フォルダの場合は名称の最後に"/"が付く
  (エラー文字列) : エラーが発生した場合
cd [path] : カレントディレクトリの変更
 [path] : パス名 [戻り値]
 [戻り値]
  (フォルダ名) : カレントフォルダ
  (エラー文字列) : エラーが発生した場合
SDカードの処理が終わったら、バッファ領域に[戻り値]が書き込まれる。

バッファへのコマンド入出力をBASICのINPUT命令で組んでみた。
100 INPUT A$
110 B$=LEFT$(A$,1)
120 IF B$="e" OR B$="E" THEN OUT &H1B,4:END
130 OUT &H1B,7:OUT &H19,0
140 FOR I=0 TO &HFF
150   OUT &H18,I
160   B$=MID$(A$,I+1,1)
170   IF B$="" GOTO 200
180   OUT &H1A,ASC(B$)
190 NEXT I
200 OUT &H1A,0:OUT &H18,0:OUT &H1B,15
210 C=INP(&H1A):IF C>=254 GOTO 210
220 FOR I=1 TO &HFF
230   OUT &H18,I:D=INP(&H1A)
240   IF C=0 AND D=0 GOTO 280
250   IF C=0 THEN PRINT CHR$(13);CHR$(10); ELSE PRINT CHR$(C);
260   C=D
270 NEXT I
280 PRINT"":GOTO 100

こんな感じで、SDカードのファイルからMRAMにデータを読み込む

MRAMは64KB単位で読み書きするようにしたため、SDカードには65,536 bytesのファイルを置いておく必要がある。(スロット7の場合は、4,096 bytes)
セーブ命令も、既にあるファイルに上書きする。

これで、以前エミュレータで作成したRAM PACイメージを、MRAMに保存できるようになった。

2014年7月20日日曜日

初代Pasopiaで動かない

MRAMのRAM PAC2を初代パソピアで試したところ、読み書きが失敗する。
ロジアナで、波形を確認してみる。


OUTとIN命令を続けて実行すると、以下のようになった。
上が初代パソピア、下がパソピア7

初代パソピアの方は、CSEL2がLowになってから、CWRもしくはCRDがLowになるまで、約230ns程度の遅延がある。

ポーリング中のアルゴリズムを見直した。
RAMPAC_PORT_SET:
  out _SFR_IO_ADDR(PORTA), r25 ; r25の返答値をセット         ; clock=1
RAMPAC_SCAN_POLLING:
  sbis _SFR_IO_ADDR(PIND), PD4 ; PD4=1(CWR=High)でスキップ     ; clock=1/2,3
  rjmp RAMPAC_NOT_READ_DATA ; RAMPAC_NOT_READ_DATAへ   ; clock=2
  sbic _SFR_IO_ADDR(PIND), PD3 ; PD3=0(CRD=Low)でスキップ     ; clock=1/2,3
  rjmp RAMPAC_SCAN_POLLING ; RAMPAC_SCAN_POLLINGへ    ; clock=2

RAMPAC_READ_DATA:
  sbic _SFR_IO_ADDR(PIND), PD2 ; PD2=0(CSEL2=Low)でスキップ    ; clock=1/2,3
  rjmp RAMPAC_SCAN_POLLING ; RAMPAC_SCAN_POLLINGへ戻る  ; clock=2
  ;PD2=0(CSEL2=Low)でPD3=0(CRD=Low)の場合 = PasopiaのIN命令
  out _SFR_IO_ADDR(DDRA), r19 ; PA0-PA7 : Output(0xFF)        ; clock=1
RAMPAC_WAIT_READ_DATA:
  sbis _SFR_IO_ADDR(PIND), PD2 ; PD2=0(CSEL2=High)でスキップ    ; clock=1/2,3
  rjmp RAMPAC_WAIT_READ_DATA ; RAMPAC_WAIT_READ_DATAへ戻る ; clock=2
  ; CSEL2=Highになったら、PinAをInputに戻す
  out _SFR_IO_ADDR(PORTA), r19 ; PA0-PA7 : Enable pull-up        ; clock=1
  out _SFR_IO_ADDR(DDRA), r18 ; PA0-PA7 : Input(0x00)          ; clock=1
  rjmp RAMPAC_SCAN_POLLING ; RAMPAC_SCAN_POLLINGへ戻る   ; clock=2

RAMPAC_NOT_READ_DATA:
  ;PD2=0(CSEL2=Low)でPD4=0(CWR=Low)の場合 = PasopiaのOUT命令
  in r23, _SFR_IO_ADDR(PIND)                                                        ; clock=1
  in r24, _SFR_IO_ADDR(PINA) ; PinAから入力                                   ; clock=1
  andi r23, 0b00011111                                                                  ; clock=1
  cpi r23, 0b00001011                                                                    ; clock=1
  breq RAMPAC_PIO_CONTROL ; OUT &H1B -> PIO_CONTROLへ        ; clock=1/2
  cpi r23, 0b00001000                                                                    ; clock=1
  breq RAMPAC_SET_LOW_ADDRESS ; OUT &H18 -> SET_LOW_ADDRESSへ ; clock=1/2
    cpi r23, 0b00001010                                                      ; clock=1
    breq RAMPAC_SET_HIGH_ADDRESS ; OUT &H19 -> SET_HIGH_ADDRESSへ ; clock=1/2
    cpi r23, 0b00001001                                                     ; clock=1
    breq RAMPAC_WRITE_DATA ; OUT &H1A -> WRITE_DATAへ            ; clock=1/2
    rjmp RAMPAC_SCAN_POLLING                                             ; clock=2

・・・

今までは、CSEL2がLowになるまでポーリングして待っていたが、今回はCWRかCRDがLowになるまでポーリングで待つようにした。

IN命令の応答は、前回でもぎりぎりのタイミングだったが、今回ポーリング間隔が広くなってしまったので、応答が間に合うように、ロジックを工夫。
ポーリングに入る前に、PortAの出力値を事前にセットしておき、1clock分を節約するとか。

これで、初代パソピアでも動くようになった。

2014年7月19日土曜日

鎌力SFX買った

以前紹介した98ケースはCPU上にATX電源があり、排熱に問題があった。

今回は一回り小さい、SFX電源を購入。
Scytheの「鎌力GOLD SFX PLUG-IN (SPKRG-S500P)」

マザーボードの横に設置する。
但しこの電源、奥行きが130mmと少し長いので、HDDスロットと干渉したため、HDDスロットを削った

これで縦に収まるようになった。

今までATX電源があった部分には、8cmファンを設置する。
アルミ板を削って、ファン固定のプレートを作成

ファンをつけるとこんなかんじ

マザーボードは、今まで通りAsusのP5N-D

CPUクーラーは、CoolerMaster Hyper48。
ファンがうるさかったので、X-FANのRDL9025S-PWMに交換。
相変わらずファイルスロットととのクリアランスは無いが、以前に比べてCPU上のスペースは余裕ができた。

カバーをつけて完成
外見は以前と変わらないが、CPU(X3350)は冷えるようになった。