先日、ユニクラフト(http://unicraft-jp.com)にお願いした基板が届いた。
注文したのが12/14だったので年明けを覚悟していたが、思っていたよりも早く届いてよかった。。
漢字ROM PAC2、JOY PAC2と一緒に並べてみる。
こちらは部品面。シルク文字も綺麗に入っている。
JOY PAC2の上に置いてみたが、大きさも大丈夫。
半田面の仕上がりも、とても綺麗
取り付ける部品を並べてみた。
明日から、少しずつ取り付けてみよう。。
2014年12月30日火曜日
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圧縮して、見積もり・製造依頼してみる。
初めての基板作成でミスもあると思うし、年末で時間がかかると思われるが、進捗があれば追って報告したいと思う。
プリント基板を作ってみようと思う。
調べてみたら、ユニクラフト(http://unicraft-jp.com)が安くて評判がよさそう。
製造依頼には拡張ガーバー(RS-274X)が必要なので、以前作成したEagleの回路図から作ってみる
回路図からプリント基板図を作成すると、部品が左側に配置される。
部品配置してワイヤーを引くと交差が多い配置になってしまったので、AVR周りを中心に配線を見直し
あとEagleの場合、デザインルール指定してチェックできるので、以下パターンでチェックしてみる。
最小パターン幅0.18mm、最小ランド間距離0.2mm、スルーホール最小サイズ0.3mm
エラーがでたところは配置を見直しながら修正、出来たのが以下の基板図
間隔は狭いが、ぎりぎり収まった。
RS-274Xデータを作成するため、EagleのCAMジョブから必要なファイルをエクスポートする。
「excellon.com」から、ドリルデータもエクスポートする
PCBEを起動して、「ファイル」→「ガーバー入力」でEagleで作成したRS-274Xファイルをインポート
Eagleが作成したデータは少数4桁なので、ドリルデータも含めて4桁を指定する。
インポートした後、シルク文字や部品レジストの微調整を行って、できたのが下の基板図。
ファイル名を以下のように指定、「拡張出力」にチェックしてRS-274Xファイルにエクスポート。
初めての基板作成でミスもあると思うし、年末で時間がかかると思われるが、進捗があれば追って報告したいと思う。
2014年11月29日土曜日
2014年10月5日日曜日
Space Shooter
I/O 1983年1月号に掲載されていた、初代パソピア用のSpace Shooter
いわゆるアレです。
エミュでは色がおかしかったので、実機での画面。
かなりいいです。
名古屋撃ちもできるとのこと。
動画は、こちら
先日作った128KB RAM PAC2に入っているので、起動はやいです。
いわゆるアレです。
エミュでは色がおかしかったので、実機での画面。
かなりいいです。
名古屋撃ちもできるとのこと。
動画は、こちら
先日作った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側のスルー時間を最大まで調整しても、間に合わない。。
「ピポッ」のあと、「ピッ」もなってしまう。。
動画はこちら
中は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拡張ユニットの命令がそのまま利用可能
※スロット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のバッファに書き込まれる
64KBのRAM PAC2は、純正のフォーマッタでは対応できていない様子。
純正フォーマッタを使わずに、フォーマット済みイメージのバイナリファイルを用意して、ld命令で各ドライブにマウントすれば64KBフルに使えるようになる。
Eagleで回路図を作ってみた。
結局、基板は2枚に。
この配線をもう一度作るのは、かなり厳しい。。
プリント基板が作れるとよいのだが。
主な機能は、以下のようになった
・128KB (64KB x 2) RAM PAC2
・SDカード (FAT対応)
・Joystickアダプタ
・漢字ROM PAC2
特徴は、不揮発メモリ(MRAM)を使ったので、純正RAM PAC2と異なり電池不要。
また、PAC拡張ユニットなしで1スロットに集約できたのも特徴
スロットの切り替えは、PAC拡張ユニットの命令がそのまま利用可能
スロット番号 | 機能 | 備考 | 初代パソピアでの利用 |
---|---|---|---|
1 | Joystickアダプタ | MSXタイプジョイスティック | OUT &H1B,1 |
2 | 漢字ROM PAC2 | OUT &H1B,2 | |
3 | 64KB RAM PAC2 #2 (ドライブ6) | MRAM (不揮発メモリ) | OUT &H1B,3 |
4 | 64KB RAM PAC2 #1 (ドライブ5) | MRAM (不揮発メモリ) | OUT &H1B,4 (デフォルト) |
7 | 4KB RAM PAC2 #3 ※ | SRAM | OUT &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を持っている。
ATmega1284Pは、128KBのフラッシュメモリ、4KBのEEPROM、16KBのSRAMを持っている。
パソピアの漢字ROMは128KBなので、漢字ROMも内蔵できるようにしてみる。
SDカードから漢字ROMを読み込んで、フラッシュメモリに書き込めるようにブートローダに対応する。
プチFatFsに対応したためプログラムサイズは8KB近くになった。
ブートローダ領域は、ATmega1284P最大の4096ワード(8KB)にセットする。
LockとFuseビットは、以下のように
これで128KBのフラッシュメモリは、漢字ROM用の応用プログラム領域120KB+プログラム用のブートローダー領域8KBに分割された。
このままだと漢字ROM領域が8KB不足するので、EEPROM 4KBに圧縮して保存する。
一番圧縮がかかりやすい0x6000~0x7FFFの領域をEEPROMに保存することにする。
EEPROMに圧縮して保存されたデータは、AVR起動時に解凍されて8KBのSRAM領域に展開される
パソピアから漢字データの要求があった場合、アドレスが0x6000~0x7FFFならSRAMから、それ以外はフラッシュ領域からデータを読み込むようにする
漢字ROM PAC2の場合、I/Oポートは以下
上位・中位・下位の合計17ビットで128KBのアドレスを指定した後、18h~1Bhのどれかで8ビットデータをリードする。
続いて、漢字ROMをATmega1284Pへ書き込み。
漢字ROMの吸出しは、昔のブログを参照
使用するROMは、初代パソピア用(PA7246)、パソピア7用(PA7247)、どちらでもOK。
ラベルのシールは異なるが、ROMデータは同じっぽい。
テストプログラムを作って、パソピア7で動作確認
問題なさそう。
初代パソピア用(PA7246)は、ROM BASIC Ver1.1用のサブルーチンがテープで付属している
初代パソピア(Ver1.1)でも、サブルーチンを使って漢字表示できた
表示スピードは、やはりパソピア7の方が速い
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ポート アドレス | リード/ライト | 内容 | CAD1 | CAD0 |
---|---|---|---|---|
18h | ライト | 漢字ROM PAC2下位アドレス8ビット | Low | Low |
19h | ライト | 漢字ROM PAC2中位アドレス8ビット | Low | High |
1Ah | ライト | 漢字ROM PAC2上位アドレス1ビット | High | Low |
18h-1Bh | リード | 漢字ROM PAC2リードデータ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ポートは以下
リードするデータ内容は、デフォルト0xFFで、各ボタンが押されると、以下のビットがLowになる。
初代パソピアに装着して、ジョイスティックを接続する
ジョイスティックのテストプログラム
パソピア7に装着して、テストプログラムを走らせる
STICK命令とSTRIG命令は、両方とも動いている。
STRIG命令は、トリガーAのみ有効だが、IN命令で読み込むとトリガーBのビットも生きていることがわかる
SDカードスロットと一緒に、別基板に配置。
SDカードスロットはピン向きが逆になったので、クロスして配線。
あと本体側との接続ピンと干渉したため、基板をちょっとカット。
合体させると、このように。
上下がぶつからないように、コネクタの長さを調整してネジ止め。
ジョイスティックアダプタの場合、I/Oポートは以下
I/Oポート アドレス | リード/ライト | 内容 | CAD1 | CAD0 |
---|---|---|---|---|
19h | リード | ジョイスティックアダプタ入力ポートA | Low | High |
1Ah | リード | ジョイスティックアダプタ入力ポートB | High | Low |
リードするデータ内容は、デフォルト0xFFで、各ボタンが押されると、以下のビットがLowになる。
bit7 | bit6 | bit5 | bit4 | bit3 | bit2 | bit1 | bit0 |
---|---|---|---|---|---|---|---|
- | - | トリガー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
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化モジュールを接続できるようにしておく
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種類を用意
バッファへのコマンド入出力をBASICのINPUT命令で組んでみた。
こんな感じで、SDカードのファイルからMRAMにデータを読み込む
MRAMは64KB単位で読み書きするようにしたため、SDカードには65,536 bytesのファイルを置いておく必要がある。(スロット7の場合は、4,096 bytes)
セーブ命令も、既にあるファイルに上書きする。
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] : カレントディレクトリの変更SDカードの処理が終わったら、バッファ領域に[戻り値]が書き込まれる。
[path] : パス名 [戻り値]
[戻り値]
(フォルダ名) : カレントフォルダ
(エラー文字列) : エラーが発生した場合
バッファへのコマンド入出力を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程度の遅延がある。
ポーリング中のアルゴリズムを見直した。
IN命令の応答は、前回でもぎりぎりのタイミングだったが、今回ポーリング間隔が広くなってしまったので、応答が間に合うように、ロジックを工夫。
ポーリングに入る前に、PortAの出力値を事前にセットしておき、1clock分を節約するとか。
これで、初代パソピアでも動くようになった。
ロジアナで、波形を確認してみる。
OUTとIN命令を続けて実行すると、以下のようになった。
上が初代パソピア、下がパソピア7
初代パソピアの方は、CSEL2がLowになってから、CWRもしくはCRDがLowになるまで、約230ns程度の遅延がある。
ポーリング中のアルゴリズムを見直した。
RAMPAC_PORT_SET:今までは、CSEL2がLowになるまでポーリングして待っていたが、今回はCWRかCRDがLowになるまでポーリングで待つようにした。
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
・・・
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)は冷えるようになった。
今回は一回り小さい、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)は冷えるようになった。
登録:
投稿 (Atom)