test2.2.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
 add soll0,ri         ;ja, ändern
253
 rcall t1
254
 cp soll0,max               ;Maxwert überschritten?
255
 brlo taste1                ;nein...
256
 mov soll0,max              ;ja, auf Maxwert begrenzen  
257
taste1:
258
 sbrs tfl,1                 ;Taste 1?
259
 rjmp taste2                ;nein...
260
 add soll1,ri               ;ja, ändern
261
rcall t2
262
 cp soll1,max               ;Maxwert überschritten?
263
 brlo taste2                ;nein...
264
 mov soll1,max              ;ja, auf Maxwert begrenzen
265
taste2:
266
 sbrs tfl,2                 ;Taste 2?
267
 rjmp taste3                ;nein...
268
 add soll2,ri               ;ja, ändern
269
rcall t3
270
 cp soll2,max               ;Maxwert überschritten?
271
 brlo taste3                ;nein...
272
 mov soll2,max              ;ja, auf Maxwert begrenzen
273
taste3:
274
 sbrs tfl,3                 ;Taste 3?
275
 rjmp taste4                ;nein...
276
 add soll3,ri               ;ja, ändern 
277
rcall t4
278
 cp soll3,max               ;Maxwert überschritten?
279
 brlo taste4                ;nein...
280
 mov soll3,max              ;ja, auf Maxwert begrenzen
281
taste4:
282
 sbrs tfl,4                 ;Taste 4?
283
 rjmp taste5                ;nein...
284
 add soll4,ri               ;ja, ändern 
285
rcall t5
286
 cp soll4,max               ;Maxwert überschritten?
287
 brlo taste5                ;nein...
288
 mov soll4,max              ;ja, auf Maxwert begrenzen
289
taste5:
290
 sbrs tfl,5                 ;Taste 5?
291
 rjmp taste6                ;nein...
292
 add soll5,ri               ;ja, ändern,
293
rcall t6
294
 cp soll5,max               ;Maxwert überschritten?
295
 brlo taste6                ;nein...
296
 mov soll5,max              ;ja, auf Maxwert begrenzen
297
taste6:
298
 sbrs tfl,6                 ;Taste 6?
299
 rjmp taste7                ;nein...
300
 add soll6,ri               ;ja, ändern
301
rcall t7
302
 cp soll6,max               ;Maxwert überschritten?
303
 brlo taste7                ;nein...
304
 mov soll6,max              ;ja, auf Maxwert begrenzen
305
taste7:
306
 sbrs tfl,7                 ;Taste 7?
307
 rjmp taste8                ;nein...
308
 add soll7,ri               ;ja, ändern
309
rcall t8
310
 cp soll7,max               ;Maxwert überschritten?
311
 brlo taste8                ;nein...
312
 mov soll7,max              ;ja, auf Maxwert begrenzen
313
taste8:
314
 clr tfl                    ;alle Tastenflags löschen
315
 rjmp haupt                 ;fertig, schlafen gehen...
316
317
318
minus:
319
 sbrs tfl,0                 ;Taste 0?
320
 rjmp minus1                ;nein...
321
 sub soll0,ri               ;ja, ändern
322
rcall t1m
323
 brcc minus1                ;Unterlauf ? (nein...)
324
 clr soll0                 ;ja, auf 0 setzen
325
minus1:
326
 sbrs tfl,1                 ;Taste 1?
327
 rjmp minus2                ;nein...
328
 sub soll1,ri               ;ja, ändern
329
rcall t2m
330
 brcc minus2                ;Unterlauf ? (nein...)
331
 clr soll1                  ;ja, auf 0 setzen
332
minus2:
333
 sbrs tfl,2                 ;Taste 2?
334
 rjmp minus3                ;nein...
335
 sub soll2,ri               ;ja, ändern
336
rcall t3m
337
 brcc minus3                ;Unterlauf ? (nein...)
338
 clr soll2                  ;ja, auf 0 setzen
339
minus3:
340
 sbrs tfl,3                 ;Taste 3?
341
 rjmp minus4                ;nein...
