#
#   wpout-mbr -- ハードディスク消去記録を表示する
#
##	0.0: Jul. 24, 2006 by Dai ISHIJIMA (for wpout07)
##	0.1: Sep. 12, 2007 (for wpout09, FreeBSD 6.2R)	
#

	# 16ビット用コードを生成
	.code16
	.arch i8086

	.set START,	0x0000
	.set LOAD,	0x7c00	# プログラムがロードされる場所
	.set TBLOFF,	0x01be	# パーティションテーブル
	.set BOOTMAGIC,	0xAA55	# ブートセクタを示すマジックナンバー
	.set MESGLEN,	398	# 保持するメッセージの長さ
	.set PARTBL,	START + TBLOFF
	.set MESG,	START + TBLOFF - MESGLEN
	.set MESGADDR,	LOAD + TBLOFF - MESGLEN
	.set VIDEOBIOS, 0x10	# ビデオBIOS (INT 10H)
	.set PUTCHAR,	0x0e	# 文字 (テレタイプ) 出力
	.set VIDEOATTR, 7	# ビデオBIOSに渡すアトリビュートパラメータ
	.set KEYBIOS,	0x16	# キーボードBIOS
	.set GETCHAR,	0x00	# 一文字入力
	.set RETKEY,	0x0d	# エンターキー

	.globl start

start:
	# とりあえず割り込みを禁止
	cli
	# スタックを 0000:7c00 に設定
	xorw	%ax, %ax
	movw	%ax, %ss
	movw	$LOAD, %sp
	# セグメントレジスタを 0000 に。CS は変更不要??
	push	%ax
	pop	%ds
	push	%ax
	pop	%es
	# ここで割り込みを許可
	sti
	# このプログラムからさらにブートストラップを読んだりはしないので、
	# プログラムをリロケートするといった操作はしない

main:
	# メッセージを表示する
	movw	$MESGADDR, %si
disp:
	# ASCIZ文字列を一文字ずつBIOSコールで表示
	lodsb			# 一文字ずつ出力
	testb	%al, %al	# NULL文字なら表示終了
	jz	keywait		# 文字列の表示が終わったらキー入力待ちへ
	push	%si
	movw	$VIDEOATTR, %bx
	movb	$PUTCHAR, %ah
	int	$VIDEOBIOS	# ビデオBIOSをコールして表示
	pop	%si
	jmp	disp

keywait:
	# キーボードが押されるのを待つ
	movb	$GETCHAR, %ah
	int	$KEYBIOS
	cmpb	$RETKEY, %al
	jnz	keywait
	# リセットは FFFF:0000 にジャンプ(?)	
	ljmp	$0xFFFF,$0x0000

	# 表示するメッセージ
	.org MESG
mesg:
	# この記憶装置の内容はわいぷたんで消されたかもしれない :-)
	.ascii	"The contents of this storage device \r\n"
	.ascii	"may have been erased \r\n"
	.ascii	"with hard disk wiping tool "
	.ascii	"``wipe-out''.\r\n"
	.ascii	"ABSOLUTELY NO WARRANTY.\r\n"
	.byte	0

	# 仮のパーティションテーブルとマジック
	.org PARTBL
ptable:
	.fill	0x10, 0x04, 0x00
	.word	BOOTMAGIC

#
# アセンブル方法
#	as -o wpout-mbr.o wpout-mbr.s
#	ld -N -e start -Ttext 0 -o wpout-mbr.out wpout-mbr.o
#	objcopy -S -O binary wpout-mbr.out wpout-mbr.boot
#	rm wpout-mbr.o wpout-mbr.out
#

# おしまい
