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.

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
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
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