ncr710init.n
上传用户:luoyougen
上传日期:2008-05-12
资源大小:23136k
文件大小:21k
源码类别:

VxWorks

开发平台:

C/C++

  1. ; ncr710init.n Script code for ncr710Lib Driver 
  2. ;
  3. ;START_DOC
  4. ;/* ncr710init.c - script programs for the NCR 710 */
  5. ;
  6. ;/* Copyright 1989-1994 Wind River Systems, Inc. */
  7. ;#include "copyright_wrs.h"
  8. ;
  9. ;/* 
  10. ;Modification history
  11. ;--------------------
  12. ;03f,20jul92,eve    Added documentation. 
  13. ;03e,20jul92,eve    Rename end label to endTransact.
  14. ;03d,03jul92,eve    Include NCR_COMPILER_BUG in the file.
  15. ;03c,04mar92,eve    Start disconnect implementation.
  16. ;03b,16jan92,eve    Add ackMsg1 ,ackAtnMsg and endAbort, remove 
  17. ;     script test proc.
  18. ;03a,30oct91,eve    Remove int capability in end label,the scsi 
  19. ;     status is process by the ncr710Lib driver.
  20. ;02a,26oct91,eve    Add enable disable timout between selection
  21. ;     step.
  22. ;01a,23oct91,eve    Created and add comments
  23. ;*/
  24. ;
  25. ;/*
  26. ;INTERNAL
  27. ;NCR710 FEATURE USED
  28. ;This chip has code which performs some action on the scsi bus.
  29. ;The description level of the code is close to an assembly language and 
  30. ;dedicated for scsi bus operations. 
  31. ;The opcode is a pair of 32bit word that allow some basic operations in the 
  32. ;code (jump, tests values) and on the scsi (select ,assert line):
  33. ;
  34. ;block move instruction.
  35. ;  move from <offset> when PHASE_NAME
  36. ;  ........
  37. ;I/O instructions 
  38. ;  set target 
  39. ;  wait DISCONNECT
  40. ;  wait RESELECT
  41. ;  select from <offset>,@jump
  42. ;  .........  
  43. ;read/write register instructions
  44. ;  move REG_NAME to SBFR
  45. ;  .........  
  46. ;transfert control instructions
  47. ;  jump <Label> 
  48. ;  int <value> when PHASE_NAME
  49. ;  ........... 
  50. ;  move memory instruction
  51. ;  never use.  
  52. ;The previous example does not included all of the instruction set, 
  53. ;see the NCR data reference manual.
  54. ;Another key point is the capability of the script to perform some 
  55. ;limited indirect addressing to get information from the cpu memory.
  56. ;This is used to get Target ID to select it, to get data, message pointer
  57. ;and count during transfer phase.  This avoids having to patch the script
  58. ;at the run time to specify count, data pointer and target ID.
  59. ;
  60. ;Script can tranfer directly, with its DMA core, a data block from/to the 
  61. ;scsi bus from/to cpu memory.
  62. ;The instruction involved is :
  63. ;        move from <offset> when PHASE_NAME
  64. ;In this case the offset is hard coded in the ncr710Script.h and indexed the
  65. ;right field in the NCR_CTL structure (see ncr710Script1.h). 
  66. ;The field looks like :
  67. ;    aligned 32 bit @->00xxxxxx  24bit count
  68. ;                    ->ZZZZZZZZ  32bit address pointer.
  69. ;The offset is added to the content of the DNAD register, loaded at 
  70. ;the run time with the base address of the structure.
  71. ;In the same way the select instruction uses a field like:
  72. ;        select from <offset> ,<Alternate jump @>
  73. ;
  74. ; where offset + DNAD points to a field like:
  75. ;aligned 32 bit@->0000|0000|xxxx xxxx|xPPP  |SSSS|0000|0000
  76. ;                           Target ID|Period|Offset
  77. ;
  78. ;The Period and offset are used when a target supports the synchronous 
  79. ;transfert.
  80. ;
  81. ;INTERRUPT SOURCE
  82. ;The chip has three main kind of interrupt, scsi, dma interrupt and 
  83. ;script  interrupt.  The scsi interrupts are maskable individually with 
  84. ;the sien register.
  85. ;.CS
  86. ;SIEN
  87. ;  7    M/A Mismatch interrupt(initiator)/ ATN assert (Target)
  88. ;       Used in the driver to detect a phase change during data/msg
  89. ;       transfert.The ncr is never used in target mode.
  90. ;  6    FCMP function complete Not used (masked).
  91. ;  5    STO scsi Bus Time out
  92. ;       Used to get timeout on select.(**)
  93. ;  4    SEL selected or reselected Not used in the driver.(masked).
  94. ;  3    SGE scsi Gross error. Used in the driver.
  95. ;  2    UDC unexpected disconnect.
  96. ;       Used to detect unexpected target disconnection or an expected 
  97. ;       disconnect if the target received a "device reset message".
  98. ;  1    RST scsi reset received (not used).(masked)(***)
  99. ;  0    PAR parity error not used.(masked)(***)
  100. ;
  101. ;(**)    The script disable the timeout capability by setting the bit 7 
  102. ;        in CTEST7 register.  Because the ncr will generate also a timeout
  103. ;        interrupt  if no activity occur on the scsi bus after 250ms,
  104. ;        and not only during a scsi select.
  105. ;
  106. ;(***)  This case should be processed, but not included in the driver today.
  107. ;.CE
  108. ;
  109. ;The Dma interrupts are maskable with the DIEN register:
  110. ;.CS
  111. ;DIEN
  112. ;  7   Reserved
  113. ;  6   Reserved
  114. ;  5   BF bus fault.Memory acces error.
  115. ;  4   Aborted ,means that the abort bit have been set in ISTAT reg
  116. ;      This case never happen (Abort bit not used).
  117. ;  3   SSI single step interrupt.Not used in the operational mode.
  118. ;      This bit is used in single step debug mode in the driver,
  119. ;      allowing to execute script step by step..
  120. ;  2   SIR script interrupt,used to detect a script intruction
  121. ;      <int ...>.
  122. ;  1   WTD Watchdog interrupt.This case never happens because
  123. ;      The watchdog timeout value is set to 0 in DWT register.
  124. ;  0   IID illegal instruction detected.  Recieved in two
  125. ;      cases :1-Bad opcode, 2-count set to 0 in the <move> opcode.
  126. ;.CE
  127. ;
  128. ;The other register involved  in  the  interrupt  process  is ISTAT.
  129. ;This register is the ONLY READABLE/WRITABLE  register during a script 
  130. ;execution.
  131. ;.CS
  132. ; ISTAT
  133. ; 7   ABRT Abort current instruction.Not used
  134. ; 6   RST  software reset used to set the chip to a known state.
  135. ; 5   SIGP signal process bit.This bit is used in the ncr driver to support
  136. ;     the connect disconnect to get an interrupt to start a new scsi 
  137. ;     command.(SEE CONNECT/DISCONNECT ...).
  138. ; 4   Reserved.
  139. ; 3   Connected ,not used.
  140. ; 2   Reserved.
  141. ; 1   SIP scsi interrupt pending.Used at interrupt
  142. ;     level to detect and clear SIEN interrupt.
  143. ; 0   DIP dma interrupt pending.Used at interrupt
  144. ;     level to detect and clear DIEN interrupt.
  145. ;.CE
  146. ;The interrupt are cleared by reading the register source, and by 
  147. ;checking  the DIP and SIP bit in ISTAT.  Because the chip has a stack 
  148. ;interrupt ,the DIEN and SIEN registers are read until the ISTAT bits 
  149. ;are cleared to be sure there is no interrupt pending.
  150. ;
  151. ;The last interrupt source is the script <INT> opcode. 
  152. ;This instruction is  used to interrupt the cpu if the scsi 
  153. ;transaction involves a cpu process.
  154. ;.CS
  155. ;    int <int value> [<condition><value>] (pg 6-10 of the programmers guide).
  156. ;.CE
  157. ;The <int value> is used in the driver code to detect the scsi condition  
  158. ;and takes a decision for the next step of the transaction.  
  159. ;This value is loaded from the opcode and read by the  CPU in the 
  160. ;DSPS register.
  161. ;
  162. ;CONNECT/DISCONNECT AND NEW COMMAND START
  163. ;
  164. ;When connect/disconnect is enabled, the target could reconnect at any time.
  165. ;This is notified to the target by an identify message send by the initiator
  166. ;after a successful selection of the target.
  167. ;The  disconnect is always sent to an initiator by a DISCONNECT message.
  168. ;The reconnect could occur at any arbitration phase.  
  169. ;To be able to detect it at any time the chip has to wait for a reconnect 
  170. ;on the scsi ,which is done with the <wait reconnect> script opcode:
  171. ;  wait RECONNECT,<Alternate @>
  172. ;  <next opcode>
  173. ;.CS
  174. ;  If a reconnect occurs, then the <next opcode>
  175. ;  is executed.If the SIGP bit is set the script
  176. ;  jump to <Alternate @>
  177. ;.CE
  178. ;
  179. ;But a reconnect could also occurs during a  <select>  opcode for  another  
  180. ;device (it looses the arbitration).  The <wait RECONNECT> instruction is 
  181. ;the idle script entry point.  They are two way to abort this instruction:
  182. ;
  183. ;  1-The Sigp bit is set
  184. ;  2-A reconnect,or a select occur ,in this case
  185. ;    select means that the initiator is selected as
  186. ;    a target on the scsi bus
  187. ;
  188. ;The sigp bit is used to detect and start a new command at interrupt level. 
  189. ;It is set at task level each time that a new command has to be run.
  190. ;
  191. ;
  192. ;.CS
  193. ;SCRIPT START FLOW CHART
  194. ;The reselected path is driven by a physical scsi reconnect/select.
  195. ;
  196. ;IDLE ENTRY POINT
  197. ;<waitSelect>
  198. ;Wait for a reselect ,Alternate @-------->
  199. ;and test sigp ?                         | SIGP set or Select to start
  200. ;  |                                     |
  201. ;  |<-reselect                           /
  202. ;  |                       No    <checkNewCmd>
  203. ;  |                     /-------Check if we are connected ?
  204. ;<reselect>              |       clear SIGP
  205. ;save Targ/init ID       |       Wait for reselect,<@select as a target>
  206. ;from LCRC register      |       Jump to <reselect>      |
  207. ;Get identify            |                               |
  208. ;Msg in.                 <startNewCmd>                   |
  209. ;int Cpu <reselected>    test and clear SIGP     int Cpu <SELECT AS A TARGET>
  210. ;                        1) SIGP set
  211. ;                        int Cpu <NEW COMMAND>
  212. ;                        2) SIGP clear
  213. ;                        int Cpu <BAD NEW COMD>
  214. ;.CE
  215. ;a) RESELECT
  216. ;At interrupt level, the target ID from the saved LCRC register (LCRC contain
  217. ;the data bus value that is <the target ID> | <initiator ID>) and the LUN 
  218. ;extracted from the identify message sent by the target are used to index 
  219. ;an array that keep track of each PHYS_DEV nexus (Max = 64) in the  SIOP  
  220. ;structure (driver structure).
  221. ;
  222. ;b) NEW COMMAND
  223. ;A global variable <pNcrCtlCmd> in the SIOP structure  allows the script to be 
  224. ;start at a selected entry point with the script address included in this 
  225. ;current nexus pointer in pNcrCtlCmd.
  226. ;
  227. ;c)SELECT AS A TARGET
  228. ;That an error case (we dont support the target  mode)  ,restart script at 
  229. ;the IDLE point.
  230. ;
  231. ;d)BAD NEW CMD
  232. ;It's a bogus start command restart script at the IDLE Point.
  233. ;
  234. ;SCRIPT REMARKS
  235. ;This script performs a scsi transaction.  This script is a part of 
  236. ;the usual scsi phase routine.  This code is only compatible with the 
  237. ;ncr710 because it uses an indirect addressing mode to avoid relocation 
  238. ;at run time.
  239. ;All of the external values will be relative to the DSA register.
  240. ;DSA register has to be loaded whith the address of the ncrCtrl host memory
  241. ;structure (see ncr710Script1.h).
  242. ;Scratch3 register is used to save the LCRC register. LCRC is stamped with
  243. ;the initiator ID and target ID when a reconnect (initiator is selected
  244. ;by a target) occurs.
  245. ;SCRATCH0 is used to hold phase requested to be able to process a phase 
  246. ;mismatch during any data or message phase.  Usually that occur before a 
  247. ;legal disconnect from the target (save pointer and disconnect message).
  248. ; */
  249. ;
  250. ;END_DOC
  251. ;  
  252. ;/* Use to choose options in .h */
  253. #define NCRCOMPILE
  254. ;/* Will be include by the first preprocessor pass */
  255. #include "ncr710Script1.h"
  256. ;/* Will be include by the C compiler */
  257. PASS(#define NCR_COMPILER_BUG)
  258. PASS(ncr710Script1.h)
  259.  
  260. ;/* forward declaration for C compiler. Each new procedure  must 
  261. ;   be define if it's used as a reference in the code. */
  262. PASS(extern UINT waitSelect[];)
  263. PASS(extern UINT reselect[];)
  264. PASS(extern UINT checkNewCmd[];)
  265. PASS(extern UINT startNewCmd[];)
  266. PASS(extern UINT selWithAtn[];)
  267. PASS(extern UINT selWithoutAtn[];)
  268. PASS(extern UINT contTransact[];)
  269. PASS(extern UINT endTransact[];)
  270. PASS(extern UINT msgOut1[];) 
  271. PASS(extern UINT msgOut3[];) 
  272. PASS(extern UINT outputData[];)
  273. PASS(extern UINT checkOut[];)
  274. PASS(extern UINT inputData[];)
  275. PASS(extern UINT msg1[];)
  276. PASS(extern UINT msg2[];)
  277. PASS(extern UINT msg3[];)
  278. PASS(extern UINT selectAddr[];)
  279. PASS(extern UINT ackMsg1[];)
  280. PASS(extern UINT ackMsg3[];)
  281. PASS(extern UINT checkPhData[];)
  282. PASS(extern UINT ackAtnMsg[];)
  283. PASS(extern UINT asortPh[];)
  284. PASS(extern UINT endAbort[];)
  285. PASS(extern UINT reserOutPh[];)
  286. PASS(extern UINT reserInPh[];)
  287. PASS(extern UINT reselSelect[];)
  288. ;/******************************************************************************
  289. ;* Entry point of the script to wait for 
  290. ;* reselected or start a new command.
  291. ;*
  292. ;*/
  293. PROC waitSelect:
  294. move CTEST7 | B_TIMEO to CTEST7
  295. move PHASE_NOPHASE to SCRATCH0
  296. wait RESELECT PASS((UINT)checkNewCmd)
  297. jump PASS((UINT)reselect)
  298. ;/******************************************************************************
  299. ;* Entry point to get msgin and perform  
  300. ;* reconnection phase for the cpu
  301. ;*/
  302. PROC reselect:
  303. ;/* clear target mode */
  304. clear target
  305. ;/* Save reselected device id in SCRATCH3 */
  306. move LCRC to SFBR
  307. move SFBR to SCRATCH3
  308. ;/* an identify message must be the next */
  309. move from PASS(IDENTCOUNT), when MSG_IN
  310. ;/* interrupt cpu to restore the context */
  311. int PASS(RECONNECT_PROCESS)
  312. PROC checkNewCmd:
  313. ;/* check if we are connected */
  314. move SCNTL1 & B_CON to SFBR 
  315. ;/* if none that's a new command to start */
  316. jump PASS((UINT)startNewCmd) if 0
  317. ;/* clear sigp and go to reselected code */
  318. move CTEST2 & B_SIGP to SFBR
  319. wait RESELECT PASS((UINT)selectAddr)
  320. jump PASS((UINT)reselect)
  321. PROC startNewCmd:
  322. ;/* test and clear the sigp bit */
  323. move CTEST2 & B_SIGP to SFBR
  324. ;/* that's a new command interrupt cpu */
  325. jump REL(intCpuNewCmd) if not 0
  326. ;/* that's an big error go to wait entry point */
  327. int PASS(BAD_NEW_CMD)
  328. jump PASS((UINT)waitSelect)
  329. intCpuNewCmd:
  330. int PASS(NEW_COMMAND_PROCESS)
  331. PROC reselSelect:
  332. int PASS(RECONNECT_IN_SELECT)
  333. ;/******************************************************************************
  334. ;* First entry point of the script select 
  335. ;* with ATN.
  336. ;*
  337. ;*/
  338. PROC selWithAtn:
  339. ;    /* Turn on time out before a select  */
  340. ;to be comment when you want debuging script
  341. move CTEST7 & ~B_TIMEO to CTEST7 
  342. ;to be uncomment when you want debuging script
  343. ;move CTEST7 | B_TIMEO to CTEST7 
  344. ;/* stamps current requested phase */
  345. move PHASE_NOPHASE to SCRATCH0 
  346. ;/* Select device */
  347. select ATN from DEVICEID ,PASS((UINT)checkNewCmd)
  348. ;select ATN from DEVICEID ,PASS((UINT)reselSelect)
  349. ;    /* If status accept it */
  350. jump PASS((UINT)endTransact),when STATUS
  351. ;    /* only this phase must occur after a select with ATN  */
  352. jump PASS ((UINT) msgOut1) when MSG_OUT
  353. int PASS(MSGOUT_EXPECT),if not MSG_OUT
  354. ;/******************************************************************************
  355. ;* Entry for select without attention asserted 
  356. ;* be used.
  357. ;* selWithoutATN 
  358. ;*/
  359. PROC selWithoutAtn:
  360. ;    /* Turn on time out before a select */
  361. ;to be commented when you want debuging script
  362. move CTEST7 & ~B_TIMEO to CTEST7 
  363. ;to be uncommented when you want debuging script
  364. ;move CTEST7 | B_TIMEO to CTEST7 
  365. ;/* Log requested phase */
  366. move PHASE_NOPHASE to SCRATCH0
  367. ;/* select device */
  368. select from DEVICEID ,PASS((UINT)checkNewCmd)
  369. jump PASS ((UINT) contTransact) 
  370. ;/******************************************************************************
  371. ;* Main proc to handle a complete scsi 
  372. ;* transaction  
  373. ;*/ 
  374. PROC contTransact:
  375. ;    /* if status phase just after select */
  376. jump PASS((UINT)endTransact),when STATUS
  377. ; /* check and jump to a normal phase after a select */
  378. jump PASS((UINT)msgOut1),when MSG_OUT
  379. jump PASS((UINT)endTransact),when STATUS
  380. jump PASS((UINT)msg1),when MSG_IN
  381. int PASS(BAD_PH_BEFORE_CMD),if not CMD
  382. ;    /* Turn off time out after a select, some commands take a long time */
  383. move CTEST7 | B_TIMEO to CTEST7 
  384. move PHASE_COMMAND to SCRATCH0
  385. move from PASS(CMDCOUNT) ,when CMD
  386. ; /* Jump to a normal phase after a command */
  387. jump PASS((UINT)msg2),when MSG_IN
  388. jump PASS((UINT)endTransact),if STATUS
  389. jump PASS((UINT)inputData),if DATA_IN
  390. jump PASS((UINT)outputData),if DATA_OUT
  391. int PASS(BAD_PH_AFTER_CMD)
  392. ;/******************************************************************************
  393. ; * Process the end of a scsi transaction.
  394. ; * 
  395. ; */ 
  396. PROC endTransact:
  397. move CTEST7 & ~B_TIMEO to CTEST7
  398. move PHASE_STATUS to SCRATCH0
  399. ;/* status first */
  400. move from PASS(STATUSCOUNT),when STATUS
  401. int PASS(MSGIN_EXPECT_AFTER_ST), when not MSG_IN
  402. move PHASE_MSGIN to SCRATCH0
  403. ;/* command complete follow */
  404. move from PASS(MSGINCOUNT), when MSG_IN
  405. int PASS(BAD_MSG_INSTEAD_CMDCOMP), if not M_CMD_COMP 
  406. clear ACK
  407. ;    /* Turn on time out */
  408. move CTEST7 & ~B_TIMEO to CTEST7 
  409. ;/* get off bus ,wait free phase */
  410. wait DISCONNECT
  411. int PASS(GOOD_END)
  412. ;/* Process a message out and go to the target requested phase */
  413. PROC msgOut1:
  414. move PHASE_MSGOUT to SCRATCH0 
  415. move from PASS(MSGOUTCOUNT) ,when MSG_OUT
  416. jump PASS((UINT)contTransact),when COMMAND
  417. jump PASS((UINT)contTransact) if STATUS  
  418. jump PASS((UINT)inputData) if DATA_IN   
  419. jump PASS((UINT)outputData) if DATA_OUT 
  420. jump PASS((UINT)msg1) if MSG_IN 
  421. int PASS(PH_UNKNOWN)
  422. ;/* same as msgout1 but use after data phase */
  423. PROC msgOut3:
  424. move PHASE_MSGOUT to SCRATCH0
  425. move from PASS(MSGOUTCOUNT) ,when MSG_OUT
  426. jump PASS((UINT)contTransact),when COMMAND
  427. jump PASS((UINT)contTransact) if STATUS
  428. jump PASS((UINT)inputData) if DATA_IN
  429. jump PASS((UINT)outputData) if DATA_OUT
  430. jump PASS((UINT)msg3) if MSG_IN
  431. int PASS(PH_UNKNOWN)
  432. ;/* process a data out phase */
  433. PROC outputData:
  434. move PHASE_DATAOUT to SCRATCH0
  435. move from PASS(DATACOUNT),when DATA_OUT
  436. ;/* handle the end of a transaction after a data phase */
  437. PROC checkOut:
  438. jump PASS((UINT)endTransact),when STATUS
  439. jump PASS((UINT)msg3),when MSG_IN
  440. jump PASS((UINT) asortPh)
  441. ;
  442. ;/* process a data in phase */
  443. PROC inputData:
  444. move PHASE_DATAIN to SCRATCH0
  445. ;move CTEST7 & ~B_TIMEO to CTEST7
  446. move from PASS(DATACOUNT),when DATA_IN
  447. jump PASS((UINT)checkOut)
  448.  
  449. ;/* proc to receive a message from target before command phase */
  450. PROC msg1:
  451. move PHASE_MSGIN to SCRATCH0
  452. move from PASS(MSGINCOUNT),when MSG_IN
  453. ;/* check for extended msg */
  454. jump REL(extMsg1),if M_EXT_MSG 
  455. ;/* int cpu to save data pointer */
  456. int PASS(SAVDATP_BEFORE_CMD), if M_SAV_DAT_P 
  457. ;/* int cpu to restore pointer */
  458. int PASS(RESTORE_POINTER), if M_REST_P
  459. ;/* jump to disconnect process if disconnect msg */
  460. jump REL(disc1), if M_DISC
  461. ;/* int cpu for a reject msg received ,the cpu have to find out 
  462. ;   which message have been rejected */
  463. int PASS(REJECT_MSG1), if M_MSG_REJECT
  464. int PASS(BAD_MSGIN_BEFORE_CMD)
  465. ;/* sub-proc entry point for an extended msg in */
  466. extMsg1:
  467. ; /* accept first byte message */     
  468. clear ACK
  469. ;/* get the remain of the extended msg */
  470. move from PASS(EXTMSGINCOUNT),when MSG_IN
  471. ;/* int cpu to process this extended message */
  472. int PASS(EXTMSG_BEFORE_CMD)
  473. disc1:
  474. ;/* accept message byte */
  475. clear ACK
  476. ;/* wait for a legal disconnect from the target */
  477. wait DISCONNECT
  478. ;/* int cpu to process disconnect on this device */
  479. int PASS(DISC_BEFORE_CMD)
  480. ;/* SAME AS MSG1 but after cmd phase */
  481. PROC msg2:
  482. move PHASE_MSGIN to SCRATCH0
  483. move from PASS(MSGINCOUNT) ,when MSG_IN
  484. jump REL(extMsg2),if M_EXT_MSG
  485. int PASS(SAVDATP_AFTER_CMD),if M_SAV_DAT_P
  486. int PASS(RESTORE_POINTER),if M_REST_P
  487. jump REL(disc2),if M_DISC
  488. int PASS(BAD_MSG_AFTER_CMD)
  489. extMsg2:
  490. clear ACK
  491. move from PASS(EXTMSGINCOUNT),when MSG_IN
  492. int PASS(EXTMSG_AFTER_CMD)
  493. disc2:
  494. clear ACK
  495. wait DISCONNECT
  496. int PASS(DISC_AFTER_CMD)
  497. ;/* SAME AS MSG1 but after data phase */
  498. PROC msg3:
  499. move PHASE_MSGIN to SCRATCH0
  500. move from PASS(MSGINCOUNT) ,when MSG_IN
  501. jump REL(extMsg3),if M_EXT_MSG
  502. int PASS(SAVDATP_AFTER_DATA),if M_SAV_DAT_P
  503. int PASS(RESTORE_POINTER),if M_REST_P
  504. jump REL(disc3),if M_DISC
  505. int PASS(BAD_MSG_AFTER_DATA) 
  506. extMsg3:
  507. clear ACK
  508. move from PASS(EXTMSGINCOUNT),when MSG_IN
  509. int PASS(EXTMSG_AFTER_DATA) 
  510. disc3:
  511. clear ACK
  512. wait DISCONNECT
  513. int PASS(DISC_AFTER_DATA)
  514. ;/* int cpu to signal an initator selection as a target */
  515. PROC selectAddr:
  516. int PASS(SELECT_AS_TARGET)
  517. ;/* restart entry point to accept a message before/after cmd phase */
  518. PROC ackMsg1:
  519. ; /* Accept any msg ,usual restart entry point after an extended msg in */
  520. clear ACK
  521. jump PASS((UINT)msg1),when MSG_IN
  522. jump PASS ((UINT) asortPh)
  523. ;/* restart entry point to accept a message after/during  data phase */
  524. PROC ackMsg3:
  525. ; /* Accept any msg ,usual restart entry point after an msg in after data in/out */
  526. clear ACK
  527. jump PASS((UINT)msg3),when MSG_IN
  528. jump PASS ((UINT) checkPhData)
  529. ;/* usual restart entry after a phase mismatch during data tranfert or
  530. ; * a save data pointer after a data phase */
  531. PROC checkPhData:
  532. jump PASS((UINT)inputData),when DATA_IN
  533. jump PASS((UINT)outputData),if DATA_OUT
  534. jump PASS((UINT)msgOut3),if MSG_OUT
  535. jump PASS((UINT)endTransact),if STATUS
  536. jump PASS((UINT) contTransact),if CMD
  537. jump PASS((UINT)msg3),if MSG_IN
  538. jump PASS((UINT)reserOutPh),if RES4
  539. jump PASS((UINT)reserInPh),if RES5
  540. int PASS(PH_UNKNOWN)
  541. ; /* renegotiate for a message out ,restart point if any
  542. ;    message out to send */
  543. PROC ackAtnMsg:
  544. set ATN
  545. clear ACK
  546. move PHASE_MSGOUT to SCRATCH0
  547. move from PASS(MSGOUTCOUNT) ,when MSG_OUT
  548. jump PASS((UINT) asortPh) when not MSG_OUT
  549. int PASS(PH_UNKNOWN)
  550. PROC asortPh:
  551. ; /* restart to try to fisnish properly the transaction */
  552. clear ATN
  553. jump PASS((UINT)inputData),when DATA_IN
  554. jump PASS((UINT)outputData),if DATA_OUT
  555. jump PASS((UINT)msgOut1),if MSG_OUT
  556. jump PASS((UINT)endTransact),if STATUS
  557. jump PASS((UINT) contTransact),if CMD
  558. jump PASS((UINT)msg1),if MSG_IN
  559. jump PASS((UINT)reserOutPh),if RES4
  560. jump PASS((UINT)reserInPh),if RES5
  561. int PASS(PH_UNKNOWN)
  562. ;/* reserved phase detected on scsi */
  563. PROC reserOutPh:
  564. move PHASE_UNDEF1 to SCRATCH0
  565. int PASS(RES_OUT_DETECTED)
  566. ;/* reserved phase detected on scsi */
  567. PROC reserInPh:
  568. move PHASE_UNDEF2 to SCRATCH0
  569. int PASS(RES_IN_DETECTED)
  570. ;/******************************************************************************
  571. ;* Entry point use when you decide to send a clear 
  572. ;* or an abort message to the target 
  573. ;* This is necessary because some target accept 
  574. ;* only a pair of sync Message.You can't negotiate 
  575. ;* again if the scsi controller can't fit the sync
  576. ;* target values returned.
  577. ;* Like the agreement is implicit the only way to 
  578. ;* clear the sync value in the target is to send a 
  579. ;* reset bus device message;
  580. ;*/
  581. PROC endAbort:
  582. set ATN
  583. clear ACK
  584. move PHASE_MSGOUT to SCRATCH0
  585. move from PASS(MSGOUTCOUNT) ,when MSG_OUT
  586. wait DISCONNECT
  587. int PASS(ABORT_CLEAR_END)
  588. ;/* End of Script */