misc/060tsys/t02const.equ
.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