public void SauveImp(string fileName) { int nbImages = main.GetMaxImages(); int l = 0; for (int i = 0; i < nbImages; i++) { main.SelectImage(i, true); Convert(!bitmapCpc.isCalc, true); l += MakeSprite().Length; } l += 3; // 3 octets de fin de fichier byte[] endData = { (byte)nbImages, (byte)(BitmapCpc.TailleX >> 3), (byte)(BitmapCpc.TailleY >> 1) }; CpcAmsdos entete = CpcSystem.CreeEntete(fileName, 0x4000, (short)l, -13622); BinaryWriter fp = new BinaryWriter(new FileStream(fileName, FileMode.Create)); fp.Write(CpcSystem.AmsdosToByte(entete)); for (int i = 0; i < nbImages; i++) { main.SelectImage(i, true); byte[] sprite = MakeSprite(); fp.Write(sprite, 0, sprite.Length); } fp.Write(endData, 0, endData.Length); fp.Close(); }
public void SavePaletteKit(string fileName, int[] palette) { CpcAmsdos entete = CpcSystem.CreeEntete(Path.GetFileName(fileName), -32768, 30, 0); BinaryWriter fp = new BinaryWriter(new FileStream(fileName, FileMode.Create)); fp.Write(CpcSystem.AmsdosToByte(entete)); for (int i = 0; i < 15; i++) { int kit = BitmapCpc.paletteSprite[i + 1]; byte c1 = (byte)(((kit & 0x0F) << 4) + ((kit & 0xF0) >> 4)); byte c2 = (byte)(kit >> 8); fp.Write(c1); fp.Write(c2); } fp.Close(); SetInfo(multilingue.GetString("Main.prg.TxtInfo13")); }
static public void SauvePalette(string NomFic, ImageCpc bitmapCpc, Param param) { int i; byte[] pal = new byte[239]; pal[0] = (byte)param.modeVirtuel; int indexPal = 3; if (param.cpcPlus) { for (i = 0; i < 16; i++) { pal[indexPal++] = (byte)BitmapCpc.CpcVGA[26 - ((BitmapCpc.Palette[i] >> 4) & 0x0F)]; pal[indexPal++] = (byte)BitmapCpc.CpcVGA[26 - (BitmapCpc.Palette[i] & 0x0F)]; pal[indexPal++] = (byte)BitmapCpc.CpcVGA[26 - ((BitmapCpc.Palette[i] >> 8) & 0x0F)]; } pal[195] = pal[3]; pal[196] = pal[4]; pal[197] = pal[5]; } else { for (i = 0; i < 16; i++) { for (int j = 0; j < 12; j++) { pal[indexPal++] = (byte)BitmapCpc.CpcVGA[BitmapCpc.Palette[i]]; } } for (i = 0; i < 12; i++) { pal[indexPal++] = pal[i + 3]; } } CpcAmsdos entete = CpcSystem.CreeEntete(NomFic, (short)-30711, (short)pal.Length, (short)-30711); BinaryWriter fp = new BinaryWriter(new FileStream(NomFic, FileMode.Create)); fp.Write(CpcSystem.AmsdosToByte(entete)); fp.Write(pal, 0, pal.Length); fp.Close(); }
private void SauveSprites(bool allBank = false) { SaveFileDialog dlg = new SaveFileDialog(); dlg.Filter = "Modèle Sprites (.spr)|*.spr"; if (dlg.ShowDialog() == DialogResult.OK) { try { short size = (short)(allBank ? 0x4000 : 0x1000); CpcAmsdos entete = CpcSystem.CreeEntete(Path.GetFileName(dlg.FileName), 0x4000, size, 0); BinaryWriter fp = new BinaryWriter(new FileStream(dlg.FileName, FileMode.Create)); fp.Write(CpcSystem.AmsdosToByte(entete)); byte[] buffer = new byte[size]; int pos = 0; int startBank = allBank ? 0 : numBank; int endBank = allBank ? 4 : numBank + 1; for (int bank = startBank; bank < endBank; bank++) { for (int i = 0; i < 16; i++) { for (int y = 0; y < 16; y++) { for (int x = 0; x < 16; x++) { buffer[pos++] = BitmapCpc.spritesHard[bank, i, x, y]; } } } } fp.Write(buffer); fp.Close(); // Sauvegarde palette au format .KIT main.SavePaletteKit(Path.ChangeExtension(dlg.FileName, "kit"), BitmapCpc.paletteSprite); } catch { main.DisplayErreur("Impossible de sauver les sprites."); } } }
static public int SauveScr(string fileName, BitmapCpc bitmapCpc, ImageCpc img, Param param, bool compact, string version = null, int[,] colMode5 = null) { byte[] bufPack = new byte[0x8000]; bool overscan = (BitmapCpc.NbLig * BitmapCpc.NbCol > 0x3F00); if (param.withPalette && version == null) { if (param.cpcPlus) { ModePal[0] = (byte)(BitmapCpc.modeVirtuel | 0x8C); int k = 1; for (int i = 0; i < 16; i++) { ModePal[k++] = (byte)(((BitmapCpc.Palette[i] >> 4) & 0x0F) | (BitmapCpc.Palette[i] << 4)); ModePal[k++] = (byte)(BitmapCpc.Palette[i] >> 8); } } else { ModePal[0] = (byte)BitmapCpc.modeVirtuel; for (int i = 0; i < 16; i++) { ModePal[1 + i] = (byte)BitmapCpc.Palette[i]; } } } byte[] imgCpc = bitmapCpc.bmpCpc; if (!overscan) { Buffer.BlockCopy(ModePal, 0, imgCpc, 0x17D0, ModePal.Length); if (param.withCode && version == null) { if (param.cpcPlus) { Buffer.BlockCopy(CodeP0, 0, imgCpc, 0x07D0, CodeP0.Length); Buffer.BlockCopy(CodeP1, 0, imgCpc, 0x0FD0, CodeP1.Length); Buffer.BlockCopy(CodeP3, 0, imgCpc, 0x1FD0, CodeP3.Length); } else { Buffer.BlockCopy(CodeStd, 0, imgCpc, 0x07D0, CodeStd.Length); } if (BitmapCpc.modeVirtuel == 3 || BitmapCpc.modeVirtuel == 4) { Buffer.BlockCopy(codeEgx0, 0, imgCpc, 0x37D0, codeEgx0.Length); Buffer.BlockCopy(codeEgx1, 0, imgCpc, 0x2FD0, codeEgx1.Length); imgCpc[0x07F2] = 0xD0; imgCpc[0x07F3] = 0xF7; // CALL 0xF7D0 imgCpc[0x37FA] = 0xEF; // Call 0xEFD0 } } } else { if (BitmapCpc.NbLig * BitmapCpc.NbCol > 0x4000) { Buffer.BlockCopy(ModePal, 0, imgCpc, 0x600, ModePal.Length); if (param.withCode && version == null) { if (param.cpcPlus) { Buffer.BlockCopy(CodeOvP, 0, imgCpc, 0x621, CodeOvP.Length); } else { Buffer.BlockCopy(CodeOv, 0, imgCpc, 0x611, CodeOv.Length); } if (BitmapCpc.modeVirtuel == 3 || BitmapCpc.modeVirtuel == 4) { Buffer.BlockCopy(codeEgx0, 0, imgCpc, 0x1600, codeEgx0.Length); Buffer.BlockCopy(codeEgx1, 0, imgCpc, 0x1640, codeEgx1.Length); if (param.cpcPlus) { imgCpc[0x669] = 0xCD; imgCpc[0x66A] = 0x00; imgCpc[0x66B] = 0x18; // CALL #1800 } else { imgCpc[0x631] = 0x00; imgCpc[0x632] = 0x18; // CALL #1800 } imgCpc[0x1629] = 0x40; imgCpc[0x162A] = 0x18; // CALL #1840 } } } } short startAdr = (short)(overscan ? 0x200 : 0xC000); short exec = (short)(overscan ? param.cpcPlus ? 0x821 : 0x811 : 0xC7D0); CpcAmsdos entete; int lg = BitmapCpc.BitmapSize; if (compact) { lg = PackDepack.Pack(bitmapCpc.bmpCpc, lg, bufPack, 0) + 1; // Prendre 1 octet de marge ? if (param.withCode && version == null) { Buffer.BlockCopy(codeDepack, 0, bufPack, lg, codeDepack.Length); bufPack[lg + 4] = (byte)(startAdr & 0xFF); bufPack[lg + 5] = (byte)(startAdr >> 8); startAdr = (short)(0xA657 - (lg + codeDepack.Length)); bufPack[lg + 1] = (byte)(startAdr & 0xFF); bufPack[lg + 2] = (byte)(startAdr >> 8); bufPack[lg + 32] = (byte)(exec & 0xFF); bufPack[lg + 33] = (byte)(exec >> 8); lg += codeDepack.Length; exec = (short)(0xA657 - codeDepack.Length); } else { startAdr = (short)(0xA657 - lg); exec = 0; } } if (version != null) { // Sauvegarde source assembleur StreamWriter sw = SaveAsm.OpenAsm(fileName, version); int org = 0xA500 - lg - (BitmapCpc.modeVirtuel == 5 ? 600 : 0); sw.WriteLine(" ORG #"+ org.ToString("X4")); sw.WriteLine(" Nolist"); sw.WriteLine("ImageCmp:"); SaveAsm.GenereDatas(sw, bufPack, lg, 16); sw.WriteLine(" List"); if (param.withCode) { sw.WriteLine(" RUN $"); sw.WriteLine("_StartDepack:"); if (BitmapCpc.modeVirtuel == 3 || BitmapCpc.modeVirtuel == 4) { SaveAsm.GenereAfficheModeEgx(sw, BitmapCpc.Palette, overscan); } else { SaveAsm.GenereFormatEcran(sw); if (BitmapCpc.modeVirtuel == 5) { SaveAsm.GenereAfficheModeX(sw, colMode5, overscan); } else { SaveAsm.GenereAfficheStd(sw, img, BitmapCpc.modeVirtuel, BitmapCpc.Palette, overscan); } } } SaveAsm.CloseAsm(sw); } else { entete = CpcSystem.CreeEntete(fileName, startAdr, (short)lg, exec); BinaryWriter fp = new BinaryWriter(new FileStream(fileName, FileMode.Create)); fp.Write(CpcSystem.AmsdosToByte(entete)); fp.Write(compact ? bufPack : bitmapCpc.bmpCpc, 0, lg); fp.Close(); } return(lg); }