;*********************************************************************** ; 53C710 SINGLE THREAD with DISCONNECT EXAMPLE ;*********************************************************************** ; ABSOLUTE declarations ; Messages ABSOLUTE CMD_COMPLETE_ = 0x00 ABSOLUTE EXTEND_MSG_ = 0x01 ABSOLUTE SAVE_DATAPTR_ = 0x02 ABSOLUTE DISCONNECT_ = 0x04 ABSOLUTE MSG_REJECT_ = 0x07 ; Interrupt codes ABSOLUTE error_not_cmd_phase = 0x01 ABSOLUTE error_not_data_in_phase = 0x02 ABSOLUTE error_not_data_out_phase = 0x03 ABSOLUTE error_not_msg_in_phase = 0x04 ABSOLUTE error_not_msg_out_phase = 0x05 ABSOLUTE error_not_status_phase = 0x06 ABSOLUTE error_unexpected_phase = 0x07 ABSOLUTE error_jump_not_taken = 0x10 ABSOLUTE error_not_cmd_complete = 0x20 ABSOLUTE error_not_extended_msg = 0x21 ABSOLUTE io_complete = 0x0A ABSOLUTE setup_SXFER = 0x888 ABSOLUTE reselect_id_error = 0x999 ABSOLUTE select_error = 0xfff ;*********************************************************************** ; RELATIVE declarations for Table Indirect offsets in bytes RELATIVE SCSI_id = 0 ;4 bytes of SCSI_id, synch offset ; and period RELATIVE identify_msg_buf = SCSI_id+4 ;8 bytes of byte count and address RELATIVE synch_msgo_buf = identify_msg_buf+8; " RELATIVE synch_msgi_buf = synch_msgo_buf+8 ; " RELATIVE cmd_buf = synch_msgi_buf+8 ; " RELATIVE status_buf = cmd_buf+8 ; " RELATIVE msg_in_buf = status_buf+8 ; " RELATIVE data_buf = msg_in_buf+8 ; " ;*********************************************************************** ; ENTRY declarations ENTRY single_thread_disc ENTRY to_decisions ENTRY id_msg_out ENTRY synch_msg_out ENTRY msg_in_phase ENTRY synch_msg_in ENTRY cmd_phase ENTRY data_in_phase ENTRY data_out_phase ENTRY status_phase ENTRY reselected ENTRY selected ;*********************************************************************** ; main SCRIPT code single_thread_disc: SELECT ATN FROM SCSI_id, REL(reselected) JUMP REL(to_decisions), WHEN NOT MSG_OUT ; msg_out_count must be initialized to 2 when negotiating synchronous ; this allows the identify message and the extended message to be ; sent out before ATN is deasserted ; note: ATN is automatically deasserted after a block move for ; message out phase id_msg_out: MOVE FROM identify_msg_buf, WHEN MSG_OUT JUMP REL(to_decisions), WHEN NOT MSG_OUT synch_msg_out: ; note: the extended message byte was moved with the identify message MOVE FROM synch_msgo_buf+1, WHEN MSG_OUT JUMP REL(to_decisions), WHEN NOT MSG_IN msg_in_phase: MOVE FROM msg_in_buf, WHEN MSG_IN CLEAR ACK JUMP REL(disconnected), IF DISCONNECT_ JUMP REL(msg_in_phase), WHEN SAVE_DATAPTR_ ;compare data, wait for phase JUMP REL(to_decisions), IF MSG_REJECT_ JUMP REL(to_decisions), IF NOT MSG_IN synch_msg_in: INT error_not_extended_msg, IF NOT EXTEND_MSG_ MOVE FROM synch_msgi_buf, WHEN MSG_IN CLEAR ACK JUMP REL(status_phase), WHEN STATUS INT setup_SXFER cmd_phase: CLEAR ATN MOVE FROM cmd_buf, WHEN CMD JUMP REL(to_decisions), WHEN NOT DATA_IN data_in_phase: MOVE FROM data_buf, WHEN DATA_IN JUMP REL(status_phase), WHEN STATUS JUMP REL(to_decisions) data_out_phase: MOVE FROM data_buf, WHEN DATA_OUT JUMP REL(to_decisions), WHEN NOT STATUS status_phase: MOVE FROM status_buf, WHEN STATUS MOVE FROM msg_in_buf, WHEN MSG_IN INT error_not_cmd_complete, IF NOT 0x00 CLEAR ACK WAIT DISCONNECT INT io_complete disconnected: WAIT DISCONNECT JUMP REL(reselected) to_decisions: JUMP REL(msg_in_phase), WHEN MSG_IN JUMP REL(cmd_phase), IF CMD JUMP REL(data_in_phase), IF DATA_IN JUMP REL(data_out_phase), IF DATA_OUT JUMP REL(status_phase), IF STATUS INT error_unexpected_phase ;Reselect SCRIPT code reselected: WAIT RESELECT REL(selected) SCSI_id_jump_table: JUMP REL(get_id_msg_in), IF 0x81 ;chip SCSI id 7, target SCSI id 0 JUMP REL(get_id_msg_in), IF 0x82 ;chip SCSI id 7, target SCSI id 1 JUMP get_id_msg_in, IF 0x81 ;chip SCSI id 7, target SCSI id 0 JUMP REL(get_id_msg_in), IF 0x84 ;chip SCSI id 7, target SCSI id 2 JUMP REL(get_id_msg_in), IF 0x88 ;chip SCSI id 7, target SCSI id 3 JUMP REL(get_id_msg_in), IF 0x90 ;chip SCSI id 7, target SCSI id 4 JUMP REL(get_id_msg_in), IF 0xA0 ;chip SCSI id 7, target SCSI id 5 JUMP REL(get_id_msg_in), IF 0xC0 ;chip SCSI id 7, target SCSI id 6 INT reselect_id_error get_id_msg_in: MOVE 1, identify_msg_buf, WHEN MSG_IN CLEAR ACK JUMP REL(to_decisions) selected: INT select_error