amiga-request@abcfd20.larc.nasa.gov (Amiga Sources/Binaries Moderator) (10/15/90)
Submitted-by: "John Davis,chem dept, UoC NZ" <CHEM194@canterbury.ac.nz> Posting-number: Volume 90, Issue 278 Archive-name: util/gdostool/part01 [ uuencoded executable and icons enclosed ...tad ] A tiny utility that will tell you (via a requester) whether memory location 0 is set to a non-zero value, and give you an option to either clear it, or set it to a 'problem' value. The first option is handy for people with 2091s and A590s, which have been known to set $0="GDOS", the facility to set $0='GDOS' is handy for software authors wishing to make sure their programs aren't accidentally (either thru nil pointers or dropped #'s in assembler) using $0 as a pointer. #!/bin/sh # This is a shell archive. Remove anything before this line, then unpack # it by saving it into a file and typing "sh file". To overwrite existing # files, type "sh file -c". You can also feed this as standard input via # unshar, or by typing "sh <file", e.g.. If this archive is complete, you # will see the following message at the end: # "End of archive 1 (of 1)." # Contents: gdostool.doc gdostool.s gdostool.s.uu gdostool.uu # gdostool0.uu gdostool1.uu # Wrapped by tadguy@abcfd20 on Sun Oct 14 14:19:23 1990 PATH=/bin:/usr/bin:/usr/ucb ; export PATH if test -f 'gdostool.doc' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'gdostool.doc'\" else echo shar: Extracting \"'gdostool.doc'\" \(1285 characters\) sed "s/^X//" >'gdostool.doc' <<'END_OF_FILE' XGdosTool - By J Davis 08/1990 X XWhy X--- X XAn easy mistake to make when progrmming in assembler is to accidentally Xuse $0 (the value in memory location $0) where you mean #$0 (the constant Xvalue zero). A subtle mistake - one not aided by the fact that memory Xloaction 0 often holds 0, so it will yield the right results. X XThe first you notice of this problem is when your code is run on some a590 Xequipped 500's , or 2000s with 2091 controllers, where $0 may actually Xhold the string 'GDOS'. The same situation can also occur in most high Xlevel languages, by de-referencing a NIL pointer. X XThe result can be anything from small errors upto a full blown GURU (if Xthe code tries to de-ref $0 as a pointer to a word - it will yield a Xnon-word aligned word access) X XThis is a common problem (other programs that have trouble with a non zero Xlocation 0 are virusx4, lharc1.20, execellence 1.11, Jrcomm 1.0 and Xseveral others). X XBy using this tool you can set location zero to a 'problem' value before Xtesting your code - this will hopefully make the release of programs with Xsuch 'mistakes' less common. X XYou can also set it back to $0000000 - useful after you've finished Xtesting, and also potentially useful for people with a590s or 2091s. X END_OF_FILE if test 1285 -ne `wc -c <'gdostool.doc'`; then echo shar: \"'gdostool.doc'\" unpacked with wrong size! fi # end of 'gdostool.doc' fi if test -f 'gdostool.s' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'gdostool.s'\" else echo shar: Extracting \"'gdostool.s'\" \(3694 characters\) sed "s/^X//" >'gdostool.s' <<'END_OF_FILE' X; program to allow user examination and setting of ($0) X; X; allows both simulation of the $0='GDOS' phenomena on some a590s and X; 2091s ( useful for testing code for nil pointer de-references and X; incorrect use of $0 when it should be #$0 X; X; also allows clearing of $0, either to remove settings from previous X; use, or due to the a590/2091 itself X Xforbid equ -$084 ; offsets for various exec and int calls Xgetmsg equ -$174 ; saves long includes and compile times Xreplymsg equ -$17a Xwaitport equ -$180 Xfindtask equ -$126 Xautoreq equ -$15c Xopenlib equ -$228 Xcloselib equ -$19e X Xpr_cli equ $0Ac ; process cli flag offset Xpr_msgport equ $05c ; process msgport offset X Xstartup: move.l $4,a6 X move.l #0,a1 X jsr findtask(a6) ; find ourselves X X move.l d0,a4 ; save our process pointer X X move.l pr_cli(a4),d0 X bne fromdos ; was a DOS startup X X ; was started from WB X X lea pr_msgport(a4),a0 X jsr waitport(a6) ; wait for startup msg X lea pr_msgport(a4),a0 X jsr getmsg(a6) ; get the wb msg X X move.l d0,wbmsg ; save pointer to our startup msg X move.l #1,wb ; flag we started from wb X Xfromdos: move.l $0,d0 X cmp.l #$0,d0 X beq is_zero ; if $0=0 then req already setup X X lea nzbodytext,a0 X move.l a0,ctext ; set so req displays non-zero msg X bra _xx X Xis_zero: lea zbodytext,a0 X move.l a0,ctext X X_xx: lea intuiname,a1 X move.l #0,d0 X move.l $4,a6 X jsr openlib(a6) ; open intuition lib X X move.l d0,a6 ; save ibase X X move.l #0,a0 ; window to display in X move.l #bodyitext,a1 ; body text X move.l #yesitext,a2 ; postive text X move.l #noitext,a3 ; negative text X move.l #0,d0 ; pflags X move.l #0,d1 ; nflags X move.l #640,d2 ; width X move.l #50,d3 ; height X jsr autoreq(a6) ; request user confirmation X X cmp.l #0,d0 X beq cleargdos ; user selected clear X Xsetgdos: move.l #"GDOS",$0 ; set $0="GDOS" X bra _n1 X Xcleargdos: move.l #$0,$0 X X_n1: move.l a6,a1 ; close intuition lib X move.l $4,a6 X jsr closelib(A6) X Xexit: move.l wb,d0 X cmp.l #$0,d0 ; was this a CLI invocation X beq exit_dos X X ; workbench exit X X move.l $4,a6 X jsr forbid(a6) ; lock out everyone else X X move.l wbmsg,a1 X jsr replymsg(a6) ; reply to Wbstartup msg X Xexit_dos: move.l #0,d0 ; return with return code 0 X rts X X;============================================================= X Xwb: dc.l 0 ; run mode flag 0=dos process 1=wbprocess Xwbmsg: dc.l 0 ; where we save our workbench msg X Xintuiname: dc.b "intuition.library",0 X X; stuff for our autorequester X Xbodyitext: dc.b 0 ; front pen X dc.b 1 ; back pen X dc.b 0 ; draw mode X dc.w 0 ; leftedge X dc.w 6 ; topedge X dc.l 0 ; textattr = default X dc.l bodytext1 ; actual text X dc.l nbodyitext ; next X Xnbodyitext: dc.b 0 ; front pen X dc.b 1 ; back pen X dc.b 0 ; draw mode X dc.w 0 ; leftedge X dc.w 20 ; topedge X dc.l 0 ; textattr = default Xctext: dc.l 0 ; actual text X dc.l 0 ; next X X Xyesitext: dc.b 2 ; front pen X dc.b 1 ; back pen X dc.b 0 ; draw mode X dc.w 4 ; leftedge X dc.w 4 ; topedge X dc.l 0 ; textattr = default X dc.l yestext ; actual text X dc.l 0 ; next X Xnoitext: dc.b 2 ; front pen X dc.b 1 ; back pen X dc.b 0 ; draw mode X dc.w 4 ; leftedge X dc.w 4 ; topedge X dc.l 0 ; textattr = default X dc.l notext ; actual text X dc.l 0 ; next X X ; actual text for our requester X Xbodytext1: dc.b " SetGDOS by J Davis, 08-1990 v1.0 - an aid to hunting nil pointer de-refs",0 Xzbodytext: dc.b " Location $0 currently holds a NULL (0) value",0 Xnzbodytext: dc.b " Location $0 is currently NON-ZERO",0 X Xyestext: dc.b "Set $0='GDOS'",0 Xnotext: dc.b "Set $0=NULL",0 X X END END_OF_FILE if test 3694 -ne `wc -c <'gdostool.s'`; then echo shar: \"'gdostool.s'\" unpacked with wrong size! fi # end of 'gdostool.s' fi if test -f 'gdostool.s.uu' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'gdostool.s.uu'\" else echo shar: Extracting \"'gdostool.s.uu'\" \(538 characters\) sed "s/^X//" >'gdostool.s.uu' <<'END_OF_FILE' Xbegin 666 gdostool.s.info XMXQ```0```````````"``'``%``,``0#%\-@`````````````````````````& XM````!```QA]Z`,7OXH````"````````````````````````````@`!P``@#%\ XM[_@#````````````!___^`?___@&$)(8!S.3.`<PQS@',Y,X!S"3.`?___@$G XM```(!___^`?_?[@'_O-X!_S-.`?Z,M@'_W^X!][S>`<DS3@/FC+8#WO]^`[WY XMF_@9)FGX'-&6^#____A____X#___^````````````````````````````>]MZ XMY@#,;,8`SSC&`,QLQ@#/;,8````&`___]@````8``(!&``$,A@`#,L8`!<TF_ XM``"`1@`A#(8`VS+&`&7-+@"$`@X!"&0.!MF6'@,N:1X````^````_@____X#0 XG___^``````````9C.F-E9``````(````#D9)3$5465!%/51E>'0`E X`` Xend Xsize 354 END_OF_FILE if test 538 -ne `wc -c <'gdostool.s.uu'`; then echo shar: \"'gdostool.s.uu'\" unpacked with wrong size! fi # end of 'gdostool.s.uu' fi if test -f 'gdostool.uu' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'gdostool.uu'\" else echo shar: Extracting \"'gdostool.uu'\" \(1559 characters\) sed "s/^X//" >'gdostool.uu' <<'END_OF_FILE' Xbegin 666 gdostool XM```#\P`````````!``````````````"5```#Z0```)4L>0````0B?`````!.B XMKO[:*$`@+`"L9@``(D'L`%Q.KOZ`0>P`7$ZN_HPCP````1`C_`````$```$,A XM(#D`````L+P`````9P``$D'Y```"`2/(```!1F````Y!^0```<(CR````49#- XM^0```10@/``````L>0````1.KOW8+$`@?``````B?````28D?````4XF?```" XM`6(@/``````B/``````D/````H`F/````#).KOZDL+P`````9P``$"/\1T1/- XM4P````!@```,(_P``````````").+'D````$3J[^8B`Y```!#+"\`````&<`, XM`!8L>0````1.KO]\(GD```$03J[^AB`\`````$YU``````````!I;G1U:71I' XM;VXN;&EB<F%R>0```0``````!@````````%V```!.@`!```````4````````. XM`````````@$````$``0````````".``````"`0````0`!`````````)&````8 XM`"`@(%-E=$=$3U,@8GD@2B!$879I<RP@,#@M,3DY,"!V,2XP("T@86X@86ED8 XM('1O(&AU;G1I;F<@;FEL('!O:6YT97(@9&4M<F5F<P`@("`@("`@("`@("`@* XM("`@("!,;V-A=&EO;B`D,"!C=7)R96YT;'D@:&]L9',@82!.54Q,("@P*2!VB XM86QU90`@("`@("`@("`@("`@("`@("`@("!,;V-A=&EO;B`D,"!I<R!C=7)R, XM96YT;'D@3D].+5I%4D\`4V5T("0P/2='1$]3)P!3970@)#`]3E5,3```````4 XM`^P````0`````````"P````V````3````%(```!<````8@```&@```"&````K XMC````)(```#B````_````3(```$V```!6@```6X````````#\`````%W8@``] XM```!#`````%?;C$`````U`````%?>'@`````9@````%E>&ET````X`````)C6 XM=&5X=````````48````"=V)M<V<```````$0`````FYO=&5X=``````"1@``K XM``)F<F]M9&]S`````#H````":7-?>F5R;P````!:`````FYO:71E>'0````!; XM8@````)S971G9&]S`````+P````"<W1A<G1U<````````````GEE<W1E>'0`& XM```".`````)E>&ET7V1O<P```00````">65S:71E>'0```%.`````V)O9'EI* XM=&5X=````````28````#8F]D>71E>'0Q```````!=@````-C;&5A<F=D;W,`! XM``````#*`````VEN='5I;F%M90```````10````#>F)O9'ET97AT```````!= XMP@````-N8F]D>6ET97AT``````$Z`````VYZ8F]D>71E>'0``````@$`````K X$```#\@-NF X`` Xend Xsize 1084 END_OF_FILE if test 1559 -ne `wc -c <'gdostool.uu'`; then echo shar: \"'gdostool.uu'\" unpacked with wrong size! fi # end of 'gdostool.uu' fi if test -f 'gdostool0.uu' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'gdostool0.uu'\" else echo shar: Extracting \"'gdostool0.uu'\" \(540 characters\) sed "s/^X//" >'gdostool0.uu' <<'END_OF_FILE' Xbegin 666 gdostool.doc.info XMXQ```0```````````"``'``%``,``0#%\-@`````````````````````````& XM````!```QA]Z`,7OXH````"````````````````````````````@`!P``@#%\ XM[_@#````````````!___^`?___@&$)(8!S.3.`<PQS@',Y,X!S"3.`?___@$G XM```(!___^`?_?[@'_O-X!_S-.`?Z,M@'_W^X!][S>`<DS3@/FC+8#WO]^`[WY XMF_@9)FGX'-&6^#____A____X#___^````````````````````````````>]MZ XMY@#,;,8`SSC&`,QLQ@#/;,8````&`___]@````8``(!&``$,A@`#,L8`!<TF_ XM``"`1@`A#(8`VS+&`&7-+@"$`@X!"&0.!MF6'@,N:1X````^````_@____X#0 XG___^``````````9C.F-E9``````(````#D9)3$5465!%/51E>'0`E X`` Xend Xsize 354 END_OF_FILE if test 540 -ne `wc -c <'gdostool0.uu'`; then echo shar: \"'gdostool0.uu'\" unpacked with wrong size! fi # end of 'gdostool0.uu' fi if test -f 'gdostool1.uu' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'gdostool1.uu'\" else echo shar: Extracting \"'gdostool1.uu'\" \(532 characters\) sed "s/^X//" >'gdostool1.uu' <<'END_OF_FILE' Xbegin 666 gdostool.info XMXQ```0`````!7@"9`",`$0`%``,``0#"W<``````````````````````````( XM`````\,`P%-P`````````4X```".``%ZX`````````^@````+@%R`)?__P``F XM```"0`)_``%=!```````P!*`````````````6@`H_____P`!____Z0``````< XM`````",`$``"``%\H`,```````!__\````!_X<````!_X<````!_X<````!_R XM_\````````````````````/ZJ/````/U1'@```/JHC@```/5<1@```.J__@`4 XM``-5__@```*K__@```/___@``````````/____^``/_____``/_____@`/__^ XM___@`/_____@`/_____@`/_____@`/P']0_@`/P.ZH?@`/P=U4?@`/P[BJ?@1 XD`/QW``?@`/SN``?@`,W<``?@`/P```?@``````````````$`? X`` Xend Xsize 351 END_OF_FILE if test 532 -ne `wc -c <'gdostool1.uu'`; then echo shar: \"'gdostool1.uu'\" unpacked with wrong size! fi # end of 'gdostool1.uu' fi echo shar: End of archive 1 \(of 1\). cp /dev/null ark1isdone MISSING="" for I in 1 ; do if test ! -f ark${I}isdone ; then MISSING="${MISSING} ${I}" fi done if test "${MISSING}" = "" ; then echo You have the archive. rm -f ark[1-9]isdone else echo You still need to unpack the following archives: echo " " ${MISSING} fi ## End of shell archive. exit 0 -- Mail submissions (sources or binaries) to <amiga@uunet.uu.net>. Mail comments to the moderator at <amiga-request@uunet.uu.net>. Post requests for sources, and general discussion to comp.sys.amiga.