-
-
Save ecmartz/7669561 to your computer and use it in GitHub Desktop.
ECE344L Lab 5 - Worm Game code
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#************************************************** | |
# | |
# ECE 344L - Microprocessors - Fall 2013 | |
# | |
# Name: Esteban Martinez Due Date:2013-12-11 | |
# Lab Number: 5 | |
# | |
# Lab Group: Esteban Martinez | |
# Michael Hickman | |
# | |
#************************************************** | |
# | |
# | |
# | |
#************************************************** | |
# ------------------------------------------------- | |
# Definitions | |
.set UART, 0x8400 | |
.set RX, 0x00 | |
.set TX, 0x04 | |
.set CTRL, 0x0C | |
.set STAT, 0x08 | |
.set INTC, 0x8180 | |
.set ISR, 0x00 | |
.set IER, 0x08 | |
.set IAR, 0x0C | |
.set MER, 0x1C | |
.set TIMER0, 0x83C2 | |
.set TCSR0, 0x00 | |
.set TLR0, 0x04 | |
.set BTNS, 0x8140 | |
.set NORTH, 0b00001 | |
.set EAST, 0b00010 | |
.set SOUTH, 0b00100 | |
.set WEST, 0b01000 | |
.set CENTER, 0b10000 | |
.set GIE, 0x11C | |
.set IPIER, 0x128 | |
.set HSEC, 50000000 # Half second | |
# ------------------------------------------------- | |
# Registers | |
# r0 0 | |
# r1 UART pointer | |
# r2 PIT | |
# r3 Timer0 | |
# r4 Interrupt Controller | |
# r5 Temp | |
# r6 Temp | |
# r7 Temp | |
# r8 Temp | |
# r9 Buttons | |
# r10 Snake seg pointer (tail) | |
# r11 Draw Flag | |
# r12 snake size | |
# r13 Food x | |
# r14 Food y | |
# r15 Food number | |
# r16 | |
# r17 | |
# r18 | |
# r19 | |
# r20 | |
# r21 | |
# r22 | |
# r23 | |
# r24 | |
# r25 | |
# r26 | |
# r27 Shift amount (Use ASCII value) | |
# r28 Row | |
# r29 Column | |
# r30 Context Switch Pointer | |
# r31 Reserved for Context Switch 0 | |
# ------------------------------------------------- | |
# Interrupts | |
.org 0x500 | |
# context switch TEMP registers | |
stw r5, 0(r30) | |
stw r6, 4(r30) | |
stw r7, 8(r30) | |
stw r8, 12(r30) | |
lwz r5, ISR(r4) | |
andi. r5, r5, 0b0010 | |
bf 2, Timer0 | |
lwz r5,ISR(r4) | |
andi. r5,r5,0b0100 | |
bf 2,Button | |
lwz r5,ISR(r4) | |
### PASTE ME ### | |
andi. r5,r5,0b1000 | |
bf 2,Uart | |
### END ### | |
b r | |
### PASTE ME ### | |
Uart: | |
li r5, 0b1000 | |
stw r5, IAR(r4) | |
lwz r5,STAT(r1) | |
andi. r6, r5,0b0011 | |
bt 2, r | |
lwz r5, RX(r1) | |
cmpi 0, r5, 0x68 # h left | |
bt 2, curl | |
cmpi 0, r5, 0x6a # j down | |
bt 2, curd | |
cmpi 0, r5, 0x6b # k up | |
bt 2, curu | |
cmpi 0, r5, 0x6c # l right | |
bt 2, curr | |
b r | |
### END ### | |
Timer0: li r11, 1 # set draw snake flag | |
li r5,0x1d6 | |
stw r5,TCSR0(r3) | |
li r5,0b0010 | |
stw r5,IAR(r4) | |
#addi r16, r16, 1 | |
#cmpwi 0, r16, 4 | |
#bf 2, r | |
#li r5, 0x3FFC | |
#li r6, 12 | |
#stb r6, 2(r5) | |
#stb r6, 6(r5) | |
nop | |
b r | |
Button: | |
li r7, 1 | |
stw r7, 0x120(r9) | |
lwz r5, 0(r9) | |
lwz r5,0(r9) | |
andi. r6,r5,NORTH | |
bf 2,curu | |
andi. r6,r5,EAST | |
bf 2,curr | |
andi. r6,r5,SOUTH | |
bf 2,curd | |
andi. r6,r5,WEST | |
bf 2,curl | |
andi. r6,r5,CENTER | |
wrteei 0 | |
bf 2,hardreset | |
b btndone | |
curu: li r7, 0x3ffc | |
li r6, 12 | |
stb r6, 2(r7) | |
stb r6, 6(r7) | |
b btndone | |
curr: li r7, 0x3ffc | |
li r6, 3 | |
stb r6, 2(r7) | |
stb r6, 6(r7) | |
b btndone | |
curd: li r7, 0x3ffc | |
li r6, 6 | |
stb r6, 2(r7) | |
stb r6, 6(r7) | |
b btndone | |
curl: li r7, 0x3ffc | |
li r6, 9 | |
stb r6, 2(r7) | |
stb r6, 6(r7) | |
btndone: | |
li r5,0b0100 | |
stw r5,IAR(r4) | |
b r | |
r: lwz r5, 0(r30) | |
lwz r6, 4(r30) | |
lwz r7, 8(r30) | |
lwz r8, 12(r3) | |
rfi | |
# ------------------------------------------------- | |
# Setup | |
.org 0x3000 | |
hardreset: | |
#clear registers | |
bl clreg | |
li r30, 0x4100 | |
# UART & INTC pointers | |
lis r1, UART | |
lis r4, INTC | |
lis r3, TIMER0 | |
lis r9, BTNS | |
# Interrupt Enable | |
mtevpr r0 | |
li r5, 0b0011 | |
stw r5, MER(r4) | |
### REPLACE ME ### | |
li r5, 0b1110 | |
### END ### | |
stw r5, IER(r4) | |
### PASTE ME ### | |
li r5, 0x0013 | |
stw r5, CTRL(r1) | |
### END ### | |
# Clear Interrupts | |
li r5, 0b1111 | |
stw r5,IAR(r4) | |
# Enable Buttons Tristate | |
li r5,0x1f | |
stw r5,4(r9) | |
# Enable GPIO | |
lis r5,0x8000 | |
stw r5,GIE(r9) | |
li r5,1 | |
stw r5,IPIER(r9) | |
# Fill Timer0 | |
lis r5, HSEC@h | |
ori r5,r5,HSEC@l | |
stw r5,TLR0(r3) | |
# Enable Timer0 via TCSR0 | |
li r5, 0x1f6 | |
stw r5, TCSR0(r3) | |
li r5, 0x7d6 | |
stw r5, TCSR0(r3) | |
#clear screen | |
li r5, 0x1B # ESC | |
stw r5, TX(r1) | |
li r5, 0x5B # [ | |
stw r5, TX(r1) | |
li r5, 0x32 # 2 | |
stw r5, TX(r1) | |
li r5, 0x4A # J | |
stw r5, TX(r1) | |
# Draw Border | |
li r28, 1 # move to top left corner | |
li r29, 1 | |
bl moveto | |
li r5, 0x0a | |
stw r5, TX(r1) | |
li r5, 77 | |
mtctr r5 | |
li r5, 0x20 | |
stw r5, TX(r1) # write <space> | |
top: bl uwait | |
li r5, 0x58 | |
stw r5, TX(r1) # write X | |
bdnz top | |
li r5, 0x20 | |
stw r5, TX(r1) # write <space> | |
li r26, 0 # move back to top left | |
li r27, 2 | |
li r28, 0 | |
li r29, 2 | |
bl moveto | |
li r5, 21 | |
mtctr r5 | |
li r27, 0x31 # Shift amount in ASCII | |
left: bl uwait | |
bl shiftd # shift cursor down | |
li r5, 0x58 # write X | |
stw r5, TX(r1) | |
bl shiftl # shift cursor left | |
bdnz left | |
li r5, 78 | |
mtctr r5 | |
bottom: bl uwait | |
li r5, 0x58 # write X | |
stw r5, TX(r1) | |
bdnz bottom | |
bl shiftl # shift left once | |
li r5, 20 | |
mtctr r5 | |
right: bl uwait | |
bl shiftu # shift cursor up | |
li r5, 0x58 # write X | |
stw r5, TX(r1) | |
bl shiftl # shift cursor left | |
bdnz right | |
#init snake | |
li r10, 0x3FF4 | |
li r11, 0 | |
li r12, 4 | |
# ------------------------------------------------- | |
# Interrupt Enable | |
wrteei 1 | |
# ------------------------------------------------- | |
# ------------------------------------------------- | |
# Main Loop | |
main: cmpi 1, r11, 1 # check draw flag | |
bf 6, main | |
# draw/update snake | |
lbz r28, 1(r10) # get tail row | |
lbz r29, 0(r10) # get tail col | |
bl uwait | |
bl moveto # moveto tail position | |
mr r7, r10 # copy pointer to tail | |
draw: lbz r5, 3(r7) # get ascii char | |
bl uwait | |
stw r5, TX(r1) # send it | |
bl shiftl # shift left | |
lbz r5, 2(r7) # get direction | |
cmpi 0, r5, 12 # move cursor in appropriate direction | |
btl 2, shiftu | |
cmpi 0, r5, 3 | |
btl 2, shiftr | |
cmpi 0, r5, 6 | |
btl 2, shiftd | |
cmpi 0, r5, 9 | |
btl 2, shiftl | |
bl upcoor # update coordinates | |
cmpwi 0, r7, 0x4000 | |
bt 2, check | |
lbz r6, 6(r7) | |
stb r6, 2(r7) # copy direction | |
addi r7, r7, 4 # increment temp pointer to snake | |
b draw | |
check: | |
li r28, 0 | |
li r29, 0 | |
bl uwait | |
bl moveto | |
bl chb | |
#check food | |
#check border | |
#check snake | |
li r11, 0 # set draw flag | |
b main | |
# ------------------------------------------------- | |
# Subroutines | |
# update coordinates | |
upcoor: lbz r5, 2(r7) # get direction | |
cmpi 1, r5, 3 | |
bt 6, ir | |
cmpi 1, r5, 6 | |
bt 6, id | |
cmpi 1, r5, 9 | |
bt 6, il | |
cmpi 1, r5, 12 | |
bt 6, iu | |
blr | |
ir: lbz r6, 0(r7) | |
addi r6, r6, 1 | |
stb r6, 0(r7) | |
blr | |
id: lbz r6, 1(r7) | |
addi r6, r6, 1 | |
stb r6, 1(r7) | |
blr | |
il: lbz r6, 0(r7) | |
addi r6, r6, -1 | |
stb r6, 0(r7) | |
blr | |
iu: lbz r6, 1(r7) | |
addi r6, r6, -1 | |
stb r6, 1(r7) | |
blr | |
# move cursor to row/col | |
moveto: li r7, 10 # convert to ascii | |
divw r5, r28, r7 | |
mr r6, r5 | |
mullw r5, r5, r7 | |
subf r5, r5, r28 | |
addi r5, r5, 0x30 | |
li r7, 0x4004 | |
stw r5, 4(r7) | |
mr r28, r6 | |
li r7, 10 | |
divw r5, r28, r7 | |
mr r6, r5 | |
mullw r5, r5, r7 | |
subf r5, r5, r28 | |
addi r5, r5, 0x30 | |
li r7, 0x4004 | |
stw r5, 0(r7) | |
# convert col to ascii | |
li r7, 10 | |
divw r5, r29, r7 | |
mr r6, r5 | |
mullw r5, r5, r7 | |
subf r5, r5, r29 | |
addi r5, r5, 0x30 | |
li r7, 0x4004 | |
stw r5, 12(r7) | |
mr r29, r6 | |
li r7, 10 | |
divw r5, r28, r7 | |
mr r6, r5 | |
mullw r5, r5, r7 | |
subf r5, r5, r29 | |
addi r5, r5, 0x30 | |
li r7, 0x4004 | |
stw r5, 8(r7) | |
li r5, 0x1B # ESC | |
stw r5, TX(r1) | |
li r5, 0x5B # [ | |
stw r5, TX(r1) | |
lwz r5, 0(r7) # row0 | |
stw r5, TX(r1) | |
lwz r5, 4(r7) # row1 | |
stw r5, TX(r1) | |
li r5, 0x3B # ; | |
stw r5, TX(r1) | |
lwz r5, 8(r7) # col0 | |
stw r5, TX(r1) | |
lwz r5, 12(r7) # col1 | |
stw r5, TX(r1) | |
li r5, 0x48 # H | |
stw r5, TX(r1) | |
blr | |
# move cursor up | |
shiftu: | |
uwaitu: lwz r6, STAT(r1) | |
andi. r6,r6, 0x4 | |
bt 2, uwaitu | |
li r5, 0x1b # ESC | |
stw r5, TX(r1) | |
li r5, 0x5b # [ | |
stw r5, TX(r1) | |
stw r27, TX(r1) # amount | |
li r5, 0x41 # A | |
stw r5, TX(r1) | |
blr | |
# move cursor down | |
shiftd: | |
uwaitd: lwz r6, STAT(r1) | |
andi. r6,r6, 0x4 | |
bt 2, uwaitd | |
li r5, 0x1b # ESC | |
stw r5, TX(r1) | |
li r5, 0x5b # [ | |
stw r5, TX(r1) | |
stw r27, TX(r1) # amount | |
li r5, 0x42 # B | |
stw r5, TX(r1) | |
blr | |
# move cursor right | |
shiftr: | |
uwaitr: lwz r6, STAT(r1) | |
andi. r6,r6, 0x4 | |
bt 2, uwaitr | |
li r5, 0x1b # ESC | |
stw r5, TX(r1) | |
li r5, 0x5b # [ | |
stw r5, TX(r1) | |
stw r27, TX(r1) # amount | |
li r5, 0x43 # C | |
stw r5, TX(r1) | |
blr | |
# shift cursor left | |
shiftl: | |
uwaitl: lwz r6, STAT(r1) | |
andi. r6,r6, 0x4 | |
bt 2, uwaitl | |
li r5, 0x1b # ESC | |
stw r5, TX(r1) | |
li r5, 0x5b # [ | |
stw r5, TX(r1) | |
stw r27, TX(r1) # amount | |
li r5, 0x44 # B | |
stw r5, TX(r1) | |
blr | |
#check food | |
chfd: li r7, 0x4000 # pointer to head | |
lbz r5, 0(r7) # get x pos | |
lbz r6, 1(r7) # get y pos | |
cmpi 0, r5, r13 # compare x | |
bflr 2 | |
cmpi 0, r6, r14 # compare y | |
bflr 2 | |
#eat food | |
eatf: blr | |
# check border | |
chb: li r7, 0x4000 # pointer to head | |
lbz r5, 0(r7) # get x pos | |
lbz r6, 1(r7) # get y pos | |
cmpi 0, r5, 1 # compare left | |
bt 2, go | |
cmpi 0, r5, 78 # compare right | |
bt 2, go | |
cmpi 0, r6, 2 # compare top | |
bt 2, go | |
cmpi 0, r6, 22 # compare bottom | |
bt 2, go | |
blr | |
#check snake | |
chsn: li r7, 0x4000 # pointer to head | |
lbz r5, 0(r7) # get x pos | |
lbz r6, 1(r7) # get y pos | |
mr r7, r12 | |
addi r7, r7, -1 | |
mtctr r7 | |
mr r7, r10 # copy tail pointer address | |
chsnl: lbz r8, 0(r7) # get x pos of seg | |
cmpi 0, r8, r5 # compare x | |
bt 2, go | |
lbz r8, 1(r7) # get y pos of seg | |
cmpi 0, r8, r6 # compare y | |
bt 2, go | |
addi r7, r7, 4 # increment pointer | |
bdnz chsnl | |
blr | |
#game over | |
go: li r28, 11 | |
li r29, 4 | |
bl uwait | |
bl moveto | |
bl uwait | |
li r5, 0x47 # G | |
stw r5, TX(r1) | |
li r5, 0x41 # A | |
stw r5, TX(r1) | |
li r5, 0x4d # M | |
stw r5, TX(r1) | |
li r5, 0x45 # E | |
stw r5, TX(r1) | |
li r5, 0x20 | |
stw r5, TX(r1) | |
li r5, 0x4f # O | |
stw r5, TX(r1) | |
li r5, 0x56 # V | |
stw r5, TX(r1) | |
li r5, 0x45 # E | |
stw r5, TX(r1) | |
li r5, 0x52 # R | |
stw r5, TX(r1) | |
stop: b stop | |
# wait for UART | |
uwait: lwz r6, STAT(r1) | |
andi. r6,r6, 0x4 | |
bt 2, uwait | |
blr | |
clreg: li r0,0 # clear R0 | |
li r1,0 # clear R1 | |
li r2,0 # clear R2 | |
li r3,0 # clear R3 | |
li r4,0 # clear R4 | |
li r5,0 # clear R5 | |
li r6,0 # clear R6 | |
li r7,0 # clear R7 | |
li r8,0 # clear R8 | |
li r9,0 # clear R9 | |
li r10,0 # clear R10 | |
li r11,0 # clear R11 | |
li r12,0 # clear R12 | |
li r13,0 # clear R13 | |
li r14,0 # clear R14 | |
li r15,0 # clear R15 | |
li r16,0 # clear R16 | |
li r17,0 # clear R17 | |
li r18,0 # clear R18 | |
li r19,0 # clear R19 | |
li r20,0 # clear R20 | |
li r21,0 # clear R21 | |
li r22,0 # clear R22 | |
li r23,0 # clear R23 | |
li r24,0 # clear R24 | |
li r25,0 # clear R25 | |
li r26,0 # clear R26 | |
li r27,0 # clear R27 | |
li r28,0 # clear R28 | |
li r29,0 # clear R29 | |
li r30,0 # clear R30 | |
li r31,0 # clear R31 | |
mtctr r31 # clear CTR | |
#mtlr r31 # clear link reg | |
mtcr r31 # clear condition reg | |
mtspr 256,r31 # clear USPRG0 | |
mtsprg0 r31 # clear SPRG0 | |
mtsprg1 r31 # clear SPRG1 | |
mtsprg2 r31 # clear SPRG2 | |
mtsprg3 r31 # clear SPRG3 | |
mtsprg4 r31 # clear SPRG4 | |
mtsprg5 r31 # clear SPRG5 | |
mtsprg6 r31 # clear SPRG6 | |
mtsprg7 r31 # clear SPRG7 | |
mtsrr0 r31 # clear SRR0 | |
mtsrr1 r31 # clear SRR1 | |
mtsrr2 r31 # clear SRR2 | |
mtsrr3 r31 # clear SRR3 | |
mtesr r31 # clear ESR | |
mtdear r31 # clear DEAR | |
mtevpr r31 # clear EVPR | |
lis r31,0xFC00 # set up to clear TSR | |
mttsr r31 # clear the bits | |
li r31,0 # reset r31 back to 0 | |
mttcr r31 # clear TCR | |
mtpit r31 # clear PIT | |
mtxer r0 # clear XER | |
blr | |
# ------------------------------------------------- | |
# Snake Location | |
# mem for snake segments | |
.org 0x3FF4 | |
.byte 44, 12, 9, 0x20 | |
.byte 43, 12, 9, 0x6f | |
.byte 42, 12, 9, 0x78 | |
.byte 41, 12, 9, 0x23 #head | |
# mem for moveto function | |
.org 0x4004 | |
.long 0, 0, 0, 0 | |
# mem for context switch | |
.org 0x4100 | |
# mem for btn movement | |
.org 0x5000 | |
.byte 0 # Flag: has btn been pressed? | |
.org 0x7000 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment