summaryrefslogtreecommitdiff
path: root/Software/pinlock.asm
blob: ee80741113bc9e62d88d0e8e508dba5af5d9b886 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
.include "m16def.inc"
.def tmp0 = r16
.def par0 = r17
.def par1 = r18
.def cnt = r19
.def tmp1 = r20
.def tmp2 = r21

init:
  ldi tmp0, HIGH(RAMEND)
  out SPH, tmp0
  ldi tmp0, LOW(RAMEND)
  ldi par0, 0xFF
  ldi par1, 0xFF
  rcall wait
  out SPL, tmp0
  ldi tmp0, 0b11111111
  out DDRA, tmp0
  ldi tmp0, 0b11111111
  out DDRB, tmp0
  ldi tmp0, 0b11000000
  out DDRD, tmp0
  ldi tmp0, 0b00000000
  out PORTD, tmp0

	ldi par0, 0
	ldi par1, 0
	rcall display
	ldi par0, 1
	ldi par1, 1
	rcall display
	ldi par0, 2
	ldi par1, 2
	rcall display
	ldi par0, 3
	ldi par1, 3
	rcall display

main:
	ldi par0, 0b11111111
	rcall status

wait:
  mov tmp0, par0
  dec par0
  nop
  brne wait
  mov par0, tmp0
  dec par1
  nop
  brne wait
  ret

; Output the status
; par0 = Status bits
status:
	ldi tmp0, 1
status_loop:
	mov tmp1, par0
	and tmp1, tmp0
	cp tmp0, tmp1
	breq status_set
	ldi tmp1, 0b00111111
	out PORTD, tmp1
	ldi tmp1, 0b10111111
	out PORTD, tmp1
	rjmp status_end
status_set:
	ldi tmp1, 0b01111111
	out PORTD, tmp1
	ldi tmp1, 0b11111111
	out PORTD, tmp1
	rjmp status_end
status_end:
	lsl tmp0
	cpi tmp0, 0
	brne status_loop
	ret

; Display the digit on a given display
; par0 = Display number
; par1 = Digit
display:
	mov tmp0, par1
	andi tmp0, 0x0F
	cpi par0, 0
	breq display_0
	cpi par0, 1
	breq display_1
	cpi par0, 2
	breq display_2
	cpi par0, 3
	breq display_3
	ret
display_0:
	in tmp1, PORTA
	andi tmp1, 0xF0
	or tmp1, tmp0
	out PORTA, tmp1
	ret
display_1:
	in tmp1, PORTB
	andi tmp1, 0xF0
	or tmp1, tmp0
	out PORTB, tmp1
	ret
display_2:
	in tmp1, PORTA
	andi tmp1, 0x0F
	lsl tmp0
	lsl tmp0
	lsl tmp0
	lsl tmp0
	or tmp1, tmp0
	out PORTA, tmp1
	ret
display_3:
	in tmp1, PORTB
	andi tmp1, 0x0F
	lsl tmp0
	lsl tmp0
	lsl tmp0
	lsl tmp0
	or tmp1, tmp0
	out PORTB, tmp1
	ret