C 64
Hardcopy

Apfelmännchen mit 256000 Punkten

Normale Hardcopies erreichen beim Vergrößern keine höhere Auflösung. Im Gegensatz dazu können Sie auf dem MPS 802 mit wenig Aufwand und viel Zeit die Grafiken des »Apfelmännchen« in achtfacher Auflösung drucken.

Schwarzweiß-Computergrafik: sternförmiges Muster aus geschwungenen Streifen

Bevor Sie ans Abtippen gehen, vergewissern Sie sich bitte, daß Ihr Drucker ein MPS 802 der Version 7 ist. Das erreichen Sie, indem Sie beim Einschalten des Druckers die Taste »Paper Advance« gedrückt halten. Nur bei der Version 7 kann das Programm hundertprozentig funktionieren.

Geben Sie die Programme »APFEL/BAS« (Listing 1) und »APFEL/OBJ« (Listing 2) ein und speichern Sie sie auf Diskette oder Kassette. Für die Kassettenversion ändern Sie in Zeile 100 die Gerätenummer »8« zu »1«. Dann laden Sie das Basic-Programm »APFEL/BAS« und starten es mit <RUN>. Dieses Programm lädt dann das Maschinenprogramm »APFEL/OBJ« nach. Nachdem das passiert ist, erscheint das Menü. In diesem können Sie aus vier Menüpunkten auswählen.

Wenn Sie den Menüpunkt »Berechnen« wählen, können Sie die Parameter eingeben, wie Sie es von dem Programm aus Ausgabe 11/85 gewohnt sind. Nachdem Sie diese Eingaben gemacht haben, beginnt der Computer zu rechnen. Sie erkennen das an der wechselnden Umrandungsfarbe, die für jeden berechneten Punkt einmal ihre Farbe wechselt (daran erkennen Sie, daß Ihr Computer arbeitet). Sobald das Bild fertig berechnet ist, erscheint wieder das Menü.

Wenn Sie anschließend den Menüpunkt »Speichern« wählen, brauchen Sie nur den Filenamen einzugeben und das aktuelle Bild wird gespeichert. Anschließend wird der Fehlerkanal der Floppy ausgelesen und ausgegeben. Das Speichern funktioniert übrigens auch nach einem Abbruch.

Das Laden funktioniert genauso. Nur werden nach der Fehlermeldung noch die Parameter des Bildes ausgegeben.

Wenn Sie nun den Menüpunkt »Drucken« wählen, erscheint zunächst die Frage, ob Sie Normal oder Invers drucken wollen. Dabei bedeutet »Normal«, daß eine Fläche, bei der die Folge den gewählten Grenzwert nicht überschreitet, weiß bleibt. Das heißt also, daß das Apfelmännchen weiß bleibt. Wenn Sie »Invers« wählen, wird eben dieses Apfelmännchen schwarz (je nach Farbband auch grau) gedruckt. Da dieses Programm aufgrund der hohen Auflösung sehr viel Rechenzeit benötigt, empfiehlt es sich, dieses Programm für Bilder zu benutzen, die mit dem Programm aus Ausgabe 11/85 erstellt wurden.

Die Rechenzeit des »Apfelpainters« beträgt etwa das Achtfache der Zeit, die das Programm für ein Bild benötigt (wegen der achtfachen Auflösung).

Da das Basic-Programm sehr einfach programmiert ist, soll ausschließlich das Assemblerprogramm (Listing 3) erklärt werden.

Dieses besteht aus den Hauptroutinen »APFEL«, »LOAD«, »SAVE«, und »PRINT«. Die am Anfang des Programms stehende Sprungleiste gewährt einwandfreien Zugang zu allen Programmteilen. Die Routine »START« liest erst die Werte aus dem SYS-Befehl aus (»HOLWERTE«) und springt dann in die Routine zum Berechnen des Bildes »APFEL«. Diese entspricht größtenteils der Rechenroutine von G. Pehlands Programm. Die im folgenden erwähnten Unterschiede erklären sich durch die bedeutend größere Auflösung und der Anordnung der Pixel im Speicher.

Der erste Unterschied besteht in den Zeilen 4080 – 4100. Dort wird der 16-Bit-Wert »SPALTEN« in Fließkommaformat umgerechnet. Die Routine »INTTOFAC« ist aus der Betriebssystemroutine »$BDCD« entnommen. Die gleiche Befehlsfolge steht in den Zeilen 4230 – 4250, nur diesmal für den 16-Bit-Wert »ZEILEN«. Die nächste Änderung steht in den Zeilen 4430 – 4433. Diese Änderung ergibt sich daraus, daß der Einfachheit halber »POS« von Acht auf Null heruntergezählt wird. Der nächste Unterschied besteht darin, daß das Carry-Flag zur Anzeige eines gesetzten Punktes benutzt wird (Zeile 4560 – 4570). Diese Befehlsfolge löscht also den nächsten Punkt. In Zeile 4810 – 4830 wird der Routine »PLOT« mitgeteilt, ob der entsprechende Punkt gesetzt oder gelöscht ist. Dazu wird ausgenutzt, daß das niederwertigste Bit angibt, ob der Byte-Wert gerade oder ungerade ist. (Die Auflösung der Farben beschränkt sich beim Drucker ja logischerweise auf zwei Farben: Weiß und Schwarz entsprechend einem geraden oder ungeraden Wert von »TIEFE«.) Aufgrund dieser Übergabemethode wurde natürlich auch der Anfang der Routine »PLOT« (Zeile 5200 – 5220) geändert. Dort wird dann das Carry-Flag in den Wert »BYTE« geSHIFTet. Und in Zeile 5225 wird für jeden berechneten Punkt die Umrandungsfarbe geändert. In Zeile 5400 wurde die Anzahl der Spalten von 40 (Bildschirm) auf 80 (Drucker) hochgesetzt. In den Zeilen 5520 – 5580 wurde von der ursprünglichen 8-Bit-Operation auf eine 16-Bit-Operation umgestellt. Die Routine »SETBYTE« (Zeile 6000 – 6080) speichert das in der Routine »PLOT« zusammengestellte Byte. Und zwar werden diese Bytes in der Reihenfolge, wie sie errechnet werden, gespeichert. Es entsteht also eine andere Anordnung der Bitmap als in der Bitmap des Grafikbildschirms.

Die Routine »PRINT« transportiert jeweils den Inhalt einer Druckzeile in einen Zwischenspeicher, der dann von der Routine »OUTPUT« ausgegeben wird.

