1 This file describes how to use the Z80 processor emulation as a
2 standalone module (without the ZX Spectrum emulation).
4 ===========================================================================
5 You will need the following files:
7 For the 'intel x86' assembly version:
8 -------------------------------------
10 z80.c z80.h z80_type.h i386step.S i386def.S i386op1.S i386op1x.S
11 i386op2.S i386op2x.S i386op3.S i386op3x.S i386op4.S i386op5.S i386op6.S
17 z80.c z80.h z80_type.h z80_step.c z80_def.h z80_ari.h z80optab.c z80optab.h
18 z80_op1.c z80_op1x.c z80_op1.h z80_op2.c z80_op2x.c z80_op2.h
19 z80_op3.c z80_op3x.c z80_op3.h z80_op4.c z80_op4x.c z80_op4.h
20 z80_op5.c z80_op5.h z80_op6.c z80_op6.h
22 ===========================================================================
25 For the 'intel x86' assembly version:
26 -------------------------------------
34 z80_i386_objs = z80.o i386emul.o
36 libz80.a: $(z80_i386_objs)
37 $(AR) cr libz80.a $(z80_i386_objs)
39 i386emul.o: i386emul.s
40 $(CC) -c $(CFLAGS) i386emul.s
42 i386emul.s: i386emul.sp sp_to_s
43 ./sp_to_s < i386emul.sp > i386emul.s
45 i386emul.sp: i386step.S
46 $(CPP) $(CPPFLAGS) i386step.S > i386emul.sp
49 $(CC) -o sp_to_s $(LDFLAGS) sp_to_s.o
55 $(CC) -c $(CFLAGS) $(CPPFLAGS) $<
64 CFLAGS = -Wall -O3 -fomit-frame-pointer -funroll-loops
66 z80_c_objs = z80.o z80_step.o z80optab.o z80_op1.o z80_op2.o z80_op3.o \
67 z80_op4.o z80_op5.o z80_op6.o
69 libz80.a: $(z80_c_objs)
70 $(AR) cr libz80.a $(z80_c_objs)
76 $(CC) -c $(CFLAGS) $(CPPFLAGS) $<
78 ===========================================================================
79 The following functions are defined by libz80.a:
84 This function initializes the processor emulation. This must be called
85 only once at the beginning of the program.
87 int z80_step(int ticknum)
88 -------------------------
90 This function executes z80 instructions for 'ticknum' number of clock
91 cycles. It returns the remaining number of ticks.
93 NOTE: the remaining number of ticks is always zero or negative,
94 meaning that exactly, or more than the given 'ticknum' clock cycles
95 were executed. This is because WHOLE instructions are executed at a
98 NOTE: HALT, LDDR, etc... do not count as one instruction, but as a
99 series of instructions (e.g. HALT is a series of NOPs).
104 This function resets the Z80 processor. This has the same effect as
105 applying a pulse to the RESET input of the processor.
107 NOTE: z80_init() does not reset the Z80, z80_reset() should be called
110 void z80_interrupt(int data)
111 -----------------------------
113 Causes a Maskable Interrupt. Interrupt mode 1 and 2 are emulated
114 correctly, in interrupt mode 2 'data' is used in the address
115 calculation. In interrupt mode 0, it is assumed (as on the ZX
116 Spectrum) that 0xFF is on the data bus, and always RST 38 is
119 NOTE: It is not emulated, that in the instruction after EI no
120 interrupt can be generated.
125 Causes a Non Maskable Interrupt.
127 ===========================================================================
128 Accessing the memory, the I/O ports and the Z80 processor's state
129 (i.e. registers, etc...)
131 To use the functions above and the variables below, include the
132 "z80.h" include file.
137 The memory is stored in the z80_proc.mem[] byte array, which has a
138 size of 65536. By default it is all RAM. To make parts of it read
139 only, you have to redefine the appropriate macros in i386step.S and/or
140 z80_def.h. (These macros are sorounded by #ifdef SPECT_MEM, #else,
143 The memory is initialised to random data. You must fill it in before
144 starting the emulation, but AFTER the call to z80_init().
149 The input port values are stored in z80_inports[] array, which has a
150 size of 256. The IN instruction will use the appropriate element of
151 this array. This array is initialised to all zeroes.
153 The output port values can be queried from the z80_outports[] array,
154 which has also a size of 256. The OUT instruction will store the value
155 in the element addressed by the instruction.
157 If you need more complex behaviour of the I/O, you must redefine the
158 appropriate macros in i386step.S and z80_def.h.
163 You can access the processor's state with the following variables and
164 macros defined in "z80.h".
169 normal: BC, DE, HL, AF, IR, IX, IY, PC, SP,
170 aux: BCBK, DEBK, HLBK, AFBK
173 RB, RC, RD, RE, RH, RL, RA, RF, RI, RR, XH, XL, YH, YL, PCH, PCL, SPH, SPL
176 z80_proc.haltstate (1: processor is in halt mode, 0: processor is runnig)
177 z80_proc.it_mode (interrupt mode 0, 1 or 2)
178 z80_proc.iff1 (interrupt flip-flop 1)
179 z80_proc.iff2 (interrupt flip-flop 2)
181 You need not access the other parts of z80_proc, they are meaningless
182 outside the z80_step() function.