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

2015年4月27日月曜日

パソピア7のVRAMイメージ表示

RGBイメージをパソピア7で表示する「LDVRAM (Load VRAM)」というアプリを用意しました。
ここからダウンロードできます。

LDVRAM/SVVRAMを保存したXPAC2の64KBイメージ「vram.bin」と、各アセンブラリスト「*.als」が入っています

ダウンロードしたzipファイルを展開し、「vram.bin」をSDカードに保存。
SDカードをXPAC2に装着した後、パソピア7の電源を入れます。
Slot4(ドライブ5)に展開する場合、コマンドプロンプト「CMD」を実行し、以下のコマンドを実行します。
ld 4 vram.bin

BASICにもどり、640×200ドットのスクリーンに変更し、LDVRAMを起動します。
width 80:screen 2
run"LDVRAM"

マシン語は自動で読み込まれます。
VRAMイメージを読み込みするMRAMのスロットが聞かれるので、
Select Slot Number.
[3] 64KB MRAM (DEVICE 6)
[4] 64KB MRAM (DEVICE 5)
「3」か「4」で指定します。

続いて、MRAMに読み込むRGBファイルのパスを聞かれますので、
SD Card Path Name?
SDカードからVRAMイメージを読み込む場合、RGBファイルのファイルパスを入力します。

※SDカードからファイルを読み込む場合、最初に指定したMRAMスロットのデータは、RGBファイルのデータに上書きされて消えるので注意してください。

何も入力せずにRETURNキーのみだと、SDカードからはファイルを読み込みません。

RGBファイルパスの中に###を入れると、000~255まで自動でインクリメントされ、ファイルを読み込み続けます。その場合、次に聞かれる
COUNT NUMBER (0-255)
で、カウント回数を入力します。1つのファイルしか読み込まない場合、数を入力せずRETURNキーのみを押してください。
VRAMイメージを読み込んだ後、画像が表示されます。

ファイル名に###が含まれていた場合、以下の順番で画像を繰り返し読み込みます。
(1) SDカードのRGBファイルを指定したMRAMにコピー
(2) MRAMからパソピア7のVRAMにデータ転送
(3) ファイル名の###をインクリメントして、(1)に戻る
SDカードからファイル読込みしている間にSTOPキーを押すと、中断することができます。

以下、動画です。
10年ほど前の、シアトル・ニューヨークなどの写真を読み込ませてみました。

2015年4月26日日曜日

パソピア7のVRAMイメージを作成

パソピア7のVRAMイメージを作成するWindowsアプリを作ってみました。
.NET Framework 4.0で動作する(はず)
ダウンロードはここから(2018/12/23更新)

まずEXEを起動して、右上の「...」ボタンを画像ファイルを読み込みます。
もしくは、画像をアプリの上にドラッグ&ドロップしても読み込みます。

読み込める画像フォーマットはBMP/JPEG。
パソピア7から吸い上げたVRAMイメージ(RGBファイル)も読み込むことができます。

正常に読み込んだ場合、画像が表示されます

Size欄には元画像のサイズがセットされているので、変更したい幅と高さを入力して「Resize」ボタンを押すと、そのサイズに画像がストレッチされます。

画像サイズを640x200ドットにして「Save ...」ボタンを押すと、パソピア7のVRAMイメージ(RGBファイル)に保存することができます。

但し、8色にダイレクトに減色されるので、以下のような画像になってしまいます

画像サイズを変更した後に「Reduce Color」ボタンを押すと、誤差拡散で8色に減色できます。
8色なので限界はありますが、写真の場合はこちらの方が自然かと。。
誤差拡散で8色に減色した画像はRGBファイル以外にも、BMP/PNGで保存できます。

作成したVRAMイメージ(RGBファイル)をパソピア7で表示すると、、、

パソピア7での表示については後述

2015年4月25日土曜日

パソピア7のVRAMをSDカードに保存

以前のブログでも紹介しましたが、パソピア7のVRAMアドレスは少々特殊で、

