string.awl 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530
  1. DATA_BLOCK DB 100
  2. STRUCT
  3. VAR0 : STRING [254] := '';
  4. VAR1 : STRING [10] := 'test2';
  5. VAR2 : STRING [1] := 'i';
  6. FULLSTR0 : STRING; // Awlsim extension: No dimension = 254
  7. FULLSTR1 : STRING := 'abc'; // Awlsim extension: No dimension = 254
  8. ARRSTR0 : ARRAY [1 .. 2] OF STRING[3] := '01', '02';
  9. ARRSTR1 : ARRAY [1 .. 2] OF STRING [3];
  10. VAR3 : STRING [10];
  11. END_STRUCT;
  12. BEGIN
  13. VAR0 := 'test1';
  14. VAR1 := 'tt';
  15. ARRSTR1[1] := '11';
  16. ARRSTR1[2] := '12';
  17. END_DATA_BLOCK
  18. FUNCTION FC 1 : VOID
  19. VAR_INPUT
  20. FCS0 : STRING [254];
  21. FCS1 : STRING [1]; // Awlsim extension: size != 254
  22. FCS2 : STRING [10]; // Awlsim extension: size != 254
  23. FCSTR0 : STRING; // Awlsim extension: No dimension = 254
  24. FCSTR1 : STRING; // Awlsim extension: No dimension = 254
  25. END_VAR
  26. VAR_TEMP
  27. DBNR : INT;
  28. END_VAR
  29. BEGIN
  30. // Check access via DB-pointer.
  31. // Check #FCS0
  32. L P##FCS0
  33. LAR1
  34. UD DW#16#FF000000
  35. __ASSERT== __ACCU 1, DW#16#87000000
  36. L W [AR1, P#0.0]
  37. T #DBNR
  38. __ASSERT== __ACCU 1, 100
  39. AUF DB [#DBNR]
  40. L D [AR1, P#2.0]
  41. LAR1
  42. __ASSERT== __ACCU 1, P#DBX 0.0
  43. L W [AR1, P#0.0]
  44. __ASSERT== __ACCU 1, W#16#FE05
  45. L D [AR1, P#2.0]
  46. __ASSERT== __ACCU 1, 'test'
  47. L B [AR1, P#6.0]
  48. __ASSERT== __ACCU 1, '1'
  49. L B [AR1, P#7.0]
  50. __ASSERT== __ACCU 1, 0
  51. // Check #FCS1
  52. L P##FCS1
  53. LAR1
  54. UD DW#16#FF000000
  55. __ASSERT== __ACCU 1, DW#16#87000000
  56. L W [AR1, P#0.0]
  57. T #DBNR
  58. __ASSERT== __ACCU 1, 100
  59. AUF DB [#DBNR]
  60. L D [AR1, P#2.0]
  61. LAR1
  62. __ASSERT== __ACCU 1, P#DBX 268.0
  63. L W [AR1, P#0.0]
  64. __ASSERT== __ACCU 1, W#16#0101
  65. L B [AR1, P#2.0]
  66. __ASSERT== __ACCU 1, 'i'
  67. L B [AR1, P#3.0]
  68. __ASSERT== __ACCU 1, 0
  69. // Check #FCS2
  70. L P##FCS2
  71. LAR1
  72. UD DW#16#FF000000
  73. __ASSERT== __ACCU 1, DW#16#87000000
  74. L W [AR1, P#0.0]
  75. __ASSERT== __ACCU 1, 0
  76. L D [AR1, P#2.0]
  77. LAR1
  78. UD DW#16#FF000000
  79. __ASSERT== __ACCU 1, DW#16#87000000
  80. L W [AR1, P#0.0]
  81. __ASSERT== __ACCU 1, W#16#0A06
  82. L D [AR1, P#2.0]
  83. __ASSERT== __ACCU 1, 'aabb'
  84. L W [AR1, P#6.0]
  85. __ASSERT== __ACCU 1, 'cc'
  86. // Check #FCSTR0
  87. L P##FCSTR0
  88. LAR1
  89. UD DW#16#FF000000
  90. __ASSERT== __ACCU 1, DW#16#87000000
  91. L W [AR1, P#0.0]
  92. T #DBNR
  93. __ASSERT== __ACCU 1, 100
  94. AUF DB [#DBNR]
  95. L D [AR1, P#2.0]
  96. LAR1
  97. __ASSERT== __ACCU 1, P#DBX 272.0
  98. L W [AR1, P#0.0]
  99. __ASSERT== __ACCU 1, W#16#FE00
  100. L B [AR1, P#2.0]
  101. __ASSERT== __ACCU 1, 0
  102. // Check #FCSTR1
  103. L P##FCSTR1
  104. LAR1
  105. UD DW#16#FF000000
  106. __ASSERT== __ACCU 1, DW#16#87000000
  107. L W [AR1, P#0.0]
  108. T #DBNR
  109. __ASSERT== __ACCU 1, 100
  110. AUF DB [#DBNR]
  111. L D [AR1, P#2.0]
  112. LAR1
  113. __ASSERT== __ACCU 1, P#DBX 528.0
  114. L W [AR1, P#0.0]
  115. __ASSERT== __ACCU 1, W#16#FE03
  116. L B [AR1, P#2.0]
  117. __ASSERT== __ACCU 1, 'a'
  118. L B [AR1, P#3.0]
  119. __ASSERT== __ACCU 1, 'b'
  120. L B [AR1, P#4.0]
  121. __ASSERT== __ACCU 1, 'c'
  122. L B [AR1, P#5.0]
  123. __ASSERT== __ACCU 1, 0
  124. // Check direct access.
  125. // Check #FCS0
  126. L #FCS0[1]
  127. __ASSERT== __ACCU 1, 't'
  128. L #FCS0[2]
  129. __ASSERT== __ACCU 1, 'e'
  130. L #FCS0[3]
  131. __ASSERT== __ACCU 1, 's'
  132. L #FCS0[4]
  133. __ASSERT== __ACCU 1, 't'
  134. L #FCS0[5]
  135. __ASSERT== __ACCU 1, '1'
  136. L #FCS0[6]
  137. __ASSERT== __ACCU 1, 0
  138. // Check #FCS1
  139. L #FCS1[1]
  140. __ASSERT== __ACCU 1, 'i'
  141. // Check #FCS2
  142. L #FCS2[1]
  143. __ASSERT== __ACCU 1, 'a'
  144. L #FCS2[2]
  145. __ASSERT== __ACCU 1, 'a'
  146. L #FCS2[3]
  147. __ASSERT== __ACCU 1, 'b'
  148. L #FCS2[4]
  149. __ASSERT== __ACCU 1, 'b'
  150. L #FCS2[5]
  151. __ASSERT== __ACCU 1, 'c'
  152. L #FCS2[6]
  153. __ASSERT== __ACCU 1, 'c'
  154. L #FCS2[7]
  155. __ASSERT== __ACCU 1, 0
  156. // Check #FCSTR0
  157. L #FCSTR0[1]
  158. __ASSERT== __ACCU 1, 0
  159. // Check #FCSTR1
  160. L #FCSTR1[1]
  161. __ASSERT== __ACCU 1, 'a'
  162. L #FCSTR1[2]
  163. __ASSERT== __ACCU 1, 'b'
  164. L #FCSTR1[3]
  165. __ASSERT== __ACCU 1, 'c'
  166. L #FCSTR1[4]
  167. __ASSERT== __ACCU 1, 0
  168. END_FUNCTION
  169. FUNCTION_BLOCK FB 1
  170. VAR_INPUT
  171. FBS0 : STRING [254] := 'xy';
  172. FBS1 : STRING [1] := 'z';
  173. FBS2 : STRING [10];
  174. FBSTR0 : STRING; // Awlsim extension: No dimension = 254
  175. FBSTR1 : STRING; // Awlsim extension: No dimension = 254
  176. END_VAR
  177. VAR_TEMP
  178. DBNR : INT;
  179. END_VAR
  180. BEGIN
  181. // Check access via pointer.
  182. // Check #FBS0
  183. L P##FBS0
  184. LAR1
  185. __ASSERT== __ACCU 1, P#DIX 0.0
  186. L W [AR1, P#0.0]
  187. __ASSERT== __ACCU 1, W#16#FE05
  188. L D [AR1, P#2.0]
  189. __ASSERT== __ACCU 1, 'test'
  190. L B [AR1, P#6.0]
  191. __ASSERT== __ACCU 1, '1'
  192. L B [AR1, P#7.0]
  193. __ASSERT== __ACCU 1, 0
  194. // Check #FBS1
  195. L P##FBS1
  196. LAR1
  197. __ASSERT== __ACCU 1, P#DIX 256.0
  198. L W [AR1, P#0.0]
  199. __ASSERT== __ACCU 1, W#16#0101
  200. L B [AR1, P#2.0]
  201. __ASSERT== __ACCU 1, 'i'
  202. L B [AR1, P#3.0]
  203. __ASSERT== __ACCU 1, 0
  204. // Check #FBS2
  205. L P##FBS2
  206. LAR1
  207. __ASSERT== __ACCU 1, P#DIX 260.0
  208. L W [AR1, P#0.0]
  209. __ASSERT== __ACCU 1, W#16#0A06
  210. L D [AR1, P#2.0]
  211. __ASSERT== __ACCU 1, 'aabb'
  212. L W [AR1, P#6.0]
  213. __ASSERT== __ACCU 1, 'cc'
  214. // Check #FBSTR0
  215. L P##FBSTR0
  216. LAR1
  217. __ASSERT== __ACCU 1, P#DIX 272.0
  218. L W [AR1, P#0.0]
  219. __ASSERT== __ACCU 1, W#16#FE00
  220. L B [AR1, P#2.0]
  221. __ASSERT== __ACCU 1, 0
  222. // Check #FBSTR1
  223. L P##FBSTR1
  224. LAR1
  225. __ASSERT== __ACCU 1, P#DIX 528.0
  226. L W [AR1, P#0.0]
  227. __ASSERT== __ACCU 1, W#16#FE03
  228. L B [AR1, P#2.0]
  229. __ASSERT== __ACCU 1, 'a'
  230. L B [AR1, P#3.0]
  231. __ASSERT== __ACCU 1, 'b'
  232. L B [AR1, P#4.0]
  233. __ASSERT== __ACCU 1, 'c'
  234. L B [AR1, P#5.0]
  235. __ASSERT== __ACCU 1, 0
  236. // Check direct access.
  237. // Check #FBS0
  238. L #FBS0[1]
  239. __ASSERT== __ACCU 1, 't'
  240. L #FBS0[2]
  241. __ASSERT== __ACCU 1, 'e'
  242. L #FBS0[3]
  243. __ASSERT== __ACCU 1, 's'
  244. L #FBS0[4]
  245. __ASSERT== __ACCU 1, 't'
  246. L #FBS0[5]
  247. __ASSERT== __ACCU 1, '1'
  248. L #FBS0[6]
  249. __ASSERT== __ACCU 1, 0
  250. // Check #FBS1
  251. L #FBS1[1]
  252. __ASSERT== __ACCU 1, 'i'
  253. // Check #FBS2
  254. L #FBS2[1]
  255. __ASSERT== __ACCU 1, 'a'
  256. L #FBS2[2]
  257. __ASSERT== __ACCU 1, 'a'
  258. L #FBS2[3]
  259. __ASSERT== __ACCU 1, 'b'
  260. L #FBS2[4]
  261. __ASSERT== __ACCU 1, 'b'
  262. L #FBS2[5]
  263. __ASSERT== __ACCU 1, 'c'
  264. L #FBS2[6]
  265. __ASSERT== __ACCU 1, 'c'
  266. L #FBS2[7]
  267. __ASSERT== __ACCU 1, 0
  268. // Check #FBSTR0
  269. L #FBSTR0[1]
  270. __ASSERT== __ACCU 1, 0
  271. // Check #FBSTR1
  272. L #FBSTR1[1]
  273. __ASSERT== __ACCU 1, 'a'
  274. L #FBSTR1[2]
  275. __ASSERT== __ACCU 1, 'b'
  276. L #FBSTR1[3]
  277. __ASSERT== __ACCU 1, 'c'
  278. L #FBSTR1[4]
  279. __ASSERT== __ACCU 1, 0
  280. END_FUNCTION_BLOCK
  281. DATA_BLOCK DB 1
  282. FB 1
  283. BEGIN
  284. END_DATA_BLOCK
  285. FUNCTION FC 2 : STRING
  286. VAR_INPUT
  287. FCINSTR : STRING;
  288. END_VAR
  289. BEGIN
  290. // Copy #FCINSTR to #RET_VAL
  291. L #FCINSTR[1]
  292. T #RET_VAL[1]
  293. L #FCINSTR[2]
  294. T #RET_VAL[2]
  295. L #FCINSTR[3]
  296. T #RET_VAL[3]
  297. L #FCINSTR[4]
  298. T #RET_VAL[4]
  299. L #FCINSTR[5]
  300. T #RET_VAL[5]
  301. L #FCINSTR[6]
  302. T #RET_VAL[6]
  303. L #FCINSTR[7]
  304. T #RET_VAL[7]
  305. L #FCINSTR[8]
  306. T #RET_VAL[8]
  307. L #FCINSTR[9]
  308. T #RET_VAL[9]
  309. L #FCINSTR[10]
  310. T #RET_VAL[10]
  311. END_FUNCTION
  312. ORGANIZATION_BLOCK OB 1
  313. BEGIN
  314. // Check short string immediates in L-instruction.
  315. L 'abcd'
  316. __ASSERT== __ACCU 1, DW#16#61626364
  317. L 'abc'
  318. __ASSERT== __ACCU 1, DW#16#00616263
  319. L 'ab'
  320. __ASSERT== __ACCU 1, DW#16#00006162
  321. L 'a'
  322. __ASSERT== __ACCU 1, DW#16#00000061
  323. L ''
  324. __ASSERT== __ACCU 1, DW#16#00000000
  325. // Check DB 100 initial values
  326. AUF DB 100
  327. // Check DB100.VAR0
  328. L DBW 0
  329. __ASSERT== __ACCU 1, W#16#FE05
  330. L DBD 2
  331. __ASSERT== __ACCU 1, 'test'
  332. L DBD 6
  333. __ASSERT== __ACCU 1, DW#16#31000000
  334. L DBW 10
  335. __ASSERT== __ACCU 1, 0
  336. LAR1 P#DBX 12.0
  337. VAR0: L D [AR1, P#0.0]
  338. __ASSERT== __ACCU 1, 0
  339. +AR1 P#4.0
  340. TAR1
  341. L P#DBX 256.0
  342. <>D
  343. SPB VAR0
  344. // Check DB100.VAR1
  345. L DBW 256
  346. __ASSERT== __ACCU 1, W#16#0A02
  347. L DBD 258
  348. __ASSERT== __ACCU 1, DW#16#74740000
  349. L DBD 262
  350. __ASSERT== __ACCU 1, 0
  351. L DBW 266
  352. __ASSERT== __ACCU 1, 0
  353. // Check DB100.VAR2
  354. L DBW 268
  355. __ASSERT== __ACCU 1, W#16#0101
  356. L DBB 270
  357. __ASSERT== __ACCU 1, 'i'
  358. L DBB 271
  359. __ASSERT== __ACCU 1, 0
  360. // Check DB100.FULLSTR0
  361. L DBW 272
  362. __ASSERT== __ACCU 1, W#16#FE00
  363. L DBW 274
  364. __ASSERT== __ACCU 1, 0
  365. LAR1 P#DBX 276.0
  366. STR0: L D [AR1, P#0.0]
  367. __ASSERT== __ACCU 1, 0
  368. +AR1 P#4.0
  369. TAR1
  370. L P#DBX 528.0
  371. <>D
  372. SPB STR0
  373. // Check DB100.FULLSTR1
  374. L DBW 528
  375. __ASSERT== __ACCU 1, W#16#FE03
  376. L DBD 530
  377. __ASSERT== __ACCU 1, DW#16#61626300
  378. L DBW 534
  379. __ASSERT== __ACCU 1, 0
  380. LAR1 P#DBX 536.0
  381. STR1: L D [AR1, P#0.0]
  382. __ASSERT== __ACCU 1, 0
  383. +AR1 P#4.0
  384. TAR1
  385. L P#DBX 784.0
  386. <>D
  387. SPB STR1
  388. // Check DB100.ARRSTR0[1]
  389. L DBW 784
  390. __ASSERT== __ACCU 1, W#16#0302
  391. L DBD 786
  392. __ASSERT== __ACCU 1, DW#16#30310000
  393. // Check DB100.ARRSTR0[2]
  394. L DBW 790
  395. __ASSERT== __ACCU 1, W#16#0302
  396. L DBD 792
  397. __ASSERT== __ACCU 1, DW#16#30320000
  398. // Check DB100.ARRSTR1[1]
  399. L DBW 796
  400. __ASSERT== __ACCU 1, W#16#0302
  401. L DBD 798
  402. __ASSERT== __ACCU 1, DW#16#31310000
  403. // Check DB100.ARRSTR1[2]
  404. L DBW 802
  405. __ASSERT== __ACCU 1, W#16#0302
  406. L DBD 804
  407. __ASSERT== __ACCU 1, DW#16#31320000
  408. // Check DB100.VAR3
  409. L DBW 808
  410. __ASSERT== __ACCU 1, W#16#0A00
  411. L DBD 810
  412. __ASSERT== __ACCU 1, 0
  413. L DBD 814
  414. __ASSERT== __ACCU 1, 0
  415. L DBW 818
  416. __ASSERT== __ACCU 1, 0
  417. // Check fully qualified symbolic access to DB 100
  418. // Check DB100.VAR0
  419. L DB100.VAR0[1]
  420. __ASSERT== __ACCU 1, 't'
  421. L DB100.VAR0[2]
  422. __ASSERT== __ACCU 1, 'e'
  423. L DB100.VAR0[3]
  424. __ASSERT== __ACCU 1, 's'
  425. L DB100.VAR0[4]
  426. __ASSERT== __ACCU 1, 't'
  427. L DB100.VAR0[5]
  428. __ASSERT== __ACCU 1, '1'
  429. L DB100.VAR0[6]
  430. __ASSERT== __ACCU 1, 0
  431. // Check DB100.VAR1
  432. L DB100.VAR1[1]
  433. __ASSERT== __ACCU 1, 't'
  434. L DB100.VAR1[2]
  435. __ASSERT== __ACCU 1, 't'
  436. L DB100.VAR1[3]
  437. __ASSERT== __ACCU 1, 0
  438. // Check DB100.VAR2
  439. L DB100.VAR2[1]
  440. __ASSERT== __ACCU 1, 'i'
  441. // Check DB100.FULLSTR0
  442. L DB100.FULLSTR0[1]
  443. __ASSERT== __ACCU 1, 0
  444. // Check DB100.FULLSTR1
  445. L DB100.FULLSTR1[1]
  446. __ASSERT== __ACCU 1, 'a'
  447. L DB100.FULLSTR1[2]
  448. __ASSERT== __ACCU 1, 'b'
  449. L DB100.FULLSTR1[3]
  450. __ASSERT== __ACCU 1, 'c'
  451. L DB100.FULLSTR1[4]
  452. __ASSERT== __ACCU 1, 0
  453. // Check DB100.VAR3
  454. L DB100.VAR3[1]
  455. __ASSERT== __ACCU 1, 0
  456. // Check string parameter passing
  457. CALL FC 1 (
  458. FCS0 := DB100.VAR0,
  459. FCS1 := DB100.VAR2,
  460. FCS2 := 'aabbcc', // Extension: param string immediate
  461. FCSTR0 := DB100.FULLSTR0,
  462. FCSTR1 := DB100.FULLSTR1,
  463. )
  464. CALL FB 1, DB 1 (
  465. FBS0 := DB100.VAR0,
  466. FBS1 := DB100.VAR2,
  467. FBS2 := 'aabbcc', // Extension: param string immediate
  468. FBSTR0 := DB100.FULLSTR0,
  469. FBSTR1 := DB100.FULLSTR1,
  470. )
  471. // Check STRING as RET_VAL
  472. L DB100.VAR3[1]
  473. __ASSERT== __ACCU 1, 0
  474. L DB100.VAR3[2]
  475. __ASSERT== __ACCU 1, 0
  476. L DB100.VAR3[3]
  477. __ASSERT== __ACCU 1, 0
  478. CALL FC 2 (
  479. FCINSTR := DB100.VAR1,
  480. RET_VAL := DB100.VAR3,
  481. )
  482. L DB100.VAR3[1]
  483. __ASSERT== __ACCU 1, 't'
  484. L DB100.VAR3[2]
  485. __ASSERT== __ACCU 1, 't'
  486. L DB100.VAR3[3]
  487. __ASSERT== __ACCU 1, 0
  488. CALL SFC 46 // STOP CPU
  489. END_ORGANIZATION_BLOCK