-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathsimglb.c
190 lines (181 loc) · 7.73 KB
/
simglb.c
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
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
/*
* Z80SIM - a Z80-CPU simulator
*
* Copyright (C) 1987-2007 by Udo Munk
*
* History:
* 28-SEP-87 Development on TARGON/35 with AT&T Unix System V.3
* 11-JAN-89 Release 1.1
* 08-FEB-89 Release 1.2
* 13-MAR-89 Release 1.3
* 09-FEB-90 Release 1.4 Ported to TARGON/31 M10/30
* 20-DEC-90 Release 1.5 Ported to COHERENT 3.0
* 10-JUN-92 Release 1.6 long casting problem solved with COHERENT 3.2
* and some optimization
* 25-JUN-92 Release 1.7 comments in english and ported to COHERENT 4.0
* 02-OCT-06 Release 1.8 modified to compile on modern POSIX OS's
* 18-NOV-06 Release 1.9 modified to work with CP/M sources
* 08-DEC-06 Release 1.10 modified MMU for working with CP/NET
* 17-DEC-06 Release 1.11 TCP/IP sockets for CP/NET
* 25-DEC-06 Release 1.12 CPU speed option
* 19-FEB-07 Release 1.13 various improvements
*/
/*
* This modul contains all the global variables
*/
#include "sim.h"
/*
* CPU-Register
*/
BYTE A,B,C,D,E,H,L; /* Z80 primary registers */
int F; /* normaly 8-Bit, but int is faster */
WORD IX, IY;
BYTE A_,B_,C_,D_,E_,H_,L_; /* Z80 alternate registers */
int F_;
BYTE *PC; /* Z80 programm counter */
BYTE *STACK; /* Z80 stackpointer */
BYTE I; /* Z80 interrupt register */
BYTE IFF; /* Z80 interrupt flags */
long R; /* Z80 refresh register */
/* is normaly a 8 bit register */
/* the 32 bits are used to measure the */
/* clock frequency */
/*
* Variables for memory of the emulated CPU
*/
BYTE ram[65536L]; /* 64KB RAM */
BYTE *wrk_ram; /* workpointer into memory for dump etc. */
/*
* Variables for history memory
*/
#ifdef HISIZE
struct history his[HISIZE]; /* memory to hold trace informations */
int h_next; /* index into trace memory */
int h_flag; /* flag for trace memory overrun */
#endif
/*
* Variables for breakpoint memory
*/
#ifdef SBSIZE
struct softbreak soft[SBSIZE]; /* memory to hold breakpoint informations */
int sb_next; /* index into breakpoint memory */
#endif
/*
* Variables for runtime measurement
*/
#ifdef WANT_TIM
long t_states; /* number of counted T states */
int t_flag; /* flag, 1 = on, 0 = off */
BYTE *t_start = ram + 65535; /* start address for measurement */
BYTE *t_end = ram + 65535; /* end address for measurement */
#endif
/*
* Flag to controll operation of simulation
*/
int s_flag; /* flag for -s option */
int l_flag; /* flag for -l option */
int m_flag; /* flag for -m option */
int x_flag; /* flag for -x option */
int b_flag; /* flag for -b option */
int i_flag; /* flag for -i option */
int f_flag; /* flag for -f option */
char xfn[LENCMD]; /* buffer for filename (option -x) */
int break_flag = 1; /* 1 = break at HALT, 0 = execute HALT */
int cpu_state; /* status of CPU emulation */
int cpu_error; /* error status of CPU emulation */
int int_type; /* type of interrupt */
int tmax; /* max t-stats to execute in 10ms */
int int_mode; /* CPU interrupt mode (IM 0, IM 1, IM 2) */
int cntl_c; /* flag for cntl-c entered */
int cntl_bs; /* flag for cntl-\ entered */
/*
* Table to get parrity as fast as possible
*/
int parrity[256] = {
0 /* 00000000 */, 1 /* 00000001 */, 1 /* 00000010 */,
0 /* 00000011 */, 1 /* 00000100 */, 0 /* 00000101 */,
0 /* 00000110 */, 1 /* 00000111 */, 1 /* 00001000 */,
0 /* 00001001 */, 0 /* 00001010 */, 1 /* 00001011 */,
0 /* 00001100 */, 1 /* 00001101 */, 1 /* 00001110 */,
0 /* 00001111 */, 1 /* 00010000 */, 0 /* 00010001 */,
0 /* 00010010 */, 1 /* 00010011 */, 0 /* 00010100 */,
1 /* 00010101 */, 1 /* 00010110 */, 0 /* 00010111 */,
0 /* 00011000 */, 1 /* 00011001 */, 1 /* 00011010 */,
0 /* 00011011 */, 1 /* 00011100 */, 0 /* 00011101 */,
0 /* 00011110 */, 1 /* 00011111 */, 1 /* 00100000 */,
0 /* 00100001 */, 0 /* 00100010 */, 1 /* 00100011 */,
0 /* 00100100 */, 1 /* 00100101 */, 1 /* 00100110 */,
0 /* 00100111 */, 0 /* 00101000 */, 1 /* 00101001 */,
1 /* 00101010 */, 0 /* 00101011 */, 1 /* 00101100 */,
0 /* 00101101 */, 0 /* 00101110 */, 1 /* 00101111 */,
0 /* 00110000 */, 1 /* 00110001 */, 1 /* 00110010 */,
0 /* 00110011 */, 1 /* 00110100 */, 0 /* 00110101 */,
0 /* 00110110 */, 1 /* 00110111 */, 1 /* 00111000 */,
0 /* 00111001 */, 0 /* 00111010 */, 1 /* 00111011 */,
0 /* 00111100 */, 1 /* 00111101 */, 1 /* 00111110 */,
0 /* 00111111 */, 1 /* 01000000 */, 0 /* 01000001 */,
0 /* 01000010 */, 1 /* 01000011 */, 0 /* 01000100 */,
1 /* 01000101 */, 1 /* 01000110 */, 0 /* 01000111 */,
0 /* 01001000 */, 1 /* 01001001 */, 1 /* 01001010 */,
0 /* 01001011 */, 1 /* 01001100 */, 0 /* 01001101 */,
0 /* 01001110 */, 1 /* 01001111 */, 0 /* 01010000 */,
1 /* 01010001 */, 1 /* 01010010 */, 0 /* 01010011 */,
1 /* 01010100 */, 0 /* 01010101 */, 0 /* 01010110 */,
1 /* 01010111 */, 1 /* 01011000 */, 0 /* 01011001 */,
0 /* 01011010 */, 1 /* 01011011 */, 0 /* 01011100 */,
1 /* 01011101 */, 1 /* 01011110 */, 0 /* 01011111 */,
0 /* 01100000 */, 1 /* 01100001 */, 1 /* 01100010 */,
0 /* 01100011 */, 1 /* 01100100 */, 0 /* 01100101 */,
0 /* 01100110 */, 1 /* 01100111 */, 1 /* 01101000 */,
0 /* 01101001 */, 0 /* 01101010 */, 1 /* 01101011 */,
0 /* 01101100 */, 1 /* 01101101 */, 1 /* 01101110 */,
0 /* 01101111 */, 1 /* 01110000 */, 0 /* 01110001 */,
0 /* 01110010 */, 1 /* 01110011 */, 0 /* 01110100 */,
1 /* 01110101 */, 1 /* 01110110 */, 0 /* 01110111 */,
0 /* 01111000 */, 1 /* 01111001 */, 1 /* 01111010 */,
0 /* 01111011 */, 1 /* 01111100 */, 0 /* 01111101 */,
0 /* 01111110 */, 1 /* 01111111 */,
1 /* 10000000 */, 0 /* 10000001 */, 0 /* 10000010 */,
1 /* 10000011 */, 0 /* 10000100 */, 1 /* 10000101 */,
1 /* 10000110 */, 0 /* 10000111 */, 0 /* 10001000 */,
1 /* 10001001 */, 1 /* 10001010 */, 0 /* 10001011 */,
1 /* 10001100 */, 0 /* 10001101 */, 0 /* 10001110 */,
1 /* 10001111 */, 0 /* 10010000 */, 1 /* 10010001 */,
1 /* 10010010 */, 0 /* 10010011 */, 1 /* 10010100 */,
0 /* 10010101 */, 0 /* 10010110 */, 1 /* 10010111 */,
1 /* 10011000 */, 0 /* 10011001 */, 0 /* 10011010 */,
1 /* 10011011 */, 0 /* 10011100 */, 1 /* 10011101 */,
1 /* 10011110 */, 0 /* 10011111 */, 0 /* 10100000 */,
1 /* 10100001 */, 1 /* 10100010 */, 0 /* 10100011 */,
1 /* 10100100 */, 0 /* 10100101 */, 0 /* 10100110 */,
1 /* 10100111 */, 1 /* 10101000 */, 0 /* 10101001 */,
0 /* 10101010 */, 1 /* 10101011 */, 0 /* 10101100 */,
1 /* 10101101 */, 1 /* 10101110 */, 0 /* 10101111 */,
1 /* 10110000 */, 0 /* 10110001 */, 0 /* 10110010 */,
1 /* 10110011 */, 0 /* 10110100 */, 1 /* 10110101 */,
1 /* 10110110 */, 0 /* 10110111 */, 0 /* 10111000 */,
1 /* 10111001 */, 1 /* 10111010 */, 0 /* 10111011 */,
1 /* 10111100 */, 0 /* 10111101 */, 0 /* 10111110 */,
1 /* 10111111 */, 0 /* 11000000 */, 1 /* 11000001 */,
1 /* 11000010 */, 0 /* 11000011 */, 1 /* 11000100 */,
0 /* 11000101 */, 0 /* 11000110 */, 1 /* 11000111 */,
1 /* 11001000 */, 0 /* 11001001 */, 0 /* 11001010 */,
1 /* 11001011 */, 0 /* 11001100 */, 1 /* 11001101 */,
1 /* 11001110 */, 0 /* 11001111 */, 1 /* 11010000 */,
0 /* 11010001 */, 0 /* 11010010 */, 1 /* 11010011 */,
0 /* 11010100 */, 1 /* 11010101 */, 1 /* 11010110 */,
0 /* 11010111 */, 0 /* 11011000 */, 1 /* 11011001 */,
1 /* 11011010 */, 0 /* 11011011 */, 1 /* 11011100 */,
0 /* 11011101 */, 0 /* 11011110 */, 1 /* 11011111 */,
1 /* 11100000 */, 0 /* 11100001 */, 0 /* 11100010 */,
1 /* 11100011 */, 0 /* 11100100 */, 1 /* 11100101 */,
1 /* 11100110 */, 0 /* 11100111 */, 0 /* 11101000 */,
1 /* 11101001 */, 1 /* 11101010 */, 0 /* 11101011 */,
1 /* 11101100 */, 0 /* 11101101 */, 0 /* 11101110 */,
1 /* 11101111 */, 0 /* 11110000 */, 1 /* 11110001 */,
1 /* 11110010 */, 0 /* 11110011 */, 1 /* 11110100 */,
0 /* 11110101 */, 0 /* 11110110 */, 1 /* 11110111 */,
1 /* 11111000 */, 0 /* 11111001 */, 0 /* 11111010 */,
1 /* 11111011 */, 0 /* 11111100 */, 1 /* 11111101 */,
1 /* 11111110 */, 0 /* 11111111 */
};