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 1040 : JSR FACNKON 1050 : JSR CHKCOM 1060 : JSR FRMNUM 1070 : LDX #XMAX 1090 : JSR FACNKON 1100 : JSR CHKCOM 1110 : JSR FRMNUM 1120 : LDX #YMIN 1140 : JSR FACNKON 1150 : JSR CHKCOM 1160 : JSR FRMNUM 1170 : LDX #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 4030 : JSR KONNFAC 4040 : LDA #XMAX 4060 : JSR ZEIGSUB 4070 : JSR FACNARG 4080 : LDA #SPALTEN 4100 : JSR INTTOFAC 4110 : JSR FACSARG 4120 : JSR DIV 4130 : LDX #DX 4150 : JSR FACNKON 4160 : LDA #YMIN 4180 : JSR KONNFAC 4190 : LDA #YMAX 4210 : JSR ZEIGSUB 4220 : JSR FACNARG 4230 : LDA #ZEILEN 4250 : JSR INTTOFAC 4260 : JSR FACSARG 4270 : JSR DIV 4280 : LDX #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 #[179]XWERT ;XWERT[174]2 4590 : LDY #[177]XWERT ;IN XQUAD 4600 : JSR K[145]NFAC 4610 : LDA #[179]XWERT 4620 : LDY #[177]XWERT 4630 : JSR ZEIGMULT 4640 : LDX #XQUAD 4650 : LDY #0 4660 : JSR FACNK[145] 4670 : LDA #[179]YWERT ;YWERT[174]2 4680 : LDY #[177]YWERT ;IN YQUAD 4690 : JSR K[145]NFAC 4700 : LDA #[179]YWERT 4710 : LDY #[177]YWERT 4720 : JSR ZEIGMULT 4730 : LDX #YQUAD 4740 : LDY #0 ;XQUAD [170] YQUAD 4750 : JSR FACNK[145] 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 ;XWERT*YWERT 4870 : JSR KONNFAC ;*2-CY 4880 : LDA #XWERT 4900 : JSR ZEIGMULT 4910 : LDA FAC 4920 : BEQ ITER2 4930 : INC FAC 4940 ITER2 LDA #CY 4960 : JSR ZEIGSUB 4970 : JSR CHSIGN 4980 : LDX #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 5090 : JSR ZEIGSUB 5100 : JSR CHSIGN 5110 : LDX #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 5250 : JSR KONNFAC 5260 : LDA #DX 5280 : JSR ZEIGADD 5290 : LDX #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 #DY 5620 : JSR KONNFAC 5630 : LDA #CY 5650 : JSR ZEIGSUB 5660 : LDX #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 ;BASIC- 11370 : JSR KONNFAC ;VARIABLEN 11380 : LDA #"L" ;SCHREIBEN 11390 : LDY #"I" 11400 : JSR FACVAR 11430 : LDA #XMAX 11450 : JSR KONNFAC 11460 : LDA #"R" 11470 : LDY #"E" 11480 : JSR FACVAR 11490 : LDA #YMIN 11510 : JSR KONNFAC 11520 : LDA #"O" 11530 : LDY #"B" 11540 : JSR FACVAR 11550 : LDA #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 ;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 #[179](640[170]SPEICHER) 12250 : BNE PLOOP 12260 : JSR OUTPUT ;ZEILE AUSGB. 12270 : DEC ZEILE 12280 : BNE PLOOP1 12285 : JSR $FFCC ;[128]E 12290 : JMP [160]FLS 12390 ; 12395 ; 13000 OUTPUT LDA #[179]SPEICHER 13010 : STA ZEIGSP 13020 : LDA #[177]SPEICHER 13030 : STA ZEIGSP[170]1 13060 : LDA #$00 ;ANZAHL SPACES 13070 : STA SPACES ;V[176] ZEICHEN 13100 : LDA #80 13110 : STA SPALTZAHL 13120 OUTLOOP1 LDX #$08 13130 : LDY #$00 13140 : LDA ZEIGSP 13150 : STA ZEIGER 13160 : LDA ZEIGSP[170]1 13170 : STA ZEIGER[170]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[170]1 13260 W4 DEX 13270 : BNE OUTLOOP2 13300 : LDA #$80 13305 : LDY #8 13310 LOOP2 LDX #08 13320 : STA ZS 13330 LOOP1 [175] PUFFER,X ;8 BYTES 13340 : CLC ;WERDEN 13350 : BEQ W5 ;V[145] H[176]IZ. 13360 : SEC ;NACH 13370 W5 ROL ZS2 ;VERTIKAL 13380 : LDA ZS ;[176]IENTIERT 13390 : DEX 13400 : BNE LOOP1 13410 : LDA ZS2 13420 : E[176] MASKE ;INV ODER 13430 : STA PUFFER1,Y ;N[176]MAL 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 [154] ;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 ;[185]ITI[145] 13550 SLOOP DEX 13560 : BEQ SPACE[128] 13570 : JSR IECOUT 13580 : JMP SLOOP 13590 SPACE[128] LDA #$FE ;[150]. ZEICHEN 13600 : JSR IECOUT ;AUSDRUCKEN 13610 : LDA #141 13620 : JSR IECOUT 13630 [154] INC ZEIGSP ;ZEIGER 13640 : BNE W6 ;AKTUALISIEREN 13650 : INC ZEIGSP[170]1 13660 W6 DEC SPALTZAHL 13670 : BEQ W7 13680 : JMP OUTLOOP1 13690 W7 LDA #$0D ;[128]E 13700 : JSR IECOUT 13710 OUT[128] RTS