diff options
Diffstat (limited to 'sys/dev/microcode')
| -rw-r--r-- | sys/dev/microcode/siop/oosiop.ss | 307 |
1 files changed, 107 insertions, 200 deletions
diff --git a/sys/dev/microcode/siop/oosiop.ss b/sys/dev/microcode/siop/oosiop.ss index 284b0aeca56..b1c084f803c 100644 --- a/sys/dev/microcode/siop/oosiop.ss +++ b/sys/dev/microcode/siop/oosiop.ss @@ -1,9 +1,7 @@ -; $NetBSD: oosiop.ss,v 1.1 2001/12/05 18:27:13 fredette Exp $ +; $NetBSD: oosiop.ss,v 1.2 2003/04/06 09:48:42 tsutsui Exp $ ; -; Copyright (c) 2001 Matt Fredette -; Copyright (c) 1995 Michael L. Hitch -; All rights reserved. +; Copyright (c) 2001 Shuichiro URATA. All rights reserved. ; ; Redistribution and use in source and binary forms, with or without ; modification, are permitted provided that the following conditions @@ -13,11 +11,8 @@ ; 2. Redistributions in binary form must reproduce the above copyright ; notice, this list of conditions and the following disclaimer in the ; documentation and/or other materials provided with the distribution. -; 3. All advertising materials mentioning features or use of this software -; must display the following acknowledgement: -; This product includes software developed by Michael L. Hitch. -; 4. The name of the author may not be used to endorse or promote products -; derived from this software without specific prior written permission +; 3. The name of the author may not be used to endorse or promote products +; derived from this software without specific prior written permission. ; ; THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR ; IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES @@ -33,211 +28,123 @@ ; NCR 53c700 script ; + ARCH 700 -; -EXTERNAL ds_Device -EXTERNAL ds_MsgOut -EXTERNAL ds_Cmd -EXTERNAL ds_Status -EXTERNAL ds_Msg -EXTERNAL ds_MsgIn -EXTERNAL ds_ExtMsg -EXTERNAL ds_SyncMsg -EXTERNAL ds_Data1 - - -ABSOLUTE ok = 0xff00 -ABSOLUTE int_disc = 0xff01 -ABSOLUTE int_disc_wodp = 0xff02 -ABSOLUTE int_reconnect = 0xff03 -ABSOLUTE int_connect = 0xff04 -ABSOLUTE int_phase = 0xff05 -ABSOLUTE int_msgin = 0xff06 -ABSOLUTE int_extmsg = 0xff07 -ABSOLUTE int_msgsdp = 0xff08 -ABSOLUTE int_identify = 0xff09 -ABSOLUTE int_status = 0xff0a -ABSOLUTE int_syncmsg = 0xff0b - -ENTRY scripts -ENTRY switch -ENTRY wait_reselect -ENTRY dataout -ENTRY datain -ENTRY clear_ack - -PROC oosiop_script: - -scripts: - - SELECT ATN ds_Device, reselect -; -switch: - JUMP msgin, WHEN MSG_IN - JUMP msgout, IF MSG_OUT - JUMP command_phase, IF CMD - JUMP dataout, IF DATA_OUT - JUMP datain, IF DATA_IN - JUMP end, IF STATUS - INT int_phase ; Unrecognized phase +; interrupt codes +ABSOLUTE int_done = 0xbeef0000 +ABSOLUTE int_msgin = 0xbeef0001 +ABSOLUTE int_extmsg = 0xbeef0002 +ABSOLUTE int_resel = 0xbeef0003 +ABSOLUTE int_res_id = 0xbeef0004 +ABSOLUTE int_resfail = 0xbeef0005 +ABSOLUTE int_disc = 0xbeef0006 +ABSOLUTE int_err = 0xdeadbeef + +; patch entries +ENTRY p_resel_msgin_move +ENTRY p_select +ENTRY p_datain_jump +ENTRY p_dataout_jump +ENTRY p_msgin_move +ENTRY p_msgout_move +ENTRY p_cmdout_move +ENTRY p_status_move +ENTRY p_extmsglen_move +ENTRY p_extmsgin_move + + +PROC oosiop_script: + +ENTRY wait_reselect +wait_reselect: + WAIT RESELECT REL(reselect_fail) + INT int_resel +reselect_fail: + INT int_resfail + +ENTRY wait_resel_identify +wait_resel_identify: + INT int_err, WHEN NOT MSG_IN +p_resel_msgin_move: + MOVE 0, 0, WHEN MSG_IN + INT int_res_id + +ENTRY start_select +start_select: +p_select: + SELECT ATN 0, REL(wait_reselect) + +ENTRY phasedispatch +phasedispatch: + JUMP REL(msgin), WHEN MSG_IN + JUMP REL(msgout), WHEN MSG_OUT + JUMP REL(status), WHEN STATUS + JUMP REL(cmdout), WHEN CMD +p_datain_jump: + JUMP 0, WHEN DATA_IN +p_dataout_jump: + JUMP 0, WHEN DATA_OUT + INT int_err msgin: - MOVE 0, ds_MsgIn, WHEN MSG_IN - JUMP ext_msg, IF 0x01 ; extended message - JUMP disc, IF 0x04 ; disconnect message - JUMP msg_sdp, IF 0x02 ; save data pointers - JUMP msg_rej, IF 0x07 ; message reject - JUMP msg_rdp, IF 0x03 ; restore data pointers - INT int_msgin ; unrecognized message - -msg_rej: -; Do we need to interrupt host here to let it handle the reject? -msg_rdp: -clear_ack: - CLEAR ACK CLEAR ATN - JUMP switch - -ext_msg: +p_msgin_move: + MOVE 0, 0, WHEN MSG_IN + JUMP REL(complete), IF 0x00 + JUMP REL(extmsgsetup), IF 0x01 + JUMP REL(disconnect), IF 0x04 + INT int_msgin + +ENTRY ack_msgin +ack_msgin: CLEAR ACK - MOVE 0, ds_ExtMsg, WHEN MSG_IN - JUMP sync_msg, IF 0x03 - int int_extmsg ; extended message not SDTR + JUMP REL(phasedispatch) -sync_msg: - CLEAR ACK - MOVE 0, ds_SyncMsg, WHEN MSG_IN - int int_syncmsg ; Let host handle the message -; If we continue from the interrupt, the host has set up a response -; message to be sent. Set ATN, clear ACK, and continue. +ENTRY sendmsg +sendmsg: SET ATN CLEAR ACK - JUMP switch +msgout: +p_msgout_move: + MOVE 0, 0, WHEN MSG_OUT + CLEAR ATN + JUMP REL(phasedispatch) -disc: - CLEAR ACK - WAIT DISCONNECT +cmdout: + CLEAR ATN +p_cmdout_move: + MOVE 0, 0, WHEN CMD + JUMP REL(phasedispatch) - int int_disc_wodp ; signal disconnect w/o save DP +status: +p_status_move: + MOVE 0, 0, WHEN STATUS + JUMP REL(phasedispatch) -msg_sdp: - CLEAR ACK ; acknowledge message - JUMP switch, WHEN NOT MSG_IN - MOVE 0, ds_ExtMsg, WHEN MSG_IN - INT int_msgsdp, IF NOT 0x04 ; interrupt if not disconnect +disconnect: CLEAR ACK WAIT DISCONNECT + INT int_disc - INT int_disc ; signal disconnect - -reselect: -wait_reselect: - WAIT RESELECT select_adr - ; NB: these NOPs are CRITICAL to preserve the 1:1 - ; correspondence between instructions in this script - ; and instructions in the osiop (53c710) script: - NOP - NOP ; reselect ID already in SFBR - - INT int_identify, WHEN NOT MSG_IN - MOVE 0, ds_Msg, WHEN MSG_IN - INT int_reconnect ; let host know about reconnect - CLEAR ACK ; acknowlege the message - JUMP switch - -select_adr: - MOVE SCNTL1 & 0x10 to SFBR ; get connected status - INT int_connect, IF 0x00 ; tell host if not connected - NOP ; Sig_P doesn't exist on the 53c700 - JUMP wait_reselect ; and try reselect again - -msgout: - MOVE 0, ds_MsgOut, WHEN MSG_OUT - JUMP switch - -command_phase: - CLEAR ATN - MOVE 0, ds_Cmd, WHEN CMD - JUMP switch - -dataout: - MOVE 0, ds_Data1, WHEN DATA_OUT - CALL switch, WHEN NOT DATA_OUT - MOVE 0, ds_Data1, WHEN DATA_OUT - CALL switch, WHEN NOT DATA_OUT - MOVE 0, ds_Data1, WHEN DATA_OUT - CALL switch, WHEN NOT DATA_OUT - MOVE 0, ds_Data1, WHEN DATA_OUT - CALL switch, WHEN NOT DATA_OUT - MOVE 0, ds_Data1, WHEN DATA_OUT - CALL switch, WHEN NOT DATA_OUT - MOVE 0, ds_Data1, WHEN DATA_OUT - CALL switch, WHEN NOT DATA_OUT - MOVE 0, ds_Data1, WHEN DATA_OUT - CALL switch, WHEN NOT DATA_OUT - MOVE 0, ds_Data1, WHEN DATA_OUT - CALL switch, WHEN NOT DATA_OUT - MOVE 0, ds_Data1, WHEN DATA_OUT - CALL switch, WHEN NOT DATA_OUT - MOVE 0, ds_Data1, WHEN DATA_OUT - CALL switch, WHEN NOT DATA_OUT - MOVE 0, ds_Data1, WHEN DATA_OUT - CALL switch, WHEN NOT DATA_OUT - MOVE 0, ds_Data1, WHEN DATA_OUT - CALL switch, WHEN NOT DATA_OUT - MOVE 0, ds_Data1, WHEN DATA_OUT - CALL switch, WHEN NOT DATA_OUT - MOVE 0, ds_Data1, WHEN DATA_OUT - CALL switch, WHEN NOT DATA_OUT - MOVE 0, ds_Data1, WHEN DATA_OUT - CALL switch, WHEN NOT DATA_OUT - MOVE 0, ds_Data1, WHEN DATA_OUT - CALL switch, WHEN NOT DATA_OUT - MOVE 0, ds_Data1, WHEN DATA_OUT - CALL switch - -datain: - MOVE 0, ds_Data1, WHEN DATA_IN - CALL switch, WHEN NOT DATA_IN - MOVE 0, ds_Data1, WHEN DATA_IN - CALL switch, WHEN NOT DATA_IN - MOVE 0, ds_Data1, WHEN DATA_IN - CALL switch, WHEN NOT DATA_IN - MOVE 0, ds_Data1, WHEN DATA_IN - CALL switch, WHEN NOT DATA_IN - MOVE 0, ds_Data1, WHEN DATA_IN - CALL switch, WHEN NOT DATA_IN - MOVE 0, ds_Data1, WHEN DATA_IN - CALL switch, WHEN NOT DATA_IN - MOVE 0, ds_Data1, WHEN DATA_IN - CALL switch, WHEN NOT DATA_IN - MOVE 0, ds_Data1, WHEN DATA_IN - CALL switch, WHEN NOT DATA_IN - MOVE 0, ds_Data1, WHEN DATA_IN - CALL switch, WHEN NOT DATA_IN - MOVE 0, ds_Data1, WHEN DATA_IN - CALL switch, WHEN NOT DATA_IN - MOVE 0, ds_Data1, WHEN DATA_IN - CALL switch, WHEN NOT DATA_IN - MOVE 0, ds_Data1, WHEN DATA_IN - CALL switch, WHEN NOT DATA_IN - MOVE 0, ds_Data1, WHEN DATA_IN - CALL switch, WHEN NOT DATA_IN - MOVE 0, ds_Data1, WHEN DATA_IN - CALL switch, WHEN NOT DATA_IN - MOVE 0, ds_Data1, WHEN DATA_IN - CALL switch, WHEN NOT DATA_IN - MOVE 0, ds_Data1, WHEN DATA_IN - CALL switch, WHEN NOT DATA_IN - MOVE 0, ds_Data1, WHEN DATA_IN - CALL switch - -end: - MOVE 0, ds_Status, WHEN STATUS - int int_status, WHEN NOT MSG_IN ; status not followed by msg - MOVE 0, ds_Msg, WHEN MSG_IN +complete: CLEAR ACK WAIT DISCONNECT - INT ok ; signal completion - JUMP wait_reselect + INT int_done + +; receive extended message length +extmsgsetup: + CLEAR ACK + INT int_err, IF NOT MSG_IN +p_extmsglen_move: + MOVE 0, 0, WHEN MSG_IN + INT int_extmsg + +; receive extended message +ENTRY rcv_extmsg +rcv_extmsg: + CLEAR ACK + INT int_err, IF NOT MSG_IN +p_extmsgin_move: + MOVE 0, 0, WHEN MSG_IN + INT int_msgin |
