/** This function parses the specified configuration file. It loads its contents not a lot of checking is done here. It returns 0 on "success" and 1 on known error. */ int CliParseCfg (char *Filename) { char s[129] = { 0 }; int KeyCode, Channel, Value, Result = 1; char Logic; FILE *fin; fin = rfopen (Filename, "r"); if (fin) { Result = 0; while (NULL != fgets (s, sizeof (s) - 1, fin)) { char *ss; /* Find newline or form feed and replace with string termination */ for (ss = s; *ss; ss++) if (*ss == '\n' || *ss == '\r') *ss = 0; /* Parse string */ if (4 == sscanf(s,"DEBUG %d %o %c %x",&KeyCode,&Channel,&Logic,&Value)) { /* Ensure valid values are porvided */ if (Channel < 0 || Channel > 255) continue; if (Logic != '=' && Logic != '&' && Logic != '|' && Logic != '^') continue; if (Value != (Value & 0x7FFF)) continue; if (KeyCode < 0 || KeyCode > 31) continue; if (NumDebugRules >= MAX_DEBUG_RULES) break; /* Set the Debug Rules */ DebugRules[NumDebugRules].KeyCode = KeyCode; DebugRules[NumDebugRules].Channel = Channel; DebugRules[NumDebugRules].Logic = Logic; DebugRules[NumDebugRules].Value = Value; NumDebugRules++; } else if (!strcmp (s, "LMSIM")) CmOrLm = 0; else if (!strcmp (s, "CMSIM")) CmOrLm = 1; } fclose (fin); } return (Result); }
int HFE_HDDD_A2_libWrite_DiskFile(HXCFLOPPYEMULATOR* floppycontext,FLOPPY * floppy,char * filename) { pictrack * track; FILE * hxcpicfile; picfileformatheader * FILEHEADER; unsigned char * mfmtracks0,*mfmtracks1,*mfmtrackfinal; unsigned char * offsettrack; int mfmsize,mfmsize2,i_conv; unsigned int i,j,k; unsigned int trackpos; unsigned int tracklistlen; unsigned int tracksize; unsigned short fm_pulses; floppycontext->hxc_printf(MSG_INFO_1,"Write HFE file %s for the standalone emulator (with HDDD A2 support).",filename); if(!floppy->floppyNumberOfTrack) { floppycontext->hxc_printf(MSG_ERROR,"Cannot create zero track HFE file"); return -1; } ramfile=0; ramfile_size=0; hxcpicfile=rfopen(filename,"wb"); if(hxcpicfile) { FILEHEADER=(picfileformatheader *) malloc(512); memset(FILEHEADER,0xFF,512); memcpy(&FILEHEADER->HEADERSIGNATURE,"HXCPICFE",8); FILEHEADER->number_of_track=(unsigned char)floppy->floppyNumberOfTrack; FILEHEADER->number_of_side=floppy->floppyNumberOfSide; if(floppy->floppyBitRate!=VARIABLEBITRATE) { FILEHEADER->bitRate=(floppy->floppyBitRate * 2)/1000; } else { if(floppy->tracks[0]->sides[0]->bitrate == VARIABLEBITRATE) FILEHEADER->bitRate=(unsigned short)((unsigned long)(floppy->tracks[0]->sides[0]->timingbuffer[ (floppy->tracks[0]->sides[0]->tracklen/8) / 2] * 2)/1000); else FILEHEADER->bitRate=(floppy->tracks[0]->sides[0]->bitrate * 2)/1000; } FILEHEADER->floppyRPM=0;//floppy->floppyRPM; FILEHEADER->floppyinterfacemode=(unsigned char)floppy->floppyiftype; floppycontext->hxc_printf(MSG_INFO_1,"Floppy interface mode %s (%s)", hxcfe_getFloppyInterfaceModeName(floppycontext,FILEHEADER->floppyinterfacemode), hxcfe_getFloppyInterfaceModeDesc(floppycontext,FILEHEADER->floppyinterfacemode) ); FILEHEADER->track_encoding=0; FILEHEADER->formatrevision=0; FILEHEADER->track_list_offset=1; FILEHEADER->write_protected=1; if(floppy->tracks[floppy->floppyNumberOfTrack/2]->sides[0]->track_encoding) { FILEHEADER->track_encoding=floppy->tracks[floppy->floppyNumberOfTrack/2]->sides[0]->track_encoding; } if( FILEHEADER->track_encoding == APPLEII_GCR1_ENCODING ) { FILEHEADER->track_encoding = APPLEII_HDDD_A2_GCR1_ENCODING; } if( FILEHEADER->track_encoding == APPLEII_GCR2_ENCODING ) { FILEHEADER->track_encoding = APPLEII_HDDD_A2_GCR2_ENCODING; } if(floppy->double_step) FILEHEADER->single_step=0x00; else FILEHEADER->single_step=0xFF; rfwrite(FILEHEADER,512,1,hxcpicfile); tracklistlen=((((((FILEHEADER->number_of_track)+1)*sizeof(pictrack))/512)+1)); offsettrack=(unsigned char*) malloc(tracklistlen*512); memset(offsettrack,0xFF,tracklistlen*512); i=0; trackpos=FILEHEADER->track_list_offset+tracklistlen; while(i<(FILEHEADER->number_of_track)) { mfmsize=0; mfmsize2=0; mfmsize=floppy->tracks[i]->sides[0]->tracklen * 2; if(mfmsize&7) mfmsize=(mfmsize/8)+1; else mfmsize=mfmsize/8; if(floppy->tracks[i]->number_of_side==2) { mfmsize2=floppy->tracks[i]->sides[1]->tracklen * 2; if(mfmsize2&7) mfmsize2=(mfmsize2/8)+1; else mfmsize2=mfmsize2/8; } if(mfmsize2>mfmsize) mfmsize=mfmsize2; if(mfmsize*2>0xFFFF) { floppycontext->hxc_printf(MSG_ERROR,"Argg!! track %d too long (%x) and shorten to 0xFFFF !",i,mfmsize*2); mfmsize=0x7FFF; } track=(pictrack *)(offsettrack+(i*sizeof(pictrack))); track->track_len=mfmsize*2; track->offset=trackpos; if((mfmsize*2)%512) trackpos=trackpos+(((mfmsize*2)/512)+1); else trackpos=trackpos+((mfmsize*2)/512); //trackpos=trackpos+(((mfmsize*2)/512)+1); i++; }; rfwrite(offsettrack,512*tracklistlen,1,hxcpicfile); i=0; while(i<(FILEHEADER->number_of_track)) { mfmsize=floppy->tracks[i]->sides[0]->tracklen * 2; if(mfmsize&7) mfmsize=(mfmsize/8)+1; else mfmsize=mfmsize/8; mfmsize2=0; if(floppy->tracks[i]->number_of_side==2) { mfmsize2=floppy->tracks[i]->sides[1]->tracklen * 2; if(mfmsize2&7) mfmsize2=(mfmsize2/8)+1; else mfmsize2=mfmsize2/8; } if(mfmsize>0x7FFF) { mfmsize=0x7FFF; } if(mfmsize2>0x7FFF) { mfmsize2=0x7FFF; } track=(pictrack *)(offsettrack+(i*sizeof(pictrack))); if(track->track_len%512) tracksize=((track->track_len&(~0x1FF))+0x200)/2;//(((track->track_len/512)+1)*512)/2; else tracksize=track->track_len/2; mfmtracks0=(unsigned char*) malloc(tracksize); mfmtracks1=(unsigned char*) malloc(tracksize); mfmtrackfinal=(unsigned char*) malloc(tracksize*2); memset(mfmtracks0,0x00,tracksize); memset(mfmtracks1,0x00,tracksize); memset(mfmtrackfinal,0x55,tracksize*2); for(i_conv=0;i_conv<(mfmsize/2);i_conv++) { // Add the FM Clocks fm_pulses = ext_a2_bit_expander[floppy->tracks[i]->sides[0]->databuffer[i_conv]] | 0x2222; mfmtracks0[(i_conv*2)+0] = fm_pulses >> 8; mfmtracks0[(i_conv*2)+1] = fm_pulses & 0xFF; } addpad(mfmtracks0,mfmsize,tracksize); if(floppy->tracks[i]->number_of_side==2) { for(i_conv=0;i_conv<(mfmsize2/2);i_conv++) { // Add the FM Clocks fm_pulses = ext_a2_bit_expander[floppy->tracks[i]->sides[1]->databuffer[i_conv]] | 0x2222; mfmtracks1[(i_conv*2)+0] = fm_pulses >> 8; mfmtracks1[(i_conv*2)+1] = fm_pulses & 0xFF; } addpad(mfmtracks1,mfmsize2,tracksize); } else { memset(mfmtracks1,0xAA,tracksize); } for(k=0;k<tracksize/256;k++) { for(j=0;j<256;j++) { // inversion des bits pour le EUSART du PIC. // head 0 mfmtrackfinal[(k*512)+j]= bit_inverter[mfmtracks0[(k*256)+j]]; // head 1 mfmtrackfinal[(k*512)+j+256]= bit_inverter[mfmtracks1[(k*256)+j]]; } } rfwrite(mfmtrackfinal,tracksize*2,1,hxcpicfile); free(mfmtracks0); free(mfmtracks1); free(mfmtrackfinal); i++; }; free(offsettrack); #ifdef FASTWRITE hxcpicfile=hxc_fopen(filename,"wb"); if(hxcpicfile) { fwrite(ramfile,ramfile_size,1,hxcpicfile); hxc_fclose(hxcpicfile); } else { rfclose(hxcpicfile); floppycontext->hxc_printf(MSG_ERROR,"Cannot create %s!",filename); return -1; } #endif rfclose(hxcpicfile); floppycontext->hxc_printf(MSG_INFO_1,"%d tracks written to the file",FILEHEADER->number_of_track); free(FILEHEADER); return 0; }
int agc_load_binfile(agc_t *State, const char *RomImage) { FILE *fp = NULL; int Bank; int m, n, i, j; int RetVal = 0; // The following sequence of steps loads the ROM image into the simulated // core memory, in what I think is a pretty obvious way. fp = rfopen (RomImage, "rb"); if (fp == NULL){ RetVal = 1; goto Done; } fseek (fp, 0, SEEK_END); n = ftell (fp); if (0 != (n & 1)){ // Must be an integral number of words. RetVal = 3; goto Done; } n /= 2; // Convert byte-count to word-count. if (n > 36 * 02000){ RetVal = 2; goto Done; } fseek (fp, 0, SEEK_SET); if (State == NULL){ RetVal = 4; goto Done; } Bank = 2; for (Bank = 2, j = 0, i = 0; i < n; i++) { unsigned char In[2]; m = fread (In, 1, 2, fp); if (m != 2){ RetVal = 5; goto Done; } // Within the input file, the fixed-memory banks are arranged in the order // 2, 3, 0, 1, 4, 5, 6, 7, ..., 35. Therefore, we have to take a little care // reordering the banks. if (Bank > 35) { RetVal = 2; goto Done; } State->Fixed[Bank][j++] = (In[0] * 256 + In[1]) >> 1; if (j == 02000) { j = 0; // Bank filled. Advance to next fixed-memory bank. if (Bank == 2) Bank = 3; else if (Bank == 3) Bank = 0; else if (Bank == 0) Bank = 1; else if (Bank == 1) Bank = 4; else Bank++; } } Done: if (fp != NULL) fclose (fp); return (RetVal); }