stack2.asm


1
.include "tn26def.inc"
2
3
4
.org 0x000        ; Programm kommt an Anfang von PROM
5
6
.def temp = r16
7
.def temp1 = r17      ; temporäre Register definieren
8
.def ergebnis = r18
9
10
.set Frequenzbyte = 0xc0    ; Stellt 8Mhz ein
11
12
    rjmp reset     ; Reset handler
13
    reti       ; IRQ0 handler
14
    reti        ; Pin change handler
15
    reti      ; Timer1 compare match 1A
16
    reti       ; Timer1 compare match 1B
17
    reti      ; Timer1 overflow handler
18
    reti         ; Timer0 overflow handler
19
    reti       ; USI Start handler
20
    reti       ; USI Overflow handler
21
    reti      ; EEPROM Ready handler
22
    reti       ; Analog Comparator handler
23
    reti       ; ADC Conversion Handler
24
25
26
reset:   ldi temp1, RAMEND   ; Init aus Datenblatt
27
    out SP, temp1
28
29
    ldi temp1, Frequenzbyte  ; 8Mhz einstellen
30
    out OSCCAL, temp1  
31
  
32
33
MAIN:
34
  LDI temp, $10 
35
  PUSH temp 
36
  LDI temp, $20 
37
  PUSH temp 
38
  RCALL Addiere   ; (siehe Text)
39
  POP ergebnis 
40
  POP temp 
41
ENDE:
42
  RJMP ENDE       ; (siehe Text)
43
44
45
ADDIERE:
46
  PUSH ZH        ; Z-Register sichern
47
  PUSH ZL        ; (siehe Text)
48
49
  IN temp, SP    ; Stackzeiger einlesen,
50
  MOV ZL, temp   ; und nach ZL kopieren
51
  CLR ZH         ; ZH löschen
52
  ADIW ZH:ZL, 6  ; Z-Register plus 6
53
                 ; (siehe Text)
54
55
  PUSH R20       ; beide Arbeitsregister
56
  PUSH R21       ; sichern
57
58
  LD R20, Z      ; ersten Parameter laden
59
  LD R21, -Z     ; zweiten Parameter laden
60
  ADD R20, R21   ; beide Werte addieren
61
  ST  Z, R20     ; und Ergebnis ablegen
62
63
  POP R21        ; beide Arbeitsregister 
64
  POP R20        ; wiederherstellen
65
66
  POP ZL         ; Z-Register
67
  POP ZH         ; wiederherstellen
68
RET