Skip to content

Instantly share code, notes, and snippets.

@M-S-H
Last active December 29, 2015 11:49
Show Gist options
  • Save M-S-H/7666493 to your computer and use it in GitHub Desktop.
Save M-S-H/7666493 to your computer and use it in GitHub Desktop.
#**************************************************
#
# 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 HEAD, 0x3FFC
.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 Tail Pointer
# r11 Draw Flag
# r12 snake size
# r13 Food x
# r14 Food y
# r15 Food number
# r16 Food pointer
# r17 Food Flag
# r18 Grow Flag
# r19 Stack Pointer
# r20 tail ascii value
# 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)
andi. r5,r5,0b1000
bf 2,Uart
b r
Timer0: li r11, 1 # set draw snake flag
li r5,0x1d6
stw r5,TCSR0(r3)
li r5,0b0010
stw r5,IAR(r4)
b r
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
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, 10(r7)
b btndone
curr: li r7, 0x3FFC
li r6, 3
stb r6, 2(r7)
#stb r6, 10(r7)
b btndone
curd: li r7, 0x3FFC
li r6, 6
stb r6, 2(r7)
#stb r6, 10(r7)
b btndone
curl: li r7, 0x3FFC
li r6, 9
stb r6, 2(r7)
#stb r6, 10(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(r30)
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)
li r5, 0b1110
stw r5, IER(r4)
li r5, 0x0013
stw r5, CTRL(r1)
# 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
#generate random numbers
li r5, 0x6000
li r6, 60 # results in 80 food
mtctr r6
mftbl r6
#li r6, 10
numgen: srawi r7, r6, 18 # generate words
andi. r7, r7, 1
srawi r8, r6, 5
andi. r8, r8, 1
xor r8, r7, r8
li r7, 1
slw r6, r6, r7
or r6, r6, r8
stw r6, 0(r5)
addi r5, r5, 4
bdnz numgen
li r31, 0x33
li r5, 0x6000 # make values usable
li r6, 240
mtctr r6
fnum:
frow: lbz r6, 0(r5) # make row
li r7, 18
divw r8, r6, r7
mullw r8, r8, r7
subf r8, r8, r6
addi r8, r8, 3
stb r8, 0(r5)
fcol: lbz r6, 1(r5)
li r7, 75
divw r8, r6, r7
mullw r8, r8, r7
subf r8, r8, r6
addi r8, r8, 3
stb r8, 1(r5)
ffd: lbz r6, 2(r5)
li r7, 8
divw r8, r6, r7
mullw r8, r8, r7
subf r8, r8, r6
addi r8, r8, 1
stb r8, 2(r5)
addi r5, r5, 3
bdnz fnum
# init food
li r16, 0x6060 # food pointer
lbz r28, 0(r16) # row
lbz r29, 1(r16) # col
mr r14, r28
mr r13, r29
bl uwait
bl moveto
lbz r15, 2(r16)
addi r5, r15, 0x30
#b .
#bl uwait
stw r5, TX(r1)
addi r16, r16, 3
li r17, 0
#init snake
li r10, 0x3FE4
li r11, 0
li r12, 3
bl sinit
li r20, 0x78 # x
# clear score
li r8, 0x4400
stw r0, 0(r8)
stw r0, 4(r8)
stw r0, 8(r8)
# -------------------------------------------------
# Interrupt Enable
wrteei 1
# -------------------------------------------------
# -------------------------------------------------
# Main Loop
main: cmpi 1, r11, 1 # check draw flag
bf 6, main
mr r7, r10 # move tail pointer to r7
# check for grow
cmpwi 0, r18, 0x0
bt 2, mc
addi r10, r10, -8 # decrement tail pointer
lwz r5, 0(r7) # copy values
stw r5, 0(r10)
stb r20, 3(r7) # sets ascii value
stw r7, 4(r10) # copy pointer to new tail
bl chas #
lbz r28, 1(r10)
lbz r29, 0(r10)
bl uwait
bl moveto
addi r18, r18, -1
addi r12, r12, 1
mr r7, r10
b draw
# move cursor to tail
mc: bl upcoor # update tail coordinate
lbz r28, 1(r7) # get tail row
lbz r29, 0(r7) # get tail col
bl uwait
bl moveto # move to tail position
mr r7, r10 # move tail pointer to r7
# draw snake
draw: lbz r5, 3(r7) # get segment ascii char
bl uwait
stw r5, TX(r1) # write to UART
bl shiftl
mr r6, r7 # move current seg pointer to r6
lwz r7, 4(r7) # get pointer to next segment
cmpwi 0, r7, 0x0 # check if head
bt 2, df
lbz r5, 2(r7) # get direction of next
stb r5, 2(r6) # copy direction
bl upcoor
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
b draw
# draw food
df: cmpi 0, r17, 1
bf 2, check
lbz r28, 0(r16) # row
lbz r29, 1(r16) # col
mr r14, r28
mr r13, r29
bl uwait
bl moveto
lbz r15, 2(r16) # number value
addi r5, r15, 0x30
stw r5, TX(r1)
addi r16, r16, 3
li r17, 0
# collision detection
check: bl chb # check if in border
bl chfd # check if ate food
bl chsn #check snake
# display score
li r28, 24
li r29, 2
bl uwait
bl moveto
bl uwait
bl disps
li r28, 0
li r29, 0
bl uwait
bl moveto
li r11, 0 # set draw flag
b main
# -------------------------------------------------
# Subroutines
# snake grow routine
grow: mr r7, r10 # copy tail pointer
addi r7, r7, -8 # pointer to new segment
lwz r5, 0(r10) # copy segment values
stw r5, 0(r7)
stw r10, 4(r7) # copy pointer
stb r20, 3(r10) # make ascii value
addi r18, r18, -1 # decrement grow flag
blr
#change ascii value for segments
chas: cmpi 0, r20, 0x78
bt 2, cho
li r20, 0x78
blr
cho: li r20, 0x6F
blr
# display score
disps: li r5, 0x53 # S
stw r5, TX(r1)
li r5, 0x63 # c
stw r5, TX(r1)
li r5, 0x6F # o
stw r5, TX(r1)
li r5, 0x72 # r
stw r5, TX(r1)
li r5, 0x65 # e
stw r5, TX(r1)
li r5, 0x3a # :
stw r5, TX(r1)
li r5, 0x20 # space
stw r5, TX(r1)
li r8, 0x4400
lwz r5, 8(r8)
addi r5, r5, 0x30
stw r5, TX(r1)
lwz r5, 4(r8)
addi r5, r5, 0x30
stw r5, TX(r1)
lwz r5, 0(r8)
addi r5, r5, 0x30
stw r5, TX(r1)
blr
# 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 # Bbp: b bp
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, 0x3FFC # pointer to head
lbz r5, 0(r7) # get x pos
lbz r6, 1(r7) # get y pos
cmp 0, r5, r13 # compare x
bflr 2
cmp 0, r6, r14 # compare y
bflr 2
eatf: addi r17, r17, 1
mr r18, r15
#update score
li r8, 0x4400 # pointer to score
lwz r5, 0(r8) # get fist digit
add r5, r5, r15 # add score
stw r5, 0(r8)
cmpi 0, r5, 9 # compare with 9
bflr 1
li r7, 10
subf r5, r7, r5
stw r5, 0(r8)
lwz r5, 4(r8)
addi r5, r5, 1
stw r5, 4(r8)
cmpi 0, r5, 9
bflr 1
subf r5, r7, r5
stw r5, 4(r8)
lwz r5, 8(r8)
addi r5, r5, 1
stw r5, 8(r8)
blr
# check border
chb: li r7, 0x3FFC # pointer to head
lbz r5, 0(r7) # get x pos
lbz r6, 1(r7) # get y pos
cmpi 0, r5, 2 # compare left
bt 2, go
cmpi 0, r5, 79 # 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, 0x3FFC # pointer to head
lbz r5, 0(r7) # get x pos
lbz r6, 1(r7) # get y pos
lwz r7, 4(r10)
chsnl: lbz r8, 0(r7) # get x pos of seg
cmp 0, r8, r5 # compare x position
bf 2, chn
lbz r8, 1(r7) # get y pos of seg
cmp 0, r8, r6 # compare y position
bt 2, go
chn: lwz r7, 4(r7)
cmpwi 0, r7, 0x3FFC
btlr 2
b chsnl
#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
# initialize snake in memory
sinit: li r5, 0x3FE4
lis r6, 0x2C0C
ori r6, r6, 0x0920
stw r6, 0(r5)
li r6, 0x3FEC
stw r6, 4(r5)
addi r5, r5, 8
lis r6, 0x2B0C
ori r6, r6, 0x096F
stw r6, 0(r5)
li r6, 0x3FF4
stw r6, 4(r5)
addi r5, r5, 8
lis r6, 0x2A0C
ori r6, r6, 0x0978
stw r6, 0(r5)
li r6, 0x3FFC
stw r6, 4(r5)
addi r5, r5, 8
lis r6, 0x290C
ori r6, r6, 0x0923
stw r6, 0(r5)
li r6, 0
stw r6, 4(r5)
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 0x3FE4
.long 0, 0, 0, 0, 0, 0, 0, 0
# mem for moveto function
.org 0x4004
.long 0, 0, 0, 0
# mem for context switch
.org 0x4100
# mem for score
.org 0x4400
.long 0, 0, 0
# mem for btn movement
.org 0x5000
.byte 0 # Flag: has btn been pressed?
.org 0x6000
.long 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
.long 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
.long 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
.long 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
.long 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
.long 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
.long 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
.long 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment