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

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

「晴れのちおおさわぎ」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)にてその旨お知らせください。


最新の画像もっと見る

コメントを投稿