I am having a problem where the listing file that is generated at compile time (which is correct) is different from the mixed view disassembly that I see while debugging. Unfortunately, the version I see during debugging is buggy. I have global optimizations turned off, and am using Codewarrior 7.1.2.
Original source code
TJ_MAINON_IN is mapped to MCF_GPIO_PORTTJ_PORTTJ4
TJ_AUXON_IN is mapped to MCF_GPIO_PORTTJ_PORTTJ3
TJ_LINEON_IN is mapped to MCF_GPIO_PORTTJ_PORTTJ5
// ON signals
if (!(MCF_GPIO_SETTJ & TJ_MAINON_IN)) result |= gHAL_DI_MAIN_ON;
if (!(MCF_GPIO_SETTJ & TJ_AUXON_IN)) result |= gHAL_DI_AUX_ON;
if (!(MCF_GPIO_SETTJ & TJ_LINEON_IN)) result |= gHAL_DI_LINE_ON;
Listing generated from Codewarrior compiler. This is correct
; 72: if (!(MCF_GPIO_SETTJ & TJ_MAINON_IN))
;
0x0000007C 0x7000 moveq #0,d0
0x0000007E 0x103940100036 move.b 0x40100036,d0
0x00000084 0x08000004 btst #4,d0
0x00000088 0x660E bne.s *+16 ; 0x00000098
;
; 72: result |= gHAL_DI_MAIN_ON;
;
0x0000008A 0x7000 moveq #0,d0
0x0000008C 0x302EFFFC move.w -4(a6),d0
0x00000090 0x08C00004 bset #4,d0
0x00000094 0x3D40FFFC move.w d0,-4(a6)
;
; 73: if (!(MCF_GPIO_SETTJ & TJ_AUXON_IN))
;
0x00000098 0x7000 moveq #0,d0
0x0000009A 0x103940100036 move.b 0x40100036,d0
0x000000A0 0x08000003 btst #3,d0
0x000000A4 0x660E bne.s *+16 ; 0x000000b4
;
; 73: result |= gHAL_DI_AUX_ON;
;
0x000000A6 0x7000 moveq #0,d0
0x000000A8 0x302EFFFC move.w -4(a6),d0
0x000000AC 0x08C00005 bset #5,d0
0x000000B0 0x3D40FFFC move.w d0,-4(a6)
;
; 74: if (!(MCF_GPIO_SETTJ & TJ_LINEON_IN))
;
0x000000B4 0x7000 moveq #0,d0
0x000000B6 0x103940100036 move.b 0x40100036,d0
0x000000BC 0x08000005 btst #5,d0
0x000000C0 0x660E bne.s *+16 ; 0x000000d0
;
; 74: result |= gHAL_DI_LINE_ON;
;
0x000000C2 0x7000 moveq #0,d0
0x000000C4 0x302EFFFC move.w -4(a6),d0
0x000000C8 0x08C00006 bset #6,d0
0x000000CC 0x3D40FFFC move.w d0,-4(a6)
Mixed output from Codewarrior Debugger. The code for the first two sections is correct, but the code for the TJ_LINEON_IN section is not.
Please note how it does a btst #6,d0, instead of a btst #5,d0 as it does above.
// ON signals
if (!(MCF_GPIO_SETTJ & TJ_MAINON_IN)) result |= gHAL_DI_MAIN_ON;
00003816: 7000 moveq #0,d0
00003818: 103940100036 move.b 0x40100036 (0x40100036),d0
0000381E: 08000004 btst #4,d0
00003822: 660E bne.s gHAL_DI_read_all+0x98 (0x3832); 0x00003832
00003824: 7000 moveq #0,d0
00003826: 302EFFFC move.w -4(a6),d0
0000382A: 08C00004 bset #4,d0
0000382E: 3D40FFFC move.w d0,-4(a6)
if (!(MCF_GPIO_SETTJ & TJ_AUXON_IN)) result |= gHAL_DI_AUX_ON;
00003832: 7000 moveq #0,d0
00003834: 103940100036 move.b 0x40100036 (0x40100036),d0
0000383A: 08000003 btst #3,d0
0000383E: 660E bne.s gHAL_DI_read_all+0xb4 (0x384e); 0x0000384e
00003840: 7000 moveq #0,d0
00003842: 302EFFFC move.w -4(a6),d0
00003846: 08C00005 bset #5,d0
0000384A: 3D40FFFC move.w d0,-4(a6)
if (!(MCF_GPIO_SETTJ & TJ_LINEON_IN)) result |= gHAL_DI_LINE_ON;
0000384E: 7000 moveq #0,d0
00003850: 103940100036 move.b 0x40100036 (0x40100036),d0
00003856: 08000006 btst #6,d0
0000385A: 660E bne.s gHAL_DI_read_all+0xd0 (0x386a); 0x0000386a
0000385C: 7000 moveq #0,d0
0000385E: 302EFFFC move.w -4(a6),d0
00003862: 08C00006 bset #6,d0
00003866: 3D40FFFC move.w d0,-4(a6)
Finally, I did an experiment where I tried using explicit pin definitions. Since the first two sections are correct, I have removed them for clarity. I tried using all 4 of the upper bits for port TJ, but each time the debugger disassembly showed it using pin 6, instead of the desired pin.
if (!(MCF_GPIO_SETTJ & 0x20) ) result |= gHAL_DI_LINE_ON;
0000384E: 7000 moveq #0,d0
00003850: 103940100036 move.b 0x40100036 (0x40100036),d0
00003856: 08000006 btst #6,d0
0000385A: 660E bne.s gHAL_DI_read_all+0xd0 (0x386a); 0x0000386a
0000385C: 7000 moveq #0,d0
0000385E: 302EFFFC move.w -4(a6),d0
00003862: 08C00006 bset #6,d0
00003866: 3D40FFFC move.w d0,-4(a6)
if (!(MCF_GPIO_SETTJ & 0x10) ) result |= gHAL_DI_LINE_ON;
0000384E: 7000 moveq #0,d0
00003850: 103940100036 move.b 0x40100036 (0x40100036),d0
00003856: 08000006 btst #6,d0
0000385A: 660E bne.s gHAL_DI_read_all+0xd0 (0x386a); 0x0000386a
0000385C: 7000 moveq #0,d0
0000385E: 302EFFFC move.w -4(a6),d0
00003862: 08C00006 bset #6,d0
00003866: 3D40FFFC move.w d0,-4(a6)
if (!(MCF_GPIO_SETTJ & 0x80) ) result |= gHAL_DI_LINE_ON;
0000384E: 7000 moveq #0,d0
00003850: 103940100036 move.b 0x40100036 (0x40100036),d0
00003856: 08000006 btst #6,d0
0000385A: 660E bne.s gHAL_DI_read_all+0xd0 (0x386a); 0x0000386a
0000385C: 7000 moveq #0,d0
0000385E: 302EFFFC move.w -4(a6),d0
00003862: 08C00006 bset #6,d0
00003866: 3D40FFFC move.w d0,-4(a6)
if (!(MCF_GPIO_SETTJ & 0x40) ) result |= gHAL_DI_LINE_ON;
0000384E: 7000 moveq #0,d0
00003850: 103940100036 move.b 0x40100036 (0x40100036),d0
00003856: 08000006 btst #6,d0
0000385A: 660E bne.s gHAL_DI_read_all+0xd0 (0x386a); 0x0000386a
0000385C: 7000 moveq #0,d0
0000385E: 302EFFFC move.w -4(a6),d0
00003862: 08C00006 bset #6,d0
00003866: 3D40FFFC move.w d0,-4(a6)
I have submitted an official help request, but I thought I would ask here too to see if anybody had any ideas.
Thank you.