Table of Contents

DMKERM Source

References

Source Listing

DMKERM.ASSEMBLE.txt
  1. ERM TITLE 'DMKERM (CP) VM/370 - RELEASE 6' 00001000
  2. ISEQ 73,80 VALIDATE SEQUENCING OF SYSIN @V200020 00002000
  3. COPY OPTIONS 00003000
  4. COPY LOCAL 00004000
  5. *. 00005000
  6. * MODULE NAME - 00006000
  7. * 00007000
  8. * DMKERM - 00008000
  9. * 00009000
  10. * FUNCTION - 00010000
  11. * 00011000
  12. * TO LOCATE THE REQUESTED MESSAGE AND INSERT THE MODULE ID, 00012000
  13. * MESSAGE NUMBER, AND DATA IF ANY AND PRINT THE MESSAGE 00013000
  14. * 00014000
  15. * ATTRIBUTES - 00015000
  16. * 00016000
  17. * REENTRANT, PAGEABLE, CALLED VIA SVC 00017500
  18. * 00018000
  19. * ENTRY POINTS - 00019000
  20. * 00020000
  21. * DMKERMSG - 00021000
  22. * 00022000
  23. * ENTRY CONDITIONS - 00023000
  24. * 00024000
  25. * GPR0 = XXXXXXNN 00025000
  26. * 00026000
  27. * XXXXXX IS THE 3 CHARACTER MODULE NAME. 00027000
  28. * 00028000
  29. * NN IS THE LENGTH IN BYTES OF THE DATA TO BE INSERTED 00029000
  30. * INTO THE MESSAGE TEXT. 00030000
  31. * IF NN IS ZERO, THE DATA IS CONTAINED IN GPR1. 00031000
  32. * THE LENGTH OF THE DATA CANNOT EXCEED 00032000
  33. * 120 MINUS THE TEXT-LENGTH 00033000
  34. * 00034000
  35. * GPR1 = ADDRESS OF DATA OR CONTAINS THE DATA 00035000
  36. * 00036000
  37. * IF GPR1 IS ZERO, NO DATA IS BEING PASSED FOR 00037000
  38. * THE MESSAGE. 00038000
  39. * 00039000
  40. * IF GPR0-NN IS NON-ZERO, GPR1 CONTAINS THE ADDRESS 00040000
  41. * OF THE DATA TO BE INSERTED IN THE MESSAGE. 00041000
  42. * 00042000
  43. * IF GPR0-NN IS ZERO, THE CONTENTS OF GPR1 IS STORED 00043000
  44. * IN THE MESSAGE. 00044000
  45. * 00045000
  46. * SEE ALSO NOTES (BELOW). 00046000
  47. EJECT 00047000
  48. * ENTRY CONDITIONS (CONTINUED) - 00048000
  49. * 00049000
  50. * GPR2 = YYZZMMMM 00050000
  51. * 00051000
  52. * YY = X'80' AT EXIT RETURN TO CALLER, OTHERWISE ISSUE 00052000
  53. * SVC 16 AND RETURN TO CALLER'S CALLER 00053000
  54. * 00054000
  55. * YY = X'40' CALLER HAS AREA TO BE FRET'D (SEE GPR3) 00055000
  56. * 00056000
  57. * YY = X'20' OPERATOR PARM FIELD ON MESSAGE WRITE 00057000
  58. * 00058000
  59. * YY = X'10' ALARM PARM FIELD ON MESSAGE WRITE 00059000
  60. * 00060000
  61. * YY = X'08' DELETE ERRMSG PARM FIELD ON MESSAGE WRITE 00061000
  62. * 00062000
  63. * ZZ = ACTION CHARACTER - DEFAULT CHARACTER IS 'E' 00063000
  64. * 'I' = INFORMATION TYPE MESSAGE 00064000
  65. * 'A' = ACTION TYPE MESSAGE 00065000
  66. * 'R' = RESPONSE NEEDED BY OPERATOR 00066000
  67. * 'W' = WARNING TYPE MESSAGE 00067000
  68. * 'S' = SEVERE SYSTEM ERROR MESSAGE 00068000
  69. * 00069000
  70. * MMMM BINARY VALUE OF THE MESSAGE NUMBER 00070000
  71. * AND RETURN CODE 00071000
  72. * 00072000
  73. * GPR3 = IMMATERIAL, OR = LENGTH & ADDRESS OF AREA TO BE FRET'D 00073000
  74. * SEE GPR2 ABOVE; IF AN AREA IS TO BE FRET'D, 00074000
  75. * GPR3 MUST = NNAAAAAA, WHERE 00075000
  76. * NN = NUMBER OF DOUBLE WORDS, AND 00076000
  77. * AAAAAA = ADDRESS OF AREA TO BE FRET'D 00077000
  78. * 00078000
  79. * GPR11 ADDRESS OF USER'S VMBLOK 00079000
  80. * GPR12 ENTRY POINT ADDRESS 00080000
  81. * GPR13 ADDRESS OF STANDARD SAVE AREA 00081000
  82. * 00082000
  83. * EXIT CONDITIONS - 00083000
  84. * 00084000
  85. * NONE 00085000
  86. * 00086000
  87. * CALLS TO OTHER ROUTINES - 00087000
  88. * 00088000
  89. * DMKFREE - OBTAIN FREE STORAGE FOR MESSAGE 00089000
  90. * DMKFRET - RETURN FREE STORAGE IF REQUESTED BY CALLER 00090000
  91. * DMKQCNWT - WRITE MESSAGE TO USER (OR SYSTEM OPERATOR) 00091000
  92. * DMKCVTBD - TO CONVERT MESSAGE CODE FOR OUTPUT 00092000
  93. * 00093000
  94. * EXTERNAL REFERENCES - 00094000
  95. * 00095000
  96. * DMKSYSRM - TO REFERENCE REAL MACHINE SIZE 00096000
  97. * DMKEMA00 - CANNED MESSAGES 000 - 139 00097100
  98. * DMKEMB00 - CANNED MESSAGES 140 - 423 00097200
  99. * DMKEMC00 - CANNED MESSAGES 424 - 00097300
  100. * 00099000
  101. * TABLES / WORK AREAS 00100000
  102. * 00101000
  103. * NONE 00102000
  104. EJECT 00103000
  105. * REGISTER USAGE - 00104000
  106. * 00105000
  107. * GPR7 = MESSAGE TEXT ADDRESS 00106000
  108. * GPR8 = MESSAGE OUTPUT DATA ADDRESS 00107000
  109. * GPR11 = ADDRESS OF USERS VMBLOK 00108000
  110. * GPR12 = BASE ADDRESS 00109000
  111. * GPR13 = ADDRESS OF STANDARD SAVEAREA 00110000
  112. * 00111000
  113. * OTHER REGISTERS ARE USED FOR WORK REGISTERS 00112000
  114. * NOTES - 00113000
  115. * 00114000
  116. * IF MORE THAN ONE FIELD IN A MESSAGE TEXT IS TO BE 00115000
  117. * REPLACED BY CALLER-SUPPLIED DATA SPECIFIED BY GPR0/GPR1 00116000
  118. * AT INPUT, THE VARIOUS FIELDS MUST BE DELIMITED BY 00117000
  119. * BINARY ZEROES; EACH INDIVIDUAL FIELD CAN THUS HAVE BLANKS 00118000
  120. * IMBEDDED IF DESIRED; GPR0 IS THE COUNT OF THE TOTAL DATA 00119000
  121. * SUPPLIED BY THE CALLER, AND GPR1 THE BEGINNING ADDRESS. 00120000
  122. * 00121000
  123. * (THIS MAKES IT POSSIBLE FOR A USER-SUPPLIED FIELD 00122000
  124. * TO BE A DIFFERING NUMBER OF ENGLISH WORDS, FOR EXAMPLE 00123000
  125. * 'USERID' OR 'NNN USERS' OR THE LIKE.) 00124000
  126. * 00125000
  127. * EXAMPLE OF A CALL 00126000
  128. * 00127000
  129. * LA R2,MSGNUMBER 00128000
  130. * LA R0,DATALENGTH 00129000
  131. * LA R1,DATADDRESS 00130000
  132. * ICM R0,14,=C'MODULE ID' 00131000
  133. * O R2,X'OPTIONS' 00132000
  134. * CALL DMKERMSG 00133000
  135. * 00134000
  136. * EXAMPLE OF AN ERROR MESSAGE 00135000
  137. * 00136000
  138. * DMKXXXMMMZ ERROR MESSAGE TEXT 00137000
  139. * 00138000
  140. * XXX MODULE ID OF THE REQUESTING MODULE 00139000
  141. * 00140000
  142. * MMM ERROR MESSAGE NUMBER AND RETURN CODE 00141000
  143. * 00142000
  144. * Z ACTION CHARACTER 00143000
  145. EJECT 00144000
  146. * OPERATION - 00145000
  147. * 00146000
  148. * 1. PAGE IN THE APPROPRIATE ERROR MESSAGE TEXT MODULE. 00147000
  149. * LOCATE THE REQUESTED MESSAGE TEXT AND INSERT PROGRAM ID, 00148000
  150. * MODULE ID, MESSAGE NUMBER AND DATA IF ANY. 00149000
  151. * 00150000
  152. * 2. PRINT THE MESSAGE WITH THE OPTION SPECIFIED IN GPR2. 00151000
  153. * 00152000
  154. * 3. RETURN TO THE CALLER OR CALLER'S CALLER AS REQUESTED 00153000
  155. * 00154000
  156. * 4. IF NO MESSAGE TEXT IS FOUND THE PROGRAM ID , MODULE ID AND 00155000
  157. * MESSAGE NUMBER WILL BE PRINTED, WITH ANY MESSAGE SUPPLIED 00156000
  158. * BY THE CALLER ADDED "AS IS". 00157000
  159. * 00158000
  160. * 5. IF NO DATA IS PASSED BY THE CALLER FOR A MESSAGE TEXT 00159000
  161. * WITH A $ SIGN, THE $ SIGN WILL BE CHANGED TO A 00160000
  162. * BLANK. 00161000
  163. * 00162000
  164. * RESPONSES - NONE 00163000
  165. * 00164000
  166. * ERROR MESSAGES - ALL OF THEM 00165000
  167. *. 00166000
  168. SPACE 2 00167000
  169. DMKERM START 00168000
  170. SPACE 00169000
  171. DC CL8'DMKERM ' MODULE NAME @VA04779 00169300
  172. SPACE 2 00169600
  173. EXTRN DMKSYSRM,DMKCVTBD @V2B2638 00171000
  174. EXTRN DMKEMA00,DMKEMB00,DMKEMC00 @V5088AB 00172100
  175. SPACE 2 00173000
  176. USING PSA,R0 00174000
  177. USING BUFFER,R9 00175000
  178. USING VMBLOK,R11 00176000
  179. USING SAVEAREA,R13 00177000
  180. SPACE 2 00178000
  181. DMKERMSG RELOC , EDIT, TYPE SYSTEM ERROR MSG @VA04779 00181400
  182. SPACE 00182000
  183. SLR R3,R3 CLEAR COUNT OF USER DATA (TENTATIVELY) 00183000
  184. LTR R4,R1 GET DATA ADDRESS OR DATA 00184000
  185. BZ GETMBUF IF NOTHING THERE LEAVE R3 = 0 00185000
  186. IC R3,SAVER0+3 R1 NOT ZERO, GET CALLER'S DATA COUNT 00186000
  187. GETMBUF EQU * 00187000
  188. SPACE 00188000
  189. LA R0,BUFSIZE LENGTH FOR BUFFER 00189000
  190. CALL DMKFREE GET STORAGE FOR OUTPUT BUFFER 00190000
  191. LR R9,R1 BASE FOR BUFFER 00191000
  192. SPACE 00192000
  193. MVC BUFFER+8(8),BLANKS CLEAR BUFFER TO BLANKS 00193000
  194. MVC BUFFER+16(BUFINLTH-16),BUFFER+8 ... @V200820 00194000
  195. MVC BUFFER(3),=C'DMK ' SET 1ST 3 CHARS TO 'DMK' @V200820 00195000
  196. MVC BUFFER+3(3),SAVER0 NEXT 3 CHARS TO CALLER'S MODULE ID 00196000
  197. L R1,XRIGHT16 ISOLATE THE MSG NUMBER 00197000
  198. NR R1,R2 . . . 00198000
  199. CALL DMKCVTBD CONVERT IT FOR PRINTING 00199000
  200. STCM R1,B'0111',BUFFER+6 PUT IT IN THE OUTPUT LINE 00200000
  201. MVI BUFFER+9,C'E' SET DEFAULT ACTION CHARACTER 00201000
  202. CLI SAVER2+1,X'00' CALLER SUPPLIED ACTION CHARACTER ?? 00202000
  203. BE INITREGS NO - USE DEFAULT 00203000
  204. MVC BUFFER+9(1),SAVER2+1 MOVE IN CALLER'S ACTION CODE 00204000
  205. SPACE 00205000
  206. INITREGS EQU * BRING IN THE ERROR MESSAGE MODULE@V200820 00206000
  207. N R2,XRIGHT16 ISOLATE THE MESSAGE NUMBER @V2B2638 00207000
  208. L R1,=A(DMKEMA00) ADDRESS OF FIRST MSG MOD @V2B2638 00208000
  209. C R2,=F'139' IS THE MESSAGE IN THERE ? @VA15526 00209160
  210. BNH TRANS YES, GO TRANS IT IN. @V2B2638 00210000
  211. L R1,=A(DMKEMB00) ADDRESS OF THE NEXT MSG MOD @V2B2638 00211000
  212. C R2,=F'423' IS THE MESSAGE IN THERE? @V5088AB 00211100
  213. BNH TRANS YES, GO TRANS IT IN @V5088AB 00211200
  214. L R1,=A(DMKEMC00) ADDRESS OF NEXT MSG MODULE @V5088AB 00211300
  215. TRANS EQU * BRING IN THE PROPER MODULE @V2B2638 00212000
  216. TRANS 2,1,OPT=(BRING,DEFER,SYSTEM) GET IT IN CORE @V200820 00213000
  217. LR R7,R2 START OF THE MESSAGE LIST TO GR7 @V200820 00214000
  218. LH R2,SAVER2+2 MESSAGE NUMBER INTO GR2 @V200820 00215000
  219. LA R8,BUFFER+11 AND R8 POINTS TO WHERE TO PUT MSG 00216000
  220. CLI SAVER0+3,X'00' LENGTH ARGUMENT PRESENT 00217000
  221. BE MSGLOOP NO - NO NEED TO TEST ADDRESS 00218000
  222. L R6,=A(DMKSYSRM) ADDRESS OF WORD CONTAINING 00219000
  223. CLC SAVER1(4),0(R6) TOP OF STORAGE ADDRESS 00220000
  224. BNL ADDRBAD IF NO GOOD, DON'T BLOW THE SYSTEM. 00221000
  225. SPACE 00222000
  226. MSGLOOP SR R6,R6 00223000
  227. IC R6,0(,R7) GET DISPLACEMENT TO NEXT MESSAGE 00224000
  228. LTR R6,R6 IS THIS THE END OF THE MSG LIST 00225000
  229. BZ NOTINLST IF YES, USE WHATEVER CALLER GAVE INSTEAD 00226000
  230. LA R5,123 MAX LENGTH OF MESSAGE 00227000
  231. SR R5,R6 SUBTRACT TEXT LENGTH 00228000
  232. ST R5,BUFCNT STORE MAX INPUT DATA ALLOWED 00229000
  233. AR R6,R7 ADDRESS OF THE NEXT MSG TEXT 00230000
  234. LH R5,1(,R7) MESSAGE ID 00231000
  235. CR R2,R5 IS THIS THE RIGHT MESSAGE 00232000
  236. BE EQUAL YES - PROCESS 00233000
  237. LR R7,R6 UPDATE MSG REG 00234000
  238. B MSGLOOP 00235000
  239. SPACE 00236000
  240. EQUAL LA R10,3(,R7) ADDRESS OF MSG TEXT 00237000
  241. LR R15,R10 LOAD WORK REGISTER 00238000
  242. SR R14,R14 ZERO COUNT WORK REGISTER 00239000
  243. LA R0,1 R0 = 1 (FOR GENERAL USE) 00240000
  244. SPACE 00241000
  245. LOOP$ CLI 0(R15),C'$' IS THIS A $ SIGN ?? 00242000
  246. BE FOUND$ YES - 00243000
  247. AR R14,R0 UPDATE COUNT 00244000
  248. AR R15,R0 UPDATE SCAN ADDRESS 00245000
  249. LOOPCHEK CR R15,R6 END OF THIS MSG TEXT ?? 00246000
  250. BL LOOP$ NO - KEEP LOOKING 00247000
  251. * 00248000
  252. LTR R14,R14 MOVE COUNT ZERO ?? 00249000
  253. BZ LAST$ YES - $ MUST BE LAST CHARACTER 00250000
  254. BCTR R14,0 -1 FOR MOVE 00251000
  255. EX R14,MVCDATA MOVE TEXT UP TO $ TO OUTPUT 00252000
  256. AR R14,R0 CORRECT COUNT 00253000
  257. LAST$ AR R0,R14 COUNT PLUS ONE 00254000
  258. AR R0,R8 POINT TO END OF MESSAGE PLUS ONE 00255000
  259. SR R0,R9 GET LENGTH OF MESSAGE 00256000
  260. B MSGFIN GO PRINT MSG 00257000
  261. SPACE 00258000
  262. FOUND$ LTR R14,R14 COUNT ZERO ?? 00259000
  263. BZ ZERO YES - 00260000
  264. BCTR R14,0 -1 FOR MOVE 00261000
  265. EX R14,MVCDATA MOVE TEXT UP TO $ TO OUTPUT 00262000
  266. A R14,F2 CORRECT COUNT 00263000
  267. ZERO AR R15,R0 UPDATE SEARCH ADDRESS 00264000
  268. LR R10,R15 UPDATE MOVE ADDRESS 00265000
  269. AR R8,R14 UPDATE OUTPUT ADDRESS TO ONE BLANK 00266000
  270. * PAST THE LAST OUTPUT DATA 00267000
  271. SR R14,R14 R14=0 FOR RESUMING SCAN OF TEXT 00268000
  272. LTR R3,R3 INPUT COUNT ZERO ?? 00269000
  273. BNP NOCNT YES - DATA IN REGISTER 4 00270000
  274. C R3,BUFCNT COUNT LARGER THAN ALLOWED ?? 00271000
  275. BNH *+8 NO -- VALID COUNT 00272000
  276. L R3,BUFCNT COUNT TOO HIGH USE MAX 00273000
  277. * SCAN FOR FIRST NON-BINARY-ZERO CHARACTER: 00274000
  278. SCNZER1 CLI 0(R4),X'00' BINARY ZERO THERE ? 00275000
  279. BNE SCNZER2 NOPE - WE'RE ALL SET. 00276000
  280. ALR R4,R0 ADVANCE TO NEXT BYTE OF USER DATA 00277000
  281. BCT R3,SCNZER1 KEEP CHECKING FOR NON-BINARY-ZERO CHAR. 00278000
  282. AR R8,R0 IF R3=0, UPDATE OUTPUT ADDRESS BY ONE 00279000
  283. B SCNZER5 GO CLEAR R4 AND FINISH UP. 00280000
  284. * 00281000
  285. * NON-BINARY-ZERO CHARACTER FOUND - SCAN TO END OF NON-ZERO-STRING: 00282000
  286. SCNZER2 LR R1,R4 R1 = ADDRESS OF BEGINNING OF STRING 00283000
  287. LR R2,R3 R2 = TOTAL REMAINING BYTE COUNT 00284000
  288. SCNZER3 CLI 0(R1),X'00' BINARY ZERO THERE ? 00285000
  289. BE SCNZER4 YES - WE'VE FOUND END OF STRING 00286000
  290. ALR R1,R0 BUMP TO NEXT ADDRESS 00287000
  291. BCT R2,SCNZER3 AND KEEP CHECKING 00288000
  292. * 00289000
  293. SCNZER4 SR R1,R4 COMPUTE NUMBER OF BYTES IN THE FIELD 00290000
  294. BCTR R1,0 LESS 1 FOR EX-MVC 00291000
  295. EX R1,MVCARG MOVE USER DATA TO OUTPUT AREA 00292000
  296. AR R1,R0 RESTORE R1 AGAIN 00293000
  297. LA R8,1(R8,R1) UPDATE OUTPUT ADDRESS 00294000
  298. AR R4,R1 NEW R4 FOR NEXT TIME 00295000
  299. SR R3,R1 AND NEW R3 FOR NEXT TIME 00296000
  300. BP LOOPCHEK IF R3 > 0, GO CHECK FOR COMPLETION. 00297000
  301. SCNZER5 SLR R4,R4 R4 & R3 = 0 MEANS NO USER DATA LEFT 00298000
  302. B LOOPCHEK GO CHECK FOR COMPLETION. 00299000
  303. SPACE 00300000
  304. NOCNT LR R3,R0 R3=1 TO UPDATE COUNT 00301000
  305. LTR R5,R4 ANY INPUT DATA ?? 00302000
  306. BZ COUNT NO - BLANK $ AND KEEP GOING 00303000
  307. SLR R4,R4 SIGNAL OUTPUT DATA USED UP FOR NEXT TIME 00304000
  308. LA R3,4 UPDATE COUNT 00305000
  309. STCM R5,7,0(R8) STORE R1 DATA IN OUTPUT AREA 00306000
  310. CLI SAVER1,C' ' HIGH ORDER BLANK ?? 00307000
  311. BE COUNT YES - THE 3 LOW-ORDER BYTES ARE ENUF 00308000
  312. ST R5,0(,R8) STORE FULL WORD INTO OUTPUT 00309000
  313. LA R3,5 DATA COUNT PLUS 1 BLANK 00310000
  314. COUNT AR R8,R3 UPDATE OUTPUT ADDRESS 00311000
  315. SLR R3,R3 SIGNAL NO DATA LEFT 00312000
  316. B LOOPCHEK AND GO CHECK FOR COMPLETION. 00313000
  317. SPACE 00314000
  318. ADDRBAD LA R0,12 BAD ADDRESS FROM CALLER, JUST SHOW MSG ID 00315000
  319. B MSGFIN2 ... 00316000
  320. * 00317000
  321. HLOWRLIM EQU ADDRBAD+2 LOWER LIMIT FOR BYTE COUNT FOR DMKQCNWT 00318000
  322. SPACE 00319000
  323. NOTINLST DS 0H MESSAGE NUMBER NOT FOUND IN THE LIST 00320000
  324. LA R2,255 00321000
  325. LM R0,R1,SAVER0 RESTORE CALLER'S R0-R1 00322000
  326. NR R2,R0 DID CALLER GIVE US A COUNT ? 00323000
  327. BNZ MVCALDAT IF YES - MOVE IN WHATEVER DATA HE GAVE US 00324000
  328. LA R0,15 NO - MAKE THE COUNT 15, 00325000
  329. MVC BUFFER+11(4),SAVER1 AND PUT IN THE CALLER'S R1 00326000
  330. B MSGFIN AND JUST USE THAT. 00327000
  331. * 00328000
  332. MVCALDAT BCTR R2,0 COUNT OF CALLER'S MESSAGE 00329000
  333. LA R10,0(,R1) AND THE ADDRESS 00330000
  334. LA R0,BUFINLTH-12 DON'T OVERFLOW OUR STORAGE 00331000
  335. CLR R2,R0 ... 00332000
  336. BNH *+6 WE'RE OK 00333000
  337. LR R2,R0 LIMIT MESSAGE IF CALLER GAVE HUGE NUMBER 00334000
  338. EX R2,MVCDATA MOVE CALLER'S MESSAGE 00335000
  339. LA R0,12(,R2) AND SET THE BYTE-COUNT 00336000
  340. * 00337000
  341. MSGFIN DS 0H CONSTRUCTION OF MESSAGE IS FINISHED: 00338000
  342. LR R15,R0 COMPUTE ADDRESS OF LAST BYTE OF MESSAGE 00339000
  343. AR R15,R9 ... 00340000
  344. MSGFIN1 BCTR R15,0 ... 00341000
  345. CLI 0(R15),C' ' TRAILING BLANK ? 00342000
  346. BNE MSGFIN2 NOPE - WE'RE ALL SET. 00343000
  347. BCTR R0,0 DELETE ONE FROM BYTE COUNT 00344000
  348. CH R0,HLOWRLIM IS BYTE-COUNT > LOWER LIMIT FOR DMKQCNWT? 00345000
  349. BH MSGFIN1 IF YES, CHECK FOR MORE TRAILING BLANKS 00346000
  350. MSGFIN2 TM SAVER2,X'40' DOES CALLER HAVE AN AREA TO BE FRET'D ? 00347000
  351. BZ PRTMSG NOPE - GO PRINT THE MESSAGE NOW. 00348000
  352. LR R3,R0 REMEMBER THE BYTE-COUNT, 00349000
  353. SLR R0,R0 00350000
  354. IC R0,SAVER3 NO. DOUBLE WORDS INTO R0, 00351000
  355. L R1,SAVER3 ADDRESS INTO R1 (HIGH-ORDER BYTE IS OK) 00352000
  356. CALL DMKFRET FRET WHATEVER THE CALLER WANTED US TO 00353000
  357. LR R0,R3 AND RESTORE R0 TO THE BYTE-COUNT 00354000
  358. PRTMSG LR R1,R9 MSG ADDRESS 00355000
  359. LA R3,BUFSIZE SIZE OF BUFFER 00356000
  360. LA R2,(NORET+DFRET) WE USE THESE PARAMETERS 00357000
  361. TM SAVER2,X'08' DELETE ERRMSG PARM FIELD ?? 00358000
  362. BO *+8 YES -- 00359000
  363. LA R2,ERRMSG(,R2) ADD - ERRMSG TO PARM FIELD 00360000
  364. TM SAVER2,X'20' OPERATOR FOR PARM FIELD ?? 00361000
  365. BZ *+8 NO - 00362000
  366. LA R2,OPERATOR(,R2) YES - ADD TO PARM FIELD 00363000
  367. TM SAVER2,X'10' ALARM FOR PARM FIELD ?? 00364000
  368. BZ *+8 NO - 00365000
  369. LA R2,ALARM(,R2) YES - ADD TO PARM FIELD 00366000
  370. SLR R4,R4 CLEAR FOR RETURN CODE @VM03144 00367000
  371. ICM R4,B'0011',SAVER2+2 PICK UP RETURN CODE @VM03144 00368000
  372. TM SAVER2,X'80' DOES CALLER WANT CONTROL BACK? @VM03144 00369000
  373. BO *+6 YES, SKIP 'SAVE AREA RELEASE' @VM03144 00370000
  374. SVC 16 DONE WITH THAT SAVE AREA @VM03144 00371000
  375. ST R4,SAVER2 SET RET CODE IN CALLERS R2 @VM03144 00372000
  376. CALL DMKQCNWT NOW SEND THE MSG ON ITS WAY @VM03144 00373000
  377. EXIT 00374000
  378. EJECT 00375000
  379. MVCDATA MVC 0(*-*,R8),0(R10) TO MOVE MESSAGE TEXT TO MESSAGE BUFFER 00376000
  380. MVCARG MVC 0(*-*,R8),0(R4) TO MOVE CALLER DATA TO MESSAGE BUFFER 00377000
  381. SPACE 2 00378000
  382. LTORG 00379000
  383. EJECT 00380000
  384. PSA 00381000
  385. COPY VMBLOK 00382000
  386. COPY SAVE 00383000
  387. COPY EQU 00384000
  388. COPY CONBUF 00385000
  389. END DMKERM 00386000