	.nlist

;----------------------------------------------------------------
;
;	ベクタアドレス
;
;----------------------------------------------------------------
ACCESS_ERROR	equ	$0008	;Access Error
PRIVILEGE	equ	$0020	;Privilege Violation

FLINE	equ	$002C	;Line 1111 Emulator (Unimplemented F-Line Opcode)
BSUN	equ	$00C0	;Floating-Point Branch or Set on Unordered Condition
INEX	equ	$00C4	;Floating-Point Inexact Result
DZ	equ	$00C8	;Floating-Point Divide-by-Zero
UNFL	equ	$00CC	;Floating-Point Underflow
OPERR	equ	$00D0	;Floating-Point Operand Error
OVFL	equ	$00D4	;Floating-Point Overflow
SNAN	equ	$00D8	;Floating-Point Signaling NAN
UNSUPP	equ	$00DC	;Floating-Point Unimplemented Data Type
EFFADD	equ	$00F0	;Unimplemented Effective Address
UNINT	equ	$00F4	;Unimplemented Integer Instruction

PRNINT	equ	$018C	;プリンタレディー割り込み



;----------------------------------------------------------------
;
;	アドレス変換
;
;----------------------------------------------------------------
LOGICAL_WIDTH	equ	30				;論理アドレス空間のビット数(29〜31)
							;	30=1GB
LOGICAL_SIZE	equ	1<<LOGICAL_WIDTH		;論理アドレス空間のサイズ(末尾+1)
							;	$40000000
LOGICAL_MASK	equ	LOGICAL_SIZE-1			;論理アドレス空間のサイズ-1(末尾,マスク)
							;	$3FFFFFFF

PAGE_INDEX_WIDTH	equ	5			;ページインデックスフィールドのビット数(5〜6)
							;	5
PAGE_INDEX_SIZE		equ	1<<PAGE_INDEX_WIDTH	;ページテーブル1個に含まれるページデスクリプタの個数
							;	32
PAGE_INDEX_MASK		equ	PAGE_INDEX_SIZE-1	;ページインデックスフィールドのマスク
							;	31

PAGE_OFFSET_WIDTH	equ	18-PAGE_INDEX_WIDTH	;ページ内オフセットのビット数(12〜13)
							;	13=8KB/page
PAGE_OFFSET_SIZE	equ	1<<PAGE_OFFSET_WIDTH	;1ページのサイズ
							;	$00002000=8KB/page
PAGE_OFFSET_MASK	equ	PAGE_OFFSET_SIZE-1	;ページ内オフセットのマスク
							;	$00001FFF

PAGE_MASK	equ	LOGICAL_SIZE-PAGE_OFFSET_SIZE	;ページの先頭アドレスのマスク
							;	$3FFFE000
							;ページマスクはLOGICAL_MASKを伴うこと

ROOT_DESC_SIZE		equ	1<<(7+2)		;ルートテーブルのサイズ
							;	$00000200
POINTER_DESC_SIZE	equ	1<<(7+2)		;ポインタテーブル1個のサイズ
							;	$00000200
PAGE_DESC_SIZE		equ	1<<(PAGE_INDEX_WIDTH+2)	;ページテーブル1個のサイズ
							;	$00000080

ROOT_DESC_MASK		equ	LOGICAL_SIZE-ROOT_DESC_SIZE	;ルートテーブルの先頭のアドレスのマスク
								;	$3FFFFE00
POINTER_DESC_MASK	equ	LOGICAL_SIZE-POINTER_DESC_SIZE	;ポインタテーブルの先頭のアドレスのマスク
								;	$3FFFFE00
PAGE_DESC_MASK		equ	LOGICAL_SIZE-PAGE_DESC_SIZE	;ページテーブルの先頭のアドレスのマスク
								;	$3FFFFF80


;----------------------------------------------------------------
;
;	ステータスレジスタ
;
;----------------------------------------------------------------
;SR
SR_C_BIT	equ	0
SR_V_BIT	equ	1
SR_Z_BIT	equ	2
SR_N_BIT	equ	3
SR_X_BIT	equ	4
SR_I_BIT	equ	8
SR_M_BIT	equ	12
SR_S_BIT	equ	13
SR_T_BIT	equ	15
;			 T SM III   XNZVC
SR_C		equ	%0000000000000001	;CARRY
SR_V		equ	%0000000000000010	;OVERFLOW
SR_Z		equ	%0000000000000100	;ZERO
SR_N		equ	%0000000000001000	;NEGATIVE
SR_X		equ	%0000000000010000	;EXTEND
SR_I_MASK	equ	%0000011100000000	;INTERRUPT PRIORITY MASK
SR_I_0		equ	%0000000000000000	;INTERRUPT PRIORITY 0
SR_I_1		equ	%0000000100000000	;INTERRUPT PRIORITY 1
SR_I_2		equ	%0000001000000000	;INTERRUPT PRIORITY 2
SR_I_3		equ	%0000001100000000	;INTERRUPT PRIORITY 3
SR_I_4		equ	%0000010000000000	;INTERRUPT PRIORITY 4
SR_I_5		equ	%0000010100000000	;INTERRUPT PRIORITY 5
SR_I_6		equ	%0000011000000000	;INTERRUPT PRIORITY 6
SR_I_7		equ	%0000011100000000	;INTERRUPT PRIORITY 7
SR_M		equ	%0001000000000000	;MASTER/INTERRUPT STATE
SR_S		equ	%0010000000000000	;SUPERVISOR/USER STATE
SR_T		equ	%1000000000000000	;TRACE ENABLE

PUSH_SR_DI	.macro
	move.w	sr,-(sp)
	ori.w	#SR_I_7,sr
	.endm

POP_SR	.macro
	move.w	(sp)+,sr
	.endm