640×200ドットのSCREEN 2の場合、
1文字 = 横8ビット × 縦8バイト = 8バイト
1行 = 80文字 × 8バイト = 640バイト
1プレーン = 25行 × 640バイト = 16000バイト
1画面 = 3プレーン(R/G/B) × 16000バイト = 48000バイト

XPAC2には、64KB×2のMRAMエリアがあるので、MRAMを経由してVRAMデータをSDカードに保存してみる。
データは、以下のフォーマットでR/G/Bの順番に保存します。
0000h



3E7Fh
REDのVRAMデータ
(16000バイト)
3E80h

3FFFh
Filler (384バイト)
4000h



7E7Fh
GREENのVRAMデータ
(16000バイト)
7E80h

7FFFh
Filler (384バイト)
8000h



BE7Fh
BLUEのVRAMデータ
(16000バイト)
8E80h

BFFFh
Filler (384バイト)
各プレーンで384バイトの隙間が出来てしまうが、そのまま空けて保存します。

まずは、640×200ドットのスクリーンに変更

以下プログラムを入力して実行
10 'XPAC2 Save VRAM to RAMPAC2 (C) 2015 zak
20 CLEAR ,&HEFFF
30 S=&HF000:E=&HF0A2
40 IF PEEK(S)=&HC5 THEN 100
50 FOR I=S TO E
60   READ A$
70   POKE I,VAL("&H"+A$)
80 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 POKE E-2,ASC(A$)
150 INPUT "SD Card Path Name";A$
160 FOR I=0 TO 255
170   B$=MID$(A$,I+1,1)
180   IF B$="" THEN POKE E+I,0:GOTO 210
190   POKE E+I,ASC(B$)
200 NEXT I
210 CALL S
220 OUT &H1B,7:OUT &H19,0
230 FOR I=0 TO 255
240   OUT &H18,I
250   C=INP(&H1A)
260   IF (C=0) OR (I=0 AND CHR$(C)="O") THEN END
270   PRINT CHR$(C);
280 NEXT I
300 DATA C5,D5,E5,F5,F3,DB,22,E6,03,F6,04,D3,3C,3E,03,D3
310 DATA 0F,3A,A0,F0,D6,30,D3,1B,11,00,00,3E,08,D3,0D,3E
320 DATA 22,D3,0C,CD,79,F0,3E,44,D3,0C,CD,79,F0,3E,11,D3
330 DATA 0C,CD,79,F0,DB,22,E6,03,D3,3C,3E,02,D3,0F,FB,3A
340 DATA A2,F0,B7,28,2F,3E,07,D3,1B,11,00,00,21,9D,F0,0E
350 DATA 19,ED,51,0E,18,ED,59,7E,B7,28,09,23,D3,1A,1C,20
360 DATA F4,14,20,EB,3E,0F,D3,1B,3E,0F,3D,20,FD,DB,1A,F6
370 DATA 01,3C,28,F9,F1,E1,D1,C1,C9,21,00,80,0E,19,ED,51
380 DATA 0E,18,ED,59,3E,BE,BC,20,05,3E,80,BD,28,0A,7E,23
390 DATA D3,1A,1C,20,ED,14,20,E4,1E,00,14,14,C9,53,56,20
400 DATA 20,20,00

マシン語で直接入力する場合は、以下のチェックサムになります。

実行すると、保存するMRAMのスロット番号を聞かれるので、保存先のスロット番号を入力
SDカードにも保存する場合は、SDカードに49152バイトのデータを用意しておき、そのファイルへのパスを入力します。

指定したスロット番号のMRAMにVRAMデータが書込まれ、SDカードパスを指定していれば、MRAMに書き込んだデータが指定したファイルに書込みされます。

但し、パソピア7のVRAM Greenプレーンはテキストと共用のため、画面上に文字があった場合Greenデータの中にテキストデータも含まれてしまいます。

2015年4月14日火曜日

アルフォスをJoystickで

XPAC2を使うと、STICKやSTRIG命令などT-BASIC7で用意されているジョイスティック命令を利用することができます。

I/Oポートから直性データを取得する場合、以下のアドレスから操作します。
I/Oポートアドレス内容
19hジョイスティックアダプタ入力ポートA
1Ahジョイスティックアダプタ入力ポートB
I/Oポートを直接叩くのは、初代パソピアでも使えます。

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

