bixoft url and asm proficiency test exercise


(One of) Abe Kornelis' many web pages of IBM assembler 'stuff'.

http://www.bixoft.nl/english/intro.htm

2 of the 4 exercises from his Assembler Proficiency Self-test.

Kind of fun to do. Took way more than the 3 hour time limit.

This page is to remind me where his stuff is.

* ASMLG C:\USERS\LIN\DOCUMENTS\Z390CODE\ASSIGN2

* HTTP://WWW.BIXOFT.NL/ENGLISH/INTRO.HTM

* ASMLG C:\USERS\LIN\DOCUMENTS\Z390CODE\ASSIGN2 TIME(1) PARM('12')

*

MACRO

DEFREGS &START,&END,&SPEC,&PREF=R ASSIGNMENT #4

LCLA &R

LCLC &RH

.*** MNOTE ,'&SYSLIST, &SYSLIST(2) &SYSLIST(3) ' ???

AIF ('&PREF' EQ 'R' OR '&PREF' EQ 'GPR').A

AIF ('&PREF' EQ 'CR' OR '&PREF' EQ 'AR').A

AIF ('&PREF' EQ 'FPR').A

MNOTE 12,'INVALID PREF=&PREF MUST BE R GPR CR AR OR FPR'

MEXIT

.A AIF (T'&START NE 'N').AERR

AIF (T'&END EQ 'N').B

.AERR MNOTE 12,'FROM/TO REG SPECIFICATIONS MUST BE NUMERIC'

MEXIT

.B AIF (T'&SPEC EQ 'O').C

AIF ('&SPEC' EQ 'DEC').C

AIF ('&SPEC' EQ 'HEX').C

MNOTE 12,'REG SPEC/TYPE MUST BE DEC OR HEX'

MEXIT

.C AIF (&END GT 15).CERR

AIF (&END GE &START).D

.CERR MNOTE 12,'START/END REGS MUST BE ##, EG 0,15'

MEXIT

.D ANOP

&R SETA &START

.*

.LOOP AIF (&R GT 9 AND '&SPEC' EQ 'HEX').DOHEX

&PREF&R EQU &R

AGO .NEXT

.DOHEX ANOP

.* SUBSTR('ABC',2,4)

MNOTE ,'&R '

&RH SETC '123456789ABCDEF'(&R,1)

&PREF&RH EQU &R

.*

.NEXT ANOP

.* MNOTE ,'&R &START &END &SPEC &PREF '

&R SETA 1+&R

AIF (&R LE &END).LOOP

MEND

*

* NOTE, ASSIGN2 IS VERY CLOSE TO REENTRANT, AND COULD BE.

*

ASSIGN2 START 0 ASSIGNMENT #2

DEFREGS 0,6

DEFREGS 12,15

* DEFREGS 13,15,HEX

* DEFREGS 4,2

* DEFREGS A,2

* DEFREGS 3,B

* *** DEFREGS 4,5,HEX,JUNK

* DEFREGS 4,5,HEX,PREF=YUCK

* DEFREGS 7,8,HEX,PREF=CR

* DEFREGS 9,10,PREF=AR

* DEFREGS 11,12,PREF=FPR

*

USING *,12 I'M GOING TO ASSUME THAT THE PASSED

B BEG-ASSIGN2(15) PARM IS IN THE FORMAT OF THE PARM

DC AL1(L'NAME) FIELD.

NAME DC C'ASIGN2, 01.01, &SYSDATE &SYSTIME'

*

BEG STM 14,12,12(13) NOW I DON'T NEED MY OWN SAVEAREA,

LR 12,15 SO SHOULD I WASTE TIME AND GET ONE?

LR R6,R1 YOU'LL PROBABLY BEAT ME UP IF NOT.

* BUT IF I WAS WRITING FOR REAL, NOPE!

*

LA R6,PARMLIST TESTCODE

*

* LA R0,72

* GETMAIN R,LV=(0) AND, OF COURSE, YOU COULD COMMENT

* ST R1,8(R13) ALL THIS OUT, AND THE ONLY EFFECT

* ST R13,4(R1) WOULD BE THAT IT WOULD RUN FASTER.

* LR R13,R1

*

TSTAGAIN L R2,0(R6) YOU'LL PROBABLY BEAT ME UP IF NOT.

LA R4,MSG1

LH R3,0(R2) # OF CHARS

LTR R3,R3

BNP ERR 0 = ERROR

SR R5,R5 START WITH RC=0

LA R4,MSG2 (INVALID DIGIT ERR MSG)

*

LOOP CLI 2(R2),C'0' Q. #

BL ERR2 NO, ERR

CLI 2(R2),C'9' ALRIGHT, ALRIGHT, CHECK HIGH TOO

BH ERR2

IC R0,2(R2) LOAD DIGIT, THEN CLEAR ZONE BITS.

N R0,=F'15' SAME CLEAR FOR ASCII + EBCDIC. :-)

MH R5,=H'10' MULT RC SO FAR BY 10

AR R5,R0 AND ADD DIGIT

LA R2,1(R2) BUMP INDEX

BCT R3,LOOP LOOP

*

LA R4,MSG3

C R5,=F'4095' Q. ## BEEN SMOKING WEED OR SUMPIN?

BH ERR YEAH, TOO HIGH, ERROR.

*

MVC MSG0+13(6),6(R6) TESTCODE

CVD R5,DW TESTCODE

OI DW+7,X'0F' TESTCODE

UNPK MSG0+24(5),DW+5(3) TESTCODE

LA R4,MSG0 TESTCODE

B ERR TESTCODE

DW DC D'0' TESTCODE

MSG0 DC F'000',H'40,0',CL36'PARM= RC=' TESTCODE

*

* LR 1,13

* L 13,4(13) OOPS, ALMOST FORGOT.

* LA 0,72

* FREEMAIN R,LV=(0),A=(1)

*

EXIT LR R15,R5 'CAUSE FREEM LIKELY MESSES UP R15.

L 14,12(13)

LM 0,12,20(13)

OI 15(13),1 INDICATE RETURN FROM PGM.

BR 14 (OR IS IT 19(13) I FORGET)

*

ERR2 MVC MSG2+8+29(1),2(R2)

ERR LA R1,4(R4)

WTO MF=(E,(1))

L R5,0(R4)

*** ABEND (5) TESTCODE

* TESTCODE

LA R6,12(R6) TESTCODE

CLI 0(R6),0 TESTCODE

BE TSTAGAIN TESTCODE

B EXIT TESTCODE

* TESTCODE

PARMLIST DC A(*+4),H'3',CL6'123',A(*+4),H'5',CL6'12345' TESTCODE

DC A(*+4),H'3',CL6'ABD',A(*+4),H'1',CL6'1' TESTCODE

DC A(*+4),H'1',CL6'0',A(*+4),H'0',CL6'FINI',F'-1' TESTCODE

*

MSG1 DC F'101',H'40,0',CL36'ABEND 101, NO PARAM VALUE FOUND'

MSG2 DC F'102',H'40,0',CL36'ABEND 102, INVALID NUMERIC ='

MSG3 DC F'103',H'40,0',CL36'ABEND 103, PARAM VALUE EXCEEDS 4095'

LTORG

END ASSIGN2