MANIMANIAのレトロエロゲーカウントダウン

人生の残り時間が半分を切ったというのに若き日に目にしたエロゲーに魂を引かれ続けるイタいおっさんがこなしたゲームを紹介。

音楽ギフトカード

2010-11-28 20:10:11 | Weblog
昔で言うところのレコード券ですな。

どっかでもらったものの,レコード屋(CDショップというべきか?)でCDやDVDを買うこともなくなってしまったので,多分10年ほど財布に入れっぱなしだった。

ところが,何ともう使えないばかりか,返金期限が明後日11月30日(しかも30日到着分)までだと知った。

そんなわけで慌てて返金申請書類をダウンロード,印刷して,返金請求のための封筒を書き終えた次第。

みなさんも未使用の音楽ギフトカードがあれば,下記URLを参照して迅速に対応されたし。
音楽ギフトカード返戻申込要領

101201追記・来年2月1日(消印有効)までは払戻しを受けられる債権申出手続ができるとのこと。まだの人は今度こそ急ぐべし。
音楽ギフトカード債権申出要領

「晴れのちおおさわぎ」IPL分析(後半)

2010-11-17 22:50:24 | レトロパソコンのお作法
後半です。
「晴れのちおおさわぎ」IPL分析(前半)でもそうですが,Tabキーで設けた落差がHTMLには反映されないんですかね。
読みにくいですが,読む気のある人にとってはさほどの障害にはならんでしょう。

B000:0050からの続き。

;ディスク読み出し
B000:0052 E8F100 CALL 0146H ;ディスク読み出しサブルーチン呼出し~01A5H +++++++++++++++++