342
 sub soll3,ri               ;ja, ändern
343
rcall t4m
344
 brcc minus4                ;Unterlauf ? (nein...)
345
 clr soll3                  ;ja, auf 0 setzen
346
minus4:
347
 sbrs tfl,4                 ;Taste 4?
348
 rjmp minus5                ;nein...
349
 sub soll4,ri               ;ja, ändern
350
rcall t5m
351
 brcc minus5                ;Unterlauf ? (nein...)
352
 clr soll4                  ;ja, auf 0 setzen
353
minus5:
354
 sbrs tfl,5                 ;Taste 5?
355
 rjmp minus6                ;nein...
356
 sub soll5,ri               ;ja, ändern
357
rcall t6m
358
 brcc minus6                ;Unterlauf ? (nein...)
359
 clr soll5                  ;ja, auf 0 setzen
360
minus6:
361
 sbrs tfl,6                 ;Taste 6?
362
 rjmp minus7                ;nein...
363
 sub soll6,ri               ;ja, ändern   
364
  rcall t7m
365
 brcc minus7                ;Unterlauf ? (nein...)
366
 clr soll6                  ;ja, auf 0 setzen
367
minus7:
368
 sbrs tfl,7                 ;Taste 7?
369
 rjmp minus8                ;nein...
370
 sub soll7,ri               ;ja, ändern
371
rcall t8m
372
 brcc minus8                ;Unterlauf ? (nein...)
373
 clr soll7                  ;ja, auf 0 setzen
374
minus8:
375
 clr tfl                    ;alle Tastenflags löschen
376
 rjmp haupt                 ;Hauptprogramm Endlosschleife
377
378
 
379
gibaus:                 ;Unterprogramm zum Ausgeben der Werte
380
 cbr flags,1<<aktuLCD       ;Jobflag löschen, wird ja jetzt erledigt
381
382
383
384
 locate 0,0                 ;Erste Position der zweiten Zeile
385
386
 print 'K'                  ;K
387
 print 'A'                  ;A
388
 print 'N'                  ;N
389
 print '1'                  ;1
390
 print ' '                  ;Leerzeichen
391
 print8 r0                  ;1. Wert
392
 print '%'                  ;Prozent-Zeichen
393
 print ' '                  ;Leerzeichen
394
 ;print ' '                  ;Leerzeichen
395
 
396
locate 1,0 
397
398
 print 'K'                  ;K
399
 print 'A'                  ;A
400
 print 'N'                  ;N
401
 print '2'                  ;2
402
 print ' '                  ;Leerzeichen
403
 print8 r1                  ;2. Wert
404
 print '%'                  ;Prozent-Zeichen
405
 print ' '                  ;Leerzeichen
406
 ;print ' '                  ;Leerzeichen
407
408
locate 2,0 
409
 print 'K'                  ;K
410
 print 'A'                  ;A
411
 print 'N'                  ;N
412
 print '3'                  ;3
413
 print ' '                  ;Leerzeichen
414
 print8 r2                  ;3. Wert
415
 print '%'                  ;Prozent-Zeichen
416
 print ' '                  ;Leerzeichen
417
 ;print ' '                  ;Leerzeichen
418
419
locate 3,0  
420
 print 'K'                  ;K
421
 print 'A'                  ;A
422
 print 'N'                  ;N
423
 print '4'                  ;4
424
 print ' '                  ;Leerzeichen
425
 print8 r3                  ;4. Wert
426
 print '%'                  ;Prozent-Zeichen
427
 print ' '                  ;Leerzeichen
428
 ;print ' '                  ;Leerzeichen
429
430
 locate 0,10                 ;erste Position der dritten Zeile
431
432
 print 'K'                  ;K
433
 print 'A'                  ;A
434
 print 'N'                  ;N
435
 print '5'                  ;5
436
 print ' '                  ;Leerzeichen
437
 print8 r4                  ;5 Wert
438
 print '%'                  ;Prozent-Zeichen
439
 print ' '                  ;Leerzeichen
440
 ;print ' '                  ;Leerzeichen
