$! ------------------ CUT HERE ----------------------- $ v='f$verify(f$trnlnm("SHARE_UNPACK_VERIFY"))' $! $! This archive created by VMS_SHARE Version 8.2 $! On 5-FEB-1993 14:46:06.78 By user GOATHUNTER (@WKUVX1.BITNET) $! $! The VMS_SHARE software that created this archive $! was written by Andy Harper, Kings College London UK $! -- December 1992 $! $! 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. EMULTRAP.COM;1 $! 2. EMULTRAP.MAR;1 $! 3. LOADBL.DESC;1 $! 4. PMTDDIR.COM;1 $! 5. PMTDDIR.MAR;1 $! 6. SHOWEMUL.MAR;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 = "!" $ 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 $ 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 file ", P1 $ 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 '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 LOOP EXITIF MARK(NONE)=END_OF(b);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 POSITION(BEGINNING_OF(b));LOOP EXITIF MARK(NONE)=END_OF(b); 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$`20MACRO`20SHOWEMUL X$`20MACRO`20EMULTRAP X$`20LINK`09/NOSYSSHR/NOTRACEBACK/SHAREABLE=SYS$LOADABLE_IMAGES:EMULTRAP`20- X`09/MAP=EMULTRAP/FULL/CROSS_REFERENCE/SYMBOL_TABLE=EMULTRAP`20- X`09SYS$INPUT/OPTION X XEMULTRAP,SYS$LIBRARY:STARLET/INCLUDE:(SYS$DOINIT),- XSYS$SYSTEM:SYS.STB/SELECTIVE X XVECTOR_TABLE=SYS$SYSTEM:SYS.STB XCOLLECT=NONPAGED_READONLY_PSECTS/ATTRIBUTES=RESIDENT,EXEC$NONPAGED_CODE XCOLLECT=NONPAGED_READWRITE_PSECTS/ATTRIBUTES=RESIDENT,EXEC$NONPAGED_DATA XCOLLECT=PAGED_READONLY_PSECTS,EXEC$PAGED_CODE XCOLLECT=PAGED_READWRITE_PSECTS,EXEC$PAGED_DATA XCOLLECT=INITIALIZATION_PSECTS/ATTRIBUTES=INITIALIZATION_CODE,- X`09EXEC$INIT_CODE,- X`09EXEC$INIT_000,EXEC$INIT_001,EXEC$INIT_002,- X`09EXEC$INIT_PFNTBL_000,EXEC$INIT_PFNTBL_001,EXEC$INIT_PFNTBL_002,- X`09EXEC$INIT_SSTBL_000,EXEC$INIT_SSTBL_001,EXEC$INIT_SSTBL_002 X X$`20MCR`20SYSMAN`20`09SYS_LOADABLE`20ADD`20_TMESIS_`20EMULTRAP.EXE`20- X`09`09/LOAD_STEP`20=`20SYSINIT`20`09/SEVERITY`20`20=`20WARNING`20- X`09`09/MESSAGE`20`20`20=`20"Failure`20to`20load`20EMULTRAP.EXE"`20 X$ X$`20@SYS$UPDATE:VMS$SYSTEM_IMAGES.COM X$ X$`20write`20sys$output`20"REBOOT`20THE`20SYSTEM" X$`20exit $ call unpack EMULTRAP.COM;1 154491883 "" $! $ create 'f' X;.---------------------------------------------------------------------------- V-. X;`7C`20`20*****`20LOADABLE`20IMAGE`20(Example`20#1.)`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`7C X;`7C`20`20This`20program`20demonstrates`20use`20of`20a`20loadable`20image`20to V`20intercept`20an`20emulated`20`7C X;`7C`20`20instruction`20fault`20by`20modifying`20the`20SCB`20vector`20with`20a V`20new`20routine`20vector.`20`20`20`7C X;`7C`20`20Author:`20Brian`20Schenkenberger/Indep.`20Consult./TMESIS`20Consulti Vng/Jackson,`20NJ`20`7C X;`60-------------------------------------------------------------------------- V---' X X`09.TITLE`09MARK_EMULATED_TRAP`09Hook`20to`20mark`20emulated`20char`20intructi Vons X`09.IDENT`09'VMS`205.4-2%2.251' X;----------------------------------------------------------------------------- V- X`09.LIBRARY`20/SYS$LIBRARY:LIB/`09;`20Search`20this`20library`20during`20assem Vbly. X`09$SYSVECTORDEF`09`09`09;`20Define`20system`20service`20vector`20offsets. X`09$LDRIMGDEF`09`09`09;`20Loadable`20executive`20image`20block`20defs. X`09$PRTDEF`09`09`09`09;`20Page`20protection`20codes X;----------------------------------------------------------------------------- V- XSCBVEC.EMUL_TRAP`09=`20`5ExC8 X;----------------------------------------------------------------------------- V- X`09DECLARE_PSECT`09EXEC$INIT_CODE X`09INITIALIZATION_ROUTINE`09MARK_EMULATED_TRAP_INIT X XMARK_EMULATED_TRAP_INIT: X`09PUSHR`09#`5EM`09;`20save`20registers`20trashed`20by`20routine X`09MOVL`09#PRT$C_UW,R0`09`09;`20make`20code`20`26`20data`20user`20writeable X`09MOVL`09#2,R1`09`09`09;`20both`20pages X`09MOVAB`09MARK_EMULATED_TRAP,R2`09;`20starting`20VA`20for`20protection`20chan Vge X`09JSB`09G`5EEXE$SET_PAGE_PROTECTION`09;`20go`20change`20protection X`09POPR`09#`5EM`09`09;`20restore`20saved`20registers X X`09MOVL`09@#EXE$GL_SCB,R0`09`09`09;`20get`20base`20address`20of`20SCB X`09MOVL`09SCBVEC.EMUL_TRAP(R0),-`09`09;`20get/save`20emulator`20address X`09`09CHARSTRING_EMULATOR`09`09;`20==-`20in`20the`20SCB`20slot X`09MOVL`09LDRIMG$L_NONPAG_R_BASE(R4),-`09;`20put`20marker`20routine`20address X`09`09SCBVEC.EMUL_TRAP(R0)`09`09;`20==-`20in`20the`20SCB`20slot X X`09PUSHR`09#`5EM`09;`20save`20registers`20trashed`20by`20routine X`09MOVL`09#PRT$C_UR,R0`09`09;`20make`20marker`20routine`20user`20readable X`09MOVL`09#1,R1`09`09`09;`20only`20one`20page X`09MOVAB`09MARK_EMULATED_TRAP,R2`09;`20starting`20VA`20for`20protection`20chan Vge X`09JSB`09G`5EEXE$SET_PAGE_PROTECTION`09;`20go`20change`20protection X`09POPR`09#`5EM`09`09;`20restore`20saved`20registers X`09BBSS`09#INIRTN$V_NO_RECALL,-`09;`20invoke`20init`20routine`20one`20time`20o Vnly! X`09`09(R5),10$`09`09 X10$:`09MOVL`09#1,R0`09`09`09;`20return`20with`20success. X`09RSB X X;----------------------------------------------------------------------------- V- X`09DECLARE_PSECT`09EXEC$NONPAGED_DATA XINSTRUCTION_MARKBLK:`09.LONG`09<256/32>;`20256`201`20byte`20opcodes/(32`20bits V/longword) X;----------------------------------------------------------------------------- V- X`09DECLARE_PSECT`09EXEC$NONPAGED_CODE XMARK_EMULATED_TRAP: X`09BBSS`09(SP),INSTRUCTION_MARKBLK,10$`09;`20set`20instruction`20marker`20bit X10$:`09JMP`09@CHARSTRING_EMULATOR`09`09;`20invoke`20original`20EMULATOR`20code V X`0C X`09.ALIGN`09LONG`20 XCHARSTRING_EMULATOR:`09.LONG X`09.END $ call unpack EMULTRAP.MAR;1 1313225830 "" $! $ create 'f' XThis`20file`20features`20code`20previously`20published`20in`20the`20January/Fe Vbruary`201993`20 Xissue`20of`20Digital`20Systems`20Journal.`20it`20originally`20ran`20as`20part V`20of`20Brian`20 XSchenkenberger's`20article`20"OpenVMS`20VAX`20Loadable`20Executive`20Images," V`20which`20ran`20 Xon`20page`2019.`20The`20article`20explores`20the`20mechanisms`20of`20the`20loa Vdable`20image,`20its`20 Xrole`20in`20the`20executive`20reorganization,`20operating`20system`20support V`20for`20loading`20 Xthe`20image`20and`20how`20to`20write`20and`20load`20a`20loadable`20executive V`20image. $ call unpack LOADBL.DESC;1 1803054592 "" $! $ create 'f' X$`20MACRO`20PMTDDIR X$`20LINK`09/NOSYSSHR/NOTRACEBACK/SHAREABLE=SYS$LOADABLE_IMAGES:PMTDDIR`20- X`09/MAP=PMTDDIR/FULL/CROSS_REFERENCE/SYMBOL_TABLE=PMTDDIR`20- X`09SYS$INPUT/OPTION X XPMTDDIR,SYS$LIBRARY:STARLET/INCLUDE:(SYS$DOINIT),- XSYS$SYSTEM:SYS.STB/SELECTIVE,SYS$SYSTEM:DCLDEF.STB/SELECTIVE X XVECTOR_TABLE=SYS$SYSTEM:SYS.STB XCOLLECT=NONPAGED_READONLY_PSECTS/ATTRIBUTES=RESIDENT,EXEC$NONPAGED_CODE XCOLLECT=NONPAGED_READWRITE_PSECTS/ATTRIBUTES=RESIDENT,EXEC$NONPAGED_DATA XCOLLECT=PAGED_READONLY_PSECTS,EXEC$PAGED_CODE XCOLLECT=PAGED_READWRITE_PSECTS,EXEC$PAGED_DATA XCOLLECT=INITIALIZATION_PSECTS/ATTRIBUTES=INITIALIZATION_CODE,- X`09EXEC$INIT_CODE,- X`09EXEC$INIT_000,EXEC$INIT_001,EXEC$INIT_002,- X`09EXEC$INIT_PFNTBL_000,EXEC$INIT_PFNTBL_001,EXEC$INIT_PFNTBL_002,- X`09EXEC$INIT_SSTBL_000,EXEC$INIT_SSTBL_001,EXEC$INIT_SSTBL_002 X X$ X$`20MCR`20SYSMAN`20`09SYS_LOADABLE`20ADD`20_TMESIS_`20PMTDDIR.EXE`20- X`09`09/LOAD_STEP`20=`20SYSINIT`20`09/SEVERITY`20`20=`20WARNING`20- X`09`09/MESSAGE`20`20`20=`20"Failure`20to`20load`20PMTDDIR.EXE"`20 X$ X$`20@SYS$UPDATE:VMS$SYSTEM_IMAGES.COM X$ X$!`20REBOOT`20THE`20SYSTEM X$!---------------------------------------------------------------------------- V X$!`20FYI...`20For`20anyone`20actually`20wishing`20to`20use`20this`20loadable. V`20`20The`20LOGINOUT.EXE X$!`20image`20builds`20the`20P1`20region`20itself.`20`20To`20have`20the`20promp Vt`20reflect`20the`20process X$!`20default`20at`20login,`20a`20SET`20DEFAULT`20or`20SHOW`20DEFAULT`20command V`20should`20be`20executed`20 X$!`20in`20SYLOGIN.COM`20or`20LOGIN.COM. X$!---------------------------------------------------------------------------- V X$`20exit $ call unpack PMTDDIR.COM;1 1633290550 "" $! $ create 'f' X;.---------------------------------------------------------------------------- V-. X;`7C`20`20*****`20LOADABLE`20IMAGE`20(Example`20#2.)`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`7C X;`7C`20`20This`20program`20demonstrates`20use`20of`20a`20loadable`20image`20as V`20a`20means`20of`20enhancing`20`20`7C X;`7C`20`20the`20functionality`20of`20a`20VMS`20system`20service.`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`7C X;`7C`20`20Author:`20Brian`20Schenkenberger/Indep.`20Consult./TMESIS`20Consulti Vng/Jackson`20NJ`20`20`7C X;`60-------------------------------------------------------------------------- V---' X`09.TITLE`09SETDDIR_WTH_PROMPT`09Define`20$SETDDIR`20to`20change`20DCL`20promp Vt X`09.IDENT`09'VMS`205.4-2%2.251' X;----------------------------------------------------------------------------- V- X`09.LIBRARY`20/SYS$LIBRARY:LIB/`09;`20Search`20this`20library`20during`20assem Vbly. X`09$SYSVECTORDEF`09`09`09;`20Define`20system`20service`20vector`20offsets. X`09$LDRIMGDEF`09`09`09;`20Loadable`20executive`20image`20block`20defs. X`09$CCBDEF`09`09`09`09;`20Channel`20Control`20Block`20definitions X`09$IHDDEF`09`09`09`09;`20Image`20header`20descriptor`20definitions X`09$IHSDEF`09`09`09`09;`20Image`20debug/symbol`20table`20definitions X`09$OBJDEF`09`09`09`09;`20Symbol`20table`20record`20definitions X`09$PSLDEF`09`09`09`09;`20Processor`20Status`20definitions X`09$WCBDEF`09`09`09`09;`20Window`20control`20block`20definitions X;----------------------------------------------------------------------------- V- X;`20This`20image`20and`20its`20initialization`20routine`20assume`20that`20it V`20is`20being`20called X;`20in`20the`20SYSINIT`20phase`20of`20the`20system's`20bootstrap.`20`20Ergo, V`20the`20image`20RMS.EXE X;`20has`20been`20loaded`20just`20prior`20to`20the`20loading`20and`20invocation V`20of`20this`20image`20by`20 X;`20LDR$ALTERNATE_LOAD.`20`20 X;----------------------------------------------------------------------------- V- X`09DECLARE_PSECT`09EXEC$INIT_CODE X X`09INITIALIZATION_ROUTINE`09SETDDIR_WTH_PROMPT_INIT X XSETDDIR_WTH_PROMPT_INIT: X`09PUSHR`09#`5EM`09;`20save`20registers`20trashed`20by`20init`20r Vtn. X`09MOVAB`09@#LDR$GQ_IMAGE_LIST,R4`09;`20get`20loadable`20image`20listhead`20ad Vdress X`09MOVL`09R4,R5`09`09`09;`20put`20in`20r5`20so`20we`20can`20walk-the-list X10$:`09MOVL`09(R5),R5`09`09`09;`20get`20an`20entry`20from`20the`20list X`09CMPL`09R4,R5`09`09`09;`20check`20if`20its`20the`20'end-of-the-line' X`09BEQL`0940$`09`09`09;`20list`20exhausted?`20('end-of-the-line') X`09CMPB`09LDRIMG$B_IMGNAMLEN(R5),-;`20could`20this`20be`20the`20one?`20check V`20if`20the X`09`09#RMSIMGNMLEN`09`09;==-`20image`20name`20is`20the`20right`20size X`09BNEQU`0910$`09`09`09;`20better`20luck`20next`20time`20around X`09CMPC3`09#RMSIMGNMLEN,RMSIMGNAM,-;`20length`20checked`20out`20ok!`20now`20ch Veck`20if X`09`09LDRIMG$T_IMGNAM(R5)`09;==-`20the`20image`20name`20is`20correct X`09BNEQU`0910$`09`09`09;`20better`20luck`20next`20time`20around`09 X`09BSBB`09GET_IMGVAL`09`09;`20get`20image`20value`20of`20RMS$SETDDIR X`09BLBC`09R0,20$`09`09`09;`20branch`2020$`20if`20bad`20news X`09MOVL`09LDRIMG$L_BASE(R5),R5`09;`20get`20the`20base`20address`20of`20RMS.EXE V X`09MOVAB`09(R5)`5BR3`5D,-`09`09;`20put`20the`20address`20of`20RMS$SETDDIR`20in Vto X`09`09RMS$SETDDIR_ENTRY_PT`09;==-`20RMS$SETDDIR_ENTRY_PT X`09MOVL`09#1,R0`09`09`09;`20return`20with`20success. X20$:`09POPR`09#`5EM`09;`20restore`20saved`20registers X`09BBSS`09#INIRTN$V_NO_RECALL,-`09;`20invoke`20init`20routine`20one`20time`20o Vnly! X`09`09(R5),30$`09`09 X30$:`09RSB X40$:`09CLRL`09R0 X`09BRB`0920$ X`0C X;----------------------------------------------------------------------------- V- X;`20At`20the`20point`20within`20the`20SYSINIT`20process`20where`20the`20altern Vate`20loader`20loads X;`20this`20image,`20the`20system`20has`20not`20yet`20been`20initialized`20to V`20the`20point`20where`20a`20 X;`20full`20checking`20$ASSIGN`20service`20will`20function.`20`20The`20followin Vg`20instructions X;`20perform`20the`20'bare-bones'`20task`20of`20building`20a`20CCB`20and`20assi Vgning`20a`20channel`20 X;`20number.`20`20(First`209`20instructions)`20(Consult`20the`20VAX/VMS`20v5.2 V`20IDSM`20Ch.`2030,31 X;`20for`20more`20intimate`20details`20of`20the`20system`20initialization`20pro Vcess.) X;----------------------------------------------------------------------------- V- XGET_IMGVAL: X`09JSB`09@#IOC$FFCHAN`09`09;`20get`20hold`20of`20a`20free`20CCB X`09BLBS`09R0,.+2`09`09`09;`20if`20ok???`20go`20build`20the`20CCB X`09RSB`09`09`09`09;`20bad`20news`20again! X X`09MOVL`09@#EXE$GL_SYSUCB,-`09;`20put`20system`20device`20UCB`20address`20in X`09`09CCB$L_UCB(R2)`09`09;==-`20CCB$L_UCB`20(*thank`20EXE$INIT*) X`09CLRL`09CCB$L_WIND(R2)`09`09;`20no`20associated`20WCB X`09MOVB`09#CCB$M_RDCHKDON,-`09;`20signify`20reads`20on`20this`20channel X`09`09CCB$B_STS(R2)`20`09`09;==-`20should`20be`20ok X`09ADDB3`09#1,#PSL$C_KERNEL,-`09;`20mark`20channel`20as`20a`20kernel`20mode X`09`09CCB$B_AMOD(R2)`09`09;==-`20accessed`20channel X`09CLRL`09CCB$L_DIRP(R2)`09`09;`20no`20deaccess`20i/o X X`09MOVW`09R1,CHAN`09`09`09;`20channel`20#`20(we'll`20need`20this`20again) X X`09MOVL`09LDRIMG$L_WCB(R5),R4`09;`20get`20window`20control`20block`20address X`09CMPW`09WCB$W_NMAP(R4),#1`09;`20is`20file`20mapped`20in`201`20extent? X`09BEQL`0910$`09`09`09;`20branch`2010$`20if`20a`20single`20extent X`09CLRL`09R0`09`09`09;`20looks`20like`20trouble X`09RSB`09`09`09`09 X`09`09`09`09`09;`20-`20let's`20get`20the`20image`20header`20- X10$:`09MOVL`09WCB$L_P1_LBN(R4),R3`09;`20get`20LBN`20of`20the`20start`20of`20RM VS.EXE X`09MOVAB`09IMGDATA,R2`09`09;`20get`20address`20of`20local`20data`20store X`09$QIOW_S`09FUNC=#IO$_READLBLK,-`09;`20read`20the`20image`20header`20at`20LBN V=R3 X`09`09CHAN=CHAN,IOSB=IOSB,-`09;==-`20into`20the`20local`20data`20storage X`09`09P1=(R2),P2=#512,P3=R3`09;`20 X`09BLBS`09R0,.+2`09`09`09;`20check`20the`20ss`20completion`20status X`09RSB X`09MOVZWL`09IOSB,R0`09`09`09;`20extract`20the`20i/o`20completion`20status X`09BLBS`09R0,.+2`09`09`09;`20check`20the`20i/o`20completion`20status X`09RSB X`09`09`09`09`09;`20-`20let's`20find`20those`20goodies`20- X`09MOVZWL`09IHD$W_SYMDBGOFF(R2),R2`09;`20get`20offset`20to`20symbol`20table V`20header X`09MOVAB`09IMGDATA`5BR2`5D,R2`09`09;`20get`20base`20of`20symbol`20table`20head Ver X`09MOVL`09IHS$L_GSTVBN(R2),R2`09;`20get`20VBN`20of`20the`20Global`20Symbol`20t Vable`20`20`20`20 X`09ADDL2`09R2,R3`09`09`09;`20calculate`20the`20GST's`20LBN`20 X`09SUBW3`09R2,WCB$W_P1_COUNT(R4),R2;`20how`20big`20is`20it?`20 X`09CMPL`09R2,#8`09`09`09;`20is`20the`20IMGDATA`20area`20big`20enough? X`09BLSSU`0920$`09`09`09;`20branch`2020$`20if`20it`20is X`09MOVL`09#8,R2`09`09`09;`20limit`20to`208`20pgs.`20hope`20symbol's`20there V`20`20`20 X20$:`09ASHL`09#9,R2,R2`09`09;`20turn`20blocks`20into`20bytes.`20(alchemy!) X X`09$QIOW_S`09FUNC=#IO$_READLBLK,-`09;`20read`20the`20GST`20starting`20at`20LBN V=R3 X`09`09CHAN=CHAN,IOSB=IOSB,-`09;==-`20into`20the`20local`20store X`09`09P1=IMGDATA,P2=R2,P3=R3 X`09BLBS`09R0,.+2`09`09`09;`20check`20the`20ss`20completion`20status X`09RSB X`0C X`09MOVZWL`09IOSB,R0`09`09`09;`20extract`20the`20i/o`20completion`20status X`09BLBS`09R0,.+2`09`09`09;`20check`20the`20i/o`20completion`20status X`09RSB X`09`09`09`09`09;`20-`20time`20to`20make`20the`20doughnuts!`20- X`09MATCHC`09#SETDDIR_LEN,SETDDIR,-`09;`20look`20for`20the`20symbol`20name`20in V`20the X`09`09R2,IMGDATA`09`09;==-`20retrieved`20table`20data X`09BEQL`0930$`09`09`09;`20branch`2030$`20if`20we`20found`20it X`09CLRL`09R0`09`09`09;`20bad`20news!! X`09RSB X X30$:`09MOVAB`09-(R3),R3`09;`20backup`20to`20beginning`20of`20sy Vmbol`20name X`09MOVL`09-(R3),-`20;`20backup`20from`20symb Vol X`09`09R3`09`09`09;==-`20name`20to`20start`20of`20symbol`20value X`09MOVL`09#1,R0`09`09`09;`20...and`20there`20was`20great`20rejoicing! X`09RSB X`09`09 X`09`09.ALIGN`09LONG`09;`20start`20data`20on`20a`20LONG`20boundary.`20 XCHAN:`09`09.WORD`090 X`09`09.WORD`090`20`09;`20filler`20to`20align`20the`20IOSB`20on`20a`20LW XIOSB:`09`09.QUAD`090 X XRMSIMGNAM:`09.ASCII`09/`5BSYS$LDR`5DRMS.EXE/ XRMSIMGNMLEN=`09.-RMSIMGNAM XSETDDIR:`09.ASCII`09/RMS$SETDDIR/ XSETDDIR_LEN=`09.-SETDDIR X X`09`09.ALIGN`09LONG`09;`20start`20data`20on`20a`20LONG`20boundary.`20`20using V`20init XIMGDATA:`09.BLKB`09512*8`09;`20psect`20for`20work,`20deleted`20after`20image V`20loaded. X;----------------------------------------------------------------------------- V- X`09DECLARE_PSECT`09EXEC$PAGED_DATA X XRMS$SETDDIR_ENTRY_PT:`09.LONG`090 X;----------------------------------------------------------------------------- V- X`09DECLARE_PSECT`09EXEC$PAGED_CODE X X`09SYSTEM_SERVICE`09SETDDIR,`20,- X`09`09`09MODE=EXEC,`20NARG=3,`20PREFIX=RMS$ X X`09CALLG`09(AP),@RMS$SETDDIR_ENTRY_PT`20`20;`20invoke`20original`20SETDDIR`20c Vode X`09BLBS`09R0,10$`09`09`09;`20modify`20DCL`20prompt`20if`20all`20is`20well X`09RET`09`09`09`09;`20something`20went`20wrong!`20tell`20caller X X10$:`09MOVAB`09@#CTL$AG_CLIDATA,R7`09;`20get`20base`20of`20the`20CLI`20data V`20area X`09IFNORD`09#4,PPD$L_PRC(R7),30$`09;`20is`20the`20PPD`20area`20accessible!? V`20`20 X`09MOVL`09PPD$L_PRC(R7),R7`09;`20get`20base`20of`20proc.`20perm.`20data`20area V`20`20 X`09IFNOWRT`09#PRC_S_PROMPT,-`09`09;`20is`20prompt`20string`20area`20writeable? V? X`09`09PRC_G_PROMPT(R7),30$`09;==-`20if`20not,`20get`20outta`20here! X X`09MOVAB`09@#PIO$GT_DDSTRING,R8`09;`20get`20the`20def`20dir`20(ascic)`20string V`20 X`09 X`09MOVZBL`09(R8)+,R6`09`09;`20get`20the`20length`20of`20the`20ddstring X`09CMPL`09R6,#PRC_S_PROMPT-1`09;`20will`20it`20fit`20in`20the`20prompt?`20 X`09BLSSU`0920$`09`09`09;`20branch`2020$`20if`20it`20fits X`09SUBL2`09#PRC_S_PROMPT-1,R6`09;`20how`20much`20wont`20fit`20in`20the`20promp Vt? X`09ADDL2`09R6,R8`09`09`09;`20chop`20that`20much`20off`20the`20beginning X`09MOVL`09#PRC_S_PROMPT-1,R6`09;`20output`20all`20that`20we`20got. X`0C X20$:`09MOVC3`09R6,(R8),PRC_G_PROMPT(R7)`09;`20copy`20ddstring`20to`20prompt X`09ADDB3`09#4,R6,PRC_B_PROMPTLEN(R7)`09;`20update`20the`20prompt`20length X`09MOVB`09#`5Ea/`20/,PRC_G_PROMPT(R7)`5BR6`5D`09;`20add`20space`20to`20end`20o Vf`20prompt X30$:`09MOVL`09#RMS$_NORMAL,R0`09`09;`20tell`20caller`20everything's`20alright X`09RET X X`09.END $ call unpack PMTDDIR.MAR;1 355216295 "" $! $ create 'f' X;.---------------------------------------------------------------------------- V-. X;`7C`20`20*****`20LOADABLE`20IMAGE`20(Example`20#1.`20`20The`20sequel...)`20 V`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`7C X;`7C`20`20This`20program`20demonstrates`20use`20of`20the`20loadable`20image V`20listhead`20to`20locate`20a`20`20`20`7C X;`7C`20`20segment`20of`20code`20or`20data.`20`20Use`20with`20loadable`20image V`20example`20#1.`20`20Remember,`20`20`20`7C X;`7C`20`20this`20program`20can`20only`20determine`20emulated`20instructions V`20if`20the`20instruction`20`20`20`7C X;`7C`20`20has`20been`20excercised`20in`20code.`20(That`20code`20is`20up`20to V`20you!!!...)`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`7C X;`7C`20`20Author:`20Brian`20Schenkenberger/Indep.`20Consult./TMESIS`20Consulti Vng/Jackson`20NJ`20`20`7C X;`60-------------------------------------------------------------------------- V---' X X`09.TITLE`09SHOW_EMULATED_INST`09Read`20marker`20in`20Loadable`20image`20EMULT VRAP X`09.IDENT`09'VMS`205.4-2%2.251' X;----------------------------------------------------------------------------- V- X`09.LINK`09`20"SYS$SYSTEM:SYS.STB"`09;`20Link`20w/`20SYS.STB`20(LDR$GQ_IMAGE_L VIST) X`09.LIBRARY`20/SYS$LIBRARY:LIB/`09;`20Search`20this`20library`20during`20assem Vbly. X`09$LDRIMGDEF`09`09`09;`20Loadable`20executive`20image`20block`20defs. X`09$OPDEF`09`09`09`09;`20VAX`20Opcode`20definitions X;----------------------------------------------------------------------------- V- X`09.MACRO`09CHECK_INST,INST,?LABEL X`09.IF`20DEFINED`20OP$_'INST`09`09;`20is`20arg`20a`20valid`20VAX`20instruction V??? X`09.IF_TRUE`09`09`09;`20if`20so`20... X`09.SAVE_PSECT`09`09`09;`20save`20current`20program`20seciton X`09.PSECT`09DATA,RD,WRT,NOEXE,LONG`09;`20concat`20with`20the`20DATA`20psect XINST':`09.ASCID`09/'INST'`20was`20emulated/`09;`20create`20report`20string`20f Vor`20instruction X`09.RESTORE_PSECT`09`09`09;`20back`20to`20the`20CODE`20psect... X`09BBC`09#OP$_'INST,-`09`09;`20check`20if`20EMULTRAP`20loadable`20image X`09`09@EMULTRAP_MARKER,LABEL`09;`20==-`20set`20the`20marker`20bit... X`09PUSHAB`09INST`09`09`09;`20push`20the`20message`20string X`09CALLS`09#1,G`5ELIB$PUT_OUTPUT`20`20`20`20`20;`20tell`20user`20which`20inst V`20was`20emulated X`09BLBS`09R0,LABEL`09`09;`20check`20call`20status X`09RET`09`09`09`09;`20bad`20news,`20time`20to`20return XLABEL:`09`09`09`09`09;`20got`20here...`20ok X`09.IF_FALSE`09`09`09;`20if`20not`20a`20valid`20VAX`20inst`20in`20arg X`09.ERROR`20;`20Invalid`20instruction`20specified`20in`20macro`09;`20tell`20th Ve`20user X`09.ENDC`09`09`09`09;`20all`20done X`09.ENDM`09CHECK_INST X;----------------------------------------------------------------------------- V- X`09.PSECT`09DATA,RD,WRT,NOEXE,LONG XEMULTRAP_MARKER:`09.LONG`090 X XEMULTPNAM:`09.ASCII`09/EMULTRAP.EXE/ XEMULTRAPLEN=`09.-EMULTPNAM X;----------------------------------------------------------------------------- V- X`09.PSECT`09CODE,RD,NOWRT,EXE,LONG X`09.ENTRY`09SHOWEMUL,0 X X`09$CMEXEC_S`09ROUTIN=FIND_MARKER X`09BLBS`09R0,10$ X`09RET X`0C`09 X10$:`09CHECK_INST`09ADDP4`09;`20packed`20decimal`20string`20and`20character V`20 X`09CHECK_INST`09ADDP6`09;`20instructions`20are`20only`20instructions X`09CHECK_INST`09ASHP`09;`20marked`20by`20EMULTRAP`20loadable`20image X`09CHECK_INST`09CMPC3 X`09CHECK_INST`09CMPC5`09;;`20`20(BTW...`20MOVC3`20and`20MOVC5`20are`20 X`09CHECK_INST`09CMPP3`09;;`20`20"_NEVER_"`20`20emulated...) X`09CHECK_INST`09CMPP4`09 X`09CHECK_INST`09CVTLP`09;;`20In`20addition`20to`20the`20information`20this`20 X`09CHECK_INST`09CVTPL`20`20`20;;`20example`20provides`20concerning`20Loadable X`09CHECK_INST`09CVTPS`20`20`20;;`20executive`20images,`20this`20program`20shou Vld X`09CHECK_INST`09CVTPT`09;;`20help`20to`20dispell`20a`20great`20many`20of`20the V X`09CHECK_INST`09CVTSP`09;;`20commonly`20held`20'Myth'conceptions`20 X`09CHECK_INST`09CVTTP`09;;`20about`20VAX`20instruction`20emulation.`09 X`09CHECK_INST`09DIVP`09;;`20eg.,`20A`20'Faux`20Pax'`20in`20the`20reader`20lett Ver`20`09 X`09CHECK_INST`09EDITPC`09;;`20published`20in`20VAX`20Prof.`20Vol.9,#1,`20pg.46 V`20 X`09CHECK_INST`09LOCC X`09CHECK_INST`09MATCHC X`09CHECK_INST`09MOVP X`09CHECK_INST`09MOVTC X`09CHECK_INST`09MOVTUC X`09CHECK_INST`09MULP X`09CHECK_INST`09SCANC X`09CHECK_INST`09SKPC X`09CHECK_INST`09SPANC X`09CHECK_INST`09SUBP4 X`09CHECK_INST`09SUBP6 X`09RET X;----------------------------------------------------------------------------- V- X`09.ENTRY`09FIND_MARKER,`5EM X`09MOVAB`09@#LDR$GQ_IMAGE_LIST,R4`09;`20get`20loadable`20image`20listhead`20ad Vdress X`09MOVL`09R4,R5`09`09`09;`20put`20in`20r5`20so`20we`20can`20walk-the-list X10$:`09MOVL`09(R5),R5`09`09`09;`20get`20an`20entry`20from`20the`20list X`09CMPL`09R4,R5`09`09`09;`20check`20if`20its`20the`20'end-of-the-line' X`09BEQL`0920$`09`09`09;`20list`20exhausted?`20('end-of-the-line') X`09CMPB`09LDRIMG$B_IMGNAMLEN(R5),-;`20could`20this`20be`20the`20one?`20check V`20if`20the X`09`09#EMULTRAPLEN`09`09;`20==-`20image`20name`20is`20the`20right`20size X`09BNEQU`0910$`09`09`09;`20better`20luck`20next`20time`20around X`09CMPC3`09#EMULTRAPLEN,EMULTPNAM,-;`20length`20checked`20out`20ok!`20now`20ch Veck`20if X`09`09LDRIMG$T_IMGNAM(R5)`09;`20==-`20the`20image`20name`20is`20correct X`09BNEQU`0910$`09`09`09;`20better`20luck`20next`20time`20around`09 X`09MOVL`09LDRIMG$L_NONPAG_W_BASE(R5),-`20;`20get`20the`20address`20of`20marker V`20mask X`09`09EMULTRAP_MARKER`09`09`09`09 X`09MOVL`09#1,R0`09`09`09;`20return`20with`20success. X`09RET X20$:`09MOVL`09#,R0`09;`20return`20warning!`20non-existant V`20page X`09RET`09`09`09`09;`20==-`20image`20not`20loaded`20??!!! X X`09.END`09SHOWEMUL $ call unpack SHOWEMUL.MAR;1 392793112 "" $ v=f$verify(v) $ exit