Move a few things around, to save some JUMP.

This commit is contained in:
bouyer 2002-05-02 12:37:19 +00:00
parent 1d5fb5d90e
commit 41af47376f
1 changed files with 51 additions and 55 deletions

View File

@ -1,4 +1,4 @@
; $NetBSD: esiop.ss,v 1.12 2002/04/27 18:46:50 bouyer Exp $
; $NetBSD: esiop.ss,v 1.13 2002/05/02 12:37:19 bouyer Exp $
;
; Copyright (c) 2002 Manuel Bouyer.
@ -176,7 +176,6 @@ nextisn:
CLEAR ACK;
INT int_msgin, IF NOT 0x20; not a simple tag message, let host handle it
MOVE 1, abs_msgin2, WHEN MSG_IN; get tag
CLEAR ACK;
MOVE SFBR to SCRATCHA2;
MOVE SFBR to SCRATCHC3;
MOVE SCRATCHC0 | f_c_tag to SCRATCHC0; save TAG
@ -197,12 +196,59 @@ nextisn:
MOVE DSA2 + 0x00 TO DSA2 with CARRY;
MOVE DSA3 + 0x00 TO DSA3 with CARRY; SCRACHA(2,3) + DSA to DSA
LOAD DSA0, 4, from 0; load DSA for this tag
JUMP REL(waitphase);
msgin_ack:
CLEAR ACK;
waitphase:
JUMP REL(msgout), WHEN MSG_OUT;
JUMP REL(msgin), WHEN MSG_IN;
JUMP REL(dataout), WHEN DATA_OUT;
JUMP REL(datain), WHEN DATA_IN;
JUMP REL(cmdout), WHEN CMD;
JUMP REL(status), WHEN STATUS;
INT int_err;
handle_cmpl:
CALL REL(disconnect);
MOVE SCRATCHE1 to SFBR;
INT int_done, IF NOT 0x00; if status is not "done", let host handle it
MOVE SCRATCHF0 to SFBR; load pointer in done ring
MOVE SFBR to DSA0;
MOVE SCRATCHF1 to SFBR;
MOVE SFBR to DSA1;
MOVE SCRATCHF2 to SFBR;
MOVE SFBR to DSA2;
MOVE SCRATCHF3 to SFBR;
MOVE SFBR to DSA3;
wait_free:
LOAD SCRATCHA0, 1, from 0;
MOVE SCRATCHA0 to SFBR;
JUMP REL(wait_free), if not 0; wait for slot to be free
STORE NOFLUSH SCRATCHC0, 4, from 0; save current target/lun/flag
MOVE SCRATCHF0 + 4 to SCRATCHF0; advance to next slot
MOVE SCRATCHF1 + 0 to SCRATCHF1 with carry;
MOVE SCRATCHF2 + 0 to SCRATCHF2 with carry;
MOVE SCRATCHF3 + 0 to SCRATCHF3 with carry;
MOVE SCRATCHE2 + 1 to SCRATCHE2;
MOVE SCRATCHE2 to SFBR;
JUMP REL(is_done), if not ndone_slots_last;
doner0:
MOVE 0xff to SCRATCHF0; driver will change 0xff to base of ring
doner1:
MOVE 0xff to SCRATCHF1;
doner2:
MOVE 0xff to SCRATCHF2;
doner3:
MOVE 0xff to SCRATCHF3;
MOVE 0 to SCRATCHE2;
is_done:
LOAD SCRATCHB0, 4, abs_sem; signal that a command is done
MOVE SCRATCHB0 | sem_done TO SCRATCHB0;
STORE NOFLUSH SCRATCHB0, 4, abs_sem;
; and attempt next command
reselect_fail:
; check that host asserted SIGP, this'll clear SIGP in ISTAT
; clear SIGP in ISTAT
MOVE CTEST2 & 0x40 TO SFBR;
INT int_resfail, IF 0x00;
script_sched:
; Load ring DSA
MOVE SCRATCHD0 to SFBR;
@ -282,17 +328,6 @@ msgout:
CLEAR ATN;
JUMP REL(waitphase);
msgin_ack:
CLEAR ACK;
waitphase:
JUMP REL(msgout), WHEN MSG_OUT;
JUMP REL(msgin), WHEN MSG_IN;
JUMP REL(dataout), WHEN DATA_OUT;
JUMP REL(datain), WHEN DATA_IN;
JUMP REL(cmdout), WHEN CMD;
JUMP REL(status), WHEN STATUS;
INT int_err;
handle_sdp:
CLEAR ACK;
@ -381,45 +416,6 @@ disconnect:
WAIT DISCONNECT;
RETURN;
handle_cmpl:
CALL REL(disconnect);
MOVE SCRATCHE1 to SFBR;
INT int_done, IF NOT 0x00; if status is not "done", let host handle it
MOVE SCRATCHF0 to SFBR; load pointer in done ring
MOVE SFBR to DSA0;
MOVE SCRATCHF1 to SFBR;
MOVE SFBR to DSA1;
MOVE SCRATCHF2 to SFBR;
MOVE SFBR to DSA2;
MOVE SCRATCHF3 to SFBR;
MOVE SFBR to DSA3;
wait_free:
LOAD SCRATCHA0, 1, from 0;
MOVE SCRATCHA0 to SFBR;
JUMP REL(wait_free), if not 0; wait for slot to be free
STORE NOFLUSH SCRATCHC0, 4, from 0; save current target/lun/flag
MOVE SCRATCHF0 + 4 to SCRATCHF0; advance to next slot
MOVE SCRATCHF1 + 0 to SCRATCHF1 with carry;
MOVE SCRATCHF2 + 0 to SCRATCHF2 with carry;
MOVE SCRATCHF3 + 0 to SCRATCHF3 with carry;
MOVE SCRATCHE2 + 1 to SCRATCHE2;
MOVE SCRATCHE2 to SFBR;
JUMP REL(is_done), if not ndone_slots_last;
doner0:
MOVE 0xff to SCRATCHF0; driver will change 0xff to base of ring
doner1:
MOVE 0xff to SCRATCHF1;
doner2:
MOVE 0xff to SCRATCHF2;
doner3:
MOVE 0xff to SCRATCHF3;
MOVE 0 to SCRATCHE2;
is_done:
LOAD SCRATCHB0, 4, abs_sem; signal that a command is done
MOVE SCRATCHB0 | sem_done TO SCRATCHB0;
STORE NOFLUSH SCRATCHB0, 4, abs_sem;
JUMP REL(script_sched); and attempt next command
handle_extin:
CLEAR ACK;
MOVE FROM t_ext_msg_in, WHEN MSG_IN;