$NetBSD: patch-aj,v 1.2 2021/08/27 03:41:41 ryoon Exp $ * Include string.h for strlen(). --- mc68k/fab_custom.c.orig 1998-07-28 23:08:48.000000000 +0000 +++ mc68k/fab_custom.c @@ -30,6 +30,7 @@ #include #include #include +#include #include "../config.h" @@ -1027,252 +1028,251 @@ gen_lput(Fab *f, Reg chip[]) * Max Okumoto *---------------------------------------------------------------------------*/ static char *HACK[] = { -" -/**************************************** - * Handle a key event. The fields * - * keydown and key of the shared image * - * are interpreted, and the dragonball * - * registers updated * - ****************************************/ -static void -dokey(void) -{ - UBYTE d; - d = db_PDDATA.x; - if (CustShptr->keydown) { - db_PDDATA.x |= (1 << CustShptr->key); - CustShptr->keydown = 0; - CustShptr->key = -1; - } else if (CustShptr->key >= 0) { - db_PDDATA.x &= ~(1 << CustShptr->key); - CustShptr->key = -1; - } - db_PDDATA_edge |= db_PDDATA.x & ~d; - db_IPR.anon.PEN = CustShptr->pen; - db_IPR.x = (db_IPR.x & 0xffff00ff) | - ((((db_PDDATA_edge & db_PDIRQEDGE.x) | - (db_PDDATA.x & ~db_PDIRQEDGE.x)) & db_PDIRQEN.x) << 8); -} - -void -updateisr() -{ - db_IPR.anon.PEN = CustShptr->pen; - db_ISR.x = db_IPR.x & ~db_IMR.x; - if (db_ISR.x) { - specialflags |= SPCFLAG_INT; - } - CustShptr->run_updateisr = 0; -} - -void -maybe_updateisr() -{ - if (CustShptr->run_updateisr) { - dokey(); - updateisr(); - } -} - -int -intbase() -{ - return db_IVR.anon.VECTOR << 3; -} - -int -intlev() -{ - if (db_ISR.anon.IRQ7) return 7; - if (db_ISR.anon.SPIS) return 6; - if (db_ISR.anon.TMR1) return 6; - if (db_ISR.anon.IRQ6) return 6; - if (db_ISR.anon.PEN) return 5; - if (db_ISR.anon.SPIM) return 4; - if (db_ISR.anon.TMR2) return 4; - if (db_ISR.anon.UART) return 4; - if (db_ISR.anon.WDT) return 4; - if (db_ISR.anon.RTC) return 4; - if (db_ISR.anon.KB) return 4; - if (db_ISR.anon.PWM) return 4; - if (db_ISR.anon.INT0) return 4; - if (db_ISR.anon.INT1) return 4; - if (db_ISR.anon.INT2) return 4; - if (db_ISR.anon.INT3) return 4; - if (db_ISR.anon.INT4) return 4; - if (db_ISR.anon.INT5) return 4; - if (db_ISR.anon.INT6) return 4; - if (db_ISR.anon.INT7) return 4; - if (db_ISR.anon.IRQ3) return 3; - if (db_ISR.anon.IRQ2) return 2; - if (db_ISR.anon.IRQ1) return 1; - return -1; -} - -static void -pen(int down, int x, int y) -{ - if (!pendown && down) { - db_IPR.anon.PEN = 1; - updateisr(); - } else if (pendown && !down) { - db_IPR.anon.PEN = 0; - updateisr(); - } - pendown = down; - penx = x; - peny = y; -} - -static void -hotsync(int down) -{ - if (down) { - db_IPR.anon.IRQ1 = 1; - } else { - db_IPR.anon.IRQ1 = 0; - } - updateisr(); -} - -/* - * custptr is a pointer to a shared memory block which will \"back-up\" - * the register values of the custom circuits, allowing other processes - * to look at register values - */ -void -custom_init(shared_img * shptr) -{ - CustShptr = shptr; - CustShptr->PICF = 0; - CustShptr->VPW = 0xff; - CustShptr->POSR = 0; - CustShptr->grpalette[0] = 1; - CustShptr->grpalette[1] = 0; - CustShptr->grpalette[2] = 3; - CustShptr->grpalette[3] = 7; - CustShptr->quit = 0; - CustShptr->run_updateisr = 0; - CustShptr->LcdPower = lcdOn; - CustShptr->Backlight = 0; - customreset(); -} - -void -do_cycles(int longtime) -{ - if (db_TCTL2.anon.TEN) { - db_TCN2.anon.COUNT++; - if (db_TCN2.anon.COUNT > db_TCMP2.anon.COMPARE || longtime) { - db_TSTAT2.anon.COMP = 1; - if (db_TCTL2.anon.FRR == 0) { - db_TCN2.anon.COUNT = 0; - } - if (db_TCTL2.anon.IRQEN) { - db_IPR.anon.TMR2 = 1; - updateisr(); - } - } - } - /* - * Determine if there are any chars to read from the serial port or - * debugger - */ - - /* - * WARNING: This uses a shared memory data structure to store the - * FIFO. The producer is adding things to this _at the same time_ as - * this is consuming. Examine main.c and take a course in concurrent - * programming before modifying this. :-) - Ian - */ - - if (CustShptr->serial.head != CustShptr->serial.tail && - db_USTCNT.anon.UART_ENABLE && !db_URX.anon.DATA_READY) { - int curhead = CustShptr->serial.head; - db_URX.anon.DATA = CustShptr->serial.fifo[curhead]; - curhead += 1; - if (curhead == FIFO_SIZE) { - curhead = 0; - } - CustShptr->serial.head = curhead; - db_URX.anon.DATA_READY = 1; - if (db_USTCNT.anon.RX_READY_ENABLE) { - db_IPR.anon.UART = 1; - updateisr(); - } - } - if (CustShptr->gdb.head != CustShptr->gdb.tail && - db_USTCNT.anon.UART_ENABLE && !db_URXdb.anon.DATA_READY) { - int curhead = CustShptr->gdb.head; - db_URXdb.anon.DATA = CustShptr->gdb.fifo[curhead]; - curhead += 1; - if (curhead == FIFO_SIZE) { - curhead = 0; - } - CustShptr->gdb.head = curhead; - db_URXdb.anon.DATA_READY = 1; - } -} - -struct EventType { - UWORD eType; - UWORD penDown; - UWORD screenX; - UWORD screenY; - UWORD data[8]; -}; - -struct SndCommandType { - UWORD cmd; - UWORD param1hi; - UWORD param1lo; - UWORD param2; - UWORD param3; -}; - -#define keyDownEvent 4 -#define sysTrapEvtGetEvent 41245 -#define sysTrapSndDoCmd 41523 - -int -do_api(int api) -{ - switch (api) { - case sysTrapEvtGetEvent: - if (CustShptr->kbin != CustShptr->kbout) { - - struct EventType *ev; - int out; - - out = CustShptr->kbout; - ev = (struct EventType *) get_real_address(get_long(CustShptr->regs.a[7])); - - ev->eType = keyDownEvent; - ev->data[0] = CustShptr->kb[out]; - ev->data[1] = 0; - ev->data[2] = 0; - CustShptr->kbout = (out + 1) & 7; - return 1; - } - break; - case sysTrapSndDoCmd: - { - struct SndCommandType *sc; - sc = (struct SndCommandType *) - get_real_address(get_long(CustShptr->regs.a[7] + 4)); - if ((sc->cmd >> 8) == 1) { - CustShptr->BellFreq = (sc->param1hi << 16) + sc->param1lo; - CustShptr->BellDur = sc->param2; - CustShptr->BellAmp = sc->param3; - CustShptr->LcdReq = lcdBell; - return 1; - } - } - break; - } - return 0; -} -" +"\n" +"/****************************************\n" +" * Handle a key event. The fields *\n" +" * keydown and key of the shared image *\n" +" * are interpreted, and the dragonball *\n" +" * registers updated *\n" +" ****************************************/\n" +"static void\n" +"dokey(void)\n" +"{\n" +" UBYTE d;\n" +" d = db_PDDATA.x;\n" +" if (CustShptr->keydown) {\n" +" db_PDDATA.x |= (1 << CustShptr->key);\n" +" CustShptr->keydown = 0;\n" +" CustShptr->key = -1;\n" +" } else if (CustShptr->key >= 0) {\n" +" db_PDDATA.x &= ~(1 << CustShptr->key);\n" +" CustShptr->key = -1;\n" +" }\n" +" db_PDDATA_edge |= db_PDDATA.x & ~d;\n" +" db_IPR.anon.PEN = CustShptr->pen;\n" +" db_IPR.x = (db_IPR.x & 0xffff00ff) |\n" +" ((((db_PDDATA_edge & db_PDIRQEDGE.x) |\n" +" (db_PDDATA.x & ~db_PDIRQEDGE.x)) & db_PDIRQEN.x) << 8);\n" +"}\n" +"\n" +"void\n" +"updateisr()\n" +"{\n" +" db_IPR.anon.PEN = CustShptr->pen;\n" +" db_ISR.x = db_IPR.x & ~db_IMR.x;\n" +" if (db_ISR.x) {\n" +" specialflags |= SPCFLAG_INT;\n" +" }\n" +" CustShptr->run_updateisr = 0;\n" +"}\n" +"\n" +"void\n" +"maybe_updateisr()\n" +"{\n" +" if (CustShptr->run_updateisr) {\n" +" dokey();\n" +" updateisr();\n" +" }\n" +"}\n" +"\n" +"int\n" +"intbase()\n" +"{\n" +" return db_IVR.anon.VECTOR << 3;\n" +"}\n" +"\n" +"int\n" +"intlev()\n" +"{\n" +" if (db_ISR.anon.IRQ7) return 7;\n" +" if (db_ISR.anon.SPIS) return 6;\n" +" if (db_ISR.anon.TMR1) return 6;\n" +" if (db_ISR.anon.IRQ6) return 6;\n" +" if (db_ISR.anon.PEN) return 5;\n" +" if (db_ISR.anon.SPIM) return 4;\n" +" if (db_ISR.anon.TMR2) return 4;\n" +" if (db_ISR.anon.UART) return 4;\n" +" if (db_ISR.anon.WDT) return 4;\n" +" if (db_ISR.anon.RTC) return 4;\n" +" if (db_ISR.anon.KB) return 4;\n" +" if (db_ISR.anon.PWM) return 4;\n" +" if (db_ISR.anon.INT0) return 4;\n" +" if (db_ISR.anon.INT1) return 4;\n" +" if (db_ISR.anon.INT2) return 4;\n" +" if (db_ISR.anon.INT3) return 4;\n" +" if (db_ISR.anon.INT4) return 4;\n" +" if (db_ISR.anon.INT5) return 4;\n" +" if (db_ISR.anon.INT6) return 4;\n" +" if (db_ISR.anon.INT7) return 4;\n" +" if (db_ISR.anon.IRQ3) return 3;\n" +" if (db_ISR.anon.IRQ2) return 2;\n" +" if (db_ISR.anon.IRQ1) return 1;\n" +" return -1;\n" +"}\n" +"\n" +"static void\n" +"pen(int down, int x, int y)\n" +"{\n" +" if (!pendown && down) {\n" +" db_IPR.anon.PEN = 1;\n" +" updateisr();\n" +" } else if (pendown && !down) {\n" +" db_IPR.anon.PEN = 0;\n" +" updateisr();\n" +" }\n" +" pendown = down;\n" +" penx = x;\n" +" peny = y;\n" +"}\n" +"\n" +"static void\n" +"hotsync(int down)\n" +"{\n" +" if (down) {\n" +" db_IPR.anon.IRQ1 = 1;\n" +" } else {\n" +" db_IPR.anon.IRQ1 = 0;\n" +" }\n" +" updateisr();\n" +"}\n" +"\n" +"/*\n" +" * custptr is a pointer to a shared memory block which will \"back-up\"\n" +" * the register values of the custom circuits, allowing other processes\n" +" * to look at register values\n" +" */\n" +"void\n" +"custom_init(shared_img * shptr)\n" +"{\n" +" CustShptr = shptr;\n" +" CustShptr->PICF = 0;\n" +" CustShptr->VPW = 0xff;\n" +" CustShptr->POSR = 0;\n" +" CustShptr->grpalette[0] = 1;\n" +" CustShptr->grpalette[1] = 0;\n" +" CustShptr->grpalette[2] = 3;\n" +" CustShptr->grpalette[3] = 7;\n" +" CustShptr->quit = 0;\n" +" CustShptr->run_updateisr = 0;\n" +" CustShptr->LcdPower = lcdOn;\n" +" CustShptr->Backlight = 0;\n" +" customreset();\n" +"}\n" +"\n" +"void\n" +"do_cycles(int longtime)\n" +"{\n" +" if (db_TCTL2.anon.TEN) {\n" +" db_TCN2.anon.COUNT++;\n" +" if (db_TCN2.anon.COUNT > db_TCMP2.anon.COMPARE || longtime) {\n" +" db_TSTAT2.anon.COMP = 1;\n" +" if (db_TCTL2.anon.FRR == 0) {\n" +" db_TCN2.anon.COUNT = 0;\n" +" }\n" +" if (db_TCTL2.anon.IRQEN) {\n" +" db_IPR.anon.TMR2 = 1;\n" +" updateisr();\n" +" }\n" +" }\n" +" }\n" +" /*\n" +" * Determine if there are any chars to read from the serial port or\n" +" * debugger\n" +" */\n" +"\n" +" /*\n" +" * WARNING: This uses a shared memory data structure to store the\n" +" * FIFO. The producer is adding things to this _at the same time_ as\n" +" * this is consuming. Examine main.c and take a course in concurrent\n" +" * programming before modifying this. :-) - Ian\n" +" */\n" +"\n" +" if (CustShptr->serial.head != CustShptr->serial.tail &&\n" +" db_USTCNT.anon.UART_ENABLE && !db_URX.anon.DATA_READY) {\n" +" int curhead = CustShptr->serial.head;\n" +" db_URX.anon.DATA = CustShptr->serial.fifo[curhead];\n" +" curhead += 1;\n" +" if (curhead == FIFO_SIZE) {\n" +" curhead = 0;\n" +" }\n" +" CustShptr->serial.head = curhead;\n" +" db_URX.anon.DATA_READY = 1;\n" +" if (db_USTCNT.anon.RX_READY_ENABLE) {\n" +" db_IPR.anon.UART = 1;\n" +" updateisr();\n" +" }\n" +" }\n" +" if (CustShptr->gdb.head != CustShptr->gdb.tail &&\n" +" db_USTCNT.anon.UART_ENABLE && !db_URXdb.anon.DATA_READY) {\n" +" int curhead = CustShptr->gdb.head;\n" +" db_URXdb.anon.DATA = CustShptr->gdb.fifo[curhead];\n" +" curhead += 1;\n" +" if (curhead == FIFO_SIZE) {\n" +" curhead = 0;\n" +" }\n" +" CustShptr->gdb.head = curhead;\n" +" db_URXdb.anon.DATA_READY = 1;\n" +" }\n" +"}\n" +"\n" +"struct EventType {\n" +" UWORD eType;\n" +" UWORD penDown;\n" +" UWORD screenX;\n" +" UWORD screenY;\n" +" UWORD data[8];\n" +"};\n" +"\n" +"struct SndCommandType {\n" +" UWORD cmd;\n" +" UWORD param1hi;\n" +" UWORD param1lo;\n" +" UWORD param2;\n" +" UWORD param3;\n" +"};\n" +"\n" +"#define keyDownEvent 4\n" +"#define sysTrapEvtGetEvent 41245\n" +"#define sysTrapSndDoCmd 41523\n" +"\n" +"int\n" +"do_api(int api)\n" +"{\n" +" switch (api) {\n" +" case sysTrapEvtGetEvent:\n" +" if (CustShptr->kbin != CustShptr->kbout) {\n" +"\n" +" struct EventType *ev;\n" +" int out;\n" +"\n" +" out = CustShptr->kbout;\n" +" ev = (struct EventType *) get_real_address(get_long(CustShptr->regs.a[7]));\n" +"\n" +" ev->eType = keyDownEvent;\n" +" ev->data[0] = CustShptr->kb[out];\n" +" ev->data[1] = 0;\n" +" ev->data[2] = 0;\n" +" CustShptr->kbout = (out + 1) & 7;\n" +" return 1;\n" +" }\n" +" break;\n" +" case sysTrapSndDoCmd:\n" +" {\n" +" struct SndCommandType *sc;\n" +" sc = (struct SndCommandType *)\n" +" get_real_address(get_long(CustShptr->regs.a[7] + 4));\n" +" if ((sc->cmd >> 8) == 1) {\n" +" CustShptr->BellFreq = (sc->param1hi << 16) + sc->param1lo;\n" +" CustShptr->BellDur = sc->param2;\n" +" CustShptr->BellAmp = sc->param3;\n" +" CustShptr->LcdReq = lcdBell;\n" +" return 1;\n" +" }\n" +" }\n" +" break;\n" +" }\n" +" return 0;\n" +"}\n\n" }; /*---------------------------------------------------------------------------*