In Zeile 12000 werden die nötigen Files geöffnet. Dann wird in Zeile 12010 die Anzahl der Druckzeilen definiert. Anschließend wird in den Zeilen 12030 – 12060 der Zeiger auf den Grafikspeicher gesetzt. In den Zeilen 12070 – 12100 wird nun ein zweiter Zeiger auf den Zwischenspeicher gesetzt. In den Zeilen 12120 – 12130 wird dann der Inhalt der betreffenden Druckzeile aus dem Grafikspeicher in den Zwischenspeicher transportiert. In den folgenden Zeilen werden nun die Zeiger erhöht und anschließend wird abgefragt, ob der Zwischenspeicher schon voll ist (Zeile 12210 – 12250). Wenn der Zwischenspeicher voll ist, wird dieser ausgegeben (Zeile 12260). Anschließend wird der Zähler für die Zeilen dekrementiert. Wenn er noch nicht gleich Null ist, wird auf die gleiche Art die nächste Druckzeile ausgegeben. Sonst wird die Ausgabe wieder auf den Bildschirm gelegt (Zeile 12285) und die Files werden geschlossen (Zeile 12290).

Nachdem das Bitmuster einer Zeile in den Puffer »SPEICHER« übertragen wurde, wird diese Zeile von der Routine »OUTPUT« ausgedruckt. Als erstes werden die 8 Byte eines Zeichens in einen Zwischenspeicher gebracht. Diese 8 Byte befinden sich aufgrund der Anordnung der Bitmap in jeweils 80 Byte Abstand. Zuerst wird ein Zwischenspeicher für den Zeiger auf das jeweilige Byte angelegt (Zeile 13000 – 13650). In den Zeilen 13060 – 13070 wird dann der Zähler für die Anzahl der Leerzeichen vor dem nächsten Zeichen gesetzt und in den nächsten beiden Zeilen wird dann noch ein Zähler für die Anzahl der Spalten gesetzt. In der Zeile 13120 wird nun das X-Register als Zähler für die Anzahl der Pixelzeilen definiert. Dann wird in den Zeilen 13140 – 13170 ein Zeiger auf das aktuelle Byte definiert. In den Zeilen 13180 – 13270 werden jetzt die 8 Byte eines Zeichens aus »SPEICHER« nach »PUFFER« kopiert. Die Bytes stehen jeweils in einem Abstand von 80 Byte im »SPEICHER« (Zeile 13220). Anschließend werden nun die 8 Byte eines Zeichens, die ja horizontal orientiert sind, vertikal orientiert. Das heißt, jeweils die Bits der gleichen Wertigkeit aller 8 Byte ergeben ein Byte. Das geht folgendermaßen vonstatten: Es wird ein Maskenbyte definiert (Zeile 13300), in dem jeweils das entsprechende Bit gesetzt ist. Dieses Maskenbyte wird nun mit allen 8 Byte AND-verknüpft (Zeile 13330) und entsprechend dem Ergebnis wird dann das Carry-Flag gesetzt oder gelöscht (Zeile 13340 – 13360). Dieses Carry-Flag wird dann in das Ergebnisbyte geschoben (Zeile 13370). Dieser Vorgang wiederholt sich nun, bis alle 8 Byte so behandelt worden sind (Zeile 13380 – 13400). Nun wird das Ergebnisbyte noch in Abhängigkeit, ob Normal oder Invers gedruckt werden soll, invertiert (Zeile 13420). Das Ergebnis wird dann im »PUFFER« abgelegt (Zeile 13430). Nun wird noch im Maskenbyte das nächste Bit gesetzt und gleichzeitig getestet, ob schon alle 8 Bits durch sind (Zeile 13442 – 13448).

Nun wird als erstes getestet, ob alle 8 Bitmusterbyte leer sind (Zeile 13450 – 13462). Wenn ja, wird dieses Zeichen gar nicht erst gedruckt, sondern es werden nur die Zeiger aktualisiert (Zeile 13630). In den Zeilen 13469 – 13490 werden nun die 8 Bitmusterbyte an den Drucker geschickt. Anschließend wird in Zeile 13500 – 13580 der Druckknopf auf das aktuelle Zeichen positioniert, was nach einem Wagenrücklauf ja nötig ist. Nachdem das geschehen ist, wird in Zeile 13590 – 13600 das eben definierte Zeichen ausgedruckt. In den nächsten beiden Zeilen wird durch einen Wagenrücklauf das Definieren des nächsten Zeichens ermöglicht. In den Zeilen 13630 – 13660 werden dann die Zähler und Zeiger aktualisiert. Wenn nun die Zeile noch nicht fertig gedruckt ist, wird das nächste Zeichen auf die gleiche Art ausgedruckt.

Das Programm wurde extra so entwickelt, daß man es leicht für einen anderen Drucker umschreiben kann. Man muß dafür dann nur die druckerspezifischen Routinen anpassen (Openfls, Closefls). Die Routine »OUTPUT« muß jedoch für den entsprechenden Drucker vollkommen neu geschrieben werden. Diese Routine muß die Bitmuster, die im »SPEICHER« enthalten sind, ausdrucken. Dieses Bitmuster ist folgendermaßen gespeichert: In den ersten 80 Byte sind der Reihe nach alle Bits der nächsten Pixelzeile enthalten. Die nächsten 80 Byte enthalten die Bits der nächsten Pixelzeile und so weiter bis zur achten Pixelzeile.

Für den erfahrenen Programmierer dürfte das Umschreiben dieses Programms auf einen 8-Nadeldrucker keine Probleme bereiten. Bei Druckern mit 9 Nadeln gibt es zwei Möglichkeiten. Einmal besteht die Möglichkeit, nur mit 8 Nadeln zu arbeiten und damit kompatibel zu der vorliegenden Version zu bleiben, oder man arbeitet mit allen 9 Nadeln, wobei man dann die vertikale Auflösung anpassen oder aber die letzte Zeile gesondert verarbeiten muß, denn die jetzige vertikale Auflösung ist ja nicht durch 9 teilbar.

Das Programm funktioniert auch mit dem C 128 einwandfrei. Für die Benutzer dieses Computers empfiehlt es sich aber, in Zeile 2070 den Prozessor auf 2 MHz umzuschalten und in Zeile 2095 wieder auf 1 MHz zurückzuschalten.

Ach ja, es gibt ja die leidigen Probleme mit den verschiedenen Betriebssystemen des MPS 802. Dieses Programm wurde auf einem MPS 802 Version 7c entwickelt. Bei anderen Versionen könnte es Probleme geben, da diese zum Teil nicht grafikfähig sind.

