Hyper-Graphics
Das Programm »Hyper-Graphics« erlaubt über SYS-Befehle vom Basic aus Grafiken mit einer Auflösung von 208 * 256 = 53248 Bildpunkten zu erstellen. Damit stößt der VC 20 auf seine alten Tage noch in Bereiche des ZX-Spectrum oder Apple II vor.
Immer wenn über die VC-20-Grafik geschrieben wurde, bekam man bisher vorgerechnet, daß die Auflösung nicht 28160 Punkte überschreiten kann. Um es gleich vorwegzunehmen: In der Tat ist die echte Maximalauflösung mit 160 * 192 = 30720, wie sie durch entsprechendes Umgestalten der Data-Becker-Grafik aus dem Buch »Tips & Tricks für den VC 20« gelang, weit von jenen 53248 Punkten entfernt, doch läßt sich diese Auflösung durch einen Trick erreichen. Doch zuerst sei die Frage beantwortet, warum es überhaupt erstrebenswert ist, eine solche Auflösung mit so »krummen« Werten zu entwerfen: Die 256 Punkte in vertikaler Richtung werden benötigt, um komplette 8-Bit-Werte darstellen zu können. Die 208 Punkte in horizontaler Richtung ergeben sich aus dem Umstand, daß nicht mehr auf den normalen Fernsehbildschirm paßt. Bei manchen älteren Geräten kann es vorkommen, daß die Bildschirmecken der Grafik abgeschnitten werden oder daß am Bildschirmrand Verzerrungen auftreten. Der Vorteil vertikal 256 Punkte darstellen zu können, wird besonders dadurch wertvoll, daß die meisten mit dem Computer erfaßten Meßwerte 8-Bit-Werte zum Beispiel von Analog/Digital-Wandlern sind. So habe ich mir beispielsweise einen solchen A/D-Wandler mit dem Baustein ZN 427 gebaut und damit in Abhängigkeit von der Zeit die Spannung an einem sich entladenden Kondensator gemessen. Da »Hyper-Graphics« vertikal 256 Punkte setzen kann, brauchten die Daten nicht gerundet werden, was einen gleichmäßigeren und genaueren Graphen ergab, als dies mit Computern, wie zum Beispiel dem C 64, dem C 128 oder dem Schneider-Computer, möglich ist, da diese zwar der Punktezahl nach eine noch wesentlich bessere Grafik bieten, aber in der Vertikalen nur 200 Punkte darstellen können, was einen deutlichen Genauigkeitsverlust bedeutet, besonders wenn man versucht, 256 Werte auf die 200 möglichen Punkte umzurechnen, da hier bedingt durch das erforderliche Runden die gemessenen Daten arg verzerrt und verfremdet wiedergegeben werden.
Das »Hyper-Graphics«-Verfahren
Das Verfahren ist im Prinzip so alt wie der VC 20 selbst, denn der normale Bildschirm arbeitet ähnlich: Er besteht aus 22 * 23 Zeichen, was bei einer 8*8-Matrix 32384 Punkte ergibt. Dies ist nur durch Mehrfachbenutzung der einzelnen Buchstaben und Zeichen möglich. Da bei den meisten Darstellungen nur einige Graphen gleichzeitig dargestellt werden müssen, kann man in die übrigen Bildschirmstellen ein und dasselbe punktfreie Zeichen schreiben und erhält so eine Grafik, die einer erheblich höher aufgelösten entspricht, obwohl der Computer genaugenommen nur etwas mehr als den halben Bildschirm »mit Punkten füllen« kann. Es kommt eben nur auf die richtige Verteilung der Punkte an!
Anwendung von Hyper-Graphics
Als erstes ist das Programm abzutippen, und zwar wahlweise als Basic-Lader (Listing 1) oder als Maschinenprogramm (Listing 2). Der Basic-Lader bietet den Vorteil, die eingePOKEten Daten durch eine Checksumme zu überprüfen. Trotzdem kann es aber zu unerkannten Fehlern kommen; deshalb sollte das Programm unbedingt vorher gespeichert werden, zumal der Lader durch Starten des Maschinenprogramms auf jeden Fall zerstört wird. Ist das Programm einmal korrekt eingegeben und erfolgreich gestartet, meldet sich der VC 20 mit einer Bildschirmzeile mehr, die den Benutzer in roter, reverser Schrift daran erinnert, daß er »Hyper-Graphics« eingeschaltet hat. Diese Zeile läßt sich mit dem normalen Editor nicht ändern und bleibt auch nach STOP/RESTORE erhalten. Wem die Farbe aber nicht gefällt, der kann in den Basic-Lader vor den SYS-Befehl ein POKE 9487, Punktfarbe setzen und damit den Schriftzug seinen Vorstellungen anpassen.
Folgende Befehle stellt das Programm zur Verfügung (siehe auch Listing 3):
SYS IN: Schaltet Grafik-Modus ein
SYS CL: Löscht den Grafik-Bildschirm
SYS OF: Schaltet den Grafik-Modus aus
SYS SE, X, Y, Punktfarbe: Setzt einen Punkt
SYS RE, X, Y: Löscht einen Punkt
SYS GS, »Filename«, Devicenumber: Speichert Grafik
SYS GL, »Filename«, Devicenumber: Lädt Grafik
Die Variablen haben folgende Werte beziehungsweise Bedeutungen:
IN = 9330: CL = IN+3: SE = CL+3: RE = SE+3: GS = RE+3: GL = GS+3: OF = GL+3:
0 <= X <= 207 und bedeutet die X-Koordinate
0 <= Y <= 255 und bedeutet die Y-Koordinate
Die Punktfarbe entspricht der sonst üblichen Buchstabenfarbe, »Devicenumber« gibt das Ein-/Ausgabegerät an.
Da der Grafik nur maximal 255 - 26 = 229 Zeichen zur Verfügung stehen (der Videochip läßt nicht mehr als 256 Zeichen zu, die Zeichen 0 bis 25 überschneiden sich mit dem Video-RAM, und Zeichen 26 ist das Grafik-Leerzeichen), kann es vorkommen, daß die Grafikkapazität vor Fertigstellen der Grafik erschöpft ist; der Computer meldet dann einen »TOO MANY CHARACTERS ERROR«, was dem Benutzer signalisieren soll, daß zur Darstellung der Grafik mehr als die vorhandenen 229 Zeichen benötigt werden (wie das Demo-Programm aber beweist, muß man den Bildschirm schon sehr vollschreiben, um diese Fehlermeldung zu erreichen). Soll diese Fehlermeldung ignoriert werden, um wenigstens den bisher fertiggestellten Teil der Grafik weiter anzuzeigen, so läßt sich dies durch POKE 9609,27 erreichen, indem man nach jedem Punktsetzen die Speicherstelle 680 ausliest: Solange ihr Wert größer als 26 ist, können beruhigt weitere Punkte gesetzt werden, ist ihr Wert aber 26, so können nur dort weitere Punkte gesetzt werden, wo bereits Zeichen auf dem Bildschirm sind. Um festzustellen, ob an der betreffenden Stelle bereits ein Zeichen im Video RAM steht, gibt man
SYS 9663,X,Y : SYS 9707 : A = PEEK (256*PEEK(252)+PEEK(251))
ein. Ist A=26, dann kann an die betreffende Stelle kein Punkt mehr gesetzt werden. Die Punktlöschroutine prüft bei jedem Punktlöschen, ob das aktuell bearbeitete Zeichen leer geworden ist und so durch das Leerzeichen ersetzt werden kann. Ist dies der Fall, dann wird das freigewordene Zeichen gegen das »größte« nicht freie Zeichen ausgetauscht und dieses Zeichen wieder freigegeben, indem der Zähler für die freien Zeichen erhöht wird.
Zum Demo-Programm (Listing 4):
Es enthält folgende 4 Teile:
- Eine 3D-Effekt-Grafik; die Formel hierzu ist dem oben erwähnten Data-Becker-Buch entnommen und wurde für »Hyper-Graphics« umgeschrieben.
- Die für Grafikprogramme obligatorische Sinuskurve wird dargestellt.
- Eine aus Rechtecken bestehende Zentralperspektive wird dargestellt.
- Es wird mit hochauflösender Grafik in doppelthoher Schrift ein Text geschrieben und dann perspektivisch ein Oktaeder in Durchsichtszeichnung gezeichnet (dieser Programmteil ist Bestandteil eines Programmes, das auf einer Ausstellung unseres Chemie-Leistungskurses lief, und stieß im großen und ganzen auf positive Kritik).
Die einzelnen Programmteile werden durch Druck der angezeigten Zahlentaste gewählt, danach sind Rahmen-, Hintergrund- und Punktfarbe im bekannten Rahmen der VC-20-Möglichkeiten einzugeben, wobei auf korrekte Eingabe getestet wird. Da das Demo-Programm nur zum Ansehen dient, wurde, um die Abtipparbeit zu erleichtern, weitgehend auf REMs verzichtet, lediglich die Zeilen 1350 bis 1450 sind interessant, da hier die Routine zur Umwandlung von ASCII-Zeichen in Punkte zur gleichzeitigen Darstellung von Text und Grafik steht. Diese Routine ist aber leicht verständlich.
Um normal hohe Zeichen zu erhalten, streicht man einfach die Zeile 1450 und ersetzt in Zeile 1440 den Term 2*J+16 durch J+16. Die 16 gibt die Höhe des Textes auf dem Bildschirm an, soll in Kleinschrift geschrieben werden, so muß zu AD 2048 addiert werden.
Sie sehen also, 53248 Bildpunkte sind nicht nur den »größeren« Computern vorbehalten.
(Joachim Brocke/og)10 rem ******************************
20 rem * hyper-graphics *
30 rem * (c) 1985 by joachim brocke *
40 rem * dietrich-bonhoefferstr.5 *
50 rem * 4790 paderborn *
60 rem ******************************
70 print"{clr}{rvon}>>> hyper-graphics <<<"
80 printtab(7)"(c) 1985"spc(31)"by joachim brocke
90 print"{down}{rvon} bitte warten ! "
100 rem daten einpoken
110 fori=0to831
120 readx:a=a+x
130 pokei+8192+1024,x
140 next
150 rem test auf korrekte dateneingabe
160 ifa<>97379thenprint"{rvon}fehler in datazeilen !":end
170 rem programmstart
180 sys9980
190 rem maschinenprogramm in data-zeilen
200 data190,190,190,160,136,153,144,133,146,173,135,146,129,144,136,137,131
210 data147,160,188,188,188,63,84,79,79,32,77,65,78,89,32,67,72,65,82,65,67
220 data84,69,82,83,0,26,52,78,104,130,156,182,208,234,4,30,56,82,108,134,16
230 data16,16,16,16,16,16,16,16,16,17,17,17,17,17,17,128,64,32,16,8,4,2,1,9
240 data19,26,33,255,204,40,67,41,32,49,57,56,53,32,66,89,32,74,79,65,67,72
250 data73,77,32,66,82,79,67,75,69,76,135,36,76,53,37,76,112,37,76,27,38,76
260 data129,38,76,162,38,76,220,36,173,5,144,201,204,240,51,160,6,185,81,36
270 data153,255,143,136,208,247,162,208,189,255,31,157,255,15,189,207,32,157
280 data207,16,189,159,33,157,255,147,189,111,34,157,207,148,202,208,229,162
290 data112,189,63,35,157,159,17,202,208,247,96,40,3,41,32,49,57,56,53,32,2
300 data25,32,10,15,1,3,8,9,13,32,2,18,15,3,11,5,173,5,144,201,192,240,43,162
310 data208,189,255,15,157,255,31,189,207,16,157,207,32,189,255,147,157,159
320 data33,189,207,148,157,111,34,202,208,229,162,112,189,159,17,157,63,35,202
330 data208,247,32,95,229,160,2,162,22,189,255,35,157,249,17,152,157,249,149
340 data202,208,243,160,6,185,227,237,153,255,143,136,208,247,169,34,141,1,144
350 data169,48,141,3,144,96,169,26,162,208,157,255,15,157,207,16,157,255,31
360 data157,207,32,202,208,241,162,96,169,0,157,159,17,157,159,33,202,208,247
370 data169,18,133,252,169,0,133,251,162,14,168,145,251,136,208,251,230,252
380 data202,208,246,169,255,141,168,2,96,32,191,37,32,253,206,32,158,215,142
390 data173,2,32,235,37,201,26,208,12,173,168,2,201,27,144,32,206,168,2,145
400 data251,32,254,37,17,253,145,253,165,252,24,105,132,133,252,172,169,2,173
410 data173,2,145,251,96,169,0,133,62,32,220,36,169,22,160,36,32,30,203,76,98
420 data196,32,220,36,162,14,76,55,196,32,253,206,32,158,215,224,208,176,238
430 data138,74,74,74,141,169,2,138,41,7,141,170,2,32,253,206,32,158,215,138
440 data74,74,74,74,141,171,2,138,41,15,141,172,2,96,172,171,2,185,42,36,133
450 data251,185,58,36,133,252,172,169,2,177,251,96,168,74,74,74,74,24,105,16
460 data133,254,152,10,10,10,10,24,133,253,173,170,2,170,189,74,36,172,172,2
470 data96,32,191,37,32,235,37,201,26,240,94,141,174,2,32,254,37,73,255,49,253
480 data145,253,160,0,177,253,208,73,200,192,16,208,247,172,169,2,169,26,145
490 data251,238,168,2,162,208,189,207,16,205,168,2,240,17,189,255,15,240,3,202
500 data208,240,173,174,2,157,255,15,76,103,38,173,174,2,157,207,16,165,253
510 data133,251,165,254,133,252,173,168,2,32,254,37,160,0,177,253,145,251,200
520 data192,16,208,247,96,32,220,36,32,253,206,32,209,225,173,168,2,141,255
530 data35,162,0,160,36,138,133,253,169,18,133,254,169,253,133,185,76,216,255
540 data32,220,36,32,253,206,32,209,225,169,1,133,185,169,0,32,213,255,173,255
550 data35,141,168,2,96,72,138,72,152,72,173,29,145,16,37,45,30,145,170,41
560 data2,240,32,44,17,145,32,52,247,32,225,255,208,18,32,82,253,32,240,38,32
570 data249,253,32,24,229,32,220,36,108,2,192,76,86,255,76,222,254,169,187,141
580 data24,3,169,38,141,25,3,96,120,32,240,38,173,0,3,141,58,39,173,1,3,141
590 data59,39,169,45,141,0,3,169,39,141,1,3,32,220,36,169,39,133,44,141,130
600 data2,169,64,133,43,141,129,2,32,68,198,88,76,116,196,142,57,39,32,220,36
610 data174,57,39,108,58,39,28,58,196,0,0,0,0
PROGRAMM : HEX-DUMP 2400 2740 ----------------------------------- 2400 : BE BE BE A0 88 99 90 85 84 2408 : 92 AD 87 92 81 90 88 89 77 2410 : 83 93 A0 BC BC BC 3F 54 74 2418 : 4F 4F 20 4D 41 4E 59 20 ED 2420 : 43 48 41 52 41 43 54 45 2C 2428 : 52 53 00 1A 34 4E 68 82 C4 2430 : 9C B6 D0 EA 04 1E 38 52 6F 2438 : 6C 86 10 10 10 10 10 10 CF 2440 : 10 10 10 10 11 11 11 11 5E 2448 : 11 11 80 40 20 10 08 04 B5 2450 : 02 01 09 13 1A 21 FF CC BC 2458 : 28 43 29 20 31 39 38 35 98 2460 : 20 42 59 20 4A 4F 41 43 A6 2468 : 48 49 4D 20 42 52 4F 43 27 2470 : 4B 45 4C 87 24 4C 35 25 26 2478 : 4C 70 25 4C 1B 26 4C 81 E6 2480 : 26 4C A2 26 4C DC 24 AD D1 2488 : 05 90 C9 CC F0 33 A0 06 18 2490 : B9 51 24 99 FF 8F 88 D0 6E 2498 : F7 A2 D0 BD FF 1F 9D FF 3B 24A0 : 0F BD CF 20 9D CF 10 BD 9A 24A8 : 9F 21 9D FF 93 BD 6F 22 68 24B0 : 9D CF 94 CA D0 E5 A2 70 5B 24B8 : BD 3F 23 9D 9F 11 CA D0 E1 24C0 : F7 60 28 03 29 20 31 39 1D 24C8 : 38 35 20 02 19 20 0A 0F BC 24D0 : 01 03 08 09 0D 20 02 12 74 24D8 : 0F 03 0B 05 AD 05 90 C9 A5 24E0 : C0 F0 2B A2 D0 BD FF 0F 51 24E8 : 9D FF 1F BD CF 10 9D CF 98 24F0 : 20 BD FF 93 9D 9F 21 BD 38 24F8 : CF 94 9D 6F 22 CA D0 E5 EE 2500 : A2 70 BD 9F 11 9D 3F 23 7F 2508 : CA D0 F7 20 5F E5 A0 02 E8 2510 : A2 16 BD FF 23 9D F9 11 56 2518 : 98 9D F9 95 CA D0 F3 A0 F4 2520 : 06 B9 E3 ED 99 FF 8F 88 A2 2528 : D0 F7 A9 22 8D 01 90 A9 19 2530 : 30 8D 03 90 60 A9 1A A2 FB 2538 : D0 9D FF 0F 9D CF 10 9D 8C 2540 : FF 1F 9D CF 20 CA D0 F1 B0 2548 : A2 60 A9 00 9D 9F 11 9D DB 2550 : 9F 21 CA D0 F7 A9 12 85 6D 2558 : FC A9 00 85 FB A2 0E A8 38 2560 : 91 FB 88 D0 FB E6 FC CA AB 2568 : D0 F6 A9 FF 8D A8 02 60 04 2570 : 20 BF 25 20 FD CE 20 9E D1 2578 : D7 8E AD 02 20 EB 25 C9 CB 2580 : 1A D0 0C AD A8 02 C9 1B B3 2588 : 90 20 CE A8 02 91 FB 20 CE 2590 : FE 25 11 FD 91 FD A5 FC BE 2598 : 18 69 84 85 FC AC A9 02 16 25A0 : AD AD 02 91 FB 60 A9 00 40 25A8 : 85 3E 20 DC 24 A9 16 A0 19 25B0 : 24 20 1E CB 4C 62 C4 20 11 25B8 : DC 24 A2 0E 4C 37 C4 20 E3 25C0 : FD CE 20 9E D7 E0 D0 B0 29 25C8 : EE 8A 4A 4A 4A 8D A9 02 93 25D0 : 8A 29 07 8D AA 02 20 FD 9A 25D8 : CE 20 9E D7 8A 4A 4A 4A 12 25E0 : 4A 8D AB 02 8A 29 0F 8D 65 25E8 : AC 02 60 AC AB 02 B9 2A 49 25F0 : 24 85 FB B9 3A 24 85 FC E2 25F8 : AC A9 02 B1 FB 60 A8 4A 2A 2600 : 4A 4A 4A 18 69 10 85 FE 30 2608 : 98 0A 0A 0A 0A 18 85 FD DD 2610 : AD AA 02 AA BD 4A 24 AC 00 2618 : AC 02 60 20 BF 25 20 EB 5F 2620 : 25 C9 1A F0 5E 8D AE 02 E0 2628 : 20 FE 25 49 FF 31 FD 91 DE 2630 : FD A0 00 B1 FD D0 49 C8 D1 2638 : C0 10 D0 F7 AC A9 02 A9 A7 2640 : 1A 91 FB EE A8 02 A2 D0 C6 2648 : BD CF 10 CD A8 02 F0 11 2B 2650 : BD FF 0F F0 03 CA D0 F0 9A 2658 : AD AE 02 9D FF 0F 4C 67 09 2660 : 26 AD AE 02 9D CF 10 A5 2D 2668 : FD 85 FB A5 FE 85 FC AD 47 2670 : A8 02 20 FE 25 A0 00 B1 BC 2678 : FD 91 FB C8 C0 10 D0 F7 15 2680 : 60 20 DC 24 20 FD CE 20 19 2688 : D1 E1 AD A8 02 8D FF 23 9D 2690 : A2 00 A0 24 8A 85 FD A9 FF 2698 : 12 85 FE A9 FD 85 B9 4C ED 26A0 : D8 FF 20 DC 24 20 FD CE F4 26A8 : 20 D1 E1 A9 01 85 B9 A9 D5 26B0 : 00 20 D5 FF AD FF 23 8D B8 26B8 : A8 02 60 48 8A 48 98 48 60 26C0 : AD 1D 91 10 25 2D 1E 91 BA 26C8 : AA 29 02 F0 20 2C 11 91 70 26D0 : 20 34 F7 20 E1 FF D0 12 92 26D8 : 20 52 FD 20 F0 26 20 F9 59 26E0 : FD 20 18 E5 20 DC 24 6C 02 26E8 : 02 C0 4C 56 FF 4C DE FE 04 26F0 : A9 BB 8D 18 03 A9 26 8D 0E 26F8 : 19 03 60 78 20 F0 26 AD 37 2700 : 00 03 8D 3A 27 AD 01 03 16 2708 : 8D 3B 27 A9 2D 8D 00 03 77 2710 : A9 27 8D 01 03 20 DC 24 BD 2718 : A9 27 85 2C 8D 82 02 A9 84 2720 : 40 85 2B 8D 81 02 20 44 D1 2728 : C6 58 4C 74 C4 8E 39 27 B0 2730 : 20 DC 24 AE 39 27 6C 3A 90 2738 : 27 1C 3A C4 00 00 00 00 95
SPRUNGTABELLE: .2472 JMP $2487 ZU 'GRAPHIK EINSCHALTEN' .2475 JMP $2535 ZU 'GRAPHIKSPEICHER LOESCHEN' .2478 JMP $2570 ZU 'PUNKT SETZEN' .247B JMP $261B ZU 'PUNKT LOESCHEN' .247E JMP $2681 ZU 'GRAPHIK ABSPEICHERN' .2481 JMP $26A3 ZU 'GRAPHIK LADEN' .2484 JMP $24DC ZU 'GRAPHIK AUSSCHALTEN' GRAPHIK EINSCHALTEN: .2487 LDA $9005 HOLT ZEIGER AUF CHARACTERGENERATOR .248A CMP #$CC PRUEFT AUF 'GRAPHIK ON'-MODUS .248C BEQ $24C1 SCHON IM GRAPHIKMODUS? DANN ZURUECK INS BASIC .248E LDY #$06 ZAEHLER FUER ANZAHL DER VIDEOCONTROLLERWERTE .2490 LDA $2451,Y HOLT VIDEOCONTROLLERWERTE AUS TABELLE .2493 STA $8FFF,Y LAEDT VIDEOCONTROLLER .2496 DEY ZAEHLER ERNIEDRIGEN .2497 BNE $2490 UNGLEICH NULL? DANN VORGANG WIEDERHOLEN .2499 LDX #$D0 ZAEHLER FUER GRAPHIK-KOPIE LADEN .249B LDA $1FFF,X BYTE AUS VIDEORAMKOPIE, 1.TEIL, HOLEN .249E STA $0FFF,X ...UND INS VIDEORAM BRINGEN .24A1 LDA $20CF,X BYTE AUS VIDEORAMKOPIE, 2.TEIL, HOLEN .24A4 STA $10CF,X ...UND INS VIDEORAM BRINGEN .24A7 LDA $219F,X BYTE AUS FARBRAMKOPIE, 1.TEIL, HOLEN .24AA STA $93FF,X ...UND INS FARBRAM BRINGEN .24AD LDA $226F,X BYTE AUS FARBRAMKOPIE, 2.TEIL, HOLEN .24B0 STA $94CF,X ...UND INS FARBRAM BRINGEN .24B3 DEX ZAEHLER ERNIEDRIGEN .24B4 BNE $249B UNGLEICH NULL? DANN NAECHSTES ZEICHEN KOPIEREN .24B6 LDX #$70 ZAEHLER FUER KOPIE DER ZEICHEN 26-32 DES CHARACTERGENERATORS .24B8 LDA $233F,X BYTE AUS KOPIE DIESES CHARACTERGENERATORTEILS HOLEN .24BB STA $119F,X ...UND IN CHARACTERGENERATOR EINSETZEN .24BE DEX ZAEHLER ERNIEDRIGEN .24BF BNE $24B8 UNGLEICH NULL? DANN NAECHSTES ZEICHEN KOPIEREN .24C1 RTS ZURUECK INS BASIC GRAPHIK LOESCHEN: .2535 LDA #$1A AKKU MIT CODE FUER GRAPHIKLEERZEICHEN LADEN .2537 LDX #$D0 ZAEHLER FUER VIDEORAM LADEN .2539 STA $0FFF,X 1.TEIL DES VIDEORAMS LOESCHEN .253C STA $10CF,X 2.TEIL DES VIDEORAMS LOESCHEN .253F STA $1FFF,X 1.TEIL DER VIDEORAMKOPIE LOESCHEN .2542 STA $20CF,X 2.TEIL DER VIDEORAMKOPIE LOESCHEN .2545 DEX ZAEHLER ERNIEDRIGEN .2546 BNE $2539 UNGLEICH NULL? DANN VORGANG WIEDERHOLEN .2548 LDX #$60 ZAEHLER FUER ZEICHEN 26-32 DES CHARACTERGENERATORS .254A LDA #$00 AKKU MIT PUNKTFREIEM BYTE LADEN .254C STA $119F,X BYTE DER ZEICHEN 26-32 DES CHARACTERGENERATORS LOESCHEN .254F STA $219F,X BYTE IN DER KOPIE DIESES TEILS LOESCHEN .2552 DEX ZAEHLER ERNIEDRIGEN :2553 BNE $254C UNGLEICH NULL? DANN VORGANG WIEDERHOLEN .2555 LDA #$12 AKKU MIT HIGH-BYTE DES CHARACTERGENERATORSTARTS LADEN .2557 STA $FC AKKU ALS VEKTOR-HIGHBYTE IN ZEROPAGE BRINGEN .2559 LDA #$00 AKKU MIT LOW-BYTE DES CHARACTERGENERATORS LADEN .255B STA $FB ...UND ALS VEKTOR-LOWBYTE IN ZEROPAGE BRINGEN .255D LDX #$0E X-REG. MIT ANZAHL DER PAGES DES CHARACTERGENERATORS LADEN .255F TAY Y-REG. ALS ZAEHLER DER BYTES PRO PAGE .2560 STA ($FB),Y CHARACTERGENERATORBYTE LOESCHEN .2562 DEY ZAEHLER FUER BYTES INNERHALB EINER PAGE ERNIEDRIGEN .2563 BNE $2560 UNGLEICH NULL? DANN NAECHSTES ZEICHEN LOESCHEN .2565 INC $FC VEKTOR AUF NAECHSTE MEMORYPAGE DES CHARACTERGENERATOR SETZEN .2567 DEX ZAEHLER FUER ANZAHL DER ZU BEARBEITENDEN PAGES ERNIEDRIGEN .2568 BNE $2560 UNGLEICH NULL? DANN NAECHSTE PAGE LOESCHEN .256A LDA #$FF CODE FUER OBERSTES FREIES ELEMENT DES CHARACTERGENERATORS .256C STA $02A8 ...AN FREIEN PLATZ IN PAGE 2 BRINGEN .256F RTS ZURUECK INS BASIC PUNKT SETZEN: .2570 JSR $25BF HOLT X- UND Y-KOORDINATE AUS BASICTEXT UND WANDELT UM .2573 JSR $CEFD TESTET AUF KOMMA IM BASICTEXT .2576 JSR $D79E HOLT BYTEWERT (HIER FARBCODE) AUS BASICTEXT INS X-REGISTER .2579 STX $02AD FARBCODE ZWISCHENSPEICHERN .257C JSR $25EB HOLT AKTUELL ZU BEARBEITENDES ZEICHEN AUS VIDEORAM .257F CMP #$1A PRUEFT AUF LEERZEICHEN .2581 BNE $258F KEIN LEERZEICHEN? DANN KEIN NEUES ZEICHEN SETZEN .2583 LDA $02A8 CODE FUER OBERSTES FREIES ZEICHEN HOLEN .2586 CMP #$1B VERGLEICHT MIT CODE FUER LEERZEICHEN +1 .2588 BCC $25AA KLEINER? DANN FEHLERMELDUNG 'TOO MANY CHARACTERS' AUSGEBEN .258A DEC $02A8 ZEIGER AUF OBERSTES FREIES ELEMENT DES CHARACTERGEN. ERNIEDR. .258D STA ($FB),Y NEUES ZEICHEN INS VIDEORAM BRINGEN .258F JSR $25FE BERECHNET VEKTOR AUF CHARACTERGENERATOR & HOLT AKTUELLES BYTE .2592 ORA ($FD),Y SETZT PUNKT IM AKTUELLEN BYTE .2594 STA ($FD),Y SCHREIBT BEARBEITETES BYTE IN CHARACTERGENERATOR .2596 LDA $FC HOLT HIGH-BYTE DES VIDEORAMVEKTORS .2598 CLC ADDITION VORBEREITEN .2599 ADC #$84 WANDELT VEKTOR AUF VIDEORAM IN VEKTOR AUF FARBRAM UM .259B STA $FC SETZT HIGH-BYTE DES VEKTORS AUF DAS FARBRAM .259D LDY $02A9 HOLT BILDSCHIRMSPALTE .25A0 LDA $02AD HOLT FARBCODE .25A3 STA ($FB),Y BRINGT FARBCODE INS FARBRAM .25A5 RTS ZURUECK INS BASIC FEHLERMELDUNG 'TOO MANY CHARACTERS' AUSGEBEN: .25A6 LDA #$00 FLAG FUER 'CONT GESPERRT' .25A8 STA $3E CONT SPERREN .25AA JSR $24DC GRAPHIK AUSSCHALTEN .25AD LDA #$16 ZEIGER AUF ASCII-TEXT (LOW-BYTE) DES FEHLERTEXTES .25AF LDY #$24 ZEIGER AUF ASCII-TEXT (HIGH-BYTE) DES FEHLERTEXTES .25B1 JSR $CB1E ASCII-TEXT AUSGEBEN .25B4 JMP $C462 'ERROR' AUSGEBEN + READY-MELDUNG FEHLERMELDUNG 'ILLEGAL QUANTITY ERROR' AUSGEBEN: .25B7 JSR $24DC GRAPHIK AUSSCHALTEN .25BA LDX #$0E CODENUMMER FUER 'ILLEGAL QUANTITY' HOLEN .25BC JMP $C437 FEHLERMELDUNG AUSGEBEN X- & Y-KOORDINATEN AUS BASICTEXT HOLEN: .25BF JSR $CEFD TESTET AUF KOMMA IM BASICTEXT .25C2 JSR $D79E HOLT BYTE-WERT (HIER X-KOORDINATE) AUS BASICTEXT .25C5 CPX #$D0 VERGLEICHT MIT MAXIMALWERT +1 .25C7 BCS $25B7 GROESSER/GLEICH? DANN ZU 'ILLEGAL QUANTITY ERROR' AUSGENBEN .25C9 TXA .25CA LSR ┐ .25CB LSR ├─ X-KOORDINATE/8 BERECHNEN .25CC LSR ┘ .25CD STA $02A9 ...UND ZWISCHENSPEICHERN .25D0 TXA .25D1 AND #$07 REST VON (X-KOORDINATE/8) BERECHNEN .25D3 STA $02AA ...UND ZWISCHENSPEICHERN .25D6 JSR $CEFD TESTED AUF KOMMA IM BASICTEXT .25D9 JSR $D79E HOLT BYTE-WERT (HIER Y-KOORDINATE) AUS BASICTEXT INS X-REG. .25DC TXA .25DD LSR ┐ .25DE LSR ├─ Y-KOORDINATE/16 BERECHNEN .25DF LSR │ .25E0 LSR ┘ .25E1 STA $02AB ... UND ZWISCHENSPEICHERN .25E4 TXA .25E5 AND #$0F REST VON Y-KOORDINATE/16 BERECHNEN .25E7 STA $02AC ...UND ZWISCHENSPEICHERN .25EA RTS ZURUECK ZUR PUNKTSETZ- BZW. -LOESCHROUTINE AKTUELL ZU BEARBEITENDES ZEICHEN AUS VIDEORAM HOLEN: .25EB LDY $02AB BILDSCHIRMZEILE HOLEN .25EE LDA $242A,Y VIDEORAMVEKTOR (LOW-BYTE) AUS TABELLE HOLEN .25F1 STA $FB ...UND IN ZEROPAGE BRINGEN .25F3 LDA $243A,Y VIDEORAMVEKTOR (HIGH-BYTE) AUS TABELLE HOLEN .25F6 STA $FC ...UND IN ZEROPAGE BRINGEN .25F8 LDY $02A9 HOLT BILDSCHIRMSPALTE .25FB LDA ($FB),Y HOLT AKTUELLES ZEICHEN AUS VIDEORAM .25FD RTS ZURUECK ZUR HAUPTROUTINE VEKTOR AUF CHARACTERGENERATOR UND PUNKT BERECHNEN: .25FE TAY AKTUELLES ZEICHEN ZWISCHENSPEICHERN .25FF LSR ┐ .2600 LSR ├─HIGH-BYTE DES VEKTORS AUF DEN CHARACTERGENERATOR BERECHNEN .2601 LSR │ .2602 LSR ┘ .2603 CLC ADDITION VORBEREITEN .2604 ADC #$10 OFFSET FUER ANFANG DES CHARACTERGENERATORS ADDIEREN .2606 STA $FE HIGH-BYTE DES VEKTORS AUF DEN CHARACTERGENERATORS SETZEN .2608 TYA AKTUELLES ZEICHEN HOLEN .2609 ASL ┐ .260A ASL ├─LOW-BYTE DES VEKTORS AUF DEN CHARACTERGENERATOR BERECHNEN .260B ASL │ .260C ASL ┘ .260D CLC .260E STA $FB LOW-BYTE DES VEKTORS AUF DEN CHARACTERGENERATOR SETZEN .2610 LDA $02AA HOLT PUNKTNUMMER .2613 TAX IN INDEX WANDELN .2614 LDA $244A,X HOLT BIT=PUNKT AUS TABELLE .2617 LDY $02AC ZEILE DES AKTUELLEN ZEICHENS HOLEN .261A RTS ZURUECK ZUR HAUPTROUTINE PUNKT LOESCHEN: .261B JSR $25BF HOLT X- UND Y-KOORDINATE AUS BASICTEXT .261E JSR $25EB HOLT AKTUELLES ZEICHEN AUS VIDEORAM .2621 CMP #$1A VERGLEICHT MIT LEERZEICHEN .2623 BEQ $2680 GLEICH? DANN FERTIG! .2625 STA $02AE AKTUELLES ZEICHEN RETTEN .2628 JSR $25FE BERECHNET VEKTOR AUF CHARACTERGENERATOR UND HOLT PUNKT .262B EOR #$FF BYTE INVERTIEREN .262D AND ($FD),Y BIT=PUNKT LOESCHEN .262F STA ($FD),Y BYTE IN CHARACTERGENERATOR EINSETZEN .2631 LDY #$00 INDEX AUF ANFANG DES AKTUELLEN CHARACTERS .2633 LDA ($FD),Y EIN BYTE DES AKTUELLEN ZEICHENS HOLEN .2635 BNE $2680 UNGLEICH NULL (NICHT ALLE PUNKTE GELOESCHT)? DANN FERTIG .2637 INY INDEX ERHOEHEN .2638 CPY #$10 ZEICHEN GANZ DURCHSUCHT? .263A BNE $2633 NEIN, DANN NAECHSTES BYTE TESTEN .263C LDY $02A9 BILDSCHIRMSPALTE HOLEN .263F LDA #$1A CODE FUER LEERZEICHEN .2641 STA ($FB),Y LEERZEICHEN IN VIDEORAM BRINGEN .2643 INC $02A8 EIN ZEICHEN FREIGEBEN .2646 LDX #$D0 ZAEHLER FUER BYTES PRO VIDEORAMHAELFTEN INITIALISIEREN .2648 LDA $02AE ZEICHEN AUS ZWISCHENSPEICHER HOLEN .264B CMP $10CF,X GLEICH ZEICHEN IN VIDEORAM (2.TEIL) ? .264E BEQ $2661 JA,DANN ZU 'ZEICHEN VERTAUSCHEN' FUER 2.VIDEORAMTEIL .2650 CMP $0FFF,X GLEICH ZEICHEN IN VIDEORAM (1.TEIL) ? .2653 BEQ $2658 GLEICH, DANN ZU 'ZEICHEN VERTAUSCHEN' FUER 1.VIDEORAMTEIL .2655 DEX ZAEHLER ERNIEDRIGEN .2656 BNE $2648 UNGLEICH NULL? DANN VORGANG WIEDERHOLEN .2658 LDA $02AE ZEICHEN HOLEN .265B STA $0FFF,X ...UND INS VIDEORAM BRINGEN .265E JMP $2667 ZU 'ZEICHEN KOPIEREN' .2661 LDA $02AE ZEICHEN HOLEN .2664 STA $10CF,X ...UND INS VIDEORAM BRINGEN .2667 LDA $FD ┐ .2669 STA $FB ├─ VEKTOR AUF CHARACTERGENERATOR KOPIEREN .266B LDA $FE │ .266D STA $FC ┘ .266F LDA $02A8 FREIGEGEBENES ZEICHEN HOLEN .2672 JSR $25FE VEKTOR AUF CHARACTERGENERATOR ZU DIESEM ZEICHEN BERECHNEN .2675 LDY #$00 INDEX AUF ANFANG DER ZEICHEN .2677 LDA ($FD),Y BYTE DES ALTEN CHARACTERS HOLEN .2679 STA ($FB),Y ...UND IN FREIGEWORDENES ZEICHEN EINSETZEN .267B INY ZAEHLER ERHOEHEN .267C CMP #$10 MIT 16 VERGLEICHEN .267E BNE $2677 UNGLEICH? DANN NAECHSTES BYTE KOPIEREN .2680 RTS ZURUECK INS BASIC GRAPHIK ABSPEICHERN: .2681 JSR $24DC GRAPHIK AUSSCHALTEN .2684 JSR $CEFD PRUEFT AUF KOMMA IM BASICTEXT .2687 JSR $E1D1 HOLT FILENAME UND DEVICENUMBER .268A LDA $02A8 ZEIGER AUF OBERSTES FREIES ZEICHEN HOLEN .268D STA $23FF ...UND IN ABZUSPEICHERNDEN RAM-BEREICH BRINGEN .2690 LDX #$00 LOW-BYTE DER ENDADRESSE DES GRAPHIKSPEICHERS .2692 LDY #$24 HIGH-BYTE DER ENDADRESSE DES GRAPHIKSPEICHERS .2694 TXA LOW-BYTE DER ANFANGSADRESSE DES GRAPHIKSPEICHERS .2695 STA $FD ALS VEKTOR-LOW-BYTE IN ZEROPAGE BRINGEN .2697 LDA #$12 HIGH-BYTE DER STARTADRESSE DES GRAPHIKSPEICHERS HOLEN .2699 STA $FE ...UND ALS VEKTOR-HIGH-BYTE IN ZEROPAGE BRINGEN .269B LDA #$FD ADRESSE DES VEKTORS AUF START DES GRAPHIKSPEICHERS .269D STA $B9 ...FUER SAVE-ROUTINE ZUGAENGLICH MACHEN .269F JMP $FFD8 ZUR 'SAVE'-ROUTINE DES BETRIEBSSYSTEMS GRAPHIK EINLADEN: .26A2 JSR $24DC GRAPHIK AUSSCHALTEN .26A5 JSR $CEFD PRUEFT AUF KOMMA IM BASICTEXT .26A8 JSR $E1D1 HOLT FILENAME UND DEVICENUMBER .26AB LDA #$01 KONSTANTE FUER 'ABSOLUT LADEN' .26AD STA $B9 ... FUER LOAD-ROUTINE SETZEN .26AF LDA #$00 FLAG FUER LOAD .26B1 JSR $FFD5 ZUR LOAD-ROUTINE DES BETRIEBSSYSTEMS .26B4 LDA $23FF ZEIGER AUF OBERSTES FREIES ZEICHEN HOLEN .26B7 STA $02A8 ... UND AN DIE VORGESEHENE STELLE BRINGEN .26BA RTS ZURUECK INS BASIC NMI-ROUTINE: .26BB PHA AKKU RETTEN. .26BC TXA X-REGISTER IN AKKU UEBERTRAGEN .26BD PHA X-REGISTER RETTEN .26BE TYA Y-REGISTER IN AKKU UEBERTRAGEN .26BF PHA Y-REGISTER RETTEN .26C0 LDA $911D AKKU MIT IFR DES VIA1 LADEN .26C3 BPL $26EA IRQ-BIT GESETZT? DANN ZURUECK .26C5 AND $911E NICHT FREIGEGEBENE INTERRUPTS AUSSIEBEN .26C8 TAX ERGEBNIS RETTEN .26C9 AND #$02 SCHIEBEREGISTERFLAG ISOLIEREN .26CB BEQ $26ED ZUR NMI-ROUTINE FUER SERIELLE SCHNITTSTELLE .26CD BIT $9111 .26D0 JSR $F734 ERHOEHT UHRZEIT UND FRAGT STOP-TASTE AB .26D3 JSR $FFE1 FRAGT AUCH DIE STOP-TASTE AB (IM BETRIEBSSYTEM SO VORGESEHEN) .26D6 BNE $26EA NICHT GDRUECKT? DANN ZURUECK .26D8 JSR $FD52 BETRIEBSSYSTEMVEKTOREN NEU SETZEN .26DB JSR $26F0 NMI-VEKTOR NEU SETZEN .26DE JSR $FD9F INITIALISIERT I/O-REGISTER .26E1 JSR $E518 INITIALISIERT VIDEOCONTROLLER UND LOESCHT BILDSCHIRM .26E4 JSR $24DC SCHALTET AUF HYPERGRAPHIC-TEXTMODUS (= GRAPHIK AUSSCHALTEN) .26E7 JMP ($C002) ZUM BASIC-KALTSTART .26EA JMP $FF56 RUECKKEHR VOM INTERRUPT .26ED JMP $FEDE ZUR NMI-ROUTINE FUER SERIELLE SCHNITTSTELLE .26F0 LDA #$BB LOW-BYTE DES HYPERGRAPHIC-NMI-VEKTORS HOLEN .26F2 STA $0318 ...UND EINSETZEN .26F5 LDA #$26 HIGH-BYTE DES HYPERGRAPHIC-NMI-VEKTORS HOLEN .26F7 STA $0319 ...UND SETZEN .26FA RTS RUECKSPRUNG HYPERGRAPHICS START: .26FB SEI INTERRUPT SPERREN .26FC JSR $26F0 HYPERGRAPHIC-NMI-VEKTOR SETZEN .26FF LDA $0300 LOWBYTE DES VEKTORS AUF AUSGABE EINER FEHLERMELDUNG HOLEN .2702 STA $273A ... UND RETTEN .2705 LDA $0301 DAZUGEHOERIGES HIGH-BYTE HOLEN .2708 STA $273B ... UND ENTSPRECHEND SETZEN .270B LDA #$2D LOW-BYTE DES NEUEN FEHLERMELDUNGSAUSGABEVEKTORS HOLEN .270D STA $0300 ... UND SETZEN .2710 LDA #$27 ENTSPRECHENDES HIGH-BYTE HOLEN .2712 STA $0301 ... UND ENTSPRECHEND SETZEN .2715 JSR $24DC HYPERGRAPHIC-MODUS AUF TEXT STELLEN (= GRAPHIK AUSSCHALTEN) .2718 LDA #$27 HIGH-BYTE DES HYPERGRAPHICS-BASIC-STARTS HOLEN .271A STA $2C ... UND IN DIE DAFUER VORGESEHEN SPEICHERSTELLEN BRINGEN .271C STA $0282 .271F LDA #$40 ENTSPRECHEND MIT DEM LOW-BYTE VERFAHREN .2721 STA $FB " .2723 STA $0281 " .2726 JSR $C644 BASIC-BEFEHL NEW AUSFUEHREN .2729 CLI IRQ WIEDER FREIGEBEN .272A JMP $C474 ZUM READY-EINSPRUNG AUSGABE EINER FEHLERMELDUNG: .272D STX $2739 FEHLERNUMMER RETTEN .2730 JSR $24DC GRAPHIK AUSSCHALTEN .2733 LDX $2739 FEHLERNUMMER HOLEN .2736 JMP ($273A) ZU 'FEHLERMELDUNG AUSGEBEN' GRAPHIK AUSSCHALTEN: .24DC LDA $9005 HOLT ZEIGER AUF CHARACTERGENERATOR & VIDEORAM .24DF CMP #$C0 GRAPHIK AUS? .24E1 BEQ $2510 JA, DANN FERTIG .24E3 LDX #$D0 ┐ .24E5 LDA $0FFF,X │ .24E8 STA $1FFF,X │ .24EB LDA $10CF,X │ .24EE STA $20CF,X ├─ SIEHE $2499 - $24B4 .24F1 LDA $93FF,X │ (HIER UMGEKEHRTE FUNKTION) .24F4 STA $219F,X │ .24F7 LDA $94CF,X │ .24FA STA $226F,X │ .24FD DEX │ .24FE BNE $24E5 ┘ .2500 LDA #$70 ┐ .2502 LDA $119F,X │ .2505 STA $233F,X ├─ SIEHE $24B6 - $24BF .2508 DEX │ (HIER UMGEKEHRTE FUNKTION) .2509 BNE $2502 ┘ .250B JSR $E55F BILDSCHIRM LOESCHEN .250E LDY #$02 CODE FUER FARBE ROT IM FARBRAM .2510 LDX #$16 ANZAHL DER ZEICHEN PRO ZEILE .2512 LDA $23FF,X HOLT BILDSCHIRMCODE AUS TABELLE .2515 STA $11F9,X BRING ZEICHEN AUF BILDSCHIRM .2518 TYA HOLT FARBCODE .2519 STA $95F9,X SETZT FARBCODE .251C DEX ZAEHLER ERNIEDRIGEN .251D BNE $2512 UNGLEICH NULL? DANN VORGANG WIEDERHOLEN .251F LDY #$06 ZAEHLER FUER ANZAHL DER VIDEOCONTROLLER-WERTE .2521 LDA $EDE3,Y HOLT VIDEOCONTROLLER-WERTE AUS DEM ROM .2524 STA $8FFF,Y SETZT VIDEOCONTROLLER-WERTE .2527 DEX ZAEHLER ERNIEDRIGEN .2528 BNE $2521 UNGLEICH NULL? DANN VORGANG WIEDERHOLEN .252A LDA #$22 BILDSCHIRM VERTIKAL ZENTRIEREN .252C STA $9001 " .252F LDA #$30 KONSTANTE FUER 24-ZEILEN-BILDSCHIRM HOLEN .2531 STA $9003 ... UND IN VIDEOCONTROLLER SETZEN .2534 RTS ZURUECK INS BASIC
10 rem******************************
20 rem* hyper-graphik demo *
30 rem* (c) 1985 by joachim brocke *
40 rem* dietrich-bonhoefferstr.-5 *
50 rem* 4790 paderborn *
60 rem******************************
70 remfestlegung der startadressen der einzelnen routinen
80 in=9330:rem'graphic on'
90 cl=in+3:rem'graphic clear'
100 se=in+6:rem'point set'
110 rs=in+9:rem'reset point'
120 gs=in+12:rem'gsave'
130 gl=in+15:rem'gload'
140 of=in+18:rem'graphic off'
150 remmenue
160 print"{clr}hyper-graphics demo "
170 print"{down}bitte waehlen:"
180 print"{down}3d-effekt-bild (-1-)"
190 print"{down}sinuskurve (-2-)"
200 print"{down}rechtecke (-3-)"
210 print"{down}text + graphik (-4-)"
220 getx$
230 ifval(x$)<1orval(x$)>4then220
240 remwahl der farben
250 print"{down}nach dem plotten taste druecken"
260 input"rahmenfarbe";rf
270 ifrf<0orrf>7thenprint"fehler!":goto260
280 input"hintergrundfarbe";hf
290 ifhf<0orhf>15thenprint"fehler!":goto280
300 input"punktfarbe";pf
310 ifpf<0orpf>7orpf=hfthenprint"fehler!":goto300
320 poke646,pf:remzeichenfarbe im text-modus festlegen
330 poke36879,8+rf+16*hf:remrahmen- und hintergrundfarbe setzen
340 remverzweigeningewaehltesunterprogramm:
350 onval(x$)gosub1200,400,470,1310:
360 poke198,0:wait198,1:remauf taste warten
370 sysof:remgraphik ausschalten
380 run:remneustart
390 rem*** die unterprogramme ***
400 remsinuskurve
410 sysin:syscl
420 x=-1:fori=-~to~step2*~/208
430 x=x+1:y=sin(i)
440 sysse,x,y*127+127,pf
450 nexti
460 return
470 remrechtecke
480 sysin:syscl
490 fori=16to208-16
500 sysse,i,16,pf
510 sysse,i,255-16,pf
520 next
530 fori=31to208-31
540 sysse,i,31,pf
550 sysse,i,255-31,pf
560 next
570 fori=16to255-16
580 sysse,16,i,pf
590 sysse,208-16,i,pf
600 next
610 fori=31to255-31
620 sysse,31,i,pf
630 sysse,208-31,i,pf
640 next
650 fori=64to208-64
660 sysse,i,64,pf
670 sysse,i,255-64,pf
680 next
690 fori=71to208-71
700 sysse,i,71,pf
710 sysse,i,255-71,pf
720 next
730 fori=86to255-86
740 sysse,86,i,pf
750 sysse,208-86,i,pf
760 next
770 fori=90to255-90
780 sysse,90,i,pf
790 sysse,208-90,i,pf
800 next
810 fori=86to208-86
820 sysse,i,86,pf
830 sysse,i,255-86,pf
840 next
850 fori=90to208-90
860 sysse,i,90,pf
870 sysse,i,255-90,pf
880 next
890 fori=64to255-64
900 sysse,64,i,pf
910 sysse,208-64,i,pf
920 next
930 fori=71to255-71
940 sysse,71,i,pf
950 sysse,208-71,i,pf
960 next
970 fori=100to208-100
980 sysse,i,100,pf
990 sysse,i,255-100,pf
1000 next
1010 fori=102to208-102
1020 sysse,i,102,pf
1030 sysse,i,255-102,pf
1040 next
1050 fori=100to255-100
1060 sysse,100,i,pf
1070 sysse,208-100,i,pf
1080 next
1090 fori=102to255-102
1100 sysse,102,i,pf
1110 sysse,208-102,i,pf
1120 next
1130 x=-1:fori=1to102
1140 y=i
1150 sysse,i,y,pf
1160 sysse,208-i,y,pf
1170 sysse,i,255-y,pf
1180 sysse,208-i,255-y,pf
1190 nexti:return
1200 rem3-effekt-bild
1210 sysin:syscl
1220 deffna(z)=90*exp(-z*z/1500)
1230 g=100:k=50:forx=-103to0:l=-50:h=5*int(sqr(10816-x*x)/5)
1240 fory=hto-hstep-5:z=25+fna(sqr(x*x+y*y))-.6*y
1250 x1=g+x:y1=256-z-k:x2=g-x
1260 ifz>lthenl=z:sysse,x1+3,y1,6:sysse,x2+3,y1,6
1270 nexty,x
1280 return
1290 sysof:poke36879,27:print"{blu}
1300 return
1310 remtext+graphik
1320 input"{clr}ascii-text oktaeder{left}{left}{left}{left}{left}{left}{left}{left}{left}{left}";te$
1330 iflen(te$)>16orte$=""then1320
1340 syscl:sysin
1350 remascii-text (a-z und space bis ?)in punkte wandeln
1360 fori=1tolen(te$)
1370 a=asc(mid$(te$,i,1)):ifa>63thena=a-64
1380 x=i*8:remstartkoordinate des textes (x-richtung)
1390 ad=32768+a*8:remadresse des zeichens im charactergenerator
1400 forj=0to7
1410 a=peek(ad+j):remeines der 8 bytes des zeichens holen
1420 fork=0to7
1430 p=aand2^(7-k):remeines der 8 bits pro zeile des zeichens isolieren
1440 ifpthensysse,x+k,2*j+16,pf:rembit gesetzt?dann punkt setzen
1450 ifpthensysse,x+k,2*j+17,pf:rembit gesetzt?dann punkt setzen
1460 nextk,j,i
1470 sysin:gosub1490:remoktaeder zeichnen
1480 return
1490 remoktaeder
1500 forx=66to133
1510 sysse,x+30,127,pf
1520 sysse,x+30,128,pf
1530 sysse,(xand252)+68,127-18,pf
1540 nextx
1550 y=127:forx=67to101
1560 sysse,(x+30)and254,y,pf
1570 sysse,x+97,y,pf
1580 sysse,x+96,y,pf
1590 y=y-.5
1600 nextx
1610 remsysse,118,118,1
1620 y=128:forx=66to118
1630 sysse,x+30,y,pf
1640 sysse,x+30,y+1,pf
1650 sysse,x+30,256-y,pf
1660 sysse,x+30,255-y,pf
1670 y=y+1.5
1680 nextx
1690 y=110:forx=102to118
1700 sysse,x+30,y,pf
1710 y=y+6
1720 nextx
1730 y=207:forx=118to133
1740 sysse,x+30,y-1,pf
1750 sysse,x+30,y-4,pf
1760 sysse,x+30,y-2,pf
1770 sysse,x+30,y-3,pf
1780 sysse,x+30,y-5,pf
1790 y=y-5
1800 nextx
1810 y=206:forx=118to169
1820 sysse,x+30,y,pf
1830 sysse,x+30,y-1,pf
1840 y=y-1.9
1850 nextx
1860 y=110:forx=102to118
1870 sysse,x+30,y,pf
1880 y=y-3.8
1890 nextx
1900 y=49:forx=148to164
1910 sysse,x,y,pf
1920 sysse,x,y+1,pf
1930 sysse,x,y+2,pf
1940 sysse,x,y+3,pf
1950 sysse,x,y+4,pf
1960 y=y+4.8
1970 nextx
1980 y=49:forx=148to200
1990 sysse,x,y,pf
2000 y=y+1.15
2010 nextx
2020 return