test2.3.asm


1
;Demoprogramm für 8-fach-PWM mit Tastensteuerung Up-Down.
2
3
;8 LEDs gegen Vcc an PortB (STK500)
4
;8 entprellte Tasten gegen GND für die einzelnen PWM-Kanäle an PortD
5
;1 "Shift-Taste" an PA6 gegen GND zum Wählen der Stellrichtung der Kanaltasten.
6
;Shift offen -> Kanaltasten zählen hoch,
7
;Shift betätigt -> Kanaltasten zählen runter.
8
;Der Zählumfang wird nach oben und unten begrenzt.
9
10
.include "m8515def.inc"
11
.listmac                    ;Makros listen
12
.equ clock = 8000000        ;Taktfrequenz 8Mhz
13
14
15
.equ pwu = 100               ;PWM-Zählumfang
16
.equ timerwert = -100       ;Timer-Startwert (Reload)
17
.equ step=6                 ;Schrittweite für Änderung pro Tastendruck
18
.equ lep=portb              ;Port für LEDs
19
.equ tap=pinc               ;Tastenport
20
.equ ship=pind              ;Port für Shift-Taste
21
.equ shib=6                 ;Bit für Shift-Taste
22
23
24
.equ avt0=20                ;Startwert Anzeige-Vorteiler
25
26
27
 
28
29
.def soll0 = r0             ;Sollwert Kanal 1
30
.def soll1 = r1             ;Sollwert Kanal 2
31
.def soll2 = r2             ;Sollwert Kanal 3
32
.def soll3 = r3             ;Sollwert Kanal 4
33
.def soll4 = r4             ;Sollwert Kanal 5
34
.def soll5 = r5             ;Sollwert Kanal 6
35
.def soll6 = r6             ;Sollwert Kanal 7
36
.def soll7 = r7             ;Sollwert Kanal 8
37
.def tsw = r8               ;Timer-Startwert
38
.def sregtemp = r9          ;Sicherheitskopie SREG
39
.def scan=r10               ;Scannwert Tastenport
40
.def tz0=r11                ;Tasten-Prellzähler Bit0
41
.def tz1=r12                ;Tasten-Prellzähler Bit1
42
.def tas=r13                ;Tastenstatus (gültig)
43
.def null=r14               ;immer 0
44
45
46
47
.def temp = r16
48
.def tfl=r17                ;Flags für Tasten, die gedrückt wurden
49
.def pwz = r18              ;PWM-Zähler
50
.def task=r19               ;Taskscheibe für diverse Aufgaben
51
.def ri=r20                 ;Richtung der Änderung
52
.def max=r21                ;Maximum
53
54
55
56
;.dseg                   ;SRAM-Variablen
57
;astring:        .byte 27    ;Startadresse für LCD-Ausgabestring im S-RAM
58
59
.def avt=r22                ;Anzeige-Vorteiler
60
.def flags=r23              ;Steuerflags
61
    .equ aktuLCD=7 ;7              ;LCD aktualisieren
62
63
.def wl=r24                 ;Working L
64
.def wh=r25                 ;Working H
65
66
67
68
 .equ lcdcontroller1=4       ;Flag für Controller 1
69
 .equ lcdcontroller2=6       ;Flag für Controller 2
70
71
.cseg
72
;.org 0                      ;Reset- und Interrupt-Vektoren Mega 8535
73
.org 0              ;Reset- und Interrupt-Vektoren AT-Mega 8515
74
 rjmp RESET         ;Reset Handler
75
 rjmp nix;EXT_INT0      ;IRQ0 Handler
76
 rjmp nix;EXT_INT1      ;IRQ1 Handler
77
 rjmp nix;TIM1_CAPT     ;Timer1 Capture Handler
78
 rjmp nix;TIM1_COMPA    ;Timer1 Compare A Handler
79
 rjmp nix;TIM1_COMPB    ;Timer1 Compare B Handler
80
 rjmp nix;TIM1_OVF      ;Timer1 Overflow Handler