;----------------------------------------------------------------
;
;	コントロールレジスタ
;
;----------------------------------------------------------------
;CACR
CACR_EDC_BIT	equ	31	;Enable Data Cache
CACR_NAD_BIT	equ	30	;No Allocate Mode (Data Cache)
CACR_ESB_BIT	equ	29	;Enable Store Buffer
CACR_DPI_BIT	equ	28	;Disable CPUSH Invalidation
CACR_FOC_BIT	equ	27	;1/2 Cache Operation Mode Enable (Data Cache)
CACR_EBC_BIT	equ	23	;Enable Branch Cache
CACR_CABC_BIT	equ	22	;Clear All Entries In the Branch Cache
CACR_CUBC_BIT	equ	21	;Clear All User Entries in the Branch Cache
CACR_EIC_BIT	equ	15	;Enable Instruction Cache
CACR_NAI_BIT	equ	14	;No Allocate Mode (Instruction Cache)
CACR_FIC_BIT	equ	13	;1/2 Cache Operation Mode Enable (Instruction Cache)
;			EDC NAD ESB DPI FOC EBC CABC CUBC  EIC NAI FIC
;			 31 30  29  28  27   23 22   21     15 14  13
CACR_EDC	equ	%1__0___0___0___0_000_0_0____0_00000_0_0___0_0000000000000
CACR_NAD	equ	%0__1___0___0___0_000_0_0____0_00000_0_0___0_0000000000000
CACR_ESB	equ	%0__0___1___0___0_000_0_0____0_00000_0_0___0_0000000000000
CACR_DPI	equ	%0__0___0___1___0_000_0_0____0_00000_0_0___0_0000000000000
CACR_FOC	equ	%0__0___0___0___1_000_0_0____0_00000_0_0___0_0000000000000
CACR_EBC	equ	%0__0___0___0___0_000_1_0____0_00000_0_0___0_0000000000000
CACR_CABC	equ	%0__0___0___0___0_000_0_1____0_00000_0_0___0_0000000000000
CACR_CUBC	equ	%0__0___0___0___0_000_0_0____1_00000_0_0___0_0000000000000
CACR_EIC	equ	%0__0___0___0___0_000_0_0____0_00000_1_0___0_0000000000000
CACR_NAI	equ	%0__0___0___0___0_000_0_0____0_00000_0_1___0_0000000000000
CACR_FIC	equ	%0__0___0___0___0_000_0_0____0_00000_0_0___1_0000000000000
;デフォルトはCACR_EDC|CACR_ESB|CACR_DPI|CACR_EBC|CACR_EIC

CACHE_FLUSH	.macro	Dn
	cmpi.b	#4,$0CBC.w
	bhs	@_060
	movec.l	cacr,Dn
	or.w	#$0808,Dn		;CD=1,CI=1
	movec.l	Dn,cacr
	bra	@exit
@_060:	cpusha	bc
@exit:
	.endm

PUSH_CACR	.macro	Dn
	movec.l	cacr,Dn
	move.l	Dn,-(sp)
	.endm

PUSH_CACR_DISABLE_BC	.macro	Dn
	movec.l	cacr,Dn
	move.l	Dn,-(sp)
	cmpi.b	#4,$0CBC.w
	bhs	@_060
	and.w	#$FEFE,Dn		;ED=0,EI=0
	or.w	#$0808,Dn		;CD=1,CI=1
	movec.l	Dn,cacr
	bra	@exit
@_060:	and.l	#$7FFF7FFF,Dn		;EDC=0,EIC=0
	movec.l	Dn,cacr
	cpusha	bc
@exit:
	.endm

PUSH_CACR_DISABLE_DC	.macro	Dn
	movec.l	cacr,Dn
	move.l	Dn,-(sp)
	cmpi.b	#4,$0CBC.w
	bhs	@_060
	bclr.l	#8,Dn			;ED=0
	beq	@exit
	or.w	#$0800,Dn		;CD=1
	movec.l	Dn,cacr
	bra	@exit
@_060:	bclr.l	#31,Dn			;EDC=0
	beq	@exit
	movec.l	Dn,cacr
	cpusha	dc
@exit:
	.endm

POP_CACR	.macro	Dn
	move.l	(sp)+,Dn
	movec.l	Dn,cacr
	.endm

;TC
TC_E_BIT	equ	15	;Enable
TC_P_BIT	equ	14	;Page Size
TC_NAD_BIT	equ	13	;No Allocate Mode (Data Cache)
TC_NAI_BIT	equ	12	;No Allocate Mode (Instruction Cache)
TC_FOTC_BIT	equ	11	;1/2-Cache Mode (Data ATC)
TC_FITC_BIT	equ	10	;1/2-Cache Mode (Instruction ATC)
TC_DCO_BIT	equ	8	;Default Cache Mode (Data Cache)
TC_DUO_BIT	equ	6	;Default UPA bits (Data Cache)
TC_DWO_BIT	equ	5	;Default Write Protect (Data Cache)
TC_DCI_BIT	equ	3	;Default Cache Mode (Instruction Cache)
TC_DUI_BIT	equ	1	;Default UPA Bits (Instruction Cache)
;			 E  P NAD NAI FOTC FITC DCO DUO DWO DCI DUI
;			 15 14 13 12  11   10   98  76  5   43  21
TC_E		equ	%1__0__0__0___0____0____00__00__0___00__00_0
TC_P		equ	%0__1__0__0___0____0____00__00__0___00__00_0
TC_NAD		equ	%0__0__1__0___0____0____00__00__0___00__00_0
TC_NAI		equ	%0__0__0__1___0____0____00__00__0___00__00_0
TC_FOTC		equ	%0__0__0__0___1____0____00__00__0___00__00_0
TC_FITC		equ	%0__0__0__0___0____1____00__00__0___00__00_0
TC_DCO_WT	equ	%0__0__0__0___0____0____00__00__0___00__00_0
TC_DCO_CB	equ	%0__0__0__0___0____0____01__00__0___00__00_0
TC_DCO_NP	equ	%0__0__0__0___0____0____10__00__0___00__00_0
TC_DCO_NI	equ	%0__0__0__0___0____0____11__00__0___00__00_0
TC_DUO_00	equ	%0__0__0__0___0____0____00__00__0___00__00_0
TC_DUO_01	equ	%0__0__0__0___0____0____00__01__0___00__00_0
TC_DUO_10	equ	%0__0__0__0___0____0____00__10__0___00__00_0
TC_DUO_11	equ	%0__0__0__0___0____0____00__11__0___00__00_0
TC_DWO		equ	%0__0__0__0___0____0____00__00__1___00__00_0
TC_DCI_WT	equ	%0__0__0__0___0____0____00__00__0___00__00_0
TC_DCI_CB	equ	%0__0__0__0___0____0____00__00__0___01__00_0
TC_DCI_NP	equ	%0__0__0__0___0____0____00__00__0___10__00_0
TC_DCI_NI	equ	%0__0__0__0___0____0____00__00__0___11__00_0
TC_DUI_00	equ	%0__0__0__0___0____0____00__00__0___00__00_0
TC_DUI_01	equ	%0__0__0__0___0____0____00__00__0___00__01_0
TC_DUI_10	equ	%0__0__0__0___0____0____00__00__0___00__10_0
TC_DUI_11	equ	%0__0__0__0___0____0____00__00__0___00__11_0

