;*********************************************************************** ; MULTI THREAD EXAMPLE ;*********************************************************************** ; ABSOLUTE declarations ABSOLUTE SCSI_id = 0 ; 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 RELATIVE buffers = 0 ;start of data buffers RELATIVE identify_msg_buf=0 ;identify_msg_buf=1 byte RELATIVE synch_msgo_buf=identify_msg_buf+1 ;synch_msgo_buf=5 bytes RELATIVE synch_msgi_buf=synch_msgo_buf+5 ;synch_msgi_buf=5 bytes RELATIVE cmd_buf=synch_msgi_buf+5 ;cmd_buf=12 bytes RELATIVE status_buf=cmd_buf+12 ;stat_buf=1 bytes RELATIVE msg_in_buf=status_buf+1 ;msg_in_buf=10 bytes RELATIVE data_buf = msg_in_buf+10 ;longword aligned ;*********************************************************************** ; ENTRY declarations ENTRY multi_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 disconnected ENTRY reselected ENTRY selected ENTRY SCSI_id_0 ENTRY SCSI_id_1 ENTRY SCSI_id_2 ENTRY id_1_to_decisions ENTRY id_2_to_decisions ENTRY io_request0 ENTRY io_request1 ENTRY io_request2 ;*********************************************************************** ; Scheduler SCRIPT code scheduler: io_request0: JUMP SCSI_id_0 io_request1: JUMP SCSI_id_1 io_request2: JUMP SCSI_id_2 JUMP reselected ;*********************************************************************** ; Main SCRIPT code multi_thread: SCSI_id_0: SELECT ATN SCSI_id, reselected JUMP 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 ; after synch negotiation on a test unit ready command initilize ; byte count back to 1 id_msg_out: MOVE 2, identify_msg_buf, WHEN MSG_OUT JUMP to_decisions, WHEN NOT MSG_OUT synch_msg_out: ; note: the extended message byte was moved with the identify message MOVE 4, synch_msgo_buf+1, WHEN MSG_OUT JUMP to_decisions, WHEN NOT MSG_IN msg_in_phase: MOVE 1, msg_in_buf, WHEN MSG_IN CLEAR ACK JUMP disconnected, IF DISCONNECT_ JUMP msg_in_phase, WHEN SAVE_DATAPTR_ ;compare data, wait for phase JUMP to_decisions, IF MSG_REJECT_ JUMP to_decisions, IF NOT MSG_IN synch_msg_in: INT error_not_extended_msg, IF NOT EXTEND_MSG_ MOVE 4, synch_msgi_buf, WHEN MSG_IN CLEAR ACK JUMP cmd_phase, WHEN CMD INT setup_SXFER cmd_phase: CLEAR ATN MOVE 6, cmd_buf, WHEN CMD JUMP to_decisions, WHEN NOT DATA_IN data_in_phase: MOVE 512, data_buf, WHEN DATA_IN JUMP status_phase, WHEN STATUS JUMP to_decisions data_out_phase: MOVE 512, data_buf, WHEN DATA_OUT JUMP to_decisions, WHEN NOT STATUS status_phase: MOVE 1, status_buf, WHEN STATUS MOVE 1, msg_in_buf, WHEN MSG_IN INT error_not_cmd_complete, IF NOT 0x00 CLEAR ACK WAIT DISCONNECT INT io_complete disconnected: WAIT DISCONNECT INT disconnected to_decisions: JUMP msg_in_phase, WHEN MSG_IN JUMP cmd_phase, IF CMD JUMP data_in_phase, IF DATA_IN JUMP data_out_phase, IF DATA_OUT JUMP status_phase, IF STATUS INT error_unexpected_phase SCSI_id_1: ; ; id_1_to_decisions: SCSI_id_2: ; ; id_2_to_decisions: ;Reselect SCRIPT code reselected: WAIT RESELECT selected ;initilize synchronous transfer register INT setup_SXFER SCSI_id_jump_table: JUMP id_0, IF 0x81 ;chip id 7, target id0 JUMP id_1, IF 0x82 JUMP id_2, IF 0x84 INT reselect_id_error id_0: MOVE 1, identify_msg_buf, WHEN MSG_IN CLEAR ACK JUMP to_decisions id_1: MOVE 1, identify_msg_buf, WHEN MSG_IN CLEAR ACK JUMP id_1_to_decisions id_2: MOVE 1, identify_msg_buf, WHEN MSG_IN CLEAR ACK JUMP id_2_to_decisions selected: INT select_error