81
 rjmp TIM0_OVF      ;Timer0 Overflow Handler
82
 rjmp nix;SPI_STC       ;SPI Transfer Complete Handler
83
 rjmp nix;USART_RXC     ;USART RX Complete Handler
84
 rjmp nix;USART_UDRE    ;UDR0 Empty Handler
85
 rjmp nix;USART_TXC     ;USART TX Complete Handler
86
 rjmp nix;ANA_COMP      ;Analog Comparator Handler
87
 rjmp nix;EXT_INT2      ;IRQ2 Handler
88
 rjmp nix;TIM0_COMP     ;Timer0 Compare Handler
89
 rjmp nix;EE_RDY        ;EEPROM Ready Handler
90
 rjmp nix;SPM_RDY       ;Store Program memory Ready Handler
91
nix:                    ;unbenutzte Interrupts
92
 reti                   ;zurück...
93
94
.include"LCDprint.inc"      ;LCD-Ausgabefunktionen
95
.include"LCD_4x40.inc"      ;LCD-Routinen für 4-Zeilen-LCDs mit HD44780
96
97
Reset:
98
99
 ldi wl,low(ramend)         ;Stackpointer initialisieren
100
 out SPL,wl
101
 ldi wl,high(ramend)
102
 out SPH,wl
103
 
104
 clr null                   ;immer 0
105
106
 ldi wl, 0xFF    ;Port A = Ausgang
107
 out DDRA, wl
108
109
110
 
111
 ldi temp, 0xff
112
 out lep-1,temp             ;Ports B = Ausgang (DDRx=PORTx-1)
113
114
 ;out lep,temp               ;LED aus
115
 
116
 out tap+2,temp             ;Pull-Ups für Tasten einschalten (PORTx=PINx+2)
117
 ldi temp, 0x00
118
 out tap+1,temp             ;Ports d = Eingang (DDRx=PINx+1)
119
 
120
 cbi ship+1,shib            ;Shift-Tastenanschluss als Eingang
121
 sbi ship+2,shib            ;Shift-PullUp einschalten
122
123
124
 clr soll0
125
 clr soll1
126
 clr soll2
127
 clr soll3
128
 clr soll4
129
 clr soll5
130
 clr soll6
131
 clr soll7
132
 clr tz0                    ;Definierte Startbedingung 
133
 clr tz1                    ;für Tastenentprellung
134
 clr tas
135
 clr tfl
136
 
137
138
 ldi temp, 0x01
139
 out tccr0, temp            ;Timertakt = 1:1
140
 ldi temp, 1<<toie0
141
 out timsk, temp            ;Timer OVF freigeben
142
 ldi temp,timerwert+12      ;Timer-Startwert, korregiert mit Int-Aufruf12
143
 mov tsw,temp               ;definieren
144
 out tcnt0,tsw              ;und ausgeben
145
146
 ldi temp, 0; 50
147
 mov soll0, temp            ;Naja, wenn es sein muss...
148
 ldi temp,1<<se             ;Sleep-Mode (idle)
149
 out mcucr,temp             ;freischalten
150
 ldi max,pwu                ;Max-Wert für Begrenzung der Änderung
151
152
 
153
154
155
 rcall lcd_init             ;LCD initialisieren
156
               
157
 locate 0,20
158
print '8'
159
print ' '
160
print 'K'
161
print 'A'
162
print 'N'
163
print 'A'
164
print 'L'
165
print ' '
166
print 'A'
167
print 'V'
168
print 'R'
169
print ' '
170
print 'D'
171
print 'I'
172
print 'M'
173
print 'M'
174
print 'E'
175
print 'R'
176
177
178
179
180
locate 2,20
181
print 'T'
182
print 'A'
183
print 'S'
184
print 'T'
185
print 'E'
186
print 'N'
187
print ' '
188
print 'N'
189
print 'r'
190
print '.'
191
print '*'
192
print '*'
193
print 'M'
194
print 'O'
195
print 'D'
196
print 'E'
197
print '*'
198
print '*'
199
print '*'
200
print '*'
201
202
203
locate 3,20  
204
print 'T'
205
print 'A'
206
print 'S'
207
print 'T'
208
print 'E'
209
print '*'
210
print '*'
211
print '*'
212
print '*'
213
print '*'
214
print '*'
215
print '*'
216
print '*'
217
print '*'
218
print '*'
219
print '*'
220
print '*'
221
print '*'
222
print '*'
223
print '*'
224
225
 sei 
