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