int bsave(char *nom,void *adr,long offset,long len) { void *buffer; long filesize; HMMIO fp; int r= -1; char nom2[200]; verifnom(nom,nom2); fp = mmioOpen(nom2,NULL,MMIO_READ); if (fp) { r=0; filesize = mmioSeek(fp, 0L, SEEK_END); mmioClose(fp,NULL); if (!r) { r= -1; buffer=memalloc(filesize); if (buffer) { if (!bload(nom,buffer,0L,filesize)) { bmove(adr,(char *)buffer+offset,len); r=bmake(nom,buffer,filesize); } memfree((void **)&buffer); } } } return(r); }
int bload_command() { char *file_name; VALUE arg_ptr; /*============================================*/ /* Check for appropriate number of arguments. */ /*============================================*/ if (arg_num_check("bload",EXACTLY,1) == -1) return; /*==========================================================*/ /* Get the file name from which to load binary information. */ /*==========================================================*/ if (arg_type_check("bload",1,STRING,&arg_ptr) == FALSE) return; file_name = rvalstring(arg_ptr); /*===============================================*/ /* Call the bload function to perform the bload. */ /*===============================================*/ bload(file_name); }
int main(int argc,char* argv[]) { SDL_Surface* surface; SDL_Event event; FILE* fp; int i,j; unsigned char s[4]; char path[16]; int cn,pn,bn; unsigned short* ptr; int vx,vy,vp,pp; unsigned int n; unsigned int ticks; int mx; int my; pthread_t tid; puts("Start VGS mk-II SR for Linux."); /* Load ROMDATA.BIN */ fp=fopen("ROMDATA.BIN","rb"); if(NULL==fp) { fprintf(stderr,"ROMDATA.BIN was not found.\n"); return 1; } /* allocate table */ BN=0; BR=NULL; fread(&BN,sizeof(BN),1,fp); if(BN<1) { fprintf(stderr,"Inalid ROMDATA.BIN: record number\n"); fclose(fp); return 1; } if(NULL==(BR=(struct _BINREC*)malloc(BN * sizeof(struct _BINREC)))) { fprintf(stderr,"No memory.\n"); fclose(fp); return 1; } memset(BR,0,BN * sizeof(struct _BINREC)); /* read filename */ for(i=0;i<BN;i++) { memset(BR[i].name,0,16); fread(&BR[i].name,16,1,fp); for(j=0;'\0'!=BR[i].name[j];j++) { if(15==j) { fprintf(stderr,"ROM data is broken.\n"); fclose(fp); return 1; } BR[i].name[j]^=0xAA; } } /* read data */ for(i=0;i<BN;i++) { fread(s,4,1,fp); BR[i].size=s[0]; BR[i].size<<=8; BR[i].size|=s[1]; BR[i].size<<=8; BR[i].size|=s[2]; BR[i].size<<=8; BR[i].size|=s[3]; if(NULL==(BR[i].data=(char*)malloc(BR[i].size))) { fprintf(stderr,"Could not allocate ROM data area: errno=%d (size=%d)\n",errno,BR[i].size); fclose(fp); return 1; } fread(BR[i].data,BR[i].size,1,fp); } fclose(fp); /* Extract data */ cn=0; pn=0; bn=0; for(i=0;i<256;i++) { sprintf(path,"GSLOT%03d.CHR",i); if(0==gload(i,path)) cn++; sprintf(path,"ESLOT%03d.PCM",i); if(0==eload(i,path)) pn++; sprintf(path,"BSLOT%03d.BGM",i); if(0==bload(i,path)) bn++; } printf("Extracted ROM data: CHR=%d PCM=%d BGM=%d\n",cn,pn,bn); /* Initialize SDL */ if(SDL_Init(SDL_INIT_VIDEO)) { fprintf(stderr,"Failed: SDL_Init(SDL_INIT_VIDEO)\n"); return 1; } SDL_WM_SetCaption("VGS mk-II SR for Linux",NULL); /* Initialize Surface */ surface=SDL_SetVideoMode(XSIZE*2,YSIZE*2,16,SDL_SWSURFACE); if(NULL==surface) { fprintf(stderr,"Could not create the surface.\n"); return 1; } if(2!=surface->format->BytesPerPixel) { fprintf(stderr,"This display does not support 16bit color.\n"); return 1; } printf("Created surface: %dx%d\n",surface->w,surface->h); /* Initialize sound system */ if(init_sound()) { fprintf(stderr,"Could not create the sound thread.\n"); return 1; } /* Initialize user program */ if(vgs2_init()) { fprintf(stderr,"Initialization of the app has failed.\n"); return 2; } make_pallet(); n=0; while(1) { ticks=SDL_GetTicks(); SDL_PollEvent(&event); if(event.type==SDL_QUIT) break; if(SDL_GetMouseState(&mx,&my)&SDL_BUTTON(1)) { mx/=2; my/=2; if(!_touch.s) { _touch.dx=0; _touch.dy=0; _touch.px=mx; _touch.py=my; _touch.cx=mx; _touch.cy=my; } else { _touch.dx=mx-_touch.px; _touch.dy=my-_touch.py; _touch.px=_touch.cx; _touch.py=_touch.cy; _touch.cx=mx; _touch.cy=my; } _touch.s=1; _touch.t++; } else { _touch.s=0; _touch.t=0; } if(_pause) { if(vgs2_pause()) break; } else { if(vgs2_loop()) break; } if(SDL_MUSTLOCK(surface) && SDL_LockSurface(surface)<0) { fprintf(stderr,"Skip frame: could not locked surface.\n"); usleep(100000); continue; } ptr=(unsigned short*)surface->pixels; vp=0; pp=0; if(_interlace) { for(vy=0;vy<YSIZE;vy++) { for(vx=0;vx<XSIZE;vx++) { if(_vram.sp[vp]) { ptr[pp]=ADPAL[_vram.sp[vp]]; ptr[pp+1]=ADPAL[_vram.sp[vp]]; ptr[pp+320]=0; ptr[pp+321]=0; _vram.sp[vp]=0; } else { ptr[pp]=ADPAL[_vram.bg[vp]]; ptr[pp+1]=ADPAL[_vram.bg[vp]]; ptr[pp+320]=0; ptr[pp+321]=0; } vp++; pp+=2; } pp+=320; } } else { for(vy=0;vy<YSIZE;vy++) { for(vx=0;vx<XSIZE;vx++) { if(_vram.sp[vp]) { ptr[pp]=ADPAL[_vram.sp[vp]]; ptr[pp+1]=ADPAL[_vram.sp[vp]]; ptr[pp+320]=ADPAL[_vram.sp[vp]]; ptr[pp+321]=ADPAL[_vram.sp[vp]]; _vram.sp[vp]=0; } else { ptr[pp]=ADPAL[_vram.bg[vp]]; ptr[pp+1]=ADPAL[_vram.bg[vp]]; ptr[pp+320]=ADPAL[_vram.bg[vp]]; ptr[pp+321]=ADPAL[_vram.bg[vp]]; } vp++; pp+=2; } pp+=320; } } if(SDL_MUSTLOCK(surface)) SDL_UnlockSurface(surface); SDL_UpdateRect(surface,0,0,320,400); n++; ticks=SDL_GetTicks()-ticks; switch(n%3) { case 0: case 1: if(ticks<17) { msleep(17-ticks); } break; case 2: if(ticks<16) { msleep(16-ticks); } break; } } vgs2_term(); SDL_Quit(); term_sound(); puts("End."); return 0; }
int initsystem(void) { int r=0; int i,j; unsigned char m; int cfg[3]; srand(*(int *)0x0040006cL); clrscr(); m=*(unsigned char *)0xf000fffeL; if ((m==0xfe)||(m==0xfb)||(m==0xff)) for(i=0;i<256;i++) codekey[i]=codepcxt[i]; if ((m==0xfc)&&(!testce())) for(i=0;i<256;i++) codekey[i]=codeat[i]; initkbd(); if (bexist("speech.cfg")) { bload("speech.cfg",cfg,0L,6L); sndblast=cfg[0]; dacport=cfg[1]; speaker=cfg[2]; } else { printf("VGA 256Ko card required.\n\n"); printf(" SPEECH.CFG not found. Creating it...\n"); printf(" Erase it if you want to modify speech device.\n\n"); printf(" Please select your speech device:\n\n"); printf("0: no sound\n"); printf("1: internal speaker (only efficient on fast computers)\n"); printf("2: soundblaster card (22ch)\n"); printf("3: soundmaster+ card (22fh)\n"); printf("4: card using 'LPT1' (%xh)\n",*(int *)0x00400008L); printf("5: modify soundblaster base address\n"); printf("6: other DAC port\n"); do { r=getch(); if ((r>47)&&(r<55)) r-=48; else r=-1; } while(r==-1); if (r==1) { dacport=0x42; speaker=1; } if (r==2) { dacport=0x22c; sndblast=1; } if (r==3) dacport=0x22f; if (r==4) dacport=*(int *)0x00400008L; if (r==5) sndblast=1; if (r>4) { if (r==5) printf("soundblaster DAC port is base address + 00c\n"); else printf("Enter your EXACT DAC port (base address + correct offset)\n"); do { printf("Enter your DAC port:"); dacport=0; for(i=0;i<3;i++) { do { r=getch(); if ((r>47)&&(r<58)) r-=48; else if ((r>96)&&(r<103)) r-=87; else if ((r>64)&&(r<71)) r-=55; else r=-1; if (r!=-1) if (r<10) printf("%c",r+48); else printf("%c",r+55); } while(r==-1); dacport=dacport*16+r; } printf("\nIs %xh correct? (Yes/No)\n",dacport); r=getch(); } while((r!='y')&&(r!='Y')); } cfg[0]=sndblast; cfg[1]=dacport; cfg[2]=speaker; bmake("speech.cfg",cfg,6L); } if (initscreen()) { initmouse(); if (sndblast) sendinit(0xd1); if (speaker) inithp(); if (dacport) initspl(); r=1; for(i=0;i<16;i++) for(j=0;j<16;j++) { m=defaultmouse[i*16+j]; plot(j,i,(int)m); if (m==255) plot(j,i+16,0); else plot(j,i+16,255); } initbloc(&mousefond); initbloc(&mousebloc); getbloc(&mousebloc,0,0,16,16); getmask(&mousebloc,0,16); cls(); show(); } else { killkbd(); printf("\nVGA card not found.\n"); } return r; }