(P. Siepen/og)
|
10 rem ********************************
11 rem *                              *
12 rem *         apfelprinter         *
13 rem *         written 1985         *
14 rem *        by peter siepen       *
15 rem *     von-stephan-strasse 6    *
16 rem *       4200 oberhausen 1      *
17 rem *                              *
18 rem ********************************
100 a=a+1:ifa=1thenload"apfel/obj",8,1
110 poke55,0:poke56,32:clr
120 rem *** speichergrenze setzen ***
130 :
140 :
1000 rem ********** menue ***********
1003 poke53280,11:poke53281,0:printchr$(5);
1005 printchr$(8)chr$(14)
1010 print"{clr}{down}"tab(15)"M e n u e"
1020 print"{down}{down}{down} {rvon} 1 {rvof} Berechnen"
1030 print"{down} {rvon} 2 {rvof} Drucken"
1040 print"{down} {rvon} 3 {rvof} Speichern"
1050 print"{down} {rvon} 4 {rvof} Laden"
1100 geta$:ifa$=""then1100
1110 ifval(a$)<1orval(a$)>4then1100
1120 on val(a$)goto2000,3000,5000,6000
1130 goto1000
1140 :
1150 :
1900 rem ****** werte eingeben *******
2000 print"{clr}{down}{down} W e r t e :"
2010 input "{down}{down} Linker Rand  ";li
2020 input "{down} Rechter Rand ";re
2030 input "{down} Unterer Rand ";un
2040 input "{down} Oberer Rand  ";ob
2050 input "{down}{down} Tiefe        ";t
2060 ift<5ort>254then2050
2065 rem maschinenprg aufrufen
2070 poke821,0
2080 poke52999,t
2090 sys 49152,li,re,un,ob
2100 poke53280,0
2110 goto1000 : rem menue
2120 :
2130 :
3000 rem ********** drucken **********
3010 print"{clr}{down}{down} D r u c k e n "
3020 print:print:print" Wollen Sie normal oder invers Drucken ?"
3030 geta$:ifa$<>"n"anda$<>"i"then3030
3040 ifa$="n"thenpoke820,0   :rem Maske
3050 ifa$="i"thenpoke820,255
3060 print:print:print" Fertig ?"
3070 geta$:ifa$=""then3070
3080 poke821,255 : rem aufruf mc-prg
3090 sys49161
3100 print"{clr}{down} Fertig"
3110 print:print" Wollen Sie die Werte ausdrucken lassen"
3120 geta$:ifa$<>"j"anda$<>"n"then3120
3130 ifa$="n"then1000  :rem menue
3140 open 4,4,7 :rem werte drucken
3150 fori=1to3:print#4:next
3160 print#4,"Linker Rand  : ";li;
3170 print#4,chr$(16)"40";
3175 print#4,"Rechter Rand : ";re
3178 print#4,chr$(13)
3180 print#4,"Unterer Rand : ";un;
3185 print#4,chr$(16)"40";
3190 print#4,"Oberer Rand  : ";ob
3200 print#4,chr$(13)
3210 print#4,"Tiefe : ";peek(52999)
3220 close4
3230 goto1000 :rem menue
3240 :
3250 :
5000 rem ******** speichern *********
5005 print"{clr}{down}{down} S p e i c h e r n"
5010 print:print:input " Name ";na$
5015 rem name uebergeben
5020 iflen(na$)>16thenna$=left$(na$,16)
5030 fori=1tolen(na$)
5040 poke828+i-1,asc(mid$(na$,i,1))
5050 next
5055 poke822,len(na$)
5060 sys49155 : rem aufruf mc-prg
5070 open15,8,15 : rem fehlerkanal
5080 input#15,en,er$,a,a
5090 print"{down}"en,er$
5100 close15
5110 geta$:ifa$=""then5110
5120 goto1000: rem menue
5130 :
5140 :
6000 rem ********* laden ************
6005 print"{clr}{down}{down} L a d e n"
6010 print:print:input " Name ";na$
6015 rem name uebergeben
6020 iflen(na$)>16thenna$=left$(na$,16)
6030 fori=1tolen(na$)
6040 poke828+i-1,asc(mid$(na$,i,1))
6050 next
6055 poke822,len(na$)
6060 sys49158 : rem aufruf mc-prg
6070 open15,8,15 :rem fehlerkanal
6080 input#15,en,er$,a,a
6090 print"{down}"en,er$
6100 close15
6110 geta$:ifa$=""then6110
6115 rem werte ausgeben
6120 print"{down}Rechter Rand : ";re
6130 print"{down}Linker Rand  : ";li
6140 print"{down}Oberer Rand  : ";ob
6150 print"{down}Unterer Rand : ";un
6160 print"{down}Tiefe        : ";peek(52999)
6170 geta$:ifa$=""then6170
6180 goto1000:rem menue
6190 rem ende
 10 REM ******************************** 
 11 REM *                              * 
 12 REM *         APFELPRINTER         * 
 13 REM *         WRITTEN 1985         * 
 14 REM *        BY PETER SIEPEN       * 
 15 REM *     VON-STEPHAN-STRASSE 6    * 
 16 REM *       4200 OBERHAUSEN 1      * 
 17 REM *                              * 
 18 REM ******************************** 
 100 A=A+1:IF A=1 THENLOAD "APFEL/OBJ",8,1 
 110 POKE 55,0:POKE 56,32:CLR 
 120 REM *** SPEICHERGRENZE SETZEN *** 
 130 : 
 140 : 
 1000 REM ********** MENUE *********** 
 1003 POKE 53280,11:POKE 53281,0:PRINTCHR$ (5); 
 1005 PRINTCHR$ (8)CHR$ (14) 
 1010 PRINT"{CLR,DOWN}"TAB( 15)"M E N U E" 
 1020 PRINT"{3DOWN,SPACE,RVSON,SPACE}1{SPACE,RVOFF,SPACE}BERECHNEN" 
 1030 PRINT"{DOWN,SPACE,RVSON,SPACE}2{SPACE,RVOFF,SPACE}DRUCKEN" 
 1040 PRINT"{DOWN,SPACE,RVSON,SPACE}3{SPACE,RVOFF,SPACE}SPEICHERN" 
 1050 PRINT"{DOWN,SPACE,RVSON,SPACE}4{SPACE,RVOFF,SPACE}LADEN" 
 1100 GET A$:IF A$="" THEN1100 
 1110 IF VAL (A$)<1OR VAL (A$)>4 THEN1100 
 1120 ON VAL (A$)GOTO 2000,3000,5000,6000 
 1130 GOTO 1000 
 1140 : 
 1150 : 
 1900 REM ****** WERTE EINGEBEN ******* 
 2000 PRINT"{CLR,2DOWN,SPACE}W E R T E :" 
 2010 INPUT "{2DOWN,SPACE}LINKER RAND{2SPACE}";LI 
 2020 INPUT "{DOWN,SPACE}RECHTER RAND ";RE 
 2030 INPUT "{DOWN,SPACE}UNTERER RAND ";UN 
 2040 INPUT "{DOWN,SPACE}OBERER RAND{2SPACE}";OB 
 2050 INPUT "{2DOWN,SPACE}TIEFE{8SPACE}";T 
 2060 IF T<5OR T>254 THEN2050 
 2065 REM MASCHINENPRG AUFRUFEN 
 2070 POKE 821,0 
 2080 POKE 52999,T 
 2090 SYS 49152,LI,RE,UN,OB 
 2100 POKE 53280,0 
 2110 GOTO 1000 : REM MENUE 
 2120 : 
 2130 : 
 3000 REM ********** DRUCKEN ********** 
 3010 PRINT"{CLR,2DOWN,SPACE}D R U C K E N " 
 3020 PRINT:PRINT:PRINT" WOLLEN SIE NORMAL ODER INVERS DRUCKEN ?" 
 3030 GET A$:IF A$<>"N"AND A$<>"I" THEN3030 
 3040 IF A$="N" THENPOKE 820,0   :REM M ASKE 
 3050 IF A$="I" THENPOKE 820,255 
 3060 PRINT:PRINT:PRINT" FERTIG ?" 
 3070 GET A$:IF A$="" THEN3070 
 3080 POKE 821,255 : REM AUFRUF MC-PRG 
 3090 SYS 49161 
 3100 PRINT"{CLR,DOWN,SPACE}FERTIG" 
 3110 PRINT:PRINT" WOLLEN SIE DIE WERTE AUSDRUCKEN LASSEN" 
 3120 GET A$:IF A$<>"J"AND A$<>"N" THEN3120 
 3130 IF A$="N" THEN1000  :REM MENUE 
 3140 OPEN 4,4,7 :REM WERTE DRUCKEN 
 3150 FOR I=1 TO3:PRINT#4:NEXT 
 3160 PRINT#4,"LINKER RAND{2SPACE}: ";LI; 
 3170 PRINT#4,CHR$ (16)"40"; 
 3175 PRINT#4,"RECHTER RAND : ";RE 
 3178 PRINT#4,CHR$ (13) 
 3180 PRINT#4,"UNTERER RAND : ";UN; 
 3185 PRINT#4,CHR$ (16)"40"; 
 3190 PRINT#4,"OBERER RAND{2SPACE}: ";OB 
 3200 PRINT#4,CHR$ (13) 
 3210 PRINT#4,"TIEFE : ";PEEK (52999) 
 3220 CLOSE 4 
 3230 GOTO 1000 :REM MENUE 
 3240 : 
 3250 : 
 5000 REM ******** SPEICHERN ********* 
 5005 PRINT"{CLR,2DOWN,SPACE}S P E I C H E R N" 
 5010 PRINT:PRINT:INPUT " NAME ";NA$ 
 5015 REM NAME UEBERGEBEN 
 5020 IF LEN (NA$)>16 THENNA$=LEFT$ (NA$,16) 
 5030 FOR I=1 TOLEN (NA$) 
 5040 POKE 828+I-1,ASC (MID$ (NA$,I,1)) 
 5050 NEXT 
 5055 POKE 822,LEN (NA$) 
 5060 SYS 49155 : REM AUFRUF MC-PRG 
 5070 OPEN 15,8,15 : REM FEHLERKANAL 
 5080 INPUT#15,EN,ER$,A,A 
 5090 PRINT"{DOWN}"EN,ER$ 
 5100 CLOSE 15 
 5110 GET A$:IF A$="" THEN5110 
 5120 GOTO 1000: REM MENUE 
 5130 : 
 5140 : 
 6000 REM ********* LADEN ************ 
 6005 PRINT"{CLR,2DOWN,SPACE}L A D E N" 
 6010 PRINT:PRINT:INPUT " NAME ";NA$ 
 6015 REM NAME UEBERGEBEN 
 6020 IF LEN (NA$)>16 THENNA$=LEFT$ (NA$,16) 
 6030 FOR I=1 TOLEN (NA$) 
 6040 POKE 828+I-1,ASC (MID$ (NA$,I,1)) 
 6050 NEXT 
 6055 POKE 822,LEN (NA$) 
 6060 SYS 49158 : REM AUFRUF MC-PRG 
 6070 OPEN 15,8,15 :REM FEHLERKANAL 
 6080 INPUT#15,EN,ER$,A,A 
 6090 PRINT"{DOWN}"EN,ER$ 
 6100 CLOSE 15 
 6110 GET A$:IF A$="" THEN6110 
 6115 REM WERTE AUSGEBEN 
 6120 PRINT"{DOWN}RECHTER RAND : ";RE 
 6130 PRINT"{DOWN}LINKER RAND{SPACE,SPACE}: ";LI 
 6140 PRINT"{DOWN}OBERER RAND{SPACE,SPACE}: ";OB 
 6150 PRINT"{DOWN}UNTERER RAND : ";UN 
 6160 PRINT"{DOWN}TIEFE{SPACE,7SPACE}: ";PEEK (52999) 
 6170 GET A$:IF A$="" THEN6170 
 6180 GOTO 1000:REM MENUE 
 6190 REM ENDE 
