; GO64! TUTORIAL ON 3-D GRAPHICS ; PART 8: FLAT SHADING ; GO64! 3D-KURS ; TEIL 8: FLAT SHADING SINCOSLO = $4D00 SINCOSHI = $4F00 LOG2TABL = $5480 LOG2TBH0 = $5500 LOG2TBH1 = $5580 RECIPTBL = $5600 RECIPTBH = $5700 PERSPTAB = $5800 VICBANK = %00000011; $0000-$4000 V = VICBANK($03*$4000;=$0000 SCRN = $0400 SPDXOFSL = $0E00 SPDXOFSH = $0F00 CHARSET0 = $2000 CHARSET1 = $2800 CHARSET2 = $3000 FILLBUFF = $3800 SPIDCOD0 = $5900 SPIDCOD1 = $6480 SPIDCOD2 = $7000 FILSPID0 = $7B80 FILSPID1 = $A300 FILSPID2 = $CA80 ERASPEED = $F200 SPDT1OFS = $0400 SPDT2OFS = $07C0 BASEZP = $02 CURRSCRN = $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 X2DCORDS = $27+BASEZP Y2DCORDS = $2F+BASEZP Z2DCORDS = $37+BASEZP OLDXCRDS = $3F+BASEZP OLDYCRDS = $47+BASEZP OLDVISIB = $4F+BASEZP BEGX = $0D+BASEZP ENDX = $0E+BASEZP BEGY = $0F+BASEZP ENDY = $10+BASEZP DELTAX = $11+BASEZP DELTAY = $12+BASEZP LINSLOPL = $13+BASEZP LINSLOPH = $14+BASEZP MULTIZPG = $15+BASEZP CULLBUFF = $17+BASEZP VISIBLIN = $19+BASEZP CNTDEPTH = $5B+BASEZP COLTABLE = $61+BASEZP BACKGNDC = $06 XPOS = $0C; CHAR MATRIX COORDINATES YPOS = $05; ZEICHENMATRIXKOORDINATEN ALPHAADD = $FF55 BETAADD = $0255; ANGLE ADD VALUES GAMMAADD = $0100; WINKELADDITIONSWERTE NUMPOINT = $08 *= $4000 SEI LDA #$35 STA $01 LDA #RETURN;NMI STA $FFFB BIT $D011 BPL *-$03 BIT $D011 BMI *-$03 LDA #$00 STA $D011 LDA #BACKGNDC STA $D020 ; BUILD TABLES ; TABELLEN GENERIEREN LDA #SPIDRAW1-SPIDRAW0 LDX #$00 JSR MKXOFSTB LDA #SPIDRAWE-SPIDRAW1 LDX #$40 JSR MKXOFSTB LDA #ERASRAW1-ERASRAW0 LDX #$80 JSR MKXOFSTB LDA #ERASRAWE-ERASRAW1 LDX #$C0 JSR MKXOFSTB LDX #$00 LDA SINCOSLO+$00,X STA SINCOSLO+$0100,X LDA SINCOSHI+$00,X STA SINCOSHI+$0100,X INX BNE *-$0D ; BUILD SPEEDCODE ; SPEEDCODE GENERIEREN LDA #%01000000 LDX #SPIDCOD0 JSR MAKLINSP LDA #%10000000 LDX #SPIDCOD1 JSR MAKLINSP LDA #%11000000 LDX #SPIDCOD2 JSR MAKLINSP LDA #$30 STA $01 LDA #>CHARSET0+V LDX #FILSPID0 JSR MKFILSPD LDA #>CHARSET1+V LDX #FILSPID1 JSR MKFILSPD LDA #>CHARSET2+V LDX #FILSPID2 JSR MKFILSPD LDA #$35 STA $01 CLC LDA #ERASPEED STA POINTERS+$01 STA POINTERS+$03 LDA #>FILLBUFF STA POINTERS+$04 STA ERASRAW0+$04 LDA #$04 STA POINTERS+$05 LDX #$40; 64 PIXELS WIDTH ; 64 PIXEL BREITE MKERS0LP LDY #ERASRAW1-ERASRAW0-$01 LDA ERASRAW0,Y STA (POINTERS+$00),Y DEY BPL MKERS0LP+$02 LDA #ERASRAW1-ERASRAW0 LDY #ERASRAW0-ERASRAW0 JSR NEXTERAS BNE MKERS0LP+$00 LDA #$88; OP-CODE FOR DEY ; OP-CODE FUER DEY LDX #ERASPEED+$0340 JSR MKERS1SB LDA #$C8; OP-CODE FOR INY ; OP-CODE FUER INY LDX #ERASPEED+$0640 JSR MKERS1SB ; CLEAR THE CHARSETS AND THE ; FILLING BUFFER ; DIE ZEICHENSAETZE UND DEN ; FUELLPUFFER LOESCHEN LDY #CHARSET0+V STA POINTERS+$01 LDA #>CHARSET1+V STA POINTERS+$03 LDA #>CHARSET2+V STA POINTERS+$05 LDA #FILLBUFF STA POINTERS+$07 LDX #$08 CLEARCHR LDA #%11111111 STA (POINTERS+$00),Y STA (POINTERS+$02),Y STA (POINTERS+$04),Y LDA #%00000000 STA (POINTERS+$06),Y INY BNE CLEARCHR INC POINTERS+$01 INC POINTERS+$03 INC POINTERS+$05 INC POINTERS+$07 DEX BNE CLEARCHR ; CLEAR SCREEN ; BILDSCHIRM LOESCHEN LDA #$00 TAX STA SCRN+V+$00,X STA SCRN+V+$0100,X STA SCRN+V+$0200,X STA SCRN+V+$0300,X INX BNE *-$0D ; SET UP SCREEN MATRIX ; BILDSCHIRMMATRIX BILDEN CLC LDA #XPOS+(YPOS*$28)+SCRN+V STA POINTERS+$01 LDX #$00 SETUPSCR TXA LDY #$00 STA (POINTERS+$00),Y ADC #$10 INY CPY #$10 BNE SETUPSCR+$03 LDA #$27 ADC POINTERS+$00 STA POINTERS+$00 BCC *+$04 INC POINTERS+$01 INX CPX #$10 BNE SETUPSCR ; INIT COLOURS ; FARBEN INITIALISIEREN LDA #BACKGNDC STA $D021 STA $D022 STA $D023 LDA #BACKGNDC.$08; MULTICOLOUR LDX #$00 STA $D800,X STA $D900,X STA $DA00,X STA $DB00,X INX BNE *-$0D STX CURRSCRN ; SET VIC REGISTERS ; VIC-REGISTER SETZEN BIT $D011 BPL *-$03 BIT $D011 BMI *-$03 LDA #%00011011 STA $D011 LDA #%00011000 STA $D016 LDA #SCRN/64.(CHARSET0/1024).1 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-$01 STA OLDVISIB,X DEX BPL *-$03 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) CMP #$80 ROR A ROR SINBUFL0 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) CMP #$80 ROR A TAX LDA SINBUFL1 ROR A CLC ADC SINBUFL0 STA SINBUFL1 TXA ADC SINBUFH0; - SIN(A) * SIN(B) STA SINBUFH1; * COS(G) 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) CMP #$80 ROR A ROR SINBUFL0 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) CMP #$80 ROR A TAX LDA SINBUFL1 ROR A CLC ADC SINBUFL0 STA SINBUFL1 TXA ADC SINBUFH0; COS(A) * SIN(B) STA SINBUFH1; * COS(G) 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) CMP #$80 ROR A ROR SINBUFL0 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) CMP #$80 ROR A TAX LDA SINBUFL1 ROR A CLC ADC SINBUFL0 STA SINBUFL1 TXA ADC SINBUFH0; SIN(A) * SIN(B) STA SINBUFH1; * SIN(G) 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) CMP #$80 ROR A ROR SINBUFL0 STA SINBUFH0 CLC LDA ALPHA ADC #$40+$80 ; (-COS) CLC 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) CMP #$80 ROR A TAX LDA SINBUFL1 LSR A CLC ADC SINBUFL0 STA SINBUFL1 TXA ADC SINBUFH0; - COS(A) * SIN(B) STA SINBUFH1; * SIN(G) 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 SEC 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) CLC LDA UNITXYLO ADC UNITXZLO TAX LDA UNITXYHI ADC UNITXZHI CPX UNITXXLO SBC UNITXXHI STA X2DCORDS+$00 CLC LDA UNITYYLO ADC UNITYZLO TAX LDA UNITYYHI ADC UNITYZHI CPX UNITYXLO SBC UNITYXHI STA Y2DCORDS+$00 CLC LDA UNITZYLO ADC UNITZZLO TAX LDA UNITZYHI ADC UNITZZHI CPX UNITZXLO SBC UNITZXHI STA Z2DCORDS+$00 ; P(+1;+1;+1) CLC LDA UNITXXLO ADC UNITXYLO TAX LDA UNITXXHI ADC UNITXYHI TAY CLC TXA ADC UNITXZLO 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 TYA ADC UNITZZHI STA Z2DCORDS+$01 ; P(-1;+1;-1) SEC LDA UNITXYLO SBC UNITXXLO TAX LDA UNITXYHI SBC UNITXXHI CPX UNITXZLO SBC UNITXZHI STA X2DCORDS+$02 SEC LDA UNITYYLO SBC UNITYXLO TAX LDA UNITYYHI SBC UNITYXHI CPX UNITYZLO SBC UNITYZHI STA Y2DCORDS+$02 SEC LDA UNITZYLO SBC UNITZXLO TAX LDA UNITZYHI SBC UNITZXHI CPX UNITZZLO SBC UNITZZHI STA Z2DCORDS+$02 ; P(+1;+1;-1) CLC LDA UNITXXLO ADC UNITXYLO TAX LDA UNITXXHI ADC UNITXYHI CPX UNITXZLO SBC UNITXZHI STA X2DCORDS+$03 CLC LDA UNITYXLO ADC UNITYYLO TAX LDA UNITYXHI ADC UNITYYHI CPX UNITYZLO SBC UNITYZHI STA Y2DCORDS+$03 CLC LDA UNITZXLO ADC UNITZYLO TAX LDA UNITZXHI ADC UNITZYHI CPX UNITZZLO SBC UNITZZHI STA Z2DCORDS+$03 ; P(-1;-1;+1) SEC LDA UNITXZLO SBC UNITXXLO TAX LDA UNITXZHI SBC UNITXXHI CPX UNITXYLO SBC UNITXYHI STA X2DCORDS+$04 SEC LDA UNITYZLO SBC UNITYXLO TAX LDA UNITYZHI SBC UNITYXHI CPX UNITYYLO SBC UNITYYHI STA Y2DCORDS+$04 SEC LDA UNITZZLO SBC UNITZXLO TAX LDA UNITZZHI SBC UNITZXHI CPX UNITZYLO SBC UNITZYHI STA Z2DCORDS+$04 ; P(+1;-1;+1) CLC LDA UNITXXLO ADC UNITXZLO TAX LDA UNITXXHI ADC UNITXZHI CPX UNITXYLO SBC UNITXYHI STA X2DCORDS+$05 CLC LDA UNITYXLO ADC UNITYZLO TAX LDA UNITYXHI ADC UNITYZHI CPX UNITYYLO SBC UNITYYHI STA Y2DCORDS+$05 CLC LDA UNITXZLO ADC UNITZZLO TAX LDA UNITZXHI ADC UNITZZHI CPX UNITZYLO SBC UNITZYHI 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 CPX UNITXZLO SBC UNITXZHI STA X2DCORDS+$06 SEC LDA #$00 SBC UNITYXLO TAX LDA #$00 SBC UNITYXHI TAY SEC TXA SBC UNITYYLO TAX TYA SBC UNITYYHI CPX UNITYZLO SBC UNITYZHI STA Y2DCORDS+$06 SEC LDA #$00 SBC UNITZXLO TAX LDA #$00 SBC UNITZXHI TAY SEC TXA SBC UNITZYLO TAX TYA SBC UNITZYHI CPX UNITZZLO SBC UNITZZHI STA Z2DCORDS+$06 ; P(+1;-1;-1) SEC LDA UNITXXLO SBC UNITXYLO TAX LDA UNITXXHI SBC UNITXYHI CPX UNITXZLO SBC UNITXZHI STA X2DCORDS+$07 SEC LDA UNITYXLO SBC UNITYYLO TAX LDA UNITYXHI SBC UNITYYHI CPX UNITYZLO SBC UNITYZHI STA Y2DCORDS+$07 SEC LDA UNITZXLO SBC UNITZYLO TAX LDA UNITZXHI SBC UNITZYHI CPX UNITZZLO SBC UNITZZHI STA Z2DCORDS+$07 ; STORE DEPTH OF THE ; FACE CENTROIDS ; TIEFE DER FLAECHEN- ; MITTELPUNKTE ABLEGEN ; P( 1; 0; 0) LDA UNITYXHI STA CNTDEPTH+$02 ; P(-1; 0; 0) CLC EOR #$FF ADC #$01 STA CNTDEPTH+$04 ; P( 0; 1; 0) LDA UNITYYHI STA CNTDEPTH+$00 ; P( 0;-1; 0) CLC EOR #$FF ADC #$01 STA CNTDEPTH+$05 ; P( 0; 0; 1) LDA UNITYZHI STA CNTDEPTH+$01 ; P( 0; 0;-1) CLC EOR #$FF ADC #$01 STA CNTDEPTH+$03 ; CONVERT COORDINATES TO 2-D ; KOORDINATEN NACH 2D WANDELN LDX #NUMPOINT-$01 CONVTO2D LDY Y2DCORDS,X LDA PERSPTAB,Y LDY X2DCORDS,X JSR PERSPMUL CLC ADC #$40 LSR A ; MULTICOLOUR STA X2DCORDS,X LDY Y2DCORDS,X LDA PERSPTAB,Y LDY Z2DCORDS,X JSR PERSPMUL CLC ADC #$40 STA Y2DCORDS,X DEX BPL CONVTO2D ; PERFORM BACKFACE CULLING ; BACKFACE CULLING VOLLFUEHREN LDA #%00000000 LDX #LINEPNT1-LINEPNT0-$01 STA VISIBLIN,X DEX BPL *-$03 LDX #FACEPNT1-FACEPNT0-$01 BACKCULL SEC LDY FACEPNT0,X; Z1 - Z2 LDA Y2DCORDS,Y LDY FACEPNT1,X SBC Y2DCORDS,Y PHA SEC LDY FACEPNT2,X; X3 - X2 LDA X2DCORDS,Y LDY FACEPNT1,X SBC X2DCORDS,Y TAY PLA JSR CULLMUL STA CULLBUFF+$00 STY CULLBUFF+$01 SEC LDY FACEPNT0,X; X1 - X2 LDA X2DCORDS,Y LDY FACEPNT1,X SBC X2DCORDS,Y PHA SEC LDY FACEPNT2,X; Z3 - Z2 LDA Y2DCORDS,Y LDY FACEPNT1,X SBC Y2DCORDS,Y TAY PLA JSR CULLMUL CPY CULLBUFF+$01; COMPARE SBC CULLBUFF+$00; FACTORS BPL NOTVISIB LDA FACECOLS,X LDY FACELIN0,X EOR VISIBLIN,Y STA VISIBLIN,Y LDA FACECOLS,X LDY FACELIN1,X EOR VISIBLIN,Y STA VISIBLIN,Y LDA FACECOLS,X LDY FACELIN2,X EOR VISIBLIN,Y STA VISIBLIN,Y LDA FACECOLS,X LDY FACELIN3,X EOR VISIBLIN,Y STA VISIBLIN,Y LDA FACECOLS,X; ASSIGN THE EOR #%00000011; DEPTH VALUES TAY ; TIEFENWERTE LDA CNTDEPTH,X; ZUWEISEN STA COLTABLE,Y NOTVISIB DEX BMI *+$05 JMP BACKCULL ; ERASE VECTOR OBJECT ; VEKTOROBJEKT LOESCHEN LDY #LINEPNT1-LINEPNT0-$01 ERASLOOP LDA OLDVISIB,Y BEQ DONTERAS STY POINTERS+$02 LDX LINEPNT0,Y LDA OLDXCRDS,X STA BEGX LDA OLDYCRDS,X STA BEGY LDX LINEPNT1,Y LDA OLDXCRDS,X LDY OLDYCRDS,X TAX JSR ERASLINE LDY POINTERS+$02 DONTERAS DEY BPL ERASLOOP ; DRAW VECTOR OBJECT ; VEKTOROBJEKT ZEICHNEN LDY #LINEPNT1-LINEPNT0-$01 DRAWLOOP LDA VISIBLIN,Y BEQ DONTDRAW PHA STY POINTERS+$02 LDX LINEPNT0,Y LDA X2DCORDS,X STA BEGX LDA Y2DCORDS,X STA BEGY LDX LINEPNT1,Y LDA X2DCORDS,X LDY Y2DCORDS,X TAX PLA JSR DRAWLINE LDY POINTERS+$02 DONTDRAW DEY BPL DRAWLOOP LDX #LINEPNT1-LINEPNT0-$01 PUTOLDVI LDA VISIBLIN,X STA OLDVISIB,X DEX BPL PUTOLDVI LDX #NUMPOINT-$01 PUTOLDCO LDA X2DCORDS,X STA OLDXCRDS,X LDA Y2DCORDS,X STA OLDYCRDS,X DEX BPL PUTOLDCO ; FILL THE OBJECT ; DAS OBJEKT FUELLEN LDX CURRSCRN LDA SCRNTABL+$01,X CMP $D018 BEQ *-$03 LDA #$30 STA $01 LDA #%11111111 DEX BPL *+$08 JSR FILSPID2 JMP POSTFILL DEX BPL *+$08 JSR FILSPID0 JMP POSTFILL JSR FILSPID1 POSTFILL LDA #$35 STA $01 ; SWITCH VISIBLE SCREEN ; SICHTBAREN BILDSCHIRM ; UMSCHALTEN LDX CURRSCRN INX CPX #$03 BNE *+$04 LDX #$00 STX CURRSCRN JMP MAINLOOP ; IRQ ROUTINE ; IRQ-ROUTINE IRQ PHA TXA PHA LDA $01 PHA LDA #$35 STA $01 ; UPDATE SCREEN AND COLOURS ; BILDSCHIRM UND FARBEN ; AKTUALISIEREN LDA #$00; SOME COLOUR INTERLACE EOR #$01; ETWAS FARBINTERLACE STA *-$03 LSR A LDX CURRSCRN LDA SCRNTABL,X STA $D018 LDX COLTABLE+$00 BCC *+$03 INX LDA BRIGHTAB-$B6,X STA $D021 LDX COLTABLE+$01 BCC *+$03 INX LDA BRIGHTAB-$B6,X STA $D022 LDX COLTABLE+$02 BCC *+$03 INX LDA BRIGHTAB-$B6,X STA $D023 ; 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 STA $01 PLA TAX PLA RTI ; PERFORM MULTIPLY, FULLY ; OPTIMIZED ; MULTIPLIKATION VOLLFUEHREN, ; VOLLKOMMEN OPTIMIERT PLA ZEROMUL LDA #$00 TAY RTS CULLMUL BEQ ZEROMUL+$02 PHA TYA BEQ ZEROMUL-$01 SEC LDY #$00 SBC #$01 BPL *+$07 EOR #$FF SBC #$01 INY STA MULTIZPG+$01 PLA BNE MULMAIN PERSPMUL SEC SBC #$01 BCC ZEROMUL+$00 STA MULTIZPG+$01 TYA BEQ ZEROMUL+$03 LDY #$00 MULMAIN CMP #$80 BCC *+$07 DEY SBC #$01 EOR #$FF LSR A STA MULTIZPG+$00 LDA #$00 BCC *+$04 ADC MULTIZPG+$01 ROR A ROR MULTIZPG+$00 BCC *+$04 ADC MULTIZPG+$01 ROR A ROR MULTIZPG+$00 BCC *+$04 ADC MULTIZPG+$01 ROR A ROR MULTIZPG+$00 BCC *+$04 ADC MULTIZPG+$01 ROR A ROR MULTIZPG+$00 BCC *+$04 ADC MULTIZPG+$01 ROR A ROR MULTIZPG+$00 BCC *+$04 ADC MULTIZPG+$01 ROR A ROR MULTIZPG+$00 BCC *+$04 ADC MULTIZPG+$01 ROR A ROR MULTIZPG+$00 BCC *+$04 ADC MULTIZPG+$01 ROR A ROR MULTIZPG+$00 CPY #$00 BNE *+$05 LDY MULTIZPG+$00 RTS STA MULTIZPG+$01 LDA #$00 SBC MULTIZPG+$00 TAY LDA #$00 SBC MULTIZPG+$01 RTS ; DRAW A LINE ; EINE LINIE ZEICHNEN DRAWLINE STA POINTERS+$00 STX ENDX STY ENDY CPX BEGX BEQ DRAWLINE-$01 BCS *+$0E; 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 BCS LINTYPE3 ; LINE ANGLES FROM -45 TO 0 ; DEGREES ; LINIENWINKEL VON -45 BIS 0 ; GRAD LINTYPE1 LDA #SPDT1OFS BCC PUTLINE 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 PUTLINE ; LINE ANGLES FROM +/-45 TO ; +/-90 DEGREES ; LINIENWINKEL VON +/-45 BIS ; +/-90 GRAD LINTYPE3 LDA #$00 PHA PUTLINE PHA LDX DELTAX LDY DELTAY BCC *+$06 LDX DELTAY LDY DELTAX SEC ;PERFORM DIVI- LDA LOG2TABL,X ; SION TO CALC- SBC LOG2TABL,Y ; ULATE THE STA CLCSLOPE+$01; LINE SLOPE LDA LOG2TBH0,X ;DIVISION VOLL- SBC LOG2TBH1,Y ; FUEHREN, UM STA CLCSLOPE+$02; DEN LINIEN- CLCSLOPE LDA !$00 ; ANSTIEG ZU STA LINSLOPL ; BERECHNEN CLC PLA TAY PLA LDX POINTERS+$00 ADC SPIDADRL-$01,X STA POINTERS+$00 TYA ADC SPIDADRH-$01,X STA POINTERS+$01 LDA DELTAY CMP DELTAX LDX BEGX BCS BIGSLOPE LDA POINTERS+$00 ; DETERMINE ADC SPDXOFSL+$40,X; JUMP-IN STA SPEEDJSR+$01 ; ADDRESS LDA POINTERS+$01 ; EINSPRUNG- ADC SPDXOFSH+$40,X; ADRESSE STA SPEEDJSR+$02 ; BESTIMMEN LDX ENDX DEX LDA SPDXOFSL+$40,X ADC POINTERS+$00 STA POINTERS+$00 LDA SPDXOFSH+$40,X JMP LINEDRAW BIGSLOPE LDY LINSLOPL ; DETERMINE LDA BEGY ; PERPENDI- CMP ENDY ; CULAR LDA RECIPTBL,Y ; SLOPE BCC *+$04 EOR #$FF ; SENKRECHTEN STA LINSLOPL ; ANSTIEG LDA RECIPTBH,Y ; BESTIMMEN BCC *+$04 EOR #$FF STA LINSLOPH CLC ; DETERMINE LDA POINTERS+$00 ; JUMP-IN ADC SPDXOFSL+$00,X; ADDRESS STA SPEEDJSR+$01 LDA POINTERS+$01 ; EINSPRUNG- ADC SPDXOFSH+$00,X; ADRESSE STA SPEEDJSR+$02 ; BESTIMMEN LDX ENDX DEX LDA SPDXOFSL+$00,X; DETERMINE ADC POINTERS+$00 ; RETURN STA POINTERS+$00 ; ADDRESS LDA SPDXOFSH+$00,X; RUECKKEHR- LINEDRAW ADC POINTERS+$01; ADRESSE STA POINTERS+$01; BESTIMMEN LDY #$08 LDA #$60; OP-CODE FOR RTS STA (POINTERS+$00),Y; OP-CODE ; FUER RTS LDX #$80 LDY BEGY SPEEDJSR JSR !$00; DRAW THE LINE ; DIE LINIE ZEICHNEN LDY #$08 LDA #$8A; OP-CODE FOR TXA STA (POINTERS+$00),Y; OP-CODE ; FUER TXA RTS ; ERASE A LINE ; EINE LINIE LOESCHEN ERASLINE STA POINTERS+$00 STX ENDX STY ENDY CPX BEGX BEQ ERASLINE-$01 BCS *+$0E; 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 ERSTYPE2 STA DELTAY CMP DELTAX BCS ERSTYPE3 ; LINE ANGLES FROM -45 TO 0 ; DEGREES ; LINIENWINKEL VON -45 BIS 0 ; GRAD ERSTYPE1 LDX #ERASPEED+$0340 BCC LINERASE ERSTYPE2 EOR #$FF ADC #$01 STA DELTAY CMP DELTAX BCS ERSTYPE3 ; LINE ANGLES FROM 0 TO 45 ; DEGREES ; LINIENWINKEL VON 0 BIS 45 ; GRAD LDX #ERASPEED+$0640 BCC LINERASE ; LINE ANGLES FROM +/-45 TO ; +/-90 DEGREES ; LINIENWINKEL VON +/-45 BIS ; +/-90 GRAD ERSTYPE3 LDX #ERASPEED+$00 LINERASE STX POINTERS+$00 STY POINTERS+$01 LDX DELTAX LDY DELTAY BCC *+$06 LDX DELTAY LDY DELTAX SEC ;PERFORM DIVI- LDA LOG2TABL,X ; SION TO CALC- SBC LOG2TABL,Y ; ULATE THE STA ERASLOPE+$01; LINE SLOPE LDA LOG2TBH0,X ;DIVISION VOLL- SBC LOG2TBH1,Y ; FUEHREN, UM STA ERASLOPE+$02; DEN LINIEN- ERASLOPE LDA !$00 ; ANSTIEG ZU STA LINSLOPL ; BERECHNEN LDA DELTAY CMP DELTAX LDX BEGX BCS ERSBIGSL LDA POINTERS+$00 ; DETERMINE ADC SPDXOFSL+$C0,X; JUMP-IN STA ERASEJSR+$01 ; ADDRESS LDA POINTERS+$01 ; EINSPRUNG- ADC SPDXOFSH+$C0,X; ADRESSE STA ERASEJSR+$02 ; BESTIMMEN LDX ENDX DEX LDA SPDXOFSL+$C0,X ADC POINTERS+$00 STA POINTERS+$00 LDA SPDXOFSH+$C0,X JMP LINEERAS ERSBIGSL LDY LINSLOPL ; DETERMINE LDA BEGY ; PERPENDI- CMP ENDY ; CULAR LDA RECIPTBL,Y ; SLOPE BCC *+$04 EOR #$FF ; SENKRECHTEN STA LINSLOPL ; ANSTIEG LDA RECIPTBH,Y ; BESTIMMEN BCC *+$04 EOR #$FF STA LINSLOPH CLC ; DETERMINE LDA POINTERS+$00 ; JUMP-IN ADC SPDXOFSL+$80,X; ADDRESS STA ERASEJSR+$01 LDA POINTERS+$01 ; EINSPRUNG- ADC SPDXOFSH+$80,X; ADRESSE STA ERASEJSR+$02 ; BESTIMMEN LDX ENDX DEX LDA SPDXOFSL+$80,X; DETERMINE ADC POINTERS+$00 ; RETURN STA POINTERS+$00 ; ADDRESS LDA SPDXOFSH+$80,X; RUECKKEHR- LINEERAS ADC POINTERS+$01; ADRESSE STA POINTERS+$01; BESTIMMEN LDY #$05 LDA #$60; OP-CODE FOR RTS STA (POINTERS+$00),Y; OP-CODE ; FUER RTS LDX #$80 LDY BEGY ERASEJSR JSR !$00; DRAW THE LINE ; DIE LINIE ZEICHNEN LDY #$05 LDA #$8A; OP-CODE FOR TXA STA (POINTERS+$00),Y; OP-CODE ; FUER TXA RTS MKXOFSTB CLC STA POINTERS+$00 TXA ADC #$40 STA POINTERS+$01 LDA #$00 TAY MKXOFSLP STA SPDXOFSL+$00,X PHA TYA STA SPDXOFSH+$00,X PLA CLC ADC POINTERS+$00 BCC *+$03 INY INX CPX POINTERS+$01 BNE MKXOFSLP RTS ; SUBROUTINE TO BUILD ; THE LINE SPEEDCODE ; UNTERROUTINE ZUM GENERIEREN ; DES LINIENSPEEDCODES MAKLINSP CLC STA SPIDRAW0+$01 STA SPIDRAW1+$01 STX POINTERS+$02 STY POINTERS+$03 LDA #>FILLBUFF STA POINTERS+$04 LDA POINTERS+$02 STA POINTERS+$00 LDA POINTERS+$03 STA POINTERS+$01 LDA POINTERS+$04 STA SPIDRAW0+$04 STA SPIDRAW0+$07 LDX #$40; 64 PIXELS WIDTH ; 64 PIXEL BREITE MKSPT0LP LDY #SPIDRAW1-SPIDRAW0-$01 LDA SPIDRAW0,Y STA (POINTERS+$00),Y DEY BPL MKSPT0LP+$02 LDA #SPIDRAW1-SPIDRAW0 LDY #SPIDRAW0-SPIDRAW0 JSR NEXTLINE BNE MKSPT0LP+$00 LDA #$88; OP-CODE FOR DEY ; OP-CODE FUER DEY LDX #SPDT1OFS JSR MKSPT1SB LDA #$C8; OP-CODE FOR INY ; OP-CODE FUER INY LDX #SPDT2OFS MKSPT1SB CLC STA SPRW1DIR TXA ADC POINTERS+$02 STA POINTERS+$00 TYA ADC POINTERS+$03 STA POINTERS+$01 LDA POINTERS+$04 STA SPIDRAW1+$04 STA SPIDRAW1+$07 LDX #$40; 64 PIXELS WIDTH ; 64 PIXEL BREITE MKSPT1LP LDY #SPIDRAWE-SPIDRAW1-$01 LDA SPIDRAW1,Y STA (POINTERS+$00),Y DEY BPL MKSPT1LP+$02 LDA #SPIDRAWE-SPIDRAW1 LDY #SPIDRAW1-SPIDRAW0 JSR NEXTLINE BNE MKSPT1LP+$00 RTS NEXTLINE CLC ADC POINTERS+$00 STA POINTERS+$00 BCC *+$04 INC POINTERS+$01 LDA SPIDRAW0+$01,Y PHA LSR A PLA ROR A PHA LSR A PLA ROR A STA SPIDRAW0+$01,Y CMP #%01000000 BCC NXTSPRET LDA #$7F; 1 CHAR COLUMN IS 128 ; (16X8) BYTES ; 1 ZEICHENSPALTE SIND ; 128 (16*8) BYTES ADC SPIDRAW0+$03,Y STA SPIDRAW0+$03,Y STA SPIDRAW0+$06,Y LDA #$00 ADC SPIDRAW0+$04,Y STA SPIDRAW0+$04,Y STA SPIDRAW0+$07,Y NXTSPRET DEX RTS MKERS1SB CLC STA ERSRWDIR STX POINTERS+$00 STY POINTERS+$01 LDA POINTERS+$04 STA ERASRAW1+$04 LDX #$40; 64 PIXELS WIDTH ; 64 PIXEL BREITE MKERS1LP LDY #ERASRAWE-ERASRAW1-$01 LDA ERASRAW1,Y STA (POINTERS+$00),Y DEY BPL MKERS1LP+$02 LDA #ERASRAWE-ERASRAW1 LDY #ERASRAW1-ERASRAW0 JSR NEXTERAS BNE MKERS1LP+$00 RTS NEXTERAS CLC ADC POINTERS+$00 STA POINTERS+$00 BCC *+$04 INC POINTERS+$01 DEC POINTERS+$05 BNE NXTERSRT CLC LDA #$80; 1 CHAR COLUMN IS 128 ; (16X8) BYTES ; 1 ZEICHENSPALTE SIND ; 128 (16*8) BYTES ADC ERASRAW0+$03,Y STA ERASRAW0+$03,Y LDA #$00 ADC ERASRAW0+$04,Y STA ERASRAW0+$04,Y LDA #$04 STA POINTERS+$05 NXTERSRT DEX RTS ; SUBROUTINE TO BUILD ; THE FILL SPEEDCODE ; UNTERROUTINE ZUM GENERIEREN ; DES FUELLSPEEDCODES MKFILSPD STA POINTERS+$04 STX POINTERS+$00 STY POINTERS+$01 LDA #FILLBUFF STA POINTERS+$03 LDX #$00 MKFILUP0 SEC LDA SPIDYBEG,X ORA POINTERS+$02 STA POINTERS+$02 ORA #$7F SBC SPIDYBEG,X STA POINTERS+$05 MKFILUP1 LDY #$00 LDA #$4D ; OP-CODE EOR ABS STA (POINTERS+$00),Y INY LDA POINTERS+$02 STA (POINTERS+$00),Y INY LDA POINTERS+$03 STA (POINTERS+$00),Y INY LDA #$8D ; OP-CODE STA ABS STA (POINTERS+$00),Y INY LDA POINTERS+$02 STA (POINTERS+$00),Y INY LDA POINTERS+$04 STA (POINTERS+$00),Y INY CLC TYA ADC POINTERS+$00 STA POINTERS+$00 BCC *+$04 INC POINTERS+$01 LDA POINTERS+$02 INC POINTERS+$02 CMP POINTERS+$05 BNE MKFILUP1 AND #%10000000 ADC #$80 STA POINTERS+$02 BCC *+$06 INC POINTERS+$03 INC POINTERS+$04 INX CPX #$10 ; 16 CHAR COLUMNS ; 16 ZEICHENSPALTEN BNE MKFILUP0 LDY #$00 LDA #$60 STA (POINTERS+$00),Y RTS ; SPEEDCODE ELEMENT FOR A ; SLOPE ANGLE OF +/-90 TO   ; +/-45 DEGREES ; SPEEDCODEELEMENT FUER EINEN ; STEIGUNGSWINKEL VON +/-90 ; BIS +/-45 GRAD SPIDRAW0 LDA #$00 EOR !$00,Y STA !$00,Y TXA ADC LINSLOPL TAX TYA ADC LINSLOPH TAY ; SPEEDCODE ELEMENT FOR A ; SLOPE ANGLE OF +/-45 TO 0 ; DEGREES ; SPEEDCODEELEMENT FUER EINEN ; STEIGUNGSWINKEL VON +/-45 ; BIS 0 GRAD SPIDRAW1 LDA #$00 EOR !$00,Y STA !$00,Y TXA ADC LINSLOPL TAX BCC *+$03 SPRW1DIR .BYTE $00 SPIDRAWE ; SPEEDCODE ELEMENT FOR A ; SLOPE ANGLE OF +/-90 TO   ; +/-45 DEGREES ; SPEEDCODEELEMENT FUER EINEN ; STEIGUNGSWINKEL VON +/-90 ; BIS +/-45 GRAD ERASRAW0 LDA #$00 STA !$00,Y TXA ADC LINSLOPL TAX TYA ADC LINSLOPH TAY ; SPEEDCODE ELEMENT FOR A ; SLOPE ANGLE OF +/-45 TO 0 ; DEGREES ; SPEEDCODEELEMENT FUER EINEN ; STEIGUNGSWINKEL VON +/-45 ; BIS 0 GRAD ERASRAW1 LDA #$00 STA !$00,Y TXA ADC LINSLOPL TAX BCC *+$03 ERSRWDIR .BYTE $00 ERASRAWE ; TABLE OF THE Y START POINTS ; OF THE SPEED CODE ; TABELLE DER Y-STARTPUNKTE ; DES FUELLSPEEDCODES SPIDYBEG .BYTE $25,$17,$0F,$09,$05,$03 .BYTE $01,$00,$00,$01,$03,$05 .BYTE $09,$0F,$17,$25 SCRNTABL .BYTE SCRN/64.(CHARSET0/1024).1 .BYTE SCRN/64.(CHARSET1/1024).1 .BYTE SCRN/64.(CHARSET2/1024).1 .BYTE SCRN/64.(CHARSET0/1024).1 ; TABLE OF THE FACE VERTICES ; FOR THE BACKFACE CULLING ; TABELLE DER SEITENECKPUNKTE ; FUER DAS BACKFACE CULLING FACEPNT0 .BYTE $00,$00,$01,$02,$00,$04 FACEPNT1 .BYTE $01,$04,$05,$03,$02,$06 FACEPNT2 .BYTE $03,$01,$03,$06,$04,$05 ; TABLE OF THE FACE COLOURS ; TABELLE DER SEITENFARBEN FACECOLS .BYTE $01,$02,$03,$02,$03,$01 ; TABLE OF THE FACE LINES ; TABELLE DER SEITENLINIEN FACELIN0 .BYTE $00,$00,$01,$02,$03,$08 FACELIN1 .BYTE $01,$04,$05,$06,$04,$09 FACELIN2 .BYTE $02,$05,$07,$07,$06,$0A FACELIN3 .BYTE $03,$08,$09,$0A,$0B,$0B ; TABLE OF THE LINE BEGIN ; AND END POINTS ; TABELLE DER LINIENANFANGS- ; UND ENDPUNKTE LINEPNT0 .BYTE $00,$01,$03,$02,$00,$01 .BYTE $02,$03,$04,$05,$07,$06 LINEPNT1 .BYTE $01,$03,$02,$00,$04,$05 .BYTE $06,$07,$05,$07,$06,$04 ; TABLE OF SPEED CODE ADDRESSES ; TABELLE DER SPEEDCODEADRESSEN SPIDADRL .BYTE SPIDCOD0,>SPIDCOD1 .BYTE >SPIDCOD2 ; COLOUR TABLE FOR THE SHADING ; FARBTABELLE FUER DAS SHADING BRIGHTAB .BYTE $01,$01,$01,$01,$0D,$0D .BYTE $0D,$0D,$07,$07,$07,$07 .BYTE $03,$03,$03,$03,$0F,$0F .BYTE $0F,$0F,$05,$05,$05,$05 .BYTE $0A,$0A,$0A,$0A,$0E,$0E .BYTE $0E,$0E,$0C,$0C,$0C,$0C .BYTE $04,$04,$04,$04,$08,$08 .BYTE $08,$08,$0B,$0B,$0B,$0B .BYTE $02,$02,$02,$02,$09,$09 .BYTE $09,$09,$00,$00,$00,$00 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 *-$0A 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 *-$07 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