matrix.inc
author Tero Marttila <terom@fixme.fi>
Mon, 30 Aug 2010 00:45:38 +0300
changeset 39 d7eac199d323
parent 38 f430b507a885
child 42 99a179b64e6a
permissions -rw-r--r--
Implement Text_Load/ShowString
33
0d0309787be3 Working matrix scan
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     1
;; LED Matrix driver
38
f430b507a885 Working font rendering on LED matrix
Tero Marttila <terom@fixme.fi>
parents: 36
diff changeset
     2
;; vim: set ft=avr:
33
0d0309787be3 Working matrix scan
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     3
36
06e1e554acbb Rename Matrix_ShiftRight to ShiftLeft, improve matrix.inc documentation
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
     4
.dseg
06e1e554acbb Rename Matrix_ShiftRight to ShiftLeft, improve matrix.inc documentation
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
     5
;; I/O addresses
06e1e554acbb Rename Matrix_ShiftRight to ShiftLeft, improve matrix.inc documentation
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
     6
; Control port
33
0d0309787be3 Working matrix scan
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     7
.set MATRIX_DDR = DDRB
0d0309787be3 Working matrix scan
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     8
.set MATRIX_PORT = PORTB
36
06e1e554acbb Rename Matrix_ShiftRight to ShiftLeft, improve matrix.inc documentation
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
     9
06e1e554acbb Rename Matrix_ShiftRight to ShiftLeft, improve matrix.inc documentation
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
    10
; Pin for matrix driver Output Enable
33
0d0309787be3 Working matrix scan
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    11
.set MATRIX_OE = PORTB1		; Output Enable, active low, externally pulled high
0d0309787be3 Working matrix scan
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    12
36
06e1e554acbb Rename Matrix_ShiftRight to ShiftLeft, improve matrix.inc documentation
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
    13
;; Matrix properties
06e1e554acbb Rename Matrix_ShiftRight to ShiftLeft, improve matrix.inc documentation
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
    14
; Matrix width in columns
06e1e554acbb Rename Matrix_ShiftRight to ShiftLeft, improve matrix.inc documentation
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
    15
.set MATRIX_COLS = 8                        ; physical columns
33
0d0309787be3 Working matrix scan
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    16
36
06e1e554acbb Rename Matrix_ShiftRight to ShiftLeft, improve matrix.inc documentation
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
    17
; Framebuffer width in columns
06e1e554acbb Rename Matrix_ShiftRight to ShiftLeft, improve matrix.inc documentation
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
    18
.set MATRIX_BUF_COLS = 16		            ; framebuffer columns
06e1e554acbb Rename Matrix_ShiftRight to ShiftLeft, improve matrix.inc documentation
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
    19
06e1e554acbb Rename Matrix_ShiftRight to ShiftLeft, improve matrix.inc documentation
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
    20
;; SPI addresses
06e1e554acbb Rename Matrix_ShiftRight to ShiftLeft, improve matrix.inc documentation
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
    21
; row drivers (8 bits)
06e1e554acbb Rename Matrix_ShiftRight to ShiftLeft, improve matrix.inc documentation
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
    22
.set MATRIX_SPI_ROW = 0                     ; row mask source
06e1e554acbb Rename Matrix_ShiftRight to ShiftLeft, improve matrix.inc documentation
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
    23
06e1e554acbb Rename Matrix_ShiftRight to ShiftLeft, improve matrix.inc documentation
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
    24
; column sinks (8 bits)
06e1e554acbb Rename Matrix_ShiftRight to ShiftLeft, improve matrix.inc documentation
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
    25
.set MATRIX_SPI_COL = 1                     ; column scan sink
06e1e554acbb Rename Matrix_ShiftRight to ShiftLeft, improve matrix.inc documentation
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
    26
06e1e554acbb Rename Matrix_ShiftRight to ShiftLeft, improve matrix.inc documentation
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
    27
;; Matrix state
06e1e554acbb Rename Matrix_ShiftRight to ShiftLeft, improve matrix.inc documentation
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
    28
; Matrix framebuffer
06e1e554acbb Rename Matrix_ShiftRight to ShiftLeft, improve matrix.inc documentation
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
    29
; this holds the columns data as a 1 byte bitmask of row data per column (8 bits -> 8 rows)
06e1e554acbb Rename Matrix_ShiftRight to ShiftLeft, improve matrix.inc documentation
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
    30
matrix_colbuf:	    .byte MATRIX_BUF_COLS   ; framebuffer (row data by column)
06e1e554acbb Rename Matrix_ShiftRight to ShiftLeft, improve matrix.inc documentation
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
    31
06e1e554acbb Rename Matrix_ShiftRight to ShiftLeft, improve matrix.inc documentation
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
    32
; Column scan bit
06e1e554acbb Rename Matrix_ShiftRight to ShiftLeft, improve matrix.inc documentation
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
    33
; in the matrix refresh loop, we push out each column's row data in turn
06e1e554acbb Rename Matrix_ShiftRight to ShiftLeft, improve matrix.inc documentation
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
    34
; this bit tracks the currently refreshing column
06e1e554acbb Rename Matrix_ShiftRight to ShiftLeft, improve matrix.inc documentation
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
    35
matrix_colbit:	    .byte 1                 ; column scan bit
06e1e554acbb Rename Matrix_ShiftRight to ShiftLeft, improve matrix.inc documentation
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
    36
06e1e554acbb Rename Matrix_ShiftRight to ShiftLeft, improve matrix.inc documentation
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
    37
; Matrix viewport offset
06e1e554acbb Rename Matrix_ShiftRight to ShiftLeft, improve matrix.inc documentation
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
    38
