; ********** PSEUDO-RANDOM NUMBER ROUTINE ********** ; GENERATES A PSEUDO-RANDOM NUMBER FROM 0 TO 65535. ; ; ENTRY: NO PARAMETERS. ; EXIT: (BC) = RANDOM NUMBER 0 - 65535. ; ALL REGISTERS SAVED EXCEPT BC. ; ************************************************** .ORG 0000h SEED: .EQU 78h ; ADDED FOR TESTING PURPOSES. LD SP, 0080h ; ADDED FOR TESTING PURPOSES. CALL RND000 ; ADDED FOR TESTING PURPOSES. HALT ; ADDED FOR TESTING PURPOSES. RND000: PUSH AF ; SAVE REGISTERS. PUSH DE PUSH HL LD DE, (SEED) ; GET SEEND VALUE. LD HL, (SEED +2) LD B, 07h ; COUNT FOR MULTIPLY BY 128. RND001: CALL SHIFT ; SHIFT ONE BIT LEFT. DJNZ RND001 ; SEED * 128. LD B, 3 ; FOR SUBTRACT. RND002: CALL SUB ; SUBTRACT ONE. DJNZ RND002 ; (SEED * 128) - (3 * SEED) = (SEED * 125). LD (SEED), DE ; STORE NEW SEED. LD (SEED +2), HL LD B, E ; NOW IN B. LD C, H ; NOW IN BC. POP HL ; RESTORE REGISTERS. POP DE POP AF RET ; RETURN. ; SHIFT SUBROUTINE. SHIFT: ADD HL, HL ; SHIFT HL. EX DE, HL ; GET MS BYTE. ADC HL, HL ; SHIFT MS 2 BYTES. EX DE, HL ; NOW ORIGINAL * 2. RET ; RETURN. ; SUBTRACT SEED SUBROUTINE. SUB: PUSH BC ; SAVE REGISTERS. LD BC, (SEED + 2) ; GET LS BYTE. OR A ; RESET CARRY BIT. SBC HL, BC ; SUBTRACT LS 2 BYTES. EX DE, HL ; GET MS 2 BYTES. LD BC, (SEED) ; GET MS 2 BYTES. SBC HL, BC ; SUBTRACT MS 2 BYTES AND CARRY. EX DE, HL ; NOW ORIGINAL - SEED. POP BC ; RESTORE REGISTERS. RET ; RETURN .END