* BLiTTER BASE ADDRESS blitter equ $FF8A00 * BLiTTER REGISTER OFFSETS halftone equ 0 src_xinc equ 32 src_yinc equ 34 src_addr equ 36 endmask1 equ 40 endmask2 equ 42 endmask3 equ 44 dst_xinc equ 46 dst_yinc equ 48 dst_addr equ 50 x_count equ 54 y_count equ 56 hop equ 58 op equ 59 line_num equ 60 skew equ 61 vbl_vec: equ $70 vertflag: equ $0100 stmodes: equ $0080 overscan: equ $0040 pal: equ $0020 vga: equ $0010 tv: equ $0000 col80: equ $0008 col40: equ $0000 numcols: equ $0007 bps16: equ 4 bps8: equ 3 bps4: equ 2 bps2: equ 1 bps1: equ 0 mybit: equ %0000001000000000 mapw: equ 256 maph: equ 256 sw: equ 320 sh: equ 240 nplanes: equ 8 ***************************************************************** * Falcon Slide Demo. * * Version 1.0 * ***************************************************************** include 'fequates.s' start: move.l 4(a7),a3 base page move.l #mystack,a7 move.l $c(a3),d0 text len add.l $14(a3),d0 data len add.l $1c(a3),d0 BSS len add.l #$100,d0 basepage move.l d0,-(sp) move.l a3,-(sp) clr.w -(sp) move.w #$4a,-(sp) trap #1 shrink memory lea 12(sp),sp clr.l -(sp) ;as usual the first thing to move.w #$20,-(sp) ;do is go into supervisor mode trap #1 addq.l #6,sp move.l d0,savesp bsr putrout bsr putvbl bsr setupscreen bsr savecolors bsr clearscreens bsr setpal bsr doblock mainloop: move.l #array1,source move.l #array2,dest bsr cycle bsr showset move.l #array2,source move.l #array1,dest bsr cycle bsr showset mainloop2: bsr keyboard bra mainloop cnt: dc.l 0 avg: dc.w 0 m: dc.w 0 s: dc.l 0 d: dc.l 0 width: equ 80 height: equ 44 source: dc.l 0 dest: dc.l 0 ***************************************************************** * Pass in source the address of the first set * * and dest the address of the second set * ***************************************************************** cycle: move.l source,a0 add.l #(width)+1,a0 ;s=source+width+1 move.l dest,a1 add.l #(width*2)+1,a1 ;d=des+width+1 moveq #0,d7 cycleloop1: move.w #width-2-1,d6 cycleloop2: moveq #0,d0 ;d0 for avg moveq #0,d1 move.b -width-1(a0),d1 add.w d1,d0 moveq #0,d1 move.b -width(a0),d1 add.w d1,d0 moveq #0,d1 move.b -width+1(a0),d1 add.w d1,d0 moveq #0,d1 move.b -1(a0),d1 add.w d1,d0 moveq #0,d1 move.b 1(a0),d1 add.w d1,d0 moveq #0,d1 move.b width-1(a0),d1 add.w d1,d0 moveq #0,d1 move.b width(a0),d1 add.w d1,d0 moveq #0,d1 move.b width+1(a0),d1 add.w d1,d0 move.w d0,d1 ;m=avg&7 add.w d6,d1 and.w #7,d1 asr.w #3,d0 ;avg>>=3 and.w #3,d1 bne nocool cmpi.w #5,d7 ;if (cnt<=4*width) bgt nc1 sub.b #4,d0 ;avg-- bra nocool nc1: tst.b d0 ;else if(avg>0) ble nocool subq.b #1,d0 ;avg-- nocool: move.b d0,(a1)+ ;d[0]=avg also does d+=1 addq.l #1,a0 ;s+=1 dbf d6,cycleloop2 addq.l #2,a0 addq.l #2,a1 addq.w #1,d7 cmpi.w #height-3,d7 ble cycleloop1 rts doblock: move.l viewscreen1,a0 add.l #320*60,a0 add.l #100*16,a0 rept 8 move.w #-1,(a0)+ endr rts showset: move.l viewscreen1,a0 move.l dest,a1 add.l #width*height,a1 move.l #height-4-1,d7 move.w #%1111000000000000,d5 ;our pixel plotting mask move.w #%0000111111111111,d4 ;our pixel plotting mask ssl1: move.l #(width/4)-1,d6 ssl2: move.b -(a1),d0 bsr plot256 ror.w #4,d5 ror.w #4,d4 move.b -(a1),d0 bsr plot256 ror.w #4,d5 ror.w #4,d4 move.b -(a1),d0 bsr plot256 ror.w #4,d5 ror.w #4,d4 move.b -(a1),d0 bsr plot256 ror.w #4,d5 ror.w #4,d4 add.l #16,a0 dbf d6,ssl2 add.l #320*2,a0 dbf d7,ssl1 rts plot256: and.w d4,(a0) and.w d4,2(a0) and.w d4,4(a0) and.w d4,6(a0) and.w d4,8(a0) and.w d4,10(a0) and.w d4,(320*1)(a0) and.w d4,(320*1)+2(a0) and.w d4,(320*1)+4(a0) and.w d4,(320*1)+6(a0) and.w d4,(320*1)+8(a0) and.w d4,(320*1)+10(a0) and.w d4,(320*2)(a0) and.w d4,(320*2)+2(a0) and.w d4,(320*2)+4(a0) and.w d4,(320*2)+6(a0) and.w d4,(320*2)+8(a0) and.w d4,(320*2)+10(a0) and.w d4,(320*3)(a0) and.w d4,(320*3)+2(a0) and.w d4,(320*3)+4(a0) and.w d4,(320*3)+6(a0) and.w d4,(320*3)+8(a0) and.w d4,(320*3)+10(a0) pl1: btst #0,d0 beq pl2 or.w d5,(a0) or.w d5,(320*1)(a0) or.w d5,(320*2)(a0) or.w d5,(320*3)(a0) pl2: btst #1,d0 beq pl3 or.w d5,2(a0) or.w d5,(320*1)+2(a0) or.w d5,(320*2)+2(a0) or.w d5,(320*3)+2(a0) pl3: btst #2,d0 beq pl4 or.w d5,4(a0) or.w d5,(320*1)+4(a0) or.w d5,(320*2)+4(a0) or.w d5,(320*3)+4(a0) pl4: btst #3,d0 beq pl5 or.w d5,6(a0) or.w d5,(320*1)+6(a0) or.w d5,(320*2)+6(a0) or.w d5,(320*3)+6(a0) pl5: btst #4,d0 beq pl6 or.w d5,8(a0) or.w d5,(320*1)+8(a0) or.w d5,(320*2)+8(a0) or.w d5,(320*3)+8(a0) pl6: btst #5,d0 beq pl7 or.w d5,10(a0) or.w d5,(320*1)+10(a0) or.w d5,(320*2)+10(a0) or.w d5,(320*3)+10(a0) pl7: rts move.l #$111,d0 movec d0,cacr move.l viewscreen1,a0 * add.l #(sw*2)*100,a0 move.l dest,a1 add.l #width*height,a1 * lea clut,a2 move.l #height-4-1,d7 ssloop1: move.l #width-1,d6 ssloop2: moveq #0,d0 move.b -(a1),d0 add.w d0,d0 move.w (a2,d0.w),d1 move.w d1,d2 move.w d2,d3 move.w d3,d4 movem.w d1-d4,(a0) movem.w d1-d4,sw*2(a0) movem.w d1-d4,sw*4(a0) movem.w d1-d4,sw*6(a0) addq.l #8,a0 dbf d6,ssloop2 add.l #(sw*2)*3,a0 dbf d7,ssloop1 move.l #$3111,d0 movec d0,cacr * bsr showlogo rts showlogo: move.l viewscreen1,a1 lea mp,a0 rsreset spad: rs.l 1 spyincs: rs.w 1 spyincd: rs.w 1 spw: rs.w 1 sph: rs.w 1 spx: rs.w 1 spy: rs.w 1 dosprite: * bsr waitvbl lea mpsprite,a5 lea blitter,a6 move.w mx,spx(a5) move.w my,spy(a5) putsprite: move.l spad(a5),a0 move.l viewscreen1,a1 move.w spx(a5),d0 ;get last x for restore add.w d0,d0 add.w d0,a1 move.w spy(a5),d0 ;get last y for restore mulu.w #640,d0 add.l d0,a1 .waitblit: btst #7,line_num(a6) bne .waitblit pppart1: move.l a0,src_addr(a6) move.l a1,dst_addr(a6) move.w #2,src_xinc(a6) move.w #2,dst_xinc(a6) move.w spyincs(a5),src_yinc(a6) move.w spyincd(a5),dst_yinc(a6) move.w spw(a5),x_count(a6) move.w sph(a5),y_count(a6) move.w #-1,endmask1(a6) move.w #-1,endmask2(a6) move.w #-1,endmask3(a6) move.b #0,skew(a6) move.b #$3,op(a6) move.b #2,hop(a6) * bset #6,line_num(a6) bset #7,line_num(a6) .waitblit: btst #7,line_num(a6) bne .waitblit rts * y x mpsprite: dc.l mp+(0*(2*sw))+(0*2) ;address of ball dc.w 2 ;src y inc dc.w (sw*2)-(100*2)+2 ;dst y inc dc.w 100 ;width dc.w 72 ;height dc.w 0,0 ;x/y location waitvbl: move.w #1,vblflag wvbloop: tst.w vblflag bpl wvbloop rts swapnshow: move.l viewscreen1,d0 move.l viewscreen2,viewscreen1 move.l d0,viewscreen2 bsr waitvbl move.l viewscreen1,d0 move.l d0,d1 move.l d1,d2 lsr.l #8,d0 lsr.l #8,d0 move.w d0,vid_bh lsr.l #8,d1 and.l #$000000ff,d1 move.w d1,vid_bm and.l #$000000ff,d2 move.w d2,vid_bl rts ********************************************************* * Takes an x and y in d0,d1 and returns new x y * * in d0,d1 rotated d2 degrees around 0,0. * * Note, x,y are from origin. * ********************************************************* rotatexy: bsr sincos moveq #0,d4 moveq #0,d5 move.w d0,d4 muls d3,d4 ;cos*x1 move.w d1,d5 muls d2,d5 ;sin*y1 lsl.l #2,d4 lsl.l #2,d5 swap d4 swap d5 sub.w d5,d4 move.w d4,d6 ;new x moveq #0,d4 moveq #0,d5 move.w d1,d4 muls d3,d4 ;cos*y1 move.w d0,d5 muls d2,d5 ;sin*x1 lsl.l #2,d4 lsl.l #2,d5 swap d4 swap d5 add.w d5,d4 move.w d4,d1 ;new y move.w d6,d0 rts ********************************************************* * Takes angle in d2 and returns sin in d2 * * and cos in d3 * ********************************************************* sincos: tst.w d2 bpl.s noaddi add.w #360,d2 noaddi: lea sintab,a1 move.l d2,d3 lsl.w #1,d2 move.w (a1,d2.w),d2 ;d2 is sin cmp.w #270,d3 blt.s plus9 sub.w #270,d3 bra.s sendsin plus9: add.w #90,d3 sendsin: lsl.w #1,d3 move.w (a1,d3.w),d3 ;d3 is cos rts section data sintab: dc.w 0,286,572,857,1143,1428,1713,1997,2280 dc.w 2563,2845,3126,3406,3686,3964,4240,4516 dc.w 4790,5063,5334,5604,5872,6138,6402,6664 dc.w 6924,7182,7438,7692,7943,8192,8438,8682 dc.w 8923,9162,9397,9630,9860,10087,10311,10531 dc.w 10749,10963,11174,11381,11585,11786,11982,12176 dc.w 12365,12551,12733,12911,13085,13255,13421,13583 dc.w 13741,13894,14044,14189,14330,14466,14598,14726 dc.w 14849,14962,15082,15191,15296,15396,15491,15582 dc.w 15668,15749,15826,15897,15964,16026,16083,16135 dc.w 16182,16225,16262,16294,16322,16344,16362,16374 dc.w 16382,16384 dc.w 16382,16374,16362,16344,16322,16294,16262,16225 dc.w 16182 dc.w 16135,16083,16026,15964,15897,15826,15749,15668 dc.w 15582,15491,15396,15296,15191,15082,14962,14849 dc.w 14726,14598,14466,14330,14189,14044,13894,13741 dc.w 13583,13421,13255,13085,12911,12733,12551,12365 dc.w 12176,11982,11786,11585,11381,11174,10963,10749 dc.w 10531,10311,10087,9860,9630,9397,9162,8923 dc.w 8682,8438,8192,7943,7692,7438,7182,6924 dc.w 6664,6402,6138,5872,5604,5334,5063,4790 dc.w 4516,4240,3964,3686,3406,3126,2845,2563 dc.w 2280,1997,1713,1428,1143,857,572,286,0 dc.w -286,-572,-857,-1143,-1428,-1713,-1997,-2280 dc.w -2563,-2845,-3126,-3406,-3686,-3964,-4240,-4516 dc.w -4790,-5063,-5334,-5604,-5872,-6138,-6402,-6664 dc.w -6924,-7182,-7438,-7692,-7943,-8192,-8438,-8682 dc.w -8923,-9162,-9397,-9630,-9860,-10087,-10311,-10531 dc.w -10749,-10963,-11174,-11381,-11585,-11786,-11982 dc.w -12176 dc.w -12365,-12551,-12733,-12911,-13085,-13255,-13421 dc.w -13583 dc.w -13741,-13894,-14044,-14189,-14330,-14466,-14598 dc.w -14726 dc.w -14849,-14962,-15082,-15191,-15296,-15396,-15491 dc.w -15582 dc.w -15668,-15749,-15826,-15897,-15964,-16026,-16083 dc.w -16135 dc.w -16182,-16225,-16262,-16294,-16322,-16344,-16362 dc.w -16374,-16382,-16384 dc.w -16382,-16374,-16362,-16344,-16322,-16294,-16262 dc.w -16225,-16182 dc.w -16135,-16083,-16026,-15964,-15897,-15826,-15749 dc.w -15668 dc.w -15582,-15491,-15396,-15296,-15191,-15082,-14962 dc.w -14849 dc.w -14726,-14598,-14466,-14330,-14189,-14044,-13894 dc.w -13741 dc.w -13583,-13421,-13255,-13085,-12911,-12733,-12551 dc.w -12365 dc.w -12176,-11982,-11786,-11585,-11381,-11174,-10963 dc.w -10749 dc.w -10531,-10311,-10087,-9860,-9630,-9397,-9162,-8923 dc.w -8682,-8438,-8192,-7943,-7692,-7438,-7182,-6924 dc.w -6664,-6402,-6138,-5872,-5604,-5334,-5063,-4790 dc.w -4516,-4240,-3964,-3686,-3406,-3126,-2845,-2563 dc.w -2280,-1997,-1713,-1428,-1143,-857,-572,-286,0 ***************************************** * number in d0.l * * d1.l is base * * d2,x cursor * * d3,y cursor * ***************************************** prtnum: movem.l d0/d1,-(sp) lea posstring,a0 add.w #32,d3 move.b d3,2(a0) add.w #32,d2 move.b d2,3(a0) move.l a0,-(sp) move.w #9,-(sp) trap #1 addq.l #6,sp movem.l (sp)+,d0/d1 lea linebuffer,a0 clr.l (a0)+ clr.l (a0)+ clr.l (a0)+ clr.l (a0)+ clr.l (a0)+ loop1: divu d1,d0 swap d0 addi #'0',d0 cmpi.w #'9',d0 ble.s ok addq.w #7,d0 ok: move.b d0,-(a0) clr d0 swap d0 bne loop1 loop2: move.l a0,-(sp) move.w #9,-(sp) trap #1 addq.l #6,sp rts clearnums: lea clearstring,a0 add.w #32,d3 move.b d3,2(a0) * move.b d3,10(a0) add.w #32,d2 move.b d2,3(a0) * move.b d2,11(a0) move.l a0,-(sp) move.w #9,-(sp) trap #1 addq.l #6,sp rts linebuffer: ds.l 5 digits: dc.b 0 posstring: dc.b 27,'Y',0,0,0,0 clearstring: dc.b 27,'Y',0,0,' ',0,0 even syncmode: dc.w 1 waitkey: move.w #1,-(sp) trap #1 addq.l #2,sp rts keyboard: move.w #$ff,-(sp) move.w #$6,-(sp) trap #1 addq.l #4,sp tst.l d0 beq keyback swap d0 cmp.b #16,d0 *space beq exit *yes/no spacekey: cmpi.b #$39,d0 bne keyback lea array1,a0 add.l #width*20+20,a0 rept 40 move.b #234,(a0)+ endr rts keyback: rts pause: move.w #7,-(sp) trap #1 addq.l #2,sp rts clearscreens: lea blitter,a6 .waitblit: btst #7,line_num(a6) bne .waitblit move.l viewscreen1,a0 move.l viewscreen2,a1 move.l a0,dst_addr(a6) move.w #2,dst_xinc(a6) move.w #2,dst_yinc(a6) move.w #sw,x_count(a6) move.w #sh,y_count(a6) move.w #-1,endmask1(a6) move.w #-1,endmask2(a6) move.w #-1,endmask3(a6) move.b #0,skew(a6) move.b #$0,op(a6) move.b #2,hop(a6) bset #6,line_num(a6) bset #7,line_num(a6) nextscreen: .waitblit: btst #7,line_num(a6) bne .waitblit move.l a1,dst_addr(a6) move.w #2,dst_xinc(a6) move.w #2,dst_yinc(a6) move.w #sw,x_count(a6) move.w #sh,y_count(a6) bset #6,line_num(a6) bset #7,line_num(a6) rts plotuv: movem.l d0/d1/a1,-(sp) moveq #0,d0 move.l d0,d1 * move.l vu,d0 lsl.l #2,d0 swap d0 ext.l d0 add.l d0,d0 * move.l vv,d1 lsl.l #2,d1 swap d1 ext.l d1 * mulu #mapw*2,d1 lsl.l #8,d1 lsl.l #1,d1 add.l d1,d0 add.l d0,a1 move.w (a1),(a0)+ movem.l (sp)+,d0/d1/a1 rts buttondat: dc.w 0 mx: dc.w 0 my: dc.w 0 *************puts my mouse interupt in***************** putrout:move.w #34,-(sp) trap #14 addq.l #2,sp move.l d0,a0 move.l 16(a0),oldmouse move.l #myrout,16(a0) rts lastb: dc.w -1 mousehasgoneup: dc.w 0 **************my ubeut mouse interupt******************* myrout: movem.l d0-d2/a0-a1,-(sp) moveq #0,d0 move.b (a0),d0 cmpi.b #$fa,d0 bne myr1 move.w #1,buttondat bra myrxy myr1: cmpi.b #$f9,d0 bne myr2 move.w #2,buttondat bra myrxy myr2: cmpi.b #$fb,d0 bne myr3 move.w #3,buttondat bra myrxy myr3: move.w #1,mousehasgoneup move.w #0,buttondat myrxy: moveq #0,d0 move.b 1(a0),d0 ext.w d0 moveq #0,d1 move.b 2(a0),d1 ext.w d1 add.w d0,mx add.w d1,my * sub.w d1,my2 myr4: move.w mx,d0 move.w my,d1 bsr extra move.w d0,mx move.w d1,my movem.l (sp)+,d0-d2/a0-a1 rts extra: cmpi.w #mminx,d0 bge extra1 move.w #mminx,d0 bra extra2 extra1: cmpi.w #mmaxx,d0 ble extra2 move.w #mmaxx,d0 extra2: cmpi.w #mminy,d1 bge extra3 move.w #mminy,d1 bra extra4 extra3: cmpi.w #mmaxy,d1 ble extra4 move.w #mmaxy,d1 extra4: rts mminx: equ 20 mmaxx: equ sw mminy: equ 20 mmaxy: equ sh putvbl: move.l vbl_vec,vblt+2 ;set up vbl handler move.l vbl_vec,oldvblvec move.l #vbl_handler,vbl_vec rts halfframe: dc.w 0 ddl: dc.w -1 vbl_handler: move.w #-1,vblflag vblt: jmp $0.L exit: move.w #34,-(sp) trap #14 addq.l #2,sp move.l d0,a0 move.l oldmouse,16(a0) lea memlist,a6 demem: move.l (a6)+,d0 bmi nomoremem beq demem bsr deallocate bra demem nomoremem: move.l oldvblvec,vbl_vec bsr restorecolors move.w savemode,-(sp) move.w #3,-(sp) move.l savescreen,-(sp) move.l savescreen,-(sp) move.w #5,-(sp) trap #14 add.l #14,sp move.l savesp,-(sp) move.w #$20,-(sp) trap #1 addq.l #6,sp clr.w -(sp) trap #1 deallocate: move.l d0,-(sp) move.w #$49,-(sp) trap #1 addq.l #6,sp rts clearmem: move.l #(sw*sh),d0 subq.l #1,d0 moveq #0,d1 cml: move.w d1,(a0)+ subq.l #1,d0 bpl cml rts ********************************************************* * One call does it all * * Allocates memory for 3 screens * * targa load/hold area is internal. * * Then sets all the hardware stuff to create * * a 384*480 16bit screen * ********************************************************* setupscreen: move.l #(((sw/16)*nplanes*sh)*2)+8,-(sp) ;thats 1 screen size move.w #$48,-(sp) trap #1 addq.l #6,sp tst.l d0 bmi exit move.l d0,savemem1 and.l #$fffffffc,d0 move.l d0,viewscreen1 move.l d0,a0 bsr clearmem move.l #(((sw/16)*nplanes*sh)*2)+8,-(sp) ;thats 1 screen size move.w #$48,-(sp) trap #1 addq.l #6,sp tst.l d0 bmi exit move.l d0,savemem2 and.l #$fffffffc,d0 move.l d0,viewscreen2 move.w #2,-(sp) trap #14 addq.l #2,sp move.l d0,savescreen move.w #-1,-(sp) move.w #88,-(sp) trap #14 addq.l #4,sp move.w d0,savemode move.w #vertflag|vga|col40|bps8,-(sp) move.w #3,-(sp) move.l viewscreen1,-(sp) move.l viewscreen1,-(sp) move.w #5,-(sp) trap #14 add.l #14,sp * move.w #2,-(sp) * trap #14 * addq.l #2,sp * move.l d0,savescreen2 rts ********************************************************* * copy whole screen with blitter * * set screen to copy to in a1 * ********************************************************* copywhole: move.l savescreen2,a0 * move.l viewscreen,a1 lea blitter,a6 .waitblit: btst #7,line_num(a6) bne .waitblit move.l a0,src_addr(a6) move.l a1,dst_addr(a6) move.w #2,src_xinc(a6) move.w #2,dst_xinc(a6) move.w #2,src_yinc(a6) move.w #2,dst_yinc(a6) move.w #sw,x_count(a6) move.w #sh,y_count(a6) move.w #-1,endmask1(a6) move.w #-1,endmask2(a6) move.w #-1,endmask3(a6) move.b #0,skew(a6) move.b #$3,op(a6) move.b #2,hop(a6) bset #6,line_num(a6) bset #7,line_num(a6) rts doscreens: * lea scrnback,a0 * move.l savescreen2,a1 * jsr ice_unpack * move.l viewscreen1,a1 * bsr copywhole * move.l viewscreen2,a1 * bsr copywhole * rts ;********************************************* Unpackroutine von ICE-PACK ; assemble with Devpac or any other Assembler ; length of this unpacking routine: 294 bytes ; a0 = address of packed data ; a1 = address of unpacked data ice_unpack: movem.l d0-a6,-(sp) bsr ice04 cmpi.l #'Ice!',d0 ; Is file packed? bne ice03 ; no, leave this routine bsr ice04 lea -8(a0,d0.l),a5 bsr ice04 * move.l d0,(sp) movea.l a1,a4 movea.l a1,a6 adda.l d0,a6 movea.l a6,a3 move.b -(a5),d7 bsr ice06 ice03: movem.l (sp)+,d0-a6 rts ice04: moveq #3,d1 ice05: lsl.l #8,d0 move.b (a0)+,d0 dbra d1,ice05 rts ice06: bsr ice0a bcc ice09 moveq #0,d1 bsr ice0a bcc ice08 lea ice17(pc),a1 moveq #4,d3 ice07: move.l -(a1),d0 bsr ice0c swap d0 cmp.w d0,d1 dbne d3,ice07 add.l 20(a1),d1 ice08: move.b -(a5),-(a6) dbra d1,ice08 ice09: cmpa.l a4,a6 bgt ice0f rts ice0a: add.b d7,d7 bne ice0b move.b -(a5),d7 addx.b d7,d7 ice0b: rts ice0c: moveq #0,d1 ice0d: add.b d7,d7 bne ice0e move.b -(a5),d7 addx.b d7,d7 ice0e: addx.w d1,d1 dbra d0,ice0d rts ice0f: lea ice18(pc),a1 moveq #3,d2 ice10: bsr ice0a dbcc d2,ice10 moveq #0,d4 moveq #0,d1 move.b 1(a1,d2.w),d0 ext.w d0 bmi ice11 bsr ice0c ice11: move.b 6(a1,d2.w),d4 add.w d1,d4 beq ice13 lea ice19(pc),a1 moveq #1,d2 ice12: bsr ice0a dbcc d2,ice12 moveq #0,d1 move.b 1(a1,d2.w),d0 ext.w d0 bsr ice0c add.w d2,d2 add.w 6(a1,d2.w),d1 bpl ice15 sub.w d4,d1 bra ice15 ice13: moveq #0,d1 moveq #5,d0 moveq #-1,d2 bsr ice0a bcc ice14 moveq #8,d0 moveq #$3f,d2 ice14: bsr ice0c add.w d2,d1 ice15: lea 2(a6,d4.w),a1 adda.w d1,a1 move.b -(a1),-(a6) ice16: move.b -(a1),-(a6) dbra d4,ice16 bra ice06 DC.B $7f,$ff,$00,$0e,$00,$ff,$00,$07 DC.B $00,$07,$00,$02,$00,$03,$00,$01 DC.B $00,$03,$00,$01 ice17: DC.B $00,$00,$01,$0d,$00,$00,$00,$0e DC.B $00,$00,$00,$07,$00,$00,$00,$04 DC.B $00,$00,$00,$01 ice18: DC.B $09,$01,$00,$ff,$ff,$08,$04,$02 DC.B $01,$00 ice19: DC.B $0b,$04,$07,$00,$01,$1f,$ff,$ff DC.B $00,$1f even section data savecolors: pea savedcolors move.w #256,-(sp) move.w #0,-(sp) move.w #94,-(sp) trap #14 add.l #10,sp rts restorecolors: pea savedcolors ;color array move.w #256,-(sp) ;number to set move.w #0,-(sp) ;index to start at move.w #93,-(sp) trap #14 add.l #10,sp rts setpal: lea clut1,a0 move.w #256,numcol bsr dopal rts ************************************************* * Requires address of pal dat * * in a0 and num cols in d0 * ************************************************* dopal: movem.l d0-a6,-(sp) move.l a0,-(sp) ;color array move.w numcol,-(sp) ;number to set move.w #0,-(sp) ;index to start at move.w #93,-(sp) trap #14 add.l #10,sp movem.l (sp)+,d0-a6 rts clut1: dc.b 0,0*4,0*4,0*4,0,0*4,1*4,1*4,0,0*4,4*4,5*4,0,0*4,7*4,9*4 dc.b 0,0*4,8*4,11*4,0,0*4,9*4,12*4,0,15*4,6*4,8*4,0,25*4,4*4,4*4 dc.b 0,33*4,3*4,3*4,0,40*4,2*4,2*4,0,48*4,2*4,2*4,0,55*4,1*4,1*4 dc.b 0,63*4,0*4,0*4,0,63*4,0*4,0*4,0,63*4,3*4,0*4,0,63*4,7*4,0*4 dc.b 0,63*4,10*4,0*4,0,63*4,13*4,0*4,0,63*4,16*4,0*4,0,63*4,20*4,0*4 dc.b 0,63*4,23*4,0*4,0,63*4,26*4,0*4,0,63*4,29*4,0*4,0,63*4,33*4,0*4 dc.b 0,63*4,36*4,0*4,0,63*4,39*4,0*4,0,63*4,39*4,0*4,0,63*4,40*4,0*4 dc.b 0,63*4,40*4,0*4,0,63*4,41*4,0*4,0,63*4,42*4,0*4,0,63*4,42*4,0*4 dc.b 0,63*4,43*4,0*4,0,63*4,44*4,0*4,0,63*4,44*4,0*4,0,63*4,45*4,0*4 dc.b 0,63*4,45*4,0*4,0,63*4,46*4,0*4,0,63*4,47*4,0*4,0,63*4,47*4,0*4 dc.b 0,63*4,48*4,0*4,0,63*4,49*4,0*4,0,63*4,49*4,0*4,0,63*4,50*4,0*4 dc.b 0,63*4,51*4,0*4,0,63*4,51*4,0*4,0,63*4,52*4,0*4,0,63*4,53*4,0*4 dc.b 0,63*4,53*4,0*4,0,63*4,54*4,0*4,0,63*4,55*4,0*4,0,63*4,55*4,0*4 dc.b 0,63*4,56*4,0*4,0,63*4,57*4,0*4,0,63*4,57*4,0*4,0,63*4,58*4,0*4 dc.b 0,63*4,58*4,0*4,0,63*4,59*4,0*4,0,63*4,60*4,0*4,0,63*4,60*4,0*4 dc.b 0,63*4,61*4,0*4,0,63*4,62*4,0*4,0,63*4,62*4,0*4,0,63*4,63*4,0*4 rept 200 dc.b 0,255,255,255 endr viewscreen2: dc.l -1 viewscreen1: dc.l -1 memlist: savemem1: dc.l 0 savemem2: dc.l 0 savemem3: dc.l 0 dc.l -1 ;end of mem list flag soundmem: dc.l 0 howlong: dc.l 0 handles: dc.w 0 array1: dcb.b width*height,0 array2: dcb.b width*height,0 mp: incbin 'mp.img' even SECTION BSS ds.l 1000 mystack: ds.w 1 ;stacks go backwards savedcolors: ds.b 256*4 dummy: ds.w 1 color: ds.w 1 pixelx: ds.w 1 pixely: ds.w 1 savesp: ds.l 1 time: ds.l 1 frames: ds.l 1 blitx: ds.l 1 blity: ds.l 1 picsource: ds.l 1 expansion: ds.w 1 oldmouse: ds.l 1 whichpic: ds.l 1 frame: ds.l 1 whicheffect: ds.l 1 oldvblvec: ds.l 1 vblflag: ds.w 1 savescreen: ds.l 1 savescreen2: ds.l 1 savemode: ds.w 1 save114: ds.l 1 mastervol: ds.w 1 bufferword: ds.w 1 elipseend: ds.l 1 mapx: ds.w 1 mapy: ds.w 1 numcol: ds.w 1