226
227
 
228
229
230
Haupt:                      ;Hauptschleife, Auswertung der Tastenflags
231
  ;und Jobflags die in der ISR gesetzt wurden und verändern
232
  ;der PWM-Werte der 8 Kanäle.
233
 sleep                      ;Schlafmodus, Wecken erfolgt durch Timer-Int.
234
235
236
        
237
 sbrc flags,aktuLCD         ;muss LCD aktualisiert werden? - nein...
238
239
 rcall gibaus               ;ja, Job aufrufen...
240
 
241
242
 tst tfl                    ;Ein Bit im Tastenflag gesetzt?
243
 breq haupt                 ;nein, keine Taste gedrückt gewesen... (schlafen gehen...)
244
 ;ldi ri,step                ;ja, erstmal aufwärts zählen
245
 ;sbis ship,shib             ;Shift-Taste gedrückt? (nein...)
246
 ;rjmp minus                 ;ja, zum Abwärtszählen...
247
 
248
 
249
taste0: 
250
sbrs tfl,0                 ;Taste 0?
251
rjmp taste1                ;nein...
252
rcall  MEN_98 
253
; add soll0,ri         ;ja, ändern
254
; rcall t1
255
; cp soll0,max               ;Maxwert überschritten?
256
; brlo taste1                ;nein...
257
; mov soll0,max              ;ja, auf Maxwert begrenzen  
258
taste1:
259
sbrs tfl,1                 ;Taste 1?
260
rjmp taste2                ;nein...
261
;rcall  MEN_97      ;
262
263
 ;add soll1,ri               ;ja, ändern
264
;rcall t2
265
; cp soll1,max               ;Maxwert überschritten?
266
; brlo taste2                ;nein...
267
; mov soll1,max              ;ja, auf Maxwert begrenzen
268
taste2:
269
270
;rcall  MEN_96      ;
271
272
 sbrs tfl,2                 ;Taste 2?
273
 rjmp taste3                ;nein...
274
 ;add soll2,ri               ;ja, ändern
275
;rcall t3
276
 ;cp soll2,max               ;Maxwert überschritten?
277
 ;brlo taste3                ;nein...
278
 ;mov soll2,max              ;ja, auf Maxwert begrenzen
279
taste3:
280
sbrs tfl,3                 ;Taste 3?
281
rjmp taste4                ;nein...
282
;rcall  MEN_95     
283
 ;add soll3,ri               ;ja, ändern 
284
;rcall t4
285
; cp soll3,max               ;Maxwert überschritten?
286
; brlo taste4                ;nein...
287
; mov soll3,max              ;ja, auf Maxwert begrenzen
288
taste4:
289
 sbrs tfl,4                 ;Taste 4?
290
 rjmp taste5                ;nein...
291
rcall  MEN_start    ;up to start
292
293
; add soll4,ri               ;ja, ändern 
294
;rcall t5
295
; cp soll4,max               ;Maxwert überschritten?
296
; brlo taste5                ;nein...
297
; mov soll4,max              ;ja, auf Maxwert begrenzen
298
taste5:
299
sbrs tfl,5                 ;Taste 5?
300
rjmp taste6                ;nein...
301
;rcall  MEN_23      ;
302
 ;add soll5,ri               ;ja, ändern,
303
;rcall t6
304
 ;cp soll5,max               ;Maxwert überschritten?
305
 ;brlo taste6                ;nein...
306
 ;mov soll5,max              ;ja, auf Maxwert begrenzen
307
taste6:
308
     ;
