insn_CALL.awl 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489
  1. DATA_BLOCK DB 1
  2. STRUCT
  3. Value : INT;
  4. VAR0 : INT;
  5. END_STRUCT;
  6. BEGIN
  7. Value := 8290;
  8. VAR0 := 0;
  9. END_DATA_BLOCK
  10. FUNCTION_BLOCK FB 1
  11. BEGIN
  12. __ASSERT== __AR 2, P#42.0 // Check AR2 magic
  13. L W#16#4321
  14. T MW 0
  15. END_FUNCTION_BLOCK
  16. FUNCTION FC 1 : VOID
  17. BEGIN
  18. __ASSERT== __AR 2, P#42.0 // Check AR2 magic
  19. L W#16#1234
  20. T MW 0
  21. CALL FC 2
  22. END_FUNCTION
  23. FUNCTION FC 2 : VOID
  24. BEGIN
  25. __ASSERT== __AR 2, P#42.0 // Check AR2 magic
  26. L W#16#6789
  27. T MW 0
  28. L 10
  29. T LB 0
  30. END_FUNCTION
  31. FUNCTION FC 3 : VOID
  32. BEGIN
  33. __ASSERT== __AR 2, P#42.0 // Check AR2 magic
  34. L 1
  35. T LB 0
  36. CALL FC 2
  37. __ASSERT== LB 0, 1
  38. END_FUNCTION
  39. FUNCTION FC 4 : VOID
  40. VAR_INPUT
  41. INPVAR : INT;
  42. INPVAR3 : BOOL;
  43. INPVAR4 : BOOL;
  44. END_VAR
  45. VAR_IN_OUT
  46. INOUT0 : INT;
  47. INOUT1 : INT;
  48. END_VAR
  49. BEGIN
  50. __ASSERT== __AR 2, P#42.0 // Check AR2 magic
  51. // Check interface
  52. L #INPVAR
  53. __ASSERT== __ACCU 1, 9976
  54. U #INPVAR3
  55. __ASSERT== __STW VKE, 0
  56. U #INPVAR4
  57. __ASSERT== __STW VKE, 1
  58. L #INOUT0
  59. __ASSERT== __ACCU 1, 84
  60. L #INOUT1
  61. __ASSERT== __ACCU 1, 984
  62. L 42
  63. T #INOUT0
  64. L 942
  65. T #INOUT1
  66. END_FUNCTION
  67. FUNCTION FC 5 : VOID
  68. VAR_INPUT
  69. INPVAR2 : INT;
  70. INPVAR3 : BOOL;
  71. INPVAR4 : BOOL;
  72. END_VAR
  73. VAR_IN_OUT
  74. INOUT0 : INT;
  75. INOUT1 : INT;
  76. END_VAR
  77. BEGIN
  78. __ASSERT== __AR 2, P#42.0 // Check AR2 magic
  79. // Check interface
  80. L #INOUT0
  81. __ASSERT== __ACCU 1, 84
  82. L #INOUT1
  83. __ASSERT== __ACCU 1, 984
  84. CALL FC 4 (
  85. INPVAR := #INPVAR2, // This is a parameter
  86. INPVAR3 := #INPVAR3,
  87. INPVAR4 := #INPVAR4,
  88. INOUT0 := #INOUT0,
  89. INOUT1 := #INOUT1,
  90. )
  91. L #INOUT0
  92. __ASSERT== __ACCU 1, 42
  93. L 168
  94. T #INOUT0
  95. L #INOUT1
  96. __ASSERT== __ACCU 1, 942
  97. L 9168
  98. T #INOUT1
  99. END_FUNCTION
  100. FUNCTION FC 6 : VOID
  101. BEGIN
  102. __ASSERT== __AR 2, P#42.0 // Check AR2 magic
  103. // Only check OV and OS bits
  104. __ASSERT== __STW OV, 1
  105. __ASSERT== __STW OS, 0
  106. L 1
  107. L 1
  108. +I
  109. __ASSERT== __STW OV, 0
  110. __ASSERT== __STW OS, 0
  111. END_FUNCTION
  112. FUNCTION FC 7 : VOID
  113. BEGIN
  114. __ASSERT== __AR 2, P#42.0 // Check AR2 magic
  115. // Trigger an overflow
  116. __ASSERT== __STW OV, 0
  117. __ASSERT== __STW OS, 0
  118. L 30000
  119. L 30000
  120. +I
  121. __ASSERT== __STW OV, 1
  122. __ASSERT== __STW OS, 1
  123. END_FUNCTION
  124. FUNCTION_BLOCK FB 10
  125. VAR_INPUT
  126. INVAR1 : BOOL;
  127. INVAR2 : BYTE;
  128. INVAR3 : WORD;
  129. INVAR4 : DWORD;
  130. INVAR5 : INT;
  131. INVAR6 : DINT;
  132. INVAR7 : REAL;
  133. INVAR8 : S5TIME;
  134. INVAR9 : TIME;
  135. INVAR10 : DATE;
  136. INVAR11 : CHAR;
  137. END_VAR
  138. VAR_OUTPUT
  139. RETURNVALUE : INT;
  140. END_VAR
  141. BEGIN
  142. // This FB is CALLed. Check multi instance base register addresse.
  143. __ASSERT== __AR 2, P#DBX 0.0
  144. // Check parameter values
  145. U #INVAR1
  146. __ASSERT== __STW VKE, 1
  147. L #INVAR2
  148. __ASSERT== __ACCU 1, B#16#12
  149. L #INVAR3
  150. __ASSERT== __ACCU 1, W#16#3456
  151. L #INVAR4
  152. __ASSERT== __ACCU 1, DW#16#88776655
  153. L #INVAR5
  154. __ASSERT== __ACCU 1, 8290
  155. L #INVAR6
  156. __ASSERT== __ACCU 1, L#999999
  157. L #INVAR7
  158. __ASSERT== __ACCU 1, 9.876
  159. L #INVAR8
  160. __ASSERT== __ACCU 1, S5T#9s
  161. L #INVAR9
  162. __ASSERT== __ACCU 1, T#9s
  163. L #INVAR10
  164. __ASSERT== __ACCU 1, 900
  165. L #INVAR11
  166. __ASSERT== __ACCU 1, 'c'
  167. CALL FC 10 (
  168. INPUTVAR1 := #INVAR1,
  169. INPUTVAR2 := #INVAR2,
  170. INPUTVAR3 := #INVAR3,
  171. INPUTVAR4 := #INVAR4,
  172. INPUTVAR5 := #INVAR5,
  173. INPUTVAR6 := #INVAR6,
  174. INPUTVAR7 := #INVAR7,
  175. INPUTVAR8 := #INVAR8,
  176. INPUTVAR9 := #INVAR9,
  177. INPUTVAR10 := #INVAR10,
  178. INPUTVAR11 := #INVAR11,
  179. INVAR_DB := DB1.DBW 0,
  180. RET_VAL := #RETURNVALUE,
  181. )
  182. // AR2 should still be the multi-instance base register, even if it
  183. // was clobbered in a called FC/FB.
  184. __ASSERT== __AR 2, P#DBX 0.0
  185. END_FUNCTION_BLOCK
  186. DATA_BLOCK DB 10
  187. FB 10
  188. BEGIN
  189. END_DATA_BLOCK
  190. FUNCTION FC 10 : INT
  191. VAR_INPUT
  192. INPUTVAR1 : BOOL;
  193. INPUTVAR2 : BYTE;
  194. INPUTVAR3 : WORD;
  195. INPUTVAR4 : DWORD;
  196. INPUTVAR5 : INT;
  197. INPUTVAR6 : DINT;
  198. INPUTVAR7 : REAL;
  199. INPUTVAR8 : S5TIME;
  200. INPUTVAR9 : TIME;
  201. INPUTVAR10 : DATE;
  202. INPUTVAR11 : CHAR;
  203. INVAR_DB : INT;
  204. END_VAR
  205. BEGIN
  206. // This FC is called from an FB. Thus it has the multi-instance base in AR2.
  207. __ASSERT== __AR 2, P#DBX 0.0
  208. // Check parameter values
  209. U #INPUTVAR1
  210. __ASSERT== __STW VKE, 1
  211. L #INPUTVAR2
  212. __ASSERT== __ACCU 1, B#16#12
  213. L #INPUTVAR3
  214. __ASSERT== __ACCU 1, W#16#3456
  215. L #INPUTVAR4
  216. __ASSERT== __ACCU 1, DW#16#88776655
  217. L #INPUTVAR5
  218. __ASSERT== __ACCU 1, 8290
  219. L #INPUTVAR6
  220. __ASSERT== __ACCU 1, L#999999
  221. L #INPUTVAR7
  222. __ASSERT== __ACCU 1, 9.876
  223. L #INPUTVAR8
  224. __ASSERT== __ACCU 1, S5T#9s
  225. L #INPUTVAR9
  226. __ASSERT== __ACCU 1, T#9s
  227. L #INPUTVAR10
  228. __ASSERT== __ACCU 1, 900
  229. L #INPUTVAR11
  230. __ASSERT== __ACCU 1, 'c'
  231. L #INVAR_DB
  232. __ASSERT== __ACCU 1, 8290
  233. // Check parameter pointers
  234. L P##INPUTVAR1
  235. UD DW#16#FFF80000
  236. __ASSERT== __ACCU 1, DW#16#87000000
  237. L P##INPUTVAR2
  238. UD DW#16#FFF80000
  239. __ASSERT== __ACCU 1, DW#16#87000000
  240. L P##INPUTVAR3
  241. UD DW#16#FFF80000
  242. __ASSERT== __ACCU 1, DW#16#87000000
  243. L P##INPUTVAR4
  244. UD DW#16#FFF80000
  245. __ASSERT== __ACCU 1, DW#16#87000000
  246. L P##INPUTVAR5
  247. UD DW#16#FFF80000
  248. __ASSERT== __ACCU 1, DW#16#87000000
  249. L P##INPUTVAR6
  250. UD DW#16#FFF80000
  251. __ASSERT== __ACCU 1, DW#16#87000000
  252. L P##INPUTVAR7
  253. UD DW#16#FFF80000
  254. __ASSERT== __ACCU 1, DW#16#87000000
  255. L P##INPUTVAR8
  256. UD DW#16#FFF80000
  257. __ASSERT== __ACCU 1, DW#16#87000000
  258. L P##INPUTVAR9
  259. UD DW#16#FFF80000
  260. __ASSERT== __ACCU 1, DW#16#87000000
  261. L P##INPUTVAR10
  262. UD DW#16#FFF80000
  263. __ASSERT== __ACCU 1, DW#16#87000000
  264. L P##INPUTVAR11
  265. UD DW#16#FFF80000
  266. __ASSERT== __ACCU 1, DW#16#87000000
  267. // Handle and check return value
  268. L 99
  269. T #RET_VAL
  270. L #RET_VAL
  271. __ASSERT== __ACCU 1, 99
  272. L P##RET_VAL
  273. UD DW#16#FFF80000
  274. __ASSERT== __ACCU 1, DW#16#87000000
  275. // And another nested call
  276. CALL FC 11 (
  277. IN1 := #INVAR_DB,
  278. )
  279. // Clobber the multi-instance base
  280. LAR2 P#84.0
  281. END_FUNCTION
  282. FUNCTION FC 11 : VOID
  283. VAR_INPUT
  284. IN1 : INT;
  285. END_VAR
  286. BEGIN
  287. // This FC is called from an FB via FC. Thus it has the multi-instance base in AR2.
  288. __ASSERT== __AR 2, P#DBX 0.0
  289. L #IN1
  290. __ASSERT== __ACCU 1, 8290
  291. END_FUNCTION
  292. ORGANIZATION_BLOCK OB 1
  293. BEGIN
  294. LAR2 P#42.0 // Magic AR2 value
  295. CALL FC 1
  296. __ASSERT== MW 0, W#16#6789
  297. L 0
  298. T MW 0
  299. __ASSERT== MW 0, 0
  300. UC FC 1
  301. __ASSERT== MW 0, W#16#6789
  302. L 0
  303. T MW 0
  304. __ASSERT== MW 0, 0
  305. SET
  306. CC FC 1
  307. __ASSERT== MW 0, W#16#6789
  308. L 0
  309. T MW 0
  310. __ASSERT== MW 0, 0
  311. CLR
  312. CC FC 1
  313. __ASSERT== MW 0, 0
  314. __ASSERT== __AR 2, P#42.0 // Check AR2 magic
  315. // Test localdata stack
  316. L 255
  317. T LB 0
  318. __ASSERT== LB 0, 255
  319. CALL FC 3
  320. __ASSERT== LB 0, 255
  321. __ASSERT== __AR 2, P#42.0 // Check AR2 magic
  322. // Test nested FC calls
  323. L 84
  324. T MW 42
  325. L 984
  326. T DB1.DBW 2
  327. CALL FC 5 (
  328. INPVAR2 := 9976,
  329. INPVAR3 := FALSE,
  330. INPVAR4 := TRUE,
  331. INOUT0 := MW 42,
  332. INOUT1 := DB1.DBW 2, // DB1.VAR0
  333. )
  334. L MW 42
  335. __ASSERT== __ACCU 1, 168
  336. L DB1.DBW 2
  337. __ASSERT== __ACCU 1, 9168
  338. __ASSERT== __AR 2, P#42.0 // Check AR2 magic
  339. // Test OV/OS bits over call boundaries
  340. __STWRST
  341. L 30000
  342. L 30000
  343. +I
  344. __ASSERT== __STW OV, 1
  345. __ASSERT== __STW OS, 1
  346. CALL FC 6
  347. __ASSERT== __STW OV, 0
  348. __ASSERT== __STW OS, 0
  349. __STWRST
  350. CALL FC 7
  351. __ASSERT== __STW OV, 1
  352. __ASSERT== __STW OS, 0
  353. __ASSERT== __AR 2, P#42.0 // Check AR2 magic
  354. // Test raw FB call
  355. L 0
  356. T MW 0
  357. CLR
  358. UC FB 1
  359. L MW 0
  360. __ASSERT== __ACCU 1, W#16#4321
  361. L 0
  362. T MW 0
  363. SET
  364. CC FB 1
  365. L MW 0
  366. __ASSERT== __ACCU 1, W#16#4321
  367. __ASSERT== __AR 2, P#42.0 // Check AR2 magic
  368. // Test indirect calls
  369. L 0
  370. T MW 0
  371. L 1
  372. T MW 50
  373. CLR
  374. UC FC [MW 50]
  375. L MW 0
  376. __ASSERT== __ACCU 1, W#16#6789
  377. L 0
  378. T MW 0
  379. SET
  380. CC FC [MW 50]
  381. L MW 0
  382. __ASSERT== __ACCU 1, W#16#6789
  383. L 0
  384. T MW 0
  385. CLR
  386. UC FB [MW 50]
  387. L MW 0
  388. __ASSERT== __ACCU 1, W#16#4321
  389. L 0
  390. T MW 0
  391. SET
  392. CC FB [MW 50]
  393. L MW 0
  394. __ASSERT== __ACCU 1, W#16#4321
  395. __ASSERT== __AR 2, P#42.0 // Check AR2 magic
  396. // Test parameter forwarding (FB->FC)
  397. L 900
  398. T MW 10
  399. CALL FB 10, DB 10 (
  400. INVAR1 := TRUE,
  401. INVAR2 := B#16#12,
  402. INVAR3 := W#16#3456,
  403. INVAR4 := DW#16#88776655,
  404. INVAR5 := DB1.DBW 0,
  405. INVAR6 := L#999999,
  406. INVAR7 := 9.876,
  407. INVAR8 := S5T#9s,
  408. INVAR9 := T#9s,
  409. INVAR10 := MW 10,
  410. INVAR11 := 'c',
  411. RETURNVALUE := MW 0,
  412. )
  413. L MW 0
  414. __ASSERT== __ACCU 1, 99
  415. __ASSERT== __AR 2, P#42.0 // Check AR2 magic
  416. CALL SFC 46 // STOP CPU
  417. END_ORGANIZATION_BLOCK