1*21cc7f1bSmaya; $NetBSD: osiop.ss,v 1.3 2016/12/12 15:58:44 maya Exp $ 2613923b4Stsutsui 3613923b4Stsutsui; 4613923b4Stsutsui; Copyright (c) 1995 Michael L. Hitch 5613923b4Stsutsui; All rights reserved. 6613923b4Stsutsui; 7613923b4Stsutsui; Redistribution and use in source and binary forms, with or without 8613923b4Stsutsui; modification, are permitted provided that the following conditions 9613923b4Stsutsui; are met: 10613923b4Stsutsui; 1. Redistributions of source code must retain the above copyright 11613923b4Stsutsui; notice, this list of conditions and the following disclaimer. 12613923b4Stsutsui; 2. Redistributions in binary form must reproduce the above copyright 13613923b4Stsutsui; notice, this list of conditions and the following disclaimer in the 14613923b4Stsutsui; documentation and/or other materials provided with the distribution. 15613923b4Stsutsui; 16613923b4Stsutsui; THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 17613923b4Stsutsui; IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 18613923b4Stsutsui; OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 19613923b4Stsutsui; IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 20613923b4Stsutsui; INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 21613923b4Stsutsui; NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 22613923b4Stsutsui; DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 23613923b4Stsutsui; THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 24613923b4Stsutsui; (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 25613923b4Stsutsui; THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 26613923b4Stsutsui; 27613923b4Stsutsui 28613923b4Stsutsui; NCR 53c710 script 29613923b4Stsutsui; 30613923b4StsutsuiARCH 710 31613923b4Stsutsui; 32613923b4StsutsuiABSOLUTE ds_Device = 0 33613923b4StsutsuiABSOLUTE ds_MsgOut = ds_Device + 8 34613923b4StsutsuiABSOLUTE ds_Cmd = ds_MsgOut + 8 35613923b4StsutsuiABSOLUTE ds_Status = ds_Cmd + 8 36613923b4StsutsuiABSOLUTE ds_Msg = ds_Status + 8 37613923b4StsutsuiABSOLUTE ds_MsgIn = ds_Msg + 8 38613923b4StsutsuiABSOLUTE ds_ExtMsg = ds_MsgIn + 8 39613923b4StsutsuiABSOLUTE ds_SyncMsg = ds_ExtMsg + 8 40613923b4StsutsuiABSOLUTE ds_Data1 = ds_SyncMsg + 8 41613923b4StsutsuiABSOLUTE ds_Data2 = ds_Data1 + 8 42613923b4StsutsuiABSOLUTE ds_Data3 = ds_Data2 + 8 43613923b4StsutsuiABSOLUTE ds_Data4 = ds_Data3 + 8 44613923b4StsutsuiABSOLUTE ds_Data5 = ds_Data4 + 8 45613923b4StsutsuiABSOLUTE ds_Data6 = ds_Data5 + 8 46613923b4StsutsuiABSOLUTE ds_Data7 = ds_Data6 + 8 47613923b4StsutsuiABSOLUTE ds_Data8 = ds_Data7 + 8 48613923b4StsutsuiABSOLUTE ds_Data9 = ds_Data8 + 8 49613923b4StsutsuiABSOLUTE ds_Data10 = ds_Data9 + 8 50613923b4StsutsuiABSOLUTE ds_Data11 = ds_Data10 + 8 51613923b4StsutsuiABSOLUTE ds_Data12 = ds_Data11 + 8 52613923b4StsutsuiABSOLUTE ds_Data13 = ds_Data12 + 8 53613923b4StsutsuiABSOLUTE ds_Data14 = ds_Data13 + 8 54613923b4StsutsuiABSOLUTE ds_Data15 = ds_Data14 + 8 55613923b4StsutsuiABSOLUTE ds_Data16 = ds_Data15 + 8 56613923b4StsutsuiABSOLUTE ds_Data17 = ds_Data16 + 8 57613923b4Stsutsui 58613923b4Stsutsui 59613923b4StsutsuiABSOLUTE ok = 0xff00 60613923b4StsutsuiABSOLUTE int_disc = 0xff01 61613923b4StsutsuiABSOLUTE int_disc_wodp = 0xff02 62613923b4StsutsuiABSOLUTE int_reconnect = 0xff03 63613923b4StsutsuiABSOLUTE int_connect = 0xff04 64613923b4StsutsuiABSOLUTE int_phase = 0xff05 65613923b4StsutsuiABSOLUTE int_msgin = 0xff06 66613923b4StsutsuiABSOLUTE int_extmsg = 0xff07 67613923b4StsutsuiABSOLUTE int_msgsdp = 0xff08 68613923b4StsutsuiABSOLUTE int_identify = 0xff09 69613923b4StsutsuiABSOLUTE int_status = 0xff0a 70613923b4StsutsuiABSOLUTE int_syncmsg = 0xff0b 71613923b4Stsutsui 72613923b4StsutsuiENTRY scripts 73613923b4StsutsuiENTRY switch 74613923b4StsutsuiENTRY wait_reselect 75613923b4StsutsuiENTRY dataout 76613923b4StsutsuiENTRY datain 77613923b4StsutsuiENTRY clear_ack 78613923b4Stsutsui 79613923b4StsutsuiPROC osiop_script: 80613923b4Stsutsui 81613923b4Stsutsuiscripts: 82613923b4Stsutsui 83613923b4Stsutsui SELECT ATN FROM ds_Device, REL(reselect) 84613923b4Stsutsui; 85613923b4Stsutsuiswitch: 86613923b4Stsutsui JUMP REL(msgin), WHEN MSG_IN 87613923b4Stsutsui JUMP REL(msgout), IF MSG_OUT 88613923b4Stsutsui JUMP REL(command_phase), IF CMD 89613923b4Stsutsui JUMP REL(dataout), IF DATA_OUT 90613923b4Stsutsui JUMP REL(datain), IF DATA_IN 91613923b4Stsutsui JUMP REL(end), IF STATUS 92613923b4Stsutsui 93613923b4Stsutsui INT int_phase ; Unrecognized phase 94613923b4Stsutsui 95613923b4Stsutsuimsgin: 96613923b4Stsutsui MOVE FROM ds_MsgIn, WHEN MSG_IN 97613923b4Stsutsui JUMP REL(ext_msg), IF 0x01 ; extended message 98613923b4Stsutsui JUMP REL(disc), IF 0x04 ; disconnect message 99613923b4Stsutsui JUMP REL(msg_sdp), IF 0x02 ; save data pointers 100613923b4Stsutsui JUMP REL(msg_rej), IF 0x07 ; message reject 101613923b4Stsutsui JUMP REL(msg_rdp), IF 0x03 ; restore data pointers 102613923b4Stsutsui INT int_msgin ; unrecognized message 103613923b4Stsutsui 104613923b4Stsutsuimsg_rej: 105613923b4Stsutsui; Do we need to interrupt host here to let it handle the reject? 106613923b4Stsutsuimsg_rdp: 107613923b4Stsutsuiclear_ack: 108613923b4Stsutsui CLEAR ACK 109613923b4Stsutsui CLEAR ATN 110613923b4Stsutsui JUMP REL(switch) 111613923b4Stsutsui 112613923b4Stsutsuiext_msg: 113613923b4Stsutsui CLEAR ACK 114613923b4Stsutsui MOVE FROM ds_ExtMsg, WHEN MSG_IN 115613923b4Stsutsui JUMP REL(sync_msg), IF 0x03 116613923b4Stsutsui int int_extmsg ; extended message not SDTR 117613923b4Stsutsui 118613923b4Stsutsuisync_msg: 119613923b4Stsutsui CLEAR ACK 120613923b4Stsutsui MOVE FROM ds_SyncMsg, WHEN MSG_IN 121613923b4Stsutsui int int_syncmsg ; Let host handle the message 122613923b4Stsutsui; If we continue from the interrupt, the host has set up a response 123613923b4Stsutsui; message to be sent. Set ATN, clear ACK, and continue. 124613923b4Stsutsui SET ATN 125613923b4Stsutsui CLEAR ACK 126613923b4Stsutsui JUMP REL(switch) 127613923b4Stsutsui 128613923b4Stsutsuidisc: 129613923b4Stsutsui CLEAR ACK 130613923b4Stsutsui WAIT DISCONNECT 131613923b4Stsutsui 132613923b4Stsutsui int int_disc_wodp ; signal disconnect w/o save DP 133613923b4Stsutsui 134613923b4Stsutsuimsg_sdp: 135613923b4Stsutsui CLEAR ACK ; acknowledge message 136613923b4Stsutsui JUMP REL(switch), WHEN NOT MSG_IN 137613923b4Stsutsui MOVE FROM ds_ExtMsg, WHEN MSG_IN 138613923b4Stsutsui INT int_msgsdp, IF NOT 0x04 ; interrupt if not disconnect 139613923b4Stsutsui CLEAR ACK 140613923b4Stsutsui WAIT DISCONNECT 141613923b4Stsutsui 142613923b4Stsutsui INT int_disc ; signal disconnect 143613923b4Stsutsui 144613923b4Stsutsuireselect: 145613923b4Stsutsuiwait_reselect: 146613923b4Stsutsui WAIT RESELECT REL(select_adr) 147613923b4Stsutsui MOVE LCRC to SFBR ; Save reselect ID 148613923b4Stsutsui MOVE SFBR to SCRATCH0 149613923b4Stsutsui 150613923b4Stsutsui INT int_identify, WHEN NOT MSG_IN 151613923b4Stsutsui MOVE FROM ds_Msg, WHEN MSG_IN 152613923b4Stsutsui INT int_reconnect ; let host know about reconnect 153*21cc7f1bSmaya CLEAR ACK ; acknowledge the message 154613923b4Stsutsui JUMP REL(switch) 155613923b4Stsutsui 156613923b4Stsutsuiselect_adr: 157613923b4Stsutsui MOVE SCNTL1 & 0x10 to SFBR ; get connected status 158613923b4Stsutsui INT int_connect, IF 0x00 ; tell host if not connected 159613923b4Stsutsui MOVE CTEST2 & 0x40 to SFBR ; clear Sig_P 160613923b4Stsutsui JUMP REL(wait_reselect) ; and try reselect again 161613923b4Stsutsui 162613923b4Stsutsuimsgout: 163613923b4Stsutsui MOVE FROM ds_MsgOut, WHEN MSG_OUT 164613923b4Stsutsui JUMP REL(switch) 165613923b4Stsutsui 166613923b4Stsutsuicommand_phase: 167613923b4Stsutsui CLEAR ATN 168613923b4Stsutsui MOVE FROM ds_Cmd, WHEN CMD 169613923b4Stsutsui JUMP REL(switch) 170613923b4Stsutsui 171613923b4Stsutsuidataout: 172613923b4Stsutsui MOVE FROM ds_Data1, WHEN DATA_OUT 173613923b4Stsutsui CALL REL(switch), WHEN NOT DATA_OUT 174613923b4Stsutsui MOVE FROM ds_Data2, WHEN DATA_OUT 175613923b4Stsutsui CALL REL(switch), WHEN NOT DATA_OUT 176613923b4Stsutsui MOVE FROM ds_Data3, WHEN DATA_OUT 177613923b4Stsutsui CALL REL(switch), WHEN NOT DATA_OUT 178613923b4Stsutsui MOVE FROM ds_Data4, WHEN DATA_OUT 179613923b4Stsutsui CALL REL(switch), WHEN NOT DATA_OUT 180613923b4Stsutsui MOVE FROM ds_Data5, WHEN DATA_OUT 181613923b4Stsutsui CALL REL(switch), WHEN NOT DATA_OUT 182613923b4Stsutsui MOVE FROM ds_Data6, WHEN DATA_OUT 183613923b4Stsutsui CALL REL(switch), WHEN NOT DATA_OUT 184613923b4Stsutsui MOVE FROM ds_Data7, WHEN DATA_OUT 185613923b4Stsutsui CALL REL(switch), WHEN NOT DATA_OUT 186613923b4Stsutsui MOVE FROM ds_Data8, WHEN DATA_OUT 187613923b4Stsutsui CALL REL(switch), WHEN NOT DATA_OUT 188613923b4Stsutsui MOVE FROM ds_Data9, WHEN DATA_OUT 189613923b4Stsutsui CALL REL(switch), WHEN NOT DATA_OUT 190613923b4Stsutsui MOVE FROM ds_Data10, WHEN DATA_OUT 191613923b4Stsutsui CALL REL(switch), WHEN NOT DATA_OUT 192613923b4Stsutsui MOVE FROM ds_Data11, WHEN DATA_OUT 193613923b4Stsutsui CALL REL(switch), WHEN NOT DATA_OUT 194613923b4Stsutsui MOVE FROM ds_Data12, WHEN DATA_OUT 195613923b4Stsutsui CALL REL(switch), WHEN NOT DATA_OUT 196613923b4Stsutsui MOVE FROM ds_Data13, WHEN DATA_OUT 197613923b4Stsutsui CALL REL(switch), WHEN NOT DATA_OUT 198613923b4Stsutsui MOVE FROM ds_Data14, WHEN DATA_OUT 199613923b4Stsutsui CALL REL(switch), WHEN NOT DATA_OUT 200613923b4Stsutsui MOVE FROM ds_Data15, WHEN DATA_OUT 201613923b4Stsutsui CALL REL(switch), WHEN NOT DATA_OUT 202613923b4Stsutsui MOVE FROM ds_Data16, WHEN DATA_OUT 203613923b4Stsutsui CALL REL(switch), WHEN NOT DATA_OUT 204613923b4Stsutsui MOVE FROM ds_Data17, WHEN DATA_OUT 205613923b4Stsutsui CALL REL(switch) 206613923b4Stsutsui 207613923b4Stsutsuidatain: 208613923b4Stsutsui MOVE FROM ds_Data1, WHEN DATA_IN 209613923b4Stsutsui CALL REL(switch), WHEN NOT DATA_IN 210613923b4Stsutsui MOVE FROM ds_Data2, WHEN DATA_IN 211613923b4Stsutsui CALL REL(switch), WHEN NOT DATA_IN 212613923b4Stsutsui MOVE FROM ds_Data3, WHEN DATA_IN 213613923b4Stsutsui CALL REL(switch), WHEN NOT DATA_IN 214613923b4Stsutsui MOVE FROM ds_Data4, WHEN DATA_IN 215613923b4Stsutsui CALL REL(switch), WHEN NOT DATA_IN 216613923b4Stsutsui MOVE FROM ds_Data5, WHEN DATA_IN 217613923b4Stsutsui CALL REL(switch), WHEN NOT DATA_IN 218613923b4Stsutsui MOVE FROM ds_Data6, WHEN DATA_IN 219613923b4Stsutsui CALL REL(switch), WHEN NOT DATA_IN 220613923b4Stsutsui MOVE FROM ds_Data7, WHEN DATA_IN 221613923b4Stsutsui CALL REL(switch), WHEN NOT DATA_IN 222613923b4Stsutsui MOVE FROM ds_Data8, WHEN DATA_IN 223613923b4Stsutsui CALL REL(switch), WHEN NOT DATA_IN 224613923b4Stsutsui MOVE FROM ds_Data9, WHEN DATA_IN 225613923b4Stsutsui CALL REL(switch), WHEN NOT DATA_IN 226613923b4Stsutsui MOVE FROM ds_Data10, WHEN DATA_IN 227613923b4Stsutsui CALL REL(switch), WHEN NOT DATA_IN 228613923b4Stsutsui MOVE FROM ds_Data11, WHEN DATA_IN 229613923b4Stsutsui CALL REL(switch), WHEN NOT DATA_IN 230613923b4Stsutsui MOVE FROM ds_Data12, WHEN DATA_IN 231613923b4Stsutsui CALL REL(switch), WHEN NOT DATA_IN 232613923b4Stsutsui MOVE FROM ds_Data13, WHEN DATA_IN 233613923b4Stsutsui CALL REL(switch), WHEN NOT DATA_IN 234613923b4Stsutsui MOVE FROM ds_Data14, WHEN DATA_IN 235613923b4Stsutsui CALL REL(switch), WHEN NOT DATA_IN 236613923b4Stsutsui MOVE FROM ds_Data15, WHEN DATA_IN 237613923b4Stsutsui CALL REL(switch), WHEN NOT DATA_IN 238613923b4Stsutsui MOVE FROM ds_Data16, WHEN DATA_IN 239613923b4Stsutsui CALL REL(switch), WHEN NOT DATA_IN 240613923b4Stsutsui MOVE FROM ds_Data17, WHEN DATA_IN 241613923b4Stsutsui CALL REL(switch) 242613923b4Stsutsui 243613923b4Stsutsuiend: 244613923b4Stsutsui MOVE FROM ds_Status, WHEN STATUS 245613923b4Stsutsui int int_status, WHEN NOT MSG_IN ; status not followed by msg 246613923b4Stsutsui MOVE FROM ds_Msg, WHEN MSG_IN 247613923b4Stsutsui CLEAR ACK 248613923b4Stsutsui WAIT DISCONNECT 249613923b4Stsutsui INT ok ; signal completion 250613923b4Stsutsui JUMP REL(wait_reselect) 251