; the visible matrix data is taken directly from the framebuffer, but it can be taken at an arbitrary offset
06e1e554acbb Rename Matrix_ShiftRight to ShiftLeft, improve matrix.inc documentation
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
    39
; this determines the starting offset for the visible viewport's left edge from the start of the framebuffer in columns
06e1e554acbb Rename Matrix_ShiftRight to ShiftLeft, improve matrix.inc documentation
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
    40
matrix_colshift:    .byte 1                 ; viewport left column offset
33
0d0309787be3 Working matrix scan
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    41
39
d7eac199d323 Implement Text_Load/ShowString
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
    42
d7eac199d323 Implement Text_Load/ShowString
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
    43
;; Text
d7eac199d323 Implement Text_Load/ShowString
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
    44
; Maximum length of message
d7eac199d323 Implement Text_Load/ShowString
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
    45
.set TEXT_MAXLENGTH = 64
d7eac199d323 Implement Text_Load/ShowString
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
    46
d7eac199d323 Implement Text_Load/ShowString
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
    47
; Scrolling speed (kiloticks per frame)
d7eac199d323 Implement Text_Load/ShowString
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
    48
.set TEXT_SPEED = 1
d7eac199d323 Implement Text_Load/ShowString
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
    49
d7eac199d323 Implement Text_Load/ShowString
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
    50
text_buffer:        .byte TEXT_MAXLENGTH    ; display message buffer
d7eac199d323 Implement Text_Load/ShowString
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
    51
text_offset:        .byte 1                 ; current offset in text
d7eac199d323 Implement Text_Load/ShowString
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
    52
33
0d0309787be3 Working matrix scan
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    53
.cseg
0d0309787be3 Working matrix scan
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    54
36
06e1e554acbb Rename Matrix_ShiftRight to ShiftLeft, improve matrix.inc documentation
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
    55
;; Normalize the outputs, enable the matrix, and set up buffers
33
0d0309787be3 Working matrix scan
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    56
Matrix_Init:
0d0309787be3 Working matrix scan
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    57
    ; Setup ENable port
0d0309787be3 Working matrix scan
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    58
        sbi         MATRIX_PORT, MATRIX_OE	; high -> disabled
0d0309787be3 Working matrix scan
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    59
        sbi         MATRIX_DDR, MATRIX_OE	; out
0d0309787be3 Working matrix scan
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    60
 
0d0309787be3 Working matrix scan
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    61
	; blank hardware
0d0309787be3 Working matrix scan
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    62
		ldi			r16, 0
0d0309787be3 Working matrix scan
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    63
0d0309787be3 Working matrix scan
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    64
		sts			spi_outbuf + 0, r16		; column sinks
0d0309787be3 Working matrix scan
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    65
		sts			spi_outbuf + 1, r16		; row drivers
0d0309787be3 Working matrix scan
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    66
0d0309787be3 Working matrix scan
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    67
	; write out
0d0309787be3 Working matrix scan
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    68
		rcall		SPI_SendRecv
0d0309787be3 Working matrix scan
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    69
0d0309787be3 Working matrix scan
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    70
	; enable
0d0309787be3 Working matrix scan
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    71
		cbi			MATRIX_PORT, MATRIX_OE	; low -> enabled
0d0309787be3 Working matrix scan
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    72
0d0309787be3 Working matrix scan
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    73
	; init buffers
0d0309787be3 Working matrix scan
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    74
		ldi			r16, 0b1
0d0309787be3 Working matrix scan
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    75
		sts			matrix_colbit, r16
0d0309787be3 Working matrix scan
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    76
34
4646abd073fb Matrix_Shift, Main_ScanText animation and Main_ScanCode
Tero Marttila <terom@fixme.fi>
parents: 33
diff changeset
    77
        ldi         r16, 0
4646abd073fb Matrix_Shift, Main_ScanText animation and Main_ScanCode
Tero Marttila <terom@fixme.fi>
parents: 33
diff changeset
    78
        sts         matrix_colshift, r16
4646abd073fb Matrix_Shift, Main_ScanText animation and Main_ScanCode
Tero Marttila <terom@fixme.fi>
parents: 33
diff changeset
    79
33
0d0309787be3 Working matrix scan
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    80
		ldi			r16, 0
34
4646abd073fb Matrix_Shift, Main_ScanText animation and Main_ScanCode
Tero Marttila <terom@fixme.fi>
parents: 33
diff changeset
    81
		ldi			r17, MATRIX_BUF_COLS
4646abd073fb Matrix_Shift, Main_ScanText animation and Main_ScanCode
Tero Marttila <terom@fixme.fi>
parents: 33
diff changeset
    82
		ldi			YL, low(matrix_colbuf)
4646abd073fb Matrix_Shift, Main_ScanText animation and Main_ScanCode
Tero Marttila <terom@fixme.fi>
parents: 33
diff changeset
    83
		ldi			YH, high(matrix_colbuf)
33
0d0309787be3 Working matrix scan
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    84
0d0309787be3 Working matrix scan
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    85
m_init_mzero:
0d0309787be3 Working matrix scan
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    86
		st			Y+, r16
0d0309787be3 Working matrix scan
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    87
		
0d0309787be3 Working matrix scan
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    88
		; loop until zero
0d0309787be3 Working matrix scan
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    89
		dec			r17
0d0309787be3 Working matrix scan
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    90
		brne		m_init_mzero
0d0309787be3 Working matrix scan
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    91
0d0309787be3 Working matrix scan
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    92
	; Use Timer0, 32k cycles -> 500Hz scan rate
0d0309787be3 Working matrix scan
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    93
		ldi			r16, 32
0d0309787be3 Working matrix scan
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    94
		rcall		Timer0_Start
