© Copyright B.V. Bixoft 1999-2003. All rights reserved.
This software is free; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by the Free
Software Foundation; either
version 2 of the License,
or (at your option) any later version.
More information is available from
the Free Software Foundation or
the Open Source Initiative.
This software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License along with this software; if not, write to either of the following:
the Free Software Foundation, Inc. 59 Temple Place, Suite 330 Boston, MA 02111-1307 United States of America |
B.V. Bixoft Rogge 9 7261 JA Ruurlo The Netherlands |
email: bixoft@bixoft.nl phone: +31-6-22755401 |
Remark:
This software - and more programs and macros - are available in a format more
suitable for uploading to your mainframe. Please e-mail
B.V. Bixoft with your request
and you will receive a zipped IEBUPDTE job with the program sources.
.* 00000100 .* This macro is free software; you can redistribute it and/or modify 00000200 .* it under the terms of the GNU General Public License as published by 00000300 .* the Free Software Foundation; either version 2 of the License 00000400 .* or (at your option) any later version. 00000500 .* The license text is available at the following internet addresses: 00000600 .* - http://www.bixoft.com/english/gpl.htm 00000700 .* - http://fsf.org 00000800 .* - http://opensource.org 00000900 .* 00001000 .* This macro is distributed in the hope that it will be useful, 00001100 .* but WITHOUT ANY WARRANTY; without even the implied warranty of 00001200 .* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 00001300 .* See the GNU General Public License for more details. 00001400 .* 00001500 .* You should have received a copy of the GNU General Public License 00001600 .* along with this program; if not, write to either of the following: 00001700 .* the Free Software Foundation, Inc. B.V. Bixoft 00001800 .* 59 Temple Place, Suite 330 Rogge 9 00001900 .* Boston, MA 02111-1307 7261 JA Ruurlo 00002000 .* United States of America The Netherlands 00002100 .* 00002200 .* e-mail: bixoft@bixoft.nl 00002300 .* phone : +31-6-22755401 00002400 .* 00002500 .********************************************************************** 00010000 .* 00020000 .* Bixoft eXtended Assembly language 00030000 .* Licensed material - Property of B.V. Bixoft 00040000 .* 00050000 .* This macro can be licensed or used on an as-is basis. 00060000 .* No warranty, neither implicit nor explicit, is given. 00070000 .* It remains your own responsibility to ensure the correct 00080000 .* working of any program using this macro. 00090000 .* 00100000 .* Suggestions for improvement are always welcome at 00110000 .* http://www.bixoft.com or mail to bixoft@bixoft.nl 00120000 .* 00130000 .* (C) Copyright B.V. Bixoft, 1999 00140000 .********************************************************************** 00150000 MACRO 00160000 .* 00170000 .* Copy a field - register or storage 00180000 .* 00190000 .* For oversized packed fields unpacking may be done by processing 00200000 .* left to right in clusters of several bytes at a time. 00210000 .* For oversized zoned fields packing may be done by processing 00220000 .* right to left in a loop. 00230000 .* For every EQUREG a check must be made whether the source and/or 00240000 .* destination registers are in USE. Change EQUREG with a 00250000 .* NO=(...) keyword. 00260000 .* 00270000 &LABEL CPY &TO, * Destination field *00280000 &FROM, * Source field *00290000 &WARN * NOWARN or nothing 00300000 .* 00310000 .* &TO specifies the field or register to be filled, 00320000 .* or (field,length) to override the length of the field 00330000 .* or (reg,end_reg_name) to copy to a set of registers 00340000 .* or (reg,nr_of_regs) to copy to a set of registers 00350000 .* or (gpr_name,ar_name) to copy to 1 or more GPR/AR pairs 00360000 .* or ((gpr),len) to copy to a register-designated area 00370000 .* or ((gpr),(gpr)) to copy to a register-designated area 00380000 .* &FROM specifies the field or register to be copied, 00390000 .* or (field,length) to override the length of the field 00400000 .* or (reg,nr_of_regs) to copy from a set of registers 00410000 .* or (reg,end_reg_name) to copy from a set of registers 00420000 .* or (gpr_name,ar_name) to copy from 1 or more GPR/AR pairs 00430000 .* or ((gpr),len) to copy from a register-designated area 00440000 .* or ((gpr),(gpr)) to copy from a register-designated area 00450000 .* or *STACK to retrieve registers from the stack 00460000 .* &WARN specifies whether or not a warning is to be issued if 00470000 .* &TO and &FROM designate the same field/register 00480000 .* 00490000 .* Declare variables 00500000 GBLC &SYSASCE * Current ASC mode: P or AR 00510000 GBLA &BXA_RC * Returncode from CHKREG 00520000 GBLA &BXA_NUMVAL * Register nr from CHKREG 00530000 LCLC &_LABEL * LABEL parameter 00540000 LCLC &_TO1 * TO field designation 00550000 LCLC &_TO2 * TO length 00560000 LCLC &TO_TP * Type of TO location 00570000 LCLA &TO_LEN * Length of TO location 00580000 LCLA &TO_REG * TO register number 00590000 LCLB &TO_EREG * TO end register specified? 00600000 LCLC &_FROM1 * FROM field designation 00610000 LCLC &_FROM2 * FROM length 00620000 LCLC &FROM_TP * Type of FROM location 00630000 LCLA &FROM_LEN * Length of FROM location 00640000 LCLA &FROM_REG * FROM register number 00650000 LCLB &FROM_EREG * FROM end register specified? 00660000 LCLA &FROM_VAL * Value of FROM literal 00670000 LCLC &SIGN * Sign of FROM literal value 00680000 LCLB &EQULIT * Source is an equated literal 00690000 LCLA &I,&J * 00700000 LCLA &LEN * Length value 00710000 LCLC &LENC * Length value (character) 00720000 LCLA &PAD_LEN * Length of pad area 00730000 LCLC &PAD_ADR * Length of pad area 00740000 LCLB &PAD0 * On for pad with zeros *00750000 * Off for pad with blanks 00760000 LCLC &MASK * Byte mask 00770000 LCLC ® * A register name 00780000 LCLC &ODDREG * Associated odd reg name 00790000 LCLA ®_CT * Count of registers 00800000 LCLC ®_SRCP * Source ptr reg for MVCL 00810000 LCLC ®_SRCL * Source length reg for MVCL 00820000 LCLC ®_DSTP * Destination ptr reg for MVCL 00830000 LCLC ®_DSTL * Destination leng reg for MVCL 00840000 .* 00850000 .* Copy the LABEL parameter 00860000 &_LABEL SETC '&LABEL' * 00870000 .* 00880000 .* Check TO parameter 00890000 AIF (K'&TO EQ 0).ERR1A * 00900000 &_TO1 SETC '&TO' * Copy destination field 00910000 AIF ('&TO'(1,1) NE '(').NOERR1 * No length specified 00920000 AIF (N'&TO EQ 0).ERR1B * Must have 00930000 AIF (N'&TO EQ 1).ERR1C * exactly two 00940000 AIF (N'&TO GT 2).ERR1D * sub-operands 00950000 .NOERR1D ANOP , * 00960000 &_TO1 SETC '&TO(1)' * Extract field designation 00970000 &_TO2 SETC '&TO(2)' * and field length 00980000 AIF (K'&_TO1 EQ 0).ERR1B * 00990000 AIF (K'&_TO2 EQ 0).ERR1C * 01000000 AGO .NOERR1 * 01010000 .ERR1A MNOTE 8,'Missing first operand - destination of copy' 01020000 MEXIT , * 01030000 .ERR1B MNOTE 8,'Destination in parentheses: missing field name' 01040000 MEXIT , * 01050000 .ERR1C MNOTE 8,'Destination in parentheses: missing length' 01060000 MEXIT , * 01070000 .ERR1D MNOTE 4,'Destination in parentheses: too many subparameters' 01080000 AGO .NOERR1D * 01090000 .NOERR1 ANOP , * 01100000 .* 01110000 .* Check FROM parameter 01120000 AIF (K'&FROM EQ 0).ERR2A * 01130000 &_FROM1 SETC '&FROM' * Copy source field 01140000 AIF ('&FROM' EQ '*STACK').NOERR2 01150000 AIF ('&FROM'(1,1) NE '(').NOERR2 * No length specified 01160000 AIF (N'&FROM EQ 0).ERR2B * Must have 01170000 AIF (N'&FROM EQ 1).ERR2C * exactly two 01180000 AIF (N'&FROM GT 2).ERR2D * sub-operands 01190000 .NOERR2D ANOP , * 01200000 &_FROM1 SETC '&FROM(1)' * Extract field designation 01210000 &_FROM2 SETC '&FROM(2)' * and field length 01220000 AIF (K'&_FROM1 EQ 0).ERR2B * 01230000 AIF (K'&_FROM2 EQ 0).ERR2C * 01240000 AGO .NOERR2 * 01250000 .ERR2A MNOTE 8,'Missing second operand - source of copy' 01260000 MEXIT , * 01270000 .ERR2B MNOTE 8,'Source in parentheses: missing field name' 01280000 MEXIT , * 01290000 .ERR2C MNOTE 8,'Source in parentheses: missing length' 01300000 MEXIT , * 01310000 .ERR2D MNOTE 4,'Source in parentheses: too many subparameters' 01320000 AGO .NOERR2D * 01330000 .NOERR2 ANOP , * 01340000 .* 01350000 .* Check the WARN parameter 01360000 AIF (K'&WARN EQ 0).NOERR3 * 01370000 AIF ('&WARN' EQ 'NOWARN').NOERR3 01380000 .ERR3A MNOTE 4,'If specified, third parameter must be ''NOWARN''' 01390000 .NOERR3 ANOP , * 01400000 .* 01410000 .* Check nr of parameters 01420000 AIF (N'&SYSLIST LE 3).NOERR4 01430000 .ERR4A MNOTE 4,'More than 3 parameters: remainder ignored' 01440000 .NOERR4 ANOP , * 01450000 .* 01460000 .* Determine type of the TO field 01470000 AIF ('&_TO1'(1,1) EQ '(').TO_PTR * Destination is pointered? 01480000 CHKLIT &_TO1,ALT=YES * A literal nr was specified? 01490000 AIF (&BXA_RC LT 8).ERR5A * Valid literal: won't do! 01500000 &I SETA ('&_TO1' FIND '+-*/(=),''') * Check for invalid chars 01510000 AIF (&I NE 0).ERR5B * Invalid field name 01520000 &TO_TP SETC T'&_TO1 * Extract field type 01530000 &I SETA ('&TO_TP' FIND 'ABCDEFGHKLPQRSVXYZ') 01540000 AIF (&I EQ 1).NOERR5 * Valid field type 01550000 CHKREG &_TO1 * Valid register type? 01560000 AIF (&BXA_RC NE 0).ERR5C * Invalid field type 01570000 &TO_REG SETA &BXA_NUMVAL * Save register number 01580000 AGO .NOERR5 * 01590000 .TO_PTR ANOP , * 01600000 &TO_TP SETC 'p' * Field type is pointer 01610000 &_TO1 SETC '&TO(1,1)' * Extract register designation 01620000 CHKREG &_TO1,g * Must be a gpr! 01630000 AIF (&BXA_RC GT 4).ERR5D * Not a valid pointer register 01640000 AGO .NOERR5 * 01650000 .ERR5A MNOTE 8,'Literal number cannot serve as destination' 01660000 MEXIT , * 01670000 .ERR5B MNOTE 8,'Destination field not a valid field name' 01680000 MEXIT , * 01690000 .ERR5C MNOTE 8,'&TO_TP is an invalid destination field type' 01700000 MEXIT , * 01710000 .ERR5D MNOTE 8,'&_TO1 is an invalid destination pointer register' 01720000 MEXIT , * 01730000 .NOERR5 ANOP , * 01740000 .* 01750000 .* Determine type of the FROM field 01760000 AIF ('&_FROM1'(1,1) EQ '(').FROM_PTR * Source is pointered? 01770000 AIF ('&FROM' EQ '*STACK').NOERR6 01780000 CHKLIT &_FROM1,ALT=YES * A literal nr was specified? 01790000 AIF (&BXA_RC LT 8).ERR6A * Valid literal nr: ok 01800000 AIF ('&_FROM1'(1,1) EQ '=').FROMLIT * A literal was spec'd 01810000 &I SETA ('&_FROM1' FIND '+-*/(=),''') * Check for invalid chars 01820000 AIF (&I EQ 0).FROMFLD * Valid field name 01830000 AIF (K'&_FROM1 LT 3).FROMTP0 * Cannot be a length reference 01840000 AIF ('&_FROM1'(1,2) NE 'L''').FROMTP0 * Is not a length ref. 01850000 &LENC SETC '&_FROM1'(3,*) * Length of what? 01860000 &BXA_NUMVAL SETA L'&LENC * Retrieve length 01870000 AIF (&BXA_NUMVAL NE 0).ERR6A * Ok: treat as literal number 01880000 AGO .ERR6B * Cannot evaluate 01890000 .FROMTP0 ANOP , * Source should evaluate to a nr 01900000 &BXA_NUMVAL SETA &_FROM1 * A valid literal number? 01910000 AIF (&I NE 0).ERR6A * Ok: treat as a literal number 01920000 AGO .ERR6B * Error: cannot evaluate 01930000 .FROMFLD ANOP , * Source is a valid field name 01940000 &FROM_TP SETC T'&_FROM1 * Extract field type 01950000 &I SETA ('&FROM_TP' FIND 'ABCDEFGHKLPQRSVXYZ') 01960000 AIF (&I EQ 1).NOERR6 * Valid field type 01970000 AIF ('&FROM_TP' NE '0').FROMREG * This an equated literal? 01980000 &EQULIT SETB 1 * Yes: indicate equated literal 01990000 &FROM_VAL SETA L'&_FROM1 * Determine value of literal 02000000 AGO .NOERR6 * 02010000 .FROMREG ANOP , * Must be a valid register 02020000 CHKREG &_FROM1 * Valid register type? 02030000 AIF (&BXA_RC NE 0).ERR6C * Invalid field type 02040000 &FROM_REG SETA &BXA_NUMVAL * Save register number 02050000 AGO .NOERR6 * 02060000 .FROMLIT ANOP , * A literal was specified as src 02070000 AIF (K'&_FROM1 LT 5).ERR6D * Not a decent literal 02080000 &I SETA 2 * First position to check 02090000 &J SETA ('(0123456789' FIND '&_FROM1'(&I,1)) * Check dup.factor 02100000 AIF (&J EQ 0).FRLIT4 * No dup factor! 02110000 AIF (&J EQ 1).FRLIT1 * Dup factor in parentheses! 02120000 .FRLIT0 ANOP , * Loop to find end of dup.nr 02130000 &I SETA &I+1 * Point next char in &_FROM1 02140000 AIF (&I GT K'&_FROM1).ERR6D * No type designation found 02150000 &J SETA ('&_FROM1'(&I,1) FIND '0123456789') 02160000 AIF (&J EQ 0).FRLIT4 * &I now points past dup.factor 02170000 AGO .FRLIT0 * 02180000 .FRLIT1 ANOP , * &J contains nr of ( to match 02190000 &I SETA &I+1 * Point next char in &_FROM1 02200000 AIF (&I GT K'&_FROM1).ERR6D * No type designation found 02210000 AIF ('&_FROM1'(&I,1) EQ '(').FRLIT2 02220000 AIF ('&_FROM1'(&I,1) EQ ')').FRLIT3 02230000 AGO .FRLIT1 * 02240000 .FRLIT2 ANOP , * Another ( found 02250000 &J SETA &J+1 * Count unmatched parenthesis 02260000 AGO .FRLIT1 * and continue search for ) 02270000 .FRLIT3 ANOP , * An ending parenthesis found 02280000 &J SETA &J-1 * Reduce count of unmatched ( 02290000 AIF (&J GT 0).FRLIT1 * Search for more ) characters 02300000 &I SETA &I+1 * Point past dup-factor 02310000 .FRLIT4 ANOP , * &I now points past dup.factor 02320000 AIF (&I GT K'&_FROM1).ERR6D * No type designation found 02330000 &FROM_TP SETC '&_FROM1'(&I,1) * Extract type of literal 02340000 AIF (&I+3 GT K'&_FROM1).ERR6D * No valid value! 02350000 &I SETA &I+1 * Point next char 02360000 AIF ('&_FROM1'(&I,1) NE 'L').FRLIT10 * No length modifier 02370000 &LEN SETA &I+1 * Point to start of length value 02380000 AIF ('&_FROM1'(&I,1) EQ '''').FRLIT10 * No length modifier 02390000 AIF ('&_FROM1'(&I,1) EQ '.').ERR6E * Length is in bits 02400000 AIF ('&_FROM1'(&I,1) EQ '(').FRLIT6 * Length in () 02410000 .FRLIT5 ANOP , * Loop to find end of length 02420000 &I SETA &I+1 * Point next char in &_FROM1 02430000 AIF (&I GT K'&_FROM1).ERR6D * No type designation found 02440000 &J SETA ('&_FROM1'(&I,1) FIND '0123456789') 02450000 AIF (&J EQ 0).FRLIT9 * &I now points past length 02460000 AGO .FRLIT5 * 02470000 .FRLIT6 ANOP , * Lenth in parentheses 02480000 &J SETA 0 * &J contains nr of ( to match 02490000 &I SETA &I+1 * Point next char in &_FROM1 02500000 AIF (&I GT K'&_FROM1).ERR6D * No type designation found 02510000 AIF ('&_FROM1'(&I,1) EQ '(').FRLIT7 02520000 AIF ('&_FROM1'(&I,1) EQ ')').FRLIT8 02530000 AGO .FRLIT6 * 02540000 .FRLIT7 ANOP , * Another ( found 02550000 &J SETA &J+1 * Count unmatched parenthesis 02560000 AGO .FRLIT6 * and continue search for ) 02570000 .FRLIT8 ANOP , * An ending parenthesis found 02580000 &J SETA &J-1 * Reduce count of unmatched ( 02590000 AIF (&J GT 0).FRLIT6 * Search for more ) characters 02600000 &I SETA &I+1 * Point past length value 02610000 .FRLIT9 ANOP , * &I now points past length mod. 02620000 &J SETA &I-&LEN * Nr of chars in length value 02630000 &LENC SETC '&_FROM1'(&LEN,&J) * Extract length value string 02640000 &LEN SETA &LENC * Determine length value 02650000 AIF (&LEN EQ 0).ERR6F * Cannot evaluate length 02660000 &FROM_LEN SETA &LEN * 02670000 .FRLIT10 ANOP , * 02680000 AIF ('&FROM_TP' EQ 'A').FRLITA 02690000 AIF ('&FROM_TP' EQ 'B').NOERR6 02700000 AIF ('&FROM_TP' EQ 'C').FRLITC 02710000 AIF ('&FROM_TP' EQ 'D').FRLITD 02720000 AIF ('&FROM_TP' EQ 'E').FRLITE 02730000 AIF ('&FROM_TP' EQ 'F').FRLITF 02740000 AIF ('&FROM_TP' EQ 'H').FRLITH 02750000 AIF ('&FROM_TP' EQ 'L').FRLITL 02760000 AIF ('&FROM_TP' EQ 'P').NOERR6 02770000 AIF ('&FROM_TP' EQ 'Q').FRLITA 02780000 AIF ('&FROM_TP' EQ 'S').FRLITY 02790000 AIF ('&FROM_TP' EQ 'V').FRLITA 02800000 AIF ('&FROM_TP' EQ 'X').NOERR6 02810000 AIF ('&FROM_TP' EQ 'Y').FRLITY 02820000 AIF ('&FROM_TP' EQ 'Z').NOERR6 02830000 AGO .ERR6E * Unsupported type designation 02840000 .FRLITA ANOP , * A-type literal specified 02850000 AIF (K'&LENC NE 0).FRLITA0 * Length was specified? 02860000 &FROM_LEN SETA 4 * No: use default 02870000 .FRLITA0 ANOP , * Length of literal now known 02880000 &I SETA &FROM_LEN/4 * Nr of whole words 02890000 &I SETA &FROM_LEN-(&I*4) * Nr of additional bytes 02900000 AIF (&I EQ 0).NOERR6 * Ok: aligned 02910000 &FROM_TP SETC 'R' * Indicate unaligned address 02920000 AGO .NOERR6 * 02930000 .FRLITC ANOP , * C-type literal specified 02940000 AIF (K'&LENC NE 0).NOERR6 * Length was specified! 02950000 &LENC SETC '&_FROM1'(&I,*) * I still points past length mod 02960000 AIF (K'&LENC LT 3).ERR6D * Not a valid text literal 02970000 AIF ('&LENC'(1,1) NE '''').ERR6D * Must start with a quote.. 02980000 AIF ('&LENC'(K'&LENC,1) NE '''').ERR6D * And end with one! 02990000 &LENC SETC '&LENC'(2,K'&LENC-2) * Extract string value 03000000 .FRLITC0 ANOP , * Loop to remove double quotes 03010000 &I SETA ('&LENC' INDEX '''''') * Search for double quote 03020000 AIF (&I EQ 0).FRLITC3 * Not found: quit loop 03030000 AIF (&I EQ 1).FRLITC1 * Remove leading quotes 03040000 AIF (&I EQ K'&LENC-2).FRLITC2 * Remove trailing quotes 03050000 &LENC SETC '&LENC'(1,&I-1).'"'.'&LENC'(&I+2,*) 03060000 AGO .FRLITC0 * Check for more quotes 03070000 .FRLITC1 ANOP , * Remove leading double quotes 03080000 &LENC SETC '"'.'&LENC'(3,*) * 03090000 AGO .FRLITC0 * Check for more quotes 03100000 .FRLITC2 ANOP , * Remove leading double quotes 03110000 &LENC SETC '&LENC'(1,&I-1).'"' * 03120000 AGO .FRLITC0 * Check for more quotes 03130000 .FRLITC3 ANOP , * All double quotes replaced 03140000 &FROM_LEN SETA K'&LENC * Nr of characters in string 03150000 AGO .NOERR6 * 03160000 .FRLITD ANOP , * Floating point literal 03170000 AIF (K'&LENC NE 0).FRLITD0 * Length was specified? 03180000 &FROM_LEN SETA 8 * No: use default 03190000 .FRLITD0 ANOP , * Length of literal now known 03200000 &I SETA &FROM_LEN/8 * Nr of double words 03210000 &I SETA &FROM_LEN-(&I*8) * Nr of additional bytes 03220000 AIF (&I EQ 0).NOERR6 * Ok: aligned 03230000 &FROM_TP SETC 'K' * Indicate unaligned float 03240000 AGO .NOERR6 * 03250000 .FRLITE ANOP , * Floating point literal 03260000 AIF (K'&LENC NE 0).FRLITE0 * Length was specified? 03270000 &FROM_LEN SETA 4 * No: use default 03280000 .FRLITE0 ANOP , * Length of literal now known 03290000 &I SETA &FROM_LEN/4 * Nr of whole words 03300000 &I SETA &FROM_LEN-(&I*4) * Nr of additional bytes 03310000 AIF (&I EQ 0).NOERR6 * Ok: aligned 03320000 &FROM_TP SETC 'K' * Indicate unaligned float 03330000 AGO .NOERR6 * 03340000 .FRLITF ANOP , * Fixed point literal 03350000 AIF (K'&LENC NE 0).FRLITF0 * Length was specified? 03360000 &FROM_LEN SETA 4 * No: use default 03370000 .FRLITF0 ANOP , * Length of literal now known 03380000 &I SETA &FROM_LEN/4 * Nr of whole words 03390000 &I SETA &FROM_LEN-(&I*4) * Nr of additional bytes 03400000 AIF (&I EQ 0).NOERR6 * Ok: aligned 03410000 &FROM_TP SETC 'G' * Indicate unaligned fixed 03420000 AGO .NOERR6 * 03430000 .FRLITH ANOP , * Fixed point literal 03440000 AIF (K'&LENC NE 0).FRLITH0 * Length was specified? 03450000 &FROM_LEN SETA 2 * No: use default 03460000 .FRLITH0 ANOP , * Length of literal now known 03470000 &I SETA &FROM_LEN/2 * Nr of half words 03480000 &I SETA &FROM_LEN-(&I*2) * Nr of additional bytes 03490000 AIF (&I EQ 0).NOERR6 * Ok: aligned 03500000 &FROM_TP SETC 'G' * Indicate unaligned fixed 03510000 AGO .NOERR6 * 03520000 .FRLITL ANOP , * Floating point literal 03530000 AIF (K'&LENC NE 0).FRLITL0 * Length was specified? 03540000 &FROM_LEN SETA 8 * No: use default 03550000 .FRLITL0 ANOP , * Length of literal now known 03560000 &I SETA &FROM_LEN/8 * Nr of double words 03570000 &I SETA &FROM_LEN-(&I*8) * Nr of additional bytes 03580000 AIF (&I EQ 0).NOERR6 * Ok: aligned 03590000 &FROM_TP SETC 'K' * Indicate unaligned float 03600000 AGO .NOERR6 * 03610000 .FRLITY ANOP , * Address literal 03620000 AIF (K'&LENC NE 0).FRLITY0 * Length was specified? 03630000 &FROM_LEN SETA 2 * No: use default 03640000 .FRLITY0 ANOP , * Length of literal now known 03650000 &I SETA &FROM_LEN/2 * Nr of half words 03660000 &I SETA &FROM_LEN-(&I*2) * Nr of additional bytes 03670000 AIF (&I EQ 0).NOERR6 * Ok: aligned 03680000 &FROM_TP SETC 'R' * Indicate unaligned address 03690000 AGO .NOERR6 * 03700000 .FROM_PTR ANOP , * 03710000 &FROM_TP SETC 'p' * Field type is pointer 03720000 &_FROM1 SETC '&FROM(1,1)' * Extract register designation 03730000 CHKREG &_FROM1,g * Must be a gpr! 03740000 AIF (&BXA_RC GT 4).ERR6G * Not a valid pointer register 03750000 AGO .NOERR6 * 03760000 .ERR6A ANOP , * Source is a literal 03770000 &FROM_TP SETC '0' * Set source type 03780000 &FROM_VAL SETA &BXA_NUMVAL * Save value to be copied 03790000 AIF (&FROM_VAL GE 0).ERR6A_ * Negative number? 03800000 &SIGN SETC '-' * Indicate sign 03810000 .ERR6A_ ANOP , * 03820000 AIF (K'&_FROM2 EQ 0).NOERR6 * Explicit length specified? 03830000 MNOTE 4,'Explicit length not allowed for literal value: ignore*03840000 d' * 03850000 &_FROM2 SETC '' * Wipe length indication 03860000 AGO .NOERR6 * 03870000 .ERR6B MNOTE 8,'Source field not a valid field name' 03880000 MEXIT , * 03890000 .ERR6C ANOP , * 03900000 CHKLIT &_FROM1,ALT=YES,MSG=YES * Just to issue a message 03910000 MNOTE 8,'&FROM_TP is an invalid source field type' 03920000 MEXIT , * 03930000 .ERR6D MNOTE 8,'Source field is not a valid literal' 03940000 MEXIT , * 03950000 .ERR6E MNOTE 8,'Source field is an unsupported literal' 03960000 MEXIT , * 03970000 .ERR6F ANOP , * 03980000 &LENC SETC (DOUBLE '&LENC') * 03990000 MNOTE 8,'Cannot evaluate length modifier: &LENC' 04000000 MEXIT , * 04010000 .ERR6G MNOTE 8,'&_FROM1 is an invalid source pointer register' 04020000 MEXIT , * 04030000 .NOERR6 ANOP , * 04040000 .* 04050000 .* Determine length of TO field 04060000 &I SETA ('acfg' FIND '&TO_TP') * Register type? 04070000 AIF (&I NE 0).TOLENR * Yes: it is some register type 04080000 AIF (K'&_TO2 NE 0).TOLENX * Should be a valid expression 04090000 &LEN SETA L'&_TO1 * No reg & not spec'd: extract 04100000 AGO .TOLENOK * Length has now been set 04110000 .TOLENR ANOP , * Handle register types 04120000 &LENC SETC '4484'(&I,1) * Determine size of 1 register 04130000 &LEN SETA &LENC * and make it numeric 04140000 &LENC SETC '16160416'(2*&I-1,2) * Determine nr of registers 04150000 ®_CT SETA &LENC * and make it numeric 04160000 AIF (K'&_TO2 EQ 0).TOLENOK * Reg & not spec'd: ok 04170000 CHKREG &_TO2 * Check: register or number? 04180000 AIF (&BXA_RC NE 0).TOLENRL * Must be a literal number 04190000 &TO_EREG SETB 1 * Indicate end register spec'd 04200000 AIF ('&TO_TP' NE T'&_TO2).TOLENR0 04210000 AIF ('&TO_TP' EQ 'f').TOLENF * Go handle ending FP-register 04220000 AGO .TOLENR1 * Go calculate total length 04230000 .TOLENR0 ANOP , * Different register types 04240000 AIF ('&TO_TP' NE 'g').ERR7A4 * Only allowed combination is 04250000 AIF (T'&_TO2 NE 'a').ERR7A4 * gpr with ar 04260000 &TO_TP SETC 'ga' * Indicate combined type 04270000 .TOLENR1 ANOP , * End-register is valid 04280000 &BXA_NUMVAL SETA 1+&BXA_NUMVAL-&TO_REG * Determine nr of registers 04290000 AIF (&BXA_NUMVAL GT 0).TOLENR2 * Wrap around? 04300000 &BXA_NUMVAL SETA ®_CT+&BXA_NUMVAL * Adjust for wrap 04310000 .TOLENR2 ANOP , * BXA_NUMVAL now nr of registers 04320000 &LEN SETA &LEN*&BXA_NUMVAL * Length for all registers 04330000 AGO .TOLENOK * 04340000 .TOLENF ANOP , * Determine lenth from end-FPR 04350000 &BXA_NUMVAL SETA 2+&BXA_NUMVAL-&TO_REG * Determine nr of HALF registers 04360000 AIF (&BXA_NUMVAL GT 0).TOLENF1 * Wrap around? 04370000 &BXA_NUMVAL SETA 2*®_CT+&BXA_NUMVAL * Adjust for wrap 04380000 .TOLENF1 ANOP , * 04390000 &LEN SETA &LEN*&BXA_NUMVAL/2 * Length for all registers 04400000 AGO .TOLENOK * 04410000 .TOLENRL ANOP , * &_TO2 is the nr of regs 04420000 &I SETA &_TO2 * Make nr of regs numeric 04430000 AIF (&I GT 16).ERR7A1 * Too many registers 04440000 AIF ('&TO_TP' EQ 'f' AND &I GT 4).ERR7A1 * Too many regs 04450000 &LEN SETA (&I*&LEN) * Determine total length 04460000 AGO .TOLENOK * Length has now been set 04470000 .TOLENX ANOP , * Check length expression 04480000 AIF ('&_TO2'(1,1) EQ '(').TOLENPT * To length is a (reg)? 04490000 &LEN SETA &_TO2 * Determine numeric value 04500000 AGO .TOLENOK * Length has now been set 04510000 .TOLENPT ANOP , * Check length as a (ptr) 04520000 AIF ('&TO_TP' NE 'p').ERR7A5 * TO1 must be a pointered field 04530000 &_TO2 SETC '&TO(2,1)' * Extract register designation 04540000 CHKREG &_TO2,g * Must be a valid gpr 04550000 AIF (&BXA_RC GT 4).ERR7A6 * Error! 04560000 &LEN SETA 0 * Indicate register used 04570000 &TO_LEN SETA 0 * Indicate register used 04580000 AGO .TOLENOQ * 04590000 .TOLENOK ANOP , * 04600000 AIF (&LEN LE 0).ERR7A2 * Invalid length 04610000 &TO_LEN SETA &LEN * Copy determined length 04620000 .TOLENOQ ANOP , * 04630000 .* 04640000 .* Determine length of FROM field 04650000 AIF (&FROM_LEN NE 0).GO * Length of literal is known 04660000 AIF ('&FROM' EQ '*STACK').GO * Length not relevant 04670000 AIF ('&FROM_TP' EQ '0').FRLEN0 * Literal value? 04680000 &I SETA ('acfg' FIND '&FROM_TP') * Register type? 04690000 AIF (&I NE 0).FRLENR * Yes: it is some register type 04700000 AIF (K'&_FROM2 NE 0).FRLENX * Field & len spec'd: ok 04710000 &LEN SETA L'&_FROM1 * Field & not spec'd: extract 04720000 AGO .FRLENOK * Length has now been set 04730000 .FRLENR ANOP , * Handle register types 04740000 &LENC SETC '4484'(&I,1) * Determine size of 1 register 04750000 &LEN SETA &LENC * and make it numeric 04760000 &LENC SETC '16160416'(2*&I-1,2) * Determine nr of registers 04770000 ®_CT SETA &LENC * and make it numeric 04780000 AIF (K'&_FROM2 EQ 0).FRLENOK * Reg & not spec'd: ok 04790000 CHKREG &_FROM2 * Check: register or number? 04800000 AIF (&BXA_RC NE 0).FRLENRL * Must be a literal number 04810000 &FROM_EREG SETB 1 * Indicate end reg specified 04820000 AIF ('&FROM_TP' NE T'&_FROM2).FRLENR0 04830000 AIF ('&FROM_TP' EQ 'f').FRLENF * Go handle end FP-register 04840000 AGO .FRLENR1 * Go calculate total length 04850000 .FRLENR0 ANOP , * Different register types 04860000 AIF ('&FROM_TP' NE 'g').ERR7A4 * Only allowed combination is 04870000 AIF (T'&_FROM2 NE 'a').ERR7A4 * gpr with ar 04880000 &FROM_TP SETC 'ga' * Indicate combined type 04890000 .FRLENR1 ANOP , * End-register is valid 04900000 &BXA_NUMVAL SETA 1+&BXA_NUMVAL-&FROM_REG * Determine nr of registers 04910000 AIF (&BXA_NUMVAL GT 0).FRLENR2 * Wrap around? 04920000 &BXA_NUMVAL SETA ®_CT+&BXA_NUMVAL * Adjust for wrap 04930000 .FRLENR2 ANOP , * BXA_NUMVAL now nr of registers 04940000 &LEN SETA &LEN*&BXA_NUMVAL * Length for all registers 04950000 AGO .FRLENOK * 04960000 .FRLENF ANOP , * Determine lenth from end-FPR 04970000 &BXA_NUMVAL SETA 2+&BXA_NUMVAL-&FROM_REG * Determine nr of HALF regs 04980000 AIF (&BXA_NUMVAL GT 0).FRLENF1 * Wrap around? 04990000 &BXA_NUMVAL SETA 2*®_CT+&BXA_NUMVAL * Adjust for wrap 05000000 .FRLENF1 ANOP , * BXA_NUMVAL now nr of half regs 05010000 &LEN SETA &LEN*&BXA_NUMVAL/2 * Length for all registers 05020000 AGO .FRLENOK * 05030000 .FRLENRL ANOP , * &_FROM2 is the nr of regs 05040000 &I SETA &_FROM2 * Make nr of regs numeric 05050000 AIF (&I GT 16).ERR7A1 * Too many registers 05060000 AIF ('&FROM_TP' EQ 'f' AND &I GT 4).ERR7A1 * Too many regs 05070000 &LEN SETA (&I*&LEN) * Determine total length 05080000 AGO .FRLENOK * Length has now been set 05090000 .FRLEN0 ANOP , * Determine literal length 05100000 AIF ('&TO_TP' EQ 'B' OR '&TO_TP' EQ 'X').FRLEN0U * Unsigned? 05110000 AIF (&FROM_VAL LT 0).FRLEN0N * Handle negative numbers 05120000 &LEN SETA 1 * Assume 1 byte 05130000 AIF (&FROM_VAL LT 128).FRLENOK * Will fit in 1 byte 05140000 &LEN SETA 2 * Assume 2 bytes 05150000 AIF (&FROM_VAL LT 32768).FRLENOK * Will fit in 2 bytes 05160000 &LEN SETA 3 * Assume 3 bytes 05170000 AIF (&FROM_VAL LT 8388608).FRLENOK * Will fit in 3 bytes 05180000 &LEN SETA 4 * Must fit in 4 bytes 05190000 AGO .FRLENOK * 05200000 .FRLEN0N ANOP , * Determine len of negative nr 05210000 &LEN SETA 1 * Assume 1 byte 05220000 AIF (&FROM_VAL GE -128).FRLENOK * Will fit in 1 byte 05230000 &LEN SETA 2 * Assume 2 bytes 05240000 AIF (&FROM_VAL GE -32768).FRLENOK * Will fit in 2 bytes 05250000 &LEN SETA 3 * Assume 3 bytes 05260000 AIF (&FROM_VAL GE -8388608).FRLENOK * Will fit in 3 bytes 05270000 &LEN SETA 4 * Must fit in 4 bytes 05280000 AGO .FRLENOK * 05290000 .FRLEN0U ANOP , * Determine len of unsigned nr 05300000 &LEN SETA 1 * Assume 1 byte 05310000 AIF (&FROM_VAL LT 256).FRLENOK * Will fit in 1 byte 05320000 &LEN SETA 2 * Assume 2 bytes 05330000 AIF (&FROM_VAL LT 65536).FRLENOK * Will fit in 2 bytes 05340000 &LEN SETA 3 * Assume 3 bytes 05350000 AIF (&FROM_VAL LT 16777216).FRLENOK * Will fit in 3 bytes 05360000 &LEN SETA 4 * Must fit in 4 bytes 05370000 AGO .FRLENOK * 05380000 .FRLENX ANOP , * Evaluate length expression 05390000 AIF ('&_FROM2'(1,1) EQ '(').FRLENPT * To length is a (reg)? 05400000 &LEN SETA &_FROM2 * Determine numeric value 05410000 AGO .FRLENOK * 05420000 .FRLENPT ANOP , * Check length as a (ptr) 05430000 AIF ('&FROM_TP' NE 'p').ERR7A7 * FROM1 must be pointered 05440000 &_FROM2 SETC '&FROM(2,1)' * Extract register designation 05450000 CHKREG &_FROM2,g * Must be a valid gpr 05460000 AIF (&BXA_RC GT 4).ERR7A8 * Error! 05470000 &LEN SETA 0 * Indicate register used 05480000 &FROM_LEN SETA 0 * Indicate register used 05490000 AGO .FRLENOQ * 05500000 .FRLENOK ANOP , * 05510000 AIF (&LEN LE 0).ERR7A3 * Invalid length 05520000 &FROM_LEN SETA &LEN * Copy determined length 05530000 .FRLENOQ ANOP , * 05540000 .* 05550000 .* Copy to self not useful 05560000 AIF ('&_TO1' EQ '&_FROM1').ERR7 * Operands equal? 05570000 &I SETA ('acfg' FIND '&TO_TP') * Register type? 05580000 AIF (&I EQ 0).GO * Not a register: ok 05590000 AIF ('&FROM_TP' NE '&TO_TP').GO * Different types: ok 05600000 AIF (&FROM_REG NE &TO_REG).GO * Not same register nr: ok 05610000 .ERR7 ANOP , * Copy to self detected 05620000 AIF ('&WARN' EQ 'NOWARN').NOERR7 * Suppress message 05630000 MNOTE 4,'Copy to self not useful: ignored' 05640000 .NOERR7 ANOP , * 05650000 &_LABEL LABEL , * 05660000 MEXIT , * 05670000 .* 05680000 .* Select code generation logic by from type field 05690000 .GO ANOP , 05700000 AIF ('&FROM_TP' EQ 'A').GENA 05710000 AIF ('&FROM_TP' EQ 'B').GENB 05720000 AIF ('&FROM_TP' EQ 'C').GENC 05730000 AIF ('&FROM_TP' EQ 'D').GEND 05740000 AIF ('&FROM_TP' EQ 'E').GENE 05750000 AIF ('&FROM_TP' EQ 'F').GENF 05760000 AIF ('&FROM_TP' EQ 'G').GENG 05770000 AIF ('&FROM_TP' EQ 'H').GENH 05780000 AIF ('&FROM_TP' EQ 'K').GENK 05790000 AIF ('&FROM_TP' EQ 'L').GENL 05800000 AIF ('&FROM_TP' EQ 'P').GENP 05810000 AIF ('&FROM_TP' EQ 'Q').GENQ 05820000 AIF ('&FROM_TP' EQ 'R').GENR 05830000 AIF ('&FROM_TP' EQ 'S').GENS 05840000 AIF ('&FROM_TP' EQ 'V').GENV 05850000 AIF ('&FROM_TP' EQ 'X').GENX 05860000 AIF ('&FROM_TP' EQ 'Y').GENY 05870000 AIF ('&FROM_TP' EQ 'Z').GENZ 05880000 AIF ('&FROM_TP' EQ '0').GEN0 05890000 AIF ('&FROM_TP' EQ 'a').GEN_A 05900000 AIF ('&FROM_TP' EQ 'c').GEN_C 05910000 AIF ('&FROM_TP' EQ 'f').GEN_F 05920000 AIF ('&FROM_TP' EQ 'g').GEN_G 05930000 AIF ('&FROM_TP' EQ 'ga').GEN_GA_ 05940000 AIF ('&FROM' EQ '*STACK').GENSTACK 05950000 AIF ('&FROM_TP' EQ 'p').GEN_P 05960000 MNOTE 12,'Internal error: FROM type &FROM_TP not supported' 05970000 MEXIT , * 05980000 .* 05990000 .* Error messages for generation sections below 06000000 .ERR7A1 MNOTE 8,'Number of registers specified exceeds whole set' 06010000 MEXIT , * 06020000 .ERR7A2 MNOTE 8,'Invalid destination length specified: 0 or negative' 06030000 MEXIT , * 06040000 .ERR7A3 MNOTE 8,'Invalid source length specified: 0 or negative' 06050000 MEXIT , * 06060000 .ERR7A4 MNOTE 8,'Start and end registers have different types' 06070000 MEXIT , * 06080000 .ERR7A5 MNOTE 8,'Destination length in register valid only if destinat*06090000 ion is in register too' 06100000 MEXIT , * 06110000 .ERR7A6 MNOTE 8,'&_TO2 is not a valid length register' 06120000 MEXIT , * 06130000 .ERR7A7 MNOTE 8,'Source length in register valid only if source is in *06140000 register too' 06150000 MEXIT , * 06160000 .ERR7A8 MNOTE 8,'&_FROM2 is not a valid length register' 06170000 MEXIT , * 06180000 .ERR7B MNOTE 8,'Cannot copy from ''&FROM_TP'' to ''&TO_TP'' type of f*06190000 ields' * 06200000 MEXIT , * 06210000 .ERR7C MNOTE 8,'Lengths - implied or specified - do not match' 06220000 MEXIT , * 06230000 .ERR7D MNOTE 8,'Length of destination field exceeds 256' 06240000 MEXIT , * 06250000 .ERR7E MNOTE 8,'Length of source field exceeds 256' 06260000 MEXIT , * 06270000 .ERR7F MNOTE 8,'No register pair available for long move' 06280000 MEXIT , * 06290000 .ERR7G MNOTE 8,'Field is too large to pack' 06300000 MEXIT , * 06310000 .ERR7H MNOTE 8,'No register available to extend sign' 06320000 MEXIT , * 06330000 .ERR7I MNOTE 8,'Destination field is too short' 06340000 MEXIT , * 06350000 .ERR7J MNOTE 8,'Cannot load more than 1 FP register from unaligned fi*06360000 eld' * 06370000 MEXIT , * 06380000 .ERR7K MNOTE 8,'Cannot load an FP register from field with length &FR*06390000 OM_LEN' * 06400000 MEXIT , * 06410000 .ERR7L MNOTE 8,'Cannot copy extended floating point field of less tha*06420000 n 6 bytes' * 06430000 MEXIT , * 06440000 .ERR7M MNOTE 8,'Register &_TO1 does not designate a pair of FP regist*06450000 ers' * 06460000 MEXIT , * 06470000 .ERR7N MNOTE 8,'Packed field is too large to unpack' 06480000 MEXIT , * 06490000 .ERR7O MNOTE 8,'Too many digits in result: cannot unpack' 06500000 MEXIT , * 06510000 .ERR7P MNOTE 8,'&_FROM1 must be 8 bytes long to copy to &_TO1' 06520000 MEXIT , * 06530000 .ERR7Q MNOTE 8,'Cannot load more than 1 register at a time from an S-*06540000 type constant' 06550000 MEXIT , * 06560000 .ERR7R MNOTE 8,'S-type constant must be two bytes long to load a regi*06570000 ster with it' * 06580000 MEXIT , * 06590000 .ERR7S MNOTE 8,'No work register available' 06600000 MEXIT , * 06610000 .ERR7T MNOTE 8,'Cannot load an access register with a literal other t*06620000 han 0, 1, or 2' * 06630000 MEXIT , * 06640000 .ERR7U MNOTE 8,'Cannot copy a negative value into an unsigned field' 06650000 MEXIT , * 06660000 .ERR7V MNOTE 8,'Register &_FROM1 does not designate a pair of FP regi*06670000 sters' * 06680000 MEXIT , * 06690000 .ERR7W MNOTE 8,'Cannot copy more than 1 value to an explicit-length f*06700000 loating point field' * 06710000 MEXIT , * 06720000 .ERR7X MNOTE 8,'Cannot extend negative literal to &TO_LEN bytes' 06730000 MEXIT , * 06740000 .* 06750000 .* From type A: 4-byte address field 06760000 .GENA ANOP , * 06770000 AIF ('&TO_TP' EQ 'A').GENMVC0 * CPY address to address 06780000 AIF ('&TO_TP' EQ 'R').GENMVC0 * CPY address to address 06790000 AIF ('&TO_TP' EQ 'V').GENMVC0 * CPY address to address 06800000 AIF ('&TO_TP' EQ 'Y').GENMVC0 * CPY address to address 06810000 AIF ('&TO_TP' EQ 'g').GENA_G * CPY address to gpr 06820000 AGO .ERR7B * Unsupported combination 06830000 .* 06840000 .* Copy fullword address field to general purpose register(s) 06850000 .GENA_G ANOP , * 06860000 AIF (&TO_LEN EQ 4).GENA_G0 * 1 register to load 06870000 AIF (&TO_LEN NE &FROM_LEN).ERR7C * Lengths equal? 06880000 AGO .DO_LM * Go generate multiple ICMs 06890000 .GENA_G0 ANOP , * 06900000 AIF (&FROM_LEN EQ 4).DO_L * Generate 1 L 06910000 AIF (&FROM_LEN LT 4).GENA_G1 * Clear, then ICM 06920000 &PAD_LEN SETA &FROM_LEN-4 * Nr of excess bytes 06930000 &_FROM1 SETC '&_FROM1'.'+&PAD_LEN' * Adjust source pointer 06940000 &FROM_LEN SETA 4 * Set usable source length 06950000 &I SETA &PAD_LEN/4 * Nr of words padded 06960000 &J SETA &PAD_LEN-(4*&I) * Nr of additional bytes padded 06970000 AIF (&J EQ 0).DO_L * If none: still aligned 06980000 &MASK SETC 'YYYY' * Load 4 unaligned bytes 06990000 AGO .DO_ICM * And go copy to register 07000000 .GENA_G1 ANOP , * Load from short field 07010000 &_LABEL CLEAR &_TO1 * Wipe register before use 07020000 &_LABEL SETC '' * Wipe label after use 07030000 &MASK SETC 'NNNY' * Mask for 1-byte source field 07040000 AIF (&FROM_LEN EQ 1).DO_ICM * Ok: go load register 07050000 &MASK SETC 'NNYY' * Mask for 2-byte source field 07060000 AIF (&FROM_LEN EQ 2).DO_ICM * Ok: go load register 07070000 &MASK SETC 'NYYY' * Mask for 3-byte source field 07080000 AGO .DO_ICM * Source must be 3 bytes long 07090000 .* 07100000 .* From type B: Binary data field (unsigned) 07110000 .GENB ANOP , * 07120000 AIF ('&TO_TP' EQ 'B').GENMVC0 * CPY unsigned to unsigned 07130000 AIF ('&TO_TP' EQ 'X').GENMVC0 * CPY unsigned to unsigned 07140000 AIF ('&TO_TP' EQ 'a').GENB_A * CPY unsigned to ARnn 07150000 AIF ('&TO_TP' EQ 'c').GENB_C * CPY unsigned to CRnn 07160000 AIF ('&TO_TP' EQ 'g').GENB_G * CPY unsigned to Rnn 07170000 AGO .ERR7B * Unsupported combination 07180000 .* 07190000 .* Copy unsigned binary data to access register(s) 07200000 .GENB_A ANOP , * 07210000 AIF (&TO_LEN NE &FROM_LEN).ERR7C * Lengths equal? 07220000 AGO .DO_LAM * Go generate LAM instruction 07230000 .* 07240000 .* Copy unsigned binary data to control register(s) 07250000 .GENB_C ANOP , * 07260000 AIF (&TO_LEN NE &FROM_LEN).ERR7C * Lengths equal? 07270000 AGO .DO_LCTL * Go generate LAM instruction 07280000 .* 07290000 .* Copy unsigned binary data to general purpose register(s) 07300000 .GENB_G ANOP , * 07310000 AIF (&TO_LEN EQ 4).GENB_G0 * 1 register to load 07320000 AIF (&TO_LEN NE &FROM_LEN).ERR7C * Lengths equal? 07330000 AGO .GENICMM * Go generate multiple ICMs 07340000 .GENB_G0 ANOP , * 07350000 &MASK SETC 'YYYY' * 07360000 AIF (&FROM_LEN EQ 4).DO_ICM * Generate 1 ICM 07370000 AIF (&FROM_LEN LT 4).GENB_G1 * Clear, then ICM 07380000 &PAD_LEN SETA &FROM_LEN-4 * Nr of excess bytes 07390000 &_FROM1 SETC '&_FROM1'.'+&PAD_LEN' * Adjust source pointer 07400000 &FROM_LEN SETA 4 * Set usable source length 07410000 AGO .DO_ICM * And go copy to register 07420000 .GENB_G1 ANOP , * Load from short field 07430000 &_LABEL CLEAR &_TO1 * Wipe register before use 07440000 &_LABEL SETC '' * Wipe label after use 07450000 &MASK SETC 'NNNY' * Mask for 1-byte source field 07460000 AIF (&FROM_LEN EQ 1).DO_ICM * Ok: go load register 07470000 &MASK SETC 'NNYY' * Mask for 2-byte source field 07480000 AIF (&FROM_LEN EQ 2).DO_ICM * Ok: go load register 07490000 &MASK SETC 'NYYY' * Mask for 3-byte source field 07500000 AGO .DO_ICM * Source must be 3 bytes long 07510000 .* 07520000 .* From type C: Character data field 07530000 .GENC ANOP , * 07540000 AIF ('&TO_TP' EQ 'C').GENMVCC * CPY char to char 07550000 AGO .ERR7B * Unsupported combination 07560000 .* 07570000 .* From type D: Long floating point field 07580000 .GEND ANOP , * 07590000 AIF ('&TO_TP' EQ 'D').GENKK * CPY float to float 07600000 AIF ('&TO_TP' EQ 'E').GENKK * CPY float to float 07610000 AIF ('&TO_TP' EQ 'K').GENKK * CPY float to float 07620000 AIF ('&TO_TP' EQ 'f').GEND_F * CPY float to FP register 07630000 AGO .ERR7B * Unsupported combination 07640000 .* 07650000 .* Copy a long floating point number to a register 07660000 .GEND_F ANOP , * 07670000 AIF (&TO_LEN NE &FROM_LEN).ERR7C * Lengths equal? 07680000 AIF (&TO_LEN EQ 8).DO_LD * Generate 1 LD 07690000 AGO .GENLDM * Generate several LDs 07700000 .* 07710000 .* From type E: Short floating point field 07720000 .GENE ANOP , * 07730000 AIF ('&TO_TP' EQ 'D').GENKK * CPY float to float 07740000 AIF ('&TO_TP' EQ 'E').GENKK * CPY float to float 07750000 AIF ('&TO_TP' EQ 'K').GENKK * CPY float to float 07760000 AIF ('&TO_TP' EQ 'f').GENE_F * CPY float to FP register 07770000 AGO .ERR7B * Unsupported combination 07780000 .* 07790000 .* Copy a short floating point number to a register 07800000 .GENE_F ANOP , * 07810000 AIF (&TO_LEN NE 2*&FROM_LEN).ERR7C * Lengths equal? 07820000 AIF (&TO_LEN EQ 8).DO_LE * Generate 1 LE 07830000 AGO .GENLEM * Generate several LEs 07840000 .* 07850000 .* From type F: Signed fullword 07860000 .GENF ANOP , * 07870000 AIF ('&TO_TP' EQ 'F').GENGG * CPY signed to signed 07880000 AIF ('&TO_TP' EQ 'G').GENGG * CPY signed to signed 07890000 AIF ('&TO_TP' EQ 'H').GENGG * CPY signed to signed 07900000 AIF ('&TO_TP' EQ 'g').GENF_G * CPY signed to register 07910000 AGO .ERR7B * Unsupported combination 07920000 .* 07930000 .* Copy a signed fullword to a register 07940000 .GENF_G ANOP , * 07950000 AIF (&TO_LEN LE 4).GENICM * Generate 1 ICM/L/LH 07960000 AIF (&TO_LEN NE &FROM_LEN).ERR7C * Lengths equal? 07970000 AGO .DO_LM * Generate 1 LM 07980000 .* 07990000 .* From type G: Unaligned signed 08000000 .GENG ANOP , * 08010000 AIF ('&TO_TP' EQ 'F').GENGG * CPY signed to signed 08020000 AIF ('&TO_TP' EQ 'G').GENGG * CPY signed to signed 08030000 AIF ('&TO_TP' EQ 'H').GENGG * CPY signed to signed 08040000 AIF ('&TO_TP' EQ 'g').GENG_G * CPY signed to register 08050000 AGO .ERR7B * Unsupported combination 08060000 .* 08070000 .* Copy an unaligned signed number 08080000 .GENGG ANOP , * 08090000 AIF (&TO_LEN GT 256).ERR7D * 08100000 AIF (&FROM_LEN GT 256).ERR7E * 08110000 AIF (&TO_LEN LE &FROM_LEN).GENMVC0 * Copy or truncate 08120000 AIF (&TO_LEN GT 8).GENGG20 * Cannot use registers to extend 08130000 AIF (&TO_LEN GT 4).GENGG6 * Must use pair of regs 08140000 .* Source and extended dest.value both fit in a single register 08150000 EQUREG R0=YES,TEMP=YES * Assign a register 08160000 AIF (&BXA_RC GT 0).ERR7H * No reg available! 08170000 ® SETC 'R'.'&BXA_NUMVAL' * Create register name 08180000 &MASK SETC 'YNNN' * Mask for 1-byte value 08190000 &I SETA 24 * Nr of bits to shift 08200000 AIF (&FROM_LEN EQ 1).GENGG0 * Go load value 08210000 &MASK SETC 'YYNN' * Mask for 2-byte value 08220000 &I SETA 16 * Nr of bits to shift 08230000 AIF (&FROM_LEN EQ 2 AND '&FROM_TP' NE 'G').GENGG1 08240000 AIF (&FROM_LEN EQ 2).GENGG0 * Go load value 08250000 &MASK SETC 'YYYN' * Length MUST be 3 bytes! 08260000 &I SETA 8 * Nr of bits to shift 08270000 .GENGG0 ANOP , * Use ICM to load value 08280000 &_LABEL ICM ®,&MASK,&_FROM1 * Load source value 08290000 &_LABEL SETC '' * Wipe used label 08300000 SRA ®,&I * Create fullword value 08310000 AGO .GENGG2 * Go save value in dest field 08320000 .GENGG1 ANOP , * Happens to be aligned! 08330000 &_LABEL LH ®,&_FROM1 * Load source value 08340000 &_LABEL SETC '' * Wipe used label 08350000 .GENGG2 ANOP , * Value now in ® 08360000 &MASK SETC 'NNYY' * Min.dest.size is 2 bytes! 08370000 AIF (&TO_LEN EQ 2 AND '&TO_TP' NE 'G').GENGG4 08380000 AIF (&TO_LEN EQ 2).GENGG3 * Go save value 08390000 &MASK SETC 'NYYY' * Mask for 3-byte value 08400000 AIF (&TO_LEN EQ 3).GENGG3 * Go save value 08410000 &MASK SETC 'YYYY' * MUST be 4 bytes long! 08420000 AIF ('&TO_TP' EQ 'F').GENGG5 * Go save value 08430000 .GENGG3 ANOP , * Save value using STCM 08440000 STCM ®,&MASK,&_TO1 * Save extended value 08450000 MEXIT , * 08460000 .GENGG4 ANOP , * Go save value using STH 08470000 STH ®,&_TO1 * Save extended value 08480000 MEXIT , * 08490000 .GENGG5 ANOP , * Go save value using ST 08500000 ST ®,&_TO1 * Save extended value 08510000 MEXIT , * 08520000 .* Extend up to 8 bytes using a pair of registers 08530000 .GENGG6 ANOP , * 08540000 EQUREG R0=YES,TEMP=YES,PAIR=YES,WARN=NO * Assign pair of regs 08550000 AIF (&BXA_RC GT 0).GENGG20 * No pair available! 08560000 ® SETC 'R'.'&BXA_NUMVAL' * Create register name 08570000 &I SETA &BXA_NUMVAL+1 * Nr of odd register 08580000 &ODDREG SETC 'R'.'&I' * Odd register name 08590000 &MASK SETC 'YNNN' * Mask for a 1-byte value 08600000 &I SETA 56 * Nr of bits to shift 08610000 AIF (&FROM_LEN EQ 1).GENGG7 * Go load 1-byte value 08620000 &MASK SETC 'YYNN' * Mask for a 1-byte value 08630000 &I SETA 48 * Nr of bits to shift 08640000 AIF (&FROM_LEN EQ 2 AND '&FROM_TP' NE 'G').GENGG8 * 08650000 AIF (&FROM_LEN EQ 2).GENGG7 * Go load 2-byte value 08660000 &MASK SETC 'YYYN' * Mask for a 3-byte value 08670000 &I SETA 40 * Nr of bits to shift 08680000 AIF (&FROM_LEN EQ 3).GENGG7 * Go load 3-byte value 08690000 &MASK SETC 'YYYY' * Mask for a 4-byte value 08700000 &I SETA 32 * Nr of bits to shift 08710000 AIF (&FROM_LEN EQ 4 AND '&FROM_TP' EQ 'F').GENGG9 * 08720000 AIF (&FROM_LEN EQ 4).GENGG7 * Go load 4-byte value 08730000 AGO .GENGG10 * Go load larger values 08740000 .GENGG7 ANOP , * ICM value up to 4 bytes with 08750000 &_LABEL ICM ®,&MASK,&_FROM1 * Load value 08760000 &_LABEL SETC '' * Remove used label 08770000 SRDA ®,&I * Create 8-byte value 08780000 AGO .GENGG14 * Go save created value 08790000 .GENGG8 ANOP , * LH value of 2 bytes 08800000 &_LABEL LH ®,&_FROM1 * Load value 08810000 &_LABEL SETC '' * Remove used label 08820000 SRDA ®,32 * Create 8-byte value 08830000 AGO .GENGG14 * Go save created value 08840000 .GENGG9 ANOP , * Load 4-byte value 08850000 &_LABEL L ®,&_FROM1 * Load value 08860000 &_LABEL SETC '' * Remove used label 08870000 SRDA ®,32 * Create 8-byte value 08880000 AGO .GENGG14 * Go save created value 08890000 .* Source for move is 5 to 7 bytes long 08900000 .GENGG10 ANOP , * 08910000 &MASK SETC 'YNNN' * Mask for a 5-byte value 08920000 &I SETA 24 * Nr of bits to shift 08930000 AIF (&FROM_LEN EQ 5).GENGG11 * Go load 5-byte value 08940000 &MASK SETC 'YYNN' * Mask for a 6-byte value 08950000 &I SETA 16 * Nr of bits to shift 08960000 AIF (&FROM_LEN EQ 6 AND '&FROM_TP' NE 'G').GENGG12 08970000 AIF (&FROM_LEN EQ 6).GENGG11 * Go load 6-byte value 08980000 &MASK SETC 'YYYN' * Mask for a 7-byte value 08990000 &I SETA 8 * Nr of bits to shift 09000000 .GENGG11 ANOP , * 09010000 &_LABEL ICM ®,&MASK,&_FROM1 * Load source data 09020000 &_LABEL SETC '' * Remove used label 09030000 SRA ®,&I * Create first fullword of value 09040000 AGO .GENGG13 * Go load second register 09050000 .GENGG12 ANOP , * Source aligned: use LH 09060000 &_LABEL LH ®,&_FROM1 * Load source data 09070000 &_LABEL SETC '' * Remove used label 09080000 .GENGG13 ANOP , * First register now ok 09090000 &I SETA &I/8 * Set I to nr of bytes shifted 09100000 &I SETA 4-&I * Set I to nr of bytes loaded 09110000 ICM &ODDREG,YYYY,&_FROM1+&I * Load second register 09120000 .GENGG14 ANOP , * Value in reg.pair can be saved 09130000 &MASK SETC 'NNNY' * 5 bytes is shortest possible 09140000 &I SETA 1 * Offset for 2nd register 09150000 AIF (&TO_LEN EQ 5).GENGG15 * Save 5-byte value 09160000 &MASK SETC 'NNYY' * Mask for 6-byte value 09170000 &I SETA 2 * Offset for 2nd register 09180000 AIF (&TO_LEN EQ 6 AND '&TO_TP' NE 'G').GENGG16 * 09190000 AIF (&TO_LEN EQ 6).GENGG15 * Save 6-byte value 09200000 &MASK SETC 'NYYY' * Mask for 7-byte value 09210000 &I SETA 3 * Offset for 2nd register 09220000 AIF (&TO_LEN EQ 7).GENGG15 * Save 7-byte value 09230000 &MASK SETC 'YYYY' * Mask for 8-byte value 09240000 &I SETA 4 * Offset for 2nd register 09250000 AIF ('&TO_TP' NE 'F').GENGG15 * Save 8-byte value 09260000 STM ®,&ODDREG,&_TO1 * Aligned! Use STM 09270000 MEXIT , * 09280000 .GENGG15 ANOP , * Save value with STCM 09290000 STCM ®,&MASK,&_TO1 * Save first part of result 09300000 STCM &ODDREG,YYYY,&_TO1+&I * Save second register 09310000 MEXIT , * 09320000 .GENGG16 ANOP , * Save value with STH/STCM 09330000 STH ®,&_TO1 * Save first part of result 09340000 STCM &ODDREG,YYYY,&_TO1+&I * Save second register 09350000 MEXIT , * 09360000 .* Logic for extending in storage 09370000 .GENGG20 ANOP , * &TO_LEN greater than 4 09380000 &PAD_LEN SETA &TO_LEN-&FROM_LEN * Nr of sign bytes to add 09390000 EQUREG R0=YES,TEMP=YES * Assign a register 09400000 AIF (&BXA_RC NE 0).ERR7H * Error 09410000 ® SETC 'R'.'&BXA_NUMVAL' * Create register name 09420000 &_LABEL ICM ®,YNNN,&_FROM1 * Load first byte of source 09430000 &_LABEL SETC '' * Wipe used-up label 09440000 SRA ®,31 * Create 4 sign bytes 09450000 &MASK SETC 'YNNN' * Mask for 1 sign byte 09460000 AIF (&PAD_LEN EQ 1).GENGG21 * Go fill pad-area 09470000 &MASK SETC 'YYNN' * Mask for 2 sign bytes 09480000 AIF (&PAD_LEN EQ 2 AND '&TO_TP' NE 'G').GENGG22 * 09490000 AIF (&PAD_LEN EQ 2).GENGG21 * Go fill pad-area 09500000 &MASK SETC 'YYYN' * Mask for 3 sign bytes 09510000 AIF (&PAD_LEN EQ 3).GENGG21 * Go fill pad-area 09520000 &MASK SETC 'YYYY' * Mask for 4 sign bytes 09530000 AIF (&PAD_LEN EQ 4 AND '&TO_TP' EQ 'F').GENGG23 * 09540000 AIF (&PAD_LEN EQ 4).GENGG21 * Go fill pad-area 09550000 &MASK SETC 'YNNN' * Mask for 1 sign byte 09560000 .GENGG21 ANOP , * Set up sign with STCM 09570000 STCM ®,&MASK,&_TO1 * Save sign byte(s) 09580000 AIF (&PAD_LEN LE 4).GENGG24 * Go copy value bytes 09590000 MVC &_TO1+1(&PAD_LEN-1),&_TO1 * Propagate byte, extend sign 09600000 AGO .GENGG24 * Go extend sign (if needed) 09610000 .GENGG22 ANOP , * Set up sign with STH 09620000 STH ®,&_TO1 * Save sign bytes 09630000 AGO .GENGG24 * Go copy value bytes 09640000 .GENGG23 ANOP , * Set up sign with STH 09650000 ST ®,&_TO1 * Save sign bytes 09660000 .GENGG24 ANOP , * Copy value bytes 09670000 MVC &_TO1+&PAD_LEN.(&FROM_LEN),&_FROM1 * Copy value 09680000 MEXIT , * 09690000 .* 09700000 .* Copy an unaligned signed number to a register 09710000 .GENG_G ANOP , * 09720000 AIF (&TO_LEN LE 4).GENICM * Generate 1 ICM/L/LH 09730000 AIF (&TO_LEN NE &FROM_LEN).ERR7C * Lengths equal? 09740000 AGO .GENICMM * Generate several ICMs 09750000 .* 09760000 .* From type H: Signed halfword 09770000 .GENH ANOP , * 09780000 AIF ('&TO_TP' EQ 'F').GENGG * CPY signed to signed 09790000 AIF ('&TO_TP' EQ 'G').GENGG * CPY signed to signed 09800000 AIF ('&TO_TP' EQ 'H').GENGG * CPY signed to signed 09810000 AIF ('&TO_TP' EQ 'g').GENH_G * CPY signed to register 09820000 AGO .ERR7B * Unsupported combination 09830000 .* 09840000 .* Copy a signed halfword to a register 09850000 .GENH_G ANOP , * 09860000 AIF (&TO_LEN LE 4).GENICM * Generate 1 ICM/L/LH 09870000 AIF (&TO_LEN NE 2*&FROM_LEN).ERR7C * Lengths equal? 09880000 AGO .GENLHM * Generate several LHs 09890000 .* 09900000 .* From type K: Unaligned floating point field 09910000 .GENK ANOP , * 09920000 AIF ('&TO_TP' EQ 'D').GENKK * CPY float to float 09930000 AIF ('&TO_TP' EQ 'E').GENKK * CPY float to float 09940000 AIF ('&TO_TP' EQ 'K').GENKK * CPY float to float 09950000 AIF ('&TO_TP' EQ 'f').GENK_F * CPY float to FP register 09960000 AGO .ERR7B * Unsupported combination 09970000 .* 09980000 .* Copy a floating point number 09990000 .GENKK ANOP , * 10000000 AIF (&TO_LEN GT 256).ERR7D * 10010000 AIF (&FROM_LEN GT 256).ERR7E * 10020000 AIF (&TO_LEN EQ &FROM_LEN).DO_MVC * Lengths equal? 10030000 &PAD0 SETB 1 * Use zeros for padding 10040000 &PAD_LEN SETA 0 * Nr of padding bytes needed 10050000 &LEN SETA &TO_LEN * Determine length of move 10060000 AIF (&TO_LEN LE &FROM_LEN).GENKK1 10070000 &LEN SETA &FROM_LEN * FROM-length is shorter 10080000 &PAD_LEN SETA &TO_LEN-&LEN * Nr of padding bytes needed 10090000 &TO_LEN SETA &LEN * Truncate destination field 10100000 .GENKK1 ANOP , * &LEN now effective length 10110000 AIF (&PAD_LEN LT 1).DO_MVC * No padding required: use MVC 10120000 &_LABEL CLEAR (&_TO1+&LEN,&PAD_LEN),,XC * Wipe padding area 10130000 &_LABEL SETC '' * Label no longer needed 10140000 AGO .DO_MVC * 10150000 .* 10160000 .* Copy an unaligned floating point number to a register 10170000 .GENK_F ANOP , * 10180000 AIF (&TO_LEN NE 8).ERR7J * 1 register only? 10190000 AIF (&FROM_LEN EQ 4).DO_LE * Generate 1 LE 10200000 AIF (&FROM_LEN EQ 8).DO_LD * Generate 1 LD 10210000 AGO .ERR7K * Error 10220000 .* 10230000 .* From type L: Extended floating point field 10240000 .GENL ANOP , * 10250000 AIF ('&TO_TP' EQ 'L').GENLL * CPY float to float 10260000 AIF ('&TO_TP' EQ 'f').GENL_F * CPY float to FP register pair 10270000 AGO .ERR7B * Unsupported combination 10280000 .* 10290000 .* Copy an extended floating point number 10300000 .GENLL ANOP , * 10310000 AIF (&TO_LEN GT 256).ERR7D * 10320000 AIF (&FROM_LEN GT 256).ERR7E * 10330000 AIF (&TO_LEN EQ &FROM_LEN).DO_MVC * Lengths equal? 10340000 AIF (&FROM_LEN LT 6).ERR7L * Source too short 10350000 AIF (&TO_LEN LT 6).ERR7L * Destination too short 10360000 AGO .GENKK * Otherwise: copy float field 10370000 .* 10380000 .* Copy an extended floating point number to a register 10390000 .GENL_F ANOP , * 10400000 AIF (K'&_TO2 EQ 0).GENL_F1 * Just a register spec'd? 10410000 AIF (NOT &TO_EREG).GENL_F2 * End register specified? 10420000 .GENL_F1 ANOP , * 10430000 &TO_LEN SETA &TO_LEN+8 * Yes: add length of odd reg 10440000 .GENL_F2 ANOP , * &TO_LEN is now correct 10450000 AIF (&TO_LEN NE &FROM_LEN).ERR7C * Lengths equal? 10460000 AGO .GENLXM * Generate several LDs 10470000 .* 10480000 .* From type P: Packed decimal field 10490000 .GENP ANOP , * 10500000 AIF ('&TO_TP' EQ 'P').GENPP * CPY packed to packed 10510000 AIF ('&TO_TP' EQ 'Z').GENPZ * CPY packed to zoned 10520000 AIF ('&TO_TP' EQ 'g').GENP_G * CPY packed to register 10530000 AGO .ERR7B * Unsupported combination 10540000 .* 10550000 .* Copy a packed field 10560000 .GENPP ANOP , * 10570000 AIF (&TO_LEN GT 256).ERR7D * 10580000 AIF (&FROM_LEN GT 256).ERR7E * 10590000 AIF (&FROM_LEN EQ &TO_LEN).DO_MVC 10600000 AIF (&FROM_LEN LE 16 AND &TO_LEN LE 16).DO_ZAP 10610000 AIF (&FROM_LEN GT &TO_LEN).GENPP0 10620000 &PAD_LEN SETA &TO_LEN-&FROM_LEN * Nr of prefix zeros to add 10630000 &_LABEL CLEAR (&_TO1,&PAD_LEN),X'00' * Wipe area 10640000 &_LABEL SETC '' * Wipe used label 10650000 MVC &_TO1+&PAD_LEN.(&FROM_LEN),&_FROM1 * Copy decimal data 10660000 MEXIT , * 10670000 .GENPP0 ANOP , * Source is larger 10680000 &PAD_LEN SETA &FROM_LEN-&TO_LEN * Nr of excess source bytes 10690000 &_FROM1 SETC '&_FROM1'.'+&PAD_LEN' * Skip excess bytes 10700000 AGO .DO_MVC * 10710000 .* 10720000 .* Copy a packed field to a zoned field 10730000 .GENPZ ANOP , * 10740000 AIF (&TO_LEN GT 256).ERR7D * 10750000 AIF (&FROM_LEN GT 256).ERR7E * 10760000 &I SETA 2*&FROM_LEN-1 * Nr of digits 10770000 &PAD_LEN SETA &TO_LEN-&I * Nr of zeroes to append 10780000 AIF (&PAD_LEN LT 1).GENPZ0 * No leading zeroes required 10790000 &_LABEL CLEAR (&_TO1,&PAD_LEN),C'0' * Initialize with leading zeros 10800000 &_LABEL SETC '' * Remove used label 10810000 &_TO1 SETC '&_TO1'.'+&PAD_LEN' * Modify destination field 10820000 &TO_LEN SETA &I * and reduce its length 10830000 .GENPZ0 ANOP , * 10840000 AIF (&FROM_LEN GT 16).ERR7N * Source too large 10850000 AIF (&TO_LEN GT 16).ERR7O * Destination too large 10860000 AGO .DO_UNPK * 10870000 .* 10880000 .* Copy a packed number to a register 10890000 .GENP_G ANOP , * 10900000 AIF (&TO_LEN NE 4).GENP_G0 * 1 register only? 10910000 AIF (&FROM_LEN EQ 8).DO_CVB * 10920000 AIF (&FROM_LEN LT 8).ERR7P * Source too short 10930000 &I SETA &FROM_LEN-8 * Excess digits 10940000 &_FROM1 SETC '&_FROM1'.'+&I' * Skip excess digits 10950000 &_FROM_LEN SETA 8 * Adjust length 10960000 AGO .DO_CVB * And go load register 10970000 .GENP_G0 ANOP , * 10980000 AIF (2*&TO_LEN NE &FROM_LEN).ERR7C * Lengths equal? 10990000 AGO .GENCVBM * Generate several CVBs 11000000 .* 11010000 .* From type Q: 4-byte offset address field 11020000 .GENQ ANOP , * 11030000 AIF ('&TO_TP' EQ 'Q').GENMVC0 * CPY address to address 11040000 AIF ('&TO_TP' EQ 'R').GENMVC0 * CPY address to address 11050000 AIF ('&TO_TP' EQ 'g').GENA_G * CPY address to gpr 11060000 AGO .ERR7B * Unsupported combination 11070000 .* 11080000 .* From type R: unaligned address field 11090000 .GENR ANOP , * 11100000 AIF ('&TO_TP' EQ 'A').GENMVC0 * CPY address to address 11110000 AIF ('&TO_TP' EQ 'Q').GENMVC0 * CPY address to address 11120000 AIF ('&TO_TP' EQ 'R').GENMVC0 * CPY address to address 11130000 AIF ('&TO_TP' EQ 'S').GENRS * CPY address to address 11140000 AIF ('&TO_TP' EQ 'V').GENMVC0 * CPY address to address 11150000 AIF ('&TO_TP' EQ 'Y').GENMVC0 * CPY address to address 11160000 AIF ('&TO_TP' EQ 'g').GENA_G * CPY address to gpr 11170000 AGO .ERR7B * Unsupported combination 11180000 .* 11190000 .* Copy an unaligned address field to an S-type address field 11200000 .GENRS ANOP , * 11210000 AIF (&TO_LEN GT 256).ERR7D * 11220000 AIF (&FROM_LEN GT 256).ERR7E * 11230000 AIF (&TO_LEN NE &FROM_LEN).ERR7C * Lengths equal? 11240000 AGO .DO_MVC * 11250000 .* 11260000 .* From type S: 2-byte address field - base-displacement 11270000 .GENS ANOP , * 11280000 AIF ('&TO_TP' EQ 'R').GENSS * CPY address to address 11290000 AIF ('&TO_TP' EQ 'S').GENSS * CPY address to address 11300000 AIF ('&TO_TP' EQ 'g').GENS_G * CPY address to gpr 11310000 AGO .ERR7B * Unsupported combination 11320000 .* 11330000 .* Copy an S-type address field to a field 11340000 .GENSS ANOP , * 11350000 AIF (&TO_LEN GT 256).ERR7D * 11360000 AIF (&FROM_LEN GT 256).ERR7E * 11370000 AIF (&TO_LEN NE &FROM_LEN).ERR7C * Lengths equal? 11380000 AGO .DO_MVC * 11390000 .* 11400000 .* Copy an S-type address field to a register 11410000 .GENS_G ANOP , * 11420000 AIF (&TO_LEN NE 4).ERR7Q * Only 1 register! 11430000 AIF (&FROM_LEN NE 2).ERR7R * Must be two bytes long! 11440000 EQUREG TEMP=YES * Assign work register 11450000 AIF (&BXA_RC NE 0).ERR7S * 11460000 AIF (&BXA_NUMVAL NE &TO_REG).GENS_G0 11470000 USE &_TO1 * Set register in use 11480000 EQUREG TEMP=YES * Assign work register 11490000 &I SETA &BXA_RC * Save returncode 11500000 &J SETA &BXA_NUMVAL * and return value 11510000 DROP &_TO1 * End of forced register use 11520000 AIF (&BXA_RC NE 0).ERR7S * No work register available 11530000 .GENS_G0 ANOP , * Register allocated correctly 11540000 ® SETC 'R'.'&BXA_NUMVAL' * Create register name 11550000 &_LABEL LH ®,&_FROM1 * Load whole S-constant 11560000 &_LABEL SETC '' * Wipe used label 11570000 SRL ®,12 * Base register nr in low-order 11580000 LA &_TO1,16*&_TO1 * Load register with its number 11590000 OR ®,&_TO1 * ® now contains &to,&base 11600000 EX ®,_CPY&SYSNDX * Copy base to destination reg 11610000 B _CPY_&SYSNDX * Skip executable instruction 11620000 _CPY&SYSNDX LABEL , * 11630000 DC X'1800' * LR instruction 11640000 _CPY_&SYSNDX LABEL , * 11650000 LH ®,&_FROM1 * Reload S-constant 11660000 SLL ®,20 * Remove register number 11670000 SRL ®,20 * Keep offset in low-order bits 11680000 AR &_TO1,® * Create result value 11690000 MEXIT , * 11700000 .* 11710000 .* From type V: 4-byte address field 11720000 .GENV ANOP , * 11730000 AIF ('&TO_TP' EQ 'A').GENMVC0 * CPY address to address 11740000 AIF ('&TO_TP' EQ 'R').GENMVC0 * CPY address to address 11750000 AIF ('&TO_TP' EQ 'V').GENMVC0 * CPY address to address 11760000 AIF ('&TO_TP' EQ 'Y').GENMVC0 * CPY address to address 11770000 AIF ('&TO_TP' EQ 'g').GENA_G * CPY address to gpr 11780000 AGO .ERR7B * Unsupported combination 11790000 .* 11800000 .* From type X: Hexadecimal data field (unsigned) 11810000 .GENX ANOP , * 11820000 AIF ('&TO_TP' EQ 'B').GENMVC0 * CPY unsigned to unsigned 11830000 AIF ('&TO_TP' EQ 'X').GENMVC0 * CPY unsigned to unsigned 11840000 AIF ('&TO_TP' EQ 'a').GENB_A * CPY unsigned to ARnn 11850000 AIF ('&TO_TP' EQ 'c').GENB_C * CPY unsigned to CRnn 11860000 AIF ('&TO_TP' EQ 'g').GENB_G * CPY unsigned to Rnn 11870000 AGO .ERR7B * Unsupported combination 11880000 .* 11890000 .* From type Y: 2-byte address field 11900000 .GENY ANOP , * 11910000 AIF ('&TO_TP' EQ 'A').GENMVC0 * CPY address to address 11920000 AIF ('&TO_TP' EQ 'R').GENMVC0 * CPY address to address 11930000 AIF ('&TO_TP' EQ 'V').GENMVC0 * CPY address to address 11940000 AIF ('&TO_TP' EQ 'Y').GENMVC0 * CPY address to address 11950000 AIF ('&TO_TP' EQ 'g').GENY_G * CPY address to gpr 11960000 AGO .ERR7B * Unsupported combination 11970000 .* 11980000 .* Copy halfword address field to general purpose register(s) 11990000 .GENY_G ANOP , * 12000000 AIF (&TO_LEN NE 2*&FROM_LEN).ERR7C * Lengths equal? 12010000 &I SETA &TO_REG * Save first register number 12020000 &J SETA 0 * Offset in source field 12030000 .GENY_G0 ANOP , * Loop 12040000 &_LABEL LTHU &_TO1,&_FROM1+&J * 12050000 &_LABEL SETC '' * Remove label after use 12060000 &TO_LEN SETA &TO_LEN-4 * Reduce length 12070000 AIF (&TO_LEN LT 4).MEXIT * No registers left to fill 12080000 &J SETA &J+2 * Point next halfword 12090000 &I SETA &I+1 * Next register number 12100000 AIF (&I LT 16).GENY_G1 * Valid register nr 12110000 &I SETA 0 * Wrap-around to R0 12120000 .GENY_G1 ANOP , * I now next register nr 12130000 &_TO1 SETC 'R'.'&I' * Create next register name 12140000 AGO .GENY_G0 * 12150000 .* 12160000 .* From type Z: Zoned decimal field 12170000 .GENZ ANOP , * 12180000 AIF ('&TO_TP' EQ 'P').GENZP * CPY zoned to packed 12190000 AIF ('&TO_TP' EQ 'Z').GENZZ * CPY zoned to zoned 12200000 AGO .ERR7B * Unsupported combination 12210000 .* 12220000 .* Copy a zoned field to a packed field 12230000 .GENZP ANOP , * 12240000 AIF (&TO_LEN GT 256).ERR7D * 12250000 AIF (&FROM_LEN GT 256).ERR7E * 12260000 &I SETA (&FROM_LEN/2)+1 * Nr of result bytes 12270000 &PAD_LEN SETA &TO_LEN-&I * Nr of zeroes to append 12280000 AIF (&PAD_LEN LT 1).GENZP0 * No leading zeroes required 12290000 &_LABEL CLEAR (&_TO1,&PAD_LEN),,XC * Initialize with leading zeros 12300000 &_LABEL SETC '' * Remove used label 12310000 &_TO1 SETC '&_TO1'.'+&PAD_LEN' * Modify destination field 12320000 &TO_LEN SETA &I * and reduce its length 12330000 .GENZP0 ANOP , * 12340000 AIF (&FROM_LEN GT 16).ERR7G * Source too large 12350000 AGO .DO_PACK * 12360000 .* 12370000 .* Copy a zoned decimal field 12380000 .GENZZ ANOP , * 12390000 AIF (&TO_LEN GT 256).ERR7D * 12400000 AIF (&FROM_LEN GT 256).ERR7E * 12410000 AIF (&TO_LEN EQ &FROM_LEN).DO_MVC 12420000 &PAD_LEN SETA &TO_LEN-&FROM_LEN * Nr of leading zeros 12430000 AIF (&PAD_LEN LT 1).GENZZ0 * No leading zeros required 12440000 &_LABEL CLEAR (&_TO1,&PAD_LEN),C'0' * 12450000 &_LABEL SETC '' * Wipe used label 12460000 &_TO1 SETC '&_TO1'.'+&PAD_LEN' * Advance destination address 12470000 &TO_LEN SETA &FROM_LEN * 12480000 AGO .DO_MVC * And go copy data portion 12490000 .GENZZ0 ANOP , * Trucation required 12500000 &PAD_LEN SETA &FROM_LEN-&TO_LEN * Nr of bytes to skip 12510000 &_FROM1 SETC '&_FROM1'.'+&PAD_LEN' * Advannce source address 12520000 &FROM_LEN SETA &TO_LEN * 12530000 AGO .DO_MVC * And go copy data portion 12540000 .* 12550000 .* From type 0: Literal number 12560000 .GEN0 ANOP , * 12570000 AIF ('&TO_TP' EQ 'B').GEN0B * CPY number to unsigned 12580000 AIF ('&TO_TP' EQ 'D').GEN0K * CPY number to long float 12590000 AIF ('&TO_TP' EQ 'E').GEN0K * CPY number to short float 12600000 AIF ('&TO_TP' EQ 'F').GEN0G * CPY number to fixed 12610000 AIF ('&TO_TP' EQ 'G').GEN0G * CPY number to fixed 12620000 AIF ('&TO_TP' EQ 'H').GEN0G * CPY number to fixed 12630000 AIF ('&TO_TP' EQ 'K').GEN0K * CPY number to float 12640000 AIF ('&TO_TP' EQ 'L').GEN0L * CPY number to extended float 12650000 AIF ('&TO_TP' EQ 'P').GEN0P * CPY number to packed 12660000 AIF ('&TO_TP' EQ 'X').GEN0B * CPY number to unsigned 12670000 AIF ('&TO_TP' EQ 'Z').GEN0Z * CPY number to zoned 12680000 AIF ('&TO_TP' EQ 'a').GEN0_A * CPY number to access register 12690000 AIF ('&TO_TP' EQ 'f').GEN0_F * CPY number to float register 12700000 AIF ('&TO_TP' EQ 'g').GEN0_G * CPY number to register 12710000 AGO .ERR7B * Unsupported combination 12720000 .* 12730000 .* Copy a literal number to an unsigned field 12740000 .GEN0B ANOP , * 12750000 AIF (&TO_LEN GT 256).ERR7D * 12760000 AIF (&TO_LEN LT &FROM_LEN).ERR7I * FROM_LEN <= 4 for literal 12770000 AIF (&FROM_VAL LT 0).ERR7U * FROM_LEN <= 4 for literal 12780000 AIF (&TO_LEN LE 4).GEN0B0 * Just an MVC please 12790000 &PAD_LEN SETA &TO_LEN-&FROM_LEN * Nr of leading zeros needed 12800000 AIF (&PAD_LEN LT 1).GEN0B0 * No padding needed 12810000 &_LABEL CLEAR (&_TO1,&PAD_LEN),,XC * Wipe prefix area 12820000 &_LABEL SETC '' * Remove used label 12830000 &_TO1 SETC '&_TO1'.'+&PAD_LEN' * Adjust destination for move 12840000 &TO_LEN SETA &FROM_LEN * and length too 12850000 .GEN0B0 ANOP , * 12860000 AIF (&TO_LEN EQ 1).GEN0_MVI * Use MVI for 1-byte fields 12870000 &_FROM1 SETC '=AL&TO_LEN'.'(&_FROM1)' * Create literal to copy 12880000 AGO .GEN0_MVC * Go generate MVC to copy 12890000 .* 12900000 .* Copy a literal number to a signed field 12910000 .GEN0G ANOP , * 12920000 AIF (&TO_LEN GT 256).ERR7D * 12930000 AIF (&FROM_VAL EQ 0).GEN0G0 * Zero value requested? 12940000 AIF (&TO_LEN LT &FROM_LEN).ERR7I * FROM_LEN <= 4 for literal 12950000 AIF (&TO_LEN LE 4).GEN0G1 * Just an MVC please 12960000 &PAD_LEN SETA &TO_LEN-&FROM_LEN * Nr of leading zeros needed 12970000 AIF (&PAD_LEN LT 1).GEN0G1 * No padding needed 12980000 AIF ('&SIGN' EQ '-').ERR7X * 12990000 &_LABEL CLEAR (&_TO1,&PAD_LEN),,XC * Wipe prefix area 13000000 &_LABEL SETC '' * Remove used label 13010000 &_TO1 SETC '&_TO1'.'+&PAD_LEN' * Adjust destination for move 13020000 &TO_LEN SETA &FROM_LEN * and length too 13030000 AGO .GEN0G1 * 13040000 .GEN0G0 ANOP , * 13050000 &_LABEL CLEAR (&_TO1,&TO_LEN),,XC * Insert zero value 13060000 MEXIT , * 13070000 .GEN0G1 ANOP , * 13080000 AIF (&TO_LEN EQ 1).GEN0_MVI * Use MVI for 1-byte fields 13090000 AIF (&EQULIT).GEN0G2 * 13100000 &_FROM1 SETC '=FL&TO_LEN'.'''&_FROM1''' * Create literal 13110000 AGO .GEN0_MVC * Go generate MVC to copy 13120000 .GEN0G2 ANOP , * 13130000 &_FROM1 SETC '=FL&TO_LEN'.'''&FROM_VAL''' * Create literal 13140000 AGO .GEN0_MVC * Go generate MVC to copy 13150000 .* 13160000 .* Copy a literal number to a floating point field 13170000 .GEN0K ANOP , * 13180000 AIF (&TO_LEN GT 256).ERR7D * 13190000 &FROM_LEN SETA &FROM_LEN+1 * Add room for exponent byte 13200000 AIF (&TO_LEN LT &FROM_LEN).ERR7I * FROM_LEN <= 5 for literal 13210000 AIF (&FROM_LEN GE 5).GEN0K0 * May be useful to expand 13220000 AIF (&FROM_LEN EQ &TO_LEN).GEN0K2 * literal length 13230000 AIF (&TO_LEN GE 5).GEN0K0 * to accomodate value 13240000 &FROM_LEN SETA &TO_LEN * 13250000 AGO .GEN0K2 * No padding required! 13260000 .GEN0K0 ANOP , * 13270000 &PAD_LEN SETA &TO_LEN-&FROM_LEN * Nr of padding zeros needed 13280000 AIF (&PAD_LEN LT 1).GEN0K2 * No padding needed 13290000 AIF ('&SIGN' EQ '-').ERR7X * 13300000 &_LABEL CLEAR (&_TO1+&FROM_LEN,&PAD_LEN),,XC * Wipe prefix area 13310000 &_LABEL SETC '' * Remove used label 13320000 &TO_LEN SETA &FROM_LEN * Adjust length of dest.field 13330000 .GEN0K2 ANOP , * 13340000 AIF (&TO_LEN EQ 1).GEN0_MVI * Use MVI for 1-byte fields 13350000 AIF (&EQULIT).GEN0K3 * 13360000 &_FROM1 SETC '=DL&TO_LEN'.'''&_FROM1''' * Create literal to copy 13370000 AGO .GEN0_MVC * Go generate MVC to copy 13380000 .GEN0K3 ANOP , * 13390000 &_FROM1 SETC '=DL&TO_LEN'.'''&FROM_VAL''' * Create literal to copy 13400000 AGO .GEN0_MVC * Go generate MVC to copy 13410000 .* 13420000 .* Copy a literal number to an extended floating point field 13430000 .GEN0L ANOP , * 13440000 AIF (&TO_LEN GT 256).ERR7D * 13450000 &FROM_LEN SETA &FROM_LEN+1 * Add room for exponent byte 13460000 AIF (&FROM_LEN GE 6).GEN0L0 * Check minimum size for 13470000 &FROM_LEN SETA 6 * L-type literal: 6 bytes min. 13480000 .GEN0L0 ANOP , * 13490000 AIF (&TO_LEN LT &FROM_LEN).ERR7I * FROM_LEN <= 5 for literal 13500000 AIF (&FROM_LEN GE 8).GEN0L1 * May be useful to expand 13510000 AIF (&FROM_LEN EQ &TO_LEN).GEN0L2 * literal length 13520000 AIF (&TO_LEN GE 8).GEN0L1 * to accomodate value 13530000 &FROM_LEN SETA &TO_LEN * 13540000 AGO .GEN0L2 * No padding required! 13550000 .GEN0L1 ANOP , * 13560000 &PAD_LEN SETA &TO_LEN-&FROM_LEN * Nr of additional zeros needed 13570000 AIF (&PAD_LEN LT 1).GEN0L2 * No padding needed 13580000 AIF ('&SIGN' EQ '-').ERR7X * 13590000 &_LABEL CLEAR (&_TO1+&FROM_LEN,&PAD_LEN),,XC * Wipe extension area 13600000 &_LABEL SETC '' * Remove used label 13610000 &TO_LEN SETA &FROM_LEN * And reduce destination length 13620000 .GEN0L2 ANOP , * 13630000 AIF (&TO_LEN EQ 1).GEN0_MVI * Use MVI for 1-byte fields 13640000 AIF (&EQULIT).GEN0L3 * 13650000 &_FROM1 SETC '=LL&TO_LEN'.'''&_FROM1''' * Create literal to copy 13660000 AGO .GEN0_MVC * Go generate MVC to copy 13670000 .GEN0L3 ANOP , * 13680000 &_FROM1 SETC '=LL&TO_LEN'.'''&FROM_VAL''' * Create literal to copy 13690000 AGO .GEN0_MVC * Go generate MVC to copy 13700000 .* 13710000 .* Copy a literal number to a packed decimal field 13720000 .GEN0P ANOP , * 13730000 AIF (&TO_LEN GT 256).ERR7D * 13740000 &LEN SETA K'&FROM_VAL * Nr of digits in literal 13750000 &LEN SETA (&LEN/2)+1 * Nr of positions required 13760000 AIF (&TO_LEN LT &LEN).ERR7I * Won't fit! 13770000 &PAD_LEN SETA &TO_LEN-&LEN * Nr of leading zeros needed 13780000 AIF (&PAD_LEN LT 1).GEN0P0 * No padding needed 13790000 AIF ('&SIGN' EQ '-').ERR7X * 13800000 &_LABEL CLEAR (&_TO1,&PAD_LEN),,XC * Wipe prefix area 13810000 &_LABEL SETC '' * Remove used label 13820000 &_TO1 SETC '&_TO1'.'+&PAD_LEN' * Adjust destination for move 13830000 &TO_LEN SETA &LEN * and length too 13840000 .GEN0P0 ANOP , * 13850000 AIF (&TO_LEN EQ 1).GEN0_MVI * Use MVI for 1-byte fields 13860000 AIF (&EQULIT).GEN0P1 * 13870000 &_FROM1 SETC '=PL&TO_LEN'.'''&_FROM1''' * Create literal to copy 13880000 AGO .GEN0_MVC * Go generate MVC to copy 13890000 .GEN0P1 ANOP , * 13900000 &_FROM1 SETC '=PL&TO_LEN'.'''&FROM_VAL''' * Create literal to copy 13910000 AGO .GEN0_MVC * Go generate MVC to copy 13920000 .* 13930000 .* Copy a literal number to a zoned decimal field 13940000 .GEN0Z ANOP , * 13950000 AIF (&TO_LEN GT 256).ERR7D * 13960000 &LEN SETA K'&FROM_VAL * Nr of digits in literal 13970000 AIF (&TO_LEN LT &LEN).ERR7I * Won't fit! 13980000 &PAD_LEN SETA &TO_LEN-&LEN * Nr of leading zeros needed 13990000 AIF (&PAD_LEN LT 1).GEN0Z0 * No padding needed 14000000 AIF ('&SIGN' EQ '-').ERR7X * 14010000 &_LABEL CLEAR (&_TO1,&PAD_LEN),C'0' * Wipe prefix area 14020000 &_LABEL SETC '' * Remove used label 14030000 &_TO1 SETC '&_TO1'.'+&PAD_LEN' * Adjust destination for move 14040000 &TO_LEN SETA &LEN * and length too 14050000 .GEN0Z0 ANOP , * 14060000 AIF (&TO_LEN EQ 1).GEN0_MVI * Use MVI for 1-byte fields 14070000 AIF (&EQULIT).GEN0Z1 * 14080000 &_FROM1 SETC '=ZL&TO_LEN'.'''&_FROM1''' * Create literal to copy 14090000 AGO .GEN0_MVC * Go generate MVC to copy 14100000 .GEN0Z1 ANOP , * 14110000 &_FROM1 SETC '=ZL&TO_LEN'.'''&FROM_VAL''' * Create literal to copy 14120000 AGO .GEN0_MVC * Go generate MVC to copy 14130000 .* 14140000 .* Copy a literal number to an access register 14150000 .GEN0_A ANOP , * 14160000 AIF (&FROM_VAL EQ 0).GEN0_A0 * Only literal values 0, 14170000 AIF (&FROM_VAL EQ 1).GEN0_A1 * 1, and 2 are allowed for 14180000 AIF (&FROM_VAL EQ 2).GEN0_A1 * use with access registers 14190000 AGO .ERR7T * Illegal literal for AR 14200000 .GEN0_A0 ANOP , * Load with value of 0 14210000 &_LABEL CLEAR &_TO1 * Wipe register to create 0 14220000 &_LABEL SETC '' * Wipe used label 14230000 AIF (&TO_LEN EQ 4).MEXIT * 1 register: done 14240000 AGO .GEN0_A2 * 14250000 .GEN0_A1 ANOP , * Load with value of 1 or 2 14260000 EQUREG TEMP=YES,R0=YES * Find a free register 14270000 AIF (&BXA_RC NE 0).ERR7S * None available! 14280000 ® SETC 'R'.'&BXA_NUMVAL' * Create name of register 14290000 &_LABEL LA ®,&_FROM1 * Load ALET value 14300000 &_LABEL SETC '' * Wipe used label 14310000 SAR &_TO1,® * Copy ALET to access register 14320000 AIF (&TO_LEN EQ 4).MEXIT * 1 register: done 14330000 .GEN0_A2 ANOP , * Copy ALET to other ARs 14340000 &I SETA &TO_REG * Save first register number 14350000 .GEN0_A3 ANOP , * Loop to fill ARs 14360000 &TO_LEN SETA &TO_LEN-4 * Reduce length 14370000 AIF (&TO_LEN LT 4).MEXIT * No registers left to fill 14380000 &I SETA &I+1 * Next register number 14390000 AIF (&I LT 16).GEN0_A4 * Valid register nr 14400000 &I SETA 0 * Wrap-around to AR0 14410000 .GEN0_A4 ANOP , * I now next register nr 14420000 ® SETC 'AR'.'&I' * Create next register name 14430000 CPYA ®,&_TO1 * Copy ALET 14440000 AGO .GEN0_A3 * 14450000 .* 14460000 .* Copy a literal number to a floating point register 14470000 .* For a value of zero an SDR might be used, but this might generate 14480000 .* a significance interruption. 14490000 .GEN0_F ANOP , * 14500000 &_FROM1 SETC '=D'.'''&_FROM1''' * Create literal to copy 14510000 AIF (NOT &EQULIT).GEN0_F1 * 14520000 &_FROM1 SETC '=D'.'''&FROM_VAL''' * Create literal to copy 14530000 .GEN0_F1 ANOP , * 14540000 &_LABEL LD &_TO1,&_FROM1 * Load value to register 14550000 &_LABEL SETC '' * Wipe used label 14560000 AIF (&TO_LEN EQ 8).MEXIT * 1 register: done 14570000 &I SETA &TO_REG * Save first register number 14580000 .GEN0_F3 ANOP , * Loop to fill FPRs 14590000 &TO_LEN SETA &TO_LEN-8 * Reduce length 14600000 AIF (&TO_LEN LT 8).MEXIT * No registers left to fill 14610000 &I SETA &I+2 * Next register number 14620000 AIF (&I LT 8).GEN0_F4 * Valid register nr 14630000 &I SETA 0 * Wrap-around to FPR0 14640000 .GEN0_F4 ANOP , * I now next register nr 14650000 ® SETC 'FPR'.'&I' * Create next register name 14660000 LDR ®,&_TO1 * Copy value 14670000 AGO .GEN0_F3 * 14680000 .* 14690000 .* Copy a literal number to a general purpose register 14700000 .GEN0_G ANOP , * 14710000 AIF (&FROM_VAL EQ 0).GEN0_G0 * 0? use Clear 14720000 AIF (&FROM_VAL LT 4096).GEN0_G1 * Use LA if possible 14730000 AIF (&FROM_VAL GT 32767).GEN0_G2 * Too large for LH 14740000 AIF (&FROM_VAL LT -32768).GEN0_G2 * Too large for LH 14750000 &_FROM1 SETC '=H'.'''&_FROM1''' * Create literal to copy 14760000 AIF (NOT &EQULIT).GEN0_GA * 14770000 &_FROM1 SETC '=H'.'''&FROM_VAL''' * Create literal to copy 14780000 .GEN0_GA ANOP , * 14790000 &_LABEL LH &_TO1,&_FROM1 * Load value to register 14800000 &_LABEL SETC '' * Remove used label 14810000 AIF (&TO_LEN EQ 4).MEXIT * 1 register: done 14820000 AGO .GEN0_G3 * 14830000 .GEN0_G0 ANOP , * Load with value of 0 14840000 &_LABEL CLEAR &_TO1 * Wipe register to create 0 14850000 &_LABEL SETC '' * Wipe used label 14860000 AIF (&TO_LEN EQ 4).MEXIT * 1 register: done 14870000 AGO .GEN0_G3 * 14880000 .GEN0_G1 ANOP , * Load with value up to 4095 14890000 &_LABEL LA &_TO1,&_FROM1 * Load value 14900000 &_LABEL SETC '' * Wipe used label 14910000 AIF (&TO_LEN EQ 4).MEXIT * 1 register: done 14920000 AGO .GEN0_G3 * 14930000 .GEN0_G2 ANOP , * 14940000 &_FROM1 SETC '=F'.'''&_FROM1''' * Create literal to copy 14950000 AIF (NOT &EQULIT).GEN0_GB * 14960000 &_FROM1 SETC '=F'.'''&FROM_VAL''' * Create literal to copy 14970000 .GEN0_GB ANOP , * 14980000 &_LABEL L &_TO1,&_FROM1 * Load value to register 14990000 &_LABEL SETC '' * Remove used label 15000000 AIF (&TO_LEN EQ 4).MEXIT * 1 register: done 15010000 AGO .GEN0_G3 * 15020000 .GEN0_G3 ANOP , * Copy value to other regs 15030000 &I SETA &TO_REG * Save first register number 15040000 .GEN0_G4 ANOP , * Loop to fill regs 15050000 &TO_LEN SETA &TO_LEN-4 * Reduce length 15060000 AIF (&TO_LEN LT 4).MEXIT * No registers left to fill 15070000 &I SETA &I+1 * Next register number 15080000 AIF (&I LT 16).GEN0_G5 * Valid register nr 15090000 &I SETA 0 * Wrap-around to R0 15100000 .GEN0_G5 ANOP , * I now next register nr 15110000 ® SETC 'R'.'&I' * Create next register name 15120000 LR ®,&_TO1 * Copy value 15130000 AGO .GEN0_G4 * 15140000 .* 15150000 .* Logic to generate a move of a literal after truncation or expansion 15160000 .* has been dealt with. 15170000 .GEN0_MVC ANOP , * All GEN0-routines enter here 15180000 AIF (K'&_TO2 NE 0).GEN0_MVC1 * Use explicit length 15190000 AIF (&TO_LEN NE L'&_TO1).GEN0_MVC1 * Use explicit length 15200000 &_LABEL MVC &_TO1,&_FROM1 * 15210000 MEXIT , * 15220000 .GEN0_MVC1 ANOP , * MVC with explicit length 15230000 &_LABEL MVC &_TO1.(&TO_LEN),&_FROM1 * 15240000 MEXIT , * 15250000 .* 15260000 .* Logic to generate a move of a literal to a 1-byte field 15270000 .GEN0_MVI ANOP , * All GEN0-routines enter here 15280000 AIF ('&_FROM1'(1,1) NE '=').GEN0_MVI0 15290000 &_FROM1 SETC '&_FROM1'(2,*) * Remove leading = sign 15300000 .GEN0_MVI0 ANOP , * 15310000 &_LABEL MVI &_TO1,&_FROM1 * 15320000 MEXIT , * 15330000 .* 15340000 .* From type a: Access Register 15350000 .GEN_A ANOP , * 15360000 AIF ('&TO_TP' EQ 'B').GEN_AB * CPY AR to binary 15370000 AIF ('&TO_TP' EQ 'X').GEN_AB * CPY AR to binary 15380000 AIF ('&TO_TP' EQ 'a').GEN_A_A * CPY AR to AR 15390000 AIF ('&TO_TP' EQ 'g').GEN_A_G * CPY AR to GPR 15400000 AGO .ERR7B * Unsupported combination 15410000 .* 15420000 .* Copy access register(s) to an unsigned binary field 15430000 .GEN_AB ANOP , * 15440000 AIF (&TO_LEN NE &FROM_LEN).ERR7C * Lengths equal? 15450000 AGO .DO_STAM * Go generate STAM instruction 15460000 .* 15470000 .* Copy access register(s) to access register(s) 15480000 .GEN_A_A ANOP , * 15490000 AIF (&TO_LEN NE &FROM_LEN).ERR7C * Lengths equal? 15500000 &_LABEL CPYA &_TO1,&_FROM1 * Copy ALET 15510000 &_LABEL SETC '' * Remove used label 15520000 AIF (&TO_LEN EQ 4).MEXIT * 1 register only to copy? 15530000 .GEN_A_A0 ANOP , * Loop to copy ARs 15540000 &TO_LEN SETA &TO_LEN-4 * Reduce length 15550000 AIF (&TO_LEN LT 4).MEXIT * No registers left to copy 15560000 &TO_REG SETA &TO_REG+1 * Next dest reg nr 15570000 AIF (&TO_REG LT 16).GEN_A_A1 * Valid register nr 15580000 &TO_REG SETA 0 * Wrap-around to AR0 15590000 .GEN_A_A1 ANOP , * TO_REG now next register nr 15600000 &FROM_REG SETA &FROM_REG+1 * Next src reg nr 15610000 AIF (&FROM_REG LT 16).GEN_A_A2 * Valid register nr 15620000 &FROM_REG SETA 0 * Wrap-around to AR0 15630000 .GEN_A_A2 ANOP , * FROM_REG now next register nr 15640000 ® SETC 'AR'.'&TO_REG' * Create next dest.reg name 15650000 &ODDREG SETC 'AR'.'&FROM_REG' * Create next src.reg name 15660000 CPYA ®,&ODDREG * Copy ALET 15670000 AGO .GEN_A_A0 * 15680000 .* 15690000 .* Copy access register(s) to GP register(s) 15700000 .GEN_A_G ANOP , * 15710000 AIF (&TO_LEN NE &FROM_LEN).ERR7C * Lengths equal? 15720000 &_LABEL EAR &_TO1,&_FROM1 * Copy ALET 15730000 &_LABEL SETC '' * Remove used label 15740000 AIF (&TO_LEN EQ 4).MEXIT * 1 register only to copy? 15750000 .GEN_A_G0 ANOP , * Loop to copy ARs 15760000 &TO_LEN SETA &TO_LEN-4 * Reduce length 15770000 AIF (&TO_LEN LT 4).MEXIT * No registers left to copy 15780000 &TO_REG SETA &TO_REG+1 * Next dest reg nr 15790000 AIF (&TO_REG LT 16).GEN_A_G1 * Valid register nr 15800000 &TO_REG SETA 0 * Wrap-around to R0 15810000 .GEN_A_G1 ANOP , * TO_REG now next register nr 15820000 &FROM_REG SETA &FROM_REG+1 * Next src reg nr 15830000 AIF (&FROM_REG LT 16).GEN_A_G2 * Valid register nr 15840000 &FROM_REG SETA 0 * Wrap-around to AR0 15850000 .GEN_A_G2 ANOP , * FROM_REG now next register nr 15860000 ® SETC 'R'.'&TO_REG' * Create next dest.reg name 15870000 &ODDREG SETC 'AR'.'&FROM_REG' * Create next src.reg name 15880000 EAR ®,&ODDREG * Copy ALET 15890000 AGO .GEN_A_G0 * 15900000 .* 15910000 .* From type c: Control Register 15920000 .GEN_C ANOP , * 15930000 AIF ('&TO_TP' EQ 'B').GEN_CB * CPY CR to binary 15940000 AIF ('&TO_TP' EQ 'X').GEN_CB * CPY CR to binary 15950000 AGO .ERR7B * Unsupported combination 15960000 .* 15970000 .* Copy control register(s) to an unsigned binary field 15980000 .GEN_CB ANOP , * 15990000 AIF (&TO_LEN NE &FROM_LEN).ERR7C * Lengths equal? 16000000 AGO .DO_STCTL * Go generate STCTL instruction 16010000 .* 16020000 .* From type f: Floating Point Register 16030000 .GEN_F ANOP , * 16040000 AIF ('&TO_TP' EQ 'D').GEN_FD * CPY FPR to long 16050000 AIF ('&TO_TP' EQ 'E').GEN_FE * CPY FPR to short 16060000 AIF ('&TO_TP' EQ 'K').GEN_FK * CPY FRP to float field 16070000 AIF ('&TO_TP' EQ 'L').GEN_FL * CPY FPR to extended 16080000 AIF ('&TO_TP' EQ 'f').GEN_F_F * CPY FPR to FPR 16090000 AGO .ERR7B * Unsupported combination 16100000 .* 16110000 .* Copy floating point register(s) to long field(s) 16120000 .GEN_FD ANOP , * 16130000 AIF (&TO_LEN NE &FROM_LEN).ERR7C * Lengths equal? 16140000 AIF (&TO_LEN EQ 8).DO_STD * Generate 1 STD 16150000 AGO .GENSTDM * Generate several STDs 16160000 .* 16170000 .* Copy floating point register(s) to short field(s) 16180000 .GEN_FE ANOP , * 16190000 AIF (2*&TO_LEN NE &FROM_LEN).ERR7C * Lengths equal? 16200000 AIF (&TO_LEN EQ 4).DO_STE * Generate 1 STE 16210000 AGO .GENSTEM * Generate several STEs 16220000 .* 16230000 .* Copy floating point register to floating field (any length) 16240000 .GEN_FK ANOP , * 16250000 AIF (&FROM_LEN GT 16).ERR7W * Cannot save more than 2 regs 16260000 AIF (&FROM_LEN EQ 16).GEN_FK1 * Store extended operand! 16270000 .* Handle 1 register 16280000 AIF (&TO_LEN LT 4).ERR7I * Dest.field too short 16290000 AIF (&TO_LEN GE 8).GEN_FK0 * Go save long operand 16300000 .* Handle short operand 16310000 &PAD_LEN SETA &TO_LEN-4 * Nr of trailing zeroes required 16320000 AIF (&PAD_LEN EQ 0).GEN_FE * No padding: store short 16330000 &_LABEL CLEAR (&_TO1+4,&PAD_LEN),,XC * Wipe trailer area 16340000 &_LABEL SETC '' * Remove generated label 16350000 &TO_LEN SETA 4 * Length of area to fill 16360000 AGO .GEN_FE * Go store 1 short operand 16370000 .GEN_FK0 ANOP , * Must store a long operand 16380000 &PAD_LEN SETA &TO_LEN-8 * Nr of trailing zeroes required 16390000 AIF (&PAD_LEN EQ 0).GEN_FD * No padding: store long 16400000 &_LABEL CLEAR (&_TO1+8,&PAD_LEN),,XC * Wipe trailer area 16410000 &_LABEL SETC '' * Remove generated label 16420000 &TO_LEN SETA 8 * Length of area to fill 16430000 AGO .GEN_FD * Go store 1 long operand 16440000 .GEN_FK1 ANOP , * Must store an extended operand 16450000 AIF (&TO_LEN LT 16).ERR7I * Dest.field too short 16460000 &PAD_LEN SETA &TO_LEN-16 * Nr of trailing zeroes required 16470000 AIF (&PAD_LEN EQ 0).GEN_FK2 *=GEN_FL2 16480000 &_LABEL CLEAR (&_TO1+16,&PAD_LEN),,XC * Wipe trailer area 16490000 &_LABEL SETC '' * Remove generated label 16500000 &TO_LEN SETA 16 * Length of area to fill 16510000 AGO .GEN_FK2 *=GEN_FL2 16520000 .* 16530000 .* Copy floating point register(s) to extended field(s) 16540000 .GEN_FL ANOP , * 16550000 AIF (K'&_FROM2 EQ 0).GEN_FL1 * Just a register spec'd? 16560000 AIF (NOT &FROM_EREG).GEN_FL2 * End register specified? 16570000 .GEN_FL1 ANOP , * 16580000 &FROM_LEN SETA &FROM_LEN+8 * Yes: add length of odd reg 16590000 .GEN_FK2 ANOP , * Must store an extended operand 16600000 .GEN_FL2 ANOP , * &FROM_LEN is now correct 16610000 AIF (&TO_LEN NE &FROM_LEN).ERR7C * Lengths equal? 16620000 AGO .GENSTXM * Generate several STDs 16630000 .* 16640000 .* Copy floating point register(s) to FP register(s) 16650000 .GEN_F_F ANOP , * 16660000 AIF (&TO_LEN NE &FROM_LEN).ERR7C * Lengths equal? 16670000 &_LABEL LDR &_TO1,&_FROM1 * Copy 16680000 &_LABEL SETC '' * Remove used label 16690000 AIF (&TO_LEN EQ 8).MEXIT * 1 register only to copy? 16700000 .GEN_F_F0 ANOP , * Loop to copy FPRs 16710000 &TO_LEN SETA &TO_LEN-8 * Reduce length 16720000 AIF (&TO_LEN LT 8).MEXIT * No registers left to copy 16730000 &TO_REG SETA &TO_REG+2 * Next dest reg nr 16740000 AIF (&TO_REG LT 8).GEN_F_F1 * Valid register nr 16750000 &TO_REG SETA 0 * Wrap-around to FPR0 16760000 .GEN_F_F1 ANOP , * TO_REG now next register nr 16770000 &FROM_REG SETA &FROM_REG+2 * Next src reg nr 16780000 AIF (&FROM_REG LT 8).GEN_F_F2 * Valid register nr 16790000 &FROM_REG SETA 0 * Wrap-around to FPR0 16800000 .GEN_F_F2 ANOP , * FROM_REG now next register nr 16810000 ® SETC 'FPR'.'&TO_REG' * Create next dest.reg name 16820000 &ODDREG SETC 'FPR'.'&FROM_REG' * Create next src.reg name 16830000 LDR ®,&ODDREG * Copy 16840000 AGO .GEN_F_F0 * 16850000 .* 16860000 .* From type g: General Purpose Register 16870000 .GEN_G ANOP , * 16880000 AIF ('&TO_TP' EQ 'A').GEN_GA * CPY reg to address 16890000 AIF ('&TO_TP' EQ 'B').GEN_GB * CPY reg to unsigned 16900000 AIF ('&TO_TP' EQ 'F').GEN_GF * CPY reg to signed 16910000 AIF ('&TO_TP' EQ 'G').GEN_GG * CPY reg to signed 16920000 AIF ('&TO_TP' EQ 'H').GEN_GH * CPY reg to signed 16930000 AIF ('&TO_TP' EQ 'P').GEN_GP * CPY reg to packed decimal 16940000 AIF ('&TO_TP' EQ 'Q').GEN_GA * CPY reg to address 16950000 AIF ('&TO_TP' EQ 'R').GEN_GR * CPY reg to address 16960000 AIF ('&TO_TP' EQ 'V').GEN_GA * CPY reg to address 16970000 AIF ('&TO_TP' EQ 'X').GEN_GB * CPY reg to unsigned 16980000 AIF ('&TO_TP' EQ 'Y').GEN_GY * CPY reg to address 16990000 AIF ('&TO_TP' EQ 'a').GEN_G_A * CPY reg to access register 17000000 AIF ('&TO_TP' EQ 'g').GEN_G_G * CPY reg to reg 17010000 AGO .ERR7B * Unsupported combination 17020000 .* 17030000 .* Copy from register(s) to address field(s) 17040000 .GEN_GA ANOP , * 17050000 AIF (&FROM_LEN EQ 4).GEN_GA1 * Just 1 register? 17060000 AIF (&TO_LEN NE &FROM_LEN).ERR7C * Lengths equal? 17070000 AGO .DO_STM * Generate 1 STM 17080000 .GEN_GA1 ANOP , * Only 1 register to save 17090000 AIF (&TO_LEN EQ 4).DO_ST * Generate 1 ST 17100000 AIF (&TO_LEN LT 4).GEN_GA2 * Use STCM to save 17110000 &PAD_LEN SETA &TO_LEN-4 * Nr of leading zeros needed 17120000 &_LABEL CLEAR (&_TO1,&PAD_LEN),,XC * Insert leading zeros 17130000 &_LABEL SETC '' * Remove used label 17140000 &_TO1 SETC '&_TO1'.'+&PAD_LEN' * Advance destination field 17150000 &TO_LEN SETA 4 * 4 bytes remain unfilled 17160000 &I SETA &PAD_LEN/4 * Nr of words padded 17170000 &J SETA &PAD_LEN-(4*&I) * Nr of extra bytes padded 17180000 AIF (&J EQ 0).DO_ST * Go generate a ST 17190000 .GEN_GA2 ANOP , * STCM required 17200000 .GEN_GR2 ANOP , * Entry from reg-to-unaligned 17210000 .GEN_GY2 ANOP , * Entry from reg-to-halfword 17220000 &MASK SETC 'NNNY' * Mask for a 1-byte field 17230000 AIF (&TO_LEN EQ 1).DO_STCM * Go save byte 17240000 &MASK SETC 'NNYY' * Mask for a 2-byte field 17250000 AIF (&TO_LEN EQ 2).DO_STCM * Go save bytes 17260000 &MASK SETC 'NYYY' * Mask for a 3-byte field 17270000 AIF (&TO_LEN EQ 3).DO_STCM * Go save bytes 17280000 &MASK SETC 'YYYY' * Mask for a 4-byte field 17290000 AGO .DO_STCM * Go save bytes 17300000 .* 17310000 .* Copy from register(s) to unsigned binary field(s) 17320000 .GEN_GB ANOP , * 17330000 AIF (&FROM_LEN EQ 4).GEN_GB1 * Just 1 register? 17340000 AIF (&TO_LEN NE &FROM_LEN).ERR7C * Lengths equal? 17350000 AGO .GENSTCMM * Generate multiple STCMs 17360000 .GEN_GB1 ANOP , * Only 1 register to save 17370000 &MASK SETC 'YYYY' * 17380000 AIF (&TO_LEN EQ 4).DO_STCM * Generate 1 ST 17390000 AIF (&TO_LEN LT 4).GEN_GB2 * Use STCM to save 17400000 &PAD_LEN SETA &TO_LEN-4 * Nr of leading zeros needed 17410000 &_LABEL CLEAR (&_TO1,&PAD_LEN),,XC * Insert leading zeros 17420000 &_LABEL SETC '' * Remove used label 17430000 &_TO1 SETC '&_TO1'.'+&PAD_LEN' * Advance destination field 17440000 AGO .DO_STCM * Go generate a STCM 17450000 .GEN_GB2 ANOP , * STCM required 17460000 .GEN_GF2 ANOP , * Entry from reg-to-fullword 17470000 .GEN_GG2 ANOP , * Entry from reg-to-signed 17480000 .GEN_GH2 ANOP , * Entry from reg-to-halfword 17490000 &MASK SETC 'NNNY' * Mask for a 1-byte field 17500000 AIF (&TO_LEN EQ 1).DO_STCM * Go save byte 17510000 &MASK SETC 'NNYY' * Mask for a 2-byte field 17520000 AIF (&TO_LEN EQ 2).DO_STCM * Go save bytes 17530000 &MASK SETC 'NYYY' * Mask for a 3-byte field 17540000 AIF (&TO_LEN EQ 3).DO_STCM * Go save bytes 17550000 &MASK SETC 'YYYY' * Mask for a 4-byte field 17560000 AGO .DO_STCM * Go save bytes 17570000 .* 17580000 .* Copy from register(s) to signed binary fullword(s) 17590000 .GEN_GF ANOP , * 17600000 AIF (&FROM_LEN EQ 4).GEN_GF1 * Just 1 register? 17610000 AIF (&TO_LEN NE &FROM_LEN).ERR7C * Lengths equal? 17620000 AGO .DO_STM * Generate 1 STM 17630000 .GEN_GF1 ANOP , * Only 1 register to save 17640000 AIF (&TO_LEN EQ 4).DO_ST * Generate 1 ST 17650000 AIF (&TO_LEN EQ 2).DO_STH * Generate 1 STH 17660000 AIF (&TO_LEN LE 4).GEN_GF2 *=GEN_GB2 17670000 &PAD_LEN SETA &TO_LEN-4 * Nr of leading zeros needed 17680000 EQUREG TEMP=YES,R0=YES * Find available register 17690000 AIF (&BXA_RC NE 0).ERR7H * None found! 17700000 ® SETC 'R'.'&BXA_NUMVAL' * Create workreg name 17710000 &_LABEL LR ®,&_FROM1 * Copy value to save 17720000 &_LABEL SETC '' * Remove used label 17730000 &MASK SETC 'YYYY' * Mask to save register 17740000 &PAD_ADR SETC '&_TO1' * Save destination 17750000 &_TO1 SETC '&_TO1'.'+&PAD_LEN' * Create destination for data 17760000 SRA ®,31 * Create all sign bits 17770000 AIF (&PAD_LEN GT 8).GEN_GF6 * 17780000 AIF (&PAD_LEN EQ 1).GEN_GF3 * 17790000 AIF (&PAD_LEN EQ 2).GEN_GF4 * 17800000 AIF (&PAD_LEN EQ 3).GEN_GF5 * 17810000 ST ®,&PAD_ADR * First set of lead sign bytes 17820000 &PAD_ADR SETC '&PAD_ADR'.'+4' * Adjust pad-area pointer 17830000 AIF (&PAD_LEN EQ 4).DO_ST * Ok: save register 17840000 AIF (&PAD_LEN EQ 5).GEN_GF3 * 17850000 AIF (&PAD_LEN EQ 6).GEN_GF4 * 17860000 AIF (&PAD_LEN EQ 7).GEN_GF5 * 17870000 ST ®,&PAD_ADR * Fill up to 8 lead sign bytes 17880000 AGO .DO_ST * Go save register 17890000 .GEN_GF3 ANOP , * 1 leading sign byte 17900000 STC ®,&PAD_ADR * 17910000 AGO .DO_STCM * Go save register 17920000 .GEN_GF4 ANOP , * 2 leading sign bytes 17930000 STH ®,&PAD_ADR * 17940000 AGO .DO_STCM * Go save register 17950000 .GEN_GF5 ANOP , * 3 leading sign bytes 17960000 STCM ®,YYYN,&PAD_ADR * 17970000 AGO .DO_STCM * Go save register 17980000 .GEN_GF6 ANOP , * More than 8 leading sign bytes 17990000 ST ®,&PAD_ADR * Insert leading sign bytes 18000000 MVC &PAD_ADR+4(&PAD_LEN-4),&PAD_ADR * Propagate sign 18010000 &I SETA &PAD_LEN/4 * Nr of words padded 18020000 &I SETA &PAD_LEN-(4*&I) * Nr of extra bytes padded 18030000 AIF (&I EQ 0).DO_ST * Still aligned: use ST 18040000 AGO .DO_STCM * Go save register 18050000 .* 18060000 .* Copy from register(s) to signed binary field(s) 18070000 .GEN_GG ANOP , * 18080000 AIF (&FROM_LEN EQ 4).GEN_GG1 * Just 1 register? 18090000 AIF (&TO_LEN NE &FROM_LEN).ERR7C * Lengths equal? 18100000 AGO .GENSTCMM * Generate multiple STCMs 18110000 .GEN_GG1 ANOP , * Only 1 register to save 18120000 AIF (&TO_LEN LE 4).GEN_GG2 *=GEN_GB2 18130000 &PAD_LEN SETA &TO_LEN-4 * Nr of leading zeros needed 18140000 EQUREG TEMP=YES,R0=YES * Find available register 18150000 AIF (&BXA_RC NE 0).ERR7H * None found! 18160000 ® SETC 'R'.'&BXA_NUMVAL' * Create workreg name 18170000 &_LABEL LR ®,&_FROM1 * Copy value to save 18180000 &_LABEL SETC '' * Remove used label 18190000 &MASK SETC 'YYYY' * Mask to save register 18200000 &PAD_ADR SETC '&_TO1' * Save destination 18210000 &_TO1 SETC '&_TO1'.'+&PAD_LEN' * Create destination for data 18220000 SRA ®,31 * Create all sign bits 18230000 AIF (&PAD_LEN GT 8).GEN_GG6 * 18240000 AIF (&PAD_LEN EQ 1).GEN_GG3 * 18250000 AIF (&PAD_LEN EQ 2).GEN_GG4 * 18260000 AIF (&PAD_LEN EQ 3).GEN_GG5 * 18270000 STCM ®,YYYY,&PAD_ADR * First set of lead sign bytes 18280000 &PAD_ADR SETC '&PAD_ADR'.'+4' * Adjust pad-area pointer 18290000 AIF (&PAD_LEN EQ 4).DO_STCM * Ok: save register 18300000 AIF (&PAD_LEN EQ 5).GEN_GG3 * 18310000 AIF (&PAD_LEN EQ 6).GEN_GG4 * 18320000 AIF (&PAD_LEN EQ 7).GEN_GG5 * 18330000 STCM ®,YYYY,&PAD_ADR * Fill up to 8 lead sign bytes 18340000 AGO .DO_STCM * Go save register 18350000 .GEN_GG3 ANOP , * 1 leading sign byte 18360000 STC ®,&PAD_ADR * 18370000 AGO .DO_STCM * Go save register 18380000 .GEN_GG4 ANOP , * 2 leading sign bytes 18390000 STCM ®,YYNN,&PAD_ADR * 18400000 AGO .DO_STCM * Go save register 18410000 .GEN_GG5 ANOP , * 3 leading sign bytes 18420000 STCM ®,YYYN,&PAD_ADR * 18430000 AGO .DO_STCM * Go save register 18440000 .GEN_GG6 ANOP , * More than 8 leading sign bytes 18450000 STCM ®,YYYY,&PAD_ADR * 18460000 MVC &PAD_ADR+4(&PAD_LEN-4),&PAD_ADR * Propagate sign 18470000 AGO .DO_STCM * Go save register 18480000 .* 18490000 .* Copy from register(s) to signed binary halfword(s) 18500000 .GEN_GH ANOP , * 18510000 AIF (&FROM_LEN EQ 4).GEN_GH1 * Just 1 register? 18520000 AIF (2*&TO_LEN NE &FROM_LEN).ERR7C * Lengths equal? 18530000 AGO .GENSTHM * Generate multiple STHs 18540000 .GEN_GH1 ANOP , * Only 1 register to save 18550000 AIF (&TO_LEN EQ 2).DO_STH * Generate 1 STH 18560000 AIF (&TO_LEN LE 4).GEN_GH2 *=GEN_GB2 18570000 &PAD_LEN SETA &TO_LEN-4 * Nr of leading zeros needed 18580000 EQUREG TEMP=YES,R0=YES * Find available register 18590000 AIF (&BXA_RC NE 0).ERR7H * None found! 18600000 ® SETC 'R'.'&BXA_NUMVAL' * Create workreg name 18610000 &_LABEL LR ®,&_FROM1 * Copy value to save 18620000 &_LABEL SETC '' * Remove used label 18630000 &MASK SETC 'YYYY' * Mask to save register 18640000 &PAD_ADR SETC '&_TO1' * Save destination 18650000 &_TO1 SETC '&_TO1'.'+&PAD_LEN' * Create destination for data 18660000 SRA ®,31 * Create all sign bits 18670000 AIF (&PAD_LEN GT 8).GEN_GH6 * 18680000 AIF (&PAD_LEN EQ 1).GEN_GH3 * 18690000 AIF (&PAD_LEN EQ 2).GEN_GH4 * 18700000 AIF (&PAD_LEN EQ 3).GEN_GH5 * 18710000 STCM ®,YYYY,&PAD_ADR * First set of lead sign bytes 18720000 &PAD_ADR SETC '&PAD_ADR'.'+4' * Adjust pad-area pointer 18730000 AIF (&PAD_LEN EQ 4).DO_STCM * Ok: save register 18740000 AIF (&PAD_LEN EQ 5).GEN_GH3 * 18750000 AIF (&PAD_LEN EQ 6).GEN_GH4 * 18760000 AIF (&PAD_LEN EQ 7).GEN_GH5 * 18770000 STCM ®,YYYY,&PAD_ADR * Fill up to 8 lead sign bytes 18780000 AGO .DO_STCM * Go save register 18790000 .GEN_GH3 ANOP , * 1 leading sign byte 18800000 STC ®,&PAD_ADR * 18810000 AGO .DO_STCM * Go save register 18820000 .GEN_GH4 ANOP , * 2 leading sign bytes 18830000 STH ®,&PAD_ADR * 18840000 AGO .DO_STCM * Go save register 18850000 .GEN_GH5 ANOP , * 3 leading sign bytes 18860000 STCM ®,YYYN,&PAD_ADR * 18870000 AGO .DO_STCM * Go save register 18880000 .GEN_GH6 ANOP , * More than 8 leading sign bytes 18890000 STH ®,&PAD_ADR * Insert leading sign bytes 18900000 MVC &PAD_ADR+2(&PAD_LEN-2),&PAD_ADR * Propagate sign 18910000 AGO .DO_STCM * Go save register 18920000 .* 18930000 .* Copy from register(s) to packed decimal number(s) 18940000 .GEN_GP ANOP , * 18950000 AIF (&FROM_LEN EQ 4).GEN_GP1 * Just 1 register? 18960000 AIF (&TO_LEN NE 2*&FROM_LEN).ERR7C * Lengths equal? 18970000 AGO .GENCVDM * Generate multiple CVDs 18980000 .GEN_GP1 ANOP , * Only 1 register to save 18990000 AIF (&TO_LEN LT 8).ERR7I * 19000000 &PAD_LEN SETA &TO_LEN-8 * Nr of leading zeros needed 19010000 AIF (&PAD_LEN LT 1).GEN_GP2 * None needed 19020000 &_LABEL CLEAR (&_TO1,&PAD_LEN),,XC * Create leading zeros 19030000 &_LABEL SETC '' * Remove used-up label 19040000 &_TO1 SETC '&_TO1'.'+&PAD_LEN' * Advance destination pointer 19050000 .GEN_GP2 ANOP , * 19060000 &_LABEL CVD &_FROM1,&_TO1 * 19070000 MEXIT , * 19080000 .* 19090000 .* Copy from register(s) to unaligned address field(s) 19100000 .GEN_GR ANOP , * 19110000 AIF (&FROM_LEN EQ 4).GEN_GR1 * Just 1 register? 19120000 AIF (&TO_LEN NE &FROM_LEN).ERR7C * Lengths equal? 19130000 AGO .GENSTCMM * Generate multiple STCMs 19140000 .GEN_GR1 ANOP , * Only 1 register to save 19150000 &MASK SETC 'YYYY' * Set default mask for STCM 19160000 AIF (&TO_LEN EQ 4).DO_STCM * Generate 1 ST 19170000 AIF (&TO_LEN LT 4).GEN_GR2 *=GEN_GA2 19180000 &PAD_LEN SETA &TO_LEN-4 * Nr of leading zeros needed 19190000 &_LABEL CLEAR (&_TO1,&PAD_LEN),,XC * Insert leading zeros 19200000 &_LABEL SETC '' * Remove used label 19210000 &_TO1 SETC '&_TO1'.'+&PAD_LEN' * Advance destination field 19220000 AGO .DO_STCM * Go generate a STCM 19230000 .* 19240000 .* Copy from register(s) to halfword address field(s) 19250000 .GEN_GY ANOP , * 19260000 AIF (&FROM_LEN EQ 4).GEN_GY1 * Just 1 register? 19270000 AIF (2*&TO_LEN NE &FROM_LEN).ERR7C * Lengths equal? 19280000 AGO .GENSTHM * Generate multiple STHs 19290000 .GEN_GY1 ANOP , * Only 1 register to save 19300000 AIF (&TO_LEN EQ 2).DO_STH * Generate 1 STH 19310000 AIF (&TO_LEN LT 4).GEN_GY2 *=.GEN_GA2 19320000 &PAD_LEN SETA &TO_LEN-4 * Nr of leading zeros needed 19330000 &MASK SETC 'YYYY' * Default mask for STCM 19340000 AIF (&PAD_LEN LT 1).DO_STCM * 19350000 &_LABEL CLEAR (&_TO1,&PAD_LEN),,XC * Insert leading zeros 19360000 &_LABEL SETC '' * Remove used label 19370000 &_TO1 SETC '&_TO1'.'+&PAD_LEN' * Advance destination field 19380000 &TO_LEN SETA 4 * 4 bytes remain unfilled 19390000 AGO .GEN_GY2 *=.GEN_GA2 19400000 .* 19410000 .* Copy register(s) to access register(s) 19420000 .GEN_G_A ANOP , * 19430000 AIF (&TO_LEN NE &FROM_LEN).ERR7C * Lengths equal? 19440000 &_LABEL SAR &_TO1,&_FROM1 * Copy ALET 19450000 &_LABEL SETC '' * Remove used label 19460000 AIF (&TO_LEN EQ 4).MEXIT * 1 register only to copy? 19470000 .GEN_G_A0 ANOP , * Loop to copy ARs 19480000 &TO_LEN SETA &TO_LEN-4 * Reduce length 19490000 AIF (&TO_LEN LT 4).MEXIT * No registers left to copy 19500000 &TO_REG SETA &TO_REG+1 * Next dest reg nr 19510000 AIF (&TO_REG LT 16).GEN_G_A1 * Valid register nr 19520000 &TO_REG SETA 0 * Wrap-around to R0 19530000 .GEN_G_A1 ANOP , * TO_REG now next register nr 19540000 &FROM_REG SETA &FROM_REG+1 * Next src reg nr 19550000 AIF (&FROM_REG LT 16).GEN_G_A2 * Valid register nr 19560000 &FROM_REG SETA 0 * Wrap-around to AR0 19570000 .GEN_G_A2 ANOP , * FROM_REG now next register nr 19580000 ® SETC 'R'.'&FROM_REG' * Create next src.reg name 19590000 &ODDREG SETC 'AR'.'&TO_REG' * Create next dest.reg name 19600000 SAR &ODDREG,® * Copy ALET 19610000 AGO .GEN_G_A0 * 19620000 .* 19630000 .* Copy register(s) to register(s) 19640000 .GEN_G_G ANOP , * 19650000 AIF (&TO_LEN NE &FROM_LEN).ERR7C * Lengths equal? 19660000 &_LABEL LR &_TO1,&_FROM1 * Copy register 19670000 &_LABEL SETC '' * Remove used label 19680000 AIF (&TO_LEN EQ 4).MEXIT * 1 register only to copy? 19690000 .GEN_G_G0 ANOP , * Loop to copy regs 19700000 &TO_LEN SETA &TO_LEN-4 * Reduce length 19710000 AIF (&TO_LEN LT 4).MEXIT * No registers left to copy 19720000 &TO_REG SETA &TO_REG+1 * Next dest reg nr 19730000 AIF (&TO_REG LT 16).GEN_G_G1 * Valid register nr 19740000 &TO_REG SETA 0 * Wrap-around to R0 19750000 .GEN_G_G1 ANOP , * TO_REG now next register nr 19760000 &FROM_REG SETA &FROM_REG+1 * Next src reg nr 19770000 AIF (&FROM_REG LT 16).GEN_G_G2 * Valid register nr 19780000 &FROM_REG SETA 0 * Wrap-around to AR0 19790000 .GEN_G_G2 ANOP , * FROM_REG now next register nr 19800000 ® SETC 'R'.'&FROM_REG' * Create next src.reg name 19810000 &ODDREG SETC 'R'.'&TO_REG' * Create next dest.reg name 19820000 LR &ODDREG,® * Copy register 19830000 AGO .GEN_G_G0 * 19840000 .* 19850000 .* From type ga: Combined general purpose and access registers 19860000 .GEN_GA_ ANOP , * 19870000 AIF ('&TO_TP' EQ 'ga').GEN_GA_GA * CPY regs to regs 19880000 AGO .ERR7B * Unsupported combination 19890000 .* 19900000 .* Copy combined GPR-AR pairs 19910000 .GEN_GA_GA ANOP , * 19920000 AIF (&TO_LEN NE &FROM_LEN).ERR7C * Lengths equal? 19930000 AGO .GENLAEM * 19940000 .* 19950000 .* From type p: pointered data field 19960000 .GEN_P ANOP , * 19970000 AIF ('&TO_TP' EQ 'p').DO_MVCL * CPY pointered to pointered 19980000 AGO .ERR7B * Unsupported combination 19990000 .* 20000000 .* From type *STACK: Stacked registers 20010000 .GENSTACK ANOP , * 20020000 &FROM_TP SETC '*STACK' * 20030000 AIF ('&TO_TP' EQ 'ga').DO_EREG * CPY stack to registers 20040000 AGO .ERR7B * Unsupported combination 20050000 .* 20060000 .* Load several registers with packed data 20070000 .GENCVBM ANOP , * 20080000 &I SETA &TO_REG * Save first register number 20090000 &J SETA 0 * Offset in source field 20100000 .GENCVBM0 ANOP , * Loop 20110000 &_LABEL CVB &_TO1,&_FROM1+&J * 20120000 &_LABEL SETC '' * Remove label after use 20130000 &TO_LEN SETA &TO_LEN-4 * Reduce length 20140000 AIF (&TO_LEN LT 4).MEXIT * No registers left to fill 20150000 &J SETA &J+8 * Point next short field 20160000 &I SETA &I+1 * Next register number 20170000 AIF (&I LT 16).GENCVBM1 * Valid register nr 20180000 &I SETA 0 * Wrap-around to R0 20190000 .GENCVBM1 ANOP , * I now next register nr 20200000 &_TO1 SETC 'R'.'&I' * Create next register name 20210000 AGO .GENCVBM0 * 20220000 .* 20230000 .* Store several registers as packed data 20240000 .GENCVDM ANOP , * 20250000 &I SETA &FROM_REG * Save first register number 20260000 &J SETA 0 * Offset in source field 20270000 .GENCVDM0 ANOP , * Loop 20280000 &_LABEL CVD &_FROM1,&_TO1+&J * 20290000 &_LABEL SETC '' * Remove label after use 20300000 &TO_LEN SETA &TO_LEN-8 * Reduce length 20310000 AIF (&TO_LEN LT 8).MEXIT * No storage left to fill 20320000 &J SETA &J+8 * Point next short field 20330000 &I SETA &I+1 * Next register number 20340000 AIF (&I LT 16).GENCVDM1 * Valid register nr 20350000 &I SETA 0 * Wrap-around to R0 20360000 .GENCVDM1 ANOP , * I now next register nr 20370000 &_FROM1 SETC 'R'.'&I' * Create next register name 20380000 AGO .GENCVDM0 * 20390000 .* 20400000 .* Load a register with an unaligned signed integer 20410000 .GENICM ANOP , * 20420000 &MASK SETC 'YNNN' * Mask for a 1-byte value 20430000 &I SETA 24 * Nr of bytes to shift 20440000 AIF (&FROM_LEN EQ 1).GENICM0 * Go load value 20450000 &MASK SETC 'YYNN' * Mask for a 2-byte value 20460000 &I SETA 16 * Nr of bytes to shift 20470000 AIF (&FROM_LEN EQ 2 AND '&FROM_TP' NE 'G').GENICM1 20480000 AIF (&FROM_LEN EQ 2).GENICM0 * Go load value 20490000 &MASK SETC 'YYYN' * Mask for a 3-byte value 20500000 &I SETA 8 * Nr of bytes to shift 20510000 AIF (&FROM_LEN EQ 3).GENICM0 * Go load value 20520000 &MASK SETC 'YYYY' * MUST be a four-byte value 20530000 AIF (&FROM_LEN EQ 4 AND '&FROM_TP' NE 'F').GENICM0 20540000 AIF (&FROM_LEN EQ 4).GENICM2 * Load aligned fullword 20550000 AIF ('&FROM_TP' EQ 'F').GENICM3 * Oversized, aligned 20560000 AGO .GENICM4 * Oversized, unaligned 20570000 .GENICM0 ANOP , * Use ICM to load value 20580000 &_LABEL ICM &_TO1,&MASK,&_FROM1 * Copy value to register 20590000 &_LABEL SETC '' * Remove used label 20600000 AIF ('&MASK' EQ 'YYYY').MEXIT 20610000 SRA &_TO1,&I * Shift value in register 20620000 MEXIT , * 20630000 .GENICM1 ANOP , * Load aligned halfword 20640000 &_LABEL LH &_TO1,&_FROM1 * Copy value to register 20650000 MEXIT , * 20660000 .GENICM2 ANOP , * Load aligned fullword 20670000 &_LABEL L &_TO1,&_FROM1 * Copy value to register 20680000 MEXIT , * 20690000 .GENICM3 ANOP , * Load/truncate from Fullword 20700000 &I SETA &FROM_LEN-4 * Offset in source field 20710000 &J SETA &I/4 * Nr of words in offset 20720000 &J SETA &I-(4*&J) * Nr of excess bytes 20730000 AIF (&J NE 0).GENICM4 * Go load unaligned 'word' 20740000 &_LABEL L &_TO1,&_FROM1+&I * Copy value to register 20750000 MEXIT , * 20760000 .GENICM4 ANOP , * Load/truncate unaligned 20770000 &I SETA &FROM_LEN-4 * Offset in source field 20780000 &_LABEL ICM &_TO1,YYYY,&_FROM1+&I * Copy value to register 20790000 MEXIT , * 20800000 .* 20810000 .* Load several registers with unaligned data 20820000 .GENICMM ANOP , * 20830000 &I SETA &TO_REG * Save first register number 20840000 &J SETA 0 * Offset in source field 20850000 .GENICMM0 ANOP , * Loop 20860000 &_LABEL ICM &_TO1,YYYY,&_FROM1+&J * 20870000 &_LABEL SETC '' * Remove label after use 20880000 &TO_LEN SETA &TO_LEN-4 * Reduce length 20890000 AIF (&TO_LEN LT 4).MEXIT * No registers left to fill 20900000 &J SETA &J+4 * Point next long field 20910000 &I SETA &I+1 * Next register number 20920000 AIF (&I LT 16).GENICMM1 * Valid register nr 20930000 &I SETA 0 * Wrap-around to R0 20940000 .GENICMM1 ANOP , * I now next register nr 20950000 &_TO1 SETC 'R'.'&I' * Create next register name 20960000 AGO .GENICMM0 * 20970000 .* 20980000 .* Copy alet-qualified addresses register to register 20990000 .GENLAEM ANOP , * 21000000 AIF ('&SYSASCE' EQ 'P').GENLAEMP * Primary mode! 21010000 &_LABEL LAE &_TO1,0(0,&_FROM1) * Copy ALET and address 21020000 &_LABEL SETC '' * Remove used label 21030000 AIF (&TO_LEN EQ 4).MEXIT * 1 register only to copy? 21040000 AGO .GENLAEM0 * 21050000 .GENLAEMP ANOP , * 21060000 &_LABEL LR &_TO1,&_FROM1 * Copy address 21070000 CPYA &_TO2,&_FROM2 * and ALET 21080000 &_LABEL SETC '' * Remove used label 21090000 AIF (&TO_LEN EQ 4).MEXIT * 1 register only to copy? 21100000 .GENLAEM0 ANOP , * Loop to copy register pairs 21110000 &TO_LEN SETA &TO_LEN-4 * Reduce length 21120000 AIF (&TO_LEN LT 4).MEXIT * No registers left to copy 21130000 &TO_REG SETA &TO_REG+1 * Next dest reg nr 21140000 AIF (&TO_REG LT 16).GENLAEM1 * Valid register nr 21150000 &TO_REG SETA 0 * Wrap-around to R0 21160000 .GENLAEM1 ANOP , * TO_REG now next register nr 21170000 &FROM_REG SETA &FROM_REG+1 * Next src reg nr 21180000 AIF (&FROM_REG LT 16).GENLAEM2 * Valid register nr 21190000 &FROM_REG SETA 0 * Wrap-around to R0 21200000 .GENLAEM2 ANOP , * FROM_REG now next register nr 21210000 &_TO1 SETC 'R'.'&TO_REG' * Create next dest.reg name 21220000 &_FROM1 SETC 'R'.'&FROM_REG' * Create next src.reg name 21230000 AIF ('&SYSASCE' EQ 'P').GENLAEM3 * Primary mode! 21240000 LAE &_TO1,0(0,&_FROM1) * Copy ALET and address 21250000 AGO .GENLAEM0 * 21260000 .GENLAEM3 ANOP , * Copy addr+ALET in primary mode 21270000 &_TO2 SETC 'AR'.'&TO_REG' * Create next dest.reg name 21280000 &_FROM2 SETC 'AR'.'&FROM_REG' * Create next src.reg name 21290000 LR &_TO1,&_FROM1 * Copy address 21300000 CPYA &_TO2,&_FROM2 * and ALET 21310000 AGO .GENLAEM0 * 21320000 .* 21330000 .* Load several floating point registers with long operands 21340000 .GENLDM ANOP , * 21350000 &I SETA &TO_REG * Save first register number 21360000 &J SETA 0 * Offset in source field 21370000 .GENLDM0 ANOP , * Loop 21380000 &_LABEL LD &_TO1,&_FROM1+&J * 21390000 &_LABEL SETC '' * Remove label after use 21400000 &TO_LEN SETA &TO_LEN-8 * Reduce length 21410000 AIF (&TO_LEN LT 8).MEXIT * No registers left to fill 21420000 &J SETA &J+8 * Point next long field 21430000 &I SETA &I+2 * Next register number 21440000 AIF (&I LT 8).GENLDM1 * Valid register nr 21450000 &I SETA 0 * Wrap-around to FPR0 21460000 .GENLDM1 ANOP , * I now next register nr 21470000 &_TO1 SETC 'FPR'.'&I' * Create next register name 21480000 AGO .GENLDM0 * 21490000 .* 21500000 .* Load several floating point registers with short operands 21510000 .GENLEM ANOP , * 21520000 &I SETA &TO_REG * Save first register number 21530000 &J SETA 0 * Offset in source field 21540000 .GENLEM0 ANOP , * Loop 21550000 &_LABEL LE &_TO1,&_FROM1+&J * 21560000 &_LABEL SETC '' * Remove label after use 21570000 &TO_LEN SETA &TO_LEN-8 * Reduce length 21580000 AIF (&TO_LEN LT 8).MEXIT * No registers left to fill 21590000 &J SETA &J+4 * Point next short field 21600000 &I SETA &I+2 * Next register number 21610000 AIF (&I LT 8).GENLEM1 * Valid register nr 21620000 &I SETA 0 * Wrap-around to FPR0 21630000 .GENLEM1 ANOP , * I now next register nr 21640000 &_TO1 SETC 'FPR'.'&I' * Create next register name 21650000 AGO .GENLEM0 * 21660000 .* 21670000 .* Load several halfwords into registers 21680000 .GENLHM ANOP , * 21690000 &I SETA &TO_REG * Save first register number 21700000 &J SETA 0 * Offset in source field 21710000 .GENLHM0 ANOP , * Loop 21720000 &_LABEL LH &_TO1,&_FROM1+&J * 21730000 &_LABEL SETC '' * Remove label after use 21740000 &TO_LEN SETA &TO_LEN-4 * Reduce length 21750000 AIF (&TO_LEN LT 4).MEXIT * No registers left to fill 21760000 &J SETA &J+2 * Point next short field 21770000 &I SETA &I+1 * Next register number 21780000 AIF (&I LT 16).GENLHM1 * Valid register nr 21790000 &I SETA 0 * Wrap-around to R0 21800000 .GENLHM1 ANOP , * I now next register nr 21810000 &_TO1 SETC 'R'.'&I' * Create next register name 21820000 AGO .GENLHM0 * 21830000 .* 21840000 .* Load several floating point registers with extended operands 21850000 .GENLXM ANOP , * 21860000 &I SETA &TO_REG * Save first register number 21870000 AIF (&I NE 0 AND &I NE 4).ERR7M * Not a valid pair! 21880000 &I SETA &I+2 * Nr of next register 21890000 &ODDREG SETC 'FPR'.'&I' * Name of second register 21900000 &J SETA 0 * Offset in source field 21910000 .GENLXM0 ANOP , * Loop 21920000 &_LABEL LD &_TO1,&_FROM1+&J * Load low-order register 21930000 &_LABEL SETC '' * Remove label after use 21940000 &J SETA &J+8 * Point next long field 21950000 LD &ODDREG,&_FROM1+&J * Load high-order register 21960000 &TO_LEN SETA &TO_LEN-16 * Reduce length 21970000 AIF (&TO_LEN LT 16).MEXIT * No registers left to fill 21980000 &J SETA &J+8 * Point next long field 21990000 &I SETA &I+2 * Next register number 22000000 AIF (&I LT 8).GENLXM1 * Valid register nr 22010000 &I SETA 0 * Wrap-around to FPR0 22020000 .GENLXM1 ANOP , * I now next register nr 22030000 &_TO1 SETC 'FPR'.'&I' * Create next register name 22040000 &I SETA &I+2 * Nr of next register 22050000 &ODDREG SETC 'FPR'.'&I' * Name of second register 22060000 AGO .GENLXM0 * 22070000 .* 22080000 .* Copy two character fields 22090000 .GENMVCC ANOP , * 22100000 &PAD0 SETB 0 * Use spaces for padding 22110000 &PAD_LEN SETA 0 * Nr of padding bytes needed 22120000 &LEN SETA &TO_LEN * Determine length of move 22130000 AIF (&TO_LEN LE &FROM_LEN).GENMVCC1 22140000 &LEN SETA &FROM_LEN * FROM-length is shorter 22150000 &PAD_LEN SETA &TO_LEN-&FROM_LEN * Nr of padding bytes needed 22160000 .GENMVCC1 ANOP , * &LEN now effective length 22170000 AIF (&LEN GT 256).GENMVCL * 22180000 AIF (&PAD_LEN GT 256).GENMVCL * 22190000 &TO_LEN SETA &LEN * Truncate destination field 22200000 AIF (&PAD_LEN LT 1).DO_MVC * No padding required: use MVC 22210000 &_LABEL CLEAR (&_TO1+&LEN,&PAD_LEN),C' ' * Wipe padding area 22220000 &_LABEL SETC '' * Label no longer needed 22230000 &TO_LEN SETA &LEN * Set source and destination 22240000 &FROM_LEN SETA &LEN * lengths for data move 22250000 AGO .DO_MVC * 22260000 .* 22270000 .* Set up for a long move 22280000 .GENMVCL ANOP , * 22290000 &LEN SETA &FROM_LEN * Determine effective length 22300000 AIF (&TO_LEN GT &FROM_LEN).GENMVCL0 * Which is shorter 22310000 &LEN SETA &TO_LEN * TO_LEN is shorter 22320000 &FROM_LEN SETA &LEN * Make source length shorter 22330000 .GENMVCL0 ANOP , * Len now contains effective len 22340000 &PAD_LEN SETA &TO_LEN-&LEN * Size of pad-area 22350000 .* If possible: generate MVCL instruction 22360000 AIF (&LEN LT 1024 AND &PAD_LEN LT 1).GENMVCL6 * Multiple MVC 22370000 EQUREG PAIR=YES,TEMP=YES,R0=YES,WARN=NO * Alloc src reg pair 22380000 AIF (&BXA_RC NE 0).GENMVCL2 * Allocation failed 22390000 ®_SRCP SETC 'R'.'&BXA_NUMVAL' * Create source ptr reg name 22400000 &BXA_NUMVAL SETA &BXA_NUMVAL+1 * Nr of odd reg in pair 22410000 ®_SRCL SETC 'R'.'&BXA_NUMVAL' * Create source len reg name 22420000 USE ®_SRCP * Set registers in use to 22430000 USE ®_SRCL * prevent re-allocation 22440000 EQUREG PAIR=YES,TEMP=YES,R0=YES,WARN=NO * Alloc dest reg pair 22450000 AIF (&BXA_RC NE 0).GENMVCL1 * Allocation failed 22460000 DROP ®_SRCL * Source register pair 22470000 DROP ®_SRCP * no longer needed 22480000 AGO .DO_MVCL * Two pairs of regs available! 22490000 .GENMVCL1 ANOP , * Second pair not available 22500000 DROP ®_SRCL * Source register pair 22510000 DROP ®_SRCP * no longer needed 22520000 .GENMVCL2 ANOP , * 22530000 .* Cannot use MVCL: try to generate a loop 22540000 &PAD_LEN SETA &TO_LEN-&LEN * Determine pad length 22550000 &I SETA &LEN/256 * Nr of loops to perform 22560000 AIF (&I LE 4).GENMVCL6 * Repeat is shorter than loop? 22570000 EQUREG TEMP=YES,WARN=NO * Allocate src pointer 22580000 AIF (&BXA_RC NE 0).GENMVCL6 * Not enough regs 22590000 ®_SRCP SETC 'R'.'&BXA_NUMVAL' * Create source ptr reg name 22600000 USE ®_SRCP * Set reg in use 22610000 EQUREG TEMP=YES,WARN=NO * Allocate dest pointer 22620000 AIF (&BXA_RC NE 0).GENMVCL5 * Not enough regs 22630000 ®_DSTP SETC 'R'.'&BXA_NUMVAL' * Create dest ptr reg name 22640000 USE ®_DSTP * Set reg in use 22650000 EQUREG TEMP=YES,WARN=NO * A DO loop register available? 22660000 AIF (&BXA_RC NE 0).GENMVCL4 * No reg available for loop 22670000 MNOTE 0,'No two register pairs available: generating a loop' 22680000 ® SETC 'R'.'&BXA_NUMVAL' * Create loop register name 22690000 USE ® * Set loop counter in use 22700000 &_LABEL LA ®_SRCP,&_FROM1 * Init source ptr 22710000 &_LABEL SETC '' * Label no longer needed 22720000 LA ®_DSTP,&_TO1 * Init dest ptr 22730000 CPY ®,&I * Init loop counter 22740000 _CPY&SYSNDX LABEL , * Loop point 22750000 MVC 0(256,®_DSTP),0(®_SRCP) * Move 1 section of data 22760000 INC ®_SRCP,256 * Advance src and dest ptrs 22770000 INC ®_DSTP,256 * to next section of data 22780000 BCT ®,_CPY&SYSNDX * Loop to repeat n times 22790000 DROP ® * Loop counter no longer needed 22800000 &J SETA &LEN-(256*&I) * Calculate remaining length 22810000 AIF (&J LT 1).GENMVCL3 * Any data remains? 22820000 MVC 0(&J,®_DSTP),0(®_SRCP) * Move remaining data 22830000 .GENMVCL3 ANOP , * Data portion has been moved 22840000 DROP ®_DSTP * Free dest ptr 22850000 DROP ®_SRCP * Free src ptr 22860000 .* Now we must set up another loop to pad 22870000 AIF (&PAD_LEN LT 1).MEXIT * No padding: we're done 22880000 &I SETA (&PAD_LEN-1)/256 * Nr of 256-byte sections 22890000 AIF (&I LE 3).GENMVCL9 * List of MVCs shorter than loop 22900000 MVI 0(®_DSTP),C' ' * Insert first pad byte 22910000 LA ®,&I * Nr of sections 22920000 _CPY_&SYSNDX LABEL , * Loop point 22930000 MVC 1(256,®_DSTP),0(®_DSTP) * Pad 1 section 22940000 INC ®_DSTP,256 * Point to next section 22950000 BCT ®,_CPY_&SYSNDX * Loop to repeat n times 22960000 &J SETA (&PAD_LEN-1)-(256*&I) * Remaining pad length 22970000 AIF (&J LT 1).MEXIT * All padding completed? 22980000 MVC 1(&J,®_DSTP),0(®_DSTP) * Wipe remainder 22990000 MEXIT , * 23000000 .GENMVCL4 ANOP , * No loop register available 23010000 DROP ®_DSTP * Free up allocated register 23020000 .GENMVCL5 ANOP , * No loop register available 23030000 DROP ®_SRCP * Free up allocated register 23040000 .GENMVCL6 ANOP , 23050000 .* Last option: generate a lot of MVCs 23060000 MNOTE 0,'Insufficient registers available: generating MVCs' 23070000 &I SETA &LEN/256 * Nr of MVCs to generate 23080000 &J SETA 0 * Loop counter 23090000 .GENMVCL7 ANOP , * Loop to gen MVCs 23100000 AIF (&J GE &I).GENMVCL8 * End of loop 23110000 &_LABEL MVC &_TO1+256*&J.(256),&_FROM1+256*&J 23120000 &_LABEL SETC '' * Wipe used label 23130000 &J SETA &J+1 * 23140000 AGO .GENMVCL7 * 23150000 .GENMVCL8 ANOP , * Gen remaining MVC 23160000 &J SETA &LEN-(256*&I) * Remaining data 23170000 AIF (&J LT 1).GENMVCL9 * No data remains 23180000 &_LABEL MVC &_TO1+256*&I.(&J),&_FROM1+256*&I 23190000 &_LABEL SETC '' * Wipe used label 23200000 .GENMVCL9 ANOP , * All data has been moved 23210000 AIF (&PAD_LEN LT 1).MEXIT * No padding: we're done 23220000 &_TO1 SETC '&_TO1'.'+'.'&LEN' * Set destination area to pad 23230000 &TO_LEN SETA &TO_LEN-&LEN * Set length of padding area 23240000 .* If possible: generate MVCL instruction to fill pad-area 23250000 AIF (&PAD_LEN LE 769).GENMVCL13 * Use set of MVCs: shorter 23260000 EQUREG PAIR=YES,TEMP=YES,R0=YES,WARN=NO * Alloc src reg pair 23270000 AIF (&BXA_RC NE 0).GENMVCL12 * Allocation failed 23280000 ®_SRCP SETC 'R'.'&BXA_NUMVAL' * Create source ptr reg name 23290000 &BXA_NUMVAL SETA &BXA_NUMVAL+1 * Nr of odd reg in pair 23300000 ®_SRCL SETC 'R'.'&BXA_NUMVAL' * Create source len reg name 23310000 USE ®_SRCP * Set registers in use to 23320000 USE ®_SRCL * prevent re-allocation 23330000 EQUREG PAIR=YES,TEMP=YES,R0=YES,WARN=NO * Alloc dest reg pair 23340000 AIF (&BXA_RC NE 0).GENMVCL10 * Allocation failed 23350000 DROP ®_SRCL * Source register pair 23360000 DROP ®_SRCP * no longer needed 23370000 &FROM_LEN SETA 0 * Set source length to 0 23380000 &_FROM1 SETC '0' * Set source ptr to null 23390000 AGO .DO_MVCL * Two pairs of regs available! 23400000 .GENMVCL10 ANOP , * Second pair not available 23410000 DROP ®_SRCL * Source register pair 23420000 DROP ®_SRCP * no longer needed 23430000 .* Cannot use MVCL: try to generate a loop 23440000 &I SETA (&PAD_LEN-1)/256 * Nr of 256-byte sections 23450000 AIF (&I LE 3).GENMVCL13 * Repeat is shorter than loop? 23460000 EQUREG TEMP=YES,WARN=NO * Allocate dest pointer 23470000 AIF (&BXA_RC NE 0).GENMVCL13 * Not enough regs 23480000 ®_DSTP SETC 'R'.'&BXA_NUMVAL' * Create dest ptr reg name 23490000 USE ®_DSTP * Set reg in use 23500000 EQUREG TEMP=YES,WARN=NO * A DO loop register available? 23510000 AIF (&BXA_RC NE 0).GENMVCL12 * No reg available for loop 23520000 ® SETC 'R'.'&BXA_NUMVAL' * Create loop register name 23530000 USE ® * Set loop counter in use 23540000 LA ®_DSTP,&_TO1 * Point to pad-area 23550000 MVI 0(®_DSTP),C' ' * Insert first pad byte 23560000 LA ®,&I * Nr of sections 23570000 _CPY_&SYSNDX LABEL , * Loop point 23580000 MVC 1(256,®_DSTP),0(®_DSTP) * Pad 1 section 23590000 INC ®_DSTP,256 * Point to next section 23600000 BCT ®,_CPY_&SYSNDX * Loop to repeat n times 23610000 DROP ® * Loop counter no longer needed 23620000 DROP ®_DSTP * 23630000 &J SETA (&PAD_LEN-1)-(256*&I) * Remaining pad length 23640000 AIF (&J LT 1).MEXIT * All padding completed? 23650000 MVC 1(&J,®_DSTP),0(®_DSTP) * Wipe remainder 23660000 MEXIT , * 23670000 .GENMVCL12 ANOP , * 23680000 DROP ®_DSTP * 23690000 .GENMVCL13 ANOP , * 23700000 &I SETA (&PAD_LEN-1)/256 * Nr of 256-byte sections 23710000 MVI &_TO1,C' ' * Insert first pad byte 23720000 &J SETA 0 * Loop counter 23730000 .GENMVCL15 ANOP , * 23740000 AIF (&J GE &I).GENMVCL16 * End of loop 23750000 MVC &_TO1+1+256*&J.(256),&_TO1+256*&J 23760000 &J SETA &J+1 * 23770000 AGO .GENMVCL15 * 23780000 .GENMVCL16 ANOP , * 23790000 &J SETA (&PAD_LEN-1)-(256*&I) * Remaining pad-length 23800000 AIF (&J LT 1).MEXIT * No more padding: we're done 23810000 MVC &_TO1+1+256*&I.(&J),&_TO1+256*&I 23820000 MEXIT , * 23830000 .* 23840000 .* Copy two unsigned fields of unequal length, under 256 23850000 .GENMVC0 ANOP , * 23860000 AIF (&TO_LEN GT 255).ERR7D * Length within limit? 23870000 AIF (&FROM_LEN GT 255).ERR7E * Length within limit? 23880000 AIF (&TO_LEN EQ &FROM_LEN).DO_MVC * Lengths equal? 23890000 AIF (&TO_LEN LT &FROM_LEN).GENMVC0A * Adjust source 23900000 .* Destination field is larger 23910000 &I SETA &TO_LEN-&FROM_LEN * Data offset in TO-field 23920000 AIF (&I GT 1).GENMVC0XC * Length to clear > 1: use XC 23930000 &_LABEL MVI &_TO1.,X'00' * Wipe destination area 23940000 AGO .GENMVC0B * 23950000 .GENMVC0XC ANOP , * 23960000 &_LABEL XC &_TO1.(&I),&_TO1 * Wipe destination area 23970000 .GENMVC0B ANOP , * Destination field now cleared 23980000 &_LABEL SETC '' * Remove label 23990000 &_TO1 SETC '&_TO1'.'+&I' * Add offset to TO field 24000000 &TO_LEN SETA &FROM_LEN * Reduce length of TO field 24010000 AGO .DO_MVC * Go generate MVC instruction 24020000 .* Source field is larger 24030000 .GENMVC0A ANOP , * 24040000 &I SETA &FROM_LEN-&TO_LEN * Data offset in FROM-field 24050000 &_FROM1 SETC '&_FROM1'.'+&I' * Add offset to FROM field 24060000 &FROM_LEN SETA &TO_LEN * Reduce length of FROM field 24070000 AGO .DO_MVC * Go generate MVC instruction 24080000 .* 24090000 .* Store several registers into unaligned field 24100000 .GENSTCMM ANOP , * 24110000 &I SETA &FROM_REG * Save first register number 24120000 &J SETA 0 * Offset in source field 24130000 .GENSTCMM0 ANOP , * Loop 24140000 &_LABEL STCM &_FROM1,YYYY,&_TO1+&J * 24150000 &_LABEL SETC '' * Remove label after use 24160000 &TO_LEN SETA &TO_LEN-4 * Reduce length 24170000 AIF (&TO_LEN LT 4).MEXIT * No registers left to fill 24180000 &J SETA &J+4 * Point next dest field 24190000 &I SETA &I+1 * Next register number 24200000 AIF (&I LT 16).GENSTCMM1 * Valid register nr 24210000 &I SETA 0 * Wrap-around to R0 24220000 .GENSTCMM1 ANOP , * I now next register nr 24230000 &_FROM1 SETC 'R'.'&I' * Create next register name 24240000 AGO .GENSTCMM0 * 24250000 .* 24260000 .* Store several floating point registers into long operands 24270000 .GENSTDM ANOP , * 24280000 &I SETA &FROM_REG * Save first register number 24290000 &J SETA 0 * Offset in dest. field 24300000 .GENSTDM0 ANOP , * Loop 24310000 &_LABEL STD &_FROM1,&_TO1+&J * 24320000 &_LABEL SETC '' * Remove label after use 24330000 &TO_LEN SETA &TO_LEN-8 * Reduce length 24340000 AIF (&TO_LEN LT 8).MEXIT * No registers left to save 24350000 &J SETA &J+8 * Point next long field 24360000 &I SETA &I+2 * Next register number 24370000 AIF (&I LT 8).GENSTDM1 * Valid register nr 24380000 &I SETA 0 * Wrap-around to FPR0 24390000 .GENSTDM1 ANOP , * I now next register nr 24400000 &_FROM1 SETC 'FPR'.'&I' * Create next register name 24410000 AGO .GENSTDM0 * 24420000 .* 24430000 .* Store several floating point registers into short operands 24440000 .GENSTEM ANOP , * 24450000 &I SETA &FROM_REG * Save first register number 24460000 &J SETA 0 * Offset in dest. field 24470000 .GENSTEM0 ANOP , * Loop 24480000 &_LABEL STE &_FROM1,&_TO1+&J * 24490000 &_LABEL SETC '' * Remove label after use 24500000 &TO_LEN SETA &TO_LEN-4 * Reduce length 24510000 AIF (&TO_LEN LT 4).MEXIT * No registers left to save 24520000 &J SETA &J+4 * Point next long field 24530000 &I SETA &I+2 * Next register number 24540000 AIF (&I LT 8).GENSTEM1 * Valid register nr 24550000 &I SETA 0 * Wrap-around to FPR0 24560000 .GENSTEM1 ANOP , * I now next register nr 24570000 &_FROM1 SETC 'FPR'.'&I' * Create next register name 24580000 AGO .GENSTEM0 * 24590000 .* 24600000 .* Store several registers into halfwords 24610000 .GENSTHM ANOP , * 24620000 &I SETA &FROM_REG * Save first register number 24630000 &J SETA 0 * Offset in dest. field 24640000 .GENSTHM0 ANOP , * Loop 24650000 &_LABEL STH &_FROM1,&_TO1+&J * 24660000 &_LABEL SETC '' * Remove label after use 24670000 &TO_LEN SETA &TO_LEN-2 * Reduce length 24680000 AIF (&TO_LEN LT 2).MEXIT * No registers left to save 24690000 &J SETA &J+2 * Point next halfword 24700000 &I SETA &I+1 * Next register number 24710000 AIF (&I LT 16).GENSTHM1 * Valid register nr 24720000 &I SETA 0 * Wrap-around to R0 24730000 .GENSTHM1 ANOP , * I now next register nr 24740000 &_FROM1 SETC 'R'.'&I' * Create next register name 24750000 AGO .GENSTHM0 * 24760000 .* 24770000 .* Save several floating point registers into extended operands 24780000 .GENSTXM ANOP , * 24790000 &I SETA &FROM_REG * Save first register number 24800000 AIF (&I NE 0 AND &I NE 4).ERR7V * Not a valid pair! 24810000 &I SETA &I+2 * Nr of next register 24820000 &ODDREG SETC 'FPR'.'&I' * Name of second register 24830000 &J SETA 0 * Offset in source field 24840000 .GENSTXM0 ANOP , * Loop 24850000 &_LABEL STD &_FROM1,&_TO1+&J * Save low-order register 24860000 &_LABEL SETC '' * Remove label after use 24870000 &J SETA &J+8 * Point next long field 24880000 STD &ODDREG,&_TO1+&J * Save high-order register 24890000 &TO_LEN SETA &TO_LEN-16 * Reduce length 24900000 AIF (&TO_LEN LT 16).MEXIT * No registers left to fill 24910000 &J SETA &J+8 * Point next long field 24920000 &I SETA &I+2 * Next register number 24930000 AIF (&I LT 8).GENSTXM1 * Valid register nr 24940000 &I SETA 0 * Wrap-around to FPR0 24950000 .GENSTXM1 ANOP , * I now next register nr 24960000 &_FROM1 SETC 'FPR'.'&I' * Create next register name 24970000 &I SETA &I+2 * Nr of next register 24980000 &ODDREG SETC 'FPR'.'&I' * Name of second register 24990000 AGO .GENSTXM0 * 25000000 .* 25010000 .* Generate an Extract stacked REGisters 25020000 .DO_EREG ANOP , * 25030000 &I SETA &TO_LEN/4 * Get number of registers 25040000 &I SETA &TO_REG+&I-1 * Get ending register number 25050000 AIF (&I LE 15).DO_EREG1 * End-reg is ok 25060000 &I SETA &I-16 * Perform wrap-around 25070000 .DO_EREG1 ANOP , * End-register determined 25080000 ® SETC 'R'.'&I' * Create register name 25090000 &_LABEL EREG &_TO1,® * 25100000 MEXIT , * 25110000 .* 25120000 .* Generate an Insert Characters under Mask 25130000 .DO_ICM ANOP , * 25140000 &_LABEL ICM &_TO1,&MASK,&_FROM1 * 25150000 MEXIT , * 25160000 .* 25170000 .* Generate a Load instruction to fill a register 25180000 .DO_L ANOP , * 25190000 &_LABEL L &_TO1,&_FROM1 * 25200000 MEXIT , * 25210000 .* 25220000 .* Generate a CVB instruction to fill a register 25230000 .DO_CVB ANOP , * 25240000 &_LABEL CVB &_TO1,&_FROM1 * 25250000 MEXIT , * 25260000 .* 25270000 .* Generate a Load Access Multiple instruction to fill some ARs 25280000 .DO_LAM ANOP , * 25290000 ® SETC '&_TO1' * Default end register name 25300000 AIF (&TO_LEN EQ 4).DO_LAM1 * Ok: load 1 access register 25310000 &I SETA &TO_LEN/4 * Get number of registers 25320000 &I SETA &TO_REG+&I-1 * Get ending register number 25330000 ® SETC 'AR'.'&I' * Create register name 25340000 AIF (&I LE 15).DO_LAM1 * End-reg is ok 25350000 &I SETA &I-16 * Perform wrap-around 25360000 ® SETC 'AR'.'&I' * Create register name 25370000 .DO_LAM1 ANOP , * End-register determined 25380000 &_LABEL LAM &_TO1,®,&_FROM1 * 25390000 MEXIT , * 25400000 .* 25410000 .* Generate a Load Control instruction to fill some control registers 25420000 .DO_LCTL ANOP , * 25430000 ® SETC '&_TO1' * Default end register name 25440000 AIF (&TO_LEN EQ 4).DO_LCTL1 * Ok: load 1 control register 25450000 &I SETA &TO_LEN/4 * Get number of registers 25460000 &I SETA &TO_REG+&I-1 * Get ending register number 25470000 ® SETC 'CR'.'&I' * Create register name 25480000 AIF (&I LE 15).DO_LCTL1 * End-reg is ok 25490000 &I SETA &I-16 * Perform wrap-around 25500000 ® SETC 'CR'.'&I' * Create register name 25510000 .DO_LCTL1 ANOP , * End-register determined 25520000 &_LABEL LCTL &_TO1,®,&_FROM1 * 25530000 MEXIT , * 25540000 .* 25550000 .* Generate a Load floating point (long) 25560000 .DO_LD ANOP , * 25570000 &_LABEL LD &_TO1,&_FROM1 * 25580000 MEXIT , * 25590000 .* 25600000 .* Generate a Load floating point (short) 25610000 .DO_LE ANOP , * 25620000 &_LABEL LE &_TO1,&_FROM1 * 25630000 MEXIT , * 25640000 .* 25650000 .* Generate a Load Multiple instruction to fill some registers 25660000 .DO_LM ANOP , * 25670000 AIF (&TO_LEN EQ 4).DO_L * Load only 1 register 25680000 &I SETA &TO_LEN/4 * Get number of registers 25690000 &I SETA &TO_REG+&I-1 * Get ending register number 25700000 AIF (&I LE 15).DO_LM1 * End-reg is ok 25710000 &I SETA &I-16 * Perform wrap-around 25720000 .DO_LM1 ANOP , * End-register determined 25730000 ® SETC 'R'.'&I' * Create register name 25740000 &_LABEL LM &_TO1,®,&_FROM1 * 25750000 MEXIT , * 25760000 .* 25770000 .* Copy two fields of equal length, under 256 25780000 .* Generate explict length when specified or needed 25790000 .DO_MVC ANOP , * 25800000 AIF (K'&_TO2 NE 0).DO_MVC1 * Use explicit length specified 25810000 AIF (&TO_LEN NE L'&_TO1).DO_MVC1 * Use deviating length 25820000 &_LABEL MVC &_TO1,&_FROM1 * Use implicit length 25830000 MEXIT , * 25840000 .DO_MVC1 ANOP , * 25850000 &_LABEL MVC &_TO1.(&TO_LEN),&_FROM1 * 25860000 MEXIT , * 25870000 .* 25880000 .* Copy data, using MVCL 25890000 .DO_MVCL ANOP , * 25900000 EQUREG PAIR=YES,TEMP=YES,R0=YES * Allocate src reg pair 25910000 AIF (&BXA_RC NE 0).ERR7F * Allocation failed 25920000 ®_SRCP SETC 'R'.'&BXA_NUMVAL' * Create source ptr reg name 25930000 &BXA_NUMVAL SETA &BXA_NUMVAL+1 * Nr of odd reg in pair 25940000 ®_SRCL SETC 'R'.'&BXA_NUMVAL' * Create source len reg name 25950000 USE ®_SRCP * Set registers 25960000 USE ®_SRCL * in use 25970000 EQUREG PAIR=YES,TEMP=YES,R0=YES * Allocate dest reg pair 25980000 AIF (&BXA_RC NE 0).ERR7F * Allocation failed 25990000 ®_DSTP SETC 'R'.'&BXA_NUMVAL' * Create dest ptr reg name 26000000 &BXA_NUMVAL SETA &BXA_NUMVAL+1 * Nr of odd reg in pair 26010000 ®_DSTL SETC 'R'.'&BXA_NUMVAL' * Create dest len reg name 26020000 USE ®_DSTP * Set registers 26030000 USE ®_DSTL * in use 26040000 .* Set source length 26050000 AIF (&FROM_LEN EQ 0).DO_MVCLA * Length is in a register? 26060000 &_LABEL CPY ®_SRCL,&FROM_LEN * Set length of source data 26070000 AGO .GENMVCLB * 26080000 .DO_MVCLA ANOP , * 26090000 &_LABEL LR ®_SRCL,&_FROM2 * Set length of source data 26100000 .DO_MVCLB ANOP , * 26110000 &_LABEL SETC '' * Label no longer needed 26120000 .* Set source address 26130000 AIF ('&_FROM1' EQ '0').DO_MVCL0 26140000 AIF ('&FROM_TP' EQ 'p').DO_MVCLC * Pointered source field? 26150000 AGO .DO_MVCLE * No: normal field 26160000 .DO_MVCLC ANOP , * 26170000 AIF ('&SYSASCE' EQ 'P').DO_MVCLD * Primary mode? 26180000 LAE ®_SRCP,0(,&_FROM1) * Point to source data 26190000 AGO .DO_MVCL1 * 26200000 .DO_MVCLD ANOP , * 26210000 LR ®_SRCP,&_FROM1 * Point to source data 26220000 AGO .DO_MVCL1 * 26230000 .DO_MVCLE ANOP , * 26240000 AIF ('&SYSASCE' EQ 'P').DO_MVCLF * Primary mode? 26250000 LAE ®_SRCP,&_FROM1 * Point to source data 26260000 AGO .DO_MVCL1 * 26270000 .DO_MVCLF ANOP , * 26280000 LA ®_SRCP,&_FROM1 * Point to source data 26290000 AGO .DO_MVCL1 * 26300000 .DO_MVCL0 ANOP , * 26310000 CLEAR ®_SRCP * Clear source data pointer 26320000 .DO_MVCL1 ANOP , * 26330000 .* Set destination length 26340000 AIF (&TO_LEN NE 0).DO_MVCLG 26350000 LR ®_DSTL,&_TO2 * Set length of dest field 26360000 AGO .DO_MVCL3 * 26370000 .DO_MVCLG ANOP , * 26380000 AIF (&TO_LEN NE &FROM_LEN).DO_MVCL2 26390000 LR ®_DSTL,®_SRCL * Copy data length 26400000 AGO .DO_MVCL3 * 26410000 .DO_MVCL2 ANOP , * 26420000 CPY ®_DSTL,&TO_LEN * Set length of dest field 26430000 .DO_MVCL3 ANOP , * 26440000 .* Set destination address 26450000 AIF ('&TO_TP' EQ 'p').DO_MVCLH * Pointered dest field? 26460000 AGO .DO_MVCLJ * No: normal field 26470000 .DO_MVCLH ANOP , * 26480000 AIF ('&SYSASCE' EQ 'P').DO_MVCLI * Primary mode? 26490000 LAE ®_DSTP,0(,&_TO1) * Point to destination field 26500000 AGO .DO_MVCL4 * 26510000 .DO_MVCLI ANOP , * 26520000 LR ®_DSTP,&_TO1 * Point to destination field 26530000 AGO .DO_MVCL4 * 26540000 .DO_MVCLJ ANOP , * 26550000 AIF ('&SYSASCE' EQ 'P').DO_MVCLK * Primary mode? 26560000 LAE ®_DSTP,&_TO1 * Point to destination field 26570000 AGO .DO_MVCL4 * 26580000 .DO_MVCLK ANOP , * 26590000 LA ®_DSTP,&_TO1 * Point to destination field 26600000 .DO_MVCL4 ANOP , * 26610000 .* Insert padding into source length register 26620000 AIF (&FROM_LEN EQ 0).DO_MVCL5 * Pad with zeros if needed 26630000 AIF (&TO_LEN EQ 0).DO_MVCL5 * Pad with zeros if needed 26640000 AIF (&FROM_LEN GE &TO_LEN).DO_MVCL5 * No padding needed 26650000 AIF (&PAD0).DO_MVCL5 * Pad=X'00' --> No pad needed 26660000 ICM ®_SRCL,YNNN,=C' ' * Set padding to spaces 26670000 .DO_MVCL5 ANOP , * 26680000 .* 26690000 MVCL ®_DSTP,®_SRCP * 26700000 DROP ®_DSTL * Destination register pair 26710000 DROP ®_DSTP * no longer needed 26720000 DROP ®_SRCL * Source register pair 26730000 DROP ®_SRCP * no longer available 26740000 MEXIT , * 26750000 .* 26760000 .* Generate a PACK to copy zoned decimal data to a packed field 26770000 .DO_PACK ANOP , * 26780000 AIF (K'&_TO2 NE 0).DO_PACK0 * 26790000 AIF (&TO_LEN NE L'&_TO1).DO_PACK0 * 26800000 AGO .DO_PACK1 * 26810000 .DO_PACK0 ANOP , * Add explicit dest.length 26820000 &_TO1 SETC '&_TO1'.'(&TO_LEN)' * Add length to destination 26830000 .DO_PACK1 ANOP , * Length now in destination fld 26840000 AIF (K'&_FROM2 NE 0).DO_PACK2 * 26850000 AIF (&FROM_LEN NE L'&_FROM1).DO_PACK2 * 26860000 AGO .DO_PACK3 * 26870000 .DO_PACK2 ANOP , * Add explicit src.length 26880000 &_FROM1 SETC '&_FROM1'.'(&FROM_LEN)' * Add length to source 26890000 .DO_PACK3 ANOP , * Length now in source fld 26900000 &_LABEL PACK &_TO1,&_FROM1 * 26910000 MEXIT , * 26920000 .* 26930000 .* Generate a Store register 26940000 .DO_ST ANOP , * 26950000 &_LABEL ST &_FROM1,&_TO1 * 26960000 MEXIT , * 26970000 .* 26980000 .* Generate a Store Access Multiple instruction to save some ARs 26990000 .DO_STAM ANOP , * 27000000 &I SETA &FROM_LEN/4 * Get number of registers 27010000 &I SETA &FROM_REG+&I-1 * Get ending register number 27020000 ® SETC 'AR'.'&I' * Create register name 27030000 AIF (&I LE 15).DO_STAM1 * End-reg is ok 27040000 &I SETA &I-16 * Perform wrap-around 27050000 ® SETC 'AR'.'&I' * Create register name 27060000 .DO_STAM1 ANOP , * End-register determined 27070000 &_LABEL STAM &_FROM1,®,&_TO1 * 27080000 MEXIT , * 27090000 .* 27100000 .* Generate a Store characters under mask 27110000 .DO_STCM ANOP , * 27120000 &_LABEL STCM &_FROM1,&MASK,&_TO1 * 27130000 MEXIT , * 27140000 .* 27150000 .* Generate a Store Control instruction to fill some control registers 27160000 .DO_STCTL ANOP , * 27170000 &I SETA &FROM_LEN/4 * Get number of registers 27180000 &I SETA &FROM_REG+&I-1 * Get ending register number 27190000 ® SETC 'CR'.'&I' * Create register name 27200000 AIF (&I LE 15).DO_STCTL1 * End-reg is ok 27210000 &I SETA &I-16 * Perform wrap-around 27220000 ® SETC 'CR'.'&I' * Create register name 27230000 .DO_STCTL1 ANOP , * End-register determined 27240000 &_LABEL STCTL &_FROM1,®,&_TO1 * 27250000 MEXIT , * 27260000 .* 27270000 .* Generate a Store floating point (long) 27280000 .DO_STD ANOP , * 27290000 &_LABEL STD &_FROM1,&_TO1 * 27300000 MEXIT , * 27310000 .* 27320000 .* Generate a Store floating point (short) 27330000 .DO_STE ANOP , * 27340000 &_LABEL STE &_FROM1,&_TO1 * 27350000 MEXIT , * 27360000 .* 27370000 .* Generate a Store Halfword 27380000 .DO_STH ANOP , * 27390000 &_LABEL STH &_FROM1,&_TO1 * 27400000 MEXIT , * 27410000 .* 27420000 .* Generate a Store Multiple instruction to save some registers 27430000 .DO_STM ANOP , * 27440000 &I SETA &FROM_LEN/4 * Get number of registers 27450000 &I SETA &FROM_REG+&I-1 * Get ending register number 27460000 AIF (&I LE 15).DO_STM1 * End-reg is ok 27470000 &I SETA &I-16 * Perform wrap-around 27480000 .DO_STM1 ANOP , * End-register determined 27490000 ® SETC 'R'.'&I' * Create register name 27500000 &_LABEL STM &_FROM1,®,&_TO1 * 27510000 MEXIT , * 27520000 .* 27530000 .* Generate an UNPK to copy packed decimal data to a zoned field 27540000 .DO_UNPK ANOP , * 27550000 AIF (K'&_TO2 NE 0).DO_UNPK0 * 27560000 AIF (&TO_LEN NE L'&_TO1).DO_UNPK0 * 27570000 AGO .DO_UNPK1 * 27580000 .DO_UNPK0 ANOP , * Add explicit dest.length 27590000 &_TO1 SETC '&_TO1'.'(&TO_LEN)' * Add length to destination 27600000 .DO_UNPK1 ANOP , * Length now in destination fld 27610000 AIF (K'&_FROM2 NE 0).DO_UNPK2 * 27620000 AIF (&FROM_LEN NE L'&_FROM1).DO_UNPK2 * 27630000 AGO .DO_UNPK3 * 27640000 .DO_UNPK2 ANOP , * Add explicit src.length 27650000 &_FROM1 SETC '&_FROM1'.'(&FROM_LEN)' * Add length to source 27660000 .DO_UNPK3 ANOP , * Length now in source fld 27670000 &_LABEL UNPK &_TO1,&_FROM1 * 27680000 MEXIT , * 27690000 .* 27700000 .* Generate a ZAP to copy packed decimal data 27710000 .DO_ZAP ANOP , * 27720000 AIF (K'&_TO2 NE 0).DO_ZAP0 * 27730000 AIF (&TO_LEN NE L'&_TO1).DO_ZAP0 * 27740000 AGO .DO_ZAP1 * 27750000 .DO_ZAP0 ANOP , * Add explicit dest.length 27760000 &_TO1 SETC '&_TO1'.'(&TO_LEN)' * Add length to destination 27770000 .DO_ZAP1 ANOP , * Length now in destination fld 27780000 AIF (K'&_FROM2 NE 0).DO_ZAP2 * 27790000 AIF (&FROM_LEN NE L'&_FROM1).DO_ZAP2 * 27800000 AGO .DO_ZAP3 * 27810000 .DO_ZAP2 ANOP , * Add explicit src.length 27820000 &_FROM1 SETC '&_FROM1'.'(&FROM_LEN)' * Add length to source 27830000 .DO_ZAP3 ANOP , * Length now in source fld 27840000 &_LABEL ZAP &_TO1,&_FROM1 * 27850000 MEXIT , * 27860000 .* 27870000 .MEXIT ANOP , * 27880000 MEND 27890000
Please e-mail us with your comments. Thanks in advance.
To our homepage.
This site is a member of WebRing. You are invited to browse the list of mainframe-loving sites. |
Dinos are not dead. They are alive and well and living in data centers all around you. They speak in tongues and work strange magics with computers. Beware the dino! And just in case you're waiting for the final demise of these dino's: remember that dinos ruled the world for 155-million years! | |
[ Join Now | Ring Hub | Random | | ] |