home *** CD-ROM | disk | FTP | other *** search
/ Columbia Kermit / kermit.zip / ibm370 / ik0mac.asm < prev    next >
Assembly Source File  |  2020-01-01  |  50KB  |  618 lines

  1. *COPY                                                 KW                00300000
  2.          MACRO                                                          00301000
  3. &LABEL   KW    &KW,&ADDR,&CODE,&MIN=1                          @SC91320 00302000
  4. .* Define a KW for the parser                                           00303000
  5. .*  &1: 'keyword' or GOTO (to define ptr to next keyword item) or nil   00304000
  6. .*  (to end a list), &2: address of handler (if &1 is a 'keyword') or   00305000
  7. .*  of next item (if &1 is GOTO) (A), &3: 1-letter code if     @SC91320 00306000
  8. .*  different from 1st letter of keyword,                      @SC91320 00306100
  9. .*  &MIN=length of min. abrv or 'DEFINE' to set up symbols     @SC91320 00306200
  10.          GBLC  &KVRSN,&KSYS                                    @SC89027 00306500
  11.          LCLA  &LEN                                                     00307000
  12.          LCLC  &KW1                                            @SC91320 00307100
  13.          AIF   ('&KVRSN' EQ '4.3' OR '&KSYS' EQ '').VOK        @SC90072 00307200
  14.    MNOTE 16,'* * * --> IK0MAC version number should be &KVRSN' @SC89027 00307400
  15. .VOK     ANOP                                                  @SC89027 00307600
  16.          AIF   ('&KW' NE '').KWDF                              @SC91320 00308000
  17. &LABEL   DC    X'FF'                                                    00309000
  18.          AGO   .DONE                                                    00310000
  19. .KWDF    AIF   ('&KW' NE 'DEFINE').KW                          @SC91320 00310100
  20. .* Offsets for fields in KW table.                             @SC91320 00310200
  21. KWLEN    EQU   0             Length-1 of name, or special code @SC91320 00310300
  22. KWADR    EQU   1             Address of handler (24 bits)      @SC91320 00310400
  23. KWMIN    EQU   4             Minimum recognizable length - 1   @SC91320 00310500
  24. KWCODE   EQU   5             One-letter code for keyword       @SC91320 00310600
  25. KWNAME   EQU   6             Start of name                     @SC91320 00310700
  26.          AGO   .DONE                                           @SC91320 00310800
  27. .KW      AIF   ('&KW' NE 'GOTO').KWN                                    00311000
  28. &LABEL   DC    AL1(254),AL3(&ADDR)                             @SC88168 00312000
  29.          MEXIT                                                          00313000
  30. .KWN     ANOP                                                           00314000
  31. &LEN     SETA  K'&KW-3                                                  00315000
  32. &KW1     SETC  '&KW'                                           @SC91320 00316000
  33. &KW1     SETC  '&KW1'(2,1)                                     @SC91320 00316100
  34.          AIF   ('&CODE' EQ '').GOTCODE                         @SC91320 00316200
  35. &KW1     SETC  '&CODE'(1,1)                                    @SC91320 00316300
  36. .GOTCODE ANOP                                                  @SC91320 00316400
  37. &LABEL   DC    AL1(&LEN.),AL3(&ADDR.),AL1(&MIN.-1),C'&KW1'     @SC91320 00316500
  38.          DC    C&KW                                            @SC91320 00316600
  39. .DONE    MEND                                                           00317000
  40. *COPY                                                 SCAN              00318000
  41.          MACRO                                                          00319000
  42. &LABEL   SCAN  &TABLE,&HELP,&NODISP                            @SC87320 00320000
  43. .* Parse input using a KW table. Setup already done via NTOKN or CTOKN. 00321000
  44. .* Dispatch to proper handler if found in table, else return.           00322000
  45. .*  &1: adr of relevant table (LA/R), &2: handler if '?' (LA),          00323000
  46. .*  &3: if 'NODISP', then dispatch to HELP handler with high byte of    00324000
  47. .*  R7 not 0 and (R1)-> KW entry (if found)                             00325000
  48. &LABEL   LREG  1,&TABLE                                        @SC86295 00326000
  49.          AIF   ('&NODISP' EQ '').CALL                          @SC87320 00327000
  50.          AIF   ('&NODISP' NE 'NODISP').ERR                     @SC87320 00328000
  51.          ICM   7,8,*                                           @SC87320 00329000
  52. .CALL    BAL   14,SCAN                                         @SC87320 00330000
  53.           B    &HELP                                           @SC86135 00331000
  54.          MEXIT                                                 @SC87320 00332000
  55. .ERR     MNOTE 2,'Invalid positional parameter &NODISP'        @SC87320 00333000
  56.          MEND                                                           00334000
  57. *COPY                                                 HELP              00335000
  58.          MACRO                                                          00336000
  59. &LABEL   HELP  &TABLE,&RETURN                                           00337000
  60. .* Display acceptable keywords, then branch                             00338000
  61. .*  &1: ptr to table (LA/R), &2: place to branch (LA)                   00339000
  62. &LABEL   LREG  1,&TABLE                                        @SC86295 00340000
  63.          BAL   14,HELPKW                                                00341000
  64.           B    &RETURN                                         @SC86135 00342000
  65.          MEND                                                           00343000
  66. *COPY                                                 INITSTR  @SC92300 00343060
  67.          MACRO                                                 @SC92300 00343120
  68. &LABEL   INITSTR &STRING,&LOC,®=15                          @SC92300 00343180
  69. .* Copy text string into buffer for editing,                   @SC92300 00343240
  70. .*  &1: 'text string', &2: (optional) initial value for R15,   @SC92300 00343300
  71. .*  ®: register to use for ptr (default 15)                 @SC92300 00343360
  72.          LCLA  &LEN                                            @SC92300 00343420
  73. &LEN     SETA  K'&STRING-2   Can't use apostrophes             @SC92300 00343480
  74. &LABEL   DS    0H                                              @SC92300 00343540
  75.          AIF   ('&LOC' EQ '').NOINIT                           @SC92300 00343600
  76.          LA    ®,&LOC                                       @SC92300 00343660
  77. .NOINIT  MVC   0(&LEN,®),=C&STRING                          @SC92300 00343720
  78.          LA    ®,&LEN.(,®)                               @SC92300 00343780
  79.          MEND                                                  @SC92300 00343840
  80. *COPY                                                 NTOKN             00344000
  81.          MACRO                                                          00345000
  82. &LABEL   NTOKN &H=,&N=                                                  00346000
  83. .* Pick next token, optionally test for ?                               00347000
  84. .*  &H= handler if '?' (LA), &N= handler if none (LA)                   00348000
  85. &LABEL   BAL   14,WSPTOK                                                00349000
  86.           B    &N                                              @SC86135 00350000
  87.          AIF   ('&H' EQ '').H                                           00351000
  88.          CLI   0(6),C'?'                                       @SC86115 00352000
  89.          BE    &H                                                       00353000
  90. .H       MEND                                                           00354000
  91. *COPY                                                 FTOKN             00355000
  92.          MACRO                                                          00356000
  93. &LABEL   FTOKN &H=,&N=                                                  00357000
  94. .* Find start of next token, optionally test for ?                      00358000
  95. .*  &H= handler if '?' (LA), &N= handler if none (LA)                   00359000
  96. &LABEL   BAL   9,WSP                                           @SC86295 00360000
  97.           B    &N                                              @SC86224 00361000
  98.          AIF   ('&H' EQ '').H                                  @SC86224 00362000
  99.          CLI   0(7),C'?'                                                00363000
  100.          BE    &H                                                       00364000
  101. .H       MEND                                                           00365000
  102. *COPY                                                 PTEXT             00366000
  103.          MACRO                                                          00367000
  104. &LABEL   PTEXT &TEXT,&LEN,&AREG=3,&LREG=4                               00368000
  105. .* Set up 2 registers to point to some text and contain the length      00369000
  106. .*  &1: 'text' (where text has no doubled ' or & characters)  OR        00370000
  107. .*  &1: text (LA/R), &2: length of text (LA/R),                         00371000
  108. .*  &AREG= reg for ptr, &LREG= reg for len                              00372000
  109.          LCLA  &TEXTL                                                   00373000
  110.          AIF   ('&TEXT'(1,1) EQ '''').TEXT                     @SC86355 00374000
  111. &LABEL   LREG  &AREG,&TEXT                                     @SC86295 00375000
  112.          AGO   .LEN                                            @SC86355 00376000
  113. .TEXT    ANOP                                                           00377000
  114. &TEXTL   SETA  K'&TEXT-2                                                00378000
  115. &LABEL   LA    &AREG,=C&TEXT                                            00379000
  116.          AIF   ('&LEN' NE '').LEN                              @SC86355 00380000
  117.          LA    &LREG,&TEXTL                                             00381000
  118.          MEXIT                                                          00382000
  119. .LEN     LREG  &LREG,&LEN                                      @SC86295 00383000
  120.          MEND                                                           00384000
  121. *COPY                                                 KCALL             00385000
  122.          MACRO                                                          00386000
  123. &LABEL   KCALL &NAME,&VALUE,&EXT,&E=                                    00387000
  124. .* Call a routine, fill R1 with a parm if any, and allow error branch   00388000
  125. .*  &1: routine name or (reg), &2: argument (LA/R) (opt),      @SC87275 00389000
  126. .*  &3: EXT if non-Kermit,                                     @SC87275 00390000
  127. .*  &E= branch if R15 NZ (LA) or (branch,cc) with cc=suffix of B instr  00391000
  128.          LCLC  &CC                                             @SC86135 00392000
  129. &CC      SETC  'NZ'          Default condition                 @SC86135 00393000
  130. &LABEL   LREG  1,&VALUE                                        @SC86295 00394000
  131.          AIF   ('&NAME'(1,1) EQ '(').REGDEST                   @SC90264 00394500
  132.          AIF   ('&EXT' NE 'EXT').INTRN                         @SC86295 00395000
  133.          L     15,=V(&NAME)                                    @SC86295 00396000
  134.          AGO   .BAL                                            @SC87012 00397000
  135. .REGDEST LREG  15,&NAME                                        @SC90264 00398000
  136.          AGO   .BAL                                            @SC87275 00400000
  137. .INTRN   L     15,=A(&NAME)                                    @SC90264 00401000
  138. .BAL     BALR  14,15                                           @SC87012 00402000
  139.          AIF   ('&E' EQ '').NOERR                                       00403000
  140.          AIF   ('&EXT' NE 'EXT').NOLT                          @SC87012 00404000
  141.          LTR   15,15                                           @SC87012 00405000
  142. .NOLT    AIF   (N'&E LT 2).NCC                                 @SC87012 00406000
  143. &CC      SETC  '&E(2)'                                         @SC86135 00407000
  144. .NCC      B&CC &E(1)                                           @SC86135 00408000
  145. .NOERR   MEND                                                           00409000
  146. *COPY                                                 ADCON             00410000
  147.          MACRO                                                          00411000
  148.          ADCON                                                          00412000
  149. .* Define address constants for subroutine calls, etc.  Takes a list.   00413000
  150.          LCLA  &N                                              @SC86295 00414000
  151. .LUP     AIF   (&N GE N'&SYSLIST).DUN                          @SC86295 00415000
  152. &N       SETA  &N+1                                            @SC86295 00416000
  153. A&SYSLIST(&N) DC A(&SYSLIST(&N))                               @SC87201 00417000
  154.          AGO   .LUP                                            @SC86295 00418000
  155. .DUN     MEND                                                           00419000
  156. *COPY                                                 LREG              00420000
  157.          MACRO                                                          00421000
  158. &LABEL   LREG  &R,&VAL                                         @SC86295 00422000
  159. .* Load register with parameter                                         00423000
  160. .*  &1: reg, &2: value (LA) or (reg) or omitted                         00424000
  161.          AIF   ('&VAL' EQ '').OKREG                            @SC86295 00425000
  162.          AIF   ('&VAL'(1,1) EQ '(').REG                        @SC86295 00426000
  163. &LABEL   LA    &R,&VAL                                         @SC86295 00427000
  164.          MEXIT                                                 @SC86295 00428000
  165. .REG     AIF   ('&VAL' EQ '(&R)').OKREG                        @SC86295 00429000
  166. &LABEL   LR    &R,&VAL(1)                                      @SC86295 00430000
  167.          MEXIT                                                 @SC86295 00431000
  168. .OKREG   AIF   ('&LABEL' EQ '').Z                              @SC86295 00432000
  169. &LABEL   DS    0H                                              @SC86295 00433000
  170. .Z       MEND                                                  @SC86295 00434000
  171. *COPY                                                 WEAKX    @SC91325 00434100
  172.          MACRO                                                 @SC91325 00434200
  173.          WEAKX &SYMBOL                                         @SC91325 00434300
  174. .* Test symbol for definition -- make WXTRN if undefined       @SC91325 00434400
  175. .*   This macro should be invoked late in the program          @SC91325 00434500
  176.          AIF   (T'&SYMBOL NE 'U').DONE                         @SC91325 00434600
  177.          WXTRN &SYMBOL                                         @SC91325 00434700
  178. .DONE    MEXIT                                                 @SC91325 00434800
  179.          MEND                                                  @SC91325 00434900
  180. *COPY                                                 OPENF             00435000
  181.          MACRO                                                          00436000
  182. &LABEL   OPENF &MODE,&NAME,&FDB,&FID,&E=                                00437000
  183. .* Open file for input or output or test existence                      00438000
  184. .*  &1: S|L|I|O|T|V,  &2: file name (LA/R), &3: pattern FDB (LA/R),     00439000
  185. .*  &4: file ticket (LA) (opt), &E= error branch (see KCALL)            00440000
  186.          LCLA  &CODE                                           @SC86295 00441000
  187.          AIF   ('&MODE' NE 'S').CKL                            @SC90037 00441700
  188. &CODE    SETA  11            Check size                        @SC90037 00441800
  189.          AGO   .MOK                                            @SC90037 00441900
  190. .CKL     AIF   ('&MODE' NE 'L').CKI                            @SC90037 00442000
  191. &CODE    SETA  22                                              @SC89073 00442200
  192.          AGO   .MOK                                            @SC89073 00442400
  193. .CKI     AIF   ('&MODE' NE 'I').CKO                            @SC89073 00442600
  194. &CODE    SETA  1                                               @SC86295 00443000
  195.          AGO   .MOK                                            @SC86295 00444000
  196. .CKO     AIF   ('&MODE' NE 'O').CKT                            @SC86295 00445000
  197. &CODE    SETA  2                                               @SC86295 00446000
  198.          AGO   .MOK                                            @SC86295 00447000
  199. .CKT     AIF   ('&MODE' NE 'T' AND '&MODE' NE 'V').ILLM        @SC91269 00448000
  200. &CODE    SETA  3                                               @SC86295 00449000
  201.          AIF   ('&FID' NE '').ILLF                             @SC86295 00450000
  202.          AIF   ('&MODE' EQ 'T').MOK                            @SC91269 00450300
  203. &CODE    SETA  24                                              @SC91269 00450600
  204. .MOK     ANOP  ,                                               @SC86295 00451000
  205. &LABEL   LA    0,&CODE                                         @SC86295 00452000
  206.          LREG  2,&NAME                                         @SC86295 00453000
  207.          AIF   ('&MODE' NE 'S').CALL                           @SC90037 00453200
  208.          LREG  6,&FID                                          @SC90037 00453400
  209. .CALL    ANOP                                                  @SC90037 00453600
  210.          KCALL DISKIO,&FDB,E=&E                                @SC86295 00454000
  211.          AIF   ('&FID' EQ '' OR '&MODE' EQ 'S').Z              @SC90037 00455000
  212.          ST    0,&FID                                          @SC86295 00456000
  213. .Z       MEXIT                                                 @SC86295 00457000
  214. .ILLM    MNOTE 2,'ILLEGAL MODE ''&MODE'''                               00458000
  215.          MEXIT                                                 @SC86295 00459000
  216. .ILLF    MNOTE 2,'FID NOT ALLOWED WITH MODE ''&MODE'''                  00460000
  217.          MEND                                                           00461000
  218. *COPY                                                 CLOSF             00462000
  219.          MACRO                                                          00463000
  220. &LABEL   CLOSF &FID,&E=                                                 00464000
  221. .* Call DSKIO to close a file and zero ticket.  NOP if already 0.       00465000
  222. .*  &1: file ticket (LA) (opt), &E= error branch (see KCALL)            00466000
  223. &LABEL   LA    0,4                                             @SC86295 00467000
  224. .CAL     KCALL DISKIO,&FID,E=&E                                @SC86295 00468000
  225.          MEND                                                           00469000
  226. *COPY                                                 ERRF              00470000
  227.          MACRO                                                          00471000
  228. &LABEL   ERRF                                                           00472000
  229. .* Call DISKIO to analyze an error code in R15 (no options)             00473000
  230. .* Assumes R1 -> FAB already, as if WRITF or READF just finished.       00473500
  231. .* Clobbers TMPDW                                                       00474000
  232. &LABEL   LA    0,12                                            @SC87338 00475000
  233.          CVD   15,TMPDW      Save error code                   @SC87338 00476000
  234.          KCALL DISKIO        Keep registers same               @SC87338 00477000
  235.          MEND                                                           00478000
  236. *COPY                                                 ERASF             00479000
  237.          MACRO                                                          00480000
  238. &LABEL   ERASF &NAME,&E=                                                00481000
  239. .* Call DISKIO to erase a file                                          00482000
  240. .*  &1: file name (LA/R), &E= error branch (see KCALL)                  00483000
  241. &LABEL   LA    0,14                                            @SC86295 00484000
  242.          KCALL DISKIO,&NAME,E=&E                               @SC86295 00485000
  243.          MEND                                                           00486000
  244. *COPY                                                 NXTFSET           00487000
  245.          MACRO                                                          00488000
  246. &LABEL   NXTFSET &NAME,&TYPE,&E=                                        00489000
  247. .* Call DISKIO to set up search for files                               00490000
  248. .*  &1: file name (LA/R), &2: CWD => checking validity for CWD,         00491000
  249. .*  END => closing file name search,                                    00492000
  250. .*  &E= error branch (see KCALL)                                        00493000
  251.          LCLA  &CODE                                           @SC86295 00494000
  252. &CODE    SETA  5             Ordinary setup                    @SC86295 00495000
  253.          AIF   ('&TYPE' EQ '').TOK                             @SC86295 00496000
  254. &CODE    SETA  7             End of search                     @SC86355 00497000
  255.          AIF   ('&TYPE' EQ 'END').TOK                          @SC86355 00498000
  256. &CODE    SETA  8             Check CWD string                  @SC86295 00499000
  257. .TOK     ANOP                                                           00500000
  258. &LABEL   LA    0,&CODE                                         @SC86295 00501000
  259.          KCALL DISKIO,&NAME,E=&E  Init for NXTFST call         @SC86295 00502000
  260.          MEND                                                           00503000
  261. *COPY                                                 NXTF              00504000
  262.          MACRO                                                          00505000
  263. &LABEL   NXTF  &E=                                                      00506000
  264. .* Call DISKIO to get next file name in FILNAM                          00507000
  265. .*  &E= error branch (see KCALL)                                        00508000
  266. &LABEL   LA    0,6                                             @SC86295 00509000
  267.          KCALL DISKIO,E=&E   Find next file                    @SC86295 00510000
  268.          MEND                                                           00511000
  269. *COPY                                                 RET               00512000
  270.          MACRO                                                          00513000
  271. &LABEL   RET   &TYPE                                                    00514000
  272. .* Generate return from subroutines.                                    00515000
  273. .*  &1: MAIN if return from Kermit main code                            00516000
  274.          AIF   ('&TYPE' EQ 'MAIN').RMAIN                       @SC86295 00517000
  275. &LABEL   B     RTRN                                            @SC86295 00518000
  276.          MEXIT                                                          00519000
  277. .RMAIN   ANOP                                                           00520000
  278. &LABEL   KMAIN RETURN        Back to system                    @SC89268 00523000
  279.          MEND                                                           00528000
  280. *COPY                                                 ENTER             00529000
  281.          MACRO                                                          00530000
  282. &LABEL   ENTER &TYPE                                           @SC86295 00531000
  283. .* Establish routine entry code                                         00532000
  284. .*  &1: ALT if 2ndary entry or MAIN if main program or AGAIN   @SC92180 00533000
  285. .*   if re-establishing context in named routine               @SC92180 00533500
  286.          GBLC  &RTN                                            @SC86295 00534000
  287.          AIF   ('&TYPE' EQ 'ALT').ALT                          @SC86141 00535000
  288. &RTN     SETC  '&LABEL'                                                 00536000
  289. &LABEL   CSECT                                                          00537000
  290.          USING &RTN.SV,13                                      @SC86295 00538000
  291.          USING &LABEL,KSUBBASE                                 @SC89268 00539000
  292.          AIF   ('&TYPE' EQ 'AGAIN').DONE                       @SC92180 00539200
  293.          AIF   ('&TYPE' EQ 'MAIN').MAIN                        @SC90264 00539500
  294.          SAVE  (14,12),,&LABEL                                 @SC86141 00540000
  295.          AGO   .ORD                                            @SC90264 00541000
  296. .MAIN    ANOP                                                  @SC90264 00542000
  297. &LABEL   KMAIN ENTER                                           @SC90264 00543000
  298.          AGO   .ORD                                            @SC86141 00555000
  299. .ALT     ENTRY &LABEL                                          @SC86141 00556000
  300.          USING &LABEL,15                                       @SC89215 00556500
  301. &LABEL   SAVE  (14,12),,*                                      @SC86141 00557000
  302.          L     15,=A(&RTN)   Start of main routine             @SC89215 00558000
  303.          DROP  15                                              @SC89215 00558500
  304. .ORD     LA    0,&RTN.LX                                       @SC86295 00559000
  305.          BAL   14,SUBENT                                       @SC86295 00560000
  306. .DONE    MEND                                                  @SC92180 00561000
  307. *COPY                                                 EXIT              00562000
  308.          MACRO                                                          00563000
  309.          EXIT                                                           00564000
  310. .* Assembler stuff for end of routine and end of local temporaries      00565000
  311.          GBLC  &RTN                                            @SC86295 00566000
  312.          DS    0D                                              @SC86295 00567000
  313. &RTN.LX  EQU   *-&RTN.SV                                       @SC86295 00568000
  314.          DROP  13,KSUBBASE                                     @SC89268 00569000
  315.          MEND                                                           00570000
  316. *COPY                                                 LOCALS            00571000
  317.          MACRO                                                          00572000
  318.          LOCALS                                                         00573000
  319. .* Define storage for save area.  Follow with temporaries               00574000
  320.          GBLC  &RTN                                            @SC86295 00575000
  321. .LT      LTORG                                                 @SC86141 00576000
  322. &RTN.SV  DSECT                                                 @SC86295 00577000
  323.          DS    18F                                             @SC86295 00578000
  324.          MEND                                                           00579000
  325. *COPY                                                 ASCSYM            00580000
  326.          MACRO                                                          00581000
  327.          ASCSYM &LIST                                                   00582000
  328. .* Define symbols (of form 'Ax') for ASCII upper-case & digits          00583000
  329.          LCLA  &I,&N                                                    00584000
  330.          LCLC  &C                                                       00585000
  331. &N       SETA  K'&LIST       Number of chars                            00586000
  332. &I       SETA  0                                                        00587000
  333. .LP      AIF   (&I GE &N).DONE                                          00588000
  334. &I       SETA  &I+1                                                     00589000
  335. &C       SETC  '&LIST'(&I,1)                                            00590000
  336.          AIF   ('&C' LT 'A').LP                                         00591000
  337.          AIF   ('&C' GT 'I').TRJR                                       00592000
  338. A&C      EQU   C'&C'-128                                                00593000
  339.          AGO   .LP                                                      00594000
  340. .TRJR    AIF   ('&C' GT 'R').TRSZ                                       00595000
  341. A&C      EQU   C'&C'-135                                                00596000
  342.          AGO   .LP                                                      00597000
  343. .TRSZ    AIF   ('&C' GT 'Z').TRNUM                                      00598000
  344. A&C      EQU   C'&C'-143                                                00599000
  345.          AGO   .LP                                                      00600000
  346. .TRNUM   AIF   ('&C' GT '9').LP                                         00601000
  347. A&C      EQU   C'&C'-192                                                00602000
  348.          AGO   .LP                                                      00603000
  349. .DONE    MEND                                                           00604000
  350. *COPY                                                 NOTQR             00605000
  351.          MACRO                                                          00606000
  352. &LABEL   NOTQR &BRANCH                                         @SC86120 00607000
  353. .* Test for an Ascii char range of 33-62 and 96-126                     00608000
  354. .*  &1: branch if out of range (LA)                                     00609000
  355. &LABEL   BAL   14,CHKQR                                        @SC86120 00610000
  356.           B    &BRANCH                                         @SC86120 00611000
  357.          MEND                                                           00612000
  358. *COPY                                                 UNCHR             00613000
  359.          MACRO                                                          00614000
  360. &LABEL   UNCHR ®,&DATA,&TO                                           00615000
  361. .* UnChr: Subtract an ASCII space.  Set cc=M if too small.              00616000
  362. .*  &1: reg for value, &2: source (LA) if not &1, &3: dest (LA) (opt)   00617000
  363. &LABEL   CCHAR ®,&DATA,&TO,S,SPACE                                   00618000
  364.          MEND                                                           00619000
  365. *COPY                                                 TOCHR             00620000
  366.          MACRO                                                          00621000
  367. &LABEL   TOCHR ®,&DATA,&TO                                           00622000
  368. .* ToChr: Add an ASCII space                                            00623000
  369. .*  &1: reg for value, &2: source (LA) if not &1, &3: dest (LA) (opt)   00624000
  370. &LABEL   CCHAR ®,&DATA,&TO,A,SPACE                                   00625000
  371.          MEND                                                           00626000
  372. *COPY                                                 CTL               00627000
  373.          MACRO                                                          00628000
  374. &LABEL   CTL   ®,&DATA,&TO                                           00629000
  375. .* CTL: Reverse bit 6 to make a ctl char printable and vice versa       00630000
  376. .*  &1: reg for value, &2: source (LA) if not &1, &3: dest (LA) (opt)   00631000
  377. &LABEL   CCHAR ®,&DATA,&TO,X,F64                            @SC86120 00632000
  378.          MEND                                                           00633000
  379. *COPY                                                 CCHAR             00634000
  380.          MACRO                                                          00635000
  381. &LABEL   CCHAR ®,&DATA,&TO,&OP,&VALUE                                00636000
  382. .* CCHAR: Used by CTL/UNCHR/TOCHR to add/subtract number                00637000
  383. .*  &1: reg for value, &2: source (LA) if not &1, &3: dest (LA) (opt),  00638000
  384. .*  &4: opcode for change, &5: operand                                  00639000
  385.          AIF   ('&LABEL' EQ '').NOLAB                                   00640000
  386. &LABEL   DS    0H                                                       00641000
  387. .NOLAB   AIF   ('&DATA' EQ '').NODATA                                   00642000
  388.          SR    ®,®                                       @SC86120 00643000
  389.          IC    ®,&DATA                                               00644000
  390. .NODATA  &OP   ®,&VALUE                                              00645000
  391.          AIF   ('&TO' EQ '').TO                                         00646000
  392.          STC   ®,&TO                                                 00647000
  393. .TO      MEND                                                           00648000
  394. *COPY                                                 MSGDF             00649000
  395.          MACRO                                                          00650000
  396.          MSGDF &NM,&TEXT                                                00651000
  397. .* Define error message table entry and pointer                         00652000
  398. .*  &1: 3-letter error code, &2: 'text of message'                      00653000
  399. ERRTAB   CSECT                                                          00654000
  400. ERR&NM   EQU   (*-ERRTAB)/4  Symbolic error number                      00655000
  401.          DC    AL1(L'MSG&NM),AL3(MSG&NM)                                00656000
  402. ERRMSGS  CSECT                                                          00657000
  403. MSG&NM   DC    C&TEXT                                                   00658000
  404.          MEND                                                           00659000
  405. *COPY                                                 RETREG            00660000
  406.          MACRO                                                          00661000
  407. &LABEL   RETREG &ARG                                                    00662000
  408. .* Return current register value(s) to caller.  Clobbers R1.            00663000
  409. .*  &1(1): register to be returned, &1(2): register containing value,   00664000
  410. .*  &2(1): ditto, etc.                                                  00665000
  411.          LCLC  ®,&CUR                                       @SC89218 00666000
  412.          LCLA  &N,&RO                                          @SC89218 00667000
  413. &LABEL   L     1,4(,13)      Get ptr to save area              @SC89218 00668000
  414. &N       SETA  1                                               @SC89218 00669000
  415. .LQ      AIF   ('&SYSLIST(&N)' EQ '').LP                       @SC89218 00670000
  416.          AIF   (N'&SYSLIST(&N) GT 2).ERR1                      @SC89218 00671000
  417. ®     SETC  '&SYSLIST(&N,1)'                                @SC89218 00672000
  418. &CUR     SETC  '&SYSLIST(&N,2)'                                @SC89218 00673000
  419.          AIF   ('®' EQ '').ERR2                             @SC89218 00674000
  420.          AIF   ('&CUR' NE '').L1                               @SC89218 00675000
  421. &CUR     SETC  '®'                                          @SC89218 00676000
  422. .L1      AIF   (T'&SYSLIST(&N,1) NE 'N').ERR3                  @SC89218 00677000
  423. &RO      SETA  ®-11                                         @SC89218 00678000
  424.          AIF   (&RO GE 2).L2                                   @SC89218 00679000
  425. &RO      SETA  ®+5                                          @SC89218 00680000
  426. .L2      ANOP                                                  @SC89218 00681000
  427. &RO      SETA  4*&RO                                           @SC89218 00682000
  428.          ST    &CUR,&RO.(,1)                                   @SC89218 00683000
  429. .LP      ANOP                                                  @SC89218 00684000
  430. &N       SETA  &N+1                                            @SC89218 00685000
  431.          AIF   (&N LE N'&SYSLIST).LQ                           @SC89218 00686000
  432.          MEXIT                                                 @SC89218 00687000
  433. .ERR1    MNOTE 12,'Too many items in &SYSLIST(&N)'             @SC89218 00688000
  434.          MEXIT                                                 @SC89218 00689000
  435. .ERR2    MNOTE 12,'Register not specified in &SYSLIST(&N)'     @SC89218 00690000
  436.          MEXIT                                                 @SC89218 00691000
  437. .ERR3    MNOTE 12,'Non-numeric register in &SYSLIST(&N)'       @SC89218 00692000
  438.          MEND                                                           00693000
  439. *COPY                                                 POINTF            00694000
  440.          MACRO                                                          00695000
  441. &LABEL   POINTF &FID,&OPTS,&E=                                          00696000
  442. .* Call DISKIO to skip records just after OPEN                          00697000
  443. .*  &1: file ticket (LA/R), &2: ptr to # of records to skip             00698000
  444. .*  &E= error branch (see KCALL)                                        00699000
  445.          AIF   ('&OPTS' EQ '').ERR1                            @SC89218 00700000
  446. &LABEL   LA    0,23                                            @SC89218 00701000
  447.          ICM   2,15,&OPTS    Get number to skip                @SC89218 00702000
  448.          KCALL DISKIO,&FID,E=&E                                @SC89218 00703000
  449.          MEXIT                                                 @SC89218 00704000
  450. .ERR1    MNOTE 12,'Missing record count'                       @SC89218 00705000
  451.          MEND                                                           00706000
  452. *COPY                                                 HTBL              00707000
  453.          MACRO                                                          00708000
  454. &LABEL   HTBL  &A,&B,&C,&D,&E,&F,&G,&H,&I,&J,&K,&L,&M,&N,&O,&P          00709000
  455. .* Assemble a hex constant with comma delimiters                        00710000
  456. .*  &1-&16: up to 16 hex strings                                        00711000
  457. &LABEL   DC    X'&A&B&C&D&E&F&G&H&I&J&K&L&M&N&O&P'             @SC89268 00712000
  458.          MEND                                                  @SC89268 00713000
  459. *COPY                                                 TBLFIX   @SC91316 00713040
  460.          MACRO                                                 @SC91316 00713080
  461. &NAME    TBLFIX &LISTA,&LISTB                                  @SC91316 00713120
  462. .* Alter a translation table for selected printable characters @SC91316 00713160
  463. .*  &1: offset chars, &2: replacements  (both just strings)    @SC91316 00713200
  464.          LCLA  &I,&N                                           @SC91316 00713240
  465.          LCLC  &CA,&CB                                         @SC91316 00713280
  466.          AIF   ('&NAME' EQ '').ERR                             @SC91316 00713320
  467. &N       SETA  K'&LISTA      Number of chars                   @SC91316 00713360
  468. &I       SETA  0                                               @SC91316 00713400
  469. .LP      AIF   (&I GE &N).DONE                                 @SC91316 00713440
  470. &I       SETA  &I+1                                            @SC91316 00713480
  471. &CA      SETC  '&LISTA'(&I,1)                                  @SC91316 00713520
  472. &CB      SETC  '&LISTB'(&I,1)                                  @SC91316 00713560
  473.          ORG   &NAME+C'&CA'                                    @SC91316 00713600
  474.          DC    C'&CB'                                          @SC91316 00713640
  475.          AGO   .LP                                             @SC91316 00713680
  476. .ERR     MNOTE 8,'MISSING LABEL'                               @SC91316 00713720
  477. .DONE    ORG   ,                                               @SC91316 00713760
  478.          MEND                                                  @SC91316 00713800
  479. *COPY                                                 CHECKVER          00714000
  480.          MACRO                                                          00715000
  481. &LABEL   CHECKVER &NAME,&VER                                            00716000
  482. .* Verify that the version numbers in source components match           00717000
  483. .*  &1: source component name, &2: version number of component          00718000
  484.          GBLC  &KVRSN                                          @SC90072 00719000
  485.          AIF   ('&KVRSN' EQ '&VER').VOK                        @SC90072 00720000
  486.    MNOTE 16,'* * * --> &NAME version number should be &KVRSN'  @SC90072 00721000
  487.    MNOTE 16,'* * * --> You are attempting to use version &VER' @SC90072 00722000
  488. .VOK     MEND                                                  @SC90072 00723000
  489. *COPY                                                 KTRACE            00723100
  490.          MACRO                                                 @LM91008 00723200
  491. &LABEL   KTRACE &TYPE,®S=                                   @LM91008 00723300
  492. .* Implement internal trace facility for subroutine calls      @SC91008 00723400
  493. .*  &1: type of trace coding or tag value ('string' or LA)     @SC91008 00723500
  494. .*  ®S= list of 1 or 2 registers to be stored with tag      @SC91008 00723600
  495. .* User examples:                                                       00723700
  496. .*  KTRACE 'Found it',REGS=(1,7) traces 'Found it', R1, & R7            00723800
  497. .*  KTRACE 0(5),REGS=5 traces 8 bytes from ptr in R5 & R5 too           00723900
  498. .*  KTRACE FOOBAR traces 8 bytes from FOOBAR                            00724000
  499.          GBLC  &KTRACE                                         @LM91008 00724100
  500.          GBLC  &AADEBUG,&ZZZZOR,&AAATEST,&AZDISAB              @SC92169 00724150
  501.          AIF   ('&KTRACE' NE 'YES').NOTRACE                    @LM91008 00724200
  502.          AIF   ('&TYPE'(1,1) EQ '''').LABEL                    @SC91008 00724300
  503.          AIF   ('&TYPE' EQ 'STORAG').STORAG                    @LM91008 00724400
  504.          AIF   ('&TYPE' EQ 'SETUP').SETUP                      @LM91008 00724500
  505.          AIF   ('&TYPE' EQ 'DUMP').DUMP                        @SC92169 00724550
  506.          AIF   ('&TYPE' EQ 'EXIT').EXIT                        @LM91008 00724600
  507.          AIF   ('&TYPE' EQ 'SUBENT').SUBENT                    @LM91008 00724700
  508. .* "Other" means this was a tag -- use it                      @SC91008 00724800
  509. .LABEL   ANOP                                                  @LM91008 00724900
  510. &LABEL   XC    KTRABF,KTRABF Clear                             @LM91008 00725000
  511.          AIF   ('®S' EQ '').NOREG                           @SC91008 00725100
  512.          ST    ®S(1),KTRABF+8                               @SC91008 00725200
  513.          AIF   ('®S(2)' EQ '').NOREG                        @SC91008 00725300
  514.          ST    ®S(2),KTRABF+12                              @SC91008 00725400
  515. .NOREG   AIF   ('&TYPE'(1,1) EQ '''').LTAGLIT                  @LM91008 00725500
  516.          MVC   KTRABF(8),&TYPE  Move data at specified location@LM91008 00725600
  517.          AGO   .KTRCOM                                         @LM91008 00725700
  518. .LTAGLIT MVC   KTRABF(8),=CL8&TYPE Use literal for trace entry @LM91008 00725800
  519.          AGO   .KTRCOM                                         @LM91008 00725900
  520. .* Tracing suppressed -- still generate label if necessary     @SC91008 00726000
  521. .NOTRACE AIF  ('&LABEL' EQ '').X                               @LM91008 00726100
  522. &LABEL   DS    0H                                              @LM91008 00726200
  523. .X       MEXIT                                                 @LM91008 00726300
  524. .* Inserted into subroutine entry handler                      @SC91008 00726400
  525. .SUBENT  ANOP                                                  @LM91008 00726500
  526. &LABEL   L     15,16(,13)    Original R15 (needn't preserve)   @SC91008 00726600
  527.          MVC   KTRABF(7),5(15) Copy name                       @SC91008 00726700
  528.          MVC   KTRABF+7(1),KTRAEYE Insert sequence number      @SC91008 00726800
  529.          MVC   KTRABF+8(8),20(13) Copy input R0,R1             @SC91008 00726900
  530. .KTRCOM  STM   14,15,KTRASV                                    @SC91008 00727000
  531.          BAL   14,KTRASTOR                                     @SC91008 00727100
  532.          LM    14,15,KTRASV                                    @SC91008 00727200
  533.          MEXIT                                                 @SC91008 00727300
  534. .* Inserted into RTRN handler                                  @SC91008 00727400
  535. .EXIT    ANOP                                                  @SC91008 00727500
  536. &LABEL   L     1,16(,13)     Get original R15                  @SC91008 00727600
  537.          MVC   KTRABF(7),5(1) Copy the name                    @SC91008 00727700
  538.          MVI   KTRABF+7,C'>' Indicate EXIT from routine        @LM91008 00727800
  539.          ST    15,KTRABF+8   Save return code                  @LM91008 00727900
  540.          MVC   KTRABF+12(4),24(13) Save possible returned R1   @SC91008 00728000
  541.          LA    14,KTRASTOX   Where to go when done with trace  @SC91008 00728100
  542. *  Routine to copy trace entry into table                      @SC91008 00728200
  543. KTRASTOR ICM   15,15,KTRAPT  Get table pointer, if any         @SC91008 00728300
  544.          BZR   14            Not set up yet                    @SC91008 00728400
  545.          C     15,KTRAHI     Over limit?                       @LM91008 00728500
  546.          BL    *+8           No, OK ...                        @LM91008 00728600
  547.           L    15,KTRALO     Yes ... get start of table        @LM91008 00728700
  548.          MVC   0(16,15),KTRABF  Copy to trace table            @LM91008 00728800
  549.          LA    15,16(,15)    Inc. to next trace table entry    @LM91008 00728900
  550.          ST    15,KTRAPT                                       @LM91008 00729000
  551.          IC    15,KTRAEYE    Bump counter                      @SC91008 00729100
  552.          LA    15,1(,15)                                       @SC91008 00729200
  553.          STC   15,KTRAEYE                                      @SC91008 00729300
  554.          NI    KTRAEYE,63    Make it unprintable               @SC91008 00729400
  555.          BR    14                                              @SC91008 00729500
  556. KTRASTOX L     15,KTRABF+8   Restore return code               @SC91008 00729600
  557. *          now restore caller's registers and return           @SC91008 00729700
  558.          MEXIT                                                 @LM91008 00729800
  559. .STORAG  ANOP                                                  @LM91008 00729900
  560. KTRAEYE  DS    CL8           Eye-catcher for ptr               @LM91008 00730000
  561. KTRALO   DS    A             Start of table                    @SC91008 00730100
  562. KTRAPT   DS    A             Current pointer in table          @LM91008 00730200
  563. KTRAHI   DS    A             Top of table                      @LM91008 00730300
  564. KTRASV   DS    2F            Saved R14,R15 during trace        @LM91008 00730400
  565. KTRABF   DS    XL16          Current/last trace item           @LM91008 00730500
  566.          MEXIT                                                 @LM91008 00730600
  567. .SETUP   ANOP                                                  @LM91008 00730700
  568.          MVC   KTRAEYE,=CL8' KTRACE:' Fill eye-catcher         @LM91008 00730800
  569.          ST    1,KTRALO                                        @SC91008 00730900
  570.          ST    1,KTRAPT                                        @SC91008 00731000
  571.          LA    1,45*16(,1)   Allow for 45 trace entries        @SC91008 00731100
  572.          ST    1,KTRAHI                                        @SC91008 00731200
  573.          MEXIT                                                 @SC92169 00731300
  574. .DUMP    ANOP                                                  @SC92169 00731330
  575. &LABEL   TM    FL1,DEBUG+TSTF Special logging in effect?       @SC92169 00731360
  576.          BO    DUMPTR1       Yes, do it                        @SC92169 00731390
  577.          WTEXT '&AADEBUG &ZZZZOR &AAATEST &AZDISAB'            @SC92169 00731420
  578.          B     RTRN0         Give up                           @SC92169 00731450
  579. DUMPTR1  LM    5,7,KTRALO    Get pointers: start, cur, top     @SC92169 00731480
  580.          LR    3,7                                             @SC92169 00731510
  581.          SR    3,6           Length of top half of table       @SC92169 00731540
  582.          SR    7,5           Length of whole table             @SC92169 00731570
  583.          LR    0,7           Save for dump                     @SC92169 00731600
  584.          LA    2,DUMTBL      Start of local copy area          @SC92169 00731630
  585.          LR    1,2           Save for dump                     @SC92169 00731660
  586.          MVCL  2,6           Copy top half first               @SC92169 00731690
  587.          LR    6,5           Start of table                    @SC92169 00731720
  588.          LR    3,7           Length remaining to copy          @SC92169 00731750
  589.          MVCL  2,6           Copy the rest                     @SC92169 00731780
  590.          KHDMP (1),(0),'SUBTRACE'                              @SC92169 00731810
  591.          B     RTRN0                                           @SC92169 00731840
  592.          MEND                                                  @SC92169 00731870
  593. *COPY                                                 KHDMP    @SC91008 00732000
  594.          MACRO                                                 @SC91008 00733000
  595. &LABEL   KHDMP &START,&LENGTH,&TITLE                           @SC91008 00734000
  596. .* Generate a hex dump in the debug log for a selected block   @SC91008 00735000
  597. .*  &1: adr of storage block (LA/R), &2: length (LA/R),        @SC91008 00736000
  598. .*  &3: 8-byte title ('string' or LA/R)                        @SC91008 00737000
  599.          GBLC  &KTRACE                                         @SC91008 00738000
  600.          AIF   ('&KTRACE' EQ 'NO').DONE                        @SC91008 00739000
  601. &LABEL   STM   14,2,KHDSAV   Save registers                    @SC91008 00740000
  602.          AIF   ('&SYSECT' NE 'DISKIO').OK                      @SC91008 00741000
  603.          MNOTE 1,'Be sure not to create a debug loop in DISKIO' SC91008 00742000
  604. .OK      AIF   ('&LENGTH' EQ '').ERR1                          @SC91008 00743000
  605.          AIF   ('&TITLE' EQ '').ERR2                           @SC91008 00744000
  606.          LREG  0,&LENGTH                                       @SC91008 00745000
  607.          AIF   ('&TITLE'(1,1) EQ '''').STRING                  @SC91008 00746000
  608.          LREG  2,&TITLE                                        @SC91008 00747000
  609.          AGO   .DUMP                                           @SC91008 00748000
  610. .STRING  LA    2,=CL8&TITLE                                    @SC91008 00749000
  611. .DUMP    KCALL KHDMP,&START  Dump the block to the log file    @SC91008 00750000
  612.          LM    14,2,KHDSAV   Restore registers                 @SC91008 00751000
  613. .DONE    MEXIT                                                 @SC91008 00752000
  614. .ERR1    MNOTE 8,'No length specified'                         @SC91008 00753000
  615.          MEXIT                                                 @SC91008 00754000
  616. .ERR2    MNOTE 8,'No title specified'                          @SC91008 00755000
  617.          MEND                                                  @SC91008 00756000
  618.