;Transparent Translation Registers
TT_BASE_BIT	equ	24	;Logical Address Base
TT_MASK_BIT	equ	16	;Logical Address Mask
TT_E_BIT	equ	15	;Enable
TT_S_BIT	equ	13	;Supervisor Mode
TT_U1_BIT	equ	9	;User Page Attributes
TT_U0_BIT	equ	8	;User Page Attributes
TT_CM_BIT	equ	5	;Cache Mode
TT_W_BIT	equ	2	;Write Protect
;			   BASE     MASK   E iS    U1U0  CM    W
TT_BASE_MASK	equ	%11111111_00000000_0_00_000_00_0_00_00_0_00
TT_MASK_MASK	equ	%00000000_11111111_0_00_000_00_0_00_00_0_00
TT_E		equ	%00000000_00000000_1_00_000_00_0_00_00_0_00
TT_S_MASK	equ	%00000000_00000000_0_11_000_00_0_00_00_0_00
TT_S_USER	equ	%00000000_00000000_0_00_000_00_0_00_00_0_00
TT_S_SUPER	equ	%00000000_00000000_0_01_000_00_0_00_00_0_00
TT_S_IGNORE	equ	%00000000_00000000_0_10_000_00_0_00_00_0_00
TT_U1		equ	%00000000_00000000_0_00_000_10_0_00_00_0_00
TT_U0		equ	%00000000_00000000_0_00_000_01_0_00_00_0_00
TT_CM_MASK	equ	%00000000_00000000_0_00_000_00_0_11_00_0_00
TT_CM_WT	equ	%00000000_00000000_0_00_000_00_0_00_00_0_00
TT_CM_CB	equ	%00000000_00000000_0_00_000_00_0_01_00_0_00
TT_CM_NP	equ	%00000000_00000000_0_00_000_00_0_10_00_0_00
TT_CM_NI	equ	%00000000_00000000_0_00_000_00_0_11_00_0_00
TT_W		equ	%00000000_00000000_0_00_000_00_0_00_00_1_00

;Transfer Cycle Type
;			 TT
TT_MOVE		equ	%00
TT_MOVE16	equ	%01
TT_MOVES	equ	%10
TT_INTERRUPT	equ	%11

;Transfer Cycle Modifier
;			 TM
TM_PUSH		equ	%000
TM_USER_DATA	equ	%001
TM_USER_CODE	equ	%010
TM_MMU_DATA	equ	%011
TM_MMU_CODE	equ	%100
TM_SUPER_DATA	equ	%101
TM_SUPER_CODE	equ	%110
;		equ	%111

;Fanction Code
;			 FC	 TT TM
FC_CACHE_PUSH	equ	%000	;10 000
FC_USER_DATA	equ	%001	;00 001
FC_USER_CODE	equ	%010	;00 010
FC_MMU_DATA	equ	%011	;10 011
FC_MMU_CODE	equ	%100	;10 100
FC_SUPER_DATA	equ	%101	;00 101
FC_SUPER_CODE	equ	%110	;00 110
;		equ	%111	;10 111

PUSH_SFC_DFC	.macro	Dn
	movec.l	dfc,Dn
	move.l	Dn,-(sp)
	movec.l	sfc,Dn
	move.l	Dn,-(sp)
	.endm

MMU_SFC_DFC	.macro	Dn
	moveq.l	#FC_MMU_DATA,Dn
	movec.l	Dn,sfc
	movec.l	Dn,dfc
	.endm

PUSH_MMU_SFC_DFC	.macro	Dn
	PUSH_SFC_DFC	Dn
	MMU_SFC_DFC	Dn
	.endm

POP_SFC_DFC	.macro	Dn
	move.l	(sp)+,Dn
	movec.l	Dn,sfc
	move.l	(sp)+,Dn
	movec.l	Dn,dfc
	.endm

;Cache Mode
CM_WRITETROUGH	equ	%00	;Writethrough, cachable
CM_COPYBACK	equ	%01	;Copyback, cachable
CM_PRECISE	equ	%10	;Cache-inhibited, precise exception model
CM_IMPRECISE	equ	%11	;Cache-inhibited, imprecise exception model

;Root/Pointer Descriptor
RPD_ADR_BIT	equ	9	;Pointer/Page Table Address
RPD_U_BIT	equ	3	;Used
RPD_W_BIT	equ	2	;Write Protected
RPD_UDT_BIT	equ	0	;Upper Level Descriptor Type
;			      TABLE ADDRESS            U W UDT
RPD_ADR_MASK	equ	%11111111111111111111111_00000_0_0_00
RPD_U		equ	%00000000000000000000000_00000_1_0_00
RPD_W		equ	%00000000000000000000000_00000_0_1_00
RPD_UDT_MASK	equ	%00000000000000000000000_00000_0_0_11
RPD_UDT_INVALID	equ	%00000000000000000000000_00000_0_0_00
RPD_UDT_RESIDENT equ	%00000000000000000000000_00000_0_0_11

