2015年5月17日日曜日

Toshiba T100

以前、XPAC2の動作検証で少し紹介したT100
ebayで購入してから、あまり使っていなかったので、少し調べてみる。

箱はボロボロだったが、、

中身は綺麗。
パソピアとキー配列が違う。。

以前作成したROM吸出しプログラムで、BASIC ROMを吸い出す。
ちゃんと、T-BASIC Ver1.1と認識した

フォントROMの吸出しはできないので、昔紹介した手動打ち込みの方法でフォント作成する。
画面に全文字列を表示して、エディタを使ってプチプチ文字データを作成する。

エミュレータのROMファイルを差し替えて起動すると、問題なく起動。
ここだけだと、パソピアと区別つかない。。

ディスクを吸い出して、D88ファイルを作成。
エミュレータだと一部化けているが、CP/Mも動いた

T-DISK BASICも大丈夫

世界時計のアプリ

こんなアプリも入っていた。

これかなぁ。。

サンプルプログラムを動かしてみた。

パソピアのサンプルとちょっと違う。

XPAC2の動作確認もできたし、T100は一旦しまっておこう。

2015年5月16日土曜日

パソピア7でBIOSアクセス

パソピア7にはBIOSが搭載されているので、BIOSコールを試してみる

BIOSを呼びだす場合は、Cレジスタにファンクション番号をセットした後、0005hをコールする。
ファンクション番号によっては、各レジスタに必要なパラメータをセットしておく

BIOSコールを呼び出すBASICプログラムを用意してみました。
100 'Pasopia7 BIOS Call Test (C) 2015 zak
110 CLEAR ,&HEFFF

120 FOR I=&HF000 TO &HF02D
130   READ A$
140   POKE I,VAL("&H"+A$)
150 NEXT I

160 FOR I=0 TO 6
170   IF I=5 THEN PRINT"H"; ELSE IF I=6 THEN PRINT"L"; ELSE PRINT CHR$(I+65);
180   INPUT " Register &H",A$
190   POKE &HF034-I,VAL("&H"+RIGHT$("00"+A$,2))
200 NEXT I

210 A=&HF000:CALL A
220 PRINT"-----"

230 FOR I=0 TO 6
240   IF I=5 THEN PRINT"H"; ELSE IF I=6 THEN PRINT"L"; ELSE PRINT CHR$(I+65);
250   A=PEEK(&HF034-I):
260   PRINT " Register &H";RIGHT$("0"+HEX$(A),2)
270 NEXT I
280 A=PEEK(&HF035)
290 PRINT "F Register &H";RIGHT$("0"+HEX$(A),2)
300 END

310 DATA C5          :'F000 PUSH BC
320 DATA D5          :'F001 PUSH DE
330 DATA E5          :'F002 PUSH HL
340 DATA F5          :'F003 PUSH AF
350 DATA 2A,2E,F0    :'F004 LD HL,(F02Eh)
360 DATA ED,5B,30,F0 :'F007 LD DE,(F030h)
370 DATA ED,4B,32,F0 :'F00B LD BC,(F032h)
380 DATA 3A,34,F0    :'F00F LD A,(F034h)
390 DATA CD,05,00    :'F012 CALL BIOS
400 DATA 32,34,F0    :'F015 LD (F034h),A
410 DATA ED,43,32,F0 :'F018 LD (F032h),BC
420 DATA ED,53,30,F0 :'F01C LD (F030h),DE
430 DATA 22,2E,F0    :'F020 LD (F02Eh),HL
440 DATA F5          :'F023 PUSH AF
450 DATA C1          :'F024 POP BC
460 DATA 79          :'F025 LD A,C
470 DATA 32,35,F0    :'F026 LD (F035h),A
480 DATA F1          :'F029 POP AF
490 DATA E1          :'F02A POP HL
500 DATA D1          :'F02B POP DE
510 DATA C1          :'F02C POP BC
520 DATA C9          :'F02D RET
ちょっと長くなってしまいましたが、エミュレータが使える方はコピペができるので、手で打ち込むより楽で確実です。。

