;**************************************************************************
; Carnegie Mellon 18-348   lab 01  program 3 -- assembler version
; This is an example assembly program that uses PushButtons and LEDs on the
; project board. When PushButton 1 is pressed, LED1 turns on and LED2 
; turns off until PushButton 2 is pressed. When PushButton 2 is pressed, 
; LED1 turns off and LED2 turns on until PushButton 1 is pressed.

; This program uses bit 1 and bit 0 of Port T for output and bit 1 and bit
; 0 of Port M for input.
; Port T (bit 0) = MCU pin 13
; Port T (bit 1) = MCU pin 15
; Port M (bit 1) = MCU pin 26
; Port M (bit 0) = MCU pin 28
;
; For this example to work, the PushButtons and LEDs on the project board
; need to be wired to the correct MCU pins. Typically, the CSM12C32 module
; is connected to J5 on the project board.  Connectors J5, J6 and J7 are
; all connected together, so you can use the corresponding pin on J6 or J7
; to wire things to the MCU.
;
; Wire PB1 to MCU pin 28.
; Wire PB2 to MCU pin 26.
; Wire LED1 to MCU pin 13.
; Wire LED2 to MCU pin 15.
;**************************************************************************



; 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

; variable/data section

 ifdef _HCS12_SERIALMON
            ORG $3FFF - (RAMEnd - RAMStart)
 else
            ORG RAMStart
 endif
 ; Insert here your data definition.
LED_1_ON    EQU  $01
LED_2_ON    EQU  $02


; code section
            ORG   ROMStart
Entry:
            ; remap the RAM & EEPROM here. See EB386.pdf
 ifdef _HCS12_SERIALMON
            ; set registers at $0000
            CLR   $11                  ; INITRG= $0
            ; set ram to end at $3FFF
            LDAB  #$39
            STAB  $10                  ; INITRM= $39

            ; set eeprom to end at $0FFF
            LDAA  #$9
            STAA  $12                  ; INITEE= $9


            LDS   #$3FFF+1        ; See EB386.pdf, initialize the stack pointer
 else
            LDS   #RAMEnd+1       ; initialize the stack pointer
 endif
            CLI                   ; enable interrupts


;see Section 2.3.2 for full description of control registers
;configure port T for output
            CLR   RDRT            ; full strength drive
            CLR   MODRR           ; make sure pins are routed to port t
            LDAA  #$FF            ; Load RegA with 1 in each bit
            STAA  DDRT            ; set Port T to output
;configure port M as input
            CLR   PERM            ; disable pullup/pulldown
            CLR   WOMM            ; disable wired OR behavior            
            CLR   DDRM            ; set Port M to input

EndlessLoop:
            LDAA  PTM             ; Load RegA with value stored at PTM
            ANDA  #$03            ; Look at bit 1 and bit 0 of RegA
            
; NOTE: For PushButtons on Project Board, a 0 means the button is pressed
;       and a 1 means the button is not pressed, so for bit 1 and bit 0
;       of RegA we change the 0's to 1's and the 1's to 0's using an
;       exclusive or with 1's in bit 1 and bit 0
            EORA  #$03            ;
Button2:
            CMPA  #$02            ; see if button 2 is pressed
            BNE   Button1         ; if not, branch to Button1
            LDAA  #LED_2_ON       ; if so, turn on LED1 and turn off LED1
            STAA  PTT             ;
            BRA   EndlessLoop     ; restart loop
Button1:
            CMPA  #$01            ; see if button 1 is pressed
            BNE   EndlessLoop     ; if not, restart loop
            LDAA  #LED_1_ON       ; if so, turn on LED2 and turn off LED2
            STAA  PTT             ;
            BRA   EndlessLoop     ; restart loop

;**************************************************************
;*                 Interrupt Vectors                          *
;**************************************************************
            ORG   $FFFE
            DC.W  Entry           ; Reset Vector