-
Notifications
You must be signed in to change notification settings - Fork 1
/
mega32.asm
219 lines (184 loc) · 5.65 KB
/
mega32.asm
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
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
// Komentarz jednoliniowy
/* Komentarz
* w kilku
* liniach */
;Wylaczenie listowania kodu.
.NOLIST
;Dolaczenie zewnetrnych plików
#include "m32def.inc"
;wlaczenie listowania - musi byc zaznaczona
;odpowiednia opcja w projekcie
.LIST
;rozwijanie makr w pliku z listingiem
.LISTMAC
;Preprocesor znany z jezyka C
#define __TEST__
#ifdef __TEST__
;wyprowadzenie komunikatu do okna kompilacji
.warning "__TEST__ already defined!"
#else
.warning "__TEST__ not defined yet!"
;Wyœwietla komunikat jaka blad kompilacji
#error "Nazwa kontrolera " __PART_NAME__
#endif
;EEPROM DATA SEGMENT
.ESEG
.org 0
; Wszystkie dane w obrebie segmentu beda zaprogramowane w pamieci eeprom
serial: .db 0x12,\
0x34,\
0x56,\
0x78
wrd: .dw 0x1234, 0x5678
binary: .db 0b0101_1010 ;zapis biinarny
decimal: .db 90 ;zapis dziesietny
octal: .db 0132 ;zapis oktalny (ósemkowy)
;SRAM DATA
.DSEG
;w segmencie danych nie ma mozliwosci inicjowania zmiennych wartosciami
tab: .BYTE 16 ;tablica bajtowa o rozmiarze 16 bajtow
;DEFS
.DEF tmp=R16 ;assigns R16 register to tmp symbol
.EQU maxByte=255
;HARDCODED CODE DATA
.CSEG
;stale zdefiniowane w segmencie kodu zapisane zostana w pamieci flash
.org FLASHEND - 0x100 ;stale nalezy umieszczac pod koniec
;pamieci w celu unikniecia kolizji z kodem
bitmask: .db 0b1010_1010, 0b0101_0101
wbitmask: .dw 0b10101010_01010101
dbitmask: .dd 0x12345678
qbitmask: .dq 0x123456789abcdef0
;Napis nie jest domyslnie zakonczony zerem - trzeba je dododac samemu
hw: .db "Hello World!",0
; definicja makra
.MACRO makro
LDI R18,@0
.ENDM
.org 0
jmp START
jmp NO_IRQ ;INT0addr = 0x0002 ; External Interrupt Request 0
jmp NO_IRQ ;INT1addr = 0x0004 ; External Interrupt Request 1
jmp NO_IRQ ;INT2addr = 0x0006 ; External Interrupt Request 2
jmp NO_IRQ ;OC2addr = 0x0008 ; Timer/Counter2 Compare Match
jmp NO_IRQ ;OVF2addr = 0x000a ; Timer/Counter2 Overflow
jmp NO_IRQ ;ICP1addr = 0x000c ; Timer/Counter1 Capture Event
jmp NO_IRQ ;OC1Aaddr = 0x000e ; Timer/Counter1 Compare Match A
jmp NO_IRQ ;OC1Baddr = 0x0010 ; Timer/Counter1 Compare Match B
jmp NO_IRQ ;OVF1addr = 0x0012 ; Timer/Counter1 Overflow
jmp NO_IRQ ;OC0addr = 0x0014 ; Timer/Counter0 Compare Match
jmp NO_IRQ ;OVF0addr = 0x0016 ; Timer/Counter0 Overflow
jmp NO_IRQ ;SPIaddr = 0x0018 ; Serial Transfer Complete
jmp NO_IRQ ;URXCaddr = 0x001a ; USART, Rx Complete
jmp NO_IRQ ;UDREaddr = 0x001c ; USART Data Register Empty
jmp NO_IRQ ;UTXCaddr = 0x001e ; USART, Tx Complete
jmp NO_IRQ ;ADCCaddr = 0x0020 ; ADC Conversion Complete
jmp NO_IRQ ;ERDYaddr = 0x0022 ; EEPROM Ready
jmp NO_IRQ ;ACIaddr = 0x0024 ; Analog Comparator
jmp NO_IRQ ;TWIaddr = 0x0026 ; 2-wire Serial Interface
jmp NO_IRQ ;SPMRaddr = 0x0028 ; Store Program Memory Ready
.org INT_VECTORS_SIZE
START:
; inicjowanie stosu
ldi tmp,low(RAMEND) ; Load low byte address of end of RAM into register R16
out SPL,tmp ; Initialize stack pointer to end of internal RAM
ldi tmp,high(RAMEND); Load high byte address of end of RAM into register R16
out SPH, tmp ; Initialize high byte of stack pointer to end of internal RAM
makro 5 ; wywolanie makra
ldi r16, 0x0f
mov r1, r16
push r1
push r1
pop r1
ldi r30, low(bitmask*2) ;pobieranie danych z eeprom
ldi r31, high(bitmask*2) ;adres musi byc pomnozony 2 razy
ldi r28, low(tab) ;pobieranie danych z pamieci operacyjnej
ldi r29, high(tab) ;mnozenie nie jest koneiczne
ldi r21, 0
ldi r22, 0x20
; instrukcje kopiowania i transmisji danych
LDI r16, 100
;LDI R1, 100
MOV R1, R16
MOVW R2, R0
;MOVW R3, R0
STS tab, R3
LDS R0, tab
LD R4, X+ ;Podobne adresowanie
LD R5, X+ ;dla rejestrow Y i Z
LD R6, X ;
LD R6, -X ;
CLR R28
CLR R29
LDD R6, Y+2 ;Podobnie dla Z (brak dla X)
;Do czego s³u¿y?
LDI R16, 0x0f
CLR R30
CLR R31
ST Z+, R16
ST Z, R16
ST -Z, R6
STD Z+2, R1
LDI ZL, LOW(qbitmask*2)
LDI ZH, HIGH(qbitmask*2)
LPM
LPM R1, Z+
LPM R1, Z
PUSH R1
POP R2
IN R2, SPH
; Instrukcje operacji na bitach
SEC ; Set Carry C © 1 C 1
CLC ; Clear Carry C © 0 C 1
SEN ; Set Negative Flag N © 1 N 1
CLN ; Clear Negative Flag N © 0 N 1
SEZ ; Set Zero Flag Z © 1 Z 1
CLZ ; Clear Zero Flag Z © 0 Z 1
SEI ; Global Interrupt Enable I © 1 I 1
CLI ; Global Interrupt Disable I © 0 I 1
SES ; Set Signed Test Flag S © 1 S 1
CLS ; Clear Signed Test Flag S © 0 S 1
SEV ; Set Twofs Complement Overflow V © 1 V 1
CLV ; Clear Twofs Complement Overflow V © 0 V 1
SET ; Set T in SREG T © 1 T 1
CLT ; Clear T in SREG T © 0 T 1
SEH ; Set Half Carry Flag in SREG H © 1 H 1
CLH ; Clear Half Carry Flag in SREG H © 0 H 1
BSET SREG_N ; Set flag in SREG
BCLR SREG_N ; Clear flag in SREG
LDI R16, 0xF0
BST R16, 4 ; Bit Store from Register to T T © Rr(b) T 1
BLD R16, 3 ; Bit load from T to Register Rd(b) © T None 1
SWAP R16 ; Swap Nibbles
ROL R16 ; Rotate Left Through Carry
ROR R16 ; Rotate Right Through Carry
ASR R16 ; Arithmetic Shift Right
LSL R16 ; Logical Shift Left
LSR R16 ; Logical Shift Right
LOOP:
lpm R0, Z+
writeToEEPROM R21, R22, R0
; what about macros labels?
;writeToEEPROM R21, R22, R0
eor r0,r0
call loadFromEEPROM ; wywolanie procedury
lds r0, 2
ld r0, Y+
jmp LOOP
;function
loadFromEEPROM:
sbic EECR, EEWE
rjmp loadFromEEPROM
push r12 ; save register
in r12, SREG ; copy status register
cli ; disable interrupts
out EEARH, r21 ; load addres
out EEARL, r22
sbi EECR, EERE ; load data to write
in r0, EEDR
; what about enabling interrupts?
out SREG, r12 ; restore status register
pop r12 ; restore register
ret
NO_IRQ:
reti