diff -Naur mp3player0621/player.asm mp3player0621a/player.asm
--- mp3player0621/player.asm	Fri May  4 03:22:07 2001
+++ mp3player0621a/player.asm	Sat May 26 21:05:13 2001
@@ -264,6 +264,8 @@
 
 ; non-volatile parameter id number assignments
 .equ	parm_attenuation, 1
+.equ	parm_random_mode, 2
+.equ	parm_random_seed, 3
 
 
 
@@ -276,6 +278,7 @@
 ;.equ	end_now_flag, 0x0C
 .equ	rand_mode_flag, 0x0D
 .equ	debug, 0x0E
+.equ	new_rand_seed_saved, 0x0F
 
 
 
@@ -474,6 +477,26 @@
 	mov	a, r0
 	lcall	sta013_set_attenuation
 
+	;restore saved random mode setting
+	mov	a, #parm_random_mode
+	mov	r0, #0
+	lcall	read_param_1byte
+	mov	a, r0
+	lcall	set_random_mode
+
+	;restore saved random seed
+	mov	a, #parm_random_seed
+	mov	r0, #0
+	lcall	read_param_1byte
+	mov	rand_number, r0
+	 mov	a, r0
+	 lcall	phex
+	 lcall	newline
+
+	;only use the saved seed once, we need a new seed now...
+	clr	new_rand_seed_saved
+
+
 	;enable the mp3 dma interrupt
 	clr	a
 	mov	dptr, #irq_dma_ide_ack
@@ -589,19 +612,61 @@
 
 main_random:
 	cjne	a, #event_random, main_next
+
+	mov	C,rand_mode_flag
+	jc	main_random_a1
+	mov	a, #1
+	sjmp	main_random_a2
+main_random_a1:
+	mov	a, #0
+main_random_a2:
+	lcall	set_random_mode
+	ljmp	mloop0
+
+; a is 1 for on, 0 for off
+set_random_mode:
+
+	jz	set_random_mode_a1
+	setb	rand_mode_flag
+	sjmp	set_random_mode_a2
+set_random_mode_a1:
+	clr	rand_mode_flag
+set_random_mode_a2:
+
 	mov	dptr, #mesg_rand
 	lcall	pstr
-	cpl	rand_mode_flag
-	jb	rand_mode_flag, rand_on
+
+	jb	rand_mode_flag, set_random_mode_on
+
 	mov	a, #'f'
 	lcall	cout
 	lcall	cout
 	lcall	newline
-	ljmp	mloop0
-rand_on:
+
+;	mov     a, #0
+	mov	r0, #params_temp
+	mov	@r0, #0
+	mov	a, #parm_random_mode
+	lcall	write_flash_param	;TODO: use a timer and avoid many
+                                        ;write if user presses button rapidly
+	ret
+set_random_mode_on:
 	mov	a, #'n'
 	lcall	cout
 	lcall	newline
+
+;	mov     a, #1
+	mov	r0, #params_temp
+	mov	@r0, #1
+	mov	a, #parm_random_mode
+	lcall	write_flash_param	;TODO: use a timer and avoid many
+                                        ;write if user presses button rapidly
+	ret
+
+
+m_do_event_later:
+	mov	a, r1
+	lcall	put_back_event
 	ljmp	mloop0
 
 
@@ -629,12 +694,6 @@
 	ljmp	mloop0
 
 
-m_do_event_later:
-	mov	a, r1
-	lcall	put_back_event
-	ljmp	mloop0
-
-
 main_vol_up:
 	cjne	a, #event_vol_up, main_vol_down
 	mov	dptr, #mesg_vol_up
@@ -1083,6 +1142,23 @@
 	mov	a, rand_number
 	rlc	a
 	mov	rand_number, a
+
+; write it only the first time since we booted, otherwise we would
+; write it after every track.  Once is enough cause its only used
+; the next time we startup
+
+	mov	C,new_rand_seed_saved
+	jc	rand_skip_save
+	push	acc
+	mov	r0, #params_temp
+	mov	@r0, a
+	mov	a, #parm_random_seed
+	lcall	write_flash_param	;TODO: use a timer and avoid many
+                                        ;write if user presses button rapidly
+	setb	new_rand_seed_saved
+	pop	acc
+
+rand_skip_save:
 	dec	a
 	mov	rand_count, a
 	clr	c
@@ -2095,11 +2171,11 @@
 	mov	r3, #max_attenuation
 sta013_set_atn2:
 	mov	r4, #0x46
-	 ;mov	dptr, #mesg_sta013_vol
-	 ;lcall	pstr
-	 ;mov	a, r3
-	 ;lcall	phex
-	 ;lcall	newline
+	 mov	dptr, #mesg_sta013_vol
+	 lcall	pstr
+	 mov	a, r3
+	 lcall	phex
+	 lcall	newline
 	mov	dptr, #sta013_wr
 	clr	ea
 	lcall	call_bank1		;write left attenuation
@@ -4980,7 +5056,7 @@
 	clr	a
 	cjne	a, user_buf+0, dirrd_copy ;check for null pointer flag
 	cjne	a, user_buf+1, dirrd_copy ;check for null pointer flag
-	ajmp	dirrd_exit		;skip copy
+	ljmp	dirrd_exit		;skip copy
 dirrd_copy:	
 	mov	dpl, user_buf+0
 	mov	dph, user_buf+1
