( File: RANDOM.4th -- not used directly in 4th/86 but called in when compiling the game WORM -- 8 July 88 -- MFB) ( this file contains the following words: RANDOMIZE - take 3 numbers off stack as random number gen. seed RANDOM - return a random number between 0 and 32767 ) 6 BLOCK SEED 6 BLOCK MULTIPLIER 6 BLOCK PRODUCT : RANDOMIZE ( init random number seed) ( 3 numbers on stack are 48 bit seed) 87C5H MULTIPLIER ! 0E01H MULTIPLIER 2+ ! E09AH MULTIPLIER 4 + ! SEED ! SEED 2+ ! SEED 4 + ! ; CODE RANDOM ( return random number on TOS) B PUSH, ( save 4th pc) '' SEED LDA, 1 ORI, '' SEED STA, ( make seed odd) ( clear product) H 0 LXI, '' PRODUCT SHLD, '' PRODUCT 2+ SHLD, '' PRODUCT 4 + SHLD, B 6 LXI, ( byte counter) BEGIN ( byte loop) H '' MULTIPLIER 1- LXI, B DAD, A M MOV, ( plier byte) B PUSH, B 8 MVI, ( bit counter) BEGIN ( bit loop) D A MOV, ( save plier byte) ( shift prod left 1 bit) H '' PRODUCT LXI, C 6 MVI, A XRA, BEGIN A M MOV, RAL, M A MOV, H INX, C DCR, ENDZ A D MOV, ( plier) RAL, IFC ( if add cycle) ( add seed to prod) PSW PUSH, A XRA, C 6 MVI, H '' PRODUCT LXI, D '' SEED LXI, BEGIN D LDAX, M ADC, M A MOV, H INX, D INX, C DCR, ENDZ PSW POP, THEN B DCR, ( test bit counter) ENDZ B POP, ( byte counter) C DCR, ENDZ ( byte loop) ( seed = -prod) B 6 MVI, H '' SEED LXI, D '' PRODUCT LXI, STC, BEGIN D LDAX, 0 ACI, M A MOV, H INX, D INX, B DCR, ENDZ ( get result: high order bytes of seed) H DCX, A M MOV, 7FH ANI, ( always >0) H DCX, L M MOV, H A MOV, B POP, ( 4th pc) ;PUSH ( tos is random number)