309
sbrs tfl,6                 ;Taste 6?
310
rjmp taste7                ;nein...
311
;rcall  MEN_22 
312
; add soll6,ri               ;ja, ändern;
313
;rcall t7
314
; cp soll6,max               ;Maxwert überschritten?
315
; brlo taste7                ;nein...
316
; mov soll6,max              ;ja, auf Maxwert begrenzen
317
taste7:
318
sbrs tfl,7                 ;Taste 7?
319
rjmp taste8                ;nein...
320
;rcall  MEN_21  
321
 ;add soll7,ri               ;ja, ändern
322
;rcall t8
323
; cp soll7,max               ;Maxwert überschritten?
324
; brlo taste8                ;nein...
325
; mov soll7,max              ;ja, auf Maxwert begrenzen
326
taste8:
327
clr tfl                    ;alle Tastenflags löschen
328
rjmp haupt                 ;fertig, schlafen gehen...
329
330
331
;minus:
332
; sbrs tfl,0                 ;Taste 0?
333
; rjmp minus1                ;nein...
334
; sub soll0,ri               ;ja, ändern
335
;rcall t1m
336
; brcc minus1                ;Unterlauf ? (nein...)
337
; clr soll0                 ;ja, auf 0 setzen
338
;minus1:
339
; sbrs tfl,1                 ;Taste 1?
340
; rjmp minus2                ;nein...
341
; sub soll1,ri               ;ja, ändern
342
;rcall t2m
343
; brcc minus2                ;Unterlauf ? (nein...)
344
; clr soll1                  ;ja, auf 0 setzen
345
;minus2:
346
; sbrs tfl,2                 ;Taste 2?
347
; rjmp minus3                ;nein...
348
; sub soll2,ri               ;ja, ändern
349
;rcall t3m
350
; brcc minus3                ;Unterlauf ? (nein...)
351
; clr soll2                  ;ja, auf 0 setzen
352
;minus3:
353
; sbrs tfl,3                 ;Taste 3?
354
; rjmp minus4                ;nein...
355
; sub soll3,ri               ;ja, ändern
356
;rcall t4m
357
; brcc minus4                ;Unterlauf ? (nein...)
358
; clr soll3                  ;ja, auf 0 setzen
359
;minus4:
360
; sbrs tfl,4                 ;Taste 4?
361
; rjmp minus5                ;nein...
362
; sub soll4,ri               ;ja, ändern
363
;rcall t5m
364
; brcc minus5                ;Unterlauf ? (nein...)
365
; clr soll4                  ;ja, auf 0 setzen
366
;minus5:
367
; sbrs tfl,5                 ;Taste 5?
368
; rjmp minus6                ;nein...
369
; sub soll5,ri               ;ja, ändern;
370
;rcall t6m
371
; brcc minus6                ;Unterlauf ? (nein...)
372
; clr soll5                  ;ja, auf 0 setzen
373
;minus6:
374
; sbrs tfl,6                 ;Taste 6?
375
; rjmp minus7                ;nein...
376
; sub soll6,ri               ;ja, ändern   
377
;  rcall t7m
378
; brcc minus7                ;Unterlauf ? (nein...)
379
; clr soll6                  ;ja, auf 0 setzen
380
;minus7:
381
; sbrs tfl,7                 ;Taste 7?
382
 ;rjmp minus8                ;nein...
383
; sub soll7,ri               ;ja, ändern
384
;rcall t8m
385
; brcc minus8                ;Unterlauf ? (nein...)
386
; clr soll7                  ;ja, auf 0 setzen
387
;minus8:
388
; clr tfl                    ;alle Tastenflags löschen
389
; rjmp haupt                 ;Hauptprogramm Endlosschleife
390
391
 
392
gibaus:                 ;Unterprogramm zum Ausgeben der Werte
393
 cbr flags,1<<aktuLCD       ;Jobflag löschen, wird ja jetzt erledigt
394
395
396
397
 locate 0,0                 ;Erste Position der zweiten Zeile
