Menu

#3636 Several Rabbit 2000/3000 instructions not implemented

closed-fixed
None
sdas
5
2023-08-26
2023-08-24
D-mo
No

The following sample generates errors for each assembly line even though these are valid Rabbit 2000/3000 instructions:

void main()
{
__asm
    ex bc', hl  ; opcode ED 74
    ex de', hl  ; opcode E3
    ex jk', hl  ; opcode ED 7C

    ld bc', bc  ; opcode ED 49
    ld de', bc  ; opcode ED 59
    ld hl', bc  ; opcode ED 69

    ld bc', de  ; opcode ED 41
    ld de', de  ; opcode ED 51
    ld hl', de  ; opcode ED 61
__endasm;
}

The above is compiled with:

user@linux:~/digi/$ sdcc -mr3ka test.c 
test.c:4:10: warning: missing terminating ' character
test.c:5:10: warning: missing terminating ' character
test.c:6:10: warning: missing terminating ' character
test.c:8:10: warning: missing terminating ' character
test.c:9:10: warning: missing terminating ' character
test.c:10:10: warning: missing terminating ' character
test.c:12:10: warning: missing terminating ' character
test.c:13:10: warning: missing terminating ' character
test.c:14:10: warning: missing terminating ' character
test.asm:50: Error: <q> missing or improper operators, terminators, or delimiters
test.asm:51: Error: <q> missing or improper operators, terminators, or delimiters
test.asm:52: Error: <q> missing or improper operators, terminators, or delimiters
test.asm:53: Error: <q> missing or improper operators, terminators, or delimiters
test.asm:54: Error: <q> missing or improper operators, terminators, or delimiters
test.asm:55: Error: <q> missing or improper operators, terminators, or delimiters
test.asm:56: Error: <q> missing or improper operators, terminators, or delimiters
test.asm:57: Error: <q> missing or improper operators, terminators, or delimiters
test.asm:58: Error: <q> missing or improper operators, terminators, or delimiters
removing test.rel

sdcc version is 4.2.0 (comes with Ubuntu 23.04).

2 Attachments

Related

Wiki: NGI0-Entrust-SDCC

