* * * THIS ROUTINE WILL GENERATE A RANDOM NUMBER * BETWEEN 0 AND .99999999 IN FLOATING POINT FORMAT * FRANDOM PUSH D SAVE ARGUMENT ADDRESS PUSH D LDAX D ORA A JNZ RAN00 LXI H,RANLS+FPSIZ-1 LAST RANDOM NUMBER CALL VCOPY COPY LAST TO STACK POP D JMP RAN04 * * RAN00 DCX D LDAX D INX D ORA A JZ RAN01 LXI H,RANOS+FPSIZ-1 ORIG SEED CALL VCOPY RESET TO ORIG RAN01 POP D ADDR OF ARG (ON STACK) * RAN04 MOV B,D DE TO BC MOV C,E LDAX B GET EXPONENT CPI 80H CHECK IF GREATER THAN .1 JNC RAN20 MOV D,A SAVE EXPONENT MVI E,DIGI2 LXI H,EXP * RAN05 LDAX B GET VALUE MOV M,A PUT IN BUFFER DCX B DCX H DCR E JNZ RAN05 * MOV M,E PUT ZERO IN BUFFER MVI A,80H SUB D CPI DIGIT+DIGIT JC RAN10 MVI A,DIGIT+DIGIT * RAN10 ADD A FORM SHIFT COUNT ADD A MOV B,A CALL RIGHT FORM INTEGER VALUE POP B GET ARGUMENT ADDRESS PUSH B SAVE ADDRESS MVI E,DIGI2 LXI H,EXP BUFFER ADDRESS * RAN15 MOV A,M GET BUFFER VALUE STAX B PUT BACK INTO ARGUMENT DCX B DCX H DCR E JNZ RAN15 * RAN20 MVI E,DIGI2 ZERO OUT THE SUM BUFFER. XRA A MAKE A ZERO LXI H,EXP END OF THE BUFFER. RAN21 MOV M,A ZAP. DCX H DCR E JNZ RAN21 LOOP UNTIL BUFFER IS CLEARED. * * FORM A*X * POP D RESTORE ADDRESS PUSH D SAVE ARGUMENT ADDRESS MVI C,1 SET HIGH LOW FLAG MVI B,DIGIT+DIGIT DIGIT COUNT LXI H,RANA ADDRESS OF A * * RAN30 MOV A,M GET NEXT DIGIT DCR C HIGH OR LOW DIGIT JNZ RAN40 LOW DIGIT RAR . GET HIGH DIGIT RAR RAR RAR DCX H NOT NEXT BYTE YET MVI C,2 SET FOR LOW DIGIT * RAN40 ANI 0FH LOW 4 BITS INX H NEXT BYTE PUSH H SAVE ADDRESS PUSH B SAVE COUNT MOV C,A DIGIT VALUE * RAN50 DCR C DECREMENT DIGIT VALUE JM RAN60 FINISHED PUSH D SAVE ARGUMENT ADDRESS DCX D POINT TO LOW DIGIT DCX D ORA A CLEAR THE CARRY. CALL ADD MULTIPLY POP D RESTORE ARGUMENT ADDRESS JMP RAN50 * * RAN60 POP B GET COUNT DCR B JZ RAN70 FINISHED PUSH B MVI B,4 CALL LEFT SHIFT LEFT POP B RESTORE COUNT POP H GET DIGIT ADDRESS JMP RAN30 CONTINUE * * RAN70 POP H FIX STACK POINTER * * FORM A*X+C * LXI D,RANC+DIGIT-1 C ADDRESS ORA A CLEAR THE CARRY. CALL ADD AX+C * * MAKE SURE SIGN IS POSITIVE, VALUE IS A FRACTION, * AND CONVERT BACK TO FLOATING POINT FORMAT * ...AND COPY TO SAVE FOR LAST RND NUMB * LXI H,EXP LOOK AT EXPONENT MVI M,80H MAKE A FRACTION DCX H MVI M,0 SIGN IS POSITIVE * POP B RESULT ADDR LXI H,RAN87 PUSH H PUSH B JMP ADS4 NORMALIZE VALUE * * RAN87 LXI B,RANLS+FPSIZ-1 ADDR OF LAST RAND NUMB JMP STORE COPY VALUE AND ### EXIT ### * * * CONSTANTS AND STORAGE FOR RANDOM * * RANLS IS THE LAST RANDOM NUMBER GENERATED. * RANOS IS THE ORIGINAL SEED FOR THE RANDOM NUMBER GENERATOR. * RANA AND RANC ARE THE CONSTANTS USED TO GENERATE A * RANDOM NUMBER VIA X=A*X0+C X0 IS RANLS. * IF PX6 6-DIGIT PRECISION RANLS DB 31H,41H,59H,00H,80H RANOS DB 31H,41H,59H,00H,80H RANA DB 57H,72H,21H RANC DB 21H,13H,23H ENDF IF PX8 8-DIGIT PRECISION RANLS DB 31H,41H,59H,26H,00H,80H RANOS DB 31H,41H,59H,36H,00H,80H RANA DB 57H,72H,16H,21H RANC DB 21H,13H,24H,87H ENDF IF PX10 10-DIGIT PRECISION RANLS DB 31H,41H,59H,26H,53H,00H,80H RANOS DB 31H,41H,59H,26H,53H,00H,80H RANA DB 57H,72H,15H,66H,21H RANC DB 21H,13H,24H,86H,53H ENDF IF PX12 12-DIGIT PRECISION RANLS DB 31H,41H,59H,26H,53H,58H,00H,80H RANOS DB 31H,41H,59H,26H,53H,58H,00H,80H RANA DB 57H,72H,15H,66H,48H,21H RANC DB 21H,13H,24H,86H,54H,03H ENDF IF PX14 14-DIGIT PRECISION RANLS DB 31H,41H,59H,26H,53H,58H,97H,00H,80H RANOS DB 31H,41H,59H,26H,53H,58H,97H,00H,80H RANA DB 57H,72H,15H,66H,49H,02H,21H RANC DB 21H,13H,24H,86H,54H,05H,19H ENDF IF PX16 16-DIGIT PRECISION RANLS DB 31H,41H,59H,26H,53H,58H,97H,93H,00H,80H RANOS DB 31H,41H,59H,26H,53H,58H,97H,93H,00H,80H RANA DB 57H,72H,15H,66H,49H,01H,52H,21H RANC DB 21H,13H,24H,86H,54H,05H,18H,71H ENDF IF PX40 DON'T USE RND WITH 40-DIGIT VERSION RANLS EQU $ RANOS EQU $ RANA EQU $ RANC EQU $ ENDF * *