2012年2月24日金曜日

パソピアのエミュレータ

東芝のパソコンというと、御三家に比べてマイナーでソフトも少なかった。
そんなマイナー機のエミュレータを作っている人がいて、ちょっと感動。
ありがたく使わせてもらう。

まずはパソピア7。BIOSとBASICを吸い出す必要があるので、実機を用意。
データレコーダーとの接続ケーブルも必要。

録音は ぷちれこ(PetitRec)を使用。設定は48000Hz/8ビット/モノラルで録音。
Vistaでは録音できなかったのでXPで使用。XPなら64bit版XPでも大丈夫だった。

データレコーダー接続ケーブルの録音端子(赤)を、PCのライン入力に接続。
サウンドカードによっては結構ノイズを拾ってしまうので、品質の良いサウンドカードをお勧め。

パソピア7で、以下を入力。
コメントを入れるとオーバーメモリーになるので、コメント部分は入力しないどく
1000 CLEAR ,&H8FFF
1010 WIDTH 80
1020 GOSUB 2010
1030 GOSUB 9010
1040 IF VER<>5 THEN GOSUB 9010
1050 GOSUB 2110
1060 A=&HF000:CALL A
1070 S=VAL("&H"+DA$)
1080 GOSUB 3010
1090 PRINT "":PRINT "... "
1100 S=VAL("&H"+DA$)+VAL("&H"+TB$)-128
1110 GOSUB 3010
1990 END

2000 '--- Version Check ---
2010 P=PEEK(&HFFFB)
2020 IF P=&H58 THEN VER=1:PRINT"T-ROM Ver 1.0"
2030 IF P=&H0C THEN VER=2:PRINT"T-ROM Ver 1.1"
2040 IF P=&H76 THEN VER=3:PRINT"T-DISK Ver 1.0"
2050 IF P=&H45 THEN VER=4:PRINT"T-DISK Ver 2.0"
2060 IF P=&H84 THEN VER=5:PRINT"T-BASIC7 Ver 1.0"
2070 IF VER=0 THEN PRINT"Unknown Version"
2080 RETURN

2100 '--- Set Parameter ---
2110 A=&HF0F0
2200 PRINT"Memory Mode ";
2210 IF VER=5 THEN PRINT"(1:BIOS, 2:RAM, 4:V-RAM, 8:I/O Memory Mode)"; ELSE PRINT"(0bit:ROM[0:OnboardROM, 1:ROM Pack], 1bit:RAM[0:ROM Mode, 1:64KRAM Mode])";
2220 INPUT" &H",MM$
2300 POKE A+0, VAL("&H"+MM$) :'F0F0 メモリーモード 0bit:BIOS, 1bit:RAM, 2bit:V-RAM, 3bit:I/O Memory Mode
2310 POKE A+1, VAL("&H"+VS$) :'F0F1 V-RAM Select 11H:Blue, 22H:Red, 44H:Text/Green
2320 POKE A+2, VAL("&H"+RIGHT$(SD$,2)):'F0F2 転送元アドレス
2330 POKE A+3, VAL("&H"+LEFT$(SD$,2))
2340 POKE A+4, VAL("&H"+RIGHT$(DA$,2)):'F0F4 転送先アドレス
2350 POKE A+5, VAL("&H"+LEFT$(DA$,2))
2360 POKE A+6, VAL("&H"+RIGHT$(TB$,2)):'F0F6 転送バイト数
2370 POKE A+7, VAL("&H"+LEFT$(TB$,2))
2380 RETURN 

3000 ' --- Display Memory ---
3010 FOR I=S TO S+127
3020 IF I MOD 16=0 THEN PRINT "":PRINT RIGHT$("000"+HEX$(I),4);": ";
3030 A=PEEK(I):PRINT RIGHT$("0"+HEX$(A),2);" ";
3040 NEXT I
3050 RETURN

9000 ' --- Set Data ---
9010 A=&HF000
9020 READ D$
9030 WHILE D$<>"END"
9040 POKE A,VAL("&H"+D$)
9050 A=A+1
9060 READ D$
9070 WEND
9080 RETURN

9100 ' --- Data ---
9200 ' Initialize
9210 DATA DB,22 :'F000 IN A,(22H) メモリーステータス取得 0bit:BIOS, 1bit:RAM 
9220 DATA E6,03 :'F002 AND 03H マスクしてスタック
9230 DATA F5 :'F004 PUSH AF
9240 DATA 00,00,00,00,00,00,00:'F005-F00B NOP パソピア用のために空けておく

