Trying to finish up a homework assignment. I have no idea why my interrupt isn't working. The simulator gets to the "wai" command and pauses like it should, but nothing happens when I hit a button on my keypad.
What it should do:
http://www.eng.auburn.edu/~sylee/ee2220/hw08S_9.pdf
What my code looks like so far:
Code:
;*****************************************************************
;* Stephan Henning *
;* April 4, 2008 *
;* Elec 2220 *
;* Computer Systems *
;* HW9 *
;* *
;* *
;*****************************************************************
; export symbols
XDEF Entry ; export 'Entry' symbol
ABSENTRY Entry ; for absolute assembly: mark this as application entry point
; include derivative specific macros
;INCLUDE 'mc9s12c32.inc'
ROMStart EQU $4000 ; absolute address to place my code/constant data
RAMStart EQU $0800
TSCR1 EQU $0046
TFLG2 EQU $004F
NTOFS EQU 122
PORTA EQU $0000 ; port for led
PORTB EQU $0001 ; port for button columns
PTAD EQU $0270 ; port for button rows
DDRA EQU $0002
DDRB EQU $0003
DDRAD EQU $0272
INTCR EQU $001E
IRQEN EQU %01000000
; variable/data section
ORG RAMStart
leds ds.b 1 ; define leds to 1 byte
st1 ds.b 1 ; extras if needed
st2 ds.b 1
mode ds.b 1 ; mem for storing mode
step ds.b 1 ; mem for storing iteration step.
mask dc.b $FE, $FD, $FB, $F7, $EF
; Insert here your data definition.
; code section
ORG ROMStart
Entry:
;ldaa #%10000001 ;load aa with initial condition for leds
;staa leds ;store initial conidtion to leds
movb #%10000001, leds ;minimized code, same as above
lds #$1000 ; initialize stack
movb #$FF,DDRB ; port b output
movb #$00,DDRAD ; port e input
movb #$FF,DDRA ; port a output
movb leds,PORTA ; send value to leds
bset INTCR, IRQEN
cli
start:
wai
bra start
;check_again:
;ldaa PORTB
;bita #%00000011
;lbeq check_again
;bita #%00000001
;lbeq loop1
;bita #%00000010
;lbeq loop2
;lbra check_again
loop1:
ldaa #$01 ; load a mode 1
ldab #$04
loop1_1:
pshb
psha
jsr shift ; jump to shift subroutine
pula
pulb
movb leds,PORTA ; send value to led
jsr one_sec_delay ; lbranch to software delay
dbne b,loop1_1
rts
loop2:
ldaa #$00 ; load a mode 2
ldab #$06
loop2_1:
pshb
psha
jsr shift ; jump to shift subroutine
pula
pulb
movb leds,PORTA ; send value to led
jsr one_sec_delay ; lbranch to software delay
dbne b,loop2_1
rts
one_sec_delay
psha
ldaa #NTOFS
ttloop:
movb #$80 , TSCR1
movb #$80 , TFLG2
tloop: brclr TFLG2, #$80, tloop
dbne a, ttloop
movb #$00, TSCR1
pula
rts
shift ; start shift subroutine
tsta ; check a for mode
bne mode1
lbra mode2
mode1: ; lbranch for mode1
ldaa #$02
sba
blt mode1_in
lbra mode1_out
rts
mode2: ; lbranch for mode2
ldaa #$03
sba
blt mode2_in
lbra mode2_out
rts
mode1_in: ; shifts mode1 led's in
ldaa leds ; load a with leds
ldab leds ; load b with leds
anda #%11100000 ; remove unneeded values in a
andb #%00011111 ; remove unneeded values in b
lsra ;do the required shifts
lslb
lslb
lbra store_return
;stab st2 ;store to a temp mem location
;oraa st2 ;or a with what we stores in st2
;staa leds ;store a in leds
;rts
mode1_out: ;shifts mode1 led's out
ldaa leds ;load a with leds
ldab leds ;load b with leds
anda #%11100000 ;remove unneeded values in a
andb #%00011111 ;remove unneeded values in b
lsla ;do required shifts
lsrb
lsrb
lbra store_return
;stab st2 ;temp store b in mem
;oraa st2 ;or a with b that we stored in mem
;staa leds ;store result into leds
;rts
mode2_in:
ldaa leds ; load a with leds
ldab leds ; load b with leds
anda #%11110000 ; remove unneeded values in a
andb #%00001111 ; remove unneeded values in b
lsra ;do the required shifts
lslb
lbra store_return
;stab st2 ;store to a temp mem location
;oraa st2 ;or a with what we stores in st2
;staa leds ;store a in leds
;rts
mode2_out:
ldaa leds ;load a with leds
ldab leds ;load b with leds
anda #%11110000 ;remove unneeded values in a
andb #%00001111 ;remove unneeded values in b
lsla ;do required shifts
lsrb
lbra store_return
;stab st2 ;temp store b in mem
;oraa st2 ;or a with b that we stored in mem
;staa leds ;store result into leds
;rts
store_return:
stab st2 ;temp store b in mem
oraa st2 ;or a with b that we stored in mem
staa leds ;store result into leds
rts
keypad
ldx #mask
checkcol1:
movb #%11111110, PORTB
ldaa PTAD
bita $FF
lbeq checkcol2
bita 1,x+
lbeq butt0
bita 1,x+
lbeq butt4
bita 1,x+
lbeq butt8
bita 1,x+
lbeq buttc
bita 1,x+
lbeq buttleft
lbra done
checkcol2:
movb #%11111101, PORTB
ldaa PTAD
bita $FF
lbeq checkcol3
bita 1,x+
lbeq butt1
bita 1,x+
lbeq butt5
bita 1,x+
lbeq butt9
bita 1,x+
lbeq buttd
bita 1,x+
lbeq buttright
lbra done
checkcol3:
movb #%11111011, PORTB
ldaa PTAD
bita $FF
lbeq checkcol4
bita 1,x+
lbeq butt2
bita 1,x+
lbeq butt6
bita 1,x+
lbeq butta
bita 1,x+
lbeq butte
bita 1,x+
lbeq buttz
lbra done
checkcol4:
movb #%11110111, PORTB
ldaa PTAD
bita $FF
lbeq done
bita 1,x+
lbeq butt3
bita 1,x+
lbeq butt7
bita 1,x+
lbeq buttb
bita 1,x+
lbeq buttf
bita 1,x+
lbeq buttblank
lbra done
butt0:
lbra done
butt1:
jsr loop1
lbra done
butt2:
jsr loop2
lbra done
butt3:
lbra done
butt4:
lbra done
butt5:
lbra done
butt6:
lbra done
butt7:
lbra done
butt8:
lbra done
butt9:
lbra done
butta:
lbra done
buttb:
lbra done
buttc:
lbra done
buttd:
lbra done
butte:
lbra done
buttf:
lbra done
buttleft:
lbra done
buttright:
lbra done
buttz:
lbra done
buttblank:
lbra done
done:
rti
;**************************************************************
;* Interrupt Vectors *
;**************************************************************
ORG $FFFE
DC.W Entry ; Reset Vector
ORG $FFF2
dc.w keypad ; keypad interupt
Any ideas?