misc/include/spc.equ
.nlist
.ifndef __spc_equ__
__spc_equ__ equ 1
;----------------------------------------------------------------
;
; MB89352 SPC
;
;----------------------------------------------------------------
;ベースアドレス
SPC_IN_BASE equ $00E96020 ;内蔵SPCベースアドレス
SPC_EX_BASE equ $00EA0000 ;拡張SPCベースアドレス
;レジスタ
;Bus Device ID
; 自分のID
SPC_BDID equ $01
;SPC Control
; RD|CR|DM|AE|PE|SE|RE|IE
SPC_SCTL equ $03
SPC_SCTL_RD_BIT equ 7
SPC_SCTL_RD equ %10000000 ;Reset & Disable。1=ハードウェアリセット
SPC_SCTL_CR_BIT equ 6
SPC_SCTL_CR equ %01000000 ;Control Reset。1=転送回路リセット
SPC_SCTL_DM_BIT equ 5
SPC_SCTL_DM equ %00100000 ;Diag Mode。1=自己診断モード
SPC_SCTL_AE_BIT equ 4
SPC_SCTL_AE equ %00010000 ;Arbitration Enable。0=アービトレーションフェーズなし(SASI),1=あり(SCSI)
SPC_SCTL_PE_BIT equ 3
SPC_SCTL_PE equ %00001000 ;Parity Enable。1=入力データのパリティをチェックする。出力データは常にパリティが付く
SPC_SCTL_SE_BIT equ 2
SPC_SCTL_SE equ %00000100 ;Select Enable。0=常にイニシエータ,1=セレクションフェーズが来たらターゲットになる
SPC_SCTL_RE_BIT equ 1
SPC_SCTL_RE equ %00000010 ;Reselect Enable。1=リセレクションフェーズに応答する
SPC_SCTL_IE_BIT equ 0
SPC_SCTL_IE equ %00000001 ;Interrupt Enable。0=割り込み禁止。禁止されていてもINTSは変化する。1=割り込み許可
;SPC Command
; BR/SL/RA/SA/TR/TP/RR/SR|RO|IT|PT|-|TM
SPC_SCMD equ $05
SPC_SCMD_CC_BIT equ 5
SPC_SCMD_CC equ %11100000 ;Command Code
SPC_SCMD_CC_BR equ %00000000 ; 0=Bus Release。ターゲットのときバスフリーフェーズへ移行
SPC_SCMD_CC_SL equ %00100000 ; 1=Select。セレクション/リセレクションを開始
SPC_SCMD_CC_RA equ %01000000 ; 2=Reset ATN。ATNをクリア
SPC_SCMD_CC_SA equ %01100000 ; 3=Set ATN。ATNをセット
SPC_SCMD_CC_TR equ %10000000 ; 4=Transfer。転送開始
SPC_SCMD_CC_TP equ %10100000 ; 5=Transfer Pause。転送中断
SPC_SCMD_CC_RR equ %11000000 ; 6=Reset ACK/REQ。CPU転送のときACK/REQをクリア
SPC_SCMD_CC_SR equ %11100000 ; 7=Set ACK/REQ。CPU転送のときACK/REQをセット
SPC_SCMD_RO_BIT equ 4
SPC_SCMD_RO equ %00010000 ;RST Out。1=SCSIバスリセット
SPC_SCMD_IT_BIT equ 3
SPC_SCMD_IT equ %00001000 ;Intercept Transfer。1=CPU転送時FIFOバッファの内容を保持
SPC_SCMD_PT_BIT equ 2
SPC_SCMD_PT equ %00000100 ;Program Transfer
; 0=自動転送
; DREQを使ってDREGでデータをやりとりする
; 1=プログラム転送
; SCMDでACK/REQを操作してTEMPでデータをやりとりする
; X680x0ではPEDECがDREQを使ってDREGのDTACKを作っている
; プログラム転送のときDREGは常にバスエラーになる
SPC_SCMD_TM_BIT equ 0
SPC_SCMD_TM equ %00000001 ;Termination Mode
; イニシエータのとき
; 0=カウント0で終了する
; 1=カウント0で終了しない(Padding)
; ターゲットのとき
; 0=パリティエラーがあってもカウント0まで転送する
; 1=パリティエラーがあると直ちに終了する
;Interrupt Sense
; SL|RS|DC|CC|SR|TO|HE|RC
SPC_INTS equ $09
SPC_INTS_SL equ %10000000 ;Selected。1=他のデバイスのセレクションフェーズで選択されてターゲットになった
SPC_INTS_RS equ %01000000 ;Reselected。1=他のデバイスのリセレクションフェーズで選択されてイニシエータになった
SPC_INTS_DC_BIT equ 5
SPC_INTS_DC equ %00100000 ;Disconnected。1=バスフリーフェーズになった。バスを使うとき0に戻すこと
SPC_INTS_CC_BIT equ 4
SPC_INTS_CC equ %00010000 ;Command Complete。1=SelectやTransferなどのコマンドが終了した。ターゲットのときパリティエラーで停止した
SPC_INTS_SR_BIT equ 3
SPC_INTS_SR equ %00001000 ;Service Required。1=PCTLレジスタとバスのフェーズが一致しないんだけどどうにかして
SPC_INTS_TO equ %00000100 ;Time Out
; 1=セレクション/リセレクションに応答がない
; セレクションタイムアウトのときSELが1のままなのでTEMP=$00で復旧させる必要がある
SPC_INTS_HE equ %00000010 ;SPC Hard Error。1=なんかエラーが出た。SERRを見てくれ
SPC_INTS_RC equ %00000001 ;Reset Condition。1=SCSIバスがリセットされた(RST信号が1になった)
;(Read) Phase Sense
; REQ|ACK|ATN|SEL|BSY|MSG|CD|IO
SPC_PSNS equ $0B
SPC_PSNS_REQ_BIT equ 7
SPC_PSNS_REQ equ %10000000 ;REQ
SPC_PSNS_ACK_BIT equ 6
SPC_PSNS_ACK equ %01000000 ;ACK
SPC_PSNS_ATN_BIT equ 5
SPC_PSNS_ATN equ %00100000 ;ATN
SPC_PSNS_SEL_BIT equ 4
SPC_PSNS_SEL equ %00010000 ;SEL。1=セレクションフェーズ
SPC_PSNS_BSY_BIT equ 3
SPC_PSNS_BSY equ %00001000 ;BSY
SPC_PSNS_MSG_BIT equ 2
SPC_PSNS_MSG equ %00000100 ;MSG
SPC_PSNS_CD_BIT equ 1
SPC_PSNS_CD equ %00000010 ;C/D
SPC_PSNS_IO_BIT equ 0
SPC_PSNS_IO equ %00000001 ;I/O
;(Write) SPC Diag Control
; REQ|ACK|XFER|-|BSY|MSG|CD|IO
SPC_SDGC equ $0B
SPC_SDGC_REQ_BIT equ 7
SPC_SDGC_REQ equ %10000000 ;Diag REQ
SPC_SDGC_ACK_BIT equ 6
SPC_SDGC_ACK equ %01000000 ;Diag ACK
SPC_SDGC_XFER_BIT equ 5
SPC_SDGC_XFER equ %00100000 ;Xfer Enable。1=CPU転送のときデータ転送割り込み許可
SPC_SDGC_BSY_BIT equ 3
SPC_SDGC_BSY equ %00001000 ;Diag BSY
SPC_SDGC_MSG_BIT equ 2
SPC_SDGC_MSG equ %00000100 ;Diag MSG
SPC_SDGC_CD_BIT equ 1
SPC_SDGC_CD equ %00000010 ;Diag C/D
SPC_SDGC_IO_BIT equ 0
SPC_SDGC_IO equ %00000001 ;Diag I/O
;SPC Status
; INIT|TARG|BUSY|TRIP|SRIN|TC0|DF|DE
SPC_SSTS equ $0D
SPC_SSTS_INIT_BIT equ 7
SPC_SSTS_INIT equ %10000000 ;Connected INIT。1=イニシエータ
SPC_SSTS_TARG_BIT equ 6
SPC_SSTS_TARG equ %01000000 ;Connected TARG。1=ターゲット
SPC_SSTS_BUSY_BIT equ 5
SPC_SSTS_BUSY equ %00100000 ;SPC Busy。1=コマンド実行中
SPC_SSTS_TRIP_BIT equ 4
SPC_SSTS_TRIP equ %00010000 ;Transfer in Progress。1=DMA転送中
SPC_SSTS_SRIN_BIT equ 3
SPC_SSTS_SRIN equ %00001000 ;SCSI Reset In。RST信号の状態
SPC_SSTS_TC0_BIT equ 2
SPC_SSTS_TC0 equ %00000100 ;TC=0。1=転送カウンタが0
SPC_SSTS_DF_BIT equ 1
SPC_SSTS_DF equ %00000010 ;DREG status Full。1=8バイトのFIFOが一杯
SPC_SSTS_DE_BIT equ 0
SPC_SSTS_DE equ %00000001 ;DREG status Empty。1=8バイトのFIFOが空
;SPC Error Status
; DI|DO|XO|-|PE|-|ST|-
SPC_SERR equ $0F
SPC_SERR_DI_BIT equ 7
SPC_SERR_DI equ %10000000 ;Data Error SCSI。1=入力データにパリティエラーがある
SPC_SERR_DO_BIT equ 6
SPC_SERR_DO equ %01000000 ;Data Error SPC。1=出力データにパリティエラーがある
SPC_SERR_XO_BIT equ 5
SPC_SERR_XO equ %00100000 ;Xfer Out。1=Xfer EnableのときData Request中
SPC_SERR_PE_BIT equ 3
SPC_SERR_PE equ %00001000 ;TC Parity Error。1=転送カウンタにパリティエラーがある
SPC_SERR_ST_BIT equ 1
SPC_SERR_ST equ %00000010 ;Short Transfer Period。1=REQ/ACKが速すぎてSPCが追従できない
;Phase Control
; IE|----|DO/DI/CO/SI/-/-/MO/MI,bit0:S/R
SPC_PCTL equ $11
SPC_PCTL_IE_BIT equ 7
SPC_PCTL_IE equ %10000000 ;Busfree INT Enable。1=バスフリーフェーズを検出したらDisconnected割り込みを要求する
SPC_PCTL_TP_BIT equ 0
SPC_PCTL_TP equ %00000111 ;Transfer Phase。転送フェーズ
SPC_PCTL_MSG_BIT equ 2
SPC_PCTL_MSG equ %00000100 ;MSG
SPC_PCTL_CD_BIT equ 1
SPC_PCTL_CD equ %00000010 ;C/D
SPC_PCTL_IO_BIT equ 0
SPC_PCTL_IO equ %00000001 ;I/O。0=Out,1=In
SPC_PCTL_SR_BIT equ 0
SPC_PCTL_SR equ %00000001 ;Selectコマンドのセレクション/リセレクション選択
SPC_PCTL_SR_R equ %00000001 ; 1=Selectコマンドはリセレクション
SPC_PCTL_SR_S equ %00000000 ; 0=Selectコマンドはセレクション
;Modified Byte Counter
SPC_MBC equ $13
;Data Register
; X680x0ではPEDECがDREQを使ってDREGのDTACKを作っている
; DREG status FullのときDREGにライトするとバスエラーになる
; DREG status EmptyのときDREGからリードするとバスエラーになる
; プログラム転送のときDREGは常にバスエラーになる
SPC_DREG equ $15
;Temporary Register
SPC_TEMP equ $17
;Transfer Counter High
SPC_TCH equ $19
;Transfer Counter Mid
SPC_TCM equ $1B
;Transfer Counter Low
SPC_TCL equ $1D
;フェーズ
SPC_PHASE_MASK equ %00000111
SPC_DATAOUT_PHASE equ %00000000 ; 0=Data Out Phase。データアウトフェーズ
SPC_DATAIN_PHASE equ %00000001 ; 1=Data In Phase。データインフェーズ
SPC_CMDOUT_PHASE equ %00000010 ; 2=Command Phase。コマンドアウトフェーズ
SPC_STSIN_PHASE equ %00000011 ; 3=Status Phase。ステータスインフェーズ
SPC_MSGOUT_PHASE equ %00000110 ; 6=Message Out Phase。メッセージアウトフェーズ
SPC_MSGIN_PHASE equ %00000111 ; 7=Message In Phase。メッセージインフェーズ
;ROM起動ハンドル
SCSI_HANDLE_IN equ $00FC0000 ;.l[8] 内蔵SCSI ROM起動ハンドル
SCSI_HANDLE_EX equ $00EA0020 ;.l[8] 拡張SCSI ROM起動ハンドル
.endif ;__spc_equ__
.list