;Page Descriptor
PD_8ADR_BIT	equ	13	;Physical Address
PD_4ADR_BIT	equ	12	;Physical Address
PD_UR_BIT	equ	11	;User Reserved
PD_G_BIT	equ	10	;Global
PD_U1_BIT	equ	9	;User Page Attributes
PD_U0_BIT	equ	8	;User Page Attributes
PD_U1U0_BIT	equ	8	;User Page Attributes
PD_S_BIT	equ	7	;Supervisor Protected
PD_CM_BIT	equ	5	;Cache Mode
PD_M_BIT	equ	4	;Modified
PD_U_BIT	equ	3	;Used
PD_W_BIT	equ	2	;Write Protected
PD_PDT_BIT	equ	0	;Page Descriptor Type
;				   PHYSICAL ADDRESS  UR G U1U0 S CM M U W PDT
PD_8ADR_MASK		equ	%1111111111111111111_00_0__00__0_00_0_0_0_00
PD_4ADR_MASK		equ	%11111111111111111111_0_0__00__0_00_0_0_0_00
PD_8UR_MASK		equ	%0000000000000000000_11_0__00__0_00_0_0_0_00
PD_4UR			equ	%00000000000000000000_1_0__00__0_00_0_0_0_00
PD_G			equ	%00000000000000000000_0_1__00__0_00_0_0_0_00
PD_U1U0_MASK		equ	%00000000000000000000_0_0__11__0_00_0_0_0_00
PD_U1			equ	%00000000000000000000_0_0__10__0_00_0_0_0_00
PD_U0			equ	%00000000000000000000_0_0__01__0_00_0_0_0_00
PD_S			equ	%00000000000000000000_0_0__00__1_00_0_0_0_00
PD_CM_MASK		equ	%00000000000000000000_0_0__00__0_11_0_0_0_00
PD_CM_WRITETROUGH	equ	%00000000000000000000_0_0__00__0_00_0_0_0_00
PD_CM_COPYBACK		equ	%00000000000000000000_0_0__00__0_01_0_0_0_00
PD_CM_PRECISE		equ	%00000000000000000000_0_0__00__0_10_0_0_0_00
PD_CM_IMPRECISE		equ	%00000000000000000000_0_0__00__0_11_0_0_0_00
PD_M			equ	%00000000000000000000_0_0__00__0_00_1_0_0_00
PD_U			equ	%00000000000000000000_0_0__00__0_00_0_1_0_00
PD_W			equ	%00000000000000000000_0_0__00__0_00_0_0_1_00
PD_PDT_MASK		equ	%00000000000000000000_0_0__00__0_00_0_0_0_11
PD_PDT_INVALID		equ	%00000000000000000000_0_0__00__0_00_0_0_0_00
PD_PDT_INDIRECT		equ	%00000000000000000000_0_0__00__0_00_0_0_0_10
PD_PDT_RESIDENT		equ	%00000000000000000000_0_0__00__0_00_0_0_0_11


;----------------------------------------------------------------
;
;	FSLW
;
;----------------------------------------------------------------
;FSLW
;     27  25 2423 2221 2019 181716 15 14  13  12  11  10  9  8  7  6   5  4  3   2   0
;     MA  LK  RW  SIZE  TT    TM   IO PBE SBE PTA PTB IL PF SP WP TWE RE WE TTR BPE SEE
;%0000_0_0_0__00___00___00____000___0__0___0___0___0___0__0__0__0__0___0__0__0___0_0_0

FSLW_MA_BIT		equ	27
FSLW_LK_BIT		equ	25
FSLW_RW_BIT		equ	23
FSLW_SIZE_BIT		equ	21
FSLW_TT_BIT		equ	19
FSLW_TM_BIT		equ	16
FSLW_IO_BIT		equ	15
FSLW_PBE_BIT		equ	14
FSLW_SBE_BIT		equ	13
FSLW_PTA_BIT		equ	12
FSLW_PTB_BIT		equ	11
FSLW_IL_BIT		equ	10
FSLW_PL_BIT		equ	9
FSLW_SP_BIT		equ	8
FSLW_WP_BIT		equ	7
FSLW_TWE_BIT		equ	6
FSLW_RE_BIT		equ	5
FSLW_WE_BIT		equ	4
FSLW_TTR_BIT		equ	3
FSLW_BPE_BIT		equ	2
FSLW_SEE_BIT		equ	0

;----------------------------------------------------------------
;
;	アドレス変換
;
;----------------------------------------------------------------

;デスクリプタの領域のサイズ
MINIMUM_DESC_SIZE_0	equ	10*1024
MINIMUM_DESC_SIZE_16	equ	19*1024
MINIMUM_DESC_SIZE_32	equ	27*1024
MINIMUM_DESC_SIZE_64	equ	44*1024
MINIMUM_DESC_SIZE_128	equ	78*1024
MINIMUM_DESC_SIZE_256	equ	146*1024
MINIMUM_DESC_SIZE_384	equ	214*1024
MINIMUM_DESC_SIZE_512	equ	282*1024
MINIMUM_DESC_SIZE_768	equ	418*1024

DEFAULT_DESC_SIZE_0	equ	32*1024
DEFAULT_DESC_SIZE_16	equ	48*1024
DEFAULT_DESC_SIZE_32	equ	64*1024
DEFAULT_DESC_SIZE_64	equ	96*1024
DEFAULT_DESC_SIZE_128	equ	160*1024
DEFAULT_DESC_SIZE_256	equ	320*1024
DEFAULT_DESC_SIZE_384	equ	480*1024
DEFAULT_DESC_SIZE_512	equ	640*1024
DEFAULT_DESC_SIZE_768	equ	960*1024

;----------------------------------------------------------------
;
;	ローカルメモリ
;
;----------------------------------------------------------------

;LOCAL_MEMORY_BASE	equ	$10000000	;ローカルメモリのベースアドレス
;						;	$10000000

DEFAULT_JOIN_SIZE	equ	2048-16		;結合ブロックのサイズ(2048バイト)


;----------------------------------------------------------------
;
;	RAMDISKドライバ
;
;----------------------------------------------------------------

