いわゆるアレです。
エミュでは色がおかしかったので、実機での画面。
かなりいいです。
名古屋撃ちもできるとのこと。
動画は、こちら
先日作った128KB RAM PAC2に入っているので、起動はやいです。
| スロット番号 | 機能 | 備考 | 初代パソピアでの利用 |
|---|---|---|---|
| 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 |
| 機能 | コマンド | パラメータ | 戻り値 | 備考 |
|---|---|---|---|---|
| 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されるまで、パスは保持される |
| 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分周選択はしない |
| 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ビット | - | - |
ld 0 [file name] : SDカードの漢字ROMファイルをAVRへロード
[file name] : SDカード漢字ROMファイル名
"/"から始まった場合、絶対パス
[戻り値]
Ok : ロードが成功した場合
(エラー文字列) : エラーが発生した場合
| I/Oポート アドレス | リード/ライト | 内容 | CAD1 | CAD0 |
|---|---|---|---|---|
| 19h | リード | ジョイスティックアダプタ入力ポートA | Low | High |
| 1Ah | リード | ジョイスティックアダプタ入力ポートB | High | 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
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] : パス名 [戻り値]
[戻り値]
(フォルダ名) : カレントフォルダ
(エラー文字列) : エラーが発生した場合
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
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
・・・