;ディスク読み出しサブルーチン
;(UNDOCUMENTED 9801/9821 小高輝真・河野健著 株式会社インプレス発行 '94/03/21,P.181~)
;(トランジスタ技術SPECIAL No.45 CQ出版社 '94/05/01 P.25)
;(PC-9801プログラマーズBible第2版,東京理科大学EIC編,技術評論社刊 '96/08/05 P.264~,P.276~)
B000:0146 06 PUSH ES ;ES退避
B000:0147 2BC0 SUB AX,AX ;AX=0000H
B000:0149 8EC0 MOV ES,AX ;ES=0000H
B000:014B 26A08405 MOV AL,ES:[0584H] ;disk_boot ALにブートドライブ情報を代入。
;0000H:0584HにはOSのブートしたディスク装置の情報が書かれている。
;0584Hの数値は下位4ビットがUA(ユニット番号,Unit Adress),
;    上位4ビットがDA(デバイスタイプ識別コード,
; Drive Adress)。
;ex. 90H=1001 0000
; UA 0000 ドライブ1
; 0001 ドライブ2
; 0010 ドライブ3
; 0011 ドライブ4
;DA アクセスモード 640KB 0xxx
; 1MB/HDD 1xxx
; ハードディスク x000
; 1MBインターフェース x001
; 640KBインターフェース x111
B000:014F B456 MOV AH,56H ;DISK BIOS(シングルトラック(bit7=0),
;倍密度MFM(bit6=1),8回リトライ(bit5=0),
;シーク動作する(bit4=1)),データ読み出し。
B000:0151 8BF8 MOV DI,AX ;DI=56UAH DISK BIOS格納AX退避
B000:0153 B86000 MOV AX,0060H ;
B000:0156 8EC0 MOV ES,AX ;ES=0060H 読み出すセグメント
B000:0158 2BED SUB BP,BP ;BP=0000H 読み出すオフセット
;(データバッファ領域先頭アドレス,ES:BP=0060H:0000H)
B000:015A BB0004 MOV BX,0400H ;BX=0400H 読み込むバイト数(1024バイト),データ長(DTL)
B000:015D B90003 MOV CX,0300H ;CX=0300H CH(N)=03H,CL(C)=00H(シリンダNo.0,セクタ長1024バイト(2の(3+7)乗))

;FATセクタ読み出し
B000:0160 BA0200 MOV DX,0002H ;DX=0002H DH(H)=00H,DL(R)=02H(ヘッドNo.0,セクタNo.2)FAT読み出し
B000:0163 E85EFF CALL 00C4H ;ディスク読み出しサブルーチン2呼出し ~00DD++++++++++++++++++

;ディスク読み出しサブルーチン2(正常に読み出せるまで5回トライ,成功すればCF=0,AX=0000H,
;失敗すればCF=1,AX=0FFFFH)
B000:00C4 BE0500 MOV SI,0005H ;カウンタを5回にセットした。
B000:00C7 8BC7 MOV AX,DI ;AXを復帰(0151Hで退避させたDISK BIOS格納AX)。
;MOV AH,56H(データの読み出し),
;MOV AL,90(ドライブ1)
; or91(ドライブ2)
B000:00C9 CD1B INT 1BH ;正常に読み出せればAH=00,CF=0
;Drive Not ReadyならAH=60,CF=1
B000:00CB 730E JNB 00DBH ;正常に読めた(CF=0)とき,00DBHへ。-----------------------------------
B000:00CD 8BC7 MOV AX,DI ;正常に読めなかったとき(CF=1),再度AXを復帰。00C7のやり直し。
B000:00CF B407 MOV AH,07H ;DISK BIOS RECALIBRATE
B000:00D1 CD1B INT 1BH ;ヘッドのシリンダ0への移動
B000:00D3 4E DEC SI ;カウンタを1減らす。
B000:00D4 75F1 JNE 00C7H ;ZF=0(カウンタ残あり)のとき,00C7Hへ。-----------------------------
B000:00D6 B8FFFF MOV AX,0FFFFH ;ZF=1(正常に読めず,カウンタ残なし)ならAX=0FFFFHにして復帰。
B000:00D9 EB02 JMP 00DDH ;--------------------------------------------------------------------
B000:00DB 2BC0 SUB AX,AX ;AXを0000Hにして復帰(ZF=1)。
B000:00DD C3 RET ;====================================================================

B000:0166 7305 JNB 016DH ;正常に読み出して帰れば(CF=0)016DHへ。AX=0000Hで復帰。-------
B000:0168 BA3802 MOV DX,0238H ;94 07 'データを読み込むことができません。'00 FF FF 00
B000:016B EB37 JMP 01A4H ;01A4H(POP ESしてRET)。0055Hへ。-----------------------------
B000:016D 268A4600 MOV AL,ES:[BP+00H] ;FAT先頭データ(0FFH)をALに代入。
B000:0171 FEC0 INC AL ;0FFH+1=00H
B000:0173 7405 JE 017AH ;ZF=1なので017AHへ。-----------------------------------------
B000:0175 BABC02 MOV DX,02BCH ;94 07 'ディスクの形式が違います。'00 FF FF
B000:0178 EB2A JMP 01A4H ;01A4Hに飛んでPOP ESしてRET。--------------------------------

;ディレクトリエントリ(ルートディレクトリ)セクタ読み出し
B000:017A B204 MOV DL,04H ;DL=04H。C=0,H=0,R=04,N=03
;トラック0,ヘッド0,第4セクタ(ディレクトリエントリ),レングス3を読む。
;AX=0000H
B000:017C E845FF CALL 00C4H ;ディスク読み出しサブルーチン2呼出し ~00DDH ++++++++++++++++
;CALL後省略

B000:017F 72E7 JB 0168H ;CF=1(正常に読めなかったとき)なら,0168Hへ。AX=0FFFFH -------
B000:0181 8BDD MOV BX,BP ;BX=0000H(BP=0000H,0158H以降変動なし)
B000:0183 B92000 MOV CX,0020H ;カウンタに0020Hをセット。
B000:0186 268A07 MOV AL,ES:[BX] ;第4セクタ先頭データ(0CAH)をALに代入。
B000:0189 3CE5 CMP AL,0E5H ;0CAHと0E5Hを比較。ZF=0
B000:018B 740D JE 019AH ;ZF=1なら019AHへジャンプ。(無限ループ)-----------------------
B000:018D 0AC0 OR AL,AL ;AL=0CAH
B000:018F 74E4 JE 0175H ;ZF=1なら0175Hへ。-------------------------------------------
B000:0191 268B470A MOV AX,ES:[BX+0AH] ;第4セクタ先頭から000AHの中身2バイトを2941HをAXに代入。
;Bディスクなら2942H
B000:0195 80FC29 CMP AH,29H ;AH=29Hと29Hを比較。
B000:0198 7404 JE 019EH ;ZF=1なので019EHへ。 ----------------------------------------
B000:019A E2EA LOOP 0186H ;0186Hへのループを32回。
B000:019C EBD7 JMP 0175H ;0175Hへ。---------------------------------------------------
B000:019E 2C41 SUB AL,41H ;AL=41Hから41Hを減ずる。AL=00H
;Bディスクならディスク違い。AL=01H
B000:01A0 98 CBW ;バイト(AL)からワード(AX)への変換。
;ビット7をAHの全てのビットにコピーする。AX=0000H
;BディスクならAX=0001H
B000:01A1 BE3802 MOV SI,0238H ;94 07 'データを読み込むことができません。'00 FF FF 00
B000:01A4 07 POP ES
B000:01A5 C3 RET ;0055Hへ。 ==================================================

;ディスク読み出し結果分岐ルーチン
B000:0055 85C0 TEST AX,AX ;ZF=1(AX=0000Hのとき)
B000:0057 7513 JNE 006CH ;ZF=0(AX=FFFFH,正常に読めなかった)なら,006CHへ。--------

;############################################################################################
(ここからエラー表示)
0168Hから来た(第2または第4セクタを読み出せなかった)とき ;94 07 'データを読み込むことができません。'00 FF FF 00
0175Hから来た(FATデータ不一致)とき ;94 07 'ディスクの形式が違います。'00 FF FF
01A5Hから来たが,ディスク違いの場合
B000:006C 2E00067A02 ADD CS:[027AH],AL ;半角Aと半角Bの文字コード差分を「A」の文字コードに加算する。
B000:0071 BE6002 MOV SI,0260H ;'このディスクは 「No.A(+文字コード差分)」 です。'
B000:0074 EB06 JMP 007CH ;007CHへ。-----------------------------------------------------------
B000:007C E89400 CALL 0113H ;文字列表示サブルーチン呼出し~0119h +++++++++++++++++++++++++++++++++
(以下省略,ハイレゾモードエラー表示部分参照)
(エラー表示終了)
;#############################################################################################

B000:0059 E83600 CALL 0092H ;第5セクタ以下読み出しルーチンへ~00C3H +++++++++++++++++++

;第5セクタ以降が正常に読み出せるか(58セクタ分)?
B000:0092 06 PUSH ES ;ES退避。
B000:0093 B86000 MOV AX,0060H
B000:0096 8EC0 MOV ES,AX ;ES=0060H 読み出すセグメント
B000:0098 BB0004 MOV BX,0400H ;BX=0400H 読み出すバイト数,データ長(DTL)
B000:009B B90003 MOV CX,0300H ;CX=0300H CH(N)=03H,CL(C)=00H
B000:009E BA0500 MOV DX,0005H ;DX=0005H DH(H)=00H,DL(R)=05H セクタ5読み出し
B000:00A1 E82000 CALL 00C4H ;ディスク読み出しサブルーチン2呼出し ~00DDH ++++++++++++++++
;CALL後省略

B000:00A4 85C0 TEST AX,AX ;ZF=1(正常に読み出されたとき)
B000:00A6 751A JNE 00C2H ;ZF=0(正常に読み出せなかったとき)なら00C2Hへ。POP ESしてRET。------
B000:00A8 03EB ADD BP,BX ;BP+0400H
B000:00AA 81FD00E8 CMP BP,0E800H ;BPと0E800Hを比較(E800H/0400H=3Aなので58セクタ分読む意味か。)。
B000:00AE 7312 JNB 00C2H ;CF=0(BP>0E800H)なら,00C2Hへ。POP ESしてRET。-----------------------
B000:00B0 FEC2 INC DL ;読み出しセクタ番号を1増やす。
B000:00B2 80FA08 CMP DL,08H ;セクタ番号8か?
B000:00B5 76EA JBE 00A1H ;CF=1またはZF=1のとき(DL<=8),00A1Hにジャンプ。----------------------
B000:00B7 B201 MOV DL,01H ;セクタ番号8まで来たので読み取りセクタを1に。
B000:00B9 80F601 XOR DH,01H ;ヘッド番号を1に。
B000:00BC 75E3 JNE 00A1H ;ZF=0(既にヘッド番号が1)のとき,00A1Hへジャンプ。------------------
B000:00BE FEC1 INC CL ;シリンダ番号を増やす。
B000:00C0 EBDF JMP 00A1H ;--------------------------------------------------------------------
B000:00C2 07 POP ES ;ES復帰。
B000:00C3 C3 RET ;====================================================================

B000:005C 85C0 TEST AX,AX ;ZF=1
B000:005E 7516 JNE 0076H ;ZF=0(正常に読み出せなかった)のとき,0076Hへ。-----------------------------------------------

;##############################################################################################
(ここからエラー表示)
B000:0076 EB04 JMPS 007CH ;007CHへ。「データを読み込むことができません。」を表示して異常終了。
;SIは01A1Hで積んできた
B000:007C E89400 CALL 0113H ;文字列表示サブルーチン呼出し~0119h +++++++++++++++++++++++++++++++++
(以下省略,エラー表示終了)
;##############################################################################################

B000:0060 B00E MOV AL,0EH ;DISP ENABLE 画面表示OFF テキスト・グラフィックとも
B000:0062 E668 OUT 68H,AL ;http://www.webtech.co.jp/company/doc/undocumented_mem/io_disp.txt

;GOAL
B000:0064 EA00006000 JMP 0060H, 0000H ;データバッファ先頭領域(第5セクタ以下格納)へ。----------------------------------
B000:0069 90 NOP

<<著作権に関して>>
本記事に引用している全てのソフトの名称・画像の著作権・その他権利は、制作、販売されたソフトハウス、メーカー、または作者様に帰属します。本サイトでの上記著作権物扱いは、著作権など各権利関係を侵害することが目的ではありません。問題などある場合は、メール(gekigangarあっとmail.goo.ne.jp)にてその旨お知らせください。

「晴れのちおおさわぎ」IPL分析(前半)

2010-11-11 16:52:13 | レトロパソコンのお作法
文字容量の関係で2回に分けてアップします。
後半はこちら。

初稿では,清十郎さんの作成されたDISKに関する資料 第2稿の様式に則って,データの記録順にベタ書きしてましたが,構造を把握しにくかったので,改訂稿では,フローチャートと,プログラムの実行順にデータを記載します。



こうしてまとめてしまうと,ほとんど中身がありませんな。これを理解するのに日数を費やした私って一体・・・。

ま,いいか。

B000:0000 EB1C JMP 001EH
B000:0002 90 NOP

;BPB
B000:0003 49504C20302E3230 'IPL 0.20'
B000:000B 0004 0400h ;1セクタあたりバイト数(1024)
B000:000D 01 01h ;1クラスタあたりセクタ数(1)
B000:000E 0100 0001h ;IPL(1)
B000:0010 01 01h ;FATの数(1)
B000:0011 2000 0002h ;ルートディレクトリの総エントリ数(32)
B000:0013 D004 04D0h ;ディスクのセクタ総数(1232)
B000:0015 FF 0FFh ;メディア・ディスクリプタ
B000:0016 0200 0002h ;1FATあたりセクタ数(2)
B000:0018 0800 0008h ;1トラックの物理セクタ数(8)
B000:001A 0200 0002h ;ヘッド数(2)
B000:001C 0000 0000h ;不可視セクタの数(0)
;まとめ ブートセクタ1つ1セクタ,FAT1つ2セクタ,ディレクトリエントリ1つ1セクタ,
; データ領域は第5セクタ(論理セクタ番号4)から。

;レジスタ初期化,SS=ES=0000h
B000:001E FA CLI ;割り込みフラグクリア。外部割り込みを禁止。
B000:001F 2BC0 SUB AX,AX ;ワーク・セグメント=0000H
B000:0021 8ED0 MOV SS,AX ;SS=0000H
B000:0023 BC8A02 MOV SP,028AH ;スタックの設定(0000:0028AH)
B000:0026 FB STI ;割り込みフラグセット。次の命令の最後で、外部割り込みを可能に。
B000:0027 8EC0 MOV ES,AX ;ES=0000h(=SS)

;キーバッファ設定
B000:0029 26800E000520 OR BYTE ES:[0500H],20H
;KEYBOARD BIOS
;98のワークエリア0000H:0500Hの第5ビットを1にする。
;キーバッファオーバーフロー時にビープを鳴らさない設定。
;http://www.webtech.co.jp/company/doc/undocumented_mem/memsys.txt
;(トランジスタ技術SPECIAL No.45 CQ出版社 '94/05/01 P.23)

;CSとDSを同一セグメントに設定
B000:002F 0E PUSH CS ;
B000:0030 1F POP DS ;CS=DS

;テキストVRAM設定(ハイレゾ,非ハイレゾ)
B000:0031 B800A0 MOV AX,0A000H ;AX=0A000H テキストVRAMセグメント
B000:0034 26F606010508 TEST BYTE ES:[0501H],08H ;BIOS_flg 98
;http://www.webtech.co.jp/company/doc/undocumented_mem/memsys.txt
;ワークエリア0000:0501Hの第3ビット確認。1ハイレゾ0ノーマル
;(トランジスタ技術SPECIAL No.45 CQ出版社 '94/05/01 P.23)
B000:003A 7403 JE 003FH ;ZF=1(bit3=0)のとき(ノーマル),003FHへ。---------------
B000:003C B800E0 MOV AX,0E000H ;ハイレゾのとき,ハイレゾテキストVRAMセグメント。AX=0E000H
B000:003F 8EC0 MOV ES,AX ;ハイレゾの場合,ES=0E000H
;ノーマルの場合,ES=0A000H

;画面表示初期化
B000:0041 E89A00 CALL 00DEH ;画面表示初期化サブルーチン呼出し~00F6h +++++++++++++++++++

;0041Hから来た
;画面表示初期化サブルーチン
;(MS-DOS基本プログラミング第2集 PC9801の割り込みとBIOS活用法,トラ技コンピュータ編集部 編 '92/12/20)
;(トランジスタ技術SPECIAL No.45 CQ出版社 '94/05/01 P.23)

B000:00DE B8000A MOV AX,0A00H ;画面あたり行数25行,行あたり桁数80字,バーチカル・ライン有効,コードアクセス有効
B000:00E1 CD18 INT 18H ;CRT BIOS テキスト画面モードの設定
B000:00E3 B40D MOV AH,0DH
B000:00E5 CD18 INT 18H ;CRT BIOS テキスト画面表示停止
B000:00E7 B412 MOV AH,12H
B000:00E9 CD18 INT 18H ;CRT BIOS カーソル表示停止
B000:00EB B416 MOV AH,16H ;テキストVRAMの初期化。AH=16H
B000:00ED BA20E1 MOV DX,0E120H ;DX=0E120H,テキスト全領域をクリア
;DH=0E1h,標準アトリビュート,DL=020h,スペースで埋める
B000:00F0 CD18 INT 18H
B000:00F2 B40C MOV AH,0CH
B000:00F4 CD18 INT 18H ;CRT BIOS テキスト画面表示開始
B000:00F6 C3 RET ;0044Hへ復帰。=======================================================

;IPL読み込み中メッセージ
B000:0044 BEB001 MOV SI,01B0H ;00 00 'IPL: 読み込み中です。しばらくお待ちください。',00,FF,FF
B000:0047 FC CLD ;ディレクションフラグを0(増加)にリセットした。
B000:0048 E8C800 CALL 0113H ;文字列表示サブルーチン呼出し~0119h +++++++++++++++++++++++

;0048Hまたは007CHから来た
;文字列ロードルーチン
B000:0113 AD LODSW ;DS:[SI]のメモリのワード値をAXに転送し,SIの値を2増加させる。
B000:0114 8BF8 MOV DI,AX ;AX退避。
B000:0116 40 INC AX ;AXの値を1増やす。
B000:0117 75F7 JNE 0110H ;ZF=0(INC前のAXがFFFFHでないとき)なら,0110Hへ。---
;*******************************************************************************************
B000:0110 E82D00 CALL 0140H ;バイトデータロードサブルーチンへ。~0145H +++++++++

;0110Hから来た
;バイト文字列終了確認ルーチン このために文字列には終了判別用に後に0FFHを2つ配置している。
;0113Hではワード値として文字列0FFFFHかどうかを調べているがここではバイト値で調べている。
B000:0140 AC LODSB ;DS:[SI]で示されるメモリのバイト値をALに転送し,
;SIの値を1増加させる。バイトデータロード。
B000:0141 84C0 TEST AL,AL ;ALを比較。AL=00HならZF=1
B000:0143 75D5 JNE 011AH ;ZF=0ならば011AHにジャンプ。---------------
;*******************************************************************************************
;0143Hから来た
;ANK文字判別ルーチン
;(PC-9801スーパーテクニック 小高輝真,清水和文,速水祐著 株式会社アスキー発行 '92/04/01・P66~)
B000:011A 2AE4 SUB AH,AH ;AH=00H
B000:011C 3C80 CMP AL,80H ;ANK文字(半角英数)か?ALと80H(全角文字は80H以降)を比較。
B000:011E 721F JB 013FH ;CF=1のとき(AL<80H,半角英数なら),013FHへ。----------------------- B000:0122 7608 JBE 012CH ;CF=1またはZF=1のとき(80H<=AL<=9EH),012CHへ。-----------------------
B000:0124 3CE0 CMP AL,0E0H ;ANK文字(半角カナ)か?ALと0E0H(全角文字は0E0H以降)を比較。
B000:0126 7217 JB 013FH ;CF=1のとき(9EH<AL<0E0H,半角カナなら),013FHへ。------------------ B000:012A 7713 JNBE 013FH ;CF=0,かつZF=0のとき(0FCH<AL),013FHへ。----------------------------- ;0122Hから来た
;全角文字コードテキストVRAMロードルーチン
B000:012C 8AE0 MOV AH,AL ;全角文字の1バイト目をAHに。012EHと併せてAXにS-JIS文字コードをロード。
B000:012E AC LODSB ;DS:[SI]で示されるメモリのバイト値をALに転送し,SIの値を1増加させる。
B000:012F E8C6FF CALL 00F8H ;シフトJIS→TVRAM書き込みデータ変換ルーチン~010EH +++++++++++++++++++

;012FHから来た
;シフトJIS文字コード→テキストVRAM書き込み変換ルーチン。シフトJISコードからJISコードへの準変換含む。
;(98ハードに強くなる本,東京工業大学・電算機愛好会 著 技術評論社刊 '76/11/10 P.120~)
;(98ハードに強くなる本II,東工大電算機愛好会著&小高輝真 著 技術評論社刊 '88/02/25 P.120~)
;(トランジスタ技術SPECIAL No.45 CQ出版社 '94/05/01 P.61~)
;(PC-9801プログラマーズBible第2版,東京理科大学EIC編,技術評論社刊 '96/08/05 P.79~)
;http://www.eonet.ne.jp/~ookumaneko98/kanji.htm
;http://www.infonet.co.jp/ueyama/ip/binary/shiftjis.html
B000:00F8 D0E4 SHL AH,01 ;左シフト,文字コード第1バイト×2。bit7-0→bit6-0,0,CF=1。
B000:00FA FECC DEC AH ;AH-1
B000:00FC 3C9E CMP AL,9EH ;ALと09EHを比較。
B000:00FE 7606 JBE 0106H ;CF=1またはZF=1のとき(AL<=09EH),0106Hへ。---------------------------
B000:0100 2C7E SUB AL,7EH ;09EH<ALのとき,ALから7E減ずる。 B000:0104 EB08 JMP 010EH ;CALL元に復帰。------------------------------------------------------
B000:0106 3C7E CMP AL,7EH ;ALと7EHを比較。
B000:0108 7602 JBE 010CH ;CF=1またはZF=1のとき(AL<=07EH),010CHへ。ALから1FH減じて復帰--------
B000:010A FEC8 DEC AL ;07EH<AL<=09EHのとき,ALから20H減じて復帰 B000:010E C3 RET ;0132Hに復帰。=======================================================
;まとめ AL<=07EH AHを2倍して1減ずる。ALから1FH減ずる。 ex.。 シフトJIS 8142→TVRAM 0223 cf.JIS 2123
; 07EH<AL<=09EH AHを2倍して1減ずる。ALから20H減ずる。 ex.込 シフトJIS 8D9E→TVRAM 197E cf.JIS 397E
; 09EH<AL AHを2倍する。    ALから7EH減ずる。 ex.読 シフトJIS 93C7→TVRAM 2649 cf.JIS 4649

;テキストVRAM書き込みルーチン
;(PC-9801スーパーテクニック 小高輝真,清水和文,速水祐著,株式会社アスキー発行 '92/04/01・P66~)
B000:0132 86E0 XCHG AH,AL ;AHとAL入れ替え
B000:0134 3C09 CMP AL,09H ;ALと09Hを比較。2バイト半角文字か?ALを20H減じてから来たことに注意
B000:0136 7204 JB 013CH ;CF=1(全角文字ならAL<09H,JIS漢字コードは3021H~)のとき,013CHへ。-- B000:013A 7603 JBE 013FH ;CF=1またはZF=1のとき(09H<=AL<=0BHなら2バイト半角文字),013FHへ。---

;全角文字データテキストVRAM書き込み
B000:013C AB STOSW ;テキストVRAMへワードデータ書き込み。全角文字の左側を書く。
;ES:[DI]で示されるメモリに,AXのワード値を格納し,
;DIの値を2増加させる。データのストア。
;DIで指定するブロックへALの内容を次々とストアする。
B000:013D 0C80 OR AL,80H ;ALのbit7を1にする。全角右側のフラグを立てる。次の013FHで書き込み。

;011EH,0126H,012AHから来た場合あり
;半角文字データテキストVRAM書き込み
B000:013F AB STOSW ;013CHと同じ。013DH経由で来たときは全角文字の右側を書く。
;ここへジャンプしてきた場合(ANK文字),AH=00H,ALに文字コードをストア。

;バイト文字列終了確認ルーチン このために文字列には終了判別用に後に0FFHを2つ配置している。
;0113Hではワード値として文字列0FFFFHかどうかを調べているがここではバイト値で調べている。
B000:0140 AC LODSB ;DS:[SI]で示されるメモリのバイト値をALに転送し,
;SIの値を1増加させる。バイトデータロード。
B000:0141 84C0 TEST AL,AL ;ALを比較。AL=00HならZF=1
B000:0143 75D5 JNE 011AH ;ZF=0ならば011AHにジャンプ。---------------

B000:0145 C3 RET ;0113Hへ復帰。 ============================

B000:0119 C3 RET ;004BHへ。====================================

;ハイレゾ分岐
B000:004B 8CC0 MOV AX,ES ;テキストVRAMセグメントをAXに代入。
B000:004D 3D00A0 CMP AX,0A000H ;テキストVRAMセグメントアドレスを確認。
B000:0050 7526 JNE 0078H ;ZF=0のとき(ハイレゾ),0078Hへ。---------------------------

;########################################################################################
(ここからエラー表示)
;ハイレゾモードエラー
B000:0078 BEE201 MOV SI,01E2H ;02h,07h,'ハイレゾモードでは動作しません。',00h,D4h,08h,
;'ノーマルモードに設定し、リセットしてください。',00h,FFh,FFh,1Eh,2Hh
B000:007B 90 NOP
B000:007C E89400 CALL 0113H ;文字列表示サブルーチン呼出し~0119h +++++++++++++++++++++++++++++++++

;0048Hまたは007CHから来た
;文字列ロードルーチン
B000:0110 E82D00 CALL 0140H ;バイトデータロードサブルーチンへ。~0145H +++++++++++++++++++++++++++

;ワード文字列終了確認ルーチン
B000:0113 AD LODSW ;DS:[SI]のメモリのワード値をAXに転送し,SIの値を2増加させる。
B000:0114 8BF8 MOV DI,AX ;AX退避。
B000:0116 40 INC AX ;AXの値を1増やす。
B000:0117 75F7 JNE 0110H ;ZF=0(INC前のAXがFFFFHでないとき)なら,0110Hへ。---------------------
B000:0119 C3 RET ;====================================================================

;異常終了処理
;(トランジスタ技術SPECIAL No.45 CQ出版社 '94/05/01 P.122)
B000:007F B417 MOV AH,17H ;ブザーの起呼。AH=17H
B000:0081 CD18 INT 18H ;
B000:0083 2BC9 SUB CX,CX ;CX=0000H
B000:0085 E2FE LOOP 0085H ;CXの値を1減じて,0でなければ0085Hへ。
B000:0087 E2FE LOOP 0087H ;CXの値を1減じて,0でなければ0087Hへ。
B000:0089 6418 MOV AH,18H ;ブザーの停止。AH=18H
B000:008B CD18 INT 18H ;
B000:008D 90 NOP ;
B000:008E FA CLI ;外部割り込み禁止。
B000:008F F4 HLT ;割り込みがかかるまでCPUを停止させる。
B000:0090 EBFC JMPS 008EH ;無限ループ-----------

(エラー表示終了)
;##########################################################################################

<<著作権に関して>>
本記事に引用している全てのソフトの名称・画像の著作権・その他権利は、制作、販売されたソフトハウス、メーカー、または作者様に帰属します。本サイトでの上記著作権物扱いは、著作権など各権利関係を侵害することが目的ではありません。問題などある場合は、メール(gekigangarあっとmail.goo.ne.jp)にてその旨お知らせください。

フロッピーイメージの実ディスクへの書き戻し方法

2010-11-05 08:40:17 | 使ってみようエミュレータ
ご無沙汰しております。

「晴れのちおおさわぎ」のIPL解析を地道にやっています。
基礎知識を付けるために「はじめて読む8086」から「はじめて読むMASM」と読み進め,実践編として起動情報入り空きディスク,「晴れのちおおさわぎ」,「闘神都市2」の各IPLを逆アセンブルして分析しています。
PC-98のプログラム解析に必要な書籍は大概揃えたつもりでしたが,なお足りず,ちょこちょこ買い集めつつ作業しています。

さて,今回は,「闘神都市2」Aディスク(?)のIPL分析のために,実ディスクへの書き戻しが必要となり,実行可能な書き戻し方法を1つ把握しましたので備忘録として記録します。

1 REDさんの開発されたVirtual Floppy Image Converter(通称VFIC)により,フロッピーイメージをD88にコンバートします。

2 D88のフロッピーイメージをPC-98実機に持ち込みます。

3 PC-98実機上で,PC-8x01 galley内のanonBさんの作成されたツールMOGREFにより,D88イメージを実ディスクに書き戻すための付加情報ファイルを作成します。
下の実機画面ではやってませんが,イメージファイルとMOGREFは4で使うMAHALITOと同じディレクトリに置いて作業した方がいいでしょうね。
.2HDファイルと.DATファイルをMAHALITOと同じディレクトリに移す作業を忘れると4で書き戻しに失敗するはずですから。



4 PC-98実機上で,及川清明さんの開発されたMAHALITOにより,D88イメージを実ディスクに書き戻します。



書き戻し先がf:となってますが,書き戻し先ドライブレターのことですので,実機のドライブ構成に合わせて変更して下さい。

Vector上で公開されている他のフリーソフトも2つばかり試してみましたがうまくいきませんでした。

<<著作権に関して>>
本記事に引用している全てのソフトの名称・画像の著作権・その他権利は、制作、販売されたソフトハウス、メーカー、または作者様に帰属します。本サイトでの上記著作権物扱いは、著作権など各権利関係を侵害することが目的ではありません。問題などある場合は、メール(gekigangarあっとmail.goo.ne.jp)にてその旨お知らせください。