0100 org 00100h 0100 210000 dog: lxi h,0 0103 CD0A01 call rand 0106 FF rst 7 0107 C30001 jmp dog ; ; RAND - Psuedo random number generator ; ; usage: call rand ; ; entry: hl has new seed or 0 to use last random ; number generated as the seed ; ; exit: hl has random number ; ; zaps: a,bc,de,hl ; 0005 = PRIME1 equ 5 0003 = PRIME2 equ 3 rand: 010A 7C mov a,h 010B B5 ora l 010C C21201 jnz rand1 010F 2A2701 lhld seed rand1: 0112 7C mov a,h 0113 B5 ora l 0114 C21801 jnz rand2 0117 23 inx h rand2: 0118 EB xchg 0119 010500 lxi b,PRIME1 011C CD2901 call mpy 011F 110300 lxi d,PRIME2 0122 19 dad d 0123 222701 shld seed 0126 C9 ret 0127 D504 seed: dw 1237 ; ; MPY - Multiply bc by de results in hl ; mpy: 0129 B7 ora a 012A 210000 lxi h,0 mpy1: 012D 78 mov a,b ; bc >>= 1 012E 1F rar 012F 47 mov b,a 0130 79 mov a,c 0131 1F rar 0132 4F mov c,a 0133 D23701 jnc mpy2 0136 19 dad d mpy2: 0137 EB xchg 0138 29 dad h 0139 EB xchg 013A 78 mov a,b 013B B1 ora c 013C C22D01 jnz mpy1 mpy3: 013F C9 ret ; ; DIV - Divide N (de) by D (bc) result in hl ; div: 0140 78 mov a,b ; negate D 0141 2F cma 0142 47 mov b,a 0143 79 mov a,c 0144 2F cma 0145 4F mov c,a 0146 03 inx b 0147 210000 lxi h,0 ; clear remainder 014A 3E10 mvi a,16 ; bit count div1: 014C 29 dad h ; shift R 014D EB xchg 014E 29 dad h ; shift N 014F EB xchg 0150 D25401 jnc div2 ; propagate bit to R 0153 23 inx h div2: 0154 E5 push h ; save current R 0155 09 dad b ; try to subtract D from R 0156 D25B01 jnc div3 ; jump if subtract failed 0159 E3 xthl ; else save new R 015A 13 inx d ; increment Q div3: 015B E1 pop h ; restore R 015C 3D dcr a 015D C24C01 jnz div1 0160 EB xchg ; R to de, Q to hl 0161 C9 ret ; ; MODULO - Mod N (de) by D (bc) result in hl ; modulo: 0162 CD4001 call div 0165 EB xchg 0166 C9 ret