0d0309787be3 Working matrix scan
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    95
0d0309787be3 Working matrix scan
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    96
	; done
0d0309787be3 Working matrix scan
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    97
		ret
0d0309787be3 Working matrix scan
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    98
36
06e1e554acbb Rename Matrix_ShiftRight to ShiftLeft, improve matrix.inc documentation
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
    99
;; Scan the matrix's next column from the viewport
33
0d0309787be3 Working matrix scan
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   100
;;  Interrupt-driven
0d0309787be3 Working matrix scan
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   101
Matrix_ScanCol:
34
4646abd073fb Matrix_Shift, Main_ScanText animation and Main_ScanCode
Tero Marttila <terom@fixme.fi>
parents: 33
diff changeset
   102
    ; Save registers
4646abd073fb Matrix_Shift, Main_ScanText animation and Main_ScanCode
Tero Marttila <terom@fixme.fi>
parents: 33
diff changeset
   103
        push        r16
4646abd073fb Matrix_Shift, Main_ScanText animation and Main_ScanCode
Tero Marttila <terom@fixme.fi>
parents: 33
diff changeset
   104
        push        r17
4646abd073fb Matrix_Shift, Main_ScanText animation and Main_ScanCode
Tero Marttila <terom@fixme.fi>
parents: 33
diff changeset
   105
33
0d0309787be3 Working matrix scan
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   106
	; Column bit
0d0309787be3 Working matrix scan
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   107
		; load
0d0309787be3 Working matrix scan
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   108
		lds			r16, matrix_colbit
0d0309787be3 Working matrix scan
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   109
	
0d0309787be3 Working matrix scan
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   110
		; start packet
0d0309787be3 Working matrix scan
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   111
        cbi         SPI_PORT, SPI_SS
0d0309787be3 Working matrix scan
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   112
36
06e1e554acbb Rename Matrix_ShiftRight to ShiftLeft, improve matrix.inc documentation
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   113
		; output single column-enable bit
33
0d0309787be3 Working matrix scan
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   114
		out			SPDR, r16
0d0309787be3 Working matrix scan
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   115
0d0309787be3 Working matrix scan
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   116
	; Compute col index
0d0309787be3 Working matrix scan
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   117
		ldi			r17, 0
0d0309787be3 Working matrix scan
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   118
0d0309787be3 Working matrix scan
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   119
m_sc_colidx:
0d0309787be3 Working matrix scan
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   120
		; shift
0d0309787be3 Working matrix scan
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   121
		lsr			r16
0d0309787be3 Working matrix scan
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   122
0d0309787be3 Working matrix scan
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   123
		; done if we shifted the bit out
0d0309787be3 Working matrix scan
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   124
		brcs		m_sc_row
0d0309787be3 Working matrix scan
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   125
0d0309787be3 Working matrix scan
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   126
		; count shifts
0d0309787be3 Working matrix scan
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   127
		inc			r17
0d0309787be3 Working matrix scan
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   128
		rjmp		m_sc_colidx
0d0309787be3 Working matrix scan
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   129
0d0309787be3 Working matrix scan
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   130
m_sc_row:
34
4646abd073fb Matrix_Shift, Main_ScanText animation and Main_ScanCode
Tero Marttila <terom@fixme.fi>
parents: 33
diff changeset
   131
    ; Column shift
4646abd073fb Matrix_Shift, Main_ScanText animation and Main_ScanCode
Tero Marttila <terom@fixme.fi>
parents: 33
diff changeset
   132
        ; load
4646abd073fb Matrix_Shift, Main_ScanText animation and Main_ScanCode
Tero Marttila <terom@fixme.fi>
parents: 33
diff changeset
   133
        lds         r16, matrix_colshift
4646abd073fb Matrix_Shift, Main_ScanText animation and Main_ScanCode
Tero Marttila <terom@fixme.fi>
parents: 33
diff changeset
   134
4646abd073fb Matrix_Shift, Main_ScanText animation and Main_ScanCode
Tero Marttila <terom@fixme.fi>
parents: 33
diff changeset
   135
        ; add to col index
4646abd073fb Matrix_Shift, Main_ScanText animation and Main_ScanCode
Tero Marttila <terom@fixme.fi>
parents: 33
diff changeset
   136
        add         r17, r16
4646abd073fb Matrix_Shift, Main_ScanText animation and Main_ScanCode
Tero Marttila <terom@fixme.fi>
parents: 33
diff changeset
   137
33
0d0309787be3 Working matrix scan
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   138
	; Row mask
0d0309787be3 Working matrix scan
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   139
		; base
34
4646abd073fb Matrix_Shift, Main_ScanText animation and Main_ScanCode
Tero Marttila <terom@fixme.fi>
parents: 33
diff changeset
   140
		ldi			XL, low(matrix_colbuf)
4646abd073fb Matrix_Shift, Main_ScanText animation and Main_ScanCode
Tero Marttila <terom@fixme.fi>
parents: 33
diff changeset
   141
		ldi			XH, high(matrix_colbuf)
33
0d0309787be3 Working matrix scan
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   142
0d0309787be3 Working matrix scan
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   143
		; offset
34
4646abd073fb Matrix_Shift, Main_ScanText animation and Main_ScanCode
Tero Marttila <terom@fixme.fi>
parents: 33
diff changeset
   144
		ldi			r16, 0
33
0d0309787be3 Working matrix scan
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   145
0d0309787be3 Working matrix scan
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   146
		add			XL, r17
34
4646abd073fb Matrix_Shift, Main_ScanText animation and Main_ScanCode
Tero Marttila <terom@fixme.fi>
parents: 33
diff changeset
   147
		adc			XH, r16
33
0d0309787be3 Working matrix scan
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   148
0d0309787be3 Working matrix scan
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   149
		; load
