home *** CD-ROM | disk | FTP | other *** search
/ Club Amiga de Montreal - CAM / CAM_CD_1.iso / files / 465.lha / Utils / cookie / cookie.a < prev    next >
Text File  |  1991-01-05  |  5KB  |  229 lines

  1. ;********************************************************************
  2. ;
  3. ; cookie
  4. ;
  5. ; (C) Stuart Mitchell - 11/11/90
  6. ;
  7. ;********************************************************************
  8.  
  9.         section cookie,code
  10.  
  11.         opt o+
  12.  
  13.         incdir    include:
  14.  
  15.         include exec/types.i
  16.         include exec/memory.i
  17.         include libraries/dos.i
  18.         include libraries/arpbase.i
  19.         include libraries/dosextens.i
  20.  
  21. _LVOOpenLibrary equ    -$228
  22. _LVOCloseLibrary equ    -$19e
  23.  
  24. BUFFER        equ    256
  25. COOKIE        equ    1024        ; size of buffer to store cookie
  26. SEPERATOR    equ    $0c        ; char that seperates fortunes
  27.  
  28. ; register defns. - NB don't change address-->data or vice versa
  29.  
  30. r_jar        equr    a2
  31. r_buffer    equr    a3
  32. r_dest        equr    a4
  33. r_arpbase    equr    a6    ; this must be a6
  34.  
  35. r_cookies_fh    equr    d4
  36. r_ptrs_fh    equr    d5
  37. r_current_char    equr    d6
  38. r_num_read    equr    d7
  39.  
  40. CALL        macro
  41.         jsr    _LVO\1(a6)
  42.         endm
  43.  
  44. ;********************************************************************
  45.  
  46. start:          lea    arplib(pc),a1
  47.         moveq.l    #0,d0
  48.         move.l    4.w,a6
  49.         CALL    OpenLibrary
  50.         tst.l    d0
  51.         beq    to_dos
  52.         move.l    d0,r_arpbase
  53.  
  54. ; allocate memory (MEMF_PUBLIC|MEMF_CLEAR) for cookie & file buffer
  55.  
  56.         move.l    #BUFFER+COOKIE,d0
  57.         CALL    ArpAlloc
  58.         tst.l    d0
  59.         beq    closearp
  60.  
  61. cont:        move.l    d0,r_jar        ; save address of cookie jar
  62.         lea    COOKIE(r_jar),r_buffer  ; address of read buffer
  63.  
  64. ; open cookie/pointers file
  65.  
  66.         move.l    #file,d1
  67.         move.l    #MODE_OLDFILE,d2
  68.         CALL    ArpOpen         ; open cookies
  69.         move.l    d0,r_cookies_fh        ; sets zero flag if zero
  70.         beq.s    error
  71.         move.l    #ptrs,d1
  72.         CALL    ArpOpen         ; open pointers
  73.         move.l    d0,r_ptrs_fh
  74.         bne.s    setseed         ; ok ... so continue
  75.  
  76. ; if error then print msg
  77.  
  78. error:        lea    no_cookies(pc),a1
  79.         CALL    Puts
  80.         bra.s    closearp
  81.  
  82. ; main loop proggy
  83.  
  84. setseed:    move.l    r_buffer,d1        ; move start of buffer
  85.         CALL    DateStamp
  86.  
  87. ;set random seed based on ticks value from DateStamp
  88.  
  89.         move.l    ds_Tick(r_buffer),d0
  90.         bsr    RandomSeed
  91.  
  92. ; get position in file
  93.  
  94. getpos:     moveq.l    #0,d2
  95.         move.l    r_ptrs_fh,d1
  96.         moveq.l #OFFSET_BEGINNING,d3
  97.         CALL    Seek            ; move to start pointers
  98.  
  99. ; get number of cookies
  100.  
  101.         bsr.s    readptr
  102.  
  103. ; generate random number in range 0..(number cookies -1)
  104.  
  105.         move.l    (r_buffer),d0
  106.         bsr    Random            ; get number 0..number cookies
  107.  
  108.         asl.l    #2,d0            ; times 4
  109.         move.l    d0,d2
  110.         move.l    r_ptrs_fh,d1
  111.         moveq.l #OFFSET_CURRENT,d3
  112.         CALL    Seek            ; move to cookie pointer
  113.         bmi.s    getpos
  114.  
  115.         bsr.s    readptr
  116.         move.l    (r_buffer),d2           ; save cookie position
  117.  
  118. ; seek to position in cookie file
  119.  
  120.         move.l    r_cookies_fh,d1        ; get cookie file handle
  121.         moveq.l #OFFSET_BEGINNING,d3
  122.         CALL    Seek
  123.         bmi.s    getpos            ; if negative repeat
  124.  
  125. ; copy fortune into buffer
  126.  
  127.         moveq.l    #0,r_current_char
  128.         moveq.l    #0,r_num_read
  129.         move.l    r_jar,r_dest        ; a4 = destination char
  130.  
  131. copy_fort:    bsr.s    getchar
  132.         beq.s    out            ; if EOF then print
  133.         move.b    d0,(r_dest)+
  134.         cmpi.b    #SEPERATOR,d0
  135.         bne.s    copy_fort
  136.  
  137. out:        clr.b    -1(r_dest)              ; null terminate string
  138.  
  139. ; write contents of cookie jar
  140.  
  141.         move.l    r_jar,a1
  142.         CALL    Puts
  143.  
  144. ; Arp automatically frees memory & closes files
  145.  
  146. closearp:    move.l    r_arpbase,a1
  147.         move.l    4.w,a6
  148.         CALL    CloseLibrary
  149.  
  150. to_dos:     moveq.l    #0,d0
  151.         rts
  152.  
  153. ; read 4 bytes from file, used to get number of cookies/cookie locations
  154.  
  155. readptr:    move.l    r_ptrs_fh,d1
  156.         moveq.l #4,d3
  157.         move.l    r_buffer,d2
  158.         jmp    _LVORead(a6)            ; read 4 bytes
  159.  
  160. ; get character from file, refill buffer if required
  161.  
  162. getchar:    cmp.l    r_current_char,r_num_read
  163.         bne.s    retchar
  164.         move.l    r_cookies_fh,d1
  165.         move.l    r_buffer,d2
  166.         move.l    #BUFFER,d3
  167.         CALL    Read
  168.         move.l    d0,r_num_read
  169.         beq.s    oh_no            ; read failed!
  170.         moveq.l #0,r_current_char
  171. retchar:    move.b    (r_buffer,r_current_char),d0
  172.         addq.l    #1,r_current_char
  173. oh_no:        rts
  174.  
  175. ; random number functions
  176.  
  177. ; The following code was taken from a public domain program. However I
  178. ;have since forgetton the name of the author. I apologise to him/her but
  179. ;do acknowledge their authorship.
  180.  
  181. RandomSeed    add.l    d0,d1        user seed in d0 (d1 too)
  182.         movem.l d0/d1,rnd
  183.  
  184. LongRnd     movem.l d2-d3,-(sp)
  185.         movem.l rnd,d0/d1    d0=LSB's, d1=MSB's of random number
  186.         andi.b    #$0e,d0     ensure upper 59 bits are an...
  187.         ori.b    #$20,d0     ...odd binary number
  188.         move.l    d0,d2
  189.         move.l    d1,d3
  190.         add.l    d2,d2        accounts for 1 of 17 left shifts
  191.         addx.l    d3,d3        [d2/d3] = rnd*2
  192.         add.l    d2,d0
  193.         addx.l    d3,d1        [d0/d1] = rnd*3
  194.         swap    d3        shift [d2/d3] additional 16 times
  195.         swap    d2
  196.         move.w    d2,d3
  197.         clr.w    d2
  198.         add.l    d2,d0        add to [d0/d1]
  199.         addx.l    d3,d1
  200.         movem.l d0/d1,rnd    save for next time through
  201.         move.l    d1,d0        most random part to d0
  202.         movem.l (sp)+,d2-d3
  203.         rts
  204.  
  205. Random        move.w    d2,-(sp)
  206.         move.w    d0,d2        save upper limit
  207.         beq.s    10$        range of 0 returns 0 always
  208.         bsr.s    LongRnd     get a longword random number
  209.         clr.w    d0        use upper word (it's most random)
  210.         swap    d0
  211.         divu.w    d2,d0        divide by range...
  212.         clr.w    d0        ...and use remainder for the value
  213.         swap    d0        result in d0.w
  214. 10$        move.w    (sp)+,d2
  215.         rts
  216.  
  217.         even
  218. no_cookies:    dc.b    "No cookies!",$0a,0
  219.         even
  220. file:        dc.b    "s:cookie.dat",0
  221.         even
  222. ptrs:        dc.b    "s:cookie.ptr",0
  223.         even
  224. arplib:     dc.b    "arp.library",0
  225.         even
  226. rnd        ds.l    2        random number
  227.  
  228.         end
  229.