;======================================================================= ; Based on BASIC program posted by FozzTexx, originally written in 1987 ;======================================================================= NUMSTARS = 16 ;const int ysize=160,xsize=280,margin=24; ; ;int xpos; ; ;signed char o,i; ;signed char color_group,x_velocity,cs,max_steps; ;unsigned char xpos_l; ;unsigned char ypos_h,ypos_l; ;signed char y_velocity_h; ;unsigned char y_velocity_l; ;unsigned char y_old=0,y_even_older; ;unsigned char x_old=0,x_even_older; ;unsigned char peak; ;void routine_370(void) { ; hplot(xpos+o,ypos_h+o); // NE ; hplot(xpos-o,ypos_h-o); // SW ; hplot(xpos+o,ypos_h-o); // SE ; hplot(xpos-o,ypos_h+o); // NW ; hplot(xpos,ypos_h+(o*1.5)); // N ; hplot(xpos+(o*1.5),ypos_h); // E ; hplot(xpos,ypos_h-(o*1.5)); // S ; hplot(xpos-(o*1.5),ypos_h); // W ;} draw_fireworks: jsr HOME ; clear screen jsr HGR ; set high-res, clear screen, page0 jsr draw_stars ; draw the stars label_180: ; random_6502(); ; color_group=ram[SEED]&1; // HGR color group (PG or BO) ; random_6502(); ; x_velocity=(ram[SEED]&0x3)+1; // x velocity = 1..4 ; random_6502(); ; y_velocity_h=-((ram[SEED]&0x3)+3); // y velocity = -3..-6 ; y_velocity_l=0; ; random_6502(); ; max_steps=(ram[SEED]&0x1f)+33; // 33..64 ; /* launch from the two hills */ ; random_6502(); ; xpos_l=ram[SEED]&0x3f; ; random_6502(); ; if (ram[SEED]&1) { ; xpos_l+=24; // 24-88 (64) ; } ; else { ; xpos_l+=191; // 191-255 (64) ; } ; ypos_h=ysize; // start at ground ; ypos_l=0; ; peak=ypos_h; // peak starts at ground? ; /* Aim towards center of screen */ ; /* TODO: merge this with hill location? */ ; if (xpos_l>xsize/2) { ; x_velocity=-x_velocity; ; } ; /* Draw rocket */ ; for(cs=1;cs<=max_steps;cs++) { ; y_even_older=y_old; ; y_old=ypos_h; ; x_even_older=x_old; ; x_old=xpos_l; ; /* Move rocket */ ; xpos_l=xpos_l+x_velocity; ; /* 16 bit add */ ; add16(&ypos_h,&ypos_l,y_velocity_h,y_velocity_l); ; /* adjust Y velocity, slow it down */ ;// c=0; ;// a=y_velocity_l; ;// adc(0x20); // 0x20 = 0.125 ;// y_velocity_l=a; ;// a=y_velocity_h; ;// adc(0); ;// y_velocity_h=a; ; sadd16(&y_velocity_h,&y_velocity_l,0x00,0x20); ; /* if we went higher, adjust peak */ ; if (ypos_h=(xsize-margin)) { ; cs=max_steps; // too far right ; } ; if (ypos_h<=margin) { ; cs=max_steps; // too far up ; } ; // if falling downward ; if (y_velocity_h>0) { ; // if too close to ground, explode ; if (ypos_h>=ysize-margin) { ; cs=max_steps; ; } ; // if fallen a bit past peak, explode ; if (ypos_h>ysize-(ysize-peak)/2) { ; cs=max_steps; ; } ; } ; // if not done, draw rocket ; if (cs