/*************************************************************\ * SCREEN JAEGER * * ~~~~~~ ~~~~~~ * * * * 'Jaeger' - German word meaning HUNTER * * I'm not German, but I like the word * * * * Written by Syd L. Bolton * * ©1991 Legendary Design Technologies Inc. * * * * Compiled using Manx Aztec C (tm) V5.0 * * * * Started: Date: May 13, 1991 Time: 18:55:00 * * Version: 1.00 Date: July 12, 1991 Time: 00:17:00 * * Version: 1.01 Date: July 16, 1991 Time: 12:30:00 * \*************************************************************/ #include #include #include #include #include #include #include #include long *IntuitionBase,*GfxBase,*IFFBase; extern struct ExecBase *SysBase; struct MemHeader *mh; struct BitMap bm; struct Screen *Screen,*MainScreen; struct Window *Window,*MessageWindow,*InfoWindow; struct ViewPort *ViewPort,*vport; struct RastPort *rport,*mrport,*irport; UWORD colortable[32]; long upper[2],lower[2],xbody,ybody; long FOffset[6]; PLANEPTR PlanePtr[6]; #include "screen.h" #include "main.h" #include "message.h" #include "info.h" #define CHIP 0 #define FAST 1 int num_bitplanes=1,fine=0,direction,plane=0,copy=0,swap=0; int width,height,NormalRows; int type=CHIP; int XOffset=0,YOffset=0; int overscan=0; long offset=32768; main() { int i,exit_prog=0; struct IntuiMessage *message; ULONG class; openlibraries(); setup(); show_plane(2,1); do { WaitPort(Window->UserPort); while( (message = (struct IntuiMessage *) GetMsg(Window->UserPort) ) != NULL) { class = message->Class; ReplyMsg(message); if ( class == GADGETUP) exit_prog=option(message); if ( class == GADGETDOWN && fine==0) holdit(message); if ( class == VANILLAKEY) key(message); } } while (exit_prog==0); closestuff(0); } #include "pointer.h" key(message) struct IntuiMessage *message; { int c; c=message->Code; switch (c) { case 'b': case 'B': ScreenToFront(Screen); break; case 'f': case 'F': ScreenToFront(MainScreen); break; case 'm': case 'M': MainScreen->TopEdge=0; MainScreen->ViewPort.DyOffset=0; Screen->TopEdge=57; Screen->ViewPort.DyOffset=57; ScreenToFront(Screen); RemakeDisplay(); break; case 'n': case 'N': MainScreen->TopEdge=NormalRows-56; MainScreen->ViewPort.DyOffset=NormalRows-56; Screen->TopEdge=0; Screen->ViewPort.DyOffset=0; ScreenToFront(MainScreen); RemakeDisplay(); break; default: break; } } holdit(message) struct IntuiMessage *message; { struct Gadget *igad; int gadgid,hiexit=0; ULONG class; igad=(struct Gadget *) message->IAddress; gadgid=igad->GadgetID; if (copy==1 || swap==1) { ClearPointer(Window); copy=swap=0; } /* turn off special modes */ if (overscan) return(); do { message=(struct IntuiMessage *) GetMsg(Window->UserPort); if (message != NULL) { class=message->Class; ReplyMsg(message); if (class==GADGETUP) hiexit=1; } switch (gadgid) { case 1: offset-=width; if (offset < lower[type]) offset=lower[type]; redo(); break; case 2: offset++; if (offset+(width/8)*height > upper[type]) offset=upper[type]-width/8*height; redo(); break; case 3: offset+=width; if (offset+(width/8)*height > upper[type]) offset=upper[type]-width/8*height; redo(); break; case 4: offset--; if (offset < lower[type]) offset=lower[type]; redo(); break; case 45: redoprop(); break; default: break; } } while (hiexit==0); } option(message) struct IntuiMessage *message; { struct Gadget *igad; int gadgid; long temp; ULONG size,max; igad=(struct Gadet *) message->IAddress; gadgid=igad->GadgetID; switch(gadgid) { case 1: if (overscan) doscan(1); else { offset-=width/(7*fine+1); if (offset < lower[type]) offset=lower[type]; redo(); } break; case 2: if (overscan) doscan(2); else { offset++; if (offset+(width/8)*height > upper[type]) offset=upper[type]-width/8*height; redo(); } break; case 3: if (overscan) doscan(3); else { offset+=width/(7*fine+1); if (offset+(width/8)*height > upper[type]) offset=upper[type]-width/8*height; redo(); } break; case 4: if (overscan) doscan(4); else { offset--; if (offset < lower[type]) offset=lower[type]; redo(); } break; case 5: num_bitplanes++; if (num_bitplanes > 6) num_bitplanes=6; if (type==FAST) { PlanePtr[num_bitplanes-1]=AllocRaster(width,height); if (PlanePtr[num_bitplanes-1]) { CopyMem(lower[FAST],PlanePtr[num_bitplanes-1],(width/8)*height); bm.Planes[num_bitplanes-1]=PlanePtr[num_bitplanes-1]; Screen->RastPort.BitMap->Planes[num_bitplanes-1]=PlanePtr[num_bitplanes-1]; /* if not, couldn't allocate the chip memory */ } else num_bitplanes--; } set_depth(); break; case 6: num_bitplanes--; if (num_bitplanes < 1) num_bitplanes=1; if (type==FAST) { if (PlanePtr[num_bitplanes]) FreeRaster(PlanePtr[num_bitplanes],width,height); PlanePtr[num_bitplanes]=0; } set_depth(); if (plane >= num_bitplanes) { show_plane(1,2); plane=num_bitplanes-1; show_plane(2,1); } break; case 7: offset=atoi(Gadget32SIBuff); if (offset < lower[type]) offset=lower[type]; if (offset+width/8*height > upper[type]) offset=upper[type]-width/8*height; redo(); calcpropgad(); break; case 9: if (Gadget6.Flags & SELECTED) fine=1; else fine=0; break; case 10: if (Gadget13.Flags & SELECTED) { if (type==FAST) freefastmem(); Screen->ViewPort.Modes |= LACE; Screen->RastPort.BitMap->Rows=NormalRows*2; bm.Rows=NormalRows*2; Screen->Height=NormalRows*2; Screen->ViewPort.DHeight=NormalRows*2; height=NormalRows*2; if (type==FAST) allocfastmem(); } else { if (type==FAST) freefastmem(); Screen->ViewPort.Modes &= ~LACE; Screen->RastPort.BitMap->Rows=NormalRows; bm.Rows=NormalRows; Screen->Height=NormalRows; Screen->ViewPort.DHeight=NormalRows; height=NormalRows; if (type==FAST) allocfastmem(); } calcpropgad(); fixhwgads(); RemakeDisplay(); break; case 11: if (Gadget14.Flags & SELECTED) { if (type==FAST) freefastmem(); Screen->ViewPort.Modes |= HIRES; Screen->Width=640; Screen->RastPort.BitMap->BytesPerRow=80; bm.BytesPerRow=80; /* 640 div 8 */ Screen->ViewPort.DWidth=640; width=640; if (type==FAST) allocfastmem(); } else { if (type==FAST) freefastmem(); Screen->ViewPort.Modes &= ~HIRES; Screen->Width=320; bm.BytesPerRow=40; /* 320 div 8 */ Screen->RastPort.BitMap->BytesPerRow=40; Screen->ViewPort.DWidth=320; width=320; if (type==FAST) allocfastmem(); } calcpropgad(); fixhwgads(); RemakeDisplay(); break; case 12: if (Gadget15.Flags & SELECTED) { Screen->ViewPort.Modes |= EXTRA_HALFBRITE; if (num_bitplanes < 6) Message("WARNING: Should have 6 bitplanes."); } else Screen->ViewPort.Modes &= ~EXTRA_HALFBRITE; RemakeDisplay(); break; case 13: if (Gadget16.Flags & SELECTED) { Screen->ViewPort.Modes |= HAM; if (num_bitplanes < 6) Message("WARNING: Should have 6 bitplanes."); } else Screen->ViewPort.Modes &= ~HAM; RemakeDisplay(); break; case 20: case 21: case 22: case 23: case 24: case 25: if (gadgid-19 > num_bitplanes) break; if (type==FAST) FOffset[plane]=offset; if (copy==1) { bm.Planes[gadgid-20]=Screen->RastPort.BitMap->Planes[gadgid-20]=bm.Planes[plane]; copy=0; ClearPointer(Window); RemakeDisplay(); } if (swap==1) { temp=bm.Planes[plane]; bm.Planes[plane]=Screen->RastPort.BitMap->Planes[plane]=bm.Planes[gadgid-20]; bm.Planes[gadgid-20]=Screen->RastPort.BitMap->Planes[gadgid-20]=temp; swap=0; ClearPointer(Window); RemakeDisplay(); } show_plane(1,2); plane=gadgid-20; if (type==CHIP) offset=bm.Planes[plane]; if (type==FAST) { offset=FOffset[plane]; if (offset < lower[FAST]) offset=lower[FAST]; } show_plane(2,1); display_offset(); /* update gadget */ break; case 30: autooffset(); break; case 31: copy=1-copy; if (copy) do_ToSprite(Window); else ClearPointer(Window); break; case 32: swap=1-swap; if (swap) do_ExSprite(Window); else ClearPointer(Window); break; case 40: save_iff(); break; /* save file */ case 41: if (type==CHIP) { max=AvailMem(MEMF_CHIP|MEMF_LARGEST); if (max) size=AllocMem(max,MEMF_CHIP|MEMF_CLEAR); if (size) FreeMem(size,max); } if (type==FAST) { max=AvailMem(MEMF_FAST|MEMF_LARGEST); if (max) size=AllocMem(max,MEMF_FAST|MEMF_CLEAR); if (size) FreeMem(size,max); } break; case 42: case 43: redo_dimensions(); break; case 45: redoprop(); break; case 46: if (type==CHIP) break; type=CHIP; show_mem_type(); offset=lower[CHIP]; freefastmem(); redo(); break; case 47: if (type==FAST) break; if (lower[FAST]==0) { type=CHIP; show_mem_type(); break; } type=FAST; show_mem_type(); offset=lower[FAST]; allocfastmem(); redo(); break; case 50: return(1); case 75: if (Gadget30.Flags & SELECTED) overscan=1; else overscan=0; break; case 80: ScreenInfo(); break; default: break; } if ((swap==1 || copy==1) && (gadgid!=31 && gadgid!=32)) { ClearPointer(Window); swap=copy=0; } return(0); } doscan(dir) int dir; { switch (dir) { case 1: YOffset--; break; case 2: XOffset++; break; case 3: YOffset++; break; case 4: XOffset--; break; default: break; } if (YOffset < -46) YOffset=-46; if (YOffset > 534) YOffset=534; if (XOffset < -36) XOffset=-36; if (YOffset > 724) XOffset=724; Screen->ViewPort.DyOffset=YOffset; Screen->ViewPort.DxOffset=XOffset; RemakeDisplay(); } allocfastmem() { int i,rv=0; for (i=0; iRastPort.BitMap->Planes[i]=PlanePtr[i]; } else rv=-1; } return(rv); } freefastmem() { int i; for (i=0; iRastPort.BitMap->Planes[i]=lower[CHIP]; } } fixhwgads() { sprintf(Gadget25SIBuff,"%-d",width); sprintf(Gadget26SIBuff,"%-d",height); RefreshGadgets(&Gadget25,Window,NULL); show_mem_type(); /* just so it doesn't get lost */ } redo_dimensions() { int swidth,sheight; swidth=atoi(Gadget25SIBuff); sheight=atoi(Gadget26SIBuff); if (swidth > 1024) swidth=1024; if (sheight > 1024) sheight=1024; if (swidth < 1) swidth=1; if (sheight < 1) swidth=1; sprintf(Gadget25SIBuff,"%-d",swidth); sprintf(Gadget26SIBuff,"%-d",sheight); if (type==FAST) freefastmem(); Screen->Width=swidth; bm.BytesPerRow=swidth/8; bm.Rows=sheight; Screen->RastPort.BitMap->Rows=sheight; Screen->RastPort.BitMap->BytesPerRow=swidth/8; Screen->ViewPort.DWidth=swidth; Screen->Height=sheight; Screen->ViewPort.DHeight=sheight; width=swidth; height=sheight; if (height > 399) { Screen->ViewPort.Modes |= LACE; Gadget13.Flags |= SELECTED; } else { Screen->ViewPort.Modes &= ~LACE; Gadget13.Flags &= ~SELECTED; } if (width > 639) { Screen->ViewPort.Modes |= HIRES; Gadget14.Flags |= SELECTED; } else { Screen->ViewPort.Modes &= HIRES; Gadget14.Flags &= ~SELECTED; } if (type==FAST) allocfastmem(); RefreshGadgets(&Gadget13,Window,NULL); show_mem_type(); RemakeDisplay(); } show_plane(a,b) int a,b; { char p[4]; SetAPen(rport,a); SetBPen(rport,b); Move(rport,301+33*plane,9); sprintf(p," %1d ",plane+1); Text(rport,p,3); } show_mem_type() { SetAPen(rport,1-type+1); SetBPen(rport,type+1); Move(rport,102,30); Text(rport," CHIP ",6); SetAPen(rport,type+1); SetBPen(rport,1-type+1); Move(rport,160,30); Text(rport," FAST ",6); } autooffset() { int i; if (num_bitplanes < 2) return(); for (i=1; iRastPort.BitMap->Planes[i]=bm.Planes[0]+i*(width*height/8); } RemakeDisplay(); } set_depth() { char msg[2]; sprintf(msg,"%-1d",num_bitplanes); Move(rport,242,10); SetAPen(rport,1); SetBPen(rport,0); Text(rport,msg,1); bm.Depth=num_bitplanes; Screen->Depth=num_bitplanes; Screen->RastPort.BitMap->Depth=num_bitplanes; RemakeDisplay(); } redo() { display_offset(); if (type==CHIP) { bm.Planes[plane]=offset; Screen->RastPort.BitMap->Planes[plane]=offset; RemakeDisplay(); } if (type==FAST) { CopyMem(offset,PlanePtr[plane],(width/8)*height); RemakeDisplay(); } } display_offset() { sprintf(Gadget32SIBuff,"%-d",offset); RefreshGadgets(&Gadget32,Window,NULL); } calcpropgad() { USHORT VertPot,HorizPot; long value,xpos,ypos; value=(upper[type]-lower[type])/(width/8*height); xbody=sqrt(value*3)+0.5; /* for rounding of course */ ybody=sqrt(value/3)+0.5; value=offset/(width/8*height); xpos=sqrt(value*3)+0.5; xpos++; ypos=sqrt(value/3)+0.5; ypos++; HorizPot=(UWORD) (((ULONG) xpos * MAXPOT) / (xbody-1)); VertPot=(UWORD) (((ULONG) ypos * MAXPOT) / (ybody-1)); NewModifyProp(&Gadget27,Window,NULL,AUTOKNOB+FREEHORIZ+FREEVERT,HorizPot,VertPot,0xffff/xbody,0xffff/ybody,1); } redoprop() { USHORT VertPot,HorizPot; USHORT mx,my; int dmem; dmem=width/8*height; VertPot=Gadget27SInfo.VertPot; HorizPot=Gadget27SInfo.HorizPot; mx=((HorizPot+1)*(xbody-1))>>16; mx++; my=((VertPot+1)*(ybody-1))>>16; my++; offset=lower[type]+mx*my*dmem; if (offset < lower[type]) offset=lower[type]; if (offset > upper[type]-dmem) offset=upper[type]-dmem; redo(); } Message(text) char *text; { struct IntuiMessage *message; MesWin.Screen=MainScreen; MessageWindow=OpenWindow(&MesWin); if (MessageWindow==NULL) return(); mrport=MessageWindow->RPort; Move(mrport,10,20); Text(mrport,text,strlen(text)); WaitPort(MessageWindow->UserPort); while( (message = (struct IntuiMessage *) GetMsg(MessageWindow->UserPort) ) != NULL) ReplyMsg(message); CloseWindow(MessageWindow); } ScreenInfo() { struct IntuiMessage *message; char string[10]; long available,tmem; InfoWin.Screen=MainScreen; InfoWindow=OpenWindow(&InfoWin); if (InfoWindow==NULL) return(); irport=InfoWindow->RPort; PrintIText(irport,&ITextList,0,0); SetAPen(irport,3); SetBPen(irport,0); /* set lighter color */ sprintf(string,"%-8d",lower[CHIP]); Move(irport,59,20); Text(irport,string,8); sprintf(string,"%-8d",upper[CHIP]); Move(irport,176,20); Text(irport,string,8); sprintf(string,"%-8d",lower[FAST]); Move(irport,59,41); Text(irport,string,8); sprintf(string,"%-8d",upper[FAST]); Move(irport,176,41); Text(irport,string,8); available=(upper[CHIP]-lower[CHIP])+(upper[FAST]-lower[FAST]); sprintf(string,"%-8d",available); Move(irport,149,51); Text(irport,string,8); sprintf(string,"%-3d",XOffset); Move(irport,494,20); Text(irport,string,3); sprintf(string,"%-3d",YOffset); Move(irport,551,20); Text(irport,string,3); tmem=(width/8)*height*num_bitplanes; sprintf(string,"%8d",tmem); Move(irport,471,41); Text(irport,string,8); WaitPort(InfoWindow->UserPort); while( (message = (struct IntuiMessage *) GetMsg(InfoWindow->UserPort) ) != NULL) ReplyMsg(message); CloseWindow(InfoWindow); } save_iff() { int k,max_colors; long val1,val2; max_colors=1 << num_bitplanes; if (max_colors > 32) max_colors=32; for (k=0; k < max_colors; k++) colortable[k]=GetRGB4(ViewPort->ColorMap,k); for (k=0; kBitMap.Planes[k]--; } } SaveBitMap(Gadget19SIBuff,&Screen->BitMap,&colortable[0],1); } setup() { int i; InitBitMap(&bm,1,320,NormalRows); for (i=0; i<6; i++) bm.Planes[i]=offset; NewScreenStructure.Depth=1; width=320; height=NormalRows; if(!(Screen=OpenScreen(&NewScreenStructure))) { problem(" Screen Jaeger: Couldn't open Screen. "); closestuff(1); } Screen2.TopEdge=NormalRows-56; Screen2.Height=55; if(!(MainScreen=OpenScreen(&Screen2))) { problem(" Screen Jaeger: Couldn't open S.Screen! "); closestuff(1); } sprintf(Gadget26SIBuff,"%-d",NormalRows); strcpy(Gadget25SIBuff,"320"); vport=&MainScreen->ViewPort; ViewPort=&Screen->ViewPort; LoadRGB4(vport,&Palette[0],PaletteColorCount); NewWindowStructure1.Screen=MainScreen; if(!(Window=OpenWindow(&NewWindowStructure1))) { problem(" Screen Jaeger: Couldn't open Window!. "); closestuff(1); } rport=Window->RPort; Move(rport,178,10); SetAPen(rport,1); SetBPen(rport,0); Text(rport,"Planes: 1",9); display_offset(); show_mem_type(); lower[0]=0; lower[1]=0; upper[0]=0; upper[1]=0; /* clear mem values */ Forbid(); for (mh=(struct MemHeader *) SysBase->MemList.lh_Head; mh->mh_Node.ln_Succ; mh=(struct MemHeader *)mh->mh_Node.ln_Succ) { if (mh->mh_Attributes & MEMF_CHIP) { lower[CHIP]=mh->mh_Lower; upper[CHIP]=mh->mh_Upper; } if (mh->mh_Attributes & MEMF_FAST) { lower[FAST]=mh->mh_Lower; upper[FAST]=mh->mh_Upper; } } Permit(); calcpropgad(); } problem(message) char *message; { int l; message[0]=0; message[1]=8; message[2]=14; l=strlen(message); message[l-2]=0; message[l-1]=0; DisplayAlert(RECOVERY_ALERT,message,30); } openlibraries() { if(!(IntuitionBase=OpenLibrary("intuition.library",0L))) { problem(" Screen Jaeger: Couldn't open Intuition. "); exit(1); } if(!(GfxBase=OpenLibrary("graphics.library",0L))) { problem(" Screen Jaeger: Couldn't open Graphics!! "); exit(1); } NormalRows=GfxBase->NormalDisplayRows; /* see if we're PAL or not! */ if(!(IFFBase=OpenLibrary("iff.library",15))) { problem(" Screen Jaeger: Please copy iff.library V15 or higher to SYS:LIBS directory! "); exit(1); } } closestuff(value) int value; { if (type==FAST) freefastmem(); if (Screen) { type=CHIP; num_bitplanes=1; set_depth(); bm.Planes[0]=MainScreen->RastPort.BitMap->Planes[0]; Screen->RastPort.BitMap->Planes[0]=MainScreen->RastPort.BitMap->Planes[0]; CloseScreen(Screen); } if (Window) CloseWindow(Window); if (MainScreen) CloseScreen(MainScreen); if (IFFBase) CloseLibrary(IFFBase); if (GfxBase) CloseLibrary(GfxBase); if (IntuitionBase) CloseLibrary(IntuitionBase); if (value > 0) exit(-1); }