home *** CD-ROM | disk | FTP | other *** search
/ ftp.barnyard.co.uk / 2015.02.ftp.barnyard.co.uk.tar / ftp.barnyard.co.uk / cpm / walnut-creek-CDROM / EMULATOR / UNIX / CAIN2 / CPM-I386.H < prev    next >
C/C++ Source or Header  |  2000-06-30  |  5KB  |  181 lines

  1. /*
  2. cpm-i386
  3.  
  4. Written by D'Arcy J.M. Cain
  5. darcy@druid
  6.  
  7. This file is the header used by the CP/M emulator when running under
  8. the following machine(s):
  9.  
  10.     System V Rel 3.2 or 4.0 on Intel 80386 processor
  11.  
  12. Link this file to cpm.h on the above system.  Other entries will be added
  13. as they are tested.
  14.  
  15. To use this program on systems which differ from the above in significant
  16. ways, a header must be created such that the Z80 registers can be accessed
  17. using the following register names:
  18.     A, B, C, D, E, H, L, BC, DE, HL, IX, IY, SP, PC, AF and FLAGS
  19. In addition the following flags sould be available:
  20.     CARRY, BCD, PARITY, HALF_CARRY, ZERO and SIGN
  21. Also the HL, SP, IX and IY registers should have a H and L version for
  22. accessing half-words and TEMP should be a scratch variable accessed the
  23. same way.  See below for examples.
  24.  
  25. There should also be a variable IFF and an array of 0x10000 (65,536) bytes
  26. called ram.
  27.  
  28. The two variables psw_bank and gr_bank should allow register context
  29. switching for the AF register and the general registers
  30.  
  31. Note:  If the manifest constant USUAL_MICROSOFT_STUPIDITY is defined then
  32. extra code is included to allow Microsoft BASIC and other programs which
  33. use the same stupidity to work.  The problem is that Microsoft, rather
  34. than CALLing BIOS+CONOUT and BIOS+LIST and who knows what else, looks at
  35. the BIOS jump table and roots out the targets for various jumps and self
  36. modifies itself to CALL those locations directly.  My fix is to have actual
  37. jumps in those locations but it jumps to itself.  If this is not required
  38. then the space is available to the running program.
  39.  
  40. */
  41.  
  42. #define    USUAL_MICROSOFT_STUPIDITY
  43.  
  44. #ifdef    COMPILE_TEST
  45. #define    CPM_DEBUG
  46. #endif
  47.  
  48. typedef    unsigned char    byte;
  49. typedef unsigned short    word;
  50. /* We use unsigned short to guarantee two byte words and roll-over */
  51. /* use caution on other architectures (and even other compilers) */
  52.  
  53. #define    lonyb(v)    (v & 0xf)
  54. #define    hinyb(v)    ((v >> 4) & 0xf)
  55.  
  56. typedef union {
  57.     word    af;
  58.     struct {
  59.         byte    flags, a;
  60.     } b;
  61.     struct {
  62.         unsigned int    carry:1;
  63.         unsigned int    bcd:1;
  64.         unsigned int    parity:1;
  65.         unsigned int    x1:1;
  66.         unsigned int    half:1;
  67.         unsigned int    x2:1;
  68.         unsigned int    zero:1;
  69.         unsigned int    sign:1;
  70.     } bits;
  71. } ACC;
  72.  
  73. typedef union {
  74.     struct {
  75.         word    bc;
  76.         word    de;
  77.         word    hl;
  78.     } w;
  79.     struct {
  80.         byte    c, b;
  81.         byte    e, d;
  82.         byte    l, h;
  83.     } b;
  84. } GR;
  85.  
  86. typedef union {
  87.     unsigned char    half[2];
  88.     unsigned short    whole;
  89. } REG;
  90.  
  91. #define    TEMPH    (reg.half[1])
  92. #define    TEMPL    (reg.half[0])
  93. #define    TEMP    (reg.whole)
  94. #define    SPH        (sp.half[1])
  95. #define    SPL        (sp.half[0])
  96. #define    SP        (sp.whole)
  97. #define IXH        (ix.half[1])
  98. #define IXL        (ix.half[0])
  99. #define IX        (ix.whole)
  100. #define IYH        (iy.half[1])
  101. #define IYL        (iy.half[0])
  102. #define IY        (iy.whole)
  103.  
  104. #ifdef    CPM_DATA
  105. ACC        acc[2];
  106. GR        gr[2];
  107. word    PC;
  108. byte    R, IV;
  109. int        gr_bank = 0, acc_bank = 0, IFF = 1;
  110. REG        reg, sp, ix, iy;
  111.  
  112. #ifdef    COMPILE_TEST
  113. byte    ram[0x10000] = {
  114.     0x00,                /* 0000: nop */
  115.     0x21, 0x00, 0x10,    /* 0001: ld hl, 1000h */
  116.     0xe5,                /* 0004: push hl */
  117.     0x3e, 0xbb,            /* 0005: ld a, 0bbh */
  118.     0x87,                /* 0007: add a, a */
  119.     0x8f,                /* 0008: adc a, a */
  120.     0x3d,                /* 0009: dec a */
  121.     0x2f,                /* 000a: cpl */
  122.     0xb8,                /* 000b: cp b */
  123.     0xcc, 0x14, 0x00,    /* 000c: call z, 0014h */
  124.     0xbf,                /* 000f: cp a */
  125.     0xcc, 0x14, 0x00,    /* 0010: call z, 0014h */
  126.     0x00,                /* 0013: nop */
  127.     0xc3, 0x19, 0x00,    /* 0014: jp 0019h */
  128.     0x18, 0x03,            /* 0x17: jr 001bh */
  129.     0x18, 0xfd,            /* 0x19: jr 0014h */
  130.     0xc9,                /* 001b: ret */
  131.     0x00 };                /* 0015: nop */
  132. #define        TEST_SIZE    24
  133. #else
  134. byte    ram[0x10000];
  135. #endif
  136.  
  137. byte    page_zero[] = {
  138.     0xc3, 0x03, 0xff,    /* JP BIOS+3 */
  139.     0x00, 0x00,            /* reserved */
  140.     0xc3, 0xc0, 0xfe,    /* JP BDOS */
  141. };
  142.  
  143. #else
  144. extern ACC    acc[];
  145. extern GR    gr[];
  146. extern word    PC;
  147. extern byte    R, IV, ram[];
  148. extern int    gr_bank, acc_bank, IFF;
  149. extern REG    reg, sp, ix, iy;
  150. #endif
  151.  
  152. #define        AF            (acc[acc_bank].af)
  153. #define        A            (acc[acc_bank].b.a)
  154. #define        FLAGS        (acc[acc_bank].b.flags)
  155. #define        CARRY        (acc[acc_bank].bits.carry)
  156. #define        BCD            (acc[acc_bank].bits.bcd)
  157. #define        PARITY        (acc[acc_bank].bits.parity)
  158. #define        OVERFLOW    (acc[acc_bank].bits.parity)
  159. #define        HALF_CARRY    (acc[acc_bank].bits.half)
  160. #define        ZERO        (acc[acc_bank].bits.zero)
  161. #define        SIGN        (acc[acc_bank].bits.sign)
  162.  
  163. #define        B            (gr[gr_bank].b.b)
  164. #define        C            (gr[gr_bank].b.c)
  165. #define        D            (gr[gr_bank].b.d)
  166. #define        E            (gr[gr_bank].b.e)
  167. #define        H            (gr[gr_bank].b.h)
  168. #define        L            (gr[gr_bank].b.l)
  169. #define        BC            (gr[gr_bank].w.bc)
  170. #define        DE            (gr[gr_bank].w.de)
  171. #define        HL            (gr[gr_bank].w.hl)
  172.  
  173. #define        BDOS        0xfec0
  174. #define        BIOS        0xff00
  175. #define        bios(x)        (BIOS + (x * 3))
  176.  
  177. #define        MAX_DRIVES    16
  178.  
  179. int            decode(void);
  180. const char    *dasm(const byte *buf);
  181.