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 >
Text File  |  2022-10-26  |  23KB  |  913 lines

  1. ;---------------------------------------
  2. ;             sprite mover
  3. ;---------------------------------------
  4. ; (w) in 1991 by ingo kusch
  5. ;                simonstr.9
  6. ;                4700 hamm 3
  7. ;            tel:02381/464619
  8. ;---------------------------------------
  9. ; bereich  :    -x- : 456-480
  10. ; -------            (480-456) clr  !!!!
  11. ;               -y- : 40-240
  12. ;---------------------------------------
  13. ;abkuerzungen:
  14. ; 'sr' - sprite routine
  15. ;       (move-programm)
  16. ; 'sd' - sprite darstellung
  17. ;       (sichtbarmachen der beerechneten
  18. ;        sprites mit first & next)
  19. ; zw.sp. - zwischen speicher
  20. ; s.o. - siehe oben
  21. ; s.u. - siehe unten
  22. ; clr  - clear = loeschen
  23. ; spr  - sprite
  24. ; adr  - adresse
  25. ; tab  - tabelle
  26. ; trk  - track
  27. ; nr   - nummer
  28. ;  ?   - bedingungen/abfragen
  29. ;  !   - befehle/anweisungen
  30. ;---------------------------------------
  31.  
  32. ;--- sprite tabellen
  33.  
  34. base     = $4000
  35. inittb   = base
  36. xpos     = base+30       ;position x
  37. ypos     = base+60       ;   "     y
  38. block    = base+90       ;block nr
  39. control  = base+120      ;on/msb/color
  40. deltax   = base+150      ;bewegung -x-
  41. deltay   = base+180      ;   "     -y-
  42. delay    = base+210      ;countdown
  43. sinxhi   = base+240      ;sinus -x-
  44. sinxlo   = base+270
  45. sinx1    = base+300
  46. sinx2    = base+330
  47. sinx3    = base+360
  48. sinyhi   = base+390      ;sinus -y-
  49. sinylo   = base+420
  50. siny1    = base+450
  51. siny2    = base+480
  52. siny3    = base+520
  53. anitb    = base+570      ;animation
  54. anico    = base+600
  55. anitco   = base+630
  56. speclo   = base+660      ;special-prgs
  57. spechi   = base+690
  58. trklo    = base+720      ;track count
  59. trkhi    = base+750
  60. trkpo    = base+780
  61. acctx    = base+810   ;beschleunigung-x-
  62. accty    = base+840   ;       "      -y-
  63. acct1    = base+870   ; " -zeit -x-
  64. acct2    = base+900   ; "   "   -y-
  65. zwisch   = base+930      ;beeliebig
  66. zwisch2  = base+960      ;nutzbar
  67. zwisch3  = base+990      ;   "
  68. zwisch4  = base+1020     ;   "
  69.  
  70. xpos2    = base+1050     ;fuer 'sd'
  71. ypos2    = base+1080     ;notwendige
  72. control2 = base+1110     ;zwischen tabs
  73. block2   = base+1140
  74.  
  75. ytab     = base+$0500    ;sortier tab 1
  76. srtab    = ytab+100      ;   "     "  2
  77. srtab2   = ytab+130      ; zw.sp. 'sd'
  78. spfree   = ytab+160      ;sortier tab 3
  79.  
  80.  
  81.  
  82. ;--- zeropage adressen
  83.  
  84. adr      = $02
  85. madr     = $04
  86. mre      = $06
  87.  
  88. xwert    = $08
  89. ywert    = $09
  90. cntr     = $0a
  91. ireg     = $0b
  92. fspr     = $0c
  93. spr      = $0d
  94. spr2     = $0e
  95. spr3     = $0f
  96. zwr      = $10
  97. zwr2     = $11
  98. mzwr     = $12
  99. mzwr2    = $13
  100. by       = $14
  101. my       = $15
  102. sy       = $16
  103. time     = $17           ;'uhr'
  104.  
  105. spr21    = $1a
  106. spr31    = $1b
  107.  
  108.  
  109.  
  110. ;--- makros
  111.  
  112. setirq   .macro          ;setzt irq
  113.          lda #<\1
  114.          sta $fffe
  115.          lda #>\1
  116.          sta $ffff
  117.          .endm
  118.  
  119. free     .macro          ;gibt irq frei
  120.          asl $d019
  121.          cli
  122.          .endm
  123.  
  124.  
  125. ;--- main part
  126.  
  127.  
  128.  
  129.          *= $0810
  130.  
  131.          jmp init        ;s.u.
  132.  
  133.  
  134. ;---------------------------------------
  135. ;* achtung ! die folgende routine wird
  136. ;  von den irq-programmen first & next
  137. ;  angesprungen ! sie steht hier vorn,
  138. ;  damit sie einige taktzyklen schneller
  139. ;  (branches nur in gleiche page usw...)
  140. ;---------------------------------------
  141.  
  142. set      dec spr21       ;bringt die
  143.          bmi st3         ;sprs auf
  144.          ldx spr21       ;den screen ...
  145.          ldy srtab2,x
  146.          lda control2,y  ;farbe
  147.          bpl set         ;noch an ?!?!
  148.          ldx spr
  149.          sta $d027,x
  150.          asl a           ;msb holen
  151.          asl a
  152.          lda $d010
  153.          and tabb,x
  154.          bcc st10        ;msb - setzen
  155.          ora tabc,x
  156. st10     sta $d010
  157.  
  158.          lda block2,y    ;block-nummer
  159. st4      sta $07f8,x
  160.          txa
  161.          asl a
  162.          tax
  163.          lda xpos2,y     ;x-position
  164.          sta $d000,x
  165.          lda ypos2,y     ;y-position
  166.          sta $d001,x
  167.  
  168.          lda spr         ;next spr
  169.          adc #$01
  170.          and #$07
  171.          sta spr
  172.          rts
  173.  
  174. tabb     .byte $fe,$fd,$fb,$f7
  175.          .byte $ef,$df,$bf,$7f
  176. tabc     .byte $01,$02,$04,$08
  177.          .byte $10,$20,$40,$80
  178.  
  179. st3      pla             ;keine sprs
  180.          pla             ;mehr
  181.          #setirq (first) ;irq an den
  182.          lda $d011       ; anfang
  183.          and #$7f        ;raster
  184.          sta $d011       ; refresh
  185.          lda #10
  186.          sta $d012
  187.          lda spr31
  188.          cmp #$08        ;zurueck nach:
  189.          bcs st31
  190.          jmp f3          ;first ?!?
  191. st31     jmp n3          ;oder next ??
  192.  
  193.  
  194.  
  195.  
  196. ;---------------------------------------
  197. ;* eigentlicher programm beginn
  198. ;---------------------------------------
  199.  
  200. init     sei
  201.          lda #$05          ;rom aus
  202.          sta $01
  203.          lda #$00
  204.          sta $d020         ;background
  205.          sta $d021         ; colors
  206.          sta $dc0e         ;zeit irqs
  207.          sta $dc0d         ;sperren
  208.  
  209.          tax
  210. ii1      lda #$00
  211.          sta base,x        ;register
  212.          sta base+$0100,x  ;zurueck-
  213.          sta base+$0200,x  ; setzen
  214.          sta base+$0300,x
  215.          sta base+$0400,x
  216.          sta base+$0500,x
  217.          lda #$20
  218.          sta $0400,x       ;bildschirm
  219.          sta $0500,x       ;clr !
  220.          sta $0600,x
  221.          sta $0700,x
  222.          dex
  223.          bne ii1
  224.  
  225.          ldx #30           ;dito
  226.          lda #$00
  227. ii2      sta $02,x         ;zeropage
  228.          dex
  229.          bpl ii2
  230.  
  231.          lda #$ff          ;multicolor
  232.          sta $d01c         ;on
  233.          lda #$06          ;spr
  234.          sta $d025         ; farben
  235.          lda #$01          ;setzen
  236.          sta $d026
  237.  
  238. start    lda #<nmi         ;nmis
  239.          ldx #>nmi         ;auffangen
  240.          sta $fffa
  241.          stx $fffb
  242.          #setirq (first)   ;raster-irq
  243.          lda $d011         ;  init...
  244.          and #$7f          ;raster msb
  245.          sta $d011         ;clr
  246.          lda #20           ;rasterzeile
  247.          sta $d012         ;setzen
  248.          lda #$81          ;rasterirq
  249.          sta $d01a         ; maskieren
  250.          cli               ;freigabe
  251.  
  252. wait     jsr minit    ;spr init
  253.          jsr timer    ;hier platz fuer
  254.          jmp wait     ;check-routinen
  255.                       ;timer-routinen
  256.                       ;usw. ausserhalb
  257.                       ;des irq !
  258.  
  259.  
  260.  
  261. ;---------------------------------------
  262. ;* stellt die ersten acht sprites dar
  263. ;---------------------------------------
  264.  
  265. first    sta a1+1     ;register
  266.          stx x1+1     ; retten
  267.          sty y1+1
  268.  
  269.          inc by       ;zeittakt
  270.          lda by
  271.          and #$3f     ;circa jeden
  272.          bne i1       ; 64. screen
  273.          lda time     ; einmal
  274.          clc          ; time-counter
  275.          adc #1       ; erhoehen !
  276.          sta time
  277.          bcc i1
  278.          inc time+1
  279. i1
  280.          lda spr2       ;hier werden die
  281.          sta spr21      ;von der 'sr'
  282.          lda spr3       ;bearbeiteten
  283.          sta spr31      ;register in
  284.          ldx #30        ;die fuer 'sd'
  285. in2      lda xpos,x     ;notwendigen
  286.          sta xpos2,x    ;copiert.
  287.          lda ypos,x
  288.          sta ypos2,x    ;dadurch kann
  289.          lda control,x  ;die berechnung
  290.          sta control2,x ;'sr' (fuer den
  291.          lda block,x    ;naechsten
  292.          sta block2,x   ;durchlauf)
  293.          lda srtab,x    ;parallel mit
  294.          sta srtab2,x   ;'sd' ablaufen,
  295.          dex            ;ohne dass beide
  296.          bpl in2        ;sich stoeren !
  297.  
  298.          lda #$00       ;spr ein!
  299.          sta spr
  300.          ldx spr31
  301. f5       cpx #$09       ;mehr als 8 ?
  302.          bcc f4
  303.          ldx #$08       ;dann: alle an!
  304. f4       lda tabd,x     ;sonst: evtl.
  305.          sta $d015      ;  weniger!
  306.  
  307.          jsr set        ;die obersten 8
  308.          jsr set        ;spr darstellen!
  309.          jsr set
  310.          jsr set
  311.          jsr set
  312.          jsr set
  313.          jsr set
  314.          jsr set
  315.  
  316.          lda $d001      ;untere kante
  317.          adc #21        ;des naechsten
  318.          sta $d012      ;sprs neuer
  319.          #setirq (next) ;raster-init !
  320.  
  321. f3       #free          ;irq frei
  322.  
  323.          jsr move       ;'sr'
  324.          lda #$00
  325.          sta $d020
  326.  
  327. a1       lda #$00       ;register
  328. x1       ldx #$00       ; retten
  329. y1       ldy #$00
  330. nmi      rti
  331.  
  332.  
  333. ;---------------------------------------
  334. ;* stellt die weiteren sprites dar !
  335. ;---------------------------------------
  336.  
  337. next     sta a2+1       ;s.o.
  338.          stx x2+1
  339.          sty y2+1
  340.  
  341. n2       jsr set        ;'sd'
  342.          asl a          ;noch genug ras-
  343.          tax            ;ter zeit bis
  344.          lda $d001,x    ;zum naechsten
  345.          adc #21        ;spr, um noch
  346.          sta zwr        ;einen irq aus-
  347.          ldx $d012      ;zuloesen ???
  348.          inx
  349.          cpx zwr
  350.          bcs n2         ;nein : n2
  351.  
  352.          sta $d012      ;ja !
  353. n3
  354. a2       lda #$00       ;s.o.
  355. x2       ldx #$00
  356. y2       ldy #$00
  357.          #free
  358.          rti
  359.  
  360.  
  361.  
  362. ;---------------------------------------
  363. ;* eigentliche sprite-routine 'sr'
  364. ;---------------------------------syntax
  365. ;zur bewegung & darstellung der sprites!
  366. ;    {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}
  367. ;                         {CBM-A}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{CBM-S}
  368. ;  xxxx xxxx              {SHIFT--}control-byte{SHIFT--}
  369. ;  {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}
  370. ;  {SHIFT--}{SHIFT--}{SHIFT--}{CBM-Z}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}1st/2nd nibble (sinus)
  371. ;  {SHIFT--}{SHIFT--}{CBM-Z}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}explosion on/off
  372. ;  {SHIFT--}{CBM-Z}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}msb
  373. ;  {CBM-Z}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}sprite on/off
  374. ;---------------------------------------
  375.  
  376. move     lda my          ;fuer x/y
  377.          eor #$80        ;bewegung :
  378.          sta my          ;up/down half
  379.                          ;(s.u.)
  380.          ldx #30
  381. mo2      lda control,x
  382.          bpl yr5         ;spr an ?
  383.                          ;ja !
  384.          lda #$00        ;zwischenwerte
  385.          sta xwert       ;losechen
  386.          sta ywert
  387.  
  388. an5      lda anitb,x     ;animation ?
  389.          bne an51
  390.          jmp xs          ;nein : s.u.
  391. an51     asl a           ;ja:ausfuehren
  392.          dec anitco,x
  393.          bpl an21        ;next step ?
  394.          tay             ;ja !
  395.          lda anitab+2,y  ;wartezeit
  396.          sta anitco,x    ; restaurieren
  397.          lda anitab,y    ;adr
  398.          sta adr         ;holen
  399.          lda anitab+1,y
  400.          sta adr+1
  401.          ldy anico,x     ;stepnummer
  402. an3      lda (adr),y     ;block holen
  403.          bne an2         ;block ok ?
  404.          sta anico,x     ;nein:
  405.          tay             ;animation von
  406.          bcc an3         ;vorne ?
  407.  
  408.          lda anitb,x     ;nicht nochmal!
  409.          and #$3f        ;explosion ?
  410.          beq an8         ;ja : clr
  411. an41     inc inittb,x    ;nein:next init
  412.          lda #$00        ;anim. fertig
  413.          sta anitb,x
  414.  
  415. an4      lda control,x
  416.          asl a
  417.          bpl an42        ;msb ?
  418.          lda xpos,x      ;ja :
  419.          cmp #160        ; spr clr ?
  420.          bcc an42        ; nein
  421.          cmp #200
  422.          bcs an42        ; nein
  423.          bcc an8         ;ja!
  424.  
  425. an42     lda ypos,x      ; sortiert spr.
  426.          lsr a           ; in ytab ein
  427.          lsr a
  428.          cmp #10         ;spr clr ?
  429.          bcc an8         ; ja
  430.          cmp #60
  431.          bcs an8         ; ja
  432.          tay             ;nein
  433. yr4      lda ytab,y
  434.          beq yr3         ;platz besetzt?
  435.          iny             ; ja:next place
  436.          cpy #60
  437.          bcc yr4         ; end of tab?
  438.          bcs yr5         ; ja: next spr
  439. yr3      txa
  440.          sta ytab,y      ; einsortieren
  441.          bne yr5
  442.  
  443. an8      lda #$00        ; spr clr!
  444.          sta control,x
  445. yr5      dex             ; next spr
  446.          beq yr51        ; all ready ?
  447.          jmp mo2         ; no
  448. yr51     jmp sort        ; all ready !!
  449.  
  450. an2      sta block,x     ; new block
  451.          inc anico,x     ; step forward
  452. an21     bcc xs          ; explosion ?
  453.          ldy #0          ; vielleicht
  454.          lda anitb,x
  455.          and #$3f
  456.          bne xs          ; explosion ?
  457.          jmp setxy       ; ja!
  458.  
  459. xs       lda control,x   ; weiter :
  460.          eor #$10        ; first/sec.
  461.          sta control,x   ; halfbyte
  462.          asl a
  463.          asl a
  464.          asl a
  465.          sta sy          ; sichern
  466.          lda sinxhi,x    ; sinus in
  467.          beq ys          ; x-richtung ?
  468.          sta adr+1       ; ja:adr
  469.          lda sinxlo,x    ; holen
  470.          sta adr
  471.          ldy sinx1,x
  472.          lda (adr),y     ; wert holen
  473.          bit sy          ; 1st/2nd
  474.          bmi xs2         ; halfbyte ?
  475.          lsr a           ; first
  476.          lsr a
  477.          lsr a
  478.          lsr a
  479. xs2      and #$0f        ; second
  480.          tay
  481.          lda deltb,y     ; aus tab holen
  482.          sta xwert       ; ablegen
  483.          bit sy          ; bereits next
  484.          bpl ys          ;  byte ???
  485.          lda sinx1,x     ; ja!
  486.          clc             ; step forward
  487.          adc #1
  488.          cmp sinx2,x
  489.          bcc xs1         ;ende erreicht?
  490.          lda sinx3,x     ; ja:restart
  491. xs1      sta sinx1,x     ; nein:store
  492.  
  493. ys       lda sinyhi,x    ; sinus in
  494.          beq del         ; y-richtung ?
  495.          sta adr+1       ; ja :adr
  496.          lda sinylo,x    ; holen
  497.          sta adr
  498.          ldy siny1,x
  499.          lda (adr),y     ; dito
  500.          bit sy          ; alles analog
  501.          bmi ys2         ; zu -xs-
  502.          lsr a
  503.          lsr a
  504.          lsr a
  505.          lsr a
  506. ys2      and #$0f
  507.          tay
  508.          lda deltb,y
  509.          sta ywert
  510.          bit sy
  511.          bpl del
  512.          lda siny1,x
  513.          clc
  514.          adc #1
  515.          cmp siny2,x
  516.          bcc ys1
  517.          lda siny3,x
  518. ys1      sta siny1,x
  519.  
  520. del      lda delay,x     ; countdown ?
  521.          beq acx
  522.          dec delay,x     ; ja:ausfuehren
  523.          bne acx         ; null ?
  524.          inc inittb,x    ; ja:next init
  525.  
  526. acx      lda acctx,x  ;beschleunigung x?
  527.          beq dx
  528.          dec acct1,x     ;ja:wert schon
  529.          bpl ac1         ;  aendern ?
  530.  
  531.          lda acctx,x     ;ja: zeit
  532.          sta acct1,x     ; restaurieren
  533.  
  534.          lda deltax,x    ;tab-wert holen
  535.          and #$f0
  536.          sta zwr2        ;ziel retten
  537.          lsr a
  538.          lsr a
  539.          lsr a
  540.          lsr a
  541.          sta zwr         ;ziel wert
  542.          lda deltax,x
  543.          and #$0f        ;moment wert
  544.          cmp zwr         ;ziel
  545.          bne ac5         ; erreicht?
  546.          lda #$00        ; ja : acc-
  547.          sta acctx,x     ; ende !
  548.          beq acy
  549.  
  550. ac5      bcc ac3         ;ziel annaehren
  551.          sbc #1
  552.          bpl ac4
  553. ac3      adc #1
  554. ac4      ora zwr2        ;tab wert
  555.          sta deltax,x    ; zurueck !
  556.          bne dx1
  557.  
  558. ac1      lda deltax,x    ;bewegung aus-
  559.          bne dx1         ;  fuehren !
  560.  
  561. dx       lda deltax,x    ; x -
  562.          beq dy          ;  bewegung ??
  563.          bit my          ; ja
  564.          bpl dx1         ; 1st/2nd half?
  565.          lsr a           ;1st
  566.          lsr a
  567.          lsr a
  568.          lsr a
  569. dx1      and #$0f        ;2nd
  570.          tay
  571.          lda deltb,y     ; s.o.
  572.          clc
  573.          adc xwert       ;ablegen
  574.          sta xwert
  575.  
  576. acy      lda accty,x  ;beschleunigung y?
  577.          beq dy
  578.          dec acct2,x     ;ja: weiter
  579.          bpl ac11        ;analog -acx-
  580.  
  581.          lda accty,x
  582.          sta acct2,x
  583.  
  584.          lda deltay,x
  585.          and #$f0
  586.          sta zwr2
  587.          lsr a
  588.          lsr a
  589.          lsr a
  590.          lsr a
  591.          sta zwr
  592.          lda deltay,x
  593.          and #$0f
  594.          cmp zwr
  595.          bne ac6
  596.          lda #$00
  597.          sta accty,x
  598.          beq spc
  599.  
  600. ac6      bcc ac7
  601.          sbc #1
  602.          bpl ac8
  603. ac7      adc #1
  604. ac8      ora zwr2
  605.          sta deltay,x
  606.          bne dy1
  607.  
  608. ac11     lda deltay,x
  609.          bne dy1
  610.  
  611. dy       lda deltay,x    ; y bewegung ?
  612.          beq spc
  613.          bit my          ; analog -dx- !
  614.          bpl dy1
  615.          lsr a
  616.          lsr a
  617.          lsr a
  618.          lsr a
  619. dy1      and #$0f
  620.          tay
  621.          lda deltb,y
  622.          clc
  623.          adc ywert
  624.          sta ywert
  625.  
  626. spc      lda spechi,x    ;special prg ?!
  627.          beq setxy
  628.          sta sp1+2       ;ja! adr
  629.          lda speclo,x    ; holen
  630.          sta sp1+1
  631.          stx sp1+4       ;spr-nr retten
  632. sp1      jsr $ffff       ;ins zusatz-prg
  633.          ldx #0          ;spr-nr retten
  634.  
  635. setxy    lda xwert       ;neue spr-pos.
  636.          beq sx5         ;berechnen !
  637.          clc
  638.          adc xpos,x      ;x-pos
  639.          sta xpos,x
  640.          bit xwert
  641.          bpl sx3         ;xwert neg?
  642.          bcc sx3+2       ;add.ueberlauf?
  643.          bcs sx5         ;ja/nein?
  644. sx3      bcc sx5
  645.          lda control,x   ;mit msb !
  646.          eor #$40
  647.          sta control,x
  648. sx5      lda ywert
  649.          beq sx4
  650.          clc
  651.          adc ypos,x      ;y-pos
  652.          sta ypos,x      ; und fertig!
  653.  
  654. sx4      jmp an4         ;einsortieren !
  655.  
  656.  
  657.  
  658. ;---------------------------------------
  659. ;* abschliessender sortier - algorithmus
  660. ;---------------------------------------
  661.  
  662. sort     ldy #0
  663.          ldx #60
  664. an7      lda ytab,x      ;tab search
  665.          beq an6         ;spr gefunden?
  666.          sta srtab,y   ;ja:einsortieren!
  667.          lda #0
  668.          sta ytab,x      ;wert clr!
  669.          iny             ;next
  670. an6      dex             ;ganzen bereich
  671.          cpx #10         ;durchsuchen!
  672.          bcs an7
  673.          lda #$ff        ;ende der tab
  674.          sta srtab,y     ;markieren
  675.          sty spr2        ;spr-anzahl
  676.          sty spr3        ;retten
  677.  
  678. fs7      dey             ;ueberprueft
  679.          beq try         ;nochmals die
  680.          ldx srtab,y     ;reihenfolge
  681.          lda ypos,x      ;der sprites
  682.          ldx srtab-1,y   ;mittels der
  683.          cmp ypos,x      ;jeweiligen
  684.          bcc fs7         ;(echten) ypos
  685.          lda srtab,y     ;& sortiert um
  686.          sta srtab-1,y   ;(falls noetig)
  687.          txa
  688.          sta srtab,y
  689.          bne fs7
  690.  
  691. try      ldy #0          ;fertigt eine
  692.          ldx #30         ;tabelle der
  693. fs2      lda control,x   ;freien spr
  694.          bmi fs1         ;an ...
  695.          lda inittb,x
  696.          beq fs3         ;wird von
  697.          bpl fs1         ;getspr genutzt
  698.          cmp #$ff
  699.          bne fs1
  700.          lda #$00
  701.          sta inittb,x
  702.          beq fs1
  703. fs3      txa
  704.          sta spfree,y
  705.          iny
  706. fs1      dex
  707.          bne fs2
  708.          dey
  709.          sty fspr        ;ende des move
  710.          rts             ;programms
  711.  
  712.  
  713.  
  714. ;---------------------------------------
  715. ;* initialisiert alle sprites mittels
  716. ;  track-tabelle !
  717. ;---------------------------------------
  718.  
  719. minit    ldx #30
  720. mi17     lda inittb,x
  721.          beq mi1         ;init ?
  722.          cmp #$ff        ;vielleicht ?
  723.          beq mi1
  724.          bmi mi16        ;ja:explosion
  725.          ldy control,x   ;ja:normal
  726.          sty cntr
  727.          bmi mi2         ;spr on?
  728.          asl a           ;nein
  729.          tay
  730.          lda trktab,y    ;track adr
  731.          sta trklo,x     ; holen
  732.          sta madr
  733.          lda trktab+1,y
  734.          sta trkhi,x
  735.          sta madr+1
  736.          jsr clr         ;alte wert clr
  737.          ldy #0
  738.          lda (madr),y    ;position
  739.          beq mi15        ;  gegeben ?
  740.          asl a           ;ja !
  741.          sta xpos,x      ; x-pos &
  742.          ror a
  743.          lsr a
  744.          and #$40
  745.          sta cntr        ; msb holen!
  746.          iny
  747.          lda (madr),y
  748.          sta ypos,x      ; y-pos holen!
  749. mi15     ldy #2
  750.          bne mi32        ; weiter
  751.  
  752. mi16     jsr expl2       ;expl.-init
  753. mi13     lda cntr
  754.          sta control,x   ;spr ein/aus
  755. mi14     lda #0
  756.          sta inittb,x    ;init fertig!
  757. mi1      dex
  758.          bne mi17        ;next spr?
  759.          rts             ;minit ende !!!
  760.  
  761.  
  762.                          ;spr war ein !
  763. mi2      tya             ;control-reg!
  764.          asl a
  765.          asl a
  766.          bmi mi14        ;expl ?
  767. mi12     lda trklo,x     ;no: alte
  768.          sta madr        ; adr holen
  769.          lda trkhi,x
  770.          beq mi14
  771.          sta madr+1
  772.          ldy trkpo,x     ;pointer
  773. mi32     lda (madr),y
  774.          beq mi14        ;track ende ?
  775.          cmp #$ff        ;no:
  776.          beq mijmp       ;jump/einschub?
  777.          jsr mi3         ;no: norm-init!
  778.          iny
  779.          tya             ;neuen
  780.          sta trkpo,x     ;pointer retten
  781.          jmp mi13        ;next spr !
  782.  
  783. mijmp    iny
  784.          lda (madr),y    ;testen !
  785.          cmp #$ff
  786.          beq mij1        ;jump ?
  787.          cmp #$fe
  788.          beq mijs        ;einschub ?
  789.          dey
  790.          jmp mi13        ;weder noch !
  791.  
  792.  
  793. mij1     iny             ;jump!
  794.          lda (madr),y    ; holt neue
  795.          sta trklo,x     ; track adr
  796.          iny             ; & uebergibt!
  797.          lda (madr),y    ; achtung :
  798.          sta trkhi,x     ;----------
  799.          lda #0          ;muss auf
  800.          sta trkpo,x     ;status byte
  801.          beq mi12        ;weisen !!!
  802.  
  803.  
  804.                          ;einschub !
  805. mijs     iny             ; holt
  806.          lda (madr),y    ; einsprung
  807.          sta mijs2+1     ; der init-seq
  808.          iny
  809.          lda (madr),y    ;achtung:
  810.          sta madr+1      ;--------
  811. mijs2    lda #$00        ;muss auf
  812.          sta madr        ;status byte
  813.          iny             ;weisen !
  814.          tya
  815.          sta trkpo,x
  816.          ldy #0
  817.          lda (madr),y    ; fuehrt sie
  818.          jsr mi3         ; aus & kehrt
  819.          jmp mi13        ; zurueck
  820.  
  821.  
  822. mi3      lsr a           ;holt alle
  823.          sta ireg        ; daten aus dem
  824.          bcc mi4         ; track !
  825.          iny
  826.          lda (madr),y    ;special init?
  827.          sta mi4-6       ;wenn ja:
  828.          iny             ; holt einsrung
  829.          lda (madr),y
  830.          sta mi4-5
  831.          sty mi4-1       ;rettet x,y
  832.          stx mi4-3
  833.          jsr $ffff       ;springt ein!
  834.          ldx #0          ; x,y retten
  835.          ldy #0
  836.  
  837. mi4      lsr ireg        ;basic
  838.          bcc mi5         ; refresh ?
  839.          iny             ;ja:
  840.          lda (madr),y    ;ja: holt:
  841.          beq mi41
  842.          sta block,x     ; block &
  843. mi41     lda cntr
  844.          and #$40
  845.          iny
  846.          ora (madr),y    ; farbe !
  847.          ora #$80        ;& spr on !
  848.          sta cntr
  849.  
  850. mi5      lsr ireg        ;bewegung x/y?
  851.          bcc mi6
  852.          iny             ;ja: holt:
  853.          lda (madr),y    ; deltax
  854.          sta deltax,x
  855.          iny
  856.          lda (madr),y    ; deltay
  857.          sta deltay,x
  858.  
  859. mi6      lsr ireg        ;count down?
  860.          bcc mi7
  861.          iny             ;ja:
  862.          lda (madr),y    ; holt delay
  863.          sta delay,x
  864.  
  865. mi7      lsr ireg        ;beschleunigung
  866.          bcc mi8         ; x/y ?
  867.          iny             ;ja!
  868.          sty mi71+1      ;y retten
  869.          lda (madr),y    ;holt zeiger
  870.          asl a           ; auf acctb
  871.          asl a           ; *4
  872.          tay             ;holt aus
  873.          lda acctb+1,y   ; acctb :
  874.          sta acctx,x     ; time x
  875.          lda acctb,y     ;ziel/start -x-
  876.          sta deltax,x
  877.          lda acctb+3,y   ; time y
  878.          sta accty,x
  879.          lda acctb+2,y   ;ziel/start -y-
  880.          sta deltay,x
  881.          lda #$00        ; alte counter
  882.          sta acct1,x     ; clr
  883.          sta acct2,x
  884. mi71     ldy #$00        ;y zurueck
  885.  
  886. mi8      lsr ireg        ;animation ?
  887.          bcc mi9
  888.          iny             ;ja
  889.          lda (madr),y    ;animations-nr.
  890.          asl a           ;*2
  891.          sta anitb,x     ;uebergeben
  892.          lda #0
  893.          sta anitco,x    ; clr
  894.          sta anico,x
  895.  
  896. mi9      lsr ireg        ;special-prg
  897.          bcc mi10
  898.          iny             ;ja !
  899.          lda (madr),y
  900.          sta speclo,x    ;holt adr !
  901.          iny
  902.          lda (madr),y    ;&uebergibt !
  903.          sta spechi,x
  904.  
  905. mi10     lsr ireg        ;sinus ?
  906.          bcc mi11
  907.          iny             ; ja!
  908.          lda (madr),y    ;holt nr fuer
  909.          jmp sininit     ;sintab2 & init
  910. mi11     rts
  911.  
  912.  
  913.