t* * This program combines the scrolltext * demo running in an interrupt with * a Robin-inspired block sprite * controllable by the joystick. It * demonstrates interrupt programming * as well as simple sprite commands. * * Stephen L. Judd * 10/30/04 * byte joycount=7 ;counter byte joy2@$dc00,temp byte sprite(63)@832 uint xpos=100 ubyte ypos=100 ubyte color=1 byte mesg(80)=[!s" Robin Harbron rules!!! "] byte mesglen=23 byte row1(40)@$0400 ;first screen row Scroll2_rowpos = 39 ;initial screen position ; ; Set up screen/color mem ; fillmem($d800,$d800+39,01) ;Set color ram top row to white fillmem($0400,$0400+39,32) ;And clear top row of screen ; ; Init scroll IRQ ; DisableTimerAIRQ ;shut down CIA timer IRQ (kernal IRQ) SetRaster(50) SetIRQRoutine(Scroll1) SetCol38 ;use 38 cols to make it smooth EnableRasterIRQ ; ; Set up sprite ; UseSpriteStuff byte x for x=0:62 sprite(x)=255 next SetSpritePtr(0,13) SpriteOn(0) ; ; Main loop ; repeat wait $d012,255 ;Update sprites off the display SetSpriteX(0,xpos) SetSpriteY(0,ypos) SetSpriteColor(0,color) wait joycount,0 ;Wait for IRQ signal joycount = 1 temp = joy2 biteor 255 testall case temp bitand 1 ;up ypos = ypos-1 case temp bitand 2 ;down ypos = ypos+1 case temp bitand 4 ;left xpos = xpos-1 case temp bitand 8 ;right xpos = xpos+1 case temp bitand 16 ;fire inc color ;sprite color endtest forever ;------------------------------- ; ; IRQ routines ; ; The first IRQ routine fine-scrolls ; the screen and sets up the next IRQ. ; ;------------------------------- irq Scroll1() byte count AckRasterIRQ ;acknowledge irq SetScrollX(count) ;fine scroll SetRaster(58) ;set next IRQ SetIRQRoutine(Scroll2) count=count-1 if count<0 Scroll2_flag = 1 count = 7 else Scroll2_flag = 0 endif endirq ; ; The second IRQ routine updates the ; message text as needed. By updating ; the text after the screen has been ; updated the scrolling is smooth. ; irq Scroll2()_byte flag, byte rowpos byte offset=0,endtext AckRasterIRQ ;acknowledge irq SetScrollX(7) ;Fix rest of screen SetRaster(50) SetIRQRoutine(Scroll1) if flag=1 endtext = offset+39 if endtext > mesglen endtext = mesglen endif row1$(rowpos:39) = mesg$(offset:endtext) if rowpos>0 rowpos = rowpos-1 ;move mesg left elsif offset < mesglen offset = offset+1 ;if all the way left then move through message else rowpos = 39 ;reset if done offset = 0 endif endif if joycount > 0 ;Decrease the joystick counter joycount = joycount-1 endif JmpKernalIRQ