Home | History | Annotate | Line # | Download | only in siop
siop.ss revision 1.1
      1 ARCH 720
      2 
      3 ; offsets of sym_xfer
      4 ABSOLUTE t_id = 4;
      5 ABSOLUTE t_msg_in = 12;
      6 ABSOLUTE t_msg_out = 20;
      7 ABSOLUTE t_cmd = 28;
      8 ABSOLUTE t_status = 36;
      9 ABSOLUTE t_data = 44;
     10 
     11 ;; interrupt codes
     12 ABSOLUTE int_done	= 0xff00;
     13 ABSOLUTE int_msgin	= 0xff01;
     14 ABSOLUTE int_resel	= 0xff02;
     15 ABSOLUTE int_resfail	= 0xff03;
     16 ABSOLUTE int_disc	= 0xff04;
     17 ABSOLUTE int_err 	= 0xffff;
     18 
     19 ; flags for scratcha0
     20 ABSOLUTE flag_sdp 	= 0x01 ; got save data pointer
     21 
     22 ENTRY waitphase;
     23 ENTRY select;
     24 ENTRY msgout;
     25 ENTRY msgin;
     26 ENTRY dataout;
     27 ENTRY datain;
     28 ENTRY cmdout;
     29 ENTRY status;
     30 ENTRY disconnect;
     31 ENTRY reselect;
     32 ENTRY reselected;
     33 ENTRY handle_reselect;
     34 
     35 PROC  siop_script:
     36 
     37 select:
     38 	SELECT ATN FROM t_id, REL(reselect);
     39 reselected:
     40 ; starting a new session, init 'local variables'
     41 	MOVE 0 to SCRATCHA0	; flags
     42 	MOVE 0 to SCRATCHA1	; DSA offset (for S/G save data pointer)
     43 waitphase:
     44 	JUMP REL(msgout), WHEN MSG_OUT;
     45 	JUMP REL(msgin), WHEN MSG_IN;
     46 	JUMP REL(dataout), WHEN DATA_OUT;
     47 	JUMP REL(datain), WHEN DATA_IN;
     48 	JUMP REL(cmdout), WHEN CMD;
     49 	JUMP REL(status), WHEN STATUS;
     50 err:
     51 	INT int_err;
     52 
     53 reselect:
     54 	WAIT RESELECT REL(reselect_fail)
     55 	MOVE SSID & 0x8f to SFBR
     56 	MOVE SFBR to SCRATCHA0 ; save reselect ID
     57 	INT int_err, WHEN NOT MSG_IN;
     58 	MOVE FROM t_msg_in, WHEN MSG_IN;
     59 	CLEAR ACK;
     60 	INT int_resel;
     61 
     62 reselect_fail:
     63 	INT int_resfail;
     64 
     65 msgin:
     66 	CLEAR ATN
     67 	MOVE FROM t_msg_in, WHEN MSG_IN;
     68 	JUMP REL(handle_dis), IF 0x04         ; disconnect message
     69 	JUMP REL(handle_cmpl), IF 0x00        ; command complete message
     70 	JUMP REL(handle_sdp), IF 0x02	      ; save data pointer message
     71 	INT int_msgin;
     72 msgout:
     73 	MOVE FROM t_msg_out, WHEN MSG_OUT;
     74 	CLEAR ATN;
     75 	JUMP REL(waitphase);
     76 cmdout:
     77 	MOVE FROM t_cmd, WHEN CMD;
     78 	JUMP REL(waitphase);
     79 status:
     80 	MOVE FROM t_status, WHEN STATUS;
     81 	JUMP REL(waitphase);
     82 datain:
     83 	CALL REL(savedsa);
     84 datain_loop:
     85 	MOVE FROM t_data, WHEN DATA_IN;
     86 	MOVE SCRATCHA1 + 1 TO SCRATCHA1	; adjust offset
     87 	MOVE DSA0 + 8 to DSA0;
     88 	MOVE DSA1 + 0 to DSA1 WITH CARRY;
     89 	MOVE DSA2 + 0 to DSA2 WITH CARRY;
     90 	MOVE DSA3 + 0 to DSA3 WITH CARRY;
     91 	JUMP REL(datain_loop), WHEN DATA_IN;
     92 	CALL REL(restoredsa);
     93 	JUMP REL(waitphase);
     94 
     95 dataout:
     96 	CALL REL(savedsa);
     97 dataout_loop:
     98 	MOVE FROM t_data, WHEN DATA_OUT;
     99 	MOVE SCRATCHA1 + 1 TO SCRATCHA1	; adjust offset
    100 	MOVE DSA0 + 8 to DSA0;
    101 	MOVE DSA1 + 0 to DSA1 WITH CARRY;
    102 	MOVE DSA2 + 0 to DSA2 WITH CARRY;
    103 	MOVE DSA3 + 0 to DSA3 WITH CARRY;
    104 	JUMP REL(dataout_loop), WHEN DATA_OUT;
    105 	CALL REL(restoredsa);
    106 	JUMP REL(waitphase);
    107 
    108 savedsa:
    109 	MOVE DSA0 to SFBR;
    110 	MOVE SFBR to SCRATCHB0;
    111 	MOVE DSA1 to SFBR;
    112 	MOVE SFBR to SCRATCHB1;
    113 	MOVE DSA2 to SFBR;
    114 	MOVE SFBR to SCRATCHB2;
    115 	MOVE DSA3 to SFBR;
    116 	MOVE SFBR to SCRATCHB3;
    117 	RETURN;
    118 
    119 restoredsa:
    120 	MOVE SCRATCHB0 TO SFBR;
    121 	MOVE SFBR TO DSA0;
    122 	MOVE SCRATCHB1 TO SFBR;
    123 	MOVE SFBR TO DSA1;
    124 	MOVE SCRATCHB2 TO SFBR;
    125 	MOVE SFBR TO DSA2;
    126 	MOVE SCRATCHB3 TO SFBR;
    127 	MOVE SFBR TO DSA3;
    128 	RETURN;
    129 
    130 disconnect:
    131 	MOVE SCNTL2 & 0x7f TO SCNTL2;
    132 	CLEAR ATN;
    133 	CLEAR ACK;
    134 	WAIT DISCONNECT;
    135 	RETURN;
    136 
    137 handle_dis:
    138 	CALL REL(disconnect);
    139 ; if we didn't get sdp, or if offset is 0, no need to interrupt
    140 	MOVE SCRATCHA0 & flag_sdp TO SFBR;
    141 	JUMP REL(reselect), if 0x00; 
    142 	MOVE SCRATCHA1 TO SFBR;
    143 	JUMP REL(reselect), if 0x00; 
    144 ; Ok, we need to save data pointers
    145 	INT int_disc;
    146 
    147 handle_cmpl:
    148 	CALL REL(disconnect);
    149 	INT int_done;
    150 handle_sdp:
    151 	CLEAR ACK;
    152 	MOVE SCRATCHA0 | flag_sdp TO SCRATCHA0;
    153 	JUMP REL(msgin) ; should get a disconnect message now
    154