Porty HC08. Obsluha tlačítkové klávesnice, LED

;
; IMP laborator c. 2
; HC08 ports, LEDs, 12-button keyboard 
; https://www.fit.vutbr.cz/study/courses/IMP/private/VYUKA/CVICENI_A_LABORATORE/lab2/
; ak.r. 2008/2009                   
;
; -----------------------------------------------------------------------------
; export symbols
            XDEF Entry        ; export 'Entry' symbol
            ABSENTRY Entry    ; for absolute assembly: mark this as application entry point
 
; include derivative specific macros
            Include 'derivative.inc'
 
; -----------------------------------------------------------------------------
VectorStart EQU  $FFDA  	; start address of interrupt vectors table
 
; -----------------------------------------------------------------------------
            ORG RAMStart	; variable/data section
entered_code    ds.b 64
app_running_tag ds.b 1
 
            ORG ROMStart	; code section
 
; -----------------------------------------------------------------------------
; application starts here after HC08 is reseted
Entry:
       cli                		; enable interrupts
       mov  #$01,CONFIG1   		; disable Computer Operating Properly (COP) Module
       jsr  Init_SCI	   	        ; init Serial Communication Interface (SCI) Module
       jsr  Init_ButtonRelated_Ports	; init button-related ports
       clrh
       clrx
 
       lda #$FF
       sta app_running_tag              ; zapni priznak bezici aplikace (1...1)
 
; -----------------------------------------------------------------------------
;*************************
; hlavni smycka aplikace *
;*************************
 
btn_test_loop:
;---------------------------
;Column1 | Column2 | Column3
;---------------------------
;---------------------------
;    1   |    2    |    3   |   <- btn_value (associated character)
;   SA7  |   SA8   |   SA9  |   <- btn_ID
;---------------------------
;    4   |    5    |    6   |
;   SA4  |   SA5   |   SA6  |
;---------------------------
;    7   |    8    |    9   |
;   SA1  |   SA2   |   SA3  |
;---------------------------
;    *   |    0    |    #   |
;   SA10 |   SA11  |   SA12 |
;---------------------------
       jsr testColumn1  ; testuj tlacitka v levem sloupci: podprogram HOTOV
       jsr testColumn2  ; testuj tlacitka v prostrednim sloupci: ### DOPLNIT KOD podprogramu ! ###
       jsr testColumn3  ; testuj tlacitka v pravem sloupci: ### DOPLNIT KOD podprogramu ! ###
 
       jsr BlinkVL2_red ; probliknuti cervene LED (VL2)
 
       ; detekce priznaku pozadavku na ukonceni aplikace
       psha
       lda app_running_tag
       pula
 
       beq end_loop     ; je-li priznak==0, pak pozadavek na konec aplikace vznikl -> skoc na end_loop
       jmp btn_test_loop; jinak aplikace bezi dale
 
; -----------------------------------------------------------------------------
end_loop:
        jsr LightOnVL1_green    ; ### DOPLNIT KOD do podprogramu
        bra end_loop
 
 
 
 
 
 
 
;*********************************************
; podprogramy pro test tlacitek ve sloupcich *
;*********************************************
; -----------------------------------------------------------------------------
; testuj tlacitka v levem sloupci, tj. tlacitka SA7, SA4, SA1, SA10
; -----------------------------------------------------------------
; nebylo-li stisknuto tlacitko z tohoto sloupce pak skonci,
; tj. umozni test stavu tlacitek z prostredniho sloupce (Column2)
testColumn1:
      mov  #$30,PTC ; -> PTC6 = 0, PTC5 = PTC4 = 1, ostatni PTCi = 0
      lda  PTD
      psha 
      and  #$F0     ; maskuj PTD-bity 7-4 (PTDi bit je 0 je-li prislusne tlacitko stisknuto)
      eor  #$F0     ; chceme aby "PTDi byl 1 je-li prislusne tlacitko stisknuto" a proto invertujeme bity
      pula
      beq  testColumn1_end ; v levem sloupci nebylo zjisten pokus o stisk tlacitka -> testuj prostredni sloupec
 
