$NetBSD$

--- cpu.c.orig	1994-06-22 16:24:50.000000000 +0200
+++ cpu.c
@@ -253,7 +253,7 @@ static INLINE2 void i_ ## name ## _axd16
 
 
 #define JumpCond(name, cond) \
-static INLINE2 void i_j ## name ## (void) \
+static INLINE2 void i_j ## name (void) \
 { \
       register int tmp = (int)((INT8)GetMemInc(c_cs,ip)); \
       if (cond) ip = (WORD)(ip+tmp); \
@@ -1127,6 +1127,7 @@ static INLINE2 void i_es(void)
 
 static INLINE2 void i_daa(void)
 {
+    /* Opcode 0x27 */
     if (AF || ((*bregs[AL] & 0xf) > 9))
     {
         *bregs[AL] += 6;
@@ -1300,6 +1301,30 @@ static INLINE2 void i_cs(void)
     c_ss = SegToMemPtr(SS);
 }
 
+static INLINE2 void i_das(void)
+{
+    /* Opcode 0x2f */
+    if (AF || ((*bregs[AL] & 0xf) > 9))
+    {
+        *bregs[AL] -= 6;
+        AF = 1;
+    }
+    else
+        AF = 0;
+
+    if (CF || (*bregs[AL] > 0x9f))
+    {
+        *bregs[AL] -= 0x60;
+        CF = 1;
+    }
+    else
+        CF = 0;
+
+    SetPF(*bregs[AL]);
+    SetSFB(*bregs[AL]);
+    SetZFB(*bregs[AL]);
+}
+
 
     /* most XOR instructions go here */
 
@@ -4140,7 +4165,7 @@ static INLINE2 void i_notdone(void)
 {
     fprintf(stderr,"Error: Unimplemented opcode %02X at cs:ip = %04X:%04X\n",
 		    c_cs[ip-1],sregs[CS],ip-1);
-    exit(1);
+/*    exit(1); */
 }
 
 
@@ -4218,7 +4243,7 @@ void execute(void)
         case 0x2c:    i_sub_ald8(); break;
         case 0x2d:    i_sub_axd16(); break;
         case 0x2e:    i_cs(); break;
-        case 0x2f:    i_notdone(); break;
+        case 0x2f:    i_das(); break;
         case 0x30:    i_xor_br8(); break;
         case 0x31:    i_xor_wr16(); break;
         case 0x32:    i_xor_r8b(); break;