Discussion

  • D-mo

    D-mo - 2023-08-24

    Here is the link to the instruction reference:

    https://ftp1.digi.com/support/documentation/0190098_l.pdf

     
  • Daniel Drotos

    Daniel Drotos - 2023-08-24

    Following opcodes:

         ex bc', hl  ; opcode ED 74
         ex jk', hl  ; opcode ED 7C
    

    are valid in 4000, 5000 only.

     
  • D-mo

    D-mo - 2023-08-24

    Sorry, I got carried away a bit. You are right, those two instructions are for 4000/5000 only. The rest should be supported on 2000/3000.

     
  • D-mo

    D-mo - 2023-08-25

    This seems to do the trick for me:

    From f99fb705de694f3941098f681d045f54923724d7 Mon Sep 17 00:00:00 2001
    From: Dimitry Ishenko <dimitry.ishenko@gmail.com>
    Date: Fri, 25 Aug 2023 12:15:16 -0400
    Subject: [PATCH] [asrab] Add support for alternate registers
    
    Specifically, this adds support for the following instructions:
    
    
        * ex bc', hl (Rabbit 4000 mode)
        * ex de', hl
        * ld bc', bc
        * ld de', bc
        * ld hl', bc
        * ld bc', de
        * ld de', de
        * ld hl', de
    ---
     sdas/asrab/rab.h    |  3 ++-
     sdas/asrab/rabadr.c | 10 ++++++++++
     sdas/asrab/rabmch.c | 22 ++++++++++++++++++++++
     3 files changed, 34 insertions(+), 1 deletion(-)
    
    diff --git a/sdas/asrab/rab.h b/sdas/asrab/rab.h
    index 02846158..9d6d1e96 100644
    --- a/sdas/asrab/rab.h
    +++ b/sdas/asrab/rab.h
    @@ -123,7 +123,7 @@
     #define S_R8X           32
    
     #define S_R16           34
    -
    +#define S_R16_ALT       35
     #define S_CND           36
     #define S_FLAG          37
    
    @@ -228,6 +228,7 @@ extern  struct  adsym   R8[];
     extern  struct  adsym   R8X[];
     extern  struct  adsym   R8IP[];
     extern  struct  adsym   R16[];
    +extern  struct  adsym   R16_ALT[];
     extern  struct  adsym   R16AF[];
     extern  struct  adsym   R16AF_ALT[];
    
    diff --git a/sdas/asrab/rabadr.c b/sdas/asrab/rabadr.c
    index 295751d6..041b8640 100644
    --- a/sdas/asrab/rabadr.c
    +++ b/sdas/asrab/rabadr.c
    @@ -136,6 +136,9 @@ struct expr *esp;
                     if ((indx = admode(R16AF)) != 0) {
                             mode = S_R16AF;
                     } else
    
    +                if ((indx = admode(R16_ALT)) != 0) {
    +                        mode = S_R16_ALT;
    +                } else
                     if ((indx = admode(R16)) != 0) {
                             mode = S_R16;
                     } else
    @@ -270,6 +273,13 @@ struct  adsym   R16[] = {
         {   "",     0000    }
     };
    
    +struct  adsym   R16_ALT[] = {
    
    +    {   "bc'",  BC|0400 },
    +    {   "de'",  DE|0400 },
    +    {   "hl'",  HL|0400 },
    +    {   "",     0000 }
    +};
    +
     struct  adsym   R16AF[] = {
         {   "af",   AF|0400 },
         {   "",     0000    }
    diff --git a/sdas/asrab/rabmch.c b/sdas/asrab/rabmch.c
    index 0ab5dd43..1ca6e39b 100644
    --- a/sdas/asrab/rabmch.c
    +++ b/sdas/asrab/rabmch.c
    @@ -719,6 +719,15 @@ VOID  machine(struct mne * mp)
                             outab(0x9F);
                             break;
                     }
    +
    +                if ((t1 == S_R16_ALT) && (t2 == S_R16)) {
    +                        if ((v2 == BC) || (v2 == DE)) {
    +                                /* LD BC'|DE'|HL', BC|DE */
    +                                outab(0xED);
    +                                outab((v2==BC?0x49:0x41) + 0x10*v1);
    +                                break;
    +                        }
    +                }
    
                     /* 16-bit operations valid only in rabbit 4000 mode */
                     if (r4k_mode && (t1 == S_R16) && (t2 == S_R16)) {
    @@ -805,6 +814,19 @@ VOID  machine(struct mne * mp)
                                             break;
                                     }
                             }
    
    +                        else if (t1 == S_R16_ALT) {
    +                                if ((v1 == DE) && (v2 == HL)) {
    +                                        /* EX DE', HL */
    +                                        outab(0xE3);
    +                                        break;
    +                                }
    +                                if (r4k_mode && (v1==BC) && (v2==HL)) {
    +                                        /* EX BC', HL */
    +                                        outab(0xED);
    +                                        outab(0x74);
    +                                        break;
    +                                }
    +                        }
    
                             if ((t1 == S_IDSP) && (v1 == 0)) {
                                     /* 0xE3 is EX DE',HL on rabbit 2000 
    -- 
    2.39.2
    
     
  • D-mo

    D-mo - 2023-08-25

    Here is new and improved (and now asbestos-free) version of the patch that uses "|" and "<<" operations instead of "+" and "*":

    From c2db1c48d5e7652f27b8c22276168fd1eb9d9935 Mon Sep 17 00:00:00 2001
    From: Dimitry Ishenko <dimitry.ishenko@gmail.com>
    Date: Fri, 25 Aug 2023 12:15:16 -0400
    Subject: [PATCH] [asrab] Add support for alternate registers
    
    Specifically, this adds support for the following instructions:
    
    
        * ex bc', hl (Rabbit 4000 mode)
        * ex de', hl
        * ld bc', bc
        * ld de', bc
        * ld hl', bc
        * ld bc', de
        * ld de', de
        * ld hl', de
    ---
     sdas/asrab/rab.h    |  3 ++-
     sdas/asrab/rabadr.c | 10 ++++++++++
     sdas/asrab/rabmch.c | 22 ++++++++++++++++++++++
     3 files changed, 34 insertions(+), 1 deletion(-)
    
    diff --git a/sdas/asrab/rab.h b/sdas/asrab/rab.h
    index 02846158..9d6d1e96 100644
    --- a/sdas/asrab/rab.h
    +++ b/sdas/asrab/rab.h
    @@ -123,7 +123,7 @@
     #define S_R8X           32
    
     #define S_R16           34
    -
    +#define S_R16_ALT       35
     #define S_CND           36
     #define S_FLAG          37
    
    @@ -228,6 +228,7 @@ extern  struct  adsym   R8[];
     extern  struct  adsym   R8X[];
     extern  struct  adsym   R8IP[];
     extern  struct  adsym   R16[];
    +extern  struct  adsym   R16_ALT[];
     extern  struct  adsym   R16AF[];
     extern  struct  adsym   R16AF_ALT[];
    
    diff --git a/sdas/asrab/rabadr.c b/sdas/asrab/rabadr.c
    index 295751d6..041b8640 100644
    --- a/sdas/asrab/rabadr.c
    +++ b/sdas/asrab/rabadr.c
    @@ -136,6 +136,9 @@ struct expr *esp;
                     if ((indx = admode(R16AF)) != 0) {
                             mode = S_R16AF;
                     } else
    
    +                if ((indx = admode(R16_ALT)) != 0) {
    +                        mode = S_R16_ALT;
    +                } else
                     if ((indx = admode(R16)) != 0) {
                             mode = S_R16;
                     } else
    @@ -270,6 +273,13 @@ struct  adsym   R16[] = {
         {   "",     0000    }
     };
    
    +struct  adsym   R16_ALT[] = {
    
    +    {   "bc'",  BC|0400 },
    +    {   "de'",  DE|0400 },
    +    {   "hl'",  HL|0400 },
    +    {   "",     0000 }
    +};
    +
     struct  adsym   R16AF[] = {
         {   "af",   AF|0400 },
         {   "",     0000    }
    diff --git a/sdas/asrab/rabmch.c b/sdas/asrab/rabmch.c
    index 0ab5dd43..925d8776 100644
    --- a/sdas/asrab/rabmch.c
    +++ b/sdas/asrab/rabmch.c
    @@ -719,6 +719,15 @@ VOID  machine(struct mne * mp)
                             outab(0x9F);
                             break;
                     }
    +
    +                if ((t1 == S_R16_ALT) && (t2 == S_R16)) {
    +                        if ((v2 == BC) || (v2 == DE)) {
    +                                /* LD BC'|DE'|HL', BC|DE */
    +                                outab(0xED);
    +                                outab(((v2 == BC) ? 0x49 : 0x41) | (v1 << 4));
    +                                break;
    +                        }
    +                }
    
                     /* 16-bit operations valid only in rabbit 4000 mode */
                     if (r4k_mode && (t1 == S_R16) && (t2 == S_R16)) {
    @@ -805,6 +814,19 @@ VOID  machine(struct mne * mp)
                                             break;
                                     }
                             }
    
    +                        else if (t1 == S_R16_ALT) {
    +                                if ((v1 == DE) && (v2 == HL)) {
    +                                        /* EX DE', HL */
    +                                        outab(0xE3);
    +                                        break;
    +                                }
    +                                if (r4k_mode && (v1==BC) && (v2==HL)) {
    +                                        /* EX BC', HL */
    +                                        outab(0xED);
    +                                        outab(0x74);
    +                                        break;
    +                                }
    +                        }
    
                             if ((t1 == S_IDSP) && (v1 == 0)) {
                                     /* 0xE3 is EX DE',HL on rabbit 2000 
    -- 
    2.39.2
    
     

    Last edit: D-mo 2023-08-25
  • Philipp Klaus Krause

    • assigned_to: Philipp Klaus Krause
    • Category: other --> sdas
     
  • Philipp Klaus Krause

    • status: open --> closed-fixed
     
  • Philipp Klaus Krause

    Fixed in [r14321] via your patch. I also added a regression tst.

     

    Related

    Commit: [r14321]


Log in to post a comment.

MongoDB Logo MongoDB