本帖最后由 tyw 于 2013-4-15 09:21 编辑
玛莉机开奖随机数发生子程序,供参考
;****************************************
;* 取(6FH)~(70H)范围乱数,结果在(58H)中 *
;* 乱数上限在(70H),乱数下限在(6FH) *
;****************************************
;
RBC: PUSH ACC ;现场保护
PUSH B
PUSH PSW
SETB PSW.4 ;区2(10H)~(17H)
CLR PSW.3
RBC0: NOP
MOV A,58H ;读取由【RND】子程序产生的乱数
CJNE A,6FH,RBC2 ;乱数与下限比较
RBC2: JC RBC1 ;C=1,乱数〈下限,转RBC1重读乱数
MOV A,58H
CJNE A,70H,RBC3 ;C=0,乱数〉=下限,则再与上限比较
RBC4: POP PSW ;乱数〈=上限,恢复现场
POP B
POP ACC
RET
;
RBC3: JC RBC4 ;C=1,乱数〈上限 ,转RBC4结束
RBC1: LCALL RND ;C=0,乱数〉上限,或乱数〈下限,重读乱数
SJMP RBC0 ;转RBC0重新判断
;******************************
;* 在(56H)~(59H)中产生乱数值 *
;* ML.09E9 *
;******************************
;
RND: NOP
CLR IE.7 ;关中断
MOV A,59H ;取出乱数种子
RRC A ;右环移三次
RRC A
RRC A
XRL A,57H ;与(57H)内容异或
RRC A ;右环移二次
RRC A
XRL A,58H ;与(58)内容异或
RRC A ;右环移一次
XRL A,56H ;与(56)内容异或
RRC A ;右环移一次
CPL C ;进位标志取反
MOV R0,#56H ;乱数寄存器首址
MOV R2,#04 ;共有四位乱数
RND1: MOV A,@R0 ;取出乱数寄存器内容
RLC A ;左环移一次
MOV @R0,A ;送回乱数寄存器
INC R0
DJNZ R2,RND1
SETB IE.7 ;开中断
RET
|