--- a/matrix.inc Thu Jun 17 20:00:27 2010 +0300
+++ b/matrix.inc Thu Jun 17 21:54:24 2010 +0300
@@ -6,10 +6,12 @@
.set MATRIX_OE = PORTB1 ; Output Enable, active low, externally pulled high
.dseg
-.set MATRIX_COLS = 8 ; number of columns
+.set MATRIX_COLS = 8 ; number of physical columns (XXX: fixed to 8)
+.set MATRIX_BUF_COLS = 16 ; number of columns in frame buffer
-matrix_colbit: .byte 1 ; column bit
-matrix_rowbuf: .byte MATRIX_COLS ; row bitmask by column
+matrix_colbit: .byte 1 ; scan column bit
+matrix_colbuf: .byte MATRIX_BUF_COLS ; row bits by column
+matrix_colshift: .byte 1 ; left column offset
.cseg
@@ -35,10 +37,13 @@
ldi r16, 0b1
sts matrix_colbit, r16
+ ldi r16, 0
+ sts matrix_colshift, r16
+
ldi r16, 0
- ldi r17, MATRIX_COLS
- ldi YL, low(matrix_rowbuf)
- ldi YH, high(matrix_rowbuf)
+ ldi r17, MATRIX_BUF_COLS
+ ldi YL, low(matrix_colbuf)
+ ldi YH, high(matrix_colbuf)
m_init_mzero:
st Y+, r16
@@ -57,6 +62,10 @@
;; Scan the next column
;; Interrupt-driven
Matrix_ScanCol:
+ ; Save registers
+ push r16
+ push r17
+
; Column bit
; load
lds r16, matrix_colbit
@@ -82,16 +91,23 @@
rjmp m_sc_colidx
m_sc_row:
+ ; Column shift
+ ; load
+ lds r16, matrix_colshift
+
+ ; add to col index
+ add r17, r16
+
; Row mask
; base
- ldi XL, low(matrix_rowbuf)
- ldi XH, high(matrix_rowbuf)
+ ldi XL, low(matrix_colbuf)
+ ldi XH, high(matrix_colbuf)
; offset
- ldi r18, 0
+ ldi r16, 0
add XL, r17
- adc XH, r18
+ adc XH, r16
; load
ld r16, X
@@ -119,13 +135,16 @@
sbi SPI_PORT, SPI_SS
; Done
+ pop r17
+ pop r16
+
ret
;; Scan the matrix once in one go
Matrix_ScanFull:
; Row index
- ldi ZL, low(matrix_rowbuf)
- ldi ZH, high(matrix_rowbuf)
+ ldi ZL, low(matrix_colbuf)
+ ldi ZH, high(matrix_colbuf)
; Column bit
ldi r25, 0
@@ -156,3 +175,29 @@
; Done
ret
+;; Shift the matrix output one column to the right, looping around
+Matrix_ShiftRight:
+ ; Decrement-loop current value
+ ; current value
+ lds r16, matrix_colshift
+
+ ; shift window left
+ dec r16
+
+ ; test for underflow -> MSB/N set
+ brpl Matrix_ShiftSet
+
+ ; reset window to right edge
+ ldi r16, MATRIX_BUF_COLS - MATRIX_COLS
+
+ ;; Continue
+
+;; Set the matrix output left shift
+;; Input: r16
+Matrix_ShiftSet:
+ ; store new value
+ sts matrix_colshift, r16
+
+ ; done
+ ret
+