Skip to content

Instantly share code, notes, and snippets.

@ecmartz
Forked from M-S-H/Worm
Last active December 29, 2015 12:19
Show Gist options
  • Save ecmartz/7669561 to your computer and use it in GitHub Desktop.
Save ecmartz/7669561 to your computer and use it in GitHub Desktop.
ECE344L Lab 5 - Worm Game code
#**************************************************
#
# 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