# move pacman, starting with initialization .org 0x00000000 .align 8 .set noreorder main: addi $3,$0,8 # 8 rows/grid addi $6,$0,1315 # bonus position addi $7,$0,3845 # gost1 pos addi $8,$0,5150 # gost2 pos addi $9,$0,5764 # gost3 pos addi $4,$0,0 # rom addr, starts brow: lw $5,40($4) # addr of bonus lw $5,40($4) # addr of sw $5,0($6) # draw bonus sw $5,1($6) sw $5,2($6) sw $5,3($6) lw $5,48($4) lw $5,48($4) sw $5,0($7) lw $5,56($4) lw $5,56($4) sw $5,0($8) lw $5,64($4) lw $5,64($4) sw $5,0($9) addi $3,$3,-1 # decr row addi $4,$4,1 # incr $4 beq $3,$0,pac # loop out if 0 addi $6,$6,40 # mem offset = 40 words addi $7,$7,40 addi $8,$8,40 addi $9,$9,40 j brow pac: addi $3,$0,8 # 8 rows/grid addi $6,$0,4820 # init position addi $4,$0,0 # rom addr, starts ub1g: lw $5,0($4) # addr of 'X' lw $5,0($4) # addr of 'X' sw $5,0($6) # draw top wall addi $3,$3,-1 # decr row addi $4,$4,1 # incr $4 beq $3,$0,init # loop out if 0 addi $6,$6,40 # mem offset = 40 words j ub1g init: addi $18,$0,6 # col limit addi $17,$0,38 # col limit addi $16,$0,23 # row limit addi $9,$0,20 # init col addi $8,$0,15 # init row addi $15,$0,1 # up addi $14,$0,2 # right addi $13,$0,4 # down addi $12,$0,8 # left addi $11,$0,32767 # prep joystick ram addi $11,$11,1 addi $24,$0,0 # offset of bmp_mem game_loop: addi $10,$0,0 # clear reg lw $10,0($11) # read direction lw $10,0($11) beq $10,$15,up beq $10,$14,right beq $10,$13,down beq $10,$12,left j game_loop up: slt $5,$18,$8 # row>6? beq $5,$15,up_init # true: go up 1 grid j game_loop up_init: addi $8,$8,-1 # row-- add $5,$0,$9 # record previous col addi $2,$8,1 # record previous row addi $24,$0,8 # offset of bmp_mem j update right: slt $5,$9,$17 # col<38? beq $5,$15,rt_init # true: go right 1 grid j game_loop rt_init: addi $9,$9,1 # col++ addi $5,$9,-1 # record previous col add $2,$0,$8 # record previous row addi $24,$0,16 # offset of bmp_mem j update down: slt $5,$8,$16 # row<23? beq $5,$15,dn_init # true: go down 1 grid j game_loop dn_init: addi $8,$8,1 # row++ add $5,$0,$9 # record previous col addi $2,$8,-1 # record previous row addi $24,$0,24 # offset of bmp_mem j update left: slt $5,$15,$9 # col>1? beq $5,$15,lt_init # true: go left 1 grid j game_loop lt_init: addi $9,$9,-1 # col-- addi $5,$9,1 # record previous col add $2,$0,$8 # record previous row addi $24,$0,32 # offset of bmp_mem j update update: addi $3,$0,320 # start addr = screen row*320+col addi $20,$0,0 # current screen row addi $19,$0,0 # previous screen row sum: add $20,$20,$8 # $20+=current row add $19,$19,$2 # $19+=previous row addi $3,$3,-1 beq $3,$0,start_addr j sum # for product of row*40 start_addr: add $6,$20,$9 # current start addr add $7,$19,$5 # previous start addr addi $3,$0,8 # 8 rows add $4,$24,$0 # $4=bmp offset addi $21,$0,16000 addi $22,$0,0 delay0: addi $22,$22,1 addi $23,$0,100 delay1: addi $23,$23,-1 nop beq $23,$0,cont j delay1 cont: beq $22,$21,next_row j delay0 next_row: lw $5,0($4) lw $5,0($4) sw $5,0($6) # draw ball sw $0,0($7) addi $4,$4,1 addi $6,$6,40 # row offset = 40 addi $7,$7,40 addi $3,$3,-1 beq $3,$0,game_loop j next_row