398
399
 print 'K'                  ;K
400
 print 'A'                  ;A
401
 print 'N'                  ;N
402
 print '1'                  ;1
403
 print ' '                  ;Leerzeichen
404
 print8 r0                  ;1. Wert
405
 print '%'                  ;Prozent-Zeichen
406
 print ' '                  ;Leerzeichen
407
 ;print ' '                  ;Leerzeichen
408
 
409
locate 1,0 
410
411
 print 'K'                  ;K
412
 print 'A'                  ;A
413
 print 'N'                  ;N
414
 print '2'                  ;2
415
 print ' '                  ;Leerzeichen
416
 print8 r1                  ;2. Wert
417
 print '%'                  ;Prozent-Zeichen
418
 print ' '                  ;Leerzeichen
419
 ;print ' '                  ;Leerzeichen
420
421
locate 2,0 
422
 print 'K'                  ;K
423
 print 'A'                  ;A
424
 print 'N'                  ;N
425
 print '3'                  ;3
426
 print ' '                  ;Leerzeichen
427
 print8 r2                  ;3. Wert
428
 print '%'                  ;Prozent-Zeichen
429
 print ' '                  ;Leerzeichen
430
 ;print ' '                  ;Leerzeichen
431
432
locate 3,0  
433
 print 'K'                  ;K
434
 print 'A'                  ;A
435
 print 'N'                  ;N
436
 print '4'                  ;4
437
 print ' '                  ;Leerzeichen
438
 print8 r3                  ;4. Wert
439
 print '%'                  ;Prozent-Zeichen
440
 print ' '                  ;Leerzeichen
441
 ;print ' '                  ;Leerzeichen
442
443
 locate 0,10                 ;erste Position der dritten Zeile
444
445
 print 'K'                  ;K
446
 print 'A'                  ;A
447
 print 'N'                  ;N
448
 print '5'                  ;5
449
 print ' '                  ;Leerzeichen
450
 print8 r4                  ;5 Wert
451
 print '%'                  ;Prozent-Zeichen
452
 print ' '                  ;Leerzeichen
453
 ;print ' '                  ;Leerzeichen
454
455
locate 1,10 
456
 print 'K'                  ;K
457
 print 'A'                  ;A
458
 print 'N'                  ;N
459
 print '6'                  ;6
460
 print ' '                  ;Leerzeichen
461
 print8 r5                  ;6 Wert
462
 print '%'                  ;Prozent-Zeichen
463
 print ' '                  ;Leerzeichen
464
 ;print ' '                  ;Leerzeichen
465
466
locate 2,10 
467
 print 'K'                  ;K
468
 print 'A'                  ;A
469
 print 'N'                  ;N
470
 print '7'                  ;7
471
 print ' '                  ;Leerzeichen
472
 print8 r6                  ;7. Wert
473
 print '%'                  ;Prozent-Zeichen
474
 print ' '                  ;Leerzeichen
475
 ;print ' '                  ;Leerzeichen
476
477
locate 3,10 
478
 print 'K'                  ;K
479
 print 'A'                  ;A
480
 print 'N'                  ;N
481
 print '8'                  ;8
482
 print ' '                  ;Leerzeichen
483
 print8 r7                  ;8. Wert
484
 print '%'                  ;Prozent-Zeichen
485
 print ' '                  ;Leerzeichen
486
 
487
 
488
 ret
489
490
491
492
493
494
495
Tim0_OVF:                   ;ISR Timer0-Überlauf
496
 in sregtemp, sreg          ;Sreg sichern
497
 out tcnt0,tsw              ;Timer auf Startwert setzen
498
 inc pwz                    ;PWM-Treppenzähler erhöhen
499
 cpi pwz, pwu               ;PWM-Zählumfang erreicht?
500
 brne Time0_a               ;nein... (die 3 Punkte bedeuten bei mir Sprung)
501
 clr pwz                    ;von vorn beginnen mit zählen