0d0309787be3 Working matrix scan
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   150
		ld			r16, X
0d0309787be3 Working matrix scan
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   151
36
06e1e554acbb Rename Matrix_ShiftRight to ShiftLeft, improve matrix.inc documentation
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   152
		; output full row-enable bitmask
33
0d0309787be3 Working matrix scan
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   153
		rcall		SPI_Wait
0d0309787be3 Working matrix scan
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   154
		out			SPDR, r16
0d0309787be3 Working matrix scan
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   155
0d0309787be3 Working matrix scan
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   156
	; Update col bit
0d0309787be3 Working matrix scan
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   157
		lds			r16, matrix_colbit
0d0309787be3 Working matrix scan
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   158
	
0d0309787be3 Working matrix scan
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   159
		; shift left
0d0309787be3 Working matrix scan
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   160
		lsl			r16
0d0309787be3 Working matrix scan
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   161
		brcc		m_sc_colout
0d0309787be3 Working matrix scan
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   162
0d0309787be3 Working matrix scan
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   163
		; overflow, take bit from C
0d0309787be3 Working matrix scan
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   164
		rol			r16
0d0309787be3 Working matrix scan
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   165
0d0309787be3 Working matrix scan
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   166
m_sc_colout:
0d0309787be3 Working matrix scan
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   167
		; store
0d0309787be3 Working matrix scan
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   168
		sts			matrix_colbit, r16
0d0309787be3 Working matrix scan
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   169
0d0309787be3 Working matrix scan
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   170
	; End of packet
0d0309787be3 Working matrix scan
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   171
		rcall		SPI_Wait
0d0309787be3 Working matrix scan
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   172
        sbi         SPI_PORT, SPI_SS
0d0309787be3 Working matrix scan
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   173
0d0309787be3 Working matrix scan
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   174
	; Done
34
4646abd073fb Matrix_Shift, Main_ScanText animation and Main_ScanCode
Tero Marttila <terom@fixme.fi>
parents: 33
diff changeset
   175
        pop         r17
4646abd073fb Matrix_Shift, Main_ScanText animation and Main_ScanCode
Tero Marttila <terom@fixme.fi>
parents: 33
diff changeset
   176
        pop         r16
4646abd073fb Matrix_Shift, Main_ScanText animation and Main_ScanCode
Tero Marttila <terom@fixme.fi>
parents: 33
diff changeset
   177
33
0d0309787be3 Working matrix scan
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   178
		ret
0d0309787be3 Working matrix scan
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   179
0d0309787be3 Working matrix scan
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   180
;; Scan the matrix once in one go
36
06e1e554acbb Rename Matrix_ShiftRight to ShiftLeft, improve matrix.inc documentation
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   181
;; XXX: doesn't support colshift
33
0d0309787be3 Working matrix scan
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   182
Matrix_ScanFull:
0d0309787be3 Working matrix scan
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   183
	; Row index
34
4646abd073fb Matrix_Shift, Main_ScanText animation and Main_ScanCode
Tero Marttila <terom@fixme.fi>
parents: 33
diff changeset
   184
		ldi			ZL, low(matrix_colbuf)
4646abd073fb Matrix_Shift, Main_ScanText animation and Main_ScanCode
Tero Marttila <terom@fixme.fi>
parents: 33
diff changeset
   185
		ldi			ZH, high(matrix_colbuf)
33
0d0309787be3 Working matrix scan
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   186
0d0309787be3 Working matrix scan
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   187
	; Column bit
0d0309787be3 Working matrix scan
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   188
		ldi			r25, 0
0d0309787be3 Working matrix scan
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   189
		sec								; set C
0d0309787be3 Working matrix scan
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   190
		
0d0309787be3 Working matrix scan
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   191
m_pulse_col:
0d0309787be3 Working matrix scan
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   192
		; rotate bit left from C
0d0309787be3 Working matrix scan
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   193
		rol			r25
0d0309787be3 Working matrix scan
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   194
		
0d0309787be3 Working matrix scan
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   195
		; overflow
0d0309787be3 Working matrix scan
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   196
		brcs		m_pulse_end
0d0309787be3 Working matrix scan
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   197
		
0d0309787be3 Working matrix scan
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   198
		; store in output buffer
0d0309787be3 Working matrix scan
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   199
		sts			spi_outbuf + 1, r25
0d0309787be3 Working matrix scan
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   200
0d0309787be3 Working matrix scan
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   201
	; Row mask
0d0309787be3 Working matrix scan
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   202
		ld			r16, Z+
0d0309787be3 Working matrix scan
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   203
0d0309787be3 Working matrix scan
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   204
		sts			spi_outbuf + 0, r16
0d0309787be3 Working matrix scan
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   205
0d0309787be3 Working matrix scan
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   206
	; Display
0d0309787be3 Working matrix scan
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   207
		rcall		SPI_SendRecv
0d0309787be3 Working matrix scan
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   208
0d0309787be3 Working matrix scan
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   209
	; Next column
0d0309787be3 Working matrix scan
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   210
		rjmp		m_pulse_col
0d0309787be3 Working matrix scan
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   211
0d0309787be3 Working matrix scan
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   212
m_pulse_end:
0d0309787be3 Working matrix scan
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   213
	; Done
0d0309787be3 Working matrix scan
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   214
		ret
0d0309787be3 Working matrix scan
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   215
36
06e1e554acbb Rename Matrix_ShiftRight to ShiftLeft, improve matrix.inc documentation
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   216
;; Reset the viewport to the start (left edge) of the framebuffer
06e1e554acbb Rename Matrix_ShiftRight to ShiftLeft, improve matrix.inc documentation
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   217
Matrix_ShiftZero:
06e1e554acbb Rename Matrix_ShiftRight to ShiftLeft, improve matrix.inc documentation
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   218
    ; Constant offset
