home *** CD-ROM | disk | FTP | other *** search
/ No Fragments Archive 10: Diskmags / nf_archive_10.iso / MAGS / INC_MAG / INC_2_5.MSA / PRG / CACHE / CACHE.S next >
Text File  |  1987-09-15  |  4KB  |  182 lines

  1. *************************************************************************
  2. *                                    *
  3. *    PROGRAM                                *
  4. *        cache        Provide disk sector caching for TOS    *
  5. *                                    *
  6. *                                    *
  7. *                                    *
  8. *    This program works by catching the TRAP #13 (BIOS) interrupt,    *
  9. *    and checking to see if the call is RWABS.  If it is, then the    *
  10. *    call is handled locally.  If not, then we just pass the call    *
  11. *    on through...                            *
  12. *                                    *
  13. *    This program links with CCACHE.O and CLIB.O            *
  14. *                                    *
  15. *************************************************************************
  16. *                                    *
  17. *    Copyright 1987, Charles McGuinness.  Distribution beyond    *
  18. *    the CompuServe Information Service prohibited.            *
  19. *                                    *
  20. *************************************************************************
  21.  
  22.     .xdef    rwabs        * Routine to call to get a real RWABS
  23.  
  24.     .xref    myrwabs
  25.     .xref    dchange
  26.     .xref    xrwflag
  27.     .xref    xnumber
  28.     .xref    xrecno
  29.     .xref    xdev
  30.     .xref    xbuffer
  31.     .xref    xchar
  32.     .xref    lru_startup
  33.     
  34. start:    move.l    #banner,-(sp)
  35.     move    #9,-(sp)
  36.     trap    #1
  37.     addq.l    #6,sp
  38.  
  39.     move.l    #-1,-(sp)
  40.     move.w    #32+13,-(sp)
  41.     move.w    #5,-(sp)    
  42.     trap    #13
  43.     move.l    d0,oldvector
  44.     addq.l    #8,sp
  45.  
  46.     move.l    #trap13,-(sp)
  47.     move.w    #32+13,-(sp)
  48.     move.w    #5,-(sp)    
  49.     trap    #13
  50.     addq.l    #8,sp
  51.  
  52.  
  53.     move.l    #$ffffff,d0
  54. wait:
  55.     sub    #1,d0
  56.     bne    wait
  57.  
  58.     move.w    #0,-(sp)    * No error
  59.     jsr    lru_startup    * Get size of buffers
  60.     add.l    #$1000,d0    * + 4k (THIS IS GENEROUS)
  61.     move.l    d0,-(sp)    * Total size of .S + .C ...
  62.     move.w    #$31,-(sp)    * TSR
  63.     trap    #1
  64.  
  65.  
  66.  
  67. rwabs:
  68.     move.w    xdev,-(sp)
  69.     move.w    xrecno,-(sp)
  70.     move.w    xnumber,-(sp)
  71.     move.l    xbuffer,-(sp)
  72.     move.w    xrwflag,-(sp)
  73.     move.w    #32,-(sp)        * This gets changed to 4 below
  74.     trap    #13
  75.     add.l    #14,sp
  76.     rts
  77.  
  78. saveret:    .ds.l    1
  79. oldvector:    .ds.l    1
  80.  
  81. *************************************************************************
  82. *                                    *
  83. *    Vector for TRAP #13 intercept code....                *
  84. *                                    *
  85. *************************************************************************
  86.  
  87. *    Step 1: We want to get A0 pointing to the base of the arguments
  88. *        to the BIOS function.  This involves figuring out which
  89. *        stack pointer points to the arguments (since we are now
  90. *        in supervisor mode but the TRAP could have been done in
  91. *        user mode), and then adjusting the correct stack pointer
  92. *        to point to the arguments.
  93.  
  94. trap13:
  95.     move.w    (sp),d0
  96.     btst    #13,d0        * Were we in Super mode?
  97.     bne    super
  98.  
  99.     move.l    usp,a0
  100.     bra    next
  101.  
  102. super:
  103.     move.l    sp,a0
  104.     addq.l    #6,a0        * Get past SR, pushed PC
  105.  
  106. *
  107. *    Step 2:    See if this was a RWABS..
  108. *
  109.     
  110. next:
  111.     move.w    0(a0),d0
  112.     cmpi.w    #4,d0        * Is this a RWABS?
  113.     bne    trapend        * Nope, we're done...
  114.  
  115. *
  116. *    Step 3:    If there's been a media change, call the LRU routine
  117. *        that will flush the cache and perform the rwabs
  118.  
  119.     move.l    a0,-(sp)    * Save the stack frame...
  120.     move.w    10(a0),-(sp)    * Copy the device...
  121.     move.w    #9,-(sp)    * meadiach ...
  122.     trap    #13        * OK, so this IS recursive...
  123.     addq.l    #4,sp
  124.     move.l    (sp)+,a0    * get the stack frame back
  125.  
  126.     cmpi.l    #2,d0        * Did the media change???
  127.     beq    xdchange    * Yes, flush the buffers
  128.  
  129. *
  130. *    Step 4:    Call our routine to fetch from cache, if we can
  131. *
  132.  
  133.     move.w    12(a0),xdev
  134.     move.w    10(a0),xrecno
  135.     move.w    8(a0),xnumber
  136.     move.l    4(a0),xbuffer
  137.     move.w    2(a0),xrwflag
  138.  
  139.     jsr    myrwabs
  140.  
  141.     rte            * We're done....
  142.  
  143.  
  144. *
  145. *    Step 4b: The disk has changed ... oops!
  146. *
  147.  
  148. xdchange:
  149.  
  150.     move.w    12(a0),xdev
  151.     move.w    10(a0),xrecno
  152.     move.w    8(a0),xnumber
  153.     move.l    4(a0),xbuffer
  154.     move.w    2(a0),xrwflag
  155.  
  156.     jsr    dchange
  157.  
  158.     rte            * We're done....
  159.  
  160. *
  161. *    TRAPEND:    If the BIOS call was 32 (which is undefined),
  162. *            it really is a 4 (rwabs), but wants to bypass
  163. *            the cache...
  164.  
  165. trapend:
  166.     cmpi.w    #32,d0        * Unfiltered RWABS
  167.     bne    notmine
  168.     move.w    #4,0(a0)    * Modify the arguments on the stack
  169.  
  170. notmine:
  171.     move.l    oldvector,a0
  172.     jmp    (a0)
  173.  
  174. banner:    .dc.b    "Disk Caching System, Version 0.0",$0d,$0a
  175.     .dc.b    "Copyright 1987, Charles McGuinness.  All rights reserved"
  176.     .dc.b    13,10
  177.     .dc.b    "Support of this program can be found in "
  178.     .dc.b    "the Atari ST forums on CompuServe",13,10
  179.     .dc.b    0
  180.     .end
  181.  
  182.