ReC98/libs/master.lib/random.asm

68 lines
1.3 KiB
NASM

; master library - random
;
; Description:
; 簡易乱数
;
; Function/Procedures:
; function IRand : Integer ;
;
; Parameters:
; none
;
; Returns:
; IRand: 0〜32767の乱数
;
; Binding Target:
; Microsoft-C / Turbo-C / Turbo Pascal
;
; Running Target:
; 8086
;
; Requiring Resources:
; CPU: 8086
;
; Notes:
; Borland C++ 3.1のランタイムライブラリを参考にしています。
;
; 一回の処理時間は、PC-9801RA21(Cx486DRx2 20/40MHz)で 2.1μsecです。
; ちなみに、同一条件で Visial C++ 1.0Jの rand()は 3.8μsec,
; Borland C++3.1 は 2.9μsecですので、
; 標準ライブラリのものよりは高速ということになります。
; 処理的には、BC3.1のものを高速化しただけにすぎませんので、
; 完全に代用できます。
;
; Assembly Language Note:
; CX,DXレジスタとフラグを破壊します。
;
; Compiler/Assembler:
; TASM 3.0
; OPTASM 1.6
;
; Author:
; 恋塚昭彦
;
; Revision History:
; 94/ 1/ 6 Initial: random.asm/master.lib 0.22
HI_MUL equ 015ah
LO_MUL equ 4e35h
func IRAND ; IRand() {
mov AX,LO_MUL
mul word ptr random_seed+2
mov CX,AX
mov AX,HI_MUL
mul word ptr random_seed
add CX,AX
mov AX,LO_MUL
mul word ptr random_seed
add AX,1
adc DX,CX
mov word ptr random_seed,AX
mov AX,DX
mov word ptr random_seed+2,AX
and AH,7fh
ret
endfunc ; }