06e1e554acbb Rename Matrix_ShiftRight to ShiftLeft, improve matrix.inc documentation
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   219
        ldi         r16, 0
06e1e554acbb Rename Matrix_ShiftRight to ShiftLeft, improve matrix.inc documentation
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   220
06e1e554acbb Rename Matrix_ShiftRight to ShiftLeft, improve matrix.inc documentation
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   221
    ; Set
06e1e554acbb Rename Matrix_ShiftRight to ShiftLeft, improve matrix.inc documentation
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   222
        rjmp        Matrix_ShiftSet
06e1e554acbb Rename Matrix_ShiftRight to ShiftLeft, improve matrix.inc documentation
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   223
06e1e554acbb Rename Matrix_ShiftRight to ShiftLeft, improve matrix.inc documentation
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   224
;; Shift the viewport one column to the left in the framebuffer, looping around to the end of the framebuffer
06e1e554acbb Rename Matrix_ShiftRight to ShiftLeft, improve matrix.inc documentation
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   225
; This moves the visible output one column to the right
06e1e554acbb Rename Matrix_ShiftRight to ShiftLeft, improve matrix.inc documentation
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   226
Matrix_ShiftLeft:
34
4646abd073fb Matrix_Shift, Main_ScanText animation and Main_ScanCode
Tero Marttila <terom@fixme.fi>
parents: 33
diff changeset
   227
    ; Decrement-loop current value
4646abd073fb Matrix_Shift, Main_ScanText animation and Main_ScanCode
Tero Marttila <terom@fixme.fi>
parents: 33
diff changeset
   228
        ; current value
4646abd073fb Matrix_Shift, Main_ScanText animation and Main_ScanCode
Tero Marttila <terom@fixme.fi>
parents: 33
diff changeset
   229
        lds         r16, matrix_colshift
4646abd073fb Matrix_Shift, Main_ScanText animation and Main_ScanCode
Tero Marttila <terom@fixme.fi>
parents: 33
diff changeset
   230
4646abd073fb Matrix_Shift, Main_ScanText animation and Main_ScanCode
Tero Marttila <terom@fixme.fi>
parents: 33
diff changeset
   231
        ; shift window left
4646abd073fb Matrix_Shift, Main_ScanText animation and Main_ScanCode
Tero Marttila <terom@fixme.fi>
parents: 33
diff changeset
   232
        dec         r16
4646abd073fb Matrix_Shift, Main_ScanText animation and Main_ScanCode
Tero Marttila <terom@fixme.fi>
parents: 33
diff changeset
   233
36
06e1e554acbb Rename Matrix_ShiftRight to ShiftLeft, improve matrix.inc documentation
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   234
        ; test for underflow (MSB/N set) -> don't skip reset
34
4646abd073fb Matrix_Shift, Main_ScanText animation and Main_ScanCode
Tero Marttila <terom@fixme.fi>
parents: 33
diff changeset
   235
        brpl        Matrix_ShiftSet
4646abd073fb Matrix_Shift, Main_ScanText animation and Main_ScanCode
Tero Marttila <terom@fixme.fi>
parents: 33
diff changeset
   236
4646abd073fb Matrix_Shift, Main_ScanText animation and Main_ScanCode
Tero Marttila <terom@fixme.fi>
parents: 33
diff changeset
   237
        ; reset window to right edge
4646abd073fb Matrix_Shift, Main_ScanText animation and Main_ScanCode
Tero Marttila <terom@fixme.fi>
parents: 33
diff changeset
   238
        ldi         r16, MATRIX_BUF_COLS - MATRIX_COLS
4646abd073fb Matrix_Shift, Main_ScanText animation and Main_ScanCode
Tero Marttila <terom@fixme.fi>
parents: 33
diff changeset
   239
36
06e1e554acbb Rename Matrix_ShiftRight to ShiftLeft, improve matrix.inc documentation
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   240
    ; Set
06e1e554acbb Rename Matrix_ShiftRight to ShiftLeft, improve matrix.inc documentation
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   241
        rjmp        Matrix_ShiftSet
34
4646abd073fb Matrix_Shift, Main_ScanText animation and Main_ScanCode
Tero Marttila <terom@fixme.fi>
parents: 33
diff changeset
   242
36
06e1e554acbb Rename Matrix_ShiftRight to ShiftLeft, improve matrix.inc documentation
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   243
;; Shift the viewport one column to the right in the framebuffer, looping around to the start of the FB
06e1e554acbb Rename Matrix_ShiftRight to ShiftLeft, improve matrix.inc documentation
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   244
; This moves the visible output one column to the left
06e1e554acbb Rename Matrix_ShiftRight to ShiftLeft, improve matrix.inc documentation
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   245
Matrix_ShiftRight:
06e1e554acbb Rename Matrix_ShiftRight to ShiftLeft, improve matrix.inc documentation
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   246
    ; Increment-loop current value
06e1e554acbb Rename Matrix_ShiftRight to ShiftLeft, improve matrix.inc documentation
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   247
        ; current value
06e1e554acbb Rename Matrix_ShiftRight to ShiftLeft, improve matrix.inc documentation
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   248
        lds         r16, matrix_colshift
06e1e554acbb Rename Matrix_ShiftRight to ShiftLeft, improve matrix.inc documentation
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   249
06e1e554acbb Rename Matrix_ShiftRight to ShiftLeft, improve matrix.inc documentation
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   250
        ; shift window right
06e1e554acbb Rename Matrix_ShiftRight to ShiftLeft, improve matrix.inc documentation
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   251
        inc         r16