このプログラムを使って、BIOS経由でFDDの情報を読み込んでみます。
FAT情報がTrack18(12h), Head0, Sector1に保存されているので、その内容を読み込んでみます

まずは起動時の「How may disk drives」に、ドライブ数を指定。
FDをセットした後、上記プログラムをRUN

各レジスタにセットするパラメータを聞かれるので、A~Lレジスタの値を入力

FDDパラメータのセット(ファンクション番号18=12h)における、各レジストリの値は以下の通り。
  • A=&H00 (0-2bit:DriveNumber, 3-4bit:0, 5-6bit:DriverType, 7bit=DiskSide) 
  • B=&H10 (Read/Write SectorNumber)
  • C=&H12 (FDD Parameter Set: BIOS Function Number 18=12h)
  • D=&H12 (Track Number: 12h=18)
  • E=&H01 (Sector Number)
  • H=&HE0 (Distnation Address: HL=E000h)
  • L=&H00

Lまで入力してRETURNを押すと、BIOSコールを実行し、戻ってきたレジストリを表示して終了する

続いてディスク読み込み(ファンクション番号19=13h)を行う
パラメータは無いので、Cレジストリに13hのみセットして実行

キャリーフラグ(Fレジスタの0bit)が0なら成功、1なら失敗
Aレジスタが30h(文字の"0")の場合は成功、31h(文字の"1")の場合はNotReadyです

成功した場合は、出力先アドレス(HL)にE000hをダンプしてみるとFAT情報が書き込まれています

FAT情報には、16バイト毎に以下のファイル情報が書かれています
  • 0-8byte:ファイル名
  • 9byte:ファイル属性(BSAVEで保存したファイルは01h)
  • 10byte:クラスタ番号
  • 11-15byte:未使用(FFh)

クラスタ番号は、以下の順番で並んでいる
クラスタ番号ヘッドトラックセクタサイズD88の並び順
00018単密度:128バイト0
1118倍密度:256バイト2
20916単密度:128バイト1
31916倍密度:256バイト3
40118倍密度:256バイト4
51186
609165
719167
・・・
6801718倍密度:256バイト68
6911870
70091669
71191671
7201818倍密度:256バイト72
7311874
74091673
75191675
・・・
13603418倍密度:256バイト136
137118138
1380916137
1391916139
※セクタ番号は、0~ではなく、1~16なので注意
※トラック0・ヘッド0のみ単密度で、1セクタあたり128バイトとなる。
※D88ファイルに吸い出した場合、トラックx・ヘッド0・セクタ1~16 → トラックx・ヘッド1・セクタ1~16の順番で記録されるため、クラスタ番号と並び順が異なる

先ほどダンプしたファイル情報の場合、最初のファイルのクラスタ番号が47h(=71)なので、
トラック:17
ヘッド:1
セクタ:9-16
を見に行くと、ファイルのデータ中身が見えるはず。。

BASICのDSKI$()関数では、トラック0・ヘッド0は取得できない制限がある(ここだけ単密度だから?)ので、どうしても読みたい場合はBIOSを直接コールすると取得できるはず。

試してみると、

結果を見ると、16セクタ×128バイト(単密度)=2048(800h)バイトぶんのデータがE000h~E7FFhに書き込まれていた。


2015年5月14日木曜日

フロッピーに保存したマシン語ファイルの情報

マシン語をバックアップする場合、開始アドレスとデータサイズが必要。
フロッピーにマシン語ファイルを保存した場合、アドレスとサイズを調べるのは難しい。

