misc/060tsys/t03memory.equ
;----------------------------------------------------------------
;
; サブスレッドの初期プログラムのマクロ
;
;----------------------------------------------------------------
kernelCodeMacro .macro expand
.local base,abort,kill
base:
.if expand
lea.l base-sProgram(pc),a6
.else
.ds.w 2
.endif
;プロセス管理テーブルを作る
pea.l 16(a6) ;プロセス管理を移す
DOS _PSPSET
addq.l #4,sp
clr.b pPath(a6) ;パスをクリア
lea.l sFlag(a6),a0
lea.l pName(a6),a1 ;ファイル名に識別フラグを設定
move.l (a0)+,(a1)+
move.l (a0)+,(a1)+
move.l (a0)+,(a1)+
move.l (a0)+,(a1)+
clr.b (a1)
move.l sEnvStart(a6),pEnvPtr(a6)
st.b sProcessMove(a6)
DOS _CHANGE_PR
;アボートベクタを設定する
.if expand
pea.l abort(pc)
.else
.ds.w 2
.endif
move.w #_CTRLVC,-(sp)
DOS _INTVCS
addq.l #6,sp
;プログラムを起動する
clr.l -(sp)
pea.l sCommandLine(a6)
pea.l sFileName(a6)
clr.w -(sp)
DOS _EXEC
lea.l 14(sp),sp
abort:
.if expand
lea.l base-sProgram(pc),a6
.else
.ds.w 2
.endif
movea.l sUspEnd(a6),sp
;スレッドを削除する
kill:
DOS _CHANGE_PR
move.l a6,-(sp)
DOS _S_MFREE
addq.l #4,sp
.if expand
bra.s kill
.else
.ds.w 1
.endif
.endm
;----------------------------------------------------------------
;
; 定数
;
;----------------------------------------------------------------
;----------------------------------------------------------------
;サブスレッドのメモリ空間の先頭のブロックの構造
; オフセットはメモリ空間の先頭を0とする
.offset 0
.ds.b pSize ;メモリ管理テーブルとプロセス管理テーブル
sFlag: .ds.b 16 ;識別フラグ(固定文字列)
sExclusive: .ds.b xSize ;排他制御情報
sDriveTable: .ds.b dSize*26 ;ドライブ管理テーブル
sThreadId: .ds.w 1 ;スレッド番号
sThreadName: .ds.b 16 ;スレッド名
sFileName: .ds.b 256 ;最初に実行するファイル名
sCommandLine: .ds.b 256 ; 〃 コマンドライン
sBuffer: ;スレッド間通信バッファ
sBufferSize: .ds.l 1 ; 〃 バッファのサイズ
sBufferStart: .ds.l 1 ; 〃 バッファの先頭
sBufferCommand: .ds.w 1 ; 〃 コマンド
sBufferYourId: .ds.w 1 ; 〃 相手のスレッド番号
sBufferAreaSize equ 16 ; 〃 バッファ領域のサイズ
sBufferArea: .ds.b sBufferAreaSize ; 〃 バッファ
sSspStart: .ds.l 1 ;ssp領域の先頭
sSspEnd: .ds.l 1 ;ssp領域の末尾+1
sUspStart: .ds.l 1 ;usp領域の先頭
sUspEnd: .ds.l 1 ;usp領域の末尾+1
sEnvStart: .ds.l 1 ;環境の領域の先頭
sEnvEnd: .ds.l 1 ;環境の領域の末尾+1
sProcessMove: .ds.b 1 ;プロセス管理テーブルが移動したら-1になる
.even
sProgram: kernelCodeMacro 0 ;初期プログラム
sSize:
;この後にssp領域,usp領域,環境の領域が続く
.text
;----------------------------------------------------------------
;スレッドフラグ
threadFlag0 equ '060t'
threadFlag1 equ 'urbo'
threadFlag2 equ ' v'
threadFlag3 equ '0.00'