home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Go64!
/
Go64_2002-04_2002_CSW_Side_A.d64
/
rotwireframe.txt
< prev
next >
Wrap
Text File
|
2023-02-26
|
39KB
|
1,808 lines
; 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 $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 #$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 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
dec endy
lsr a
eor #$ff
tax
lda #<spdt0ofs
ldy #>spdt0ofs
jmp putline0
lintype1 lda deltax
lsr a
eor #$ff
tax
lda #<spdt1ofs
ldy #>spdt1ofs
jmp putline0
lintype2 eor #$ff
adc #$01
sta deltay
cmp deltax
bcs lintype3
lda deltax
lsr a
eor #$ff
tax
lda #<spdt2ofs
ldy #>spdt2ofs
jmp putline0
lintype3 inc endy
lsr a
eor #$ff
tax
lda #<spdt3ofs
ldy #>spdt3ofs
putline0 clc
pha
lda currchar
beq drwlnch1
pla
adc #<spidcod0
sta pointers+0
tya
adc #>spidcod0
sta pointers+1
bne putline1
drwlnch1 pla
adc #<spidcod1
sta pointers+0
tya
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
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+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