5インチ2Dのアドレスとサイズを表示するプログラムをパソピア7で組んでみた。
10 'XPAC2 Machine Language File Information (C) 2015 zak
20 INPUT"Device Number? (1 or 2) ",DEVICE
30 FIELD#0,255 AS FAT$
40 FOR SECTOR=1 TO 12
50   FOR I=0 TO 15
60     T1$=DSKI$(DEVICE,0,18,SECTOR)
70     M=ASC(MID$(FAT$,I*16+1,1))
80     IF (M<>0) AND (M<>255) AND(M<>58) THEN GOSUB 130
90   NEXT I
100 NEXT SECTOR
110 END
120 'Find File
130 PRINT MID$(FAT$,I*16+1,9);" ";
140 ATTR=ASC(MID$(FAT$,I*16+10,1))
150 IF (ATTR=&H80) OR (ATTR=&H81) OR (ATTR=&H90) THEN PRINT"[BASIC]";
160 IF (ATTR=&H01) OR (ATTR=&H11) THEN PRINT"[MachineLanguage]";:GOSUB 200
170 PRINT""
180 RETURN
190 'Find Machine Language
200 CLUSTER=ASC(MID$(FAT$,I*16+11,1))
210 TRACK=CLUSTER\4
220 TSECTOR=((CLUSTER MOD 4)\2)*8+1
230 THEAD=CLUSTER MOD 2
240 FIELD#0,4 AS SIZE$
250 T2$=DSKI$(DEVICE,THEAD,TRACK,TSECTOR)
260 START=ASC(MID$(SIZE$,2,1))*256+ASC(MID$(SIZE$,1,1))
270 LAST=ASC(MID$(SIZE$,4,1))*256+ASC(MID$(SIZE$,3,1))
280 PRINT" START:&H";HEX$(START);
290 PRINT" SIZE:&H";HEX$(LAST-START);
300 RETURN

起動時の「How may disk drives」に、ドライブ数を指定。
「width 80」にしておいたほうが見やすい。

実行すると、確認するフロッピーの入っているドライブ番号を聞かれるので入力。

マシン語の場合は、開始アドレスと記録サイズが16進数で表示される。

フロッピーに保存できる最大ファイル数(192)を全てチェックするまで時間がかかるので、気長にお待ち下さい。。

これがわかれば、FDのファイルをXPAC2にデータ保存しやすくなります。


2015年5月6日水曜日

パソピアの漢字コード変換

前回、PASOPIA7用のワープロソフト「WORK7」で日本語を入力したが、かな入力はまだしも、単漢字変換で、文章を作成するのはとても大変。

テキストファイルをパソピアの漢字コードにコンバートするプログラムを考えてみる。

前回のブログで記載したが、前回のブログでパソピア/7の漢字コードは、区番号と点番号のから計算できる。(区番号と点番号は、Wikiなどを参考)
漢字コード=(区番号-1)×94+(点番号-1)+256

以下のアプリを作ってみたので、ここからダウンロードできます。
 ・Kanji Converter(KanjiConv.exe):S-JISコードをPasopia7の漢字コードに変換
  Windowsプログラムです。以下のファイル形式で保存できます。
  (1) バイナリ(*.bin)で保存
   2バイト毎で漢字コード(リトルエンディアン)が保存されます。
   ファイルサイズは、2048バイトの倍数でサイズ調整(0埋め)されます。
  (2) CSVで保存
   漢字コードは、10進数のカンマ区切りで出力されます。

 ・Display Kanji(DispKJ.bin)
  パソピアのRAM PAC2イメージです。以下のXPAC2の以下コマンドでマウントできます。
   sv 3 text.rom
  以下の2つのBASICプログラムが登録されいます。
  (1)DISPKJ:XPAC2に保存された漢字コードのバイナリデータを読み込んで表示します。
   Kanji Converterで作成したバイナリの漢字コードを利用できます。
  (2)MANUAL:XPAC2のマニュアルの一部を表示します。
   Kanji Converterで作成したCSVを使っています。
  ※(1)(2)共に、プログラム実行前に「SCREEN 1」又は「SCREEN 2」にしておきます。

以下、使い方です。

S-JISテキストをパソピアの漢字コードに変換するWinアプリ「KanjiConv.exe」(.NET 4.0が必要)

ファイルからS-JISテキストファイルを読み込む、もしくはテキストボックスに直接テキストを読み込み、Saveボタンを押します。
ファイルを保存ダイアログで、バイナリ(*.bin)で保存するか、CSVで保存するか選択します。

バイナリで保存した場合、2バイト毎で漢字コード(リトルエンディアン)が保存されます。
ファイルサイズは、XPAC2で読み込めるように、2048バイトの倍数でサイズ調整(0埋め)されます。

