; ************************************************************************** ; This is the source of DESKTOP.ACC, a program that changes the normal gray ; background with a Degas P?3 file. This source is public domain, but I ; would appreciate it very much if a program that uses (part) of this ; source respects the name of the author! ; ************************************************************************** ; This source is written for Megamax C, with the inline assembly. ; ************************************************************************** ; Noud van Kruysbergen ; N.I.C.I. ; P.O. Box 9104 ; 6500 HE Nijmegen ; The Netherlands ; email: kruysbergen@hnykun53.bitnet ; ************************************************************************** #include #include #include #include int status=1; int handle; int menu_id,msgbf[8]; int i,j; long l,picstart,bufcount,piccount; static long _oldgem(); static long _newgem(); static int _style(),_interior(),_mode(); extern int gl_apid; static long _buffer(); long buffer; static int _clipx0(),_clipy0(),_clipx1(),_clipy1(); char path[50],file[14]; char t[70]; char newdta[44]; newroutines() { asm { dc.l 0x58425241 dc.l 0x4e5f4450 dc.l 0L _newgem: cmpi.w #115,D0 bne gemquit movem.l D0-A3,-(A7) move.l D1,A0 move.l (A0),A0 move.w (A0),D0 cmpi.w #114,D0 bne nofill lea _interior,A0 move.w (A0),D0 cmpi.w #2,D0 bne gemrest lea _style,A0 move.w (A0),D0 cmpi.w #4,D0 bne gemrest lea _mode,A0 move.w (A0),D0 beq gemrest move.l D1,A0 move.l 8(A0),A0 move.w (A0)+,D0 bne gemrest move.w (A0)+,D0 cmpi.w #19,D0 beq menu tst.w D0 bne gemrest menu: move.w (A0)+,D0 cmpi.w #639,D0 bne gemrest move.w (A0),D0 cmpi.w #399,D0 bne gemrest move.l 0x44e,A1 ; A1: screenadress move.w _clipy0,D0 move.w D0,D2 ; D2: y0 muls #80,D0 adda.l D0,A1 ; A1: screenadress + y0 offset lea _buffer,A0 move.l (A0),A0 ; A0: pictureadress adda.l D0,A0 ; A0: pictureadress + y0 offset move.w _clipy1,D0 sub.w D2,D0 move.w D0,D2 ; D2: total number of lines move.w _clipx0,D3 ; D3: x0 move.w D3,D7 ext.l D7 divs #8,D7 move.w D7,D3 adda.l D3,A0 adda.l D3,A1 ; D3: x0/8 swap D7 move.w D7,D4 ; D4: x0%8 move.w _clipx1,D5 addq.w #1,D5 ; D5: x1 move.w D5,D7 ext.l D7 divs #8,D7 move.w D7,D5 ; D5: x1/8 swap D7 move.w D7,D6 ; D6: x1%8 move.l D5,D0 sub.l D3,D0 bne label3 move.w D6,D7 subi.w #8,D7 neg.w D7 move.b #-1,D3 lsr.b D7,D3 lsl.b D7,D3 lsl.b D4,D3 lsr.b D4,D3 loop2: move.b D3,D5 move.b (A0),D7 and.b D5,D7 not.b D5 and.b (A1),D5 add.b D5,D7 move.b D7,(A1) adda.l #80,A0 adda.l #80,A1 dbf D2,loop2 bra selfok label3: subq.w #1,D0 tst.w D4 seq D5 beq yloop tst.w D0 sne D5 beq yloop subq.w #1,D0 ; first incomplete byte yloop: move.l A0,A2 move.l A1,A3 tst.w D4 beq nostart move.b (A2)+,D3 move.b #-1,D7 lsr.b D4,D7 and.b D7,D3 not.b D7 and.b (A3),D7 ; D1 contains lowest picturebits, D7 highest backgroundbits add.b D3,D7 move.b D7,(A3)+ nostart: move.w D0,D7 tst.w D5 beq endbyte xloop: move.b (A2)+,(A3)+ dbf D7,xloop ; last incomplete byte endbyte: tst.w D6 beq no_end move.b (A2)+,D3 move.b #-1,D7 lsr.b D6,D7 not.b D7 and.b D7,D3 not.b D7 and.b (A3),D7 add.b D3,D7 move.b D7,(A3) no_end: adda.l #80,A0 adda.l #80,A1 label1: dbf D2,yloop selfok: movem.l (A7)+,D0-A3 rte nofill: move.l D1,A0 move.l 4(A0),A0 move.w (A0),D2 cmpi.w #23,D0 bne nointerior lea _interior,A0 move.w D2,(A0) bra gemrest nointerior:cmpi.w #24,D0 bne nostyle lea _style,A0 move.w D2,(A0) bra gemrest nostyle: cmpi.w #129,D0 bne gemrest lea _mode,A0 move.w D2,(A0) beq gemrest move.l D1,A0 move.l 8(A0),A0 lea _clipx0,A1 move.w (A0)+,(A1) lea _clipy0,A1 move.w (A0)+,(A1) lea _clipx1,A1 move.w (A0)+,(A1) lea _clipy1,A1 move.w (A0),(A1) gemrest: movem.l (A7)+,D0-A3 gemquit: move.l _oldgem,-(A7) rts _oldgem: dc.l 0L _buffer: dc.l 0L _style: dc.w 0 _interior:dc.w 0 _mode: dc.w 0 _clipx0: dc.w 0 _clipy0: dc.w 0 _clipx1: dc.w 0 _clipy1: dc.w 0 } } Readfile() { handle=-1; strcpy(t,path); j=0; while(t[j++]!='*' && j<70); if (j<70) { path[j]=0; t[--j]=0; strcat(path,".P?3"); strcat(t,file); if ((handle=Fopen(t,0))>=0) { Fseek(34L,handle,0); j=strlen(file); if (file[--j]=='3' && file[--j]=='C') { l=Fsetdta(newdta); Fsfirst(t,0); Fsetdta(l); l=*(long *)(newdta+26); if (piccount=picstart=Malloc(l)) { l=Fread(handle,l,picstart); bufcount=buffer; do { asm { move.l piccount(A4),A0 move.b (A0),D0 ext.w D0 and.w #0xff,D0 move.w D0,j(A4) addq.l #1,piccount(A4) } if (j<128) { asm { move.l bufcount(A4),A2 move.l piccount(A4),A1 move.w j(A4),D0 pic1loop: move.b (A1)+,(A2)+ dbf D0,pic1loop move.l A1,piccount(A4) move.l A2,bufcount(A4) } } else { if (j!=128) { j^=255; asm { move.l bufcount(A4),A2 move.l piccount(A4),A1 move.w j(A4),D0 addq.w #1,D0 pic2loop: move.b (A1),(A2)+ dbf D0,pic2loop addq.l #1,piccount(A4) move.l A2,bufcount(A4) } } } } while((piccount-picstart