[comp.sys.amiga] NoClick / 68881

ISCOVE%UTOROCI.bitnet@ugw.utcs.utoronto.ca (09/14/89)

Version 3.5 handles the task stack incorrectly.  I've now had time to
study Markus Wandel's Exec disassembly.  The extra longword on the
Amiga task stack is used (in AddTask, Switch and Dispatch) to
store/restore the context of a 68881 if it is present.  So NoClick has
to test and adjust only for the presence of a 68881 and not for a
68010/20/30 as 3.5 did.

Accordingly, NoClick3.6 :


begin 644 NoClick3.6
M```#\P`````````!``````````````!2```#Z0```%)(YS\^+'@`!'P!1_D`8
M``$R2?D```$`3J[_B$'N`98B3$ZN_NPFP"!`9O1'Z__\0>X!I%'._^I.KO^"Y
M2?D```$R80``M"!K`$:Q_`#X``!C``">0?D```$`<`!R`$/Y```!$DZN_D1F1
M``"&)GD```$F0_D```$23J[^/B)K``J2_``8)!%822!1D,)V`#8(5D,@`W(!,
M3J[_.B)`Y$L@0B+84<O__"I`"&T`!P$%.WP,@!HX>``Z+@$H"`4`!&<">`1)"
M^0```3)A+B1S0$:5PMO*3J[_B">-0$9.KO^"81AG#DZN_X@GC4!&3J[_@F#N$
M3-]\_'``3G4B7"9I`#8@"4YU=')A8VMD:7-K+F1E=FEC90``````````````C
M`````````````````````````````````````````````````````````$YQ_
M```#[`````@`````````#````!(````\````5````%X```!L````<@```,(`C
'```````#\@@`]
``
end
size 412


Here is the source for the revised section.  The rest of the
source was posted to c.s.a. with version 3.3/3.4 and can be
mailed on request.


*-----------------------------------------------------------------------*
*       Fix each task's exit vector to point to ram version             *
*-----------------------------------------------------------------------*
checkcpu:
        moveq   #0,d4           ;d4 = 0, offset for fixptrs
        move.w  296(a6),d5      ;AttnFlags = 0/1/$11 if cpu is 68000/10/20
        btst.b  #4,d5           ;68881 = 00010xxx
        beq.s   fixptrs         ;branch if no 68881
        moveq   #4,d4           ;d4 = 4 if 68881

fixptrs:
        lea     tasks,a4        ;a4 = address of task list
        bsr.s   nextset         ;a3 = tc_SPReg for listed task
        move.l  $46(a3,d4),a2   ;a2 = finalPC, td code that task exits to
        sub.l   d2,a2           ;a2 = offset of code from start (d2) in rom
        add.l   a2,a5           ;a5 = corresponding address in ram copy

        jsr     _LVODisable(a6)
        move.l  a5,$46(a3,d4)   ;replace corrected finalPC pointer
        jsr     _LVOEnable(a6)

fixloop:
        bsr.s   nextset
        beq.s   exit            ;exit on a1 = 0 (address next listed task)
        jsr     _LVODisable(a6)
        move.l  a5,$46(a3,d4)   ;replace corrected finalPC pointer
        jsr     _LVOEnable(a6)
        bra.s   fixloop



Norman Iscove  iscove@utoroci   (bitnet)