; Constants
.equ MAX_NUMBER = 59
.equ MIN_NUMBER = 1

; Define registers or memory locations if needed
.include "m8535def.inc"
.def temp = r16
.def seed = r17

; Initialize ports and other necessary settings
; Set up the ports
ldi temp, 0xFF
out DDRA, temp ; Port A as output
out DDRB, temp ; Port B as output

; Seed the initial value
ldi seed, $56 ; Initial seed value for random number generation

; Main program
main:
ldi temp, 6 ; Generate six random numbers
generate_numbers:
call random_number ; Call subroutine to generate random number

; Display the most significant digit on Port A
call display_most_significant_digit

; Show the least significant bits on Port B
andi temp, $03 ; Mask the least significant 2 bits
out PORTB, temp

; Wait for a short time for visualization (optional)
; Insert your delay routine here

; Decrement the counter and loop
dec temp
brne generate_numbers

; Infinite loop
rjmp main

; Subroutine for generating random numbers using XOR and shift method
random_number:
; Load the seed value
mov temp, seed

; XOR bottom two bits and shift the result onto the most significant bit
lsr temp
ror seed
bst temp, 0
bld seed, 7
eor seed, temp

; Ensure the generated number falls within the range 01 to 59
; Mask the number to 6 bits and add 1 to ensure it's within the specified range
andi seed, $3F
ldi temp, 1
add seed, temp

; Return the random number in temp
mov temp, seed
ret

; Subroutine to display the most significant digit in binary on Port A
display_most_significant_digit:
; Extract the most significant digit
mov temp, seed
ldi seed, 10  ; Divide by 10 to get the most significant digit
div temp, seed
mov temp, seed ; Store the most significant digit in temp

; Convert the digit to binary and display on Port A
lsr temp  ; Shift to extract the digit
out PORTA, temp ; Display the most significant digit in binary on Port A
ret