From eecc55bbd7990cab93eba4425b3563e1f996c8fd Mon Sep 17 00:00:00 2001 From: Guy Perfect Date: Wed, 16 Oct 2024 16:53:33 -0500 Subject: [PATCH] Display tweaks, add vbGetPixels() --- core/vb.c | 40 ++++++++++++++++++++++++++++++++++++++++ core/vb.h | 1 + core/vip.c | 43 +++++++++++++++++++++++++++++++++++-------- 3 files changed, 76 insertions(+), 8 deletions(-) diff --git a/core/vb.c b/core/vb.c index 391b16e..165a1af 100644 --- a/core/vb.c +++ b/core/vb.c @@ -279,6 +279,46 @@ VBAPI vbOnFrame vbGetFrameCallback(VB *sim) { return sim->onFrame; } +/* Retrieve the most recent frame image pixels */ +VBAPI void vbGetPixels(VB *sim, void *left, int leftStrideX, int leftStrideY, + void *right, int rightStrideX, int rightStrideY) { + uint8_t *dest; /* Output data */ + int offset; /* Horizontal offset of output pixel */ + uint8_t *src; /* Source data */ + int xStride; /* Bytes between output pixels */ + int yStride; /* Bytes between output lines */ + int i, x, y; /* Iterators */ + + /* Process both eyes */ + for (i = 0; i < 2; i++) { + + /* Working variables for left image */ + if (i == 0) { + dest = left; + xStride = leftStrideX; + yStride = leftStrideY; + } + + /* Working variables for right image */ + else { + dest = right; + xStride = rightStrideX; + yStride = rightStrideY; + } + + /* Nothing to do */ + if (dest == NULL) + continue; + + /* Transfer pixels to the destination */ + src = sim->vip.frames[sim->vip.dp.buffer][i]; + for (y = 0; y < 224; y++, dest += yStride) + for (x = offset = 0; x < 384; x++, offset += xStride) + dest[offset] = *src++; + } + +} + /* Retrieve the value of the program counter */ VBAPI uint32_t vbGetProgramCounter(VB *sim) { return sim->cpu.pc; diff --git a/core/vb.h b/core/vb.h index b07e266..d1ac6ea 100644 --- a/core/vb.h +++ b/core/vb.h @@ -107,6 +107,7 @@ VBAPI vbOnException vbGetExceptionCallback(VB *sim); VBAPI vbOnExecute vbGetExecuteCallback (VB *sim); VBAPI vbOnFetch vbGetFetchCallback (VB *sim); VBAPI vbOnFrame vbGetFrameCallback (VB *sim); +VBAPI void vbGetPixels (VB *sim, void *left, int leftStrideX, int leftStrideY, void *right, int rightStrideX, int rightStrideY); VBAPI uint32_t vbGetProgramCounter (VB *sim); VBAPI int32_t vbGetProgramRegister (VB *sim, int index); VBAPI vbOnRead vbGetReadCallback (VB *sim); diff --git a/core/vip.c b/core/vip.c index 8e34b4b..2d3f319 100644 --- a/core/vip.c +++ b/core/vip.c @@ -44,13 +44,26 @@ static void vipThrow(VB *sim, uint16_t cause) { /* Transfer one column of frame buffer pixels to output */ static void vipTransferColumn(VB *sim, int32_t eye) { - int32_t bits; /* Pixel bits from frame buffer */ - int y, z; /* Iterators */ + int32_t bits; /* Pixel bits from frame buffer */ + uint8_t *dest; /* Host frame image output */ + uint8_t *src; /* Simulation frame buffer input */ + int y, z; /* Iterators */ - /* Select source and destination addresses in host memory */ - uint8_t *dest = &sim->vip.frames + /* Select destination address in host memory */ + dest = &sim->vip.frames [sim->vip.dp.buffer][eye][sim->vip.dp.column]; - uint8_t *src = &sim->vip.ram[ + + /* Output is disabled */ + if ((sim->vip.dp.disp & sim->vip.dp.synce) == 0) { + for (z = 0; z < 0x15000; z += 4) { + busWriteBuffer(dest, VB_S32, 0); + dest += 4; + } + return; + } + + /* Select source address in host memory */ + src = &sim->vip.ram[ eye << 16 | sim->vip.dp.buffer << 15 | sim->vip.dp.column << 6 @@ -363,9 +376,9 @@ static int vipOnFrame(VB *sim) { -/***************************** Library Functions *****************************/ +/***************************** Display Processor *****************************/ -/* Display processor */ +/* Process sub-component */ static int vipEmulateDisplay(VB *sim, uint32_t clocks) { /* Process all clocks */ @@ -474,10 +487,24 @@ static int vipEmulateDisplay(VB *sim, uint32_t clocks) { return 0; } + + +/****************************** Pixel Processor ******************************/ + +/* Process sub-component */ +static void vipEmulateDrawing(VB *sim, uint32_t clocks) { + (void) sim; + (void) clocks; +} + + + +/***************************** Library Functions *****************************/ + /* Process component */ static int vipEmulate(VB *sim, uint32_t clocks) { int brk = vipEmulateDisplay(sim, clocks); - /*vipEmulateDrawing(sim, clocks);*/ + vipEmulateDrawing(sim, clocks); return brk; }