Listing 1. »APFEL/BAS« geben Sie bitte mit dem Checksummer V3 ein
PROGRAMM : APFEL_OBJ      C000 C465
-----------------------------------
C000 : 4C 0C C0 4C 5A C2 4C BF   78
C008 : C2 4C 5D C3 20 12 C0 4C   EE
C010 : B8 C0 20 FD AE 20 8A AD   62
C018 : A2 B0 A0 CF 20 D4 BB 20   0C
C020 : FD AE 20 8A AD A2 A0 A0   81
C028 : CF 20 D4 BB 20 FD AE 20   A1
C030 : 8A AD A2 D0 A0 CF 20 D4   06
C038 : BB 20 FD AE 20 8A AD A2   AB
C040 : C0 A0 CF 20 D4 BB A9 00   1A
C048 : 85 B5 A9 20 85 B6 60 A9   F9
C050 : 0F A2 04 A0 05 20 BA FF   02
C058 : A9 00 20 BD FF 20 C0 FF   C5
C060 : A9 0A A2 04 A0 00 20 BA   37
C068 : FF A9 00 20 BD FF 20 C0   1E
C070 : FF A9 1A A2 04 A0 06 20   BC
C078 : BA FF A9 00 20 BD FF 20   CC
C080 : C0 FF A2 1A 20 C9 FF A9   CF
C088 : 15 20 A8 FF A2 0A 20 C9   66
C090 : FF A9 0D 4C A8 FF A9 0F   80
C098 : 20 C3 FF A9 0A 20 C3 FF   80
C0A0 : A9 1A 4C C3 FF 85 63 86   A9
C0A8 : 62 A2 90 38 4C 49 BC A5   D4
C0B0 : 6E 45 66 85 6F A5 61 60   75
C0B8 : 78 A9 B0 A0 CF 20 A2 BB   45
C0C0 : A9 A0 A0 CF 20 50 B8 20   83
C0C8 : 0C BC A9 80 A2 02 20 A5   B3
C0D0 : C0 20 AF C0 20 12 BB A2   6B
C0D8 : 90 A0 CF 20 D4 BB A9 D0   24
C0E0 : A0 CF 20 A2 BB A9 C0 A0   11
C0E8 : CF 20 50 B8 20 0C BC A9   9B
C0F0 : 90 A2 01 20 A5 C0 20 AF   56
C0F8 : C0 20 12 BB A2 30 A0 CF   92
C100 : 20 D4 BB A0 04 B9 B0 CF   FE
C108 : 99 40 CF B9 C0 CF 99 60   9E
C110 : CF 88 10 F1 A9 00 8D 00   36
C118 : CF 8D 01 CF 8D 04 CF A9   74
C120 : 08 8D 05 CF A9 00 8D 03   01
C128 : CF A9 00 8D 06 CF A0 04   E7
C130 : 99 70 CF 99 80 CF 88 10   F1
C138 : F7 EE 06 CF AD 07 CF CD   10
C140 : 06 CF B0 04 18 4C CD C1   79
C148 : A9 70 A0 CF 20 A2 BB A9   A5
C150 : 70 A0 CF 20 28 BA A2 57   9A
C158 : A0 00 20 D4 BB A9 80 A0   E7
C160 : CF 20 A2 BB A9 80 A0 CF   20
C168 : 20 28 BA A2 F7 A0 00 20   64
C170 : D4 BB A9 57 A0 00 20 67   D0
C178 : B8 A5 61 C9 84 90 07 AD   D9
C180 : 06 CF 6A 4C CD C1 A9 80   24
C188 : A0 CF 20 A2 BB A9 70 A0   78
C190 : CF 20 28 BA A5 61 F0 02   FE
C198 : E6 61 A9 60 A0 CF 20 50   4F
C1A0 : B8 20 B4 BF A2 80 A0 CF   DE
C1A8 : 20 D4 BB A0 00 A9 F7 20   A3
C1B0 : A2 BB A0 00 A9 57 20 50   CE
C1B8 : B8 A9 40 A0 CF 20 50 B8   1A
C1C0 : 20 B4 BF A2 70 A0 CF 20   0A
C1C8 : D4 BB 4C 39 C1 AD 03 CF   E9
C1D0 : 2A 8D 03 CF EE 20 D0 A9   02
C1D8 : 40 A0 CF 20 A2 BB A9 90   30
C1E0 : A0 CF 20 67 B8 A2 40 A0   40
C1E8 : CF 20 D4 BB CE 05 CF F0   AA
C1F0 : 03 4C 29 C1 A9 08 8D 05   B7
C1F8 : CF 20 4C C2 EE 04 CF AD   EC
C200 : 04 CF C9 50 F0 03 4C 24   09
C208 : C1 A9 00 8D 04 CF A0 05   9B
C210 : B9 B0 CF 99 40 CF 88 10   0D
C218 : F7 EE 00 CF D0 03 EE 01   63
C220 : CF AD 01 CF C9 01 90 0A   FB
C228 : AD 00 CF C9 90 90 03 4C   35
C230 : 4A C2 A9 30 A0 CF 20 A2   9A
C238 : BB A9 60 A0 CF 20 50 B8   A5
C240 : A2 60 A0 CF 20 D4 BB 4C   65
C248 : 24 C1 58 60 A0 00 AD 03   36
C250 : CF 91 B5 E6 B5 D0 02 E6   EA
C258 : B6 60 A9 08 A2 08 A0 01   99
C260 : 20 BA FF AD 36 03 A2 3C   11
C268 : A0 03 20 BD FF 20 C0 FF   4E
C270 : A2 08 20 C9 FF A9 00 20   E5
C278 : A8 FF A5 90 30 39 A9 20   4F
C280 : 20 A8 FF A5 90 30 30 A9   47
C288 : 00 85 B5 A9 20 85 B6 A0   38
C290 : 00 B1 B5 20 A8 FF A5 90   1C
C298 : 30 1D E6 B5 D0 02 E6 B6   ED
C2A0 : A5 B6 C9 9D D0 EB A5 B5   35
C2A8 : C9 01 D0 E5 A2 00 BD 00   04
C2B0 : CF 20 A8 FF E8 D0 F7 A9   02
C2B8 : 08 20 C3 FF 4C CC FF A9   40
C2C0 : 08 A2 08 A0 00 20 BA FF   1B
C2C8 : AD 36 03 A2 3C A0 03 20   BB
C2D0 : BD FF 20 C0 FF A2 08 20   22
C2D8 : C6 FF 20 A5 FF A5 90 4A   5F
C2E0 : 4A B0 2F 20 A5 FF A9 00   53
C2E8 : 85 B5 A9 20 85 B6 A0 00   47
C2F0 : 20 A5 FF 91 B5 E6 B5 D0   20
C2F8 : 02 E6 B6 A5 B6 C9 9D D0   A1
C300 : EF A5 B5 C9 01 D0 E9 A2   EC
C308 : 00 20 A5 FF 9D 00 CF E8   6C
C310 : D0 F7 20 CC FF A9 08 20   2B
C318 : C3 FF A9 B0 A0 CF 20 A2   A9
C320 : BB A9 4C A0 49 20 52 C3   3D
C328 : A9 A0 A0 CF 20 A2 BB A9   9D
C330 : 52 A0 45 20 52 C3 A9 D0   B3
C338 : A0 CF 20 A2 BB A9 4F A0   A4
C340 : 42 20 52 C3 A9 C0 A0 CF   62
C348 : 20 A2 BB A9 55 A0 4E 4C   0A
C350 : 52 C3 85 45 84 46 20 E7   59
C358 : B0 AA 4C D4 BB 20 4F C0   86
C360 : A9 32 8D 00 CF A9 00 85   DB
C368 : 57 A9 20 85 58 A9 00 85   2A
C370 : 59 A9 C5 85 5A A0 00 B1   CE
C378 : 57 91 59 E6 57 D0 02 E6   9D
C380 : 58 E6 59 D0 02 E6 5A A5   C8
C388 : 5A C9 C7 D0 EA A5 59 C9   A7
C390 : 80 D0 E4 20 A1 C3 CE 00   29
C398 : CF D0 D2 20 CC FF 4C 96   B3
C3A0 : C0 A9 00 8D 08 CF A9 C5   18
C3A8 : 8D 09 CF A9 08 8D 02 CF   77
C3B0 : A9 00 8D 0E CF A9 50 8D   25
C3B8 : 0A CF A2 08 A0 00 AD 08   24
C3C0 : CF 85 A8 AD 09 CF 85 A9   AA
C3C8 : B1 A8 9D 3C 03 18 A5 A8   95
C3D0 : 69 50 85 A8 90 02 E6 A9   E0
C3D8 : CA D0 ED A9 80 A0 08 A2   2D
C3E0 : 08 8D 0B CF 3D 3C 03 18   5E
C3E8 : F0 01 38 2E 0C CF AD 0B   39
C3F0 : CF CA D0 F0 AD 0C CF 4D   8C
C3F8 : 34 03 99 A1 02 88 AD 0B   7A
C400 : CF 4A 8D 0B CF 90 D8 A2   E3
C408 : 08 BD A1 02 C9 00 D0 09   89
C410 : CA D0 F6 EE 0E CF 4C 4E   0B
C418 : C4 A2 0F 20 C9 FF A2 08   2C
C420 : BD A1 02 20 A8 FF CA D0   8A
C428 : F7 A9 0D 20 A8 FF A2 0A   64
C430 : 20 C9 FF EE 0E CF AE 0E   49
C438 : CF A9 20 CA F0 06 20 A8   4E
C440 : FF 4C 3B C4 A9 FE 20 A8   31
C448 : FF A9 8D 20 A8 FF EE 08   DA
C450 : CF D0 03 EE 09 CF CE 0A   84
C458 : CF F0 03 4C BA C3 A9 0D   74
C460 : 20 A8 FF 60 03            22
Listing 2. »APFEL/OBJ« geben Sie bitte mit dem MSE ein
0 rem *********************************
1 rem *         apfelprinter          *
2 rem *         written 1985          *
3 rem *  for c64 + vc 1541 + mps 802  *
4 rem *       by peter siepen         *
5 rem *                               *
6 rem *      rechenroutinen von       *
7 rem *       gerhard pehland         *
8 rem *   (aus 64'er 11.85 seite 80)  *
9 rem *********************************
10 sys9*4096
20 .opt oo
30 *= $c000
90 ;
92 ; *********** quellcode ************
95 ;
98 ; systemadressen
100 fac        = 97
110 arg        = 105
120 chrout     = $ffd2
130 div        = $bb12 ;fac=fac/arg
140 sub        = $b853 ;fac=fac-arg
160 facnarg    = $bc0c ;arg = fac
170 zeigsub    = $b850 ;fac=(a/y)-fac
180 zeigadd    = $b867 ;fac=(a/y)+fac
190 zeigmult   = $ba28 ;fac=(a/y)*fac
200 konnarg    = $ba8c ;arg=(a/y)
210 konnfac    = $bba2 ;fac=(a/y)
220 facnkon    = $bbd4 ;(x/y)=fac
230 chsign     = $bfb4 ;fac=-fac
240 filepar    = $ffba ;fileparameter
250 filenam    = $ffbd ;filename setzen
252 frmnum     = $ad8a ;ausdruck auswerten
254 chkcom     = $aefd ;test auf ","
256 iecout     = $ffa8
257 iecin      = $ffa5
258 suchvar    = $b0e7 ;sucht varnam
260 ;
265 ; variablen
270 zeig1      = $57   ;universal
275 zeig2      = $59   ;zeiger
280 zeiger     = $a8   ;zeiger bei druck
295 spzeig     = $b5   ;zeiger $2000
300 zeile      = $cf00 ;akt.zeile
305 spalte     = $cf04 ;akt.spalte
310 zeilzahl   = $cf02 ;zeilenzaehler
315 byte       = $cf03 ;enthaelt 8 pkt
320 pos        = $cf05 ;zaehler 8 pkte
325 tiefe      = $cf06 ;akt. tiefe
330 tiefemax   = $cf07 ;maximale tiefe
335 zeigsp     = $cf08 ;zwischenspeicher
337 :                  ;fuer zeiger
340 spaltzahl  = $cf0a ;bei druck
345 zs         = $cf0b ;universal-
350 zs2        = $cf0c ;speicher
355 spaces     = $cf0e ;zaehler bei
357 :                  ;druck
360 maske      = $0334 ;enthaelt maske
362 :                  ;bei druck
365 namlen     = $0336 ;laenge filenam
370 dx         = $cf90 ;rechenvariablen
375 dy         = $cf30
380 cx         = $cf40
385 cy         = $cf60
390 xquad      = 87
395 yquad      = 247
400 xwert      = $cf70
405 ywert      = $cf80
410 xmax       = $cfa0
415 xmin       = $cfb0
420 ymax       = $cfc0
425 ymin       = $cfd0
490 ; konstanten
500 spalten    = 640   ;anzahl spalten
510 zeilen     = 400   ;anzahl zeilen
520 puffer     = $033c ;speicher 8 bytes
530 speicher   = $c500 ;speicher fuer
532 puffer1    = $02a1
535 :                  ;eine druckzeile
690 ;
800 :          jmp start
810 :          jmp save
820 :          jmp load
830 :          jmp print
890 ;
895 ;
900 start      jsr holwerte
910 :          jmp apfel
990 ;
995 ;
1000 holwerte  jsr chkcom ;liest werte
1010 :         jsr frmnum ;aus sys
1020 :         ldx #<xmin
1030 :         ldy #>xmin
1040 :         jsr facnkon
1050 :         jsr chkcom
1060 :         jsr frmnum
1070 :         ldx #<xmax
1080 :         ldy #>xmax
1090 :         jsr facnkon
1100 :         jsr chkcom
1110 :         jsr frmnum
1120 :         ldx #<ymin
1130 :         ldy #>ymin
1140 :         jsr facnkon
1150 :         jsr chkcom
1160 :         jsr frmnum
1170 :         ldx #<ymax
1180 :         ldy #>ymax
1190 :         jsr facnkon
1240 :         lda #<$2000 ;und setzt
1250 :         sta spzeig  ;zeiger
1260 :         lda #>$2000
1270 :         sta spzeig+1
1280 :         rts
1290 ;
1295 ;
2000 openfls   lda #15   ;oeffnet files
2010 :         ldx #04
2020 :         ldy #05
2030 :         jsr $ffba
2040 :         lda #$00
2050 :         jsr $ffbd
2060 :         jsr $ffc0
2070 :         lda #10
2080 :         ldx #04
2090 :         ldy #00
2100 :         jsr $ffba
2110 :         lda #$00
2120 :         jsr $ffbd
2130 :         jsr $ffc0
2180 :         lda #26
2190 :         ldx #04
2200 :         ldy #06
2210 :         jsr $ffba
2220 :         lda #$00
2230 :         jsr $ffbd
2240 :         jsr $ffc0
2250 :         ldx #26   ;und bereitet
2260 :         jsr $ffc9 ;drucker vor
2270 :         lda #21
2280 :         jsr iecout
2290 :         ldx #10
2295 :         jsr $ffc9
2300 :         lda #$0d
2305 :         jmp iecout
2310 ;
2320 ;
3000 closefls  lda #15
3010 :         jsr $ffc3
3020 :         lda #10
3030 :         jsr $ffc3
3040 :         lda #26
3050 :         jmp $ffc3
3060 ;
3500 inttofac  sta $63 ;pos. int-zahl
3510 :         stx $62 ;in a/x in fac
3520 :         ldx #$90
3530 :         sec
3540 :         jmp $bc49
3590 ;
3700 facsarg   lda arg+5 ;vorzeichen-
3710 :         eor fac+5 ;wechsel
3720 :         sta arg+6 ;fac + arg
3730 :         lda fac
3740 :         rts
3750 ;
4000 apfel     sei       ;rechenrout.
4010 :         lda #<xmin ;dx berechnen
4020 :         ldy #>xmin
4030 :         jsr konnfac
4040 :         lda #<xmax
4050 :         ldy #>xmax
4060 :         jsr zeigsub
4070 :         jsr facnarg
4080 :         lda #<spalten
4090 :         ldx #>spalten
4100 :         jsr inttofac
4110 :         jsr facsarg
4120 :         jsr div
4130 :         ldx #<dx
4140 :         ldy #>dx
4150 :         jsr facnkon
4160 :         lda #<ymin ;dy berechnen
4170 :         ldy #>ymin
4180 :         jsr konnfac
4190 :         lda #<ymax
4200 :         ldy #>ymax
4210 :         jsr zeigsub
4220 :         jsr facnarg
4230 :         lda #<zeilen
4240 :         ldx #>zeilen
4250 :         jsr inttofac
4260 :         jsr facsarg
4270 :         jsr div
4280 :         ldx #<dy
4290 :         ldy #>dy
4300 :         jsr facnkon
4310 :         ldy #4     ;cx=xmin
4320 l13       lda xmin,y ;cy=ymax
4330 :         sta cx,y
4340 :         lda ymax,y
4350 :         sta cy,y
4360 :         dey
4370 :         bpl l13
4380 :         lda #0
4390 :         sta zeile
4400 :         sta zeile+1
4410 :         sta spalte
4430 :         lda #$08
4433 :         sta pos
4440 iterat    lda #0
4450 :         sta byte
4460 iterat1   lda #0
4470 :         sta tiefe
4480 :         ldy #4
4490 l15       sta xwert,y
4500 :         sta ywert,y
4510 :         dey
4520 :         bpl l15
4525 iter1     inc tiefe
4530 :         lda tiefemax
4540 :         cmp tiefe ;"max. tiefe ?
4550 :         bcs iter4
4560 :         clc       ;punkt clear
4570 :         jmp plot
4580 iter4     lda #<xwert ;xwert^2
4590 :         ldy #>xwert ;in xquad
4600 :         jsr konnfac
4610 :         lda #<xwert
4620 :         ldy #>xwert
4630 :         jsr zeigmult
4640 :         ldx #xquad
4650 :         ldy #0
4660 :         jsr facnkon
4670 :         lda #<ywert ;ywert^2
4680 :         ldy #>ywert ;in yquad
4690 :         jsr konnfac
4700 :         lda #<ywert
4710 :         ldy #>ywert
4720 :         jsr zeigmult
4730 :         ldx #yquad
4740 :         ldy #0    ;xquad + yquad
4750 :         jsr facnkon
4760 :         lda #xquad
4770 :         ldy #0
4780 :         jsr zeigadd
4790 :         lda fac
4800 :         cmp #$84  ;"summe > 8 ?
4810 :         bcc iter3
4820 :         lda tiefe
4830 :         ror       ;carry setzen
4840 :         jmp plot
4850 iter3     lda #<ywert ;ywert =
4860 :         ldy #>ywert ;xwert*ywert
4870 :         jsr konnfac ;*2-cy
4880 :         lda #<xwert
4890 :         ldy #>xwert
4900 :         jsr zeigmult
4910 :         lda fac
4920 :         beq iter2
4930 :         inc fac
4940 iter2     lda #<cy
4950 :         ldy #>cy
4960 :         jsr zeigsub
4970 :         jsr chsign
4980 :         ldx #<ywert
4990 :         ldy #>ywert
5000 :         jsr facnkon
5010 :         ldy #0      ;xwert =
5020 :         lda #yquad  ;xquad-yquad
5030 :         jsr konnfac ;-cx
5040 :         ldy #0
5050 :         lda #xquad
5060 :         jsr zeigsub
5070 :         lda #<cx
5080 :         ldy #>cx
5090 :         jsr zeigsub
5100 :         jsr chsign
5110 :         ldx #<xwert
5120 :         ldy #>xwert
5130 :         jsr facnkon
5140 :         jmp iter1
5200 plot      lda byte ;setze bit mit
5210 :         rol      ;carry
5220 :         sta byte
5225 :         inc 53280 ;farbe
5230 :         lda #<cx ;cx=cx+dx
5240 :         ldy #>cx
5250 :         jsr konnfac
5260 :         lda #<dx
5270 :         ldy #>dx
5280 :         jsr zeigadd
5290 :         ldx #<cx
5300 :         ldy #>cx
5310 :         jsr facnkon
5320 :         dec pos
5330 :         beq apfel1
5340 :         jmp iterat1
5350 apfel1    lda #08
5360 :         sta pos
5370 :         jsr setbyte
5380 :         inc spalte
5390 :         lda spalte
5400 :         cmp #80 ;drucker
5410 :         beq apfel2
5420 :         jmp iterat
5430 apfel2    lda #0
5440 :         sta spalte
5450 :         ldy #5     ;cx=xmin
5460 l30       lda xmin,y
5470 :         sta cx,y
5480 :         dey
5490 :         bpl l30
5500 :         inc zeile
5510 :         bne w1
5520 :         inc zeile+1
5530 w1        lda zeile+1
5540 :         cmp #>zeilen
5550 :         bcc w2
5560 :         lda zeile
5570 :         cmp #<zeilen
5580 :         bcc w2
5590 :         jmp endapfel
5600 w2        lda #<dy    ;cy=cy-dy
5610 :         ldy #>dy
5620 :         jsr konnfac
5630 :         lda #<cy
5640 :         ldy #>cy
5650 :         jsr zeigsub
5660 :         ldx #<cy
5670 :         ldy #>cy
5680 :         jsr facnkon
5690 :         jmp iterat
5700 endapfel  cli
5710 :         rts
5990 ;
5995 ;
6000 setbyte   ldy #$00 ;byte speichern
6005 :         lda byte
6015 :         sta (spzeig),y
6050 :         inc spzeig
6060 :         bne spw1
6070 :         inc spzeig+1
6080 spw1      rts
6090 ;
10000 save     lda #8
10010 :        ldx #08
10020 :        ldy #1
10030 :        jsr $ffba
10040 :        lda namlen
10050 :        ldx #<$033c
10060 :        ldy #>$033c
10070 :        jsr $ffbd
10080 :        jsr $ffc0
10090 :        ldx #8
10100 :        jsr $ffc9
10110 :        lda #<$2000
10112 :        jsr iecout
10114 :        lda $90
10115 :        bmi saveende
10116 :        lda #>$2000
10117 :        jsr iecout
10118 :        lda $90
10119 :        bmi saveende
10120 :        lda #<$2000  ;$2000-
10125 :        sta spzeig
10130 :        lda #>$2000
10140 :        sta spzeig+1
10150 :        ldy #$00
10160 saveloop lda (spzeig),y
10170 :        jsr iecout
10174 :        lda $90
10178 :        bmi saveende
10180 :        inc spzeig
10190 :        bne savew1
10200 :        inc spzeig+1 ;-40192
10210 savew1   lda spzeig+1
10220 :        cmp #>32001+$2000
10230 :        bne saveloop
10240 :        lda spzeig
10250 :        cmp #<32001+$2000
10260 :        bne saveloop
10270 :        ldx #$00    ;variablen
10280 savel1   lda $cf00,x
10290 :        jsr iecout
10300 :        inx
10310 :        bne savel1
10320 saveende lda #08
10330 :        jsr $ffc3
10340 :        jmp $ffcc
10350 ;
11000 load     lda #8
11010 :        ldx #08
11020 :        ldy #0
11030 :        jsr $ffba
11040 :        lda namlen
11050 :        ldx #<$033c
11060 :        ldy #>$033c
11070 :        jsr $ffbd
11080 :        jsr $ffc0
11090 :        ldx #8
11100 :        jsr $ffc6
11101 :        jsr iecin
11102 :        lda $90
11103 :        lsr
11104 :        lsr
11105 :        bcs loadende
11106 :        jsr iecin
11110 :        lda #<$2000  ;$2000
11120 :        sta spzeig
11130 :        lda #>$2000
11140 :        sta spzeig+1
11150 :        ldy #$00
11160 loadloop jsr iecin
11170 :        sta (spzeig),y
11180 :        inc spzeig
11190 :        bne loadw1
11200 :        inc spzeig+1
11210 loadw1   lda spzeig+1 ;-40192
11220 :        cmp #>(32001+$2000)
11230 :        bne loadloop
11240 :        lda spzeig
11250 :        cmp #<(32001+$2000)
11260 :        bne loadloop
11270 :        ldx #$00
11280 loadl1   jsr iecin   ;variablen
11290 :        sta $cf00,x
11300 :        inx
11310 :        bne loadl1
11320 loadende jsr $ffcc
11330 :        lda #08
11340 :        jsr $ffc3
11350 :        lda #<xmin  ;werte in
11360 :        ldy #>xmin  ;basic-
11370 :        jsr konnfac ;variablen
11380 :        lda #"l"    ;schreiben
11390 :        ldy #"i"
11400 :        jsr facvar
11430 :        lda #<xmax
11440 :        ldy #>xmax
11450 :        jsr konnfac
11460 :        lda #"r"
11470 :        ldy #"e"
11480 :        jsr facvar
11490 :        lda #<ymin
11500 :        ldy #>ymin
11510 :        jsr konnfac
11520 :        lda #"o"
11530 :        ldy #"b"
11540 :        jsr facvar
11550 :        lda #<ymax
11560 :        ldy #>ymax
11570 :        jsr konnfac
11580 :        lda #"u"
11590 :        ldy #"n"
11600 :        jmp facvar
11610 :
11620 facvar   sta $45     ;schreibt
11630 :        sty $46     ;fac in var
11640 :        jsr suchvar ;mit name in
11650 :        tax         ;a/y
11660 :        jmp facnkon
11670 :
11680 :
12000 print    jsr openfls ;oeffnet file
12010 :        lda #50     ;anzahl druck
12020 :        sta zeile   ;zeilen
12030 :        lda #<$2000 ;zeiger auf
12040 :        sta zeig1   ;grafik-
12050 :        lda #>$2000 ;speicher
12060 :        sta zeig1+1
12070 ploop1   lda #<speicher ;zeiger
12080 :        sta zeig2      ;auf puffer
12090 :        lda #>speicher ;fuer eine
12100 :        sta zeig2+1    ;zeile
12110 :        ldy #$00
12120 ploop    lda (zeig1),y
12130 :        sta (zeig2),y
12140 :        inc zeig1
12150 :        bne pw1
12160 :        inc zeig1+1
12170 pw1      inc zeig2
12180 :        bne pw2
12190 :        inc zeig2+1
12200 pw2      lda zeig2+1
12210 :        cmp #>(640+speicher)
12220 :        bne ploop    ;"fertig ?
12230 :        lda zeig2
12240 :        cmp #<(640+speicher)
12250 :        bne ploop
12260 :        jsr output ;zeile ausgb.
12270 :        dec zeile
12280 :        bne ploop1
12285 :        jsr $ffcc  ;ende
12290 :        jmp closefls
12390 ;
12395 ;
13000 output   lda #<speicher
13010 :        sta zeigsp
13020 :        lda #>speicher
13030 :        sta zeigsp+1
13060 :        lda #$00   ;anzahl spaces
13070 :        sta spaces ;vor zeichen
13100 :        lda #80
13110 :        sta spaltzahl
13120 outloop1 ldx #$08
13130 :        ldy #$00
13140 :        lda zeigsp
13150 :        sta zeiger
13160 :        lda zeigsp+1
13170 :        sta zeiger+1
13180 outloop2 lda (zeiger),y ;8 bytes
13190 :        sta puffer,x   ;eines
13200 :        clc            ;zeichens
13210 :        lda zeiger     ;in puffer
13220 :        adc #80
13230 :        sta zeiger
13240 :        bcc w4
13250 :        inc zeiger+1
13260 w4       dex
13270 :        bne outloop2
13300 :        lda #$80
13305 :        ldy #8
13310 loop2    ldx #08
13320 :        sta zs
13330 loop1    and puffer,x ;8 bytes
13340 :        clc          ;werden
13350 :        beq w5       ;von horiz.
13360 :        sec          ;nach
13370 w5       rol zs2      ;vertikal
13380 :        lda zs       ;orientiert
13390 :        dex
13400 :        bne loop1
13410 :        lda zs2
13420 :        eor maske     ;inv oder
13430 :        sta puffer1,y ;normal
13440 :        dey
13442 :        lda zs        ;naechst.
13444 :        lsr           ;bit
13446 :        sta zs
13448 :        bcc loop2
13450 :        ldx #08       ;8 leerbyte
13451 tloop    lda puffer1,x ;wenn ja
13452 :        cmp #$00
13453 :        bne nospace
13454 :        dex
13455 :        bne tloop
13461 :        inc spaces    ;ausgabe
13462 :        jmp cont      ;ueberspr.
13469 nospace  ldx #15
13470 :        jsr $ffc9
13471 :        ldx #8
13472 tloop1   lda puffer1,x ;bitmuster
13473 :        jsr iecout    ;fuer
13474 :        dex           ;1 zeichen
13475 :        bne tloop1    ;an drucker
13480 :        lda #$0d
13490 :        jsr iecout
13500 :        ldx #10
13510 :        jsr $ffc9
13520 :        inc spaces
13530 :        ldx spaces    ;druckkopf
13540 :        lda #$20      ;position
13550 sloop    dex
13560 :        beq spaceend
13570 :        jsr iecout
13580 :        jmp sloop
13590 spaceend lda #$fe    ;def. zeichen
13600 :        jsr iecout  ;ausdrucken
13610 :        lda #141
13620 :        jsr iecout
13630 cont     inc zeigsp ;zeiger
13640 :        bne w6     ;aktualisieren
13650 :        inc zeigsp+1
13660 w6       dec spaltzahl
13670 :        beq w7
13680 :        jmp outloop1
13690 w7       lda #$0d   ;ende
13700 :        jsr iecout
13710 outend   rts
Listing 3. »APFEL/SRC«, der Quell-Code für eventuelle Veränderungen
PDF Diesen Artikel als PDF herunterladen
Mastodon Diesen Artikel auf Mastodon teilen
← Vorheriger ArtikelNächster Artikel →