;*********************************************************************** ; 53C710 SINGLE THREAD 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 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 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 alternate_address ;*********************************************************************** ; SCRIPT code single_thread: SELECT ATN FROM SCSI_id, alternate_address 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(to_decisions), WHEN MSG_REJECT_ ;compare with message reject ;and wait for valid phase 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(cmd_phase), WHEN CMD 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 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 alternate_address: INT select_error