; nektere z tlacitek v levem sloupci bylo stisknuto - zjisti ktere a proved prislusnou akci
; (pozn.: nize se v danem okamziku predpoklada stisk nejvyse jednoho tlacitka;
; obsluha soucasneho stisku vice tlacitek resena prioritami)
      brset 4,PTD,SA7_depressed ; SA5 nestisknuto -> testuj dalsi tlacitko ve sloupci 
      jsr   DelayB              ; pravdepodobne bylo stisknuto SA7; chvili pockej (az zaniknou pripadne zakmity tlacitka), pak testuj znovu na stisk
      brset 4,PTD,SA7_depressed
      lda #'1'                  ; SA8 (znak '1') bylo skutecne stisknuto
      jsr Store_and_Send_char
      bra  testColumn1_end
SA7_depressed:
      brset 5,PTD,SA4_depressed ; SA4 nestisknuto -> testuj dalsi tlacitko ve sloupci 
      jsr DelayB  	        ; pravdepodobne bylo stisknuto SA4; chvili pockej (az zaniknou pripadne zakmity tlacitka), pak testuj znovu na stisk
      brset 5,PTD,SA4_depressed
      lda #'4'                  ; SA4 (znak '4') bylo skutecne stisknuto
      jsr Store_and_Send_char
      bra  testColumn1_end
SA4_depressed:
      brset 6,PTD,SA1_depressed ; SA1 nestisknuto -> testuj dalsi tlacitko ve sloupci 
      jsr DelayB    	        ; pravdepodobne bylo stisknuto SA1; chvili pockej (az zaniknou pripadne zakmity tlacitka), pak testuj znovu na stisk
      brset 6,PTD,SA1_depressed
      lda #'7'	                ; SA1 (znak '7') bylo skutecne stisknuto
      jsr Store_and_Send_char
      bra  testColumn1_end
SA1_depressed:
      brset 7,PTD,SA10_depressed; SA10 nestisknuto -> testuj dalsi tlacitko ve sloupci 
      jsr DelayB	        ; pravdepodobne bylo stisknuto SA10; chvili pockej (az zaniknou pripadne zakmity tlacitka), pak testuj znovu na stisk
      brset 7,PTD,SA10_depressed
      lda #'*'                  ; SA10 (znak '*') bylo skutecne stisknuto
      jsr Store_and_Send_char
 
      bra  testColumn1_end
SA10_depressed:
testColumn1_end:
      rts
 
 
; -----------------------------------------------------------------------------
; testuj tlacitka v prostrednim sloupci, tj. tlacitka SA8, SA5, SA2, SA11
; -----------------------------------------------------------------------
; nebylo-li stisknuto tlacitko z tohoto sloupce pak skonci,
; tj. umozni test stavu tlacitek z praveho sloupce (Column3)
testColumn2:
      mov  #$50,PTC ; -> PTC6 = 0, PTC5 = PTC4 = 1, ostatni PTCi = 0
      lda  PTD
      psha 
      and  #$F0     ; maskuj PTD-bity 7-4 (PTDi bit je 0 je-li prislusne tlacitko stisknuto)
      eor  #$F0     ; chceme aby "PTDi byl 1 je-li prislusne tlacitko stisknuto" a proto invertujeme bity
      pula
      beq  testColumn2_end ; v levem sloupci nebylo zjisten pokus o stisk tlacitka -> testuj prostredni sloupec
 
; nektere z tlacitek v levem sloupci bylo stisknuto - zjisti ktere a proved prislusnou akci
; (pozn.: nize se v danem okamziku predpoklada stisk nejvyse jednoho tlacitka;
; obsluha soucasneho stisku vice tlacitek resena prioritami)
      brset 4,PTD,SA8_depressed ; SA7 nestisknuto -> testuj dalsi tlacitko ve sloupci 
      jsr   DelayB              ; pravdepodobne bylo stisknuto SA7; chvili pockej (az zaniknou pripadne zakmity tlacitka), pak testuj znovu na stisk
      brset 4,PTD,SA8_depressed
      lda #'2'                  ; SA7 (znak '1') bylo skutecne stisknuto
      jsr Store_and_Send_char
      bra  testColumn2_end
SA8_depressed:
      brset 5,PTD,SA5_depressed ; SA4 nestisknuto -> testuj dalsi tlacitko ve sloupci 
      jsr DelayB  	        ; pravdepodobne bylo stisknuto SA4; chvili pockej (az zaniknou pripadne zakmity tlacitka), pak testuj znovu na stisk
      brset 5,PTD,SA5_depressed
      lda #'5'                  ; SA4 (znak '4') bylo skutecne stisknuto
      jsr Store_and_Send_char
      bra  testColumn2_end
