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