]> git.sesse.net Git - pistorm/commitdiff
Add somewhat proper RTG vsync handling
authorbeeanyew <beeanyew@gmail.com>
Thu, 3 Jun 2021 20:48:52 +0000 (22:48 +0200)
committerbeeanyew <beeanyew@gmail.com>
Thu, 3 Jun 2021 20:48:52 +0000 (22:48 +0200)
platforms/amiga/rtg/rtg-output-raylib.c
platforms/amiga/rtg/rtg.c
platforms/amiga/rtg/rtg_driver_amiga/pigfx-2.c
platforms/amiga/rtg/rtg_driver_amiga/pigfx020.card
platforms/amiga/rtg/rtg_driver_amiga/pigfx020i.card
platforms/amiga/rtg/rtg_driver_amiga/pigfx030.card
platforms/amiga/rtg/rtg_enums.h

index 5f33fdac803cc20b3bb2f141028cd893a8a4a583..ddca531317c3ff72755ac0b52ca46e83151857c5 100644 (file)
@@ -23,7 +23,7 @@
 #define DEBUG(...)
 #endif
 
-uint8_t busy = 0, rtg_on = 0, rtg_initialized = 0, emulator_exiting = 0;
+uint8_t busy = 0, rtg_on = 0, rtg_initialized = 0, emulator_exiting = 0, rtg_output_in_vblank = 0;
 extern uint8_t *rtg_mem;
 extern uint32_t framebuffer_addr;
 extern uint32_t framebuffer_addr_adj;
@@ -164,6 +164,8 @@ reinit_raylib:;
 
     raylib_texture = LoadTextureFromImage(raylib_fb);
 
+    printf("Loaded framebuffer texture.\n");
+
     srcrect.x = srcrect.y = 0;
     srcrect.width = width;
     srcrect.height = height;
