文字容量の関係で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)にてその旨お知らせください。
後半はこちら。
初稿では,清十郎さんの作成された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)にてその旨お知らせください。
※コメント投稿者のブログIDはブログ作成者のみに通知されます