static PIC16_device Pics16[] = {
-// {
-// {"p18f242", "18f242", "pic18f242", "f242"}, // aliases
-// 0,
-// 0x300, // RAMsize
-// 0,
-// { 0xf80, 0xfff }, /* PIC18F242 range of SFR's */
-// {
-// /* PIC18F242 configuration words */
-// 0x300001,
-// 0x30000d,
-// { { 0x27, 0, 0xff } /* 1 */ , { 0x0f, 0, 0xff } /* 2 */ , { 0x0f, 0, 0xff } /* 3 */ ,
-// { -1, 0, 0xff } /* 4 */ , { 0x01, 0, 0xff } /* 5 */ , { 0x85, 0, 0xff } /* 6 */ ,
-// { -1, 0, 0xff } /* 7 */ , { 0x03, 0, 0xff } /* 8 */ , { 0xc0, 0, 0xff } /* 9 */ ,
-// { 0x03, 0, 0xff } /* a */ , { 0xe0, 0, 0xff } /* b */ , { 0x03, 0, 0xff } /* c */ ,
-// { 0x40, 0, 0xff } /* d */ }
-// }
-// },
-
- {
- {"p18f242", "18f242", "pic18f242", "f242"},
- 0,
- 0x300, /* 768 */
- 0x80,
- 0,
- { 0xf80, 0xfff }, /* PIC18F242 range of SFR's */
- {
- /* PIC18F242 configuration words */
- 0x300001,
- 0x30000d,
- { { 0x27, 0, 0xff } /* 1 */ , { 0x0f, 0, 0xff } /* 2 */ , { 0x0f, 0, 0xff } /* 3 */ ,
- { -1, 0, 0xff } /* 4 */ , { 0x01, 0, 0xff } /* 5 */ , { 0x85, 0, 0xff } /* 6 */ ,
- { -1, 0, 0xff } /* 7 */ , { 0x03, 0, 0xff } /* 8 */ , { 0xc0, 0, 0xff } /* 9 */ ,
- { 0x03, 0, 0xff } /* a */ , { 0xe0, 0, 0xff } /* b */ , { 0x03, 0, 0xff } /* c */ ,
- { 0x40, 0, 0xff } /* d */ }
- },
- { 0x200000, 0x200007,
- { { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
- { 0, 0 }, { 0, 0 }, { 0, 0 } }
- }
- },
- {
- {"p18f248", "18f248", "pic18f248", "f248"},
- 0,
- 0x300, /* 768 */
- 0x60,
- 0,
- { 0xf00, 0xfff }, /* PIC18F248 range of SFR's */
- {
- /* PIC18F248 configuration words */
- 0x300001,
- 0x30000d,
- { { 0x27, 0, 0xff } /* 1 */ , { 0x0f, 0, 0xff } /* 2 */ , { 0x0f, 0, 0xff } /* 3 */ ,
- { -1, 0, 0xff } /* 4 */ , { -1, 0, 0xff } /* 5 */ , { 0x85, 0, 0xff } /* 6 */ ,
- { -1, 0, 0xff } /* 7 */ , { 0x03, 0, 0xff } /* 8 */ , { 0xc0, 0, 0xff } /* 9 */ ,
- { 0x03, 0, 0xff } /* a */ , { 0xe0, 0, 0xff } /* b */ , { 0x03, 0, 0xff } /* c */ ,
- { 0x40, 0, 0xff } /* d */ }
- },
- { 0x200000, 0x200007,
- { { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
- { 0, 0 }, { 0, 0 }, { 0, 0 } }
- }
- },
- {
- {"p18f252", "18f252", "pic18f252", "f252"},
- 0,
- 0x600, /* 1536 */
- 0x80,
- 0,
- { 0xf80, 0xfff }, /* PIC18F252 range of SFR's */
- {
- /* PIC18F252 configuration words */
- 0x300001,
- 0x30000d,
- { { 0x27, 0, 0xff } /* 1 */ , { 0x0f, 0, 0xff } /* 2 */ , { 0x0f, 0, 0xff } /* 3 */ ,
- { -1, 0, 0xff } /* 4 */ , { 0x01, 0, 0xff } /* 5 */ , { 0x85, 0, 0xff } /* 6 */ ,
- { -1, 0, 0xff } /* 7 */ , { 0x0f, 0, 0xff } /* 8 */ , { 0xc0, 0, 0xff } /* 9 */ ,
- { 0x0f, 0, 0xff } /* a */ , { 0xe0, 0, 0xff } /* b */ , { 0x0f, 0, 0xff } /* c */ ,
- { 0x40, 0, 0xff } /* d */ }
- },
- { 0x200000, 0x200007,
- { { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
- { 0, 0 }, { 0, 0 }, { 0, 0 } }
- }
- },
- {
- {"p18f258", "18f258", "pic18f258", "f258"},
- 0,
- 0x600, /* 1536 */
- 0x60,
- 0,
- { 0xf00, 0xfff }, /* PIC18F258 range of SFR's */
- {
- /* PIC18F258 configuration words */
- 0x300001,
- 0x30000d,
- { { 0x27, 0, 0xff } /* 1 */ , { 0x0f, 0, 0xff } /* 2 */ , { 0x0f, 0, 0xff } /* 3 */ ,
- { -1, 0, 0xff } /* 4 */ , { -1, 0, 0xff } /* 5 */ , { 0x85, 0, 0xff } /* 6 */ ,
- { -1, 0, 0xff } /* 7 */ , { 0x0f, 0, 0xff } /* 8 */ , { 0xc0, 0, 0xff } /* 9 */ ,
- { 0x0f, 0, 0xff } /* a */ , { 0xe0, 0, 0xff } /* b */ , { 0x0f, 0, 0xff } /* c */ ,
- { 0x40, 0, 0xff } /* d */ }
- },
- { 0x200000, 0x200007,
- { { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
- { 0, 0 }, { 0, 0 }, { 0, 0 } }
- }
- },
- {
- {"p18f442", "18f442", "pic18f442", "f442"},
- 0,
- 0x300, /* 768 */
- 0x80,
- 0,
- { 0xf80, 0xfff }, /* PIC18F442 range of SFR's */
- {
- /* PIC18F442 configuration words */
- 0x300001,
- 0x30000d,
- { { 0x27, 0, 0xff } /* 1 */ , { 0x0f, 0, 0xff } /* 2 */ , { 0x0f, 0, 0xff } /* 3 */ ,
- { -1, 0, 0xff } /* 4 */ , { 0x01, 0, 0xff } /* 5 */ , { 0x85, 0, 0xff } /* 6 */ ,
- { -1, 0, 0xff } /* 7 */ , { 0x03, 0, 0xff } /* 8 */ , { 0xc0, 0, 0xff } /* 9 */ ,
- { 0x03, 0, 0xff } /* a */ , { 0xe0, 0, 0xff } /* b */ , { 0x03, 0, 0xff } /* c */ ,
- { 0x40, 0, 0xff } /* d */ }
- },
- { 0x200000, 0x200007,
- { { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
- { 0, 0 }, { 0, 0 }, { 0, 0 } }
- }
- },
- {
- {"p18f448", "18f448", "pic18f448", "f448"},
- 0,
- 0x300, /* 768 */
- 0x60,
- 0,
- { 0xf00, 0xfff }, /* PIC18F448 range of SFR's */
- {
- /* PIC18F448 configuration words */
- 0x300001,
- 0x30000d,
- { { 0x27, 0, 0xff } /* 1 */ , { 0x0f, 0, 0xff } /* 2 */ , { 0x0f, 0, 0xff } /* 3 */ ,
- { -1, 0, 0xff } /* 4 */ , { -1, 0, 0xff } /* 5 */ , { 0x85, 0, 0xff } /* 6 */ ,
- { -1, 0, 0xff } /* 7 */ , { 0x03, 0, 0xff } /* 8 */ , { 0xc0, 0, 0xff } /* 9 */ ,
- { 0x03, 0, 0xff } /* a */ , { 0xe0, 0, 0xff } /* b */ , { 0x03, 0, 0xff } /* c */ ,
- { 0x40, 0, 0xff } /* d */ }
- },
- { 0x200000, 0x200007,
- { { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
- { 0, 0 }, { 0, 0 }, { 0, 0 } }
- }
- },
- {
- {"p18f452", "18f452", "pic18f452", "f452"},
- 0,
- 0x600, /* 1536 */
- 0x80,
- 0,
- { 0xf80, 0xfff }, /* PIC18F452 range of SFR's */
- {
- /* PIC18F452 configuration words */
- 0x300001,
- 0x30000d,
- { { 0x27, 0, 0xff } /* 1 */ , { 0x0f, 0, 0xff } /* 2 */ , { 0x0f, 0, 0xff } /* 3 */ ,
- { -1, 0, 0xff } /* 4 */ , { 0x01, 0, 0xff } /* 5 */ , { 0x85, 0, 0xff } /* 6 */ ,
- { -1, 0, 0xff } /* 7 */ , { 0x0f, 0, 0xff } /* 8 */ , { 0xc0, 0, 0xff } /* 9 */ ,
- { 0x0f, 0, 0xff } /* a */ , { 0xe0, 0, 0xff } /* b */ , { 0x0f, 0, 0xff } /* c */ ,
- { 0x40, 0, 0xff } /* d */ }
- },
- { 0x200000, 0x200007,
- { { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
- { 0, 0 }, { 0, 0 }, { 0, 0 } }
- }
- },
- {
- {"p18f458", "18f458", "pic18f458", "f458"},
- 0,
- 0x600, /* 1536 */
- 0x60,
- 0,
- { 0xf00, 0xfff }, /* PIC18F458 range of SFR's */
- {
- /* PIC18F458 configuration words */
- 0x300001,
- 0x30000d,
- { { 0x27, 0, 0xff } /* 1 */ , { 0x0f, 0, 0xff } /* 2 */ , { 0x0f, 0, 0xff } /* 3 */ ,
- { -1, 0, 0xff } /* 4 */ , { -1, 0, 0xff } /* 5 */ , { 0x85, 0, 0xff } /* 6 */ ,
- { -1, 0, 0xff } /* 7 */ , { 0x0f, 0, 0xff } /* 8 */ , { 0xc0, 0, 0xff } /* 9 */ ,
- { 0x0f, 0, 0xff } /* a */ , { 0xe0, 0, 0xff } /* b */ , { 0x0f, 0, 0xff } /* c */ ,
- { 0x40, 0, 0xff } /* d */ }
- },
- { 0x200000, 0x200007,
- { { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
- { 0, 0 }, { 0, 0 }, { 0, 0 } }
- }
- },
- {
- {"p18f1220", "18f1220", "pic18f1220", "f1220"},
- 0,
- 0x100, /* 256 */
- 0x80,
- 0,
- { 0xf80, 0xfff }, /* PIC18F1220 range of SFR's */
- {
- /* PIC18F1220 configuration words */
- 0x300001,
- 0x30000d,
- { { 0xcf, 0, 0xff } /* 1 */ , { 0x0f, 0, 0xff } /* 2 */ , { 0x1f, 0, 0xff } /* 3 */ ,
- { -1, 0, 0xff } /* 4 */ , { 0x80, 0, 0xff } /* 5 */ , { 0x85, 0, 0xff } /* 6 */ ,
- { -1, 0, 0xff } /* 7 */ , { 0x03, 0, 0xff } /* 8 */ , { 0xc0, 0, 0xff } /* 9 */ ,
- { 0x03, 0, 0xff } /* a */ , { 0xe0, 0, 0xff } /* b */ , { 0x03, 0, 0xff } /* c */ ,
- { 0x40, 0, 0xff } /* d */ }
- },
- { 0x200000, 0x200007,
- { { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
- { 0, 0 }, { 0, 0 }, { 0, 0 } }
- }
- },
- {
- {"p18f2220", "18f2220", "pic18f2220", "f2220"},
- 0,
- 0x200, /* 512 */
- 0x80,
- 0,
- { 0xf80, 0xfff }, /* PIC18F2220 range of SFR's */
- {
- /* PIC18F2220 configuration words */
- 0x300001,
- 0x30000d,
- { { 0xcf, 0, 0xff } /* 1 */ , { 0x0f, 0, 0xff } /* 2 */ , { 0x1f, 0, 0xff } /* 3 */ ,
- { -1, 0, 0xff } /* 4 */ , { 0x83, 0, 0xff } /* 5 */ , { 0x85, 0, 0xff } /* 6 */ ,
- { -1, 0, 0xff } /* 7 */ , { 0x03, 0, 0xff } /* 8 */ , { 0xc0, 0, 0xff } /* 9 */ ,
- { 0x03, 0, 0xff } /* a */ , { 0xe0, 0, 0xff } /* b */ , { 0x03, 0, 0xff } /* c */ ,
- { 0x40, 0, 0xff } /* d */ }
- },
- { 0x200000, 0x200007,
- { { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
- { 0, 0 }, { 0, 0 }, { 0, 0 } }
- }
- },
- {
- {"p18f6520", "18f6520", "pic18f6520", "f6520"},
- 0,
- 0x800, /* 2048 */
- 0x60,
- 0,
- { 0xf6b, 0xfff }, /* PIC18F6520 range of SFR's */
- {
- /* PIC18F6520 configuration words */
- 0x300001,
- 0x30000d,
- { { 0x27, 0, 0xff } /* 1 */ , { 0x0f, 0, 0xff } /* 2 */ , { 0x0f, 0, 0xff } /* 3 */ ,
- { 0x80, 0, 0xff } /* 4 */ , { 0x88, 0, 0xff } /* 5 */ , { -1, 0, 0xff } /* 6 */ ,
- { -1, 0, 0xff } /* 7 */ , { 0x0f, 0, 0xff } /* 8 */ , { 0xc0, 0, 0xff } /* 9 */ ,
- { 0x0f, 0, 0xff } /* a */ , { 0xe0, 0, 0xff } /* b */ , { 0x0f, 0, 0xff } /* c */ ,
- { 0x40, 0, 0xff } /* d */ }
- },
- { 0x200000, 0x200007,
- { { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
- { 0, 0 }, { 0, 0 }, { 0, 0 } }
- }
- },
- {
- {"p18f6620", "18f6620", "pic18f6620", "f6620"},
- 0,
- 0xf00, /* 3840 */
- 0x60,
- 0,
- { 0xf6b, 0xfff }, /* PIC18F6620 range of SFR's */
- {
- /* PIC18F6620 configuration words */
- 0x300001,
- 0x30000d,
- { { 0x27, 0, 0xff } /* 1 */ , { 0x0f, 0, 0xff } /* 2 */ , { 0x0f, 0, 0xff } /* 3 */ ,
- { -1, 0, 0xff } /* 4 */ , { 0x01, 0, 0xff } /* 5 */ , { 0x85, 0, 0xff } /* 6 */ ,
- { -1, 0, 0xff } /* 7 */ , { 0x0f, 0, 0xff } /* 8 */ , { 0xc0, 0, 0xff } /* 9 */ ,
- { 0x0f, 0, 0xff } /* a */ , { 0xe0, 0, 0xff } /* b */ , { 0x0f, 0, 0xff } /* c */ ,
- { 0x40, 0, 0xff } /* d */ }
- },
- { 0x200000, 0x200007,
- { { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
- { 0, 0 }, { 0, 0 }, { 0, 0 } }
- }
- },
- {
- {"p18f6680", "18f6680", "pic18f6680", "f6680"},
- 0,
- 0xf00, /* 3840 */
- 0x60,
- 0,
- { 0xf00, 0xfff }, /* PIC18F6680 range of SFR's */
- {
- /* PIC18F6680 configuration words */
- 0x300001,
- 0x30000d,
- { { 0x2f, 0, 0xff } /* 1 */ , { 0x0f, 0, 0xff } /* 2 */ , { 0x1f, 0, 0xff } /* 3 */ ,
- { -1, 0, 0xff } /* 4 */ , { 0x83, 0, 0xff } /* 5 */ , { 0x85, 0, 0xff } /* 6 */ ,
- { -1, 0, 0xff } /* 7 */ , { 0x0f, 0, 0xff } /* 8 */ , { 0xc0, 0, 0xff } /* 9 */ ,
- { 0x0f, 0, 0xff } /* a */ , { 0xe0, 0, 0xff } /* b */ , { 0x0f, 0, 0xff } /* c */ ,
- { 0x40, 0, 0xff } /* d */ }
- },
- { 0x200000, 0x200007,
- { { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
- { 0, 0 }, { 0, 0 }, { 0, 0 } }
- }
- },
- {
- {"p18f6720", "18f6720", "pic18f6720", "f6720"},
- 0,
- 0xf00, /* 3840 */
- 0x60,
- 0,
- { 0xf6b, 0xfff }, /* PIC18F6720 range of SFR's */
- {
- /* PIC18F6720 configuration words */
- 0x300001,
- 0x30000d,
- { { 0x27, 0, 0xff } /* 1 */ , { 0x0f, 0, 0xff } /* 2 */ , { 0x0f, 0, 0xff } /* 3 */ ,
- { -1, 0, 0xff } /* 4 */ , { 0x01, 0, 0xff } /* 5 */ , { 0x85, 0, 0xff } /* 6 */ ,
- { -1, 0, 0xff } /* 7 */ , { 0xff, 0, 0xff } /* 8 */ , { 0xc0, 0, 0xff } /* 9 */ ,
- { 0xff, 0, 0xff } /* a */ , { 0xe0, 0, 0xff } /* b */ , { 0xff, 0, 0xff } /* c */ ,
- { 0x40, 0, 0xff } /* d */ }
- },
- { 0x200000, 0x200007,
- { { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
- { 0, 0 }, { 0, 0 }, { 0, 0 } }
- }
- },
- {
- {"p18f8520", "18f8520", "pic18f8520", "f8520"},
- 0,
- 0x800, /* 2048 */
- 0x60,
- 1,
- { 0xf6b, 0xfff }, /* PIC18F8520 range of SFR's */
- {
- /* PIC18F8520 configuration words */
- 0x300001,
- 0x30000d,
- { { 0x27, 0, 0xff } /* 1 */ , { 0x0f, 0, 0xff } /* 2 */ , { 0x0f, 0, 0xff } /* 3 */ ,
- { 0x83, 0, 0xff } /* 4 */ , { 0x88, 0, 0xff } /* 5 */ , { -1, 0, 0xff } /* 6 */ ,
- { -1, 0, 0xff } /* 7 */ , { 0x0f, 0, 0xff } /* 8 */ , { 0xc0, 0, 0xff } /* 9 */ ,
- { 0x0f, 0, 0xff } /* a */ , { 0xe0, 0, 0xff } /* b */ , { 0x0f, 0, 0xff } /* c */ ,
- { 0x40, 0, 0xff } /* d */ }
- },
- { 0x200000, 0x200007,
- { { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
- { 0, 0 }, { 0, 0 }, { 0, 0 } }
- }
- },
- {
- {"p18f8620", "18f8620", "pic18f8620", "f8620"},
- 0,
- 0xf00, /* 3840 */
- 0x60,
- 1,
- { 0xf6b, 0xfff }, /* PIC18F8620 range of SFR's */
- {
- /* PIC18F8620 configuration words */
- 0x300001,
- 0x30000d,
- { { 0x27, 0, 0xff } /* 1 */ , { 0x0f, 0, 0xff } /* 2 */ , { 0x0f, 0, 0xff } /* 3 */ ,
- { 0x83, 0, 0xff } /* 4 */ , { 0x01, 0, 0xff } /* 5 */ , { 0x85, 0, 0xff } /* 6 */ ,
- { -1, 0, 0xff } /* 7 */ , { 0x0f, 0, 0xff } /* 8 */ , { 0xc0, 0, 0xff } /* 9 */ ,
- { 0x0f, 0, 0xff } /* a */ , { 0xe0, 0, 0xff } /* b */ , { 0x0f, 0, 0xff } /* c */ ,
- { 0x40, 0, 0xff } /* d */ }
- },
- { 0x200000, 0x200007,
- { { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
- { 0, 0 }, { 0, 0 }, { 0, 0 } }
- }
- },
- {
- {"p18f8680", "18f8680", "pic18f8680", "f8680"},
- 0,
- 0xf00, /* 3840 */
- 0x60,
- 0,
- { 0xf00, 0xfff }, /* PIC18F8680 range of SFR's */
- {
- /* PIC18F8680 configuration words */
- 0x300001,
- 0x30000d,
- { { 0x2f, 0, 0xff } /* 1 */ , { 0x0f, 0, 0xff } /* 2 */ , { 0x1f, 0, 0xff } /* 3 */ ,
- { 0x83, 0, 0xff } /* 4 */ , { 0x83, 0, 0xff } /* 5 */ , { 0x85, 0, 0xff } /* 6 */ ,
- { -1, 0, 0xff } /* 7 */ , { 0x0f, 0, 0xff } /* 8 */ , { 0xc0, 0, 0xff } /* 9 */ ,
- { 0x0f, 0, 0xff } /* a */ , { 0xe0, 0, 0xff } /* b */ , { 0x0f, 0, 0xff } /* c */ ,
- { 0x40, 0, 0xff } /* d */ }
- },
- { 0x200000, 0x200007,
- { { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
- { 0, 0 }, { 0, 0 }, { 0, 0 } }
- }
- },
- {
- {"p18f8720", "18f8720", "pic18f8720", "f8720"},
- 0,
- 0xf00, /* 3840 */
- 0x60,
- 1,
- { 0xf6b, 0xfff }, /* PIC18F8720 range of SFR's */
- {
- /* PIC18F8720 configuration words */
- 0x300001,
- 0x30000d,
- { { 0x27, 0, 0xff } /* 1 */ , { 0x0f, 0, 0xff } /* 2 */ , { 0x0f, 0, 0xff } /* 3 */ ,
- { 0x83, 0, 0xff } /* 4 */ , { 0x01, 0, 0xff } /* 5 */ , { 0x85, 0, 0xff } /* 6 */ ,
- { -1, 0, 0xff } /* 7 */ , { 0xff, 0, 0xff } /* 8 */ , { 0xc0, 0, 0xff } /* 9 */ ,
- { 0xff, 0, 0xff } /* a */ , { 0xe0, 0, 0xff } /* b */ , { 0xff, 0, 0xff } /* c */ ,
- { 0x40, 0, 0xff } /* d */ }
- },
- { 0x200000, 0x200007,
- { { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
- { 0, 0 }, { 0, 0 }, { 0, 0 } }
- }
- }
-
+/* Device descriptions are now generated by scripts.
+ * For simplicities sake we just include them here.
+ * Manual overrides may be inserted on top of devices.inc
+ * or right here BEFORE inclusion of devices.inc. */
+#include "devices.inc"
};
static int num_of_supported_PICS = sizeof(Pics16)/sizeof(PIC16_device);
+stats_t statistics = { 0, 0, 0, 0 };
+
#define DEFAULT_PIC "452"
PIC16_device *pic16=NULL;
unsigned int stackPos = 0;
-
-extern regs* newReg(short type, short pc_type, int rIdx, char *name, int size, int alias, operand *refop);
+unsigned int stackLen = 0;
void pic16_setMaxRAM(int size)
{
}
+void pic16_dump_access(FILE *of, set *section)
+{
+ regs *r;
+
+ r = setFirstItem(section);
+ if(!r)return;
+
+ fprintf(of, "%s", iComments2);
+ fprintf(of, ";\tAccess bank symbols\n");
+ fprintf(of, "%s", iComments2);
+
+ fprintf(of, "\tudata_acs\n");
+ for(; r; r = setNextItem(section)) {
+ fprintf(of, "%s\tres\t%d\n", r->name, r->size);
+ statistics.adsize += r->size;
+ }
+}
+
+
int regCompare(const void *a, const void *b)
{
const regs *const *i = a;
void pic16_dump_usection(FILE *of, set *section, int fix)
{
static int abs_usection_no=0;
+ static unsigned int usection_no=0;
regs *r, *rprev;
- int init_addr, i;
+ unsigned int init_addr, i;
regs **rlist;
regs *r1;
/* put all symbols in an array */
+ if (!elementsInSet(section)) return;
rlist = Safe_calloc(elementsInSet(section), sizeof(regs *));
r = rlist[0]; i = 0;
for(rprev = setFirstItem(section); rprev; rprev = setNextItem(section)) {
}
if(!i) {
- if(rlist)free(rlist);
+ if(rlist)Safe_free(rlist);
return;
}
qsort(rlist, i /*elementsInSet(section)*/, sizeof(regs *), regCompare);
if(!fix) {
+
+#define EMIT_SINGLE_UDATA_SECTION 0
+#if EMIT_SINGLE_UDATA_SECTION
fprintf(of, "\n\n\tudata\n");
for(r = setFirstItem(section); r; r = setNextItem(section)) {
fprintf(of, "%s\tres\t%d\n", r->name, r->size);
+ statistics.udsize += r->size;
+ }
+#else
+ for(r = setFirstItem(section); r; r = setNextItem(section)) {
+ //fprintf(of, "\nudata_%s_%s\tudata\n", moduleName, r->name);
+ fprintf(of, "\nudata_%s_%u\tudata\n", moduleName, usection_no++);
+ fprintf(of, "%s\tres\t%d\n", r->name, r->size);
+ statistics.udsize += r->size;
}
+#endif
} else {
- int j=0;
+ unsigned int j=0;
int deb_addr=0;
rprev = NULL;
} else {
fprintf(of, "%s\tres\t%d\n", r->name, r->size);
deb_addr += r->size;
+ statistics.udsize += r->size;
}
rprev = r;
}
}
- free(rlist);
+ Safe_free(rlist);
}
void pic16_dump_gsection(FILE *of, set *sections)
sectName *sname;
for(sname = setFirstItem(sections); sname; sname = setNextItem(sections)) {
+ if(!strcmp(sname->name, "access"))continue;
fprintf(of, "\n\n%s\tudata\n", sname->name);
for(r=setFirstItem(sname->regsSet); r; r=setNextItem(sname->regsSet)) {
r->name, sname->name, sname);
#endif
fprintf(of, "%s\tres\t%d\n", r->name, r->size);
+ statistics.udsize += r->size;
}
}
}
{
static int abs_isection_no=0;
symbol *s, *sprev;
- int init_addr, i;
+ unsigned int init_addr, i;
symbol **slist;
/* put all symbols in an array */
+ if (!elementsInSet(section)) return;
slist = Safe_calloc(elementsInSet(section), sizeof(symbol *));
s = slist[0]; i = 0;
for(sprev = setFirstItem(section); sprev; sprev = setNextItem(section)) {
}
if(!i) {
- if(slist)free(slist);
+ if(slist)Safe_free(slist);
return;
}
}
} else {
- int j=0;
+ unsigned int j=0;
symbol *s1;
sprev = NULL;
sprev = s;
}
}
- free(slist);
+ Safe_free(slist);
}
regs **rlist;
/* put all symbols in an array */
+ if (!elementsInSet(section)) return;
rlist = Safe_calloc(elementsInSet(section), sizeof(regs *));
r = rlist[0]; i = 0;
for(rprev = setFirstItem(section); rprev; rprev = setNextItem(section)) {
qsort(rlist, elementsInSet(section), sizeof(regs *), regCompare);
if(!i) {
- if(rlist)free(rlist);
+ if(rlist)Safe_free(rlist);
return;
}
fprintf(of, "\n\n; Internal registers\n");
fprintf(of, "%s\tudata_ovr\t0x0000\n", ".registers");
- for(r = setFirstItem(section); r; r = setNextItem(section))
+ for(r = setFirstItem(section); r; r = setNextItem(section)) {
fprintf(of, "%s\tres\t%d\n", r->name, r->size);
+ statistics.intsize += r->size;
+ }
- free(rlist);
+ Safe_free(rlist);
}
#define _ENDIAN(x) (x)
#endif
-#define BYTE_IN_LONG(x,b) ((x>>(8*_ENDIAN(b)))&0xff)
-
/*-----------------------------------------------------------------*
* void pic16_list_valid_pics(int ncols, int list_alias)
return 0;
}
+int checkSym(set *set, symbol *sym)
+{
+ symbol *tmp;
+
+ if(!sym)return 0;
+
+#if DEUG_CHECK
+ fprintf(stderr, "%s: about to search for SYMbol: %s ... ", __FUNCTION__, sym->name);
+#endif
+
+ for(tmp = setFirstItem( set ); tmp; tmp = setNextItem( set )) {
+ if(!strcmp(tmp->name, sym->name))break;
+ }
+
+ if(!tmp) {
+#if DEBUG_CHECK
+ fprintf(stderr, "not found\n");
+#endif
+ return 0;
+ }
+
+#if DEBUG_CHECK
+ fprintf(stderr, "found\n");
+#endif
+
+ return 1;
+}
/*-----------------------------------------------------------------*
* void pic16_groupRegistersInSection - add each register to its *
continue;
#if 0
- fprintf(stderr, "%s:%d register %s alias:%d fix:%d ival=%i level=%i\n",
+ fprintf(stderr, "%s:%d register %s alias:%d fix:%d ival=%i level=%i code=%i\n",
__FILE__, __LINE__, reg->name, reg->alias, reg->isFixed,
(reg->regop?(OP_SYMBOL(reg->regop)->ival?1:0):-1),
- (reg->regop?(OP_SYMBOL(reg->regop)->level):-1) );
+ (reg->regop?(OP_SYMBOL(reg->regop)->level):-1),
+ (reg->regop?(IS_CODE(OP_SYM_ETYPE(reg->regop))):-1) );
#endif
docontinue=0;
if(!strcmp(ssym->name, reg->name)) {
// fprintf(stderr, "%s:%d section found %s (%p) with var %s\n",
// __FILE__, __LINE__, ssym->section->name, ssym->section, ssym->name);
- addSet(&ssym->section->regsSet, reg);
- docontinue=1;
+ if(strcmp(ssym->section->name, "access")) {
+ addSet(&ssym->section->regsSet, reg);
+ docontinue=1;
+ break;
+ } else {
+ docontinue=0;
+ reg->accessBank = 1;
+ break;
+ }
}
}
if(!reg->isFixed) {
if(reg->pc_type == PO_GPR_TEMP)
checkAddReg(&pic16_int_regs, reg);
- else
- checkAddReg(&pic16_rel_udata, reg);
+ else {
+ if(reg->accessBank) {
+ if(reg->alias != 0x40)
+ checkAddReg(&pic16_acs_udata, reg);
+ } else
+ checkAddReg(&pic16_rel_udata, reg);
+ }
}
}
}
* This routine will assign a value to that address.
*
*-----------------------------------------------------------------*/
-void pic16_assignConfigWordValue(int address, int value)
+void pic16_assignConfigWordValue(int address, unsigned int value)
{
int i;
for(i=0;i<pic16->cwInfo.confAddrEnd-pic16->cwInfo.confAddrStart+1;i++) {
if((address == pic16->cwInfo.confAddrStart+i)
&& (pic16->cwInfo.crInfo[i].mask != -1)) {
-// fprintf(stderr, "setting location 0x%X to value 0x%x\n", /*address*/ pic16->cwInfo.confAddrStart+i, val
+
+#if 0
+ fprintf(stderr, "setting location 0x%X to value 0x%x\tmask: 0x%x\ttest: 0x%x\n",
+ /*address*/ pic16->cwInfo.confAddrStart+i, (~value)&0xff,
+ pic16->cwInfo.crInfo[i].mask,
+ (pic16->cwInfo.crInfo[i].mask) & (~value));
+#endif
+
+#if 0
+ if((((pic16->cwInfo.crInfo[i].mask) & (~value))&0xff) != ((~value)&0xff)) {
+ fprintf(stderr, "%s:%d a wrong value has been given for configuration register 0x%x\n",
+ __FILE__, __LINE__, address);
+ return;
+ }
+#endif
+
pic16->cwInfo.crInfo[i].value = value;
pic16->cwInfo.crInfo[i].emit = 1;
return;