@@ -222,6 +224,7 @@ reinit_raylib:;
     while (1) {
         if (rtg_on) {
             BeginDrawing();
+            rtg_output_in_vblank = 0;
             updating_screen = 1;
 
             switch (format) {
@@ -265,6 +268,7 @@ reinit_raylib:;
             }
 
             EndDrawing();
+            rtg_output_in_vblank = 1;
             if (format == RTGFMT_RBG565) {
                 for (int y = 0; y < height; y++) {
                     for (int x = 0; x < width; x++) {
index 91e4e772695fbaa88ef9dfd552ae30ee218a0f74..8ec006156280b47e93dd2ab28730686afb4ad6e7 100644 (file)
@@ -41,7 +41,7 @@ static void handle_irtg_command(uint32_t cmd);
 uint8_t realtime_graphics_debug = 0;
 extern int cpu_emulation_running;
 extern struct emulator_config *cfg;
-extern uint8_t rtg_on;
+extern uint8_t rtg_on, rtg_output_in_vblank;
 
 //#define DEBUG_RTG
 
@@ -94,9 +94,6 @@ unsigned int rtg_get_fb() {
 
 unsigned int rtg_read(uint32_t address, uint8_t mode) {
     //printf("%s read from RTG: %.8X\n", op_type_names[mode], address);
-    if (address == RTG_COMMAND) {
-        return 0xFFCF;
-    }
     if (address >= PIGFX_REG_SIZE) {
         if (rtg_mem && (address - PIGFX_REG_SIZE) < PIGFX_UPPER) {
             switch (mode) {
@@ -114,6 +111,16 @@ unsigned int rtg_read(uint32_t address, uint8_t mode) {
             }
         }
     }
+    switch (address) {
+        case RTG_COMMAND:
+            return 0xFFCF;
+        case RTG_WAITVSYNC:
+            // fallthrough
+        case RTG_INVBLANK:
+            return !rtg_on || rtg_output_in_vblank;
+        default:
+            break;
+    }
 
     return 0;
 }
index bf8b79330a10d43abdc051a69f4438d65a17496d..eb0bb57051d84e525ab51778da2f75ef0f477de8 100644 (file)
@@ -80,6 +80,7 @@ void SetClearMask (__REGA0(struct BoardInfo *b), __REGD0(UBYTE mask));
 void SetReadPlane (__REGA0(struct BoardInfo *b), __REGD0(UBYTE plane));
 
 void WaitVerticalSync (__REGA0(struct BoardInfo *b), __REGD0(BOOL toggle));
+BOOL GetVSyncState(__REGA0(struct BoardInfo *b), __REGD0(BOOL toggle));
 
 void FillRect (__REGA0(struct BoardInfo *b), __REGA1(struct RenderInfo *r), __REGD0(WORD x), __REGD1(WORD y), __REGD2(WORD w), __REGD3(WORD h), __REGD4(ULONG color), __REGD5(UBYTE mask), __REGD7(RGBFTYPE format));
 void InvertRect (__REGA0(struct BoardInfo *b), __REGA1(struct RenderInfo *r), __REGD0(WORD x), __REGD1(WORD y), __REGD2(WORD w), __REGD3(WORD h), __REGD4(UBYTE mask), __REGD7(RGBFTYPE format));
@@ -305,7 +306,7 @@ int __attribute__((used)) InitCard(__REGA0(struct BoardInfo* b)) {
     //b->SetSplitPosition = (void *)NULL;
     //b->ReInitMemory = (void *)NULL;
     //b->WriteYUVRect = (void *)NULL;
-    //b->GetVSyncState = (void *)NULL;
+    b->GetVSyncState = (void *)GetVSyncState;
     //b->GetVBeamPos = (void *)NULL;
     //b->SetDPMSLevel = (void *)NULL;
     //b->ResetChip = (void *)NULL;
@@ -461,8 +462,18 @@ void SetClearMask (__REGA0(struct BoardInfo *b), __REGD0(UBYTE mask)) {
 void SetReadPlane (__REGA0(struct BoardInfo *b), __REGD0(UBYTE plane)) {
 }
 
+static uint16_t vblank;
+
 void WaitVerticalSync (__REGA0(struct BoardInfo *b), __REGD0(BOOL toggle)) {
-    // I don't know why this one has a bool in D0, but it isn't used for anything.
+    vblank = 0;
+    do {
+        READSHORT(RTG_WAITVSYNC, vblank);
+    } while (!vblank);
+}
+
+BOOL GetVSyncState(__REGA0(struct BoardInfo *b), __REGD0(BOOL toggle)) {
+    READSHORT(RTG_INVBLANK, vblank);
+    return vblank;
 }
 
 void FillRect (__REGA0(struct BoardInfo *b), __REGA1(struct RenderInfo *r), __REGD0(WORD x), __REGD1(WORD y), __REGD2(WORD w), __REGD3(WORD h), __REGD4(ULONG color), __REGD5(UBYTE mask), __REGD7(RGBFTYPE format)) {
index 1f7e20abd446846f740bca0370eba46710b5579c..83cda5bfa2fc64bed0e086348361089d58e48bd3 100644 (file)
Binary files a/platforms/amiga/rtg/rtg_driver_amiga/pigfx020.card and b/platforms/amiga/rtg/rtg_driver_amiga/pigfx020.card differ
index b83748466a4f014e9230e4c05c676d5e897a06c5..c87da7cac70cabc478ee6a5cd94cfe2342710c02 100644 (file)
Binary files a/platforms/amiga/rtg/rtg_driver_amiga/pigfx020i.card and b/platforms/amiga/rtg/rtg_driver_amiga/pigfx020i.card differ
index 1f7e20abd446846f740bca0370eba46710b5579c..83cda5bfa2fc64bed0e086348361089d58e48bd3 100644 (file)
Binary files a/platforms/amiga/rtg/rtg_driver_amiga/pigfx030.card and b/platforms/amiga/rtg/rtg_driver_amiga/pigfx030.card differ
index 4f0688bc1d76140c4ee0faeef2af6b728097871d..d25778ee01a3790d54fea8b0f1ab145bca576dca 100644 (file)
@@ -27,6 +27,8 @@ enum pi_regs {
   RTG_ADDR3     = 0x30,
   RTG_ADDR4     = 0x34,
   RTG_DEBUGME   = 0x50,
+  RTG_WAITVSYNC = 0x60,
+  RTG_INVBLANK  = 0x62,
   IRTG_COMMAND  = 0x60,
 };