例えば、text.binと保存したバイナリファイルを、スロット3(デバイス番号6)に保存する場合、コマンドプロンプト「CMD」で、以下のように実行します
sv 3 text.rom

パソピア7でバイナリの漢字コードを読み込んで表示するプログラム「DISPKJ」を用意しました。
10 'XPAC2 Display Kanji (C) 2015 zak
20 R$=CHR$(13)+CHR$(10)
30 INPUT"Width ";W:WIDTH W
40 PRINT"Select Slot Number."
50 PRINT"[3] 64KB MRAM (DEVICE 6)"
60 PRINT"[4] 64KB MRAM (DEVICE 5)"
70 PRINT"[5]  8KB SRAM"
80 PRINT"[6]  4KB SRAM"
90 PRINT"[7]  2KB SRAM"
100 INPUT S:IF S<3 OR S>7 GOTO 40
110 INPUT"Start Address &H",A$
120 L=VAL("&H"+RIGHT$("00"+A$,2))
130 H=VAL("&H"+LEFT$(RIGHT$("0000"+A$,4),2))
140 LOCATE 0,24
150 OUT &H1B,S:OUT &H19,H:OUT &H18,L:A=INP(&H1A)
160 IF L<255 THEN L=L+1 ELSE L=0:H=H+1
170 OUT &H1B,S:OUT &H19,H:OUT &H18,L:B=INP(&H1A)
180 K=B*256+A:IF K=0 THEN PRINT R$:END
190 IF K=255 THEN X=0:PRINT R$:GOTO 220
200 PUT%(X,23),KANJI(K),7
210 IF X<W-2 THEN X=X+2 ELSE X=0:PRINT R$
220 IF L<255 THEN L=L+1 ELSE L=0:H=H+1
230 GOTO 150

パソピア7の場合は、200行目にあるPUT%()命令でテキスト画面に漢字を表示することかできます。
「SCREEN 1」もしくは「SCREEN 2」で実行します。プログラムを実行すると画面幅を聞かれますので、40 or 80を入力します。続いてバイナリの漢字コードが保存されているスロット(上記の例の場合は3)を選択し、読み込み開始アドレスを入力します。

「KanjiConv.exe」アプリでCSVに漢字コードを保存した場合、そのままDATA文としてコードに書き込むことで漢字コードを利用して画面表示できます。

CSVの漢字コードをDATA文に組み込んで、XPAC2のマニュアルの一部を表示するプログラム「MANUAL」を用意しました。
こちらもPUT%を使っているので、実行前に「SCREEN 1」もしくは「SCREEN 2」にしておきます。
10 'XPAC2 Display Manual (C) 2015 zak
20 R$=CHR$(13)+CHR$(10)
30 WIDTH 80
40 LOCATE 0,24
50 READ K
60 IF K=0 THEN PRINT R$:END
70 IF K=255 THEN X=0:PRINT R$:GOTO 50
80 PUT%(X,23),KANJI(K),7
90 IF X<80-2 THEN X=X+2 ELSE X=0:PRINT R$
100 GOTO 50

300 DATA 680,660,683,633,286,466,4440,650,714,691,642,283,672,313,499,491
・・・(略)
2610 DATA 550,599,562,258,255,0

以下のように、スクロールしながらマニュアルが表示されます。

これで、日本語表示がいくぶん楽にできるようになった。。

XPAC2の漢字ROMを使って印刷

前回漢字ROMデータを書き込んだXPAC2で、実際にパソピアで漢字を出力してみます。

I/Oポートを直接たたく場合、以下のアドレスから操作します。
I/Oポートアドレス内容
18h漢字ROM PAC2下位アドレス8ビット
19h漢字ROM PAC2中位アドレス8ビット
1Ah漢字ROM PAC2上位アドレス1ビット

上位・中位・下位の合計17ビットで128KBのアドレスを指定した後、18h~1Bhのどれかで8ビットデータをリードします。

初代パソピア(T-BASIC Ver1.1)で漢字を利用する場合、漢字ROM PAC2(PA7246)付属のサブルーチンを読み込んでおく必要があります。また、スロット2を指定(OUT &H1B,2)してから、BASIC命令を呼びます。

