Instructions
Requirements and Specifications




Source Code
.data
prompt_np: .asciiz "Please enter number of players: "
prompt_nc: .asciiz "Please enter number of cards per player: "
menu: .ascii "1. To select user/bingo card to display\n"
.ascii "2. To show histogram\n"
.asciiz "3. Exit\n"
prompt_ch: .asciiz "Please enter your choice: "
prompt_pn: .asciiz "Please enter player number (1 - "
prompt_cn: .asciiz "Please enter card number (1 - "
prompt_end: .asciiz "): "
err_nplayers: .asciiz "Invalid number of players. Please try again\n"
err_ncards: .asciiz "Invalid number of cards. Please try again\n"
err_choice: .asciiz "Invalid choice. Please try again\n"
err_player: .asciiz "Invalid player number. Please try again\n"
err_card: .asciiz "Invalid card number. Please try again\n"
bingo: .asciiz " B I N G O\n"
cards: .space 100 # space for a maximum of 2 players * 2 cards * each card of maximum 5*5 numbers
histo: .space 75 # space to save histogram
.text
# Program start
main:
# read number of players
read_nplayers:
la $a0, prompt_np # load address of prompt string
li $v0, 4 # syscall to print string
syscall # print the prompt
li $v0, 5 # syscall to read an integer
syscall # read the number of players
move $s0, $v0 # save number of players
blt $v0, 1, bad_nplayers # if not correct, print error
ble $v0, 2, read_ncards # if correct, read number of cards
bad_nplayers:
# print error message
la $a0, err_nplayers # load address of error string
li $v0, 4 # syscall to print string
syscall # print the error message
j read_nplayers # try again
# read number of cards
read_ncards:
la $a0, prompt_nc # load address of prompt string
li $v0, 4 # syscall to print string
syscall # print the prompt
li $v0, 5 # syscall to read an integer
syscall # read the number of cards
move $s1, $v0 # save number of cards
blt $v0, 1, bad_ncards # if not correct, print error
ble $v0, 2, generate_cards # if correct, generate cards
bad_ncards:
# print error message
la $a0, err_ncards # load address of error string
li $v0, 4 # syscall to print string
syscall # print the error message
j read_ncards # try again
generate_cards:
# generate cards for all players and fill histogram
la $s2, cards # point to start of cards
la $s3, histo # point to start of histogram
move $t0, $s0 # start with the number of players
ploop:
move $t1, $s1 # start with the number of cards
cloop:
li $t2, 24 # start with the number of numbers
nloop:
li $v0, 42 # syscall to generate a random number in a range
li $a0, 0 # generator number 0
li $a1, 75 # generate between 0 and 74
syscall # generate a random number
add $t3, $a0, $s3 # add to histo to get position of number
lb $t4, 0($t3) # load current count of number
addi $t4, $t4, 1 # increment count
sb $t4, 0($t3) # save new count
addi $a0, $a0, 1 # increment to get a number 1-75
sb $a0, 0($s2) # save in cards
addi $s2, $s2, 1 # advance to next space in array
addi $t2, $t2, -1 # decrement numbers
bnez $t2, nloop # repeat loop while not zero
addi $t1, $t1, -1 # decrement cards
bnez $t1, cloop # repeat loop while not zero
addi $t0, $t0, -1 # decrement players
bnez $t0, ploop # repeat loop while not zero
# menu loop
menu_loop:
# print menu
la $a0, menu # load address of menu
li $v0, 4 # syscall to print string
syscall # print the menu options
read_choice:
# read choice
la $a0, prompt_ch # load address of prompt string
li $v0, 4 # syscall to print string
syscall # print the prompt
li $v0, 5 # syscall to read an integer
syscall # read the number of players
beq $v0, 1, read_player # if 1, display a card, start reading player
beq $v0, 2, disp_histo # if 2, display histogram
beq $v0, 3, exit # if 3, exit
# else, print error message
la $a0, err_choice # load address of error string
li $v0, 4 # syscall to print string
syscall # print the error message
j read_choice # try again
read_player:
# read player number
la $a0, prompt_pn # load address of prompt string
li $v0, 4 # syscall to print string
syscall # print the prompt
move $a0, $s0 # load maximum number of players
li $v0, 1 # syscall to print a number
syscall # print maximum number
la $a0, prompt_end # load address of prompt end string
li $v0, 4 # syscall to print string
syscall # print the prompt end part
li $v0, 5 # syscall to read an integer
syscall # read the player number
move $s2, $v0 # save player number
blt $v0, 1, bad_player # if not correct, print error
ble $v0, $s0, read_card # if correct, read card
bad_player:
# print error message
la $a0, err_player # load address of error string
li $v0, 4 # syscall to print string
syscall # print the error message
j read_player # try again
read_card:
# read card number
la $a0, prompt_cn # load address of prompt string
li $v0, 4 # syscall to print string
syscall # print the prompt
move $a0, $s1 # load maximum number of cards
li $v0, 1 # syscall to print a number
syscall # print maximum number
la $a0, prompt_end # load address of prompt end string
li $v0, 4 # syscall to print string
syscall # print the prompt end part
li $v0, 5 # syscall to read an integer
syscall # read the card number
move $s3, $v0 # save card number
blt $v0, 1, bad_card # if not correct, print error
ble $v0, $s0, display # if correct, print card
bad_card:
# print error message
la $a0, err_card # load address of error string
li $v0, 4 # syscall to print string
syscall # print the error message
j read_card # try again
display:
la $a0, bingo # load address of bingo string
li $v0, 4 # syscall to print string
syscall # print the bingo title
li $t0, 24 # size of a player entry = 24 * n cards
mult $t0, $s1 # multiply 25*number of cards
mflo $t0 # load result
addi $t1, $s2, -1 # player - 1
mult $t0, $t1 # multiply player size*(player - 1)
mflo $t0 # load result
li $t1, 24 # size of a card entry = 24
addi $t2, $s3, -1 # card - 1
mult $t1, $t2 # multiply 24*(card - 1)
mflo $t1 # load result
add $t0, $t0, $t1 # add to get start of card to print
la $t1, cards # point to start of cards
add $t0, $t0, $t1 # add to base address to get address of card
# display all numbers in card
li $t1, 5 # start with the number of numbers in row
disp_row:
li $t2, 5 # start with the number of numbers in col
disp_col:
bne $t1, 3, skip # if row not 3, display
bne $t2, 3, skip # if col not 3, display
li $v0, 11 # syscall to print a character
li $a0, 32 # load space char
syscall # print a space
syscall # print double space
j next_col # go to next column
skip:
lb $t3, 0($t0) # load number
bge $t3, 10, print # if number > 10, don't print space
li $v0, 11 # syscall to print a character
li $a0, 32 # load space char
syscall # print a space
print:
li $v0, 1 # syscall to print integer
move $a0, $t3 # load number
syscall # print the number
addi $t0, $t0, 1 # advance to next space in array
next_col:
li $v0, 11 # syscall to print a character
li $a0, 32 # load space char
syscall # print a space
addi $t2, $t2, -1 # decrement numbers
bnez $t2, disp_col # repeat loop while not zero
li $v0, 11 # syscall to print a character
li $a0, 10 # load newline char
syscall # print a newline
addi $t1, $t1, -1 # decrement numbers
bnez $t1, disp_row # repeat loop while not zero
li $v0, 11 # syscall to print a character
li $a0, 10 # load newline char
syscall # print a newline
j menu_loop # repeat loop
disp_histo:
la $t0, histo # point to start of histogram
li $t1, 1 # start in number 1
hist_loop:
bge $t1, 10, printnum # if number > 10, don't print space
li $v0, 11 # syscall to print a character
li $a0, 32 # load space char
syscall # print a space
printnum:
li $v0, 1 # syscall to print integer
move $a0, $t1 # load number
syscall # print the number
li $v0, 11 # syscall to print a character
li $a0, ':' # load colon char
syscall # print a colon
li $v0, 11 # syscall to print a character
li $a0, 32 # load space char
syscall # print a space
lb $t2, 0($t0) # load number from histogram
j ast_cmp # jump to comparison
ast_loop:
li $v0, 11 # syscall to print a character
li $a0, '*' # load asterisk char
syscall # print an asterisk
addi $t2, $t2, -1 # decrement count
ast_cmp:
bnez $t2, ast_loop # repeat while not zero
li $v0, 11 # syscall to print a character
li $a0, 10 # load newline char
syscall # print a newline
addi $t0, $t0, 1 # advance position in histogram
addi $t1, $t1, 1 # increment histogram number
ble $t1, 75, hist_loop # if num <= 75, print next
li $v0, 11 # syscall to print a character
li $a0, 10 # load newline char
syscall # print a newline
j menu_loop # repeat loop
exit:
li $v0, 10 # syscal to exit program
syscall # terminate program