#include <time.h>
#include "irtg_structs.h"
#include "config_file/config_file.h"
+#include "gpio/ps_protocol.h"
#include "rtg.h"
#include "m68k.h"
gdebug("iBlitRectNoMaskComplete end\n");
break;
}
+ case RTGCMD_BLITTEMPLATE: {
+ // A0: BoardInfo *b, A1: RenderInfo *r, A2 Template *t
+ // D0: WORD x, D1: WORD y, D2: WORD w, D3: WORD h
+ // D4: UBYTE mask, D7: RGBFTYPE format
+ if (!r)
+ break;
+
+ uint16_t t_pitch = 0, x_offset = 0;
+ uint32_t src_addr = M68KR(M68K_REG_A2);
+ uint32_t fgcol = 0, bgcol = 0;
+ uint8_t draw_mode = 0;
+
+ struct P96Template *t = (struct P96Template *)get_mapped_data_pointer_by_address(cfg, M68KR(M68K_REG_A2));
+ if (t) {
+ t_pitch = be16toh(t->BytesPerRow);
+ fgcol = be32toh(t->FgPen);
+ bgcol = be32toh(t->BgPen);
+ x_offset = be16toh(t->XOffset);
+ draw_mode = t->DrawMode;
+ src_addr = be32toh(t->_p_Memory);
+ } else {
+ t_pitch = be16toh(ps_read_16(src_addr + (uint32_t)&t->BytesPerRow));
+ fgcol = be32toh(ps_read_32(src_addr + (uint32_t)&t->FgPen));
+ bgcol = be32toh(ps_read_32(src_addr + (uint32_t)&t->BgPen));
+ x_offset = be16toh(ps_read_16(src_addr + (uint32_t)&t->XOffset));
+ draw_mode = ps_read_8(src_addr + (uint32_t)&t->DrawMode);
+ src_addr = be32toh(ps_read_32(src_addr + (uint32_t)&t->_p_Memory));
+ }
+
+ cmd_mask = (uint8_t)M68KR(M68K_REG_D4);
+ rtg_address[1] = be32toh(r->_p_Memory);
+ rtg_address_adj[1] = rtg_address[1] - (PIGFX_RTG_BASE + PIGFX_REG_SIZE);
+
+ rtg_blittemplate(M68KR(M68K_REG_D0), M68KR(M68K_REG_D1), M68KR(M68K_REG_D2), M68KR(M68K_REG_D3), src_addr, fgcol, bgcol, CMD_PITCH, t_pitch, RGBF_D7, x_offset, cmd_mask, draw_mode);
+ break;
+ }
default:
printf("[!!!IRTG] Unnkonw/unhandled iRTG command %d.\n", cmd);
break;