misc/060tsys/t21exec.s- Source code ソースコード - XEiJ - STUDIO KAMADA
misc/060tsys/t21exec.s

    ;----------------------------------------------------------------
    ;
    ;	_EXIT,_KEEPPR,_EXEC,_EXIT2
    ;
    ;----------------------------------------------------------------

    	.include	t01dos.equ
    	.include	t02const.equ
    	.include	t08debug.equ

    ;__DEBUG__	equ	1

    	.cpu	68060

    ;----------------------------------------------------------------
    ;_EXIT		プロセスの終了(終了コード指定なし)
    ;復帰しない
    	.text
    	.align	4,$2048
    dosExit::
    	moveq.l	#0,d0
    	bra	dosExitGo

    ;----------------------------------------------------------------
    ;_EXIT2		プロセスの終了(終了コード指定あり)
    ;<(a6).w:終了コード
    ;復帰しない
    	.text
    	.align	4,$2048
    dosExit2::
    	moveq.l	#0,d0
    	move.w	(a6),d0
    dosExitGo:
    	move.l	d0,$1CAE.w
    	jsr	$0000A65A.l		;_ALLCLOSE
    	movea.l	([$1C28.w]),a0
    	jsr	$000092B8.l		;プロセスが使っていたメモリブロックを,
    					;すべて開放して親プロセスに戻る
    	movea.l	(pSsp,a0),sp		;ssp
    	movea.l	(pUsp,a0),a5		;usp
    	move.l	a5,usp
    	clr.w	-(sp)
    	move.l	(pExitvc,a0),-(sp)	;_EXITVC
    	move.w	(p_Sr,a0),-(sp)		;sr
    	movea.l	([$1C28.w]),a0		;親プロセス
    	clr.l	(pChildPtr,a0)		;子プロセスのメモリ管理テーブル
    	jsr	$0000A11E.l		;プロセス管理の移行にともなうベクタ類の設定(常駐プロセス以外)
    	jsr	$00010134.l		;かな漢字変換行クローズ
    	move.l	$1CAE.w,d0		;_EXIT,_KEEPPR,_EXIT2の終了コード(上位ワードは非常駐=0,常駐=1)
    	clr.w	$1C08.w			;DOSコールのレベル
    	rte

    ;----------------------------------------------------------------
    ;_KEEPPR	プロセスの常駐終了(メモリは開放しない)
    ;<(a6).l:常駐サイズ(プログラムの先頭から常駐部分の末尾まで)
    ;<4(a6).w:終了コード
    ;復帰しない
    	.text
    	.align	4,$2048
    dosKeeppr::
    	move.l	(a6)+,d1		;常駐部分の長さ
    	moveq.l	#1,d0
    	swap.w	d0
    	move.w	(a6),d0			;終了コード
    	move.l	d0,$1CAE.w		;_EXIT,_KEEPPR,_EXIT2の終了コード(上位ワードは非常駐=0,常駐=1)
    	movea.l	([$1C28.w]),a0		;実行中のプロセスのメモリ管理テーブル
    	move.l	(Proc,a0),([$1C28.w])	;実行中のプロセスのメモリ管理テーブル
    ;親のアドレスの最上位バイトに常駐フラグ$FFを書き込む
    ;親がハイメモリにあるとアドレスが破壊される
    ;親はいつまでも健在とは限らないのでそもそも辿ってよい情報ではないが
    ;念のため始祖であるHuman68kのメモリ管理テーブルのアドレスを入れておく
    	tst.b	(Proc,a0)
    	beq	@f
    	move.l	$1C20.w,(Proc,a0)	;Humanのメモリ管理テーブル
    @@:	st.b	(Proc,a0)		;常駐フラグを設定
    	add.l	a0,d1
    	add.l	#$00000100,d1		;常駐部分の末尾+1
    	cmp.l	(Tail,a0),d1
    	bcc	@f
    	move.l	d1,(Tail,a0)
    @@:	movea.l	(pSsp,a0),sp		;ssp
    	movea.l	(pUsp,a0),a5		;usp
    	move.l	a5,usp
    	clr.w	-(sp)
    	move.l	(pExitvc,a0),-(sp)	;_EXITVC
    	move.w	(p_Sr,a0),-(sp)		;sr
    	movea.l	([$1C28.w]),a0		;親プロセス
    	clr.l	(pChildPtr,a0)		;子プロセスのメモリ管理テーブル
    	jsr	$0000A150.l		;プロセス管理の移行にともなうベクタ類の設定(常駐プロセス)
    	jsr	$00010134.l		;かな漢字変換行クローズ
    	move.l	$1CAE.w,d0		;_EXIT,_KEEPPR,_EXIT2の終了コード(上位ワードは非常駐=0,常駐=1)
    	clr.w	$1C08.w			;DOSコールのレベル
    	rte

    ;----------------------------------------------------------------
    ;_EXEC		子プロセスの実行
    ;<(a6).b:モジュール番号
    ;<1(a6).b:モード
    ;	0	プログラムのロードおよび実行
    ;			<2(a6).l:実行ファイル名
    ;				最上位バイトは実行ファイルのタイプ(0=拡張子,1=r,2=z,3=x)
    ;			<6(a6).l:コマンドライン
    ;			<10(a6).l:環境のアドレス(0ならば実行中のプロセスの環境)
    ;			>d0.l:終了コード(常駐したとき上位ワード=1)
    ;	1	プログラムのロード
    ;			<2(a6).l:実行ファイル名
    ;				最上位バイトは実行ファイルのタイプ(0=拡張子,1=r,2=z,3=x)
    ;			<6(a6).l:コマンドライン
    ;			<10(a6).l:環境のアドレス(0ならば実行中のプロセスの環境)
    ;			>d0.l:実行開始アドレス
    ;			>a0.l:メモリ管理テーブル
    ;			>a1.l:プログラムの末尾+1
    ;			>a2.l:コマンドライン
    ;			>a3.l:環境
    ;			>a4.l:実行開始アドレス
    ;	2	実行ファイル名のpath検索
    ;			<2(a6).l:実行ファイル名とコマンドライン
    ;				最上位バイトは実行ファイルのタイプ(0=拡張子,1=r,2=z,3=x)
    ;			<6(a6).l:コマンドラインのバッファ
    ;			<10(a6).l:環境のアドレス(0ならば実行中のプロセスの環境)
    ;			>d0.l:エラーコード
    ;	3	実行ファイルのアドレス指定ロード
    ;			<2(a6).l:実行ファイル名
    ;				最上位バイトは実行ファイルのタイプ(0=拡張子,1=r,2=z,3=x)
    ;			<6(a6).l:ロードアドレス
    ;			<10(a6).l:リミットアドレス
    ;			>d0.l:text+data+bss+comm+stackのサイズ
    ;	4	ロード済みのプログラムの実行
    ;			<2(a6).l:実行開始アドレス
    ;			>d0.l:終了コード(常駐したとき上位ワード=1)
    ;	5	モジュール番号の検索(最後に見つかったモジュール番号を返す)
    ;			<2(a6).l:実行ファイル名
    ;			<6(a6).l:モジュール名
    ;			>d0.l:モジュール番号*$100
    ;*d0,?d1-d7/a0-a6
    	.text
    	.align	4,$2048
    dosExec::
      debug '|exec in (module*256+mode,file,param,env)=',4,(-2,a6),(2,a6),(6,a6),(10,a6)

    	move.b	(1,a6),d0
    	beq	dosExec0
    	subq.b	#1,d0
    	beq	dosExec1
    	subq.b	#2-1,d0
    	beq	dosExec2
    	subq.b	#3-2,d0
    	beq	dosExec3
    dosExecGo::
    	move.l	vectorOldDosExec,-(sp)
    	rts

    ;----------------------------------------------------------------
    ;元の_EXECを呼ぶ
    	.text
    	.align	4,$2048
    callExec::
    	move.l	a6,-(sp)
    	lea.l	(8,sp),a6
    	bsr	dosExecGo
    	movea.l	(sp)+,a6
    	movea.l	$1C5C.w,a5
    	movem.l	(dosA0,a5),a0-a4
    	rts

    ;----------------------------------------------------------------
    ;_EXECモード0	プログラムのロードおよび実行
    ;	必要ならばスワップアウトを行う
    ;	プログラムをロードしてLZX展開を行う
    ;	ダイナミックパッチをあてる
    ;<(a6).b:モジュール番号
    ;<1(a6).b:0
    ;<2(a6).l:実行ファイル名
    ;	最上位バイトは実行ファイルのタイプ(0=拡張子,1=r,2=z,3=x)
    ;<6(a6).l:コマンドライン
    ;<10(a6).l:環境のアドレス(0ならば実行中のプロセスの環境)
    ;>d0.l:終了コード(常駐したとき上位ワード=1)
    ;*d0,?d1-d7/a0-a6
    	.text
    	.align	4,$2048
    dosExec0::
      debug '|exec0 in (file,param,env)=',3,(2,a6),(6,a6),(10,a6)
    ;ロード
    	move.l	(10,a6),-(sp)
    	move.l	(6,a6),-(sp)
    	move.l	(2,a6),-(sp)
    	move.w	#1,-(sp)
    	move.b	(a6),(sp)
    	bsr	callExec
    	lea	(14,sp),sp
    	tst.l	d0
    	bmi	dosExec0End
    ;LZX展開
    	move.l	(Tail,a0),d6		;リミットアドレス
    	lea.l	(pProgram,a0),a5	;ロードアドレス
    	move.l	(pBssTop,a0),d5
    	movea.l	(pStackTop,a0),a1
    	bsr	unpackLzx
    	move.l	d5,(pBssTop,a0)		;bssの先頭
    	move.l	d5,(pHeapTop,a0)	;ヒープの先頭
    	move.l	a1,(pStackTop,a0)	;スタックエリアの先頭
    	movea.l	$1C5C.w,a5
    	movem.l	a0-a4,(dosA0,a5)
    ;パッチをあてる
    	bsr	dynamicPatch
    ;キャッシュフラッシュ
    	bsr	cache_flush
    ;_EXECモード4で実行する
    	move.l	a4,-(sp)
    	move.w	#4,-(sp)
    	bsr	callExec
    	addq.l	#6,sp
    dosExec0End:
    	rts

    ;----------------------------------------------------------------
    ;_EXECモード1	プログラムのロード
    ;	プログラムをロードしてLZX展開を行う
    ;	ダイナミックパッチをあてる
    ;<(a6).b:モジュール番号
    ;<1(a6).b:1
    ;<2(a6).l:実行ファイル名
    ;	最上位バイトは実行ファイルのタイプ(0=拡張子,1=r,2=z,3=x)
    ;<6(a6).l:コマンドライン
    ;<10(a6).l:環境のアドレス(0ならば実行中のプロセスの環境)
    ;>d0.l:実行開始アドレス
    ;>a0.l:メモリ管理テーブル
    ;>a1.l:プログラムの末尾+1
    ;>a2.l:コマンドライン
    ;>a3.l:環境
    ;>a4.l:実行開始アドレス
    ;*d0/a0-a4,?d1-d7/a5-a6
    	.text
    	.align	4,$2048
    dosExec1::
      debug '|exec1 in (file,param,env)=',3,(2,a6),(6,a6),(10,a6)
    ;ロード
    	move.l	(10,a6),-(sp)
    	move.l	(6,a6),-(sp)
    	move.l	(2,a6),-(sp)
    	move.w	#1,-(sp)
    	move.b	(a6),(sp)
    	bsr	callExec
    	lea	(14,sp),sp
    	tst.l	d0
    	bmi	dosExec1End
    ;LZX展開
    	move.l	(Tail,a0),d6		;リミットアドレス
    	lea.l	(pProgram,a0),a5	;ロードアドレス
    	move.l	(pBssTop,a0),d5
    	movea.l	(pStackTop,a0),a1
    	bsr	unpackLzx
    	move.l	d5,(pBssTop,a0)
    	move.l	d5,(pHeapTop,a0)
    	move.l	a1,(pStackTop,a0)
    	movea.l	$1C5C.w,a5
    	movem.l	a0-a4,(dosA0,a5)
    ;パッチをあてる
    	bsr	dynamicPatch
    ;キャッシュフラッシュ
    	bsr	cache_flush
    	move.l	a4,d0			;実行開始アドレス
    dosExec1End:
      debug '|exec1 out (d0,a0,a1,a2,a3,a4)=',6,d0,a0,a1,a2,a3,a4
    	rts

    ;----------------------------------------------------------------
    ;_EXECモード2	実行ファイル名のpath検索
    ;<1(a6).b:2
    ;<2(a6).l:実行ファイル名とコマンドライン
    ;	最上位バイトは実行ファイルのタイプ(0=拡張子,1=r,2=z,3=x)
    ;<6(a6).l:コマンドラインのバッファ
    ;<10(a6).l:環境のアドレス(0ならば実行中のプロセスの環境)
    ;>d0.l:エラーコード
    ;*d0,?d1-d7/a0-a6
    	.text
    	.align	4,$2048
    dosExec2::
    ;hupair対応
    	bra	dosExecGo

    ;----------------------------------------------------------------
    ;_EXECモード3	実行ファイルのアドレス指定ロード
    ;	プログラムをロードしてLZX展開を行う
    ;<(a6).b:モジュール番号
    ;<1(a6).b:3
    ;<2(a6).l:実行ファイル名
    ;	最上位バイトは実行ファイルのタイプ(0=拡張子,1=r,2=z,3=x)
    ;<6(a6).l:ロードアドレス
    ;<10(a6).l:リミットアドレス
    ;>d0.l:サイズ
    ;*d0,?d1-d7/a0-a6
    	.text
    	.align	4,$2048
    dosExec3::
      debug '|exec3 in (file,ptr,limit)=',3,(2,a6),(6,a6),(10,a6)
    ;ロード
    	move.l	(10,a6),-(sp)
    	move.l	(6,a6),-(sp)
    	move.l	(2,a6),-(sp)
    	move.w	#3,-(sp)
    	move.b	(a6),(sp)
    	bsr	callExec
    	lea	(14,sp),sp
    	tst.l	d0
    	bmi	dosExec3End
    ;LZX展開
    	move.l	(10,a6),d6		;リミットアドレス
    	movea.l	(6,a6),a5		;ロードアドレス
    	lea.l	(a5,d0.l),a1		;末尾+1
    	bsr	unpackLzx
    	move.l	a1,d7			;末尾+1
    	sub.l	a5,d7			;プログラムのサイズ
    ;パッチをあてる
    ;<a5.l:ロードアドレス
    ;<d7.l:プログラムのサイズ
    	bsr	dynamicDevicePatch
    ;キャッシュフラッシュ
    	bsr	cache_flush
    	move.l	d7,d0			;プログラムのサイズ
    dosExec3End:
      debug '|exec3 out (size)=',1,d0
    	rts

    ;----------------------------------------------------------------
    ;LZX展開
    ;<d6.l:リミットアドレス
    ;<a0.l:メモリ管理テーブル
    ;<a1.l:末尾+1
    ;<a5.l:ロードアドレス
    ;>d5.l:(展開したとき)bssの先頭
    ;>a1.l:末尾+1
    ;>a4.l:(展開したとき)実行開始アドレス
    ;*d5/a1/a4,?d0-d2
    	.text
    	.align	4,$2048
    unpackLzx::
    ;#HUPAIR LZX 0.42のチェック
    	moveq.l	#0,d1
    	moveq.l	#2,d2
    	cmpi.l	#'#HUP',(2,a5)
    	bne	@f
    	cmpi.l	#'AIR'*$100,(6,a5)
    	bne	@f
    	moveq.l	#6,d1
    	moveq.l	#84,d2
    	cmpi.l	#'0.42',(14,a5)
    	beq	@f
    	moveq.l	#90,d2
    	cmpi.l	#'1.04',(14,a5)
    	bne	unpackLzxEnd
    @@:
    ;LZXヘッダのチェック
    	cmpi.l	#'LZX ',(4,a5,d1.w)
    	bne	unpackLzxEnd
    	cmpi.l	#'0.31',(8,a5,d1.w)
    	bcs	unpackLzxEnd
    	cmpi.l	#'1.04',(8,a5,d1.w)
    	bhi	unpackLzxEnd
    	cmpi.l	#'1.00',(8,a5,d1.w)
    	bcc	unpackLzxGo		;ITA lzxのときはキャッシュ操作を省略
    ;キャッシュディセーブル
    	PUSH_CACR_DISABLE_BC	d0
    	bsr	unpackLzxGo		;展開する
    ;キャッシュモード復元
    	POP_CACR	d0
    unpackLzxEnd:
    	rts

    ;展開する
    unpackLzxGo:
    	move.l	d6,(4,a5,d1.w)		;リミットアドレス
    	move.l	a5,(8,a5,d1.w)		;ロードアドレス
    	move.l	(14,a5,d1.w),-(sp)	;実行開始位置のオフセット
    	move.l	(18,a5,d1.w),d5		;text+data+bssのサイズ
    	sub.l	(26,a5,d1.w),d5		;bssのサイズ
    	lea.l	(@f,pc),a4		;戻り先
    	jmp	(a5,d2.w)		;展開
    @@:	add.l	a5,d5			;bssの先頭
    	movea.l	a5,a4			;先頭アドレス
    	adda.l	(sp)+,a4		;新しい実行開始アドレス
    	rts

    ;----------------------------------------------------------------
    ;_PSPSETの追加
    ;<d3.l:text+dataのサイズ
    ;<d6.l:スタックエリアのサイズ
    ;<a0.l:メモリ管理テーブル
    ;<a2.l:コマンドラインのアドレス
    ;<a3.l:環境の領域のアドレス
    ;>d0.l:0
    ;>a3.l:環境の領域のアドレス(0だったとき親プロセスの環境の領域アドレスが入る)
    ;>a5.l:DOSコールにレベル0で入ったときのssp
    ;*d0/a3/a5,?d3/a6
    	.text
    	.align	4,$2048
    human302_makePsp::
    	add.l	a0,d3
    	add.l	#pProgram,d3
    	movea.l	([$1C28.w]),a5		;実行中のプロセスのメモリ管理テーブル
    	move.l	a0,(pChildPtr,a5)	;子プロセスのメモリ管理テーブル
    	move.l	d3,(pBssTop,a0)		;bss+comm+stackの先頭
    	move.l	d3,(pHeapTop,a0)	;ヒープの先頭
    	add.l	d6,d3
    	move.l	d3,(pStackTop,a0)	;スタックエリアの先頭
    	cmpa.w	#0,a3
    	bne	@f
    	movea.l	(pEnvPtr,a5),a3		;現在の環境の領域のアドレス
    @@:	move.l	a3,(pEnvPtr,a0)		;環境の領域のアドレス
    	move.l	a2,(pCmdLinePtr,a0)	;コマンドラインのアドレス
    	lea.l	(pHandler,a0),a6
    	clr.l	(a6)+			;ハンドラの使用状況(12バイト)
    	clr.l	(a6)+			;
    	clr.l	(a6)			;
    	movea.l	$1C5C.w,a5		;DOSコールにレベル0で入ったときのssp
    	move.l	(dosPC,a5),$1BC0.w	;pcを_EXITVCへ
    	lea.l	(dosSSP,a5),a6
    	move.l	a6,(pSsp,a0)		;ssp
    	move.l	usp,a6
    	move.l	a6,(pUsp,a0)		;usp
    	move.w	(dosSR,a5),(p_Sr,a0)	;sr
    	clr.l	(pOsFlag,a0)		;OSフラグ(-1=Humanが起動,0=その他)
    	clr.l	(pChildPtr,a0)		;子プロセスのメモリ管理テーブル
    	jsr	$0000A0EC.l		;メモリ管理ブロックの生成にともなうベクタ類の保存
    	move.l	a0,([$1C28.w])		;実行中のプロセスのメモリ管理テーブル

    	cmpi.b	#_EXEC-$FF00,$1C0A.w
    	bne	@f

    	move.b	deviceCacheNoPush,(pDeviceNoPush,a0)	;デバイス呼び出しでキャッシュプッシュするか
    	move.b	defaultAllocArea,(pAllocArea,a0)	;アロケートできる領域の条件
    					;	0	下位のみ
    					;	1	上位のみ
    					;	2	親と同じ側のみ
    					;	3	親と反対側のみ
    					;	4	制限なし,下位優先
    					;	5	制限なし,上位優先
    					;	6	制限なし,親と同じ側優先
    					;	7	制限なし,親と反対側優先
    					;	8	制限なし,優先なし
    	move.b	#1,(pLoadCache,a0)	;本体のブロックのキャッシュモード
    	move.b	#1,(pAllocCache,a0)	;アロケートしたブロックのキャッシュモード

    @@:	moveq.l	#0,d0
    	rts

    ;----------------------------------------------------------------
    ;_EXECの実行前の処理
    ;	bss+comm+stackの初期化
    ;	プロセス管理テーブルの作成
    ;<d1.w:0=起動する,0以外=レジスタの設定のみ
    ;<d3.l:text+dataのサイズ
    ;<d6.l:スタックエリアのサイズ
    ;<a0.l:メモリ管理テーブル
    ;<a2.l:コマンドラインのアドレス
    ;<a3.l:環境の領域のアドレス
    ;<a4.l:実行開始アドレス
    ;$0000967E
    	.text
    	.align	4,$2048
    human302_execMakePsp::

    ;bss+comm+stackを初期化する
    	lea.l	(pProgram.w,a0,d3.l),a1	;bss+comm+stackの先頭アドレス
    	move.l	d6,d0
    	lsr.l	#2,d0
    	beq	2f
    1:	clr.l	(a1)+
    	subq.l	#1,d0
    	bne	1b
    2:	moveq.l	#3,d0
    	and.l	d6,d0
    	beq	4f
    3:	clr.b	(a1)+
    	subq.l	#1,d0
    	bne	3b
    4:
    ;<a1.l:bss+comm+stackの末尾

    	movem.l	d1/a1-a3,-(sp)

    ;_EXECの動作レベルを-3に設定
    	move.b	#-3,$1CA0.w		;_EXECの動作レベル

    ;プロセス管理テーブルを作る
    	bsr	human302_makePsp
    ;<a5.l:DOSコールにレベル0で入ったときのssp

    ;_EXECの動作レベルを0に設定
    	clr.b	$1CA0.w			;_EXECの動作レベル

    ;プロセス管理テーブルにモジュール番号を設定する
    	move.b	$1CA1.w,(pModuleNumber,a0)	;_EXECで起動するモジュール番号

    ;プロセス管理テーブルにパス名とファイル名を設定する
    	lea.l	(-90,sp),sp
    	movea.l	sp,a2
    	move.l	a2,-(sp)
    	move.l	$1CB2.w,-(sp)		;_EXECで起動するファイル名
    	DOS	_NAMESTS
    	addq.l	#8,sp
    	lea.l	(pPath,a0),a1
    	lea.l	(nDrive,a2),a3		;ドライブ番号
    					;_NAMESTSを使っているので,内部ドライブ番号ではない
    	moveq.l	#'A',d0
    	add.b	(a3)+,d0		;ドライブ名
    	move.b	d0,(a1)+
    	move.b	#':',(a1)+
    ;	lea.l	(nPath,a2),a3		;パス
    @@:	move.b	(a3)+,(a1)+
    	bne	@b
    	lea.l	(pName,a0),a1
    	lea.l	(nName1,a2),a3		;ファイル名1(残りは$20)
    	moveq.l	#8-1,d0
    1:	cmpi.b	#' ',(a3)
    	beq	3f
    	move.b	(a3)+,(a1)+
    	dbra	d0,1b
    	lea.l	(nName2,a2),a3		;ファイル名2(残りは$00)
    	moveq.l	#10-1,d0
    2:	tst.b	(a3)
    	beq	3f
    	move.b	(a3)+,(a1)+
    	dbra	d0,2b
    3:	lea.l	(nExt,a2),a3		;拡張子(残りは$20)
    	cmpi.b	#' ',(a3)		;Humanは拡張子がなくても'.'を付ける
    	beq	5f
    	move.b	#'.',(a1)+
    	moveq.l	#3-1,d0
    4:	cmpi.b	#' ',(a3)
    	beq	5f
    	move.b	(a3)+,(a1)+
    	dbra	d0,4b
    5:	clr.b	(a1)
    	lea.l	(90,sp),sp

    ;プロセス管理テーブルの拡張情報を設定する
    	lea.l	(pName,a0),a1
    	move.l	(a1)+,d0
    	or.l	#$20202020,d0
    	cmp.l	#'comm',d0
    	bne	@f
    	move.l	(a1)+,d0
    	or.l	#$20202000,d0
    	cmp.l	#'and.',d0
    	bne	@f
    	move.w	(a1)+,d0
    	or.w	#$2000,d0
    	cmp.w	#'x'*256,d0
    	bne	@f
    	move.b	#8,(pAllocArea,a0)	;command.xは制限なし,優先なし
    @@:

    	movem.l	(sp)+,d1/a1-a3

    ;<d1.w:0=起動する,0以外=レジスタの設定のみ
    ;<a0.l:メモリ管理テーブル
    ;<a1.l:bss+comm+stackの末尾
    ;<a2.l:コマンドラインのアドレス
    ;<a3.l:環境の領域のアドレス
    ;<a4.l:実行開始アドレス
    ;<a5.l:DOSコールにレベル0で入ったときのssp

    	jmp	$0000971E

    ;----------------------------------------------------------------
    ;ダイナミックパッチをあてる(デバイスドライバ)
    ;<a5.l:ロードアドレス
    ;<d7.l:プログラムのサイズ
    dynamicDevicePatch:
      .ifdef __DEBUG__
    	movem.l	d1/a1,-(sp)
    	moveq.l	#'[',d1
    	jsr	debugPutc
    	movea.l	$1CB2.w,a1
    	jsr	debugPrint
    	moveq.l	#']',d1
    	jsr	debugPutc
    	movem.l	(sp)+,d1/a1
      .endif
    	bsr	rsdrv202
    	rts

    rsdrv202:
    	movem.l	d0/a0-a1,-(sp)
    	cmp.l	#$00000EA6,d7
    	blo	9f
    	lea.l	($00000E4C,a5),a0
    	lea.l	(1f,pc),a1
    	bsr	strcmp
    	bne	9f

    	lea.l	(2f,pc),a1
    	move.w	(a1)+,d0
    	lea.l	($00000D04,a5),a0
    @@:	move.w	(a1)+,(a0)+
    	dbra	d0,@b

    9:	movem.l	(sp)+,d0/a0-a1
    	rts

    1:	.dc.b	$0D,$0A
    	.dc.b	'RS-232C DRIVER for X68000 version 2.02',$0D,$0A
    	.dc.b	'AUX0 から AUX5 のファイル名で、通信が可能です',$0D,$0A,$00
    	.even

    2:	.dc.w	(11f-10f)/2-1
    10:	move.w	#2,-(sp)		;(a0)からワードで読めるか調べるルーチン
    	pea.l	(3f,pc)			;ダミー
    	move.l	a0,-(sp)
    	DOS	_BUS_ERR
    	lea.l	(10,sp),sp
    	tst.l	d0
    	beq	@f
    	moveq.l	#-1,d0
    @@:	rts
    3:	.ds.w	1
    11:

    ;----------------------------------------------------------------
    ;ダイナミックパッチをあてる
    ;<a0.l:メモリ管理ポインタ
    ;<a1.l:末尾+1
    ;<a4.l:実行開始アドレス
    dynamicPatch:
      .ifdef __DEBUG__
    	movem.l	d1/a1,-(sp)
    	moveq.l	#'[',d1
    	jsr	debugPutc
    	movea.l	$1CB2.w,a1
    	jsr	debugPrint
    	moveq.l	#']',d1
    	jsr	debugPutc
    	movem.l	(sp)+,d1/a1
      .endif
    ;プログラムのサイズのチェックが必須なので注意！！！
    ;パッチを当てるプログラムを実行してからそれより小さいものを動かすと,
    ;同じアドレスにロードされてバージョンナンバーなどが残っている可能性があるため
    	bsr	patchLibcAladin
    	bsr	pcm8a102

    	tst.b	useJointMode
    	beq	@f
    	bsr	patchXclib		;XCのライブラリにパッチをあてる
    	bsr	history_x_110
    	bsr	sxwin940507
    	bsr	commandx
    @@:
    	rts

    ;libc-1.1.31 Release Aladinの_open()にデバッグパッチをあてる
    patchLibcAladin:
    	movem.l	d0-d1/a1-a2,-(sp)
    ;'Aladin',0,'1.1.31',0を探す
    	move.l	(pBssTop,a0),d1		;bssの先頭
    	lea.l	(pProgram,a0),a1	;プログラムの先頭
    	moveq.l	#0,d0
    1:	cmpa.l	d1,a1
    	bcc	9f			;libc-1.1.31ではない
    	lsl.l	#8,d0
    	move.b	(a1)+,d0
    	cmpi.l	#'Alad',d0
    	bne	1b
    	movea.l	a1,a2
    	cmpi.l	#('in'<<16)+0*256+'1',(a2)+	;奇数アドレスの可能性がある
    	bne	1b
    	cmpi.l	#'.1.3',(a2)+		;奇数アドレスの可能性がある
    	bne	1b
    	cmpi.w	#'1'*256,(a2)+		;奇数アドレスの可能性がある
    	bne	1b
    ;$FF44,$FFAC,$8004の並びを探す
    	lea.l	(pProgram,a0),a1	;プログラムの先頭
    1:	cmpa.l	d1,a1
    	bcc	9f			;見つからなかった
    	cmpi.w	#$FF44,(a1)+		;$FF44を探す
    	bne	1b
    	movea.l	a1,a2
    	moveq.l	#64-1,d0		;64ワード以内に$FFACと$8004があるか
    @@:	cmpi.w	#$FFAC,(a2)+		;$FFACを探す
    	dbeq	d0,@b
    	bne	1b
    @@:	cmpi.w	#$8004,(a2)+		;$8004を探す
    	dbeq	d0,@b
    	bne	1b
    ;見つかった
    	move.w	#$8000,-(a2)		;$8004を$8000に変更
    ;
    9:	movem.l	(sp)+,d0-d1/a1-a2
    	rts

    history_x_110:
    	movem.l	a0-a2,-(sp)
    	lea.l	($000056E2,a0),a1
    	cmpa.l	(pBssTop,a0),a1
    	bhs	9f
    	lea.l	($0100,a0),a2
    	lea.l	($000056AE,a2),a0
    	lea.l	(1f,pc),a1
    	bsr	strcmp
    	bne	9f
    	cmpi.l	#$00C00000,($00004BFE,a2)
    	bne	@f
    	move.l	#$4E71_4E71,($00004C02,a2)
    @@:
    	cmpi.l	#$00C00000,($00004C1E,a2)
    	bne	@f
    	move.l	#$4E71_4E71,($00004C22,a2)
    @@:
    	cmpi.l	#$00C00000,($00004C34,a2)
    	bne	@f
    	move.l	#$4E71_4E71,($00004C38,a2)
    @@:
    	cmpi.l	#$00C00000,($00004C4E,a2)
    	bne	@f
    	move.l	#$4E71_4E71,($00004C52,a2)
    @@:
    9:	movem.l	(sp)+,a0-a2
    	rts

    1:	.dc.b	'X68k History v1.10 Copyright 1989-93 SHARP/Hudson',$0D,$0A,$00
    	.even

    sxwin940507:
    	movem.l	a0-a2,-(sp)
    	lea.l	($00002BB2,a0),a1
    	cmpa.l	(pBssTop,a0),a1
    	bhs	9f
    	lea.l	($0100,a0),a2
    	lea.l	($00002B9E,a2),a0
    	lea.l	(1f,pc),a1
    	bsr	strcmp
    	bne	9f
    	lea.l	($00002BA8,a2),a0
    	lea.l	(2f,pc),a1
    	bsr	strcmp
    	bne	9f
    	cmpi.l	#$00FFFFFF,($0000169E,a2)
    	bne	9f
    	cmpi.w	#_MALLOC,($000016A2,a2)
    	bne	9f
    	cmpi.l	#$00FFFFFF,($000016A8,a2)
    	bne	9f
    	cmpi.w	#_MALLOC,($000016BA,a2)
    	bne	9f
    	move.l	#LOGICAL_MASK,($0000169E,a2)
    	move.w	#_MALLOC3,($000016A2,a2)
    	move.l	#LOGICAL_MASK,($000016A8,a2)
    	move.w	#_MALLOC3,($000016BA,a2)
    @@:
    9:	movem.l	(sp)+,a0-a2
    	rts

    1:	.dc.b	'SX_SHELL',$00
    2:	.dc.b	'ver 3.10',$00
    	.even

    ;	PCM8A.X 1.02はI/Oポートのアドレスの上位8ビットを$FFにしていて
    ;	ハイメモリがあるだけで動かなくなることがあるのでパッチをあてる
    ;<a0.l:メモリ管理ポインタ
    ;<a1.l:末尾+1
    ;<a4.l:実行開始アドレス
    pcm8a102:
    	movem.l	d0-d1/a0-a1,-(sp)
    	lea.l	256(a0),a0		;先頭
    	sub.l	a0,a1			;長さ
    ;長さを確認する
    	cmpa.l	#$FF60,a1
    	blo	99f
    ;タイトルを確認する
    	cmpi.l	#'PCM8',$10F8(a0)
    	bne	99f
    	cmpi.l	#'A102',$10FC(a0)
    	bne	99f
    ;57箇所すべて$FFであることを確認する
    ;XEiJが既にパッチをあてているかも知れない
    	moveq.l	#0,d0
    	lea.l	100f(pc),a1
    	moveq.l	#57-1,d1
    10:	move.w	(a1)+,d0		;ゼロ拡張
    	cmpi.b	#$FF,(a0,d0.l)
    	dbne	d1,10b
    	bne	99f
    ;57箇所すべて$00に書き換える
    ;	moveq.l	#0,d0
    	lea.l	100f(pc),a1
    	moveq.l	#57-1,d1
    20:	move.w	(a1)+,d0		;ゼロ拡張
    	clr.b	(a0,d0.l)
    	dbra	d1,20b
    99:	movem.l	(sp)+,d0-d1/a0-a1
    	rts

    100:	.dc.w	$0138,$01F6,$0394,$11EC,$120A,$1400,$1814,$1870,$1882,$188A
    	.dc.w	$1892,$18A2,$18A8,$18CA,$18D4,$18E0,$18E8,$1908,$19E4,$1AFA
    	.dc.w	$1B58,$1B7C,$1BAC,$1C38,$1CCC,$21F8,$2250,$2258,$2290,$22A6
    	.dc.w	$22B0,$22C0,$22C8,$22DE,$22EA,$30C8,$30DE,$30E6,$30EA,$30F6
    	.dc.w	$3112,$3188,$334C,$338A,$33A2,$33C4,$33D0,$341A,$3428,$3496
    	.dc.w	$34A6,$34D6,$FE0E,$FEC8,$FEEC,$FF46,$FF4E

    ;<a0.l:メモリ管理ポインタ
    ;<a1.l:末尾+1
    ;<a4.l:実行開始アドレス
    commandx:
    	movem.l	a0,-(sp)
    	lea.l	256(a0),a0
    	suba.l	a0,a1
    	cmpa.l	#$12A0,a1
    	blo	99f
    	cmpi.l	#'Comm',$000C(a0)
    	bne	99f
    	cmpi.l	#'and2',$0010(a0)
    	bne	99f
    	cmpi.l	#'.03H',$0014(a0)
    	bne	99f
    	cmpi.w	#'u'*$100,$0018(a0)
    	bne	99f
    ;症状　ハイメモリで実行したとき「常駐部が読み込めません」が出る
    ;原因　EXEC(3)に渡すファイル名の最上位バイトにx形式の$03をorしている
    ;対策　$03をorするを$00をorするに変更する
    	cmpi.l	#$00170003,$220(a0)	;ori.b #$03,(sp)
    	bne	@f
    	move.l	#$00170000,$220(a0)	;ori.b #$00,(sp)
    @@:
    ;症状　先祖がハイメモリにあると常駐部を見つけられず常駐部が無駄に増える
    ;原因　最上位バイトが$00でないときそれ以上遡らない
    ;対策　最上位バイトが$00でないときを最上位ビットが0でないときに変更する
    	cmpi.l	#$4A016608,$26C(a0)	;tst.b d1;bne (*)+10
    	bne	@f
    	move.l	#$4A016B08,$26C(a0)	;tst.b d1;bmi (*)+10
    @@:
    99:	movem.l	(sp)+,a0
    	rts

    ;----------------------------------------------------------------
    1:	cmpm.b	(a1)+,(a0)+
    	bne	2f
    ;文字列比較(大文字と小文字を区別する)
    ;<a0.l:比較される文字列
    ;<a1.l:比較する文字列
    ;>z-flag:eq=一致,ne=不一致
    ;>c-flag:hs=(a0)>=(a1),lo=(a0)<(a1)
    ;?a0-a1
    	.text
    	.align	4,$2048
    strcmp::
    	tst.b	(a1)
    	bne	1b
    	tst.b	(a0)
    2:	rts

    ;----------------------------------------------------------------
    ;文字列連結
    ;<a0.l:連結される文字列
    ;<a1.l:連結する文字列
    	.text
    	.align	4,$2048
    strcat::
    	bsr	strtail
    ;----------------------------------------------------------------
    ;文字列コピー
    ;<a0.l:コピー先
    ;<a1.l:コピー元
    strcpy::
    @@:	move.b	(a1)+,(a0)+
    	bne	@b
    	subq.l	#1,a0
    	rts

    ;----------------------------------------------------------------
    ;文字列の末尾までスキップ
    ;<a0.l:文字列
    ;>a0.l:文字列の末尾の0の位置
    	.text
    	.align	4,$2048
    strtail::
    @@:	tst.b	(a0)+
    	bne	@b
    	subq.l	#1,a0
    	rts

    ;----------------------------------------------------------------
    ;文字列比較(大文字と小文字を区別しない)
    ;<a0.l:比較される文字列
    ;<a1.l:比較する文字列
    ;>z-flag:eq=一致,ne=不一致
    ;>c-flag:hs=(a0)>=(a1),lo=(a0)<(a1)
    ;?a0-a1
    	.text
    	.align	4,$2048
    strcmpi::
    	move.l	d1,-(sp)
    	clr.b	d1
    1:	tst.b	(a1)
    	beq	5f
    	move.b	(a0)+,d0
    	tas.b	d1
    	bne	3f			;2バイト目
    	cmp.b	#'A',d0
    	blo	3f			;1バイト目で'A'～'Z'以外
    	cmp.b	#'Z',d0
    	bhi	2f			;1バイト目で'A'～'Z'以外
    	or.b	#$20,d0			;'A'～'Z'を小文字化する
    	bra	3f

    2:	tst.b	d0
    	bpl	3f			;$00～$7F:1バイトコード
    	cmp.b	#$A0,d0
    	blo	4f			;$80～$BF:2バイトコードの1バイト目
    	cmp.b	#$E0,d0
    	bhs	4f			;$E0～$FF:2バイトコードの1バイト目
    3:	clr.b	d1			;1バイトコード
    4:	cmp.b	(a1)+,d0
    	beq	1b
    	bra	6f

    5:	tst.b	(a0)
    6:	movem.l	(sp)+,d1		;フラグ保護
    	rts

STUDIO KAMADA
Copyright © 1999-2026 Makoto Kamada