amiga-request@abcfd20.larc.nasa.gov (Amiga Sources/Binaries Moderator) (10/10/90)
Submitted-by: isuihko@ujocs.joensuu.fi (Ismo Suihko)
Posting-number: Volume 90, Issue 272
Archive-name: util/stopclick/part01
[ uuencoded executable enclosed ...tad ]
This program, StopClick, will stop the clicking of empty drives if you
are using SetCPU1.6 (by Dave Haynie) to load KS 1.3 ROM image to fast
32-bit ram. It works even if you are using TDPatch13 from CrossDos.
StopClick also fixes trackdisk read/write bug (just like NoClick did).
Before trying to do any patches, StopClick will check if the system has
a MMU, and after that it checks if the ROM image in 32-bit RAM is the
correct one (KS 1.3). So it is safe to put this after SetCPU FASTROM in
startup-sequence, even if you sometimes reboot your Amiga on 68000 mode
or use other versions of Kickstarts.
#!/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: Makefile README.1st StopClick.a StopClick.uu readme
# Wrapped by tadguy@abcfd20 on Tue Oct 9 21:23:24 1990
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'Makefile' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'Makefile'\"
else
echo shar: Extracting \"'Makefile'\" \(213 characters\)
sed "s/^X//" >'Makefile' <<'END_OF_FILE'
X# Makefile for StopClick 04-Aug-90 by Ismo Suihko
X
XStopClick : StopClick.o
X Blink StopClick.o to StopClick
X
X# I: is assigned to include-directory
XStopClick.o : StopClick.a
X Assem StopClick.a -o StopClick.o -i I:
X
END_OF_FILE
if test 213 -ne `wc -c <'Makefile'`; then
echo shar: \"'Makefile'\" unpacked with wrong size!
fi
# end of 'Makefile'
fi
if test -f 'README.1st' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'README.1st'\"
else
echo shar: Extracting \"'README.1st'\" \(436 characters\)
sed "s/^X//" >'README.1st' <<'END_OF_FILE'
XThis program will stop clicking of empty disk drives, if you
Xare using SetCPU1.6 FASTROM to load KS1.3 image to fast 32-bit RAM.
X
XI have tested it only on my system (with A2620), so I can't say absolutely
Xsure that it works also on other systems on which you can use FASTROM, but I
Xstrongly believe that there aren't any problems.
XPlease email any comments to the following address, thanks.
X
X isuihko@ujocs.joensuu.fi (Ismo Suihko)
END_OF_FILE
if test 436 -ne `wc -c <'README.1st'`; then
echo shar: \"'README.1st'\" unpacked with wrong size!
fi
# end of 'README.1st'
fi
if test -f 'StopClick.a' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'StopClick.a'\"
else
echo shar: Extracting \"'StopClick.a'\" \(9658 characters\)
sed "s/^X//" >'StopClick.a' <<'END_OF_FILE'
X* StopClick version 1.0 for SetCPU1.6 users
X* Written by Ismo Suihko, August 4, 1990 (isuihko@ujocs.joensuu.fi)
X* Released to the Public Domain
X*
X* Routines _GetMMUType and TestFlags are borrowed from SetCPU1.6,
X* which is written by Dave Haynie.
X* Also include file setcpu.i is borrowed from SetCPU sources.
X*
X* Stops clicking of empty drives by patching 1.3 KS V34.5 ROM (check
X* it with command 'version') image loaded in 2-bit RAM with
X* 'SetCPU FASTROM'. Disk drive heads will after the patch be stepped
X* (silently) in a negative rather than positive direction during the
X* regular system checks for a disk change.
X* Version 1.6 of SetCPU isn't doing that patch anymore.
X* StopClick also fixes trackdisk read/write bug (just like NoClick did).
X* This patching is possible, because ROM image isn't protected at all.
X* StopClick does nothing, if there isn't MMU and the given address
X* doesn't seem to contain right version of the ROM image, so it
X* is safe to run this even if you sometimes boot on 68000 mode.
X*
X* Based on the NoClick program, which is written by Norman Iscove.
X* It didn't work on my system, because of SetPatch and TDpatch13
X* (TDpatch13 comes with CrossDos (a great product!)).
X*
X* USAGE:
X* First check the address of the KERNEL by using command 'SetCPU VERBOSE'
X* If you have A2620 or A2630 with 2 MB 32-bit RAM, then output may
X* contain this line
X* KERNEL: (PADDR: $ 3a0000) (VADDR: $ fc0000) (SIZE: 256K)
X* ^^^^^^
X* Then give that address as a parameter to StopClick, like
X* StopClick 3a0000 ;(you can use numbers 0-9 and letters A-F and a-f)
X* Don't put '$' before the address, because it is used by shell.
X* Put StopClick to a startup-sequence after SetCPU FASTROM when you have
X* checked what the address of the KERNEL is. If you add there more memory,
X* you have to check the address again and do modifications if necessary.
X*
X* e.g.
X* SetCPU FASTROM
X* stopclick 3a0000 ; KERNEL is at address $3a0000
X*
X* There aren't any checks if there is a FASTROM image REALLY IN USE.
X* We only check, if there are signs of a 1.3 KS V34.2 ROM image..
X* If FASTROM has been actice once, but then disactivated, the image could
X* still be in the 32-bit RAM, so it is found from there, and patches are
X* made but without any effect (and no harm either).
X*
X* Return codes:
X* 0 complete success, fixes made now or they had been made earlier
X* 5 no MMU (Memory Management Unit)
X* 10 no KS ROM image found, or wrong version of ROM
X* 15 KS ROM image found, but modifications couldn't be done??
X* 99 invalid parameter
X* We get return code 5 always if there isn't a MMU.
X*
X* BUGS:
X* No known bugs.
X* Maybe the address of KERNEL could be found by this program somehow...
X*
X* Sometimes clicking will end only after a couple of seconds, just like
X* with NoClick. Don't ask me why it happens so, as I don't know.
X* And there may be some odd floppy disk drives which don't like to step
X* in a negative direction. I haven't yet heard anyone who owns such a drive.
X*
X* History:
X* V0.9 Jun 23, 1990 works, do we need more?
X* V1.0 Aug 04, 1990 some more checking, now we check if there is a MMU,
X* earlier we checked only if there was a '020 or better.
X* program is now 480 bytes long
X* V?.? ??? ??, ???? will find the address of the ROM image by itself
X*
X* To compile first get the setcpu.i include file from the SetCPU1.6 sources,
X* comment out (add ';'s) the last two lines containing the text
X* ; machine mc68020
X* ; mc68881
X* and then compile with commands
X* Assem StopClick.a -o StopClick.o -i INC:
X* Blink StopClick.o to StopClick
X* Makefile is also provided for easier compilation and linking.
X
X
X* exec.library routines
XLVODisable EQU -120
XLVOEnable EQU -126
XLVOCloseLibrary EQU -414
XLVOOpenLibrary EQU -552
X* dos.library routines
XLVOWrite EQU -48
XLVOOutput EQU -60
X
X* some macros, etc.
X include "setcpu.i"
X
X
X movem.l d0/a0,-(sp) save information of command line parameters
X
X bsr _GetMMUType
X tst.l d0 is there a MMU? 68851 or 68030?
X bne.s scan
X* no MMU
X addq.l #8,sp forget parameters before quitting
X moveq #5,d0 no MMU
X bra exit
X
Xscan
X movem.l (sp)+,d0/a0
X* Now check, if there is a valid hexadesimal address given
X subq.l #1,d0 take out end of line (null)
X beq.s scan_err is there any parameters at all
X
X subq.l #1,d0 counter (length of the parameter)
X moveq #0,d1 result
X moveq #0,d2 character from the command line
Xscan_loop
X move.b (a0)+,d2 get a character from the command line
X
X cmpi.b #' ',d2 check for the end of hex number
X beq.s scan_ready is it a space
X cmpi.b #';',d2
X beq.s scan_ready is it a start of a comment
X cmpi.b #9,d2
X beq.s scan_ready is it a tab
X
X moveq #'0',d3
X cmpi.b #'9',d2
X ble.s scan_number
X bclr.l #5,d2 [a-f] -> [A-F]
X cmpi.b #'A',d2
X blt.s scan_err less than 'A'
X cmpi.b #'F',d2
X bgt.s scan_err greater than 'F'
X moveq #'A'-10,d3
Xscan_number
X sub.b d3,d2
X blt.s scan_err less than '0'
X asl.l #4,d1 multiply by $10
X add.l d2,d1
X dbra d0,scan_loop
Xscan_ready
X tst.w d1 should be of form xxxx0000
X beq.s check
X
Xscan_err
X moveq #99,d0
X bra.s exit
X
Xcheck
X movea.l d1,a2 address of possible ROM image
X
X* Now check if the given address may contain ROM image with exec of V34.2
X cmpi.w #' 3',$1c(a2)
X bne.s bad_rom
X cmpi.l #'4.2 ',$1e(a2)
X bne.s bad_rom
X
X* add offset of trackdisk.device, should be of version 34.1
X adda.l #$29564,a2
X cmpi.l #'34.1',$36(a2)
X beq.s patch
Xbad_rom
X moveq #10,d0 no ROM image found
X bra.s exit
X
Xpatch
X moveq #2,d7 2 patches
X* disable interrupts
X CALLSYS Disable
X
X* first we check, if we need to patch, then we check was the patch successful
X
X* Stop the clicks
X* fix 'bchg #$01,$41(a3)' to 'bset #$01,$41(a3)'
X lea $104(a2),a0
X cmpi.w #$086b,(a0)
X bne.s 1$
X move.w #$08eb,(a0)
X1$
X cmpi.w #$08eb,(a0)
X bne.s 2$
X subq #1,d7
X
X2$
X* Repair trackdisk read/write bug originally at $feaf9c (1.3)
X* fix 'cmp.l $8000,d0' to 'cmpi.l #$8000,d0'
X lea $1a38(a2),a0
X cmpi.w #$b0b9,(a0)
X bne.s 3$
X move.w #$0c80,(a0)
X3$
X cmpi.w #$0c80,(a0)
X bne.s 4$
X subq #1,d7
X4$
X* enable interrupts
X CALLSYS Enable
X
X move.l d7,d0 if d7 = 0, patching was succesful
X beq.s exit
X moveq #15,d0 patches failed??
X
Xexit
X tst.b d0
X beq.s real_exit
X
X* print the usage text
X move.l d0,-(sp) push the return code
X lea dosname(pc),a1
X moveq #0,d0
X CALLSYS OpenLibrary
X tst.l d0
X beq.s 2$
X move.l d0,a5
X exg a5,a6
X jsr LVOOutput(a6)
X move.l d0,d1
X beq.s 1$
X lea usage(pc),a0
X move.l a0,d2
X moveq #usagelen,d3
X jsr LVOWrite(a6)
X1$
X exg a5,a6
X move.l a5,a1
X CALLSYS CloseLibrary
X2$
X move.l (sp)+,d0 pop the return code
X
Xreal_exit
X rts
X
X
X
X* The following routines are borroved from SetCPU1.6 sources.
X* I optimized the code a slightly to make my program smaller than 488
X* bytes, because otherwise it would have taken 1+2 disk blocks using OFS.
X* I removed also the 68040 check, because at this context we don't need
X* to know whether there is exactly '030 or '040 as both have MMU.
X
X
X;======================================================================
X;
X; This routine checks CPU flags early in ExecBase for extended
X; CPUs that test as a 68020 under 1.3. If these flags are set,
X; the actual CPU/MMU type test can be skipped.
X;
X;======================================================================
X
XTestFlags:
X moveq.l #0,d0
X* btst.b #AFB_68040,ATNFLGS(a6) ; Does the OS think an '040 is here?
X* beq.s NoEarly40
X* move.l #68040,d0
X* rts
X*NoEarly40:
X btst.b #AFB_68030,ATNFLGS(a6) ; Does the OS think an '030 is here?
X beq.s NoEarly30
X move.l #68030,d0 ; Sure does...
XNoEarly30:
X rts
X
X
X;======================================================================
X;
X; This function returns 0L if the system contains no MMU,
X; 68851L if the system does contain an 68851, or the CPU number
X; for CPUs with integral CPUs.
X;
X; This routine seems to lock up on at least some CSA 68020
X; boards, though it runs just fine on those from Ronin and
X; Commodore, as well as all 68030 boards it's been tested on.
X;
X; ULONG GetMMUType()
X;
X;======================================================================
X
X_GetMMUType:
X move.l 4,a6 ; Get ExecBase
X bsr TestFlags ; Check extended CPU types
X tst.l d0
X beq.s MMURealTest
X rts
X
X ; For any other machine, a real test must be done. The test will
X ; try an MMU instruction. The instruction will fail unless we're
X ; on a "bogus MMU" system, where the FPU responds as an MMU.
XMMURealTest:
X movem.l a3/a4/a5,-(sp) ; Save this stuff
X suba.l a1,a1
X CALLSYS FindTask ; Call FindTask(0L)
X move.l d0,a3
X
X move.l TC_TRAPCODE(a3),a4 ; Change the exception vector
X lea MMUTraps(pc),a0
X move.l a0,TC_TRAPCODE(a3)
X
X moveq.l #-1,d0 ; Try to detect undecode FPU
X subq.l #4,sp ; Get a local variable
X PMOVE_ tc,(sp) ; Let's try an MMU instruction
X addq.l #4,sp ; Return that local
X move.l a4,TC_TRAPCODE(a3) ; Reset exception stuff
X movem.l (sp)+,a3/a4/a5 ; and return the registers
X rts
X
X ; This is the exception code. No matter what machine we're on,
X ; we get an exception. If the MMU's in place, we should get a
X ; privilige violation; if not, an F-Line emulation exception.
XMMUTraps:
X move.l (sp)+,d0 ; Get Amiga supplied exception #
X cmpi #11,d0 ; Is it an F-Line?
X beq.s MMUNope ; If so, go to the fail routine
X move.l #68851,d0 ; We have MMU
X addq.l #4,2(sp) ; Skip the MMU instruction
X rte
XMMUNope:
X moveq.l #0,d0 ; It dinna woik,
X addq.l #4,2(sp) ; Skip the MMU instruction
X rte
X
X
X
X* some strings
X
Xdosname dc.b 'dos.library',0
Xusage dc.b 'StopClick v1.0 by IS. '
X dc.b 'Usage: StopClick address-of-1.3-KS-FASTROM-image',10
Xusagelen EQU *-usage
X
X END
X
END_OF_FILE
if test 9658 -ne `wc -c <'StopClick.a'`; then
echo shar: \"'StopClick.a'\" unpacked with wrong size!
fi
# end of 'StopClick.a'
fi
if test -f 'StopClick.uu' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'StopClick.uu'\"
else
echo shar: Extracting \"'StopClick.uu'\" \(709 characters\)
sed "s/^X//" >'StopClick.uu' <<'END_OF_FILE'
Xbegin 666 StopClick
XM```#\P`````````!``````````````!O```#Z0```&](YX"`80`!#$J`9@A0F
XMCW`%8```MDS?`0%3@&=$4X!R`'0`%!@,`@`@9S(,`@`[9RP,`@`)9R9V,`P"E
XM`#EO$@B"``4,`@!!;1@,`@!&;A)V-Y0#;0SI@=*"4<C_R$I!9P1P8V!D)$$,*
XM:B`S`!QF&@RJ-"XR(``>9A#5_``"E60,JC,T+C$`-F<$<`I@/'X"3J[_B$'J$
XM`00,4`AK9@0PO`CK#%`(ZV8"4T=!ZAHX#%"PN68$,+P,@`Q0#(!F`E-'3J[_W
XM@B`'9P)P#TH`9S(O`$/Z`)9P`$ZN_=A*@&<@*D#+3DZN_\0B`&<,0?H`B"0(.
XM=DA.KO_0RTXB34ZN_F(@'TYU<``(+@`"`2EG!B`\``$)ODYU+'@`!&'H2H!GW
XM`DYU2.<`')/)3J[^VB9`*&L`,D'Z`!HG2``R</]9C_`70@!8CR=,`#),WS@`P
XM3G4@'PQ```MG#"`\``$,\UBO``).<W``6*\``DYS9&]S+FQI8G)A<GD`4W1O+
XM<$-L:6-K('8Q+C`@8GD@25,N("!5<V%G93H@4W1O<$-L:6-K(&%D9')E<W,MN
X>;V8M,2XS+4M3+49!4U123TTM:6UA9V4*``````/R7
X``
Xend
Xsize 480
END_OF_FILE
if test 709 -ne `wc -c <'StopClick.uu'`; then
echo shar: \"'StopClick.uu'\" unpacked with wrong size!
fi
# end of 'StopClick.uu'
fi
if test -f 'readme' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'readme'\"
else
echo shar: Extracting \"'readme'\" \(1115 characters\)
sed "s/^X//" >'readme' <<'END_OF_FILE'
XStopClick version 1.0 for SetCPU1.6 users
X Written by Ismo Suihko, August 4, 1990
X Released to the Public Domain
X
XThis program will stop the clicking of empty drives if you are using
XSetCPU1.6 (by Dave Haynie) to load KS 1.3 ROM image to fast 32-bit ram.
X
XPlease check the beginning of the assembler source file for usage etc.
XYou need to give the address of ROM image as a parameter.
X
XDistribution:
X This program is freely distributable, provided that all the following
X 4 files are included unmodified:
X
X size in bytes
X README 1115 you are reading it now
X Makefile 213 compiling instructions for Make
X StopClick 480 binary
X StopClick.a 9658 source
X
XTo compile, you need also file setcpu.i from SetCPU1.6 sources.
X
X
XDisclaimer:
X Can I say shortly: "Standard disclaimers apply"
X
XIf you have comments about my program (like/dislike/etc), then email them to
X Internet: isuihko@ujocs.joensuu.fi (try this address first)
X Bitnet: 06560L@FINUJO.BITNET
X
XIf you don't have access to electronic mail systems, then you can try
X Ismo Suihko
X Roivas
X 81999 Joensuu
X FINLAND
END_OF_FILE
if test 1115 -ne `wc -c <'readme'`; then
echo shar: \"'readme'\" unpacked with wrong size!
fi
# end of 'readme'
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.