From 17622680f3c7a3253eff86f5e1a625bb6603a96e Mon Sep 17 00:00:00 2001 From: Toni Wilen Date: Sun, 16 Aug 2015 20:11:55 +0300 Subject: [PATCH] DCTV emulation. --- od-win32/win32gui.cpp | 20 +-- specialmonitors.cpp | 335 ++++++++++++++++++++++++++++++++++-------- 2 files changed, 285 insertions(+), 70 deletions(-) diff --git a/od-win32/win32gui.cpp b/od-win32/win32gui.cpp index 10c4ded1..11d95ea2 100644 --- a/od-win32/win32gui.cpp +++ b/od-win32/win32gui.cpp @@ -7382,19 +7382,19 @@ static INT_PTR CALLBACK ChipsetDlgProc (HWND hDlg, UINT msg, WPARAM wParam, LPAR SendDlgItemMessage(hDlg, IDC_GENLOCKMIX, CB_ADDSTRING, 0, (LPARAM)buffer); } - SendDlgItemMessage (hDlg, IDC_MONITOREMU, CB_RESETCONTENT, 0, 0); - SendDlgItemMessage (hDlg, IDC_MONITOREMU, CB_ADDSTRING, 0, (LPARAM)_T("-")); + SendDlgItemMessage(hDlg, IDC_MONITOREMU, CB_RESETCONTENT, 0, 0); + SendDlgItemMessage(hDlg, IDC_MONITOREMU, CB_ADDSTRING, 0, (LPARAM)_T("-")); WIN32GUI_LoadUIString(IDS_AUTODETECT, buffer, sizeof buffer / sizeof (TCHAR)); - SendDlgItemMessage (hDlg, IDC_MONITOREMU, CB_ADDSTRING, 0, (LPARAM)buffer); - SendDlgItemMessage (hDlg, IDC_MONITOREMU, CB_ADDSTRING, 0, (LPARAM)_T("Commodore A2024")); - SendDlgItemMessage (hDlg, IDC_MONITOREMU, CB_ADDSTRING, 0, (LPARAM)_T("Individual Computers Graffiti")); - SendDlgItemMessage (hDlg, IDC_MONITOREMU, CB_ADDSTRING, 0, (LPARAM)_T("Black Belt Systems HAM-E")); - SendDlgItemMessage (hDlg, IDC_MONITOREMU, CB_ADDSTRING, 0, (LPARAM)_T("Black Belt Systems HAM-E Plus")); - SendDlgItemMessage (hDlg, IDC_MONITOREMU, CB_ADDSTRING, 0, (LPARAM)_T("Newtronic Video DAC 18")); - SendDlgItemMessage (hDlg, IDC_MONITOREMU, CB_ADDSTRING, 0, (LPARAM)_T("Archos AVideo 12")); + SendDlgItemMessage(hDlg, IDC_MONITOREMU, CB_ADDSTRING, 0, (LPARAM)buffer); + SendDlgItemMessage(hDlg, IDC_MONITOREMU, CB_ADDSTRING, 0, (LPARAM)_T("Commodore A2024")); + SendDlgItemMessage(hDlg, IDC_MONITOREMU, CB_ADDSTRING, 0, (LPARAM)_T("Individual Computers Graffiti")); + SendDlgItemMessage(hDlg, IDC_MONITOREMU, CB_ADDSTRING, 0, (LPARAM)_T("Black Belt Systems HAM-E")); + SendDlgItemMessage(hDlg, IDC_MONITOREMU, CB_ADDSTRING, 0, (LPARAM)_T("Black Belt Systems HAM-E Plus")); + SendDlgItemMessage(hDlg, IDC_MONITOREMU, CB_ADDSTRING, 0, (LPARAM)_T("Newtronic Video DAC 18")); + SendDlgItemMessage(hDlg, IDC_MONITOREMU, CB_ADDSTRING, 0, (LPARAM)_T("Archos AVideo 12")); SendDlgItemMessage(hDlg, IDC_MONITOREMU, CB_ADDSTRING, 0, (LPARAM)_T("Archos AVideo 24")); SendDlgItemMessage(hDlg, IDC_MONITOREMU, CB_ADDSTRING, 0, (LPARAM)_T("Impulse FireCracker 24")); - //SendDlgItemMessage (hDlg, IDC_MONITOREMU, CB_ADDSTRING, 0, (LPARAM)_T("DCTV")); + SendDlgItemMessage(hDlg, IDC_MONITOREMU, CB_ADDSTRING, 0, (LPARAM)_T("Digital Creations DCTV")); #ifndef AGA ew (hDlg, IDC_AGA, FALSE); diff --git a/specialmonitors.cpp b/specialmonitors.cpp index 9abc785a..7f1a91de 100755 --- a/specialmonitors.cpp +++ b/specialmonitors.cpp @@ -210,8 +210,10 @@ static void blank_generic(struct vidbuffer *src, struct vidbuffer *dst, int oddl } } -static uae_s8 dctv_chroma[1600]; -static uae_u8 dctv_luma[1600]; +static const uae_u8 dctv_signature[] = { + 0x93,0x0e,0x51,0xbc,0x22,0x17,0xdf,0xa4,0x19,0x1d,0x16,0x6a,0xb6,0xeb,0xd9,0x70, + 0x52,0xd6,0x07,0xf2,0x57,0x68,0x69,0xdc,0xce,0x3c,0xf8,0x9e,0xa6,0xc6,0x2a +}; static const uae_u16 dctv_tables[] = { 0xF9AF, 0xF9C9, 0xF9E2, 0xF9FC, 0xFA15, 0xFA2F, 0xFA48, 0xFA62, @@ -245,9 +247,150 @@ static const uae_u16 dctv_tables[] = { 0x0FFF, 0x1019, 0x1032, 0x104C, 0x1065, 0x107F, 0x1098, 0x10B2, 0x10CB, 0x10E5, 0x10FE, 0x1118, 0x1131, 0x114B, 0x1164, 0x117E, 0x1197, 0x11B1, 0x11CA, 0x11E4, 0x11FD, 0x1217, 0x1230, 0x124A, - 0x1263, 0x127D, 0x1296, 0x12B0, 0x12C9, 0x12E3, 0x12FC, 0x1316 + 0x1263, 0x127D, 0x1296, 0x12B0, 0x12C9, 0x12E3, 0x12FC, 0x1316, + + 0xF174, 0xF191, 0xF1AE, 0xF1CB, 0xF1E8, 0xF205, 0xF222, 0xF23F, + 0xF25C, 0xF279, 0xF296, 0xF2B4, 0xF2D1, 0xF2EE, 0xF30B, 0xF328, + 0xF345, 0xF362, 0xF37F, 0xF39C, 0xF3B9, 0xF3D6, 0xF3F4, 0xF411, + 0xF42E, 0xF44B, 0xF468, 0xF485, 0xF4A2, 0xF4BF, 0xF4DC, 0xF4F9, + 0xF517, 0xF534, 0xF551, 0xF56E, 0xF58B, 0xF5A8, 0xF5C5, 0xF5E2, + 0xF5FF, 0xF61C, 0xF639, 0xF657, 0xF674, 0xF691, 0xF6AE, 0xF6CB, + 0xF6E8, 0xF705, 0xF722, 0xF73F, 0xF75C, 0xF779, 0xF797, 0xF7B4, + 0xF7D1, 0xF7EE, 0xF80B, 0xF828, 0xF845, 0xF862, 0xF87F, 0xF89C, + 0xF8BA, 0xF8D7, 0xF8F4, 0xF911, 0xF92E, 0xF94B, 0xF968, 0xF985, + 0xF9A2, 0xF9BF, 0xF9DC, 0xF9FA, 0xFA17, 0xFA34, 0xFA51, 0xFA6E, + 0xFA8B, 0xFAA8, 0xFAC5, 0xFAE2, 0xFAFF, 0xFB1C, 0xFB3A, 0xFB57, + 0xFB74, 0xFB91, 0xFBAE, 0xFBCB, 0xFBE8, 0xFC05, 0xFC22, 0xFC3F, + 0xFC5D, 0xFC7A, 0xFC97, 0xFCB4, 0xFCD1, 0xFCEE, 0xFD0B, 0xFD28, + 0xFD45, 0xFD62, 0xFD7F, 0xFD9D, 0xFDBA, 0xFDD7, 0xFDF4, 0xFE11, + 0xFE2E, 0xFE4B, 0xFE68, 0xFE85, 0xFEA2, 0xFEBF, 0xFEDD, 0xFEFA, + 0xFF17, 0xFF34, 0xFF51, 0xFF6E, 0xFF8B, 0xFFA8, 0xFFC5, 0xFFE2, + //0x180 + 0x0000, 0x001D, 0x003A, 0x0057, 0x0074, 0x0091, 0x00AE, 0x00CB, + 0x00E8, 0x0105, 0x0122, 0x0140, 0x015D, 0x017A, 0x0197, 0x01B4, + 0x01D1, 0x01EE, 0x020B, 0x0228, 0x0245, 0x0262, 0x0280, 0x029D, + 0x02BA, 0x02D7, 0x02F4, 0x0311, 0x032E, 0x034B, 0x0368, 0x0385, + 0x03A3, 0x03C0, 0x03DD, 0x03FA, 0x0417, 0x0434, 0x0451, 0x046E, + 0x048B, 0x04A8, 0x04C5, 0x04E3, 0x0500, 0x051D, 0x053A, 0x0557, + 0x0574, 0x0591, 0x05AE, 0x05CB, 0x05E8, 0x0605, 0x0623, 0x0640, + 0x065D, 0x067A, 0x0697, 0x06B4, 0x06D1, 0x06EE, 0x070B, 0x0728, + 0x0746, 0x0763, 0x0780, 0x079D, 0x07BA, 0x07D7, 0x07F4, 0x0811, + 0x082E, 0x084B, 0x0868, 0x0886, 0x08A3, 0x08C0, 0x08DD, 0x08FA, + 0x0917, 0x0934, 0x0951, 0x096E, 0x098B, 0x09A8, 0x09C6, 0x09E3, + 0x0A00, 0x0A1D, 0x0A3A, 0x0A57, 0x0A74, 0x0A91, 0x0AAE, 0x0ACB, + 0x0AE9, 0x0B06, 0x0B23, 0x0B40, 0x0B5D, 0x0B7A, 0x0B97, 0x0BB4, + 0x0BD1, 0x0BEE, 0x0C0B, 0x0C29, 0x0C46, 0x0C63, 0x0C80, 0x0C9D, + 0x0CBA, 0x0CD7, 0x0CF4, 0x0D11, 0x0D2E, 0x0D4B, 0x0D69, 0x0D86, + 0x0DA3, 0x0DC0, 0x0DDD, 0x0DFA, 0x0E17, 0x0E34, 0x0E51, 0x0E6E, + + 0xE61B, 0xE64E, 0xE682, 0xE6B6, 0xE6EA, 0xE71E, 0xE751, 0xE785, + 0xE7B9, 0xE7ED, 0xE821, 0xE854, 0xE888, 0xE8BC, 0xE8F0, 0xE924, + 0xE957, 0xE98B, 0xE9BF, 0xE9F3, 0xEA26, 0xEA5A, 0xEA8E, 0xEAC2, + 0xEAF6, 0xEB29, 0xEB5D, 0xEB91, 0xEBC5, 0xEBF9, 0xEC2C, 0xEC60, + 0xEC94, 0xECC8, 0xECFB, 0xED2F, 0xED63, 0xED97, 0xEDCB, 0xEDFE, + 0xEE32, 0xEE66, 0xEE9A, 0xEECE, 0xEF01, 0xEF35, 0xEF69, 0xEF9D, + 0xEFD1, 0xF004, 0xF038, 0xF06C, 0xF0A0, 0xF0D3, 0xF107, 0xF13B, + 0xF16F, 0xF1A3, 0xF1D6, 0xF20A, 0xF23E, 0xF272, 0xF2A6, 0xF2D9, + 0xF30D, 0xF341, 0xF375, 0xF3A8, 0xF3DC, 0xF410, 0xF444, 0xF478, + 0xF4AB, 0xF4DF, 0xF513, 0xF547, 0xF57B, 0xF5AE, 0xF5E2, 0xF616, + 0xF64A, 0xF67D, 0xF6B1, 0xF6E5, 0xF719, 0xF74D, 0xF780, 0xF7B4, + 0xF7E8, 0xF81C, 0xF850, 0xF883, 0xF8B7, 0xF8EB, 0xF91F, 0xF953, + 0xF986, 0xF9BA, 0xF9EE, 0xFA22, 0xFA55, 0xFA89, 0xFABD, 0xFAF1, + 0xFB25, 0xFB58, 0xFB8C, 0xFBC0, 0xFBF4, 0xFC28, 0xFC5B, 0xFC8F, + 0xFCC3, 0xFCF7, 0xFD2A, 0xFD5E, 0xFD92, 0xFDC6, 0xFDFA, 0xFE2D, + 0xFE61, 0xFE95, 0xFEC9, 0xFEFD, 0xFF30, 0xFF64, 0xFF98, 0xFFCC, + //0x280 + 0x0000, 0x0033, 0x0067, 0x009B, 0x00CF, 0x0102, 0x0136, 0x016A, + 0x019E, 0x01D2, 0x0205, 0x0239, 0x026D, 0x02A1, 0x02D5, 0x0308, + 0x033C, 0x0370, 0x03A4, 0x03D7, 0x040B, 0x043F, 0x0473, 0x04A7, + 0x04DA, 0x050E, 0x0542, 0x0576, 0x05AA, 0x05DD, 0x0611, 0x0645, + 0x0679, 0x06AC, 0x06E0, 0x0714, 0x0748, 0x077C, 0x07AF, 0x07E3, + 0x0817, 0x084B, 0x087F, 0x08B2, 0x08E6, 0x091A, 0x094E, 0x0982, + 0x09B5, 0x09E9, 0x0A1D, 0x0A51, 0x0A84, 0x0AB8, 0x0AEC, 0x0B20, + 0x0B54, 0x0B87, 0x0BBB, 0x0BEF, 0x0C23, 0x0C57, 0x0C8A, 0x0CBE, + 0x0CF2, 0x0D26, 0x0D59, 0x0D8D, 0x0DC1, 0x0DF5, 0x0E29, 0x0E5C, + 0x0E90, 0x0EC4, 0x0EF8, 0x0F2C, 0x0F5F, 0x0F93, 0x0FC7, 0x0FFB, + 0x102F, 0x1062, 0x1096, 0x10CA, 0x10FE, 0x1131, 0x1165, 0x1199, + 0x11CD, 0x1201, 0x1234, 0x1268, 0x129C, 0x12D0, 0x1304, 0x1337, + 0x136B, 0x139F, 0x13D3, 0x1406, 0x143A, 0x146E, 0x14A2, 0x14D6, + 0x1509, 0x153D, 0x1571, 0x15A5, 0x15D9, 0x160C, 0x1640, 0x1674, + 0x16A8, 0x16DB, 0x170F, 0x1743, 0x1777, 0x17AB, 0x17DE, 0x1812, + 0x1846, 0x187A, 0x18AE, 0x18E1, 0x1915, 0x1949, 0x197D, 0x19B1, + + 0x0769, 0x075A, 0x074B, 0x073D, 0x072E, 0x071F, 0x0710, 0x0701, + 0x06F3, 0x06E4, 0x06D5, 0x06C6, 0x06B7, 0x06A8, 0x069A, 0x068B, + 0x067C, 0x066D, 0x065E, 0x064F, 0x0641, 0x0632, 0x0623, 0x0614, + 0x0605, 0x05F6, 0x05E8, 0x05D9, 0x05CA, 0x05BB, 0x05AC, 0x059E, + 0x058F, 0x0580, 0x0571, 0x0562, 0x0553, 0x0545, 0x0536, 0x0527, + 0x0518, 0x0509, 0x04FA, 0x04EC, 0x04DD, 0x04CE, 0x04BF, 0x04B0, + 0x04A2, 0x0493, 0x0484, 0x0475, 0x0466, 0x0457, 0x0449, 0x043A, + 0x042B, 0x041C, 0x040D, 0x03FE, 0x03F0, 0x03E1, 0x03D2, 0x03C3, + 0x03B4, 0x03A5, 0x0397, 0x0388, 0x0379, 0x036A, 0x035B, 0x034D, + 0x033E, 0x032F, 0x0320, 0x0311, 0x0302, 0x02F4, 0x02E5, 0x02D6, + 0x02C7, 0x02B8, 0x02A9, 0x029B, 0x028C, 0x027D, 0x026E, 0x025F, + 0x0251, 0x0242, 0x0233, 0x0224, 0x0215, 0x0206, 0x01F8, 0x01E9, + 0x01DA, 0x01CB, 0x01BC, 0x01AD, 0x019F, 0x0190, 0x0181, 0x0172, + 0x0163, 0x0154, 0x0146, 0x0137, 0x0128, 0x0119, 0x010A, 0x00FC, + 0x00ED, 0x00DE, 0x00CF, 0x00C0, 0x00B1, 0x00A3, 0x0094, 0x0085, + 0x0076, 0x0067, 0x0058, 0x004A, 0x003B, 0x002C, 0x001D, 0x000E, + //0x380 + 0x0000, 0xFFF1, 0xFFE2, 0xFFD3, 0xFFC4, 0xFFB5, 0xFFA7, 0xFF98, + 0xFF89, 0xFF7A, 0xFF6B, 0xFF5C, 0xFF4E, 0xFF3F, 0xFF30, 0xFF21, + 0xFF12, 0xFF03, 0xFEF5, 0xFEE6, 0xFED7, 0xFEC8, 0xFEB9, 0xFEAB, + 0xFE9C, 0xFE8D, 0xFE7E, 0xFE6F, 0xFE60, 0xFE52, 0xFE43, 0xFE34, + 0xFE25, 0xFE16, 0xFE07, 0xFDF9, 0xFDEA, 0xFDDB, 0xFDCC, 0xFDBD, + 0xFDAF, 0xFDA0, 0xFD91, 0xFD82, 0xFD73, 0xFD64, 0xFD56, 0xFD47, + 0xFD38, 0xFD29, 0xFD1A, 0xFD0B, 0xFCFD, 0xFCEE, 0xFCDF, 0xFCD0, + 0xFCC1, 0xFCB2, 0xFCA4, 0xFC95, 0xFC86, 0xFC77, 0xFC68, 0xFC5A, + 0xFC4B, 0xFC3C, 0xFC2D, 0xFC1E, 0xFC0F, 0xFC01, 0xFBF2, 0xFBE3, + 0xFBD4, 0xFBC5, 0xFBB6, 0xFBA8, 0xFB99, 0xFB8A, 0xFB7B, 0xFB6C, + 0xFB5E, 0xFB4F, 0xFB40, 0xFB31, 0xFB22, 0xFB13, 0xFB05, 0xFAF6, + 0xFAE7, 0xFAD8, 0xFAC9, 0xFABA, 0xFAAC, 0xFA9D, 0xFA8E, 0xFA7F, + 0xFA70, 0xFA61, 0xFA53, 0xFA44, 0xFA35, 0xFA26, 0xFA17, 0xFA09, + 0xF9FA, 0xF9EB, 0xF9DC, 0xF9CD, 0xF9BE, 0xF9B0, 0xF9A1, 0xF992, + 0xF983, 0xF974, 0xF965, 0xF957, 0xF948, 0xF939, 0xF92A, 0xF91B, + 0xF90D, 0xF8FE, 0xF8EF, 0xF8E0, 0xF8D1, 0xF8C2, 0xF8B4, 0xF8A5, + + 0x050C, 0x0502, 0x04F8, 0x04EE, 0x04E4, 0x04DA, 0x04D0, 0x04C6, + 0x04BC, 0x04B1, 0x04A7, 0x049D, 0x0493, 0x0489, 0x047F, 0x0475, + 0x046B, 0x0461, 0x0457, 0x044C, 0x0442, 0x0438, 0x042E, 0x0424, + 0x041A, 0x0410, 0x0406, 0x03FC, 0x03F2, 0x03E7, 0x03DD, 0x03D3, + 0x03C9, 0x03BF, 0x03B5, 0x03AB, 0x03A1, 0x0397, 0x038D, 0x0382, + 0x0378, 0x036E, 0x0364, 0x035A, 0x0350, 0x0346, 0x033C, 0x0332, + 0x0328, 0x031D, 0x0313, 0x0309, 0x02FF, 0x02F5, 0x02EB, 0x02E1, + 0x02D7, 0x02CD, 0x02C3, 0x02B8, 0x02AE, 0x02A4, 0x029A, 0x0290, + 0x0286, 0x027C, 0x0272, 0x0268, 0x025E, 0x0253, 0x0249, 0x023F, + 0x0235, 0x022B, 0x0221, 0x0217, 0x020D, 0x0203, 0x01F9, 0x01EE, + 0x01E4, 0x01DA, 0x01D0, 0x01C6, 0x01BC, 0x01B2, 0x01A8, 0x019E, + 0x0194, 0x0189, 0x017F, 0x0175, 0x016B, 0x0161, 0x0157, 0x014D, + 0x0143, 0x0139, 0x012F, 0x0124, 0x011A, 0x0110, 0x0106, 0x00FC, + 0x00F2, 0x00E8, 0x00DE, 0x00D4, 0x00CA, 0x00BF, 0x00B5, 0x00AB, + 0x00A1, 0x0097, 0x008D, 0x0083, 0x0079, 0x006F, 0x0065, 0x005A, + 0x0050, 0x0046, 0x003C, 0x0032, 0x0028, 0x001E, 0x0014, 0x000A, + //0x480 + 0x0000, 0xFFF5, 0xFFEB, 0xFFE1, 0xFFD7, 0xFFCD, 0xFFC3, 0xFFB9, + 0xFFAF, 0xFFA5, 0xFF9B, 0xFF90, 0xFF86, 0xFF7C, 0xFF72, 0xFF68, + 0xFF5E, 0xFF54, 0xFF4A, 0xFF40, 0xFF36, 0xFF2B, 0xFF21, 0xFF17, + 0xFF0D, 0xFF03, 0xFEF9, 0xFEEF, 0xFEE5, 0xFEDB, 0xFED1, 0xFEC6, + 0xFEBC, 0xFEB2, 0xFEA8, 0xFE9E, 0xFE94, 0xFE8A, 0xFE80, 0xFE76, + 0xFE6C, 0xFE61, 0xFE57, 0xFE4D, 0xFE43, 0xFE39, 0xFE2F, 0xFE25, + 0xFE1B, 0xFE11, 0xFE07, 0xFDFC, 0xFDF2, 0xFDE8, 0xFDDE, 0xFDD4, + 0xFDCA, 0xFDC0, 0xFDB6, 0xFDAC, 0xFDA2, 0xFD97, 0xFD8D, 0xFD83, + 0xFD79, 0xFD6F, 0xFD65, 0xFD5B, 0xFD51, 0xFD47, 0xFD3D, 0xFD32, + 0xFD28, 0xFD1E, 0xFD14, 0xFD0A, 0xFD00, 0xFCF6, 0xFCEC, 0xFCE2, + 0xFCD8, 0xFCCD, 0xFCC3, 0xFCB9, 0xFCAF, 0xFCA5, 0xFC9B, 0xFC91, + 0xFC87, 0xFC7D, 0xFC73, 0xFC68, 0xFC5E, 0xFC54, 0xFC4A, 0xFC40, + 0xFC36, 0xFC2C, 0xFC22, 0xFC18, 0xFC0E, 0xFC03, 0xFBF9, 0xFBEF, + 0xFBE5, 0xFBDB, 0xFBD1, 0xFBC7, 0xFBBD, 0xFBB3, 0xFBA9, 0xFB9E, + 0xFB94, 0xFB8A, 0xFB80, 0xFB76, 0xFB6C, 0xFB62, 0xFB58, 0xFB4E, + 0xFB44, 0xFB39, 0xFB2F, 0xFB25, 0xFB1B, 0xFB11, 0xFB07, 0xFAFD }; +#define DCTV_BUFFER_SIZE 1000 +static uae_s8 dctv_chroma[2 * DCTV_BUFFER_SIZE]; +static uae_u8 dctv_luma[2 * DCTV_BUFFER_SIZE]; + + STATIC_INLINE int minmax(int v, int min, int max) { if (v < min) @@ -257,6 +400,11 @@ STATIC_INLINE int minmax(int v, int min, int max) return v; } +#define DCTV_SIGNATURE_DEBUG 0 +#if DCTV_SIGNATURE_DEBUG +static int signature_test_y = 0x93; +#endif + static bool dctv(struct vidbuffer *src, struct vidbuffer *dst, bool doublelines, int oddlines) { int y, x, vdbl, hdbl; @@ -275,14 +423,12 @@ static bool dctv(struct vidbuffer *src, struct vidbuffer *dst, bool doublelines, ystart = isntsc ? VBLANK_ENDLINE_NTSC : VBLANK_ENDLINE_PAL; yend = isntsc ? MAXVPOS_NTSC : MAXVPOS_PAL; - oddlines = 1; - - memset(dctv_luma, 0x40, sizeof dctv_luma); - int signature_detected = -1; - int signature_x = -1; - int linenr = 0; - uae_u8 r, g, b; + int signature_cnt = 0; + bool dctv_enabled = false; + int ycnt = 0; + memset(dctv_luma, 64, sizeof DCTV_BUFFER_SIZE); + for (y = ystart; y < yend; y++) { int yoff = (((y * 2 + oddlines) - src->yoffset) / vdbl); if (yoff < 0) @@ -292,84 +438,144 @@ static bool dctv(struct vidbuffer *src, struct vidbuffer *dst, bool doublelines, uae_u8 *line = src->bufmem + yoff * src->rowbytes; uae_u8 *dstline = dst->bufmem + (((y * 2 + oddlines) - dst->yoffset) / vdbl) * dst->rowbytes; -#if 0 - if (y < 60) { - write_log(_T("%d:\n"), y); - for (x = 22; x < 300; x += 1) { - uae_u8 *s = line + ((x << 1) / hdbl) * src->pixbytes; - write_log(_T("%01x"), FIRGB(src, s)); - } - write_log(_T("*\n")); - for (x = 21; x < 300; x += 1) { - uae_u8 *s = line + ((x << 1) / hdbl) * src->pixbytes; - write_log(_T("%01x"), FIRGB(src, s)); - } - write_log(_T("\n")); - } -#endif - - int signature_cnt = -1; - bool signature_line = false; int firstnz = -1; bool sign = false; int oddeven = 0; uae_u8 prev = 0; uae_u8 vals[3] = { 0x40, 0x40, 0x40 }; - int chrsum = 0; - uae_s8 *chrbuf = dctv_chroma + 10; - uae_u8 *lumabuf = dctv_luma + 10; int zigzagoffset = 0; int prevtval = 0; + uae_s8 *chrbuf_w = NULL, *chrbuf_r1 = NULL, *chrbuf_r2 = NULL; + uae_u8 *lumabuf1 = dctv_luma, *lumabuf2 = dctv_luma; + + ycnt++; + +#if DCTV_SIGNATURE_DEBUG + uae_u8 signx = 0; + uae_u8 signmask = 0xff; + if (y == signature_test_y + 1) + write_log(_T("\n")); +#endif + for (x = 0; x < src->inwidth; x++) { uae_u8 *s = line + ((x << 1) / hdbl) * src->pixbytes; uae_u8 *d = dstline + ((x << 1) / hdbl) * dst->pixbytes + zigzagoffset; uae_u8 *s2 = s + src->rowbytes; uae_u8 *d2 = d + dst->rowbytes; uae_u8 newval = DCTV_FIRBG(src, s); - uae_u8 val = prev | newval; + int mask = 1 << (7 - (signature_cnt & 7)); + int bitval = (newval & 0x40) ? mask : 0; + if ((dctv_signature[signature_cnt / 8] & mask) == bitval) { + signature_cnt++; + if (signature_cnt == sizeof (dctv_signature) * 8) { + dctv_enabled = true; + signature_detected = y; + } + } else { + signature_cnt = 0; + } + +#if DCTV_SIGNATURE_DEBUG + if (y == signature_test_y) { + if ((newval & 0x40) && signmask == 0xff) + signmask = 0x80; + if (signmask != 0xff) { + if (newval & 0x40) + signx |= signmask; + signmask >>= 1; + if (!signmask) { + signmask = 0x80; + write_log(_T("%02x."), signx); + signx = 0; + } + } + } +#endif + if (!dctv_enabled || signature_detected == y) { + PUT_AMIGARGB(d, s, d2, s2, dst, 0, doublelines, false); + continue; + } + + uae_u8 val = prev | newval; if (firstnz < 0 && newval) { firstnz = 0; - if (newval == 0x14) { - zigzagoffset = -1 * dst->pixbytes; - oddeven = -2; - } else { + if (ycnt & 1) { zigzagoffset = 0; - oddeven = -2; + oddeven = -1; + chrbuf_w = dctv_chroma + 8; + chrbuf_r1 = dctv_chroma + 8; + chrbuf_r2 = dctv_chroma + DCTV_BUFFER_SIZE + 8; + } else { + zigzagoffset = dst->pixbytes; + oddeven = -1; + chrbuf_w = dctv_chroma + DCTV_BUFFER_SIZE + 8; + chrbuf_r2 = dctv_chroma + 8; + chrbuf_r1 = dctv_chroma + DCTV_BUFFER_SIZE + 8; } + sign = false; } - if (oddeven > 0) { - if (!val) + if (oddeven > 0 && !firstnz) { + sign = !sign; + + if (val == 0) val = 64; - int tval = minmax(val, 64, 224); - if (tval != val) - tval = prevtval; - prevtval = tval; - - uae_s16 luma = (uae_s16)dctv_tables[tval]; - tval = minmax(luma / 16, 0, 255); - uae_u8 v1 = (uae_u8)tval; - - r = b = g = v1; - - if (val < 64) { - r = 0x80 + val * 2; - b = g = 0; - } else if (val > 224) { - r = b = 0; - g = 0x80 + (val - 224) * 2; + + vals[2] = vals[1]; + vals[1] = vals[0]; + vals[0] = val; + + int v0 = 2 * vals[1] - vals[2] - vals[0] + 2; + if (v0 < 0) + v0 += 3; + v0 /= 4; + int v1 = -v0; + if (sign) + v0 = -v0; + *chrbuf_w = minmax(v0, -127, 127); + *lumabuf1 = minmax(vals[2] + v1, 64, 224); + + int ch1 = chrbuf_r1[0] + chrbuf_r1[-1]; + int ch2 = chrbuf_r2[0] + chrbuf_r2[-1]; + ch1 /= 2; + ch2 /= 2; + + int luma = lumabuf1[-1] * 2 + lumabuf1[-2] + lumabuf1[0]; + luma /= 4; + + int l = (uae_s16)dctv_tables[luma]; + + int rr = (uae_s16)dctv_tables[ch1 + 0x180] + l; + int gg = (uae_s16)dctv_tables[ch1 + 0x380] + (uae_s16)dctv_tables[ch2 + 0x480] + l; + int bb = (uae_s16)dctv_tables[ch2 + 0x280] + l; + + uae_u8 r = minmax(rr >> 4, 0, 255); + uae_u8 g = minmax(gg >> 4, 0, 255); + uae_u8 b = minmax(bb >> 4, 0, 255); + + PRGB(dst, d - dst->pixbytes, r, g, b); + PRGB(dst, d, r, g, b); + if (doublelines) { + PRGB(dst, d2 - dst->pixbytes, r, g, b); + PRGB(dst, d2, r, g, b); } - - sign = !sign; + chrbuf_r1++; + chrbuf_r2++; + chrbuf_w++; + lumabuf1++; + + } else if (oddeven < 0) { + uae_u8 r = 0, b = 0, g = 0; PRGB(dst, d - dst->pixbytes, r, g, b); PRGB(dst, d, r, g, b); if (doublelines) { PRGB(dst, d2 - dst->pixbytes, r, g, b); PRGB(dst, d2, r, g, b); } + } if (oddeven >= 0) @@ -379,8 +585,17 @@ static bool dctv(struct vidbuffer *src, struct vidbuffer *dst, bool doublelines, prev = newval << 1; } } - dst->nativepositioning = true; - return true; + + if (dctv_enabled) { + dst->nativepositioning = true; + if (monitor != MONITOREMU_DCTV) { + monitor = MONITOREMU_DCTV; + write_log(_T("DCTV mode\n")); + } + } + + return dctv_enabled; + } static bool do_dctv(struct vidbuffer *src, struct vidbuffer *dst) -- 2.47.3