9300 'V-RAM Bank Switching
9310 DATA F3 :'F00C DI 割り込み禁止
9320 DATA 3A,F0,F0 :'F00D LD A,(0F0F0H)
9330 DATA D3,3C :'F010 OUT (3CH),A メモリモードセット
9340 DATA 3E,03 :'F012 LD A,03H
9350 DATA D3,0F :'F014 OUT (0FH),A 8255コントロールポート設定
9360 DATA 3A,F1,F0 :'F016 LD A,(0F0F1H)
9370 DATA D3,0C :'F019 OUT (0CH),A V-RAM面セレクト
9380 DATA 3E,08 :'F01B LD A,08H
9390 DATA D3,0D :'F01D OUT (0DH),A アトリビュート設定
9400 DATA FB :'F01F EI 割り込み許可

9500 ' Data Translate
9510 DATA 2A,F2,F0 :'F020 LD HL,(0F0F2H) HL:転送元アドレス
9520 DATA ED,5B,F4,F0:'F023 LD DE,(0F0F4H) DE:転送先アドレス
9530 DATA ED,4B,F6,F0:'F027 LD BC,(0F0F6H) BC:転送バイト数
9540 DATA ED,B0 :'F02B LDIR ブロック転送

9600 ' Restore Memory Bank
9610 DATA F3 :'F02D DI 割り込み禁止
9620 DATA F1 :'F02E POP AF
9630 DATA D3,3C :'F02F OUT (3CH),A メモリモードセット→V-RAMアクセス不可
9640 DATA 3E,02 :'F031 LD A,02H
9650 DATA D3,0F :'F033 OUT (0FH),A 8255コントロールポート設定
9660 DATA FB :'F035 EI 割り込み許可
9670 DATA C9 :'F036 RET
9680 DATA END

9700 ' Initialize for Pasopia T/5
9710 DATA DB,22 :'F000 IN A, (22H) メモリーステータス取得 2bit:RAM(0:ROMモード, 1:64KRAMモード), 3bit:ROM(0:本体ROM, 1:ROMパック)
9720 DATA E6,0C :'F002 AND 0CH 2, 3bitをマスク
9730 DATA 0F :'F004 RRCA Aを3回右ローテイト
9740 DATA 0F :'F005 RRCA
9750 DATA 0F :'F006 RRCA
9760 DATA 30,02 :'F007 JR NC,LF00B 2bit:CarryフラグにRAMの値。Cy=0でジャンプ
9770 DATA F6,02 :'F009 OR 02H 1bit:RAMをセット
9780 DATA F5 :'F00B LF00B: PUSH AF
9790 DATA END
RUN で実行し、以下のように入力してBIOSの内容を0x9000~0xCFFFにコピー
Memory Mode (1:BIOS, 2:RAM, 4:V-RAM, 8:I/O Memory Mode) &H1
Source Address: &H4000
Destination Address: &H9000
Translation Byte: &H4000
画面上には先頭と最後のバイナリが表示されるので、メモっとく。
Windowsでぷちれこの録音を開始して、パソピア側で
BSAVE #-1,"BIOS",&H9000,&H4000
でwavファイルに保存。

エミュレータに同梱されているwav2bin.exeに、録音したwavファイルをドラッグ&ドロップ。
生成されたbinファイルをバイナリエディタで開いて、パソピアの画面に表示されているバイナリと同じになるように、余分なバイナリを削除。
正常に録音できた場合、先頭のヘッダー部分38バイトと、最後の1バイトを削除すると同じになるはず。
もしずれている場合、ノイズなどで正常に録音できていない可能性があるので、録音レベルやサウンドカードを見直してみる
できたバイナリは、「BIOS.ROM」 というファイル名で保存

BASICは2回に分けて録音
前半
Memory Mode (1:BIOS, 2:RAM, 4:V-RAM, 8:I/O Memory Mode) &H8
Source Address: &H0000
Destination Address: &H9000
Translation Byte: &H4000
・・・
BSAVE #-1,"BASIC1",&H9000,&H4000
後半
Memory Mode (1:BIOS, 2:RAM, 4:V-RAM, 8:I/O Memory Mode) &H8
Source Address: &H4000
Destination Address: &H9000
Translation Byte: &H4000
・・・
BSAVE #-1,"BASIC2",&H9000,&H4000

BIOSと同じように、バイナリエディタでそれぞれ0x4000バイトに編集。
あわせて0x8000バイトのファイルを作成し、「BASIC.ROM」 というファイル名で保存。

0 件のコメント:

コメントを投稿