From f4467017eac931284d472a02c9d57ac6ab41f94b Mon Sep 17 00:00:00 2001 From: redcode Date: Sun, 20 Oct 2024 02:15:46 +0200 Subject: [PATCH] Rearrange the code for clarity and speed. --- sources/Z80.c | 456 +++++++++++++++++++++++++------------------------- 1 file changed, 228 insertions(+), 228 deletions(-) diff --git a/sources/Z80.c b/sources/Z80.c index 190843e2..d94f979c 100644 --- a/sources/Z80.c +++ b/sources/Z80.c @@ -73,6 +73,161 @@ #endif +/* MARK: - Precomputed Values of AF for `daa` */ + +#ifdef Z80_WITH_PRECOMPUTED_DAA +# define H(value) Z_UINT16(0x##value) + + static zuint16 const daa_af_table[2048] = { + /* HNC */ + /* 000 0 1 2 3 4 5 6 7 8 9 A B C D E F */ + /* 0 */ H(0044), H(0100), H(0200), H(0304), H(0400), H(0504), H(0604), H(0700), H(0808), H(090C), H(1010), H(1114), H(1214), H(1310), H(1414), H(1510), + /* 1 */ H(1000), H(1104), H(1204), H(1300), H(1404), H(1500), H(1600), H(1704), H(180C), H(1908), H(2030), H(2134), H(2234), H(2330), H(2434), H(2530), + /* 2 */ H(2020), H(2124), H(2224), H(2320), H(2424), H(2520), H(2620), H(2724), H(282C), H(2928), H(3034), H(3130), H(3230), H(3334), H(3430), H(3534), + /* 3 */ H(3024), H(3120), H(3220), H(3324), H(3420), H(3524), H(3624), H(3720), H(3828), H(392C), H(4010), H(4114), H(4214), H(4310), H(4414), H(4510), + /* 4 */ H(4000), H(4104), H(4204), H(4300), H(4404), H(4500), H(4600), H(4704), H(480C), H(4908), H(5014), H(5110), H(5210), H(5314), H(5410), H(5514), + /* 5 */ H(5004), H(5100), H(5200), H(5304), H(5400), H(5504), H(5604), H(5700), H(5808), H(590C), H(6034), H(6130), H(6230), H(6334), H(6430), H(6534), + /* 6 */ H(6024), H(6120), H(6220), H(6324), H(6420), H(6524), H(6624), H(6720), H(6828), H(692C), H(7030), H(7134), H(7234), H(7330), H(7434), H(7530), + /* 7 */ H(7020), H(7124), H(7224), H(7320), H(7424), H(7520), H(7620), H(7724), H(782C), H(7928), H(8090), H(8194), H(8294), H(8390), H(8494), H(8590), + /* 8 */ H(8080), H(8184), H(8284), H(8380), H(8484), H(8580), H(8680), H(8784), H(888C), H(8988), H(9094), H(9190), H(9290), H(9394), H(9490), H(9594), + /* 9 */ H(9084), H(9180), H(9280), H(9384), H(9480), H(9584), H(9684), H(9780), H(9888), H(998C), H(0055), H(0111), H(0211), H(0315), H(0411), H(0515), + /* A */ H(0045), H(0101), H(0201), H(0305), H(0401), H(0505), H(0605), H(0701), H(0809), H(090D), H(1011), H(1115), H(1215), H(1311), H(1415), H(1511), + /* B */ H(1001), H(1105), H(1205), H(1301), H(1405), H(1501), H(1601), H(1705), H(180D), H(1909), H(2031), H(2135), H(2235), H(2331), H(2435), H(2531), + /* C */ H(2021), H(2125), H(2225), H(2321), H(2425), H(2521), H(2621), H(2725), H(282D), H(2929), H(3035), H(3131), H(3231), H(3335), H(3431), H(3535), + /* D */ H(3025), H(3121), H(3221), H(3325), H(3421), H(3525), H(3625), H(3721), H(3829), H(392D), H(4011), H(4115), H(4215), H(4311), H(4415), H(4511), + /* E */ H(4001), H(4105), H(4205), H(4301), H(4405), H(4501), H(4601), H(4705), H(480D), H(4909), H(5015), H(5111), H(5211), H(5315), H(5411), H(5515), + /* F */ H(5005), H(5101), H(5201), H(5305), H(5401), H(5505), H(5605), H(5701), H(5809), H(590D), H(6035), H(6131), H(6231), H(6335), H(6431), H(6535), + /* HNC */ + /* 001 0 1 2 3 4 5 6 7 8 9 A B C D E F */ + /* 0 */ H(6025), H(6121), H(6221), H(6325), H(6421), H(6525), H(6625), H(6721), H(6829), H(692D), H(7031), H(7135), H(7235), H(7331), H(7435), H(7531), + /* 1 */ H(7021), H(7125), H(7225), H(7321), H(7425), H(7521), H(7621), H(7725), H(782D), H(7929), H(8091), H(8195), H(8295), H(8391), H(8495), H(8591), + /* 2 */ H(8081), H(8185), H(8285), H(8381), H(8485), H(8581), H(8681), H(8785), H(888D), H(8989), H(9095), H(9191), H(9291), H(9395), H(9491), H(9595), + /* 3 */ H(9085), H(9181), H(9281), H(9385), H(9481), H(9585), H(9685), H(9781), H(9889), H(998D), H(A0B5), H(A1B1), H(A2B1), H(A3B5), H(A4B1), H(A5B5), + /* 4 */ H(A0A5), H(A1A1), H(A2A1), H(A3A5), H(A4A1), H(A5A5), H(A6A5), H(A7A1), H(A8A9), H(A9AD), H(B0B1), H(B1B5), H(B2B5), H(B3B1), H(B4B5), H(B5B1), + /* 5 */ H(B0A1), H(B1A5), H(B2A5), H(B3A1), H(B4A5), H(B5A1), H(B6A1), H(B7A5), H(B8AD), H(B9A9), H(C095), H(C191), H(C291), H(C395), H(C491), H(C595), + /* 6 */ H(C085), H(C181), H(C281), H(C385), H(C481), H(C585), H(C685), H(C781), H(C889), H(C98D), H(D091), H(D195), H(D295), H(D391), H(D495), H(D591), + /* 7 */ H(D081), H(D185), H(D285), H(D381), H(D485), H(D581), H(D681), H(D785), H(D88D), H(D989), H(E0B1), H(E1B5), H(E2B5), H(E3B1), H(E4B5), H(E5B1), + /* 8 */ H(E0A1), H(E1A5), H(E2A5), H(E3A1), H(E4A5), H(E5A1), H(E6A1), H(E7A5), H(E8AD), H(E9A9), H(F0B5), H(F1B1), H(F2B1), H(F3B5), H(F4B1), H(F5B5), + /* 9 */ H(F0A5), H(F1A1), H(F2A1), H(F3A5), H(F4A1), H(F5A5), H(F6A5), H(F7A1), H(F8A9), H(F9AD), H(0055), H(0111), H(0211), H(0315), H(0411), H(0515), + /* A */ H(0045), H(0101), H(0201), H(0305), H(0401), H(0505), H(0605), H(0701), H(0809), H(090D), H(1011), H(1115), H(1215), H(1311), H(1415), H(1511), + /* B */ H(1001), H(1105), H(1205), H(1301), H(1405), H(1501), H(1601), H(1705), H(180D), H(1909), H(2031), H(2135), H(2235), H(2331), H(2435), H(2531), + /* C */ H(2021), H(2125), H(2225), H(2321), H(2425), H(2521), H(2621), H(2725), H(282D), H(2929), H(3035), H(3131), H(3231), H(3335), H(3431), H(3535), + /* D */ H(3025), H(3121), H(3221), H(3325), H(3421), H(3525), H(3625), H(3721), H(3829), H(392D), H(4011), H(4115), H(4215), H(4311), H(4415), H(4511), + /* E */ H(4001), H(4105), H(4205), H(4301), H(4405), H(4501), H(4601), H(4705), H(480D), H(4909), H(5015), H(5111), H(5211), H(5315), H(5411), H(5515), + /* F */ H(5005), H(5101), H(5201), H(5305), H(5401), H(5505), H(5605), H(5701), H(5809), H(590D), H(6035), H(6131), H(6231), H(6335), H(6431), H(6535), + /* HNC */ + /* 010 0 1 2 3 4 5 6 7 8 9 A B C D E F */ + /* 0 */ H(0046), H(0102), H(0202), H(0306), H(0402), H(0506), H(0606), H(0702), H(080A), H(090E), H(0402), H(0506), H(0606), H(0702), H(080A), H(090E), + /* 1 */ H(1002), H(1106), H(1206), H(1302), H(1406), H(1502), H(1602), H(1706), H(180E), H(190A), H(1406), H(1502), H(1602), H(1706), H(180E), H(190A), + /* 2 */ H(2022), H(2126), H(2226), H(2322), H(2426), H(2522), H(2622), H(2726), H(282E), H(292A), H(2426), H(2522), H(2622), H(2726), H(282E), H(292A), + /* 3 */ H(3026), H(3122), H(3222), H(3326), H(3422), H(3526), H(3626), H(3722), H(382A), H(392E), H(3422), H(3526), H(3626), H(3722), H(382A), H(392E), + /* 4 */ H(4002), H(4106), H(4206), H(4302), H(4406), H(4502), H(4602), H(4706), H(480E), H(490A), H(4406), H(4502), H(4602), H(4706), H(480E), H(490A), + /* 5 */ H(5006), H(5102), H(5202), H(5306), H(5402), H(5506), H(5606), H(5702), H(580A), H(590E), H(5402), H(5506), H(5606), H(5702), H(580A), H(590E), + /* 6 */ H(6026), H(6122), H(6222), H(6326), H(6422), H(6526), H(6626), H(6722), H(682A), H(692E), H(6422), H(6526), H(6626), H(6722), H(682A), H(692E), + /* 7 */ H(7022), H(7126), H(7226), H(7322), H(7426), H(7522), H(7622), H(7726), H(782E), H(792A), H(7426), H(7522), H(7622), H(7726), H(782E), H(792A), + /* 8 */ H(8082), H(8186), H(8286), H(8382), H(8486), H(8582), H(8682), H(8786), H(888E), H(898A), H(8486), H(8582), H(8682), H(8786), H(888E), H(898A), + /* 9 */ H(9086), H(9182), H(9282), H(9386), H(9482), H(9586), H(9686), H(9782), H(988A), H(998E), H(3423), H(3527), H(3627), H(3723), H(382B), H(392F), + /* A */ H(4003), H(4107), H(4207), H(4303), H(4407), H(4503), H(4603), H(4707), H(480F), H(490B), H(4407), H(4503), H(4603), H(4707), H(480F), H(490B), + /* B */ H(5007), H(5103), H(5203), H(5307), H(5403), H(5507), H(5607), H(5703), H(580B), H(590F), H(5403), H(5507), H(5607), H(5703), H(580B), H(590F), + /* C */ H(6027), H(6123), H(6223), H(6327), H(6423), H(6527), H(6627), H(6723), H(682B), H(692F), H(6423), H(6527), H(6627), H(6723), H(682B), H(692F), + /* D */ H(7023), H(7127), H(7227), H(7323), H(7427), H(7523), H(7623), H(7727), H(782F), H(792B), H(7427), H(7523), H(7623), H(7727), H(782F), H(792B), + /* E */ H(8083), H(8187), H(8287), H(8383), H(8487), H(8583), H(8683), H(8787), H(888F), H(898B), H(8487), H(8583), H(8683), H(8787), H(888F), H(898B), + /* F */ H(9087), H(9183), H(9283), H(9387), H(9483), H(9587), H(9687), H(9783), H(988B), H(998F), H(9483), H(9587), H(9687), H(9783), H(988B), H(998F), + /* HNC */ + /* 011 0 1 2 3 4 5 6 7 8 9 A B C D E F */ + /* 0 */ H(A0A7), H(A1A3), H(A2A3), H(A3A7), H(A4A3), H(A5A7), H(A6A7), H(A7A3), H(A8AB), H(A9AF), H(A4A3), H(A5A7), H(A6A7), H(A7A3), H(A8AB), H(A9AF), + /* 1 */ H(B0A3), H(B1A7), H(B2A7), H(B3A3), H(B4A7), H(B5A3), H(B6A3), H(B7A7), H(B8AF), H(B9AB), H(B4A7), H(B5A3), H(B6A3), H(B7A7), H(B8AF), H(B9AB), + /* 2 */ H(C087), H(C183), H(C283), H(C387), H(C483), H(C587), H(C687), H(C783), H(C88B), H(C98F), H(C483), H(C587), H(C687), H(C783), H(C88B), H(C98F), + /* 3 */ H(D083), H(D187), H(D287), H(D383), H(D487), H(D583), H(D683), H(D787), H(D88F), H(D98B), H(D487), H(D583), H(D683), H(D787), H(D88F), H(D98B), + /* 4 */ H(E0A3), H(E1A7), H(E2A7), H(E3A3), H(E4A7), H(E5A3), H(E6A3), H(E7A7), H(E8AF), H(E9AB), H(E4A7), H(E5A3), H(E6A3), H(E7A7), H(E8AF), H(E9AB), + /* 5 */ H(F0A7), H(F1A3), H(F2A3), H(F3A7), H(F4A3), H(F5A7), H(F6A7), H(F7A3), H(F8AB), H(F9AF), H(F4A3), H(F5A7), H(F6A7), H(F7A3), H(F8AB), H(F9AF), + /* 6 */ H(0047), H(0103), H(0203), H(0307), H(0403), H(0507), H(0607), H(0703), H(080B), H(090F), H(0403), H(0507), H(0607), H(0703), H(080B), H(090F), + /* 7 */ H(1003), H(1107), H(1207), H(1303), H(1407), H(1503), H(1603), H(1707), H(180F), H(190B), H(1407), H(1503), H(1603), H(1707), H(180F), H(190B), + /* 8 */ H(2023), H(2127), H(2227), H(2323), H(2427), H(2523), H(2623), H(2727), H(282F), H(292B), H(2427), H(2523), H(2623), H(2727), H(282F), H(292B), + /* 9 */ H(3027), H(3123), H(3223), H(3327), H(3423), H(3527), H(3627), H(3723), H(382B), H(392F), H(3423), H(3527), H(3627), H(3723), H(382B), H(392F), + /* A */ H(4003), H(4107), H(4207), H(4303), H(4407), H(4503), H(4603), H(4707), H(480F), H(490B), H(4407), H(4503), H(4603), H(4707), H(480F), H(490B), + /* B */ H(5007), H(5103), H(5203), H(5307), H(5403), H(5507), H(5607), H(5703), H(580B), H(590F), H(5403), H(5507), H(5607), H(5703), H(580B), H(590F), + /* C */ H(6027), H(6123), H(6223), H(6327), H(6423), H(6527), H(6627), H(6723), H(682B), H(692F), H(6423), H(6527), H(6627), H(6723), H(682B), H(692F), + /* D */ H(7023), H(7127), H(7227), H(7323), H(7427), H(7523), H(7623), H(7727), H(782F), H(792B), H(7427), H(7523), H(7623), H(7727), H(782F), H(792B), + /* E */ H(8083), H(8187), H(8287), H(8383), H(8487), H(8583), H(8683), H(8787), H(888F), H(898B), H(8487), H(8583), H(8683), H(8787), H(888F), H(898B), + /* F */ H(9087), H(9183), H(9283), H(9387), H(9483), H(9587), H(9687), H(9783), H(988B), H(998F), H(9483), H(9587), H(9687), H(9783), H(988B), H(998F), + /* HNC */ + /* 100 0 1 2 3 4 5 6 7 8 9 A B C D E F */ + /* 0 */ H(0604), H(0700), H(0808), H(090C), H(0A0C), H(0B08), H(0C0C), H(0D08), H(0E08), H(0F0C), H(1010), H(1114), H(1214), H(1310), H(1414), H(1510), + /* 1 */ H(1600), H(1704), H(180C), H(1908), H(1A08), H(1B0C), H(1C08), H(1D0C), H(1E0C), H(1F08), H(2030), H(2134), H(2234), H(2330), H(2434), H(2530), + /* 2 */ H(2620), H(2724), H(282C), H(2928), H(2A28), H(2B2C), H(2C28), H(2D2C), H(2E2C), H(2F28), H(3034), H(3130), H(3230), H(3334), H(3430), H(3534), + /* 3 */ H(3624), H(3720), H(3828), H(392C), H(3A2C), H(3B28), H(3C2C), H(3D28), H(3E28), H(3F2C), H(4010), H(4114), H(4214), H(4310), H(4414), H(4510), + /* 4 */ H(4600), H(4704), H(480C), H(4908), H(4A08), H(4B0C), H(4C08), H(4D0C), H(4E0C), H(4F08), H(5014), H(5110), H(5210), H(5314), H(5410), H(5514), + /* 5 */ H(5604), H(5700), H(5808), H(590C), H(5A0C), H(5B08), H(5C0C), H(5D08), H(5E08), H(5F0C), H(6034), H(6130), H(6230), H(6334), H(6430), H(6534), + /* 6 */ H(6624), H(6720), H(6828), H(692C), H(6A2C), H(6B28), H(6C2C), H(6D28), H(6E28), H(6F2C), H(7030), H(7134), H(7234), H(7330), H(7434), H(7530), + /* 7 */ H(7620), H(7724), H(782C), H(7928), H(7A28), H(7B2C), H(7C28), H(7D2C), H(7E2C), H(7F28), H(8090), H(8194), H(8294), H(8390), H(8494), H(8590), + /* 8 */ H(8680), H(8784), H(888C), H(8988), H(8A88), H(8B8C), H(8C88), H(8D8C), H(8E8C), H(8F88), H(9094), H(9190), H(9290), H(9394), H(9490), H(9594), + /* 9 */ H(9684), H(9780), H(9888), H(998C), H(9A8C), H(9B88), H(9C8C), H(9D88), H(9E88), H(9F8C), H(0055), H(0111), H(0211), H(0315), H(0411), H(0515), + /* A */ H(0605), H(0701), H(0809), H(090D), H(0A0D), H(0B09), H(0C0D), H(0D09), H(0E09), H(0F0D), H(1011), H(1115), H(1215), H(1311), H(1415), H(1511), + /* B */ H(1601), H(1705), H(180D), H(1909), H(1A09), H(1B0D), H(1C09), H(1D0D), H(1E0D), H(1F09), H(2031), H(2135), H(2235), H(2331), H(2435), H(2531), + /* C */ H(2621), H(2725), H(282D), H(2929), H(2A29), H(2B2D), H(2C29), H(2D2D), H(2E2D), H(2F29), H(3035), H(3131), H(3231), H(3335), H(3431), H(3535), + /* D */ H(3625), H(3721), H(3829), H(392D), H(3A2D), H(3B29), H(3C2D), H(3D29), H(3E29), H(3F2D), H(4011), H(4115), H(4215), H(4311), H(4415), H(4511), + /* E */ H(4601), H(4705), H(480D), H(4909), H(4A09), H(4B0D), H(4C09), H(4D0D), H(4E0D), H(4F09), H(5015), H(5111), H(5211), H(5315), H(5411), H(5515), + /* F */ H(5605), H(5701), H(5809), H(590D), H(5A0D), H(5B09), H(5C0D), H(5D09), H(5E09), H(5F0D), H(6035), H(6131), H(6231), H(6335), H(6431), H(6535), + /* HNC */ + /* 101 0 1 2 3 4 5 6 7 8 9 A B C D E F */ + /* 0 */ H(6625), H(6721), H(6829), H(692D), H(6A2D), H(6B29), H(6C2D), H(6D29), H(6E29), H(6F2D), H(7031), H(7135), H(7235), H(7331), H(7435), H(7531), + /* 1 */ H(7621), H(7725), H(782D), H(7929), H(7A29), H(7B2D), H(7C29), H(7D2D), H(7E2D), H(7F29), H(8091), H(8195), H(8295), H(8391), H(8495), H(8591), + /* 2 */ H(8681), H(8785), H(888D), H(8989), H(8A89), H(8B8D), H(8C89), H(8D8D), H(8E8D), H(8F89), H(9095), H(9191), H(9291), H(9395), H(9491), H(9595), + /* 3 */ H(9685), H(9781), H(9889), H(998D), H(9A8D), H(9B89), H(9C8D), H(9D89), H(9E89), H(9F8D), H(A0B5), H(A1B1), H(A2B1), H(A3B5), H(A4B1), H(A5B5), + /* 4 */ H(A6A5), H(A7A1), H(A8A9), H(A9AD), H(AAAD), H(ABA9), H(ACAD), H(ADA9), H(AEA9), H(AFAD), H(B0B1), H(B1B5), H(B2B5), H(B3B1), H(B4B5), H(B5B1), + /* 5 */ H(B6A1), H(B7A5), H(B8AD), H(B9A9), H(BAA9), H(BBAD), H(BCA9), H(BDAD), H(BEAD), H(BFA9), H(C095), H(C191), H(C291), H(C395), H(C491), H(C595), + /* 6 */ H(C685), H(C781), H(C889), H(C98D), H(CA8D), H(CB89), H(CC8D), H(CD89), H(CE89), H(CF8D), H(D091), H(D195), H(D295), H(D391), H(D495), H(D591), + /* 7 */ H(D681), H(D785), H(D88D), H(D989), H(DA89), H(DB8D), H(DC89), H(DD8D), H(DE8D), H(DF89), H(E0B1), H(E1B5), H(E2B5), H(E3B1), H(E4B5), H(E5B1), + /* 8 */ H(E6A1), H(E7A5), H(E8AD), H(E9A9), H(EAA9), H(EBAD), H(ECA9), H(EDAD), H(EEAD), H(EFA9), H(F0B5), H(F1B1), H(F2B1), H(F3B5), H(F4B1), H(F5B5), + /* 9 */ H(F6A5), H(F7A1), H(F8A9), H(F9AD), H(FAAD), H(FBA9), H(FCAD), H(FDA9), H(FEA9), H(FFAD), H(0055), H(0111), H(0211), H(0315), H(0411), H(0515), + /* A */ H(0605), H(0701), H(0809), H(090D), H(0A0D), H(0B09), H(0C0D), H(0D09), H(0E09), H(0F0D), H(1011), H(1115), H(1215), H(1311), H(1415), H(1511), + /* B */ H(1601), H(1705), H(180D), H(1909), H(1A09), H(1B0D), H(1C09), H(1D0D), H(1E0D), H(1F09), H(2031), H(2135), H(2235), H(2331), H(2435), H(2531), + /* C */ H(2621), H(2725), H(282D), H(2929), H(2A29), H(2B2D), H(2C29), H(2D2D), H(2E2D), H(2F29), H(3035), H(3131), H(3231), H(3335), H(3431), H(3535), + /* D */ H(3625), H(3721), H(3829), H(392D), H(3A2D), H(3B29), H(3C2D), H(3D29), H(3E29), H(3F2D), H(4011), H(4115), H(4215), H(4311), H(4415), H(4511), + /* E */ H(4601), H(4705), H(480D), H(4909), H(4A09), H(4B0D), H(4C09), H(4D0D), H(4E0D), H(4F09), H(5015), H(5111), H(5211), H(5315), H(5411), H(5515), + /* F */ H(5605), H(5701), H(5809), H(590D), H(5A0D), H(5B09), H(5C0D), H(5D09), H(5E09), H(5F0D), H(6035), H(6131), H(6231), H(6335), H(6431), H(6535), + /* HNC */ + /* 110 0 1 2 3 4 5 6 7 8 9 A B C D E F */ + /* 0 */ H(FABE), H(FBBA), H(FCBE), H(FDBA), H(FEBA), H(FFBE), H(0046), H(0102), H(0202), H(0306), H(0402), H(0506), H(0606), H(0702), H(080A), H(090E), + /* 1 */ H(0A1E), H(0B1A), H(0C1E), H(0D1A), H(0E1A), H(0F1E), H(1002), H(1106), H(1206), H(1302), H(1406), H(1502), H(1602), H(1706), H(180E), H(190A), + /* 2 */ H(1A1A), H(1B1E), H(1C1A), H(1D1E), H(1E1E), H(1F1A), H(2022), H(2126), H(2226), H(2322), H(2426), H(2522), H(2622), H(2726), H(282E), H(292A), + /* 3 */ H(2A3A), H(2B3E), H(2C3A), H(2D3E), H(2E3E), H(2F3A), H(3026), H(3122), H(3222), H(3326), H(3422), H(3526), H(3626), H(3722), H(382A), H(392E), + /* 4 */ H(3A3E), H(3B3A), H(3C3E), H(3D3A), H(3E3A), H(3F3E), H(4002), H(4106), H(4206), H(4302), H(4406), H(4502), H(4602), H(4706), H(480E), H(490A), + /* 5 */ H(4A1A), H(4B1E), H(4C1A), H(4D1E), H(4E1E), H(4F1A), H(5006), H(5102), H(5202), H(5306), H(5402), H(5506), H(5606), H(5702), H(580A), H(590E), + /* 6 */ H(5A1E), H(5B1A), H(5C1E), H(5D1A), H(5E1A), H(5F1E), H(6026), H(6122), H(6222), H(6326), H(6422), H(6526), H(6626), H(6722), H(682A), H(692E), + /* 7 */ H(6A3E), H(6B3A), H(6C3E), H(6D3A), H(6E3A), H(6F3E), H(7022), H(7126), H(7226), H(7322), H(7426), H(7522), H(7622), H(7726), H(782E), H(792A), + /* 8 */ H(7A3A), H(7B3E), H(7C3A), H(7D3E), H(7E3E), H(7F3A), H(8082), H(8186), H(8286), H(8382), H(8486), H(8582), H(8682), H(8786), H(888E), H(898A), + /* 9 */ H(8A9A), H(8B9E), H(8C9A), H(8D9E), H(8E9E), H(8F9A), H(9086), H(9182), H(9282), H(9386), H(3423), H(3527), H(3627), H(3723), H(382B), H(392F), + /* A */ H(3A3F), H(3B3B), H(3C3F), H(3D3B), H(3E3B), H(3F3F), H(4003), H(4107), H(4207), H(4303), H(4407), H(4503), H(4603), H(4707), H(480F), H(490B), + /* B */ H(4A1B), H(4B1F), H(4C1B), H(4D1F), H(4E1F), H(4F1B), H(5007), H(5103), H(5203), H(5307), H(5403), H(5507), H(5607), H(5703), H(580B), H(590F), + /* C */ H(5A1F), H(5B1B), H(5C1F), H(5D1B), H(5E1B), H(5F1F), H(6027), H(6123), H(6223), H(6327), H(6423), H(6527), H(6627), H(6723), H(682B), H(692F), + /* D */ H(6A3F), H(6B3B), H(6C3F), H(6D3B), H(6E3B), H(6F3F), H(7023), H(7127), H(7227), H(7323), H(7427), H(7523), H(7623), H(7727), H(782F), H(792B), + /* E */ H(7A3B), H(7B3F), H(7C3B), H(7D3F), H(7E3F), H(7F3B), H(8083), H(8187), H(8287), H(8383), H(8487), H(8583), H(8683), H(8787), H(888F), H(898B), + /* F */ H(8A9B), H(8B9F), H(8C9B), H(8D9F), H(8E9F), H(8F9B), H(9087), H(9183), H(9283), H(9387), H(9483), H(9587), H(9687), H(9783), H(988B), H(998F), + /* HNC */ + /* 111 0 1 2 3 4 5 6 7 8 9 A B C D E F */ + /* 0 */ H(9A9F), H(9B9B), H(9C9F), H(9D9B), H(9E9B), H(9F9F), H(A0A7), H(A1A3), H(A2A3), H(A3A7), H(A4A3), H(A5A7), H(A6A7), H(A7A3), H(A8AB), H(A9AF), + /* 1 */ H(AABF), H(ABBB), H(ACBF), H(ADBB), H(AEBB), H(AFBF), H(B0A3), H(B1A7), H(B2A7), H(B3A3), H(B4A7), H(B5A3), H(B6A3), H(B7A7), H(B8AF), H(B9AB), + /* 2 */ H(BABB), H(BBBF), H(BCBB), H(BDBF), H(BEBF), H(BFBB), H(C087), H(C183), H(C283), H(C387), H(C483), H(C587), H(C687), H(C783), H(C88B), H(C98F), + /* 3 */ H(CA9F), H(CB9B), H(CC9F), H(CD9B), H(CE9B), H(CF9F), H(D083), H(D187), H(D287), H(D383), H(D487), H(D583), H(D683), H(D787), H(D88F), H(D98B), + /* 4 */ H(DA9B), H(DB9F), H(DC9B), H(DD9F), H(DE9F), H(DF9B), H(E0A3), H(E1A7), H(E2A7), H(E3A3), H(E4A7), H(E5A3), H(E6A3), H(E7A7), H(E8AF), H(E9AB), + /* 5 */ H(EABB), H(EBBF), H(ECBB), H(EDBF), H(EEBF), H(EFBB), H(F0A7), H(F1A3), H(F2A3), H(F3A7), H(F4A3), H(F5A7), H(F6A7), H(F7A3), H(F8AB), H(F9AF), + /* 6 */ H(FABF), H(FBBB), H(FCBF), H(FDBB), H(FEBB), H(FFBF), H(0047), H(0103), H(0203), H(0307), H(0403), H(0507), H(0607), H(0703), H(080B), H(090F), + /* 7 */ H(0A1F), H(0B1B), H(0C1F), H(0D1B), H(0E1B), H(0F1F), H(1003), H(1107), H(1207), H(1303), H(1407), H(1503), H(1603), H(1707), H(180F), H(190B), + /* 8 */ H(1A1B), H(1B1F), H(1C1B), H(1D1F), H(1E1F), H(1F1B), H(2023), H(2127), H(2227), H(2323), H(2427), H(2523), H(2623), H(2727), H(282F), H(292B), + /* 9 */ H(2A3B), H(2B3F), H(2C3B), H(2D3F), H(2E3F), H(2F3B), H(3027), H(3123), H(3223), H(3327), H(3423), H(3527), H(3627), H(3723), H(382B), H(392F), + /* A */ H(3A3F), H(3B3B), H(3C3F), H(3D3B), H(3E3B), H(3F3F), H(4003), H(4107), H(4207), H(4303), H(4407), H(4503), H(4603), H(4707), H(480F), H(490B), + /* B */ H(4A1B), H(4B1F), H(4C1B), H(4D1F), H(4E1F), H(4F1B), H(5007), H(5103), H(5203), H(5307), H(5403), H(5507), H(5607), H(5703), H(580B), H(590F), + /* C */ H(5A1F), H(5B1B), H(5C1F), H(5D1B), H(5E1B), H(5F1F), H(6027), H(6123), H(6223), H(6327), H(6423), H(6527), H(6627), H(6723), H(682B), H(692F), + /* D */ H(6A3F), H(6B3B), H(6C3F), H(6D3B), H(6E3B), H(6F3F), H(7023), H(7127), H(7227), H(7323), H(7427), H(7523), H(7623), H(7727), H(782F), H(792B), + /* E */ H(7A3B), H(7B3F), H(7C3B), H(7D3F), H(7E3F), H(7F3B), H(8083), H(8187), H(8287), H(8383), H(8487), H(8583), H(8683), H(8787), H(888F), H(898B), + /* F */ H(8A9B), H(8B9F), H(8C9B), H(8D9F), H(8E9F), H(8F9B), H(9087), H(9183), H(9283), H(9387), H(9483), H(9587), H(9687), H(9783), H(988B), H(998F)}; + +# undef H +#endif + + /* MARK: - Types */ typedef zuint8 (* Insn)(Z80 *self); @@ -144,7 +299,7 @@ typedef zuint8 (* Insn)(Z80 *self); #define NOTIFY(callback) if (self->callback != Z_NULL) self->callback(CONTEXT) -/* MARK: - Callbacks: 16-bit Operations */ +/* MARK: - 16-bit Callback Operations */ static Z_ALWAYS_INLINE zuint16 fetch_16(Z80 *self, zuint16 address) { @@ -189,6 +344,78 @@ static Z_ALWAYS_INLINE void write_16b(Z80 *self, zuint16 address, zuint16 value) #define WRITE_16B(address, value) write_16b(self, address, value) +/* MARK: - Interrupt Mode 0: Callback Trampolines */ + +#ifdef Z80_WITH_FULL_IM0 + static zuint8 im0_fetch(IM0 const *self, zuint16 address) + { + Z_UNUSED(address) + return self->z80->int_fetch(CONTEXT, self->pc); + } + + + static zuint8 im0_read(IM0 const *self, zuint16 address) + {return READ(address);} + + + static void im0_write(IM0 const *self, zuint16 address, zuint8 value) + {WRITE(address, value);} + + + static zuint8 im0_in(IM0 const *self, zuint16 port) + {return IN(port);} + + + static void im0_out(IM0 const *self, zuint16 port, zuint8 value) + {OUT(port, value);} + + + static void im0_ld_i_a(IM0 const *self) {NOTIFY(ld_i_a);} + static void im0_ld_r_a(IM0 const *self) {NOTIFY(ld_r_a);} + + +# ifdef Z80_WITH_IM0_RETX_NOTIFICATIONS + #define IM0_NOTIFY_RETX(callback) \ + if ( self->callback != Z_NULL && \ + (self->z80->options & \ + Z80_OPTION_IM0_RETX_NOTIFICATIONS) \ + ) \ + { \ + self->z80->data.uint8_array[2] |= 2; \ + self->callback(CONTEXT); \ + } + + + static void im0_reti(IM0 const *self) {IM0_NOTIFY_RETX(reti)} + static void im0_retn(IM0 const *self) {IM0_NOTIFY_RETX(retn)} +# endif +#endif + + +/* MARK: - Interrupt Mode 0: PC Decrements for Unprefixed Instructions */ + +#ifdef Z80_WITH_FULL_IM0 + static zuint8 const im0_pc_decrement_table[256] = { + /* 0 1 2 3 4 5 6 7 8 9 A B C D E F */ + /* 0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + /* 1 */ 2, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, + /* 2 */ 2, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, + /* 3 */ 2, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, + /* 4 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + /* 5 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + /* 6 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + /* 7 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + /* 8 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + /* 9 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + /* A */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + /* B */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + /* C */ 1, 0, 3, 3, 3, 0, 0, 1, 1, 1, 3, 0, 3, 3, 0, 1, + /* D */ 1, 0, 3, 0, 3, 0, 0, 1, 1, 0, 3, 0, 3, 0, 0, 1, + /* E */ 1, 0, 3, 0, 3, 0, 0, 1, 1, 1, 3, 0, 3, 0, 0, 1, + /* F */ 1, 0, 3, 0, 3, 0, 0, 1, 1, 0, 3, 0, 3, 0, 0, 1}; +#endif + + /* MARK: - Flags */ /*----------------. @@ -291,161 +518,6 @@ static Z_ALWAYS_INLINE void write_16b(Z80 *self, zuint16 address, zuint16 value) #endif -/* MARK: - Precomputed Values of AF for `daa` */ - -#ifdef Z80_WITH_PRECOMPUTED_DAA -# define _(value) Z_UINT16(0x##value) - - static zuint16 const daa_af_table[2048] = { - /* HNC */ - /* 000 0 1 2 3 4 5 6 7 8 9 A B C D E F */ - /* 0 */ _(0044), _(0100), _(0200), _(0304), _(0400), _(0504), _(0604), _(0700), _(0808), _(090C), _(1010), _(1114), _(1214), _(1310), _(1414), _(1510), - /* 1 */ _(1000), _(1104), _(1204), _(1300), _(1404), _(1500), _(1600), _(1704), _(180C), _(1908), _(2030), _(2134), _(2234), _(2330), _(2434), _(2530), - /* 2 */ _(2020), _(2124), _(2224), _(2320), _(2424), _(2520), _(2620), _(2724), _(282C), _(2928), _(3034), _(3130), _(3230), _(3334), _(3430), _(3534), - /* 3 */ _(3024), _(3120), _(3220), _(3324), _(3420), _(3524), _(3624), _(3720), _(3828), _(392C), _(4010), _(4114), _(4214), _(4310), _(4414), _(4510), - /* 4 */ _(4000), _(4104), _(4204), _(4300), _(4404), _(4500), _(4600), _(4704), _(480C), _(4908), _(5014), _(5110), _(5210), _(5314), _(5410), _(5514), - /* 5 */ _(5004), _(5100), _(5200), _(5304), _(5400), _(5504), _(5604), _(5700), _(5808), _(590C), _(6034), _(6130), _(6230), _(6334), _(6430), _(6534), - /* 6 */ _(6024), _(6120), _(6220), _(6324), _(6420), _(6524), _(6624), _(6720), _(6828), _(692C), _(7030), _(7134), _(7234), _(7330), _(7434), _(7530), - /* 7 */ _(7020), _(7124), _(7224), _(7320), _(7424), _(7520), _(7620), _(7724), _(782C), _(7928), _(8090), _(8194), _(8294), _(8390), _(8494), _(8590), - /* 8 */ _(8080), _(8184), _(8284), _(8380), _(8484), _(8580), _(8680), _(8784), _(888C), _(8988), _(9094), _(9190), _(9290), _(9394), _(9490), _(9594), - /* 9 */ _(9084), _(9180), _(9280), _(9384), _(9480), _(9584), _(9684), _(9780), _(9888), _(998C), _(0055), _(0111), _(0211), _(0315), _(0411), _(0515), - /* A */ _(0045), _(0101), _(0201), _(0305), _(0401), _(0505), _(0605), _(0701), _(0809), _(090D), _(1011), _(1115), _(1215), _(1311), _(1415), _(1511), - /* B */ _(1001), _(1105), _(1205), _(1301), _(1405), _(1501), _(1601), _(1705), _(180D), _(1909), _(2031), _(2135), _(2235), _(2331), _(2435), _(2531), - /* C */ _(2021), _(2125), _(2225), _(2321), _(2425), _(2521), _(2621), _(2725), _(282D), _(2929), _(3035), _(3131), _(3231), _(3335), _(3431), _(3535), - /* D */ _(3025), _(3121), _(3221), _(3325), _(3421), _(3525), _(3625), _(3721), _(3829), _(392D), _(4011), _(4115), _(4215), _(4311), _(4415), _(4511), - /* E */ _(4001), _(4105), _(4205), _(4301), _(4405), _(4501), _(4601), _(4705), _(480D), _(4909), _(5015), _(5111), _(5211), _(5315), _(5411), _(5515), - /* F */ _(5005), _(5101), _(5201), _(5305), _(5401), _(5505), _(5605), _(5701), _(5809), _(590D), _(6035), _(6131), _(6231), _(6335), _(6431), _(6535), - /* HNC */ - /* 001 0 1 2 3 4 5 6 7 8 9 A B C D E F */ - /* 0 */ _(6025), _(6121), _(6221), _(6325), _(6421), _(6525), _(6625), _(6721), _(6829), _(692D), _(7031), _(7135), _(7235), _(7331), _(7435), _(7531), - /* 1 */ _(7021), _(7125), _(7225), _(7321), _(7425), _(7521), _(7621), _(7725), _(782D), _(7929), _(8091), _(8195), _(8295), _(8391), _(8495), _(8591), - /* 2 */ _(8081), _(8185), _(8285), _(8381), _(8485), _(8581), _(8681), _(8785), _(888D), _(8989), _(9095), _(9191), _(9291), _(9395), _(9491), _(9595), - /* 3 */ _(9085), _(9181), _(9281), _(9385), _(9481), _(9585), _(9685), _(9781), _(9889), _(998D), _(A0B5), _(A1B1), _(A2B1), _(A3B5), _(A4B1), _(A5B5), - /* 4 */ _(A0A5), _(A1A1), _(A2A1), _(A3A5), _(A4A1), _(A5A5), _(A6A5), _(A7A1), _(A8A9), _(A9AD), _(B0B1), _(B1B5), _(B2B5), _(B3B1), _(B4B5), _(B5B1), - /* 5 */ _(B0A1), _(B1A5), _(B2A5), _(B3A1), _(B4A5), _(B5A1), _(B6A1), _(B7A5), _(B8AD), _(B9A9), _(C095), _(C191), _(C291), _(C395), _(C491), _(C595), - /* 6 */ _(C085), _(C181), _(C281), _(C385), _(C481), _(C585), _(C685), _(C781), _(C889), _(C98D), _(D091), _(D195), _(D295), _(D391), _(D495), _(D591), - /* 7 */ _(D081), _(D185), _(D285), _(D381), _(D485), _(D581), _(D681), _(D785), _(D88D), _(D989), _(E0B1), _(E1B5), _(E2B5), _(E3B1), _(E4B5), _(E5B1), - /* 8 */ _(E0A1), _(E1A5), _(E2A5), _(E3A1), _(E4A5), _(E5A1), _(E6A1), _(E7A5), _(E8AD), _(E9A9), _(F0B5), _(F1B1), _(F2B1), _(F3B5), _(F4B1), _(F5B5), - /* 9 */ _(F0A5), _(F1A1), _(F2A1), _(F3A5), _(F4A1), _(F5A5), _(F6A5), _(F7A1), _(F8A9), _(F9AD), _(0055), _(0111), _(0211), _(0315), _(0411), _(0515), - /* A */ _(0045), _(0101), _(0201), _(0305), _(0401), _(0505), _(0605), _(0701), _(0809), _(090D), _(1011), _(1115), _(1215), _(1311), _(1415), _(1511), - /* B */ _(1001), _(1105), _(1205), _(1301), _(1405), _(1501), _(1601), _(1705), _(180D), _(1909), _(2031), _(2135), _(2235), _(2331), _(2435), _(2531), - /* C */ _(2021), _(2125), _(2225), _(2321), _(2425), _(2521), _(2621), _(2725), _(282D), _(2929), _(3035), _(3131), _(3231), _(3335), _(3431), _(3535), - /* D */ _(3025), _(3121), _(3221), _(3325), _(3421), _(3525), _(3625), _(3721), _(3829), _(392D), _(4011), _(4115), _(4215), _(4311), _(4415), _(4511), - /* E */ _(4001), _(4105), _(4205), _(4301), _(4405), _(4501), _(4601), _(4705), _(480D), _(4909), _(5015), _(5111), _(5211), _(5315), _(5411), _(5515), - /* HNC */ - /* 010 0 1 2 3 4 5 6 7 8 9 A B C D E F */ - /* F */ _(5005), _(5101), _(5201), _(5305), _(5401), _(5505), _(5605), _(5701), _(5809), _(590D), _(6035), _(6131), _(6231), _(6335), _(6431), _(6535), - /* 0 */ _(0046), _(0102), _(0202), _(0306), _(0402), _(0506), _(0606), _(0702), _(080A), _(090E), _(0402), _(0506), _(0606), _(0702), _(080A), _(090E), - /* 1 */ _(1002), _(1106), _(1206), _(1302), _(1406), _(1502), _(1602), _(1706), _(180E), _(190A), _(1406), _(1502), _(1602), _(1706), _(180E), _(190A), - /* 2 */ _(2022), _(2126), _(2226), _(2322), _(2426), _(2522), _(2622), _(2726), _(282E), _(292A), _(2426), _(2522), _(2622), _(2726), _(282E), _(292A), - /* 3 */ _(3026), _(3122), _(3222), _(3326), _(3422), _(3526), _(3626), _(3722), _(382A), _(392E), _(3422), _(3526), _(3626), _(3722), _(382A), _(392E), - /* 4 */ _(4002), _(4106), _(4206), _(4302), _(4406), _(4502), _(4602), _(4706), _(480E), _(490A), _(4406), _(4502), _(4602), _(4706), _(480E), _(490A), - /* 5 */ _(5006), _(5102), _(5202), _(5306), _(5402), _(5506), _(5606), _(5702), _(580A), _(590E), _(5402), _(5506), _(5606), _(5702), _(580A), _(590E), - /* 6 */ _(6026), _(6122), _(6222), _(6326), _(6422), _(6526), _(6626), _(6722), _(682A), _(692E), _(6422), _(6526), _(6626), _(6722), _(682A), _(692E), - /* 7 */ _(7022), _(7126), _(7226), _(7322), _(7426), _(7522), _(7622), _(7726), _(782E), _(792A), _(7426), _(7522), _(7622), _(7726), _(782E), _(792A), - /* 8 */ _(8082), _(8186), _(8286), _(8382), _(8486), _(8582), _(8682), _(8786), _(888E), _(898A), _(8486), _(8582), _(8682), _(8786), _(888E), _(898A), - /* 9 */ _(9086), _(9182), _(9282), _(9386), _(9482), _(9586), _(9686), _(9782), _(988A), _(998E), _(3423), _(3527), _(3627), _(3723), _(382B), _(392F), - /* A */ _(4003), _(4107), _(4207), _(4303), _(4407), _(4503), _(4603), _(4707), _(480F), _(490B), _(4407), _(4503), _(4603), _(4707), _(480F), _(490B), - /* B */ _(5007), _(5103), _(5203), _(5307), _(5403), _(5507), _(5607), _(5703), _(580B), _(590F), _(5403), _(5507), _(5607), _(5703), _(580B), _(590F), - /* C */ _(6027), _(6123), _(6223), _(6327), _(6423), _(6527), _(6627), _(6723), _(682B), _(692F), _(6423), _(6527), _(6627), _(6723), _(682B), _(692F), - /* D */ _(7023), _(7127), _(7227), _(7323), _(7427), _(7523), _(7623), _(7727), _(782F), _(792B), _(7427), _(7523), _(7623), _(7727), _(782F), _(792B), - /* E */ _(8083), _(8187), _(8287), _(8383), _(8487), _(8583), _(8683), _(8787), _(888F), _(898B), _(8487), _(8583), _(8683), _(8787), _(888F), _(898B), - /* HNC */ - /* 011 0 1 2 3 4 5 6 7 8 9 A B C D E F */ - /* F */ _(9087), _(9183), _(9283), _(9387), _(9483), _(9587), _(9687), _(9783), _(988B), _(998F), _(9483), _(9587), _(9687), _(9783), _(988B), _(998F), - /* 0 */ _(A0A7), _(A1A3), _(A2A3), _(A3A7), _(A4A3), _(A5A7), _(A6A7), _(A7A3), _(A8AB), _(A9AF), _(A4A3), _(A5A7), _(A6A7), _(A7A3), _(A8AB), _(A9AF), - /* 1 */ _(B0A3), _(B1A7), _(B2A7), _(B3A3), _(B4A7), _(B5A3), _(B6A3), _(B7A7), _(B8AF), _(B9AB), _(B4A7), _(B5A3), _(B6A3), _(B7A7), _(B8AF), _(B9AB), - /* 2 */ _(C087), _(C183), _(C283), _(C387), _(C483), _(C587), _(C687), _(C783), _(C88B), _(C98F), _(C483), _(C587), _(C687), _(C783), _(C88B), _(C98F), - /* 3 */ _(D083), _(D187), _(D287), _(D383), _(D487), _(D583), _(D683), _(D787), _(D88F), _(D98B), _(D487), _(D583), _(D683), _(D787), _(D88F), _(D98B), - /* 4 */ _(E0A3), _(E1A7), _(E2A7), _(E3A3), _(E4A7), _(E5A3), _(E6A3), _(E7A7), _(E8AF), _(E9AB), _(E4A7), _(E5A3), _(E6A3), _(E7A7), _(E8AF), _(E9AB), - /* 5 */ _(F0A7), _(F1A3), _(F2A3), _(F3A7), _(F4A3), _(F5A7), _(F6A7), _(F7A3), _(F8AB), _(F9AF), _(F4A3), _(F5A7), _(F6A7), _(F7A3), _(F8AB), _(F9AF), - /* 6 */ _(0047), _(0103), _(0203), _(0307), _(0403), _(0507), _(0607), _(0703), _(080B), _(090F), _(0403), _(0507), _(0607), _(0703), _(080B), _(090F), - /* 7 */ _(1003), _(1107), _(1207), _(1303), _(1407), _(1503), _(1603), _(1707), _(180F), _(190B), _(1407), _(1503), _(1603), _(1707), _(180F), _(190B), - /* 8 */ _(2023), _(2127), _(2227), _(2323), _(2427), _(2523), _(2623), _(2727), _(282F), _(292B), _(2427), _(2523), _(2623), _(2727), _(282F), _(292B), - /* 9 */ _(3027), _(3123), _(3223), _(3327), _(3423), _(3527), _(3627), _(3723), _(382B), _(392F), _(3423), _(3527), _(3627), _(3723), _(382B), _(392F), - /* A */ _(4003), _(4107), _(4207), _(4303), _(4407), _(4503), _(4603), _(4707), _(480F), _(490B), _(4407), _(4503), _(4603), _(4707), _(480F), _(490B), - /* B */ _(5007), _(5103), _(5203), _(5307), _(5403), _(5507), _(5607), _(5703), _(580B), _(590F), _(5403), _(5507), _(5607), _(5703), _(580B), _(590F), - /* C */ _(6027), _(6123), _(6223), _(6327), _(6423), _(6527), _(6627), _(6723), _(682B), _(692F), _(6423), _(6527), _(6627), _(6723), _(682B), _(692F), - /* D */ _(7023), _(7127), _(7227), _(7323), _(7427), _(7523), _(7623), _(7727), _(782F), _(792B), _(7427), _(7523), _(7623), _(7727), _(782F), _(792B), - /* E */ _(8083), _(8187), _(8287), _(8383), _(8487), _(8583), _(8683), _(8787), _(888F), _(898B), _(8487), _(8583), _(8683), _(8787), _(888F), _(898B), - /* HNC */ - /* 100 0 1 2 3 4 5 6 7 8 9 A B C D E F */ - /* F */ _(9087), _(9183), _(9283), _(9387), _(9483), _(9587), _(9687), _(9783), _(988B), _(998F), _(9483), _(9587), _(9687), _(9783), _(988B), _(998F), - /* 0 */ _(0604), _(0700), _(0808), _(090C), _(0A0C), _(0B08), _(0C0C), _(0D08), _(0E08), _(0F0C), _(1010), _(1114), _(1214), _(1310), _(1414), _(1510), - /* 1 */ _(1600), _(1704), _(180C), _(1908), _(1A08), _(1B0C), _(1C08), _(1D0C), _(1E0C), _(1F08), _(2030), _(2134), _(2234), _(2330), _(2434), _(2530), - /* 2 */ _(2620), _(2724), _(282C), _(2928), _(2A28), _(2B2C), _(2C28), _(2D2C), _(2E2C), _(2F28), _(3034), _(3130), _(3230), _(3334), _(3430), _(3534), - /* 3 */ _(3624), _(3720), _(3828), _(392C), _(3A2C), _(3B28), _(3C2C), _(3D28), _(3E28), _(3F2C), _(4010), _(4114), _(4214), _(4310), _(4414), _(4510), - /* 4 */ _(4600), _(4704), _(480C), _(4908), _(4A08), _(4B0C), _(4C08), _(4D0C), _(4E0C), _(4F08), _(5014), _(5110), _(5210), _(5314), _(5410), _(5514), - /* 5 */ _(5604), _(5700), _(5808), _(590C), _(5A0C), _(5B08), _(5C0C), _(5D08), _(5E08), _(5F0C), _(6034), _(6130), _(6230), _(6334), _(6430), _(6534), - /* 6 */ _(6624), _(6720), _(6828), _(692C), _(6A2C), _(6B28), _(6C2C), _(6D28), _(6E28), _(6F2C), _(7030), _(7134), _(7234), _(7330), _(7434), _(7530), - /* 7 */ _(7620), _(7724), _(782C), _(7928), _(7A28), _(7B2C), _(7C28), _(7D2C), _(7E2C), _(7F28), _(8090), _(8194), _(8294), _(8390), _(8494), _(8590), - /* 8 */ _(8680), _(8784), _(888C), _(8988), _(8A88), _(8B8C), _(8C88), _(8D8C), _(8E8C), _(8F88), _(9094), _(9190), _(9290), _(9394), _(9490), _(9594), - /* 9 */ _(9684), _(9780), _(9888), _(998C), _(9A8C), _(9B88), _(9C8C), _(9D88), _(9E88), _(9F8C), _(0055), _(0111), _(0211), _(0315), _(0411), _(0515), - /* A */ _(0605), _(0701), _(0809), _(090D), _(0A0D), _(0B09), _(0C0D), _(0D09), _(0E09), _(0F0D), _(1011), _(1115), _(1215), _(1311), _(1415), _(1511), - /* B */ _(1601), _(1705), _(180D), _(1909), _(1A09), _(1B0D), _(1C09), _(1D0D), _(1E0D), _(1F09), _(2031), _(2135), _(2235), _(2331), _(2435), _(2531), - /* C */ _(2621), _(2725), _(282D), _(2929), _(2A29), _(2B2D), _(2C29), _(2D2D), _(2E2D), _(2F29), _(3035), _(3131), _(3231), _(3335), _(3431), _(3535), - /* D */ _(3625), _(3721), _(3829), _(392D), _(3A2D), _(3B29), _(3C2D), _(3D29), _(3E29), _(3F2D), _(4011), _(4115), _(4215), _(4311), _(4415), _(4511), - /* E */ _(4601), _(4705), _(480D), _(4909), _(4A09), _(4B0D), _(4C09), _(4D0D), _(4E0D), _(4F09), _(5015), _(5111), _(5211), _(5315), _(5411), _(5515), - /* HNC */ - /* 101 0 1 2 3 4 5 6 7 8 9 A B C D E F */ - /* F */ _(5605), _(5701), _(5809), _(590D), _(5A0D), _(5B09), _(5C0D), _(5D09), _(5E09), _(5F0D), _(6035), _(6131), _(6231), _(6335), _(6431), _(6535), - /* 0 */ _(6625), _(6721), _(6829), _(692D), _(6A2D), _(6B29), _(6C2D), _(6D29), _(6E29), _(6F2D), _(7031), _(7135), _(7235), _(7331), _(7435), _(7531), - /* 1 */ _(7621), _(7725), _(782D), _(7929), _(7A29), _(7B2D), _(7C29), _(7D2D), _(7E2D), _(7F29), _(8091), _(8195), _(8295), _(8391), _(8495), _(8591), - /* 2 */ _(8681), _(8785), _(888D), _(8989), _(8A89), _(8B8D), _(8C89), _(8D8D), _(8E8D), _(8F89), _(9095), _(9191), _(9291), _(9395), _(9491), _(9595), - /* 3 */ _(9685), _(9781), _(9889), _(998D), _(9A8D), _(9B89), _(9C8D), _(9D89), _(9E89), _(9F8D), _(A0B5), _(A1B1), _(A2B1), _(A3B5), _(A4B1), _(A5B5), - /* 4 */ _(A6A5), _(A7A1), _(A8A9), _(A9AD), _(AAAD), _(ABA9), _(ACAD), _(ADA9), _(AEA9), _(AFAD), _(B0B1), _(B1B5), _(B2B5), _(B3B1), _(B4B5), _(B5B1), - /* 5 */ _(B6A1), _(B7A5), _(B8AD), _(B9A9), _(BAA9), _(BBAD), _(BCA9), _(BDAD), _(BEAD), _(BFA9), _(C095), _(C191), _(C291), _(C395), _(C491), _(C595), - /* 6 */ _(C685), _(C781), _(C889), _(C98D), _(CA8D), _(CB89), _(CC8D), _(CD89), _(CE89), _(CF8D), _(D091), _(D195), _(D295), _(D391), _(D495), _(D591), - /* 7 */ _(D681), _(D785), _(D88D), _(D989), _(DA89), _(DB8D), _(DC89), _(DD8D), _(DE8D), _(DF89), _(E0B1), _(E1B5), _(E2B5), _(E3B1), _(E4B5), _(E5B1), - /* 8 */ _(E6A1), _(E7A5), _(E8AD), _(E9A9), _(EAA9), _(EBAD), _(ECA9), _(EDAD), _(EEAD), _(EFA9), _(F0B5), _(F1B1), _(F2B1), _(F3B5), _(F4B1), _(F5B5), - /* 9 */ _(F6A5), _(F7A1), _(F8A9), _(F9AD), _(FAAD), _(FBA9), _(FCAD), _(FDA9), _(FEA9), _(FFAD), _(0055), _(0111), _(0211), _(0315), _(0411), _(0515), - /* A */ _(0605), _(0701), _(0809), _(090D), _(0A0D), _(0B09), _(0C0D), _(0D09), _(0E09), _(0F0D), _(1011), _(1115), _(1215), _(1311), _(1415), _(1511), - /* B */ _(1601), _(1705), _(180D), _(1909), _(1A09), _(1B0D), _(1C09), _(1D0D), _(1E0D), _(1F09), _(2031), _(2135), _(2235), _(2331), _(2435), _(2531), - /* C */ _(2621), _(2725), _(282D), _(2929), _(2A29), _(2B2D), _(2C29), _(2D2D), _(2E2D), _(2F29), _(3035), _(3131), _(3231), _(3335), _(3431), _(3535), - /* D */ _(3625), _(3721), _(3829), _(392D), _(3A2D), _(3B29), _(3C2D), _(3D29), _(3E29), _(3F2D), _(4011), _(4115), _(4215), _(4311), _(4415), _(4511), - /* E */ _(4601), _(4705), _(480D), _(4909), _(4A09), _(4B0D), _(4C09), _(4D0D), _(4E0D), _(4F09), _(5015), _(5111), _(5211), _(5315), _(5411), _(5515), - /* F */ _(5605), _(5701), _(5809), _(590D), _(5A0D), _(5B09), _(5C0D), _(5D09), _(5E09), _(5F0D), _(6035), _(6131), _(6231), _(6335), _(6431), _(6535), - /* HNC */ - /* 110 0 1 2 3 4 5 6 7 8 9 A B C D E F */ - /* 0 */ _(FABE), _(FBBA), _(FCBE), _(FDBA), _(FEBA), _(FFBE), _(0046), _(0102), _(0202), _(0306), _(0402), _(0506), _(0606), _(0702), _(080A), _(090E), - /* 1 */ _(0A1E), _(0B1A), _(0C1E), _(0D1A), _(0E1A), _(0F1E), _(1002), _(1106), _(1206), _(1302), _(1406), _(1502), _(1602), _(1706), _(180E), _(190A), - /* 2 */ _(1A1A), _(1B1E), _(1C1A), _(1D1E), _(1E1E), _(1F1A), _(2022), _(2126), _(2226), _(2322), _(2426), _(2522), _(2622), _(2726), _(282E), _(292A), - /* 3 */ _(2A3A), _(2B3E), _(2C3A), _(2D3E), _(2E3E), _(2F3A), _(3026), _(3122), _(3222), _(3326), _(3422), _(3526), _(3626), _(3722), _(382A), _(392E), - /* 4 */ _(3A3E), _(3B3A), _(3C3E), _(3D3A), _(3E3A), _(3F3E), _(4002), _(4106), _(4206), _(4302), _(4406), _(4502), _(4602), _(4706), _(480E), _(490A), - /* 5 */ _(4A1A), _(4B1E), _(4C1A), _(4D1E), _(4E1E), _(4F1A), _(5006), _(5102), _(5202), _(5306), _(5402), _(5506), _(5606), _(5702), _(580A), _(590E), - /* 6 */ _(5A1E), _(5B1A), _(5C1E), _(5D1A), _(5E1A), _(5F1E), _(6026), _(6122), _(6222), _(6326), _(6422), _(6526), _(6626), _(6722), _(682A), _(692E), - /* 7 */ _(6A3E), _(6B3A), _(6C3E), _(6D3A), _(6E3A), _(6F3E), _(7022), _(7126), _(7226), _(7322), _(7426), _(7522), _(7622), _(7726), _(782E), _(792A), - /* 8 */ _(7A3A), _(7B3E), _(7C3A), _(7D3E), _(7E3E), _(7F3A), _(8082), _(8186), _(8286), _(8382), _(8486), _(8582), _(8682), _(8786), _(888E), _(898A), - /* 9 */ _(8A9A), _(8B9E), _(8C9A), _(8D9E), _(8E9E), _(8F9A), _(9086), _(9182), _(9282), _(9386), _(3423), _(3527), _(3627), _(3723), _(382B), _(392F), - /* A */ _(3A3F), _(3B3B), _(3C3F), _(3D3B), _(3E3B), _(3F3F), _(4003), _(4107), _(4207), _(4303), _(4407), _(4503), _(4603), _(4707), _(480F), _(490B), - /* B */ _(4A1B), _(4B1F), _(4C1B), _(4D1F), _(4E1F), _(4F1B), _(5007), _(5103), _(5203), _(5307), _(5403), _(5507), _(5607), _(5703), _(580B), _(590F), - /* C */ _(5A1F), _(5B1B), _(5C1F), _(5D1B), _(5E1B), _(5F1F), _(6027), _(6123), _(6223), _(6327), _(6423), _(6527), _(6627), _(6723), _(682B), _(692F), - /* D */ _(6A3F), _(6B3B), _(6C3F), _(6D3B), _(6E3B), _(6F3F), _(7023), _(7127), _(7227), _(7323), _(7427), _(7523), _(7623), _(7727), _(782F), _(792B), - /* E */ _(7A3B), _(7B3F), _(7C3B), _(7D3F), _(7E3F), _(7F3B), _(8083), _(8187), _(8287), _(8383), _(8487), _(8583), _(8683), _(8787), _(888F), _(898B), - /* HNC */ - /* 111 0 1 2 3 4 5 6 7 8 9 A B C D E F */ - /* F */ _(8A9B), _(8B9F), _(8C9B), _(8D9F), _(8E9F), _(8F9B), _(9087), _(9183), _(9283), _(9387), _(9483), _(9587), _(9687), _(9783), _(988B), _(998F), - /* 0 */ _(9A9F), _(9B9B), _(9C9F), _(9D9B), _(9E9B), _(9F9F), _(A0A7), _(A1A3), _(A2A3), _(A3A7), _(A4A3), _(A5A7), _(A6A7), _(A7A3), _(A8AB), _(A9AF), - /* 1 */ _(AABF), _(ABBB), _(ACBF), _(ADBB), _(AEBB), _(AFBF), _(B0A3), _(B1A7), _(B2A7), _(B3A3), _(B4A7), _(B5A3), _(B6A3), _(B7A7), _(B8AF), _(B9AB), - /* 2 */ _(BABB), _(BBBF), _(BCBB), _(BDBF), _(BEBF), _(BFBB), _(C087), _(C183), _(C283), _(C387), _(C483), _(C587), _(C687), _(C783), _(C88B), _(C98F), - /* 3 */ _(CA9F), _(CB9B), _(CC9F), _(CD9B), _(CE9B), _(CF9F), _(D083), _(D187), _(D287), _(D383), _(D487), _(D583), _(D683), _(D787), _(D88F), _(D98B), - /* 4 */ _(DA9B), _(DB9F), _(DC9B), _(DD9F), _(DE9F), _(DF9B), _(E0A3), _(E1A7), _(E2A7), _(E3A3), _(E4A7), _(E5A3), _(E6A3), _(E7A7), _(E8AF), _(E9AB), - /* 5 */ _(EABB), _(EBBF), _(ECBB), _(EDBF), _(EEBF), _(EFBB), _(F0A7), _(F1A3), _(F2A3), _(F3A7), _(F4A3), _(F5A7), _(F6A7), _(F7A3), _(F8AB), _(F9AF), - /* 6 */ _(FABF), _(FBBB), _(FCBF), _(FDBB), _(FEBB), _(FFBF), _(0047), _(0103), _(0203), _(0307), _(0403), _(0507), _(0607), _(0703), _(080B), _(090F), - /* 7 */ _(0A1F), _(0B1B), _(0C1F), _(0D1B), _(0E1B), _(0F1F), _(1003), _(1107), _(1207), _(1303), _(1407), _(1503), _(1603), _(1707), _(180F), _(190B), - /* 8 */ _(1A1B), _(1B1F), _(1C1B), _(1D1F), _(1E1F), _(1F1B), _(2023), _(2127), _(2227), _(2323), _(2427), _(2523), _(2623), _(2727), _(282F), _(292B), - /* 9 */ _(2A3B), _(2B3F), _(2C3B), _(2D3F), _(2E3F), _(2F3B), _(3027), _(3123), _(3223), _(3327), _(3423), _(3527), _(3627), _(3723), _(382B), _(392F), - /* A */ _(3A3F), _(3B3B), _(3C3F), _(3D3B), _(3E3B), _(3F3F), _(4003), _(4107), _(4207), _(4303), _(4407), _(4503), _(4603), _(4707), _(480F), _(490B), - /* B */ _(4A1B), _(4B1F), _(4C1B), _(4D1F), _(4E1F), _(4F1B), _(5007), _(5103), _(5203), _(5307), _(5403), _(5507), _(5607), _(5703), _(580B), _(590F), - /* C */ _(5A1F), _(5B1B), _(5C1F), _(5D1B), _(5E1B), _(5F1F), _(6027), _(6123), _(6223), _(6327), _(6423), _(6527), _(6627), _(6723), _(682B), _(692F), - /* D */ _(6A3F), _(6B3B), _(6C3F), _(6D3B), _(6E3B), _(6F3F), _(7023), _(7127), _(7227), _(7323), _(7427), _(7523), _(7623), _(7727), _(782F), _(792B), - /* E */ _(7A3B), _(7B3F), _(7C3B), _(7D3F), _(7E3F), _(7F3B), _(8083), _(8187), _(8287), _(8383), _(8487), _(8583), _(8683), _(8787), _(888F), _(898B), - /* F */ _(8A9B), _(8B9F), _(8C9B), _(8D9F), _(8E9F), _(8F9B), _(9087), _(9183), _(9283), _(9387), _(9483), _(9587), _(9687), _(9783), _(988B), _(998F)}; - -# undef _ -#endif - - /* MARK: - Bit Rotation */ #define ROL(value) Z_UINT8_ROTATE_LEFT (value, 1) @@ -2211,78 +2283,6 @@ INSN(hook) } -/* MARK: - Interrupt Mode 0: PC Decrements for Unprefixed Instructions */ - -#ifdef Z80_WITH_FULL_IM0 - static zuint8 const im0_pc_decrement_table[256] = { - /* 0 1 2 3 4 5 6 7 8 9 A B C D E F */ - /* 0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - /* 1 */ 2, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, - /* 2 */ 2, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, - /* 3 */ 2, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, - /* 4 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - /* 5 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - /* 6 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - /* 7 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - /* 8 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - /* 9 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - /* A */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - /* B */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - /* C */ 1, 0, 3, 3, 3, 0, 0, 1, 1, 1, 3, 0, 3, 3, 0, 1, - /* D */ 1, 0, 3, 0, 3, 0, 0, 1, 1, 0, 3, 0, 3, 0, 0, 1, - /* E */ 1, 0, 3, 0, 3, 0, 0, 1, 1, 1, 3, 0, 3, 0, 0, 1, - /* F */ 1, 0, 3, 0, 3, 0, 0, 1, 1, 0, 3, 0, 3, 0, 0, 1}; -#endif - - -/* MARK: - Interrupt Mode 0: Callback Trampolines */ - -#ifdef Z80_WITH_FULL_IM0 - static zuint8 im0_fetch(IM0 const *self, zuint16 address) - { - Z_UNUSED(address) - return self->z80->int_fetch(CONTEXT, self->pc); - } - - - static zuint8 im0_read(IM0 const *self, zuint16 address) - {return READ(address);} - - - static void im0_write(IM0 const *self, zuint16 address, zuint8 value) - {WRITE(address, value);} - - - static zuint8 im0_in(IM0 const *self, zuint16 port) - {return IN(port);} - - - static void im0_out(IM0 const *self, zuint16 port, zuint8 value) - {OUT(port, value);} - - - static void im0_ld_i_a(IM0 const *self) {NOTIFY(ld_i_a);} - static void im0_ld_r_a(IM0 const *self) {NOTIFY(ld_r_a);} - - -# ifdef Z80_WITH_IM0_RETX_NOTIFICATIONS - #define IM0_NOTIFY_RETX(callback) \ - if ( self->callback != Z_NULL && \ - (self->z80->options & \ - Z80_OPTION_IM0_RETX_NOTIFICATIONS) \ - ) \ - { \ - self->z80->data.uint8_array[2] |= 2; \ - self->callback(CONTEXT); \ - } - - - static void im0_reti(IM0 const *self) {IM0_NOTIFY_RETX(reti)} - static void im0_retn(IM0 const *self) {IM0_NOTIFY_RETX(retn)} -# endif -#endif - - /* MARK: - Public Functions */ /*----------------------------------------------------------------------.