Hi,
i think i found two bugs in the z80 port:
buggy.c:
__sfr __banked __at 0xf500 SPI_PORT_IN;
struct {
unsigned char SDHC : 1;
unsigned char FAT32 : 1;
} SDFlags;
int main () {
SDFlags.SDHC = (SPI_PORT_IN & 0x40) ? 1 : 0;
return(SDFlags.SDHC);
}
compiles to:
53 ;buggy.c:9: SDFlags.SDHC = (SPI_PORT_IN
& 0x40) ? 1 : 0;
0000 3E F5 [ 7] 54 ld a,#>(_SPI_PORT_IN)
0002 DB 00 [11] 55 in a,(#<(_SPI_PORT_IN))
SPI_PORT_IN should be:
ld bc,#SPI_PORT_IN
in a,(c)
0004 E6 40 [ 7] 56 and a, #0x40
0006 21r00r00 [10] 57 ld hl,#_SDFlags
0009 E6 01 [ 7] 58 and a,#0x01
What is this? It makes "a" broken.
000B 4F [ 4] 59 ld c,a
000C 7E [ 7] 60 ld a,(hl)
000D E6 FE [ 7] 61 and a,#0xFE
000F B1 [ 4] 62 or a,c
0010 77 [ 7] 63 ld (hl),a
I think, it should be:
ld hl,#_SDFlags
ld c,a
ld a,(hl)
bit 6,c
jr z,zero
or a,#0x01
jr save
zero: and a,#0xFE
save: ld (hl),a
(or so...)
SDCC :
mcs51/z80/z180/r2k/r3ka/gbz80/tlcs90/ds390/TININative/ds400/hc08/s08/st
m8 3.5.0 #9253 (Mar 19 2016) (Linux)
published under GNU General Public License (GPL)
# sdcc -mz80 buggy.c
I also testet with the latest snapshot, same behaviour.
Regards
Klaus
_______________________________________________
Sdcc-user mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/sdcc-user