せっかくなので、Alphosでジョイスティックを利用できるようにしてみました。
以前紹介したパッチでは、純正のJOY PAC2でも動作しなかったので、全面見直し。
見直したパッチはこちら(277行目以降が、ジョイスティックのパッチ)
271 INPUT"Mnemonic? (1-255)",B:IF (B>0) AND (B<256) THEN POKE &HC80A,B-1
272 INPUT"Ground Attack? (Y/N)",C$:IF C$="N" OR C$="n" THEN POKE &HE587,0:POKE &HE588,0:POKE &HE589,0
273 INPUT"Interceptor? (Y/N)",C$:IF C$="N" OR C$="n" THEN POKE &HE590,0:POKE &HE591,0:POKE &HE592,0
274 INPUT"Sound? (Y/N)",C$:IF C$="N" OR C$="n" THEN POKE &HE596,0:POKE &HE597,0:POKE &HE598,0
275 INPUT"Endress? (Y/N)",C$:IF C$="Y" OR C$="y" THEN POKE &HE607,0
276 INPUT"High Speed? (Y/N)",C$:IF C$="Y" OR C$="y" THEN POKE &HD12D,&HC9
277 FOR I=1 TO 6:READ A$,B$:A=VAL("&H"+A$):POKE A-1,&HC3:POKE A,VAL("&H"+B$):POKE A+1,&HF1:NEXT
278 FOR A=&HF100 TO &HF1AA:READ B$:POKE A,VAL("&H"+B$):NEXT
279 OUT &H1B,1

390 DATA D2BA,56,E4AA,00,E54B,09,E5A5,12,E8F5,33,E920,46
400 DATA E5,21,AD,E4,22,31,F1,18,10,E5,21,4E,E5,22,31,F1
410 DATA 18,07,E5,21,A8,E5,22,31,F1,D3,30,DB,31,6F,DB,19
420 DATA 67,E6,03,20,02,CB,BD,7C,E6,0C,20,02,CB,BD,7D,E1
430 DATA C3,00,00,DB,31,C5,4F,DB,19,F6,F3,07,07,47,07,A0
440 DATA A1,C1,2F,C3,F7,E8,DB,31,C5,4F,DB,19,0F,0F,0F,0F
450 DATA A1,C1,2F,C3,22,E9,E5,4F,DB,19,2F,E6,3F,21,6B,F1
460 DATA 85,6F,7E,A1,32,26,EC,E1,C3,BC,D2,5F,5E,5B,5A,4F
470 DATA 4E,4B,4A,1F,1E,1B,1A,0F,0E,0B,0A,57,56,53,52,47
480 DATA 46,43,42,17,16,13,12,07,06,03,02,5D,5C,59,58,4D
490 DATA 4C,49,48,1D,1C,19,18,0D,0C,09,09,55,54,51,50,45
500 DATA 44,41,40,15,14,11,10,05,04,01,00

XPAC2の場合、Joystick1(SDカードの隣)の方にジョイスティックを接続してください。

上記のパッチを当てたALPHOSを起動。自分の好みに応じて、オプションを入力

オープニングが表示された後に、


ジョイスティックの
「SELECT」 (0bit[上]と1bit[下]が同時にLow)、
「RUN」 (2bit[左]と3bit[右]が同時にLow)
を押すと、ゲームスタートです。

ゲーム中の画面

十字キーで上下左右に移動、2ボタン対応のジョイスティックの場合、ボタンの配置は
Aボタン=Zキー(BOMB)
Bボタン=Xキー(MISSILE)
ジョイスティックもテンキーも、どちらも使えるようにしました。

ハイスコアの入力画面では

左右キーで文字選択、A or Bボタンで決定になります。

MRAMは64KBあるので、Alphosの場合、全てのプログラムを保存できます。
マシン語の保存先アドレスと、サイズは以下の通りです。
alpdat &H0000, &H6800
alpmap &H9000, &H2A00
alpobj &HC800, &H2200
Joystickパッチと合わせて、MRAMから起動できるように保存しておくと快適です。