441
442
locate 1,10 
443
 print 'K'                  ;K
444
 print 'A'                  ;A
445
 print 'N'                  ;N
446
 print '6'                  ;6
447
 print ' '                  ;Leerzeichen
448
 print8 r5                  ;6 Wert
449
 print '%'                  ;Prozent-Zeichen
450
 print ' '                  ;Leerzeichen
451
 ;print ' '                  ;Leerzeichen
452
453
locate 2,10 
454
 print 'K'                  ;K
455
 print 'A'                  ;A
456
 print 'N'                  ;N
457
 print '7'                  ;7
458
 print ' '                  ;Leerzeichen
459
 print8 r6                  ;7. Wert
460
 print '%'                  ;Prozent-Zeichen
461
 print ' '                  ;Leerzeichen
462
 ;print ' '                  ;Leerzeichen
463
464
locate 3,10 
465
 print 'K'                  ;K
466
 print 'A'                  ;A
467
 print 'N'                  ;N
468
 print '8'                  ;8
469
 print ' '                  ;Leerzeichen
470
 print8 r7                  ;8. Wert
471
 print '%'                  ;Prozent-Zeichen
472
 print ' '                  ;Leerzeichen
473
 
474
 
475
 ret
476
477
478
479
480
481
482
Tim0_OVF:                   ;ISR Timer0-Überlauf
483
 in sregtemp, sreg          ;Sreg sichern
484
 out tcnt0,tsw              ;Timer auf Startwert setzen
485
 inc pwz                    ;PWM-Treppenzähler erhöhen
486
 cpi pwz, pwu               ;PWM-Zählumfang erreicht?
487
 brne Time0_a               ;nein... (die 3 Punkte bedeuten bei mir Sprung)
488
 clr pwz                    ;von vorn beginnen mit zählen
489
Time0_a:                    ;Vergleich der einzelnen PWM-Werte mit dem PWM-Treppenzähler
490
                            ;(Idee geklaut bei Peter Dannegger)
491
 cp pwz, soll7              ;Sollwert erreicht? (Ergebnis im Carry)
492
 rol temp                   ;Carry-Bits "einsammeln", dieses wird bis Bit7 durchgeschoben
493
 cp pwz, soll6
494
 rol temp                   ;Bit 6
495
 cp pwz, soll5
496
 rol temp                   ;Bit 5
497
 cp pwz, soll4
498
 rol temp                   ;Bit 4
499
 cp pwz, soll3
500
 rol temp                   ;Bit 3
501
 cp pwz, soll2
502
 rol temp                   ;Bit 2
503
 cp pwz, soll1
504
 rol temp                   ;Bit 1
505
 cp pwz, soll0
506
 rol temp                   ;Bit 0
507
 ;com temp                   ;invertieren da low-aktive LED im STK500
508
 out portB, temp            ;Ausgabe 
509
 inc task                   ;Taskscheibe erhöhen (Tastenabfrage erfolgt nur bei Task Nr. 0)
510
                            ;andere Aufgaben können bei anderen Zählerständen aufgerufen werden
511
                            ;dabei ist darauf zu achten, dass kein Durchlauf der ISR mehr als
512
                            ;70 Takte dauert, da die ISR alle 100 Takte aufgerufen wird und
513
                            ;der Aufruf (mit Reti) schon 10 Takte braucht.
514
 brne timertasks            ;nur bei 0 Tasten abfragen...
515
Tastenabfrage:              ;Entprellroutine (geklaut bei Peter Dannegger...)
516
 in scan,tap                ;Tastenport einlesen (gedrückt=L)
517
 com scan                   ;invertieren (gedrückt=H)
518
 eor scan,tas               ;nur Änderungen werden H
519
 and tz0,scan               ;Prellzähler unveränderter Tasten löschen (Bit0)
520
 and tz1,scan               ;Prellzähler unveränderter Tasten löschen (Bit1)
521
 com tz0                    ;L-Bit zählen 0,2,->1, 1,3,->0
522
 eor tz1,tz0                ;H-Bit zählen 0,2,->tz1 toggeln
