home *** CD-ROM | disk | FTP | other *** search
/ Beijing Paradise BBS Backup / PARADISE.ISO / software / BBSDOORW / FUNCLR11.ZIP / FUNCOLRS.ASM next >
Assembly Source File  |  1991-08-07  |  7KB  |  243 lines

  1. ; FUNCOLRS.COM by Duane Paulson 08/06/91
  2. ;  Based on RANDGEN.ASM by CompuServe member 72210,17, who wrote it and
  3. ;  placed it in the public domain. I don't know your name, but thank you.
  4. ;  Code from RANDGEN.ASM is indicated by the ;* notation. Lines that I
  5. ;  changed so the routine would work with my code are marked with ;+
  6. ;
  7. ; PURPOSE: Writes a file called GCOLORS.T containing color parameters for
  8. ;  the ZCOMM and PRO-YAM graphics file transfer display. A different set
  9. ;  of colors is generated each time, and no two colors are ever repeated
  10. ;  within a single set.
  11. ;
  12. ; ASSEMBLE: masm funcolrs;
  13. ; LINK:        link funcolrs;
  14. ;        exe2bin funcolrs funcolrs.com
  15. ;
  16. ; CALL:    funcolrs
  17.  
  18.  
  19. rt        equ    0dh        ;*
  20. lf        equ    0ah        ;*
  21. of        equ    offset        ;*
  22. sh        equ    short        ;*
  23.  
  24. code    segment                ;*
  25.     assume    cs:code, ds:code    ;*
  26.     org    100h            ;*
  27.  
  28.  
  29. begin:    jmp    start
  30.  
  31. writes    MACRO    string,lstring,handle    ; Writes a string to a file or device
  32.     mov    ah,40h            ;; write to file or device
  33.     mov    bx,handle        ;; file handle
  34.     mov    cx,lstring        ;; length of string
  35.     mov    dx,OFFSET string    ;; pointer to string
  36.     int    21h            ;; call dos
  37.     ENDM
  38.  
  39. ;*Note:  24 and 55 are not arbitrary.  They have been chosen so that the least
  40. ;*significant bits in the sequence of pseudorandom integers have a period of
  41. ;*length 2^55 - 1.  The sequence of pseudorandom numbers themselves have period
  42. ;*2^f*(2^55 - 1) where 0 <= f <= 16.  See Knuth's Volume 2 "Seminumerical
  43. ;*Algorithms" of the second edition of the three volume set THE ART OF COMPUTER
  44. ;*PROGRAMMING (pages 26 & 27).
  45.  
  46. j        dw    24 * 2        ;*multiply by 2 for word offsets
  47. k        dw    55 * 2        ;*
  48.  
  49. ;*Array of 55 seed elements for the additive pseudorandom number generator.
  50.  
  51. add_array    dw    ?    ;*this location (offset 0 word) is not used
  52.     dw    7952,    42720,    56941,    47825,    52353,    4829,    32133    ;*
  53.     dw    29787,    7028,    62292,    46128,    34856,    63646,    21032    ;*
  54.     dw    62660,    61244,    35057,    36989,    43989,    46043,    48547    ;*
  55.     dw    43704,    29749,    21898,    10279,    48252,    35578,    27916    ;*
  56.     dw    3633,    50349,    33655,    36965,    48566,    43375,    15168    ;*
  57.     dw    30425,    8425,    31783,    3625,    23789,    37438,    64887    ;*
  58.     dw    19015,    43108,    61545,    24901,    58349,    52290,    62047    ;*
  59.     dw    21173,    27055,    27851,    47955,    14377,    14434        ;*
  60.  
  61. fname    db    "GCOLORS.T",0
  62. fhand    dw    ?
  63. emsg1    db    "Error creating file. No handles available or access denied."
  64. gcolor    db    9,"gcolors "
  65. endstr    db    "0,0",13,10,26
  66. table    db    15 dup (0)
  67. onedig    db    ?
  68.  
  69. randomize    proc    near        ;*randomize the random number generator
  70.     push    ax            ;*save
  71.     push    bx            ;*
  72.     mov    ax,40h            ;*set ds to BIOS data area
  73.     mov    ds,ax            ;*
  74.     mov    bx,6ch            ;*location of low word of 4-byte count
  75.     mov    ax,[bx]            ;*get low word of 4-byte clock count
  76.     push    cs            ;*reset ds for code addressing
  77.     pop    ds            ;*
  78.     mov    bx,of add_array        ;*address array of seed elements
  79.     add    bx,2            ;*offset 0 is not used
  80.     mov    cx,55            ;*shall adjust all 55 seeds
  81. set_seed:
  82.     add    [bx],ax            ;*randomize seed value with current time
  83.     add    bx,2            ;*move to next one
  84.     loop    set_seed        ;*
  85.     pop    bx            ;*
  86.     pop    ax            ;*
  87.     ret                ;*
  88. randomize    endp            ;*
  89.  
  90. random        proc    near        ;*generate pseudorandom number in ax
  91.     push    bx            ;*save
  92.     push    cx            ;*
  93.     mov    bx,j            ;*get j index
  94.     mov    cx,add_array[bx]    ;*and load array element into cx
  95.     mov    bx,k            ;*get k index
  96.     mov    ax,add_array[bx]    ;*and load array element into ax
  97.     add    ax,cx            ;*new element and return value to ax
  98.     mov    add_array[bx],ax    ;*store new element at location k
  99.     sub    j,2            ;*move down one element
  100.     sub    k,2            ;*move down one element
  101.     cmp    j,0            ;*is j down to 0?
  102.     jne    check_k            ;*no, check k
  103.     mov    j,55 * 2        ;*set i to end of array
  104. check_k:
  105.     cmp    k,0            ;*is k down to 0?
  106.     jne    random_out        ;*no, leave
  107.     mov    k,55 * 2        ;*set k to end of array
  108. random_out:
  109.     pop    cx            ;*restore
  110.     pop    bx            ;*
  111.     ret                ;*
  112. random        endp            ;*
  113.  
  114. number        db    3 dup(?)    ;%reserve memory for output number
  115.                     ; originally was 5
  116. ;new_line    db    rt,lf,'$'    ;%new line and DOS terminator
  117.                     ; following line replaces above line
  118. new_line    equ    this byte    ; we dont need the crlf (yet)
  119. initial        db    ' 0,'        ;%initialization value for number
  120.                     ; originally, '    0'
  121.  
  122. write_dec_ax    proc    near        ;%write decimal of ax to gcolors.t
  123.                     ; origianlly went to Standard Out
  124.     cmp    ax,10            ; are we dealing with 1 digit or 2?
  125.     jb    @F
  126.     mov    onedig,0        ; here we're dealing with two
  127.     jmp    short go1
  128. @@:    mov    onedig,-1        ; here we're dealing with two
  129.     
  130. go1:    push    ax            ;*save
  131.     push    bx            ;*
  132.     push    cx            ;*
  133.     push    dx            ;*
  134.     push    si            ;*
  135.     push    di            ;*
  136.     pushf                ;*save direction flag
  137.     mov    si,of initial        ;*initialize output area
  138.     mov    di,of number        ;*
  139.     mov    cx,2            ;%
  140.                     ; changed output from five digits to two
  141.     cld                ;*
  142.     rep    movsb            ;*
  143.     mov    bx,10            ;*base 10 divisor
  144.     mov    di,of new_line-1    ;*point to last digit position
  145.     std                ;*backward now
  146.  
  147.     push    ax
  148.     mov    al,","            ; place comma in last output position
  149.     stosb
  150.     pop    ax
  151.  
  152. next_digit:
  153.     or    ax,ax            ;*are we through?
  154.     je    wda_out            ;*yes, output result
  155.     xor    dx,dx            ;*clear high order end
  156.     div    bx            ;*next digit in result to dl
  157.     xchg    ax,dx            ;*place digit in al
  158.     add    al,30h            ;*convert to ascii digit
  159.     stosb                ;*store it in output area
  160.     xchg    ax,dx            ;*quotient back to ax
  161.     jmp    sh next_digit        ;*loop
  162. wda_out:
  163.     mov    ah,40h            ;*let DOS output the number
  164.                     ; originally function 9
  165.     mov    bx,fhand        ; write to GCOLORS.T
  166.     mov    cx,3            ; number of bytes to write
  167.     mov    dx,of number        ;*
  168.     cmp    onedig,0        ; are we dealing with 1 digit or 2?
  169.     je    @F
  170.     inc    dx            ; here we're dealing with one
  171.     dec    cx
  172. @@:    int    21h            ;*  here we rejoin with 2
  173.     popf                ;*restore
  174.     pop    di            ;*
  175.     pop    si            ;*
  176.     pop    dx            ;*
  177.     pop    cx            ;*
  178.     pop    bx            ;*
  179.  
  180.     pop    ax            ;*
  181.     ret                ;*
  182. write_dec_ax    endp            ;*
  183.  
  184.     
  185. start:    call    randomize        ;*randomize the generator
  186.  
  187.     mov    ah,3Ch            ; create file (open for overwrite)
  188.     mov    cx,0            ; normal attribute (not hidden, etc.)
  189.     mov    dx,OFFSET fname        ; pointer to filename
  190.     int    21h            ; call dos
  191.  
  192.     jnc    @F            ; jump over error routine
  193.  
  194.     writes    emsg1,59,2        ; display message to Standard Error
  195.  
  196.     jmp    short endit        ;  and exit
  197.  
  198. @@:    mov    fhand,ax        ; save the file handle
  199.  
  200.     writes    gcolor,9,fhand        ; write header material to file
  201.  
  202.  
  203.     mov    cx,15            ;%number of randoms to write
  204. next:    call    random            ;*get a random number to ax
  205.  
  206.     shr    ax,1
  207.     and    ax,0Fh            ; use low nibble only
  208.     jz    next            ; discard return of zero
  209.     push    di            ; save registers
  210.     push    bx
  211.     push    cx
  212.     mov    cx,15            ; number of positions in 'used' table
  213. check:    mov    di,cx
  214.     mov    bl,BYTE PTR table[di]
  215.     cmp    bl,al
  216.     jne    @F            ; check if we have duplicate values
  217.     pop    cx            ;  if we do, restore registers...
  218.     pop    bx
  219.     pop    di
  220.     jmp    short    next        ;  ... and do it again
  221. @@:    loop    check            ;   else continue checking
  222.     pop    cx            ; Good value!
  223.     pop    bx            ; restore registers
  224.     mov    di,cx
  225.     mov    BYTE PTR table [di],al    ;  and make a note that we have used it
  226.     pop    di
  227.     
  228.     call    write_dec_ax        ;%write decimal of ax to file
  229.                     ; originally it went to CON
  230.     loop    next            ;*
  231.  
  232.     writes    endstr,6,fhand        ; write ending material to file
  233.  
  234.     mov    ah,3Eh            ; close file
  235.     mov    bx,fhand        ; handle
  236.     int    21h            ; call dos
  237.  
  238. endit:    mov    ax,4C00h        ; exit with zero exit code
  239.     int    21h            ;*end (originally int 20)
  240.  
  241. code    ends                ;*
  242.     end    begin            ;*
  243.