home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
64'er 1994 March
/
64er_Magazin_94-03_1994_Markt__Technik_de_Side_B.d64
/
spritedemo.asc
< prev
next >
Wrap
Text File
|
2022-10-26
|
23KB
|
913 lines
;---------------------------------------
; sprite mover
;---------------------------------------
; (w) in 1991 by ingo kusch
; simonstr.9
; 4700 hamm 3
; tel:02381/464619
;---------------------------------------
; bereich : -x- : 456-480
; ------- (480-456) clr !!!!
; -y- : 40-240
;---------------------------------------
;abkuerzungen:
; 'sr' - sprite routine
; (move-programm)
; 'sd' - sprite darstellung
; (sichtbarmachen der beerechneten
; sprites mit first & next)
; zw.sp. - zwischen speicher
; s.o. - siehe oben
; s.u. - siehe unten
; clr - clear = loeschen
; spr - sprite
; adr - adresse
; tab - tabelle
; trk - track
; nr - nummer
; ? - bedingungen/abfragen
; ! - befehle/anweisungen
;---------------------------------------
;--- sprite tabellen
base = $4000
inittb = base
xpos = base+30 ;position x
ypos = base+60 ; " y
block = base+90 ;block nr
control = base+120 ;on/msb/color
deltax = base+150 ;bewegung -x-
deltay = base+180 ; " -y-
delay = base+210 ;countdown
sinxhi = base+240 ;sinus -x-
sinxlo = base+270
sinx1 = base+300
sinx2 = base+330
sinx3 = base+360
sinyhi = base+390 ;sinus -y-
sinylo = base+420
siny1 = base+450
siny2 = base+480
siny3 = base+520
anitb = base+570 ;animation
anico = base+600
anitco = base+630
speclo = base+660 ;special-prgs
spechi = base+690
trklo = base+720 ;track count
trkhi = base+750
trkpo = base+780
acctx = base+810 ;beschleunigung-x-
accty = base+840 ; " -y-
acct1 = base+870 ; " -zeit -x-
acct2 = base+900 ; " " -y-
zwisch = base+930 ;beeliebig
zwisch2 = base+960 ;nutzbar
zwisch3 = base+990 ; "
zwisch4 = base+1020 ; "
xpos2 = base+1050 ;fuer 'sd'
ypos2 = base+1080 ;notwendige
control2 = base+1110 ;zwischen tabs
block2 = base+1140
ytab = base+$0500 ;sortier tab 1
srtab = ytab+100 ; " " 2
srtab2 = ytab+130 ; zw.sp. 'sd'
spfree = ytab+160 ;sortier tab 3
;--- zeropage adressen
adr = $02
madr = $04
mre = $06
xwert = $08
ywert = $09
cntr = $0a
ireg = $0b
fspr = $0c
spr = $0d
spr2 = $0e
spr3 = $0f
zwr = $10
zwr2 = $11
mzwr = $12
mzwr2 = $13
by = $14
my = $15
sy = $16
time = $17 ;'uhr'
spr21 = $1a
spr31 = $1b
;--- makros
setirq .macro ;setzt irq
lda #<\1
sta $fffe
lda #>\1
sta $ffff
.endm
free .macro ;gibt irq frei
asl $d019
cli
.endm
;--- main part
*= $0810
jmp init ;s.u.
;---------------------------------------
;* achtung ! die folgende routine wird
; von den irq-programmen first & next
; angesprungen ! sie steht hier vorn,
; damit sie einige taktzyklen schneller
; (branches nur in gleiche page usw...)
;---------------------------------------
set dec spr21 ;bringt die
bmi st3 ;sprs auf
ldx spr21 ;den screen ...
ldy srtab2,x
lda control2,y ;farbe
bpl set ;noch an ?!?!
ldx spr
sta $d027,x
asl a ;msb holen
asl a
lda $d010
and tabb,x
bcc st10 ;msb - setzen
ora tabc,x
st10 sta $d010
lda block2,y ;block-nummer
st4 sta $07f8,x
txa
asl a
tax
lda xpos2,y ;x-position
sta $d000,x
lda ypos2,y ;y-position
sta $d001,x
lda spr ;next spr
adc #$01
and #$07
sta spr
rts
tabb .byte $fe,$fd,$fb,$f7
.byte $ef,$df,$bf,$7f
tabc .byte $01,$02,$04,$08
.byte $10,$20,$40,$80
st3 pla ;keine sprs
pla ;mehr
#setirq (first) ;irq an den
lda $d011 ; anfang
and #$7f ;raster
sta $d011 ; refresh
lda #10
sta $d012
lda spr31
cmp #$08 ;zurueck nach:
bcs st31
jmp f3 ;first ?!?
st31 jmp n3 ;oder next ??
;---------------------------------------
;* eigentlicher programm beginn
;---------------------------------------
init sei
lda #$05 ;rom aus
sta $01
lda #$00
sta $d020 ;background
sta $d021 ; colors
sta $dc0e ;zeit irqs
sta $dc0d ;sperren
tax
ii1 lda #$00
sta base,x ;register
sta base+$0100,x ;zurueck-
sta base+$0200,x ; setzen
sta base+$0300,x
sta base+$0400,x
sta base+$0500,x
lda #$20
sta $0400,x ;bildschirm
sta $0500,x ;clr !
sta $0600,x
sta $0700,x
dex
bne ii1
ldx #30 ;dito
lda #$00
ii2 sta $02,x ;zeropage
dex
bpl ii2
lda #$ff ;multicolor
sta $d01c ;on
lda #$06 ;spr
sta $d025 ; farben
lda #$01 ;setzen
sta $d026
start lda #<nmi ;nmis
ldx #>nmi ;auffangen
sta $fffa
stx $fffb
#setirq (first) ;raster-irq
lda $d011 ; init...
and #$7f ;raster msb
sta $d011 ;clr
lda #20 ;rasterzeile
sta $d012 ;setzen
lda #$81 ;rasterirq
sta $d01a ; maskieren
cli ;freigabe
wait jsr minit ;spr init
jsr timer ;hier platz fuer
jmp wait ;check-routinen
;timer-routinen
;usw. ausserhalb
;des irq !
;---------------------------------------
;* stellt die ersten acht sprites dar
;---------------------------------------
first sta a1+1 ;register
stx x1+1 ; retten
sty y1+1
inc by ;zeittakt
lda by
and #$3f ;circa jeden
bne i1 ; 64. screen
lda time ; einmal
clc ; time-counter
adc #1 ; erhoehen !
sta time
bcc i1
inc time+1
i1
lda spr2 ;hier werden die
sta spr21 ;von der 'sr'
lda spr3 ;bearbeiteten
sta spr31 ;register in
ldx #30 ;die fuer 'sd'
in2 lda xpos,x ;notwendigen
sta xpos2,x ;copiert.
lda ypos,x
sta ypos2,x ;dadurch kann
lda control,x ;die berechnung
sta control2,x ;'sr' (fuer den
lda block,x ;naechsten
sta block2,x ;durchlauf)
lda srtab,x ;parallel mit
sta srtab2,x ;'sd' ablaufen,
dex ;ohne dass beide
bpl in2 ;sich stoeren !
lda #$00 ;spr ein!
sta spr
ldx spr31
f5 cpx #$09 ;mehr als 8 ?
bcc f4
ldx #$08 ;dann: alle an!
f4 lda tabd,x ;sonst: evtl.
sta $d015 ; weniger!
jsr set ;die obersten 8
jsr set ;spr darstellen!
jsr set
jsr set
jsr set
jsr set
jsr set
jsr set
lda $d001 ;untere kante
adc #21 ;des naechsten
sta $d012 ;sprs neuer
#setirq (next) ;raster-init !
f3 #free ;irq frei
jsr move ;'sr'
lda #$00
sta $d020
a1 lda #$00 ;register
x1 ldx #$00 ; retten
y1 ldy #$00
nmi rti
;---------------------------------------
;* stellt die weiteren sprites dar !
;---------------------------------------
next sta a2+1 ;s.o.
stx x2+1
sty y2+1
n2 jsr set ;'sd'
asl a ;noch genug ras-
tax ;ter zeit bis
lda $d001,x ;zum naechsten
adc #21 ;spr, um noch
sta zwr ;einen irq aus-
ldx $d012 ;zuloesen ???
inx
cpx zwr
bcs n2 ;nein : n2
sta $d012 ;ja !
n3
a2 lda #$00 ;s.o.
x2 ldx #$00
y2 ldy #$00
#free
rti
;---------------------------------------
;* eigentliche sprite-routine 'sr'
;---------------------------------syntax
;zur bewegung & darstellung der sprites!
; {CBM-T}{CBM-T}{CBM-T}{CBM-T}{CBM-T}{CBM-T}{CBM-T}{CBM-T}{CBM-T}{CBM-T}{CBM-T}{CBM-T}{CBM-T}{CBM-T}{CBM-T}{CBM-T}{CBM-T}{CBM-T}{CBM-T}{CBM-T}{CBM-T}{CBM-T}
; {CBM-A}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{CBM-S}
; xxxx xxxx {SHIFT--}control-byte{SHIFT--}
; {SHIFT--}{SHIFT--}{SHIFT--}{SHIFT--} {CBM-Z}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}sprite farbe {CBM-Z}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{CBM-X}
; {SHIFT--}{SHIFT--}{SHIFT--}{CBM-Z}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}1st/2nd nibble (sinus)
; {SHIFT--}{SHIFT--}{CBM-Z}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}explosion on/off
; {SHIFT--}{CBM-Z}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}msb
; {CBM-Z}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}sprite on/off
;---------------------------------------
move lda my ;fuer x/y
eor #$80 ;bewegung :
sta my ;up/down half
;(s.u.)
ldx #30
mo2 lda control,x
bpl yr5 ;spr an ?
;ja !
lda #$00 ;zwischenwerte
sta xwert ;losechen
sta ywert
an5 lda anitb,x ;animation ?
bne an51
jmp xs ;nein : s.u.
an51 asl a ;ja:ausfuehren
dec anitco,x
bpl an21 ;next step ?
tay ;ja !
lda anitab+2,y ;wartezeit
sta anitco,x ; restaurieren
lda anitab,y ;adr
sta adr ;holen
lda anitab+1,y
sta adr+1
ldy anico,x ;stepnummer
an3 lda (adr),y ;block holen
bne an2 ;block ok ?
sta anico,x ;nein:
tay ;animation von
bcc an3 ;vorne ?
lda anitb,x ;nicht nochmal!
and #$3f ;explosion ?
beq an8 ;ja : clr
an41 inc inittb,x ;nein:next init
lda #$00 ;anim. fertig
sta anitb,x
an4 lda control,x
asl a
bpl an42 ;msb ?
lda xpos,x ;ja :
cmp #160 ; spr clr ?
bcc an42 ; nein
cmp #200
bcs an42 ; nein
bcc an8 ;ja!
an42 lda ypos,x ; sortiert spr.
lsr a ; in ytab ein
lsr a
cmp #10 ;spr clr ?
bcc an8 ; ja
cmp #60
bcs an8 ; ja
tay ;nein
yr4 lda ytab,y
beq yr3 ;platz besetzt?
iny ; ja:next place
cpy #60
bcc yr4 ; end of tab?
bcs yr5 ; ja: next spr
yr3 txa
sta ytab,y ; einsortieren
bne yr5
an8 lda #$00 ; spr clr!
sta control,x
yr5 dex ; next spr
beq yr51 ; all ready ?
jmp mo2 ; no
yr51 jmp sort ; all ready !!
an2 sta block,x ; new block
inc anico,x ; step forward
an21 bcc xs ; explosion ?
ldy #0 ; vielleicht
lda anitb,x
and #$3f
bne xs ; explosion ?
jmp setxy ; ja!
xs lda control,x ; weiter :
eor #$10 ; first/sec.
sta control,x ; halfbyte
asl a
asl a
asl a
sta sy ; sichern
lda sinxhi,x ; sinus in
beq ys ; x-richtung ?
sta adr+1 ; ja:adr
lda sinxlo,x ; holen
sta adr
ldy sinx1,x
lda (adr),y ; wert holen
bit sy ; 1st/2nd
bmi xs2 ; halfbyte ?
lsr a ; first
lsr a
lsr a
lsr a
xs2 and #$0f ; second
tay
lda deltb,y ; aus tab holen
sta xwert ; ablegen
bit sy ; bereits next
bpl ys ; byte ???
lda sinx1,x ; ja!
clc ; step forward
adc #1
cmp sinx2,x
bcc xs1 ;ende erreicht?
lda sinx3,x ; ja:restart
xs1 sta sinx1,x ; nein:store
ys lda sinyhi,x ; sinus in
beq del ; y-richtung ?
sta adr+1 ; ja :adr
lda sinylo,x ; holen
sta adr
ldy siny1,x
lda (adr),y ; dito
bit sy ; alles analog
bmi ys2 ; zu -xs-
lsr a
lsr a
lsr a
lsr a
ys2 and #$0f
tay
lda deltb,y
sta ywert
bit sy
bpl del
lda siny1,x
clc
adc #1
cmp siny2,x
bcc ys1
lda siny3,x
ys1 sta siny1,x
del lda delay,x ; countdown ?
beq acx
dec delay,x ; ja:ausfuehren
bne acx ; null ?
inc inittb,x ; ja:next init
acx lda acctx,x ;beschleunigung x?
beq dx
dec acct1,x ;ja:wert schon
bpl ac1 ; aendern ?
lda acctx,x ;ja: zeit
sta acct1,x ; restaurieren
lda deltax,x ;tab-wert holen
and #$f0
sta zwr2 ;ziel retten
lsr a
lsr a
lsr a
lsr a
sta zwr ;ziel wert
lda deltax,x
and #$0f ;moment wert
cmp zwr ;ziel
bne ac5 ; erreicht?
lda #$00 ; ja : acc-
sta acctx,x ; ende !
beq acy
ac5 bcc ac3 ;ziel annaehren
sbc #1
bpl ac4
ac3 adc #1
ac4 ora zwr2 ;tab wert
sta deltax,x ; zurueck !
bne dx1
ac1 lda deltax,x ;bewegung aus-
bne dx1 ; fuehren !
dx lda deltax,x ; x -
beq dy ; bewegung ??
bit my ; ja
bpl dx1 ; 1st/2nd half?
lsr a ;1st
lsr a
lsr a
lsr a
dx1 and #$0f ;2nd
tay
lda deltb,y ; s.o.
clc
adc xwert ;ablegen
sta xwert
acy lda accty,x ;beschleunigung y?
beq dy
dec acct2,x ;ja: weiter
bpl ac11 ;analog -acx-
lda accty,x
sta acct2,x
lda deltay,x
and #$f0
sta zwr2
lsr a
lsr a
lsr a
lsr a
sta zwr
lda deltay,x
and #$0f
cmp zwr
bne ac6
lda #$00
sta accty,x
beq spc
ac6 bcc ac7
sbc #1
bpl ac8
ac7 adc #1
ac8 ora zwr2
sta deltay,x
bne dy1
ac11 lda deltay,x
bne dy1
dy lda deltay,x ; y bewegung ?
beq spc
bit my ; analog -dx- !
bpl dy1
lsr a
lsr a
lsr a
lsr a
dy1 and #$0f
tay
lda deltb,y
clc
adc ywert
sta ywert
spc lda spechi,x ;special prg ?!
beq setxy
sta sp1+2 ;ja! adr
lda speclo,x ; holen
sta sp1+1
stx sp1+4 ;spr-nr retten
sp1 jsr $ffff ;ins zusatz-prg
ldx #0 ;spr-nr retten
setxy lda xwert ;neue spr-pos.
beq sx5 ;berechnen !
clc
adc xpos,x ;x-pos
sta xpos,x
bit xwert
bpl sx3 ;xwert neg?
bcc sx3+2 ;add.ueberlauf?
bcs sx5 ;ja/nein?
sx3 bcc sx5
lda control,x ;mit msb !
eor #$40
sta control,x
sx5 lda ywert
beq sx4
clc
adc ypos,x ;y-pos
sta ypos,x ; und fertig!
sx4 jmp an4 ;einsortieren !
;---------------------------------------
;* abschliessender sortier - algorithmus
;---------------------------------------
sort ldy #0
ldx #60
an7 lda ytab,x ;tab search
beq an6 ;spr gefunden?
sta srtab,y ;ja:einsortieren!
lda #0
sta ytab,x ;wert clr!
iny ;next
an6 dex ;ganzen bereich
cpx #10 ;durchsuchen!
bcs an7
lda #$ff ;ende der tab
sta srtab,y ;markieren
sty spr2 ;spr-anzahl
sty spr3 ;retten
fs7 dey ;ueberprueft
beq try ;nochmals die
ldx srtab,y ;reihenfolge
lda ypos,x ;der sprites
ldx srtab-1,y ;mittels der
cmp ypos,x ;jeweiligen
bcc fs7 ;(echten) ypos
lda srtab,y ;& sortiert um
sta srtab-1,y ;(falls noetig)
txa
sta srtab,y
bne fs7
try ldy #0 ;fertigt eine
ldx #30 ;tabelle der
fs2 lda control,x ;freien spr
bmi fs1 ;an ...
lda inittb,x
beq fs3 ;wird von
bpl fs1 ;getspr genutzt
cmp #$ff
bne fs1
lda #$00
sta inittb,x
beq fs1
fs3 txa
sta spfree,y
iny
fs1 dex
bne fs2
dey
sty fspr ;ende des move
rts ;programms
;---------------------------------------
;* initialisiert alle sprites mittels
; track-tabelle !
;---------------------------------------
minit ldx #30
mi17 lda inittb,x
beq mi1 ;init ?
cmp #$ff ;vielleicht ?
beq mi1
bmi mi16 ;ja:explosion
ldy control,x ;ja:normal
sty cntr
bmi mi2 ;spr on?
asl a ;nein
tay
lda trktab,y ;track adr
sta trklo,x ; holen
sta madr
lda trktab+1,y
sta trkhi,x
sta madr+1
jsr clr ;alte wert clr
ldy #0
lda (madr),y ;position
beq mi15 ; gegeben ?
asl a ;ja !
sta xpos,x ; x-pos &
ror a
lsr a
and #$40
sta cntr ; msb holen!
iny
lda (madr),y
sta ypos,x ; y-pos holen!
mi15 ldy #2
bne mi32 ; weiter
mi16 jsr expl2 ;expl.-init
mi13 lda cntr
sta control,x ;spr ein/aus
mi14 lda #0
sta inittb,x ;init fertig!
mi1 dex
bne mi17 ;next spr?
rts ;minit ende !!!
;spr war ein !
mi2 tya ;control-reg!
asl a
asl a
bmi mi14 ;expl ?
mi12 lda trklo,x ;no: alte
sta madr ; adr holen
lda trkhi,x
beq mi14
sta madr+1
ldy trkpo,x ;pointer
mi32 lda (madr),y
beq mi14 ;track ende ?
cmp #$ff ;no:
beq mijmp ;jump/einschub?
jsr mi3 ;no: norm-init!
iny
tya ;neuen
sta trkpo,x ;pointer retten
jmp mi13 ;next spr !
mijmp iny
lda (madr),y ;testen !
cmp #$ff
beq mij1 ;jump ?
cmp #$fe
beq mijs ;einschub ?
dey
jmp mi13 ;weder noch !
mij1 iny ;jump!
lda (madr),y ; holt neue
sta trklo,x ; track adr
iny ; & uebergibt!
lda (madr),y ; achtung :
sta trkhi,x ;----------
lda #0 ;muss auf
sta trkpo,x ;status byte
beq mi12 ;weisen !!!
;einschub !
mijs iny ; holt
lda (madr),y ; einsprung
sta mijs2+1 ; der init-seq
iny
lda (madr),y ;achtung:
sta madr+1 ;--------
mijs2 lda #$00 ;muss auf
sta madr ;status byte
iny ;weisen !
tya
sta trkpo,x
ldy #0
lda (madr),y ; fuehrt sie
jsr mi3 ; aus & kehrt
jmp mi13 ; zurueck
mi3 lsr a ;holt alle
sta ireg ; daten aus dem
bcc mi4 ; track !
iny
lda (madr),y ;special init?
sta mi4-6 ;wenn ja:
iny ; holt einsrung
lda (madr),y
sta mi4-5
sty mi4-1 ;rettet x,y
stx mi4-3
jsr $ffff ;springt ein!
ldx #0 ; x,y retten
ldy #0
mi4 lsr ireg ;basic
bcc mi5 ; refresh ?
iny ;ja:
lda (madr),y ;ja: holt:
beq mi41
sta block,x ; block &
mi41 lda cntr
and #$40
iny
ora (madr),y ; farbe !
ora #$80 ;& spr on !
sta cntr
mi5 lsr ireg ;bewegung x/y?
bcc mi6
iny ;ja: holt:
lda (madr),y ; deltax
sta deltax,x
iny
lda (madr),y ; deltay
sta deltay,x
mi6 lsr ireg ;count down?
bcc mi7
iny ;ja:
lda (madr),y ; holt delay
sta delay,x
mi7 lsr ireg ;beschleunigung
bcc mi8 ; x/y ?
iny ;ja!
sty mi71+1 ;y retten
lda (madr),y ;holt zeiger
asl a ; auf acctb
asl a ; *4
tay ;holt aus
lda acctb+1,y ; acctb :
sta acctx,x ; time x
lda acctb,y ;ziel/start -x-
sta deltax,x
lda acctb+3,y ; time y
sta accty,x
lda acctb+2,y ;ziel/start -y-
sta deltay,x
lda #$00 ; alte counter
sta acct1,x ; clr
sta acct2,x
mi71 ldy #$00 ;y zurueck
mi8 lsr ireg ;animation ?
bcc mi9
iny ;ja
lda (madr),y ;animations-nr.
asl a ;*2
sta anitb,x ;uebergeben
lda #0
sta anitco,x ; clr
sta anico,x
mi9 lsr ireg ;special-prg
bcc mi10
iny ;ja !
lda (madr),y
sta speclo,x ;holt adr !
iny
lda (madr),y ;&uebergibt !
sta spechi,x
mi10 lsr ireg ;sinus ?
bcc mi11
iny ; ja!
lda (madr),y ;holt nr fuer
jmp sininit ;sintab2 & init
mi11 rts