523
 and scan,tz0               ;Änderungen nur dann erhalten, wenn im Prellzähler
524
 and scan,tz1               ;beide Bits gesetzt sind (Zählerstand 3)
525
 eor tas,scan               ;erhaltene Änderungen toggeln alten (gültigen) Tastenstatus
526
 and scan,tas               ;nur (neu) gedrückte Tastenbits bleiben erhalten
527
 or tfl,scan                ;und zugehörige Bits setzen (gelöscht wird nach Abarbeitung)
528
 ;in "tas" steht jetzt der gültige Tastenzustand,
529
 ;in "tfl" die Flags der neu gedrückten, noch nicht abgearbeiteten Tasten...
530
timertasks:
531
 cpi task,2                 ;Beispiel für Verzweigung nach Taskscheibe
532
 brne timerfertig           ;bei falscher Tasknummer Überspringen...
533
 dec avt                    ;Anzeige-Vorteiler runter
534
 brne timerfertig           ;unten? nein, weg hier...
535
 ldi avt,avt0               ;ja, Startwert laden
536
 sbr flags,1<<aktuLCD       ;Flag setzen, um LCD zu aktualisieren
537
 
538
timerfertig:
539
 out sreg, sregtemp         ;Sreg wiederherstellen
540
 reti                       ;ISR fertig
541
542
543
544
Text1:
545
546
547
ret
548
549
550
551
552
t1:
553
locate 3,27
554
print '1'
555
print ' '                ;6 Leerzeichen
556
print ' '
557
print ' '
558
print ' '
559
print ' '
560
print 'U'
561
print 'P'
562
print ' '
563
ret
564
565
566
567
t2:
568
locate 3,27
569
print '2'
570
print ' '                ;6 Leerzeichen
571
print ' '
572
print ' '
573
print ' '
574
print ' '
575
print 'U'
576
print 'P'
577
print ' '
578
ret
579
580
t3:
581
locate 3,27
582
print '3'
583
print ' '                ;6 Leerzeichen
584
print ' '
585
print ' '
586
print ' '
587
print ' '
588
print 'U'
589
print 'P'
590
print ' '
591
ret
592
593
t4:
594
locate 3,27
595
print '4'
596
print ' '                ;6 Leerzeichen
597
print ' '
598
print ' '
599
print ' '
600
print ' '
601
print 'U'
602
print 'P'
603
print ' '
604
ret
605
606
t5:
607
locate 3,27
608
print '5'
609
print ' '                ;6 Leerzeichen
610
print ' '
611
print ' '
612
print ' '
613
print ' '
614
print 'U'
615
print 'P'
616
print ' '
617
ret
618
619
t6:
620
locate 3,27
621
print '6'
622
print ' '                ;6 Leerzeichen
623
print ' '
624
print ' '
625
print ' '
626
print ' '
627
print 'U'
628
print 'P'
629
print ' '
630
ret
631
632
t7:
633
locate 3,27
634
print '7'
635
print ' '                ;6 Leerzeichen
636
print ' '
637
print ' '
638
print ' '
639
print ' '
640
print 'U'
641
print 'P'
642
print ' '
643
ret
644
645
t8:
646
locate 3,27
647
print '8'
648
print ' '                ;6 Leerzeichen
649
print ' '
650
print ' '
651
print ' '
652
print ' '
653
print 'U'
654
print 'P'
655
print ' '
656
ret
657
658
659
t1m:
660
locate 3,27
661
print '1'
662
print ' '                ;6 Leerzeichen
663
print ' '
664
print ' '
665
print ' '
666
print 'D'
667
print 'O'
668
print 'W'
669
print 'N'
670
ret
671
672
t2m:
673
locate 3,27
674
print '2'
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
t3m:
686
locate 3,27
687
print '3'
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
t4m:
699
locate 3,27
700
print '4'
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
t5m:
712
locate 3,27
713
print '5'
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
t6m:
725
locate 3,27
726
print '6'
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
t7m:
738
locate 3,27
739
print '7'
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
t8m:
751
locate 3,27
752
print '8'
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
764
765
766
 ;