random numbers and delay loops HELP

General discussions related to the Altair 8800 Clone
Post Reply
gio74
Posts: 54
Joined: January 30th, 2015, 1:43 pm
Contact:

random numbers and delay loops HELP

Post by gio74 »

I've created a random number generator that outputs number from 1 to 8, and I'd like to use that number to change the time of a delay loop
the problem is that the delay seems to ignore the changes. what am I doing wrong?

Code: Select all

; tempo random
; 1 March 2015	

               org   	100h

	        mvi	a,03h
	        out 	10h
	        mvi 	a,15
	        out 	10h

	        
           lxi 	h,200h ;initialise random number gen. by reading 200h

start	  mvi	a,'+'		;output an ASCII + to monitor the delay routine
	        out	11h
	
random	mov 	a,m ;random number generator
   	    rrc
	        add	m
	        rrc
	        mov 	m,a
	        inx	h
	        xra	m
	        mov	m,a
	        ani	7o
	        inr	a
tempo      set	a ;0 to 7 should be assigned to variable "tempo"
	
	        lxi	d,tempo*5000 ;this is the problem, I've tried also other things like "lxi d,a*5000", no luck
delay        dcx	d			
	        mov	a,d		
	        ora	e		
	        jnz	delay       
	
	        jmp	start

	
	        end
	
sorry for the bad formatting, switching between PC and Mac makes some mess
toml_12953
Posts: 305
Joined: June 7th, 2013, 12:54 pm
Contact:

Re: random numbers and delay loops HELP

Post by toml_12953 »

gio74 wrote:I've created a random number generator that outputs number from 1 to 8, and I'd like to use that number to change the time of a delay loop
the problem is that the delay seems to ignore the changes. what am I doing wrong?

Code: Select all

; tempo random
; 1 March 2015	

               org   	100h

	        mvi	a,03h
	        out 	10h
	        mvi 	a,15
	        out 	10h

	        
           lxi 	h,200h ;initialise random number gen. by reading 200h

start	  mvi	a,'+'		;output an ASCII + to monitor the delay routine
	        out	11h
	
random	mov 	a,m ;random number generator
   	    rrc
	        add	m
	        rrc
	        mov 	m,a
	        inx	h
	        xra	m
	        mov	m,a
	        ani	7o
	        inr	a
tempo      set	a ;0 to 7 should be assigned to variable "tempo"
	
	        lxi	d,tempo*5000 ;this is the problem, I've tried also other things like "lxi d,a*5000", no luck
delay        dcx	d			
	        mov	a,d		
	        ora	e		
	        jnz	delay       
	
	        jmp	start

	
	        end
	
sorry for the bad formatting, switching between PC and Mac makes some mess
Could you be loading the location of tempo rather than the contents at that location?
I'm more familiar with Z-80 code but in order to use the 0 - 7, you'd have to
do something like this:

ld hl,(tempo)*5000

Tom Lake
AltairClone
Site Admin
Posts: 677
Joined: April 5th, 2013, 10:55 am
Contact:

Re: random numbers and delay loops HELP

Post by AltairClone »

Gio,

I see a few problems that need to be solved. One is that "lxi hl" loads the actual value specified in the right column - the right column is not an address from which hl is loaded. Second, the "set" mnemonic is a directive to the assembler used to set the value of a symbol during assembly - it is not an 8080 instruction.

Post the algorithm in some sort of pseudo-code and we can help convert it into 8080 assembly with you.

Mike
gio74
Posts: 54
Joined: January 30th, 2015, 1:43 pm
Contact:

Re: random numbers and delay loops HELP

Post by gio74 »

oh thanks Mike!

the random gen works great, the only problem I have is to use that number to change the delay loop time
I see a few problems that need to be solved. One is that "lxi hl" loads the actual value specified in the right column - the right column is not an address from which hl is loaded.
Ok I misunderstood, lxi loads a 16 bit address and not its content, nevertheless the random gen works
Second, the "set" mnemonic is a directive to the assembler used to set the value of a symbol during assembly - it is not an 8080 instruction.
mhh I need to understand this. I used set before in another program and it worked. What is exactly a directive? the 8080 manual does not explain this.

anyway the program is basically this


10 initialise the serial port

20 print "X"

30 generate a random number between 1 and 8
40 assign random number to variable A$

50 perform loop delay
loop delay time = lxi d,...x..... where x = A$*5000

60 goto 20
AltairClone
Site Admin
Posts: 677
Joined: April 5th, 2013, 10:55 am
Contact:

Re: random numbers and delay loops HELP

Post by AltairClone »

Here are some comments and updates to help you along:

Code: Select all

; tempo random
; 1 March 2015   

	org	100h

	mvi	a,03h
	out	10h
	mvi	a,15
	out	10h

;****
; Moved lxi h,200h inside the loop, otherwise, hl increments forever.
;    Also changed absolute address reference to a symbol

start	lxi	h,rndVal		;hl->rndVal where 16 bit random number is 

updated
	mvi	a,'+'		;output an ASCII + to monitor the delay routine
	out	11h

random	mov	a,m
	rrc
	add	m
	rrc
	mov	m,a
	inx	h
	xra	m
	mov	m,a
	ani	7		;a = msb and 7
	inr	a		;a = 1 - 8 (not 0-7 as stated below)

;****
; This just sets the symbol "tempo" to a fixed value of 7 at assembly time. 
;   In many 8080 instructions, "a" has the value of 7 in the bit field of
;   the instruction that identifies the register to be used

; tempo	set	a 		;0 to 7 should be assigned to variable "tempo"

;****
; This sets the value loaded into d to the fixed value of 7*5000 which when
;    wrapped to 16 bits is 88B8h. There is not a multiply instruction in the 8080.

;	lxi	d,tempo*5000


; compute de = a*4096 (instead of a*5000) by shifting a to the left 12 bits.

	rlc			;move lower nibble to upper nibble
	rlc
	rlc
	rlc
	mov	d,a		;d=msb of a*4096
	mvi	e,0		;de=a*4096

delay	dcx	d 
	mov	a,d
	ora	e
	jnz	delay       

	jmp	start

; Variables

rndVal	ds	2		;16 bit random value variable

	end

gio74
Posts: 54
Joined: January 30th, 2015, 1:43 pm
Contact:

Re: random numbers and delay loops HELP

Post by gio74 »

Great Mike, I will study this very very closely.
thank you very much indeed.
Post Reply

Who is online

Users browsing this forum: No registered users and 4 guests