From e8d1fbc89c14abed3c96e00405b613df3b95eef3 Mon Sep 17 00:00:00 2001 From: epetrich Date: Wed, 26 Jan 2005 14:20:13 +0000 Subject: [PATCH] * src/z80/gen.c (aopPut): fixed bug #1103902 git-svn-id: https://sdcc.svn.sourceforge.net/svnroot/sdcc/trunk/sdcc@3656 4a8a32a2-be11-0410-ad9d-d568d2c75423 --- ChangeLog | 4 +++ src/z80/gen.c | 74 +++++++++++++++++++++++++-------------------------- 2 files changed, 40 insertions(+), 38 deletions(-) diff --git a/ChangeLog b/ChangeLog index 68bae6e5..dbc95f60 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,7 @@ +2004-01-26 Erik Petrich + + * src/z80/gen.c (aopPut): fixed bug #1103902 + 2004-01-25 Erik Petrich * device/lib/expf.c: fixed bug #1095792 diff --git a/src/z80/gen.c b/src/z80/gen.c index 97776615..88324bab 100644 --- a/src/z80/gen.c +++ b/src/z80/gen.c @@ -1879,48 +1879,46 @@ aopPut (asmop * aop, const char *s, int offset) case AOP_SFR: if( IS_GB ) - { - // wassert (IS_GB); - if (strcmp (s, "a")) - emit2 ("ld a,%s", s); - emit2 ("ldh (%s+%d),a", aop->aopu.aop_dir, offset); - } + { + // wassert (IS_GB); + if (strcmp (s, "a")) + emit2 ("ld a,%s", s); + emit2 ("ldh (%s+%d),a", aop->aopu.aop_dir, offset); + } else - { /*.p.t.20030716 handling for i/o port read access for Z80 */ - if( aop->paged ) - { /* banked mode */ - if( aop->bcInUse ) emit2( "push bc" ); - - emit2( "ld bc,#%s", aop->aopu.aop_dir ); - - if(( s[0] == '#' ) /* immediate number */ - ||( s[0] == '(' ) /* indirect register (ix or iy ??)*/ - ||( isdigit( s[0] )))/* indirect register with offset (ix or iy ??)*/ - { - emit2( "ld a,%s", s ); - emit2( "out (c),a" ); - } - else - { - emit2( "out (c),%s", s ); - } + { /*.p.t.20030716 handling for i/o port read access for Z80 */ + if (aop->paged) + { /* banked mode */ + if (aop->bcInUse) + emit2( "push bc" ); + + if (strlen(s) != 1 + || (s[0] != 'a' && s[0] != 'd' && s[0] != 'e' + && s[0] != 'h' && s[0] != 'l')) + { + emit2( "ld a,%s", s ); + s = "a"; + } + + emit2( "ld bc,#%s", aop->aopu.aop_dir ); + emit2( "out (c),%s", s ); - if( aop->bcInUse ) - emit2( "pop bc" ); + if( aop->bcInUse ) + emit2( "pop bc" ); + else + spillPair (PAIR_BC); + } + else if( z80_opts.port_mode == 180 ) + { /* z180 in0/out0 mode */ + emit2( "ld a,%s", s ); + emit2( "out0 (%s),a", aop->aopu.aop_dir ); + } else - spillPair (PAIR_BC); - } - else if( z80_opts.port_mode == 180 ) - { /* z180 in0/out0 mode */ - emit2( "ld a,%s", s ); - emit2( "out0 (%s),a", aop->aopu.aop_dir ); - } - else - { /* 8 bit mode */ - emit2( "ld a,%s", s ); - emit2( "out (%s),a", aop->aopu.aop_dir ); + { /* 8 bit mode */ + emit2( "ld a,%s", s ); + emit2( "out (%s),a", aop->aopu.aop_dir ); + } } - } break; case AOP_REG: -- 2.30.2