**************** Bob-Competition ********************** * * * 199 Bobs ! * * technical infos: * * - 320 x 200 screen * * - bobs are moved on the whole(!) screen * * - bobsize: 15 x 15 x 2 planes * * - bobs are masked out (MINTERM: $xfca) * * - real-time calculation of positions * * (no precalculated positionlist !) * * - calculation done by blitter (no joke !) * * - waves can be changed with the right mbutton * * * * PS: * * do not try to code in the style of this bobdemo, * * it is just so bad because i fought for every * * piece of raster-time... * * the small green line displays the * * remaining raster-time (not that much !) * * * * (c) '90 by MIC/L4 * ********************************************************* balls = 199 balldaten = $70000+[64*2*200] ballmasken = balldaten+[balls*15*4] anz_tabs = 17 ytable = $60000+[64*2*200] xtable = ytable+[200*2*anz_tabs] shifttable = xtable+[320*2*anz_tabs] bl = 215 pl = 400-bl ;------ macros ----- wblit: macro wblit?0: btst #14,$2(a5) bne.s wblit?0 endm jmp start org $50000 load $50000 d: start: move.l 4.w,a6 lea grafname(pc),a1 jsr -408(a6) move.l d0,a1 move.l 38(a1),oldcopper jsr -414(a6) move.w $dff002,olddma or.w #$8000,olddma move.w $dff01c,oldint or.w #$8000,oldint move.w #$7fff,$dff09a move.w #$7fff,$dff096 bsr.l prog_begin move.l oldcopper(pc),$dff080 move.w #$7fff,$dff09a move.w #$7fff,$dff096 move.l oldcopper(pc),$dff080 clr.w $dff088 move.w olddma(pc),$dff096 move.w oldint(pc),$dff09a rts prog_begin: lea $60000,a0 lea $80000,a1 moveq #0,d0 clr_all: move.l d0,(a0)+ cmp.l a1,a0 blt.s clr_all bsr.l init_balls bsr.l init_clear bsr.l init_curve bsr.l init_customregs lea make_back1(pc),a3 bra.l make_offsets make_back1: move.l #clist,$dff080 clr.w $dff088 move.w #$87c0,$dff096 move.l a7,stack sync: cmp.b #238,$dff006 bne.s sync lea $dff000,a5 lea d(pc),a4 wblit mouse: cmp.b #238,$6(a5) blt.s mouse move.w #0,$180(a5) move.l physbase(pc),a3 move.w #$0100,$40(a5) move.w #24,$66(a5) move.l a3,$54(a5) move.w #bl*64+20,$58(a5) ;mit blitter loeschen lea bl*64(a3),a3 moveq #0,d0 move.l d0,d1 move.l d0,d2 move.l d0,d3 move.l d0,d4 move.l d0,d5 move.l d0,d6 move.l d0,a0 move.l d0,a1 move.l d0,a2 movem.l d0-d6/a0-a2,(a3) clear_proz: movem.l d0-d6/a0-a2,64(a3) clear_proz_list: blk.w [pl-2]*3,0 move.w logbase(pc),d1 move.w physbase(pc),logbase-d(a4) ;lo-wort immer gleich move.w d1,physbase-d(a4) move.w d1,$e0(a5) ;set hi-pointers move.w d1,$e4(a5) movem.l curve_xpt(pc),a0-a2 add_x: lea 2(a0),a0 ;add.w xspeed,a0 add_shift: lea 2(a1),a1 ;add.w shiftspeed,a1 cmp.l #xtable+[320*2],a0 blt.s curves_ok lea -[320*2](a0),a0 ;x-overflow -> shift-overflow lea -[640*2](a1),a1 curves_ok: add_y: lea 2(a2),a2 ;add.w yspeed,a2 cmp.l #ytable+[200*2],a2 blt.s curves2_ok lea -[200*2](a2),a2 curves2_ok: movem.l a0-a2,curve_xpt-d(a4) lea $40(a5),a0 ;hit it !! move.l #$0dfc0000,(a0)+ ;bltcon, a+b verodern moveq #-1,d0 ;=$ffffffff move.l d0,(a0)+ ;bltafwm move.l curve_xmod(pc),$62(a5) ;bmod+amod (xmod,ymod) move.w #12,$66(a5) addq.w #4,a0 ;$48+4 = $4c move.l curve_xpt(pc),(a0)+ ;bpt move.l curve_ypt(pc),(a0)+ ;apt move.l #blit_bobs_rout+6,(a0)+ ;dpt move.w #balls*64+1,(a0) ;blitsize blit_bobs: move.w #$0000,$46(a5) ;bltalwm move.l #[60*$10000]+$10000-2,$60(a5) ;cmod+bmod move.l #[-2*$10000]+60,$64(a5) ;amod+dmod move.l #ballmasken,$50(a5) ;apt move.l #balldaten,$4c(a5) ;bpt lea $40(a5),a0 ;bltcon0+1 lea $48(a5),a2 ;cpt-lo lea $54(a5),a3 ;dpt-lo und blitsize move.w logbase(pc),(a2)+ ;logbase -> cpt-hi move.w logbase(pc),(a3)+ ;logbase -> dpt-hi move.w #15*2*64+2,d1 ;blitsize move.l curve_shiftpt(pc),a1 blit_bobs_rout: move.l 2(a1),(a0) ;offsets werden geaendert move.w #0,d0 ;ziel move.w d0,(a2) ;cpt-lo movem.w d0/d1,(a3) ;dpt-lo und blitsize blit_bobs_list: blk.b blit_bobs_list-blit_bobs_rout*[balls-1],0 blit_bobs_end: btst #10,$16(a5) bne.s no_rightbutton tst.b right_down-d(a4) bne.s no_rightbutton2 ;falls bereits gedrueckt ! lea make_back2(pc),a3 bra.l make_offsets make_back2: st right_down bra.l sync ;neu syncronisieren no_rightbutton: sf right_down-d(a4) no_rightbutton2: move.w #$0f0,$180(a5) btst #6,$bfe001 bne.L mouse move.l stack(pc),a7 rts stack: dc.l 0 right_down: dc.b 0 even st = shifttable xt = xtable yt = ytable curve_pt: dc.l c1 curve_tab: ;st,xt,yt,xmod,ymod,xspeed,yspeed,next_one c1: dc.w 4,8,2,2 dc.l c2 c2: dc.w 2,2,4,6 dc.l c3 c3: dc.w 4,2,4,6 dc.l c4 c4: dc.w 12,0,2,2 dc.l c5 c5: dc.w 18,28,2,2 dc.l c6 c6: dc.w 8,10,4,2 dc.l c7 c7: dc.w 10,8,2,2 dc.l c1 curve_xmod: dc.w 4 curve_ymod: dc.w 8 xspeed: dc.w 4 yspeed: dc.w 2 curve_xpt: dc.l xtable curve_shiftpt: dc.l shifttable curve_ypt: dc.l ytable shiftspeed: dc.w 8 make_offsets: move.l curve_pt(pc),a0 movem.l (a0)+,d0-d2 lea xtable,a0 lea shifttable,a1 lea ytable,a2 movem.l d0-d1/a0-a2,curve_xmod move.l d2,curve_pt move.w xspeed(pc),d0 add.w d0,d0 move.w d0,shiftspeed move.w xspeed(pc),add_x+2 move.w shiftspeed(pc),add_shift+2 move.w yspeed(pc),add_y+2 lea blit_bobs_rout+2(pc),a0 move.w #balls-1,d0 moveq #0,d1 move.w curve_xmod(pc),d2 add.w d2,d2 ;*2 addq.w #4,d2 ;+4 wegen blittermodulo move.w #320*4,d3 moveq #14,d4 make_offl: move.w d1,(a0) add.w d2,d1 add.l d4,a0 ;+14 dbra d0,make_offl jmp (a3) ;zurueck init_clear: lea clear_proz,a0 lea clear_proz_list,a1 lea clear_proz+[[pl-1]*6],a2 ;ende init_clr_l: move.w (a0)+,(a1)+ cmp.l a2,a1 blt.s init_clr_l lea clear_proz+4,a0 move.w #pl-2,d0 moveq #64,d1 init_clr_offs: move.w d1,(a0) add.w #64,d1 addq.w #6,a0 dbra d0,init_clr_offs rts init_curve: lea ytable,a0 moveq #anz_tabs-1,d0 init_cu1: lea y_tab,a1 move.w #200-1,d1 init_cu2: move.w (a1)+,d2 lsl.w #7,d2 ;*128 move.w d2,(a0)+ dbra d1,init_cu2 dbra d0,init_cu1 lea xtable,a0 moveq #anz_tabs-1,d0 init_cu3: lea x_tab,a1 move.w #320-1,d1 init_cu4: move.w (a1)+,(a0)+ dbra d1,init_cu4 dbra d0,init_cu3 lea shifttable,a0 moveq #anz_tabs-1,d0 init_cu5: lea shift_tab,a1 move.w #320-1,d1 init_cu6: move.w (a1)+,d2 move.w d2,(a0)+ ;bltcon 0 and.w #$f000,d2 ;fuer bltcon 1 move.w d2,(a0)+ dbra d1,init_cu6 dbra d0,init_cu5 rts init_balls: lea balldaten,a2 lea ballmasken,a3 move.w #balls-1,d0 init_balls_l: lea ball_dat,a0 lea ball_mask,a1 moveq #15-1,d1 init_balls_l2: move.l (a0)+,(a2)+ ;daten move.l (a1)+,(a3)+ ;masken dbra d1,init_balls_l2 dbra d0,init_balls_l lea blit_bobs_rout(pc),a0 lea blit_bobs_list(pc),a1 lea blit_bobs_end,a2 copy_blit_rout: move.w (a0)+,(a1)+ cmp.l a2,a1 blt.s copy_blit_rout rts grafname: dc.b "graphics.library",0 even oldcopper: dc.l 0 olddma: dc.w 0 oldint: dc.w 0 logbase: dc.l $60000 physbase: dc.l $70000 init_customregs: lea $dff000,a0 move.w #$2981,$8e(a0) move.w #$f1c1,$90(a0) ;screenhoehe,breite move.w #$0038,$92(a0) ;ddf-start move.w #$00d0,$94(a0) ;ddf-stop move.w #128-40,$108(a0) move.w #128-40,$10a(a0) ;screen-modulos move.w #0,$104(a0) ;prioritaet move.w #0,$102(a0) move.w #0,$144(a0) move.w #0,$146(a0) ;sprites aus move.w #$ffff,$2e(a0) ;blits durch copper ! move.w #$000,$180(a0) move.w #$0fe,$182(a0) move.w #$05c,$184(a0) move.w #$017,$186(a0) move.w #$2200,$100(a0) rts clist: c_scpt: dc.l $00e20000 dc.l $00e60040 ;planes dc.l $fffffffe shift_tab: DC.L $9FCABFCA,$EFCA1FCA,$4FCA7FCA,$AFCADFCA,$0FCA3FCA DC.L $6FCA9FCA,$CFCAFFCA,$2FCA5FCA,$7FCAAFCA,$DFCA0FCA DC.L $3FCA5FCA,$8FCABFCA,$EFCA0FCA,$3FCA5FCA,$8FCAAFCA DC.L $DFCAFFCA,$2FCA4FCA,$7FCA9FCA,$BFCADFCA,$0FCA2FCA DC.L $4FCA6FCA,$8FCAAFCA,$CFCAEFCA,$0FCA2FCA,$3FCA5FCA DC.L $7FCA9FCA,$AFCACFCA,$DFCAFFCA,$0FCA1FCA,$3FCA4FCA DC.L $5FCA6FCA,$7FCA8FCA,$9FCAAFCA,$BFCACFCA,$CFCADFCA DC.L $EFCAEFCA,$FFCAFFCA,$FFCA0FCA,$0FCA0FCA,$0FCA0FCA DC.L $1FCA0FCA,$0FCA0FCA,$0FCA0FCA,$FFCAFFCA,$FFCAEFCA DC.L $EFCADFCA,$CFCACFCA,$BFCAAFCA,$9FCA8FCA,$7FCA6FCA DC.L $5FCA4FCA,$3FCA1FCA,$0FCAFFCA,$DFCACFCA,$AFCA9FCA DC.L $7FCA5FCA,$3FCA2FCA,$0FCAEFCA,$CFCAAFCA,$8FCA6FCA DC.L $4FCA2FCA,$0FCADFCA,$BFCA9FCA,$7FCA4FCA,$2FCAFFCA DC.L $DFCAAFCA,$8FCA5FCA,$3FCA0FCA,$EFCABFCA,$8FCA5FCA DC.L $3FCA0FCA,$DFCAAFCA,$7FCA5FCA,$2FCAFFCA,$CFCA9FCA DC.L $6FCA3FCA,$0FCADFCA,$AFCA7FCA,$4FCA1FCA,$EFCABFCA DC.L $9FCA6FCA,$3FCA0FCA,$DFCAAFCA,$7FCA4FCA,$1FCAEFCA DC.L $BFCA8FCA,$5FCA2FCA,$FFCACFCA,$AFCA7FCA,$4FCA1FCA DC.L $EFCACFCA,$9FCA6FCA,$3FCA1FCA,$EFCACFCA,$9FCA7FCA DC.L $4FCA2FCA,$FFCADFCA,$AFCA8FCA,$6FCA4FCA,$1FCAFFCA DC.L $DFCABFCA,$9FCA7FCA,$5FCA3FCA,$1FCAFFCA,$EFCACFCA DC.L $AFCA8FCA,$7FCA5FCA,$4FCA2FCA,$1FCA0FCA,$EFCADFCA DC.L $CFCABFCA,$AFCA9FCA,$8FCA7FCA,$6FCA5FCA,$5FCA4FCA DC.L $3FCA3FCA,$2FCA2FCA,$2FCA1FCA,$1FCA1FCA,$1FCA1FCA DC.L $0FCA1FCA,$1FCA1FCA,$1FCA1FCA,$2FCA2FCA,$2FCA3FCA DC.L $3FCA4FCA,$5FCA5FCA,$6FCA7FCA,$8FCA9FCA,$AFCABFCA DC.L $CFCADFCA,$EFCA0FCA,$1FCA2FCA,$4FCA5FCA,$7FCA8FCA DC.L $AFCACFCA,$EFCAFFCA,$1FCA3FCA,$5FCA7FCA,$9FCABFCA DC.L $DFCAFFCA,$1FCA4FCA,$6FCA8FCA,$AFCADFCA,$FFCA2FCA DC.L $4FCA7FCA,$9FCACFCA,$EFCA1FCA,$3FCA6FCA,$9FCACFCA DC.L $EFCA1FCA,$4FCA7FCA,$AFCACFCA,$FFCA2FCA,$5FCA8FCA DC.L $BFCAEFCA,$1FCA4FCA,