Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | Download | RSS feed

  1. /*=====================================================================
  2.   z80.c -> Header file related to the Z80 emulation code.
  3.  
  4.    Please read documentation files to know how this works :)
  5.  
  6.    Thanks to Marat Fayzullin for writing the "How to write a Computer
  7.    Eemulator" HOWTO. This emulator is based on his tutorials and the
  8.    code organization (very readable!) of his "Z80 Portable Emulator".
  9.    I've learnt a lot from it, and I've taken some ideas of his code
  10.    to write this emulator.I think that almost all of the undocumented
  11.    Z80 opcodes are covered on this emulator. I also asked Marat
  12.    Fayzullin (by email) about ideas and so on (his Z80 emulator is
  13.    quite good, so go check it :-).
  14.  
  15.    Of course, I can't forget Raúl Gomez (he answered me thousands
  16.    of email questions) and Philip Kendall. Whitout his ___kind___
  17.    people surely you won't be reading this file now...
  18.  
  19.    "Programming the Z80" (from Rodnay Zaks) and the comp.sys.sinclair
  20.    FAQ were another excelent sources of info!
  21.  
  22.  This program is free software; you can redistribute it and/or modify
  23.  it under the terms of the GNU General Public License as published by
  24.  the Free Software Foundation; either version 2 of the License, or
  25.  (at your option) any later version.
  26.  
  27.  This program is distributed in the hope that it will be useful,
  28.  but WITHOUT ANY WARRANTY; without even the implied warranty of
  29.  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  30.  GNU General Public License for more details.
  31.  
  32.  You should have received a copy of the GNU General Public License
  33.  along with this program; if not, write to the Free Software
  34.  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  35.  
  36.  Copyright (c) 2000 Santiago Romero Iglesias.
  37.  Email: sromero@escomposlinux.org
  38.  ======================================================================*/
  39.  
  40.  
  41. #ifndef Z80_H
  42. #define Z80_H
  43.  
  44. #define USING_ALLEGRO
  45.  
  46. #define DEBUG
  47. #define _DEV_DEBUG_                         /* development debugging */
  48. #define LOW_ENDIAN
  49. /*#define HI_ENDIAN */
  50.  
  51. /* Used by the Z80Debug() function */
  52. #define DEBUG_OK       1
  53. #define DEBUG_QUIT     0
  54.  
  55.  
  56. #define video vscreen
  57.  
  58.  
  59. /*=== Some common standard data types: ==============================*/
  60. typedef unsigned char byte;
  61. typedef unsigned short word;
  62. typedef unsigned long dword;
  63. typedef signed char offset;
  64.  
  65.  
  66. /*--- Thanks to Philip Kendall for it's help using the flags --------*/
  67. extern byte halfcarry_add_table[];
  68. extern byte halfcarry_sub_table[];
  69. extern byte overflow_add_table[];
  70. extern byte overflow_sub_table[];
  71. extern byte sz53_table[];
  72. extern byte sz53p_table[];
  73. extern byte parity_table[];
  74.  
  75. extern byte ioblock_inc1_table[];
  76. extern byte ioblock_dec1_table[];
  77. extern byte ioblock_2_table[];
  78.  
  79.  
  80. /*=====================================================================
  81.    Z80 Flag Register:       ---------------------------------
  82.                             | 7   6   5   4   3   2   1   0 |
  83.                             ---------------------------------
  84.                             | S   Z   x   H   x  O/P  N   C |
  85.                             ---------------------------------
  86.    If (1) means that:           S   =  Negative result.
  87.                                 Z   =  Zero result.
  88.                                 x   =  special cases (by opcode)
  89.                                 H   =  Halfcarry/borrow.
  90.                                 O/P =  Overflow/Parity Flag.
  91.                                 N   =  Substraction.
  92.                                 C   =  Carry/borrow.
  93.  ====================================================================*/
  94. #define  S_FLAG    0x80
  95. #define  Z_FLAG    0x40
  96. #define  H_FLAG    0x10
  97. #define  P_FLAG    0x04
  98. #define  O_FLAG    0x04
  99. #define  N_FLAG    0x02
  100. #define  C_FLAG    0x01
  101.  
  102.  
  103. /*
  104.  Defines for interrupts and special Z80Hardware() codes:
  105. =======================================================================
  106.  INT_QUIT   =    Exit the emulation (for Z80Run())
  107.  INT_NOINT  =    No interrupt required
  108.  INT_IRQ    =    Standard RST 38h interrupt
  109.  INT_NMI    =    Non-maskerable interrupt
  110. */
  111. #define  INT_QUIT   0xFFFE
  112. #define  INT_NOINT  0xFFFF
  113. #define  INT_IRQ    0x0038
  114. #define  INT_NMI    0x0066
  115.  
  116.  
  117.  
  118. /*=== A register is defined as follows: =============================*/
  119. typedef union
  120. {
  121. #ifdef LOW_ENDIAN
  122.         struct
  123.     {
  124.         byte l,h;
  125.     } B;
  126. #else
  127.         struct
  128.     {
  129.         byte h,l;
  130.     } B;
  131. #endif
  132.         word W;
  133. } eword;
  134.  
  135.  
  136. #define  WE_ARE_ON_DD  1
  137. #define  WE_ARE_ON_FD  2
  138.  
  139. /*=== Now we define the Z80 registers using the previous definition =*/
  140. typedef struct
  141. {
  142.   char machine_type;
  143.   byte *RAM;
  144.   int we_are_on_ddfd;
  145.  
  146.   /* general and shadow z80 registers */
  147.   eword AF, BC, DE, HL, IX, IY, PC, SP, R,
  148.         AFs, BCs, DEs, HLs;
  149.  
  150.   /* IFF and I registers, used on interrupts. */
  151.   byte IFF1, IFF2, I, halted;
  152.   char IM;
  153.   word IRequest;
  154.  
  155.   /* the following is to take care of cycle counting */
  156.   int IPeriod, ICount, IBackup;
  157.  
  158.   /* DecodingErrors = set this to 1 for debugging purposes in order
  159.                       to trap undocumented or non implemented opcodes.
  160.      Trace          = set this to 1 to start tracing. It's also set
  161.                       when PC reaches TrapAddress value.             */
  162.   byte DecodingErrors;
  163.   word TrapAddress;
  164.   byte Trace, dobreak;
  165.   byte BorderColor;
  166.  
  167. } Z80Regs;
  168.  
  169.  
  170. /*====================================================================
  171.    Function declarations, read the .c file to know what they do.
  172.  ===================================================================*/
  173. void Z80Reset( register Z80Regs *regs, int );
  174. void Z80Interrupt( register Z80Regs *, register word );
  175. word Z80Run( register Z80Regs *, int );
  176. byte Z80MemRead( register word, Z80Regs * );
  177. void Z80MemWrite( register word, register byte, Z80Regs * );
  178. byte Z80InPort( register word );
  179. void Z80OutPort( register Z80Regs *regs, register word, register byte );
  180. void Z80Patch( register Z80Regs * );
  181. byte Z80Debug( register Z80Regs * );
  182. word Z80Hardware( register Z80Regs * );
  183.  
  184. void Z80FlagTables(void);
  185. word ParseOpcode( char *, char *, char *, word, Z80Regs * );
  186. word Z80Dissasembler ( Z80Regs *,  char *,  char * );
  187.  
  188. #endif
  189.