summaryrefslogtreecommitdiff
path: root/Software/pinlock.asm
diff options
context:
space:
mode:
Diffstat (limited to 'Software/pinlock.asm')
-rw-r--r--Software/pinlock.asm118
1 files changed, 96 insertions, 22 deletions
diff --git a/Software/pinlock.asm b/Software/pinlock.asm
index b088dab..87ce7c4 100644
--- a/Software/pinlock.asm
+++ b/Software/pinlock.asm
@@ -43,6 +43,12 @@ init:
ldi par0, 3
ldi par1, 3
rcall display
+
+ ldi tmp0, 0
+ ldi tmp1, 0
+ push tmp0
+ push tmp1
+
rjmp main
debug_heart:
@@ -65,30 +71,31 @@ debug_heart:
ret
main:
+ ; get current button states
rcall input
- mov par1, ret0
- lsr par1
- lsr par1
- lsr par1
- lsr par1
+ ; detect raising edge on one of the buttons
+ pop tmp0
+ pop tmp1
+ push ret1
+ push ret0
+ eor tmp0, ret0
+ eor tmp1, ret1
+ and tmp0, ret0
+ and tmp1, ret1
+ ; check if no button has pressed
+ ldi tmp2, 0
+ or tmp2, tmp0
+ or tmp2, tmp1
+ breq main
+ ; button pressed, process
+ mov par0, tmp0
+ mov par1, tmp1
+ rcall translate
ldi par0, 0
- rcall display
mov par1, ret0
- andi par1, 0x0F
- ldi par0, 1
- rcall display
- mov par1, ret1
- lsr par1
- lsr par1
- lsr par1
- lsr par1
- ldi par0, 2
- rcall display
- mov par1, ret1
- andi par1, 0x0F
- ldi par0, 3
rcall display
- ;rcall debug_heart
+ ;mov par0, ret0
+ ;rcall handle
rjmp main
wait:
@@ -267,8 +274,8 @@ display_end:
; Parameters:
; None
; Returns:
-; ret0 = 123A456B
-; ret1 = 789C*0#D
+; ret0 = 0852*741
+; ret1 = DCBA#963
input:
; Write selection rows
ldi par0, 1
@@ -420,3 +427,70 @@ input_end:
ret
input_loop_j:
rjmp input_loop
+
+; Translate input bits to keycode.
+; Parameters:
+; par0 = Input bits 7..0
+; par1 = Input bits 15..8
+; Returns:
+; ret0 = Translated keycode
+translate:
+ push par0
+ push par1
+ push tmp0
+ ldi tmp0, 16
+translate_loop:
+ sbrs par0, 0
+ rjmp translate_low
+ rjmp translate_high
+translate_low:
+ rjmp translate_end
+translate_high:
+ push tmp0
+ push tmp1
+ ldi ZL, LOW(translate_map << 1)
+ ldi ZH, HIGH(translate_map << 1)
+ dec tmp0
+ ldi tmp1, 0
+ add ZL, tmp0
+ adc ZH, tmp1
+ lpm ret0, Z
+ pop tmp1
+ pop tmp0
+ rjmp translate_end
+translate_end:
+ lsr par0
+ lsr par1
+ brcc pc+2
+ ori par0, 0x80
+ dec tmp0
+ brne translate_loop
+ pop tmp0
+ pop par1
+ pop par0
+ ret
+translate_map:
+ .db 0x0D, \
+ 0x0C, \
+ 0x0B, \
+ 0x0A, \
+ 0x0F, \
+ 9, \
+ 6, \
+ 3, \
+ 0, \
+ 8, \
+ 5, \
+ 2, \
+ 0x0E, \
+ 7, \
+ 4, \
+ 1
+; ret0 = 0852*741
+; ret1 = DCBA#963
+
+; Handles the given key input.
+; Parameters:
+; par0 = keycode
+; Returns:
+;