MAXIMUM_UNIT	equ	16	;最大ユニット数
DEFAULT_SIZE	equ	1024*2	;標準セクタ数(2MB)
MINIMUM_SIZE	equ	16	;最小セクタ数(16KB)
MAXIMUM_SIZE	equ	1024*768	;最大セクタ数(768MB)
ROOT_ENTRY	equ	512	;ルートディレクトリのエントリ数


;----------------------------------------------------------------
;
;	デバイスドライバのパッチ
;
;----------------------------------------------------------------

DEFAULT_BUFFER_SIZE	equ	PAGE_OFFSET_SIZE*8	;デバイス転送バッファのサイズ
				;(必ずページサイズの倍数にすること)


;----------------------------------------------------------------
;
;	ADPCM関係のIOCSコール
;
;----------------------------------------------------------------

ADPCM_SPLIT_SIZE	equ	1024	;ADPCM転送の分割サイズ(ページの半分以下,16の倍数)


;----------------------------------------------------------------
;
;	ファイル情報
;
;----------------------------------------------------------------

DEFAULT_FILE_INFO_SIZE	equ	32*1024	;ファイル情報の領域(ヒープ管理)のサイズ
FILE_INFO_HANDLES	equ	256	;ファイル情報の領域(ヒープ管理)の初期ハンドル数


;----------------------------------------------------------------
;
;	各種テーブル
;
;----------------------------------------------------------------
;----------------------------------------------------------------
;デバイスヘッダ
	.offset	0
dhNext:		.ds.l	1	;次のデバイスドライバへのポインタ(-1=終わり)
dhType:		.ds.w	1	;デバイスタイプ
dhStrategy:	.ds.l	1	;ストラテジルーチンのエントリポイント
dhInterrupt:	.ds.l	1	;割り込みルーチンのエントリポイント
dhName:		.ds.b	8	;デバイス名
;(22バイト)
	.text

;----------------------------------------------------------------
;ドライブ管理テーブル
	.offset	0
dDriveName:	.ds.b	2	;起動時の内部ドライブ名
				;仮想ドライブのとき→実体のドライブの内部ドライブ名
				;仮想ディレクトリの実体のドライブのとき→仮想ディレクトリの内部ドライブ名
dCurrentPath:	.ds.b	67	;カレントパス(前後と区切りは$09)
				;仮想ドライブのとき→実体のドライブのディレクトリ名
				;仮想ディレクトリの実体のドライブのとき→仮想ディレクトリのディレクトリ名
dAssignMode:	.ds.b	1	;_ASSIGNのモード
				;$40=通常,$50=仮想ドライブ,$60=仮想ディレクトリの実体のドライブ
dInnerDpbPtr:	.ds.l	1	;内部DPBテーブルへのポインタ
dCurrentPos:	.ds.w	1	;カレントディレクトリのクラスタ番号(0=ルートディレクトリ)
dPathLength:	.ds.w	1	;ドライブ名+パスの長さ-1
;(78バイト)
dSize:
	.text

;----------------------------------------------------------------
;内部DPBテーブル
	.offset	0
iDrive:		.ds.b	1	;起動時の内部ドライブ番号(0=A:)
iUnit:		.ds.b	1	;ユニット番号
iDeviceHeader:	.ds.l	1	;デバイスヘッダのアドレス
iNext:		.ds.l	1	;次の内部DPBテーブル(-1=終わり)
iBytePerSect:	.ds.w	1	;1セクタあたりのバイト数(0=特殊デバイスドライバ)
;(12バイト)
;(以下は特殊デバイスドライバには存在しない)
iSectPerCrust:	.ds.b	1	;1クラスタあたりのセクタ数-1
iSectPerCrust2:	.ds.b	1	;クラスタ数をセクタ数に変換するときのシフトカウント
				;bit7=1のとき2バイトFATの上下のバイトを入れ換える
iFatStart:	.ds.w	1	;FATの先頭セクタ番号
iHowManyFat:	.ds.b	1	;FAT領域の個数
iSectorPerFat:	.ds.b	1	;1個のFAT領域に使用するセクタ数
iRootEntries	.ds.w	1	;ルートディレクトリに入るエントリ数
iDataStart:	.ds.w	1	;データ部の先頭セクタ番号
iTotalCrust:	.ds.w	1	;総クラスタ数+1
iRootStart:	.ds.w	1	;ルートディレクトリの先頭セクタ番号
iMediaByte:	.ds.b	1	;メディアバイト
iBytePerSect2:	.ds.b	1	;セクタ数をバイト数に変換するときのシフトカウント
iSeFatStart:	.ds.w	1	;FAT検索の先頭セクタ番号
;(30バイト)
;(以下はdirsch=onのとき_FILES,_NFILES以外で使う)
iChDirStart:	.ds.l	1	;直前に変更したエントリがあるディレクトリの先頭のセクタ番号
iChDirCount:	.ds.w	1	;直前に変更したエントリがあるディレクトリの先頭から連続しているセクタ数-1
iChEntStart:	.ds.l	1	;直前に変更したエントリがあるセクタ番号
iChEntCount:	.ds.w	1	;直前に変更したエントリがあるセクタから連続しているセクタ数-1
iSeDirStart:	.ds.l	1	;直前に検索したエントリがあるディレクトリの先頭のセクタ番号
iSeDirCount:	.ds.w	1	;直前に検索したエントリがあるディレクトリの先頭から連続しているセクタ数-1
iSeEntStart:	.ds.l	1	;直前に検索したエントリがあるセクタ番号
iSeEntCount:	.ds.w	1	;直前に検索したエントリがあるセクタから連続しているセクタ数-1
iSeEntOffset:	.ds.w	1	;直前に検索したエントリのセクタ先頭からのオフセット
;(56バイト)
	.text

;----------------------------------------------------------------
;メモリ管理テーブル(ブロックのヘッダ)
;	オフセットはブロックのヘッダの先頭を0とする
	.offset	0
Prev:	.ds.l	1	;直前のブロックのヘッダ(0=リストの先頭)
Proc:	.ds.l	1	;このブロックを確保したプロセスのメモリ管理テーブル
			;最上位バイト
			;	%000xxxxx	通常のメモリブロック
			;	%110xxxxx	サブのメモリ管理の親または先頭
			;	%111xxxxx	常駐プロセス
