🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: bit.listserv.asm370
Article #200

More about the CUSE instruction and z390 implementation

#200
From: Don Higgins
Date: Sun, 16 Oct 2005 17:14
185 lines
8399 bytes
Today I added support for the CUSE instruction to the z390 assembler and
emulator open source Java tool available at www.z390.org.  This was one of
those few remaining infrequently used instructions I did not get
implemented in z390 v1.0.00.

I started looking for sample code by searching the web via Google and only
found John's SHARE session describing CUSE as one of new opcodes back in
2000:

http://xweb.share.org/proceedings/sh96/data/S8162.PDF

I coded up the following new regression test code for z390:

         TITLE 'TEST CUSE AND CLST STRING INSTRUCTIONS'
CUSE1    RT1   MAIN
         EQUREGS
KEY      DC    C'EFE'
PAD      DC    C' '
STRING1  DC    C'CABCBFDEFEAB'
STRING2  DC    C'ACBABBCEFEAB'
         RT1   START
         LA    R0,L'KEY
         LA    R1,PAD
         LM    R2,R5,=A(STRING1,L'STRING1,STRING2,L'STRING2)
         CUSE  2,4
         JO    *-4
         RT1   CCE,0(L'KEY,R2),KEY
         RT1   CCE,0(L'KEY,R4),KEY
         CL    R3,=A(L'STRING1-7)
         RT1   CCE
         CL    R5,=A(L'STRING2-7)
         RT1   CCE
         RT1   END
         END

I assembled linked and executed this code on my Windows XP system getting
0C1 abend on the undefined CUSE instruction.  Then I proceeded to add the
following Java code to ez390.java to implement this instruction which will
be in the next z390 v1.0.03 release:

.....
     case 0x57:  // 3190 "B257" "CUSE" "RRE"
       psw_check = false;
      ins_setup_rre();
         exec_cuse();
         break;
.....

.....
private void exec_cuse(){
 /*
  * search for matching string at same offset
  * in two fields:
  *   r0 = length up to 255
  *   r1 = pad char
  *   rf1,rf2 = addr and lengh regs
  *   cc0 - key found and rf1, rf2 updated
  *   cc1 - ended at longer operand, last byte =
  *   cc2 - ended at longer operand, last byte !=
  *   cc3 - search incomplete retry
  */
    int  key_len  = reg.getInt(r0);
    byte str_pad  = reg.get(r1+3);
    int  str1_loc = reg.getInt(rf1+4) & psw_amode;
    int  str1_len = reg.getInt(rf1+12);
    int  str2_loc = reg.getInt(rf2+4) & psw_amode;
    int  str2_len = reg.getInt(rf2+12);
    int  max_str_len = str1_len;
    if (str2_len > str1_len){
     max_str_len = str2_len;
    }
    int index1 = 0;
    int index2 = 0;
    byte str1_byte;
    byte str2_byte;
    psw_cc = psw_cc1;
    while (index1 < max_str_len && psw_cc != psw_cc0){
     if (index1 < str1_len){
      str1_byte = mem.get(str1_loc + index1);
     } else {
      str1_byte = str_pad;
     }
     if (index1 < str2_len){
      str2_byte = mem.get(str2_loc + index1);
     } else {
      str2_byte = str_pad;
     }
     if (str1_byte == str2_byte){
    psw_cc = psw_cc1;
      index2++;
       if (index2 == key_len){
        psw_cc = psw_cc0;
       }
     } else {
      psw_cc = psw_cc2;
      index2 = 0;
     }
     index1++;
     }
     if (index1 < str1_len){
      reg.putInt(rf1+4,str1_loc + index1 - key_len);
       reg.putInt(rf1+12,str1_len - index1 + key_len);
     } else {
  reg.putInt(rf1+4,str1_loc + str1_len);
  reg.putInt(rf1+12,0);
     }
     if (index1 < str2_len){
      reg.putInt(rf2+4,str2_loc + index1 - key_len);
      reg.putInt(rf2+12,str2_len - index1 + key_len);
     } else {
      reg.putInt(rf2+4,str2_loc + str2_len);
      reg.putInt(rf2+12,0);
     }
}

With this code implemented, I generated the following z390 execution trace:

ez390 V1.0.02 Current Date 10/16/05 Time 12:07:12
Copyright 2005 Automated Software Tools Corporation
z390 is licensed under GNU General Public License
EZ390 program = CUSE1
EZ390 options = trace
 800FFE28 0 90ECD00C     STM   RE=00000260 RC=00000000 S2(00000224)
=00000000
 800FFE2C 0 45F0F050     BAL   RF=800FFE28 S2(000FFE78)=50FD0008 ST
 800FFE78 0 50FD0008     ST    RF=800FFE30 S2(00000220)=00000000
 800FFE7C 0 50DF0004     ST    RD=00000218 S2(000FFE34)=00000000
 800FFE80 0 18DF         LR    RD=00000218 RF=800FFE30
 800FFE82 0 4510D06C     BAL   R1=000001D8 S2(000FFE9C)=0A23 SVC
 800FFE9C 0 0A23         SVC   I1=23
WTO MSG = CUSE1 RT1 STARTED
 800FFE9E 0 47F0D162     B     S2(000FFF92)=41000003 LA
 800FFF92 0 41000003     LA    R0=800FFE28 S2(00000003)
 800FFF96 0 4110D149     LA    R1=800FFE86 S2(000FFF79)
 800FFF9A 0 9825D188     LM    R2=00000000 R5=00000000 S2(000FFFB8)
=000FFF7A
 800FFF9E 0 B2570024     CUSE  R2=00000000000FFF7A R4=00000000000FFF86
 800FFFA2 0 A714FFFE     BRO   S2(000FFF9E)=B2570024 CUSE
 800FFFA6 0 D5022000D146 CLC   S1(000FFF81)=C5C6C5 S2(000FFF76)=C5C6C5
 800FFFAC 0 A7B5FFCD     BRAS  RB=00000000 S2(000FFF46)=4770D072 BNL
 800FFF46 0 4770D072     BNE   S2(000FFEA2)=92E3D10E MVI
 800FFF4A 0 FA20D0E4D0E7 AP    S1(000FFF14)=00000C S2(000FFF17)=1C
 800FFF50 2 07FB         BR    R2(800FFFB0)=47F0B018 B
 800FFFB0 2 47F0B018     B     S2(000FFFC8)=D5024000D146 CLC
 800FFFC8 2 D5024000D146 CLC   S1(000FFF8D)=C5C6C5 S2(000FFF76)=C5C6C5
 800FFFCE 0 A7B5FFBC     BRAS  RB=800FFFB0 S2(000FFF46)=4770D072 BNL
 800FFF46 0 4770D072     BNE   S2(000FFEA2)=92E3D10E MVI
 800FFF4A 0 FA20D0E4D0E7 AP    S1(000FFF14)=00001C S2(000FFF17)=1C
 800FFF50 2 07FB         BR    R2(800FFFD2)=47F0B006 B
 800FFFD2 2 47F0B006     B     S2(000FFFD8)=5530B016 CL
 800FFFD8 2 5530B016     CL    R3=00000005 S2(000FFFE8)=00000005
 800FFFDC 0 A7B5FFB5     BRAS  RB=800FFFD2 S2(000FFF46)=4770D072 BNL
 800FFF46 0 4770D072     BNE   S2(000FFEA2)=92E3D10E MVI
 800FFF4A 0 FA20D0E4D0E7 AP    S1(000FFF14)=00002C S2(000FFF17)=1C
 800FFF50 2 07FB         BR    R2(800FFFE0)=47F0B00C B
 800FFFE0 2 47F0B00C     B     S2(000FFFEC)=5550B018 CL
 800FFFEC 2 5550B018     CL    R5=00000005 S2(000FFFF8)=00000005
 800FFFF0 0 A7B5FFAB     BRAS  RB=800FFFE0 S2(000FFF46)=4770D072 BNL
 800FFF46 0 4770D072     BNE   S2(000FFEA2)=92E3D10E MVI
 800FFF4A 0 FA20D0E4D0E7 AP    S1(000FFF14)=00003C S2(000FFF17)=1C
 800FFF50 2 07FB         BR    R2(800FFFF4)=47F0B008 B
 800FFFF4 2 47F0B008     B     S2(000FFFFC)=47F0D09A B
 800FFFFC 2 47F0D09A     B     S2(000FFECA)=D205D108D110 MVC
 800FFECA 2 D205D108D110 MVC   S1(000FFF38)=40E9E9E9 S2(000FFF40)=40202020
 800FFED0 2 DE05D108D0E4 DE    S1(000FFF38)=40202020 S2(000FFF14)=00004C1C
 800FFED6 2 4110D0E8     LA    R1=000FFF79 S2(000FFF18)
 800FFEDA 2 0A23         SVC   I1=23
WTO MSG = CUSE1 RT1 TESTS COMPLETED =      4
 800FFEDC 2 95E3D10E     CLI   S2(000FFF3E)=C6 I2=E3
 800FFEE0 1 4780D0DE     BE    S2(000FFF0E)=41100101 LA
 800FFEE4 1 4510D0CE     BAL   R1=000FFF18 S2(000FFEFE)=0A23 SVC
 800FFEFE 1 0A23         SVC   I1=23
WTO MSG = CUSE1 RT1 ENDED OK
 800FFF00 1 58DD0004     L     RD=800FFE30 S2(000FFE34)=00000218
 800FFF04 1 980CD014     LM    R0=00000003 RC=00000000 S2(0000022C)
=800FFE28
 800FFF08 1 58ED000C     L     RE=00000260 S2(00000224)=00000260
 800FFF0C 1 07FE         BR    R2(00000260)=0A03 SVC
 80000260 1 0A03         SVC   I1=03
Stats total instructions    = 51

I'd be interested in any feedback on this code and sample uses for CUSE.

Don Higgins
don@higgins.net
Technical Details
Message-ID: <200510161714.j9GGLS4E030576@malibu.cc.uga.edu>
Path: arc1-ca.pugleaf.net!g2news1.google.com!news4.google.com!news.glorb.com!newsfeed2.easynews.com!newsfeed1.easynews.com!easynews.com!easynews!sn-xit-02!sn-xit-06!sn-xit-05!sn-xit-14!supernews.com!149.173.6.116.MISMATCH!foggy!vm.sas.com!HIGGINS.NET!don

Show Full Headers
Complete Article Headers
X-Google-Thread: fcdcb,ef3b579ab819d9bf,start
X-Google-Attributes: gidfcdcb,public
X-Google-Language: ENGLISH,ASCII-7-bit
Path: arc1-ca.pugleaf.net!g2news1.google.com!news4.google.com!news.glorb.com!newsfeed2.easynews.com!newsfeed1.easynews.com!easynews.com!easynews!sn-xit-02!sn-xit-06!sn-xit-05!sn-xit-14!supernews.com!149.173.6.116.MISMATCH!foggy!vm.sas.com!HIGGINS.NET!don
From: Don Higgins <don@HIGGINS.NET>
Newsgroups: bit.listserv.asm370
Subject: More about the CUSE instruction and z390 implementation
Date: Sun, 16 Oct 2005 13:14:06 -0400
Organization: SAS Inc.
Lines: 185
Sender: IBM Mainframe Assembler List <ASSEMBLER-LIST@LISTSERV.UGA.EDU>
Message-ID: <200510161714.j9GGLS4E030576@malibu.cc.uga.edu>
NNTP-Posting-Host: mozart.unx.sas.com
Mime-Version: 1.0
Content-Type: text/plain
Content-Transfer-Encoding: 7bit
X-Trace: foggy.unx.sas.com 1129483195 25621 10.19.150.41 (16 Oct 2005 17:19:55 GMT)
X-Complaints-To: usenet@unx.sas.com
NNTP-Posting-Date: Sun, 16 Oct 2005 17:19:55 +0000 (UTC)
Comments: Gated by NETNEWS@VM.SAS.COM
Return-Path: <owner-assembler-list@LISTSERV.UGA.EDU>
Return-Path: owner-assembler-list@LISTSERV.UGA.EDU
X-OriginalArrivalTime: 16 Oct 2005 17:19:51.0408 (UTC)
                       FILETIME=[D147D700:01C5D275]
Originator: daemon@mozart.unx.sas.com