502
Time0_a:                    ;Vergleich der einzelnen PWM-Werte mit dem PWM-Treppenzähler
503
                            ;(Idee geklaut bei Peter Dannegger)
504
 cp pwz, soll7              ;Sollwert erreicht? (Ergebnis im Carry)
505
 rol temp                   ;Carry-Bits "einsammeln", dieses wird bis Bit7 durchgeschoben
506
 cp pwz, soll6
507
 rol temp                   ;Bit 6
508
 cp pwz, soll5
509
 rol temp                   ;Bit 5
510
 cp pwz, soll4
511
 rol temp                   ;Bit 4
512
 cp pwz, soll3
513
 rol temp                   ;Bit 3
514
 cp pwz, soll2
515
 rol temp                   ;Bit 2
516
 cp pwz, soll1
517
 rol temp                   ;Bit 1
518
 cp pwz, soll0
519
 rol temp                   ;Bit 0
520
 ;com temp                   ;invertieren da low-aktive LED im STK500
521
 out portB, temp            ;Ausgabe 
522
 inc task                   ;Taskscheibe erhöhen (Tastenabfrage erfolgt nur bei Task Nr. 0)
523
                            ;andere Aufgaben können bei anderen Zählerständen aufgerufen werden
524
                            ;dabei ist darauf zu achten, dass kein Durchlauf der ISR mehr als
525
                            ;70 Takte dauert, da die ISR alle 100 Takte aufgerufen wird und
526
                            ;der Aufruf (mit Reti) schon 10 Takte braucht.
527
 brne timertasks            ;nur bei 0 Tasten abfragen...
528
Tastenabfrage:              ;Entprellroutine (geklaut bei Peter Dannegger...)
529
 in scan,tap                ;Tastenport einlesen (gedrückt=L)
530
 com scan                   ;invertieren (gedrückt=H)
531
 eor scan,tas               ;nur Änderungen werden H
532
 and tz0,scan               ;Prellzähler unveränderter Tasten löschen (Bit0)
533
 and tz1,scan               ;Prellzähler unveränderter Tasten löschen (Bit1)
534
 com tz0                    ;L-Bit zählen 0,2,->1, 1,3,->0
535
 eor tz1,tz0                ;H-Bit zählen 0,2,->tz1 toggeln
536
 and scan,tz0               ;Änderungen nur dann erhalten, wenn im Prellzähler
537
 and scan,tz1               ;beide Bits gesetzt sind (Zählerstand 3)
538
 eor tas,scan               ;erhaltene Änderungen toggeln alten (gültigen) Tastenstatus
539
 and scan,tas               ;nur (neu) gedrückte Tastenbits bleiben erhalten
540
 or tfl,scan                ;und zugehörige Bits setzen (gelöscht wird nach Abarbeitung)
541
 ;in "tas" steht jetzt der gültige Tastenzustand,
542
 ;in "tfl" die Flags der neu gedrückten, noch nicht abgearbeiteten Tasten...
543
timertasks:
544
 cpi task,2                 ;Beispiel für Verzweigung nach Taskscheibe
545
 brne timerfertig           ;bei falscher Tasknummer Überspringen...
546
 dec avt                    ;Anzeige-Vorteiler runter
547
 brne timerfertig           ;unten? nein, weg hier...
548
 ldi avt,avt0               ;ja, Startwert laden
549
 sbr flags,1<<aktuLCD       ;Flag setzen, um LCD zu aktualisieren
550
 
551
timerfertig:
552
 out sreg, sregtemp         ;Sreg wiederherstellen
553
 reti                       ;ISR fertig