Tail:	.ds.l	1	;ユーザ領域の末尾+1
			;(16バイトアラインメントなし,フリーブロックはヘッダの先頭+16)
			;最上位バイト
			;	%0xxxxxxx	ロックされていない
			;	%1xxxxxxx	ロックされている
Next:	.ds.l	1	;直後のブロックのヘッダ(0=リストの末尾)
User:			;ユーザ領域の先頭
	.text

;----------------------------------------------------------------
;プロセス管理テーブル
;	オフセットはメモリ空間の先頭を0とする
	.offset	16
pEnvPtr:	.ds.l	1	;$0010 環境の領域のアドレス
pExitvc:	.ds.l	1	;$0014 _EXITVCのベクタ
pCtrlvc:	.ds.l	1	;$0018 _CTRLVCのベクタ
pErrjvc:	.ds.l	1	;$001C _ERRJVCのベクタ
pCmdLinePtr:	.ds.l	1	;$0020 コマンドラインのアドレス
pHandler:	.ds.b	12	;$0024 ハンドラの使用状況
pBssTop:	.ds.l	1	;$0030 bssの先頭
pHeapTop:	.ds.l	1	;$0034 ヒープの先頭
pStackTop:	.ds.l	1	;$0038 スタックエリアの先頭
pUsp:		.ds.l	1	;$003C usp
pSsp:		.ds.l	1	;$0040 ssp
p_Sr:		.ds.w	1	;$0044 sr
pAbortSr:	.ds.w	1	;$0046 アボート時のsr
pAbortSsp:	.ds.l	1	;$0048 アボート時のssp
pTrap10:	.ds.l	1	;$004C TRAP#10のベクタ
pTrap11:	.ds.l	1	;$0050 TRAP#11のベクタ
pTrap12:	.ds.l	1	;$0054 TRAP#12のベクタ
pTrap13:	.ds.l	1	;$0058 TRAP#13のベクタ
pTrap14:	.ds.l	1	;$005C TRAP#14のベクタ
pOsFlag:	.ds.l	1	;$0060 OSフラグ(-1=Humanが起動,0=その他)
pModuleNumber:	.ds.b	1	;$0064 モジュール番号
		.ds.b	3	;$0065 未使用
pChildPtr:	.ds.l	1	;$0068 子プロセスのメモリ管理テーブル
pDeviceNoPush:	.ds.b	1	;$006C デバイス呼び出しのときキャッシュプッシュするか
				;	0	-npの指定に関わらずプッシュする
				;	-1	-npが指定されていたらプッシュしない
pAllocArea:	.ds.b	1	;$006D アロケートできる領域の条件
				;	0	下位のみ
				;	1	上位のみ
				;	2	親と同じ側のみ
				;	3	親と反対側のみ
				;	4	制限なし,下位優先
				;	5	制限なし,上位優先
				;	6	制限なし,親と同じ側優先
				;	7	制限なし,親と反対側優先
				;	8	制限なし,優先なし
pLoadCache:	.ds.b	1	;$006E (本体のメモリブロックのキャッシュモード)
pAllocCache:	.ds.b	1	;$006F (アロケートしたメモリブロックのキャッシュモード(w or c))
		.ds.l	1	;$0070 (使用中のメモリブロックのユーザ領域の合計サイズ)
		.ds.l	1	;$0074 (使用中のメモリブロックのユーザ領域の合計サイズの最大値)
		.ds.l	1	;$0078 (本体のメモリブロックのユーザ領域のサイズの最大値)
		.ds.l	1	;$007C (アロケートできるメモリブロックのユーザ領域のサイズの最大値)
pPath:		.ds.b	68	;$0080 実行ファイルのパス
pName:		.ds.b	24	;$00C4 実行ファイルのファイル名
		.ds.l	9	;$00DC 予約
;(240バイト)
pSize:
pProgram:
	.text

;----------------------------------------------------------------
;_NAMESTS形式のファイル名
	.offset	0