パソピア7(T-BASIC7)の場合、そのままBASICの漢字命令を利用することができます。

グラフィック画面に描画するPUT@命令は、初代パソピア、パソピア7両方で利用できます。
文字として表示するPUT%命令は、パソピア7のみで利用できます。

漢字ROMの動作確認プログラム
100 SCREEN 2:WIDTH 80
110 R$=CHR$(13)+CHR$(10)
120 FOR KU=1 TO 47
130   FOR TEN=1 TO 94
140     K=(KU-1)*94+(TEN-1)+256
150     PUT@(X,Y),KANJI(K),PSET
160     X=X+16
170     IF X>=640 THEN X=0:Y=Y+16
180     IF Y>=192 THEN Y=0
190   NEXT TEN
200 NEXT KU

順番に漢字が表示されます。

リスト中の区(KU)と点(TEN)の変数については、Wikiなどを参考にしてもらえればと。
パソピアの漢字コードの計算は、以下の通り。
漢字コード=(区番号-1)×94+(点番号-1)+256

アプリを使って検証してみます。
使ったソフトは、PASOPIA7用のワープロソフト「WORK7」

ローマ字入力は無いので、かな入力で入力。
文節変換も無いので、1文字ずつ単漢字変換。。。
すんごい大変。。

ドットプリンターで印刷してみる。
動画はこちら。
リボンは、3年ほど前に買ったもの
30年以上経っているのに、ドットプリンターは堅牢だなぁ。。。

印刷結果
意外と綺麗に印刷できる。

もしかしてパソピア、まだ実用できるんじゃないか。
いや、、ないか。

2015年5月4日月曜日

XPAC2に書き込む漢字ROMデータの作成

XPAC2は、Atmelの8ビットマイコン「ATMega1284P」を搭載しています。
このマイコンは、
・128KBフラッシュメモリ(書き換え回数 1万回)
・4KB EEPROM(書き換え回数 10万回)
・16KB SRAM
のメモリを持っています。

SDカードのFAT処理などのメイン処理(8KB)はフラッシュメモリのブートローダー領域(1E000h-1FFFFh)に書き込まれていますが、残り120KBがもったいない、、、ということで、ここに漢字ROMデータを書き込むこととします。

漢字ROMは128KBなので、8KB不足するぶんはSRAMの8KBを漢字データ領域として利用し、電源起動時にEEPROM(4KB)からデータを読み込むようにします。
まとめると、、
漢字ROMアドレスデータ保持領域備考
00000h-05FFFhフラッシュメモリ(00000h-05FFFh)
06000h-07FFFhSRAM(8KB)起動時にEEPROM(4KB)からデータをSRAMに展開
起動後は、スロット番号5でSRAMデータ読み書き可能
08000h-1FFFFhフラッシュメモリ(06000h-1DFFFh)以降のフラッシュメモリ(1E000h-1FFFFh)はブートローダー領域として使用
EEPROM(4KB)に8KBの漢字データを圧縮して保存するため、圧縮効率がよい漢字データ領域(06000h-07FFFh)をSRAMに持たせることにしました。

出荷時、EEPROMには付属ソフトが記録されており、スロット番号5で利用できます。
漢字ROMデータの一部がEEPROMに圧縮して保存されるため、漢字ROMデータを書き込むと、出荷時の付属ソフトは消えますので、ここを参考にバックアップしておいてください。


漢字ROMイメージファイルの作成方法は2つあります。

(1) 互換ROMデータを作成する
武田氏のパソピアエミュレータサイトに、互換漢字ROMデータ作成ツール(mkfont.exe)があります。
Windowsのフォントから互換漢字ROMデータ (131,072バイト)を作成できます。

(2) 漢字ROM PAC2から吸い出す
パソピア用(PA7246)とパソピア7用(PA7247)、どちらからでも同じROMデータを作成できます。

以前紹介した吸出し方法でも問題ありませんが、Wave経由なのでデータ化けなどが心配です。
せっかくSDカードがついているので、SDカードを保存する方法を考えます。