554
555
556
557
Text1:
558
559
560
ret
561
562
563
564
565
t1:
566
locate 3,27
567
print '1'
568
print ' '                ;6 Leerzeichen
569
print ' '
570
print ' '
571
print ' '
572
print ' '
573
print 'U'
574
print 'P'
575
print ' '
576
ret
577
578
579
580
t2:
581
locate 3,27
582
print '2'
583
print ' '                ;6 Leerzeichen
584
print ' '
585
print ' '
586
print ' '
587
print ' '
588
print 'U'
589
print 'P'
590
print ' '
591
ret
592
593
t3:
594
locate 3,27
595
print '3'
596
print ' '                ;6 Leerzeichen
597
print ' '
598
print ' '
599
print ' '
600
print ' '
601
print 'U'
602
print 'P'
603
print ' '
604
ret
605
606
t4:
607
locate 3,27
608
print '4'
609
print ' '                ;6 Leerzeichen
610
print ' '
611
print ' '
612
print ' '
613
print ' '
614
print 'U'
615
print 'P'
616
print ' '
617
ret
618
619
t5:
620
locate 3,27
621
print '5'
622
print ' '                ;6 Leerzeichen
623
print ' '
624
print ' '
625
print ' '
626
print ' '
627
print 'U'
628
print 'P'
629
print ' '
630
ret
631
632
t6:
633
locate 3,27
634
print '6'
635
print ' '                ;6 Leerzeichen
636
print ' '
637
print ' '
638
print ' '
639
print ' '
640
print 'U'
641
print 'P'
642
print ' '
643
ret
644
645
t7:
646
locate 3,27
647
print '7'
648
print ' '                ;6 Leerzeichen
649
print ' '
650
print ' '
651
print ' '
652
print ' '
653
print 'U'
654
print 'P'
655
print ' '
656
ret
657
658
t8:
659
locate 3,27
660
print '8'
661
print ' '                ;6 Leerzeichen
662
print ' '
663
print ' '
664
print ' '
665
print ' '
666
print 'U'
667
print 'P'
668
print ' '
669
ret
670
671
672
t1m:
673
locate 3,27
674
print '1'
675
print ' '                ;6 Leerzeichen
676
print ' '
677
print ' '
678
print ' '
679
print 'D'
680
print 'O'
681
print 'W'
682
print 'N'
683
ret
684
685
t2m:
686
locate 3,27
687
print '2'
688
print ' '                ;6 Leerzeichen
689
print ' '
690
print ' '
691
print ' '
692
print 'D'
693
print 'O'
694
print 'W'
695
print 'N'
696
ret
697
698
t3m:
699
locate 3,27
700
print '3'
701
print ' '                ;6 Leerzeichen
702
print ' '
703
print ' '
704
print ' '
705
print 'D'
706
print 'O'
707
print 'W'
708
print 'N'
709
ret
710
711
t4m:
712
locate 3,27
713
print '4'
714
print ' '                ;6 Leerzeichen
715
print ' '
716
print ' '
717
print ' '
718
print 'D'
719
print 'O'
720
print 'W'
721
print 'N'
722
ret
723
724
t5m:
725
locate 3,27
726
print '5'
727
print ' '                ;6 Leerzeichen
728
print ' '
729
print ' '
730
print ' '
731
print 'D'
732
print 'O'
733
print 'W'
734
print 'N'
735
ret
736
737
t6m:
738
locate 3,27
739
print '6'
740
print ' '                ;6 Leerzeichen
741
print ' '
742
print ' '
743
print ' '
744
print 'D'
745
print 'O'
746
print 'W'
747
print 'N'
748
ret
749
750
t7m:
751
locate 3,27
752
print '7'
753
print ' '                ;6 Leerzeichen
754
print ' '
755
print ' '
756
print ' '
757
print 'D'
758
print 'O'
759
print 'W'
760
print 'N'
761
ret
762
763
t8m:
764
locate 3,27
765
print '8'
766
print ' '                ;6 Leerzeichen
767
print ' '
768
print ' '
769
print ' '
770
print 'D'
771
print 'O'
772
print 'W'
773
print 'N'
774
ret
775
776
777
MEN_start:
778
locate 2,19
779
printf eins
780
RET
781
 ;
782
783
MEN_98:
784
locate 3,19
785
printf ZWEI
786
ret
787
eins:    .db "MENUE",0
788
zwei:    .db "MENUE <1> ",0
789
drei:    .db "KANAL WÄHLEN",0