From: SMTP%"DSJ@WKUVX1.WKU.EDU" 21-DEC-1993 10:58:25.51 To: EVERHART CC: Subj: AUGUST93.RECAL2 X-FileServer: Digital Systems Journal File Server Date: Tue, 21 Dec 1993 09:54:49 CDT Sender: DSJ-Mgr@WKUVX1.WKU.EDU Errors-To: DSJ-Mgr@WKUVX1.WKU.EDU Warnings-To: <> From: DSJ-Mgr@WKUVX1.WKU.EDU Reply-To: DSJ@WKUVX1.WKU.EDU Subject: AUGUST93.RECAL2 To: EVERHART@arisia.gce.com $! ------------------ CUT HERE ----------------------- $ v='f$verify(f$trnlnm("SHARE_UNPACK_VERIFY"))' $! $! This archive created: $! Name : RECAL2 $! By : Hunter Goatley $! Date : 12-AUG-1993 12:27:40.49 $! Using: VMS_SHARE 8.4, (C) 1993 Andy Harper, Kings College London UK $! $! Credit is due to these people for their original ideas: $! James Gray, Michael Bednarek $! $! TO UNPACK THIS SHARE FILE, CONCATENATE ALL PARTS IN ORDER $! AND EXECUTE AS A COMMAND PROCEDURE ( @name ) $! $! THE FOLLOWING FILE(S) WILL BE CREATED AFTER UNPACKING: $! 1. DCLPATCH.MAR;1 $! 2. RECAL2.DESC;1 $! $ set="set" $ set symbol/scope=(nolocal,noglobal) $ f=f$parse("SHARE_UNPACK_TEMP","SYS$SCRATCH:."+f$getjpi("","PID")) $ e="write sys$error ""%UNPACK"", " $ w="write sys$output ""%UNPACK"", " $ if .not. f$trnlnm("SHARE_UNPACK_LOG") then $ w = "!" $ if f$getsyi("CPU") .gt. 127 then $ goto start $ ve=f$getsyi("version") $ if ve-f$extract(0,1,ve) .ges. "4.4" then $ goto start $ e "-E-OLDVER, Must run at least VMS 4.4" $ v=f$verify(v) $ exit 44 $unpack: subroutine ! P1=filename, P2=checksum, P3=attributes,P4=size $ if f$parse(P1) .nes. "" then $ goto dirok $ dn=f$parse(P1,,,"DIRECTORY") $ w "-I-CREDIR, Creating directory ''dn'" $ create/dir 'dn' $ if $status then $ goto dirok $ e "-E-CREDIRFAIL, Unable to create ''dn' File skipped" $ delete 'f'* $ exit $dirok: $ x=f$search(P1) $ if x .eqs. "" then $ goto file_absent $ e "-W-EXISTS, File ''P1' exists. Skipped" $ delete 'f'* $ exit $file_absent: $ w "-I-UNPACK, Unpacking ", P5, " of ", P6, " - ", P1, " - ", P4, " Blocks" $ n=P1 $ if P3 .nes. "" then $ n=f $ if .not. f$verify() then $ define/user sys$output nl: $ EDIT/TPU/NOSEC/NODIS/COM=SYS$INPUT/NOJOURNAL 'f'/OUT='n' PROCEDURE GetHex(s,p)LOCAL x1,x2;x1:=INDEX(t,SUBSTR(s,p,1))-1;x2:=INDEX(t, SUBSTR(s,p+1,1))-1;RETURN 16*x1+x2;ENDPROCEDURE;PROCEDURE SkipPartsep LOCAL m; LOOP m:=MARK(NONE);EXITIF m=END_OF(b);DELETE(m);EXITIF INDEX(ERASE_LINE, "-+-+-+-+-+-+-+-+")=1;ENDLOOP;ENDPROCEDURE;PROCEDURE ProcessLine LOCAL c,s,l,b, n,p;c := ERASE_CHARACTER(1);s := ERASE_LINE;IF c = "X" THEN SPLIT_LINE; ENDIF; MOVE_HORIZONTAL(-1);l := LENGTH(s);p := 1;LOOP EXITIF p > l;c := SUBSTR(s,p,1); p := p+1;CASE c FROM ' ' TO '`' ['`']: COPY_TEXT(ASCII(GetHex(s,p))); p:=p+2;[ ' ']: p:=p+1;[INRANGE,OUTRANGE]: COPY_TEXT(c);ENDCASE;ENDLOOP;ENDPROCEDURE; PROCEDURE Decode LOCAL m;POSITION(BEGINNING_OF(b));LOOP m:=MARK(NONE);EXITIF m= END_OF(b);DELETE(m);IF INDEX(CURRENT_LINE,"+-+-+-+-+-+-+-+-")= 1 THEN SkipPartSep;ELSE ProcessLine;MOVE_HORIZONTAL(1);ENDIF;ENDLOOP; ENDPROCEDURE;SET(FACILITY_NAME,"UNPACK");SET(SUCCESS,OFF);SET(INFORMATIONAL, OFF);t:="0123456789ABCDEF";f:=GET_INFO(COMMAND_LINE,"file_name");b:= CREATE_BUFFER(f,f);Decode;WRITE_FILE(b,GET_INFO(COMMAND_LINE,"output_file")); QUIT; $ if p3 .eqs. "" then $ goto dl $ open/write fdl &f $ write fdl "RECORD" $ write fdl P3 $ close fdl $ w "-I-CONVRFM, Converting record format to ", P3 $ convert/fdl=&f &f-1 &P1 $dl: delete 'f'* $ checksum 'P1' $ if checksum$checksum .nes. P2 then $ - e "-E-CHKSMFAIL, Checksum of ''P1' failed." $ exit $ endsubroutine $start: $! $ create 'f' X`09.TITLE`09DCLPATCH X`09.IDENT`09/02-000/ X;++ X; X;`20`20Facility:`09DCLPATCH X; X;`20`20Author:`09Hunter`20Goatley X;`09`09Western`20Kentucky`20University X;`09`09Academic`20Computing,`20STH`20226 X;`09`09Bowling`20Green,`20KY`2042101 X;`09`09E-mail:`20goathunter@wkuvx1.bitnet X;`09`09Voice:`20`20502-745-5251 X; X;`20`20Date:`09February`2021,`201991 X; X;`20`20Functional`20Description: X; X;`09Applies`20the`20"extended`20RECALL"`20patch`20to`20DCL.EXE. X; X;`09SYS$SYSTEM:DCL.EXE`20is`20read`20into`20memory`20and`20the`20instructions V`20to X;`09to`20patch`20are`20located`20and`20replaced.`20`20When`20all`20patches`20h Vave`20been X;`09made,`20a`20new`20image`20file,`20DCL_RECALL.EXE,`20is`20created. X; X;`09Once`20applied,`20DCL_RECALL.EXE`20can`20recall`20as`20many`20as`2062`20co Vmmands X;`09(instead`20of`20the`20DCL`20limit`20of`2020).`20`20The`20limit`20is`20impo Vsed`20by`20the X;`09instructions`20being`20replaced:`20the`20maximum`20number`20is`20stored`20 Vas`20a X;`09short`20literal,`20which`20has`20a`20maximum`20value`20of`2063.`20Since`20 Vthe`20code X;`09actually`20checks`20against`20max+1,`2063`20became`20max+1. X; X;`09Under`20AXP,`20the`20limit`20is`2099`20characters.`20`20The`20limit`20coul Vd`20be X;`09higher,`20but`20we're`20restricted`20to`202`20digits`20for`20the`20RECALL/ VALL X;`09display. X; X;`20`20Modified`20by: X; X;`0902-000`09`09Hunter`20Goatley`09`0913-MAR-1993`2020:52 X;`09`09Merge`20the`20two`20into`20one`20program. X; X;`0901-002`09`09Ehud`20Gavron`09`0915-Jan-1993`20All`20day! X;`09`09Patch`20DCL.EXE`20so`20RECALL/ALL`20numbers`20correctly. X;`09`09Remove`20conditional`20IFDEFs`20on`20.JSB_ENTRYs. X; X;`0901-001`09`09Hunter`20Goatley`09`09November`201992 X;`09`09Converted`20to`20work`20on`20AXP.`20`20All`20but`20RECALL/ALL`20numbers V. X; X;`0901-000`09`09Hunter`20Goatley`09`0921-FEB-1991`2009:12 X;`09`09Original`20version. X; X;-- X`09.SBTTL`09Symbols`20and`20macros X; X;`20`20To`20build`20DCLPATCH`20on`20the`20VAX`20but`20allow`20it`20to`20handle V`20AXP`20DCL.EXE`20images, X;`20`20uncomment`20the`20following`20line. X; X;DO_ALPHA`20=`201 X; X;`20`20To`20build`20DCLPATCH`20on`20AXP`20but`20allow`20it`20to`20handle`20VAX V`20DCL.EXE`20images, X;`20`20uncomment`20the`20following`20line. X; X;DO_ALPHA`20=`200 X; X;`20`20This`20line`20says,`20"If`20DO_ALPHA`20is`20not`20defined`20and`20we're V`20compiling`20under X;`20`20OpenVMS`20AXP,`20then`20define`20the`20DO_ALPHA`20symbol." X; X.IF`20NOT_DEFINED`20DO_ALPHA`09`09;`20If`20user`20has`20not`20set`20a`20prefer Vence, XDO_ALPHA`20=`200`09`09`09`09;`20...`20then`20assume`20VAX`20unless X.IIF`20DF,EVAX,`09DO_ALPHA`20=`201`09`09;`20...`20compiling`20under`20AXP X.ENDC X.IF`20NOT_DEFINED`20EVAX`09`09`09;`20.PRINT`20is`20ugly`20under`20AXP`20compil Ver X.IF`20EQ`20DO_ALPHA X`09.PRINT`09;Producing`20VAX`20version`20of`20DCLPATCH X.IFF X`09.PRINT`09;Producing`20AXP`20version`20of`20DCLPATCH X.ENDC X.ENDC X`09.LINK`09"SYS$SYSTEM:DCLDEF.STB"/selective_search X X`09.DSABL`09GLOBAL`09`09`09`09;`20Declare`20external`20references X`09.ENABL`09SUPPRESSION`09`09`09;`20Don't`20list`20unreference`20symbols X`09.NOSHOW`09BINARY`09`09`09`09;`20Skip`20binary`20until`20data X; X;`20`20External`20routines: X; X`09.EXTRN`09LIB$GET_VM`09`09`09;`20Allocate`20memory X`09.EXTRN`09LIB$PUT_OUTPUT`09`09`09;`20Write`20to`20SYS$OUTPUT X; X;`20`20Global`20variables`20used`20here: X; X.IF`20NOT_DEFINED`20EVAX X`09.EXTRN`09WRK_B_RECALLCNT`09`09`09;`20Symbol`20from`20DCLDEF.STB X`09.EXTRN`09WRK_C_RECALLMAX`09`09`09;`20Symbol`20from`20DCLDEF.STB X.ENDC X X`09$DSCDEF`09`09`09`09`09;`20Descriptor`20symbols X`09$FABDEF`09`09`09`09`09;`20File`20Access`20Block`20symbols X`09$RABDEF`09`09`09`09`09;`20Record`20Access`20Block`20symbols X`09$RMSDEF`09`09`09`09`09;`20RMS`20definitions X`09$SSDEF`09`09`09`09`09;`20System`20service`20status`20symbols X`09$XABDEF`09`09`09`09`09;`20Extended`20attribute`20block X X`09.MACRO`09ON_ERR`09LAB,?TMPLAB`09`09;*`20BRW`20on`20error`20condition X`09BLBS`09R0,TMPLAB`09`09`09;`20Branch`20if`20R0`20indicates`20success X`09BRW`09LAB`09`09`09`09;`20Branch`20to`20error`20address XTMPLAB:`09.ENDM`09ON_ERR`09`09`09`09;*`20End`20of`20ON_ERR`20macro X X`09.MACRO`09PRINT`09STRING,?TEXT`09`09`09;*`20Macro`20to`20print`20text X`09.SAVE_PSECT`20LOCAL_BLOCK`09`09`09`09;*`20Save`20this`20PSECT X`09.PSECT`09_DCLPATCH_DATA,NOEXE,WRT,LONG,SHR`09;*`20Change`20to`20data`20PSEC VT X`09.ALIGN`09LONG`09`09`09`09`09;*`20Align`20on`20longword X`20TEXT:`09.ASCID`09`7ESTRING`7E`09`09`09`09;*`20Create`20.ASCID`20string X`09PRINT_TEXT`20=`20TEXT`09`09`09`09;*`20Save`20the`20address X`09.RESTORE_PSECT`09`09`09`09`09;*`20Go`20back`20to`20code X`09PUSHAQ`09PRINT_TEXT`09`09`09`09;`20Write`20the`20string X`09CALLS`09#1,G`5ELIB$PUT_OUTPUT`09`09`09;`20...`20to`20SYS$OUTPUT X`09.ENDM`09PRINT`09`09`09`09`09;*`20End`20of`20PRINT`20macro X X`09.MACRO`09REPLACE`09LEN,OLD,NEW,CNT,ERR,?CONT X`09MOVL`09LEN,R5`09`09`09`09;`20R5`20=`20Size X`09MOVAL`09OLD,R6`09`09`09`09;`20R6`20->`20old`20instruction X`09MOVAL`09NEW,R7`09`09`09`09;`20R7`20->`20new`20instruction X`09BSBW`09REPLACE_STREAM`09`09`09;`20Go`20replace`20it X`09CMPL`09CNT,R0`09`09`09`09;`20Right`20number`20found? X`09BEQL`09CONT`09`09`09`09;`20Branch`20if`20OK X`09BRW`09ERR`09`09`09`09;`20Branch`20to`20print`20error`20message X`20CONT:`09.ENDM`09REPLACE`09`09`09`09;*`20End`20of`20REPLACE`20macro X X`09.SHOW`09BINARY`09`09`09`09;`20Include`20binary`20in`20listings X X`0C X`09.SBTTL`09Data`20area X`09.PSECT`09_DCLPATCH_DATA,NOEXE,WRT,LONG,SHR X; X;***`20`20File`20Access`20Block`20for`20input X; XINFAB:`09`09$FAB`09FNM=,`20-`09`09;`20File`20name X`09`09`09DNM=,-`09;`20Default`20name X`09`09`09FAC=,`20-`09`09;`20File`20Access`20(GET`20only) X`09`09`09SHR=,`20-`09`09;`20Allow`20others`20to`20read`20also X`09`09`09XAB=INXAB`09`09;`20eXtended`20attribute`20block X; X;***`20`20Record`20Access`20Block`20for`20input X; XINRAB:`09`09$RAB`20`20`20`20FAB=INFAB,`20-`09`09;`20The`20File`20Access`20Bloc Vk X`09`09`09RAC=SEQ,`20-`09`09;`20Record`20Access`20is`20sequential X`09`09`09USZ=512`09`09`09;`20The`20max`20size`20of`20input`20record XINXAB:`09`09$XABFHC`09`09`09`09;`20XAB`20-`20File`20Header`20Chars X; X; X;***`20`20File`20Access`20Block`20for`20output X; XOUTFAB:`20`09$FAB`09FNM=,- X`09`09`09FAC=,`20-`09`09;`20File`20Access`20(GET`20only) X`09`09`09FOP=MXV,`20-`09`09;`20Maximize`20Version`20number X`09`09`09RFM=FIX,`20-`09`09;`20VARiable`20length`20records X`09`09`09MRS=512,`20-`09`09;`20Maximum`20record`20size X`09`09`09ORG=SEQ`09`09`09;`20SEQuential`20organization X; X;***`20`20Record`20Access`20Block`20for`20output X; XOUTRAB:`09`09$RAB`20`20`20`20FAB=OUTFAB,`20-`09`09;`20The`20File`20Access`20Bl Vock X`09`09`09RAC=SEQ,`20-`09`09;`20Record`20Access`20is`20sequential X`09`09`09RSZ=512`09`09`09;`20Record`20size`20is`20512`20bytes X XDCL_IMAGE:`09.LONG`090`09`09`09;`20Holds`20address`20of`20GET_VM`20mem. XIMAGE_SIZE:`09.LONG`090`09`09`09;`20Size`20of`20the`20image`20in`20bytes X; X;`20`20The`20DCL`20instructions`20to`20replace. X; XNEW_C_RECALLMAX`20=`2062`09`09`09`09;`20New`20limit`20is`2062`20commands X X`0C X;+ X; X;`20`20The`20sections`20below`20include`20the`20AXP`20instruction`20sequences V`20that`20are`20to X;`20`20be`20modified,`20followed`20by`20the`20actual`20new`20values.`20`20The V`20AXP`20listings`20came X;`20`20from`20the`20DCL`20source`20listings`20CD`20for`20OpenVMS`20AXP`20V1.0. V X; X;- X.IF`20NE`20DO_ALPHA`09`09`09`09;`20The`20AXP`20sections.... X;A30AFFC0`20`20`20`20`200FB0`09`09LDL`09R24,`20-64(R10)`09;`20003517 X;4B0070D8`20`20`20`20`200FB4`09`09EXTBL`09R24,`203,`20R24 X;4302B530`20`20`20`20`200FB8`09`09SUBQ`09R24,`2021,`20R16 X;E61FFF06`20`20`20`20`200FBC`09`09BEQ`09R16,`2022_30$`09;`20003519 X;43C1153E`20`20`20`20`200FC0`09`09SUBQ`09SP,`208,`20SP`09;`20003521 X XOINST1:`09`09.LONG`09`5EX4302B530 X`09`09OINST1_L`20=`20.-OINST1 X XNINST1:`09`09.LONG`09`5EX430C9530`09;`2021`20->`20100 X`09`09NINST1_L`20=`20.-NINST1 X X;010000 X;11000`20`2024 X;00010101`0921`09=> X; X;01100100`09100 X;11111111`09255 X X;1`20`20Bit`2012`20indicates`20that`20it`20is`20a`20literal X X;`200101`200011`200000 X; X X;A2EAFFC0`20`20`20`20`2013E0`09`09LDL`09R23,`20-64(R10)`09`09;`20003439 X;4AE070D7`20`20`20`20`2013E4`09`09EXTBL`09R23,`203,`20R23 X;42E2B530`20`20`20`20`2013E8`09`09SUBQ`09R23,`2021,`20R16 X;E61FFDEC`20`20`20`20`2013EC`09`09BEQ`09R16,`20END_OF_LIST`09;`20003441 X X XOINST2:`09`09.LONG`09`5EX42E2B530 X`09`09OINST2_L`20=`20.-OINST2 X XNINST2:`09`09.LONG`09`5EX42EC9530`09;`2021`20->`20100 X`09`09NINST2_L`20=`20.-NINST2 X X;A34AFFC0`20`20`20`20`201450`09`09LDL`09R26,`20-64(R10) X;4B4070DA`20`20`20`20`201454`09`09EXTBL`09R26,`203,`20R26 X;4342B530`20`20`20`20`201458`09`09SUBQ`09R26,`2021,`20R16 X;E61FFDCE`20`20`20`20`20145C`09`09BEQ`09R16,`2019_20$`09`09;`20003454 X XOINST3:`09`09.LONG`09`5EX4342B530 X`09`09OINST3_L`20=`20.-OINST3 X XNINST3:`09`09.LONG`09`5EX434C9530`09;`2021`20->`20100 X`09`09NINST3_L`20=`20.-NINST3 X X;47E0341A`20`20`20`20`201FD4`09`09BIS`09R31,`201,`20R26`09`09;`20004209 X;40229530`20`20`20`20`201FD8`09`09SUBQ`09R1,`2020,`20R16`09`09;`20004208 X;402293B1`20`20`20`20`201FDC`09`09CMPULT`09R1,`2020,`20R17 X;461F04DA`20`20`20`20`201FE0`09`09CMOVNE`09R16,`20R31,`20R26`09`09;`20004209 X XOINST4:`09`09.LONG`09`5EX40229530 X`09`09.LONG`09`5EX402293B1 X`09`09OINST4_L`20=`20.-OINST4 X XNINST4:`09`09.LONG`09`5EX402C7530 X`09`09.LONG`09`5EX402C73B1 X`09`09NINST4_L`20=`20.-NINST4 X X;47E29406`20`20`20`20`202078`09`09BIS`09R31,`2020,`20R6 X;F120005E`20`20`20`20`20207C`09`09BLBS`09R9,`2032_50$`09`09;`20004236 X;45205017`20`20`20`20`202080`09`09AND`09R9,`202,`20R23`09`09;`20004237 X XOINST5:`09`09.LONG`09`5EX47E29406 X`09`09OINST5_L`20=`20.-OINST5 X XNINST5:`09`09.LONG`09`5EX47EC7406 X`09`09NINST5_L`20=`20.-NINST5 X X;43C1153E`20`20`20`20`2020C0`09`09SUBQ`09SP,`208,`20SP`09`09;`20004248 X;47E29409`20`20`20`20`2020C4`09`09BIS`09R31,`2020,`20R9`09`09;`20004247 X;B7FE0000`20`20`20`20`2020C8`09`09STQ`09R31,`20(SP)`09`09;`20004248 X XOINST6:`09`09.LONG`09`5EX47E29409 X`09`09OINST6_L`20=`20.-OINST6 X XNINST6:`09`09.LONG`09`5EX47EC7409 X`09`09NINST6_L`20=`20.-NINST6 X XOINST8:`20`20`20`20`20`20`20`20`20.LONG`20`20`20`5EX43063530 X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20OINST8_L`20=`20.-OINST8 X XNINST8:`20`20`20`20`20`20`20`20`20.LONG`20`20`20`5EX43041530 X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20NISTN8_L`20=`20.-NINST8 X XOINST10:`09.LONG`09`5EX239F2F32 X`09`09OINST10_L`20=.-OINST10 X XNINST10:`09.LONG`09`5EX239F2F31 X`09`09NINST10_L`20=.-NINST10 X X; X;`20`20The`20RECALL`20display`20code.`20`20Same`20basic`20modification`20as`20 Vfor`20the`20VAX. X; XOINST9:`20`20`20`20`20`20`20`20`09.LONG`20`20`20`5EX2F820000`09;`20LDQ_U`09R28 V,(R2) X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20.LONG`20`20`20`5EX22DF2F31`09; V`20LDA`09R22,`2012081(R31) X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20.LONG`20`20`20`5EX4AC2037A`09; V`20INSWL`09R22,`20R2,`20R26 X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20.LONG`20`20`20`5EX4B82025C`09; V`20MSKWL`09R28,`20R2,`20R28 X X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20.LONG`20`20`20`5EX479A041C`09; V`20BIS`09R28,`20R26,`20R28 X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20.LONG`20`20`20`5EXF0400036`09; V`20BLBS`09R2,`20$L51 X`09`09.LONG`09`5EX3F820000`09;`20$L52:`09STQ_U`20R28,`20(R2) X`09`09.LONG`09`5EX47FF041F`09;`20NOP X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20OINST9_L`20=`20.-OINST9 X XNINST9: X`09`09.LONG`09`5EXA3420000`09;`20LDL`09R26,`20(R2) X`09`09.LONG`09`5EX22DF09FF`09;`20LDA`20`09R22,`202559(R31) X`09`09.LONG`09`5EX4356013A`09;`20SUBL`09R26,`20R22,`20R26 X`09`09.LONG`09`5EXB3420000`09;`20STL`09R26,`20(R2) X X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20.LONG`20`20`20`5EX2FFE0000`09; V`20LNOP X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20.LONG`20`20`20`5EX47FF041F`09; V`20NOP X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20.LONG`20`20`20`5EX47FF041F`09; V`20NOP X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20.LONG`20`20`20`5EX47FF041F`09; V`20NOP X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20NINST9_L`20=`20.-NINST9 X X`0C X;+ X; X;`20`20The`20sections`20below`20contain`20the`20VAX`20instructions`20that`20ar Ve`20to`20be`20replaced. X;`20`20The`20values`20are`20stored`20as`20hexadecimal`20values`20for`20the`20M VACRO-32`20compiler, X;`20`20which`20would`20produce`20AXP`20object`20code,`20not`20VAX`20object`20c Vode.`20`20To`20enhance X;`20`20readability,`20the`20original`20VAX`20instructions`20are`20still`20incl Vuded`20for X;`20`20assembling`20on`20the`20VAX. X; X;- X.IFF`09`09`09`09`09;Producing`20VAX`20version..... X.IF`20DEFINED`20EVAX`09`09`09`09`09;Compiling`20for`20AXP.... XOINST1:`09`09.LONG`09`5EX15C3AA91 XOINST1_L`20=`204 XNINST1:`09`09.LONG`09`5EX3FC3AA91 XNINST1_L`20=`204 X.IFF`09`09`09`09`09`09`09;Assembling`20for`20VAX.... XOINST1:`09`09CMPB`09B`5EWRK_B_RECALLCNT(R10),-`09;Old`20instruction X`09`09`09S`5E#WRK_C_RECALLMAX+1`09`09;...`20(occurs`203`20times) X`09`09OINST1_L`20=`20.-OINST1`09`09`09;...`20(calc`20inst.`20length) XNINST1:`09`09CMPB`09B`5EWRK_B_RECALLCNT(R10),-`09;New`20instruction X`09`09`09S`5E#NEW_C_RECALLMAX+1`09`09;... X`09`09NINST1_L`20=`20.-NINST1`09`09`09;... X.ENDC X`09`09ASSUME`09OINST1_L`20EQ`20NINST1_L`09`09;Ensure`20equal`20lengths X X.IF`20DEFINED`20EVAX`09`09`09`09`09;Compiling`20for`20AXP.... XOINST2:`09`09.BYTE`09`5EXD1,`5EX51,`5EX14 XOINST2_L`20=`203 XNINST2:`09`09.BYTE`09`5EXD1,`5EX51,`5EX3E XNINST2_L`20=`203 X.IFF`09`09`09`09`09`09`09;Assembling`20for`20VAX.... XOINST2:`09`09CMPL`09R1,S`5E#WRK_C_RECALLMAX`09`09;Old`20instruction`202 X`09`09OINST2_L`20=`20.-OINST2`09`09`09;... XNINST2:`09`09CMPL`09R1,S`5E#NEW_C_RECALLMAX`09`09;... X`09`09NINST2_L`20=`20.-NINST2`09`09`09;... X.ENDC X`09`09ASSUME`09OINST2_L`20EQ`20NINST2_L`09`09;... X X.IF`20DEFINED`20EVAX`09`09`09`09`09;Compiling`20for`20AXP.... XOINST3:`09`09.BYTE`09`5EXD0,`5EX14,`5EX56 XOINST3_L`20=`203 XNINST3:`09`09.BYTE`09`5EXD0,`5EX3E,`5EX56 XNINST3_L`20=`203 X.IFF`09`09`09`09`09`09`09;Assembling`20for`20VAX.... XOINST3:`09`09MOVL`09S`5E#WRK_C_RECALLMAX,R6`09`09;Old`20instruction`203 X`09`09OINST3_L`20=`20.-OINST3`09`09`09;... XNINST3:`09`09MOVL`09S`5E#NEW_C_RECALLMAX,R6`09`09;... X`09`09NINST3_L`20=`20.-NINST3`09`09`09;... X.ENDC X`09`09ASSUME`09OINST3_L`20EQ`20NINST3_L`09`09;... X X.IF`20DEFINED`20EVAX`09`09`09`09`09;Compiling`20for`20AXP.... XOINST4:`09`09.BYTE`09`5EXD0,`5EX14,`5EX59 XOINST4_L`20=`203 XNINST4:`09`09.BYTE`09`5EXD0,`5EX3E,`5EX59 XNINST4_L`20=`203 X.IFF`09`09`09`09`09`09`09;Assembling`20for`20VAX.... XOINST4:`09`09MOVL`09S`5E#WRK_C_RECALLMAX,R9`09`09;Old`20instruction`204 X`09`09OINST4_L`20=`20.-OINST4`09`09`09;... XNINST4:`09`09MOVL`09S`5E#NEW_C_RECALLMAX,R9`09`09;... X`09`09NINST4_L`20=`20.-NINST4`09`09`09;... X.ENDC X`09`09ASSUME`09OINST4_L`20EQ`20NINST4_L`09`09;... X; X;`20`20DEC's`20RECALL`20code`20that`20is`20replaced X; X.IF`20DEFINED`20EVAX`09`09`09`09`09;Compiling`20for`20AXP.... XOINST5:`09`09.LONG`09`5EX12316291 X`09`09.LONG`09`5EX328FB007 X`09`09.LONG`09`5EX0511622F X`09`09.LONG`09`5EX2F318FB0 X`09`09.BYTE`09`5EX62 XOINST5_L`20=`20.-OINST5 XNINST5:`09`09.LONG`09`5EX12206291 X`09`09.LONG`09`5EX62309003 X`09`09.LONG`09`5EX2F906296 X`09`09.LONG`09`5EX010101A2 X`09`09.BYTE`09`5EX01 XNINST5_L`20=`20.-NINST5 X.IFF`09`09`09`09`09`09`09;Assembling`20for`20VAX.... XOINST5:`09`20`20`20`20`20`20`20`20CMPB`09(R2),#`5EA/1/`09`09;`20Is`20tens`20di Vgit`20a`20"1"? X`09`09BNEQ`0910$`09`09`09;`20Branch`20if`20not X`09`09MOVW`09#`5EA"2/",(R2)`09`09;`20Move`20"2/"`20into`20command`20buffer X`09`09BRB`0920$ X`0910$:`09MOVW`09#`5EA"1/",(R2)`09`09;`20Move`20"1/"`20into`20command`20buffer V X`0920$: X`09`09OINST5_L`20=`20.-OINST5 XNINST5:`09`09CMPB`09(R2),#`5EA/`20/`09`09;`20Is`20the`20tens`20digit`20"`20"? V X`09`09BNEQU`0910$`09`09`09;`20Branch`20if`20not X`09`09MOVB`09#`5EA/0/,(R2)`09`09;`20Move`20a`20"0"`20in X`0910$:`09INCB`09(R2)`09`09`09;`20Bump`20tens`20digit X`09`09MOVB`09#`5EA"/",1(R2)`09`09;`20Move`20"/"`20in`20after`20tens`20digit X`09`09NOP`09`09`09`09;`20Use`20NOPs`20to`20blank`20out`20old X`09`09NOP`09`09`09`09;`20...`20code X`09`09NOP X`09`09NINST5_L`20=`20.-NINST5 X.ENDC X`09`09ASSUME`09OINST5_L`20EQ`20NINST5_L X.ENDC`09`09`09`09`09`09;`20End`20of`20.IF`20NE`20DO_ALPHA X`0C X`09`09.ALIGN`09LONG XPATCH_ADDR_MSG:`09.ASCID`09/Patching`20at`20image`20address`20!XL/ X`09`09.ALIGN`09LONG X XMSGBUF_L`20=`20256 XMSGBUF:`09`09.WORD`09MSGBUF_L`09`09;`20Buffer`20for`20messages X`09`09.BYTE`09DSC$K_DTYPE_T`09`09;`20...`20`20Text`20string X`09`09.BYTE`09DSC$K_CLASS_S`09`09;`20...`20`20Static`20string X`09`09.ADDRESS`20.+4`09`09`09;`20...`20`20Buffer`20follows X`09`09.BLKB`09MSGBUF_L`09`09;`20The`20actual`20output`20buffer X`0C X`09.SBTTL`09DCLPATCH`20main`20routine X X`09.PSECT`09_DCLPATCH_CODE,EXE,NOWRT,LONG,PIC,SHR X`09.ENTRY`09DCLPATCH,`5EM X X`09PRINT`09 X.IF`20NE`20DO_ALPHA X`09PRINT`09 X.ENDC X X`09BSBW`09READ_OLD_IMAGE`09`09`09;`20Go`20open`20the`20image X; X;`20`20Now`20do`20a`20search`20and`20replace`20for`20each`20of`20the`20instruc Vtions. X; X`09PRINT`09- X`20 X.IF`20NE`20DO_ALPHA X`09REPLACE`09#OINST1_L,OINST1,NINST1,#1,10$`09;`20Go`20replace`20instruction X`09REPLACE`09#OINST2_L,OINST2,NINST2,#1,10$`09;`20Go`20replace`20instruction X`09REPLACE`09#OINST3_L,OINST3,NINST3,#1,10$`09;`20Go`20replace`20instruction X.IFF X`09REPLACE`09#OINST1_L,OINST1,NINST1,#3,10$`09;`20Go`20replace`20instruction X.ENDC X X`09PRINT`09 X.IF`20NE`20DO_ALPHA X`09REPLACE`09#OINST4_L,OINST4,NINST4,#1,10$`09;`20Go`20replace`20instruction X.IFF X`09REPLACE`09#OINST2_L,OINST2,NINST2,#1,10$`09;`20Go`20replace`20instruction X.ENDC X X`09PRINT`09 X.IF`20NE`20DO_ALPHA X`09REPLACE`09#OINST5_L,OINST5,NINST5,#1,10$`09;`20Go`20replace`20instruction X.IFF X`09REPLACE`09#OINST3_L,OINST3,NINST3,#1,10$`09;`20Go`20replace`20instruction X.ENDC X X`09PRINT`09 X.IF`20NE`20DO_ALPHA X`09REPLACE`09#OINST6_L,OINST6,NINST6,#1,10$`09;`20Go`20replace`20instruction X.IFF X`09REPLACE`09#OINST4_L,OINST4,NINST4,#1,10$`09;`20Go`20replace`20instruction X.ENDC X X.IF`20NE`20DO_ALPHA X`20`20`20`20`20`20`20`20PRINT`20`20`20 X`20`20`20`20`20`20`20`20REPLACE`20#OINST8_L,OINST8,NINST8,#1,10$ X X`20`20`20`20`20`20`20`20PRINT`20`20`20 X`20`20`20`20`20`20`20`20REPLACE`20#OINST9_L,OINST9,NINST9,#1,10$ X X`20`20`20`20`20`20`20`20PRINT`20`20`20 X`20`20`20`20`20`20`20`20REPLACE`20#OINST10_L,OINST10,NINST10,#1,10$ X.IFF X`09PRINT`09 X`09REPLACE`09#OINST5_L,OINST5,NINST5,#1,10$`09;`20Go`20replace`20instructions V X.ENDC X X`09PRINT`09`09;`20Print`20info`20message X`09BSBW`09WRITE_NEW_IMAGE`09`09`09;`20Go`20create`20the`20"patched"`20image X`09BLBC`09R0,20$`09`09`09`09;`20Branch`20if`20not`20successful X`09PRINT`09 X`09BRB`0920$`09`09`09`09;`20Branch`20to`20return`20to`20DCL X X`2010$:`09PRINT`09 X`09PRINT`09 X X`2020$:`09PUSHL`09R0`09`09`09`09;`20Save`20the`20status X`09$CLOSE`09FAB=INFAB`09`09`09;`20Close`20the`20input`20file X`09POPL`09R0`09`09`09`09;`20Restore`20the`20status X X`2030$:`09RET`09`09`09`09`09;`20Return`20to`20caller X`0C X;+ X; X;`20`20Function:`09REPLACE_STREAM X; X;`20`20Functional`20description: X; X;`09This`20internal`20subroutine`20searches`20for`20all`20occurrences`20of`20a V`20stream X;`09of`20bytes`20and`20replaces`20the`20stream`20with`20a`20new`20stream`20of V`20bytes. X; X;`09It`20is`20assumed`20that`20the`20streams`20are`20the`20same`20length. X; X;`20`20Inputs: X; X;`09R5`09-`20Length`20of`20stream`20to`20find/replace X;`09R6`09-`20Address`20of`20stream`20of`20bytes`20to`20find X;`09R7`09-`20Address`20of`20stream`20of`20replacement`20bytes X; X;`20`20Outputs: X; X;`09R0`09-`20Number`20of`20replacements`20made X; X;- XREPLACE_STREAM: X.IIF`20DF,EVAX,`09.JSB_ENTRY X`09PUSHR`09#`5EM X`09MOVL`09DCL_IMAGE,R4`09`09`09;`20Point`20to`20DCL`20image X`09MOVL`09IMAGE_SIZE,R3`09`09`09;`20R3`20=`20#`20of`20blocks`20to`20check X`09MULL2`09#512,R3`09`09`09`09;`20R3`20=`20#`20of`20bytes`20to`20check X`09CLRL`09R11`09`09`09`09;`20Clear`20#`20of`20matches X`2010$:`09MOVL`09R6,R2`09`09`09`09;`20Move`20instruction`20to`20R2 X; X;`20`20Look`20for`20the`20stream`20of`20bytes. X; X`2020$:`09CMPB`09(R2),(R4)+`09`09`09;`20Found`20first`20byte? X`09BEQL`0940$`09`09`09`09;`20Branch`20if`20so X`2030$:`09SOBGTR`09R3,20$`09`09`09`09;`20Decrement`20#`20of`20bytes`20to`20sea Vrch X`09BRW`0970$`09`09`09`09;`20Branch`20to`20return X; X;`20`20The`20first`20byte`20has`20been`20matched.`20`20Check`20to`20see`20if V`20all`20the`20others`20match. X; X`2040$:`09DECL`09R3`09`09`09`09;`20Decrement`20#`20of`20bytes X`09BEQL`0970$`09`09`09`09;`20Branch`20if`20no`20more`20image`20bytes X`09MOVL`09R5,R0`09`09`09`09;`20Get`20length`20of`20instruction X`09DECL`09R0`09`09`09`09;`20Don't`20count`20byte`20just`20found X`09MOVL`09#1,R1`09`09`09`09;`20Init`20index`20value X X`2050$:`09CMPB`09(R2)`5BR1`5D,(R4)+`09`09`09;`20Check`20each`20additional`20by Vte X`09BNEQ`0930$`09`09`09`09;`20Branch`20if`20not`20the`20same X`09DECL`09R3`09`09`09`09;`20Decrement`20this`20byte X`09BEQL`0970$`09`09`09`09;`20Branch`20if`20no`20more`20image`20bytes X`09INCL`09R1`09`09`09`09;`20Bump`20index`20value X`09SOBGTR`09R0,50$`09`09`09`09;`20Loop`20until`20no`20more`20bytes X; X;`20`20Here`20we`20found`20an`20occurrence`20of`20the`20string`20(all`20bytes V`20matched). X; X`09MOVW`09#MSGBUF_L,MSGBUF`09`09;`20Reset`20length`20of`20output`20buffer X`09SUBL3`09DCL_IMAGE,R4,R0`09`09`09;`20R0`20=`20virtual`20address X`09SUBL2`09R5,R0`09`09`09`09;`20R0`20--`20offset`20in`20DCL_IMAGE X`09SUBL2`09#512,R0`09`09`09`09;`20Account`20for`20header X`09$FAO_S`09CTRSTR=PATCH_ADDR_MSG,-`09`09;`20Format`20the`20output`20string X`09`09OUTBUF=MSGBUF,-`09`09`09;`20... X`09`09OUTLEN=MSGBUF,-`09`09`09;`20... X`09`09P1=R0`09`09`09`09;`20... X`09PUSHAQ`09MSGBUF`09`09`09`09;`20Print`20the`20string`20out X`09CALLS`09#1,G`5ELIB$PUT_OUTPUT`09`09;`20... X; X;`20`20Now`20replace`20the`20old`20stream`20with`20the`20new`20stream`20of`20b Vytes. X; X`09SUBL2`09R5,R4`09`09`09`09;`20R4`20->`20beginning`20of`20string X`09MOVL`09R5,R0`09`09`09`09;`20Copy`20length`20to`20counter X`09MOVL`09R7,R2`09`09`09`09;`20R2`20->`20replacement`20bytes X`2060$:`09MOVB`09(R2)+,(R4)+`09`09`09;`20Copy`20the`20new`20byte X`09SOBGTR`09R0,60$`09`09`09`09;`20Loop`20until`20no`20more`20bytes X`09INCL`09R11`09`09`09`09;`20Increment`20#`20of`20matches X`09BRW`0910$`09`09`09`09;`20Branch`20to`20continue`20search X X`2070$:`09MOVL`09R11,R0`09`09`09`09;`20Return`20#`20of`20matches`20as`20status V X`09POPR`09#`5EM X`09RSB`09`09`09`09`09;`20Return`20to`20caller X`0C X;+ X; X;`20`20Function:`09READ_OLD_IMAGE X; X;`20`20Functional`20description: X; X;`09Opens`20image`20file`20described`20by`20INFAB,`20allocates`20enough`20virt Vual`20memory X;`09to`20contain`20the`20whole`20file,`20and`20reads`20the`20whole`20file`20in Vto`20memory. X; X;`20`20Inputs: X; X;`09INFAB,`20INRAB,`20INXAB,`20DCL_IMAGE X; X;`20`20Outputs: X; X;`09R0`09`09-`20RMS`20Status X;`09DCL_IMAGE`09-`20Address`20of`20allocated`20memory X;`09IMAGE_SIZE`09-`20The`20size`20of`20the`20file`20(in`20blocks) X; X;- XREAD_OLD_IMAGE: X.IIF`20DF,EVAX,`09.JSB_ENTRY X`09$OPEN`09FAB=INFAB`09`09`09;`20Open`20the`20image`20file X`09ON_ERR`0950$`09`09`09`09;`20Branch`20on`20error X`09$CONNECT`20RAB=INRAB`09`09`09;`20Connect`20the`20RAB X`09BLBC`09R0,40$`09`09`09`09;`20Branch`20on`20error X X`09MOVL`09INXAB+XAB$L_EBK,R0`09`09;`20Get`20size`20of`20file`20in`20blocks X`09MULL2`09#512,R0`09`09`09`09;`20Get`20size`20in`20bytes X`09PUSHL`09R0`09`09`09`09;`20Push`20onto`20the`20stack X`09PUSHAL`09DCL_IMAGE`09`09`09;`20Allocate`20some`20P0`20space X`09PUSHAL`094(SP)`09`09`09`09;`20...`20to`20hold`20entire`20file X`09CALLS`09#2,G`5ELIB$GET_VM`09`09`09;`20Go`20allocate`20the`20memory X`09POPL`09R1`09`09`09`09;`20Pop`20size`20off`20stack X`09BLBC`09R0,40$`09`09`09`09;`20Branch`20on`20error X; X;`20`20Read`20the`20whole`20file`20into`20one`20big`20buffer. X; X`09MOVAL`09INRAB,R6`09`09`09;`20R6`20->`20input`20file`20RAB X`09MOVL`09DCL_IMAGE,RAB$L_UBF(R6)`09`09;`20Start`20reading`20into`20DCL_IMAGE V X`09CLRL`09R7`09`09`09`09;`20Clear`20#`20of`20blocks X`2010$:`09$GET`09RAB=(R6)`09`09`09;`20Read`20a`20record X`09BLBS`09R0,20$`09`09`09`09;`20Branch`20if`20successful X`09CMPL`09#RMS$_EOF,R0`09`09`09;`20Was`20it`20EOF? X`09BEQL`0930$`09`09`09`09;`20Branch`20if`20so X`09BRW`0940$`09`09`09`09;`20Branch`20to`20report`20other`20error X`2020$:`09ADDL2`09#512,RAB$L_UBF(R6)`09`09;`20Bump`20buffer`20address`20to`20n Vext X`09INCL`09R7`09`09`09`09;`20...`20block`20(and`20counter) X`09BRB`0910$`09`09`09`09;`20Branch`20to`20read`20next`20block X`2030$:`09TSTL`09R7`09`09`09`09;`20Was`20anything`20read? X`09BEQL`0940$`09`09`09`09;`20... X`09MOVL`09R7,IMAGE_SIZE`09`09`09;`20#`20of`20blocks`20actually`20read X`09MOVL`09#SS$_NORMAL,R0`09`09`09;`20Set`20success`20status X`2040$:`09PUSHL`09R0`09`09`09`09;`20Save`20status X`09$CLOSE`09FAB=INFAB`09`09`09;`20Close`20the`20input`20file X`09POPL`09R0`09`09`09`09;`20Restore`20the`20status X`2050$:`09RSB`09`09`09`09`09;`20Return`20to`20caller X X`0C X;+ X; X;`20`20Function:`09WRITE_NEW_IMAGE X; X;`20`20Functional`20description: X; X;`09Creates`20image`20file`20described`20by`20OUTFAB`20and`20writes`20data`20i Vn`20allocated X;`09memory`20to`20the`20file`20(in`20512-byte`20(block)`20chunks). X; X;`20`20Inputs: X; X;`09OUTFAB,`20OUTFAB,`20DCL_IMAGE,`20IMAGE_SIZE X; X;`20`20Outputs: X; X;`09R0`09-`20RMS`20Status X; X;- XWRITE_NEW_IMAGE: X.IIF`20DF,EVAX,`09.JSB_ENTRY X`09$CREATE`09FAB=OUTFAB`09`09`09;`20Create`20the`20output`20file X`09BLBC`09R0,30$`09`09`09`09;`20Branch`20on`20error X`09$CONNECT`20RAB=OUTRAB`09`09`09;`20Connect`20the`20RAB X`09BLBC`09R0,20$`09`09`09`09;`20Branch`20on`20error X X`09MOVAL`09OUTRAB,R6`09`09`09;`20R6`20->`20output`20file`20RAB X`09MOVL`09DCL_IMAGE,RAB$L_RBF(R6)`09`09;`20Start`20reading`20into`20DCL_IMAGE V X`09MOVL`09IMAGE_SIZE,R7`09`09`09;`20Initialize`20#`20of`20blocks X X`2010$:`09$PUT`09RAB=(R6)`09`09`09;`20Write`20a`20block`20out X`09BLBC`09R0,20$`09`09`09`09;`20Branch`20on`20error X`09ADDL2`09#512,RAB$L_RBF(R6)`09`09;`20... X`09SOBGTR`09R7,10$`09`09`09`09;`20Loop`20until`20all`20finished X X`2020$:`09PUSHL`09R0`09`09`09`09;`20Save`20status X`09$CLOSE`09FAB=INFAB`09`09`09;`20Close`20the`20input`20file X`09POPL`09R0`09`09`09`09;`20Restore`20the`20status X`2030$:`09RSB`09`09`09`09`09;`20Return`20to`20caller X X`09.END`09DCLPATCH $ call unpack DCLPATCH.MAR;1 795826316 "" 38 1 2 $! $ create 'f' XThis`20file`20offers`20a`20program`20originally`20published`20in`20the`20July/ VAugust`201993 Xissue`20of`20Digital`20Systems`20Journal.`20`20It`20was`20first`20run`20as`20p Vart`20of`20Hunter XGoatley's`20article`20"MACRO`20Made`20Easy:`20Revisiting`20the`20Extended`20DC VL`20RECALL," Xfound`20on`20page`2030.`20The`20procedure,`20called`20DCLPATCH.MAR,`20reads`20 Va`20DCL`20image Xinto`20memory,`20applies`20the`20patches,`20and`20creates`20a`20new`20image`20 Vfile. $ call unpack RECAL2.DESC;1 708716529 "" 1 2 2 $ v=f$verify(v) $ exit