296 lines
6.1 KiB
Plaintext
296 lines
6.1 KiB
Plaintext
; **
|
|
; ** 53C710 SCRIPTS for Progressive Peripherals, Inc. Zeus SCSI-2 driver
|
|
; **
|
|
; ** $Id: Zeus.script,v 1.2 1994/02/11 07:01:20 chopps Exp $
|
|
|
|
; **
|
|
; ** Absolute definitions
|
|
; **
|
|
|
|
ABSOLUTE ds_Device = 0x00
|
|
ABSOLUTE ds_Identify = ds_Device + 4
|
|
ABSOLUTE ds_Cmd = ds_Identify + 8
|
|
ABSOLUTE ds_Status = ds_Cmd + 8
|
|
ABSOLUTE ds_Msg = ds_Status + 8
|
|
ABSOLUTE ds_MsgOut = ds_Msg + 8
|
|
ABSOLUTE ds_MsgIn = ds_MsgOut + 8
|
|
ABSOLUTE ds_Data = ds_MsgIn + 8
|
|
|
|
;ABSOLUTE xx = 0x00ff00
|
|
;ABSOLUTE xx = 0x00ff01
|
|
;ABSOLUTE xx = 0x00ff02
|
|
;ABSOLUTE xx = 0x00ff03
|
|
;ABSOLUTE xx = 0x00ff04
|
|
;ABSOLUTE xx = 0x00ff05
|
|
;ABSOLUTE xx = 0x00ff06
|
|
;ABSOLUTE xx = 0x00ff07
|
|
;ABSOLUTE xx = 0x00ff08
|
|
;ABSOLUTE xx = 0x00ff09
|
|
;ABSOLUTE xx = 0x00ff10
|
|
;ABSOLUTE xx = 0x00ff11
|
|
;ABSOLUTE xx = 0x00ff12
|
|
;ABSOLUTE xx = 0x00ff13
|
|
;ABSOLUTE xx = 0x00ff14
|
|
;ABSOLUTE xx = 0x00ff15
|
|
;ABSOLUTE xx = 0x00ff16
|
|
;ABSOLUTE xx = 0x00ff17
|
|
;ABSOLUTE xx = 0x00ff18
|
|
;ABSOLUTE xx = 0x00ff19
|
|
;ABSOLUTE xx = 0x00ff20
|
|
;ABSOLUTE xx = 0x00ff21
|
|
;ABSOLUTE xx = 0x00ff22
|
|
;ABSOLUTE xx = 0x00ff23
|
|
;ABSOLUTE xx = 0x00ff24
|
|
;ABSOLUTE xx = 0x00ff25
|
|
;ABSOLUTE xx = 0x00ff26
|
|
;ABSOLUTE xx = 0x00fffb
|
|
;ABSOLUTE xx = 0x00fffc
|
|
;ABSOLUTE xx = 0x00fffd
|
|
;ABSOLUTE xx = 0x00fffe
|
|
|
|
ENTRY msgout, cmd, status, msgin, dataout, datain
|
|
|
|
PROC scripts:
|
|
|
|
; **
|
|
; ** Initial starting point - select device with ATN
|
|
; **
|
|
|
|
SELECT ATN FROM ds_Device, REL(x288)
|
|
JUMP REL(status), WHEN Status
|
|
MOVE CTEST7 | 0x10 TO CTEST7 ; ** disable selection timeout?
|
|
|
|
; **
|
|
; ** Should be message out phase [older devices won't respond to Select with ATN]
|
|
; **
|
|
|
|
msgout:
|
|
JUMP REL(cmd), IF Cmd ; **FIX** target wants command directly
|
|
INT 0x0000ff01, IF NOT Msg_Out ; ** expected message out
|
|
MOVE SCRATCH1 | 0x00 TO SFBR
|
|
JUMP REL(x78), IF 0x00
|
|
|
|
; **
|
|
; ** Scratch1 != 00 means we have a special message to send to the target
|
|
; ** (the synchronous negotiation message)
|
|
|
|
x30:
|
|
SET ATN
|
|
MOVE FROM ds_MsgOut, WHEN Msg_Out ; ** send message
|
|
|
|
x40:
|
|
JUMP REL(status), WHEN Status
|
|
MOVE FROM ds_MsgIn, WHEN Msg_In ; ** receive response
|
|
JUMP REL(status), WHEN Status
|
|
JUMP REL(x30), IF Msg_Out
|
|
JUMP REL(status), IF Status
|
|
JUMP REL(x180), IF Msg_In
|
|
JUMP REL(cmd)
|
|
|
|
; **
|
|
; ** send identify message
|
|
; **
|
|
|
|
x78:
|
|
MOVE FROM ds_Identify, WHEN Msg_Out
|
|
JUMP REL(status), WHEN Status
|
|
JUMP REL(x78), IF Msg_Out
|
|
JUMP REL(status), IF Status
|
|
JUMP REL(x180), IF Msg_In
|
|
|
|
; **
|
|
; ** Should be in command phase
|
|
; **
|
|
|
|
cmd:
|
|
INT 0x0000ff02, IF NOT Cmd ; ** expected command
|
|
MOVE FROM ds_Cmd, WHEN Cmd
|
|
JUMP REL(x1d8), WHEN Msg_In
|
|
JUMP REL(status), IF Status
|
|
JUMP REL(datain), IF Data_In
|
|
JUMP REL(dataout), IF Data_Out
|
|
INT 0x0000ff03 ; ** invalid phase after command
|
|
|
|
; **
|
|
; ** Should be in status phase
|
|
; **
|
|
|
|
status:
|
|
MOVE FROM ds_Status, WHEN Status
|
|
MOVE SIDL | 0x00 TO SFBR
|
|
MOVE SFBR | 0x00 TO SCRATCH0 ; ** save status in SCRATCH0
|
|
|
|
; **
|
|
; ** Should be in message in phase
|
|
; **
|
|
|
|
msgin:
|
|
INT 0x0000ff04, WHEN NOT Msg_In ; ** expected message in
|
|
MOVE FROM ds_Msg, WHEN Msg_In
|
|
;JUMP REL(msgin), IF 0x07 ; ** assume REJECT is for sync neg
|
|
INT 0x0000ff26, IF NOT 0x00 ; ** message byte != complete
|
|
CLEAR ACK
|
|
WAIT DISCONNECT
|
|
MOVE CTEST7 & 0xef TO CTEST7
|
|
MOVE SCRATCH0 | 0x00 TO SFBR ; ** check status byte
|
|
INT 0x0000fffc, IF 0x02 ; ** -> Check Condition
|
|
INT 0x0000fffb, IF 0x08 ; ** -> Busy
|
|
INT 0x0000fffd, IF 0x18 ; ** -> ??
|
|
INT 0x0000fffe, IF NOT 0x00 ; ** -> not good status
|
|
INT 0x0000ff00 ; ** -> normal completion
|
|
|
|
; **
|
|
; ** Should be in data out phase
|
|
; **
|
|
|
|
dataout:
|
|
MOVE FROM ds_Data, WHEN Data_Out
|
|
JUMP REL(chain_out), WHEN Data_Out
|
|
|
|
; **
|
|
; ** Check phase after data transfer
|
|
; **
|
|
|
|
x158:
|
|
JUMP REL(status), WHEN Status
|
|
JUMP REL(x230), IF Msg_In
|
|
INT 0x0000ff05 ; ** unexpected phase after data
|
|
|
|
; **
|
|
; ** Should be data in phase
|
|
; **
|
|
|
|
datain:
|
|
MOVE FROM ds_Data, WHEN Data_In
|
|
JUMP REL(chain_in), WHEN Data_In
|
|
JUMP REL(x158)
|
|
|
|
; **
|
|
; ** Got message in phase after sending message out
|
|
;
|
|
|
|
x180:
|
|
MOVE FROM ds_Msg, WHEN Msg_In
|
|
JUMP REL(x1a8), IF 0x01 ; ** -> Extended message
|
|
INT 0x0000ff08, IF 0x02 ; ** -> Save Data Pointer
|
|
JUMP REL(x1c0), IF 0x04 ; ** -> Disconnect
|
|
INT 0x0000ff06 ; ** Unexpected message
|
|
|
|
; **
|
|
; ** Extended message
|
|
; **
|
|
|
|
x1a8:
|
|
CLEAR ACK
|
|
MOVE FROM ds_MsgIn, WHEN Msg_In ; ** input message
|
|
INT 0x0000ff07 ; ** and interrupt
|
|
|
|
; **
|
|
; ** Disconnect message received
|
|
; **
|
|
|
|
x1c0:
|
|
CLEAR ACK
|
|
WAIT DISCONNECT
|
|
INT 0x0000ff09
|
|
|
|
; **
|
|
; ** Message in after command
|
|
; **
|
|
|
|
x1d8:
|
|
MOVE FROM ds_Msg, WHEN Msg_In ; ** get message byte
|
|
JUMP REL(x200), IF 0x01 ; ** -> Extended Message
|
|
INT 0x0000ff10, IF 0x02 ; ** -> Save Data Pointer
|
|
JUMP REL(x218), IF 0x04 ; ** -> Disconnect
|
|
INT 0x0000ff11 ; ** unexpected message
|
|
|
|
; **
|
|
; ** Extended message after command
|
|
; **
|
|
|
|
x200:
|
|
CLEAR ACK
|
|
MOVE FROM ds_MsgIn, WHEN Msg_In
|
|
INT 0x0000ff12
|
|
|
|
; **
|
|
; ** Disconnect after command
|
|
; **
|
|
|
|
x218:
|
|
CLEAR ACK
|
|
WAIT DISCONNECT
|
|
INT 0x0000ff13
|
|
|
|
; **
|
|
; ** Message in after data transfer
|
|
; **
|
|
|
|
x230:
|
|
MOVE FROM ds_Msg, WHEN Msg_In ; ** Get message byte
|
|
JUMP REL(x258), IF 0x01 ; ** -> Extended Message
|
|
INT 0x0000ff14, IF 0x02 ; ** -> Save Data Pointers
|
|
JUMP REL(x270), IF 0x04 ; ** -> Disconnected
|
|
INT 0x0000ff15 ; ** Unexpected message
|
|
|
|
; **
|
|
; ** Extended message after data transfer
|
|
; **
|
|
|
|
x258:
|
|
CLEAR ACK
|
|
MOVE FROM ds_MsgIn, WHEN Msg_In
|
|
INT 0x0000ff16
|
|
|
|
; **
|
|
; ** Disconnect after data transfer
|
|
; **
|
|
|
|
x270:
|
|
CLEAR ACK
|
|
WAIT DISCONNECT
|
|
INT 0x0000ff17
|
|
|
|
; **
|
|
; ** Selection aborted
|
|
; **
|
|
|
|
x288:
|
|
WAIT RESELECT REL (x2d0)
|
|
INT 0x0000ff18, WHEN NOT Msg_In
|
|
MOVE FROM ds_Msg, WHEN Msg_In
|
|
INT 0x0000ff19, WHEN Data_In
|
|
INT 0x0000ff20, IF Data_Out
|
|
INT 0x0000ff21, IF Msg_In
|
|
INT 0x0000ff22, IF Status
|
|
INT 0x0000ff23, IF Msg_Out
|
|
INT 0x0000ff24
|
|
|
|
x2d0:
|
|
INT 0x0000ff25
|
|
|
|
; **
|
|
; ** DMA chaining
|
|
; **
|
|
|
|
chain_in:
|
|
MOVE DSA0 + 8 TO SFBR
|
|
JUMP REL(chain_in1), IF NOT 00, AND MASK 0x07
|
|
MOVE DSA1 + 1 TO DSA1
|
|
chain_in1:
|
|
MOVE SFBR TO DSA0
|
|
MOVE FROM ds_Data, WHEN Data_In
|
|
JUMP REL(chain_in), WHEN Data_In
|
|
INT 0x0000ff27 ; ** DMA chain transfer complete
|
|
|
|
chain_out:
|
|
MOVE DSA0 + 8 TO SFBR
|
|
JUMP REL(chain_out1), IF NOT 00, AND MASK 0x07
|
|
MOVE DSA1 + 1 TO DSA1
|
|
chain_out1:
|
|
MOVE SFBR TO DSA0
|
|
MOVE FROM ds_Data, WHEN Data_Out
|
|
JUMP REL(chain_out), WHEN Data_Out
|
|
INT 0x0000ff27 ; ** DMA chain transfer complete
|