home *** CD-ROM | disk | FTP | other *** search
/ CD Actual 14 / CDACTUAL.iso / cdactual / demobin / share / program / asm / RTGRAF.ZIP / SOURCE.ZIP / RANDOM.ASM < prev    next >
Encoding:
Assembly Source File  |  1990-01-21  |  5.4 KB  |  239 lines

  1. ;=================================================================
  2. ;
  3. ;
  4. ; setrand(seed);
  5. ;
  6. ; setrand - set random  # seed
  7. ;
  8. _setrand proc far
  9.         push    bp
  10.         mov     bp,sp
  11.         mov     ax,[bp+6]
  12.         or      ax,ax             ; if seed specified
  13.         jnz     setit             ;   use it
  14.         mov     ah,2ch            ; else
  15.         int     21h               ;   use system time (secs &
  16.         mov     ax,dx             ;   1/100's) to get rand seed
  17. setit:
  18.         mov     seed,ax           ; save seed
  19.         mov     word ptr [seed+2],0
  20.         pop     bp
  21.         ret                       ; that's all folks
  22. _setrand endp
  23. ;=====================================================================
  24. ;
  25. ; rand();
  26. ;
  27. ; rand - fetch a new random number;  at entry, cx=limit
  28. ;               at exit, ax=random number
  29. ;
  30. ;   formula:     rand(i+1)=214013*rand(i)+2531011
  31. ;
  32. _rand proc far
  33.         push    bp
  34.         mov     bp,sp
  35.         push    di
  36.         mov     di,[seed+2]
  37.         or      di,di           ; zero?
  38.         mov     ax,3
  39.         mov     bx,43fdh
  40.         mov     cx,[seed]
  41.         jz      zerodi
  42.         mul     cx
  43.         mov     di,ax
  44.         mov     ax,bx
  45.         mul     word ptr [seed+2]
  46.         add     di,ax
  47. zerodi:
  48.         mov     ax,bx
  49.         mul     cx
  50.         add     dx,di
  51.         add     ax,9ec3h
  52.         adc     dx,26h
  53.         mov     [seed],ax
  54.         mov     [seed+2],dx
  55.         mov     ax,dx
  56.         xor     dx,dx
  57.         mov     cx,[bp+4]
  58.         div     cx
  59.         mov     ax,dx
  60.         pop     di
  61.         pop     bp
  62.         ret
  63. _rand endp
  64. ;=============================================================
  65. ;
  66.         page
  67. _beepoff  proc far
  68.         in      al,61h
  69.         and     al,0fch
  70.         out     61h,al
  71.         ret
  72. _beepoff endp
  73. ;
  74. ; BEEPON --- turns beeper on with timer 2 gate to value in AX at entry.
  75. ;
  76. _beepon proc far
  77.         cmp     _beepflg,0
  78.         jz      boret
  79.         push    bp
  80.         mov     bp,sp
  81.         mov     al,0b6h
  82.         out     43h,al
  83.         mov     ax,[bp+6]
  84.         out     42h,al
  85.         mov     al,ah
  86.         out     42h,al
  87.         in      al,61h
  88.         or      al,3
  89.         out     61h,al
  90.         pop     bp
  91. boret:
  92.         ret
  93. _beepon endp
  94. ;======================================================================
  95. ;
  96.         page
  97. ;
  98. _iskey proc far
  99.         mov     ah,1
  100.         int     16h
  101.         jnz     iskeyret
  102.         mov     ax,0
  103. iskeyret:
  104.         ret
  105. _iskey endp
  106. ;
  107. _key proc far
  108.         mov     ah,0
  109.         int     16h
  110.         ret
  111. _key endp
  112. ;======================================================================
  113.         page
  114. ;
  115. ; take_timer();
  116. ;
  117. old1coff        dw      ?
  118. old1cseg        dw      ?
  119. ;
  120. _take_timer proc far
  121.         push    bp
  122.         mov     bp,sp
  123.         push    si
  124.         push    di
  125.         mov     ax,351ch         ; get old timer interrupt vector
  126.         push    es
  127.         int     21h
  128.         mov     cs:[old1cseg],es
  129.         mov     cs:[old1coff],bx ; save it
  130.         pop     es
  131.         push    ds
  132.         push    cs
  133.         pop     ds
  134.         lea     dx,timerint
  135.         mov     ax,251ch         ; take it
  136.         int     21h
  137.         pop     ds
  138.         pop     di
  139.         pop     si
  140.         pop     bp
  141.         ret
  142. _take_timer endp
  143. ;
  144. ; give_timer();
  145. ;
  146. _give_timer proc far
  147.         push    bp
  148.         mov     bp,sp
  149.         push    si
  150.         push    di
  151.         push    ds
  152.         mov     ds,cs:[old1cseg]
  153.         mov     dx,cs:[old1coff]
  154.         mov     ax,251ch         ; give it
  155.         int     21h
  156.         pop     ds
  157.         pop     di
  158.         pop     si
  159.         pop     bp
  160.         ret
  161. _give_timer endp
  162. ;
  163. ; beep_seq(listptr);
  164. ;
  165. _beep_seq proc far
  166.         cmp     _beepflg,0
  167.         jz      bsret
  168.         push    bp
  169.         mov     bp,sp
  170.         mov     ax,[bp+6]
  171.         mov     beepptr,ax
  172.         call    beepsub
  173.         pop     bp
  174.         pop     ds
  175. bsret:
  176.         ret
  177. ;
  178. ; timer interrupt
  179. ;
  180. timerint:
  181.         push    es
  182.         push    ds
  183.         push    ax
  184.         push    bx
  185.         push    cx
  186.         push    dx
  187.         push    si
  188.         push    di
  189.         push    bp
  190.         mov     ax,dgroup
  191.         mov     ds,ax
  192.         inc     _timepass
  193.         mov     ax,beeptime
  194.         or      ax,ax
  195.         jz      texit
  196.         dec     beeptime
  197.         jnz     texit
  198.         call    beepsub
  199. texit:
  200.         pop     bp
  201.         pop     di
  202.         pop     si
  203.         pop     dx
  204.         pop     cx
  205.         pop     bx
  206.         pop     ax
  207.         pop     ds
  208.         pop     es
  209.         jmp     dword ptr cs:old1coff
  210. ;
  211. beepsub proc near
  212.         mov     si,beepptr
  213.         cld
  214.         lodsw                    ; get next frequency
  215.         or      ax,ax            ; end of list?
  216.         jnz     freqok           ; jif no
  217.         in      al,61h           ; else turn beeper off
  218.         and     al,0fch
  219.         out     61h,al
  220.         ret
  221. beepsub endp
  222. freqok:
  223.         push    ax
  224.         mov     al,0b6h
  225.         out     43h,al
  226.         pop     ax
  227.         out     42h,al           ; write it to timer 2
  228.         mov     al,ah
  229.         out     42h,al
  230.         in      al,61h
  231.         or      al,3
  232.         out     61h,al
  233.         lodsw                    ; get next duration
  234.         mov     beeptime,ax
  235.         mov     beepptr,si
  236.         ret
  237. _beep_seq endp
  238. ;
  239.