misc/flinebuserror.s
;========================================================================================
;  flinebuserror.s
;  Copyright (C) 2003-2024 Makoto Kamada
;
;  This file is part of the XEiJ (X68000 Emulator in Java).
;  You can use, modify and redistribute the XEiJ if the conditions are met.
;  Read the XEiJ License for more details.
;  https://stdkmd.net/xeij/
;========================================================================================

;----------------------------------------------------------------------------------------
;
;	flinebuserror.x
;		MC68030でDOSコールの_GETENVを古い番号$FF53で呼び出してバスエラーを発生させる実験です。
;		バスエラーが発生したときはbus errorと、さもなくば環境変数pathの内容が表示されます。
;		MC68030では$FF53がcpRESTORE (a3)なので、$FF53を実行すると(a3)がリードされ、a3の内容によってはバスエラーが発生します。
;		この問題が、_GETENVを新しい番号$FF83に移動させなければならなかった理由であると考えられます。
;
;	更新履歴
;		2024-11-29
;			公開。
;
;----------------------------------------------------------------------------------------

	.include	doscall.mac

	.text

;スーパーバイザモードに移行する
	clr.l	-(sp)
	DOS	_SUPER
	move.l	d0,(sp)

;バスエラーが発生するアドレスを用意する
	movea.l	#$00E80400,a3		;a3=バスエラーが発生するアドレス

;スーパーバイザスタックポインタを保存する
	movea.l	sp,a4			;a4=スーパーバイザスタックポインタ

;バスエラー例外ベクタを保存して変更する
	move.l	$0008.w,a5		;a5=元のバスエラー例外ベクタ
	move.l	#buserror,$0008.w

;環境変数pathの値を取り出す
	lea.l	name,a0			;a0=環境変数の名前
	suba.l	a1,a1			;a1=環境の領域。0は実行中のプロセス
	lea.l	value,a2		;a2=環境変数の値
	clr.b	(a2)			;環境変数がなければ空とみなす
	movem.l	a0-a2,-(sp)
	DOS	_V2_GETENV		;X68030のときここでバスエラーが発生する
	lea.l	12(sp),sp

;バスエラー例外ベクタを復元する
	move.l	a5,$0008.w

;環境変数pathの値を表示する
	move.l	a0,-(sp)		;環境変数の名前
	DOS	_PRINT
	pea.l	separator		;区切り
	DOS	_PRINT
	move.l	a2,-(sp)		;環境変数の値
	DOS	_PRINT
	pea.l	crlf			;改行
	DOS	_PRINT
	lea.l	16(sp),sp

	bra	user_exit

;バスエラーのとき
buserror:

;スーパーバイザスタックポインタを復元する
	movea.l	a4,sp			;元のスーパーバイザスタックポインタ

;バスエラー例外ベクタを復元する
	move.l	a5,$0008.w		;元のバスエラー例外ベクタ

;バスエラーのメッセージを表示する
	pea.l	message			;'bus error'
	DOS	_PRINT
	addq.l	#4,sp

user_exit:

;ユーザモードに復帰する
	DOS	_SUPER
	addq.l	#4,sp

;終了する
	DOS	_EXIT

	.data

;環境変数の名前
name:
	.dc.b	'path',0

;'bus error'
message:
	.dc.b	'bus error'
;改行
crlf:
	.dc.b	13,10,0
;区切り
separator:
	.dc.b	'=',0

	.bss

;環境変数の値
value:
	.ds.b	1024