From ceebc59532553f7903c3a4219e663d905ad9fb34 Mon Sep 17 00:00:00 2001 From: beeanyew Date: Thu, 3 Jun 2021 22:48:52 +0200 Subject: [PATCH] Add somewhat proper RTG vsync handling --- platforms/amiga/rtg/rtg-output-raylib.c | 6 +++++- platforms/amiga/rtg/rtg.c | 15 +++++++++++---- .../amiga/rtg/rtg_driver_amiga/pigfx-2.c | 15 +++++++++++++-- .../amiga/rtg/rtg_driver_amiga/pigfx020.card | Bin 5052 -> 5132 bytes .../amiga/rtg/rtg_driver_amiga/pigfx020i.card | Bin 4208 -> 4292 bytes .../amiga/rtg/rtg_driver_amiga/pigfx030.card | Bin 5052 -> 5132 bytes platforms/amiga/rtg/rtg_enums.h | 2 ++ 7 files changed, 31 insertions(+), 7 deletions(-) diff --git a/platforms/amiga/rtg/rtg-output-raylib.c b/platforms/amiga/rtg/rtg-output-raylib.c index 5f33fda..ddca531 100644 --- a/platforms/amiga/rtg/rtg-output-raylib.c +++ b/platforms/amiga/rtg/rtg-output-raylib.c @@ -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++) { diff --git a/platforms/amiga/rtg/rtg.c b/platforms/amiga/rtg/rtg.c index 91e4e77..8ec0061 100644 --- a/platforms/amiga/rtg/rtg.c +++ b/platforms/amiga/rtg/rtg.c @@ -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; } diff --git a/platforms/amiga/rtg/rtg_driver_amiga/pigfx-2.c b/platforms/amiga/rtg/rtg_driver_amiga/pigfx-2.c index bf8b793..eb0bb57 100644 --- a/platforms/amiga/rtg/rtg_driver_amiga/pigfx-2.c +++ b/platforms/amiga/rtg/rtg_driver_amiga/pigfx-2.c @@ -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)) { diff --git a/platforms/amiga/rtg/rtg_driver_amiga/pigfx020.card b/platforms/amiga/rtg/rtg_driver_amiga/pigfx020.card index 1f7e20abd446846f740bca0370eba46710b5579c..83cda5bfa2fc64bed0e086348361089d58e48bd3 100644 GIT binary patch delta 1231 zcmYL}-)j?D6vywGnWjGyo3`3*X_qzqu~w~GNq4(HDB>oit)&gIsTHI+J5BG_(Mcvu zChfLc(jpT2AQJa3KKS5+6e&I|vH>5&2k~K9eDV*F6?_l`ABrnWp2Y9HwYvjnKIeSz z+;h(Tkv#6Zez@G$e2y`;AJ)T|{swmL=HcPbLkE&}%6Gj?WO`!~sW*u1&% z4{Zvc&f@(iW!9tA(Y1z&W%@$Vpl-zg9a5a9qlzEsgrpIpsNyIMDNfM$igR>I(W98+ zDvc_x(S%}=5{er%t$3AYCD)B>bU`|`JG3NOU!sTVgKa7*zM_(3O*`FC+@f2Ofg;_J ztS!+!rO(pulE!U%Eg6hz0mWghK{2T{Dps|Y2=$tYLZZ-hMynjrf1&Q!3bw|GtmPQ{ zaqzkH7psZF$?p))4?dA`WebV5P_H;0cn?&DYA>qrR$Yb0#YFuxIrdq@O9cNm{2_zC zgYDvJuw&O9X&h)A(0T`0=$I_ES&4>@5DkgBeK*#%Dz?8HH6Fp|wS(WnlF;g58f+5v zO6(hE{0iqT=74MlL?XJ4Nhc8F(Rbv_OmRQ8Z2Rd;N{fneW5-V+)MuJ$a-aX~!`+AJ z%rN7YlP)-x&!>3C^{`?irgWs(Ri@kp4uu&wDa?mH7MHOud)Lh~*(L7z(>yJ68m~lC zxRZ9ovG73}6_fDi#HDcm*Vp8rImZ3j)Jis;@=*^8ZUA02s@b0;m|=N@_t6rriy zafe&p|G78Rx2QQ{=W~vwZtTR~w<)#Kxa+tcq+nH?Y)*B3fE)O)^MosN#obKK!D(Tr zW>#!9_Z?r|%Q4NZg`{JB>e#pnT^)MT%4Y5Cq73InwYiU?BGS^nP&IxUA qS0-By(wFkjNZuLETqtBRHqXPaQ?bdj3vlpU7v=pu^_#na{_Z1Rvj-0V delta 1222 zcmYL}O=uKJ6vylJ^h_q{F-}G$;MY!!o4CnnB+H5h37QFsUkS65!G$4gZ*Nkp9ecWm zo|-WRNpc91gNUZVgDm37)3OH##Dj;NJb1{-yI%Dm;)?7ci2qlkIPmIM^?&v1y?R~D zts~F+?{s%v6hiER9TFn;26pl8k<5%4U>eG6e1~fm>F{U{}!9Q*l=$W(=Bo{H6|xn+sh@~`iPm=9 zUWx5R$L_#hpl~?jXJ8LdJQuzyMDipqyoI7aLE8_w#9HsbA(qigJ$KW%DVA_na`W%Z5A-Ad2fc^eu;=TQ cimM+M|L5?l^5-$ZZ#{awtG9ivwTONA0!B&^9{>OV diff --git a/platforms/amiga/rtg/rtg_driver_amiga/pigfx020i.card b/platforms/amiga/rtg/rtg_driver_amiga/pigfx020i.card index b83748466a4f014e9230e4c05c676d5e897a06c5..c87da7cac70cabc478ee6a5cd94cfe2342710c02 100644 GIT binary patch delta 1212 zcmYk6O=uHQ5Xax_Zqg*Cu_{{dqaR7EwzVImB31lsgSBEq+DNTMy4|EpUAox~o0n=q zY>^^8l%hV6;z6VbPo)Qi;;{$uP(-B19>jwPUP{qR@#MUTQWxg^X8w~mZ{B2+?Yj5% zPpbFLGsX^}#TZk6Fs95uJ$d2CR@%yN*UQ%p-0WeoHB7VE4$}~GPiKC?oZ!%p>j%hB zC*W}X1Kevv4N-$A(GLy8EHn`}p;c0=fdnxMXNV1Oj@Stoi7DtJ4#HL95L_n?LyC9@ z28bgtC^@Z-!Y~QzFe&LDg;k1Y;URGW9upT~fw&CMiL3CExCXC@ORz$mgzu7pu;M2k zQbNQgB|_X#_SZpNPnA-o`d;O2qk0RXT~jz3t?ogAvC)pt(jVVRmDWc0ZLMJ8qg35j=sWEEp=kv1jX#=@s$>AAO|U?V__I2~G; zR(5dQQO11d@wOY->2LHM^taG|gtm%4<|{toPCpu;CD6{`zRQ^ZiR?s6qZUL{&~9Ll zSv0JpJ;W`~P`in|hV}wK7Qz@Gb(>wnRnM3_bI;)goNW>KbC z0GncpuAAJv&(RIFi^87j+coHFvPz$scfF}Tcg#eEX+yXuQt#=Ou`1hF^J5$F_0!_Cv9Qq_A*KA4$uav5&$ z@7QY7^he- za>J9cSP374cJVRX++t&>Qrmwof{iVrMq{`oo9Hu&6DXiGEaH{T{mba8deSrQ-LM>L zn`vt@z1w$h-WZpeKoc%Bxa1W%IaU5v%crFc&P`8#udCu!Wp&FP%HW8TR9F+DI9p( zx^LRuwwt3nX(`%r)w1o~>(9Q~TMNhKKhHL16@9Ff&s+531Sr-`XAB*D=0&n97Mv>w G>d!w4LIPy~ delta 1080 zcmYL|Ur1A76u`f8@6}D4vkWz6==_tFn#zJ4In~ z5m|vRt1M|#=N2tF+rql(V z)@PWThGtIb7}^9+pi}sh&?UG9y_`w|_yj%R7i@;xg8eWk7=j_eFoXmn@IWvMVZk^= z1;=5Wv!o;-DI9As#aZcxFTzg3bHOyc5Hw*?a1K@k7vQbn3cMFA!Y5A0u2d&Su5 zZT89OE8`M7a`w3U+maT-ah*U} zK>HAze1}<;D1hQa@#6~&VEj9>ALagOTtbfGwq;}-iGEnceLHC5Cm(R7#;6^e*6q|| zZV|bQ&75nZcqEZjmD;pu}mlIyMya~mT+}Lg1vEh1|9pjr9vGtbUR{b zre^tqx>ZiZSLP+v49%o+e1gvHGdoXtWt{t8ETk}RO?Q179kQr%dM=)9vWc2Th_Yf$ zcWF+N}}mWgTjNafss zK{abk%RfN}y5gwBu!DL&XK1`{rI`@c=B|fzHsFrI7F%$)K#_fPU%e6LVctQMYH2=z z)6T}vszfx?)Xhn5CYNhFdmXzXW0=|zy-1CKkxhw%m5|5?>4x$D{>hDaZ3|rC|9bu# fkkoV`lhJ9Omk_o}O+GjLUb5Hc+pFfwhWz^oit)&gIsTHI+J5BG_(Mcvu zChfLc(jpT2AQJa3KKS5+6e&I|vH>5&2k~K9eDV*F6?_l`ABrnWp2Y9HwYvjnKIeSz z+;h(Tkv#6Zez@G$e2y`;AJ)T|{swmL=HcPbLkE&}%6Gj?WO`!~sW*u1&% z4{Zvc&f@(iW!9tA(Y1z&W%@$Vpl-zg9a5a9qlzEsgrpIpsNyIMDNfM$igR>I(W98+ zDvc_x(S%}=5{er%t$3AYCD)B>bU`|`JG3NOU!sTVgKa7*zM_(3O*`FC+@f2Ofg;_J ztS!+!rO(pulE!U%Eg6hz0mWghK{2T{Dps|Y2=$tYLZZ-hMynjrf1&Q!3bw|GtmPQ{ zaqzkH7psZF$?p))4?dA`WebV5P_H;0cn?&DYA>qrR$Yb0#YFuxIrdq@O9cNm{2_zC zgYDvJuw&O9X&h)A(0T`0=$I_ES&4>@5DkgBeK*#%Dz?8HH6Fp|wS(WnlF;g58f+5v zO6(hE{0iqT=74MlL?XJ4Nhc8F(Rbv_OmRQ8Z2Rd;N{fneW5-V+)MuJ$a-aX~!`+AJ z%rN7YlP)-x&!>3C^{`?irgWs(Ri@kp4uu&wDa?mH7MHOud)Lh~*(L7z(>yJ68m~lC zxRZ9ovG73}6_fDi#HDcm*Vp8rImZ3j)Jis;@=*^8ZUA02s@b0;m|=N@_t6rriy zafe&p|G78Rx2QQ{=W~vwZtTR~w<)#Kxa+tcq+nH?Y)*B3fE)O)^MosN#obKK!D(Tr zW>#!9_Z?r|%Q4NZg`{JB>e#pnT^)MT%4Y5Cq73InwYiU?BGS^nP&IxUA qS0-By(wFkjNZuLETqtBRHqXPaQ?bdj3vlpU7v=pu^_#na{_Z1Rvj-0V delta 1222 zcmYL}O=uKJ6vylJ^h_q{F-}G$;MY!!o4CnnB+H5h37QFsUkS65!G$4gZ*Nkp9ecWm zo|-WRNpc91gNUZVgDm37)3OH##Dj;NJb1{-yI%Dm;)?7ci2qlkIPmIM^?&v1y?R~D zts~F+?{s%v6hiER9TFn;26pl8k<5%4U>eG6e1~fm>F{U{}!9Q*l=$W(=Bo{H6|xn+sh@~`iPm=9 zUWx5R$L_#hpl~?jXJ8LdJQuzyMDipqyoI7aLE8_w#9HsbA(qigJ$KW%DVA_na`W%Z5A-Ad2fc^eu;=TQ cimM+M|L5?l^5-$ZZ#{awtG9ivwTONA0!B&^9{>OV diff --git a/platforms/amiga/rtg/rtg_enums.h b/platforms/amiga/rtg/rtg_enums.h index 4f0688b..d25778e 100644 --- a/platforms/amiga/rtg/rtg_enums.h +++ b/platforms/amiga/rtg/rtg_enums.h @@ -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, }; -- 2.39.2