; GO64! TUTORIAL ON 3-D GRAPHICS ; PART 4: DRAWING LINES (1) ; GO64! 3D-KURS ; TEIL 4: LINIENZEICHNEN (1) VICBANK = %00000011; $0000-$4000 V = VICBANK($03*$4000;=$0000 SCREEN = $0400 CHARSET0 = $2000 CHARSET1 = $2800 SPIDCOD0 = $5000 SPIDCOD1 = $7200 SPDT0OFS = $00 SPDT1OFS = $0880 SPDT2OFS = $1100 SPDT3OFS = $1980 SPDXOFSL = $0F00 SPDXOFSH = $0F80 BASEZP = $02 CURRCHAR = $00+BASEZP POINTERS = $01+BASEZP ALPHALO = $04+BASEZP BETALO = $05+BASEZP GAMMALO = $06+BASEZP ALPHAHI = $07+BASEZP BETAHI = $08+BASEZP GAMMAHI = $09+BASEZP ALPHA = $0A+BASEZP BETA = $0B+BASEZP GAMMA = $0C+BASEZP SINBUFL0 = $0D+BASEZP SINBUFH0 = $0E+BASEZP SINBUFL1 = $0F+BASEZP SINBUFH1 = $10+BASEZP UNITXXLO = $11+BASEZP UNITXXHI = $12+BASEZP UNITXYLO = $13+BASEZP UNITXYHI = $14+BASEZP UNITXZLO = $15+BASEZP UNITXZHI = $16+BASEZP UNITYXLO = $17+BASEZP UNITYXHI = $18+BASEZP UNITYYLO = $19+BASEZP UNITYYHI = $1A+BASEZP UNITYZLO = $1B+BASEZP UNITYZHI = $1C+BASEZP UNITZXLO = $1D+BASEZP UNITZXHI = $1E+BASEZP UNITZYLO = $1F+BASEZP UNITZYHI = $20+BASEZP UNITZZLO = $21+BASEZP UNITZZHI = $22+BASEZP DIVIDEND = $23+BASEZP DIVISOR = $25+BASEZP X2DCRDFR = $28+BASEZP Z2DCRDFR = $30+BASEZP X2DCORDS = $38+BASEZP Y2DCORDS = $40+BASEZP Z2DCORDS = $48+BASEZP OLDXCRDS = $50+BASEZP OLDYCRDS = $58+BASEZP BEGX = $0D+BASEZP ENDX = $0E+BASEZP BEGY = $0F+BASEZP ENDY = $10+BASEZP DELTAX = $11+BASEZP DELTAY = $12+BASEZP FOREGNDC = $01 BACKGNDC = $06 XPOS = $0C; CHAR MATRIX COORDINATES YPOS = $05; ZEICHENMATRIXKOORDINATEN ALPHAADD = $FFFF+1-($0200/3) BETAADD = $0700/3; ANGLE ADD VALUES GAMMAADD = $0300/3; WINKELADDITIONSWERTE NUMPOINT = $08 *= $4000 SEI LDA #$35 STA $01 LDA #RETURN;NMI STA $FFFB BIT $D011 BPL *-3 BIT $D011 BMI *-3 LDA #$00 STA $D011 LDA #BACKGNDC STA $D020 STA $D021 ; BUILD TABLES ; TABELLEN GENERIEREN LDA #$00 TAX TAY .BYTE $24 MKXOFSTB PLA STA SPDXOFSL,Y PHA TXA STA SPDXOFSH,Y PLA CLC ADC #SPIDRAW1-SPIDRAW0 ;= ADC #SPIDRAWE-SPIDRAW1 BCC *+3 INX INY BPL MKXOFSTB+1 LDX #$00 LDA SINCOSLO+$00,X STA SINCOSLO+$0100,X LDA SINCOSHI+$00,X STA SINCOSHI+$0100,X INX BNE *-13 ; BUILD SPEEDCODE ; SPEEDCODE GENERIEREN LDA #SPIDCOD0 STA POINTERS+3 LDA #>CHARSET0+V STA POINTERS+4 JSR MAKSPEED LDA #SPIDCOD1 STA POINTERS+3 LDA #>CHARSET1+V STA POINTERS+4 JSR MAKSPEED ; CLEAR CHARSETS ; ZEICHENSAETZE LOESCHEN LDA #>CHARSET0+V STA POINTERS+1 LDA #>CHARSET1+V STA POINTERS+3 LDA #XPOS+(YPOS*$28)+SCREEN+V STA POINTERS+1 LDX #$00 SETUPSCR TXA LDY #$00 STA (POINTERS+0),Y ADC #$10 INY CPY #$10 BNE SETUPSCR+3 LDA #$27 ADC POINTERS+0 STA POINTERS+0 BCC *+4 INC POINTERS+1 INX CPX #$10 BNE SETUPSCR ; SET FOREGROUND COLOUR ; VORDERGRUNDFARBE SETZEN LDA #FOREGNDC LDX #$00 STA $D800,X STA $D900,X STA $DA00,X STA $DB00,X INX BNE *-13 ; SET VIC REGISTERS ; VIC-REGISTER SETZEN BIT $D011 BPL *-3 BIT $D011 BMI *-3 LDA #%00011011 STA $D011 LDA #%00001000 STA $D016 LDA #SCREEN/64.(CHARSET0/$0400) STA $D018 LDA $DD00 AND #%11111100 ORA #VICBANK STA $DD00 LDA #$FF STA $D012 LDA #$01 STA $D01A LDA #$7F STA $DC0D LDA #IRQ STA $FFFF BIT $DC0D DEC $D019 CLI ; RESET ANGLES AND COORDINATES ; KOORDINATEN&WINKEL NULLSETZEN LDA #$00 LDX #NUMPOINT-1 STA OLDXCRDS,X STA OLDYCRDS,X DEX BPL *-5 STA CURRCHAR STA ALPHALO STA BETALO STA GAMMALO STA ALPHAHI STA BETAHI STA GAMMAHI ; MAIN LOOP ; HAUPTSCHLEIFE MAINLOOP ; ROTATE UNIT VECTORS ; (ABSOLUTELY UNOPTIMIZED) ; EINHEITSVEKTOREN ROTIEREN ; (ABSOLUT UNOPTIMIERT) SEI LDA ALPHAHI STA ALPHA LDA GAMMAHI STA GAMMA LDA BETAHI STA BETA CLI ; COS (BETA) * COS (GAMMA) CLC ADC #$40 ; (COS) SEC SBC GAMMA SEC SBC #$40 ; (COS) TAX ; BETA-GAMMA CLC LDA BETA ADC #$40 ; (COS) CLC ADC GAMMA CLC ADC #$40 ; (COS) TAY ; BETA+GAMMA SEC LDA SINCOSLO+$40,X SBC SINCOSLO+$40,Y STA UNITXXLO LDA SINCOSHI+$40,X; COS(B-G) SBC SINCOSHI+$40,Y; - COS(B+G) STA UNITXXHI ; - SIN(A) * SIN(B) * COS(G) ; - COS(A) * SIN(G) CLC LDA BETA ADC GAMMA CLC ADC #$40 ; (COS) SEC SBC ALPHA SEC SBC #$80 ; (-) TAX ; BETA+GAMMA-ALPHA CLC LDA ALPHA ADC #$80 ; (-) CLC ADC GAMMA CLC ADC #$40 ; (COS) SEC SBC BETA TAY ; ALPHA+GAMMA-BETA CLC LDA SINCOSLO+$00,X ADC SINCOSLO+$00,Y STA SINBUFL0 LDA SINCOSHI+$00,X; SIN(B+G-A) ADC SINCOSHI+$00,Y;+ SIN(A+G-B) STA SINBUFH0 CLC LDA ALPHA ADC #$80 ; (-) CLC ADC BETA SEC SBC GAMMA SEC SBC #$40 ; (COS) TAX ; ALPHA+BETA-GAMMA CLC LDA ALPHA ADC #$80 ; (-) CLC ADC BETA CLC ADC GAMMA CLC ADC #$40 ; (COS) TAY ; ALPHA+BETA+GAMMA SEC LDA SINCOSLO+$00,X SBC SINCOSLO+$00,Y STA SINBUFL1 LDA SINCOSHI+$00,X; SIN(A+B-G) SBC SINCOSHI+$00,Y;- SIN(A+B+G) STA SINBUFH1 CLC LDA SINBUFL0 ADC SINBUFL1 STA SINBUFL1 LDA SINBUFH0 ADC SINBUFH1 CMP #$80 ROR A ; - SIN(A)*SIN(B)*COS(G) ROR SINBUFL1 STA SINBUFH1 CLC LDA ALPHA ADC #$40+$80 ; (-COS) SEC SBC GAMMA TAX ; ALPHA-GAMMA CLC LDA ALPHA ADC #$40+$80 ; (-COS) CLC ADC GAMMA TAY ; ALPHA+GAMMA SEC LDA SINCOSLO+$40,X SBC SINCOSLO+$40,Y STA SINBUFL0 ; COS(A-G) LDA SINCOSHI+$40,X; - COS(A+G) SBC SINCOSHI+$40,Y STA SINBUFH0 ; - COS(A)*SIN(G) CLC LDA SINBUFL0 ADC SINBUFL1 STA UNITXYLO LDA SINBUFH0 ADC SINBUFH1 STA UNITXYHI ; COS(A) * SIN(B) * COS(G) ; - SIN(A) * SIN(G) CLC LDA BETA ADC GAMMA CLC ADC #$40 ; (COS) SEC SBC ALPHA SEC SBC #$40 ; (COS) TAX ; BETA+GAMMA-ALPHA CLC LDA ALPHA ADC #$40 ; (COS) CLC ADC GAMMA CLC ADC #$40 ; (COS) SEC SBC BETA TAY ; ALPHA+GAMMA-BETA CLC LDA SINCOSLO+$00,X ADC SINCOSLO+$00,Y STA SINBUFL0 LDA SINCOSHI+$00,X; SIN(B+G-A) ADC SINCOSHI+$00,Y;+ SIN(A+G-B) STA SINBUFH0 CLC LDA ALPHA ADC #$40 ; (COS) CLC ADC BETA SEC SBC GAMMA SEC SBC #$40 ; (COS) TAX ; ALPHA+BETA-GAMMA CLC LDA ALPHA ADC #$40 ; (COS) CLC ADC BETA CLC ADC GAMMA CLC ADC #$40 ; (COS) TAY ; ALPHA+BETA+GAMMA SEC LDA SINCOSLO+$00,X SBC SINCOSLO+$00,Y STA SINBUFL1 LDA SINCOSHI+$00,X; SIN(A+B-G) SBC SINCOSHI+$00,Y;- SIN(A+B+G) STA SINBUFH1 CLC LDA SINBUFL0 ADC SINBUFL1 STA SINBUFL1 LDA SINBUFH0 ADC SINBUFH1 CMP #$80 ROR A ; COS(A)*SIN(B)*COS(G) ROR SINBUFL1 STA SINBUFH1 CLC LDA ALPHA ADC #$80 ; (-) SEC SBC GAMMA TAX ; ALPHA-GAMMA CLC LDA ALPHA ADC #$80 ; (-) CLC ADC GAMMA TAY ; ALPHA+GAMMA SEC LDA SINCOSLO+$40,X SBC SINCOSLO+$40,Y STA SINBUFL0 ; COS(A-G) LDA SINCOSHI+$40,X; - COS(A+G) SBC SINCOSHI+$40,Y STA SINBUFH0 ; - SIN(A)*SIN(G) CLC LDA SINBUFL0 ADC SINBUFL1 STA UNITXZLO LDA SINBUFH0 ADC SINBUFH1 STA UNITXZHI ; - COS (BETA) * SIN (GAMMA) CLC LDA BETA ADC #$40+$80 ; (-COS) SEC SBC GAMMA TAX ; BETA-GAMMA CLC LDA BETA ADC #$40+$80 ; (-COS) CLC ADC GAMMA TAY ; BETA+GAMMA SEC LDA SINCOSLO+$40,X SBC SINCOSLO+$40,Y STA UNITYXLO LDA SINCOSHI+$40,X; COS(B-G) SBC SINCOSHI+$40,Y; - COS(B+G) STA UNITYXHI ; SIN(A) * SIN(B) * SIN(G) ; - COS(A) * COS(G) CLC LDA BETA ADC GAMMA SEC SBC ALPHA TAX ; BETA+GAMMA-ALPHA CLC LDA ALPHA ADC GAMMA SEC SBC BETA TAY ; ALPHA+GAMMA-BETA CLC LDA SINCOSLO+$00,X ADC SINCOSLO+$00,Y STA SINBUFL0 LDA SINCOSHI+$00,X; SIN(B+G-A) ADC SINCOSHI+$00,Y;+ SIN(A+G-B) STA SINBUFH0 CLC LDA ALPHA ADC BETA SEC SBC GAMMA TAX ; ALPHA+BETA-GAMMA CLC LDA ALPHA ADC BETA CLC ADC GAMMA TAY ; ALPHA+BETA+GAMMA SEC LDA SINCOSLO+$00,X SBC SINCOSLO+$00,Y STA SINBUFL1 LDA SINCOSHI+$00,X; SIN(A+B-G) SBC SINCOSHI+$00,Y;- SIN(A+B+G) STA SINBUFH1 CLC LDA SINBUFL0 ADC SINBUFL1 STA SINBUFL1 LDA SINBUFH0 ADC SINBUFH1 CMP #$80 ROR A ; SIN(A)*SIN(B)*SIN(G) ROR SINBUFL1 STA SINBUFH1 CLC LDA ALPHA ADC #$40+$80 ; (-COS) SEC SBC GAMMA SEC SBC #$40 ; (COS) TAX ; ALPHA-GAMMA CLC LDA ALPHA ADC #$40+$80 ; (-COS) CLC ADC GAMMA CLC ADC #$40 ; (COS) TAY ; ALPHA+GAMMA SEC LDA SINCOSLO+$40,X SBC SINCOSLO+$40,Y STA SINBUFL0 ; COS(A-G) LDA SINCOSHI+$40,X; - COS(A+G) SBC SINCOSHI+$40,Y STA SINBUFH0 ; - COS(A)*COS(G) CLC LDA SINBUFL0 ADC SINBUFL1 STA UNITYYLO LDA SINBUFH0 ADC SINBUFH1 STA UNITYYHI ; - COS(A) * SIN(B) * SIN(G) ; - SIN(A) * COS(G) CLC LDA BETA ADC GAMMA SEC SBC ALPHA SEC SBC #$40+$80 ; (-COS) TAX ; BETA+GAMMA-ALPHA CLC LDA ALPHA ADC #$40+$80 ; (-COS) CLC ADC GAMMA SEC SBC BETA TAY ; ALPHA+GAMMA-BETA CLC LDA SINCOSLO+$00,X ADC SINCOSLO+$00,Y STA SINBUFL0 LDA SINCOSHI+$00,X; SIN(B+G-A) ADC SINCOSHI+$00,Y;+ SIN(A+G-B) STA SINBUFH0 CLC LDA ALPHA ADC #$40+$80 ; (-COS) ADC BETA SEC SBC GAMMA TAX ; ALPHA+BETA-GAMMA CLC LDA ALPHA ADC #$40+$80 ; (-COS) CLC ADC BETA CLC ADC GAMMA TAY ; ALPHA+BETA+GAMMA SEC LDA SINCOSLO+$00,X SBC SINCOSLO+$00,Y STA SINBUFL1 LDA SINCOSHI+$00,X; SIN(A+B-G) SBC SINCOSHI+$00,Y;- SIN(A+B+G) STA SINBUFH1 CLC LDA SINBUFL0 ADC SINBUFL1 STA SINBUFL1 LDA SINBUFH0 ADC SINBUFH1 CMP #$80 ROR A ; - COS(A)*SIN(B)*SIN(G) ROR SINBUFL1 STA SINBUFH1 CLC LDA ALPHA ADC #$80 ; (-) SEC SBC GAMMA SEC SBC #$40 ; (COS) TAX ; ALPHA-GAMMA CLC LDA ALPHA ADC #$80 ; (-) CLC ADC GAMMA CLC ADC #$40 ; (COS) TAY ; ALPHA+GAMMA SEC LDA SINCOSLO+$40,X SBC SINCOSLO+$40,Y STA SINBUFL0 ; COS(A-G) LDA SINCOSHI+$40,X; - COS(A+G) SBC SINCOSHI+$40,Y STA SINBUFH0 ; - SIN(A)*COS(G) CLC LDA SINBUFL0 ADC SINBUFL1 STA UNITYZLO LDA SINBUFH0 ADC SINBUFH1 STA UNITYZHI ; SIN (BETA) LDX BETA LDA SINCOSLO+$00,X ASL A STA UNITZXLO LDA SINCOSHI+$00,X ROL A STA UNITZXHI ; SIN (ALPHA) * COS (BETA) SEC LDA ALPHA SBC BETA SEC SBC #$40 ; (COS) TAX ; ALPHA-BETA CLC LDA ALPHA ADC BETA CLC ADC #$40 ; (COS) TAY ; ALPHA+BETA SEC LDA SINCOSLO+$40,X SBC SINCOSLO+$40,Y STA UNITZYLO LDA SINCOSHI+$40,X; COS(A-B) SBC SINCOSHI+$40,Y; - COS(A+B) STA UNITZYHI ; - COS (ALPHA) * COS (BETA) CLC LDA ALPHA ADC #$80+$40 ; (-COS) SEC SBC BETA SEC SBC #$40 ; (COS) TAX ; ALPHA-BETA CLC LDA ALPHA ADC #$80+$40 ; (-COS) CLC ADC BETA CLC ADC #$40 ; (COS) TAY ; ALPHA+BETA CLC LDA SINCOSLO+$40,X SBC SINCOSLO+$40,Y STA UNITZZLO LDA SINCOSHI+$40,X; COS(A-B) SBC SINCOSHI+$40,Y; - COS(A+B) STA UNITZZHI ; CALCULATE NEW COORDINATES, ; PRETTY UNOPTIMIZED TOO ; NEUE KOORDINATEN BERECHNEN, ; AUCH ZIEMLICH UNOPTIMIERT ; P(-1;+1;+1) SEC LDA UNITXYLO SBC UNITXXLO TAX LDA UNITXYHI SBC UNITXXHI TAY CLC TXA ADC UNITXZLO STA X2DCRDFR+$00 TYA ADC UNITXZHI STA X2DCORDS+$00 SEC LDA UNITYYLO SBC UNITYXLO TAX LDA UNITYYHI SBC UNITYXHI TAY CLC TXA ADC UNITYZLO TYA ADC UNITYZHI STA Y2DCORDS+$00 SEC LDA UNITZYLO SBC UNITZXLO TAX LDA UNITZYHI SBC UNITZXHI TAY CLC TXA ADC UNITZZLO STA Z2DCRDFR+$00 TYA ADC UNITZZHI STA Z2DCORDS+$00 ; P(+1;+1;+1) CLC LDA UNITXXLO ADC UNITXYLO TAX LDA UNITXXHI ADC UNITXYHI TAY CLC TXA ADC UNITXZLO STA X2DCRDFR+$01 TYA ADC UNITXZHI STA X2DCORDS+$01 CLC LDA UNITYXLO ADC UNITYYLO TAX LDA UNITYXHI ADC UNITYYHI TAY CLC TXA ADC UNITYZLO TYA ADC UNITYZHI STA Y2DCORDS+$01 CLC LDA UNITZXLO ADC UNITZYLO TAX LDA UNITZXHI ADC UNITZYHI TAY CLC TXA ADC UNITZZLO STA Z2DCRDFR+$01 TYA ADC UNITZZHI STA Z2DCORDS+$01 ; P(-1;+1;-1) SEC LDA UNITXYLO SBC UNITXXLO TAX LDA UNITXYHI SBC UNITXXHI TAY SEC TXA SBC UNITXZLO STA X2DCRDFR+$02 TYA SBC UNITXZHI STA X2DCORDS+$02 SEC LDA UNITYYLO SBC UNITYXLO TAX LDA UNITYYHI SBC UNITYXHI TAY SEC TXA SBC UNITYZLO TYA SBC UNITYZHI STA Y2DCORDS+$02 SEC LDA UNITZYLO SBC UNITZXLO TAX LDA UNITZYHI SBC UNITZXHI TAY SEC TXA SBC UNITZZLO STA Z2DCRDFR+$02 TYA SBC UNITZZHI STA Z2DCORDS+$02 ; P(+1;+1;-1) CLC LDA UNITXXLO ADC UNITXYLO TAX LDA UNITXXHI ADC UNITXYHI TAY SEC TXA SBC UNITXZLO STA X2DCRDFR+$03 TYA SBC UNITXZHI STA X2DCORDS+$03 CLC LDA UNITYXLO ADC UNITYYLO TAX LDA UNITYXHI ADC UNITYYHI TAY SEC TXA SBC UNITYZLO TYA SBC UNITYZHI STA Y2DCORDS+$03 CLC LDA UNITZXLO ADC UNITZYLO TAX LDA UNITZXHI ADC UNITZYHI TAY SEC TXA SBC UNITZZLO STA Z2DCRDFR+$03 TYA SBC UNITZZHI STA Z2DCORDS+$03 ; P(-1;-1;+1) SEC LDA UNITXZLO SBC UNITXXLO TAX LDA UNITXZHI SBC UNITXXHI TAY SEC TXA SBC UNITXYLO STA X2DCRDFR+$04 TYA SBC UNITXYHI STA X2DCORDS+$04 SEC LDA UNITYZLO SBC UNITYXLO TAX LDA UNITYZHI SBC UNITYXHI TAY SEC TXA SBC UNITYYLO TYA SBC UNITYYHI STA Y2DCORDS+$04 SEC LDA UNITZZLO SBC UNITZXLO TAX LDA UNITZZHI SBC UNITZXHI TAY SEC TXA SBC UNITZYLO STA Z2DCRDFR+$04 TYA SBC UNITZYHI STA Z2DCORDS+$04 ; P(+1;-1;+1) SEC LDA UNITXXLO SBC UNITXYLO TAX LDA UNITXXHI SBC UNITXYHI TAY CLC TXA ADC UNITXZLO STA X2DCRDFR+$05 TYA ADC UNITXZHI STA X2DCORDS+$05 SEC LDA UNITYXLO SBC UNITYYLO TAX LDA UNITYXHI SBC UNITYYHI TAY CLC TXA ADC UNITYZLO TYA ADC UNITYZHI STA Y2DCORDS+$05 SEC LDA UNITXZLO SBC UNITZYLO TAX LDA UNITZXHI SBC UNITZYHI TAY CLC TXA ADC UNITZZLO STA Z2DCRDFR+$05 TYA ADC UNITZZHI STA Z2DCORDS+$05 ; P(-1;-1;-1) SEC LDA #$00 SBC UNITXXLO TAX LDA #$00 SBC UNITXXHI TAY SEC TXA SBC UNITXYLO TAX TYA SBC UNITXYHI TAY SEC TXA SBC UNITXZLO STA X2DCRDFR+$06 TYA SBC UNITXZHI STA X2DCORDS+$06 SEC LDA #$00 SBC UNITYXLO TAX LDA #$00 SBC UNITYXHI TAY SEC TXA SBC UNITYYLO TAX TYA SBC UNITYYHI TAY SEC TXA SBC UNITYZLO TYA SBC UNITYZHI STA Y2DCORDS+$06 SEC LDA #$00 SBC UNITZXLO TAX LDA #$00 SBC UNITZXHI TAY SEC TXA SBC UNITZYLO TAX TYA SBC UNITZYHI TAY SEC TXA SBC UNITZZLO STA Z2DCRDFR+$06 TYA SBC UNITZZHI STA Z2DCORDS+$06 ; P(+1;-1;-1) SEC LDA UNITXXLO SBC UNITXYLO TAX LDA UNITXXHI SBC UNITXYHI TAY SEC TXA SBC UNITXZLO STA X2DCRDFR+$07 TYA SBC UNITXZHI STA X2DCORDS+$07 SEC LDA UNITYXLO SBC UNITYYLO TAX LDA UNITYXHI SBC UNITYYHI TAY SEC TXA SBC UNITYZLO TYA SBC UNITYZHI STA Y2DCORDS+$07 SEC LDA UNITZXLO SBC UNITZYLO TAX LDA UNITZXHI SBC UNITZYHI TAY SEC TXA SBC UNITZZLO STA Z2DCRDFR+$07 TYA SBC UNITZZHI STA Z2DCORDS+$07 ; CONVERT COORDINATES TO 2-D ; KOORDINATEN NACH 2D WANDELN LDX #NUMPOINT-1 CONVTO2D LDY X2DCRDFR,X LDA X2DCORDS,X JSR PERSPECT STA X2DCORDS,X LDY Z2DCRDFR,X LDA Z2DCORDS,X JSR PERSPECT STA Y2DCORDS,X DEX BPL CONVTO2D ; TOGGLE VISIBLE SCREEN ; SICHTBAREN BILDSCHIRM ; UMSCHALTEN LDA $D012 CMP #$D3 BCS *+13 CMP #$53 BCC *+9 LDA #$D3 CMP $D012 BCS *-3 LDA #$01 EOR CURRCHAR STA CURRCHAR LDA #CHARSET0(CHARSET1/$0400 EOR $D018 STA $D018 ; CLEAR THE INVISIBLE CHARSET ; DEN UNSICHTBAREN ZEICHENSATZ ; LOESCHEN LDA #$00 TAX LDY CURRCHAR BEQ CLIRCHR1 CLIRCHR0 STA CHARSET0+V+$00,X STA CHARSET0+V+$80,X STA CHARSET0+V+$0100,X STA CHARSET0+V+$0180,X STA CHARSET0+V+$0200,X STA CHARSET0+V+$0280,X STA CHARSET0+V+$0300,X STA CHARSET0+V+$0380,X STA CHARSET0+V+$0400,X STA CHARSET0+V+$0480,X STA CHARSET0+V+$0500,X STA CHARSET0+V+$0580,X STA CHARSET0+V+$0600,X STA CHARSET0+V+$0680,X STA CHARSET0+V+$0700,X STA CHARSET0+V+$0780,X INX BPL CLIRCHR0 BMI DRAWLOOP-2 CLIRCHR1 STA CHARSET1+V+$00,X STA CHARSET1+V+$80,X STA CHARSET1+V+$0100,X STA CHARSET1+V+$0180,X STA CHARSET1+V+$0200,X STA CHARSET1+V+$0280,X STA CHARSET1+V+$0300,X STA CHARSET1+V+$0380,X STA CHARSET1+V+$0400,X STA CHARSET1+V+$0480,X STA CHARSET1+V+$0500,X STA CHARSET1+V+$0580,X STA CHARSET1+V+$0600,X STA CHARSET1+V+$0680,X STA CHARSET1+V+$0700,X STA CHARSET1+V+$0780,X INX BPL CLIRCHR1 ; DRAW VECTOR OBJECT ; VEKTOROBJEKT ZEICHNEN LDY #LINEPNT1-LINEPNT0-1 DRAWLOOP STY POINTERS+2 LDX LINEPNT0,Y LDA X2DCORDS,X STA BEGX LDA Y2DCORDS,X STA BEGY LDX LINEPNT1,Y LDA X2DCORDS,X LDY Y2DCORDS,X TAX JSR DRAWLINE LDY POINTERS+2 DEY BPL DRAWLOOP JMP MAINLOOP ; IRQ ROUTINE ; IRQ-ROUTINE IRQ PHA ; ADVANCE ANGLES ; WINKEL ERHOEHEN CLC LDA #ALPHAADD ADC ALPHAHI STA ALPHAHI CLC LDA #BETAADD ADC BETAHI STA BETAHI CLC LDA #GAMMAADD ADC GAMMAHI STA GAMMAHI DEC $D019 PLA RTI ;PERFORM PERSPECTIVE DIVISION ;PERSPEKTIVDIVISION VOLLFUEHREN PERSPECT PHA BPL NONEGCRD PHA TYA CLC EOR #$FF ADC #$01 TAY PLA EOR #$FF ADC #$00 NONEGCRD STA DIVIDEND+0 STY DIVIDEND+1 CLC LDA #$50; ONLY POSITIVE DEPTH ; VALUES ; NUR POSITIVE TIEFEN- ; WERTE ADC Y2DCORDS,X STA DIVISOR+0 LDY #$00 STY DIVISOR+1 INY STY DIVISOR+2 SEC DIVLOOP ROR DIVISOR+0 ROR DIVISOR+1 SEC LDA DIVIDEND+1 SBC DIVISOR+1 TAY LDA DIVIDEND+0 SBC DIVISOR+0 BCC *+6 STA DIVIDEND+0 STY DIVIDEND+1 ROL DIVISOR+2 BCC DIVLOOP PLA ASL A LDA DIVISOR+2 BCC *+4 EOR #$FF ADC #$40;ORIGIN IS AT ($40;$40) ;URSPRUNG BEI ($40;$40) RTS ; DRAW A LINE ; EINE LINIE ZEICHNEN DRAWLINE STX ENDX STY ENDY CPX BEGX BCS *+14; SWAP LINE END POINTS LDA BEGX; IF THE LINE RUNS STA ENDX; FROM RIGHT TO LEFT LDA BEGY; LINIENENDPUNKTE VER- STA ENDY; TAUSCHEN, WENN DIE STX BEGX; LINIE VON RECHTS STY BEGY; NACH LINKS VERLAEUFT SEC LDA ENDX SBC BEGX STA DELTAX LDA BEGY SBC ENDY BCC LINTYPE2 STA DELTAY CMP DELTAX BCC LINTYPE1 DEC ENDY LSR A EOR #$FF TAX LDA #SPDT0OFS JMP PUTLINE0 LINTYPE1 LDA DELTAX LSR A EOR #$FF TAX LDA #SPDT1OFS JMP PUTLINE0 LINTYPE2 EOR #$FF ADC #$01 STA DELTAY CMP DELTAX BCS LINTYPE3 LDA DELTAX LSR A EOR #$FF TAX LDA #SPDT2OFS JMP PUTLINE0 LINTYPE3 INC ENDY LSR A EOR #$FF TAX LDA #SPDT3OFS PUTLINE0 CLC PHA LDA CURRCHAR BEQ DRWLNCH1 PLA ADC #SPIDCOD0 STA POINTERS+1 BNE PUTLINE1 DRWLNCH1 PLA ADC #SPIDCOD1 STA POINTERS+1 PUTLINE1 LDY BEGX ; DETERMINE LDA POINTERS+0; JUMP-IN ADC SPDXOFSL,Y; ADDRESS STA SPEEDJSR+1 LDA POINTERS+1; EINSPRUNG- ADC SPDXOFSH,Y; ADRESSE STA SPEEDJSR+2; BESTIMMEN LDY ENDX LDA #SPRW0DIR-SPIDRAW0+1 ADC POINTERS+0 PHP CLC ADC SPDXOFSL,Y STA POINTERS+0; DETERMINE LDA #$00 ; RETURN ADDRESS ADC POINTERS+1 PLP ; RUECKKEHR- ADC SPDXOFSH,Y; ADRESSE STA POINTERS+1; BESTIMMEN LDY #$00 LDA (POINTERS+0),Y; BUFFER SOME PHA ; SPEEDCODE INY LDA (POINTERS+0),Y; ETWAS PHA ; SPEEDCODE INY ; PUFFERN LDA (POINTERS+0),Y PHA INY LDA (POINTERS+0),Y PHA INY LDA (POINTERS+0),Y PHA ; STORE THE LITTLE FIXING ; LOOP ; DIE KLEINE KORRIGIERSCHLEIFE ; SCHREIBEN LDY #$00 LDA #$C0; OP-CODE FOR CMP #$ ; OP-CODE FUER CMP #$ STA (POINTERS+0),Y INY LDA ENDY STA (POINTERS+0),Y INY LDA #$D0; OP-CODE FOR BNE ; OP-CODE FUER BNE STA (POINTERS+0),Y INY LDA #$F3; *-11 STA (POINTERS+0),Y INY LDA #$60; OP-CODE FOR RTS ; OP-CODE FUER RTS STA (POINTERS+0),Y CLC TXA LDY BEGY SPEEDJSR JSR !$00; FINALLY DRAW THE LINE ; DIE LINIE ENDLICH ; ZEICHNEN LDY #$04; RESTORE THE SPEEDCODE PLA ; DEN SPEEDCODE WIEDER- STA (POINTERS+0),Y; HERSTELLEN DEY PLA STA (POINTERS+0),Y DEY PLA STA (POINTERS+0),Y DEY PLA STA (POINTERS+0),Y DEY PLA STA (POINTERS+0),Y RTS ; SUBROUTINE TO BUILD ; THE SPEEDCODE ; UNTERROUTINE ZUM GENERIEREN ; DES SPEEDCODES MAKSPEED LDA #$88; OP-CODE FOR DEY ; OP-CODE FUER DEY STA SPRW0DIR STA SPRW1DIR LDA #SPDT0OFS JSR MKSPT0SB LDA #SPDT1OFS JSR MKSPT1SB LDA #$C8; OP-CODE FOR INY ; OP-CODE FUER INY STA SPRW0DIR STA SPRW1DIR LDA #SPDT2OFS JSR MKSPT1SB LDA #SPDT3OFS JMP MKSPT0SB MKSPT0SB CLC ADC POINTERS+2 STA POINTERS+0 TXA ADC POINTERS+3 STA POINTERS+1 LDA #%10000000 STA SPIDRAW0+2 LDA POINTERS+4 STA SPIDRAW0+5 STA SPIDRAW0+8 LDX #$80; 128 PIXELS WIDTH ; 128 PIXEL BREITE MKSPT0LP LDY #SPIDRAW1-SPIDRAW0-1 LDA SPIDRAW0,Y STA (POINTERS+0),Y DEY BPL MKSPT0LP+2 LDA #SPIDRAW1-SPIDRAW0 LDY #SPIDRAW0-SPIDRAW0 JSR NEXTSPID BNE MKSPT0LP+0 RTS MKSPT1SB CLC ADC POINTERS+2 STA POINTERS+0 TXA ADC POINTERS+3 STA POINTERS+1 LDA #%10000000 STA SPIDRAW1+2 LDA POINTERS+4 STA SPIDRAW1+5 STA SPIDRAW1+8 LDX #$80; 128 PIXELS WIDTH ; 128 PIXEL BREITE MKSPT1LP LDY #SPIDRAWE-SPIDRAW1-1 LDA SPIDRAW1,Y STA (POINTERS+0),Y DEY BPL MKSPT1LP+2 LDA #SPIDRAWE-SPIDRAW1 LDY #SPIDRAW1-SPIDRAW0 JSR NEXTSPID BNE MKSPT1LP+0 RTS NEXTSPID CLC ADC POINTERS+0 STA POINTERS+0 BCC *+4 INC POINTERS+1 LDA SPIDRAW0+2,Y LSR A LDA SPIDRAW0+2,Y ROR A STA SPIDRAW0+2,Y BCC NXTSPRET CLC LDA #$80; 1 CHAR COLUMN IS 128 ; (16X8) BYTES ; 1 ZEICHENSPALTE SIND ; 128 (16*8) BYTES ADC SPIDRAW0+4,Y STA SPIDRAW0+4,Y STA SPIDRAW0+7,Y LDA #$00 ADC SPIDRAW0+5,Y STA SPIDRAW0+5,Y STA SPIDRAW0+8,Y NXTSPRET DEX RTS ; SPEEDCODE ELEMENT FOR A ; SLOPE ANGLE OF +/-90 TO   ; +/-45 DEGREES ; SPEEDCODEELEMENT FUER EINEN ; STEIGUNGSWINKEL VON +/-90 ; BIS +/-45 GRAD SPIDRAW0 TAX LDA #$00 ORA !$00,Y STA !$00,Y SPRW0DIR .BYTE $00 TXA ADC DELTAX BCC SPIDRAW0 SBC DELTAY ; SPEEDCODE ELEMENT FOR A ; SLOPE ANGLE OF +/-45 TO 0 ; DEGREES ; SPEEDCODEELEMENT FUER EINEN ; STEIGUNGSWINKEL VON +/-45 ; BIS 0 GRAD SPIDRAW1 TAX LDA #$00 ORA !$00,Y STA !$00,Y TXA ADC DELTAY BCC *+5 SBC DELTAX SPRW1DIR .BYTE $00 SPIDRAWE ; TABLE WITH THE LINE BEGIN ; AND END POINTS ; TABELLE DER LINIENANFANGS- ; UND ENDPUNKTE LINEPNT0 .BYTE 0,1,3,2,0,1,2,3,4,5,7,6 LINEPNT1 .BYTE 1,3,2,0,4,5,6,7,5,7,6,4 NMI RTI ; SINE/COSINE TABLE ; SINUS-/KOSINUSTABELLE *= *&$FF00+$0100 SINCOSLO .BYTE $00,$8A,$14,$9E,$28,$B1 .BYTE $3A,$C2,$4A,$D1,$58,$DE .BYTE $62,$E6,$69,$EA,$6B,$EA .BYTE $67,$E4,$5E,$D8,$4F,$C5 .BYTE $38,$AA,$1A,$88,$F4,$5E .BYTE $C6,$2B,$8E,$EE,$4D,$A8 .BYTE $01,$57,$AB,$FC,$4A,$96 .BYTE $DE,$24,$66,$A6,$E3,$1C .BYTE $53,$86,$B6,$E3,$0D,$33 .BYTE $57,$77,$93,$AD,$C3,$D5 .BYTE $E4,$F0,$F9,$FE,$FF,$FE .BYTE $F9,$F0,$E4,$D5,$C3,$AD .BYTE $93,$77,$57,$33,$0D,$E3 .BYTE $B6,$86,$53,$1C,$E3,$A6 .BYTE $66,$24,$DE,$96,$4A,$FC .BYTE $AB,$57,$01,$A8,$4D,$EE .BYTE $8E,$2B,$C6,$5E,$F4,$88 .BYTE $1A,$AA,$38,$C5,$4F,$D8 .BYTE $5E,$E4,$67,$EA,$6B,$EA .BYTE $69,$E6,$62,$DE,$58,$D1 .BYTE $4A,$C2,$3A,$B1,$28,$9E .BYTE $14,$8A,$00,$75,$EB,$61 .BYTE $D7,$4E,$C5,$3D,$B5,$2E .BYTE $A7,$21,$9D,$19,$96,$15 .BYTE $94,$15,$98,$1B,$A1,$27 .BYTE $B0,$3A,$C7,$55,$E5,$77 .BYTE $0B,$A1,$39,$D4,$71,$11 .BYTE $B2,$57,$FE,$A8,$54,$03 .BYTE $B5,$69,$21,$DB,$99,$59 .BYTE $1C,$E3,$AC,$79,$49,$1C .BYTE $F2,$CC,$A8,$88,$6C,$52 .BYTE $3C,$2A,$1B,$0F,$06,$01 .BYTE $00,$01,$06,$0F,$1B,$2A .BYTE $3C,$52,$6C,$88,$A8,$CC .BYTE $F2,$1C,$49,$79,$AC,$E3 .BYTE $1C,$59,$99,$DB,$21,$69 .BYTE $B5,$03,$54,$A8,$FE,$57 .BYTE $B2,$11,$71,$D4,$39,$A1 .BYTE $0B,$77,$E5,$55,$C7,$3A .BYTE $B0,$27,$A1,$1B,$98,$15 .BYTE $94,$15,$96,$19,$9D,$21 .BYTE $A7,$2E,$B5,$3D,$C5,$4E .BYTE $D7,$61,$EB,$75 *= *+$0100 SINCOSHI .BYTE $00,$00,$01,$01,$02,$02 .BYTE $03,$03,$04,$04,$05,$05 .BYTE $06,$06,$07,$07,$08,$08 .BYTE $09,$09,$0A,$0A,$0B,$0B .BYTE $0C,$0C,$0D,$0D,$0D,$0E .BYTE $0E,$0F,$0F,$0F,$10,$10 .BYTE $11,$11,$11,$11,$12,$12 .BYTE $12,$13,$13,$13,$13,$14 .BYTE $14,$14,$14,$14,$15,$15 .BYTE $15,$15,$15,$15,$15,$15 .BYTE $15,$15,$15,$15,$15,$15 .BYTE $15,$15,$15,$15,$15,$15 .BYTE $15,$15,$15,$15,$15,$14 .BYTE $14,$14,$14,$14,$13,$13 .BYTE $13,$13,$12,$12,$12,$11 .BYTE $11,$11,$11,$10,$10,$0F .BYTE $0F,$0F,$0E,$0E,$0D,$0D .BYTE $0D,$0C,$0C,$0B,$0B,$0A .BYTE $0A,$09,$09,$08,$08,$07 .BYTE $07,$06,$06,$05,$05,$04 .BYTE $04,$03,$03,$02,$02,$01 .BYTE $01,$00,$00,$FF,$FE,$FE .BYTE $FD,$FD,$FC,$FC,$FB,$FB .BYTE $FA,$FA,$F9,$F9,$F8,$F8 .BYTE $F7,$F7,$F6,$F6,$F5,$F5 .BYTE $F4,$F4,$F3,$F3,$F2,$F2 .BYTE $F2,$F1,$F1,$F0,$F0,$F0 .BYTE $EF,$EF,$EE,$EE,$EE,$EE .BYTE $ED,$ED,$ED,$EC,$EC,$EC .BYTE $EC,$EB,$EB,$EB,$EB,$EB .BYTE $EA,$EA,$EA,$EA,$EA,$EA .BYTE $EA,$EA,$EA,$EA,$EA,$EA .BYTE $EA,$EA,$EA,$EA,$EA,$EA .BYTE $EA,$EA,$EA,$EA,$EA,$EA .BYTE $EA,$EB,$EB,$EB,$EB,$EB .BYTE $EC,$EC,$EC,$EC,$ED,$ED .BYTE $ED,$EE,$EE,$EE,$EE,$EF .BYTE $EF,$F0,$F0,$F0,$F1,$F1 .BYTE $F2,$F2,$F2,$F3,$F3,$F4 .BYTE $F4,$F5,$F5,$F6,$F6,$F7 .BYTE $F7,$F8,$F8,$F9,$F9,$FA .BYTE $FA,$FB,$FB,$FC,$FC,$FD .BYTE $FD,$FE,$FE,$FF *= *+$0100 RETURN SEI LDA #$37 STA $01 LDX #$FF TXS JSR $FDA3 LDA #$00 TAY STA $02,Y STA $0200,Y STA $0300,Y INY BNE *-10 LDX #$3C LDY #$03 STX $B2 STY $B3 LDX #$00 LDY #$A0 JSR $FD8C JSR $FD15 JSR $FF5B JSR $E453 JSR $E3BF LDX #$01 STX $DF06 DEX STX $DF02 STX $DF04 LDY #$08 STY $DF03 STY $DF05 LDY #$F8 STY $DF07 DEY STY $DF08 STX $DF0A LDA #$EC STA $DF01 LDY #$1F LDA DORETURN,Y STA $0340,Y DEY BPL *-7 JSR $0340 STX $DF06 LDA #$ED STA $DF01 LDA #$8F PHA LDA #$FF PHA JMP $0340 DORETURN SEI LDA #$30 STA $01 LDA $FF00 STA $FF00 LDA #$37 STA $01 RTS