home *** CD-ROM | disk | FTP | other *** search
Text File | 2004-01-01 | 35.1 KB | 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
-
-