matrix.inc
changeset 34 4646abd073fb
parent 33 0d0309787be3
child 36 06e1e554acbb
--- 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
+