Menu

#3639 Backport "ldp" implementation from asrab 5.40

closed-fixed
None
sdas
5
2023-08-29
2023-08-27
D-mo
No
From 7aad38f64adfc334ddb001c97d827317d6a1c3a2 Mon Sep 17 00:00:00 2001
From: Dimitry Ishenko <dimitry.ishenko@gmail.com>
Date: Fri, 25 Aug 2023 23:00:54 -0400
Subject: [PATCH] [asrab] Back-port implementation of LDP from asrab 5.40

---
 sdas/asrab/rab.h    |  2 +-
 sdas/asrab/rabmch.c | 75 +++++++++++++++++++++++++++++++++++++++++++++
 sdas/asrab/rabpst.c |  1 +
 3 files changed, 77 insertions(+), 1 deletion(-)

diff --git a/sdas/asrab/rab.h b/sdas/asrab/rab.h
index 9d6d1e96..d4b2c902 100644
--- a/sdas/asrab/rab.h
+++ b/sdas/asrab/rab.h
@@ -202,7 +202,7 @@
 #define X_LJP                97
 #define X_LCALL              98
 #define X_BOOL               99
-
+#define X_LDP               100
 #define X_R3K_MODE          101
 #define R3K_INH1            102
 #define R3K_INH2            103
diff --git a/sdas/asrab/rabmch.c b/sdas/asrab/rabmch.c
index 925d8776..6f8b5f49 100644
--- a/sdas/asrab/rabmch.c
+++ b/sdas/asrab/rabmch.c
@@ -1069,6 +1069,81 @@ VOID  machine(struct mne * mp)
                 aerr( );
                 break;


+        case X_LDP:
+                t1 = addr(&e1);
+                v1 = (int) e1.e_addr;
+                comma(1);
+                t2 = addr(&e2);
+                v2 = (int) e2.e_addr;
+                /* LDP (mn), HL|IX|IY */
+                if ((t1 == S_INDM) && (t2 == S_R16)) {
+                        if ((v2 != HL) && (v2 != IX) && (v2 != IY)) {
+                                aerr();
+                                break;
+                        }
+                        if (v2 == HL) {
+                                outab(0xED);
+                        } else {
+                                gixiy(v2);
+                        }
+                        outab(op | 0x01);
+                        outrw(&e1, 0);
+                        break;
+                }
+                /* LDP HL|IX|IY, (mn) */
+                if ((t1 == S_R16) && (t2 == S_INDM)) {
+                        if ((v1 != HL) && (v1 != IX) && (v1 != IY)) {
+                                aerr();
+                                break;
+                        }
+                        if (v1 == HL) {
+                                outab(0xED);
+                        } else {
+                                gixiy(v1);
+                        }
+                        outab(op | 0x09);
+                        outrw(&e2, 0);
+                        break;
+                }
+                /* LDP (HL|IX|IY), HL */
+                if ((t2 == S_R16) && (v2 == HL)) {
+                        if ((t1 != S_IDHL) && (t1 != S_IDIX) && (t1 != S_IDIY)) {
+                                aerr();
+                                break;
+                        }
+                        if ((e1.e_base.e_ap != NULL) || (v1 != 0)) {
+                                aerr();
+                                break;
+                        }
+                        if (t1 == S_IDHL) {
+                                outab(0xED);
+                        } else {
+                                gixiy(t1);
+                        }
+                        outab(op);
+                        break;
+                }
+                /* LDP HL, (HL|IX|IY) */
+                if ((t1 == S_R16) && (v1 == HL)) {
+                        if ((t2 != S_IDHL) && (t2 != S_IDIX) && (t2 != S_IDIY)) {
+                                aerr();
+                                break;
+                        }
+                        if ((e2.e_base.e_ap != NULL) || (v2 != 0)) {
+                                aerr();
+                                break;
+                        }
+                        if (t2 == S_IDHL) {
+                                outab(0xED);
+                        } else {
+                                gixiy(t2);
+                        }
+                        outab(op | 0x08);
+                        break;
+                }
+                aerr();
+                break;
+
         case R3K_INH1:
                 if (!(r3k_mode || r4k_mode))
                         err('o');
diff --git a/sdas/asrab/rabpst.c b/sdas/asrab/rabpst.c
index 6f2a2c8f..354ecb90 100644
--- a/sdas/asrab/rabpst.c
+++ b/sdas/asrab/rabpst.c
@@ -268,6 +268,7 @@ struct  mne     mne[] = {
     {   NULL,   "lcall",        X_LCALL,        0,      0xCF    },
     {   NULL,   "lret",         S_INH2,         0,      0x45    },
     {   NULL,   "bool",         X_BOOL,         0,      0xCC    },
+    {   NULL,   "ldp",          X_LDP,          0,      0x64    },
     {   NULL,   "syscall",      R4K_INH2,       0,      0x75    },
     {   NULL,   "sysret",       R4K_INH2,       0,      0x83    },
     {   NULL,   "mulu",         X_R4K_MULU,     S_EOL,  0xA7    }
-- 
2.39.2
1 Attachments

Related

Patches: #473
Wiki: NGI0-Entrust-SDCC

Discussion

  • D-mo

    D-mo - 2023-08-27

    Test program:

    void main()
    {
    __asm
        ldp hl,(hl)         ; ED 6C
        ldp hl,(ix)         ; DD 6C
        ldp hl,(iy)         ; FD 6C
    
        ldp hl,(0x1234)     ; ED 6D 34 12
        ldp ix,(0x5678)     ; DD 6D 78 56
        ldp iy,(0x9abc)     ; FD 6D BC 9A
    
        ldp (hl),hl         ; ED 64
        ldp (ix),hl         ; DD 64
        ldp (iy),hl         ; FD 64
    
        ldp (0x1234),hl     ; ED 65 34 12
        ldp (0x5678),ix     ; DD 65 78 56
        ldp (0x9abc),iy     ; FD 65 BC 9A
    __endasm;
    }
    

    sdcc command:

    sdcc -mr3ka main.c
    
     
  • D-mo

    D-mo - 2023-08-27

    LDP is another Rabbit 2000/3000/4000/5000 instruction that's hasn't been implemented in asrab.

     
  • Philipp Klaus Krause

    • assigned_to: Philipp Klaus Krause
     
  • Philipp Klaus Krause

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

    Thanks. Fixed in [r14335] by applying your patch. I also added a regression test.

     

    Related

    Commit: [r14335]

  • D-mo

    D-mo - 2023-08-29

    Thanks for accepting all my patches.

     

Log in to post a comment.

MongoDB Logo MongoDB