private void got_ram(byte[] data, object none) { C64RAM ram = C64RAM.getInstace(); ram.injectBinaryData(m_startAddress, data); renderChars(m_startAddress); }
private void got_ram(byte[] data, object none) { C64RAM ram = C64RAM.getInstace(); ram.injectBinaryData(m_startAddress + 0x2000, data); renderSprites(); }
private void got_screen(byte[] data, object none) { C64RAM ram = C64RAM.getInstace(); ram.injectBinaryData(m_screenAddress, data); VICECOMManager vcom = VICECOMManager.getVICEComManager(); vcom.addBinaryMemCommand(m_screenAddress, m_charAddress + 0x800, new CommandStruct.CS_BinaryDelegate(got_char), null, this.Dispatcher); }
private void got_char(byte[] data, object none) { C64RAM ram = C64RAM.getInstace(); ram.injectBinaryData(m_screenAddress, data); VICECOMManager vcom = VICECOMManager.getVICEComManager(); vcom.addTextCommand("bank cpu", CommandStruct.eMode.DoCommandThrowAwayResults, null, null, null); renderScreen(); }
public void renderBitmap() { //byte[] imageArray = new byte[(16 * 24) * (16 * 21) * 4]; //16x16 with 4 bits per pixel m_wb = new WriteableBitmap(640, 200, 96, 96, PixelFormats.Bgra32, BitmapPalettes.WebPalette); int width = Convert.ToInt32(widthBox.Text); int stride = Convert.ToInt32(strideBox.Text); int height = Convert.ToInt32(heightBox.Text); int bytesPerLines = width + stride; Int32Rect rect = new Int32Rect(); if (doubleCheck.IsChecked ?? true) { rect.Width = 2; } else { rect.Width = 1; } rect.Height = 1; C64RAM ramObjc = C64RAM.getInstace(); byte[] ram = ramObjc.getRAM(); for (int y = 0; y < height * 8; ++y) { int startAddress = m_startAddress + (y * bytesPerLines); rect.Y = y; for (int x = 0; x < width; ++x) { byte r = ram[startAddress + x]; for (int p = 0; p < 8; p += 1) { rect.X = x * 8 * rect.Width + p * rect.Width; if ((r & 128) == 128) { m_wb.WritePixels(rect, VICPallete.getSafePalBGR32(1), 8 /*4*rect.Width*/, 0); } else { m_wb.WritePixels(rect, VICPallete.getSafePalBGR32(0), 8 /*4*rect.Width*/, 0); } r = (byte)(r << 1); //get next pixel } // p } } canvas.Source = m_wb; }
private void canvas_ToolTipOpening(object sender, ToolTipEventArgs e) { Point mouse = Mouse.GetPosition(canvas); double x = mouse.X / 8.0; double y = mouse.Y / 8.0; int charX = (int)Math.Floor(x); int charY = (int)Math.Floor(y); C64RAM ram = C64RAM.getInstace(); byte[] RAM = ram.getRAM(); int rowPtr = m_screenAddress + (charY * 40); byte c = RAM[rowPtr + charX]; int charAddress = m_charAddress + ((int)c * 8); hoverTip.Content = string.Format("{0},{1}@{2:X04}({3:X02})", charX, charY, rowPtr + charX, c); }
private void renderScreen() { C64RAM ram = C64RAM.getInstace(); byte[] RAM = ram.getRAM(); m_wb = new WriteableBitmap(320, 200, 96, 96, PixelFormats.Bgra32, BitmapPalettes.WebPalette); for (int y = 0; y < 25; ++y) { int rowPtr = m_screenAddress + (y * 40); for (int x = 0; x < 40; ++x) { byte c = RAM[rowPtr + x]; int charAddress = m_charAddress + ((int)c * 8); VICIIRenderer.renderChar(charAddress, x, y, m_hiresOrMulti[x, y], m_charColour, m_backgroundColour, m_mulCol0, m_mulCol1, m_wb); } //x } //y canvas.Source = m_wb; }
private void canvas_ToolTipOpening(object sender, ToolTipEventArgs e) { Point mouse = Mouse.GetPosition(canvas); double x = mouse.X / 24.0; double y = mouse.Y / 21.0; int SpriteX = (int)Math.Floor(x); int SpriteY = (int)Math.Floor(y); C64RAM ram = C64RAM.getInstace(); byte[] RAM = ram.getRAM(); int dataPtr = (m_startBank * (64 * 1024)) + m_startAddress; dataPtr += SpriteY * (16 * 64); dataPtr += SpriteX * 64; hoverTip.Content = string.Format("{0:X02}@{1:X04}", SpriteY * 16 + SpriteX, dataPtr); }
private void canvas_MouseDown(object sender, MouseButtonEventArgs e) { if (e.LeftButton == MouseButtonState.Pressed && e.ClickCount == 2) { Point clickPoint = e.GetPosition(canvas); double x = clickPoint.X / 8.0; double y = clickPoint.Y / 8.0; int CharX = (int)Math.Floor(x); int CharY = (int)Math.Floor(y); m_hiresOrMulti[CharX, CharY] = !m_hiresOrMulti[CharX, CharY]; int CharPtr = m_screenAddress + (CharY * 40) + CharX; C64RAM ram = C64RAM.getInstace(); byte[] RAM = ram.getRAM(); int dataPtr = m_charAddress + (8 * RAM[CharPtr]); VICIIRenderer.renderChar(dataPtr, CharX, CharY, m_hiresOrMulti[CharX, CharY], m_charColour, m_backgroundColour, m_mulCol0, m_mulCol1, m_wb); } }
public static void renderChar(int addr, int charX, int charY, bool multicolour, int charColour, int backgroundColour, int mulCol0, int mulCol1, WriteableBitmap wb) { byte[] ram; //check to see if we are using an extra charset if (addr < (int)eExtraCharsets.extraCharsetStart) { C64RAM ramObjc = C64RAM.getInstace(); ram = ramObjc.getRAM(); } else { if (addr >= (int)eExtraCharsets.hexCharset1 && addr < (int)eExtraCharsets.hexCharset1 + 0x800) { ram = charsetHex1; addr &= 0x7ff; } else if (addr >= (int)eExtraCharsets.hexCharset2 && addr < (int)eExtraCharsets.hexCharset2 + 0x800) { ram = charsetHex2; addr &= 0x7ff; } else if (addr >= (int)eExtraCharsets.hexCharset3 && addr < (int)eExtraCharsets.hexCharset3 + 0x800) { ram = charsetHex3; addr &= 0x7ff; } else if (addr >= (int)eExtraCharsets.charrom_lo && addr < (int)eExtraCharsets.charrom_hi + 0x800) { ram = charsetCHARROM; addr &= 0xfff; } else { C64RAM ramObjc = C64RAM.getInstace(); ram = ramObjc.getRAM(); } } Int32Rect rect = new Int32Rect(); if (multicolour) { rect.Width = 2; } else { rect.Width = 1; } rect.Height = 1; int spriteTLX = charX * 8; int spriteTLY = charY * 8; for (int sy = 0; sy < 8; ++sy) { rect.Y = spriteTLY + sy; for (int sx = 0; sx < 1; ++sx) { byte r = ram[addr]; //int bitmapIndex = ((spriteTLY + sy) * (24 * 4)) + ((spriteTLX + (sx*8)) * 4); if (multicolour) { for (int p = 0; p < 8; p += 2) { rect.X = spriteTLX + (sx * 8) + p; switch (r & 192) { default: case 0: //%00 wb.WritePixels(rect, VICPallete.getSafePalBGR32(backgroundColour), 8, 0); break; case 64: //%01 wb.WritePixels(rect, VICPallete.getSafePalBGR32(mulCol0), 8, 0); break; case 128: //%10 wb.WritePixels(rect, VICPallete.getSafePalBGR32(mulCol1), 8, 0); break; case 192: //%11 wb.WritePixels(rect, VICPallete.getSafePalBGR32(charColour), 8, 0); break; } r = (byte)(r << 2); //get next pixel } } else { for (int p = 0; p < 8; ++p) { rect.X = spriteTLX + (sx * 8) + p; if ((r & 128) == 128) { wb.WritePixels(rect, VICPallete.getSafePalBGR32(charColour), 4, 0); } else { wb.WritePixels(rect, VICPallete.getSafePalBGR32(backgroundColour), 4, 0); } r = (byte)(r << 1); //get next pixel } // p } addr++; } //sx } //sy }
void renderSprite(int addr, int spriteX, int spriteY, bool multicolour, int sprColour, WriteableBitmap wb) { C64RAM ramObjc = C64RAM.getInstace(); byte[] ram = ramObjc.getRAM(); Int32Rect rect = new Int32Rect(); if (multicolour) { rect.Width = 2; } else { rect.Width = 1; } rect.Height = 1; int spriteTLX = spriteX * 24; int spriteTLY = spriteY * 21; for (int sy = 0; sy < 21; ++sy) { rect.Y = spriteTLY + sy; for (int sx = 0; sx < 3; ++sx) { byte r = ram[addr]; //int bitmapIndex = ((spriteTLY + sy) * (24 * 4)) + ((spriteTLX + (sx*8)) * 4); if (multicolour) { for (int p = 0; p < 8; p += 2) { rect.X = spriteTLX + (sx * 8) + p; switch (r & 192) { default: case 0: //%00 wb.WritePixels(rect, VICPallete.getSafePalBGR32(m_backgroundColour), 8, 0); break; case 64: //%01 wb.WritePixels(rect, VICPallete.getSafePalBGR32(m_mulCol0), 8, 0); break; case 128: //%10 wb.WritePixels(rect, VICPallete.getSafePalBGR32(sprColour), 8, 0); break; case 192: //%11 wb.WritePixels(rect, VICPallete.getSafePalBGR32(m_mulCol1), 8, 0); break; } r = (byte)(r << 2); //get next pixel } } else { for (int p = 0; p < 8; ++p) { rect.X = spriteTLX + (sx * 8) + p; if ((r & 128) == 128) { wb.WritePixels(rect, VICPallete.getSafePalBGR32(sprColour), 4, 0); } else { wb.WritePixels(rect, VICPallete.getSafePalBGR32(m_backgroundColour), 4, 0); } r = (byte)(r << 1); //get next pixel } // p } addr++; } //sx } //sy }