1 1.21 bouyer ; $NetBSD: siop.ss,v 1.21 2009/10/19 18:41:13 bouyer Exp $ 2 1.3 bouyer 3 1.3 bouyer ; 4 1.3 bouyer ; Copyright (c) 2000 Manuel Bouyer. 5 1.19 perry ; 6 1.3 bouyer ; Redistribution and use in source and binary forms, with or without 7 1.3 bouyer ; modification, are permitted provided that the following conditions 8 1.3 bouyer ; are met: 9 1.3 bouyer ; 1. Redistributions of source code must retain the above copyright 10 1.3 bouyer ; notice, this list of conditions and the following disclaimer. 11 1.3 bouyer ; 2. Redistributions in binary form must reproduce the above copyright 12 1.3 bouyer ; notice, this list of conditions and the following disclaimer in the 13 1.3 bouyer ; documentation and/or other materials provided with the distribution. 14 1.19 perry ; 15 1.5 bouyer ; THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 16 1.5 bouyer ; IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 17 1.5 bouyer ; OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 18 1.19 perry ; IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 19 1.5 bouyer ; INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 20 1.5 bouyer ; NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 21 1.5 bouyer ; DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 22 1.5 bouyer ; THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 23 1.5 bouyer ; (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 24 1.5 bouyer ; THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 25 1.3 bouyer 26 1.1 bouyer ARCH 720 27 1.1 bouyer 28 1.14 bouyer ; offsets in siop_common_xfer 29 1.14 bouyer ABSOLUTE t_id = 40; 30 1.14 bouyer ABSOLUTE t_msg_in = 48; 31 1.14 bouyer ABSOLUTE t_ext_msg_in = 56; 32 1.14 bouyer ABSOLUTE t_ext_msg_data = 64; 33 1.14 bouyer ABSOLUTE t_msg_out = 72; 34 1.14 bouyer ABSOLUTE t_cmd = 80; 35 1.14 bouyer ABSOLUTE t_status = 88; 36 1.14 bouyer ABSOLUTE t_data = 96; 37 1.1 bouyer 38 1.1 bouyer ;; interrupt codes 39 1.10 bouyer ; interrupts that need a valid DSA 40 1.1 bouyer ABSOLUTE int_done = 0xff00; 41 1.1 bouyer ABSOLUTE int_msgin = 0xff01; 42 1.2 bouyer ABSOLUTE int_extmsgin = 0xff02; 43 1.2 bouyer ABSOLUTE int_extmsgdata = 0xff03; 44 1.10 bouyer ABSOLUTE int_disc = 0xff04; 45 1.20 bouyer ABSOLUTE int_saveoffset = 0xff05; 46 1.10 bouyer ; interrupts that don't have a valid DSA 47 1.10 bouyer ABSOLUTE int_reseltarg = 0xff80; 48 1.10 bouyer ABSOLUTE int_resellun = 0xff81; 49 1.10 bouyer ABSOLUTE int_reseltag = 0xff82; 50 1.10 bouyer ABSOLUTE int_resfail = 0xff83; 51 1.1 bouyer ABSOLUTE int_err = 0xffff; 52 1.1 bouyer 53 1.1 bouyer ; flags for scratcha0 54 1.1 bouyer ABSOLUTE flag_sdp = 0x01 ; got save data pointer 55 1.4 bouyer ABSOLUTE flag_data = 0x02 ; we're in data phase 56 1.4 bouyer ABSOLUTE flag_data_mask = 0xfd ; ~flag_data 57 1.1 bouyer 58 1.10 bouyer ; main script symbols 59 1.10 bouyer 60 1.1 bouyer ENTRY waitphase; 61 1.2 bouyer ENTRY send_msgout; 62 1.1 bouyer ENTRY msgout; 63 1.1 bouyer ENTRY msgin; 64 1.10 bouyer ENTRY handle_msgin; 65 1.2 bouyer ENTRY msgin_ack; 66 1.1 bouyer ENTRY dataout; 67 1.1 bouyer ENTRY datain; 68 1.1 bouyer ENTRY cmdout; 69 1.1 bouyer ENTRY status; 70 1.1 bouyer ENTRY disconnect; 71 1.1 bouyer ENTRY reselect; 72 1.10 bouyer ENTRY reselected; 73 1.2 bouyer ENTRY selected; 74 1.10 bouyer ENTRY script_sched; 75 1.12 bouyer ENTRY script_sched_slot0; 76 1.2 bouyer ENTRY get_extmsgdata; 77 1.10 bouyer ENTRY resel_targ0; 78 1.10 bouyer ENTRY msgin_space; 79 1.10 bouyer ENTRY lunsw_return; 80 1.13 bouyer ENTRY led_on1; 81 1.13 bouyer ENTRY led_on2; 82 1.13 bouyer ENTRY led_off; 83 1.12 bouyer EXTERN abs_script_sched_slot0; 84 1.10 bouyer EXTERN abs_targ0; 85 1.10 bouyer EXTERN abs_msgin; 86 1.10 bouyer 87 1.10 bouyer ; lun switch symbols 88 1.11 bouyer ENTRY lun_switch_entry; 89 1.10 bouyer ENTRY resel_lun0; 90 1.10 bouyer ENTRY restore_scntl3; 91 1.10 bouyer EXTERN abs_lunsw_return; 92 1.10 bouyer 93 1.12 bouyer ; tag switch symbols 94 1.12 bouyer ENTRY tag_switch_entry; 95 1.12 bouyer ENTRY resel_tag0; 96 1.12 bouyer EXTERN abs_tag0; 97 1.12 bouyer 98 1.10 bouyer ; command reselect script symbols 99 1.10 bouyer ENTRY rdsa0; 100 1.10 bouyer ENTRY rdsa1; 101 1.10 bouyer ENTRY rdsa2; 102 1.10 bouyer ENTRY rdsa3; 103 1.12 bouyer ENTRY ldsa_reload_dsa; 104 1.12 bouyer ENTRY ldsa_select; 105 1.12 bouyer ENTRY ldsa_data; 106 1.12 bouyer 107 1.12 bouyer EXTERN ldsa_abs_reselected; 108 1.12 bouyer EXTERN ldsa_abs_reselect; 109 1.12 bouyer EXTERN ldsa_abs_selected; 110 1.12 bouyer EXTERN ldsa_abs_data; 111 1.12 bouyer EXTERN ldsa_abs_slot; 112 1.1 bouyer 113 1.10 bouyer ; main script 114 1.8 bouyer 115 1.1 bouyer PROC siop_script: 116 1.1 bouyer 117 1.10 bouyer reselected: 118 1.1 bouyer ; starting a new session, init 'local variables' 119 1.1 bouyer MOVE 0 to SCRATCHA0 ; flags 120 1.1 bouyer MOVE 0 to SCRATCHA1 ; DSA offset (for S/G save data pointer) 121 1.10 bouyer MOVE SCRATCHA3 to SFBR ; pending message ? 122 1.12 bouyer JUMP REL(handle_msgin), IF not 0x20; 123 1.1 bouyer waitphase: 124 1.1 bouyer JUMP REL(msgout), WHEN MSG_OUT; 125 1.1 bouyer JUMP REL(msgin), WHEN MSG_IN; 126 1.1 bouyer JUMP REL(dataout), WHEN DATA_OUT; 127 1.1 bouyer JUMP REL(datain), WHEN DATA_IN; 128 1.1 bouyer JUMP REL(cmdout), WHEN CMD; 129 1.1 bouyer JUMP REL(status), WHEN STATUS; 130 1.1 bouyer INT int_err; 131 1.1 bouyer 132 1.12 bouyer reselect_fail: 133 1.12 bouyer ; check that host asserted SIGP, this'll clear SIGP in ISTAT 134 1.12 bouyer MOVE CTEST2 & 0x40 TO SFBR; 135 1.12 bouyer INT int_resfail, IF 0x00; 136 1.13 bouyer ; a NOP by default; patched with MOVE GPREG & 0xfe to GPREG on compile-time 137 1.13 bouyer ; option "SIOP_SYMLED" 138 1.13 bouyer led_on1: 139 1.13 bouyer NOP; 140 1.12 bouyer script_sched: 141 1.12 bouyer ; Clear DSA and init status 142 1.12 bouyer MOVE 0xff to DSA0; 143 1.12 bouyer MOVE 0xff to DSA1; 144 1.12 bouyer MOVE 0xff to DSA2; 145 1.12 bouyer MOVE 0xff to DSA3; 146 1.12 bouyer MOVE 0 to SCRATCHA0 ; flags 147 1.12 bouyer MOVE 0 to SCRATCHA1 ; DSA offset (for S/G save data pointer) 148 1.19 perry ; the script scheduler: siop_start() we set the absolute jump addr, and then 149 1.12 bouyer ; changes the FALSE to TRUE. The select script will change it back to false 150 1.12 bouyer ; once the target is selected. 151 1.12 bouyer ; The RAM could hold 370 slot entry, we limit it to 40. Should be more than 152 1.16 wiz ; enough. 153 1.12 bouyer script_sched_slot0: 154 1.12 bouyer JUMP abs_script_sched_slot0, IF FALSE; 155 1.12 bouyer JUMP abs_script_sched_slot0, IF FALSE; 156 1.12 bouyer JUMP abs_script_sched_slot0, IF FALSE; 157 1.12 bouyer JUMP abs_script_sched_slot0, IF FALSE; 158 1.12 bouyer JUMP abs_script_sched_slot0, IF FALSE; 159 1.12 bouyer JUMP abs_script_sched_slot0, IF FALSE; 160 1.12 bouyer JUMP abs_script_sched_slot0, IF FALSE; 161 1.12 bouyer JUMP abs_script_sched_slot0, IF FALSE; 162 1.12 bouyer JUMP abs_script_sched_slot0, IF FALSE; 163 1.12 bouyer JUMP abs_script_sched_slot0, IF FALSE; 164 1.12 bouyer JUMP abs_script_sched_slot0, IF FALSE; 165 1.12 bouyer JUMP abs_script_sched_slot0, IF FALSE; 166 1.12 bouyer JUMP abs_script_sched_slot0, IF FALSE; 167 1.12 bouyer JUMP abs_script_sched_slot0, IF FALSE; 168 1.12 bouyer JUMP abs_script_sched_slot0, IF FALSE; 169 1.12 bouyer JUMP abs_script_sched_slot0, IF FALSE; 170 1.12 bouyer JUMP abs_script_sched_slot0, IF FALSE; 171 1.12 bouyer JUMP abs_script_sched_slot0, IF FALSE; 172 1.12 bouyer JUMP abs_script_sched_slot0, IF FALSE; 173 1.12 bouyer JUMP abs_script_sched_slot0, IF FALSE; 174 1.12 bouyer JUMP abs_script_sched_slot0, IF FALSE; 175 1.12 bouyer JUMP abs_script_sched_slot0, IF FALSE; 176 1.12 bouyer JUMP abs_script_sched_slot0, IF FALSE; 177 1.12 bouyer JUMP abs_script_sched_slot0, IF FALSE; 178 1.12 bouyer JUMP abs_script_sched_slot0, IF FALSE; 179 1.12 bouyer JUMP abs_script_sched_slot0, IF FALSE; 180 1.12 bouyer JUMP abs_script_sched_slot0, IF FALSE; 181 1.12 bouyer JUMP abs_script_sched_slot0, IF FALSE; 182 1.12 bouyer JUMP abs_script_sched_slot0, IF FALSE; 183 1.12 bouyer JUMP abs_script_sched_slot0, IF FALSE; 184 1.12 bouyer JUMP abs_script_sched_slot0, IF FALSE; 185 1.12 bouyer JUMP abs_script_sched_slot0, IF FALSE; 186 1.12 bouyer JUMP abs_script_sched_slot0, IF FALSE; 187 1.12 bouyer JUMP abs_script_sched_slot0, IF FALSE; 188 1.12 bouyer JUMP abs_script_sched_slot0, IF FALSE; 189 1.12 bouyer JUMP abs_script_sched_slot0, IF FALSE; 190 1.12 bouyer JUMP abs_script_sched_slot0, IF FALSE; 191 1.12 bouyer JUMP abs_script_sched_slot0, IF FALSE; 192 1.12 bouyer JUMP abs_script_sched_slot0, IF FALSE; 193 1.12 bouyer JUMP abs_script_sched_slot0, IF FALSE; 194 1.12 bouyer ; Nothing to do, wait for reselect 195 1.1 bouyer reselect: 196 1.10 bouyer ; Clear DSA and init status 197 1.10 bouyer MOVE 0xff to DSA0; 198 1.10 bouyer MOVE 0xff to DSA1; 199 1.10 bouyer MOVE 0xff to DSA2; 200 1.10 bouyer MOVE 0xff to DSA3; 201 1.12 bouyer MOVE 0x00 to SCRATCHA2; no tag 202 1.12 bouyer MOVE 0x20 to SCRATCHA3; simple tag msg, ignored by reselected: 203 1.13 bouyer ; a NOP by default; patched with MOVE GPREG | 0x01 to GPREG on compile-time 204 1.13 bouyer ; option "SIOP_SYMLED" 205 1.13 bouyer led_off: 206 1.13 bouyer NOP; 207 1.1 bouyer WAIT RESELECT REL(reselect_fail) 208 1.13 bouyer ; a NOP by default; patched with MOVE GPREG & 0xfe to GPREG on compile-time 209 1.13 bouyer ; option "SIOP_SYMLED" 210 1.13 bouyer led_on2: 211 1.13 bouyer NOP; 212 1.1 bouyer MOVE SSID & 0x8f to SFBR 213 1.1 bouyer MOVE SFBR to SCRATCHA0 ; save reselect ID 214 1.17 wiz ; find the right param for this target 215 1.10 bouyer resel_targ0: 216 1.10 bouyer JUMP abs_targ0, IF 0xff; 217 1.10 bouyer JUMP abs_targ0, IF 0xff; 218 1.10 bouyer JUMP abs_targ0, IF 0xff; 219 1.10 bouyer JUMP abs_targ0, IF 0xff; 220 1.10 bouyer JUMP abs_targ0, IF 0xff; 221 1.10 bouyer JUMP abs_targ0, IF 0xff; 222 1.10 bouyer JUMP abs_targ0, IF 0xff; 223 1.10 bouyer JUMP abs_targ0, IF 0xff; 224 1.10 bouyer JUMP abs_targ0, IF 0xff; 225 1.10 bouyer JUMP abs_targ0, IF 0xff; 226 1.10 bouyer JUMP abs_targ0, IF 0xff; 227 1.10 bouyer JUMP abs_targ0, IF 0xff; 228 1.10 bouyer JUMP abs_targ0, IF 0xff; 229 1.10 bouyer JUMP abs_targ0, IF 0xff; 230 1.10 bouyer JUMP abs_targ0, IF 0xff; 231 1.10 bouyer INT int_reseltarg; 232 1.10 bouyer lunsw_return: 233 1.10 bouyer MOVE 1, abs_msgin, WHEN MSG_IN; 234 1.10 bouyer MOVE SFBR & 0x07 to SCRATCHA1; save LUN 235 1.10 bouyer CLEAR ACK; 236 1.10 bouyer RETURN, WHEN NOT MSG_IN; If no more message, jump to lun sw 237 1.10 bouyer MOVE 1, abs_msgin, WHEN MSG_IN; 238 1.10 bouyer CLEAR ACK; 239 1.10 bouyer MOVE SFBR to SCRATCHA3; save message 240 1.12 bouyer RETURN, IF NOT 0x20; jump to lun sw if not simple tag msg 241 1.10 bouyer MOVE 1, abs_msgin, WHEN MSG_IN; get tag 242 1.10 bouyer CLEAR ACK; 243 1.10 bouyer MOVE SFBR to SCRATCHA2; save tag 244 1.10 bouyer RETURN; jump to lun sw 245 1.10 bouyer 246 1.10 bouyer handle_sdp: 247 1.10 bouyer CLEAR ACK; 248 1.10 bouyer MOVE SCRATCHA0 | flag_sdp TO SCRATCHA0; 249 1.10 bouyer ; should get a disconnect message now 250 1.1 bouyer msgin: 251 1.1 bouyer CLEAR ATN 252 1.1 bouyer MOVE FROM t_msg_in, WHEN MSG_IN; 253 1.10 bouyer handle_msgin: 254 1.1 bouyer JUMP REL(handle_cmpl), IF 0x00 ; command complete message 255 1.1 bouyer JUMP REL(handle_sdp), IF 0x02 ; save data pointer message 256 1.2 bouyer JUMP REL(handle_extin), IF 0x01 ; extended message 257 1.12 bouyer INT int_msgin, IF not 0x04; 258 1.12 bouyer CALL REL(disconnect) ; disconnect message; 259 1.18 bouyer ; if we didn't get sdp, no need to interrupt 260 1.12 bouyer MOVE SCRATCHA0 & flag_sdp TO SFBR; 261 1.20 bouyer INT int_disc, IF not 0x00; 262 1.20 bouyer ; update offset if we did some data transfer 263 1.20 bouyer MOVE SCRATCHA1 TO SFBR; 264 1.19 perry JUMP REL(script_sched), if 0x00; 265 1.20 bouyer INT int_saveoffset; 266 1.20 bouyer 267 1.2 bouyer msgin_ack: 268 1.10 bouyer selected: 269 1.2 bouyer CLEAR ACK; 270 1.2 bouyer JUMP REL(waitphase); 271 1.2 bouyer 272 1.2 bouyer ; entry point for msgout after a msgin or status phase 273 1.2 bouyer send_msgout: 274 1.2 bouyer SET ATN; 275 1.2 bouyer CLEAR ACK; 276 1.1 bouyer msgout: 277 1.1 bouyer MOVE FROM t_msg_out, WHEN MSG_OUT; 278 1.1 bouyer CLEAR ATN; 279 1.1 bouyer JUMP REL(waitphase); 280 1.1 bouyer cmdout: 281 1.1 bouyer MOVE FROM t_cmd, WHEN CMD; 282 1.1 bouyer JUMP REL(waitphase); 283 1.1 bouyer status: 284 1.1 bouyer MOVE FROM t_status, WHEN STATUS; 285 1.1 bouyer JUMP REL(waitphase); 286 1.1 bouyer datain: 287 1.1 bouyer CALL REL(savedsa); 288 1.4 bouyer MOVE SCRATCHA0 | flag_data TO SCRATCHA0; 289 1.1 bouyer datain_loop: 290 1.1 bouyer MOVE FROM t_data, WHEN DATA_IN; 291 1.1 bouyer MOVE SCRATCHA1 + 1 TO SCRATCHA1 ; adjust offset 292 1.1 bouyer MOVE DSA0 + 8 to DSA0; 293 1.1 bouyer MOVE DSA1 + 0 to DSA1 WITH CARRY; 294 1.1 bouyer MOVE DSA2 + 0 to DSA2 WITH CARRY; 295 1.1 bouyer MOVE DSA3 + 0 to DSA3 WITH CARRY; 296 1.1 bouyer JUMP REL(datain_loop), WHEN DATA_IN; 297 1.1 bouyer CALL REL(restoredsa); 298 1.4 bouyer MOVE SCRATCHA0 & flag_data_mask TO SCRATCHA0; 299 1.1 bouyer JUMP REL(waitphase); 300 1.1 bouyer 301 1.1 bouyer dataout: 302 1.1 bouyer CALL REL(savedsa); 303 1.4 bouyer MOVE SCRATCHA0 | flag_data TO SCRATCHA0; 304 1.1 bouyer dataout_loop: 305 1.1 bouyer MOVE FROM t_data, WHEN DATA_OUT; 306 1.1 bouyer MOVE SCRATCHA1 + 1 TO SCRATCHA1 ; adjust offset 307 1.1 bouyer MOVE DSA0 + 8 to DSA0; 308 1.1 bouyer MOVE DSA1 + 0 to DSA1 WITH CARRY; 309 1.1 bouyer MOVE DSA2 + 0 to DSA2 WITH CARRY; 310 1.1 bouyer MOVE DSA3 + 0 to DSA3 WITH CARRY; 311 1.1 bouyer JUMP REL(dataout_loop), WHEN DATA_OUT; 312 1.1 bouyer CALL REL(restoredsa); 313 1.4 bouyer MOVE SCRATCHA0 & flag_data_mask TO SCRATCHA0; 314 1.1 bouyer JUMP REL(waitphase); 315 1.1 bouyer 316 1.1 bouyer savedsa: 317 1.1 bouyer MOVE DSA0 to SFBR; 318 1.1 bouyer MOVE SFBR to SCRATCHB0; 319 1.1 bouyer MOVE DSA1 to SFBR; 320 1.1 bouyer MOVE SFBR to SCRATCHB1; 321 1.1 bouyer MOVE DSA2 to SFBR; 322 1.1 bouyer MOVE SFBR to SCRATCHB2; 323 1.1 bouyer MOVE DSA3 to SFBR; 324 1.1 bouyer MOVE SFBR to SCRATCHB3; 325 1.1 bouyer RETURN; 326 1.1 bouyer 327 1.1 bouyer restoredsa: 328 1.1 bouyer MOVE SCRATCHB0 TO SFBR; 329 1.1 bouyer MOVE SFBR TO DSA0; 330 1.1 bouyer MOVE SCRATCHB1 TO SFBR; 331 1.1 bouyer MOVE SFBR TO DSA1; 332 1.1 bouyer MOVE SCRATCHB2 TO SFBR; 333 1.1 bouyer MOVE SFBR TO DSA2; 334 1.1 bouyer MOVE SCRATCHB3 TO SFBR; 335 1.1 bouyer MOVE SFBR TO DSA3; 336 1.1 bouyer RETURN; 337 1.1 bouyer 338 1.1 bouyer disconnect: 339 1.1 bouyer MOVE SCNTL2 & 0x7f TO SCNTL2; 340 1.1 bouyer CLEAR ATN; 341 1.1 bouyer CLEAR ACK; 342 1.1 bouyer WAIT DISCONNECT; 343 1.1 bouyer RETURN; 344 1.1 bouyer 345 1.1 bouyer handle_cmpl: 346 1.1 bouyer CALL REL(disconnect); 347 1.1 bouyer INT int_done; 348 1.2 bouyer 349 1.2 bouyer handle_extin: 350 1.2 bouyer CLEAR ACK; 351 1.2 bouyer MOVE FROM t_ext_msg_in, WHEN MSG_IN; 352 1.2 bouyer INT int_extmsgin; /* let host fill in t_ext_msg_data */ 353 1.2 bouyer get_extmsgdata: 354 1.2 bouyer CLEAR ACK; 355 1.2 bouyer MOVE FROM t_ext_msg_data, WHEN MSG_IN; 356 1.2 bouyer INT int_extmsgdata; 357 1.10 bouyer msgin_space: 358 1.10 bouyer NOP; space to store msgin when reselect 359 1.10 bouyer 360 1.2 bouyer 361 1.10 bouyer ;; per-target switch script for LUNs 362 1.12 bouyer ; hack: we first do a call to the target-specific code, so that a return 363 1.10 bouyer ; in the main switch will jump to the lun switch. 364 1.10 bouyer PROC lun_switch: 365 1.11 bouyer restore_scntl3: 366 1.11 bouyer MOVE 0xff TO SCNTL3; 367 1.11 bouyer MOVE 0xff TO SXFER; 368 1.11 bouyer JUMP abs_lunsw_return; 369 1.11 bouyer lun_switch_entry: 370 1.10 bouyer CALL REL(restore_scntl3); 371 1.10 bouyer MOVE SCRATCHA1 TO SFBR; 372 1.10 bouyer resel_lun0: 373 1.10 bouyer INT int_resellun; 374 1.10 bouyer 375 1.12 bouyer ;; Per-device switch script for tag 376 1.12 bouyer PROC tag_switch: 377 1.12 bouyer tag_switch_entry: 378 1.12 bouyer MOVE SCRATCHA2 TO SFBR; restore tag 379 1.12 bouyer resel_tag0: 380 1.12 bouyer JUMP abs_tag0, IF 0x00; 381 1.12 bouyer JUMP abs_tag0, IF 0x01; 382 1.12 bouyer JUMP abs_tag0, IF 0x02; 383 1.12 bouyer JUMP abs_tag0, IF 0x03; 384 1.12 bouyer JUMP abs_tag0, IF 0x04; 385 1.12 bouyer JUMP abs_tag0, IF 0x05; 386 1.12 bouyer JUMP abs_tag0, IF 0x06; 387 1.12 bouyer JUMP abs_tag0, IF 0x07; 388 1.12 bouyer JUMP abs_tag0, IF 0x08; 389 1.12 bouyer JUMP abs_tag0, IF 0x09; 390 1.12 bouyer JUMP abs_tag0, IF 0x0a; 391 1.12 bouyer JUMP abs_tag0, IF 0x0b; 392 1.12 bouyer JUMP abs_tag0, IF 0x0c; 393 1.12 bouyer JUMP abs_tag0, IF 0x0d; 394 1.12 bouyer JUMP abs_tag0, IF 0x0e; 395 1.12 bouyer JUMP abs_tag0, IF 0x0f; 396 1.12 bouyer INT int_reseltag; 397 1.12 bouyer 398 1.12 bouyer ;; per-command script: select, and called after a reselect to load DSA 399 1.10 bouyer 400 1.10 bouyer PROC load_dsa: 401 1.10 bouyer ; Can't use MOVE MEMORY to load DSA, doesn't work I/O mapped 402 1.8 bouyer rdsa0: 403 1.10 bouyer MOVE 0xf0 to DSA0; 404 1.8 bouyer rdsa1: 405 1.10 bouyer MOVE 0xf1 to DSA1; 406 1.8 bouyer rdsa2: 407 1.10 bouyer MOVE 0xf2 to DSA2; 408 1.8 bouyer rdsa3: 409 1.10 bouyer MOVE 0xf3 to DSA3; 410 1.10 bouyer RETURN; 411 1.12 bouyer ldsa_reload_dsa: 412 1.12 bouyer CALL REL(rdsa0); 413 1.12 bouyer JUMP ldsa_abs_reselected; 414 1.12 bouyer ldsa_select: 415 1.10 bouyer CALL REL(rdsa0); 416 1.12 bouyer SELECT ATN FROM t_id, ldsa_abs_reselect; 417 1.12 bouyer MOVE MEMORY 4, ldsa_abs_data, ldsa_abs_slot; 418 1.12 bouyer JUMP ldsa_abs_selected; 419 1.12 bouyer ldsa_data: 420 1.12 bouyer NOP; contains data used by the MOVE MEMORY 421 1.13 bouyer 422 1.13 bouyer PROC siop_led_on: 423 1.13 bouyer MOVE GPREG & 0xfe TO GPREG; 424 1.13 bouyer 425 1.13 bouyer PROC siop_led_off: 426 1.13 bouyer MOVE GPREG | 0x01 TO GPREG; 427