int main(int argc, char *argv[]) { register char *s, *p; register int i; char *pn = basename(argv[0]); struct timeval tv; #ifdef HAS_CONFIG struct stat sbuf; #endif #ifdef BOOTROM char *rom = "-r "; #else char *rom = ""; #endif #ifdef CPU_SPEED f_flag = CPU_SPEED; tmax = CPU_SPEED * 10000; #endif while (--argc > 0 && (*++argv)[0] == '-') for (s = argv[0] + 1; *s != '\0'; s++) switch (*s) { case 's': /* save core and CPU on exit */ s_flag = 1; break; case 'l': /* load core and CPU from file */ l_flag = 1; break; case 'u': /* trap undocumented ops */ u_flag = 1; break; case 'i': /* trap I/O on unused ports */ i_flag = 1; break; case 'm': /* initialise Z80 memory */ if (*(s+1) != '\0') { m_flag = exatoi(s+1); s += strlen(s+1); } else { if (argc <= 1) goto usage; argc--; argv++; m_flag = exatoi(argv[0]); } break; case 'f': /* set emulation speed */ if (*(s+1) != '\0') { f_flag = atoi(s+1); s += strlen(s+1); } else { if (argc <= 1) goto usage; argc--; argv++; f_flag = atoi(argv[0]); } tmax = f_flag * 10000; break; case 'x': /* get filename with Z80 executable */ x_flag = 1; s++; if (*s == '\0') { if (argc <= 1) goto usage; argc--; argv++; s = argv[0]; } p = xfn; while (*s) *p++ = *s++; *p = '\0'; s--; break; #ifdef BOOTROM case 'r': /* load default boot ROM */ x_flag = 1; strcpy(xfn, BOOTROM); break; #endif #ifdef HAS_DISKS case 'd': /* get path for disk images */ s++; if (*s == '\0') { if (argc <= 1) goto usage; argc--; argv++; s = argv[0]; } p = diskdir = diskd; while (*s) *p++ = *s++; *p = '\0'; s--; break; #endif case '8': cpu = I8080; break; case 'z': cpu = Z80; break; case '?': case 'h': goto usage; default: printf("illegal option %c\n", *s); usage: #ifdef HAS_DISKS printf("usage:\t%s -z -8 -s -l -i -u %s-m val -f freq -x filename -d diskpath\n", pn, rom); #else printf("usage:\t%s -z -8 -s -l -i -u %s-m val -f freq -x filename\n", pn, rom); #endif puts("\t-z = emulate Zilog Z80"); puts("\t-8 = emulate Intel 8080"); puts("\t-s = save core and CPU"); puts("\t-l = load core and CPU"); puts("\t-i = trap on I/O to unused ports"); puts("\t-u = trap on undocumented instructions"); #ifdef BOOTROM puts("\t-r = load and execute default ROM"); printf("\t %s\n", BOOTROM); #endif puts("\t-m = init memory with val (00-FF)"); puts("\t-f = CPU clock frequency freq in MHz"); puts("\t-x = load and execute filename"); #ifdef HAS_DISKS puts("\t-d = use disks images at diskpath"); puts("\t default path for disk images:"); puts("\t ./disks"); printf("\t %s\n", DISKSDIR); #endif exit(1); } putchar('\n'); if (cpu == Z80) { puts("####### ##### ### ##### ### # #"); puts(" # # # # # # # # ## ##"); puts(" # # # # # # # # # # #"); puts(" # ##### # # ##### ##### # # # #"); puts(" # # # # # # # # #"); puts(" # # # # # # # # # #"); puts("####### ##### ### ##### ### # #"); } else { puts(" ##### ### ##### ### ##### ### # #"); puts("# # # # # # # # # # # ## ##"); puts("# # # # # # # # # # # # # #"); puts(" ##### # # ##### # # ##### ##### # # # #"); puts("# # # # # # # # # # # #"); puts("# # # # # # # # # # # # #"); puts(" ##### ### ##### ### ##### ### # #"); } printf("\nRelease %s, %s\n", RELEASE, COPYR); #ifdef USR_COM printf("%s Release %s, %s\n\n", USR_COM, USR_REL, USR_CPR); #else putchar('\n'); #endif if (f_flag > 0) printf("CPU speed is %d MHz\n", f_flag); else printf("CPU speed is unlimited\n"); fflush(stdout); /* if the machine has configuration files try to find them */ #ifdef HAS_CONFIG /* first try ./conf */ if ((stat("./conf", &sbuf) == 0) && S_ISDIR(sbuf.st_mode)) { strcpy(&confdir[0], "./conf"); /* then CONFDIR as set in Makefile */ } else { strcpy(&confdir[0], CONFDIR); } //printf("config = %s\n", &confdir[0]); #endif /* seed random generator */ gettimeofday(&tv, NULL); srand(tv.tv_sec); config(); /* read system configuration */ init_memory(); /* initialise memory configuration */ init_cpu(); /* initialise CPU */ wrk_ram = mem_base(); /* set work pointer for memory */ /* fill memory content with some initial value */ if (m_flag >= 0) { memset((char *) wrk_ram, m_flag, 65536); } else { for (i = 0; i < 65536; i++) *(wrk_ram + i) = (BYTE) (rand() % 256); } init_rom(); /* initialise ROM's */ if (l_flag) /* load core */ if (load_core()) return(1); int_on(); /* initialize UNIX interrupts */ init_io(); /* initialize I/O devices */ mon(); /* run system */ if (s_flag) /* save core */ save_core(); exit_io(); /* stop I/O devices */ int_off(); /* stop UNIX interrupts */ return(0); }
int main(int argc, char *argv[]) { register char *s, *p; register char *pn = argv[0]; // configure the I/O ports AD1PCFG = 0xFFFF; // Default all pins to digital mJTAGPortEnable(0); // turn off jtag // setup the CPU SYSTEMConfigPerformance(CLOCKFREQ); // System config performance mOSCSetPBDIV(OSC_PB_DIV_1); // fix the peripheral bus to half main clock speed INTEnableSystemMultiVectoredInt(); TRISBbits.TRISB15 = 0; // TRISDbits.TRISD11 = 0; // ODCDbits.ODCD11 = 1; // LATDbits.LATD11=0; TRISBbits.TRISB13 = 0; ODCBbits.ODCB13 = 1; PORTBbits.RB13=0; #ifdef UARTConsole UARTInit(); #endif initKeyboard(); #ifdef UseVideo initVideo(); #endif #ifdef CPU_SPEED f_flag = CPU_SPEED; tmax = CPU_SPEED * 10000; #endif argc = 0; while (--argc > 0 && (*++argv)[0] == '-') for (s = argv[0] + 1; *s != '\0'; s++) switch (*s) { case 's': /* save core and CPU on exit */ s_flag = 1; break; case 'l': /* load core and CPU from file */ l_flag = 1; break; #ifdef Z80_UNDOC case 'z': /* trap undocumented Z80 ops */ z_flag = 1; break; #endif case 'i': /* trap I/O on unused ports */ i_flag = 1; break; case 'm': /* initialize Z80 memory */ m_flag = exatoi(s + 1); s += strlen(s + 1); break; case 'f': /* set emulation speed */ f_flag = atoi(s + 1); s += strlen(s + 1); tmax = f_flag * 10000; break; case 'x': /* get filename with Z80 executable */ x_flag = 1; s++; p = xfn; while (*s) *p++ = *s++; *p = '\0'; s--; break; case '?': goto usage; default: printf("illegal option %c\n", *s); #ifndef Z80_UNDOC usage: printf("usage:\t%s -s -l -i -mn -fn -xfilename\n", pn); #else usage: printf("usage:\t%s -s -l -i -z -mn -fn -xfilename\n", pn); #endif puts("\ts = save core and cpu"); puts("\tl = load core and cpu"); puts("\ti = trap on I/O to unused ports"); #ifdef Z80_UNDOC puts("\tz = trap on undocumented Z80 ops"); #endif puts("\tm = init memory with n"); puts("\tf = CPU frequenzy n in MHz"); puts("\tx = load and execute filename"); exit(1); } putchar('\n'); puts("####### ##### ### ##### ### # #"); puts(" # # # # # # # # ## ##"); puts(" # # # # # # # # # # #"); puts(" # ##### # # ##### ##### # # # #"); puts(" # # # # # # # # #"); puts(" # # # # # # # # # #"); puts("####### ##### ### ##### ### # #"); printf("\nRelease %s, %s\n", RELEASE, COPYR); printf("\nPort to PIC32 By kenseglerdesigns.com\n"); if (f_flag > 0) printf("\nCPU speed is %d MHz\n", f_flag); else printf("\nCPU speed is unlimited\n"); #ifdef USR_COM printf("\n%s Release %s, %s\n", USR_COM, USR_REL, USR_CPR); #endif fflush(stdout); wrk_ram = PC = ram; STACK = ram +0xffff; memset((char *) ram, m_flag, 65536); if (l_flag) if (load_core()) return (1); int_on(); init_io(); mon(); if (s_flag) save_core(); exit_io(); int_off(); return (0); }