; GO64! TUTORIAL ON 3-D GRAPHICS ; PART 5: DRAWING LINES (2) ; GO64! 3D-KURS ; TEIL 5: LINIENZEICHNEN (2) SINCOSLO = $4A00 SINCOSHI = $4C00 LOG2TABL = $5180 LOG2TBH0 = $5200 LOG2TBH1 = $5280 VICBANK = %00000011; $0000-$4000 V = VICBANK($03*$4000;=$0000 SCREEN = $0400 CHARSET0 = $2000 CHARSET1 = $2800 SPIDCOD0 = $5300 SPIDCOD1 = $7100 SPDT0OFS = $00 SPDT1OFS = $0780 SPDT2OFS = $0F00 SPDT3OFS = $1680 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 LINSLOPE = $13+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 #$D6 BCS *+13 CMP #$53 BCC *+9 LDA #$D6 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 ; LINE ANGLES FROM -90 TO -45 ; DEGREES ; LINIENWINKEL VON -90 BIS -45 ; GRAD DEC ENDY LDA #SPDT0OFS BCS PUTLINE0 ; LINE ANGLES FROM -45 TO 0 ; DEGREES ; LINIENWINKEL VON -45 BIS 0 ; GRAD LINTYPE1 LDA #SPDT1OFS BCC PUTLINE0 LINTYPE2 EOR #$FF ADC #$01 STA DELTAY CMP DELTAX BCS LINTYPE3 ; LINE ANGLES FROM 0 TO 45 ; DEGREES ; LINIENWINKEL VON 0 BIS 45 ; GRAD LDA #SPDT2OFS BCC PUTLINE0 ; LINE ANGLES FROM 45 TO 90 ; DEGREES ; LINIENWINKEL VON 45 BIS 90 ; GRAD LINTYPE3 INC ENDY LDA #SPDT3OFS PUTLINE0 LDX DELTAX LDY DELTAY BCS *+6 LDX DELTAY LDY DELTAX PHA SEC ; PERFORM DIVI- LDA LOG2TABL,Y; SION TO CALC- SBC LOG2TABL,X; ULATE THE STA CLCSLOPE+1; LINE SLOPE LDA LOG2TBH0,Y; DIVISION VOLL- SBC LOG2TBH1,X; FUEHREN, UM STA CLCSLOPE+2; DEN LINIEN- CLCSLOPE LDA !$00 ; ANSTIEG ZU STA LINSLOPE ; BERECHNEN CLC PLA TAY PLA PHA LDA CURRCHAR BEQ DRWLNCH1 PLA ADC #SPIDCOD0 STA POINTERS+1 BNE PUTLINE2 DRWLNCH1 PLA ADC #SPIDCOD1 STA POINTERS+1 PUTLINE2 LDY BEGX ; DETERMINE LDA POINTERS+0; JUMP-IN ADC SPDXOFSL,Y; ADDRESS STA SPIDJSR0+1 STA SPIDJSR1+1 LDA POINTERS+1; EINSPRUNG- ADC SPDXOFSH,Y; ADRESSE STA SPIDJSR0+2; BESTIMMEN STA SPIDJSR1+2 LDY ENDX LDA SPDXOFSL,Y; DETERMINE ADC POINTERS+0; RETURN ADDRESS STA POINTERS+0 LDA SPDXOFSH,Y; RUECKKEHR- ADC POINTERS+1; ADRESSE STA POINTERS+1; BESTIMMEN LDA DELTAY CMP DELTAX BCS BIGSLOPE LDY #$08 LDA #$60; OP-CODE FOR RTS STA (POINTERS+0),Y; OP-CODE ; FUER RTS LDX #$80 LDY BEGY SPIDJSR0 JSR !$00; DRAW THE LINE ; DIE LINIE ZEICHNEN LDY #$08 LDA #$8A; OP-CODE FOR TXA STA (POINTERS+0),Y; OP-CODE ; FUER TXA RTS BIGSLOPE LDY #$09 LDA #$C0; OP-CODE FOR CPY #$ ; OP-CODE FUER CPY #$ 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 LDX #$80 LDY BEGY SPIDJSR1 JSR !$00; FINALLY DRAW THE LINE ; DIE LINIE ENDLICH ; ZEICHNEN LDY #$09 LDA #$8A; RESTORE THE SPEEDCODE STA (POINTERS+0),Y; DEN SPEED- INY ; CODE WIEDERHERSTELLEN LDA #$65 STA (POINTERS+0),Y INY LDA #LINSLOPE STA (POINTERS+0),Y INY LDA #$AA STA (POINTERS+0),Y INY LDA #$90 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+1 LDA POINTERS+4 STA SPIDRAW0+4 STA SPIDRAW0+7 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+1 LDA POINTERS+4 STA SPIDRAW1+4 STA SPIDRAW1+7 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+1,Y PHA LSR A PLA ROR A STA SPIDRAW0+1,Y BCC NXTSPRET CLC LDA #$80; 1 CHAR COLUMN IS 128 ; (16X8) BYTES ; 1 ZEICHENSPALTE SIND ; 128 (16*8) BYTES ADC SPIDRAW0+3,Y STA SPIDRAW0+3,Y STA SPIDRAW0+6,Y LDA #$00 ADC SPIDRAW0+4,Y STA SPIDRAW0+4,Y STA SPIDRAW0+7,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 LDA #$00 ORA !$00,Y STA !$00,Y SPRW0DIR .BYTE $00 TXA ADC LINSLOPE TAX BCC SPIDRAW0 ; SPEEDCODE ELEMENT FOR A ; SLOPE ANGLE OF +/-45 TO 0 ; DEGREES ; SPEEDCODEELEMENT FUER EINEN ; STEIGUNGSWINKEL VON +/-45 ; BIS 0 GRAD SPIDRAW1 LDA #$00 ORA !$00,Y STA !$00,Y TXA ADC LINSLOPE TAX BCC *+3 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 *= $0800 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