パソピア/7に漢字ROMを装着し、以下のプログラムを実行します。
10 'XPAC2 Save KanjiROM to RAM (C) 2015 zak
20 CLEAR ,&HEFFF
30 FOR I=&HF000 TO &HF02D
40 READ A$
50 POKE I,VAL("&H"+A$)
60 NEXT I
70 DEF FNF$(X)=RIGHT$("00"+HEX$(X),3)
100 PRINT"Select Save Area."
110 FOR I=1 TO 8
120 PRINT"["+HEX$(I)+"] "+FNF$((I-1)*64)+"00h-"+FNF$(I*64-1)+"FFh"
130 NEXT
140 INPUT A$:IF A$<"1" OR A$>"8" GOTO 140
150 A=VAL(A$)
160 POKE &HF02E,0
170 POKE &HF02F,&H40*((A-1) MOD 4)
180 POKE &HF030,-(A>4)
190 A=&HF000:CALL A
200 DATA C5,D5,E5,F5,3E,02,D3,1B,3A,30,F0,D3,1A,21,00,A0
210 DATA ED,5B,2E,F0,0E,19,ED,51,0E,18,ED,59,DB,1A,77,23
220 DATA 1C,20,F7,14,3E,E0,BC,20,EB,F1,E1,D1,C1,C9

「Select Save Area」でエリア番号を指定し、漢字ROMのデータ16KBをメモリに保存。カセットに保存する場合は「bsave#-1,"KANJI",&HA000,&h4000」、フロッピーディスクに保存する場合は、「bsave"KANJI*",&HA000,&h4000」を実行します。(*には、選択したエリア番号を指定する) これを1~8まで繰り返し、合計8ファイルをカセットもしくはディスクに保存します。

続いてPCを使って16384バイトのファイルを8つ作成し、SDカードに保存します。
Windows XP以降のコマンド・プロンプト上で作成する場合、以下のコマンドで作成できます。
fsutil file createnew kanji1.rom 16384
fsutil file createnew kanji2.rom 16384
fsutil file createnew kanji3.rom 16384
fsutil file createnew kanji4.rom 16384
fsutil file createnew kanji5.rom 16384
fsutil file createnew kanji6.rom 16384
fsutil file createnew kanji7.rom 16384
fsutil file createnew kanji8.rom 16384

XPAC2に8つのファイルが保存されたSDカードをセットし、パソピアに装着します。
以下のプログラムを入力し、「SAVRAM」というファイル名でXPAC2に保存します。(スロット3以外に保存します)
10 'XPAC2 Save Pasopia 64KB RAM to MRAM (C) 2015 zak
20 CLEAR ,&HEFFF
30 FOR I=&HF000 TO &HF021
40 READ A$
50 POKE I,VAL("&H"+A$)
60 NEXT I
100 PRINT"Select Slot Number."
110 PRINT"[3] 64KB MRAM (DEVICE 6)"
120 PRINT"[4] 64KB MRAM (DEVICE 5)"
130 INPUT A$:IF A$<"3" OR A$>"4" GOTO 130
140 OUT &H1B, ASC(A$)
150 A=&HF000:CALL A
200 DATA C5,E5,F5,3E,02,D3,3C,21,00,00,0E,19,ED,61,0E,18
210 DATA ED,69,7E,D3,1A,2C,20,F8,24,20,EF,AF,D3,3C,F1,E1
220 DATA C1,C9

先ほど保存した漢字ROMデータを読み込みます。
・カセットから読み込む場合は、「bload#-1,"KANJI",0」
・フロッピーディスクから読み込む場合は、「bload"KANJI*",0」
を実行します。ロードしたら「SAVRAM」を実行し、スロット3のMRAM領域にコピーします。
続いてコマンドプロンプト「CMD」から以下のコマンドを実行し、SDカードに漢字ROMデータを保存します。
sv 3 kanji1.rom
これを8回繰り返し、SDカードのkanji1.rom~kanji8.romに漢字ROMデータを記録させます。

最後にPCを使ってkanji1.rom~kanji8.romを結合、128KBの漢字ROMデータ作成します。
Windowsのコマンド・プロンプト上で結合する場合、以下のコマンドで作成できます。
copy /b kanji1.rom+kanji2.rom+kanji3.rom+kanji4.rom+kanji5.rom+kanji6.rom+kanji7.rom+kanji8.rom kanji.rom

