home *** CD-ROM | disk | FTP | other *** search
-
- *= $C000 ; Start address
- ; Ball Animation
- ; Interrupt demo
- SEI ; Set Interrupt Disable Flag
- LDA #<NEWIRQ ; Change IRQ RAM vector
- STA $0314
- LDA #>NEWIRQ
- STA $0315
- CLI ; Clear Interrupt Disable Flag
- LDX #$10 ; Set Sprite Location Registers
- ILOOP
- LDA SP,X ; ($D000-D010) set to initial values
- STA $D000,X ; From table SP
- DEX
- BPL ILOOP
- LDX #$07 ; Set Sprite Color Registers
- CLOOP
- LDA SC,X ; ($D027-D02E) to values in table SC
- STA $D027,X
- LDA #$0B ; and Sprite Pointers ($07F8-$07FF)
- STA $07F8,X ; to sprite block 11
- DEX
- BPL CLOOP
- LDA #0 ; Initialize other VIC registers
- STA $D017 ; X-expand
- STA $D01C ; Multicolor
- STA $D01D ; Y-expand
- STA $D020 ; Border Color (Black)
- STA $D021 ; Background Color (Black)
- LDA #$FF
- STA $D015 ; Sprite Enable Register
- LDX #$3F ; Put Sprite Data in Block 11
- ; ($02C0-$02FF)
- SLOOP
- LDA BALL,X ; Data in Table BALL
- STA $02C0,X
- DEX
- BPL SLOOP
- JSR EXP ; (For further expansion)
- RTS
- NEWIRQ
- NOP ; (For further expansion)
- NOP
- NOP
- CONT
- LDX #$0F ; Set X to $0F - end of Sprite
- ; Position
- MLOOP
- TXA ; Main loop - save bit 0
- ; (0=X value, 1=Y value)
- LSR ; Put in Carry Flag
- PHP ; Save Carry Flag
- TAY ; Set Mask Bit for MSB register ($D010)
- SEC
- LDA #0
- BLOOP
- ROL
- DEY
- BPL BLOOP
- TAY ; Store Mask in Y register
- PLP ; Retrieve Carry Flag (Bit 0)
- LDA SD,X ; Get direction of corresponding
- ; position register
- BPL REGINC ; If increasing, go to RECINC
- DEC $D000,X ; Decrease value of position register
- BNE NEXT ; If > 0 then do next register
- BCS NEXT ; If a Y-position, then do next
- ; register
- TYA ; Get MSB register mask
- EOR $D010 ; Toggle appropriate bit of MSB register
- STA $D010
- TYA ; Get MSB mask again
- AND $D010 ; Test appropriate bit of MSB register
- BEQ NEXT ; If not set then do next register
- LDA #$5B ; Load A with $5B (91), Put in X position
- STA $D000,X ; Register if sprite wraps around
- ; left side
- JMP NEXT ; Next register
- REGINC
- INC $D000,X ; Increase value of position register
- BCS NEXT ; If a Y position, do next register
- BNE CHECKX ; If not 0 check right edge of screen
- TYA ; Get mask bit
- ORA $D010 ; Set MSB
- STA $D010
- JMP NEXT ; Do next register
- CHECKX
- LDA $D000,X ; Get current X position
- CMP #$5B ; Compare to $5B (91)
- BNE NEXT ; If not 91 then do next register
- TYA ; Get mask
- AND $D010 ; Test MSB register
- BEQ NEXT ; If not at right edge, do
- ; next register
- LDA #0 ; Put sprite at left edge
- STA $D000,X
- TYA
- EOR $D010
- STA $D010
- NEXT
- DEX ; Decrement X - point to next position
- ; register
- BPL MLOOP ; If not done, do again
- JMP $EA31 ; Go to KERNAL IRQ routine
- SP
- .BYTE 155 90 205 95 255 130 250 175 ; Initial
- ; positions
- .BYTE 205 205 155 210 110 170 105 135 0
- SC
- .BYTE 8 9 10 11 12 13 14 15 ; Sprite colors
- SD
- .BYTE 0 128 128 0 128 128 128 0 ; Direction
- .BYTE 0 0 128 128 0 128 0 0 ; 0=INC, 128=DEC
- BALL
- .BYTE 0 0 0 1 255 128 7 31 ; Sprite Data
- .BYTE 224 12 255 240 31 255 248 63
- .BYTE 15 252 126 15 254 124 15 254
- .BYTE 248 112 63 248 240 255 248 255
- .BYTE 255 248 240 255 248 112 63 124
- .BYTE 15 254 126 15 254 63 15 252
- .BYTE 31 255 248 15 255 48 7 248
- .BYTE 224 1 255 128 0 0 0 0
- EXP
- RTS
-
-