nFlag:		.ds.b	1		;フラグ
nDrive:		.ds.b	1		;内部ドライブ番号(0=A:)
nPath:		.ds.b	65		;パス(前後と区切りは$09または'\')
nName1:		.ds.b	8		;ファイル名1(残りは$20)
nExt:		.ds.b	3		;拡張子(残りは$20)
nName2:		.ds.b	10		;ファイル名2(残りは0)
;(88バイト)
nSize:
	.text

;----------------------------------------------------------------
;_NAMECKのバッファ
	.offset	0
ncDrive:	.ds.b	2	;'A:'		ドライブ名
ncPath:		.ds.b	65	;'\dir\',0	パス
ncName:		.ds.b	19	;'file',0	ファイル名
ncExt:		.ds.b	5	;'.ext',0	拡張子
;(91バイト)
	.even
ncSize:
	.text

;----------------------------------------------------------------
;_FILES,_NFILESのバッファ
;fSys〜は環境によって異なるので使わないこと
;fLong〜はバッファアドレスのbit31を1にしたとき有効
	.offset	0
fSysAttribute:	.ds.b	1	;検索する属性
fSysDrive:	.ds.b	1	;検索する内部ドライブ番号(0=A:)
fSysSector:	.ds.l	1	;エントリがあるセクタ番号
fSysConnect:	.ds.w	1	;連続しているセクタ数-1
fSysOffset:	.ds.w	1	;セクタ先頭からのオフセット
				;($FFFF=該当するファイルがもうない)
fSysName:	.ds.b	8	;検索するファイル名
fSysExt:	.ds.b	3	;検索する拡張子
fAttribute:	.ds.b	1	;属性
fTime:		.ds.w	1	;時刻
fDate:		.ds.w	1	;日付
fLength:	.ds.l	1	;ファイルサイズ
fName:		.ds.b	23	;ファイル名
fSize		equ	((*)+1).and.-2
fLongDrive:	.ds.b	2	;内部ドライブ名(A:〜)
fLongPath:	.ds.b	65	;パス(区切りは'\')
fLongName1:	.ds.b	8	;ファイル名1(残りは$20または'?')
fLongExt:	.ds.b	3	;拡張子(残りは$20または'?')
fLongName2:	.ds.b	10	;ファイル名2(残りは0)
fLongSize	equ	((*)+1).and.-2
	.text

;----------------------------------------------------------------
;スレッド管理テーブル
	.offset	0
tNext:		.ds.l	1	;次のスレッド管理テーブルのアドレス
tFlag:		.ds.b	1	;ウェイトフラグ(-2=強制スリープ状態,-1=スリープ状態,0=実行中)
tCount:		.ds.b	1	;カウンタ
tNice:		.ds.b	1	;最大カウント(優先レベル)
tDosCall:	.ds.b	1	;実行中の(レベル0で入った)DOSコール番号
tProcess:	.ds.l	1	;実行中のプロセスのメモリ管理テーブル
tRegs:
tRegUsp:	.ds.l	1	;usp
tRegD0:		.ds.l	1	;d0
tRegD1:		.ds.l	1	;d1
tRegD2:		.ds.l	1	;d2
tRegD3:		.ds.l	1	;d3
tRegD4:		.ds.l	1	;d4
tRegD5:		.ds.l	1	;d5
tRegD6:		.ds.l	1	;d6
tRegD7:		.ds.l	1	;d7
tRegA0:		.ds.l	1	;a0
tRegA1:		.ds.l	1	;a1
tRegA2:		.ds.l	1	;a2
tRegA3:		.ds.l	1	;a3
tRegA4:		.ds.l	1	;a4
tRegA5:		.ds.l	1	;a5
tRegA6:		.ds.l	1	;a6
tRegSr:		.ds.w	1	;sr
tRegPc:		.ds.l	1	;pc
tRegSsp:	.ds.l	1	;ssp
tDosLevel:	.ds.w	1	;DOSコールのレベル
tDosSp:		.ds.l	1	;DOSコールにレベル0で入ったときのsp
tCBuffer:	.ds.l	1	;スレッド間通信バッファのアドレス
tThreadName:	.ds.b	16	;スレッド名
tWaitTime:	.ds.l	1	;ウェイトタイム
;(以下は_GET_PRでコピーされない)
tMemStart:	.ds.l	1	;_MALLOCできるメモリ空間の先頭アドレス
tMemEnd:	.ds.l	1	;_MALLOCできるメモリ空間の末尾アドレス+1
;(124バイト)
tSize:
	.text

;----------------------------------------------------------------
;スレッドの排他制御情報
;	順序などに依存しているので無闇に変更しないこと
	.offset	0
xFsave:		.ds.x	1	;FPUの内部状態
xFpcr:		.ds.l	1	;fpcr
xFpsr:		.ds.l	1	;fpsr
xFpiar:		.ds.l	1	;fpiar
xFp0:		.ds.x	1	;fp0
xFp1:		.ds.x	1	;fp1
xFp2:		.ds.x	1	;fp2
xFp3:		.ds.x	1	;fp3
xFp4:		.ds.x	1	;fp4
xFp5:		.ds.x	1	;fp5
xFp6:		.ds.x	1	;fp6
xFp7:		.ds.x	1	;fp7
;120
;標準ハンドラの排他制御情報が-1のときはハンドラ不足なので,
;メインスレッドの排他制御情報を使う
xStdin:		.ds.w	1	;標準入力ハンドラ
xStdout:	.ds.w	1	;標準出力ハンドラ
xStderr:	.ds.w	1	;標準エラー入出力ハンドラ
xStdaux:	.ds.w	1	;標準シリアル入出力ハンドラ
xStdprn:	.ds.w	1	;標準プリンタ出力ハンドラ
;130
xDup0Table:	.ds.w	5	;標準ハンドラのハンドラ番号変換テーブル
;140
xDriveTablePtr:	.ds.l	1	;ドライブ管理テーブルの先頭([$1C38.w].l)
;144
xCurrentDrive:	.ds.b	1	;カレントドライブ番号([$1C15.w].b)
;145
xBreakMode:	.ds.b	1	;breakのモード([$1C12.w].b)
		.even
;146
;排他制御情報のサイズ(ドライブ管理テーブルを伴わない場合)
xSize:
xDriveTable:	.ds.b	dSize*26	;ドライブ管理テーブル(2028バイト)
;2174
		.align	16
;2176
;排他制御情報のサイズ(ドライブ管理テーブルを伴う場合)
xSize2:
	.text

;----------------------------------------------------------------
;DOSコールにレベル0で入ったときのssp([$1C5C].l)からのオフセット
	.offset	0
dosD1:		.ds.l	1	;$0000	d1
dosD2:		.ds.l	1	;$0004	d2
dosD3:		.ds.l	1	;$0008	d3
dosD4:		.ds.l	1	;$000C	d4
dosD5:		.ds.l	1	;$0010	d5
dosD6:		.ds.l	1	;$0014	d6
dosD7:		.ds.l	1	;$0018	d7
dosA0:		.ds.l	1	;$001C	a0
dosA1:		.ds.l	1	;$0020	a1
dosA2:		.ds.l	1	;$0024	a2
dosA3:		.ds.l	1	;$0028	a3
dosA4:		.ds.l	1	;$002C	a4
dosA5:		.ds.l	1	;$0030	a5
dosA6:		.ds.l	1	;$0034	a6
dosSR:		.ds.w	1	;$0038	sr
dosPC:		.ds.l	1	;$003A	pc
dosFormat:	.ds.w	1	;$003E	format
dosSSP:				;$0040
	.even
dosSize:
	.text

;----------------------------------------------------------------
;
;	ヒープ
;
;----------------------------------------------------------------
;ヘッダ
	.offset	0
hpHeaderMark:	.ds.l	1	;'060T'
		.ds.l	1	;'HEAP'
hpHeadHdl:	.ds.l	1	;ヒープの先頭のハンドル(1番目のハンドル,ヘッダとハンドルテーブル)
hpTailHdl:	.ds.l	1	;ヒープの末尾のハンドル(2番目のハンドル,番兵,長さ=0)
hpFreeHdl:	.ds.l	1	;フリーハンドルリストの先頭
hpIncrease:	.ds.l	1	;ハンドルが不足したとき1度に増加させるハンドル数
		.ds.l	2	;予備
hpHeaderSize:			;ヒープのヘッダのサイズは32バイトに固定
hpHandleStart:			;ハンドルテーブルの先頭
	.text
;ハンドル
;全領域再配置可能,フラグは存在しない
	.offset	0
hdPtr:		.ds.l	1	;実体へのポインタ(16の倍数,0=フリーハンドル)
hdLength:	.ds.l	1	;使用中の長さ(0=末尾)
hdPrev:		.ds.l	1	;実体の直前にあるレコードへのハンドル(16の倍数,0=先頭)
				;フリーハンドルのときは無効
hdNext:		.ds.l	1	;実体の直後にあるレコードへのハンドル(16の倍数,0=末尾)
				;フリーハンドルのときは,
				;次のフリーハンドルへのポインタ(16の倍数,0=末尾)
hdSize:				;ハンドルのサイズは16バイトに固定
	.text

;----------------------------------------------------------------
;ファイル情報レコード
	.offset	0
fiType:		.ds.b	1	;このレコードのタイプ
				;	0	ファイル情報
				;	1	チェックデータ
				;	2	チェックルーチン
				;	3	パッチデータ
				;	4	パッチルーチン
		.ds.b	3	;予備
fiData:				;+$04
fiName:		.ds.b	23	;ファイル名の条件(パスは含まない,拡張子は含む)
fiCheckCaps:	.ds.b	1	;ファイル名の大文字と小文字の区別(0=しない,-1=する)
fiAttribute:	.ds.b	1	;属性の条件(-1=条件なし,負数でも-1以外は条件が有効)
	.even
fiDateTime:
fiDate:		.ds.w	1	;日付の条件(-1=条件なし,負数でも-1以外は条件が有効)
fiTime:		.ds.w	1	;時刻の条件(-1=条件なし,負数でも-1以外は条件が有効)
fiLength:	.ds.l	1	;ファイルサイズの条件(-1=条件なし)
fiCheckHdl:	.ds.l	1	;チェックデータへのハンドル(0=チェックデータなし)
fiCheckCodeHdl:	.ds.l	1	;チェックルーチンへのハンドル(0=チェックルーチンなし)
fiHashNumber:	.ds.w	1	;ハッシュ関数値(大文字と小文字を区別しない)
fiHashNextHdl:	.ds.l	1	;同じハッシュ関数値を持つ次のレコードへのハンドル
fiPatchHdl:	.ds.l	1	;パッチデータへのハンドル(0=パッチデータなし)
fiPatchCodeHdl:	.ds.l	1	;パッチルーチンへのハンドル(0=パッチルーチンなし)
fiLoadArea:	.ds.b	1	;ロード領域の指定
fiAllocArea:	.ds.b	1	;アロケート領域の指定
fiLoadCache:	.ds.b	1	;ロード領域のキャッシュモード
fiAllocCache:	.ds.b	1	;アロケート領域のキャッシュモード
	.align	4
fiSize:
	.text

;----------------------------------------------------------------
;MFP割り込みベクタ
RTC1HZ	equ	$0100
EXPWOF	equ	$0104
PWOF	equ	$0108
FMINT	equ	$010C
TIMERD	equ	$0110
TIMERC	equ	$0114
VDISP	equ	$0118
RTCCLK	equ	$011C
TIMERB	equ	$0120
UTE	equ	$0124
UTBE	equ	$0128
URE	equ	$012C
URF	equ	$0130
TIMERA	equ	$0134
CRTCIRQ	equ	$0138
HSYNC	equ	$013C

;----------------------------------------------------------------
;DMAC割り込みベクタ
DMAC3NIV	equ	$01A8
DMAC3EIV	equ	$01AC

;----------------------------------------------------------------
;MFPレジスタ
GPIPDR	equ	$00E88001
AER	equ	$00E88003
DDR	equ	$00E88005
IERA	equ	$00E88007
IERB	equ	$00E88009
IPRA	equ	$00E8800B
IPRB	equ	$00E8800D
ISRA	equ	$00E8800F
ISRB	equ	$00E88011
IMRA	equ	$00E88013
IMRB	equ	$00E88015
VECTR	equ	$00E88017
TACR	equ	$00E88019
TBCR	equ	$00E8801B
TCDCR	equ	$00E8801D
TADR	equ	$00E8801F
TBDR	equ	$00E88021
TCDR	equ	$00E88023
TDDR	equ	$00E88025
SCR	equ	$00E88027
UCR	equ	$00E88029
RSR	equ	$00E8802B
TSR	equ	$00E8802D
UDR	equ	$00E8802F

;----------------------------------------------------------------
;DMACレジスタ
DMAC2	equ	$00E84080
CSR2	equ	$00E84080
CER2	equ	$00E84081
DCR2	equ	$00E84084
OCR2	equ	$00E84085
SCR2	equ	$00E84086
CCR2	equ	$00E84087
MTC2	equ	$00E8408A
MAR2	equ	$00E8408C
DAR2	equ	$00E84094
BTC2	equ	$00E8409A
BAR2	equ	$00E8409C
NIV2	equ	$00E840A5
EIV2	equ	$00E840A7
MFC2	equ	$00E840A9
CPR2	equ	$00E840AD
DFC2	equ	$00E840B1
BFC2	equ	$00E840B9

DMAC3	equ	$00E840C0
CSR3	equ	$00E840C0
CER3	equ	$00E840C1
DCR3	equ	$00E840C4
OCR3	equ	$00E840C5
SCR3	equ	$00E840C6
CCR3	equ	$00E840C7
MTC3	equ	$00E840CA
MAR3	equ	$00E840CC
DAR3	equ	$00E840D4
BTC3	equ	$00E840DA
BAR3	equ	$00E840DC
NIV3	equ	$00E840E5
EIV3	equ	$00E840E7
MFC3	equ	$00E840E9
CPR3	equ	$00E840ED
DFC3	equ	$00E840F1
BFC3	equ	$00E840F9

	.list