06e1e554acbb Rename Matrix_ShiftRight to ShiftLeft, improve matrix.inc documentation
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   252
06e1e554acbb Rename Matrix_ShiftRight to ShiftLeft, improve matrix.inc documentation
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   253
        ; test for overflow -> don't skip reset
06e1e554acbb Rename Matrix_ShiftRight to ShiftLeft, improve matrix.inc documentation
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   254
        cpi         r16, MATRIX_BUF_COLS - MATRIX_COLS
06e1e554acbb Rename Matrix_ShiftRight to ShiftLeft, improve matrix.inc documentation
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   255
        brlt        Matrix_ShiftSet
06e1e554acbb Rename Matrix_ShiftRight to ShiftLeft, improve matrix.inc documentation
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   256
06e1e554acbb Rename Matrix_ShiftRight to ShiftLeft, improve matrix.inc documentation
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   257
        ; reset window to left edge
06e1e554acbb Rename Matrix_ShiftRight to ShiftLeft, improve matrix.inc documentation
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   258
        ldi         r16, 0
06e1e554acbb Rename Matrix_ShiftRight to ShiftLeft, improve matrix.inc documentation
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   259
06e1e554acbb Rename Matrix_ShiftRight to ShiftLeft, improve matrix.inc documentation
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   260
    ; Set
06e1e554acbb Rename Matrix_ShiftRight to ShiftLeft, improve matrix.inc documentation
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   261
        rjmp        Matrix_ShiftSet
06e1e554acbb Rename Matrix_ShiftRight to ShiftLeft, improve matrix.inc documentation
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   262
06e1e554acbb Rename Matrix_ShiftRight to ShiftLeft, improve matrix.inc documentation
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
   263
;; Set the matrix viewport offset
34
4646abd073fb Matrix_Shift, Main_ScanText animation and Main_ScanCode
Tero Marttila <terom@fixme.fi>
parents: 33
diff changeset
   264
;; Input: r16
4646abd073fb Matrix_Shift, Main_ScanText animation and Main_ScanCode
Tero Marttila <terom@fixme.fi>
parents: 33
diff changeset
   265
Matrix_ShiftSet:
4646abd073fb Matrix_Shift, Main_ScanText animation and Main_ScanCode
Tero Marttila <terom@fixme.fi>
parents: 33
diff changeset
   266
        ; store new value
4646abd073fb Matrix_Shift, Main_ScanText animation and Main_ScanCode
Tero Marttila <terom@fixme.fi>
parents: 33
diff changeset
   267
        sts         matrix_colshift, r16
4646abd073fb Matrix_Shift, Main_ScanText animation and Main_ScanCode
Tero Marttila <terom@fixme.fi>
parents: 33
diff changeset
   268
4646abd073fb Matrix_Shift, Main_ScanText animation and Main_ScanCode
Tero Marttila <terom@fixme.fi>
parents: 33
diff changeset
   269
        ; done
4646abd073fb Matrix_Shift, Main_ScanText animation and Main_ScanCode
Tero Marttila <terom@fixme.fi>
parents: 33
diff changeset
   270
        ret
4646abd073fb Matrix_Shift, Main_ScanText animation and Main_ScanCode
Tero Marttila <terom@fixme.fi>
parents: 33
diff changeset
   271
39
d7eac199d323 Implement Text_Load/ShowString
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
   272
;; Rewinds the currently visible viewport to the beginning of the framebuffer
d7eac199d323 Implement Text_Load/ShowString
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
   273
; This copies the currently visible viewport data to the beginning of the framebuffer and resets the offset
d7eac199d323 Implement Text_Load/ShowString
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
   274
Matrix_ShiftRewind:
d7eac199d323 Implement Text_Load/ShowString
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
   275
        ; current view offset
d7eac199d323 Implement Text_Load/ShowString
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
   276
        ldi         XL, low(matrix_colbuf)
d7eac199d323 Implement Text_Load/ShowString
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
   277
        ldi         XH, high(matrix_colbuf)
d7eac199d323 Implement Text_Load/ShowString
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
   278
d7eac199d323 Implement Text_Load/ShowString
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
   279
        ; offset
d7eac199d323 Implement Text_Load/ShowString
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
   280
        lds         r16, matrix_colshift
d7eac199d323 Implement Text_Load/ShowString
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
   281
d7eac199d323 Implement Text_Load/ShowString
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
   282
        ; add
d7eac199d323 Implement Text_Load/ShowString
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
   283
        ldi         r17, 0
d7eac199d323 Implement Text_Load/ShowString
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
   284
        add         XL, r16
d7eac199d323 Implement Text_Load/ShowString
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
   285
        adc         XH, r17
d7eac199d323 Implement Text_Load/ShowString
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
   286
d7eac199d323 Implement Text_Load/ShowString
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
   287
        ; start of framebuffer
d7eac199d323 Implement Text_Load/ShowString
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
   288
        ldi         YL, low(matrix_colbuf + 0)
d7eac199d323 Implement Text_Load/ShowString
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
   289
        ldi         YH, high(matrix_colbuf + 0)
d7eac199d323 Implement Text_Load/ShowString
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
   290
d7eac199d323 Implement Text_Load/ShowString
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
   291
        ; viewport width
d7eac199d323 Implement Text_Load/ShowString
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
   292
        ldi         r17, MATRIX_COLS
d7eac199d323 Implement Text_Load/ShowString
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
   293
d7eac199d323 Implement Text_Load/ShowString
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
   294
matrix_shiftrew_loop:
d7eac199d323 Implement Text_Load/ShowString
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
   295
        ; copy
d7eac199d323 Implement Text_Load/ShowString
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
   296
        ld          r16, X+
