home *** CD-ROM | disk | FTP | other *** search
/ Computer Club Elmshorn Atari PD / CCE_PD.iso / mac / 1000 / CCE_1044.ZIP / CCE_1044 / XUFSL105.LZH / xufsl.105 / cookie / cookie.s < prev   
Text File  |  1991-08-15  |  8KB  |  378 lines

  1.  
  2. ;--------------------------------------------------------------------
  3. ;    Module:        COOKIE.S
  4. ;
  5. ;    Abstract:    Everything you need for accessing the 
  6. ;                cookie jar on Atari ST/TT computers.
  7. ;
  8. ;    Author:        Arnd Beissner, SciLab GmbH - Germany
  9. ;                Parts of the code are derived from Atari's 
  10. ;                TOS 1.06 Release Notes.
  11. ;
  12. ;    Copyright:    COOKIE.S is in the public domain.
  13. ;
  14. ;    Compatibility:
  15. ;                Any ST/TT-compatible machine, any TOS version.
  16. ;
  17. ;    Language:    MAS68K by Borland
  18. ;
  19. ;    Version:    1.03
  20. ;
  21. ;    Date:        15.08.1991
  22. ;    
  23. ;    History:
  24. ;
  25. ;    05.01.1991    AB    - fixed a bug in CK_ReadJar
  26. ;
  27. ;    23.06.1991  AB  - added a copyright notice in the header
  28. ;
  29. ;    15.08.1991  AB  - Fixed an ugly bug in CK_ResizeJar. The bug
  30. ;                      was most disastrous when no cookie jar was
  31. ;                      present at all.
  32. ;
  33. ;--------------------------------------------------------------------
  34. ;    Comments:
  35. ;
  36. ;    Most functions in this module must be called in supervisor mode.
  37. ;    No registers except D0 (for the return value) are modified.
  38. ;--------------------------------------------------------------------
  39.  
  40. RESMAGIC        equ     $31415926
  41.  
  42. _p_cookies        equ        $5A0
  43. _resvalid       equ     $426
  44. _resvector      equ     $42a
  45.  
  46. ;--------------------------------------------------------------------
  47.  
  48.         .globl    CK_JarInstalled
  49.         .globl    CK_UsedEntries
  50.         .globl    CK_JarSize
  51.         .globl    CK_ResizeJar
  52.         .globl    CK_ReadJar
  53.         .globl    CK_WriteJar
  54.         .globl    CK_SetOptions
  55.         
  56.         .text
  57.  
  58. ;--------------------------------------------------------------------
  59. ; CK_JarInstalled
  60. ;
  61. ; See if the cookie jar is installed.
  62. ;
  63. ; Return value:
  64. ;        D0.L    = pointer to the cookie jar (0 = not installed)
  65. ;--------------------------------------------------------------------
  66.  
  67. CK_JarInstalled:
  68.         move.l    _p_cookies,d0
  69.         rts    
  70.  
  71.  
  72. ;--------------------------------------------------------------------
  73. ; CK_UsedEntries
  74. ;
  75. ; Inquire the number of used cookie jar entries. The number includes
  76. ; the null cookie, so a return value of 0 means that there is no
  77. ; cookie jar at all.
  78. ;
  79. ; Return value:
  80. ;        D0.W = number of used cookie jar entries
  81. ;--------------------------------------------------------------------
  82.  
  83. CK_UsedEntries:
  84.         move.l    a0,-(sp)
  85.         move.l    _p_cookies,d0
  86.         beq        _ue_end
  87.         
  88.         move.l    d0,a0
  89.         clr.w    d0
  90. _ue_loop:
  91.         addq.w    #1,d0
  92.         tst.l    (a0)
  93.         beq        _ue_end
  94.         addq.l    #8,a0
  95.         bra        _ue_loop
  96. _ue_end:
  97.         move.l    (sp)+,a0
  98.         rts
  99.  
  100.         
  101. ;--------------------------------------------------------------------
  102. ; CK_JarSize
  103. ;
  104. ; Inquire the total number of cookie jar entries.
  105. ;
  106. ; Return value:
  107. ;        D0.W = total number of cookie jar entries
  108. ;--------------------------------------------------------------------
  109.  
  110. CK_JarSize:
  111.         move.l    a0,-(sp)
  112.         move.l    _p_cookies,d0
  113.         beq        _js_end
  114.         
  115.         move.l    d0,a0
  116. _js_loop:
  117.         tst.l    (a0)
  118.         beq        _js_found
  119.         addq.l    #8,a0
  120.         bra        _js_loop
  121.         
  122. _js_found:
  123.         move.l    4(a0),d0
  124. _js_end:
  125.         move.l    (sp)+,a0
  126.         rts
  127.         
  128.  
  129. ;--------------------------------------------------------------------
  130. ; CK_ResizeJar
  131. ;
  132. ; Resize the cookie jar to the desired size.
  133. ;
  134. ; Input arguments:
  135. ;        D0.W    = desired cookie jar size, number of entries
  136. ;
  137. ; Return value:
  138. ;        D0.W    = state (0=FALSE, 1=TRUE)
  139. ;--------------------------------------------------------------------
  140.  
  141. CK_ResizeJar:
  142.         movem.l    d1-a6,-(sp)
  143.         
  144.         ; allocate a buffer for the new cookie jar
  145.         andi.l    #$FFFF,d0
  146.         move.l    d0,d7
  147.         lsl.w    #3,d0                ; 8 bytes per entry
  148.         move.l    d0,-(sp)
  149.         move.w    #$48,-(sp)            ; Malloc
  150.         trap    #1
  151.         addq.l    #6,sp
  152.         tst.l    d0                    ; allocation successful?
  153.         beq        _rj_end
  154.         bpl        _rj_allocok
  155.         clr.w    d0
  156.         bra        _rj_end
  157.         
  158. _rj_allocok:
  159.         ; copy the contents of the old cookie jar to the new buffer
  160.         move.l    d0,a2
  161.         move.l    d0,a0
  162.         move.l    _p_cookies,a1
  163.         bsr        CK_UsedEntries
  164.         bra        _rj_cpend
  165. _rj_copy:
  166.         move.l    (a1)+,(a0)+
  167.         move.l    (a1)+,(a0)+
  168. _rj_cpend:
  169.         dbf        d0,_rj_copy                
  170.         
  171.         ; insert the null cookie
  172.         clr.l    (a0)+                ; null cookie
  173.         move.l    d7,(a0)                ; cookie jar size
  174.         
  175.         ; install the pointer to the new cookie jar
  176.         move.l    a2,_p_cookies
  177.         
  178.         move.w    #1,d0                ; success
  179.         
  180. _rj_end:
  181.         movem.l    (sp)+,d1-a6
  182.         rts
  183.  
  184.  
  185. ;--------------------------------------------------------------------
  186. ; _instReset            **** internal ****
  187. ;
  188. ; Install a reset handler which clears the cookie jar on reboot.
  189. ; This is necessary for TOS versions before 1.06
  190. ;--------------------------------------------------------------------
  191.  
  192. _instReset:
  193.         move.l    cookieJarXBRA,xbraId
  194.          move.l    _resvalid,oldResValid
  195.          move.l    #RESMAGIC,_resvalid
  196.         move.l    _resvector,oldReset
  197.          move.l    #newReset,_resvector
  198.          rts
  199.  
  200.          dc.b    "XBRA"
  201. xbraId:    dc.b    "ck01"               ; XBRA-structure
  202. oldReset:
  203.          dc.l    0
  204. newReset:
  205.          clr.l    _p_cookies            ; clear the cookie jar
  206.          move.l    oldReset,_resvector
  207.          move.l    oldResValid,_resvalid
  208.          jmp        (a6)
  209.  
  210.  
  211. ;--------------------------------------------------------------------
  212. ; _searchJar            **** internal ****
  213. ;
  214. ; search the position of the specified cookie
  215. ;
  216. ; Input arguments:
  217. ;        D0.L    = cookie name
  218. ;
  219. ; Return value:
  220. ;        D0.L    = pointer to cookie
  221. ;--------------------------------------------------------------------
  222.  
  223. _searchJar:
  224.         movem.l    d2/a0,-(sp)
  225.         move.l    d0,d2
  226.         move.l    _p_cookies,d0
  227.         beq        _search_end
  228.         
  229.         move.l    d0,a0
  230.         clr.l    d0
  231. _search_next:
  232.         tst.l    (a0)            ; null cookie?
  233.         beq        _search_end
  234.         cmp.l    (a0),d2            ; cookie found?
  235.         beq        _search_found
  236.         addq.l    #8,a0
  237.         bra        _search_next
  238.         
  239. _search_found:
  240.         move.l    a0,d0        
  241.  
  242. _search_end:
  243.         movem.l    (sp)+,d2/a0
  244.         rts
  245.  
  246.  
  247. ;--------------------------------------------------------------------
  248. ; CK_ReadJar
  249. ;
  250. ; Read the value of the specified cookie.
  251. ;
  252. ; Input arguments:
  253. ;        D0.L    = cookie name
  254. ;        A0        = pointer to cookie value
  255. ;
  256. ; Return value:
  257. ;        D0.W    = state (0=FALSE, 1=TRUE)
  258. ;--------------------------------------------------------------------
  259.  
  260. CK_ReadJar:
  261.         move.l    a1,-(sp)
  262.         bsr        _searchJar            ; get a pointer to the jar entry
  263.         tst.l    d0
  264.         beq        _ck_rdend            ; entry not found
  265.         move.l    d0,a1
  266.         move.l    4(a1),(a0)            ; read the cookie value
  267.         move.w    #1,d0                ; success!    
  268.  
  269. _ck_rdend:
  270.         move.l    (sp)+,a1
  271.         rts
  272.         
  273.  
  274. ;--------------------------------------------------------------------
  275. ; CK_WriteJar
  276. ;
  277. ; Insert a new entry into the cookie jar. If no cookie jar exists
  278. ; or the current cookie jar is full, a new, bigger cookie jar is
  279. ; installed. The increment in size can be set using CK_SetOptions.
  280. ;
  281. ; Input arguments:
  282. ;        D0.L    = cookie name
  283. ;        D1.L    = cookie value
  284. ;
  285. ; Return value:
  286. ;        D0.W    = state (0=FALSE, 1=TRUE)
  287. ;--------------------------------------------------------------------
  288.  
  289. CK_WriteJar:
  290.         movem.l    d2-d3/a0,-(sp)
  291.         
  292.         move.l    d0,d2
  293.         bsr        _searchJar
  294.         tst.l    d0
  295.         bne        _ck_we_found
  296.         
  297.         ; cookie not found --> allocate one
  298.         bsr        CK_JarSize
  299.         move.w    d0,d3
  300.         bsr        CK_UsedEntries
  301.         sub.w    d0,d3
  302.         bgt        _ck_we_write
  303.         
  304.         ; no space for more cookies --> allocate a new cookie jar
  305.         ; before that, install a reset function which resets the
  306.         ; cookie jar on reboot. This is only necessary if no cookie
  307.         ; jar exists.
  308.         tst.l    _p_cookies
  309.         bne        _ck_we_inc
  310.         bsr        _instReset
  311.         
  312. _ck_we_inc:        
  313.         add.w    cookieJarIncrement,d0
  314.         bsr        CK_ResizeJar
  315.         tst.w    d0
  316.         beq        _ck_we_end                        ; allocation failed
  317.         bsr        CK_UsedEntries
  318.  
  319.         ; write the cookie to location d0-1
  320. _ck_we_write:
  321.         subq.w    #1,d0
  322.         lsl.w    #3,d0
  323.         move.l    _p_cookies,a0
  324.         add.w    d0,a0
  325.         clr.l    8(a0)
  326.         move.l    4(a0),12(a0)
  327.         move.l    d2,(a0)
  328.         move.l    d1,4(a0)
  329.         bra        _ck_we_ok
  330.         
  331. _ck_we_found:
  332.         ; cookie found --> overwrite with new value
  333.         move.l    d0,a0
  334.         move.l    d1,4(a0)
  335.  
  336. _ck_we_ok:
  337.         move.w    #1,d0        
  338.     
  339. _ck_we_end:
  340.         movem.l    (sp)+,d2-d3/a0
  341.         rts
  342.  
  343.  
  344. ;--------------------------------------------------------------------
  345. ; CK_SetOptions
  346. ;
  347. ; Set cookie jar options.
  348. ;
  349. ; Input arguments:
  350. ;        D0.W    = cookie jar increment when allocating a new buffer
  351. ;        D1.L    = xbra id for reset handler
  352. ;--------------------------------------------------------------------
  353.  
  354. CK_SetOptions:
  355.         move.w    d0,cookieJarIncrement
  356.         move.l    d1,cookieJarXBRA
  357.         rts
  358.  
  359. ;--------------------------------------------------------------------
  360.  
  361.         .data
  362.         
  363. cookieJarIncrement:
  364.         dc.w    20
  365.  
  366. cookieJarXBRA:
  367.         dc.b    'ck01'
  368.  
  369. ;--------------------------------------------------------------------
  370.  
  371.         .bss
  372.  
  373. oldResValid:
  374.         ds.l    1
  375.                 
  376.         .end
  377.  
  378.