siop.ss revision 1.2 1 1.1 bouyer ARCH 720
2 1.1 bouyer
3 1.2 bouyer ; offsets in sym_xfer
4 1.2 bouyer ABSOLUTE t_id = 20;
5 1.2 bouyer ABSOLUTE t_msg_in = 28;
6 1.2 bouyer ABSOLUTE t_ext_msg_in = 36;
7 1.2 bouyer ABSOLUTE t_ext_msg_data = 44;
8 1.2 bouyer ABSOLUTE t_ext_msg_tag = 52;
9 1.2 bouyer ABSOLUTE t_msg_out = 60;
10 1.2 bouyer ABSOLUTE t_cmd = 68;
11 1.2 bouyer ABSOLUTE t_status = 76;
12 1.2 bouyer ABSOLUTE t_data = 84;
13 1.1 bouyer
14 1.1 bouyer ;; interrupt codes
15 1.1 bouyer ABSOLUTE int_done = 0xff00;
16 1.1 bouyer ABSOLUTE int_msgin = 0xff01;
17 1.2 bouyer ABSOLUTE int_extmsgin = 0xff02;
18 1.2 bouyer ABSOLUTE int_extmsgdata = 0xff03;
19 1.2 bouyer ABSOLUTE int_resel = 0xff04;
20 1.2 bouyer ABSOLUTE int_reseltag = 0xff05;
21 1.2 bouyer ABSOLUTE int_resfail = 0xff06;
22 1.2 bouyer ABSOLUTE int_disc = 0xff07;
23 1.1 bouyer ABSOLUTE int_err = 0xffff;
24 1.1 bouyer
25 1.1 bouyer ; flags for scratcha0
26 1.1 bouyer ABSOLUTE flag_sdp = 0x01 ; got save data pointer
27 1.1 bouyer
28 1.1 bouyer ENTRY waitphase;
29 1.2 bouyer ENTRY send_msgout;
30 1.1 bouyer ENTRY msgout;
31 1.1 bouyer ENTRY msgin;
32 1.2 bouyer ENTRY msgin_ack;
33 1.1 bouyer ENTRY dataout;
34 1.1 bouyer ENTRY datain;
35 1.1 bouyer ENTRY cmdout;
36 1.1 bouyer ENTRY status;
37 1.1 bouyer ENTRY disconnect;
38 1.1 bouyer ENTRY reselect;
39 1.2 bouyer ENTRY selected;
40 1.2 bouyer ENTRY get_extmsgdata;
41 1.2 bouyer ENTRY sheduler;
42 1.2 bouyer ENTRY slot;
43 1.2 bouyer ENTRY idsa0;
44 1.2 bouyer ENTRY idsa1;
45 1.2 bouyer ENTRY idsa2;
46 1.2 bouyer ENTRY idsa3;
47 1.2 bouyer ENTRY slotdata;
48 1.2 bouyer ENTRY nextslot;
49 1.2 bouyer ENTRY endslot;
50 1.2 bouyer
51 1.2 bouyer EXTERN slot_nextp;
52 1.2 bouyer EXTERN slot_shed_addrsrc;
53 1.2 bouyer EXTERN slot_abs_reselect;
54 1.2 bouyer EXTERN slot_abs_selected;
55 1.2 bouyer
56 1.2 bouyer EXTERN endslot_abs_reselect;
57 1.1 bouyer
58 1.1 bouyer PROC siop_script:
59 1.1 bouyer
60 1.2 bouyer selected:
61 1.1 bouyer ; starting a new session, init 'local variables'
62 1.1 bouyer MOVE 0 to SCRATCHA0 ; flags
63 1.1 bouyer MOVE 0 to SCRATCHA1 ; DSA offset (for S/G save data pointer)
64 1.1 bouyer waitphase:
65 1.1 bouyer JUMP REL(msgout), WHEN MSG_OUT;
66 1.1 bouyer JUMP REL(msgin), WHEN MSG_IN;
67 1.1 bouyer JUMP REL(dataout), WHEN DATA_OUT;
68 1.1 bouyer JUMP REL(datain), WHEN DATA_IN;
69 1.1 bouyer JUMP REL(cmdout), WHEN CMD;
70 1.1 bouyer JUMP REL(status), WHEN STATUS;
71 1.1 bouyer err:
72 1.1 bouyer INT int_err;
73 1.1 bouyer
74 1.1 bouyer reselect:
75 1.1 bouyer WAIT RESELECT REL(reselect_fail)
76 1.1 bouyer MOVE SSID & 0x8f to SFBR
77 1.1 bouyer MOVE SFBR to SCRATCHA0 ; save reselect ID
78 1.1 bouyer INT int_err, WHEN NOT MSG_IN;
79 1.1 bouyer MOVE FROM t_msg_in, WHEN MSG_IN;
80 1.1 bouyer CLEAR ACK;
81 1.1 bouyer INT int_resel;
82 1.1 bouyer
83 1.1 bouyer reselect_fail:
84 1.2 bouyer ; check that host asserted SIGP, this'll clear SIGP in ISTAT
85 1.2 bouyer MOVE CTEST2 & 0x40 TO SFBR;
86 1.2 bouyer INT int_resfail, IF 0x00;
87 1.2 bouyer JUMP REL(sheduler);
88 1.1 bouyer
89 1.1 bouyer msgin:
90 1.1 bouyer CLEAR ATN
91 1.1 bouyer MOVE FROM t_msg_in, WHEN MSG_IN;
92 1.1 bouyer JUMP REL(handle_dis), IF 0x04 ; disconnect message
93 1.1 bouyer JUMP REL(handle_cmpl), IF 0x00 ; command complete message
94 1.1 bouyer JUMP REL(handle_sdp), IF 0x02 ; save data pointer message
95 1.2 bouyer JUMP REL(handle_extin), IF 0x01 ; extended message
96 1.1 bouyer INT int_msgin;
97 1.2 bouyer msgin_ack:
98 1.2 bouyer CLEAR ACK;
99 1.2 bouyer JUMP REL(waitphase);
100 1.2 bouyer
101 1.2 bouyer ; entry point for msgout after a msgin or status phase
102 1.2 bouyer send_msgout:
103 1.2 bouyer SET ATN;
104 1.2 bouyer CLEAR ACK;
105 1.1 bouyer msgout:
106 1.1 bouyer MOVE FROM t_msg_out, WHEN MSG_OUT;
107 1.1 bouyer CLEAR ATN;
108 1.1 bouyer JUMP REL(waitphase);
109 1.1 bouyer cmdout:
110 1.1 bouyer MOVE FROM t_cmd, WHEN CMD;
111 1.1 bouyer JUMP REL(waitphase);
112 1.1 bouyer status:
113 1.1 bouyer MOVE FROM t_status, WHEN STATUS;
114 1.1 bouyer JUMP REL(waitphase);
115 1.1 bouyer datain:
116 1.1 bouyer CALL REL(savedsa);
117 1.1 bouyer datain_loop:
118 1.1 bouyer MOVE FROM t_data, WHEN DATA_IN;
119 1.1 bouyer MOVE SCRATCHA1 + 1 TO SCRATCHA1 ; adjust offset
120 1.1 bouyer MOVE DSA0 + 8 to DSA0;
121 1.1 bouyer MOVE DSA1 + 0 to DSA1 WITH CARRY;
122 1.1 bouyer MOVE DSA2 + 0 to DSA2 WITH CARRY;
123 1.1 bouyer MOVE DSA3 + 0 to DSA3 WITH CARRY;
124 1.1 bouyer JUMP REL(datain_loop), WHEN DATA_IN;
125 1.1 bouyer CALL REL(restoredsa);
126 1.1 bouyer JUMP REL(waitphase);
127 1.1 bouyer
128 1.1 bouyer dataout:
129 1.1 bouyer CALL REL(savedsa);
130 1.1 bouyer dataout_loop:
131 1.1 bouyer MOVE FROM t_data, WHEN DATA_OUT;
132 1.1 bouyer MOVE SCRATCHA1 + 1 TO SCRATCHA1 ; adjust offset
133 1.1 bouyer MOVE DSA0 + 8 to DSA0;
134 1.1 bouyer MOVE DSA1 + 0 to DSA1 WITH CARRY;
135 1.1 bouyer MOVE DSA2 + 0 to DSA2 WITH CARRY;
136 1.1 bouyer MOVE DSA3 + 0 to DSA3 WITH CARRY;
137 1.1 bouyer JUMP REL(dataout_loop), WHEN DATA_OUT;
138 1.1 bouyer CALL REL(restoredsa);
139 1.1 bouyer JUMP REL(waitphase);
140 1.1 bouyer
141 1.1 bouyer savedsa:
142 1.1 bouyer MOVE DSA0 to SFBR;
143 1.1 bouyer MOVE SFBR to SCRATCHB0;
144 1.1 bouyer MOVE DSA1 to SFBR;
145 1.1 bouyer MOVE SFBR to SCRATCHB1;
146 1.1 bouyer MOVE DSA2 to SFBR;
147 1.1 bouyer MOVE SFBR to SCRATCHB2;
148 1.1 bouyer MOVE DSA3 to SFBR;
149 1.1 bouyer MOVE SFBR to SCRATCHB3;
150 1.1 bouyer RETURN;
151 1.1 bouyer
152 1.1 bouyer restoredsa:
153 1.1 bouyer MOVE SCRATCHB0 TO SFBR;
154 1.1 bouyer MOVE SFBR TO DSA0;
155 1.1 bouyer MOVE SCRATCHB1 TO SFBR;
156 1.1 bouyer MOVE SFBR TO DSA1;
157 1.1 bouyer MOVE SCRATCHB2 TO SFBR;
158 1.1 bouyer MOVE SFBR TO DSA2;
159 1.1 bouyer MOVE SCRATCHB3 TO SFBR;
160 1.1 bouyer MOVE SFBR TO DSA3;
161 1.1 bouyer RETURN;
162 1.1 bouyer
163 1.1 bouyer disconnect:
164 1.1 bouyer MOVE SCNTL2 & 0x7f TO SCNTL2;
165 1.1 bouyer CLEAR ATN;
166 1.1 bouyer CLEAR ACK;
167 1.1 bouyer WAIT DISCONNECT;
168 1.1 bouyer RETURN;
169 1.1 bouyer
170 1.1 bouyer handle_dis:
171 1.1 bouyer CALL REL(disconnect);
172 1.1 bouyer ; if we didn't get sdp, or if offset is 0, no need to interrupt
173 1.1 bouyer MOVE SCRATCHA0 & flag_sdp TO SFBR;
174 1.2 bouyer JUMP REL(sheduler), if 0x00;
175 1.1 bouyer MOVE SCRATCHA1 TO SFBR;
176 1.2 bouyer JUMP REL(sheduler), if 0x00;
177 1.1 bouyer ; Ok, we need to save data pointers
178 1.1 bouyer INT int_disc;
179 1.1 bouyer
180 1.1 bouyer handle_cmpl:
181 1.1 bouyer CALL REL(disconnect);
182 1.1 bouyer INT int_done;
183 1.1 bouyer handle_sdp:
184 1.1 bouyer CLEAR ACK;
185 1.1 bouyer MOVE SCRATCHA0 | flag_sdp TO SCRATCHA0;
186 1.1 bouyer JUMP REL(msgin) ; should get a disconnect message now
187 1.2 bouyer
188 1.2 bouyer handle_extin:
189 1.2 bouyer CLEAR ACK;
190 1.2 bouyer INT int_err, IF NOT MSG_IN;
191 1.2 bouyer MOVE FROM t_ext_msg_in, WHEN MSG_IN;
192 1.2 bouyer INT int_extmsgin; /* let host fill in t_ext_msg_data */
193 1.2 bouyer get_extmsgdata:
194 1.2 bouyer CLEAR ACK;
195 1.2 bouyer INT int_err, IF NOT MSG_IN;
196 1.2 bouyer MOVE FROM t_ext_msg_data, WHEN MSG_IN;
197 1.2 bouyer INT int_extmsgdata;
198 1.2 bouyer
199 1.2 bouyer sheduler:
200 1.2 bouyer NOP; /* will be changed by the slot scripts */
201 1.2 bouyer
202 1.2 bouyer ; script used for the sheduler: when a slot is free the JUMP points to
203 1.2 bouyer ; the next slot so that instructions for this slot are not run.
204 1.2 bouyer ; once the CPU has set up the slot variables (DSA address) it changes
205 1.2 bouyer ; the JUMP address to 0 (so that it'll jump to the next instruction) and
206 1.2 bouyer ; this command will be processed next time the sheduler is executed.
207 1.2 bouyer ; When the target has been successfully selected the script changes the jump
208 1.2 bouyer ; addr back to the next slot, so that it's ignored the next time.
209 1.2 bouyer ;
210 1.2 bouyer
211 1.2 bouyer PROC slot_script:
212 1.2 bouyer slot:
213 1.2 bouyer JUMP REL(nextslot);
214 1.2 bouyer idsa0:
215 1.2 bouyer MOVE 0x00 to dsa0;
216 1.2 bouyer idsa1:
217 1.2 bouyer MOVE 0x01 to dsa1;
218 1.2 bouyer idsa2:
219 1.2 bouyer MOVE 0x02 to dsa2;
220 1.2 bouyer idsa3:
221 1.2 bouyer MOVE 0x03 to dsa3;
222 1.2 bouyer SELECT ATN FROM t_id, slot_abs_reselect;
223 1.2 bouyer MOVE MEMORY 4, slot_shed_addrsrc, slot_nextp;
224 1.2 bouyer JUMP slot_abs_selected;
225 1.2 bouyer slotdata:
226 1.2 bouyer NOP; slot variables: dsa & jumppatchp
227 1.2 bouyer nextslot: NOP; /* will be changed to the next slot entry
228 1.2 bouyer
229 1.2 bouyer PROC endslot_script:
230 1.2 bouyer JUMP endslot_abs_reselect;
231