herr@calgary.UUCP (Charles Herr) (05/31/88)
I am having a problem with a single-char input routine I have been working on. The RKM says that the routines QConRead() and ConGetChar() should work. However the screens open up fine, as I can see them after they are opened, BUT the systems freezes up with a task held/Software Error requestor. I have just about lost all my hair over this one.. can anyone help???? I suspect that the problem lies in on of the 2 aformentioned routines. I am using Dos1.2 with Manx 3.4a and use the following to compile it: cc test.c ln -o test test.o -lc Also I am most likely including far to many ".h" files but that is all for future expansion and should not matter. Code follows.... ------------------------------------------------------------------------------ #include <exec/types.h> #include <exec/exec.h> #include <intuition/intuition.h> #include <intuition/intuitionbase.h> #include <graphics/gfxbase.h> #include <graphics/gfx.h> #include <graphics/text.h> #include <graphics/regions.h> #include <graphics/copper.h> #include <graphics/gels.h> #include <devices/keymap.h> #include <devices/console.h> #include <hardware/blit.h> #include <stdio.h> #include <ctype.h> #include <libraries/dos.h> #include <libraries/dosextens.h> #include <devices/timer.h> #include <functions.h> #undef NULL #define NULL ((void *)0) #define INTUITION_REV 1L #define GRAPHICS_REV 1L extern struct MsgPort *CreatePort(); extern struct IOStdReq *CreateStdIO(); struct IntuitionBase *IntuitionBase; struct GfxBase *GfxBase; struct IOStdReq *ConReadMsg; struct MsgPort *ConReadPort; struct IOStdReq *ConWriteMsg; struct MsgPort *ConWritePort; char conchar; struct NewScreen NewScreen = { 0,0, /* screen XY origin relative to View */ 640,200, /* screen width and height */ 4, /* screen depth (number of bitplanes) */ 0,1, /* detail and block pens */ HIRES, /* display modes for this screen */ CUSTOMSCREEN, /* screen type */ NULL, /* pointer to default screen font */ (UBYTE *)"Test Screen", /*screen title */ NULL, /* first in list of custom screen gadgets */ NULL /* pointer to custom BitMap structure */ }; USHORT colors[] = { 0x0000, /* color #0 */ 0x0A00, /* color #1 */ 0x0007, /* color #2 */ 0x000F, /* color #3 */ 0x0070, /* color #4 */ 0x00F0, /* color #5 */ 0x0700, /* color #6 */ 0x0F00, /* color #7 */ 0x0FF0, /* color #8 */ 0x00FF, /* color #9 */ 0x0F0F, /* color #10 */ 0x0FFF, /* color #11 */ 0x0777, /* color #12 */ 0x0F70, /* color #13 */ 0x0606, /* color #14 */ 0x0F06 /* color #15 */ }; struct NewWindow NewWindow = { 0,1, /* window XY origin relative to TopLeft of screen */ 640,199, /* window width and height */ 0,1, /* detail and block pens */ CLOSEWINDOW, WINDOWDEPTH+WINDOWCLOSE+ACTIVATE, /* other window flags */ NULL, /* first gadget in gadget list */ NULL, /* custom CHECKMARK imagery */ (UBYTE *)"Test Window", /* window title */ NULL, /* custom screen pointer */ NULL, /* custom bitmap */ 5,5, /* minimum width and height */ 640,200, /* maximum width and height */ CUSTOMSCREEN /* destination screen type */ }; struct Screen *myscreen; /* ptr to applications screen */ struct Window *mywindow; /* ptr to applications window */ struct ViewPort *myviewport; struct RastPort *myrastport; FILE *fp; main() { char ch; char ConGetChar(); fp = fopen("tracer","w"); if(fp == NULL) exit(1); fprintf(fp,"Going into InitDevs\n"); InitDevs(); fprintf(fp,"Exited InitDevs\n"); fprintf(fp,"Waiting for characters\n"); ch = ConGetChar(); while(ch != 'q') { fprintf(fp,"Character = %c\n",ch); ch = ConGetChar(); } fprintf(fp,"Cleaning up\n"); fclose(fp); cleanup("",0); } InitDevs() { int i; BYTE *b,*c; fprintf(fp,"Opening Intuition\n"); IntuitionBase = (struct IntuitionBase *) OpenLibrary("intuition.library", INTUITION_REV); if( IntuitionBase == NULL ) cleanup("can't open intuition",1); fprintf(fp,"Opening Graphics\n"); GfxBase = (struct GfxBase *) OpenLibrary("graphics.library",GRAPHICS_REV); if( GfxBase == NULL ) cleanup("can't open graphics library",2); fprintf(fp,"Opening screen\n"); if ((myscreen = (struct Screen *)OpenScreen(&NewScreen)) == NULL) cleanup("can't open screen",3); NewWindow.Screen = myscreen; fprintf(fp,"Opening window\n"); if ((mywindow = (struct Window *)OpenWindow(&NewWindow)) == NULL) cleanup("can't open window",4); myviewport = (struct ViewPort *)ViewPortAddress(mywindow); myrastport = (struct RastPort *)mywindow->RPort; LoadRGB4(myviewport,(struct ColorMap *)colors,16L); SetAPen(mywindow->RPort,1L); fprintf(fp,"Opening Conwriteport\n"); ConWritePort = CreatePort("con.write",0); if(ConWritePort == 0) cleanup("can't open conwriteport",6); fprintf(fp,"Opening Conwritemsg\n"); ConWriteMsg = CreateStdIO(ConWritePort); if(ConWriteMsg == 0) cleanup("can't open conreadmsg",9); fprintf(fp,"Opening Conreadport\n"); ConReadPort = CreatePort("con.read",0); if(ConReadPort == 0) cleanup("can't open conreadport",10); fprintf(fp,"Opening Conreadmsg\n"); ConReadMsg = CreateStdIO(ConReadPort); if(ConReadMsg == 0) cleanup("can't open conreadmsg",11); ConWriteMsg -> io_Data = (APTR) mywindow; ConWriteMsg -> io_Length = sizeof(*mywindow); fprintf(fp,"Opening Console\n"); i = OpenDevice("console.device",0,ConWriteMsg,0); if(i) cleanup("can't open condevice",12); ConReadMsg -> io_Device = ConWriteMsg -> io_Device; ConReadMsg -> io_Unit = ConWriteMsg -> io_Unit; QConRead(&conchar); } cleanup(reason, fault) char *reason; int fault; { switch(fault) { case 0: /* quitting close everything */ case 12: DeleteStdIO(ConReadMsg); case 11: DeletePort(ConReadPort); case 10: DeleteStdIO(ConWriteMsg); case 9: DeletePort(ConWritePort); case 4: /* error opening window */ if (mywindow != NULL) CloseWindow( mywindow ); CloseScreen( myscreen ); case 3: /* error opening screen */ case 2: /* error opening graphics library */ case 1: /* error opening intuition */ default: if (*reason) puts (reason); } exit(fault); } QConRead(ch) char *ch; { ConReadMsg -> io_Command = CMD_READ; ConReadMsg -> io_Data = (APTR)ch; ConReadMsg -> io_Length = 1; SendIO(ConReadMsg); return; } char ConGetChar() { char temp; while((GetMsg(ConReadPort) == NULL)) WaitPort(ConReadPort); temp = conchar; QConRead(&conchar); return(temp); }