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