SA5_depressed:
      brset 6,PTD,SA2_depressed ; SA1 nestisknuto -> testuj dalsi tlacitko ve sloupci 
      jsr DelayB    	        ; pravdepodobne bylo stisknuto SA1; chvili pockej (az zaniknou pripadne zakmity tlacitka), pak testuj znovu na stisk
      brset 6,PTD,SA2_depressed
      lda #'8'	                ; SA1 (znak '7') bylo skutecne stisknuto
      jsr Store_and_Send_char
      bra  testColumn2_end
SA2_depressed:
      brset 7,PTD,SA11_depressed; SA10 nestisknuto -> testuj dalsi tlacitko ve sloupci 
      jsr DelayB	        ; pravdepodobne bylo stisknuto SA10; chvili pockej (az zaniknou pripadne zakmity tlacitka), pak testuj znovu na stisk
      brset 7,PTD,SA11_depressed
      lda #'0'                  ; SA10 (znak '*') bylo skutecne stisknuto
      jsr Store_and_Send_char
 
      bra  testColumn2_end
SA11_depressed:
testColumn2_end:
 
        rts
 
; -----------------------------------------------------------------------------
; testuj tlacitka v pravem sloupci, tj. tlacitka SA9, SA6, SA3, SA12
; -----------------------------------------------------------------
; nebylo-li stisknuto tlacitko z tohoto sloupce pak skonci,
; tj. umozni test stavu tlacitek z leveho sloupce (Column1)
; po stisku SA12 nastavte priznak app_running_tag na 0 
testColumn3:
      mov  #$60,PTC ; -> PTC6 = 0, PTC5 = PTC4 = 1, ostatni PTCi = 0
      lda  PTD
      psha 
      and  #$F0     ; maskuj PTD-bity 7-4 (PTDi bit je 0 je-li prislusne tlacitko stisknuto)
      eor  #$F0     ; chceme aby "PTDi byl 1 je-li prislusne tlacitko stisknuto" a proto invertujeme bity
      pula
      beq  testColumn3_end ; v levem sloupci nebylo zjisten pokus o stisk tlacitka -> testuj prostredni sloupec
 
; nektere z tlacitek v levem sloupci bylo stisknuto - zjisti ktere a proved prislusnou akci
; (pozn.: nize se v danem okamziku predpoklada stisk nejvyse jednoho tlacitka;
; obsluha soucasneho stisku vice tlacitek resena prioritami)
      brset 4,PTD,SA9_depressed ; SA7 nestisknuto -> testuj dalsi tlacitko ve sloupci 
      jsr   DelayB              ; pravdepodobne bylo stisknuto SA7; chvili pockej (az zaniknou pripadne zakmity tlacitka), pak testuj znovu na stisk
      brset 4,PTD,SA9_depressed
      lda #'3'                  ; SA7 (znak '1') bylo skutecne stisknuto
      jsr Store_and_Send_char
      bra  testColumn3_end
SA9_depressed:
      brset 5,PTD,SA6_depressed ; SA4 nestisknuto -> testuj dalsi tlacitko ve sloupci 
      jsr DelayB  	        ; pravdepodobne bylo stisknuto SA4; chvili pockej (az zaniknou pripadne zakmity tlacitka), pak testuj znovu na stisk
      brset 5,PTD,SA6_depressed
      lda #'6'                  ; SA4 (znak '4') bylo skutecne stisknuto
      jsr Store_and_Send_char
      bra  testColumn3_end
SA6_depressed:
      brset 6,PTD,SA3_depressed ; SA1 nestisknuto -> testuj dalsi tlacitko ve sloupci 
      jsr DelayB    	        ; pravdepodobne bylo stisknuto SA1; chvili pockej (az zaniknou pripadne zakmity tlacitka), pak testuj znovu na stisk
      brset 6,PTD,SA3_depressed
      lda #'9'	                ; SA1 (znak '7') bylo skutecne stisknuto
      jsr Store_and_Send_char
      bra  testColumn3_end
SA3_depressed:
      brset 7,PTD,SA12_depressed; SA10 nestisknuto -> testuj dalsi tlacitko ve sloupci 
      jsr DelayB	        ; pravdepodobne bylo stisknuto SA10; chvili pockej (az zaniknou pripadne zakmity tlacitka), pak testuj znovu na stisk
      brset 7,PTD,SA12_depressed
      lda #'#'                  ; SA10 (znak '*') bylo skutecne stisknuto
      jsr Store_and_Send_char
      lda #$00
      sta app_running_tag              ; zapni priznak bezici aplikace (1...1)
      bra  testColumn3_end
