; general.ss Revision 2.0 1/1/93 GJ ; Single-threaded general purpose script ; Definition area INITIATOR ROLE (really starting roll) ; Offset for counts and addresses in the table Absolute sendmsg=0x00 Absolute rcvmsg=0x08 Absolute cmd_adr=0x10 Absolute device=0x18 Absolute status_adr=0x20 Absolute ext_buf=0x28 Absolute sync_in=0x30 Absolute data_adr=0x38 ; The script has finished initilizing the c8xx. Absolute done_init = 0x01 ABSOLUTE ok = 0x00 ABSOLUTE err1 = 0x0ff01 ABSOLUTE err2 = 0x0ff02 ABSOLUTE err3 = 0x0ff03 ABSOLUTE err4 = 0x0ff04 ABSOLUTE err5 = 0x0ff05 ABSOLUTE err6 = 0x0ff06 ABSOLUTE err7 = 0x0ff07 ABSOLUTE err8 = 0x0ff08 ABSOLUTE err9 = 0x0ff09 ; The addresses of chip registers that we need to access ABSOLUTE scratch_adr = 0xdfe34 ABSOLUTE dsa_adr = 0xdfe10 EXTERN dsa_storage, out_offset, in_offset ; SCSI I/O entry point. This address must be loaded into the ; 53C8xx before initiating a SCSI I/O. ENTRY init_siop ENTRY start_up ENTRY switch ENTRY datain ENTRY dataout init_siop: INT done_init start_up: SELECT ATN FROM device, REL(resel) ; Every phase comes back to here. switch: JUMP REL(msgin), WHEN MSG_IN JUMP REL(msgout), IF MSG_OUT JUMP REL(command_phase), IF CMD JUMP REL(dataout), IF DATA_OUT JUMP REL(datain), IF DATA_IN JUMP REL(end), IF STATUS INT err1 msgin: MOVE FROM rcvmsg, WHEN MSG_IN JUMP REL(ext_msg), IF 0x01 JUMP REL(disc), IF 0x04 CLEAR ACK JUMP REL(switch), IF 0x02 ; ignore save data pointers JUMP REL(switch), IF 0x07 ; ignore message reject :) JUMP REL(switch), IF 0x03 ; ignore restore data pointers INT err2 ext_msg: CLEAR ACK MOVE FROM ext_buf, WHEN MSG_IN JUMP REL(sync_msg), IF 0x03 INT err3 sync_msg: CLEAR ACK MOVE FROM sync_in, WHEN MSG_IN CLEAR ACK JUMP REL(switch) disc: MOVE SCNTL2 & 0x7f to SCNTL2 ;expect disconnect CLEAR ACK WAIT DISCONNECT WAIT RESELECT REL(select_adr) INT err4, WHEN NOT MSG_IN MOVE FROM rcvmsg, WHEN MSG_IN CLEAR ACK INT err9 JUMP REL(switch) msgout: MOVE FROM sendmsg, WHEN MSG_OUT JUMP REL(switch) command_phase: MOVE FROM cmd_adr, WHEN CMD JUMP REL(switch) ; After every data transfer add 8 to data_adr. This allows ; A scatter/gather operation when the list of addresses to ; read or write is appended to the end of the buffer_table. dataout: MOVE FROM data_adr, WHEN DATA_OUT MOVE DMODE & 0xDF TO DMODE ;Clear SIOM MOVE DMODE | 0x10 TO DMODE ;Set DIOM MOVE MEMORY 4, out_offset, scratch_adr MOVE DMODE & 0xCF TO DMODE ;Clear SIOM and DIOM CALL REL(addscratch) MOVE DMODE | 0x20 TO DMODE ;Set SIOM MOVE DMODE & 0xEF TO DMODE ;Clear DIOM MOVE MEMORY 4, scratch_adr, out_offset MOVE DMODE & 0xCF TO DMODE ;Clear SIOM and DIOM JUMP REL(switch) datain: MOVE FROM data_adr, WHEN DATA_IN MOVE DMODE & 0xDF TO DMODE ;Clear SIOM MOVE DMODE | 0x10 TO DMODE ;Set DIOM MOVE MEMORY 4, in_offset, scratch_adr MOVE DMODE & 0xCF TO DMODE ;Clear SIOM and DIOM CALL REL(addscratch) MOVE DMODE | 0x20 TO DMODE ;Set SIOM MOVE DMODE & 0xEF TO DMODE ;Clear DIOM MOVE MEMORY 4, scratch_adr, in_offset MOVE DMODE & 0xCF TO DMODE ;Clear SIOM and DIOM JUMP REL(switch) addscratch: MOVE SCRATCHA0 + 8 to SCRATCHA0 MOVE SCRATCHA0 to SFBR JUMP REL(ck_carry), IF 0x00 RETURN ck_carry: MOVE SCRATCHA1 + 1 to SCRATCHA1 RETURN end: MOVE FROM status_adr, WHEN STATUS INT err5, WHEN NOT MSG_IN MOVE FROM rcvmsg, WHEN MSG_IN MOVE SCNTL2 & 0x7f to SCNTL2 ;expect disconnect CLEAR ACK WAIT DISCONNECT INT ok resel: INT err6 select_adr: INT err7