作成した漢字ROMデータをSDカードに保存する場合、XPAC2付属のコマンドプロンプト「CMD」で漢字ROMを書き込みします。
もし漢字ROMデータが、「kanji.rom」というファイル名でSDカードに保存されている場合、
sv 2 kanji.rom
ld 2 kanji.rom (※2020/5 誤記修正)
というコマンドになります。
これでATMega1284PのフラッシュメモリとEEPROMに、漢字ROMデータが保存されます。

もし出荷時のデータに戻したい場合は、「eep_rev1.rom」ファイルもしくは「eep_rev2.rom」ファイルをダウンロード、「eep.rom」にリネームしてSDカードにコピー
sv 2 eep.rom
ld 2 eep.rom (※2020/5 誤記修正)
で戻すことができます。
出荷時に保存してあるプログラムは、行番号が1桁になっていたり、無理に1行にまとめたり、読みにくくなっていますが、4KBのEEPROMに圧縮して入れなければならなかったので、このようなプログラムになってしまいました。。

2015年5月2日土曜日

パソピア7のRAMデータをXPAC2に保存

パソピア7のROM/裏RAM/表RAMのデータをXPAC2に保存するツール「SVRAM」を用意しました。
ここからダウンロードできます。

zipファイルを解凍すると、
・SVRAMを保存したXPAC2の64KBイメージ「SvRam.bin」
・BASICのテキストファイル「SvRam.bas」
・アセンブラリスト「SvRam.als」
が作成されます。

ダウンロードしたzipファイルを展開し、「SvRam.bin」をSDカードに保存します。
続いて、以下サイズのファイルを作成します。
パソピア7「BIOS.ROM」 ... 16384バイト
パソピア7「BASIC.ROM」 ... 32768バイト
パソピア「BASIC11.ROM」 ... 32768バイト

Windowsのコマンド・プロンプト上で作成する場合、以下のコマンドで作成できます。(WinXP以降)
fsutil file createnew BIOS.ROM 16384
fsutil file createnew BASIC.ROM 32768
fsutil file createnew BASIC11.ROM 32768

作成した3つのファイルをSDカードにコピーしてXPAC2に装着した後、パソピア7の電源を入れます。

Slot4(ドライブ5)に展開する場合、コマンドプロンプト「CMD」を実行し、以下コマンドを実行します。
ld 4 SvRam.bin

BASICにもどり、SVRAMを起動します。
run"SVRAM"
パソピアかパソピア7かは、自動で判別します。
保存先のMRAM(スロット3 or スロット4)を選択します。

BIOSファイルを保存する場合、以下のように入力します。
Memory Mode (1:BIOS, 2:RAM, 4:V-RAM, 8:I/O Memory Mode) ?1
Source Address &H4000
Translation Byte &H4000
Destination Address &H0
SD Card Path Name? bios.rom
BASICファイルを保存する場合、以下のように入力します。
Memory Mode (1:BIOS, 2:RAM, 4:V-RAM, 8:I/O Memory Mode) ?8
Source Address &H0
Translation Byte &H8000
Destination Address &H0
SD Card Path Name? basic.rom
これで、BIOS.ROMとBASIC.ROMは、SDカードに保存されます。

初代パソピアの場合は、ROM PACが刺さっているかどうかによって入力値が変わります
上写真のようにROM PACにてT-BASICが動作する場合は、
以下のようにBASICファイルを保存します。
Memory Mode (0:Onboard ROM, 1:ROM Pack, 2:64KRAM Mode) ?1
Source Address &H0
Translation Byte &H8000
Destination Address &H0
SD Card Path Name? basic11.rom
これで、BIOS.ROMとBASIC.ROMは、SDカードに保存されます。
オンボードROMを吸い出す場合、Memory Modeで「0」を入力します。

パソピア7の場合、Memory Modeを変更することで、V-RAMや裏RAMを保存できるようになっています。

ご活用下さい

最後にBASICソースも追記します。
10 'XPAC2 Save RAM to RAMPAC2 (C) 2015 zak

