home *** CD-ROM | disk | FTP | other *** search
/ Club Amiga de Montreal - CAM / CAM_CD_1.iso / files / 532.lha / ClockTick / ClockTick.asm < prev    next >
Assembly Source File  |  1991-07-09  |  21KB  |  553 lines

  1.         TTL        ClockTick
  2. *
  3. *******************************************************************************
  4. *                                          *
  5. *    ClockTick 1.2                                  *
  6. *                                          *
  7. *    Copyright (c) 1991 by Michael Sinz    MKSoft Development          *
  8. *                                          *
  9. *    AmigaDOS EXEC release 1.2 or greater...                      *
  10. *                                          *
  11. *******************************************************************************
  12. *                                          *
  13. *    To assemble, I used CAPE 68K                          *
  14. *                                          *
  15. *    # CAPE  68k MakeFile rule...                          *
  16. *    .asm:                                      *
  17. *        @CAsm -a $*.asm -i sys:lc/include -cqsy -o $*.o              *
  18. *        @BLink $*.o lib lib:amiga.lib to $* sc sd nd              *
  19. *        @List $*                              *
  20. *                                          *
  21. *    It should assemble without any problems on most 680x0 assemblers.     *
  22. *                                          *
  23. *******************************************************************************
  24. *                                          *
  25. *    This program installs a handler into the input food chain.          *
  26. *    The handler changes the hands of the clock every time a time          *
  27. *    tick comes down the chain.                          *
  28. *                                          *
  29. *    It uses the fact that SPRITES are hardware mapped bitmaps.  If          *
  30. *    the sprite system ever needs to be retargeted, this will no longer    *
  31. *    work.  (A2024 is already such a case)                      *
  32. *                                          *
  33. *    It also setfunctions the SetPointer() call and checks what the          *
  34. *    the pointer looks like.  If it is the standard clock busy pointer     *
  35. *    from 2.0, it will change the SetPointer call to use the built in one  *
  36. *                                          *
  37. *    When you run this program, it will allocate some CHIP memory and      *
  38. *    some of PUBLIC memory to install the handler and images.          *
  39. *    It then exits...                              *
  40. *                                          *
  41. *    It will not let itself be installed more than once...              *
  42. *                                          *
  43. *******************************************************************************
  44. *                                          *
  45. *    Reading legal mush can turn your brain into guacamole!              *
  46. *                                          *
  47. *        So here is some of that legal mush:                  *
  48. *                                          *
  49. * Permission is hereby granted to distribute this program's source          *
  50. * executable, and documentation for non-comercial purposes, so long as the    *
  51. * copyright notices are not removed from the sources, executable or          *
  52. * documentation.  This program may not be distributed for a profit without    *
  53. * the express written consent of the author Michael Sinz.              *
  54. *                                          *
  55. * This program is not in the public domain.                      *
  56. *                                          *
  57. * Fred Fish is expressly granted permission to distribute this program's      *
  58. * source and executable as part of the "Fred Fish freely redistributable      *
  59. * Amiga software library."                              *
  60. *                                          *
  61. * Permission is expressly granted for this program and it's source to be      *
  62. * distributed as part of the Amicus Amiga software disks, and the          *
  63. * First Amiga User Group's Hot Mix disks.                      *
  64. *                                          *
  65. *******************************************************************************
  66. *
  67. * The following INCLUDE files are needed to make this program assemble.
  68. * They come with the Amiga Macro-Assembler Package.
  69. *
  70.     NOLIST                    ; No need to list these
  71.     INCLUDE    "exec/types.i"
  72.     INCLUDE    "exec/libraries.i"
  73.     INCLUDE    "exec/interrupts.i"
  74.     INCLUDE    "exec/memory.i"
  75.     INCLUDE    "exec/io.i"
  76.     INCLUDE    "exec/ables.i"
  77.     INCLUDE    "libraries/dosextens.i"
  78.     INCLUDE    "devices/input.i"
  79.     INCLUDE    "devices/inputevent.i"
  80.     INCLUDE 'intuition/intuitionbase.i'
  81.     INCLUDE 'intuition/intuition.i'
  82.     INCLUDE 'clocktick_rev.i'
  83.     LIST                    ; Ok, lets start the listing
  84. *
  85. *******************************************************************************
  86. *
  87. * The following defines control some minor features:
  88. *
  89. * If DO_MKSOFT_POINTER is defined, ClockTick will also replace the busy pointer
  90. * of older MKSoft products.  This pointer is the same as used in DiskSpeed 3.1.
  91. * It will also notice busy pointers such as those in 1.2/1.3 Kickstart.  Thus,
  92. * ClockTick will even make those pointers "tick."
  93. *
  94. DO_MKSOFT_POINTER    EQU    1
  95. *
  96. *******************************************************************************
  97. *
  98. * This is the only fixed address in the system and it even "floats"...
  99. *
  100.         xref    _AbsExecBase
  101. *
  102. *******************************************************************************
  103. *
  104. * Some macros that make calling the system routines easier...
  105. *
  106. CALLSYS        MACRO
  107.         xref    _LVO\1        ; Set the external reference
  108.         CALLLIB    _LVO\1        ; Call the EXEC definied macro
  109.         ENDM
  110. *
  111. *******************************************************************************
  112. *                                          *
  113. * Register usage through this system...                          *
  114. *                                          *
  115. *    a0    - Scrap                                  *
  116. *    a1    - Scrap                                  *
  117. *    a2    - IO Block                              *
  118. *    a3    - MsgPort                              *
  119. *    a4    - Task                                  *
  120. *    a5    - New Memory                              *
  121. *    a6    - ExecBase pointer                          *
  122. *    a7    - Stack pointer...  What else?                      *
  123. *                                          *
  124. *    d0    - Scrap                                  *
  125. *    d1    - Scrap                                  *
  126. *    d2    - Scrap                                  *
  127. *    d3    - Scrap                                  *
  128. *    d4    - Scrap                                  *
  129. *    d5    - Scrap                                  *
  130. *    d6    - Scrap                                  *
  131. *    d7    - Zero...                              *
  132. *                                          *
  133. *******************************************************************************
  134. *
  135. * Now, for the start of the code...
  136. *
  137. ClockTick:    move.l    _AbsExecBase,a6        ; Get the EXEC library base
  138. *
  139.         clr.l    d7        ; Clear d7...
  140. *
  141.         move.l    d7,a1        ; Clear a1
  142.         CALLSYS    FindTask    ; Get our task pointer...
  143.         move.l    d0,a4        ; Now, move it to a1 for addressing use
  144.         lea    pr_MsgPort(a4),a3
  145.         tst.l    pr_CLI(a4)    ; Check if this is a CLI task...
  146.         bne.s    QuickCLI    ; If so, skip the next section
  147. *
  148. *******************************************************************************
  149. *
  150. * This section deals with starting from the WorkBench...
  151. * It is just here for completeness...
  152. *
  153. QuickWorkBench:    move.l    a3,a0        ; Get message port
  154.         CALLSYS    WaitPort    ; Wait for the WorkBench message...
  155.         move.l    a3,a0        ; ...it's here, so let's get it
  156.         CALLSYS    GetMsg        ; off the message port...
  157.         bra.s    QuickCont    ; ...and go to the continue routine
  158. *
  159. *******************************************************************************
  160. *
  161. * The routine was started from the CLI  (prefered)
  162. * Let's store a NULL pointer so that there is no WB message...
  163. *
  164. QuickCLI:    move.l    d7,d0        ; No reply message...
  165. *
  166. *******************************************************************************
  167. *
  168. * Continue with the Quick initialization
  169. *
  170. QuickCont:
  171.         move.l    d0,-(sp)    ; Save the message pointer...
  172. *
  173. *******************************************************************************
  174. *
  175. * Check if we are running already...
  176. *
  177.         lea    portName(PC),a1    ; Get the special port name...
  178.         CALLSYS    FindPort    ; Look for it...
  179.         tst.l    d0        ; If it is there, we are installed...
  180.         bne    abortNoInput    ; If installed, don't do it again...
  181. *
  182.         lea    InputBlock(pc),a2    ; Get the I/O block
  183.         move.b    #NT_MESSAGE,LN_TYPE(a2)    ; initialize it...
  184.         move.w    #IOSTD_SIZE,MN_LENGTH(a2)
  185.         move.l    a3,MN_REPLYPORT(a2)    ; Our reply port...
  186. *
  187.         lea    inputName(pc),a0    ; Get input.device name
  188.         move.l    d7,d0        ; Clear d0
  189.         move.l    d7,d1        ;    and d1
  190.         move.l    a2,a1
  191.         CALLSYS    OpenDevice    ; a1 is still set to the I/O block
  192.         tst.l    d0
  193.         bne    abortNoInput
  194. *
  195. *******************************************************************************
  196. *
  197. * We now allocate and copy the image...
  198. *
  199.         moveq.l    #clockSize,d0        ; Size of memory
  200.         move.l    d0,d6            ; Save it here...
  201.         moveq.l    #MEMF_CHIP,d1        ; Type of memory...
  202.         CALLSYS    AllocMem        ; Allocate it
  203.         lea    TheClockPtr(pc),a0    ; Get pointer to storage...
  204.         move.l    d0,(a0)            ; Save image pointer...
  205.         beq    NormalExit        ; No memory, no go...
  206.         move.l    d0,a1            ; Get pointer...
  207.         lea    TheClock(pc),a0        ; Original data...
  208.         subq.l    #1,d6            ; Drop by 1...
  209. CopyImageLoop:    move.b    (a0)+,(a1)+        ; Now copy it down
  210.         dbra    d6,CopyImageLoop    ; Copy all of it...
  211. *
  212. *******************************************************************************
  213. *
  214. * We now allocate and copy the handler...
  215. *
  216.         move.l    #CodeSize,d0        ; Size of memory
  217.         move.l    d0,d6            ; Save it...
  218.         moveq.l    #MEMF_PUBLIC,d1        ; Type of memory
  219.         CALLSYS    AllocMem        ; Get the memory
  220.         move.l    d0,a5            ; Save it...
  221.         tst.l    d0            ; Check it...
  222.         beq    NormalExit        ; No memory, no copy...
  223.         move.l    d0,a1            ; Destination...
  224.         lea    StartOfCode(pc),a0    ; Source
  225.         subq.l    #1,d6            ; From 0 to n-1
  226. CopyLoop:    move.b    (a0)+,(a1)+        ; Copy it...
  227.         dbra    d6,CopyLoop        ; All of it...
  228. *
  229. *******************************************************************************
  230. *
  231. * Now that the copy worked, we clear the local pointer...
  232. *
  233.         lea    TheClockPtr(pc),a0    ; Get address...
  234.         move.l    d7,(a0)            ; Clear it...
  235. *
  236. *******************************************************************************
  237. *
  238. * Ok, now we put our port name into the port list...
  239. *
  240.         lea    portOffset(a5),a0    ; Port structure address...
  241.         move.l    a0,a1            ; Save it in a1...
  242.         move.w    #MP_SIZE-1,d0        ; Size of message port...
  243. ClearPort:    move.b    d7,(a0)+        ; Clear byte...
  244.         dbra    d0,ClearPort        ; Do all of it...
  245.         move.b    d0,LN_PRI(a1)        ; Set PRI to -1...
  246.         move.b    #NT_MSGPORT,LN_TYPE(a1)    ; Set type of node...
  247.         lea    portNameOffset(a5),a0    ; Port name address...
  248.         move.l    a0,LN_NAME(a1)        ; Save pointer to name
  249.         CALLSYS    AddPort            ; Add it to the list...
  250. *
  251. *******************************************************************************
  252. *
  253. * Check to see if we are running in V37 ROM or better.  If so,
  254. * we want to call CacheClearU() to make sure we are safe on future
  255. * hardware such as the 68040.  This section of code assumes that
  256. * a6 points at ExecBase.  a0/a1/d0/d1 are trashed in CacheClearU()
  257. *
  258.         cmpi.w    #37,LIB_VERSION(a6)    ; Check if exec is >= V37
  259.         bcs.s    TooOld            ; If less than V37, too old...
  260.         CALLSYS    CacheClearU        ; Clear the cache...
  261. TooOld:
  262. *
  263. *******************************************************************************
  264. *
  265. * We also need to add our own input handler into the food chain...
  266. *
  267.         lea    HandlerOffset(a5),a0    ; Pointer to handler...
  268.         move.b    #51,LN_PRI(a0)        ; Handler priority
  269.         move.l    a5,IS_DATA(a0)        ; Handler data
  270.         addq.l    #codeOffset,a5        ; Point at code...
  271.         move.l    a5,IS_CODE(a0)        ; Set the handler code pointer
  272.         subq.l    #codeOffset,a5        ; Restore pointer...
  273.         move.l    a2,a1            ; Get i/o block
  274.         move.l    a0,IO_DATA(a1)        ; Set the data address...
  275.         move.w    #IND_ADDHANDLER,IO_COMMAND(a1)    ; the ADD command...
  276.         CALLSYS    DoIO            ; All set, handler is running
  277. *
  278. *******************************************************************************
  279. *
  280. * Now, we patch intuition.library
  281. *
  282. * We do not close intuition.library since the patch will need to stay
  283. * Also, we do not check the open of intuition.library as if it did not work,
  284. * we are in more trouble than we could ever report (since not even alert would
  285. * work since that uses intuition!)
  286. *
  287.         lea    intuitionName(pc),a1    ; We need to open
  288.         moveq.l    #0,d0            ; any version of intuition
  289.         CALLSYS    OpenLibrary        ; We assume this works...
  290.         FORBID                ; Stop task switching...
  291.         move.l    d0,IBaseOffset(a5)    ; Save IBase...
  292.         move.l    d0,a1            ; Get ready for the
  293.         lea    NewSetOffset(a5),a3    ; Pointer to new entry point
  294.         move.l    a3,d0            ; Needed for SetFunction...
  295.         XREF    _LVOSetPointer        ; We need this reference...
  296.         lea    _LVOSetPointer,a0    ; Function offset...
  297.         CALLSYS    SetFunction        ; Put me in...
  298.         subq.l    #4,a3            ; Point at old pointer...
  299.         move.l    d0,(a3)            ; Save it...
  300.         CALLSYS    Permit
  301. *
  302. *******************************************************************************
  303. *
  304. * The standard exit routines...
  305. * Close anything that we have opened...
  306. *
  307. NormalExit:
  308.         move.l    TheClockPtr(pc),d0    ; Get the first allocation...
  309.         beq.s    NoFree            ; If we don't need to free it
  310.         move.l    d0,a1            ; Pointer to the memory...
  311.         move.l    #clockSize,d0        ; Size of memory block...
  312.         CALLSYS    FreeMem            ; Free it...
  313. *
  314. NoFree:        move.l    a2,a1        ; Get I/O block...
  315.         CALLSYS    CloseDevice    ; Close the thing...
  316. abortNoInput:
  317.         move.l    (sp)+,d0    ; Get that message back
  318.         beq.s    abortNoWB    ; If none, we are done
  319.         move.l    d0,a1        ; Get the pointer ready
  320.         FORBID            ; manual says we must forbid...
  321.         CALLSYS    ReplyMsg    ; ...when returning WB message
  322. abortNoWB:
  323.         rts            ; RTS out of this task...
  324. *
  325. *******************************************************************************
  326. *
  327. * The input block...
  328. *
  329. InputBlock:    ds.b    IOSTD_SIZE
  330. *
  331. *******************************************************************************
  332. *
  333. * This is the mouse accel value...
  334. *
  335. StartOfCode:    dc.w    0        ; Clock timer count...
  336. *
  337. *******************************************************************************
  338. *
  339. * This is the handler...  It is the hardest working piece of code here...
  340. *
  341. MyHandler:    move.l    a0,-(sp)    ; We MUST save what we play with...
  342. *
  343. *******************************************************************************
  344. *
  345. * Now, for the handler loop...  We will look at every event that has been given
  346. * to us.
  347. *
  348. HandlerLoop:    cmpi.b    #IECLASS_TIMER,ie_Class(a0)    ; Check for timer
  349.         bne.s    HandlerNext            ; If skip it...
  350. *
  351. *    if IECLASS_TIMER, we move the hands by one...
  352. *
  353. *    Since we found a timer event, we do not need to check
  354. *    for more and thus we can trash all of the scrap registers...
  355. *
  356.         move.w    (a1),d0            ; Get clock word index...
  357.         addq.l    #1,d0            ; Bump by 1...
  358.         moveq.l    #15,d1            ; Mask value...
  359.         and.l    d1,d0            ; Mask it to the 0-15 range...
  360.         move.w    d0,(a1)            ; Store it...
  361.         moveq.l    #changeSize,d1        ; The amount to change...
  362.         mulu    d1,d0            ; Get offset...
  363.         move.l    TheClockPtr(pc),a1    ; Get clock image...
  364.         lea    changeOffset(a1),a1    ; Get change area
  365.         lea    Clock0(pc),a0        ; Get first clock
  366.         add.l    d0,a0            ; Point to real one...
  367.         moveq.l    #(changeSize/4)-1,d1    ; Number of long-words (-1)
  368. CopyClock:    move.l    (a0)+,(a1)+        ; Copy the words that changed
  369.         dbra    d1,CopyClock        ; in the clock...
  370.         bra.s    NoMoreEvents
  371. *
  372. * Check for next event...
  373. *
  374. HandlerNext:
  375.         move.l    ie_NextEvent(a0),d0    ; Get next event...
  376.         move.l    d0,a0
  377.         bne.s    HandlerLoop        ; Go back and do this one...
  378. NoMoreEvents:
  379.         move.l    (sp)+,d0    ; Restore our stuff...  d0=a0...
  380.         rts            ; Done with handler...
  381. *
  382. *******************************************************************************
  383. *
  384. *    SetPointer( Window, Pointer, Height, Width, XOffset, YOffset )
  385. *            A0      A1       D0      D1     D2       D3
  386. *
  387. OldSetPointer:    dc.l    0
  388. NewSetPointer:    move.l    OldSetPointer(pc),-(sp)    ; We will return to old code
  389.         movem.l    a2/a3/d0/d1/d2/d3,-(sp)    ; We need these...
  390.         move.l    a1,d0            ; If no pointer, skip...
  391.         beq.s    EndSet            ; ...
  392.         cmp.l    TheClockPtr(pc),d0    ; Check if it is "ours"
  393.         beq.s    EndSet            ; If so, we don't do this...
  394. *
  395. *******************************************************************************
  396. *
  397. * This section checks for the MKSoft ZZZ busy pointer and replaces it too.
  398. * (That pointer is available in the Diskspeed 3.1 source)
  399. *
  400.     IFD    DO_MKSOFT_POINTER
  401.         lea    changeOffset(a1),a2    ; Point at the changes area
  402.         lea    OldZZZ(pc),a3        ; Point at old image
  403.         moveq.l    #(changeSize/4)-1,d1    ; Number of long-words (-1)
  404. ZZZCheckLoop:    move.l    (a2)+,d0        ; Get real value...
  405.         sub.l    (a3)+,d0        ; Subtract expected value...
  406.         dbne    d1,ZZZCheckLoop        ; Check some more...
  407.         beq.s    ReplaceImage        ; If not same, we bail...
  408. *
  409. * Now check for old workbench ZZZ cloud...
  410. *
  411.         lea    changeOffset(a1),a2    ; Point at the changes area
  412.         lea    WB_ZZZ(pc),a3        ; Point at old image
  413.         moveq.l    #(changeSize/4)-1,d1    ; Number of long-words (-1)
  414. WB_CheckLoop:    move.l    (a2)+,d0        ; Get real value...
  415.         sub.l    (a3)+,d0        ; Subtract expected value...
  416.         dbne    d1,WB_CheckLoop        ; Check some more...
  417.         beq.s    ReplaceImage        ; If not same, we bail...
  418.     ENDC
  419. *
  420. *******************************************************************************
  421. *
  422. * Now, check the area where the hands are and see if it is the same as
  423. * our pointer.  We do not check the whole pointer since we do not have
  424. * one available.  This should be enough of a check anyway.
  425. *
  426.         lea    changeOffset(a1),a2    ; Point at the changes area
  427.         lea    Clock0(pc),a3        ; Point at our version
  428.         moveq.l    #(changeSize/4)-1,d1    ; Number of long-words (-1)
  429. CheckLoop:    move.l    (a2)+,d0        ; Get real value...
  430.         sub.l    (a3)+,d0        ; Subtract expected value...
  431.         dbne    d1,CheckLoop        ; Check some more...
  432.         bne.s    EndSet            ; If not same, we bail...
  433. *
  434. * We found a clock that looks like ours...
  435. * So, we now change the SetPointer() parameters to match our
  436. * pointer parameters and call the "real" SetPointer()
  437. *
  438. ReplaceImage:    move.l    TheClockPtr(pc),a1    ; Get our replacement...
  439.         moveq.l    #16,d0            ; Set our height
  440.         move.l    d0,d1            ; and width
  441.         moveq.l    #-6,d2            ; and XOffset
  442.         moveq.l    #0,d3            ; and YOffset
  443.         move.l    OldSetPointer(pc),a2    ; Get address...
  444.         jsr    (a2)            ; Call it...
  445. *
  446. * This is a nasty trick:  We just did the SetPointer() with our values
  447. * and do not want to do it again.  Since the address we will RTS to
  448. * is that of the old code, we will change the address on the stack to
  449. * point at our RTS instruction and thus make it a NOP.
  450. *
  451.         lea    EndSetRTS(pc),a2    ; Get blank RTS...
  452.         move.l    a2,6*4(sp)        ; Change the return address...
  453. *
  454. * Now restore back to the caller's registers and get out...
  455. *
  456. EndSet:        movem.l    (sp)+,a2/a3/d0/d1/d2/d3    ; Restore data...
  457. EndSetRTS:    rts                ; Return to old code...
  458. *
  459. *******************************************************************************
  460. *
  461. * Pointer to the CHIP memory clock image
  462. *
  463. TheClockPtr:    dc.l    0        ; Pointer to clock image...
  464. IBase:        dc.l    0        ; IBase pointer...
  465. *
  466. *******************************************************************************
  467. *
  468. * These are the clock images.  Clock0 is the one used to compare with
  469. * the given clock...  (Clock numbers 0 to 15)
  470. *
  471. Clock0:    dc.l    $1FF03FEC,$3FF87FDE,$3FF87FBE,$7FFCFF7F,$7EFCFFFF,$7FFCFFFF,$3FF87FFE,$3FF87FFE,$1FF03FFC
  472. Clock1:    dc.l    $1FF03FFC,$3FF87FFE,$3FF87FE6,$7FFCFF9F,$7EFCFF7F,$7FFCFFFF,$3FF87FFE,$3FF87FFE,$1FF03FFC
  473.     dc.l    $1FF03FFC,$3FF87FFE,$3FF87FFE,$7FFCFFFF,$7EFCFF07,$7FFCFFFF,$3FF87FFE,$3FF87FFE,$1FF03FFC
  474.     dc.l    $1FF03FFC,$3FF87FFE,$3FF87FFE,$7FFCFFFF,$7EFCFF7F,$7FFCFF9F,$3FF87FE6,$3FF87FFE,$1FF03FFC
  475.     dc.l    $1FF03FFC,$3FF87FFE,$3FF87FFE,$7FFCFFFF,$7EFCFFFF,$7FFCFF7F,$3FF87FBE,$3FF87FDE,$1FF03FEC
  476.     dc.l    $1FF03FFC,$3FF87FFE,$3FF87FFE,$7FFCFFFF,$7EFCFFFF,$7FFCFF7F,$3FF87F7E,$3FF87FBE,$1FF03FBC
  477.     dc.l    $1FF03FFC,$3FF87FFE,$3FF87FFE,$7FFCFFFF,$7EFCFFFF,$7FFCFEFF,$3FF87EFE,$3FF87EFE,$1FF03EFC
  478.     dc.l    $1FF03FFC,$3FF87FFE,$3FF87FFE,$7FFCFFFF,$7EFCFFFF,$7FFCFDFF,$3FF87DFE,$3FF87BFE,$1FF03BFC
  479.     dc.l    $1FF03FFC,$3FF87FFE,$3FF87FFE,$7FFCFFFF,$7EFCFFFF,$7FFCFDFF,$3FF87BFE,$3FF877FE,$1FF02FFC
  480.     dc.l    $1FF03FFC,$3FF87FFE,$3FF87FFE,$7FFCFFFF,$7EFCFDFF,$7FFCF3FF,$3FF84FFE,$3FF87FFE,$1FF03FFC
  481.     dc.l    $1FF03FFC,$3FF87FFE,$3FF87FFE,$7FFCFFFF,$7EFCC1FF,$7FFCFFFF,$3FF87FFE,$3FF87FFE,$1FF03FFC
  482.     dc.l    $1FF03FFC,$3FF87FFE,$3FF84FFE,$7FFCF3FF,$7EFCFDFF,$7FFCFFFF,$3FF87FFE,$3FF87FFE,$1FF03FFC
  483.     dc.l    $1FF02FFC,$3FF877FE,$3FF87BFE,$7FFCFDFF,$7EFCFFFF,$7FFCFFFF,$3FF87FFE,$3FF87FFE,$1FF03FFC
  484.     dc.l    $1FF03BFC,$3FF87BFE,$3FF87DFE,$7FFCFDFF,$7EFCFFFF,$7FFCFFFF,$3FF87FFE,$3FF87FFE,$1FF03FFC
  485.     dc.l    $1FF03EFC,$3FF87EFE,$3FF87EFE,$7FFCFEFF,$7EFCFFFF,$7FFCFFFF,$3FF87FFE,$3FF87FFE,$1FF03FFC
  486.     dc.l    $1FF03FBC,$3FF87FBE,$3FF87F7E,$7FFCFF7F,$7EFCFFFF,$7FFCFFFF,$3FF87FFE,$3FF87FFE,$1FF03FFC
  487. *
  488. *******************************************************************************
  489. *
  490. * This is the section of the pointer that needs to match the MKSoft pointer
  491. *
  492.     IFD    DO_MKSOFT_POINTER
  493. OldZZZ:    dc.l    $FBFCFFFC,$70FC7FFC,$7FFE7FFE,$7F0E7FFE,$3FDF3FFF,$7FBE7FFE,$3F0E3FFE,$1FFC1FFC,$07F807F8
  494. WB_ZZZ:    dc.l    $7BF87FF8,$F7F8FFF8,$61FC7FFC,$7F0C7FFC,$3FDE3FFE,$7FBC7FFC,$3F0C3FFC,$1FF81FF8,$07F007F0
  495.     ENDC
  496. *
  497. *******************************************************************************
  498. *
  499. HandlerInfo:    ds.b    IS_SIZE        ; The handler structure...
  500. *
  501. portStruct    ds.b    MP_SIZE        ; The message port structure...
  502. *
  503. portName    dc.b    'MKSoft ClockTick Installed',0
  504. *
  505. EndOfCode:
  506. *
  507. *******************************************************************************
  508. *
  509. * This is the clock image that will be used to replace clocks from the
  510. * SetPointer call...
  511. *
  512.         ds.w    0
  513. TheClock:    dc.l    0,$040007C0,$000007C0,$01000380,$000007E0,$07C01FF8
  514. ChangeArea:    dc.l    $1FF03FEC,$3FF87FDE,$3FF87FBE,$7FFCFF7F,$7EFCFFFF,$7FFCFFFF,$3FF87FFE,$3FF87FFE,$1FF03FFC
  515. ClockBottom:    dc.l    $07C01FF8,$000007E0,0
  516. TheClockEnd:
  517. *
  518. *******************************************************************************
  519. *
  520. * The data section...
  521. *
  522. inputName    dc.b    'input.device',0
  523. intuitionName    dc.b    'intuition.library',0
  524.         VERSTAG
  525. *
  526. *******************************************************************************
  527. *
  528. * Now some offset type symbols...
  529. *
  530. CodeSize    EQU    EndOfCode-StartOfCode
  531. HandlerOffset    EQU    HandlerInfo-StartOfCode
  532. portOffset    EQU    portStruct-StartOfCode
  533. portNameOffset    EQU    portName-StartOfCode
  534. NewSetOffset    EQU    NewSetPointer-StartOfCode
  535. changeSize    EQU    Clock1-Clock0
  536. changeOffset    EQU    ChangeArea-TheClock
  537. codeOffset    EQU    MyHandler-StartOfCode
  538. IBaseOffset    EQU    IBase-StartOfCode
  539. clockSize    EQU    TheClockEnd-TheClock
  540. *
  541. *******************************************************************************
  542. *
  543. * "A master's secrets are only as good as the
  544. *  master's ability to explain them to others."  -  Michael Sinz
  545. *
  546. *******************************************************************************
  547. *
  548. * And, with that we come to the end of another full-length feature staring
  549. * that wonderful MC680x0 and the Amiga system.  Join us again next time
  550. * for more Wonderful World of Amiga...
  551. *
  552.         end
  553.