d7eac199d323 Implement Text_Load/ShowString
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
   297
        st          Y+, r16
d7eac199d323 Implement Text_Load/ShowString
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
   298
d7eac199d323 Implement Text_Load/ShowString
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
   299
        ; count
d7eac199d323 Implement Text_Load/ShowString
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
   300
        dec         r17
d7eac199d323 Implement Text_Load/ShowString
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
   301
        brne        matrix_shiftrew_loop
d7eac199d323 Implement Text_Load/ShowString
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
   302
d7eac199d323 Implement Text_Load/ShowString
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
   303
        ; done, reset offset
d7eac199d323 Implement Text_Load/ShowString
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
   304
        rjmp        MAtrix_ShiftZero
d7eac199d323 Implement Text_Load/ShowString
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
   305
d7eac199d323 Implement Text_Load/ShowString
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
   306
d7eac199d323 Implement Text_Load/ShowString
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
   307
;; Load a NUL-terminated ASCII string from PGM into the text buffer
d7eac199d323 Implement Text_Load/ShowString
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
   308
; Input:    Z       - Address of NUL-terminated ASCII string in PGM        
d7eac199d323 Implement Text_Load/ShowString
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
   309
Text_LoadString:
d7eac199d323 Implement Text_Load/ShowString
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
   310
    ; Setup
d7eac199d323 Implement Text_Load/ShowString
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
   311
        ; storage buffer
d7eac199d323 Implement Text_Load/ShowString
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
   312
        ldi         YL, low(text_buffer)
d7eac199d323 Implement Text_Load/ShowString
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
   313
        ldi         YH, high(text_buffer)
d7eac199d323 Implement Text_Load/ShowString
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
   314
d7eac199d323 Implement Text_Load/ShowString
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
   315
        ; max. length
d7eac199d323 Implement Text_Load/ShowString
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
   316
        ldi         r18, TEXT_MAXLENGTH
d7eac199d323 Implement Text_Load/ShowString
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
   317
d7eac199d323 Implement Text_Load/ShowString
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
   318
text_loads_loop:
d7eac199d323 Implement Text_Load/ShowString
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
   319
    ; Test max length
d7eac199d323 Implement Text_Load/ShowString
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
   320
        ; count and check for overflow
d7eac199d323 Implement Text_Load/ShowString
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
   321
        dec         r18
d7eac199d323 Implement Text_Load/ShowString
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
   322
        brne        text_loads_char
d7eac199d323 Implement Text_Load/ShowString
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
   323
d7eac199d323 Implement Text_Load/ShowString
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
   324
    ; Load char
d7eac199d323 Implement Text_Load/ShowString
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
   325
        ; force NUL
d7eac199d323 Implement Text_Load/ShowString
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
   326
        ldi         r16, 0x00
d7eac199d323 Implement Text_Load/ShowString
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
   327
d7eac199d323 Implement Text_Load/ShowString
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
   328
text_loads_char:
d7eac199d323 Implement Text_Load/ShowString
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
   329
        ; load next char
d7eac199d323 Implement Text_Load/ShowString
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
   330
        lpm         r16, Z+
d7eac199d323 Implement Text_Load/ShowString
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
   331
d7eac199d323 Implement Text_Load/ShowString
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
   332
text_loads_store:
d7eac199d323 Implement Text_Load/ShowString
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
   333
    ; Store and test NUL
d7eac199d323 Implement Text_Load/ShowString
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
   334
        ; store it
d7eac199d323 Implement Text_Load/ShowString
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
   335
        st          Y+, r16
d7eac199d323 Implement Text_Load/ShowString
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
   336
d7eac199d323 Implement Text_Load/ShowString
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
   337
        ; test for NUL
d7eac199d323 Implement Text_Load/ShowString
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
   338
        tst         r16
d7eac199d323 Implement Text_Load/ShowString
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
   339
        brne        text_loads_loop
d7eac199d323 Implement Text_Load/ShowString
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
   340
d7eac199d323 Implement Text_Load/ShowString
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
   341
    ; Update scroll offset
d7eac199d323 Implement Text_Load/ShowString
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
   342
        ; reset offset
d7eac199d323 Implement Text_Load/ShowString
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
   343
        ldi         r17, 0
d7eac199d323 Implement Text_Load/ShowString
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
   344
        sts         text_offset, r17
d7eac199d323 Implement Text_Load/ShowString
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
   345
d7eac199d323 Implement Text_Load/ShowString
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
   346
        ; done
d7eac199d323 Implement Text_Load/ShowString
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
   347
        ret
d7eac199d323 Implement Text_Load/ShowString
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
   348
d7eac199d323 Implement Text_Load/ShowString
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
   349
;; Shows the loaded string of ASCII text on the display, scrolling it horizontally
d7eac199d323 Implement Text_Load/ShowString
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
   350
; Uses font.inc for rendering
d7eac199d323 Implement Text_Load/ShowString
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
   351
; XXX: uses blocking timer sleeps and doesn't return until done
d7eac199d323 Implement Text_Load/ShowString
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
   352
Text_ShowString:
d7eac199d323 Implement Text_Load/ShowString
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
   353
    ; Load initial char
d7eac199d323 Implement Text_Load/ShowString
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
   354
        ldi         XL, low(text_buffer + 0)
d7eac199d323 Implement Text_Load/ShowString
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
   355
        ldi         XH, high(text_buffer + 0)
d7eac199d323 Implement Text_Load/ShowString
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
   356
d7eac199d323 Implement Text_Load/ShowString
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
   357
        ; load char
d7eac199d323 Implement Text_Load/ShowString
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
   358
        ld          r16, X+
d7eac199d323 Implement Text_Load/ShowString
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
   359
        push        XL