20 CLEAR ,&HEFFF
30 DEF FNR(X$)=VAL("&H"+RIGHT$("00"+X$,2))
40 DEF FNL(X$)=VAL("&H"+LEFT$(RIGHT$("0000"+X$,4),2))
50 S=&HF000:E=&HF064
60 FOR I=S TO E
70   READ A$
80   POKE I,VAL("&H"+A$)
90 NEXT I

100 '--- Version Check ---
110 P=PEEK(&HFFFB):V=0
120 IF P=&H58 THEN V=1:PRINT"T-ROM Ver 1.0"
130 IF P=&H0C THEN V=2:PRINT"T-ROM Ver 1.1"
140 IF P=&H76 THEN V=3:PRINT"T-DISK Ver 1.0"
150 IF P=&H45 THEN V=4:PRINT"T-DISK Ver 2.0"
160 IF P=&H84 THEN V=5:PRINT"T-BASIC7 Ver 1.0":S=&HF012
170 IF V=0 THEN PRINT"Unknown Version":END

190 '--- Select PAMPAC2 Slot ---
200 PRINT"Select Slot Number."
210 PRINT"[3] 64KB MRAM (DEVICE 6)"
220 PRINT"[4] 64KB MRAM (DEVICE 5)"
230 INPUT N:IF N<3 OR N>4 GOTO 230
240 OUT &H1B,N

290 '--- Set Parameters ---
300 PRINT"Memory Mode ";
310 IF V=5 THEN INPUT"(1:BIOS, 2:RAM, 4:V-RAM, 8:I/O Memory Mode) ?",M ELSE INPUT"(0:Onboard ROM, 1:ROM Pack, 2:64KRAM Mode) ?",M
320 IF V=5 AND M=4 THEN INPUT"V-RAM Select (11H:Blue, 22H:Red, 44H:Text/Green) &H",VS$
330 INPUT"Source Address &H",SA$
340 INPUT"Translation Byte &H",TB$
350 INPUT"Destination Address &H",DA$
360 POKE E-7,M:'F05Dh MemoryMode
370 POKE E-6,VAL("&H"+VS$) :'F05Eh V-RAM Select
380 POKE E-5,FNR(SA$):'F05Fh Source Address
390 POKE E-4,FNL(SA$):'F060h
400 POKE E-3,FNR(TB$):'F061h Translation Byte
410 POKE E-2,FNL(TB$):'F062h
420 POKE E-1,FNR(DA$):'F063h Destination Address
430 POKE E  ,FNL(DA$):'F064h
440 CALL S

490 '--- Save to SD Card ---
500 INPUT "SD Card Path Name";A$
510 IF A$="" THEN END
520 A$="SV "+CHR$(&H30+N)+" "+A$
530 OUT &H1B,7:OUT &H19,0
540 FOR I=0 TO 255
550   OUT &H18,I
560   B$=MID$(A$,I+1,1)
570   IF B$="" GOTO 600
580   OUT &H1A,ASC(B$)
590 NEXT I
600 OUT &H1A,0:OUT &H18,0:OUT &H1B,15
610 C=INP(&H1A):IF C>=254 GOTO 610
620 FOR I=0 TO 255
630   OUT &H18,I
640   C=INP(&H1A)
650   IF C=0 THEN PRINT"":END
660   PRINT CHR$(C);
670 NEXT I

690 ' --- Data ---
700 DATA C5,D5,E5,F5,DB,22,E6,0C,0F,0F,0F,30,02,F6,02,F5
710 DATA 18,09,C5,D5,E5,F5,DB,22,E6,03,F5,F3,3A,5D,F0,D3
720 DATA 3C,3E,03,D3,0F,3A,5E,F0,D3,0C,3E,08,D3,0D,FB,ED
730 DATA 4B,5F,F0,ED,5B,61,F0,2A,63,F0,7C,D3,19,7D,D3,18
740 DATA 0A,D3,1A,03,1B,7A,B3,28,06,2C,20,F1,24,20,EB,F3
750 DATA F1,D3,3C,3E,02,D3,0F,FB,F1,E1,D1,C1,C9,08,11,00
760 DATA 00,00,00,00,00