summaryrefslogtreecommitdiff
path: root/emulators/pcemu/patches/patch-ab
blob: 0a6d3047b7676559c655f72d4479c21732db9072 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
$NetBSD: patch-ab,v 1.2 1999/12/29 01:45:39 wiz Exp $
*** cpu.c.orig	Wed Jun 22 16:24:50 1994
--- cpu.c	Tue Jan 24 18:37:17 1995
***************
*** 1127,1132 ****
--- 1127,1133 ----
  
  static INLINE2 void i_daa(void)
  {
+     /* Opcode 0x27 */
      if (AF || ((*bregs[AL] & 0xf) > 9))
      {
          *bregs[AL] += 6;
***************
*** 1300,1305 ****
--- 1301,1330 ----
      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,4146 ****
  {
      fprintf(stderr,"Error: Unimplemented opcode %02X at cs:ip = %04X:%04X\n",
  		    c_cs[ip-1],sregs[CS],ip-1);
!     exit(1);
  }
  
  
--- 4165,4171 ----
  {
      fprintf(stderr,"Error: Unimplemented opcode %02X at cs:ip = %04X:%04X\n",
  		    c_cs[ip-1],sregs[CS],ip-1);
! /*    exit(1); */
  }
  
  
***************
*** 4218,4224 ****
          case 0x2c:    i_sub_ald8(); break;
          case 0x2d:    i_sub_axd16(); break;
          case 0x2e:    i_cs(); break;
!         case 0x2f:    i_notdone(); break;
          case 0x30:    i_xor_br8(); break;
          case 0x31:    i_xor_wr16(); break;
          case 0x32:    i_xor_r8b(); break;
--- 4243,4249 ----
          case 0x2c:    i_sub_ald8(); break;
          case 0x2d:    i_sub_axd16(); break;
          case 0x2e:    i_cs(); break;
!         case 0x2f:    i_das(); break;
          case 0x30:    i_xor_br8(); break;
          case 0x31:    i_xor_wr16(); break;
          case 0x32:    i_xor_r8b(); break;