d7eac199d323 Implement Text_Load/ShowString
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
   360
        push        XH
d7eac199d323 Implement Text_Load/ShowString
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
   361
d7eac199d323 Implement Text_Load/ShowString
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
   362
        ; one column spacing
d7eac199d323 Implement Text_Load/ShowString
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
   363
        ldi         YL, low(matrix_colbuf + 1)
d7eac199d323 Implement Text_Load/ShowString
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
   364
        ldi         YH, high(matrix_colbuf + 1)
d7eac199d323 Implement Text_Load/ShowString
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
   365
d7eac199d323 Implement Text_Load/ShowString
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
   366
        ; render to framebuffer
d7eac199d323 Implement Text_Load/ShowString
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
   367
        rcall       Font_Render
d7eac199d323 Implement Text_Load/ShowString
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
   368
d7eac199d323 Implement Text_Load/ShowString
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
   369
        ; reset viewport
d7eac199d323 Implement Text_Load/ShowString
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
   370
        rcall       Matrix_ShiftZero
d7eac199d323 Implement Text_Load/ShowString
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
   371
       
d7eac199d323 Implement Text_Load/ShowString
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
   372
   ; Load next char
d7eac199d323 Implement Text_Load/ShowString
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
   373
text_shows_next:        
d7eac199d323 Implement Text_Load/ShowString
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
   374
        ; next char
d7eac199d323 Implement Text_Load/ShowString
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
   375
        pop         XH
d7eac199d323 Implement Text_Load/ShowString
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
   376
        pop         XL
d7eac199d323 Implement Text_Load/ShowString
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
   377
        ld          r16, X+
d7eac199d323 Implement Text_Load/ShowString
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
   378
        push        XL
d7eac199d323 Implement Text_Load/ShowString
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
   379
        push        XH
d7eac199d323 Implement Text_Load/ShowString
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
   380
d7eac199d323 Implement Text_Load/ShowString
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
   381
        ; test NUL
d7eac199d323 Implement Text_Load/ShowString
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
   382
        tst         r16
d7eac199d323 Implement Text_Load/ShowString
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
   383
        breq        text_shows_end
d7eac199d323 Implement Text_Load/ShowString
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
   384
d7eac199d323 Implement Text_Load/ShowString
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
   385
        ; offscreen
d7eac199d323 Implement Text_Load/ShowString
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
   386
        ldi         YL, low(matrix_colbuf + 1 + 6 + 1)
d7eac199d323 Implement Text_Load/ShowString
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
   387
        ldi         YH, high(matrix_colbuf + 1 + 6 + 1)
d7eac199d323 Implement Text_Load/ShowString
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
   388
d7eac199d323 Implement Text_Load/ShowString
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
   389
        ; render
d7eac199d323 Implement Text_Load/ShowString
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
   390
        rcall       Font_Render
d7eac199d323 Implement Text_Load/ShowString
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
   391
d7eac199d323 Implement Text_Load/ShowString
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
   392
    ; Animate to next char
d7eac199d323 Implement Text_Load/ShowString
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
   393
        ldi         r20, 7
d7eac199d323 Implement Text_Load/ShowString
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
   394
        
d7eac199d323 Implement Text_Load/ShowString
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
   395
text_shows_animloop:
d7eac199d323 Implement Text_Load/ShowString
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
   396
        ; sleep
d7eac199d323 Implement Text_Load/ShowString
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
   397
        ldi         XH, high(TEXT_SPEED * 1024)
d7eac199d323 Implement Text_Load/ShowString
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
   398
        ldi         XL, low(TEXT_SPEED * 1024)
d7eac199d323 Implement Text_Load/ShowString
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
   399
d7eac199d323 Implement Text_Load/ShowString
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
   400
        rcall       Timer_Sleep
d7eac199d323 Implement Text_Load/ShowString
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
   401
d7eac199d323 Implement Text_Load/ShowString
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
   402
        ; shift
d7eac199d323 Implement Text_Load/ShowString
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
   403
        rcall       Matrix_ShiftRight
d7eac199d323 Implement Text_Load/ShowString
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
   404
d7eac199d323 Implement Text_Load/ShowString
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
   405
        ; count
d7eac199d323 Implement Text_Load/ShowString
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
   406
        dec         r20
d7eac199d323 Implement Text_Load/ShowString
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
   407
        brne        text_shows_animloop
d7eac199d323 Implement Text_Load/ShowString
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
   408
d7eac199d323 Implement Text_Load/ShowString
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
   409
    ; Rewind to next char
d7eac199d323 Implement Text_Load/ShowString
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
   410
        rcall       Matrix_ShiftRewind
d7eac199d323 Implement Text_Load/ShowString
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
   411
d7eac199d323 Implement Text_Load/ShowString
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
   412
        sbi         PIND, PIND7
d7eac199d323 Implement Text_Load/ShowString
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
   413
d7eac199d323 Implement Text_Load/ShowString
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
   414
        ; load next char and animate it in
d7eac199d323 Implement Text_Load/ShowString
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
   415
        rjmp        text_shows_next
d7eac199d323 Implement Text_Load/ShowString
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
   416
d7eac199d323 Implement Text_Load/ShowString
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
   417
text_shows_end:
d7eac199d323 Implement Text_Load/ShowString
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
   418
    ; Done
d7eac199d323 Implement Text_Load/ShowString
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
   419
        pop         XH
d7eac199d323 Implement Text_Load/ShowString
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
   420
        pop         XL
d7eac199d323 Implement Text_Load/ShowString
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
   421
d7eac199d323 Implement Text_Load/ShowString
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
   422
        ret
d7eac199d323 Implement Text_Load/ShowString
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
   423