home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Go64!
/
Go64_2002-06_2002_CSW_Side_A.d64
/
rotlinwslope.txt
< prev
next >
Wrap
Text File
|
2023-02-26
|
36KB
|
1,755 lines
; 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 $fffa
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+2
lda #>spidcod0
sta pointers+3
lda #>charset0+v
sta pointers+4
jsr makspeed
lda #<spidcod1
sta pointers+2
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 #<charset0+v
sta pointers+0
sta pointers+2
ldx #$08
tay
clearchr sta (pointers+0),y
sta (pointers+2),y
iny
bne clearchr
inc pointers+1
inc pointers+3
dex
bne clearchr
; clear screen
; bildschirm loeschen
lda #$00
tax
sta screen+v+$00,x
sta screen+v+$0100,x
sta screen+v+$0200,x
sta screen+v+$0300,x
inx
bne *-13
; set up screen matrix
; bildschirmmatrix bilden
clc
lda #<xpos+(ypos*$28)+screen+v
sta pointers+0
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 $fffe
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 alphalo
sta alphalo
lda #>alphaadd
adc alphahi
sta alphahi
clc
lda #<betaadd
adc betalo
sta betalo
lda #>betaadd
adc betahi
sta betahi
clc
lda #<gammaadd
adc gammalo
sta gammalo
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
pha
lda #>spdt0ofs
bcs putline0
; line angles from -45 to 0
; degrees
; linienwinkel von -45 bis 0
; grad
lintype1 lda #<spdt1ofs
pha
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
pha
lda #>spdt2ofs
bcc putline0
; line angles from 45 to 90
; degrees
; linienwinkel von 45 bis 90
; grad
lintype3 inc endy
lda #<spdt3ofs
pha
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+0
tya
adc #>spidcod0
sta pointers+1
bne putline2
drwlnch1 pla
adc #<spidcod1
sta pointers+0
tya
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
ldx #>spdt0ofs
jsr mkspt0sb
lda #<spdt1ofs
ldx #>spdt1ofs
jsr mkspt1sb
lda #$c8; op-code for iny
; op-code fuer iny
sta sprw0dir
sta sprw1dir
lda #<spdt2ofs
ldx #>spdt2ofs
jsr mkspt1sb
lda #<spdt3ofs
ldx #>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