Article View: bit.listserv.asm370
Article #200More about the CUSE instruction and z390 implementation
From: Don Higgins
Date: Sun, 16 Oct 2005 17:14
Date: Sun, 16 Oct 2005 17:14
185 lines
8399 bytes
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!donShow 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