SA12_depressed:
testColumn3_end:
 
        rts
 
 
; -----------------------------------------------------------------------------
;******************************
; podprogramy pro blikani LED *
;******************************
LightOnVL1_green:
        ; doplnte chybejici kod podprogramu LightOnVL1_green umisteneho nize
;light-ON
	bset	4,DDRB
	bclr	4,PTB
        rts
 
;-----
 
BlinkVL2_red:
;light-ON diode V2 (red)
	bset	5,DDRB
	bclr	5,PTB
	jsr		DelayA	;ON-time
;light-OFF V2
	bclr	5,DDRB
	bset	5,PTB
	jsr		DelayA	;OFF-time
	rts
 
; -----------------------------------------------------------------------------
;********************************
;* podprogramy pro praci s SCI  *
;********************************
Init_SCI:
       mov   #$A2,SCBR       ; Baud Rate = 9600 @ 9,8MHZ-BUS CLK
       mov   #$40,SCC1       ; Enable the SCI peripheral
       mov   #$0C,SCC2       ; Enable the SCI transmitter and receiver
       clr   SCC3            ; Clear
       rts
 
Store_and_Send_char:
        sta	entered_code,X    ; store char in RAM
        incx
        brclr   7,SCS1,*        
        sta     SCDR              ; send char via SCI
   	jsr	DelayB
        rts
 
; -----------------------------------------------------------------------------
;**************************
;* inicializace portu MCU *
;**************************
Init_ButtonRelated_Ports:
    mov     #$70,DDRC	; set PTC4-PT6 as output bits in PTC
    clr     PTC		; ensure "0" occurs at PTC7-PTC0
    clr     DDRD        ; set PTD0-PTD7 as input bits in PTD
    mov     #$02,KBSCR  ; init KBI, mask KBI interrupts, KBI edge-detection ON
    mov     #$F0,KBIER  ; pull-ups at PTD4..7
    rts
 
; -----------------------------------------------------------------------------
;**************************
;* zpozdovaci smycky A, B *
;**************************
DelayA:
	psha
	lda		#$7F
delayA1:
 
	psha
	lda		#$7F
delayA2:
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	dbnza	delayA2
	pula
 
	dbnza	delayA1
	pula
 
	rts
 
;--------------------------------------
DelayB:
	psha
	lda		#$8F
delayB1:
 
	psha
	lda		#$60
delayB2:
 
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	nop
 
	dbnza	delayB2
	pula
 
	dbnza	delayB1
	pula
 
	rts
 
 
; -----------------------------------------------------------------------------
;*******************************************************
;* Obsluhy preruseni (ISR) a tabulka vektoru preruseni *
;*******************************************************
spurious:
            NOP
            RTI
 
;------------------------------------------------------------------
isr_keyb:
            NOP
            RTI
 
; -----------------------------------------------------------------------------
        ORG  VectorStart	
;------------------------------------------------------------------
; 	routine	          vector description        vector address
;------------------------------------------------------------------
	fdb  spurious	; Real-time Clock Vector  ,     $FFDA
	fdb  spurious   ; ADC Conversion Complete ,     $FFDC
	fdb  isr_keyb   ; Keyboard Vector	  ,     $FFDE
	fdb  spurious   ; SCI Transmit Vector	  ,     $FFE0
	fdb  spurious   ; SCI Receive Vector	  ,     $FFE2
	fdb  spurious   ; SCI Error Vector	  ,     $FFE4
	fdb  spurious   ; SPI Receive Vector	  ,     $FFE6
	fdb  spurious   ; SPI Transmit Vector	  ,     $FFE8
	fdb  spurious	; TIM2 Overflow Vector    ,     $FFEA
	fdb  spurious   ; TIM2 Channel 1 Vector	  ,     $FFEC
	fdb  spurious   ; TIM2 Channel 0 Vector	  ,     $FFEE
	fdb  spurious   ; TIM1 Overflow Vector	  ,     $FFF0
	fdb  spurious   ; TIM1 Channel 1 Vector	  ,     $FFF2
	fdb  spurious   ; TIM1 Channel 0 Vector	  ,     $FFF4
	fdb  spurious   ; PLL Vector		  ,     $FFF6
	fdb  spurious   ; LVI Vector		  ,     $FFF8
	fdb  spurious   ; ~IRQ1 Vector		  ,     $FFFA
	fdb  spurious   ; SWI Vector		  ,     $FFFC
	fdb  Entry      ; Reset Vector		  ,     $FFFE